blob: ad026514de700d25ebc745b8c6d660a76e5f5bfd [file] [log] [blame]
//////////////////////////////////////////////////////////////////////////////
// SPDX-FileCopyrightText: 2021 , Dinesh Annayya
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// 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.
// SPDX-License-Identifier: Apache-2.0
// SPDX-FileContributor: Created by Dinesh Annayya <dinesha@opencores.org>
//
//////////////////////////////////////////////////////////////////////
//// ////
//// Digital core ////
//// ////
//// This file is part of the mbist_ctrl project ////
//// https://github.com/dineshannayya/mbist_ctrl.git ////
//// ////
//// Description ////
//// This is digital core and integrate all the main block ////
//// here. ////
//// 1. Wishbone Host ////
//// 2. 4x MBIST Controller ////
//// 3. 2x SRAM 2KB ////
//// 4. 2x SRAM 1KB ////
//// 5. Wishbone Interconnect ////
//// 6. Global Register ////
//// ////
//// To Do: ////
//// nothing ////
//// ////
//// Author(s): ////
//// - Dinesh Annayya, dinesha@opencores.org ////
//// ////
//// Revision : ////
//// 0.1 - 13th Oct 2021, Dinesh A ////
//// Initial Version ////
//// 0.2 - 19, Nov 2021, Dinesh A ////
//// Following things are integrated ////
//// 2x SRAM 2KB, 2x SRAM 1KB, 4 MBIST , ////
//// 1 Wishbone Interconnect, 1 Global register ////
//// 0.3 - 20, Nov 2021, Dinesh A ////
//// Following are integrated ////
//// 4x SRAM 2KB, 4x SRAM 1KB, 8 MBIST , ////
//// 1 Wishbone Interconnect, 1 Global register ////
//// 0.4 - 23 Nov 2021, Dinesh A ////
//// Three Software Register added for signature at glbl ////
//// 1.0 - 01 Dec 2021, Dinesh A -MPW-4 ////
//// A. Logic Bist Integrated inside the Wb_host ////
//// B. Below Scan chain created ////
//// WB_HOST(LBIST) => GLBL => MBIST5 => MBIST6 => MBIST7 ////
//// => MBIST8 => WB_INTERCONNECT => MBIST4 => MBIST3 => ////
//// MBIST2 => MBIST1 => WB_HOST(LBIST) ////
//// 1.1 - 03 Dec 2021, Dinesh A ////
//// Timing closure clean-up ////
//// 1.2 - 10 Dec 2021, Dinesh A ////
//// Full Chip Timing closure wth caravel ////
//// 1.3 - 21 Dec 2021, Dinesh A ////
//// A. LBIST bypass added, SCAN can be controlled through ////
//// LA ports ////
//// B. LBIST reset chain check compare bypass added ////
//// 1.4 Jan 02, 2022, Dinesh A ////
//// 1. LA[0] is added as soft reset option at wb_port ////
//// 2. Uart Master is added at wb_port ////
//////////////////////////////////////////////////////////////////////
`default_nettype none
module user_project_wrapper #(
parameter BITS = 32
) (
`ifdef USE_POWER_PINS
inout vdda1, // User area 1 3.3V supply
inout vdda2, // User area 2 3.3V supply
inout vssa1, // User area 1 analog ground
inout vssa2, // User area 2 analog ground
inout vccd1, // User area 1 1.8V supply
inout vccd2, // User area 2 1.8v supply
inout vssd1, // User area 1 digital ground
inout vssd2, // User area 2 digital ground
`endif
// Wishbone Slave ports (WB MI A)
input wb_clk_i,
input wb_rst_i,
input wbs_stb_i,
input wbs_cyc_i,
input wbs_we_i,
input [3:0] wbs_sel_i,
input [31:0] wbs_dat_i,
input [31:0] wbs_adr_i,
output wbs_ack_o,
output [31:0] wbs_dat_o,
// Logic Analyzer Signals
input [127:0] la_data_in,
output [127:0] la_data_out,
input [127:0] la_oenb,
// IOs
input [`MPRJ_IO_PADS-1:0] io_in,
output [`MPRJ_IO_PADS-1:0] io_out,
output [`MPRJ_IO_PADS-1:0] io_oeb,
// Analog (direct connection to GPIO pad---use with caution)
// Note that analog I/O is not available on the 7 lowest-numbered
// GPIO pads, and so the analog_io indexing is offset from the
// GPIO indexing by 7 (also upper 2 GPIOs do not have analog_io).
inout [`MPRJ_IO_PADS-10:0] analog_io,
// Independent clock (on independent integer divider)
input user_clock2,
// User maskable interrupt signals
output [2:0] user_irq
);
parameter BIST1_ADDR_WD = 11; // 512x32 SRAM
parameter BIST2_ADDR_WD = 10; // 256x32 SRAM
parameter BIST_DATA_WD = 32;
parameter WB_WIDTH = 32; // WB ADDRESS/DARA WIDTH
parameter SCW = 8; // SCAN CHAIN WIDTH
//---------------------------------------------------------------------
// WB HOST Interface
//---------------------------------------------------------------------
wire wbd_int_cyc_i; // strobe/request
wire wbd_int_stb_i; // strobe/request
wire [WB_WIDTH-1:0] wbd_int_adr_i; // address
wire wbd_int_we_i; // write
wire [WB_WIDTH-1:0] wbd_int_dat_i; // data output
wire [3:0] wbd_int_sel_i; // byte enable
wire [WB_WIDTH-1:0] wbd_int_dat_o; // data input
wire wbd_int_ack_o; // acknowlegement
wire wbd_int_err_o; // error
//---------------------------------------------------------------------
// Global Register Wishbone Interface
//---------------------------------------------------------------------
wire wbd_glbl_stb_o; // strobe/request
wire [7:0] wbd_glbl_adr_o; // address
wire wbd_glbl_we_o; // write
wire [WB_WIDTH-1:0] wbd_glbl_dat_o; // data output
wire [3:0] wbd_glbl_sel_o; // byte enable
wire wbd_glbl_cyc_o ;
wire [WB_WIDTH-1:0] wbd_glbl_dat_i; // data input
wire wbd_glbl_ack_i; // acknowlegement
wire wbd_glbl_err_i; // error
//---------------------------------------------------------------------
// MBIST1
//---------------------------------------------------------------------
wire wbd_mbist1_stb_o; // strobe/request
wire [BIST1_ADDR_WD-1:0] wbd_mbist1_adr_o; // address
wire wbd_mbist1_we_o; // write
wire [WB_WIDTH-1:0] wbd_mbist1_dat_o; // data output
wire [3:0] wbd_mbist1_sel_o; // byte enable
wire wbd_mbist1_cyc_o ;
wire [WB_WIDTH-1:0] wbd_mbist1_dat_i; // data input
wire wbd_mbist1_ack_i; // acknowlegement
wire wbd_mbist1_err_i; // error
//---------------------------------------------------------------------
// MBIST2
//---------------------------------------------------------------------
wire wbd_mbist2_stb_o; // strobe/request
wire [BIST1_ADDR_WD-1:0] wbd_mbist2_adr_o; // address
wire wbd_mbist2_we_o; // write
wire [WB_WIDTH-1:0] wbd_mbist2_dat_o; // data output
wire [3:0] wbd_mbist2_sel_o; // byte enable
wire wbd_mbist2_cyc_o ;
wire [WB_WIDTH-1:0] wbd_mbist2_dat_i; // data input
wire wbd_mbist2_ack_i; // acknowlegement
wire wbd_mbist2_err_i; // error
//---------------------------------------------------------------------
// MBIST3
//---------------------------------------------------------------------
wire wbd_mbist3_stb_o; // strobe/request
wire [BIST1_ADDR_WD-1:0] wbd_mbist3_adr_o; // address
wire wbd_mbist3_we_o; // write
wire [WB_WIDTH-1:0] wbd_mbist3_dat_o; // data output
wire [3:0] wbd_mbist3_sel_o; // byte enable
wire wbd_mbist3_cyc_o ;
wire [WB_WIDTH-1:0] wbd_mbist3_dat_i; // data input
wire wbd_mbist3_ack_i; // acknowlegement
wire wbd_mbist3_err_i; // error
//---------------------------------------------------------------------
// MBIST4
//---------------------------------------------------------------------
wire wbd_mbist4_stb_o; // strobe/request
wire [BIST1_ADDR_WD-1:0] wbd_mbist4_adr_o; // address
wire wbd_mbist4_we_o; // write
wire [WB_WIDTH-1:0] wbd_mbist4_dat_o; // data output
wire [3:0] wbd_mbist4_sel_o; // byte enable
wire wbd_mbist4_cyc_o ;
wire [WB_WIDTH-1:0] wbd_mbist4_dat_i; // data input
wire wbd_mbist4_ack_i; // acknowlegement
wire wbd_mbist4_err_i; // error
//---------------------------------------------------------------------
// MBIST5
//---------------------------------------------------------------------
wire wbd_mbist5_stb_o; // strobe/request
wire [BIST2_ADDR_WD-1:0] wbd_mbist5_adr_o; // address
wire wbd_mbist5_we_o; // write
wire [WB_WIDTH-1:0] wbd_mbist5_dat_o; // data output
wire [3:0] wbd_mbist5_sel_o; // byte enable
wire wbd_mbist5_cyc_o ;
wire [WB_WIDTH-1:0] wbd_mbist5_dat_i; // data input
wire wbd_mbist5_ack_i; // acknowlegement
wire wbd_mbist5_err_i; // error
//---------------------------------------------------------------------
// MBIST6
//---------------------------------------------------------------------
wire wbd_mbist6_stb_o; // strobe/request
wire [BIST2_ADDR_WD-1:0] wbd_mbist6_adr_o; // address
wire wbd_mbist6_we_o; // write
wire [WB_WIDTH-1:0] wbd_mbist6_dat_o; // data output
wire [3:0] wbd_mbist6_sel_o; // byte enable
wire wbd_mbist6_cyc_o ;
wire [WB_WIDTH-1:0] wbd_mbist6_dat_i; // data input
wire wbd_mbist6_ack_i; // acknowlegement
wire wbd_mbist6_err_i; // error
//---------------------------------------------------------------------
// MBIST7
//---------------------------------------------------------------------
wire wbd_mbist7_stb_o; // strobe/request
wire [BIST2_ADDR_WD-1:0] wbd_mbist7_adr_o; // address
wire wbd_mbist7_we_o; // write
wire [WB_WIDTH-1:0] wbd_mbist7_dat_o; // data output
wire [3:0] wbd_mbist7_sel_o; // byte enable
wire wbd_mbist7_cyc_o ;
wire [WB_WIDTH-1:0] wbd_mbist7_dat_i; // data input
wire wbd_mbist7_ack_i; // acknowlegement
wire wbd_mbist7_err_i; // error
//---------------------------------------------------------------------
// MBIST8
//---------------------------------------------------------------------
wire wbd_mbist8_stb_o; // strobe/request
wire [BIST2_ADDR_WD-1:0] wbd_mbist8_adr_o; // address
wire wbd_mbist8_we_o; // write
wire [WB_WIDTH-1:0] wbd_mbist8_dat_o; // data output
wire [3:0] wbd_mbist8_sel_o; // byte enable
wire wbd_mbist8_cyc_o ;
wire [WB_WIDTH-1:0] wbd_mbist8_dat_i; // data input
wire wbd_mbist8_ack_i; // acknowlegement
wire wbd_mbist8_err_i; // error
wire wbd_int_rst_n;
wire bist_rst_n;
// MBIST I/F
wire [7:0] bist_en;
wire [7:0] bist_run;
wire [7:0] bist_shift;
wire [7:0] bist_load;
wire [7:0] bist_sdi;
wire [7:0] bist_correct;
wire [7:0] bist_error;
wire [7:0] bist_done;
wire [7:0] bist_sdo;
wire [3:0] bist_error_cnt0;
wire [3:0] bist_error_cnt1;
wire [3:0] bist_error_cnt2;
wire [3:0] bist_error_cnt3;
wire [3:0] bist_error_cnt4;
wire [3:0] bist_error_cnt5;
wire [3:0] bist_error_cnt6;
wire [3:0] bist_error_cnt7;
// MBIST I/F Buffered
wire [7:0] bist_en_int;
wire [7:0] bist_run_int;
wire [7:0] bist_shift_int;
wire [7:0] bist_load_int;
wire [7:0] bist_sdi_int;
wire [7:0] bist_correct_int;
wire [7:0] bist_error_int;
wire [7:0] bist_done_int;
wire [7:0] bist_sdo_int;
wire [3:0] bist_error_cnt0_int;
wire [3:0] bist_error_cnt1_int;
wire [3:0] bist_error_cnt2_int;
wire [3:0] bist_error_cnt3_int;
wire [3:0] bist_error_cnt4_int;
wire [3:0] bist_error_cnt5_int;
wire [3:0] bist_error_cnt6_int;
wire [3:0] bist_error_cnt7_int;
// towards memory MBIST1
// PORT-A
wire mem1_clk_a;
wire [BIST1_ADDR_WD-1:2] mem1_addr_a;
wire mem1_cen_a;
wire [BIST_DATA_WD-1:0] mem1_din_b;
// PORT-B
wire mem1_clk_b;
wire mem1_cen_b;
wire mem1_web_b;
wire [BIST_DATA_WD/8-1:0] mem1_mask_b;
wire [BIST1_ADDR_WD-1:2] mem1_addr_b;
wire [BIST_DATA_WD-1:0] mem1_dout_a;
// towards memory MBIST2
// PORT-A
wire mem2_clk_a;
wire [BIST1_ADDR_WD-1:2] mem2_addr_a;
wire mem2_cen_a;
wire [BIST_DATA_WD-1:0] mem2_din_b;
// PORT-B
wire mem2_clk_b;
wire mem2_cen_b;
wire mem2_web_b;
wire [BIST_DATA_WD/8-1:0] mem2_mask_b;
wire [BIST1_ADDR_WD-1:2] mem2_addr_b;
wire [BIST_DATA_WD-1:0] mem2_dout_a;
// towards memory MBIST3
// PORT-A
wire mem3_clk_a;
wire [BIST1_ADDR_WD-1:2] mem3_addr_a;
wire mem3_cen_a;
wire [BIST_DATA_WD-1:0] mem3_din_b;
// PORT-B
wire mem3_clk_b;
wire mem3_cen_b;
wire mem3_web_b;
wire [BIST_DATA_WD/8-1:0] mem3_mask_b;
wire [BIST1_ADDR_WD-1:2] mem3_addr_b;
wire [BIST_DATA_WD-1:0] mem3_dout_a;
// towards memory MBIST4
// PORT-A
wire mem4_clk_a;
wire [BIST1_ADDR_WD-1:2] mem4_addr_a;
wire mem4_cen_a;
wire [BIST_DATA_WD-1:0] mem4_din_b;
// PORT-B
wire mem4_clk_b;
wire mem4_cen_b;
wire mem4_web_b;
wire [BIST_DATA_WD/8-1:0] mem4_mask_b;
wire [BIST1_ADDR_WD-1:2] mem4_addr_b;
wire [BIST_DATA_WD-1:0] mem4_dout_a;
// towards memory MBIST5
// PORT-A
wire mem5_clk_a;
wire [BIST2_ADDR_WD-1:2] mem5_addr_a;
wire mem5_cen_a;
wire [BIST_DATA_WD-1:0] mem5_din_b;
// PORT-B
wire mem5_clk_b;
wire mem5_cen_b;
wire mem5_web_b;
wire [BIST_DATA_WD/8-1:0] mem5_mask_b;
wire [BIST2_ADDR_WD-1:2] mem5_addr_b;
wire [BIST_DATA_WD-1:0] mem5_dout_a;
// towards memory MBIST6
// PORT-A
wire mem6_clk_a;
wire [BIST2_ADDR_WD-1:2] mem6_addr_a;
wire mem6_cen_a;
wire [BIST_DATA_WD-1:0] mem6_din_b;
// PORT-B
wire mem6_clk_b;
wire mem6_cen_b;
wire mem6_web_b;
wire [BIST_DATA_WD/8-1:0] mem6_mask_b;
wire [BIST2_ADDR_WD-1:2] mem6_addr_b;
wire [BIST_DATA_WD-1:0] mem6_dout_a;
// towards memory MBIST7
// PORT-A
wire mem7_clk_a;
wire [BIST2_ADDR_WD-1:2] mem7_addr_a;
wire mem7_cen_a;
wire [BIST_DATA_WD-1:0] mem7_din_b;
// PORT-B
wire mem7_clk_b;
wire mem7_cen_b;
wire mem7_web_b;
wire [BIST_DATA_WD/8-1:0] mem7_mask_b;
wire [BIST2_ADDR_WD-1:2] mem7_addr_b;
wire [BIST_DATA_WD-1:0] mem7_dout_a;
// towards memory MBIST8
// PORT-A
wire mem8_clk_a;
wire [BIST2_ADDR_WD-1:2] mem8_addr_a;
wire mem8_cen_a;
wire [BIST_DATA_WD-1:0] mem8_din_b;
// PORT-B
wire mem8_clk_b;
wire mem8_cen_b;
wire mem8_web_b;
wire [BIST_DATA_WD/8-1:0] mem8_mask_b;
wire [BIST2_ADDR_WD-1:2] mem8_addr_b;
wire [BIST_DATA_WD-1:0] mem8_dout_a;
wire lbist_clk ;
wire wbd_clk_wh ;
wire wbd_clk_int ;
wire wbd_clk_glbl_int ;
wire wbd_clk_mbist1_int ;
wire wbd_clk_mbist2_int ;
wire wbd_clk_mbist3_int ;
wire wbd_clk_mbist4_int ;
wire wbd_clk_mbist5_int ;
wire wbd_clk_mbist6_int ;
wire wbd_clk_mbist7_int ;
wire wbd_clk_mbist8_int ;
wire wbd_clk_wi ;
wire wbd_clk_glbl ; // clock for global reg
wire wbd_clk_mbist1 ; // clock for global reg
wire wbd_clk_mbist2 ; // clock for global reg
wire wbd_clk_mbist3 ; // clock for global reg
wire wbd_clk_mbist4 ; // clock for global reg
wire wbd_clk_mbist5 ; // clock for global reg
wire wbd_clk_mbist6 ; // clock for global reg
wire wbd_clk_mbist7 ; // clock for global reg
wire wbd_clk_mbist8 ; // clock for global reg
wire [31:0] cfg_clk_ctrl1 ;
wire [31:0] cfg_clk_ctrl2 ;
// Scan Control Signal
wire scan_clk ;
wire scan_rst_n ;
wire scan_mode ;
wire scan_en ;
wire [SCW-1:0] scan_in ;
wire [SCW-1:0] scan_out ;
wire scan_mode_glbl ;
wire scan_en_glbl ;
wire [SCW-1:0] scan_out_glbl ;
wire scan_mode_wbi ;
wire scan_en_wbi ;
wire [SCW-1:0] scan_out_wbi ;
wire scan_mode_mbist1 ;
wire scan_en_mbist1 ;
wire [SCW-1:0] scan_out_mbist1 ;
wire scan_mode_mbist2 ;
wire scan_en_mbist2 ;
wire [SCW-1:0] scan_out_mbist2 ;
wire scan_mode_mbist3 ;
wire scan_en_mbist3 ;
wire [SCW-1:0] scan_out_mbist3 ;
wire scan_mode_mbist4 ;
wire scan_en_mbist4 ;
wire [SCW-1:0] scan_out_mbist4 ;
wire scan_mode_mbist5 ;
wire scan_en_mbist5 ;
wire [SCW-1:0] scan_out_mbist5 ;
wire scan_mode_mbist6 ;
wire scan_en_mbist6 ;
wire [SCW-1:0] scan_out_mbist6 ;
wire scan_mode_mbist7 ;
wire scan_en_mbist7 ;
wire [SCW-1:0] scan_out_mbist7 ;
wire scan_mode_mbist8 ;
wire scan_en_mbist8 ;
wire [SCW-1:0] scan_out_mbist8 ;
////////////////////////////////////////////////////////////
// Scan Tree Map
///////////////////////////////////////////////////////////
// WB_HOST(LBIST) => GLBL => MBIST5 => MBIST6 => MBIST7
// => MBIST8 => WB_INTERCONNECT => MBIST4 => MBIST3
// => MBIST2 => MBIST1 => WB_HOST(LBIST)
/////////////////////////////////////////////////////////
// Clock Skew Ctrl
////////////////////////////////////////////////////////
wire [3:0] cfg_cska_wh = cfg_clk_ctrl1[3:0];
wire [3:0] cfg_cska_wi = cfg_clk_ctrl1[7:4];
wire [3:0] cfg_cska_glbl = cfg_clk_ctrl1[11:8];
wire [3:0] cfg_cska_lbist = cfg_clk_ctrl1[15:12];
wire [3:0] cfg_cska_mbist1 = cfg_clk_ctrl2[3:0];
wire [3:0] cfg_cska_mbist2 = cfg_clk_ctrl2[7:4];
wire [3:0] cfg_cska_mbist3 = cfg_clk_ctrl2[11:8];
wire [3:0] cfg_cska_mbist4 = cfg_clk_ctrl2[15:12];
wire [3:0] cfg_cska_mbist5 = cfg_clk_ctrl2[19:16];
wire [3:0] cfg_cska_mbist6 = cfg_clk_ctrl2[23:20];
wire [3:0] cfg_cska_mbist7 = cfg_clk_ctrl2[27:24];
wire [3:0] cfg_cska_mbist8 = cfg_clk_ctrl2[31:28];
wb_host
#(
`ifndef SYNTHESIS
.SCW(SCW) // SCAN CHAIN WIDTH
`endif
)
u_wb_host(
`ifdef USE_POWER_PINS
.vccd1 (vccd1 ),// User area 1 1.8V supply
.vssd1 (vssd1 ),// User area 1 digital ground
`endif
.user_clock1 (wb_clk_i ),
.user_clock2 (user_clock2 ),
.user_irq (user_irq ),
// Master Port
.wbm_rst_i (wb_rst_i ),
.wbm_clk_i (wb_clk_i ),
.wbm_cyc_i (wbs_cyc_i ),
.wbm_stb_i (wbs_stb_i ),
.wbm_adr_i (wbs_adr_i ),
.wbm_we_i (wbs_we_i ),
.wbm_dat_i (wbs_dat_i ),
.wbm_sel_i (wbs_sel_i ),
.wbm_dat_o (wbs_dat_o ),
.wbm_ack_o (wbs_ack_o ),
.wbm_err_o ( ),
// Clock Skeq Adjust
.wbd_clk_int (wbd_clk_int ),
.wbd_clk_wh (wbd_clk_wh ),
.cfg_cska_wh (cfg_cska_wh ),
// Clock Skeq Adjust
.lbist_clk_int (lbist_clk ),
.lbist_clk_out (lbist_clk ),
.cfg_cska_lbist (cfg_cska_lbist ),
// Slave Port
.wbs_clk_out (wbd_clk_int ),
.wbs_clk_i (wbd_clk_wh ),
.wbs_cyc_o (wbd_int_cyc_i ),
.wbs_stb_o (wbd_int_stb_i ),
.wbs_adr_o (wbd_int_adr_i ),
.wbs_we_o (wbd_int_we_i ),
.wbs_dat_o (wbd_int_dat_i ),
.wbs_sel_o (wbd_int_sel_i ),
.wbs_dat_i (wbd_int_dat_o ),
.wbs_ack_i (wbd_int_ack_o ),
.wbs_err_i (wbd_int_err_o ),
.cfg_clk_ctrl1 (cfg_clk_ctrl1 ),
.cfg_clk_ctrl2 (cfg_clk_ctrl2 ),
.bist_rst_n (bist_rst_n ),
.wbd_int_rst_n (wbd_int_rst_n ),
.io_in (io_in[0] ),
.io_out (io_out ),
.io_oeb (io_oeb ),
.la_data_in (la_data_in[35:0] ),
.la_data_out (la_data_out ),
// Scan Control Signal
.scan_clk (scan_clk ),
.scan_rst_n (scan_rst_n ),
.scan_mode (scan_mode ),
.scan_en (scan_en ),
.scan_in (scan_in ),
.scan_out (scan_out_mbist1 )
);
wb_interconnect #(
`ifndef SYNTHESIS
.SCW(SCW), // SCAN CHAIN WIDTH
.CH_CLK_WD(9),
.CH_DATA_WD(104)
`endif
)
u_intercon (
`ifdef USE_POWER_PINS
.vccd1 (vccd1 ),// User area 1 1.8V supply
.vssd1 (vssd1 ),// User area 1 digital ground
`endif
// SCAN I/F
.scan_en (scan_en_mbist8 ),
.scan_mode (scan_mode_mbist8 ),
.scan_si (scan_out_mbist8 ),
.scan_en_o (scan_en_wbi ),
.scan_mode_o (scan_mode_wbi ),
.scan_so (scan_out_wbi ),
// Clock Skew adjust
.wbd_clk_int (wbd_clk_int ),
.cfg_cska_wi (cfg_cska_wi ),
.wbd_clk_wi (wbd_clk_wi ),
.ch_clk_in ({
wbd_clk_int,
wbd_clk_int,
wbd_clk_int,
wbd_clk_int,
wbd_clk_int,
wbd_clk_int,
wbd_clk_int,
wbd_clk_int,
wbd_clk_int}),
.ch_clk_out ({
wbd_clk_mbist8_int,
wbd_clk_mbist7_int,
wbd_clk_mbist6_int,
wbd_clk_mbist5_int,
wbd_clk_mbist4_int,
wbd_clk_mbist3_int,
wbd_clk_mbist2_int,
wbd_clk_mbist1_int,
wbd_clk_glbl_int
}),
.ch_data_in ({
bist_error_cnt7,
bist_correct[7],
bist_error[7],
bist_done[7],
bist_sdo[7],
bist_sdi[7],
bist_load[7],
bist_shift[7],
bist_run[7],
bist_en[7],
bist_error_cnt6,
bist_correct[6],
bist_error[6],
bist_done[6],
bist_sdo[6],
bist_sdi[6],
bist_load[6],
bist_shift[6],
bist_run[6],
bist_en[6],
bist_error_cnt5,
bist_correct[5],
bist_error[5],
bist_done[5],
bist_sdo[5],
bist_sdi[5],
bist_load[5],
bist_shift[5],
bist_run[5],
bist_en[5],
bist_error_cnt4,
bist_correct[4],
bist_error[4],
bist_done[4],
bist_sdo[4],
bist_sdi[4],
bist_load[4],
bist_shift[4],
bist_run[4],
bist_en[4],
bist_error_cnt3,
bist_correct[3],
bist_error[3],
bist_done[3],
bist_sdo[3],
bist_sdi[3],
bist_load[3],
bist_shift[3],
bist_run[3],
bist_en[3],
bist_error_cnt2,
bist_correct[2],
bist_error[2],
bist_done[2],
bist_sdo[2],
bist_sdi[2],
bist_load[2],
bist_shift[2],
bist_run[2],
bist_en[2],
bist_error_cnt1,
bist_correct[1],
bist_error[1],
bist_done[1],
bist_sdo[1],
bist_sdi[1],
bist_load[1],
bist_shift[1],
bist_run[1],
bist_en[1],
bist_error_cnt0,
bist_correct[0],
bist_error[0],
bist_done[0],
bist_sdo[0],
bist_sdi[0],
bist_load[0],
bist_shift[0],
bist_run[0],
bist_en[0]
} ),
.ch_data_out ({
bist_error_cnt7_int,
bist_correct_int[7],
bist_error_int[7],
bist_done_int[7],
bist_sdo_int[7],
bist_sdi_int[7],
bist_load_int[7],
bist_shift_int[7],
bist_run_int[7],
bist_en_int[7],
bist_error_cnt6_int,
bist_correct_int[6],
bist_error_int[6],
bist_done_int[6],
bist_sdo_int[6],
bist_sdi_int[6],
bist_load_int[6],
bist_shift_int[6],
bist_run_int[6],
bist_en_int[6],
bist_error_cnt5_int,
bist_correct_int[5],
bist_error_int[5],
bist_done_int[5],
bist_sdo_int[5],
bist_sdi_int[5],
bist_load_int[5],
bist_shift_int[5],
bist_run_int[5],
bist_en_int[5],
bist_error_cnt4_int,
bist_correct_int[4],
bist_error_int[4],
bist_done_int[4],
bist_sdo_int[4],
bist_sdi_int[4],
bist_load_int[4],
bist_shift_int[4],
bist_run_int[4],
bist_en_int[4],
bist_error_cnt3_int,
bist_correct_int[3],
bist_error_int[3],
bist_done_int[3],
bist_sdo_int[3],
bist_sdi_int[3],
bist_load_int[3],
bist_shift_int[3],
bist_run_int[3],
bist_en_int[3],
bist_error_cnt2_int,
bist_correct_int[2],
bist_error_int[2],
bist_done_int[2],
bist_sdo_int[2],
bist_sdi_int[2],
bist_load_int[2],
bist_shift_int[2],
bist_run_int[2],
bist_en_int[2],
bist_error_cnt1_int,
bist_correct_int[1],
bist_error_int[1],
bist_done_int[1],
bist_sdo_int[1],
bist_sdi_int[1],
bist_load_int[1],
bist_shift_int[1],
bist_run_int[1],
bist_en_int[1],
bist_error_cnt0_int,
bist_correct_int[0],
bist_error_int[0],
bist_done_int[0],
bist_sdo_int[0],
bist_sdi_int[0],
bist_load_int[0],
bist_shift_int[0],
bist_run_int[0],
bist_en_int[0]
}),
.clk_i (wbd_clk_wi ),
.rst_n (wbd_int_rst_n ),
// Master 0 Interface
.m0_wbd_dat_i (wbd_int_dat_i ),
.m0_wbd_adr_i (wbd_int_adr_i ),
.m0_wbd_sel_i (wbd_int_sel_i ),
.m0_wbd_we_i (wbd_int_we_i ),
.m0_wbd_cyc_i (wbd_int_cyc_i ),
.m0_wbd_stb_i (wbd_int_stb_i ),
.m0_wbd_dat_o (wbd_int_dat_o ),
.m0_wbd_ack_o (wbd_int_ack_o ),
.m0_wbd_err_o (wbd_int_err_o ),
// Slave 0 Interface
// .s0_wbd_err_i (1'b0 ), - Moved inside IP
.s0_wbd_dat_i (wbd_glbl_dat_i ),
.s0_wbd_ack_i (wbd_glbl_ack_i ),
.s0_wbd_dat_o (wbd_glbl_dat_o ),
.s0_wbd_adr_o (wbd_glbl_adr_o ),
.s0_wbd_sel_o (wbd_glbl_sel_o ),
.s0_wbd_we_o (wbd_glbl_we_o ),
.s0_wbd_cyc_o (wbd_glbl_cyc_o ),
.s0_wbd_stb_o (wbd_glbl_stb_o ),
// Slave 0 Interface
// .s0_wbd_err_i (1'b0 ), - Moved inside IP
.s1_wbd_dat_i (wbd_mbist1_dat_i ),
.s1_wbd_ack_i (wbd_mbist1_ack_i ),
.s1_wbd_dat_o (wbd_mbist1_dat_o ),
.s1_wbd_adr_o (wbd_mbist1_adr_o ),
.s1_wbd_sel_o (wbd_mbist1_sel_o ),
.s1_wbd_we_o (wbd_mbist1_we_o ),
.s1_wbd_cyc_o (wbd_mbist1_cyc_o ),
.s1_wbd_stb_o (wbd_mbist1_stb_o ),
// Slave 1 Interface
// .s1_wbd_err_i (1'b0 ), - Moved inside IP
.s2_wbd_dat_i (wbd_mbist2_dat_i ),
.s2_wbd_ack_i (wbd_mbist2_ack_i ),
.s2_wbd_dat_o (wbd_mbist2_dat_o ),
.s2_wbd_adr_o (wbd_mbist2_adr_o ),
.s2_wbd_sel_o (wbd_mbist2_sel_o ),
.s2_wbd_we_o (wbd_mbist2_we_o ),
.s2_wbd_cyc_o (wbd_mbist2_cyc_o ),
.s2_wbd_stb_o (wbd_mbist2_stb_o ),
// Slave 2 Interface
// .s2_wbd_err_i (1'b0 ), - Moved inside IP
.s3_wbd_dat_i (wbd_mbist3_dat_i ),
.s3_wbd_ack_i (wbd_mbist3_ack_i ),
.s3_wbd_dat_o (wbd_mbist3_dat_o ),
.s3_wbd_adr_o (wbd_mbist3_adr_o ),
.s3_wbd_sel_o (wbd_mbist3_sel_o ),
.s3_wbd_we_o (wbd_mbist3_we_o ),
.s3_wbd_cyc_o (wbd_mbist3_cyc_o ),
.s3_wbd_stb_o (wbd_mbist3_stb_o ),
// Slave 3 Interface
// .s3_wbd_err_i (1'b0 ), - Moved inside IP
.s4_wbd_dat_i (wbd_mbist4_dat_i ),
.s4_wbd_ack_i (wbd_mbist4_ack_i ),
.s4_wbd_dat_o (wbd_mbist4_dat_o ),
.s4_wbd_adr_o (wbd_mbist4_adr_o ),
.s4_wbd_sel_o (wbd_mbist4_sel_o ),
.s4_wbd_we_o (wbd_mbist4_we_o ),
.s4_wbd_cyc_o (wbd_mbist4_cyc_o ),
.s4_wbd_stb_o (wbd_mbist4_stb_o ),
// Slave 4 Interface
// .s0_wbd_err_i (1'b0 ), - Moved inside IP
.s5_wbd_dat_i (wbd_mbist5_dat_i ),
.s5_wbd_ack_i (wbd_mbist5_ack_i ),
.s5_wbd_dat_o (wbd_mbist5_dat_o ),
.s5_wbd_adr_o (wbd_mbist5_adr_o ),
.s5_wbd_sel_o (wbd_mbist5_sel_o ),
.s5_wbd_we_o (wbd_mbist5_we_o ),
.s5_wbd_cyc_o (wbd_mbist5_cyc_o ),
.s5_wbd_stb_o (wbd_mbist5_stb_o ),
// Slave 5 Interface
// .s6_wbd_err_i (1'b0 ), - Moved inside IP
.s6_wbd_dat_i (wbd_mbist6_dat_i ),
.s6_wbd_ack_i (wbd_mbist6_ack_i ),
.s6_wbd_dat_o (wbd_mbist6_dat_o ),
.s6_wbd_adr_o (wbd_mbist6_adr_o ),
.s6_wbd_sel_o (wbd_mbist6_sel_o ),
.s6_wbd_we_o (wbd_mbist6_we_o ),
.s6_wbd_cyc_o (wbd_mbist6_cyc_o ),
.s6_wbd_stb_o (wbd_mbist6_stb_o ),
// Slave 6 Interface
// .s7_wbd_err_i (1'b0 ), - Moved inside IP
.s7_wbd_dat_i (wbd_mbist7_dat_i ),
.s7_wbd_ack_i (wbd_mbist7_ack_i ),
.s7_wbd_dat_o (wbd_mbist7_dat_o ),
.s7_wbd_adr_o (wbd_mbist7_adr_o ),
.s7_wbd_sel_o (wbd_mbist7_sel_o ),
.s7_wbd_we_o (wbd_mbist7_we_o ),
.s7_wbd_cyc_o (wbd_mbist7_cyc_o ),
.s7_wbd_stb_o (wbd_mbist7_stb_o ),
// Slave 7 Interface
// .s8_wbd_err_i (1'b0 ), - Moved inside IP
.s8_wbd_dat_i (wbd_mbist8_dat_i ),
.s8_wbd_ack_i (wbd_mbist8_ack_i ),
.s8_wbd_dat_o (wbd_mbist8_dat_o ),
.s8_wbd_adr_o (wbd_mbist8_adr_o ),
.s8_wbd_sel_o (wbd_mbist8_sel_o ),
.s8_wbd_we_o (wbd_mbist8_we_o ),
.s8_wbd_cyc_o (wbd_mbist8_cyc_o ),
.s8_wbd_stb_o (wbd_mbist8_stb_o )
);
glbl_cfg #(
`ifndef SYNTHESIS
.SCW(SCW) // SCAN CHAIN WIDTH
`endif
) u_glbl(
`ifdef USE_POWER_PINS
.vccd1 (vccd1 ),// User area 1 1.8V supply
.vssd1 (vssd1 ),// User area 1 digital ground
`endif
// SCAN I/F
.scan_en (scan_en ),
.scan_mode (scan_mode ),
.scan_si (scan_in ),
.scan_en_o (scan_en_glbl ),
.scan_mode_o (scan_mode_glbl ),
.scan_so (scan_out_glbl ),
.wbd_clk_int (wbd_clk_glbl_int ),
.cfg_cska_glbl (cfg_cska_glbl ),
.wbd_clk_glbl (wbd_clk_glbl ),
.mclk (wbd_clk_glbl ),
.reset_n (wbd_int_rst_n ),
// Reg Bus Interface Signal
.reg_cs (wbd_glbl_stb_o ),
.reg_wr (wbd_glbl_we_o ),
.reg_addr (wbd_glbl_adr_o ),
.reg_wdata (wbd_glbl_dat_o ),
.reg_be (wbd_glbl_sel_o ),
// Outputs
.reg_rdata (wbd_glbl_dat_i ),
.reg_ack (wbd_glbl_ack_i ),
// BIST I/F Outputs
.bist_en (bist_en),
.bist_run (bist_run),
.bist_load (bist_load),
.bist_sdi (bist_sdi),
.bist_shift (bist_shift),
// BIST Inputs
.bist_sdo (bist_sdo_int),
.bist_done (bist_done_int),
.bist_error (bist_error_int),
.bist_correct (bist_correct_int),
.bist_error_cnt0 (bist_error_cnt0_int),
.bist_error_cnt1 (bist_error_cnt1_int),
.bist_error_cnt2 (bist_error_cnt2_int),
.bist_error_cnt3 (bist_error_cnt3_int),
.bist_error_cnt4 (bist_error_cnt4_int),
.bist_error_cnt5 (bist_error_cnt5_int),
.bist_error_cnt6 (bist_error_cnt6_int),
.bist_error_cnt7 (bist_error_cnt7_int)
);
//------------- MBIST1 - 512x32 ----
mbist_top1 #(
`ifndef SYNTHESIS
.SCW (SCW), // SCAN CHAIN WIDTH
.BIST_ADDR_WD (BIST1_ADDR_WD-2 ),
.BIST_DATA_WD (BIST_DATA_WD ),
.BIST_ADDR_START (9'h000 ),
.BIST_ADDR_END (9'h1FB ),
.BIST_REPAIR_ADDR_START (9'h1FC ),
.BIST_RAD_WD_I (BIST1_ADDR_WD-2 ),
.BIST_RAD_WD_O (BIST1_ADDR_WD-2 )
`endif
)
u_mbist1 (
`ifdef USE_POWER_PINS
.vccd1 (vccd1 ),// User area 1 1.8V supply
.vssd1 (vssd1 ),// User area 1 digital ground
`endif
// SCAN I/F
.scan_en (scan_en_mbist2 ),
.scan_mode (scan_mode_mbist2 ),
.scan_si (scan_out_mbist2 ),
.scan_en_o (scan_en_mbist1 ),
.scan_mode_o (scan_mode_mbist1 ),
.scan_so (scan_out_mbist1 ),
// Clock Skew adjust
.wbd_clk_int (wbd_clk_mbist1_int),
.cfg_cska_mbist (cfg_cska_mbist1 ),
.wbd_clk_mbist (wbd_clk_mbist1 ),
// WB I/F
.wb_clk_i (wbd_clk_mbist1 ),
.wb_cyc_i (wbd_mbist1_cyc_o),
.wb_stb_i (wbd_mbist1_stb_o),
.wb_adr_i (wbd_mbist1_adr_o[BIST1_ADDR_WD-1:2]),
.wb_we_i (wbd_mbist1_we_o ),
.wb_dat_i (wbd_mbist1_dat_o),
.wb_sel_i (wbd_mbist1_sel_o),
.wb_dat_o (wbd_mbist1_dat_i),
.wb_ack_o (wbd_mbist1_ack_i),
.wb_err_o ( ),
.rst_n (bist_rst_n ),
.bist_en (bist_en_int[0] ),
.bist_run (bist_run_int[0] ),
.bist_shift (bist_shift_int[0] ),
.bist_load (bist_load_int[0] ),
.bist_sdi (bist_sdi_int[0] ),
.bist_error_cnt (bist_error_cnt0 ),
.bist_correct (bist_correct[0] ),
.bist_error (bist_error[0] ),
.bist_done (bist_done[0] ),
.bist_sdo (bist_sdo[0] ),
// towards memory
// PORT-A
.mem_clk_a (mem1_clk_a ),
.mem_addr_a (mem1_addr_a ),
.mem_cen_a (mem1_cen_a ),
.mem_dout_a (mem1_dout_a ),
// PORT-B
.mem_clk_b (mem1_clk_b ),
.mem_cen_b (mem1_cen_b ),
.mem_web_b (mem1_web_b ),
.mem_mask_b (mem1_mask_b ),
.mem_addr_b (mem1_addr_b ),
.mem_din_b (mem1_din_b )
);
sky130_sram_2kbyte_1rw1r_32x512_8 u_sram1_2kb(
`ifdef USE_POWER_PINS
.vccd1 (vccd1),// User area 1 1.8V supply
.vssd1 (vssd1),// User area 1 digital ground
`endif
// Port 0: RW
.clk0 (mem1_clk_b),
.csb0 (mem1_cen_b),
.web0 (mem1_web_b),
.wmask0 (mem1_mask_b),
.addr0 (mem1_addr_b),
.din0 (mem1_din_b),
.dout0 (),
// Port 1: R
.clk1 (mem1_clk_a),
.csb1 (mem1_cen_a),
.addr1 (mem1_addr_a),
.dout1 (mem1_dout_a)
);
//------------- MBIST2 - 512x32 ----
mbist_top1 #(
`ifndef SYNTHESIS
.SCW (SCW), // SCAN CHAIN WIDTH
.BIST_ADDR_WD (BIST1_ADDR_WD-2 ),
.BIST_DATA_WD (BIST_DATA_WD ),
.BIST_ADDR_START (9'h000 ),
.BIST_ADDR_END (9'h1FB ),
.BIST_REPAIR_ADDR_START (9'h1FC ),
.BIST_RAD_WD_I (BIST1_ADDR_WD-2 ),
.BIST_RAD_WD_O (BIST1_ADDR_WD-2 )
`endif
)
u_mbist2 (
`ifdef USE_POWER_PINS
.vccd1 (vccd1 ),// User area 1 1.8V supply
.vssd1 (vssd1 ),// User area 1 digital ground
`endif
// SCAN I/F
.scan_en (scan_en_mbist3 ),
.scan_mode (scan_mode_mbist3 ),
.scan_si (scan_out_mbist3 ),
.scan_en_o (scan_en_mbist2 ),
.scan_mode_o (scan_mode_mbist2 ),
.scan_so (scan_out_mbist2 ),
// Clock Skew adjust
.wbd_clk_int (wbd_clk_mbist2_int),
.cfg_cska_mbist (cfg_cska_mbist2 ),
.wbd_clk_mbist (wbd_clk_mbist2 ),
// WB I/F
.wb_clk_i (wbd_clk_mbist2 ),
.wb_cyc_i (wbd_mbist2_cyc_o),
.wb_stb_i (wbd_mbist2_stb_o),
.wb_adr_i (wbd_mbist2_adr_o[BIST1_ADDR_WD-1:2]),
.wb_we_i (wbd_mbist2_we_o ),
.wb_dat_i (wbd_mbist2_dat_o),
.wb_sel_i (wbd_mbist2_sel_o),
.wb_dat_o (wbd_mbist2_dat_i),
.wb_ack_o (wbd_mbist2_ack_i),
.wb_err_o ( ),
.rst_n (bist_rst_n ),
.bist_en (bist_en_int[1] ),
.bist_run (bist_run_int[1] ),
.bist_shift (bist_shift_int[1] ),
.bist_load (bist_load_int[1] ),
.bist_sdi (bist_sdi_int[1] ),
.bist_error_cnt (bist_error_cnt1 ),
.bist_correct (bist_correct[1] ),
.bist_error (bist_error[1] ),
.bist_done (bist_done[1] ),
.bist_sdo (bist_sdo[1] ),
// towards memory
// PORT-A
.mem_clk_a (mem2_clk_a ),
.mem_addr_a (mem2_addr_a ),
.mem_cen_a (mem2_cen_a ),
.mem_dout_a (mem2_dout_a ),
// PORT-B
.mem_clk_b (mem2_clk_b ),
.mem_cen_b (mem2_cen_b ),
.mem_web_b (mem2_web_b ),
.mem_mask_b (mem2_mask_b ),
.mem_addr_b (mem2_addr_b ),
.mem_din_b (mem2_din_b )
);
sky130_sram_2kbyte_1rw1r_32x512_8 u_sram2_2kb(
`ifdef USE_POWER_PINS
.vccd1 (vccd1),// User area 1 1.8V supply
.vssd1 (vssd1),// User area 1 digital ground
`endif
// Port 0: RW
.clk0 (mem2_clk_b),
.csb0 (mem2_cen_b),
.web0 (mem2_web_b),
.wmask0 (mem2_mask_b),
.addr0 (mem2_addr_b),
.din0 (mem2_din_b),
.dout0 (),
// Port 1: R
.clk1 (mem2_clk_a),
.csb1 (mem2_cen_a),
.addr1 (mem2_addr_a),
.dout1 (mem2_dout_a)
);
//------------- MBIST3 - 512x32 ----
mbist_top1 #(
`ifndef SYNTHESIS
.SCW (SCW), // SCAN CHAIN WIDTH
.BIST_ADDR_WD (BIST1_ADDR_WD-2 ),
.BIST_DATA_WD (BIST_DATA_WD ),
.BIST_ADDR_START (9'h000 ),
.BIST_ADDR_END (9'h1FB ),
.BIST_REPAIR_ADDR_START (9'h1FC ),
.BIST_RAD_WD_I (BIST1_ADDR_WD-2 ),
.BIST_RAD_WD_O (BIST1_ADDR_WD-2 )
`endif
)
u_mbist3 (
`ifdef USE_POWER_PINS
.vccd1 (vccd1 ),// User area 1 1.8V supply
.vssd1 (vssd1 ),// User area 1 digital ground
`endif
// SCAN I/F
.scan_en (scan_en_mbist4 ),
.scan_mode (scan_mode_mbist4 ),
.scan_si (scan_out_mbist4 ),
.scan_en_o (scan_en_mbist3 ),
.scan_mode_o (scan_mode_mbist3 ),
.scan_so (scan_out_mbist3 ),
// Clock Skew adjust
.wbd_clk_int (wbd_clk_mbist3_int ),
.cfg_cska_mbist (cfg_cska_mbist3 ),
.wbd_clk_mbist (wbd_clk_mbist3 ),
// WB I/F
.wb_clk_i (wbd_clk_mbist3 ),
.wb_cyc_i (wbd_mbist3_cyc_o),
.wb_stb_i (wbd_mbist3_stb_o),
.wb_adr_i (wbd_mbist3_adr_o[BIST1_ADDR_WD-1:2]),
.wb_we_i (wbd_mbist3_we_o ),
.wb_dat_i (wbd_mbist3_dat_o),
.wb_sel_i (wbd_mbist3_sel_o),
.wb_dat_o (wbd_mbist3_dat_i),
.wb_ack_o (wbd_mbist3_ack_i),
.wb_err_o ( ),
.rst_n (bist_rst_n ),
.bist_en (bist_en_int[2] ),
.bist_run (bist_run_int[2] ),
.bist_shift (bist_shift_int[2]),
.bist_load (bist_load_int[2] ),
.bist_sdi (bist_sdi_int[2] ),
.bist_error_cnt (bist_error_cnt2 ),
.bist_correct (bist_correct[2] ),
.bist_error (bist_error[2] ),
.bist_done (bist_done[2] ),
.bist_sdo (bist_sdo[2] ),
// towards memory
// PORT-A
.mem_clk_a (mem3_clk_a ),
.mem_addr_a (mem3_addr_a ),
.mem_cen_a (mem3_cen_a ),
.mem_dout_a (mem3_dout_a ),
// PORT-B
.mem_clk_b (mem3_clk_b ),
.mem_cen_b (mem3_cen_b ),
.mem_web_b (mem3_web_b ),
.mem_mask_b (mem3_mask_b ),
.mem_addr_b (mem3_addr_b ),
.mem_din_b (mem3_din_b )
);
sky130_sram_2kbyte_1rw1r_32x512_8 u_sram3_2kb(
`ifdef USE_POWER_PINS
.vccd1 (vccd1),// User area 1 1.8V supply
.vssd1 (vssd1),// User area 1 digital ground
`endif
// Port 0: RW
.clk0 (mem3_clk_b),
.csb0 (mem3_cen_b),
.web0 (mem3_web_b),
.wmask0 (mem3_mask_b),
.addr0 (mem3_addr_b),
.din0 (mem3_din_b),
.dout0 (),
// Port 1: R
.clk1 (mem3_clk_a),
.csb1 (mem3_cen_a),
.addr1 (mem3_addr_a),
.dout1 (mem3_dout_a)
);
//------------- MBIST4 - 512x32 ----
mbist_top1 #(
`ifndef SYNTHESIS
.SCW (SCW), // SCAN CHAIN WIDTH
.BIST_ADDR_WD (BIST1_ADDR_WD-2 ),
.BIST_DATA_WD (BIST_DATA_WD ),
.BIST_ADDR_START (9'h000 ),
.BIST_ADDR_END (9'h1FB ),
.BIST_REPAIR_ADDR_START (9'h1FC ),
.BIST_RAD_WD_I (BIST1_ADDR_WD-2 ),
.BIST_RAD_WD_O (BIST1_ADDR_WD-2 )
`endif
)
u_mbist4 (
`ifdef USE_POWER_PINS
.vccd1 (vccd1 ),// User area 1 1.8V supply
.vssd1 (vssd1 ),// User area 1 digital ground
`endif
// SCAN I/F
.scan_en (scan_en_wbi ),
.scan_mode (scan_mode_wbi ),
.scan_si (scan_out_wbi ),
.scan_en_o (scan_en_mbist4 ),
.scan_mode_o (scan_mode_mbist4 ),
.scan_so (scan_out_mbist4 ),
// Clock Skew adjust
.wbd_clk_int (wbd_clk_mbist4_int ),
.cfg_cska_mbist (cfg_cska_mbist4 ),
.wbd_clk_mbist (wbd_clk_mbist4 ),
// WB I/F
.wb_clk_i (wbd_clk_mbist4 ),
.wb_cyc_i (wbd_mbist4_cyc_o),
.wb_stb_i (wbd_mbist4_stb_o),
.wb_adr_i (wbd_mbist4_adr_o[BIST1_ADDR_WD-1:2]),
.wb_we_i (wbd_mbist4_we_o ),
.wb_dat_i (wbd_mbist4_dat_o),
.wb_sel_i (wbd_mbist4_sel_o),
.wb_dat_o (wbd_mbist4_dat_i),
.wb_ack_o (wbd_mbist4_ack_i),
.wb_err_o ( ),
.rst_n (bist_rst_n ),
.bist_en (bist_en_int[3] ),
.bist_run (bist_run_int[3] ),
.bist_shift (bist_shift_int[3] ),
.bist_load (bist_load_int[3] ),
.bist_sdi (bist_sdi_int[3] ),
.bist_error_cnt (bist_error_cnt3 ),
.bist_correct (bist_correct[3] ),
.bist_error (bist_error[3] ),
.bist_done (bist_done[3] ),
.bist_sdo (bist_sdo[3] ),
// towards memory
// PORT-A
.mem_clk_a (mem4_clk_a ),
.mem_addr_a (mem4_addr_a ),
.mem_cen_a (mem4_cen_a ),
.mem_dout_a (mem4_dout_a ),
// PORT-B
.mem_clk_b (mem4_clk_b ),
.mem_cen_b (mem4_cen_b ),
.mem_web_b (mem4_web_b ),
.mem_mask_b (mem4_mask_b ),
.mem_addr_b (mem4_addr_b ),
.mem_din_b (mem4_din_b )
);
sky130_sram_2kbyte_1rw1r_32x512_8 u_sram4_2kb(
`ifdef USE_POWER_PINS
.vccd1 (vccd1),// User area 1 1.8V supply
.vssd1 (vssd1),// User area 1 digital ground
`endif
// Port 0: RW
.clk0 (mem4_clk_b),
.csb0 (mem4_cen_b),
.web0 (mem4_web_b),
.wmask0 (mem4_mask_b),
.addr0 (mem4_addr_b),
.din0 (mem4_din_b),
.dout0 (),
// Port 1: R
.clk1 (mem4_clk_a),
.csb1 (mem4_cen_a),
.addr1 (mem4_addr_a),
.dout1 (mem4_dout_a)
);
//------------- MBIST5 - 256x32 ----
mbist_top2 #(
`ifndef SYNTHESIS
.SCW (SCW), // SCAN CHAIN WIDTH
.BIST_ADDR_WD (BIST2_ADDR_WD-2 ),
.BIST_DATA_WD (BIST_DATA_WD ),
.BIST_ADDR_START (8'h00 ),
.BIST_ADDR_END (8'hFB ),
.BIST_REPAIR_ADDR_START (8'hFC ),
.BIST_RAD_WD_I (BIST2_ADDR_WD-2 ),
.BIST_RAD_WD_O (BIST2_ADDR_WD-2 )
`endif
)
u_mbist5 (
`ifdef USE_POWER_PINS
.vccd1 (vccd1 ),// User area 1 1.8V supply
.vssd1 (vssd1 ),// User area 1 digital ground
`endif
// SCAN I/F
.scan_en (scan_en_glbl ),
.scan_mode (scan_mode_glbl ),
.scan_si (scan_out_glbl ),
.scan_en_o (scan_en_mbist5 ),
.scan_mode_o (scan_mode_mbist5 ),
.scan_so (scan_out_mbist5 ),
// Clock Skew adjust
.wbd_clk_int (wbd_clk_mbist5_int ),
.cfg_cska_mbist (cfg_cska_mbist5 ),
.wbd_clk_mbist (wbd_clk_mbist5 ),
// WB I/F
.wb_clk_i (wbd_clk_mbist5 ),
.wb_cyc_i (wbd_mbist5_cyc_o),
.wb_stb_i (wbd_mbist5_stb_o),
.wb_adr_i (wbd_mbist5_adr_o[BIST2_ADDR_WD-1:2]),
.wb_we_i (wbd_mbist5_we_o ),
.wb_dat_i (wbd_mbist5_dat_o),
.wb_sel_i (wbd_mbist5_sel_o),
.wb_dat_o (wbd_mbist5_dat_i),
.wb_ack_o (wbd_mbist5_ack_i),
.wb_err_o ( ),
.rst_n (bist_rst_n ),
.bist_en (bist_en_int[4] ),
.bist_run (bist_run_int[4] ),
.bist_shift (bist_shift_int[4]),
.bist_load (bist_load_int[4] ),
.bist_sdi (bist_sdi_int[4] ),
.bist_error_cnt (bist_error_cnt4 ),
.bist_correct (bist_correct[4] ),
.bist_error (bist_error[4] ),
.bist_done (bist_done[4] ),
.bist_sdo (bist_sdo[4] ),
// towards memory
// PORT-A
.mem_clk_a (mem5_clk_a ),
.mem_addr_a (mem5_addr_a ),
.mem_cen_a (mem5_cen_a ),
.mem_dout_a (mem5_dout_a ),
// PORT-B
.mem_clk_b (mem5_clk_b ),
.mem_cen_b (mem5_cen_b ),
.mem_web_b (mem5_web_b ),
.mem_mask_b (mem5_mask_b ),
.mem_addr_b (mem5_addr_b ),
.mem_din_b (mem5_din_b )
);
sky130_sram_1kbyte_1rw1r_32x256_8 u_sram5_1kb(
`ifdef USE_POWER_PINS
.vccd1 (vccd1),// User area 1 1.8V supply
.vssd1 (vssd1),// User area 1 digital ground
`endif
// Port 0: RW
.clk0 (mem5_clk_b),
.csb0 (mem5_cen_b),
.web0 (mem5_web_b),
.wmask0 (mem5_mask_b),
.addr0 (mem5_addr_b),
.din0 (mem5_din_b),
.dout0 (),
// Port 1: R
.clk1 (mem5_clk_a),
.csb1 (mem5_cen_a),
.addr1 (mem5_addr_a),
.dout1 (mem5_dout_a)
);
//------------- MBIST6 - 256x32 ----
mbist_top2 #(
`ifndef SYNTHESIS
.SCW (SCW), // SCAN CHAIN WIDTH
.BIST_ADDR_WD (BIST2_ADDR_WD-2 ),
.BIST_DATA_WD (BIST_DATA_WD ),
.BIST_ADDR_START (8'h00 ),
.BIST_ADDR_END (8'hFB ),
.BIST_REPAIR_ADDR_START (8'hFC ),
.BIST_RAD_WD_I (BIST2_ADDR_WD-2 ),
.BIST_RAD_WD_O (BIST2_ADDR_WD-2 )
`endif
)
u_mbist6 (
`ifdef USE_POWER_PINS
.vccd1 (vccd1 ),// User area 1 1.8V supply
.vssd1 (vssd1 ),// User area 1 digital ground
`endif
// SCAN I/F
.scan_en (scan_en_mbist5 ),
.scan_mode (scan_mode_mbist5 ),
.scan_si (scan_out_mbist5 ),
.scan_en_o (scan_en_mbist6 ),
.scan_mode_o (scan_mode_mbist6 ),
.scan_so (scan_out_mbist6 ),
// Clock Skew adjust
.wbd_clk_int (wbd_clk_mbist6_int ),
.cfg_cska_mbist (cfg_cska_mbist6 ),
.wbd_clk_mbist (wbd_clk_mbist6 ),
// WB I/F
.wb_clk_i (wbd_clk_mbist6 ),
.wb_cyc_i (wbd_mbist6_cyc_o),
.wb_stb_i (wbd_mbist6_stb_o),
.wb_adr_i (wbd_mbist6_adr_o[BIST2_ADDR_WD-1:2]),
.wb_we_i (wbd_mbist6_we_o ),
.wb_dat_i (wbd_mbist6_dat_o),
.wb_sel_i (wbd_mbist6_sel_o),
.wb_dat_o (wbd_mbist6_dat_i),
.wb_ack_o (wbd_mbist6_ack_i),
.wb_err_o ( ),
.rst_n (bist_rst_n ),
.bist_en (bist_en_int[5] ),
.bist_run (bist_run_int[5] ),
.bist_shift (bist_shift_int[5]),
.bist_load (bist_load_int[5] ),
.bist_sdi (bist_sdi_int[5] ),
.bist_error_cnt (bist_error_cnt5 ),
.bist_correct (bist_correct[5] ),
.bist_error (bist_error[5] ),
.bist_done (bist_done[5] ),
.bist_sdo (bist_sdo[5] ),
// towards memory
// PORT-A
.mem_clk_a (mem6_clk_a ),
.mem_addr_a (mem6_addr_a ),
.mem_cen_a (mem6_cen_a ),
.mem_dout_a (mem6_dout_a ),
// PORT-B
.mem_clk_b (mem6_clk_b ),
.mem_cen_b (mem6_cen_b ),
.mem_web_b (mem6_web_b ),
.mem_mask_b (mem6_mask_b ),
.mem_addr_b (mem6_addr_b ),
.mem_din_b (mem6_din_b )
);
sky130_sram_1kbyte_1rw1r_32x256_8 u_sram6_1kb(
`ifdef USE_POWER_PINS
.vccd1 (vccd1),// User area 1 1.8V supply
.vssd1 (vssd1),// User area 1 digital ground
`endif
// Port 0: RW
.clk0 (mem6_clk_b),
.csb0 (mem6_cen_b),
.web0 (mem6_web_b),
.wmask0 (mem6_mask_b),
.addr0 (mem6_addr_b),
.din0 (mem6_din_b),
.dout0 (),
// Port 1: R
.clk1 (mem6_clk_a),
.csb1 (mem6_cen_a),
.addr1 (mem6_addr_a),
.dout1 (mem6_dout_a)
);
//------------- MBIST7 - 256x32 ----
mbist_top2 #(
`ifndef SYNTHESIS
.SCW (SCW), // SCAN CHAIN WIDTH
.BIST_ADDR_WD (BIST2_ADDR_WD-2 ),
.BIST_DATA_WD (BIST_DATA_WD ),
.BIST_ADDR_START (8'h00 ),
.BIST_ADDR_END (8'hFB ),
.BIST_REPAIR_ADDR_START (8'hFC ),
.BIST_RAD_WD_I (BIST2_ADDR_WD-2 ),
.BIST_RAD_WD_O (BIST2_ADDR_WD-2 )
`endif
)
u_mbist7 (
`ifdef USE_POWER_PINS
.vccd1 (vccd1 ),// User area 1 1.8V supply
.vssd1 (vssd1 ),// User area 1 digital ground
`endif
// SCAN I/F
.scan_en (scan_en_mbist6 ),
.scan_mode (scan_mode_mbist6 ),
.scan_si (scan_out_mbist6 ),
.scan_en_o (scan_en_mbist7 ),
.scan_mode_o (scan_mode_mbist7 ),
.scan_so (scan_out_mbist7 ),
// Clock Skew adjust
.wbd_clk_int (wbd_clk_mbist7_int ),
.cfg_cska_mbist (cfg_cska_mbist7 ),
.wbd_clk_mbist (wbd_clk_mbist7 ),
// WB I/F
.wb_clk_i (wbd_clk_mbist7 ),
.wb_cyc_i (wbd_mbist7_cyc_o),
.wb_stb_i (wbd_mbist7_stb_o),
.wb_adr_i (wbd_mbist7_adr_o[BIST2_ADDR_WD-1:2]),
.wb_we_i (wbd_mbist7_we_o ),
.wb_dat_i (wbd_mbist7_dat_o),
.wb_sel_i (wbd_mbist7_sel_o),
.wb_dat_o (wbd_mbist7_dat_i),
.wb_ack_o (wbd_mbist7_ack_i),
.wb_err_o ( ),
.rst_n (bist_rst_n ),
.bist_en (bist_en_int[6] ),
.bist_run (bist_run_int[6] ),
.bist_shift (bist_shift_int[6]),
.bist_load (bist_load_int[6] ),
.bist_sdi (bist_sdi_int[6] ),
.bist_error_cnt (bist_error_cnt6 ),
.bist_correct (bist_correct[6] ),
.bist_error (bist_error[6] ),
.bist_done (bist_done[6] ),
.bist_sdo (bist_sdo[6] ),
// towards memory
// PORT-A
.mem_clk_a (mem7_clk_a ),
.mem_addr_a (mem7_addr_a ),
.mem_cen_a (mem7_cen_a ),
.mem_dout_a (mem7_dout_a ),
// PORT-B
.mem_clk_b (mem7_clk_b ),
.mem_cen_b (mem7_cen_b ),
.mem_web_b (mem7_web_b ),
.mem_mask_b (mem7_mask_b ),
.mem_addr_b (mem7_addr_b ),
.mem_din_b (mem7_din_b )
);
sky130_sram_1kbyte_1rw1r_32x256_8 u_sram7_1kb(
`ifdef USE_POWER_PINS
.vccd1 (vccd1),// User area 1 1.8V supply
.vssd1 (vssd1),// User area 1 digital ground
`endif
// Port 0: RW
.clk0 (mem7_clk_b),
.csb0 (mem7_cen_b),
.web0 (mem7_web_b),
.wmask0 (mem7_mask_b),
.addr0 (mem7_addr_b),
.din0 (mem7_din_b),
.dout0 (),
// Port 1: R
.clk1 (mem7_clk_a),
.csb1 (mem7_cen_a),
.addr1 (mem7_addr_a),
.dout1 (mem7_dout_a)
);
//------------- MBIST6 - 256x32 ----
mbist_top2 #(
`ifndef SYNTHESIS
.SCW (SCW), // SCAN CHAIN WIDTH
.BIST_ADDR_WD (BIST2_ADDR_WD-2 ),
.BIST_DATA_WD (BIST_DATA_WD ),
.BIST_ADDR_START (8'h00 ),
.BIST_ADDR_END (8'hFB ),
.BIST_REPAIR_ADDR_START (8'hFC ),
.BIST_RAD_WD_I (BIST2_ADDR_WD-2 ),
.BIST_RAD_WD_O (BIST2_ADDR_WD-2 )
`endif
)
u_mbist8 (
`ifdef USE_POWER_PINS
.vccd1 (vccd1 ),// User area 1 1.8V supply
.vssd1 (vssd1 ),// User area 1 digital ground
`endif
// SCAN I/F
.scan_en (scan_en_mbist7 ),
.scan_mode (scan_mode_mbist7 ),
.scan_si (scan_out_mbist7 ),
.scan_en_o (scan_en_mbist8 ),
.scan_mode_o (scan_mode_mbist8 ),
.scan_so (scan_out_mbist8 ),
// Clock Skew adjust
.wbd_clk_int (wbd_clk_mbist8_int),
.cfg_cska_mbist (cfg_cska_mbist8 ),
.wbd_clk_mbist (wbd_clk_mbist8 ),
// WB I/F
.wb_clk_i (wbd_clk_mbist8 ),
.wb_cyc_i (wbd_mbist8_cyc_o),
.wb_stb_i (wbd_mbist8_stb_o),
.wb_adr_i (wbd_mbist8_adr_o[BIST2_ADDR_WD-1:2]),
.wb_we_i (wbd_mbist8_we_o ),
.wb_dat_i (wbd_mbist8_dat_o),
.wb_sel_i (wbd_mbist8_sel_o),
.wb_dat_o (wbd_mbist8_dat_i),
.wb_ack_o (wbd_mbist8_ack_i),
.wb_err_o ( ),
.rst_n (bist_rst_n ),
.bist_en (bist_en_int[7] ),
.bist_run (bist_run_int[7] ),
.bist_shift (bist_shift_int[7]),
.bist_load (bist_load_int[7] ),
.bist_sdi (bist_sdi_int[7] ),
.bist_error_cnt (bist_error_cnt7 ),
.bist_correct (bist_correct[7] ),
.bist_error (bist_error[7] ),
.bist_done (bist_done[7] ),
.bist_sdo (bist_sdo[7] ),
// towards memory
// PORT-A
.mem_clk_a (mem8_clk_a ),
.mem_addr_a (mem8_addr_a ),
.mem_cen_a (mem8_cen_a ),
.mem_dout_a (mem8_dout_a ),
// PORT-B
.mem_clk_b (mem8_clk_b ),
.mem_cen_b (mem8_cen_b ),
.mem_web_b (mem8_web_b ),
.mem_mask_b (mem8_mask_b ),
.mem_addr_b (mem8_addr_b ),
.mem_din_b (mem8_din_b )
);
sky130_sram_1kbyte_1rw1r_32x256_8 u_sram8_1kb(
`ifdef USE_POWER_PINS
.vccd1 (vccd1),// User area 1 1.8V supply
.vssd1 (vssd1),// User area 1 digital ground
`endif
// Port 0: RW
.clk0 (mem8_clk_b),
.csb0 (mem8_cen_b),
.web0 (mem8_web_b),
.wmask0 (mem8_mask_b),
.addr0 (mem8_addr_b),
.din0 (mem8_din_b),
.dout0 (),
// Port 1: R
.clk1 (mem8_clk_a),
.csb1 (mem8_cen_a),
.addr1 (mem8_addr_a),
.dout1 (mem8_dout_a)
);
endmodule // user_project_wrapper
`default_nettype wire