FC2カウンター FPGAの部屋 EDKのシミュレーション
FC2ブログ

FPGAやCPLDの話題やFPGA用のツールの話題などです。 マニアックです。 日記も書きます。

FPGAの部屋

FPGAの部屋の有用と思われるコンテンツのまとめサイトを作りました。Xilinx ISEの初心者の方には、FPGAリテラシーおよびチュートリアルのページをお勧めいたします。

EDKのシミュレーション

カスタムIPのBFMシミュレーションはライセンスの関係で出来なかったが、ISEでEDKのインスタンスをADDした場合のシミュレーションをやってみた。

Project Navigatorで右クリックメニューからAdd Source...を選択して、elfファイルを選択する。(axi_timer_test.elfをAddする)
SP605_AXI_CDC_45_110817.png

Adding Source Files...ダイアログが開く。
SP605_AXI_CDC_46_110817.png

Elf/Xmp File Associatonsダイアログが開く。simulationとimplementationの両方にチェックを入れた。
SP605_AXI_CDC_47_110817.png

axi_timer_test.elf がEDKの下に入って、前に入っていたmonitor.elfは外に出た。
SP605_AXI_CDC_48_110817.png

EDKの右クリックメニューに、Elf/Xmp File Associatons...があるので、それを選択する。
SP605_AXI_CDC_49_110817.png

Elf/Xmp File Associatonsダイアログが開いて、elfファイルを選択できるようになった。
SP605_AXI_CDC_50_110817.png

monitor.elfを選択した。
SP605_AXI_CDC_51_110817.png

Project Navigatorに戻ると、EDKの下にmonitor.elfが入った。
SP605_AXI_CDC_52_110817.png

Project Navigatorをシミュレーションモードにして、テストベンチを作った。
SP605_AXI_CDC_53_110817.png

テストベンチ、system_top_tb.v を下に示す。

`timescale 100ps / 1ps

////////////////////////////////////////////////////////////////////////////////
// Company: 
// Engineer:
//
// Create Date:   05:32:57 08/16/2011
// Design Name:   system_top
// Module Name:   H:/HDL/FndtnISEWork/Spartan6/SP605_AXI_CharDispCtrler5/system_top_tb.v
// Project Name:  SP605_AXI_CharDispCtrler5
// Target Device:  
// Tool versions:  
// Description: 
//
// Verilog Test Fixture created by ISE for module: system_top
//
// Dependencies:
// 
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
// 
////////////////////////////////////////////////////////////////////////////////

module system_top_tb;

    // Inputs
    reg SysACE_MPIRQ;
    reg SysACE_CLK;
    reg RS232_Uart_1_sin;
    reg RESET;
    reg [0:3] Push_Buttons_4Bits_TRI_I;
    reg Ethernet_Lite_TX_CLK;
    reg Ethernet_Lite_RX_ER;
    reg Ethernet_Lite_RX_DV;
    reg Ethernet_Lite_RX_CLK;
    reg [3:0] Ethernet_Lite_RXD;
    reg Ethernet_Lite_CRS;
    reg Ethernet_Lite_COL;
    reg [0:3] DIP_Switches_4Bits_TRI_I;
    reg CLK_P;
    reg CLK_N;

    // Outputs
    wire mcbx_dram_we_n;
    wire mcbx_dram_udm;
    wire mcbx_dram_ras_n;
    wire mcbx_dram_odt;
    wire mcbx_dram_ldm;
    wire mcbx_dram_ddr3_rst;
    wire mcbx_dram_clk_n;
    wire mcbx_dram_clk;
    wire mcbx_dram_cke;
    wire mcbx_dram_cas_n;
    wire [2:0] mcbx_dram_ba;
    wire [12:0] mcbx_dram_addr;
    wire SysACE_WEN;
    wire SysACE_OEN;
    wire [6:0] SysACE_MPA;
    wire SysACE_CEN;
    wire RS232_Uart_1_sout;
    wire [0:3] LEDs_4Bits_TRI_O;
    wire Ethernet_Lite_TX_EN;
    wire [3:0] Ethernet_Lite_TXD;
    wire Ethernet_Lite_PHY_RST_N;
    wire Ethernet_Lite_MDC;
    wire dvi_reset_b;
    wire dvi_sda;
    wire dvi_v;
    wire [11:0] dvi_d;
    wire dvi_xclk_n;
    wire dvi_de;
    wire dvi_xclk_p;
    wire dvi_h;
    wire dvi_scl;

    // Bidirs
    wire zio;
    wire rzq;
    wire mcbx_dram_udqs_n;
    wire mcbx_dram_udqs;
    wire mcbx_dram_dqs_n;
    wire mcbx_dram_dqs;
    wire [15:0] mcbx_dram_dq;
    wire [7:0] SysACE_MPD;
    wire SPI_FLASH_SS;
    wire SPI_FLASH_SCLK;
    wire SPI_FLASH_MOSI;
    wire SPI_FLASH_MISO;
    wire IIC_EEPROM_SDA;
    wire IIC_EEPROM_SCL;
    wire Ethernet_Lite_MDIO;

    // Instantiate the Unit Under Test (UUT)
    system_top uut (
        .zio(zio), 
        .rzq(rzq), 
        .mcbx_dram_we_n(mcbx_dram_we_n), 
        .mcbx_dram_udqs_n(mcbx_dram_udqs_n), 
        .mcbx_dram_udqs(mcbx_dram_udqs), 
        .mcbx_dram_udm(mcbx_dram_udm), 
        .mcbx_dram_ras_n(mcbx_dram_ras_n), 
        .mcbx_dram_odt(mcbx_dram_odt), 
        .mcbx_dram_ldm(mcbx_dram_ldm), 
        .mcbx_dram_dqs_n(mcbx_dram_dqs_n), 
        .mcbx_dram_dqs(mcbx_dram_dqs), 
        .mcbx_dram_dq(mcbx_dram_dq), 
        .mcbx_dram_ddr3_rst(mcbx_dram_ddr3_rst), 
        .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), 
        .SysACE_WEN(SysACE_WEN), 
        .SysACE_OEN(SysACE_OEN), 
        .SysACE_MPIRQ(SysACE_MPIRQ), 
        .SysACE_MPD(SysACE_MPD), 
        .SysACE_MPA(SysACE_MPA), 
        .SysACE_CLK(SysACE_CLK), 
        .SysACE_CEN(SysACE_CEN), 
        .SPI_FLASH_SS(SPI_FLASH_SS), 
        .SPI_FLASH_SCLK(SPI_FLASH_SCLK), 
        .SPI_FLASH_MOSI(SPI_FLASH_MOSI), 
        .SPI_FLASH_MISO(SPI_FLASH_MISO), 
        .RS232_Uart_1_sout(RS232_Uart_1_sout), 
        .RS232_Uart_1_sin(RS232_Uart_1_sin), 
        .RESET(RESET), 
        .Push_Buttons_4Bits_TRI_I(Push_Buttons_4Bits_TRI_I), 
        .LEDs_4Bits_TRI_O(LEDs_4Bits_TRI_O), 
        .IIC_EEPROM_SDA(IIC_EEPROM_SDA), 
        .IIC_EEPROM_SCL(IIC_EEPROM_SCL), 
        .Ethernet_Lite_TX_EN(Ethernet_Lite_TX_EN), 
        .Ethernet_Lite_TX_CLK(Ethernet_Lite_TX_CLK), 
        .Ethernet_Lite_TXD(Ethernet_Lite_TXD), 
        .Ethernet_Lite_RX_ER(Ethernet_Lite_RX_ER), 
        .Ethernet_Lite_RX_DV(Ethernet_Lite_RX_DV), 
        .Ethernet_Lite_RX_CLK(Ethernet_Lite_RX_CLK), 
        .Ethernet_Lite_RXD(Ethernet_Lite_RXD), 
        .Ethernet_Lite_PHY_RST_N(Ethernet_Lite_PHY_RST_N), 
        .Ethernet_Lite_MDIO(Ethernet_Lite_MDIO), 
        .Ethernet_Lite_MDC(Ethernet_Lite_MDC), 
        .Ethernet_Lite_CRS(Ethernet_Lite_CRS), 
        .Ethernet_Lite_COL(Ethernet_Lite_COL), 
        .DIP_Switches_4Bits_TRI_I(DIP_Switches_4Bits_TRI_I), 
        .CLK_P(CLK_P), 
        .CLK_N(CLK_N), 
        .dvi_reset_b(dvi_reset_b), 
        .dvi_sda(dvi_sda), 
        .dvi_v(dvi_v), 
        .dvi_d(dvi_d), 
        .dvi_xclk_n(dvi_xclk_n), 
        .dvi_de(dvi_de), 
        .dvi_xclk_p(dvi_xclk_p), 
        .dvi_h(dvi_h), 
        .dvi_scl(dvi_scl)
    );
    
    parameter PERIOD = 50; // 200MHz clock
    parameter real DUTY_CYCLE = 0.5;
    parameter OFFSET = 0;
    
    initial    // Clock process for clk
    begin
        CLK_P = 1'b0;
        CLK_N = 1'b1;
        #OFFSET;
        forever begin
            CLK_P = 1'b0;
                CLK_N = 1'b1;
            #(PERIOD-(PERIOD*DUTY_CYCLE)) CLK_P = 1'b1; CLK_N = 1'b0;
            #(PERIOD*DUTY_CYCLE);
        end
    end

    initial begin
        // Initialize Inputs
        SysACE_MPIRQ = 0;
        SysACE_CLK = 0;
        RS232_Uart_1_sin = 0;
        RESET = 1'b1;
        Push_Buttons_4Bits_TRI_I = 0;
        Ethernet_Lite_TX_CLK = 0;
        Ethernet_Lite_RX_ER = 0;
        Ethernet_Lite_RX_DV = 0;
        Ethernet_Lite_RX_CLK = 0;
        Ethernet_Lite_RXD = 0;
        Ethernet_Lite_CRS = 0;
        Ethernet_Lite_COL = 0;
        DIP_Switches_4Bits_TRI_I = 0;

        // Wait 100 ns for global reset to finish
        #1000;
        // Add stimulus here
        #500;
        RESET = 1'b0;
        
    end
      
endmodule


Simulate Behavioral Modelをダブルクリックすると、コンパイルし、ISimが起動した。200usec 程度シミュレーションした結果を下に示す。
SP605_AXI_CDC_54_110817.png

MicroBlazeの命令は、instr[0.31]だと思う。instr_addr[0.31]がそのアドレスだと思うが、0番地から4, 8, C番地と飛んで、その後、0xc0000000番地に飛んで、0xc0000004番地で実行が停止している。後は、ELFファイルを解析する必要がありそうだ。
SP605_AXI_CDC_55_110817.png

このやり方は、”マイクロプロセッサ IP およびペリフェラル IP の使用”の”ELF ファイルを ISE デザインのエンベデッド プロセッサに関連付けるには”、”エンベデッド プロセッサ システムをシミュレーションするには”に書いてあった。
  1. 2011年08月17日 05:26 |
  2. EDK
  3. | トラックバック:0
  4. | コメント:0

コメント

コメントの投稿


管理者にだけ表示を許可する

トラックバック URL
http://marsee101.blog.fc2.com/tb.php/1880-cfafc99f
この記事にトラックバックする(FC2ブログユーザー)