0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

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

冬至子 来源:Spinal FPGA 作者:玉骐 2023-11-24 16:57 次阅读

编 者 按

来看下Pipeline中HaltIt的用法

HaltIt

看名字,就基本能猜到这个函数的大体功能是流水线暂停。

在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最终所实现的都是往internals.request.halts中添加cond条件。那么就看下request.halts在Pipeline构建时所起的作用。

首先,在进行 connectionsWithoutSinks(没有驱动其他级Stage)往前遍历的函数propagateRequirements中:

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

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

  • stage.arbitration.propagateReady设置为true,即需向前级Stage传递Ready信号
  • 为本级创建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,如果驱动当前Stage的Master Stage的output.ready为空,那么这里就会确保Master Stage中具备input.ready以及output.ready,确保上级Stage具备这种握手机制。

而后在该函数中的递归调用:

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

这里如果当前stage如果存在stage.arbitration.propagateReady为true,那么也会设置其Master Stage的.arbitration.propagateReady为true,通过递归调用,确保整个链路上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信号将会统一拉低,从而暂停向下级传输。

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信号进行驱动,但output.ready信号是默认不会创建的,故这里显示创建internals.output.ready为Bool类型电路对象。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 驱动器
    +关注

    关注

    51

    文章

    7308

    浏览量

    142966
  • Pipeline
    +关注

    关注

    0

    文章

    27

    浏览量

    9294
收藏 人收藏

    评论

    相关推荐

    一览pipeline中所出现的五个基本要素

    stageable、StageableKey是最整个pipeline中的基本数据类型元素
    的头像 发表于 08-12 11:24 641次阅读
    一览<b class='flag-5'>pipeline</b>中所出现的五个基本要素

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

    在Stage里,有关flushNext提供的API有
    的头像 发表于 10-08 10:13 660次阅读
    <b class='flag-5'>pipeline</b><b class='flag-5'>高端</b><b class='flag-5'>玩法</b>—看下FlushNext的用法

    麦克纳姆轮驱动和玩法

    麦克纳姆轮(万向轮)驱动和玩法麦克纳姆轮介绍麦克纳姆轮运动分析及方向确定麦克纳姆轮安装组合及运动分析分析错误例子【AAAA】正确的麦轮分布应该是【ABBA】麦克纳姆轮的安装位置安装方法麦克纳姆轮介绍
    发表于 06-29 08:40

    Pipeline ADCs Come of Age

    Pipeline ADCs Come of Age Abstract: In the mid 1970s, a new data converter architecture
    发表于 04-16 16:21 977次阅读
    <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 991次阅读
    <b class='flag-5'>Pipeline</b> ADCs Come of Age

    手机投屏智能电视的N种玩法

    本视频主要详细介绍了手机投屏智能电视的N种玩法,分别是利用手机自带投屏功能、无线WiFi同屏器、USB转HDMI同屏线。
    的头像 发表于 04-02 15:32 9171次阅读

    关于pipeline 以及 unroll 指令的介绍

    HLS 优化设计的最关键指令有两个:一个是流水线 (pipeline) 指令,一个是数据流(dataflow) 指令。正确地使用好这两个指令能够增强算法地并行性,提升吞吐量,降低延迟但是需要遵循一定的代码风格。
    的头像 发表于 02-09 09:53 1977次阅读
    关于<b class='flag-5'>pipeline</b> 以及 unroll 指令的<b class='flag-5'>介绍</b>

    如何降低开发门槛助力音视频创新玩法

    、和华为AI技术专家Eric相聚直播间,深度解析了AV Pipeline Kit的技术要点和应用场景,助力广大音视频开发者以更轻松更高效的方式,为用户提供新玩法,新交互。 缘起:音视频开发面临诸多挑战
    的头像 发表于 09-28 10:26 1742次阅读

    修改V4L2的Video Pipeline的devicetree

    PetaLinux 能够根据Vivado的设计,自动生成V4L2的Video Pipeline的devicetree。但是它主要为Xilinx的VCU TRD服务,测试的组合比较少。很多时候,需要根据自己的工程,修改V4L2的Video Pipeline的devicetr
    的头像 发表于 08-02 08:03 1740次阅读
    修改V4L2的Video <b class='flag-5'>Pipeline</b>的devicetree

    SpinalHDL里pipeline的设计思路

    如果你曾看过VexRSICV的设计,对于从事逻辑设计的你会惊讶从未想过逻辑设计还能这么来做。针对VexRSICV所衍生出的pipeline Lib,该系列会对pipeline进行一次梳理。诚如之前一篇博客曾讲,这是“勇者的游戏”。
    的头像 发表于 08-16 15:11 713次阅读
    SpinalHDL里<b class='flag-5'>pipeline</b>的设计思路

    pipeline高端玩法之Stage里的隐式转换

    Scala里面的隐式转换的好处是灵活,坏处就是太灵活。
    的头像 发表于 08-19 10:45 380次阅读
    <b class='flag-5'>pipeline</b><b class='flag-5'>高端</b><b class='flag-5'>玩法</b>之Stage里的隐式转换

    Pipeline中throwIt的用法

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

    pipeline高端玩法—优先级介绍

    无论是SystemVerilog还是SpinalHDL,都有Last valid assignment wins的语法特征。如在SpinalHDL-Doc中所描述
    的头像 发表于 11-04 10:13 379次阅读
    <b class='flag-5'>pipeline</b><b class='flag-5'>高端</b><b class='flag-5'>玩法</b>—优先级<b class='flag-5'>介绍</b>

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

    本文介绍了在 Go 中构建流数据pipeline的技术。 处理此类pipeline中的故障很棘手,因为pipeline中的每个阶段可能会阻止尝试向下游发送值,并且下游阶段可能不再关心传
    的头像 发表于 03-11 10:16 160次阅读

    浅析SpinalHDL中Pipeline中的复位定制

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