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

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

3天内不再提示

Pipeline中throwIt的用法

Spinal FPGA 来源:Spinal FPGA 2023-10-21 16:24 次阅读

编 者 按

字如其名,来看下Pipeline中throwIt的用法,是怎么个丢弃方式

API

在Stage中,关于throwIt提供了下面的API:

deb429c2-6fe9-11ee-939d-92fbcf53809c.png

函数中的动作出现了两个变量的使用:

internal.request.throws

internals.request.throwRoot 那么去到Pipeline里面看都哪里使用到了它。在看之前,先再来回顾下在SpinalHDL中pipeline的编程模型:

dec5b69c-6fe9-11ee-939d-92fbcf53809c.png

在Pipeline的模型里,Pipeline中的任何一级都是一个组合逻辑,如果它要驱动下一级Pipeline,那么其可以通过Connection来和下一级建立连接关系,最后一级则没有Connection。而在Connection中,则可以进行打拍。也即Stage中负责功能实现,Connection负责实现控制流水线级数,时序优化。

Connection中的作用

在Pipeline的build函数中,其定义了throwOne:

var throwOne = stage.internals.request.throws.nonEmpty generate orR(stage.internals.request.throws)

即如果internals.request.throws如果不为空,那么其中的所有条件取或后赋值给throwOne.

而后,在处理Stage间的连接关系时有:

decf0e18-6fe9-11ee-939d-92fbcf53809c.png

这里对于驱动该级的Connection,首先将throwOne保留至clThrowOne(l)中,随后在if判断中,会为clThrowOneHit(l)声明为一个Bool()对象。在常用的Connection M2S、S2M中,alwasContainsSlaveToken均为true,故此时throwOne变量将会被赋值为null。

而对于:

if(throwOne != null) c.m.throwIt(throwOne, root = false)

由于此时throwOne重新被赋值为null,故并不会为驱动该Stage的Master调用throwIt,也即throw并不会向前级传输。

最终会调用下面的函数来进行Stage间的连接关系:

valarea = l.on(m, s, clFlush(l), clFlushNext(l), clFlushNextHit(l), clThrowOne(l), clThrowOneHit(l))

clThrowOne(l)作为throwHead参数传入Connection的on函数。以M2S为例,我们来看下其在里面会有哪些动作:

m.ready match {
casenull=>
s.valid := m.valid
(s.payload, m.payload).zipped.foreach(_ := _)
caser => {
if(flush != null&& flushPreserveInput) s.valid clearWhen(flush)
if(throwHead != null) s.valid clearWhen(throwHead)
when(r) {
s.valid := m.valid
}
when(if(holdPayload) m.valid && r elser) {
(s.payload, m.payload).zipped.foreach(_ := _)
}
}
}

可以看到,如果驱动Connection的Master没有ready信号,那么throwHead是没有任何作用的。

如果master具备ready信号,如果此时m.ready信号为低电平,那么作为Slave的Stage其input.valid将会在下一拍变为低电平。

Stage中的作用

在Stage中的作用比较简单,仅internals.request.throwRoot会起作用。在Pipeline中的build函数中:

if(s.request.throwsRoot.nonEmpty){
val doThrow = s.request.throwsRoot.orR
when(doThrow){
s.output.valid := False
}
}

如果throwsRoot不为空,则其中任意一个条件满足是,Stage中的output.valid会立即清零。

结合Connection中throw的作用,throw会导致当前Stage的input.valid在下一拍清空(input.valid为寄存器),而默认情况下stage的output.valid(Wire)直接由input.valid驱动,故throwsRoot的作用就是让Stage的output.valid立即生效。比如说此时input.valid为高电平,ouput.ready也为高电平,throwsRoot将output.valid直接拉低避免当前拍的数据传输到下一级,从而实现立即丢掉。

Example

dedc698c-6fe9-11ee-939d-92fbcf53809c.png

在这个例子中,如果cond为true,则stage2会立即丢掉当前传输至output端口的数据。

审核编辑:汤梓红

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

    关注

    2

    文章

    1510

    浏览量

    62342
  • 函数
    +关注

    关注

    3

    文章

    4345

    浏览量

    62919
  • 模型
    +关注

    关注

    1

    文章

    3298

    浏览量

    49150
  • Pipeline
    +关注

    关注

    0

    文章

    28

    浏览量

    9382

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

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

收藏 人收藏

    评论

    相关推荐

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

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

    Stream模块的基础用法和进阶用法

    有用。在本教程,我们将介绍 Stream 模块的基础用法和进阶用法,并提供示例。 基础用法 在本节,我们将介绍 Stream 模块的基础
    的头像 发表于 09-19 15:33 1247次阅读

    Matlab的冒号的用法

    Matlab的冒号的用法
    发表于 03-11 22:22

    verilogHDL的{}用法

    verilogHDL的{}用法,求详解。
    发表于 03-22 23:48

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

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

    Pipeline ADCs Come of Age

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

    OrCAD创建总线及用法详解

    OrCAD创建总线及用法详解,如何创建总线,菜单place->bus或者右侧快捷按钮
    发表于 12-02 10:18 2.6w次阅读

    Simulink的Battery模块用法概述

    如果进行电池SOC的建模,常常会用到Simulink的Battery模块,本期基于Matlab的help文件,会大家概述Battery模块的用法
    的头像 发表于 06-28 15:00 6491次阅读
    Simulink<b class='flag-5'>中</b>的Battery模块<b class='flag-5'>用法</b>概述

    SpinalHDL里pipeline的设计思路

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

    扒一扒pipeline“spawn”的用法

    在Stage,关于spawn,定义了下面的两个API
    的头像 发表于 10-29 09:57 609次阅读
    扒一扒<b class='flag-5'>pipeline</b><b class='flag-5'>中</b>“spawn”的<b class='flag-5'>用法</b>

    oraclesubstr函数用法

    在Oracle数据库,SUBSTR函数用于从字符串中提取子字符串。它的语法如下: SUBSTR(string, start_position, [length]) 其中,string是要从中提取子
    的头像 发表于 12-05 16:57 1411次阅读

    split在python用法

    split在python用法 split()是Python中一个非常常用的字符串函数,它能够根据指定的分隔符将一个字符串分割成多个子字符串,并返回一个包含这些子字符串的列表。本文将详细介绍
    的头像 发表于 12-25 15:12 2083次阅读

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

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

    浅析SpinalHDLPipeline的复位定制

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