我在学凿子和火箭芯片。火箭芯片有一个在RVC.scala中使用Seq和Cat的代码.
val funct = Seq(0.U, 4.U, 6.U, 7.U, 0.U, 0.U, 2.U, 3.U)(Cat(x(12), x(6,5)))但是,当我像上面这样编写代码时,我得到了一个错误。凿子报告类型不匹配。
发布于 2019-11-14 02:14:04
Scala提供了一个非常强大的特性,名为隐式反式。我将把它留给StackOverflow上的许多解释,以及谷歌可以找到的其他解释来解释细节和动机,但让我解释一下它们是如何在Chisel和火箭芯片中使用的。
Scala中的Ints (如3)等价于原始的ints。如果您检查API文档,您将找不到任何函数def U,但是在Chisel中,我们能够将UInt文本构造为3.U。这是通过一个名为fromIntToLiteral的隐式转换来实现的,它本质上允许我们定义def U,就好像它是在Scala Int类本身上定义的一样。借助import chisel3._,您将导入fromIntToLiteral并告诉Scala编译器,实际上Int确实有一个名为U的方法!
火箭芯片有自己的一些隐式转换,作者认为这将是有用的。在本例中,freechips.rocketchip.util包含定义def apply(idx: UInt): T的SeqToAugmentedSeq,在这里调用的函数*。实际上,Scala编译器看到没有apply方法需要在Seq上定义一个UInt,所以它注意到SeqToAugmentedSeq被导入到作用域中并提供了这样一个方法。它进行了以下转换:
val funct = Seq(0.U, 4.U, 6.U, 7.U, 0.U, 0.U, 2.U, 3.U)(Cat(x(12), x(6,5)))
// The compiler turns this into:
val funct = (new SeqToAugmentedSeq(Seq(0.U, 4.U, 6.U, 7.U, 0.U, 0.U, 2.U, 3.U))).apply(Cat(x(12), x(6,5)))我希望这能帮到你!
*对象上的部分调用方法。myUInt(3)等同于myUInt.apply(3)。
发布于 2019-11-13 14:59:58
这一行声明一个常量Seq:
//idx:0 1 2 3 4 5 6 7
Seq(0.U, 4.U, 6.U, 7.U, 0.U, 0.U, 2.U, 3.U)然后返回由索引UInt提供的项( Cat(x(12), x(6,5)) )。
x应该在前面声明为和UInt。如果我们宣布:
val x = "b0001000011000001".U(16.W)我们将有x(12) = 1.U和x(6, 5) = 3.U (或"b11".U),然后是Cat(x(12), x(6,5)) == "b111".U == 7.U
返回的索引为7,对应于最初声明的序列Seq()中的3.U。
那么funct的价值将是:
val funct = 3.Uhttps://stackoverflow.com/questions/58838316
复制相似问题