System verilog 长时间保持重置的断言
我看到断言总是与时钟的n个周期有关。有没有办法检查wrt时间刻度的持续时间?意义System verilog 长时间保持重置的断言,system-verilog,system-verilog-assertions,System Verilog,System Verilog Assertions,我看到断言总是与时钟的n个周期有关。有没有办法检查wrt时间刻度的持续时间?意义 我们假设检查重置是否保持100s或更少,我们如何为这个写一个断言语句? 首先,我会考虑SVA是否是检查这一点的最好方法。p> 如果您这样认为,那么在测试台上创建一个具有适当周期的虚拟时钟,并(通过分层命名的功能)使用它怎么样。可能需要一个合适的时期 如果您正在寻找最小脉冲宽度,则为100ns 如果您正在寻找最大脉冲宽度,则速度要快得多(例如,10ns周期将允许您检查脉冲宽度是否小于110ns,即11个周期) 断
我们假设检查重置是否保持100s或更少,我们如何为这个写一个断言语句?
首先,我会考虑SVA是否是检查这一点的最好方法。p> 如果您这样认为,那么在测试台上创建一个具有适当周期的虚拟时钟,并(通过分层命名的功能)使用它怎么样。可能需要一个合适的时期- 如果您正在寻找最小脉冲宽度,则为100ns
- 如果您正在寻找最大脉冲宽度,则速度要快得多(例如,10ns周期将允许您检查脉冲宽度是否小于110ns,即11个周期)
断言最好同步完成。这并不意味着你不能检查异步的东西,但是你仍然需要同步地采样有问题的信号。因此,通过这种方式,您可以使用虚拟时钟同步采样异步信号。这是异步检查。最好的方法是用传统方法或纯systemverilog检查它,而不是使用SVA并发断言 如果需要,您仍然可以添加立即断言,用于覆盖目的。 快速示例代码:
//
task assert_reset_hold_100ns();
fork : fk1
begin : blk1
@(reset);
$fatal;
end
begin : blk2
#100ns;
ASSERT_RESET_HOLD_100NS: assert(1);
end
join_any
disable fork;
endtask
// checker
initial forever begin
wait(reset === 0);
assert_reset_hold_100ns();
wait(reset === 1);
end
//
是的,从概念上讲,您可以使用SVA中的局部变量编写这样的断言 可能是这样的:
property reset_chk;
time current_time;
@(rst) (~rst, current_time = $time) |=> ($time - current_time == 100);
endproperty
但是应该避免这种类型的断言,因为它们不是写在时钟上的。
或者,人们总是可以制作一个参考时钟,其速度足以适应任何此类信号定时
对于断言中的局部变量,可以读取