はじめに
皆さん、SystemVerilog使ってますか?
VerilogからVerilog2001、SystemVerilogと言語仕様は色々と拡張されて使いやすくなってきています。
しかしながらLRMを読んだだけでは実際にどう使えばお得なのか分からないものも多いですよね。
そこで今回はbindを合成に使って得をしてみようという試みです。
サンプルコード
FPGAのトップモジュールとしてtopがあったとします。
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だったり、オシロ・ロジアナ等で見れるようにピンヘッダに出したりしますね。
デバッグ用の回路をbindで実装してみましょう。
bindはモジュールを追加するイメージになります。
追加するデバッグ用の記述をtop_debugというモジュールで記述しました。
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を合成で使用するのは人類にはまだ早すぎるようです。