精品国产人成在线_亚洲高清无码在线观看_国产在线视频国产永久2021_国产AV综合第一页一个的一区免费影院黑人_最近中文字幕MV高清在线视频

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

    文章

    4306

    瀏覽量

    62431
  • 代碼
    +關注

    關注

    30

    文章

    4748

    瀏覽量

    68356
  • 變量
    +關注

    關注

    0

    文章

    613

    瀏覽量

    28329
  • scala
    +關注

    關注

    0

    文章

    42

    瀏覽量

    6411

原文標題:pipeline高端玩法(四)—Stage里的隱式轉換

文章出處:【微信號:Spinal FPGA,微信公眾號:Spinal FPGA】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

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

    Stage,有關flushNext提供的API有
    的頭像 發表于 10-08 10:13 ?895次閱讀
    <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 ?1078次閱讀
    <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 ?454次閱讀
    淺析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 ?1594次閱讀
    軟件使用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 ?919次閱讀
    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 ?608次閱讀
    <b class='flag-5'>pipeline</b><b class='flag-5'>高端</b><b class='flag-5'>玩法</b>—優先級介紹

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

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

    什么是pipeline?Go中構建流數據pipeline的技術

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