文章目录
前言
在芯片仿真验证过程中,有时候需要去卡两个状态之间的时间差,是不是满足设计的需求,当测试用例有成百上千个的时候,不能挨个case去手动检查,这个时候就需要利用断言去卡时间,如果不满足设计需求,就自动报错。
一、如何利用断言去卡时间
断言的基本语法,这里不进行介绍,这里主要介绍如何利用断言,去卡两个状态之间的时间差。
废话不多说,直接上代码:
// 通过宏定义定义时间间隔的最大值和最小值
parameter T_MIN 0;
parameter T_MAX 10;
// 通过seq声明第一个状态
sequence s0;
@(posedge clk)
state == PON_S0;
endsequence
// 通过seq声明第二个状态
sequence s1;
@(posedge clk)
state == PON_S1;
endsequence
// 重点在这里,声明一个属性,分别记录第一个和第二个状态发生的时间点,最后判断时间的范围
property p_time(min_t, max_t);
time t1, t2;
@(posedge clk)
(s0, t1=$time, $display("s0 arive at t1 = %t", t1)) |=> ##[T_MIN:T_MAX] (s1, t2=$time, $display("s1 arive at t2 = %t", t2)) |=> (t2-t1<max_t && t2-t1>min_t);
endproperty
// 实体化断言,通过参数将最小和最大的时间传进去
a_time: assert property(p_time(min_t, max_t));
上面代码中做了一定的注释,但是这里做几点说明。
1 关于property中的时间参数t1和t2。在上述代码属性中,用到的时间单位,是仿真的timescale指定的,所以t2 - t1的值基本上是一个较大的整数。在实体化断言传参的时候,需要根据自己的需求对min_t和max_t的值进行转换。
2 关于property中的等待代码: ##[T_MIN:T_MAX]。这部分代码不能缺少,相当于在[T_MIN:T_MAX]范围内去卡s1的状态,这里的T_MIN和T_MAX单位是cycle 。
3 关于min_t,max_t与T_MIN,T_MAX之间的关系。这里相当于进行了双重检查,其实也可以不要min_t和max_t,直接利用T_MIN和T_MAX的等待来卡时间。
总结
本文主要记录了如何利用断言,去卡两个状态之间的时间,方法有很多种,这里只是记录一下我的解决方案。