|
-------------------------------------------------------------------------------
|
|
--
|
|
-- Design: tinyVLIW8 soft-core processor
|
|
-- Author: Oliver Stecklina <stecklina@ihp-microelectronics.com>
|
|
-- Date: 24.10.2013
|
|
-- File: sysArch_tb.vhd
|
|
--
|
|
-------------------------------------------------------------------------------
|
|
--
|
|
-- Description : System architecture testbench. Using a ROM initialized by
|
|
-- ihex file to simplify system tests.
|
|
--
|
|
-------------------------------------------------------------------------------
|
|
--
|
|
-- Copyright (C) 2015 IHP GmbH, Frankfurt (Oder), Germany
|
|
--
|
|
-- This code is free software. It is licensed under the EUPL, Version 1.1
|
|
-- or - as soon they will be approved by the European Commission - subsequent
|
|
-- versions of the EUPL (the "License").
|
|
-- You may redistribute this code and/or modify it under the terms of this
|
|
-- License.
|
|
-- You may not use this work except in compliance with the License.
|
|
-- You may obtain a copy of the License at:
|
|
--
|
|
-- http://joinup.ec.europa.eu/software/page/eupl/licence-eupl
|
|
--
|
|
-- Unless required by applicable law or agreed to in writing, software
|
|
-- distributed under the License is distributed on an "AS IS" basis,
|
|
-- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
-- See the License for the specific language governing permissions and
|
|
-- limitations under the License.
|
|
--
|
|
-------------------------------------------------------------------------------
|
|
|
library IEEE;
|
library IEEE;
|
use IEEE.std_logic_1164.all;
|
use IEEE.std_logic_1164.all;
|
|
|
entity sysArch_tb is
|
entity sysArch_tb is
|
end sysArch_tb;
|
end sysArch_tb;
|
|
|
architecture beh of sysArch_tb is
|
architecture beh of sysArch_tb is
|
|
|
component sysArch
|
component sysArch
|
port (
|
port (
|
-- clock input
|
-- clock input
|
clk : in std_logic;
|
clk : in std_logic;
|
|
|
-- instruction bus
|
-- instruction bus
|
instMemAddr : out std_logic_vector(10 downto 0);
|
instMemAddr : out std_logic_vector(10 downto 0);
|
instMemDataIn : in std_logic_vector(31 downto 0);
|
instMemDataIn : in std_logic_vector(31 downto 0);
|
instMemEn_n : out std_logic;
|
instMemEn_n : out std_logic;
|
|
|
-- data bus
|
-- data bus
|
dataMemAddr : out std_logic_vector(7 downto 0);
|
dataMemAddr : out std_logic_vector(7 downto 0);
|
dataMemDataIn : in std_logic_vector(7 downto 0);
|
dataMemDataIn : in std_logic_vector(7 downto 0);
|
dataMemDataOut : out std_logic_vector(7 downto 0);
|
dataMemDataOut : out std_logic_vector(7 downto 0);
|
dataMemEn_n : out std_logic;
|
dataMemEn_n : out std_logic;
|
dataMemWr_n : out std_logic;
|
dataMemWr_n : out std_logic;
|
|
|
ioAddr : out std_logic_vector(7 downto 0);
|
ioAddr : out std_logic_vector(7 downto 0);
|
ioDataIn : in std_logic_vector(7 downto 0);
|
ioDataIn : in std_logic_vector(7 downto 0);
|
ioDataOut : out std_logic_vector(7 downto 0);
|
ioDataOut : out std_logic_vector(7 downto 0);
|
ioWrEn_n : out std_logic;
|
ioWrEn_n : out std_logic;
|
ioRdEn_n : out std_logic;
|
ioRdEn_n : out std_logic;
|
|
|
-- interrupt handling
|
-- interrupt handling
|
irqLine : in std_logic;
|
irqLine : in std_logic;
|
irqLineAck : out std_logic;
|
irqLineAck : out std_logic;
|
|
|
-- general purpose IO
|
-- general purpose IO
|
gpio_in : in std_logic_vector(7 downto 0);
|
gpio_in : in std_logic_vector(7 downto 0);
|
gpio_out : out std_logic_vector(7 downto 0);
|
gpio_out : out std_logic_vector(7 downto 0);
|
gpio_dir : out std_logic_vector(7 downto 0);
|
gpio_dir : out std_logic_vector(7 downto 0);
|
|
|
spi_clk : OUT STD_LOGIC; -- SPI clock
|
spi_clk : OUT STD_LOGIC; -- SPI clock
|
spi_cs : OUT STD_LOGIC; -- SPI slave select, active level configurable
|
spi_cs : OUT STD_LOGIC; -- SPI slave select, active level configurable
|
spi_mosi : OUT STD_LOGIC; -- SPI master output, slave input
|
spi_mosi : OUT STD_LOGIC; -- SPI master output, slave input
|
spi_miso : IN STD_LOGIC; -- SPI master input, slave output
|
spi_miso : IN STD_LOGIC; -- SPI master input, slave output
|
|
|
stall_n : in std_logic;
|
stall_n : in std_logic;
|
stalled_n : out std_logic;
|
stalled_n : out std_logic;
|
|
|
-- reset input
|
-- reset input
|
rst_n : in std_logic
|
rst_n : in std_logic
|
);
|
);
|
end component;
|
end component;
|
|
|
component symDecoder
|
|
port (
|
|
clk : in std_logic;
|
|
|
|
codeA : in std_logic;
|
|
codeB : in std_logic;
|
|
|
|
ioAddr : in std_logic_vector(3 downto 0); -- register address
|
|
ioWriteEn_n : in std_logic; -- write enable, low active
|
|
ioReadEn_n : in std_logic; -- read enable, low active
|
|
|
|
ioDataOut : out std_logic_vector(7 downto 0); -- data bus for writing register
|
|
ioDataIn : in std_logic_vector(7 downto 0); -- data bus for reading register
|
|
|
|
irq : out std_logic;
|
|
irq_ack : in std_logic;
|
|
|
|
rst_n : in std_logic
|
|
);
|
|
end component;
|
|
|
|
component lib_tb_clock32kHz is
|
component lib_tb_clock32kHz is
|
port (
|
port (
|
signal clk : out std_logic;
|
signal clk : out std_logic;
|
signal rst_n : out std_logic
|
signal rst_n : out std_logic
|
);
|
);
|
end component;
|
end component;
|
|
|
component dataMem
|
component dataMem
|
PORT (
|
PORT (
|
address : IN STD_LOGIC_VECTOR (7 DOWNTO 0);
|
address : IN STD_LOGIC_VECTOR (7 DOWNTO 0);
|
data : IN STD_LOGIC_VECTOR (7 DOWNTO 0);
|
data : IN STD_LOGIC_VECTOR (7 DOWNTO 0);
|
inclock : IN STD_LOGIC;
|
inclock : IN STD_LOGIC;
|
outclock : IN STD_LOGIC;
|
outclock : IN STD_LOGIC;
|
wren : IN STD_LOGIC;
|
wren : IN STD_LOGIC;
|
q : OUT STD_LOGIC_VECTOR (7 DOWNTO 0)
|
q : OUT STD_LOGIC_VECTOR (7 DOWNTO 0)
|
);
|
);
|
end component dataMem;
|
end component dataMem;
|
|
|
component lib_tb_rom32bit is
|
component lib_tb_rom32bit is
|
generic ( fileName : string );
|
generic ( fileName : string );
|
port (
|
port (
|
signal addr : in std_logic_vector(10 downto 0);
|
signal addr : in std_logic_vector(10 downto 0);
|
signal dataOut : out std_logic_vector(31 downto 0);
|
signal dataOut : out std_logic_vector(31 downto 0);
|
signal en_n : in std_logic
|
signal en_n : in std_logic
|
);
|
);
|
end component;
|
end component;
|
|
|
component wurCodeGen_tb is
|
|
port (
|
|
clk : in std_logic;
|
|
|
|
pattern : in std_logic_vector(31 downto 0);
|
|
mask : in std_logic_vector(31 downto 0);
|
|
|
|
codeA : out std_logic;
|
|
codeB : out std_logic;
|
|
|
|
finished : out std_logic;
|
|
|
|
rst_n : in std_logic
|
|
);
|
|
end component;
|
|
|
|
component gendelay
|
component gendelay
|
generic (n: integer := 1);
|
generic (n: integer := 1);
|
port (
|
port (
|
a_in : in std_logic;
|
a_in : in std_logic;
|
a_out : out std_logic
|
a_out : out std_logic
|
);
|
);
|
end component;
|
end component;
|
|
|
signal clk_s : std_logic;
|
signal clk_s : std_logic;
|
|
|
signal dataAddr_s : std_logic_vector(7 downto 0);
|
signal dataAddr_s : std_logic_vector(7 downto 0);
|
signal dataIn_s : std_logic_vector(7 downto 0);
|
signal dataIn_s : std_logic_vector(7 downto 0);
|
signal dataOut_s : std_logic_vector(7 downto 0);
|
signal dataOut_s : std_logic_vector(7 downto 0);
|
signal dataEn_n_s : std_logic;
|
signal dataEn_n_s : std_logic;
|
signal dataEnDly_n_s : std_logic;
|
signal dataEnDly_n_s : std_logic;
|
signal dataWr_n_s : std_logic;
|
signal dataWr_n_s : std_logic;
|
signal dataWr_s : std_logic;
|
signal dataWr_s : std_logic;
|
|
|
signal instAddr_s : std_logic_vector(10 downto 0);
|
signal instAddr_s : std_logic_vector(10 downto 0);
|
signal instData_s : std_logic_vector(31 downto 0);
|
signal instData_s : std_logic_vector(31 downto 0);
|
signal instEn_n_s : std_logic;
|
signal instEn_n_s : std_logic;
|
|
|
signal gpio_in_s : std_logic_vector(7 downto 0);
|
signal gpio_in_s : std_logic_vector(7 downto 0);
|
signal gpio_out_s : std_logic_vector(7 downto 0);
|
signal gpio_out_s : std_logic_vector(7 downto 0);
|
signal gpio_dir_s : std_logic_vector(7 downto 0);
|
signal gpio_dir_s : std_logic_vector(7 downto 0);
|
|
|
signal stall_n_s : std_logic := '1';
|
signal stall_n_s : std_logic := '1';
|
signal stalled_n_s : std_logic;
|
signal stalled_n_s : std_logic;
|
|
|
signal ioAddr_s : std_logic_vector(7 downto 0) := (others => '0');
|
signal ioAddr_s : std_logic_vector(7 downto 0) := (others => '0');
|
signal ioDataIn_s : std_logic_vector(7 downto 0) := (others => '0');
|
signal ioDataIn_s : std_logic_vector(7 downto 0) := (others => '0');
|
signal ioDataOut_s : std_logic_vector(7 downto 0);
|
signal ioDataOut_s : std_logic_vector(7 downto 0);
|
signal ioWrEn_n_s : std_logic := '1';
|
signal ioWrEn_n_s : std_logic := '1';
|
signal ioRdEn_n_s : std_logic := '1';
|
signal ioRdEn_n_s : std_logic := '1';
|
|
|
signal irqLine_s : std_logic;
|
signal irqLine_s : std_logic;
|
signal irqLineAck_s : std_logic := '0';
|
signal irqLineAck_s : std_logic := '0';
|
|
|
signal spiClk_s : std_logic;
|
signal spiClk_s : std_logic;
|
signal spiCs_s : std_logic;
|
signal spiCs_s : std_logic;
|
signal spiMosi_s : std_logic;
|
signal spiMosi_s : std_logic;
|
signal spiMiso_s : std_logic := '0';
|
signal spiMiso_s : std_logic := '0';
|
|
|
signal dataInClk_s : std_logic;
|
signal dataInClk_s : std_logic;
|
signal dataOutClk_s : std_logic;
|
signal dataOutClk_s : std_logic;
|
|
|
signal ioSymRdEn_n_s : std_logic;
|
|
|
|
signal wurPattern_s : std_Logic_vector(31 downto 0);
|
|
signal wurMsk_s : std_Logic_vector(31 downto 0);
|
|
signal codeA_s : std_logic;
|
|
signal codeB_s : std_logic;
|
|
|
|
signal wurCodeEn_n_s : std_logic;
|
|
signal wurCodeFin_s : std_logic;
|
|
|
|
signal rst_n_s : std_logic := '1';
|
signal rst_n_s : std_logic := '1';
|
|
|
begin
|
begin
|
|
|
sysArch_i : sysArch
|
sysArch_i : sysArch
|
port map(
|
port map(
|
clk => clk_s,
|
clk => clk_s,
|
|
|
-- instruction bus
|
-- instruction bus
|
instMemAddr => instAddr_s,
|
instMemAddr => instAddr_s,
|
instMemDataIn => instData_s,
|
instMemDataIn => instData_s,
|
instMemEn_n => instEn_n_s,
|
instMemEn_n => instEn_n_s,
|
|
|
-- data bus
|
-- data bus
|
dataMemAddr => dataAddr_s,
|
dataMemAddr => dataAddr_s,
|
dataMemDataIn => dataIn_s,
|
dataMemDataIn => dataIn_s,
|
dataMemDataOut => dataOut_s,
|
dataMemDataOut => dataOut_s,
|
dataMemEn_n => dataEn_n_s,
|
dataMemEn_n => dataEn_n_s,
|
dataMemWr_n => dataWr_n_s,
|
dataMemWr_n => dataWr_n_s,
|
|
|
ioAddr => ioAddr_s,
|
ioAddr => ioAddr_s,
|
ioDataIn => ioDataIn_s,
|
ioDataIn => ioDataIn_s,
|
ioDataOut => ioDataOut_s,
|
ioDataOut => ioDataOut_s,
|
ioWrEn_n => ioWrEn_n_s,
|
ioWrEn_n => ioWrEn_n_s,
|
ioRdEn_n => ioRdEn_n_s,
|
ioRdEn_n => ioRdEn_n_s,
|
|
|
irqLine => irqLine_s,
|
irqLine => irqLine_s,
|
irqLineAck => irqLineAck_s,
|
irqLineAck => irqLineAck_s,
|
|
|
-- general purpose IO
|
-- general purpose IO
|
gpio_in => gpio_in_s,
|
gpio_in => gpio_in_s,
|
gpio_out => gpio_out_s,
|
gpio_out => gpio_out_s,
|
gpio_dir => gpio_dir_s,
|
gpio_dir => gpio_dir_s,
|
|
|
spi_clk => spiClk_s,
|
spi_clk => spiClk_s,
|
spi_cs => spiCs_s,
|
spi_cs => spiCs_s,
|
spi_mosi => spiMosi_s,
|
spi_mosi => spiMosi_s,
|
spi_miso => spiMiso_s,
|
spi_miso => spiMiso_s,
|
|
|
stall_n => stall_n_s,
|
stall_n => stall_n_s,
|
stalled_n => stalled_n_s,
|
stalled_n => stalled_n_s,
|
|
|
rst_n => rst_n_s
|
rst_n => rst_n_s
|
);
|
);
|
|
|
symDecoder_i: symDecoder
|
|
port map (
|
|
clk => clk_s,
|
|
|
|
codeA => codeA_s,
|
|
codeB => codeB_s,
|
|
|
|
ioAddr => ioAddr_s(3 downto 0),
|
|
ioWriteEn_n => ioWrEn_n_s,
|
|
ioReadEn_n => ioSymRdEn_n_s,
|
|
|
|
ioDataOut => ioDataIn_s,
|
|
ioDataIn => ioDataOut_s,
|
|
|
|
irq => irqLine_s,
|
|
irq_ack => irqLineAck_s,
|
|
|
|
rst_n => rst_n_s
|
|
);
|
|
|
|
ioSymRdEn_n_s <= ioRdEn_n_s when ioAddr_s(7 downto 4) = "0100" else
|
|
'1';
|
|
|
|
tb_wurCodeGen_i: wurCodeGen_tb
|
|
port map (
|
|
clk => clk_s,
|
|
pattern => wurPattern_s,
|
|
mask => wurMsk_s,
|
|
codeA => codeA_s,
|
|
codeB => codeB_s,
|
|
finished => wurCodeFin_s,
|
|
rst_n => wurCodeEn_n_s
|
|
);
|
|
|
|
tb_clock32kHz_i: lib_tb_clock32kHz
|
tb_clock32kHz_i: lib_tb_clock32kHz
|
port map (
|
port map (
|
clk => clk_s,
|
clk => clk_s,
|
rst_n => rst_n_s
|
rst_n => rst_n_s
|
);
|
);
|
|
|
tb_rom32bit_i: lib_tb_rom32bit
|
tb_rom32bit_i: lib_tb_rom32bit
|
generic map ( fileName => "../programs/sha1Test.ihex" )
|
generic map ( fileName => "../opencores/tinyvliw8/tinyvliw8/trunk/programs/timerIrq.ihex" )
|
port map (
|
port map (
|
addr => instAddr_s,
|
addr => instAddr_s,
|
dataOut => instData_s,
|
dataOut => instData_s,
|
en_n => instEn_n_s
|
en_n => instEn_n_s
|
);
|
);
|
|
|
dataMem_i : dataMem
|
dataMem_i : dataMem
|
port map (
|
port map (
|
address => dataAddr_s,
|
address => dataAddr_s,
|
data => dataOut_s,
|
data => dataOut_s,
|
inclock => dataInClk_s,
|
inclock => dataInClk_s,
|
outclock => dataOutClk_s,
|
outclock => dataOutClk_s,
|
wren => dataWr_s,
|
wren => dataWr_s,
|
q => dataIn_s
|
q => dataIn_s
|
);
|
);
|
|
|
dataWr_s <= not(dataWr_n_s);
|
dataWr_s <= not(dataWr_n_s);
|
|
|
dataMemOutClk_delay_i: gendelay
|
dataMemOutClk_delay_i: gendelay
|
generic map (n => 5)
|
generic map (n => 5)
|
port map (
|
port map (
|
a_in => dataEn_n_s,
|
a_in => dataEn_n_s,
|
a_out => dataEnDly_n_s
|
a_out => dataEnDly_n_s
|
);
|
);
|
|
|
dataInClk_s <= '1' when (dataEn_n_s = '0' and dataEnDly_n_s = '1' and dataWr_n_s = '1') or
|
dataInClk_s <= '1' when (dataEn_n_s = '0' and dataEnDly_n_s = '1' and dataWr_n_s = '1') or
|
(dataEn_n_s = '0' and dataEnDly_n_s = '0' and dataWr_n_s = '0') else
|
(dataEn_n_s = '0' and dataEnDly_n_s = '0' and dataWr_n_s = '0') else
|
'0';
|
'0';
|
dataOutClk_s <= not(dataInClk_s);
|
dataOutClk_s <= not(dataInClk_s);
|
|
|
|
|
wurGen_p : process
|
|
begin
|
|
wurMsk_s <= x"ffffffff";
|
|
wurPattern_s <= x"abababab";
|
|
wurCodeEn_n_s <= '0';
|
|
|
|
loop
|
|
wait on rst_n_s;
|
|
exit when rst_n_s = '1';
|
|
end loop;
|
|
|
|
loop
|
|
wait for 100 ms;
|
|
|
|
wurCodeEn_n_s <= '1';
|
|
|
|
loop
|
|
wait on wurCodeFin_s;
|
|
exit when wurCodeFin_s = '1';
|
|
end loop;
|
|
|
|
wurCodeEn_n_s <= '0';
|
|
end loop;
|
|
end process;
|
|
|
|
end beh;
|
end beh;
|
|
|
|
|