目的:
ビット幅等をパラメータ化して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 件のコメント:
コメントを投稿