ハードウェア記述言語(Verilog、VHDLなど)のベストプラクティスは何ですか。

StackOverflow https://stackoverflow.com/questions/326880

  •  11-07-2019
  •  | 
  •  

質問

HDLコードを実装する際に注意すべきベストプラクティスは何ですか?

より一般的なソフトウェア開発分野と比較した場合の共通点と相違点は何ですか?

役に立ちましたか?

解決

このトピックに関する最高の本は方法論マニュアルの再利用。 VHDLとVerilogの両方をカバーしています。

特に、ソフトウェアで完全に一致しない問題:

  • ラッチなし
  • リセットには注意してください
  • 内部および外部のタイミングを確認します
  • 合成可能なコードのみを使用する
  • すべてのモジュールの出力を登録する
  • ブロックと非ブロックの割り当てに注意してください
  • コンビナトリアルロジックのデリケートなリストに注意する(またはVerilogで@(*)を使用する)

同じインクルードの一部

  • CMを使用
  • コードレビューを行う
  • コードのテスト(シミュレーション)
  • 必要に応じてコードを再利用します
  • 最新のスケジュールを作成
  • 仕様やユースケース、またはアジャイルの顧客がいます

他のヒント

古いスレッドのソートですが、$ 0.02を入れたいと思いました。これは、実際にはVerilog / VHDLに固有のものではありません。一般的なハードウェア設計の詳細...特にカスタムASIC用の合成可能な設計。

これは、デザインに関する(学術的ではなく)業界での長年の経験に基づく私の意見です。それらは順不同です

私の包括的なステートメントは、検証実行のための設計です。ハードウェア設計では、検証が最重要です。バグは、実際のシリコンで見つかった場合、はるかに高価です。再コンパイルすることはできません。そのため、プレシリコンにはるかに焦点が当てられています。

  • 制御パスとデータパスの違いを理解します。これにより、はるかにエレガントで保守可能なコードを作成できます。また、ゲートを保存し、X伝播を最小限に抑えることができます。たとえば、データパスにはリセット可能なフロップは必要なく、コントロールパスには常に必要です。

  • 検証前に機能を証明します。正式なアプローチまたは波形を通して。これには多くの利点があります。2を説明します。最初に、問題によってタマネギがむいて時間を節約できます。多くのアプリケーションレベルの設計(学習中は特に)およびほとんどのコースワークとは異なり、コード変更の所要時間は非常に長くなります(複雑さに応じて10分から数日)。コードを変更するたびに、エラボレーション、リントチェック、コンパイル、波形立ち上げ、最後に実際のシミュレーションを実行する必要があります。これには数時間かかります。第二に、あなたはコーナーケースを打つのが難しい可能性がはるかに低いです。これは、プリシリコン検証に関するものであることに注意してください。これらは、ポストシリコンで確実にヒットし、たくさんの$$$がかかります。私を信じてください。機能を証明するための初期費用はリスクを大幅に最小化し、努力する価値があります。これは最近の大学卒業生を納得させるのが難しい場合があります。

  • 「チキンビット」を用意します。チキンビットは、シリコンの機能を無効にするためにドライバーを介して設定されるMMIOのビットです。信頼度が高くない変更を元に戻すことを目的としています(信頼度は検証作業に正比例します)。プレシリコンで可能なすべての状態をヒットすることはほとんど不可能です。ポストシリコンで実証されるまで、設計に対する信頼を完全に満たすことはできません。バグが発生する時間の0.000005%にヒットする状態が1つしかない場合でも、ポストシリコンでヒットしますが、必ずしもプレシリコンではヒットしません。

  • すべてのコストにおいて、制御パスの例外を避けてください。新しい例外が発生するたびに、検証作業が2倍になります。これは説明するのが難しいです。別のブロックが使用するメモリにデータを保存するDMAブロックがあるとしましょう。保存されたデータ構造は、実行中の機能に依存するとします。保存されたデータ構造が異なる関数間で異なるように設計することにした場合、検証作業にDMA関数の数を掛けただけです。このルールに従うと、保存されるデータ構造は、コンテンツの場所がハードコードされているすべての機能で使用可能なすべてのデータのスーパーセットになります。 DMA保存ロジックが1つの関数に対して検証されると、すべての関数に対して検証されます。

  • インターフェースを最小化します(最小化制御パスを読み取ります)。これは、例外の最小化に関連しています。まず、すべての新しいインターフェイスには検証が必要です。これには、テストベンチの新しいチェッカー/トラッカー、アサーション、カバレッジポイント、バス機能モデルが含まれます。第二に、検証作業を指数関数的に増やすことができます!キャッシュ内のデータを読み取るためのインターフェイスが1つあるとします。 (何らかの奇妙な理由で)メインメモリを読み込むための別のインターフェイスが必要だと判断したとします。検証作業が4倍になりました。今、これらの組み合わせをいつでも検証する必要があります n

    • キャッシュ読み取りなし、メモリ読み取りなし
    • キャッシュ読み取りなし、メモリ読み取り
    • キャッシュ読み取り、メモなし

VerilogやVHDLのようなHDLは、本当にスパゲッティコードを奨励しているようです。ほとんどのモジュールは、複数の「常に」(Verilog)または「プロセス」(VHDL)ブロックで構成され、任意の順序で配置できます。モジュールの全体的なアルゴリズムまたは機能は、しばしば完全に隠されています。コードがどのように機能するかを(あなたがそれを書いていないのであれば)理解することは苦痛なプロセスです。

数年前、このペーパーに出会いました。 VHDLデザイン。基本的な考え方は、各モジュールには2つのプロセスブロックしかないということです。 1つは組み合わせコード用で、もう1つは同期(レジスタ)用です。読み取り可能で保守可能なコードを作成するのに最適です。

  • HDLでは、コードの一部が同時に機能します。たとえば、2行のコードが「機能する」場合などです。同時に、これは賢明に使用することの利点です。 これは、行ごとの言語に慣れているプログラマーにとって、最初は把握しにくいものです。

    • 必要に応じて長く具体的なパイプラインを作成できます。
    • 大きなモジュールを同時に機能させることができます。
    • 1つのユニットが異なるデータに対して繰り返しアクションを実行する代わりに、複数のユニットを作成し、並行して作業を実行できます。
  • 起動プロセスには特別な注意を払う必要があります-チップが機能するようになれば、大きな道を歩むことができます。

ハードウェアでのデバッグは通常、ソフトウェアのデバッグよりもはるかに困難です。

  • シンプルなコードが推奨されます。コードを高速化する他の方法がある場合もあります。 たとえば、高速チップなどを使用して、既に実行されています。

  • 「スマート」を避けるコンポーネント間のプロトコル。

  • ハードウェアはデバッグするのが非常に難しいため、HDLで動作するコードは他のソフトウェアよりも貴重であるため、再利用し、「ライブラリ」の使用も検討してください。一部のモジュールは無料で、他のモジュールは販売されています。

  • 設計では、HDLコードのバグだけでなく、プログラミング中のチップや、チップとインターフェイスする他のハードウェアデバイスの障害も考慮する必要があるため、チェック。

デバッグのヒント:

  • 設計に複数のビルディングブロックが含まれる場合、おそらく、それらのブロック間のインターフェイスからチップ外部のテストポイントまでの線を作成する必要があります。

  • 外部デバイスで検査する興味深いデータをそらすために、デザインに十分な行を保存する必要があります。また、この行とコードを実行の現在の状態を伝える方法として使用できます-たとえば、ある場所でデータを受け取った場合 ポイント、いくつかの値を行に書き込み、実行の後の段階で別の値を書き込み、など

    チップが再構成可能であれば、特定のテストを調整し、各テストの出力をプログラムし直すことができるため、これはさらに便利になります(これはledで非常によく見えます:)。 )

編集:

スマートプロトコルとは、2つの物理ユニットが接続された場合、利用可能な最も単純な通信プロトコルで通信することを意味します。つまり、それらの間で高度な自家製プロトコルを使用しないでください。

理由は、これです- バグを見つける" inside" FPGA / ASICは、シミュレータを持っているので、非常に簡単です。 したがって、データが希望どおりに到着し、プログラムが送信するとデータが送信されると確信している場合は、 ハードウェアのユートピアに到達しました-ソフトウェアレベルで作業できます:)(シミュレーターを使用)。 ただし、データが届かない場合、希望する方法で、理由を把握する必要があります。回線に接続する必要がありますが、それは簡単ではありません。

回線のバグを見つけることは、回線の状態を異なる時間に記録する特別な機器で回線に接続する必要があるため困難であり、回線が以下に従って動作することを確認する必要があります。プロトコル。

2台の物理ユニットを接続する必要がある場合は、「プロトコル」を作成します。できる限りシンプルで、プロトコルと呼ばれないところまで:) たとえば、ユニットがクロックを共有している場合、それらの間にx個のデータラインを追加し、1つのユニットにそれらのデータを書き込み、もう1つのユニットに読み取りを実行します。たとえば、各クロックの立ち下がりでxビットが間にあります。 FPGAを使用している場合、元のクロックレートがパラレルデータに対して速すぎる場合-実験に応じて、この速度を制御できます。たとえば、データを少なくとも「t」クロックサイクルなどのラインにとどめます。 並列データt

これは、ハードウェア設計のためにJBDAVIDの10の戒めを必要とする質問です。

  1. ソフトウェアと同様に、リビジョン/バージョン管理を使用します。 SVNとHgは無料です。
  2. チェックイン前に構文チェックに合格するようにコードを要求します。 LINTツールの方が優れています。
  3. 設計検証には、強力なハードウェア検証言語を使用します。 System-Verilogはほぼ安全な選択です。
  4. バグを追跡します。 BugzillaとGNATSは無料のツールです。 FogBugzにはわずかな$が必要です。
  5. アサーションを使用して、不適切な使用の問題をキャッチします。
  6. カバレッジトライアドは、シミュレーションツールとフォーマルツールの両方で、コードカバレッジ、機能カバレッジ、アサーションカバレッジを測定し、安定した設計を実現します。
  7. Power is King:CPFまたはUPFを使用して、Power-Intentをキャプチャ、実施、検証します。
  8. 実際の設計は、多くの場合混合信号です。混合信号言語を使用して、アナログとデジタルを検証します。 Verilog-AMSはそのようなソリューションの1つです。しかし、船外に出ないでください。実数モデリングは、混合信号動作の機能面のほとんどを実現できます。
  9. ハードウェアアクセラレーションを使用して、シリコンで動作する必要があるソフトウェアを検証します!
  10. HDL / HVL用の構文対応テキストエディターは、開発者IDEの最小要件です。

FPGAの場合、ザイリンクスにはこのページがあります。ほとんどすべてが他のFPGAベンダーに適用されるか、同等のルールがあります。 ASICデザインには多くのことが当てはまります。

Intelは、推奨するHDLコーディングスタイルと設計の推奨事項(PDF)このページの下

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top