如何正确地将隐式参数传递给模块?

How to correctly pass implicit parameters to a module?

我正在尝试将隐式参数传递给实例化模块中的子模块。隐式参数是rocketchipenter link description here中定义的config包,我在使用模块实例化的时候想用config包传递一些常量给submodules.But,我在子模块中定义的端口总是不行找到了。

顶层模块定义如下:

package test
import chisel3._
import chisel3.util._
import chisel3.experimental.BaseModule
import chipsalliance.rocketchip.config._
class B extends Module{
  val io = IO(
     ...)
  val config = new TConfig
  val submod: Class[_ <: Any] = Class.forName("test.T").asInstanceOf[Class[_ <: BaseModule]]
  val u_T = Module(submod.getConstructor(classOf[Parameters]).newInstance(config) match {
    case a: RawModule => a
  })
   u_T.io <> ...
}

定义子模块及其参数:

case class TParams(
  P: Int = 100
)

case object TKey extends Field[TParams()]

class TConfig extends Config((site, up, here) => {
  case TKey => {
    TParams(P=1024)
}
})

abstract class TModule(implicit val p: Parameters) extends Module
with HasParameters

trait HasParameters {
 implicit val p: Parameters
}

class T(implicit p: Parameters) extends TModule()(p)
{
  val io = IO(new Bundle{...})
}

编译时报错找不到子模块的io口

值 io 不是 chisel3.RawModule

的成员

我假设您正在使用反射来实例化您的模块,因为它是 rocket-chip 进行其 top-level 实例化的方式,但请注意 rocket-chip 这样做只是因为它接受其名称top-level 模块通过 command-line。如果你知道要实例化的class,你可以直接这样做:

class B extends Module {
  val io = IO(
     ...)
  // Note the use of implicit here will ensure the compiler finds it
  implicit val config = new TConfig
  val submod: test.T = Module(new test.T)
  u_T.io <> ...
}

请注意,您始终可以显式传递隐式参数(顺便说一下,您将 p 传递给 TModule(即 extends TModule()(p)):

class B extends Module {
  val io = IO(
     ...)
  // Passing it explicitly
  val config = new TConfig
  val submod: test.T = Module(new test.T()(config))
  u_T.io <> ...
}