第6回「レーシングによるトラブル」(201210)

シミュレーション結果の波形をみると想定していたタイミングより1サイクル前で動作している。 記述をいくら見直してみても、1サイクル前にずれるような記述はないのだが・・・。 このような状況においては、レーシング(競合)問題が発生しています。



レーシングの例として、2入力XORゲートの入力端子両方に同じ信号を入力する場合を考えましょう。この場合を定常状態で考えれば、入力は00か11にしかなりません。したがって、出力は常に0になるはずです。ところが、信号の変化タイミングに着目すると、実回路では2つの入力信号をまったく同時に変化させるなどということはできませんので、ごく短い期間ですが、10あるいは01が入力される期間があります。この瞬間だけXORは1を出力します。(定常状態のみを考慮している限りにおいては)論理式上ではあり得ない状態です。


RTLで同期回路設計しているときには、このタイプの競合が問題になることは通常ありませんが、非同期回路の設計で起こる問題を理解するには、このような組み合わせ回路の競合状態の理解は重要です。


ここまでは、実回路や遅延シミュレーションで起こる問題を見ました。これは回路への複数の入力信号間で、信号の遅延によって変化タイミングがずれることによる問題です。逆に、同期回路では、遅延を考慮しないサイクルシミュレーションで起こる競合状態が問題になる場合があります。 F/Fのクロック入力とデータ入力間の、信号の変化タイミングの前後が一意に定まらないことによる問題です。


以下は、『RTL設計スタイルガイド』にある、問題のあるテストベンチ記述の例です。



onepoint_201210


DUTはイネーブル付きカウンタで、クロック立ち上がりタイミングで、COUNTONが1のとき、カウントアップします。 このテストベンチでは、クロック信号もCYCLE時間を基準に生成していますので、クロックの立ち上がりとCOUNTONの変化がまったく同時になります。このため、クロック立ち上がり時、DUT内でCOUNTONが0と評価されるか、1と評価されるかが定まりません。 合成した回路とシミュレーションが異なる動作をする可能性がありますし、あるシミュレータで期待どおりに動作したとしても、別のシミュレータでは(あるいは別のバージョンでは)異なる動作をするかもしれません。この類のシミュレータに依存する動作に起因する問題は、経験上、非常に見つけづらいことがあるように思われます。


このような問題を避けるため、『RTL設計スタイルガイド』では、入力信号をクロックから一定時間遅延させるように勧めています。また、遅延させる記述において記述量を減らす工夫や、この問題に言語レベルで対処されてるSystemVerilogでの記述の仕方などにも触れています。



今回ご紹介した内容については、以下の書籍で詳しく解説しています。

RTL設計スタイルガイド


XILINX
教育サービス
HDLABトレーニング(SystemC)
HDLABトレーニング(SystemVerilog)
HDLABトレーニング(Verilog HDL)
HDLABトレーニング(フレッシュマン向け)
HDLABトレーニング(専門分野)
HDLABトレーニング(組込み分野)
HDLABトレーニング(XILINX認定)
HDLABトレーニング日程表
HDLABトレーニング開催リクエスト
Eラーニング
STIL講座
STIL講座ログイン
設計スキルアセスメント
設計技能検定試験「ESA」
設計技能検定試験「ESA Basic」
設計・コンサルティング
ARM CPUモデル環境
SystemC
Design Style Guide
設計・検証のワンポイント
購入・見積もり
ダウンロード
お問い合わせ

XAP