文章目录
断言的评估和执行包括以下三个阶段:
预备阶段:采样断言变量,而且信号或变量的值不能改变,这样确保在时间间隙开始的时候采样到最稳定的值
观察阶段:对所有的属性表达式求值
响应阶段:调度评估属性成功或失败的代码
断言分为并发断言和立即断言,二这区别如下:
立即断言:
1-与时序无关,应被立即求值
2-只能用于动态模拟
3-只能放在过程块中
并发断言:
1-与时序相关
2-在时钟边沿根据调用的变量采样值计算表达式
3-采样在预备阶段完成,表达式的计算在观察阶段完成
4-可以放在过程块、模块、接口或程序中
5-可以在静态验证和动态模拟验证工具中使用
6-以property为关键词
区分二者的关键词为property。
常用的断言构造
断言函数
!
i
s
u
n
k
n
o
w
(
表达式
)
:检验表达式中没有位为
X
或者
Z
,及数据是有效的
−
−
−
−
−
!
isunknow(表达式):检验表达式中没有位为X或者Z,及数据是有效的----- !
isunknow(表达式):检验表达式中没有位为X或者Z,及数据是有效的−−−−−!stable(a)表示a发生变化
$rose(a):当信号或表达式a变成1时返回真------对应------拉高、上升沿
$fell(a):当信号或表达式a变成0时返回真------对应-------拉低、下升沿
$stable(a):当信号或表达式a不发生变化时返回真------对应------不变、稳定
$past(a, n):信号或表达式n个周期前的值
$onehot(表达式):任意时钟沿,检验表达式是否只有一位为高
$onehot0(表达式):任意时钟沿,检验表达式是否只有一位为高或者没有任何位为高
$isunknow(表达式):检验表达式的任何位是否为X或者Z
$countones(表达式):计算表达式中为高的位的数量
重复运算符
a[*n]:a连续重复发生n次,每次匹配之间隐藏一个时钟周期的延迟,且连续重复的前后不应有时间间隔,类似a[*n:m],表示一定范围内的连续重复
a[->n]:a跟随重复发生n次,且允许发生之前和重复期间有时间间隔,但重复之后不能有时间间隔
a[=n]:a非连续重复发生n次,允许发生之前、重复期间和发生之后有时间间隔,类似a[=n:m],表示一定范围内的非连续重复
蕴含操作符
|->:交叠交错符号,先行算子不成立,表现为空成功;成立则先行算子和后续算子同周期执行
|=>:非交叠交错符号,先行算子不成立,表现为空成功;成立则先行算子比后续算子快一个周期执行
and运算符(A and B)
1-组合两个序列,两个序列都满足时整个属性才成功
2-两个序列必须有相同的起始点,可以不同的结束点
3-检验的起始点:第一个序列成功时
4-检验的结束点:使得属性成功的另一个序列成功时的点
intersect运算符 (M intersect N)
1-组合两个序列,两个序列都满足时整个属性才成功
2-两个序列必须有相同的起始点以及相同的结束点
3-两个序列的长度必须相等
4-检验的起始点:第一个序列成功时
5-检验的结束点:使得属性成功的另一个序列成功时的点
or运算符 ( C or D)
1-两个序列中,只要其中一个序列成功,整个属性就成功
first_match (C or D)
1-常用于含有逻辑运算符(如and、or)的序列中,若指定时间窗,就可能出现多个匹配的情况
2-可以确保只用第一次序列匹配,而丢弃其他匹配
(表达式)throughout (序列)
1-保证某些条件在整个序列的验证过程中一直为真
E within Q
1-序列E在序列Q的开始直到结束的范围内发生
关键词not
1-可用于表示属性应该永远不为真
关键词ended
1-使用序列的结束点作为同步点的连接机制
注:不加ended表示基于序列的起始点来同步序列