Verilog 在始终@*块中使用任务
我打算在Verilog 在始终@*块中使用任务,verilog,Verilog,我打算在始终@*块中使用自定义任务,例如: input [31:0] a; input b; output reg [31:0] c; task mytask; begin if (b) begin c = a; end end endtask always @* begin // ... (b is not included) mytask; // ... (b is not included) end 我认为,当信号b从0变为1时
始终@*
块中使用自定义任务,例如:
input [31:0] a;
input b;
output reg [31:0] c;
task mytask;
begin
if (b) begin
c = a;
end
end
endtask
always @* begin
// ... (b is not included)
mytask;
// ... (b is not included)
end
我认为,当信号b
从0
变为1
时,c
将被设置为a
的内容。然后我发现总是块对信号b
不敏感(使用ISim 14.7)
这是一个bug还是设计成这样的行为?这是Verilog中定义的行为。如果要使任务对信号敏感,则必须将其放入I/O列表中:
task mytask(input b);
(我知道的原因是我也犯了这个错误并进行了查找)指定语言的行为如下。Always@*(或Always_comb)块对参数列表中未包含的任务中使用的值的更改不敏感。在这里使用一个函数,因为你的身体不需要花费时间。只是为了补充答案:
原始的always@*
过程将永远不会执行,因为它的触发器列表为空<代码>@*
意味着:嘿工具(依赖于此列表的模拟器),为我建立灵敏度列表always@*
(由lang规范)仅对函数/任务参数的更改(以及其他触发器)敏感(在您的情况下,没有参数因此为空敏感列表),而对函数/任务内容中的信号更改不敏感
旁注:我认为SystemVerilog的总是在这里工作(2012 std 9.2.2.2.2),感谢您的澄清。始终只在行中搜索函数
调用,而不是任务。它专门这样做,因此您可以在aways_comb
中添加调试代码任务,而无需更改其灵敏度。