![]() |
![]() |
TOP > Verilog > ブロッキング代入とノンブロッキング代入 |
![]() |
![]() |
ブロッキング代入とノンブロッキング代入
ブロッキング代入「=」は、順番に実行していく代入である。例えば、
a = b + 1;
c = a + 1;
という式があった時、最初の「a = b + 1;」が評価され、その結果のaの値が次の「c = a + 1;」に使用される。
ノンブロッキング代入「<=」では、並列への代入となるので以下のような式のとき、
a <= b + 1;
c <= a + 1;
各2行は、同時(並列)実行されるので、2行目の「c <= a + 1;」は、前回のaの結果の値となる。
ブロッキング代入の例
///////////////////////////////////////////////////////////////////////////////// //TESTBENCH // テストベンチ ///////////////////////////////////////////////////////////////////////////////// module TESTBENCH; reg [3:0] INA; reg CLK, RESET; wire [3:0] XOUTA, XOUTB; STEP = 10; // クロックの定義 always #(STEP/2) CLK = ~CLK; BLOCKING BLOCKING(CLK, RESET, INA, XOUTA, XOUTB); initial begin $dumpfile("test.vcd"); $dumpvars(0, TESTBENCH); $monitor ("%t: RESET = %b, INA = %h, XOUTA = %h, XOUTB = %h", $time, RESET, INA, XOUTA, XOUTB); CLK = 0; RESET = 0; #STEP RESET = 1; INA = 0; #STEP INA = 2; #(STEP * 2); $finish; end endmodule ///////////////////////////////////////////////////////////////////////////////// //ブロッキング代入 ///////////////////////////////////////////////////////////////////////////////// module BLOCKING(CLK, RESET, INA, XOUTA, XOUTB); input CLK, RESET; input [3:0] INA; output [3:0] XOUTA, XOUTB; reg [3:0] XOUTA, XOUTB; always@(posedge CLK) begin if (~RESET) begin XOUTA = 0; XOUTB = 0; end else begin XOUTA = INA + 1; XOUTB = INA + XOUTA; end end endmodule ノンブロッキング代入の例
///////////////////////////////////////////////////////////////////////////////// //TESTBENCH // テストベンチ ///////////////////////////////////////////////////////////////////////////////// module TESTBENCH; reg [3:0] INA; reg CLK, RESET; wire [3:0] XOUTA, XOUTB; parameter STEP = 10; // クロックの定義 always #(STEP/2) CLK = ~CLK; BLOCKING BLOCKING(CLK, RESET, INA, XOUTA, XOUTB); initial begin $dumpfile("test.vcd"); $dumpvars(0, TESTBENCH); $monitor ("%t: RESET = %b, INA = %h, XOUTA = %h, XOUTB = %h", $time, RESET, INA, XOUTA, XOUTB); CLK = 0; RESET = 0; #STEP RESET = 1; INA = 0; #STEP INA = 2; #(STEP * 2); $finish; end endmodule ///////////////////////////////////////////////////////////////////////////////// //ノンブロッキング代入 ///////////////////////////////////////////////////////////////////////////////// module BLOCKING(CLK, RESET, INA, XOUTA, XOUTB); input CLK, RESET; input [3:0] INA; output [3:0] XOUTA, XOUTB; reg [3:0] XOUTA, XOUTB; always@(posedge CLK) begin if (~RESET) begin XOUTA <= 0; XOUTB <= 0; end else begin XOUTA <= INA + 1; XOUTB <= INA + XOUTA; end end endmodule |
![]() |
![]() |
Copyright 2007 ためになるホームページ All Rights Reserved. |