比较模拟性能

时间:2016-04-13 06:53:52

标签: verilog system-verilog uvm asic

其中哪一项阻碍了我的测试平台的仿真性能以及原因(从系统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信号,在模拟过程中在某个时钟边沿被置位。假设此任务只调用一次。

4 个答案:

答案 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.代码更易于理解。将所有东西与时钟对齐可以让您的生活更轻松。