Initial commit of OpenSPARC T2 design and verification files.
[OpenSPARC-T2-DV] / design / sys / iop / niu / rtl / niu_rdmc_cache_acc_ctrl.v
CommitLineData
86530b38
AT
1// ========== Copyright Header Begin ==========================================
2//
3// OpenSPARC T2 Processor File: niu_rdmc_cache_acc_ctrl.v
4// Copyright (C) 1995-2007 Sun Microsystems, Inc. All Rights Reserved
5// 4150 Network Circle, Santa Clara, California 95054, U.S.A.
6//
7// * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
8//
9// This program is free software; you can redistribute it and/or modify
10// it under the terms of the GNU General Public License as published by
11// the Free Software Foundation; version 2 of the License.
12//
13// This program is distributed in the hope that it will be useful,
14// but WITHOUT ANY WARRANTY; without even the implied warranty of
15// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16// GNU General Public License for more details.
17//
18// You should have received a copy of the GNU General Public License
19// along with this program; if not, write to the Free Software
20// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
21//
22// For the avoidance of doubt, and except that if any non-GPL license
23// choice is available it will apply instead, Sun elects to use only
24// the General Public License version 2 (GPLv2) at this time for any
25// software where a choice of GPL license versions is made
26// available with the language indicating that GPLv2 or any later version
27// may be used, or where a choice of which version of the GPL is applied is
28// otherwise unspecified.
29//
30// Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
31// CA 95054 USA or visit www.sun.com if you need additional information or
32// have any questions.
33//
34// ========== Copyright Header End ============================================
35module niu_rdmc_cache_acc_ctrl (
36 clk,
37 reset,
38 cache_rd_req,
39 cache_rd_ptr0,
40 cache_rd_ptr1,
41 cache_rd_ptr2,
42 cache_rd_ptr3,
43 cache_rd_ptr4,
44 cache_rd_ptr5,
45 cache_rd_ptr6,
46 cache_rd_ptr7,
47 cache_rd_ptr8,
48 cache_rd_ptr9,
49 cache_rd_ptr10,
50 cache_rd_ptr11,
51 cache_rd_ptr12,
52 cache_rd_ptr13,
53 cache_rd_ptr14,
54 cache_rd_ptr15,
55 muxed_cache_rd_strobe_r,
56 cache_rd_data,
57 cache_wr_ptr0,
58 cache_wr_ptr1,
59 cache_wr_ptr2,
60 cache_wr_ptr3,
61 cache_wr_ptr4,
62 cache_wr_ptr5,
63 cache_wr_ptr6,
64 cache_wr_ptr7,
65 cache_wr_ptr8,
66 cache_wr_ptr9,
67 cache_wr_ptr10,
68 cache_wr_ptr11,
69 cache_wr_ptr12,
70 cache_wr_ptr13,
71 cache_wr_ptr14,
72 cache_wr_ptr15,
73 fetch_desp_resp_valid_array,
74 rdmc_resp_data_valid,
75
76
77 cache_wr_strobe,
78 cache_wr_addr,
79 cache_rd_strobe,
80 cache_rd_addr,
81 cache_buf_rd_gnt,
82 cache_rd_data_reg
83 );
84
85input clk;
86input reset;
87input[15:0] cache_rd_req;
88input[7:0] cache_rd_ptr0;
89input[7:0] cache_rd_ptr1;
90input[7:0] cache_rd_ptr2;
91input[7:0] cache_rd_ptr3;
92input[7:0] cache_rd_ptr4;
93input[7:0] cache_rd_ptr5;
94input[7:0] cache_rd_ptr6;
95input[7:0] cache_rd_ptr7;
96input[7:0] cache_rd_ptr8;
97input[7:0] cache_rd_ptr9;
98input[7:0] cache_rd_ptr10;
99input[7:0] cache_rd_ptr11;
100input[7:0] cache_rd_ptr12;
101input[7:0] cache_rd_ptr13;
102input[7:0] cache_rd_ptr14;
103input[7:0] cache_rd_ptr15;
104input muxed_cache_rd_strobe_r;
105input[147:0] cache_rd_data;
106input[7:0] cache_wr_ptr0;
107input[7:0] cache_wr_ptr1;
108input[7:0] cache_wr_ptr2;
109input[7:0] cache_wr_ptr3;
110input[7:0] cache_wr_ptr4;
111input[7:0] cache_wr_ptr5;
112input[7:0] cache_wr_ptr6;
113input[7:0] cache_wr_ptr7;
114input[7:0] cache_wr_ptr8;
115input[7:0] cache_wr_ptr9;
116input[7:0] cache_wr_ptr10;
117input[7:0] cache_wr_ptr11;
118input[7:0] cache_wr_ptr12;
119input[7:0] cache_wr_ptr13;
120input[7:0] cache_wr_ptr14;
121input[7:0] cache_wr_ptr15;
122input[15:0] fetch_desp_resp_valid_array;
123input rdmc_resp_data_valid;
124
125output cache_wr_strobe;
126output[7:0] cache_wr_addr;
127output cache_rd_strobe;
128output[7:0] cache_rd_addr;
129output[15:0] cache_buf_rd_gnt;
130output[147:0] cache_rd_data_reg;
131
132reg cycle0;
133reg cycle1;
134reg state;
135reg next_state;
136
137reg[15:0] token;
138reg[15:0] cache_buf_rd_gnt;
139reg cache_rd_strobe;
140reg[7:0] cache_rd_addr;
141reg[147:0] cache_rd_data_reg;
142
143reg cache_wr_strobe;
144reg[7:0] cache_wr_addr;
145
146wire[15:0] start_mask = 16'h1111;
147wire[3:0] start_slide_num;
148wire[15:0] start_mask_slide;
149wire is_req = |cache_rd_req;
150wire[15:0] right_req;
151wire[15:0] left_req;
152wire sel_left;
153wire[15:0] req_tmp;
154wire[15:0] pre_cache_rd_gnt;
155
156
157parameter
158C0 = 1'b0,
159C1 = 1'b1;
160
161always @ (state or is_req)
162begin
163 cycle0 = 1'b0;
164 cycle1 = 1'b0;
165
166case (state) //synopsys parallel_case full_case
167
168C0:
169begin
170 if (is_req)
171 begin
172 cycle0 = 1'b1;
173 next_state = C1;
174 end
175 else
176 next_state = state;
177end
178
179C1:
180begin
181 cycle1 = 1'b1;
182 next_state = C0;
183end
184
185default:
186 next_state = C0;
187
188endcase
189
190end
191
192always @ (posedge clk)
193if (reset)
194 state <= 1'b0;
195else
196 state <= next_state;
197
198
199/**********************/
200//Arbiter
201/**********************/
202niu_rdmc_encode_32 encode_32_inst_a (
203 .din (token),
204 .dout (start_slide_num)
205 );
206
207niu_rdmc_barrel_shl_32 barrel_shl_32_inst_a (
208 .din (start_mask),
209 .shift (start_slide_num),
210 .dout (start_mask_slide)
211 );
212
213assign right_req = cache_rd_req & ~start_mask_slide;
214assign left_req = cache_rd_req & start_mask_slide;
215
216assign sel_left = !(left_req == 16'b0);
217assign req_tmp = sel_left ? left_req : right_req;
218
219niu_rdmc_pri_encode_32 pri_encode_32_inst_a (
220 .din (req_tmp),
221 .dout (pre_cache_rd_gnt)
222 );
223
224always @ (posedge clk)
225if (reset)
226 token <= 16'h0001;
227else if (cycle0)
228 token <= {token[14:0], token[15]};
229else
230 token <= token;
231
232always @ (posedge clk)
233if (reset)
234 cache_buf_rd_gnt <= 16'h0;
235else if (cycle0)
236 cache_buf_rd_gnt <= pre_cache_rd_gnt;
237else
238 cache_buf_rd_gnt <= 16'h0;
239
240always @ (posedge clk)
241if (reset)
242 cache_rd_strobe <= 1'b0;
243else if (cycle1)
244 cache_rd_strobe <= 1'b1;
245else
246 cache_rd_strobe <= 1'b0;
247
248wire[7:0] cache_rd_addr_tmp = {8{cache_buf_rd_gnt[0]}} & cache_rd_ptr0 |
249 {8{cache_buf_rd_gnt[1]}} & cache_rd_ptr1 |
250 {8{cache_buf_rd_gnt[2]}} & cache_rd_ptr2 |
251 {8{cache_buf_rd_gnt[3]}} & cache_rd_ptr3 |
252 {8{cache_buf_rd_gnt[4]}} & cache_rd_ptr4 |
253 {8{cache_buf_rd_gnt[5]}} & cache_rd_ptr5 |
254 {8{cache_buf_rd_gnt[6]}} & cache_rd_ptr6 |
255 {8{cache_buf_rd_gnt[7]}} & cache_rd_ptr7 |
256 {8{cache_buf_rd_gnt[8]}} & cache_rd_ptr8 |
257 {8{cache_buf_rd_gnt[9]}} & cache_rd_ptr9 |
258 {8{cache_buf_rd_gnt[10]}} & cache_rd_ptr10 |
259 {8{cache_buf_rd_gnt[11]}} & cache_rd_ptr11 |
260 {8{cache_buf_rd_gnt[12]}} & cache_rd_ptr12 |
261 {8{cache_buf_rd_gnt[13]}} & cache_rd_ptr13 |
262 {8{cache_buf_rd_gnt[14]}} & cache_rd_ptr14 |
263 {8{cache_buf_rd_gnt[15]}} & cache_rd_ptr15;
264
265always @ (posedge clk)
266if (reset)
267 cache_rd_addr <= 8'b0;
268else if (cycle1)
269 cache_rd_addr <= cache_rd_addr_tmp;
270else
271 cache_rd_addr <= cache_rd_addr;
272
273
274always @ (posedge clk)
275if (reset)
276 cache_rd_data_reg <= 148'b0;
277else if (muxed_cache_rd_strobe_r)
278 cache_rd_data_reg <= cache_rd_data;
279else
280 cache_rd_data_reg <= cache_rd_data_reg;
281
282
283/********************/
284//Write addr gen
285/********************/
286
287wire[7:0] cache_wr_addr_tmp = {8{fetch_desp_resp_valid_array[0]}} & cache_wr_ptr0 |
288 {8{fetch_desp_resp_valid_array[1]}} & cache_wr_ptr1 |
289 {8{fetch_desp_resp_valid_array[2]}} & cache_wr_ptr2 |
290 {8{fetch_desp_resp_valid_array[3]}} & cache_wr_ptr3 |
291 {8{fetch_desp_resp_valid_array[4]}} & cache_wr_ptr4 |
292 {8{fetch_desp_resp_valid_array[5]}} & cache_wr_ptr5 |
293 {8{fetch_desp_resp_valid_array[6]}} & cache_wr_ptr6 |
294 {8{fetch_desp_resp_valid_array[7]}} & cache_wr_ptr7 |
295 {8{fetch_desp_resp_valid_array[8]}} & cache_wr_ptr8 |
296 {8{fetch_desp_resp_valid_array[9]}} & cache_wr_ptr9 |
297 {8{fetch_desp_resp_valid_array[10]}} & cache_wr_ptr10 |
298 {8{fetch_desp_resp_valid_array[11]}} & cache_wr_ptr11 |
299 {8{fetch_desp_resp_valid_array[12]}} & cache_wr_ptr12 |
300 {8{fetch_desp_resp_valid_array[13]}} & cache_wr_ptr13 |
301 {8{fetch_desp_resp_valid_array[14]}} & cache_wr_ptr14 |
302 {8{fetch_desp_resp_valid_array[15]}} & cache_wr_ptr15;
303
304always @ (posedge clk)
305if (reset)
306 cache_wr_addr <= 8'b0;
307else if (rdmc_resp_data_valid)
308 cache_wr_addr <= cache_wr_addr_tmp;
309else
310 cache_wr_addr <= cache_wr_addr;
311
312always @ (posedge clk)
313if (reset)
314 cache_wr_strobe <= 1'b0;
315else
316 cache_wr_strobe <= rdmc_resp_data_valid;
317
318
319endmodule
320
321