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.

930 lines
34 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_tbllut(
vdd,
gnd,
clkoff_b,
act_dis,
flush,
delay_lclkr,
mpw1_b,
mpw2_b,
sg_1,
thold_1,
fpu_enable,
nclk,
si,
so,
ex2_act,
f_fmt_ex2_b_frac,
f_fmt_ex3_b_frac,
f_tbe_ex3_expo_lsb,
f_tbe_ex3_est_recip,
f_tbe_ex3_est_rsqrt,
f_tbe_ex4_recip_ue1,
f_tbe_ex4_lu_sh,
f_tbe_ex4_match_en_sp,
f_tbe_ex4_match_en_dp,
f_tbe_ex4_recip_2046,
f_tbe_ex4_recip_2045,
f_tbe_ex4_recip_2044,
f_tbl_ex6_est_frac,
f_tbl_ex5_unf_expo,
f_tbl_ex6_recip_den
);
inout vdd;
inout gnd;
input clkoff_b; // tiup
input act_dis; // ??tidn??
input flush; // ??tidn??
input [2:5] delay_lclkr; // tidn,
input [2:5] mpw1_b; // tidn,
input [0:1] mpw2_b; // tidn,
input sg_1;
input thold_1;
input fpu_enable; //dc_act
input [0:`NCLK_WIDTH-1] nclk;
input si; //perv
output so; //perv
input ex2_act; //act
//----------------------------
input [1:6] f_fmt_ex2_b_frac;
input [7:22] f_fmt_ex3_b_frac;
input f_tbe_ex3_expo_lsb;
input f_tbe_ex3_est_recip;
input f_tbe_ex3_est_rsqrt;
input f_tbe_ex4_recip_ue1;
input f_tbe_ex4_lu_sh;
input f_tbe_ex4_match_en_sp;
input f_tbe_ex4_match_en_dp;
input f_tbe_ex4_recip_2046;
input f_tbe_ex4_recip_2045;
input f_tbe_ex4_recip_2044;
//----------------------------
output [0:26] f_tbl_ex6_est_frac;
output f_tbl_ex5_unf_expo;
output f_tbl_ex6_recip_den; //generates den flag
// ENTITY
parameter tiup = 1'b1;
parameter tidn = 1'b0;
wire ex5_unf_expo;
wire [1:6] ex3_f;
wire ex3_sel_recip;
wire ex3_sel_rsqte;
wire ex3_sel_rsqto;
wire [1:20] ex3_est;
wire [1:20] ex3_est_recip;
wire [1:20] ex3_est_rsqte;
wire [1:20] ex3_est_rsqto;
wire [6:20] ex3_rng;
wire [6:20] ex3_rng_recip;
wire [6:20] ex3_rng_rsqte;
wire [6:20] ex3_rng_rsqto;
wire thold_0_b;
wire thold_0;
wire force_t;
wire sg_0;
wire ex3_act;
wire ex4_act;
wire ex5_act;
wire [0:3] spare_unused;
wire [0:5] ex3_lut_so;
wire [0:5] ex3_lut_si;
wire [0:6] act_so;
wire [0:6] act_si;
wire [0:19] ex4_lut_e_so;
wire [0:19] ex4_lut_e_si;
wire [0:14] ex4_lut_r_so;
wire [0:14] ex4_lut_r_si;
wire [0:15] ex4_lut_b_so;
wire [0:15] ex4_lut_b_si;
wire [6:20] ex4_rng;
wire [6:20] ex4_rng_b;
wire [1:20] ex4_est;
wire [1:20] ex4_est_b;
wire [7:22] ex4_bop;
wire [7:22] ex4_bop_b;
wire [0:36] ex4_tbl_sum;
wire [0:35] ex4_tbl_car;
wire [0:38] ex5_tbl_sum;
wire [0:38] ex5_tbl_car;
wire [0:79] ex5_lut_so;
wire [0:79] ex5_lut_si;
wire [0:27] ex6_lut_so;
wire [0:27] ex6_lut_si;
wire [0:27] ex5_lu;
wire [0:27] ex5_lux;
wire [0:26] ex5_lu_nrm;
wire [0:26] ex6_lu;
wire [0:27] lua_p;
wire [1:37] lua_t;
wire [1:38] lua_g;
wire [1:38] lua_g2;
wire [1:36] lua_g4;
wire [1:32] lua_g8;
wire [1:36] lua_t2;
wire [1:32] lua_t4;
wire [1:28] lua_t8;
wire [1:28] lua_gt8;
wire [0:27] lua_s0_b;
wire [0:27] lua_s1_b;
wire [0:3] lua_g16;
wire [0:1] lua_t16;
wire lua_c32;
wire lua_c24;
wire lua_c16;
wire lua_c08;
wire ex5_recip_den;
wire ex6_recip_den;
wire ex5_lu_sh;
wire ex5_recip_ue1;
wire ex5_recip_2044;
wire ex5_recip_2046;
wire ex5_recip_2045;
wire ex5_recip_2044_dp;
wire ex5_recip_2046_dp;
wire ex5_recip_2045_dp;
wire ex5_recip_2044_sp;
wire ex5_recip_2046_sp;
wire ex5_recip_2045_sp;
wire ex5_shlft_1;
wire ex5_shlft_0;
wire ex5_shrgt_1;
wire ex5_shrgt_2;
wire ex5_match_en_sp;
wire ex5_match_en_dp;
wire tbl_ex4_d1clk;
wire tbl_ex4_d2clk;
wire tbl_ex5_d1clk;
wire tbl_ex5_d2clk;
wire [0:`NCLK_WIDTH-1] tbl_ex4_lclk;
wire [0:`NCLK_WIDTH-1] tbl_ex5_lclk;
wire unused;
wire [0:36] ex5_tbl_sum_b;
wire [0:35] ex5_tbl_car_b;
wire ex5_match_en_sp_b;
wire ex5_match_en_dp_b;
wire ex5_recip_2046_b;
wire ex5_recip_2045_b;
wire ex5_recip_2044_b;
wire ex5_lu_sh_b;
wire ex5_recip_ue1_b;
wire ex5_sp_chop_24;
wire ex5_sp_chop_23;
wire ex5_sp_chop_22;
wire ex5_sp_chop_21;
//==##############################################################
//= map block attributes
//==##############################################################
assign unused = |(lua_g8[29:31]) | |(lua_g4[33:35]);
//==##############################################################
//= ex3 logic
//==##############################################################
tri_rlmreg_p #(.WIDTH(6)) ex3_lut_lat(
.force_t(force_t),
.d_mode(tiup),
.delay_lclkr(delay_lclkr[2]),
.mpw1_b(mpw1_b[2]),
.mpw2_b(mpw2_b[0]),
.vd(vdd),
.gd(gnd),
.nclk(nclk),
.act(ex2_act),
.thold_b(thold_0_b),
.sg(sg_0),
.scout(ex3_lut_so),
.scin(ex3_lut_si),
//-----------------
.din(f_fmt_ex2_b_frac[1:6]),
.dout(ex3_f[1:6])
);
//==##############################################################
//= ex3 logic
//==##############################################################
//==###########################################
//= rsqrt ev lookup table
//==###########################################
fu_tblsqe ftbe(
.f(ex3_f[1:6]), //i--
.est(ex3_est_rsqte[1:20]), //o--
.rng(ex3_rng_rsqte[6:20]) //o--
);
//==###########################################
//= rsqrt od lookup table
//==###########################################
fu_tblsqo ftbo(
.f(ex3_f[1:6]), //i--
.est(ex3_est_rsqto[1:20]), //o--
.rng(ex3_rng_rsqto[6:20]) //o--
);
//==###########################################
//= recip lookup table
//==###########################################
fu_tblres ftbr(
.f(ex3_f[1:6]), //i--
.est(ex3_est_recip[1:20]), //o--
.rng(ex3_rng_recip[6:20]) //o--
);
//==###########################################
//= muxing
//==###########################################
assign ex3_sel_recip = f_tbe_ex3_est_recip;
assign ex3_sel_rsqte = f_tbe_ex3_est_rsqrt & (~f_tbe_ex3_expo_lsb);
assign ex3_sel_rsqto = f_tbe_ex3_est_rsqrt & f_tbe_ex3_expo_lsb;
assign ex3_est[1:20] = ({20{ex3_sel_recip}} & ex3_est_recip[1:20]) |
({20{ex3_sel_rsqte}} & ex3_est_rsqte[1:20]) |
({20{ex3_sel_rsqto}} & ex3_est_rsqto[1:20]); // nand2 / nand3
assign ex3_rng[6:20] = ({15{ex3_sel_recip}} & (ex3_rng_recip[6:20])) |
({15{ex3_sel_rsqte}} & (ex3_rng_rsqte[6:20])) |
({15{ex3_sel_rsqto}} & (ex3_rng_rsqto[6:20])); // nand2 / nand3
//==##############################################################
//= ex4 latches
//==##############################################################
tri_inv_nlats #(.WIDTH(20), .NEEDS_SRESET(0)) ex4_lut_e_lat(
.vd(vdd),
.gd(gnd),
.lclk(tbl_ex4_lclk), // lclk.clk
.d1clk(tbl_ex4_d1clk),
.d2clk(tbl_ex4_d2clk),
.scanin(ex4_lut_e_si),
.scanout(ex4_lut_e_so),
.d(ex3_est[1:20]), //0:19
.qb(ex4_est_b[1:20]) //0:19
);
tri_inv_nlats #(.WIDTH(15), .NEEDS_SRESET(0)) ex4_lut_r_lat(
.vd(vdd),
.gd(gnd),
.lclk(tbl_ex4_lclk), // lclk.clk
.d1clk(tbl_ex4_d1clk),
.d2clk(tbl_ex4_d2clk),
.scanin(ex4_lut_r_si),
.scanout(ex4_lut_r_so),
.d(ex3_rng[6:20]), //20:34
.qb(ex4_rng_b[6:20]) //20:34
);
tri_inv_nlats #(.WIDTH(16), .NEEDS_SRESET(0)) ex4_lut_b_lat(
.vd(vdd),
.gd(gnd),
.lclk(tbl_ex4_lclk), // lclk.clk
.d1clk(tbl_ex4_d1clk),
.d2clk(tbl_ex4_d2clk),
.scanin(ex4_lut_b_si),
.scanout(ex4_lut_b_so),
.d(f_fmt_ex3_b_frac[7:22]), //35:50
.qb(ex4_bop_b[7:22]) //35:50
);
assign ex4_est[1:20] = (~ex4_est_b[1:20]);
assign ex4_rng[6:20] = (~ex4_rng_b[6:20]);
assign ex4_bop[7:22] = (~ex4_bop_b[7:22]);
//==##############################################################
//= ex4 logic : multiply
//==##############################################################
tri_fu_tblmul ftbm(
.vdd(vdd),
.gnd(gnd),
.x(ex4_rng[6:20]), //i-- RECODED
.y(ex4_bop[7:22]), //i-- SHIFTED
.z({tiup,ex4_est[1:20]}), //i--
.tbl_sum(ex4_tbl_sum[0:36]), //o--
.tbl_car(ex4_tbl_car[0:35]) //o--
);
//==##############################################################
//= ex5 latches
//==##############################################################
tri_inv_nlats #(.WIDTH(80), .NEEDS_SRESET(0)) ex5_lut_lat(
.vd(vdd),
.gd(gnd),
.lclk(tbl_ex5_lclk), // lclk.clk
.d1clk(tbl_ex5_d1clk),
.d2clk(tbl_ex5_d2clk),
.scanin(ex5_lut_si),
.scanout(ex5_lut_so),
.d({ex4_tbl_sum[0:36],
ex4_tbl_car[0:35],
f_tbe_ex4_match_en_sp,
f_tbe_ex4_match_en_dp,
f_tbe_ex4_recip_2046,
f_tbe_ex4_recip_2045,
f_tbe_ex4_recip_2044,
f_tbe_ex4_lu_sh,
f_tbe_ex4_recip_ue1}),
//----
.qb({
ex5_tbl_sum_b[0:36],
ex5_tbl_car_b[0:35],
ex5_match_en_sp_b,
ex5_match_en_dp_b,
ex5_recip_2046_b,
ex5_recip_2045_b,
ex5_recip_2044_b,
ex5_lu_sh_b,
ex5_recip_ue1_b})
);
assign ex5_tbl_sum[0:36] = (~ex5_tbl_sum_b[0:36]);
assign ex5_tbl_car[0:35] = (~ex5_tbl_car_b[0:35]);
assign ex5_match_en_sp = (~ex5_match_en_sp_b);
assign ex5_match_en_dp = (~ex5_match_en_dp_b);
assign ex5_recip_2046 = (~ex5_recip_2046_b);
assign ex5_recip_2045 = (~ex5_recip_2045_b);
assign ex5_recip_2044 = (~ex5_recip_2044_b);
assign ex5_lu_sh = (~ex5_lu_sh_b);
assign ex5_recip_ue1 = (~ex5_recip_ue1_b);
assign ex5_tbl_sum[37] = tidn;
assign ex5_tbl_sum[38] = tidn;
assign ex5_tbl_car[36] = tidn; //tiup; -- the +1 in -mul = !mul + 1
assign ex5_tbl_car[37] = tidn; //tiup; -- the +1 in -mul = !mul + 1
assign ex5_tbl_car[38] = tidn; //tiup; -- the +1 in -mul = !mul + 1
//==##############################################################
//= ex5 logic : add
//==##############################################################
// all bits paricipate in the carry, but only upper bits of sum are returned
// P/G/T ------------------------------------------------------
assign lua_p[0:27] = ex5_tbl_sum[0:27] ^ ex5_tbl_car[0:27];
assign lua_t[1:37] = ex5_tbl_sum[1:37] | ex5_tbl_car[1:37];
assign lua_g[1:38] = ex5_tbl_sum[1:38] & ex5_tbl_car[1:38];
// LOCAL BYTE CARRY --------------------------------------------------
assign lua_g2[38] = lua_g[38];
assign lua_g2[37] = lua_g[37] | (lua_t[37] & lua_g[38]);
assign lua_g2[36] = lua_g[36] | (lua_t[36] & lua_g[37]);
assign lua_g2[35] = lua_g[35] | (lua_t[35] & lua_g[36]);
assign lua_g2[34] = lua_g[34] | (lua_t[34] & lua_g[35]);
assign lua_g2[33] = lua_g[33] | (lua_t[33] & lua_g[34]);
assign lua_g2[32] = lua_g[32] | (lua_t[32] & lua_g[33]);
// lua_t2(38) <= lua_t(38) ;
// lua_t2(37) <= lua_t(37) and lua_t(38) ;
assign lua_t2[36] = lua_t[36] & lua_t[37];
assign lua_t2[35] = lua_t[35] & lua_t[36];
assign lua_t2[34] = lua_t[34] & lua_t[35];
assign lua_t2[33] = lua_t[33] & lua_t[34];
assign lua_t2[32] = lua_t[32] & lua_t[33];
// lua_g4(38) <= lua_g2(38) ;
// lua_g4(37) <= lua_g2(37) ;
assign lua_g4[36] = lua_g2[36] | (lua_t2[36] & lua_g2[38]);
assign lua_g4[35] = lua_g2[35] | (lua_t2[35] & lua_g2[37]);
assign lua_g4[34] = lua_g2[34] | (lua_t2[34] & lua_g2[36]);
assign lua_g4[33] = lua_g2[33] | (lua_t2[33] & lua_g2[35]);
assign lua_g4[32] = lua_g2[32] | (lua_t2[32] & lua_g2[34]);
// lua_t4(38) <= lua_t2(38) ;
// lua_t4(37) <= lua_t2(37) ;
// lua_t4(36) <= lua_t2(36) and lua_t2(38) ;
// lua_t4(35) <= lua_t2(35) and lua_t2(37) ;
// lua_t4(34) <= lua_t2(34) and lua_t2(36) ;
// lua_t4(33) <= lua_t2(33) and lua_t2(35) ;
assign lua_t4[32] = lua_t2[32] & lua_t2[34];
//lua_g8(38) <= lua_g4(38) ;
//lua_g8(37) <= lua_g4(37) ;
//lua_g8(36) <= lua_g4(36) ;
//lua_g8(35) <= lua_g4(35) ;
//lua_g8(34) <= lua_g4(34) or (lua_t4(34) and lua_g4(38) );
//lua_g8(33) <= lua_g4(33) or (lua_t4(33) and lua_g4(37) );
assign lua_g8[32] = lua_g4[32] | (lua_t4[32] & lua_g4[36]);
//lua_t8(38) <= lua_t4(38) ;
//lua_t8(37) <= lua_t4(37) ;
//lua_t8(36) <= lua_t4(36) ;
//lua_t8(35) <= lua_t4(35) ;
//lua_t8(34) <= lua_t4(34) and lua_t4(38) ;
//lua_t8(33) <= lua_t4(33) and lua_t4(37) ;
//lua_t8(32) <= lua_t4(32) and lua_t4(36) ;
assign lua_g2[31] = lua_g[31];
assign lua_g2[30] = lua_g[30] | (lua_t[30] & lua_g[31]);
assign lua_g2[29] = lua_g[29] | (lua_t[29] & lua_g[30]);
assign lua_g2[28] = lua_g[28] | (lua_t[28] & lua_g[29]);
assign lua_g2[27] = lua_g[27] | (lua_t[27] & lua_g[28]);
assign lua_g2[26] = lua_g[26] | (lua_t[26] & lua_g[27]);
assign lua_g2[25] = lua_g[25] | (lua_t[25] & lua_g[26]);
assign lua_g2[24] = lua_g[24] | (lua_t[24] & lua_g[25]);
assign lua_t2[31] = lua_t[31];
assign lua_t2[30] = lua_t[30] & lua_t[31];
assign lua_t2[29] = lua_t[29] & lua_t[30];
assign lua_t2[28] = lua_t[28] & lua_t[29];
assign lua_t2[27] = lua_t[27] & lua_t[28];
assign lua_t2[26] = lua_t[26] & lua_t[27];
assign lua_t2[25] = lua_t[25] & lua_t[26];
assign lua_t2[24] = lua_t[24] & lua_t[25];
assign lua_g4[31] = lua_g2[31];
assign lua_g4[30] = lua_g2[30];
assign lua_g4[29] = lua_g2[29] | (lua_t2[29] & lua_g2[31]);
assign lua_g4[28] = lua_g2[28] | (lua_t2[28] & lua_g2[30]);
assign lua_g4[27] = lua_g2[27] | (lua_t2[27] & lua_g2[29]);
assign lua_g4[26] = lua_g2[26] | (lua_t2[26] & lua_g2[28]);
assign lua_g4[25] = lua_g2[25] | (lua_t2[25] & lua_g2[27]);
assign lua_g4[24] = lua_g2[24] | (lua_t2[24] & lua_g2[26]);
assign lua_t4[31] = lua_t2[31];
assign lua_t4[30] = lua_t2[30];
assign lua_t4[29] = lua_t2[29] & lua_t2[31];
assign lua_t4[28] = lua_t2[28] & lua_t2[30];
assign lua_t4[27] = lua_t2[27] & lua_t2[29];
assign lua_t4[26] = lua_t2[26] & lua_t2[28];
assign lua_t4[25] = lua_t2[25] & lua_t2[27];
assign lua_t4[24] = lua_t2[24] & lua_t2[26];
assign lua_g8[31] = lua_g4[31];
assign lua_g8[30] = lua_g4[30];
assign lua_g8[29] = lua_g4[29];
assign lua_g8[28] = lua_g4[28];
assign lua_g8[27] = lua_g4[27] | (lua_t4[27] & lua_g4[31]);
assign lua_g8[26] = lua_g4[26] | (lua_t4[26] & lua_g4[30]);
assign lua_g8[25] = lua_g4[25] | (lua_t4[25] & lua_g4[29]);
assign lua_g8[24] = lua_g4[24] | (lua_t4[24] & lua_g4[28]);
// lua_t8(31) <= lua_t4(31) ;
// lua_t8(30) <= lua_t4(30) ;
// lua_t8(29) <= lua_t4(29) ;
assign lua_t8[28] = lua_t4[28];
assign lua_t8[27] = lua_t4[27] & lua_t4[31];
assign lua_t8[26] = lua_t4[26] & lua_t4[30];
assign lua_t8[25] = lua_t4[25] & lua_t4[29];
assign lua_t8[24] = lua_t4[24] & lua_t4[28];
assign lua_g2[23] = lua_g[23];
assign lua_g2[22] = lua_g[22] | (lua_t[22] & lua_g[23]);
assign lua_g2[21] = lua_g[21] | (lua_t[21] & lua_g[22]);
assign lua_g2[20] = lua_g[20] | (lua_t[20] & lua_g[21]);
assign lua_g2[19] = lua_g[19] | (lua_t[19] & lua_g[20]);
assign lua_g2[18] = lua_g[18] | (lua_t[18] & lua_g[19]);
assign lua_g2[17] = lua_g[17] | (lua_t[17] & lua_g[18]);
assign lua_g2[16] = lua_g[16] | (lua_t[16] & lua_g[17]);
assign lua_t2[23] = lua_t[23];
assign lua_t2[22] = lua_t[22] & lua_t[23];
assign lua_t2[21] = lua_t[21] & lua_t[22];
assign lua_t2[20] = lua_t[20] & lua_t[21];
assign lua_t2[19] = lua_t[19] & lua_t[20];
assign lua_t2[18] = lua_t[18] & lua_t[19];
assign lua_t2[17] = lua_t[17] & lua_t[18];
assign lua_t2[16] = lua_t[16] & lua_t[17];
assign lua_g4[23] = lua_g2[23];
assign lua_g4[22] = lua_g2[22];
assign lua_g4[21] = lua_g2[21] | (lua_t2[21] & lua_g2[23]);
assign lua_g4[20] = lua_g2[20] | (lua_t2[20] & lua_g2[22]);
assign lua_g4[19] = lua_g2[19] | (lua_t2[19] & lua_g2[21]);
assign lua_g4[18] = lua_g2[18] | (lua_t2[18] & lua_g2[20]);
assign lua_g4[17] = lua_g2[17] | (lua_t2[17] & lua_g2[19]);
assign lua_g4[16] = lua_g2[16] | (lua_t2[16] & lua_g2[18]);
assign lua_t4[23] = lua_t2[23];
assign lua_t4[22] = lua_t2[22];
assign lua_t4[21] = lua_t2[21] & lua_t2[23];
assign lua_t4[20] = lua_t2[20] & lua_t2[22];
assign lua_t4[19] = lua_t2[19] & lua_t2[21];
assign lua_t4[18] = lua_t2[18] & lua_t2[20];
assign lua_t4[17] = lua_t2[17] & lua_t2[19];
assign lua_t4[16] = lua_t2[16] & lua_t2[18];
assign lua_g8[23] = lua_g4[23];
assign lua_g8[22] = lua_g4[22];
assign lua_g8[21] = lua_g4[21];
assign lua_g8[20] = lua_g4[20];
assign lua_g8[19] = lua_g4[19] | (lua_t4[19] & lua_g4[23]);
assign lua_g8[18] = lua_g4[18] | (lua_t4[18] & lua_g4[22]);
assign lua_g8[17] = lua_g4[17] | (lua_t4[17] & lua_g4[21]);
assign lua_g8[16] = lua_g4[16] | (lua_t4[16] & lua_g4[20]);
assign lua_t8[23] = lua_t4[23];
assign lua_t8[22] = lua_t4[22];
assign lua_t8[21] = lua_t4[21];
assign lua_t8[20] = lua_t4[20];
assign lua_t8[19] = lua_t4[19] & lua_t4[23];
assign lua_t8[18] = lua_t4[18] & lua_t4[22];
assign lua_t8[17] = lua_t4[17] & lua_t4[21];
assign lua_t8[16] = lua_t4[16] & lua_t4[20];
assign lua_g2[15] = lua_g[15];
assign lua_g2[14] = lua_g[14] | (lua_t[14] & lua_g[15]);
assign lua_g2[13] = lua_g[13] | (lua_t[13] & lua_g[14]);
assign lua_g2[12] = lua_g[12] | (lua_t[12] & lua_g[13]);
assign lua_g2[11] = lua_g[11] | (lua_t[11] & lua_g[12]);
assign lua_g2[10] = lua_g[10] | (lua_t[10] & lua_g[11]);
assign lua_g2[9] = lua_g[9] | (lua_t[9] & lua_g[10]);
assign lua_g2[8] = lua_g[8] | (lua_t[8] & lua_g[9]);
assign lua_t2[15] = lua_t[15];
assign lua_t2[14] = lua_t[14] & lua_t[15];
assign lua_t2[13] = lua_t[13] & lua_t[14];
assign lua_t2[12] = lua_t[12] & lua_t[13];
assign lua_t2[11] = lua_t[11] & lua_t[12];
assign lua_t2[10] = lua_t[10] & lua_t[11];
assign lua_t2[9] = lua_t[9] & lua_t[10];
assign lua_t2[8] = lua_t[8] & lua_t[9];
assign lua_g4[15] = lua_g2[15];
assign lua_g4[14] = lua_g2[14];
assign lua_g4[13] = lua_g2[13] | (lua_t2[13] & lua_g2[15]);
assign lua_g4[12] = lua_g2[12] | (lua_t2[12] & lua_g2[14]);
assign lua_g4[11] = lua_g2[11] | (lua_t2[11] & lua_g2[13]);
assign lua_g4[10] = lua_g2[10] | (lua_t2[10] & lua_g2[12]);
assign lua_g4[9] = lua_g2[9] | (lua_t2[9] & lua_g2[11]);
assign lua_g4[8] = lua_g2[8] | (lua_t2[8] & lua_g2[10]);
assign lua_t4[15] = lua_t2[15];
assign lua_t4[14] = lua_t2[14];
assign lua_t4[13] = lua_t2[13] & lua_t2[15];
assign lua_t4[12] = lua_t2[12] & lua_t2[14];
assign lua_t4[11] = lua_t2[11] & lua_t2[13];
assign lua_t4[10] = lua_t2[10] & lua_t2[12];
assign lua_t4[9] = lua_t2[9] & lua_t2[11];
assign lua_t4[8] = lua_t2[8] & lua_t2[10];
assign lua_g8[15] = lua_g4[15];
assign lua_g8[14] = lua_g4[14];
assign lua_g8[13] = lua_g4[13];
assign lua_g8[12] = lua_g4[12];
assign lua_g8[11] = lua_g4[11] | (lua_t4[11] & lua_g4[15]);
assign lua_g8[10] = lua_g4[10] | (lua_t4[10] & lua_g4[14]);
assign lua_g8[9] = lua_g4[9] | (lua_t4[9] & lua_g4[13]);
assign lua_g8[8] = lua_g4[8] | (lua_t4[8] & lua_g4[12]);
assign lua_t8[15] = lua_t4[15];
assign lua_t8[14] = lua_t4[14];
assign lua_t8[13] = lua_t4[13];
assign lua_t8[12] = lua_t4[12];
assign lua_t8[11] = lua_t4[11] & lua_t4[15];
assign lua_t8[10] = lua_t4[10] & lua_t4[14];
assign lua_t8[9] = lua_t4[9] & lua_t4[13];
assign lua_t8[8] = lua_t4[8] & lua_t4[12];
assign lua_g2[7] = lua_g[7];
assign lua_g2[6] = lua_g[6] | (lua_t[6] & lua_g[7]);
assign lua_g2[5] = lua_g[5] | (lua_t[5] & lua_g[6]);
assign lua_g2[4] = lua_g[4] | (lua_t[4] & lua_g[5]);
assign lua_g2[3] = lua_g[3] | (lua_t[3] & lua_g[4]);
assign lua_g2[2] = lua_g[2] | (lua_t[2] & lua_g[3]);
assign lua_g2[1] = lua_g[1] | (lua_t[1] & lua_g[2]);
// lua_g2(0) <= lua_g(0) or (lua_t(0) and lua_g(1) );
assign lua_t2[7] = lua_t[7];
assign lua_t2[6] = lua_t[6] & lua_t[7];
assign lua_t2[5] = lua_t[5] & lua_t[6];
assign lua_t2[4] = lua_t[4] & lua_t[5];
assign lua_t2[3] = lua_t[3] & lua_t[4];
assign lua_t2[2] = lua_t[2] & lua_t[3];
assign lua_t2[1] = lua_t[1] & lua_t[2];
// lua_t2(0) <= lua_t(0) and lua_t(1) ;
assign lua_g4[7] = lua_g2[7];
assign lua_g4[6] = lua_g2[6];
assign lua_g4[5] = lua_g2[5] | (lua_t2[5] & lua_g2[7]);
assign lua_g4[4] = lua_g2[4] | (lua_t2[4] & lua_g2[6]);
assign lua_g4[3] = lua_g2[3] | (lua_t2[3] & lua_g2[5]);
assign lua_g4[2] = lua_g2[2] | (lua_t2[2] & lua_g2[4]);
assign lua_g4[1] = lua_g2[1] | (lua_t2[1] & lua_g2[3]);
// lua_g4(0) <= lua_g2(0) or (lua_t2(0) and lua_g2(2) );
assign lua_t4[7] = lua_t2[7];
assign lua_t4[6] = lua_t2[6];
assign lua_t4[5] = lua_t2[5] & lua_t2[7];
assign lua_t4[4] = lua_t2[4] & lua_t2[6];
assign lua_t4[3] = lua_t2[3] & lua_t2[5];
assign lua_t4[2] = lua_t2[2] & lua_t2[4];
assign lua_t4[1] = lua_t2[1] & lua_t2[3];
// lua_t4(0) <= lua_t2(0) and lua_t2(2) ;
assign lua_g8[7] = lua_g4[7];
assign lua_g8[6] = lua_g4[6];
assign lua_g8[5] = lua_g4[5];
assign lua_g8[4] = lua_g4[4];
assign lua_g8[3] = lua_g4[3] | (lua_t4[3] & lua_g4[7]);
assign lua_g8[2] = lua_g4[2] | (lua_t4[2] & lua_g4[6]);
assign lua_g8[1] = lua_g4[1] | (lua_t4[1] & lua_g4[5]);
//lua_g8(0) <= lua_g4(0) or (lua_t4(0) and lua_g4(4) );
assign lua_t8[7] = lua_t4[7];
assign lua_t8[6] = lua_t4[6];
assign lua_t8[5] = lua_t4[5];
assign lua_t8[4] = lua_t4[4];
assign lua_t8[3] = lua_t4[3] & lua_t4[7];
assign lua_t8[2] = lua_t4[2] & lua_t4[6];
assign lua_t8[1] = lua_t4[1] & lua_t4[5];
//lua_t8(0) <= lua_t4(0) and lua_t4(4) ;
// CONDITIONL SUM ---------------------------------------------
assign lua_gt8[1:28] = lua_g8[1:28] | lua_t8[1:28];
assign lua_s1_b[0:27] = (~(lua_p[0:27] ^ lua_gt8[1:28]));
assign lua_s0_b[0:27] = (~(lua_p[0:27] ^ lua_g8[1:28]));
// BYTE SELECT ------------------------------
// ex5_lu(0 to 27) <= not( ex5_lu_p(0 to 27) xor ex5_lu_c(1 to 28) ); -- invert
assign ex5_lu[0] = (lua_s0_b[0] & (~lua_c08)) | (lua_s1_b[0] & lua_c08);
assign ex5_lu[1] = (lua_s0_b[1] & (~lua_c08)) | (lua_s1_b[1] & lua_c08);
assign ex5_lu[2] = (lua_s0_b[2] & (~lua_c08)) | (lua_s1_b[2] & lua_c08);
assign ex5_lu[3] = (lua_s0_b[3] & (~lua_c08)) | (lua_s1_b[3] & lua_c08);
assign ex5_lu[4] = (lua_s0_b[4] & (~lua_c08)) | (lua_s1_b[4] & lua_c08);
assign ex5_lu[5] = (lua_s0_b[5] & (~lua_c08)) | (lua_s1_b[5] & lua_c08);
assign ex5_lu[6] = (lua_s0_b[6] & (~lua_c08)) | (lua_s1_b[6] & lua_c08);
assign ex5_lu[7] = (lua_s0_b[7] & (~lua_c08)) | (lua_s1_b[7] & lua_c08);
assign ex5_lu[8] = (lua_s0_b[8] & (~lua_c16)) | (lua_s1_b[8] & lua_c16);
assign ex5_lu[9] = (lua_s0_b[9] & (~lua_c16)) | (lua_s1_b[9] & lua_c16);
assign ex5_lu[10] = (lua_s0_b[10] & (~lua_c16)) | (lua_s1_b[10] & lua_c16);
assign ex5_lu[11] = (lua_s0_b[11] & (~lua_c16)) | (lua_s1_b[11] & lua_c16);
assign ex5_lu[12] = (lua_s0_b[12] & (~lua_c16)) | (lua_s1_b[12] & lua_c16);
assign ex5_lu[13] = (lua_s0_b[13] & (~lua_c16)) | (lua_s1_b[13] & lua_c16);
assign ex5_lu[14] = (lua_s0_b[14] & (~lua_c16)) | (lua_s1_b[14] & lua_c16);
assign ex5_lu[15] = (lua_s0_b[15] & (~lua_c16)) | (lua_s1_b[15] & lua_c16);
assign ex5_lu[16] = (lua_s0_b[16] & (~lua_c24)) | (lua_s1_b[16] & lua_c24);
assign ex5_lu[17] = (lua_s0_b[17] & (~lua_c24)) | (lua_s1_b[17] & lua_c24);
assign ex5_lu[18] = (lua_s0_b[18] & (~lua_c24)) | (lua_s1_b[18] & lua_c24);
assign ex5_lu[19] = (lua_s0_b[19] & (~lua_c24)) | (lua_s1_b[19] & lua_c24);
assign ex5_lu[20] = (lua_s0_b[20] & (~lua_c24)) | (lua_s1_b[20] & lua_c24);
assign ex5_lu[21] = (lua_s0_b[21] & (~lua_c24)) | (lua_s1_b[21] & lua_c24);
assign ex5_lu[22] = (lua_s0_b[22] & (~lua_c24)) | (lua_s1_b[22] & lua_c24);
assign ex5_lu[23] = (lua_s0_b[23] & (~lua_c24)) | (lua_s1_b[23] & lua_c24);
assign ex5_lu[24] = (lua_s0_b[24] & (~lua_c32)) | (lua_s1_b[24] & lua_c32);
assign ex5_lu[25] = (lua_s0_b[25] & (~lua_c32)) | (lua_s1_b[25] & lua_c32);
assign ex5_lu[26] = (lua_s0_b[26] & (~lua_c32)) | (lua_s1_b[26] & lua_c32);
assign ex5_lu[27] = (lua_s0_b[27] & (~lua_c32)) | (lua_s1_b[27] & lua_c32);
// GLOBAL BYTE CARRY ------------------------------
assign lua_g16[3] = lua_g8[32];
assign lua_g16[2] = lua_g8[24] | (lua_t8[24] & lua_g8[32]);
assign lua_g16[1] = lua_g8[16] | (lua_t8[16] & lua_g8[24]);
assign lua_g16[0] = lua_g8[8] | (lua_t8[8] & lua_g8[16]);
//lua_t16(3) <= lua_t8(32);
//lua_t16(2) <= lua_t8(24) and lua_t8(32) ;
assign lua_t16[1] = lua_t8[16] & lua_t8[24];
assign lua_t16[0] = lua_t8[8] & lua_t8[16];
assign lua_c32 = lua_g16[3];
assign lua_c24 = lua_g16[2];
assign lua_c16 = lua_g16[1] | (lua_t16[1] & lua_g16[3]);
assign lua_c08 = lua_g16[0] | (lua_t16[0] & lua_g16[2]);
//---------------------------------------------------------------
// normalize
//---------------------------------------------------------------
// expo=2046 ==> imp=0 shift right 1
// expo=2045 ==> imp=0 shift right 0
// expo=other => imp=1 shift right 0 <normal reslts>
assign ex5_recip_2044_dp = ex5_recip_2044 & ex5_match_en_dp & (~ex5_recip_ue1);
assign ex5_recip_2045_dp = ex5_recip_2045 & ex5_match_en_dp & (~ex5_recip_ue1);
assign ex5_recip_2046_dp = ex5_recip_2046 & ex5_match_en_dp & (~ex5_recip_ue1);
assign ex5_recip_2044_sp = ex5_recip_2044 & ex5_match_en_sp & (~ex5_recip_ue1);
assign ex5_recip_2045_sp = ex5_recip_2045 & ex5_match_en_sp & (~ex5_recip_ue1);
assign ex5_recip_2046_sp = ex5_recip_2046 & ex5_match_en_sp & (~ex5_recip_ue1);
// lu_sh means : shift left one, and decr exponent (unless it will create a denorm exponent)
// result in norm dp fmt, but set fpscr flag for sp unf
// result in norm dp fmt, but set fpscr flag for sp unf
// result in norm dp fmt, but set fpscr flag for sp unf
assign ex5_recip_den = ex5_recip_2046_sp | ex5_recip_2045_sp | (ex5_lu_sh & ex5_recip_2044_sp) | ex5_recip_2046_dp | ex5_recip_2045_dp | (ex5_lu_sh & ex5_recip_2044_dp); // use in round to set implicit bit
// cannot shift left , denorm result
// by not denormalizing sp the fpscr(ux) is set even though the implicit bit is set
// divide does not want the denormed result
// for setting UX (same for ue=0, ue=1
// ( ex5_match_en_dp) and -- leave SP normalized
assign ex5_unf_expo = (ex5_match_en_sp | ex5_match_en_dp) & (ex5_recip_2046 | ex5_recip_2045 | (ex5_recip_2044 & ex5_lu_sh)); // leave SP normalized
assign f_tbl_ex5_unf_expo = ex5_unf_expo; //output--
assign ex5_shlft_1 = (~ex5_recip_2046_dp) & (~ex5_recip_2045_dp) & (ex5_lu_sh & (~ex5_recip_2044_dp));
assign ex5_shlft_0 = (~ex5_recip_2046_dp) & (~ex5_recip_2045_dp) & (~(ex5_lu_sh & (~ex5_recip_2044_dp)));
assign ex5_shrgt_1 = ex5_recip_2045_dp;
assign ex5_shrgt_2 = ex5_recip_2046_dp;
// the final sp result will be in dp_norm format for an sp_denorm.
// emulate the dropping of bits when an sp is shifted right then fitted into 23 frac bits.
assign ex5_sp_chop_24 = ex5_recip_2046_sp | ex5_recip_2045_sp | ex5_recip_2044_sp;
assign ex5_sp_chop_23 = ex5_recip_2046_sp | ex5_recip_2045_sp;
assign ex5_sp_chop_22 = ex5_recip_2046_sp;
assign ex5_sp_chop_21 = tidn;
assign ex5_lux[0:20] = ex5_lu[0:20];
assign ex5_lux[21] = ex5_lu[21] & (~ex5_sp_chop_21);
assign ex5_lux[22] = ex5_lu[22] & (~ex5_sp_chop_22);
assign ex5_lux[23] = ex5_lu[23] & (~ex5_sp_chop_23);
assign ex5_lux[24] = ex5_lu[24] & (~ex5_sp_chop_24);
assign ex5_lux[25:27] = ex5_lu[25:27];
assign ex5_lu_nrm[0:26] = ({27{ex5_shlft_1}} & (ex5_lux[1:27])) |
({27{ex5_shlft_0}} & (ex5_lux[0:26])) |
({27{ex5_shrgt_1}} & ({tidn, ex5_lux[0:25]})) |
({27{ex5_shrgt_2}} & ({tidn, tidn, ex5_lux[0:24]}));
//==##############################################################
//= ex6 latches
//==##############################################################
tri_rlmreg_p #(.WIDTH(28)) ex6_lut_lat(
.force_t(force_t),
.d_mode(tiup),
.delay_lclkr(delay_lclkr[5]),
.mpw1_b(mpw1_b[5]),
.mpw2_b(mpw2_b[1]),
.vd(vdd),
.gd(gnd),
.nclk(nclk),
.act(ex5_act),
.thold_b(thold_0_b),
.sg(sg_0),
.scout(ex6_lut_so),
.scin(ex6_lut_si),
//-----------------
.din({ex5_lu_nrm[0:26],
ex5_recip_den}),
.dout({ex6_lu[0:26],
ex6_recip_den})
);
assign f_tbl_ex6_est_frac[0:26] = ex6_lu[0:26];
assign f_tbl_ex6_recip_den = ex6_recip_den;
//==##############################################################
//= 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(7)) act_lat(
.force_t(force_t),
.d_mode(tiup),
.delay_lclkr(delay_lclkr[4]),
.mpw1_b(mpw1_b[4]),
.mpw2_b(mpw2_b[0]),
.vd(vdd),
.gd(gnd),
.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,
ex3_act,
ex4_act,
spare_unused[2],
spare_unused[3]}),
//-----------------
.dout({ spare_unused[0],
spare_unused[1],
ex3_act,
ex4_act,
ex5_act,
spare_unused[2],
spare_unused[3]})
);
tri_lcbnd tbl_ex4_lcb(
.delay_lclkr(delay_lclkr[3]), // tidn ,--in
.mpw1_b(mpw1_b[3]), // 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(ex3_act), //in
.sg(sg_0), //in
.thold_b(thold_0_b), //in
.d1clk(tbl_ex4_d1clk), //out
.d2clk(tbl_ex4_d2clk), //out
.lclk(tbl_ex4_lclk) //out
);
tri_lcbnd tbl_ex5_lcb(
.delay_lclkr(delay_lclkr[4]), // tidn ,--in
.mpw1_b(mpw1_b[4]), // 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(ex4_act), //in
.sg(sg_0), //in
.thold_b(thold_0_b), //in
.d1clk(tbl_ex5_d1clk), //out
.d2clk(tbl_ex5_d2clk), //out
.lclk(tbl_ex5_lclk) //out
);
//==##############################################################
//= scan string
//==##############################################################
assign ex3_lut_si[0:5] = {ex3_lut_so[1:5], si};
assign ex4_lut_e_si[0:19] = {ex4_lut_e_so[1:19], ex3_lut_so[0]};
assign ex4_lut_r_si[0:14] = {ex4_lut_r_so[1:14], ex4_lut_e_so[0]};
assign ex4_lut_b_si[0:15] = {ex4_lut_b_so[1:15], ex4_lut_r_so[0]};
assign ex5_lut_si[0:79] = {ex5_lut_so[1:79], ex4_lut_b_so[0]};
assign ex6_lut_si[0:27] = {ex6_lut_so[1:27], ex5_lut_so[0]};
assign act_si[0:6] = {act_so[1:6], ex6_lut_so[0]};
assign so = act_so[0]; //SCAN
endmodule