Processor Experiment -- 注意点

 ここでは、筆者がCPU実験を行っていく上でぶつかった問題などを紹介します。2003年度から導入されたCPU実験基板を使っていく上で 避けては通れないと思われる問題も紹介しているので、もしCPUを作っていく上で問題にぶちあたったら参照してください。ただ、ここに 書いている解決法よりもよい解決法は当然存在すると思うので、鵜呑みにしないようお願いします。また、調べたらすぐわかることも乗せていません。 資料の紹介にとどめています。
 また、内容が間違っていたり、わかりにくい点があったら訂正していきたいと思うので、メールや掲示板で知らせていただけるとすごくありがたいです。

50MHzで動くデザインを作成したいが・・・(2004/03/20)

 オシレータは50MHzで動いているので、どの班もひとまず目標は50MHzで動くデザインを作成することだと思います。そのためには、 FF-FF間などの、すべての同期エレメント間のパスが20nsに収まっている必要があります。この大体の値は、Synthesisが終わった時点で表示されます。 それで、PARが終わったあとにちゃんとした値がわかるわけですが、デザインが大きくなっていくと、20nsをこえてしまいます。MaximumFrequencyとかいう感じで 動作可能な周波数が表示されると思いますが、そこを見てみると、50MHzでうごかなくなっちゃうことがわかります。
 そうなってしまったら、制約をかけてみましょう。CADは、何も制約を与えないと、あまり最適化をかけずにコンパイルします。つまり、クリティカルパスの ことなど何も考えていないのです。だから、デザインが小さいうちは、要求されたスペックを満たす回路が生成されますが、回路が大きくなるに つれて、要求スペックを満たせなくなります。そのため、CADに対して、「50MHzでうごくような回路(20nsにパスが収まるような回路)を作ってちょうだい」 と指示する必要があります。そのために、「制約」をかけます。具体的には、ucfファイルに、

などと記述してあげればよいです。CLKネットには、IPADとBUFG間のネットに指定することができます。
また、他にも、特定のパス間の遅延を指定するTIMESPEC制約というのもあり、高度なタイミング制約をかけるときには必要になります。詳しいことは、制約ガイドを見てみてください。

I/OはFFをはさもう(2004/03/20)

 プロセッサ単体では、外と通信することもできないので、実験で作るプロセッサは、当然USBやSRAMと通信することになります。そのとき、Xilinxと外部デバイスを結ぶ信号は 基本的にラッチをはさんだほうがいいです。USBの場合、USBは非同期なので、ステートマシンの出力を直接RD信号につなげたりすると、予期せぬハザードが発生する可能性があります。 また、SRAMの場合、SRAMとの通信はおそらく高速に行いたい場合がほとんどだと思うので、SRAM、Xilinx間の信号はラッチをはさんだ方が高いスペックを出すことができます。
 以上のような理由から、入出力にはラッチをはさむことを「強く」おすすめします。USB関連でバグがでる場合は、まず、ちゃんとラッチ出力、ラッチ入力になっているかどうか確認しましょう。

SRAMとの通信がたまにバグる(2004/03/20)

 Xilinxのデータシートをよく読みこんでいる人なら別ですが、おそらくほとんどの人は、この問題にぶつかると思います。しかも、この問題は、回路規模が小さいうちは、 問題にならない(ようするに、回路規模が大きくなると発生する問題)のでますます厄介です。回路規模が大きくなるにつれて、 何らかの原因で(おそらく回路規模が大きくなるにつれて、SRAMの信号への出力遅延が大きくなってしまうのだと思います)SRAMとの通信がたまにバグる、という問題が発生することがあります。
 解決方法を提示するまえに、まず、SRAMのホールドタイムについて説明しておきたいと思います。今回の基板の場合、SRAMのホールドタイムは0.5ns、つまり、 クロックが立ち上がってからは、0.5nsはデータを信号線上に保持しておかなければならないのです。今回の基板の設計だと、Xilinxから、SRAMへのクロックもSRAMへのデータも だしてやる必要があるため、SRAMにクロックをだして0.5ns以内にデータ線やアドレス線の内容がかわってしまうとおかしいことになるのはわかると思います。 要するに、クロックだけ早くSRAMに流してやる必要があるのです。そのためには(後者はかなりアドホックな解決方法ですが)以下のような対策をとるとよいと思います。

前者は、I/Oピンのドライブ能力をあげて、より早く信号が外に出られるようにするための設定です。これで、他の信号よりも早くSRAMへクロックが送られるようになります。 また、後者は、SRAMへのクロックを90度分早めることによって、問題を解決しようとする方法です。どちらかためして、動く方を採用するとよいと思います。
それでも問題が解決していないときは、SRAMへの出力、SRAMからの入力に用いているラッチが、すべてIOB内にあるか確認してみましょう。FPGAエディタなどで見てみるとわかると思います。 もし、IOB以外の、CLBのFFからSRAMへ出力されていたりすると、フィッティング毎に遅延が変わってしまい、バグの原因になります。高速デザインを目指すためにも、 きちんとIOBのFFが使われているかを確認するようにしましょう。IOB内のFFを使うようにするためには、xcfファイルに項目を追加してやればオッケーです。くわしくは、制約ガイドを見てください。