Initial commit of OpenSPARC T2 design and verification files.
[OpenSPARC-T2-DV] / design / sys / iop / niu / rtl / niu_smx_sm_req_siiarb.v
CommitLineData
86530b38
AT
1// ========== Copyright Header Begin ==========================================
2//
3// OpenSPARC T2 Processor File: niu_smx_sm_req_siiarb.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 ============================================
35
36module niu_smx_sm_req_siiarb(
37/*AUTOARG*/
38 // Outputs
39 wreq_cmdff_rd, wreq_pcmd_ff_rd, rdreq_cmdff_rd, xmitflag, rwflag,
40 hdr_data, bypass, o_enq, b_enq, arb_cs,
41 // Inputs
42 clk, reset_l, wreq_cmdff_rdata, wreq_cmdff_empty,
43 wreq_pcmd_ff_rdata, wreq_pcmd_ff_empty, rdreq_cmdff_rdata,
44 rdreq_cmdff_empty, nxt_xmit, ocr_avail, bcr_avail,
45 tid_valid_rdata_bus
46 );
47input clk;
48input reset_l;
49
50// wr cmdff if
51output wreq_cmdff_rd;
52input [65:0] wreq_cmdff_rdata;
53input wreq_cmdff_empty; // not use
54
55
56// wr pcmd ff if
57output wreq_pcmd_ff_rd;
58input [3:0] wreq_pcmd_ff_rdata;
59input wreq_pcmd_ff_empty; // use this as wr req empty status
60
61// rd cmdff if
62output rdreq_cmdff_rd;
63input [65:0] rdreq_cmdff_rdata;
64input rdreq_cmdff_empty;
65
66
67// siireq interface
68output xmitflag;
69output rwflag; // 0= rd, 1= wr
70output [128:0] hdr_data; // added 121405 [128] to invalidate rdreq
71output bypass;
72input nxt_xmit;
73
74// credit if
75input ocr_avail;
76input bcr_avail;
77output o_enq;
78output b_enq;
79
80
81output [1:0] arb_cs;
82
83// added 121405
84input [63:0] tid_valid_rdata_bus;
85
86
87parameter arb_s0= 2'h0,
88 arb_s1= 2'h1,
89 arb_s2= 2'h2,
90 arb_s3= 2'h3;
91
92// added 121405 - begin
93// wire [15:0] hdr_tag= rdreq_cmdff_rdata[`SMX_CMDFF_POS_ID];
94 // extract exact field to avoid vlint bus_notused warning
95wire [5:0] hdr_tid= rdreq_cmdff_rdata[56:51];
96wire tag_is_valid_n= tid_valid_rdata_bus[hdr_tid];
97// added 121405 - end
98
99wire rd_cmd_order= rdreq_cmdff_rdata[`SMX_CMDFF_POS_ORDER];
100wire rcmd_is_order_n= (rd_cmd_order==`SMX_CMD_ORDER);
101wire rcmd_is_bypass_n= (rd_cmd_order==`SMX_CMD_BYPASS);
102wire rd_cr_avail_n= (rcmd_is_order_n & ocr_avail) |
103 (rcmd_is_bypass_n & bcr_avail);
104wire rd_rdy_n= ~rdreq_cmdff_empty & rd_cr_avail_n;
105
106wire wr_cmd_order= wreq_cmdff_rdata[`SMX_CMDFF_POS_ORDER];
107wire wcmd_is_order_n= (wr_cmd_order==`SMX_CMD_ORDER);
108wire wcmd_is_bypass_n= (wr_cmd_order==`SMX_CMD_BYPASS);
109wire wr_cr_avail_n= (wcmd_is_order_n & ocr_avail) |
110 (wcmd_is_bypass_n & bcr_avail);
111wire wr_rdy_n= ~wreq_pcmd_ff_empty & wr_cr_avail_n;
112
113reg o_enq_n;
114wire o_enq= o_enq_n;
115reg b_enq_n;
116wire b_enq= b_enq_n;
117
118
119
120reg [1:0] arb_ns, arb_cs;
121reg wreq_cmdff_rd_n;
122reg wreq_pcmd_ff_rd_n;
123reg rdreq_cmdff_rd_n;
124reg set_xmitflag_n;
125reg rst_xmitflag_n;
126reg xmitflag;
127reg rwflag_n, rwflag;
128
129always @(/*AUTOSENSE*/`SMX_REQARB_RD or `SMX_REQARB_WR or arb_cs
130 or nxt_xmit or rcmd_is_bypass_n or rcmd_is_order_n
131 or rd_rdy_n or rwflag or tag_is_valid_n or wcmd_is_bypass_n
132 or wcmd_is_order_n or wr_rdy_n) begin
133 wreq_cmdff_rd_n= 1'b0;
134 wreq_pcmd_ff_rd_n= 1'b0;
135 rdreq_cmdff_rd_n= 1'b0;
136 set_xmitflag_n= 1'b0;
137 rst_xmitflag_n= 1'b0;
138 rwflag_n= rwflag; // 0= rd, 1= wr
139 o_enq_n= 1'b0;
140 b_enq_n= 1'b0;
141 arb_ns= arb_cs;
142 case (arb_cs)
143 arb_s0: begin // none chosen; rd first
144 if(rd_rdy_n) begin
145 arb_ns= arb_s1;
146 rdreq_cmdff_rd_n= 1'b1;
147 rwflag_n= `SMX_REQARB_RD;
148 set_xmitflag_n= 1'b1;
149 o_enq_n= rcmd_is_order_n & tag_is_valid_n; // q only if valid; (chg'd 121405)
150 b_enq_n= rcmd_is_bypass_n & tag_is_valid_n; // this will be dropped in siireq interface
151 end
152 else begin
153 if(wr_rdy_n) begin
154 arb_ns= arb_s2;
155 wreq_cmdff_rd_n= 1'b1;
156 wreq_pcmd_ff_rd_n= 1'b1;
157 rwflag_n= `SMX_REQARB_WR;
158 set_xmitflag_n= 1'b1;
159 o_enq_n= wcmd_is_order_n;
160 b_enq_n= wcmd_is_bypass_n;
161 end
162 else arb_ns= arb_cs; // no req; do nothing
163 end // !rd_rdy_n
164 end
165 arb_s1: begin // chosen, wait nxt_xmit, wr first
166 if(nxt_xmit) begin
167 if(wr_rdy_n) begin
168 arb_ns= arb_s2;
169 wreq_cmdff_rd_n= 1'b1;
170 wreq_pcmd_ff_rd_n= 1'b1;
171 rwflag_n= `SMX_REQARB_WR;
172 set_xmitflag_n= 1'b1;
173 o_enq_n= wcmd_is_order_n;
174 b_enq_n= wcmd_is_bypass_n;
175 end
176 else begin
177 if(rd_rdy_n) begin
178 arb_ns= arb_s1;
179 rdreq_cmdff_rd_n= 1'b1;
180 rwflag_n= `SMX_REQARB_RD;
181 set_xmitflag_n= 1'b1;
182 o_enq_n= rcmd_is_order_n & tag_is_valid_n;
183 b_enq_n= rcmd_is_bypass_n & tag_is_valid_n;
184 end
185 else begin // no req
186 arb_ns= arb_s3; // wr still first
187 rst_xmitflag_n= 1'b1;
188 end // !rd_rdy_n
189 end // !wr_rdy_n
190 end // nxt_xmit
191 end
192 arb_s2: begin // chosen, wait nxt_xmit, rd first
193 if(nxt_xmit) begin
194 if(rd_rdy_n) begin
195 arb_ns= arb_s1;
196 rdreq_cmdff_rd_n= 1'b1;
197 rwflag_n= `SMX_REQARB_RD;
198 set_xmitflag_n= 1'b1;
199 o_enq_n= rcmd_is_order_n & tag_is_valid_n;
200 b_enq_n= rcmd_is_bypass_n & tag_is_valid_n;
201 end
202 else begin
203 if(wr_rdy_n) begin
204 arb_ns= arb_s2;
205 wreq_cmdff_rd_n= 1'b1;
206 wreq_pcmd_ff_rd_n= 1'b1;
207 rwflag_n= `SMX_REQARB_WR;
208 set_xmitflag_n= 1'b1;
209 o_enq_n= wcmd_is_order_n;
210 b_enq_n= wcmd_is_bypass_n;
211 end
212 else begin // no req
213 arb_ns= arb_s0; // rd still first
214 rst_xmitflag_n= 1'b1;
215 end // !wr_rdy_n
216 end // !rd_rdy_n
217 end // nxt_xmit
218 end
219 arb_s3: begin // none chosen, wr first
220 if(wr_rdy_n) begin
221 arb_ns= arb_s2;
222 wreq_cmdff_rd_n= 1'b1;
223 wreq_pcmd_ff_rd_n= 1'b1;
224 rwflag_n= `SMX_REQARB_WR;
225 set_xmitflag_n= 1'b1;
226 o_enq_n= wcmd_is_order_n;
227 b_enq_n= wcmd_is_bypass_n;
228 end
229 else begin
230 if(rd_rdy_n) begin
231 arb_ns= arb_s1;
232 rdreq_cmdff_rd_n= 1'b1;
233 rwflag_n= `SMX_REQARB_RD;
234 set_xmitflag_n= 1'b1;
235 o_enq_n= rcmd_is_order_n & tag_is_valid_n;
236 b_enq_n= rcmd_is_bypass_n & tag_is_valid_n;
237 end
238 else arb_ns= arb_cs; // no req; do nothing
239 end // !wr_rdy_n
240 end
241 endcase
242end
243
244always @(posedge clk) begin
245 if(!reset_l) begin
246 arb_cs<= `SMX_PD arb_s0;
247 xmitflag<= `SMX_PD 1'b0;
248 rwflag<= `SMX_PD 1'b0;
249 end
250 else begin
251 arb_cs<= `SMX_PD arb_ns;
252 if(rst_xmitflag_n) xmitflag<= `SMX_PD 1'b0;
253 else if(set_xmitflag_n) xmitflag<= `SMX_PD 1'b1;
254 rwflag<= `SMX_PD rwflag_n;
255 end
256end
257
258wire [127:0] wr_hdr_data_n= {wreq_cmdff_rdata[`SMX_CMDFF_POS_CMD],
259 39'h0,
260 (wreq_cmdff_rdata[`SMX_CMDFF_POS_ERR] |
261 {2'h0, |wreq_pcmd_ff_rdata}), // propagate error
262 wreq_cmdff_rdata[`SMX_CMDFF_POS_ID],
263 24'h0,
264 wreq_cmdff_rdata[`SMX_CMDFF_POS_ADDR]};
265
266wire [127:0] rd_hdr_data_n= {rdreq_cmdff_rdata[`SMX_CMDFF_POS_CMD],
267 39'h0,
268 rdreq_cmdff_rdata[`SMX_CMDFF_POS_ERR],
269 rdreq_cmdff_rdata[`SMX_CMDFF_POS_ID],
270 24'h0,
271 rdreq_cmdff_rdata[`SMX_CMDFF_POS_ADDR]};
272reg [128:0] hdr_data;
273reg bypass;
274
275always @(posedge clk) begin
276 if(set_xmitflag_n) begin
277 hdr_data<= `SMX_PD (rwflag_n==`SMX_REQARB_WR)? {1'b1, wr_hdr_data_n} : {tag_is_valid_n, rd_hdr_data_n};
278 bypass<= `SMX_PD (rwflag_n==`SMX_REQARB_WR)? wcmd_is_bypass_n : rcmd_is_bypass_n;
279 end
280end
281
282wire wreq_cmdff_rd= wreq_cmdff_rd_n;
283wire wreq_pcmd_ff_rd= wreq_pcmd_ff_rd_n;
284wire rdreq_cmdff_rd= rdreq_cmdff_rd_n;
285
286endmodule
287
288