芯片设计之流水线设计-IC学习笔记(四)

芯片设计之流水线设计-IC学习笔记(四)pipeline流水线设计是一种典型的面积换性能的设计。一方面通过对长功能路径的合理划分,在同一时间内同时并行多个该功能请求,大大提高了某个功能的吞吐率;另一方面由于长功能路径被切割成短路径,可以达到更高的工作频率,如果不需要提高工作频率,多出来的提频空间可以用于降压降功耗。

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

pipeline流水线设计是一种典型的
面积换性能的设计。一方面通过对长功能路径的合理划分,在同一时间内同时并行多个该功能请求,大大提高了某个功能的吞吐率;另一方面由于长功能路径被切割成短路径,可以达到更高的工作频率,如果不需要提高工作频率,多出来的提频空间可以用于降压降功耗。

1.1 熟悉的经典MIPS五级流水线

在此流水线中一条指令的生命周期分为:

  • 取指:指令取指(Instruction Fetch)是指将指令从存储器中读取出来的过程。

  • 译码:指令译码(Instruction Decode)是指将存储器中取出的指令进行翻译的过程。经过译码之后得到指令需要的操作数寄存器索引,可以使用此索引从通用寄存器组(Register File,Regfile)中将操作数读出。

  • 执行:指令译码之后所需要进行的计算类型都已得知,并且已经从通用寄存器组中读取出了所需的操作数,那么接下来便进行指令执行(Instruction Execute)。指令执行是指对指令进行真正运算的过程。如果指令是一条加法运算指令,则对操作数进行加法操作;如果是减法运算指令,则进行减法操作。在“执行”阶段的最常见部件为算术逻辑部件运算器(Arithmetic Logical Unit,ALU),作为实施具体运算的硬件功能单元。

    img

    MIPS五级流水线结构图

    img

MIPS五级流水线运行图

  • 访存:存储器访问指令往往是指令集中最重要的指令类型之一,访存(Memory Access)是指存储器访问指令将数据从存储器中读出,或者写入存储器的过程。
  • 写回:写回(Write-Back)是指将指令执行的结果写回通用寄存器组的过程。如果是普通运算指令,该结果值来自于“执行”阶段计算的结果;如果是存储器读指令,该结果来自于“访存”阶段从存储器中读取出来的数据。

上述的五级流水线为例,由于前一条指令在完成了“取指”进入“译码”阶段后,下一条指令马上就可以进入“取指”阶段,依次类推,如果流水线没有停顿,理论上可以取得每个时钟周期都完成一条指令的性能。

1.2 流水线深度设置的正面意义与反面意义

正面意义:在两级寄存器(每一级流水线由寄存器组成)之间的硬件逻辑越少,则意味能够运行到更高的主频。因此现代的处理器流水线极深主要是由于处理器追求高频的指标所驱使,高端的ARM Cortex-A系列由于有十几级的流水线,所以能够运行到高达2GHz的主频,而Intel的x86处理器甚至采用几十级的流水线深度将主频推到3-4GHz的高度。主频越高也意味着流水线的吞吐率越高从而性能越高。

反面意义:首先更多的流水线级数要消耗更多的寄存器,也意味着更多的面积开销。其次同时流水线越深,由于每一级流水线需要进行握手,流水线最后一级的反压信号可能会一直串扰到最前一级造成严重的时序问题,需要使用一些比较高级的技巧来解决此类反压时序问题。最后在流水线的取指令阶段无法得知条件跳转的结果,因此只能进行预测,到了流水线的末端才能够通过实际的运算得知该分支是真的该跳还是不该跳,如果发现真实的结果与之前预测的结果不相符,则意味着预测失败,需要将所有预取的错误指令流全部丢弃掉,而重新取正确的指令流,这个过程叫做流水线冲刷(Pipeline Flush)

解决反压信号串扰的问题,可以采用取消反压信号加入乒乓缓存加入前向旁路缓存,基本都是以面积换取性能的方法。

深处种菱浅种稻,不深不浅种荷花,流水线的不同深度皆有其优缺点,需要根据不同的应用背景合理地进行选择。

1.3 选择使用流水线设计的理由

使用流水线一般是时序比较紧张,对电路工作频率较高的时候。

  1. 功能模块之间的流水线,用乒乓 buffer 来交互数据。代价是增加了 memory 的数量,但是和获得的巨大性能提升相比,可以忽略不计。
  2. I/O 瓶颈,比如某个运算需要输入 8 个数据,而 memroy 只能同时提供 2 个数据,如果通过适当划分运算步骤,使用流水线反而会减少面积。
  3. 片内 sram 的读操作,因为 sram 的读操作本身就是两极流水线,除非下一步操作依赖读结果,否则使用流水线是自然而然的事情。
  4. 组合逻辑太长,比如(a+b)*c,那么在加法和乘法之间插入寄存器是比较稳妥的做法。

1.4 流水线的stage划分

一般来说,划分流水线的考虑因素如下,

  • 如果流水线切割的子功能抽象层次较高,可以按照完整的功能进行流水线划分。
  • 流水线最好划分在数据通路上位宽较小的地方,以节省寄存器数量和面积。
  • 流水线每一级的关键路径延时最好接近,利于获得最大的Timing margin。

简单的流水线实例参见参考文献二,pipe line 分割了关键路径延时,提高了整体设计的工作频率 25.6%。

参考文献

【1】芯片设计小经验–流水线设计(微信公众号:数字IC自修室)

【2】IC设计实例解析之“流水线技术”

【3】名家专栏|你真的懂处理器流水线?

【4】为什么CPU流水线设计的级越长,完成一条指令的速度就越快?

【5】Verilog十大基本功1(流水线设计Pipeline Design)

【6】流水线设计的方法和作用

【7】跟涛哥一起学嵌入式 31:深入浅出CPU流水线工作原理

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/170398.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • mysql connector 如何使用_MySQL Connector/Net 的简略使用

    mysql connector 如何使用_MySQL Connector/Net 的简略使用mysqlConnector/Net的简单使用首先,新建工程(WindowsApplication)然后,增加引用(MySql.Data)注意:根据使用.net版本的不同而选择MySql.Data版本之后,放置控件3个TextBox,2个ComboBox,1个DataGridView等等密码框设置下拉框设置数据格设置连接按钮代码:stringconnStr=string.Format…

    2022年7月15日
    19
  • LabVIEW灰度图像操作与运算(基础篇—2)[通俗易懂]

    LabVIEW灰度图像操作与运算(基础篇—2)[通俗易懂]图像操作、像素操作以及图像运算等前期的图像操作不仅会在空间域增强图像,还能极大地提高后续图像处理算法的执行速度及其有效性。

    2022年6月19日
    36
  • C语言:求最大公约数和最小公倍数「建议收藏」

    C语言:求最大公约数和最小公倍数「建议收藏」记录自己的c语言学习过程输入两个正整数,分别求出最大公约数和最小公倍数代码:#include<stdio.h>intmain(){ intm,n,a,b; printf("输入两个正整数:"); scanf("%d%d",&m,&n); if(m&am

    2022年5月17日
    45
  • 【笔试题】2019海康威视嵌入式软件开发工程师(BSP)笔试题(附超详细解答)「建议收藏」

    【笔试题】2019海康威视嵌入式软件开发工程师(BSP)笔试题(附超详细解答)「建议收藏」海康威视嵌入式软件工程师的题目只包含两个部分选择题和简答题,也就是说,没有编程题!照样是C语言基础的题量最多了,又因为是BSP方向,所以关于Linux操作系统和驱动方面的题目可能页会比较多一点,但是就题目的总体难度而言,也并不是特别难。但如果对Linux、驱动方面不是很了解的话,估计会很吃亏的。选择题1、若有8个待排序元素,采用冒泡排序和插入排序最大时间复杂度分别是()。64…

    2022年6月24日
    49
  • Linux安装NVIDIA显卡驱动的正确姿势

    Linux安装NVIDIA显卡驱动的正确姿势什么是nouveau驱动?检测NVIDIA驱动是否成功安装集显与独显的切换使用标准仓库进行自动化安装使用PPA仓库进行自动化安装使用官方的NVIDIA驱动进行手动安装Linux安装NVIDIA显卡驱动的正确姿势可能想玩Linux系统的童鞋,往往死在安装NVIDIA显卡驱动上,所以这篇文章帮助大家以正常的方式安装NVI…

    2022年4月7日
    182
  • PropertyDescriptor属性描述类学习

    PropertyDescriptor属性描述类学习1构造方法通过调用getFoo和setFoo存取方法,为符合标准Java约定的属性构造一个PropertyDescriptor publicPropertyDescriptor(StringpropertyName, Class<?>beanClass) 该构造函数使用简单属性的名称,以及读取和写入属性的方法名称publicPropertyDes…

    2022年9月28日
    5

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号