UVM项目实战3
1.断言是用来与设计功能和时序做比较的属性描述
2.断言分类:
立即断言(非时序的、执行时如同过程语句、可以在initial/always过程块或者task/function中使用)
并行断言(时序性的、关键词property用来区分立即断言和并行断言、并行—它们与设计模块一同并行执行)
3.立即断言
timr t;
always @(posedge clk)
if(state==REQ)
//如果状态为REQ,但是req1或者req2均不为1时,断言将失败
assert (req1||req2)
else begin
t=$time;
#5 $error("assert failed at time %0t",t);
end
立即断言可以结合$fatal/$error/$warning/$info给出不同严重级别的消息提示
assert (myfunc(a,b)) count1=count+1; else ->event1;
assert (y==0) else flag=1;
always @(state)
assert (state==$onehot) else $fatal;
4.并行断言只会在时钟边沿激活,变量的值是采样到的值
property req_grant_prop
@(posedge clk) req ##2 gnt ##1 !req ## !gnt;
endproperty
assert property req_grant_prop else $error ("Req-Gnt Protocol violoation");
5.assertion可以直接包含一个property;
assertion也可以清晰地独立声明property;
property块可以直接包含sequence;
复杂的property也可以独立声明多个sequence;
sequence s1;
@(posedge clk) a ##1 b ##1 c;
endsequence
sequence s2;
@(posedge clk) a ##1 c;
endsequence
property p1;
@(posedge clk) disable iff(!reset)
s1 |=> s2;
endproperty
6.sequence是用来表示在一个或者多个时钟周期内的时序描述;
是property的基础构建模块,并经过组合来描述复杂的功能属性;
sequence可以在module、interface、program、clocking块和package中声明;
7.|-> 操作符是交叠交错符号:如果条件满足,则评估其后续算子序列;如果不满足,则表示空成功,不执行后续算子
property p1;
@(posedge clk) mem_en |-> (req ##2 ack);
endproperty:p1
8.|=> 操作符是交叠交错符号:如果条件满足,则在下一个周期评估其后续算子序列;如果不满足,则表示空成功,不执行后续算子
property p1;
@(posedge clk) mem_en |=> (req ##2 ack);
endproperty:p1
9.事件可以通过[*n]操作符号来表示重复,n为非负数,不能是$,可以是0
sequence a_b
@(posedge clk) a ## 1 b[*2];
endsequence
10.[=m]用来表示一个事件的连续性,需要重复发生m次,但并不需要在连续周期内发生
sequence a_b
@(posedge clk) a ## 1 b[=3];
endsequence
b[=3]表示b必须在3个周期内为1,但并不需要是连续的3个周期
11.and用来表示两个序列需要保持匹配,例SEQ1 and SEQ2
下列情形将满足此操作符:
在从同一起始点开始后,seq1和seq2均满足;
满足的时刻发生在两个序列都满足的周期,即稍晚序列的满足时刻;
两个序列的满足时间可以不同;
如果操作符两边的序列都是用来衡量采样信号而非事件时序,那么则要求在相同周期内,and左右两边的序列都应该满足条件
12.intersect与and操作符类似,只是多要求了同一时刻结束
13.or用来表示两个序列至少需要有一个满足
下列情形将满足此操作符:
seq1和seq2都从同一时刻被触发;
最终满足seq1或者满足seq2;
每一个序列的结束时间可以不同,结束时间以序列满足的最后一个序列时间为准;
14.first_match用来从多次满足的序列中选择第一次满足时刻,从而放弃其他满足的时刻
15.throughout操作符可以用来检查一个信号或者一个表达式在贯穿一个序列时是否满足要求
(左边比右边长)
16.within操作符可以用来检查一个序列与另一个序列在部分周期长度上的重叠
(右边比左边长)
17.if操作符
property master_child_reqs;
@(posedge clk) master_req ##1 (req1 || req2) |->
if(req1)
(##1 ack1);
else
(##1 ack2);
endproperty
18.SEQ.ended
在某一时刻,序列如果及时抵达终点(结束或者已经结束),那么条件满足
注意:起始时刻,起始时刻前结束明显不对
19.局部变量可以在sequence或者property中使用;
这些变量会伴随着sequence、property动态创建;
每一个sequence实例都会有它自己的变量拷贝;
在cache rdDone拉高后,读出的rdData会在2个周期后,在其基础上加1,并作为wrData写入
sequence rd_cache_done;
##[1:5] rdDone;
endsequence
sequence check_reg_wr_data;
int local_data;
(rd_cache_done,local_data=cache_rd_data) ##2 (reg_wr_data == (local_data+1));
endsequence
20.在序列匹配时,可以调用task,void function和系统函数
可以在s1序列末尾,分别打印出e和f变量被采样时的数值
sequence s1;
logic v,w;
(a,v=e) ##1 //第一个逗号前面为被采用的数,后面为局部变量,再后面是调用的函数
(b[->1],w=f,$display("b after a with v=%h, w=%h\n",v,w));
endsequence
21.一些系统函数可以用来访问指定类型的变量采样:
用来访问当前周期采样值;
用来访问上一个采样周期值;
用来检测采样变量的变化;
r o s e / rose/ rose/fell 与上一个采样周期相比跳变1/0,如果满足返回1,否则返回0;
22.$stable用来表示连续两个采样周期内,表达式的值保持不变,如果满足返回1,否则返回0;
23.$past用来访问过去若干采样周期前的数值,默认情况为前1个周期
24. r o s e / rose/ rose/fell/$past也可以在过程块语句和连续赋值中使用
assign intr_cleared =$fell(intr,@(posedge clk));
25.可以在sequence/property/assertion中使用:
$countbits(expression,control_bit)用来计算expression中匹配control_bit数值的位数;
$countones(expression)计算为1的位数;
$onehot(expression)检查expression中是否有且只有1位为1;
$isunknown(expression)检查expression中是否有x或者z;
26.可以通过disable iff来给assertion做局部的条件控制
27.$asserton,默认控制,用来打开所有的assertion;
$assertoff,暂时停止assertion运行;
$assertkill,终止所有执行的assertion;