目的:
ビット幅等をパラメータ化して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}} ;
例:
ビット幅をパラメータ化した例を示す。回路図
モジュールは、デフォルト 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 件のコメント:
コメントを投稿