🐷

Vivado で一部のモジュールだけの合成評価を行う

2024/04/29に公開

はじめに

Vivado でロジック開発をしていると、開発した特定のモジュールだけを抜き出して、リソース利用量などを調べたい時があります。

そこで、対象モジュールをトップネットにして、単独で Run Implimentation をしてみます。

Run Implimentation

しかしながら、内部モジュールは入出力ポート数が大きい時があるので、そのままターゲットのモジュールを合成しても KV260 などの一切のデバイスの IO数を超えてしまい、下記のようにエラーになってしまう事があります。

IO Error

I/O を外して合成&インプリメントする

調べたところこちらを見つけました、。どうやら、この問題を回避するには -mode out_of_context オプションをつければよいようです。

最終的に周波数評価で使ったコードは下記のような 4096:1 マルチプレクサと言う大きなものを実験してみました。

下記のような 4096:1 マルチプレクサと言う巨大なものを作って実験してみます。


`timescale 1ns / 1ps
`default_nettype none

module multiplexer
        #(
            parameter int SEL_BITS  = 12,
            parameter int DATA_BITS = 2**SEL_BITS
        )
        (
            input   var logic                   reset,
            input   var logic                   clk  ,
            input   var logic                   cke  ,

            input   var logic   [SEL_BITS-1:0]  sel  ,
            input   var logic   [DATA_BITS-1:0] din  ,
            output  var logic   [0:0]           dout  
        );

    logic   [DATA_BITS-1:0] reg_din;
    always_ff @(posedge clk) begin
        if ( reset ) begin
            reg_din <= '0;
            dout    <= '0;
        end
        else if ( cke ) begin
            reg_din <= din;
            dout    <= reg_din[sel];
        end
    end

endmodule

`default_nettype wire

下記のように -mode out_of_context オプションを追加して実行してみます。

mode out_of_context

impl_1 が 100% まで流れて下記のように Post-Implementation のリソース利用量の確認が出来るようになりました。

result

最大周波数の評価

折角なので、最大周波数も調べてみようと思います。ISE の時代は合成時に最大周波数の推定値をレポートしてくれていた気がするのですが、Vivado では出てこないようです。

UG949 のデザインの最大周波数の評価の項を調べると

を調べると、下記のような記述があります。

UG949

今回はわざと少し無茶な数値として 500MHz(2ns) を設定して合成してみました。

constrain

WNS は -0.376 のようです。

ですので

1000 / (2.0 - (-0.376)) = 420 [MHz]

が、理屈上の最大周波数となるようです。

(思っていたより高い周波数が出てきて驚いていますが)

おわりに

システムとして組み上げる前に、モジュールの単独評価をして見積りをしたいことは多々あるので、-mode out_of_context のようなオプションはもう少しわかりやすくしてほしい気はする(ISEの時はもっとわかりやすくIOBUFの挿入をやめるオプションがあったような・・・)

あと、は周波数評価は、レジスタリタイミングなどが影響するケースがありそうですが、UG901を見る限り、 DONT_TOUCH/MARK_DEBUG で抑制できるようですので、

(* DONT_TOUCH = "yes" *)

(* MARK_DEBUG = "true" *)

をうまく使って評価すると良いケースもあるかもしれません。

GitHubで編集を提案

Discussion