其中哪些会阻碍我的测试台中的模拟性能以及原因(从系统 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 信号,它在仿真期间的某个时钟边缘被断言。假设这个任务只被调用一次。
其中哪些会阻碍我的测试台中的模拟性能以及原因(从系统 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 信号,它在仿真期间的某个时钟边缘被断言。假设这个任务只被调用一次。
两者在功能上并不等同。第一个片段等待直到a
变高(即完全相同的周期),而第二个片段等待直到a
“看到”在时钟周期变高:
_ _ _ _ _
clk _| |_| |_| |_| |_| |_
______________
a ______|
| |
1 2
数字会显示每个触发的时间。你真正想要的是:
@(posedge clk iff dut_if.a);
这在语义上等同于片段 2。@Coverify 所做的评论也应该在这里应用(更快,因为没有上下文切换)。
第一个选项会有更好的性能。我假设在您的使用情况下,这两个选项在功能上都是正确的。
第二段代码在每个时钟上等待,然后检查条件。由于等待在永远循环中,因此此代码将导致在 clk 的每个 posedge 上进行上下文切换。另一方面,选项 1 中的代码只切换一次上下文。
哪个性能更好?这取决于模拟器的实现。在真正的事件基础模拟器中,案例 1 的性能会更好,因为评估代码不会在每个时钟沿唤醒。但是,我怀疑案例 2 在现实世界中会具有更好的性能,因为评估代码与时钟刻度很好地对齐。
如果您的代码不是对异步逻辑进行建模,我建议您坚持使用案例 2。代码更易于理解和理解。将一切与时钟对齐,让您的生活更轻松。
这两个选项在功能上并不等效。
但在这种情况下,第二个选项在模拟性能上会比第一个选项好。
因为,在第一个选项中,工具需要在每个时间步上检查 a 的值,而在第二个选项中,工具将只检查 posedge,而不是每个时间步。