以下均为个人答案,水平有限,仅供参考。如有解释不对的地方,欢迎大家评论区留言一起学习交流
【持续搜集更新中…】
注:更多的细节知识点可以看 Assertion断言
1.断言中两个sequence如何同时开始、同时结束?
使用intersect操作符,SEQ1 intersect SEQ2,可以完成两个sequence同时开始并同时结束。
intersect操作符要求:需要两边的序列时序在同一时间周期内匹配。
拓展一下,与and和or操作符的区别:
- and要求没那么严格,满足的时刻为两个sequence都满足的时候(注意不是同时满足)。但是,在此之前,某一个sequence可能提前满足了,等到后一个满足的sequence满足,seq1 and seq2就满足了。
- or是指两个sequence满足任何一个,这个表达式 seq1 or seq2 就满足了。举个例子,如下:
/*
【需求:】
如果burst write长度为4,那么写的长度可以为1、2或者4,怎么判断?
*/
property BurstLengthValid
@(posedge clk) disable iff(!rst)
((burstLen == 4) |->
(wrlen==1) or (wrlen==2) or (wrlen==4) );
endproperty
assert property (BurstLengthValid)
2.断言中怎么表示信号上升沿?
r o s e ( ) 表 示 上 升 沿 , rose()表示上升沿, rose()表示上升沿,fell()表示下降沿。
例如:
/*
【需求:】
在PSEL拉高的下一个周期,PENABLE也应该拉高。
*/
property penable_rise;
@(posedge clk) $rose(psel) |=> $rose(penable);
endproperty
assert property(penable_rise) else `uvm_error("ASSERT","PENABLE not rose after 1 cylce PSEL rose");
3.断言中的 $firstmatch什么意思?
用来从多次满足的序列中选择第一次满足的时刻,从而放弃其他满足时刻。
例如:
/*
【需求:】
每一次PIC总线进入idle状态时,状态机也应该返回idle状态。
由此,在时序上要求:
如果frame和irdy信号保持至少两个周期以上为高时,系统的状态应该进入idle状态。
*/
sequence CheckBusIdle;
(##[2:$] (frame && irdy) );
endsequence
property first_match_idle;
@(posedge clk)
first_match(CheckBusIdle) |-> (state==idle);
endproperty
再延伸一下,这与 throughout 和 within 的异同点是什么?
- 表达式SEQ1 within SEQ2 ,注意是SEQ2包住SEQ1。如果当SEQ1满足在SEQ2的一部分连续时钟周期内成立,则表达式成立;
- sig1/Exp1 thoughout SEQ,左边要惯穿右边,所以左边包住右边。左边条件满足的周期里面右边满足时,则表达式sig1/Exp1 thoughout SEQ 成立。