2020年4月18日土曜日

verilog : module のパラメタライズ

目的:

ビット幅等をパラメータ化してmoduleを再利用しやすいようにする。

構造:


module側

module <モジュール名> #(
 パラメータリスト
) (
 ポートリスト
) ;
 パラメータ宣言 (PARAMETER)
 ネット宣言 (wire, reg)
 論理記述
  ( assign, always, module接続, 等)
endmodule

 呼び出し側


 <モジュール名>  #(
 パラメータリスト
) <インスタンス名> (
 ポートリスト
) ;

呼び出し側の #( パラメータリスト) は省略可能。
省略時は、モジュールで設定したデフォルト値を使用。
 

パラメータ化された reg への固定値代入


固定値の代入は、連接を使用して以下の様に書ける。
parameter  WID = 8 ;
reg [WID-1:0]  data ;
( all '1' を代入 )
 data <= {WID{1'b1}} ;
( 下位 4bit に 0x7 を大入)
 data <= {{(WID-4){1'b0}}, {4'h7}} ;

例:

ビット幅をパラメータ化した例を示す。
回路図
 verilog (モジュール)
モジュールは、デフォルト 4bit 幅で記述
// -----------------------------------------------------
//   Sample module
//
//   Module Name : test_md1
//   Version     : 0.00
// -----------------------------------------------------
 
module test_md1 #(                      // Module name : test
  parameter BIT_WIDTH = 4               // parameter list
) (                                     //
  clr,                                  // port list
  clk,
  enable,
  set,
  data,
  out_dt
) ;
 
// port declaration ----------------
input                  clr ;
input                  clk ;
input                  enable ;
input                  set ;
input  [BIT_WIDTH-1:0] data ;
output [BIT_WIDTH-1:0] out_dt ;
 
// parameter declaration -----------
parameter DLY = 1 ;
 
// internal signal declaration -----
wire                 set_enable ;

reg  [BIT_WIDTH-1:0] lt_data ;
 
// logical description -------------
assign set_enable = enable & set ;
 
always @(posedge clk or posedge clr)
  if (clr) 
    lt_data  <= #DLY  {BIT_WIDTH{1'b0}} ;
//  lt_data  <= #DLY {{(BIT_WIDTH-4){1'b0}},{4'h7}} ;
else if (set_enable)
    lt_data  <= #DLY  data ;
 
assign out_dt = lt_data ;
 
endmodule

 verilog (上位階層)
// -----------------------------------------------------
//   Sample test
//
//   Module Name : test
//   Version     : 0.00
// -----------------------------------------------------
 
module test (
  clr,
  clk,
  enable,
  set,
  data,
  out_dt
) ;

// port declaration ----------------
input        clr ;
input        clk ;
input        enable ;
input        set ;
input  [7:0] data ;
output [7:0] out_dt ;
 
// testbench logic -------------------

test_md1 #(
  .BIT_WIDTH (8) 
)i_test_md1(
  .clr    (clr),
  .clk    (clk),
  .enable (enable),
  .set    (set),
  .data   (data),
  .out_dt (out_dt)
) ;

endmodule

 verilog (テストベンチ, 呼び出し側)
// ----------------------------------------------------------
//   test bench
//
//     for test.v
// ----------------------------------------------------------

`timescale 1ns / 1ps

module testbench ;

// testbench logic -------------------
reg   clr;
reg   clk;
reg   [7:0] in_data ;
reg   enable ;
reg   set ;
wire  [7:0] out_data ;

test  i_test(
  .clr    (clr),
  .clk    (clk),
  .enable (enable),
  .set    (set),
  .data   (in_data),
  .out_dt (out_data)
) ;

initial begin
  clk = 0 ;
  clr = 1 ;
  #10 clr = 0 ;
  forever begin
    #10 clk = ~clk ;
  end
end

// scenario --------------------------
initial begin
  $dumpfile("tb.vcd");
  $dumpvars(0,testbench) ;

  enable  = 1'b0 ;
  set     = 1'b0 ;
  in_data = 8'd0 ;

  #200 enable  = 1'b1 ;
       in_data = 8'h55 ;
  #101 set     = 1'b1 ;
  #20  set     = 1'b0 ; 
  #100 enable  = 1'b0 ;
       in_data = 8'haa ;
  #101 set     = 1'b1 ;
  #20  set     = 1'b0 ; 
  #200 ;
  $finish;
  end

endmodule

シミュレーション結果




0 件のコメント:

コメントを投稿