chinese直男口爆体育生外卖, 99久久er热在这里只有精品99, 又色又爽又黄18禁美女裸身无遮挡, gogogo高清免费观看日本电视,私密按摩师高清版在线,人妻视频毛茸茸,91论坛 兴趣闲谈,欧美 亚洲 精品 8区,国产精品久久久久精品免费

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

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

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

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

Spinal FPGA ? 來(lái)源:Spinal FPGA ? 2023-09-11 09:47 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

今天來(lái)看下SpinalHDL Pipeline組件里的resulting及overloaded的使用

》resulting

在Stage中的數(shù)據(jù)結(jié)構(gòu)中,有四種類(lèi)型:

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

關(guān)于stageableToData,在之前的文章中已有介紹,今天來(lái)看下stageableOverloadedToData以及stageableResultingToData的作用。在提供的API中,相關(guān)的注冊(cè)函數(shù)有:

stageableOverloadedToData注冊(cè):

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

stageableResultingToData注冊(cè):

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的最終結(jié)果,而overload則是對(duì)數(shù)據(jù)的重載。不妨先來(lái)看看在pipeline中這兩種類(lèi)型所起的作用:

在pipeline的build函數(shù)里,對(duì)于stageableResultingToData,其首先的處理方式代碼如下:

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

這里對(duì)于每個(gè)stage中stageableResultingToData里所注冊(cè)的每種類(lèi)型StageableKey,其都會(huì)調(diào)用Stage的apply函數(shù)將其注冊(cè)到StageableToData中,也就意味著如果前級(jí)也有該對(duì)應(yīng)的StageableKey,那么在連接階段兩者是可以建立連接關(guān)系的。

隨后,在internal conntection階段,對(duì)于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中存在,那么會(huì)將stageableOverloadedToData中的值賦值驅(qū)動(dòng)stageableResultingToData中對(duì)應(yīng)的變量,否則將會(huì)從stageableToData中尋找對(duì)應(yīng)的變量進(jìn)行驅(qū)動(dòng)(上一步已經(jīng)將對(duì)應(yīng)的StageableKey注冊(cè)進(jìn)stageableToData中)。

》Show Me The Code

分析完了源代碼,上一個(gè)簡(jiǎn)單的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()
}

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

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

在這里,由于stage0中也包含A、B,故這里最終的驅(qū)動(dòng)關(guān)系為:

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

再來(lái)看一個(gè)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中對(duì)A調(diào)用了overloaded重載,結(jié)合上面的賦值順序,最終的驅(qū)動(dòng)關(guān)系為:

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

看到這里,可能會(huì)有一個(gè)疑問(wèn):為什么不能直接寫(xiě)成A:=A+1的形式呢?主要在于A本身處于StageableToData,在進(jìn)行Stage之間的連接時(shí)已經(jīng)對(duì)齊進(jìn)行賦值驅(qū)動(dòng),這里如果直接寫(xiě)成A:=A+1相當(dāng)于對(duì)電路進(jìn)行重復(fù)驅(qū)動(dòng),從而導(dǎo)致報(bào)錯(cuò)。

》總結(jié)

resulting&overloaded主要用于在某個(gè)Stage階段對(duì)電路在結(jié)合上一Stage基礎(chǔ)上需做一些額外判斷對(duì)該階段的相應(yīng)電路做新的賦值驅(qū)動(dòng)時(shí)進(jìn)行處理。如在NaxRsicV中Cache里的一些電路處理:

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

在流水線(xiàn)的某一階段在保持Stageable語(yǔ)義而不必新增Stageable情況下通過(guò)overlaoded、resulting來(lái)進(jìn)行Stage內(nèi)的電路對(duì)象驅(qū)動(dòng)。






審核編輯:劉清

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

    關(guān)注

    68

    文章

    20154

    瀏覽量

    247506
  • 驅(qū)動(dòng)器
    +關(guān)注

    關(guān)注

    54

    文章

    9026

    瀏覽量

    153475
  • Pipeline
    +關(guān)注

    關(guān)注

    0

    文章

    29

    瀏覽量

    9915
  • HDL語(yǔ)言
    +關(guān)注

    關(guān)注

    0

    文章

    48

    瀏覽量

    9315
  • cache技術(shù)
    +關(guān)注

    關(guān)注

    0

    文章

    41

    瀏覽量

    1329

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

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

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評(píng)論

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

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

    如果你曾看過(guò)VexRSICV的設(shè)計(jì),對(duì)于從事邏輯設(shè)計(jì)的你會(huì)驚訝從未想過(guò)邏輯設(shè)計(jì)還能這么來(lái)做。
    的頭像 發(fā)表于 08-12 11:22 ?2010次閱讀

    SpinalHDLswitch方法有何用處呢

    ,當(dāng)我們需要根據(jù)tkeep信號(hào)來(lái)計(jì)算這一拍有多少有效數(shù)據(jù)時(shí)這里的代碼會(huì)是什么樣子……這種代碼寫(xiě)的手有點(diǎn)兒累(又沒(méi)啥技術(shù)含量)……在SpinalHDL該如何做呢?switchSpinalHDL提供了
    發(fā)表于 06-22 14:25

    SpinalHDL實(shí)現(xiàn)優(yōu)雅的添加待跟蹤波形信號(hào)

    在FPGA的開(kāi)發(fā)過(guò)程中,在線(xiàn)抓取波形往往是終極調(diào)試大法。而如何抓取信號(hào),相信做邏輯開(kāi)發(fā)的小伙伴都是輕車(chē)熟路,張口就來(lái),無(wú)非兩種方式嘛:待跟蹤信號(hào)添加原語(yǔ)或者手動(dòng)例化Ila。而在SpinalHDL
    發(fā)表于 06-22 14:37

    談?wù)?b class='flag-5'>SpinalHDL中StreamCCByToggle組件設(shè)計(jì)不足的地方

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

    SpinalHDL中關(guān)于casez的使用

    Verilog代碼時(shí)還是很少會(huì)直接這么來(lái)寫(xiě)的,往往通常采用casez來(lái)進(jìn)行描述:那么在SpinalHDL中,我們是否也可以這么描述呢?SpinalHDL中的don't care像Verilog代碼中,casez
    發(fā)表于 07-06 10:59

    分享一個(gè)在SpinalHDLapply的有趣用法

    SpinalHDL和Chisel都是基于scala來(lái)實(shí)現(xiàn)的,而在SpinalHDL的example,偶然看到一個(gè)apply的有趣用法?!吧衿妗钡倪壿?"奇葩"的寫(xiě)法偶然看到一
    發(fā)表于 07-19 15:08

    SpinalHDL是如何讓仿真跑起來(lái)的

    SpinalHDL,當(dāng)我們的設(shè)計(jì)完成后如果說(shuō)把生成的Verilog/SystemVerilog代碼用SystemVerilog來(lái)進(jìn)行仿真驗(yàn)證那真是一件痛苦的事情,而且對(duì)于SystemVerilog本身來(lái)講,在
    發(fā)表于 07-25 15:09

    如何在SpinalHDL啟動(dòng)一個(gè)仿真

    前言在安裝完成Verilator、GtkWave后,我們即可在IDEA通過(guò)SpinalHDL提供的仿真接口來(lái)對(duì)我們的設(shè)計(jì)進(jìn)行仿真。在《SpinalHDL—仿真環(huán)境》一文中已提到SpinalH
    發(fā)表于 07-26 16:59

    SpinalHDL時(shí)鐘域中的定制與命名

    聊一聊在SpinalHDL時(shí)鐘域中時(shí)鐘的定制與命名。 相較于Verilog,在SpinalHDL,其對(duì)時(shí)鐘域有著更細(xì)致的描述,從而也能夠更精細(xì)的控制和描述。而對(duì)于時(shí)鐘域,我們往往關(guān)
    的頭像 發(fā)表于 03-22 10:14 ?2583次閱讀

    SpinalHDL用于跨時(shí)鐘域處理的一些手段方法

    每一個(gè)做數(shù)字邏輯的都繞不開(kāi)跨時(shí)鐘域處理,談一談SpinalHDL用于跨時(shí)鐘域處理的一些手段方法。
    的頭像 發(fā)表于 07-11 10:51 ?2654次閱讀

    SpinalHDL運(yùn)行VCS+Vivado相關(guān)仿真

    本篇文章來(lái)源于微信群中的網(wǎng)友,分享下在SpinalHDL如何絲滑的運(yùn)行VCS跑Vivado相關(guān)仿真。自此仿真設(shè)計(jì)一體化不是問(wèn)題。
    的頭像 發(fā)表于 08-10 09:15 ?3558次閱讀

    SpinalHDL如何實(shí)現(xiàn)Sobel邊緣檢測(cè)

    書(shū)接上文,趁著今天休假,采用SpinalHDL做一個(gè)小的demo,看看在SpinalHDL如何優(yōu)雅的實(shí)現(xiàn)Sobel邊緣檢測(cè)。
    的頭像 發(fā)表于 08-26 08:59 ?1840次閱讀

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

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

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

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

    淺析SpinalHDLPipeline中的復(fù)位定制

    之前有系列文章介紹了SpinalHDLPipeline的使用,最近在一個(gè)功能模塊中真實(shí)的使用了這個(gè)lib。
    的頭像 發(fā)表于 03-17 17:31 ?1695次閱讀
    淺析<b class='flag-5'>SpinalHDL</b>中<b class='flag-5'>Pipeline</b>中的復(fù)位定制