一応、GPIB IPのコーディングは終わって、シミュレーションを開始した。
最新のレジスタ仕様を以下に示す。
コントローラがバスに送るメッセージ用のFIFOを追加した他、レジスタ名がRCV、RX、TX等統一感のない命名の仕方をしてしまっていたので修正した。また、シリアルポール用のステータスデータ用にLINEレジスタ内に8bitのフィールドを設けていたが、規格によればデータは複数バイトも可とあるので、LINEレジスタは止めてトーカ用データFIFOを使うことにした。
各モジュールのRTLは以下の様になった。
・トーカモジュール
今回、このIPは50MHzのクロックで動作させようと考えているがGPIB バスのデータセットアップ等のタイミングは200ns以上と50MHzに比べると遅い。これに対応するため、前回は10MHz相当のイネーブル信号を作り、それに同期してトーカやリスナモジュールを動作させようと考えていたのだが、その方式は止めてセットアップ時間確保用のカウンタ c_setup を実装してタイミングを作ることにした。
・リスナモジュール
・レジスタ、コントローラモジュール
トーカ、リスナモジュールが物理層のプロトコルを担当しているとすると、このモジュールはデータリンク層を担当すると言えるかも知れない。個人的な趣味としては上位から読み書きされるレジスタ部と制御部は別モジュールにしたいところだが、GPIBの場合、そういう組み方だと作り辛いと感じる。そのため、現状こうなっている。
いつもの様にテストベンチを作ってシミュレーションを始めた。
テストベンチでは、GPIB IPとSN75160B、SN75161Bのモデルの組を1単位(STATION)として、これが4つGPIBバスに接続されている環境を作った。
以下は、LINEレジスタからのユニラインメッセ時と、マルチラインメッセージを確認している。ここではSTATION 1をコントローラとして動作させている。
各IPにアドレスを設定した後、コントローラ(STATION1)のLINEレジスタからIFC、REN等のユニラインメッセージ(またはコマンド)を発生させ、次にUNT、LA、SDC等のマルチラインメッセージを送信している。マルチラインメッセージではLA(リスナ指定)でSTATION2~4を順番に指定しているが、規格上バス上には複数のリスナが存在できIPの動作もそうなっていて問題ない。一方、トーカは1つしか存在できないが、波形では自局がトーカであることを示すtlk_enが順に1になっていて同時に1になっていないでのこれも問題ない。リスナ、トーカの設定を解除するメッセージSDC, DCLに対する動作も規格どおりで問題ない。
上記のテストベクタを以下に示す。
write_to_register ... 等はverilogのタスクで以下の様に記述している。
次はシリアルポールの動作を見てみた。
ベクタは以下のとおり
以下が結果
黄色い縦線の左側はアドレス設定やポーリングデータの設定等の準備部分であり、右側がシリアルーリングを実行している部分である。その部分を拡大したのが以下である。
STATION2~4にそれぞれ、2、3、5バイトのポーリングデータを設定しているが、ちゃんと全数転送されているので、問題なさそうである。