194 lines
4.6 KiB
VHDL
194 lines
4.6 KiB
VHDL
|
|
library ieee;
|
|
use ieee.std_logic_1164.all;
|
|
use ieee.numeric_std.all;
|
|
|
|
library work;
|
|
use work.wishbone.all;
|
|
use work.can_tp.all;
|
|
use work.config.all;
|
|
|
|
entity can_demo_tb is
|
|
end entity can_demo_tb;
|
|
|
|
architecture RTL of can_demo_tb is
|
|
|
|
|
|
component can_vhdl_top is
|
|
generic(
|
|
memaddr : generic_addr_type;
|
|
addrmask : generic_mask_type
|
|
);
|
|
port(
|
|
clk : in std_logic;
|
|
rstn : in std_logic;
|
|
wbs_i : in wb_slv_in_type;
|
|
wbs_o : out wb_slv_out_type;
|
|
rx_i : in std_logic;
|
|
tx_o : out std_logic;
|
|
irq_on : out std_logic
|
|
);
|
|
end component can_vhdl_top;
|
|
|
|
|
|
component phys_can_sim
|
|
generic(
|
|
peer_num : integer );
|
|
port(
|
|
rst : in std_logic;
|
|
rx_vector : out std_logic_vector(peer_num - 1 downto 0);
|
|
tx_vector : in std_logic_vector(peer_num - 1 downto 0) );
|
|
end component phys_can_sim;
|
|
|
|
|
|
-- management signal
|
|
signal clk : std_logic := '0';
|
|
signal rst : std_logic := '1';
|
|
signal test_result: rx_check_result;
|
|
--signal tx_frame: std_logic_vector(0 to 108);
|
|
|
|
-- signals to/from controller 1
|
|
signal wbs_i1 : wb_slv_in_type := wbs_in_default;
|
|
signal wbs_o1 : wb_slv_out_type;
|
|
signal irq_on1 : std_logic;
|
|
|
|
-- signals to/from controller
|
|
signal wbs_i2 : wb_slv_in_type:= wbs_in_default;
|
|
signal wbs_o2 : wb_slv_out_type;
|
|
signal irq_on2 : std_logic;
|
|
|
|
--signals can interconnect
|
|
constant peer_num_inst : integer := 3;
|
|
signal rx_vector : std_logic_vector(peer_num_inst - 1 downto 0);
|
|
signal tx_vector : std_logic_vector(peer_num_inst - 1 downto 0);
|
|
|
|
begin
|
|
|
|
|
|
can_inst_1 : component can_vhdl_top
|
|
generic map(
|
|
memaddr=>CFG_BADR_MEM,
|
|
addrmask=>CFG_MADR_FULL
|
|
)
|
|
port map(
|
|
clk => clk,
|
|
rstn => rst,
|
|
wbs_i => wbs_i1,
|
|
wbs_o => wbs_o1,
|
|
rx_i => rx_vector(0),
|
|
tx_o => tx_vector(0),
|
|
irq_on => irq_on1);
|
|
|
|
can_inst_2 : component can_vhdl_top
|
|
generic map(
|
|
memaddr=>CFG_BADR_MEM,
|
|
addrmask=>CFG_MADR_FULL
|
|
)
|
|
port map(
|
|
clk => clk,
|
|
rstn => rst,
|
|
wbs_i => wbs_i2,
|
|
wbs_o => wbs_o2,
|
|
rx_i => rx_vector(1),
|
|
tx_o => tx_vector(1),
|
|
irq_on => irq_on2);
|
|
|
|
can_interconnect : component phys_can_sim
|
|
generic map( peer_num => peer_num_inst)
|
|
port map( rst => rst,
|
|
rx_vector => rx_vector,
|
|
tx_vector => tx_vector);
|
|
|
|
-- stimuli
|
|
stimuli: process is
|
|
begin
|
|
report "begin stimuli" severity warning;
|
|
--this tx line is used manually
|
|
tx_vector(2) <= '1';
|
|
|
|
wait for 40 ns;
|
|
rst <= '0';
|
|
|
|
|
|
--setup both can nodes
|
|
write_regs_from_file( "/home/derek/Git/lt16lab/soc/testbench/testdata/default_setup.tdf", wbs_i1, wbs_o1, clk);
|
|
--wait for 1000 ns;
|
|
write_regs_from_file( "/home/derek/Git/lt16lab/soc/testbench/testdata/default_setup.tdf", wbs_i2, wbs_o2, clk);
|
|
|
|
wait for 1000 ns;
|
|
--setup and execute a 2 byte transmission in controller 1
|
|
write_regs_from_file( "/home/derek/Git/lt16lab/soc/testbench/testdata/data_send.tdf", wbs_i1, wbs_o1, clk);
|
|
tx_vector(2) <= tx_vector(1);
|
|
|
|
--manual ack by copying controler 2's ack
|
|
wait on tx_vector(1);
|
|
tx_vector(2) <= '0';
|
|
wait for 300 ns;
|
|
tx_vector(2) <= '1';
|
|
|
|
wait on irq_on2;
|
|
|
|
--read status register of controller 1
|
|
can_wb_read_reg(wbs_i1, wbs_o1, 2, clk);
|
|
--read from controller 2's read buffer
|
|
read_regs_with_fileaddr("/home/derek/Git/lt16lab/soc/testbench/testdata/data_read.tdf", "read_data0.tdf", wbs_i2, wbs_o2, clk);
|
|
|
|
wait for 1200 ns;
|
|
--release receive buffer of controller 2
|
|
can_wb_write_reg(wbs_i2, wbs_o2, 1, "00000100", clk);
|
|
|
|
wait for 1200 ns;
|
|
|
|
--manually transmit a 2 byte message on tx line 2 (tx_vector(2))
|
|
simulate_can_transmission("11100010111", x"770F000000000000", 2, 300 ns, rx_vector(2), tx_vector(2), test_result);
|
|
tx_vector(2) <= '1';
|
|
|
|
wait on irq_on2;
|
|
|
|
--read from both receive buffers
|
|
read_regs_with_fileaddr("/home/derek/Git/lt16lab/soc/testbench/testdata/data_read.tdf", "read_data1.tdf", wbs_i1, wbs_o1, clk);
|
|
read_regs_with_fileaddr("/home/derek/Git/lt16lab/soc/testbench/testdata/data_read.tdf", "read_data2.tdf", wbs_i2, wbs_o2, clk);
|
|
wait for 2400 ns;
|
|
--release both receive buffers
|
|
can_wb_write_reg(wbs_i1, wbs_o1, 1, "00000100", clk);
|
|
can_wb_write_reg(wbs_i2, wbs_o2, 1, "00000100", clk);
|
|
|
|
wait for 1200 ns;
|
|
report "end stimuli" severity failure;
|
|
wait;
|
|
|
|
end process stimuli;
|
|
|
|
|
|
-- clock generation
|
|
clock : process is
|
|
begin
|
|
clk <= not clk;
|
|
wait for 10 ns / 2;
|
|
end process clock;
|
|
|
|
-- files used in this testbench:
|
|
--
|
|
-- default_setup.tdf:
|
|
-- 4 00000000
|
|
-- 5 11111111
|
|
-- 6 10000000
|
|
-- 7 01001000
|
|
-- 8 00000010
|
|
-- 0 11111110
|
|
--
|
|
-- data_send.tdf:
|
|
-- 10 10101010
|
|
-- 11 11000010
|
|
-- 12 10101010
|
|
-- 13 00001111
|
|
-- 1 00000001
|
|
--
|
|
-- data_read.tdf:
|
|
-- 20
|
|
-- 21
|
|
-- 22
|
|
-- 23
|
|
|
|
end architecture RTL;
|