FC2カウンター FPGAの部屋 2006年01月13日
FC2ブログ

FPGAやCPLDの話題やFPGA用のツールの話題などです。 マニアックです。 日記も書きます。

FPGAの部屋

FPGAの部屋の有用と思われるコンテンツのまとめサイトを作りました。Xilinx ISEの初心者の方には、FPGAリテラシーおよびチュートリアルのページをお勧めいたします。

Xilinx 社製FPGA を搭載したPCI ボードのシミュレーション2

4.NI FPGA回路全体のシミュレーション
 機能シミュレーションが終了したら、今度は全体の機能モジュールを接続して、NI FPGA回路を完成させる。今度はNI FPGA回路全体のシミュレーションをすることになる。ここでの全体のシミュレーションは、すべてシミュレーション・ツール(ModelSim)上で仮想的に行い、実際の電気的な回路は全く使用しない。
 全体シミュレーションの最初の段階では、HDL Bencherを使用して、基本的な機能を確認する。シミュレーションが進んでいくと、機能を確認する際に比較的長いシークエンスを必要とするものが出てくる。例えば、PCIバスの初期化処理などである。その初期化処理をしないとNI FPGA回路の機能を確認することが出来ない。よって、HDL Bencherで確認するのは困難である。そこで、各周辺デバイスのモデルを作製して、シミュレーションすることにした。
 2つのNIをLVDSチップを省いたLVDSインターフェース同士で対向接続して、全体シミュレーションをする。そのために、各デバイスの動作をシミュレーションするモデルをNI FPGA回路に接続した。各モデルはVHDLで書かれている。FLASH ROMモデルは、チップの製造会社である富士通(株)のモデルを使用した。SDRAMモデルは自分で作製したが、64Mbyteの容量では、シミュレータが異常終了してしまったので、256byteまで容量を減らした。PowerPCモデルとPCIバスモデルは、それぞれ複雑なシーケンスを必要とするので、どう実装するか迷ったが、実行させる1動作をテキスト1行で指定する方式にした。それぞれのモデルはテキストに書かれたコマンドを順次実行する。CPLDは余り全体の動作に関係ないので省いた。ブロック図を図4に示す。
sim_zu4_060113.png

図4 2つのNIを対向接続したシミュレーション

 4.1 PCIバスモデル
 PCIバスモデルは、PCIバスをシミュレートするPCIバス・プロトコルモデルと、PCIターゲット・コマンドプロセッサに分けられる。PCIバスモデルのブロック図を図5に示す。
sim_zu5_060113.png

図 5 PCIバスモデル ブロック図

PCIバス・プロトコルモデルにはPCIのプロトコルが記述してある。また、簡単なPCIバス・アービタを持っている。そのPCIバス・アービタはNI FPGA回路のPCIマスタアクセスとホストパーソナルコンピュータ(ホストPC)からのPCIバスアクセス(NI FPGA回路からはPCIターゲットアクセス)を切り分ける。通常は、ホストPCのグラント(バスの使用許可)がアサートされていて、ホストPCからのPCIターゲットアクセスにPCIバス・プロトコルモデルがすぐに応答できる状態にある。NI FPGA回路のPCIマスタアクセスの場合は、PCIバス・アービタに要求を送り、許可された場合にPCIマスタアクセスを行う。PCIターゲット・コマンドプロセッサは、ホストPCのPCIターゲットアクセス用のモデルである。それは、テキストファイルのコマンドをVHDLのTEXTIOライブラリのルーチンで読み込んで、PCIターゲットアクセスを発生させる。コマンドの一例を下に示す。

0 ns 00000010 0 11 3000000020000000 1 0 # SDRAM - 0x20000000, NB – 0x30000000

 最初のフィールドの0 nsは遅延時間を表す。このコマンドを実行する時間間隔を表す。2番目の00000010は16進数で表されたアドレスを表す。3番目の0はデータの書き込みを表す。1のときは読み込みである。4番目の11はデータ幅を表し、この値はロングワード(64bitデータ)を表す。その他に、バイト(8bit)、ショートワード(16bit)、ワード(32bit)の指定が出来る。5番目の3000000020000000は書き込むデータを表す。データの読み込みの場合はこのフィールドは無視される。6番目の1はPCIのコンフィギュレーション・アクセスである。0の場合は通常のメモリアクセスとなる。尚、NIはIOアクセスをサポートしないので、IOアクセスに関するフィールドは無い。7番目の0は、STOP信号のアサートに関するフィールドで、1にすると、次のクロックでSTOP信号をアサートして、PCIバスのトランザクションが停止する。なぜこのようなフィールドを設けたかというと、実際のホストコンピュータは頻繁にSTOP信号をアサートして、PCIバストランザクションを停止している。そのシミュレーションのためにSTOP信号アサート用のフィールドを設けている。
このようにコマンドを順次実行することで、ホストコンピュータとNI間のやり取りをシミュレーションすることが出来る。

 4.2 PowerPCプロセッサモデル
PowerPCプロセッサは、アドレス転送とデータ転送が分かれている。データ転送にかかわらずにアドレス転送は2つの転送を完了できる。データ転送はアドレス転送の順番を守って、転送を行う。例えば、アドレス4への読み込みのアドレスを送ってデータを読みだす前に、次のアドレス転送、アドレス8への書き込みのアドレスを転送できる。その後、データ転送はアドレス4への読み込み、アドレス8への書き込みを順序を守って実行される。
 PowerPCプロセッサモデルのブロック図を図6に示す。
sim_zu6_060113.png

図 6 PowerPCプロセッサモデル ブロック図

PCIバスモデルと同様に、テキストファイルのコマンドを1行ずつPowerPCコマンドプロセッサが解析し、PowerPCバスコマンドとして、2つのPowerPCバス・プロトコルモデルに送る。2つのPowerPCバス・プロトコルモデルは、あらかじめマスタデバイスとスレーブデバイスが決められている。PowerPCバス・プロトコルモデルは1つのアドレス転送とそれに続くデータ転送を担当する。実際の動作は、読み込みの場合はデータ転送のアクノリッジを返すだけだが、書き込みの場合はデータ転送時にコマンドで指定されたデータを用意する。マスタのPowerPCバス・プロトコルモデルが動作中の時は、スレーブが動作を開始する。下にPowerPCのコマンドの例を示す。

0 ns 40000050 0 8 1000000000000000

最初の0 nsはPCIバスの場合と同様に、遅延時間を表す。2番目の40000050は16進数で表された番地を示す。3番目の0は書き込みを表す。1の時は読み込みとなる。4番目の8はデータ転送のサイズを表し、ロングワード(64bit)を示す。9はバイト、Aはショートワード(16bit)、Cはワード(32bit)、2はバースト転送(4beat)を表す。最後の5番目は書き込むときのデータを表す。このデータは読み込みの時には無視される。

5.まとめ
 私の場合、回路を作製しただけで、動作することは100%ありえない。よって、回路のシミュレーションは欠かせない。比較的大規模な回路を作成する場合には、機能モジュール単位でシミュレーションし動作を確認してから、機能モジュールを相互に接続し全体シミュレーションを行う。
 Xilinx社のデバイスを使用して機能モジュール単位でシミュレーションする場合には、HDL Bencherを使用してVHDLのテストベンチを作製し、ModelSimでコンパイル後シミュレーションを行う。HDL Bencherを使用した全体シミュレーションでは、出力信号と入力信号に依存関係のある場合は、HDL Bencherで入力波形を作成するのが難しい。よって、各デバイスのモデルを使用して全体シミュレーションを行うことにした。モデルのうち、マスタとなるデバイスはテキストファイルに書かれたコマンドで動作を記述する方式にした。これが、一番複雑な動作を表現するのが容易であると考えたからである。現在、実機の動作を解析しておかしいタイミングを発見した時に、今回作製した全体シミュレーションを使用し、バグの発見に役立てている。
 欠点としては、PCIバスモデル、つまりホストコンピュータのモデルが簡単すぎる点である。実際のホストコンピュータは、都合によって頻繁にPCIバスの転送を止めたり、NIの転送要求に対して応答が遅い時がある。実際の回路動作のすべてをシミュレーションでモデル化できないので、すべてのバグをシミュレーションによって発見することはできない。

参考文献
[1]Xilinx Inc. , "Xilinx ISE 6 Software Manuals", 2003
[2]Model Tecnology Inc. , "ModelSim 5.6リファレンスマニュアル", 1999-2002

---------------------------
2部作になりました。
そういえばISE8.1が出てましたね。なんかかっこよくなってました。それにFPGA Editorが付くようになりました。これでIOBとかの解析やディレイも一発で見えますね。本当に良かったと思います。
  1. 2006年01月13日 20:30 |
  2. シミュレーション
  3. | トラックバック:0
  4. | コメント:2