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

Subversion Repositories s1_core

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

powered by: WebSVN 2.1.0

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