From 6d110e33bfca1faf90f057c1f062c1979a054f34 Mon Sep 17 00:00:00 2001 From: Nik Date: Wed, 8 Apr 2026 18:00:17 +0200 Subject: [PATCH 1/3] Gave the static part of the dynamic pipeline access to the services of the full dynamic pipeline --- src/main/scala/riscv/Core.scala | 1 + src/main/scala/riscv/DynamicPipeline.scala | 12 ++++++++-- src/main/scala/riscv/StaticPipeline.scala | 28 ++++++++++++++++++++++ 3 files changed, 39 insertions(+), 2 deletions(-) diff --git a/src/main/scala/riscv/Core.scala b/src/main/scala/riscv/Core.scala index 6b6dd0e..f234a69 100644 --- a/src/main/scala/riscv/Core.scala +++ b/src/main/scala/riscv/Core.scala @@ -214,6 +214,7 @@ object createDynamicPipeline { val decode = new Stage("ID").setName("decode") override val issuePipeline = new StaticPipeline { + override val parentPipeline = dynamicPipeline override val stages = Seq(fetch, decode) override val config = dynamicPipeline.config override val data = dynamicPipeline.data diff --git a/src/main/scala/riscv/DynamicPipeline.scala b/src/main/scala/riscv/DynamicPipeline.scala index f411fb1..618e3e6 100644 --- a/src/main/scala/riscv/DynamicPipeline.scala +++ b/src/main/scala/riscv/DynamicPipeline.scala @@ -131,12 +131,20 @@ trait DynamicPipeline extends Pipeline { override def serviceOption[T](implicit tag: ClassTag[T]): Option[T] = { super.serviceOption[T] match { - case None => issuePipeline.serviceOption[T] + case None => issuePipeline.serviceOptionLocal[T] case someService => someService } } override def hasService[T](implicit tag: ClassTag[T]): Boolean = { - super.hasService[T] || issuePipeline.hasService[T] + super.hasService[T] || issuePipeline.hasServiceLocal[T] + } + + def serviceOptionLocal[T](implicit tag: ClassTag[T]): Option[T] = { + super.serviceOption[T] + } + + def hasServiceLocal[T](implicit tag: ClassTag[T]): Boolean = { + super.hasService[T] } } diff --git a/src/main/scala/riscv/StaticPipeline.scala b/src/main/scala/riscv/StaticPipeline.scala index e51aabf..ab6c1fb 100644 --- a/src/main/scala/riscv/StaticPipeline.scala +++ b/src/main/scala/riscv/StaticPipeline.scala @@ -25,6 +25,7 @@ private class PipelineDataInfo { trait StaticPipeline extends Pipeline { private var pipelineRegsMap: Map[Stage, PipelineRegs] = null + val parentPipeline: DynamicPipeline = null def pipelineRegs: Map[Stage, PipelineRegs] = { assert(pipelineRegsMap != null) @@ -110,4 +111,31 @@ trait StaticPipeline extends Pipeline { stage.connectLastValues() } } + + override def serviceOption[T](implicit tag: ClassTag[T]): Option[T] = { + if (parentPipeline == null) { + super.serviceOption[T] + } else { + super.serviceOption[T] match { + case None => parentPipeline.serviceOptionLocal[T] + case someService => someService + } + } + } + + override def hasService[T](implicit tag: ClassTag[T]): Boolean = { + if (parentPipeline == null) { + super.hasService[T] + } else { + super.hasService[T] || parentPipeline.hasServiceLocal[T] + } + } + + def serviceOptionLocal[T](implicit tag: ClassTag[T]): Option[T] = { + super.serviceOption[T] + } + + def hasServiceLocal[T](implicit tag: ClassTag[T]): Boolean = { + super.hasService[T] + } } From 6c0cdc3cf33fdc27990111b47c78e929b7b409ef Mon Sep 17 00:00:00 2001 From: Nik Date: Wed, 15 Apr 2026 09:21:58 +0200 Subject: [PATCH 2/3] reformatting --- src/main/scala/riscv/DynamicPipeline.scala | 2 +- src/main/scala/riscv/StaticPipeline.scala | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/scala/riscv/DynamicPipeline.scala b/src/main/scala/riscv/DynamicPipeline.scala index 618e3e6..28ab622 100644 --- a/src/main/scala/riscv/DynamicPipeline.scala +++ b/src/main/scala/riscv/DynamicPipeline.scala @@ -147,4 +147,4 @@ trait DynamicPipeline extends Pipeline { def hasServiceLocal[T](implicit tag: ClassTag[T]): Boolean = { super.hasService[T] } -} +} \ No newline at end of file diff --git a/src/main/scala/riscv/StaticPipeline.scala b/src/main/scala/riscv/StaticPipeline.scala index ab6c1fb..b50214d 100644 --- a/src/main/scala/riscv/StaticPipeline.scala +++ b/src/main/scala/riscv/StaticPipeline.scala @@ -127,7 +127,7 @@ trait StaticPipeline extends Pipeline { if (parentPipeline == null) { super.hasService[T] } else { - super.hasService[T] || parentPipeline.hasServiceLocal[T] + super.hasService[T] || parentPipeline.hasServiceLocal[T] } } From 1f1b2c65a11a59826bf100e81ae88ff1fe5d674f Mon Sep 17 00:00:00 2001 From: Nik Date: Wed, 15 Apr 2026 10:40:37 +0200 Subject: [PATCH 3/3] formatting 2 --- src/main/scala/riscv/DynamicPipeline.scala | 2 +- src/main/scala/riscv/StaticPipeline.scala | 2 ++ 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/src/main/scala/riscv/DynamicPipeline.scala b/src/main/scala/riscv/DynamicPipeline.scala index 28ab622..618e3e6 100644 --- a/src/main/scala/riscv/DynamicPipeline.scala +++ b/src/main/scala/riscv/DynamicPipeline.scala @@ -147,4 +147,4 @@ trait DynamicPipeline extends Pipeline { def hasServiceLocal[T](implicit tag: ClassTag[T]): Boolean = { super.hasService[T] } -} \ No newline at end of file +} diff --git a/src/main/scala/riscv/StaticPipeline.scala b/src/main/scala/riscv/StaticPipeline.scala index b50214d..80c41e2 100644 --- a/src/main/scala/riscv/StaticPipeline.scala +++ b/src/main/scala/riscv/StaticPipeline.scala @@ -4,6 +4,8 @@ import spinal.core._ import collection.mutable +import scala.reflect.ClassTag + private class PipelineDataInfo { var firstOutputStageId = Int.MaxValue var lastOutputStageId = -1