如何正确地将隐式参数传递给模块?
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 <> ...
}
我正在尝试将隐式参数传递给实例化模块中的子模块。隐式参数是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 <> ...
}