Lightening_Transformer/tb_tile_array.vhd
2025-06-09 19:11:01 +02:00

149 lines
3.5 KiB
VHDL

library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;
use std.textio.all;
use work.real_vector_pkg.all;
--use work.tile_array_pkg.all;
entity tile_array_tb is
end tile_array_tb;
architecture Behavioral of tile_array_tb is
-- Constants
constant Np : integer := 4;
constant Nm : integer := 4;
constant Nq : integer := 4;
constant Nt : integer := 2;
constant Nd : integer := 2;
constant Nh : integer := 2;
constant N : integer := 2;
constant clk_period : time := 10 ns;
-- Signals
signal clk : std_logic := '0';
signal reset_n : std_logic := '0';
signal enable : std_logic := '0';
signal m1 : my_real_matrix(0 to Np-1, 0 to Nm-1);
signal m2 : my_real_matrix(0 to Nq-1, 0 to Nm-1);
signal result_valid : std_logic;
signal result : real_matrix(0 to Np-1, 0 to Nq-1);
begin
-- Clock generation
clk_process : process
begin
while true loop
clk <= '0';
wait for clk_period / 2;
clk <= '1';
wait for clk_period / 2;
end loop;
end process;
-- DUT instantiation
uut: entity work.tile_array
generic map (
Np => Np, Nm => Nm, Nq => Nq, Nt => Nt,
Nd => Nd, Nh => Nh, N => N
)
port map (
clk => clk,
reset_n => reset_n,
enable => enable,
m1 => m1,
m2 => m2,
result_valid => result_valid,
result => result
);
-- Stimulus process
stim_proc: process
variable i, j : integer;
variable L : line;
file out_file : text open write_mode is "tile_array_out.txt"; --n
file m1_file : text open write_mode is "m1.txt"; --n
file m2_file : text open write_mode is "m2.txt"; --n
begin
-- Reset and initialize
reset_n <= '0';
wait for 2 * clk_period;
reset_n <= '1';
wait for clk_period;
-- Initialize M1 matrix (values 1 to 16)
for i in 0 to Np-1 loop
for j in 0 to Nm-1 loop
m1(i, j) <= real(i * Nm + j + 1);
end loop;
end loop;
wait for clk_period;
-- Write M1 to file
for i in 0 to Np-1 loop
L := null;
for j in 0 to Nm-1 loop
write(L, m1(i,j), right, 0, 6);
write(L, string'(" "));
end loop;
writeline(m1_file, L);
end loop;
-- Initialize M2 matrix (row i: 10*(i+1) + j + 1)
for i in 0 to Nq-1 loop
for j in 0 to Nm-1 loop
m2(i, j) <= real((i + 1) * 5 + j + 1);
end loop;
end loop;
wait for clk_period;
-- Write M2 to file
for i in 0 to Nq-1 loop
L := null;
for j in 0 to Nm-1 loop
write(L, m2(i,j), right, 0, 6);
write(L, string'(" "));
end loop;
writeline(m2_file, L);
end loop;
wait for clk_period * 2;
enable <= '1';
wait until rising_edge(result_valid);
enable <= '0';
wait for clk_period;
-- Print final result
write(L, string'("===== FINAL RESULT ===== at time " & time'image(now)));
writeline(out_file, L);
for i in 0 to Np-1 loop
L := null;
for j in 0 to Nq-1 loop
write(L, result(i,j), right, 0, 6);
write(L, string'(" "));
end loop;
writeline(out_file, L);
end loop;
report "Matrix multiplication result is valid.";
-- Detailed reporting
for i in 0 to Np-1 loop
for j in 0 to Nq-1 loop
report "Result(" & integer'image(i) & "," & integer'image(j) & ") = " &
real'image(result(i, j));
end loop;
end loop;
wait;
end process;
end Behavioral;