如何利用断言去卡时间


前言

在芯片仿真验证过程中,有时候需要去卡两个状态之间的时间差,是不是满足设计的需求,当测试用例有成百上千个的时候,不能挨个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的等待来卡时间。


总结

本文主要记录了如何利用断言,去卡两个状态之间的时间,方法有很多种,这里只是记录一下我的解决方案。

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值