Merge branch 'master' into tl2-irrevocable
This commit is contained in:
commit
0a65238920
@ -65,7 +65,7 @@ int main(int argc, char** argv)
|
|||||||
srand48(random_seed);
|
srand48(random_seed);
|
||||||
|
|
||||||
Verilated::randReset(2);
|
Verilated::randReset(2);
|
||||||
VTestHarness *tile = new VTestHarness;
|
MODEL *tile = new MODEL;
|
||||||
|
|
||||||
#if VM_TRACE
|
#if VM_TRACE
|
||||||
Verilated::traceEverOn(true); // Verilator must compute traced signals
|
Verilated::traceEverOn(true); // Verilator must compute traced signals
|
||||||
|
@ -54,7 +54,7 @@ VERILATOR_FLAGS := --top-module $(MODEL) \
|
|||||||
+define+STOP_COND=\$$c\(\"done_reset\"\) --assert \
|
+define+STOP_COND=\$$c\(\"done_reset\"\) --assert \
|
||||||
-Wno-STMTDLY --x-assign unique \
|
-Wno-STMTDLY --x-assign unique \
|
||||||
-I$(base_dir)/vsrc \
|
-I$(base_dir)/vsrc \
|
||||||
-O3 -CFLAGS "$(CXXFLAGS) -DVERILATOR -include $(base_dir)/csrc/verilator.h"
|
-O3 -CFLAGS "$(CXXFLAGS) -DVERILATOR -include $(base_dir)/csrc/verilator.h -DMODEL=V$(MODEL)"
|
||||||
cppfiles = $(addprefix $(base_dir)/csrc/, $(addsuffix .cc, $(CXXSRCS)))
|
cppfiles = $(addprefix $(base_dir)/csrc/, $(addsuffix .cc, $(CXXSRCS)))
|
||||||
headers = $(wildcard $(base_dir)/csrc/*.h)
|
headers = $(wildcard $(base_dir)/csrc/*.h)
|
||||||
|
|
||||||
|
@ -39,11 +39,13 @@ $(error Set SUITE to the regression suite you want to run)
|
|||||||
endif
|
endif
|
||||||
|
|
||||||
ifeq ($(SUITE),RocketSuite)
|
ifeq ($(SUITE),RocketSuite)
|
||||||
|
MODEL=TestHarness
|
||||||
PROJECT=rocketchip
|
PROJECT=rocketchip
|
||||||
CONFIGS=DefaultConfig DefaultL2Config DefaultBufferlessConfig TinyConfig
|
CONFIGS=DefaultConfig DefaultL2Config DefaultBufferlessConfig TinyConfig
|
||||||
endif
|
endif
|
||||||
|
|
||||||
ifeq ($(SUITE),GroundtestSuite)
|
ifeq ($(SUITE),GroundtestSuite)
|
||||||
|
MODEL=TestHarness
|
||||||
PROJECT=rocketchip
|
PROJECT=rocketchip
|
||||||
CONFIGS=MemtestConfig MemtestBufferlessConfig MemtestStatelessConfig FancyMemtestConfig \
|
CONFIGS=MemtestConfig MemtestBufferlessConfig MemtestStatelessConfig FancyMemtestConfig \
|
||||||
BroadcastRegressionTestConfig BufferlessRegressionTestConfig CacheRegressionTestConfig \
|
BroadcastRegressionTestConfig BufferlessRegressionTestConfig CacheRegressionTestConfig \
|
||||||
@ -51,7 +53,8 @@ CONFIGS=MemtestConfig MemtestBufferlessConfig MemtestStatelessConfig FancyMemtes
|
|||||||
endif
|
endif
|
||||||
|
|
||||||
ifeq ($(SUITE),UnittestSuite)
|
ifeq ($(SUITE),UnittestSuite)
|
||||||
PROJECT=rocketchip.utest
|
MODEL=UnitTestHarness
|
||||||
|
PROJECT=rocketchip
|
||||||
CONFIGS=UnitTestConfig
|
CONFIGS=UnitTestConfig
|
||||||
endif
|
endif
|
||||||
|
|
||||||
@ -123,65 +126,65 @@ $(RISCV)/install.stamp:
|
|||||||
# Builds the various simulators
|
# Builds the various simulators
|
||||||
stamps/%/emulator-verilog.stamp: stamps/other-submodules.stamp $(RISCV)/install.stamp
|
stamps/%/emulator-verilog.stamp: stamps/other-submodules.stamp $(RISCV)/install.stamp
|
||||||
mkdir -p $(dir $@)
|
mkdir -p $(dir $@)
|
||||||
+flock -x $(dir $@)/chisel-lock $(MAKE) -C $(abspath $(TOP))/emulator PROJECT=$(PROJECT) CONFIG=$* RISCV=$(abspath $(RISCV)) verilog
|
+flock -x $(dir $@)/chisel-lock $(MAKE) -C $(abspath $(TOP))/emulator PROJECT=$(PROJECT) MODEL=$(MODEL) CONFIG=$* RISCV=$(abspath $(RISCV)) verilog
|
||||||
date > $@
|
date > $@
|
||||||
|
|
||||||
stamps/%/emulator-ndebug.stamp: stamps/other-submodules.stamp $(RISCV)/install.stamp
|
stamps/%/emulator-ndebug.stamp: stamps/other-submodules.stamp $(RISCV)/install.stamp
|
||||||
mkdir -p $(dir $@)
|
mkdir -p $(dir $@)
|
||||||
+flock -x $(dir $@)/chisel-lock $(MAKE) -C $(abspath $(TOP))/emulator PROJECT=$(PROJECT) CONFIG=$* RISCV=$(abspath $(RISCV))
|
+flock -x $(dir $@)/chisel-lock $(MAKE) -C $(abspath $(TOP))/emulator PROJECT=$(PROJECT) MODEL=$(MODEL) CONFIG=$* RISCV=$(abspath $(RISCV))
|
||||||
date > $@
|
date > $@
|
||||||
|
|
||||||
stamps/%/emulator-debug.stamp: stamps/other-submodules.stamp $(RISCV)/install.stamp
|
stamps/%/emulator-debug.stamp: stamps/other-submodules.stamp $(RISCV)/install.stamp
|
||||||
mkdir -p $(dir $@)
|
mkdir -p $(dir $@)
|
||||||
+flock -x $(dir $@)/chisel-lock $(MAKE) -C $(abspath $(TOP))/emulator PROJECT=$(PROJECT) CONFIG=$* RISCV=$(abspath $(RISCV)) debug
|
+flock -x $(dir $@)/chisel-lock $(MAKE) -C $(abspath $(TOP))/emulator PROJECT=$(PROJECT) MODEL=$(MODEL) CONFIG=$* RISCV=$(abspath $(RISCV)) debug
|
||||||
date > $@
|
date > $@
|
||||||
|
|
||||||
stamps/%/vsim-verilog.stamp: stamps/other-submodules.stamp $(RISCV)/install.stamp
|
stamps/%/vsim-verilog.stamp: stamps/other-submodules.stamp $(RISCV)/install.stamp
|
||||||
mkdir -p $(dir $@)
|
mkdir -p $(dir $@)
|
||||||
+flock -x $(dir $@)/chisel-lock $(MAKE) -C $(abspath $(TOP))/vsim PROJECT=$(PROJECT) CONFIG=$* RISCV=$(abspath $(RISCV)) verilog
|
+flock -x $(dir $@)/chisel-lock $(MAKE) -C $(abspath $(TOP))/vsim PROJECT=$(PROJECT) MODEL=$(MODEL) CONFIG=$* RISCV=$(abspath $(RISCV)) verilog
|
||||||
date > $@
|
date > $@
|
||||||
|
|
||||||
stamps/%/vsim-ndebug.stamp: stamps/other-submodules.stamp $(RISCV)/install.stamp
|
stamps/%/vsim-ndebug.stamp: stamps/other-submodules.stamp $(RISCV)/install.stamp
|
||||||
mkdir -p $(dir $@)
|
mkdir -p $(dir $@)
|
||||||
+flock -x $(dir $@)/chisel-lock $(MAKE) -C $(abspath $(TOP))/vsim PROJECT=$(PROJECT) CONFIG=$* RISCV=$(abspath $(RISCV))
|
+flock -x $(dir $@)/chisel-lock $(MAKE) -C $(abspath $(TOP))/vsim PROJECT=$(PROJECT) MODEL=$(MODEL) CONFIG=$* RISCV=$(abspath $(RISCV))
|
||||||
date > $@
|
date > $@
|
||||||
|
|
||||||
stamps/%/vsim-debug.stamp: stamps/other-submodules.stamp $(RISCV)/install.stamp
|
stamps/%/vsim-debug.stamp: stamps/other-submodules.stamp $(RISCV)/install.stamp
|
||||||
mkdir -p $(dir $@)
|
mkdir -p $(dir $@)
|
||||||
+flock -x $(dir $@)/chisel-lock $(MAKE) -C $(abspath $(TOP))/vsim PROJECT=$(PROJECT) CONFIG=$* RISCV=$(abspath $(RISCV)) debug
|
+flock -x $(dir $@)/chisel-lock $(MAKE) -C $(abspath $(TOP))/vsim PROJECT=$(PROJECT) MODEL=$(MODEL) CONFIG=$* RISCV=$(abspath $(RISCV)) debug
|
||||||
date > $@
|
date > $@
|
||||||
|
|
||||||
# Runs tests on one of the simulators
|
# Runs tests on one of the simulators
|
||||||
stamps/%/emulator-asm-tests.stamp: stamps/other-submodules.stamp $(RISCV)/install.stamp
|
stamps/%/emulator-asm-tests.stamp: stamps/other-submodules.stamp $(RISCV)/install.stamp
|
||||||
mkdir -p $(dir $@)
|
mkdir -p $(dir $@)
|
||||||
$(MAKE) -C $(abspath $(TOP))/emulator PROJECT=$(PROJECT) CONFIG=$* RISCV=$(abspath $(RISCV)) run-asm-tests-fast
|
$(MAKE) -C $(abspath $(TOP))/emulator PROJECT=$(PROJECT) MODEL=$(MODEL) CONFIG=$* RISCV=$(abspath $(RISCV)) run-asm-tests-fast
|
||||||
date > $@
|
date > $@
|
||||||
|
|
||||||
stamps/%/emulator-bmark-tests.stamp: stamps/other-submodules.stamp $(RISCV)/install.stamp
|
stamps/%/emulator-bmark-tests.stamp: stamps/other-submodules.stamp $(RISCV)/install.stamp
|
||||||
mkdir -p $(dir $@)
|
mkdir -p $(dir $@)
|
||||||
$(MAKE) -C $(abspath $(TOP))/emulator PROJECT=$(PROJECT) CONFIG=$* RISCV=$(abspath $(RISCV)) run-bmark-tests-fast
|
$(MAKE) -C $(abspath $(TOP))/emulator PROJECT=$(PROJECT) MODEL=$(MODEL) CONFIG=$* RISCV=$(abspath $(RISCV)) run-bmark-tests-fast
|
||||||
date > $@
|
date > $@
|
||||||
|
|
||||||
stamps/%/emulator-regression-tests.stamp: stamps/other-submodules.stamp $(RISCV)/install.stamp
|
stamps/%/emulator-regression-tests.stamp: stamps/other-submodules.stamp $(RISCV)/install.stamp
|
||||||
mkdir -p $(dir $@)
|
mkdir -p $(dir $@)
|
||||||
$(MAKE) -C $(abspath $(TOP))/emulator PROJECT=$(PROJECT) CONFIG=$* RISCV=$(abspath $(RISCV)) clean-run-output
|
$(MAKE) -C $(abspath $(TOP))/emulator PROJECT=$(PROJECT) MODEL=$(MODEL) CONFIG=$* RISCV=$(abspath $(RISCV)) clean-run-output
|
||||||
$(MAKE) -C $(abspath $(TOP))/emulator PROJECT=$(PROJECT) CONFIG=$* RISCV=$(abspath $(RISCV)) run-regression-tests-fast
|
$(MAKE) -C $(abspath $(TOP))/emulator PROJECT=$(PROJECT) MODEL=$(MODEL) CONFIG=$* RISCV=$(abspath $(RISCV)) run-regression-tests-fast
|
||||||
date > $@
|
date > $@
|
||||||
|
|
||||||
stamps/%/vsim-asm-tests.stamp: stamps/other-submodules.stamp $(RISCV)/install.stamp
|
stamps/%/vsim-asm-tests.stamp: stamps/other-submodules.stamp $(RISCV)/install.stamp
|
||||||
mkdir -p $(dir $@)
|
mkdir -p $(dir $@)
|
||||||
$(MAKE) -C $(abspath $(TOP))/vsim PROJECT=$(PROJECT) CONFIG=$* RISCV=$(abspath $(RISCV)) run-asm-tests-fast
|
$(MAKE) -C $(abspath $(TOP))/vsim PROJECT=$(PROJECT) MODEL=$(MODEL) CONFIG=$* RISCV=$(abspath $(RISCV)) run-asm-tests-fast
|
||||||
date > $@
|
date > $@
|
||||||
|
|
||||||
stamps/%/vsim-bmark-tests.stamp: stamps/other-submodules.stamp $(RISCV)/install.stamp
|
stamps/%/vsim-bmark-tests.stamp: stamps/other-submodules.stamp $(RISCV)/install.stamp
|
||||||
mkdir -p $(dir $@)
|
mkdir -p $(dir $@)
|
||||||
$(MAKE) -C $(abspath $(TOP))/vsim PROJECT=$(PROJECT) CONFIG=$* RISCV=$(abspath $(RISCV)) run-bmark-tests-fast
|
$(MAKE) -C $(abspath $(TOP))/vsim PROJECT=$(PROJECT) MODEL=$(MODEL) CONFIG=$* RISCV=$(abspath $(RISCV)) run-bmark-tests-fast
|
||||||
date > $@
|
date > $@
|
||||||
|
|
||||||
stamps/%/vsim-regression-tests.stamp: stamps/other-submodules.stamp $(RISCV)/install.stamp
|
stamps/%/vsim-regression-tests.stamp: stamps/other-submodules.stamp $(RISCV)/install.stamp
|
||||||
mkdir -p $(dir $@)
|
mkdir -p $(dir $@)
|
||||||
$(MAKE) -C $(abspath $(TOP))/vsim PROJECT=$(PROJECT) CONFIG=$* RISCV=$(abspath $(RISCV)) clean-run-output
|
$(MAKE) -C $(abspath $(TOP))/vsim PROJECT=$(PROJECT) MODEL=$(MODEL) CONFIG=$* RISCV=$(abspath $(RISCV)) clean-run-output
|
||||||
$(MAKE) -C $(abspath $(TOP))/vsim PROJECT=$(PROJECT) CONFIG=$* RISCV=$(abspath $(RISCV)) run-regression-tests-fast
|
$(MAKE) -C $(abspath $(TOP))/vsim PROJECT=$(PROJECT) MODEL=$(MODEL) CONFIG=$* RISCV=$(abspath $(RISCV)) run-regression-tests-fast
|
||||||
date > $@
|
date > $@
|
||||||
|
|
||||||
# The torture tests run subtly differently on the different targets, so they
|
# The torture tests run subtly differently on the different targets, so they
|
||||||
|
@ -189,7 +189,7 @@ class BaseCoreplexConfig extends Config (
|
|||||||
case TLKey("MMIO_Outermost") => site(TLKey("L2toMMIO")).copy(dataBeats = site(MIFDataBeats))
|
case TLKey("MMIO_Outermost") => site(TLKey("L2toMMIO")).copy(dataBeats = site(MIFDataBeats))
|
||||||
|
|
||||||
case BootROMFile => "./bootrom/bootrom.img"
|
case BootROMFile => "./bootrom/bootrom.img"
|
||||||
case NTiles => Knob("NTILES")
|
case NTiles => 1
|
||||||
case NBanksPerMemoryChannel => Knob("NBANKS_PER_MEM_CHANNEL")
|
case NBanksPerMemoryChannel => Knob("NBANKS_PER_MEM_CHANNEL")
|
||||||
case BankIdLSB => 0
|
case BankIdLSB => 0
|
||||||
case CacheBlockBytes => Dump("CACHE_BLOCK_BYTES", 64)
|
case CacheBlockBytes => Dump("CACHE_BLOCK_BYTES", 64)
|
||||||
@ -224,7 +224,6 @@ class BaseCoreplexConfig extends Config (
|
|||||||
case _ => throw new CDEMatchError
|
case _ => throw new CDEMatchError
|
||||||
}},
|
}},
|
||||||
knobValues = {
|
knobValues = {
|
||||||
case "NTILES" => 1
|
|
||||||
case "NBANKS_PER_MEM_CHANNEL" => 1
|
case "NBANKS_PER_MEM_CHANNEL" => 1
|
||||||
case "L1D_MSHRS" => 2
|
case "L1D_MSHRS" => 2
|
||||||
case "L1D_SETS" => 64
|
case "L1D_SETS" => 64
|
||||||
@ -236,7 +235,9 @@ class BaseCoreplexConfig extends Config (
|
|||||||
)
|
)
|
||||||
|
|
||||||
class WithNCores(n: Int) extends Config(
|
class WithNCores(n: Int) extends Config(
|
||||||
knobValues = { case"NTILES" => n; case _ => throw new CDEMatchError })
|
(pname,site,here) => pname match {
|
||||||
|
case NTiles => n
|
||||||
|
})
|
||||||
|
|
||||||
class WithNBanksPerMemChannel(n: Int) extends Config(
|
class WithNBanksPerMemChannel(n: Int) extends Config(
|
||||||
knobValues = {
|
knobValues = {
|
||||||
|
@ -11,8 +11,6 @@ import uncore.util._
|
|||||||
import uncore.converters._
|
import uncore.converters._
|
||||||
import rocket._
|
import rocket._
|
||||||
import rocket.Util._
|
import rocket.Util._
|
||||||
import java.nio.{ByteBuffer,ByteOrder}
|
|
||||||
import java.nio.file.{Files, Paths}
|
|
||||||
|
|
||||||
/** Number of memory channels */
|
/** Number of memory channels */
|
||||||
case object NMemoryChannels extends Field[Int]
|
case object NMemoryChannels extends Field[Int]
|
||||||
@ -34,7 +32,6 @@ trait HasCoreplexParameters {
|
|||||||
lazy val innerParams = p.alterPartial({ case TLId => "L1toL2" })
|
lazy val innerParams = p.alterPartial({ case TLId => "L1toL2" })
|
||||||
lazy val outermostParams = p.alterPartial({ case TLId => "Outermost" })
|
lazy val outermostParams = p.alterPartial({ case TLId => "Outermost" })
|
||||||
lazy val outermostMMIOParams = p.alterPartial({ case TLId => "MMIO_Outermost" })
|
lazy val outermostMMIOParams = p.alterPartial({ case TLId => "MMIO_Outermost" })
|
||||||
lazy val configString = p(rocketchip.ConfigString).get
|
|
||||||
lazy val globalAddrMap = p(rocketchip.GlobalAddrMap).get
|
lazy val globalAddrMap = p(rocketchip.GlobalAddrMap).get
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -120,38 +117,16 @@ class DefaultCoreplex(tp: Parameters, tc: CoreplexConfig) extends Coreplex()(tp,
|
|||||||
val backendBuffering = TileLinkDepths(0,0,0,0,0)
|
val backendBuffering = TileLinkDepths(0,0,0,0,0)
|
||||||
for ((bank, icPort) <- managerEndpoints zip mem_ic.io.in) {
|
for ((bank, icPort) <- managerEndpoints zip mem_ic.io.in) {
|
||||||
val unwrap = Module(new ClientTileLinkIOUnwrapper()(outerTLParams))
|
val unwrap = Module(new ClientTileLinkIOUnwrapper()(outerTLParams))
|
||||||
unwrap.io.in <> ClientTileLinkEnqueuer(bank.outerTL, backendBuffering)(outerTLParams)
|
unwrap.io.in <> TileLinkEnqueuer(bank.outerTL, backendBuffering)(outerTLParams)
|
||||||
TileLinkWidthAdapter(icPort, unwrap.io.out)
|
TileLinkWidthAdapter(icPort, unwrap.io.out)
|
||||||
}
|
}
|
||||||
|
|
||||||
io.master.mem <> mem_ic.io.out
|
io.master.mem <> mem_ic.io.out
|
||||||
|
|
||||||
buildMMIONetwork(ClientUncachedTileLinkEnqueuer(mmioManager.io.outer, 1))(
|
buildMMIONetwork(TileLinkEnqueuer(mmioManager.io.outer, 1))(
|
||||||
p.alterPartial({case TLId => "L2toMMIO"}))
|
p.alterPartial({case TLId => "L2toMMIO"}))
|
||||||
}
|
}
|
||||||
|
|
||||||
def makeBootROM()(implicit p: Parameters) = {
|
|
||||||
val romdata = Files.readAllBytes(Paths.get(p(BootROMFile)))
|
|
||||||
val rom = ByteBuffer.wrap(romdata)
|
|
||||||
|
|
||||||
rom.order(ByteOrder.LITTLE_ENDIAN)
|
|
||||||
|
|
||||||
// for now, have the reset vector jump straight to memory
|
|
||||||
val memBase = (
|
|
||||||
if (globalAddrMap contains "mem") globalAddrMap("mem")
|
|
||||||
else globalAddrMap("io:int:dmem0")
|
|
||||||
).start
|
|
||||||
val resetToMemDist = memBase - p(ResetVector)
|
|
||||||
require(resetToMemDist == (resetToMemDist.toInt >> 12 << 12))
|
|
||||||
val configStringAddr = p(ResetVector).toInt + rom.capacity
|
|
||||||
|
|
||||||
require(rom.getInt(12) == 0,
|
|
||||||
"Config string address position should not be occupied by code")
|
|
||||||
rom.putInt(12, configStringAddr)
|
|
||||||
rom.array() ++ (configString.getBytes.toSeq)
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
def buildMMIONetwork(mmio: ClientUncachedTileLinkIO)(implicit p: Parameters) = {
|
def buildMMIONetwork(mmio: ClientUncachedTileLinkIO)(implicit p: Parameters) = {
|
||||||
val ioAddrMap = globalAddrMap.subMap("io")
|
val ioAddrMap = globalAddrMap.subMap("io")
|
||||||
|
|
||||||
@ -182,10 +157,7 @@ class DefaultCoreplex(tp: Parameters, tc: CoreplexConfig) extends Coreplex()(tp,
|
|||||||
|
|
||||||
val tileSlavePorts = (0 until tc.nTiles) map (i => s"int:dmem$i") filter (ioAddrMap contains _)
|
val tileSlavePorts = (0 until tc.nTiles) map (i => s"int:dmem$i") filter (ioAddrMap contains _)
|
||||||
for ((t, m) <- (tileList.map(_.io.slave).flatten) zip (tileSlavePorts map (mmioNetwork port _)))
|
for ((t, m) <- (tileList.map(_.io.slave).flatten) zip (tileSlavePorts map (mmioNetwork port _)))
|
||||||
t <> ClientUncachedTileLinkEnqueuer(m, 1)
|
t <> TileLinkEnqueuer(m, 1)
|
||||||
|
|
||||||
val bootROM = Module(new ROMSlave(makeBootROM()))
|
|
||||||
bootROM.io <> mmioNetwork.port("int:bootrom")
|
|
||||||
|
|
||||||
io.master.mmio.foreach { _ <> mmioNetwork.port("ext") }
|
io.master.mmio.foreach { _ <> mmioNetwork.port("ext") }
|
||||||
}
|
}
|
||||||
|
@ -72,7 +72,7 @@ class IOGetAfterPutBlockRegression(implicit p: Parameters) extends Regression()(
|
|||||||
io.mem.grant.ready := Bool(true)
|
io.mem.grant.ready := Bool(true)
|
||||||
|
|
||||||
io.cache.req.valid := !get_sent && started
|
io.cache.req.valid := !get_sent && started
|
||||||
io.cache.req.bits.addr := UInt(addrMap("io:int:bootrom").start)
|
io.cache.req.bits.addr := UInt(addrMap("io:ext:bootrom").start)
|
||||||
io.cache.req.bits.typ := UInt(log2Ceil(32 / 8))
|
io.cache.req.bits.typ := UInt(log2Ceil(32 / 8))
|
||||||
io.cache.req.bits.cmd := M_XRD
|
io.cache.req.bits.cmd := M_XRD
|
||||||
io.cache.req.bits.tag := UInt(0)
|
io.cache.req.bits.tag := UInt(0)
|
||||||
|
@ -135,6 +135,17 @@ object NastiConstants {
|
|||||||
val RESP_EXOKAY = UInt("b01")
|
val RESP_EXOKAY = UInt("b01")
|
||||||
val RESP_SLVERR = UInt("b10")
|
val RESP_SLVERR = UInt("b10")
|
||||||
val RESP_DECERR = UInt("b11")
|
val RESP_DECERR = UInt("b11")
|
||||||
|
|
||||||
|
val CACHE_DEVICE_NOBUF = UInt("b0000")
|
||||||
|
val CACHE_DEVICE_BUF = UInt("b0001")
|
||||||
|
val CACHE_NORMAL_NOCACHE_NOBUF = UInt("b0010")
|
||||||
|
val CACHE_NORMAL_NOCACHE_BUF = UInt("b0011")
|
||||||
|
|
||||||
|
def AXPROT(instruction: Bool, nonsecure: Bool, privileged: Bool): UInt =
|
||||||
|
Cat(instruction, nonsecure, privileged)
|
||||||
|
|
||||||
|
def AXPROT(instruction: Boolean, nonsecure: Boolean, privileged: Boolean): UInt =
|
||||||
|
AXPROT(Bool(instruction), Bool(nonsecure), Bool(privileged))
|
||||||
}
|
}
|
||||||
|
|
||||||
import NastiConstants._
|
import NastiConstants._
|
||||||
@ -150,8 +161,8 @@ object NastiWriteAddressChannel {
|
|||||||
aw.size := size
|
aw.size := size
|
||||||
aw.burst := burst
|
aw.burst := burst
|
||||||
aw.lock := Bool(false)
|
aw.lock := Bool(false)
|
||||||
aw.cache := UInt("b0000")
|
aw.cache := CACHE_DEVICE_NOBUF
|
||||||
aw.prot := UInt("b000")
|
aw.prot := AXPROT(false, false, false)
|
||||||
aw.qos := UInt("b0000")
|
aw.qos := UInt("b0000")
|
||||||
aw.region := UInt("b0000")
|
aw.region := UInt("b0000")
|
||||||
aw.user := UInt(0)
|
aw.user := UInt(0)
|
||||||
@ -170,8 +181,8 @@ object NastiReadAddressChannel {
|
|||||||
ar.size := size
|
ar.size := size
|
||||||
ar.burst := burst
|
ar.burst := burst
|
||||||
ar.lock := Bool(false)
|
ar.lock := Bool(false)
|
||||||
ar.cache := UInt(0)
|
ar.cache := CACHE_DEVICE_NOBUF
|
||||||
ar.prot := UInt(0)
|
ar.prot := AXPROT(false, false, false)
|
||||||
ar.qos := UInt(0)
|
ar.qos := UInt(0)
|
||||||
ar.region := UInt(0)
|
ar.region := UInt(0)
|
||||||
ar.user := UInt(0)
|
ar.user := UInt(0)
|
||||||
@ -255,7 +266,7 @@ class MemIONastiIOConverter(cacheBlockOffsetBits: Int)(implicit p: Parameters) e
|
|||||||
|
|
||||||
io.nasti.b.valid := id_q.io.deq.valid && b_ok
|
io.nasti.b.valid := id_q.io.deq.valid && b_ok
|
||||||
io.nasti.b.bits.id := id_q.io.deq.bits
|
io.nasti.b.bits.id := id_q.io.deq.bits
|
||||||
io.nasti.b.bits.resp := UInt(0)
|
io.nasti.b.bits.resp := RESP_OKAY
|
||||||
|
|
||||||
io.nasti.w.ready := io.mem.req_data.ready
|
io.nasti.w.ready := io.mem.req_data.ready
|
||||||
io.mem.req_data.valid := io.nasti.w.valid
|
io.mem.req_data.valid := io.nasti.w.valid
|
||||||
@ -266,7 +277,7 @@ class MemIONastiIOConverter(cacheBlockOffsetBits: Int)(implicit p: Parameters) e
|
|||||||
io.nasti.r.bits.data := io.mem.resp.bits.data
|
io.nasti.r.bits.data := io.mem.resp.bits.data
|
||||||
io.nasti.r.bits.last := mif_wrap_out
|
io.nasti.r.bits.last := mif_wrap_out
|
||||||
io.nasti.r.bits.id := io.mem.resp.bits.tag
|
io.nasti.r.bits.id := io.mem.resp.bits.tag
|
||||||
io.nasti.r.bits.resp := UInt(0)
|
io.nasti.r.bits.resp := RESP_OKAY
|
||||||
io.mem.resp.ready := io.nasti.r.ready
|
io.mem.resp.ready := io.nasti.r.ready
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -389,7 +400,7 @@ class NastiErrorSlave(implicit p: Parameters) extends NastiModule {
|
|||||||
io.aw.ready := b_queue.io.enq.ready && !draining
|
io.aw.ready := b_queue.io.enq.ready && !draining
|
||||||
io.b.valid := b_queue.io.deq.valid && !draining
|
io.b.valid := b_queue.io.deq.valid && !draining
|
||||||
io.b.bits.id := b_queue.io.deq.bits
|
io.b.bits.id := b_queue.io.deq.bits
|
||||||
io.b.bits.resp := Bits("b11")
|
io.b.bits.resp := RESP_DECERR
|
||||||
b_queue.io.deq.ready := io.b.ready && !draining
|
b_queue.io.deq.ready := io.b.ready && !draining
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1,281 +0,0 @@
|
|||||||
package junctions
|
|
||||||
|
|
||||||
import Chisel._
|
|
||||||
import cde.Parameters
|
|
||||||
|
|
||||||
class SmiReq(val dataWidth: Int, val addrWidth: Int) extends Bundle {
|
|
||||||
val rw = Bool()
|
|
||||||
val addr = UInt(width = addrWidth)
|
|
||||||
val data = Bits(width = dataWidth)
|
|
||||||
|
|
||||||
override def cloneType =
|
|
||||||
new SmiReq(dataWidth, addrWidth).asInstanceOf[this.type]
|
|
||||||
}
|
|
||||||
|
|
||||||
/** Simple Memory Interface IO. Used to communicate with PCR and SCR
|
|
||||||
* @param dataWidth the width in bits of the data field
|
|
||||||
* @param addrWidth the width in bits of the addr field */
|
|
||||||
class SmiIO(val dataWidth: Int, val addrWidth: Int) extends Bundle {
|
|
||||||
val req = Decoupled(new SmiReq(dataWidth, addrWidth))
|
|
||||||
val resp = Decoupled(Bits(width = dataWidth)).flip
|
|
||||||
|
|
||||||
override def cloneType =
|
|
||||||
new SmiIO(dataWidth, addrWidth).asInstanceOf[this.type]
|
|
||||||
}
|
|
||||||
|
|
||||||
abstract class SmiPeripheral extends Module {
|
|
||||||
val dataWidth: Int
|
|
||||||
val addrWidth: Int
|
|
||||||
|
|
||||||
lazy val io = new SmiIO(dataWidth, addrWidth).flip
|
|
||||||
}
|
|
||||||
|
|
||||||
/** A simple sequential memory accessed through Smi */
|
|
||||||
class SmiMem(val dataWidth: Int, val memDepth: Int) extends SmiPeripheral {
|
|
||||||
// override
|
|
||||||
val addrWidth = log2Up(memDepth)
|
|
||||||
|
|
||||||
val mem = SeqMem(memDepth, Bits(width = dataWidth))
|
|
||||||
|
|
||||||
val ren = io.req.fire() && !io.req.bits.rw
|
|
||||||
val wen = io.req.fire() && io.req.bits.rw
|
|
||||||
|
|
||||||
when (wen) { mem.write(io.req.bits.addr, io.req.bits.data) }
|
|
||||||
|
|
||||||
val resp_valid = Reg(init = Bool(false))
|
|
||||||
|
|
||||||
when (io.resp.fire()) { resp_valid := Bool(false) }
|
|
||||||
when (io.req.fire()) { resp_valid := Bool(true) }
|
|
||||||
|
|
||||||
io.resp.valid := resp_valid
|
|
||||||
io.resp.bits := mem.read(io.req.bits.addr, ren)
|
|
||||||
io.req.ready := !resp_valid
|
|
||||||
}
|
|
||||||
|
|
||||||
/** Arbitrate among several Smi clients
|
|
||||||
* @param n the number of clients
|
|
||||||
* @param dataWidth Smi data width
|
|
||||||
* @param addrWidth Smi address width */
|
|
||||||
class SmiArbiter(val n: Int, val dataWidth: Int, val addrWidth: Int)
|
|
||||||
extends Module {
|
|
||||||
val io = new Bundle {
|
|
||||||
val in = Vec(n, new SmiIO(dataWidth, addrWidth)).flip
|
|
||||||
val out = new SmiIO(dataWidth, addrWidth)
|
|
||||||
}
|
|
||||||
|
|
||||||
val wait_resp = Reg(init = Bool(false))
|
|
||||||
val choice = Reg(UInt(width = log2Up(n)))
|
|
||||||
|
|
||||||
val req_arb = Module(new RRArbiter(new SmiReq(dataWidth, addrWidth), n))
|
|
||||||
req_arb.io.in <> io.in.map(_.req)
|
|
||||||
req_arb.io.out.ready := io.out.req.ready && !wait_resp
|
|
||||||
|
|
||||||
io.out.req.bits := req_arb.io.out.bits
|
|
||||||
io.out.req.valid := req_arb.io.out.valid && !wait_resp
|
|
||||||
|
|
||||||
when (io.out.req.fire()) {
|
|
||||||
choice := req_arb.io.chosen
|
|
||||||
wait_resp := Bool(true)
|
|
||||||
}
|
|
||||||
|
|
||||||
when (io.out.resp.fire()) { wait_resp := Bool(false) }
|
|
||||||
|
|
||||||
for ((resp, i) <- io.in.map(_.resp).zipWithIndex) {
|
|
||||||
resp.bits := io.out.resp.bits
|
|
||||||
resp.valid := io.out.resp.valid && choice === UInt(i)
|
|
||||||
}
|
|
||||||
|
|
||||||
io.out.resp.ready := io.in(choice).resp.ready
|
|
||||||
}
|
|
||||||
|
|
||||||
class SmiIONastiReadIOConverter(val dataWidth: Int, val addrWidth: Int)
|
|
||||||
(implicit p: Parameters) extends NastiModule()(p) {
|
|
||||||
val io = new Bundle {
|
|
||||||
val nasti = new NastiReadIO().flip
|
|
||||||
val smi = new SmiIO(dataWidth, addrWidth)
|
|
||||||
}
|
|
||||||
|
|
||||||
private val maxWordsPerBeat = nastiXDataBits / dataWidth
|
|
||||||
private val wordCountBits = log2Up(maxWordsPerBeat)
|
|
||||||
private val byteOffBits = log2Up(dataWidth / 8)
|
|
||||||
private val addrOffBits = addrWidth + byteOffBits
|
|
||||||
|
|
||||||
private def calcWordCount(size: UInt): UInt =
|
|
||||||
(UInt(1) << (size - UInt(byteOffBits))) - UInt(1)
|
|
||||||
|
|
||||||
val (s_idle :: s_read :: s_resp :: Nil) = Enum(Bits(), 3)
|
|
||||||
val state = Reg(init = s_idle)
|
|
||||||
|
|
||||||
val nWords = Reg(UInt(width = wordCountBits))
|
|
||||||
val nBeats = Reg(UInt(width = nastiXLenBits))
|
|
||||||
val addr = Reg(UInt(width = addrWidth))
|
|
||||||
val id = Reg(UInt(width = nastiRIdBits))
|
|
||||||
|
|
||||||
val byteOff = Reg(UInt(width = byteOffBits))
|
|
||||||
val recvInd = Reg(init = UInt(0, wordCountBits))
|
|
||||||
val sendDone = Reg(init = Bool(false))
|
|
||||||
|
|
||||||
val buffer = Reg(init = Vec.fill(maxWordsPerBeat) { Bits(0, dataWidth) })
|
|
||||||
|
|
||||||
io.nasti.ar.ready := (state === s_idle)
|
|
||||||
|
|
||||||
io.smi.req.valid := (state === s_read) && !sendDone
|
|
||||||
io.smi.req.bits.rw := Bool(false)
|
|
||||||
io.smi.req.bits.addr := addr
|
|
||||||
|
|
||||||
io.smi.resp.ready := (state === s_read)
|
|
||||||
|
|
||||||
io.nasti.r.valid := (state === s_resp)
|
|
||||||
io.nasti.r.bits := NastiReadDataChannel(
|
|
||||||
id = id,
|
|
||||||
data = buffer.asUInt,
|
|
||||||
last = (nBeats === UInt(0)))
|
|
||||||
|
|
||||||
when (io.nasti.ar.fire()) {
|
|
||||||
when (io.nasti.ar.bits.size < UInt(byteOffBits)) {
|
|
||||||
nWords := UInt(0)
|
|
||||||
} .otherwise {
|
|
||||||
nWords := calcWordCount(io.nasti.ar.bits.size)
|
|
||||||
}
|
|
||||||
nBeats := io.nasti.ar.bits.len
|
|
||||||
addr := io.nasti.ar.bits.addr(addrOffBits - 1, byteOffBits)
|
|
||||||
if (maxWordsPerBeat > 1)
|
|
||||||
recvInd := io.nasti.ar.bits.addr(wordCountBits + byteOffBits - 1, byteOffBits)
|
|
||||||
else
|
|
||||||
recvInd := UInt(0)
|
|
||||||
id := io.nasti.ar.bits.id
|
|
||||||
state := s_read
|
|
||||||
}
|
|
||||||
|
|
||||||
when (io.smi.req.fire()) {
|
|
||||||
addr := addr + UInt(1)
|
|
||||||
sendDone := (nWords === UInt(0))
|
|
||||||
}
|
|
||||||
|
|
||||||
when (io.smi.resp.fire()) {
|
|
||||||
recvInd := recvInd + UInt(1)
|
|
||||||
nWords := nWords - UInt(1)
|
|
||||||
buffer(recvInd) := io.smi.resp.bits
|
|
||||||
when (nWords === UInt(0)) { state := s_resp }
|
|
||||||
}
|
|
||||||
|
|
||||||
when (io.nasti.r.fire()) {
|
|
||||||
recvInd := UInt(0)
|
|
||||||
sendDone := Bool(false)
|
|
||||||
// clear all the registers in the buffer
|
|
||||||
buffer.foreach(_ := Bits(0))
|
|
||||||
nBeats := nBeats - UInt(1)
|
|
||||||
state := Mux(io.nasti.r.bits.last, s_idle, s_read)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
class SmiIONastiWriteIOConverter(val dataWidth: Int, val addrWidth: Int)
|
|
||||||
(implicit p: Parameters) extends NastiModule()(p) {
|
|
||||||
val io = new Bundle {
|
|
||||||
val nasti = new NastiWriteIO().flip
|
|
||||||
val smi = new SmiIO(dataWidth, addrWidth)
|
|
||||||
}
|
|
||||||
|
|
||||||
private val dataBytes = dataWidth / 8
|
|
||||||
private val maxWordsPerBeat = nastiXDataBits / dataWidth
|
|
||||||
private val byteOffBits = log2Floor(dataBytes)
|
|
||||||
private val addrOffBits = addrWidth + byteOffBits
|
|
||||||
private val nastiByteOffBits = log2Ceil(nastiXDataBits / 8)
|
|
||||||
|
|
||||||
assert(!io.nasti.aw.valid || io.nasti.aw.bits.size >= UInt(byteOffBits),
|
|
||||||
"Nasti size must be >= Smi size")
|
|
||||||
|
|
||||||
val id = Reg(UInt(width = nastiWIdBits))
|
|
||||||
val addr = Reg(UInt(width = addrWidth))
|
|
||||||
val offset = Reg(UInt(width = nastiByteOffBits))
|
|
||||||
|
|
||||||
def makeStrobe(offset: UInt, size: UInt, strb: UInt) = {
|
|
||||||
val sizemask = (UInt(1) << (UInt(1) << size)) - UInt(1)
|
|
||||||
val bytemask = strb & (sizemask << offset)
|
|
||||||
Vec.tabulate(maxWordsPerBeat){i => bytemask(dataBytes * i)}.asUInt
|
|
||||||
}
|
|
||||||
|
|
||||||
val size = Reg(UInt(width = nastiXSizeBits))
|
|
||||||
val strb = Reg(UInt(width = maxWordsPerBeat))
|
|
||||||
val data = Reg(UInt(width = nastiXDataBits))
|
|
||||||
val last = Reg(Bool())
|
|
||||||
|
|
||||||
val s_idle :: s_data :: s_send :: s_ack :: s_resp :: Nil = Enum(Bits(), 5)
|
|
||||||
val state = Reg(init = s_idle)
|
|
||||||
|
|
||||||
io.nasti.aw.ready := (state === s_idle)
|
|
||||||
io.nasti.w.ready := (state === s_data)
|
|
||||||
io.smi.req.valid := (state === s_send) && strb(0)
|
|
||||||
io.smi.req.bits.rw := Bool(true)
|
|
||||||
io.smi.req.bits.addr := addr
|
|
||||||
io.smi.req.bits.data := data(dataWidth - 1, 0)
|
|
||||||
io.smi.resp.ready := (state === s_ack)
|
|
||||||
io.nasti.b.valid := (state === s_resp)
|
|
||||||
io.nasti.b.bits := NastiWriteResponseChannel(id)
|
|
||||||
|
|
||||||
val jump = if (maxWordsPerBeat > 1)
|
|
||||||
PriorityMux(strb(maxWordsPerBeat - 1, 1),
|
|
||||||
(1 until maxWordsPerBeat).map(UInt(_)))
|
|
||||||
else UInt(1)
|
|
||||||
|
|
||||||
when (io.nasti.aw.fire()) {
|
|
||||||
if (dataWidth == nastiXDataBits) {
|
|
||||||
addr := io.nasti.aw.bits.addr(addrOffBits - 1, byteOffBits)
|
|
||||||
} else {
|
|
||||||
addr := Cat(io.nasti.aw.bits.addr(addrOffBits - 1, nastiByteOffBits),
|
|
||||||
UInt(0, nastiByteOffBits - byteOffBits))
|
|
||||||
}
|
|
||||||
offset := io.nasti.aw.bits.addr(nastiByteOffBits - 1, 0)
|
|
||||||
id := io.nasti.aw.bits.id
|
|
||||||
size := io.nasti.aw.bits.size
|
|
||||||
last := Bool(false)
|
|
||||||
state := s_data
|
|
||||||
}
|
|
||||||
|
|
||||||
when (io.nasti.w.fire()) {
|
|
||||||
last := io.nasti.w.bits.last
|
|
||||||
strb := makeStrobe(offset, size, io.nasti.w.bits.strb)
|
|
||||||
data := io.nasti.w.bits.data
|
|
||||||
state := s_send
|
|
||||||
}
|
|
||||||
|
|
||||||
when (state === s_send) {
|
|
||||||
when (io.smi.req.ready || !strb(0)) {
|
|
||||||
strb := strb >> jump
|
|
||||||
data := data >> Cat(jump, UInt(0, log2Up(dataWidth)))
|
|
||||||
addr := addr + jump
|
|
||||||
when (strb(0)) { state := s_ack }
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
when (io.smi.resp.fire()) {
|
|
||||||
state := Mux(strb === UInt(0),
|
|
||||||
Mux(last, s_resp, s_data), s_send)
|
|
||||||
}
|
|
||||||
|
|
||||||
when (io.nasti.b.fire()) { state := s_idle }
|
|
||||||
}
|
|
||||||
|
|
||||||
/** Convert Nasti protocol to Smi protocol */
|
|
||||||
class SmiIONastiIOConverter(val dataWidth: Int, val addrWidth: Int)
|
|
||||||
(implicit p: Parameters) extends NastiModule()(p) {
|
|
||||||
val io = new Bundle {
|
|
||||||
val nasti = (new NastiIO).flip
|
|
||||||
val smi = new SmiIO(dataWidth, addrWidth)
|
|
||||||
}
|
|
||||||
|
|
||||||
require(isPow2(dataWidth), "SMI data width must be power of 2")
|
|
||||||
require(dataWidth <= nastiXDataBits,
|
|
||||||
"SMI data width must be less than or equal to NASTI data width")
|
|
||||||
|
|
||||||
val reader = Module(new SmiIONastiReadIOConverter(dataWidth, addrWidth))
|
|
||||||
reader.io.nasti <> io.nasti
|
|
||||||
|
|
||||||
val writer = Module(new SmiIONastiWriteIOConverter(dataWidth, addrWidth))
|
|
||||||
writer.io.nasti <> io.nasti
|
|
||||||
|
|
||||||
val arb = Module(new SmiArbiter(2, dataWidth, addrWidth))
|
|
||||||
arb.io.in(0) <> reader.io.smi
|
|
||||||
arb.io.in(1) <> writer.io.smi
|
|
||||||
io.smi <> arb.io.out
|
|
||||||
}
|
|
@ -45,7 +45,7 @@ class NastiIOStreamIOConverter(w: Int)(implicit p: Parameters) extends Module {
|
|||||||
io.nasti.ar.ready := !reading
|
io.nasti.ar.ready := !reading
|
||||||
io.nasti.r.valid := reading && io.stream.in.valid
|
io.nasti.r.valid := reading && io.stream.in.valid
|
||||||
io.nasti.r.bits := io.stream.in.bits
|
io.nasti.r.bits := io.stream.in.bits
|
||||||
io.nasti.r.bits.resp := UInt(0)
|
io.nasti.r.bits.resp := RESP_OKAY
|
||||||
io.nasti.r.bits.id := read_id
|
io.nasti.r.bits.id := read_id
|
||||||
io.stream.in.ready := reading && io.nasti.r.ready
|
io.stream.in.ready := reading && io.nasti.r.ready
|
||||||
|
|
||||||
@ -72,7 +72,7 @@ class NastiIOStreamIOConverter(w: Int)(implicit p: Parameters) extends Module {
|
|||||||
io.stream.out.valid := writing && io.nasti.w.valid
|
io.stream.out.valid := writing && io.nasti.w.valid
|
||||||
io.stream.out.bits := io.nasti.w.bits
|
io.stream.out.bits := io.nasti.w.bits
|
||||||
io.nasti.b.valid := write_resp
|
io.nasti.b.valid := write_resp
|
||||||
io.nasti.b.bits.resp := UInt(0)
|
io.nasti.b.bits.resp := RESP_OKAY
|
||||||
io.nasti.b.bits.id := write_id
|
io.nasti.b.bits.id := write_id
|
||||||
|
|
||||||
when (io.nasti.aw.fire()) {
|
when (io.nasti.aw.fire()) {
|
||||||
|
@ -5,6 +5,7 @@ package rocketchip
|
|||||||
import Chisel._
|
import Chisel._
|
||||||
import cde.{Parameters, Field}
|
import cde.{Parameters, Field}
|
||||||
import junctions._
|
import junctions._
|
||||||
|
import junctions.NastiConstants._
|
||||||
import uncore.tilelink._
|
import uncore.tilelink._
|
||||||
import uncore.tilelink2.{LazyModule, LazyModuleImp}
|
import uncore.tilelink2.{LazyModule, LazyModuleImp}
|
||||||
import uncore.converters._
|
import uncore.converters._
|
||||||
@ -165,8 +166,8 @@ trait PeripheryMasterMemModule extends HasPeripheryParameters {
|
|||||||
// Abuse the fact that zip takes the shorter of the two lists
|
// Abuse the fact that zip takes the shorter of the two lists
|
||||||
((io.mem_axi zip coreplex.io.master.mem) zipWithIndex) foreach { case ((axi, mem), idx) =>
|
((io.mem_axi zip coreplex.io.master.mem) zipWithIndex) foreach { case ((axi, mem), idx) =>
|
||||||
val axi_sync = PeripheryUtils.convertTLtoAXI(mem)(outermostParams)
|
val axi_sync = PeripheryUtils.convertTLtoAXI(mem)(outermostParams)
|
||||||
axi_sync.ar.bits.cache := UInt("b0011")
|
axi_sync.ar.bits.cache := CACHE_NORMAL_NOCACHE_BUF
|
||||||
axi_sync.aw.bits.cache := UInt("b0011")
|
axi_sync.aw.bits.cache := CACHE_NORMAL_NOCACHE_BUF
|
||||||
axi <> (
|
axi <> (
|
||||||
if (!p(AsyncMemChannels)) axi_sync
|
if (!p(AsyncMemChannels)) axi_sync
|
||||||
else AsyncNastiTo(io.mem_clk.get(idx), io.mem_rst.get(idx), axi_sync)
|
else AsyncNastiTo(io.mem_clk.get(idx), io.mem_rst.get(idx), axi_sync)
|
||||||
@ -178,7 +179,7 @@ trait PeripheryMasterMemModule extends HasPeripheryParameters {
|
|||||||
}
|
}
|
||||||
|
|
||||||
(io.mem_tl zip coreplex.io.master.mem) foreach { case (tl, mem) =>
|
(io.mem_tl zip coreplex.io.master.mem) foreach { case (tl, mem) =>
|
||||||
tl <> ClientUncachedTileLinkEnqueuer(mem, 2)(outermostParams)
|
tl <> TileLinkEnqueuer(mem, 2)(outermostParams)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -228,7 +229,7 @@ trait PeripheryMasterMMIOModule extends HasPeripheryParameters {
|
|||||||
io.mmio_ahb(idx) <> PeripheryUtils.convertTLtoAHB(mmio_ports(i), atomics = true)(outermostMMIOParams)
|
io.mmio_ahb(idx) <> PeripheryUtils.convertTLtoAHB(mmio_ports(i), atomics = true)(outermostMMIOParams)
|
||||||
} else if (mmio_tl_start <= i && i < mmio_tl_end) {
|
} else if (mmio_tl_start <= i && i < mmio_tl_end) {
|
||||||
val idx = i-mmio_tl_start
|
val idx = i-mmio_tl_start
|
||||||
io.mmio_tl(idx) <> ClientUncachedTileLinkEnqueuer(mmio_ports(i), 2)(outermostMMIOParams)
|
io.mmio_tl(idx) <> TileLinkEnqueuer(mmio_ports(i), 2)(outermostMMIOParams)
|
||||||
} else {
|
} else {
|
||||||
require(false, "Unconnected external MMIO port")
|
require(false, "Unconnected external MMIO port")
|
||||||
}
|
}
|
||||||
@ -303,6 +304,29 @@ trait PeripheryAONModule extends HasPeripheryParameters {
|
|||||||
|
|
||||||
/////
|
/////
|
||||||
|
|
||||||
|
trait PeripheryBootROM extends LazyModule {
|
||||||
|
implicit val p: Parameters
|
||||||
|
val pDevices: ResourceManager[AddrMapEntry]
|
||||||
|
|
||||||
|
pDevices.add(AddrMapEntry("bootrom", MemRange(0x1000, 4096, MemAttr(AddrMapProt.RX))))
|
||||||
|
}
|
||||||
|
|
||||||
|
trait PeripheryBootROMBundle {
|
||||||
|
implicit val p: Parameters
|
||||||
|
}
|
||||||
|
|
||||||
|
trait PeripheryBootROMModule extends HasPeripheryParameters {
|
||||||
|
implicit val p: Parameters
|
||||||
|
val outer: PeripheryBootROM
|
||||||
|
val io: PeripheryBootROMBundle
|
||||||
|
val mmioNetwork: Option[TileLinkRecursiveInterconnect]
|
||||||
|
|
||||||
|
val bootROM = Module(new ROMSlave(GenerateBootROM(p))(innerMMIOParams))
|
||||||
|
bootROM.io <> mmioNetwork.get.port("bootrom")
|
||||||
|
}
|
||||||
|
|
||||||
|
/////
|
||||||
|
|
||||||
trait PeripheryTestRAM extends LazyModule {
|
trait PeripheryTestRAM extends LazyModule {
|
||||||
implicit val p: Parameters
|
implicit val p: Parameters
|
||||||
val pDevices: ResourceManager[AddrMapEntry]
|
val pDevices: ResourceManager[AddrMapEntry]
|
||||||
|
@ -6,6 +6,7 @@ import Chisel._
|
|||||||
import cde.{Parameters, Field}
|
import cde.{Parameters, Field}
|
||||||
import rocket.Util._
|
import rocket.Util._
|
||||||
import junctions._
|
import junctions._
|
||||||
|
import junctions.NastiConstants._
|
||||||
|
|
||||||
case object BuildExampleTop extends Field[Parameters => ExampleTop]
|
case object BuildExampleTop extends Field[Parameters => ExampleTop]
|
||||||
case object SimMemLatency extends Field[Int]
|
case object SimMemLatency extends Field[Int]
|
||||||
@ -117,12 +118,12 @@ class SimAXIMem(size: BigInt)(implicit p: Parameters) extends NastiModule()(p) {
|
|||||||
|
|
||||||
io.axi.b.valid := bValid
|
io.axi.b.valid := bValid
|
||||||
io.axi.b.bits.id := aw.id
|
io.axi.b.bits.id := aw.id
|
||||||
io.axi.b.bits.resp := UInt(0)
|
io.axi.b.bits.resp := RESP_OKAY
|
||||||
|
|
||||||
io.axi.r.valid := rValid
|
io.axi.r.valid := rValid
|
||||||
io.axi.r.bits.id := ar.id
|
io.axi.r.bits.id := ar.id
|
||||||
io.axi.r.bits.data := mem((ar.addr >> log2Ceil(nastiXDataBits/8))(log2Ceil(depth)-1, 0))
|
io.axi.r.bits.data := mem((ar.addr >> log2Ceil(nastiXDataBits/8))(log2Ceil(depth)-1, 0))
|
||||||
io.axi.r.bits.resp := UInt(0)
|
io.axi.r.bits.resp := RESP_OKAY
|
||||||
io.axi.r.bits.last := ar.len === UInt(0)
|
io.axi.r.bits.last := ar.len === UInt(0)
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -175,10 +176,22 @@ class JTAGVPI(implicit val p: Parameters) extends BlackBox {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
object LatencyPipe {
|
class LatencyPipe[T <: Data](typ: T, latency: Int) extends Module {
|
||||||
|
val io = new Bundle {
|
||||||
|
val in = Decoupled(typ).flip
|
||||||
|
val out = Decoupled(typ)
|
||||||
|
}
|
||||||
|
|
||||||
def doN[T](n: Int, func: T => T, in: T): T =
|
def doN[T](n: Int, func: T => T, in: T): T =
|
||||||
(0 until n).foldLeft(in)((last, _) => func(last))
|
(0 until n).foldLeft(in)((last, _) => func(last))
|
||||||
|
|
||||||
def apply[T <: Data](in: DecoupledIO[T], latency: Int): DecoupledIO[T] =
|
io.out <> doN(latency, (last: DecoupledIO[T]) => Queue(last, 1, pipe=true), io.in)
|
||||||
doN(latency, (last: DecoupledIO[T]) => Queue(last, 1, pipe=true), in)
|
}
|
||||||
|
|
||||||
|
object LatencyPipe {
|
||||||
|
def apply[T <: Data](in: DecoupledIO[T], latency: Int): DecoupledIO[T] = {
|
||||||
|
val pipe = Module(new LatencyPipe(in.bits, latency))
|
||||||
|
pipe.io.in <> in
|
||||||
|
pipe.io.out
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -75,17 +75,17 @@ class BaseTopModule[+L <: BaseTop, +B <: BaseTopBundle](val p: Parameters, l: L,
|
|||||||
|
|
||||||
/** Example Top with Periphery */
|
/** Example Top with Periphery */
|
||||||
class ExampleTop(p: Parameters) extends BaseTop(p)
|
class ExampleTop(p: Parameters) extends BaseTop(p)
|
||||||
with PeripheryDebug with PeripheryExtInterrupts with PeripheryAON
|
with PeripheryBootROM with PeripheryDebug with PeripheryExtInterrupts with PeripheryAON
|
||||||
with PeripheryMasterMem with PeripheryMasterMMIO with PeripherySlave {
|
with PeripheryMasterMem with PeripheryMasterMMIO with PeripherySlave {
|
||||||
override lazy val module = Module(new ExampleTopModule(p, this, new ExampleTopBundle(p, _)))
|
override lazy val module = Module(new ExampleTopModule(p, this, new ExampleTopBundle(p, _)))
|
||||||
}
|
}
|
||||||
|
|
||||||
class ExampleTopBundle(p: Parameters, c: Coreplex) extends BaseTopBundle(p, c)
|
class ExampleTopBundle(p: Parameters, c: Coreplex) extends BaseTopBundle(p, c)
|
||||||
with PeripheryDebugBundle with PeripheryExtInterruptsBundle with PeripheryAONBundle
|
with PeripheryBootROMBundle with PeripheryDebugBundle with PeripheryExtInterruptsBundle with PeripheryAONBundle
|
||||||
with PeripheryMasterMemBundle with PeripheryMasterMMIOBundle with PeripherySlaveBundle
|
with PeripheryMasterMemBundle with PeripheryMasterMMIOBundle with PeripherySlaveBundle
|
||||||
|
|
||||||
class ExampleTopModule[+L <: ExampleTop, +B <: ExampleTopBundle](p: Parameters, l: L, b: Coreplex => B) extends BaseTopModule(p, l, b)
|
class ExampleTopModule[+L <: ExampleTop, +B <: ExampleTopBundle](p: Parameters, l: L, b: Coreplex => B) extends BaseTopModule(p, l, b)
|
||||||
with PeripheryDebugModule with PeripheryExtInterruptsModule with PeripheryAONModule
|
with PeripheryBootROMModule with PeripheryDebugModule with PeripheryExtInterruptsModule with PeripheryAONModule
|
||||||
with PeripheryMasterMemModule with PeripheryMasterMMIOModule with PeripherySlaveModule
|
with PeripheryMasterMemModule with PeripheryMasterMMIOModule with PeripherySlaveModule
|
||||||
|
|
||||||
/** Example Top with TestRAM */
|
/** Example Top with TestRAM */
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
// See LICENSE for license details.
|
// See LICENSE for license details.
|
||||||
|
|
||||||
package rocketchip.utest
|
package rocketchip
|
||||||
|
|
||||||
import scala.collection.mutable.LinkedHashSet
|
import scala.collection.mutable.LinkedHashSet
|
||||||
|
|
||||||
@ -31,7 +31,7 @@ class WithUnitTest extends Config(
|
|||||||
|
|
||||||
class UnitTestConfig extends Config(new WithUnitTest ++ new BaseConfig)
|
class UnitTestConfig extends Config(new WithUnitTest ++ new BaseConfig)
|
||||||
|
|
||||||
class TestHarness(implicit val p: Parameters) extends Module {
|
class UnitTestHarness(implicit val p: Parameters) extends Module {
|
||||||
val io = new Bundle {
|
val io = new Bundle {
|
||||||
val success = Bool(OUTPUT)
|
val success = Bool(OUTPUT)
|
||||||
}
|
}
|
||||||
|
@ -9,6 +9,9 @@ import rocket._
|
|||||||
import rocket.Util._
|
import rocket.Util._
|
||||||
import coreplex._
|
import coreplex._
|
||||||
|
|
||||||
|
import java.nio.file.{Files, Paths}
|
||||||
|
import java.nio.{ByteBuffer, ByteOrder}
|
||||||
|
|
||||||
class RangeManager {
|
class RangeManager {
|
||||||
private var finalized = false
|
private var finalized = false
|
||||||
private val l = collection.mutable.HashMap[String, Int]()
|
private val l = collection.mutable.HashMap[String, Int]()
|
||||||
@ -52,7 +55,6 @@ object GenerateGlobalAddrMap {
|
|||||||
lazy val intIOAddrMap: AddrMap = {
|
lazy val intIOAddrMap: AddrMap = {
|
||||||
val entries = collection.mutable.ArrayBuffer[AddrMapEntry]()
|
val entries = collection.mutable.ArrayBuffer[AddrMapEntry]()
|
||||||
entries += AddrMapEntry("debug", MemSize(4096, MemAttr(AddrMapProt.RWX)))
|
entries += AddrMapEntry("debug", MemSize(4096, MemAttr(AddrMapProt.RWX)))
|
||||||
entries += AddrMapEntry("bootrom", MemSize(4096, MemAttr(AddrMapProt.RX)))
|
|
||||||
entries += AddrMapEntry("plic", MemRange(0x40000000, 0x4000000, MemAttr(AddrMapProt.RW)))
|
entries += AddrMapEntry("plic", MemRange(0x40000000, 0x4000000, MemAttr(AddrMapProt.RW)))
|
||||||
if (p(DataScratchpadSize) > 0) { // TODO heterogeneous tiles
|
if (p(DataScratchpadSize) > 0) { // TODO heterogeneous tiles
|
||||||
require(p(NTiles) == 1) // TODO relax this
|
require(p(NTiles) == 1) // TODO relax this
|
||||||
@ -146,3 +148,26 @@ object GenerateConfigString {
|
|||||||
res.toString
|
res.toString
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
object GenerateBootROM {
|
||||||
|
def apply(p: Parameters) = {
|
||||||
|
val romdata = Files.readAllBytes(Paths.get(p(BootROMFile)))
|
||||||
|
val rom = ByteBuffer.wrap(romdata)
|
||||||
|
|
||||||
|
rom.order(ByteOrder.LITTLE_ENDIAN)
|
||||||
|
|
||||||
|
// for now, have the reset vector jump straight to memory
|
||||||
|
val memBase = (
|
||||||
|
if (p(GlobalAddrMap).get contains "mem") p(GlobalAddrMap).get("mem")
|
||||||
|
else p(GlobalAddrMap).get("io:int:dmem0")
|
||||||
|
).start
|
||||||
|
val resetToMemDist = memBase - p(ResetVector)
|
||||||
|
require(resetToMemDist == (resetToMemDist.toInt >> 12 << 12))
|
||||||
|
val configStringAddr = p(ResetVector).toInt + rom.capacity
|
||||||
|
|
||||||
|
require(rom.getInt(12) == 0,
|
||||||
|
"Config string address position should not be occupied by code")
|
||||||
|
rom.putInt(12, configStringAddr)
|
||||||
|
rom.array() ++ (p(ConfigString).get.getBytes.toSeq)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
@ -3,6 +3,7 @@ package uncore.converters
|
|||||||
import Chisel._
|
import Chisel._
|
||||||
import junctions._
|
import junctions._
|
||||||
import util.{ReorderQueue, DecoupledHelper}
|
import util.{ReorderQueue, DecoupledHelper}
|
||||||
|
import junctions.NastiConstants._
|
||||||
import uncore.tilelink._
|
import uncore.tilelink._
|
||||||
import uncore.constants._
|
import uncore.constants._
|
||||||
import cde.Parameters
|
import cde.Parameters
|
||||||
@ -234,8 +235,8 @@ class NastiIOTileLinkIOConverter(implicit p: Parameters) extends TLModule()(p)
|
|||||||
data = Bits(0))
|
data = Bits(0))
|
||||||
assert(!gnt_arb.io.in(1).valid || put_id_mapper.io.resp.matches, "NASTI tag error")
|
assert(!gnt_arb.io.in(1).valid || put_id_mapper.io.resp.matches, "NASTI tag error")
|
||||||
|
|
||||||
assert(!io.nasti.r.valid || io.nasti.r.bits.resp === UInt(0), "NASTI read error")
|
assert(!io.nasti.r.valid || io.nasti.r.bits.resp === RESP_OKAY, "NASTI read error")
|
||||||
assert(!io.nasti.b.valid || io.nasti.b.bits.resp === UInt(0), "NASTI write error")
|
assert(!io.nasti.b.valid || io.nasti.b.bits.resp === RESP_OKAY, "NASTI write error")
|
||||||
}
|
}
|
||||||
|
|
||||||
class TileLinkIONastiIOConverter(implicit p: Parameters) extends TLModule()(p)
|
class TileLinkIONastiIOConverter(implicit p: Parameters) extends TLModule()(p)
|
||||||
|
@ -1,59 +0,0 @@
|
|||||||
// See LICENSE for details
|
|
||||||
|
|
||||||
package uncore.converters
|
|
||||||
|
|
||||||
import Chisel._
|
|
||||||
import junctions._
|
|
||||||
import uncore.tilelink._
|
|
||||||
import cde.Parameters
|
|
||||||
|
|
||||||
/** Convert TileLink protocol to Smi protocol */
|
|
||||||
class SmiIOTileLinkIOConverter(val dataWidth: Int, val addrWidth: Int)
|
|
||||||
(implicit p: Parameters) extends Module {
|
|
||||||
val io = new Bundle {
|
|
||||||
val tl = (new ClientUncachedTileLinkIO).flip
|
|
||||||
val smi = new SmiIO(dataWidth, addrWidth)
|
|
||||||
}
|
|
||||||
|
|
||||||
def decoupledNastiConnect(outer: NastiIO, inner: NastiIO) {
|
|
||||||
outer.ar <> Queue(inner.ar)
|
|
||||||
outer.aw <> Queue(inner.aw)
|
|
||||||
outer.w <> Queue(inner.w)
|
|
||||||
inner.r <> Queue(outer.r)
|
|
||||||
inner.b <> Queue(outer.b)
|
|
||||||
}
|
|
||||||
|
|
||||||
val tl2nasti = Module(new NastiIOTileLinkIOConverter())
|
|
||||||
val nasti2smi = Module(new SmiIONastiIOConverter(dataWidth, addrWidth))
|
|
||||||
|
|
||||||
tl2nasti.io.tl <> io.tl
|
|
||||||
decoupledNastiConnect(nasti2smi.io.nasti, tl2nasti.io.nasti)
|
|
||||||
io.smi <> nasti2smi.io.smi
|
|
||||||
}
|
|
||||||
|
|
||||||
class SmiConverterTest(implicit val p: Parameters) extends unittest.UnitTest
|
|
||||||
with HasTileLinkParameters {
|
|
||||||
val outermostParams = p.alterPartial({ case TLId => "Outermost" })
|
|
||||||
|
|
||||||
val smiWidth = 32
|
|
||||||
val smiDepth = 64
|
|
||||||
val tlDepth = (smiWidth * smiDepth) / tlDataBits
|
|
||||||
|
|
||||||
val smimem = Module(new SmiMem(smiWidth, smiDepth))
|
|
||||||
val conv = Module(new SmiIOTileLinkIOConverter(
|
|
||||||
smiWidth, log2Up(smiDepth))(outermostParams))
|
|
||||||
val driver = Module(new DriverSet(
|
|
||||||
(driverParams: Parameters) => {
|
|
||||||
implicit val p = driverParams
|
|
||||||
Seq(
|
|
||||||
Module(new PutSweepDriver(tlDepth)),
|
|
||||||
Module(new PutMaskDriver(smiWidth / 8)),
|
|
||||||
Module(new PutBlockSweepDriver(tlDepth / tlDataBeats)),
|
|
||||||
Module(new GetMultiWidthDriver))
|
|
||||||
})(outermostParams))
|
|
||||||
|
|
||||||
conv.io.tl <> driver.io.mem
|
|
||||||
smimem.io <> conv.io.smi
|
|
||||||
driver.io.start := io.start
|
|
||||||
io.finished := driver.io.finished
|
|
||||||
}
|
|
@ -30,6 +30,23 @@ object TileLinkEnqueuer {
|
|||||||
def apply(in: TileLinkIO, depth: Int)(implicit p: Parameters): TileLinkIO = {
|
def apply(in: TileLinkIO, depth: Int)(implicit p: Parameters): TileLinkIO = {
|
||||||
apply(in, TileLinkDepths(depth, depth, depth, depth, depth))
|
apply(in, TileLinkDepths(depth, depth, depth, depth, depth))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
def apply(in: ClientTileLinkIO, depths: TileLinkDepths)(implicit p: Parameters): ClientTileLinkIO = {
|
||||||
|
val t = Module(new ClientTileLinkEnqueuer(depths))
|
||||||
|
t.io.inner <> in
|
||||||
|
t.io.outer
|
||||||
|
}
|
||||||
|
def apply(in: ClientTileLinkIO, depth: Int)(implicit p: Parameters): ClientTileLinkIO = {
|
||||||
|
apply(in, TileLinkDepths(depth, depth, depth, depth, depth))
|
||||||
|
}
|
||||||
|
def apply(in: ClientUncachedTileLinkIO, depths: UncachedTileLinkDepths)(implicit p: Parameters): ClientUncachedTileLinkIO = {
|
||||||
|
val t = Module(new ClientUncachedTileLinkEnqueuer(depths))
|
||||||
|
t.io.inner <> in
|
||||||
|
t.io.outer
|
||||||
|
}
|
||||||
|
def apply(in: ClientUncachedTileLinkIO, depth: Int)(implicit p: Parameters): ClientUncachedTileLinkIO = {
|
||||||
|
apply(in, UncachedTileLinkDepths(depth, depth))
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
class ClientTileLinkEnqueuer(depths: TileLinkDepths)(implicit p: Parameters) extends Module {
|
class ClientTileLinkEnqueuer(depths: TileLinkDepths)(implicit p: Parameters) extends Module {
|
||||||
@ -45,17 +62,6 @@ class ClientTileLinkEnqueuer(depths: TileLinkDepths)(implicit p: Parameters) ext
|
|||||||
io.outer.finish <> (if(depths.fin > 0) Queue(io.inner.finish, depths.fin) else io.inner.finish)
|
io.outer.finish <> (if(depths.fin > 0) Queue(io.inner.finish, depths.fin) else io.inner.finish)
|
||||||
}
|
}
|
||||||
|
|
||||||
object ClientTileLinkEnqueuer {
|
|
||||||
def apply(in: ClientTileLinkIO, depths: TileLinkDepths)(implicit p: Parameters): ClientTileLinkIO = {
|
|
||||||
val t = Module(new ClientTileLinkEnqueuer(depths))
|
|
||||||
t.io.inner <> in
|
|
||||||
t.io.outer
|
|
||||||
}
|
|
||||||
def apply(in: ClientTileLinkIO, depth: Int)(implicit p: Parameters): ClientTileLinkIO = {
|
|
||||||
apply(in, TileLinkDepths(depth, depth, depth, depth, depth))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
class ClientUncachedTileLinkEnqueuer(depths: UncachedTileLinkDepths)(implicit p: Parameters) extends Module {
|
class ClientUncachedTileLinkEnqueuer(depths: UncachedTileLinkDepths)(implicit p: Parameters) extends Module {
|
||||||
val io = new Bundle {
|
val io = new Bundle {
|
||||||
val inner = new ClientUncachedTileLinkIO().flip
|
val inner = new ClientUncachedTileLinkIO().flip
|
||||||
@ -65,14 +71,3 @@ class ClientUncachedTileLinkEnqueuer(depths: UncachedTileLinkDepths)(implicit p:
|
|||||||
io.outer.acquire <> (if(depths.acq > 0) Queue(io.inner.acquire, depths.acq) else io.inner.acquire)
|
io.outer.acquire <> (if(depths.acq > 0) Queue(io.inner.acquire, depths.acq) else io.inner.acquire)
|
||||||
io.inner.grant <> (if(depths.gnt > 0) Queue(io.outer.grant, depths.gnt) else io.outer.grant)
|
io.inner.grant <> (if(depths.gnt > 0) Queue(io.outer.grant, depths.gnt) else io.outer.grant)
|
||||||
}
|
}
|
||||||
|
|
||||||
object ClientUncachedTileLinkEnqueuer {
|
|
||||||
def apply(in: ClientUncachedTileLinkIO, depths: UncachedTileLinkDepths)(implicit p: Parameters): ClientUncachedTileLinkIO = {
|
|
||||||
val t = Module(new ClientUncachedTileLinkEnqueuer(depths))
|
|
||||||
t.io.inner <> in
|
|
||||||
t.io.outer
|
|
||||||
}
|
|
||||||
def apply(in: ClientUncachedTileLinkIO, depth: Int)(implicit p: Parameters): ClientUncachedTileLinkIO = {
|
|
||||||
apply(in, UncachedTileLinkDepths(depth, depth))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
@ -14,7 +14,6 @@ object JunctionsUnitTests {
|
|||||||
object UncoreUnitTests {
|
object UncoreUnitTests {
|
||||||
def apply(implicit p: Parameters): Seq[UnitTest] =
|
def apply(implicit p: Parameters): Seq[UnitTest] =
|
||||||
Seq(
|
Seq(
|
||||||
Module(new uncore.converters.SmiConverterTest),
|
|
||||||
Module(new uncore.devices.ROMSlaveTest),
|
Module(new uncore.devices.ROMSlaveTest),
|
||||||
Module(new uncore.devices.TileLinkRAMTest),
|
Module(new uncore.devices.TileLinkRAMTest),
|
||||||
Module(new uncore.tilelink2.TLFuzzRAMTest))
|
Module(new uncore.tilelink2.TLFuzzRAMTest))
|
||||||
|
@ -51,6 +51,7 @@ VCS_OPTS = -notice -line +lint=all,noVCDE,noONGS,noUI -error=PCWM-L -timescale=1
|
|||||||
$(RISCV)/lib/libfesvr.so \
|
$(RISCV)/lib/libfesvr.so \
|
||||||
-sverilog \
|
-sverilog \
|
||||||
+incdir+$(generated_dir) \
|
+incdir+$(generated_dir) \
|
||||||
|
+define+MODEL=$(MODEL) \
|
||||||
+define+CLOCK_PERIOD=1.0 $(sim_vsrcs) $(sim_csrcs) \
|
+define+CLOCK_PERIOD=1.0 $(sim_vsrcs) $(sim_csrcs) \
|
||||||
+define+PRINTF_COND=$(TB).printf_cond \
|
+define+PRINTF_COND=$(TB).printf_cond \
|
||||||
+define+STOP_COND=!$(TB).reset \
|
+define+STOP_COND=!$(TB).reset \
|
||||||
|
@ -5,6 +5,10 @@
|
|||||||
# files.
|
# files.
|
||||||
.SECONDARY: $(generated_dir)/$(MODEL).$(CONFIG).fir
|
.SECONDARY: $(generated_dir)/$(MODEL).$(CONFIG).fir
|
||||||
|
|
||||||
|
firrtl: $(generated_dir)/$(MODEL).$(CONFIG).fir
|
||||||
|
|
||||||
|
.PHONY: firrtl
|
||||||
|
|
||||||
$(generated_dir)/%.$(CONFIG).fir $(generated_dir)/%.$(CONFIG).d $(generated_dir)/%.prm: $(chisel_srcs) $(bootrom_img)
|
$(generated_dir)/%.$(CONFIG).fir $(generated_dir)/%.$(CONFIG).d $(generated_dir)/%.prm: $(chisel_srcs) $(bootrom_img)
|
||||||
mkdir -p $(dir $@)
|
mkdir -p $(dir $@)
|
||||||
cd $(base_dir) && $(SBT) "run $(generated_dir) $(PROJECT) $(notdir $*) $(CFG_PROJECT) $(CONFIG)"
|
cd $(base_dir) && $(SBT) "run $(generated_dir) $(PROJECT) $(notdir $*) $(CFG_PROJECT) $(CONFIG)"
|
||||||
|
@ -87,7 +87,7 @@ module TestDriver;
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
TestHarness testHarness(
|
`MODEL testHarness(
|
||||||
.clk(clk),
|
.clk(clk),
|
||||||
.reset(reset),
|
.reset(reset),
|
||||||
.io_success(success)
|
.io_success(success)
|
||||||
|
Loading…
Reference in New Issue
Block a user