Verilog中使用連續@posedge會是什麼現象,是否可綜合

連續@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);

但是這種寫法是可以綜合的嗎?我們驗證一下:

的確是可綜合的。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章