这是一个名为
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 建议在这里使用协变类型,但我不明白。
我不想大幅改变基类。
如何以最小的改变实现我的目标?
问题在于,在
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]{}