设计一个简易的处理器(9)--PIPE的硬件结构, 流水线控制逻辑
2012-12-17 09:03
351 查看
PIPE是最终要实现的简易处理器,本篇主要介绍PIPE的硬件结构和流水线控制逻辑.
PIPE的硬件结构
————
流水化的最终实现-PIPE
PIPE使用旁路转发技术,能够解决大多数形式的数据冒险,但是不能解决Load/Use冒险和控制冒险,这需要通过流水线控制逻辑来进行控制.
PIPE的各个阶段的详见:wside-hcl.pdf,这篇文档使用HCL详细描述了PIPE的各个阶段的实现.下面简单图示下.
(1).Select PC &Fetch
(2).Decode & Write Back
(3).Execute
(4).Memory
PIPE流水线的控制逻辑
————
PIPE流水线的控制逻辑必须要包含下面四个:
-加载/使用冒险(Load/UseHazard)
-预测错误的分支(Mispredicted Branch )
-处理ret(Processing ret)
-异常(Exception)
前三个是对冒险的控制,将它们放在一起讨论,异常另外讨论.
1.冒险
-触发条件
-流水线控制逻辑的动作
附:流水线寄存器的动作(Normal;
Stall; Bubble).
- PIPE流水线控制逻辑(原始)
HCL描述
boolF_stall =
# Conditions for a load/use hazard
E_icode in { IMRMOVL, IPOPL } &&
E_dstM in { d_srcA, d_srcB }||
# Stalling at fetch
while ret passes through pipeline
IRET in { D_icode, E_icode, M_icode };
boolD_stall =
# Conditions for a load/use hazard
E_icode in { IMRMOVL, IPOPL } &&
E_dstM in { d_srcA, d_srcB };
boolF_stall =
# Conditions for a load/use hazard
E_icode in { IMRMOVL, IPOPL } &&
E_dstM in { d_srcA, d_srcB }||
# Stalling at fetch
while ret passes through pipeline
IRET in { D_icode, E_icode, M_icode };
boolD_stall =
# Conditions for a load/use hazard
E_icode in { IMRMOVL, IPOPL } &&
E_dstM in { d_srcA, d_srcB };
- PIPE流水线控制逻辑(合并)
- 详见CSAPP 301-303
2.异常处理
-异常简介
(1).在一个实际的处理器中,处理器中很多事情会导致异常控制流,程序正常的执行流程被破坏.
(2).在一个完整的设计中,一旦异常发生,处理器会调用操作系统提供的异常处理程序.
(3).可能恢复正常的程序流.
(4).异常可以由程序执行从内部产生,也可以来自外部信号.
-异常的诱发
本文只讨论四种内部产生的异常: (1). Halt指令;
(2). 非法指令; (3).取指或者数据读取访问非法地址; (4).流水线控制错误.很明显,这四类都会导致正常的程序流破坏.
-异常的处理
为了方便处理
(1).当处理器遇到异常时,处理器直接停止运行;
(2).设置适当的状态码.
-典型异常示例
(1).发生在Fetch阶段
主要有三种情况:
jmp $-1 #Invalid jump target(-1=0xF…F)
.byte 0xFF # Invalid instruction code
halt # Halt instruction
(2).发生在Memory阶段
访问非法地址.例如:
irmovl $100,%eax
rmmovl %eax,0x10000(%eax) # invalid address(假定如允许超过0x10000以上的地址)
(3).流水线控制错误
很重要的一点就是在exception发生时,引起exception的语句之前的语句已经全部执行完毕,而在exception之后的语句还没有被执行.
示例1:多条导致异常的指令
处理方式:应该rmmovl导致异常.
示例2:分支预测错误
处理方式:应该没有异常发生.
-处理方法
(1).每一个阶段设置一个状态码;
(2). Fetch阶段将状态字段设置为"AOK"(表示合法指令),
"ADR"(取指时访问非法地址)和"INS"(非法指令);
(3). Decode和Execute阶段直接传递状态字段;
(4). Memory当出现访问非法指令,设置"ADR",或者直接使用传递指令;
(5).只有在Write Back阶段异常才触发.
---消除副作用:前面的exception引发后就不应该执行后面的指令.
rmmovl应该引发异常, addl指令addl指令也就不应该修改状态.
解决方法:
(1).当在Memory阶段检测到异常,Execute阶段Condition
Code就不应该设置;
(2).当异常传递到Write Back阶段(只有在Write
Back阶段异常才会触发),应该避免写回存储器和设置ConditionCode.
注*:本篇中的图片均来自本书的官网,我进行了改造(注释和添加),详见http://csapp.cs.cmu.edu/public/figures.html
(Copyright© 2011, Randal E. Bryant and David R. O'Hallaron )
reference:
1. 深入理解计算机系统(原书第2版)
(版权所有,转载时请注明作者和出处-dennis_fan-http://blog.csdn.net/dennis_fan
PIPE的硬件结构
————
流水化的最终实现-PIPE
PIPE使用旁路转发技术,能够解决大多数形式的数据冒险,但是不能解决Load/Use冒险和控制冒险,这需要通过流水线控制逻辑来进行控制.
PIPE的各个阶段的详见:wside-hcl.pdf,这篇文档使用HCL详细描述了PIPE的各个阶段的实现.下面简单图示下.
(1).Select PC &Fetch
(2).Decode & Write Back
(3).Execute
(4).Memory
PIPE流水线的控制逻辑
————
PIPE流水线的控制逻辑必须要包含下面四个:
-加载/使用冒险(Load/UseHazard)
-预测错误的分支(Mispredicted Branch )
-处理ret(Processing ret)
-异常(Exception)
前三个是对冒险的控制,将它们放在一起讨论,异常另外讨论.
1.冒险
-触发条件
条件 | 触发条件 |
加载/使用冒险 | E_icode in { IMRMOVL, IPOPL } && E_dstM in { d_srcA, d_srcB } |
预测错误的分支 | E_icode = IJXX & !e_Bch |
处理ret | IRET in { D_icode, E_icode, M_icode } |
Condition | F | D | E | M | W |
加载/使用冒险 | stall | stall | bubble | normal | normal |
预测错误的分支 | normal | bubble | bubble | normal | normal |
处理ret | stall | bubble | normal | normal | normal |
Stall; Bubble).
- PIPE流水线控制逻辑(原始)
HCL描述
boolF_stall =
# Conditions for a load/use hazard
E_icode in { IMRMOVL, IPOPL } &&
E_dstM in { d_srcA, d_srcB }||
# Stalling at fetch
while ret passes through pipeline
IRET in { D_icode, E_icode, M_icode };
boolD_stall =
# Conditions for a load/use hazard
E_icode in { IMRMOVL, IPOPL } &&
E_dstM in { d_srcA, d_srcB };
boolF_stall =
# Conditions for a load/use hazard
E_icode in { IMRMOVL, IPOPL } &&
E_dstM in { d_srcA, d_srcB }||
# Stalling at fetch
while ret passes through pipeline
IRET in { D_icode, E_icode, M_icode };
boolD_stall =
# Conditions for a load/use hazard
E_icode in { IMRMOVL, IPOPL } &&
E_dstM in { d_srcA, d_srcB };
- PIPE流水线控制逻辑(合并)
- 详见CSAPP 301-303
2.异常处理
-异常简介
(1).在一个实际的处理器中,处理器中很多事情会导致异常控制流,程序正常的执行流程被破坏.
(2).在一个完整的设计中,一旦异常发生,处理器会调用操作系统提供的异常处理程序.
(3).可能恢复正常的程序流.
(4).异常可以由程序执行从内部产生,也可以来自外部信号.
-异常的诱发
本文只讨论四种内部产生的异常: (1). Halt指令;
(2). 非法指令; (3).取指或者数据读取访问非法地址; (4).流水线控制错误.很明显,这四类都会导致正常的程序流破坏.
-异常的处理
为了方便处理
(1).当处理器遇到异常时,处理器直接停止运行;
(2).设置适当的状态码.
-典型异常示例
(1).发生在Fetch阶段
主要有三种情况:
jmp $-1 #Invalid jump target(-1=0xF…F)
.byte 0xFF # Invalid instruction code
halt # Halt instruction
(2).发生在Memory阶段
访问非法地址.例如:
irmovl $100,%eax
rmmovl %eax,0x10000(%eax) # invalid address(假定如允许超过0x10000以上的地址)
(3).流水线控制错误
很重要的一点就是在exception发生时,引起exception的语句之前的语句已经全部执行完毕,而在exception之后的语句还没有被执行.
示例1:多条导致异常的指令
处理方式:应该rmmovl导致异常.
示例2:分支预测错误
处理方式:应该没有异常发生.
-处理方法
(1).每一个阶段设置一个状态码;
(2). Fetch阶段将状态字段设置为"AOK"(表示合法指令),
"ADR"(取指时访问非法地址)和"INS"(非法指令);
(3). Decode和Execute阶段直接传递状态字段;
(4). Memory当出现访问非法指令,设置"ADR",或者直接使用传递指令;
(5).只有在Write Back阶段异常才触发.
---消除副作用:前面的exception引发后就不应该执行后面的指令.
rmmovl应该引发异常, addl指令addl指令也就不应该修改状态.
解决方法:
(1).当在Memory阶段检测到异常,Execute阶段Condition
Code就不应该设置;
(2).当异常传递到Write Back阶段(只有在Write
Back阶段异常才会触发),应该避免写回存储器和设置ConditionCode.
注*:本篇中的图片均来自本书的官网,我进行了改造(注释和添加),详见http://csapp.cs.cmu.edu/public/figures.html
(Copyright© 2011, Randal E. Bryant and David R. O'Hallaron )
reference:
1. 深入理解计算机系统(原书第2版)
(版权所有,转载时请注明作者和出处-dennis_fan-http://blog.csdn.net/dennis_fan
相关文章推荐
- 设计一个简易的处理器(4)--SEQ CPU的实现(2):SEQ CPU的控制逻辑与硬件实现
- 设计一个简易的处理器(6)--简单的流水线实现PIPE-
- 设计一个简易的处理器(8)--流水线冒险的避免
- 设计一个简易的处理器(2)--处理器的硬件部件
- 设计一个简易的处理器(1)--定义指令集体系结构(ISA)
- 设计一个简易的处理器(7)--流水线的相关和冒险
- 请问谁那有计算机系统结构的课程设计—设计一个流水线CPU。。
- 设计一个简易的处理器(3)--SEQ CPU的实现(1): 将指令组织成阶段
- 设计一个简易的处理器(10)--性能评估(完)
- 设计一个简易的处理器(5)--SEQ+ CPU的实现
- 深入理解计算机系统(4.2)------逻辑设计和硬件控制语言HCL
- [ASP.NET 设计模式] 用Visual Studio2010搭建一个简单的分层结构示例Step by Step —— 02 业务逻辑层
- 数据结构课程设计---用Dijkstra算法实现一个简易的最佳方案选择
- 分享一个与硬件通讯的分布式监控与远程控制程序的设计(中:通讯协议设计与实现)
- 设计实现一个简易通讯录,要求使用结构体
- 一个开源的IoC采集服务器体系结构设计
- 如何设计一个优秀基表结构
- 数据库设计(3)—逻辑结构设计
- 设计一个DNS的Cache结构,要求能够满足每秒5000以上的查询,满足IP数据的快速插入,查询的速度要快