1. 程式人生 > 其它 >verilog中的阻塞賦值與非阻塞賦值

verilog中的阻塞賦值與非阻塞賦值

verilog設計進階

時間:2014年5月6日星期二

主要收穫:

1.阻塞賦值與非阻塞賦值;

2.程式碼測試;

3.組合邏輯電路和時序邏輯電路。

阻塞賦值與非阻塞賦值:

1.阻塞賦值“=”(組合邏輯電路),非阻塞賦值“<=”(時序邏輯電路);

2.Verilog模組程式設計的8個原則:

(1) 時序電路建模時,用非阻塞賦值。

(2) 鎖存器電路建模時,用非阻塞賦值。

(3) 用always塊建立組合邏輯模型時,用阻塞賦值。

(4) 在同一個always塊中建立時序和組合邏輯電路時,用非阻塞賦值。

(5) 在同一個always塊中不要既用非阻塞賦值又用阻塞賦值。

(6) 不要在一個以上的always塊中為同一個變數賦值。

(7) 用$strobe系統任務來顯示用非阻塞賦值的變數值。

(8) 在賦值時不要使用#0延時。

在編寫時牢記這八個要點可以為絕大多數的Verilog使用者解決在綜合後模擬中出現的90-100% 的冒險競爭問題。

3.所謂阻塞的概念是指在同一個always塊中,其後面的賦值語句從概念上是在前一條賦值語句結束後開始賦值的。

4.非阻塞語句的執行過程是:首先計算語句塊內部所有右邊表示式(RHS)的值,然後完成對左邊暫存器變數的賦值操作。

5.在程式碼上的區別:

begin

B=A;

C=B+1;

end

上述程式碼先將A的值賦值給B,C的值是A+1;

begin

B<=A;

C<=B+1;

end

上述程式碼的最終結果是:將A賦值給了B,但是C的值是B原來的值+1。因為最先計是的是右邊的表示式。

組合邏輯電路與時序邏輯電路:

1.數位電路根據邏輯功能的不同特點,可以分成兩大類,一類叫組合邏輯電路(簡稱組合電路),另一類叫做時序邏輯電路(簡稱時序電路)。

2.組合邏輯電路在邏輯功能上的特點是任意時刻的輸出僅僅取決於該時刻的輸入,與電路原來的狀態無關。

3.時序邏輯電路在邏輯功能上的特點是任意時刻的輸出不僅取決於當時的輸入訊號,而且還取決於電路原來的狀態,或者說,還與以前的輸入有關。

Verilog程式碼:

moduleblocking(clk, a, b, c);

output [3:0] b,c;

input[3:0] a;

inputclk;

reg[3:0] b,c;

always@(posedge clk) begin

b = a;

c = b;

$display("Blocking: a = %d, b= %d, c = %d.", a, b, c);

end

endmodule

對應原理圖:


modulenon_blocking(clk, a, b, c);

output [3:0] b,c;

input[3:0] a;

inputclk;

reg[3:0] b,c;

always@(posedge clk) begin

b <= a;

c <= b;

$display("Non_Blocking: a =%d, b = %d, c = %d.", a, b, c);

end

endmodule

對應原理圖:


測試程式碼:

`timescale1ns/1ns

moduleblocking_test;

wire [3:0] b1, c1, b2, c2;

reg[3:0] a;

reg clk;

initial begin

clk = 0;

forever #50 clk = ~clk;

end

initial begin

a = 4'h3;

$display("______________________");

#100 a = 4'h7;

$display("______________________");

#100 a = 4'hf;

$display("______________________");

#100 a = 4'ha;

$display("______________________");

#100 a = 4'h2;

$display("______________________");

#100$display("______________________");

$stop;

end

non_blocking u1(clk, a, b2, c2);

blocking u2(clk,a, b1, c1);

endmodule

模擬波形圖: