如何用 Vec 类型覆盖 Chisel 常量?

问题描述 投票:0回答:1

这是一个名为

RequestBuffer
的类。

class RequestBuffer(flow: Boolean = true, entries: Int = 4)(implicit p: Parameters) extends L2Module {
  val buffer = RegInit(VecInit(Seq.fill(entries)(0.U.asTypeOf(new ReqEntry))))
  ...
}

现在我想创建一个名为

UnifiedRequestBuffer
的新类,它扩展
RequestBuffer
。 所以我尝试了以下代码。

class RequestBuffer(flow: Boolean = true, entries: Int = 4)(implicit p: Parameters) extends L2Module {
  lazy val buffer = RegInit(VecInit(Seq.fill(entries)(0.U.asTypeOf(new ReqEntry))))
  ...
}
class UnifiedRequestBuffer(flow: Boolean = true, entries: Int = 4)(implicit p: Parameters) extends RequestBuffer {
  override lazy val buffer = RegInit(VecInit(Seq.fill(entries)(0.U.asTypeOf(new UnifiedReqEntry))))
  ...
}

虽然

UnifiedReqEntry
扩展了
ReqEntry
,但它根本不起作用。

[error] .../UnifiedRequestBuffer.scala:40:45: type mismatch;
[error]  found   : chisel3.Vec[coupledL2.UnifiedCache.UnifiedReqEntry]
[error]  required: chisel3.Vec[coupledL2.ReqEntry]
[error] Note: coupledL2.UnifiedCache.UnifiedReqEntry <: coupledL2.ReqEntry, but class Vec is invariant in type T.
[error] You may wish to define T as +T instead. (SLS 4.5)
[error]   override lazy val buffer = RegInit(VecInit(Seq.fill(entries)(0.U.asTypeOf(new UnifiedReqEntry))))
[error]                                             ^
[error] one error found

显然,

Vec[UnifiedReqEntry]
Vec[ReqEntry]
在这里不匹配。 ChatGPT 建议在这里使用协变类型,但我不明白。 我不想大幅改变基类。 如何以最小的改变实现我的目标?

scala chisel
1个回答
0
投票

问题在于,在

chisel3.Vec
类上,tipe 参数尚未声明为协变。

协变意味着继承与类型参数继承的方向相同,例如:

如果

B
A
的子类,而不是
List[B]
List[A]
的子类,则接受
List[A]
的函数也可以接受
List[B]

要声明类型参数协变,请在类型参数前使用

+
符号:
class MyClass[+A]{}

逆变是相反的:

如果

B
A
的子类,那么
Option[B]
Option[A]
的超类。

要声明类型参数逆变,请在类型参数前使用

-
符号:
class MyClass[-A]{}

© www.soinside.com 2019 - 2024. All rights reserved.