LoginSignup
0
0

【SystemVerilog】テストベンチのタイムスケールについてのメモ

Posted at

モジュールとテストベンチ

systemverilogで状態遷移するモジュールとそのテストベンチを書いたので、書き方(主にタイムスケールについて)を記録しておきます。
以下のリポジトリで自作CPUを作成してます。
https://github.com/rei0515reten/Re_RISCV

stat.sv
typedef enum logic [1:0] {FETCH, DECODE, MEMORY, WRITEBACK} state_type;

module stat(input logic clk,
            input logic reset,
            output state_type out);
    state_type next_state, state;

    //組み合わせ回路
    //状態を遷移する
    always_comb begin
        case (state)
            FETCH: next_state = DECODE;
            DECODE: next_state = MEMORY;
            MEMORY: next_state = WRITEBACK;
            WRITEBACK: next_state = FETCH;
        endcase
    end

    //順序回路
    //always_ff @の()内はセンシティビティリストで@はイベントを意味する
    //非同期リセット付きフリップフロップを意味する
    //センシティビティリストにresetがないフリップフロップは同期リセット付きフリップフロップ
    always_ff @(posedge clk, posedge reset)
        if(reset) state <= FETCH;
        else state <= next_state;
    
    assign out = state;

endmodule
stat_test.sv
//タイムスケールの設定
`timescale 1ns/1ps

module stat_test();
    logic Clk,reset;
    logic[1:0] s;

    stat _stat(Clk,reset,s);
    always #5 Clk = ~Clk;      //5nsごとにクロックを切り替える

    initial begin
        reset = 1;
        Clk = 0;
        #20                    //20ns後にresetを0にする
        reset = 0;
        #500                   //500nsでシミュレーションが終了
        $finish;
    end

    initial begin
        $monitor("state=%d",s);
        $dumpfile("state.vcd");
        $dumpvars(0, stat_test);
    end


endmodule

タイムスケールについて

以下を参照。
http://zakii.la.coocan.jp/hdl/52_timescale.htm

以下の行がテストベンチ内のタイムスケールを設定している。
設定しないとデフォルトのタイムスケールが設定される。
タイムスケールはシミュレーション用に存在するものでテストベンチで使用される。

`timescale 1ns/1ps   // 単位/精度
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0