
田中太郎
interfaceの使い方について考えます
サンプルコード
interfaceを使用したサンプルコードです
このあとに解説があります
sample1.sv
interface i_dut_t; // interfaceを定義
logic [1:0] data;
endinterface
module tb;
bit clk = 0;
always #5 clk = ~clk; // クロックを生成
i_dut_t i_dut(); // i_dut_t型でi_dutを宣言
assign i_dut.data = 2'b11; // dataに値を代入
task check;
$display("%d", i_dut.data); // i_dutの要素dataを出力
endtask
initial begin // シーケンス
check;
#10;
check;
#20;
$finish;
end
endmodule
// 出力
// 3
// 3
解説
interfaceは以下のように定義します
interface <インターフェース型名>;
// インターフェースの要素
endinterface
インターフェースを定義したら、宣言することで使用できます
<インターフェース型名> <インターフェース名>;
インターフェースの各要素は以下のようにアクセスできます
<インターフェース名>.<要素>
インターフェースはポートを持つことができます
interface <インターフェース型名> (
input <ポート名>
);
// インターフェースの要素
endinterface
しばしばclockingを併用して以下のように使用します
interface <インターフェース型名> (
input clk
);
// インターフェースの要素
clocking cb @(posedge clk);
// ポート名
endclocking
endinterface
clockingをしようしたときのサンプルコードも張っておきます
sample2.sv
// interfaceを定義
interface i_dut_t(
input clk
);
logic [1:0] data;
clocking cb @(posedge clk);
input data;
endclocking
endinterface
module tb;
bit clk = 0;
always #5 clk = ~clk; // クロックを生成
i_dut_t i_dut(clk); // i_dut_t型でi_dutを宣言
assign i_dut.data = 2'b11; // dataに値を代入
task check;
$display("%d", i_dut.cb.data); // clockingブロックのdataにアクセス
endtask
initial begin // シーケンス
check;
#10;
check;
#20;
$finish;
end
endmodule
// 出力
// x
// 3
まとめ
interfaceについて解説しました
コメント