SystemVerilog|parameterで型を上書きする

Systemverilog
田中太郎
田中太郎

parameterでビット幅や定数を上位階層で変更するのは一般的ですが

データ型も変更できます

サンプルコード

まずはparameterを上書きしないでみます

module tb;
    bit clk = 0;
    always #5 clk = ~clk; // クロックを生成
    initial #10 $finish;

    // dutをインスタンス
    dut #(
        // .DTYPE(byte signed)
    ) i_dut(
        .clk(clk),
        .dout(8'b10000000) // dutのDTYPEがunsignedなら128, signedなら-128
    );
endmodule
module dut #(
    parameter type DTYPE = byte unsigned
)(
    input clk,
    input DTYPE dout
);
    always @(posedge clk)
        $display("%d", dout); // 128を出力
endmodule

dutのDTYPEが上書きされていないので、doutはbyte unsigned型で128が出力されます

次に、parameter DTYPEを上書きします

module tb;
    bit clk = 0;
    always #5 clk = ~clk; // クロックを生成
    initial #10 $finish;

    // dutをインスタンス
    dut #(
        .DTYPE(byte signed)
    ) i_dut(
        .clk(clk),
        .dout(8'b10000000) // dutのDTYPEがunsignedなら128, signedなら-128
    );
endmodule
module dut #(
    parameter type DTYPE = byte unsigned
)(
    input clk,
    input DTYPE dout
);
    always @(posedge clk)
        $display("%d", dout); // -128を出力
endmodule

dutのDTYPEが上書きされたので、doutはbyte signed型で-128が出力されます

解説

データ型のparameterは以下のように宣言できます

module <module名> #(
    parameter type <データ型名> = <データ型>
)(
    // ポート宣言
);

まとめ

parameterで型を変更しました

コメント

タイトルとURLをコピーしました