3276 lines
92 KiB
VHDL
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;
|
|
|
|
|
|
|
|
|