バス同期回路のタイミング制約


10

クロックドメイン間でワイドレジスタを渡すためのバスシンクロナイザー回路があります。

非同期リセットロジックを省略して、簡単な説明を提供します。

データは1クロックで生成されます。更新には多くの(少なくとも1ダース)クロックエッジがあります。

PROCESS (src_clk)
BEGIN
   IF RISING_EDGE(clock) THEN
      IF computation_done THEN
          data <= computation;
          ready_spin <= NOT ready_spin;
      END IF;
   END IF;
END PROCESS;

NRZIエンコードされた新しいデータの制御信号(バス上の有効なワードは制御信号の遷移に対応します)。制御信号は、シンクロナイザーとして機能するDFFチェーンを通過します。

PROCESS (dest_clk)
BEGIN
   IF RISING_EDGE(dest_clk) THEN
      ready_spin_q3 <= ready_spin_q2;
      ready_spin_q2 <= ready_spin_q1;
      ready_spin_q1 <= ready_spin;
   END IF;
END PROCESS;

シンクロナイザ回路は短い遅延を導入し、データバスが安定するのに十分な時間を提供します。データバスは、準安定性のリスクなしに直接サンプリングされます。

PROCESS (dest_clk)
BEGIN
   IF RISING_EDGE(dest_clk) THEN
      IF ready_spin_q3 /= ready_spin_q2 THEN
         rx_data <= data;
      END IF;
   END IF;
END PROCESS;

これはコンパイルされ、Cyclone II FPGAに合成されたときにうまく機能します。ただし、TimeQuestはシンクロナイザーを認識しないため、セットアップおよびホールドタイム違反を報告します。さらに悪いことに、Quartusマニュアルによると

最悪のたるみを示すパスの改善に焦点を当てます。フィッターは、スラックが最悪のパスで最も強く機能します。これらのパスを修正すると、Fitterはデザイン内の他のエラータイミングパスを改善できる可能性があります。

したがって、QuartusがFitterの作業をデザインの他の領域に費やすことができるように、プロジェクトに適切なタイミング制約を追加したいと思います。

私はかなり確信しているset_multicycle_pathデータ・ラインが安定するデスティネーションクロックの複数のサイクルを持つことになりますから、適切なSDC(概要設計制約)コマンドですが、私はクロック・ドメイン・クロッシング・ロジックを記述するために、このコマンドを使用して、任意の完全な例を見つけることができません。

シンクロナイザのSDCタイミング制約の記述に関するガイダンスを本当に感謝します。このアプローチで問題が発生した場合は、それもお知らせください。


時計の詳細:

外部クロックジェネレーター:2チャネル、refclk = 20 MHz、refclk2 = refclk / 2(10 MHz、および関連)。

アルテラPLL:src_clk = refclk * 9/5 = 36 MHz

アルテラPLL:dest_clk = refclk2 * 10 = 100 MHz

また、100 MHzのsrc_clkと36 MHzのdest_clkを使用して、他の方向に向かうデータもあります。


TL; DR:上記のコードの正しいSDCタイミング制約は何ですか?


1
これは提案されたFPGA設計サイトでより良いでしょうが、その提案はまだベータに達していません。
Ben Voigt、2011年

src_clkおよびdest_clkのクロック定義を投稿できますか?それらは何らかの方法で関連していますか(同期倍数)?それらが無関係のクロックである場合、この状況では通常set_false_pathを使用します。
Andy

@Andy:いくつかの詳細を追加しました。これを手伝ってくれてありがとう。
Ben Voigt

回答:


9

Quartusの経験がないので、これは一般的なアドバイスとして扱ってください。

クロックドメイン間のパスで作業する場合、タイミングツールはクロックをそれらの周期の最小公倍数に拡張し、最も近いエッジのペアを選択します。

36 MHzクロック(27.777 ns)から100 MHzクロック(10 ns)へのパスの場合、クイック計算を正しく行った場合、立ち上がりエッジの最も近いペアは、ソースクロックで138.888 ns、宛先クロックで140 nsです。これは、これらのパスの900 MHzの制約です。丸めによっては(または関係のない時計の場合)、それよりも悪くなる可能性があります。

この構造の制約を作成するには、少なくとも3つの方法があります。私は時計fast_clkと呼ぶつもりです、そしてslow_clk私が思うにそれは説明のためにより明確です。

オプション1:タイミングを無効にする set_false_path

最も簡単な解決策は、を使用set_false_pathしてクロック間のタイミングを無効にすることです。

set_false_path -from [get_clocks fast_clk] -to [get_clocks slow_clk]
set_false_path -from [get_clocks slow_clk] -to [get_clocks fast_clk]

シンクロナイザが正しく動作するためのタイミング要件があるため、これは厳密には正しくありません。物理的な実装により、制御信号に対してデータの遅延が大きすぎる場合、シンクロナイザは機能しません。ただし、パスにロジックがないため、タイミング制約に違反することはほとんどありません。set_false_pathこの種の構造では、ASICでも一般的に使用されます。ASICでは、低確率の障害に対する労力とリスクのトレードオフがFPGAよりも慎重になります。

オプション2:で制約を緩和する set_multicycle_path

を使用すると、特定のパスにさらに時間をかけることができますset_multicycle_path。密接に関連するクロック(例:相互作用する1Xおよび2Xクロック)でマルチサイクルパスを使用するのがより一般的ですが、ツールが十分にサポートしていれば、ここで機能します。

set_multicycle_path 2 -from [get_clocks slow_clk] -to [get_clocks fast_clk] -end -setup
set_multicycle_path 1 -from [get_clocks slow_clk] -to [get_clocks fast_clk] -end -hold

セットアップのデフォルトのエッジ関係はシングルサイクルset_multicycle_path 1です。これらのコマンドは、-endセットアップパスのエンドポイントクロック()のもう1つのサイクルを許可します。-holdマルチサイクルパスを設定する場合、セットアップの制約よりも1少ない数値での調整が必要になります。詳細については、以下を参照してください。

同様にパスを他の方向に制約するには(制約をより速いクロックの1周期分緩和する)、次のように変更-end-startます。

set_multicycle_path 2 -from [get_clocks fast_clk] -to [get_clocks slow_clk] -start -setup
set_multicycle_path 1 -from [get_clocks fast_clk] -to [get_clocks slow_clk] -start -hold

オプション3:要件を直接指定する set_max_delay

これはの効果と似ていますがset_multicycle_path、エッジの関係とホールド制約への影響を考慮する必要がなくなります。

set_max_delay 10 -from [get_clocks fast_clk] -to [get_clocks slow_clk]
set_max_delay 10 -from [get_clocks slow_clk] -to [get_clocks fast_clk]

これをset_min_delayホールドチェック用に組み合わせるか、デフォルトのホールドチェックをそのままにしておくことができます。set_false_path -holdツールでサポートされている場合は、保留チェックを無効にすることもできます。


マルチサイクルパスのエッジ選択の詳細

各セットアップ調整とペアになるホールド調整を理解するために、3:2の関係を持つこの単純な例を考えます。各桁はクロックの立ち上がりエッジを表します。

1     2     3
4   5   6   7

デフォルトのセットアップチェックはエッジ2と6を使用します。デフォルトのホールドチェックはエッジ1と4を使用します。

2のマルチサイクル制約を適用-endすると、デフォルトのセットアップとホールドチェックが調整され、最初に使用していたエッジの次のエッジが使用されます。つまり、セットアップチェックはエッジ2と7を使用し、ホールドチェックはエッジ1と5を使用します。同じ周波数のクロックでは、この調整は理にかなっています。各データの起動は1つのデータキャプチャに対応します。キャプチャエッジが1つ移動すると、ホールドチェックも1つずつ移動します。ブランチの1つに大きな遅延がある場合、この種類の制約は1つのクロックの2つのブランチに意味があります。ただし、ここでの状況では、エッジ1と5を使用したホールドチェックは望ましくありません。これを修正する唯一の方法は、パスに遅延のクロックサイクル全体を追加することです。

マルチサイクルホールド制約1(ホールドの場合、デフォルトは0)は、ホールドチェック用に使用されるデスティネーションクロックのエッジを1エッジ逆方向に調整します。2サイクルセットアップMCPと1サイクルホールドMCP制約を組み合わせると、エッジ2と7を使用してセットアップチェックが行われ、エッジ1と4を使用してホールドチェックが行われます。


2

アルテラの答えはわかりませんが、ザイリンクスランドでは、あるクロックドメインから次のクロックドメインへの時間遅延を設定できます。計算を計算する必要があります(デザインに依存します)が、通常は2つのクロック周期の中で最短です。この時間は、任意の2つの信号(制御信号を含む)間の最大スキューと考えてください。同期回路がそれを処理できる場合は、これで解決できます。

set_mulicycle_pathは、ソースとデスティネーションの両方が同じクロックドメインにある場合に通常対処するため、使用するのは適切ではありません。繰り返しますが、ザイリンクスでの経験に基づいているため、走行距離はさまざまです。


1

シンクロナイザを介してset_false_pathを配置しても安全だと思います。

また、「set_global_assignment -name SYNCHRONIZER_IDENTIFICATION AUTO」をqsfに配置して、Quartusがシンクロナイザーを見つけやすくすることもできます。


それはどのように見えますか? set_false_path -from ready_spin -to ready_spin_q2?そしてset_false_path -from data -to rx_data
Ben Voigt

set_false_path -from src_clk -to ready_spin同期していないため、データに偽のパスを配置することが適切かどうかはわかりません。
fbo

0

問題は、バス信号がラッチされたポイントの近くのどこでも変化しないことは知っているかもしれませんが、ソフトウェアはそれを知らないことだと思います。あなたの最善の策は、おそらく着信バス信号がバスクロックと同期していることをソフトウェアに明示的に伝え、それらを実際にラッチする場所の前に最適化を無効にすることです(オプティマイザは理論的には回路を同等のものに置き換えることができます)入力が実際には同期であるが、クロックサイクルで変化した場合、ループがスローされる可能性があるため、描画した回路では問題にならない場合)。


set_multicycle_pathソース信号が変化する頻度をシンセサイザ/タイミングアナライザに伝える方法ではないでしょうか。「バスクロック」の意味がわかりません。信号ドメインがクロックドメインをまたいでいるため、どのバスを「バスクロック」と呼んでいますか。私が更新していない期間にシンセサイザがグリッチを導入した場合でも、まだメタスタビリティが存在する可能性はあると思いますdata。そこでDFFブロックを具体的にインスタンス化できると思います:(
Ben Voigt

@BenVoigt: "set_multicycle_path"は、2つのラッチポイント間の組み合わせロジックのチェーンがN(Tc)-Ts-Tp(N時間サイクルタイム-サンプル時間-ラッチ伝播時間)だけでなく、Tc-Ts-Th。私はそのようなことがどのように異なるクロックによるラッチと相互作用するのか知りません。
スーパーキャット2012
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.