Initial commit of OpenSPARC T2 design and verification files.
[OpenSPARC-T2-DV] / design / sys / iop / niu / rtl / niu_tdmc_mbox_context.v
CommitLineData
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
55module 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
326endmodule
327