vhdl_einfuehrung_u2/test/tb_fsm_add.vhd
2025-11-10 21:50:44 +01:00

116 lines
3.4 KiB
VHDL

library ieee;
use ieee.std_logic_1164.all;
use ieee.float_pkg.all;
library work;
use work.test_utility.all;
use work.sine_data.all;
use work.cosine_data.all;
use work.sine_cosine_data.all;
library std;
use std.env.all;
use std.textio.all;
entity tb_fsm_add is
generic( CHECK_RESULTS : boolean; GUI_MODE : boolean := true );
end;
architecture test of tb_fsm_add is
signal clk : std_logic := '0';
signal reset : std_logic := '1';
signal run_calc : std_logic;
signal calc_cnt : std_logic_vector( 3 downto 0 );
signal signal_a_read : std_logic;
signal signal_a_readdata : std_logic_vector( 31 downto 0 );
signal signal_b_read : std_logic;
signal signal_b_readdata : std_logic_vector( 31 downto 0 );
signal signal_write : std_logic;
signal signal_writedata : std_logic_vector( 31 downto 0 );
begin
u_fsm_add : entity work.fsm_add
port map (
clk => clk,
reset => reset,
run_calc => run_calc,
calc_cnt => calc_cnt,
signal_a_read => signal_a_read,
signal_a_readdata => signal_a_readdata,
signal_b_read => signal_b_read,
signal_b_readdata => signal_b_readdata,
signal_write => signal_write,
signal_writedata => signal_writedata
);
a_clk: clk <= not clk after 10 ns;
a_reset: process( clk )
begin
if falling_edge( clk ) then
reset <= '0';
end if;
end process;
input_data_a_simulus: process is
variable index : integer := 0;
begin
while true loop
signal_a_readdata <= to_std_logic_vector( to_float( work.sine_data.expected( index ) ) );
wait until rising_edge( signal_a_read );
if ( index < 1023 ) then
index := index + 1;
end if;
end loop;
end process input_data_a_simulus;
input_data_b_simulus: process is
variable index : integer := 0;
begin
while true loop
signal_b_readdata <= to_std_logic_vector( to_float( work.cosine_data.expected( index ) ) );
wait until rising_edge( signal_b_read );
if ( index < 1023 ) then
index := index + 1;
end if;
end loop;
end process input_data_b_simulus;
stimulus: process is
variable expected : real;
variable float_value : float32;
variable real_value : real;
variable abs_err : real := 0.5e-1;
begin
std.textio.write( std.textio.OUTPUT, "--------------------------------------------------------------------------------" & LF );
std.textio.write( std.textio.OUTPUT, "Starting tb_fsm_add" & LF );
wait until falling_edge( reset );
wait until falling_edge( clk );
run_calc <= '1';
wait until falling_edge( clk );
for i in 0 to 16 loop
wait until rising_edge( signal_write );
expected := work.sine_cosine_data.expected( i + 1 );
float_value := to_float( signal_writedata );
real_value := to_real( float_value );
assert_near( real_value, expected, abs_err );
end loop;
if GUI_MODE = true then
finish;
else
stop;
end if;
end process stimulus;
end architecture test;