FC2カウンター FPGAの部屋 キャラクタ・ディスプレイ・コントローラをAXI4スレーブにする3(BFMシミュレーション)
FC2ブログ

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

FPGAの部屋

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

キャラクタ・ディスプレイ・コントローラをAXI4スレーブにする3(BFMシミュレーション)

キャラクタ・ディスプレイ・コントローラをAXI4スレーブにする2(Pcoreテンプレート生成)”の続き。

最終的にはXPSのAXI4バスのカスタム・スレーブIPを作るのが目的なのだが、XPS上でのシミュレーションは全体のシミュレーションとなってコストが高い。よって、その前にAXI4バスの接続をするHDLファイルレベルで単体テストを行った。

まずは、カスタム・スレーブIP(pcore) のトップのVHDLファイル、CDC_axi_slave.vhd を作成して、それをトップとするProject Navigator のプロジェクトを作成した。その際に、Digilent社のDVI信号出力用のVHDLファイルをプロジェクトに入れたが、digilentライブラリだと面倒なので、workライブラリに変更した。これは、下位モジュールのインスタンス部分のdigilentをworkに変更し、DVITransmitter.vhd のlibrary digilent; をコメントアウトした。
更に、テストベンチ (CDC_axi_slave_tb.v) を作成した。これは、taskを使うためにVerilogで記述した。
下に作成したProject Navigator のプロジェクトを示す。
CDC_axi_slave_6_120302.png

テストベンチには、AXI4のマスタ・デバイスの簡単なBus Function Model(BFM) を記述してある。AXIバスのBFMはXilinx社から提供されているが、別オプションとなっていて料金を払わないと使用できない。そのため、簡単なテスト用のtask を自分で書いたわけだ。メーカー製のBFMは良く出来ているので、それを使用するために理解するのが難しいが、自分で作ったBFMならば、それも心配ない。その代わり、自分が勘違いしているとそれを検証することができない。本来は他人に作ってもらうのが良いのだが、そうも言ってられない。
とりあえず、AXI4マスタのWrite側だけできたのシミュレーションをやってみることにした。

さて、そのままISimでシミュレーションすると、コンパイルは通ったのだが、シミュレーション実行時にエラーになってしまった。PLLのAttribute Syntax Error だそうだ。
CDC_axi_slave_5_120301.png

これは、”DVI、HDMIの勉強4(キャラクタ・ディスプレイ・コントローラをDVI出力にする VHDL編1)”のdvi_disp.vhd を修正することにより回避できた。具体的には、

・PLL_BASE の RESET_ON_LOSS_OF_LOCK をComponent宣言とインスタンス部分でコメントアウトした。
・BUFPLL の ENABLE_SYNC をComponent宣言とインスタンス部分でコメントアウトした。


上記2つの対策を取ったら、シミュレーション実行時のエラーは回避できた。インプリメントはできるのに、どうしてだろうか?

下にバグフィックス後のシミュレーション波形を示す。S_AXI_AWLENを4に設定してしまったので、5バーストとなっている。4バーストに設定するつもりで間違ってしまった。
CDC_axi_slave_7_120302.png

今のところ、簡易AXIバス・マスタBFM もカスタム・スレーブIPも動いているようだ。簡易AXIバス・マスタBFM の機能的にバースト時のWaitはかけられない仕様だ。

次に、単発のトランザクションを下に示す。この場合は、Write Responce Channel の応答を1クロック遅延してある。
CDC_axi_slave_8_120302.png

Write Responce Channel の応答を数クロック遅延する機能は付けてあるのだが、データをバースト中のWait挿入機能はつけていない。どうやってサポートすれば良いか?考え中だからだ。
task に何番目がどのくらいWaitと入力するのではなく、後ろに擬似的な回路を作って、それのレイテンシやスループットを変更できるようにした方が良いと思う。

次は、Write Address Channelがオーバラップしている状態のシミュレーション結果。今回のAXI4バス・スレーブはオーバーラップに対応していないので、トランザクションが終了するまでWaitさせる。
CDC_axi_slave_9_120302.png

AXI4バスの簡易BFMは、データ・バースト時のWaitの入れ方とS_AXI_AWSIZEが2のみ対応(32ビット幅バス)という欠点があるが、とりあえずはこれで行こうと思う。
すぐにRead 側のAXI4バスのBFMを作ろうと思う。

(修正)タイミングチャート図のS_AXI_AWCACHEの値を2 (Normal Non-cacheable Non-bufferable) に変更した。
  1. 2012年03月02日 05:46 |
  2. AXI4 Slave IPの作製
  3. | トラックバック:0
  4. | コメント:4

コメント

自作BFMいいですね。XilinxのAXI-BFMは\75,000だそうです。(見積もりだけ取った)
こちらはBFMのようなものは作成せずに、MIGで生成したAXI仕様のMCBを相手にしてテストしています。
結局AXIのマスタIPは自作せずにAXI DataMoverというIPをマスタとして使用しています。

実装時とシミュ時のコンパイル結果の違いはコンパイラ(パーサー?)の違いによるようです。
これにも結構泣かされますよね。
ISimのfuseではベクタの配列に対して、
vec_array <= ( others => (others => '0') );
のような代入をすると「Internal Compiler Error」が出ます。
LRMをちゃんと理解しているわけでは無いのですが、この代入は問題ないはずですよね?

あと、DataMoverのIPはCoreGenで生成したのですが、これがISimのfuseでコンパイルエラーになってしまいました。
VHDLなのですが、コンパイル順を無視して上位モジュールから順にコンパイルするような設定になっていて、下位モジュールが見つけられずにエラーになっていました。
これはCoreGen生成ソース一式を特定ライブラリに手動で追加する事で対策しました。

バッドノウハウ溜まりまくりです(ストレスも)
  1. 2012/03/02(金) 14:45:37 |
  2. URL |
  3. windy #-
  4. [ 編集 ]

Windyさん、大変でしたね。でも、まだ解決策が見つかって良かったですね。解決策がない場合は途方に暮れることもあります。
たぶんどこのツールもバグはあると思うので、バグを楽しみ(にできないかもしれないですが)ましょう。バグ取りアドベンチャーゲームと思って楽しんではどうでしょうか?正解がないかもしれないところが怖いかもしれませんがね。。。
  1. 2012/03/02(金) 20:25:53 |
  2. URL |
  3. marsee #f1oWVgn2
  4. [ 編集 ]

業務で無ければそれなりに楽しいのですけどね
ツールのせいにする言い訳っぽくなって、お客さんに説明するのが大変です。

AXIのBFMは各チャンネルのオーバーラップを考え出すと結構大変であきらめました。
この辺もがんばってだんだん使い物になって行くと楽しいのですが
業務で無 (ry....
  1. 2012/03/02(金) 21:39:18 |
  2. URL |
  3. windy #-
  4. [ 編集 ]

そうですよね。仕事でなければ。。。納期が決まっていて、後ろズレできないとキツイですよね。私も民間にいたことがあるので、わかります。徹夜が当たり前になってしまいますね。適当に頑張ってください。あまり頑張り過ぎると燃え尽きます。
ツールがバグバグのことをわかってくれるお客さんだったら良いのですが、そういうかたばかりはいないでしょうから、大変ですね。。。

私は、今は余裕があるので、家でバグ出しをして、仕事に使う。使うときにはブラッシュアップされているので、すんなり動作。あっけないほど。。。というのを目指しています。
  1. 2012/03/02(金) 21:59:58 |
  2. URL |
  3. marsee #f1oWVgn2
  4. [ 編集 ]

コメントの投稿


管理者にだけ表示を許可する

トラックバック URL
http://marsee101.blog.fc2.com/tb.php/2078-d938cff5
この記事にトラックバックする(FC2ブログユーザー)