source: XOpenSparcT1/trunk/T1-CPU/lsu/lsu_tagdp.v @ 6

Revision 6, 7.7 KB checked in by pntsvt00, 13 years ago (diff)

versione iniziale opensparc

Line 
1// ========== Copyright Header Begin ==========================================
2//
3// OpenSPARC T1 Processor File: lsu_tagdp.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 ============================================
21module lsu_tagdp( /*AUTOARG*/
22   // Outputs
23   so, lsu_misc_rdata_w2, lsu_rd_dtag_parity_g, 
24   // Inputs
25   rclk, si, se, lsu_va_wtchpt_addr, lsu_va_wtchpt_sel_g, dva_vld_m, 
26   dtag_rdata_w0_m, dtag_rdata_w1_m, dtag_rdata_w2_m, 
27   dtag_rdata_w3_m, lsu_dtag_rsel_m, lsu_local_ldxa_data_g, 
28   lsu_local_ldxa_sel_g, lsu_tlb_rd_data, lsu_local_ldxa_tlbrd_sel_g, 
29   lsu_local_diagnstc_tagrd_sel_g
30   );
31
32   input         rclk;
33   input         si;
34   input         se;
35   output        so;
36   
37input [47:3]  lsu_va_wtchpt_addr ;
38input         lsu_va_wtchpt_sel_g;
39   
40input  [3:0]     dva_vld_m;       // valid array read
41input  [29:0]    dtag_rdata_w0_m; // 29b tag; 1b parity  from dtag
42input  [29:0]    dtag_rdata_w1_m; // 29b tag; 1b parity  from dtag
43input  [29:0]    dtag_rdata_w2_m; // 29b tag; 1b parity  from dtag
44input  [29:0]    dtag_rdata_w3_m; // 29b tag; 1b parity  from dtag
45input  [3:0]     lsu_dtag_rsel_m; // select one of the above tag  from ??
46
47input  [47:0]    lsu_local_ldxa_data_g; // from dctl
48input            lsu_local_ldxa_sel_g;  //used to mux ldxa data with 1/4 tags. from ??
49
50input  [63:0]    lsu_tlb_rd_data; // from tlbdp - used in local ldxa mux
51input            lsu_local_ldxa_tlbrd_sel_g;
52input            lsu_local_diagnstc_tagrd_sel_g;
53
54
55output [63:0]    lsu_misc_rdata_w2; // to qdp1
56output [3:0]     lsu_rd_dtag_parity_g; // parity check on 4 tags. to dctl
57
58
59wire             dtag_rdata_w0_parity_g,
60                 dtag_rdata_w1_parity_g,
61                 dtag_rdata_w2_parity_g,
62                 dtag_rdata_w3_parity_g;
63
64wire   [29:0]    dtag_rdata_sel_m,
65                 dtag_rdata_sel_g;
66
67
68wire   [3:0]     dtag_rdata_w0_8b_parity_m,
69                 dtag_rdata_w1_8b_parity_m,
70                 dtag_rdata_w2_8b_parity_m,
71                 dtag_rdata_w3_8b_parity_m;
72
73wire   [3:0]     dtag_rdata_w0_8b_parity_g,
74                 dtag_rdata_w1_8b_parity_g,
75                 dtag_rdata_w2_8b_parity_g,
76                 dtag_rdata_w3_8b_parity_g;
77
78wire    [63:0]   lsu_misc_rdata_g;
79
80wire             dtag_vld_sel_m, dtag_vld_sel_g;
81
82   wire  clk;
83   assign clk = rclk;
84   
85//=================================================================================================
86//      Select Tag Read data / ldxa data
87//=================================================================================================
88
89// select 1 out of 4 tags
90mux4ds  #(31) dtag_rdata_sel (
91        .in0    ({dtag_rdata_w0_m[29:0],dva_vld_m[0]}),
92        .in1    ({dtag_rdata_w1_m[29:0],dva_vld_m[1]}),
93        .in2    ({dtag_rdata_w2_m[29:0],dva_vld_m[2]}),
94        .in3    ({dtag_rdata_w3_m[29:0],dva_vld_m[3]}),
95        .sel0   (lsu_dtag_rsel_m[0]), 
96        .sel1   (lsu_dtag_rsel_m[1]),
97        .sel2   (lsu_dtag_rsel_m[2]), 
98        .sel3   (lsu_dtag_rsel_m[3]),
99        .dout   ({dtag_rdata_sel_m[29:0],dtag_vld_sel_m})
100);
101
102dff_s  #(31) dtag_rdata_sel_g_ff (
103           .din  ({dtag_rdata_sel_m[29:0],dtag_vld_sel_m}),
104           .q    ({dtag_rdata_sel_g[29:0],dtag_vld_sel_g}),
105           .clk  (clk),
106           .se   (se),       .si (),          .so ());
107
108mux4ds  #(64) lsu_misc_rdata_sel (
109        .in0    ({16'h0,lsu_local_ldxa_data_g[47:0]}),
110        .in1    (lsu_tlb_rd_data[63:0]),
111        .in2    ({16'h0,lsu_va_wtchpt_addr[47:3],3'b000}),                           
112        .in3    ({33'h0,dtag_rdata_sel_g[29:0],dtag_vld_sel_g}),
113        .sel0   (lsu_local_ldxa_sel_g), 
114        .sel1   (lsu_local_ldxa_tlbrd_sel_g),
115        .sel2   (lsu_va_wtchpt_sel_g),
116        .sel3   (lsu_local_diagnstc_tagrd_sel_g),
117        .dout   (lsu_misc_rdata_g[63:0])
118);
119
120dff_s  #(64) lsu_misc_rdata_w2_ff (
121           .din  (lsu_misc_rdata_g[63:0]),
122           .q    (lsu_misc_rdata_w2[63:0]),
123           .clk  (clk),
124           .se   (se),       .si (),          .so ());
125
126
127//=================================================================================================
128//      Tag Parity Calculation
129//=================================================================================================
130
131// flop tag parity bits
132dff_s  #(4) dtag_rdata_parity_g_ff (
133           .din  ({dtag_rdata_w0_m[29],
134                   dtag_rdata_w1_m[29],
135                   dtag_rdata_w2_m[29],
136                   dtag_rdata_w3_m[29]}),
137           .q    ({dtag_rdata_w0_parity_g,
138                   dtag_rdata_w1_parity_g,
139                   dtag_rdata_w2_parity_g,
140                   dtag_rdata_w3_parity_g}),
141           .clk  (clk),
142           .se   (se),       .si (),          .so ());
143
144
145// generate 8bit parity for all ways before g-flop
146assign  dtag_rdata_w0_8b_parity_m[0] = ^dtag_rdata_w0_m[7:0] ;
147assign  dtag_rdata_w0_8b_parity_m[1] = ^dtag_rdata_w0_m[15:8] ;
148assign  dtag_rdata_w0_8b_parity_m[2] = ^dtag_rdata_w0_m[23:16] ;
149assign  dtag_rdata_w0_8b_parity_m[3] = ^dtag_rdata_w0_m[28:24] ;
150
151assign  dtag_rdata_w1_8b_parity_m[0] = ^dtag_rdata_w1_m[7:0] ;
152assign  dtag_rdata_w1_8b_parity_m[1] = ^dtag_rdata_w1_m[15:8] ;
153assign  dtag_rdata_w1_8b_parity_m[2] = ^dtag_rdata_w1_m[23:16] ;
154assign  dtag_rdata_w1_8b_parity_m[3] = ^dtag_rdata_w1_m[28:24] ;
155
156assign  dtag_rdata_w2_8b_parity_m[0] = ^dtag_rdata_w2_m[7:0] ;
157assign  dtag_rdata_w2_8b_parity_m[1] = ^dtag_rdata_w2_m[15:8] ;
158assign  dtag_rdata_w2_8b_parity_m[2] = ^dtag_rdata_w2_m[23:16] ;
159assign  dtag_rdata_w2_8b_parity_m[3] = ^dtag_rdata_w2_m[28:24] ;
160
161assign  dtag_rdata_w3_8b_parity_m[0] = ^dtag_rdata_w3_m[7:0] ;
162assign  dtag_rdata_w3_8b_parity_m[1] = ^dtag_rdata_w3_m[15:8] ;
163assign  dtag_rdata_w3_8b_parity_m[2] = ^dtag_rdata_w3_m[23:16] ;
164assign  dtag_rdata_w3_8b_parity_m[3] = ^dtag_rdata_w3_m[28:24] ;
165
166
167// g-flop for 8-bit parity for all 4 ways
168
169dff_s  #(4) dtag_rdata_w0_8b_parity_g_ff (
170           .din  (dtag_rdata_w0_8b_parity_m[3:0]),
171           .q    (dtag_rdata_w0_8b_parity_g[3:0]),
172           .clk  (clk),
173           .se   (se),       .si (),          .so ());
174
175dff_s  #(4) dtag_rdata_w1_8b_parity_g_ff (
176           .din  (dtag_rdata_w1_8b_parity_m[3:0]),
177           .q    (dtag_rdata_w1_8b_parity_g[3:0]),
178           .clk  (clk),
179           .se   (se),       .si (),          .so ());
180
181dff_s  #(4) dtag_rdata_w2_8b_parity_g_ff (
182           .din  (dtag_rdata_w2_8b_parity_m[3:0]),
183           .q    (dtag_rdata_w2_8b_parity_g[3:0]),
184           .clk  (clk),
185           .se   (se),       .si (),          .so ());
186
187dff_s  #(4) dtag_rdata_w3_8b_parity_g_ff (
188           .din  (dtag_rdata_w3_8b_parity_m[3:0]),
189           .q    (dtag_rdata_w3_8b_parity_g[3:0]),
190           .clk  (clk),
191           .se   (se),       .si (),          .so ());
192
193
194assign  lsu_rd_dtag_parity_g[0]  =  ^({dtag_rdata_w0_8b_parity_g[3:0],dtag_rdata_w0_parity_g});
195assign  lsu_rd_dtag_parity_g[1]  =  ^({dtag_rdata_w1_8b_parity_g[3:0],dtag_rdata_w1_parity_g});
196assign  lsu_rd_dtag_parity_g[2]  =  ^({dtag_rdata_w2_8b_parity_g[3:0],dtag_rdata_w2_parity_g});
197assign  lsu_rd_dtag_parity_g[3]  =  ^({dtag_rdata_w3_8b_parity_g[3:0],dtag_rdata_w3_parity_g});
198
199endmodule
Note: See TracBrowser for help on using the repository browser.