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
中添加调试代码任务,而无需更改其灵敏度。