我看到断言总是与时钟的 n 个周期有关。有什么办法可以检查时间刻度的持续时间吗?意义
假设我想检查复位是否保持 100ns 或更短,我们如何为此编写断言语句?
我看到断言总是与时钟的 n 个周期有关。有什么办法可以检查时间刻度的持续时间吗?意义
假设我想检查复位是否保持 100ns 或更短,我们如何为此编写断言语句?
是的,从概念上讲,您可以使用 SVA 中的局部变量编写这样的断言。
它可能看起来像这样:
property reset_chk;
time current_time;
@(rst) (~rst, current_time = $time) |=> ($time - current_time == 100);
endproperty
但是应该避免这种类型的断言,因为它们不是写在时钟上的。
或者,人们总是可以制作一个足够快的参考时钟,以适应任何此类信号时序。
对于断言中的局部变量,您可以阅读SVA 中的局部变量
首先,我会考虑 SVA 是否是检查这一点的最佳方式。
如果您这么认为,那么如何在测试台中创建一个具有合适周期的虚拟时钟并(通过分层命名的力量)使用它。一个合适的时期可能是
如果您正在寻找最小脉冲宽度,则为 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
//