OpenCores
URL https://opencores.org/ocsvn/s1_core/s1_core/trunk

Subversion Repositories s1_core

[/] [s1_core/] [trunk/] [hdl/] [rtl/] [sparc_core/] [bw_r_icd.v] - Blame information for rev 113

Details | Compare with Previous | View Log

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

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.