XILINX(ISE) カスタム AXI-Master IPのシミュレーション

AXIマスターオリジナルIPを製作する為に、Xilinx社提供のサンプルコードでのシミュレーションをご紹介します。
本来は、Xilinx社より提供されるAXI Bus Functional Model (BFM)を使用すれば良いのですが、こちらは有償となっておりますので、MicroBlazeのIPを接続してシミュレーションする環境をご紹介いたします。

プロジェクトの方針

Avnet社製MicroBoardの環境準備

avnet社のホームページよりMicroBoardのXBDを入手します。
EDK 14.3 XBD/IP-XACT Files : avnet_edk14_3_xbd_files_9_11_2012_spartan.zip

http://www.em.avnet.com/en-us/design/drc/Pages/Xilinx-Spartan-6-FPGA-LX9-MicroBoard.aspxのSupport and Downloadsから入手できます。

avnet_edk14_3_xbd_files.zip/boards/Avnet_S6LX9_MicroBoard_RevBを/Xilinx/14.7/ISE_DS\EDK/board/Xilinx/boardsにコピーします。
MicroBoard1


avnet_edk14_3_xbd_files.zip/ipxact/S6_MicroBoard_v1_0を/Xilinx/14.7/ISE_DS\EDK/board/Xilinx/ipxactにコピーします。
MicroBoard2

MicroBoardプロジェクトの作成

ISEプロジェクトを作成します。
MicroBoardPrj1


Evaliation Development BoardにAvnet S6LX9 MicroBoard RevBを選択します。
MicroBoardPrj2


その他は変更せずにfinishまで進めます。

XPSプロジェクトの作成

New Source WizardでISEプロジェクトに新しくEmbedded Processorを追加します。
EmbeddedProcessor1


New Source Wizardをfinishまで進めると、XPSが起動しBSB Wizardの使用を確認されるので、Yesを選択します。
MicroBoardPrj3


AXI Systemがデフォルトで選択されていますので、そのまま次に進みます。
MicroBoardPrj4


BoardおよびSystemに関する設定はデフォルトのままで次に進みます。
MicroBoardPrj5


processorとperipheralに関する設定です。
MicroBoardPrj6


今回は、AXI-MASTERのシミュレーションに特化しますので不要なペリフェラルをすべて削除します。MCB3_LPDDR(Cached)以外はすべてRemoveして、Finishします。
MicroBoardPrj7

XPSプロジェクトへのAXI-Master IPの追加

BSB Wizardが終了するとXPSが起動します。
MicroBoardXps1


今回は、AXI-MASTERのシミュレーションに特化しますのでaxilite_0とmicroblaze関連のIP及びdebug_moduleを削除します。
MicroBoardXps2


AR37425.zipをxilinx社のホームページからダウンロード-解凍して、axi_master_v1_00_aフォルダをAXI_MASTER_TEST/AXI_MASTER_TEST/pcoresにコピーします。
MicroBoardXps3


Project->Rescan User Repositoriesをクリックすると、IP CatalogにAXI Masterが追加されます。
MicroBoardXps4


MCB_LPDDRのAddressを確認します。0xA4000000-0xA7FFFFFFになっています。
Project->Rescan User Repositoriesをクリックすると、IP CatalogにAXI Masterが追加されます。
MicroBoardXps5


AXI Master IPを追加します。
C_M_AXI_TARGETは、前項で確認したMCB_LPDDRの先頭アドレスである0xA4000000を設定します。
C_M_AXI_BURST_LENは、AXIのバースト長を指定します。今回はディフォルトのままにします。
C_OFFSET_WIDTHはサンプルの書き込み範囲のビット数を示しております。初期値は9になっていますので0xA4000000から0xA40001FFまでの512バイトのWrite/Readテストを行います。
C_M_AXI_PROTOCOLはAXI(ディフォルト値)とします。
その他は変更不要です。
MicroBoardXps6


axi_master_0が追加されますので、axi_master_0をaxi4_0にバス接続します。
MicroBoardXps7


MCB3_LPDDRをaxi4_0にバス接続します。
MicroBoardXps8


これで、axi_master_0とMCB3_LPDDRがAXI4で接続されました。
MicroBoardXps9


LPDDR SDRAMのシミュレーションモデルを生成する為に、MCB3_LPDDRのMIGを起動します。
MIG1


設定の変更は必要ありませんので、そのまま進んでいき、finishします。
MIG2


AXI_MASTER_TEST\AXI_MASTER_TEST\__xps\MCB3_LPDDRにLPDDR SDRAMのシミュレーションモデルが生成されます。
MIG3


axi_master_0のポートを接続します。
  • axi_master_0::ERROR – External Ports axi_master_0_error(新規)
  • axi_master_0::M_AXI::ACLK – clock_generator_0::CLKOUT2
MicroBoardXpsConnect1


Graphic Design Viewを確認します。
MicroBoardXpsConnect2


Design Rule Checkを行いErrorおよびWarningがないことを確認してXPSを終了します。

ISEプロジェクトの完成

ISEに戻って、Generate Top HDL Sourceを実行します。
IseProj1


AXI_MASTER_TEST_top.vが生成されます。
IseProj2


New Source WizardでISEプロジェクトに新しくテストベンチファイルを追加します。
IseProj3


AXI_MASTER_TEST_topを選択します。
IseProj4


先ほど生成したLPDDR SDRAMのシミュレーションモデル「AXI_MASTER_TEST/AXI_MASTER_TEST/__xps\MCB3_LPDDRのlpddr_model.v」をプロジェクトに追加します。
IseProj5


lpddr_modelがプロジェクトに追加されました。

IseProj6a


lpddr_modelとの接続等をテストベンチファイルAXI_MASTER_TEST_tf.vに記述します。
IseProj7


【AXI_MASTER_TEST_tf.v】

`timescale 1ps / 1ps

module AXI_MASTER_TEST_tf;

	// Inputs
	reg RESET;
	reg CLK_66MHZ;

	// Outputs
	wire mcbx_dram_we_n;
	wire mcbx_dram_udm;
	wire mcbx_dram_ras_n;
	wire mcbx_dram_ldm;
	wire mcbx_dram_clk_n;
	wire mcbx_dram_clk;
	wire mcbx_dram_cke;
	wire mcbx_dram_cas_n;
	wire [1:0] mcbx_dram_ba;
	wire [12:0] mcbx_dram_addr;
	wire axi_master_0_error;

	// Bidirs
	wire rzq;
	wire mcbx_dram_udqs;
	wire mcbx_dram_dqs;
	wire [15:0] mcbx_dram_dq;

	// Instantiate the Unit Under Test (UUT)
	AXI_MASTER_TEST_top uut (
		.rzq(rzq),
		.mcbx_dram_we_n(mcbx_dram_we_n),
		.mcbx_dram_udqs(mcbx_dram_udqs),
		.mcbx_dram_udm(mcbx_dram_udm),
		.mcbx_dram_ras_n(mcbx_dram_ras_n),
		.mcbx_dram_ldm(mcbx_dram_ldm),
		.mcbx_dram_dqs(mcbx_dram_dqs),
		.mcbx_dram_dq(mcbx_dram_dq),
		.mcbx_dram_clk_n(mcbx_dram_clk_n),
		.mcbx_dram_clk(mcbx_dram_clk),
		.mcbx_dram_cke(mcbx_dram_cke),
		.mcbx_dram_cas_n(mcbx_dram_cas_n),
		.mcbx_dram_ba(mcbx_dram_ba),
		.mcbx_dram_addr(mcbx_dram_addr),
		.RESET(RESET),
		.CLK_66MHZ(CLK_66MHZ),
		.axi_master_0_error(axi_master_0_error)
	);

	lpddr_model mem (
		.Dq(mcbx_dram_dq),
		.Dqs({mcbx_dram_udqs, mcbx_dram_dqs}),
		.Addr(mcbx_dram_addr),
		.Ba(mcbx_dram_ba),
		.Clk(mcbx_dram_clk),
		.Clk_n(mcbx_dram_clk_n),
		.Cke(mcbx_dram_cke),
		.Cs_n(1'b0),
		.Ras_n(mcbx_dram_ras_n),
		.Cas_n(mcbx_dram_cas_n),
		.We_n(mcbx_dram_we_n),
		.Dm({mcbx_dram_udm, mcbx_dram_ldm})
	);

	initial begin
		// Initialize Inputs
		RESET = 1;
		CLK_66MHZ = 0;

		// Wait 100 ns for global reset to finish
		#100;
  		RESET = 0;

		// Add stimulus here
		forever begin
			CLK_66MHZ = ~CLK_66MHZ;
			#(7576);
		end

	end

endmodule

シミュレーションの実効

Isim simulatorを実行すると、ワーニングが発生します。
ISim1


Isimの方を確認しても、確かに、Dq 32ビット, Addr 14ビット, DM 4ビットとなっています。
ISim2


プロジェクトのAutomatic `includesにあるlpddr_model_parameters.vhを見てみると、メモリ種別に対するifdefがあります。
XPSを再度立ち上げて、MCB3_LPDDRのMIGを起動しすると、MCB3_LPDDRのメモリパートは、MCBMT46H32M16XXXX-5が選択されています。
ISim3


isim Process Propertiesの-d(Specify `define Macro Name and Value)にx512Mb|sg5|x16と入力します。(sg5 = -5 (CL=3))
パラメータは必ず”|”で結合してください。スペースも不可です。
x512Mb sg5 x16
x512Mb | sg5 | x16
これらでは、認識しません。
ISim4


isimを再起動すると、mem::Addr[12:0] mem::Dq[15:0] mem::Dm[1:0]となり、シミュレーションが成功します。
ISim5

タグ


2015年11月10日 | コメントは受け付けていません。|

カテゴリー:技術情報

このページの先頭へ

イメージ画像