// ========== Copyright Header Begin ==========================================
// OpenSPARC T2 Processor File: n2_mam_mp_160x66_cust.v
// Copyright (C) 1995-2007 Sun Microsystems, Inc. All Rights Reserved
// 4150 Network Circle, Santa Clara, California 95054, U.S.A.
// * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
// This program is free software; you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation; version 2 of the License.
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
// You should have received a copy of the GNU General Public License
// along with this program; if not, write to the Free Software
// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
// For the avoidance of doubt, and except that if any non-GPL license
// choice is available it will apply instead, Sun elects to use only
// the General Public License version 2 (GPLv2) at this time for any
// software where a choice of GPL license versions is made
// available with the language indicating that GPLv2 or any later version
// may be used, or where a choice of which version of the GPL is applied is
// otherwise unspecified.
// Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
// CA 95054 USA or visit www.sun.com if you need additional information or
// ========== Copyright Header End ============================================
////////////////////////////////////////////////////////////////////////////////
// $Id: n2_mam_mp_160x66_cust.v,v 1.1.1.1 2007/02/13 22:19:31 drp Exp $
// Copyright (C) 2003 by Sun Microsystems, Inc.
// All rights reserved. No part of this design may be reproduced,
// stored in a retrieval system, or transmitted, in any form or by
// any means, electronic, mechanical, photocopying, recording, or
// otherwise, without prior written permission of Sun Microsystems,
// Sun Proprietary/Confidential
// Description: SPU MA MEM
// - 64-bit data + 2-bit parity = 66-bit total
// - 2 Read + 1 Write ports
// Primary Contact: christopher.olson@sun.com
////////////////////////////////////////////////////////////////////////////////
module n2_mam_mp_160x66_cust (
wire [65:0] i_wr_data_ff_scanin;
wire [65:0] i_wr_data_ff_scanout;
wire [7:0] i_r0_addr_ff_scanin;
wire [7:0] i_r0_addr_ff_scanout;
wire [7:0] r0_lat_l_unused;
wire [7:0] r0_dout_l_unused;
wire [7:0] i_r1_addr_ff_scanin;
wire [7:0] i_r1_addr_ff_scanout;
wire [7:0] r1_lat_l_unused;
wire [7:0] r1_dout_l_unused;
wire [7:0] i_w_addr_ff_scanin;
wire [7:0] i_w_addr_ff_scanout;
wire [0:0] i_rd0_enable_ff_scanin;
wire [0:0] i_rd0_enable_ff_scanout;
wire rd0_enable_ff_unused;
wire rd0_enable_dout_l_unused;
wire [0:0] i_rd1_enable_ff_scanin;
wire [0:0] i_rd1_enable_ff_scanout;
wire rd1_enable_ff_unused;
wire rd1_enable_dout_l_unused;
wire [0:0] i_wr_enable_ff_scanin;
wire [0:0] i_wr_enable_ff_scanout;
input tcu_array_wr_inhibit;
input tcu_se_scancollar_in;
input rd0_enable_ff_clken;
input rd1_enable_ff_clken;
n2_mam_mp_160x66_cust_l1clkhdr_ctl_macro wr_en_clkgen (
.se (tcu_se_scancollar_in ),
.l1clk (l1clk_wr_data_e )
n2_mam_mp_160x66_cust_msff_ctl_macro__fs_1__scanreverse_1__width_66 i_wr_data_ff (
.scan_in(i_wr_data_ff_scanin[65:0]),
.scan_out(i_wr_data_ff_scanout[65:0]),
.l1clk ( l1clk_wr_data_e ),
.dout ( wr_data_ff[65:0] ),
// Change clk enables for read port addr/enables to be mux holds per Tai's request
n2_mam_mp_160x66_cust_l1clkhdr_ctl_macro rd_en_clkgen (
.se (tcu_se_scancollar_in ),
.l1clk (l1clk_rd_data_e )
n2_mam_mp_160x66_cust_mux_macro__mux_aope__ports_2__width_8 i_r0_mux (
.din1 (r0_addr_ff[7:0] ),
.sel0 (rd0_enable_ff_clken ),
n2_mam_mp_160x66_cust_sram_msff_mo_macro__fs_1__width_8 i_r0_addr_ff (
.scan_in(i_r0_addr_ff_scanin[7:0]),
.scan_out(i_r0_addr_ff_scanout[7:0]),
.l1clk (l1clk_rd_data_e ),
.mq_l(r0_lat_l_unused[7:0] ),
.q_l(r0_dout_l_unused[7:0] ),
//msff_ctl_macro i_r0_addr_ff (fs=1,width=8) (
// .scan_in(i_r0_addr_ff_scanin[7:0]),
// .scan_out(i_r0_addr_ff_scanout[7:0]),
// .l1clk (l1clk_rd_data_e ),
// .dout ( r0_addr_ff[7:0] ));
n2_mam_mp_160x66_cust_mux_macro__mux_aope__ports_2__width_8 i_r1_mux (
.din1 (r1_addr_ff[7:0] ),
.sel0 (rd1_enable_ff_clken ),
//msff_ctl_macro i_r1_addr_ff (fs=1,width=8) (
// .scan_in(i_r1_addr_ff_scanin[7:0]),
// .scan_out(i_r1_addr_ff_scanout[7:0]),
// .l1clk ( l1clk_rd_data_e ),
// .dout ( r1_addr_ff[7:0] ));
n2_mam_mp_160x66_cust_sram_msff_mo_macro__fs_1__width_8 i_r1_addr_ff (
.scan_in(i_r1_addr_ff_scanin[7:0]),
.scan_out(i_r1_addr_ff_scanout[7:0]),
.l1clk (l1clk_rd_data_e ),
.mq_l(r1_lat_l_unused[7:0] ),
.q_l(r1_dout_l_unused[7:0] ),
n2_mam_mp_160x66_cust_msff_ctl_macro__fs_1__width_8 i_w_addr_ff (
.scan_in(i_w_addr_ff_scanin[7:0]),
.scan_out(i_w_addr_ff_scanout[7:0]),
.l1clk (l1clk_wr_data_e ),
.dout ( w_addr_ff[7:0] ),
n2_mam_mp_160x66_cust_mux_macro__mux_aope__ports_2__width_1 i_r0_enable_mux (
.sel0 (rd0_enable_ff_clken ),
.dout (rd0_enable_ff_mux ));
//msff_ctl_macro i_rd0_enable_ff (fs=1,width=1) (
// .scan_in(i_rd0_enable_ff_scanin[0:0]),
// .scan_out(i_rd0_enable_ff_scanout[0:0]),
// .l1clk (l1clk_rd_data_e ),
// .din ( rd0_enable_ff_mux ),
// .dout ( rd0_enable_ff ));
n2_mam_mp_160x66_cust_sram_msff_mo_macro__fs_1__width_1 i_rd0_enable_ff (
.scan_in(i_rd0_enable_ff_scanin[0:0]),
.scan_out(i_rd0_enable_ff_scanout[0:0]),
.l1clk (l1clk_rd_data_e ),
.d ( rd0_enable_ff_mux ),
.mq_l(rd0_enable_ff_unused ),
.q_l(rd0_enable_dout_l_unused ),
n2_mam_mp_160x66_cust_mux_macro__mux_aope__ports_2__width_1 i_r1_enable_mux (
.sel0 (rd1_enable_ff_clken ),
.dout (rd1_enable_ff_mux ));
//msff_ctl_macro i_rd1_enable_ff (fs=1,width=1) (
// .scan_in(i_rd1_enable_ff_scanin[0:0]),
// .scan_out(i_rd1_enable_ff_scanout[0:0]),
// .l1clk (l1clk_rd_data_e ),
// .din ( rd1_enable_ff_mux ),
// .dout ( rd1_enable_ff ));
n2_mam_mp_160x66_cust_sram_msff_mo_macro__fs_1__width_1 i_rd1_enable_ff (
.scan_in(i_rd1_enable_ff_scanin[0:0] ),
.scan_out(i_rd1_enable_ff_scanout[0:0] ),
.l1clk (l1clk_rd_data_e ),
.d ( rd1_enable_ff_mux ),
.mq_l(rd1_enable_ff_unused ),
.q_l(rd1_enable_dout_l_unused ),
n2_mam_mp_160x66_cust_msff_ctl_macro__fs_1__width_1 i_wr_enable_ff (
.scan_in(i_wr_enable_ff_scanin[0:0]),
.scan_out(i_wr_enable_ff_scanout[0:0]),
.l1clk (l1clk_rd_data_e ),
// L2 clock "free-running" clock
n2_mam_mp_160x66_cust_l1clkhdr_ctl_macro l2_clkgen (
// 0in custom -fire (rd0_enable_ff & ~tcu_array_wr_inhibit & wr_enable_ff & (w_addr_ff == r0_addr_ff) & ~r0_byp) -message "Attempt to read and write port0 of MAMEM w/o bypass" -group core_array
// 0in custom -fire (rd1_enable_ff & ~tcu_array_wr_inhibit & wr_enable_ff & (w_addr_ff == r1_addr_ff) & ~r1_byp) -message "Attempt to read and write port1 of MAMEM w/o bypass" -group core_array
lib_160x66b_2r_1w_array mamem_array (
.rd0_en ( rd0_enable_lat ),
.r0_addr ( r0_addr_lat[7:0] ),
.rd1_en ( rd1_enable_lat ),
.r1_addr ( r1_addr_lat[7:0] ),
.w_addr ( w_addr_ff[7:0] ),
.tcu_array_wr_inhibit (tcu_array_wr_inhibit ),
.din ( wr_data_ff[65:0] ),
.dout0 ( rd0_data[65:0] ),
.dout1 ( rd1_data[65:0] ));
// i_wr_data_ff_scanin[0:65]
// i_r0_addr_ff_scanin[7:0]
// i_rd0_enable_ff_scanin[0]
// i_r1_addr_ff_scanin[7:0]
// i_rd1_enable_ff_scanin[0]
// i_w_addr_ff_scanin[7:0]
// i_wr_enable_ff_scanin[0]
assign i_wr_data_ff_scanin[0]=scan_in;
assign i_wr_data_ff_scanin[1]=i_wr_data_ff_scanout[0];
assign i_wr_data_ff_scanin[2]=i_wr_data_ff_scanout[1];
assign i_wr_data_ff_scanin[3]=i_wr_data_ff_scanout[2];
assign i_wr_data_ff_scanin[4]=i_wr_data_ff_scanout[3];
assign i_wr_data_ff_scanin[5]=i_wr_data_ff_scanout[4];
assign i_wr_data_ff_scanin[6]=i_wr_data_ff_scanout[5];
assign i_wr_data_ff_scanin[7]=i_wr_data_ff_scanout[6];
assign i_wr_data_ff_scanin[8]=i_wr_data_ff_scanout[7];
assign i_wr_data_ff_scanin[9]=i_wr_data_ff_scanout[8];
assign i_wr_data_ff_scanin[10]=i_wr_data_ff_scanout[9];
assign i_wr_data_ff_scanin[11]=i_wr_data_ff_scanout[10];
assign i_wr_data_ff_scanin[12]=i_wr_data_ff_scanout[11];
assign i_wr_data_ff_scanin[13]=i_wr_data_ff_scanout[12];
assign i_wr_data_ff_scanin[14]=i_wr_data_ff_scanout[13];
assign i_wr_data_ff_scanin[15]=i_wr_data_ff_scanout[14];
assign i_wr_data_ff_scanin[16]=i_wr_data_ff_scanout[15];
assign i_wr_data_ff_scanin[17]=i_wr_data_ff_scanout[16];
assign i_wr_data_ff_scanin[18]=i_wr_data_ff_scanout[17];
assign i_wr_data_ff_scanin[19]=i_wr_data_ff_scanout[18];
assign i_wr_data_ff_scanin[20]=i_wr_data_ff_scanout[19];
assign i_wr_data_ff_scanin[21]=i_wr_data_ff_scanout[20];
assign i_wr_data_ff_scanin[22]=i_wr_data_ff_scanout[21];
assign i_wr_data_ff_scanin[23]=i_wr_data_ff_scanout[22];
assign i_wr_data_ff_scanin[24]=i_wr_data_ff_scanout[23];
assign i_wr_data_ff_scanin[25]=i_wr_data_ff_scanout[24];
assign i_wr_data_ff_scanin[26]=i_wr_data_ff_scanout[25];
assign i_wr_data_ff_scanin[27]=i_wr_data_ff_scanout[26];
assign i_wr_data_ff_scanin[28]=i_wr_data_ff_scanout[27];
assign i_wr_data_ff_scanin[29]=i_wr_data_ff_scanout[28];
assign i_wr_data_ff_scanin[30]=i_wr_data_ff_scanout[29];
assign i_wr_data_ff_scanin[31]=i_wr_data_ff_scanout[30];
assign i_wr_data_ff_scanin[32]=i_wr_data_ff_scanout[31];
assign i_wr_data_ff_scanin[33]=i_wr_data_ff_scanout[32];
assign i_wr_data_ff_scanin[34]=i_wr_data_ff_scanout[33];
assign i_wr_data_ff_scanin[35]=i_wr_data_ff_scanout[34];
assign i_wr_data_ff_scanin[36]=i_wr_data_ff_scanout[35];
assign i_wr_data_ff_scanin[37]=i_wr_data_ff_scanout[36];
assign i_wr_data_ff_scanin[38]=i_wr_data_ff_scanout[37];
assign i_wr_data_ff_scanin[39]=i_wr_data_ff_scanout[38];
assign i_wr_data_ff_scanin[40]=i_wr_data_ff_scanout[39];
assign i_wr_data_ff_scanin[41]=i_wr_data_ff_scanout[40];
assign i_wr_data_ff_scanin[42]=i_wr_data_ff_scanout[41];
assign i_wr_data_ff_scanin[43]=i_wr_data_ff_scanout[42];
assign i_wr_data_ff_scanin[44]=i_wr_data_ff_scanout[43];
assign i_wr_data_ff_scanin[45]=i_wr_data_ff_scanout[44];
assign i_wr_data_ff_scanin[46]=i_wr_data_ff_scanout[45];
assign i_wr_data_ff_scanin[47]=i_wr_data_ff_scanout[46];
assign i_wr_data_ff_scanin[48]=i_wr_data_ff_scanout[47];
assign i_wr_data_ff_scanin[49]=i_wr_data_ff_scanout[48];
assign i_wr_data_ff_scanin[50]=i_wr_data_ff_scanout[49];
assign i_wr_data_ff_scanin[51]=i_wr_data_ff_scanout[50];
assign i_wr_data_ff_scanin[52]=i_wr_data_ff_scanout[51];
assign i_wr_data_ff_scanin[53]=i_wr_data_ff_scanout[52];
assign i_wr_data_ff_scanin[54]=i_wr_data_ff_scanout[53];
assign i_wr_data_ff_scanin[55]=i_wr_data_ff_scanout[54];
assign i_wr_data_ff_scanin[56]=i_wr_data_ff_scanout[55];
assign i_wr_data_ff_scanin[57]=i_wr_data_ff_scanout[56];
assign i_wr_data_ff_scanin[58]=i_wr_data_ff_scanout[57];
assign i_wr_data_ff_scanin[59]=i_wr_data_ff_scanout[58];
assign i_wr_data_ff_scanin[60]=i_wr_data_ff_scanout[59];
assign i_wr_data_ff_scanin[61]=i_wr_data_ff_scanout[60];
assign i_wr_data_ff_scanin[62]=i_wr_data_ff_scanout[61];
assign i_wr_data_ff_scanin[63]=i_wr_data_ff_scanout[62];
assign i_wr_data_ff_scanin[64]=i_wr_data_ff_scanout[63];
assign i_wr_data_ff_scanin[65]=i_wr_data_ff_scanout[64];
assign i_r0_addr_ff_scanin[7]=i_wr_data_ff_scanout[65];
assign i_r0_addr_ff_scanin[6]=i_r0_addr_ff_scanout[7];
assign i_r0_addr_ff_scanin[5]=i_r0_addr_ff_scanout[6];
assign i_r0_addr_ff_scanin[4]=i_r0_addr_ff_scanout[5];
assign i_r0_addr_ff_scanin[3]=i_r0_addr_ff_scanout[4];
assign i_r0_addr_ff_scanin[2]=i_r0_addr_ff_scanout[3];
assign i_r0_addr_ff_scanin[1]=i_r0_addr_ff_scanout[2];
assign i_r0_addr_ff_scanin[0]=i_r0_addr_ff_scanout[1];
assign i_rd0_enable_ff_scanin[0]=i_r0_addr_ff_scanout[0];
assign i_r1_addr_ff_scanin[7]=i_rd0_enable_ff_scanout[0];
assign i_r1_addr_ff_scanin[6]=i_r1_addr_ff_scanout[7];
assign i_r1_addr_ff_scanin[5]=i_r1_addr_ff_scanout[6];
assign i_r1_addr_ff_scanin[4]=i_r1_addr_ff_scanout[5];
assign i_r1_addr_ff_scanin[3]=i_r1_addr_ff_scanout[4];
assign i_r1_addr_ff_scanin[2]=i_r1_addr_ff_scanout[3];
assign i_r1_addr_ff_scanin[1]=i_r1_addr_ff_scanout[2];
assign i_r1_addr_ff_scanin[0]=i_r1_addr_ff_scanout[1];
assign i_rd1_enable_ff_scanin[0]=i_r1_addr_ff_scanout[0];
assign i_w_addr_ff_scanin[7]=i_rd1_enable_ff_scanout[0];
assign i_w_addr_ff_scanin[6]=i_w_addr_ff_scanout[7];
assign i_w_addr_ff_scanin[5]=i_w_addr_ff_scanout[6];
assign i_w_addr_ff_scanin[4]=i_w_addr_ff_scanout[5];
assign i_w_addr_ff_scanin[3]=i_w_addr_ff_scanout[4];
assign i_w_addr_ff_scanin[2]=i_w_addr_ff_scanout[3];
assign i_w_addr_ff_scanin[1]=i_w_addr_ff_scanout[2];
assign i_w_addr_ff_scanin[0]=i_w_addr_ff_scanout[1];
assign i_wr_enable_ff_scanin[0]=i_w_addr_ff_scanout[0];
assign scan_out=i_wr_enable_ff_scanout[0];
// any PARAMS parms go into naming of macro
module n2_mam_mp_160x66_cust_l1clkhdr_ctl_macro (
// any PARAMS parms go into naming of macro
module n2_mam_mp_160x66_cust_msff_ctl_macro__fs_1__scanreverse_1__width_66 (
assign fdin[65:0] = din[65:0];
// general mux macro for pass-gate and and-or muxes with/wout priority encoders
// also for pass-gate with decoder
// any PARAMS parms go into naming of macro
module n2_mam_mp_160x66_cust_mux_macro__mux_aope__ports_2__width_8 (
// macro for cl_mc1_sram_msff_mo_{16,8,4}x flops
module n2_mam_mp_160x66_cust_sram_msff_mo_macro__fs_1__width_8 (
//place::generic_place($width,$stack,$left);
// any PARAMS parms go into naming of macro
module n2_mam_mp_160x66_cust_msff_ctl_macro__fs_1__width_8 (
assign fdin[7:0] = din[7:0];
// general mux macro for pass-gate and and-or muxes with/wout priority encoders
// also for pass-gate with decoder
// any PARAMS parms go into naming of macro
module n2_mam_mp_160x66_cust_mux_macro__mux_aope__ports_2__width_1 (
// macro for cl_mc1_sram_msff_mo_{16,8,4}x flops
module n2_mam_mp_160x66_cust_sram_msff_mo_macro__fs_1__width_1 (
//place::generic_place($width,$stack,$left);
// any PARAMS parms go into naming of macro
module n2_mam_mp_160x66_cust_msff_ctl_macro__fs_1__width_1 (
assign fdin[0:0] = din[0:0];
////////////////////////////////////////////////////////////////////////////////
// $Id: n2_mam_mp_160x66_cust.v,v 1.1.1.1 2007/02/13 22:19:31 drp Exp $
// Copyright (C) 2003 by Sun Microsystems, Inc.
// All rights reserved. No part of this design may be reproduced,
// stored in a retrieval system, or transmitted, in any form or by
// any means, electronic, mechanical, photocopying, recording, or
// otherwise, without prior written permission of Sun Microsystems,
// Sun Proprietary/Confidential
// Description: 160 x 66 dual-port array
// Bypass write data to read port on read/write collision
// To produce a debussy dump of memory contents,
// add -vcs_run_args=+DUMPMEM_160x66 to sims command line
// Primary Contact: Mark Luttrell
////////////////////////////////////////////////////////////////////////////////
module lib_160x66b_2r_1w_array (
input tcu_array_wr_inhibit;
input [`ADDRBITS-1:0] r0_addr;
input [`ADDRBITS-1:0] r1_addr;
input [`ADDRBITS-1:0] w_addr;
output [`WIDTH-1:0] dout0;
output [`WIDTH-1:0] dout1;
reg [`WIDTH-1:0] mem[`ENTRIES-1:0];
reg [`WIDTH-1:0] local_dout0;
reg [`WIDTH-1:0] local_dout1;
for (i=0; i<`ENTRIES; i=i+1) begin
local_dout0 = {`WIDTH{1'b0}};
local_dout1 = {`WIDTH{1'b0}};
always @ (clk or rd0_en or wr_en or tcu_array_wr_inhibit or w_addr or r0_addr) begin
if (rd0_en & ~tcu_array_wr_inhibit) begin
if (r0_addr <= 8'b10011111) begin // 159
if (wr_en & (w_addr == r0_addr))
local_dout0[`WIDTH-1:0] = {`WIDTH {1'bx}};
local_dout0[`WIDTH-1:0] = mem[r0_addr];
local_dout0[`WIDTH-1:0] = {`WIDTH {1'b0}}; // return 0's for out-of-bounds read address
else local_dout0[`WIDTH-1:0] = {`WIDTH {1'b0}}; // precharge
always @ (clk or rd1_en or wr_en or tcu_array_wr_inhibit or w_addr or r1_addr) begin
if (rd1_en & ~tcu_array_wr_inhibit) begin
if (r1_addr <= 8'b10011111) begin // 159
if (wr_en & (w_addr == r1_addr))
local_dout1[`WIDTH-1:0] = {`WIDTH {1'bx}};
local_dout1[`WIDTH-1:0] = mem[r1_addr];
local_dout1[`WIDTH-1:0] = {`WIDTH {1'b0}}; // return 0's for out-of-bounds read address
else local_dout1[`WIDTH-1:0] = {`WIDTH {1'b0}}; // precharge
always @ (negedge clk) begin
if (wr_en & ~tcu_array_wr_inhibit) begin
if (w_addr <= 8'b10011111) // make sure write address is valid
always @(r0_byp or local_dout0 or din) begin
if (r0_byp) dout0[`WIDTH-1:0] <= din[`WIDTH-1:0];
else dout0[`WIDTH-1:0] <= local_dout0[`WIDTH-1:0];
always @(r1_byp or local_dout1 or din) begin
if (r1_byp) dout1[`WIDTH-1:0] <= din[`WIDTH-1:0];
else dout1[`WIDTH-1:0] <= local_dout1[`WIDTH-1:0];