gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 13:13:01 25 4
gpt4 key购买 nike

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

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com