学习记录18(SV断言)

简介
image
断言是你想要看某个过程是否符合要求,例如带有约束的随机化,如果不符合就为假,并报警。且断言是根据设计需要来的,不一定要30%

1.立即断言(assert等)
注意:必须放在过程块always或者initial,注意断言要写完整,条件满足执行什么,不满足也要写else,防止出现错误,else下的语句是来判断断言失败的“严重程度”,$faral$error$warnibg$info:information(严重程度逐级递减,sv是小写,uvm是大写)
断言名称:assert(断言条件)
image
这里是对面面知识点的总结,让你看懂断言是在有效沿之后还是之前进行的,目的是为了能让你看懂波形,看懂波形是在有效沿之后的值才是判断断言是否成功的标志
image
不难看出RTL内部的都看波形的前面以及有效沿,断言在Observed 区域执行,晚于active和nba在有效沿之后
image

如果想要对一个rtl代码内的部分信号进行断言测试,应该怎么做
1)通过assign变量层次化引用的方式将信号线拉出来
2)通过信号名关联的方式与你写的时序模块关联起来。
标准写法:
image

2.并发断言(时序断言)
并发断言检查跨越多个时钟周期的事件序列,需要指定一个采样时钟,可以理解为一个校准时钟,只在采样边沿对多个信号进行检查
image

区分是否是是并发断言的标准是property关键词,其格式为断言名:assert property (判断条件,一般是时序条件有时钟参与),两者对比:
image

并发断言的一般形式
property p_req_ack;
    @(posedge clk)          // 指定“校准时钟”
    req |-> ##[1:3] ack;    // req 拉高的那个沿开始,在接下来的 1~3 个周期内,ack 必须为 1。
endproperty

assert property (p_req_ack) else $error("Req not followed by ack within 3 cycles!");

并发断言(assert property(...))必须写在 always 块外面(模块顶层),它是一个独立的结构,仿真器才会将其注册到专用的 Observed 区域去执行

3.区别
立即断言无法识别延迟或者等待语句,它是对当前的信号条件立刻做出判断,取决于代码执行顺序(走到这行才判断)
并发断言内部有时钟参与,可以进行一定的延时,取决于时钟边沿(每个边沿自动触发检测)。
立即断言:只能在过程块(initial/always)内 → 跟着父块走 → 绝大多数情况在 Active 区域(若在 program 中则是 Reactive)。它永远不会进入 Observed 区域,因为它是一条普通的过程语句,没有独立的调度特权。
并发断言:必须在过程块外(顶层/interface/property 定义) → 独立的检查单元 → 强制在 Observed 区域执行。这是标准为它开辟的专属“赛后裁判区”,专门用来在 Active 和 NBA 全部结束后检查最终稳定值。

4.SV中内建单元(关键词)
image
(1)sequence本质上是通过块的概念将重复的时序事件或者经过几个时钟周期的的求值事件,让断言更加简洁(写断言条件的块)。具有可带参数,可在property中调用,可使用局部变量,可定义时钟周期的特点
image
1)带参数
image
2)带时序关系(##代表两个时钟周期),上升沿到来时a为1且在2个时钟周期之后b也为1才断言成功,否则就失败
image
注意sequence可以调用其他sequence,与子类增加变量的思想类似,通常是在原来的基础上加判断条件
image

(2)property
|-> (重叠蕴含):同一周期检查。如果先行条件匹配,后续条件必须在同一个时钟周期内开始成立。
|=> (非重叠蕴含):下一周期检查。如果先行条件匹配,后续条件从下一个时钟周期开始成立
延迟累积:a |=> ##2 b 意味着 a 为高后,等待 1 拍(|=> 带来的),再等待 2 拍(##2),总共在 3 个周期后检查 b。
(3)异同
property比sequence高一级,所以sequence不能例化property
image

5.触发判断
边沿触发内置函数,注意是内置,只能用于时钟触发事件
image

image
*可以理解成连续,->为非连续
最后俩->代表a成立两次(不用连续)且下一周期b为1,此时a没有要求
最后一个只要a两次成立(不用练须)就行,不用管b

image

6.总线的断言
多bit状态一起判断
image
第一个只有1bit
第二个小于等于1bit
第三个是存在z和x
第四个是存在n个bit为高
最后一个是signal:你要追溯历史的目标信号。cycle_num:往前推的周期数。例如 2 代表取“当前时刻往前 2 个时钟周期”的那个值。1:门控使能信号。只有该条件为 1(真)时,仿真器才会记录当前值用于未来的 $past 查询。因为写的是常量 1意味着无条件始终记录

SVA中的内置函数:https://www.cnblogs.com/Alfred-HOO/articles/19656471

posted on 2026-08-02 14:36  tuck0603  阅读(27)  评论(0)    收藏  举报

导航