"данные для подключения 'chisel3.core.UInt@103' должны быть аппаратными, а не чистым типом зубила" при переписывании OpenSoCFabric1.1.2 из Chisel2 в Chisel3
Я пытаюсь переписать OpenSoCFaric-1.1.2 от зубила2 до зубила3. Но я сталкиваюсь с сообщениями об ошибках "данные для подключения 'chisel3.core.UInt@103' должны быть аппаратными, а не чистым типом долота" для приведенного ниже кода:
Файл: packettoFlit.scala класс: PacketToFlit val flitWidth = Flit.fromBits(0.U, parms).getWidth
Файл:channel.scala объект: Flit
object Flit {
def head(h: HeadFlit) : Flit = {
val f = new Flit(h.parms)
f.x := f.union.pack("Head", h)
f
}
def body(b: BodyFlit) : Flit = {
val f = new Flit(b.parms)
f.x := f.union.pack("Body", b)
f
}
def fromBits(n: UInt, parms: Parameters) : Flit = {
val f = new Flit(parms)
f.x := n
f
}
/*
def zeroHead(parms: Parameters) : HeadFlit = {
val x = new HeadFlit(parms)
x.
}
*/
}
И теперь у меня нет хороших идей о том, как переписать такие сегменты кода, чтобы исправить ошибку. Не могли бы вы дать некоторую помощь или предложения? Большое спасибо!
2 ответа
Ниже приведен исходный код для класса Flit.
class Flit(parms: Parameters) extends Bundle {
val union = new BitUnion(Map("Head" -> new HeadFlit(parms), "Body" -> new BodyFlit(parms)))
val x = UInt(union.width.W)
val numVCs = parms.get[Int]("numVCs")
def asHead(dummy: Int = 0) : HeadFlit = union.unpack[HeadFlit]("Head", x)
def asBody(dummy: Int = 0) : BodyFlit = union.unpack[BodyFlit]("Body", x)
def whenHead(block: HeadFlit => Unit) { union.whenTag[HeadFlit]("Head", x)(block) }
def whenBody(block: BodyFlit => Unit) { union.whenTag[BodyFlit]("Body", x)(block) }
def isHead(dummy: Int = 0) : Bool = union.tagEquals("Head", x)
def isBody(dummy: Int = 0) : Bool = union.tagEquals("Body", x)
def isTail(dummy: Int = 0) : Bool = {
val tailBit = Bool()
when (isHead()) {
tailBit := union.unpack[HeadFlit]("Head", x).isTail
} .otherwise {
tailBit := union.unpack[BodyFlit]("Body", x).isTail
}
tailBit
}
def getVCPort(dummy: Int = 0) : UInt = {
val vcBits = UInt(log2Ceil(numVCs).W)
when (isHead()) {
vcBits := union.unpack[HeadFlit]("Head", x).vcPort
} .otherwise {
vcBits := union.unpack[BodyFlit]("Body", x).vcPort
}
vcBits
}
//override def clone = { new Flit(parms).asInstanceOf[this.type] }
override def cloneType: this.type = new Flit(parms).asInstanceOf[this.type]
// override def width : Int = {x.width}
}
Большое спасибо! Бибо
Нам нужно было бы увидеть больше сообщения об ошибке (номер строки) и больше кода, чтобы дать окончательный ответ, но мы предполагаем, что где-то используется UInt(xW), где ожидается литерал (yU), или Оболочка Wire()/WireInit() отсутствует.
ПРИМЕЧАНИЕ. LBL активно переносит этот код в Chisel3. Возможно, вам лучше дождаться публикации их работ.