我正在学习凿子和火箭芯片。 火箭芯片在 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)))
但是当我像上面那样写我的代码时,我得到了一个错误。 凿子报告类型不匹配。
最佳答案
Scala 提供了一个非常强大的功能,称为 Implicit Conversions .我将把它留给 StackOverflow 上的许多解释以及 Google 可以找到的其他解释细节和动机,但让我解释一下它们是如何在 Chisel 和 Rocket Chip 中使用的。
Scala 中的Ints
(如 3
)等同于原始 Java ints
。如果您检查 API docs ,你不会找到任何函数 def U
,但在 Chisel 中,我们能够将 UInt
文字构造为 3.U
。这是通过名为 fromIntToLiteral
的隐式转换 完成的。这基本上允许我们定义 def U
就好像它是在 Scala Int
类本身上定义的一样。凭借 import chisel3._
,您正在导入 fromIntToLiteral
并告诉 Scala 编译器,Int
确实有一个名为 U
的方法!
Rocket Chip 有一些自己的隐式转换,作者认为这些转换很有用。在这种情况下,freechips.rocketchip.util
包含 SeqToAugmentedSeq
定义 def apply(idx: UInt): T
,这里调用的函数*。本质上,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)))
希望对您有所帮助!
*对象上的括号正在调用 apply
method . myUInt(3)
等同于 myUInt.apply(3)
。
关于scala - 如何在 Chisel 中将 Seq 与 Cat 一起使用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58838316/