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なしのゲートシミュレーションをすることができます。