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

Subversion Repositories sparc64soc

[/] [sparc64soc/] [trunk/] [T1-CPU/] [tlu/] [tlu_mmu_dp.v] - Blame information for rev 2

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 2 dmitryr
// ========== Copyright Header Begin ==========================================
2
// 
3
// OpenSPARC T1 Processor File: tlu_mmu_dp.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
//      Description:    MMU Datapath - I & D.
24
*/
25
////////////////////////////////////////////////////////////////////////
26
// Global header file includes
27
////////////////////////////////////////////////////////////////////////
28
`include        "sys.h" // system level definition file which contains the 
29
                                        // time scale definition
30
 
31
////////////////////////////////////////////////////////////////////////
32
// Local header file includes / local defines
33
////////////////////////////////////////////////////////////////////////
34
 
35
`include "tlu.h"
36
 
37
//FPGA_SYN enables all FPGA related modifications
38
`ifdef FPGA_SYN
39
`define FPGA_SYN_CLK_EN
40
`define FPGA_SYN_CLK_DFF
41
`endif
42
 
43
module tlu_mmu_dp ( /*AUTOARG*/
44
   // Outputs
45
   tlu_dtsb_split_w2, tlu_dtsb_size_w2, tlu_dtag_access_w2,
46
   tlu_itsb_split_w2, tlu_itsb_size_w2,
47
   tlu_itlb_tte_tag_w2, tlu_itlb_tte_data_w2, tlu_dtlb_tte_tag_w2,
48
   tlu_dtlb_tte_data_w2, tlu_idtlb_dmp_key_g, tlu_dsfsr_flt_vld,
49
   tlu_isfsr_flt_vld, mra_wdata, tlu_ctxt_cfg_w2, tlu_tag_access_ctxt_g,
50
   lsu_exu_ldxa_data_g, so, tlu_tsb_base_w2_d1,
51
   // Inputs
52
   tlu_addr_msk_g, dmmu_any_sfsr_wr, dmmu_sfsr_wr_en_l, dmmu_sfar_wr_en_l,
53
   immu_any_sfsr_wr, immu_sfsr_wr_en_l, tlu_lng_ltncy_en_l,
54
   lsu_tlu_dside_ctxt_m, lsu_tlu_pctxt_m, tlu_tag_access_ctxt_sel_m,
55
   lsu_tlu_st_rs3_data_b63t59_g, lsu_tlu_st_rs3_data_b47t0_g,
56
   exu_lsu_ldst_va_e, tlu_idtsb_8k_ptr,lsu_tlu_tlb_dmp_va_m, ifu_tlu_pc_m,
57
   tlu_slxa_thrd_sel,
58
   tlu_tte_tag_g, tlu_dmp_key_vld_g, tlb_access_rst_l,
59
   tag_access_wdata_sel, mra_rdata, tlu_admp_key_sel,
60
   tlu_isfsr_din_g, tlu_dsfsr_din_g,
61
   tlu_tte_wr_pid_g, tlu_tte_real_g, tlu_ldxa_l1mx1_sel,
62
   tlu_ldxa_l1mx2_sel, tlu_ldxa_l2mx1_sel, rclk, grst_l, arst_l,
63
   tlu_tlb_tag_invrt_parity, tlu_tlb_data_invrt_parity, tlu_sun4r_tte_g,
64
   tlu_tsb_rd_ps0_sel, si, se, tlu_tlb_access_en_l_d1
65
   ) ;
66
 
67
/*AUTOINPUT*/
68
// Beginning of automatic inputs (from unused autoinst inputs)
69
// End of automatics
70
 
71
input                   tlu_addr_msk_g ;        // address masking active for thread in pipe.
72
input                   dmmu_any_sfsr_wr ;
73
input   [3:0]            dmmu_sfsr_wr_en_l ;
74
input   [3:0]            dmmu_sfar_wr_en_l ;
75
input                   immu_any_sfsr_wr ;
76
input   [3:0]           immu_sfsr_wr_en_l ;
77
input   [12:0]          lsu_tlu_dside_ctxt_m ;
78
input   [12:0]          lsu_tlu_pctxt_m ;
79
input   [2:0]            tlu_tag_access_ctxt_sel_m ;
80
// rs3_data split for vlint purposes.
81
input   [63:59]         lsu_tlu_st_rs3_data_b63t59_g ;
82
input   [47:0]           lsu_tlu_st_rs3_data_b47t0_g ;
83
input   [47:0]           exu_lsu_ldst_va_e ;
84
input   [47:0]          tlu_idtsb_8k_ptr ;
85
input   [47:13]         lsu_tlu_tlb_dmp_va_m ;
86
input   [47:13]         ifu_tlu_pc_m ;
87
input   [3:0]            tlu_slxa_thrd_sel ;
88
//input         [63:0]          int_tlu_asi_data;
89
//input                 int_tlu_asi_data_vld;
90
input   [2:0]            tlu_tte_tag_g ;
91
input   [4:0]            tlu_dmp_key_vld_g ;
92
//input                 tlb_access_en_l ;
93
input                   tlu_tlb_access_en_l_d1 ;
94
input                   tlb_access_rst_l ;
95
 
96
input   [2:0]            tag_access_wdata_sel ;
97
input   [155:6]         mra_rdata ;
98
 
99
input                   tlu_admp_key_sel ;
100
 
101
input   [23:0]           tlu_isfsr_din_g ;
102
input   [23:0]           tlu_dsfsr_din_g ;
103
 
104
input   [2:0]            tlu_tte_wr_pid_g ;      // thread selected pid
105
input                   tlu_tte_real_g ;        // tte is real          
106
 
107
input   [3:0]            tlu_ldxa_l1mx1_sel ;    // mmu ldxa level1 mx1 sel
108
input   [3:0]            tlu_ldxa_l1mx2_sel ;    // mmu ldxa level1 mx2 sel
109
input   [2:0]            tlu_ldxa_l2mx1_sel ;    // mmu ldxa level2 mx1 sel
110
input                   tlu_tlb_tag_invrt_parity ;      // invert parity for tag write
111
input                   tlu_tlb_data_invrt_parity ;     // invert parity for data write
112
input                   tlu_sun4r_tte_g ;       // sun4r vs. sun4v tte.
113
 
114
input                  tlu_lng_ltncy_en_l ;
115
 
116
input                  tlu_tsb_rd_ps0_sel ;
117
 
118
input                 rclk ;
119
input                 arst_l ;
120
input                 grst_l ;
121
input                 si ;
122
input                 se ;
123
 
124
output                        so ;
125
 
126
//output  [47:13]         tlu_dtsb_base_w2 ;    // represents ps0
127
output                  tlu_dtsb_split_w2 ;
128
output  [3:0]           tlu_dtsb_size_w2 ;
129
output  [47:13]         tlu_dtag_access_w2 ;    // used to represent both i/d.
130
//output  [47:13]         tlu_itsb_base_w2 ;    // represents ps1
131
output                  tlu_itsb_split_w2 ;
132
output  [3:0]           tlu_itsb_size_w2 ;
133
//output  [32:13]               tlu_itag_access_w2 ;    // to be obsoleted.
134
output  [58:0]           tlu_itlb_tte_tag_w2 ;
135
output  [42:0]           tlu_itlb_tte_data_w2 ;
136
output  [58:0]           tlu_dtlb_tte_tag_w2 ;
137
output  [42:0]           tlu_dtlb_tte_data_w2 ;
138
//output        [63:0]          tlu_lsu_ldxa_data_w2 ;
139
output  [5:0]           tlu_ctxt_cfg_w2 ;       // i/d context zero/non-zero config.
140
output  [40:0]           tlu_idtlb_dmp_key_g ;
141
 
142
 
143
output  [3:0]            tlu_dsfsr_flt_vld ;
144
output  [3:0]            tlu_isfsr_flt_vld ;
145
 
146
output  [12:0]           tlu_tag_access_ctxt_g ;
147
output  [63:0]           lsu_exu_ldxa_data_g ;
148
 
149
output  [47:13]         tlu_tsb_base_w2_d1 ;
150
 
151
///output       tlu_tag_access_nctxt_g ;                // tag-access contains nucleus context.
152
 
153
output  [155:0]          mra_wdata ;
154
 
155
wire    [47:0]           ldst_va_m,ldst_va_g ;
156
// st_rs3_data partitioned for vlint.
157
//wire  [63:0]          st_rs3_data_g ;
158
wire    [63:59]         st_rs3_data_b63t59_g ;
159
wire    [39:8]          st_rs3_data_b39t8_g ;
160
wire    [6:1]           st_rs3_data_b6t1_g ;
161
wire    [63:0]           tag_target ;
162
wire    [47:13]         dtag_access_w2 ;
163
wire    [23:0]           dsfsr,isfsr ;
164
wire    [23:0]           dsfsr0,isfsr0 ;
165
wire    [23:0]           dsfsr1,isfsr1 ;
166
wire    [23:0]           dsfsr2,isfsr2 ;
167
wire    [23:0]           dsfsr3,isfsr3 ;
168
wire    [47:0]           dsfar ;
169
wire    [47:0]           dsfar0,dsfar1 ;
170
wire    [47:0]           dsfar2,dsfar3 ;
171
wire    [23:0]           dsfsr_din ;
172
wire    [23:0]           isfsr_din ;
173
//wire  [39:22]         tte_relocated_pa ;
174
wire    [40:0]           dmp_key ;
175
wire    [47:0]           tag_access_w2 ;
176
wire    [41:0]           idtte_data_w2 ;
177
wire                    tlb_access0_clk, tlb_access1_clk ;
178
wire    [40:0]           idtlb_dmp_key_pend ;
179
wire    [47:0]           tag_access_wdata ;
180
wire    [12:0]           tag_access_ctxt_m,tag_access_ctxt_g ;
181
// buses split for vlint purposes.
182
wire    [58:55]         idtte_tag_b58t55_g ;
183
wire    [53:0]           idtte_tag_b53t0_g ;
184
wire    [58:55]         idtte_tag_b58t55_w2 ;
185
wire    [53:0]           idtte_tag_b53t0_w2 ;
186
wire    [41:0]           idtte_data_g ;
187
wire    [47:13]         tlb_dmp_va_g ;
188
wire    [47:0]   ldxa_l1mx1_dout_e ;
189
wire    [47:0]   ldxa_l1mx1_dout_m ;
190
 
191
 //=========================================================================================
192
 //    RESET/CLK
193
 //=========================================================================================
194
 
195
    wire       clk;
196
    assign     clk = rclk;
197
 
198
    wire       rst_l;
199
 
200
    dffrl_async rstff(.din (grst_l),
201
                      .q   (rst_l),
202
                      .clk (clk), .se(se), .si(), .so(),
203
                      .rst_l (arst_l));
204
 
205
 
206
//=========================================================================================
207
//      Staging
208
//=========================================================================================
209
 
210
// Stage
211
wire [47:13] pc_g ;
212
dff_s  #(35) stg_w (
213
        .din    (ifu_tlu_pc_m[47:13]),
214
        .q      (pc_g[47:13]),
215
        .clk    (clk),
216
        .se     (1'b0),       .si (),          .so ()
217
        );
218
 
219
//assign        pc_g[47:13] = ifu_tlu_pc_w[47:13] ;
220
 
221
// Stage va
222
dff_s  #(48) stg_m (
223
        .din    (exu_lsu_ldst_va_e[47:0]),
224
        .q      (ldst_va_m[47:0]),
225
        .clk    (clk),
226
        .se     (1'b0),       .si (),          .so ()
227
        );
228
 
229
dff_s  #(48) stg_g (
230
        .din    (ldst_va_m[47:0]),
231
        .q      (ldst_va_g[47:0]),
232
        .clk    (clk),
233
        .se     (1'b0),       .si (),          .so ()
234
        );
235
 
236
dff_s  #(35) dstg_g (
237
        .din    (lsu_tlu_tlb_dmp_va_m[47:13]),
238
        .q      (tlb_dmp_va_g[47:13]),
239
        .clk    (clk),
240
        .se     (1'b0),       .si (),          .so ()
241
        );
242
 
243
//=========================================================================================
244
 
245
wire [4:0] tlu_dmp_key_vld_d1 ;
246
wire [47:13] tlb_dmp_va_d1 ;
247
dff_s  #(40) dstg_d1 (
248
        .din    ({tlb_dmp_va_g[47:13],tlu_dmp_key_vld_g[4:0]}),
249
        .q      ({tlb_dmp_va_d1[47:13],tlu_dmp_key_vld_d1[4:0]}),
250
        .clk    (clk),
251
        .se     (1'b0),       .si (),          .so ()
252
        );
253
 
254
wire    [2:0]    tlu_tte_tag_d1,tlu_tte_wr_pid_d1 ;
255
wire            tlu_tte_real_d1,tlu_tlb_tag_invrt_parity_d1 ;
256
wire    [47:13] dmp_va_d1 ;
257
wire    [5:0]    dmp_key_vld_d1 ;
258
dp_mux2es #(41) dmp_key_sel (
259
                .in0    ({tlb_dmp_va_d1[47:13],tlu_dmp_key_vld_d1[4:0],tlu_tte_real_d1}),
260
                .in1    ({tag_access_w2[47:13],1'b1,tlu_tte_tag_d1[2:0],tlu_tte_real_d1,tlu_tte_real_d1}),
261
                //.in1  ({tag_access_w2[47:13],1'b1,tlu_tte_tag_d1[2:0],1'b0,tlu_tte_real_d1}), // Bug 3754
262
                .sel    (tlu_admp_key_sel),
263
                .dout   ({dmp_va_d1[47:13],dmp_key_vld_d1[5:0]})
264
        );
265
 
266
assign  dmp_key[40:0] =
267
        {
268
        dmp_va_d1[47:28],        // (20b)
269
        dmp_key_vld_d1[5],       // (1b)
270
        dmp_va_d1[27:22],        // (6b)
271
        dmp_key_vld_d1[4],       // (1b)
272
        dmp_va_d1[21:16],        // (6b)
273
        dmp_key_vld_d1[3],       // (1b)
274
        dmp_va_d1[15:13],        // (3b)
275
        dmp_key_vld_d1[2],       // (1b)
276
        dmp_key_vld_d1[1],       // (1b)
277
        dmp_key_vld_d1[0]        // (1b)
278
        } ;
279
 
280
 
281
//wire  tlb_access_en_l_d1 ;
282
wire    tlb_access2_clk ;
283
`ifdef FPGA_SYN_CLK_EN
284
`else
285
`ifdef FPGA_SYN_CLK_EN
286
`else
287
clken_buf clkbf_dmpky (
288
                .rclk   (clk),
289
                .enb_l  (tlu_tlb_access_en_l_d1),
290
                .tmb_l  (~se),
291
                .clk    (tlb_access2_clk)
292
                ) ;
293
`endif
294
`endif
295
 
296
// Advance by a cycle. Do not have to reset state.
297
`ifdef FPGA_SYN_CLK_DFF
298
dffrle_s  #(41) stg_w2 (
299
        .din    (dmp_key[40:0]),
300
        .q      (idtlb_dmp_key_pend[40:0]),
301
        .rst_l  (tlb_access_rst_l),
302
        .en (~(tlu_tlb_access_en_l_d1)), .clk(clk),
303
        .se     (1'b0),       .si (),          .so ()
304
        );
305
`else
306
`ifdef FPGA_SYN_CLK_DFF
307
dffrle_s  #(41) stg_w2 (
308
        .din    (dmp_key[40:0]),
309
        .q      (idtlb_dmp_key_pend[40:0]),
310
        .rst_l  (tlb_access_rst_l),
311
        .en (~(tlu_tlb_access_en_l_d1)), .clk(clk),
312
        .se     (1'b0),       .si (),          .so ()
313
        );
314
`else
315
dffrl_s  #(41) stg_w2 (
316
        .din    (dmp_key[40:0]),
317
        .q      (idtlb_dmp_key_pend[40:0]),
318
        .rst_l  (tlb_access_rst_l),
319
        .clk    (tlb_access2_clk),
320
        .se     (1'b0),       .si (),          .so ()
321
        );
322
`endif
323
`endif
324
 
325
assign  tlu_idtlb_dmp_key_g[40:0] = idtlb_dmp_key_pend[40:0] ;
326
 
327
 
328
//=========================================================================================
329
//      WR DATA FOR MRA
330
//=========================================================================================
331
 
332
// Format for each entry of MRA on a per thread basis.
333
// Current :
334
//      |       dtsb(48b)       |       dtag_access(48b)        |       dsfar(48b)      |       
335
//      |       itsb(48b)       |       itag_access(48b)        |                       |       
336
// New(Hyp,Legacy) : 8 tsb per thread instead of 2. dsfar removed.
337
// -This allows tag-access to be lined up with simultaneous reads of tsb
338
// -zero-ctxt and non-zero-ctxt tag-access will have to be distinguished either
339
// by doing a zero-detect on the lower 13b of the write-data or using a disinct asi.
340
//      |       zcps0_dtsb(48b) |       zcps1_dtsb(48b) |       zctxt_dtag_acc(48b) | dzctxt_cfg(6b) |
341
//      |       zcps0_itsb(48b) |       zcps1_itsb(48b) |       zctxt_itag_acc(48b) | izctxt_cfg(6b) |
342
//      |       nzcps0_dtsb(48b)|       nzcps1_dtsb(48b)|       nzctxt_dtag_acc(48b)| dnzctxt_cfg(6b)|
343
//      |       nzcps0_itsb(48b)|       nzcps1_itsb(48b)|       nzctxt_itag_acc(48b)| inzctxt_cfg(6b)|
344
 
345
mux3ds #(13)    tag_acc_ctxtmx(
346
                .in0    (lsu_tlu_pctxt_m[12:0]), // iside selects primary ctxt
347
                .in1    (13'd0),                 // iside selects nucleus ctxt
348
                .in2    (lsu_tlu_dside_ctxt_m[12:0]), // otherwise select dside ctxt
349
                .sel0   (tlu_tag_access_ctxt_sel_m[0]),
350
                .sel1   (tlu_tag_access_ctxt_sel_m[1]),
351
                .sel2   (tlu_tag_access_ctxt_sel_m[2]),
352
                .dout   (tag_access_ctxt_m[12:0])
353
        );
354
 
355
/*assign        tag_access_ctxt_m[12:0] =
356
        tlu_tag_access_ctxt_sel_m[0] ?  lsu_tlu_pctxt_m[12:0] :         // iside selects primary ctxt
357
                tlu_tag_access_ctxt_sel_m[1] ?  13'd0  :                // iside selects nucleus ctxt
358
                        tlu_tag_access_ctxt_sel_m[2] ? lsu_tlu_dside_ctxt_m[12:0] : 13'bx_xxxx_xxxx_xxxx ;                      // otherwise select dside ctxt
359
*/
360
 
361
dff_s  #(13) ctxt_stgg (
362
        .din    (tag_access_ctxt_m[12:0]),
363
        .q      (tag_access_ctxt_g[12:0]),
364
        .clk    (clk),
365
        .se     (1'b0),       .si (),          .so ()
366
        );
367
 
368
// pstate.am masking
369
wire    [15:0]   ldst_va_masked_g ;
370
assign  ldst_va_masked_g[15:0] = ldst_va_g[47:32] & {16{~tlu_addr_msk_g}} ;
371
 
372
mux3ds #(48)    dtag_access_dsel(
373
                .in0    ({ldst_va_masked_g[15:0],ldst_va_g[31:13],tag_access_ctxt_g[12:0]}), // dside hardware
374
                .in1    ({pc_g[47:13],tag_access_ctxt_g[12:0]}), // iside hardware
375
                .in2    (lsu_tlu_st_rs3_data_b47t0_g[47:0]),     // stxa,tsb write as an example.
376
                .sel0   (tag_access_wdata_sel[0]),
377
                .sel1   (tag_access_wdata_sel[1]),
378
                .sel2   (tag_access_wdata_sel[2]),
379
                .dout   (tag_access_wdata[47:0])
380
        );
381
 
382
// Determine whether context is nucleus or not.
383
//assign tlu_tag_access_nctxt_g = (tag_access_wdata[12:0] == 13'd0) ;
384
assign        tlu_tag_access_ctxt_g[12:0] = tag_access_ctxt_g[12:0] ;
385
 
386
wire    [47:0]   dsfar_wdata ;
387
dp_mux2es #(48) dsfar_dsel(
388
                .in0    ({ldst_va_masked_g[15:0],ldst_va_g[31:0]}), // dsfar;trap
389
                .in1    (lsu_tlu_st_rs3_data_b47t0_g[47:0]), // asi write
390
                .sel    (dmmu_any_sfsr_wr),
391
                .dout   (dsfar_wdata[47:0])
392
        );
393
 
394
// Warning for Grape Mapper - the number of bits may have to be changed to
395
// map implementation.
396
assign  mra_wdata[155:0] =
397
        // Bug 4676 - tsb rsrved field
398
        {lsu_tlu_st_rs3_data_b47t0_g[47:12],8'd0,
399
                lsu_tlu_st_rs3_data_b47t0_g[3:0],        //ps0 zctxt,nzctxt tsb
400
         lsu_tlu_st_rs3_data_b47t0_g[47:12],8'd0,
401
                lsu_tlu_st_rs3_data_b47t0_g[3:0],        //ps1 zctxt,nzctxt tsb
402
         tag_access_wdata[47:0],         //i/d tag-access
403
         lsu_tlu_st_rs3_data_b47t0_g[10:8],     //ps1 page size
404
         lsu_tlu_st_rs3_data_b47t0_g[2:0],       //ps0 page size
405
         6'd0};
406
 
407
 
408
//=========================================================================================
409
//      D-TAG ACCESS
410
//=========================================================================================
411
 
412
// 4 registers for the 4 threads.
413
// 35b of VA || 13b Ctxt.
414
// ** Ctxt is to be read as zero if there is no context associated with the access **
415
// VA will be sing-extended based on bit 47. 
416
 
417
// Update in w2.
418
assign  dtag_access_w2[47:13] = mra_rdata[`MRA_TACCESS_HI:`MRA_TACCESS_LO+13] ;
419
 
420
// Can this be shared with the i-side ?
421
assign  tlu_dtag_access_w2[47:13] = dtag_access_w2[47:13] ;
422
 
423
 
424
//=========================================================================================
425
//      I-TAG ACCESS
426
//=========================================================================================
427
 
428
// 4 registers for the 4 threads.
429
// 35b of VA || 13b Ctxt.
430
// ** Ctxt is to be read as zero if there is no context associated with the access **
431
// VA will be sing-extended based on bit 47. 
432
 
433
// Update in w2.
434
// SPARC_HPV_EN - This needs to be obsoleted. Common tag-access will be superimposed
435
// on dta_access bus.
436
 
437
//assign        itag_access_w2[32:13] = mra_rdata[`MRA_TACCESS_HI-15:`MRA_TACCESS_LO+13] ;
438
//assign        itag_access_w2[47:0] = mra_rdata[`MRA_TACCESS_HI:`MRA_TACCESS_LO] ;
439
 
440
//assign        tlu_itag_access_w2[32:13] = itag_access_w2[32:13] ;
441
 
442
 
443
//=========================================================================================
444
//      D-TAG TARGET
445
//=========================================================================================
446
 
447
// Tag Target is based on currently selected thread.
448
 
449
// Thread0,1,2,3
450
assign tag_target[63:0] =
451
        {3'b000,
452
        ldxa_l1mx1_dout_m[12:0], // Context
453
        //tag_access_w2[12:0],          // Context
454
        6'b000000,
455
        {16{ldxa_l1mx1_dout_m[47]}},    // Sign-extend VA[47]
456
        //{16{tag_access_w2[47]}},      // Sign-extend VA[47]
457
        ldxa_l1mx1_dout_m[47:22]};      // VA // Bug 3975.
458
        //tag_access_w2[47:22]};        // VA
459
 
460
//=========================================================================================
461
//      D-TSB
462
//=========================================================================================
463
 
464
// Note : on interface, dtsb represents ps0 tsbs, itsb represents ps1 tsbs. 
465
 
466
wire    [47:0]   tsb_ps0, tsb_ps1 ;
467
assign  tsb_ps0[47:0] = mra_rdata[`MRA_TSB_PS0_HI:`MRA_TSB_PS0_LO] ;
468
assign  tsb_ps1[47:0] = mra_rdata[`MRA_TSB_PS1_HI:`MRA_TSB_PS1_LO] ;
469
 
470
assign  tlu_dtsb_split_w2 = tsb_ps0[12] ;
471
// SPARC_HPV_EN - extend tsb_size by 1b.
472
assign  tlu_dtsb_size_w2[3:0] = tsb_ps0[3:0] ;
473
 
474
//=========================================================================================
475
//      CTXT CONFIG
476
//=========================================================================================
477
 
478
wire    [5:0]    ptr_ctxt_cfg ;
479
assign  tlu_ctxt_cfg_w2[5:0] =   mra_rdata[`MRA_CTXTCFG_HI:`MRA_CTXTCFG_LO] ;
480
 
481
dff_s  #(6) pctxt_stgm (
482
        .din    (mra_rdata[`MRA_CTXTCFG_HI:`MRA_CTXTCFG_LO]),
483
        .q      (ptr_ctxt_cfg[5:0]),
484
        .clk    (clk),
485
        .se     (1'b0),       .si (),          .so ()
486
        );
487
 
488
//=========================================================================================
489
//      I-TSB
490
//=========================================================================================
491
 
492
assign  tlu_itsb_split_w2 = tsb_ps1[12] ;
493
assign  tlu_itsb_size_w2[3:0] = tsb_ps1[3:0] ;
494
 
495
//=========================================================================================
496
//      STAGE TSB BASE FOR USE IN PTR CALCULATION
497
//=========================================================================================
498
 
499
wire    [47:13] tsb_base ;
500
assign  tsb_base[47:13] =
501
        tlu_tsb_rd_ps0_sel ? tsb_ps0[47:13] : tsb_ps1[47:13] ;
502
        //tlu_tsb_rd_ps0_sel ? dtsb[47:13] : itsb[47:13] ;
503
 
504
dff_s  #(35) tsbbase_stgm (
505
        .din    (tsb_base[47:13]),
506
        .q      (tlu_tsb_base_w2_d1[47:13]),
507
        .clk    (clk),
508
        .se     (1'b0),       .si (),          .so ()
509
        );
510
 
511
//=========================================================================================
512
//      8K and 64K Ptr
513
//=========================================================================================
514
 
515
// In MMU Control.
516
 
517
//=========================================================================================
518
//      Direct Ptr
519
//=========================================================================================
520
 
521
//=========================================================================================
522
//      I-/D TLB Fill : TTE Tag and Data.
523
//=========================================================================================
524
 
525
 
526
// TTE Tag is formed from Tag Access.
527
// TTE Data is formed from rs3_data for store.
528
 
529
// Timing needs to be fixed !!! Partition mode will add one more cycle
530
// to path. tlb write will occur in w3.
531
 
532
// partitioned for vlint purposes.
533
//assign        st_rs3_data_g[63:0] = lsu_tlu_st_rs3_data_g[63:0] ; 
534
assign  st_rs3_data_b63t59_g[63:59] = lsu_tlu_st_rs3_data_b63t59_g[63:59] ;
535
assign  st_rs3_data_b39t8_g[39:8] = lsu_tlu_st_rs3_data_b47t0_g[39:8] ;
536
assign  st_rs3_data_b6t1_g[6:1] = lsu_tlu_st_rs3_data_b47t0_g[6:1] ;
537
 
538
assign  tag_access_w2[47:0] = mra_rdata[`MRA_TACCESS_HI:`MRA_TACCESS_LO] ;
539
 
540
wire idtte_tag_vld_g,idtte_tag_vld_d1 ;
541
assign  idtte_tag_vld_g =
542
        st_rs3_data_b63t59_g[63] ;
543
wire idtte_tag_lock_g,idtte_tag_lock_d1 ;
544
assign  idtte_tag_lock_g =
545
        tlu_sun4r_tte_g ? st_rs3_data_b6t1_g[6] : st_rs3_data_b63t59_g[61] ;
546
 
547
`ifdef FPGA_SYN_CLK_EN
548
`else
549
`ifdef FPGA_SYN_CLK_EN
550
`else
551
clken_buf clkbf_idttetg (
552
                .rclk   (clk),
553
                .enb_l  (tlu_lng_ltncy_en_l),
554
                .tmb_l  (~se),
555
                .clk    (tlb_access3_clk)
556
                ) ;
557
`endif
558
`endif
559
 
560
// Stage some bits to match posedge rd for lng-lat reads of mra.
561
`ifdef FPGA_SYN_CLK_DFF
562
dffe_s  #(10) stgd1_idttetg (
563
        .din    ({idtte_tag_vld_g,idtte_tag_lock_g,tlu_tte_tag_g[2:0],
564
                tlu_tte_wr_pid_g[2:0],tlu_tte_real_g,tlu_tlb_tag_invrt_parity}),
565
        .q      ({idtte_tag_vld_d1,idtte_tag_lock_d1,tlu_tte_tag_d1[2:0],
566
                tlu_tte_wr_pid_d1[2:0],tlu_tte_real_d1,tlu_tlb_tag_invrt_parity_d1}),
567
        .en (~(tlu_lng_ltncy_en_l)), .clk(clk),
568
        .se     (1'b0),       .si (),          .so ()
569
        );
570
`else
571
`ifdef FPGA_SYN_CLK_DFF
572
dffe_s  #(10) stgd1_idttetg (
573
        .din    ({idtte_tag_vld_g,idtte_tag_lock_g,tlu_tte_tag_g[2:0],
574
                tlu_tte_wr_pid_g[2:0],tlu_tte_real_g,tlu_tlb_tag_invrt_parity}),
575
        .q      ({idtte_tag_vld_d1,idtte_tag_lock_d1,tlu_tte_tag_d1[2:0],
576
                tlu_tte_wr_pid_d1[2:0],tlu_tte_real_d1,tlu_tlb_tag_invrt_parity_d1}),
577
        .en (~(tlu_lng_ltncy_en_l)), .clk(clk),
578
        .se     (1'b0),       .si (),          .so ()
579
        );
580
`else
581
dff_s  #(10) stgd1_idttetg (
582
        .din    ({idtte_tag_vld_g,idtte_tag_lock_g,tlu_tte_tag_g[2:0],
583
                tlu_tte_wr_pid_g[2:0],tlu_tte_real_g,tlu_tlb_tag_invrt_parity}),
584
        .q      ({idtte_tag_vld_d1,idtte_tag_lock_d1,tlu_tte_tag_d1[2:0],
585
                tlu_tte_wr_pid_d1[2:0],tlu_tte_real_d1,tlu_tlb_tag_invrt_parity_d1}),
586
        .clk    (tlb_access3_clk),
587
        .se     (1'b0),       .si (),          .so ()
588
        );
589
`endif
590
`endif
591
 
592
// assumption is that tag_access_w2 gets delayed by a cycle because
593
// the rd is now posedge.
594
assign idtte_tag_b53t0_g[53:0] =
595
        {tag_access_w2[47:22],          // VA_tag       (26b)
596
        tlu_tte_tag_d1[2],              // 27:22 are valid (1b)
597
        idtte_tag_vld_d1,               // V            (1b) can be 0 or 1
598
        idtte_tag_lock_d1,              // L            (1b) 
599
        1'b1,                           // U            (1b) : must be set on write
600
        tag_access_w2[21:16],           // VA_tag       (6b)
601
        tlu_tte_tag_d1[1],              // 21:16 are valid (1b)
602
        tag_access_w2[15:13],           // VA_tag       (3b)
603
        tlu_tte_tag_d1[0],               // 15:13 are valid (1b)
604
        tag_access_w2[12:0]              // Ctxt b12:0   (13b)
605
                        };
606
 
607
assign  idtte_tag_b58t55_g[58:55] = {tlu_tte_wr_pid_d1[2:0],tlu_tte_real_d1};
608
// V and U bit omitted from tag as it can change once in tlb
609
// assign       idtte_tag_g[54] = 
610
// tlu_tlb_tag_invrt_parity_d1^(^{idtte_tag_g[58:55],idtte_tag_g[53:27],idtte_tag_g[25],idtte_tag_g[23:0]}) ;
611
 
612
// Additional page size bit does not have to be included. EP ? 
613
// SUN4R TTE
614
wire    [41:0]   idtte_data_sun4r_g ;
615
assign idtte_data_sun4r_g[41:0] =
616
        {st_rs3_data_b39t8_g[39:22],    // PA           (18b)
617
        ~tlu_tte_tag_g[2],              // 27:20 - mx sel (1b) : active-low
618
        st_rs3_data_b39t8_g[21:16],     // PA           (6b)
619
        ~tlu_tte_tag_g[1],              // 21:16 - mx sel (1b) : active-low
620
        st_rs3_data_b39t8_g[15:13],     // PA           (3b)
621
        ~tlu_tte_tag_g[0],               // 15:13 - mx sel (1b) : active-low
622
        st_rs3_data_b63t59_g[63],       // V            (1b)
623
        st_rs3_data_b63t59_g[60],       // NFO          (1b)
624
        st_rs3_data_b63t59_g[59],       // IE           (1b)
625
        st_rs3_data_b6t1_g[6],          // L            (1b)
626
        st_rs3_data_b6t1_g[5:4],        // CP/CV        (2b)
627
        st_rs3_data_b6t1_g[3],          // E            (1b)
628
        st_rs3_data_b6t1_g[2],          // P            (1b)
629
        st_rs3_data_b6t1_g[1],          // W            (1b)
630
        3'b000};                        // Spare        (3b)
631
// SUN4V TTE
632
wire    [41:0]   idtte_data_sun4v_g ;
633
assign idtte_data_sun4v_g[41:0] =
634
        {st_rs3_data_b39t8_g[39:22],    // PA           (18b)
635
        ~tlu_tte_tag_g[2],              // 27:20 - mx sel (1b) : active-low
636
        st_rs3_data_b39t8_g[21:16],     // PA           (6b)
637
        ~tlu_tte_tag_g[1],              // 21:16 - mx sel (1b) : active-low
638
        st_rs3_data_b39t8_g[15:13],     // PA           (3b)
639
        ~tlu_tte_tag_g[0],               // 15:13 - mx sel (1b) : active-low
640
        st_rs3_data_b63t59_g[63],       // V            (1b) // 4->63. Bug 2977
641
        st_rs3_data_b63t59_g[62],       // NFO          (1b) // 10->62
642
        st_rs3_data_b39t8_g[12],        // IE           (1b)
643
        st_rs3_data_b63t59_g[61],       // L            (1b)
644
        //1'b0,                         //// L(none)    (1b)
645
        st_rs3_data_b39t8_g[10:9],      // CP/CV        (2b) // 9:8 -> 10:9
646
        st_rs3_data_b39t8_g[11],        // E            (1b)
647
        st_rs3_data_b39t8_g[8],         // P            (1b) // 7->8
648
        st_rs3_data_b6t1_g[6],          // W            (1b) // 5->6
649
        3'b000};                        // Spare        (3b)
650
assign  idtte_data_g[41:0] =
651
        tlu_sun4r_tte_g ? idtte_data_sun4r_g[41:0] : idtte_data_sun4v_g[41:0];
652
 
653
// Generate Parity for tte data. Match to DP Macro.
654
//assign idtte_data_g[42] = tlu_tlb_data_invrt_parity^(^idtte_data_g[41:0]) ;
655
 
656
/*dff  #(1) stgd1_tlbacc (
657
        .din    (tlb_access_en_l),
658
        .q      (tlb_access_en_l_d1),
659
        .clk    (clk),
660
        .se     (1'b0),       .si (),          .so ()
661
        );*/
662
 
663
// flopping of tte-tag is delayed by a cycle,tte-data
664
// is not. wr-vld will match tte-tag.
665
`ifdef FPGA_SYN_CLK_EN
666
`else
667
`ifdef FPGA_SYN_CLK_EN
668
`else
669
clken_buf clkbf_ttetg (
670
                .rclk   (clk),
671
                .enb_l  (tlu_tlb_access_en_l_d1),
672
                .tmb_l  (~se),
673
                .clk    (tlb_access0_clk)
674
                ) ;
675
`endif
676
`endif
677
 
678
// Ship for write to TLB. Doesn't have to be resettable.
679
// Shorten by a bit, as parity will be generated based on output.
680
// Instead of removing the bit, use it for parity-invrt bit
681
// in section below.
682
/*dff  #(59) stgw2_ttetg (
683
        .din    (idtte_tag_g[58:0]),
684
        .q      (idtte_tag_w2[58:0]),
685
        .clk    (tlb_access0_clk),
686
        .se     (1'b0),       .si (),          .so ()
687
        ); */
688
 
689
`ifdef FPGA_SYN_CLK_DFF
690
dffe_s  #(58) stgw2_ttetg (
691
        .din    ({idtte_tag_b58t55_g[58:55],idtte_tag_b53t0_g[53:0]}),
692
        .q      ({idtte_tag_b58t55_w2[58:55],idtte_tag_b53t0_w2[53:0]}),
693
        .en (~(tlu_tlb_access_en_l_d1)), .clk(clk),
694
        .se     (1'b0),       .si (),          .so ()
695
        );
696
`else
697
`ifdef FPGA_SYN_CLK_DFF
698
dffe_s  #(58) stgw2_ttetg (
699
        .din    ({idtte_tag_b58t55_g[58:55],idtte_tag_b53t0_g[53:0]}),
700
        .q      ({idtte_tag_b58t55_w2[58:55],idtte_tag_b53t0_w2[53:0]}),
701
        .en (~(tlu_tlb_access_en_l_d1)), .clk(clk),
702
        .se     (1'b0),       .si (),          .so ()
703
        );
704
`else
705
dff_s  #(58) stgw2_ttetg (
706
        .din    ({idtte_tag_b58t55_g[58:55],idtte_tag_b53t0_g[53:0]}),
707
        .q      ({idtte_tag_b58t55_w2[58:55],idtte_tag_b53t0_w2[53:0]}),
708
        .clk    (tlb_access0_clk),
709
        .se     (1'b0),       .si (),          .so ()
710
        );
711
`endif
712
`endif
713
 
714
`ifdef FPGA_SYN_CLK_EN
715
`else
716
`ifdef FPGA_SYN_CLK_EN
717
`else
718
clken_buf clkbf_ttedt (
719
                .rclk   (clk),
720
                .enb_l  (tlu_lng_ltncy_en_l),
721
                //.enb_l  (tlb_access_en_l),
722
                .tmb_l  (~se),
723
                .clk    (tlb_access1_clk)
724
                ) ;
725
`endif
726
`endif
727
 
728
// Shorten by a bit, as parity will be generated based on output.
729
// Instead of removing the bit, use it for parity-invrt bit
730
// in section below.
731
/*dff  #(43) stgw2_ttedt (
732
        .din    (idtte_data_g[42:0]),
733
        .q      (idtte_data_w2[42:0]),
734
        .clk    (tlb_access1_clk),
735
        .se     (1'b0),       .si (),          .so ()
736
        );*/
737
 
738
`ifdef FPGA_SYN_CLK_DFF
739
dffe_s  #(42) stgw2_ttedt (
740
        .din    (idtte_data_g[41:0]),
741
        .q      (idtte_data_w2[41:0]),
742
        .en (~(tlu_lng_ltncy_en_l)), .clk(clk),
743
        .se     (1'b0),       .si (),          .so ()
744
        );
745
`else
746
`ifdef FPGA_SYN_CLK_DFF
747
dffe_s  #(42) stgw2_ttedt (
748
        .din    (idtte_data_g[41:0]),
749
        .q      (idtte_data_w2[41:0]),
750
        .en (~(tlu_lng_ltncy_en_l)), .clk(clk),
751
        .se     (1'b0),       .si (),          .so ()
752
        );
753
`else
754
dff_s  #(42) stgw2_ttedt (
755
        .din    (idtte_data_g[41:0]),
756
        .q      (idtte_data_w2[41:0]),
757
        .clk    (tlb_access1_clk),
758
        .se     (1'b0),       .si (),          .so ()
759
        );
760
`endif
761
`endif
762
 
763
wire    parity_tag,parity_data ;
764
wire    parity_tag_d1,parity_data_d1 ;
765
assign tlu_dtlb_tte_tag_w2[58:0] = {idtte_tag_b58t55_w2[58:55],parity_tag_d1,idtte_tag_b53t0_w2[53:0]} ;
766
assign tlu_itlb_tte_tag_w2[58:0] = {idtte_tag_b58t55_w2[58:55],parity_tag_d1,idtte_tag_b53t0_w2[53:0]} ;
767
assign tlu_dtlb_tte_data_w2[42:0] = {parity_data_d1,idtte_data_w2[41:0]} ;
768
assign tlu_itlb_tte_data_w2[42:0] = {parity_data_d1,idtte_data_w2[41:0]} ;
769
 
770
//=========================================================================================
771
//      PARITY GEN FOR TTE TAG & DATA
772
//=========================================================================================
773
 
774
// Timing Change : Since parity is not required until the write, and the write
775
// is preceeded by a auto-demap, the parity generation can be hidden in the
776
// cycle of auto-demap.
777
 
778
wire    tlu_tlb_tag_invrt_parity_d2,tlu_tlb_data_invrt_parity_d1 ;
779
 
780
`ifdef FPGA_SYN_CLK_DFF
781
dffe_s  #(1) stgw2_ttetgpar (
782
        .din    (tlu_tlb_tag_invrt_parity_d1),
783
        .q      (tlu_tlb_tag_invrt_parity_d2),
784
        .en (~(tlu_tlb_access_en_l_d1)), .clk(clk),
785
        .se     (1'b0),       .si (),          .so ()
786
        );
787
`else
788
`ifdef FPGA_SYN_CLK_DFF
789
dffe_s  #(1) stgw2_ttetgpar (
790
        .din    (tlu_tlb_tag_invrt_parity_d1),
791
        .q      (tlu_tlb_tag_invrt_parity_d2),
792
        .en (~(tlu_tlb_access_en_l_d1)), .clk(clk),
793
        .se     (1'b0),       .si (),          .so ()
794
        );
795
`else
796
dff_s  #(1) stgw2_ttetgpar (
797
        .din    (tlu_tlb_tag_invrt_parity_d1),
798
        .q      (tlu_tlb_tag_invrt_parity_d2),
799
        .clk    (tlb_access0_clk),
800
        .se     (1'b0),       .si (),          .so ()
801
        );
802
`endif
803
`endif
804
 
805
`ifdef FPGA_SYN_CLK_DFF
806
dffe_s  #(1) stgw2_ttedtpar (
807
        .din    (tlu_tlb_data_invrt_parity),
808
        .q      (tlu_tlb_data_invrt_parity_d1),
809
        .en (~(tlu_lng_ltncy_en_l)), .clk(clk),
810
        .se     (1'b0),       .si (),          .so ()
811
        );
812
`else
813
`ifdef FPGA_SYN_CLK_DFF
814
dffe_s  #(1) stgw2_ttedtpar (
815
        .din    (tlu_tlb_data_invrt_parity),
816
        .q      (tlu_tlb_data_invrt_parity_d1),
817
        .en (~(tlu_lng_ltncy_en_l)), .clk(clk),
818
        .se     (1'b0),       .si (),          .so ()
819
        );
820
`else
821
dff_s  #(1) stgw2_ttedtpar (
822
        .din    (tlu_tlb_data_invrt_parity),
823
        .q      (tlu_tlb_data_invrt_parity_d1),
824
        .clk    (tlb_access1_clk),
825
        .se     (1'b0),       .si (),          .so ()
826
        );
827
`endif
828
`endif
829
 
830
assign  parity_tag =
831
tlu_tlb_tag_invrt_parity_d2^(^{idtte_tag_b58t55_w2[58:55],
832
        idtte_tag_b53t0_w2[53:27],idtte_tag_b53t0_w2[25],idtte_tag_b53t0_w2[23:0]}) ;
833
assign parity_data = tlu_tlb_data_invrt_parity_d1^(^idtte_data_w2[41:0]) ;
834
//assign        idtte_tag_w2[54] = 
835
//tlu_tlb_tag_invrt_parity_d2^(^{idtte_tag_w2[58:55],idtte_tag_w2[53:27],idtte_tag_w2[25],idtte_tag_w2[23:0]}) ;
836
//assign idtte_data_w2[42] = tlu_tlb_data_invrt_parity_d1^(^idtte_data_w2[41:0]) ;
837
 
838
dff_s  #(2) stg_partd (
839
        .din    ({parity_tag,parity_data}),
840
        .q      ({parity_tag_d1,parity_data_d1}),
841
        .clk    (clk),
842
        .se     (1'b0),       .si (),          .so ()
843
        );
844
 
845
//=========================================================================================
846
//      D-SFAR
847
//=========================================================================================
848
 
849
// dsfar is written into mra for pre SPARC_HPV_EN changes. It will be written into flops
850
// for SPARC_HPV_EN. 
851
 
852
wire    [47:0]           dsfar_din ;
853
 
854
assign  dsfar_din[47:0] = dsfar_wdata[47:0] ;
855
 
856
wire    dsfar0_clk ;
857
`ifdef FPGA_SYN_CLK_EN
858
`else
859
`ifdef FPGA_SYN_CLK_EN
860
`else
861
clken_buf clkbf_dsfar0 (
862
                .rclk   (clk),
863
                .enb_l  (dmmu_sfar_wr_en_l[0]),
864
                .tmb_l  (~se),
865
                .clk    (dsfar0_clk)
866
                ) ;
867
`endif
868
`endif
869
 
870
// Thread0
871
`ifdef FPGA_SYN_CLK_DFF
872
dffe_s  #(48) dsfar0_ff (
873
        .din    (dsfar_din[47:0]),
874
        .q      (dsfar0[47:0]),
875
        .en (~(dmmu_sfar_wr_en_l[0])), .clk(clk),
876
        .se     (1'b0),       .si (),          .so ()
877
        );
878
`else
879
`ifdef FPGA_SYN_CLK_DFF
880
dffe_s  #(48) dsfar0_ff (
881
        .din    (dsfar_din[47:0]),
882
        .q      (dsfar0[47:0]),
883
        .en (~(dmmu_sfar_wr_en_l[0])), .clk(clk),
884
        .se     (1'b0),       .si (),          .so ()
885
        );
886
`else
887
dff_s  #(48) dsfar0_ff (
888
        .din    (dsfar_din[47:0]),
889
        .q      (dsfar0[47:0]),
890
        .clk    (dsfar0_clk),
891
        .se     (1'b0),       .si (),          .so ()
892
        );
893
`endif
894
`endif
895
 
896
 
897
wire    dsfar1_clk ;
898
`ifdef FPGA_SYN_CLK_EN
899
`else
900
`ifdef FPGA_SYN_CLK_EN
901
`else
902
clken_buf clkbf_dsfar1 (
903
                .rclk   (clk),
904
                .enb_l  (dmmu_sfar_wr_en_l[1]),
905
                .tmb_l  (~se),
906
                .clk    (dsfar1_clk)
907
                ) ;
908
`endif
909
`endif
910
 
911
// Thread1
912
`ifdef FPGA_SYN_CLK_DFF
913
dffe_s  #(48) dsfar1_ff (
914
        .din    (dsfar_din[47:0]),
915
        .q      (dsfar1[47:0]),
916
        .en (~(dmmu_sfar_wr_en_l[1])), .clk(clk),
917
        .se     (1'b0),       .si (),          .so ()
918
        );
919
`else
920
`ifdef FPGA_SYN_CLK_DFF
921
dffe_s  #(48) dsfar1_ff (
922
        .din    (dsfar_din[47:0]),
923
        .q      (dsfar1[47:0]),
924
        .en (~(dmmu_sfar_wr_en_l[1])), .clk(clk),
925
        .se     (1'b0),       .si (),          .so ()
926
        );
927
`else
928
dff_s  #(48) dsfar1_ff (
929
        .din    (dsfar_din[47:0]),
930
        .q      (dsfar1[47:0]),
931
        .clk    (dsfar1_clk),
932
        .se     (1'b0),       .si (),          .so ()
933
        );
934
`endif
935
`endif
936
 
937
wire    dsfar2_clk ;
938
`ifdef FPGA_SYN_CLK_EN
939
`else
940
`ifdef FPGA_SYN_CLK_EN
941
`else
942
clken_buf clkbf_dsfar2 (
943
                .rclk   (clk),
944
                .enb_l  (dmmu_sfar_wr_en_l[2]),
945
                .tmb_l  (~se),
946
                .clk    (dsfar2_clk)
947
                ) ;
948
`endif
949
`endif
950
 
951
// Thread2
952
`ifdef FPGA_SYN_CLK_DFF
953
dffe_s  #(48) dsfar2_ff (
954
        .din    (dsfar_din[47:0]),
955
        .q      (dsfar2[47:0]),
956
        .en (~(dmmu_sfar_wr_en_l[2])), .clk(clk),
957
        .se     (1'b0),       .si (),          .so ()
958
        );
959
`else
960
`ifdef FPGA_SYN_CLK_DFF
961
dffe_s  #(48) dsfar2_ff (
962
        .din    (dsfar_din[47:0]),
963
        .q      (dsfar2[47:0]),
964
        .en (~(dmmu_sfar_wr_en_l[2])), .clk(clk),
965
        .se     (1'b0),       .si (),          .so ()
966
        );
967
`else
968
dff_s  #(48) dsfar2_ff (
969
        .din    (dsfar_din[47:0]),
970
        .q      (dsfar2[47:0]),
971
        .clk    (dsfar2_clk),
972
        .se     (1'b0),       .si (),          .so ()
973
        );
974
`endif
975
`endif
976
 
977
 
978
wire    dsfar3_clk ;
979
`ifdef FPGA_SYN_CLK_EN
980
`else
981
`ifdef FPGA_SYN_CLK_EN
982
`else
983
clken_buf clkbf_dsfar3 (
984
                .rclk   (clk),
985
                .enb_l  (dmmu_sfar_wr_en_l[3]),
986
                .tmb_l  (~se),
987
                .clk    (dsfar3_clk)
988
                ) ;
989
`endif
990
`endif
991
 
992
// Thread3
993
`ifdef FPGA_SYN_CLK_DFF
994
dffe_s  #(48) dsfar3_ff (
995
        .din    (dsfar_din[47:0]),
996
        .q      (dsfar3[47:0]),
997
        .en (~(dmmu_sfar_wr_en_l[3])), .clk(clk),
998
        .se     (1'b0),       .si (),          .so ()
999
        );
1000
`else
1001
`ifdef FPGA_SYN_CLK_DFF
1002
dffe_s  #(48) dsfar3_ff (
1003
        .din    (dsfar_din[47:0]),
1004
        .q      (dsfar3[47:0]),
1005
        .en (~(dmmu_sfar_wr_en_l[3])), .clk(clk),
1006
        .se     (1'b0),       .si (),          .so ()
1007
        );
1008
`else
1009
dff_s  #(48) dsfar3_ff (
1010
        .din    (dsfar_din[47:0]),
1011
        .q      (dsfar3[47:0]),
1012
        .clk    (dsfar3_clk),
1013
        .se     (1'b0),       .si (),          .so ()
1014
        );
1015
`endif
1016
`endif
1017
 
1018
mux4ds #(48) dsfar_mx(
1019
        .in0(dsfar0[47:0]),
1020
        .in1(dsfar1[47:0]),
1021
        .in2(dsfar2[47:0]),
1022
        .in3(dsfar3[47:0]),
1023
        .sel0 (tlu_slxa_thrd_sel[0]),
1024
        .sel1 (tlu_slxa_thrd_sel[1]),
1025
        .sel2 (tlu_slxa_thrd_sel[2]),
1026
        .sel3 (tlu_slxa_thrd_sel[3]),
1027
        .dout(dsfar[47:0])
1028
);
1029
 
1030
 
1031
//=========================================================================================
1032
//      D-SFSR
1033
//=========================================================================================
1034
 
1035
 
1036
dp_mux2es #(24) dsfsr_wdsel(
1037
                .in0    (tlu_dsfsr_din_g[23:0]),
1038
                .in1    ({lsu_tlu_st_rs3_data_b47t0_g[23:16],   // stxa
1039
                         2'b00,lsu_tlu_st_rs3_data_b47t0_g[13:0]}),
1040
                // .in1 (lsu_tlu_st_rs3_data_b47t0_g[23:0]),    // Bug 4283
1041
                .sel    (dmmu_any_sfsr_wr),
1042
                .dout   (dsfsr_din[23:0])
1043
        );
1044
 
1045
wire    dsfsr0_clk ;
1046
`ifdef FPGA_SYN_CLK_EN
1047
`else
1048
`ifdef FPGA_SYN_CLK_EN
1049
`else
1050
clken_buf clkbf_dsfsr0 (
1051
                .rclk   (clk),
1052
                .enb_l  (dmmu_sfsr_wr_en_l[0]),
1053
                .tmb_l  (~se),
1054
                .clk    (dsfsr0_clk)
1055
                ) ;
1056
`endif
1057
`endif
1058
 
1059
// Thread0
1060
`ifdef FPGA_SYN_CLK_DFF
1061
dffe_s  #(23) dsfsr0_ff (
1062
        .din    (dsfsr_din[23:1]),
1063
        .q      (dsfsr0[23:1]),
1064
        .en (~(dmmu_sfsr_wr_en_l[0])), .clk(clk),
1065
        .se     (1'b0),       .si (),          .so ()
1066
        );
1067
`else
1068
`ifdef FPGA_SYN_CLK_DFF
1069
dffe_s  #(23) dsfsr0_ff (
1070
        .din    (dsfsr_din[23:1]),
1071
        .q      (dsfsr0[23:1]),
1072
        .en (~(dmmu_sfsr_wr_en_l[0])), .clk(clk),
1073
        .se     (1'b0),       .si (),          .so ()
1074
        );
1075
`else
1076
dff_s  #(23) dsfsr0_ff (
1077
        .din    (dsfsr_din[23:1]),
1078
        .q      (dsfsr0[23:1]),
1079
        .clk    (dsfsr0_clk),
1080
        .se     (1'b0),       .si (),          .so ()
1081
        );
1082
`endif
1083
`endif
1084
 
1085
`ifdef FPGA_SYN_CLK_DFF
1086
dffrle_s  #(1) dsfsr0vld_ff (
1087
        .din    (dsfsr_din[0]),
1088
        .q      (dsfsr0[0]),
1089
        .rst_l  (rst_l),
1090
        .en (~(dmmu_sfsr_wr_en_l[0])), .clk(clk),
1091
        .se     (1'b0),       .si (),          .so ()
1092
        );
1093
`else
1094
`ifdef FPGA_SYN_CLK_DFF
1095
dffrle_s  #(1) dsfsr0vld_ff (
1096
        .din    (dsfsr_din[0]),
1097
        .q      (dsfsr0[0]),
1098
        .rst_l  (rst_l),
1099
        .en (~(dmmu_sfsr_wr_en_l[0])), .clk(clk),
1100
        .se     (1'b0),       .si (),          .so ()
1101
        );
1102
`else
1103
dffrl_s  #(1) dsfsr0vld_ff (
1104
        .din    (dsfsr_din[0]),
1105
        .q      (dsfsr0[0]),
1106
        .rst_l  (rst_l),
1107
        .clk    (dsfsr0_clk),
1108
        .se     (1'b0),       .si (),          .so ()
1109
        );
1110
`endif
1111
`endif
1112
 
1113
assign  tlu_dsfsr_flt_vld[0] = dsfsr0[0] ;
1114
 
1115
wire    dsfsr1_clk ;
1116
`ifdef FPGA_SYN_CLK_EN
1117
`else
1118
`ifdef FPGA_SYN_CLK_EN
1119
`else
1120
clken_buf clkbf_dsfsr1 (
1121
                .rclk   (clk),
1122
                .enb_l  (dmmu_sfsr_wr_en_l[1]),
1123
                .tmb_l  (~se),
1124
                .clk    (dsfsr1_clk)
1125
                ) ;
1126
`endif
1127
`endif
1128
 
1129
// Thread1
1130
`ifdef FPGA_SYN_CLK_DFF
1131
dffe_s  #(23) dsfsr1_ff (
1132
        .din    (dsfsr_din[23:1]),
1133
        .q      (dsfsr1[23:1]),
1134
        .en (~(dmmu_sfsr_wr_en_l[1])), .clk(clk),
1135
        .se     (1'b0),       .si (),          .so ()
1136
        );
1137
`else
1138
`ifdef FPGA_SYN_CLK_DFF
1139
dffe_s  #(23) dsfsr1_ff (
1140
        .din    (dsfsr_din[23:1]),
1141
        .q      (dsfsr1[23:1]),
1142
        .en (~(dmmu_sfsr_wr_en_l[1])), .clk(clk),
1143
        .se     (1'b0),       .si (),          .so ()
1144
        );
1145
`else
1146
dff_s  #(23) dsfsr1_ff (
1147
        .din    (dsfsr_din[23:1]),
1148
        .q      (dsfsr1[23:1]),
1149
        .clk    (dsfsr1_clk),
1150
        .se     (1'b0),       .si (),          .so ()
1151
        );
1152
`endif
1153
`endif
1154
 
1155
`ifdef FPGA_SYN_CLK_DFF
1156
dffrle_s  #(1) dsfsr1vld_ff (
1157
        .din    (dsfsr_din[0]),
1158
        .q      (dsfsr1[0]),
1159
        .rst_l  (rst_l),
1160
        .en (~(dmmu_sfsr_wr_en_l[1])), .clk(clk),
1161
        .se     (1'b0),       .si (),          .so ()
1162
        );
1163
`else
1164
`ifdef FPGA_SYN_CLK_DFF
1165
dffrle_s  #(1) dsfsr1vld_ff (
1166
        .din    (dsfsr_din[0]),
1167
        .q      (dsfsr1[0]),
1168
        .rst_l  (rst_l),
1169
        .en (~(dmmu_sfsr_wr_en_l[1])), .clk(clk),
1170
        .se     (1'b0),       .si (),          .so ()
1171
        );
1172
`else
1173
dffrl_s  #(1) dsfsr1vld_ff (
1174
        .din    (dsfsr_din[0]),
1175
        .q      (dsfsr1[0]),
1176
        .rst_l  (rst_l),
1177
        .clk    (dsfsr1_clk),
1178
        .se     (1'b0),       .si (),          .so ()
1179
        );
1180
`endif
1181
`endif
1182
 
1183
assign  tlu_dsfsr_flt_vld[1] = dsfsr1[0] ;
1184
 
1185
wire    dsfsr2_clk ;
1186
`ifdef FPGA_SYN_CLK_EN
1187
`else
1188
`ifdef FPGA_SYN_CLK_EN
1189
`else
1190
clken_buf clkbf_dsfsr2 (
1191
                .rclk   (clk),
1192
                .enb_l  (dmmu_sfsr_wr_en_l[2]),
1193
                .tmb_l  (~se),
1194
                .clk    (dsfsr2_clk)
1195
                ) ;
1196
`endif
1197
`endif
1198
 
1199
// Thread2
1200
`ifdef FPGA_SYN_CLK_DFF
1201
dffe_s  #(23) dsfsr2_ff (
1202
        .din    (dsfsr_din[23:1]),
1203
        .q      (dsfsr2[23:1]),
1204
        .en (~(dmmu_sfsr_wr_en_l[2])), .clk(clk),
1205
        .se     (1'b0),       .si (),          .so ()
1206
        );
1207
`else
1208
`ifdef FPGA_SYN_CLK_DFF
1209
dffe_s  #(23) dsfsr2_ff (
1210
        .din    (dsfsr_din[23:1]),
1211
        .q      (dsfsr2[23:1]),
1212
        .en (~(dmmu_sfsr_wr_en_l[2])), .clk(clk),
1213
        .se     (1'b0),       .si (),          .so ()
1214
        );
1215
`else
1216
dff_s  #(23) dsfsr2_ff (
1217
        .din    (dsfsr_din[23:1]),
1218
        .q      (dsfsr2[23:1]),
1219
        .clk    (dsfsr2_clk),
1220
        .se     (1'b0),       .si (),          .so ()
1221
        );
1222
`endif
1223
`endif
1224
 
1225
`ifdef FPGA_SYN_CLK_DFF
1226
dffrle_s  #(1) dsfsr2vld_ff (
1227
        .din    (dsfsr_din[0]),
1228
        .q      (dsfsr2[0]),
1229
        .rst_l  (rst_l),
1230
        .en (~(dmmu_sfsr_wr_en_l[2])), .clk(clk),
1231
        .se     (1'b0),       .si (),          .so ()
1232
        );
1233
`else
1234
`ifdef FPGA_SYN_CLK_DFF
1235
dffrle_s  #(1) dsfsr2vld_ff (
1236
        .din    (dsfsr_din[0]),
1237
        .q      (dsfsr2[0]),
1238
        .rst_l  (rst_l),
1239
        .en (~(dmmu_sfsr_wr_en_l[2])), .clk(clk),
1240
        .se     (1'b0),       .si (),          .so ()
1241
        );
1242
`else
1243
dffrl_s  #(1) dsfsr2vld_ff (
1244
        .din    (dsfsr_din[0]),
1245
        .q      (dsfsr2[0]),
1246
        .rst_l  (rst_l),
1247
        .clk    (dsfsr2_clk),
1248
        .se     (1'b0),       .si (),          .so ()
1249
        );
1250
`endif
1251
`endif
1252
 
1253
assign  tlu_dsfsr_flt_vld[2] = dsfsr2[0] ;
1254
 
1255
wire    dsfsr3_clk ;
1256
`ifdef FPGA_SYN_CLK_EN
1257
`else
1258
`ifdef FPGA_SYN_CLK_EN
1259
`else
1260
clken_buf clkbf_dsfsr3 (
1261
                .rclk   (clk),
1262
                .enb_l  (dmmu_sfsr_wr_en_l[3]),
1263
                .tmb_l  (~se),
1264
                .clk    (dsfsr3_clk)
1265
                ) ;
1266
`endif
1267
`endif
1268
 
1269
// Thread3
1270
`ifdef FPGA_SYN_CLK_DFF
1271
dffe_s  #(23) dsfsr3_ff (
1272
        .din    (dsfsr_din[23:1]),
1273
        .q      (dsfsr3[23:1]),
1274
        .en (~(dmmu_sfsr_wr_en_l[3])), .clk(clk),
1275
        .se     (1'b0),       .si (),          .so ()
1276
        );
1277
`else
1278
`ifdef FPGA_SYN_CLK_DFF
1279
dffe_s  #(23) dsfsr3_ff (
1280
        .din    (dsfsr_din[23:1]),
1281
        .q      (dsfsr3[23:1]),
1282
        .en (~(dmmu_sfsr_wr_en_l[3])), .clk(clk),
1283
        .se     (1'b0),       .si (),          .so ()
1284
        );
1285
`else
1286
dff_s  #(23) dsfsr3_ff (
1287
        .din    (dsfsr_din[23:1]),
1288
        .q      (dsfsr3[23:1]),
1289
        .clk    (dsfsr3_clk),
1290
        .se     (1'b0),       .si (),          .so ()
1291
        );
1292
`endif
1293
`endif
1294
 
1295
`ifdef FPGA_SYN_CLK_DFF
1296
dffrle_s  #(1) dsfsr3vld_ff (
1297
        .din    (dsfsr_din[0]),
1298
        .q      (dsfsr3[0]),
1299
        .rst_l  (rst_l),
1300
        .en (~(dmmu_sfsr_wr_en_l[3])), .clk(clk),
1301
        .se     (1'b0),       .si (),          .so ()
1302
        );
1303
`else
1304
`ifdef FPGA_SYN_CLK_DFF
1305
dffrle_s  #(1) dsfsr3vld_ff (
1306
        .din    (dsfsr_din[0]),
1307
        .q      (dsfsr3[0]),
1308
        .rst_l  (rst_l),
1309
        .en (~(dmmu_sfsr_wr_en_l[3])), .clk(clk),
1310
        .se     (1'b0),       .si (),          .so ()
1311
        );
1312
`else
1313
dffrl_s  #(1) dsfsr3vld_ff (
1314
        .din    (dsfsr_din[0]),
1315
        .q      (dsfsr3[0]),
1316
        .rst_l  (rst_l),
1317
        .clk    (dsfsr3_clk),
1318
        .se     (1'b0),       .si (),          .so ()
1319
        );
1320
`endif
1321
`endif
1322
 
1323
assign  tlu_dsfsr_flt_vld[3] = dsfsr3[0] ;
1324
 
1325
dp_mux4ds #(24) dsfsr_msel(
1326
                .in0    (dsfsr0[23:0]),
1327
                .in1    (dsfsr1[23:0]),
1328
                .in2    (dsfsr2[23:0]),
1329
                .in3    (dsfsr3[23:0]),
1330
                .sel0_l (~tlu_slxa_thrd_sel[0]),
1331
                .sel1_l (~tlu_slxa_thrd_sel[1]),
1332
                .sel2_l (~tlu_slxa_thrd_sel[2]),
1333
                .sel3_l (~tlu_slxa_thrd_sel[3]),
1334
                .dout   (dsfsr[23:0])
1335
        );
1336
 
1337
//=========================================================================================
1338
//      I-SFSR
1339
//=========================================================================================
1340
 
1341
// Should be able to reduce the width of these regs !!!
1342
 
1343
 
1344
dp_mux2es #(24) isfsr_wdsel(
1345
                .in0    (tlu_isfsr_din_g[23:0]),
1346
                .in1    ({lsu_tlu_st_rs3_data_b47t0_g[23:16],   // stxa
1347
                         2'b00,lsu_tlu_st_rs3_data_b47t0_g[13:0]}),
1348
                //.in1  (lsu_tlu_st_rs3_data_b47t0_g[23:0]),    // Bug 4283
1349
                .sel    (immu_any_sfsr_wr),
1350
                .dout   (isfsr_din[23:0])
1351
        );
1352
 
1353
wire    isfsr0_clk ;
1354
`ifdef FPGA_SYN_CLK_EN
1355
`else
1356
`ifdef FPGA_SYN_CLK_EN
1357
`else
1358
clken_buf clkbf_isfsr0 (
1359
                .rclk   (clk),
1360
                .enb_l  (immu_sfsr_wr_en_l[0]),
1361
                .tmb_l  (~se),
1362
                .clk    (isfsr0_clk)
1363
                ) ;
1364
`endif
1365
`endif
1366
 
1367
// Thread0
1368
`ifdef FPGA_SYN_CLK_DFF
1369
dffe_s  #(23) isfsr0_ff (
1370
        .din    (isfsr_din[23:1]),
1371
        .q      (isfsr0[23:1]),
1372
        .en (~(immu_sfsr_wr_en_l[0])), .clk(clk),
1373
        .se     (1'b0),       .si (),          .so ()
1374
        );
1375
`else
1376
`ifdef FPGA_SYN_CLK_DFF
1377
dffe_s  #(23) isfsr0_ff (
1378
        .din    (isfsr_din[23:1]),
1379
        .q      (isfsr0[23:1]),
1380
        .en (~(immu_sfsr_wr_en_l[0])), .clk(clk),
1381
        .se     (1'b0),       .si (),          .so ()
1382
        );
1383
`else
1384
dff_s  #(23) isfsr0_ff (
1385
        .din    (isfsr_din[23:1]),
1386
        .q      (isfsr0[23:1]),
1387
        .clk    (isfsr0_clk),
1388
        .se     (1'b0),       .si (),          .so ()
1389
        );
1390
`endif
1391
`endif
1392
 
1393
// Chandra - This has changed.
1394
`ifdef FPGA_SYN_CLK_DFF
1395
dffrle_s  #(1) isfsrvld0_ff (
1396
        .din    (isfsr_din[0]),
1397
        .q      (isfsr0[0]),
1398
        .rst_l  (rst_l),      .en (~(immu_sfsr_wr_en_l[0])), .clk(clk),
1399
        .se     (1'b0),       .si (),          .so ()
1400
        );
1401
`else
1402
`ifdef FPGA_SYN_CLK_DFF
1403
dffrle_s  #(1) isfsrvld0_ff (
1404
        .din    (isfsr_din[0]),
1405
        .q      (isfsr0[0]),
1406
        .rst_l  (rst_l),      .en (~(immu_sfsr_wr_en_l[0])), .clk(clk),
1407
        .se     (1'b0),       .si (),          .so ()
1408
        );
1409
`else
1410
dffrl_s  #(1) isfsrvld0_ff (
1411
        .din    (isfsr_din[0]),
1412
        .q      (isfsr0[0]),
1413
        .rst_l  (rst_l),      .clk      (isfsr0_clk),
1414
        .se     (1'b0),       .si (),          .so ()
1415
        );
1416
`endif
1417
`endif
1418
 
1419
assign  tlu_isfsr_flt_vld[0] = isfsr0[0] ;
1420
 
1421
wire    isfsr1_clk ;
1422
`ifdef FPGA_SYN_CLK_EN
1423
`else
1424
`ifdef FPGA_SYN_CLK_EN
1425
`else
1426
clken_buf clkbf_isfsr1 (
1427
                .rclk   (clk),
1428
                .enb_l  (immu_sfsr_wr_en_l[1]),
1429
                .tmb_l  (~se),
1430
                .clk    (isfsr1_clk)
1431
                ) ;
1432
`endif
1433
`endif
1434
 
1435
// Thread1
1436
`ifdef FPGA_SYN_CLK_DFF
1437
dffe_s  #(23) isfsr1_ff (
1438
        .din    (isfsr_din[23:1]),
1439
        .q      (isfsr1[23:1]),
1440
        .en (~(immu_sfsr_wr_en_l[1])), .clk(clk),
1441
        .se     (1'b0),       .si (),          .so ()
1442
        );
1443
`else
1444
`ifdef FPGA_SYN_CLK_DFF
1445
dffe_s  #(23) isfsr1_ff (
1446
        .din    (isfsr_din[23:1]),
1447
        .q      (isfsr1[23:1]),
1448
        .en (~(immu_sfsr_wr_en_l[1])), .clk(clk),
1449
        .se     (1'b0),       .si (),          .so ()
1450
        );
1451
`else
1452
dff_s  #(23) isfsr1_ff (
1453
        .din    (isfsr_din[23:1]),
1454
        .q      (isfsr1[23:1]),
1455
        .clk    (isfsr1_clk),
1456
        .se     (1'b0),       .si (),          .so ()
1457
        );
1458
`endif
1459
`endif
1460
 
1461
// Chandra - This has changed.
1462
`ifdef FPGA_SYN_CLK_DFF
1463
dffrle_s  #(1) isfsrvld1_ff (
1464
        .din    (isfsr_din[0]),
1465
        .q      (isfsr1[0]),
1466
        .rst_l  (rst_l),                .en (~(immu_sfsr_wr_en_l[1])), .clk(clk),
1467
        .se     (1'b0),       .si (),          .so ()
1468
        );
1469
`else
1470
`ifdef FPGA_SYN_CLK_DFF
1471
dffrle_s  #(1) isfsrvld1_ff (
1472
        .din    (isfsr_din[0]),
1473
        .q      (isfsr1[0]),
1474
        .rst_l  (rst_l),                .en (~(immu_sfsr_wr_en_l[1])), .clk(clk),
1475
        .se     (1'b0),       .si (),          .so ()
1476
        );
1477
`else
1478
dffrl_s  #(1) isfsrvld1_ff (
1479
        .din    (isfsr_din[0]),
1480
        .q      (isfsr1[0]),
1481
        .rst_l  (rst_l),                .clk    (isfsr1_clk),
1482
        .se     (1'b0),       .si (),          .so ()
1483
        );
1484
`endif
1485
`endif
1486
 
1487
assign  tlu_isfsr_flt_vld[1] = isfsr1[0] ;
1488
 
1489
wire    isfsr2_clk ;
1490
`ifdef FPGA_SYN_CLK_EN
1491
`else
1492
`ifdef FPGA_SYN_CLK_EN
1493
`else
1494
clken_buf clkbf_isfsr2 (
1495
                .rclk   (clk),
1496
                .enb_l  (immu_sfsr_wr_en_l[2]),
1497
                .tmb_l  (~se),
1498
                .clk    (isfsr2_clk)
1499
                ) ;
1500
`endif
1501
`endif
1502
 
1503
// Thread2
1504
`ifdef FPGA_SYN_CLK_DFF
1505
dffe_s  #(23) isfsr2_ff (
1506
        .din    (isfsr_din[23:1]),
1507
        .q      (isfsr2[23:1]),
1508
        .en (~(immu_sfsr_wr_en_l[2])), .clk(clk),
1509
        .se     (1'b0),       .si (),          .so ()
1510
        );
1511
`else
1512
`ifdef FPGA_SYN_CLK_DFF
1513
dffe_s  #(23) isfsr2_ff (
1514
        .din    (isfsr_din[23:1]),
1515
        .q      (isfsr2[23:1]),
1516
        .en (~(immu_sfsr_wr_en_l[2])), .clk(clk),
1517
        .se     (1'b0),       .si (),          .so ()
1518
        );
1519
`else
1520
dff_s  #(23) isfsr2_ff (
1521
        .din    (isfsr_din[23:1]),
1522
        .q      (isfsr2[23:1]),
1523
        .clk    (isfsr2_clk),
1524
        .se     (1'b0),       .si (),          .so ()
1525
        );
1526
`endif
1527
`endif
1528
 
1529
// Chandra - This has changed.
1530
`ifdef FPGA_SYN_CLK_DFF
1531
dffrle_s  #(1) isfsrvld2_ff (
1532
        .din    (isfsr_din[0]),
1533
        .q      (isfsr2[0]),
1534
        .rst_l  (rst_l),        .en (~(immu_sfsr_wr_en_l[2])), .clk(clk),
1535
        .se     (1'b0),       .si (),          .so ()
1536
        );
1537
`else
1538
`ifdef FPGA_SYN_CLK_DFF
1539
dffrle_s  #(1) isfsrvld2_ff (
1540
        .din    (isfsr_din[0]),
1541
        .q      (isfsr2[0]),
1542
        .rst_l  (rst_l),        .en (~(immu_sfsr_wr_en_l[2])), .clk(clk),
1543
        .se     (1'b0),       .si (),          .so ()
1544
        );
1545
`else
1546
dffrl_s  #(1) isfsrvld2_ff (
1547
        .din    (isfsr_din[0]),
1548
        .q      (isfsr2[0]),
1549
        .rst_l  (rst_l),        .clk    (isfsr2_clk),
1550
        .se     (1'b0),       .si (),          .so ()
1551
        );
1552
`endif
1553
`endif
1554
 
1555
assign  tlu_isfsr_flt_vld[2] = isfsr2[0] ;
1556
 
1557
wire    isfsr3_clk ;
1558
`ifdef FPGA_SYN_CLK_EN
1559
`else
1560
`ifdef FPGA_SYN_CLK_EN
1561
`else
1562
clken_buf clkbf_isfsr3 (
1563
                .rclk   (clk),
1564
                .enb_l  (immu_sfsr_wr_en_l[3]),
1565
                .tmb_l  (~se),
1566
                .clk    (isfsr3_clk)
1567
                ) ;
1568
`endif
1569
`endif
1570
 
1571
// Thread3
1572
`ifdef FPGA_SYN_CLK_DFF
1573
dffe_s  #(23) isfsr3_ff (
1574
        .din    (isfsr_din[23:1]),
1575
        .q      (isfsr3[23:1]),
1576
        .en (~(immu_sfsr_wr_en_l[3])), .clk(clk),
1577
        .se     (1'b0),       .si (),          .so ()
1578
        );
1579
`else
1580
`ifdef FPGA_SYN_CLK_DFF
1581
dffe_s  #(23) isfsr3_ff (
1582
        .din    (isfsr_din[23:1]),
1583
        .q      (isfsr3[23:1]),
1584
        .en (~(immu_sfsr_wr_en_l[3])), .clk(clk),
1585
        .se     (1'b0),       .si (),          .so ()
1586
        );
1587
`else
1588
dff_s  #(23) isfsr3_ff (
1589
        .din    (isfsr_din[23:1]),
1590
        .q      (isfsr3[23:1]),
1591
        .clk    (isfsr3_clk),
1592
        .se     (1'b0),       .si (),          .so ()
1593
        );
1594
`endif
1595
`endif
1596
 
1597
// Chandra - This has changed.
1598
`ifdef FPGA_SYN_CLK_DFF
1599
dffrle_s  #(1) isfsrvld3_ff (
1600
        .din    (isfsr_din[0]),
1601
        .q      (isfsr3[0]),
1602
        .rst_l  (rst_l),        .en (~(immu_sfsr_wr_en_l[3])), .clk(clk),
1603
        .se     (1'b0),       .si (),          .so ()
1604
        );
1605
`else
1606
`ifdef FPGA_SYN_CLK_DFF
1607
dffrle_s  #(1) isfsrvld3_ff (
1608
        .din    (isfsr_din[0]),
1609
        .q      (isfsr3[0]),
1610
        .rst_l  (rst_l),        .en (~(immu_sfsr_wr_en_l[3])), .clk(clk),
1611
        .se     (1'b0),       .si (),          .so ()
1612
        );
1613
`else
1614
dffrl_s  #(1) isfsrvld3_ff (
1615
        .din    (isfsr_din[0]),
1616
        .q      (isfsr3[0]),
1617
        .rst_l  (rst_l),        .clk    (isfsr3_clk),
1618
        .se     (1'b0),       .si (),          .so ()
1619
        );
1620
`endif
1621
`endif
1622
 
1623
assign  tlu_isfsr_flt_vld[3] = isfsr3[0] ;
1624
 
1625
dp_mux4ds #(24) isfsr_msel(
1626
                .in0    (isfsr0[23:0]),
1627
                .in1    (isfsr1[23:0]),
1628
                .in2    (isfsr2[23:0]),
1629
                .in3    (isfsr3[23:0]),
1630
                .sel0_l (~tlu_slxa_thrd_sel[0]),
1631
                .sel1_l (~tlu_slxa_thrd_sel[1]),
1632
                .sel2_l (~tlu_slxa_thrd_sel[2]),
1633
                .sel3_l (~tlu_slxa_thrd_sel[3]),
1634
                .dout   (isfsr[23:0])
1635
        );
1636
 
1637
//=========================================================================================
1638
//      D-SFAR
1639
//=========================================================================================
1640
/*
1641
`ifdef SPARC_HPV_EN
1642
`else
1643
assign  dsfar[47:0] = mra_rdata[`MRA_DSFAR_HI:`MRA_DSFAR_LO];
1644
`endif
1645
*/
1646
 
1647
//=========================================================================================
1648
//      Muxing for ldxa read
1649
//=========================================================================================
1650
 
1651
// Note - collapse dtsb/itsb into one leg of the mux. Similar for
1652
// dtag_access/itag_access.
1653
// read of zcps1_itsb,zcps1_dtsb collapsed into read of dtsb.
1654
// read of nzcps0_dtsb,nzcps0_itsb collapsed into read of dtag_access.
1655
// read of nzcps1_dtsb,nzcps1_itsb collapsed into read of dsfar.
1656
 
1657
// use rs3 to return data.
1658
 
1659
//*****************************************************************
1660
//      SPARC_HPV_EN 
1661
//*****************************************************************
1662
 
1663
// Warning for Grape Mapper : Be careful about loading on replicated
1664
// msb.
1665
 
1666
// First Level, Mux 1
1667
// This is done in Estage to save on flops.
1668
// !!! The sels except b0 are also Estage !!! b0 is delayed by a cycle.
1669
mux3ds #(48) ldxa_l1mx1_e(
1670
                .in0(tsb_ps0[47:0]), // becomes ps0 tsb with SPARC_HPV_EN
1671
                .in1(tsb_ps1[47:0]), // becomes ps1 tsb with SPARC_HPV_EN
1672
                .in2(tag_access_w2[47:0]),
1673
                .sel0(tlu_ldxa_l1mx1_sel[1]),
1674
                .sel1(tlu_ldxa_l1mx1_sel[2]),
1675
                .sel2(tlu_ldxa_l1mx1_sel[3]),
1676
                .dout(ldxa_l1mx1_dout_e[47:0])
1677
);
1678
 
1679
// New
1680
dff_s  #(48) l1mx1_ff (
1681
        .din    (ldxa_l1mx1_dout_e[47:0]),
1682
        .q      (ldxa_l1mx1_dout_m[47:0]),
1683
        .clk    (clk),
1684
        .se     (1'b0),       .si (),          .so ()
1685
        );
1686
 
1687
wire [63:0] ldxa_l1mx1_dout_final ;
1688
 
1689
// New
1690
assign  ldxa_l1mx1_dout_final[63:0] =
1691
                // Note : this bit of the mx sel is stage delayed relative to the others.
1692
                tlu_ldxa_l1mx1_sel[0] ?
1693
                tag_target[63:0] : // tag_target.
1694
                {{16{ldxa_l1mx1_dout_m[47]}},ldxa_l1mx1_dout_m[47:0]} ; // tsb_ps0/ps1,tag_access
1695
 
1696
/*mux4ds #(64) ldxa_l1mx1(
1697
                .in0(tag_target[63:0]),
1698
                .in1({{16{tsb_ps0[47]}},tsb_ps0[47:0]}), // becomes ps0 tsb with SPARC_HPV_EN
1699
                .in2({{16{tsb_ps1[47]}},tsb_ps1[47:0]}), // becomes ps1 tsb with SPARC_HPV_EN
1700
                .in3({{16{tag_access_w2[47]}},tag_access_w2[47:0]}),
1701
                .sel0(tlu_ldxa_l1mx1_sel[0]),
1702
                .sel1(tlu_ldxa_l1mx1_sel[1]),
1703
                .sel2(tlu_ldxa_l1mx1_sel[2]),
1704
                .sel3(tlu_ldxa_l1mx1_sel[3]),
1705
                .dout(ldxa_l1mx1_dout[63:0])
1706
);*/
1707
 
1708
wire    [47:0]   ldxa_l1mx2_dout ;
1709
// First Level, Mux 2 - This is done in M stage.
1710
mux4ds #(48) ldxa_l1mx2(
1711
                .in0({24'd0,dsfsr[23:0]}),
1712
                .in1(dsfar[47:0]),
1713
                .in2({24'd0,isfsr[23:0]}),
1714
                .in3({37'd0,ptr_ctxt_cfg[5:3],5'd0,ptr_ctxt_cfg[2:0]}),
1715
                .sel0(tlu_ldxa_l1mx2_sel[0]),
1716
                .sel1(tlu_ldxa_l1mx2_sel[1]),
1717
                .sel2(tlu_ldxa_l1mx2_sel[2]),
1718
                .sel3(tlu_ldxa_l1mx2_sel[3]),
1719
                .dout(ldxa_l1mx2_dout[47:0])
1720
);
1721
 
1722
wire    [63:0]   tlu_ldxa_data_m ;
1723
mux3ds #(64)    ldxa_fmx (
1724
                .in0    (ldxa_l1mx1_dout_final[63:0]),
1725
                //.in0  (ldxa_l1mx1_dout[63:0]),
1726
                .in1    ({{16{ldxa_l1mx2_dout[47]}},ldxa_l1mx2_dout[47:0]}),
1727
                .in2    ({{16{tlu_idtsb_8k_ptr[47]}},tlu_idtsb_8k_ptr[47:0]}),
1728
                .sel0   (tlu_ldxa_l2mx1_sel[0]),
1729
                .sel1   (tlu_ldxa_l2mx1_sel[1]),
1730
                .sel2   (tlu_ldxa_l2mx1_sel[2]),
1731
                .dout   (tlu_ldxa_data_m[63:0])
1732
                //.dout (tlu_ldxa_data_e[63:0])
1733
        );
1734
 
1735
dff_s  #(64) stgg_eldxa (
1736
        .din    (tlu_ldxa_data_m[63:0]),
1737
        .q      (lsu_exu_ldxa_data_g[63:0]),
1738
        .clk    (clk),
1739
        .se     (1'b0),       .si (),          .so ()
1740
        );
1741
 
1742
endmodule
1743
 
1744
 

powered by: WebSVN 2.1.0

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