【SystemVerilog】designでbindを使ってみよう


はじめに

皆さん、SystemVerilog使ってますか?

VerilogからVerilog2001、SystemVerilogと言語仕様は色々と拡張されて使いやすくなってきています。
しかしながらLRMを読んだだけでは実際にどう使えばお得なのか分からないものも多いですよね。

そこで今回はbindを合成に使って得をしてみようという試みです。

サンプルコード

FPGAのトップモジュールとしてtopがあったとします。

top.sv
module top (
    input  logic        CLK        , // 
    input  logic        RESET      , // 
    input  logic [7:0]  X          , // 
    input  logic [7:0]  Y          , // 
    output logic [8:0]  Q          , // 
    output logic [7:0]  DEBUG        // 
);
    add u_add (
        .CLK   (CLK   ) ,
        .RESET (RESET ) ,
        .A     (X     ) ,
        .B     (Y     ) ,
        .Q     (Q     )
    );
endmodule

DEBUG端子はその名の通りデバッグ用です。動作確認用のLEDだったり、オシロ・ロジアナ等で見れるようにピンヘッダに出したりしますね。

Quartusで合成後、RTL Viewerで確認。

デバッグ用の回路をbindで実装してみましょう。
bindはモジュールを追加するイメージになります。
追加するデバッグ用の記述をtop_debugというモジュールで記述しました。

debug.sv
module top_debug (
    input  logic        CLK        , // 
    input  logic        RESET      , // 
    input  logic [8:0]  Q_IN       , // 
    output logic        PTY_ODD      // 
);

    logic r_pty_odd;

    always_ff @(posedge CLK or posedge RESET) begin
        if(RESET)begin
            r_pty_odd <= '0;
        end else begin
            r_pty_odd <= ^Q_IN;
        end
    end
    assign PTY_ODD = r_pty_odd;
endmodule

bind top
    top_debug u_debug (
        .CLK     (CLK      ),
        .RESET   (RESET    ),
        .Q_IN    (Q        ),
        .PTY_ODD (DEBUG[0] )
    );

topモジュールにtop_debugモジュールをu_debugという名前でインスタンスします。
信号名などはtopモジュール内の信号が使用できます。
bind記述はmoduleブロックの外側でも記述が可能です。

ちゃんと追加されました!
top.svには一切手を加えておらずプロジェクトにdebug.svを追加しただけでデバッグ用回路が追加できました。

問題点

動くには動きますが…という話。

回路の追加しかできない

bindで変更や削除はできません。これで一番困るのは、bindで生成した信号出力を繋ぐ先のポートがあらかじめ必要という点です。
本来想定された使い方とは異なるため仕方ありませんが、なかなか厳しい制約です。せめてポートの追加が出来れば…
ドットによる下位階層の参照はVivadoなら可能ですがQuartusではダメ。

ツールが限られる

「bindを合成で?できらぁ!」と言ったものの、実際はなんでもいけるわけではないのでした。

ツール        バージョン 合成 備考
Quartus Prime Standard 18.1 × bind記述がsyntax errorとなる
Quartus Prime Pro 19.2 今回試したのはこちら
Vivado 2018.3.1 × bind記述は合成の対象外となる

Quartus Prime Standardは合成エンジンが完全に未対応でした。バージョンが新しければいけるかもしれませんが、望みは薄そう。
Prime ProはStratix10などの特定デバイス用のため使用シーンは限られてくる。
Vivadoは合成自体通るので認識はしているものの、そのうえで検証用記述とみなしてか全無視。オプション等で何かできるかもしれませんが、こちらも望み薄か。

microsemiとLatticeは試していませんが、ダメそう(syntax error)な予感がしますね。
もし試した方がいらっしゃったらコメントしていただけると有難いです。

結論

「できらぁ!」というか、「できるだけだぁ!」が正解ですね。
たまたま Quartus Prime Pro 19.2 で出来たので調子に乗って記事を書いたものの、他のバージョンを試したらこのざまです。

bindを使ったことがある人は恐らくほぼ全員が検証目的でしょう。
具体的に言えば「アサーション記述やファンクションカバレッジ記述をモジュールにくっつける」ですよね。

bindを合成で使用するのは人類にはまだ早すぎるようです。