我打算在always @*
块中使用自定义任务,例如:
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
的内容。然后我发现always
块对信号b
不敏感(使用ISim 14.7)。
这是一个错误还是设计成这样的行为?
答案 0 :(得分:1)
这是Verilog中定义的行为。如果您想让任务对信号敏感,您必须将它们放入I / O列表中:
task mytask(input b);
(我知道的原因是我也犯了错误并查了一下)
答案 1 :(得分:1)
指定语言的行为如下。始终@ *(或always_comb)块对参数列表中未包含的任务中使用的值的更改不敏感。在这里使用一个功能,因为你的身体没有消耗时间。
答案 2 :(得分:1)
只是为了添加答案:
您的原始always @*
过程将永远不会执行,因为它有一个空的触发器列表。 @ *
表示:嘿工具(依赖于此列表的模拟器),为我构建灵敏度列表。 always @ *
(通过lang规范)仅对函数/任务的参数(以及其他触发器)的更改敏感(在您的情况下 - 没有参数因此为空灵敏度列表),而不是对函数内信号的更改/任务内容。
旁注:我认为SystemVerilog的 Dave,谢谢你的澄清。always_comb
可以在这里工作(2012年第9.2.2.2.2节)。