文章目录
基本操作符
蕴含操作符
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)