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

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

3天内不再提示

浅析Stream里的隐式转换

Spinal FPGA 来源:Spinal FPGA 2023-05-15 17:36 次阅读

Stream、Flow是在电路描述里经常用到的对象。较早时间有小伙伴问关于Stream里Fragment嵌套的问题,当时没有去深入的研究,最近重新review下这个问题,特来做个总结。

》开篇立问

先来看看下面的这个场景:

我们定义如下接口

1a049630-f144-11ed-90ce-dac502259ad0.png

这里定义了一个Stream接口,如果我们想引用这里面的data,那么下面两种方法是等价的:

b.data

b.payload.data

估计大多数人不深究的话基本上就采用第一种写法了,简单快捷(我也是)。

》深入一步

显而易见,这里b的定义是一个Stream接口。按照Stream接口的定义,其所包含的信号只有三个:

1a1d2772-f144-11ed-90ce-dac502259ad0.png

从直观上来看,那么采用b.data这种形式显然是没有直接的方法或调用关系的。

那么剩下的一种可能就是隐式转换了~

Stream类在定义时其继承关系如下:

1a3da6be-f144-11ed-90ce-dac502259ad0.png

这里的隐式转换存在于trait DataCarrier中:

1a5b6eec-f144-11ed-90ce-dac502259ad0.png

这里为DataCarrier定义了两个隐式转换函数toImplicit和toImplicit2。根据DataCarrier的数据类型,分别返回不同的对象:

如果数据类型是普通类型,则直接返回dataCarrier.payload

如果数据类型是Fragment类型,则会返回dataCarrier.fragment(同样,会调用到toImplicit函数)。

如果你在toImplicit函数上打断点,执行上面的接口定义相关的代码,你就会发现会在toImplicit函数上暂停。也就意味着当我们调用b.data时会调用隐式转换函数toImplicit返回b.payload后再执行b.payload.data~

》乱花渐欲迷人眼

理解了上面的代码,接下来的场景可能让你眼花缭乱了。

先来看下面的这段代码:

1a92e322-f144-11ed-90ce-dac502259ad0.png

上面这段代码是不是觉得fire0和fire1是表达相同的功能?然而,生成的RTL代码会让你怀疑自己:

1aba0dda-f144-11ed-90ce-dac502259ad0.png

再来看看一个Fragment嵌套的场景:

1ae478ea-f144-11ed-90ce-dac502259ad0.png

一眼看去是不是觉得fire0和fire1的作用是一样的?

然而,生成的RTL代码却是这样的:

1b025428-f144-11ed-90ce-dac502259ad0.png

给你一分钟,你先品着。等品完之后再来看一个三层Fragment嵌套的代码:

1b2619c6-f144-11ed-90ce-dac502259ad0.png

对应的RTL代码:

1b50f9de-f144-11ed-90ce-dac502259ad0.png

看看对应的RTL代码是不是和你想的又不一样了?

我们调用函数实现和我们自己实现大相径庭!

先晕一会儿~

》拨云见雾

是否又到了怀疑TM这SpinalHDL有Bug吧……

我也思索了两三天~

回归正题。接下来的内容好好品。这一切的一切均还是在于隐式转换。





审核编辑:刘清

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

    关注

    1

    文章

    377

    浏览量

    59077
  • HDL语言
    +关注

    关注

    0

    文章

    46

    浏览量

    8871

原文标题:Stream里的隐式转换

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

收藏 人收藏

    评论

    相关推荐

    Stream模块的基础用法和进阶用法

    在 Rust 语言中,Tokio 是一个非常流行的异步编程框架。它提供了一系列的模块,其中最常用的就是 Stream 模块。Stream 模块允许我们以异步的方式处理数据流,这在很多情况下非常
    的头像 发表于 09-19 15:33 712次阅读

    Stream API原理介绍

    Stream API 是 Java 8 中最重要的新特性之一,它是处理集合和数组的一种新方式。它提供了一种简单、灵活和可读的方式来处理集合和数组中的元素,从而使代码更加简洁、高效和易于维护。 1.
    的头像 发表于 09-30 15:31 355次阅读

    浅析如何学习基于ARM平台的嵌入系统

    浅析如何学习基于ARM平台的嵌入系统
    发表于 08-18 11:03

    Redis Stream应用案例

    摘要: Redis Stream Redis最新的大版本5.0已经RC1了,其中最重要的Feature莫过于Redis Stream了,关于Redis Stream的基本使用介绍和设计理念可以看我
    发表于 06-26 17:15

    带有无符号字符的类型转换

    大家好,我正在写一个需要使用无符号字符的程序。但是,每当我使用一个算术运算符或位运算符时,总是会得到“签名到无符号转换”警告。结果是,在没有警告的情况下生成以下内容:例如:无符号CHAR测试
    发表于 10-25 16:53

    签名到无符号警告

    您好,我很少关注签名到无符号转换警告。为什么所有的变量都被声明为无符号,我仍然得到这个警告?上面例子中的值是否被视为无符号或有符号字符?在这种情况下,变量“C”的值是150还是其他?同样,在下
    发表于 11-06 14:43

    得到警告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

    介绍一下不带数据的Stream—Event

    在SpinalHDL中,Stream的抽象可谓诸多设计的核心,今天,一同来看下不带数据的Stream——Event。》不带数据的Stream在逻辑设计,握手信号处处可见,在Spina
    发表于 06-27 16:07

    看看Stream信号是如何做跨时钟域握手的

    逻辑出身的农民工兄弟在面试时总难以避免“跨时钟域”的拷问,在诸多跨时钟域的方法,握手是一种常见的方式,而Stream作为一种天然的握手信号,不妨看看它里面是如做跨时钟域的握手
    发表于 07-07 17:25

    在SpinalHDL有没有什么好的方式实现一个接口位宽转换

    下午微信群有个小伙伴问了这么一道题:将一个为UInt(128 bits)的Stream接口连接到一个UInt(32 bits)的StreamFiFo上,在SpinalHDL有没有什么好的方式实现
    发表于 07-27 14:52

    Java的Stream的常用知识

    什么是Stream 生产线 Stream就像处理生产流水线一样去工作,传送带就是Stream的管道,每个工厂关注直接的生产,将上游产品加工成下游需要的产品。为什么Stream比传统的处
    的头像 发表于 10-11 15:45 256次阅读
    Java的<b class='flag-5'>Stream</b>的常用知识