21 / 37 · 概念
function automatic 与表达式复用
编写不消耗时间的函数,检查返回值位宽、符号与参考模型独立性。
课时内容可免费阅读,选课后可保存学习进度。
复用计算,不隐藏契约
SystemVerilog 函数不消耗仿真时间。可综合组合函数依赖显式输入,所有路径赋返回值,不含延迟或事件控制。automatic 给每次调用独立的参数与局部变量存储,不增加寄存器或一拍。以下固定次数循环计算八位 XOR,得到组合奇偶校验。
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)};
endmodulewith_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)} 把输出改为九位并更新期望模型,这是接口改变而非格式改进。
✓ 已学习