16.バックアノテーション
FPGAの開発フローと論理合成、ゲートレベルシミュレーションについて御参照ください。
ここでは、SDFファイルについて説明します。
SDFとは、Standard Delay Formatの略で、その名の通り業界標準の遅延フォーマットファイルです。
SDFはVerilogに限定されるものではありません。VHDLでも利用可能なフォーマットになっています。
例として、Quartusの出力の一部を下記に示します。
// // Device: Altera EP1C4F400C8 Package FBGA400 // // // This SDF file should be used for Custom Verilog HDL only // (DELAYFILE (SDFVERSION "2.1") (DESIGN "big_counter") (DATE "05/09/2004 21:02:37") (VENDOR "Altera") (PROGRAM "Quartus II") (VERSION "Version 4.0 Build 190 1/28/2004 SJ Full Version") (DIVIDER .) (TIMESCALE 1 ps) (CELL (CELLTYPE "cyclone_asynch_io") (INSTANCE clock\~I.asynch_inst) (DELAY (ABSOLUTE (IOPATH padio combout (1469:1469:1469) (1469:1469:1469)) ) ) ) (CELL (CELLTYPE "cyclone_asynch_io") (INSTANCE reset\~I.asynch_inst) (DELAY (ABSOLUTE (IOPATH padio combout (1475:1475:1475) (1475:1475:1475)) ) ) ) (CELL (CELLTYPE "cyclone_asynch_io") (INSTANCE A\[4\]\~I.asynch_inst) (DELAY (ABSOLUTE (IOPATH padio combout (1475:1475:1475) (1475:1475:1475)) ) ) ) (CELL (CELLTYPE "cyclone_asynch_lcell") (INSTANCE a\[4\]\~I.lecomb) (DELAY (ABSOLUTE (PORT datac (5397:5397:5397) (5397:5397:5397)) (PORT datad (5005:5005:5005) (5005:5005:5005)) (IOPATH datac regin (478:478:478) (478:478:478)) (IOPATH datad regin (309:309:309) (309:309:309)) ) ) ) (CELL (CELLTYPE "cyclone_lcell_register") (INSTANCE a\[4\]\~I.lereg) (DELAY (ABSOLUTE (PORT aclr (898:898:898) (898:898:898)) (PORT clk (1643:1643:1643) (1643:1643:1643)) (IOPATH (posedge clk) regout (224:224:224) (224:224:224)) (IOPATH (posedge aclr) regout (283:283:283) (283:283:283)) ) ) (TIMINGCHECK (SETUP datain (posedge clk) (37:37:37)) (HOLD datain (posedge clk) (15:15:15)) ) ) |
SDFの役割としては、遅延パス、とタイミングチェックSPEC.の提示があります。
たとえば、一番上のCELLの例ですと、
(IOPATH padio combout (1469:1469:1469) (1469:1469:1469))
になっています。 padio combout間の遅延が1469psであることを示しています。括弧内は、(立ち上がり:立下り:Zへの遷移)です。括弧が二つあるのは、Min,Maxを示しています。この例では、Min,Max同じになっています。
この他にPORTの記述がありますが、これは、当該ポートの前段にDelayが入ることを示します。
(PORT datac (5397:5397:5397) (5397:5397:5397))
の場合、datacの前に5397psのDelayが挿入されます。
また、次の例は、CLKエッジの立ち上がりを検出したらregoutは、224ps後に結果がDelayすることを示しています。
(IOPATH (posedge clk) regout (224:224:224) (224:224:224))
次の例は、FFのセットアップ、ホールドタイムのSPEC.提示です。セットアップ37ps、ホールドタイム15psになっています。
(TIMINGCHECK (SETUP datain (posedge clk) (37:37:37))
(HOLD datain (posedge clk) (15:15:15)) )
それでは、SDFファイルは、どの時点で読み込むのでしょうか?コンパイラにより、様々のようですが、Veritakの場合、素直に
$sdf_annotateで読み込んでいます。つまり、通常のVerilogの構文解析、Elaboration、コード生成をした後のRUNTIME時に読み込んでいます。読むといっても、SDFファイルの構文解析に始まり、パスの探索、Delay素子やTiming Check素子の挿入を全ての掲載パスについて行わなければならないので、大規模になると時間がかかる作業になります。
quartusの論理合成したファイルには、*.voです。このファイルのどこかに、
initial $sdf_annotate("big_counter_v.sdo");//上記SDFファイルの場合
という文がある筈です。逆にこの文をコメントアウトするとSDFファイルは読み込まれずにDelayなしのゲートシミュレーションをすることができます。