与直接编码相比,Verilog 任务产生不同的结果
Verilog tasks yielding different results compared to direct coding
两个简化的代码部分产生不同的结果(这是唯一的区别)
没有任务减量
...
如果 (A) 等待 (flagA);
如果(B)等待(flagB);
...
有任务减量
...
任务测试(输入标志)
开始
等待(标志);
结尾
结束任务
if (A) 测试(flagA);
如果(B)测试(flagB);
...
非常感谢任何见解 - 两者之间有什么区别?
谢谢!
问题是任务的输入参数在进入任务时默认按值复制。如果实际参数在任务暂停时发生变化(即 wait
),则任务看不到参数的更新值。
在 SystemVerilog 中完成您想要的事情的一种方法是通过引用传递参数 ref
:
task test(ref logic flag);
if (A) test(flagA); if (B) test(flagB); ...
通过 ref 传递有一些更严格的类型要求,您不能通过引用传递 wire
。
另一种方法是全局引用 flag
,就像您对信号 A
和 B
所做的一样
两个简化的代码部分产生不同的结果(这是唯一的区别)
没有任务减量
... 如果 (A) 等待 (flagA); 如果(B)等待(flagB); ...
有任务减量
... 任务测试(输入标志) 开始 等待(标志); 结尾 结束任务
if (A) 测试(flagA); 如果(B)测试(flagB); ...
非常感谢任何见解 - 两者之间有什么区别?
谢谢!
问题是任务的输入参数在进入任务时默认按值复制。如果实际参数在任务暂停时发生变化(即 wait
),则任务看不到参数的更新值。
在 SystemVerilog 中完成您想要的事情的一种方法是通过引用传递参数 ref
:
task test(ref logic flag);
if (A) test(flagA); if (B) test(flagB); ...
通过 ref 传递有一些更严格的类型要求,您不能通过引用传递 wire
。
另一种方法是全局引用 flag
,就像您对信号 A
和 B