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.
272 lines
10 KiB
Verilog
272 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
|
|
|
|
// Description: XU_FX ALU Top
|
|
//
|
|
//*****************************************************************************
|
|
`include "tri_a2o.vh"
|
|
module xu_gpr(
|
|
//-------------------------------------------------------------------
|
|
// Clocks & Power
|
|
//-------------------------------------------------------------------
|
|
input [0:`NCLK_WIDTH-1] nclk,
|
|
inout vdd,
|
|
inout gnd,
|
|
|
|
//-------------------------------------------------------------------
|
|
// Pervasive
|
|
//-------------------------------------------------------------------
|
|
input pc_xu_ccflush_dc,
|
|
input d_mode_dc,
|
|
input delay_lclkr_dc,
|
|
input mpw1_dc_b,
|
|
input mpw2_dc_b,
|
|
input func_sl_force,
|
|
input func_sl_thold_0_b,
|
|
input sg_0,
|
|
input scan_in,
|
|
output scan_out,
|
|
|
|
//-------------------------------------------------------------------
|
|
// Read Ports
|
|
//-------------------------------------------------------------------
|
|
input r0e,
|
|
input [0:`GPR_POOL_ENC+`THREADS_POOL_ENC-1] r0a,
|
|
output [64-`GPR_WIDTH:63] r0d,
|
|
input r1e,
|
|
input [0:`GPR_POOL_ENC+`THREADS_POOL_ENC-1] r1a,
|
|
output [64-`GPR_WIDTH:63] r1d,
|
|
input r2e,
|
|
input [0:`GPR_POOL_ENC+`THREADS_POOL_ENC-1] r2a,
|
|
output [64-`GPR_WIDTH:63] r2d,
|
|
input r3e,
|
|
input [0:`GPR_POOL_ENC+`THREADS_POOL_ENC-1] r3a,
|
|
output [64-`GPR_WIDTH:63] r3d,
|
|
|
|
// Special Port for 3src instructions- erativax
|
|
input r4e,
|
|
input [0:2] r4t_q,
|
|
input [0:`GPR_POOL_ENC+`THREADS_POOL_ENC-1] r4a,
|
|
|
|
output r0_pe,
|
|
output r1_pe,
|
|
output r2_pe,
|
|
output r3_pe,
|
|
//-------------------------------------------------------------------
|
|
// Write ports
|
|
//-------------------------------------------------------------------
|
|
input w0e,
|
|
input [0:`GPR_POOL_ENC+`THREADS_POOL_ENC-1] w0a,
|
|
input [64-`GPR_WIDTH:65+`GPR_WIDTH/8] w0d,
|
|
input w1e,
|
|
input [0:`GPR_POOL_ENC+`THREADS_POOL_ENC-1] w1a,
|
|
input [64-`GPR_WIDTH:65+`GPR_WIDTH/8] w1d,
|
|
input w2e,
|
|
input [0:`GPR_POOL_ENC+`THREADS_POOL_ENC-1] w2a,
|
|
input [64-`GPR_WIDTH:65+`GPR_WIDTH/8] w2d,
|
|
input w3e,
|
|
input [0:`GPR_POOL_ENC+`THREADS_POOL_ENC-1] w3a,
|
|
input [64-`GPR_WIDTH:65+`GPR_WIDTH/8] w3d
|
|
);
|
|
|
|
// Latches
|
|
wire r4e_q; // input=>r4e ,act=>1'b1
|
|
wire [0:`GPR_POOL_ENC+`THREADS_POOL_ENC-1] r4a_q; // input=>r4a ,act=>1'b1
|
|
// Scanchain
|
|
localparam r4e_offset = 2;
|
|
localparam r4a_offset = r4e_offset + 1;
|
|
localparam scan_right = r4a_offset + `GPR_POOL_ENC+`THREADS_POOL_ENC;
|
|
wire [0:scan_right-1] siv;
|
|
wire [0:scan_right-1] sov;
|
|
// Signals
|
|
wire [64-`GPR_WIDTH:77] w0d_int;
|
|
wire [64-`GPR_WIDTH:77] w1d_int;
|
|
wire [64-`GPR_WIDTH:77] w2d_int;
|
|
wire [64-`GPR_WIDTH:77] w3d_int;
|
|
wire [64-`GPR_WIDTH:77] r0d_int;
|
|
wire [64-`GPR_WIDTH:77] r1d_int;
|
|
wire [64-`GPR_WIDTH:77] r2d_int;
|
|
wire [64-`GPR_WIDTH:77] r3d_int;
|
|
wire [0:`GPR_WIDTH/8-1] r0d_par;
|
|
wire [0:`GPR_WIDTH/8-1] r1d_par;
|
|
wire [0:`GPR_WIDTH/8-1] r2d_par;
|
|
wire [0:`GPR_WIDTH/8-1] r3d_par;
|
|
wire r0e_int;
|
|
wire r4e_sel;
|
|
wire [0:`GPR_POOL_ENC+`THREADS_POOL_ENC-1] r0a_int;
|
|
|
|
assign r4e_sel = r4e_q & ~|r4t_q;
|
|
|
|
assign r0e_int = r4e_sel | r0e;
|
|
|
|
assign r0a_int = (r4e_sel == 1'b1) ? r4a_q : r0a;
|
|
|
|
assign r0d = r0d_int[64 - `GPR_WIDTH:63];
|
|
assign r1d = r1d_int[64 - `GPR_WIDTH:63];
|
|
assign r2d = r2d_int[64 - `GPR_WIDTH:63];
|
|
assign r3d = r3d_int[64 - `GPR_WIDTH:63];
|
|
|
|
assign w0d_int[64 - `GPR_WIDTH:65 + `GPR_WIDTH/8] = w0d;
|
|
assign w0d_int[66 + `GPR_WIDTH/8:77] = {4{1'b0}};
|
|
assign w1d_int[64 - `GPR_WIDTH:65 + `GPR_WIDTH/8] = w1d;
|
|
assign w1d_int[66 + `GPR_WIDTH/8:77] = {4{1'b0}};
|
|
assign w2d_int[64 - `GPR_WIDTH:65 + `GPR_WIDTH/8] = w2d;
|
|
assign w2d_int[66 + `GPR_WIDTH/8:77] = {4{1'b0}};
|
|
assign w3d_int[64 - `GPR_WIDTH:65 + `GPR_WIDTH/8] = w3d;
|
|
assign w3d_int[66 + `GPR_WIDTH/8:77] = {4{1'b0}};
|
|
|
|
generate
|
|
genvar i;
|
|
for (i = 0; i <= `GPR_WIDTH/8 - 1; i = i + 1)
|
|
begin : parity
|
|
assign r0d_par[i] = ^(r0d_int[8 * i:8 * i + 7]);
|
|
assign r1d_par[i] = ^(r1d_int[8 * i:8 * i + 7]);
|
|
assign r2d_par[i] = ^(r2d_int[8 * i:8 * i + 7]);
|
|
assign r3d_par[i] = ^(r3d_int[8 * i:8 * i + 7]);
|
|
end
|
|
endgenerate
|
|
|
|
assign r0_pe = r0e & (r0d_par != r0d_int[64:63 + `GPR_WIDTH/8]);
|
|
assign r1_pe = r1e & (r1d_par != r1d_int[64:63 + `GPR_WIDTH/8]);
|
|
assign r2_pe = r2e & (r2d_par != r2d_int[64:63 + `GPR_WIDTH/8]);
|
|
assign r3_pe = r3e & (r3d_par != r3d_int[64:63 + `GPR_WIDTH/8]);
|
|
|
|
|
|
tri_144x78_2r4w gpr0(
|
|
.vdd(vdd),
|
|
.gnd(gnd),
|
|
.nclk(nclk),
|
|
.delay_lclkr_dc(delay_lclkr_dc),
|
|
.mpw1_dc_b(mpw1_dc_b),
|
|
.mpw2_dc_b(mpw2_dc_b),
|
|
.func_sl_force(func_sl_force),
|
|
.func_sl_thold_0_b(func_sl_thold_0_b),
|
|
.func_slp_sl_force(func_sl_force),
|
|
.func_slp_sl_thold_0_b(func_sl_thold_0_b),
|
|
.sg_0(sg_0),
|
|
.scan_in(siv[0]),
|
|
.scan_out(sov[0]),
|
|
.r_late_en_1(r0e_int),
|
|
.r_addr_in_1(r0a_int),
|
|
.r_data_out_1(r0d_int),
|
|
.r_late_en_2(r1e),
|
|
.r_addr_in_2(r1a),
|
|
.r_data_out_2(r1d_int),
|
|
.w_late_en_1(w0e),
|
|
.w_addr_in_1(w0a),
|
|
.w_data_in_1(w0d_int),
|
|
.w_late_en_2(w1e),
|
|
.w_addr_in_2(w1a),
|
|
.w_data_in_2(w1d_int),
|
|
.w_late_en_3(w2e),
|
|
.w_addr_in_3(w2a),
|
|
.w_data_in_3(w2d_int),
|
|
.w_late_en_4(w3e),
|
|
.w_addr_in_4(w3a),
|
|
.w_data_in_4(w3d_int)
|
|
);
|
|
|
|
|
|
tri_144x78_2r4w gpr1(
|
|
.vdd(vdd),
|
|
.gnd(gnd),
|
|
.nclk(nclk),
|
|
.delay_lclkr_dc(delay_lclkr_dc),
|
|
.mpw1_dc_b(mpw1_dc_b),
|
|
.mpw2_dc_b(mpw2_dc_b),
|
|
.func_sl_force(func_sl_force),
|
|
.func_sl_thold_0_b(func_sl_thold_0_b),
|
|
.func_slp_sl_force(func_sl_force),
|
|
.func_slp_sl_thold_0_b(func_sl_thold_0_b),
|
|
.sg_0(sg_0),
|
|
.scan_in(siv[1]),
|
|
.scan_out(sov[1]),
|
|
.r_late_en_1(r2e),
|
|
.r_addr_in_1(r2a),
|
|
.r_data_out_1(r2d_int),
|
|
.r_late_en_2(r3e),
|
|
.r_addr_in_2(r3a),
|
|
.r_data_out_2(r3d_int),
|
|
.w_late_en_1(w0e),
|
|
.w_addr_in_1(w0a),
|
|
.w_data_in_1(w0d_int),
|
|
.w_late_en_2(w1e),
|
|
.w_addr_in_2(w1a),
|
|
.w_data_in_2(w1d_int),
|
|
.w_late_en_3(w2e),
|
|
.w_addr_in_3(w2a),
|
|
.w_data_in_3(w2d_int),
|
|
.w_late_en_4(w3e),
|
|
.w_addr_in_4(w3a),
|
|
.w_data_in_4(w3d_int)
|
|
);
|
|
|
|
|
|
tri_rlmlatch_p #(.INIT(0), .NEEDS_SRESET(1)) r4e_latch(
|
|
.nclk(nclk),
|
|
.vd(vdd),
|
|
.gd(gnd),
|
|
.act(1'b1),
|
|
.force_t(func_sl_force),
|
|
.d_mode(d_mode_dc),
|
|
.delay_lclkr(delay_lclkr_dc),
|
|
.mpw1_b(mpw1_dc_b),
|
|
.mpw2_b(mpw2_dc_b),
|
|
.thold_b(func_sl_thold_0_b),
|
|
.sg(sg_0),
|
|
.scin(siv[r4e_offset]),
|
|
.scout(sov[r4e_offset]),
|
|
.din(r4e),
|
|
.dout(r4e_q)
|
|
);
|
|
|
|
tri_rlmreg_p #(.WIDTH(`GPR_POOL_ENC+`THREADS_POOL_ENC), .INIT(0), .NEEDS_SRESET(1)) r4a_latch(
|
|
.nclk(nclk),
|
|
.vd(vdd),
|
|
.gd(gnd),
|
|
.act(1'b1),
|
|
.force_t(func_sl_force),
|
|
.d_mode(d_mode_dc),
|
|
.delay_lclkr(delay_lclkr_dc),
|
|
.mpw1_b(mpw1_dc_b),
|
|
.mpw2_b(mpw2_dc_b),
|
|
.thold_b(func_sl_thold_0_b),
|
|
.sg(sg_0),
|
|
.scin(siv[r4a_offset:r4a_offset + `GPR_POOL_ENC+`THREADS_POOL_ENC - 1]),
|
|
.scout(sov[r4a_offset:r4a_offset + `GPR_POOL_ENC+`THREADS_POOL_ENC - 1]),
|
|
.din(r4a),
|
|
.dout(r4a_q)
|
|
);
|
|
|
|
assign siv[0:scan_right-1] = {sov[1:scan_right-1], scan_in};
|
|
assign scan_out = sov[0];
|
|
|
|
endmodule
|