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

    文章

    4331

    浏览量

    62604
  • Pipeline
    +关注

    关注

    0

    文章

    28

    浏览量

    9365
  • FLUSH
    +关注

    关注

    0

    文章

    4

    浏览量

    5433

原文标题: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,因为音频的输入方向有两个。或者能否进行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 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
    发表于 04-25 10:22 1087次阅读
    <b class='flag-5'>Pipeline</b> ADCs Come of Age

    导热凝胶的特色有哪些,来看看

    导热凝胶的特色有哪些,来看看,15年行业老经验共享
    的头像 发表于 03-07 17:12 3120次阅读
    导热凝胶的特色有哪些,<b class='flag-5'>来看看</b>

    PipelinethrowIt的用法

    字如其名,来看PipelinethrowIt的用法,是怎么个丢弃方式。
    的头像 发表于 10-21 16:24 559次阅读
    <b class='flag-5'>Pipeline</b><b class='flag-5'>中</b>throwIt的用法

    什么是pipeline?Go构建流数据pipeline的技术

    本文介绍了在 Go 构建流数据pipeline的技术。 处理此类pipeline的故障很棘手,因为pipeline
    的头像 发表于 03-11 10:16 613次阅读

    浅析SpinalHDLPipeline的复位定制

    之前有系列文章介绍了SpinalHDLPipeline的使用,最近在一个功能模块真实的使用了这个lib。
    的头像 发表于 03-17 17:31 1043次阅读
    浅析SpinalHDL<b class='flag-5'>中</b><b class='flag-5'>Pipeline</b><b class='flag-5'>中</b>的复位定制