OpenCores
URL https://opencores.org/ocsvn/ht_tunnel/ht_tunnel/trunk

Subversion Repositories ht_tunnel

[/] [ht_tunnel/] [trunk/] [rtl/] [systemc/] [flow_control_l2/] [user_fifo_l3.cpp] - Blame information for rev 19

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 2 acastong
//user_fifo_l3.cpp
2
 
3
/* ***** BEGIN LICENSE BLOCK *****
4
 * Version: MPL 1.1
5
 *
6
 * The contents of this file are subject to the Mozilla Public License Version
7
 * 1.1 (the "License"); you may not use this file except in compliance with
8
 * the License. You may obtain a copy of the License at
9
 * http://www.mozilla.org/MPL/
10
 *
11
 * Software distributed under the License is distributed on an "AS IS" basis,
12
 * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
13
 * for the specific language governing rights and limitations under the
14
 * License.
15
 *
16
 * The Original Code is HyperTransport Tunnel IP Core.
17
 *
18
 * The Initial Developer of the Original Code is
19
 * Ecole Polytechnique de Montreal.
20
 * Portions created by the Initial Developer are Copyright (C) 2005
21
 * the Initial Developer. All Rights Reserved.
22
 *
23
 * Contributor(s):
24
 *   Ami Castonguay <acastong@grm.polymtl.ca>
25
 *
26
 * Alternatively, the contents of this file may be used under the terms
27
 * of the Polytechnique HyperTransport Tunnel IP Core Source Code License
28
 * (the  "PHTICSCL License", see the file PHTICSCL.txt), in which case the
29
 * provisions of PHTICSCL License are applicable instead of those
30
 * above. If you wish to allow use of your version of this file only
31
 * under the terms of the PHTICSCL License and not to allow others to use
32
 * your version of this file under the MPL, indicate your decision by
33
 * deleting the provisions above and replace them with the notice and
34
 * other provisions required by the PHTICSCL License. If you do not delete
35
 * the provisions above, a recipient may use your version of this file
36
 * under either the MPL or the PHTICSCL License."
37
 *
38
 * ***** END LICENSE BLOCK ***** */
39
 
40
#include "user_fifo_l3.h"
41
 
42
user_fifo_l3::user_fifo_l3(sc_module_name name) : sc_module(name){
43
        SC_METHOD(registered_process);
44
        sensitive_pos << clock;
45
        sensitive_neg << resetx;
46
 
47
        SC_METHOD(output_available_buffers);
48
        sensitive << buffer_count_posted << buffer_count_nposted << buffer_count_response;
49
 
50
}
51
 
52
 
53
void user_fifo_l3::registered_process(){
54
        if(!resetx.read()){
55
                for(int n = 0; n < USER_FIFO_DEPTH; n++){
56
                        packet_buffer_posted[n] = 0;
57
                        packet_buffer_nposted[n] = 0;
58
                        packet_buffer_response[n] = 0;
59
 
60
                        othervc_send_count_nposted[n] = 0;
61
                        othervc_send_count_posted[n] = 0;
62
 
63
                        posted_pointer_when_response_received[n];
64
                        posted_pointer_when_nposted_received[n];
65
                        response_after_posted[n];
66
                        nposted_after_posted[n];
67
                }
68
                write_pointer_posted = 0;
69
                write_pointer_nposted = 0;
70
                write_pointer_response = 0;
71
 
72
                read_pointer_posted = 0;
73
                read_pointer_nposted = 0;
74
                read_pointer_response = 0;
75
 
76
                buffer_count_posted = 0;
77
                buffer_count_nposted = 0;
78
                buffer_count_response = 0;
79
 
80
                fifo_user_packet = 0;
81
                fifo_user_available = false;
82
                fifo_user_packet_vc = VC_NONE;
83
                fifo_user_packet_dword = false;
84
                fifo_user_packet_data_asociated = false;
85
#ifdef RETRY_MODE_ENABLED
86
                fifo_user_packet_command = NOP;
87
#endif
88
                fifo_user_packet_data_count_m1 = 0;
89
                fifo_user_packet_isChain = false;
90
        }
91
        else{
92
 
93
                //***************************************************
94
                // Some generic calcuations
95
                //***************************************************
96
                sc_uint<USER_FIFO_ADDRESS_WIDTH> read_pointer_posted_p1;
97
                if(read_pointer_posted.read() == USER_FIFO_DEPTH - 1)
98
                        read_pointer_posted_p1 = 0;
99
                else
100
                        read_pointer_posted_p1 = (read_pointer_posted.read() + 1);
101
 
102
                sc_uint<USER_FIFO_ADDRESS_WIDTH> read_pointer_nposted_p1;
103
                if(read_pointer_nposted.read() == USER_FIFO_DEPTH - 1)
104
                        read_pointer_nposted_p1 = 0;
105
                else
106
                        read_pointer_nposted_p1 = (read_pointer_nposted.read() + 1);
107
 
108
                sc_uint<USER_FIFO_ADDRESS_WIDTH> read_pointer_response_p1;
109
                if(read_pointer_response.read() == USER_FIFO_DEPTH - 1)
110
                        read_pointer_response_p1 = 0;
111
                else
112
                        read_pointer_response_p1 = (read_pointer_response.read() + 1);
113
 
114
 
115
                /**
116
                        The next two sections deserve some explanation.  The signal that
117
                        consumes the output of this module comes VERY late, so we cannot
118
                        use it to calculate the next output...at least not at the beginning.
119
                        So we calculate for the possibility of it being 1 and 0.  A MUX
120
                        at then selects the correct output at the very end.
121
                */
122
 
123
                //**********************************************************
124
                // Select a packet to output if the output is not consummed
125
                //**********************************************************
126
 
127
                sc_bv<64> tmp_fifo_user_packet_nc;
128
                bool tmp_fifo_user_available_nc;
129
                VirtualChannel next_vc_output_nc;
130
 
131
                bool posted_loaded = buffer_count_posted.read() != 0;
132
                sc_bv<64> posted_packet = packet_buffer_posted[read_pointer_posted.read()];
133
                bool posted_max_count_reached = othervc_send_count_posted[read_pointer_posted.read()].read() ==
134
                        USER_FIFO_SHIFT_PRIORITY_MAX_COUNT;
135
 
136
                bool nposted_loaded = buffer_count_nposted.read() != 0;
137
                sc_bv<64> nposted_packet = packet_buffer_nposted[read_pointer_nposted.read()];
138
                bool nposted_behind_posted = nposted_after_posted[read_pointer_nposted.read()].read();
139
                bool nposted_max_count_reached = othervc_send_count_nposted[read_pointer_nposted.read()].read() ==
140
                        USER_FIFO_SHIFT_PRIORITY_MAX_COUNT;
141
 
142
                bool response_loaded = buffer_count_response.read() != 0;
143
                sc_bv<32> response_packet = packet_buffer_response[read_pointer_response.read()];
144
                bool response_behind_posted = response_after_posted[read_pointer_response.read()].read();
145
 
146
                tmp_fifo_user_available_nc =
147
                getNextPacketToOutput(posted_loaded, posted_packet,posted_max_count_reached,
148
                                                   nposted_loaded, nposted_packet,nposted_behind_posted,nposted_max_count_reached,
149
                                                   response_loaded, response_packet,response_behind_posted,
150
                                                   tmp_fifo_user_packet_nc,next_vc_output_nc);
151
 
152
                sc_bv<6> user_cmd_bits_nc;
153
                user_cmd_bits_nc = tmp_fifo_user_packet_nc.range(5,0);
154
                PacketCommand user_cmd_nc = getPacketCommand(user_cmd_bits_nc);
155
                //sc_uint<5> packet_size_with_data_m1_nc = getPacketSizeWithDatam1(tmp_fifo_user_packet_nc,user_cmd_nc);
156
 
157
                //**********************************************************
158
                // Select a packet to output if the output is consummed
159
                //**********************************************************
160
 
161
                sc_bv<64> tmp_fifo_user_packet_c;
162
                bool tmp_fifo_user_available_c;
163
                VirtualChannel next_vc_output_c;
164
 
165
                bool posted_loaded_c;
166
                sc_bv<64> posted_packet_c;
167
                bool posted_max_count_reached_c;
168
 
169
                if(fifo_user_packet_vc.read() == VC_POSTED){
170
                        posted_loaded_c
171
                                = buffer_count_posted.read() != 0 && buffer_count_posted.read() != 1;
172
                        posted_packet_c = packet_buffer_posted[read_pointer_posted_p1];
173
                        posted_max_count_reached_c = othervc_send_count_posted[read_pointer_posted_p1].read() ==
174
                                USER_FIFO_SHIFT_PRIORITY_MAX_COUNT;
175
                }
176
                else{
177
                        posted_loaded_c = buffer_count_posted.read() != 0;
178
                        posted_packet_c = packet_buffer_posted[read_pointer_posted.read()];
179
                        posted_max_count_reached_c = othervc_send_count_posted[read_pointer_posted.read()].read() ==
180
                                USER_FIFO_SHIFT_PRIORITY_MAX_COUNT;
181
                }
182
 
183
                bool nposted_loaded_c;
184
                sc_bv<64> nposted_packet_c;
185
                bool nposted_after_posted_c;
186
                bool nposted_max_count_reached_c;
187
 
188
                if(fifo_user_packet_vc.read() == VC_NON_POSTED){
189
                        nposted_loaded_c
190
                                = buffer_count_nposted.read() != 0 && buffer_count_nposted.read() != 1;
191
                        nposted_packet_c = packet_buffer_nposted[read_pointer_nposted_p1];
192
                        nposted_after_posted_c = nposted_after_posted[read_pointer_nposted_p1].read();
193
                        nposted_max_count_reached_c = othervc_send_count_posted[read_pointer_nposted_p1].read() ==
194
                                USER_FIFO_SHIFT_PRIORITY_MAX_COUNT;
195
                }
196
                else{
197
                        nposted_loaded_c = buffer_count_nposted.read() != 0;
198
                        nposted_packet_c = packet_buffer_nposted[read_pointer_nposted.read()];
199
                        nposted_after_posted_c = nposted_after_posted[read_pointer_nposted.read()].read();
200
                        nposted_max_count_reached_c = othervc_send_count_posted[read_pointer_nposted.read()].read() ==
201
                                USER_FIFO_SHIFT_PRIORITY_MAX_COUNT;
202
                }
203
 
204
                bool response_loaded_c;
205
                sc_bv<32> response_packet_c;
206
                bool response_after_posted_c;
207
 
208
                if(fifo_user_packet_vc.read() == VC_RESPONSE){
209
                        response_loaded_c
210
                                = buffer_count_response.read() != 0 && buffer_count_response.read() != 1;
211
                        response_packet_c = packet_buffer_response[read_pointer_response_p1];
212
                        response_after_posted_c = response_after_posted[read_pointer_nposted_p1].read();
213
                }
214
                else{
215
                        response_loaded_c = buffer_count_response.read() != 0;
216
                        response_packet_c = packet_buffer_response[read_pointer_response.read()];
217
                        response_after_posted_c = response_after_posted[read_pointer_response.read()].read();
218
                }
219
 
220
                tmp_fifo_user_available_c =
221
                getNextPacketToOutput(posted_loaded_c, posted_packet_c,posted_max_count_reached_c,
222
                                                   nposted_loaded_c, nposted_packet_c,nposted_after_posted_c,nposted_max_count_reached_c,
223
                                                   response_loaded_c, response_packet_c,response_after_posted_c,
224
                                                   tmp_fifo_user_packet_c,next_vc_output_c);
225
 
226
                sc_bv<6> user_cmd_bits_c;
227
                user_cmd_bits_c = tmp_fifo_user_packet_c.range(5,0);
228
                PacketCommand user_cmd_c = getPacketCommand(user_cmd_bits_c);
229
                //sc_uint<5> packet_size_with_data_m1_c = getPacketSizeWithDatam1(tmp_fifo_user_packet_c,user_cmd_c);
230
 
231
                //***************************************************
232
                // Output the packet 
233
                //***************************************************
234
 
235
                //Output the correct thing depending on if the output was consummed or not
236
                sc_uint<2> selector;
237
                selector[0] = consume_user_fifo.read();
238
                selector[1] = hold_user_fifo.read();
239
 
240
                switch(selector){
241
                case 1:
242
                        {
243
                        fifo_user_packet = tmp_fifo_user_packet_c;
244
                        fifo_user_available = tmp_fifo_user_available_c;
245
                        fifo_user_packet_vc = next_vc_output_c;
246
 
247
                        //Decode the packet here.  After performance analysis after synthesis,
248
                        //it is found that the fifo_user_packet is part of the critical path.
249
                        //To solve this, part of the packet decoding is pipelined, hence done
250
                        //here before storing the packet in registers
251
 
252
                        fifo_user_packet_dword = isDwordPacket(tmp_fifo_user_packet_c,user_cmd_c);
253
                        fifo_user_packet_data_asociated = hasDataAssociated(user_cmd_c);
254
#ifdef RETRY_MODE_ENABLED
255
                        fifo_user_packet_command = user_cmd_c;
256
#endif
257
                        fifo_user_packet_data_count_m1 = getDataLengthm1(sc_bv<64>(tmp_fifo_user_packet_c));
258
                        fifo_user_packet_isChain = isChain(tmp_fifo_user_packet_c);
259
                        }
260
                        break;
261
                case 0:
262
                        {
263
                        fifo_user_packet = tmp_fifo_user_packet_nc;
264
                        fifo_user_available = tmp_fifo_user_available_nc;
265
                        fifo_user_packet_vc = next_vc_output_nc;
266
 
267
                        //Decode the packet here.  After performance analysis after synthesis,
268
                        //it is found that the fifo_user_packet is part of the critical path.
269
                        //To solve this, part of the packet decoding is pipelined, hence done
270
                        //here before storing the packet in registers
271
                        fifo_user_packet_dword = isDwordPacket(tmp_fifo_user_packet_nc,user_cmd_nc);
272
                        fifo_user_packet_data_asociated = hasDataAssociated(user_cmd_nc);
273
#ifdef RETRY_MODE_ENABLED
274
                        fifo_user_packet_command = user_cmd_nc;
275
#endif
276
                        fifo_user_packet_data_count_m1 = getDataLengthm1(sc_bv<64>(tmp_fifo_user_packet_nc));
277
                        fifo_user_packet_isChain = isChain(tmp_fifo_user_packet_nc);
278
                        }
279
                        break;
280
                //Hold
281
                default:
282
                        //Everything stays the same
283
                        fifo_user_packet = fifo_user_packet;
284
                        fifo_user_available = fifo_user_available;
285
                        fifo_user_packet_vc = fifo_user_packet_vc;
286
                        fifo_user_packet_dword = fifo_user_packet_dword;
287
                        fifo_user_packet_data_asociated = fifo_user_packet_data_asociated;
288
#ifdef RETRY_MODE_ENABLED
289
                        fifo_user_packet_command = fifo_user_packet_command;
290
#endif
291
                        fifo_user_packet_data_count_m1 = fifo_user_packet_data_count_m1;
292
                        fifo_user_packet_isChain = fifo_user_packet_isChain;
293
                }
294
 
295
 
296
                //*********************************************
297
                // Update the actual fifos
298
                //*********************************************
299
                PacketCommand in_cmd = getPacketCommand(ui_packet_fc.read().range(5,0));
300
                VirtualChannel in_vc = getVirtualChannel(ui_packet_fc.read(), in_cmd);
301
                bool in_data = hasDataAssociated(in_cmd);
302
 
303
 
304
                /// UPDATE THE PASS COUNT BIT ///
305
                //Start by updating "othervc send count" registers.  What is calculated
306
                //is overriden by code below if it is for a position that is being
307
                //written to by a new packet arriving
308
                for(int n = 0; n < USER_FIFO_DEPTH; n++){
309
                        if(!response_after_posted[n].read() && consume_user_fifo.read() && fifo_user_packet_vc.read() != VC_POSTED){
310
                                othervc_send_count_posted[n] = othervc_send_count_posted[n].read()
311
                                        + sc_uint<1>(othervc_send_count_posted[n].read() == USER_FIFO_SHIFT_PRIORITY_MAX_COUNT);
312
                        }
313
                        if(!nposted_after_posted[n].read() && consume_user_fifo.read() && fifo_user_packet_vc.read() != VC_NON_POSTED){
314
                                othervc_send_count_nposted[n] = othervc_send_count_nposted[n].read()
315
                                        + sc_uint<1>(othervc_send_count_nposted[n].read() == USER_FIFO_SHIFT_PRIORITY_MAX_COUNT);
316
                        }
317
                }
318
 
319
                /// POSTED ///
320
                sc_uint<USER_FIFO_ADDRESS_WIDTH>        new_read_pointer_posted = read_pointer_posted.read();
321
                bool update_read_pointer_posted = consume_user_fifo.read() && fifo_user_packet_vc.read() == VC_POSTED;
322
                if(update_read_pointer_posted)
323
                {
324
                        new_read_pointer_posted = read_pointer_posted_p1;
325
                }
326
                read_pointer_posted = new_read_pointer_posted;
327
 
328
                if(ui_available_fc.read() && in_vc == VC_POSTED){
329
                        packet_buffer_posted[write_pointer_posted.read()] = ui_packet_fc.read();
330
                        othervc_send_count_posted[write_pointer_posted.read()] = 0;
331
                        if(write_pointer_posted.read() == USER_FIFO_DEPTH - 1)
332
                                write_pointer_posted = 0;
333
                        else
334
                                write_pointer_posted = (write_pointer_posted.read() + 1);
335
                }
336
 
337
                if((consume_user_fifo.read() && fifo_user_packet_vc.read() == VC_POSTED) &&
338
                        !(ui_available_fc.read() && in_vc == VC_POSTED)){
339
                        buffer_count_posted = buffer_count_posted.read() - 1;
340
                }
341
                else if(!(consume_user_fifo.read() && fifo_user_packet_vc.read() == VC_POSTED) &&
342
                        (ui_available_fc.read() && in_vc == VC_POSTED)){
343
                        buffer_count_posted = buffer_count_posted.read() + 1;
344
                }
345
 
346
 
347
                /// UPDATE NON POSTED AND RESPONSE BEHIND POSTED BITS ///
348
                //Start by updating "behind posted" registers.  What is calculated
349
                //is overriden by code below if it is for a position that is being
350
                //written to by a new packet arriving
351
                for(int n = 0; n < USER_FIFO_DEPTH; n++){
352
                        //If the read pointer is at the pos of the write pointer at the moment a posted
353
                        //or nposted packet was received, it means that the packet is no longer behind
354
                        //a posted packet because it has been sent!
355
                        if(new_read_pointer_posted == posted_pointer_when_response_received[n].read() && update_read_pointer_posted)
356
                                response_after_posted[n] = false;
357
                        if(new_read_pointer_posted == posted_pointer_when_nposted_received[n].read() && update_read_pointer_posted)
358
                                nposted_after_posted[n] = false;
359
                }
360
 
361
                /// NON POSTED ///
362
                if(consume_user_fifo.read() && fifo_user_packet_vc.read() == VC_NON_POSTED)
363
                {
364
                        read_pointer_nposted = read_pointer_nposted_p1;
365
                }
366
 
367
                if(ui_available_fc.read() && in_vc == VC_NON_POSTED){
368
                        packet_buffer_nposted[write_pointer_nposted.read()] = ui_packet_fc.read();
369
                        posted_pointer_when_nposted_received[write_pointer_nposted.read()] = write_pointer_posted.read();
370
                        nposted_after_posted[write_pointer_nposted.read()] = buffer_count_posted.read() != 0;
371
                        othervc_send_count_nposted[write_pointer_nposted.read()] = 0;
372
 
373
                        if(write_pointer_nposted.read() == USER_FIFO_DEPTH - 1)
374
                                write_pointer_nposted = 0;
375
                        else
376
                                write_pointer_nposted = (write_pointer_nposted.read() + 1);
377
                }
378
 
379
                if((consume_user_fifo.read() && fifo_user_packet_vc.read() == VC_NON_POSTED) &&
380
                        !(ui_available_fc.read() && in_vc == VC_NON_POSTED)){
381
                        buffer_count_nposted = buffer_count_nposted.read() - 1;
382
                }
383
                else if(!(consume_user_fifo.read() && fifo_user_packet_vc.read() == VC_NON_POSTED) &&
384
                        (ui_available_fc.read() && in_vc == VC_NON_POSTED)){
385
                        buffer_count_nposted = buffer_count_nposted.read() + 1;
386
                }
387
 
388
                /// RESPONSE ///
389
                if(consume_user_fifo.read() && fifo_user_packet_vc.read() == VC_RESPONSE)
390
                {
391
                        read_pointer_response = read_pointer_response_p1;
392
                }
393
 
394
                if(ui_available_fc.read() && in_vc == VC_RESPONSE){
395
                        packet_buffer_response[write_pointer_response.read()] = ui_packet_fc.read().range(31,0);
396
                        posted_pointer_when_response_received[write_pointer_response.read()] = write_pointer_posted.read();
397
                        response_after_posted[write_pointer_response.read()] = buffer_count_posted.read() != 0;
398
                        if(write_pointer_response.read() == USER_FIFO_DEPTH - 1)
399
                                write_pointer_response = 0;
400
                        else
401
                                write_pointer_response = (write_pointer_response.read() + 1);
402
                }
403
 
404
                if((consume_user_fifo.read() && fifo_user_packet_vc.read() == VC_RESPONSE) &&
405
                        !(ui_available_fc.read() && in_vc == VC_RESPONSE))
406
                {
407
                        buffer_count_response = buffer_count_response.read() - 1;
408
                }
409
                else if(!(consume_user_fifo.read() && fifo_user_packet_vc.read() == VC_RESPONSE) &&
410
                        (ui_available_fc.read() && in_vc == VC_RESPONSE)){
411
                        buffer_count_response = buffer_count_response.read() + 1;
412
                }
413
        }
414
}
415
 
416
void user_fifo_l3::output_available_buffers(){
417
        sc_bv<3> fc_user_fifo_ge2_ui_tmp;
418
 
419
        //Commented so that the comparator operator is not used since it makes
420
        //a long chain.
421
        /*
422
        fc_user_fifo_ge2_ui_tmp[VC_POSTED] = buffer_count_posted.read() >= 2;
423
        fc_user_fifo_ge2_ui_tmp[VC_NON_POSTED] = buffer_count_nposted.read() >= 2;
424
        fc_user_fifo_ge2_ui_tmp[VC_RESPONSE] = buffer_count_response.read() >= 2;
425
        */
426
 
427
        bool ge2[3] = {false,false,false};
428
        for(int n = 1; n < USER_FIFO_COUNT_WIDTH; n++){
429
                ge2[VC_POSTED] = ge2[VC_POSTED] || buffer_count_posted.read()[n];
430
                ge2[VC_NON_POSTED] = ge2[VC_NON_POSTED] || buffer_count_nposted.read()[n];
431
                ge2[VC_RESPONSE] = ge2[VC_RESPONSE] || buffer_count_response.read()[n];
432
        }
433
 
434
        fc_user_fifo_ge2_ui_tmp[VC_POSTED] = ge2[VC_POSTED];
435
        fc_user_fifo_ge2_ui_tmp[VC_NON_POSTED] = ge2[VC_NON_POSTED];
436
        fc_user_fifo_ge2_ui_tmp[VC_RESPONSE] = ge2[VC_RESPONSE];
437
 
438
        fc_user_fifo_ge2_ui = fc_user_fifo_ge2_ui_tmp;
439
}
440
 
441
bool user_fifo_l3::getNextPacketToOutput(
442
                bool posted_loaded, sc_bv<64> posted_packet,bool posted_max_count_reached,
443
                bool nposted_loaded, sc_bv<64> nposted_packet,bool nposted_behind_posted,bool nposted_max_count_reached,
444
                bool response_loaded, sc_bv<32> response_packet,bool response_behind_posted,
445
                sc_bv<64> & tmp_fifo_user_packet,VirtualChannel &next_vc_output)
446
{
447
 
448
        bool posted_data = ! (sc_bit)posted_packet[4];
449
        bool nposted_data = nposted_packet.range(4,3) == "01" || (sc_bit)nposted_packet[5];
450
        bool response_data = !(sc_bit)response_packet[0];
451
 
452
 
453
        ///Next value of output, if the data is consumed
454
        bool tmp_fifo_user_available;
455
 
456
        /**
457
                Ok, now select the packet that has the most priority:
458
        */
459
 
460
        sc_bv<64> full_response;
461
        full_response.range(31,0) = response_packet;
462
        full_response.range(63,32) = 0;
463
 
464
        bool responsePassPw = getPassPW(full_response);
465
 
466
        bool npostedPassPw = getPassPW(nposted_packet);
467
 
468
        //Condition, must have a valid packet && must be a cmd buffer free &&
469
        //(either have a data buffer free or a packet that does not have data)
470
        bool postedPacketCanBeSent = posted_loaded &&
471
                (sc_bit)(fwd_next_node_buffer_status_ro.read()[USR_FIFO_VC_P_POS]) &&
472
                ((sc_bit)(fwd_next_node_buffer_status_ro.read()[USR_FIFO_VC_P_DATA_POS]) || !posted_data);
473
 
474
        bool npostedPacketCanBeSent = nposted_loaded &&
475
                (sc_bit)(fwd_next_node_buffer_status_ro.read()[USR_FIFO_VC_NP_POS]) &&
476
                ((sc_bit)(fwd_next_node_buffer_status_ro.read()[USR_FIFO_VC_NP_DATA_POS]) || !nposted_data) &&
477
                (npostedPassPw || !nposted_behind_posted);
478
 
479
        bool responsePacketCanBeSent = response_loaded &&
480
                (sc_bit)(fwd_next_node_buffer_status_ro.read()[USR_FIFO_VC_R_POS]) &&
481
                ((sc_bit)(fwd_next_node_buffer_status_ro.read()[USR_FIFO_VC_R_DATA_POS]) || !response_data) &&
482
                (responsePassPw || !response_behind_posted);
483
 
484
        /** By default, response has max priority, but if max_count_reached is asserted, it means that another
485
                packet type has been ignore for too long and is taking over priority.  The same is true for posted
486
                packets.  The next code calculate if response has priority over others, and below if posted has
487
                priority over nposted packets.
488
        */
489
        bool response_priority = responsePacketCanBeSent && !(posted_max_count_reached && postedPacketCanBeSent
490
                || nposted_max_count_reached && npostedPacketCanBeSent);
491
        bool posted_priority = postedPacketCanBeSent && (posted_max_count_reached ||
492
                !(nposted_max_count_reached && npostedPacketCanBeSent));
493
 
494
        //Response has most priority if there is no posted packet or if it has the passPW flag
495
        if(response_priority){
496
                next_vc_output = VC_RESPONSE;
497
        }
498
        //After it is the posted packets
499
        else if(posted_priority){
500
                next_vc_output = VC_POSTED;
501
        }
502
        //Then the nposted, but it can't pass a posted packet if it does not have the passPw flag
503
        //on.
504
        else if(npostedPacketCanBeSent ){
505
                next_vc_output = VC_NON_POSTED;
506
        }
507
        else{
508
                next_vc_output = VC_NONE;
509
        }
510
 
511
        tmp_fifo_user_available = responsePacketCanBeSent || postedPacketCanBeSent || npostedPacketCanBeSent;
512
 
513
        if(response_priority){
514
                tmp_fifo_user_packet = full_response;
515
        }
516
        else if(posted_priority){
517
                tmp_fifo_user_packet = posted_packet;
518
        }
519
        else
520
                tmp_fifo_user_packet = nposted_packet;
521
 
522
        return tmp_fifo_user_available;
523
 
524
}
525
 
526
 
527
#ifndef SYSTEMC_SIM
528
 
529
#include "../core_synth/synth_control_packet.cpp"
530
 
531
#endif
532
 

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.