モジュールとテストベンチ
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 // 単位/精度