1
0
SEm-Labos/Libs/RiscV/HEIRV32_test/concat/concatenated.vhd
github-classroom[bot] d212040c30
Initial commit
2024-02-23 13:01:05 +00:00

3276 lines
92 KiB
VHDL

-- VHDL Entity HEIRV32_test.heirv32_tb.symbol
--
-- Created:
-- by - axel.amand.UNKNOWN (WE2332101)
-- at - 14:52:58 18.10.2022
--
-- Generated by Mentor Graphics' HDL Designer(TM) 2019.2 (Build 5)
--
LIBRARY ieee;
USE ieee.std_logic_1164.all;
USE ieee.numeric_std.all;
ENTITY heirv32_tb IS
-- Declarations
END heirv32_tb ;
-- VHDL Entity HEIRV32_test.universalTester.interface
--
-- Created:
-- by - axel.amand.UNKNOWN (WE7860)
-- at - 16:01:58 24.10.2022
--
-- Generated by Mentor Graphics' HDL Designer(TM) 2019.2 (Build 5)
--
LIBRARY ieee;
USE ieee.std_logic_1164.all;
USE ieee.numeric_std.all;
ENTITY universalTester IS
GENERIC(
c_btnsNb : positive := 2
);
PORT(
btns : OUT std_ulogic_vector (c_btnsNb-1 DOWNTO 0);
clk : OUT std_ulogic;
en : OUT std_ulogic;
rst : OUT std_ulogic
);
-- Declarations
END universalTester ;
LIBRARY std;
USE std.textio.all;
LIBRARY ieee;
USE ieee.std_logic_1164.all;
USE ieee.numeric_std.all;
PACKAGE testUtils IS
--============================================================================
-- console output
--
procedure print(value : string);
--============================================================================
-- string manipulation
--
-- conversion to lowercase
function lc(value : string) return string;
procedure lc(value : inout line);
-- conversion to uppercase
function uc(value : string) return string;
procedure uc(value : inout line);
-- expand a string to a given length
function pad(
value : string;
string_length : natural;
fill_char : character := ' ';
right_justify : boolean := false
) return string;
-- remove separator characters at beginning and end of line
procedure rm_side_separators(
value : inout line;
separators : in string
);
procedure rm_side_separators(
value : inout line
);
-- remove multiple occurences of separator characters
procedure trim_line(
value : inout line;
separators : in string
);
procedure trim_line(
value : inout line
);
-- remove all occurences of separator characters
procedure rm_all_separators(
value : inout line;
separators : in string
);
procedure rm_all_separators(
value : inout line
);
-- find and remove first word
procedure read_first(
value : inout line;
separators : in string;
first : out line
);
procedure read_first(
value : inout line;
first : out line
);
-- find and remove last word
procedure read_last(
value : inout line;
separators : in string;
last : out line
);
procedure read_last(
value : inout line;
last : out line
);
--============================================================================
-- formatted string output
--
-- format codes:
-- code integer real std_logic std_(u)logic_vector (un)signed time
-- b v v v v binary
-- c character
-- d v v v v v decimal
-- e real numbers, with power of 10 exponent
-- f v v fixed point real numbers
-- s string
-- ts v time in seconds
-- tm v time in milliseconds
-- tu v time in microseconds
-- tn v time in nanoseconds
-- tp v time in picoseconds
-- x v v v v hexadecimal
-- X v v v v hexadecimal with upper-case letters
function sprintf(format : string; value : integer ) return string;
function sprintf(format : string; value : real ) return string;
function sprintf(format : string; value : std_logic ) return string;
function sprintf(format : string; value : std_ulogic_vector) return string;
function sprintf(format : string; value : std_logic_vector ) return string;
function sprintf(format : string; value : unsigned ) return string;
function sprintf(format : string; value : signed ) return string;
function sprintf(format : string; value : time ) return string;
--============================================================================
-- formatted string input
--
subtype nibbleUlogicType is std_ulogic_vector(3 downto 0);
subtype nibbleUnsignedType is unsigned(3 downto 0);
function sscanf(value : character) return natural;
function sscanf(value : character) return nibbleUlogicType;
function sscanf(value : character) return nibbleUnsignedType;
function sscanf(value : string ) return natural;
function sscanf(value : string ) return unsigned;
function sscanf(value : string ) return std_ulogic_vector;
function sscanf(value : string ) return time;
procedure sscanf(value : inout line; time_val : out time);
END testUtils;
PACKAGE BODY testUtils IS
--============================================================================
-- console output
--
procedure print(value : string) is
variable my_line : line;
begin
write(my_line, value);
writeLine(output, my_line);
deallocate(my_line);
end print;
--============================================================================
-- string manipulation
--
------------------------------------------------------------------------------
-- change to lowercase
------------------------------------------------------------------------------
procedure lc(value: inout line) is
variable out_line: line;
begin
for index in value'range loop
if (value(index) >= 'A') and (value(index) <= 'Z') then
value(index) := character'val(character'pos(value(index))
- character'pos('A')
+ character'pos('a')
);
end if;
end loop;
end lc;
function lc(value: string) return string is
variable out_line: line;
begin
write(out_line, value);
lc(out_line);
return(out_line.all);
end lc;
------------------------------------------------------------------------------
-- change to uppercase
------------------------------------------------------------------------------
procedure uc(value: inout line) is
variable out_line: line;
begin
for index in value'range loop
if (value(index) >= 'a') and (value(index) <= 'z') then
value(index) := character'val(character'pos(value(index))
- character'pos('a')
+ character'pos('A')
);
end if;
end loop;
end uc;
function uc(value: string) return string is
variable out_line: line;
begin
write(out_line, value);
uc(out_line);
return(out_line.all);
end uc;
------------------------------------------------------------------------------
-- formatted string output: padding and justifying
------------------------------------------------------------------------------
function pad(
value : string;
string_length : natural;
fill_char : character := ' ';
right_justify : boolean := false
) return string is
variable value_line : line;
variable out_line : line;
variable value_length : natural;
variable shift_sign : boolean;
begin
write(value_line, value);
value_length := value_line.all'length;
if string_length = 0 then
write(out_line, value_line.all);
elsif string_length > value_length then
if right_justify then
if (value_line.all(value_line.all'left) <= '-') and not(fill_char = ' ') then
shift_sign := true;
write(out_line, value_line.all(value_line.all'left));
end if;
for index in 1 to string_length-value_length loop
write(out_line, fill_char);
end loop;
end if;
if shift_sign then
write(out_line, value_line.all(value_line.all'left+1 to value_line.all'right));
else
write(out_line, value_line.all);
end if;
if not right_justify then
for index in 1 to string_length-value_length loop
write(out_line, fill_char);
end loop;
end if;
elsif string_length < value_length then
write(out_line, '#');
write(out_line, value_line.all(value_length-string_length+2 to value_length));
else
write(out_line, value_line.all);
end if;
deallocate(value_line);
return(out_line.all);
end pad;
------------------------------------------------------------------------------
-- remove separator characters at beginning and end of line
------------------------------------------------------------------------------
procedure rm_side_separators(
value : inout line;
separators : in string
) is
variable input_line : line := value;
variable found : boolean := false;
variable position : integer := 0;
begin
-- remove all separators in the beginning
position := -1;
for character_index in input_line'range loop
found := false;
for separator_index in separators'range loop
if input_line(character_index) = separators(separator_index) then
found := true;
end if;
end loop;
if found then
position := character_index;
else
exit;
end if;
end loop;
if position > -1 then
input_line := new string'( input_line(position+1 to input_line'right) );
end if;
-- remove all separators in the end
position := -1;
for character_index in input_line'reverse_range loop
found := false;
for separator_index in separators'range loop
if input_line(character_index) = separators(separator_index) then
found := true;
end if;
end loop;
if found then
position := character_index;
else
exit;
end if;
end loop;
if position > -1 then
input_line := new string'( input_line(input_line'left to position-1) );
end if;
value := input_line;
end;
procedure rm_side_separators(value : inout line) is
begin
rm_side_separators(value, " :" & ht);
end;
------------------------------------------------------------------------------
-- remove multiple occurences of separator characters, keeping one single
------------------------------------------------------------------------------
procedure trim_line(
value : inout line;
separators : in string
) is
variable input_line: line := value;
variable output_line: line := new string'("");
variable is_separator, was_separator : boolean := false;
begin
rm_side_separators(input_line);
for character_index in input_line'range loop
is_separator := false;
for separator_index in separators'range loop
if input_line.all(character_index) = separators(separator_index) then
is_separator := true;
end if;
end loop;
if not (is_separator and was_separator) then
write(output_line, input_line.all(character_index));
end if;
was_separator := is_separator;
end loop;
value := output_line;
end;
procedure trim_line(value : inout line) is
begin
trim_line(value, " :" & ht);
end;
------------------------------------------------------------------------------
-- remove all occurences of separator characters
------------------------------------------------------------------------------
procedure rm_all_separators(
value : inout line;
separators : in string
) is
variable input_line : line := value;
variable is_separator : boolean := false;
begin
-- remove separators from beginn and end of the line
-- rm_separator_be(value, separators);
-- empty output line
value := new string'("");
-- find all separator symbols
for character_index in input_line'range loop
is_separator := false;
for separator_index in separators'range loop
if input_line(character_index) = separators(separator_index) then
is_separator := true;
end if;
end loop;
if not is_separator then
write(value, input_line.all(character_index));
end if;
end loop;
end;
procedure rm_all_separators(value : inout line) is
begin
rm_all_separators(value, " _." & ht);
end;
------------------------------------------------------------------------------
-- read first "word" out of a line
------------------------------------------------------------------------------
procedure read_first(
value : inout line;
separators : in string;
first : out line
) is
variable input_line: line;
variable position: natural := 0;
begin
input_line := value;
for character_index in input_line.all'reverse_range loop
for separator_index in separators'range loop
if input_line.all(character_index) = separators(separator_index) then
position := character_index;
end if;
end loop;
end loop;
if position > 1 then
first := new string'(input_line.all(input_line'left to position-1));
value := new string'(input_line(position+1 to input_line'right));
else
first := new string'(input_line.all);
value := new string'("");
end if;
end;
procedure read_first(value : inout line; first : out line) is
begin
read_first(value, " :" & ht, first);
end;
------------------------------------------------------------------------------
-- read last "word" out of a line
------------------------------------------------------------------------------
procedure read_last(
value : inout line;
separators : in string;
last : out line
) is
variable input_line: line := value;
variable position: natural := 0;
begin
for character_index in input_line'range loop
for separator_index in separators'range loop
if input_line(character_index) = separators(separator_index) then
position := character_index;
end if;
end loop;
end loop;
if position <= input_line'right and
position > 0 then
value := new string'(input_line(input_line'left to position-1));
last := new string'(input_line(position+1 to input_line'right));
else
last := new string'(input_line.all);
end if;
end;
procedure read_last(value : inout line; last : out line) is
begin
read_last(value, " :" & ht, last);
end;
--============================================================================
-- formatted string output, internal functions
--
------------------------------------------------------------------------------
-- get format specification
------------------------------------------------------------------------------
procedure get_format_items(
format : string;
right_justify : out boolean;
add_sign : out boolean;
fill_char : out character;
total_length : out natural;
point_precision : out natural;
format_type : inout line
) is
variable find_sign : boolean := false;
variable find_padding : boolean := false;
variable find_length : boolean := false;
variable find_precision : boolean := false;
variable find_type : boolean := false;
variable right_justify_int : boolean := true;
variable total_length_int : natural := 0;
variable point_precision_int : natural := 0;
begin
add_sign := false;
fill_char := ' ';
for index in 1 to format'length loop
if find_type then
write(format_type, format(index));
end if;
if find_precision then
if (format(index) >= '0') and (format(index) <= '9') then
point_precision_int := 10*point_precision_int + character'pos(format(index)) - character'pos('0');
if format(index+1) >= 'A' then
find_precision := false;
find_type := true;
end if;
end if;
end if;
if find_length then
if (format(index) >= '0') and (format(index) <= '9') then
total_length_int := 10*total_length_int + character'pos(format(index)) - character'pos('0');
end if;
if format(index) = '.' then
find_length := false;
find_precision := true;
elsif format(index+1) >= 'A' then
find_length := false;
find_type := true;
end if;
end if;
if find_padding then
if format(index) = '0' then
if right_justify_int then
fill_char := '0';
end if;
end if;
find_padding := false;
if format(index+1) >= 'A' then
find_type := true;
else
find_length := true;
end if;
end if;
if find_sign then
if format(index) = '-' then
right_justify_int := false;
end if;
if format(index) = '+' then
add_sign := true;
end if;
find_sign := false;
if format(index+1) <= '-' then
find_sign := true;
elsif format(index+1) = '0' then
find_padding := true;
elsif format(index+1) >= 'A' then
find_type := true;
else
find_length := true;
end if;
end if;
if format(index) = '%' then
if format(index+1) <= '-' then
find_sign := true;
elsif format(index+1) = '0' then
find_padding := true;
elsif format(index+1) >= 'A' then
find_type := true;
else
find_length := true;
end if;
end if;
end loop;
right_justify := right_justify_int;
total_length := total_length_int;
point_precision := point_precision_int;
end get_format_items;
------------------------------------------------------------------------------
-- formatted string output: converting std_ulogic to character
------------------------------------------------------------------------------
function to_character(value: std_ulogic) return character is
variable out_value: character;
begin
case value is
when 'U' => out_value := 'U';
when 'X' => out_value := 'X';
when '0' => out_value := '0';
when '1' => out_value := '1';
when 'Z' => out_value := 'Z';
when 'W' => out_value := 'W';
when 'L' => out_value := 'L';
when 'H' => out_value := 'H';
when '-' => out_value := '-';
end case;
return(out_value);
end to_character;
------------------------------------------------------------------------------
-- formatted string output: binary integer
------------------------------------------------------------------------------
function sprintf_b(value: std_ulogic_vector) return string is
variable out_line : line;
begin
for index in value'range loop
write(out_line, to_character(value(index)));
end loop;
return(out_line.all);
end sprintf_b;
------------------------------------------------------------------------------
-- formatted string output: decimal integer
------------------------------------------------------------------------------
function sprintf_d(
right_justify : boolean;
add_sign : boolean;
fill_char : character;
string_length : natural;
value : integer
) return string is
variable value_line : line;
begin
if add_sign and (value >= 0) then
write(value_line, '+');
end if;
write(value_line, value);
if string_length = 0 then
return(value_line.all);
else
return(pad(value_line.all, string_length, fill_char, right_justify));
end if;
end sprintf_d;
------------------------------------------------------------------------------
-- formatted string output: fixed point real
------------------------------------------------------------------------------
function sprintf_f(
right_justify : boolean;
add_sign : boolean;
fill_char : character;
string_length : natural;
point_precision : natural;
value : real
) return string is
variable point_precision_int : natural;
variable integer_part : integer;
variable decimal_part : natural;
variable value_line : line;
begin
if point_precision = 0 then
point_precision_int := 6;
else
point_precision_int := point_precision;
end if;
if value >= 0.0 then
integer_part := integer(value-0.5);
else
integer_part := - integer(-value-0.5);
end if;
decimal_part := abs(integer((value-real(integer_part))*(10.0**point_precision_int)));
if add_sign and (value >= 0.0) then
write(value_line, '+');
end if;
write(value_line, integer_part);
write(value_line, '.');
write(value_line, sprintf_d(true, false, '0', point_precision_int, decimal_part));
if string_length = 0 then
return(value_line.all);
else
return(pad(value_line.all, string_length, fill_char, right_justify));
end if;
end sprintf_f;
------------------------------------------------------------------------------
-- formatted string output: hexadecimal integer
------------------------------------------------------------------------------
function sprintf_X(
extend_unsigned : boolean;
value : std_ulogic_vector
) return string is
variable bit_count : positive;
variable value_line : line;
variable out_line : line;
variable nibble: string(1 to 4);
begin
bit_count := value'length;
while (bit_count mod 4) /= 0 loop
if extend_unsigned then
write(value_line, to_character('0'));
else
write(value_line, to_character(value(value'high)));
end if;
bit_count := bit_count + 1;
end loop;
write(value_line, sprintf_b(value));
for index in value_line.all'range loop
if (index mod 4) = 0 then
nibble := value_line.all(index-3 to index);
case nibble is
when "0000" => write(out_line, 0);
when "0001" => write(out_line, 1);
when "0010" => write(out_line, 2);
when "0011" => write(out_line, 3);
when "0100" => write(out_line, 4);
when "0101" => write(out_line, 5);
when "0110" => write(out_line, 6);
when "0111" => write(out_line, 7);
when "1000" => write(out_line, 8);
when "1001" => write(out_line, 9);
when "1010" => write(out_line, 'A');
when "1011" => write(out_line, 'B');
when "1100" => write(out_line, 'C');
when "1101" => write(out_line, 'D');
when "1110" => write(out_line, 'E');
when "1111" => write(out_line, 'F');
when others => write(out_line, 'X');
end case;
end if;
end loop;
return(out_line.all);
end sprintf_X;
--============================================================================
-- formatted string output, interface functions
--
------------------------------------------------------------------------------
-- integer
------------------------------------------------------------------------------
function sprintf(format : string; value : integer) return string is
variable right_justify : boolean;
variable add_sign : boolean;
variable fill_char : character;
variable string_length : natural;
variable point_precision : natural;
variable format_type : line;
begin
get_format_items(format, right_justify, add_sign, fill_char,
string_length, point_precision, format_type);
if format_type.all = "b" then
if string_length = 0 then
string_length := 8;
end if;
return(sprintf_b(std_ulogic_vector(to_signed(value, string_length+1)(string_length-1 downto 0))));
elsif format_type.all = "d" then
return(sprintf_d(right_justify, add_sign, fill_char, string_length, value));
elsif format_type.all = "f" then
return(sprintf_f(right_justify, add_sign, fill_char,
string_length, point_precision, real(value)));
elsif (format_type.all = "X") or (format_type.all = "x") then
if string_length = 0 then
string_length := 8;
end if;
string_length := 4*string_length;
if format_type.all = "X" then
return(sprintf_X(false, std_ulogic_vector(to_signed(value, string_length+1)(string_length-1 downto 0))));
else
return(lc(sprintf_X(false, std_ulogic_vector(to_signed(value, string_length+1)(string_length-1 downto 0)))));
end if;
else
return("Unhandled format type: '" & format_type.all & "'");
end if;
end sprintf;
------------------------------------------------------------------------------
-- real
------------------------------------------------------------------------------
function sprintf(format : string; value : real) return string is
variable right_justify : boolean;
variable add_sign : boolean;
variable fill_char : character;
variable string_length : natural;
variable point_precision : natural;
variable format_type : line;
begin
get_format_items(format, right_justify, add_sign, fill_char,
string_length, point_precision, format_type);
if (format_type.all = "d") or (point_precision = 0) then
return(sprintf_d(right_justify, add_sign, fill_char,
string_length, integer(value)));
elsif format_type.all = "f" then
return(sprintf_f(right_justify, add_sign, fill_char,
string_length, point_precision, value));
else
return("Unhandled format type: '" & format_type.all & "'");
end if;
end sprintf;
------------------------------------------------------------------------------
-- std_logic
------------------------------------------------------------------------------
function sprintf(format : string; value : std_logic) return string is
variable right_justify : boolean;
variable add_sign : boolean;
variable fill_char : character;
variable string_length : natural;
variable point_precision : natural;
variable format_type : line;
variable logic_vector: std_logic_vector(1 to 1);
begin
get_format_items(format, right_justify, add_sign, fill_char,
string_length, point_precision, format_type);
if (format_type.all = "b") or (format_type.all = "d") or
(format_type.all = "X") or (format_type.all = "x") then
logic_vector(1) := value;
return(sprintf(format, std_ulogic_vector(logic_vector)));
else
return("Not a std_logic format: '" & format_type.all & "'");
end if;
end sprintf;
------------------------------------------------------------------------------
-- std_ulogic_vector
------------------------------------------------------------------------------
function sprintf(format : string; value : std_ulogic_vector) return string is
variable right_justify : boolean;
variable add_sign : boolean;
variable fill_char : character;
variable bit_string_length : natural;
variable point_precision : natural;
variable format_type : line;
begin
get_format_items(format, right_justify, add_sign, fill_char,
bit_string_length, point_precision, format_type);
if format_type.all = "b" then
return(pad(sprintf_b(value), bit_string_length, fill_char, right_justify));
elsif format_type.all = "d" then
return(sprintf_d(right_justify, add_sign, fill_char, bit_string_length, to_integer(unsigned(value))));
elsif (format_type.all = "X") or (format_type.all = "x") then
if format_type.all = "X" then
return(pad(sprintf_X(true, value), bit_string_length, fill_char, right_justify));
else
return(lc(pad(sprintf_X(true, value), bit_string_length, fill_char, right_justify)));
end if;
else
return("Not a std_ulogic_vector format: '" & format_type.all & "'");
end if;
end sprintf;
------------------------------------------------------------------------------
-- std_logic_vector
------------------------------------------------------------------------------
function sprintf(format : string; value : std_logic_vector) return string is
variable right_justify : boolean;
variable add_sign : boolean;
variable fill_char : character;
variable string_length : natural;
variable point_precision : natural;
variable format_type : line;
begin
get_format_items(format, right_justify, add_sign, fill_char,
string_length, point_precision, format_type);
if (format_type.all = "b") or (format_type.all = "d") or
(format_type.all = "X") or (format_type.all = "x") then
return(sprintf(format, std_ulogic_vector(value)));
else
return("Not a std_logic_vector format: '" & format_type.all & "'");
end if;
end sprintf;
------------------------------------------------------------------------------
-- unsigned
------------------------------------------------------------------------------
function sprintf(format : string; value : unsigned) return string is
variable right_justify : boolean;
variable add_sign : boolean;
variable fill_char : character;
variable string_length : natural;
variable point_precision : natural;
variable format_type : line;
begin
get_format_items(format, right_justify, add_sign, fill_char,
string_length, point_precision, format_type);
if (format_type.all = "b") or (format_type.all = "d") or
(format_type.all = "X") or (format_type.all = "x") then
return(sprintf(format, std_ulogic_vector(value)));
else
return("Not an unsigned format: '" & format_type.all & "'");
end if;
end sprintf;
------------------------------------------------------------------------------
-- signed
------------------------------------------------------------------------------
function sprintf(format : string; value : signed) return string is
variable right_justify : boolean;
variable add_sign : boolean;
variable fill_char : character;
variable bit_string_length : natural;
variable point_precision : natural;
variable format_type : line;
begin
get_format_items(format, right_justify, add_sign, fill_char,
bit_string_length, point_precision, format_type);
if (fill_char = '0') and (value(value'left) = '1') then
fill_char := '1';
end if;
if format_type.all = "b" then
return(pad(sprintf_b(std_ulogic_vector(value)), bit_string_length, fill_char, right_justify));
elsif format_type.all = "d" then
return(sprintf_d(right_justify, add_sign, fill_char, bit_string_length, to_integer(signed(value))));
elsif (format_type.all = "X") or (format_type.all = "x") then
if fill_char = '1' then
fill_char := 'F';
end if;
if format_type.all = "X" then
return(pad(sprintf_X(true, std_ulogic_vector(value)), bit_string_length, fill_char, right_justify));
else
return(lc(pad(sprintf_X(true, std_ulogic_vector(value)), bit_string_length, fill_char, right_justify)));
end if;
else
return("Not a signed format: '" & format_type.all & "'");
end if;
end sprintf;
------------------------------------------------------------------------------
-- time
------------------------------------------------------------------------------
function sprintf(format : string; value : time) return string is
variable right_justify : boolean;
variable add_sign : boolean;
variable fill_char : character;
variable string_length : natural;
variable point_precision : natural;
variable format_type : line;
variable scaling : real;
variable base_time : time;
variable unit : string(1 to 3);
begin
get_format_items(format, right_justify, add_sign, fill_char,
string_length, point_precision, format_type);
if format_type.all(format_type.all'left) = 't' then
scaling := 10.0**point_precision;
if format_type.all = "tp" then
base_time := 1 ps;
unit := " ps";
elsif format_type.all = "tn" then
base_time := 1 ns;
unit := " ns";
elsif format_type.all = "tu" then
base_time := 1 us;
unit := " us";
elsif format_type.all = "tm" then
base_time := 1 ms;
unit := " ms";
elsif format_type.all = "ts" then
base_time := 1 sec;
unit := " s.";
else
return("Undefined time format: '" & format_type.all & "'");
end if;
if point_precision = 0 then
return(sprintf_d(right_justify, add_sign, fill_char,
string_length, value/base_time) & unit);
else
return(sprintf_f(right_justify, add_sign, fill_char, string_length,
point_precision, real(scaling*value/base_time)/scaling) & unit);
end if;
else
return("Not a time format: '" & format_type.all & "'");
end if;
end sprintf;
--============================================================================
-- formatted string input
------------------------------------------------------------------------------
------------------------------------------------------------------------------
-- read a nibble out of a character
------------------------------------------------------------------------------
function sscanf(value : character) return natural is
begin
if (value >= '0') and (value <= '9') then
return(character'pos(value) - character'pos('0'));
elsif (value >= 'a') and (value <= 'f') then
return(character'pos(value) - character'pos('a') + 10);
elsif (value >= 'A') and (value <= 'F') then
return(character'pos(value) - character'pos('A') + 10);
else
return(0);
end if;
end sscanf;
function sscanf(value : character) return nibbleUnsignedType is
begin
return(to_unsigned(sscanf(value), nibbleUnsignedType'length));
end sscanf;
function sscanf(value : character) return nibbleUlogicType is
variable unsigned_value : nibbleUnsignedType;
begin
unsigned_value := sscanf(value);
return(std_ulogic_vector(unsigned_value));
end sscanf;
------------------------------------------------------------------------------
-- read an binary word out of a string
------------------------------------------------------------------------------
function sscanf(value : string) return natural is
variable integer_value : natural;
begin
integer_value := 0;
for index in value'left to value'right loop
integer_value := integer_value*16 + sscanf(value(index));
end loop;
return(integer_value);
end;
function sscanf(value : string) return unsigned is
variable unsigned_value : unsigned(4*value'length-1 downto 0);
begin
unsigned_value := to_unsigned(0,unsigned_value'length);
for index in value'left to value'right loop
unsigned_value := shift_left(unsigned_value,4) + to_unsigned(sscanf(value(index)),4);
end loop;
return(unsigned_value);
end;
function sscanf(value : string) return std_ulogic_vector is
variable unsigned_value : unsigned(4*value'length-1 downto 0);
begin
unsigned_value := sscanf(value);
return(std_ulogic_vector(unsigned_value));
end;
------------------------------------------------------------------------------
-- read time from a string
-- time can be formated as follows:
-- "1ps" or "1 ps" or " 1 ps " or " 1ps"
-- possible time units are: hr, min, sec, ms, us, ns, ps, fs
------------------------------------------------------------------------------
procedure sscanf(
value : inout line;
time_val : out time
) is
variable time_line : line := value;
variable time_base : string(1 to 3);
variable time_value : integer;
variable time_int : time;
begin
-- remove all spaces and tabs
rm_all_separators(time_line);
-- strip time base (3 last characters)
time_base := time_line(time_line'right-2 to time_line'right);
-- separate time value and base
if time_base(2 to 3) = "hr" then
time_int := 1 hr;
time_value := integer'value(time_line(time_line'left to time_line'right -2));
elsif time_base = "min" then
time_int := 1 min;
time_value := integer'value(time_line(time_line'left to time_line'right -3));
elsif time_base = "sec" then
time_int := 1 sec;
time_value := integer'value(time_line(time_line'left to time_line'right -3));
elsif time_base(2 to 3) = "ms" then
time_int := 1 ms;
time_value := integer'value(time_line(time_line'left to time_line'right -2));
elsif time_base(2 to 3) = "us" then
time_int := 1 us;
time_value := integer'value(time_line(time_line'left to time_line'right -2));
elsif time_base(2 to 3) = "ns" then
time_int := 1 ns;
time_value := integer'value(time_line(time_line'left to time_line'right -2));
elsif time_base(2 to 3) = "ps" then
time_int := 1 ps;
time_value := integer'value(time_line(time_line'left to time_line'right -2));
elsif time_base(2 to 3) = "fs" then
time_int := 1 fs;
time_value := integer'value(time_line(time_line'left to time_line'right -2));
else
time_int := 0 ps;
time_value := 1;
end if;
-- build time from value and base
time_val := time_int * time_value;
end;
function sscanf(value : string) return time is
variable value_line : line;
variable time_val : time;
begin
value_line := new string'(value);
sscanf(value_line, time_val);
return(time_val);
end;
END testUtils;
LIBRARY std;
USE std.textio.ALL;
LIBRARY ieee;
USE ieee.std_logic_textio.ALL;
LIBRARY Common_test;
USE Common_test.testutils.all;
ARCHITECTURE test OF universalTester IS
constant clockPeriod : time := 1.0/66E6 * 1 sec;
signal sClock : std_uLogic := '1';
signal sReset : std_uLogic ;
signal testInfo : string(1 to 40) := (others => ' ');
BEGIN
------------------------------------------------------------------------------
-- reset and clock
sReset <= '1', '0' after 3.5*clockPeriod;
rst <= sReset;
sClock <= not sClock after clockPeriod/2;
clk <= transport sClock after 0.9*clockPeriod;
btns <= (others => '1'), (others=>'0') after 4.15 us;
process
-- Wait list
-- 3 clk for beq
-- 4 clk for others
-- 5 clk for lw
begin
en <= '0';
testInfo <= pad("Wait reset", testInfo'length);
wait until rst = '0';
while true loop
en <= '1';
testInfo <= pad("Running", testInfo'length);
wait;
end loop;
end process;
END ARCHITECTURE test;
-- VHDL Entity HEIRV32.heirv32.symbol
--
-- Created:
-- by - axel.amand.UNKNOWN (WE7860)
-- at - 10:23:07 21.10.2022
--
-- Generated by Mentor Graphics' HDL Designer(TM) 2019.2 (Build 5)
--
LIBRARY ieee;
USE ieee.std_logic_1164.all;
USE ieee.numeric_std.all;
ENTITY heirv32 IS
GENERIC(
g_programFile : string := "$SIMULATION_DIR/code.txt";
g_btnsNb : positive := 2;
g_dataWidth : positive := 32
);
PORT(
btns : IN std_ulogic_vector (g_btnsNb-1 DOWNTO 0);
clk : IN std_ulogic;
en : IN std_ulogic;
rst : IN std_ulogic;
dbg_leds : OUT std_ulogic_vector (31 DOWNTO 0);
leds : OUT std_ulogic_vector (g_dataWidth-1 DOWNTO 0)
);
-- Declarations
END heirv32 ;
LIBRARY ieee;
USE ieee.std_logic_1164.all;
PACKAGE gates IS
-- constant gateDelay: time := 1 ns;
constant gateDelay: time := 0.1 ns;
END gates;
-- VHDL Entity gates.transUnsignedUlog.symbol
--
-- Created:
-- by - silvan.zahno.UNKNOWN (WE6996)
-- at - 14:35:04 11.09.2019
--
-- Generated by Mentor Graphics' HDL Designer(TM) 2019.2 (Build 5)
--
LIBRARY ieee;
USE ieee.std_logic_1164.all;
USE ieee.numeric_std.all;
LIBRARY gates;
USE gates.gates.all;
ENTITY transUnsignedUlog IS
GENERIC(
delay : time := gateDelay;
dataBitNb : positive := 8
);
PORT(
in1 : IN unsigned (dataBitNb-1 DOWNTO 0);
out1 : OUT std_ulogic_vector (dataBitNb-1 DOWNTO 0)
);
-- Declarations
END transUnsignedUlog ;
ARCHITECTURE sim OF transUnsignedUlog IS
BEGIN
out1 <= std_ulogic_vector(in1) after delay;
END ARCHITECTURE sim;
-- VHDL Entity HEIRV32.ALU.symbol
--
-- Created:
-- by - axel.amand.UNKNOWN (WE7860)
-- at - 13:26:28 11.10.2022
--
-- Generated by Mentor Graphics' HDL Designer(TM) 2019.2 (Build 5)
--
LIBRARY ieee;
USE ieee.std_logic_1164.all;
USE ieee.numeric_std.all;
LIBRARY gates;
USE gates.gates.all;
ENTITY ALU IS
GENERIC(
g_datawidth : positive := 32
);
PORT(
ctrl : IN std_ulogic_vector (2 DOWNTO 0);
srcA : IN std_ulogic_vector (g_dataWidth-1 DOWNTO 0);
srcB : IN std_ulogic_vector (g_dataWidth-1 DOWNTO 0);
res : OUT std_ulogic_vector (g_dataWidth-1 DOWNTO 0);
zero : OUT std_ulogic
);
-- Declarations
END ALU ;
-- Risc-V ed. 2022 page 250 (pdf page 273)
ARCHITECTURE rtl OF ALU IS
signal lvec_res : std_ulogic_vector(res'range);
BEGIN
zero <= '1' when lvec_res = (lvec_res'range => '0') else '0';
res <= lvec_res;
alu : process(srcA, srcB, ctrl)
begin
case ctrl is
when "000" => -- add
lvec_res <= std_ulogic_vector(resize(
unsigned(srcA) + unsigned(srcB), lvec_res'length
));
when "001" => -- substract
lvec_res <= std_ulogic_vector(resize(
unsigned(srcA) - unsigned(srcB), lvec_res'length
));
when "010" => -- AND
lvec_res <= srcA and srcB;
when "011" => -- OR
lvec_res <= srcA or srcB;
when "101" => -- SLT
if srcA < srcB then
lvec_res <= (lvec_res'high downto 1 => '0') & '1';
else
lvec_res <= (lvec_res'high downto 1 => '0') & '0';
end if;
when others => -- unknown
lvec_res <= (others => '-');
end case;
end process alu;
END ARCHITECTURE rtl;
-- VHDL Entity HEIRV32.bufferStdULogEnable.symbol
--
-- Created:
-- by - axel.amand.UNKNOWN (WE7860)
-- at - 15:01:42 11.10.2022
--
-- Generated by Mentor Graphics' HDL Designer(TM) 2019.2 (Build 5)
--
LIBRARY ieee;
USE ieee.std_logic_1164.all;
USE ieee.numeric_std.all;
LIBRARY gates;
USE gates.gates.all;
ENTITY bufferStdULogEnable IS
GENERIC(
g_dataWidth : positive := 32
);
PORT(
clk : IN std_ulogic;
en : IN std_uLogic;
in1 : IN std_ulogic_vector (g_dataWidth-1 DOWNTO 0);
rst : IN std_ulogic;
out1 : OUT std_ulogic_vector (g_dataWidth - 1 DOWNTO 0)
);
-- Declarations
END bufferStdULogEnable ;
ARCHITECTURE rtl OF bufferStdULogEnable IS
BEGIN
buffering:process(rst, CLK)
begin
if rst = '1' then
out1 <= (others=>'0');
elsif rising_edge(CLK) then
if EN = '1' then
out1 <= in1;
end if;
end if;
end process buffering;
END ARCHITECTURE rtl;
-- VHDL Entity gates.and2.symbol
--
-- Created:
-- by - silvan.zahno.UNKNOWN (WE6996)
-- at - 14:34:52 11.09.2019
--
-- Generated by Mentor Graphics' HDL Designer(TM) 2019.2 (Build 5)
--
LIBRARY ieee;
USE ieee.std_logic_1164.all;
LIBRARY gates;
USE gates.gates.all;
ENTITY and2 IS
GENERIC(
delay : time := gateDelay
);
PORT(
in1 : IN std_uLogic;
in2 : IN std_uLogic;
out1 : OUT std_uLogic
);
-- Declarations
END and2 ;
ARCHITECTURE sim OF and2 IS
BEGIN
out1 <= in1 and in2 after delay;
END ARCHITECTURE sim;
-- VHDL Entity HEIRV32.controlUnit.symbol
--
-- Created:
-- by - axel.amand.UNKNOWN (WE7860)
-- at - 15:37:23 24.10.2022
--
-- Generated by Mentor Graphics' HDL Designer(TM) 2019.2 (Build 5)
--
LIBRARY ieee;
USE ieee.std_logic_1164.all;
USE ieee.numeric_std.all;
LIBRARY gates;
USE gates.gates.all;
ENTITY controlUnit IS
GENERIC(
g_datawidth : positive := 32
);
PORT(
clk : IN std_ulogic;
en : IN std_ulogic;
funct3 : IN std_ulogic_vector (2 DOWNTO 0);
funct7 : IN std_ulogic;
op : IN std_ulogic_vector (6 DOWNTO 0);
rst : IN std_ulogic;
zero : IN std_ulogic;
ALUControl : OUT std_ulogic_vector (2 DOWNTO 0);
ALUSrcA : OUT std_ulogic_vector (1 DOWNTO 0);
ALUSrcB : OUT std_ulogic_vector (1 DOWNTO 0);
IRWrite : OUT std_ulogic;
PCWrite : OUT std_ulogic;
adrSrc : OUT std_uLogic;
immSrc : OUT std_ulogic_vector (1 DOWNTO 0);
memWrite : OUT std_ulogic;
regwrite : OUT std_ulogic;
resultSrc : OUT std_ulogic_vector (1 DOWNTO 0)
);
-- Declarations
END controlUnit ;
-- VHDL Entity gates.or2.symbol
--
-- Created:
-- by - silvan.zahno.UNKNOWN (WE6996)
-- at - 14:35:09 11.09.2019
--
-- Generated by Mentor Graphics' HDL Designer(TM) 2019.2 (Build 5)
--
LIBRARY ieee;
USE ieee.std_logic_1164.all;
LIBRARY gates;
USE gates.gates.all;
ENTITY or2 IS
GENERIC(
delay : time := gateDelay
);
PORT(
in1 : IN std_uLogic;
in2 : IN std_uLogic;
out1 : OUT std_uLogic
);
-- Declarations
END or2 ;
ARCHITECTURE sim OF or2 IS
BEGIN
out1 <= in1 or in2 after delay;
END ARCHITECTURE sim;
-- VHDL Entity HEIRV32.aluDecoder.symbol
--
-- Created:
-- by - axel.amand.UNKNOWN (WE7860)
-- at - 15:46:03 04.10.2022
--
-- Generated by Mentor Graphics' HDL Designer(TM) 2019.2 (Build 5)
--
LIBRARY ieee;
USE ieee.std_logic_1164.all;
USE ieee.numeric_std.all;
LIBRARY gates;
USE gates.gates.all;
ENTITY aluDecoder IS
PORT(
ALUOp : IN std_ulogic_vector (1 DOWNTO 0);
funct3 : IN std_ulogic_vector (2 DOWNTO 0);
funct7 : IN std_ulogic;
op : IN std_ulogic;
ALUControl : OUT std_ulogic_vector (2 DOWNTO 0)
);
-- Declarations
END aluDecoder ;
ARCHITECTURE rtl OF aluDecoder IS
signal lsig_rTypeSub : std_ulogic;
BEGIN
lsig_rTypeSub <= funct7 and op; -- true for R-type substract
decode : process(op, funct3, funct7, ALUOp, lsig_rTypeSub)
begin
case ALUOp is
when "00" => ALUControl <= "000"; -- addition
when "01" => ALUControl <= "001"; -- substraction
when others =>
case funct3 is -- R-type or I-type
when "000" =>
if lsig_rTypeSub = '1' then
ALUControl <= "001"; -- sub
else
ALUControl <= "000"; -- add, addi
end if;
when "010" => ALUControl <= "101"; -- slt, slti
when "110" => ALUControl <= "011"; -- or, ori
when "111" => ALUControl <= "010"; -- and, andi
when others => ALUControl <= "---"; -- unknown
end case;
end case;
end process decode;
END ARCHITECTURE rtl;
-- VHDL Entity HEIRV32.instrDecoder.symbol
--
-- Created:
-- by - axel.amand.UNKNOWN (WE7860)
-- at - 15:47:22 04.10.2022
--
-- Generated by Mentor Graphics' HDL Designer(TM) 2019.2 (Build 5)
--
LIBRARY ieee;
USE ieee.std_logic_1164.all;
USE ieee.numeric_std.all;
LIBRARY gates;
USE gates.gates.all;
ENTITY instrDecoder IS
PORT(
op : IN std_ulogic_vector (6 DOWNTO 0);
immSrc : OUT std_ulogic_vector (1 DOWNTO 0)
);
-- Declarations
END instrDecoder ;
ARCHITECTURE rtl OF instrDecoder IS
BEGIN
decode : process(op)
begin
case op is
when "0000011" => immSrc <= "00"; -- lw
when "0100011" => immSrc <= "01"; -- sw
when "0110011" => immSrc <= "--"; -- R-type
when "1100011" => immSrc <= "10"; -- beq
when "0010011" => immSrc <= "00"; -- l-type ALU
when "1101111" => immSrc <= "11"; -- jal
when others => immSrc <= "--"; -- unknwon
end case;
end process decode;
END ARCHITECTURE rtl;
-- VHDL Entity HEIRV32.mainFSM.symbol
--
-- Created:
-- by - axel.amand.UNKNOWN (WE2332101)
-- at - 09:29:07 18.10.2022
--
-- Generated by Mentor Graphics' HDL Designer(TM) 2019.2 (Build 5)
--
LIBRARY ieee;
USE ieee.std_logic_1164.all;
USE ieee.numeric_std.all;
LIBRARY gates;
USE gates.gates.all;
ENTITY mainFSM IS
PORT(
clk : IN std_ulogic;
en : IN std_ulogic;
op : IN std_ulogic_vector (6 DOWNTO 0);
rst : IN std_ulogic;
ALUOp : OUT std_ulogic_vector (1 DOWNTO 0);
ALUSrcA : OUT std_ulogic_vector (1 DOWNTO 0);
ALUSrcB : OUT std_ulogic_vector (1 DOWNTO 0);
IRWrite : OUT std_ulogic;
PCupdate : OUT std_uLogic;
adrSrc : OUT std_uLogic;
branch : OUT std_uLogic;
memWrite : OUT std_ulogic;
regwrite : OUT std_ulogic;
resultSrc : OUT std_ulogic_vector (1 DOWNTO 0)
);
-- Declarations
END mainFSM ;
--
-- VHDL Architecture HEIRV32.mainFSM.fsm
--
-- Created:
-- by - axel.amand.UNKNOWN (WE7860)
-- at - 15:37:29 24.10.2022
--
-- Generated by Mentor Graphics' HDL Designer(TM) 2019.2 (Build 5)
--
LIBRARY ieee;
USE ieee.std_logic_1164.all;
USE ieee.numeric_std.all;
LIBRARY gates;
USE gates.gates.all;
ARCHITECTURE fsm OF mainFSM IS
TYPE STATE_TYPE IS (
s0_Fetch,
s1_Decode,
s2_MemAdr,
s6_ExecuteR,
s8_ExecuteI,
s9_JAL,
s10_BEQ,
s3_MemRead,
s4_MemWB,
s5_MemWrite,
s7_ALUWB
);
-- Declare current and next state signals
SIGNAL current_state : STATE_TYPE;
SIGNAL next_state : STATE_TYPE;
BEGIN
-----------------------------------------------------------------
clocked_proc : PROCESS (
clk,
rst
)
-----------------------------------------------------------------
BEGIN
IF (rst = '1') THEN
current_state <= s0_Fetch;
ELSIF (clk'EVENT AND clk = '1') THEN
current_state <= next_state;
END IF;
END PROCESS clocked_proc;
-----------------------------------------------------------------
nextstate_proc : PROCESS (
current_state,
en,
op
)
-----------------------------------------------------------------
BEGIN
CASE current_state IS
WHEN s0_Fetch =>
IF (en = '1') THEN
next_state <= s1_Decode;
ELSE
next_state <= s0_Fetch;
END IF;
WHEN s1_Decode =>
IF ((op = "0000011" OR op = "0100011") AND en = '1') THEN
next_state <= s2_MemAdr;
ELSIF (op = "0110011" AND en = '1') THEN
next_state <= s6_ExecuteR;
ELSIF (op = "0010011" AND en = '1') THEN
next_state <= s8_ExecuteI;
ELSIF (op = "1101111" AND en = '1') THEN
next_state <= s9_JAL;
ELSIF (op = "1100011" AND en = '1') THEN
next_state <= s10_BEQ;
ELSIF (en = '1') THEN
next_state <= s0_Fetch;
ELSE
next_state <= s1_Decode;
END IF;
WHEN s2_MemAdr =>
IF (op = "0000011" AND en = '1') THEN
next_state <= s3_MemRead;
ELSIF (op = "0100011" AND en = '1') THEN
next_state <= s5_MemWrite;
ELSIF (en = '1') THEN
next_state <= s0_Fetch;
ELSE
next_state <= s2_MemAdr;
END IF;
WHEN s6_ExecuteR =>
IF (en = '1') THEN
next_state <= s7_ALUWB;
ELSE
next_state <= s6_ExecuteR;
END IF;
WHEN s8_ExecuteI =>
IF (en = '1') THEN
next_state <= s7_ALUWB;
ELSE
next_state <= s8_ExecuteI;
END IF;
WHEN s9_JAL =>
IF (en = '1') THEN
next_state <= s7_ALUWB;
ELSE
next_state <= s9_JAL;
END IF;
WHEN s10_BEQ =>
IF (en = '1') THEN
next_state <= s0_Fetch;
ELSE
next_state <= s10_BEQ;
END IF;
WHEN s3_MemRead =>
IF (en = '1') THEN
next_state <= s4_MemWB;
ELSE
next_state <= s3_MemRead;
END IF;
WHEN s4_MemWB =>
IF (en = '1') THEN
next_state <= s0_Fetch;
ELSE
next_state <= s4_MemWB;
END IF;
WHEN s5_MemWrite =>
IF (en = '1') THEN
next_state <= s0_Fetch;
ELSE
next_state <= s5_MemWrite;
END IF;
WHEN s7_ALUWB =>
IF (en = '1') THEN
next_state <= s0_Fetch;
ELSE
next_state <= s7_ALUWB;
END IF;
WHEN OTHERS =>
next_state <= s0_Fetch;
END CASE;
END PROCESS nextstate_proc;
-----------------------------------------------------------------
output_proc : PROCESS (
current_state
)
-----------------------------------------------------------------
BEGIN
-- Default Assignment
ALUOp <= "00";
ALUSrcA <= "00";
ALUSrcB <= "00";
IRWrite <= '0';
PCupdate <= '0';
adrSrc <= '0';
branch <= '0';
memWrite <= '0';
regwrite <= '0';
resultSrc <= "00";
-- Combined Actions
CASE current_state IS
WHEN s0_Fetch =>
adrSrc <= '0' ;
IRWrite <= '1' ;
ALUSrcA <= "00" ;
ALUSrcB <= "10" ;
ALUOp <= "00" ;
resultSrc <= "10" ;
PCupdate <= '1' ;
WHEN s1_Decode =>
ALUSrcA <= "01" ;
ALUSrcB <= "01" ;
ALUOp <= "00" ;
WHEN s2_MemAdr =>
ALUSrcA <= "10" ;
ALUSrcB <= "01" ;
ALUOp <= "00" ;
WHEN s6_ExecuteR =>
ALUSrcA <= "10" ;
ALUSrcB <= "00" ;
ALUOp <= "10" ;
WHEN s8_ExecuteI =>
ALUSrcA <= "10" ;
ALUSrcB <= "01" ;
ALUOp <= "10" ;
WHEN s9_JAL =>
ALUSrcA <= "01" ;
ALUSrcB <= "10" ;
ALUOp <= "00" ;
resultSrc <= "00" ;
PCupdate <= '1' ;
WHEN s10_BEQ =>
ALUSrcA <= "10" ;
ALUSrcB <= "00" ;
ALUOp <= "01" ;
resultSrc <= "00" ;
branch <= '1' ;
WHEN s3_MemRead =>
adrSrc <= '1' ;
resultSrc <= "00" ;
WHEN s4_MemWB =>
resultSrc <= "01" ;
regwrite <= '1' ;
WHEN s5_MemWrite =>
adrSrc <= '1' ;
resultSrc <= "00" ;
memWrite <= '1' ;
WHEN s7_ALUWB =>
resultSrc <= "00" ;
regwrite <= '1' ;
WHEN OTHERS =>
NULL;
END CASE;
END PROCESS output_proc;
END fsm;
--
-- VHDL Architecture HEIRV32.controlUnit.struct
--
-- Created:
-- by - axel.amand.UNKNOWN (WE7860)
-- at - 15:37:23 24.10.2022
--
-- Generated by Mentor Graphics' HDL Designer(TM) 2019.2 (Build 5)
--
LIBRARY ieee;
USE ieee.std_logic_1164.all;
USE ieee.numeric_std.all;
LIBRARY gates;
USE gates.gates.all;
LIBRARY HEIRV32;
ARCHITECTURE struct OF controlUnit IS
-- Architecture declarations
-- Internal signal declarations
SIGNAL ALUOp : std_ulogic_vector(1 DOWNTO 0);
SIGNAL PCupdate : std_uLogic;
SIGNAL branch : std_uLogic;
SIGNAL out1 : std_uLogic;
-- Component Declarations
COMPONENT and2
GENERIC (
delay : time := gateDelay
);
PORT (
in1 : IN std_uLogic ;
in2 : IN std_uLogic ;
out1 : OUT std_uLogic
);
END COMPONENT;
COMPONENT or2
GENERIC (
delay : time := gateDelay
);
PORT (
in1 : IN std_uLogic ;
in2 : IN std_uLogic ;
out1 : OUT std_uLogic
);
END COMPONENT;
COMPONENT aluDecoder
PORT (
ALUOp : IN std_ulogic_vector (1 DOWNTO 0);
funct3 : IN std_ulogic_vector (2 DOWNTO 0);
funct7 : IN std_ulogic ;
op : IN std_ulogic ;
ALUControl : OUT std_ulogic_vector (2 DOWNTO 0)
);
END COMPONENT;
COMPONENT instrDecoder
PORT (
op : IN std_ulogic_vector (6 DOWNTO 0);
immSrc : OUT std_ulogic_vector (1 DOWNTO 0)
);
END COMPONENT;
COMPONENT mainFSM
PORT (
clk : IN std_ulogic ;
en : IN std_ulogic ;
op : IN std_ulogic_vector (6 DOWNTO 0);
rst : IN std_ulogic ;
ALUOp : OUT std_ulogic_vector (1 DOWNTO 0);
ALUSrcA : OUT std_ulogic_vector (1 DOWNTO 0);
ALUSrcB : OUT std_ulogic_vector (1 DOWNTO 0);
IRWrite : OUT std_ulogic ;
PCupdate : OUT std_uLogic ;
adrSrc : OUT std_uLogic ;
branch : OUT std_uLogic ;
memWrite : OUT std_ulogic ;
regwrite : OUT std_ulogic ;
resultSrc : OUT std_ulogic_vector (1 DOWNTO 0)
);
END COMPONENT;
-- Optional embedded configurations
-- pragma synthesis_off
FOR ALL : aluDecoder USE ENTITY HEIRV32.aluDecoder;
FOR ALL : and2 USE ENTITY gates.and2;
FOR ALL : instrDecoder USE ENTITY HEIRV32.instrDecoder;
FOR ALL : mainFSM USE ENTITY HEIRV32.mainFSM;
FOR ALL : or2 USE ENTITY gates.or2;
-- pragma synthesis_on
BEGIN
-- Instance port mappings.
U_1 : and2
GENERIC MAP (
delay => gateDelay
)
PORT MAP (
in1 => zero,
in2 => branch,
out1 => out1
);
U_0 : or2
GENERIC MAP (
delay => gateDelay
)
PORT MAP (
in1 => out1,
in2 => PCupdate,
out1 => PCWrite
);
U_2 : aluDecoder
PORT MAP (
ALUOp => ALUOp,
funct3 => funct3,
funct7 => funct7,
op => op(5),
ALUControl => ALUControl
);
U_4 : instrDecoder
PORT MAP (
op => op,
immSrc => immSrc
);
U_mainFSM : mainFSM
PORT MAP (
clk => clk,
en => en,
op => op,
rst => rst,
ALUOp => ALUOp,
ALUSrcA => ALUSrcA,
ALUSrcB => ALUSrcB,
IRWrite => IRWrite,
PCupdate => PCupdate,
adrSrc => adrSrc,
branch => branch,
memWrite => memWrite,
regwrite => regwrite,
resultSrc => resultSrc
);
END struct;
-- VHDL Entity HEIRV32.extend.symbol
--
-- Created:
-- by - axel.amand.UNKNOWN (WE2332101)
-- at - 12:47:32 18.10.2022
--
-- Generated by Mentor Graphics' HDL Designer(TM) 2019.2 (Build 5)
--
LIBRARY ieee;
USE ieee.std_logic_1164.all;
USE ieee.numeric_std.all;
LIBRARY gates;
USE gates.gates.all;
ENTITY extend IS
GENERIC(
g_dataWidth : positive := 32
);
PORT(
input : IN std_ulogic_vector (31 DOWNTO 7);
src : IN std_ulogic_vector (1 DOWNTO 0);
extended : OUT std_ulogic_vector (g_dataWidth-1 DOWNTO 0)
);
-- Declarations
END extend ;
ARCHITECTURE rtl OF extend IS
BEGIN
extend : process(input, src)
begin
case src is
when "00" => -- I-type
extended <= (12 to 31 => input(31)) &
input(31 downto 20);
when "01" => -- S-types (stores)
extended <= (12 to 31 => input(31)) &
input(31 downto 25) & input(11 downto 7);
when "10" => -- B-type (branches)
extended <= (12 to 31 => input(31)) & input(7) &
input(30 downto 25) & input(11 downto 8) & '0';
when "11" => -- J-type (jal)
extended <= (20 to 31 => input(31)) &
input(19 downto 12) & input(20) &
input(30 downto 21) & '0';
when others => -- impossible
extended <= (others => '-');
end case;
end process extend;
END ARCHITECTURE rtl;
-- VHDL Entity HEIRV32.instructionDataMemory.symbol
--
-- Created:
-- by - axel.amand.UNKNOWN (WE7860)
-- at - 18:08:43 18.10.2022
--
-- Generated by Mentor Graphics' HDL Designer(TM) 2019.2 (Build 5)
--
LIBRARY ieee;
USE ieee.std_logic_1164.all;
USE ieee.numeric_std.all;
LIBRARY gates;
USE gates.gates.all;
ENTITY instructionDataMemory IS
GENERIC(
g_dataWidth : positive := 32;
g_addrWidth : positive := 10;
g_programFile : string := ""
);
PORT(
address : IN unsigned (g_dataWidth-1 DOWNTO 0);
clk : IN std_ulogic;
en : IN std_ulogic;
writeData : IN std_ulogic_vector (g_dataWidth-1 DOWNTO 0);
writeEnable : IN std_ulogic;
readData : OUT std_ulogic_vector (g_dataWidth-1 DOWNTO 0)
);
-- Declarations
END instructionDataMemory ;
-- VHDL Entity Memory.bram.symbol
--
-- Created:
-- by - axel.amand.UNKNOWN (WE7860)
-- at - 15:51:22 11.10.2022
--
-- Generated by Mentor Graphics' HDL Designer(TM) 2019.2 (Build 5)
--
LIBRARY ieee;
USE ieee.std_logic_1164.all;
USE ieee.numeric_std.all;
ENTITY bram IS
GENERIC(
addressBitNb : positive := 8;
dataBitNb : positive := 8;
initFile : string := "bramInit.txt"
);
PORT(
clock : IN std_ulogic;
en : IN std_ulogic;
writeEn : IN std_ulogic;
addressIn : IN std_ulogic_vector (addressBitNb-1 DOWNTO 0);
dataIn : IN std_ulogic_vector (dataBitNb-1 DOWNTO 0);
dataOut : OUT std_ulogic_vector (dataBitNb-1 DOWNTO 0)
);
-- Declarations
END bram ;
library ieee;
use std.textio.all;
use ieee.std_logic_textio.all;
ARCHITECTURE hexRead OF bram IS
-- Define ramContent type
type ramContentType is array(0 to (2**addressBitNb)-1) of std_logic_vector(dataBitNb-1 DOWNTO 0);
-- Define function to create initvalue signal
impure function ReadRamContentFromFile(ramContentFilenAme : in string) return ramContentType is
FILE ramContentFile : text is in ramContentFilenAme;
variable ramContentFileLine : line;
variable ramContent : ramContentType;
begin
for i in ramContentType'range loop
readline(ramContentFile, ramContentFileLine);
HREAD(ramContentFileLine, ramContent(i));
end loop;
return ramContent;
end function;
-- Declare ramContent signal
shared variable ramContent: ramContentType := ReadRamContentFromFile(initFile);
BEGIN
-- Port A
process(clock)
begin
if clock'event and clock='1' then
if en = '1' then
if writeEn = '1' then
dataOut <= dataIn;
ramContent(to_integer(unsigned(addressIn))) := std_logic_vector(dataIn);
else
dataOut <= to_stdulogicvector(ramContent(to_integer(unsigned(addressIn))));
end if;
end if;
end if;
end process;
END ARCHITECTURE hexRead;
-- VHDL Entity HEIRV32.bramAddrReducer.symbol
--
-- Created:
-- by - axel.amand.UNKNOWN (WE2332111)
-- at - 16:20:19 11.10.2022
--
-- Generated by Mentor Graphics' HDL Designer(TM) 2019.2 (Build 5)
--
LIBRARY ieee;
USE ieee.std_logic_1164.all;
USE ieee.numeric_std.all;
LIBRARY gates;
USE gates.gates.all;
ENTITY bramAddrReducer IS
GENERIC(
g_dataWidth : positive := 32;
g_addrWidth : positive := 10
);
PORT(
addrIn : IN unsigned (g_dataWidth-1 DOWNTO 0);
addrOut : OUT std_ulogic_vector (g_addrWidth-1 DOWNTO 0)
);
-- Declarations
END bramAddrReducer ;
ARCHITECTURE rtl OF bramAddrReducer IS
BEGIN
-- +2 to srr(2) the address (as it makes +4)
addrOut <= std_ulogic_vector(addrIn(addrOut'high+2 downto addrOut'low+2));
END ARCHITECTURE rtl;
--
-- VHDL Architecture HEIRV32.instructionDataMemory.struct
--
-- Created:
-- by - axel.amand.UNKNOWN (WE7860)
-- at - 15:38:02 24.10.2022
--
-- Generated by Mentor Graphics' HDL Designer(TM) 2019.2 (Build 5)
--
LIBRARY ieee;
USE ieee.std_logic_1164.all;
USE ieee.numeric_std.all;
LIBRARY gates;
USE gates.gates.all;
LIBRARY HEIRV32;
LIBRARY Memory;
ARCHITECTURE struct OF instructionDataMemory IS
-- Architecture declarations
-- Internal signal declarations
SIGNAL out1 : std_ulogic_vector(g_addrWidth-1 DOWNTO 0);
-- Component Declarations
COMPONENT bramAddrReducer
GENERIC (
g_dataWidth : positive := 32;
g_addrWidth : positive := 10
);
PORT (
addrIn : IN unsigned (g_dataWidth-1 DOWNTO 0);
addrOut : OUT std_ulogic_vector (g_addrWidth-1 DOWNTO 0)
);
END COMPONENT;
COMPONENT bram
GENERIC (
addressBitNb : positive := 8;
dataBitNb : positive := 8;
initFile : string := "bramInit.txt"
);
PORT (
clock : IN std_ulogic ;
en : IN std_ulogic ;
writeEn : IN std_ulogic ;
addressIn : IN std_ulogic_vector (addressBitNb-1 DOWNTO 0);
dataIn : IN std_ulogic_vector (dataBitNb-1 DOWNTO 0);
dataOut : OUT std_ulogic_vector (dataBitNb-1 DOWNTO 0)
);
END COMPONENT;
-- Optional embedded configurations
-- pragma synthesis_off
FOR ALL : bram USE ENTITY Memory.bram;
FOR ALL : bramAddrReducer USE ENTITY HEIRV32.bramAddrReducer;
-- pragma synthesis_on
BEGIN
-- Instance port mappings.
U_bramAddrReducer : bramAddrReducer
GENERIC MAP (
g_dataWidth => g_dataWidth,
g_addrWidth => g_addrWidth
)
PORT MAP (
addrIn => address,
addrOut => out1
);
U_bram : bram
GENERIC MAP (
addressBitNb => g_addrWidth,
dataBitNb => g_dataWidth,
initFile => g_programFile
)
PORT MAP (
clock => clk,
en => en,
writeEn => writeEnable,
addressIn => out1,
dataIn => writeData,
dataOut => readData
);
END struct;
-- VHDL Entity HEIRV32.instructionForwarder.symbol
--
-- Created:
-- by - axel.amand.UNKNOWN (WE2332101)
-- at - 16:10:50 18.10.2022
--
-- Generated by Mentor Graphics' HDL Designer(TM) 2019.2 (Build 5)
--
LIBRARY ieee;
USE ieee.std_logic_1164.all;
USE ieee.numeric_std.all;
LIBRARY gates;
USE gates.gates.all;
ENTITY instructionForwarder IS
GENERIC(
g_dataWidth : positive := 32
);
PORT(
irWrite : IN std_ulogic;
readData : IN std_ulogic_vector (g_dataWidth-1 DOWNTO 0);
instruction : OUT std_ulogic_vector (g_dataWidth-1 DOWNTO 0)
);
-- Declarations
END instructionForwarder ;
ARCHITECTURE rtl OF instructionForwarder IS
signal lvec_irMem : std_ulogic_vector(readData'range);
BEGIN
-- forwardIR : process(rst, clk)
-- begin
-- if rst = '1' then
-- lvec_irMem <= (others => '0');
-- elsif rising_edge(clk) then
-- if en = '1' and IRWrite = '1' then
-- lvec_irMem <= readData;
-- end if;
-- end if;
-- end process forwardIR;
forwardIR : process(readData, irWrite)
begin
if irWrite = '1' then
lvec_irMem <= readData;
end if;
end process forwardIR;
instruction <= lvec_irMem;
END ARCHITECTURE rtl;
-- VHDL Entity HEIRV32.bufferUnsignedEnable.symbol
--
-- Created:
-- by - axel.amand.UNKNOWN (WE7860)
-- at - 13:59:57 27.09.2022
--
-- Generated by Mentor Graphics' HDL Designer(TM) 2019.2 (Build 5)
--
LIBRARY ieee;
USE ieee.std_logic_1164.all;
USE ieee.numeric_std.all;
ENTITY bufferUnsignedEnable IS
GENERIC(
g_bitNb : positive := 32
);
PORT(
clk : IN std_ulogic;
en : IN std_ulogic;
in1 : IN unsigned (g_bitNb - 1 DOWNTO 0);
rst : IN std_ulogic;
out1 : OUT unsigned (g_bitNb - 1 DOWNTO 0)
);
-- Declarations
END bufferUnsignedEnable ;
ARCHITECTURE rtl OF bufferUnsignedEnable IS
BEGIN
buffering:process(rst, CLK)
begin
if rst = '1' then
out1 <= (others=>'0');
elsif rising_edge(CLK) then
if EN = '1' then
out1 <= in1;
end if;
end if;
end process buffering;
END ARCHITECTURE rtl;
-- VHDL Entity gates.mux2to1Unsigned.symbol
--
-- Created:
-- by - silvan.zahno.UNKNOWN (WE6996)
-- at - 14:35:12 11.09.2019
--
-- Generated by Mentor Graphics' HDL Designer(TM) 2019.2 (Build 5)
--
LIBRARY ieee;
USE ieee.std_logic_1164.all;
USE ieee.numeric_std.all;
LIBRARY gates;
USE gates.gates.all;
ENTITY mux2to1Unsigned IS
GENERIC(
dataBitNb : positive := 8;
delay : time := gateDelay
);
PORT(
in0 : IN unsigned (dataBitNb-1 DOWNTO 0);
in1 : IN unsigned (dataBitNb-1 DOWNTO 0);
sel : IN std_uLogic;
muxOut : OUT unsigned (dataBitNb-1 DOWNTO 0)
);
-- Declarations
END mux2to1Unsigned ;
ARCHITECTURE sim OF mux2to1Unsigned IS
signal selInt: std_ulogic;
BEGIN
selInt <= to_X01(sel);
muxSelect: process(selInt, in0, in1)
begin
if selInt = '0' then
muxOut <= in0 after delay;
elsif selInt = '1' then
muxOut <= in1 after delay;
elsif in0 = in1 then
muxOut <= in0 after delay;
else
muxOut <= (others => 'X') after delay;
end if;
end process muxSelect;
END ARCHITECTURE sim;
-- VHDL Entity HEIRV32.registerFile.symbol
--
-- Created:
-- by - axel.amand.UNKNOWN (WE7860)
-- at - 10:23:24 21.10.2022
--
-- Generated by Mentor Graphics' HDL Designer(TM) 2019.2 (Build 5)
--
LIBRARY ieee;
USE ieee.std_logic_1164.all;
USE ieee.numeric_std.all;
LIBRARY gates;
USE gates.gates.all;
ENTITY registerFile IS
GENERIC(
g_dataWidth : positive := 32;
g_btnsNb : positive := 2
);
PORT(
addr1 : IN std_ulogic_vector (4 DOWNTO 0);
addr2 : IN std_ulogic_vector (4 DOWNTO 0);
addr3 : IN std_ulogic_vector (4 DOWNTO 0);
btns : IN std_ulogic_vector (g_btnsNb-1 DOWNTO 0);
clk : IN std_ulogic;
en : IN std_ulogic;
rst : IN std_ulogic;
writeData : IN std_ulogic_vector (g_dataWidth - 1 DOWNTO 0);
writeEnable3 : IN std_ulogic;
RD1 : OUT std_ulogic_vector (g_dataWidth-1 DOWNTO 0);
RD2 : OUT std_ulogic_vector (g_dataWidth-1 DOWNTO 0);
leds : OUT std_ulogic_vector (g_dataWidth-1 DOWNTO 0)
);
-- Declarations
END registerFile ;
ARCHITECTURE rtl OF registerFile IS
-- Bank of register
type t_registersBank is array (31 downto 0) of
std_ulogic_vector(31 downto 0);
-- A bank of registers
signal larr_registers: t_registersBank;
BEGIN
-- Clocked write
process(rst, clk) begin
if rst = '1' then
larr_registers <= (others => (others => '0'));
elsif rising_edge(clk) then
if writeEnable3 = '1' and en = '1' then
larr_registers(to_integer(unsigned(addr3))) <= writeData;
end if;
end if;
end process;
-- Comb. read
-- Addr 0 wired to 0s
process(addr1, addr2) begin
if (to_integer(unsigned(addr1)) = 0) then
RD1 <= (others => '0');
elsif (to_integer(unsigned(addr1)) = 31) then -- buttons
RD1 <= (btns'length to g_datawidth-1 => '0') & btns;
else
RD1 <= larr_registers(to_integer(unsigned(addr1)));
end if;
if (to_integer(unsigned(addr2)) = 0) then
RD2 <= (others => '0');
elsif (to_integer(unsigned(addr2)) = 31) then -- buttons
RD2 <= (btns'length to g_datawidth-1 => '0') & btns;
else
RD2 <= larr_registers(to_integer(unsigned(addr2)));
end if;
end process;
leds <= larr_registers(30);
END ARCHITECTURE rtl;
-- VHDL Entity HEIRV32.mux4To1ULogVec.symbol
--
-- Created:
-- by - axel.amand.UNKNOWN (WE7860)
-- at - 15:23:48 11.10.2022
--
-- Generated by Mentor Graphics' HDL Designer(TM) 2019.2 (Build 5)
--
LIBRARY ieee;
USE ieee.std_logic_1164.all;
USE ieee.numeric_std.all;
LIBRARY gates;
USE gates.gates.all;
ENTITY mux4To1ULogVec IS
GENERIC(
g_dataWidth : positive := 32
);
PORT(
in1 : IN std_ulogic_vector (g_dataWidth - 1 DOWNTO 0);
in2 : IN std_ulogic_vector (g_dataWidth - 1 DOWNTO 0);
in3 : IN std_ulogic_vector (g_dataWidth-1 DOWNTO 0);
in4 : IN std_ulogic_vector (g_dataWidth-1 DOWNTO 0);
sel : IN std_ulogic_vector (1 DOWNTO 0);
out1 : OUT std_ulogic_vector (g_dataWidth-1 DOWNTO 0)
);
-- Declarations
END mux4To1ULogVec ;
ARCHITECTURE rtl OF mux4To1ULogVec IS
BEGIN
muxSelect: process(sel, in1, in2, in3, in4)
begin
case to_integer(unsigned(sel)) is
when 0 => out1 <= in1;
when 1 => out1 <= in2;
when 2 => out1 <= in3;
when 3 => out1 <= in4;
when others => out1 <= (others => 'X');
end case;
end process muxSelect;
END ARCHITECTURE rtl;
-- VHDL Entity gates.transUlogUnsigned.symbol
--
-- Created:
-- by - silvan.zahno.UNKNOWN (WE6996)
-- at - 14:35:05 11.09.2019
--
-- Generated by Mentor Graphics' HDL Designer(TM) 2019.2 (Build 5)
--
LIBRARY ieee;
USE ieee.std_logic_1164.all;
USE ieee.numeric_std.all;
LIBRARY gates;
USE gates.gates.all;
ENTITY transUlogUnsigned IS
GENERIC(
delay : time := gateDelay;
dataBitNb : positive := 8
);
PORT(
in1 : IN std_uLogic_vector (dataBitNb-1 DOWNTO 0);
out1 : OUT unsigned (dataBitNb-1 DOWNTO 0)
);
-- Declarations
END transUlogUnsigned ;
ARCHITECTURE sim OF transUlogUnsigned IS
BEGIN
out1 <= unsigned(in1) after delay;
END ARCHITECTURE sim;
--
-- VHDL Architecture HEIRV32.heirv32.struct
--
-- Created:
-- by - axel.amand.UNKNOWN (WE7860)
-- at - 17:45:34 24.10.2022
--
-- Generated by Mentor Graphics' HDL Designer(TM) 2019.2 (Build 5)
--
LIBRARY ieee;
USE ieee.std_logic_1164.all;
USE ieee.numeric_std.all;
LIBRARY gates;
USE gates.gates.all;
LIBRARY HEIRV32;
ARCHITECTURE struct OF heirv32 IS
-- Architecture declarations
constant c_dataWidth : positive := g_dataWidth;
constant c_bramAddrWidth : positive := 10;
-- Internal signal declarations
SIGNAL ALUControl : std_ulogic_vector(2 DOWNTO 0);
SIGNAL ALUOut : std_ulogic_vector(c_dataWidth - 1 DOWNTO 0);
SIGNAL ALUResult : std_ulogic_vector(c_dataWidth-1 DOWNTO 0);
SIGNAL ALUSrcA : std_ulogic_vector(1 DOWNTO 0);
SIGNAL ALUSrcB : std_ulogic_vector(1 DOWNTO 0);
SIGNAL IRWrite : std_ulogic;
SIGNAL PC : unsigned(c_dataWidth - 1 DOWNTO 0);
SIGNAL PCNext : unsigned(c_dataWidth - 1 DOWNTO 0);
SIGNAL PCWrite : std_ulogic;
SIGNAL PCu : std_ulogic_vector(c_dataWidth - 1 DOWNTO 0);
SIGNAL RD1 : std_ulogic_vector(c_dataWidth-1 DOWNTO 0);
SIGNAL adr : unsigned(c_dataWidth-1 DOWNTO 0);
SIGNAL adrSrc : std_uLogic;
SIGNAL data : std_ulogic_vector(c_dataWidth-1 DOWNTO 0);
SIGNAL en1 : std_uLogic;
SIGNAL four_four : std_ulogic_vector(c_dataWidth-1 DOWNTO 0);
SIGNAL four_zeros : std_ulogic_vector(c_dataWidth-1 DOWNTO 0);
SIGNAL immExt : std_ulogic_vector(c_dataWidth-1 DOWNTO 0);
SIGNAL immSrc : std_ulogic_vector(1 DOWNTO 0);
SIGNAL instruction : std_ulogic_vector(c_dataWidth-1 DOWNTO 0);
SIGNAL memWrite : std_ulogic;
SIGNAL oldPC : std_ulogic_vector(c_dataWidth - 1 DOWNTO 0);
SIGNAL out1 : std_uLogic;
SIGNAL regwrite : std_ulogic;
SIGNAL result : std_uLogic_vector(c_dataWidth-1 DOWNTO 0);
SIGNAL resultSrc : std_ulogic_vector(1 DOWNTO 0);
SIGNAL srcA : std_ulogic_vector(c_dataWidth-1 DOWNTO 0);
SIGNAL srcB : std_ulogic_vector(c_dataWidth-1 DOWNTO 0);
SIGNAL writeData : std_ulogic_vector(c_dataWidth-1 DOWNTO 0);
SIGNAL zero : std_ulogic;
-- Component Declarations
COMPONENT and2
GENERIC (
delay : time := gateDelay
);
PORT (
in1 : IN std_uLogic ;
in2 : IN std_uLogic ;
out1 : OUT std_uLogic
);
END COMPONENT;
COMPONENT mux2to1Unsigned
GENERIC (
dataBitNb : positive := 8;
delay : time := gateDelay
);
PORT (
in0 : IN unsigned (dataBitNb-1 DOWNTO 0);
in1 : IN unsigned (dataBitNb-1 DOWNTO 0);
sel : IN std_uLogic ;
muxOut : OUT unsigned (dataBitNb-1 DOWNTO 0)
);
END COMPONENT;
COMPONENT transUlogUnsigned
GENERIC (
delay : time := gateDelay;
dataBitNb : positive := 8
);
PORT (
in1 : IN std_uLogic_vector (dataBitNb-1 DOWNTO 0);
out1 : OUT unsigned (dataBitNb-1 DOWNTO 0)
);
END COMPONENT;
COMPONENT transUnsignedUlog
GENERIC (
delay : time := gateDelay;
dataBitNb : positive := 8
);
PORT (
in1 : IN unsigned (dataBitNb-1 DOWNTO 0);
out1 : OUT std_ulogic_vector (dataBitNb-1 DOWNTO 0)
);
END COMPONENT;
COMPONENT ALU
GENERIC (
g_datawidth : positive := 32
);
PORT (
ctrl : IN std_ulogic_vector (2 DOWNTO 0);
srcA : IN std_ulogic_vector (g_dataWidth-1 DOWNTO 0);
srcB : IN std_ulogic_vector (g_dataWidth-1 DOWNTO 0);
res : OUT std_ulogic_vector (g_dataWidth-1 DOWNTO 0);
zero : OUT std_ulogic
);
END COMPONENT;
COMPONENT bufferStdULogEnable
GENERIC (
g_dataWidth : positive := 32
);
PORT (
clk : IN std_ulogic ;
en : IN std_uLogic ;
in1 : IN std_ulogic_vector (g_dataWidth-1 DOWNTO 0);
rst : IN std_ulogic ;
out1 : OUT std_ulogic_vector (g_dataWidth - 1 DOWNTO 0)
);
END COMPONENT;
COMPONENT bufferUnsignedEnable
GENERIC (
g_bitNb : positive := 32
);
PORT (
clk : IN std_ulogic ;
en : IN std_ulogic ;
in1 : IN unsigned (g_bitNb - 1 DOWNTO 0);
rst : IN std_ulogic ;
out1 : OUT unsigned (g_bitNb - 1 DOWNTO 0)
);
END COMPONENT;
COMPONENT controlUnit
GENERIC (
g_datawidth : positive := 32
);
PORT (
clk : IN std_ulogic ;
en : IN std_ulogic ;
funct3 : IN std_ulogic_vector (2 DOWNTO 0);
funct7 : IN std_ulogic ;
op : IN std_ulogic_vector (6 DOWNTO 0);
rst : IN std_ulogic ;
zero : IN std_ulogic ;
ALUControl : OUT std_ulogic_vector (2 DOWNTO 0);
ALUSrcA : OUT std_ulogic_vector (1 DOWNTO 0);
ALUSrcB : OUT std_ulogic_vector (1 DOWNTO 0);
IRWrite : OUT std_ulogic ;
PCWrite : OUT std_ulogic ;
adrSrc : OUT std_uLogic ;
immSrc : OUT std_ulogic_vector (1 DOWNTO 0);
memWrite : OUT std_ulogic ;
regwrite : OUT std_ulogic ;
resultSrc : OUT std_ulogic_vector (1 DOWNTO 0)
);
END COMPONENT;
COMPONENT extend
GENERIC (
g_dataWidth : positive := 32
);
PORT (
input : IN std_ulogic_vector (31 DOWNTO 7);
src : IN std_ulogic_vector (1 DOWNTO 0);
extended : OUT std_ulogic_vector (g_dataWidth-1 DOWNTO 0)
);
END COMPONENT;
COMPONENT instructionDataMemory
GENERIC (
g_dataWidth : positive := 32;
g_addrWidth : positive := 10;
g_programFile : string := ""
);
PORT (
address : IN unsigned (g_dataWidth-1 DOWNTO 0);
clk : IN std_ulogic ;
en : IN std_ulogic ;
writeData : IN std_ulogic_vector (g_dataWidth-1 DOWNTO 0);
writeEnable : IN std_ulogic ;
readData : OUT std_ulogic_vector (g_dataWidth-1 DOWNTO 0)
);
END COMPONENT;
COMPONENT instructionForwarder
GENERIC (
g_dataWidth : positive := 32
);
PORT (
irWrite : IN std_ulogic ;
readData : IN std_ulogic_vector (g_dataWidth-1 DOWNTO 0);
instruction : OUT std_ulogic_vector (g_dataWidth-1 DOWNTO 0)
);
END COMPONENT;
COMPONENT mux4To1ULogVec
GENERIC (
g_dataWidth : positive := 32
);
PORT (
in1 : IN std_ulogic_vector (g_dataWidth - 1 DOWNTO 0);
in2 : IN std_ulogic_vector (g_dataWidth - 1 DOWNTO 0);
in3 : IN std_ulogic_vector (g_dataWidth-1 DOWNTO 0);
in4 : IN std_ulogic_vector (g_dataWidth-1 DOWNTO 0);
sel : IN std_ulogic_vector (1 DOWNTO 0);
out1 : OUT std_ulogic_vector (g_dataWidth-1 DOWNTO 0)
);
END COMPONENT;
COMPONENT registerFile
GENERIC (
g_dataWidth : positive := 32;
g_btnsNb : positive := 2
);
PORT (
addr1 : IN std_ulogic_vector (4 DOWNTO 0);
addr2 : IN std_ulogic_vector (4 DOWNTO 0);
addr3 : IN std_ulogic_vector (4 DOWNTO 0);
btns : IN std_ulogic_vector (g_btnsNb-1 DOWNTO 0);
clk : IN std_ulogic ;
en : IN std_ulogic ;
rst : IN std_ulogic ;
writeData : IN std_ulogic_vector (g_dataWidth - 1 DOWNTO 0);
writeEnable3 : IN std_ulogic ;
RD1 : OUT std_ulogic_vector (g_dataWidth-1 DOWNTO 0);
RD2 : OUT std_ulogic_vector (g_dataWidth-1 DOWNTO 0);
leds : OUT std_ulogic_vector (g_dataWidth-1 DOWNTO 0)
);
END COMPONENT;
-- Optional embedded configurations
-- pragma synthesis_off
FOR ALL : ALU USE ENTITY HEIRV32.ALU;
FOR ALL : and2 USE ENTITY gates.and2;
FOR ALL : bufferStdULogEnable USE ENTITY HEIRV32.bufferStdULogEnable;
FOR ALL : bufferUnsignedEnable USE ENTITY HEIRV32.bufferUnsignedEnable;
FOR ALL : controlUnit USE ENTITY HEIRV32.controlUnit;
FOR ALL : extend USE ENTITY HEIRV32.extend;
FOR ALL : instructionDataMemory USE ENTITY HEIRV32.instructionDataMemory;
FOR ALL : instructionForwarder USE ENTITY HEIRV32.instructionForwarder;
FOR ALL : mux2to1Unsigned USE ENTITY gates.mux2to1Unsigned;
FOR ALL : mux4To1ULogVec USE ENTITY HEIRV32.mux4To1ULogVec;
FOR ALL : registerFile USE ENTITY HEIRV32.registerFile;
FOR ALL : transUlogUnsigned USE ENTITY gates.transUlogUnsigned;
FOR ALL : transUnsignedUlog USE ENTITY gates.transUnsignedUlog;
-- pragma synthesis_on
BEGIN
-- Architecture concurrent statements
-- HDL Embedded Text Block 1 eb1
four_zeros <= (c_dataWidth - 1 downto 0 => '0');
four_four <= std_ulogic_vector(to_unsigned(4, c_dataWidth));
-- HDL Embedded Text Block 2 eb2
dbg_leds(7 downto 0) <= std_ulogic_vector(adr(9 downto 2)); -- no need to read LSBs since does +4 each time
dbg_leds(15 downto 8) <= std_ulogic_vector(instruction(7 downto 0));
dbg_leds(23 downto 16) <= std_ulogic_vector(ALUControl & "000" & resultSrc);
dbg_leds(31 downto 24) <= std_ulogic_vector(regwrite & immSrc & '0' & ALUSrcB & ALUSrcA);
-- Instance port mappings.
U_and1 : and2
GENERIC MAP (
delay => gateDelay
)
PORT MAP (
in1 => en,
in2 => PCWrite,
out1 => out1
);
U_and2 : and2
GENERIC MAP (
delay => gateDelay
)
PORT MAP (
in1 => en,
in2 => IRWrite,
out1 => en1
);
U_pcMux : mux2to1Unsigned
GENERIC MAP (
dataBitNb => c_dataWidth,
delay => gateDelay
)
PORT MAP (
in0 => PC,
in1 => PCNext,
sel => adrSrc,
muxOut => adr
);
U_resultToUnsigned : transUlogUnsigned
GENERIC MAP (
delay => gateDelay,
dataBitNb => c_dataWidth
)
PORT MAP (
in1 => result,
out1 => PCNext
);
U_0 : transUnsignedUlog
GENERIC MAP (
delay => gateDelay,
dataBitNb => c_dataWidth
)
PORT MAP (
in1 => PC,
out1 => PCu
);
U_alu : ALU
GENERIC MAP (
g_datawidth => c_dataWidth
)
PORT MAP (
ctrl => ALUControl,
srcA => srcA,
srcB => srcB,
res => ALUResult,
zero => zero
);
U_aluBuffer : bufferStdULogEnable
GENERIC MAP (
g_dataWidth => c_dataWidth
)
PORT MAP (
clk => clk,
en => en,
in1 => ALUResult,
rst => rst,
out1 => ALUOut
);
U_pcBuffer : bufferStdULogEnable
GENERIC MAP (
g_dataWidth => c_dataWidth
)
PORT MAP (
clk => clk,
en => en1,
in1 => PCu,
rst => rst,
out1 => oldPC
);
U_pcLoadBuffer : bufferUnsignedEnable
GENERIC MAP (
g_bitNb => c_dataWidth
)
PORT MAP (
clk => clk,
en => out1,
in1 => PCNext,
rst => rst,
out1 => PC
);
U_controlUnit : controlUnit
GENERIC MAP (
g_datawidth => c_dataWidth
)
PORT MAP (
clk => clk,
en => en,
funct3 => instruction(14 DOWNTO 12),
funct7 => instruction(30),
op => instruction(6 DOWNTO 0),
rst => rst,
zero => zero,
ALUControl => ALUControl,
ALUSrcA => ALUSrcA,
ALUSrcB => ALUSrcB,
IRWrite => IRWrite,
PCWrite => PCWrite,
adrSrc => adrSrc,
immSrc => immSrc,
memWrite => memWrite,
regwrite => regwrite,
resultSrc => resultSrc
);
U_extend : extend
GENERIC MAP (
g_dataWidth => c_dataWidth
)
PORT MAP (
input => instruction(31 DOWNTO 7),
src => immSrc,
extended => immExt
);
U_instrDataMemory : instructionDataMemory
GENERIC MAP (
g_dataWidth => c_dataWidth,
g_addrWidth => c_bramAddrWidth,
g_programFile => g_programFile
)
PORT MAP (
address => adr,
clk => clk,
en => en,
writeData => writeData,
writeEnable => memWrite,
readData => data
);
U_instrForward : instructionForwarder
GENERIC MAP (
g_dataWidth => c_dataWidth
)
PORT MAP (
irWrite => IRWrite,
readData => data,
instruction => instruction
);
U_resultSel : mux4To1ULogVec
GENERIC MAP (
g_dataWidth => c_dataWidth
)
PORT MAP (
in1 => ALUOut,
in2 => data,
in3 => ALUResult,
in4 => four_zeros,
sel => resultSrc,
out1 => result
);
U_srcASel : mux4To1ULogVec
GENERIC MAP (
g_dataWidth => c_dataWidth
)
PORT MAP (
in1 => PCu,
in2 => oldPC,
in3 => RD1,
in4 => four_zeros,
sel => ALUSrcA,
out1 => srcA
);
U_srcBSel : mux4To1ULogVec
GENERIC MAP (
g_dataWidth => c_dataWidth
)
PORT MAP (
in1 => writeData,
in2 => immExt,
in3 => four_four,
in4 => four_zeros,
sel => ALUSrcB,
out1 => srcB
);
U_registerFile : registerFile
GENERIC MAP (
g_dataWidth => c_dataWidth,
g_btnsNb => g_btnsNb
)
PORT MAP (
addr1 => instruction(19 DOWNTO 15),
addr2 => instruction(24 DOWNTO 20),
addr3 => instruction(11 DOWNTO 7),
btns => btns,
clk => clk,
en => en,
rst => rst,
writeData => result,
writeEnable3 => regwrite,
RD1 => RD1,
RD2 => writeData,
leds => leds
);
END struct;
--
-- VHDL Architecture HEIRV32_test.heirv32_tb.universal
--
-- Created:
-- by - axel.amand.UNKNOWN (WE7860)
-- at - 16:01:58 24.10.2022
--
-- Generated by Mentor Graphics' HDL Designer(TM) 2019.2 (Build 5)
--
LIBRARY ieee;
USE ieee.std_logic_1164.all;
USE ieee.numeric_std.all;
LIBRARY HEIRV32;
LIBRARY HEIRV32_test;
ARCHITECTURE universal OF heirv32_tb IS
-- Architecture declarations
constant c_btnsNb : positive := 4;
-- Internal signal declarations
SIGNAL btns : std_ulogic_vector(c_btnsNb-1 DOWNTO 0);
SIGNAL clk : std_ulogic;
SIGNAL en : std_ulogic;
SIGNAL rst : std_ulogic;
-- Component Declarations
COMPONENT heirv32
GENERIC (
g_programFile : string := "$SIMULATION_DIR/code.txt";
g_btnsNb : positive := 2;
g_dataWidth : positive := 32
);
PORT (
btns : IN std_ulogic_vector (g_btnsNb-1 DOWNTO 0);
clk : IN std_ulogic ;
en : IN std_ulogic ;
rst : IN std_ulogic ;
dbg_leds : OUT std_ulogic_vector (31 DOWNTO 0);
leds : OUT std_ulogic_vector (g_dataWidth-1 DOWNTO 0)
);
END COMPONENT;
COMPONENT universalTester
GENERIC (
c_btnsNb : positive := 2
);
PORT (
btns : OUT std_ulogic_vector (c_btnsNb-1 DOWNTO 0);
clk : OUT std_ulogic ;
en : OUT std_ulogic ;
rst : OUT std_ulogic
);
END COMPONENT;
-- Optional embedded configurations
-- pragma synthesis_off
FOR ALL : heirv32 USE ENTITY HEIRV32.heirv32;
FOR ALL : universalTester USE ENTITY HEIRV32_test.universalTester;
-- pragma synthesis_on
BEGIN
-- Instance port mappings.
U_1 : heirv32
GENERIC MAP (
g_programFile => "$SIMULATION_DIR/code_bram.txt",
g_btnsNb => c_btnsNb,
g_dataWidth => 32
)
PORT MAP (
btns => btns,
clk => clk,
en => en,
rst => rst,
dbg_leds => OPEN,
leds => OPEN
);
U_0 : universalTester
GENERIC MAP (
c_btnsNb => c_btnsNb
)
PORT MAP (
btns => btns,
clk => clk,
en => en,
rst => rst
);
END universal;