FC2カウンター FPGAの部屋 DDR SDRAMコントローラのシミュレーション2(シミュレーションスクリプト)
FC2ブログ

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

FPGAの部屋

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

DDR SDRAMコントローラのシミュレーション2(シミュレーションスクリプト)

今度はStart Simulationしてシミュレーションしてみよう。ModelSimのGUIを使いながら、それを参考にして便利なDOファイルを作っていく。
まずはSimulateメニュー -> Start Simulation...を選択する。
DDR_SIM_18_061105.png

Start Simulationダイアログが開くのでworkライブラリの+をクリックして展開する。
workライブラリの中のddrtest_sim_top_cfgを選択する。
Resolutionをpsに指定する。
これでOKボタンをクリックする。
DDR_SIM_19_061105.png

そうするとシミュレーションがスタートし、デザインがロードされて下のような画面になったと思う。
DDR_SIM_20_061105.png

ここでTranscriptペインの表示をコマンド発行時点まで戻してみよう。そうすると
vsim -t ps work.ddrtest_sim_top_cfg
というコマンドを発行しているのがわかると思う。
シミュレーションのスクリプトを記述するファイルをsim.doという名前でテキストエディタで新規作成してこのコマンドを追加しよう。
DDR_SIM_21_061105.png

次にWaveウインドウを表示しよう。Viewメニュー -> Debug Windows -> Waveを選択。
DDR_SIM_22_061105.png

Waveウインドウが開く。Transcriptペインにはview waveコマンドが発行されているのがわかる。
DDR_SIM_23_061105.png

view waveコマンドもsim.doに追加する。Objectペインで右クリックしてAdd to Wave -> Signals in Regionを選択する。
DDR_SIM_24_061105.png

waveウインドウにテストベンチのsignalが追加される。実行コマンドはadd wave sim:/testbench/*だが、ここは別の方法でスクリプトを記述したほうが良いのでsim.doには追加しないことにする。
DDR_SIM_25_061105.png

waveウインドウをクリックしてから、Fileメニュー -> Saveを選択する。
DDR_SIM_26_061105.png

Save Formatダイアログが開く。Waveウインドウのフォーマットをwave.doとしてセーブするためにOKボタンをクリック。
DDR_SIM_27_061105.png

これでwave.doファイルに監視する信号をwaveウインドウに追加するコマンドが書かれた。wave.doの一部を紹介すると下のようになる。

onerror {resume}
quietly WaveActivateNextPane {} 0
add wave -noupdate -format Logic /testbench/clk
add wave -noupdate -format Logic /testbench/reset
add wave -noupdate -format Literal /testbench/lcd_d
add wave -noupdate -format Logic /testbench/lcd_rs
add wave -noupdate -format Logic /testbench/lcd_rw


waveウインドウに信号を追加するスクリプトをsim.doで使うためにsim.doにdo {wave.do}を追加する。
15usシミュレーションするためにTranscriptペインでrun 15usを入力すると15us間シミュレーションすることが出来る。さらにsim.doにも追加しよう。
DDR_SIM_28_061105.png

シミュレーション後のwaveウインドウを示すとカーソルの後ろがDDR SDRAMリードなのだがXになって赤くなっている部分がある。これがなぞである。
DDR_SIM_29_061105.png

Writeの時に1000とEFFFを書き込んでいる。(ちなみにRadixをHexadecimalに変更してある)
DDR_SIM_30_061105.png

だがReadの時にはXXXXと1000が読めてしまう。これは明らかにおかしい。
DDR_SIM_31_061105.png

MicronのVHDLモデルでやった時にはちゃんと1000とEFFFが読めたのだが。。。
DDR_SIM_31_061105.png

これはどうしてそうなのかわからないが、1つ考えられるのはエルピーダ社のDDR SDRAMの使い方のマニュアルの62ページの図8-4 ライト・サイクルでTdqssのminとmax値での違いが書いてある。FMFのDDR SDRAMのVHDLモデルはTdqssのminで出来ているとするとつじつまが合うと思うのだがどうだろうか?
今のところFMFのDDR SDRAMのVHDLモデルをデバックする気はないのでこれまでとする。何か気がついたとことがあったら教えてください。
今回の方法ではなく違う方法で正しくシミュレーションしようと思っている。それはまた後ほど。。。

話を戻すとsim.doのすべてはこうなった。

vsim -t ps work.ddrtest_sim_top_cfg
view wave
do {wave.do}
run 15us


これでコンパイルする時にはTranscriptペインでdo compile.do、シミュレーションする時にはdo sim.doすればよい。
更に下に示す様ににall.doをつくりdo all.doするとコンパイルしシミュレーションする。

do {compile.do}
do {sim.do}


さらにもう1つ。信号を追加した時に再度シミュレーションするスクリプトresim.doも作ってはどうか?

restart -f
run 15us



(2010/01/29:追記)
g14さんからメールで情報をいただきました。その一部を貼っておきます。g14さん、情報ありがとうございました。

VHDLのシミュレーションがうまくいかないとの事ですが。。。
(以下、すでにお気づきかもしれません)

TdqssはDDRのグレードによっては0.75~1.25xTckになります。
設計ではTdqss=1.25xTckとなっていて、これに対してはギリギリのようです。

ちなみに、テストベンチを次のように変更して
sdram_clk <= transport ddr_clk after 3 * delay_time;
sdram_clkb <= transport ddr_clkb after 3 * delay_time;
無理やりTdqss=Tckとすると正しく動作しました。
同様にしてざっと調べたところ、モデルはTdqss=0.8xTck, 1xTckでは動作しますが、
1.1xTckでは動作しませんでした。

以上、ご参考まで。

  1. 2006年11月05日 13:41 |
  2. シミュレーション
  3. | トラックバック:0
  4. | コメント:0

コメント

コメントの投稿


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

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