fc2ブログ

[VEEK]カメラの映像を表示したい(6)(Niosシミュレーション)

SDカードI/FのSPIモードアクセス動作確認中。
NEEKと同じように回路構築したつもりだが、初期化でFail。
よく分からないのでシミュレーションしてみる。

自分でバッチ作って全回路コンパイルしてみた。
alt_vip_vfb、alt_vip_vfr、cpu.voで、width_eccstatus
とかいうパラメータでエラーになる。
各ファイルの対象エラー箇所を全てコメントアウトする事で
とりあえずコンパイル、LoadingパスしてSim開始するまでにはなった。
けど、SWコンパイル後、elfをシミュレーションで読み込むための方法が
分からない。
確か、NiosII IDEの時は、SWコンパイルすると、自動的にhexが
生成されて、それを読み込んでシミュレーション出来たんだが。
NiosII Eclipseになってからhex生成方法が分からん。

断念して、QsysでTestbenchファイルを生成するよう設定してから
NiosII Eclipseの
Run As > NiosII ModelSim
でシミュレーションする事にした。

(2012/1/5追記)
回路記述で、includeで下位moduleを呼び出してる箇所があり、
NiosII EclipseからModelSim起動すると、xxxが読めない、
と言われてエラーになる。
その回路と同フォルダや、プロジェクトフォルダ、Testbenchフォルダ
などあらゆる場所にincludeされるVerilogを置いてもエラーが
消えない。
良く分からないので、includeで呼び出さず、最初から全Verilogを登録すれば
良いと思い、対象のMMC_SPIを修正した所、Qsysでこんなエラー。

Error: System.MMC_SPI.avalon_slave_0: readdata[4] and writedata[32] must have the same width


身に覚えが無い。readdataもwritedataもちゃんと32bitになってるし・・・
成功した実績あるNEEKのavalonif_mmcdma_hw.tcl見たら、

add_interface_port avalon_slave_0 sdif_state readdata Output 4


こんな行が最後に追加されてた。その他いろいろ違いあり。
なぜこんな設定されてるのか?、をよくよく原因探ると、[4]が原因だった。

[1]各Verilog内のincludeで下位module呼び出し部をコメントアウト
[2]QsysのNew componentで、元々成功実績あったNEEKのtclをOpen。
   (Openする前に、バージョン重複しないように、1.0から1.1に変えた)
[3]このままだと、下位moduleがSynthesis用のみでありSimulation用
 になってないから、TOP以外の下位moduleもSimulation欄にチェック付ける。
[4]TOP MODULEの設定が空白だったので、ここで実際のトップmoduleを選択すると、
 なぜか問題の設定が自動的にされて、エラーとなってしまう。
[5]したがって、[4]を実行せずにFINISHとしたら、エラー無くなった。



MMC_SPI回路はModelSimで正常にLoadingされるようになったが、Niosカスタム命令で
使っている乗算器回路がLoadingエラー。

# ** Error: (vsim-3033) C:/user/work/veek/niosii-ethernet-standard-3c25/eth_std_main_system/testbench/eth_std_main_system_tb/simulation/submodules/custom_inst_yuv2rgb.v(161): Instantiation of 'MUL_9x9' failed. The design unit was not found.
# Region: /eth_std_main_system_tb/eth_std_main_system_inst/custom_inst_yuv2rgb_0


QuartusII > Assignments > Filesで追加しても、.qipへ追記してもダメ。

ModelSim起動後の最初のコマンドはこれ。

# Reading C:/altera/11.1sp1/modelsim_ase/tcl/vsim/pref.tcl
# do msim_setup.tcl
# eth_std_main_system_tb
# ./../


msim_setup.tclを探して、ここに最悪の場合、直接MUL_9x9.vを追記すれば上手く行くかも。
このファイルは、プロジェクトDIR以下こんだけあった。

62322 Jan 6 00:23 eth_std_main_system/simulation/mentor/msim_setup.tcl
16299 Sep 23 01:28 eth_std_main_system/simulation/msim_setup.tcl
70200 Jan 6 00:27 eth_std_main_system/testbench/mentor/msim_setup.tcl
81525 Jan 6 00:34 software/hoge/obj/default/runtime/sim/mentor/msim_setup.tcl


結果、下のtclファイルへ次のように追記したらLoading成功した。

software/hoge/obj/default/runtime/sim/mentor/msim_setup.tcl


追記したのは、2番目のMUL_9x9.vをコンパイルする記述。1番目のvlogは元々あったもの。
他を見ると、各module毎にworkフォルダ名を付けてるようだから、
指定したフォルダ名の識別子は「*_custom_inst_yuv2rgb_0」としている。

vlog "C:/user/work/veek/niosii-ethernet-standard-3c25/eth_std_main_system/testbench/eth_std_main_system_tb/simulation/submodules/custom_inst_yuv2rgb.v" -work eth_std_main_system_tb_custom_inst_yuv2rgb_0
vlog "C:/user/work/veek/niosii-ethernet-standard-3c25/MUL_9x9.v" -work eth_std_main_system_tb_custom_inst_yuv2rgb_0


これでLoading成功。

しかし、次なる問題を発見。
今回、外部SW入力で手動でリセットかけてるけど、この場合、Simulation時に使う
Testbenchへ手修正加えれば良いのかな?

(2012/1/7追記)
もう少しで希望のSimulationができそう。
今日は次の2つを修正。
 ・カスタムdoファイル(表示波形保存フォーマット)を読み込む。
 ・Testbenchに修正加え、現回路仕様通り、Simulation初期にSW[0]でリセットかける。

■カスタムdoファイル読み込み
前回同様、NiosII Eclipseのプロジェクトフォルダ内の以下tclを修正。

software/hoge/obj/default/runtime/sim/mentor/msim_setup.tcl



tcl内を見ると、以下のようにvsimでSimulation起動するコマンドが2つあった。

vsim -t ps \
-G/$TOP_LEVEL_NAME$SYSTEM_INSTANCE_NAME/...


両方に、-doオプションをこんなふうに追加した。
個人的に作ったdoファイルを読み込み、Simulation時間も100msと指定してる。

vsim -t ps \
-do "do setup/wave.do ; run 100 ms;" \
-G/$TOP_LEVEL_NAME$SYSTEM_INSTANCE_NAME/...


するとこんなWarning。

# Warning: Ignoring nested -do argument: "do setup/wave.do ; run 100 ms;"


doファイルのパスはテキトーなのでエラー出るのは納得だが、なぜか-doが無視されたとのこと。
このオプションふつーに使えたはずなのに。vsim -helpでもちゃんと存在してる。

「; run 100 ms ;」を削除したり、「do setup/...」を「setup/...」にしたり、
いろいろ試したけど上手く行かず。

# Warning: Ignoring nested -do argument: "setup/wave_started_from_niosii_eclipse.do ; run 100 ms;"

# ** Error: (vsim-3170) Could not find 'C:\user\work\veek\niosii-ethernet-standard-3c25\software\hoge\obj\default\runtime\sim\mentor\libraries\work.do setup/wave.do'.
# Error loading design

# ** Error: (vsim-3170) Could not find 'C:\user\work\veek\niosii-ethernet-standard-3c25\software\hoge\obj\default\runtime\sim\mentor\libraries\work.setup/wave.do ; run 100 ms;'.
# Error loading design


結局、ModelSim起動してから、doファイル読み込んでrunする事にした。

■Testbenchにリセット記述追加
っと思ったけど、Simulationしてみると、

eth_std_main_system/testbench/eth_std_main_system_tb/simulation/eth_std_main_system_tb.v


このTestbenchに書いてある、下の記述のとこで、自動的にリセット信号作ってた。

altera_avalon_clock_source #(
.CLOCK_RATE (50)
) eth_std_main_system_inst_clk_bfm (
.clk (eth_std_main_system_inst_clk_bfm_clk_clk) // clk.clk
);

altera_avalon_reset_source #(
.ASSERT_HIGH_RESET (0),
.INITIAL_RESET_CYCLES (50)
) eth_std_main_system_inst_reset_0_bfm (
.reset (eth_std_main_system_inst_reset_0_bfm_reset_reset), // reset.reset_n
.clk (eth_std_main_system_inst_clk_bfm_clk_clk) // clk.clk
);


初期リセットの件は解決したが、実際にSimulation進めてみると、BFMのせいか
かなり速度早く、50msくらいさくっと進む。(それとも新PCが爆速なのか)
しかし、50msも進んでるのに、一向にPLLがLOCKしない。なぜ?
FPGAのPLLのLock Up Timeって、けっこう長いんだっけ?
発振クロック安定まで、200msくらい時間かかるのかな。

Testbench見直すと、ALTPLLになぜかaresetピンが存在。そしてSimulation時はHiz。
Async Resetを追加した覚えはないので、Qsys構成を見直すと、Click to Exportを
間違って押したらしく、外部ポート用設定になってしまっていた。これが原因だ。やり直し。

aresetの外部ピン設定やめてQsysのGenerateし直したが、Simulationすると、
やっぱりPLL/aresetピンは存在して、これがHizになってしまう。
これって、ユーザが手作業でaresetを一度リセットさせないとダメなのか?

Testbenchへ以下を追記して、リセットかけてやる。


■eth_std_main_system/testbench/eth_std_main_system_tb/simulation/submodules/eth_std_main_system.v
module eth_std_main_system (
input wire altpll_0_areset,
------------------------------------------------------------------
■eth_std_main_system/testbench/eth_std_main_system_tb/simulation/eth_std_main_system_tb.v
integer i ;
reg pll_areset ;
wire clk_pixel_out_clk;

eth_std_main_system eth_std_main_system_inst (
.clk_pixel_out_clk (clk_pixel_out_clk),
.alt_vip_itc_0_vid_clk (clk_pixel_out_clk),
.altpll_0_areset (pll_areset),
------------------------------------------------------------------
initial begin
pll_areset = 1'b1 ;
for (i=0; i<10; i=i+1) @(posedge eth_std_main_system_inst_clk_bfm_clk_clk) ;
pll_areset = 1'b0 ;
end


すると、PLL/LOCKEDがHに上がり、NiosIIのプログラムMEM含め、動き出した様子。
PLL/areset入れて回路全体が動き出したので、Simulation速度が遅くなった。
やっぱりModelSim Starterらしく、10時間もSimulationしたけど200msもいかなかった。

Simulationやりきったら、28.493msあたりでエラーでSTOPした。

run 1000 ms
# Warning: read_during_write_mode_mixed_ports is assumed as OLD_DATA
# Time: 0 Instance: eth_std_main_system_tb.eth_std_main_system_inst.cpu.n01l01l
# Warning: read_during_write_mode_mixed_ports is assumed as OLD_DATA
# Time: 0 Instance: eth_std_main_system_tb.eth_std_main_system_inst.cpu.n01l1ll
# Warning! Number of metastability protection registers is not specified. Based on the parameter value CLOCKS_ARE_SYNCHRONIZED=FALSE, the synchronization register chain length between read and write clock domains will be 2.
# Time: 0 Instance: eth_std_main_system_tb.eth_std_main_system_inst.pixel_fifo.the_dcfifo_with_controls.the_dcfifo.dual_clock_fifo.DCFIFO_MW
# ** Warning: (vsim-3534) [FOFIR] - Failed to open file "../eth_std_main_system_sgdma_mmc_desc.hex" for reading.
# No such file or directory. (errno = ENOENT) : C:/altera/11.1sp1/modelsim_ase/win32aloem/../altera/verilog/src/altera_mf.v(782)
# Time: 0 ps Iteration: 0 Instance: /eth_std_main_system_tb/eth_std_main_system_inst/sgdma_mmc_desc/the_altsyncram
# ERROR: cannot read ../eth_std_main_system_sgdma_mmc_desc.hex.
# ** Warning: (vsim-7) Failed to open readmem file "../eth_std_main_system_sgdma_mmc_desc.ver" in read mode.
# No such file or directory. (errno = ENOENT) : C:/altera/11.1sp1/modelsim_ase/win32aloem/../altera/verilog/src/altera_mf.v(45222)
# Time: 0 ps Iteration: 0 Instance: /eth_std_main_system_tb/eth_std_main_system_inst/sgdma_mmc_desc/the_altsyncram
#
# This reference design requires a vendor simulation model.
# To simulate accesses to SDRAM, you must:
# - Download the vendor model
# - Install the model in the system_sim directory
# - `include the vendor model in the the top-level system file,
# - Instantiate sdram simulation models and wire them to testbench signals
# - Be aware that you may have to disable some timing checks in the vendor model
# (because this simulation is zero-delay based)
#
# Warning: read_during_write_mode_mixed_ports is assumed as OLD_DATA
# Time: 0 Instance: eth_std_main_system_tb.eth_std_main_system_inst.mmc_spi_0.SDIF_MEM_inst.altsyncram_component
# 0: INFO: eth_std_main_system_tb.eth_std_main_system_inst_clk_bfm.__hello: - Hello from altera_clock_source.
# 0: INFO: eth_std_main_system_tb.eth_std_main_system_inst_clk_bfm.__hello: - $Revision: #1 $
# 0: INFO: eth_std_main_system_tb.eth_std_main_system_inst_clk_bfm.__hello: - $Date: 2011/09/26 $
# 0: INFO: eth_std_main_system_tb.eth_std_main_system_inst_clk_bfm.__hello: - CLOCK_RATE = 50
# 0: INFO: ------------------------------------------------------------
# 0: INFO: eth_std_main_system_tb.eth_std_main_system_inst_reset_0_bfm.__hello: - Hello from altera_reset_source
# 0: INFO: eth_std_main_system_tb.eth_std_main_system_inst_reset_0_bfm.__hello: - $Revision: #1 $
# 0: INFO: eth_std_main_system_tb.eth_std_main_system_inst_reset_0_bfm.__hello: - $Date: 2011/09/26 $
# 0: INFO: eth_std_main_system_tb.eth_std_main_system_inst_reset_0_bfm.__hello: - ASSERT_HIGH_RESET = 0
# 0: INFO: eth_std_main_system_tb.eth_std_main_system_inst_reset_0_bfm.__hello: - INITIAL_RESET_CYCLES = 50
# 0: INFO: ------------------------------------------------------------
# 0: INFO: eth_std_main_system_tb.eth_std_main_system_inst_reset_0_bfm.reset_assert: Reset asserted
# Note : Cycloneive PLL was reset
# Time: 0 Instance: eth_std_main_system_tb.eth_std_main_system_inst.altpll_0.eth_std_main_system_altpll_0_eth_std_main_system_altpll_0_altpll_hdh2_sd1_cycloneive_pll_pll7_148
# Note : Cycloneive PLL locked to incoming clock
# Time: 250000 Instance: eth_std_main_system_tb.eth_std_main_system_inst.altpll_0.eth_std_main_system_altpll_0_eth_std_main_system_altpll_0_altpll_hdh2_sd1_cycloneive_pll_pll7_148
# 990000: INFO: eth_std_main_system_tb.eth_std_main_system_inst_reset_0_bfm.reset_deassert: Reset deasserted
# 28489565 ns: WARNING: eth_std_main_system_cpu_test_bench/A_wr_data_unfiltered is 'x'
# 28490615 ns: WARNING: eth_std_main_system_cpu_test_bench/A_wr_data_unfiltered is 'x'
# 28491165 ns: WARNING: eth_std_main_system_cpu_test_bench/A_wr_data_unfiltered is 'x'
# 28493315 ns: WARNING: eth_std_main_system_cpu_test_bench/A_wr_data_unfiltered is 'x'
# 28493390 ns: WARNING: eth_std_main_system_cpu_test_bench/A_wr_data_unfiltered is 'x'
# 28493415 ns: ERROR: eth_std_main_system_cpu_test_bench/E_valid is 'x'
# Break in Module eth_std_main_system_cpu_test_bench at C:/user/work/veek/niosii-ethernet-standard-3c25/eth_std_main_system/testbench/eth_std_main_system_tb/simulation/submodules/eth_std_main_system_cpu_test_bench.v line 614



何かヒントがありそうだが、並行して見直してたらLCD800x600用のSGDMAディスクリプタ
になってなかった事に気付き、そちらを実機デバッグ中。
スポンサーサイト



カレンダー
12 | 2012/01 | 02
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31 - - - -
累積訪問者
現在の訪問者
現在の閲覧者数:
最新記事
最新トラックバック
最新コメント
月別アーカイブ
カテゴリ
プロフィール

bobgosso

Author:bobgosso
FPGAのブログへようこそ!

検索フォーム
RSSリンクの表示
リンク
ブロとも申請フォーム

この人とブロともになる

QRコード
QRコード