<acronym id="s8ci2"><small id="s8ci2"></small></acronym>
<rt id="s8ci2"></rt><rt id="s8ci2"><optgroup id="s8ci2"></optgroup></rt>
<acronym id="s8ci2"></acronym>
<acronym id="s8ci2"><center id="s8ci2"></center></acronym>
0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

怎樣使用SpinalHDL Pipeline組件里的resulting及overloaded?

Spinal FPGA ? 來源:Spinal FPGA ? 2023-09-11 09:47 ? 次閱讀

今天來看下SpinalHDL Pipeline組件里的resulting及overloaded的使用

》resulting

在Stage中的數據結構中,有四種類型:

val stageableToData = mutable.LinkedHashMap[StageableKey, Data]()
val stageableOverloadedToData = mutable.LinkedHashMap[StageableKey, Data]()
val stageableResultingToData = mutable.LinkedHashMap[StageableKey, Data]()
val stageableTerminal = mutable.LinkedHashSet[StageableKey]()

關于stageableToData,在之前的文章中已有介紹,今天來看下stageableOverloadedToData以及stageableResultingToData的作用。在提供的API中,相關的注冊函數有:

stageableOverloadedToData注冊:

defoverloaded(key : StageableKey):Data = {
internals.stageableOverloadedToData.getOrElseUpdate(key, ContextSwapper.outsideCondScope{
key.stageable()//.setCompositeName(this, s"${key}_overloaded")
})
}

stageableResultingToData注冊:

def resulting(key : StageableKey) : Data = {
internals.stageableResultingToData.getOrElseUpdate(key, ContextSwapper.outsideCondScope{
key.stageable()//.setCompositeName(this, s"${key}_overloaded")
})
}
def resulting[T <: Data](key : Stageable[T]) : T = {
????resulting(StageableKey(key.asInstanceOf[Stageable[Data]], null)).asInstanceOf[T]
??}
def resulting[T <: Data](key : Stageable[T], key2 : Any) : T = {
????resulting(StageableKey(key.asInstanceOf[Stageable[Data]], key2)).asInstanceOf[T]
}

字如其名,resulting可以理解為獲取Stageable的最終結果,而overload則是對數據的重載。不妨先來看看在pipeline中這兩種類型所起的作用:

在pipeline的build函數里,對于stageableResultingToData,其首先的處理方式代碼如下:

for(s <- stagesSet){
???for(key <- s.internals.stageableResultingToData.keys){
?????s.apply(key)
???}
}

這里對于每個stage中stageableResultingToData里所注冊的每種類型StageableKey,其都會調用Stage的apply函數將其注冊到StageableToData中,也就意味著如果前級也有該對應的StageableKey,那么在連接階段兩者是可以建立連接關系的。

隨后,在internal conntection階段,對于stageableResultingToData中的變量,采用的賦值邏輯為:

for((key, value) <-?s.internals.stageableResultingToData){
???value := s.internals.outputOf(key)
}

而outputOf的賦值邏輯為:

def outputOf(key : StageableKey) = stageableOverloadedToData.get(key) match {
caseSome(x) => x
caseNone => stageableToData(key)
}

可以看出,這里的處理方式為,如果該變量在stageableOverloadedToData中存在,那么會將stageableOverloadedToData中的值賦值驅動stageableResultingToData中對應的變量,否則將會從stageableToData中尋找對應的變量進行驅動(上一步已經將對應的StageableKey注冊進stageableToData中)。

》Show Me The Code

分析完了源代碼,上一個簡單的example:

caseclassTest3() extendsComponent{
val io=newBundle{
val data_in=slave(Flow(Vec(UInt(8bits),4)))
val data_out=master(Flow(UInt(8bits)))
}
noIoPrefix()
val A,B=Stageable(UInt(8bits))
val pip=newPipeline{
val stage0=newStage{
this.internals.input.valid:=io.data_in.valid
A:=io.data_in.payload(0)+io.data_in.payload(1)
B:=io.data_in.payload(2)+io.data_in.payload(3)
}
val stage1=newStage(Connection.M2S()){
io.data_out.payload:=resulting(A)+resulting(B)
io.data_out.valid:=this.internals.output.valid
}
}
pip.build()
}

在這個例子里,在stage1中僅用到了resulting語句。按前面所述,stage1中最終stageableResultingToData中會包含兩個變量,build階段也會向其stageableToData階段注冊兩個變量A、B:

6f1ef2ca-4fc0-11ee-a25d-92fbcf53809c.jpg

在這里,由于stage0中也包含A、B,故這里最終的驅動關系為:

6f38a990-4fc0-11ee-a25d-92fbcf53809c.jpg

再來看一個resulting和overlaoded共用的代碼:

caseclass Test4() extends Component{
val io=newBundle{
val data_in=slave(Flow(Vec(UInt(8bits),4)))
val data_out=master(Flow(UInt(8bits)))
}
noIoPrefix()
val A,B=Stageable(UInt(8bits))
val pip=newPipeline{
val stage0=newStage{
this.internals.input.valid:=io.data_in.valid
A:=io.data_in.payload(0)+io.data_in.payload(1)
B:=io.data_in.payload(2)+io.data_in.payload(3)
}
val stage1=newStage(Connection.M2S()){
io.data_out.payload:=resulting(A)+B
io.data_out.valid:=this.internals.output.valid
overloaded(A):=A+1
}
}
pip.build()
}

這里在stage1中對A調用了overloaded重載,結合上面的賦值順序,最終的驅動關系為:

6f4e3800-4fc0-11ee-a25d-92fbcf53809c.jpg

看到這里,可能會有一個疑問:為什么不能直接寫成A:=A+1的形式呢?主要在于A本身處于StageableToData,在進行Stage之間的連接時已經對齊進行賦值驅動,這里如果直接寫成A:=A+1相當于對電路進行重復驅動,從而導致報錯。

》總結

resulting&overloaded主要用于在某個Stage階段對電路在結合上一Stage基礎上需做一些額外判斷對該階段的相應電路做新的賦值驅動時進行處理。如在NaxRsicV中Cache里的一些電路處理:

overloaded(BANK_BUSY)(bankId) := BANK_BUSY(bankId) || bank.write.valid && REDO_ON_DATA_HAZARD

在流水線的某一階段在保持Stageable語義而不必新增Stageable情況下通過overlaoded、resulting來進行Stage內的電路對象驅動。






審核編輯:劉清

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 處理器
    +關注

    關注

    68

    文章

    18298

    瀏覽量

    222303
  • 驅動器
    +關注

    關注

    51

    文章

    7319

    瀏覽量

    143000
  • Pipeline
    +關注

    關注

    0

    文章

    27

    瀏覽量

    9294
  • HDL語言
    +關注

    關注

    0

    文章

    46

    瀏覽量

    8871
  • cache技術
    +關注

    關注

    0

    文章

    41

    瀏覽量

    986

原文標題:pipeline高端玩法(六)—resulting&overloaded

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

收藏 人收藏

    評論

    相關推薦

    spinalhdl轉Verilog可讀性 SpinalHDL開發流程

    SpinalHDL是基于Scala全新的硬件描述語言,解決了不少Verilog等傳統HDL語言的痛點,可以快速的完成某些IP的開發,和完美的融入現有的開發流程。 誠然SpinalHDL的學習路線
    的頭像 發表于 07-27 09:29 ?870次閱讀
    <b class='flag-5'>spinalhdl</b>轉Verilog可讀性 <b class='flag-5'>SpinalHDL</b>開發流程

    SpinalHDLswitch方法有何用處呢

    ,當我們需要根據tkeep信號來計算這一拍有多少有效數據時這里的代碼會是什么樣子……這種代碼寫的手有點兒累(又沒啥技術含量)……在SpinalHDL該如何做呢?switchSpinalHDL提供了
    發表于 06-22 14:25

    SpinalHDL實現優雅的添加待跟蹤波形信號

    在FPGA的開發過程中,在線抓取波形往往是終極調試大法。而如何抓取信號,相信做邏輯開發的小伙伴都是輕車熟路,張口就來,無非兩種方式嘛:待跟蹤信號添加原語或者手動例化Ila。而在SpinalHDL
    發表于 06-22 14:37

    SpinalHDL的設計中集成現有RTL設計(IP)的渠道——BlackBox

    接口及parameter參數(這也是我們在RTL例化IP時常用的)。我們來看SpinalHDL-doc給出的example:整個代碼做了三件事:參數聲明、端口聲明,時鐘域映射。參數聲明在上例中
    發表于 06-22 14:59

    談談SpinalHDL中StreamCCByToggle組件設計不足的地方

    StreamCCByToggle的原理,可參照前文所提到的文章,這里不再做過多贅述,小伙伴們也可以自行去閱讀SpinalHDL的源代碼。我們看下面的波形:    在剛開始dataIn發送了一個任務,導致
    發表于 06-30 15:11

    SpinalHDL中關于casez的使用

    Verilog代碼時還是很少會直接這么來寫的,往往通常采用casez來進行描述:那么在SpinalHDL中,我們是否也可以這么描述呢?SpinalHDL中的don't care像Verilog代碼中,casez
    發表于 07-06 10:59

    分享一個在SpinalHDLapply的有趣用法

    SpinalHDL和Chisel都是基于scala來實現的,而在SpinalHDL的example,偶然看到一個apply的有趣用法?!吧衿妗钡倪壿?"奇葩"的寫法偶然看到一
    發表于 07-19 15:08

    SpinalHDL是如何讓仿真跑起來的

    SpinalHDL,當我們的設計完成后如果說把生成的Verilog/SystemVerilog代碼用SystemVerilog來進行仿真驗證那真是一件痛苦的事情,而且對于SystemVerilog本身來講,在
    發表于 07-25 15:09

    如何在SpinalHDL啟動一個仿真

    前言在安裝完成Verilator、GtkWave后,我們即可在IDEA通過SpinalHDL提供的仿真接口來對我們的設計進行仿真。在《SpinalHDL—仿真環境》一文中已提到SpinalH
    發表于 07-26 16:59

    SpinalHDL有沒有什么好的方式實現一個接口位寬轉換呢

    下午微信群有個小伙伴問了這么一道題:將一個為UInt(128 bits)的Stream接口連接到一個UInt(32 bits)的StreamFiFo上,在SpinalHDL有沒有什么好的方式實現
    發表于 07-27 14:52

    SpinalHDL中的對應關系及聲明形式

    針對SpinalHDL中的兩大類型Reg、Wire,來梳理下在SpinalHDL中的對應關系及聲明形式。
    的頭像 發表于 07-03 11:02 ?1158次閱讀

    SpinalHDL里如何實現Sobel邊緣檢測

    書接上文,趁著今天休假,采用SpinalHDL做一個小的demo,看看在SpinalHDL里如何優雅的實現Sobel邊緣檢測。
    的頭像 發表于 08-26 08:59 ?1019次閱讀

    SpinalHDLpipeline的設計思路

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

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

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

    淺析SpinalHDLPipeline中的復位定制

    之前有系列文章介紹了SpinalHDLPipeline的使用,最近在一個功能模塊中真實的使用了這個lib。
    的頭像 發表于 03-17 17:31 ?563次閱讀
    淺析<b class='flag-5'>SpinalHDL</b>中<b class='flag-5'>Pipeline</b>中的復位定制
    亚洲欧美日韩精品久久_久久精品AⅤ无码中文_日本中文字幕有码在线播放_亚洲视频高清不卡在线观看
    <acronym id="s8ci2"><small id="s8ci2"></small></acronym>
    <rt id="s8ci2"></rt><rt id="s8ci2"><optgroup id="s8ci2"></optgroup></rt>
    <acronym id="s8ci2"></acronym>
    <acronym id="s8ci2"><center id="s8ci2"></center></acronym>