You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
163 lines
4.7 KiB
163 lines
4.7 KiB
library ieee; |
|
use ieee.std_logic_1164.all; |
|
use ieee.numeric_std.all; |
|
|
|
library work; |
|
use work.common.all; |
|
use work.wishbone_types.all; |
|
use work.utils.all; |
|
|
|
entity core_dram_tb is |
|
generic ( |
|
MEMORY_SIZE : natural := (384*1024); |
|
MAIN_RAM_FILE : string := "main_ram.bin"; |
|
DRAM_INIT_FILE : string := ""; |
|
DRAM_INIT_SIZE : natural := 16#c000#; |
|
L2_TRACE : boolean := false; |
|
LITEDRAM_TRACE : boolean := false |
|
); |
|
end core_dram_tb; |
|
|
|
architecture behave of core_dram_tb is |
|
signal clk, rst: std_logic; |
|
signal system_clk, soc_rst : std_ulogic; |
|
|
|
-- testbench signals |
|
constant clk_period : time := 10 ns; |
|
|
|
-- Sim DRAM |
|
signal wb_dram_in : wishbone_master_out; |
|
signal wb_dram_out : wishbone_slave_out; |
|
signal wb_ext_io_in : wb_io_master_out; |
|
signal wb_ext_io_out : wb_io_slave_out; |
|
signal wb_ext_is_dram_csr : std_ulogic; |
|
signal wb_ext_is_dram_init : std_ulogic; |
|
|
|
-- SPI |
|
signal spi_sck : std_ulogic; |
|
signal spi_cs_n : std_ulogic := '1'; |
|
signal spi_sdat_o : std_ulogic_vector(3 downto 0); |
|
signal spi_sdat_oe : std_ulogic_vector(3 downto 0); |
|
signal spi_sdat_i : std_ulogic_vector(3 downto 0); |
|
signal fl_hold_n : std_logic; |
|
signal fl_wp_n : std_logic; |
|
signal fl_mosi : std_logic; |
|
signal fl_miso : std_logic; |
|
|
|
-- ROM size |
|
function get_rom_size return natural is |
|
begin |
|
if MEMORY_SIZE = 0 then |
|
return DRAM_INIT_SIZE; |
|
else |
|
return 0; |
|
end if; |
|
end function; |
|
|
|
constant ROM_SIZE : natural := get_rom_size; |
|
begin |
|
|
|
soc0: entity work.soc |
|
generic map( |
|
SIM => true, |
|
MEMORY_SIZE => MEMORY_SIZE, |
|
RAM_INIT_FILE => MAIN_RAM_FILE, |
|
HAS_DRAM => true, |
|
DRAM_SIZE => 256 * 1024 * 1024, |
|
DRAM_INIT_SIZE => ROM_SIZE, |
|
CLK_FREQ => 100000000, |
|
HAS_SPI_FLASH => true, |
|
SPI_FLASH_DLINES => 4, |
|
SPI_FLASH_OFFSET => 0 |
|
) |
|
port map( |
|
rst => soc_rst, |
|
system_clk => system_clk, |
|
wb_dram_in => wb_dram_in, |
|
wb_dram_out => wb_dram_out, |
|
wb_ext_io_in => wb_ext_io_in, |
|
wb_ext_io_out => wb_ext_io_out, |
|
wb_ext_is_dram_csr => wb_ext_is_dram_csr, |
|
wb_ext_is_dram_init => wb_ext_is_dram_init, |
|
spi_flash_sck => spi_sck, |
|
spi_flash_cs_n => spi_cs_n, |
|
spi_flash_sdat_o => spi_sdat_o, |
|
spi_flash_sdat_oe => spi_sdat_oe, |
|
spi_flash_sdat_i => spi_sdat_i |
|
); |
|
|
|
flash: entity work.s25fl128s |
|
generic map ( |
|
TimingModel => "S25FL128SAGNFI000_R_30pF", |
|
LongTimming => false, |
|
tdevice_PU => 10 ns, |
|
tdevice_PP256 => 100 ns, |
|
tdevice_PP512 => 100 ns, |
|
tdevice_WRR => 100 ns, |
|
UserPreload => TRUE |
|
) |
|
port map( |
|
SCK => spi_sck, |
|
SI => fl_mosi, |
|
CSNeg => spi_cs_n, |
|
HOLDNeg => fl_hold_n, |
|
WPNeg => fl_wp_n, |
|
RSTNeg => '1', |
|
SO => fl_miso |
|
); |
|
|
|
fl_mosi <= spi_sdat_o(0) when spi_sdat_oe(0) = '1' else 'Z'; |
|
fl_miso <= spi_sdat_o(1) when spi_sdat_oe(1) = '1' else 'Z'; |
|
fl_wp_n <= spi_sdat_o(2) when spi_sdat_oe(2) = '1' else 'Z'; |
|
fl_hold_n <= spi_sdat_o(3) when spi_sdat_oe(3) = '1' else '1' when spi_sdat_oe(0) = '1' else 'Z'; |
|
|
|
spi_sdat_i(0) <= fl_mosi; |
|
spi_sdat_i(1) <= fl_miso; |
|
spi_sdat_i(2) <= fl_wp_n; |
|
spi_sdat_i(3) <= fl_hold_n; |
|
|
|
dram: entity work.litedram_wrapper |
|
generic map( |
|
DRAM_ABITS => 24, |
|
DRAM_ALINES => 1, |
|
DRAM_DLINES => 16, |
|
DRAM_CKLINES => 1, |
|
DRAM_PORT_WIDTH => 128, |
|
PAYLOAD_FILE => DRAM_INIT_FILE, |
|
PAYLOAD_SIZE => ROM_SIZE, |
|
TRACE => L2_TRACE, |
|
LITEDRAM_TRACE => LITEDRAM_TRACE |
|
) |
|
port map( |
|
clk_in => clk, |
|
rst => rst, |
|
system_clk => system_clk, |
|
system_reset => soc_rst, |
|
|
|
wb_in => wb_dram_in, |
|
wb_out => wb_dram_out, |
|
wb_ctrl_in => wb_ext_io_in, |
|
wb_ctrl_out => wb_ext_io_out, |
|
wb_ctrl_is_csr => wb_ext_is_dram_csr, |
|
wb_ctrl_is_init => wb_ext_is_dram_init |
|
); |
|
|
|
clk_process: process |
|
begin |
|
clk <= '0'; |
|
wait for clk_period/2; |
|
clk <= '1'; |
|
wait for clk_period/2; |
|
end process; |
|
|
|
rst_process: process |
|
begin |
|
rst <= '1'; |
|
wait for 10*clk_period; |
|
rst <= '0'; |
|
wait; |
|
end process; |
|
|
|
jtag: entity work.sim_jtag; |
|
|
|
end;
|
|
|