Changeset 984


Ignore:
Timestamp:
Apr 19, 2015, 5:19:34 PM (9 years ago)
Author:
cfuguet
Message:

bugfixes on vci_io_bridge:

Several bugfixes concerning the use of the IOMMU.

  • The control registers for the TLB prefetch buffer were either not set or set erroneously.
  • Add a new set/reset register between the WTI_RSP and the TLB FSMs. This register is used by the WTI_RSP to signal the completion of a MISS TLB transaction.
  • The MISS_WTI_CMD can issue transactions concerning a single word or an entire cache line. The first are used for WTI requests from external peripherals and the second are used for TLB MISS transactions.
  • Several programming errors concerning type casts. Some 64 bits variable were incorrectly cast and therefore, there was some information lost.
Location:
trunk/modules/vci_io_bridge/caba/source
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/modules/vci_io_bridge/caba/source/include/vci_io_bridge.h

    r715 r984  
    2424 *
    2525 * SOCLIB_LGPL_HEADER_END
     26 *
     27 * Maintainers: Cesar Fuguet Tortolero <cesar.fuguet-tortolero@lip6.fr>
    2628 */
    2729/////////////////////////////////////////////////////////////////////////////////
     
    120122    enum
    121123    {
    122         CACHE_LINE_MASK    = 0xFFFFFFFFC0LL,
     124        CACHE_LINE_MASK    = 0xFFFFFFFFC0ULL,
    123125        PPN1_MASK          = 0x0007FFFF,
    124126        PPN2_MASK          = 0x0FFFFFFF,
     
    365367    sc_signal<vci_pktid_t>      r_miss_wti_rsp_to_dma_rsp_rpktid;
    366368
     369    sc_signal<bool>             r_miss_wti_rsp_to_tlb_done;
    367370
    368371    /////////////////////////////////////////////////////
  • trunk/modules/vci_io_bridge/caba/source/src/vci_io_bridge.cpp

    r952 r984  
    2323 *
    2424 * SOCLIB_LGPL_HEADER_END
     25 *
     26 * Maintainers: Cesar Fuguet Tortolero <cesar.fuguet-tortolero@lip6.fr>
    2527 */
    2628
     
    115117}
    116118
    117 #define tmpl(...)  template<typename vci_param_int,typename vci_param_ext> __VA_ARGS__ VciIoBridge<vci_param_int,vci_param_ext>
     119#define tmpl(...)  template<typename vci_param_int,typename vci_param_ext> \
     120    __VA_ARGS__ VciIoBridge<vci_param_int,vci_param_ext>
    118121
    119122////////////////////////
     
    258261      r_miss_wti_rsp_to_dma_rsp_rtrdid("r_miss_wti_rsp_to_dma_rsp_rtrdid"),
    259262      r_miss_wti_rsp_to_dma_rsp_rpktid("r_miss_wti_rsp_to_dma_rsp_rpktid"),
     263
     264      r_miss_wti_rsp_to_tlb_done("r_miss_wti_rsp_to_tlb_done"),
    260265
    261266      // TLB for IOMMU
     
    546551        r_tlb_to_miss_wti_cmd_req      = false;
    547552        r_miss_wti_rsp_to_dma_rsp_req  = false;
     553        r_miss_wti_rsp_to_tlb_done     = false;
    548554
    549555        // error flip_flops
     
    610616    vci_pktid_t     miss_wti_cmd_fifo_pktid   = 0;
    611617    int_data_t      miss_wti_cmd_fifo_wdata   = 0;
     618    vci_plen_t      miss_wti_cmd_fifo_plen    = 0;
    612619
    613620#ifdef INSTRUMENTATION
     
    649656        if ( p_vci_tgt_iox.cmdval.read() )
    650657        {
    651             if ( not r_iommu_active.read() )    // tlb not activated
    652             {
    653                 // save paddr address
    654                 r_dma_cmd_paddr = p_vci_tgt_iox.address.read();
    655 
    656                 // analyse paddr for WTI/DMA routing
    657                 // WTI requests must be single flit (READ or WRITE)
    658                 if ( is_wti( p_vci_tgt_iox.address.read() ) )
    659                 {
    660                     assert( p_vci_tgt_iox.eop.read() and
    661                     "ERROR in VCI_IOB illegal VCI WTI command from IOX network");
    662 
    663                     r_dma_cmd_fsm = DMA_CMD_WTI_IOX_REQ;
    664                 }
    665                 else
    666                 {
    667                     r_dma_cmd_fsm = DMA_CMD_DMA_REQ;
    668                 }
    669658
    670659#if DEBUG_DMA_CMD
     
    678667          << " / eop = " << p_vci_tgt_iox.eop.read() << std::endl;
    679668#endif
     669
     670            if ( not r_iommu_active.read() )    // tlb not activated
     671            {
     672                // save paddr address
     673                r_dma_cmd_paddr = p_vci_tgt_iox.address.read();
     674
     675                // analyse paddr for WTI/DMA routing
     676                // WTI requests must be single flit (READ or WRITE)
     677                if ( is_wti( p_vci_tgt_iox.address.read() ) )
     678                {
     679                    assert( p_vci_tgt_iox.eop.read() and
     680                    "ERROR in VCI_IOB illegal VCI WTI command from IOX network");
     681
     682                    r_dma_cmd_fsm = DMA_CMD_WTI_IOX_REQ;
     683                }
     684                else
     685                {
     686                    r_dma_cmd_fsm = DMA_CMD_DMA_REQ;
     687                }
     688
    680689            }
    681690            else if (r_tlb_fsm.read() == TLB_IDLE ||
     
    735744                        if ( is_wti( iotlb_paddr ) )
    736745                        {
    737                             assert( p_vci_tgt_iox.eop.read() and
    738                                    (p_vci_tgt_iox.cmd.read() == vci_param_int::CMD_WRITE) and
     746                            assert( p_vci_tgt_iox.eop.read() &&
    739747                            "ERROR in VCI_IOB illegal VCI WTI command from IOX network");
    740748
     
    10801088        {
    10811089            // Checking prefetch buffer
    1082             if( not r_tlb_buf_big_page )     // small page => PTE2
    1083             {
    1084                 if( r_tlb_buf_valid &&         // Hit on prefetch buffer
     1090            if( r_tlb_buf_valid.read() )
     1091            {
     1092                if ( !r_tlb_buf_big_page.read() &&  // Hit on prefetch buffer and small page => PTE2
    10851093                    (r_tlb_buf_vaddr.read() ==
    1086                     (r_dma_cmd_to_tlb_vaddr.read()& ~PTE2_LINE_OFFSET & ~K_PAGE_OFFSET_MASK)))
    1087                 {
    1088                     size_t   pte_offset = (r_dma_cmd_to_tlb_vaddr.read()& PTE2_LINE_OFFSET)>>12;
     1094                    (r_dma_cmd_to_tlb_vaddr.read() & ~PTE2_LINE_OFFSET & ~K_PAGE_OFFSET_MASK)))
     1095                {
     1096                    size_t   pte_offset = (r_dma_cmd_to_tlb_vaddr.read() & PTE2_LINE_OFFSET) >> 12;
    10891097                    uint32_t pte_flags  = r_tlb_buf_data[2*pte_offset];
    10901098                    uint32_t pte_ppn    = r_tlb_buf_data[2*pte_offset+1];
     
    11221130                    break;
    11231131                }
    1124             }
    1125             else                             // big page => PTE1
    1126             {
    1127                 if( r_tlb_buf_valid &&         // Hit on prefetch buffer
     1132
     1133                if( r_tlb_buf_big_page.read() &&         // Hit on prefetch buffer and big page
    11281134                    (r_tlb_buf_vaddr.read() ==
    1129                     (r_dma_cmd_to_tlb_vaddr.read()& ~PTE1_LINE_OFFSET & ~M_PAGE_OFFSET_MASK )))
    1130                 {
    1131                     size_t   pte_offset = (r_dma_cmd_to_tlb_vaddr.read()& PTE1_LINE_OFFSET)>>21;
     1135                    (r_dma_cmd_to_tlb_vaddr.read() & ~PTE1_LINE_OFFSET & ~M_PAGE_OFFSET_MASK )))
     1136                {
     1137                    size_t   pte_offset = (r_dma_cmd_to_tlb_vaddr.read() & PTE1_LINE_OFFSET) >> 21;
    11321138                    uint32_t pte_flags  = r_tlb_buf_data[pte_offset];
    11331139
     
    11501156                    }
    11511157
     1158#if DEBUG_TLB_MISS
     1159if ( m_debug_activated )
     1160std::cout << name()
     1161          << "  <IOB TLB_PTE1_GET> Hit on prefetch buffer: PTE1" << std::hex
     1162          << " / paddr = " << r_tlb_paddr.read()
     1163          << std::hex << " / PTE1 = " << pte_flags << std::endl;
     1164#endif
    11521165                    // valid PTE1 : we must update the TLB
    11531166                    r_tlb_pte_flags = pte_flags;
    11541167                    r_tlb_fsm       = TLB_PTE1_SELECT;
     1168
     1169                    break;
     1170                }
     1171            }
     1172
     1173            // prefetch buffer miss
     1174            r_tlb_fsm = TLB_MISS;
     1175
    11551176#if DEBUG_TLB_MISS
    11561177if ( m_debug_activated )
    11571178std::cout << name()
    1158           << "  <IOB TLB_PTE1_GET> Hit on prefetch buffer: PTE1" << std::hex
    1159           << " / paddr = " << r_tlb_paddr.read()
    1160           << std::hex << " / PTE1 = " << pte_flags << std::endl;
    1161 #endif
    1162                     break;
    1163                 }
    1164             }
    1165 
    1166             // prefetch buffer miss
    1167             r_tlb_fsm = TLB_MISS;
    1168 
    1169 #if DEBUG_TLB_MISS
    1170 if ( m_debug_activated )
    1171 std::cout << name()
    11721179          << "  <IOB TLB_IDLE> Miss on prefetch buffer"
    11731180          << std::hex << " / vaddr = " << r_dma_cmd_to_tlb_vaddr.read() << std::endl;
    11741181#endif
    11751182        }
     1183
    11761184        break;
    11771185    }
     
    11921200        if ( not bypass )     // Read PTE1/PTD1 in XRAM
    11931201        {
    1194 
    1195 #if DEBUG_TLB_MISS
    1196 if ( m_debug_activated )
    1197 std::cout << name()
    1198           << "  <IOB TLB_MISS> Read PTE1/PTD1 in memory" << std::endl;
    1199 #endif
    1200             pte_paddr = (vci_addr_t)((r_iommu_ptpr.read()) << (INDEX1_NBITS+2)) |
    1201                         (vci_addr_t)((r_dma_cmd_to_tlb_vaddr.read() >> PAGE_M_NBITS) << 2);
    1202             r_tlb_paddr = pte_paddr;
    1203 
     1202            pte_paddr =
     1203                ((vci_addr_t)r_iommu_ptpr.read() << (INDEX1_NBITS+2)) |
     1204                ((vci_addr_t)(r_dma_cmd_to_tlb_vaddr.read() >> PAGE_M_NBITS) << 2);
     1205            r_tlb_paddr               = pte_paddr;
    12041206            r_tlb_to_miss_wti_cmd_req = true;
    12051207            r_tlb_miss_type           = PTE1_MISS;
    12061208            r_tlb_fsm                 = TLB_WAIT;
     1209
     1210#if DEBUG_TLB_MISS
     1211if ( m_debug_activated )
     1212std::cout << name()
     1213          << "  <IOB TLB_MISS> Read PTE1/PTD1 in memory: PADDR = " << std::hex
     1214          << pte_paddr << std::dec << std::endl;
     1215#endif
    12071216        }
    12081217        else                  // Read PTE2 in XRAM
     
    12151224#endif
    12161225            //&PTE2 = PTBA + IX2 * 8
    1217             pte_paddr = (vci_addr_t)ptba << PAGE_K_NBITS |
    1218                         (vci_addr_t)(r_dma_cmd_to_tlb_vaddr.read()&PTD_ID2_MASK)>>(PAGE_K_NBITS-3);
    1219 
    1220             r_tlb_paddr = pte_paddr;
    1221 
     1226            pte_paddr =
     1227                ((vci_addr_t)ptba << PAGE_K_NBITS) |
     1228                ((vci_addr_t)(r_dma_cmd_to_tlb_vaddr.read()&PTD_ID2_MASK)>>(PAGE_K_NBITS-3));
     1229            r_tlb_paddr               = pte_paddr;
    12221230            r_tlb_to_miss_wti_cmd_req = true;
    12231231            r_tlb_miss_type           = PTE2_MISS;
     
    12381246        // Hit test. Just to verify.
    12391247        // Hit must happen, since we've just finished its' miss transaction
    1240         bool hit = (r_tlb_buf_valid && (r_tlb_buf_tag.read()== line_number) );
    1241         assert(hit and "Error: No hit on prefetch buffer after Miss Transaction");
     1248        bool hit = (r_tlb_buf_valid && (r_tlb_buf_tag.read() == line_number) );
     1249        assert(hit && "Error: No hit on prefetch buffer after Miss Transaction");
    12421250
    12431251        entry = r_tlb_buf_data[word_position];
     
    12571265if ( m_debug_activated )
    12581266{
    1259     std::cout << name()
    1260               << "  <IOB DMA_PTE1_GET> First level entry Unmapped"
    1261               << std::hex << " / paddr = " << r_tlb_paddr.read()
    1262               << std::hex << " / PTE = " << entry << std::endl;
     1267std::cout << name()
     1268          << "  <IOB DMA_PTE1_GET> First level entry Unmapped"
     1269          << std::hex << " / paddr = " << r_tlb_paddr.read()
     1270          << std::hex << " / PTE = " << entry << std::endl;
    12631271}
    12641272#endif
    1265                     break;
     1273            break;
    12661274        }
    12671275
     
    12751283            // &PTE2 = PTBA + IX2 * 8
    12761284            // ps: PAGE_K_NBITS corresponds also to the size of a second level page table
    1277             r_tlb_paddr = (vci_addr_t)(entry & ((1<<(vci_param_int::N-PAGE_K_NBITS))-1)) << PAGE_K_NBITS |
    1278                                 (vci_addr_t)(((r_dma_cmd_to_tlb_vaddr.read() & PTD_ID2_MASK) >> PAGE_K_NBITS) << 3);
     1285            r_tlb_paddr =
     1286                (((vci_addr_t)entry & ((1ULL<<(vci_param_int::N-PAGE_K_NBITS))-1)) << PAGE_K_NBITS) |
     1287                (((vci_addr_t)(r_dma_cmd_to_tlb_vaddr.read() & PTD_ID2_MASK) >> PAGE_K_NBITS) << 3);
    12791288
    12801289            r_tlb_to_miss_wti_cmd_req = true;
     
    12971306                        //  Should not occur if working only with small pages
    12981307        {
    1299             r_tlb_pte_flags   = entry;
    1300             r_tlb_fsm  = TLB_PTE1_SELECT;
     1308            r_tlb_pte_flags = entry;
     1309            r_tlb_fsm       = TLB_PTE1_SELECT;
    13011310
    13021311#if DEBUG_TLB_MISS
     
    13161325        size_t  set;
    13171326
    1318         r_iotlb.select(  r_dma_cmd_to_tlb_vaddr.read(),
     1327        r_iotlb.select( r_dma_cmd_to_tlb_vaddr.read(),
    13191328                        true,  // PTE1
    13201329                        &way,
     
    13331342        r_tlb_way = way;
    13341343        r_tlb_set = set;
    1335         r_tlb_fsm     = TLB_PTE1_UPDT;
     1344        r_tlb_fsm = TLB_PTE1_UPDT;
    13361345        break;
    13371346    }
     
    13401349                            // not necessary to treat the L/R bit
    13411350    {
    1342         uint32_t  pte   = r_tlb_pte_flags.read();
    1343 
    1344         r_tlb_paddr = (vci_addr_t)( ((r_tlb_pte_flags.read() & PPN1_MASK) << 21)
    1345                         | (r_dma_cmd_to_tlb_vaddr.read()& M_PAGE_OFFSET_MASK) );
     1351        uint32_t pte = r_tlb_pte_flags.read();
    13461352
    13471353        // update TLB
    13481354        r_iotlb.write( true,        // 2M page
    1349                       pte,
    1350                       0,        // argument unused for a PTE1
    1351                       r_dma_cmd_to_tlb_vaddr.read(),
    1352                       r_tlb_way.read(),
    1353                       r_tlb_set.read(),
    1354                       0 );      //we set nline = 0
     1355                       pte,
     1356                       0,        // argument unused for a PTE1
     1357                       r_dma_cmd_to_tlb_vaddr.read(),
     1358                       r_tlb_way.read(),
     1359                       r_tlb_set.read(),
     1360                       0 );      //we set nline = 0
    13551361
    13561362#ifdef INSTRUMENTATION
     
    13811387        size_t word_position = (size_t)( ((r_tlb_paddr.read())&(~CACHE_LINE_MASK))>>2 );
    13821388
    1383 
    13841389        // Hit test. Just to verify.
    1385         bool hit = (r_tlb_buf_valid && (r_tlb_buf_tag.read()== line_number) );
     1390        bool hit = (r_tlb_buf_valid && (r_tlb_buf_tag.read() == line_number) );
    13861391        assert(hit and "Error: No hit on prefetch buffer after Miss Transaction");
    13871392        pte_flags= r_tlb_buf_data[word_position];
     
    13941399                      << "The Page Table entry ins't valid (unmapped)" << std::endl;
    13951400
    1396             r_tlb_miss_error       = true;
    1397             r_dma_cmd_to_tlb_req         = false;
     1401            r_tlb_miss_error      = true;
     1402            r_dma_cmd_to_tlb_req  = false;
    13981403            r_tlb_fsm             = TLB_IDLE;
    13991404
     
    14511456                                // not necessary to treat the L/R bit
    14521457    {
    1453         uint32_t        pte_flags = r_tlb_pte_flags.read();
    1454         uint32_t        pte_ppn   = r_tlb_pte_ppn.read();
    1455 
    1456         r_tlb_paddr = (vci_addr_t)( ((r_tlb_pte_ppn.read() & PPN2_MASK) << 12)
    1457                         | (r_dma_cmd_to_tlb_vaddr.read()& K_PAGE_OFFSET_MASK) );
     1458        uint32_t pte_flags = r_tlb_pte_flags.read();
     1459        uint32_t pte_ppn   = r_tlb_pte_ppn.read();
    14581460
    14591461        // update TLB for a PTE2
     
    14971499m_cost_iotlbmiss_transaction++;
    14981500#endif
    1499         if ( not r_tlb_to_miss_wti_cmd_req.read() ) //  Miss transaction completed
    1500         {
     1501        if ( r_miss_wti_rsp_to_tlb_done.read() ) // Miss transaction completed
     1502        {
     1503            r_miss_wti_rsp_to_tlb_done = false;
     1504
     1505            r_tlb_buf_valid = true;
     1506            r_tlb_buf_vaddr = r_dma_cmd_to_tlb_vaddr.read();
     1507            r_tlb_buf_tag   = r_tlb_paddr.read() & CACHE_LINE_MASK;
     1508
    15011509            if ( r_miss_wti_rsp_error_miss.read() ) // bus error reported
    15021510            {
     
    15081516            else if(r_tlb_miss_type == PTE1_MISS)
    15091517            {
     1518                r_tlb_buf_big_page = true;
    15101519                r_tlb_fsm = TLB_PTE1_GET;
    15111520            }
    15121521            else
    15131522            {
     1523                r_tlb_buf_big_page = false;
    15141524                r_tlb_fsm = TLB_PTE2_GET;
    15151525            }
     
    16381648                "ERROR in vci_io_bridge : local config access must be one flit");
    16391649
     1650#if DEBUG_CONFIG_CMD
     1651if( m_debug_activated )
     1652std::cout << name()
     1653          << "  <IOB CONFIG_CMD_IDLE> Command on IOB configuration registers" << std::endl;
     1654#endif
     1655
    16401656                if ( not read && (cell == IOB_IOMMU_PTPR) )       // WRITE PTPR
    16411657                {
    16421658                    r_iommu_ptpr = (uint32_t)wdata;
     1659
     1660#if DEBUG_CONFIG_CMD
     1661if( m_debug_activated )
     1662std::cout << name()
     1663          << "  <IOB CONFIG_CMD_IDLE> Write IOB_IOMMU_PTPR: / wdata = " << std::hex
     1664          << wdata << std::dec << std::endl;
     1665#endif
    16431666                }
    16441667                else if ( read && (cell == IOB_IOMMU_PTPR) )      // READ PTPR
    16451668                {
    16461669                    rdata = r_iommu_ptpr.read();
    1647                 }
    1648                 else if( not read && (cell == IOB_WTI_ENABLE))  // WRITE WTI_ENABLE
     1670
     1671#if DEBUG_CONFIG_CMD
     1672if( m_debug_activated )
     1673std::cout << name()
     1674          << "  <IOB CONFIG_CMD_IDLE> Read IOB_IOMMU_PTPR: / rdata = " << std::hex
     1675          << rdata << std::dec << std::endl;
     1676#endif
     1677                }
     1678                else if ( not read && (cell == IOB_IOMMU_ACTIVE) )     // WRITE ACTIVE
     1679                {
     1680                    r_iommu_active = wdata ? true : false;
     1681
     1682#if DEBUG_CONFIG_CMD
     1683if( m_debug_activated )
     1684std::cout << name()
     1685          << "  <IOB CONFIG_CMD_IDLE> Write IOB_IOMMU_ACTIVE: / wdata = " << std::hex
     1686          << wdata << std::dec << std::endl;
     1687#endif
     1688                }
     1689                else if ( read && (cell == IOB_IOMMU_ACTIVE) )    // READ ACTIVE
     1690                {
     1691                    rdata = r_iommu_active.read();
     1692
     1693#if DEBUG_CONFIG_CMD
     1694if( m_debug_activated )
     1695std::cout << name()
     1696          << "  <IOB CONFIG_CMD_IDLE> Read IOB_IOMMU_ACTIVE: / rdata = " << std::hex
     1697          << rdata << std::dec << std::endl;
     1698#endif
     1699                }
     1700                else if( not read && (cell == IOB_WTI_ENABLE))    // WRITE WTI_ENABLE
    16491701                {
    16501702                    r_iommu_wti_enable = wdata;
    16511703                }
    1652                 else if( read && (cell == IOB_WTI_ENABLE))       // READ WTI ENABLE
     1704                else if( read && (cell == IOB_WTI_ENABLE))        // READ WTI ENABLE
    16531705                {
    16541706                    rdata = r_iommu_wti_enable.read();
     
    16581710                    rdata = r_iommu_bvar.read();
    16591711                }
    1660                 else if( read && (cell == IOB_IOMMU_ETR))          // READ ETR
     1712                else if( read && (cell == IOB_IOMMU_ETR))         // READ ETR
    16611713                {
    16621714                    rdata = r_iommu_etr.read();
     
    16711723                    r_config_cmd_to_tlb_vaddr = (uint32_t)wdata;
    16721724                }
    1673                 else if( not read && (cell == IOB_WTI_ADDR_LO)) // WRITE WTI_PADDR_LO
     1725                else if( not read && (cell == IOB_WTI_ADDR_LO))   // WRITE WTI_PADDR_LO
    16741726                {
    16751727                    r_iommu_wti_addr_lo = (vci_addr_t)wdata;
    16761728                }
    1677                 else if( read && (cell == IOB_WTI_ADDR_LO))    // READ WTI_PADDR_LO
     1729                else if( read && (cell == IOB_WTI_ADDR_LO))       // READ WTI_PADDR_LO
    16781730                {
    16791731                    rdata = r_iommu_wti_addr_lo.read();
    16801732                }
    1681                 else if( not read && (cell == IOB_WTI_ADDR_HI)) // WRITE WTI_PADDR_HI
     1733                else if( not read && (cell == IOB_WTI_ADDR_HI))   // WRITE WTI_PADDR_HI
    16821734                {
    16831735                    r_iommu_wti_addr_hi = (vci_addr_t)wdata;
    16841736                }
    1685                 else if( read && (cell == IOB_WTI_ADDR_HI))    // READ WTI_PADDR_HI
     1737                else if( read && (cell == IOB_WTI_ADDR_HI))       // READ WTI_PADDR_HI
    16861738                {
    16871739                    rdata = r_iommu_wti_addr_hi.read();
     
    21182170         m_miss_wti_cmd_addr_fifo.wok() )                   // put MISS READ
    21192171    {
     2172        r_tlb_to_miss_wti_cmd_req = false;
     2173
    21202174        miss_wti_cmd_fifo_put     = true;
    2121         miss_wti_cmd_fifo_address = r_tlb_paddr.read();
     2175        miss_wti_cmd_fifo_address = r_tlb_paddr.read() & CACHE_LINE_MASK;
    21222176        miss_wti_cmd_fifo_wdata   = 0;
    21232177        miss_wti_cmd_fifo_cmd     = vci_param_int::CMD_READ;
     
    21252179        miss_wti_cmd_fifo_srcid   = m_int_srcid;
    21262180        miss_wti_cmd_fifo_trdid   = 0;
     2181        miss_wti_cmd_fifo_plen    = m_words * vci_param_int::B;
    21272182
    21282183#if DEBUG_MISS_WTI_CMD
     
    21302185std::cout << name()
    21312186          << "  <IOB MISS_WTI_CMD_WTI> push MISS TLB command into MISS_WTI FIFO"
    2132           << " / PADDR = " << miss_wti_cmd_fifo_address << std::endl;
     2187          << " / PADDR = " << std::hex << miss_wti_cmd_fifo_address << std::dec
     2188          << std::endl;
    21332189#endif
    21342190
     
    21462202        miss_wti_cmd_fifo_trdid   = r_dma_cmd_to_miss_wti_cmd_trdid.read();
    21472203        miss_wti_cmd_fifo_pktid   = r_dma_cmd_to_miss_wti_cmd_pktid.read();
     2204        miss_wti_cmd_fifo_plen    = vci_param_int::B;
    21482205
    21492206#if DEBUG_MISS_WTI_CMD
     
    21522209          << "  <IOB MISS_WTI_CMD_WTI> push WTI command into MISS_WTI FIFO"
    21532210          << " / CMD = " << miss_wti_cmd_fifo_cmd
    2154           << " / PADDR = " << miss_wti_cmd_fifo_address << std::endl;
     2211          << " / PADDR = " << std::hex << miss_wti_cmd_fifo_address << std::dec
     2212          << std::endl;
    21552213#endif
    21562214
     
    22792337                if ( p_vci_ini_int.reop.read() )               // last flit
    22802338                {
    2281                     bool eop = p_vci_ini_int.eop.read();
    2282                     assert(((eop == (r_miss_wti_rsp_count.read() == (m_words-1)))) and
     2339                    assert((r_miss_wti_rsp_count.read() == (m_words-1)) and
    22832340                    "VCI_IO_BRIDGE ERROR: invalid length for a TLB MISS response");
    22842341
    2285                     r_miss_wti_rsp_count      = 0;
    2286                     r_miss_wti_rsp_fsm        = MISS_WTI_RSP_IDLE;
    2287                     r_tlb_to_miss_wti_cmd_req = false;
     2342                    r_miss_wti_rsp_count       = 0;
     2343                    r_miss_wti_rsp_fsm         = MISS_WTI_RSP_IDLE;
     2344                    r_miss_wti_rsp_to_tlb_done = true;
    22882345                }
    22892346                else                                           // not the last flit
     
    24572514    m_miss_wti_cmd_plen_fifo.update(   miss_wti_cmd_fifo_get,
    24582515                                       miss_wti_cmd_fifo_put,
    2459                                        4 );
     2516                                       miss_wti_cmd_fifo_plen );
    24602517    m_miss_wti_cmd_wrap_fifo.update(   miss_wti_cmd_fifo_get,
    24612518                                       miss_wti_cmd_fifo_put,
Note: See TracChangeset for help on using the changeset viewer.