You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
1583 lines
92 KiB
VHDL
1583 lines
92 KiB
VHDL
-- © 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.
|
|
|
|
-- Description: XU Multiplier Top
|
|
--
|
|
|
|
LIBRARY ieee; USE ieee.std_logic_1164.all;
|
|
USE ieee.numeric_std.all;
|
|
LIBRARY ibm;
|
|
USE ibm.std_ulogic_support.all;
|
|
USE ibm.std_ulogic_unsigned.all;
|
|
USE ibm.std_ulogic_function_support.all;
|
|
LIBRARY support;
|
|
USE support.power_logic_pkg.all;
|
|
LIBRARY tri; USE tri.tri_latches_pkg.all;
|
|
LIBRARY work; USE work.xuq_pkg.all;
|
|
|
|
entity xuq_alu_mult is
|
|
generic (
|
|
expand_type : integer := 2;
|
|
regmode : integer := 6;
|
|
a2mode : integer := 1;
|
|
threads : integer := 4;
|
|
fxu_synth : integer := 0);
|
|
port (
|
|
---------------------------------------------------------------------
|
|
-- Clocks & Power
|
|
---------------------------------------------------------------------
|
|
nclk : in clk_logic;
|
|
vdd : inout power_logic;
|
|
gnd : inout power_logic;
|
|
|
|
---------------------------------------------------------------------
|
|
-- Pervasive
|
|
---------------------------------------------------------------------
|
|
d_mode_dc : in std_ulogic;
|
|
delay_lclkr_dc : in std_ulogic;
|
|
mpw1_dc_b : in std_ulogic;
|
|
mpw2_dc_b : in std_ulogic;
|
|
func_sl_force : in std_ulogic;
|
|
func_sl_thold_0_b : in std_ulogic;
|
|
sg_0 : in std_ulogic;
|
|
scan_in : in std_ulogic;
|
|
scan_out : out std_ulogic;
|
|
|
|
---------------------------------------------------------------------
|
|
-- Interface with Decode
|
|
---------------------------------------------------------------------
|
|
dec_alu_rf1_mul_recform : in std_ulogic;
|
|
dec_alu_rf1_mul_val : in std_ulogic;
|
|
dec_alu_rf1_mul_ret : in std_ulogic; -- 0: Return low word/dword, 1: Return high word/dword
|
|
dec_alu_rf1_mul_sign : in std_ulogic; -- 0: Unsigned, 1: Signed
|
|
dec_alu_rf1_mul_size : in std_ulogic; -- 0: 32x32, 1: 64x64
|
|
dec_alu_rf1_mul_imm : in std_ulogic; -- 0: Normal 1: Multiplier is 16 bit S.E. immediate
|
|
dec_alu_rf1_xer_ov_update : in std_ulogic;
|
|
fxa_fxb_ex1_hold_ctr_flush : in std_ulogic;
|
|
|
|
---------------------------------------------------------------------
|
|
-- Interface with SPR
|
|
---------------------------------------------------------------------
|
|
ex4_spr_msr_cm : in std_ulogic;
|
|
|
|
---------------------------------------------------------------------
|
|
-- Interface with Bypass
|
|
---------------------------------------------------------------------
|
|
byp_alu_ex1_mulsrc_0 : in std_ulogic_vector(0 to 2**regmode-1);
|
|
byp_alu_ex1_mulsrc_1 : in std_ulogic_vector(0 to 2**regmode-1);
|
|
alu_byp_ex5_xer_mul : out std_ulogic_vector(0 to 3);
|
|
alu_byp_ex5_cr_mul : out std_ulogic_vector(0 to 4);
|
|
|
|
---------------------------------------------------------------------
|
|
-- Interface with Mux
|
|
---------------------------------------------------------------------
|
|
alu_byp_ex5_mul_rt : out std_ulogic_vector(0 to 2**regmode-1);
|
|
|
|
---------------------------------------------------------------------
|
|
-- Multi-drop
|
|
---------------------------------------------------------------------
|
|
alu_ex3_mul_done : out std_ulogic;
|
|
alu_ex4_mul_done : out std_ulogic
|
|
);
|
|
-- synopsys translate_off
|
|
-- synopsys translate_on
|
|
end xuq_alu_mult;
|
|
|
|
architecture xuq_alu_mult of xuq_alu_mult is
|
|
constant tiup : std_ulogic := '1';
|
|
constant tidn : std_ulogic := '0';
|
|
subtype s2 is std_ulogic_vector(0 to 1);
|
|
subtype s4 is std_ulogic_vector(0 to 3);
|
|
subtype s5 is std_ulogic_vector(0 to 4);
|
|
subtype s6 is std_ulogic_vector(0 to 5);
|
|
|
|
signal ex1_mulstage, ex1_mulstage_shift : std_ulogic_vector(0 to 3);
|
|
signal ex1_mul_val : std_ulogic;
|
|
signal ex2_ready_stage : std_ulogic_vector(0 to 3);
|
|
signal ex5_cmp0_eq : std_ulogic;
|
|
signal ex5_cmp0_gt : std_ulogic;
|
|
signal ex5_cmp0_lt : std_ulogic;
|
|
signal ex5_mul_cr_valid : std_ulogic;
|
|
signal ex5_xer_ov : std_ulogic;
|
|
signal ex3_recycle_s : std_ulogic_vector(196 to 264);
|
|
signal ex3_recycle_c : std_ulogic_vector(196 to 264);
|
|
signal ex4_pp5_0s : std_ulogic_vector(196 to 264);
|
|
signal ex4_pp5_0c : std_ulogic_vector(196 to 264);
|
|
signal ex3_recyc_sh00 : std_ulogic;
|
|
signal ex3_recyc_sh32 : std_ulogic;
|
|
signal ex3_xtd : std_ulogic;
|
|
signal ex3_xtd_196_or : std_ulogic;
|
|
signal ex3_xtd_196_and : std_ulogic;
|
|
signal ex3_xtd_197_or : std_ulogic;
|
|
signal ex3_xtd_197_and : std_ulogic;
|
|
signal ex3_xtd_ge1 : std_ulogic;
|
|
signal ex3_xtd_ge2 : std_ulogic;
|
|
signal ex3_xtd_ge3 : std_ulogic;
|
|
signal ex1_bs_sign : std_ulogic;
|
|
signal ex1_bd_sign : std_ulogic;
|
|
signal ex4_xi : std_ulogic_vector(0 to 63);
|
|
signal ex4_yi : std_ulogic_vector(0 to 63);
|
|
signal ex4_p : std_ulogic_vector(0 to 63);
|
|
signal ex4_g : std_ulogic_vector(1 to 63);
|
|
signal ex4_t : std_ulogic_vector(1 to 63);
|
|
signal ex4_res : std_ulogic_vector(0 to 63);
|
|
signal rslt_lo_act : std_ulogic;
|
|
signal ex4_ret_mulhw : std_ulogic;
|
|
signal ex4_ret_mullw : std_ulogic;
|
|
signal ex4_ret_mulli : std_ulogic;
|
|
signal ex4_ret_mulld : std_ulogic;
|
|
signal ex4_ret_mulldo : std_ulogic;
|
|
signal ex4_ret_mulhd : std_ulogic;
|
|
|
|
signal ex5_result : std_ulogic_vector(0 to 63);
|
|
signal ex4_all0_test : std_ulogic_vector(0 to 63);
|
|
signal ex4_all0_test_mid : std_ulogic;
|
|
signal ex4_all1_test : std_ulogic_vector(0 to 63);
|
|
signal ex4_all1_test_mid : std_ulogic;
|
|
signal ex4_all0 : std_ulogic;
|
|
signal ex4_all1 : std_ulogic;
|
|
signal ex4_all0_lo : std_ulogic;
|
|
signal ex4_all0_hi : std_ulogic;
|
|
signal ex4_all1_hi : std_ulogic;
|
|
signal ex5_sign_rt_cmp0 : std_ulogic;
|
|
signal ex5_eq : std_ulogic;
|
|
signal ex4_cout_32 : std_ulogic;
|
|
signal ex4_xi_b : std_ulogic_vector(0 to 63);
|
|
signal ex4_yi_b : std_ulogic_vector(0 to 63);
|
|
signal ex1_mulsrc0_act, ex1_mulsrc1_act : std_ulogic;
|
|
signal ex2_bs_lo, ex2_bd_lo : std_ulogic_vector(32 to 63);
|
|
signal ex2_act, ex3_act, ex4_act : std_ulogic;
|
|
|
|
-- Latch Signals
|
|
signal ex1_mul_val_q : std_ulogic; -- Valid multiply op
|
|
signal ex2_mulstage_q : std_ulogic_vector(0 to 3); -- Stage of multiplication
|
|
signal ex3_mulstage_q : std_ulogic_vector(0 to 3);
|
|
signal ex4_mulstage_q : std_ulogic_vector(0 to 3);
|
|
signal ex5_mulstage_q : std_ulogic_vector(0 to 3);
|
|
signal ex1_is_recform_q : std_ulogic; -- Multiply is a record form
|
|
signal ex2_is_recform_q : std_ulogic;
|
|
signal ex3_is_recform_q : std_ulogic;
|
|
signal ex4_is_recform_q : std_ulogic;
|
|
signal ex5_is_recform_q : std_ulogic;
|
|
signal ex1_retsel_q, ex1_retsel_d : std_ulogic_vector(0 to 2); -- Select which data to return
|
|
signal ex2_retsel_q : std_ulogic_vector(0 to 2);
|
|
signal ex3_retsel_q : std_ulogic_vector(0 to 2);
|
|
signal ex4_retsel_q : std_ulogic_vector(0 to 2);
|
|
signal ex1_mul_size_q : std_ulogic;
|
|
signal ex1_mul_sign_q : std_ulogic;
|
|
signal ex3_mul_done_q, ex3_mul_done_d : std_ulogic; -- Multiply result is done
|
|
signal ex4_mul_done_q : std_ulogic;
|
|
signal ex5_mul_done_q : std_ulogic;
|
|
signal ex1_xer_ov_update_q : std_ulogic; -- Update XER[OV]
|
|
signal ex2_xer_ov_update_q : std_ulogic;
|
|
signal ex3_xer_ov_update_q : std_ulogic;
|
|
signal ex4_xer_ov_update_q : std_ulogic;
|
|
signal ex5_xer_ov_update_q : std_ulogic;
|
|
signal ex2_bs_lo_sign_q, ex2_bs_lo_sign_d : std_ulogic; -- Sign of operands
|
|
signal ex2_bd_lo_sign_q, ex2_bd_lo_sign_d : std_ulogic;
|
|
signal ex4_ci_q, ex4_ci_d : std_ulogic;
|
|
signal ex5_res_q : std_ulogic_vector(0 to 63);
|
|
signal ex5_all0_q : std_ulogic; -- Check different pieces of result for ovf/cr
|
|
signal ex5_all1_q : std_ulogic;
|
|
signal ex5_all0_lo_q : std_ulogic;
|
|
signal ex5_all0_hi_q : std_ulogic;
|
|
signal ex5_all1_hi_q : std_ulogic;
|
|
signal carry_32_dly1_q : std_ulogic; -- Delayed carry bit for adder
|
|
signal all0_lo_dly1_q : std_ulogic; -- Delay low all 0
|
|
signal all0_lo_dly2_q : std_ulogic;
|
|
signal all0_lo_dly3_q : std_ulogic;
|
|
signal rslt_lo_q, rslt_lo_d : std_ulogic_vector(0 to 31); -- Result holding latches
|
|
signal rslt_lo_dly_q, rslt_lo_dly_d : std_ulogic_vector(0 to 31); -- delay low half of result for mulldo
|
|
signal ex2_mulsrc_0_q, ex1_mulsrc_0 : std_ulogic_vector(0 to 63);
|
|
signal ex2_mulsrc_1_q, ex1_mulsrc_1 : std_ulogic_vector(0 to 63);
|
|
signal ex5_rslt_hw_q, ex5_rslt_hw_d : std_ulogic_vector(0 to 7);
|
|
signal ex5_rslt_ld_li_q, ex5_rslt_ld_li_d : std_ulogic_vector(0 to 7);
|
|
signal ex5_rslt_ldo_q, ex5_rslt_ldo_d : std_ulogic_vector(0 to 7);
|
|
signal ex5_rslt_lw_hd_q, ex5_rslt_lw_hd_d : std_ulogic_vector(0 to 7);
|
|
signal ex5_cmp0_sel_reshi_q, ex5_cmp0_sel_reshi_d : std_ulogic;
|
|
signal ex5_cmp0_sel_reslo_q, ex5_cmp0_sel_reslo_d : std_ulogic;
|
|
signal ex5_cmp0_sel_reslodly_q, ex5_cmp0_sel_reslodly_d : std_ulogic;
|
|
signal ex5_cmp0_sel_reslodly2_q, ex5_cmp0_sel_reslodly2_d : std_ulogic;
|
|
signal ex5_eq_sel_all0_b_q, ex5_eq_sel_all0_b_d : std_ulogic;
|
|
signal ex5_eq_sel_all0_hi_b_q, ex5_eq_sel_all0_hi_b_d : std_ulogic;
|
|
signal ex5_eq_sel_all0_lo_b_q, ex5_eq_sel_all0_lo_b_d : std_ulogic;
|
|
signal ex5_eq_sel_all0_lo1_b_q, ex5_eq_sel_all0_lo1_b_d : std_ulogic;
|
|
signal ex5_eq_sel_all0_lo2_b_q, ex5_eq_sel_all0_lo2_b_d : std_ulogic;
|
|
signal ex5_eq_sel_all0_lo3_b_q, ex5_eq_sel_all0_lo3_b_d : std_ulogic;
|
|
signal ex5_ret_mullw_q : std_ulogic;
|
|
signal ex5_ret_mulldo_q : std_ulogic;
|
|
signal ex5_cmp0_undef_q, ex5_cmp0_undef_d : std_ulogic;
|
|
-- Scanchain
|
|
constant ex1_mul_val_offset : integer := 1;
|
|
constant ex2_mulstage_offset : integer := ex1_mul_val_offset + 1;
|
|
constant ex3_mulstage_offset : integer := ex2_mulstage_offset + ex2_mulstage_q'length;
|
|
constant ex4_mulstage_offset : integer := ex3_mulstage_offset + ex3_mulstage_q'length;
|
|
constant ex5_mulstage_offset : integer := ex4_mulstage_offset + ex4_mulstage_q'length;
|
|
constant ex1_retsel_offset : integer := ex5_mulstage_offset + ex5_mulstage_q'length;
|
|
constant ex2_retsel_offset : integer := ex1_retsel_offset + ex1_retsel_q'length;
|
|
constant ex3_retsel_offset : integer := ex2_retsel_offset + ex2_retsel_q'length;
|
|
constant ex4_retsel_offset : integer := ex3_retsel_offset + ex3_retsel_q'length;
|
|
constant ex3_mul_done_offset : integer := ex4_retsel_offset + ex4_retsel_q'length;
|
|
constant ex4_mul_done_offset : integer := ex3_mul_done_offset + 1;
|
|
constant ex5_mul_done_offset : integer := ex4_mul_done_offset + 1;
|
|
constant ex1_is_recform_offset : integer := ex5_mul_done_offset + 1;
|
|
constant ex2_is_recform_offset : integer := ex1_is_recform_offset + 1;
|
|
constant ex3_is_recform_offset : integer := ex2_is_recform_offset + 1;
|
|
constant ex4_is_recform_offset : integer := ex3_is_recform_offset + 1;
|
|
constant ex5_is_recform_offset : integer := ex4_is_recform_offset + 1;
|
|
constant ex1_xer_ov_update_offset : integer := ex5_is_recform_offset + 1;
|
|
constant ex2_xer_ov_update_offset : integer := ex1_xer_ov_update_offset + 1;
|
|
constant ex3_xer_ov_update_offset : integer := ex2_xer_ov_update_offset + 1;
|
|
constant ex4_xer_ov_update_offset : integer := ex3_xer_ov_update_offset + 1;
|
|
constant ex5_xer_ov_update_offset : integer := ex4_xer_ov_update_offset + 1;
|
|
constant ex1_mul_size_offset : integer := ex5_xer_ov_update_offset + 1;
|
|
constant ex1_mul_sign_offset : integer := ex1_mul_size_offset + 1;
|
|
constant ex2_bs_lo_sign_offset : integer := ex1_mul_sign_offset + 1;
|
|
constant ex2_bd_lo_sign_offset : integer := ex2_bs_lo_sign_offset + 1;
|
|
constant ex5_all0_offset : integer := ex2_bd_lo_sign_offset + 1;
|
|
constant ex5_all1_offset : integer := ex5_all0_offset + 1;
|
|
constant ex5_all0_lo_offset : integer := ex5_all1_offset + 1;
|
|
constant ex5_all0_hi_offset : integer := ex5_all0_lo_offset + 1;
|
|
constant ex5_all1_hi_offset : integer := ex5_all0_hi_offset + 1;
|
|
constant ex4_ci_offset : integer := ex5_all1_hi_offset + 1;
|
|
constant ex5_res_offset : integer := ex4_ci_offset + 1;
|
|
constant carry_32_dly1_offset : integer := ex5_res_offset + ex5_res_q'length;
|
|
constant all0_lo_dly1_offset : integer := carry_32_dly1_offset + 1;
|
|
constant all0_lo_dly2_offset : integer := all0_lo_dly1_offset + 1;
|
|
constant all0_lo_dly3_offset : integer := all0_lo_dly2_offset + 1;
|
|
constant rslt_lo_offset : integer := all0_lo_dly3_offset + 1;
|
|
constant rslt_lo_dly_offset : integer := rslt_lo_offset + rslt_lo_q'length;
|
|
constant ex2_mulsrc_0_offset : integer := rslt_lo_dly_offset + rslt_lo_dly_q'length;
|
|
constant ex2_mulsrc_1_offset : integer := ex2_mulsrc_0_offset + ex2_mulsrc_0_q'length;
|
|
constant ex5_rslt_hw_offset : integer := ex2_mulsrc_1_offset + ex2_mulsrc_1_q'length;
|
|
constant ex5_rslt_ld_li_offset : integer := ex5_rslt_hw_offset + ex5_rslt_hw_q'length;
|
|
constant ex5_rslt_ldo_offset : integer := ex5_rslt_ld_li_offset + ex5_rslt_ld_li_q'length;
|
|
constant ex5_rslt_lw_hd_offset : integer := ex5_rslt_ldo_offset + ex5_rslt_ldo_q'length;
|
|
constant ex5_cmp0_sel_reshi_offset : integer := ex5_rslt_lw_hd_offset + ex5_rslt_lw_hd_q'length;
|
|
constant ex5_cmp0_sel_reslo_offset : integer := ex5_cmp0_sel_reshi_offset + 1;
|
|
constant ex5_cmp0_sel_reslodly_offset : integer := ex5_cmp0_sel_reslo_offset + 1;
|
|
constant ex5_cmp0_sel_reslodly2_offset : integer := ex5_cmp0_sel_reslodly_offset + 1;
|
|
constant ex5_eq_sel_all0_b_offset : integer := ex5_cmp0_sel_reslodly2_offset + 1;
|
|
constant ex5_eq_sel_all0_hi_b_offset : integer := ex5_eq_sel_all0_b_offset + 1;
|
|
constant ex5_eq_sel_all0_lo_b_offset : integer := ex5_eq_sel_all0_hi_b_offset + 1;
|
|
constant ex5_eq_sel_all0_lo1_b_offset : integer := ex5_eq_sel_all0_lo_b_offset + 1;
|
|
constant ex5_eq_sel_all0_lo2_b_offset : integer := ex5_eq_sel_all0_lo1_b_offset + 1;
|
|
constant ex5_eq_sel_all0_lo3_b_offset : integer := ex5_eq_sel_all0_lo2_b_offset + 1;
|
|
constant ex5_ret_mullw_offset : integer := ex5_eq_sel_all0_lo3_b_offset + 1;
|
|
constant ex5_ret_mulldo_offset : integer := ex5_ret_mullw_offset + 1;
|
|
constant ex5_cmp0_undef_offset : integer := ex5_ret_mulldo_offset + 1;
|
|
constant scan_right : integer := ex5_cmp0_undef_offset + 1;
|
|
|
|
signal siv : std_ulogic_vector(0 to scan_right-1);
|
|
signal sov : std_ulogic_vector(0 to scan_right-1);
|
|
|
|
begin
|
|
|
|
---------------------------------------------------------------------
|
|
-- Other signals
|
|
---------------------------------------------------------------------
|
|
ex1_retsel_d <= dec_alu_rf1_mul_ret & dec_alu_rf1_mul_size & dec_alu_rf1_mul_imm;
|
|
ex5_mul_cr_valid <= ex5_is_recform_q and ex5_mul_done_q;
|
|
|
|
---------------------------------------------------------------------
|
|
-- Multiply Stage Counter
|
|
---------------------------------------------------------------------
|
|
ex1_mul_val <= ex1_mul_val_q and not fxa_fxb_ex1_hold_ctr_flush;
|
|
ex1_mulstage_shift <= tidn & gate(ex2_mulstage_q(0 to 2),not(fxa_fxb_ex1_hold_ctr_flush));
|
|
|
|
mult_64b_stagecnt : if regmode = 6 generate
|
|
with ex1_mul_val select
|
|
ex1_mulstage <= "1000" when '1',
|
|
ex1_mulstage_shift when others;
|
|
end generate;
|
|
mult_32b_stagecnt : if regmode = 5 generate
|
|
ex1_mulstage <= "0000";
|
|
end generate;
|
|
|
|
|
|
------------------------------------------------------------------------------------------------------------------------------------------
|
|
------------------------------------------------------------------------------------------------------------------------------------------
|
|
-- NEW MULTIPLIER ------------------------------------------------------------------------------------------------------------------------
|
|
------------------------------------------------------------------------------------------------------------------------------------------
|
|
------------------------------------------------------------------------------------------------------------------------------------------
|
|
|
|
---------------------------------------------------------------------
|
|
-- Signs
|
|
---------------------------------------------------------------------
|
|
|
|
|
|
ex2_bs_lo_sign_d <= ((ex1_bs_sign and ex1_mul_sign_q and (ex1_mulstage(1) or ex1_mulstage(3))) and ex1_mul_size_q ) or
|
|
( ex1_bs_sign and ex1_mul_sign_q and not ex1_mul_size_q ) or
|
|
( ex1_bs_sign and ex1_mul_sign_q and ex1_mulstage(1) and ex1_retsel_q(2));
|
|
ex2_bd_lo_sign_d <= ((ex1_bd_sign and ex1_mul_sign_q and (ex1_mulstage(2) or ex1_mulstage(3))) and ex1_mul_size_q ) or
|
|
( ex1_bd_sign and ex1_mul_sign_q and not ex1_mul_size_q ) or
|
|
( ex1_bd_sign and ex1_mul_sign_q and ex1_retsel_q(2));
|
|
|
|
---------------------------------------------------------------------
|
|
-- Operands
|
|
---------------------------------------------------------------------
|
|
ex1_mulsrc0_act <= or_reduce(ex1_mulstage);
|
|
ex1_mulsrc1_act <= ex1_mulstage(0) or ex1_mulstage(2);
|
|
|
|
with ex1_mul_val_q select
|
|
ex1_mulsrc_0(0 to 63) <= byp_alu_ex1_mulsrc_0(0 to 63) when '1',
|
|
ex2_mulsrc_0_q(32 to 63) & ex2_mulsrc_0_q(0 to 31) when others;
|
|
|
|
|
|
with ex1_mul_val_q select
|
|
ex1_mulsrc_1(0 to 63) <= byp_alu_ex1_mulsrc_1(0 to 63) when '1',
|
|
ex2_mulsrc_1_q(32 to 63) & ex2_mulsrc_1_q(0 to 31) when others;
|
|
|
|
-- Use the saved value for bd_sign when mulsrc1 is clock gated
|
|
with (ex1_mulstage(1) or ex1_mulstage(3)) select
|
|
ex1_bd_sign <= ex2_mulsrc_1_q(32) when '1',
|
|
ex1_mulsrc_1(32) when others;
|
|
|
|
|
|
ex1_bs_sign <= ex1_mulsrc_0(32);
|
|
ex2_bs_lo <= ex2_mulsrc_0_q(32 to 63);
|
|
ex2_bd_lo <= ex2_mulsrc_1_q(32 to 63);
|
|
|
|
---------------------------------------------------------------------
|
|
-- Multiply Core
|
|
---------------------------------------------------------------------
|
|
mcore : entity work.xuq_alu_mult_core(xuq_alu_mult_core)
|
|
generic map (expand_type => expand_type)
|
|
port map (
|
|
nclk => nclk,
|
|
vdd => vdd,
|
|
gnd => gnd,
|
|
delay_lclkr_dc => delay_lclkr_dc,
|
|
mpw1_dc_b => mpw1_dc_b,
|
|
mpw2_dc_b => mpw2_dc_b,
|
|
func_sl_force => func_sl_force,
|
|
func_sl_thold_0_b => func_sl_thold_0_b,
|
|
sg_0 => sg_0,
|
|
scan_in => siv(0),
|
|
scan_out => sov(0),
|
|
ex2_act => ex2_act,
|
|
ex3_act => ex3_act,
|
|
ex2_bs_lo_sign => ex2_bs_lo_sign_q,
|
|
ex2_bd_lo_sign => ex2_bd_lo_sign_q,
|
|
ex2_bs_lo => ex2_bs_lo,
|
|
ex2_bd_lo => ex2_bd_lo,
|
|
ex3_recycle_s => ex3_recycle_s(196 to 264),
|
|
ex3_recycle_c => ex3_recycle_c(196 to 263),
|
|
ex4_pp5_0s_out => ex4_pp5_0s,
|
|
ex4_pp5_0c_out => ex4_pp5_0c(196 to 263));
|
|
|
|
ex4_pp5_0c(264) <= tidn;
|
|
|
|
ex2_act <= or_reduce(ex2_mulstage_q);
|
|
ex3_act <= or_reduce(ex3_mulstage_q);
|
|
ex4_act <= or_reduce(ex4_mulstage_q);
|
|
|
|
---------------------------------------------------------------------
|
|
-- Carry In
|
|
---------------------------------------------------------------------
|
|
-- |---------|---------|
|
|
-- |---------|---------| dly <--/ * for mulli
|
|
-- |---------|---------| dly1 <-/ * for mulld
|
|
-- |---------|---------| dly <--/ * for mulhd
|
|
|
|
ex4_ci_d <= (carry_32_dly1_q and ex3_mulstage_q(2) ) or -- feedback from previous previous add
|
|
(ex4_cout_32 and ((ex3_mulstage_q(3) and ex3_retsel_q(1)) or
|
|
(ex3_mulstage_q(1) and ex3_retsel_q(2))) );
|
|
|
|
---------------------------------------------------------------------
|
|
-- Adder (ripple carry for simulation, replace with carry look ahead
|
|
---------------------------------------------------------------------
|
|
ex4_xi <= ex4_pp5_0s(200 to 263);
|
|
ex4_yi <= ex4_pp5_0c(200 to 263);
|
|
|
|
ex4_p <= ex4_xi(0 to 63) xor ex4_yi(0 to 63);
|
|
ex4_g <= ex4_xi(1 to 63) and ex4_yi(1 to 63);
|
|
ex4_t <= ex4_xi(1 to 63) or ex4_yi(1 to 63);
|
|
|
|
ex4_xi_b(0 to 63) <= not ex4_xi(0 to 63) ;
|
|
ex4_yi_b(0 to 63) <= not ex4_yi(0 to 63) ;
|
|
|
|
cla64ci: entity work.xuq_add(xuq_add)
|
|
port map(
|
|
x_b(0 to 63) => ex4_xi_b(0 to 63),
|
|
y_b(0 to 63) => ex4_yi_b(0 to 63),
|
|
ci(8) => ex4_ci_q,
|
|
sum(0 to 63) => ex4_res(0 to 63),
|
|
cout_32 => ex4_cout_32,
|
|
cout_0 => open);
|
|
|
|
---------------------------------------------------------------------
|
|
-- Determine Recirculation
|
|
---------------------------------------------------------------------
|
|
-- Shift amount
|
|
ex3_recyc_sh32 <= ex3_retsel_q(1) and (ex3_mulstage_q(1) or ex3_mulstage_q(3));
|
|
ex3_recyc_sh00 <= ex3_retsel_q(1) and (ex3_mulstage_q(2)) ;
|
|
|
|
-- Get rid of "bogus" bit
|
|
ex3_xtd_196_or <= ex4_pp5_0s(196) or ex4_pp5_0c(196);
|
|
ex3_xtd_196_and <= ex4_pp5_0s(196) and ex4_pp5_0c(196);
|
|
ex3_xtd_197_or <= ex4_pp5_0s(197) or ex4_pp5_0c(197);
|
|
ex3_xtd_197_and <= ex4_pp5_0s(197) and ex4_pp5_0c(197);
|
|
|
|
ex3_xtd_ge1 <= ex3_xtd_196_or or ex3_xtd_197_or;
|
|
ex3_xtd_ge2 <= ex3_xtd_196_or or ex3_xtd_197_and;
|
|
ex3_xtd_ge3 <= ex3_xtd_196_and or (ex3_xtd_196_or and ex3_xtd_197_or);
|
|
|
|
|
|
ex3_xtd <= (ex3_mulstage_q(1) and ex3_retsel_q(1) and not ex3_xtd_ge1) or
|
|
(ex3_mulstage_q(2) and ex3_retsel_q(1) and not ex3_xtd_ge2) or
|
|
(ex3_mulstage_q(3) and ex3_retsel_q(1) and not ex3_xtd_ge3) ;
|
|
|
|
ex3_recycle_s(196) <= ex4_pp5_0s(196) and (ex3_retsel_q(1) and not ex3_mulstage_q(0));
|
|
ex3_recycle_c(196) <= ex4_pp5_0c(196) and (ex3_retsel_q(1) and not ex3_mulstage_q(0)) ;
|
|
|
|
ex3_recycle_s(197) <= ex4_pp5_0s(197) and (ex3_retsel_q(1) and not ex3_mulstage_q(0)) ;
|
|
ex3_recycle_c(197) <= ex4_pp5_0c(197) and (ex3_retsel_q(1) and not ex3_mulstage_q(0)) ;
|
|
|
|
ex3_recycle_s(198 to 264) <= ( (198 to 264=> ex3_recyc_sh00) and ( ex4_pp5_0s(198 to 264) ) ) or
|
|
( (198 to 264=> ex3_recyc_sh32) and ( (0 to 31=> ex3_xtd) & ex4_pp5_0s(198 to 231) & tidn ) ) ;
|
|
|
|
ex3_recycle_c(198 to 264) <= ( (198 to 264=> ex3_recyc_sh00) and ( ex4_pp5_0c(198 to 264) ) ) or
|
|
( (198 to 264=> ex3_recyc_sh32) and ( (0 to 31=> tidn) & ex4_pp5_0c(198 to 231) & tidn ) ) ;
|
|
|
|
---------------------------------------------------------------------
|
|
-- Result
|
|
---------------------------------------------------------------------
|
|
rslt_lo_act <= ex5_mulstage_q(0) or ex5_mulstage_q(2);
|
|
|
|
rslt_lo_d <= ex5_res_q(32 to 63);
|
|
rslt_lo_dly_d <= rslt_lo_q;
|
|
|
|
-- RETURN RET SIZE IMM OVF READY
|
|
-- mulhw (0 to 31 => '0') & ex5_res_q(0 to 31) 1 0 0 . 1000
|
|
-- mullw ex5_res_q 0 0 0 . 1000
|
|
-- mulli ex5_res_q(32 to 63) & rslt_lo_q . . 1 . 0100
|
|
-- mulld ex5_res_q(32 to 63) & rslt_lo_q 0 1 0 0 0010
|
|
-- mulldo rslt_lo_q & rslt_lo_dly_q 0 1 0 1 0001
|
|
-- mulhd ex5_res_q 1 1 0 . 0001
|
|
|
|
ex4_ret_mulhw <= ex4_retsel_q(0) and not ex4_retsel_q(1) and not ex4_retsel_q(2) ;
|
|
ex4_ret_mullw <= not ex4_retsel_q(0) and not ex4_retsel_q(1) and not ex4_retsel_q(2) ;
|
|
ex4_ret_mulli <= ex4_retsel_q(2) ;
|
|
ex4_ret_mulld <= not ex4_retsel_q(0) and ex4_retsel_q(1) and not ex4_retsel_q(2) and not ex4_xer_ov_update_q;
|
|
ex4_ret_mulldo <= not ex4_retsel_q(0) and ex4_retsel_q(1) and not ex4_retsel_q(2) and ex4_xer_ov_update_q;
|
|
ex4_ret_mulhd <= ex4_retsel_q(0) and ex4_retsel_q(1) and not ex4_retsel_q(2) ;
|
|
|
|
ex5_rslt_hw_d <= (others=>(ex4_ret_mulhw ));
|
|
ex5_rslt_ld_li_d <= (others=>(ex4_ret_mulli or ex4_ret_mulld));
|
|
ex5_rslt_ldo_d <= (others=>(ex4_ret_mulldo ));
|
|
ex5_rslt_lw_hd_d <= (others=>(ex4_ret_mullw or ex4_ret_mulhd));
|
|
|
|
ex5_result <= (((0 to 31 => '0') & ex5_res_q(0 to 31)) and fanout(ex5_rslt_hw_q ,64)) or
|
|
((ex5_res_q(32 to 63) & rslt_lo_q ) and fanout(ex5_rslt_ld_li_q,64)) or
|
|
((rslt_lo_q & rslt_lo_dly_q ) and fanout(ex5_rslt_ldo_q ,64)) or
|
|
((ex5_res_q ) and fanout(ex5_rslt_lw_hd_q,64));
|
|
|
|
---------------------------------------------------------------------
|
|
-- Overflow
|
|
---------------------------------------------------------------------
|
|
ex4_all0_test(0 to 62) <= ( not ex4_p(0 to 62) and not ex4_t(1 to 63) ) or
|
|
( ex4_p(0 to 62) and ex4_t(1 to 63) ) ;
|
|
ex4_all0_test(63) <= ( not ex4_p(63) and not ex4_ci_q ) or
|
|
( ex4_p(63) and ex4_ci_q ) ;
|
|
ex4_all0_test_mid <= ( not ex4_p(31) and not ex4_cout_32 ) or
|
|
( ex4_p(31) and ex4_cout_32 ) ;
|
|
|
|
ex4_all1_test(0 to 62) <= ( ex4_p(0 to 62) and not ex4_g(1 to 63) ) or
|
|
( not ex4_p(0 to 62) and ex4_g(1 to 63) );
|
|
ex4_all1_test(63) <= ( ex4_p(63) and not ex4_ci_q ) or
|
|
( not ex4_p(63) and ex4_ci_q );
|
|
ex4_all1_test_mid <= ( ex4_p(31) and not ex4_cout_32 ) or
|
|
( not ex4_p(31) and ex4_cout_32 );
|
|
|
|
ex4_all0 <= and_reduce( ex4_all0_test(0 to 63) );
|
|
ex4_all1 <= and_reduce( ex4_all1_test(0 to 63) );
|
|
ex4_all0_lo <= and_reduce( ex4_all0_test(32 to 63) );
|
|
ex4_all0_hi <= and_reduce( ex4_all0_test(0 to 30) & ex4_all0_test_mid );
|
|
ex4_all1_hi <= and_reduce( ex4_all1_test(0 to 30) & ex4_all1_test_mid );
|
|
|
|
|
|
-- What sign bit to use for compare to zero?
|
|
--
|
|
-- | CM = 1 (64b) | CM = 0 (32b) |
|
|
-- hw | '0' | ex5_res_q(0) | <- 64b case is undefined ,return zero
|
|
-- lw | ex5_res_q(0) | ex5_res_q(32) |
|
|
-- hd | ex5_res_q(0) | ex5_res_q(32) |
|
|
-- ld | ex5_res_q(32) | rslt_lo_q(0) |
|
|
-- ldo | rslt_lo_q(0) | rslt_lo_dly_q(0) |
|
|
|
|
-- (ex5_res_q(0) and (ex5_ret_mullw or ex5_ret_mulhd or ex5_ret_mulhw) and ex5_spr_msr_cm_q) or
|
|
-- (ex5_res_q(0) and ex5_ret_mulhw ) or
|
|
-- (ex5_res_q(32) and (ex5_ret_mullw or ex5_ret_mulhd or ex5_ret_mulhw) and not ex5_spr_msr_cm_q) or
|
|
-- (ex5_res_q(32) and ex5_ret_mulld and ex5_spr_msr_cm_q) or
|
|
-- (rslt_lo_q(0) and ex5_ret_mulld and not ex5_spr_msr_cm_q) or
|
|
-- (rslt_lo_q(0) and ex5_ret_mulldo and ex5_spr_msr_cm_q) or
|
|
-- (rslt_lo_dly_q(0) and ex5_ret_mulldo and not ex5_spr_msr_cm_q);
|
|
|
|
ex5_cmp0_undef_d <= ex4_ret_mulhw and ex4_spr_msr_cm;
|
|
|
|
ex5_cmp0_sel_reshi_d <= ( ex4_ret_mulhw ) or
|
|
((ex4_ret_mullw or ex4_ret_mulhd) and ex4_spr_msr_cm);
|
|
ex5_cmp0_sel_reslo_d <= ((ex4_ret_mullw or ex4_ret_mulhd) and not ex4_spr_msr_cm) or
|
|
( ex4_ret_mulld and ex4_spr_msr_cm);
|
|
ex5_cmp0_sel_reslodly_d <= ( ex4_ret_mulld and not ex4_spr_msr_cm) or
|
|
( ex4_ret_mulldo and ex4_spr_msr_cm);
|
|
ex5_cmp0_sel_reslodly2_d <= ( ex4_ret_mulldo and not ex4_spr_msr_cm);
|
|
|
|
ex5_sign_rt_cmp0 <=(ex5_cmp0_sel_reshi_q and ex5_res_q(0) ) or
|
|
(ex5_cmp0_sel_reslo_q and ex5_res_q(32) ) or
|
|
(ex5_cmp0_sel_reslodly_q and rslt_lo_q(0) ) or
|
|
(ex5_cmp0_sel_reslodly2_q and rslt_lo_dly_q(0) );
|
|
|
|
|
|
-- +-----------------------------+-----------------------------+
|
|
-- | CM = 1 (64b) | CM = 0 (32b) |
|
|
-- +-----------------------------+-----------------------------+
|
|
-- lw | all0 | all0_lo
|
|
-- hd | all0 | all0 & all0_lo
|
|
-- ld | all0_lo & all0_lo_dly2 | all0_lo_dly2
|
|
-- ldo | all0_lo_dly1 & all0_lo_dly3 | all0_lo_dly3
|
|
-- hw | all0_hi | all0_hi <- 64b case is undefined ,return zero
|
|
-- +-----------------------------+-----------------------------+
|
|
|
|
-- (ex5_ret_mullw and ex5_all0_q and ex5_spr_msr_cm_q) or
|
|
-- (ex5_ret_mullw and ex5_all0_lo_q and not ex5_spr_msr_cm_q) or
|
|
-- (ex5_ret_mulhd and ex5_all0_q ) or
|
|
-- (ex5_ret_mulhd and ex5_all0_lo_q and not ex5_spr_msr_cm_q) or
|
|
-- (ex5_ret_mulld and ex5_all0_lo_q and all0_lo_dly2_q and ex5_spr_msr_cm_q) or
|
|
-- (ex5_ret_mulld and all0_lo_dly2_q and not ex5_spr_msr_cm_q) or
|
|
-- (ex5_ret_mulldo and all0_lo_dly1_q and all0_lo_dly3_q and ex5_spr_msr_cm_q) or
|
|
-- (ex5_ret_mulldo and all0_lo_dly3_q and not ex5_spr_msr_cm_q) or
|
|
-- (ex5_ret_mulhw and ex5_all0_hi_q );
|
|
|
|
ex5_eq_sel_all0_hi_b_d <= not( ex4_ret_mulhw );
|
|
|
|
ex5_eq_sel_all0_b_d <= not((ex4_ret_mullw and ex4_spr_msr_cm) or
|
|
(ex4_ret_mulhd and ex4_spr_msr_cm));
|
|
|
|
ex5_eq_sel_all0_lo_b_d <= not((ex4_ret_mullw and not ex4_spr_msr_cm) or
|
|
(ex4_ret_mulhd and not ex4_spr_msr_cm) or
|
|
(ex4_ret_mulld and ex4_spr_msr_cm));
|
|
|
|
ex5_eq_sel_all0_lo1_b_d <= not((ex4_ret_mulldo and ex4_spr_msr_cm));
|
|
|
|
ex5_eq_sel_all0_lo2_b_d <= not( ex4_ret_mulld );
|
|
|
|
ex5_eq_sel_all0_lo3_b_d <= not( ex4_ret_mulldo );
|
|
|
|
|
|
ex5_eq <= (ex5_eq_sel_all0_b_q or ex5_all0_q ) and
|
|
(ex5_eq_sel_all0_lo_b_q or ex5_all0_lo_q ) and
|
|
(ex5_eq_sel_all0_lo1_b_q or all0_lo_dly1_q) and
|
|
(ex5_eq_sel_all0_lo2_b_q or all0_lo_dly2_q) and
|
|
(ex5_eq_sel_all0_lo3_b_q or all0_lo_dly3_q) and
|
|
(ex5_eq_sel_all0_hi_b_q or ex5_all0_hi_q );
|
|
|
|
ex5_cmp0_eq <= ex5_eq and not ex5_cmp0_undef_q;
|
|
ex5_cmp0_gt <= not ex5_sign_rt_cmp0 and not ex5_eq and not ex5_cmp0_undef_q;
|
|
ex5_cmp0_lt <= ex5_sign_rt_cmp0 and not ex5_eq and not ex5_cmp0_undef_q;
|
|
|
|
-- What sign bit to use for overflow detection?
|
|
--
|
|
-- lwo - ex5_res_q(32)
|
|
-- ldo - rslt_lo_q(0)
|
|
|
|
-- ex5_sign_rt_ov <= (ex5_res_q(32) and ex5_ret_mullw ) or
|
|
-- (rslt_lo_q(0) and ex5_ret_mulldo);
|
|
--
|
|
-- ex5_xer_ov <= (ex5_ret_mullw and not ex5_sign_rt_ov and not ex5_all0_hi_q) or
|
|
-- (ex5_ret_mullw and ex5_sign_rt_ov and not ex5_all1_hi_q) or
|
|
-- (ex5_ret_mulldo and not ex5_sign_rt_ov and not ex5_all0_q ) or
|
|
-- (ex5_ret_mulldo and ex5_sign_rt_ov and not ex5_all1_q );
|
|
|
|
ex5_xer_ov <= (ex5_ret_mullw_q and ((not ex5_res_q(32) and not ex5_all0_hi_q) or
|
|
( ex5_res_q(32) and not ex5_all1_hi_q))) or
|
|
(ex5_ret_mulldo_q and ((not rslt_lo_q(0) and not ex5_all0_q ) or
|
|
( rslt_lo_q(0) and not ex5_all1_q )));
|
|
|
|
|
|
---------------------------------------------------------------------
|
|
-- Return
|
|
---------------------------------------------------------------------
|
|
alu_byp_ex5_mul_rt <= ex5_result;
|
|
alu_byp_ex5_cr_mul <= ex5_cmp0_lt & ex5_cmp0_gt & ex5_cmp0_eq & (ex5_xer_ov and ex5_xer_ov_update_q) & ex5_mul_cr_valid;
|
|
alu_byp_ex5_xer_mul <= ex5_xer_ov & tidn & ex5_xer_ov_update_q & tidn;
|
|
|
|
---------------------------------------------------------------------
|
|
-- Assert a signal when the result is ready
|
|
---------------------------------------------------------------------
|
|
|
|
-- READY RET SIZE IMM OVERFLOW
|
|
-- mulhw 1000 . 0 0 .
|
|
-- mullw 1000 . 0 0 .
|
|
-- mulli 0100 . . 1 .
|
|
-- mulld 0010 0 1 0 0
|
|
-- mulldo 0001 0 1 0 1
|
|
-- mulhd 0001 1 1 0 .
|
|
|
|
ex2_ready_stage(0) <= ( not ex2_retsel_q(1) and not ex2_retsel_q(2) ) ;
|
|
ex2_ready_stage(1) <= ( ex2_retsel_q(2) ) ;
|
|
ex2_ready_stage(2) <= (not ex2_retsel_q(0) and ex2_retsel_q(1) and not ex2_retsel_q(2) and not ex2_xer_ov_update_q) ;
|
|
ex2_ready_stage(3) <= (not ex2_retsel_q(0) and ex2_retsel_q(1) and not ex2_retsel_q(2) and ex2_xer_ov_update_q) or
|
|
( ex2_retsel_q(0) and ex2_retsel_q(1) and not ex2_retsel_q(2) ) ;
|
|
|
|
|
|
ex3_mul_done_d <= or_reduce(ex2_ready_stage and ex2_mulstage_q);
|
|
|
|
alu_ex3_mul_done <= ex3_mul_done_q;
|
|
alu_ex4_mul_done <= ex4_mul_done_q;
|
|
|
|
|
|
------------------------------------------------------------------------------------------------------------------------------------------
|
|
------------------------------------------------------------------------------------------------------------------------------------------
|
|
------------------------------------------------------------------------------------------------------------------------------------------
|
|
------------------------------------------------------------------------------------------------------------------------------------------
|
|
------------------------------------------------------------------------------------------------------------------------------------------
|
|
mark_unused(ex3_recycle_c(264));
|
|
mark_unused(ex5_mulstage_q(1));
|
|
mark_unused(ex5_mulstage_q(3));
|
|
|
|
---------------------------------------------------------------------
|
|
-- Latch Instances
|
|
---------------------------------------------------------------------
|
|
ex1_mul_val_latch : tri_rlmlatch_p
|
|
generic map (init => 0, expand_type => expand_type, needs_sreset => 1)
|
|
port map (nclk => nclk,
|
|
vd => vdd,
|
|
gd => gnd,
|
|
act => tiup,
|
|
forcee => func_sl_force,
|
|
d_mode => d_mode_dc,
|
|
delay_lclkr => delay_lclkr_dc,
|
|
mpw1_b => mpw1_dc_b,
|
|
mpw2_b => mpw2_dc_b,
|
|
thold_b => func_sl_thold_0_b,
|
|
sg => sg_0,
|
|
scin => siv(ex1_mul_val_offset),
|
|
scout => sov(ex1_mul_val_offset),
|
|
din => dec_alu_rf1_mul_val,
|
|
dout => ex1_mul_val_q);
|
|
ex2_mulstage_latch : tri_rlmreg_p
|
|
generic map (width => ex2_mulstage_q'length, init => 0, expand_type => expand_type, needs_sreset => 1)
|
|
port map (nclk => nclk,
|
|
vd => vdd,
|
|
gd => gnd,
|
|
act => tiup,
|
|
forcee => func_sl_force,
|
|
d_mode => d_mode_dc,
|
|
delay_lclkr => delay_lclkr_dc,
|
|
mpw1_b => mpw1_dc_b,
|
|
mpw2_b => mpw2_dc_b,
|
|
thold_b => func_sl_thold_0_b,
|
|
sg => sg_0,
|
|
scin => siv(ex2_mulstage_offset to ex2_mulstage_offset + ex2_mulstage_q'length-1),
|
|
scout => sov(ex2_mulstage_offset to ex2_mulstage_offset + ex2_mulstage_q'length-1),
|
|
din => ex1_mulstage,
|
|
dout => ex2_mulstage_q);
|
|
ex3_mulstage_latch : tri_rlmreg_p
|
|
generic map (width => ex3_mulstage_q'length, init => 0, expand_type => expand_type, needs_sreset => 1)
|
|
port map (nclk => nclk,
|
|
vd => vdd,
|
|
gd => gnd,
|
|
act => tiup,
|
|
forcee => func_sl_force,
|
|
d_mode => d_mode_dc,
|
|
delay_lclkr => delay_lclkr_dc,
|
|
mpw1_b => mpw1_dc_b,
|
|
mpw2_b => mpw2_dc_b,
|
|
thold_b => func_sl_thold_0_b,
|
|
sg => sg_0,
|
|
scin => siv(ex3_mulstage_offset to ex3_mulstage_offset + ex3_mulstage_q'length-1),
|
|
scout => sov(ex3_mulstage_offset to ex3_mulstage_offset + ex3_mulstage_q'length-1),
|
|
din => ex2_mulstage_q,
|
|
dout => ex3_mulstage_q);
|
|
ex4_mulstage_latch : tri_rlmreg_p
|
|
generic map (width => ex4_mulstage_q'length, init => 0, expand_type => expand_type, needs_sreset => 1)
|
|
port map (nclk => nclk,
|
|
vd => vdd,
|
|
gd => gnd,
|
|
act => tiup,
|
|
forcee => func_sl_force,
|
|
d_mode => d_mode_dc,
|
|
delay_lclkr => delay_lclkr_dc,
|
|
mpw1_b => mpw1_dc_b,
|
|
mpw2_b => mpw2_dc_b,
|
|
thold_b => func_sl_thold_0_b,
|
|
sg => sg_0,
|
|
scin => siv(ex4_mulstage_offset to ex4_mulstage_offset + ex4_mulstage_q'length-1),
|
|
scout => sov(ex4_mulstage_offset to ex4_mulstage_offset + ex4_mulstage_q'length-1),
|
|
din => ex3_mulstage_q,
|
|
dout => ex4_mulstage_q);
|
|
ex5_mulstage_latch : tri_rlmreg_p
|
|
generic map (width => ex5_mulstage_q'length, init => 0, expand_type => expand_type, needs_sreset => 1)
|
|
port map (nclk => nclk,
|
|
vd => vdd,
|
|
gd => gnd,
|
|
act => tiup,
|
|
forcee => func_sl_force,
|
|
d_mode => d_mode_dc,
|
|
delay_lclkr => delay_lclkr_dc,
|
|
mpw1_b => mpw1_dc_b,
|
|
mpw2_b => mpw2_dc_b,
|
|
thold_b => func_sl_thold_0_b,
|
|
sg => sg_0,
|
|
scin => siv(ex5_mulstage_offset to ex5_mulstage_offset + ex5_mulstage_q'length-1),
|
|
scout => sov(ex5_mulstage_offset to ex5_mulstage_offset + ex5_mulstage_q'length-1),
|
|
din => ex4_mulstage_q,
|
|
dout => ex5_mulstage_q);
|
|
ex1_retsel_latch : tri_rlmreg_p
|
|
generic map (width => ex1_retsel_q'length, init => 0, expand_type => expand_type, needs_sreset => 1)
|
|
port map (nclk => nclk,
|
|
vd => vdd,
|
|
gd => gnd,
|
|
act => dec_alu_rf1_mul_val,
|
|
forcee => func_sl_force,
|
|
d_mode => d_mode_dc,
|
|
delay_lclkr => delay_lclkr_dc,
|
|
mpw1_b => mpw1_dc_b,
|
|
mpw2_b => mpw2_dc_b,
|
|
thold_b => func_sl_thold_0_b,
|
|
sg => sg_0,
|
|
scin => siv(ex1_retsel_offset to ex1_retsel_offset + ex1_retsel_q'length-1),
|
|
scout => sov(ex1_retsel_offset to ex1_retsel_offset + ex1_retsel_q'length-1),
|
|
din => ex1_retsel_d,
|
|
dout => ex1_retsel_q);
|
|
ex2_retsel_latch : tri_rlmreg_p
|
|
generic map (width => ex2_retsel_q'length, init => 0, expand_type => expand_type, needs_sreset => 1)
|
|
port map (nclk => nclk,
|
|
vd => vdd,
|
|
gd => gnd,
|
|
act => ex1_mul_val_q,
|
|
forcee => func_sl_force,
|
|
d_mode => d_mode_dc,
|
|
delay_lclkr => delay_lclkr_dc,
|
|
mpw1_b => mpw1_dc_b,
|
|
mpw2_b => mpw2_dc_b,
|
|
thold_b => func_sl_thold_0_b,
|
|
sg => sg_0,
|
|
scin => siv(ex2_retsel_offset to ex2_retsel_offset + ex2_retsel_q'length-1),
|
|
scout => sov(ex2_retsel_offset to ex2_retsel_offset + ex2_retsel_q'length-1),
|
|
din => ex1_retsel_q,
|
|
dout => ex2_retsel_q);
|
|
ex3_retsel_latch : tri_rlmreg_p
|
|
generic map (width => ex3_retsel_q'length, init => 0, expand_type => expand_type, needs_sreset => 1)
|
|
port map (nclk => nclk,
|
|
vd => vdd,
|
|
gd => gnd,
|
|
act => tiup,
|
|
forcee => func_sl_force,
|
|
d_mode => d_mode_dc,
|
|
delay_lclkr => delay_lclkr_dc,
|
|
mpw1_b => mpw1_dc_b,
|
|
mpw2_b => mpw2_dc_b,
|
|
thold_b => func_sl_thold_0_b,
|
|
sg => sg_0,
|
|
scin => siv(ex3_retsel_offset to ex3_retsel_offset + ex3_retsel_q'length-1),
|
|
scout => sov(ex3_retsel_offset to ex3_retsel_offset + ex3_retsel_q'length-1),
|
|
din => ex2_retsel_q,
|
|
dout => ex3_retsel_q);
|
|
ex4_retsel_latch : tri_rlmreg_p
|
|
generic map (width => ex4_retsel_q'length, init => 0, expand_type => expand_type, needs_sreset => 1)
|
|
port map (nclk => nclk,
|
|
vd => vdd,
|
|
gd => gnd,
|
|
act => tiup,
|
|
forcee => func_sl_force,
|
|
d_mode => d_mode_dc,
|
|
delay_lclkr => delay_lclkr_dc,
|
|
mpw1_b => mpw1_dc_b,
|
|
mpw2_b => mpw2_dc_b,
|
|
thold_b => func_sl_thold_0_b,
|
|
sg => sg_0,
|
|
scin => siv(ex4_retsel_offset to ex4_retsel_offset + ex4_retsel_q'length-1),
|
|
scout => sov(ex4_retsel_offset to ex4_retsel_offset + ex4_retsel_q'length-1),
|
|
din => ex3_retsel_q,
|
|
dout => ex4_retsel_q);
|
|
ex3_mul_done_latch : tri_rlmlatch_p
|
|
generic map (init => 0, expand_type => expand_type, needs_sreset => 1)
|
|
port map (nclk => nclk,
|
|
vd => vdd,
|
|
gd => gnd,
|
|
act => tiup,
|
|
forcee => func_sl_force,
|
|
d_mode => d_mode_dc,
|
|
delay_lclkr => delay_lclkr_dc,
|
|
mpw1_b => mpw1_dc_b,
|
|
mpw2_b => mpw2_dc_b,
|
|
thold_b => func_sl_thold_0_b,
|
|
sg => sg_0,
|
|
scin => siv(ex3_mul_done_offset),
|
|
scout => sov(ex3_mul_done_offset),
|
|
din => ex3_mul_done_d,
|
|
dout => ex3_mul_done_q);
|
|
ex4_mul_done_latch : tri_rlmlatch_p
|
|
generic map (init => 0, expand_type => expand_type, needs_sreset => 1)
|
|
port map (nclk => nclk,
|
|
vd => vdd,
|
|
gd => gnd,
|
|
act => tiup,
|
|
forcee => func_sl_force,
|
|
d_mode => d_mode_dc,
|
|
delay_lclkr => delay_lclkr_dc,
|
|
mpw1_b => mpw1_dc_b,
|
|
mpw2_b => mpw2_dc_b,
|
|
thold_b => func_sl_thold_0_b,
|
|
sg => sg_0,
|
|
scin => siv(ex4_mul_done_offset),
|
|
scout => sov(ex4_mul_done_offset),
|
|
din => ex3_mul_done_q,
|
|
dout => ex4_mul_done_q);
|
|
ex5_mul_done_latch : tri_rlmlatch_p
|
|
generic map (init => 0, expand_type => expand_type, needs_sreset => 1)
|
|
port map (nclk => nclk,
|
|
vd => vdd,
|
|
gd => gnd,
|
|
act => tiup,
|
|
forcee => func_sl_force,
|
|
d_mode => d_mode_dc,
|
|
delay_lclkr => delay_lclkr_dc,
|
|
mpw1_b => mpw1_dc_b,
|
|
mpw2_b => mpw2_dc_b,
|
|
thold_b => func_sl_thold_0_b,
|
|
sg => sg_0,
|
|
scin => siv(ex5_mul_done_offset),
|
|
scout => sov(ex5_mul_done_offset),
|
|
din => ex4_mul_done_q,
|
|
dout => ex5_mul_done_q);
|
|
ex1_is_recform_latch : tri_rlmlatch_p
|
|
generic map (init => 0, expand_type => expand_type, needs_sreset => 1)
|
|
port map (nclk => nclk,
|
|
vd => vdd,
|
|
gd => gnd,
|
|
act => dec_alu_rf1_mul_val,
|
|
forcee => func_sl_force,
|
|
d_mode => d_mode_dc,
|
|
delay_lclkr => delay_lclkr_dc,
|
|
mpw1_b => mpw1_dc_b,
|
|
mpw2_b => mpw2_dc_b,
|
|
thold_b => func_sl_thold_0_b,
|
|
sg => sg_0,
|
|
scin => siv(ex1_is_recform_offset),
|
|
scout => sov(ex1_is_recform_offset),
|
|
din => dec_alu_rf1_mul_recform,
|
|
dout => ex1_is_recform_q);
|
|
ex2_is_recform_latch : tri_rlmlatch_p
|
|
generic map (init => 0, expand_type => expand_type, needs_sreset => 1)
|
|
port map (nclk => nclk,
|
|
vd => vdd,
|
|
gd => gnd,
|
|
act => tiup,
|
|
forcee => func_sl_force,
|
|
d_mode => d_mode_dc,
|
|
delay_lclkr => delay_lclkr_dc,
|
|
mpw1_b => mpw1_dc_b,
|
|
mpw2_b => mpw2_dc_b,
|
|
thold_b => func_sl_thold_0_b,
|
|
sg => sg_0,
|
|
scin => siv(ex2_is_recform_offset),
|
|
scout => sov(ex2_is_recform_offset),
|
|
din => ex1_is_recform_q,
|
|
dout => ex2_is_recform_q);
|
|
ex3_is_recform_latch : tri_rlmlatch_p
|
|
generic map (init => 0, expand_type => expand_type, needs_sreset => 1)
|
|
port map (nclk => nclk,
|
|
vd => vdd,
|
|
gd => gnd,
|
|
act => tiup,
|
|
forcee => func_sl_force,
|
|
d_mode => d_mode_dc,
|
|
delay_lclkr => delay_lclkr_dc,
|
|
mpw1_b => mpw1_dc_b,
|
|
mpw2_b => mpw2_dc_b,
|
|
thold_b => func_sl_thold_0_b,
|
|
sg => sg_0,
|
|
scin => siv(ex3_is_recform_offset),
|
|
scout => sov(ex3_is_recform_offset),
|
|
din => ex2_is_recform_q,
|
|
dout => ex3_is_recform_q);
|
|
ex4_is_recform_latch : tri_rlmlatch_p
|
|
generic map (init => 0, expand_type => expand_type, needs_sreset => 1)
|
|
port map (nclk => nclk,
|
|
vd => vdd,
|
|
gd => gnd,
|
|
act => tiup,
|
|
forcee => func_sl_force,
|
|
d_mode => d_mode_dc,
|
|
delay_lclkr => delay_lclkr_dc,
|
|
mpw1_b => mpw1_dc_b,
|
|
mpw2_b => mpw2_dc_b,
|
|
thold_b => func_sl_thold_0_b,
|
|
sg => sg_0,
|
|
scin => siv(ex4_is_recform_offset),
|
|
scout => sov(ex4_is_recform_offset),
|
|
din => ex3_is_recform_q,
|
|
dout => ex4_is_recform_q);
|
|
ex5_is_recform_latch : tri_rlmlatch_p
|
|
generic map (init => 0, expand_type => expand_type, needs_sreset => 1)
|
|
port map (nclk => nclk,
|
|
vd => vdd,
|
|
gd => gnd,
|
|
act => tiup,
|
|
forcee => func_sl_force,
|
|
d_mode => d_mode_dc,
|
|
delay_lclkr => delay_lclkr_dc,
|
|
mpw1_b => mpw1_dc_b,
|
|
mpw2_b => mpw2_dc_b,
|
|
thold_b => func_sl_thold_0_b,
|
|
sg => sg_0,
|
|
scin => siv(ex5_is_recform_offset),
|
|
scout => sov(ex5_is_recform_offset),
|
|
din => ex4_is_recform_q,
|
|
dout => ex5_is_recform_q);
|
|
ex1_xer_ov_update_latch : tri_rlmlatch_p
|
|
generic map (init => 0, expand_type => expand_type, needs_sreset => 1)
|
|
port map (nclk => nclk,
|
|
vd => vdd,
|
|
gd => gnd,
|
|
act => dec_alu_rf1_mul_val,
|
|
forcee => func_sl_force,
|
|
d_mode => d_mode_dc,
|
|
delay_lclkr => delay_lclkr_dc,
|
|
mpw1_b => mpw1_dc_b,
|
|
mpw2_b => mpw2_dc_b,
|
|
thold_b => func_sl_thold_0_b,
|
|
sg => sg_0,
|
|
scin => siv(ex1_xer_ov_update_offset),
|
|
scout => sov(ex1_xer_ov_update_offset),
|
|
din => dec_alu_rf1_xer_ov_update,
|
|
dout => ex1_xer_ov_update_q);
|
|
ex2_xer_ov_update_latch : tri_rlmlatch_p
|
|
generic map (init => 0, expand_type => expand_type, needs_sreset => 1)
|
|
port map (nclk => nclk,
|
|
vd => vdd,
|
|
gd => gnd,
|
|
act => tiup,
|
|
forcee => func_sl_force,
|
|
d_mode => d_mode_dc,
|
|
delay_lclkr => delay_lclkr_dc,
|
|
mpw1_b => mpw1_dc_b,
|
|
mpw2_b => mpw2_dc_b,
|
|
thold_b => func_sl_thold_0_b,
|
|
sg => sg_0,
|
|
scin => siv(ex2_xer_ov_update_offset),
|
|
scout => sov(ex2_xer_ov_update_offset),
|
|
din => ex1_xer_ov_update_q,
|
|
dout => ex2_xer_ov_update_q);
|
|
ex3_xer_ov_update_latch : tri_rlmlatch_p
|
|
generic map (init => 0, expand_type => expand_type, needs_sreset => 1)
|
|
port map (nclk => nclk,
|
|
vd => vdd,
|
|
gd => gnd,
|
|
act => tiup,
|
|
forcee => func_sl_force,
|
|
d_mode => d_mode_dc,
|
|
delay_lclkr => delay_lclkr_dc,
|
|
mpw1_b => mpw1_dc_b,
|
|
mpw2_b => mpw2_dc_b,
|
|
thold_b => func_sl_thold_0_b,
|
|
sg => sg_0,
|
|
scin => siv(ex3_xer_ov_update_offset),
|
|
scout => sov(ex3_xer_ov_update_offset),
|
|
din => ex2_xer_ov_update_q,
|
|
dout => ex3_xer_ov_update_q);
|
|
ex4_xer_ov_update_latch : tri_rlmlatch_p
|
|
generic map (init => 0, expand_type => expand_type, needs_sreset => 1)
|
|
port map (nclk => nclk,
|
|
vd => vdd,
|
|
gd => gnd,
|
|
act => tiup,
|
|
forcee => func_sl_force,
|
|
d_mode => d_mode_dc,
|
|
delay_lclkr => delay_lclkr_dc,
|
|
mpw1_b => mpw1_dc_b,
|
|
mpw2_b => mpw2_dc_b,
|
|
thold_b => func_sl_thold_0_b,
|
|
sg => sg_0,
|
|
scin => siv(ex4_xer_ov_update_offset),
|
|
scout => sov(ex4_xer_ov_update_offset),
|
|
din => ex3_xer_ov_update_q,
|
|
dout => ex4_xer_ov_update_q);
|
|
ex5_xer_ov_update_latch : tri_rlmlatch_p
|
|
generic map (init => 0, expand_type => expand_type, needs_sreset => 1)
|
|
port map (nclk => nclk,
|
|
vd => vdd,
|
|
gd => gnd,
|
|
act => tiup,
|
|
forcee => func_sl_force,
|
|
d_mode => d_mode_dc,
|
|
delay_lclkr => delay_lclkr_dc,
|
|
mpw1_b => mpw1_dc_b,
|
|
mpw2_b => mpw2_dc_b,
|
|
thold_b => func_sl_thold_0_b,
|
|
sg => sg_0,
|
|
scin => siv(ex5_xer_ov_update_offset),
|
|
scout => sov(ex5_xer_ov_update_offset),
|
|
din => ex4_xer_ov_update_q,
|
|
dout => ex5_xer_ov_update_q);
|
|
ex1_mul_size_latch : tri_rlmlatch_p
|
|
generic map (init => 0, expand_type => expand_type, needs_sreset => 1)
|
|
port map (nclk => nclk,
|
|
vd => vdd,
|
|
gd => gnd,
|
|
act => dec_alu_rf1_mul_val,
|
|
forcee => func_sl_force,
|
|
d_mode => d_mode_dc,
|
|
delay_lclkr => delay_lclkr_dc,
|
|
mpw1_b => mpw1_dc_b,
|
|
mpw2_b => mpw2_dc_b,
|
|
thold_b => func_sl_thold_0_b,
|
|
sg => sg_0,
|
|
scin => siv(ex1_mul_size_offset),
|
|
scout => sov(ex1_mul_size_offset),
|
|
din => dec_alu_rf1_mul_size,
|
|
dout => ex1_mul_size_q);
|
|
ex1_mul_sign_latch : tri_rlmlatch_p
|
|
generic map (init => 0, expand_type => expand_type, needs_sreset => 1)
|
|
port map (nclk => nclk,
|
|
vd => vdd,
|
|
gd => gnd,
|
|
act => dec_alu_rf1_mul_val,
|
|
forcee => func_sl_force,
|
|
d_mode => d_mode_dc,
|
|
delay_lclkr => delay_lclkr_dc,
|
|
mpw1_b => mpw1_dc_b,
|
|
mpw2_b => mpw2_dc_b,
|
|
thold_b => func_sl_thold_0_b,
|
|
sg => sg_0,
|
|
scin => siv(ex1_mul_sign_offset),
|
|
scout => sov(ex1_mul_sign_offset),
|
|
din => dec_alu_rf1_mul_sign,
|
|
dout => ex1_mul_sign_q);
|
|
ex2_bs_lo_sign_latch : tri_rlmlatch_p
|
|
generic map (init => 0, expand_type => expand_type, needs_sreset => 1)
|
|
port map (nclk => nclk,
|
|
vd => vdd,
|
|
gd => gnd,
|
|
act => tiup,
|
|
forcee => func_sl_force,
|
|
d_mode => d_mode_dc,
|
|
delay_lclkr => delay_lclkr_dc,
|
|
mpw1_b => mpw1_dc_b,
|
|
mpw2_b => mpw2_dc_b,
|
|
thold_b => func_sl_thold_0_b,
|
|
sg => sg_0,
|
|
scin => siv(ex2_bs_lo_sign_offset),
|
|
scout => sov(ex2_bs_lo_sign_offset),
|
|
din => ex2_bs_lo_sign_d,
|
|
dout => ex2_bs_lo_sign_q);
|
|
ex2_bd_lo_sign_latch : tri_rlmlatch_p
|
|
generic map (init => 0, expand_type => expand_type, needs_sreset => 1)
|
|
port map (nclk => nclk,
|
|
vd => vdd,
|
|
gd => gnd,
|
|
act => tiup,
|
|
forcee => func_sl_force,
|
|
d_mode => d_mode_dc,
|
|
delay_lclkr => delay_lclkr_dc,
|
|
mpw1_b => mpw1_dc_b,
|
|
mpw2_b => mpw2_dc_b,
|
|
thold_b => func_sl_thold_0_b,
|
|
sg => sg_0,
|
|
scin => siv(ex2_bd_lo_sign_offset),
|
|
scout => sov(ex2_bd_lo_sign_offset),
|
|
din => ex2_bd_lo_sign_d,
|
|
dout => ex2_bd_lo_sign_q);
|
|
ex5_all0_latch : tri_rlmlatch_p
|
|
generic map (init => 0, expand_type => expand_type, needs_sreset => 1)
|
|
port map (nclk => nclk,
|
|
vd => vdd,
|
|
gd => gnd,
|
|
act => tiup,
|
|
forcee => func_sl_force,
|
|
d_mode => d_mode_dc,
|
|
delay_lclkr => delay_lclkr_dc,
|
|
mpw1_b => mpw1_dc_b,
|
|
mpw2_b => mpw2_dc_b,
|
|
thold_b => func_sl_thold_0_b,
|
|
sg => sg_0,
|
|
scin => siv(ex5_all0_offset),
|
|
scout => sov(ex5_all0_offset),
|
|
din => ex4_all0,
|
|
dout => ex5_all0_q);
|
|
ex5_all1_latch : tri_rlmlatch_p
|
|
generic map (init => 0, expand_type => expand_type, needs_sreset => 1)
|
|
port map (nclk => nclk,
|
|
vd => vdd,
|
|
gd => gnd,
|
|
act => tiup,
|
|
forcee => func_sl_force,
|
|
d_mode => d_mode_dc,
|
|
delay_lclkr => delay_lclkr_dc,
|
|
mpw1_b => mpw1_dc_b,
|
|
mpw2_b => mpw2_dc_b,
|
|
thold_b => func_sl_thold_0_b,
|
|
sg => sg_0,
|
|
scin => siv(ex5_all1_offset),
|
|
scout => sov(ex5_all1_offset),
|
|
din => ex4_all1,
|
|
dout => ex5_all1_q);
|
|
ex5_all0_lo_latch : tri_rlmlatch_p
|
|
generic map (init => 0, expand_type => expand_type, needs_sreset => 1)
|
|
port map (nclk => nclk,
|
|
vd => vdd,
|
|
gd => gnd,
|
|
act => tiup,
|
|
forcee => func_sl_force,
|
|
d_mode => d_mode_dc,
|
|
delay_lclkr => delay_lclkr_dc,
|
|
mpw1_b => mpw1_dc_b,
|
|
mpw2_b => mpw2_dc_b,
|
|
thold_b => func_sl_thold_0_b,
|
|
sg => sg_0,
|
|
scin => siv(ex5_all0_lo_offset),
|
|
scout => sov(ex5_all0_lo_offset),
|
|
din => ex4_all0_lo,
|
|
dout => ex5_all0_lo_q);
|
|
ex5_all0_hi_latch : tri_rlmlatch_p
|
|
generic map (init => 0, expand_type => expand_type, needs_sreset => 1)
|
|
port map (nclk => nclk,
|
|
vd => vdd,
|
|
gd => gnd,
|
|
act => tiup,
|
|
forcee => func_sl_force,
|
|
d_mode => d_mode_dc,
|
|
delay_lclkr => delay_lclkr_dc,
|
|
mpw1_b => mpw1_dc_b,
|
|
mpw2_b => mpw2_dc_b,
|
|
thold_b => func_sl_thold_0_b,
|
|
sg => sg_0,
|
|
scin => siv(ex5_all0_hi_offset),
|
|
scout => sov(ex5_all0_hi_offset),
|
|
din => ex4_all0_hi,
|
|
dout => ex5_all0_hi_q);
|
|
ex5_all1_hi_latch : tri_rlmlatch_p
|
|
generic map (init => 0, expand_type => expand_type, needs_sreset => 1)
|
|
port map (nclk => nclk,
|
|
vd => vdd,
|
|
gd => gnd,
|
|
act => tiup,
|
|
forcee => func_sl_force,
|
|
d_mode => d_mode_dc,
|
|
delay_lclkr => delay_lclkr_dc,
|
|
mpw1_b => mpw1_dc_b,
|
|
mpw2_b => mpw2_dc_b,
|
|
thold_b => func_sl_thold_0_b,
|
|
sg => sg_0,
|
|
scin => siv(ex5_all1_hi_offset),
|
|
scout => sov(ex5_all1_hi_offset),
|
|
din => ex4_all1_hi,
|
|
dout => ex5_all1_hi_q);
|
|
ex4_ci_latch : tri_rlmlatch_p
|
|
generic map (init => 0, expand_type => expand_type, needs_sreset => 1)
|
|
port map (nclk => nclk,
|
|
vd => vdd,
|
|
gd => gnd,
|
|
act => tiup,
|
|
forcee => func_sl_force,
|
|
d_mode => d_mode_dc,
|
|
delay_lclkr => delay_lclkr_dc,
|
|
mpw1_b => mpw1_dc_b,
|
|
mpw2_b => mpw2_dc_b,
|
|
thold_b => func_sl_thold_0_b,
|
|
sg => sg_0,
|
|
scin => siv(ex4_ci_offset),
|
|
scout => sov(ex4_ci_offset),
|
|
din => ex4_ci_d,
|
|
dout => ex4_ci_q);
|
|
ex5_res_latch : tri_rlmreg_p
|
|
generic map (width => ex5_res_q'length, init => 0, expand_type => expand_type, needs_sreset => 1)
|
|
port map (nclk => nclk,
|
|
vd => vdd,
|
|
gd => gnd,
|
|
act => ex4_act,
|
|
forcee => func_sl_force,
|
|
d_mode => d_mode_dc,
|
|
delay_lclkr => delay_lclkr_dc,
|
|
mpw1_b => mpw1_dc_b,
|
|
mpw2_b => mpw2_dc_b,
|
|
thold_b => func_sl_thold_0_b,
|
|
sg => sg_0,
|
|
scin => siv(ex5_res_offset to ex5_res_offset + ex5_res_q'length-1),
|
|
scout => sov(ex5_res_offset to ex5_res_offset + ex5_res_q'length-1),
|
|
din => ex4_res,
|
|
dout => ex5_res_q);
|
|
carry_32_dly1_latch : tri_rlmlatch_p
|
|
generic map (init => 0, expand_type => expand_type, needs_sreset => 1)
|
|
port map (nclk => nclk,
|
|
vd => vdd,
|
|
gd => gnd,
|
|
act => tiup,
|
|
forcee => func_sl_force,
|
|
d_mode => d_mode_dc,
|
|
delay_lclkr => delay_lclkr_dc,
|
|
mpw1_b => mpw1_dc_b,
|
|
mpw2_b => mpw2_dc_b,
|
|
thold_b => func_sl_thold_0_b,
|
|
sg => sg_0,
|
|
scin => siv(carry_32_dly1_offset),
|
|
scout => sov(carry_32_dly1_offset),
|
|
din => ex4_cout_32,
|
|
dout => carry_32_dly1_q);
|
|
all0_lo_dly1_latch : tri_rlmlatch_p
|
|
generic map (init => 0, expand_type => expand_type, needs_sreset => 1)
|
|
port map (nclk => nclk,
|
|
vd => vdd,
|
|
gd => gnd,
|
|
act => tiup,
|
|
forcee => func_sl_force,
|
|
d_mode => d_mode_dc,
|
|
delay_lclkr => delay_lclkr_dc,
|
|
mpw1_b => mpw1_dc_b,
|
|
mpw2_b => mpw2_dc_b,
|
|
thold_b => func_sl_thold_0_b,
|
|
sg => sg_0,
|
|
scin => siv(all0_lo_dly1_offset),
|
|
scout => sov(all0_lo_dly1_offset),
|
|
din => ex5_all0_lo_q,
|
|
dout => all0_lo_dly1_q);
|
|
all0_lo_dly2_latch : tri_rlmlatch_p
|
|
generic map (init => 0, expand_type => expand_type, needs_sreset => 1)
|
|
port map (nclk => nclk,
|
|
vd => vdd,
|
|
gd => gnd,
|
|
act => tiup,
|
|
forcee => func_sl_force,
|
|
d_mode => d_mode_dc,
|
|
delay_lclkr => delay_lclkr_dc,
|
|
mpw1_b => mpw1_dc_b,
|
|
mpw2_b => mpw2_dc_b,
|
|
thold_b => func_sl_thold_0_b,
|
|
sg => sg_0,
|
|
scin => siv(all0_lo_dly2_offset),
|
|
scout => sov(all0_lo_dly2_offset),
|
|
din => all0_lo_dly1_q,
|
|
dout => all0_lo_dly2_q);
|
|
all0_lo_dly3_latch : tri_rlmlatch_p
|
|
generic map (init => 0, expand_type => expand_type, needs_sreset => 1)
|
|
port map (nclk => nclk,
|
|
vd => vdd,
|
|
gd => gnd,
|
|
act => tiup,
|
|
forcee => func_sl_force,
|
|
d_mode => d_mode_dc,
|
|
delay_lclkr => delay_lclkr_dc,
|
|
mpw1_b => mpw1_dc_b,
|
|
mpw2_b => mpw2_dc_b,
|
|
thold_b => func_sl_thold_0_b,
|
|
sg => sg_0,
|
|
scin => siv(all0_lo_dly3_offset),
|
|
scout => sov(all0_lo_dly3_offset),
|
|
din => all0_lo_dly2_q,
|
|
dout => all0_lo_dly3_q);
|
|
rslt_lo_latch : tri_rlmreg_p
|
|
generic map (width => rslt_lo_q'length, init => 0, expand_type => expand_type, needs_sreset => 1)
|
|
port map (nclk => nclk,
|
|
vd => vdd,
|
|
gd => gnd,
|
|
act => rslt_lo_act,
|
|
forcee => func_sl_force,
|
|
d_mode => d_mode_dc,
|
|
delay_lclkr => delay_lclkr_dc,
|
|
mpw1_b => mpw1_dc_b,
|
|
mpw2_b => mpw2_dc_b,
|
|
thold_b => func_sl_thold_0_b,
|
|
sg => sg_0,
|
|
scin => siv(rslt_lo_offset to rslt_lo_offset + rslt_lo_q'length-1),
|
|
scout => sov(rslt_lo_offset to rslt_lo_offset + rslt_lo_q'length-1),
|
|
din => rslt_lo_d,
|
|
dout => rslt_lo_q);
|
|
rslt_lo_dly_latch : tri_rlmreg_p
|
|
generic map (width => rslt_lo_dly_q'length, init => 0, expand_type => expand_type, needs_sreset => 1)
|
|
port map (nclk => nclk,
|
|
vd => vdd,
|
|
gd => gnd,
|
|
act => tiup,
|
|
forcee => func_sl_force,
|
|
d_mode => d_mode_dc,
|
|
delay_lclkr => delay_lclkr_dc,
|
|
mpw1_b => mpw1_dc_b,
|
|
mpw2_b => mpw2_dc_b,
|
|
thold_b => func_sl_thold_0_b,
|
|
sg => sg_0,
|
|
scin => siv(rslt_lo_dly_offset to rslt_lo_dly_offset + rslt_lo_dly_q'length-1),
|
|
scout => sov(rslt_lo_dly_offset to rslt_lo_dly_offset + rslt_lo_dly_q'length-1),
|
|
din => rslt_lo_dly_d,
|
|
dout => rslt_lo_dly_q);
|
|
ex2_mulsrc_0_latch : tri_rlmreg_p
|
|
generic map (width => ex2_mulsrc_0_q'length, init => 0, expand_type => expand_type, needs_sreset => 1)
|
|
port map (nclk => nclk, vd => vdd, gd => gnd,
|
|
act => ex1_mulsrc0_act,
|
|
forcee => func_sl_force,
|
|
d_mode => d_mode_dc, delay_lclkr => delay_lclkr_dc,
|
|
mpw1_b => mpw1_dc_b, mpw2_b => mpw2_dc_b,
|
|
thold_b => func_sl_thold_0_b,
|
|
sg => sg_0,
|
|
scin => siv(ex2_mulsrc_0_offset to ex2_mulsrc_0_offset + ex2_mulsrc_0_q'length-1),
|
|
scout => sov(ex2_mulsrc_0_offset to ex2_mulsrc_0_offset + ex2_mulsrc_0_q'length-1),
|
|
din => ex1_mulsrc_0,
|
|
dout => ex2_mulsrc_0_q);
|
|
ex2_mulsrc_1_latch : tri_rlmreg_p
|
|
generic map (width => ex2_mulsrc_1_q'length, init => 0, expand_type => expand_type, needs_sreset => 1)
|
|
port map (nclk => nclk, vd => vdd, gd => gnd,
|
|
act => ex1_mulsrc1_act,
|
|
forcee => func_sl_force,
|
|
d_mode => d_mode_dc, delay_lclkr => delay_lclkr_dc,
|
|
mpw1_b => mpw1_dc_b, mpw2_b => mpw2_dc_b,
|
|
thold_b => func_sl_thold_0_b,
|
|
sg => sg_0,
|
|
scin => siv(ex2_mulsrc_1_offset to ex2_mulsrc_1_offset + ex2_mulsrc_1_q'length-1),
|
|
scout => sov(ex2_mulsrc_1_offset to ex2_mulsrc_1_offset + ex2_mulsrc_1_q'length-1),
|
|
din => ex1_mulsrc_1,
|
|
dout => ex2_mulsrc_1_q);
|
|
ex5_rslt_hw_latch : tri_rlmreg_p
|
|
generic map (width => ex5_rslt_hw_q'length, init => 0, expand_type => expand_type, needs_sreset => 1)
|
|
port map (nclk => nclk, vd => vdd, gd => gnd,
|
|
act => ex4_mul_done_q,
|
|
forcee => func_sl_force,
|
|
d_mode => d_mode_dc, delay_lclkr => delay_lclkr_dc,
|
|
mpw1_b => mpw1_dc_b, mpw2_b => mpw2_dc_b,
|
|
thold_b => func_sl_thold_0_b,
|
|
sg => sg_0,
|
|
scin => siv(ex5_rslt_hw_offset to ex5_rslt_hw_offset + ex5_rslt_hw_q'length-1),
|
|
scout => sov(ex5_rslt_hw_offset to ex5_rslt_hw_offset + ex5_rslt_hw_q'length-1),
|
|
din => ex5_rslt_hw_d,
|
|
dout => ex5_rslt_hw_q);
|
|
ex5_rslt_ld_li_latch : tri_rlmreg_p
|
|
generic map (width => ex5_rslt_ld_li_q'length, init => 0, expand_type => expand_type, needs_sreset => 1)
|
|
port map (nclk => nclk, vd => vdd, gd => gnd,
|
|
act => ex4_mul_done_q,
|
|
forcee => func_sl_force,
|
|
d_mode => d_mode_dc, delay_lclkr => delay_lclkr_dc,
|
|
mpw1_b => mpw1_dc_b, mpw2_b => mpw2_dc_b,
|
|
thold_b => func_sl_thold_0_b,
|
|
sg => sg_0,
|
|
scin => siv(ex5_rslt_ld_li_offset to ex5_rslt_ld_li_offset + ex5_rslt_ld_li_q'length-1),
|
|
scout => sov(ex5_rslt_ld_li_offset to ex5_rslt_ld_li_offset + ex5_rslt_ld_li_q'length-1),
|
|
din => ex5_rslt_ld_li_d,
|
|
dout => ex5_rslt_ld_li_q);
|
|
ex5_rslt_ldo_latch : tri_rlmreg_p
|
|
generic map (width => ex5_rslt_ldo_q'length, init => 0, expand_type => expand_type, needs_sreset => 1)
|
|
port map (nclk => nclk, vd => vdd, gd => gnd,
|
|
act => ex4_mul_done_q,
|
|
forcee => func_sl_force,
|
|
d_mode => d_mode_dc, delay_lclkr => delay_lclkr_dc,
|
|
mpw1_b => mpw1_dc_b, mpw2_b => mpw2_dc_b,
|
|
thold_b => func_sl_thold_0_b,
|
|
sg => sg_0,
|
|
scin => siv(ex5_rslt_ldo_offset to ex5_rslt_ldo_offset + ex5_rslt_ldo_q'length-1),
|
|
scout => sov(ex5_rslt_ldo_offset to ex5_rslt_ldo_offset + ex5_rslt_ldo_q'length-1),
|
|
din => ex5_rslt_ldo_d,
|
|
dout => ex5_rslt_ldo_q);
|
|
ex5_rslt_lw_hd_latch : tri_rlmreg_p
|
|
generic map (width => ex5_rslt_lw_hd_q'length, init => 0, expand_type => expand_type, needs_sreset => 1)
|
|
port map (nclk => nclk, vd => vdd, gd => gnd,
|
|
act => ex4_mul_done_q,
|
|
forcee => func_sl_force,
|
|
d_mode => d_mode_dc, delay_lclkr => delay_lclkr_dc,
|
|
mpw1_b => mpw1_dc_b, mpw2_b => mpw2_dc_b,
|
|
thold_b => func_sl_thold_0_b,
|
|
sg => sg_0,
|
|
scin => siv(ex5_rslt_lw_hd_offset to ex5_rslt_lw_hd_offset + ex5_rslt_lw_hd_q'length-1),
|
|
scout => sov(ex5_rslt_lw_hd_offset to ex5_rslt_lw_hd_offset + ex5_rslt_lw_hd_q'length-1),
|
|
din => ex5_rslt_lw_hd_d,
|
|
dout => ex5_rslt_lw_hd_q);
|
|
ex5_cmp0_sel_reshi_latch : tri_rlmlatch_p
|
|
generic map (init => 0, expand_type => expand_type, needs_sreset => 1)
|
|
port map (nclk => nclk, vd => vdd, gd => gnd,
|
|
act => ex4_mul_done_q,
|
|
forcee => func_sl_force,
|
|
d_mode => d_mode_dc, delay_lclkr => delay_lclkr_dc,
|
|
mpw1_b => mpw1_dc_b, mpw2_b => mpw2_dc_b,
|
|
thold_b => func_sl_thold_0_b,
|
|
sg => sg_0,
|
|
scin => siv(ex5_cmp0_sel_reshi_offset),
|
|
scout => sov(ex5_cmp0_sel_reshi_offset),
|
|
din => ex5_cmp0_sel_reshi_d,
|
|
dout => ex5_cmp0_sel_reshi_q);
|
|
ex5_cmp0_sel_reslo_latch : tri_rlmlatch_p
|
|
generic map (init => 0, expand_type => expand_type, needs_sreset => 1)
|
|
port map (nclk => nclk, vd => vdd, gd => gnd,
|
|
act => ex4_mul_done_q,
|
|
forcee => func_sl_force,
|
|
d_mode => d_mode_dc, delay_lclkr => delay_lclkr_dc,
|
|
mpw1_b => mpw1_dc_b, mpw2_b => mpw2_dc_b,
|
|
thold_b => func_sl_thold_0_b,
|
|
sg => sg_0,
|
|
scin => siv(ex5_cmp0_sel_reslo_offset),
|
|
scout => sov(ex5_cmp0_sel_reslo_offset),
|
|
din => ex5_cmp0_sel_reslo_d,
|
|
dout => ex5_cmp0_sel_reslo_q);
|
|
ex5_cmp0_sel_reslodly_latch : tri_rlmlatch_p
|
|
generic map (init => 0, expand_type => expand_type, needs_sreset => 1)
|
|
port map (nclk => nclk, vd => vdd, gd => gnd,
|
|
act => ex4_mul_done_q,
|
|
forcee => func_sl_force,
|
|
d_mode => d_mode_dc, delay_lclkr => delay_lclkr_dc,
|
|
mpw1_b => mpw1_dc_b, mpw2_b => mpw2_dc_b,
|
|
thold_b => func_sl_thold_0_b,
|
|
sg => sg_0,
|
|
scin => siv(ex5_cmp0_sel_reslodly_offset),
|
|
scout => sov(ex5_cmp0_sel_reslodly_offset),
|
|
din => ex5_cmp0_sel_reslodly_d,
|
|
dout => ex5_cmp0_sel_reslodly_q);
|
|
ex5_cmp0_sel_reslodly2_latch : tri_rlmlatch_p
|
|
generic map (init => 0, expand_type => expand_type, needs_sreset => 1)
|
|
port map (nclk => nclk, vd => vdd, gd => gnd,
|
|
act => ex4_mul_done_q,
|
|
forcee => func_sl_force,
|
|
d_mode => d_mode_dc, delay_lclkr => delay_lclkr_dc,
|
|
mpw1_b => mpw1_dc_b, mpw2_b => mpw2_dc_b,
|
|
thold_b => func_sl_thold_0_b,
|
|
sg => sg_0,
|
|
scin => siv(ex5_cmp0_sel_reslodly2_offset),
|
|
scout => sov(ex5_cmp0_sel_reslodly2_offset),
|
|
din => ex5_cmp0_sel_reslodly2_d,
|
|
dout => ex5_cmp0_sel_reslodly2_q);
|
|
ex5_eq_sel_all0_b_latch : tri_rlmlatch_p
|
|
generic map (init => 0, expand_type => expand_type, needs_sreset => 1)
|
|
port map (nclk => nclk, vd => vdd, gd => gnd,
|
|
act => ex4_mul_done_q,
|
|
forcee => func_sl_force,
|
|
d_mode => d_mode_dc, delay_lclkr => delay_lclkr_dc,
|
|
mpw1_b => mpw1_dc_b, mpw2_b => mpw2_dc_b,
|
|
thold_b => func_sl_thold_0_b,
|
|
sg => sg_0,
|
|
scin => siv(ex5_eq_sel_all0_b_offset),
|
|
scout => sov(ex5_eq_sel_all0_b_offset),
|
|
din => ex5_eq_sel_all0_b_d,
|
|
dout => ex5_eq_sel_all0_b_q);
|
|
ex5_eq_sel_all0_lo_b_latch : tri_rlmlatch_p
|
|
generic map (init => 0, expand_type => expand_type, needs_sreset => 1)
|
|
port map (nclk => nclk, vd => vdd, gd => gnd,
|
|
act => ex4_mul_done_q,
|
|
forcee => func_sl_force,
|
|
d_mode => d_mode_dc, delay_lclkr => delay_lclkr_dc,
|
|
mpw1_b => mpw1_dc_b, mpw2_b => mpw2_dc_b,
|
|
thold_b => func_sl_thold_0_b,
|
|
sg => sg_0,
|
|
scin => siv(ex5_eq_sel_all0_lo_b_offset),
|
|
scout => sov(ex5_eq_sel_all0_lo_b_offset),
|
|
din => ex5_eq_sel_all0_lo_b_d,
|
|
dout => ex5_eq_sel_all0_lo_b_q);
|
|
ex5_eq_sel_all0_hi_b_latch : tri_rlmlatch_p
|
|
generic map (init => 0, expand_type => expand_type, needs_sreset => 1)
|
|
port map (nclk => nclk, vd => vdd, gd => gnd,
|
|
act => ex4_mul_done_q,
|
|
forcee => func_sl_force,
|
|
d_mode => d_mode_dc, delay_lclkr => delay_lclkr_dc,
|
|
mpw1_b => mpw1_dc_b, mpw2_b => mpw2_dc_b,
|
|
thold_b => func_sl_thold_0_b,
|
|
sg => sg_0,
|
|
scin => siv(ex5_eq_sel_all0_hi_b_offset),
|
|
scout => sov(ex5_eq_sel_all0_hi_b_offset),
|
|
din => ex5_eq_sel_all0_hi_b_d,
|
|
dout => ex5_eq_sel_all0_hi_b_q);
|
|
ex5_eq_sel_all0_lo1_b_latch : tri_rlmlatch_p
|
|
generic map (init => 0, expand_type => expand_type, needs_sreset => 1)
|
|
port map (nclk => nclk, vd => vdd, gd => gnd,
|
|
act => ex4_mul_done_q,
|
|
forcee => func_sl_force,
|
|
d_mode => d_mode_dc, delay_lclkr => delay_lclkr_dc,
|
|
mpw1_b => mpw1_dc_b, mpw2_b => mpw2_dc_b,
|
|
thold_b => func_sl_thold_0_b,
|
|
sg => sg_0,
|
|
scin => siv(ex5_eq_sel_all0_lo1_b_offset),
|
|
scout => sov(ex5_eq_sel_all0_lo1_b_offset),
|
|
din => ex5_eq_sel_all0_lo1_b_d,
|
|
dout => ex5_eq_sel_all0_lo1_b_q);
|
|
ex5_eq_sel_all0_lo2_b_latch : tri_rlmlatch_p
|
|
generic map (init => 0, expand_type => expand_type, needs_sreset => 1)
|
|
port map (nclk => nclk, vd => vdd, gd => gnd,
|
|
act => ex4_mul_done_q,
|
|
forcee => func_sl_force,
|
|
d_mode => d_mode_dc, delay_lclkr => delay_lclkr_dc,
|
|
mpw1_b => mpw1_dc_b, mpw2_b => mpw2_dc_b,
|
|
thold_b => func_sl_thold_0_b,
|
|
sg => sg_0,
|
|
scin => siv(ex5_eq_sel_all0_lo2_b_offset),
|
|
scout => sov(ex5_eq_sel_all0_lo2_b_offset),
|
|
din => ex5_eq_sel_all0_lo2_b_d,
|
|
dout => ex5_eq_sel_all0_lo2_b_q);
|
|
ex5_eq_sel_all0_lo3_b_latch : tri_rlmlatch_p
|
|
generic map (init => 0, expand_type => expand_type, needs_sreset => 1)
|
|
port map (nclk => nclk, vd => vdd, gd => gnd,
|
|
act => ex4_mul_done_q,
|
|
forcee => func_sl_force,
|
|
d_mode => d_mode_dc, delay_lclkr => delay_lclkr_dc,
|
|
mpw1_b => mpw1_dc_b, mpw2_b => mpw2_dc_b,
|
|
thold_b => func_sl_thold_0_b,
|
|
sg => sg_0,
|
|
scin => siv(ex5_eq_sel_all0_lo3_b_offset),
|
|
scout => sov(ex5_eq_sel_all0_lo3_b_offset),
|
|
din => ex5_eq_sel_all0_lo3_b_d,
|
|
dout => ex5_eq_sel_all0_lo3_b_q);
|
|
ex5_ret_mullw_latch : tri_rlmlatch_p
|
|
generic map (init => 0, expand_type => expand_type, needs_sreset => 1)
|
|
port map (nclk => nclk, vd => vdd, gd => gnd,
|
|
act => ex4_mul_done_q,
|
|
forcee => func_sl_force,
|
|
d_mode => d_mode_dc, delay_lclkr => delay_lclkr_dc,
|
|
mpw1_b => mpw1_dc_b, mpw2_b => mpw2_dc_b,
|
|
thold_b => func_sl_thold_0_b,
|
|
sg => sg_0,
|
|
scin => siv(ex5_ret_mullw_offset),
|
|
scout => sov(ex5_ret_mullw_offset),
|
|
din => ex4_ret_mullw,
|
|
dout => ex5_ret_mullw_q);
|
|
ex5_ret_mulldo_latch : tri_rlmlatch_p
|
|
generic map (init => 0, expand_type => expand_type, needs_sreset => 1)
|
|
port map (nclk => nclk, vd => vdd, gd => gnd,
|
|
act => ex4_mul_done_q,
|
|
forcee => func_sl_force,
|
|
d_mode => d_mode_dc, delay_lclkr => delay_lclkr_dc,
|
|
mpw1_b => mpw1_dc_b, mpw2_b => mpw2_dc_b,
|
|
thold_b => func_sl_thold_0_b,
|
|
sg => sg_0,
|
|
scin => siv(ex5_ret_mulldo_offset),
|
|
scout => sov(ex5_ret_mulldo_offset),
|
|
din => ex4_ret_mulldo,
|
|
dout => ex5_ret_mulldo_q);
|
|
ex5_cmp0_undef_latch : tri_rlmlatch_p
|
|
generic map (init => 0, expand_type => expand_type, needs_sreset => 1)
|
|
port map (nclk => nclk, vd => vdd, gd => gnd,
|
|
act => ex4_mul_done_q,
|
|
forcee => func_sl_force,
|
|
d_mode => d_mode_dc, delay_lclkr => delay_lclkr_dc,
|
|
mpw1_b => mpw1_dc_b, mpw2_b => mpw2_dc_b,
|
|
thold_b => func_sl_thold_0_b,
|
|
sg => sg_0,
|
|
scin => siv(ex5_cmp0_undef_offset),
|
|
scout => sov(ex5_cmp0_undef_offset),
|
|
din => ex5_cmp0_undef_d,
|
|
dout => ex5_cmp0_undef_q);
|
|
|
|
siv(0 to siv'right) <= sov(1 to siv'right) & scan_in;
|
|
scan_out <= sov(0);
|
|
|
|
end architecture xuq_alu_mult;
|