Vivado で一部のモジュールだけの合成評価を行う
はじめに
Vivado でロジック開発をしていると、開発した特定のモジュールだけを抜き出して、リソース利用量などを調べたい時があります。
そこで、対象モジュールをトップネットにして、単独で Run Implimentation をしてみます。
しかしながら、内部モジュールは入出力ポート数が大きい時があるので、そのままターゲットのモジュールを合成しても KV260 などの一切のデバイスの IO数を超えてしまい、下記のようにエラーになってしまう事があります。
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 オプションを追加して実行してみます。
impl_1 が 100% まで流れて下記のように Post-Implementation のリソース利用量の確認が出来るようになりました。
最大周波数の評価
折角なので、最大周波数も調べてみようと思います。ISE の時代は合成時に最大周波数の推定値をレポートしてくれていた気がするのですが、Vivado では出てこないようです。
UG949 のデザインの最大周波数の評価の項を調べると
を調べると、下記のような記述があります。
今回はわざと少し無茶な数値として 500MHz(2ns) を設定して合成してみました。
WNS は -0.376 のようです。
ですので
が、理屈上の最大周波数となるようです。
(思っていたより高い周波数が出てきて驚いていますが)
おわりに
システムとして組み上げる前に、モジュールの単独評価をして見積りをしたいことは多々あるので、-mode out_of_context のようなオプションはもう少しわかりやすくしてほしい気はする(ISEの時はもっとわかりやすくIOBUFの挿入をやめるオプションがあったような・・・)
あと、は周波数評価は、レジスタリタイミングなどが影響するケースがありそうですが、UG901を見る限り、 DONT_TOUCH/MARK_DEBUG で抑制できるようですので、
(* DONT_TOUCH = "yes" *)
や
(* MARK_DEBUG = "true" *)
をうまく使って評価すると良いケースもあるかもしれません。
Discussion