Altifigence Academy

21 / 37 · 概念

function automatic 与表达式复用

编写不消耗时间的函数,检查返回值位宽、符号与参考模型独立性。

复用计算,不隐藏契约

SystemVerilog 函数不消耗仿真时间。可综合组合函数依赖显式输入,所有路径赋返回值,不含延迟或事件控制。automatic 给每次调用独立的参数与局部变量存储,不增加寄存器或一拍。以下固定次数循环计算八位 XOR,得到组合奇偶校验。

SystemVerilog
module parity_function (
  input  logic [7:0] data,
  output logic       parity,
  output logic [7:0] with_parity
);
  function automatic logic parity8(input logic [7:0] value);
    logic p;
    integer bit_index;
    begin
      p = 1'b0;
      for (bit_index = 0; bit_index < 8; bit_index = bit_index + 1)
        p = p ^ value[bit_index];
      parity8 = p;
    end
  endfunction
  assign parity = parity8(data);
  assign with_parity = {data[6:0], parity8(data)};
endmodule

with_parity 有意丢弃 data[7] 后附加 parity,只有八位,不是保留完整输入的九位编码。辅助函数正确,调用者仍可能丢信息。

返回位宽与符号很重要

这里返回一位 logic。若两个无符号八位数相加且要保留进位,函数须返回九位。调用不会自动保存额外进位或扩大目标。把常量与位宽规则放在接口附近,不要让函数偷偷读取变化的全局信号;隐藏依赖会妨碍复用和验证。

函数调用不等于串行共享硬件

调用同一函数两次不强制综合出一个分时运算器。工具可以优化组合逻辑,但串行共享需要接受策略、状态与输出时刻。不能仅按调用次数估计面积或吞吐量。测试平台中等待事件的激励和检查用 task,与不消耗时间的函数分工;后面的 task 在下降沿驱动并在下一上升沿后检查。

练习:使用另一种参考算法

data=0,1,3,8'h80,8'hFF 的 parity 应为 0,1,0,1,0。8'h80 时高位被丢弃,末位 parity=1,因此 with_parity=8'h01。遍历全部 256 个输入,以整数置位数模 2 为参照,不调用 DUT 的 parity8。

把循环上限改成 7,确认 8'h80 测试失败;只测低位无法发现遗漏。再用 {data,parity8(data)} 把输出改为九位并更新期望模型,这是接口改变而非格式改进。

你的选择适用于此浏览器,可随时在页脚更改。