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..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 @@ -25,6 +27,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 +113,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] + } }