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

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

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

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

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

編 者 按

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

StageableKey都是哪兒來的

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



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

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

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

insert

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

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


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

這就是Scala里面的隱式轉(zhuǎn)換的隱入真的是太靈活了。我在看的時候一直忘記了思考一個問題:在上面的代碼中第三行":="左邊是Data類型,而右邊是Stageable變量類型,在Scala這種強類型語言里,操作符左右兩側(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這個隱式轉(zhuǎn)換了。它將我們傳入的that這個Stageable參數(shù)調(diào)用Stage.this方法給注冊進(jìn)了stageableToData中去。這也就意味著我們在Stage1中調(diào)用一次insert將會插入兩個StageableKey。而在Stage0中之所以不存在這個問題是因為我們所傳入的“that”本身就是一個UInt類型變量,無需再進(jìn)行隱式轉(zhuǎn)換,其所調(diào)用的是這個insert函數(shù):


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

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

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

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

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

理解了這些,對于stage1,我們可以換個寫法:

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

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

寫在最后

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

審核編輯:湯梓紅

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

    關(guān)注

    3

    文章

    4237

    瀏覽量

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

    關(guān)注

    30

    文章

    4671

    瀏覽量

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

    關(guān)注

    0

    文章

    607

    瀏覽量

    28257
  • scala
    +關(guān)注

    關(guān)注

    0

    文章

    42

    瀏覽量

    6387

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

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

收藏 人收藏

    評論

    相關(guān)推薦

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

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

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

    嗨,伙計,附件是我的4位16×2液晶顯示屏的截圖。我不斷得到警告373“簽名到無符號轉(zhuǎn)換”。你會看到它在第148行和第157行。我在C代碼上仍然是新的,所以我確信我正在做愚蠢的錯誤。有人可以幫助
    發(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ù)

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

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

    您好,我現(xiàn)在正在使用PIC16F18313,在代碼中,我聲明了一個變量,它位于我放入的示例代碼中,問題是,我收到一個警告:簽名到無符號轉(zhuǎn)換,我不知道是什么原因或者如何修復(fù)它。關(guān)于我的問題:希望你能得到一個很好的回答。謝謝。
    發(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 ?1049次閱讀
    <b class='flag-5'>Pipeline</b> ADCs Come of Age

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

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

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

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

    淺析Stream轉(zhuǎn)換

    Stream、Flow是在電路描述經(jīng)常用到的對象。
    的頭像 發(fā)表于 05-15 17:36 ?406次閱讀
    淺析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的場景。
    的頭像 發(fā)表于 05-23 17:28 ?1457次閱讀
    軟件使用SMMUv3的<b class='flag-5'>stage</b>1還是<b class='flag-5'>stage</b>2地址<b class='flag-5'>轉(zhuǎn)換</b>

    SpinalHDLpipeline的設(shè)計思路

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

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

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

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

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

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

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