From a5b77de44ecd30ff2bbdebcfd07ca41d86e70db9 Mon Sep 17 00:00:00 2001 From: Tang Haojin Date: Wed, 20 Mar 2024 20:39:29 +0800 Subject: [PATCH] Makefile: `XSTOP_PREFIX` for nested prefix of `XSTop` (#2799) * This does not work for chisel 3 --- Makefile | 6 ++++++ src/main/scala/system/SoC.scala | 3 ++- src/main/scala/top/ArgParser.scala | 4 ++++ src/main/scala/top/Top.scala | 9 +++++++++ .../transforms/NestedPrefixModulesAnnotation.scala | 12 ++++++++++++ 5 files changed, 33 insertions(+), 1 deletion(-) create mode 100644 src/main/scala/xiangshan/transforms/NestedPrefixModulesAnnotation.scala diff --git a/Makefile b/Makefile index e7f6f9ff7..ebc0612c3 100644 --- a/Makefile +++ b/Makefile @@ -54,6 +54,12 @@ FPGA_MEM_ARGS = --infer-rw --repl-seq-mem -c:$(FPGATOP):-o:$(@D)/$(@F).conf --ge SIM_MEM_ARGS = --infer-rw --repl-seq-mem -c:$(SIMTOP):-o:$(@D)/$(@F).conf --gen-mem-verilog full endif +ifneq ($(XSTOP_PREFIX),) +RELEASE_ARGS += --xstop-prefix $(XSTOP_PREFIX) +DEBUG_ARGS += --xstop-prefix $(XSTOP_PREFIX) +PLDM_ARGS += --xstop-prefix $(XSTOP_PREFIX) +endif + # co-simulation with DRAMsim3 ifeq ($(WITH_DRAMSIM3),1) ifndef DRAMSIM3_HOME diff --git a/src/main/scala/system/SoC.scala b/src/main/scala/system/SoC.scala index bc79fdbe5..e88e87077 100644 --- a/src/main/scala/system/SoC.scala +++ b/src/main/scala/system/SoC.scala @@ -45,7 +45,8 @@ case class SoCParameters level = 3, ways = 8, sets = 2048 // 1MB per bank - )) + )), + XSTopPrefix: Option[String] = None ){ // L3 configurations val L3InnerBusWidth = 256 diff --git a/src/main/scala/top/ArgParser.scala b/src/main/scala/top/ArgParser.scala index 104d3271c..51a9935d7 100644 --- a/src/main/scala/top/ArgParser.scala +++ b/src/main/scala/top/ArgParser.scala @@ -100,6 +100,10 @@ object ArgParser { nextOption(config.alter((site, here, up) => { case DebugOptionsKey => up(DebugOptionsKey).copy(EnablePerfDebug = false) }), tail) + case "--xstop-prefix" :: value :: tail if chisel3.BuildInfo.version != "3.6.0" => + nextOption(config.alter((site, here, up) => { + case SoCParamsKey => up(SoCParamsKey).copy(XSTopPrefix = Some(value)) + }), tail) case "--firtool-opt" :: option :: tail => firtoolOpts ++= option.split(" ").filter(_.nonEmpty) nextOption(config, tail) diff --git a/src/main/scala/top/Top.scala b/src/main/scala/top/Top.scala index 42eed7b1f..11b5b8806 100644 --- a/src/main/scala/top/Top.scala +++ b/src/main/scala/top/Top.scala @@ -29,6 +29,8 @@ import org.chipsalliance.cde.config._ import freechips.rocketchip.diplomacy._ import freechips.rocketchip.tilelink._ import freechips.rocketchip.jtag.JTAGIO +import chisel3.experimental.{annotate, ChiselAnnotation} +import sifive.enterprise.firrtl.NestedPrefixModulesAnnotation abstract class BaseXSSoc()(implicit p: Parameters) extends LazyModule with BindingScope @@ -138,6 +140,13 @@ class XSTop()(implicit p: Parameters) extends BaseXSSoc() with HasSoCParameter } class XSTopImp(wrapper: LazyModule) extends LazyRawModuleImp(wrapper) { + soc.XSTopPrefix.foreach { prefix => + val mod = this.toNamed + annotate(new ChiselAnnotation { + def toFirrtl = NestedPrefixModulesAnnotation(mod, prefix, true) + }) + } + FileRegisters.add("dts", dts) FileRegisters.add("graphml", graphML) FileRegisters.add("json", json) diff --git a/src/main/scala/xiangshan/transforms/NestedPrefixModulesAnnotation.scala b/src/main/scala/xiangshan/transforms/NestedPrefixModulesAnnotation.scala new file mode 100644 index 000000000..d42f7c7ee --- /dev/null +++ b/src/main/scala/xiangshan/transforms/NestedPrefixModulesAnnotation.scala @@ -0,0 +1,12 @@ +// Hacked from CIRCT source code. Look like some SiFive internal annotations. +package sifive.enterprise.firrtl + +import firrtl.annotations.{ModuleTarget, SingleTargetAnnotation} + +case class NestedPrefixModulesAnnotation( + target: ModuleTarget, + prefix: String, + inclusive: Boolean = false, +) extends SingleTargetAnnotation[ModuleTarget] { + def duplicate(n: ModuleTarget): NestedPrefixModulesAnnotation = this.copy(n) +}