では、次にエッジ・アラインのDDR出力の外部タイミング・スペックを図10に示します。
やはり、SDRと考え方は同じですが、最大データ遅延時間にクロック周期の半分の値を使うので注意が必要です。
<最大データ遅延時間> = Tck / 2 − Tskew_max + Tdata_max − Tclk_min <最小データ遅延時間> = Tskew_min + Tdata_min − Tclk_max
create_clock -name clkin -period <クロック周期> [get_ports CLKIN] create_generated_clock -name clkout -source [get_ports CLKIN] [get_ports CLKOUT] set_output_delay -clock clkout -max <最大データ遅延時間> [get_ports DATAOUT] set_output_delay -clock clkout -max <最大データ遅延時間> [get_ports DATAOUT] \ -clock_fall -add_delay set_output_delay -clock clkout -min <最小データ遅延時間> [get_ports DATAOUT] set_output_delay -clock clkout -min <最小データ遅延時間> [get_ports DATAOUT] \ -clock_fall -add_delay
最後はセンター・アラインのDDR出力です。
図11に示す外部タイミング・スペックの場合、タイミング制約は以下のようになります。
<最大データ遅延時間> = Tsu + Tdata_max − Tclk_min <最小データ遅延時間> = −Th + Tdata_min − Tclk_max
create_clock -name clkin -period <クロック周期> [get_ports CLKIN] create_generated_clock -name clkout -source [get_ports CLKIN] [get_ports CLKOUT] set_output_delay -clock clkout -max <最大データ遅延時間> [get_ports DATAOUT] set_output_delay -clock clkout -max <最大データ遅延時間> [get_ports DATAOUT] \ -clock_fall -add_delay set_output_delay -clock clkout -min <最小データ遅延時間> [get_ports DATAOUT] set_output_delay -clock clkout -min <最小データ遅延時間> [get_ports DATAOUT] \ -clock_fall -add_delay
これまでの連載で、主なSDCコマンドと制約の方法を解説してきました。本稿の最後に復習を兼ねて、少し実用的な例を取り上げることにします。
図12に示すEthernet PHYとのインターフェイスのタイミング制約を考えてみましょう。
1G/100M/10Mbpsで動作するEthernet PHYデバイスは、1Gbpsのときは「GMII(Gigabit Media Independent Interface)」、100Mbpsと10Mbpsのときは「MII(Media Independent Interface)」でFPGAと通信します。GMIIはセンター・アラインのSDRソース・シンクロナス方式です。MIIは少し変則的ですが、共通クロック方式です。
まず、MIIモードのクロックを定義します。PHYからFPGAへ供給される「TX_CLK」と、I/O制約のための仮想クロックです。10Mbps動作ではクロック周波数は2.5MHzですが、100Mbps動作の場合だけを考えれば十分なので、省略します。
create_clock -name tx_clk -period 40 [get_ports TX_CLK] create_clock -name tx_vclk -period 40
次に、GMIIモードのクロックを定義します。FPGAへの入力クロック「CLKIN」、それを5逓倍した「PLLの出力」、さらにPLL出力を基に作られる出力クロック「GTX_CLK」の3つがあります。
create_clock -name clkin -period 40 [get_ports CLKIN] create_generated_clock -name pllout -multiply_by 5 -source [get_ports CLKIN] \ [get_pins PLL|clkout] create_generated_clock -name gtx_clk -source [get_pins PLL|clkout] [get_ports GTX_CLK]
次に、クロック間の関係を定義します。MII用のクロックと、GMII用のクロックは、互いに非同期関係として扱えます。
set_clock_groups -asynchronous -group {tx_clk tx_vclk} -group {clkin pllout gtx_clk}
出力制約はMIIモードでは「tx_vclk」を基準に、GMIIモードでは「gtx_clk」を基準にします。2種類の制約を並べるだけですが、上書きされないように、後に書く方には「-add_delay」オプションを付け忘れないようにします。
set_output_delay -clock tx_vclk -max <MII最大データ遅延時間> \ [get_ports TXD[*] TX_EN TX_ER] set_output_delay -clock tx_vclk -min <MII最小データ遅延時間> \ [get_ports TXD[*] TX_EN TX_ER] set_output_delay -clock gtx_clk -max <GMII最大データ遅延時間> \ [get_ports TXD[*] TX_EN TX_ER] -add_delay set_output_delay -clock gtx_clk -min <GMII最小データ遅延時間> \ [get_ports TXD[*] TX_EN TX_ER] -add_delay
MIIのデータ遅延時間は、前回紹介した、FPGAスペックが決まっている場合の出力制約から、以下の値を入力します。
<MII最大データ遅延時間> = Tck − Tco_max = 40 − 25 = 15 <MII最小データ遅延時間> = −Tco_min = 0
GMIIのデータ遅延時間は、センター・アラインのSDR出力制約から、以下の値を入力します。
<最大データ遅延時間> = Tsu + Tdata_max − Tclk_min = 4 + 0.45 − 0.35 = 4.1 <最小データ遅延時間> = −Th + Tdata_min − Tclk_max = 0 + 0.35 − 0.45 = −0.1
次回は実際のツールを使った、タイミング解析方法を紹介します。ちなみに、タイミング解析ツールには、アルテラ社の「TimeQuest」を使います。お楽しみに!(次回に続く)
Copyright © ITmedia, Inc. All Rights Reserved.