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.
		
		
		
		
		
			
		
			
				
	
	
		
			1079 lines
		
	
	
		
			39 KiB
		
	
	
	
		
			Verilog
		
	
			
		
		
	
	
			1079 lines
		
	
	
		
			39 KiB
		
	
	
	
		
			Verilog
		
	
// © 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. 
 | 
						|
 | 
						|
`timescale 1 ns / 1 ns
 | 
						|
 | 
						|
   `include "tri_a2o.vh"
 | 
						|
 | 
						|
module fu_alg(
 | 
						|
   vdd,
 | 
						|
   gnd,
 | 
						|
   clkoff_b,
 | 
						|
   act_dis,
 | 
						|
   flush,
 | 
						|
   delay_lclkr,
 | 
						|
   mpw1_b,
 | 
						|
   mpw2_b,
 | 
						|
   sg_1,
 | 
						|
   thold_1,
 | 
						|
   fpu_enable,
 | 
						|
   nclk,
 | 
						|
   f_alg_si,
 | 
						|
   f_alg_so,
 | 
						|
   ex1_act,
 | 
						|
   ex2_act,
 | 
						|
   f_byp_alg_ex2_b_expo,
 | 
						|
   f_byp_alg_ex2_a_expo,
 | 
						|
   f_byp_alg_ex2_c_expo,
 | 
						|
   f_byp_alg_ex2_b_frac,
 | 
						|
   f_byp_alg_ex2_b_sign,
 | 
						|
   f_fmt_ex2_prod_zero,
 | 
						|
   f_fmt_ex2_b_zero,
 | 
						|
   f_fmt_ex2_pass_sel,
 | 
						|
   f_fmt_ex3_pass_frac,
 | 
						|
   f_dcd_ex1_sp,
 | 
						|
   f_dcd_ex1_from_integer_b,
 | 
						|
   f_dcd_ex1_to_integer_b,
 | 
						|
   f_dcd_ex1_word_b,
 | 
						|
   f_dcd_ex1_uns_b,
 | 
						|
   f_pic_ex2_rnd_to_int,
 | 
						|
   f_pic_ex2_frsp_ue1,
 | 
						|
   f_pic_ex2_effsub_raw,
 | 
						|
   f_pic_ex2_sh_unf_ig_b,
 | 
						|
   f_pic_ex2_sh_unf_do,
 | 
						|
   f_pic_ex2_sh_ovf_ig_b,
 | 
						|
   f_pic_ex2_sh_ovf_do,
 | 
						|
   f_pic_ex3_rnd_nr,
 | 
						|
   f_pic_ex3_rnd_inf_ok,
 | 
						|
   f_alg_ex2_sign_frmw,
 | 
						|
   f_alg_ex3_byp_nonflip,
 | 
						|
   f_alg_ex3_res,
 | 
						|
   f_alg_ex3_sel_byp,
 | 
						|
   f_alg_ex3_effsub_eac_b,
 | 
						|
   f_alg_ex3_prod_z,
 | 
						|
   f_alg_ex3_sh_unf,
 | 
						|
   f_alg_ex3_sh_ovf,
 | 
						|
   f_alg_ex4_frc_sel_p1,
 | 
						|
   f_alg_ex4_sticky,
 | 
						|
   f_alg_ex4_int_fr,
 | 
						|
   f_alg_ex4_int_fi
 | 
						|
);
 | 
						|
//   parameter      expand_type = 2;		// 0 - ibm tech, 1 - other );
 | 
						|
   inout          vdd;
 | 
						|
   inout          gnd;
 | 
						|
   input          clkoff_b;		// tiup
 | 
						|
   input          act_dis;		// ??tidn??
 | 
						|
   input          flush;		// ??tidn??
 | 
						|
   input [1:3]    delay_lclkr;		// tidn,
 | 
						|
   input [1:3]    mpw1_b;		// tidn,
 | 
						|
   input [0:0]    mpw2_b;		// tidn,
 | 
						|
   input          sg_1;
 | 
						|
   input          thold_1;
 | 
						|
   input          fpu_enable;		//dc_act
 | 
						|
   input          [0:`NCLK_WIDTH-1] nclk;
 | 
						|
 | 
						|
   input          f_alg_si;		//perv
 | 
						|
   output         f_alg_so;		//perv
 | 
						|
   input          ex1_act;		//act
 | 
						|
   input          ex2_act;		//act
 | 
						|
 | 
						|
   input [1:13]   f_byp_alg_ex2_b_expo;
 | 
						|
   input [1:13]   f_byp_alg_ex2_a_expo;
 | 
						|
   input [1:13]   f_byp_alg_ex2_c_expo;
 | 
						|
   input [0:52]   f_byp_alg_ex2_b_frac;
 | 
						|
   input          f_byp_alg_ex2_b_sign;
 | 
						|
 | 
						|
   input          f_fmt_ex2_prod_zero;		// valid and Zero (Madd/Mul)
 | 
						|
   input          f_fmt_ex2_b_zero;		// valid and zero (could be denorm, so zero out B)
 | 
						|
   input          f_fmt_ex2_pass_sel;
 | 
						|
   input [0:52]   f_fmt_ex3_pass_frac;
 | 
						|
 | 
						|
   input          f_dcd_ex1_sp;
 | 
						|
   input          f_dcd_ex1_from_integer_b;		// K, spec, round
 | 
						|
   input          f_dcd_ex1_to_integer_b;		// K, spec, round
 | 
						|
   input          f_dcd_ex1_word_b;
 | 
						|
   input          f_dcd_ex1_uns_b;
 | 
						|
 | 
						|
   input          f_pic_ex2_rnd_to_int;
 | 
						|
   input          f_pic_ex2_frsp_ue1;		// K, spec, round
 | 
						|
   input          f_pic_ex2_effsub_raw;		//
 | 
						|
   input          f_pic_ex2_sh_unf_ig_b;		// fcfid
 | 
						|
   input          f_pic_ex2_sh_unf_do;		// (do not know why want this)
 | 
						|
   input          f_pic_ex2_sh_ovf_ig_b;		// fcfid
 | 
						|
   input          f_pic_ex2_sh_ovf_do;		// fsel, fpscr, fmr,
 | 
						|
   input          f_pic_ex3_rnd_nr;		//
 | 
						|
   input          f_pic_ex3_rnd_inf_ok;		// pi/pos, ni/neg
 | 
						|
 | 
						|
   output         f_alg_ex2_sign_frmw;		// sign bit for from_integer_word_signed
 | 
						|
   output         f_alg_ex3_byp_nonflip;
 | 
						|
   output [0:162] f_alg_ex3_res;		//sad3/add
 | 
						|
   output         f_alg_ex3_sel_byp;		// all eac selects off
 | 
						|
   output         f_alg_ex3_effsub_eac_b;		// includes cancelations
 | 
						|
   output         f_alg_ex3_prod_z;
 | 
						|
   output         f_alg_ex3_sh_unf;		// f_pic
 | 
						|
   output         f_alg_ex3_sh_ovf;		// f_pic
 | 
						|
   output         f_alg_ex4_frc_sel_p1;		// rounding converts
 | 
						|
   output         f_alg_ex4_sticky;		// part of eac control
 | 
						|
   output         f_alg_ex4_int_fr;		// f_pic
 | 
						|
   output         f_alg_ex4_int_fi;		// f_pic
 | 
						|
 | 
						|
 | 
						|
   parameter      tiup = 1'b1;
 | 
						|
   parameter      tidn = 1'b0;
 | 
						|
 | 
						|
   wire           thold_0_b;
 | 
						|
   wire           thold_0;
 | 
						|
   wire           force_t;
 | 
						|
   wire           sg_0;
 | 
						|
 | 
						|
   wire           ex3_act;
 | 
						|
 | 
						|
   (* analysis_not_referenced="TRUE" *) // unused
 | 
						|
   wire [0:3]     spare_unused;
 | 
						|
   //--------------------------------------
 | 
						|
   wire [0:4]     act_so;		//SCAN
 | 
						|
   wire [0:4]     act_si;		//SCAN
 | 
						|
   wire [0:4]     ex2_ctl_so;		//SCAN
 | 
						|
   wire [0:4]     ex2_ctl_si;		//SCAN
 | 
						|
   wire [0:67]    ex3_shd_so;		//SCAN
 | 
						|
   wire [0:67]    ex3_shd_si;
 | 
						|
   wire [0:24]    ex3_shc_so;		//SCAN
 | 
						|
   wire [0:24]    ex3_shc_si;
 | 
						|
   wire [0:14]    ex3_ctl_so;		//SCAN
 | 
						|
   wire [0:14]    ex3_ctl_si;		//SCAN
 | 
						|
   wire [0:10]    ex4_ctl_so;		//SCAN
 | 
						|
   wire [0:10]    ex4_ctl_si;		//SCAN
 | 
						|
   //--------------------------------------
 | 
						|
   wire           ex2_from_integer;
 | 
						|
   wire           ex3_from_integer;
 | 
						|
   wire           ex2_to_integer;
 | 
						|
   wire           ex2_sel_special;
 | 
						|
   wire           ex2_sel_special_b;
 | 
						|
   wire           ex3_sel_special_b;
 | 
						|
   wire           ex2_sh_ovf;
 | 
						|
   wire           ex2_sh_unf_x;
 | 
						|
   wire           ex3_sh_unf_x;
 | 
						|
   wire           ex2_sel_byp_nonflip;
 | 
						|
   wire           ex2_sel_byp_nonflip_lze;
 | 
						|
   wire           ex2_from_integer_neg;
 | 
						|
   wire           ex2_integer_op;
 | 
						|
   wire           ex2_to_integer_neg;
 | 
						|
   wire           ex2_negate;
 | 
						|
   wire           ex2_effsub_alg;
 | 
						|
   wire           ex3_sh_unf;
 | 
						|
   wire           ex3_sel_byp;
 | 
						|
   wire           ex3_effsub_alg;
 | 
						|
   wire           ex3_prd_sel_pos_hi;
 | 
						|
   wire           ex3_prd_sel_neg_hi;
 | 
						|
   wire           ex3_prd_sel_pos_lo;
 | 
						|
   wire           ex3_prd_sel_neg_lo;
 | 
						|
   wire           ex3_prd_sel_pos_lohi;
 | 
						|
   wire           ex3_prd_sel_neg_lohi;
 | 
						|
   wire           ex3_byp_sel_pos;
 | 
						|
   wire           ex3_byp_sel_neg;
 | 
						|
   wire           ex3_byp_sel_byp_pos;
 | 
						|
   wire           ex3_byp_sel_byp_neg;
 | 
						|
   wire           ex3_b_sign;
 | 
						|
   wire           ex3_to_integer;
 | 
						|
   wire [0:67]    ex2_sh_lvl2;
 | 
						|
   wire [0:67]    ex3_sh_lvl2;
 | 
						|
   wire [0:67]    ex3_sh_lvl2_b;
 | 
						|
   wire [6:9]     ex3_bsha;
 | 
						|
   wire [0:4]     ex3_sticky_en16_x;
 | 
						|
   wire           ex3_xthrm_6_ns_b;
 | 
						|
   wire           ex3_xthrm_7_ns_b;
 | 
						|
   wire           ex3_xthrm_8_b;
 | 
						|
   wire           ex3_xthrm_8a9_b;
 | 
						|
   wire           ex3_xthrm_8o9_b;
 | 
						|
   wire           ex3_xthrm7o8a9;
 | 
						|
   wire           ex3_xthrm7o8;
 | 
						|
   wire           ex3_xthrm7o8o9;
 | 
						|
   wire           ex3_xthrm7a8a9;
 | 
						|
   wire           ex3_xthrm_6_ns;
 | 
						|
   wire           ex3_ge176_b;
 | 
						|
   wire           ex3_ge160_b;
 | 
						|
   wire           ex3_ge144_b;
 | 
						|
   wire           ex3_ge128_b;
 | 
						|
   wire           ex3_ge112_b;
 | 
						|
   wire           ex2_bsha_6;
 | 
						|
   wire           ex2_bsha_7;
 | 
						|
   wire           ex2_bsha_8;
 | 
						|
   wire           ex2_bsha_9;
 | 
						|
   wire           ex3_bsha_pos;
 | 
						|
   wire [0:162]   ex3_sh_lvl3;
 | 
						|
   wire [0:4]     ex3_sticky_or16;
 | 
						|
   wire           ex2_b_zero;
 | 
						|
   wire           ex3_b_zero;
 | 
						|
   wire           ex3_b_zero_b;
 | 
						|
 | 
						|
   wire           ex2_dp;
 | 
						|
 | 
						|
   wire           ex3_byp_nonflip_lze;
 | 
						|
   wire           ex3_sel_byp_nonflip;
 | 
						|
   wire           ex3_prod_zero;
 | 
						|
   wire           ex3_sh_ovf_en;
 | 
						|
   wire           ex3_sh_unf_en;
 | 
						|
   wire           ex3_sh_unf_do;
 | 
						|
   wire           ex3_sh_ovf;
 | 
						|
   wire           ex3_integer_op;
 | 
						|
   wire           ex3_negate;
 | 
						|
   wire           ex3_unf_bz;
 | 
						|
   wire           ex3_all1_x;
 | 
						|
   wire           ex3_ovf_pz;
 | 
						|
   wire           ex3_all1_y;
 | 
						|
   wire           ex3_sel_special;
 | 
						|
   wire           ex1_from_integer;
 | 
						|
   wire           ex1_to_integer;
 | 
						|
   wire           ex1_dp;
 | 
						|
   wire           ex1_uns;
 | 
						|
   wire           ex1_word;
 | 
						|
   wire           ex2_uns;
 | 
						|
   wire           ex2_word;
 | 
						|
   wire           ex2_word_from;
 | 
						|
   wire           ex3_word_from;
 | 
						|
   wire           ex3_rnd_to_int;
 | 
						|
   wire           ex2_sign_from;
 | 
						|
   wire [0:52]    ex2_b_frac;
 | 
						|
   wire [1:13]    ex2_b_expo;
 | 
						|
   wire           ex2_b_sign;
 | 
						|
   wire           ex2_bsha_neg;
 | 
						|
   wire           ex3_bsha_neg;
 | 
						|
 | 
						|
   wire           ex2_lvl1_shdcd000_b;
 | 
						|
   wire           ex2_lvl1_shdcd001_b;
 | 
						|
   wire           ex2_lvl1_shdcd002_b;
 | 
						|
   wire           ex2_lvl1_shdcd003_b;
 | 
						|
   wire           ex2_lvl2_shdcd000;
 | 
						|
   wire           ex2_lvl2_shdcd004;
 | 
						|
   wire           ex2_lvl2_shdcd008;
 | 
						|
   wire           ex2_lvl2_shdcd012;
 | 
						|
   wire           ex2_lvl3_shdcd000;
 | 
						|
   wire           ex2_lvl3_shdcd016;
 | 
						|
   wire           ex2_lvl3_shdcd032;
 | 
						|
   wire           ex2_lvl3_shdcd048;
 | 
						|
   wire           ex2_lvl3_shdcd064;
 | 
						|
   wire           ex2_lvl3_shdcd080;
 | 
						|
   wire           ex2_lvl3_shdcd096;
 | 
						|
   wire           ex2_lvl3_shdcd112;
 | 
						|
   wire           ex2_lvl3_shdcd128;
 | 
						|
   wire           ex2_lvl3_shdcd144;
 | 
						|
   wire           ex2_lvl3_shdcd160;
 | 
						|
   wire           ex2_lvl3_shdcd176;
 | 
						|
   wire           ex2_lvl3_shdcd192;		// -64
 | 
						|
   wire           ex2_lvl3_shdcd208;		// -48
 | 
						|
   wire           ex2_lvl3_shdcd224;		// -32
 | 
						|
   wire           ex2_lvl3_shdcd240;		// -16
 | 
						|
 | 
						|
   wire           ex3_lvl3_shdcd000;
 | 
						|
   wire           ex3_lvl3_shdcd016;
 | 
						|
   wire           ex3_lvl3_shdcd032;
 | 
						|
   wire           ex3_lvl3_shdcd048;
 | 
						|
   wire           ex3_lvl3_shdcd064;
 | 
						|
   wire           ex3_lvl3_shdcd080;
 | 
						|
   wire           ex3_lvl3_shdcd096;
 | 
						|
   wire           ex3_lvl3_shdcd112;
 | 
						|
   wire           ex3_lvl3_shdcd128;
 | 
						|
   wire           ex3_lvl3_shdcd144;
 | 
						|
   wire           ex3_lvl3_shdcd160;
 | 
						|
   wire           ex3_lvl3_shdcd176;
 | 
						|
   wire           ex3_lvl3_shdcd192;
 | 
						|
   wire           ex3_lvl3_shdcd208;
 | 
						|
   wire           ex3_lvl3_shdcd224;
 | 
						|
   wire           ex3_lvl3_shdcd240;
 | 
						|
 | 
						|
   wire           ex4_int_fr_nr1_b;
 | 
						|
   wire           ex4_int_fr_nr2_b;
 | 
						|
   wire           ex4_int_fr_ok_b;
 | 
						|
   wire           ex4_int_fr;
 | 
						|
   wire           ex4_sel_p1_0_b;
 | 
						|
   wire           ex4_sel_p1_1_b;
 | 
						|
   wire           ex4_sticky_math;
 | 
						|
   wire           ex4_sticky_toint;
 | 
						|
   wire           ex4_sticky_toint_nr;
 | 
						|
   wire           ex4_sticky_toint_ok;
 | 
						|
   wire           ex4_frmneg_o_toneg;
 | 
						|
   wire           ex4_frmneg_o_topos;
 | 
						|
   wire           ex4_lsb_toint_nr;
 | 
						|
   wire           ex4_g_math;
 | 
						|
   wire           ex4_g_toint;
 | 
						|
   wire           ex4_g_toint_nr;
 | 
						|
   wire           ex4_g_toint_ok;
 | 
						|
   wire           ex3_frmneg;
 | 
						|
   wire           ex3_toneg;
 | 
						|
   wire           ex3_topos;
 | 
						|
   wire           ex3_frmneg_o_toneg;
 | 
						|
   wire           ex3_frmneg_o_topos;
 | 
						|
   wire           ex3_toint_gate_x;
 | 
						|
   wire           ex3_toint_gate_g;
 | 
						|
   wire           ex3_toint_gt_nr_x;
 | 
						|
   wire           ex3_toint_gt_nr_g;
 | 
						|
   wire           ex3_toint_gt_ok_x;
 | 
						|
   wire           ex3_toint_gt_ok_g;
 | 
						|
   wire           ex3_math_gate_x;
 | 
						|
   wire           ex3_math_gate_g;
 | 
						|
   wire           ex3_sticky_eac_x;
 | 
						|
   wire           ex3_sticky_math;
 | 
						|
   wire           ex3_sticky_toint;
 | 
						|
   wire           ex3_sticky_toint_nr;
 | 
						|
   wire           ex3_sticky_toint_ok;
 | 
						|
   wire           ex3_lsb_toint_nr;
 | 
						|
   wire           ex3_g_math;
 | 
						|
   wire           ex3_g_toint;
 | 
						|
   wire           ex3_g_toint_nr;
 | 
						|
   wire           ex3_g_toint_ok;
 | 
						|
   wire           ex3_sh16_162;
 | 
						|
   wire           ex3_sh16_163;
 | 
						|
   wire           alg_ex3_d1clk;
 | 
						|
   wire           alg_ex3_d2clk;
 | 
						|
 | 
						|
   wire [0:`NCLK_WIDTH-1]          alg_ex3_lclk;
 | 
						|
 | 
						|
   wire [6:9]     ex3_bsha_b;
 | 
						|
   wire           ex3_bsha_neg_b;
 | 
						|
   wire           ex3_sh_ovf_b;
 | 
						|
   wire           ex3_sh_unf_x_b;
 | 
						|
   wire           ex3_lvl3_shdcd000_b;
 | 
						|
   wire           ex3_lvl3_shdcd016_b;
 | 
						|
   wire           ex3_lvl3_shdcd032_b;
 | 
						|
   wire           ex3_lvl3_shdcd048_b;
 | 
						|
   wire           ex3_lvl3_shdcd064_b;
 | 
						|
   wire           ex3_lvl3_shdcd080_b;
 | 
						|
   wire           ex3_lvl3_shdcd096_b;
 | 
						|
   wire           ex3_lvl3_shdcd112_b;
 | 
						|
   wire           ex3_lvl3_shdcd128_b;
 | 
						|
   wire           ex3_lvl3_shdcd144_b;
 | 
						|
   wire           ex3_lvl3_shdcd160_b;
 | 
						|
   wire           ex3_lvl3_shdcd176_b;
 | 
						|
   wire           ex3_lvl3_shdcd192_b;
 | 
						|
   wire           ex3_lvl3_shdcd208_b;
 | 
						|
   wire           ex3_lvl3_shdcd224_b;
 | 
						|
   wire           ex3_lvl3_shdcd240_b;
 | 
						|
   wire           ex3_b_zero_l2_b;
 | 
						|
   wire           ex3_prod_zero_b;
 | 
						|
   wire           ex3_byp_nonflip_lze_b;
 | 
						|
   wire           ex3_sel_byp_nonflip_b;
 | 
						|
   wire           ex3_sh_unf_do_b;
 | 
						|
   wire           ex3_sh_unf_en_b;
 | 
						|
   wire           ex3_sh_ovf_en_b;
 | 
						|
   wire           ex3_effsub_alg_b;
 | 
						|
   wire           ex3_negate_b;
 | 
						|
   wire           ex3_b_sign_b;
 | 
						|
   wire           ex3_to_integer_b;
 | 
						|
   wire           ex3_from_integer_b;
 | 
						|
   wire           ex3_rnd_to_int_b;
 | 
						|
   wire           ex3_integer_op_b;
 | 
						|
   wire           ex3_word_from_b;
 | 
						|
   (* analysis_not_referenced="TRUE" *) // unused
 | 
						|
   wire           unused;
 | 
						|
 | 
						|
   //==##############################################################
 | 
						|
   //# map block attributes
 | 
						|
   //==##############################################################
 | 
						|
 | 
						|
   assign unused = ex2_b_expo[1] | ex2_b_expo[2] | ex2_dp | ex3_lvl3_shdcd176;		//latch output
 | 
						|
   // latch output
 | 
						|
 | 
						|
   assign ex2_b_frac[0:52] = f_byp_alg_ex2_b_frac[0:52];		//RENAME
 | 
						|
   assign ex2_b_sign = f_byp_alg_ex2_b_sign;		//RENAME
 | 
						|
   assign ex2_b_expo[1:13] = f_byp_alg_ex2_b_expo[1:13];		//RENAME
 | 
						|
 | 
						|
   //==##############################################################
 | 
						|
   //# pervasive
 | 
						|
   //==##############################################################
 | 
						|
 | 
						|
 | 
						|
   tri_plat  thold_reg_0(
 | 
						|
      .vd(vdd),
 | 
						|
      .gd(gnd),
 | 
						|
      .nclk(nclk),
 | 
						|
      .flush(flush),
 | 
						|
      .din(thold_1),
 | 
						|
      .q(thold_0)
 | 
						|
   );
 | 
						|
 | 
						|
 | 
						|
   tri_plat  sg_reg_0(
 | 
						|
      .vd(vdd),
 | 
						|
      .gd(gnd),
 | 
						|
      .nclk(nclk),
 | 
						|
      .flush(flush),
 | 
						|
      .din(sg_1),
 | 
						|
      .q(sg_0)
 | 
						|
   );
 | 
						|
 | 
						|
 | 
						|
   tri_lcbor  lcbor_0(
 | 
						|
      .clkoff_b(clkoff_b),
 | 
						|
      .thold(thold_0),
 | 
						|
      .sg(sg_0),
 | 
						|
      .act_dis(act_dis),
 | 
						|
      .force_t(force_t),
 | 
						|
      .thold_b(thold_0_b)
 | 
						|
   );
 | 
						|
 | 
						|
   //==##############################################################
 | 
						|
   //# act
 | 
						|
   //==##############################################################
 | 
						|
 | 
						|
 | 
						|
 | 
						|
   tri_rlmreg_p #(.WIDTH(5),  .NEEDS_SRESET(0)) act_lat(
 | 
						|
      .vd(vdd),
 | 
						|
      .gd(gnd),
 | 
						|
      .force_t(force_t),		//i-- tidn,
 | 
						|
      .d_mode(tiup), //d_mode           => d_mode       ,--i-- tiup,
 | 
						|
      .delay_lclkr(delay_lclkr[2]),		//i-- tidn,
 | 
						|
      .mpw1_b(mpw1_b[2]),		//i-- tidn,
 | 
						|
      .mpw2_b(mpw2_b[0]),		//i-- tidn,
 | 
						|
      .nclk(nclk),
 | 
						|
      .act(fpu_enable),
 | 
						|
      .thold_b(thold_0_b),
 | 
						|
      .sg(sg_0),
 | 
						|
      .scout(act_so),
 | 
						|
      .scin(act_si),
 | 
						|
      //-----------------
 | 
						|
      .din({  spare_unused[0],
 | 
						|
              spare_unused[1],
 | 
						|
              ex2_act,
 | 
						|
              spare_unused[2],
 | 
						|
              spare_unused[3]}),
 | 
						|
      //-----------------
 | 
						|
      .dout({ spare_unused[0],
 | 
						|
              spare_unused[1],
 | 
						|
              ex3_act,
 | 
						|
              spare_unused[2],
 | 
						|
              spare_unused[3]})
 | 
						|
   );
 | 
						|
 | 
						|
 | 
						|
   tri_lcbnd  alg_ex3_lcb(
 | 
						|
      .delay_lclkr(delay_lclkr[2]),		// tidn ,--in
 | 
						|
      .mpw1_b(mpw1_b[2]),		// tidn ,--in
 | 
						|
      .mpw2_b(mpw2_b[0]),		// tidn ,--in
 | 
						|
      .force_t(force_t),		// tidn ,--in
 | 
						|
      .nclk(nclk),		//in
 | 
						|
      .vd(vdd),		//inout
 | 
						|
      .gd(gnd),		//inout
 | 
						|
      .act(ex2_act),		//in
 | 
						|
      .sg(sg_0),		//in
 | 
						|
      .thold_b(thold_0_b),		//in
 | 
						|
      .d1clk(alg_ex3_d1clk),		//out
 | 
						|
      .d2clk(alg_ex3_d2clk),		//out
 | 
						|
      .lclk(alg_ex3_lclk)		//out
 | 
						|
   );
 | 
						|
 | 
						|
   //==##############################################################
 | 
						|
   //# ex1 logic
 | 
						|
   //==##############################################################
 | 
						|
 | 
						|
   //#-------------------------------------------------------------
 | 
						|
   //# shift amount calculation :start with exponent difference
 | 
						|
   //#-------------------------------------------------------------
 | 
						|
 | 
						|
   //==##############################################################
 | 
						|
   //# ex2 latches (from ex1 logic)
 | 
						|
   //==##############################################################
 | 
						|
 | 
						|
   assign ex1_from_integer = (~f_dcd_ex1_from_integer_b);
 | 
						|
   assign ex1_to_integer = (~f_dcd_ex1_to_integer_b);
 | 
						|
   assign ex1_dp = (~f_dcd_ex1_sp);
 | 
						|
   assign ex1_word = (~f_dcd_ex1_word_b);
 | 
						|
   assign ex1_uns = (~f_dcd_ex1_uns_b);
 | 
						|
 | 
						|
 | 
						|
   tri_rlmreg_p #(.WIDTH(5),  .NEEDS_SRESET(0)) ex2_ctl_lat(
 | 
						|
      .force_t(force_t),		//tidn,
 | 
						|
      .d_mode(tiup), //d_mode           => d_mode       ,--tiup,
 | 
						|
      .delay_lclkr(delay_lclkr[1]),		//tidn,
 | 
						|
      .mpw1_b(mpw1_b[1]),		//tidn,
 | 
						|
      .mpw2_b(mpw2_b[0]),		//tidn,
 | 
						|
      .vd(vdd),
 | 
						|
      .gd(gnd),
 | 
						|
      .nclk(nclk),
 | 
						|
      .thold_b(thold_0_b),
 | 
						|
      .sg(sg_0),
 | 
						|
      .act(ex1_act),
 | 
						|
      .scout(ex2_ctl_so),
 | 
						|
      .scin(ex2_ctl_si),
 | 
						|
      //---------------
 | 
						|
      .din({ ex1_from_integer,
 | 
						|
             ex1_to_integer,
 | 
						|
             ex1_dp,
 | 
						|
             ex1_word,
 | 
						|
             ex1_uns}),
 | 
						|
      //---------------
 | 
						|
      .dout({ex2_from_integer,
 | 
						|
             ex2_to_integer,
 | 
						|
             ex2_dp,
 | 
						|
             ex2_word,
 | 
						|
             ex2_uns})
 | 
						|
   );
 | 
						|
 | 
						|
   //==##############################################################
 | 
						|
   //# ex2 logic
 | 
						|
   //==##############################################################
 | 
						|
 | 
						|
 | 
						|
   fu_alg_add  sha(
 | 
						|
      .vdd(vdd),
 | 
						|
      .gnd(gnd),
 | 
						|
      .f_byp_alg_ex2_b_expo(f_byp_alg_ex2_b_expo),		//i--
 | 
						|
      .f_byp_alg_ex2_a_expo(f_byp_alg_ex2_a_expo),		//i--
 | 
						|
      .f_byp_alg_ex2_c_expo(f_byp_alg_ex2_c_expo),		//i--
 | 
						|
      .ex2_sel_special_b(ex2_sel_special_b),		//i--
 | 
						|
      .ex2_bsha_6_o(ex2_bsha_6),		//o--
 | 
						|
      .ex2_bsha_7_o(ex2_bsha_7),		//o--
 | 
						|
      .ex2_bsha_8_o(ex2_bsha_8),		//o--
 | 
						|
      .ex2_bsha_9_o(ex2_bsha_9),		//o--
 | 
						|
      .ex2_bsha_neg_o(ex2_bsha_neg),		//o--
 | 
						|
      .ex2_sh_ovf(ex2_sh_ovf),		//o--
 | 
						|
      .ex2_sh_unf_x(ex2_sh_unf_x),		//o--
 | 
						|
      .ex2_lvl1_shdcd000_b(ex2_lvl1_shdcd000_b),		//o--
 | 
						|
      .ex2_lvl1_shdcd001_b(ex2_lvl1_shdcd001_b),		//o--
 | 
						|
      .ex2_lvl1_shdcd002_b(ex2_lvl1_shdcd002_b),		//o--
 | 
						|
      .ex2_lvl1_shdcd003_b(ex2_lvl1_shdcd003_b),		//o--
 | 
						|
      .ex2_lvl2_shdcd000(ex2_lvl2_shdcd000),		//o--
 | 
						|
      .ex2_lvl2_shdcd004(ex2_lvl2_shdcd004),		//o--
 | 
						|
      .ex2_lvl2_shdcd008(ex2_lvl2_shdcd008),		//o--
 | 
						|
      .ex2_lvl2_shdcd012(ex2_lvl2_shdcd012),		//o--
 | 
						|
      .ex2_lvl3_shdcd000(ex2_lvl3_shdcd000),		//o--
 | 
						|
      .ex2_lvl3_shdcd016(ex2_lvl3_shdcd016),		//o--
 | 
						|
      .ex2_lvl3_shdcd032(ex2_lvl3_shdcd032),		//o--
 | 
						|
      .ex2_lvl3_shdcd048(ex2_lvl3_shdcd048),		//o--
 | 
						|
      .ex2_lvl3_shdcd064(ex2_lvl3_shdcd064),		//o--
 | 
						|
      .ex2_lvl3_shdcd080(ex2_lvl3_shdcd080),		//o--
 | 
						|
      .ex2_lvl3_shdcd096(ex2_lvl3_shdcd096),		//o--
 | 
						|
      .ex2_lvl3_shdcd112(ex2_lvl3_shdcd112),		//o--
 | 
						|
      .ex2_lvl3_shdcd128(ex2_lvl3_shdcd128),		//o--
 | 
						|
      .ex2_lvl3_shdcd144(ex2_lvl3_shdcd144),		//o--
 | 
						|
      .ex2_lvl3_shdcd160(ex2_lvl3_shdcd160),		//o--
 | 
						|
      .ex2_lvl3_shdcd176(ex2_lvl3_shdcd176),		//o--
 | 
						|
      .ex2_lvl3_shdcd192(ex2_lvl3_shdcd192),		//o--
 | 
						|
      .ex2_lvl3_shdcd208(ex2_lvl3_shdcd208),		//o--
 | 
						|
      .ex2_lvl3_shdcd224(ex2_lvl3_shdcd224),		//o--
 | 
						|
      .ex2_lvl3_shdcd240(ex2_lvl3_shdcd240)		//o--
 | 
						|
   );
 | 
						|
 | 
						|
   assign ex2_sel_special = ex2_from_integer;
 | 
						|
   assign ex2_sel_special_b = (~ex2_from_integer);
 | 
						|
 | 
						|
   //#-------------------------------------------------
 | 
						|
   //# determine bypass selects, operand flip
 | 
						|
   //#-------------------------------------------------
 | 
						|
 | 
						|
   ////----------------------------------
 | 
						|
   //// ex2
 | 
						|
   ////----------------------------------
 | 
						|
 | 
						|
   // nan pass
 | 
						|
   assign ex2_sel_byp_nonflip_lze = (f_fmt_ex2_pass_sel) | (f_pic_ex2_sh_ovf_do);		// fsel, fpscr, fmr,
 | 
						|
 | 
						|
   // <<<< move all this stuff to ex3
 | 
						|
   assign ex2_sel_byp_nonflip = (f_pic_ex2_frsp_ue1) | (f_fmt_ex2_pass_sel) | (f_pic_ex2_sh_ovf_do);		// nan pass
 | 
						|
   // fsel, fpscr, fmr,
 | 
						|
 | 
						|
   assign ex2_integer_op = ex2_from_integer | (ex2_to_integer & (~f_pic_ex2_rnd_to_int));
 | 
						|
 | 
						|
   // the negate for from_integer should only catch the last 64 bits (because it is not sign extended)
 | 
						|
 | 
						|
   assign f_alg_ex2_sign_frmw = ex2_b_frac[21];		// output (for sign logic)
 | 
						|
 | 
						|
   assign ex2_sign_from = (ex2_from_integer & ex2_word & ex2_b_frac[21]) | (ex2_from_integer & (~ex2_word) & ex2_b_sign);		// 32 from left 52 - 31 = 21
 | 
						|
 | 
						|
   assign ex2_from_integer_neg = ex2_from_integer & ex2_sign_from & (~ex2_uns);
 | 
						|
 | 
						|
   assign ex2_word_from = ex2_word & ex2_from_integer;
 | 
						|
 | 
						|
   assign ex2_to_integer_neg = ex2_to_integer & ex2_b_sign & (~f_pic_ex2_rnd_to_int);
 | 
						|
 | 
						|
   assign ex2_negate = f_pic_ex2_effsub_raw | ex2_from_integer_neg | ex2_to_integer_neg;		// subtract op
 | 
						|
 | 
						|
   assign ex2_effsub_alg = f_pic_ex2_effsub_raw & (~f_fmt_ex2_pass_sel);
 | 
						|
 | 
						|
   assign ex2_b_zero = f_fmt_ex2_b_zero;
 | 
						|
 | 
						|
   // for sh_unf/b_zero effadd: alg_res = 00...00 (turn off all    selects)
 | 
						|
   // for sh_unf/b_zero effsub: alg_res = 11...11 (turn on  pos/neg selects)
 | 
						|
   //
 | 
						|
   //                           0:52  53:54   55:98   99:163
 | 
						|
   // to_int                      0     0       0     ssssss
 | 
						|
   // from_int                    0     0       0     ssssss
 | 
						|
   // bypass{nan,fmr}             d     0       ?     ??????
 | 
						|
   // sh_ov
 | 
						|
   // sh_unf
 | 
						|
   // effadd
 | 
						|
   // effsub
 | 
						|
 | 
						|
   //#---------------------------------------------------------------
 | 
						|
   //# first 2 levels of shifting (1) 0/1/2/3  (2) 0/4/8/12
 | 
						|
   //#---------------------------------------------------------------
 | 
						|
 | 
						|
 | 
						|
   fu_alg_sh4  sh4(
 | 
						|
      .ex2_lvl1_shdcd000_b(ex2_lvl1_shdcd000_b),		//i--
 | 
						|
      .ex2_lvl1_shdcd001_b(ex2_lvl1_shdcd001_b),		//i--
 | 
						|
      .ex2_lvl1_shdcd002_b(ex2_lvl1_shdcd002_b),		//i--
 | 
						|
      .ex2_lvl1_shdcd003_b(ex2_lvl1_shdcd003_b),		//i--
 | 
						|
      .ex2_lvl2_shdcd000(ex2_lvl2_shdcd000),		//i--
 | 
						|
      .ex2_lvl2_shdcd004(ex2_lvl2_shdcd004),		//i--
 | 
						|
      .ex2_lvl2_shdcd008(ex2_lvl2_shdcd008),		//i--
 | 
						|
      .ex2_lvl2_shdcd012(ex2_lvl2_shdcd012),		//i--
 | 
						|
      .ex2_sel_special(ex2_sel_special),		//i--
 | 
						|
      .ex2_b_sign(ex2_b_sign),		//i--
 | 
						|
      .ex2_b_expo(ex2_b_expo[3:13]),		//i--
 | 
						|
      .ex2_b_frac(ex2_b_frac[0:52]),		//i--
 | 
						|
      .ex2_sh_lvl2(ex2_sh_lvl2[0:67])		//o--
 | 
						|
   );
 | 
						|
 | 
						|
   //==##############################################################
 | 
						|
   //# ex3 latches  (from ex2 logic)
 | 
						|
   //==##############################################################
 | 
						|
 | 
						|
 | 
						|
   tri_inv_nlats #(.WIDTH(68),   .NEEDS_SRESET(0)) ex3_shd_lat(
 | 
						|
      .vd(vdd),
 | 
						|
      .gd(gnd),
 | 
						|
      .lclk(alg_ex3_lclk),		// lclk.clk
 | 
						|
      .d1clk(alg_ex3_d1clk),
 | 
						|
      .d2clk(alg_ex3_d2clk),
 | 
						|
      .scanin(ex3_shd_si),
 | 
						|
      .scanout(ex3_shd_so),
 | 
						|
      .d(ex2_sh_lvl2[0:67]),
 | 
						|
      .qb(ex3_sh_lvl2_b[0:67])
 | 
						|
   );
 | 
						|
 | 
						|
   assign ex3_sh_lvl2[0:67] = (~ex3_sh_lvl2_b[0:67]);
 | 
						|
 | 
						|
 | 
						|
   tri_inv_nlats #(.WIDTH(25),  .NEEDS_SRESET(0)) ex3_shc_lat(
 | 
						|
      .vd(vdd),
 | 
						|
      .gd(gnd),
 | 
						|
      .lclk(alg_ex3_lclk),		// lclk.clk
 | 
						|
      .d1clk(alg_ex3_d1clk),
 | 
						|
      .d2clk(alg_ex3_d2clk),
 | 
						|
      .scanin(ex3_shc_si),
 | 
						|
      .scanout(ex3_shc_so),
 | 
						|
      //-----------------
 | 
						|
      .d({ ex2_bsha_neg,
 | 
						|
           ex2_sh_ovf,
 | 
						|
           ex2_sh_unf_x,
 | 
						|
           ex2_sel_special,
 | 
						|
           ex2_sel_special_b,
 | 
						|
           ex2_bsha_6,
 | 
						|
           ex2_bsha_7,
 | 
						|
           ex2_bsha_8,
 | 
						|
           ex2_bsha_9,
 | 
						|
           ex2_lvl3_shdcd000,
 | 
						|
           ex2_lvl3_shdcd016,
 | 
						|
           ex2_lvl3_shdcd032,
 | 
						|
           ex2_lvl3_shdcd048,
 | 
						|
           ex2_lvl3_shdcd064,
 | 
						|
           ex2_lvl3_shdcd080,
 | 
						|
           ex2_lvl3_shdcd096,
 | 
						|
           ex2_lvl3_shdcd112,
 | 
						|
           ex2_lvl3_shdcd128,
 | 
						|
           ex2_lvl3_shdcd144,
 | 
						|
           ex2_lvl3_shdcd160,
 | 
						|
           ex2_lvl3_shdcd176,
 | 
						|
           ex2_lvl3_shdcd192,
 | 
						|
           ex2_lvl3_shdcd208,
 | 
						|
           ex2_lvl3_shdcd224,
 | 
						|
           ex2_lvl3_shdcd240}),
 | 
						|
      //--------------------
 | 
						|
      .qb({ex3_bsha_neg_b,
 | 
						|
           ex3_sh_ovf_b,
 | 
						|
           ex3_sh_unf_x_b,
 | 
						|
           ex3_sel_special_b,
 | 
						|
           ex3_sel_special,
 | 
						|
           ex3_bsha_b[6],
 | 
						|
           ex3_bsha_b[7],
 | 
						|
           ex3_bsha_b[8],
 | 
						|
           ex3_bsha_b[9],
 | 
						|
           ex3_lvl3_shdcd000_b,
 | 
						|
           ex3_lvl3_shdcd016_b,
 | 
						|
           ex3_lvl3_shdcd032_b,
 | 
						|
           ex3_lvl3_shdcd048_b,
 | 
						|
           ex3_lvl3_shdcd064_b,
 | 
						|
           ex3_lvl3_shdcd080_b,
 | 
						|
           ex3_lvl3_shdcd096_b,
 | 
						|
           ex3_lvl3_shdcd112_b,
 | 
						|
           ex3_lvl3_shdcd128_b,
 | 
						|
           ex3_lvl3_shdcd144_b,
 | 
						|
           ex3_lvl3_shdcd160_b,
 | 
						|
           ex3_lvl3_shdcd176_b,
 | 
						|
           ex3_lvl3_shdcd192_b,
 | 
						|
           ex3_lvl3_shdcd208_b,
 | 
						|
           ex3_lvl3_shdcd224_b,
 | 
						|
           ex3_lvl3_shdcd240_b})
 | 
						|
   );
 | 
						|
 | 
						|
   assign ex3_bsha_neg = (~ex3_bsha_neg_b);
 | 
						|
   assign ex3_sh_ovf = (~ex3_sh_ovf_b);
 | 
						|
   assign ex3_sh_unf_x = (~ex3_sh_unf_x_b);
 | 
						|
   assign ex3_bsha[6] = (~ex3_bsha_b[6]);
 | 
						|
   assign ex3_bsha[7] = (~ex3_bsha_b[7]);
 | 
						|
   assign ex3_bsha[8] = (~ex3_bsha_b[8]);
 | 
						|
   assign ex3_bsha[9] = (~ex3_bsha_b[9]);
 | 
						|
   assign ex3_lvl3_shdcd000 = (~ex3_lvl3_shdcd000_b);
 | 
						|
   assign ex3_lvl3_shdcd016 = (~ex3_lvl3_shdcd016_b);
 | 
						|
   assign ex3_lvl3_shdcd032 = (~ex3_lvl3_shdcd032_b);
 | 
						|
   assign ex3_lvl3_shdcd048 = (~ex3_lvl3_shdcd048_b);
 | 
						|
   assign ex3_lvl3_shdcd064 = (~ex3_lvl3_shdcd064_b);
 | 
						|
   assign ex3_lvl3_shdcd080 = (~ex3_lvl3_shdcd080_b);
 | 
						|
   assign ex3_lvl3_shdcd096 = (~ex3_lvl3_shdcd096_b);
 | 
						|
   assign ex3_lvl3_shdcd112 = (~ex3_lvl3_shdcd112_b);
 | 
						|
   assign ex3_lvl3_shdcd128 = (~ex3_lvl3_shdcd128_b);
 | 
						|
   assign ex3_lvl3_shdcd144 = (~ex3_lvl3_shdcd144_b);
 | 
						|
   assign ex3_lvl3_shdcd160 = (~ex3_lvl3_shdcd160_b);
 | 
						|
   assign ex3_lvl3_shdcd176 = (~ex3_lvl3_shdcd176_b);
 | 
						|
   assign ex3_lvl3_shdcd192 = (~ex3_lvl3_shdcd192_b);
 | 
						|
   assign ex3_lvl3_shdcd208 = (~ex3_lvl3_shdcd208_b);
 | 
						|
   assign ex3_lvl3_shdcd224 = (~ex3_lvl3_shdcd224_b);
 | 
						|
   assign ex3_lvl3_shdcd240 = (~ex3_lvl3_shdcd240_b);
 | 
						|
 | 
						|
 | 
						|
   tri_inv_nlats #(.WIDTH(15),  .NEEDS_SRESET(0)) ex3_ctl_lat(
 | 
						|
      .vd(vdd),
 | 
						|
      .gd(gnd),
 | 
						|
      .lclk(alg_ex3_lclk),		// lclk.clk
 | 
						|
      .d1clk(alg_ex3_d1clk),
 | 
						|
      .d2clk(alg_ex3_d2clk),
 | 
						|
      .scanin(ex3_ctl_si),
 | 
						|
      .scanout(ex3_ctl_so),
 | 
						|
      //-----------------
 | 
						|
      .d({  ex2_b_zero,
 | 
						|
            f_fmt_ex2_prod_zero,
 | 
						|
            ex2_sel_byp_nonflip_lze,
 | 
						|
            ex2_sel_byp_nonflip,
 | 
						|
            f_pic_ex2_sh_unf_do,
 | 
						|
            f_pic_ex2_sh_unf_ig_b,
 | 
						|
            f_pic_ex2_sh_ovf_ig_b,
 | 
						|
            ex2_effsub_alg,
 | 
						|
            ex2_negate,
 | 
						|
            ex2_b_sign,
 | 
						|
            ex2_to_integer,
 | 
						|
            ex2_from_integer,
 | 
						|
            f_pic_ex2_rnd_to_int,
 | 
						|
            ex2_integer_op,
 | 
						|
            ex2_word_from}),
 | 
						|
      //-----------------
 | 
						|
      .qb({ ex3_b_zero_l2_b,
 | 
						|
            ex3_prod_zero_b,
 | 
						|
            ex3_byp_nonflip_lze_b,
 | 
						|
            ex3_sel_byp_nonflip_b,
 | 
						|
            ex3_sh_unf_do_b,
 | 
						|
            ex3_sh_unf_en_b,
 | 
						|
            ex3_sh_ovf_en_b,
 | 
						|
            ex3_effsub_alg_b,
 | 
						|
            ex3_negate_b,
 | 
						|
            ex3_b_sign_b,
 | 
						|
            ex3_to_integer_b,
 | 
						|
            ex3_from_integer_b,
 | 
						|
            ex3_rnd_to_int_b,
 | 
						|
            ex3_integer_op_b,
 | 
						|
            ex3_word_from_b})
 | 
						|
   );
 | 
						|
 | 
						|
   assign ex3_b_zero = (~ex3_b_zero_l2_b);
 | 
						|
   assign ex3_prod_zero = (~ex3_prod_zero_b);
 | 
						|
   assign ex3_byp_nonflip_lze = (~ex3_byp_nonflip_lze_b);
 | 
						|
   assign ex3_sel_byp_nonflip = (~ex3_sel_byp_nonflip_b);
 | 
						|
   assign ex3_sh_unf_do = (~ex3_sh_unf_do_b);
 | 
						|
   assign ex3_sh_unf_en = (~ex3_sh_unf_en_b);
 | 
						|
   assign ex3_sh_ovf_en = (~ex3_sh_ovf_en_b);
 | 
						|
   assign ex3_effsub_alg = (~ex3_effsub_alg_b);
 | 
						|
   assign ex3_negate = (~ex3_negate_b);
 | 
						|
   assign ex3_b_sign = (~ex3_b_sign_b);
 | 
						|
   assign ex3_to_integer = (~ex3_to_integer_b);
 | 
						|
   assign ex3_from_integer = (~ex3_from_integer_b);
 | 
						|
   assign ex3_rnd_to_int = (~ex3_rnd_to_int_b);
 | 
						|
   assign ex3_integer_op = (~ex3_integer_op_b);
 | 
						|
   assign ex3_word_from = (~ex3_word_from_b);
 | 
						|
 | 
						|
   //$$  sticky enable for 16 bit groups ------------------------
 | 
						|
   //$$
 | 
						|
   //$$ ex2_sticky_en16_x(0) <=
 | 
						|
   //$$            (ex2_lvl3_shdcd176              ) or -- == 176
 | 
						|
   //$$            (ex2_bsha( 6) and  ex2_bsha( 7) ) or -- >= 176
 | 
						|
   //$$            (ex2_bsha( 6) and  ex2_bsha( 8) and  ex2_bsha( 9) ) ;  -- >= 176
 | 
						|
   //$$ ex2_sticky_en16_x(1) <= ex2_sticky_en16_x(0) or  ex2_lvl3_shdcd160_x ;
 | 
						|
   //$$ ex2_sticky_en16_x(2) <= ex2_sticky_en16_x(1) or  ex2_lvl3_shdcd144_x ;
 | 
						|
   //$$ ex2_sticky_en16_x(3) <= ex2_sticky_en16_x(2) or  ex2_lvl3_shdcd128_x ;
 | 
						|
   //$$ ex2_sticky_en16_x(4) <= ex2_sticky_en16_x(3) or  ex2_lvl3_shdcd112_x ;
 | 
						|
 | 
						|
   //------------------------------
 | 
						|
   // Sticky Bit Thermometer
 | 
						|
   //------------------------------
 | 
						|
   //    bhsa(6789)
 | 
						|
   // 176     1011   GE_176:  6 * (7 | (8*9) )
 | 
						|
   // 160     1010   GE_160:  6 * (7 | (8)   )
 | 
						|
   // 144     1001   GE_144   6 * (7 | (8|9) )
 | 
						|
   // 128     1000   GE_128:  6
 | 
						|
   // 112     0111   GE_112:  6 | (7 * (8*9) )
 | 
						|
 | 
						|
   assign ex3_xthrm_6_ns_b = (~(ex3_bsha[6] & ex3_sel_special_b));
 | 
						|
   assign ex3_xthrm_7_ns_b = (~(ex3_bsha[7] & ex3_sel_special_b));
 | 
						|
   assign ex3_xthrm_8_b = (~(ex3_bsha[8]));
 | 
						|
   assign ex3_xthrm_8a9_b = (~(ex3_bsha[8] & ex3_bsha[9]));
 | 
						|
   assign ex3_xthrm_8o9_b = (~(ex3_bsha[8] | ex3_bsha[9]));
 | 
						|
 | 
						|
   assign ex3_xthrm7o8a9 = (~(ex3_xthrm_7_ns_b & ex3_xthrm_8a9_b));
 | 
						|
   assign ex3_xthrm7o8 = (~(ex3_xthrm_7_ns_b & ex3_xthrm_8_b));
 | 
						|
   assign ex3_xthrm7o8o9 = (~(ex3_xthrm_7_ns_b & ex3_xthrm_8o9_b));
 | 
						|
   assign ex3_xthrm7a8a9 = (~(ex3_xthrm_7_ns_b | ex3_xthrm_8a9_b));
 | 
						|
   assign ex3_xthrm_6_ns = (~(ex3_xthrm_6_ns_b));
 | 
						|
 | 
						|
   assign ex3_ge176_b = (~(ex3_xthrm_6_ns & ex3_xthrm7o8a9));
 | 
						|
   assign ex3_ge160_b = (~(ex3_xthrm_6_ns & ex3_xthrm7o8));
 | 
						|
   assign ex3_ge144_b = (~(ex3_xthrm_6_ns & ex3_xthrm7o8o9));
 | 
						|
   assign ex3_ge128_b = (~(ex3_xthrm_6_ns));
 | 
						|
   assign ex3_ge112_b = (~(ex3_xthrm_6_ns | ex3_xthrm7a8a9));
 | 
						|
 | 
						|
   assign ex3_sticky_en16_x[0] = (~ex3_ge176_b);
 | 
						|
   assign ex3_sticky_en16_x[1] = (~ex3_ge160_b);
 | 
						|
   assign ex3_sticky_en16_x[2] = (~ex3_ge144_b);
 | 
						|
   assign ex3_sticky_en16_x[3] = (~ex3_ge128_b);
 | 
						|
   assign ex3_sticky_en16_x[4] = (~ex3_ge112_b);
 | 
						|
 | 
						|
   assign ex3_b_zero_b = (~ex3_b_zero);
 | 
						|
 | 
						|
   assign f_alg_ex3_byp_nonflip = ex3_byp_nonflip_lze;
 | 
						|
   assign f_alg_ex3_sel_byp = ex3_sel_byp;		//output-- all eac selects off
 | 
						|
   assign f_alg_ex3_effsub_eac_b = (~ex3_effsub_alg);		//output-- includes cancelations
 | 
						|
   assign f_alg_ex3_prod_z = ex3_prod_zero;		//output
 | 
						|
   assign f_alg_ex3_sh_unf = ex3_sh_unf;		//output--f_pic--
 | 
						|
   assign f_alg_ex3_sh_ovf = ex3_ovf_pz;		//output--f_pic--
 | 
						|
 | 
						|
   //==##############################################################
 | 
						|
   //# ex3 logic
 | 
						|
   //==##############################################################
 | 
						|
 | 
						|
   //#-------------------------------------------------
 | 
						|
   //# start sticky (passed 163 ... passed 162 for math, but need guard for fcti rounding)
 | 
						|
   //#-------------------------------------------------
 | 
						|
 | 
						|
 | 
						|
   fu_alg_or16  or16(
 | 
						|
      .ex3_sh_lvl2(ex3_sh_lvl2[0:67]),		//i--
 | 
						|
      .ex3_sticky_or16(ex3_sticky_or16[0:4])		//o--
 | 
						|
   );
 | 
						|
 | 
						|
   //#-------------------------------------------------
 | 
						|
   //# finish shifting
 | 
						|
   //#-------------------------------------------------
 | 
						|
   // this looks more like a 53:1 mux than a shifter to shrink it, and lower load on selects
 | 
						|
   // real implementation should be nand/nand/nor ... ?? integrate nor into latch ??
 | 
						|
 | 
						|
 | 
						|
   fu_alg_sh16  sh16(
 | 
						|
      .ex3_lvl3_shdcd000(ex3_lvl3_shdcd000),		//i--
 | 
						|
      .ex3_lvl3_shdcd016(ex3_lvl3_shdcd016),		//i--
 | 
						|
      .ex3_lvl3_shdcd032(ex3_lvl3_shdcd032),		//i--
 | 
						|
      .ex3_lvl3_shdcd048(ex3_lvl3_shdcd048),		//i--
 | 
						|
      .ex3_lvl3_shdcd064(ex3_lvl3_shdcd064),		//i--
 | 
						|
      .ex3_lvl3_shdcd080(ex3_lvl3_shdcd080),		//i--
 | 
						|
      .ex3_lvl3_shdcd096(ex3_lvl3_shdcd096),		//i--
 | 
						|
      .ex3_lvl3_shdcd112(ex3_lvl3_shdcd112),		//i--
 | 
						|
      .ex3_lvl3_shdcd128(ex3_lvl3_shdcd128),		//i--
 | 
						|
      .ex3_lvl3_shdcd144(ex3_lvl3_shdcd144),		//i--
 | 
						|
      .ex3_lvl3_shdcd160(ex3_lvl3_shdcd160),		//i--
 | 
						|
      .ex3_lvl3_shdcd192(ex3_lvl3_shdcd192),		//i--
 | 
						|
      .ex3_lvl3_shdcd208(ex3_lvl3_shdcd208),		//i--
 | 
						|
      .ex3_lvl3_shdcd224(ex3_lvl3_shdcd224),		//i--
 | 
						|
      .ex3_lvl3_shdcd240(ex3_lvl3_shdcd240),		//i--
 | 
						|
      .ex3_sel_special(ex3_sel_special),		//i--
 | 
						|
      .ex3_sh_lvl2(ex3_sh_lvl2[0:67]),		//i-- [0:63] is also data for from integer
 | 
						|
      .ex3_sh16_162(ex3_sh16_162),		//o--
 | 
						|
      .ex3_sh16_163(ex3_sh16_163),		//o--
 | 
						|
      .ex3_sh_lvl3(ex3_sh_lvl3[0:162])		//o--
 | 
						|
   );
 | 
						|
 | 
						|
   //==---------------------------------------------
 | 
						|
   //== finish bypass controls
 | 
						|
   //==----------------------------------------------
 | 
						|
 | 
						|
   assign ex3_ovf_pz = ex3_prod_zero | (ex3_sh_ovf & ex3_sh_ovf_en & (~ex3_b_zero));
 | 
						|
   assign ex3_sel_byp = ex3_sel_byp_nonflip | ex3_ovf_pz;
 | 
						|
   assign ex3_all1_y = ex3_negate & ex3_ovf_pz;
 | 
						|
   assign ex3_all1_x = ex3_negate & ex3_unf_bz;
 | 
						|
   assign ex3_sh_unf = ex3_sh_unf_do | (ex3_sh_unf_en & ex3_sh_unf_x & (~ex3_prod_zero));
 | 
						|
   assign ex3_unf_bz = ex3_b_zero | ex3_sh_unf;
 | 
						|
 | 
						|
   assign ex3_byp_sel_byp_pos = (ex3_sel_byp_nonflip) | (ex3_ovf_pz & (~ex3_integer_op) & (~ex3_negate) & (~ex3_unf_bz)) | (ex3_ovf_pz & (~ex3_integer_op) & ex3_all1_x);
 | 
						|
 | 
						|
   assign ex3_byp_sel_byp_neg = (~ex3_sel_byp_nonflip) & ex3_ovf_pz & (~ex3_integer_op) & ex3_negate;
 | 
						|
 | 
						|
   assign ex3_byp_sel_pos = ((~ex3_sel_byp) & (~ex3_integer_op) & (~ex3_negate) & (~ex3_unf_bz)) | ((~ex3_sel_byp) & (~ex3_integer_op) & ex3_all1_x);
 | 
						|
   assign ex3_byp_sel_neg = ((~ex3_sel_byp) & (~ex3_integer_op) & ex3_negate);
 | 
						|
 | 
						|
   assign ex3_prd_sel_pos_hi = ex3_prd_sel_pos_lo & (~ex3_integer_op);
 | 
						|
   assign ex3_prd_sel_neg_hi = ex3_prd_sel_neg_lo & (~ex3_integer_op);
 | 
						|
 | 
						|
   assign ex3_prd_sel_pos_lohi = ex3_prd_sel_pos_lo & (~ex3_word_from);
 | 
						|
   assign ex3_prd_sel_neg_lohi = ex3_prd_sel_neg_lo & (~ex3_word_from);
 | 
						|
 | 
						|
   assign ex3_prd_sel_pos_lo = ((~ex3_sel_byp_nonflip) & (~ex3_ovf_pz) & (~ex3_unf_bz) & (~ex3_negate)) | ((~ex3_sel_byp_nonflip) & ex3_all1_x) | ((~ex3_sel_byp_nonflip) & ex3_all1_y);
 | 
						|
   assign ex3_prd_sel_neg_lo = ((~ex3_sel_byp_nonflip) & ex3_negate);
 | 
						|
 | 
						|
   //#-------------------------------------------------
 | 
						|
   //# bypass mux & operand flip
 | 
						|
   //#-------------------------------------------------
 | 
						|
   //# integer operation positions
 | 
						|
   //#         32          32
 | 
						|
   //#       99:130    131:162
 | 
						|
 | 
						|
 | 
						|
   fu_alg_bypmux  bymx(
 | 
						|
      .ex3_byp_sel_byp_neg(ex3_byp_sel_byp_neg),		//i--
 | 
						|
      .ex3_byp_sel_byp_pos(ex3_byp_sel_byp_pos),		//i--
 | 
						|
      .ex3_byp_sel_neg(ex3_byp_sel_neg),		//i--
 | 
						|
      .ex3_byp_sel_pos(ex3_byp_sel_pos),		//i--
 | 
						|
      .ex3_prd_sel_neg_hi(ex3_prd_sel_neg_hi),		//i--
 | 
						|
      .ex3_prd_sel_neg_lo(ex3_prd_sel_neg_lo),		//i--
 | 
						|
      .ex3_prd_sel_neg_lohi(ex3_prd_sel_neg_lohi),		//i--
 | 
						|
      .ex3_prd_sel_pos_hi(ex3_prd_sel_pos_hi),		//i--
 | 
						|
      .ex3_prd_sel_pos_lo(ex3_prd_sel_pos_lo),		//i--
 | 
						|
      .ex3_prd_sel_pos_lohi(ex3_prd_sel_pos_lohi),		//i--
 | 
						|
      .ex3_sh_lvl3(ex3_sh_lvl3[0:162]),		//i--
 | 
						|
      .f_fmt_ex3_pass_frac(f_fmt_ex3_pass_frac[0:52]),		//i--
 | 
						|
      .f_alg_ex3_res(f_alg_ex3_res[0:162])		//o--
 | 
						|
   );
 | 
						|
 | 
						|
   //#-------------------------------------------------
 | 
						|
   //# finish sticky
 | 
						|
   //#-------------------------------------------------
 | 
						|
 | 
						|
   assign ex3_frmneg = ex3_from_integer & ex3_negate;		//need +1 as part of negate
 | 
						|
   assign ex3_toneg = (ex3_to_integer & (~ex3_rnd_to_int) & ex3_b_sign);		//reverse rounding for toint/neg
 | 
						|
   assign ex3_topos = (ex3_to_integer & (~ex3_rnd_to_int) & (~ex3_b_sign)) | ex3_rnd_to_int;
 | 
						|
   assign ex3_frmneg_o_toneg = ex3_frmneg | ex3_toneg;
 | 
						|
   assign ex3_frmneg_o_topos = ex3_frmneg | ex3_topos;
 | 
						|
 | 
						|
   assign ex3_math_gate_x = (~ex3_sel_byp_nonflip) & ex3_b_zero_b & (~ex3_ovf_pz);
 | 
						|
   assign ex3_toint_gate_x = ex3_to_integer & ex3_b_zero_b;
 | 
						|
   assign ex3_toint_gt_nr_x = ex3_to_integer & ex3_b_zero_b & f_pic_ex3_rnd_nr;
 | 
						|
   assign ex3_toint_gt_ok_x = ex3_to_integer & ex3_b_zero_b & f_pic_ex3_rnd_inf_ok;
 | 
						|
 | 
						|
   assign ex3_math_gate_g = (~ex3_sel_byp_nonflip) & (~ex3_ovf_pz) & ex3_b_zero_b & (ex3_prd_sel_pos_lo | ex3_prd_sel_neg_lo);
 | 
						|
   assign ex3_toint_gate_g = ex3_to_integer & (~ex3_ovf_pz) & (~ex3_sh_unf) & ex3_b_zero_b;
 | 
						|
   assign ex3_toint_gt_nr_g = ex3_to_integer & (~ex3_ovf_pz) & (~ex3_sh_unf) & ex3_b_zero_b & f_pic_ex3_rnd_nr;
 | 
						|
   assign ex3_toint_gt_ok_g = ex3_to_integer & (~ex3_ovf_pz) & (~ex3_sh_unf) & ex3_b_zero_b & f_pic_ex3_rnd_inf_ok;
 | 
						|
 | 
						|
   assign ex3_bsha_pos = (~ex3_bsha_neg);
 | 
						|
 | 
						|
   assign ex3_sticky_eac_x = ((ex3_sh_unf | ex3_sticky_en16_x[0]) & ex3_sticky_or16[0] & ex3_bsha_pos) | ((ex3_sh_unf | ex3_sticky_en16_x[1]) & ex3_sticky_or16[1] & ex3_bsha_pos) | ((ex3_sh_unf | ex3_sticky_en16_x[2]) & ex3_sticky_or16[2] & ex3_bsha_pos) | ((ex3_sh_unf | ex3_sticky_en16_x[3]) & ex3_sticky_or16[3] & ex3_bsha_pos) | ((ex3_sh_unf | ex3_sticky_en16_x[4]) & ex3_sticky_or16[4] & ex3_bsha_pos);		// shift underflow enables all sticky
 | 
						|
 | 
						|
   assign ex3_sticky_math = ex3_sticky_eac_x & ex3_math_gate_x;
 | 
						|
   assign ex3_sticky_toint = ex3_sticky_eac_x & ex3_toint_gate_x;
 | 
						|
   assign ex3_sticky_toint_nr = ex3_sticky_eac_x & ex3_toint_gt_nr_x;
 | 
						|
   assign ex3_sticky_toint_ok = ex3_sticky_eac_x & ex3_toint_gt_ok_x;
 | 
						|
 | 
						|
   // round-to-int goes up if guard is ON (this fakes it out)
 | 
						|
   assign ex3_lsb_toint_nr = (ex3_sh16_162 | ex3_rnd_to_int) & ex3_toint_gt_nr_g;
 | 
						|
 | 
						|
   assign ex3_g_math = ex3_sh16_163 & ex3_math_gate_g;
 | 
						|
   assign ex3_g_toint = ex3_sh16_163 & ex3_toint_gate_g;
 | 
						|
   assign ex3_g_toint_nr = ex3_sh16_163 & ex3_toint_gt_nr_g;
 | 
						|
   assign ex3_g_toint_ok = ex3_sh16_163 & ex3_toint_gt_ok_g;
 | 
						|
 | 
						|
   //==##############################################################
 | 
						|
   //# ex4 latches  (from ex3 logic)
 | 
						|
   //==##############################################################
 | 
						|
 | 
						|
 | 
						|
   tri_rlmreg_p #(.WIDTH(11),  .NEEDS_SRESET(0)) ex4_ctl_lat(
 | 
						|
      .force_t(force_t),		//tidn,
 | 
						|
      .d_mode(tiup), //d_mode           => d_mode       ,--tiup,
 | 
						|
      .delay_lclkr(delay_lclkr[3]),		//tidn,
 | 
						|
      .mpw1_b(mpw1_b[3]),		//tidn,
 | 
						|
      .mpw2_b(mpw2_b[0]),		//tidn,
 | 
						|
      .vd(vdd),
 | 
						|
      .gd(gnd),
 | 
						|
      .nclk(nclk),
 | 
						|
      .thold_b(thold_0_b),
 | 
						|
      .sg(sg_0),
 | 
						|
      .act(ex3_act),
 | 
						|
      .scout(ex4_ctl_so),
 | 
						|
      .scin(ex4_ctl_si),
 | 
						|
      //---------------
 | 
						|
      .din({ ex3_sticky_math,
 | 
						|
             ex3_sticky_toint,
 | 
						|
             ex3_sticky_toint_nr,
 | 
						|
             ex3_sticky_toint_ok,
 | 
						|
             ex3_frmneg_o_toneg,
 | 
						|
             ex3_frmneg_o_topos,
 | 
						|
             ex3_lsb_toint_nr,
 | 
						|
             ex3_g_math,
 | 
						|
             ex3_g_toint,
 | 
						|
             ex3_g_toint_nr,
 | 
						|
             ex3_g_toint_ok}),
 | 
						|
      //--------------
 | 
						|
      .dout({ ex4_sticky_math,
 | 
						|
              ex4_sticky_toint,
 | 
						|
              ex4_sticky_toint_nr,
 | 
						|
              ex4_sticky_toint_ok,
 | 
						|
              ex4_frmneg_o_toneg,
 | 
						|
              ex4_frmneg_o_topos,
 | 
						|
              ex4_lsb_toint_nr,
 | 
						|
              ex4_g_math,
 | 
						|
              ex4_g_toint,
 | 
						|
              ex4_g_toint_nr,
 | 
						|
              ex4_g_toint_ok})
 | 
						|
   );
 | 
						|
 | 
						|
   //==##############################################################
 | 
						|
   //== ex4 logic
 | 
						|
   //==##############################################################
 | 
						|
 | 
						|
   assign f_alg_ex4_sticky = ex4_sticky_math | ex4_g_math;		//output--
 | 
						|
   assign f_alg_ex4_int_fi = ex4_sticky_toint | ex4_g_toint;		//outpt--
 | 
						|
 | 
						|
   assign ex4_int_fr_nr1_b = (~(ex4_g_toint_nr & ex4_sticky_toint_nr));
 | 
						|
   assign ex4_int_fr_nr2_b = (~(ex4_g_toint_nr & ex4_lsb_toint_nr));
 | 
						|
   assign ex4_int_fr_ok_b = (~(ex4_g_toint_ok | ex4_sticky_toint_ok));
 | 
						|
   assign ex4_int_fr = (~(ex4_int_fr_nr1_b & ex4_int_fr_nr2_b & ex4_int_fr_ok_b));
 | 
						|
   assign f_alg_ex4_int_fr = ex4_int_fr;		//output-- f_pic
 | 
						|
 | 
						|
   assign ex4_sel_p1_0_b = (~((~ex4_int_fr) & ex4_frmneg_o_toneg));
 | 
						|
   assign ex4_sel_p1_1_b = (~(ex4_int_fr & ex4_frmneg_o_topos));
 | 
						|
   assign f_alg_ex4_frc_sel_p1 = (~(ex4_sel_p1_0_b & ex4_sel_p1_1_b));		//output-- rounding converts
 | 
						|
 | 
						|
   //==##############################################################
 | 
						|
   //# scan string
 | 
						|
   //==##############################################################
 | 
						|
 | 
						|
   assign ex2_ctl_si[0:4] = {ex2_ctl_so[1:4], f_alg_si};		//SCAN
 | 
						|
   assign ex3_shd_si[0:67] = {ex3_shd_so[1:67], ex2_ctl_so[0]};		//SCAN
 | 
						|
   assign ex3_shc_si[0:24] = {ex3_shc_so[1:24], ex3_shd_so[0]};		//SCAN
 | 
						|
   assign ex3_ctl_si[0:14] = {ex3_ctl_so[1:14], ex3_shc_so[0]};		//SCAN
 | 
						|
   assign ex4_ctl_si[0:10] = {ex4_ctl_so[1:10], ex3_ctl_so[0]};		//SCAN
 | 
						|
   assign act_si[0:4] = {act_so[1:4], ex4_ctl_so[0]};		//SCAN
 | 
						|
   assign f_alg_so = act_so[0];		//SCAN
 | 
						|
 | 
						|
endmodule
 |