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.

623 lines
22 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_nrm(
vdd,
gnd,
clk,
rst,
clkoff_b,
act_dis,
flush,
delay_lclkr,
mpw1_b,
mpw2_b,
sg_1,
thold_1,
fpu_enable,
f_nrm_si,
f_nrm_so,
ex4_act_b,
f_lza_ex5_lza_amt_cp1,
f_lza_ex5_lza_dcd64_cp1,
f_lza_ex5_lza_dcd64_cp2,
f_lza_ex5_lza_dcd64_cp3,
f_lza_ex5_sh_rgt_en,
f_add_ex5_res,
f_add_ex5_sticky,
f_pic_ex5_byp_prod_nz,
f_nrm_ex6_res,
f_nrm_ex6_int_sign,
f_nrm_ex6_int_lsbs,
f_nrm_ex6_nrm_sticky_dp,
f_nrm_ex6_nrm_guard_dp,
f_nrm_ex6_nrm_lsb_dp,
f_nrm_ex6_nrm_sticky_sp,
f_nrm_ex6_nrm_guard_sp,
f_nrm_ex6_nrm_lsb_sp,
f_nrm_ex6_exact_zero,
f_nrm_ex5_extra_shift,
f_nrm_ex6_fpscr_wr_dat_dfp,
f_nrm_ex6_fpscr_wr_dat
);
inout vdd;
inout gnd;
input clk;
input rst;
input clkoff_b; // tiup
input act_dis; // ??tidn??
input flush; // ??tidn??
input [4:5] delay_lclkr; // tidn,
input [4:5] mpw1_b; // tidn,
input [0:1] mpw2_b; // tidn,
input sg_1;
input thold_1;
input fpu_enable; //dc_act
input f_nrm_si; // perv
output f_nrm_so; // perv
input ex4_act_b; // act
input [0:7] f_lza_ex5_lza_amt_cp1; // shift amount
input [0:2] f_lza_ex5_lza_dcd64_cp1; //fnrm
input [0:1] f_lza_ex5_lza_dcd64_cp2; //fnrm
input [0:0] f_lza_ex5_lza_dcd64_cp3; //fnrm
input f_lza_ex5_sh_rgt_en;
input [0:162] f_add_ex5_res; // data to shift
input f_add_ex5_sticky; // or into sticky
input f_pic_ex5_byp_prod_nz;
output [0:52] f_nrm_ex6_res; //rnd,
output f_nrm_ex6_int_sign; //rnd, (151:162)
output [1:12] f_nrm_ex6_int_lsbs; //rnd, (151:162)
output f_nrm_ex6_nrm_sticky_dp; //rnd,
output f_nrm_ex6_nrm_guard_dp; //rnd,
output f_nrm_ex6_nrm_lsb_dp; //rnd,
output f_nrm_ex6_nrm_sticky_sp; //rnd,
output f_nrm_ex6_nrm_guard_sp; //rnd,
output f_nrm_ex6_nrm_lsb_sp; //rnd,
output f_nrm_ex6_exact_zero; //rnd,
output f_nrm_ex5_extra_shift; //expo_ov,
output [0:3] f_nrm_ex6_fpscr_wr_dat_dfp; //fpscr, (17:20)
output [0:31] f_nrm_ex6_fpscr_wr_dat; //fpscr, (21:52)
// 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 ex4_act;
wire ex5_act;
wire [0:2] act_spare_unused;
//-----------------
wire [0:3] act_so; //SCAN
wire [0:3] act_si; //SCAN
wire [0:52] ex6_res_so; //SCAN
wire [0:52] ex6_res_si; //SCAN
wire [0:3] ex6_nrm_lg_so; //SCAN
wire [0:3] ex6_nrm_lg_si; //SCAN
wire [0:2] ex6_nrm_x_so; //SCAN
wire [0:2] ex6_nrm_x_si; //SCAN
wire [0:12] ex6_nrm_pass_so; //SCAN
wire [0:12] ex6_nrm_pass_si; //SCAN
wire [0:35] ex6_fmv_so; //SCAN
wire [0:35] ex6_fmv_si; //SCAN
//-----------------
wire [26:72] ex5_sh2;
wire ex5_sh4_25; //shifting
wire ex5_sh4_54; //shifting
wire [0:53] ex5_nrm_res; //shifting
wire [0:53] ex5_sh5_x_b;
wire [0:53] ex5_sh5_y_b;
wire ex5_lt064_x; //sticky
wire ex5_lt128_x; //sticky
wire ex5_lt016_x; //sticky
wire ex5_lt032_x; //sticky
wire ex5_lt048_x; //sticky
wire ex5_lt016; //sticky
wire ex5_lt032; //sticky
wire ex5_lt048; //sticky
wire ex5_lt064; //sticky
wire ex5_lt080; //sticky
wire ex5_lt096; //sticky
wire ex5_lt112; //sticky
wire ex5_lt128; //sticky
wire ex5_lt04_x; //sticky
wire ex5_lt08_x; //sticky
wire ex5_lt12_x; //sticky
wire ex5_lt01_x; //sticky
wire ex5_lt02_x; //sticky
wire ex5_lt03_x; //sticky
wire ex5_sticky_sp; //sticky
wire ex5_sticky_dp; //sticky
wire ex5_sticky16_dp; //sticky
wire ex5_sticky16_sp; //sticky
wire [0:10] ex5_or_grp16; //sticky
wire [0:14] ex5_lt; //sticky
wire ex5_exact_zero; //sticky
wire ex5_exact_zero_b; //sticky
//------------------
wire [0:52] ex6_res; // LATCH OUTPUTS
wire ex6_nrm_sticky_dp;
wire ex6_nrm_guard_dp;
wire ex6_nrm_lsb_dp;
wire ex6_nrm_sticky_sp;
wire ex6_nrm_guard_sp;
wire ex6_nrm_lsb_sp;
wire ex6_exact_zero;
wire ex6_int_sign;
wire [1:12] ex6_int_lsbs;
wire [0:31] ex6_fpscr_wr_dat;
wire [0:3] ex6_fpscr_wr_dat_dfp;
wire ex5_rgt_4more;
wire ex5_rgt_3more;
wire ex5_rgt_2more;
wire ex5_shift_extra_cp2;
wire unused;
wire ex5_sticky_dp_x2_b;
wire ex5_sticky_dp_x1_b;
wire ex5_sticky_dp_x1;
wire ex5_sticky_sp_x2_b;
wire ex5_sticky_sp_x1_b;
wire ex5_sticky_sp_x1;
wire ex6_d1clk;
wire ex6_d2clk;
//wire [0:`NCLK_WIDTH-1] ex6_lclk;
wire ex6_lclk;
wire ex5_sticky_stuff;
// sticky bit sp/dp does not look at all the bits
assign unused = |(ex5_sh2[41:54]) | |(ex5_nrm_res[0:53]) | ex5_sticky_sp | ex5_sticky_dp | ex5_exact_zero;
////############################################
//# 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)
);
tri_lcbnd ex6_lcb(
.delay_lclkr(delay_lclkr[5]), // tidn
.mpw1_b(mpw1_b[5]), // tidn
.mpw2_b(mpw2_b[1]), // tidn
.force_t(force_t), // tidn
.clk(clk),
.rst(rst), //in
.vd(vdd), //inout
.gd(gnd), //inout
.act(ex5_act), //in
.sg(sg_0), //in
.thold_b(thold_0_b), //in
.d1clk(ex6_d1clk), //out
.d2clk(ex6_d2clk), //out
.lclk(ex6_lclk) //out
);
////############################################
//# ACT LATCHES
////############################################
assign ex4_act = (~ex4_act_b);
tri_rlmreg_p #(.WIDTH(4), .NEEDS_SRESET(0)) act_lat(
.force_t(force_t), //i-- tidn,
.d_mode(tiup),
.delay_lclkr(delay_lclkr[4]), //i-- tidn,
.mpw1_b(mpw1_b[4]), //i-- tidn,
.mpw2_b(mpw2_b[0]), //i-- tidn,
.vd(vdd),
.gd(gnd),
.clk(clk),
.rst(rst),
.thold_b(thold_0_b),
.sg(sg_0),
.act(fpu_enable),
.scout(act_so[0:3]),
.scin(act_si[0:3]),
//-----------------
.din({ act_spare_unused[0],
act_spare_unused[1],
ex4_act,
act_spare_unused[2]}),
//-----------------
.dout({ act_spare_unused[0],
act_spare_unused[1],
ex5_act,
act_spare_unused[2]})
);
////##############################################
//# EX5 logic: shifting
////##############################################
fu_nrm_sh sh(
.f_lza_ex5_sh_rgt_en(f_lza_ex5_sh_rgt_en), //i--
.f_lza_ex5_lza_amt_cp1(f_lza_ex5_lza_amt_cp1[2:7]), //i--
.f_lza_ex5_lza_dcd64_cp1(f_lza_ex5_lza_dcd64_cp1[0:2]), //i--
.f_lza_ex5_lza_dcd64_cp2(f_lza_ex5_lza_dcd64_cp2[0:1]), //i--
.f_lza_ex5_lza_dcd64_cp3(f_lza_ex5_lza_dcd64_cp3[0:0]), //i--
.f_add_ex5_res(f_add_ex5_res[0:162]), //i--
.ex5_shift_extra_cp1(f_nrm_ex5_extra_shift), //o-- <30ish> loads feov
.ex5_shift_extra_cp2(ex5_shift_extra_cp2), //o-- <2> loads sticky sp/dp
.ex5_sh4_25(ex5_sh4_25), //o--
.ex5_sh4_54(ex5_sh4_54), //o--
.ex5_sh2_o(ex5_sh2[26:72]), //o--
.ex5_sh5_x_b(ex5_sh5_x_b[0:53]), //o--
.ex5_sh5_y_b(ex5_sh5_y_b[0:53]) //o--
);
assign ex5_nrm_res[0:53] = (~(ex5_sh5_x_b[0:53] & ex5_sh5_y_b[0:53]));
////##############################################
//# EX5 logic: stciky bit
////##############################################
//# thermometer decode 1 ---------------
//#
//# the smaller the shift the more sticky bits.
//# the multiple of 16 shifter is 0:68 ... bits after 68 are known sticky DP.
//# 53-24=29 extra sp bits 68-29 = 39
//# bits after 39 are known sticky SP.
assign ex5_lt064_x = (~(f_lza_ex5_lza_amt_cp1[0] | f_lza_ex5_lza_amt_cp1[1])); // 00
assign ex5_lt128_x = (~(f_lza_ex5_lza_amt_cp1[0])); // 00 01
assign ex5_lt016_x = (~(f_lza_ex5_lza_amt_cp1[2] | f_lza_ex5_lza_amt_cp1[3])); // 00
assign ex5_lt032_x = (~(f_lza_ex5_lza_amt_cp1[2])); // 00 01
assign ex5_lt048_x = (~(f_lza_ex5_lza_amt_cp1[2] & f_lza_ex5_lza_amt_cp1[3])); // 00 01 10
assign ex5_lt016 = ex5_lt064_x & ex5_lt016_x; //tail=067 sticky_dp=069:162 sticky_sp=039:162
assign ex5_lt032 = ex5_lt064_x & ex5_lt032_x; //tail=083 sticky_dp=085:162 sticky_sp=055:162
assign ex5_lt048 = ex5_lt064_x & ex5_lt048_x; //tail=099 sticky_dp=101:162 sticky_sp=071:162
assign ex5_lt064 = ex5_lt064_x; //tail=115 sticky_dp=117:162 sticky_sp=087:162
assign ex5_lt080 = ex5_lt064_x | (ex5_lt128_x & ex5_lt016_x); //tail=131 sticky_dp=133:162 sticky_sp=103:162
assign ex5_lt096 = ex5_lt064_x | (ex5_lt128_x & ex5_lt032_x); //tail=147 sticky_dp=149:162 sticky_sp=119:162
assign ex5_lt112 = ex5_lt064_x | (ex5_lt128_x & ex5_lt048_x); //tail=163 sticky_dp=xxxxxxx sticky_sp=135:162
assign ex5_lt128 = ex5_lt128_x; //tail=179 sticky_dp=xxxxxxx sticky_sp=151:162
// 1111xxxx shift right 1 -> 16 (shift right sticky groups of 16 may be off by one from shift left sticky groups)
// 1110xxxx shift right 17 -> 32
// 1101xxxx shift right 33 -> 48
// 1100xxxx shift right 49 -> 64
// x0xxxxxx shift > 64
// 0xxxxxxx shift > 64
// for shift right Amt[0]==Amt[1]==shRgtEn
// xx00_dddd Right64, then Left00 4 more sticky16 group than 0000_dddd
// xx01_dddd Right64, then Left16 3 more sticky16 group than 0000_dddd
// xx10_dddd Right64, then Left32 2 more sticky16 group than 0000_dddd
// xx11_dddd Right64, then Left48 1 more sticky16 group than 0000_dddd
assign ex5_rgt_2more = f_lza_ex5_sh_rgt_en & ((~f_lza_ex5_lza_amt_cp1[2]) | (~f_lza_ex5_lza_amt_cp1[3])); // 234
assign ex5_rgt_3more = f_lza_ex5_sh_rgt_en & ((~f_lza_ex5_lza_amt_cp1[2])); // 23
assign ex5_rgt_4more = f_lza_ex5_sh_rgt_en & ((~f_lza_ex5_lza_amt_cp1[2]) & (~f_lza_ex5_lza_amt_cp1[3])); // 2
//#------------------------
//# sticky group 16 ors
//#------------------------
fu_nrm_or16 or16(
.f_add_ex5_res(f_add_ex5_res[0:162]), //i--
.ex5_or_grp16(ex5_or_grp16[0:10]) //o--
);
//#------------------------
//# enable the 16 bit ors
//#------------------------
assign ex5_sticky_stuff = (f_pic_ex5_byp_prod_nz) | (f_add_ex5_sticky);
// 71: 86
// 87:102
//103:118
//119:134
//135:150
//151:162
// so group16s match for sp/dp
assign ex5_sticky16_dp = (ex5_or_grp16[1] & ex5_rgt_4more) | (ex5_or_grp16[2] & ex5_rgt_3more) | (ex5_or_grp16[3] & ex5_rgt_2more) | (ex5_or_grp16[4] & f_lza_ex5_sh_rgt_en) | (ex5_or_grp16[5] & (ex5_lt016 | f_lza_ex5_sh_rgt_en)) | (ex5_or_grp16[6] & (ex5_lt032 | f_lza_ex5_sh_rgt_en)) | (ex5_or_grp16[7] & (ex5_lt048 | f_lza_ex5_sh_rgt_en)) | (ex5_or_grp16[8] & (ex5_lt064 | f_lza_ex5_sh_rgt_en)) | (ex5_or_grp16[9] & (ex5_lt080 | f_lza_ex5_sh_rgt_en)) | (ex5_or_grp16[10] & (ex5_lt096 | f_lza_ex5_sh_rgt_en)) | (ex5_sh2[70]) | (ex5_sh2[71]) | (ex5_sh2[72]) | (ex5_sticky_stuff); // so group16s match for sp/dp
// 39: 54
// 55: 70
// 71: 86
// 87:102
//103:118
//119:134
//135:150
assign ex5_sticky16_sp = (ex5_or_grp16[0] & ex5_rgt_3more) | (ex5_or_grp16[1] & ex5_rgt_2more) | (ex5_or_grp16[2] & f_lza_ex5_sh_rgt_en) | (ex5_or_grp16[3] & (ex5_lt016 | f_lza_ex5_sh_rgt_en)) | (ex5_or_grp16[4] & (ex5_lt032 | f_lza_ex5_sh_rgt_en)) | (ex5_or_grp16[5] & (ex5_lt048 | f_lza_ex5_sh_rgt_en)) | (ex5_or_grp16[6] & (ex5_lt064 | f_lza_ex5_sh_rgt_en)) | (ex5_or_grp16[7] & (ex5_lt080 | f_lza_ex5_sh_rgt_en)) | (ex5_or_grp16[8] & (ex5_lt096 | f_lza_ex5_sh_rgt_en)) | (ex5_or_grp16[9] & (ex5_lt112 | f_lza_ex5_sh_rgt_en)) | (ex5_or_grp16[10] & (ex5_lt128 | f_lza_ex5_sh_rgt_en)) | (ex5_sticky_stuff); //151:162
assign ex5_exact_zero_b = ex5_or_grp16[0] | ex5_or_grp16[1] | ex5_or_grp16[2] | ex5_or_grp16[3] | ex5_or_grp16[4] | ex5_or_grp16[5] | ex5_or_grp16[6] | ex5_or_grp16[7] | ex5_or_grp16[8] | ex5_or_grp16[9] | ex5_or_grp16[10] | (ex5_sticky_stuff);
assign ex5_exact_zero = (~ex5_exact_zero_b);
//#------------------------
//# thermometer decode 2
//#------------------------
assign ex5_lt04_x = (~(f_lza_ex5_lza_amt_cp1[4] | f_lza_ex5_lza_amt_cp1[5])); // 00
assign ex5_lt08_x = (~(f_lza_ex5_lza_amt_cp1[4])); // 00 01
assign ex5_lt12_x = (~(f_lza_ex5_lza_amt_cp1[4] & f_lza_ex5_lza_amt_cp1[5])); // 00 01 10
assign ex5_lt01_x = (~(f_lza_ex5_lza_amt_cp1[6] | f_lza_ex5_lza_amt_cp1[7])); // 00
assign ex5_lt02_x = (~(f_lza_ex5_lza_amt_cp1[6])); // 00 01
assign ex5_lt03_x = (~(f_lza_ex5_lza_amt_cp1[6] & f_lza_ex5_lza_amt_cp1[7])); // 00 01 10
assign ex5_lt[0] = ex5_lt04_x & ex5_lt01_x; // 1
assign ex5_lt[1] = ex5_lt04_x & ex5_lt02_x; // 2
assign ex5_lt[2] = ex5_lt04_x & ex5_lt03_x; // 3
assign ex5_lt[3] = ex5_lt04_x; // 4
assign ex5_lt[4] = ex5_lt04_x | (ex5_lt08_x & ex5_lt01_x); // 5
assign ex5_lt[5] = ex5_lt04_x | (ex5_lt08_x & ex5_lt02_x); // 6
assign ex5_lt[6] = ex5_lt04_x | (ex5_lt08_x & ex5_lt03_x); // 7
assign ex5_lt[7] = (ex5_lt08_x); // 8
assign ex5_lt[8] = ex5_lt08_x | (ex5_lt12_x & ex5_lt01_x); // 9
assign ex5_lt[9] = ex5_lt08_x | (ex5_lt12_x & ex5_lt02_x); //10
assign ex5_lt[10] = ex5_lt08_x | (ex5_lt12_x & ex5_lt03_x); //11
assign ex5_lt[11] = (ex5_lt12_x); //12
assign ex5_lt[12] = ex5_lt12_x | ex5_lt01_x; //13
assign ex5_lt[13] = ex5_lt12_x | ex5_lt02_x; //14
assign ex5_lt[14] = ex5_lt12_x | ex5_lt03_x; //15
//#------------------------
//# final sticky bits
//#------------------------
// lt 01
// lt 02
// lt 03
// lt 04
// lt 05
// lt 06
// lt 07
// lt 08
// lt 09
// lt 10
// lt 11
// lt 12
// lt 13
// lt 14
assign ex5_sticky_sp_x1 = (ex5_lt[14] & ex5_sh2[40]) | (ex5_lt[13] & ex5_sh2[39]) | (ex5_lt[12] & ex5_sh2[38]) | (ex5_lt[11] & ex5_sh2[37]) | (ex5_lt[10] & ex5_sh2[36]) | (ex5_lt[9] & ex5_sh2[35]) | (ex5_lt[8] & ex5_sh2[34]) | (ex5_lt[7] & ex5_sh2[33]) | (ex5_lt[6] & ex5_sh2[32]) | (ex5_lt[5] & ex5_sh2[31]) | (ex5_lt[4] & ex5_sh2[30]) | (ex5_lt[3] & ex5_sh2[29]) | (ex5_lt[2] & ex5_sh2[28]) | (ex5_lt[1] & ex5_sh2[27]) | (ex5_lt[0] & ex5_sh2[26]) | (ex5_sticky16_sp); // lt 15
assign ex5_sticky_sp_x2_b = (~((~ex5_shift_extra_cp2) & ex5_sh4_25));
assign ex5_sticky_sp_x1_b = (~ex5_sticky_sp_x1);
assign ex5_sticky_sp = (~(ex5_sticky_sp_x1_b & ex5_sticky_sp_x2_b));
// lt 01
// lt 02
// lt 03
// lt 04
// lt 05
// lt 06
// lt 07
// lt 08
// lt 09
// lt 10
// lt 11
// lt 12
// lt 13
// lt 14
assign ex5_sticky_dp_x1 = (ex5_lt[14] & ex5_sh2[69]) | (ex5_lt[13] & ex5_sh2[68]) | (ex5_lt[12] & ex5_sh2[67]) | (ex5_lt[11] & ex5_sh2[66]) | (ex5_lt[10] & ex5_sh2[65]) | (ex5_lt[9] & ex5_sh2[64]) | (ex5_lt[8] & ex5_sh2[63]) | (ex5_lt[7] & ex5_sh2[62]) | (ex5_lt[6] & ex5_sh2[61]) | (ex5_lt[5] & ex5_sh2[60]) | (ex5_lt[4] & ex5_sh2[59]) | (ex5_lt[3] & ex5_sh2[58]) | (ex5_lt[2] & ex5_sh2[57]) | (ex5_lt[1] & ex5_sh2[56]) | (ex5_lt[0] & ex5_sh2[55]) | (ex5_sticky16_dp); // lt 15
assign ex5_sticky_dp_x2_b = (~((~ex5_shift_extra_cp2) & ex5_sh4_54));
assign ex5_sticky_dp_x1_b = (~ex5_sticky_dp_x1);
assign ex5_sticky_dp = (~(ex5_sticky_dp_x1_b & ex5_sticky_dp_x2_b));
////##############################################
//# EX6 latches
////##############################################
// , ibuf => true,
tri_nand2_nlats #(.WIDTH(53), .NEEDS_SRESET(0)) ex6_res_lat(
.vd(vdd),
.gd(gnd),
.clk(clk), //lclk.clk
.rst(rst),
.d1clk(ex6_d1clk),
.d2clk(ex6_d2clk),
.scanin(ex6_res_si),
.scanout(ex6_res_so),
.a1(ex5_sh5_x_b[0:52]),
.a2(ex5_sh5_y_b[0:52]),
.qb(ex6_res[0:52]) //LAT--
);
// , ibuf => true,
tri_nand2_nlats #(.WIDTH(4), .NEEDS_SRESET(0)) ex6_nrm_lg_lat(
.vd(vdd),
.gd(gnd),
.clk(clk), //lclk.clk
.rst(rst),
.d1clk(ex6_d1clk),
.d2clk(ex6_d2clk),
.scanin(ex6_nrm_lg_si),
.scanout(ex6_nrm_lg_so),
//-----------------
.a1({ex5_sh5_x_b[23],
ex5_sh5_x_b[24],
ex5_sh5_x_b[52],
ex5_sh5_x_b[53]}),
//-----------------
.a2({ex5_sh5_y_b[23],
ex5_sh5_y_b[24],
ex5_sh5_y_b[52],
ex5_sh5_y_b[53]}),
//-----------------
.qb({ex6_nrm_lsb_sp, //LAT-- --sp lsb
ex6_nrm_guard_sp, //LAT-- --sp guard
ex6_nrm_lsb_dp, //LAT-- --dp lsb
ex6_nrm_guard_dp}) //LAT-- --dp guard
);
// , ibuf => true,
tri_nand2_nlats #(.WIDTH(3), .NEEDS_SRESET(0)) ex6_nrm_x_lat(
.vd(vdd),
.gd(gnd),
.clk(clk), //lclk.clk
.rst(rst),
.d1clk(ex6_d1clk),
.d2clk(ex6_d2clk),
.scanin(ex6_nrm_x_si),
.scanout(ex6_nrm_x_so),
//-----------------
.a1({ ex5_sticky_sp_x2_b,
ex5_sticky_dp_x2_b,
ex5_exact_zero_b}),
//-----------------
.a2({ ex5_sticky_sp_x1_b,
ex5_sticky_dp_x1_b,
tiup}),
//-----------------
.qb({ ex6_nrm_sticky_sp, //LAT--
ex6_nrm_sticky_dp, //LAT--
ex6_exact_zero}) //LAT--
);
tri_rlmreg_p #(.WIDTH(13), .IBUF(1'B1), .NEEDS_SRESET(0)) ex6_nrm_pass_lat(
.force_t(force_t), //i-- tidn,
.d_mode(tiup),
.delay_lclkr(delay_lclkr[5]), //i-- tidn,
.mpw1_b(mpw1_b[5]), //i-- tidn,
.mpw2_b(mpw2_b[1]), //i-- tidn,
.vd(vdd),
.gd(gnd),
.clk(clk),
.rst(rst),
.thold_b(thold_0_b),
.sg(sg_0),
.act(ex5_act),
.scout(ex6_nrm_pass_so),
.scin(ex6_nrm_pass_si),
//-----------------
.din({f_add_ex5_res[99],
f_add_ex5_res[151:162]}), // (151:162)
//-----------------
.dout({ex6_int_sign, //LAT--
ex6_int_lsbs[1:12]}) //LAT-- --(151:162)
);
tri_rlmreg_p #(.WIDTH(36), .IBUF(1'B1), .NEEDS_SRESET(1)) ex6_fmv_lat(
.force_t(force_t), //i-- tidn,
.d_mode(tiup),
.delay_lclkr(delay_lclkr[5]), //i-- tidn,
.mpw1_b(mpw1_b[5]), //i-- tidn,
.mpw2_b(mpw2_b[1]), //i-- tidn,
.vd(vdd),
.gd(gnd),
.clk(clk),
.rst(rst),
.thold_b(thold_0_b),
.sg(sg_0),
.act(ex5_act),
.scout(ex6_fmv_so),
.scin(ex6_fmv_si),
//-----------------
.din(f_add_ex5_res[17:52]), //LAT
//-----------------
.dout({ex6_fpscr_wr_dat_dfp[0:3],
ex6_fpscr_wr_dat[0:31]}) //LAT
);
assign f_nrm_ex6_res = ex6_res[0:52]; //output--rnd
assign f_nrm_ex6_nrm_lsb_sp = ex6_nrm_lsb_sp; //output--rnd
assign f_nrm_ex6_nrm_guard_sp = ex6_nrm_guard_sp; //output--rnd
assign f_nrm_ex6_nrm_sticky_sp = ex6_nrm_sticky_sp; //output--rnd
assign f_nrm_ex6_nrm_lsb_dp = ex6_nrm_lsb_dp; //output--rnd
assign f_nrm_ex6_nrm_guard_dp = ex6_nrm_guard_dp; //output--rnd
assign f_nrm_ex6_nrm_sticky_dp = ex6_nrm_sticky_dp; //output--rnd
assign f_nrm_ex6_exact_zero = ex6_exact_zero; //output--rnd
assign f_nrm_ex6_int_lsbs = ex6_int_lsbs[1:12]; //output--rnd (151:162)
assign f_nrm_ex6_fpscr_wr_dat = ex6_fpscr_wr_dat[0:31]; //output--fpscr, (21:52)
assign f_nrm_ex6_fpscr_wr_dat_dfp = ex6_fpscr_wr_dat_dfp[0:3]; //output--fpscr (17:20)
assign f_nrm_ex6_int_sign = ex6_int_sign; //output--rnd (151:162)
////############################################
//# scan
////############################################
assign act_si[0:3] = {act_so[1:3], f_nrm_si};
assign ex6_res_si[0:52] = {ex6_res_so[1:52], act_so[0]};
assign ex6_nrm_lg_si[0:3] = {ex6_nrm_lg_so[1:3], ex6_res_so[0]};
assign ex6_nrm_x_si[0:2] = {ex6_nrm_x_so[1:2], ex6_nrm_lg_so[0]};
assign ex6_nrm_pass_si[0:12] = {ex6_nrm_pass_so[1:12], ex6_nrm_x_so[0]};
assign ex6_fmv_si[0:35] = {ex6_fmv_so[1:35], ex6_nrm_pass_so[0]};
assign f_nrm_so = ex6_fmv_so[0];
endmodule