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

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

3天内不再提示

扒一扒pipeline中“spawn”的用法

Spinal FPGA 来源:Spinal FPGA 2023-10-29 09:57 次阅读

》spawn

在Stage中,关于spawn,定义了下面的两个API

defspawnIt()(implicit loc: Location):Unit = spawnIt(ConditionalContext.isTrue)
defspawnIt(cond : Bool)(implicit loc: Location):Unit = internals.request.spawns += nameFromLocation(CombInit(cond), "spawnRequest")

spawn的调用,最终会把触发条件cond存储至internals.request.spawns中去。

而在Pipeline中,internal.request.spawns仅使用在了Internal Connection中:

//Internal connections
for(s <- stagesSet){
      s.output.valid := s.input.valid

      if(s.request.spawns.nonEmpty){
        when(s.request.spawns.orR){
          s.output.valid := True
        }
      }

可以看到,对于Stage内部,若果spawns非空,则spawns中只要有一个条件成立那么其output.valid即会设置为True,相当于对output.valid进行了扩展多个时钟周期。

值得注意的是,其仅对valid进行了扩展,而并没有处理input.ready信号

看到这里,对于spawnIt的用法诸君应该能大体看明白,其就是为了对Stage中的output.valid进行延展。

》example

由于spawnIt并没有对input.ready进行处理,故如果pipeline中如果有ready信号时使用需谨慎,这里给出一个pipeline中不使用ready的example:

caseclass SpawnTest() extends Component{
val io=newBundle{
val data_in= slave (Flow(UInt(8bits)))
val data_out= master(Flow(UInt(8bits)))
}
noIoPrefix()
val cycle_num=Stageable(UInt(8bits))
val pip=newPipeline{
val stage0=newStage{
importinternals._
input.valid:=io.data_in.valid
cycle_num:=io.data_in.payload
}
val stage1=newStage(Connection.M2S()){}
val stage2=newStage(Connection.M2S()){
io.data_out.valid:=internals.output.valid
val cycle_cnt=Reg(UInt(8bits)) init(0)
when(internals.input.valid){
cycle_cnt:=(cycle_num===1)?cycle_cnt|(cycle_num-1)
io.data_out.payload:=cycle_num
}otherwise{
cycle_cnt:= (cycle_cnt.orR)? (cycle_cnt-1)|cycle_cnt
io.data_out.payload:=cycle_cnt
}
spawnIt(cycle_cnt=/=0)
}
}
pip.build()
}

这个例子中pipeline存在三个Stage,对于data_in,在stage2中会对根据data_in.payload的值展开相应的拍数(两个data_in有效数据确保有足够的间隔),示例波形如下:

9ee4cc4c-7567-11ee-939d-92fbcf53809c.jpg

9efa702e-7567-11ee-939d-92fbcf53809c.jpg

9efeebd6-7567-11ee-939d-92fbcf53809c.jpg

可以看到,当data_in_payload为1时,data_out_payload输出一拍,数据为1.当data_in_payload为2时,data_out_payload输出两拍,数据分别为2,1.当data_in_payload为3时,data_out_payload输出三拍,数据分别为1,2,3.实现data_in.valid的扩展。

附上仿真代码:

importspinal.core.sim._
object SpawnTestSim extends App{
SimConfig.withFstWave.compile(SpawnTest()).doSim{dut=>
dut.io.data_in.valid#=false
dut.clockDomain.forkStimulus(10)
dut.clockDomain.waitSampling(10)
dut.io.data_in.valid#=true
dut.io.data_in.payload#=1
dut.clockDomain.waitSampling()
dut.io.data_in.valid#=false
for(index<-0 until 10){
      dut.io.data_in.payload#=index
      dut.clockDomain.waitSampling()
    }
    dut.io.data_in.valid#=true
    dut.io.data_in.payload#=2
    dut.clockDomain.waitSampling()
    dut.io.data_in.valid#=false
    for(index<-0 until 10){
      dut.io.data_in.payload#=index
      dut.clockDomain.waitSampling()
    }
    dut.io.data_in.valid#=true
    dut.io.data_in.payload#=3
    dut.clockDomain.waitSampling()
    dut.io.data_in.valid#=false
    for(index<-0 until 10){
      dut.io.data_in.payload#=index
      dut.clockDomain.waitSampling()
    }

  }
}






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

    关注

    38

    文章

    7154

    浏览量

    162092
  • 仿真器
    +关注

    关注

    14

    文章

    988

    浏览量

    83019
  • Pipeline
    +关注

    关注

    0

    文章

    27

    浏览量

    9295

原文标题:pipeline高端玩法(十一)—spawnIt

文章出处:【微信号:Spinal FPGA,微信公众号:Spinal FPGA】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    变压器铭牌之额定电压

    变压器电路
    学习电子知识
    发布于 :2023年07月26日 20:32:36

    变压器铭牌之连接组别

    变压器电路
    学习电子知识
    发布于 :2023年07月26日 20:33:02

    资深工程师设计案例: 运算放大器

    0的问题严重状况的表现。般这个值越小OP放大器越好。因为考虑到OP放大器增益都很高,很小的失调电压都可能造成很大的输出,这个在高精度应用是不能容忍的,必须要调整或者更换芯片。  3,温漂。这个不说
    发表于 10-17 19:49

    与无线网络相关的那些事

    ,体验上网带来的愉悦(ps:天下没有免费的午餐,认证登陆界面的广告以及商户提供产品内容,也能接受这样的广告植入形式)在上菜时,而不是先吃而是拍照片发微博\微信到朋友圈内,这也间接的为商户进行口碑宣传。你与无线网络都有哪些趣
    发表于 05-27 11:40

    【NXP LPC54114试用体验】首次使用LPC单片机-它的特点

    首次使用LPC单片机---东方青首先,非常感谢电子发烧友给的试用机会,得到了LPC54114板卡的试用。因为这是我第次使用NXP的MCU,所以还是先了解其特点,再进行其他的开发。LPC5114
    发表于 08-10 23:07

    求解泡沫检测电路原理

    单位发酵车间泡沫检测电路板总出现故障,我下来个电路图,哪个大神给我讲解下什么原理?没太看明白觉得op07cp放大器这是个什么用法
    发表于 11-17 09:28

    我看过的那些Linux相关的书籍

    来北京工作已经个多月,大都市的生活比起读大学要忙碌得多,尤其是出行,基本以小时为基本的计时单位。有时茫然看着窗外车水马龙,会有些迷茫自己选择的是对还是错。  题外话不多说,回归这次的主题,
    发表于 07-04 06:39

    求助:为何ni maxvisa的option里无tulip.dll选项

    勾选。但是在max软件中直未曾找到。其中pc:win10,labview:2014,visa:17.6,max:17.0,488.2:17.0官网下来的图
    发表于 07-23 00:11

    Scopy示波器怎么操作

    Scopy示波器的各部分构造、功能及其简单操作。
    发表于 07-30 07:27

    智能手机怎么自动修复背部细小刮痕?

    LG 近来公布的旗下首款曲面柔性屏幕智能手机 —— G Flex 可谓非常吸引眼球,特别是官方声称的 “可以自动修复背部细小刮痕” 的功能更是引人猜想,既然各位有兴趣,那么就请各位与小编起来
    发表于 08-26 07:07

    渣机产品有哪些参数

     铣挖机履带式挖掘装载机(俗名:渣机)是种连续生产的高效率出矿设备,主要用于矿山岩巷、半煤岩巷掘进,也可以用于引水洞、铁路隧道施工和国防洞窟施工的装载作业,渣机与我公司生产的煤
    发表于 09-02 08:00

    C语言hello world背后的内幕

    行时,它在内存是什么样子的?程序的执行入口为什么是 main 函数?可执行文件的内部结构是怎么样的?闲话少说,让我们进入正题, hello world 背后的内幕。注:本文是在
    发表于 09-30 10:31

    求助,能否在pipeline添加多个音频输入流?

    能否在pipeline添加多个音频输入流[,例如httpstream flash_tone_stream,因为音频的输入方向有两个。或者能否进行pipeline的时间复用,觉得设
    发表于 03-10 08:09

    Pipeline中throwIt的用法

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

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

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