首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在Chisel中使用Seq和猫?

如何在Chisel中使用Seq和猫?
EN

Stack Overflow用户
提问于 2019-11-13 13:33:24
回答 2查看 841关注 0票数 3

我在学凿子和火箭芯片。火箭芯片有一个在RVC.scala中使用Seq和Cat的代码.

代码语言:javascript
运行
复制
    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)))

但是,当我像上面这样编写代码时,我得到了一个错误。凿子报告类型不匹配。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 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): TSeqToAugmentedSeq,在这里调用的函数*。实际上,Scala编译器看到没有apply方法需要在Seq上定义一个UInt,所以它注意到SeqToAugmentedSeq被导入到作用域中并提供了这样一个方法。它进行了以下转换:

代码语言:javascript
运行
复制
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)

票数 3
EN

Stack Overflow用户

发布于 2019-11-13 14:59:58

这一行声明一个常量Seq:

代码语言:javascript
运行
复制
//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。如果我们宣布:

代码语言:javascript
运行
复制
val x = "b0001000011000001".U(16.W)

我们将有x(12) = 1.Ux(6, 5) = 3.U (或"b11".U),然后是Cat(x(12), x(6,5)) == "b111".U == 7.U

返回的索引为7,对应于最初声明的序列Seq()中的3.U。

那么funct的价值将是:

代码语言:javascript
运行
复制
val funct = 3.U
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58838316

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档