SystemVerilog|interfaceについて考える

Systemverilog
田中太郎
田中太郎

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について解説しました

コメント

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