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

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

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

來看看Pipeline中的flush操作

Spinal FPGA ? 來源:Spinal FPGA ? 2023-09-24 14:17 ? 次閱讀

編 者 按

來看看Pipeline中的flush操作

flush


在Stage中,對于Flush有提供這兩個函數(shù):

defflushIt(): Unit = flushIt(ConditionalContext.isTrue)
defflushIt(cond : Bool, root : Boolean = true): Unit = {
internals.request.flush += cond
if(root) internals.request.flushRoot += cond
}

可以看出,調(diào)用flush函數(shù),會牽涉到internals.request中的fulsh以及flushRoot兩個元素:

val flush = ArrayBuffer[Bool]()
val flushRoot = ArrayBuffer[Bool]()

那么來分別看下這兩個元素在Pipeline的build函數(shù)中都起了什么作用。

在build函數(shù)中,對于處于pipeline中沒有驅(qū)動其他Stage的Stage,會調(diào)用propagateRequirements函數(shù):

for(end<- connectionsWithoutSinks){
??propagateRequirements(end)
}

同時,build函數(shù)中有定義:

val clFlush = mutable.LinkedHashMap[ConnectionLogic, Bool]()

在函數(shù)propagateRequirements中:

var flush= stage.internals.request.flush.nonEmpty generate orR(stage.internals.request.flush)

也就意味著如果當前stage中若flush非空,則會將flush中的所有信號進行或操作得到一個flush信號。

(stage.internals.arbitration.isFlushed, flush) match {
case(null, null) =>
case(x, null) =>stage.isFlushed := False
case(_, x) =>stage.isFlushed := flush
}

若flush非空,那么就會驅(qū)動賦值給stage中的internals.arbitration.

isFlushed。

defisFlushed:Bool = {
if(internals.arbitration.isFlushed == null) internals.arbitration.isFlushed = ContextSwapper.outsideCondScope(Bool())
internals.arbitration.isFlushed
}

對于驅(qū)動當前stage的Connection Logic,也會對flush有進行檢測

c.logics.reverseIterator.foreach{ l =>
clFlush(l) = flush
clFlushNext(l) = flushNext
clFlushNextHit(l) = null
if(flushNext != null){
clFlushNextHit(l) = Bool()
flush = flush match {
casenull=> clFlushNext(l) && clFlushNextHit(l)
case_ => flush || clFlushNext(l) && clFlushNextHit(l)
}
flushNext = l.alwasContainsSlaveToken match {
casetrue=> null
casefalse=> clFlushNext(l) && !clFlushNextHit(l)
}
}
if(flush != null) c.m.flushIt(flush, false)
if(flushNext != null) c.m.flushNext(flushNext)
clThrowOne(l) = throwOne
clThrowOneHit(l) = null
if(throwOne != null){
clThrowOneHit(l) = Bool()
throwOne = l.alwasContainsSlaveToken match {
casetrue=> null
casefalse=> clThrowOne(l) && !clThrowOneHit(l)
}
}
}

我們著重關(guān)注和flush相關(guān)的邏輯。首先會講flush注冊到驅(qū)動當前Stage的Conntection Logic中的clFlush中:

clFlush(l) = flush

此處flushNext我們先不用管,為null。而flush為非空,故對于驅(qū)動當前Stage的master側(cè)Stage,會調(diào)用其flush函數(shù)以flush為變量為其注冊flush動作(注意,root參數(shù)傳輸?shù)臑閒alse)。也就具備了前向傳播的特性:

c.m.flushIt(flush, false)

隨后通過遞歸,flush動作也就回一直向前傳播:

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

在每一級的Stage關(guān)系里,默認情況下:

s.output.valid := s.input.valid

而當flushRoot非空時,則會:

if(s.internals.request.flushRoot.nonEmpty) s.output.validclearWhen(s.internals.arbitration.isFlushingRoot)

也就意味著output.valid會立即清空。

而在處理InterConnection時,會用到上面的clFlush:

valarea = l.on(m, s, clFlush(l), clFlushNext(l), clFlushNextHit(l), clThrowOne(l), clThrowOneHit(l))

我們以M2S為例,其中定義了:

if (flush!= null&& !flushPreserveInput) s.valid clearWhen(flush)

s.valid為寄存器,也就意味著當flush為true時,s.valid將會在下一拍驅(qū)動為0,即下一級的Stage的input.valid將會在下一拍清零。

功能總結(jié)

結(jié)合Pipeline中的源代碼,可以總結(jié)下flushIt的作用。

調(diào)用flushIt函數(shù),會想request.flush中添加cond,若root 為true,則會向request.flushRoot中同時添加cond。

request.flush作用:

對StageN調(diào)用flushIt,在pipeline.build函數(shù)中會向其所有的前級Stage中同樣添加調(diào)用相應(yīng)的flushIt函數(shù)(root為false)

request.flush主要在conntecion Logic中起作用,用于清除s.valid,即下一級的input.valid。

request.flushRoot的作用:

request.flushRoot用于清除當前級的output.valid

默認情況下,每一級的output.valid:=input.valid

當flushRoot.orR為True時,會立即清除當前Stage的output.valid

flushRoot中的元素并不會向前級傳輸

flushRoot的作用區(qū)分:

當在StageN調(diào)用flushIt時如果希望cond為true時下一拍不希望Stage(N+1)input.valid拉起,則需將root設(shè)置為true。否則因為output.valid:=input.valid,stageN的output.valid會驅(qū)動下一級的input.valid為True(之所以前向傳輸調(diào)用flushIt時root=false,原因在于flush會作用于Connection Logic確保下一拍valid清零)。

example

給一個簡單的example:

caseclassTest5() extendsComponent{
val io=newBundle{
val data_in=slave(Flow(UInt(8bits)))
val data_out=master(Flow(UInt(8bits)))
val cond=inBool()
}
noIoPrefix()
val A=Stageable(UInt(8bits))
val pip=newPipeline{
val stage0=newStage{
internals.input.valid:=io.data_in.valid
A:=io.data_in.payload
}
val stage1=newStage(Connection.M2S()){}
val stage2=newStage(Connection.M2S()){
io.data_out.valid:=internals.output.valid
io.data_out.payload:=A
this.flushIt(io.cond)
}
}
}

這里在stage2調(diào)用flushIt函數(shù),當io.cond為true時,整個流水線都將會清空。而由于root默認為true,故io.cond為true時,io.data_out.valid會立即為0,即等效于:

io.data_out.valid:=internals.output.valid&(~io.cond)

如果root設(shè)置為false,那么io.cond為true時io.data_out.valid仍可能為True。

審核編輯:湯梓紅

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

    關(guān)注

    3

    文章

    4238

    瀏覽量

    61976
  • Pipeline
    +關(guān)注

    關(guān)注

    0

    文章

    28

    瀏覽量

    9321
  • FLUSH
    +關(guān)注

    關(guān)注

    0

    文章

    4

    瀏覽量

    5413

原文標題:pipeline高端玩法(七)—flush

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

收藏 人收藏

    評論

    相關(guān)推薦

    很熱鬧,常來看看!

    很熱鬧,常來看看!
    發(fā)表于 02-15 14:39

    天天來看看~~~

    天天來看看~~~
    發(fā)表于 12-15 16:42

    每天上來看看

    每天上來看看挺好,
    發(fā)表于 12-22 22:53

    來看看怎么樣 下來看看怎么樣 下來看看怎么樣

    來看看怎么樣下來看看怎么樣下來看看怎么樣下來看看怎么樣下來看看怎么樣[table=98%][tr][td]下
    發(fā)表于 05-13 19:01

    來看看怎么樣 下來看看怎么樣 下來看看怎么樣

    來看看怎么樣下來看看怎么樣下來看看怎么樣下來看看怎么樣下來看看怎么樣[table=98%][tr][td]下
    發(fā)表于 05-13 19:03

    小編推薦資料包,需要的來看看

    資料包,需要的來看看
    發(fā)表于 01-17 18:40

    好久沒來了,來看看

    好久沒來了,來看看。
    發(fā)表于 03-09 16:05

    求助,能否在一個pipeline添加多個音頻輸入流?

    能否在一個pipeline添加多個音頻輸入流[,例如httpstream flash_tone_stream,因為音頻的輸入方向有兩個?;蛘吣芊襁M行pipeline的時間復(fù)用,覺得設(shè)置兩個播放的
    發(fā)表于 03-10 08:09

    FLUSH SILHOUETTE LW系列控制元器件

    FLUSH SILHOUETTE LW系列控制元器件
    發(fā)表于 08-11 12:12 ?28次下載

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

    導熱凝膠的特色有哪些,來看看

    導熱凝膠的特色有哪些,來看看,15年行業(yè)老經(jīng)驗共享
    的頭像 發(fā)表于 03-07 17:12 ?2983次閱讀
    導熱凝膠的特色有哪些,<b class='flag-5'>來看看</b>

    PipelinethrowIt的用法

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

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

    本文介紹了在 Go 構(gòu)建流數(shù)據(jù)pipeline的技術(shù)。 處理此類pipeline的故障很棘手,因為pipeline
    的頭像 發(fā)表于 03-11 10:16 ?445次閱讀

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

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