2 use ieee.std_logic_1164.all;
3 use ieee.numeric_std.all;
7 use work.wishbone_types.all;
10 entity core_dram_tb is
12 MEMORY_SIZE : natural := (384*1024);
13 MAIN_RAM_FILE : string := "main_ram.bin";
14 DRAM_INIT_FILE : string := "";
15 DRAM_INIT_SIZE : natural := 16#c000#;
16 L2_TRACE : boolean := false;
17 LITEDRAM_TRACE : boolean := false
21 architecture behave of core_dram_tb is
22 signal clk, rst: std_logic;
23 signal system_clk, soc_rst : std_ulogic;
26 constant clk_period : time := 10 ns;
29 signal wb_dram_in : wishbone_master_out;
30 signal wb_dram_out : wishbone_slave_out;
31 signal wb_ext_io_in : wb_io_master_out;
32 signal wb_ext_io_out : wb_io_slave_out;
33 signal wb_ext_is_dram_csr : std_ulogic;
34 signal wb_ext_is_dram_init : std_ulogic;
37 signal spi_sck : std_ulogic;
38 signal spi_cs_n : std_ulogic := '1';
39 signal spi_sdat_o : std_ulogic_vector(3 downto 0);
40 signal spi_sdat_oe : std_ulogic_vector(3 downto 0);
41 signal spi_sdat_i : std_ulogic_vector(3 downto 0);
42 signal fl_hold_n : std_logic;
43 signal fl_wp_n : std_logic;
44 signal fl_mosi : std_logic;
45 signal fl_miso : std_logic;
48 function get_rom_size return natural is
50 if MEMORY_SIZE = 0 then
51 return DRAM_INIT_SIZE;
57 constant ROM_SIZE : natural := get_rom_size;
63 MEMORY_SIZE => MEMORY_SIZE,
64 RAM_INIT_FILE => MAIN_RAM_FILE,
66 DRAM_SIZE => 256 * 1024 * 1024,
67 DRAM_INIT_SIZE => ROM_SIZE,
68 CLK_FREQ => 100000000,
69 HAS_SPI_FLASH => true,
70 SPI_FLASH_DLINES => 4,
75 system_clk => system_clk,
76 wb_dram_in => wb_dram_in,
77 wb_dram_out => wb_dram_out,
78 wb_ext_io_in => wb_ext_io_in,
79 wb_ext_io_out => wb_ext_io_out,
80 wb_ext_is_dram_csr => wb_ext_is_dram_csr,
81 wb_ext_is_dram_init => wb_ext_is_dram_init,
82 spi_flash_sck => spi_sck,
83 spi_flash_cs_n => spi_cs_n,
84 spi_flash_sdat_o => spi_sdat_o,
85 spi_flash_sdat_oe => spi_sdat_oe,
86 spi_flash_sdat_i => spi_sdat_i
89 flash: entity work.s25fl128s
91 TimingModel => "S25FL128SAGNFI000_R_30pF",
94 tdevice_PP256 => 100 ns,
95 tdevice_PP512 => 100 ns,
96 tdevice_WRR => 100 ns,
103 HOLDNeg => fl_hold_n,
109 fl_mosi <= spi_sdat_o(0) when spi_sdat_oe(0) = '1' else 'Z';
110 fl_miso <= spi_sdat_o(1) when spi_sdat_oe(1) = '1' else 'Z';
111 fl_wp_n <= spi_sdat_o(2) when spi_sdat_oe(2) = '1' else 'Z';
112 fl_hold_n <= spi_sdat_o(3) when spi_sdat_oe(3) = '1' else '1' when spi_sdat_oe(0) = '1' else 'Z';
114 spi_sdat_i(0) <= fl_mosi;
115 spi_sdat_i(1) <= fl_miso;
116 spi_sdat_i(2) <= fl_wp_n;
117 spi_sdat_i(3) <= fl_hold_n;
119 dram: entity work.litedram_wrapper
125 DRAM_PORT_WIDTH => 128,
126 PAYLOAD_FILE => DRAM_INIT_FILE,
127 PAYLOAD_SIZE => ROM_SIZE,
129 LITEDRAM_TRACE => LITEDRAM_TRACE
134 system_clk => system_clk,
135 system_reset => soc_rst,
138 wb_out => wb_dram_out,
139 wb_ctrl_in => wb_ext_io_in,
140 wb_ctrl_out => wb_ext_io_out,
141 wb_ctrl_is_csr => wb_ext_is_dram_csr,
142 wb_ctrl_is_init => wb_ext_is_dram_init
148 wait for clk_period/2;
150 wait for clk_period/2;
156 wait for 10*clk_period;
161 jtag: entity work.sim_jtag;