ここでは、筆者がCPU実験を行っていく上でぶつかった問題などを紹介します。2003年度から導入されたCPU実験基板を使っていく上で
避けては通れないと思われる問題も紹介しているので、もしCPUを作っていく上で問題にぶちあたったら参照してください。ただ、ここに
書いている解決法よりもよい解決法は当然存在すると思うので、鵜呑みにしないようお願いします。また、調べたらすぐわかることも乗せていません。
資料の紹介にとどめています。
また、内容が間違っていたり、わかりにくい点があったら訂正していきたいと思うので、メールや掲示板で知らせていただけるとすごくありがたいです。
オシレータは50MHzで動いているので、どの班もひとまず目標は50MHzで動くデザインを作成することだと思います。そのためには、
FF-FF間などの、すべての同期エレメント間のパスが20nsに収まっている必要があります。この大体の値は、Synthesisが終わった時点で表示されます。
それで、PARが終わったあとにちゃんとした値がわかるわけですが、デザインが大きくなっていくと、20nsをこえてしまいます。MaximumFrequencyとかいう感じで
動作可能な周波数が表示されると思いますが、そこを見てみると、50MHzでうごかなくなっちゃうことがわかります。
そうなってしまったら、制約をかけてみましょう。CADは、何も制約を与えないと、あまり最適化をかけずにコンパイルします。つまり、クリティカルパスの
ことなど何も考えていないのです。だから、デザインが小さいうちは、要求されたスペックを満たす回路が生成されますが、回路が大きくなるに
つれて、要求スペックを満たせなくなります。そのため、CADに対して、「50MHzでうごくような回路(20nsにパスが収まるような回路)を作ってちょうだい」
と指示する必要があります。そのために、「制約」をかけます。具体的には、ucfファイルに、
プロセッサ単体では、外と通信することもできないので、実験で作るプロセッサは、当然USBやSRAMと通信することになります。そのとき、Xilinxと外部デバイスを結ぶ信号は
基本的にラッチをはさんだほうがいいです。USBの場合、USBは非同期なので、ステートマシンの出力を直接RD信号につなげたりすると、予期せぬハザードが発生する可能性があります。
また、SRAMの場合、SRAMとの通信はおそらく高速に行いたい場合がほとんどだと思うので、SRAM、Xilinx間の信号はラッチをはさんだ方が高いスペックを出すことができます。
以上のような理由から、入出力にはラッチをはさむことを「強く」おすすめします。USB関連でバグがでる場合は、まず、ちゃんとラッチ出力、ラッチ入力になっているかどうか確認しましょう。
Xilinxのデータシートをよく読みこんでいる人なら別ですが、おそらくほとんどの人は、この問題にぶつかると思います。しかも、この問題は、回路規模が小さいうちは、
問題にならない(ようするに、回路規模が大きくなると発生する問題)のでますます厄介です。回路規模が大きくなるにつれて、
何らかの原因で(おそらく回路規模が大きくなるにつれて、SRAMの信号への出力遅延が大きくなってしまうのだと思います)SRAMとの通信がたまにバグる、という問題が発生することがあります。
解決方法を提示するまえに、まず、SRAMのホールドタイムについて説明しておきたいと思います。今回の基板の場合、SRAMのホールドタイムは0.5ns、つまり、
クロックが立ち上がってからは、0.5nsはデータを信号線上に保持しておかなければならないのです。今回の基板の設計だと、Xilinxから、SRAMへのクロックもSRAMへのデータも
だしてやる必要があるため、SRAMにクロックをだして0.5ns以内にデータ線やアドレス線の内容がかわってしまうとおかしいことになるのはわかると思います。
要するに、クロックだけ早くSRAMに流してやる必要があるのです。そのためには(後者はかなりアドホックな解決方法ですが)以下のような対策をとるとよいと思います。