2021年10月5日火曜日

Vivadoでinoutをsynthesisするときのコツ

所用でinoutのポートを持つHDL回路を作成してzyboに入れ込む必要があった。

inoutの回路の記述はセオリー通りハイインピーダンス(Hi-Z)を用いて下記のようにVerilogで記述し、ブロックデザインにモジュールとして追加し、wrapperを作成してGenerate Bitstreamまで行った。

module inout_test(
    input  wire   tx_enable,
    input  wire   tx,
output wire   rx,
inout  wire   inout_io
    );
    assign rx = tx_enable ? 1'b1 : inout_io;
    assign inout_io = tx_enable ? tx : 1'bz;
endmodule

下記のようなエラーが出るものの、Bitstream作成することができた。
[Designutils 20-1595] In entity ○○○○, connectivity of net ○○○ cannot be represented in VHDL. VHDL lacks syntax to connect the following inout terminals to a differently-named net:

ところが実際に書き込んで動作させてみると、inoutをoutとして動作させているときは問題なく動くものの、inとして動作させ外部端子から信号を与えてみてもLOWのままで変化がない。

Designutils 20-1595で検索すると、wrapperがVHDLになっているとこのエラーが出ることがあるとのことだったので確認してみたがしっかりVerilogになっている。

さらに調べてみると、下記の対処法を見つけることができた。
僕の場合は「Try to switch from 'out of context' to 'global' synthesis.」がキーポイントだった。
bdを右クリックして出てくるGenerate Output Productsをクリックし、Synthesis OptionsのGlobalを選択してGenerateする。

Globalはデザイン全体を1つのまとまりとして論理合成し、Out of context per ~はIPやブロックデザインごとに論理合成するらしい。
Globalは毎回一から合成するので遅く、Out of context per ~は変更のあったところだけ合成するから論理合成時間が速く終わるらしい。チョイ変したときに毎回膨大な時間待たされるのは大きなデメリットだが仕方がない。

上記操作の後にGenerate Bitstreamまで行ったところ、先ほどのエラーは発生しなかった。
bitファイルを書き込んで動作確認してみたところ、想定通りのinout動作をしてくれるようになりひとまず問題は解決した。

0 件のコメント:

コメントを投稿