Assertion断言入门(二)——操作符及系统函数

分类: 365bet娱乐开户 时间: 2025-10-07 13:42:04 作者: admin

文章目录

基本操作符

蕴含操作符

and操作符

intersect操作符

or操作符

first_match操作符

throughout操作符

within操作符

if操作符

检测序列终点

局部变量

调用方法

1.$display

2.$isunknown

3.$stable

4.$past

后续精彩

基本操作符

操作符

描述

##

周期延迟时间

##[min:max]

表示在一个范围内的时钟周期延迟,会从min到max时间窗口中最早的时间来匹配

$

表示无穷大的周期(在仿真结束前),不建议使用

[*n]

表示事件重复n次

[*m:n]

表示一定范围内的重复事件

[=m]

表示一个事件的连续性,需要重复m次,但并不需要在连续周期内发生

[=m:n]

表示一个事件的连续性,需要重复m~n次,但并不需要在连续周期内发生

蕴含操作符

蕴含操作符的含义:如果property中左边的运算子先成立,那么property右边的后续运算子才会被计算。如果左边的运算子不成功,那么整个属性就会被默认地认为成功,这叫做“空成功”;

蕴含只能用在属性定义中,不能在sequence中使用。

分类:

交叠蕴含

运算符 |-> 如果满足条件,则评估后续算子序列;如果条件不满足,则表示为空成功,不执行后续算子。

property p_req_ack;

@(posedge clk) mem_en |-> (req ##2 ack);

//当men_en为高时,此时req为1 ,过两拍,ack要为拉高

endproperty

/*

【注意】

*断言成功:左边算子成功,右边算子成功

*断言失败:左边算子成功,右边算子失败

*/

非交叠蕴含

运算操作符 |=> 如果满足条件,则在下一个周期评估后续算子序列;如果条件不满足,则表示为空成功,不执行后续算子。

property p_req_ack;

@(posedge clk) mem_en |=> (req ##2 ack);

//当men_en为高时,下一拍的req为1 ,过两拍,ack要为拉高

endproperty

and操作符

用法:SEQ1 and SEQ2,表示连个序列需要保持匹配

满足条件:

1.在同一个起始点开始后,SEQ1和SEQ2均满足。

2.满足的时刻发生在两个序列都满足的周期,即稍晚序列的满足时刻

3.两个序列的满足时间可以不同 ​ 图解:

第八拍开始,才有满足 (te1 ##2 te2),所以从8拍作为起始点

从第8拍开始,(te3 ##2 te4 ##2 te5)在第12拍满足,

所以整个and操作符后的序列从第8拍开始,到第12拍结束

intersect操作符

与and类似,只是需要两边的序列时序在同一时间周期内匹配。

用法 :SEQ1 intersect SEQ2

or操作符

用法 SEQ1 or SEQ2,表示两个序列至少要有一个满足

满足条件:

SEQ1和SEQ2都从同一个时刻被触发;

最终满足SEQ1或者满足SEQ2;

每一个序列的结束时间可以不同,结束时间以序列满足的最后一个序列时间为准

/*

【需求:】

如果burst write长度为4,那么写的长度可以为1、2或者4,怎么判断?

*/

property BurstLengthValid

@(posedge clk) disable iff(!rst)

((burstLen == 4) |->

(wrlen==1) or (wrlen==2)