FC2ブログ

[veritak]トラブルシューティング

シミュレーションが1usから進まない
ログに以下が出てた。

Note : Cyclone IV E PLL self reset due to loss of lock
Time: 0.0 ns Instance: tb_ether_top.uut.ether1.pll_ddr.altpll_component.cycloneiii_pll.pll3
Note : Cyclone IV E PLL locked to incoming clock
Time: 90.0 ns Instance: tb_ether_top.uut.ether1.pll_ddr.altpll_component.cycloneiii_pll.pll3
Note : Cyclone IV E PLL was reset
Time: 990.0 ns Instance: tb_ether_top.uut.ether1.pll_ddr.altpll_component.cycloneiii_pll.pll3
Note : Cyclone IV E PLL self reset due to loss of lock
Time: 990.0 ns Instance: tb_ether_top.uut.ether1.pll_ddr.altpll_component.cycloneiii_pll.pll3

リセット期間を延ばしたらPLLからクロック出力出るようになったから、PLLリセット期間が短かったって事かな。



シミュレーションが0nsから進まない
ddr2c回路を追加するとこうなる。
試しにddr2c/phy_newをコメントアウトしたら0nsから進んだので、このモジュールが原因。
さらにddr2c/phy_new/outifをコメントアウトしたら0nsから進んだので、このモジュールが原因。
さらにddr2c/phy_new/outif/ALTPLL_ddr_readをコメントアウトしたら0nsから進んだので、このモジュールが原因。

NEEK用に使ってた回路を流用したので、おそらくALTPLL_ddr_readはCyclone III用のVerilogソースになっている事が問題みたい。
DE2-115用(Cyclone IV E)用に作ったPLLを使ったらシミュレーションは動いた。




コンパイルが途中で止まる(1)

誤: `ifdef `HOGE
正: `ifdef HOGE

こんな間違いすると、途中で止まったような終わり方する。


コンパイルが途中で止まる(2)

C:\・・・\fpga\common\rtl\ddr2c_intel\sdramc_define.v(425):: Warning: Re-defined macro TPAT_W
C:\・・・\fpga\common\rtl\ddr2c_intel\sdramc_define.v(426):: Warning: Re-defined macro TPAT_VAL
C:\・・・\fpga\lattice\rtl\system_conf.v(2):: Warning: Re-defined macro LATTICE_FAMILY
C:\・・・\fpga\lattice\rtl\system_conf.v(3):: Warning: Re-defined macro LATTICE_FAMILY_EC
C:\・・・\fpga\lattice\rtl\system_conf.v(4):: Warning: Re-defined macro LATTICE_DEVICE
C:\・・・\fpga\common\rtl\i2c_master_defines.v(56):: Warning: Re-defined macro I2C_CMD_NOP
C:\・・・\fpga\common\rtl\i2c_master_defines.v(57):: Warning: Re-defined macro I2C_CMD_START
C:\・・・\fpga\common\rtl\i2c_master_defines.v(58):: Warning: Re-defined macro I2C_CMD_STOP
C:\・・・\fpga\common\rtl\i2c_master_defines.v(59):: Warning: Re-defined macro I2C_CMD_WRITE
C:\・・・\fpga\common\rtl\i2c_master_defines.v(60):: Warning: Re-defined macro I2C_CMD_READ

ここで止まる。

原因は不明だが、解決方法として、テストベンチにも
`include "sdramc_define.v"
を宣言すると先に進んだ。
今後は各RTLに以下を記述しておくと宣言重複する事もなくなり良いと思う。

`ifndef SDRAM_DEFINE
`include "sdramc_define.v"
`endif


コンパイルが途中で止まる(3)

テストベンチでこんな書き方すると、途中でシミュレーションが止まる。

initial begin
rstn = 1'b0;
@(negedge clk) ;
@(negedge clk) ;
rstn = 1'b1;

while(1) begin
validi = 1'b1 ; > whileループの中に時間を進めるものがないのが原因!
end
end


原因はwhileの無限ループの中に時間を進める記述がないから。
なので、このwhileループの中で永遠に処理が行われてしまう。
例えば以下のように書けば@(negedge clk)が時間を進めてくれるから正常に動く。

initial begin
while(1) begin
validi = 1'b1 ;
@(negedge clk) ; > これで時間が進むようになった
end
end




シミュレーションが途中で止まる(300ns)

fpga\common\tb\tb_ddr2c_new.v(545)::Info: シミュレーション時間更新により一時停止しました。time=300,000ps ,インスタンス名:tb_ddr2c

これ原因分かってみれば単純なミスだった。

Veritak > シミュレーション > Run Length
ここで、300ns設定にして、Enableにチェックが入っていたため。
チェックを外せば、300nsで止まらず、シミュレーションが先に進んだ。




ファイル出力できない

こう書くとファイル出力がうまくいく。

integer W_OVEC1 ;
initial begin
W_OVEC1 = $fopen("tb_ddr2c.ppm");

$fdisplay(W_OVEC1, "P3" );
$fdisplay(W_OVEC1, "# Created by tb_ddr2c Simulation output file" );
$fdisplay(W_OVEC1, "640 700" );
$fdisplay(W_OVEC1, "255" );

while(1) begin
@(posedge uut.clk );
$fdisplay(W_OVEC1, "%d" , uut.r1_datho);
end

$fclose(W_OVEC1);
end


でも、if文の制御を追加すると、ファイルに何も出力されなくなる。原因なんだ?

integer W_OVEC1 ;
initial begin
W_OVEC1 = $fopen("tb_ddr2c.ppm");

$fdisplay(W_OVEC1, "P3" );
$fdisplay(W_OVEC1, "# Created by tb_ddr2c Simulation output file" );
$fdisplay(W_OVEC1, "640 700" );
$fdisplay(W_OVEC1, "255" );

while(1) begin
if (uut.r1_rei) begin
@(posedge uut.clk );
$fdisplay(W_OVEC1, "%d" , uut.r1_datho);
end
else begin
@(posedge uut.clk );
end
end

$fclose(W_OVEC1);
end



テストベンチコンパイルエラー
全角スペースが入っていたからだった。


スポンサーサイト

[Veritak]define記述を考慮して関係RTL部のみ出力 > こんな機能無かったかな?

Mico32ソース追ってると、defineによる記述分岐が多いので追うのが疲れる。
ifdefとかで無関係な記述を除外したソースを再生成する機能あったような気がしたが・・・見つからない。

[veritak]アルテラCycloneIII Gateシミュレーション

RTLシミュレーションではLattice Mico32のLEDチカチカ出来てるのに、
アルテラNEEKにダウンロードすると動作しない。なぜ?
VeritakとQuartusIIで扱ってるRTLに何か違いがあった??

QuartusII生成のネットリストでGATEシミュレーションしてみる事に。
以下ファイルを読んだ上で、Veritak設定でcompile modeをRTL(default)からAltera SDFに変更して実行。
1us/秒くらいでシミュレーション出来た。

QuartusIIプロジェクタフォルダのsimulation/modelsim/*.vo
C/altera/13.1/quartus/eda/sim_lib/altera_primitives.v
C/altera/13.1/quartus/eda/sim_lib/altera_mf.v
C/altera/13.1/quartus/eda/sim_lib/cycloneiii_atoms.v

[veritak]EC:2884 MapViewOfFile . Can not allocate memory.

DDRコントローラを自作し、1画面分のシミュレーションをしてる。

Save All sim dataのチェックを外して実行。
  ↓
すっごい高速。これは良い!
fdisplayタスクで出力したppmは生成されるので、結果見ると、何十ライン目かで動作不備。
  ↓
Save All sim dataのチェックをつけて波形データを保存。
  ↓
OSディスクのSSD 256GBでは容量足りず。
外付けHDDにデータを置いて、Veritakプロジェクト設定でMax Archive Disk=Max Disp Disk=100GBに。
PCはx230でメモリは8GB搭載。
  ↓
シミュレーションしたら以下エラーで止まった。400us付近だったかな。

EC:2884 MapViewOfFile . Can not allocate memory.
Please try USE DISK option on the project.
6
size=92183632low_address=1303707648high_address=7hdiskpmap=000000
00



(2014.11.2追記)
マシンを変えてz77(メモリ16GB)でやったら、Time=685us(ArchiveDisk=51GB)まで出来た。
物理メモリの問題か?

[veritak]Simデータ保存せず高速化

RTLシミュレーションでppmを作成してLCD表示の各フレーム確認すると時間かかる。
そんな時は、Veritakのプロジェクト設定で「Save All Sim Dataのチェックを外す」。

そうすると、シミュレーションデータは保存しないが、taskで走らせているppm作成はちゃんと行われる。
シミュレーション波形は見れないが、表示画像はppmで確認出来る。

時間経過見てるとSave All Sim Dataしてる時の3倍以上(もっとかな?)くらいにはなってそう。
計ってみるとこんなスピード。

x230: 961.2us @ 1分間 (Save All Sim Dataチェック無し)

60fpsとすると、16.66ms/1frameだから、18分くらいでシミュレーション出来ると。
デスクトップPCでOCすればもっと速くなるだろうし、なかなか良い感じだ。

z77デスクトップで計ってみた。

z77: 1119.4us @ 1分間 (Save All Sim Dataチェック無し)
カレンダー
01 | 2019/02 | 03
- - - - - 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 - -
累積訪問者
現在の訪問者
現在の閲覧者数:
最新記事
最新トラックバック
最新コメント
月別アーカイブ
カテゴリ
プロフィール

bobgosso

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

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

この人とブロともになる

QRコード
QRコード