SystemVerilog|classでモニタを作成する

Systemverilog
田中太郎
田中太郎

クラスを使ってモニタを作成します

はじめに

classでモニタを作成するとextendsで継承できるので流用性が高くなります

今回はベースとなるシンプルなモニタクラスを作成します

構成

インターフェース、モニタ、テストベンチから構成されています

interface.sv

clkとdataの要素を持つinterface, sample_tを定義します

interface sample_t;
    logic clk;
    logic [1:0] data;
endinterface
monitor.sv

startタスクを実行すると、1クロックごとにインターフェースで渡したdataを出力するモニタです

// インターフェースをクラスのパラメータタイプで渡します
class monitor #(parameter type dut_if_t = virtual dut_if_t);
    dut_if_t dut_if;

    function new(dut_if_t dut_if_); // 初期化でインターフェースを渡します
        dut_if = dut_if_;
    endfunction

    task start; // データを出力
        forever begin
            @(posedge dut_if.clk);
            $display("%d", dut_if.data);
        end
    endtask
endclass
tb.sv

テストベンチです

作成したsample_t型のインターフェース、dut_ifを宣言してclk、dataに値を入れます

monitorにパラメータタイプでsample_tを渡してモニタクラスaを宣言します

module tb;
    bit clk = 0;
    bit rst_n = 0;
    always #5 clk = ~clk; // クロックを生成

    sample_t dut_if(); // dut_ifを宣言

    assign dut_if.clk = clk;
    always @(posedge clk, negedge rst_n) begin // データを生成
        if (!rst_n) begin
            dut_if.data = '0;
        end
        else begin
            dut_if.data = dut_if.data + 1'b1;
        end
    end

    monitor #(virtual sample_t) a; // モニタクラスを宣言

    initial begin
        a = new(dut_if); // モニタを初期化
        #10;
        rst_n = 1;
        fork
            a.start(); // fork/join_noneでモニタ開始
        join_none
        #50;
        $finish;
    end
endmodule
出力
0
1
2
3
0

まとめ

classを使用してモニタを作成しました

コメント

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