Skip to content

Instantly share code, notes, and snippets.

@rafaelnp
Last active November 20, 2022 21:23
Show Gist options
  • Save rafaelnp/b8c906ae71a8e0b0daa2d5fe98e6b895 to your computer and use it in GitHub Desktop.
Save rafaelnp/b8c906ae71a8e0b0daa2d5fe98e6b895 to your computer and use it in GitHub Desktop.
library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;
use ieee.numeric_std_unsigned.all;
library vunit_lib;
context vunit_lib.vunit_context;
context vunit_lib.vc_context;
entity axi_stream_master_min_tb is
generic(
runner_cfg : string;
tb_path : string
);
end entity axi_stream_master_min_tb;
architecture behaviour of axi_stream_master_min_tb is
constant c_CLOCK_PERIOD : time := 10 ns;
constant c_DATAWIDTH : natural := 32;
constant master_axi_stream : axi_stream_master_t := new_axi_stream_master(
data_length => c_DATAWIDTH
);
constant slave_axi_stream : axi_stream_slave_t := new_axi_stream_slave(
data_length => c_DATAWIDTH
);
signal clk : std_logic := '0';
signal resetn : std_logic := '1';
signal start : std_logic := '0';
signal done : std_logic := '0';
signal enable : std_logic := '0';
-- master signals
signal m_valid : std_logic;
signal m_ready : std_logic;
signal m_last : std_logic;
signal m_data : std_logic_vector(c_DATAWIDTH-1 downto 0);
-- slave signals
signal s_valid : std_logic;
signal s_ready : std_logic;
signal s_last : std_logic;
signal s_data : std_logic_vector(c_DATAWIDTH-1 downto 0);
begin
------------------------
-- entity instantiations
------------------------
axis_master: entity work.axi_stream_master_min
generic map (
DATA_WIDTH => c_DATAWIDTH
)
port map(
aclk => clk,
aresetn => resetn,
tvalid => m_valid,
tready => m_ready,
tdata => m_data,
tlast => m_last,
enable => enable
);
axis_slave: entity vunit_lib.axi_stream_slave
generic map(
slave => slave_axi_stream
)
port map(
aclk => clk,
areset_n => resetn,
tvalid => s_valid,
tready => s_ready,
tdata => s_data,
tstrb => "1111",
tlast => s_last
);
clock: process is
begin
clk <= not clk;
wait for c_CLOCK_PERIOD/2;
end process clock;
main: process is
begin
test_runner_setup(runner, runner_cfg);
while test_suite loop
if run("test") then
resetn <= '0';
wait for 10*c_CLOCK_PERIOD;
resetn <= '1';
info("Init test");
wait until rising_edge(clk);
start <= '1';
wait until rising_edge(clk);
start <= '0';
wait until rising_edge(clk);
wait until done = '1';
info("Test done");
end if;
end loop;
test_runner_cleanup(runner);
end process main;
master: process is
begin
wait until start = '1';
wait until rising_edge(clk);
info("Sending data...");
enable <= '1';
for i in 0 to 31 loop
push_axi_stream(
net,
master_axi_stream,
m_data,
tlast => m_last
);
end loop;
enable <= '0';
end process master;
slave: process is
variable data : std_logic_vector(c_DATAWIDTH-1 downto 0);
variable last : std_logic:='0';
begin
wait until start = '1';
wait until rising_edge(clk);
done <= '0';
info("Receiving data...");
for i in 0 to 31 loop
pop_axi_stream(
net,
slave_axi_stream,
tdata => data,
tlast => last
);
info("slave data: (" & to_string(i) & "): 0x" & to_hstring(data));
end loop;
wait until rising_edge(clk);
done <= '1';
end process slave;
end architecture behaviour;
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment