実際のハードウェアで確実に機能するFPGAデザインを取得する方法


9

FPGAでデジタルロジックデザインの学習を始めたばかりで、多くのプロジェクトを構築しています。ほとんどの場合(私は初心者のため)、完全にシミュレーション(動作シミュレーション)するが、適切に合成しないデザインがあります。

したがって、私の質問は、「ワークフローに組み込むことができる設計ステップは何ですか。これにより、FPGAで正しく機能する設計が確実に行われます。」

私は助言を期待する2つの主要な領域を持っていますが、これは完全に初心者としての私の非常に狭い視点に基づいており、さらに大歓迎です:

  • すべてのステップ(RTL回路図の表示、合成後のシミュレーションの表示など)でベストプラクティスの学習を開始するにはどうすればよいですか。
  • 予期しない結果を回避するためにロジック(FSMやシーケンシャル回路など)を設計する際に注意すべきことは何ですか。

ザイリンクスSpartan 6 FPGAとザイリンクスISEデザインスイートを使用しています。


1
合成でどのような問題が発生していますか?シミュレーションで高レベルのカバレッジを達成していますか?
pjc50 2016年

@ pjc50質問が理解できません。「シミュレーションにおける高レベルのカバレッジ」とはどういう意味ですか?
アイアンスタイン2016年

1
シミュレーションを動かすテストベンチまたは刺激があります。カバレッジツールは、テストによって実際に実行されているデザインの割合をパーセンテージで示します。この数が小さすぎる場合、テストベンチは不十分であり、実際の使用で発生する可能性があるいくつかのケースをテストしていません。
pjc50 2016年

@ pjc50は、実際には非常に良いアドバイスです。ザイリンクスISEデザインスイートでこれに相当するものは何ですか。
アイアンスタイン2016年

1
注目に値すること:合成し、「実際のハードウェアで確実に機能する」ことは、厳密さのレベルが異なります。それが合成されることを確認するために従うことができるパターンがあります。ただし、実際のハードウェアで機能させる場合は、シミュレーションの格言を忘れないようにする必要があります。
Cort Ammon

回答:


13

私が働いていた場所には、FPGAデザイナーのキャンプが2つありました。私がシミュレート、シミュレート、シミュレート、またはキューブ化と呼んだ1つのキャンプ。もう1つのキャンプはすべてデザインに関するものでした。

立方体の人たちは、modelsimのようなシミュレーターを使用しました。彼らは、コーディング方法やデザインスイートのブロックを介して初期設計を思いつきました。次に、それをシミュレートし、機能しないものを見つけて、コードを変更します。このプロセスは、機能する設計ができるまで数回繰り返されました。

デザインキャンプ(私が好んだ)は、波形を紙(またはVisioのようなデジタルペーパー)に設計しました。次に、論理図を考えます。これは自己文書化プロセスです。次に、図はコードに変換されました(コードと図が1対1であった場合、図に何かがあった場合、コードにそのプロセスがありました)。その後、シミュレーションを行い、シミュレーション波形を紙上で設計された波形と比較したところ、同じであることが予想されました。

結局両方をやってしまいましたが、時々キューブモードになってしまい、面白くありませんでした。私は時々自分の目標を見失ったことに気づきました。たとえば、ステートマシンの状態を変更し、その変更が次の状態に波及する場合、それを修正する必要があります。私はそれについて考えるよりも多くの時間を費やすことになりました。

どちらのキャンプに行きたいですか?厳密な設計が必要で、自分に合った方法を実行する必要があると思いますが、設計をより詳細かつ厳密に行えば、長期的には問題が少なくなると思います。私は可能なことのいくつかの例を挙げました、それらはあなたの職場の組織構造に合わないかもしれません。設計の詳細と注意深い計画が非常に役立つ理由は、自分が何をしているのかを考えるように強いられるからです。デバッグが容易になります。これを可能にする設計ワークフローを開発します。また、シミュレーションツールに精通し、シミュレートされたデバイスで発生する可能性のあるすべての条件をテストする優れたテストベンチを作成します。もちろん、これは時間とバランスを取る必要があります。たとえば、シミュレーションでデバイスをシミュレートするADC HDLコードを記述します。

(私の意見では)FPGA設計で最も価値のあるツールは、設計を完全にテストし、そのペースで実行できる優れたテスト手順です。FPGAの設計は、「機能するだけ」とは期待できません。すべての機能が機能することを確認するには、努力が必要です。エラーを見つけたら、シミュレーションと設計に戻って、シミュレーションされたFPGAとRTLの違いを学びます。これは主に経験から得られますが、デザインがシミュレーションでは機能するがハードウェアでは機能しない場合は、違いがある理由を見つける必要があります。

私が学んだいくつかの重要な点:
1)入力を無害化し、クロックとリセット回路はクリーンである必要があります。デュアルランクシンクロナイザーとは何かを理解します。リセット回路にはさまざまなトポロジーがあり、それらの使用方法を知っています(Webにはすばらしい記事があり、手元にありません)。
2)設計の要件を前もって取得し、次にそれらの周りに設計します。あなたの周りの人々があなたに明確な要件を与えないなら、あなた自身でいくつかを考え出してください。
3)Matlab固定小数点ツールボックスは、制御システムとDSPアプリケーションのシミュレーションに最適ですが、アクセスできない場合があります。これは、コーディングする前にデザインを証明する優れた方法です。
4)最初にデザイン、次にコーディング、そしてシミュレーションです。
5)強く型付けされ、また、PCB回路図とhdlで信号名を一致させます。(これは私がVerilogよりもVHDLをはるかに好む理由でもあります。


2
「sの3乗」またはの+1simulation3
Paebbels

かなり良い:「厳密な設計」に「型システムを使用する」を追加します。例:配列の範囲などの適切なタイプの配列インデックス。範囲外の状態をテストする必要はありません。私は「紙に書かれた設計された波形と比較した波形」にだけ同意します...設計された波形はその段階でVHDLである(またはおそらくテキストファイルから読み取られる)必要があり、シミュレーターが比較を実行する必要があります。
ブライアンドラモンド

それはそのようにして行うこともできました、それは比較する何かを与えるので、私は紙の上で波形を設計することが有用であるとわかりました。ADC波形のように、タイミングが設計され、次にmodlesim出力と比較されて、物理的に検証されました。modelsimの出力が正しい場合は、それと比較してください。コードは強く型付けされていました(私はそれを言及するのを忘れていました)が、それは本当に重要です。それが私がVerilogよりVHDLをはるかに好む理由です、あなたが取ることができるより少ない近道があります。そして、それはコードをより読みやすくします。
電圧スパイク

はい。実際には、ソフトウェアや従来のハードウェアなどの他の領域と同様に、開始点は問題をブロックに分割し、「そのブロックがいつ機能するかを知る方法」を自問することです。じゃやれ。ブロックごとにデザインを作成し、ブロックを組み合わせて、期待どおりの結果が得られるかどうかを再度テストします。時には、より良いブロックレベルのデザインを使用すると、よりクリーンで簡単になるため、バックトラックすることに気付く場合があります。
danmcb

6

主なものは次のとおりです。

  • 合成できない構造を回避するための注意深いコーディング
  • タイミングパフォーマンスを向上させるためにロジックレベルを最小化します(レジスタ間のロジックをできるだけシンプルにします)
  • テスト、テスト、テストして機能の正確性を確認し、初期化されていないレジスタや切断されたワイヤなどをチェックします
  • 合成および合成ログで警告を確認し、警告が問題を示していないことを確認します(つまり、削除されたレジスタ警告は意図的(モジュール出力を使用しなかった)または意図的ではない(モジュール出力/タイプミスなどを接続するのを忘れた)可能性があります)。
  • マッピングおよび使用率の数値についてはマップレポートを確認し、FPGAが満杯になっていないことを確認してください
  • 配置配線、タイミング解析、デザインが必要なクロック速度で実行されることを確認

上記に従って、実際のFPGAでの最初のテストで、かなり複雑なデザインがいくつか正しく(または少なくともほとんど正しく)機能するようにしました。RTL回路図を確認する必要はありません。これは非常に面倒で、大規模な設計では時間を完全に無駄にします。合成後のシミュレーションの方がはるかに便利です。


1
早々に返事をくれてありがとう。2つ目のポイントについて詳しく説明してください(ロジックレベルを最小化)。
アイアンスタイン2016年

5

合成可能なすべてのコードは、次のように表現できる必要があります。

  • LUT
  • ビーチサンダル
  • ベンダー固有のプリミティブ

ベンダー固有のプリミティブは、明示的にインスタンス化されるか、ベンダーのウィザードによって生成されるか、非常に特定のコーディングパターンによって推論されるため、あいまいさはありません。

たとえばVHDLではwait for、合成可能なコードでは使用できません。理由を理解するには、wait for 100 nsLUTまたはフリップフロップを使用して決定論的に表現してみてください。できません。

これは、既知のクロック周波数(周期は100 nsで分周可能)を備えたカウンターを設定することで実装できず、そのカウントを使用してタイムアップ時を知ることができないという意味ではありません。ただし、合成エンジンはこのスキームを自動的に作成しません。組み合わせロジック(ゲート/ LUT)とレジスターの観点からアーキテクチャーを明示する必要があります。

したがって、合成可能なコードを生成するために心に留めておくべき主なことは、コードがロジックゲートやフリップフロップになる様子を比較的明確に把握することです。それだけです。


wait until rising_edge(clk);一部のツールはその使用に制限を課していますが、確かに合成可能です。
ブライアンドラモンド

2

最も明白な最初のステップは、警告を確認することです。

ザイリンクスツールは、コーダーが意図したものではない可能性があることについて警告するログファイルを生成します。未使用であることを完全に知っている未使用の信号に関する一連の警告がある場合、これは迷惑なことがあります。しかし、時にはそれは本物のバグをキャッチします。初心者の場合、ミスをする可能性が大幅に高くなります。

次に、タイミング制約を設定する必要があります。クロックAの立ち上がりエッジ後、データラインBを設定する必要があるのはどのくらいの速さですか。または、クロックAの立ち下がりエッジの前に、データラインBをどれくらいの期間保持する必要がありますか?タイミング制約では、これらすべてを指定できます。タイミングの制約がない場合、コンパイラーは特に気にせず、信号をどこにでもルーティングできると想定する場合があります。タイミングの制約がある場合、コンパイラーは、配置を移動することにより、信号がこれらの制約を確実に満たすようにします。また、タイミングの制約を満たせない場合は、警告が表示されます。

出力が期待どおりに動作しないことが問題である場合は、I / Oブロックを詳しく見てください。各I / Oピンには、関連するロジックのビットとフリップフロップがあります。コードでロジック変数と状態変数を指定する順序では、コードをこのアーキテクチャに適合させることができない場合があるため、どこに配置されても、追加の遅延が発生します。タイミング制約に関する警告は、これが発生した場合に通知します(タイミング制約を設定したと想定)。ハードウェアを理解し、デザインをハードウェアにマッピングする方法を理解する必要があります。一般に、これは高クロックレートに達し始めたときの問題ですが、言及する価値があります。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.