連續@posedge是可以綜合,如果後面是阻塞賦值,會出現以下現象:
這部分是源碼中的執行部分:
@(posedge clk) b = a;
@(posedge clk) c = b;
$display("blocking2 a = %b b = %b c = %b",a,b,c);
@(posedge clk)
begin
c = b;
b = a;
$display("blocking1 a = %b b = %b c = %b",a,b,c);
end
這部分是測試代碼的主體:
initial
begin
clk = 1'b1;
a = 4'b0;
sel = 2'b0;
repeat(15)
begin
#6
sel = sel + 2'b1;
a = 4'd0;
#6
a = 4'd6;
end
end
always #1 clk = ~clk;
現象如下:
可以看到,其他的單個@posedge的都是輸出6次,兩個@posedge連着用,後面又跟的是阻塞賦值,就導致本來該出現6次的$display只出現了6/2次,更改位三連@就只剩6/3 = 2次了。是由於第一次阻塞賦值必須完成之後才能出第一個@,這時候邊沿已經過去了,然後還得接着等第二個邊沿,就在第二個@處等着,所以對於 $display,就錯過了一個沿,所以就少了半,兩個輪迴就是三次。
那如果是三個@posedge是不是就應該只顯示兩次了呢,是的:
@(posedge clk) b = a;
@(posedge clk) c = b;
@(posedge clk) $display("blocking2 a = %b b = %b c = %b",a,b,c);
但是這種寫法是可以綜合的嗎?我們驗證一下:
的確是可綜合的。