diff --git a/src_Core/CPU/MMIO_AXI4_Adapter.bsv b/src_Core/CPU/MMIO_AXI4_Adapter.bsv index 0cebab4..e33dc51 100644 --- a/src_Core/CPU/MMIO_AXI4_Adapter.bsv +++ b/src_Core/CPU/MMIO_AXI4_Adapter.bsv @@ -118,7 +118,7 @@ module mkMMIO_AXI4_Adapter (MMIO_AXI4_Adapter_IFC); // Technically the following check for legal IO addrs is not // necessary; the AXI4 fabric should return a DECERR for illegal // addrs; but not all AXI4 fabrics do the right thing. - if (soc_map.m_is_IO_addr (req.addr)) begin + if (soc_map.m_is_IO_addr (req.addr, False)) begin AXI4_Size size = 8; let mem_req_rd_addr = AXI4_ARFlit {arid: fabric_2x3_default_mid, araddr: req.addr, @@ -206,7 +206,7 @@ module mkMMIO_AXI4_Adapter (MMIO_AXI4_Adapter_IFC); // Technically the following check for legal IO addrs is not // necessary; the AXI4 fabric should return a DECERR for illegal // addrs; but not all AXI4 fabrics do the right thing. - if (soc_map.m_is_IO_addr (req.addr)) begin + if (soc_map.m_is_IO_addr (req.addr, False)) begin //fa_fabric_send_write_req (req.addr, truncate(pack(req.byteEn)), fromMemTaggedData(req.data)); // on first flit... // ================ diff --git a/src_Core/RISCY_OOO/procs/lib/MMIOInst.bsv b/src_Core/RISCY_OOO/procs/lib/MMIOInst.bsv index 0429386..88ecfc3 100644 --- a/src_Core/RISCY_OOO/procs/lib/MMIOInst.bsv +++ b/src_Core/RISCY_OOO/procs/lib/MMIOInst.bsv @@ -91,7 +91,7 @@ module mkMMIOInst(MMIOInst); method InstFetchTarget getFetchTarget(Addr phyPc); let addr = getDataAlignedAddr(phyPc); - if (soc_map.m_is_IO_addr (phyPc)) begin + if (soc_map.m_is_IO_addr (phyPc, True)) begin return IODevice; end else if(addr >= mainMemBaseAddr && (addr < mainMemBoundAddr) && diff --git a/src_SSITH_P3/src_BSV/SoC_Map.bsv b/src_SSITH_P3/src_BSV/SoC_Map.bsv index 7b6932e..0b2da5b 100644 --- a/src_SSITH_P3/src_BSV/SoC_Map.bsv +++ b/src_SSITH_P3/src_BSV/SoC_Map.bsv @@ -102,7 +102,7 @@ interface SoC_Map_IFC; method Bool m_is_mem_addr (Fabric_Addr addr); (* always_ready *) - method Bool m_is_IO_addr (Fabric_Addr addr); + method Bool m_is_IO_addr (Fabric_Addr addr, Bool imem_not_dmem); (* always_ready *) method Bool m_is_near_mem_IO_addr (Fabric_Addr addr); @@ -225,25 +225,28 @@ module mkSoC_Map (SoC_Map_IFC); // Identifies I/O addresses in the Fabric. // (Caches needs this information to avoid cacheing these addresses.) - function Bool fn_is_IO_addr (Fabric_Addr addr); - return ( inRange(plic_addr_range, addr) - || inRange(near_mem_io_addr_range, addr) - || inRange(flash_mem_addr_range, addr) - || inRange(ethernet_0_addr_range, addr) - || inRange(dma_0_addr_range, addr) - || inRange(uart16550_0_addr_range, addr) - || inRange(gpio_0_addr_range, addr) - || inRange(boot_rom_addr_range, addr) + function Bool fn_is_IO_addr (Fabric_Addr addr, Bool imem_not_dmem); + return ( inRange(boot_rom_addr_range, addr) || inRange(ddr4_0_uncached_addr_range, addr) - || fn_is_flash_regs_addr (addr) - || fn_is_uart1_addr (addr) - || fn_is_i2c_addr (addr) - || fn_is_spi_addr (addr) - || fn_is_uart2_addr (addr) - || fn_is_gpio1_addr (addr) - || fn_is_gpio2_addr (addr) - || fn_is_xdma_control (addr) - || fn_is_xdma_ecam (addr) + || inRange(flash_mem_addr_range, addr) + || ( (! imem_not_dmem) + && ( inRange(plic_addr_range, addr) + || inRange(near_mem_io_addr_range, addr) + || inRange(ethernet_0_addr_range, addr) + || inRange(dma_0_addr_range, addr) + || inRange(uart16550_0_addr_range, addr) + || inRange(gpio_0_addr_range, addr) + || fn_is_flash_regs_addr (addr) + || fn_is_uart1_addr (addr) + || fn_is_i2c_addr (addr) + || fn_is_spi_addr (addr) + || fn_is_uart2_addr (addr) + || fn_is_gpio1_addr (addr) + || fn_is_gpio2_addr (addr) + || fn_is_xdma_control (addr) + || fn_is_xdma_ecam (addr) + ) + ) ); endfunction @@ -271,7 +274,7 @@ module mkSoC_Map (SoC_Map_IFC); method Bool m_is_mem_addr (Fabric_Addr addr) = fn_is_mem_addr (addr); - method Bool m_is_IO_addr (Fabric_Addr addr) = fn_is_IO_addr (addr); + method Bool m_is_IO_addr (Fabric_Addr addr, Bool imem_not_dmem) = fn_is_IO_addr (addr, imem_not_dmem); method Bool m_is_near_mem_IO_addr (Fabric_Addr addr) = inRange (near_mem_io_addr_range, addr); diff --git a/src_Testbench/SoC/SoC_Map.bsv b/src_Testbench/SoC/SoC_Map.bsv index b65bde6..315bc14 100644 --- a/src_Testbench/SoC/SoC_Map.bsv +++ b/src_Testbench/SoC/SoC_Map.bsv @@ -106,7 +106,7 @@ interface SoC_Map_IFC; method Bool m_is_mem_addr (Fabric_Addr addr); (* always_ready *) - method Bool m_is_IO_addr (Fabric_Addr addr); + method Bool m_is_IO_addr (Fabric_Addr addr, Bool imem_not_dmem); (* always_ready *) method Bool m_is_near_mem_IO_addr (Fabric_Addr addr); @@ -196,11 +196,15 @@ module mkSoC_Map (SoC_Map_IFC); // Identifies I/O addresses in the Fabric. // (Caches need this information to avoid cacheing these addresses.) - function Bool fn_is_IO_addr (Fabric_Addr addr); - return ( inRange(boot_rom_addr_range, addr) - || inRange(near_mem_io_addr_range, addr) - || inRange(plic_addr_range, addr) - || inRange(uart0_addr_range, addr)); + function Bool fn_is_IO_addr (Fabric_Addr addr, Bool imem_not_dmem); + return ( inRange(boot_rom_addr_range, addr) + || ( (! imem_not_dmem) + && ( inRange(near_mem_io_addr_range, addr) + || inRange(plic_addr_range, addr) + || inRange(uart0_addr_range, addr) + ) + ) + ); endfunction // ---------------------------------------------------------------- @@ -224,7 +228,7 @@ module mkSoC_Map (SoC_Map_IFC); method Bool m_is_mem_addr (Fabric_Addr addr) = fn_is_mem_addr (addr); - method Bool m_is_IO_addr (Fabric_Addr addr) = fn_is_IO_addr (addr); + method Bool m_is_IO_addr (Fabric_Addr addr, Bool imem_not_dmem) = fn_is_IO_addr (addr, imem_not_dmem); method Bool m_is_near_mem_IO_addr (Fabric_Addr addr) = inRange (near_mem_io_addr_range, addr);