尝试一个序列并参考IEEE Std 1800-2012第 16.10 节(局部变量):
sequence seq_serial(logic signal, local logic [7:0] expected);
byte idx = 7;
(signal == expected[idx], idx--)[*8];
endsequence : seq_serial
asrt_si0x9A_so0xC6 : assert property ( @(posedge clk)
$rose(EN) |-> ##[1:3] seq_serial(SI, 8'h9A) ##[1:3] seq_serial(SO, 8'hC6) );
这相当于提供的断言,并且更具可读性。
请注意将视为变量而不是引用的local
关键字,并允许您传递常量(例如,)并仍然允许您传递网络引用。有关更多信息,请参阅IEEE Std 1800-2012第 16.8.2 节(序列声明中的局部变量形式参数)。expected
8'h9A
8'hC6
这是一个简单的测试平台来证明这个断言。我正在开车SO
,因为我没有真正的 DUT,我想演示通过和失败的场景。
bit EN, clk;
logic SI,SO;
logic [7:0] si_var, so_var;
initial forever #10ns clk++; // clock generator
default clocking cb @(posedge clk); output #1ns EN,SI,SO; endclocking : cb
initial begin : test_vector
si_var = 8'h9A;
so_var = 8'hC6;
##1 cb.EN <= 1;
##($urandom_range(2,0)); // rand delay
foreach(si_var[i]) ##1 cb.SI <= si_var[i];
##($urandom_range(2,0)); // rand delay
foreach(so_var[i]) ##1 cb.SO <= so_var[i];
##1 cb.EN <= 0;
/* Now make the assertion fail */
so_var = 8'hC7; // make fail
##3 cb.EN <= 1;
##($urandom_range(2,0)); // rand delay
foreach(si_var[i]) ##1 cb.SI <= si_var[i];
##($urandom_range(2,0)); // rand delay
foreach(so_var[i]) ##1 cb.SO <= so_var[i];
##1 cb.EN <= 0;
#10ns; // little delay before finish
$finish(2);
end : test_vector