0
我想寫一個斷言,只有當一個信號在'clk'的上升沿轉換時纔會觸發。我寫了下面的代碼來測試我的想法Systemverilog assertion來檢查壞信號轉換
module test();
bit clk, clkb;
int d;
assign clkb = ~clk;
initial begin
clk = 0;
forever #100 clk = ~clk;
end
initial begin
d = 10;
#150 d = 20;
end
sva_d_chgd: assert property (@(posedge clk) $stable(d,@(clkb)))
else $error($psprintf("err: time = %0d, clk = %b, d = %0d", $time, clk, d));
always @ (d or clk) begin
$display("time = %0d, clk = %b, d = %0d", $time, clk, d);
if ($time > 200) $finish;
end
endmodule
上面的代碼返回VCS以下的輸出:
time = 0, clk = 0, d = 10
time = 100, clk = 1, d = 10
"test.vs", 18: test.sva_d_chgd: started at 100s failed at 100s
Offending '$stable(d, @(clkb))'
Error: "test.vs", 18: test.sva_d_chgd: at time 100
err: time = 100, clk = 1, d = 10
time = 150, clk = 1, d = 20
time = 200, clk = 0, d = 20
time = 300, clk = 1, d = 20
$finish called from file "test.vs", line 23.
$finish at simulation time 300
爲什麼在時間100斷言火的時候「d」保持穩定,直到時間150?
感謝您指出重置問題,但爲什麼斷言仍不正確?在300時刻,d仍然是20的值,那爲什麼斷言是火呢? – user2400361
你正在評估你在每個posedge clk的主張。在300ns(posedge clk),「d」在250ns變化,這在clkb的200ns和300ns邊緣之間,所以你的斷言被評估爲假。合理? – Ciano
是的,它的確如此。我誤解了穩定的工作 – user2400361