stackprocessor/tb_alu.vhdl

193 lines
4.9 KiB
VHDL

-- tb_alu.vhdl
-- Date: Sun Mar 3 09:47:29 2024
-- Author: Yannick Reiß
-- E-Mail: yannick.reiss@nickr.eu
library IEEE;
use IEEE.std_logic_1164.all;
use IEEE.numeric_std.all;
library std;
use std.textio.all;
library work;
entity alu_tb is
end alu_tb;
architecture Testbench of alu_tb is
signal clk : std_logic;
constant clk_period : time := 10 ns;
signal operator : std_logic_vector(5 downto 0) := "111111";
signal operand1 : std_logic_vector(7 downto 0) := (others => '0');
signal operand2 : std_logic_vector(7 downto 0) := (others => '0');
signal target : std_logic_vector(7 downto 0) := (others => '0');
signal test_result : std_logic := '0';
signal result : std_logic_vector(7 downto 0) := (others => '0');
begin
uut : entity work.alu(Logic)
port map (
operator => operator,
operand1 => operand1,
operand2 => operand2,
result => result
);
clk_process : process
begin
clk <= '0';
wait for clk_period/2;
clk <= '1';
wait for clk_period/2;
end process;
testing : process
variable lineBuffer : line;
begin
wait until rising_edge(clk);
write(lineBuffer, string'("Starting the simulator"));
writeline(output, lineBuffer);
-- Testcases
operand1 <= std_logic_vector(to_unsigned(3, 8));
operand2 <= std_logic_vector(to_unsigned(20, 8));
-- Not
wait for 5 ns;
operator <= "000000";
target <= operand1 xor "11111111";
wait for 5 ns;
if not (target = result) then
write(lineBuffer, string'("Error on Not"));
writeline(output, lineBuffer);
end if;
-- Parity
wait for 5 ns;
operator <= "000100";
target <= "00000000";
wait for 5 ns;
if not (unsigned(result) = unsigned(target)) then
write(lineBuffer, string'("Error on Parity"));
writeline(output, lineBuffer);
end if;
-- Count
wait for 5 ns;
operator <= "001000";
target <= "00000010";
wait for 5 ns;
if not (unsigned(result) = 1) then
write(lineBuffer, string'("Error on Count"));
writeline(output, lineBuffer);
end if;
-- And
wait for 5 ns;
operator <= "001101";
target <= operand1 and operand2;
wait for 5 ns;
if not (result = target) then
write(lineBuffer, string'("Error on And"));
writeline(output, lineBuffer);
end if;
-- Or
wait for 5 ns;
operator <= "010001";
wait for 5 ns;
if not (result = (operand1 or operand2)) then
write(lineBuffer, string'("Error on Or"));
writeline(output, lineBuffer);
end if;
-- Xor
wait for 5 ns;
operator <= "010101";
wait for 5 ns;
if not (result = (operand1 xor operand2)) then
write(lineBuffer, string'("Error on Xor"));
writeline(output, lineBuffer);
end if;
-- Move
wait for 5 ns;
operator <= "011001";
wait for 5 ns;
if not (result = operand2) then
write(lineBuffer, string'("Error on Move"));
writeline(output, lineBuffer);
end if;
-- Shift left
wait for 5 ns;
operator <= "011101";
wait for 5 ns;
if not (result = std_logic_vector(to_stdlogicvector(to_bitvector(operand1) sll to_integer(unsigned(operand2))))) then
write(lineBuffer, string'("Error on Shift left"));
writeline(output, lineBuffer);
end if;
-- Shift right
wait for 5 ns;
operator <= "100001";
wait for 5 ns;
if not (result = std_logic_vector(to_stdlogicvector(to_bitvector(operand1) srl to_integer(unsigned(operand2))))) then
write(lineBuffer, string'("Error on Shift right"));
writeline(output, lineBuffer);
end if;
-- Add
wait for 5 ns;
operator <= "000010";
wait for 5 ns;
if not (result = std_logic_vector(unsigned(operand1) + unsigned(operand2))) then
write(lineBuffer, string'("Error on Add"));
writeline(output, lineBuffer);
end if;
-- Sub
wait for 5 ns;
operator <= "000110";
wait for 5 ns;
if not (result = std_logic_vector(signed(operand1) - signed(operand2))) then
write(lineBuffer, string'("Error on Sub"));
writeline(output, lineBuffer);
end if;
-- Seq
wait for 5 ns;
operator <= "000011";
wait for 5 ns;
if not (result = "00000000") then
write(lineBuffer, string'("Error on Set if Equal"));
writeline(output, lineBuffer);
end if;
-- Slt
wait for 5 ns;
operator <= "000111";
wait for 5 ns;
if not (result = "00000001") then
write(lineBuffer, string'("Error on Set if Lower"));
writeline(output, lineBuffer);
end if;
-- Sltu
wait for 5 ns;
operator <= "001011";
wait for 5 ns;
if not (result = "00000001") then
write(lineBuffer, string'("Error on Set if lower unsigned"));
writeline(output, lineBuffer);
end if;
write(lineBuffer, string'("End of simulator"));
writeline(output, lineBuffer);
wait;
end process;
end Testbench;