色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

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

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

3天內不再提示

來看看Pipeline中的flush操作

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

編 者 按

來看看Pipeline中的flush操作

flush


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

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

可以看出,調用flush函數,會牽涉到internals.request中的fulsh以及flushRoot兩個元素:

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

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

在build函數中,對于處于pipeline中沒有驅動其他Stage的Stage,會調用propagateRequirements函數:

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

同時,build函數中有定義:

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

在函數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非空,那么就會驅動賦值給stage中的internals.arbitration.

isFlushed。

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

對于驅動當前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)
}
}
}

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

clFlush(l) = flush

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

c.m.flushIt(flush, false)

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

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

在每一級的Stage關系里,默認情況下:

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將會在下一拍驅動為0,即下一級的Stage的input.valid將會在下一拍清零。

功能總結

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

調用flushIt函數,會想request.flush中添加cond,若root 為true,則會向request.flushRoot中同時添加cond。

request.flush作用:

對StageN調用flushIt,在pipeline.build函數中會向其所有的前級Stage中同樣添加調用相應的flushIt函數(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的作用區分:

當在StageN調用flushIt時如果希望cond為true時下一拍不希望Stage(N+1)input.valid拉起,則需將root設置為true。否則因為output.valid:=input.valid,stageN的output.valid會驅動下一級的input.valid為True(之所以前向傳輸調用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調用flushIt函數,當io.cond為true時,整個流水線都將會清空。而由于root默認為true,故io.cond為true時,io.data_out.valid會立即為0,即等效于:

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

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

審核編輯:湯梓紅

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

    關注

    3

    文章

    4327

    瀏覽量

    62573
  • Pipeline
    +關注

    關注

    0

    文章

    28

    瀏覽量

    9361
  • FLUSH
    +關注

    關注

    0

    文章

    4

    瀏覽量

    5426

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

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

收藏 人收藏

    評論

    相關推薦

    很熱鬧,常來看看!

    很熱鬧,常來看看
    發表于 02-15 14:39

    天天來看看~~~

    天天來看看~~~
    發表于 12-15 16:42

    每天上來看看

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

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

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

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

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

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

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

    好久沒來了,來看看

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

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

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

    FLUSH SILHOUETTE LW系列控制元器件

    FLUSH SILHOUETTE LW系列控制元器件
    發表于 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
    發表于 04-16 16:21 ?1113次閱讀
    <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
    發表于 04-25 10:22 ?1086次閱讀
    <b class='flag-5'>Pipeline</b> ADCs Come of Age

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

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

    PipelinethrowIt的用法

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

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

    本文介紹了在 Go 構建流數據pipeline的技術。 處理此類pipeline的故障很棘手,因為pipeline
    的頭像 發表于 03-11 10:16 ?600次閱讀

    淺析SpinalHDLPipeline的復位定制

    之前有系列文章介紹了SpinalHDLPipeline的使用,最近在一個功能模塊真實的使用了這個lib。
    的頭像 發表于 03-17 17:31 ?1036次閱讀
    淺析SpinalHDL<b class='flag-5'>中</b><b class='flag-5'>Pipeline</b><b class='flag-5'>中</b>的復位定制
    主站蜘蛛池模板: 一受n攻高h全肉np| 亚洲天堂久久久| 国产GV天堂亚洲国产GV刚刚碰| 日本xxx护士与黑人| 闺蜜撬开我的腿用黄瓜折磨我| 亚洲综合色五月久久婷婷| 久久偷拍人| jiizzyou欧美喷液| 摥管专用动态图399期| 国产啪精品视频网免费| 亚洲色图另类小说| 日韩精品欧美在线视频在线| 国产系列视频二区| 最近的中文字幕2019国语| 人人射人人爱| 麻生希第一部快播| 国产MD视频一区二区三区| 亚洲中文字幕无码一去台湾 | 小小水蜜桃视频高清在线观看免费| 国语自产偷成人精品视频| 2020亚洲 欧美 国产 日韩| 清冷受被CAO的合不拢| 国产永久免费观看视频软件| 97视频在线观看免费视频| 双性精跪趴灌满h室友4p| 久久99re6热在线播放| music radio在线收听| 亚洲免费久久| 全黄H全肉细节文NP| 免费高清国产| 国内精品久久| 国产精品自产拍在线观看中文| 69精品人妻一区二区三区蜜桃| 一久久| 亚洲黄色免费观看| 欧美一级成人影院免费的| 精品久久久久中文字幕| 成人精品在线视频| 中国xxxxxxxxx孕交| 无套内射CHINESEHD| 夫妻性姿势真人做视频|