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



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


カレンダー
11 | 2018/12 | 01
- - - - - - 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コード