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

Systemverilog
田中太郎
田中太郎

モニタを作成します

期待値は今回は省略して、値を標準出力するだけです

構成

DUTとテストベンチに分けて説明します

カウンタ回路

今回モニタする回路です

リセットで初期化(0)するカウンタ回路です

入力ポート

・clk:クロック

・rst_n:非同期リセット。1でカウンタ値が初期化される

出力ポート

・dout:カウンタ値を出力する

・enable:カウンタ値が奇数のとき、enableが1になる

dut.sv
module dut #(
)(
    input clk,
    input rst_n,
    output logic enable,
    output logic [3:0] dout
);
    always_ff @(posedge clk, negedge rst_n) begin
        if (!rst_n) begin
            dout <= '0;
        end
        else begin
            dout <= dout + 1'b1;
        end
    end

    assign enable = dout[0];

endmodule

テストベンチ

モニタを実装しています

説明はコード上に記載します

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

    bit enable;
    bit [3:0] dout;

    initial begin // シーケンス。モニタをONしてリセットを解除する
        fork
            monitor(); // fork/join_noneでモニタを生成。joinだと次の行に進まなくなるので、join_none
        join_none

        #20;
        rst_n = 1;
        #200;
        $finish;
    end

    // モニタのタスク。
    // foreverを使ってenableが1のときのdoutを表示する.
    // 期待値があるときは、displayのところで比較すればよい。
    task monitor;
        $display("***Start Monitor***");
        forever begin
            if (enable) begin
                $display("%d", dout);
            end
            @(posedge clk);
        end
    endtask

    // dutをインスタンス
    dut #(
    ) u_dut (
        .clk(clk),
        .rst_n(rst_n),
        .enable(enable),
        .dout(dout)
    );
endmodule

まとめ

モニタを作成してDUTの出力をチェックしました

コメント

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