始终使用@ *块中的任务

时间:2017-12-06 12:40:30

标签: verilog

我打算在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

我认为当信号b0更改为1时,c将设置为a的内容。然后我发现always块对信号b不敏感(使用ISim 14.7)。

这是一个错误还是设计成这样的行为?

3 个答案:

答案 0 :(得分:1)

这是Verilog中定义的行为。如果您想让任务对信号敏感,您必须将它们放入I / O列表中:

task mytask(input b);

(我知道的原因是我也犯了错误并查了一下)

答案 1 :(得分:1)

指定语言的行为如下。始终@ *(或always_comb)块对参数列表中未包含的任务中使用的值的更改不敏感。在这里使用一个功能,因为你的身体没有消耗时间。

答案 2 :(得分:1)

只是为了添加答案: 您的原始always @*过程将永远不会执行,因为它有一个空的触发器列表。 @ *表示:嘿工具(依赖于此列表的模拟器),为我构建灵敏度列表。 always @ *(通过lang规范)仅对函数/任务的参数(以及其他触发器)的更改敏感(在您的情况下 - 没有参数因此为空灵敏度列表),而不是对函数内信号的更改/任务内容。

旁注:我认为SystemVerilog的always_comb可以在这里工作(2012年第9.2.2.2.2节)。 Dave,谢谢你的澄清。