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.

736 lines
25 KiB
Verilog

2 years ago
// © 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 LSU Load Data Rotator
//
//*****************************************************************************
// ##########################################################################################
// Contents
// 1) 16 bit Unaligned Rotate to the Right Rotator
// 2) Little/Big Endian Support
// ##########################################################################################
`include "tri_a2o.vh"
module tri_lq_rmw(
ex2_stq4_rd_stg_act,
ex2_stq4_rd_addr,
stq6_rd_data_wa,
stq6_rd_data_wb,
stq6_rd_data_wc,
stq6_rd_data_wd,
stq6_rd_data_we,
stq6_rd_data_wf,
stq6_rd_data_wg,
stq6_rd_data_wh,
stq5_stg_act,
stq5_arr_wren,
stq5_arr_wr_way,
stq5_arr_wr_addr,
stq5_arr_wr_bytew,
stq5_arr_wr_data,
stq7_byp_val_wabcd,
stq7_byp_val_wefgh,
stq7_byp_data_wabcd,
stq7_byp_data_wefgh,
stq8_byp_data_wabcd,
stq8_byp_data_wefgh,
stq_byp_val_wabcd,
stq_byp_val_wefgh,
dcarr_rd_stg_act,
dcarr_wr_stg_act,
dcarr_wr_way,
dcarr_wr_addr,
dcarr_wr_data_wabcd,
dcarr_wr_data_wefgh,
nclk,
vdd,
gnd,
d_mode_dc,
delay_lclkr_dc,
mpw1_dc_b,
mpw2_dc_b,
func_sl_force,
func_sl_thold_0_b,
sg_0,
scan_in,
scan_out
);
// EX2/STQ4 Read Operation
input ex2_stq4_rd_stg_act;
input [52:59] ex2_stq4_rd_addr;
// Read data for Read-Modify-Write
input [0:143] stq6_rd_data_wa;
input [0:143] stq6_rd_data_wb;
input [0:143] stq6_rd_data_wc;
input [0:143] stq6_rd_data_wd;
input [0:143] stq6_rd_data_we;
input [0:143] stq6_rd_data_wf;
input [0:143] stq6_rd_data_wg;
input [0:143] stq6_rd_data_wh;
// Write Data for Read-Modify-Write
input stq5_stg_act;
input stq5_arr_wren;
input [0:7] stq5_arr_wr_way;
input [52:59] stq5_arr_wr_addr;
input [0:15] stq5_arr_wr_bytew;
input [0:143] stq5_arr_wr_data;
// EX4 Load Bypass Data for Read/Write Collision detected in EX2
output [0:3] stq7_byp_val_wabcd;
output [0:3] stq7_byp_val_wefgh;
output [0:143] stq7_byp_data_wabcd;
output [0:143] stq7_byp_data_wefgh;
output [0:143] stq8_byp_data_wabcd;
output [0:143] stq8_byp_data_wefgh;
output [0:3] stq_byp_val_wabcd;
output [0:3] stq_byp_val_wefgh;
// Data Cache Array Write
output [0:7] dcarr_rd_stg_act;
output [0:7] dcarr_wr_stg_act;
output [0:7] dcarr_wr_way;
output [52:59] dcarr_wr_addr;
output [0:143] dcarr_wr_data_wabcd;
output [0:143] dcarr_wr_data_wefgh;
(* pin_data="PIN_FUNCTION=/G_CLK/CAP_LIMIT=/99999/" *)
input [0:`NCLK_WIDTH-1] nclk;
inout vdd;
inout gnd;
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;
(* pin_data="PIN_FUNCTION=/SCAN_IN/" *)
input scan_in;
(* pin_data="PIN_FUNCTION=/SCAN_OUT/" *)
output scan_out;
wire [52:59] ex3_stq5_rd_addr_d;
wire [52:59] ex3_stq5_rd_addr_q;
wire stq6_stg_act_d;
wire stq6_stg_act_q;
wire stq7_stg_act_d;
wire stq7_stg_act_q;
wire stq6_wren_d;
wire stq6_wren_q;
wire stq7_wren_d;
wire stq7_wren_q;
wire [0:7] stq6_way_en_d;
wire [0:7] stq6_way_en_q;
wire [0:7] stq7_way_en_d;
wire [0:7] stq7_way_en_q;
wire [0:7] stq6_wr_way;
wire [52:59] stq6_addr_d;
wire [52:59] stq6_addr_q;
wire [52:59] stq7_addr_d;
wire [52:59] stq7_addr_q;
wire [0:143] stq6_gate_rd_data_wa;
wire [0:143] stq6_gate_rd_data_wb;
wire [0:143] stq6_gate_rd_data_wc;
wire [0:143] stq6_gate_rd_data_wd;
wire [0:143] stq6_gate_rd_data_we;
wire [0:143] stq6_gate_rd_data_wf;
wire [0:143] stq6_gate_rd_data_wg;
wire [0:143] stq6_gate_rd_data_wh;
wire [0:143] stq6_rd_data_wabcd;
wire [0:143] stq6_wr_data_wabcd;
wire [0:143] stq7_wr_data_wabcd_d;
wire [0:143] stq7_wr_data_wabcd_q;
wire [0:143] stq8_wr_data_wabcd_d;
wire [0:143] stq8_wr_data_wabcd_q;
wire [0:143] stq6_rd_data_wefgh;
wire [0:143] stq6_wr_data_wefgh;
wire [0:143] stq7_wr_data_wefgh_d;
wire [0:143] stq7_wr_data_wefgh_q;
wire [0:143] stq8_wr_data_wefgh_d;
wire [0:143] stq8_wr_data_wefgh_q;
wire ex2_stq4_addr_coll;
wire [0:7] ex2_stq4_way_coll;
wire stq6_rd_byp_val;
wire stq7_rd_byp_val;
wire stq6_wr_byp_val;
wire stq7_wr_byp_val;
wire stq5_byp_val;
wire [0:143] stq5_wr_bit;
wire [0:143] stq5_msk_bit;
wire [0:15] stq5_byte_en;
wire [0:15] stq6_byte_en_wabcd_d;
wire [0:15] stq6_byte_en_wabcd_q;
wire [0:143] stq6_wr_bit_wabcd;
wire [0:143] stq6_msk_bit_wabcd;
wire [0:15] stq6_byte_en_wefgh_d;
wire [0:15] stq6_byte_en_wefgh_q;
wire [0:143] stq6_wr_bit_wefgh;
wire [0:143] stq6_msk_bit_wefgh;
wire [0:143] stq6_stq7_byp_data_wabcd;
wire [0:143] stq5_byp_wr_data_wabcd;
wire [0:143] stq6_byp_wr_data_wabcd_d;
wire [0:143] stq6_byp_wr_data_wabcd_q;
wire [0:143] stq6_stq7_byp_data_wefgh;
wire [0:143] stq5_byp_wr_data_wefgh;
wire [0:143] stq6_byp_wr_data_wefgh_d;
wire [0:143] stq6_byp_wr_data_wefgh_q;
wire [0:3] stq7_byp_val_wabcd_d;
wire [0:3] stq7_byp_val_wabcd_q;
wire [0:3] stq7_byp_val_wefgh_d;
wire [0:3] stq7_byp_val_wefgh_q;
wire [0:3] stq_byp_val_wabcd_d;
wire [0:3] stq_byp_val_wabcd_q;
wire [0:3] stq_byp_val_wefgh_d;
wire [0:3] stq_byp_val_wefgh_q;
parameter stq6_stg_act_offset = 0;
parameter stq7_stg_act_offset = stq6_stg_act_offset + 1;
parameter ex3_stq5_rd_addr_offset = stq7_stg_act_offset + 1;
parameter stq6_wren_offset = ex3_stq5_rd_addr_offset + 8;
parameter stq7_wren_offset = stq6_wren_offset + 1;
parameter stq6_way_en_offset = stq7_wren_offset + 1;
parameter stq7_way_en_offset = stq6_way_en_offset + 8;
parameter stq6_addr_offset = stq7_way_en_offset + 8;
parameter stq7_addr_offset = stq6_addr_offset + 8;
parameter stq7_wr_data_wabcd_offset = stq7_addr_offset + 8;
parameter stq7_wr_data_wefgh_offset = stq7_wr_data_wabcd_offset + 144;
parameter stq8_wr_data_wabcd_offset = stq7_wr_data_wefgh_offset + 144;
parameter stq8_wr_data_wefgh_offset = stq8_wr_data_wabcd_offset + 144;
parameter stq6_byte_en_wabcd_offset = stq8_wr_data_wefgh_offset + 144;
parameter stq6_byte_en_wefgh_offset = stq6_byte_en_wabcd_offset + 16;
parameter stq6_byp_wr_data_wabcd_offset = stq6_byte_en_wefgh_offset + 16;
parameter stq6_byp_wr_data_wefgh_offset = stq6_byp_wr_data_wabcd_offset + 144;
parameter stq7_byp_val_wabcd_offset = stq6_byp_wr_data_wefgh_offset + 144;
parameter stq7_byp_val_wefgh_offset = stq7_byp_val_wabcd_offset + 4;
parameter stq_byp_val_wabcd_offset = stq7_byp_val_wefgh_offset + 4;
parameter stq_byp_val_wefgh_offset = stq_byp_val_wabcd_offset + 4;
parameter scan_right = stq_byp_val_wefgh_offset + 4 - 1;
wire tiup;
wire [0:scan_right] siv;
wire [0:scan_right] sov;
assign tiup = 1'b1;
assign ex3_stq5_rd_addr_d = ex2_stq4_rd_addr;
assign stq6_stg_act_d = stq5_stg_act;
assign stq7_stg_act_d = stq6_stg_act_q;
assign stq6_wren_d = stq5_arr_wren;
assign stq7_wren_d = stq6_wren_q;
assign stq6_way_en_d = stq5_arr_wr_way;
assign stq7_way_en_d = stq6_way_en_q;
assign stq6_wr_way = {8{stq6_wren_q}} & stq6_way_en_q;
assign stq6_addr_d = stq5_arr_wr_addr;
assign stq7_addr_d = stq6_addr_q;
// #############################################################################################
// Data Cache Read/Write Merge
// #############################################################################################
// Gate Way that is being updated
assign stq6_gate_rd_data_wa = {144{stq6_way_en_q[0]}} & stq6_rd_data_wa;
assign stq6_gate_rd_data_wb = {144{stq6_way_en_q[1]}} & stq6_rd_data_wb;
assign stq6_gate_rd_data_wc = {144{stq6_way_en_q[2]}} & stq6_rd_data_wc;
assign stq6_gate_rd_data_wd = {144{stq6_way_en_q[3]}} & stq6_rd_data_wd;
assign stq6_gate_rd_data_we = {144{stq6_way_en_q[4]}} & stq6_rd_data_we;
assign stq6_gate_rd_data_wf = {144{stq6_way_en_q[5]}} & stq6_rd_data_wf;
assign stq6_gate_rd_data_wg = {144{stq6_way_en_q[6]}} & stq6_rd_data_wg;
assign stq6_gate_rd_data_wh = {144{stq6_way_en_q[7]}} & stq6_rd_data_wh;
// Merge Data Way A,B,C,D
assign stq6_rd_data_wabcd = stq6_gate_rd_data_wa | stq6_gate_rd_data_wb |
stq6_gate_rd_data_wc | stq6_gate_rd_data_wd;
assign stq6_wr_data_wabcd = (stq6_wr_bit_wabcd & stq6_byp_wr_data_wabcd_q) | (stq6_msk_bit_wabcd & stq6_rd_data_wabcd);
assign stq7_wr_data_wabcd_d = stq6_wr_data_wabcd;
assign stq8_wr_data_wabcd_d = stq7_wr_data_wabcd_q;
// Merge Data Way E,F,G,H
assign stq6_rd_data_wefgh = stq6_gate_rd_data_we | stq6_gate_rd_data_wf |
stq6_gate_rd_data_wg | stq6_gate_rd_data_wh;
assign stq6_wr_data_wefgh = (stq6_wr_bit_wefgh & stq6_byp_wr_data_wefgh_q) | (stq6_msk_bit_wefgh & stq6_rd_data_wefgh);
assign stq7_wr_data_wefgh_d = stq6_wr_data_wefgh;
assign stq8_wr_data_wefgh_d = stq7_wr_data_wefgh_q;
// #############################################################################################
// Data Cache Write Data Bypass
// #############################################################################################
// Read/Write Address Match
assign ex2_stq4_addr_coll = (ex2_stq4_rd_addr == stq6_addr_q);
assign ex2_stq4_way_coll = {8{ex2_stq4_addr_coll}} & stq6_wr_way;
// Bypass Select Control
assign stq6_rd_byp_val = (ex3_stq5_rd_addr_q == stq6_addr_q) & stq6_wren_q;
assign stq7_rd_byp_val = (ex3_stq5_rd_addr_q == stq7_addr_q) & stq7_wren_q;
assign stq6_wr_byp_val = stq6_rd_byp_val & |(stq5_arr_wr_way & stq6_way_en_q);
assign stq7_wr_byp_val = stq7_rd_byp_val & |(stq5_arr_wr_way & stq7_way_en_q);
assign stq5_byp_val = stq6_wr_byp_val | stq7_wr_byp_val;
// Byte Enable and Byte Mask generation
assign stq5_wr_bit = {9{ stq5_arr_wr_bytew}};
assign stq5_msk_bit = {9{~stq5_arr_wr_bytew}};
assign stq5_byte_en = stq5_arr_wr_bytew | {16{stq5_byp_val}};
assign stq6_byte_en_wabcd_d = stq5_byte_en;
assign stq6_wr_bit_wabcd = {9{ stq6_byte_en_wabcd_q}};
assign stq6_msk_bit_wabcd = {9{~stq6_byte_en_wabcd_q}};
assign stq6_byte_en_wefgh_d = stq5_byte_en;
assign stq6_wr_bit_wefgh = {9{ stq6_byte_en_wefgh_q}};
assign stq6_msk_bit_wefgh = {9{~stq6_byte_en_wefgh_q}};
// Need to add bypass logic with merged data from stq6 and stq7 for Way A,B,C,D groups
assign stq6_stq7_byp_data_wabcd = ({144{~stq6_wr_byp_val}} & stq7_wr_data_wabcd_q) | ({144{stq6_wr_byp_val}} & stq6_wr_data_wabcd);
assign stq5_byp_wr_data_wabcd = (stq5_wr_bit & stq5_arr_wr_data) | (stq5_msk_bit & stq6_stq7_byp_data_wabcd);
assign stq6_byp_wr_data_wabcd_d = stq5_byp_wr_data_wabcd;
// Need to add bypass logic with merged data from stq6 and stq7 for Way E,F,G,H groups
assign stq6_stq7_byp_data_wefgh = ({144{~stq6_wr_byp_val}} & stq7_wr_data_wefgh_q) | ({144{stq6_wr_byp_val}} & stq6_wr_data_wefgh);
assign stq5_byp_wr_data_wefgh = (stq5_wr_bit & stq5_arr_wr_data) | (stq5_msk_bit & stq6_stq7_byp_data_wefgh);
assign stq6_byp_wr_data_wefgh_d = stq5_byp_wr_data_wefgh;
// Data that needs to be bypassed between EX2 Load Pipe Read collision detected with STQ6 Store Pipe Write
assign stq7_byp_val_wabcd_d = {4{stq6_rd_byp_val}} & stq6_way_en_q[0:3];
assign stq7_byp_val_wefgh_d = {4{stq6_rd_byp_val}} & stq6_way_en_q[4:7];
//assign stq7_byp_data_wefgh = stq7_wr_data_wefgh_q;
assign stq_byp_val_wabcd_d = ({4{stq7_rd_byp_val}} & stq7_way_en_q[0:3]) | ({4{stq6_rd_byp_val}} & stq6_way_en_q[0:3]);
assign stq_byp_val_wefgh_d = ({4{stq7_rd_byp_val}} & stq7_way_en_q[4:7]) | ({4{stq6_rd_byp_val}} & stq6_way_en_q[4:7]);
// #############################################################################################
// Outputs
// #############################################################################################
// Data Cache Array Read ACT
assign dcarr_rd_stg_act = {8{ex2_stq4_rd_stg_act}} & ~ex2_stq4_way_coll;
// Data Cache Array Update
assign dcarr_wr_stg_act = stq6_wr_way;
assign dcarr_wr_way = stq6_wr_way;
assign dcarr_wr_addr = stq6_addr_q;
assign dcarr_wr_data_wabcd = stq6_wr_data_wabcd;
assign dcarr_wr_data_wefgh = stq6_wr_data_wefgh;
// EX4 Load Data Bypass
assign stq7_byp_val_wabcd = stq7_byp_val_wabcd_q;
assign stq7_byp_val_wefgh = stq7_byp_val_wefgh_q;
assign stq7_byp_data_wabcd = stq7_wr_data_wabcd_q;
assign stq7_byp_data_wefgh = stq7_wr_data_wefgh_q;
assign stq8_byp_data_wabcd = stq8_wr_data_wabcd_q;
assign stq8_byp_data_wefgh = stq8_wr_data_wefgh_q;
assign stq_byp_val_wabcd = stq_byp_val_wabcd_q;
assign stq_byp_val_wefgh = stq_byp_val_wefgh_q;
// #############################################################################################
// Registers
// #############################################################################################
tri_rlmlatch_p #(.INIT(0), .NEEDS_SRESET(1)) stq6_stg_act_latch(
.nclk(nclk),
.vd(vdd),
.gd(gnd),
.act(tiup),
.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[stq6_stg_act_offset]),
.scout(sov[stq6_stg_act_offset]),
.din(stq6_stg_act_d),
.dout(stq6_stg_act_q)
);
tri_rlmlatch_p #(.INIT(0), .NEEDS_SRESET(1)) stq7_stg_act_latch(
.nclk(nclk),
.vd(vdd),
.gd(gnd),
.act(tiup),
.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[stq7_stg_act_offset]),
.scout(sov[stq7_stg_act_offset]),
.din(stq7_stg_act_d),
.dout(stq7_stg_act_q)
);
tri_rlmreg_p #(.WIDTH(8), .INIT(0), .NEEDS_SRESET(1)) ex3_stq5_rd_addr_reg(
.vd(vdd),
.gd(gnd),
.nclk(nclk),
.act(tiup),
.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[ex3_stq5_rd_addr_offset:ex3_stq5_rd_addr_offset + 8 - 1]),
.scout(sov[ex3_stq5_rd_addr_offset:ex3_stq5_rd_addr_offset + 8 - 1]),
.din(ex3_stq5_rd_addr_d),
.dout(ex3_stq5_rd_addr_q)
);
tri_rlmlatch_p #(.INIT(0), .NEEDS_SRESET(1)) stq6_arr_wren_reg(
.vd(vdd),
.gd(gnd),
.nclk(nclk),
.act(tiup),
.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[stq6_wren_offset]),
.scout(sov[stq6_wren_offset]),
.din(stq6_wren_d),
.dout(stq6_wren_q)
);
tri_rlmlatch_p #(.INIT(0), .NEEDS_SRESET(1)) stq7_arr_wren_reg(
.vd(vdd),
.gd(gnd),
.nclk(nclk),
.act(tiup),
.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[stq7_wren_offset]),
.scout(sov[stq7_wren_offset]),
.din(stq7_wren_d),
.dout(stq7_wren_q)
);
tri_rlmreg_p #(.WIDTH(8), .INIT(0), .NEEDS_SRESET(1)) stq6_way_en_reg(
.vd(vdd),
.gd(gnd),
.nclk(nclk),
.act(stq5_stg_act),
.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[stq6_way_en_offset:stq6_way_en_offset + 8 - 1]),
.scout(sov[stq6_way_en_offset:stq6_way_en_offset + 8 - 1]),
.din(stq6_way_en_d),
.dout(stq6_way_en_q)
);
tri_rlmreg_p #(.WIDTH(8), .INIT(0), .NEEDS_SRESET(1)) stq7_way_en_reg(
.vd(vdd),
.gd(gnd),
.nclk(nclk),
.act(stq6_stg_act_q),
.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[stq7_way_en_offset:stq7_way_en_offset + 8 - 1]),
.scout(sov[stq7_way_en_offset:stq7_way_en_offset + 8 - 1]),
.din(stq7_way_en_d),
.dout(stq7_way_en_q)
);
tri_rlmreg_p #(.WIDTH(8), .INIT(0), .NEEDS_SRESET(1)) stq6_addr_reg(
.vd(vdd),
.gd(gnd),
.nclk(nclk),
.act(stq5_stg_act),
.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[stq6_addr_offset:stq6_addr_offset + 8 - 1]),
.scout(sov[stq6_addr_offset:stq6_addr_offset + 8 - 1]),
.din(stq6_addr_d),
.dout(stq6_addr_q)
);
tri_rlmreg_p #(.WIDTH(8), .INIT(0), .NEEDS_SRESET(1)) stq7_addr_reg(
.vd(vdd),
.gd(gnd),
.nclk(nclk),
.act(stq6_stg_act_q),
.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[stq7_addr_offset:stq7_addr_offset + 8 - 1]),
.scout(sov[stq7_addr_offset:stq7_addr_offset + 8 - 1]),
.din(stq7_addr_d),
.dout(stq7_addr_q)
);
tri_rlmreg_p #(.WIDTH(144), .INIT(0), .NEEDS_SRESET(1)) stq7_wr_data_wabcd_reg(
.vd(vdd),
.gd(gnd),
.nclk(nclk),
.act(stq6_stg_act_q),
.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[stq7_wr_data_wabcd_offset:stq7_wr_data_wabcd_offset + 144 - 1]),
.scout(sov[stq7_wr_data_wabcd_offset:stq7_wr_data_wabcd_offset + 144 - 1]),
.din(stq7_wr_data_wabcd_d),
.dout(stq7_wr_data_wabcd_q)
);
tri_rlmreg_p #(.WIDTH(144), .INIT(0), .NEEDS_SRESET(1)) stq7_wr_data_wefgh_reg(
.vd(vdd),
.gd(gnd),
.nclk(nclk),
.act(stq6_stg_act_q),
.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[stq7_wr_data_wefgh_offset:stq7_wr_data_wefgh_offset + 144 - 1]),
.scout(sov[stq7_wr_data_wefgh_offset:stq7_wr_data_wefgh_offset + 144 - 1]),
.din(stq7_wr_data_wefgh_d),
.dout(stq7_wr_data_wefgh_q)
);
tri_rlmreg_p #(.WIDTH(144), .INIT(0), .NEEDS_SRESET(1)) stq8_wr_data_wabcd_reg(
.vd(vdd),
.gd(gnd),
.nclk(nclk),
.act(stq7_stg_act_q),
.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[stq8_wr_data_wabcd_offset:stq8_wr_data_wabcd_offset + 144 - 1]),
.scout(sov[stq8_wr_data_wabcd_offset:stq8_wr_data_wabcd_offset + 144 - 1]),
.din(stq8_wr_data_wabcd_d),
.dout(stq8_wr_data_wabcd_q)
);
tri_rlmreg_p #(.WIDTH(144), .INIT(0), .NEEDS_SRESET(1)) stq8_wr_data_wefgh_reg(
.vd(vdd),
.gd(gnd),
.nclk(nclk),
.act(stq7_stg_act_q),
.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[stq8_wr_data_wefgh_offset:stq8_wr_data_wefgh_offset + 144 - 1]),
.scout(sov[stq8_wr_data_wefgh_offset:stq8_wr_data_wefgh_offset + 144 - 1]),
.din(stq8_wr_data_wefgh_d),
.dout(stq8_wr_data_wefgh_q)
);
tri_rlmreg_p #(.WIDTH(16), .INIT(0), .NEEDS_SRESET(1)) stq6_byte_en_wabcd_reg(
.vd(vdd),
.gd(gnd),
.nclk(nclk),
.act(stq5_stg_act),
.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[stq6_byte_en_wabcd_offset:stq6_byte_en_wabcd_offset + 16 - 1]),
.scout(sov[stq6_byte_en_wabcd_offset:stq6_byte_en_wabcd_offset + 16 - 1]),
.din(stq6_byte_en_wabcd_d),
.dout(stq6_byte_en_wabcd_q)
);
tri_rlmreg_p #(.WIDTH(16), .INIT(0), .NEEDS_SRESET(1)) stq6_byte_en_wefgh_reg(
.vd(vdd),
.gd(gnd),
.nclk(nclk),
.act(stq5_stg_act),
.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[stq6_byte_en_wefgh_offset:stq6_byte_en_wefgh_offset + 16 - 1]),
.scout(sov[stq6_byte_en_wefgh_offset:stq6_byte_en_wefgh_offset + 16 - 1]),
.din(stq6_byte_en_wefgh_d),
.dout(stq6_byte_en_wefgh_q)
);
tri_rlmreg_p #(.WIDTH(144), .INIT(0), .NEEDS_SRESET(1)) stq6_byp_wr_data_wabcd_reg(
.vd(vdd),
.gd(gnd),
.nclk(nclk),
.act(stq5_stg_act),
.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[stq6_byp_wr_data_wabcd_offset:stq6_byp_wr_data_wabcd_offset + 144 - 1]),
.scout(sov[stq6_byp_wr_data_wabcd_offset:stq6_byp_wr_data_wabcd_offset + 144 - 1]),
.din(stq6_byp_wr_data_wabcd_d),
.dout(stq6_byp_wr_data_wabcd_q)
);
tri_rlmreg_p #(.WIDTH(144), .INIT(0), .NEEDS_SRESET(1)) stq6_byp_wr_data_wefgh_reg(
.vd(vdd),
.gd(gnd),
.nclk(nclk),
.act(stq5_stg_act),
.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[stq6_byp_wr_data_wefgh_offset:stq6_byp_wr_data_wefgh_offset + 144 - 1]),
.scout(sov[stq6_byp_wr_data_wefgh_offset:stq6_byp_wr_data_wefgh_offset + 144 - 1]),
.din(stq6_byp_wr_data_wefgh_d),
.dout(stq6_byp_wr_data_wefgh_q)
);
tri_rlmreg_p #(.WIDTH(4), .INIT(0), .NEEDS_SRESET(1)) stq7_byp_val_wabcd_reg(
.vd(vdd),
.gd(gnd),
.nclk(nclk),
.act(tiup),
.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[stq7_byp_val_wabcd_offset:stq7_byp_val_wabcd_offset + 4 - 1]),
.scout(sov[stq7_byp_val_wabcd_offset:stq7_byp_val_wabcd_offset + 4 - 1]),
.din(stq7_byp_val_wabcd_d),
.dout(stq7_byp_val_wabcd_q)
);
tri_rlmreg_p #(.WIDTH(4), .INIT(0), .NEEDS_SRESET(1)) stq7_byp_val_wefgh_reg(
.vd(vdd),
.gd(gnd),
.nclk(nclk),
.act(tiup),
.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[stq7_byp_val_wefgh_offset:stq7_byp_val_wefgh_offset + 4 - 1]),
.scout(sov[stq7_byp_val_wefgh_offset:stq7_byp_val_wefgh_offset + 4 - 1]),
.din(stq7_byp_val_wefgh_d),
.dout(stq7_byp_val_wefgh_q)
);
tri_rlmreg_p #(.WIDTH(4), .INIT(0), .NEEDS_SRESET(1)) stq_byp_val_wabcd_reg(
.vd(vdd),
.gd(gnd),
.nclk(nclk),
.act(tiup),
.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[stq_byp_val_wabcd_offset:stq_byp_val_wabcd_offset + 4 - 1]),
.scout(sov[stq_byp_val_wabcd_offset:stq_byp_val_wabcd_offset + 4 - 1]),
.din(stq_byp_val_wabcd_d),
.dout(stq_byp_val_wabcd_q)
);
tri_rlmreg_p #(.WIDTH(4), .INIT(0), .NEEDS_SRESET(1)) stq_byp_val_wefgh_reg(
.vd(vdd),
.gd(gnd),
.nclk(nclk),
.act(tiup),
.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[stq_byp_val_wefgh_offset:stq_byp_val_wefgh_offset + 4 - 1]),
.scout(sov[stq_byp_val_wefgh_offset:stq_byp_val_wefgh_offset + 4 - 1]),
.din(stq_byp_val_wefgh_d),
.dout(stq_byp_val_wefgh_q)
);
assign siv[0:scan_right] = {sov[1:scan_right], scan_in};
assign scan_out = sov[0];
endmodule