sequence:
concatenation: seq1 ##1 seq2
overlap: seq1 ##0 seq2
ended detection: seq1 ##1 seq2.ended
repetition: seq1[*n:m]
first match detection: first_match(seq1)
or: seq1 or seq2 一个满足就行了
and: seq1 and seq2 起始时间一致,终止时间可以不一致
length-matching and: seq1 intersect seq2 seq1和seq2起始和终止时间一致
conditional qualification: cond throughout seq 条件在seq期间始终成立
within: seq1 within seq2 时间跨度上seq2 包含 seq1
此外还有triggered,例如:
property p_data_xfr(req,ack,enb,done);
@(posedge clk) disable iff(qAbort.triggered)
$rose(req)|=>qDataXfr(ack,enb,done);
endproperty
property operators
not: not(read && write) property is never occur
and: prop1 and prop2
or: prop1 or prop2
if ... else ... : if (expr) prop1 else prop2
if ... else if ... else
|->: seq1|->prop
|=>: seq1|=>prop
下面举几个复杂的property
1. 条件
property p_busAbusB_allocation;
if($rose(req_busA) && !busyA && !busyB)
##1 lock_busB && busyA ##[0:5] ackA ##[1:10] doneA && !busyA
else if ($rose(req_busB) && !busyA && !busyB)
##1 lock_busA && busyB ##[0:10] ackB ##[1:20] doneB && !busyB
else
busyA||busyB |->buses_busy;
endproperty
2. 分布
property p_switch_prop;
if(switch_enb)
if(switch_select inside {2'b00,2'b01,2'b10,2'b11} )
if(switch_select==2'b00 && $past(switch_select==2'b11))
##1 lock_enb[*1:10]##1 done;
else
lock_enb[*1:2] ##1 done;
endproperty