我正在验证设计中产生具有精确定时边缘的脉冲的部分。我有一个基本的行为模型,它产生的输出与设计相似但不完全相同。两者之间的差异小于设计所需的精度,所以我的模型足够好。问题是:我如何比较这两个信号?
我试过了:
assert(out1 == out1_behav);
但由于两个信号的边缘相差1ps,因此失败了。设计只需要以100ps的精度放置边缘,所以我希望在这种情况下通过。
我考虑过使用带有$delay()
时序检查的指定块,但这会导致其他问题,因为我需要运行+no_timing_checks
以防止我的ram模型在此RTL sim中失败。
有没有一种简单的方法来检查这些边缘是否“几乎”相同?
答案 0 :(得分:3)
根据100ps
内匹配信号的设计要求,您可以添加一个比较逻辑,100ps
转换延迟将充当过滤器。
bit match;
assign #100ps match = (out1 == out1_behav);
always @*
assert #0 (match==1);
Verilog有不同的分配延迟方式:转换和传输。转换延迟控制上升,下降和不确定/高Z时序。如果驱动信号给出的脉冲小于延迟,它们可以充当滤波器。传输延迟将始终跟随驱动信号的时移。当延迟很大时,转换和传输看起来都是一样的。
assign #delay transition = driver; // Transition delay
always @(rhs) transport <= #dealy driver; // Transport delay
示例:http://www.edaplayground.com/s/6/878,点击运行按钮查看波形。
答案 1 :(得分:1)
如果您使用的是Modelsim / Questa,您仍然可以使用+ notimingchecks,然后使用tcl命令tchech_set
打开个人计时检查,例如$ fullskew
否则,您将必须编写一个行为块,记录两个信号的上升沿和下降沿的时间戳,并检查差值的绝对值。