我想我已经弄清楚为什么会发生这种情况,但我想确认一下,看看是否有更好的解决方案。
考虑以下模块,该模块具有一个函数,其中一个参数的默认值绑定到模块内的某个寄存器:
module m;
reg a, b;
wire out;
function f1 (input x, input y = b);
f1 = x & y;
endfunction :f1
// ...
assign out = f1(a);
endmodule
我看到的问题(不容易追查)是,在这种情况下,任务的敏感性列表只有一个。因此,如果 b 更改,然后 a 更改,out 将被正确更新。但是,如果 a 发生变化,然后 b 发生变化,因为 b 不在 out 分配的敏感列表中,out 将不会更新,并且仍将设置为旧值。
是否有首选方法将 b 添加到敏感度列表中,以便在更改时更新 out ?
我看到了一些可能的选择:
- 只需显式添加第二个参数:
f1(a, b)
- 使用连续分配块
always_comb out = f1(a)
或always @(*) out=f1(a)
- 使用明确的敏感度列表
always @(a, b) out = f1(a)
我个人认为选项 1 是最好的(即使它会在每个调用它的位置复制可选参数),但我很好奇是否有其他解释,或者是否有更好的解决方案。