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.
750 lines
28 KiB
Verilog
750 lines
28 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_eie(
|
|
vdd,
|
|
gnd,
|
|
clk,
|
|
rst,
|
|
clkoff_b,
|
|
act_dis,
|
|
flush,
|
|
delay_lclkr,
|
|
mpw1_b,
|
|
mpw2_b,
|
|
sg_1,
|
|
thold_1,
|
|
fpu_enable,
|
|
f_eie_si,
|
|
f_eie_so,
|
|
ex2_act,
|
|
f_byp_eie_ex2_a_expo,
|
|
f_byp_eie_ex2_c_expo,
|
|
f_byp_eie_ex2_b_expo,
|
|
f_pic_ex2_from_integer,
|
|
f_pic_ex2_fsel,
|
|
f_pic_ex3_frsp_ue1,
|
|
f_alg_ex3_sel_byp,
|
|
f_fmt_ex3_fsel_bsel,
|
|
f_pic_ex3_force_sel_bexp,
|
|
f_pic_ex3_sp_b,
|
|
f_pic_ex3_math_bzer_b,
|
|
f_eie_ex3_tbl_expo,
|
|
f_eie_ex3_lt_bias,
|
|
f_eie_ex3_eq_bias_m1,
|
|
f_eie_ex3_wd_ov,
|
|
f_eie_ex3_dw_ov,
|
|
f_eie_ex3_wd_ov_if,
|
|
f_eie_ex3_dw_ov_if,
|
|
f_eie_ex3_lzo_expo,
|
|
f_eie_ex3_b_expo,
|
|
f_eie_ex3_use_bexp,
|
|
f_eie_ex4_iexp
|
|
);
|
|
|
|
inout vdd;
|
|
inout gnd;
|
|
input clk;
|
|
input rst;
|
|
|
|
input clkoff_b; // tiup
|
|
input act_dis; // ??tidn??
|
|
input flush; // ??tidn??
|
|
input [2:3] delay_lclkr; // tidn,
|
|
input [2:3] mpw1_b; // tidn,
|
|
input [0:0] mpw2_b; // tidn,
|
|
input sg_1;
|
|
input thold_1;
|
|
input fpu_enable; //dc_act
|
|
|
|
input f_eie_si; // perv
|
|
output f_eie_so; // perv
|
|
input ex2_act; // act
|
|
|
|
input [1:13] f_byp_eie_ex2_a_expo;
|
|
input [1:13] f_byp_eie_ex2_c_expo;
|
|
input [1:13] f_byp_eie_ex2_b_expo;
|
|
|
|
input f_pic_ex2_from_integer;
|
|
input f_pic_ex2_fsel;
|
|
input f_pic_ex3_frsp_ue1;
|
|
|
|
input f_alg_ex3_sel_byp;
|
|
input f_fmt_ex3_fsel_bsel;
|
|
input f_pic_ex3_force_sel_bexp;
|
|
input f_pic_ex3_sp_b;
|
|
input f_pic_ex3_math_bzer_b;
|
|
|
|
output [1:13] f_eie_ex3_tbl_expo;
|
|
|
|
output f_eie_ex3_lt_bias; //f_pic
|
|
output f_eie_ex3_eq_bias_m1; //f_pic
|
|
output f_eie_ex3_wd_ov; //f_pic
|
|
output f_eie_ex3_dw_ov; //f_pic
|
|
output f_eie_ex3_wd_ov_if; //f_pic
|
|
output f_eie_ex3_dw_ov_if; //f_pic
|
|
output [1:13] f_eie_ex3_lzo_expo; //dlza to lzo
|
|
output [1:13] f_eie_ex3_b_expo; //dlza to lzo
|
|
output f_eie_ex3_use_bexp;
|
|
output [1:13] f_eie_ex4_iexp; //deov to lzasub
|
|
|
|
// end ports
|
|
|
|
// ENTITY
|
|
|
|
|
|
parameter tiup = 1'b1;
|
|
parameter tidn = 1'b0;
|
|
|
|
wire sg_0;
|
|
wire thold_0_b;
|
|
wire thold_0;
|
|
wire force_t;
|
|
|
|
|
|
wire ex3_act;
|
|
wire [0:3] act_spare_unused;
|
|
//-----------------
|
|
wire [0:4] act_so; //SCAN
|
|
wire [0:4] act_si; //SCAN
|
|
wire [0:12] ex3_bop_so; //SCAN
|
|
wire [0:12] ex3_bop_si; //SCAN
|
|
wire [0:12] ex3_pop_so; //SCAN
|
|
wire [0:12] ex3_pop_si; //SCAN
|
|
wire [0:6] ex3_ctl_so; //SCAN
|
|
wire [0:6] ex3_ctl_si; //SCAN
|
|
wire [0:13] ex4_iexp_so; //SCAN
|
|
wire [0:13] ex4_iexp_si; //SCAN
|
|
//-----------------
|
|
wire [1:13] ex2_a_expo;
|
|
wire [1:13] ex2_c_expo;
|
|
wire [1:13] ex2_b_expo;
|
|
wire [1:13] ex2_ep56_sum;
|
|
wire [1:12] ex2_ep56_car;
|
|
wire [1:13] ex2_ep56_p;
|
|
wire [2:12] ex2_ep56_g;
|
|
wire [2:11] ex2_ep56_t;
|
|
wire [1:13] ex2_ep56_s;
|
|
wire [2:12] ex2_ep56_c;
|
|
wire [1:13] ex2_p_expo_adj;
|
|
wire [1:13] ex2_from_k;
|
|
wire [1:13] ex2_b_expo_adj;
|
|
wire [1:13] ex3_p_expo;
|
|
wire [1:13] ex3_b_expo;
|
|
wire [1:13] ex3_iexp;
|
|
wire [1:13] ex3_b_expo_adj;
|
|
wire [1:13] ex3_p_expo_adj;
|
|
wire [1:13] ex4_iexp;
|
|
wire ex2_wd_ge_bot;
|
|
wire ex2_dw_ge_bot;
|
|
wire ex2_ge_2048;
|
|
wire ex2_ge_1024;
|
|
wire ex2_dw_ge_mid;
|
|
wire ex2_wd_ge_mid;
|
|
wire ex2_dw_ge;
|
|
wire ex2_wd_ge;
|
|
wire ex2_dw_eq_top;
|
|
wire ex2_wd_eq_bot;
|
|
wire ex2_wd_eq;
|
|
wire ex2_dw_eq;
|
|
wire ex3_iexp_b_sel;
|
|
wire ex3_dw_ge;
|
|
wire ex3_wd_ge;
|
|
wire ex3_wd_eq;
|
|
wire ex3_dw_eq;
|
|
wire ex3_fsel;
|
|
wire ex4_sp_b;
|
|
wire [1:13] ex3_b_expo_fixed; //experiment sp_den/dp_fmt
|
|
wire ex2_ge_bias;
|
|
wire ex2_lt_bias;
|
|
wire ex2_eq_bias_m1;
|
|
wire ex3_lt_bias;
|
|
wire ex3_eq_bias_m1;
|
|
wire [2:12] ex2_ep56_g2;
|
|
wire [2:10] ex2_ep56_t2;
|
|
wire [2:12] ex2_ep56_g4;
|
|
wire [2:8] ex2_ep56_t4;
|
|
wire [2:12] ex2_ep56_g8;
|
|
wire [2:4] ex2_ep56_t8;
|
|
|
|
////############################################
|
|
////# pervasive
|
|
////############################################
|
|
|
|
|
|
tri_plat thold_reg_0(
|
|
.vd(vdd),
|
|
.gd(gnd),
|
|
.clk(clk),
|
|
.rst(rst),
|
|
.flush(flush),
|
|
.din(thold_1),
|
|
.q(thold_0)
|
|
);
|
|
|
|
|
|
tri_plat sg_reg_0(
|
|
.vd(vdd),
|
|
.gd(gnd),
|
|
.clk(clk),
|
|
.rst(rst),
|
|
.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 LATCHES
|
|
////############################################
|
|
|
|
tri_rlmreg_p #(.WIDTH(5), .NEEDS_SRESET(0)) act_lat(
|
|
.force_t(force_t), //tidn,
|
|
.d_mode(tiup),
|
|
.delay_lclkr(delay_lclkr[2]), //tidn,
|
|
.mpw1_b(mpw1_b[2]), //tidn,
|
|
.mpw2_b(mpw2_b[0]), //tidn,
|
|
.vd(vdd),
|
|
.gd(gnd),
|
|
.clk(clk),
|
|
.rst(rst),
|
|
.thold_b(thold_0_b),
|
|
.sg(sg_0),
|
|
.act(fpu_enable),
|
|
.scout(act_so),
|
|
.scin(act_si),
|
|
//-----------------
|
|
.din({ act_spare_unused[0],
|
|
act_spare_unused[1],
|
|
ex2_act,
|
|
act_spare_unused[2],
|
|
act_spare_unused[3]}),
|
|
//-----------------
|
|
.dout({ act_spare_unused[0],
|
|
act_spare_unused[1],
|
|
ex3_act,
|
|
act_spare_unused[2],
|
|
act_spare_unused[3]})
|
|
);
|
|
|
|
////##############################################
|
|
////# EX2 latch inputs from rf1
|
|
////##############################################
|
|
|
|
assign ex2_a_expo[1:13] = f_byp_eie_ex2_a_expo[1:13];
|
|
assign ex2_c_expo[1:13] = f_byp_eie_ex2_c_expo[1:13];
|
|
assign ex2_b_expo[1:13] = f_byp_eie_ex2_b_expo[1:13];
|
|
|
|
////##############################################
|
|
////# EX2 logic
|
|
////##############################################
|
|
|
|
////##-------------------------------------------------------------------------
|
|
////## Product Exponent adder (+56 scouta subtract gives final resutl)
|
|
////##-------------------------------------------------------------------------
|
|
// rebiased from 1023 to 4095 ... (append 2 ones)
|
|
// ep56 : Ec + Ea -bias
|
|
// ep0 : Ec + Ea -bias + 56 = Ec + Ea -4095 + 56
|
|
//
|
|
// 0_0011_1111_1111
|
|
// 1_1100_0000_0001 !1023 + 1 = -1023
|
|
// 11_1000 56
|
|
//------------------
|
|
// 1_1100_0011_1001 + Ea + Ec
|
|
//
|
|
|
|
// ex2_ep56_sum( 0) <= tiup; -- 1
|
|
assign ex2_ep56_sum[1] = (~(ex2_a_expo[1] ^ ex2_c_expo[1])); // 1
|
|
assign ex2_ep56_sum[2] = (~(ex2_a_expo[2] ^ ex2_c_expo[2])); // 1
|
|
assign ex2_ep56_sum[3] = (~(ex2_a_expo[3] ^ ex2_c_expo[3])); // 1
|
|
assign ex2_ep56_sum[4] = (ex2_a_expo[4] ^ ex2_c_expo[4]); // 0
|
|
assign ex2_ep56_sum[5] = (ex2_a_expo[5] ^ ex2_c_expo[5]); // 0
|
|
assign ex2_ep56_sum[6] = (ex2_a_expo[6] ^ ex2_c_expo[6]); // 0
|
|
assign ex2_ep56_sum[7] = (ex2_a_expo[7] ^ ex2_c_expo[7]); // 0
|
|
assign ex2_ep56_sum[8] = (~(ex2_a_expo[8] ^ ex2_c_expo[8])); // 1
|
|
assign ex2_ep56_sum[9] = (~(ex2_a_expo[9] ^ ex2_c_expo[9])); // 1
|
|
assign ex2_ep56_sum[10] = (~(ex2_a_expo[10] ^ ex2_c_expo[10])); // 1
|
|
assign ex2_ep56_sum[11] = (ex2_a_expo[11] ^ ex2_c_expo[11]); // 0
|
|
assign ex2_ep56_sum[12] = (ex2_a_expo[12] ^ ex2_c_expo[12]); // 0
|
|
assign ex2_ep56_sum[13] = (~(ex2_a_expo[13] ^ ex2_c_expo[13])); // 1
|
|
|
|
// ex2_ep56_car( 0) <= ( ex2_a_expo( 1) or ex2_c_expo( 1) ); -- 1
|
|
assign ex2_ep56_car[1] = (ex2_a_expo[2] | ex2_c_expo[2]); // 1
|
|
assign ex2_ep56_car[2] = (ex2_a_expo[3] | ex2_c_expo[3]); // 1
|
|
assign ex2_ep56_car[3] = (ex2_a_expo[4] & ex2_c_expo[4]); // 0
|
|
assign ex2_ep56_car[4] = (ex2_a_expo[5] & ex2_c_expo[5]); // 0
|
|
assign ex2_ep56_car[5] = (ex2_a_expo[6] & ex2_c_expo[6]); // 0
|
|
assign ex2_ep56_car[6] = (ex2_a_expo[7] & ex2_c_expo[7]); // 0
|
|
assign ex2_ep56_car[7] = (ex2_a_expo[8] | ex2_c_expo[8]); // 1
|
|
assign ex2_ep56_car[8] = (ex2_a_expo[9] | ex2_c_expo[9]); // 1
|
|
assign ex2_ep56_car[9] = (ex2_a_expo[10] | ex2_c_expo[10]); // 1
|
|
assign ex2_ep56_car[10] = (ex2_a_expo[11] & ex2_c_expo[11]); // 0
|
|
assign ex2_ep56_car[11] = (ex2_a_expo[12] & ex2_c_expo[12]); // 0
|
|
assign ex2_ep56_car[12] = (ex2_a_expo[13] | ex2_c_expo[13]); // 1
|
|
|
|
assign ex2_ep56_p[1:12] = ex2_ep56_sum[1:12] ^ ex2_ep56_car[1:12];
|
|
assign ex2_ep56_p[13] = ex2_ep56_sum[13];
|
|
assign ex2_ep56_g[2:12] = ex2_ep56_sum[2:12] & ex2_ep56_car[2:12];
|
|
assign ex2_ep56_t[2:11] = ex2_ep56_sum[2:11] | ex2_ep56_car[2:11];
|
|
|
|
assign ex2_ep56_s[1:11] = ex2_ep56_p[1:11] ^ ex2_ep56_c[2:12];
|
|
assign ex2_ep56_s[12] = ex2_ep56_p[12];
|
|
assign ex2_ep56_s[13] = ex2_ep56_p[13];
|
|
|
|
assign ex2_ep56_g2[12] = ex2_ep56_g[12];
|
|
assign ex2_ep56_g2[11] = ex2_ep56_g[11] | (ex2_ep56_t[11] & ex2_ep56_g[12]);
|
|
assign ex2_ep56_g2[10] = ex2_ep56_g[10] | (ex2_ep56_t[10] & ex2_ep56_g[11]);
|
|
assign ex2_ep56_g2[9] = ex2_ep56_g[9] | (ex2_ep56_t[9] & ex2_ep56_g[10]);
|
|
assign ex2_ep56_g2[8] = ex2_ep56_g[8] | (ex2_ep56_t[8] & ex2_ep56_g[9]);
|
|
assign ex2_ep56_g2[7] = ex2_ep56_g[7] | (ex2_ep56_t[7] & ex2_ep56_g[8]);
|
|
assign ex2_ep56_g2[6] = ex2_ep56_g[6] | (ex2_ep56_t[6] & ex2_ep56_g[7]);
|
|
assign ex2_ep56_g2[5] = ex2_ep56_g[5] | (ex2_ep56_t[5] & ex2_ep56_g[6]);
|
|
assign ex2_ep56_g2[4] = ex2_ep56_g[4] | (ex2_ep56_t[4] & ex2_ep56_g[5]);
|
|
assign ex2_ep56_g2[3] = ex2_ep56_g[3] | (ex2_ep56_t[3] & ex2_ep56_g[4]);
|
|
assign ex2_ep56_g2[2] = ex2_ep56_g[2] | (ex2_ep56_t[2] & ex2_ep56_g[3]);
|
|
// ex2_ep56_g2( 1) <= ex2_ep56_g( 1) or (ex2_ep56_t( 1) and ex2_ep56_g( 2)) ;
|
|
|
|
assign ex2_ep56_t2[10] = (ex2_ep56_t[10] & ex2_ep56_t[11]);
|
|
assign ex2_ep56_t2[9] = (ex2_ep56_t[9] & ex2_ep56_t[10]);
|
|
assign ex2_ep56_t2[8] = (ex2_ep56_t[8] & ex2_ep56_t[9]);
|
|
assign ex2_ep56_t2[7] = (ex2_ep56_t[7] & ex2_ep56_t[8]);
|
|
assign ex2_ep56_t2[6] = (ex2_ep56_t[6] & ex2_ep56_t[7]);
|
|
assign ex2_ep56_t2[5] = (ex2_ep56_t[5] & ex2_ep56_t[6]);
|
|
assign ex2_ep56_t2[4] = (ex2_ep56_t[4] & ex2_ep56_t[5]);
|
|
assign ex2_ep56_t2[3] = (ex2_ep56_t[3] & ex2_ep56_t[4]);
|
|
assign ex2_ep56_t2[2] = (ex2_ep56_t[2] & ex2_ep56_t[3]);
|
|
// ex2_ep56_t2( 1) <= (ex2_ep56_t( 1) and ex2_ep56_t( 2)) ;
|
|
|
|
assign ex2_ep56_g4[12] = ex2_ep56_g2[12];
|
|
assign ex2_ep56_g4[11] = ex2_ep56_g2[11];
|
|
assign ex2_ep56_g4[10] = ex2_ep56_g2[10] | (ex2_ep56_t2[10] & ex2_ep56_g2[12]);
|
|
assign ex2_ep56_g4[9] = ex2_ep56_g2[9] | (ex2_ep56_t2[9] & ex2_ep56_g2[11]);
|
|
assign ex2_ep56_g4[8] = ex2_ep56_g2[8] | (ex2_ep56_t2[8] & ex2_ep56_g2[10]);
|
|
assign ex2_ep56_g4[7] = ex2_ep56_g2[7] | (ex2_ep56_t2[7] & ex2_ep56_g2[9]);
|
|
assign ex2_ep56_g4[6] = ex2_ep56_g2[6] | (ex2_ep56_t2[6] & ex2_ep56_g2[8]);
|
|
assign ex2_ep56_g4[5] = ex2_ep56_g2[5] | (ex2_ep56_t2[5] & ex2_ep56_g2[7]);
|
|
assign ex2_ep56_g4[4] = ex2_ep56_g2[4] | (ex2_ep56_t2[4] & ex2_ep56_g2[6]);
|
|
assign ex2_ep56_g4[3] = ex2_ep56_g2[3] | (ex2_ep56_t2[3] & ex2_ep56_g2[5]);
|
|
assign ex2_ep56_g4[2] = ex2_ep56_g2[2] | (ex2_ep56_t2[2] & ex2_ep56_g2[4]);
|
|
// ex2_ep56_g4( 1) <= ex2_ep56_g2( 1) or (ex2_ep56_t2( 1) and ex2_ep56_g2( 3)) ;
|
|
|
|
assign ex2_ep56_t4[8] = (ex2_ep56_t2[8] & ex2_ep56_t2[10]);
|
|
assign ex2_ep56_t4[7] = (ex2_ep56_t2[7] & ex2_ep56_t2[9]);
|
|
assign ex2_ep56_t4[6] = (ex2_ep56_t2[6] & ex2_ep56_t2[8]);
|
|
assign ex2_ep56_t4[5] = (ex2_ep56_t2[5] & ex2_ep56_t2[7]);
|
|
assign ex2_ep56_t4[4] = (ex2_ep56_t2[4] & ex2_ep56_t2[6]);
|
|
assign ex2_ep56_t4[3] = (ex2_ep56_t2[3] & ex2_ep56_t2[5]);
|
|
assign ex2_ep56_t4[2] = (ex2_ep56_t2[2] & ex2_ep56_t2[4]);
|
|
// ex2_ep56_t4( 1) <= (ex2_ep56_t2( 1) and ex2_ep56_t2( 3)) ;
|
|
|
|
assign ex2_ep56_g8[12] = ex2_ep56_g4[12];
|
|
assign ex2_ep56_g8[11] = ex2_ep56_g4[11];
|
|
assign ex2_ep56_g8[10] = ex2_ep56_g4[10];
|
|
assign ex2_ep56_g8[9] = ex2_ep56_g4[9];
|
|
assign ex2_ep56_g8[8] = ex2_ep56_g4[8] | (ex2_ep56_t4[8] & ex2_ep56_g4[12]);
|
|
assign ex2_ep56_g8[7] = ex2_ep56_g4[7] | (ex2_ep56_t4[7] & ex2_ep56_g4[11]);
|
|
assign ex2_ep56_g8[6] = ex2_ep56_g4[6] | (ex2_ep56_t4[6] & ex2_ep56_g4[10]);
|
|
assign ex2_ep56_g8[5] = ex2_ep56_g4[5] | (ex2_ep56_t4[5] & ex2_ep56_g4[9]);
|
|
assign ex2_ep56_g8[4] = ex2_ep56_g4[4] | (ex2_ep56_t4[4] & ex2_ep56_g4[8]);
|
|
assign ex2_ep56_g8[3] = ex2_ep56_g4[3] | (ex2_ep56_t4[3] & ex2_ep56_g4[7]);
|
|
assign ex2_ep56_g8[2] = ex2_ep56_g4[2] | (ex2_ep56_t4[2] & ex2_ep56_g4[6]);
|
|
// ex2_ep56_g8( 1) <= ex2_ep56_g4( 1) or (ex2_ep56_t4( 1) and ex2_ep56_g4( 5)) ;
|
|
|
|
assign ex2_ep56_t8[4] = (ex2_ep56_t4[4] & ex2_ep56_t4[8]);
|
|
assign ex2_ep56_t8[3] = (ex2_ep56_t4[3] & ex2_ep56_t4[7]);
|
|
assign ex2_ep56_t8[2] = (ex2_ep56_t4[2] & ex2_ep56_t4[6]);
|
|
// ex2_ep56_t8( 1) <= (ex2_ep56_t4( 1) and ex2_ep56_t4( 5)) ;
|
|
|
|
assign ex2_ep56_c[12] = ex2_ep56_g8[12];
|
|
assign ex2_ep56_c[11] = ex2_ep56_g8[11];
|
|
assign ex2_ep56_c[10] = ex2_ep56_g8[10];
|
|
assign ex2_ep56_c[9] = ex2_ep56_g8[9];
|
|
assign ex2_ep56_c[8] = ex2_ep56_g8[8];
|
|
assign ex2_ep56_c[7] = ex2_ep56_g8[7];
|
|
assign ex2_ep56_c[6] = ex2_ep56_g8[6];
|
|
assign ex2_ep56_c[5] = ex2_ep56_g8[5];
|
|
assign ex2_ep56_c[4] = ex2_ep56_g8[4] | (ex2_ep56_t8[4] & ex2_ep56_g8[12]);
|
|
assign ex2_ep56_c[3] = ex2_ep56_g8[3] | (ex2_ep56_t8[3] & ex2_ep56_g8[11]);
|
|
assign ex2_ep56_c[2] = ex2_ep56_g8[2] | (ex2_ep56_t8[2] & ex2_ep56_g8[10]);
|
|
// ex2_ep56_c( 1) <= ex2_ep56_g8( 1) or (ex2_ep56_t8( 1) and ex2_ep56_g8( 9)) ;
|
|
|
|
////##---------------------------------------
|
|
////## hold onto c_exponent for fsel
|
|
////##---------------------------------------
|
|
|
|
assign ex2_p_expo_adj[1:13] = (ex2_ep56_s[1:13] & {13{(~f_pic_ex2_fsel)}}) |
|
|
(ex2_c_expo[1:13] & {13{f_pic_ex2_fsel}});
|
|
|
|
////##---------------------------------------
|
|
////## select b exponent
|
|
////##---------------------------------------
|
|
|
|
// From integer exponent
|
|
// lsb is at position 162, and value = bias
|
|
// therefore set b_expo to (bias+162)
|
|
// 0_1111_1111_1111 1023 = bias
|
|
// 101_0010 162
|
|
// ---------------- ----
|
|
// 1_0000_0101_0001 4096+57
|
|
// 1 2345 6789 0123
|
|
|
|
assign ex2_from_k[1] = tidn; // 4096
|
|
assign ex2_from_k[2] = tidn; // 2048
|
|
assign ex2_from_k[3] = tiup; // 1024
|
|
assign ex2_from_k[4] = tidn; // 512
|
|
assign ex2_from_k[5] = tidn; // 256
|
|
assign ex2_from_k[6] = tiup; // 128
|
|
assign ex2_from_k[7] = tidn; // 64
|
|
assign ex2_from_k[8] = tiup; // 32
|
|
assign ex2_from_k[9] = tidn; // 16
|
|
assign ex2_from_k[10] = tidn; // 8
|
|
assign ex2_from_k[11] = tidn; // 4
|
|
assign ex2_from_k[12] = tidn; // 2
|
|
assign ex2_from_k[13] = tiup; // 1
|
|
|
|
assign ex2_b_expo_adj[1:13] = (ex2_from_k[1:13] & {13{f_pic_ex2_from_integer}}) |
|
|
(ex2_b_expo[1:13] & {13{(~f_pic_ex2_from_integer)}});
|
|
|
|
////##---------------------------------------
|
|
////## to integer overflow boundaries
|
|
////##---------------------------------------
|
|
// convert to signed_word:
|
|
// pos int ov ge 2**31 1023+31
|
|
// ov eq 2**30 * rnd_up 1023+30 <= just look at final MSB position
|
|
// neg int ov gt 2**31 1023+31
|
|
// neg int ov eq 2**31 1023+31 & frac[1:*] != 0
|
|
|
|
// convert to signed_doubleword:
|
|
// pos int ov ge 2**63 1023+63 1086
|
|
// ov eq 2**62 * rnd_up 1023+62 1085 <=== just look at final msb position
|
|
// neg int ov gt 2**63 1023+63 1086
|
|
// neg int ov eq 2**63 1023+63 1086 & frac[1:*] != 0;
|
|
//
|
|
// 0_0011_1111_1111 bias 1023
|
|
// 10_0000 32
|
|
// 0_0100 0001 1111 <=== ge
|
|
//
|
|
// 0_0011_1111_1111 bias 1023
|
|
// 1_1111 31
|
|
// 0_0100 0001 1110 <=== eq
|
|
//
|
|
// 0_0011_1111_1111 bias 1023
|
|
// 100_0000 64
|
|
// 0_0100 0011 1111 <==== ge 1087
|
|
//
|
|
// 0_0011_1111_1111 bias 1023
|
|
// 11_1111 63
|
|
// 0_0100 0011 1110 <==== eq 1086
|
|
//
|
|
// 1111
|
|
// 1 2345 6789 0123
|
|
//
|
|
// if exponent less than bias (1023)
|
|
// positive input if +rnd_up result = +ulp (ok) int 1
|
|
// positive input if -rnd_up result = +0 (ok) int 0
|
|
// negative input if +rnd_up result = -ulp (ok) int -1 (no increment)
|
|
// negative input if -rnd_up result = +0 <== ??force sign??
|
|
// normalizer shifts wrong (98)=1
|
|
|
|
assign ex2_wd_ge_bot = ex2_b_expo[9] & ex2_b_expo[10] & ex2_b_expo[11] & ex2_b_expo[12] & ex2_b_expo[13];
|
|
|
|
assign ex2_dw_ge_bot = ex2_b_expo[8] & ex2_wd_ge_bot;
|
|
|
|
assign ex2_ge_2048 = (~ex2_b_expo[1]) & ex2_b_expo[2];
|
|
assign ex2_ge_1024 = (~ex2_b_expo[1]) & ex2_b_expo[3];
|
|
|
|
assign ex2_dw_ge_mid = ex2_b_expo[4] | ex2_b_expo[5] | ex2_b_expo[6] | ex2_b_expo[7];
|
|
|
|
assign ex2_wd_ge_mid = ex2_b_expo[8] | ex2_dw_ge_mid;
|
|
|
|
assign ex2_dw_ge = (ex2_ge_2048) | (ex2_ge_1024 & ex2_dw_ge_mid) | (ex2_ge_1024 & ex2_dw_ge_bot);
|
|
|
|
assign ex2_wd_ge = (ex2_ge_2048) | (ex2_ge_1024 & ex2_wd_ge_mid) | (ex2_ge_1024 & ex2_wd_ge_bot);
|
|
|
|
assign ex2_dw_eq_top = (~ex2_b_expo[1]) & (~ex2_b_expo[2]) & ex2_b_expo[3] & (~ex2_b_expo[4]) & (~ex2_b_expo[5]) & (~ex2_b_expo[6]) & (~ex2_b_expo[7]);
|
|
|
|
assign ex2_wd_eq_bot = ex2_b_expo[9] & ex2_b_expo[10] & ex2_b_expo[11] & ex2_b_expo[12] & (~ex2_b_expo[13]);
|
|
|
|
assign ex2_wd_eq = ex2_dw_eq_top & (~ex2_b_expo[8]) & ex2_wd_eq_bot;
|
|
|
|
assign ex2_dw_eq = ex2_dw_eq_top & ex2_b_expo[8] & ex2_wd_eq_bot;
|
|
|
|
assign ex2_ge_bias = ((~ex2_b_expo[1]) & ex2_b_expo[2]) | ((~ex2_b_expo[1]) & ex2_b_expo[3]) | ((~ex2_b_expo[1]) & ex2_b_expo[4] & ex2_b_expo[5] & ex2_b_expo[6] & ex2_b_expo[7] & ex2_b_expo[8] & ex2_b_expo[9] & ex2_b_expo[10] & ex2_b_expo[11] & ex2_b_expo[12] & ex2_b_expo[13]); // for rnd_to_int
|
|
|
|
assign ex2_lt_bias = (~ex2_ge_bias);
|
|
// rnd-to-int nearest rounds up
|
|
// sign
|
|
// 2048
|
|
// 1024
|
|
// 512
|
|
// 256
|
|
// 128
|
|
// 64
|
|
// 32
|
|
// 16
|
|
// 8
|
|
// 4
|
|
assign ex2_eq_bias_m1 = (~ex2_b_expo[1]) & (~ex2_b_expo[2]) & (~ex2_b_expo[3]) & ex2_b_expo[4] & ex2_b_expo[5] & ex2_b_expo[6] & ex2_b_expo[7] & ex2_b_expo[8] & ex2_b_expo[9] & ex2_b_expo[10] & ex2_b_expo[11] & ex2_b_expo[12] & (~ex2_b_expo[13]); // 2
|
|
// 1
|
|
|
|
////##############################################
|
|
////# EX3 latches
|
|
////##############################################
|
|
|
|
|
|
tri_rlmreg_p #(.WIDTH(13), .NEEDS_SRESET(0)) ex3_bop_lat(
|
|
.force_t(force_t), //tidn,
|
|
.d_mode(tiup), //
|
|
.delay_lclkr(delay_lclkr[2]), //tidn,
|
|
.mpw1_b(mpw1_b[2]), //tidn,
|
|
.mpw2_b(mpw2_b[0]), //tidn,
|
|
.vd(vdd),
|
|
.gd(gnd),
|
|
.clk(clk),
|
|
.rst(rst),
|
|
.thold_b(thold_0_b),
|
|
.sg(sg_0),
|
|
.act(ex2_act),
|
|
.scout(ex3_bop_so),
|
|
.scin(ex3_bop_si),
|
|
//-----------------
|
|
.din(ex2_b_expo_adj[1:13]),
|
|
.dout(ex3_b_expo_adj[1:13]) //LAT--
|
|
);
|
|
|
|
|
|
tri_rlmreg_p #(.WIDTH(13), .NEEDS_SRESET(0)) ex3_pop_lat(
|
|
.force_t(force_t), //tidn,
|
|
.d_mode(tiup),
|
|
.delay_lclkr(delay_lclkr[2]), //tidn,
|
|
.mpw1_b(mpw1_b[2]), //tidn,
|
|
.mpw2_b(mpw2_b[0]), //tidn,
|
|
.vd(vdd),
|
|
.gd(gnd),
|
|
.clk(clk),
|
|
.rst(rst),
|
|
.thold_b(thold_0_b),
|
|
.sg(sg_0),
|
|
.act(ex2_act),
|
|
.scout(ex3_pop_so),
|
|
.scin(ex3_pop_si),
|
|
//-----------------
|
|
.din(ex2_p_expo_adj[1:13]),
|
|
.dout(ex3_p_expo_adj[1:13]) //LAT--
|
|
);
|
|
|
|
|
|
tri_rlmreg_p #(.WIDTH(7), .NEEDS_SRESET(0)) ex3_ctl_lat(
|
|
.force_t(force_t), //tidn,
|
|
.d_mode(tiup),
|
|
.delay_lclkr(delay_lclkr[2]), //tidn,
|
|
.mpw1_b(mpw1_b[2]), //tidn,
|
|
.mpw2_b(mpw2_b[0]), //tidn,
|
|
.vd(vdd),
|
|
.gd(gnd),
|
|
.clk(clk),
|
|
.rst(rst),
|
|
.thold_b(thold_0_b),
|
|
.sg(sg_0),
|
|
.act(ex2_act),
|
|
.scout(ex3_ctl_so),
|
|
.scin(ex3_ctl_si),
|
|
//-----------------
|
|
.din({ ex2_dw_ge,
|
|
ex2_wd_ge,
|
|
ex2_wd_eq,
|
|
ex2_dw_eq,
|
|
f_pic_ex2_fsel,
|
|
ex2_lt_bias,
|
|
ex2_eq_bias_m1}),
|
|
//-----------------
|
|
.dout({ex3_dw_ge, //LAT--
|
|
ex3_wd_ge, //LAT--
|
|
ex3_wd_eq, //LAT--
|
|
ex3_dw_eq, //LAT--
|
|
ex3_fsel, //LAT--
|
|
ex3_lt_bias, //LAT--
|
|
ex3_eq_bias_m1}) //LAT--
|
|
);
|
|
|
|
assign f_eie_ex3_lt_bias = ex3_lt_bias; //output --f_pic
|
|
assign f_eie_ex3_eq_bias_m1 = ex3_eq_bias_m1; //output --f_pic
|
|
|
|
assign ex3_p_expo[1:13] = ex3_p_expo_adj[1:13];
|
|
assign ex3_b_expo[1:13] = ex3_b_expo_adj[1:13];
|
|
|
|
assign f_eie_ex3_wd_ov = ex3_wd_ge; //output --f_pic
|
|
assign f_eie_ex3_dw_ov = ex3_dw_ge; //output --f_pic
|
|
assign f_eie_ex3_wd_ov_if = ex3_wd_eq; //output --f_pic
|
|
assign f_eie_ex3_dw_ov_if = ex3_dw_eq; //output --f_pic
|
|
|
|
assign f_eie_ex3_lzo_expo[1:13] = ex3_p_expo_adj[1:13]; //output --dlza for lzo
|
|
assign f_eie_ex3_b_expo[1:13] = ex3_b_expo[1:13];
|
|
assign f_eie_ex3_tbl_expo[1:13] = ex3_b_expo[1:13];
|
|
////##############################################
|
|
////# EX3 logic
|
|
////##############################################
|
|
|
|
// --++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
|
// --experiment sp_den/dp_fmt
|
|
// -- experimental -- (add 24 for bypass B cases) shift 24 positions to avoid shift right
|
|
// -- SP_den in DP format is normalized, but SP op must give denorm result.
|
|
// -- do not want to shift right in normalizer, scoutdent in aligner.
|
|
// -- ?? problem: LZO positions for bypass case :
|
|
// -- UE=0: set LZO 24 instead of LZO 0 .... ??? can [0:23] be an alias ???
|
|
// -- UE=1: always normalize, LZO does not matter
|
|
// --
|
|
// -- (changed from 24 to 26) for the offset
|
|
//
|
|
//
|
|
// ex3_bexp26(13) <= ex3_b_expo(13); -- 0001
|
|
// ex3_bexp26(12) <= not ex3_b_expo(12); -- 0002
|
|
// ex3_bexp26(11) <= ex3_b_expo(11) xor ex3_bexp26_c(12); -- 0004
|
|
// ex3_bexp26(10) <= not ex3_b_expo(10) xor ex3_bexp26_c(11) ; -- 0008
|
|
// ex3_bexp26(9) <= not ex3_b_expo(9) xor ex3_bexp26_c(10); -- 0016
|
|
// ex3_bexp26(1 to 8) <= ex3_b_expo(1 to 8) xor ex3_bexp26_c(2 to 9) ; -- 0032 ...
|
|
//
|
|
// ex3_bexpo26_9_o_10 <= ex3_b_expo(9) or ex3_b_expo(10) ;
|
|
//
|
|
// ex3_bexp26_c(12) <= ex3_b_expo(12);
|
|
// ex3_bexp26_c(11) <= ex3_b_expo(11) and ex3_b_expo(12);
|
|
// ex3_bexp26_c(10) <= ex3_b_expo(10) or (ex3_b_expo(11) and ex3_b_expo(12) );
|
|
// ex3_bexp26_c(9) <= ex3_bexpo26_9_o_10 or (ex3_b_expo(11) and ex3_b_expo(12) );
|
|
// ex3_bexp26_c(8) <= ex3_bexp26_gg(8) and ex3_bexp26_c(9);
|
|
// ex3_bexp26_c(7) <= ex3_bexp26_gg(7) and ex3_bexp26_c(9);
|
|
// ex3_bexp26_c(6) <= ex3_bexp26_gg(6) and ex3_bexp26_c(9);
|
|
// ex3_bexp26_c(5) <= ex3_bexp26_gg(5) and ex3_bexp26_c(9);
|
|
// ex3_bexp26_c(4) <= ex3_bexp26_gg(4) and ex3_bexp26_c(9);
|
|
// ex3_bexp26_c(3) <= ex3_bexp26_gg(3) and ex3_bexp26_c(9);
|
|
// ex3_bexp26_c(2) <= ex3_bexp26_gg(2) and ex3_bexp26_c(9);
|
|
//
|
|
// ex3_bexp26_gg2(8) <= ex3_b_expo(8) ;
|
|
// ex3_bexp26_gg2(7) <= ex3_b_expo(7) and ex3_b_expo(8) ;
|
|
// ex3_bexp26_gg2(6) <= ex3_b_expo(6) and ex3_b_expo(7) ;
|
|
// ex3_bexp26_gg2(5) <= ex3_b_expo(5) and ex3_b_expo(6) ;
|
|
// ex3_bexp26_gg2(4) <= ex3_b_expo(4) and ex3_b_expo(5) ;
|
|
// ex3_bexp26_gg2(3) <= ex3_b_expo(3) and ex3_b_expo(4) ;
|
|
// ex3_bexp26_gg2(2) <= ex3_b_expo(2) and ex3_b_expo(3) ;
|
|
//
|
|
// ex3_bexp26_gg4(8) <= ex3_bexp26_gg2(8) ;
|
|
// ex3_bexp26_gg4(7) <= ex3_bexp26_gg2(7) ;
|
|
// ex3_bexp26_gg4(6) <= ex3_bexp26_gg2(6) and ex3_bexp26_gg2(8) ;
|
|
// ex3_bexp26_gg4(5) <= ex3_bexp26_gg2(5) and ex3_bexp26_gg2(7) ;
|
|
// ex3_bexp26_gg4(4) <= ex3_bexp26_gg2(4) and ex3_bexp26_gg2(6) ;
|
|
// ex3_bexp26_gg4(3) <= ex3_bexp26_gg2(3) and ex3_bexp26_gg2(5) ;
|
|
// ex3_bexp26_gg4(2) <= ex3_bexp26_gg2(2) and ex3_bexp26_gg2(4) ;
|
|
//
|
|
// ex3_bexp26_gg(8) <= ex3_bexp26_gg4(8) ;
|
|
// ex3_bexp26_gg(7) <= ex3_bexp26_gg4(7) ;
|
|
// ex3_bexp26_gg(6) <= ex3_bexp26_gg4(6) ;
|
|
// ex3_bexp26_gg(5) <= ex3_bexp26_gg4(5) ;
|
|
// ex3_bexp26_gg(4) <= ex3_bexp26_gg4(4) and ex3_bexp26_gg4(8) ;
|
|
// ex3_bexp26_gg(3) <= ex3_bexp26_gg4(3) and ex3_bexp26_gg4(7) ;
|
|
// ex3_bexp26_gg(2) <= ex3_bexp26_gg4(2) and ex3_bexp26_gg4(6) ;
|
|
//
|
|
//
|
|
//
|
|
// ex3_b_expo_fixed(1 to 13) <= --experiment sp_den/dp_fmt
|
|
// ( ex3_b_expo(1 to 13) and (1 to 13 => f_pic_ex3_sp_b) ) or -- DP --experiment sp_den/dp_fmt
|
|
// ( ex3_bexp26(1 to 13) and (1 to 13 => not f_pic_ex3_sp_b) ) ; -- SP --experiment sp_den/dp_fmt
|
|
// --++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
|
|
|
assign ex3_b_expo_fixed[1:13] = ex3_b_expo[1:13];
|
|
|
|
assign f_eie_ex3_use_bexp = ex3_iexp_b_sel;
|
|
|
|
//NAN/shOv
|
|
// fsel
|
|
assign ex3_iexp_b_sel = (f_alg_ex3_sel_byp & (~ex3_fsel) & f_pic_ex3_math_bzer_b) | f_fmt_ex3_fsel_bsel | f_pic_ex3_force_sel_bexp | f_pic_ex3_frsp_ue1; // by opcode
|
|
// frsp with ue=1 always does bypass because must normalize anyway
|
|
// if frsp(ue=1) has a shift unf, then loose bits and canot normalize)
|
|
|
|
assign ex3_iexp[1:13] = (ex3_b_expo_fixed[1:13] & {13{ex3_iexp_b_sel}}) |
|
|
(ex3_p_expo[1:13] & {13{(~ex3_iexp_b_sel)}}); //experiment sp_den/dp_fmt
|
|
|
|
////##############################################
|
|
////# EX4 latches
|
|
////##############################################
|
|
|
|
|
|
tri_rlmreg_p #(.WIDTH(14), .NEEDS_SRESET(0)) ex4_iexp_lat(
|
|
.force_t(force_t), //tidn,
|
|
.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),
|
|
.clk(clk),
|
|
.rst(rst),
|
|
.thold_b(thold_0_b),
|
|
.sg(sg_0),
|
|
.act(ex3_act),
|
|
.scout(ex4_iexp_so),
|
|
.scin(ex4_iexp_si),
|
|
//-----------------
|
|
.din({f_pic_ex3_sp_b,
|
|
ex3_iexp[1:13]}),
|
|
//-----------------
|
|
.dout({ex4_sp_b, //LAT--
|
|
ex4_iexp[1:13]}) //LAT--
|
|
);
|
|
|
|
assign f_eie_ex4_iexp[1:13] = ex4_iexp[1:13]; //output--feov
|
|
|
|
////##############################################
|
|
////# EX4 logic
|
|
////##############################################
|
|
|
|
////############################################
|
|
////# scan
|
|
////############################################
|
|
|
|
assign ex3_bop_si[0:12] = {ex3_bop_so[1:12], f_eie_si};
|
|
assign ex3_pop_si[0:12] = {ex3_pop_so[1:12], ex3_bop_so[0]};
|
|
assign ex3_ctl_si[0:6] = {ex3_ctl_so[1:6], ex3_pop_so[0]};
|
|
assign ex4_iexp_si[0:13] = {ex4_iexp_so[1:13], ex3_ctl_so[0]};
|
|
assign act_si[0:4] = {act_so[1:4], ex4_iexp_so[0]};
|
|
assign f_eie_so = act_so[0];
|
|
|
|
endmodule
|