spi: Add simulation support
This require the s25fl128s.vhd flash model and FMF libraries, which will be built when passed to the Makefile via the FLASH_MODEL_PATH argument. Otherwise a dummy module is used which ties MISO to '1'. The model isn't included as I'm not sure its licence (GPL) is at this point, but it can be obtained from https://github.com/ozbenh/microspi FLASH_MODEL_PATH=<path to microspi>/model Signed-off-by: Benjamin Herrenschmidt <benh@kernel.crashing.org>pull/204/head
parent
cc4dcb3597
commit
a89e1469ef
@ -0,0 +1,119 @@
|
|||||||
|
library ieee;
|
||||||
|
use ieee.std_logic_1164.all;
|
||||||
|
use ieee.numeric_std.all;
|
||||||
|
|
||||||
|
library work;
|
||||||
|
use work.common.all;
|
||||||
|
use work.wishbone_types.all;
|
||||||
|
|
||||||
|
entity core_flash_tb is
|
||||||
|
end core_flash_tb;
|
||||||
|
|
||||||
|
architecture behave of core_flash_tb is
|
||||||
|
signal clk, rst: std_logic;
|
||||||
|
|
||||||
|
-- testbench signals
|
||||||
|
constant clk_period : time := 10 ns;
|
||||||
|
|
||||||
|
-- Dummy DRAM
|
||||||
|
signal wb_dram_in : wishbone_master_out;
|
||||||
|
signal wb_dram_out : wishbone_slave_out;
|
||||||
|
signal wb_dram_ctrl_in : wb_io_master_out;
|
||||||
|
signal wb_dram_ctrl_out : wb_io_slave_out;
|
||||||
|
|
||||||
|
-- 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;
|
||||||
|
begin
|
||||||
|
|
||||||
|
soc0: entity work.soc
|
||||||
|
generic map(
|
||||||
|
SIM => true,
|
||||||
|
MEMORY_SIZE => (384*1024),
|
||||||
|
RAM_INIT_FILE => "main_ram.bin",
|
||||||
|
RESET_LOW => false,
|
||||||
|
CLK_FREQ => 100000000,
|
||||||
|
HAS_SPI_FLASH => true,
|
||||||
|
SPI_FLASH_DLINES => 4,
|
||||||
|
SPI_FLASH_OFFSET => 0
|
||||||
|
)
|
||||||
|
port map(
|
||||||
|
rst => rst,
|
||||||
|
system_clk => clk,
|
||||||
|
uart0_rxd => '0',
|
||||||
|
uart0_txd => open,
|
||||||
|
wb_dram_in => wb_dram_in,
|
||||||
|
wb_dram_out => wb_dram_out,
|
||||||
|
wb_dram_ctrl_in => wb_dram_ctrl_in,
|
||||||
|
wb_dram_ctrl_out => wb_dram_ctrl_out,
|
||||||
|
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,
|
||||||
|
alt_reset => '0'
|
||||||
|
);
|
||||||
|
|
||||||
|
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
|
||||||
|
)
|
||||||
|
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;
|
||||||
|
|
||||||
|
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;
|
||||||
|
|
||||||
|
-- Dummy DRAM
|
||||||
|
wb_dram_out.ack <= wb_dram_in.cyc and wb_dram_in.stb;
|
||||||
|
wb_dram_out.dat <= x"FFFFFFFFFFFFFFFF";
|
||||||
|
wb_dram_out.stall <= '0';
|
||||||
|
wb_dram_ctrl_out.ack <= wb_dram_ctrl_in.cyc and wb_dram_ctrl_in.stb;
|
||||||
|
wb_dram_ctrl_out.dat <= x"FFFFFFFF";
|
||||||
|
wb_dram_ctrl_out.stall <= '0';
|
||||||
|
|
||||||
|
end;
|
@ -0,0 +1,28 @@
|
|||||||
|
library ieee;
|
||||||
|
use ieee.std_logic_1164.all;
|
||||||
|
|
||||||
|
entity s25fl128s is
|
||||||
|
generic (
|
||||||
|
LongTimming : boolean := true;
|
||||||
|
TimingModel : string := "";
|
||||||
|
tdevice_PU : time := 10 ns;
|
||||||
|
tdevice_PP256 : time := 10 ns;
|
||||||
|
tdevice_PP512 : time := 10 ns;
|
||||||
|
tdevice_WRR : time := 10 ns;
|
||||||
|
UserPreload : boolean := false
|
||||||
|
);
|
||||||
|
PORT (
|
||||||
|
SI : inout std_ulogic := 'Z';
|
||||||
|
SO : inout std_ulogic := 'Z';
|
||||||
|
SCK : in std_ulogic := 'Z';
|
||||||
|
CSNeg : in std_ulogic := 'Z';
|
||||||
|
RSTNeg : in std_ulogic := 'Z';
|
||||||
|
WPNeg : inout std_ulogic := 'Z';
|
||||||
|
HOLDNeg : inout std_ulogic := 'Z'
|
||||||
|
);
|
||||||
|
end entity;
|
||||||
|
|
||||||
|
architecture behaviour of s25fl128s is
|
||||||
|
begin
|
||||||
|
SO <= '1';
|
||||||
|
end architecture;
|
Loading…
Reference in New Issue