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

Subversion Repositories ht_tunnel

[/] [ht_tunnel/] [tags/] [START/] [rtl/] [systemc/] [decoder_l2/] [decoder_l2.h] - Blame information for rev 19

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 2 acastong
//decoder_l2.h
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
 *   Max-Elie Salomon
25
 *   Ami Castonguay <acastong@grm.polymtl.ca>
26
 *
27
 * Alternatively, the contents of this file may be used under the terms
28
 * of the Polytechnique HyperTransport Tunnel IP Core Source Code License
29
 * (the  "PHTICSCL License", see the file PHTICSCL.txt), in which case the
30
 * provisions of PHTICSCL License are applicable instead of those
31
 * above. If you wish to allow use of your version of this file only
32
 * under the terms of the PHTICSCL License and not to allow others to use
33
 * your version of this file under the MPL, indicate your decision by
34
 * deleting the provisions above and replace them with the notice and
35
 * other provisions required by the PHTICSCL License. If you do not delete
36
 * the provisions above, a recipient may use your version of this file
37
 * under either the MPL or the PHTICSCL License."
38
 *
39
 * ***** END LICENSE BLOCK ***** */
40
 
41
#include "../core_synth/synth_datatypes.h"
42
#include "../core_synth/constants.h"
43
 
44
 
45
#ifndef DECODER_L2_H
46
#define DECODER_L2_H
47
 
48
//Forward declerations
49
class cd_state_machine_l3;
50
class cd_counter_l3;
51
class cd_cmd_buffer_l3;
52
class cd_cmdwdata_buffer_l3;
53
class cd_mux_l3;
54
class cd_nop_handler_l3;
55
 
56
#ifdef RETRY_MODE_ENABLED
57
class cd_packet_crc_l3;
58
class cd_history_rx_l3;
59
#endif
60
 
61
///Input decoder for the Hypertransport module
62
 
63
/**
64
        @class decoder_l2
65
        @description The decoder has the task of first analyzing what dwords
66
        are received from the link and to organize them in packets
67
        that can be stored in the command buffer (reordering) or
68
        data buffer.  It also takes care of sending flow control (nop)
69
        information to the flow control module.
70
 
71
        When malformed or invalid packets are received, an error in logged
72
        but most likely, everything that will follow will be completely
73
        corrupted...
74
 
75
        If the retry mode is on, it verifies that the
76
        per-packet CRC's are valid.  If they are not, then the decoder
77
        initiates a retry sequence.  It also ignores stomped packet.  If
78
        a stomped packet that has data associated is received, the data
79
        that's already stored in the databuffers is dropped.
80
 
81
        This is basically just a big state machine that directs the received
82
        dwords.  There are a lot of states because it is possible to insert
83
        a command packet inside a data transfer.  Per packet CRC's also complicate
84
        things quite a bit because there is no garantee in which order they will
85
        arrive when a command packet is inserted in a data transfer.  *Note: per
86
        packet CRC was simplified with revision 2.0b of the spec : inserted
87
        command CRC must follow the packet CRC.
88
 
89
 
90
        Contains the following sub-modules:
91
 
92
                -state_machine
93
                -counter
94
                -cmd_buffer
95
                -cmdwdata_buffer
96
                -mux
97
                -NOP_handler
98
                -historyRxCnt
99
 
100
        @author Max-Elie Salomon
101
                Ami Castonguay
102
  */
103
 
104
class decoder_l2 : public sc_module
105
{
106
public:
107
        //*******************************
108
        // Internal signals
109
        //*******************************
110
 
111
        //-------------------------------
112
        //   state machine / buffer 1
113
        //-------------------------------
114
        ///Load the lower 32 bits of the buffer with no data
115
        sc_signal< bool >               enCtl1;
116
        ///Load the upper 32 bits of the buffer with no data
117
        sc_signal< bool >               enCtl2;
118
 
119
        //----------------------------------------
120
        //   state machine / buffer 2 (with data)
121
        //----------------------------------------
122
        ///Load the lower 32 bits of the buffer with data
123
        sc_signal< bool >               enCtlWdata1;
124
        ///Load the upper 32 bits of the buffer with data
125
        sc_signal< bool >               enCtlWdata2;
126
 
127
        //----------------------------------------
128
        //   state machine / counter
129
        //----------------------------------------
130
        ///Flag indicating the next valid data dword will be the last
131
        sc_signal< bool >               end_of_count;
132
        ///Flag indicating the last data dword has been received
133
        //sc_signal< bool >             count_done;
134
 
135
        //----------------------------------------
136
        //   buffers / MUX
137
        //----------------------------------------
138
        ///The buffer for the packet without data
139
        sc_signal< syn_ControlPacketComplete >  ctlPacket0;
140
        ///The buffer for the packet with data
141
        sc_signal< syn_ControlPacketComplete >  ctlPacket1;
142
        ///To select wich buffer is being outputed between ctlPacket0 and ctlPacket1
143
        sc_signal< bool >               selCtlPckt;
144
 
145
        //----------------------------------------
146
        //   state machine / NOP handler
147
        //----------------------------------------
148
        ///A nop has been received, register the nop content
149
        sc_signal< bool >               setNopCnt;
150
        ///Send a notification that a nop has been received/validated
151
        sc_signal< bool >               send_nop_notification;
152
 
153
#ifdef RETRY_MODE_ENABLED
154
        //----------------------------------------
155
        //   state machine / NOP handler
156
        //----------------------------------------
157
        //Signals for CRC
158
        ///If the signal on the input matches the calculated CRC1
159
        sc_signal<bool>                 crc1_good;
160
        ///If the signal on the input is the inverse of the calculated CRC1
161
        sc_signal<bool>                 crc1_stomped;
162
        ///Add the input vector to the CRC1 calculation
163
        sc_signal<bool>                 crc1_enable;
164
        ///Reset the CRC1 value
165
        sc_signal<bool>                 crc1_reset;
166
 
167
        ///If the signal on the input matches the calculated CRC2
168
        sc_signal<bool>                 crc2_good;
169
        ///If the signal on the input is the inverse of the calculated CRC2
170
        sc_signal<bool>                 crc2_stomped;
171
        ///Add the input vector to the CRC2 calculation
172
        sc_signal<bool>                 crc2_enable;
173
        ///Reset the CRC1 value
174
        sc_signal<bool>                 crc2_reset;
175
        ///If CTL is activated, should CRC2 be calculated instead of CRC1
176
        sc_signal< bool >       crc2_if_ctl;
177
#endif
178
 
179
        //----------------------------------------
180
        //   other internal signals
181
        //----------------------------------------
182
 
183
        ///Command of the packet received from the input fifo
184
        sc_signal< PacketCommand >      cmd;
185
 
186
        ///error signal for extended 64 address
187
        sc_signal< bool >                       error64Bits;
188
        ///error signal for extended 64 address for packet that has data associated
189
        sc_signal< bool >                       error64BitsCtlwData;
190
 
191
        // /get an address from data buffer and set data count
192
        sc_signal< bool >                       getAddressSetCnt;
193
 
194
        //----------------------------------------
195
        //   sub-module instanciation
196
        //----------------------------------------
197
 
198
        cd_state_machine_l3             *SM;///<The controler of the decoder
199
        cd_counter_l3                   *CNT;///<A simple counter
200
        cd_cmd_buffer_l3                *CMD_BUF;///<A command buffer
201
        cd_cmdwdata_buffer_l3   *CMDWDATA_BUF;///<A command buffer for packets that contain data
202
        cd_mux_l3                               *MUX;///<A simple multiplexer
203
        cd_nop_handler_l3               *NOP_HANDLER;///<Module that handles received nop packets
204
 
205
#ifdef RETRY_MODE_ENABLED
206
        cd_history_rx_l3                *HISTORY;///<Counts the number of received packets for history (retry mode) purpose
207
        cd_packet_crc_l3                *packet_crc_unit;///<Calcultates and checks per-packet CRC
208
#endif
209
 
210
        //*******************************
211
        //      General signals
212
        //*******************************
213
 
214
        ///Clock to synchronize module
215
        sc_in < bool >                  clk;
216
        ///Warm Reset to initialize module
217
        sc_in < bool >                  resetx;
218
 
219
        //*******************************
220
        //      Signals for Control Buffer
221
        //*******************************
222
 
223
        /**Packet to be transmitted to control buffer module*/
224
    sc_out< syn_ControlPacketComplete >         cd_packet_ro;
225
        /**Enables control buffer module to read cd_packet_ro port*/
226
        sc_out< bool >                                          cd_available_ro;
227
        /**If we're currently receiving data.  This is used by the ro to know
228
        if we have finished receiving the data of a packet, so it can know if
229
        it can send it.*/
230
        sc_out<bool>                                            cd_data_pending_ro;
231
        /**Where we are storing data.   This is used by the ro to know
232
        if we have finished receiving the data of a packet, so it can know if
233
        it can send it.*/
234
        sc_out<sc_uint<BUFFERS_ADDRESS_WIDTH> > cd_data_pending_addr_ro;
235
 
236
        //*******************************
237
        //      Signals for Data Buffer
238
        //*******************************       
239
 
240
        ///ddress of data in data buffer module
241
        sc_in< sc_uint<BUFFERS_ADDRESS_WIDTH> >         db_address_cd;
242
        ///Get an address form data buffer module
243
        sc_out< bool >                          cd_getaddr_db;
244
        ///Size of data packet to be written
245
        sc_out< sc_uint<4> >            cd_datalen_db;
246
        ///Virtual channel where data will be written
247
        sc_out< VirtualChannel >        cd_vctype_db;
248
        ///Data to be written in data buffer module
249
        sc_out< sc_bv<32> >             cd_data_db;
250
        ///Enables data buffer to read cd_data_db port
251
        sc_out< bool >                          cd_write_db;
252
 
253
#ifdef RETRY_MODE_ENABLED
254
        ///Erase signal for packet stomping
255
        sc_out< bool >                          cd_drop_db;
256
#endif
257
 
258
 
259
        //*************************************
260
        // Signals to CSR
261
        //*************************************
262
 
263
        ///A protocol error has been detected
264
        sc_out< bool >                  cd_protocol_error_csr;
265
        ///A sync packet has been received
266
        sc_out< bool >                  cd_sync_detected_csr;
267
#ifdef RETRY_MODE_ENABLED
268
        ///If retry mode is active
269
        sc_in< bool >                   csr_retry;
270
#endif
271
 
272
        //*******************************
273
        //      Signals from link
274
        //*******************************
275
 
276
        ///Bit vector input from the FIFO 
277
        sc_in< sc_bv<32> >              lk_dword_cd;
278
        ///Control bit
279
        sc_in< bool >                   lk_hctl_cd;
280
        ///Control bit
281
        sc_in< bool >                   lk_lctl_cd;
282
        ///FIFO is ready to be read from
283
        sc_in< bool >                   lk_available_cd;
284
 
285
#ifdef RETRY_MODE_ENABLED
286
        ///If a retry sequence is initiated by link
287
        sc_in< bool >                   lk_initiate_retry_disconnect;
288
#endif
289
        //*******************************
290
        //      Signals for Forwarding module
291
        //*******************************
292
 
293
#ifdef RETRY_MODE_ENABLED
294
        ///History count
295
        sc_out< sc_uint<8> >            cd_rx_next_pkt_to_ack_fc;
296
        ///rxPacketToAck (retry mode)
297
        sc_out< sc_uint<8> >    cd_nop_ack_value_fc;
298
#endif
299
 
300
        ///Info registered from NOP word
301
        sc_out< sc_bv<12> >     cd_nopinfo_fc;
302
        ///Signal that new nop info are available
303
        sc_out< bool >                  cd_nop_received_fc;
304
 
305
#ifdef RETRY_MODE_ENABLED
306
        ///Start the sequence for a retry disconnect
307
        sc_out< bool >                  cd_initiate_retry_disconnect;
308
        ///A stomped packet has been received
309
        sc_out<bool>                    cd_received_stomped_csr;
310
        ///Let the reordering know we received a non flow control stomped packet
311
        /**  When this situation happens, packet available bit does not become
312
                 asserted but the correct packet is sent, which can be used to know
313
                 from which VC to free a flow control credit.
314
        */
315
        sc_out<bool> cd_received_non_flow_stomped_ro;
316
#endif
317
        ///The link can start a sequence for a ldtstop disconnect
318
        sc_out< bool >                  cd_initiate_nonretry_disconnect_lk;
319
 
320
 
321
        /**
322
                This process sets outputs that need to become
323
                available by the end of the clock time where an
324
                input bit vector is received:
325
 
326
                        cd_data_db
327
                        cd_getaddr_db
328
                        cd_datalen_db
329
                        cd_vctype_db
330
                        erasedAddress
331
        */
332
        void set_outputs();
333
 
334
        ///SystemC macro
335
        SC_HAS_PROCESS(decoder_l2);
336
 
337
        /**
338
                Module constructor
339
 
340
        */
341
        decoder_l2( sc_module_name name);
342
 
343
#ifdef SYSTEMC_SIM
344
        ~decoder_l2();
345
#endif
346
 
347
};
348
 
349
#endif
350
 

powered by: WebSVN 2.1.0

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