与直接编码相比,Verilog 任务产生不同的结果

Verilog tasks yielding different results compared to direct coding

两个简化的代码部分产生不同的结果(这是唯一的区别)

  1. 没有任务减量

    ... 如果 (A) 等待 (flagA); 如果(B)等待(flagB); ...

  2. 有任务减量

    ... 任务测试(输入标志) 开始 等待(标志); 结尾 结束任务

    if (A) 测试(flagA); 如果(B)测试(flagB); ...

非常感谢任何见解 - 两者之间有什么区别?

谢谢!

问题是任务的输入参数在进入任务时默认按值复制。如果实际参数在任务暂停时发生变化(即 wait),则任务看不到参数的更新值。

在 SystemVerilog 中完成您想要的事情的一种方法是通过引用传递参数 ref:

task test(ref logic flag);
  if (A) test(flagA); if (B) test(flagB); ...

通过 ref 传递有一些更严格的类型要求,您不能通过引用传递 wire

另一种方法是全局引用 flag,就像您对信号 AB

所做的一样