[SVA]如何用Assertion检查“某事件在仿真过程中一定要发生”

如何用Assertion检查“某事件在仿真过程中一定要发生”

       前言:在数字电路验证中,我们经常会碰到这样一个需求:检查某个信号在仿真结束前应该至少拉高过一次或者只拉高一次。比如一个简单的握手协议要求request每拉高一次就要收到一个acknowledge信号。如果acknowledge需等待的cycle数不确定,我们在构造断言时会自然而然的想到##[1:$]这类写法,如:

property p_handshake_check();
  @(posedge clk)  rdy |-> ##[1:$] acpt ##1 !acpt;
endproperty

a_handshake_check: assert property(p_handshake_check) else $error();

       但是##[1:$]这样的写法会影响仿真效率,为什么呢?因为这样写法可以分解为无数个并行check的进程, 以如下sequence为例:

sequence seq_abc();
  $rose(a) |-> b[*1:8000] ##1 c ##1 d;
endsequence

       可以分解为8000个并行的进程

SVA通常指的是SystemVerilog Assertions(系统级断言),它是一种用于验证硬件设计的功能性正确性的方法。通过SVA,可以在仿真过程中插入约束条件和时间序列检查,以确保电路的行为符合预期。 如果你要用SVA检查某种信号发生的**频率特性**,比如某个事件是否按照固定周期触发、或者某条数据流传输速率等,可以参考下面的基本步骤: ### 步骤1 - 定义时钟域与时序关系 首先明确你要分析的目标信号所在的同步时钟域,并确定如何表达“频率”这一属性。例如检测某一输入脉冲宽度是否满足设定范围,则需要引入`##[延迟值]`描述间隔的时间长度单位。 示例代码片段: ```verilog property pulse_width_check; @(posedge clk) disable iff(!reset_n) $rose(signal_to_test) |-> ##[min_cycle:max_cycle] $fell(signal_to_test); endproperty : pulse_width_check assert property (pulse_width_check) else $error("Pulse width out of range!"); ``` 上述例子表示当signal_to_test从低变高之后,在最小到最大周期数之间必须再下降沿到来;否则报错信息将显示出来提示我们出现了异常情况。 ### 步骤2 – 创建相应的监控模块并嵌入测试点 接下来创建包含之前定义好的assertion的always块或者其他形式结构体作为独立部分加入整体RTL netlist之中运行即可完成对特定位置上实际工作状况实时监督功能啦! 当然也可以单独编写一段脚本文件调用相应工具命令行参数选项来进行离线批处理模式下的静态扫描操作呀~ 以上只是简单介绍了基于sva实现频率相关特性的基本思路,具体情况还需要结合项目需求进一步细化调整哦~
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

元直数字电路验证

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值