设计一个简易的处理器(3)--SEQ CPU的实现(1): 将指令组织成阶段
2012-12-10 22:17
706 查看
本文是介绍SEQCPU(Sequential CPU)的实现的第一篇,着重介绍如何将Y86的指令组织成阶段.
Y86/SEQ CPU
————
"设计一个简易的处理器"的第一篇中,我介绍了一个简易的指令集系统Y86,这里的SEQ
CPU使用的就是Y86指令集.
指令集详见(http://blog.csdn.net/dennis_fan/article/details/8226311).
需要指出的是, CPU是一个数字电路,由组合电路和时序电路组成.我们知道,组合电路没有状态,而时序电路是有状态的.特别的是,程序员的可见状态在硬件实现上就是一个一个的时序电路来完成的.
SEQ CPU的状态(时序电路):
程序计数器(Program
counter register, PC)
条件码寄存器(Conditon code register, CC)
寄存器文件(Register File)
存储器(Memory)
这些时序电路随着时钟上升而更新.
SEQ CPU的组合电路:
算术逻辑单元(ALU)
控制逻辑(Control logic)
读存储器(Memory reads):读指令寄存器,读寄存器文件,读数据寄存器.
指令处理阶段
————
为了降低实现的复杂性,采用统一的框架,这样可以共用一些部件.我们将Y86的指令处理组织成如下几个阶段:
取指(Fetch):从指令寄存器读取指令.
译码(Decode):读取程序寄存器.
执行(Execute): ALU计算结果(分为两种一种是计算值(用于更新程序寄存器),一种是计算存储器引用的有效地址).
访存(Memory):读写存储器.
写回(Write Back):写回寄存器文件.
更新PC(PC update):将PC设置成下一条指令的地址.
先大家只需要了解一下一条指令执行的要经历的阶段,后面会分析Y86的具体指令的执行过程.
需要注意的两点:
1.在统一框架下,每条指令都会经历以上所有阶段.
2.在SEQ/SEQ+里,各个阶段是顺序进行的,但一个阶段内的内容基本上(有例外,稍后再说)是并行执行的.
Y86指令的执行
————
Y86的指令及其编码可以参看我以前的blog.
下面是各种指令处理的各个阶段,大家可以一扫而过,看我的分析结果,再对照着图就很容易理解.
看到上面的指令处理的各个阶段是不是天花乱坠啊.其实一点不复杂,因为使用的是统一的框架.总结起来就如下几点:
(1).首先要看指令到底要干啥,它的操作数是啥,明确数据流的方向.
比如opl, rrmovl, irmovl, cmovXX都不涉及到存储器,都是将Execute阶段中的执行结果valE给某个程序寄存器.(数据流方向:
valE->程序寄存器).
比如mrmovl, popl的数据流方向是:存储器->程序寄存器.以为这肯定要从存储器中取出valM,再给这个程序寄存器.
比如rmmovl的数据流方向是:程序寄存器->存储器,肯定会写入存储器.
(2).写入程序寄存器的数据有两种来源,一种是valE(opl,rrmovl,
irmovl, pushl, popl, call, ret,cmovXX),一种是valM(mrmovl, popl).
(3). pushl, popl, call, ret都涉及了"栈"(存储器),都会更新%esp(%esp+/-4:在执行阶段计算出来valE).将valE写回%esp.
(4). opl在执行阶段会设置CC, cmovXX, jXX在执行阶段会有一个判断逻辑.
(5).只有rmmovl, pushl和call需要写回存储器.
(6).统一处理的原则:在excute阶段,valA尽量不参与运算,使用valB参与运算;在memory阶段,都是valA参与运算(为了使得pushl和rmmovl统一处理).
(7).总结
疑点
————
1. rrmovl的execute阶段本不需要运算,为什么要执行"valE
= 0+valA"?
答:使用的是统一的框架,每条指令都必须通过每个阶段.这样做还有一个好处,减少信号传递的数量.写回都是通过valE和valM的,而不需要valA.
2.为什么是mrmovl D(rB), rA而不是
mrmovl D(rA), rB?
答:统一处理
mrmvol和rmmovl.这样保证了"execute阶段,
valA尽量不参与运算,使用valB参与运算".
3. popl rA的Write back阶段需要写两个寄存器.这两个写应该是有次序的啊?
答:是的.为了保证"popl%esp"的语义同IA32一致,"R[%esp]<-valE"必须在"R[rA]<-valM"之前,这意味着按照只能在上升沿update的规则,就需要2个cycles来执行(违反了原则)。
4. pushl rA怎么没有问题?
答:由于在SEQ
CPU中.因为读取的值在某根信号线(指的是valA信号)上存在着.即便是"pushl
%esp", %esp的值已经在valA信号线上了,只需要将valA的值写回存储器即可.
reference:
1. 深入理解计算机系统(原书第2版)
(版权所有,转载时请注明作者和出处-dennis_fan)
Y86/SEQ CPU
————
"设计一个简易的处理器"的第一篇中,我介绍了一个简易的指令集系统Y86,这里的SEQ
CPU使用的就是Y86指令集.
指令集详见(http://blog.csdn.net/dennis_fan/article/details/8226311).
需要指出的是, CPU是一个数字电路,由组合电路和时序电路组成.我们知道,组合电路没有状态,而时序电路是有状态的.特别的是,程序员的可见状态在硬件实现上就是一个一个的时序电路来完成的.
SEQ CPU的状态(时序电路):
程序计数器(Program
counter register, PC)
条件码寄存器(Conditon code register, CC)
寄存器文件(Register File)
存储器(Memory)
这些时序电路随着时钟上升而更新.
SEQ CPU的组合电路:
算术逻辑单元(ALU)
控制逻辑(Control logic)
读存储器(Memory reads):读指令寄存器,读寄存器文件,读数据寄存器.
指令处理阶段
————
为了降低实现的复杂性,采用统一的框架,这样可以共用一些部件.我们将Y86的指令处理组织成如下几个阶段:
取指(Fetch):从指令寄存器读取指令.
译码(Decode):读取程序寄存器.
执行(Execute): ALU计算结果(分为两种一种是计算值(用于更新程序寄存器),一种是计算存储器引用的有效地址).
访存(Memory):读写存储器.
写回(Write Back):写回寄存器文件.
更新PC(PC update):将PC设置成下一条指令的地址.
先大家只需要了解一下一条指令执行的要经历的阶段,后面会分析Y86的具体指令的执行过程.
需要注意的两点:
1.在统一框架下,每条指令都会经历以上所有阶段.
2.在SEQ/SEQ+里,各个阶段是顺序进行的,但一个阶段内的内容基本上(有例外,稍后再说)是并行执行的.
Y86指令的执行
————
Y86的指令及其编码可以参看我以前的blog.
下面是各种指令处理的各个阶段,大家可以一扫而过,看我的分析结果,再对照着图就很容易理解.
(1).首先要看指令到底要干啥,它的操作数是啥,明确数据流的方向.
比如opl, rrmovl, irmovl, cmovXX都不涉及到存储器,都是将Execute阶段中的执行结果valE给某个程序寄存器.(数据流方向:
valE->程序寄存器).
比如mrmovl, popl的数据流方向是:存储器->程序寄存器.以为这肯定要从存储器中取出valM,再给这个程序寄存器.
比如rmmovl的数据流方向是:程序寄存器->存储器,肯定会写入存储器.
(2).写入程序寄存器的数据有两种来源,一种是valE(opl,rrmovl,
irmovl, pushl, popl, call, ret,cmovXX),一种是valM(mrmovl, popl).
(3). pushl, popl, call, ret都涉及了"栈"(存储器),都会更新%esp(%esp+/-4:在执行阶段计算出来valE).将valE写回%esp.
(4). opl在执行阶段会设置CC, cmovXX, jXX在执行阶段会有一个判断逻辑.
(5).只有rmmovl, pushl和call需要写回存储器.
(6).统一处理的原则:在excute阶段,valA尽量不参与运算,使用valB参与运算;在memory阶段,都是valA参与运算(为了使得pushl和rmmovl统一处理).
(7).总结
阶段名 | 信号 | 注释 |
Fetch | icode:ifun rA, rB valC valP | Read instruction byte Read register byte Read constant D or V Compute next PC |
Decode | valA valB | Read operand A Read operand B |
Execute | valE Cond code | Perform ALU operation Set/Test Condition code register |
Memory | valM | Memery read/write |
Write back | dstE dstM | Write back ALU result Write back memory result |
PC update | PC | Update PC |
————
1. rrmovl的execute阶段本不需要运算,为什么要执行"valE
= 0+valA"?
答:使用的是统一的框架,每条指令都必须通过每个阶段.这样做还有一个好处,减少信号传递的数量.写回都是通过valE和valM的,而不需要valA.
2.为什么是mrmovl D(rB), rA而不是
mrmovl D(rA), rB?
答:统一处理
mrmvol和rmmovl.这样保证了"execute阶段,
valA尽量不参与运算,使用valB参与运算".
3. popl rA的Write back阶段需要写两个寄存器.这两个写应该是有次序的啊?
答:是的.为了保证"popl%esp"的语义同IA32一致,"R[%esp]<-valE"必须在"R[rA]<-valM"之前,这意味着按照只能在上升沿update的规则,就需要2个cycles来执行(违反了原则)。
4. pushl rA怎么没有问题?
答:由于在SEQ
CPU中.因为读取的值在某根信号线(指的是valA信号)上存在着.即便是"pushl
%esp", %esp的值已经在valA信号线上了,只需要将valA的值写回存储器即可.
reference:
1. 深入理解计算机系统(原书第2版)
(版权所有,转载时请注明作者和出处-dennis_fan)
相关文章推荐
- 设计一个简易的处理器(5)--SEQ+ CPU的实现
- 设计一个简易的处理器(4)--SEQ CPU的实现(2):SEQ CPU的控制逻辑与硬件实现
- 设计一个简易的处理器(6)--简单的流水线实现PIPE-
- 自己动手写处理器之第四阶段(1)——第一条指令ori的实现
- 自己动手写CPU之第七阶段(5)——流水线暂停机制的设计与实现
- 自己动手写CPU之第七阶段(7)——乘累加指令的实现
- 自己动手写CPU之第五阶段(4)——逻辑、移位与空指令的实现
- 自己动手写CPU之第七阶段(9)——除法指令说明及实现思路
- 自己动手写CPU之第七阶段(10)——除法指令实现过程1
- 设计一个简易的处理器(1)--定义指令集体系结构(ISA)
- 自己动手写CPU之第七阶段(8)——验证乘累加指令的实现效果
- 设计实现一个简易通讯录,要求使用结构体
- 自己动手写CPU之第七阶段(6)——乘累加指令实现思路
- 自己动手写CPU之第九阶段(5)——实现加载存储指令2(修改执行阶段)
- 自己动手写CPU之第七阶段(12)——检验除法指令实现效果
- 自己动手写CPU之第四阶段(2)——验证第一条指令ori的实现效果
- 自己动手写CPU之第九阶段(5)——实现加载存储指令3(修改访存阶段)
- 设计一个简易的处理器(10)--性能评估(完)
- 自己动手写处理器之第四阶段(1)——第一条指令ori的实现
- 自己写CPU第四阶段(2)——验证该第一指令ori实现效果