当前位置: 首页 > news >正文

【IC】基于systemverilog(UVM)断言

断言

  • 0.注意
  • 1.作用
  • 2.分类
  • 3.断言的语法
  • 4.基本组成
  • 5.实现断言
  • 6.常见断言方法
  • 7.APB的断言
    • 7.1APB的时序
    • 7.2 断言的检查
    • 7.4 断言覆盖率的统计
    • ...未完待续

0.注意

在sequence序列、property属性和断言语句中都可以触发事件,但是建议在property中定义;

1.作用

可以进行时序检查和覆盖率统计。

2.分类

即时断言:执行到程序块,立即执行断言,可以结合信息打印机制进行使用;
并发断言:在整个仿真过程中,都会连续地检查信号。

3.断言的语法

//含bool表达式的sequence
sequence sequence名字;bool表达式;
endsequence
//含sequence的property
property 名字;@(敏感事件列表)   sequence;
endproperty
//含property的断言语句
断言的名字: 断言关键字(assert/cover/assume) property(property名字);断言执行结果;
else不满足断言执行结果;

4.基本组成

sequnce序列:表示事件;
property属性:仿真过程中被验证的单元;
实例化property的关键字:
assert:时序检查,要求在整个验证场景中必须为真;
cover:覆盖断言,在整个验证场景中必须出现过;
assume:约束断言,一般用来规范电路的输入激励;

5.实现断言

bool表达式构成sequence序列;
sequence序列构成property属性;
使用属性进行断言;

6.常见断言方法

A 运算符
a 说明:(过于简单的断言可以不用sequence序列)
直接使用运算符;
b 语法:
直接使用运算符;
c 例子:
在这里插入图片描述
在这里插入图片描述
B 内建方法
a 说明
使用systemverilog内建的方法进行断言;
b 语法:
$rose(expression or signal)
当表达式/信号由0变为1时,返回真;
$fell(expression or signal)
当表达式/信号由0变成1时,返回真;
$stable(expression or signal)
当表达式/信号不变时,返回真。
$past(signal,pad)
检查信号前几拍;
例子1:
在这里插入图片描述
在这里插入图片描述
例子2:
在这里插入图片描述
在这里插入图片描述
例子3:
在这里插入图片描述
在这里插入图片描述
C 参数化
说明:
sequence序列和property都可以传参;
语法:
sequence sequence名字(参数列表);
bool表达式;
endsequence
property property名字(参数列表);
sequence序列或bool表达式;
endproperty
例子:
在这里插入图片描述
在这里插入图片描述
D 延时
说明:当先行算子满足后,延时拍数,后续算子需满足;
语法:先行算子 ##延时拍数 后续算子;
注意:拍数表示延迟的周期数,而不是时间单位;
例子:
在这里插入图片描述
在这里插入图片描述
说明:上图波形不能反映断言结果,截出断言列表;
在这里插入图片描述
D1 延时1
说明:当先行算子满足后,延时拍数区间,后续算子在延时区间满足其中一个时刻即可;
语法:先行算子 ##延时拍数区间 后续算子;
注意:拍数表示延迟的周期数,而不是时间单位;
例子:
在这里插入图片描述
在这里插入图片描述
E 交叠蕴含
说明:当先行算子满足时,在同一周期,计算后续算子的表达式;
当先行算子不满足时,会显示空成功;
语法:先行算子 |-> 后续算子;
代码:
在这里插入图片描述
结果:
在这里插入图片描述
F 非交叠蕴含
语法:先行算子 |=> 后续算子;
说明:当先行算子满足时,在下一周期,计算后续算子的表达式;
当先行算子不满足时,会显示空成功;
代码:
在这里插入图片描述
结果:
在这里插入图片描述
注意:断言结果为后续算子满足时显示;
G sequence序列的拼接(ended没有考虑)
说明:
序列可以按照起点进行拼接,前面序列断言后,继续断言后续序列,同时满足断言成功;
起点拼接,直接用断言符号;
例子:
在这里插入图片描述
在这里插入图片描述
H 连续重复跟随运算符
说明:信号或序列连续多拍满足,且次算子判定必须紧跟前序算子和后续算子。
语法:signal or sequence [*n]
例子:
在这里插入图片描述
在这里插入图片描述
I 非连续重复跟随运算符
说明:信号或序列连续或间断满足要求,且信号或序列必须紧跟前序算子和后续算子;
语法:信号或序列[->次数]
例子:
在这里插入图片描述
在这里插入图片描述
j 非连续重复非跟随重复运算符
说明:信号或序列连续或间断满足要求,且信号或序列必须紧跟前序算子和后续算子;
语法:信号或sequence序列[=n] 后续断言;
例子:
在这里插入图片描述
在这里插入图片描述
注意1:会重复检测。
注意2:三个重复算子的区别:
a重复序列的构造

	前序算子   重复算子   后续算子;//前序算子和后续算子不是必须项;

b重复序列的特性
连续性:重复算子必须紧跟前序算子执行,且必须连续满足重复算子([*3]即为三个连续的高电平);
跟随性:后续算子必须紧跟重复算子执行;
c 三个重复算子满足的特性

连续性跟随性
[*n]
[->n]×
[=n]××

k and构造
说明:
可以并列组合两个序列,两个序列都成功时,整个属性成功;
两个sequence序列起点要相同,终点可以不同;
检验的起始点是两个sequnce序列检验的起始点,检验的终点是后结束sequence序列检验的终点;
语法:
序列1 and 序列2;
例子:
在这里插入图片描述
结果:
在这里插入图片描述
在这里插入图片描述
注意:两个sequence序列起始点必须相同,当起始点不同时,后一个sesquence序列的起始点也可作为前一个sequence序列的起始点时,可以将后一个序列的起始点作为总的起始点;
例子:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
l intersect构造
说明:
可以并列组合两个sequnce序列,两个sequence序列都成功时,property属性才成功;
两个sequence序列必须同时开始和同时结束,即需要有相同的长度;
例子1:起点和终点都不同,and和intersect都断言失败;
在这里插入图片描述
在这里插入图片描述
例子2:起点相同和终点不同,and断言成功intersect断言失败;
在这里插入图片描述
在这里插入图片描述
例子3:起点和终点都相同,and和intersect都断言成功;
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
m or构造
说明:
可以并列组合两个sequence序列,只要有一个序列成功,property属性就成功;
n first_match构造(没跑通例子,例子和理论违背)
说明:当序列由多个并行序列通过通过逻辑运算符进行组合(and /or等),会出现一次检测有多个匹配的结果,使用first_match够着只会用第一次序列匹配;
语法:first_match(sequence序列或信号);
例子:
在这里插入图片描述

在这里插入图片描述
说明
序列:

	a ##[1:2] b

等价于由两个序列通过or运算符进行组合:

	(a ##1 b) or(a ## 2 b)

所以,一般会将所有序列检查完,才会检查后续序列;
当使用first_match构造后,多个并行序列检查到第一次满足后,立刻执行后续序列:

	first_match (a ##[1:2] b)

o throughout构造
说明:bool表达式,在整个后续序列过程中,为高电平;
语法:(bool表达式) throughout 后续sequence序列;
例子:
在这里插入图片描述
在这里插入图片描述
说明:
在50到90时刻,断言失败,因为前提条件a为低;
90到130时刻,断言失败,因为前提a并没有在整个过程中满足;
130到170时刻,断言成功,因为前提a在整个过程中满足后续表达式也满足。
p within构造
说明:后续序列发生的时间段,包含前面序列发生的时间段;
即,后续序列必须先于 先行序列开始,后续序列必须后于 先行序列结束;
语法:先行序列 within 后续序列;
例子:
在这里插入图片描述
在这里插入图片描述
q 局部变量
说明:sequence序列和property属性内都可以定义局部变量,局部变量可以赋值,紧接着子程序放置用逗号隔开;
语法:

局部变量声明;
bool表达式,局部变量赋值;

例子:APB协议中的断言;
在这里插入图片描述
r 例子
a 例1
在这里插入图片描述
说明:
先行算子:a和b同时为高;
后续算子:在1到3拍内,c至少在一个时钟周期内为高;
结果:
在这里插入图片描述

b 例子2
在这里插入图片描述
说明:
先行算子: a为高;
后续算子:在一拍以后,b存在高电平;
b为高,同时及以后,c存在高电平;

7.APB的断言

7.1APB的时序

(1)写操作时序
在这里插入图片描述
(3)读操作时序
在这里插入图片描述

7.2 断言的检查

(1)公共断言
A PSEL信号拉高,APBADDR信号不应该为X;
使用的断言:交叠蕴含和$unknown内建方法;
代码:
在这里插入图片描述
结果:
在这里插入图片描述

B PSEL信号拉高,下一个周期PENABLE信号也应该拉高;
使用的断言:$rose内建方法和非交叠蕴含;
代码:
在这里插入图片描述
结果:
在这里插入图片描述
C PENABLE信号拉高,下一个周期PENABLE信号应该拉低;
使用的断言: $rose(), $fell()内建方法和非交叠覆盖;
代码:
在这里插入图片描述

结果:
在这里插入图片描述
D在下一次传输前,PADDR和PWRITE信号应该保持不变;
使用的断言:$rose(),局部参数,##1,[=1],基本运算符,$past(),,first_match,|->
例子:
在这里插入图片描述
代码分析:
a 用$rose内建方法判定PENABLE信号的上升沿前一次传输过程的开始,并记录地址;
b用延时(##1)和基本运算符和非连续重复非跟随运算符判定下一次传输的开始,并用$past记录地址;
c用first_match结构只检查第一次满足要求的结果;
d用交叠蕴含(|->)判定地址的一致性;
(2)写模式断言
说明:无论是在读还是写数据模式,依次数据传输过程中,写数据线(PWDATA)保持不变;
代码:
在这里插入图片描述
结果:
在这里插入图片描述

7.4 断言覆盖率的统计

(1)非连续写操作
说明:进行一次写操作,空缺一拍,再进行下一次写操作;
时序如下图:
在这里插入图片描述
代码:
在这里插入图片描述
说明:
a PSEL为高且PENABLE为低,判定一次传输的开始;
b 通过交叠蕴含(|->)和througout结构要求从此刻开始到下一次传输结束,PWRITE保持为高;
c 通过延迟结构(##)、连续重复跟随结构、非连续重复非跟随结构,要求下一拍PENABLE为高、PENABLE连续两拍低、PENABLE在后一次传输结束前为高一拍;
结果:
在这里插入图片描述
(2)连续写
说明:前一次写完,立刻写第二次
时序:
在这里插入图片描述
代码:
在这里插入图片描述

代码说明:
a PSEL为高且PENABLE为低,判定一次传输的开始;
b 通过交叠蕴含(|->)和througout结构要求从此刻开始到下一次传输结束,PWRITE保持为高;
c 通过延迟结构(##)、要求下一拍PENABLE为高、再下一拍PENABLE为低、再下一拍PENABLE在后一次传输结束前为高一拍;
结果:
在这里插入图片描述

…未完待续


http://www.mrgr.cn/news/44714.html

相关文章:

  • YoloV10改进策略:BackBone改进|CAFormer在YoloV10中的创新应用,显著提升目标检测性能
  • 【含文档】基于Springboot+Android的个人财务系统的设计与实现(含源码+数据库+lw)
  • 家庭用超声波清洗机好用吗?推荐四款性能绝佳的超声波清洗机!
  • shell脚本中for循环的用法
  • 多模态大模型调研BLIP、BLIP2、InstructBLIP
  • java数据类型转换和注释
  • Nginx的正向与反向代理
  • 音视频开发之旅(88) - 视频画质评测算法之Dover
  • VADv2 论文学习
  • C(十五)函数综合(一)--- 开公司吗?
  • 第三届图像处理、计算机视觉与机器学习国际学术会议(ICICML 2024)
  • 分治算法(2)_快速排序_排序数组
  • 不同jdk版本间的替换
  • 原神5.1前瞻网页HTML+CSS+JS
  • WPF 手撸插件 八 操作数据库一
  • 【C++】入门基础介绍(下)输入输出,函数重载,缺省与引用
  • wxPython中wx.ListCtrl用法(样式和事件)
  • 杭电2041-2050
  • VBA学习(77):Excel表格拆分通用版终极神器
  • 牛客:小红的字符移动,小红的数轴移动,小红的圆移动