其中哪一项阻碍了我的测试平台的仿真性能以及原因(从系统verilog编译器的角度寻找答案):
task A;
wait(dut_if.a==1);
.
.
endtask
或
task A;
forever @(posedge clk) begin
if(dut_if.a==1)..
end
endtask
PS:“a”是一个dut信号,在模拟过程中在某个时钟边沿被置位。假设此任务只调用一次。
答案 0 :(得分:4)
这两者在功能上并不相同。第一个片段等待a
变高(即完全相同的周期),而第二个片段等待,直到a
被“看到”在时钟周期为高:
_ _ _ _ _
clk _| |_| |_| |_| |_| |_
______________
a ______|
| |
1 2
数字会显示每个人被触发的时间。你真正想要的是:
@(posedge clk iff dut_if.a);
这在语义上等同于片段2. @Coverify所做的评论也应该适用于此(更快,因为没有上下文切换)。
答案 1 :(得分:2)
第一种选择会有更好的表现。我假设在您使用的上下文中,这两个选项在功能上都是正确的。
第二段代码,等待每个时钟,然后检查条件。由于等待在永久循环内部,因此该代码将导致clk的每个posedge上下文切换。另一方面,选项1中的代码仅切换上下文一次。
答案 2 :(得分:0)
这两个选项在功能上都不相同。
但在这种情况下,第二个选项在模拟性能方面优于第一个选项。
因为,在第一个选项中,工具需要在每个选项上检查a的值 和每一个时间步,而在第二个选项中,工具将只检查 posedge,而不是每个时间步。
答案 3 :(得分:0)
哪个有更好的表现?这取决于模拟器的实现。在真正的事件基础仿真器中,情况1将具有更好的性能,因为评估代码不会在每个时钟边沿唤醒。但是,我怀疑案例2在现实世界中会有更好的表现,因为评估代码与时钟滴答良好对齐。
如果您的代码不是建模异步逻辑,我建议您坚持使用案例2.代码更易于理解。将所有东西与时钟对齐可以让您的生活更轻松。