SystemVerilog|カウンタ回路を作成する

Systemverilog
田中太郎
田中太郎

3ビットカウンタを作成します

仕様

リセットで初期化して1クロックごとに1カウントアップします

サンプルコード

サンプルコードです

sample.sv
module sample #(
      parameter BW = 3
)(
    input clk,
    input rst_n,
    output logic [BW-1:0] cnt
);
    always_ff @(posedge clk, negedge rst_n) begin
        if (!rst_n) begin  // リセットが0で初期化
            cnt <= '0;
        end
        else begin // クロックの立ち上がりで+1
            cnt <= cnt + 1'b1;
        end
    end
endmodule

動作確認する

テストベンチを作成して動作確認します

tb.sv
module tb;
    initial begin // 波形を取得します
        $dumpfile("wave.vcd");
        $dumpvars(0, tb);
    end

    bit clk = 0;
    always #5 clk = ~clk; // クロックを生成します

    bit rst_n = 0;
    initial begin // リセットを解除します
        #20;
        rst_n = 1;
        #100;
        $finish;
    end

    logic [3:0] cnt;
    sample #( // カウンタ回路をインスタンスします
    ) u_sample(
        .clk(clk),
        .rst_n(rst_n),
        .cnt(cnt)
    );

    // リセットが1でクロックが立ち上がったときのカウンタ回路の出力を表示します
    always_ff @(posedge clk iff rst_n) $display("%d", cnt);

endmodule
出力

$displayで表示する標準出力です

0
1
2
3
4
5
6
7
0
1
波形

まとめ

3ビットカウンタを作成しました

コメント

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