0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

淺析Stream里的隱式轉(zhuǎn)換

Spinal FPGA ? 來源:Spinal FPGA ? 2023-05-15 17:36 ? 次閱讀

Stream、Flow是在電路描述里經(jīng)常用到的對(duì)象。較早時(shí)間有小伙伴問關(guān)于Stream里Fragment嵌套的問題,當(dāng)時(shí)沒有去深入的研究,最近重新review下這個(gè)問題,特來做個(gè)總結(jié)。

》開篇立問

先來看看下面的這個(gè)場(chǎng)景:

我們定義如下接口

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

這里定義了一個(gè)Stream接口,如果我們想引用這里面的data,那么下面兩種方法是等價(jià)的:

b.data

b.payload.data

估計(jì)大多數(shù)人不深究的話基本上就采用第一種寫法了,簡單快捷(我也是)。

》深入一步

顯而易見,這里b的定義是一個(gè)Stream接口。按照Stream接口的定義,其所包含的信號(hào)只有三個(gè):

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

從直觀上來看,那么采用b.data這種形式顯然是沒有直接的方法或調(diào)用關(guān)系的。

那么剩下的一種可能就是隱式轉(zhuǎn)換了~

Stream類在定義時(shí)其繼承關(guān)系如下:

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

這里的隱式轉(zhuǎn)換存在于trait DataCarrier中:

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

這里為DataCarrier定義了兩個(gè)隱式轉(zhuǎn)換函數(shù)toImplicit和toImplicit2。根據(jù)DataCarrier的數(shù)據(jù)類型,分別返回不同的對(duì)象:

如果數(shù)據(jù)類型是普通類型,則直接返回dataCarrier.payload

如果數(shù)據(jù)類型是Fragment類型,則會(huì)返回dataCarrier.fragment(同樣,會(huì)調(diào)用到toImplicit函數(shù))。

如果你在toImplicit函數(shù)上打斷點(diǎn),執(zhí)行上面的接口定義相關(guān)的代碼,你就會(huì)發(fā)現(xiàn)會(huì)在toImplicit函數(shù)上暫停。也就意味著當(dāng)我們調(diào)用b.data時(shí)會(huì)調(diào)用隱式轉(zhuǎn)換函數(shù)toImplicit返回b.payload后再執(zhí)行b.payload.data~

》亂花漸欲迷人眼

理解了上面的代碼,接下來的場(chǎng)景可能讓你眼花繚亂了。

先來看下面的這段代碼:

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

上面這段代碼是不是覺得fire0和fire1是表達(dá)相同的功能?然而,生成的RTL代碼會(huì)讓你懷疑自己:

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

再來看看一個(gè)Fragment嵌套的場(chǎng)景:

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

一眼看去是不是覺得fire0和fire1的作用是一樣的?

然而,生成的RTL代碼卻是這樣的:

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

給你一分鐘,你先品著。等品完之后再來看一個(gè)三層Fragment嵌套的代碼:

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

對(duì)應(yīng)的RTL代碼:

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

看看對(duì)應(yīng)的RTL代碼是不是和你想的又不一樣了?

我們調(diào)用函數(shù)實(shí)現(xiàn)和我們自己實(shí)現(xiàn)大相徑庭!

先暈一會(huì)兒~

》撥云見霧

是否又到了懷疑TM這SpinalHDL有Bug吧……

我也思索了兩三天~

回歸正題。接下來的內(nèi)容好好品。這一切的一切均還是在于隱式轉(zhuǎn)換。





審核編輯:劉清

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • RTL
    RTL
    +關(guān)注

    關(guān)注

    1

    文章

    385

    瀏覽量

    59831
  • HDL語言
    +關(guān)注

    關(guān)注

    0

    文章

    47

    瀏覽量

    8919

原文標(biāo)題:Stream里的隱式轉(zhuǎn)換

文章出處:【微信號(hào):Spinal FPGA,微信公眾號(hào):Spinal FPGA】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    Stream模塊的基礎(chǔ)用法和進(jìn)階用法

    在 Rust 語言中,Tokio 是一個(gè)非常流行的異步編程框架。它提供了一系列的模塊,其中最常用的就是 Stream 模塊。Stream 模塊允許我們以異步的方式處理數(shù)據(jù)流,這在很多情況下非常
    的頭像 發(fā)表于 09-19 15:33 ?1216次閱讀

    Stream API原理介紹

    Stream API 是 Java 8 中最重要的新特性之一,它是處理集合和數(shù)組的一種新方式。它提供了一種簡單、靈活和可讀的方式來處理集合和數(shù)組中的元素,從而使代碼更加簡潔、高效和易于維護(hù)。 1.
    的頭像 發(fā)表于 09-30 15:31 ?723次閱讀

    得到警告373“簽名到無符號(hào)轉(zhuǎn)換

    嗨,伙計(jì),附件是我的4位16×2液晶顯示屏的截圖。我不斷得到警告373“簽名到無符號(hào)轉(zhuǎn)換”。你會(huì)看到它在第148行和第157行。我在C代碼上仍然是新的,所以我確信我正在做愚蠢的錯(cuò)誤。有人可以幫助
    發(fā)表于 03-13 09:19

    mysql轉(zhuǎn)換具體描述

    mysql 轉(zhuǎn)換問題
    發(fā)表于 08-13 06:07

    2D解析

    《Fundamentals of Computer Graphics》翻譯(三):2D直線
    發(fā)表于 09-03 12:19

    XC8怎么將float轉(zhuǎn)換為整數(shù)

    您好,我使用了兩個(gè)選項(xiàng)來改變浮點(diǎn)到余弦角的整數(shù)。但是我得到了如下警告:警告[356 ]代碼\ADC.C;282.27將浮點(diǎn)到整數(shù)的轉(zhuǎn)換。所以不能得到準(zhǔn)確的結(jié)果。我的代碼
    發(fā)表于 09-06 12:07

    有符號(hào)到無符號(hào)轉(zhuǎn)換

    您好,我現(xiàn)在正在使用PIC16F18313,在代碼中,我聲明了一個(gè)變量,它位于我放入的示例代碼中,問題是,我收到一個(gè)警告:簽名到無符號(hào)轉(zhuǎn)換,我不知道是什么原因或者如何修復(fù)它。關(guān)于我的問題:希望你能得到一個(gè)很好的回答。謝謝。
    發(fā)表于 04-07 14:06

    看看Stream信號(hào)是如何做跨時(shí)鐘域握手的

    邏輯出身的農(nóng)民工兄弟在面試時(shí)總難以避免“跨時(shí)鐘域”的拷問,在諸多跨時(shí)鐘域的方法,握手是一種常見的方式,而Stream作為一種天然的握手信號(hào),不妨看看它里面是如做跨時(shí)鐘域的握手
    發(fā)表于 07-07 17:25

    基于顯反饋信息的矩陣分解

    針對(duì)現(xiàn)有的基于用戶顯反饋信息的推薦系統(tǒng)推薦準(zhǔn)確率不高的問題,提出了一種基于顯反饋信息的概率矩陣分解推薦方法。該方法綜合考慮了顯示反饋信息和
    發(fā)表于 01-04 16:22 ?0次下載

    基于機(jī)器學(xué)習(xí)的中文實(shí)體關(guān)系抽取方法

    基于機(jī)器學(xué)習(xí)的中文實(shí)體關(guān)系抽取方法
    發(fā)表于 06-02 14:42 ?4次下載

    JDK8 Stream數(shù)據(jù)流效率分析

    Stream 是Java SE 8類庫中新增的關(guān)鍵抽象,它被定義于 java.util.stream (這個(gè)包有若干流類型:Stream 代表對(duì)象引用流,此外還有一系列特化流,
    的頭像 發(fā)表于 08-17 10:53 ?1250次閱讀

    Java 8 Stream流底層原理

    初識(shí)lambda呢,函數(shù)接口肯定是繞不過去的,函數(shù)接口就是一個(gè)有且僅有一個(gè)抽象方法,但是可以有多個(gè)非抽象方法的接口。函數(shù)接口可以被
    的頭像 發(fā)表于 11-18 10:27 ?1411次閱讀

    pipeline高端玩法之Stage轉(zhuǎn)換

    Scala里面的轉(zhuǎn)換的好處是靈活,壞處就是太靈活。
    的頭像 發(fā)表于 08-19 10:45 ?677次閱讀
    pipeline高端玩法之Stage<b class='flag-5'>里</b>的<b class='flag-5'>隱</b><b class='flag-5'>式</b><b class='flag-5'>轉(zhuǎn)換</b>

    Java的Stream的常用知識(shí)

    什么是Stream 生產(chǎn)線 Stream就像處理生產(chǎn)流水線一樣去工作,傳送帶就是Stream的管道,每個(gè)工廠關(guān)注直接的生產(chǎn),將上游產(chǎn)品加工成下游需要的產(chǎn)品。為什么Stream比傳統(tǒng)的處
    的頭像 發(fā)表于 10-11 15:45 ?471次閱讀
    Java的<b class='flag-5'>Stream</b>的常用知識(shí)

    在SpinalHDL在頂層一鍵優(yōu)化Stream/Flow代碼生成

    ? ? 在SpinalHDL在頂層一鍵優(yōu)化代碼中Stream/Flow代碼生成的payload,fragment。 難看的代碼 ? ????來看一段代碼: ? import
    的頭像 發(fā)表于 12-14 09:05 ?700次閱讀