blob: 07c5ce3ab1a00075934f5d2d072f6cca5153a76c [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>
//
//////////////////////////////////////////////////////////////////////
//// ////
//// MBIST TOP ////
//// ////
//// This file is part of the mbist_ctrl cores project ////
//// https://github.com/dineshannayya/mbist_ctrl.git ////
//// ////
//// Description ////
//// This block integrate mbist controller with row ////
//// redendency feature ////
//// ////
//// To Do: ////
//// nothing ////
//// ////
//// Author(s): ////
//// - Dinesh Annayya, dinesha@opencores.org ////
//// ////
//// Revision : ////
//// 0.0 - 11th Oct 2021, Dinesh A ////
//// Initial integration ////
//// 0.1 - 26th Oct 2021, Dinesh A ////
//// Fixed Error Address are serial shifted through ////
//// sdi/sdo ////
//// 0.2 - 15 Dec 2021, Dinesh A ////
//// Added support for common MBIST for 4 SRAM ////
//// 0.3 - 29th Dec 2021, Dinesh A ////
//// yosys synthesis issue for two dimension variable ////
//// changed the variable defination from logic to wire ////
//// ////
//////////////////////////////////////////////////////////////////////
`include "mbist_def.svh"
module mbist_wrapper
#(
parameter BIST_NO_SRAM = 4,
parameter BIST_ADDR_WD = 9,
parameter BIST_DATA_WD = 32,
parameter BIST_ADDR_START = 9'h000,
parameter BIST_ADDR_END = 9'h1FB,
parameter BIST_REPAIR_ADDR_START = 9'h1FC,
parameter BIST_RAD_WD_I = BIST_ADDR_WD,
parameter BIST_RAD_WD_O = BIST_ADDR_WD) (
`ifdef USE_POWER_PINS
inout vccd1, // User area 1 1.8V supply
inout vssd1, // User area 1 digital ground
`endif
// Clock Skew Adjust
input wire wbd_clk_int,
output wire wbd_clk_mbist,
input wire [3:0] cfg_cska_mbist, // clock skew adjust for web host
input logic rst_n,
// MBIST I/F
input wire bist_en,
input wire bist_run,
input wire bist_shift,
input wire bist_load,
input wire bist_sdi,
output wire [3:0] bist_error_cnt0,
output wire [3:0] bist_error_cnt1,
output wire [3:0] bist_error_cnt2,
output wire [3:0] bist_error_cnt3,
output wire [BIST_NO_SRAM-1:0] bist_correct ,
output wire [BIST_NO_SRAM-1:0] bist_error ,
output wire bist_done,
output wire bist_sdo,
// WB I/F
input wire wb_clk_i, // System clock
input wire wb_clk2_i, // System clock2 is no cts
input wire wb_stb_i, // strobe/request
input wire [(BIST_NO_SRAM+1)/2-1:0] wb_cs_i,
input wire [BIST_ADDR_WD-1:0] wb_adr_i, // address
input wire wb_we_i , // write
input wire [BIST_DATA_WD-1:0] wb_dat_i, // data output
input wire [BIST_DATA_WD/8-1:0] wb_sel_i, // byte enable
input wire [9:0] wb_bl_i, // burst
input wire wb_bry_i, // burst ready
output wire [BIST_DATA_WD-1:0] wb_dat_o, // data input
output wire wb_ack_o, // acknowlegement
output wire wb_lack_o, // acknowlegement
output wire wb_err_o, // error
// towards memory
// PORT-A
output wire [BIST_NO_SRAM-1:0] mem_clk_a,
output wire [BIST_ADDR_WD-1:0] mem_addr_a0,
output wire [BIST_ADDR_WD-1:0] mem_addr_a1,
output wire [BIST_ADDR_WD-1:0] mem_addr_a2,
output wire [BIST_ADDR_WD-1:0] mem_addr_a3,
output wire [BIST_NO_SRAM-1:0] mem_cen_a,
output wire [BIST_NO_SRAM-1:0] mem_web_a,
output wire [BIST_DATA_WD/8-1:0] mem_mask_a0,
output wire [BIST_DATA_WD/8-1:0] mem_mask_a1,
output wire [BIST_DATA_WD/8-1:0] mem_mask_a2,
output wire [BIST_DATA_WD/8-1:0] mem_mask_a3,
output wire [BIST_DATA_WD-1:0] mem_din_a0,
output wire [BIST_DATA_WD-1:0] mem_din_a1,
output wire [BIST_DATA_WD-1:0] mem_din_a2,
output wire [BIST_DATA_WD-1:0] mem_din_a3,
input wire [BIST_DATA_WD-1:0] mem_dout_a0,
input wire [BIST_DATA_WD-1:0] mem_dout_a1,
input wire [BIST_DATA_WD-1:0] mem_dout_a2,
input wire [BIST_DATA_WD-1:0] mem_dout_a3,
// PORT-B
output wire [BIST_NO_SRAM-1:0] mem_clk_b,
output wire [BIST_NO_SRAM-1:0] mem_cen_b,
output wire [BIST_ADDR_WD-1:0] mem_addr_b0,
output wire [BIST_ADDR_WD-1:0] mem_addr_b1,
output wire [BIST_ADDR_WD-1:0] mem_addr_b2,
output wire [BIST_ADDR_WD-1:0] mem_addr_b3
);
parameter NO_SRAM_WD = (BIST_NO_SRAM+1)/2;
parameter BIST1_ADDR_WD = 11; // 512x32 SRAM
logic mem_req; // strobe/request
logic [(BIST_NO_SRAM+1)/2-1:0] mem_cs;
logic [BIST_ADDR_WD-1:0] mem_addr; // address
logic mem_we ; // write
logic [BIST_DATA_WD-1:0] mem_wdata; // data output
logic [BIST_DATA_WD/8-1:0] mem_wmask; // byte enable
logic [BIST_DATA_WD-1:0] mem_rdata; // data input
mbist_wb #(
.BIST_NO_SRAM (4 ),
.BIST_ADDR_WD (BIST1_ADDR_WD-2 ),
.BIST_DATA_WD (BIST_DATA_WD )
)
u_wb (
`ifdef USE_POWER_PINS
.vccd1 (vccd1 ),// User area 1 1.8V supply
.vssd1 (vssd1 ),// User area 1 digital ground
`endif
.rst_n (rst_n ),
// WB I/F
.wb_clk_i (wb_clk_i ),
.wb_stb_i (wb_stb_i ),
.wb_cs_i (wb_cs_i ),
.wb_adr_i (wb_adr_i ),
.wb_we_i (wb_we_i ),
.wb_dat_i (wb_dat_i ),
.wb_sel_i (wb_sel_i ),
.wb_bl_i (wb_bl_i ),
.wb_bry_i (wb_bry_i ),
.wb_dat_o (wb_dat_o ),
.wb_ack_o (wb_ack_o ),
.wb_lack_o (wb_lack_o ),
.wb_err_o ( ),
.mem_req (mem_req ),
.mem_cs (mem_cs ),
.mem_addr (mem_addr ),
.mem_we (mem_we ),
.mem_wdata (mem_wdata ),
.mem_wmask (mem_wmask ),
.mem_rdata (mem_rdata )
);
mbist_top #(
`ifndef SYNTHESIS
.BIST_NO_SRAM (4 ),
.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_mbist (
`ifdef USE_POWER_PINS
.vccd1 (vccd1 ),// User area 1 1.8V supply
.vssd1 (vssd1 ),// User area 1 digital ground
`endif
// Clock Skew adjust
.wbd_clk_int (wbd_clk_int ),
.cfg_cska_mbist (cfg_cska_mbist ),
.wbd_clk_mbist (wbd_clk_mbist ),
// WB I/F
.wb_clk2_i (wb_clk2_i ),
.wb_clk_i (wb_clk_i ),
.mem_req (mem_req ),
.mem_cs (mem_cs ),
.mem_addr (mem_addr ),
.mem_we (mem_we ),
.mem_wdata (mem_wdata ),
.mem_wmask (mem_wmask ),
.mem_rdata (mem_rdata ),
.rst_n (rst_n ),
.bist_en (bist_en ),
.bist_run (bist_run ),
.bist_shift (bist_shift ),
.bist_load (bist_load ),
.bist_sdi (bist_sdi ),
.bist_error_cnt3 (bist_error_cnt3 ),
.bist_error_cnt2 (bist_error_cnt2 ),
.bist_error_cnt1 (bist_error_cnt1 ),
.bist_error_cnt0 (bist_error_cnt0 ),
.bist_correct (bist_correct ),
.bist_error (bist_error ),
.bist_done (bist_done ),
.bist_sdo (bist_sdo ),
// towards memory
// PORT-A
.mem_clk_a (mem_clk_a ),
.mem_addr_a0 (mem_addr_a0 ),
.mem_addr_a1 (mem_addr_a1 ),
.mem_addr_a2 (mem_addr_a2 ),
.mem_addr_a3 (mem_addr_a3 ),
.mem_cen_a (mem_cen_a ),
.mem_web_a (mem_web_a ),
.mem_mask_a0 (mem_mask_a0 ),
.mem_mask_a1 (mem_mask_a1 ),
.mem_mask_a2 (mem_mask_a2 ),
.mem_mask_a3 (mem_mask_a3 ),
.mem_din_a0 (mem_din_a0 ),
.mem_din_a1 (mem_din_a1 ),
.mem_din_a2 (mem_din_a2 ),
.mem_din_a3 (mem_din_a3 ),
.mem_dout_a0 (mem_dout_a0 ),
.mem_dout_a1 (mem_dout_a1 ),
.mem_dout_a2 (mem_dout_a2 ),
.mem_dout_a3 (mem_dout_a3 ),
// PORT-B
.mem_clk_b (mem_clk_b ),
.mem_cen_b (mem_cen_b ),
.mem_addr_b0 (mem_addr_b0 ),
.mem_addr_b1 (mem_addr_b1 ),
.mem_addr_b2 (mem_addr_b2 ),
.mem_addr_b3 (mem_addr_b3 )
);
/**
sky130_sram_2kbyte_1rw1r_32x512_8 u_sram0_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 (mem_clk_a[0]),
.csb0 (mem_cen_a[0]),
.web0 (mem_web_a[0]),
.wmask0 (mem0_mask_a),
.addr0 (mem0_addr_a),
.din0 (mem0_din_a),
.dout0 (mem0_dout_a),
// Port 1: R
.clk1 (mem_clk_b[0]),
.csb1 (mem_cen_b[0]),
.addr1 (mem0_addr_b),
.dout1 ()
);
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 (mem_clk_a[1]),
.csb0 (mem_cen_a[1]),
.web0 (mem_web_a[1]),
.wmask0 (mem1_mask_a),
.addr0 (mem1_addr_a),
.din0 (mem1_din_a),
.dout0 (mem1_dout_a),
// Port 1: R
.clk1 (mem_clk_b[1]),
.csb1 (mem_cen_b[1]),
.addr1 (mem1_addr_b),
.dout1 ()
);
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 (mem_clk_a[2]),
.csb0 (mem_cen_a[2]),
.web0 (mem_web_a[2]),
.wmask0 (mem2_mask_a),
.addr0 (mem2_addr_a),
.din0 (mem2_din_a),
.dout0 (mem2_dout_a),
// Port 1: R
.clk1 (mem_clk_b[2]),
.csb1 (mem_cen_b[2]),
.addr1 (mem2_addr_b),
.dout1 ()
);
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 (mem_clk_a[3]),
.csb0 (mem_cen_a[3]),
.web0 (mem_web_a[3]),
.wmask0 (mem3_mask_a),
.addr0 (mem3_addr_a),
.din0 (mem3_din_a),
.dout0 (mem3_dout_a),
// Port 1: R
.clk1 (mem_clk_b[3]),
.csb1 (mem_cen_b[3]),
.addr1 (mem3_addr_b),
.dout1 ()
);
***/
endmodule