0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

pipeline高端玩法之Stage里的隐式转换

Spinal FPGA 来源:Spinal FPGA 2023-08-19 10:45 次阅读

编 者 按

Scala里面的隐式转换的好处是灵活,坏处就是太灵活。

StageableKey都是哪儿来的

pipeline的实现中,有五大要素:pipeline、Connection、Stage、StageableKey、Stageable。我们来看下面的代码:



c11f07de-3e38-11ee-ac96-dac502259ad0.png

这里我们所想要实现的是一个四输入按照树形加法器的形式经过两级求和。这是我在看完了pipeline源代码后写下的第一个练习代码。在看了SpinalHDL里面给的pipeline的例子后给我的第一印象就是太灵活了。从最简单的做起,在进行断点调试分析执行流程时,当我将断点打在pip.build时一个问题困扰了我大半个小时。调试信息显示stage0中internal.stageableToData中包含两个元素,而stage1中internal.stageableToData中确显示有四个元素。这让我第一印象就是简直离了个大谱,stage1里我明明也就只调了两次insert函数啊!

老实讲,我的Scala水平也就搞软件的业余水平,如果我是当初初学,那么我就不纠结了,这里还是老是分析下。

insert

老实回到insert函数来仔细扒拉扒拉:

c189bff2-3e38-11ee-ac96-dac502259ad0.png


加上括号五行代码我看了十几遍,看了几遍也没毛病啊,这里面定义一个Stageable变量s,并把that赋值给this(s),随后将s返回。调用this(s)会通过调用apply函数创建一个StageableKey。再怎么看是不是也只应该将一个StageableKey压入stageableToData不是~

这就是Scala里面的隐式转换的隐入真的是太灵活了。我在看的时候一直忘记了思考一个问题:在上面的代码中第三行":="左边是Data类型,而右边是Stageable变量类型,在Scala这种强类型语言里,操作符左右两侧变量类型不同能进行操作么?换句话说,就是Data所定义的:=方法所支持的参数列表里应该没有Stageable参数类型。

那么,这里的幺蛾子那就只能是存在隐式转换了。在类Stage中存在下面这些隐式转换:

implicit def stageablePiped[T <: Data](stageable: Stageable[T])(implicit key : StageableOffset = StageableOffsetNone) = Stage.this(stageable, key.value)
implicit def stageablePiped2[T <: Data](stageable: Stageable[T]) = new {
def of(key : Any) = Stage.this.apply(stageable, key)
// def := (value : T)(implicit key : StageableOffset = StageableOffsetNone) = Stage.this(stageable, key.value) := value
}
implicit def stageablePiped3[T <: Data](key: Tuple2[Stageable[T], Any]) = Stage.this(key._1, key._2)
implicit def stageablePipedVec[T <: Data](stageable: Stageable[Vec[T]])(implicit key : StageableOffset = StageableOffsetNone) : Vec[T] = Stage.this(stageable, key.value)
implicit def stageablePipedVec2[T <: Data](stageable: Stageable[Vec[T]]) = new {
def of(key : Any) = Stage.this.apply(stageable, key)
}
implicit def stageablePipedVec3[T <: Data](key: Tuple2[Stageable[Vec[T]], Any]) = Stage.this(key._1, key._2)


这里显然符合条件的就是stageablePiped这个隐式转换了。它将我们传入的that这个Stageable参数调用Stage.this方法给注册进了stageableToData中去。这也就意味着我们在Stage1中调用一次insert将会插入两个StageableKey。而在Stage0中之所以不存在这个问题是因为我们所传入的“that”本身就是一个UInt类型变量,无需再进行隐式转换,其所调用的是这个insert函数:


c1aa6464-3e38-11ee-ac96-dac502259ad0.png

‍再回到我们这个代码里面的第18行。两次insert均返回的是Stageable类型变量,而我们这里又做了一次加法。在Stageable里面明显是不存在加法这个方法的。你在IDEA里面如果对加法进行代码跳转,你会发现其调用的是UInt的加法操作。那么无疑这里有存在隐式转换了。即将加法左右两侧的类型均隐式转换成UInt类型。这里还是会调用stageablePiped这个隐式转换,只不过在Stage.this所对应的apply方法里:

c1d3117a-3e38-11ee-ac96-dac502259ad0.png

由于stageableToData中在调用insert时已经将数据压入,此时不会再生成新的StageableKey,将原有的直接返回即可。

因此,在Stage1中的stageableToData中,一共压入了四个StageableKey。

理解了这些,对于stage1,我们可以换个写法:

c21626f4-3e38-11ee-ac96-dac502259ad0.png

这时只会针对stage0.tmp和stage0.tmp1分别调用一次隐式转换得到两个UInt进行相加,故在stage1中的stageableToData中仅包含两个元素。

写在最后

SpinalHDL作者Dolu真的是一个大神,软硬件都玩的真溜~

审核编辑:汤梓红

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 函数
    +关注

    关注

    3

    文章

    4350

    浏览量

    63051
  • 代码
    +关注

    关注

    30

    文章

    4841

    浏览量

    69194
  • 变量
    +关注

    关注

    0

    文章

    613

    浏览量

    28501
  • scala
    +关注

    关注

    0

    文章

    42

    浏览量

    6465

原文标题:pipeline高端玩法(四)—Stage里的隐式转换

文章出处:【微信号:Spinal FPGA,微信公众号:Spinal FPGA】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    pipeline高端玩法—看下FlushNext的用法

    Stage,有关flushNext提供的API有
    的头像 发表于 10-08 10:13 978次阅读
    <b class='flag-5'>pipeline</b><b class='flag-5'>高端</b><b class='flag-5'>玩法</b>—看下FlushNext的用法

    得到警告373“签名到无符号转换

    嗨,伙计,附件是我的4位16×2液晶显示屏的截图。我不断得到警告373“签名到无符号转换”。你会看到它在第148行和第157行。我在C代码上仍然是新的,所以我确信我正在做愚蠢的错误。有人可以帮助
    发表于 03-13 09:19

    mysql转换具体描述

    mysql 转换问题
    发表于 08-13 06:07

    2D解析

    《Fundamentals of Computer Graphics》翻译(三):2D直线
    发表于 09-03 12:19

    XC8怎么将float转换为整数

    您好,我使用了两个选项来改变浮点到余弦角的整数。但是我得到了如下警告:警告[356 ]代码\ADC.C;282.27将浮点到整数的转换。所以不能得到准确的结果。我的代码
    发表于 09-06 12:07

    有符号到无符号转换

    您好,我现在正在使用PIC16F18313,在代码中,我声明了一个变量,它位于我放入的示例代码中,问题是,我收到一个警告:签名到无符号转换,我不知道是什么原因或者如何修复它。关于我的问题:希望你能得到一个很好的回答。谢谢。
    发表于 04-07 14:06

    Pipeline ADCs Come of Age

    and mixed-signal community, called pipeline ADCs. The following article takes the knowledge of advantages and disadvantages of the pipeline
    发表于 04-25 10:22 1106次阅读
    <b class='flag-5'>Pipeline</b> ADCs Come of Age

    基于显反馈信息的矩阵分解

    针对现有的基于用户显反馈信息的推荐系统推荐准确率不高的问题,提出了一种基于显反馈信息的概率矩阵分解推荐方法。该方法综合考虑了显示反馈信息和
    发表于 01-04 16:22 0次下载

    基于机器学习的中文实体关系抽取方法

    基于机器学习的中文实体关系抽取方法
    发表于 06-02 14:42 4次下载

    浅析Stream转换

    Stream、Flow是在电路描述经常用到的对象。
    的头像 发表于 05-15 17:36 528次阅读
    浅析Stream<b class='flag-5'>里</b>的<b class='flag-5'>隐</b><b class='flag-5'>式</b><b class='flag-5'>转换</b>

    软件使用SMMUv3的stage1还是stage2地址转换

    如果SMMUv3硬件只支持stage1或只支持stage2,那么支持的stage可以用于Linux的DMA-IOMMU和VFIO的场景。
    的头像 发表于 05-23 17:28 1755次阅读
    软件使用SMMUv3的<b class='flag-5'>stage</b>1还是<b class='flag-5'>stage</b>2地址<b class='flag-5'>转换</b>

    SpinalHDLpipeline的设计思路

    如果你曾看过VexRSICV的设计,对于从事逻辑设计的你会惊讶从未想过逻辑设计还能这么来做。针对VexRSICV所衍生出的pipeline Lib,该系列会对pipeline进行一次梳理。诚如之前一篇博客曾讲,这是“勇者的游戏”。
    的头像 发表于 08-16 15:11 1025次阅读
    SpinalHDL<b class='flag-5'>里</b><b class='flag-5'>pipeline</b>的设计思路

    pipeline高端玩法—优先级介绍

    无论是SystemVerilog还是SpinalHDL,都有Last valid assignment wins的语法特征。如在SpinalHDL-Doc中所描述
    的头像 发表于 11-04 10:13 712次阅读
    <b class='flag-5'>pipeline</b><b class='flag-5'>高端</b><b class='flag-5'>玩法</b>—优先级介绍

    pipeline高端玩法—haltIt介绍(九)

    看名字,就基本能猜到这个函数的大体功能是流水线暂停。
    的头像 发表于 11-24 16:57 437次阅读

    什么是pipeline?Go中构建流数据pipeline的技术

    本文介绍了在 Go 中构建流数据pipeline的技术。 处理此类pipeline中的故障很棘手,因为pipeline中的每个阶段可能会阻止尝试向下游发送值,并且下游阶段可能不再关心传入的数据。
    的头像 发表于 03-11 10:16 681次阅读