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

    文章

    7534

    浏览量

    164486
  • 仿真器
    +关注

    关注

    14

    文章

    1019

    浏览量

    83983
  • Pipeline
    +关注

    关注

    0

    文章

    28

    浏览量

    9392

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

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

收藏 人收藏

    评论

    相关推荐

    与无线网络相关的那些事

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

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

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

    渣机产品有哪些参数

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

    C语言hello world背后的内幕

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

    华为P10这么早被光,目的只有个!怼肛小米6

    按照华为P系列的迭代速度每年新机发布般都在4月10号左右,并且发布地般都会选择欧洲,过去都是在英国,可是现在英国已经脱欧了,华为P10会在哪里发布呢?发布地不重要,重要的是华为P10近几天已经快让底裤都给光了。
    发表于 01-23 14:10 1767次阅读

    美容仪哪个牌子好?来令人眼花缭乱的日本美容仪

    获得了大众的喜爱。美容仪哪个牌子好?小编给你日本的美容仪神器品牌。 我们都知道,日本是个科技大国,不管是电器类还是美容仪类,都收获了世界大批粉丝的追捧,市面上的美容仪品牌多种多样,价格相差也大,各大美容仪从洗脸到瘦脸
    发表于 04-16 19:50 9882次阅读
    美容仪哪个牌子好?来<b class='flag-5'>扒</b><b class='flag-5'>一</b><b class='flag-5'>扒</b>令人眼花缭乱的日本美容仪

    好用的日本家用美容仪品牌,让你享受清洁肌肤的乐趣

    了,很多人都愿意尝试美容仪带来的护肤体验。美容仪真的有用吗?它的价格相比较于去美容院会划算很多,但是却比般的护肤保养品昂贵,是真的物有所值还是商家的噱头?今天就来日本好用的家用
    发表于 06-04 21:03 877次阅读

    店saas系统创新性服务平台的优势是什么

    也在不断升级换代,比如目前新代的店智能数字店铺系统。 前沿科技让店铺数字化管理趋于精准,店数字店铺系统除了常规的收银支付等最基本的功能外,结合当前最前沿的人工智能、5G、大数据等技术于
    的头像 发表于 10-15 10:14 2076次阅读

    中断为什么不能调printf?

    前面说会写下Modbus-RTU的实现,写了1000多字了,有兴趣的稍等下哈。前面在个群里看到个朋友在个串口接收中断里打印遇到了问
    发表于 12-04 12:21 0次下载
    <b class='flag-5'>扒</b><b class='flag-5'>一</b><b class='flag-5'>扒</b>中断为什么不能调printf?

    个超棒的stm32的开源usb-can项目,canable及PCAN固件

    个超棒的stm32的开源usb-can项目,canable及PCAN固件
    发表于 12-20 18:55 36次下载
    <b class='flag-5'>扒</b><b class='flag-5'>一</b>个超棒的stm32的开源usb-can项目,canable及PCAN固件

    PipelinethrowIt的用法

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

    雕铣机、雕刻机和加工中心之间的区别

    中心、雕铣机、雕刻机,之间有什么区别?相信这句话很多刚刚加入这个圈的朋友都会问,然后在买机械设备的时候不太懂,不知道怎么区分,到底应该买什么样的设备,才能达到自己的需求,今天小编就为大家他们三者之间的区别。
    的头像 发表于 01-15 09:48 870次阅读

    晶振频率漂移的原因

    晶振频率漂移的原因  晶振频率漂移是指晶振器输出频率在长时间使用逐渐偏离其标称频率的现象。晶振频率漂移是种晶振器的固有性能,其原因
    的头像 发表于 01-26 14:20 1154次阅读

    折叠屏手机背后的“黑科技”

    折叠屏手机似乎正成为各大品牌下步推新的产品,那么今天,就让我们这里面到底有什么“黑科技”。
    的头像 发表于 02-26 10:34 1603次阅读
    <b class='flag-5'>扒</b><b class='flag-5'>一</b><b class='flag-5'>扒</b>折叠屏手机背后的“黑科技”

    渣机远程监控运维管理系统解决方案

    渣机主要由机械手与输送机相结合,将自动渣和自动输送功能合二为,替代了传统的人工和间歇式机械作业,大大提高了工作效率,降低了劳动强度,并显著提升了作业安全性,在矿山、道路、隧道、水利等工程领域
    的头像 发表于 09-05 17:10 248次阅读