|
|
|
|
-- © IBM Corp. 2020
|
|
|
|
|
-- Licensed under the Apache License, Version 2.0 (the "License"), as modified by
|
|
|
|
|
-- the terms below; you may not use the files in this repository except in
|
|
|
|
|
-- compliance with the License as modified.
|
|
|
|
|
-- You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0
|
|
|
|
|
--
|
|
|
|
|
-- Modified Terms:
|
|
|
|
|
--
|
|
|
|
|
-- 1) For the purpose of the patent license granted to you in Section 3 of the
|
|
|
|
|
-- License, the "Work" hereby includes implementations of the work of authorship
|
|
|
|
|
-- in physical form.
|
|
|
|
|
--
|
|
|
|
|
-- 2) Notwithstanding any terms to the contrary in the License, any licenses
|
|
|
|
|
-- necessary for implementation of the Work that are available from OpenPOWER
|
|
|
|
|
-- via the Power ISA End User License Agreement (EULA) are explicitly excluded
|
|
|
|
|
-- hereunder, and may be obtained from OpenPOWER under the terms and conditions
|
|
|
|
|
-- of the EULA.
|
|
|
|
|
--
|
|
|
|
|
-- Unless required by applicable law or agreed to in writing, the reference design
|
|
|
|
|
-- distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
|
|
|
|
-- WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License
|
|
|
|
|
-- for the specific language governing permissions and limitations under the License.
|
|
|
|
|
--
|
|
|
|
|
-- Additional rights, including the ability to physically implement a softcore that
|
|
|
|
|
-- is compliant with the required sections of the Power ISA Specification, are
|
|
|
|
|
-- available at no cost under the terms of the OpenPOWER Power ISA EULA, which can be
|
|
|
|
|
-- obtained (along with the Power ISA) here: https://openpowerfoundation.org.
|
|
|
|
|
|
|
|
|
|
--***************************************************************************
|
|
|
|
|
-- Copyright 2020 International Business Machines
|
|
|
|
|
--
|
|
|
|
|
-- Licensed under the Apache License, Version 2.0 (the “License”);
|
|
|
|
|
-- you may not use this file except in compliance with the License.
|
|
|
|
|
-- You may obtain a copy of the License at
|
|
|
|
|
-- http://www.apache.org/licenses/LICENSE-2.0
|
|
|
|
|
--
|
|
|
|
|
-- The patent license granted to you in Section 3 of the License, as applied
|
|
|
|
|
-- to the “Work,” hereby includes implementations of the Work in physical form.
|
|
|
|
|
--
|
|
|
|
|
-- Unless required by applicable law or agreed to in writing, the reference design
|
|
|
|
|
-- distributed under the License is distributed on an “AS IS” BASIS,
|
|
|
|
|
-- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
|
|
|
-- See the License for the specific language governing permissions and
|
|
|
|
|
-- limitations under the License.
|
|
|
|
|
--
|
|
|
|
|
--***************************************************************************
|
|
|
|
|
library IEEE, IBM;
|
|
|
|
|
use IEEE.std_logic_1164.all;
|
|
|
|
|
use IEEE.numeric_std.all;
|
|
|
|
|
use IBM.std_ulogic_support.all;
|
|
|
|
|
|
|
|
|
|
package std_ulogic_unsigned is
|
|
|
|
|
|
|
|
|
|
function "+"(l: std_ulogic_vector; r: std_ulogic_vector) return std_ulogic_vector;
|
|
|
|
|
function "+"(l: std_ulogic_vector; r: integer) return std_ulogic_vector;
|
|
|
|
|
function "+"(l: integer; r: std_ulogic_vector) return std_ulogic_vector;
|
|
|
|
|
function "+"(l: std_ulogic_vector; r: std_ulogic) return std_ulogic_vector;
|
|
|
|
|
function "+"(l: std_ulogic; r: std_ulogic_vector) return std_ulogic_vector;
|
|
|
|
|
|
|
|
|
|
function "-"(l: std_ulogic_vector; r: std_ulogic_vector) return std_ulogic_vector;
|
|
|
|
|
function "-"(l: std_ulogic_vector; r: integer) return std_ulogic_vector;
|
|
|
|
|
function "-"(l: integer; r: std_ulogic_vector) return std_ulogic_vector;
|
|
|
|
|
function "-"(l: std_ulogic_vector; r: std_ulogic) return std_ulogic_vector;
|
|
|
|
|
function "-"(l: std_ulogic; r: std_ulogic_vector) return std_ulogic_vector;
|
|
|
|
|
|
|
|
|
|
function "+"(l: std_ulogic_vector) return std_ulogic_vector;
|
|
|
|
|
|
|
|
|
|
function "*"(l: std_ulogic_vector; r: std_ulogic_vector) return std_ulogic_vector;
|
|
|
|
|
|
|
|
|
|
function "=" ( l : natural; r : std_ulogic_vector) return boolean;
|
|
|
|
|
function "/="( l : natural; r : std_ulogic_vector) return boolean;
|
|
|
|
|
function "<" ( l : natural; r : std_ulogic_vector) return boolean;
|
|
|
|
|
function "<="( l : natural; r : std_ulogic_vector) return boolean;
|
|
|
|
|
function ">" ( l : natural; r : std_ulogic_vector) return boolean;
|
|
|
|
|
function ">="( l : natural; r : std_ulogic_vector) return boolean;
|
|
|
|
|
|
|
|
|
|
function "=" ( l : std_ulogic_vector; r : natural) return boolean;
|
|
|
|
|
function "/="( l : std_ulogic_vector; r : natural) return boolean;
|
|
|
|
|
function "<" ( l : std_ulogic_vector; r : natural) return boolean;
|
|
|
|
|
function "<="( l : std_ulogic_vector; r : natural) return boolean;
|
|
|
|
|
function ">" ( l : std_ulogic_vector; r : natural) return boolean;
|
|
|
|
|
function ">="( l : std_ulogic_vector; r : natural) return boolean;
|
|
|
|
|
|
|
|
|
|
function "=" ( l : natural; r : std_ulogic_vector) return std_ulogic;
|
|
|
|
|
function "/="( l : natural; r : std_ulogic_vector) return std_ulogic;
|
|
|
|
|
function "<" ( l : natural; r : std_ulogic_vector) return std_ulogic;
|
|
|
|
|
function "<="( l : natural; r : std_ulogic_vector) return std_ulogic;
|
|
|
|
|
function ">" ( l : natural; r : std_ulogic_vector) return std_ulogic;
|
|
|
|
|
function ">="( l : natural; r : std_ulogic_vector) return std_ulogic;
|
|
|
|
|
|
|
|
|
|
function "=" ( l : std_ulogic_vector; r : natural) return std_ulogic;
|
|
|
|
|
function "/="( l : std_ulogic_vector; r : natural) return std_ulogic;
|
|
|
|
|
function "<" ( l : std_ulogic_vector; r : natural) return std_ulogic;
|
|
|
|
|
function "<="( l : std_ulogic_vector; r : natural) return std_ulogic;
|
|
|
|
|
function ">" ( l : std_ulogic_vector; r : natural) return std_ulogic;
|
|
|
|
|
function ">="( l : std_ulogic_vector; r : natural) return std_ulogic;
|
|
|
|
|
|
|
|
|
|
function to_integer( d : std_ulogic_vector ) return natural;
|
|
|
|
|
-- synopsys translate_off
|
|
|
|
|
attribute type_convert of to_integer : function is true;
|
|
|
|
|
attribute btr_name of to_integer : function is "PASS";
|
|
|
|
|
attribute pin_bit_information of to_integer : function is
|
|
|
|
|
(1 => (" ","A0 ","INCR","PIN_BIT_SCALAR"),
|
|
|
|
|
2 => (" ","10 ","INCR","PIN_BIT_SCALAR"));
|
|
|
|
|
-- synopsys translate_on
|
|
|
|
|
|
|
|
|
|
-- synopsys translate_off
|
|
|
|
|
function to_std_ulogic_vector( d : natural; w : positive ) return std_ulogic_vector;
|
|
|
|
|
attribute type_convert of to_std_ulogic_vector : function is true;
|
|
|
|
|
attribute btr_name of to_std_ulogic_vector : function is "PASS";
|
|
|
|
|
attribute pin_bit_information of to_std_ulogic_vector : function is
|
|
|
|
|
(1 => (" ","A0 ","INCR","PIN_BIT_SCALAR"),
|
|
|
|
|
2 => (" ","10 ","INCR","PIN_BIT_SCALAR"));
|
|
|
|
|
-- synopsys translate_on
|
|
|
|
|
|
|
|
|
|
end std_ulogic_unsigned;
|
|
|
|
|
|
|
|
|
|
package body std_ulogic_unsigned is
|
|
|
|
|
|
|
|
|
|
function maximum(L, R: INTEGER) return INTEGER is
|
|
|
|
|
begin
|
|
|
|
|
if L > R then
|
|
|
|
|
return L;
|
|
|
|
|
else
|
|
|
|
|
return R;
|
|
|
|
|
end if;
|
|
|
|
|
end;
|
|
|
|
|
|
|
|
|
|
function "+"(L: STD_ULOGIC_VECTOR; R: STD_ULOGIC_VECTOR) return STD_ULOGIC_VECTOR is
|
|
|
|
|
constant length : INTEGER := maximum(L'length, R'length);
|
|
|
|
|
variable result : UNSIGNED(length-1 downto 0);
|
|
|
|
|
-- pragma label_applies_to plus
|
|
|
|
|
begin
|
|
|
|
|
result := UNSIGNED(L) + UNSIGNED(R); -- pragma label plus
|
|
|
|
|
return std_ulogic_vector(result);
|
|
|
|
|
end;
|
|
|
|
|
|
|
|
|
|
function "+"(L: STD_ULOGIC_VECTOR; R: INTEGER) return STD_ULOGIC_VECTOR is
|
|
|
|
|
variable result : STD_ULOGIC_VECTOR (L'range);
|
|
|
|
|
-- pragma label_applies_to plus
|
|
|
|
|
begin
|
|
|
|
|
result := std_ulogic_vector( UNSIGNED(L) + R ); -- pragma label plus
|
|
|
|
|
return result ;
|
|
|
|
|
end;
|
|
|
|
|
|
|
|
|
|
function "+"(L: INTEGER; R: STD_ULOGIC_VECTOR) return STD_ULOGIC_VECTOR is
|
|
|
|
|
variable result : STD_ULOGIC_VECTOR (R'range);
|
|
|
|
|
-- pragma label_applies_to plus
|
|
|
|
|
begin
|
|
|
|
|
result := std_ulogic_vector( L + UNSIGNED(R) ); -- pragma label plus
|
|
|
|
|
return result;
|
|
|
|
|
end;
|
|
|
|
|
|
|
|
|
|
function "+"(L: STD_ULOGIC_VECTOR; R: STD_ULOGIC) return STD_ULOGIC_VECTOR is
|
|
|
|
|
variable result : STD_ULOGIC_VECTOR (L'range);
|
|
|
|
|
-- pragma label_applies_to plus
|
|
|
|
|
begin
|
|
|
|
|
if R = '1' then
|
|
|
|
|
result := std_ulogic_vector( UNSIGNED(L) + 1 );
|
|
|
|
|
else
|
|
|
|
|
result := L;
|
|
|
|
|
end if;
|
|
|
|
|
return result ;
|
|
|
|
|
end;
|
|
|
|
|
|
|
|
|
|
function "+"(L: STD_ULOGIC; R: STD_ULOGIC_VECTOR) return STD_ULOGIC_VECTOR is
|
|
|
|
|
variable result : STD_ULOGIC_VECTOR (R'range);
|
|
|
|
|
-- pragma label_applies_to plus
|
|
|
|
|
begin
|
|
|
|
|
if L = '1' then
|
|
|
|
|
result := std_ulogic_vector( UNSIGNED(R) + 1 );
|
|
|
|
|
else
|
|
|
|
|
result := R;
|
|
|
|
|
end if;
|
|
|
|
|
return result ;
|
|
|
|
|
end;
|
|
|
|
|
|
|
|
|
|
function "+"(L: STD_ULOGIC_VECTOR) return STD_ULOGIC_VECTOR is
|
|
|
|
|
variable result : STD_ULOGIC_VECTOR (L'range);
|
|
|
|
|
-- pragma label_applies_to plus
|
|
|
|
|
begin
|
|
|
|
|
result := L;
|
|
|
|
|
return result ;
|
|
|
|
|
end;
|
|
|
|
|
|
|
|
|
|
function "-"(L: STD_ULOGIC_VECTOR; R: STD_ULOGIC_VECTOR) return STD_ULOGIC_VECTOR is
|
|
|
|
|
constant length: INTEGER := maximum(L'length, R'length);
|
|
|
|
|
variable result : STD_ULOGIC_VECTOR (length-1 downto 0);
|
|
|
|
|
-- pragma label_applies_to minus
|
|
|
|
|
begin
|
|
|
|
|
result := std_ulogic_vector( UNSIGNED(L) - UNSIGNED(R) ); -- pragma label minus
|
|
|
|
|
return result ;
|
|
|
|
|
end;
|
|
|
|
|
|
|
|
|
|
function "-"(L: STD_ULOGIC_VECTOR; R: INTEGER) return STD_ULOGIC_VECTOR is
|
|
|
|
|
variable result : STD_ULOGIC_VECTOR (L'range);
|
|
|
|
|
-- pragma label_applies_to minus
|
|
|
|
|
begin
|
|
|
|
|
result := std_ulogic_vector( UNSIGNED(L) - R ); -- pragma label minus
|
|
|
|
|
return result ;
|
|
|
|
|
end;
|
|
|
|
|
|
|
|
|
|
function "-"(L: INTEGER; R: STD_ULOGIC_VECTOR) return STD_ULOGIC_VECTOR is
|
|
|
|
|
variable result : STD_ULOGIC_VECTOR (R'range);
|
|
|
|
|
-- pragma label_applies_to minus
|
|
|
|
|
begin
|
|
|
|
|
result := std_ulogic_vector( L - UNSIGNED(R) ); -- pragma label minus
|
|
|
|
|
return result ;
|
|
|
|
|
end;
|
|
|
|
|
|
|
|
|
|
function "-"(L: STD_ULOGIC_VECTOR; R: STD_ULOGIC) return STD_ULOGIC_VECTOR is
|
|
|
|
|
variable result : STD_ULOGIC_VECTOR (L'range);
|
|
|
|
|
-- pragma label_applies_to minus
|
|
|
|
|
begin
|
|
|
|
|
if R = '1' then
|
|
|
|
|
result := std_ulogic_vector( UNSIGNED(L) - 1 );
|
|
|
|
|
else
|
|
|
|
|
result := L;
|
|
|
|
|
end if;
|
|
|
|
|
return result ;
|
|
|
|
|
end;
|
|
|
|
|
|
|
|
|
|
function "-"(L: STD_ULOGIC; R: STD_ULOGIC_VECTOR) return STD_ULOGIC_VECTOR is
|
|
|
|
|
variable result : STD_ULOGIC_VECTOR (R'range);
|
|
|
|
|
-- pragma label_applies_to minus
|
|
|
|
|
begin
|
|
|
|
|
if L = '1' then
|
|
|
|
|
result := std_ulogic_vector( 1 - UNSIGNED(R) );
|
|
|
|
|
else
|
|
|
|
|
result := std_ulogic_vector( 0 - UNSIGNED(R) );
|
|
|
|
|
end if;
|
|
|
|
|
return result ;
|
|
|
|
|
end;
|
|
|
|
|
|
|
|
|
|
function "*"(L: STD_ULOGIC_VECTOR; R: STD_ULOGIC_VECTOR) return STD_ULOGIC_VECTOR is
|
|
|
|
|
constant length: INTEGER := maximum(L'length, R'length);
|
|
|
|
|
variable result : STD_ULOGIC_VECTOR ((L'length+R'length-1) downto 0);
|
|
|
|
|
-- pragma label_applies_to mult
|
|
|
|
|
begin
|
|
|
|
|
result := std_ulogic_vector( UNSIGNED(L) * UNSIGNED(R) ); -- pragma label mult
|
|
|
|
|
return result ;
|
|
|
|
|
end;
|
|
|
|
|
|
|
|
|
|
function "=" ( l : natural; r : std_ulogic_vector) return boolean is
|
|
|
|
|
begin
|
|
|
|
|
return l = unsigned(r);
|
|
|
|
|
end "=";
|
|
|
|
|
|
|
|
|
|
function "/="( l : natural; r : std_ulogic_vector) return boolean is
|
|
|
|
|
begin
|
|
|
|
|
return l /= unsigned(r);
|
|
|
|
|
end "/=";
|
|
|
|
|
|
|
|
|
|
function "<" ( l : natural; r : std_ulogic_vector) return boolean is
|
|
|
|
|
begin
|
|
|
|
|
return l < unsigned(r);
|
|
|
|
|
end "<";
|
|
|
|
|
|
|
|
|
|
function "<="( l : natural; r : std_ulogic_vector) return boolean is
|
|
|
|
|
begin
|
|
|
|
|
return l <= unsigned(r);
|
|
|
|
|
end "<=";
|
|
|
|
|
|
|
|
|
|
function ">" ( l : natural; r : std_ulogic_vector) return boolean is
|
|
|
|
|
begin
|
|
|
|
|
return l > unsigned(r);
|
|
|
|
|
end ">";
|
|
|
|
|
|
|
|
|
|
function ">="( l : natural; r : std_ulogic_vector) return boolean is
|
|
|
|
|
begin
|
|
|
|
|
return l >= unsigned(r);
|
|
|
|
|
end ">=";
|
|
|
|
|
|
|
|
|
|
function "=" ( l : std_ulogic_vector; r : natural) return boolean is
|
|
|
|
|
begin
|
|
|
|
|
return unsigned(l) = r;
|
|
|
|
|
end "=";
|
|
|
|
|
|
|
|
|
|
function "/="( l : std_ulogic_vector; r : natural) return boolean is
|
|
|
|
|
begin
|
|
|
|
|
return unsigned(l) /= r;
|
|
|
|
|
end "/=";
|
|
|
|
|
|
|
|
|
|
function "<" ( l : std_ulogic_vector; r : natural) return boolean is
|
|
|
|
|
begin
|
|
|
|
|
return unsigned(l) < r;
|
|
|
|
|
end "<";
|
|
|
|
|
|
|
|
|
|
function "<="( l : std_ulogic_vector; r : natural) return boolean is
|
|
|
|
|
begin
|
|
|
|
|
return unsigned(l) <= r;
|
|
|
|
|
end "<=";
|
|
|
|
|
|
|
|
|
|
function ">" ( l : std_ulogic_vector; r : natural) return boolean is
|
|
|
|
|
begin
|
|
|
|
|
return unsigned(l) > r;
|
|
|
|
|
end ">";
|
|
|
|
|
|
|
|
|
|
function ">="( l : std_ulogic_vector; r : natural) return boolean is
|
|
|
|
|
begin
|
|
|
|
|
return unsigned(l) >= r;
|
|
|
|
|
end ">=";
|
|
|
|
|
|
|
|
|
|
function "=" ( l : natural; r : std_ulogic_vector) return std_ulogic is
|
|
|
|
|
begin
|
|
|
|
|
return tconv( l = unsigned(r) );
|
|
|
|
|
end "=";
|
|
|
|
|
|
|
|
|
|
function "/="( l : natural; r : std_ulogic_vector) return std_ulogic is
|
|
|
|
|
begin
|
|
|
|
|
return tconv( l /= unsigned(r) );
|
|
|
|
|
end "/=";
|
|
|
|
|
|
|
|
|
|
function "<" ( l : natural; r : std_ulogic_vector) return std_ulogic is
|
|
|
|
|
begin
|
|
|
|
|
return tconv( l < unsigned(r) );
|
|
|
|
|
end "<";
|
|
|
|
|
|
|
|
|
|
function "<="( l : natural; r : std_ulogic_vector) return std_ulogic is
|
|
|
|
|
begin
|
|
|
|
|
return tconv( l <= unsigned(r) );
|
|
|
|
|
end "<=";
|
|
|
|
|
|
|
|
|
|
function ">" ( l : natural; r : std_ulogic_vector) return std_ulogic is
|
|
|
|
|
begin
|
|
|
|
|
return tconv( l > unsigned(r) );
|
|
|
|
|
end ">";
|
|
|
|
|
|
|
|
|
|
function ">="( l : natural; r : std_ulogic_vector) return std_ulogic is
|
|
|
|
|
begin
|
|
|
|
|
return tconv( l >= unsigned(r) );
|
|
|
|
|
end ">=";
|
|
|
|
|
|
|
|
|
|
function "=" ( l : std_ulogic_vector; r : natural) return std_ulogic is
|
|
|
|
|
begin
|
|
|
|
|
return tconv( unsigned(l) = r );
|
|
|
|
|
end "=";
|
|
|
|
|
|
|
|
|
|
function "/="( l : std_ulogic_vector; r : natural) return std_ulogic is
|
|
|
|
|
begin
|
|
|
|
|
return tconv( unsigned(l) /= r );
|
|
|
|
|
end "/=";
|
|
|
|
|
|
|
|
|
|
function "<" ( l : std_ulogic_vector; r : natural) return std_ulogic is
|
|
|
|
|
begin
|
|
|
|
|
return tconv( unsigned(l) < r );
|
|
|
|
|
end "<";
|
|
|
|
|
|
|
|
|
|
function "<="( l : std_ulogic_vector; r : natural) return std_ulogic is
|
|
|
|
|
begin
|
|
|
|
|
return tconv( unsigned(l) <= r );
|
|
|
|
|
end "<=";
|
|
|
|
|
|
|
|
|
|
function ">" ( l : std_ulogic_vector; r : natural) return std_ulogic is
|
|
|
|
|
begin
|
|
|
|
|
return tconv( unsigned(l) > r );
|
|
|
|
|
end ">";
|
|
|
|
|
|
|
|
|
|
function ">="( l : std_ulogic_vector; r : natural) return std_ulogic is
|
|
|
|
|
begin
|
|
|
|
|
return tconv( unsigned(l) >= r );
|
|
|
|
|
end ">=";
|
|
|
|
|
|
|
|
|
|
function to_integer( d : std_ulogic_vector ) return natural is
|
|
|
|
|
begin
|
|
|
|
|
return tconv( d );
|
|
|
|
|
end to_integer;
|
|
|
|
|
|
|
|
|
|
function to_std_ulogic_vector( d : natural; w : positive ) return std_ulogic_vector is
|
|
|
|
|
begin
|
|
|
|
|
return tconv( d, w );
|
|
|
|
|
end to_std_ulogic_vector;
|
|
|
|
|
|
|
|
|
|
end std_ulogic_unsigned;
|