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.

342 lines
10 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 lq_agen(
x,
y,
mode64,
dir_ig_57_b,
sum_non_erat,
sum,
sum_arr_dir01,
sum_arr_dir23,
sum_arr_dir45,
sum_arr_dir67,
way,
rel4_dir_wr_val,
ary_write_act_01,
ary_write_act_23,
ary_write_act_45,
ary_write_act_67
);
//-------------------------------------------------------------------
// Generics
//-------------------------------------------------------------------
//parameter expand_type = 2; // 2 - ibm tech, 1 - other
input [0:63] x;
input [0:63] y;
input mode64; // 1 per byte [0:31]
input dir_ig_57_b; // when this is low , bit 57 becomes "1" .
output [0:63] sum_non_erat; // for compares and uses other than array address
output [0:51] sum; // 0:51 for erat
output [52:57] sum_arr_dir01;
output [52:57] sum_arr_dir23;
output [52:57] sum_arr_dir45;
output [52:57] sum_arr_dir67;
input [0:7] way; // 8 bit vector use to be in array model
input rel4_dir_wr_val;
output ary_write_act_01;
output ary_write_act_23;
output ary_write_act_45;
output ary_write_act_67;
parameter tiup = 1'b1;
parameter tidn = 1'b0;
wire [0:51] sum_int;
wire [0:51] sum_non_erat_b;
wire [0:51] sum_erat;
wire [0:51] sum_erat_b;
wire [0:51] sum_0;
wire [0:51] sum_1;
wire [1:7] g08;
wire [1:6] t08;
wire [1:7] c64_b;
wire addr_sel_64;
wire [0:63] x_b;
wire [0:63] y_b;
wire [52:57] sum_arr;
wire [52:57] sum_arr_lv1_0_b;
wire [52:57] sum_arr_lv1_1_b;
assign addr_sel_64 = mode64;
// assume pins come in the top
// start global carry along the top .
// byte groups (0 near top) stretch out along the macro.
//assign x_b[0:63] = (~(x[0:63])); // receiving inverter near pin
tri_inv #(.WIDTH(64)) x_b_0 (.y(x_b[0:63]), .a(x[0:63]));
//assign y_b[0:63] = (~(y[0:63])); // receiving inverter near pin
tri_inv #(.WIDTH(64)) y_b_0 (.y(y_b[0:63]), .a(y[0:63]));
//##################################################
//## local part of byte group
//##################################################
lq_agen_loca loc_0(
.x_b(x_b[0:7]), //i--
.y_b(y_b[0:7]), //i--
.sum_0(sum_0[0:7]), //o--
.sum_1(sum_1[0:7]) //o--
);
lq_agen_loca loc_1(
.x_b(x_b[8:15]), //i--
.y_b(y_b[8:15]), //i--
.sum_0(sum_0[8:15]), //o--
.sum_1(sum_1[8:15]) //o--
);
lq_agen_loca loc_2(
.x_b(x_b[16:23]), //i--
.y_b(y_b[16:23]), //i--
.sum_0(sum_0[16:23]), //o--
.sum_1(sum_1[16:23]) //o--
);
lq_agen_loca loc_3(
.x_b(x_b[24:31]), //i--
.y_b(y_b[24:31]), //i--
.sum_0(sum_0[24:31]), //o--
.sum_1(sum_1[24:31]) //o--
);
lq_agen_loca loc_4(
.x_b(x_b[32:39]), //i--
.y_b(y_b[32:39]), //i--
.sum_0(sum_0[32:39]), //o--
.sum_1(sum_1[32:39]) //o--
);
lq_agen_loca loc_5(
.x_b(x_b[40:47]), //i--
.y_b(y_b[40:47]), //i--
.sum_0(sum_0[40:47]), //o--
.sum_1(sum_1[40:47]) //o--
);
lq_agen_locae loc_6(
.x_b(x_b[48:55]), //i--
.y_b(y_b[48:55]), //i--
.sum_0(sum_0[48:51]), //o--
.sum_1(sum_1[48:51]) //o--
);
//##################################################
//## local part of global carry
//##################################################
lq_agen_glbloc gclc_1(
.x_b(x_b[8:15]), //i--
.y_b(y_b[8:15]), //i--
.g08(g08[1]), //o--
.t08(t08[1]) //o--
);
lq_agen_glbloc gclc_2(
.x_b(x_b[16:23]), //i--
.y_b(y_b[16:23]), //i--
.g08(g08[2]), //o--
.t08(t08[2]) //o--
);
lq_agen_glbloc gclc_3(
.x_b(x_b[24:31]), //i--
.y_b(y_b[24:31]), //i--
.g08(g08[3]), //o--
.t08(t08[3]) //o--
);
lq_agen_glbloc gclc_4(
.x_b(x_b[32:39]), //i--
.y_b(y_b[32:39]), //i--
.g08(g08[4]), //o--
.t08(t08[4]) //o--
);
lq_agen_glbloc gclc_5(
.x_b(x_b[40:47]), //i--
.y_b(y_b[40:47]), //i--
.g08(g08[5]), //o--
.t08(t08[5]) //o--
);
lq_agen_glbloc gclc_6(
.x_b(x_b[48:55]), //i--
.y_b(y_b[48:55]), //i--
.g08(g08[6]), //o--
.t08(t08[6]) //o--
);
lq_agen_glbloc_lsb gclc_7(
.x_b(x_b[56:63]), //i--
.y_b(y_b[56:63]), //i--
.g08(g08[7]) //o--
);
//##################################################
//## global part of global carry {replicate ending of global carry vertical)
//##################################################
lq_agen_glbglb gc(
.g08(g08[1:7]), //i--
.t08(t08[1:6]), //i--
.c64_b(c64_b[1:7]) //o--
);
//##################################################
//## final mux (vertical)
//##################################################
lq_agen_csmux fm_0(
.ci_b(c64_b[1]), //i--
.sum_0(sum_0[0:7]), //i--
.sum_1(sum_1[0:7]), //i--
.sum(sum_int[0:7]) //o--
);
lq_agen_csmux fm_1(
.ci_b(c64_b[2]), //i--
.sum_0(sum_0[8:15]), //i--
.sum_1(sum_1[8:15]), //i--
.sum(sum_int[8:15]) //o--
);
lq_agen_csmux fm_2(
.ci_b(c64_b[3]), //i--
.sum_0(sum_0[16:23]), //i--
.sum_1(sum_1[16:23]), //i--
.sum(sum_int[16:23]) //o--
);
lq_agen_csmux fm_3(
.ci_b(c64_b[4]), //i--
.sum_0(sum_0[24:31]), //i--
.sum_1(sum_1[24:31]), //i--
.sum(sum_int[24:31]) //o--
);
lq_agen_csmux fm_4(
.ci_b(c64_b[5]), //i--
.sum_0(sum_0[32:39]), //i--
.sum_1(sum_1[32:39]), //i--
.sum(sum_int[32:39]) //o--
);
lq_agen_csmux fm_5(
.ci_b(c64_b[6]), //i--
.sum_0(sum_0[40:47]), //i--
.sum_1(sum_1[40:47]), //i--
.sum(sum_int[40:47]) //o--
);
// just the 4 msb of the byte go to erat
lq_agen_csmuxe fm_6(
.ci_b(c64_b[7]), //i--
.sum_0(sum_0[48:51]), //i--
.sum_1(sum_1[48:51]), //i--
.sum(sum_int[48:51]) //o--
);
// 12 lsbs are for the DIRECTORY
lq_agen_lo kog(
.dir_ig_57_b(dir_ig_57_b), //i--lq_agen_lo(kog) force dir addr 57 to "1"
.x_b(x_b[52:63]), //i--lq_agen_lo(kog)
.y_b(y_b[52:63]), //i--lq_agen_lo(kog)
.sum(sum_non_erat[52:63]), //o--lq_agen_lo(kog) for the compares etc
.sum_arr(sum_arr[52:57]) //o--lq_agen_lo(kog) for the array address
);
//assign sum_non_erat_b[0:51] = (~(sum_int[0:51]));
tri_inv #(.WIDTH(52)) sum_non_erat_b_0 (.y(sum_non_erat_b[0:51]), .a(sum_int[0:51]));
//assign sum_non_erat[0:51] = (~(sum_non_erat_b[0:51]));
tri_inv #(.WIDTH(52)) sum_non_erat_0 (.y(sum_non_erat[0:51]), .a(sum_non_erat_b[0:51]));
//assign sum_erat_b[0:31] = (~(sum_int[0:31] & {32{addr_sel_64}}));
tri_nand2 #(.WIDTH(32)) sum_erat_b_0 (.y(sum_erat_b[0:31]), .a(sum_int[0:31]), .b({32{addr_sel_64}}));
//assign sum_erat_b[32:51] = (~(sum_int[32:51]));
tri_inv #(.WIDTH(20)) sum_erat_b_32 (.y(sum_erat_b[32:51]), .a(sum_int[32:51]));
//assign sum_erat = (~(sum_erat_b));
tri_inv #(.WIDTH(52)) sum_erat_0 (.y(sum_erat[0:51]), .a(sum_erat_b[0:51]));
assign sum = sum_erat; //rename-- to ERAT only
// ###################################
// # repower network for directoru
// ###################################
//assign sum_arr_lv1_1_b[52:57] = (~(sum_arr[52:57])); // 4x
tri_inv #(.WIDTH(6)) sum_arr_lv1_1_b_52 (.y(sum_arr_lv1_1_b[52:57]), .a(sum_arr[52:57]));
//assign sum_arr_dir01[52:57] = (~(sum_arr_lv1_1_b[52:57])); // 4x --output--
tri_inv #(.WIDTH(6)) sum_arr_dir01_52 (.y(sum_arr_dir01[52:57]), .a(sum_arr_lv1_1_b[52:57]));
//assign sum_arr_dir45[52:57] = (~(sum_arr_lv1_1_b[52:57])); // 4x --output--
tri_inv #(.WIDTH(6)) sum_arr_dir45_52 (.y(sum_arr_dir45[52:57]), .a(sum_arr_lv1_1_b[52:57]));
//assign sum_arr_lv1_0_b[52:57] = (~(sum_arr[52:57])); // 6x
tri_inv #(.WIDTH(6)) sum_arr_lv1_0_b_52 (.y(sum_arr_lv1_0_b[52:57]), .a(sum_arr[52:57]));
//assign sum_arr_dir23[52:57] = (~(sum_arr_lv1_0_b[52:57])); // 4x --output--
tri_inv #(.WIDTH(6)) sum_arr_dir23_52 (.y(sum_arr_dir23[52:57]), .a(sum_arr_lv1_0_b[52:57]));
//assign sum_arr_dir67[52:57] = (~(sum_arr_lv1_0_b[52:57])); // 4x --output--
tri_inv #(.WIDTH(6)) sum_arr_dir67_52 (.y(sum_arr_dir67[52:57]), .a(sum_arr_lv1_0_b[52:57]));
// ######################################################################
// ## this experimental piece is for directory read/write collisions
// ######################################################################
assign ary_write_act_01 = rel4_dir_wr_val & (way[0] | way[1]);
assign ary_write_act_23 = rel4_dir_wr_val & (way[2] | way[3]);
assign ary_write_act_45 = rel4_dir_wr_val & (way[4] | way[5]);
assign ary_write_act_67 = rel4_dir_wr_val & (way[6] | way[7]);
endmodule