SystemVerilog Interfaceで回路を作成する 内部回路

Systemverilog

はじめに

Interfaceブロックの中に回路を作成してみます。

サンプルコード

dut_if.sv

Interfaceです。validがHighのときのdinが有効データになります。

interface dut_if#(
    parameter BW = 2
)(
    input clk,
    input rst_n,
    input valid,
    input [BW-1:0] din
);
    logic [BW-1:0] dout;
    always_ff @(posedge clk, negedge rst_n) begin
        if (!rst_n) begin
            dout <= '0;
        end
        else begin
            if (valid) begin
                dout <= din;
            end
        end
    end
endinterface
dut.sv

dinを反転して出力します。

module dut#(
    parameter BW = 2
)(
    input clk,
    input rst_n,
    input [BW-1:0] din,
    output logic [BW-1:0] dout
);
    always_ff @(posedge clk, negedge rst_n) begin
        if (!rst_n) begin
            dout <= '0;
        end
        else begin
            dout <= ~din;
        end
    end
endmodule
tb.sv
module top;
    bit clk = 0;
    always #5 clk = ~clk;  // クロック生成
    bit rst_n = 0;  // リセット生成
    initial begin
        #10 rst_n = 1;
        #50;
        $finish;
    end

    // dutのパラメータとか結線とか
    localparam BW = 2;
    bit valid = 1;
    bit [BW-1:0] din;
    bit [BW-1:0] dout;
    always #10 din <= din + 1'b1; // 入力データ生成

    // DUTの出力を表示
    always @(posedge clk)
        $display("%b", dout);

    dut_if#(
        .BW(BW)
    ) i_dut_if(
        .clk(clk),
        .rst_n(rst_n),
        .valid(valid),
        .din(din)
    );

    dut#(
        .BW(BW)
    ) i_dut(
        .clk(clk),
        .rst_n(rst_n),
        .din(i_dut_if.dout),
        .dout(dout)
    );
endmodule
出力
00
00
11
10
01
00

まとめ

Interfaceブロックに回路を作成しました。

コメント

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