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

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

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

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

冬至子 ? 來源:Spinal FPGA ? 作者:玉騏 ? 2023-11-24 16:57 ? 次閱讀

編 者 按

來看下Pipeline中HaltIt的用法

HaltIt

看名字,就基本能猜到這個函數(shù)的大體功能是流水線暫停。

在Stage中,流水線暫停提供了這么幾個API:

def haltIt()(implicit loc: Location) : Unit = haltIt(ConditionalContext.isTrue)def haltIt(cond : Bool)(implicit loc: Location) : Unit = internals.request.halts += nameFromLocation(CombInit(cond), "haltRequest")def haltWhen(cond : Bool)(implicit loc: Location) : Unit = haltIt(cond)

三個API最終所實現(xiàn)的都是往internals.request.halts中添加cond條件。那么就看下request.halts在Pipeline構(gòu)建時所起的作用。

首先,在進行 connectionsWithoutSinks(沒有驅(qū)動其他級Stage)往前遍歷的函數(shù)propagateRequirements中:

if(stage.request.halts.nonEmpty){    stage.arbitration.propagateReady = true    stage.isReady //Force creation}

可以看到,如果stage中的internals.request.halts非空,這里做了兩件事:

  • stage.arbitration.propagateReady設(shè)置為true,即需向前級Stage傳遞Ready信號
  • 為本級創(chuàng)建input.ready信號

隨后在propagateRequirements中的代碼片段:

stageDriver.get(stage) match {        case Some(c : ConnectionModel) = > {          if(c.s.arbitration.propagateReady && c.m.output.ready == null){            c.m.output.ready = Bool()            if(c.m.input.ready == null){              c.m.input.ready = Bool()            }          }

這里在處理當前Stage中的ConnectionLogic時,因為當前stage.arbitration.propagateReady為true,如果驅(qū)動當前Stage的Master Stage的output.ready為空,那么這里就會確保Master Stage中具備input.ready以及output.ready,確保上級Stage具備這種握手機制。

而后在該函數(shù)中的遞歸調(diào)用:

for(m < - stageMasters(stage)){    if(stage.internals.arbitration.propagateReady) m.internals.arbitration.propagateReady = true    propagateRequirements(m)}

這里如果當前stage如果存在stage.arbitration.propagateReady為true,那么也會設(shè)置其Master Stage的.arbitration.propagateReady為true,通過遞歸調(diào)用,確保整個鏈路上ready信號一直向前傳播,即確保反壓一路到底。

最后,在處理Stage Internal Connection階段時:

if(s.request.halts.nonEmpty){    val doHalt = s.request.halts.orR    when(doHalt){        s.input.ready := False        s.output.valid := False    }}

如果當前Stage中request.halts中條件滿足,那么當前stage中的output.valid,input.ready信號將會統(tǒng)一拉低,從而暫停向下級傳輸。

Example

case class Test8() extends Component{  val io=new  Bundle{    val data_in=slave(Stream(UInt(8 bits)))    val data_out=master(Stream(UInt(8 bits)))    val cond=in Bool()  }  noIoPrefix()  val A=Stageable(UInt(8 bits))  val pip=new Pipeline{    val stage0=new Stage{      this.driveFrom(io.data_in)      A:=io.data_in.payload    }    val stage1=new Stage(Connection.M2S()){    }    val stage2=new Stage(Connection.M2S()){      io.data_out.valid:=this.internals.output.valid      io.data_out.payload:=A      internals.output.ready=Bool()      this.haltIt(io.cond)      internals.output.ready:=io.data_out.ready      this.internals.arbitration.propagateReady=true    }  }  pip.build()}

這里給出了一個haltIt的example。在staeg2階段,如果cond為true,那么則流水線暫停。

這里需注意的是這里將stage2的output.ready由io.data_out.ready信號進行驅(qū)動,但output.ready信號是默認不會創(chuàng)建的,故這里顯示創(chuàng)建internals.output.ready為Bool類型電路對象。

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

    關(guān)注

    52

    文章

    8236

    瀏覽量

    146369
  • Pipeline
    +關(guān)注

    關(guān)注

    0

    文章

    28

    瀏覽量

    9367
收藏 人收藏

    評論

    相關(guān)推薦

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

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

    麥克納姆輪驅(qū)動和玩法

    麥克納姆輪(萬向輪)驅(qū)動和玩法麥克納姆輪介紹麥克納姆輪運動分析及方向確定麥克納姆輪安裝組合及運動分析分析錯誤例子【AAAA】正確的麥輪分布應(yīng)該是【ABBA】麥克納姆輪的安裝位置安裝方法麥克納姆輪介紹
    發(fā)表于 06-29 08:40

    Pipeline ADCs Come of Age

    Pipeline ADCs Come of Age Abstract: In the mid 1970s, a new data converter architecture
    發(fā)表于 04-16 16:21 ?1120次閱讀
    <b class='flag-5'>Pipeline</b> ADCs Come of Age

    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 ?1088次閱讀
    <b class='flag-5'>Pipeline</b> ADCs Come of Age

    流水線模數(shù)轉(zhuǎn)換器的時代-Pipeline ADCs Come

    and mixed-signal community, called pipeline ADCs. The following article takes the knowledge of advantages and disadvantages of the pipeline
    發(fā)表于 05-01 10:57 ?1020次閱讀
    流水線模數(shù)轉(zhuǎn)換器的時代-<b class='flag-5'>Pipeline</b> ADCs Come

    號牧場APP系統(tǒng)開發(fā)介紹

    、號牧場玩法介紹如下:(1)注冊、下載可以獲得一只黃金雞(2)現(xiàn)在買黃金雞買一送一,每個賬號僅限購買一次。(3)一只雞每天產(chǎn)一個雞蛋,1個雞蛋0.65元-1.5元。二、號牧場有以下
    發(fā)表于 03-28 16:44 ?485次閱讀

    關(guān)于pipeline 以及 unroll 指令的介紹

    HLS 優(yōu)化設(shè)計的最關(guān)鍵指令有兩個:一個是流水線 (pipeline) 指令,一個是數(shù)據(jù)流(dataflow) 指令。正確地使用好這兩個指令能夠增強算法地并行性,提升吞吐量,降低延遲但是需要遵循一定的代碼風格。
    的頭像 發(fā)表于 02-09 09:53 ?2487次閱讀
    關(guān)于<b class='flag-5'>pipeline</b> 以及 unroll 指令的<b class='flag-5'>介紹</b>

    如何降低開發(fā)門檻助力音視頻創(chuàng)新玩法

    、和華為AI技術(shù)專家Eric相聚直播間,深度解析了AV Pipeline Kit的技術(shù)要點和應(yīng)用場景,助力廣大音視頻開發(fā)者以更輕松更高效的方式,為用戶提供新玩法,新交互。 緣起:音視頻開發(fā)面臨諸多挑戰(zhàn)
    的頭像 發(fā)表于 09-28 10:26 ?1918次閱讀

    修改V4L2的Video Pipeline的devicetree

    PetaLinux 能夠根據(jù)Vivado的設(shè)計,自動生成V4L2的Video Pipeline的devicetree。但是它主要為Xilinx的VCU TRD服務(wù),測試的組合比較少。很多時候,需要根據(jù)自己的工程,修改V4L2的Video Pipeline的devicetr
    的頭像 發(fā)表于 08-02 08:03 ?2098次閱讀
    修改V4L2的Video <b class='flag-5'>Pipeline</b>的devicetree

    SpinalHDL里pipeline的設(shè)計思路

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

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

    Scala里面的隱式轉(zhuǎn)換的好處是靈活,壞處就是太靈活。
    的頭像 發(fā)表于 08-19 10:45 ?671次閱讀
    <b class='flag-5'>pipeline</b><b class='flag-5'>高端</b><b class='flag-5'>玩法</b>之Stage里的隱式轉(zhuǎn)換

    Pipeline中throwIt的用法

    字如其名,來看下Pipeline中throwIt的用法,是怎么個丟棄方式。
    的頭像 發(fā)表于 10-21 16:24 ?560次閱讀
    <b class='flag-5'>Pipeline</b>中throwIt的用法

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

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

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

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

    淺析SpinalHDL中Pipeline中的復位定制

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