0

其中哪些会阻碍我的测试台中的模拟性能以及原因(从系统 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

4 回答 4

4

两者在功能上并不等同。第一个片段等待直到a变高(即完全相同的周期),而第二个片段等待直到a“看到”在时钟周期变高:

       _   _   _   _   _
clk  _| |_| |_| |_| |_| |_
            ______________
a    ______|

           |  |
           1  2

数字会显示每个触发的时间。你真正想要的是:

@(posedge clk iff dut_if.a);

这在语义上等同于片段 2。@Coverify 所做的评论也应该在这里应用(更快,因为没有上下文切换)。

于 2016-04-13T09:51:49.557 回答
2

第一个选项会有更好的性能。我假设在您的使用情况下,这两个选项在功能上都是正确的。

第二段代码在每个时钟上等待,然后检查条件。由于等待在永远循环中,因此此代码将导致在 clk 的每个 posedge 上进行上下文切换。另一方面,选项 1 中的代码只切换一次上下文。

于 2016-04-13T07:22:12.807 回答
0

哪个性能更好?这取决于模拟器的实现。在真正的事件基础模拟器中,案例 1 的性能会更好,因为评估代码不会在每个时钟沿唤醒。但是,我怀疑案例 2 在现实世界中会具有更好的性能,因为评估代码与时钟刻度很好地对齐。

如果您的代码不是对异步逻辑进行建模,我建议您坚持使用案例 2。代码更易于理解和理解。将一切与时钟对齐,让您的生活更轻松。

于 2016-05-18T17:01:48.730 回答
0

这两个选项在功能上并不等效。

但在这种情况下,第二个选项在模拟性能上会比第一个选项好。

因为,在第一个选项中,工具需要在每个时间步上检查 a 的值,而在第二个选项中,工具将只检查 posedge,而不是每个时间步。

于 2016-04-15T17:41:37.153 回答