2017-06-30 9 views
1

私は奇妙な問題に直面しています。このコードは単純なALU用です。関心のコードだけをここに貼り付けられます:Verilogの奇妙なシミュレーション結果の合成

always @(posedge clk or posedge rst) 
    begin 
     if (rst == 1) begin 
      mul_valid_shr = 3'b000; 
     end else begin 
      if (op_mul_i == 1) begin 
       mul_valid_shr = 3'b111; 
      end else begin 
       mul_valid_shr <= mul_valid_shr << 1; 
      end 
     end 
    end 

、常にブロックの外側:

enter image description here

assign mul_valid = mul_valid_shr[2]; 

私のテストベンチとPOST合成機能シミュレーション結果を以下ましたリセットはすでに低いですが、なぜシムが初めて動作しませんでしたが、2回目と3回目は正常に動作していますか? op_mul_iを100nsの前にトリガーすると、rstが低くても、初めてmul_resultが機能しなくなります。

いずれの場合も歓迎します。

UPDATE:FULL CODE HERE:op_mul_i生成される方法https://www.edaplayground.com/x/28Hx

+0

これは問題の原因ではないと思われますが、ブロックされた割り当てとブロックされていない割り当ては、通常、フリップフロップを意味する変数に対してノンブロッキング代入を使用したいとします。私はあなたのシンセサイザーがあなたにこれをさせるのを許して驚いています。だから、 'mul_valid_shr'(' mul_valid_shr = 3'b ... ')に対する2つのブロッキング割り当ては非ブロック(' mul_valid_shr <= 3'b ... ')でなければなりません。 –

+0

私はすでにこれを試して、すべてを非ブロッキングにしました。それでも、まったく同じ結果が得られます。 – Qazi

+0

私はそれが助けになるとは思わなかった。それにもかかわらず、それらを混同しないでください。 –

答えて

0

? clkと同期していますか?私はあなたのシミュレーションの後半部分で、op_mul_iが論理1のとき、mul_validが論理1に駆動されるのを見るからです。もしそれが同期していれば、私はmul_validが200nsのエッジの隣のクロックエッジでロジック1になると予想します。 これは合成後のものですから、私はこの問題の原因となる準安定性が疑わしいです。 100nsで、障害ウィンドウ内でop_mul_iが変化していて、クロックエッジがop_mul_iを論理1として検出しないため、何も表示されません。

op_mul_iをclkに同期させ、同期信号を使用してmul_valid_shrを駆動します。 また、ブロッキング文をシーケンシャルブロックで使用しないでください。

希望に役立ちます。 VK

+0

答えをいただきありがとうございます。op_mul_iは、n回の周期でクロックに同期して生成されます。 op_mul_iがハイになった後、3番目のサイクルでmul_validがハイになるはずです。私はブロッキングステートメントとノンブロッキングステートメントの混合をやめました。 – Qazi

0

op_mul_iを非同期信号として使用して非同期フロップを作成しました。あなたの最初のブロックで修正され、この修正はclkと同期されません。だから、私にとってはレースのように見えます。ハードウェアはいくつかのステップを無視して正しいです。

したがって、シミュレーション結果はおそらくシミュレーションアーチファクトのために正しいと思われます。私は正しいrtlのアプローチは、この信号のためのさらに別のフロップを提供することによってクロックと信号を同期させることだと思います。

この信号のシミュレーションでは、ノンブロッキング割り当てまたは#0遅延を最初のブロックで試してみることができます。

+0

ありがとうございました。 op_mul_iで「非同期フロップ」をどういう意味ですか? op_mul_iはn *周期、すなわち20,40,60等でのみトリガされる入力信号であり、これはこれを同期させる、すなわちクロックで変化させるものではないか?最初のtbブロックで、私は現在 "#0"を使用していますが、結果にdiffはありません。 – Qazi

1

Verilogには、非決定論と競争条件の概念があります。

  • IEEE STD 1364から1995 § 5.4.2 非決定性
  • IEEE STD 1364から2001 § 5.4.2 非決定性
  • :下記の概念を説明するVerilogおよびSystemVerilogのさまざまなバージョンから発揮されていますIEEE Std 1800-2012 § 4。非決定性の8 非決定性

1つの供給源は、アクティブイベントキューを取り出し、任意の順序で処理することができるという事実です。非決定性のもう一つの原因は、行動ブロック内に時間制御構造を持たないステートメントを1つのイベントとして実行する必要がないことです。時間制御ステートメントは#式と@式のコンストラクトです(9.7 [9.4 for IEEE1800]を参照)。ビヘイビア文を評価している間はいつでも、シミュレータは実行を中断し、部分的に完了したイベントをイベントキューに保留中のアクティブなイベントとして配置することができます。これの効果は、プロセス実行のインターリーブを可能にすることである。インタリーブされた実行の順序は非決定的であり、ユーザの制御下ではないことに留意されたい。

  • IEEE STD 1364から1995 § 5.5 レース条件
  • IEEE STD 1364から2001の§ 5.5 レース条件
  • IEEE Std 1800-2012 § 4.8 レース条件

式の評価とネット更新イベントの実行が混在することができるので、競合状態が可能である:

assign p = q; 
initial begin 
    q = 1; 
    #1 q = 0; 
    $display(p); 
end

シミュレータは、Q 1または0 0の割り当てのいずれかを表示する際に正しい更新を可能にしますpのイベント。シミュレータは$ displayタスクを続行して実行するか、pの更新を実行した後、$ displayタスクを実行します。要するに

これはclkop_mul_iが同じ時間ステップで変更されても更新される前または後op_mul_iclkにトリガ常にブロックを評価することができることを意味します。この非決定的および競合状態の動作は意図的です。 FPGAやシリコン上のクリティカルパスで起こり得る同様の動作を模倣する方法を可能にします。

解決方法とベストプラクティスは、クロックと入力刺激の間にオフセット(時間またはスケジューラ領域)を持たせることです。時刻オフセットは&のように使用できます。最初の#遅延で1。私は私のコメントで示唆するように。または、入力刺激にノンブロッキング割り当て(<=)を割り当てます。これは常にクロックの後に更新され、クロックに依存するものはすべて更新されます。 (これは、非ブロックでフロップが割り当てられる理由です)。どちらのルートを取るかは、あなたやチームリーダーの判断に委ねられます。

+0

詳細な回答ありがとうございます。残念ながら、完全な問題は解決しません。コメントに書いたように、リセットの問題は依然として続きます。十分に長いアクティブリセット(〜100ns)を与えると、すべての機能はそこにありますが、100ns以内に起こった小さなリセットは無視されます。設計は250Mhzで動作し、セットアップ/ホールド時間は1nsの10分の1未満です。これに関するアイデアはありますか? – Qazi

1

ザイリンクスシミュレータは、ポスト合成シミュレーションの最初の100nsのFPGAグローバルリセットをシミュレートしています。したがって、基本的にリセットとクロックでロジックを保持して、合理的な結果を得る必要があります。これは、13ページのUG900で言及されています。