0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
电子发烧友
开通电子发烧友VIP会员 尊享10大特权
海量资料免费下载
精品直播免费看
优质内容免费畅学
课程9折专享价
創(chuàng)作中心

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

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

pipeline高端玩法之Stage里的隱式轉(zhuǎn)換

Spinal FPGA ? 來源:Spinal FPGA ? 2023-08-19 10:45 ? 次閱讀

編 者 按

Scala里面的隱式轉(zhuǎn)換的好處是靈活,壞處就是太靈活。

StageableKey都是哪兒來的

pipeline的實(shí)現(xiàn)中,有五大要素:pipeline、Connection、Stage、StageableKey、Stageable。我們來看下面的代碼:



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

這里我們所想要實(shí)現(xiàn)的是一個(gè)四輸入按照樹形加法器的形式經(jīng)過兩級(jí)求和。這是我在看完了pipeline源代碼后寫下的第一個(gè)練習(xí)代碼。在看了SpinalHDL里面給的pipeline的例子后給我的第一印象就是太靈活了。從最簡(jiǎn)單的做起,在進(jìn)行斷點(diǎn)調(diào)試分析執(zhí)行流程時(shí),當(dāng)我將斷點(diǎn)打在pip.build時(shí)一個(gè)問題困擾了我大半個(gè)小時(shí)。調(diào)試信息顯示stage0中internal.stageableToData中包含兩個(gè)元素,而stage1中internal.stageableToData中確顯示有四個(gè)元素。這讓我第一印象就是簡(jiǎn)直離了個(gè)大譜,stage1里我明明也就只調(diào)了兩次insert函數(shù)?。?

老實(shí)講,我的Scala水平也就搞軟件的業(yè)余水平,如果我是當(dāng)初初學(xué),那么我就不糾結(jié)了,這里還是老是分析下。

insert

老實(shí)回到insert函數(shù)來仔細(xì)扒拉扒拉:

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


加上括號(hào)五行代碼我看了十幾遍,看了幾遍也沒毛病啊,這里面定義一個(gè)Stageable變量s,并把that賦值給this(s),隨后將s返回。調(diào)用this(s)會(huì)通過調(diào)用apply函數(shù)創(chuàng)建一個(gè)StageableKey。再怎么看是不是也只應(yīng)該將一個(gè)StageableKey壓入stageableToData不是~

這就是Scala里面的隱式轉(zhuǎn)換的隱入真的是太靈活了。我在看的時(shí)候一直忘記了思考一個(gè)問題:在上面的代碼中第三行":="左邊是Data類型,而右邊是Stageable變量類型,在Scala這種強(qiáng)類型語言里,操作符左右兩側(cè)變量類型不同能進(jìn)行操作么?換句話說,就是Data所定義的:=方法所支持的參數(shù)列表里應(yīng)該沒有Stageable參數(shù)類型。

那么,這里的幺蛾子那就只能是存在隱式轉(zhuǎn)換了。在類Stage中存在下面這些隱式轉(zhuǎn)換:

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這個(gè)隱式轉(zhuǎn)換了。它將我們傳入的that這個(gè)Stageable參數(shù)調(diào)用Stage.this方法給注冊(cè)進(jìn)了stageableToData中去。這也就意味著我們?cè)赟tage1中調(diào)用一次insert將會(huì)插入兩個(gè)StageableKey。而在Stage0中之所以不存在這個(gè)問題是因?yàn)槲覀兯鶄魅氲摹皌hat”本身就是一個(gè)UInt類型變量,無需再進(jìn)行隱式轉(zhuǎn)換,其所調(diào)用的是這個(gè)insert函數(shù):


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

?再回到我們這個(gè)代碼里面的第18行。兩次insert均返回的是Stageable類型變量,而我們這里又做了一次加法。在Stageable里面明顯是不存在加法這個(gè)方法的。你在IDEA里面如果對(duì)加法進(jìn)行代碼跳轉(zhuǎn),你會(huì)發(fā)現(xiàn)其調(diào)用的是UInt的加法操作。那么無疑這里有存在隱式轉(zhuǎn)換了。即將加法左右兩側(cè)的類型均隱式轉(zhuǎn)換成UInt類型。這里還是會(huì)調(diào)用stageablePiped這個(gè)隱式轉(zhuǎn)換,只不過在Stage.this所對(duì)應(yīng)的apply方法里:

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

由于stageableToData中在調(diào)用insert時(shí)已經(jīng)將數(shù)據(jù)壓入,此時(shí)不會(huì)再生成新的StageableKey,將原有的直接返回即可。

因此,在Stage1中的stageableToData中,一共壓入了四個(gè)StageableKey。

理解了這些,對(duì)于stage1,我們可以換個(gè)寫法:

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

這時(shí)只會(huì)針對(duì)stage0.tmp和stage0.tmp1分別調(diào)用一次隱式轉(zhuǎn)換得到兩個(gè)UInt進(jìn)行相加,故在stage1中的stageableToData中僅包含兩個(gè)元素。

寫在最后

SpinalHDL作者Dolu真的是一個(gè)大神,軟硬件都玩的真溜~

審核編輯:湯梓紅

聲明:本文內(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)投訴
  • 函數(shù)
    +關(guān)注

    關(guān)注

    3

    文章

    4371

    瀏覽量

    64230
  • 代碼
    +關(guān)注

    關(guān)注

    30

    文章

    4888

    瀏覽量

    70274
  • 變量
    +關(guān)注

    關(guān)注

    0

    文章

    614

    瀏覽量

    28831
  • scala
    +關(guān)注

    關(guān)注

    0

    文章

    42

    瀏覽量

    6628

原文標(biāo)題:pipeline高端玩法(四)—Stage里的隱式轉(zhuǎn)換

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

收藏 0人收藏

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

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

    Stage,有關(guān)flushNext提供的API有
    的頭像 發(fā)表于 10-08 10:13 ?1088次閱讀
    <b class='flag-5'>pipeline</b><b class='flag-5'>高端</b><b class='flag-5'>玩法</b>—看下FlushNext的用法

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

    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
    發(fā)表于 04-25 10:22 ?1133次閱讀
    <b class='flag-5'>Pipeline</b> ADCs Come of Age

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

    針對(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次下載

    淺析Stream轉(zhuǎn)換

    Stream、Flow是在電路描述經(jīng)常用到的對(duì)象。
    的頭像 發(fā)表于 05-15 17:36 ?676次閱讀
    淺析Stream<b class='flag-5'>里</b>的<b class='flag-5'>隱</b><b class='flag-5'>式</b><b class='flag-5'>轉(zhuǎn)換</b>

    軟件使用SMMUv3的stage1還是stage2地址轉(zhuǎn)換

    如果SMMUv3硬件只支持stage1或只支持stage2,那么支持的stage可以用于Linux的DMA-IOMMU和VFIO的場(chǎng)景。
    的頭像 發(fā)表于 05-23 17:28 ?2045次閱讀
    軟件使用SMMUv3的<b class='flag-5'>stage</b>1還是<b class='flag-5'>stage</b>2地址<b class='flag-5'>轉(zhuǎn)換</b>

    SpinalHDLpipeline的設(shè)計(jì)思路

    如果你曾看過VexRSICV的設(shè)計(jì),對(duì)于從事邏輯設(shè)計(jì)的你會(huì)驚訝從未想過邏輯設(shè)計(jì)還能這么來做。針對(duì)VexRSICV所衍生出的pipeline Lib,該系列會(huì)對(duì)pipeline進(jìn)行一次梳理。誠如之前一篇博客曾講,這是“勇者的游戲”。
    的頭像 發(fā)表于 08-16 15:11 ?1172次閱讀
    SpinalHDL<b class='flag-5'>里</b><b class='flag-5'>pipeline</b>的設(shè)計(jì)思路

    pipeline高端玩法—優(yōu)先級(jí)介紹

    無論是SystemVerilog還是SpinalHDL,都有Last valid assignment wins的語法特征。如在SpinalHDL-Doc中所描述
    的頭像 發(fā)表于 11-04 10:13 ?856次閱讀
    <b class='flag-5'>pipeline</b><b class='flag-5'>高端</b><b class='flag-5'>玩法</b>—優(yōu)先級(jí)介紹

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

    看名字,就基本能猜到這個(gè)函數(shù)的大體功能是流水線暫停。
    的頭像 發(fā)表于 11-24 16:57 ?561次閱讀

    什么是pipeline?Go中構(gòu)建流數(shù)據(jù)pipeline的技術(shù)

    本文介紹了在 Go 中構(gòu)建流數(shù)據(jù)pipeline的技術(shù)。 處理此類pipeline中的故障很棘手,因?yàn)?b class='flag-5'>pipeline中的每個(gè)階段可能會(huì)阻止嘗試向下游發(fā)送值,并且下游階段可能不再關(guān)心傳入的數(shù)據(jù)。
    的頭像 發(fā)表于 03-11 10:16 ?952次閱讀

    電子發(fā)燒友

    中國電子工程師最喜歡的網(wǎng)站

    • 2931785位工程師會(huì)員交流學(xué)習(xí)
    • 獲取您個(gè)性化的科技前沿技術(shù)信息
    • 參加活動(dòng)獲取豐厚的禮品