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.
491 lines
15 KiB
Verilog
491 lines
15 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_lza(
|
|
vdd,
|
|
gnd,
|
|
clk,
|
|
rst,
|
|
clkoff_b,
|
|
act_dis,
|
|
flush,
|
|
delay_lclkr,
|
|
mpw1_b,
|
|
mpw2_b,
|
|
sg_1,
|
|
thold_1,
|
|
fpu_enable,
|
|
f_lza_si,
|
|
f_lza_so,
|
|
ex2_act_b,
|
|
f_sa3_ex4_s,
|
|
f_sa3_ex4_c,
|
|
f_alg_ex3_effsub_eac_b,
|
|
f_lze_ex3_lzo_din,
|
|
f_lze_ex4_sh_rgt_amt,
|
|
f_lze_ex4_sh_rgt_en,
|
|
f_lza_ex5_no_lza_edge,
|
|
f_lza_ex5_lza_amt,
|
|
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_lza_ex5_sh_rgt_en_eov,
|
|
f_lza_ex5_lza_amt_eov
|
|
);
|
|
|
|
inout vdd;
|
|
inout gnd;
|
|
input clk;
|
|
input rst;
|
|
input clkoff_b; // tiup
|
|
input act_dis; // ??tidn??
|
|
input flush; // ??tidn??
|
|
input [3:4] delay_lclkr; // tidn,
|
|
input [3:4] mpw1_b; // tidn,
|
|
input [0:0] mpw2_b; // tidn,
|
|
input sg_1;
|
|
input thold_1;
|
|
input fpu_enable; //dc_act
|
|
|
|
input f_lza_si; //perv
|
|
output f_lza_so; //perv
|
|
input ex2_act_b; //act
|
|
|
|
input [0:162] f_sa3_ex4_s; // data
|
|
input [53:161] f_sa3_ex4_c; // data
|
|
input f_alg_ex3_effsub_eac_b;
|
|
|
|
input [0:162] f_lze_ex3_lzo_din;
|
|
input [0:7] f_lze_ex4_sh_rgt_amt;
|
|
input f_lze_ex4_sh_rgt_en;
|
|
|
|
output f_lza_ex5_no_lza_edge; //fpic
|
|
output [0:7] f_lza_ex5_lza_amt; //fnrm
|
|
output [0:2] f_lza_ex5_lza_dcd64_cp1; //fnrm
|
|
output [0:1] f_lza_ex5_lza_dcd64_cp2; //fnrm
|
|
output [0:0] f_lza_ex5_lza_dcd64_cp3; //fnrm
|
|
output f_lza_ex5_sh_rgt_en;
|
|
output f_lza_ex5_sh_rgt_en_eov;
|
|
output [0:7] f_lza_ex5_lza_amt_eov; //feov
|
|
|
|
// ENTITY
|
|
|
|
|
|
parameter tiup = 1'b1;
|
|
parameter tidn = 1'b0;
|
|
|
|
wire thold_0_b;
|
|
wire thold_0;
|
|
wire force_t;
|
|
wire sg_0;
|
|
wire ex3_act;
|
|
wire ex4_act;
|
|
wire ex2_act;
|
|
(* analysis_not_referenced="TRUE" *)
|
|
wire [0:3] act_spare_unused;
|
|
//--------------------------------------
|
|
wire [0:5] act_so; //SCAN
|
|
wire [0:5] act_si; //SCAN
|
|
wire [0:162] ex4_lzo_so; //SCAN
|
|
wire [0:162] ex4_lzo_si; //SCAN
|
|
wire [0:0] ex4_sub_so; //SCAN
|
|
wire [0:0] ex4_sub_si; //SCAN
|
|
wire [0:15] ex5_amt_so; //SCAN
|
|
wire [0:15] ex5_amt_si; //SCAN
|
|
wire [0:8] ex5_dcd_so; //SCAN
|
|
wire [0:8] ex5_dcd_si; //SCAN
|
|
//--------------------------------------
|
|
wire ex4_lza_any_b;
|
|
wire ex4_effsub;
|
|
wire ex5_no_edge;
|
|
wire ex4_no_edge_b;
|
|
wire [0:162] ex4_lzo;
|
|
wire [0:7] ex4_lza_amt_b;
|
|
wire [0:7] ex5_amt_eov;
|
|
wire [0:7] ex5_amt;
|
|
wire [0:162] ex4_sum;
|
|
wire [53:162] ex4_car;
|
|
wire [0:162] ex4_lv0_or;
|
|
wire ex4_sh_rgt_en_b;
|
|
wire ex4_lv6_or_0_b;
|
|
wire ex4_lv6_or_1_b;
|
|
wire ex4_lv6_or_0_t;
|
|
wire ex4_lv6_or_1_t;
|
|
wire ex4_lza_dcd64_0_b;
|
|
wire ex4_lza_dcd64_1_b;
|
|
wire ex4_lza_dcd64_2_b;
|
|
wire [0:2] ex5_lza_dcd64_cp1;
|
|
wire [0:1] ex5_lza_dcd64_cp2;
|
|
wire [0:0] ex5_lza_dcd64_cp3;
|
|
wire ex5_sh_rgt_en;
|
|
wire ex5_sh_rgt_en_eov;
|
|
wire ex3_effsub_eac;
|
|
wire ex3_effsub_eac_b;
|
|
wire [0:162] ex4_lzo_b;
|
|
wire [0:162] ex4_lzo_l2_b;
|
|
wire ex4_lv6_or_0;
|
|
wire ex4_lv6_or_1;
|
|
wire [0:7] ex4_rgt_amt_b;
|
|
wire lza_ex5_d1clk;
|
|
wire lza_ex5_d2clk;
|
|
wire lza_ex4_d1clk;
|
|
wire lza_ex4_d2clk;
|
|
//wire [0:`NCLK_WIDTH-1] lza_ex5_lclk;
|
|
//wire [0:`NCLK_WIDTH-1] lza_ex4_lclk;
|
|
wire lza_ex4_lclk;
|
|
wire lza_ex5_lclk;
|
|
|
|
//=###############################################################
|
|
//= map block attributes
|
|
//=###############################################################
|
|
|
|
//=###############################################################
|
|
//= 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
|
|
//=###############################################################
|
|
|
|
assign ex2_act = (~ex2_act_b);
|
|
|
|
|
|
tri_rlmreg_p #(.WIDTH(6), .NEEDS_SRESET(0)) act_lat(
|
|
.force_t(force_t), //i-- tidn,
|
|
.d_mode(tiup),
|
|
.delay_lclkr(delay_lclkr[3]), //i-- tidn,
|
|
.mpw1_b(mpw1_b[3]), //i-- tidn,
|
|
.mpw2_b(mpw2_b[0]), //i-- tidn,
|
|
.vd(vdd),
|
|
.gd(gnd),
|
|
.clk(clk),
|
|
.rst(rst),
|
|
.act(fpu_enable),
|
|
.thold_b(thold_0_b),
|
|
.sg(sg_0),
|
|
.scout(act_so),
|
|
.scin(act_si),
|
|
//-----------------
|
|
.din({ act_spare_unused[0],
|
|
act_spare_unused[1],
|
|
ex2_act,
|
|
ex3_act,
|
|
act_spare_unused[2],
|
|
act_spare_unused[3]}),
|
|
//-----------------
|
|
.dout({ act_spare_unused[0],
|
|
act_spare_unused[1],
|
|
ex3_act,
|
|
ex4_act,
|
|
act_spare_unused[2],
|
|
act_spare_unused[3]})
|
|
);
|
|
|
|
|
|
tri_lcbnd lza_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
|
|
.clk(clk),
|
|
.rst(rst), //in
|
|
.vd(vdd), //inout
|
|
.gd(gnd), //inout
|
|
.act(ex3_act), //in
|
|
.sg(sg_0), //in
|
|
.thold_b(thold_0_b), //in
|
|
.d1clk(lza_ex4_d1clk), //out
|
|
.d2clk(lza_ex4_d2clk), //out
|
|
.lclk(lza_ex4_lclk) //out
|
|
);
|
|
|
|
|
|
tri_lcbnd lza_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
|
|
.clk(clk),
|
|
.rst(rst), //in
|
|
.vd(vdd), //inout
|
|
.gd(gnd), //inout
|
|
.act(ex4_act), //in
|
|
.sg(sg_0), //in
|
|
.thold_b(thold_0_b), //in
|
|
.d1clk(lza_ex5_d1clk), //out
|
|
.d2clk(lza_ex5_d2clk), //out
|
|
.lclk(lza_ex5_lclk) //out
|
|
);
|
|
|
|
//=###############################################################
|
|
//= ex4 latches
|
|
//=###############################################################
|
|
|
|
|
|
tri_inv_nlats #(.WIDTH(163), .NEEDS_SRESET(0)) ex4_lzo_lat(
|
|
.vd(vdd),
|
|
.gd(gnd),
|
|
.clk(clk), // lclk.clk
|
|
.rst(rst),
|
|
.d1clk(lza_ex4_d1clk),
|
|
.d2clk(lza_ex4_d2clk),
|
|
.scanin(ex4_lzo_si),
|
|
.scanout(ex4_lzo_so),
|
|
.d(f_lze_ex3_lzo_din[0:162]),
|
|
.qb(ex4_lzo_l2_b[0:162])
|
|
);
|
|
|
|
assign ex4_lzo[0:162] = (~ex4_lzo_l2_b[0:162]);
|
|
assign ex4_lzo_b[0:162] = (~ex4_lzo[0:162]);
|
|
|
|
assign ex3_effsub_eac = (~f_alg_ex3_effsub_eac_b);
|
|
assign ex3_effsub_eac_b = (~ex3_effsub_eac);
|
|
|
|
|
|
tri_inv_nlats #(.WIDTH(1), .NEEDS_SRESET(0)) ex4_sub_lat(
|
|
.vd(vdd),
|
|
.gd(gnd),
|
|
.clk(clk), // lclk.clk
|
|
.rst(rst),
|
|
.d1clk(lza_ex4_d1clk),
|
|
.d2clk(lza_ex4_d2clk),
|
|
.scanin(ex4_sub_si[0]),
|
|
.scanout(ex4_sub_so[0]),
|
|
.d(ex3_effsub_eac_b),
|
|
.qb(ex4_effsub)
|
|
);
|
|
|
|
assign ex4_sum[0:52] = f_sa3_ex4_s[0:52];
|
|
|
|
//=###############################################################
|
|
//= ex4 logic
|
|
//=###############################################################
|
|
|
|
assign ex4_sum[53:162] = f_sa3_ex4_s[53:162];
|
|
assign ex4_car[53:162] = {f_sa3_ex4_c[53:161], tidn};
|
|
|
|
//=#------------------------------------------------
|
|
//=#-- EDGE DETECTION
|
|
//=#------------------------------------------------
|
|
|
|
|
|
fu_lza_ej lzaej(
|
|
.effsub(ex4_effsub), //i--
|
|
.sum(ex4_sum[0:162]), //i--
|
|
.car(ex4_car[53:162]), //i--
|
|
.lzo_b(ex4_lzo_b[0:162]), //i--
|
|
.edge_t(ex4_lv0_or[0:162]) //o--
|
|
);
|
|
|
|
//=#------------------------------------------------
|
|
//=#-- ENCODING TREE (CLZ) count leading zeroes
|
|
//=#------------------------------------------------
|
|
|
|
|
|
fu_lza_clz lzaclz(
|
|
.lv0_or(ex4_lv0_or[0:162]), //i--
|
|
.lv6_or_0(ex4_lv6_or_0), //o--
|
|
.lv6_or_1(ex4_lv6_or_1), //o--
|
|
.lza_any_b(ex4_lza_any_b), //i--
|
|
.lza_amt_b(ex4_lza_amt_b[0:7]) //o--
|
|
);
|
|
|
|
assign ex4_no_edge_b = (~ex4_lza_any_b);
|
|
|
|
//=###############################################################
|
|
//= ex5 latches
|
|
//=###############################################################
|
|
|
|
assign ex4_rgt_amt_b[0:7] = (~f_lze_ex4_sh_rgt_amt[0:7]);
|
|
|
|
assign ex4_sh_rgt_en_b = (~f_lze_ex4_sh_rgt_en);
|
|
|
|
assign ex4_lv6_or_0_b = (~ex4_lv6_or_0);
|
|
assign ex4_lv6_or_1_b = (~ex4_lv6_or_1);
|
|
assign ex4_lv6_or_0_t = (~ex4_lv6_or_0_b);
|
|
assign ex4_lv6_or_1_t = (~ex4_lv6_or_1_b);
|
|
|
|
assign ex4_lza_dcd64_0_b = (~(ex4_lv6_or_0_t & ex4_sh_rgt_en_b));
|
|
assign ex4_lza_dcd64_1_b = (~(ex4_lv6_or_0_b & ex4_lv6_or_1_t & ex4_sh_rgt_en_b));
|
|
assign ex4_lza_dcd64_2_b = (~(ex4_lv6_or_0_b & ex4_lv6_or_1_b & ex4_sh_rgt_en_b));
|
|
|
|
tri_inv_nlats #(.WIDTH(9), .NEEDS_SRESET(0)) ex5_dcd_lat(
|
|
.vd(vdd),
|
|
.gd(gnd),
|
|
.clk(clk), // lclk.clk
|
|
.rst(rst),
|
|
.d1clk(lza_ex5_d1clk),
|
|
.d2clk(lza_ex5_d2clk),
|
|
.scanin(ex5_dcd_si[0:8]),
|
|
.scanout(ex5_dcd_so[0:8]),
|
|
.d({ex4_lza_dcd64_0_b, //( 0)
|
|
ex4_lza_dcd64_0_b, //( 1)
|
|
ex4_lza_dcd64_0_b, //( 2)
|
|
ex4_lza_dcd64_1_b, //( 3)
|
|
ex4_lza_dcd64_1_b, //( 4)
|
|
ex4_lza_dcd64_2_b, //( 5)
|
|
ex4_sh_rgt_en_b, //( 6)
|
|
ex4_sh_rgt_en_b, //( 7)
|
|
ex4_no_edge_b}), //(24)
|
|
//-----------------
|
|
.qb({ex5_lza_dcd64_cp1[0], //( 6)
|
|
ex5_lza_dcd64_cp2[0], //( 9)
|
|
ex5_lza_dcd64_cp3[0], //( 1)
|
|
ex5_lza_dcd64_cp1[1], //( 7)
|
|
ex5_lza_dcd64_cp2[1], //( 0)
|
|
ex5_lza_dcd64_cp1[2], //( 8)
|
|
ex5_sh_rgt_en, //( 2)
|
|
ex5_sh_rgt_en_eov, //( 3)
|
|
ex5_no_edge}) //(24)
|
|
);
|
|
|
|
|
|
tri_nand2_nlats #(.WIDTH(16), .NEEDS_SRESET(0)) ex5_amt_lat(
|
|
.vd(vdd),
|
|
.gd(gnd),
|
|
.clk(clk), //in --lclk.clk
|
|
.rst(rst),
|
|
.d1clk(lza_ex5_d1clk), //in
|
|
.d2clk(lza_ex5_d2clk), //in
|
|
.scanin(ex5_amt_si[0:15]),
|
|
.scanout(ex5_amt_so[0:15]),
|
|
.a1({ ex4_lza_amt_b[0], //( 8)
|
|
ex4_lza_amt_b[0], //( 9)
|
|
ex4_lza_amt_b[1], //(10)
|
|
ex4_lza_amt_b[1], //(11)
|
|
ex4_lza_amt_b[2], //(12)
|
|
ex4_lza_amt_b[2], //(13)
|
|
ex4_lza_amt_b[3], //(14)
|
|
ex4_lza_amt_b[3], //(15)
|
|
ex4_lza_amt_b[4], //(16)
|
|
ex4_lza_amt_b[4], //(17)
|
|
ex4_lza_amt_b[5], //(18)
|
|
ex4_lza_amt_b[5], //(19)
|
|
ex4_lza_amt_b[6], //(20)
|
|
ex4_lza_amt_b[6], //(21)
|
|
ex4_lza_amt_b[7], //(22)
|
|
ex4_lza_amt_b[7]}), //(23)
|
|
|
|
.a2({ ex4_rgt_amt_b[0], //( 8)
|
|
ex4_rgt_amt_b[0], //( 9)
|
|
ex4_rgt_amt_b[1], //(10)
|
|
ex4_rgt_amt_b[1], //(11)
|
|
ex4_rgt_amt_b[2], //(12)
|
|
ex4_rgt_amt_b[2], //(13)
|
|
ex4_rgt_amt_b[3], //(14)
|
|
ex4_rgt_amt_b[3], //(15)
|
|
ex4_rgt_amt_b[4], //(16)
|
|
ex4_rgt_amt_b[4], //(17)
|
|
ex4_rgt_amt_b[5], //(18)
|
|
ex4_rgt_amt_b[5], //(19)
|
|
ex4_rgt_amt_b[6], //(20)
|
|
ex4_rgt_amt_b[6], //(21)
|
|
ex4_rgt_amt_b[7], //(22)
|
|
ex4_rgt_amt_b[7] }), //(23)
|
|
|
|
//-----------------
|
|
.qb({ ex5_amt[0], //( 0)
|
|
ex5_amt_eov[0], //( 8)
|
|
ex5_amt[1], //(11)
|
|
ex5_amt_eov[1], //(19)
|
|
ex5_amt[2], //(12)
|
|
ex5_amt_eov[2], //(10)
|
|
ex5_amt[3], //(13)
|
|
ex5_amt_eov[3], //(11)
|
|
ex5_amt[4], //(14)
|
|
ex5_amt_eov[4], //(12)
|
|
ex5_amt[5], //(15)
|
|
ex5_amt_eov[5], //(13)
|
|
ex5_amt[6], //(26)
|
|
ex5_amt_eov[6], //(24)
|
|
ex5_amt[7], //(27)
|
|
ex5_amt_eov[7]}) //(24)
|
|
);
|
|
|
|
assign f_lza_ex5_sh_rgt_en = ex5_sh_rgt_en;
|
|
assign f_lza_ex5_sh_rgt_en_eov = ex5_sh_rgt_en_eov;
|
|
|
|
assign f_lza_ex5_lza_amt = ex5_amt[0:7]; //output-- --fnrm--
|
|
|
|
assign f_lza_ex5_lza_dcd64_cp1[0:2] = ex5_lza_dcd64_cp1[0:2]; //ouptut-- --fnrm
|
|
assign f_lza_ex5_lza_dcd64_cp2[0:1] = ex5_lza_dcd64_cp2[0:1]; //ouptut-- --fnrm
|
|
assign f_lza_ex5_lza_dcd64_cp3[0] = ex5_lza_dcd64_cp3[0]; //ouptut-- --fnrm
|
|
|
|
assign f_lza_ex5_lza_amt_eov = ex5_amt_eov[0:7]; //output-- --feov--
|
|
assign f_lza_ex5_no_lza_edge = ex5_no_edge; //output-- --fpic--
|
|
|
|
//=###############################################################
|
|
//= scan string
|
|
//=###############################################################
|
|
|
|
assign ex4_lzo_si[0:162] = {ex4_lzo_so[1:162], f_lza_si};
|
|
assign ex4_sub_si[0] = ex4_lzo_so[0];
|
|
assign ex5_amt_si[0:15] = {ex5_amt_so[1:15], ex4_sub_so[0]};
|
|
assign ex5_dcd_si[0:8] = {ex5_dcd_so[1:8], ex5_amt_so[0]};
|
|
assign act_si[0:5] = {act_so[1:5], ex5_dcd_so[0]};
|
|
assign f_lza_so = act_so[0];
|
|
|
|
endmodule
|