validation clean-up
diff --git a/.gitmodules b/.gitmodules
index 4798126..e69de29 100644
--- a/.gitmodules
+++ b/.gitmodules
@@ -1,3 +0,0 @@
-[submodule "caravel"]
- path = caravel
- url = https://github.com/efabless/caravel-lite.git
diff --git a/README.md b/README.md
index ab6c9d4..4ecc1f7 100644
--- a/README.md
+++ b/README.md
@@ -45,7 +45,8 @@
* Open sourced under Apache-2.0 License (see LICENSE file) - unrestricted commercial use allowed.
* Mbist controller with memory repair supported
* Currently only Row Redudency is supported
- * 2KB SRAM for data memory
+ * 4 Address location memory repair reported
+ * 2KB SRAM
* Wishbone compatible design
* Written in System Verilog
* Open-source tool set
@@ -101,11 +102,21 @@
The simulation package includes the following tests:
-
+* **wb_port** - User Wishbone validation
+* **user_mbist_test1** - Standalone Mbist Controller Specific Test for Non Error/Single/Two/Three/Four/Five Location Error
# Running Simulation
+Examples:
+``` sh
+ make verify-wb_port
+ make verify-user_mbist_test1
+ make verify-wb_port SIM=RTL DUMP=OFF
+ make verify-wb_port SIM=RTL DUMP=ON
+ make verify-user_mbist_test1 SIM=RTL DUMP=OFF
+ make verify-user_mbist_test1 SIM=RTL DUMP=ON
+```
# Tool Sets
diff --git a/caravel b/caravel
deleted file mode 160000
index 0f16ba8..0000000
--- a/caravel
+++ /dev/null
@@ -1 +0,0 @@
-Subproject commit 0f16ba8eaae841a6f122fc0d5837005d3312fd2b
diff --git a/openlane/user_project_wrapper/interactive.tcl b/openlane/user_project_wrapper/interactive.tcl
index 44d3f22..895c6ea 100644
--- a/openlane/user_project_wrapper/interactive.tcl
+++ b/openlane/user_project_wrapper/interactive.tcl
@@ -23,7 +23,7 @@
# set pdndef_dirname [file dirname $::env(pdn_tmp_file_tag).def]
# set pdndef [lindex [glob $pdndef_dirname/*pdn*] 0]
# set_def $pdndef
- puts "\[INFO\]:Dinesh-A: Running Placement Step"
+ puts "\[INFO\]: Running Placement Step"
if { ! [ info exists ::env(PLACEMENT_CURRENT_DEF) ] } {
set ::env(PLACEMENT_CURRENT_DEF) $::env(CURRENT_DEF)
} else {
@@ -35,7 +35,7 @@
proc run_cts_step {args} {
# set_def $::env(opendp_result_file_tag).def
- puts "\[INFO\]:Dinesh-A: Running CTS"
+ puts "\[INFO\]: Running CTS"
if { ! [ info exists ::env(CTS_CURRENT_DEF) ] } {
set ::env(CTS_CURRENT_DEF) $::env(CURRENT_DEF)
} else {
@@ -50,7 +50,7 @@
# set resizerdef_dirname [file dirname $::env(resizer_tmp_file_tag)_timing.def]
# set resizerdef [lindex [glob $resizerdef_dirname/*resizer*] 0]
# set_def $resizerdef
- puts "\[INFO\]:Dinesh-A: Running Routing"
+ puts "\[INFO\]: Running Routing"
if { ! [ info exists ::env(ROUTING_CURRENT_DEF) ] } {
set ::env(ROUTING_CURRENT_DEF) $::env(CURRENT_DEF)
} else {
@@ -60,7 +60,7 @@
}
proc run_diode_insertion_2_5_step {args} {
- puts "\[INFO\]:Dinesh-A: Running Diode Insertion"
+ puts "\[INFO\]: Running Diode Insertion"
# set_def $::env(tritonRoute_result_file_tag).def
if { ! [ info exists ::env(DIODE_INSERTION_CURRENT_DEF) ] } {
set ::env(DIODE_INSERTION_CURRENT_DEF) $::env(CURRENT_DEF)
@@ -75,7 +75,7 @@
}
proc run_power_pins_insertion_step {args} {
- puts "\[INFO\]:Dinesh-A: Running Power Pin Insertion"
+ puts "\[INFO\]:Running Power Pin Insertion"
# set_def $::env(tritonRoute_result_file_tag).def
if { ! [ info exists ::env(POWER_PINS_INSERTION_CURRENT_DEF) ] } {
set ::env(POWER_PINS_INSERTION_CURRENT_DEF) $::env(CURRENT_DEF)
@@ -91,7 +91,7 @@
proc run_lvs_step {{ lvs_enabled 1 }} {
# set_def $::env(tritonRoute_result_file_tag).def
- puts "\[INFO\]:Dinesh-A: Running LVS Step"
+ puts "\[INFO\]:Running LVS Step"
if { ! [ info exists ::env(LVS_CURRENT_DEF) ] } {
set ::env(LVS_CURRENT_DEF) $::env(CURRENT_DEF)
} else {
@@ -105,7 +105,7 @@
}
proc run_drc_step {{ drc_enabled 1 }} {
- puts "\[INFO\]:Dinesh-A: Running DRC"
+ puts "\[INFO\]:Running DRC"
if { ! [ info exists ::env(DRC_CURRENT_DEF) ] } {
set ::env(DRC_CURRENT_DEF) $::env(CURRENT_DEF)
} else {
@@ -118,7 +118,7 @@
}
proc run_antenna_check_step {{ antenna_check_enabled 1 }} {
- puts "\[INFO\]:Dinesh-A: Running Antenna checl"
+ puts "\[INFO\]: Running Antenna checl"
if { ! [ info exists ::env(ANTENNA_CHECK_CURRENT_DEF) ] } {
set ::env(ANTENNA_CHECK_CURRENT_DEF) $::env(CURRENT_DEF)
} else {
@@ -220,7 +220,7 @@
foreach vdd $::env(VDD_NETS) gnd $::env(GND_NETS) {
set ::env(VDD_NET) $vdd
set ::env(GND_NET) $gnd
- puts "\[INFO\]:Dinesh-A: Processing Power Nets: $vdd and $gnd."
+ puts "\[INFO\]: Processing Power Nets: $vdd and $gnd."
# internal macros power connections
set ::env(FP_PDN_MACROS) ""
@@ -239,7 +239,7 @@
}
}
}
- puts "\[INFO\]:Dinesh-A: FP_PDN_MACROS: $::env(FP_PDN_MACROS) ."
+ puts "\[INFO\]: FP_PDN_MACROS: $::env(FP_PDN_MACROS) ."
} else {
puts_warn "All internal macros will not be connected to power."
}
diff --git a/verilog/dv/user_mbist_test1/user_mbist_test1_tb.v b/verilog/dv/user_mbist_test1/user_mbist_test1_tb.v
index 53183ae..703de4b 100644
--- a/verilog/dv/user_mbist_test1/user_mbist_test1_tb.v
+++ b/verilog/dv/user_mbist_test1/user_mbist_test1_tb.v
@@ -92,7 +92,7 @@
`ifdef WFDUMP
initial begin
$dumpfile("simx.vcd");
- $dumpvars(4, user_mbist_test1_tb);
+ $dumpvars(5, user_mbist_test1_tb);
$dumpoff;
end
`endif
@@ -129,7 +129,7 @@
$display("###################################################");
$display(" MBIST Test with Single Address Failure");
$display("###################################################");
-
+ $dumpon;
// Check Is there is any BIST Error
// [0] - Bist Done - 1
// [1] - Bist Error - 0
@@ -149,7 +149,6 @@
$display("###################################################");
$display(" MBIST Test with Two Address Failure");
$display("###################################################");
-
// Check Is there is any BIST Error
// [0] - Bist Done - 1
// [1] - Bist Error - 0
@@ -185,6 +184,7 @@
end else begin
$display("Monitor: Step-4: BIST Test with Three Memory Error insertion test Failed");
end
+ $dumpoff;
$display("###################################################");
$display(" MBIST Test with Fours Address Failure");
$display("###################################################");
@@ -438,6 +438,19 @@
end
join_any
disable fork; //disable pending fork activity
+
+ if(num_fault == 1)
+ wb_user_core_read_check('h3080_0014,read_data,{16'h0,7'h0,faultaddr[0]},32'h0000_FFFF);
+ if(num_fault == 2)
+ wb_user_core_read_check('h3080_0014,read_data,{7'h0,faultaddr[1],7'h0,faultaddr[0]},32'hFFFF_FFFF);
+ if(num_fault == 3) begin
+ wb_user_core_read_check('h3080_0014,read_data,{7'h0,faultaddr[1],7'h0,faultaddr[0]},32'hFFFF_FFFF);
+ wb_user_core_read_check('h3080_0014,read_data,{16'h0,7'h0,faultaddr[2]},32'h0000_FFFF);
+ end
+ if(num_fault >= 4) begin
+ wb_user_core_read_check('h3080_0014,read_data,{7'h0,faultaddr[1],7'h0,faultaddr[0]},32'hFFFF_FFFF);
+ wb_user_core_read_check('h3080_0014,read_data,{7'h0,faultaddr[3],7'h0,faultaddr[2]},32'hFFFF_FFFF);
+ end
end
endtask
@@ -482,6 +495,7 @@
wbd_ext_cyc_i ='h1; // strobe/request
wbd_ext_stb_i ='h1; // strobe/request
wait(wbd_ext_ack_o == 1);
+ #1;
data = wbd_ext_dat_o;
repeat (1) @(posedge clock);
#1;
@@ -512,6 +526,7 @@
wbd_ext_cyc_i ='h1; // strobe/request
wbd_ext_stb_i ='h1; // strobe/request
wait(wbd_ext_ack_o == 1);
+ #1;
data = wbd_ext_dat_o;
repeat (1) @(posedge clock);
#1;
diff --git a/verilog/rtl/lib/ser_inf_32b.sv b/verilog/rtl/lib/ser_inf_32b.sv
new file mode 100644
index 0000000..8228852
--- /dev/null
+++ b/verilog/rtl/lib/ser_inf_32b.sv
@@ -0,0 +1,121 @@
+//////////////////////////////////////////////////////////////////////////////
+// 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>
+//
+//////////////////////////////////////////////////////////////////////
+//////////////////////////////////////////////////////////////////////
+//// ////
+//// ser_inf_32 ////
+//// ////
+//// This file is part of the mbist_ctrl cores project ////
+//// https://github.com/dineshannayya/mbist_ctrl.git ////
+//// ////
+//// Description ////
+//// This block manages the serial to Parallel conversion ////
+//// This block usefull for Bist SDI/SDO access ////
+//// Function: ////
+//// 1. When reg_wr=1, this block set shift=1 and shift ////
+//// reg_wdata serial through sdi for 32 cycles and ////
+//// asserts Reg Ack ////
+//// 2. When reg_rd=1, this block set shoft=1 and serial ////
+//// capture the sdo to reg_rdata for 32 cycles and ////
+//// asserts Reg Ack ////
+//// ////
+//// To Do: ////
+//// nothing ////
+//// ////
+//// Author(s): ////
+//// - Dinesh Annayya, dinesha@opencores.org ////
+//// ////
+//// Revision : ////
+//// 0.0 - 20th Oct 2021, Dinesh A ////
+//// Initial integration ////
+//// ////
+//////////////////////////////////////////////////////////////////////
+
+module ser_inf_32b
+ (
+
+ // Master Port
+ input logic rst_n , // Regular Reset signal
+ input logic clk , // System clock
+ input logic reg_wr , // Write Request
+ input logic reg_rd , // Read Request
+ input logic [31:0] reg_wdata , // data output
+ output logic [31:0] reg_rdata , // data input
+ output logic reg_ack , // acknowlegement
+
+ // Slave Port
+ output logic sdi , // Serial SDI
+ output logic shift , // Shift Signal
+ input logic sdo // Serial SDO
+
+ );
+
+
+ parameter IDLE = 1'b0;
+ parameter SHIFT_DATA = 1'b1;
+
+ logic state;
+ logic [5:0] bit_cnt;
+ logic [31:0] shift_data;
+
+
+always@(negedge rst_n or posedge clk)
+begin
+ if(rst_n == 0) begin
+ state <= IDLE;
+ reg_rdata <= 'h0;
+ reg_ack <= 1'b0;
+ sdi <= 1'b0;
+ bit_cnt <= 6'h0;
+ shift <= 'b0;
+ shift_data <= 32'h0;
+ end else begin
+ case(state)
+ IDLE: begin
+ reg_ack <= 1'b0;
+ bit_cnt <= 6'h0;
+ if(reg_wr) begin
+ shift <= 'b1;
+ shift_data <= reg_wdata;
+ state <= SHIFT_DATA;
+ end else if(reg_rd) begin
+ shift <= 'b1;
+ shift_data <= 'h0;
+ state <= SHIFT_DATA;
+ end
+ end
+ SHIFT_DATA: begin
+ shift_data <= {1'b0,shift_data[31:1]};
+ reg_rdata <= {sdo,reg_rdata[31:1]};
+ sdi <= shift_data[0];
+ if(bit_cnt < 31) begin
+ bit_cnt <= bit_cnt +1;
+ end else begin
+ reg_ack <= 1'b1;
+ shift <= 'b0;
+ state <= IDLE;
+ end
+ end
+ endcase
+ end
+end
+
+
+
+
+endmodule
diff --git a/verilog/rtl/mbist/src/mbist_mux.sv b/verilog/rtl/mbist/src/mbist_mux.sv
index cd2ebe2..23edd6c 100755
--- a/verilog/rtl/mbist/src/mbist_mux.sv
+++ b/verilog/rtl/mbist/src/mbist_mux.sv
@@ -58,6 +58,9 @@
input logic bist_error,
input logic [BIST_ADDR_WD-1:0] bist_error_addr,
output logic bist_correct,
+ input logic bist_sdi,
+ input logic bist_shift,
+ output logic bist_sdo,
// FUNCTIONAL CTRL SIGNAL
input logic func_clk_a,
@@ -117,23 +120,29 @@
mbist_repair_addr u_repair_A(
.AddressOut (mem_addr_a ),
.Correct (bist_correct ),
+ .sdo (bist_sdo ),
.AddressIn (addr_a ),
.clk (mem_clk_a ),
.rst_n (rst_n ),
.Error (bist_error ),
- .ErrorAddr (bist_error_addr )
+ .ErrorAddr (bist_error_addr ),
+ .scan_shift (bist_shift ),
+ .sdi (bist_sdi )
);
mbist_repair_addr u_repair_B(
.AddressOut (mem_addr_b ),
.Correct ( ), // Both Bist Correct are same
+ .sdo ( ),
.AddressIn (addr_b ),
.clk (mem_clk_b ),
.rst_n (rst_n ),
.Error (bist_error ),
- .ErrorAddr (bist_error_addr )
+ .ErrorAddr (bist_error_addr ),
+ .scan_shift (1'b0 ), // Both Repair hold same address
+ .sdi (1'b0 )
);
diff --git a/verilog/rtl/mbist/src/mbist_repair_addr.sv b/verilog/rtl/mbist/src/mbist_repair_addr.sv
index f6508ac..8aea358 100644
--- a/verilog/rtl/mbist/src/mbist_repair_addr.sv
+++ b/verilog/rtl/mbist/src/mbist_repair_addr.sv
@@ -53,17 +53,25 @@
output logic [BIST_RAD_WD_O-1:0] AddressOut,
output logic Correct,
+ output logic sdo, // scan data output
input logic [BIST_RAD_WD_I-1:0] AddressIn,
input logic clk,
input logic rst_n,
input logic Error,
- input logic [BIST_RAD_WD_I-1:0] ErrorAddr
+ input logic [BIST_RAD_WD_I-1:0] ErrorAddr,
+ input logic scan_shift, // shift scan input
+ input logic sdi // scan data input
);
logic [3:0] ErrorCnt; // Assumed Maximum Error correction is less than 16
+logic [15:0] shift_reg;
+logic [15:0] shift_load;
+logic [7:0] shift_cnt;
+logic scan_shift_d;
+logic shift_pos_edge;
logic [BIST_RAD_WD_I-1:0] RepairMem [0:BIST_ERR_LIMIT-1];
@@ -95,8 +103,42 @@
end
end
+/********************************************
+* Serial shifting the Repair address
+* *******************************************/
+always@(posedge clk or negedge rst_n)
+begin
+ if(!rst_n) begin
+ shift_reg <= '0;
+ shift_cnt <= '0;
+ scan_shift_d <= 1'b0;
+ end begin
+ if(scan_shift && (shift_cnt[7:4] < BIST_ERR_LIMIT)) begin
+ shift_cnt <= shift_cnt+1;
+ end
+ scan_shift_d <= scan_shift;
+ shift_reg <= shift_load;
+ end
+end
+// Detect scan_shift pos edge
+assign shift_pos_edge = (scan_shift_d ==0) && (scan_shift);
+
+always_comb
+begin
+ shift_load = shift_reg;
+ // Block the data reloading every pos edge of shift
+ if(scan_shift && ((shift_cnt[7:4]+1) < BIST_ERR_LIMIT) && (shift_cnt[3:0] == 4'b1111))
+ shift_load = {RepairMem[shift_cnt[7:4]+1]};
+ else if(scan_shift)
+ shift_load = {sdi,shift_reg[15:1]};
+ else
+ shift_load = {RepairMem[shift_cnt[7:4]]};
+
+end
+
+assign sdo = shift_reg[0];
endmodule
diff --git a/verilog/rtl/mbist/src/mbist_top.sv b/verilog/rtl/mbist/src/mbist_top.sv
index 71470cc..fbb46bd 100644
--- a/verilog/rtl/mbist/src/mbist_top.sv
+++ b/verilog/rtl/mbist/src/mbist_top.sv
@@ -34,7 +34,10 @@
//// ////
//// Revision : ////
//// 0.0 - 11th Oct 2021, Dinesh A ////
-//// Initial integration
+//// Initial integration ////
+//// 0.1 - 26th Oct 2021, Dinesh A ////
+//// Fixed Error Address are serial shifted through ////
+//// sdi/sdo ////
//// ////
//////////////////////////////////////////////////////////////////////
@@ -120,7 +123,7 @@
//---------------------------------
// SDI => SDO diasy chain
-// bist_sdi => bist_addr_sdo => bist_sti_sdo => bist_op_sdo => bist_sdo
+// bist_sdi => bist_addr_sdo => bist_sti_sdo => bist_op_sdo => bist_pat_sdo => bist_sdo
// ---------------------------------
logic bist_addr_sdo ;
logic bist_sti_sdo ;
@@ -285,11 +288,11 @@
u_pat_sel (
.pat_last (last_pat ),
.pat_data (pat_data ),
- .sdo (bist_sdo ),
+ .sdo (bist_pat_sdo ),
.clk (bist_clk ),
.rst_n (srst_n ),
.run (run_pat ),
- .scan_shift (scan_shift ),
+ .scan_shift (bist_shift ),
.sdi (bist_op_sdo )
);
@@ -348,6 +351,9 @@
.bist_error (bist_error_correct),
.bist_error_addr (bist_error_addr),
.bist_correct (bist_correct ),
+ .bist_sdi (bist_pat_sdo),
+ .bist_shift (bist_shift),
+ .bist_sdo (bist_sdo),
// FUNCTIONAL CTRL SIGNAL
.func_clk_a (func_clk_a ),
diff --git a/verilog/rtl/uprj_netlists.v b/verilog/rtl/uprj_netlists.v
index 6c317e9..6ab16ab 100644
--- a/verilog/rtl/uprj_netlists.v
+++ b/verilog/rtl/uprj_netlists.v
@@ -16,6 +16,7 @@
// Include caravel global defines for the number of the user project IO pads
`include "defines.v"
`define USE_POWER_PINS
+`define UNIT_DELAY #0.1
`ifdef GL
// Assume default net type to be wire because GL netlists don't have the wire definitions
@@ -47,6 +48,7 @@
`include "lib/registers.v"
`include "lib/clk_ctl.v"
`include "lib/reset_sync.sv"
+ `include "lib/ser_inf_32b.sv"
`include "sram_macros/sky130_sram_2kbyte_1rw1r_32x512_8.v"
diff --git a/verilog/rtl/wb_host/src/wb_host.sv b/verilog/rtl/wb_host/src/wb_host.sv
index a8f081a..94dd3fa 100644
--- a/verilog/rtl/wb_host/src/wb_host.sv
+++ b/verilog/rtl/wb_host/src/wb_host.sv
@@ -136,7 +136,7 @@
logic wbm_err_int; // error
logic reg_sel ;
-logic [1:0] sw_addr ;
+logic [2:0] sw_addr ;
logic sw_rd_en ;
logic sw_wr_en ;
logic [31:0] reg_rdata ;
@@ -146,6 +146,8 @@
logic sw_wr_en_1;
logic sw_wr_en_2;
logic sw_wr_en_3;
+logic sw_wr_en_4;
+logic sw_rd_en_5;
logic [7:0] cfg_bank_sel;
logic [31:0] wbm_adr_int;
logic wbm_stb_int;
@@ -170,6 +172,10 @@
logic [31:0] cfg_bist_ctrl ;
logic [31:0] cfg_bist_status ;
+logic ser_acc ; // Serial Access
+logic non_ser_acc ; // Non Serial Access
+logic [31:0] serail_dout ;
+logic serial_ack ;
assign io_out = 'h0;
assign io_oeb = 'h0;
@@ -186,14 +192,21 @@
// To reduce the load/Timing Wishbone I/F, Strobe is register to create
// multi-cycle
logic wb_req;
+logic wb_req_d;
+logic wb_req_pedge;
always_ff @(negedge wbm_rst_n or posedge wbm_clk_i) begin
if ( wbm_rst_n == 1'b0 ) begin
- wb_req <= '0;
+ wb_req <= '0;
+ wb_req_d <= '0;
end else begin
wb_req <= wbm_stb_i && (wbm_ack_o == 0) ;
+ wb_req_d <= wb_req;
end
end
+// Detect pos edge of request
+assign wb_req_pedge = (wb_req_d ==0) && (wb_req==1'b1);
+
assign wbm_dat_o = (reg_sel) ? reg_rdata : wbm_dat_int; // data input
assign wbm_ack_o = (reg_sel) ? reg_ack : wbm_ack_int; // acknowlegement
assign wbm_err_o = (reg_sel) ? 1'b0 : wbm_err_int; // error
@@ -211,31 +224,33 @@
// ---------------------------------------------------------------------
assign reg_sel = wb_req & (wbm_adr_i[23] == 1'b1);
-assign sw_addr = wbm_adr_i [3:2];
+assign sw_addr = wbm_adr_i [4:2];
assign sw_rd_en = reg_sel & !wbm_we_i;
assign sw_wr_en = reg_sel & wbm_we_i;
-assign sw_wr_en_0 = sw_wr_en && (sw_addr==0);
-assign sw_wr_en_1 = sw_wr_en && (sw_addr==1);
-assign sw_wr_en_2 = sw_wr_en && (sw_addr==2);
-assign sw_wr_en_3 = sw_wr_en && (sw_addr==3);
+assign sw_wr_en_0 = sw_wr_en && (sw_addr=='h0);
+assign sw_wr_en_1 = sw_wr_en && (sw_addr=='h1);
+assign sw_wr_en_2 = sw_wr_en && (sw_addr=='h2);
+assign sw_wr_en_3 = sw_wr_en && (sw_addr=='h3);
+assign sw_wr_en_4 = sw_wr_en && (sw_addr=='h4);
+assign sw_rd_en_5 = sw_rd_en && (sw_addr=='h5);
+
+
+assign ser_acc = sw_wr_en_4 | sw_rd_en_5;
+assign non_ser_acc = reg_sel ? !ser_acc : 1'b0;
always @ (posedge wbm_clk_i or negedge wbm_rst_n)
begin : preg_out_Seq
- if (wbm_rst_n == 1'b0)
- begin
+ if (wbm_rst_n == 1'b0) begin
reg_rdata <= 'h0;
reg_ack <= 1'b0;
- end
- else if (sw_rd_en && !reg_ack)
- begin
+ end else if (ser_acc && serial_ack) begin
+ reg_rdata <= serail_dout ;
+ reg_ack <= 1'b1;
+ end else if (non_ser_acc && !reg_ack) begin
reg_rdata <= reg_out ;
reg_ack <= 1'b1;
- end
- else if (sw_wr_en && !reg_ack)
- reg_ack <= 1'b1;
- else
- begin
+ end else begin
reg_ack <= 1'b0;
end
end
@@ -253,23 +268,24 @@
// BIST Control
assign bist_en = cfg_bist_ctrl[0];
assign bist_run = cfg_bist_ctrl[1];
-assign bist_shift = cfg_bist_ctrl[2];
-assign bist_load = cfg_bist_ctrl[3];
-assign bist_sdi = cfg_bist_ctrl[4];
+assign bist_load = cfg_bist_ctrl[2];
// BIST Status
-assign cfg_bist_status = {24'h0,bist_sdo,bist_error_cnt,bist_correct,bist_error,bist_done};
+assign cfg_bist_status = {25'h0,bist_error_cnt,bist_correct,bist_error,bist_done};
always @( *)
begin
reg_out [31:0] = 8'd0;
- case (sw_addr [1:0])
- 2'b00 : reg_out [31:0] = reg_0;
- 2'b01 : reg_out [31:0] = reg_1;
- 2'b10 : reg_out [31:0] = cfg_bist_ctrl [31:0];
- 2'b11 : reg_out [31:0] = cfg_bist_status [31:0];
+ case (sw_addr [2:0])
+ 3'b000 : reg_out [31:0] = reg_0;
+ 3'b001 : reg_out [31:0] = reg_1;
+ 3'b010 : reg_out [31:0] = cfg_bist_ctrl [31:0];
+ 3'b011 : reg_out [31:0] = cfg_bist_status [31:0];
+ 3'b100 : reg_out [31:0] = 'h0; // Serial Write Data
+ 3'b101 : reg_out [31:0] = serail_dout; // This is with Shift
+ 3'b110 : reg_out [31:0] = serail_dout; // This is previous Shift
default : reg_out [31:0] = 'h0;
endcase
end
@@ -309,6 +325,31 @@
+
+ser_inf_32b u_ser_intf
+ (
+
+ // Master Port
+ .rst_n (wbm_rst_n), // Regular Reset signal
+ .clk (wbm_clk_i), // System clock
+ .reg_wr (sw_wr_en_4 & wb_req_pedge), // Write Request
+ .reg_rd (sw_rd_en_5 & wb_req_pedge), // Read Request
+ .reg_wdata (wbm_dat_i) , // data output
+ .reg_rdata (serail_dout), // data input
+ .reg_ack (serial_ack), // acknowlegement
+
+ // Slave Port
+ .sdi (bist_sdi), // Serial SDI
+ .shift (bist_shift), // Shift Signal
+ .sdo (bist_sdo) // Serial SDO
+
+ );
+
+
+//--------------------------------------------------
+// Wishbone Master to Wishbone Slave
+// -------------------------------------------------
+
assign wbm_stb_int = wb_req & !reg_sel;
// Since design need more than 16MB address space, we have implemented