我一直想知道如何在 systemVerilog 测试平台上正确计时被测设备的输入信号驱动时间,例如,这里是带有输入 clk 和 rst 信号的简单顺序待测试器件的测试平台的摘录:
always #1 clk = ~clk;
initial begin
clk = 0;
rst = 1;
@(posedge clk);
@(posedge clk);
rst = 0;
#50 $finish;
end
我必须使用 @(thoughtge clk) 两次以确保第一个信号被 dut 读取,否则使用单个 @(thoughtge clk) 设备无法重置并且其输出在模拟期间保持 X,另一个解决方法是使用 @(negedge clk) 来计时 rst 的降低。
尽管所描述的解决方法看起来很老套,而且不是正确的做事方式,但我一直在阅读 IEEE 标准 1800-2017 第 4 章中模拟时隙不同区域中事件的调度,并尝试了不同的变体阻塞和非阻塞分配都无济于事。
所以我想问如何(如果可能的话)安排在时钟边缘之后和之前的信号驱动。
断言复位超过一个时钟周期是完全正常的,特别是如果不是每个逻辑都与复位信号相关联的话。
您应该对测试平台信号使用非阻塞分配,以避免 DUT 中出现竞争。同样的规则适用于您设计中的信号。