cancel
Showing results for 
Show  only  | Search instead for 
Did you mean: 

Vivado 論理合成:予期せぬ実機動作を招かない為の最適化への理解

takayos
Xilinx Employee
Xilinx Employee
5 0 618

FPGA/ACAPの開発において、論理合成、インプリメンテーション、という工程が必要であり、各工程がおおよそどの様なものかはある程度ご理解頂いているかと思います。

 

ここでは論理合成が持つ最適化機能に焦点を当て、実機で予期せぬ動作を起こさない為に、知っておきたい要点を説明させて頂きたいと思います。

 

まず、論理合成とはHDLをターゲットアーキテクチャのCellに置き換え、ネットリストを生成する工程です。

当然ながらHDLとネットリスト間の論理の等価性は担保されます。

ただし、ASICの論理合成がHDLの記述通りのネットリストを生成するのに対し、FPGA/ACAPの論理合成では必ずしも全くHDLと同じネットリストが生成されるわけではありません。

FPGA/ACAP上の限られたリソースを最適に、効率よく使用するために“最適化”が行われるからです。

例えば、

信号Aを2つのFFが受け、それぞれが10FanoutするHDL場合、FPGA/ACAPの論理合成時には実際にはFFは1つとし、それが20Fanoutするネットリストになることもありえます。 

a.jpg

 

見ての通り、もちろん論理の等価性は保証されます。

しかしながら、論理の等価性の担保だけでは問題を引き押す可能性のある個所があります。

 

そもそも論理の等価性とはなんでしょうか?

それは入力論理に対する出力論理が同じである、というものです。

例えば、単純な掛け算を例にとれば、1と0を入力したら0と出力する、というものです。

入力論理(=入力信号)と出力論理(=出力信号)にはサンプルタイミングがあり、現在では同期設計が前提の為、同期のタイミングでのサンプリング結果において論理の等価性を保証しています。

逆に言えば、同期のタイミングでない箇所においては注意が必要ということで、これが前述の論理の等価性の担保だけでは問題を引き押す可能性のある個所にあたります。

具体的には、

 

  • センシティブな信号(非同期セット、非同期リセット、双方向端子の制御端子,etc
  • 非同期クロック間で受け渡される信号

 

です。

 

では次に、その注意が必要なFPGA/ACAPの論理合成で行われる最適化について述べます。

具体的には、

 

  • FSM encoding
  • Retiming
  • SLR extraction

 

です。

それぞれがどの様な機能なのか詳細に関してはUG901をご参照下さい。

今回は簡単に(乱暴に?)以下のように纏めます。

初めの2つは“HDL内のFFLogicの組み合わせが最適化され、FF出力の信号がロジック出力となる可能性がある“

最後の1つは“HDL内のFFのシフトレジスタが最適化され、SLRに変わる可能性がある“

です。

 

具体的に見ていきます。

HDL上のFFLogicの組み合わせを最適化する、それによりFF出力の信号がロジック出力となる可能性がある“とはつまり何でしょうか?

例えば以下のような回路があったとします、

 

入力信号=>FF1 => 論理ALUT=> FF2 => 出力信号

 

これが最適が行われた結果、

 

入力信号=>FF3 => 論理BLUT=> FF4 => 論理CLUT=>  出力信号

 

となる場合があります。

入力信号に対する出力信号は同じです(論理の等価性は保証)。違いはFFの出力だったものがLUTの出力なっている点です。 

それではなぜ注意が必要なのか?

それは、出力信号にグリッジが発生する可能があるからです。

 

グリッジはインプリメントの結果、各信号の配線遅延の差分によって生じる可能性あるものです。

例えば、以下の様な回路があったとします。

 

B.jpg

 

FFAFFBは同じタイミング(クロックエッジ)でそれぞれ0=>1、1=>0へ変化したとします。その結果、信号はあくまで0のままです。

 

c.jpg

ところが、これは信号に遅延のない理想的な世界の話です。

実際には(実機上では)各信号には遅延があるため、例えば以下の様なことが起こります。

 

d.jpg

 

配線遅延の差により信号Cにグリッジが発生しています。

ただし、タイミングがメットしているデザインであれば、次のアクティブクロック(図の青線のタイミング)までには収束するため問題にはなりません。

先述の通り、注意が必要となるのはそれらの信号が、

 

  • センシティブな信号(非同期セット、非同期リセット、双方向端子の制御端子,etc
  • 非同期クロック間で受け渡される信号

 

な場合です。

なぜなら、タイミングによりこのグリッジをサンプリングしてしまう可能性があるからです。

それでは予期せぬ動作を引き起こす可能性があります。

また、通常の機能検証は信号に遅延がない状態での検証なので、その様な状態は確認できません(配線遅延付き機能検証なら可能です)。

 

それでは、

 

  • センシティブな信号(非同期セット、非同期リセット、双方向端子の制御端子,etc
  • 非同期クロック間で受け渡される信号

 

があるデザインでは上記の最適化は無効とした方がいいのでしょうか?

答えは、いいえ、です。

これらの最適化がデザイン全体もたらすタイミング、リソース的な恩恵は少なくありません。

むしろ最適化が問題となるケースの方が非常に稀です。

その稀に問題となることを防ぐために、先の注意が必要な個所に適切な処置をしてあげればよいのです。

要するにFF出力のままである必要がある、

 

  • センシティブな信号(非同期セット、非同期リセット、双方向端子の制御端子,etc
  • 非同期クロック間で受け渡される信号

 

の、出力元には“DON’T_TOUCH”制約を与えてください。

DON’T_TOUCH”制約は付与された対象があらゆる最適化から除外され、HDLの設計のままネットリストとなります。

(なのでHDLの設計に問題があればもちろん問題は生じますが。。。)

 

次に、

 

HDL内のFFのシフトレジスタが最適化され、SLRに変わる可能性がある“

 

ですが、これは単純にFFで構成したシンクロナイザー(同期化回路)がSLRに置き換わってしまう、危険の事です。

それら同期化回路にはASYNC_REGプロパティを与えてください。

DON’T_TOUCHでもよさそうですが、ここはASYNC_REGにしてください。なぜならASYNC_REGが付与されたFFはなるべく近くに配置されるようインプリメント工程でもメリットがあるからです。

 

この2点は必須かと言えばデザイン上(設計構成上)不必要な場合もあると思います。

ただ、このような合成時の最適化のリスクを理解することで潜在的な問題の回避、および実機での問題発生時のデバック効率向上、など恩恵はあると思います。

 

問題を含んでいるか確認が大変だ、という方は report_cdc コマンド を使用してデザインをチェックしてみてください。

上記のような潜在的な問題のほとんどを検出することが可能です。

 

最後に、他にも有益な情報はUG949にも記載されているため併せてご参照ください。

ありがとうございました。