SVA断言

文章介绍了Verilog中断言的概念和类型,包括立即断言和并发断言,以及如何自定义断言行为。同时阐述了Property和Sequence的区别,它们用于描述设计的时序和逻辑行为。Sequence用于表示时序事件序列,而Property则结合Sequence来表达设计的确切行为。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1 断言的功能

  • 仿真器会根据哪些断言被激活,这样就可以在此基础上收集功能覆盖率数据。

2 立即断言和并发断言

2.1 立即断言描述的是非时序的。它可以检测待测设计的信号值和测试平台的信号值,并且在存在问题时采取相应的行动。

2.1.1 定制断言行为

一个立即断言有可选的 then 和 else 分句。如果你想改变默认的消息,可以添加自己的输出信息。

a1: assert (bus.cb.grant == 2'b01)
else $error("Grant not asserted");  //如果grant不符合期望的值,就会看到定制的错误信息

2.2 并发断言描述的是时序的,与设计模块并行执行(只做观察不应影响设计的行为)。可以认为它是一个连续运行的模块,它为整个仿真过程检查信号的值。在并发断言内,需要指定一个采样时钟。

区分并发断言和立即断言的关键字是Property,Property是需要时钟的:

a1: assert property(@(posedge clk) a);

3 区分Sequence和Property

  •  Property描述了一些条件和结果之间的关系,它是一个单独的语言元素。Sequence描述了一些时序事件的序列,并在时序事件的序列上进行匹配。
  • Property可以包含多个时序事件,而Sequence只描述了一个时序事件的序列。
  • Sequence可以使用通配符来进行匹配,而Property不支持通配符。
  • 只有在Property中才能使用蕴含操作符,Property中不能使用蕴含操作符
  • Property块可以直接包含Sequence,复杂的Property块也可以独立声明Sequence

断言中的sequence不是uvm_sequence,而是一种用来表示一个或多个时钟周期内时序的描述。它是property的基本构建模块,可以在module,package,interface,program,clocking块中声明,但是不能在class中,property也是。sequence在声明的时候可以使用形式参数提高复用性。

总结:property:结合sequence对时序和逻辑的描述,用来表达设计的确切行为。

4 Sequence中基本符号描述

4.1 ## 表示周期延迟,##0表示当前周期,##n表示n个周期后,只计一次,条件满足后重新判断

##[min:max]表示延迟一个范围的周期,min、max要是非负数。序列会匹配最早的时间,通配符$表示无穷,如果##[3:$]表示延迟周期大于等于3都复合条件。

a |-> ##[1:4] b; //表示接下来的四个时钟内有一个满足即可。
a |-> ##[0:3] b;  //表示当前时钟和后续的三个时钟有一个满足即可。

4.2 [*n]表示重复计多次事件(连续计算),不能和$配对使用,n是非负数,如果[*0]表示不检查当前算子(表示这个信号情况不发生),在信号后使用如@(posedge clk)a## 3 b[2],即表示在时钟上升沿时a信号拉高且再过3个周期后b连续拉高两拍也可以配合":"来表示重复一个范围的次数,如[*3:8]重复3-8次。

a |-> ##1 b[*4]; //表示连续四个时钟都为1.

4.3 [=n]表示需要重复n次,但这n次不用连续,只要发生了n次即可,如a[=5]表示a要拉高5次,但不用是连续拉高5拍,可以不连续。也可以和":"组合使用表示一个范围。

a |-> ##1 b[=4]; //只需要后续b有4个时钟为1即可,不要求连续。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值