1. 程式人生 > 實用技巧 >blocking and nonblocking

blocking and nonblocking

 1 module    sort3
 2 (
 3     data_in1,data_in2,data_in3,
 4     data_out1,data_out2,data_out3,
 5     clk,reset
 6 );
 7 
 8 output    [7:0]        data_out1,data_out2,data_out3;
 9 input        [7:0]        data_in1,data_in2,data_in3;
10 input                    clk,reset;
11 
12 reg        [7:0]        data_out1,data_out2,data_out3;
13 reg [7:0] data_tempt1,data_tempt2,data_tempt3; 14 15 always @ (posedge clk) 16 if(!reset) 17 begin 18 data_out1 <= 1'b0; 19 data_out2 <= 1'b0; 20 data_out3 <= 1'b0; 21 end 22 else 23 begin 24 {data_tempt1,data_tempt2,data_tempt3}={data_in1,data_in2,data_in3};
25 sort2(data_tempt1,data_tempt2); 26 sort2(data_tempt1,data_tempt3); 27 sort2(data_tempt2,data_tempt3); 28 {data_out1,data_out2,data_out3}={data_tempt1,data_tempt2,data_tempt3}; 29 end 30 31 task sort2; 32 inout [7:0] x,y;
33 reg [7:0] temp; 34 if(x > y) 35 begin 36 temp = x; 37 x = y; //因為需要做資料交換,所以用blocking賦值 38 y = temp; 39 end 40 endtask 41 42 endmodule

數字排序,用到了blocking,模擬結果正確。

 1 module    sort3
 2 (
 3     data_in1,data_in2,data_in3,
 4     data_out1,data_out2,data_out3,
 5     clk,reset
 6 );
 7 
 8 output    [7:0]        data_out1,data_out2,data_out3;
 9 input        [7:0]        data_in1,data_in2,data_in3;
10 input                    clk,reset;
11 
12 reg        [7:0]        data_out1,data_out2,data_out3;
13 reg        [7:0]        data_tempt1,data_tempt2,data_tempt3;
14 
15 always @ (posedge clk)
16     if(!reset)
17         begin
18             data_out1    <=    1'b0;
19             data_out2    <=    1'b0;
20             data_out3    <=    1'b0;
21         end
22     else
23         begin
24             {data_tempt1,data_tempt2,data_tempt3}={data_in1,data_in2,data_in3};
25             sort2(data_tempt1,data_tempt2);
26             sort2(data_tempt1,data_tempt3);
27             sort2(data_tempt2,data_tempt3);
28             {data_out1,data_out2,data_out3}={data_tempt1,data_tempt2,data_tempt3};
29         end
30         
31 task    sort2;
32     inout        [7:0]        x,y;
33     reg        [7:0]        temp;
34     if(x > y)
35         begin
36         temp        <=    x;
37             x        <=    y;                    //因為需要做資料交換,所以用blocking賦值
38             y        <=    temp;
39         end
40 endtask
41 
42 endmodule

nonblocking模擬結果錯誤。

在編寫時牢記這八個要點可以為絕大多數的
Verilog 使用者解決在綜合後模擬中出現的 90-100% 的冒險競爭問題。
1) 時序電路建模時,用非阻塞賦值。
2) 鎖存器電路建模時,用非阻塞賦值。
3) 用 always 塊建立組合邏輯模型時,用阻塞賦值。
4) 在同一個 always 塊中建立時序和組合邏輯電路時,用非阻塞賦值。
5) 在同一個 always 塊中不要既用非阻塞賦值又用阻塞賦值。
6) 不要在一個以上的 always 塊中為同一個變數賦值。
7) 用$strobe 系統任務來顯示用非阻塞賦值的變數值
8) 在賦值時不要使用 #0 延遲