scala - 如何在 Chisel 中将 Seq 与 Cat 一起使用?

标签 scala chisel rocket-chip

我正在学习凿子和火箭芯片。 火箭芯片在 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/

相关文章:

Scala 返回一个带有 0 个参数的 void 函数,语法丑陋?

scala - 在 chisel 中动态创建模块,同时将动态参数传递给这些模块

linux - 哪个 Linux 实体负责生成非法指令陷阱?

scala - 如何理解这行凿子代码

scala - AKKA HTTP 源流与 Futures

scala - 使用具体类型扩展 Scala Set

scala - 与断言相比,scala 中的假设有何含义?

凿子3 : Partial assignment to a multi-bit slice of a Vector IO

凿子同步

chisel - 检索 RegInit 的重置值