source: branches/v5/modules/dspin_local_ring_fast_c/caba/source/include/dspin_half_gateway_initiator_fast_c.h @ 330

Last change on this file since 330 was 330, checked in by joannou, 11 years ago
  • Commented debug in dspin_local_ring_fast_c
  • Added test on plen value in case of LL command in mem cache (vci_mem_cache and vci_mem_cache_dspin_coherence)
  • Removed coherence handling in *CACHE_MISS_DATA_UPDT states, in vci_cc_vcache_wrapper_dspin_coherence component
File size: 22.3 KB
Line 
1
2 /* SOCLIB_LGPL_HEADER_BEGIN
3 *
4 * This file is part of SoCLib, GNU LGPLv2.1.
5 *
6 * SoCLib is free software; you can redistribute it and/or modify it
7 * under the terms of the GNU Lesser General Public License as published
8 * by the Free Software Foundation; version 2.1 of the License.
9 *
10 * SoCLib is distributed in the hope that it will be useful, but
11 * WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
13 * Lesser General Public License for more details.
14 *
15 * You should have received a copy of the GNU Lesser General Public
16 * License along with SoCLib; if not, write to the Free Software
17 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
18 * 02110-1301 USA
19 *
20 * SOCLIB_LGPL_HEADER_END
21 *
22 * Author   : Abdelmalek SI MERABET
23 * Date     : Februrary 2011
24 * Copyright: UPMC - LIP6
25 */
26#ifndef DSPIN_HALF_GATEWAY_INITIATOR_FAST_H
27#define DSPIN_HALF_GATEWAY_INITIATOR_FAST_H
28
29#include "caba_base_module.h"
30#include "generic_fifo.h"
31#include "mapping_table.h"
32#include "ring_signals_fast.h"
33#include "dspin_interface.h"
34
35#define  BRDCST_TGT_MASK  0xFFFFFFFFE1ULL
36//#define  HI_DEBUG
37
38namespace soclib { namespace caba {
39
40namespace {
41
42const char *ring_cmd_fsm_state_str_hi[] = {
43        "CMD_IDLE",
44        "OWNER",
45        "BDC_FIRST",
46        "BDC_SECOND",
47        "SENDING",
48};
49
50#ifdef HI_DEBUG
51
52const char *ring_rsp_fsm_state_str_hi[] = {
53        "RSP_IDLE",
54        "ALLOC",
55        "NALLOC",
56};
57#endif
58
59}
60template<typename vci_param, int ring_cmd_data_size, int ring_rsp_data_size>
61class DspinHalfGatewayInitiatorFastC
62{
63
64typedef LocalRingSignals ring_signal_t;
65typedef DspinInput<ring_cmd_data_size>   cmd_in_t;
66typedef DspinOutput<ring_rsp_data_size>  rsp_out_t;
67
68private:
69       
70        enum ring_rsp_fsm_state_e {
71                RSP_IDLE,    // waiting for first flit of a response packet
72                ALLOC,      // next flit of a local rsp packet
73                NALLOC,     // next flit of a ring rsp packet
74            };
75       
76        enum ring_cmd_fsm_state_e {
77                CMD_IDLE,           
78                OWNER, 
79                BDC_FIRST,
80                BDC_SECOND,     
81                SENDING,
82                PREEMPT,                   
83            };
84       
85        // structural parameters
86        std::string         m_name;
87        bool                m_alloc_init;
88
89       
90        // internal fifos
91        GenericFifo<uint64_t > m_cmd_fifo;     // fifo for the local command packet
92        GenericFifo<uint64_t > m_rsp_fifo;     // fifo for the local response packet
93       
94        // routing table
95        soclib::common::AddressDecodingTable<uint32_t, bool> m_lt;
96
97        uint64_t r_brdcst_save; 
98        uint32_t m_srcid;
99        uint32_t m_nb_target;
100        uint32_t m_x_width;
101        uint32_t m_y_width;
102
103        // internal registers
104        sc_core::sc_signal<bool>     r_preempt;         // ring preempted, priority to gate init.
105        sc_core::sc_signal<uint32_t> r_cpt_tgt;         // target id for sequential broadcast
106        sc_core::sc_signal<uint32_t> r_ring_cmd_fsm;    // ring command packet FSM (distributed)
107        sc_core::sc_signal<uint32_t> r_ring_rsp_fsm;    // ring response packet FSM
108
109public :
110
111#define __renRegGateInit(x) x((((std::string) name)+"_" #x).c_str())
112
113DspinHalfGatewayInitiatorFastC(
114        const char     *name,
115        bool            alloc_init,
116        const int       &wrapper_fifo_depth,
117        const soclib::common::MappingTable &mt,
118        const soclib::common::IntTab &ringid,
119        const uint32_t &nb_target,
120        const uint32_t &x_width,
121        const uint32_t &y_width)
122      : m_name(name),
123        m_alloc_init(alloc_init),
124        m_cmd_fifo(((std::string) name)+"m_cmd_fifo", wrapper_fifo_depth),
125        m_rsp_fifo(((std::string) name)+"m_rsp_fifo", wrapper_fifo_depth),
126        m_lt(mt.getIdLocalityTable(ringid)),
127        m_nb_target(nb_target),
128        m_x_width(x_width),
129        m_y_width(y_width),
130        __renRegGateInit(r_cpt_tgt),
131        __renRegGateInit(r_ring_cmd_fsm),
132        __renRegGateInit(r_ring_rsp_fsm)
133 { } //  end constructor
134
135
136void reset()
137{
138        if(m_alloc_init)
139                r_ring_cmd_fsm = OWNER;
140        else
141                r_ring_cmd_fsm = CMD_IDLE;
142
143        r_ring_rsp_fsm = RSP_IDLE;
144        m_cmd_fifo.init();
145        m_rsp_fifo.init();
146
147}
148
149void transition(const cmd_in_t &p_gate_cmd_in, const rsp_out_t &p_gate_rsp_out, const ring_signal_t p_ring_in, cmd_str &init_cmd, bool &init_rsp_val, const bool tga)     
150{
151
152        bool      cmd_fifo_get = false;
153        bool      cmd_fifo_put = false;
154        uint64_t  cmd_fifo_data = 0;
155
156        bool      rsp_fifo_put = false;
157        uint64_t  rsp_fifo_data = 0;
158
159
160//////////// VCI CMD FSM /////////////////////////
161
162        if (p_gate_cmd_in.write.read()) {
163                cmd_fifo_data = (uint64_t) p_gate_cmd_in.data.read();
164                cmd_fifo_put =  m_cmd_fifo.wok();
165        }
166
167        bool rsp_fifo_get = p_gate_rsp_out.read.read();
168
169//////////// RING CMD FSM /////////////////////////
170        switch( r_ring_cmd_fsm ) 
171        {
172                case CMD_IDLE: 
173                { 
174
175                        // tga : target gate allocated
176                        if(m_cmd_fifo.rok())
177                        {
178#ifdef HI_DEBUG
179   std::cout << std::dec << sc_time_stamp() << " - " << m_name
180                         << " - ring_cmd_fsm  = " << ring_cmd_fsm_state_str_hi[r_ring_cmd_fsm] 
181                         << " - fifo ROK : " << m_cmd_fifo.rok()
182                         << " - fifo _data : " << std::hex << m_cmd_fifo.read()
183                         << " - in grant : " << p_ring_in.cmd_grant
184                         << " - in tga : " << tga
185                         << " - in wok : " << p_ring_in.cmd_r
186                         << " - in data : " << p_ring_in.cmd_data
187
188                         << std::endl;
189#endif
190                                r_preempt    = tga;
191
192                                if (m_cmd_fifo.read() & 0x1 == 0x1) // broadcast
193                                {
194                                        if (tga || p_ring_in.cmd_grant)
195                                        {
196                                                r_cpt_tgt      = 0;                   
197                                                r_brdcst_save  = m_cmd_fifo.read() & BRDCST_TGT_MASK; // save first flit of brdcst
198                                                r_ring_cmd_fsm = BDC_FIRST;
199                                        }
200                                }
201                                else    if(tga || p_ring_in.cmd_grant)
202                                        {
203                                                cmd_fifo_get = tga && p_ring_in.cmd_r;
204                                                r_ring_cmd_fsm = SENDING;
205                                        }
206
207                        }
208                }
209                break;
210
211                case OWNER:
212                        if ( m_cmd_fifo.rok()) // && p_ring_in.cmd_wok.read() )
213                        {
214#ifdef HI_DEBUG
215   std::cout << std::dec << sc_time_stamp() << " - " << m_name
216                         << " - ring_cmd_fsm  = " << ring_cmd_fsm_state_str_hi[r_ring_cmd_fsm] 
217                         << " - fifo ROK : " << m_cmd_fifo.rok()
218                         << " - in grant : " << p_ring_in.cmd_grant
219                         << " - in wok : " << p_ring_in.cmd_r
220                         << " - fifo data : " << std::hex << m_cmd_fifo.read()
221                         << std::endl;
222#endif       
223
224                                bool eop = ( (int) ((m_cmd_fifo.read() >> (ring_cmd_data_size - 1) ) & 0x1) == 1);
225
226                                if (m_cmd_fifo.read() & 0x1 == 0x1) // broadcast
227                                {
228                                        r_cpt_tgt      = 0;                   
229                                        r_brdcst_save  = m_cmd_fifo.read() & BRDCST_TGT_MASK; // save first flit of brdcst
230                                        r_ring_cmd_fsm = BDC_FIRST;                                       
231                                } 
232//
233                                else
234                                {
235                                        if ( eop && p_ring_in.cmd_r ) 
236                                         {
237                                                cmd_fifo_get = true;
238                                                if ( p_ring_in.cmd_grant )
239                                                        r_ring_cmd_fsm = OWNER;
240                                                else
241                                                        r_ring_cmd_fsm = CMD_IDLE;
242                                         } 
243                                       
244                                         if (!eop || !p_ring_in.cmd_r) 
245                                         {
246                                                cmd_fifo_get = p_ring_in.cmd_r;
247                                                r_ring_cmd_fsm = SENDING;
248                                         }
249
250                                }
251             
252                        }   
253                        else if ( !p_ring_in.cmd_grant)
254                                r_ring_cmd_fsm = CMD_IDLE; 
255                break;
256
257                case BDC_FIRST:
258                       
259#ifdef HI_DEBUG
260        std::cout << std::dec << sc_time_stamp() << " - " << m_name
261                  << " - ring_cmd_fsm = " << ring_cmd_fsm_state_str_hi[r_ring_cmd_fsm] 
262                  << " - fifo ROK : " << m_cmd_fifo.rok()
263                  << " - in grant : " << p_ring_in.cmd_grant 
264                  << " - preempt : " << r_preempt
265                  << " - in wok : " << p_ring_in.cmd_r
266                  << " - cpt_tgt : " << r_cpt_tgt.read()
267                  << " - fifo data : " << std::hex << m_cmd_fifo.read()
268                  << std::endl;
269
270#endif
271
272                        if (p_ring_in.cmd_r)                                 
273                        {
274                                if (r_cpt_tgt.read() == 0)
275                                {
276                                        cmd_fifo_get = true;
277                                }
278                                r_ring_cmd_fsm = BDC_SECOND;
279                        }
280                break;
281
282                case BDC_SECOND:
283#ifdef HI_DEBUG
284        std::cout << std::dec << sc_time_stamp() << " - " << m_name
285                  << " - ring_cmd_fsm = " << ring_cmd_fsm_state_str_hi[r_ring_cmd_fsm] 
286                  << " - fifo ROK : " << m_cmd_fifo.rok()
287                  << " - in grant : " << p_ring_in.cmd_grant 
288                  << " - preempt : " << r_preempt
289                  << " - in wok : " << p_ring_in.cmd_r
290                  << " - fifo data : " << std::hex << m_cmd_fifo.read()
291                  << std::endl;
292
293#endif
294
295                        if(m_cmd_fifo.rok() && p_ring_in.cmd_r)
296                        { 
297                                if(r_cpt_tgt.read() == m_nb_target - 1)
298                                {
299                                        cmd_fifo_get = true; 
300
301                                        if ( !r_preempt && p_ring_in.cmd_grant )
302                                        {
303                                                r_ring_cmd_fsm = OWNER; 
304                                        }
305                                        else    //r_preempt || !p_ring_in.cmd_grant   
306                                        {
307                                                r_ring_cmd_fsm = CMD_IDLE;
308                                        }
309                                }
310                                else
311                                {
312                                        r_cpt_tgt      = r_cpt_tgt + 1;
313                                        r_ring_cmd_fsm = BDC_FIRST;
314                                }
315
316                        }
317                break;
318
319                case SENDING:   
320#ifdef HI_DEBUG
321if(m_cmd_fifo.rok())
322   std::cout << std::dec << sc_time_stamp() << " - " << m_name
323                         << " - ring_cmd_fsm  = " << ring_cmd_fsm_state_str_hi[r_ring_cmd_fsm] 
324                         << " - fifo ROK : " << m_cmd_fifo.rok()
325                         << " - in grant : " << p_ring_in.cmd_grant
326                         << " - in wok : " << p_ring_in.cmd_r
327                         << " - fifo data : " << std::hex << m_cmd_fifo.read()
328                         << std::endl;
329#endif                 
330
331
332                        if(m_cmd_fifo.rok() && p_ring_in.cmd_r ) 
333                        {
334                                cmd_fifo_get = true; 
335                                bool eop = ((int) (m_cmd_fifo.read() >> (ring_cmd_data_size - 1) ) & 0x1) == 1;
336                                if (eop) 
337                                { 
338                                        if (!r_preempt && p_ring_in.cmd_grant )
339                                                r_ring_cmd_fsm = OWNER; 
340                                        else   
341                                                r_ring_cmd_fsm = CMD_IDLE; 
342                                }       
343                        }     
344                break;
345
346        } // end switch ring cmd fsm
347 
348/////////// RING RSP FSM ////////////////////////
349   
350        switch( r_ring_rsp_fsm ) 
351        {
352                case RSP_IDLE: 
353
354                {
355                        uint32_t  rsrcid  = (uint32_t)  ((sc_dt::sc_uint<vci_param::S>) ((p_ring_in.rsp_data >> (ring_rsp_data_size-m_x_width-m_y_width - 1)) << (vci_param::S-m_x_width-m_y_width)));
356                        bool islocal      = !m_lt[rsrcid];
357                        bool reop         = ((p_ring_in.rsp_data >> (ring_rsp_data_size - 1)) & 0x1) == 1;
358
359
360
361                        if (p_ring_in.rsp_w)
362                        {
363#ifdef HI_DEBUG
364   std::cout << std::dec << sc_time_stamp() << " - " << m_name
365              << " - ring_rsp_fsm = " << ring_rsp_fsm_state_str_hi[r_ring_rsp_fsm]
366              << " - in preempt : " << p_ring_in.rsp_preempt
367              << " - in rok : " << p_ring_in.rsp_w
368              << " - in data : " << std::hex << p_ring_in.rsp_data
369              << " - rsrcid : " << rsrcid
370              << " - isloc : " << islocal
371              << " - in wok : " << p_ring_in.rsp_r
372              << " - fifo wok : " << m_rsp_fifo.wok()
373              << " - reop : " << reop
374              << std::endl;
375#endif
376                                if(islocal) 
377                                {   
378                                        rsp_fifo_put  = m_rsp_fifo.wok();
379                                        rsp_fifo_data = p_ring_in.rsp_data;
380
381                                        if (reop && m_rsp_fifo.wok())
382                                                r_ring_rsp_fsm = RSP_IDLE;
383                                        else
384                                                r_ring_rsp_fsm = ALLOC;
385                                }
386
387                                else  // !islocal
388                                {
389
390                                        if (reop && p_ring_in.rsp_r)
391                                                r_ring_rsp_fsm = RSP_IDLE;
392                                        else
393                                                r_ring_rsp_fsm = NALLOC;
394                                }
395                        }
396                        else // !p_ring_in.rsp_w
397                                r_ring_rsp_fsm = RSP_IDLE;
398                }
399                break;
400
401                case ALLOC:
402                {
403                        bool reop     = ((p_ring_in.rsp_data >> (ring_rsp_data_size - 1)) & 0x1) == 1;
404#ifdef HI_DEBUG
405if(p_ring_in.rsp_w || p_ring_in.rsp_preempt)
406   std::cout << std::dec << sc_time_stamp() << " - " << m_name
407              << " - ring_rsp_fsm = " << ring_rsp_fsm_state_str_hi[r_ring_rsp_fsm] 
408              << " - in preempt : " << p_ring_in.rsp_preempt
409              << " - in rok : " << p_ring_in.rsp_w
410              << " - in wok : " << p_ring_in.rsp_r
411              << " - in data : " << std::hex << p_ring_in.rsp_data
412              << " - fifo wok : " << m_rsp_fifo.wok()   
413              << " - reop : " << reop
414              << std::endl;
415#endif
416
417
418                        if(p_ring_in.rsp_preempt) break;
419
420                        if (p_ring_in.rsp_w && m_rsp_fifo.wok() && reop)         
421                        {
422
423                                rsp_fifo_put  = true;
424                                rsp_fifo_data = p_ring_in.rsp_data;
425
426                                if(p_ring_in.rsp_palloc)
427                                        r_ring_rsp_fsm = NALLOC;
428                                else
429                                        r_ring_rsp_fsm = RSP_IDLE;             
430                        }
431                        else //  !p_ring_in.rsp_w || !m_rsp_fifo.wok() || !reop
432                        {
433
434                                rsp_fifo_put  = p_ring_in.rsp_w && m_rsp_fifo.wok();
435                                rsp_fifo_data = p_ring_in.rsp_data;
436                                r_ring_rsp_fsm = ALLOC;             
437                        }
438                } 
439                break;
440
441                case NALLOC:     
442                {
443
444#ifdef HI_DEBUG
445if(p_ring_in.rsp_w)
446   std::cout << std::dec << sc_time_stamp() << " - " << m_name
447                         << " - ring_rsp_fsm  = " << ring_rsp_fsm_state_str_hi[r_ring_rsp_fsm] 
448                         << " - in rok : " << p_ring_in.rsp_w
449                         << " - fifo wok : " <<  m_rsp_fifo.wok()   
450                         << " - in wok : " << p_ring_in.rsp_r
451                         << " - in data : " << std::hex << p_ring_in.rsp_data
452                         << std::endl;
453#endif
454
455                        bool reop  = ((p_ring_in.rsp_data >> (ring_rsp_data_size - 1)) & 0x1) == 1;
456
457
458                        if (p_ring_in.rsp_w && reop && p_ring_in.rsp_r)
459                        {
460                                r_ring_rsp_fsm = RSP_IDLE; 
461                        }
462                        else
463                        {
464                                r_ring_rsp_fsm = NALLOC;
465                        }
466                }
467                break;
468
469        } // end switch rsp fsm
470
471
472    ////////////////////////
473    //  fifos update      //
474   ////////////////////////
475
476//-- keep trace on ring traffic
477        init_cmd.cmdval  = cmd_fifo_get;
478        init_cmd.flit    = m_cmd_fifo.read();
479        init_cmd.state   = ring_cmd_fsm_state_str_hi[r_ring_cmd_fsm];
480
481        //init_cmd_val = cmd_fifo_get;
482        init_rsp_val = rsp_fifo_put;
483// local cmd fifo update
484        if (  cmd_fifo_put &&  cmd_fifo_get ) m_cmd_fifo.put_and_get(cmd_fifo_data);
485        else if (  cmd_fifo_put && !cmd_fifo_get ) m_cmd_fifo.simple_put(cmd_fifo_data);
486        else if ( !cmd_fifo_put &&  cmd_fifo_get ) m_cmd_fifo.simple_get();
487       
488// local rsp fifo update
489        if (  rsp_fifo_put &&  rsp_fifo_get ) m_rsp_fifo.put_and_get(rsp_fifo_data);
490        else if (  rsp_fifo_put && !rsp_fifo_get ) m_rsp_fifo.simple_put(rsp_fifo_data);
491        else if ( !rsp_fifo_put &&  rsp_fifo_get ) m_rsp_fifo.simple_get();
492     
493}  // end Transition()
494
495///////////////////////////////////////////////////////////////////
496void genMoore(cmd_in_t &p_gate_cmd_in, rsp_out_t &p_gate_rsp_out)
497///////////////////////////////////////////////////////////////////
498{
499        p_gate_rsp_out.write = m_rsp_fifo.rok();
500        p_gate_rsp_out.data  = (sc_dt::sc_uint<ring_rsp_data_size>) m_rsp_fifo.read();
501
502        p_gate_cmd_in.read= m_cmd_fifo.wok();
503
504} // end genMoore
505
506/////////////////////////////////////////////////////////////////////////////////////////////////
507void update_ring_signals(ring_signal_t p_ring_in, ring_signal_t &p_ring_out, bool tga, bool &iga)
508/////////////////////////////////////////////////////////////////////////////////////////////////
509// palloc may have 2 values :
510// palloc = 2 : means Target Gate still allocated
511// global state for targets :  TG  TL0  TL1   TL2  ... TLn
512//                              A   N    N     P2       N
513//                              A   N    N     N        N
514// palloc = 1 : means Target Gate free (not allocated)
515// global state for targets :  TG  TL0  TL1   TL2  ... TLn
516//                              A   N    N     P2       N
517//                              N   N    N     P1       N                       
518//                              I   I    I     I        I                                                               
519// TLi not allocated, in case of preempt and last flit, needs to test value of palloc
520// if palloc=1      => next state : IDLE (TG not allocated)
521// else (palloc2=2) => next state : NALLOC (TG still Allocated)
522{   
523        switch( r_ring_cmd_fsm ) 
524        {
525                case CMD_IDLE:
526                {
527                        bool brdcst = (m_cmd_fifo.read() & 0x1 == 0x1);
528
529                        p_ring_out.cmd_grant     = !m_cmd_fifo.rok() && p_ring_in.cmd_grant;
530
531                        if (m_cmd_fifo.rok() && tga && !brdcst) 
532                        {
533                                p_ring_out.cmd_preempt = 1; 
534                                p_ring_out.cmd_palloc  = 1; 
535                                p_ring_out.cmd_header  = 1; 
536                                p_ring_out.cmd_w       = 1;
537                                p_ring_out.cmd_data    = m_cmd_fifo.read();
538                        }
539                        else
540                        {
541                                p_ring_out.cmd_preempt = 0; 
542                                p_ring_out.cmd_palloc  = 0; 
543                                p_ring_out.cmd_header  = 0; 
544                                p_ring_out.cmd_w       = p_ring_in.cmd_w;
545                                p_ring_out.cmd_data    = p_ring_in.cmd_data;
546                        }
547
548                }
549                break;
550       
551                case OWNER:   
552                {     
553                        bool eop = ((int) ((m_cmd_fifo.read() >> (ring_cmd_data_size - 1) ) & 0x1) == 1);
554                        bool brdcst = (m_cmd_fifo.read() & 0x1 == 0x1);     
555 
556                        p_ring_out.cmd_grant = (!m_cmd_fifo.rok() || (eop && p_ring_in.cmd_r)) ; 
557
558                        p_ring_out.cmd_preempt = 0;
559                        p_ring_out.cmd_header  = 0;
560                        p_ring_out.cmd_palloc  = 0;
561                        p_ring_out.cmd_w       = m_cmd_fifo.rok() && !brdcst;
562                        p_ring_out.cmd_data    = m_cmd_fifo.read();
563                }
564                break;
565
566                case BDC_FIRST:
567                        if(r_preempt)
568                        {
569                                p_ring_out.cmd_header  = 1;
570                                p_ring_out.cmd_palloc  = 1+(tga ? 1:0);
571                                p_ring_out.cmd_preempt = 1;
572                                p_ring_out.cmd_grant   = p_ring_in.cmd_grant;
573                        }
574                        else
575                        {
576                                p_ring_out.cmd_header  = 0;
577                                p_ring_out.cmd_palloc  = 0;
578                                p_ring_out.cmd_preempt = 0;
579                                p_ring_out.cmd_grant   = false;
580                        }
581
582                        p_ring_out.cmd_w     = true;
583                        p_ring_out.cmd_data  = r_brdcst_save | ((((uint64_t) r_cpt_tgt.read()) & 0xF) << 0x1);   
584                break;
585               
586                case BDC_SECOND:
587
588                        if (r_preempt)
589                        {
590                                p_ring_out.cmd_grant  = p_ring_in.cmd_grant;
591                                p_ring_out.cmd_palloc = 1+(tga ? 1:0);
592                               
593                                p_ring_out.cmd_preempt = m_cmd_fifo.rok(); //&& tga;
594                                p_ring_out.cmd_header  = 0;
595                               
596                                if ( m_cmd_fifo.rok() )
597                                {
598                                        p_ring_out.cmd_w     = 1; //m_cmd_fifo.rok();
599                                        p_ring_out.cmd_data  = m_cmd_fifo.read();
600                                }
601                                else
602                                {
603                                        // if init local has finished, tga = 0
604                                        // init gate remains the only initiator, then w = 0
605                                        p_ring_out.cmd_w     = p_ring_in.cmd_w && tga; 
606                                        p_ring_out.cmd_data  = p_ring_in.cmd_data;
607                                }
608                        }
609                        else
610                        {
611                                // si on est dans cet etat, c'est qu'on n'utilise pas le cmd_preempt mais le gnt.
612                                p_ring_out.cmd_preempt= 0;
613                                p_ring_out.cmd_header = 0;
614                                p_ring_out.cmd_palloc = 0;
615                                p_ring_out.cmd_w      = m_cmd_fifo.rok();
616                                p_ring_out.cmd_data   = m_cmd_fifo.read();
617                                p_ring_out.cmd_grant  = m_cmd_fifo.rok() && p_ring_in.cmd_r && (r_cpt_tgt.read() == m_nb_target - 1);
618                        }
619                break;
620       
621                case SENDING: 
622                { 
623
624                        if (r_preempt)
625                        {
626                                p_ring_out.cmd_grant  = p_ring_in.cmd_grant;
627                                p_ring_out.cmd_palloc = 1+(tga ? 1:0);
628                               
629                                p_ring_out.cmd_preempt = m_cmd_fifo.rok(); //&& tga;
630                                p_ring_out.cmd_header  = 0;
631                               
632                                if ( m_cmd_fifo.rok() )
633                                {
634                                        p_ring_out.cmd_w     = 1; //m_cmd_fifo.rok();
635                                        p_ring_out.cmd_data  = m_cmd_fifo.read();
636                                }
637                                else
638                                {
639                                        // if init local has finished, tga = 0
640                                        // init gate remains the only initiator, then w = 0
641                                        p_ring_out.cmd_w     = p_ring_in.cmd_w && tga; 
642                                        p_ring_out.cmd_data  = p_ring_in.cmd_data;
643                                }
644                        }
645                        else
646                        {
647                                bool eop = ((int) (m_cmd_fifo.read() >> (ring_cmd_data_size - 1) ) & 0x1) == 1;
648                                // si on est dans cet etat, c'est qu'on n'utilise pas le cmd_preempt mais le gnt.
649                                p_ring_out.cmd_preempt= 0;
650                                p_ring_out.cmd_header = 0;
651                                p_ring_out.cmd_palloc = 0;
652                                p_ring_out.cmd_w      = m_cmd_fifo.rok();
653                                p_ring_out.cmd_data   = m_cmd_fifo.read();
654                                p_ring_out.cmd_grant  = m_cmd_fifo.rok() && p_ring_in.cmd_r && eop;
655                        }
656                }
657                break;
658       
659        } // end switch
660
661        p_ring_out.cmd_r       = p_ring_in.cmd_r;
662
663        p_ring_out.rsp_w       = p_ring_in.rsp_w;
664        p_ring_out.rsp_data    = p_ring_in.rsp_data;
665
666        p_ring_out.rsp_grant   = p_ring_in.rsp_grant;
667
668        p_ring_out.rsp_palloc  = p_ring_in.rsp_palloc;
669        p_ring_out.rsp_preempt = p_ring_in.rsp_preempt;
670        p_ring_out.rsp_header  = p_ring_in.rsp_header;
671
672
673        switch( r_ring_rsp_fsm ) 
674        {
675                case RSP_IDLE: 
676                {
677                        uint32_t  rsrcid  = (uint32_t)  ((sc_dt::sc_uint<vci_param::S>) ((p_ring_in.rsp_data >> (ring_rsp_data_size-m_x_width-m_y_width - 1)) << (vci_param::S-m_x_width-m_y_width)));
678                        bool islocal      = !m_lt[rsrcid];
679
680                        iga = false;
681
682                        if(p_ring_in.rsp_w && islocal) 
683                                p_ring_out.rsp_r = m_rsp_fifo.wok();
684                        else
685                                p_ring_out.rsp_r = p_ring_in.rsp_r;
686                }
687                break;
688       
689                case ALLOC:
690                        iga = true;
691
692                        if (!p_ring_in.rsp_preempt)
693                                p_ring_out.rsp_r =  m_rsp_fifo.wok();   
694                        else
695                                p_ring_out.rsp_r = p_ring_in.rsp_r;
696                break;
697       
698                case NALLOC:
699                        iga = false;
700                        p_ring_out.rsp_r = p_ring_in.rsp_r;
701                break;   
702        } // end switch
703
704
705} // end update_ring_signals
706
707};
708
709}} // end namespace
710
711#endif // DSPIN_HALF_GATEWAY_INITIATOR_FAST_H
712
Note: See TracBrowser for help on using the repository browser.