”
XPS入りのPlanAhead14.1プロジェクトを作る3(SDK)”の続き。
(2012/05/23に追記しました。ソフトウェアをロードした状態でシミュレーションすることができました)今度は自分で作ったXPS入りのPlanAhead14.1プロジェクトでシミュレーションをしてみた。普通の作り方はシミュレーションを行なってからインプリメントすると思う。しかし、XPSで作ったプロジェクトは規模が大きくなりやすいし、
前回32ビット版Windowsでは(たぶん?)シミュレーションできなかったので、自作IPは単体シミュレーションしておいて、全体としてはインプリメントするほうが良いと思う。
さて、最初にテストベンチファイルを作成するのだが、PlanAheadではProject Navigator に付いていたテストベンチのテンプレートを作成する機能が見当たらない。そこで、”
Vimをインストールした”でインストールしてあったVimを使用してテストベンチのテンプレートを作成することにした。
・Vimを立ちあげて、トップファイルのsystem_stub.v をオープンして、HDLメニューからVerilog Testbench を選択したらテストベンチのテンプレートが作成された。

・クロックの周期の半分を32から5 に変更し、tb_system_stub.v をしてセーブした。
・PlanAheadのFileメニューのAdd Sources... を選択して出てきたダイアログのAdd or Create Simulation Sources を選択して、tb_system_stub.v をプロジェクトに追加した。

・PlanAheadのプロジェクトにtb_system_stub.v が追加された。

・左のウインドウでProject Manager -> Run Behavioral Simulation をクリックした。
・Launch Run Behavioral Simulationダイアログが表示された。sim1を確認して、Launchボタンをクリックした。

・エラーが出てしまった。

・エラーの内容を見るとclk とrst がないと言われている。clk の宣言はCLKでされていた。clk を大文字に修正した。rst はそもそも宣言がないので、RESETに修正した。Vimのテストベンチ・テンプレート作成上のバグかな?

・ISimが起動してシミュレーションが実行された。更に信号を追加して100usec までシミュレーションした。

sim_1の環境にaxi_timer_test.elf が入っていても、ソフトウェアをロードしていないんじゃないか?と思う。axi_timer_0のシミュレーション結果を見てもaxi4_liteバスのWriteが出ていない。ソフトウェアで初期化をしているはずなんだけど。。。
・simulation でワーニングが大量に出いた。その中で最初のワーニングに従って、コンパイル時のオプションを追加してみることにした。

・Run Behavioral Simulation をクリックした後のLaunch Run Behavioral SimulationダイアログのOptions...ボタンをクリックして、CompilationタブのMore Fuse Options に-mt off -v 1 を追加した。

シミュレーションをしてみたが変化なし。ELFファイルはロードしてくれないのだろうか?
Xilinxのサイトからマニュアルを漁ってみたが記述が見つからない。何か情報がある方は教えて下さい。
(2012/5/23:追記)シミュレーションにソフトウェアがロードされていない原因がわかりました。
色々ファイルを見てみたんですが、Atlys_EDK_test_PA\Atlys_EDK_test_PA.sim\sim_1\runme.bat がPlanAheadが生成したISim simulation Script でした。見てみると、data2mem でmb_bootloop_le.elf がロードされていました。(axi_timer_test.elfではなく)
ToolsメニューからAssociate ELF Files... を選択して、ダイアログを開くとsim_1には、mb_bootloop_le.elf が関連付けられていました。

Sourcesウインドウにはsim_1 にはaxi_timer_test.elf が関連付けられているように表示されていたんですが。。。

必ず、Associate ELF Files... で確認する必要がありますね。
・さて、sim_1 にaxi_timer_test.elf を関連付けました。axi_timer_test.elf があるパスは、Atlys_EDK_test_PA\Atlys_EDK_test_PA.sdk\SDK\SDK_Export\axi_timer_test\Debug です。

・もう一度、左のウインドウでProject Manager -> Run Behavioral Simulation をクリックしました。
・Launch Run Behavioral Simulationダイアログが表示されるので、sim1を確認して、Launchボタンをクリックしてシミュレーションのコンパイルを開始させます。
・ISimが立ちあげて、1usec シミュレーションを行いましたが、まだaxi_timer_0 にWirte するところが見えないので、更に10usec シミュレーションを行いました。
・axi_timer_0 に初期設定を書き込むところが見えました。
axi_timer_test.c のaxi_timer_0 に初期設定を行う部分のコードです。
#define AXI_TIMER_0_TCSR0 XPAR_AXI_TIMER_0_BASEADDR // Control/Status Register 0
#define AXI_TIMER_0_TLR0 XPAR_AXI_TIMER_0_BASEADDR+0x4 // Load Register 0
#define AXI_TIMER_0_TCR0 XPAR_AXI_TIMER_0_BASEADDR+0x8 // Timer/Counter Register 0
#define AXI_TIMER_0_TCSR1 XPAR_AXI_TIMER_0_BASEADDR+0x10 // Control/Status Register 1
#define AXI_TIMER_0_TLR1 XPAR_AXI_TIMER_0_BASEADDR+0x14 // Load Register 1
#define AXI_TIMER_0_TCR1 XPAR_AXI_TIMER_0_BASEADDR+0x18 // Timer/Counter Register 1
#define ENABLE_ALL_TIMERS (0x1<<10)
#define ENABLE_PULSE_WIDTH_MODULATION (0x1<<9)
#define TIMER_INTERRUPT (0x1<<8)
#define ENABLE_TIMER (0x1<<7)
#define ENABLE_INTERRUPT (0x1<<6)
#define LOAD_TIMER (0x1<<5)
#define AUTO_RELOAD_HOLD_TIMER (0x1<<4)
#define ENABLE_EXT_CAPTURE_TRIG (0x1<<3)
#define ENABLE_EXT_GENERATE_SIG (0x1<<2)
#define DOWN_UP_COUNT_TIMER (0x1<<1)
#define TIMER_MODE_CAP_GENE (0x1)
int interrupt = 0;
void axi_intc_init() {
*(volatile unsigned int *)(MICROBLAZE_0_INTC_IER) = 0x1;
*(volatile unsigned int *)(MICROBLAZE_0_INTC_MER) = 0x3;
}
void axi_timer_init(){
*(volatile unsigned int *)(AXI_TIMER_0_TLR0) = 100000000;
*(volatile unsigned int *)(AXI_TIMER_0_TCSR0) = ENABLE_ALL_TIMERS | LOAD_TIMER;
*(volatile unsigned int *)(AXI_TIMER_0_TCSR0) = ENABLE_ALL_TIMERS | ENABLE_TIMER | ENABLE_INTERRUPT | DOWN_UP_COUNT_TIMER;
}
axi_timer_init()がaxi_timer_0 の初期化ルーチンです。AXI_TIMER_0_TLR0にカウント値を書いてから、一度、AXI_TIMER_0_TCSR0にAXI_TIMER_0_TLR0にカウント値をロードする値を書いて、もう一度、TIMER_0_TCSR0にカウントのモードを書いています。
ISimのその部分の波形を下に示します。

上の波形では、下に示す順番でaxi_timer_0 のレジスタに書き込む様子が見えると思います。
1.0x41c00004(AXI_TIMER_0_TLR0)番地に、0x05f5e100(十進数で100000000)をWrite
2.0x41c00000(TIMER_0_TCSR0)番地に、0x00000420をWrite
3.0x41c00000(TIMER_0_TCSR0)番地に、0x000004c2をWrite
これで、ソフトウェアをロードした状態で、回路全体のシミュレーションをすることができました。
- 2012年05月22日 05:51 |
- PlanAheadについて
-
| トラックバック:0
-
| コメント:0