|
ブロッキング代入とノンブロッキング代入
ブロッキング代入「=」は、順番に実行していく代入である。例えば、
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
|