Commit | Line | Data |
---|---|---|
86530b38 AT |
1 | // ========== Copyright Header Begin ========================================== |
2 | // | |
3 | // OpenSPARC T2 Processor File: niu_tdmc_mbox_context.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 | /********************************************************************* | |
36 | * | |
37 | * NIU TDMC - DMA Context for Mailbox Writes | |
38 | * | |
39 | * Orignal Author(s): Arvind Srinivasan | |
40 | * Modifier(s): | |
41 | * Project(s): Neptune | |
42 | * | |
43 | * Copyright (c) 2004 Sun Microsystems, Inc. | |
44 | * | |
45 | * All Rights Reserved. | |
46 | * | |
47 | * This verilog model is the confidential and proprietary property of | |
48 | * Sun Microsystems, Inc., and the possession or use of this model | |
49 | * requires a written license from Sun Microsystems, Inc. | |
50 | * | |
51 | **********************************************************************/ | |
52 | ||
53 | ||
54 | ||
55 | module niu_tdmc_mbox_context(/*AUTOARG*/ | |
56 | // Outputs | |
57 | send_mbox_dma, mbox_dma_data, mbox_dma_data_valid, | |
58 | mbox_dma_data_done, clear_cfg_dma_mb, set_cfg_dma_mmk, | |
59 | set_cfg_dma_mk, | |
60 | // Inputs | |
61 | SysClk, Reset_L, txc_dmc_dma_mark_bit, tx_cfg_dma_mk, | |
62 | tx_cfg_dma_mmk, tx_cfg_dma_enable_mb, tx_cs_dma, tx_dma_pre_st, | |
63 | tx_rng_head_dma, tx_rng_tail_dma, tx_dma_rng_err_logh, | |
64 | tx_dma_rng_err_logl, mbox_ack_dma_received, | |
65 | mbox_ack_dma_received_error, done_mbox_dma, mbox_dma_scheduled, | |
66 | meta_data_req | |
67 | ) ; | |
68 | ||
69 | input SysClk; | |
70 | input Reset_L; | |
71 | ||
72 | input txc_dmc_dma_mark_bit; | |
73 | input tx_cfg_dma_mk; | |
74 | input tx_cfg_dma_mmk; | |
75 | input tx_cfg_dma_enable_mb; | |
76 | ||
77 | ||
78 | ||
79 | // all the mailbox info | |
80 | input [63:0] tx_cs_dma; | |
81 | input [63:0] tx_dma_pre_st; | |
82 | input [`PTR_WIDTH:0] tx_rng_head_dma; | |
83 | input [`PTR_WIDTH:0] tx_rng_tail_dma; | |
84 | input [63:0] tx_dma_rng_err_logh; | |
85 | input [63:0] tx_dma_rng_err_logl; | |
86 | ||
87 | input mbox_ack_dma_received; | |
88 | input mbox_ack_dma_received_error; | |
89 | ||
90 | output send_mbox_dma; | |
91 | input done_mbox_dma; | |
92 | input mbox_dma_scheduled; | |
93 | ||
94 | output [127:0] mbox_dma_data; | |
95 | output mbox_dma_data_valid; | |
96 | output mbox_dma_data_done; | |
97 | ||
98 | output clear_cfg_dma_mb; | |
99 | output set_cfg_dma_mmk; | |
100 | output set_cfg_dma_mk; | |
101 | ||
102 | input meta_data_req; | |
103 | ||
104 | ||
105 | ||
106 | // | |
107 | ||
108 | // if(tx_cfg_dma_enable_mb & txc_dmc_dma_mark_bit & tx_cfg_dma_mk) | |
109 | // send_mbox_dma = 1; | |
110 | // if ( done_mbox_dma) clear_cfg_dma_mk; | |
111 | // if(mbox_dma_scheduled ) // should happen only when send_mbox_dma is set | |
112 | // copy the registers into a shadow registers | |
113 | // if another markbit is seen then set_cfg_dma_mmk = 1; | |
114 | // if( done_mbox_dma) set_pending_flag- | |
115 | // clear pending flag once ack is received and clear_cfg_dma_mk = 1; | |
116 | // if pending flag is set- and another markbit is seen- set mmk bit | |
117 | // | |
118 | // To generate data and data valid and complete signal | |
119 | // set count = 0 if(mbox_ is scheduled) | |
120 | // incr count everytime data_req is asserted and mbox is scheduled | |
121 | // for very request- send data and data valid out | |
122 | // decrement send counter and once it reached 0 generate complete signals | |
123 | parameter IDLE = 2'h0, | |
124 | SEND_DATA = 2'h1; | |
125 | ||
126 | ||
127 | ||
128 | reg [127:0] mbox_dma_data; | |
129 | reg mbox_dma_data_valid; | |
130 | reg mbox_dma_data_done; | |
131 | reg [1:0] send_state; | |
132 | reg done; | |
133 | reg [2:0] send_count; | |
134 | ||
135 | reg send_mbox_dma; | |
136 | reg pending_ack; | |
137 | reg set_cfg_dma_mmk; | |
138 | reg [63:0] sh_tx_cfg_dma_cs; | |
139 | reg [63:0] sh_tx_dma_pre_st; | |
140 | reg [`PTR_WIDTH:0] sh_tx_ring_dma_hdl; | |
141 | reg [`PTR_WIDTH:0] sh_tx_ring_dma_kick; | |
142 | reg [63:0] sh_tx_ring_dma_errlog; | |
143 | ||
144 | reg mbox_dma_scheduled_d; | |
145 | reg mmk_seen; | |
146 | reg set_cfg_dma_mk; | |
147 | reg shadow_mark_bit; | |
148 | ||
149 | ||
150 | //VCS coverage off | |
151 | ||
152 | // synopsys translate_off | |
153 | reg [192:1] SEND_STATE; | |
154 | always @(send_state) | |
155 | begin | |
156 | case(send_state) | |
157 | IDLE : SEND_STATE = "IDLE"; | |
158 | SEND_DATA:SEND_STATE = "SEND_DATA"; | |
159 | default : SEND_STATE = "UNKNOWN"; | |
160 | endcase | |
161 | end | |
162 | // synopsys translate_on | |
163 | //VCS coverage on | |
164 | ||
165 | ||
166 | ||
167 | ||
168 | always@(posedge SysClk) begin | |
169 | if(!Reset_L) | |
170 | mbox_dma_scheduled_d <= 1'b0; | |
171 | else mbox_dma_scheduled_d <= mbox_dma_scheduled; | |
172 | end // always@ (posedge SysClk) | |
173 | ||
174 | ||
175 | always@(posedge SysClk) begin | |
176 | if(!Reset_L) begin | |
177 | send_mbox_dma <= 1'b0; | |
178 | end else begin // if (!Reset_L) | |
179 | if(done_mbox_dma) | |
180 | send_mbox_dma <= 1'b0; | |
181 | else if(tx_cfg_dma_enable_mb & txc_dmc_dma_mark_bit & !pending_ack) begin | |
182 | send_mbox_dma <= 1'b1; | |
183 | end // if (tx_cfg_dma_enable_mb & txc_dmc_dma_mark_bit & tx_cfg_dma_mk & !pending_ack) | |
184 | end // else: !if(!Reset_L) | |
185 | end // always@ (posedge SysClk) | |
186 | ||
187 | assign clear_cfg_dma_mb = mbox_ack_dma_received; | |
188 | ||
189 | always@(posedge SysClk) begin | |
190 | if(!Reset_L) begin | |
191 | set_cfg_dma_mk <= 1'b0; | |
192 | end else begin // if (!Reset_L) | |
193 | if(tx_cfg_dma_enable_mb) begin | |
194 | set_cfg_dma_mk <= clear_cfg_dma_mb; | |
195 | end else begin | |
196 | set_cfg_dma_mk <= txc_dmc_dma_mark_bit; | |
197 | end // else: !if(tx_cfg_dma_enable_mb) | |
198 | end // else: !if(!Reset_L) | |
199 | end // always@ (posedge SysClk) | |
200 | ||
201 | ||
202 | always@(posedge SysClk) begin | |
203 | if(!Reset_L) begin | |
204 | set_cfg_dma_mmk <= 1'b0; | |
205 | end else begin | |
206 | set_cfg_dma_mmk <= ( mmk_seen & tx_cfg_dma_mk ) & ~set_cfg_dma_mmk; | |
207 | end | |
208 | end | |
209 | always@(posedge SysClk) begin | |
210 | if(!Reset_L) begin | |
211 | mmk_seen <= 1'b0; | |
212 | shadow_mark_bit <= 1'b0; | |
213 | end else begin | |
214 | /* | |
215 | mmk_seen <= (tx_cfg_dma_enable_mb & txc_dmc_dma_mark_bit & ( pending_ack | send_mbox_dma ) ) | | |
216 | ( ~tx_cfg_dma_enable_mb & txc_dmc_dma_mark_bit & tx_cfg_dma_mk) | | |
217 | (mmk_seen & ~tx_cfg_dma_mk); | |
218 | */ | |
219 | mmk_seen <= (txc_dmc_dma_mark_bit & tx_cfg_dma_mk) | shadow_mark_bit | (mmk_seen & ~tx_cfg_dma_mk); | |
220 | shadow_mark_bit <= txc_dmc_dma_mark_bit | ( shadow_mark_bit & ~tx_cfg_dma_mk); | |
221 | ||
222 | end // else: !if(!Reset_L) | |
223 | end // always@ (posedge SysClk) | |
224 | always@(posedge SysClk) begin | |
225 | if(!Reset_L) begin | |
226 | pending_ack <= 1'b0; | |
227 | end else if(done_mbox_dma) begin // if (!Reset_L) | |
228 | pending_ack <= 1'b1; | |
229 | end else if(mbox_ack_dma_received ) begin // if (done_mbox_dma) | |
230 | pending_ack <= 1'b0; | |
231 | end // if (mbox_ack_dma_received ) | |
232 | end // always@ (posedge SysClk) | |
233 | ||
234 | always@(posedge SysClk) begin | |
235 | if(mbox_dma_scheduled & !mbox_dma_scheduled_d) begin | |
236 | sh_tx_cfg_dma_cs <= tx_cs_dma ; | |
237 | sh_tx_ring_dma_hdl <= tx_rng_head_dma ; | |
238 | sh_tx_dma_pre_st <= tx_dma_pre_st ; | |
239 | sh_tx_ring_dma_kick <= tx_rng_tail_dma; | |
240 | sh_tx_ring_dma_errlog<= {tx_dma_rng_err_logh[31:0],tx_dma_rng_err_logl[31:0]} ; | |
241 | end // if (mbox_dma_scheduled & !mbox_dma_scheduled_d) | |
242 | end // always@ (posedge SysClk) | |
243 | ||
244 | // State machine to send these data to the Meta Bus- | |
245 | ||
246 | reg [2:0] req_count; | |
247 | always@(posedge SysClk) begin | |
248 | if(!Reset_L) begin | |
249 | req_count <= 3'h0; | |
250 | end else begin | |
251 | if(!mbox_dma_scheduled) req_count <= 3'h0; | |
252 | else if(mbox_dma_scheduled & meta_data_req) | |
253 | req_count<= req_count +1; | |
254 | end | |
255 | end | |
256 | ||
257 | always@(posedge SysClk) begin | |
258 | if(!Reset_L) begin | |
259 | send_state <= IDLE; | |
260 | send_count <= 3'h0; | |
261 | mbox_dma_data_valid <= 1'b0; | |
262 | mbox_dma_data_done <= 1'b0; | |
263 | end else begin | |
264 | case(send_state) | |
265 | IDLE: begin | |
266 | send_count <= 3'h0; | |
267 | mbox_dma_data_valid <= 1'b0; | |
268 | mbox_dma_data_done <= 1'b0; | |
269 | done <= 1'b0; | |
270 | if(mbox_dma_scheduled & meta_data_req) begin | |
271 | send_state <= SEND_DATA; | |
272 | done <= 1'b0; | |
273 | end // if (mbox_dma_scheduled & arb0_tdmc_data_req) | |
274 | end | |
275 | SEND_DATA: begin | |
276 | if(!done & (req_count <= send_count) ) begin | |
277 | mbox_dma_data <= 128'hfeedbeef_feedbeef_feedbeef_feedbeef; | |
278 | mbox_dma_data_valid <= 1'b0; | |
279 | end else if(!done) begin | |
280 | case(send_count) | |
281 | 3'h0: begin | |
282 | mbox_dma_data <= {sh_tx_cfg_dma_cs,sh_tx_dma_pre_st}; | |
283 | mbox_dma_data_valid <= 1'b1; | |
284 | mbox_dma_data_done <= 1'b0; | |
285 | end // case: 2'h0 | |
286 | 3'h1: begin | |
287 | mbox_dma_data <= {45'h0,2'h0,sh_tx_ring_dma_hdl, 45'h0, 2'h0,sh_tx_ring_dma_kick}; | |
288 | mbox_dma_data_valid <= 1'b1; | |
289 | mbox_dma_data_done <= 1'b0; | |
290 | end | |
291 | 3'h2: begin | |
292 | mbox_dma_data <= {sh_tx_ring_dma_errlog,64'h0}; | |
293 | mbox_dma_data_valid <= 1'b1; | |
294 | mbox_dma_data_done <= 1'b0; | |
295 | end // case: 3'h2 | |
296 | 3'h3: begin | |
297 | mbox_dma_data <= 128'h0; | |
298 | mbox_dma_data_valid <= 1'b1; | |
299 | mbox_dma_data_done <= 1'b1; | |
300 | done <= 1'b1; | |
301 | end | |
302 | default: begin | |
303 | mbox_dma_data <= 128'h0; | |
304 | mbox_dma_data_valid <= 1'b0; | |
305 | mbox_dma_data_done <= 1'b0; | |
306 | end | |
307 | endcase // case(send_count) | |
308 | send_count <= send_count + 3'h1; | |
309 | send_state <= SEND_DATA; | |
310 | end else begin | |
311 | send_state <= IDLE; | |
312 | mbox_dma_data <= 128'hfeedbeef_feedbeef_feedbeef_feedbeef; | |
313 | mbox_dma_data_valid <= 1'b0; | |
314 | end // else: !if(!done) | |
315 | end // case: SEND_DATA | |
316 | default: begin | |
317 | send_state <= IDLE; | |
318 | end | |
319 | endcase // case(send_state) | |
320 | end // else: !if(!Reset_L) | |
321 | end // always@ (posedge SysClk) | |
322 | ||
323 | ||
324 | ||
325 | ||
326 | endmodule | |
327 |