[6] | 1 | // ========== Copyright Header Begin ========================================== |
---|
| 2 | // |
---|
| 3 | // OpenSPARC T1 Processor File: bw_r_icd.v |
---|
| 4 | // Copyright (c) 2006 Sun Microsystems, Inc. All Rights Reserved. |
---|
| 5 | // DO NOT ALTER OR REMOVE COPYRIGHT NOTICES. |
---|
| 6 | // |
---|
| 7 | // The above named program is free software; you can redistribute it and/or |
---|
| 8 | // modify it under the terms of the GNU General Public |
---|
| 9 | // License version 2 as published by the Free Software Foundation. |
---|
| 10 | // |
---|
| 11 | // The above named program is distributed in the hope that it will be |
---|
| 12 | // useful, but WITHOUT ANY WARRANTY; without even the implied warranty of |
---|
| 13 | // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
---|
| 14 | // General Public License for more details. |
---|
| 15 | // |
---|
| 16 | // You should have received a copy of the GNU General Public |
---|
| 17 | // License along with this work; if not, write to the Free Software |
---|
| 18 | // Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. |
---|
| 19 | // |
---|
| 20 | // ========== Copyright Header End ============================================ |
---|
| 21 | //////////////////////////////////////////////////////////////////////// |
---|
| 22 | /* |
---|
| 23 | // Module Name: bw_r_icd |
---|
| 24 | // Description: |
---|
| 25 | // The ICD contains the icache data. |
---|
| 26 | // 32B line size. |
---|
| 27 | // Write BW: 16B |
---|
| 28 | // Read BW: 16Bx2 (fetdata and topdata), collapsed to 4Bx2 |
---|
| 29 | // Associativity: 4 |
---|
| 30 | // Write boundary: 34b (32b inst + parity + predec bit) |
---|
| 31 | // NOTES: |
---|
| 32 | // 1. No clock enable. Rd/Wr enable is used to trigger the |
---|
| 33 | // operation. |
---|
| 34 | // 2. 2:1 mux on address input. Selects provided externally. |
---|
| 35 | // 3. 3:1 mux on data input. Selects provided and guaranteed |
---|
| 36 | // exclusive, externally. |
---|
| 37 | // |
---|
| 38 | */ |
---|
| 39 | |
---|
| 40 | |
---|
| 41 | //////////////////////////////////////////////////////////////////////// |
---|
| 42 | // Global header file includes |
---|
| 43 | //////////////////////////////////////////////////////////////////////// |
---|
| 44 | //`include "sys.h" // system level definition file which contains the |
---|
| 45 | // time scale definition |
---|
| 46 | |
---|
| 47 | |
---|
| 48 | //////////////////////////////////////////////////////////////////////// |
---|
| 49 | // Local header file includes / local defines |
---|
| 50 | //////////////////////////////////////////////////////////////////////// |
---|
| 51 | |
---|
| 52 | `include "ifu.h" |
---|
| 53 | |
---|
| 54 | //FPGA_SYN enables all FPGA related modifications |
---|
| 55 | `ifdef FPGA_SYN |
---|
| 56 | `define FPGA_SYN_ICD |
---|
| 57 | `endif |
---|
| 58 | |
---|
| 59 | `ifdef FPGA_SYN_ICD |
---|
| 60 | |
---|
| 61 | module bw_r_icd(icd_wsel_fetdata_s1, icd_wsel_topdata_s1, icd_fuse_repair_value, |
---|
| 62 | icd_fuse_repair_en, so, rclk, se, si, reset_l, sehold, fdp_icd_index_bf, |
---|
| 63 | ifq_icd_index_bf, fcl_icd_index_sel_ifq_bf, ifq_icd_wrway_bf, |
---|
| 64 | ifq_icd_worden_bf, ifq_icd_wrdata_i2, fcl_icd_rdreq_bf, |
---|
| 65 | fcl_icd_wrreq_bf, bist_ic_data, rst_tri_en, ifq_icd_data_sel_old_i2, |
---|
| 66 | ifq_icd_data_sel_fill_i2, ifq_icd_data_sel_bist_i2, fuse_icd_wren, |
---|
| 67 | fuse_icd_rid, fuse_icd_repair_value, fuse_icd_repair_en, |
---|
| 68 | efc_spc_fuse_clk1); |
---|
| 69 | |
---|
| 70 | input rclk; |
---|
| 71 | input se; |
---|
| 72 | input si; |
---|
| 73 | input reset_l; |
---|
| 74 | input sehold; |
---|
| 75 | input [11:2] fdp_icd_index_bf; |
---|
| 76 | input [11:2] ifq_icd_index_bf; |
---|
| 77 | input fcl_icd_index_sel_ifq_bf; |
---|
| 78 | input [1:0] ifq_icd_wrway_bf; |
---|
| 79 | input [3:0] ifq_icd_worden_bf; |
---|
| 80 | input [135:0] ifq_icd_wrdata_i2; |
---|
| 81 | input fcl_icd_rdreq_bf; |
---|
| 82 | input fcl_icd_wrreq_bf; |
---|
| 83 | input [7:0] bist_ic_data; |
---|
| 84 | input rst_tri_en; |
---|
| 85 | input ifq_icd_data_sel_old_i2; |
---|
| 86 | input ifq_icd_data_sel_fill_i2; |
---|
| 87 | input ifq_icd_data_sel_bist_i2; |
---|
| 88 | input fuse_icd_wren; |
---|
| 89 | input [3:0] fuse_icd_rid; |
---|
| 90 | input [7:0] fuse_icd_repair_value; |
---|
| 91 | input [1:0] fuse_icd_repair_en; |
---|
| 92 | input efc_spc_fuse_clk1; |
---|
| 93 | output [135:0] icd_wsel_fetdata_s1; |
---|
| 94 | output [135:0] icd_wsel_topdata_s1; |
---|
| 95 | output [7:0] icd_fuse_repair_value; |
---|
| 96 | output [1:0] icd_fuse_repair_en; |
---|
| 97 | output so; |
---|
| 98 | |
---|
| 99 | reg [7:0] icd_fuse_repair_value; |
---|
| 100 | reg [1:0] icd_fuse_repair_en; |
---|
| 101 | reg [135:0] fetdata_f; |
---|
| 102 | reg [135:0] topdata_f; |
---|
| 103 | reg [135:0] fetdata_sa; |
---|
| 104 | reg [135:0] topdata_sa; |
---|
| 105 | reg [135:0] fetdata_s1; |
---|
| 106 | reg [135:0] topdata_s1; |
---|
| 107 | wire clk; |
---|
| 108 | wire [135:0] next_wrdata_bf; |
---|
| 109 | wire [135:0] wrdata_f; |
---|
| 110 | wire [135:0] bist_data_expand; |
---|
| 111 | `ifdef FPGA_SYN_ALTERA |
---|
| 112 | reg [11:2] index_bf; |
---|
| 113 | `else |
---|
| 114 | wire [11:2] index_bf; |
---|
| 115 | `endif |
---|
| 116 | reg [11:2] index_f; |
---|
| 117 | reg [11:0] wr_index0; |
---|
| 118 | reg [11:0] wr_index1; |
---|
| 119 | reg [11:0] wr_index2; |
---|
| 120 | reg [11:0] wr_index3; |
---|
| 121 | reg rdreq_f; |
---|
| 122 | reg wrreq_f; |
---|
| 123 | reg [3:0] worden_f; |
---|
| 124 | reg [1:0] wrway_f; |
---|
| 125 | `ifdef FPGA_SYN_ALTERA |
---|
| 126 | |
---|
| 127 | reg [33:0] icdata_ary_00_00 [255:0] /* synthesis syn_ramstyle = block_ram */ ;/* syn_ramstyle = no_rw_check */ |
---|
| 128 | reg [33:0] icdata_ary_00_01 [255:0] /* synthesis syn_ramstyle = block_ram */ ;/* syn_ramstyle = no_rw_check */ |
---|
| 129 | reg [33:0] icdata_ary_00_10 [255:0] /* synthesis syn_ramstyle = block_ram */ ;/* syn_ramstyle = no_rw_check */ |
---|
| 130 | reg [33:0] icdata_ary_00_11 [255:0] /* synthesis syn_ramstyle = block_ram */ ;/* syn_ramstyle = no_rw_check */ |
---|
| 131 | reg [33:0] icdata_ary_01_00 [255:0] /* synthesis syn_ramstyle = block_ram */ ;/* syn_ramstyle = no_rw_check */ |
---|
| 132 | reg [33:0] icdata_ary_01_01 [255:0] /* synthesis syn_ramstyle = block_ram */ ;/* syn_ramstyle = no_rw_check */ |
---|
| 133 | reg [33:0] icdata_ary_01_10 [255:0] /* synthesis syn_ramstyle = block_ram */ ;/* syn_ramstyle = no_rw_check */ |
---|
| 134 | reg [33:0] icdata_ary_01_11 [255:0] /* synthesis syn_ramstyle = block_ram */ ;/* syn_ramstyle = no_rw_check */ |
---|
| 135 | reg [33:0] icdata_ary_10_00 [255:0] /* synthesis syn_ramstyle = block_ram */ ;/* syn_ramstyle = no_rw_check */ |
---|
| 136 | reg [33:0] icdata_ary_10_01 [255:0] /* synthesis syn_ramstyle = block_ram */ ;/* syn_ramstyle = no_rw_check */ |
---|
| 137 | reg [33:0] icdata_ary_10_10 [255:0] /* synthesis syn_ramstyle = block_ram */ ;/* syn_ramstyle = no_rw_check */ |
---|
| 138 | reg [33:0] icdata_ary_10_11 [255:0] /* synthesis syn_ramstyle = block_ram */ ;/* syn_ramstyle = no_rw_check */ |
---|
| 139 | reg [33:0] icdata_ary_11_00 [255:0] /* synthesis syn_ramstyle = block_ram */ ;/* syn_ramstyle = no_rw_check */ |
---|
| 140 | reg [33:0] icdata_ary_11_01 [255:0] /* synthesis syn_ramstyle = block_ram */ ;/* syn_ramstyle = no_rw_check */ |
---|
| 141 | reg [33:0] icdata_ary_11_10 [255:0] /* synthesis syn_ramstyle = block_ram */ ;/* syn_ramstyle = no_rw_check */ |
---|
| 142 | reg [33:0] icdata_ary_11_11 [255:0] /* synthesis syn_ramstyle = block_ram */ ;/* syn_ramstyle = no_rw_check */ |
---|
| 143 | `else |
---|
| 144 | reg [33:0] icdata_ary_00_00 [255:0] /* synthesis syn_ramstyle = block_ram syn_ramstyle = no_rw_check */ ; |
---|
| 145 | reg [33:0] icdata_ary_00_01 [255:0] /* synthesis syn_ramstyle = block_ram syn_ramstyle = no_rw_check */ ; |
---|
| 146 | reg [33:0] icdata_ary_00_10 [255:0] /* synthesis syn_ramstyle = block_ram syn_ramstyle = no_rw_check */ ; |
---|
| 147 | reg [33:0] icdata_ary_00_11 [255:0] /* synthesis syn_ramstyle = block_ram syn_ramstyle = no_rw_check */ ; |
---|
| 148 | reg [33:0] icdata_ary_01_00 [255:0] /* synthesis syn_ramstyle = block_ram syn_ramstyle = no_rw_check */ ; |
---|
| 149 | reg [33:0] icdata_ary_01_01 [255:0] /* synthesis syn_ramstyle = block_ram syn_ramstyle = no_rw_check */ ; |
---|
| 150 | reg [33:0] icdata_ary_01_10 [255:0] /* synthesis syn_ramstyle = block_ram syn_ramstyle = no_rw_check */ ; |
---|
| 151 | reg [33:0] icdata_ary_01_11 [255:0] /* synthesis syn_ramstyle = block_ram syn_ramstyle = no_rw_check */ ; |
---|
| 152 | reg [33:0] icdata_ary_10_00 [255:0] /* synthesis syn_ramstyle = block_ram syn_ramstyle = no_rw_check */ ; |
---|
| 153 | reg [33:0] icdata_ary_10_01 [255:0] /* synthesis syn_ramstyle = block_ram syn_ramstyle = no_rw_check */ ; |
---|
| 154 | reg [33:0] icdata_ary_10_10 [255:0] /* synthesis syn_ramstyle = block_ram syn_ramstyle = no_rw_check */ ; |
---|
| 155 | reg [33:0] icdata_ary_10_11 [255:0] /* synthesis syn_ramstyle = block_ram syn_ramstyle = no_rw_check */ ; |
---|
| 156 | reg [33:0] icdata_ary_11_00 [255:0] /* synthesis syn_ramstyle = block_ram syn_ramstyle = no_rw_check */ ; |
---|
| 157 | reg [33:0] icdata_ary_11_01 [255:0] /* synthesis syn_ramstyle = block_ram syn_ramstyle = no_rw_check */ ; |
---|
| 158 | reg [33:0] icdata_ary_11_10 [255:0] /* synthesis syn_ramstyle = block_ram syn_ramstyle = no_rw_check */ ; |
---|
| 159 | reg [33:0] icdata_ary_11_11 [255:0] /* synthesis syn_ramstyle = block_ram syn_ramstyle = no_rw_check */ ; |
---|
| 160 | `endif |
---|
| 161 | |
---|
| 162 | |
---|
| 163 | |
---|
| 164 | |
---|
| 165 | |
---|
| 166 | assign clk = rclk; |
---|
| 167 | `ifdef FPGA_SYN_ALTERA |
---|
| 168 | `else |
---|
| 169 | assign index_bf = (fcl_icd_index_sel_ifq_bf ? ifq_icd_index_bf : |
---|
| 170 | fdp_icd_index_bf); |
---|
| 171 | `endif |
---|
| 172 | // assign index_bf = (fcl_icd_index_sel_ifq_bf ? ifq_icd_index_bf : |
---|
| 173 | // fdp_icd_index_bf); |
---|
| 174 | wire [11:2] top_index = {index_f[11:3] , 1'b1}; |
---|
| 175 | |
---|
| 176 | assign bist_data_expand = 136'b0; |
---|
| 177 | assign icd_wsel_fetdata_s1 = fetdata_s1; |
---|
| 178 | assign icd_wsel_topdata_s1 = topdata_s1; |
---|
| 179 | |
---|
| 180 | mux3ds #(136) icden_mux( |
---|
| 181 | .dout (next_wrdata_bf), |
---|
| 182 | .in0 (wrdata_f), |
---|
| 183 | .in1 (ifq_icd_wrdata_i2), |
---|
| 184 | .in2 (bist_data_expand), |
---|
| 185 | .sel0 (ifq_icd_data_sel_old_i2), |
---|
| 186 | .sel1 (ifq_icd_data_sel_fill_i2), |
---|
| 187 | .sel2 (ifq_icd_data_sel_bist_i2)); |
---|
| 188 | dffe_s #(136) wrdata_reg( |
---|
| 189 | .din (next_wrdata_bf), |
---|
| 190 | .clk (clk), |
---|
| 191 | .q (wrdata_f), |
---|
| 192 | .en ((~sehold)), |
---|
| 193 | .se (se)); |
---|
| 194 | |
---|
| 195 | always @(posedge clk) begin |
---|
| 196 | if (~sehold) begin |
---|
| 197 | rdreq_f <= fcl_icd_rdreq_bf; |
---|
| 198 | wrreq_f <= fcl_icd_wrreq_bf; |
---|
| 199 | `ifdef FPGA_SYN_ALTERA |
---|
| 200 | `else |
---|
| 201 | index_f <= index_bf; |
---|
| 202 | `endif |
---|
| 203 | wrway_f <= ifq_icd_wrway_bf; |
---|
| 204 | worden_f <= ifq_icd_worden_bf; |
---|
| 205 | wr_index0 <= {index_bf[11:4], 2'b0, ifq_icd_wrway_bf}; |
---|
| 206 | wr_index1 <= {index_bf[11:4], 2'b1, ifq_icd_wrway_bf}; |
---|
| 207 | wr_index2 <= {index_bf[11:4], 2'b10, ifq_icd_wrway_bf}; |
---|
| 208 | wr_index3 <= {index_bf[11:4], 2'b11, ifq_icd_wrway_bf}; |
---|
| 209 | end |
---|
| 210 | fetdata_s1 <= fetdata_f; |
---|
| 211 | topdata_s1 <= topdata_f; |
---|
| 212 | end |
---|
| 213 | |
---|
| 214 | |
---|
| 215 | reg [33:0] fetch_00_00; |
---|
| 216 | reg [33:0] fetch_00_01; |
---|
| 217 | reg [33:0] fetch_00_10; |
---|
| 218 | reg [33:0] fetch_00_11; |
---|
| 219 | |
---|
| 220 | reg [33:0] fetch_01_00; |
---|
| 221 | reg [33:0] fetch_01_01; |
---|
| 222 | reg [33:0] fetch_01_10; |
---|
| 223 | reg [33:0] fetch_01_11; |
---|
| 224 | |
---|
| 225 | reg [33:0] fetch_10_00; |
---|
| 226 | reg [33:0] fetch_10_01; |
---|
| 227 | reg [33:0] fetch_10_10; |
---|
| 228 | reg [33:0] fetch_10_11; |
---|
| 229 | |
---|
| 230 | reg [33:0] fetch_11_00; |
---|
| 231 | reg [33:0] fetch_11_01; |
---|
| 232 | reg [33:0] fetch_11_10; |
---|
| 233 | reg [33:0] fetch_11_11; |
---|
| 234 | `ifdef FPGA_SYN_ALTERA |
---|
| 235 | |
---|
| 236 | reg [33:0] fetch_00_00_d; |
---|
| 237 | reg [33:0] fetch_00_01_d; |
---|
| 238 | reg [33:0] fetch_00_10_d; |
---|
| 239 | reg [33:0] fetch_00_11_d; |
---|
| 240 | |
---|
| 241 | reg [33:0] fetch_01_00_d; |
---|
| 242 | reg [33:0] fetch_01_01_d; |
---|
| 243 | reg [33:0] fetch_01_10_d; |
---|
| 244 | reg [33:0] fetch_01_11_d; |
---|
| 245 | |
---|
| 246 | reg [33:0] fetch_10_00_d; |
---|
| 247 | reg [33:0] fetch_10_01_d; |
---|
| 248 | reg [33:0] fetch_10_10_d; |
---|
| 249 | reg [33:0] fetch_10_11_d; |
---|
| 250 | |
---|
| 251 | reg [33:0] fetch_11_00_d; |
---|
| 252 | reg [33:0] fetch_11_01_d; |
---|
| 253 | reg [33:0] fetch_11_10_d; |
---|
| 254 | reg [33:0] fetch_11_11_d; |
---|
| 255 | reg delay_half_cycle; |
---|
| 256 | |
---|
| 257 | |
---|
| 258 | always @(negedge clk) begin // Sandeep Changed this to negedge clock from posedge clock |
---|
| 259 | // Can we push the reads to the next negedge? Delay this read!! Looks |
---|
| 260 | // like the previous write does not get through |
---|
| 261 | `else |
---|
| 262 | always @(posedge clk) begin |
---|
| 263 | `endif |
---|
| 264 | fetch_00_00 <= icdata_ary_00_00[index_bf[11:4]]; |
---|
| 265 | fetch_00_01 <= icdata_ary_00_01[index_bf[11:4]]; |
---|
| 266 | fetch_00_10 <= icdata_ary_00_10[index_bf[11:4]]; |
---|
| 267 | fetch_00_11 <= icdata_ary_00_11[index_bf[11:4]]; |
---|
| 268 | |
---|
| 269 | fetch_01_00 <= icdata_ary_01_00[index_bf[11:4]]; |
---|
| 270 | fetch_01_01 <= icdata_ary_01_01[index_bf[11:4]]; |
---|
| 271 | fetch_01_10 <= icdata_ary_01_10[index_bf[11:4]]; |
---|
| 272 | fetch_01_11 <= icdata_ary_01_11[index_bf[11:4]]; |
---|
| 273 | |
---|
| 274 | fetch_10_00 <= icdata_ary_10_00[index_bf[11:4]]; |
---|
| 275 | fetch_10_01 <= icdata_ary_10_01[index_bf[11:4]]; |
---|
| 276 | fetch_10_10 <= icdata_ary_10_10[index_bf[11:4]]; |
---|
| 277 | fetch_10_11 <= icdata_ary_10_11[index_bf[11:4]]; |
---|
| 278 | |
---|
| 279 | fetch_11_00 <= icdata_ary_11_00[index_bf[11:4]]; |
---|
| 280 | fetch_11_01 <= icdata_ary_11_01[index_bf[11:4]]; |
---|
| 281 | fetch_11_10 <= icdata_ary_11_10[index_bf[11:4]]; |
---|
| 282 | fetch_11_11 <= icdata_ary_11_11[index_bf[11:4]]; |
---|
| 283 | `ifdef FPGA_SYN_ALTERA |
---|
| 284 | index_f <= index_bf; // Sandeep moved this logic 1/2 cycle forward for altera |
---|
| 285 | index_bf <= (fcl_icd_index_sel_ifq_bf ? ifq_icd_index_bf : // Moved this logic from a continuous assignment to a synchronous assignment |
---|
| 286 | fdp_icd_index_bf); |
---|
| 287 | `endif |
---|
| 288 | end |
---|
| 289 | |
---|
| 290 | |
---|
| 291 | always @(index_f or rdreq_f or fetch_00_00 or fetch_01_00 or fetch_10_00 or fetch_11_00 |
---|
| 292 | or fetch_00_01 or fetch_01_01 or fetch_10_01 or fetch_11_01 |
---|
| 293 | or fetch_00_10 or fetch_01_10 or fetch_10_10 or fetch_11_10 |
---|
| 294 | or fetch_00_11 or fetch_01_11 or fetch_10_11 or fetch_11_11) begin |
---|
| 295 | // if (rdreq_f) begin |
---|
| 296 | case(index_f[3:2]) |
---|
| 297 | 2'b00: fetdata_f[33:0] = fetch_00_00; |
---|
| 298 | 2'b01: fetdata_f[33:0] = fetch_01_00; |
---|
| 299 | 2'b10: fetdata_f[33:0] = fetch_10_00; |
---|
| 300 | 2'b11: fetdata_f[33:0] = fetch_11_00; |
---|
| 301 | endcase |
---|
| 302 | case(index_f[3:2]) |
---|
| 303 | 2'b00: fetdata_f[67:34] = fetch_00_01; |
---|
| 304 | 2'b01: fetdata_f[67:34] = fetch_01_01; |
---|
| 305 | 2'b10: fetdata_f[67:34] = fetch_10_01; |
---|
| 306 | 2'b11: fetdata_f[67:34] = fetch_11_01; |
---|
| 307 | endcase |
---|
| 308 | case(index_f[3:2]) |
---|
| 309 | 2'b00: fetdata_f[101:68] = fetch_00_10; |
---|
| 310 | 2'b01: fetdata_f[101:68] = fetch_01_10; |
---|
| 311 | 2'b10: fetdata_f[101:68] = fetch_10_10; |
---|
| 312 | 2'b11: fetdata_f[101:68] = fetch_11_10; |
---|
| 313 | endcase |
---|
| 314 | case(index_f[3:2]) |
---|
| 315 | 2'b00: fetdata_f[135:102] = fetch_00_11; |
---|
| 316 | 2'b01: fetdata_f[135:102] = fetch_01_11; |
---|
| 317 | 2'b10: fetdata_f[135:102] = fetch_10_11; |
---|
| 318 | 2'b11: fetdata_f[135:102] = fetch_11_11; |
---|
| 319 | endcase |
---|
| 320 | case(index_f[3]) |
---|
| 321 | 1'b0: topdata_f[33:0] = fetch_01_00; |
---|
| 322 | 1'b1: topdata_f[33:0] = fetch_11_00; |
---|
| 323 | endcase |
---|
| 324 | case(index_f[3]) |
---|
| 325 | 1'b0: topdata_f[67:34] = fetch_01_01; |
---|
| 326 | 1'b1: topdata_f[67:34] = fetch_11_01; |
---|
| 327 | endcase |
---|
| 328 | case(index_f[3]) |
---|
| 329 | 1'b0: topdata_f[101:68] = fetch_01_10; |
---|
| 330 | 1'b1: topdata_f[101:68] = fetch_11_10; |
---|
| 331 | endcase |
---|
| 332 | case(index_f[3]) |
---|
| 333 | 1'b0: topdata_f[135:102] = fetch_01_11; |
---|
| 334 | 1'b1: topdata_f[135:102] = fetch_11_11; |
---|
| 335 | endcase |
---|
| 336 | end |
---|
| 337 | // else |
---|
| 338 | // begin |
---|
| 339 | // fetdata_f = 136'b0; |
---|
| 340 | // topdata_f = 136'b0; |
---|
| 341 | // end |
---|
| 342 | // end |
---|
| 343 | |
---|
| 344 | always @(negedge clk) begin // Writes happening at the negedge |
---|
| 345 | if (wrreq_f & (~rst_tri_en)) begin |
---|
| 346 | if (worden_f[0]) begin |
---|
| 347 | if (wr_index0[1:0] == 2'b0) begin |
---|
| 348 | icdata_ary_00_00[wr_index0[11:4]] <= wrdata_f[135:102]; |
---|
| 349 | end |
---|
| 350 | if (wr_index0[1:0] == 2'b1) begin |
---|
| 351 | icdata_ary_00_01[wr_index0[11:4]] <= wrdata_f[135:102]; |
---|
| 352 | end |
---|
| 353 | if (wr_index0[1:0] == 2'b10) begin |
---|
| 354 | icdata_ary_00_10[wr_index0[11:4]] <= wrdata_f[135:102]; |
---|
| 355 | end |
---|
| 356 | if (wr_index0[1:0] == 2'b11) begin |
---|
| 357 | icdata_ary_00_11[wr_index0[11:4]] <= wrdata_f[135:102]; |
---|
| 358 | end |
---|
| 359 | end |
---|
| 360 | if (worden_f[1]) begin |
---|
| 361 | if (wr_index1[1:0] == 2'b0) begin |
---|
| 362 | icdata_ary_01_00[wr_index1[11:4]] <= wrdata_f[101:68]; |
---|
| 363 | end |
---|
| 364 | if (wr_index1[1:0] == 2'b1) begin |
---|
| 365 | icdata_ary_01_01[wr_index1[11:4]] <= wrdata_f[101:68]; |
---|
| 366 | end |
---|
| 367 | if (wr_index1[1:0] == 2'b10) begin |
---|
| 368 | icdata_ary_01_10[wr_index1[11:4]] <= wrdata_f[101:68]; |
---|
| 369 | end |
---|
| 370 | if (wr_index1[1:0] == 2'b11) begin |
---|
| 371 | icdata_ary_01_11[wr_index1[11:4]] <= wrdata_f[101:68]; |
---|
| 372 | end |
---|
| 373 | end |
---|
| 374 | if (worden_f[2]) begin |
---|
| 375 | if (wr_index2[1:0] == 2'b0) begin |
---|
| 376 | icdata_ary_10_00[wr_index2[11:4]] <= wrdata_f[67:34]; |
---|
| 377 | end |
---|
| 378 | if (wr_index2[1:0] == 2'b1) begin |
---|
| 379 | icdata_ary_10_01[wr_index2[11:4]] <= wrdata_f[67:34]; |
---|
| 380 | end |
---|
| 381 | if (wr_index2[1:0] == 2'b10) begin |
---|
| 382 | icdata_ary_10_10[wr_index2[11:4]] <= wrdata_f[67:34]; |
---|
| 383 | end |
---|
| 384 | if (wr_index2[1:0] == 2'b11) begin |
---|
| 385 | icdata_ary_10_11[wr_index2[11:4]] <= wrdata_f[67:34]; |
---|
| 386 | end |
---|
| 387 | end |
---|
| 388 | if (worden_f[3]) begin |
---|
| 389 | if (wr_index3[1:0] == 2'b0) begin |
---|
| 390 | icdata_ary_11_00[wr_index3[11:4]] <= wrdata_f[33:0]; |
---|
| 391 | end |
---|
| 392 | if (wr_index3[1:0] == 2'b1) begin |
---|
| 393 | icdata_ary_11_01[wr_index3[11:4]] <= wrdata_f[33:0]; |
---|
| 394 | end |
---|
| 395 | if (wr_index3[1:0] == 2'b10) begin |
---|
| 396 | icdata_ary_11_10[wr_index3[11:4]] <= wrdata_f[33:0]; |
---|
| 397 | end |
---|
| 398 | if (wr_index3[1:0] == 2'b11) begin |
---|
| 399 | icdata_ary_11_11[wr_index3[11:4]] <= wrdata_f[33:0]; |
---|
| 400 | end |
---|
| 401 | end |
---|
| 402 | end |
---|
| 403 | end |
---|
| 404 | endmodule |
---|
| 405 | |
---|
| 406 | `else |
---|
| 407 | |
---|
| 408 | module bw_r_icd(/*AUTOARG*/ |
---|
| 409 | // Outputs |
---|
| 410 | icd_wsel_fetdata_s1, icd_wsel_topdata_s1, icd_fuse_repair_value, |
---|
| 411 | icd_fuse_repair_en, so, |
---|
| 412 | // Inputs |
---|
| 413 | rclk, se, si, reset_l, sehold, fdp_icd_index_bf, ifq_icd_index_bf, |
---|
| 414 | fcl_icd_index_sel_ifq_bf, ifq_icd_wrway_bf, ifq_icd_worden_bf, |
---|
| 415 | ifq_icd_wrdata_i2, fcl_icd_rdreq_bf, fcl_icd_wrreq_bf, |
---|
| 416 | bist_ic_data, rst_tri_en, ifq_icd_data_sel_old_i2, |
---|
| 417 | ifq_icd_data_sel_fill_i2, ifq_icd_data_sel_bist_i2, fuse_icd_wren, |
---|
| 418 | fuse_icd_rid, fuse_icd_repair_value, fuse_icd_repair_en, |
---|
| 419 | efc_spc_fuse_clk1 |
---|
| 420 | ); |
---|
| 421 | |
---|
| 422 | input rclk, |
---|
| 423 | se, |
---|
| 424 | si, |
---|
| 425 | reset_l; |
---|
| 426 | input sehold; |
---|
| 427 | |
---|
| 428 | input [11:2] fdp_icd_index_bf, // index to write to/read from |
---|
| 429 | ifq_icd_index_bf; |
---|
| 430 | input fcl_icd_index_sel_ifq_bf; |
---|
| 431 | |
---|
| 432 | input [1:0] ifq_icd_wrway_bf; // way to write to |
---|
| 433 | input [3:0] ifq_icd_worden_bf; // word to write to (ignore index 1:0) |
---|
| 434 | input [135:0] ifq_icd_wrdata_i2; // 128b data, 4b sw, 4b parity |
---|
| 435 | |
---|
| 436 | input fcl_icd_rdreq_bf, |
---|
| 437 | fcl_icd_wrreq_bf; |
---|
| 438 | |
---|
| 439 | input [7:0] bist_ic_data; // needs to be expanded |
---|
| 440 | input rst_tri_en; |
---|
| 441 | |
---|
| 442 | // datain mux selects |
---|
| 443 | input ifq_icd_data_sel_old_i2, |
---|
| 444 | ifq_icd_data_sel_fill_i2, |
---|
| 445 | ifq_icd_data_sel_bist_i2; |
---|
| 446 | |
---|
| 447 | // efuse values for redundancy |
---|
| 448 | input fuse_icd_wren; |
---|
| 449 | input [3:0] fuse_icd_rid; |
---|
| 450 | input [7:0] fuse_icd_repair_value; |
---|
| 451 | input [1:0] fuse_icd_repair_en; |
---|
| 452 | |
---|
| 453 | // efuse non ovl clks |
---|
| 454 | input efc_spc_fuse_clk1; // use this clk to talk to fuse hdr |
---|
| 455 | // outputs |
---|
| 456 | output [135:0] icd_wsel_fetdata_s1, |
---|
| 457 | icd_wsel_topdata_s1; |
---|
| 458 | |
---|
| 459 | // redundancy reg read |
---|
| 460 | output [7:0] icd_fuse_repair_value; |
---|
| 461 | output [1:0] icd_fuse_repair_en; |
---|
| 462 | |
---|
| 463 | output so; |
---|
| 464 | |
---|
| 465 | |
---|
| 466 | //---------------------------------------------------------------------- |
---|
| 467 | // Declarations |
---|
| 468 | //---------------------------------------------------------------------- |
---|
| 469 | |
---|
| 470 | // local signals |
---|
| 471 | `ifdef DEFINE_0IN |
---|
| 472 | reg [135:0] fetdata_s1, |
---|
| 473 | topdata_s1; |
---|
| 474 | wire [135:0] fetdata_sa, |
---|
| 475 | topdata_sa; |
---|
| 476 | `else |
---|
| 477 | reg [33:0] icdata_ary [4095:0]; |
---|
| 478 | |
---|
| 479 | reg [135:0] fetdata_f, // way0 is lsb, way3 is msb |
---|
| 480 | topdata_f, |
---|
| 481 | fetdata_sa, |
---|
| 482 | topdata_sa, |
---|
| 483 | fetdata_s1, |
---|
| 484 | topdata_s1; |
---|
| 485 | `endif |
---|
| 486 | |
---|
| 487 | wire clk; |
---|
| 488 | |
---|
| 489 | wire [135:0] next_wrdata_bf, |
---|
| 490 | wrdata_f, |
---|
| 491 | bist_data_expand; |
---|
| 492 | |
---|
| 493 | wire [11:2] top_index, |
---|
| 494 | index_bf; |
---|
| 495 | |
---|
| 496 | reg [11:2] index_f; |
---|
| 497 | |
---|
| 498 | wire [11:0] wr_index0, |
---|
| 499 | wr_index1, |
---|
| 500 | wr_index2, |
---|
| 501 | wr_index3; |
---|
| 502 | |
---|
| 503 | reg rdreq_f, |
---|
| 504 | wrreq_f; |
---|
| 505 | reg [3:0] worden_f; |
---|
| 506 | reg [1:0] wrway_f; |
---|
| 507 | |
---|
| 508 | |
---|
| 509 | // redundancy crap |
---|
| 510 | reg [7:0] red0_ev_row, |
---|
| 511 | red0_od_row; |
---|
| 512 | reg [9:0] red0_ev_col, |
---|
| 513 | red0_od_col; |
---|
| 514 | reg [7:0] red1_ev_row, |
---|
| 515 | red1_od_row; |
---|
| 516 | reg [9:0] red1_ev_col, |
---|
| 517 | red1_od_col; |
---|
| 518 | reg [7:0] red2_ev_row, |
---|
| 519 | red2_od_row; |
---|
| 520 | reg [9:0] red2_ev_col, |
---|
| 521 | red2_od_col; |
---|
| 522 | reg [7:0] red3_ev_row, |
---|
| 523 | red3_od_row; |
---|
| 524 | reg [9:0] red3_ev_col, |
---|
| 525 | red3_od_col; |
---|
| 526 | |
---|
| 527 | reg [7:0] icd_fuse_repair_value; |
---|
| 528 | reg [1:0] icd_fuse_repair_en; |
---|
| 529 | |
---|
| 530 | |
---|
| 531 | // |
---|
| 532 | // Code start here |
---|
| 533 | // |
---|
| 534 | |
---|
| 535 | // clk header derives clk from rclk |
---|
| 536 | assign clk = rclk; |
---|
| 537 | |
---|
| 538 | |
---|
| 539 | // mux merged with flop |
---|
| 540 | assign index_bf = fcl_icd_index_sel_ifq_bf ? ifq_icd_index_bf : |
---|
| 541 | fdp_icd_index_bf; |
---|
| 542 | |
---|
| 543 | always @ (posedge clk) |
---|
| 544 | begin |
---|
| 545 | // input flops |
---|
| 546 | if (~sehold) |
---|
| 547 | begin |
---|
| 548 | rdreq_f <= fcl_icd_rdreq_bf; |
---|
| 549 | wrreq_f <= fcl_icd_wrreq_bf; |
---|
| 550 | index_f <= index_bf; |
---|
| 551 | wrway_f <= ifq_icd_wrway_bf; |
---|
| 552 | worden_f <= ifq_icd_worden_bf; |
---|
| 553 | end |
---|
| 554 | // S stage flops (for rd data) |
---|
| 555 | fetdata_s1 <= fetdata_sa; |
---|
| 556 | topdata_s1 <= topdata_sa; |
---|
| 557 | |
---|
| 558 | end // always @ (posedge clk) |
---|
| 559 | |
---|
| 560 | // BIST data |
---|
| 561 | assign bist_data_expand = {bist_ic_data[1:0], {4{bist_ic_data[7:0]}}, |
---|
| 562 | bist_ic_data[1:0], {4{bist_ic_data[7:0]}}, |
---|
| 563 | bist_ic_data[1:0], {4{bist_ic_data[7:0]}}, |
---|
| 564 | bist_ic_data[1:0], {4{bist_ic_data[7:0]}}}; |
---|
| 565 | |
---|
| 566 | |
---|
| 567 | // Mux + flop for write data input |
---|
| 568 | // ic data enable mux |
---|
| 569 | mux3ds #(136) icden_mux(.dout (next_wrdata_bf), |
---|
| 570 | .in0 (wrdata_f), |
---|
| 571 | .in1 (ifq_icd_wrdata_i2), |
---|
| 572 | .in2 (bist_data_expand), |
---|
| 573 | .sel0 (ifq_icd_data_sel_old_i2), |
---|
| 574 | .sel1 (ifq_icd_data_sel_fill_i2), |
---|
| 575 | .sel2 (ifq_icd_data_sel_bist_i2)); |
---|
| 576 | // write data regsiter |
---|
| 577 | // se hold is taken care of by external logic (in ifqctl) |
---|
| 578 | dffe_s #(136) wrdata_reg(.din (next_wrdata_bf), |
---|
| 579 | .clk (clk), |
---|
| 580 | .q (wrdata_f), |
---|
| 581 | .en (~sehold), |
---|
| 582 | .se (se), .si(), .so()); |
---|
| 583 | |
---|
| 584 | |
---|
| 585 | //---------------------------------------------------------------------- |
---|
| 586 | // Read Operation |
---|
| 587 | //---------------------------------------------------------------------- |
---|
| 588 | |
---|
| 589 | // The index has 2 parts. |
---|
| 590 | // 1. The 16B half-line index -- bits 11:4 |
---|
| 591 | // 2. The word offset -- bits 3:2 for reads, xx for writes |
---|
| 592 | // 3. The way -- wrway_f for writes, xx for reads |
---|
| 593 | // i.e. we read 1 word from each of 4 ways, but |
---|
| 594 | // we write 4 words to 1 way |
---|
| 595 | |
---|
| 596 | assign top_index = {index_f[11:3] , 1'b1}; |
---|
| 597 | |
---|
| 598 | `ifdef DEFINE_0IN |
---|
| 599 | // physical implmentation: ignore this and use else portion |
---|
| 600 | |
---|
| 601 | wire [15:0] we_wrd = ({ 3'b0,worden_f[3], 3'b0,worden_f[2], |
---|
| 602 | 3'b0,worden_f[1], 3'b0,worden_f[0] }) << wrway_f; |
---|
| 603 | |
---|
| 604 | wire [543:0] we = (~wrreq_f ) ? 544'h0 : |
---|
| 605 | { {34{we_wrd[15]}}, {34{we_wrd[14]}}, {34{we_wrd[13]}}, {34{we_wrd[12]}}, |
---|
| 606 | {34{we_wrd[11]}}, {34{we_wrd[10]}}, {34{we_wrd[ 9]}}, {34{we_wrd[ 8]}}, |
---|
| 607 | {34{we_wrd[ 7]}}, {34{we_wrd[ 6]}}, {34{we_wrd[ 5]}}, {34{we_wrd[ 4]}}, |
---|
| 608 | {34{we_wrd[ 3]}}, {34{we_wrd[ 2]}}, {34{we_wrd[ 1]}}, {34{we_wrd[ 0]}} }; |
---|
| 609 | |
---|
| 610 | wire [543:0] din = ({ {4{wrdata_f[ 33: 0]}}, {4{wrdata_f[ 67: 34]}}, |
---|
| 611 | {4{wrdata_f[101:68]}}, {4{wrdata_f[135:102]}} }); |
---|
| 612 | wire [543:0] dout; |
---|
| 613 | |
---|
| 614 | ic_data ic_data ( .nclk(~clk), .adr(index_f[11:4]), .we(we), .din(din), .dout(dout) ); |
---|
| 615 | |
---|
| 616 | wire [271:0] dout_l1 = index_f[3] ? dout[543:272] : dout[271:0]; |
---|
| 617 | |
---|
| 618 | assign fetdata_sa[135:0] = index_f[2] ? dout_l1[271:136] : dout_l1[135:0]; |
---|
| 619 | assign topdata_sa[135:0] = dout_l1[271:136]; |
---|
| 620 | |
---|
| 621 | |
---|
| 622 | `else |
---|
| 623 | |
---|
| 624 | // for physical implementation use this |
---|
| 625 | |
---|
| 626 | // read (inst[31:0] + sw bit + par bit) * 4 ways |
---|
| 627 | always @(/*AUTOSENSE*/ /*memory or*/ index_f or rdreq_f |
---|
| 628 | or top_index or wrreq_f) |
---|
| 629 | begin |
---|
| 630 | if (rdreq_f) |
---|
| 631 | begin |
---|
| 632 | if (wrreq_f) // rd-wr contention |
---|
| 633 | begin |
---|
| 634 | fetdata_f = 136'bx; |
---|
| 635 | topdata_f = 136'bx; |
---|
| 636 | end |
---|
| 637 | else |
---|
| 638 | begin // regular read |
---|
| 639 | fetdata_f[33:0] = icdata_ary[{index_f,2'b00}]; // way 0 |
---|
| 640 | fetdata_f[67:34] = icdata_ary[{index_f,2'b01}]; // way 1 |
---|
| 641 | fetdata_f[101:68] = icdata_ary[{index_f,2'b10}]; // way 2 |
---|
| 642 | fetdata_f[135:102] = icdata_ary[{index_f,2'b11}]; // way 3 |
---|
| 643 | |
---|
| 644 | topdata_f[33:0] = icdata_ary[{top_index, 2'b00}]; |
---|
| 645 | topdata_f[67:34] = icdata_ary[{top_index, 2'b01}]; |
---|
| 646 | topdata_f[101:68] = icdata_ary[{top_index, 2'b10}]; |
---|
| 647 | topdata_f[135:102] = icdata_ary[{top_index, 2'b11}]; |
---|
| 648 | end // else: !if(wrreq_f) |
---|
| 649 | end // if (rdreq_f) |
---|
| 650 | |
---|
| 651 | else // icache disabled or rd disabled |
---|
| 652 | begin |
---|
| 653 | // JC modified begin |
---|
| 654 | // fetdata_f = 136'bx; |
---|
| 655 | // topdata_f = 136'bx; |
---|
| 656 | fetdata_f = 136'b0; |
---|
| 657 | topdata_f = 136'b0; |
---|
| 658 | // JC modified end |
---|
| 659 | end // else: !if(rdreq_f) |
---|
| 660 | end // always @ (... |
---|
| 661 | |
---|
| 662 | |
---|
| 663 | // SA latch -- to make 0in happy |
---|
| 664 | always @ (clk or fetdata_f or topdata_f) |
---|
| 665 | begin |
---|
| 666 | if (~clk) |
---|
| 667 | begin |
---|
| 668 | fetdata_sa <= fetdata_f; |
---|
| 669 | topdata_sa <= topdata_f; |
---|
| 670 | end |
---|
| 671 | end |
---|
| 672 | `endif // !`ifdef DEFINE_0IN |
---|
| 673 | |
---|
| 674 | // final outputs (272bits) |
---|
| 675 | assign icd_wsel_fetdata_s1 = fetdata_s1; |
---|
| 676 | assign icd_wsel_topdata_s1 = topdata_s1; |
---|
| 677 | |
---|
| 678 | |
---|
| 679 | //---------------------------------------------------------------------- |
---|
| 680 | // Write Operation |
---|
| 681 | //---------------------------------------------------------------------- |
---|
| 682 | |
---|
| 683 | // The index has 3 parts. |
---|
| 684 | // 1. The 16B half-line index -- bits 11:4 of index_f |
---|
| 685 | // 2. The word offset -- bits 3:2 for reads, xx for writes |
---|
| 686 | // 3. The way -- wrway_f for writes, xx for reads |
---|
| 687 | |
---|
| 688 | // index word way |
---|
| 689 | // ----- ---- --- |
---|
| 690 | assign wr_index0 = {index_f[11:4], 2'b00, wrway_f}; |
---|
| 691 | assign wr_index1 = {index_f[11:4], 2'b01, wrway_f}; |
---|
| 692 | assign wr_index2 = {index_f[11:4], 2'b10, wrway_f}; |
---|
| 693 | assign wr_index3 = {index_f[11:4], 2'b11, wrway_f}; |
---|
| 694 | |
---|
| 695 | `ifdef DEFINE_0IN |
---|
| 696 | `else |
---|
| 697 | // assume write happens @ negedge clk (i.e. phase 1) |
---|
| 698 | always @ (negedge clk) |
---|
| 699 | begin |
---|
| 700 | if (wrreq_f & ~rst_tri_en) |
---|
| 701 | begin |
---|
| 702 | // instructions always Big Endian |
---|
| 703 | if (worden_f[0]) |
---|
| 704 | icdata_ary[wr_index0] <= wrdata_f[135:102]; |
---|
| 705 | if (worden_f[1]) |
---|
| 706 | icdata_ary[wr_index1] <= wrdata_f[101:68]; |
---|
| 707 | if (worden_f[2]) |
---|
| 708 | icdata_ary[wr_index2] <= wrdata_f[67:34]; |
---|
| 709 | if (worden_f[3]) |
---|
| 710 | icdata_ary[wr_index3] <= wrdata_f[33:0]; |
---|
| 711 | end // if (wrreq_f) |
---|
| 712 | end // always @ (... |
---|
| 713 | `endif // !`ifdef DEFINE_0IN |
---|
| 714 | |
---|
| 715 | |
---|
| 716 | //-------------------------------------------------------------- |
---|
| 717 | // Redundancy Registers |
---|
| 718 | //-------------------------------------------------------------- |
---|
| 719 | // |
---|
| 720 | // read red regs |
---|
| 721 | // 16:1 mux |
---|
| 722 | always @ (/*AUTOSENSE*/fuse_icd_rid or red0_ev_col or red0_ev_row |
---|
| 723 | or red0_od_col or red0_od_row or red1_ev_col |
---|
| 724 | or red1_ev_row or red1_od_col or red1_od_row |
---|
| 725 | or red2_ev_col or red2_ev_row or red2_od_col |
---|
| 726 | or red2_od_row or red3_ev_col or red3_ev_row |
---|
| 727 | or red3_od_col or red3_od_row) |
---|
| 728 | begin |
---|
| 729 | // sub array 0 |
---|
| 730 | if (fuse_icd_rid[3:0] == 4'b0) |
---|
| 731 | begin |
---|
| 732 | icd_fuse_repair_value = {2'b0, red0_ev_row[5:0]}; |
---|
| 733 | icd_fuse_repair_en = red0_ev_row[7:6]; |
---|
| 734 | end |
---|
| 735 | else if (fuse_icd_rid[3:0] == 4'b1) |
---|
| 736 | begin |
---|
| 737 | icd_fuse_repair_value = {2'b0, red0_od_row[5:0]}; |
---|
| 738 | icd_fuse_repair_en = red0_od_row[7:6]; |
---|
| 739 | end |
---|
| 740 | else if (fuse_icd_rid[3:0] == 4'b10) |
---|
| 741 | begin |
---|
| 742 | icd_fuse_repair_value = red0_ev_col[7:0]; |
---|
| 743 | icd_fuse_repair_en = red0_ev_col[9:8]; |
---|
| 744 | end |
---|
| 745 | else if (fuse_icd_rid[3:0] == 4'b11) |
---|
| 746 | begin |
---|
| 747 | icd_fuse_repair_value = red0_od_col[7:0]; |
---|
| 748 | icd_fuse_repair_en = red0_od_col[9:8]; |
---|
| 749 | end |
---|
| 750 | |
---|
| 751 | // sub array 1 |
---|
| 752 | else if (fuse_icd_rid[3:0] == 4'b100) |
---|
| 753 | begin |
---|
| 754 | icd_fuse_repair_value = {2'b0, red1_ev_row[5:0]}; |
---|
| 755 | icd_fuse_repair_en = red1_ev_row[7:6]; |
---|
| 756 | end |
---|
| 757 | else if (fuse_icd_rid[3:0] == 4'b101) |
---|
| 758 | begin |
---|
| 759 | icd_fuse_repair_value = {2'b0, red1_od_row[5:0]}; |
---|
| 760 | icd_fuse_repair_en = red1_od_row[7:6]; |
---|
| 761 | end |
---|
| 762 | else if (fuse_icd_rid[3:0] == 4'b110) |
---|
| 763 | begin |
---|
| 764 | icd_fuse_repair_value = red1_ev_col[7:0]; |
---|
| 765 | icd_fuse_repair_en = red1_ev_col[9:8]; |
---|
| 766 | end |
---|
| 767 | else if (fuse_icd_rid[3:0] == 4'b111) |
---|
| 768 | begin |
---|
| 769 | icd_fuse_repair_value = red1_od_col[7:0]; |
---|
| 770 | icd_fuse_repair_en = red1_od_col[9:8]; |
---|
| 771 | end |
---|
| 772 | |
---|
| 773 | // sub array 2 |
---|
| 774 | else if (fuse_icd_rid[3:0] == 4'b1000) |
---|
| 775 | begin |
---|
| 776 | icd_fuse_repair_value = {2'b0, red2_ev_row[5:0]}; |
---|
| 777 | icd_fuse_repair_en = red2_ev_row[7:6]; |
---|
| 778 | end |
---|
| 779 | else if (fuse_icd_rid[3:0] == 4'b1001) |
---|
| 780 | begin |
---|
| 781 | icd_fuse_repair_value = {2'b0, red2_od_row[5:0]}; |
---|
| 782 | icd_fuse_repair_en = red2_od_row[7:6]; |
---|
| 783 | end |
---|
| 784 | else if (fuse_icd_rid[3:0] == 4'b1010) |
---|
| 785 | begin |
---|
| 786 | icd_fuse_repair_value = red2_ev_col[7:0]; |
---|
| 787 | icd_fuse_repair_en = red2_ev_col[9:8]; |
---|
| 788 | end |
---|
| 789 | else if (fuse_icd_rid[3:0] == 4'b1011) |
---|
| 790 | begin |
---|
| 791 | icd_fuse_repair_value = red2_od_col[7:0]; |
---|
| 792 | icd_fuse_repair_en = red2_od_col[9:8]; |
---|
| 793 | end |
---|
| 794 | |
---|
| 795 | // sub array 3 |
---|
| 796 | else if (fuse_icd_rid[3:0] == 4'b1100) |
---|
| 797 | begin |
---|
| 798 | icd_fuse_repair_value = {2'b0, red3_ev_row[5:0]}; |
---|
| 799 | icd_fuse_repair_en = red3_ev_row[7:6]; |
---|
| 800 | end |
---|
| 801 | else if (fuse_icd_rid[3:0] == 4'b1101) |
---|
| 802 | begin |
---|
| 803 | icd_fuse_repair_value = {2'b0, red3_od_row[5:0]}; |
---|
| 804 | icd_fuse_repair_en = red3_od_row[7:6]; |
---|
| 805 | end |
---|
| 806 | else if (fuse_icd_rid[3:0] == 4'b1110) |
---|
| 807 | begin |
---|
| 808 | icd_fuse_repair_value = red3_ev_col[7:0]; |
---|
| 809 | icd_fuse_repair_en = red3_ev_col[9:8]; |
---|
| 810 | end |
---|
| 811 | else // if (fuse_icd_rid[3:0] == 4'b1111) |
---|
| 812 | begin |
---|
| 813 | icd_fuse_repair_value = red3_od_col[7:0]; |
---|
| 814 | icd_fuse_repair_en = red3_od_col[9:8]; |
---|
| 815 | end |
---|
| 816 | end // always @ (... |
---|
| 817 | |
---|
| 818 | |
---|
| 819 | // |
---|
| 820 | // write red regs |
---|
| 821 | // |
---|
| 822 | // use clk1 to latch anything to/from the hdr |
---|
| 823 | // |
---|
| 824 | // reset_l is an asynchronous reset. Only the the repair enables [9:8] |
---|
| 825 | // need to be reset. However, the actual circuit resets all the bits. |
---|
| 826 | always @ (posedge efc_spc_fuse_clk1 or negedge reset_l) |
---|
| 827 | begin |
---|
| 828 | if (~reset_l) |
---|
| 829 | begin // async reset |
---|
| 830 | red0_ev_row[7:0] <= 8'b0; |
---|
| 831 | red1_ev_row[7:0] <= 8'b0; |
---|
| 832 | red2_ev_row[7:0] <= 8'b0; |
---|
| 833 | red3_ev_row[7:0] <= 8'b0; |
---|
| 834 | |
---|
| 835 | red0_od_row[7:0] <= 8'b0; |
---|
| 836 | red1_od_row[7:0] <= 8'b0; |
---|
| 837 | red2_od_row[7:0] <= 8'b0; |
---|
| 838 | red3_od_row[7:0] <= 8'b0; |
---|
| 839 | |
---|
| 840 | red0_ev_col[9:0] <= 10'b0; |
---|
| 841 | red1_ev_col[9:0] <= 10'b0; |
---|
| 842 | red2_ev_col[9:0] <= 10'b0; |
---|
| 843 | red3_ev_col[9:0] <= 10'b0; |
---|
| 844 | |
---|
| 845 | red0_od_col[9:0] <= 10'b0; |
---|
| 846 | red1_od_col[9:0] <= 10'b0; |
---|
| 847 | red2_od_col[9:0] <= 10'b0; |
---|
| 848 | red3_od_col[9:0] <= 10'b0; |
---|
| 849 | end // if (~reset_l) |
---|
| 850 | |
---|
| 851 | else if (fuse_icd_wren & reset_l) |
---|
| 852 | begin // 4:16 decode |
---|
| 853 | if (fuse_icd_rid[3:0] == 4'b0) |
---|
| 854 | begin |
---|
| 855 | red0_ev_row <= {fuse_icd_repair_en[1:0], |
---|
| 856 | fuse_icd_repair_value[5:0]}; |
---|
| 857 | end |
---|
| 858 | else if (fuse_icd_rid[3:0] == 4'b1) |
---|
| 859 | begin |
---|
| 860 | red0_od_row <= {fuse_icd_repair_en[1:0], |
---|
| 861 | fuse_icd_repair_value[5:0]}; |
---|
| 862 | end |
---|
| 863 | else if (fuse_icd_rid[3:0] == 4'b10) |
---|
| 864 | begin |
---|
| 865 | red0_ev_col <= {fuse_icd_repair_en[1:0], |
---|
| 866 | fuse_icd_repair_value[7:0]}; |
---|
| 867 | end |
---|
| 868 | else if (fuse_icd_rid[3:0] == 4'b11) |
---|
| 869 | begin |
---|
| 870 | red0_od_col <= {fuse_icd_repair_en[1:0], |
---|
| 871 | fuse_icd_repair_value[7:0]}; |
---|
| 872 | end |
---|
| 873 | |
---|
| 874 | // sub array 1 |
---|
| 875 | else if (fuse_icd_rid[3:0] == 4'b100) |
---|
| 876 | begin |
---|
| 877 | red1_ev_row <= {fuse_icd_repair_en[1:0], |
---|
| 878 | fuse_icd_repair_value[5:0]}; |
---|
| 879 | end |
---|
| 880 | else if (fuse_icd_rid[3:0] == 4'b101) |
---|
| 881 | begin |
---|
| 882 | red1_od_row <= {fuse_icd_repair_en[1:0], |
---|
| 883 | fuse_icd_repair_value[5:0]}; |
---|
| 884 | end |
---|
| 885 | else if (fuse_icd_rid[3:0] == 4'b110) |
---|
| 886 | begin |
---|
| 887 | red1_ev_col <= {fuse_icd_repair_en[1:0], |
---|
| 888 | fuse_icd_repair_value[7:0]}; |
---|
| 889 | end |
---|
| 890 | else if (fuse_icd_rid[3:0] == 4'b111) |
---|
| 891 | begin |
---|
| 892 | red1_od_col <= {fuse_icd_repair_en[1:0], |
---|
| 893 | fuse_icd_repair_value[7:0]}; |
---|
| 894 | end |
---|
| 895 | |
---|
| 896 | // sub array 2 |
---|
| 897 | else if (fuse_icd_rid[3:0] == 4'b1000) |
---|
| 898 | begin |
---|
| 899 | red2_ev_row <= {fuse_icd_repair_en[1:0], |
---|
| 900 | fuse_icd_repair_value[5:0]}; |
---|
| 901 | end |
---|
| 902 | else if (fuse_icd_rid[3:0] == 4'b1001) |
---|
| 903 | begin |
---|
| 904 | red2_od_row <= {fuse_icd_repair_en[1:0], |
---|
| 905 | fuse_icd_repair_value[5:0]}; |
---|
| 906 | end |
---|
| 907 | else if (fuse_icd_rid[3:0] == 4'b1010) |
---|
| 908 | begin |
---|
| 909 | red2_ev_col <= {fuse_icd_repair_en[1:0], |
---|
| 910 | fuse_icd_repair_value[7:0]}; |
---|
| 911 | end |
---|
| 912 | else if (fuse_icd_rid[3:0] == 4'b1011) |
---|
| 913 | begin |
---|
| 914 | red2_od_col <= {fuse_icd_repair_en[1:0], |
---|
| 915 | fuse_icd_repair_value[7:0]}; |
---|
| 916 | end |
---|
| 917 | |
---|
| 918 | // sub array 2 |
---|
| 919 | else if (fuse_icd_rid[3:0] == 4'b1100) |
---|
| 920 | begin |
---|
| 921 | red3_ev_row <= {fuse_icd_repair_en[1:0], |
---|
| 922 | fuse_icd_repair_value[5:0]}; |
---|
| 923 | end |
---|
| 924 | else if (fuse_icd_rid[3:0] == 4'b1101) |
---|
| 925 | begin |
---|
| 926 | red3_od_row <= {fuse_icd_repair_en[1:0], |
---|
| 927 | fuse_icd_repair_value[5:0]}; |
---|
| 928 | end |
---|
| 929 | else if (fuse_icd_rid[3:0] == 4'b1110) |
---|
| 930 | begin |
---|
| 931 | red3_ev_col <= {fuse_icd_repair_en[1:0], |
---|
| 932 | fuse_icd_repair_value[7:0]}; |
---|
| 933 | end |
---|
| 934 | else // if (fuse_icd_rid[3:0] == 4'b1111) |
---|
| 935 | begin |
---|
| 936 | red3_od_col <= {fuse_icd_repair_en[1:0], |
---|
| 937 | fuse_icd_repair_value[7:0]}; |
---|
| 938 | end |
---|
| 939 | end // if (fuse_icd_wren) |
---|
| 940 | end // always @ (... |
---|
| 941 | |
---|
| 942 | endmodule // bw_r_icd |
---|
| 943 | |
---|
| 944 | `endif |
---|