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.

883 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
//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
//@@ replicate critical select latch to PO
//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
//xxx_lcbor: tri_lcbor generic map (expand_type => expand_type ) port map (
// clkoff_b => clkoff_b,
// thold => pc_func_sl_thold_0(0),
// sg => pc_sg_0(0),
// act_dis => act_dis,
// force => force,
// thold_b => pc_func_sl_thold_0_b );
//
// print "alter --d_mode 0 b\n";
// print "alter delay_lclkr 0 b\n";
// print "alter mpw1_b 1 b\n";
// print "alter mpw2_b 1 b\n";
// print "alter clkoff_b 1 b\n";
// print "alter dis_act 0 b\n";
// print "alter scan_diag 0 b\n";
// PPC FP STORE reformating
// (1) DP STORE : sp_denorm needs to normalize
// (2) SP STORE : dp_norm may need to denormalize
// (3) stfwix : pass througn
`include "tri_a2o.vh"
module fu_sto(
vdd,
gnd,
clkoff_b,
act_dis,
flush,
delay_lclkr,
mpw1_b,
mpw2_b,
sg_1,
thold_1,
fpu_enable,
nclk,
f_sto_si,
f_sto_so,
f_dcd_ex1_sto_act,
f_dcd_ex1_sto_v,
f_fpr_ex2_s_expo_extra,
f_fpr_ex2_s_par,
f_sto_ex3_s_parity_check,
f_dcd_ex1_sto_dp,
f_dcd_ex1_sto_sp,
f_dcd_ex1_sto_wd,
f_byp_ex1_s_sign,
f_byp_ex1_s_expo,
f_byp_ex1_s_frac,
f_sto_ex3_sto_data
);
inout vdd;
inout gnd;
input clkoff_b; // tiup
input act_dis; // ??tidn??
input flush; // ??tidn??
input [1:2] delay_lclkr; // tidn,
input [1:2] 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_sto_si;
output f_sto_so;
input f_dcd_ex1_sto_act;
input f_dcd_ex1_sto_v;
input [0:1] f_fpr_ex2_s_expo_extra;
input [0:7] f_fpr_ex2_s_par;
output f_sto_ex3_s_parity_check; // raw calculation
input f_dcd_ex1_sto_dp;
input f_dcd_ex1_sto_sp;
input f_dcd_ex1_sto_wd;
input f_byp_ex1_s_sign;
input [1:11] f_byp_ex1_s_expo;
input [0:52] f_byp_ex1_s_frac;
output [0:63] f_sto_ex3_sto_data;
// end ports
// ENTITY
parameter tiup = 1'b1;
parameter tidn = 1'b0;
wire sg_0;
wire thold_0_b;
wire thold_0;
wire ex1_act;
wire ex2_act;
(* analysis_not_referenced="TRUE" *)
wire [0:1] spare_unused;
//-----------------
wire [0:3] act_so; //SCAN
wire [0:3] act_si; //SCAN
wire [0:2] ex2_sins_so;
wire [0:2] ex2_sins_si;
wire [0:64] ex2_sop_so;
wire [0:64] ex2_sop_si;
wire [0:72] ex3_sto_so;
wire [0:72] ex3_sto_si;
//-----------------
wire ex2_s_sign;
wire [1:11] ex2_s_expo;
wire [0:52] ex2_s_frac;
wire [0:63] ex2_sto_data;
wire [0:63] ex3_sto_data;
wire ex2_sto_dp;
wire ex2_sto_sp;
wire ex2_sto_wd;
wire ex2_den_ramt8_02;
wire ex2_den_ramt8_18;
wire ex2_den_ramt4_12;
wire ex2_den_ramt4_08;
wire ex2_den_ramt4_04;
wire ex2_den_ramt4_00;
wire ex2_den_ramt1_03;
wire ex2_den_ramt1_02;
wire ex2_den_ramt1_01;
wire ex2_den_ramt1_00;
wire ex2_expo_eq896;
wire ex2_expo_ge896;
wire ex2_expo_lt896;
wire ex2_sts_lt896;
wire ex2_sts_ge896;
wire ex2_sts_expo_nz;
wire ex2_fixden;
wire ex2_fixden_small;
wire ex2_fixden_big;
wire ex2_std_nonden;
wire ex2_std_fixden_big;
wire ex2_std_fixden_small;
wire ex2_std_nonbig;
wire ex2_std_nonden_wd;
wire ex2_std_lamt8_02;
wire ex2_std_lamt8_10;
wire ex2_std_lamt8_18;
wire ex2_std_lamt2_0;
wire ex2_std_lamt2_2;
wire ex2_std_lamt2_4;
wire ex2_std_lamt2_6;
wire ex2_std_lamt1_0;
wire ex2_std_lamt1_1;
wire [0:23] ex2_sts_sh8;
wire [0:23] ex2_sts_sh4;
wire [0:23] ex2_sts_sh1;
wire [0:23] ex2_sts_nrm;
wire [1:23] ex2_sts_frac;
wire [1:8] ex2_sts_expo;
wire [0:10] ex2_clz02_or;
wire [0:10] ex2_clz02_enc4;
wire [0:5] ex2_clz04_or;
wire [0:5] ex2_clz04_enc3;
wire [0:5] ex2_clz04_enc4;
wire [0:2] ex2_clz08_or;
wire [0:2] ex2_clz08_enc2;
wire [0:2] ex2_clz08_enc3;
wire [0:2] ex2_clz08_enc4;
wire [0:1] ex2_clz16_or;
wire [0:1] ex2_clz16_enc1;
wire [0:1] ex2_clz16_enc2;
wire [0:1] ex2_clz16_enc3;
wire [0:1] ex2_clz16_enc4;
wire [0:4] ex2_sto_clz;
wire [1:11] ex2_expo_nonden;
wire [1:11] ex2_expo_fixden;
wire [1:11] ex2_std_expo;
wire [1:52] ex2_std_frac_nrm;
wire [0:23] ex2_std_sh8;
wire [0:23] ex2_std_sh2;
wire [1:23] ex2_std_frac_den;
wire ex2_ge874;
wire ex2_any_edge;
wire [0:63] ex3_sto_data_rot0_b;
wire [0:63] ex3_sto_data_rot1_b;
wire [0:3] ex3_sto_wd;
wire [0:3] ex3_sto_sp;
wire force_t;
wire ex2_s_party_chick;
wire ex3_s_party_chick;
wire [0:7] ex2_s_party;
wire ex2_sto_v;
(* analysis_not_referenced="TRUE" *) // unused
wire [0:1] unused;
////############################################
////# pervasive
////############################################
assign unused[0] = ex2_sts_sh1[0] | ex2_sts_nrm[0] | ex2_std_sh2[0];
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 LATCHES
////############################################
assign ex1_act = f_dcd_ex1_sto_act;
tri_rlmreg_p #(.WIDTH(4)) act_lat(
.vd(vdd),
.gd(gnd),
.nclk(nclk),
.force_t(force_t), // tidn
.d_mode(tiup),
.delay_lclkr(delay_lclkr[1]), // tidn,
.mpw1_b(mpw1_b[1]), // tidn,
.mpw2_b(mpw2_b[0]), // tidn,
.act(tiup),
.thold_b(thold_0_b),
.sg(sg_0),
.scout(act_so),
.scin(act_si),
//-----------------
.din({ ex1_act,
spare_unused[0],
spare_unused[1],
f_dcd_ex1_sto_v}),
//-----------------
.dout({ ex2_act,
spare_unused[0],
spare_unused[1],
ex2_sto_v})
);
assign unused[1] = ex2_sto_v;
////##############################################
////# EX2 latch inputs from ex1
////##############################################
tri_rlmreg_p #(.WIDTH(3), .IBUF(1'B1)) ex2_sins_lat(
.force_t(force_t), //tidn,
.d_mode(tiup),
.delay_lclkr(delay_lclkr[1]), //tidn,
.mpw1_b(mpw1_b[1]), //tidn,
.mpw2_b(mpw2_b[0]), //tidn,
.nclk(nclk),
.thold_b(thold_0_b),
.sg(sg_0),
.act(ex1_act),
.vd(vdd),
.gd(gnd),
.scout(ex2_sins_so),
.scin(ex2_sins_si),
//-----------------
.din({ f_dcd_ex1_sto_dp,
f_dcd_ex1_sto_sp,
f_dcd_ex1_sto_wd}),
//-----------------
.dout({ ex2_sto_dp,
ex2_sto_sp,
ex2_sto_wd})
);
tri_rlmreg_p #(.WIDTH(65), .NEEDS_SRESET(0), .IBUF(1'B1)) ex2_sop_lat(
.force_t(force_t), //tidn,
.d_mode(tiup),
.delay_lclkr(delay_lclkr[1]), //tidn,
.mpw1_b(mpw1_b[1]), //tidn,
.mpw2_b(mpw2_b[0]), //tidn,
.nclk(nclk),
.thold_b(thold_0_b),
.sg(sg_0),
.act(ex1_act),
.vd(vdd),
.gd(gnd),
.scout(ex2_sop_so),
.scin(ex2_sop_si),
//-----------------
.din({ f_byp_ex1_s_sign,
f_byp_ex1_s_expo[1:11],
f_byp_ex1_s_frac[0:52]}),
//-----------------
.dout({ ex2_s_sign,
ex2_s_expo[1:11],
ex2_s_frac[0:52]})
);
////##############################################
////# EX2 logic
////##############################################
////###################################################
////# shifting for store sp
////###################################################
// output of dp instr with expo below x381 needs to denormalize to sp format.
// x380 d896 011_1000_0000 => right 1 11 11 11 <== treat as special case
// x37F d895 011_0111_1111 => right 2 00 00 00
// x37E d894 011_0111_1110 => right 3 00 00 01
// x37D d893 011_0111_1101 => right 4 00 00 10
// x37C d892 011_0111_1100 => right 5 00 00 11
// x37B d891 011_0111_1011 => right 6 00 01 00
// x37A d890 011_0111_1010 => right 7 00 01 01
// x379 d889 011_0111_1001 => right 8 00 01 10
// x378 d888 011_0111_1000 => right 9 00 01 11
// x377 d887 011_0111_0111 => right 10 00 10 00
// x376 d886 011_0111_0110 => right 11 00 10 01
// x375 d885 011_0111_0101 => right 12 00 10 10
// x374 d884 011_0111_0100 => right 13 00 10 11
// x373 d883 011_0111_0011 => right 14 00 11 00
// x372 d882 011_0111_0010 => right 15 00 11 01
// x371 d881 011_0111_0001 => right 16 00 11 10
// x370 d880 011_0111_0000 => right 17 00 11 11
// x36F d879 011_0110_1111 => right 18 01 00 00
// x36E d878 011_0110_1110 => right 19 01 00 01
// x36B d877 011_0110_1101 => right 20 01 00 10
// x36C d876 011_0110_1100 => right 21 01 00 11
// x36B d875 011_0110_1011 => right 22 01 01 00
// x36A d874 011_0110_1010 => right 23 01 01 01
// x369 d873 011_0110_1001 => right 24 01 01 10 ===> result is zero after here
//------------------------
// 000 0000 0011
// 123 4567 8901
assign ex2_den_ramt8_02 = ex2_s_expo[6] & ex2_s_expo[7];
assign ex2_den_ramt8_18 = ex2_s_expo[6] & (~ex2_s_expo[7]);
assign ex2_den_ramt4_12 = (~ex2_s_expo[8]) & (~ex2_s_expo[9]);
assign ex2_den_ramt4_08 = (~ex2_s_expo[8]) & ex2_s_expo[9];
assign ex2_den_ramt4_04 = ex2_s_expo[8] & (~ex2_s_expo[9]);
assign ex2_den_ramt4_00 = ex2_s_expo[8] & ex2_s_expo[9];
assign ex2_den_ramt1_03 = (~ex2_s_expo[10]) & (~ex2_s_expo[11]);
assign ex2_den_ramt1_02 = (~ex2_s_expo[10]) & ex2_s_expo[11];
assign ex2_den_ramt1_01 = ex2_s_expo[10] & (~ex2_s_expo[11]);
assign ex2_den_ramt1_00 = ex2_s_expo[10] & ex2_s_expo[11];
assign ex2_expo_eq896 = (~ex2_s_expo[1]) & ex2_s_expo[2] & ex2_s_expo[3] & ex2_s_expo[4] & (~ex2_s_expo[5]) & (~ex2_s_expo[6]) & (~ex2_s_expo[7]) & (~ex2_s_expo[8]) & (~ex2_s_expo[9]) & (~ex2_s_expo[10]) & (~ex2_s_expo[11]); // 011_1000_0000
assign ex2_expo_ge896 = (ex2_s_expo[1]) | (ex2_s_expo[2] & ex2_s_expo[3] & ex2_s_expo[4]);
assign ex2_ge874 = (ex2_s_expo[1]) | (ex2_s_expo[2] & ex2_s_expo[3] & ex2_s_expo[4]) | (ex2_s_expo[2] & ex2_s_expo[3] & ex2_s_expo[5] & ex2_s_expo[6]); // 011_0110_1010 -- enough so shifter does not wrap 011_0110_xxxx
assign ex2_expo_lt896 = (~ex2_expo_ge896);
assign ex2_sts_lt896 = ex2_sto_sp & ex2_expo_lt896 & ex2_ge874; // result = zero when lt 874
assign ex2_sts_ge896 = ex2_sto_sp & ex2_expo_ge896;
assign ex2_sts_sh8[0:23] = ({24{ex2_den_ramt8_02}} & ({{2{tidn}}, ex2_s_frac[0:21]})) |
({24{ex2_den_ramt8_18}} & ({{18{tidn}}, ex2_s_frac[0:5]}));
assign ex2_sts_sh4[0:23] = ({24{ex2_den_ramt4_12}} & ({{12{tidn}}, ex2_sts_sh8[0:11]})) |
({24{ex2_den_ramt4_08}} & ({{8{tidn}}, ex2_sts_sh8[0:15]})) |
({24{ex2_den_ramt4_04}} & ({{4{tidn}}, ex2_sts_sh8[0:19]})) |
({24{ex2_den_ramt4_00}} & (ex2_sts_sh8[0:23]));
assign ex2_sts_sh1[0:23] = ({24{ex2_den_ramt1_03}} & ({{3{tidn}}, ex2_sts_sh4[0:20]})) |
({24{ex2_den_ramt1_02}} & ({{2{tidn}}, ex2_sts_sh4[0:21]})) |
({24{ex2_den_ramt1_01}} & ({tidn, ex2_sts_sh4[0:22]})) |
({24{ex2_den_ramt1_00}} & (ex2_sts_sh4[0:23]));
assign ex2_sts_nrm[0:23] = ({24{ex2_expo_eq896}} & ({tidn, ex2_s_frac[0:22]})) |
({24{(~ex2_expo_eq896)}} & (ex2_s_frac[0:23]));
assign ex2_sts_frac[1:23] = ({23{ex2_sts_lt896}} & ex2_sts_sh1[1:23]) |
({23{ex2_sts_ge896}} & ex2_sts_nrm[1:23]);
////###################################################
////# store_sp : calc shift amount :
////###################################################
assign ex2_sts_expo_nz = ex2_sto_sp & ex2_expo_ge896;
assign ex2_sts_expo[1] = ex2_s_expo[1] & ex2_sts_expo_nz;
assign ex2_sts_expo[2:7] = ex2_s_expo[5:10] & {6{ex2_sts_expo_nz}};
assign ex2_sts_expo[8] = ex2_s_expo[11] & ex2_s_frac[0] & ex2_sts_expo_nz;
////###################################################
////# normalization shift left amount for store_dp
////###################################################
// count leading zeroes to get the shift amount
//bit pos dp_expo bin_expo inv clz lsb shift left to norm
//
// 00 x381 011_1000_0001 1_1110 00 0_0000 <== normal
// 01 x380 011_1000_0000 1_1111 01 0_0001
// 02 x37F 011_0111_1111 0_0000 02 0_0010 <=== start clz on bit 2;
// 03 x37E 011_0111_1110 0_0001 03 0_0010
// 04 x37D 011_0111_1101 0_0010 04 0_0010
// 05 x37C 011_0111_1100 0_0011 05 0_0010
// 06 x37B 011_0111_1011 0_0100 06 0_0010
// 07 x37A 011_0111_1010 0_0101 07 0_0010
// 08 x379 011_0111_1001 0_0110 08 0_0010
// 09 x378 011_0111_1000 0_0111 09 0_0010
// 10 x377 011_0111_0111 0_1000 10 0_0010
// 11 x376 011_0111_0110 0_1001 11 0_0010
// 12 x375 011_0111_0101 0_1010 12 0_0010
// 13 x374 011_0111_0100 0_1011 13 0_0010
// 14 x373 011_0111_0011 0_1100 14 0_0010
// 15 x372 011_0111_0010 0_1101 15 0_0010
// 16 x371 011_0111_0001 0_1110 16 0_0010
// 17 x370 011_0111_0000 0_1111 17 0_0010
// 18 x36F 011_0110_1111 1_0000 18 0_0010
// 19 x36E 011_0110_1110 1_0001 19 0_0010
// 20 x36D 011_0110_1101 1_0010 20 0_0010
// 21 x36C 011_0110_1100 1_0011 21 0_0010
// 22 x36B 011_0110_1011 1_0100 22 0_0010
// 23 x36A 011_0110_1010 1_0101 23 0_0010
// if clz does not find leading bit (shift of 0 is ok)
assign ex2_clz02_or[0] = ex2_s_frac[2] | ex2_s_frac[3];
assign ex2_clz02_enc4[0] = (~ex2_s_frac[2]) & ex2_s_frac[3];
assign ex2_clz02_or[1] = ex2_s_frac[4] | ex2_s_frac[5];
assign ex2_clz02_enc4[1] = (~ex2_s_frac[4]) & ex2_s_frac[5];
assign ex2_clz02_or[2] = ex2_s_frac[6] | ex2_s_frac[7];
assign ex2_clz02_enc4[2] = (~ex2_s_frac[6]) & ex2_s_frac[7];
assign ex2_clz02_or[3] = ex2_s_frac[8] | ex2_s_frac[9];
assign ex2_clz02_enc4[3] = (~ex2_s_frac[8]) & ex2_s_frac[9];
assign ex2_clz02_or[4] = ex2_s_frac[10] | ex2_s_frac[11];
assign ex2_clz02_enc4[4] = (~ex2_s_frac[10]) & ex2_s_frac[11];
assign ex2_clz02_or[5] = ex2_s_frac[12] | ex2_s_frac[13];
assign ex2_clz02_enc4[5] = (~ex2_s_frac[12]) & ex2_s_frac[13];
assign ex2_clz02_or[6] = ex2_s_frac[14] | ex2_s_frac[15];
assign ex2_clz02_enc4[6] = (~ex2_s_frac[14]) & ex2_s_frac[15];
assign ex2_clz02_or[7] = ex2_s_frac[16] | ex2_s_frac[17];
assign ex2_clz02_enc4[7] = (~ex2_s_frac[16]) & ex2_s_frac[17];
assign ex2_clz02_or[8] = ex2_s_frac[18] | ex2_s_frac[19];
assign ex2_clz02_enc4[8] = (~ex2_s_frac[18]) & ex2_s_frac[19];
assign ex2_clz02_or[9] = ex2_s_frac[20] | ex2_s_frac[21];
assign ex2_clz02_enc4[9] = (~ex2_s_frac[20]) & ex2_s_frac[21];
assign ex2_clz02_or[10] = ex2_s_frac[22] | ex2_s_frac[23];
assign ex2_clz02_enc4[10] = (~ex2_s_frac[22]) & ex2_s_frac[23];
assign ex2_clz04_or[0] = ex2_clz02_or[0] | ex2_clz02_or[1];
assign ex2_clz04_enc3[0] = (~ex2_clz02_or[0]) & ex2_clz02_or[1];
assign ex2_clz04_enc4[0] = ex2_clz02_enc4[0] | ((~ex2_clz02_or[0]) & ex2_clz02_enc4[1]);
assign ex2_clz04_or[1] = ex2_clz02_or[2] | ex2_clz02_or[3];
assign ex2_clz04_enc3[1] = (~ex2_clz02_or[2]) & ex2_clz02_or[3];
assign ex2_clz04_enc4[1] = ex2_clz02_enc4[2] | ((~ex2_clz02_or[2]) & ex2_clz02_enc4[3]);
assign ex2_clz04_or[2] = ex2_clz02_or[4] | ex2_clz02_or[5];
assign ex2_clz04_enc3[2] = (~ex2_clz02_or[4]) & ex2_clz02_or[5];
assign ex2_clz04_enc4[2] = ex2_clz02_enc4[4] | ((~ex2_clz02_or[4]) & ex2_clz02_enc4[5]);
assign ex2_clz04_or[3] = ex2_clz02_or[6] | ex2_clz02_or[7];
assign ex2_clz04_enc3[3] = (~ex2_clz02_or[6]) & ex2_clz02_or[7];
assign ex2_clz04_enc4[3] = ex2_clz02_enc4[6] | ((~ex2_clz02_or[6]) & ex2_clz02_enc4[7]);
assign ex2_clz04_or[4] = ex2_clz02_or[8] | ex2_clz02_or[9];
assign ex2_clz04_enc3[4] = (~ex2_clz02_or[8]) & ex2_clz02_or[9];
assign ex2_clz04_enc4[4] = ex2_clz02_enc4[8] | ((~ex2_clz02_or[8]) & ex2_clz02_enc4[9]);
assign ex2_clz04_or[5] = ex2_clz02_or[10];
assign ex2_clz04_enc3[5] = tidn;
assign ex2_clz04_enc4[5] = ex2_clz02_enc4[10];
assign ex2_clz08_or[0] = ex2_clz04_or[0] | ex2_clz04_or[1];
assign ex2_clz08_enc2[0] = (~ex2_clz04_or[0]) & ex2_clz04_or[1];
assign ex2_clz08_enc3[0] = ex2_clz04_enc3[0] | ((~ex2_clz04_or[0]) & ex2_clz04_enc3[1]);
assign ex2_clz08_enc4[0] = ex2_clz04_enc4[0] | ((~ex2_clz04_or[0]) & ex2_clz04_enc4[1]);
assign ex2_clz08_or[1] = ex2_clz04_or[2] | ex2_clz04_or[3];
assign ex2_clz08_enc2[1] = (~ex2_clz04_or[2]) & ex2_clz04_or[3];
assign ex2_clz08_enc3[1] = ex2_clz04_enc3[2] | ((~ex2_clz04_or[2]) & ex2_clz04_enc3[3]);
assign ex2_clz08_enc4[1] = ex2_clz04_enc4[2] | ((~ex2_clz04_or[2]) & ex2_clz04_enc4[3]);
assign ex2_clz08_or[2] = ex2_clz04_or[4] | ex2_clz04_or[5];
assign ex2_clz08_enc2[2] = (~ex2_clz04_or[4]) & ex2_clz04_or[5];
assign ex2_clz08_enc3[2] = ex2_clz04_enc3[4] | ((~ex2_clz04_or[4]) & ex2_clz04_enc3[5]);
assign ex2_clz08_enc4[2] = ex2_clz04_enc4[4] | ((~ex2_clz04_or[4]) & ex2_clz04_enc4[5]);
assign ex2_clz16_or[0] = ex2_clz08_or[0] | ex2_clz08_or[1];
assign ex2_clz16_enc1[0] = (~ex2_clz08_or[0]) & ex2_clz08_or[1];
assign ex2_clz16_enc2[0] = ex2_clz08_enc2[0] | ((~ex2_clz08_or[0]) & ex2_clz08_enc2[1]);
assign ex2_clz16_enc3[0] = ex2_clz08_enc3[0] | ((~ex2_clz08_or[0]) & ex2_clz08_enc3[1]);
assign ex2_clz16_enc4[0] = ex2_clz08_enc4[0] | ((~ex2_clz08_or[0]) & ex2_clz08_enc4[1]);
assign ex2_clz16_or[1] = ex2_clz08_or[2];
assign ex2_clz16_enc1[1] = tidn;
assign ex2_clz16_enc2[1] = ex2_clz08_enc2[2];
assign ex2_clz16_enc3[1] = ex2_clz08_enc3[2];
assign ex2_clz16_enc4[1] = ex2_clz08_enc4[2];
assign ex2_sto_clz[0] = (~ex2_clz16_or[0]) & ex2_clz16_or[1];
assign ex2_sto_clz[1] = ex2_clz16_enc1[0] | ((~ex2_clz16_or[0]) & ex2_clz16_enc1[1]);
assign ex2_sto_clz[2] = ex2_clz16_enc2[0] | ((~ex2_clz16_or[0]) & ex2_clz16_enc2[1]);
assign ex2_sto_clz[3] = ex2_clz16_enc3[0] | ((~ex2_clz16_or[0]) & ex2_clz16_enc3[1]);
assign ex2_sto_clz[4] = ex2_clz16_enc4[0] | ((~ex2_clz16_or[0]) & ex2_clz16_enc4[1]);
assign ex2_any_edge = (ex2_clz16_or[0] | ex2_clz16_or[1]);
////###################################################
////# exponent for store dp
////###################################################
// exponent must be zero when input is zero x001 * !imp
assign ex2_fixden = ex2_s_expo[2] & (~ex2_s_frac[0]); // sp denorm or zero
assign ex2_fixden_small = ex2_s_expo[2] & (~ex2_s_frac[0]) & ex2_s_frac[1];
assign ex2_fixden_big = ex2_s_expo[2] & (~ex2_s_frac[0]) & (~ex2_s_frac[1]);
assign ex2_std_nonden = ex2_sto_dp & (~ex2_fixden);
assign ex2_std_fixden_big = ex2_sto_dp & ex2_fixden_big; // denorm more than 1
assign ex2_std_fixden_small = ex2_sto_dp & ex2_fixden_small; // denorm by 1
assign ex2_std_nonbig = ex2_sto_dp & (~ex2_fixden_big);
// dp denorm/zero turn of expo lsb
// sp denorm(1) goes to x380 (turn off lsb)
assign ex2_expo_nonden[1:10] = ex2_s_expo[1:10] & {10{ex2_std_nonbig}};
assign ex2_expo_nonden[11] = ex2_s_expo[11] & ex2_s_frac[0] & ex2_std_nonden;
assign ex2_expo_fixden[1] = tidn; // 011_011x_xxx
assign ex2_expo_fixden[2] = ex2_any_edge; // 011_011x_xxx
assign ex2_expo_fixden[3] = ex2_any_edge; // 011_011x_xxx
assign ex2_expo_fixden[4] = tidn; // 011_011x_xxx
assign ex2_expo_fixden[5] = ex2_any_edge; // 011_011x_xxx
assign ex2_expo_fixden[6] = ex2_any_edge; // 011_011x_xxx
assign ex2_expo_fixden[7:11] = (~ex2_sto_clz[0:4]) & {5{ex2_any_edge}};
assign ex2_std_expo[1:11] = (ex2_expo_nonden[1:11]) |
(ex2_expo_fixden[1:11] & {11{ex2_std_fixden_big}});
////#########################################################################
////# shifting for store dp
////#########################################################################
assign ex2_std_nonden_wd = ex2_std_nonden | ex2_sto_wd;
assign ex2_std_frac_nrm[1:20] = (ex2_s_frac[2:21] & {20{ex2_std_fixden_small}}) |
(ex2_s_frac[1:20] & {20{ex2_std_nonden}});
assign ex2_std_frac_nrm[21:52] = (({ex2_s_frac[22:52], tidn}) & {32{ex2_std_fixden_small}}) |
(ex2_s_frac[21:52] & {32{ex2_std_nonden_wd}}); // stfiwx has a 32 bit result f[21:52]
assign ex2_std_lamt8_02 = (~ex2_sto_clz[0]) & (~ex2_sto_clz[1]); // 0 + 2
assign ex2_std_lamt8_10 = (~ex2_sto_clz[0]) & ex2_sto_clz[1]; // 8 + 2
assign ex2_std_lamt8_18 = ex2_sto_clz[0] & (~ex2_sto_clz[1]); //16 + 2
assign ex2_std_lamt2_0 = (~ex2_sto_clz[2]) & (~ex2_sto_clz[3]);
assign ex2_std_lamt2_2 = (~ex2_sto_clz[2]) & ex2_sto_clz[3];
assign ex2_std_lamt2_4 = ex2_sto_clz[2] & (~ex2_sto_clz[3]);
assign ex2_std_lamt2_6 = ex2_sto_clz[2] & ex2_sto_clz[3];
assign ex2_std_lamt1_0 = ex2_std_fixden_big & (~ex2_sto_clz[4]);
assign ex2_std_lamt1_1 = ex2_std_fixden_big & ex2_sto_clz[4];
//@-- -- if the input was an sp denorm (sp format) then there are only 24 input bits [0:23]
assign ex2_std_sh8[0:23] = (({ex2_s_frac[2:23], {2{tidn}}}) & {24{ex2_std_lamt8_02}}) |
(({ex2_s_frac[10:23], {10{tidn}}}) & {24{ex2_std_lamt8_10}}) |
(({ex2_s_frac[18:23], {18{tidn}}}) & {24{ex2_std_lamt8_18}});
assign ex2_std_sh2[0:23] = (ex2_std_sh8[0:23] & {24{ex2_std_lamt2_0}}) |
(({ex2_std_sh8[2:23], {2{tidn}}}) & {24{ex2_std_lamt2_2}}) |
(({ex2_std_sh8[4:23], {4{tidn}}}) & {24{ex2_std_lamt2_4}}) |
(({ex2_std_sh8[6:23], {6{tidn}}}) & {24{ex2_std_lamt2_6}});
assign ex2_std_frac_den[1:23] = (ex2_std_sh2[1:23] & {23{ex2_std_lamt1_0}}) |
(({ex2_std_sh2[2:23], tidn}) & {23{ex2_std_lamt1_1}});
////###################################################
////# final combinations
////###################################################
assign ex2_sto_data[0] = ex2_s_sign & (~ex2_sto_wd); // sign bit
assign ex2_sto_data[1:8] = ex2_sts_expo[1:8] | ex2_std_expo[1:8];
assign ex2_sto_data[9:11] = ex2_sts_frac[1:3] | ex2_std_expo[9:11];
assign ex2_sto_data[12:31] = ex2_sts_frac[4:23] | ex2_std_frac_nrm[1:20] | ex2_std_frac_den[1:20];
assign ex2_sto_data[32:34] = ex2_std_frac_nrm[21:23] | ex2_std_frac_den[21:23]; //03 bits (includes stfwix)
assign ex2_sto_data[35:63] = ex2_std_frac_nrm[24:52]; //29 bits (includes stfwix)
////##############################################
////# EX3 latches
////##############################################
tri_rlmreg_p #(.WIDTH(73), .NEEDS_SRESET(0), .IBUF(1'B1)) ex3_sto_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,
.nclk(nclk),
.thold_b(thold_0_b),
.sg(sg_0),
.act(ex2_act),
.vd(vdd),
.gd(gnd),
.scout(ex3_sto_so),
.scin(ex3_sto_si),
//-----------------
.din({ ex2_sto_data[0:63],
ex2_sto_sp,
ex2_sto_sp,
ex2_sto_sp,
ex2_sto_sp,
ex2_sto_wd,
ex2_sto_wd,
ex2_sto_wd,
ex2_sto_wd,
ex2_s_party_chick}),
.dout({ ex3_sto_data[0:63], //LAT--
ex3_sto_sp[0], //LAT--
ex3_sto_sp[1], //LAT--
ex3_sto_sp[2], //LAT--
ex3_sto_sp[3], //LAT--
ex3_sto_wd[0], //LAT--
ex3_sto_wd[1], //LAT--
ex3_sto_wd[2], //LAT--
ex3_sto_wd[3], //LAT--
ex3_s_party_chick}) //LAT--
);
assign f_sto_ex3_s_parity_check = ex3_s_party_chick;
// 1 unused
// 2 xx
// 3 1
// 4 2
// 5 3
// 6 4
// 7 5
// 8 6
// 9 7
// 10 8
// 11 9
// 12 10
// 13 11
assign ex2_s_party[0] = ex2_s_sign ^ f_fpr_ex2_s_expo_extra[0] ^ f_fpr_ex2_s_expo_extra[1] ^ ex2_s_expo[1] ^ ex2_s_expo[2] ^ ex2_s_expo[3] ^ ex2_s_expo[4] ^ ex2_s_expo[5] ^ ex2_s_expo[6] ^ ex2_s_expo[7];
assign ex2_s_party[1] = ex2_s_expo[8] ^ ex2_s_expo[9] ^ ex2_s_expo[10] ^ ex2_s_expo[11] ^ ex2_s_frac[0] ^ ex2_s_frac[1] ^ ex2_s_frac[2] ^ ex2_s_frac[3] ^ ex2_s_frac[4];
assign ex2_s_party[2] = ex2_s_frac[5] ^ ex2_s_frac[6] ^ ex2_s_frac[7] ^ ex2_s_frac[8] ^ ex2_s_frac[9] ^ ex2_s_frac[10] ^ ex2_s_frac[11] ^ ex2_s_frac[12];
assign ex2_s_party[3] = ex2_s_frac[13] ^ ex2_s_frac[14] ^ ex2_s_frac[15] ^ ex2_s_frac[16] ^ ex2_s_frac[17] ^ ex2_s_frac[18] ^ ex2_s_frac[19] ^ ex2_s_frac[20];
assign ex2_s_party[4] = ex2_s_frac[21] ^ ex2_s_frac[22] ^ ex2_s_frac[23] ^ ex2_s_frac[24] ^ ex2_s_frac[25] ^ ex2_s_frac[26] ^ ex2_s_frac[27] ^ ex2_s_frac[28];
assign ex2_s_party[5] = ex2_s_frac[29] ^ ex2_s_frac[30] ^ ex2_s_frac[31] ^ ex2_s_frac[32] ^ ex2_s_frac[33] ^ ex2_s_frac[34] ^ ex2_s_frac[35] ^ ex2_s_frac[36];
assign ex2_s_party[6] = ex2_s_frac[37] ^ ex2_s_frac[38] ^ ex2_s_frac[39] ^ ex2_s_frac[40] ^ ex2_s_frac[41] ^ ex2_s_frac[42] ^ ex2_s_frac[43] ^ ex2_s_frac[44];
assign ex2_s_party[7] = ex2_s_frac[45] ^ ex2_s_frac[46] ^ ex2_s_frac[47] ^ ex2_s_frac[48] ^ ex2_s_frac[49] ^ ex2_s_frac[50] ^ ex2_s_frac[51] ^ ex2_s_frac[52];
assign ex2_s_party_chick = (ex2_s_party[0] ^ f_fpr_ex2_s_par[0]) | (ex2_s_party[1] ^ f_fpr_ex2_s_par[1]) | (ex2_s_party[2] ^ f_fpr_ex2_s_par[2]) | (ex2_s_party[3] ^ f_fpr_ex2_s_par[3]) | (ex2_s_party[4] ^ f_fpr_ex2_s_par[4]) | (ex2_s_party[5] ^ f_fpr_ex2_s_par[5]) | (ex2_s_party[6] ^ f_fpr_ex2_s_par[6]) | (ex2_s_party[7] ^ f_fpr_ex2_s_par[7]);
////##############################################
////# EX3 logic
////##############################################
//@@ ex3_sto_data_rot(0 to 31) <=
//@@ ( ex3_sto_data( 0 to 31) and ( 0 to 31=> not ex3_sto_wd) ) or
//@@ ( ex3_sto_data(32 to 63) and ( 0 to 31=> ex3_sto_wd) );
//@@
//@@ ex3_sto_data_rot(32 to 63) <=
//@@ ( ex3_sto_data( 0 to 31) and (32 to 63=> ex3_sto_sp) ) or
//@@ ( ex3_sto_data(32 to 63) and (32 to 63=> not ex3_sto_sp) );
//@@
//@@
//@@ f_sto_ex3_sto_data( 0 to 63) <= ex3_sto_data_rot(0 to 63);
//@@
assign ex3_sto_data_rot0_b[0] = (~(ex3_sto_data[0] & (~ex3_sto_wd[0])));
assign ex3_sto_data_rot0_b[1] = (~(ex3_sto_data[1] & (~ex3_sto_wd[0])));
assign ex3_sto_data_rot0_b[2] = (~(ex3_sto_data[2] & (~ex3_sto_wd[0])));
assign ex3_sto_data_rot0_b[3] = (~(ex3_sto_data[3] & (~ex3_sto_wd[0])));
assign ex3_sto_data_rot0_b[4] = (~(ex3_sto_data[4] & (~ex3_sto_wd[0])));
assign ex3_sto_data_rot0_b[5] = (~(ex3_sto_data[5] & (~ex3_sto_wd[0])));
assign ex3_sto_data_rot0_b[6] = (~(ex3_sto_data[6] & (~ex3_sto_wd[0])));
assign ex3_sto_data_rot0_b[7] = (~(ex3_sto_data[7] & (~ex3_sto_wd[0])));
assign ex3_sto_data_rot0_b[8] = (~(ex3_sto_data[8] & (~ex3_sto_wd[1])));
assign ex3_sto_data_rot0_b[9] = (~(ex3_sto_data[9] & (~ex3_sto_wd[1])));
assign ex3_sto_data_rot0_b[10] = (~(ex3_sto_data[10] & (~ex3_sto_wd[1])));
assign ex3_sto_data_rot0_b[11] = (~(ex3_sto_data[11] & (~ex3_sto_wd[1])));
assign ex3_sto_data_rot0_b[12] = (~(ex3_sto_data[12] & (~ex3_sto_wd[1])));
assign ex3_sto_data_rot0_b[13] = (~(ex3_sto_data[13] & (~ex3_sto_wd[1])));
assign ex3_sto_data_rot0_b[14] = (~(ex3_sto_data[14] & (~ex3_sto_wd[1])));
assign ex3_sto_data_rot0_b[15] = (~(ex3_sto_data[15] & (~ex3_sto_wd[1])));
assign ex3_sto_data_rot0_b[16] = (~(ex3_sto_data[16] & (~ex3_sto_wd[2])));
assign ex3_sto_data_rot0_b[17] = (~(ex3_sto_data[17] & (~ex3_sto_wd[2])));
assign ex3_sto_data_rot0_b[18] = (~(ex3_sto_data[18] & (~ex3_sto_wd[2])));
assign ex3_sto_data_rot0_b[19] = (~(ex3_sto_data[19] & (~ex3_sto_wd[2])));
assign ex3_sto_data_rot0_b[20] = (~(ex3_sto_data[20] & (~ex3_sto_wd[2])));
assign ex3_sto_data_rot0_b[21] = (~(ex3_sto_data[21] & (~ex3_sto_wd[2])));
assign ex3_sto_data_rot0_b[22] = (~(ex3_sto_data[22] & (~ex3_sto_wd[2])));
assign ex3_sto_data_rot0_b[23] = (~(ex3_sto_data[23] & (~ex3_sto_wd[2])));
assign ex3_sto_data_rot0_b[24] = (~(ex3_sto_data[24] & (~ex3_sto_wd[3])));
assign ex3_sto_data_rot0_b[25] = (~(ex3_sto_data[25] & (~ex3_sto_wd[3])));
assign ex3_sto_data_rot0_b[26] = (~(ex3_sto_data[26] & (~ex3_sto_wd[3])));
assign ex3_sto_data_rot0_b[27] = (~(ex3_sto_data[27] & (~ex3_sto_wd[3])));
assign ex3_sto_data_rot0_b[28] = (~(ex3_sto_data[28] & (~ex3_sto_wd[3])));
assign ex3_sto_data_rot0_b[29] = (~(ex3_sto_data[29] & (~ex3_sto_wd[3])));
assign ex3_sto_data_rot0_b[30] = (~(ex3_sto_data[30] & (~ex3_sto_wd[3])));
assign ex3_sto_data_rot0_b[31] = (~(ex3_sto_data[31] & (~ex3_sto_wd[3])));
assign ex3_sto_data_rot0_b[32] = (~(ex3_sto_data[0] & ex3_sto_sp[0]));
assign ex3_sto_data_rot0_b[33] = (~(ex3_sto_data[1] & ex3_sto_sp[0]));
assign ex3_sto_data_rot0_b[34] = (~(ex3_sto_data[2] & ex3_sto_sp[0]));
assign ex3_sto_data_rot0_b[35] = (~(ex3_sto_data[3] & ex3_sto_sp[0]));
assign ex3_sto_data_rot0_b[36] = (~(ex3_sto_data[4] & ex3_sto_sp[0]));
assign ex3_sto_data_rot0_b[37] = (~(ex3_sto_data[5] & ex3_sto_sp[0]));
assign ex3_sto_data_rot0_b[38] = (~(ex3_sto_data[6] & ex3_sto_sp[0]));
assign ex3_sto_data_rot0_b[39] = (~(ex3_sto_data[7] & ex3_sto_sp[0]));
assign ex3_sto_data_rot0_b[40] = (~(ex3_sto_data[8] & ex3_sto_sp[1]));
assign ex3_sto_data_rot0_b[41] = (~(ex3_sto_data[9] & ex3_sto_sp[1]));
assign ex3_sto_data_rot0_b[42] = (~(ex3_sto_data[10] & ex3_sto_sp[1]));
assign ex3_sto_data_rot0_b[43] = (~(ex3_sto_data[11] & ex3_sto_sp[1]));
assign ex3_sto_data_rot0_b[44] = (~(ex3_sto_data[12] & ex3_sto_sp[1]));
assign ex3_sto_data_rot0_b[45] = (~(ex3_sto_data[13] & ex3_sto_sp[1]));
assign ex3_sto_data_rot0_b[46] = (~(ex3_sto_data[14] & ex3_sto_sp[1]));
assign ex3_sto_data_rot0_b[47] = (~(ex3_sto_data[15] & ex3_sto_sp[1]));
assign ex3_sto_data_rot0_b[48] = (~(ex3_sto_data[16] & ex3_sto_sp[2]));
assign ex3_sto_data_rot0_b[49] = (~(ex3_sto_data[17] & ex3_sto_sp[2]));
assign ex3_sto_data_rot0_b[50] = (~(ex3_sto_data[18] & ex3_sto_sp[2]));
assign ex3_sto_data_rot0_b[51] = (~(ex3_sto_data[19] & ex3_sto_sp[2]));
assign ex3_sto_data_rot0_b[52] = (~(ex3_sto_data[20] & ex3_sto_sp[2]));
assign ex3_sto_data_rot0_b[53] = (~(ex3_sto_data[21] & ex3_sto_sp[2]));
assign ex3_sto_data_rot0_b[54] = (~(ex3_sto_data[22] & ex3_sto_sp[2]));
assign ex3_sto_data_rot0_b[55] = (~(ex3_sto_data[23] & ex3_sto_sp[2]));
assign ex3_sto_data_rot0_b[56] = (~(ex3_sto_data[24] & ex3_sto_sp[3]));
assign ex3_sto_data_rot0_b[57] = (~(ex3_sto_data[25] & ex3_sto_sp[3]));
assign ex3_sto_data_rot0_b[58] = (~(ex3_sto_data[26] & ex3_sto_sp[3]));
assign ex3_sto_data_rot0_b[59] = (~(ex3_sto_data[27] & ex3_sto_sp[3]));
assign ex3_sto_data_rot0_b[60] = (~(ex3_sto_data[28] & ex3_sto_sp[3]));
assign ex3_sto_data_rot0_b[61] = (~(ex3_sto_data[29] & ex3_sto_sp[3]));
assign ex3_sto_data_rot0_b[62] = (~(ex3_sto_data[30] & ex3_sto_sp[3]));
assign ex3_sto_data_rot0_b[63] = (~(ex3_sto_data[31] & ex3_sto_sp[3]));
assign ex3_sto_data_rot1_b[0] = (~(ex3_sto_data[32] & ex3_sto_wd[0]));
assign ex3_sto_data_rot1_b[1] = (~(ex3_sto_data[33] & ex3_sto_wd[0]));
assign ex3_sto_data_rot1_b[2] = (~(ex3_sto_data[34] & ex3_sto_wd[0]));
assign ex3_sto_data_rot1_b[3] = (~(ex3_sto_data[35] & ex3_sto_wd[0]));
assign ex3_sto_data_rot1_b[4] = (~(ex3_sto_data[36] & ex3_sto_wd[0]));
assign ex3_sto_data_rot1_b[5] = (~(ex3_sto_data[37] & ex3_sto_wd[0]));
assign ex3_sto_data_rot1_b[6] = (~(ex3_sto_data[38] & ex3_sto_wd[0]));
assign ex3_sto_data_rot1_b[7] = (~(ex3_sto_data[39] & ex3_sto_wd[0]));
assign ex3_sto_data_rot1_b[8] = (~(ex3_sto_data[40] & ex3_sto_wd[1]));
assign ex3_sto_data_rot1_b[9] = (~(ex3_sto_data[41] & ex3_sto_wd[1]));
assign ex3_sto_data_rot1_b[10] = (~(ex3_sto_data[42] & ex3_sto_wd[1]));
assign ex3_sto_data_rot1_b[11] = (~(ex3_sto_data[43] & ex3_sto_wd[1]));
assign ex3_sto_data_rot1_b[12] = (~(ex3_sto_data[44] & ex3_sto_wd[1]));
assign ex3_sto_data_rot1_b[13] = (~(ex3_sto_data[45] & ex3_sto_wd[1]));
assign ex3_sto_data_rot1_b[14] = (~(ex3_sto_data[46] & ex3_sto_wd[1]));
assign ex3_sto_data_rot1_b[15] = (~(ex3_sto_data[47] & ex3_sto_wd[1]));
assign ex3_sto_data_rot1_b[16] = (~(ex3_sto_data[48] & ex3_sto_wd[2]));
assign ex3_sto_data_rot1_b[17] = (~(ex3_sto_data[49] & ex3_sto_wd[2]));
assign ex3_sto_data_rot1_b[18] = (~(ex3_sto_data[50] & ex3_sto_wd[2]));
assign ex3_sto_data_rot1_b[19] = (~(ex3_sto_data[51] & ex3_sto_wd[2]));
assign ex3_sto_data_rot1_b[20] = (~(ex3_sto_data[52] & ex3_sto_wd[2]));
assign ex3_sto_data_rot1_b[21] = (~(ex3_sto_data[53] & ex3_sto_wd[2]));
assign ex3_sto_data_rot1_b[22] = (~(ex3_sto_data[54] & ex3_sto_wd[2]));
assign ex3_sto_data_rot1_b[23] = (~(ex3_sto_data[55] & ex3_sto_wd[2]));
assign ex3_sto_data_rot1_b[24] = (~(ex3_sto_data[56] & ex3_sto_wd[3]));
assign ex3_sto_data_rot1_b[25] = (~(ex3_sto_data[57] & ex3_sto_wd[3]));
assign ex3_sto_data_rot1_b[26] = (~(ex3_sto_data[58] & ex3_sto_wd[3]));
assign ex3_sto_data_rot1_b[27] = (~(ex3_sto_data[59] & ex3_sto_wd[3]));
assign ex3_sto_data_rot1_b[28] = (~(ex3_sto_data[60] & ex3_sto_wd[3]));
assign ex3_sto_data_rot1_b[29] = (~(ex3_sto_data[61] & ex3_sto_wd[3]));
assign ex3_sto_data_rot1_b[30] = (~(ex3_sto_data[62] & ex3_sto_wd[3]));
assign ex3_sto_data_rot1_b[31] = (~(ex3_sto_data[63] & ex3_sto_wd[3]));
assign ex3_sto_data_rot1_b[32] = (~(ex3_sto_data[32] & (~ex3_sto_sp[0])));
assign ex3_sto_data_rot1_b[33] = (~(ex3_sto_data[33] & (~ex3_sto_sp[0])));
assign ex3_sto_data_rot1_b[34] = (~(ex3_sto_data[34] & (~ex3_sto_sp[0])));
assign ex3_sto_data_rot1_b[35] = (~(ex3_sto_data[35] & (~ex3_sto_sp[0])));
assign ex3_sto_data_rot1_b[36] = (~(ex3_sto_data[36] & (~ex3_sto_sp[0])));
assign ex3_sto_data_rot1_b[37] = (~(ex3_sto_data[37] & (~ex3_sto_sp[0])));
assign ex3_sto_data_rot1_b[38] = (~(ex3_sto_data[38] & (~ex3_sto_sp[0])));
assign ex3_sto_data_rot1_b[39] = (~(ex3_sto_data[39] & (~ex3_sto_sp[0])));
assign ex3_sto_data_rot1_b[40] = (~(ex3_sto_data[40] & (~ex3_sto_sp[1])));
assign ex3_sto_data_rot1_b[41] = (~(ex3_sto_data[41] & (~ex3_sto_sp[1])));
assign ex3_sto_data_rot1_b[42] = (~(ex3_sto_data[42] & (~ex3_sto_sp[1])));
assign ex3_sto_data_rot1_b[43] = (~(ex3_sto_data[43] & (~ex3_sto_sp[1])));
assign ex3_sto_data_rot1_b[44] = (~(ex3_sto_data[44] & (~ex3_sto_sp[1])));
assign ex3_sto_data_rot1_b[45] = (~(ex3_sto_data[45] & (~ex3_sto_sp[1])));
assign ex3_sto_data_rot1_b[46] = (~(ex3_sto_data[46] & (~ex3_sto_sp[1])));
assign ex3_sto_data_rot1_b[47] = (~(ex3_sto_data[47] & (~ex3_sto_sp[1])));
assign ex3_sto_data_rot1_b[48] = (~(ex3_sto_data[48] & (~ex3_sto_sp[2])));
assign ex3_sto_data_rot1_b[49] = (~(ex3_sto_data[49] & (~ex3_sto_sp[2])));
assign ex3_sto_data_rot1_b[50] = (~(ex3_sto_data[50] & (~ex3_sto_sp[2])));
assign ex3_sto_data_rot1_b[51] = (~(ex3_sto_data[51] & (~ex3_sto_sp[2])));
assign ex3_sto_data_rot1_b[52] = (~(ex3_sto_data[52] & (~ex3_sto_sp[2])));
assign ex3_sto_data_rot1_b[53] = (~(ex3_sto_data[53] & (~ex3_sto_sp[2])));
assign ex3_sto_data_rot1_b[54] = (~(ex3_sto_data[54] & (~ex3_sto_sp[2])));
assign ex3_sto_data_rot1_b[55] = (~(ex3_sto_data[55] & (~ex3_sto_sp[2])));
assign ex3_sto_data_rot1_b[56] = (~(ex3_sto_data[56] & (~ex3_sto_sp[3])));
assign ex3_sto_data_rot1_b[57] = (~(ex3_sto_data[57] & (~ex3_sto_sp[3])));
assign ex3_sto_data_rot1_b[58] = (~(ex3_sto_data[58] & (~ex3_sto_sp[3])));
assign ex3_sto_data_rot1_b[59] = (~(ex3_sto_data[59] & (~ex3_sto_sp[3])));
assign ex3_sto_data_rot1_b[60] = (~(ex3_sto_data[60] & (~ex3_sto_sp[3])));
assign ex3_sto_data_rot1_b[61] = (~(ex3_sto_data[61] & (~ex3_sto_sp[3])));
assign ex3_sto_data_rot1_b[62] = (~(ex3_sto_data[62] & (~ex3_sto_sp[3])));
assign ex3_sto_data_rot1_b[63] = (~(ex3_sto_data[63] & (~ex3_sto_sp[3])));
assign f_sto_ex3_sto_data[0:63] = (~(ex3_sto_data_rot0_b[0:63] & ex3_sto_data_rot1_b[0:63]));
////############################################
////# scan
////############################################
assign ex2_sins_si[0:2] = {ex2_sins_so[1:2], f_sto_si};
assign ex2_sop_si[0:64] = {ex2_sop_so[1:64], ex2_sins_so[0]};
assign ex3_sto_si[0:72] = {ex3_sto_so[1:72], ex2_sop_so[0]};
assign act_si[0:3] = {act_so[1:3], ex3_sto_so[0]};
assign f_sto_so = act_so[0];
endmodule