田中太郎
クラスを使ってモニタを作成します
はじめに
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を使用してモニタを作成しました
コメント