【发布时间】:2016-03-30 19:08:34
【问题描述】:
我看到断言总是与时钟的 n 个周期有关。有什么办法可以检查时间刻度的持续时间吗?意义
假设我想检查复位是否保持 100ns 或更短,我们如何为此编写断言语句?
【问题讨论】:
标签: system-verilog system-verilog-assertions
我看到断言总是与时钟的 n 个周期有关。有什么办法可以检查时间刻度的持续时间吗?意义
假设我想检查复位是否保持 100ns 或更短,我们如何为此编写断言语句?
【问题讨论】:
标签: system-verilog system-verilog-assertions
是的,从概念上讲,您可以使用 SVA 中的局部变量编写这样的断言。
它可能看起来像这样:
property reset_chk;
time current_time;
@(rst) (~rst, current_time = $time) |=> ($time - current_time == 100);
endproperty
但应该避免这种类型的断言,因为它们不是按时钟编写的。
或者,人们总是可以制作一个参考时钟,其速度足以适应任何此类信号时序。
关于断言中的局部变量,可以阅读Local Variables in 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
//
【讨论】: