我将定义三个sequence
来检测下一个有效 ( ) 上的相同 id same_id
;检测id
下一个有效 ( change_id
) 的变化;并检测有效数据包 ( packet_id
)。然后我可以在四个内监控一个属性valid
,只有三种可能的情况:即
case1: (id, id, id, id+1) OR
case2: (id, id+1, id+1, id+1) OR
case3: (id, id, id+1, id+1)
请在下面查看我的代码。我没有测试过,这只是我的想法。希望它会奏效。好消息是property
只会持续 4 个时钟滴答,并且在每个时钟滴答中,只有一个线程。所以我们可以避免线程爆炸。
// To detect same id within two non-consecutive valid,
// (a,a)
sequence same_id;
int prev_id;
@(posedge clk)
valid, prev_id=id ##1 valid[=1] ##0 id==prev_id;
endsequence
// To detect valid packet
// (a,a,a)
sequence packet_id;
int prev_id;
@(posedge clk)
same_id, prev_id=id ##1 valid[=1] ##0 id==prev_id;
endsequence
// To detect any change of ID
// any (a,b)
sequence change_id;
int prev_id;
@(posedge clk)
valid, prev_id=id ##1 valid[=1] ##0 id==prev_id+1;
endsequence
// Put all together, in any four non-consecutive valid, there are only three cases: a,b,b,b OR b,b,b,c OR a,a,b,b
property next_id;
int prev_id;
@(posedge clk)
(change_id ##0 packet_id) or // a,b,b,b
(packet_id ##0 change_id) or // b,b,b,c
(same_id ##0 change_id ##0 same_id); // a,a,b,b
endproperty