01signal.com

Quartus: レジスタを I/O セルにパッキングする

私は、I/O タイミングを扱うとき、すべてのレジスタを I/O セルに入れるようにするのを好みます。少なくとも、タイミングが重要になる場合には、ですが。

Quartus では、I/O レジスタのパッキングはデフォルトではないようです。いずれにせよ、ここでは面倒くさがりな人向けのレシピを紹介します。

この投稿の以前のバージョンでは、すべての I/O に対するタイミングチェックを無効にすることを提案しました。これにより、インプリメンテーション中の制約なしパス (unconstrained path) に関する警告が抑えられ、特に Quartus のレポートペインの「TimeQuest Timing Analyzer」セクションが赤くなるのを防げます。

set_false_path -from [get_ports]
set_false_path -to [get_ports]

しかし、これはあまり良い考えではないことがわかりました。特に入力ポートについてはそうです。これについては後で詳しく説明します。

それでも、フィッターにレジスタを I/O ブロックへ配置させなければなりません。QSF には次のように追加します。

set_instance_assignment -name FAST_OUTPUT_REGISTER ON -to *
set_instance_assignment -name FAST_INPUT_REGISTER ON -to *
set_instance_assignment -name FAST_OUTPUT_ENABLE_REGISTER ON -to *

すべてのレジスタに例外なくこれらの割り当てを行うのはやや乱暴ですが、目的は果たせます。フィッターは、これらの制約を適用できなかった I/O エレメントについて警告を出しますが、これは実際には良いことです。

うまくいったかどうかを確認するには、フィッターレポートの「Resource Section」を参照してください (Quartus のレポートペインにあるかもしれません)。そして「Input Registers」など、該当する項目を探します。

この違いは、I/O セルを含むパス (path) のタイミングレポートにはっきり現れます。たとえば、I/O レジスタを含む次のパスと比べてみましょう。

+----------------------------------------------------------------------------------+
; Data Arrival Path                                                                ;
+---------+---------+----+------+--------+-----------------------+-----------------+
; Total   ; Incr    ; RF ; Type ; Fanout ; Location              ; Element         ;
+---------+---------+----+------+--------+-----------------------+-----------------+
; 2.918   ; 2.918   ;    ;      ;        ;                       ; data path       ;
;   0.000 ;   0.000 ;    ;      ; 1      ; DDIOOUTCELL_X3_Y0_N32 ; rst             ;
;   0.465 ;   0.465 ; RR ; CELL ; 1      ; DDIOOUTCELL_X3_Y0_N32 ; rst|q           ;
;   0.465 ;   0.000 ; RR ; IC   ; 1      ; IOOBUF_X3_Y0_N30      ; RESETB~output|i ;
;   2.918 ;   2.453 ; RR ; CELL ; 1      ; IOOBUF_X3_Y0_N30      ; RESETB~output|o ;
;   2.918 ;   0.000 ; RR ; CELL ; 0      ; PIN_P3                ; RESETB          ;
+---------+---------+----+------+--------+-----------------------+-----------------+

DDIOOUTCELL エレメントと、レジスタから IOOBUF までの配線の増分がゼロであることに注目してください。

比較のために、I/O レジスタが適用されなかったパスの例を示します (ロジックの関係で適用できませんでした)。

+--------------------------------------------------------------------------------+
; Data Arrival Path                                                              ;
+---------+---------+----+------+--------+-----------------+---------------------+
; Total   ; Incr    ; RF ; Type ; Fanout ; Location        ; Element             ;
+---------+---------+----+------+--------+-----------------+---------------------+
; 8.284   ; 8.284   ;    ;      ;        ;                 ; data path           ;
;   0.000 ;   0.000 ;    ;      ; 1      ; FF_X3_Y0_N17    ; Dir_flop_sig        ;
;   0.496 ;   0.496 ; RR ; CELL ; 8      ; FF_X3_Y0_N17    ; Dir_flop_sig|q      ;
;   2.153 ;   1.657 ; RR ; IC   ; 1      ; IOOBUF_X3_Y0_N9 ; DATA[7]~output|oe   ;
;   8.284 ;   6.131 ; RF ; CELL ; 1      ; IOOBUF_X3_Y0_N9 ; DATA[7]~output|o    ;
;   8.284 ;   0.000 ; FF ; CELL ; 1      ; PIN_T3          ; DATA[7]             ;
+---------+---------+----+------+--------+-----------------+---------------------+

ここでは、汎用フリップフロップが信号を生成しているため、配線遅延が 1.657 ns に達しているのがわかります。主な問題は、この配線遅延がインプリメンテーションごとに異なることです。つまり、基板にシグナルインテグリティの問題がある場合、FPGA の設計バージョンによって問題が修正されたり再発したりするように見えるため、FPGA のせいにされるかもしれません。

タイミング制約

入力ポートと出力ポートの両方に、I/O レジスタを最大限活用しなければ満たせないような、厳しいタイミング制約 (timing constraints) を設定すべきです。これにより、意図したレジスタパッキングがうまくいかなかった場合にタイミング違反として検出されるだけでなく、次に説明するように、入力からレジスタまでのタイミングを最小限に抑えるためにも必要です。

以下の議論は、レジスタを駆動するクロックが外部クロックと直接関係している場合 (たとえばクロックを整数倍する PLL を使う場合) にのみ当てはまります。レジスタを駆動するクロックが外部クロックと実質的に無関係な場合は、状況はかなり複雑になります。この記事で論じているとおりです。

この問題を示すために、次の Verilog コードを考えてみましょう。

module top
  (
   input        clk,
   input        in,
   output reg   out
   );

   reg 		in_d, in_d2;
   wire  	pll_clk;

   always @(posedge pll_clk)
     begin
	in_d <= in;
	in_d2 <= in_d;
	out <= in_d2;
     end

  /* Here comes an instantiation of a phase-compensating PLL, which
     doesn't change the frequency */
endmodule

また、SDC ファイルには次の制約があるとします。

create_clock -name main_clk -period 10 -waveform { 0 5 } [get_ports {clk}]

derive_pll_clocks
derive_clock_uncertainty

set_input_delay -clock main_clk -max 8.5 [get_ports in*]
set_input_delay -clock main_clk -min 0 [get_ports in*]

この記事で説明したように、set_input_delay は、信号源である外部デバイスのクロックから出力が有効なロジック状態になるまでの最大遅延です。クロックの周期は 10 ns に設定されているので、遅延制約を 8.5 ns にすると、次のクロックが到着する (10 ns) までの時間は 1.5 ns になります。言い換えれば、FPGA のピンにおけるセットアップ時間 (setup time) が 1.5 ns を超えてはならないという制約です。

この目的には、set_max_delay も使用できることに注意してください (場合によってはそれが唯一の方法です)。これについてはこの記事で説明しています。

これを (上に示した FAST_INPUT_REGISTER ON という QSF 割り当てとともに) コンパイルすると、タイミングレポートに次の区分が現れます。

+----------------------------------------------------------------------------------+
; Data Arrival Path                                                                ;
+---------+---------+----+------+--------+-------------------+---------------------+
; Total   ; Incr    ; RF ; Type ; Fanout ; Location          ; Element             ;
+---------+---------+----+------+--------+-------------------+---------------------+
; 0.000   ; 0.000   ;    ;      ;        ;                   ; launch edge time    ;
; 0.000   ; 0.000   ;    ;      ;        ;                   ; clock path          ;
;   0.000 ;   0.000 ; R  ;      ;        ;                   ; clock network delay ;
; 8.500   ; 8.500   ; F  ; iExt ; 1      ; PIN_F2            ; in                  ;
; 9.550   ; 1.050   ;    ;      ;        ;                   ; data path           ;
;   8.500 ;   0.000 ; FF ; IC   ; 1      ; IOIBUF_X0_Y22_N15 ; in~input|i          ;
;   9.308 ;   0.808 ; FF ; CELL ; 1      ; IOIBUF_X0_Y22_N15 ; in~input|o          ;
;   9.308 ;   0.000 ; FF ; IC   ; 1      ; FF_X0_Y22_N17     ; in_d|d              ;
;   9.550 ;   0.242 ; FF ; CELL ; 1      ; FF_X0_Y22_N17     ; in_d                ;
+---------+---------+----+------+--------+-------------------+---------------------+

出力レジスタの場合と異なり、リストの中に「DDIOINCELL」というタイプのフリップフロップはありません。その代わりに、普通のフリップフロップのように見えるものがあります。ただし、このフリップフロップに至る配線の遅延がゼロ (赤字で示されています) であることに注目してください。これは、フリップフロップと入力バッファが一体化していることをはっきり示しています。

この入力に関するデータシートのレポートは次のとおりです。

+---------------------------------------------------------------------------------------------------+
; Setup Times                                                                                       ;
+-----------+------------+-------+-------+------------+---------------------------------------------+
; Data Port ; Clock Port ; Rise  ; Fall  ; Clock Edge ; Clock Reference                             ;
+-----------+------------+-------+-------+------------+---------------------------------------------+
; in        ; main_clk   ; 1.282 ; 1.461 ; Rise       ; altpll_component|auto_generated|pll1|clk[0] ;
+-----------+------------+-------+-------+------------+---------------------------------------------+

+-----------------------------------------------------------------------------------------------------+
; Hold Times                                                                                          ;
+-----------+------------+--------+--------+------------+---------------------------------------------+
; Data Port ; Clock Port ; Rise   ; Fall   ; Clock Edge ; Clock Reference                             ;
+-----------+------------+--------+--------+------------+---------------------------------------------+
; in        ; main_clk   ; -0.683 ; -0.862 ; Rise       ; altpll_component|auto_generated|pll1|clk[0] ;
+-----------+------------+--------+--------+------------+---------------------------------------------+

要件どおり、FPGA 側で必要なセットアップ時間 (setup time) は、制約で設定された 1.5 ns という制限を下回っています。

次に、入力セットアップ遅延を 2 ns 緩めて、他の設定はすべてそのままにして、コンパイルをやり直してみましょう。

set_input_delay -clock main_clk -max 6.5 [get_ports in*]
set_input_delay -clock main_clk -min 0 [get_ports in*]

すると、タイミングレポートの当該区分は次のようになります。

+----------------------------------------------------------------------------------+
; Data Arrival Path                                                                ;
+---------+---------+----+------+--------+-------------------+---------------------+
; Total   ; Incr    ; RF ; Type ; Fanout ; Location          ; Element             ;
+---------+---------+----+------+--------+-------------------+---------------------+
; 0.000   ; 0.000   ;    ;      ;        ;                   ; launch edge time    ;
; 0.000   ; 0.000   ;    ;      ;        ;                   ; clock path          ;
;   0.000 ;   0.000 ; R  ;      ;        ;                   ; clock network delay ;
; 6.500   ; 6.500   ; F  ; iExt ; 1      ; PIN_F2            ; in                  ;
; 8.612   ; 2.112   ;    ;      ;        ;                   ; data path           ;
;   6.500 ;   0.000 ; FF ; IC   ; 1      ; IOIBUF_X0_Y22_N15 ; in~input|i          ;
;   7.308 ;   0.808 ; FF ; CELL ; 1      ; IOIBUF_X0_Y22_N15 ; in~input|o          ;
;   8.370 ;   1.062 ; FF ; IC   ; 1      ; FF_X0_Y22_N17     ; in_d|d              ;
;   8.612 ;   0.242 ; FF ; CELL ; 1      ; FF_X0_Y22_N17     ; in_d                ;
+---------+---------+----+------+--------+-------------------+---------------------+

えっ?配線 (interconnect) の遅延が突然 1.062 ns に増えた?!レジスタの配置は変わっていないので、in_d が I/O レジスタであることは間違いありません。では、この遅延はどこから来たのでしょうか?

この謎を解くには、設計をもう少し詳しく調べる必要があります。フルコンパイルの後、Tools > Netlist Viewers > Technology Map Viewer (Post-Fitting) を選ぶと、次のようなダイアグラムが表示されます (下にその一部を示します。クリックで拡大)。

Design diagram

in_d (そのレジスタ) を右クリックし、Locate Node > Locate in Resource Property Editor を選ぶと、次のように表示されます (クリックで拡大)。

Property editor view

この図の右側 (上の図にはありませんが) には、プロパティ「Input Pin to Input Register Delay」が 2 に設定されています。これが遅延の原因です。制約を緩める前は、この値は 0 でした。ここからすぐに得られる教訓は次のとおりです。

セットアップ制約を、テクノロジで達成可能な最良の値に設定していないと、Quartus はその制約の余裕を利用して遅延を追加することがあります。

でも、なぜなんだ、Quartus?

Quartus が入力パッドとレジスタの間にこの遅延を入れるのはなぜか、不思議に思うかもしれません。できるだけ早くサンプリング (sampling) することが目的ではなかったのか?その答えを見るために、更新されたデータシートのレポートを見てみましょう。

---------------------+
; Data Port ; Clock Port ; Rise  ; Fall  ; Clock Edge ; Clock Reference                             ;
+-----------+------------+-------+-------+------------+---------------------------------------------+
; in        ; main_clk   ; 2.205 ; 2.523 ; Rise       ; altpll_component|auto_generated|pll1|clk[0] ;
+-----------+------------+-------+-------+------------+---------------------------------------------+

+-----------------------------------------------------------------------------------------------------+
; Hold Times                                                                                          ;
+-----------+------------+--------+--------+------------+---------------------------------------------+
; Data Port ; Clock Port ; Rise   ; Fall   ; Clock Edge ; Clock Reference                             ;
+-----------+------------+--------+--------+------------+---------------------------------------------+
; in        ; main_clk   ; -1.570 ; -1.882 ; Rise       ; altpll_component|auto_generated|pll1|clk[0] ;
+-----------+------------+--------+--------+------------+---------------------------------------------+

遅延制約から 2 ns を減らしたことを思い出してください。つまり、許容される最大セットアップ時間 (setup time) が 1.5 ns から 3.5 ns に増えました。この要件は、ほぼ 1 ns のスラック (slack) を残して満たされていることが簡単にわかります。

つまり Quartus は、こう言っているようなものです。「セットアップ要件は 2 ns の余裕をもって簡単に満たせる。ならばセットアップ時間 (setup time) に 1 ns、ホールド時間 (hold time) の要件 (0 ns) に 1 ns を上乗せしよう。」実際、この遅延によって 1.062 ns が追加されたことで、ホールド時間は -0.683 ns から -1.570 ns に改善されました (差が正確でないことをとやかく言わないでください)。

要するに、Quartus はセットアップとホールドの両方のマージンを広げて、入力をジッタ (jitter) に対してより堅牢にしたわけです。これはかなり合理的なことですが、多くの場合、望まれたり期待されたりする動作ではありません。

結論:入力からレジスタまでの遅延を絶対的に最小にしたい場合は、わざと失敗する遅延制約でコンパイルし、その失敗が解消されるぎりぎりまで制約を緩めます。そうすれば、Quartus がより良いホールド時間を得るために入力遅延を追加してタイミングを「改善」しようとすることはなくなります。

DDR プリミティブを使う

Intel の FPGA には、I/O セルの内部またはその近くに、出力の生成と入力のサンプリングを 2 倍のクロックレートで行うための専用ロジックがあります。このトピックの詳細は、該当するユーザーガイド ug_altddio.pdf に記載されています。DDR プリミティブをインスタンシエーション (instantiation) する (または ALTDDIO_BIDIR メガファンクションを使う) のは、ツールにレジスタを I/O セルへ配置させるための魅力的な方法です。しかし、必ずしも良い方法とは限りません。

たとえば、次のようなインスタンシエーションです。

altddio_bidir ioddr
 (
 .padio(pin),
 .aclr (1'b0),
 .datain_h(datain_h),
 .datain_l(datain_l),
 .inclock(clk),
 .oe(oe),
 .outclock(clk),
 .dataout_h(dataout_h),
 .dataout_l(dataout_l),
 .oe_out (),
 .aset (1'b0),
 .combout(),
 .dqsundelayedout(),
 .inclocken(1'b1),
 .outclocken(1'b1),
 .sclr(1'b0),
 .sset(1'b0));
 defparam
   ioddr.extend_oe_disable = "OFF",
   ioddr.implement_input_in_lcell = "OFF",
   ioddr.intended_device_family = "Cyclone IV E",
   ioddr.invert_output = "OFF",
   ioddr.lpm_hint = "UNUSED",
   ioddr.lpm_type = "altddio_bidir",
   ioddr.oe_reg = "REGISTERED",
   ioddr.power_up_high = "OFF",
   ioddr.width = 1;

確かに、これは双方向 DDR インターフェースを実装するロジックになります。しかし、タイミングに関しては部分的な成功にすぎません。少なくとも Cyclone IV ではそうです。クロックから出力までのタイミングは、I/O セルにパッキングされた通常の出力レジスタとまったく同じですが、上記のインスタンシエーションでは、入力パス (path) の遅延は実際には悪化します。他の Intel FPGA ファミリでは結果が異なる場合があります。

プレーンな SDR レジスタを DDR プリミティブで模倣するには、datain_h ポートと datain_l ポートを同じ配線に接続し、クロックの立ち下がりエッジでは何も変化しないようにする必要があることに注意してください。同様に、dataout_l ポートの値は、立ち下がりエッジでサンプリングされるため、無視する必要があります。また、出力イネーブルポート (oe) は SDR 入力です。私が理解する限り、Intel FPGA では DDR レートでハイインピーダンスをオン/オフすることはできません。少なくとも、提供されているロジックプリミティブでは不可能です。

では、なぜ出力レジスタではうまくいき、入力ではうまくいかなかったのか。そのヒントは上のタイミングレポートにあります。プレーンな I/O セルレジスタでさえ、レジスタとして DDIOOUTCELL_Xn_Ym_Nk コンポーネントが使われています。言い換えれば、シングルレートの出力でも DDR 出力レジスタが使われており、ただし使われるのは片方のクロックエッジだけです。入力パスについては、上のタイミングレポートが示すように、ロジックファブリック内のレジスタ (FF_Xn_Ym_Nk) が使われています。ここが核心です。DDR 入力ロジックもロジックファブリック内に実装されています。さらに悪いことに、DDR の場合、I/O セルとフリップフロップの間に組み合わせロジック (combinatorial logic) のブロックが挟まれています。率直に言って、なぜそうなるのか私にはわかりません。そのような組み合わせブロックはどれも、単一入力から単一出力への単なるパススルーだからです。

これらの観察結果は、タイミングレポートと、Quartus の Post-Fit Technology Map Viewer が表示する図の両方によって裏付けられています。特に、あの役に立たない組み合わせブロックは、これらの情報源ではっきりと確認できます。

この一連の問題は、FPGA ファミリによって異なる可能性が高いです。Cyclone IV については、DDR プリミティブは出力に使う場合にのみ意味があります。

さらに重要なのは、出力レジスタが必要とされる場合に DDR プリミティブ出力が使われるという事実によって、他の出力と位相が揃った出力クロックを生成できることです。これを実現するには、DDR 出力プリミティブの datain_h ポートと datain_l ポートに、それぞれ定数 '1' と '0' を与えます。他の出力については、出力レジスタのパッキングを使うように要求します。こうして、他の出力のトグルは、DDR 出力から来るクロックの立ち上がりエッジに揃います。

いや、ほとんど、ですが。出力クロックのタイミング解析は少し異なります。クロックが、2 つの出力レジスタのどちらが出力を駆動するかを選択するマルチプレクサをトグルするからです (詳しくは横にスクロールしてください):

+------------------------------------------------------------------------------------------------------------------------------------+
; Data Arrival Path                                                                                                                  ;
+---------+---------+----+------+--------+-------------------------+-----------------------------------------------------------------+
; Total   ; Incr    ; RF ; Type ; Fanout ; Location                ; Element                                                         ;
+---------+---------+----+------+--------+-------------------------+-----------------------------------------------------------------+
; 0.000   ; 0.000   ;    ;      ;        ;                         ; launch edge time                                                ;
; 0.000   ; 0.000   ;    ;      ;        ;                         ; clock path                                                      ;
;   0.000 ;   0.000 ; R  ;      ;        ;                         ; clock network delay                                             ;
; 0.000   ; 0.000   ; R  ;      ; 1      ; PIN_B12                 ; osc_clock                                                       ;
; 5.610   ; 5.610   ;    ;      ;        ;                         ; data path                                                       ;
;   0.000 ;   0.000 ; RR ; IC   ; 1      ; IOIBUF_X19_Y29_N8       ; osc_clock~input|i                                               ;
;   0.667 ;   0.667 ; RR ; CELL ; 2      ; IOIBUF_X19_Y29_N8       ; osc_clock~input|o                                               ;
;   0.853 ;   0.186 ; RR ; IC   ; 1      ; CLKCTRL_G12             ; osc_clock~inputclkctrl|inclk[0]                                 ;
;   0.853 ;   0.000 ; RR ; CELL ; 165    ; CLKCTRL_G12             ; osc_clock~inputclkctrl|outclk                                   ;
;   1.971 ;   1.118 ; RR ; IC   ; 1      ; DDIOOUTCELL_X16_Y29_N11 ; sram_controller_ins|ddr_clk|auto_generated|ddio_outa[0]|muxsel  ;
;   3.137 ;   1.166 ; RR ; CELL ; 1      ; DDIOOUTCELL_X16_Y29_N11 ; sram_controller_ins|ddr_clk|auto_generated|ddio_outa[0]|dataout ;
;   3.137 ;   0.000 ; RR ; IC   ; 1      ; IOOBUF_X16_Y29_N9       ; sram_clk~output|i                                               ;
;   5.610 ;   2.473 ; RR ; CELL ; 1      ; IOOBUF_X16_Y29_N9       ; sram_clk~output|o                                               ;
;   5.610 ;   0.000 ; RR ; CELL ; 0      ; PIN_E10                 ; sram_clk                                                        ;
+---------+---------+----+------+--------+-------------------------+-----------------------------------------------------------------;

これはレジスタからピンへの解析ではなく、クロックからピンへの解析であることに注意してください。それでも、set_output_delay 制約にはこのパス (path) が含まれます。しかし、レジスタからポートへの set_max_delay 制約を使用する場合、このパスは含まれないため、別途扱う必要があります。つまり、set_max_delay を使うなら、次のような形式にしなければなりません:

set_max_delay -from [get_clocks main_clk] -to [get_ports sram_clk] 3.8

次に、同じ電圧規格などを持つ別のピンと比較してみましょう。ただし、そちらは単にレジスタによって駆動されているピンです:

+----------------------------------------------------------------------------------------------------------------------+
; Data Arrival Path                                                                                                    ;
+---------+---------+----+------+--------+-------------------------+---------------------------------------------------+
; Total   ; Incr    ; RF ; Type ; Fanout ; Location                ; Element                                           ;
+---------+---------+----+------+--------+-------------------------+---------------------------------------------------+
; 0.000   ; 0.000   ;    ;      ;        ;                         ; launch edge time                                  ;
; 2.507   ; 2.507   ;    ;      ;        ;                         ; clock path                                        ;
;   0.000 ;   0.000 ;    ;      ;        ;                         ; source latency                                    ;
;   0.000 ;   0.000 ;    ;      ; 1      ; PIN_B12                 ; osc_clock                                         ;
;   0.000 ;   0.000 ; RR ; IC   ; 1      ; IOIBUF_X19_Y29_N8       ; osc_clock~input|i                                 ;
;   0.667 ;   0.667 ; RR ; CELL ; 2      ; IOIBUF_X19_Y29_N8       ; osc_clock~input|o                                 ;
;   0.853 ;   0.186 ; RR ; IC   ; 1      ; CLKCTRL_G12             ; osc_clock~inputclkctrl|inclk[0]                   ;
;   0.853 ;   0.000 ; RR ; CELL ; 165    ; CLKCTRL_G12             ; osc_clock~inputclkctrl|outclk                     ;
;   1.970 ;   1.117 ; RR ; IC   ; 1      ; DDIOOUTCELL_X37_Y29_N11 ; sram_controller_ins|dq_wr_data[6]|clk             ;
;   2.507 ;   0.537 ; RR ; CELL ; 1      ; DDIOOUTCELL_X37_Y29_N11 ; sram_controller:sram_controller_ins|dq_wr_data[6] ;
; 5.645   ; 3.138   ;    ;      ;        ;                         ; data path                                         ;
;   2.717 ;   0.210 ;    ; uTco ; 1      ; DDIOOUTCELL_X37_Y29_N11 ; sram_controller:sram_controller_ins|dq_wr_data[6] ;
;   3.182 ;   0.465 ; RR ; CELL ; 1      ; DDIOOUTCELL_X37_Y29_N11 ; sram_controller_ins|dq_wr_data[6]|q               ;
;   3.182 ;   0.000 ; RR ; IC   ; 1      ; IOOBUF_X37_Y29_N9       ; sram_dq[6]~output|i                               ;
;   5.645 ;   2.463 ; RR ; CELL ; 1      ; IOOBUF_X37_Y29_N9       ; sram_dq[6]~output|o                               ;
;   5.645 ;   0.000 ; RR ; CELL ; 1      ; PIN_G14                 ; sram_dq[6]                                        ;
+---------+---------+----+------+--------+-------------------------+---------------------------------------------------;

後者のパスは見た目こそまったく異なりますが、クロックから出力までの合計時間の差は 35 ps 以下です。これは偶然ではありません。FPGA は明らかにこの類似性が生じるように設計されています。具体的には、上記のタイミング解析は温度 100°C、電圧 1200 mV のスロー条件ですが、このわずかな差は、解析した他の条件でも一貫しています。

このページは英語から機械翻訳されたものです。不明な点があれば、原文を参照してください。
Copyright © 2021-2026. All rights reserved. (dcc38493)