Ignore:
Timestamp:
Apr 10, 2013, 12:54:31 PM (12 years ago)
Author:
cfuguet
Message:

Bugfix in vci_mem_cache_v4:

In function "copy()" of the xram_transaction table the LL key was not
copied into register. Hence, the key coming from the XRAM_RSP to the
TGT_RSP FSM was never correct.

In TGT_RSP FSM, in case of LL response, the two response flits were
inverted. We must send first the key and then the data.

Add:

Add the COMPARE_HIT_COMPARE state in the CAS FSM to optimize timing.
(This modification has been already done in the vci_mem_cache v5).

Add output ports for debug. This ports are used only if the
MONITOR_MEMCACHE_FSM compilation directive is gave.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/modules/vci_mem_cache_v4/caba/source/src/vci_mem_cache_v4.cpp

    r340 r361  
    8080    "INIT_CMD_INVAL_NLINE",
    8181    "INIT_CMD_XRAM_BRDCAST",
     82    "INIT_CMD_WRITE_BRDCAST",
     83    "INIT_CMD_CAS_BRDCAST",
    8284    "INIT_CMD_UPDT_IDLE",
    83     "INIT_CMD_WRITE_BRDCAST",
    8485    "INIT_CMD_UPDT_NLINE",
    8586    "INIT_CMD_UPDT_INDEX",
    8687    "INIT_CMD_UPDT_DATA",
    8788    "INIT_CMD_CAS_UPDT_IDLE",
    88     "INIT_CMD_CAS_BRDCAST",
    8989    "INIT_CMD_CAS_UPDT_NLINE",
    9090    "INIT_CMD_CAS_UPDT_INDEX",
     
    175175    "CAS_DIR_LOCK",
    176176    "CAS_DIR_HIT_READ",
     177    "CAS_DIR_HIT_COMPARE",
    177178    "CAS_DIR_HIT_WRITE",
    178179    "CAS_UPT_LOCK",
     
    372373    r_alloc_heap_fsm("r_alloc_heap_fsm"),
    373374    r_alloc_heap_reset_cpt("r_alloc_heap_reset_cpt")
     375
     376#if MONITOR_MEMCACHE_FSM
     377    ,
     378    p_read_fsm       ("p_read_fsm"),
     379    p_write_fsm      ("p_write_fsm"),
     380    p_xram_rsp_fsm   ("p_xram_rsp_fsm"),
     381    p_cas_fsm        ("p_cas_fsm"),
     382    p_cleanup_fsm    ("p_cleanup_fsm"),
     383    p_alloc_heap_fsm ("p_alloc_heap_fsm"),
     384    p_alloc_dir_fsm  ("p_alloc_dir_fsm"),
     385    p_alloc_trt_fsm  ("p_alloc_trt_fsm"),
     386    p_alloc_upt_fsm  ("p_alloc_upt_fsm"),
     387    p_tgt_cmd_fsm    ("p_tgt_cmd_fsm"),
     388    p_tgt_rsp_fsm    ("p_tgt_rsp_fsm"),
     389    p_ixr_cmd_fsm    ("p_ixr_cmd_fsm"),
     390    p_ixr_rsp_fsm    ("p_ixr_rsp_fsm"),
     391    p_init_cmd_fsm   ("p_init_cmd_fsm"),
     392    p_init_rsp_fsm   ("p_init_rsp_fsm")
     393#endif
    374394    {
    375395      assert(IS_POW_OF_2(nsets));
     
    434454
    435455      // Allocation for CAS FSM
    436       r_cas_to_ixr_cmd_data        = new sc_signal<data_t>[nwords];
    437       r_cas_rdata                  = new sc_signal<data_t>[2];
     456      r_cas_to_ixr_cmd_data       = new sc_signal<data_t>[nwords];
     457      r_cas_data                  = new sc_signal<data_t>[nwords];
     458      r_cas_rdata                 = new sc_signal<data_t>[2];
    438459
    439460
     
    684705
    685706    r_copies_limit         = 3;
     707
     708    r_tgt_rsp_key_sent     = false;
    686709
    687710    // Activity counters
     
    43594382                r_cas_count      = entry.count;
    43604383
    4361                 if ( entry.valid )  r_cas_fsm = CAS_DIR_HIT_READ;
    4362                 else          r_cas_fsm = CAS_MISS_TRT_LOCK;
     4384                if ( entry.valid ) r_cas_fsm = CAS_DIR_HIT_READ;
     4385                else               r_cas_fsm = CAS_MISS_TRT_LOCK;
    43634386
    43644387#if DEBUG_MEMC_CAS
     
    43874410        /////////////////////
    43884411        case CAS_DIR_HIT_READ:  // update directory for lock and dirty bit
    4389                                // and check data change in cache
     4412                                // and check data change in cache
    43904413        {
    43914414            size_t way  = r_cas_way.read();
    43924415            size_t set  = m_y[(vci_addr_t)(m_cmd_cas_addr_fifo.read())];
    4393             size_t word = m_x[(vci_addr_t)(m_cmd_cas_addr_fifo.read())];
    43944416
    43954417            // update directory (lock & dirty bits)
     
    43994421            entry.dirty          = true;
    44004422            entry.lock           = true;
    4401             entry.tag          = r_cas_tag.read();
     4423            entry.tag            = r_cas_tag.read();
    44024424            entry.owner.srcid    = r_cas_copy.read();
    44034425#if L1_MULTI_CACHE
     
    44104432            m_cache_directory.write(set, way, entry);
    44114433
    4412             // read data in cache & check data change
    4413             bool ok = ( r_cas_rdata[0].read() == m_cache_data.read(way, set, word) );
    4414             if ( r_cas_cpt.read()==4 )  // 64 bits CAS
    4415                 ok &= ( r_cas_rdata[1] == m_cache_data.read(way, set, word+1));
     4434            // Stored data from cache in buffer to do the comparison in next state
     4435            m_cache_data.read_line(way, set, r_cas_data);
     4436
     4437            r_cas_fsm = CAS_DIR_HIT_COMPARE;
     4438
     4439#if DEBUG_MEMC_CAS
     4440            if(m_debug_cas_fsm)
     4441            {
     4442                std::cout
     4443                    << "  <MEMC " << name() << ".CAS_DIR_HIT_READ> Read data from "
     4444                    << " cache and store it in buffer"
     4445                    << std::endl;
     4446            }
     4447#endif
     4448            break;
     4449        }
     4450
     4451        case CAS_DIR_HIT_COMPARE:
     4452        {
     4453            size_t word = m_x[(vci_addr_t)(m_cmd_cas_addr_fifo.read())];
     4454
     4455            // Read data in buffer & check data change
     4456            bool ok = (r_cas_rdata[0].read() == r_cas_data[word].read());
     4457
     4458            if(r_cas_cpt.read() == 4)     // 64 bits CAS
     4459                ok &= (r_cas_rdata[1] == r_cas_data[word+1]);
    44164460
    44174461            // to avoid livelock, force the atomic access to fail pseudo-randomly
    4418             bool forced_fail = ( (r_cas_lfsr % (64) == 0) && RANDOMIZE_CAS );
    4419             r_cas_lfsr = (r_cas_lfsr >> 1) ^ ((-(r_cas_lfsr & 1)) & 0xd0000001);
    4420 
    4421             if( ok and not forced_fail )  // no data change
     4462            bool forced_fail = ((r_cas_lfsr % (64) == 0) && RANDOMIZE_CAS);
     4463            r_cas_lfsr = (r_cas_lfsr >> 1) ^ ((- (r_cas_lfsr & 1)) & 0xd0000001);
     4464
     4465            // cas success
     4466            if(ok and not forced_fail)
    44224467            {
    44234468                r_cas_fsm = CAS_DIR_HIT_WRITE;
    44244469            }
    4425             else                            // return failure
     4470            // cas failure
     4471            else
    44264472            {
    44274473                r_cas_fsm = CAS_RSP_FAIL;
     
    44294475
    44304476#if DEBUG_MEMC_CAS
    4431 if( m_debug_cas_fsm )
    4432 {
    4433     std::cout << "  <MEMC " << name() << ".CAS_DIR_HIT_READ> Test if CAS success:"
    4434               << " / expected value = " << r_cas_rdata[0].read()
    4435               << " / actual value = " << m_cache_data.read(way, set, word)
    4436               << " / forced_fail = " << forced_fail << std::endl;
    4437 }
     4477            if(m_debug_cas_fsm)
     4478            {
     4479                std::cout
     4480                    << "  <MEMC " << name() << ".CAS_DIR_HIT_COMPARE> Compare the old"
     4481                    << " and the new data"
     4482                    << " / expected value = " << r_cas_rdata[0].read()
     4483                    << " / actual value = "   << r_cas_data[word].read()
     4484                    << " / forced_fail = "    << forced_fail << std::endl;
     4485            }
    44384486#endif
    44394487            break;
     
    54935541}
    54945542#endif
    5495                 if ( r_tgt_rsp_cpt.read() == (r_read_to_tgt_rsp_word.read()+r_read_to_tgt_rsp_length-1) )
     5543       
     5544                uint32_t last_word_idx = r_read_to_tgt_rsp_word.read() + r_read_to_tgt_rsp_length.read() - 1;
     5545                bool     is_last_word  = (r_tgt_rsp_cpt.read() == last_word_idx);
     5546                bool     is_ll         = ((r_read_to_tgt_rsp_pktid.read() & 0x7) == TYPE_LL);
     5547
     5548                if ( (is_last_word and not is_ll) or (r_tgt_rsp_key_sent.read() and is_ll))
    54965549                {
    5497                     r_tgt_rsp_fsm = TGT_RSP_READ_IDLE;
     5550                    // Last word in case of READ or second flit in case if LL
     5551                    r_tgt_rsp_key_sent    = false;
    54985552                    r_read_to_tgt_rsp_req = false;
     5553                    r_tgt_rsp_fsm         = TGT_RSP_READ_IDLE;
    54995554                }
    55005555                else
    55015556                {
    5502                     r_tgt_rsp_cpt = r_tgt_rsp_cpt.read() + 1;
     5557                    if (is_ll) {
     5558                      r_tgt_rsp_key_sent = true;                // Send second flit of ll
     5559                    }
     5560                    else {
     5561                      r_tgt_rsp_cpt = r_tgt_rsp_cpt.read() + 1; // Send next word of read
     5562                    }
    55035563                }
    55045564            }
     
    55835643}
    55845644#endif
    5585                 if ( (r_tgt_rsp_cpt.read() ==
    5586                      (r_xram_rsp_to_tgt_rsp_word.read()+r_xram_rsp_to_tgt_rsp_length.read()-1))
    5587                    || r_xram_rsp_to_tgt_rsp_rerror.read() )
     5645                uint32_t last_word_idx = r_xram_rsp_to_tgt_rsp_word.read() + r_xram_rsp_to_tgt_rsp_length.read() - 1;
     5646                bool     is_last_word  = (r_tgt_rsp_cpt.read() == last_word_idx);
     5647                bool     is_ll         = ((r_xram_rsp_to_tgt_rsp_pktid.read() & 0x7) == TYPE_LL);
     5648                bool     is_error      = r_xram_rsp_to_tgt_rsp_rerror.read();
     5649
     5650                if (((is_last_word or is_error) and not is_ll) or
     5651                     (r_tgt_rsp_key_sent.read() and     is_ll))
    55885652                {
    5589                     r_tgt_rsp_fsm = TGT_RSP_XRAM_IDLE;
     5653                    // Last word sent in case of READ or second flit sent in case if LL
     5654                    r_tgt_rsp_key_sent        = false;
    55905655                    r_xram_rsp_to_tgt_rsp_req = false;
     5656                    r_tgt_rsp_fsm             = TGT_RSP_XRAM_IDLE;
    55915657                }
    55925658                else
    55935659                {
    5594                     r_tgt_rsp_cpt = r_tgt_rsp_cpt.read() + 1;
     5660                    if (is_ll)
     5661                    {
     5662                      r_tgt_rsp_key_sent = true;                     // Send second flit of ll
     5663                    }                                                                           
     5664                    else
     5665                    {                                                                       
     5666                      r_tgt_rsp_cpt      = r_tgt_rsp_cpt.read() + 1; // Send next word of read
     5667                    }
    55955668                }
    55965669            }
     
    58195892        ////////////////////
    58205893        case ALLOC_DIR_CAS:
    5821         if ((( r_cas_fsm.read()        != CAS_DIR_REQ       )  &&
    5822              ( r_cas_fsm.read()        != CAS_DIR_LOCK      )  &&
    5823              ( r_cas_fsm.read()        != CAS_DIR_HIT_READ  )  &&
    5824              ( r_cas_fsm.read()        != CAS_DIR_HIT_WRITE )  &&
    5825              ( r_cas_fsm.read()        != CAS_BC_TRT_LOCK   )  &&
    5826              ( r_cas_fsm.read()        != CAS_BC_UPT_LOCK   )  &&
    5827              ( r_cas_fsm.read()        != CAS_MISS_TRT_LOCK )  &&
    5828              ( r_cas_fsm.read()        != CAS_UPT_LOCK      )  &&
    5829              ( r_cas_fsm.read()        != CAS_UPT_HEAP_LOCK ))
     5894        if ((( r_cas_fsm.read()        != CAS_DIR_REQ        )  &&
     5895             ( r_cas_fsm.read()        != CAS_DIR_LOCK       )  &&
     5896             ( r_cas_fsm.read()        != CAS_DIR_HIT_READ   )  &&
     5897             ( r_cas_fsm.read()        != CAS_DIR_HIT_COMPARE)  &&
     5898             ( r_cas_fsm.read()        != CAS_DIR_HIT_WRITE  )  &&
     5899             ( r_cas_fsm.read()        != CAS_BC_TRT_LOCK    )  &&
     5900             ( r_cas_fsm.read()        != CAS_BC_UPT_LOCK    )  &&
     5901             ( r_cas_fsm.read()        != CAS_MISS_TRT_LOCK  )  &&
     5902             ( r_cas_fsm.read()        != CAS_UPT_LOCK       )  &&
     5903             ( r_cas_fsm.read()        != CAS_UPT_HEAP_LOCK  ))
    58305904            ||
    5831             (( r_cas_fsm.read()        == CAS_UPT_HEAP_LOCK )  &&
    5832              ( r_alloc_heap_fsm.read() == ALLOC_HEAP_CAS    ))
     5905            (( r_cas_fsm.read()        == CAS_UPT_HEAP_LOCK  )  &&
     5906             ( r_alloc_heap_fsm.read() == ALLOC_HEAP_CAS     ))
    58335907            ||
    5834             (( r_cas_fsm.read()        == CAS_MISS_TRT_LOCK )  &&
    5835              ( r_alloc_trt_fsm.read()  == ALLOC_TRT_CAS     )))
     5908            (( r_cas_fsm.read()        == CAS_MISS_TRT_LOCK  )  &&
     5909             ( r_alloc_trt_fsm.read()  == ALLOC_TRT_CAS      )))
    58365910        {
    58375911          if ( r_cleanup_fsm.read() == CLEANUP_DIR_REQ )
     
    63286402/////////////////////////////
    63296403{
     6404#if MONITOR_MEMCACHE_FSM
     6405    p_read_fsm.write      (r_read_fsm.read());
     6406    p_write_fsm.write     (r_write_fsm.read());
     6407    p_xram_rsp_fsm.write  (r_xram_rsp_fsm.read());
     6408    p_cas_fsm.write       (r_cas_fsm.read());
     6409    p_cleanup_fsm.write   (r_cleanup_fsm.read());
     6410    p_alloc_heap_fsm.write(r_alloc_heap_fsm.read());
     6411    p_alloc_dir_fsm.write (r_alloc_dir_fsm.read());
     6412    p_alloc_trt_fsm.write (r_alloc_trt_fsm.read());
     6413    p_alloc_upt_fsm.write (r_alloc_upt_fsm.read());
     6414    p_tgt_cmd_fsm.write   (r_tgt_cmd_fsm.read());
     6415    p_tgt_rsp_fsm.write   (r_tgt_rsp_fsm.read());
     6416    p_ixr_cmd_fsm.write   (r_ixr_cmd_fsm.read());
     6417    p_ixr_rsp_fsm.write   (r_ixr_rsp_fsm.read());
     6418    p_init_cmd_fsm.write  (r_init_cmd_fsm.read());
     6419    p_init_rsp_fsm.write  (r_init_rsp_fsm.read());
     6420#endif
    63306421    ////////////////////////////////////////////////////////////
    63316422    // Command signals on the p_vci_ixr port
     
    64556546        p_vci_tgt.reop    = false;
    64566547        break;
     6548
    64576549      case TGT_RSP_READ:
    6458         p_vci_tgt.rspval   = true;
    6459         if( ((r_read_to_tgt_rsp_pktid.read() & 0x7) == TYPE_LL)
    6460             && (r_tgt_rsp_cpt.read() == (r_read_to_tgt_rsp_word.read()+r_read_to_tgt_rsp_length-1)) )
    6461           p_vci_tgt.rdata  = r_read_to_tgt_rsp_data[r_tgt_rsp_cpt.read()-1].read();
    6462         else if ((r_read_to_tgt_rsp_pktid.read() & 0x7) == TYPE_LL)
    6463           p_vci_tgt.rdata  = r_read_to_tgt_rsp_ll_key.read();
     6550      {
     6551        uint32_t last_word_idx = r_read_to_tgt_rsp_word.read() + r_read_to_tgt_rsp_length - 1;
     6552        bool     is_last_word  = (r_tgt_rsp_cpt.read() == last_word_idx);
     6553        bool     is_ll         = ((r_read_to_tgt_rsp_pktid.read() & 0x7) == TYPE_LL);
     6554
     6555        p_vci_tgt.rspval  = true;
     6556
     6557        if ( is_ll and not r_tgt_rsp_key_sent.read() )
     6558        {
     6559          // LL response first flit
     6560          p_vci_tgt.rdata = r_read_to_tgt_rsp_ll_key.read();
     6561        }
    64646562        else
    6465           p_vci_tgt.rdata  = r_read_to_tgt_rsp_data[r_tgt_rsp_cpt.read()].read();
    6466         p_vci_tgt.rsrcid   = r_read_to_tgt_rsp_srcid.read();
    6467         p_vci_tgt.rtrdid   = r_read_to_tgt_rsp_trdid.read();
    6468         p_vci_tgt.rpktid   = r_read_to_tgt_rsp_pktid.read();
    6469         p_vci_tgt.rerror   = 0;
    6470         p_vci_tgt.reop     = ( r_tgt_rsp_cpt.read() == (r_read_to_tgt_rsp_word.read()+r_read_to_tgt_rsp_length-1) );
     6563        {
     6564          // LL response second flit or READ response
     6565          p_vci_tgt.rdata = r_read_to_tgt_rsp_data[r_tgt_rsp_cpt.read()].read();
     6566        }
     6567
     6568        p_vci_tgt.rsrcid  = r_read_to_tgt_rsp_srcid.read();
     6569        p_vci_tgt.rtrdid  = r_read_to_tgt_rsp_trdid.read();
     6570        p_vci_tgt.rpktid  = r_read_to_tgt_rsp_pktid.read();
     6571        p_vci_tgt.rerror  = 0;
     6572        p_vci_tgt.reop    = (is_last_word and not is_ll) or (r_tgt_rsp_key_sent.read() and is_ll);
    64716573        break;
     6574      }
     6575
    64726576      case TGT_RSP_WRITE:
    64736577        /*if( ((r_write_to_tgt_rsp_pktid.read() & 0x7) == TYPE_SC) )
     
    64876591        p_vci_tgt.reop     = true;
    64886592        break;
     6593
    64896594      case TGT_RSP_CLEANUP:
    64906595        p_vci_tgt.rspval   = true;
     
    64966601        p_vci_tgt.reop     = true;
    64976602        break;
     6603
    64986604      case TGT_RSP_CAS:
    64996605        p_vci_tgt.rspval   = true;
     
    65056611        p_vci_tgt.reop     = true;
    65066612        break;
     6613
    65076614      case TGT_RSP_XRAM:
    6508         p_vci_tgt.rspval   = true;
    6509         if( ((r_xram_rsp_to_tgt_rsp_pktid.read() & 0x7) == TYPE_LL)
    6510             && (r_tgt_rsp_cpt.read() == (r_xram_rsp_to_tgt_rsp_word.read()+r_xram_rsp_to_tgt_rsp_length-1)) )
    6511           p_vci_tgt.rdata  = r_xram_rsp_to_tgt_rsp_ll_key.read();
    6512         else
    6513           p_vci_tgt.rdata  = r_xram_rsp_to_tgt_rsp_data[r_tgt_rsp_cpt.read()].read();
    6514         p_vci_tgt.rsrcid   = r_xram_rsp_to_tgt_rsp_srcid.read();
    6515         p_vci_tgt.rtrdid   = r_xram_rsp_to_tgt_rsp_trdid.read();
    6516         p_vci_tgt.rpktid   = r_xram_rsp_to_tgt_rsp_pktid.read();
    6517         p_vci_tgt.rerror   = r_xram_rsp_to_tgt_rsp_rerror.read();
    6518         p_vci_tgt.reop     = (( r_tgt_rsp_cpt.read()
    6519               == (r_xram_rsp_to_tgt_rsp_word.read()+r_xram_rsp_to_tgt_rsp_length.read()-1))
    6520             || r_xram_rsp_to_tgt_rsp_rerror.read());
     6615      {
     6616        uint32_t last_word_idx = r_xram_rsp_to_tgt_rsp_word.read() + r_xram_rsp_to_tgt_rsp_length.read() - 1;
     6617        bool     is_last_word  = (r_tgt_rsp_cpt.read() == last_word_idx);
     6618        bool     is_ll         = ((r_xram_rsp_to_tgt_rsp_pktid.read() & 0x7) == TYPE_LL);
     6619        bool     is_error      = r_xram_rsp_to_tgt_rsp_rerror.read();
     6620
     6621        p_vci_tgt.rspval  = true;
     6622
     6623        if( is_ll and not r_tgt_rsp_key_sent.read() ) {
     6624          // LL response first flit
     6625          p_vci_tgt.rdata = r_xram_rsp_to_tgt_rsp_ll_key.read();
     6626        }
     6627        else {
     6628          // LL response second flit or READ response
     6629          p_vci_tgt.rdata = r_xram_rsp_to_tgt_rsp_data[r_tgt_rsp_cpt.read()].read();
     6630        }
     6631
     6632        p_vci_tgt.rsrcid  = r_xram_rsp_to_tgt_rsp_srcid.read();
     6633        p_vci_tgt.rtrdid  = r_xram_rsp_to_tgt_rsp_trdid.read();
     6634        p_vci_tgt.rpktid  = r_xram_rsp_to_tgt_rsp_pktid.read();
     6635        p_vci_tgt.rerror  = is_error;
     6636        p_vci_tgt.reop    = (((is_last_word or is_error) and not is_ll) or
     6637                              (r_tgt_rsp_key_sent.read() and     is_ll));
    65216638        break;
     6639      }
     6640
    65226641      case TGT_RSP_INIT:
    65236642        p_vci_tgt.rspval   = true;
Note: See TracChangeset for help on using the changeset viewer.