大概分成以下几节:

1,概述及协议 
2,valid forward-valid超前 
3, bubble collapse - 消除气爆  
4, input/output skid - 不知中文怎么说 
5, pipe halt - 流水停顿 
6,idle present - 显示空闲

1.protocol

两个模块需要协同工作,少不了的就是你给我一些数据,我告诉你我收到了。或者你问我要一些数据,我过一会给你。
“你给我,我告诉你我收到了”,在通信,称之为握手。在数字设计中也一样。
握手有很多种,pipe里用到的这种握手协议,被我称为valid_ready。描述如下

valid_ready协议:
1, 当sender端有数据要发送时,将valid置1,并保证数据有效,可以不用检测ready。
2, 当receiver模块允许接受数据,将ready置1,可以不用检测valid是否有效。
3, 在任一个cycle,如果valid=1 && ready=1, 则接受端将会在紧接着的下一个clock posedge将数据采入,并通过ready信号来表示自己是否可以接受新的数据。
4, 在任一个cycle,如果valid=1 && ready=1,如果发送端仍有数据需要发送,则会在下一个clock posedge将新数据放入data bus,来表示自己有新的数据需要发送。如果没有新的数据需要发送,则将valid置0,表示没有数据需要发送。如果前一次的数据没有被接受端接受,即 ready=0,发送端需要保持valid=1,否则,数据将被丢弃,并没有被接收端收到。

如上图所示,c1周期,发送端有数据想要发送,将valid置1,并将D0稳定;可是c1周期接收端不肯接受数据(可能因为他正在忙于其他事务的处理), 数据没有被接受,发送端只能继续将valid置1,并保持D0不变。c2周期,接受端不再繁忙,可以接受数据了,于是他将ready置1,表明这个周期他 可以接受新数据。于是D0便在c2结束的那个上升沿被接收端取走。尽管接受端还想接受数据(c3周期,ready仍为1),但是发送端没有新数据需要发送,于是接收端继续保持ready=1,表明自己仍可以接受数据。紧接着,发送端在c4周期又有数据需要发送,于是就置vliad=1,而此时接收端正在等着呢,于是这个数据D1在c4周期,就传送完成。这次发送方发送完D1,紧接着还有D2需要发送,可是接收端不干了,他不能、不想、不愿意接受新的数据,于是D2和表明D2有效的valid只能一直保持在那里,等啊等,等啊等……直到c7,接收端可以接受了。于是D2终于传过去了。

2. basic pipe

basic pipe所谓的pipe,他的目的就是实现pipeline,即流水,有了valid_ready,我们就能很容易的将操作进行流水作业。通过插入pipe,可以将原来需要较多层的逻辑分拆开来,每一级pipe做一点。如下图,这是插入了一级pipe的。其中valid和data是同样的逻辑,所以就合并画在一起了。

下图,这是插入了2级pipe的。

每一级你可以对data进行一些处理,再传给下一级。
对于每一级pipe,其基本的逻辑是这样的。o: output, i:input
vo <= (ri) ? vi : vo;
do <= (ri) ? di : do;
ro = ri;
这个就是最基本的pipe的逻辑。
下面是基本pipe的电路图。

3. valid forward

细心的读者会注意到,当sender想要发送数据的时候,会将vi置1,这样,当receiver能够接受数据时,需要多等一个cycle,即数据先要寄存在pipe中,然后下一个cycle,接受端才能看到数据有效。如果要传输一笔数据需要2个cycle,当数据连续传送时,这没有问题,但是如果数据都是零碎的片断,那么效率就变得比较低下。也就是说,当pipe里面为空,但是receiver端不可以接受数据时,数据还是得停留再sender端,而这个空的pipe,我们称之为bubble。

如何解决这个问题? 
当我们发现如果pipe级没有有效数据,即vo=0,那么我们让vi直接送到receiver端,而不再寄存一级。这样做的好处是效率提高了,坏处就是timing变差了。而且相比于没有插入pipe,timing更糟糕了。因为多了一些mux。其实,最糟糕的是,这种做法毫无用处,除非和下面要讲的bubble collpase配合使用。因为如果没有bubble collapse,它根本就没让pipe工作,因为reset之后,pipe始终为空,于是每一次,数据都绕过了pipe,直接送到了serder端。而且,这比没有插入pipe的timing来的更糟糕。这和我们最初要引出pipe,来实现流水以提高timing性能,这个目的相矛盾。

下面我们要讲提及了很多次的bubble collapse了,看看他神奇在什么地方。其实道理很简单,如果receiver端不ready,而pipe为空,我们就将数据先进入pipe级的寄存器,缓存于pipe级。在sender看来,这个数据已经被pipe级取走,可以放新的数据了。下次,receiver端ready了,直接和pipe要数据即可。这样,bubble就消失了。
如图所示:

逻辑代码如下:
ro = ri || !vo;             // ready
vo <= (ro)? vi : vo;       // valid
do <= (ro && vi)? di : do;  // data

仔细、仔细、再仔细体会一下以上代码

4. input/output skid

pipe能有效的改善data的timing(当然,顺带也改善了valid的timing),使得data在其传输路径上被寄存N拍,如果有复杂的组合逻辑,则可以将组合逻辑拆成一系列的组合逻辑,并在每个之间插入pipe,尽管每一笔数据的延时增加了,但是带宽并没有变小。可是,如果ready信号的产生,传播逻辑比较复杂,我们也同样在某些地方将ready打上一拍,以改善他的timing。可是仅仅对ready打一拍,协议就会被破坏了,使得valid 和ready对应不上。

现在我们仅仅简单的将ready打了一拍给sender端,那么sender端看到就是延时一拍以后的ready,即ro<=ri。如果vi=1&&ro=1,从sender的角度看来,就是data被取走了,可以放一个新的数据了。

让我们用最简单的basic pipe来举例说明。假设sender有3笔数据需要发送,而receiver收到一笔后既不能再接受,需要进行一些处理,等几个cycle之后才能再接受新的数据。

其时序如图所示:

我们来简单分析一下:
最初,sender没有数据要发送,vi=0;receiver空闲,可以接受数据,ri=1。但是由于在c3时刻,ri=0,ro=1;receiver不可以接收新的数据,而sender没有及时发现,他还是将数据D2押送给了pipe,但是pipe里面囤积的D1并没有被收走,于是pipe处于一个两难的境地,要么将D1丢弃,要么将D2丢弃,无论如何,总是会丢失一笔数据。

D1占据着Pipe里唯一可以容身的小屋(data register),D2来了,也想进来。D1看了看D2,说:“小样,你是新、新、新、新、新来的吧……,我这里只有一间屋,住不下咱俩,要不这间给你,我自己在离sender近一点的地方再造一间新屋,但是得先说好,船来了(ri=1),我先走。”D2想了想,没办法,一山不容二虎,除非一公和一母,谁让咱俩没性别,要不然……说不定,还能生个小娃,这是后话。

于是,我们又造了一间新的小屋,起名叫skid buffer。当ri从1变0时,即ri=0,ro=1,表示receiver端忽然不能接受新数据了,但是sender要晚点才能知道,这时 候,skid给D1住,D2住老屋。当ri从0变1时,即ri=1、ro=0,表示receiver有可以接受新数据了,这是得先把skid里得数据放走。此时skid里住着D1呢,D2这时看到得还是ro=0,所以他继续呆在老屋里不动。除了这两种情况,其他情况都无所谓,随便我们怎么处理skid都可以,如果想要逻辑简单,那么就像我上面所说得那样处理。但是会出现的这个问题:D2在以后的cycle中,尽管不需要再住进skid了,但是还是会给个分身给skid,而自己会直接从老屋乘船走了。这样会造成skid里不停的让无用的D2们进进出出(无效翻转);为了降低skid再无用的时候不要住无用的D2们的分身,可以加一点控制逻辑,使得D2们在不需要的时候不要浪费skid的资源。(逻辑为 ri ^ ro==0时,disable skid)

下面这个图稍微复杂了点,是一个basic pipe+skid。控制逻辑最少,但增加了额外的skid使用。

skid和pipe这两部分的位置是可以互换的。如果你能成功的做到,你对以上内容的掌握应该已经炉火纯清了。

5. pipe halt

在输入增加一个信号,用于将pipe停止。
即流水线停顿。来自upstream的valid会立即被忽略,送给上一级的ready立刻被取消。同样送给downstream的valid立刻会被取消,而ready也不予理睬。pipe内部所有数据流全部立即停止。

但是如果pipe内部有skid,为了保证数据的正确,skid级的valid立即取消,但是送给upstream的ready需要在下一个cycle再 停顿。恢复的时候也一样,valid立即恢复,而送给upstream的ready需要在下一个cycle才可以恢复。(有关skid的停顿逻辑需要你冥想3分钟,我刚开始几次,每次思考这个问题,都不能一下子想明白,总要绕几圈才豁然。)

6. idle present

Idle 信号表明Pipe中没有有效数据,即每一级pipe的valid无效。
其逻辑为

idle = ~(p1_valid |p2_valid|...)

其中,pn_valid 为第n级Pipe的vo

【PIPE】流水线设计中的基本模块相关推荐

  1. 自学fpga,关于流水线设计问题

    流水线设计的思想来源是高流量,也就是说时间延迟固定的情况下尽可能的产生高的流量,使得整体的信号传输速率得到提升. 这一概念我是最早在<高级FPGA设计--结构.实现和优化>(Steve K ...

  2. 读保护_混合ASIL系统中不同安全等级模块间的边界保护

    01 功能安全组件的软件开发 针对ISO 26262对功能安全软件研发的要求,AUTOSAR将功能安全需求进行了具体拆分.当前的AUTOSAR规范囊括了诸多功能安全组件软件开发的需求概念. 在AUTO ...

  3. 电商网站中用户评论模块剖析

    用户评论是电商网站交互设计中的重要模块之一,用户体验的好坏将直接影响到产品的销售数量,乃至整站的访问量.网上购物,我们只能看到一张张商品图片和描述,对于产品的优劣无法准确判断,因此,已购买者的评论对于 ...

  4. FPGA中的流水线设计(含Verilog范例)

    一.流水线设计介绍 在高速通信系统设计中,如何提高系统的工作速度至关重要,通常使用的方法有两种: 1. 并行方式设计:可减少模块间的延时: 2. 流水线设计:流水线设计如同生产线一样,将整个执行过程分 ...

  5. FPGA中的流水线设计(Pipeline Design)

    流水线设计 前言: 本文从四部分对流水线设计进行分析,具体如下: 第一部分什么是流水线 第二部分什么时候用流水线设计 第三部分使用流水线的优缺点 第四部分流水线加法器举例 第一 什么是流水线 流水线设 ...

  6. 怎样在设计中添加FIFO宏模块

    quartus软件内置了很多我们经常用到的电路模块,统称为宏模块,在做EDA设计的时候,我们可以直接调用他们来简化设计过程.不要小看了宏模块,如果利用得当,可以省去你一多半的设计时间呢.这里以FIFO ...

  7. OEA中的缓存模块设计

    一般缓存介绍 网上介绍缓存的文章比较多,在这里我就挑点重点说一下. 缓存是信息系统软件硬件设计中常用的设计方法:从底层硬件的CPU结构中的多级缓存,到软件中操作系统中内存管理的设计,再到应用软件中的高 ...

  8. 基于Simulink的QPSK调制解调器设计中常见模块分析

    基于Simulink的QPSK调制解调器设计 可能用到的模块分析 Bernoulli Binary Generator probability of a zero: 产生0的概率 Initial se ...

  9. 智能催收系统中自然语言理解模块设计

    摘要 随着社会信贷消费的流行,待催收的违约用户逐渐增多.针对此问题,对Rasa对话系统开发框架中的自然语言理解模块进行改进,显著提升智能催收系统中自然语言理解模块的准确率,并对最终得到的训练模型进行性 ...

最新文章

  1. 思维dp ---- Codeforces Round #722 (Div. 1) B. Kavi on Pairing Duty [思维dp + 数学]
  2. rocketmq 重复消费_RocketMQ的十二个特性,你都知道吗「下」
  3. Lilt:一个为翻译专家开发的人工智能翻译平台
  4. 如何调用系统的包安装自己的apk呢?
  5. mysql datediff多一天_MySQL DATEDIFF函数获取两个日期的时间间隔的方法
  6. source insight使用教程
  7. 团队管理(3)---团队管理方法
  8. Using a Comparison Function for the Key Type
  9. cudaMemset的调用方式
  10. Linux 利用hosts.deny 防止暴力破解ssh
  11. 蓝桥杯 ALGO-97 算法训练 排序
  12. 数据分析-R语言资料整理
  13. 代码阅读工具-global
  14. python 2个dict如何合并
  15. 企业选型数据库系统的五点建议
  16. zip gbk java,java 解压 ZIP 中文 乱码 GBK UTF-8 完美解决方案
  17. Java 将base64图片字符串转化为File类型文件
  18. 进政府网站要求IE8浏览器,IE8浏览器进不去,使用IE进政府机构网站提示非法进入提示不能直接使用URL进入网址,windows10安装IE8提示系统不支持【解决办法】
  19. 安装python3.5.0出现0x80072eff错误_我在网上用WINDOWS UPDATE更新WINDOWS,出现错误:0x80072EFF,该怎么办?...
  20. App加密:常用加密方式和爱加密原理

热门文章

  1. 体验一次Mac Win10主题——Win10美化之路
  2. 车联网通信安全之 SSL/TLS 协议
  3. 用pygame编写一个跑酷游戏
  4. 中国人寿财险java_中国人寿财险社会招聘笔试内容: 今天刚笔试完,蹭着记着赶紧写上来,以便大家以后参考;...
  5. dd命令(dd命令制作镜像)
  6. 为什么springboot项目的pom.xml引入依赖不需要加版本号
  7. 知识扫盲_常用电平标准(TTL、CMOS、LVTTL、LVCMOS、ECL、PECL、LVPECL、RS232)
  8. 有一个很棒的想法,如何向老板证明你是对的
  9. 自动上色论文《Deep Exemplar-based Colorization》(1)
  10. CSRF漏洞利用以及防御手段(详细解释)