ためになるホームページ お問い合わせ




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.