第四章 处理器体系结构
4.1 Y86指令集体系结构
4.1.1 程序员可见的状态
如图所示,Y86程序中的每条指令都会读取或修改处理器状态的某些部分,这称为程序员可见状态。
在处理器的实现中,要保证机器级程序能够访问程序员可见状态。
Y86的处理器状态类似于IA32,有8个程序寄存器:%eax、%ecx、%edx、%ebx、%esi、%edi、%esp、%edp。处理器的每个程序寄存器存储一个字。寄存器%esp被入栈、出栈、调用和返回指令作为栈指针。在其他情况中,寄存器没有固定的含义或者固定值。三个一位的条件码ZF SF OF保存最近的算术或者逻辑指令所造成影响的有关信息,程序计数器(PC)存放当前正在执行指令的地址。
Y86程序用虚拟地址来引用存储器位置。硬件和操作系统软件联合起来将虚拟地址翻译成实际或物理地址。
程序状态的最后一个部分是状态码stat,它会指示是正常运行还是出现了某种异常。
4.1.2 Y86指令
上图给出了Y86 ISA中各个指令的简单描述,Y86指令集基本上是IA32指令集的一个子集,只包括四字节整数操作,寻址方式比较少,操作也比较少。
Y86和IA32指令相比较:
1、Y86将IA32中的movl指令分成了四个不同的指令,irmovl rrmovl mrmovl rmmovl,分别指明源和目的的格式,第一位指源(i立即数r寄存器m存储器),第二位指目的(rm)。
两个存储器传送指令中的存储器引用方式是简单的基址和偏移量形式,在地址计算中,不支持第二变址寄存器和任何寄存器值的伸缩。
Y86不允许从一个存储器地址直接传送到另一个存储器地址(同IA32),也不允许立即数传送到存储器。
2、Y86有四个整数操作指令,如上图所示的OPL,它们是addl subl andl xorl,只对寄存器数据进行操作,这些指令会设置3个条件码ZF SF OF(零、符号和溢出)。
IA32还允许对存储器数据进行这些操作。
3、Y86有7个跳转指令,如上图所示的jxx,分别是jmp jle jl je jne jge jg,根据分支指令的类型和条件码的设置来选择分支,分支条件同IA32.
4、有6个条件传送指令,如上图的cmovxx,分别是cmovle cmovl cmove cmovne cmovge cmovg,这些指令的格式与寄存器-寄存器传送指令rrmovl一样,但只有当条件码满足所需要的约束时,才会更新目的寄存器的值。
5、call指令将返回地址入栈,然后跳转到目的地址。ret指令从这样的过程调用中返回。
6、pushl和popl指令实现了入栈和出栈,同IA32
7、halt指令停止指令的执行,IA32中有个与之相当的指令hlt。对Y86来说,执行halt指令会导致处理器停止,并将状态码设置为HLT
4.1.3指令编码
图4-2还给出了指令的字节级编码。每条指令需要1~6个字节不等,取决于需要哪些字段。
每条指令的第一个字节表示指令的类型,这个字节分为两个部分:高四位是代码部分,低四位是功能部分,代码值为0~0xB,功能值只有在一组相关指令共用一个代码时才有用。
下图给出了整数操作、条件传送和分支指令的具体编码
注意rrmovl和条件传送有同样的指令编码,可以把它看作一个无条件传送,如同jmp的无条件跳转,它们的功能代码都是0.
下图是8个程序寄存器对应的0~7的寄存器标识符:
Y86中的寄存器编号和IA32中相同,程序寄存器存在CPU中的一个寄存器文件中,这个寄存器文件就是一个小的、以寄存器ID作为地址的随机访问存储器。在指令编码及硬件设计中,当需要指明不应访问任何寄存器时,就用ID值0xF来表示。
指令编码:
在图4-2的右边,是指令所占的字节数,一般两个寄存器占用一个字节,存储器则占用四个字节,指令的编码和功能占用一个字节。因此可以看到,比如rrmovl指令,它的字节长度是2,其中第一个字节代表了指令rrmovl,第二个字节代表了两个寄存器。
对于opl、jxx、cmovxx指令来说,都有一个fn标识,占用4个二进制位(半个字节)。这个便是指令的功能部分,这个是由于它们的指令编码一样,但功能有所不同所造成的。
对于寄存器的表示,是使用4个二进制位表示的,这是一个ID标识。所有的寄存器可以看做是一个寄存器文件,其中的ID标识就类似于它们的地址。对于一些只需要一个寄存器的指令来说,另一个寄存器标识位使用0xF表示,如irmovl pushl popl。
还有的指令需要一个字的常数,比如irmovl指令,call指令等等。这种指令,将把常数放在最后的四个字节当中,用小端法编码。为了描述的简单性,使用绝对寻址方式。
例如习题4.1中:
.pos 0x100
irmovl $15,%ebx
rrmovl %ebx,%ecx
以这三行为例,第一行题目中说明了这行表示这段目标代码的起始地址是0x100,所以第一行的字节编码为0x100,
第二行使用了irmovl指令,irmovl指令的字节编码为30frB,在这里rB是%ebx,它的标识符为3,常数15的十六进制表示为00 00 00 0f,反向顺序写就是0f 00 00 00,
所以第二行的字节编码为0x100:30f30f000000
由于第二行占用了6个字节,所以第三行的地址为0x106,第三行使用了rrmovl指令,rrmovl指令的编码为20rArB,在这里rA是%ebx,它的标识符为3,rB是%ecx,它的标识符为1,所以第三行的字节编码为0x106:2031
4.1.4 Y86异常
对于Y86来说,程序员可见的状态包括状态码stat,它描述程序执行的总体状态,它有四种不同的代码值:
1、AOK,表示程序正常
2、HLT,处理器执行halt指令
3、ADR,遇到非法地址
4、INS,遇到非法指令
4.1.5 Y86程序
Y86和IA32的区别在于,Y86需要用两条指令来实现IA32一条指令实现的内容。
比如对于X86指令中的 addl $4,%ecx 这样的指令,由于Y86当中的addl指令中不包含立即数,所以Y86需要先将立即数存入寄存器,即使用irmovl指令,然后再使用addl来处理加法运算。
4.2 逻辑设计和硬件控制语言HCL
4.2.1 逻辑门
HCL中对应逻辑门的表达式:
AND:&&
OR:||
NOT:!
4.2.2 组合电路和HCL布尔表达式
将很多逻辑门组成一个网,称为组合电路。
构建组合电路有两条限制:
1、两个或多个逻辑门的输出不能连接在一起
2、这个电路必须是无环的
组合逻辑电路和c语言中逻辑表达式的区别:
1、组合电路的输出会不断响应输入的变化,c表达式只会在程序执行过程中被遇到时才求值
2、c的逻辑表达式允许参数是任意整数,0表示false,其他值都表示true,逻辑门只对位值0和1进行操作
3、c的逻辑表达式如果操作结果在对第一个参数进行求值后就能确定,那后面的参数就不会被调用,组合逻辑没有部分求值的规则
4.2.3 字级的组合电路和HCL整数表达式
对多个位进行操作--多个1位操作同时进行
处理器中会用到多种多路复位器(多路复位器MUX是根据输入控制信号的值,从一组不同的数据信号中选出一个),在HCL中,多路复位器是用情况表达式来描述的。
情况表达式的通用格式如下:
[
select_1 :expr_1
select_2 :expr_2
……
select_k :expr_k
]
这个表达式包含一系列情况,每种情况i都有一个布尔表达式selecti和一个整数表达式expri ,前者表明什么时候应该选择这种情况,后者指明得到的值。
组合电路:算数/逻辑单元(ALU):
4.2.4 集合关系
将一个信号与许多可能匹配的信号作比较:
如图中的s0和s1,如果S1为code == 2 || code == 3,S0为code == 1 || code == 0。那么HCL可以用另外一种方式表达,即code in {2,3}和code in {1,0}。
4.2.5 存储器和时钟
组合电路从本质上讲,不存储任何信息,但计算机需要储存数据,因此就需要能保存状态的存储设备。存储设备则是由一个时钟控制,时钟就像一个开关一样,它控制着存储设备什么时候更新设备里的值。
常用的存储设备一般有两种。
1、时钟寄存器:存储单个位或者单个字。时钟信号来控制寄存器是否要加载输入的值。
2、随即访问存储器:存储多个字。用地址来选择该读、写哪个字。
寄存器操作:当时钟信号上升时,寄存器输入上的值成为新的寄存器状态
时钟寄存器的典型应用是PC、条件码寄存器CC以及程序状态stat。它们都有明确的输入,这意味着它们的值其实是某几个值的一个函数。
随即访问存储器最典型的例子就是我们的寄存器文件(也就是8个程序寄存器)和随即访问存储器(也就是我们常说的内存)。它们没有明确的输入值,因此不存在函数关系。
寄存器文件一般有两个读端口和一个写端口。每个端口都附带一个地址来标识操作的是哪个寄存器,而对于写端口,还有一个输入数据,对于读端口,则还有一个输出数据。具体的图示如下。
当srcA或srcB被设成某个寄存器ID时,一段延迟之后,储存在相应程序寄存器的值就会出现在valA或valB上。
向寄存器写入字是由时钟信号控制的,每次时钟上升时,输入valW上的值会被写入输入dstW上的寄存器ID指示灯程序寄存器。
如果在读端口和写端口同时使用一个寄存器ID,就会看到一个从旧值到新值的变化。
对于随即访问存储器来说,与寄存器文件非常相似。不同的是,随即访问存储器只有一个地址输入,一个写的数据输入,一个读的数据输出,图示如下:
当地址输入,并且输入数据输入时,如果写输入为1并且时钟变化时,存储器中地址为输入地址值的值将会变化,值就是输入数据的值。同样的,如果地址输入,并且写输入为0,则输出数据会输出地址为输入地址值的值。当读数据的时候,如果地址超出了范围,error信号将会输出为1。
4.3 Y86的顺序实现
4.3.1将处理组织成阶段
通常处理一个指令包括许多操作,见他们组织成某个特殊的阶段序列,即使指令的动作差异很大,但所有的指令都遵循统一的序列,每一步的具体操作取决于在进行什么指令。
关于各个阶段以及各阶段内执行的操作:
·取指:从存储器读取指令字节,地址为程序计数器(pc)的值,从指令中抽取出指令指示符字节的两个四位部分,成为icode(指令代码),和ifun(指令功能)。它还可能取出一个寄存器指示符字节,致命一个或者两个寄存器操作数指示符rA和rB,也可能取出一个四字节常数字valC。下一条指令的地址valP为pc的值加上已取出指令的长度。
·译码:从寄存器文件读入最多两个操作数,得到valA和/或valB。
·执行:算数/逻辑单元要么执行指令指明的操作,计算存储器引用的有效地址,要么增加或者减少栈指针,得到的值称为valE。如果有条件码,在这个阶段检验条件码。
·访存:将数据写入存储器,或从存储器读出数据,读出的值称为valM。
·写回:最多可以写两个结果到寄存器文件。
·更新PC:将PC设置成下一条指令的地址。
下面是一些指令的执行:
除了不需要一个寄存器指示符字节之外,跳转指令在取指和译码阶段和其他指令类似,在执行阶段,检查条件码和跳转条件来确定是否需要分支,产生一个一位信号cnd,在更新PC阶段,检查这个标志,如果为1,将PC设为valC(跳转目标),如果为0,将PC设为valP(下一个指令的地址)。
4.3.2 SEQ硬件结构
SEQ的抽象视图:
执行过程中信息沿顺时针方向的流程进行,从左下角的PC取值令开始。
硬件单元与各个处理阶段相关联:
·取指:将程序计数器寄存器作为地址,指令存储器读取指令的字节,PC增加器计算valP。
·译码:寄存器文件有两个读端口A和B,从这个两个端口同时读寄存器值valA和valB。
·执行:执行阶段会根据指令的类型,将算数/逻辑单元用于不同的目的,对于整数操作,它要执行指令所指定的运算,对于其他指令,它作为一个加法器来计算增加或者减少栈指针,或者极端有效地址,或者只是简单的加0,将一个输入传递到输出。
条件码寄存器(CC)有三个条件码位,ALU负责计算条件码的新值,当执行一条跳转指令时,会根据条件码和跳转类型来极端分支信号Cnd。
·访存:在执行访存操作时,数据存储器读出或者写入一个存储数字,指令和数据存储器访问的是相同的存储器位置,但是用于不同的目的。
·写回:寄存器文件有两个写端口,端口E用来写ALU计算出来的值,端口M用来写从数据存储器中读出的值。
4.3.3 SEQ的时序
SEQ的实现包括组合逻辑和两种存储器设备:
时钟寄存器(程序计数器和条件码寄存器)
随机访问存储器(寄存器文件 指令寄存器 数据存储器)
组合逻辑不需要任何时序或者控制,只要输入变化了,值就通过逻辑门网络传播,指令存储器单元可以看成是组合逻辑。
程序计数器、条件码寄存器、数据存储器和寄存器文件这四个硬件单元通过一个时钟信号来控制,每个时钟周期,程序计数器都会装载新的指令地址,只有在执行整数运算指令时,才装载条件码寄存器,只有在执行rmmovl,pushl,call指令时,才会写数据存储器,寄存器文件的两个写端口允许每个时钟周期更新两个程序寄存器。
要控制处理器中活动的时序,只需要寄存器和存储器的时钟控制。
Y86指令集的组织原则:处理器从来不需要为了完成一条指令的执行而去读由该指令更新了的状态。
4.3.4 SEQ阶段的实现
HCL描述中使用的常数值:
nop:PC+1
halt:处理器状态被设置为HLT,处理器停止运行
1.取指阶段
以PC作为第一个字节的地址,这个单元一次从存储器读出六个字节。
第一个字节为指令字节,分为两个4位的数,分为控制逻辑块计算指令和功能码。
根据icode值计算出三个一位的信号:
instr_valid:用来发现不合法的指令
need_regids:这个指令包含寄存器指示符字节吗
need_valC:这个指令包括常数字吗
2.译码和写回阶段
译码和写回阶段都要访问寄存器文件。
根据指令代码icode和寄存器指示值rA和rB,可能还会根据执行阶段计算出的Cnd条件信号,产生四个不同的寄存器文件的寄存器ID,寄存器IDsrcA表明该读哪个寄存器以产生valA。
3.执行阶段
这个单元根据alufun信号的设置,对输入aluA和aluB执行ADD SUB AND XOR运算,ALU的输出就是valE信号。
执行阶段还包括条件码寄存器。
标号为cond的硬件单元会根据条件码和功能码来确定是否进行条件分支或者条件数据传送。
4.访存阶段
访存阶段的任务是读或者写程序数据,两个控制块产生存储器地址和存储器输入数据的值。执行读操作时,数据存储器产生值valM。
5.更新PC阶段
新的PC可能是valC valM valP
参考资料
课本
http://www.cnblogs.com/zuoxiaolong/p/computer21.html?utm_source=tuicool&utm_medium=referral
http://www.cnblogs.com/zuoxiaolong/p/computer22.html
实验