時間: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;
input clk;
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;
input clk;
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