码迷,mamicode.com
首页 > 其他好文 > 详细

第六周

时间:2015-10-18 15:20:54      阅读:244      评论:0      收藏:0      [点我收藏+]

标签:

处理器体系结构

一、教材指导

本章内容是处理器体系结构,重点掌握ISA,并能举一反三;本章带着大家设计并实现了一个结合CISC和RISC思想的处理器Y86,一个类IA32体系的处理器;ISA在编译器编写者和处理器设计者之间提供了一个抽象。

本章重点是4.1-4.3

流水线部分4.4-4.5供学有余力的同学自学

4. 1Y86指令集体系结构

4.1.1程序员可见的状态

  • Y86程序中的每条指令都会读取或修改处理器状态的某些部分。这称为程序员可见状态。这里的“程序员”既可以是用汇编代码写程序的人,也可以是产生机器级代码的编译器。在处理器实现中,只要我们保证机器级程序能够访问程序员可见状态,就不需要完全按照ISA隐含的方式来表示和组织这个处理器状态。Y86的处理器状态类似于IA32。
  • 有8个程序寄存器:%eax、%ecx、%edx、%ebx、%esi、%edi、%esp和%ebp。处理器的每个程序寄存器存储一个字。
  • 程序计数器存放当前正在执行指令的地址。

4.1.2Y86指令

  • Y86指令集基本上是IA32指令集的一个子集。它只包括四字节整数操作,寻址方式比较少,操作也较少。
  • 四字节数据,所以称之为“字”不会有歧义。
  • 汇编代码格式类似于IA32的ATT格式。

4.1.3指令编码

  • 每条指令需要1~6个字节不等,这取决于需要哪些字段。
  • Y86中的寄存器编号跟IA32中的相同。程序寄存器存在CPU中的一个寄存器文件中,这个寄存器文件就
    是一个小的、以寄存器ID作为地址的随机访问存储器。在指令编码中以及在我们的硬件设计中,当需要指明不应访问任何寄存器时,就用ID值0xF来表示。
  • 有的指令只有一个字节长,而有的需要操作数的指令编码就更长一些。首先,可能有附加的寄存器指示符字节,指定一个或两个寄存器。
  • 从指令的汇编代码表示中可以看到,根据指令类型,指令可以指定用于数据源和目的的寄存器,或是用于地址计算的基址寄存器。没有寄存器操作数的指令,例如分支指令和call指令,就没有寄存器指示符字节。那些只需要一个寄存器操作数的指令将另一个寄存器指示符设为OxF。这种约定在我们的处理器实现中非常有用。
  • 有些指令需要一个附加的4字节常数字。

4.1.4Y86异常

对于Y86,当遇到这些异常的时候,我们就简单地让处理器停止执行指令。在更完整的的设计中,处理器通常会调用一个异常处理程序,这个过程被指定用来处理遇到的某种类型的异常。就像在第8章中讲述的,异常处理程序可以被配置成不同的结果,例如,放弃程序或者调用一个用户自定义的信号处理程序。

4.1.5Y86程序

程序中以“.”开头的词是汇编器命令。

4.1.6一些Y86的详情

  • 大多数Y86指令是以一种直接的方式修改程序状态的,所以定义每条指令想要达到的结果并不困难。不过,两个特别的指令组合需要特别注意一下。pushl指令会把栈指针减4,并且将一个寄存器值写入存储器中。因此,当执行pushl %esp指令时,处理器的行为是不确定的,因为要入栈的寄存器会被同一条指令修改。
  • 通常有两种约定:1)压入%esp的原始值,2)压入减去4的%esp的值。

4. 2逻辑设计和硬件控制语言HCL

4.2.1逻辑门

4.2.2组合电路和HCL布尔表达式

图4-11多路复用器根据输入控制信号的值,从一组不同的数据信号中选出一个,在这个单个位的多路复用器中,两个数据信号是输入位a和b,控制信号是输入位s,当s为1时,输出等于a:而当s为0时,输出等于b。在这个电路中,我们可以看出两个AND门决定了是否将它们相对应的数据输入传送到OR门。
HCL表达式很清楚地表明了组合逻辑电路和C语言中逻辑表达式的对应之处。它们都是用布尔操作来对输入进行计算的函数。值得注意的是,这两种表达计算的方法之间有以下区别:

因为组合电路是由一系列的逻辑门组成,它的属性是输出会持续地响应输入的变化。如果电路的输入变化了,在一定的延时之后,输出也会相应的变化。相比之下,C表达式只会在程序执行过程中被遇到时才进行求值。
C的逻辑表达式允许参数是任意整数,0表示FALSE,其他任何值都表示TRUE。而逻辑门只对位值0和1进行操作.
C的逻辑表达式有个属性就是它们可能只被部分求值。如果―个AND或OR操作的结果只用对第一个参数求值就能确定,那么就不会对第二个参数求值了。

4.2.3字级的组合电路和HCL整数表达式

  • 通过将逻辑门组合成大的网,可以构造出能计算更加复杂函数的组合电路。通常,我们设计能对数据字进行操作的电路。有一些位级信号代表一个整数或一些控制模式。例如我们的处理器设计将包含有很多字,字的大小为4位和32位,代表整数、地址、指令代码和寄存器标识符。
  • 执行字级计算的组合电路根据输入字的各个位,用逻辑门来计算输出字的各个位。
  • 选择表达式可以是任意的布尔表达式,可以有任意多的情况。这就使得情况表达式能描述带复杂选择标准的、多种输入信号的块。

4.2.4集合关系

在处理器设计中,很多时候都需要将一个信号与许多可能匹配的信号做比较,以此来检测正在处理的某个指令代码是否属于某一类指令代码。

4.2.5存储器和时钟

为了产生时序电路,我们必须引入按位存储信息的设备。存储设备都是由同一个时钟控制,时钟是一个周期性信号,决定什么时候要把新值加载到设备中。考虑两类存储器设备:

1.时钟寄存器(简称寄存器)存储单个位或字。时钟信号控制寄存器加载输入值。
2.随机访问存储器(简称存储器)存储多个字,用地址来选择该读或该写哪个字。随机访问存储器的例子包括:1)处理器的虚拟存储器系统,硬件和操作系统软件结合起来使处理器可以在一个很大的地址空间内访问任意的字;2)寄存器文件,在此,寄存器标识符作为地址。在IA32或Y86处理器中,寄存器文件有8个程序寄存器。

大多数时候,寄存器都保持在稳定状态(用×表示)产生的输出等于它的当前状态。信号沿着寄存器前面的组合逻辑传播这时,产生了一个新的寄存器输入(用y表示)但只要时钟是低电位的,寄存器的输出就仍然保持不变。当时钟变成高电位的时候,输入信号就加载到寄存器中,成为下一个状态y直到下一个时钟上升沿,这个状态就一直是寄存器的新输出。关键是寄存器是作为电路不同部分中的组合逻辑之间的屏障。每当每个时钟到达上升沿时,值才会从寄存器的输入传送至输出。

4.3 y86的顺序(sequential)实现

4.3.1将处理组织成阶段

通常,处理一条指令包括很多操作。将它们组织成某个特殊的阶段序列,即使指令的动作差异很大,但所有的指令都遵循统一的序列。每一步的具体操作取决于正在执行的指令。创建这样的框架,我们便能设计一个充分利用硬件的处理器。简略描述:

取指
译码
执行
访存
写回
更新PC

我们面临的一个挑战是将每条不同指令所需要的计算放入到上述那个通用框架中。我们会使用图4-17中所示的代码来描述不同Y86指令的处理。表中的这种格式很容易映射到硬件,表中的每一行都描述了一个信号或存储状态的分配。阅读时可以把它看成是从上至下的顺序求值。当我们将这些计算映射到硬件时,会发现其实并不需要严格按照顺序来执行这些求值。

4.3.2SEQ硬件结构

硬件单元与各个处理阶段相关联:

  • 取指:将程序计数器寄存器作为地址,指令存储器读取指令的字节。
  • 译码:寄存器文件有两个读端口A和B,从这两个端口同时读寄存器值
  • 执行:执行阶段会根据指令的类型,将算术/逻辑单元用于不同的目的。对整数操作,它要执行指令所指定的运算。对其他指令,它会作为一个加法器来计算增加或减少栈指针,或者计算有效地址,或者只是简单地加0,将一个输入传递到输出。
  • 访问:在执行访问操作时,数据存储器读出或写入一个存储器字。
  • 写回:寄存器文件有两个写端口。

4.3.3SEQ的时序

SEQ的实现包括组合逻辑和两种存储器设备:时钟寄存器,随机访问存储器(寄存器文件、指令存储器和数据存储器)。组合逻辑不需要任何时序或控制。对于较小的存储器来说(例如寄存器文件)这是一个合理的假设,而对于较大的电路来说,可以用特殊的时钟电路来模拟这个效果。由于指令存储器只用来读指令,因此我们可以将这个单元看成是组合逻辑。

4.3.4SEQ阶段的实现

寄存器文件有四个端口,它支持同时进行两个读(在端口A和B上)和两个写(在端口E和M)。每个端口都有一个地址连接和―个数据连接,地址连接是一个寄存器ID,而数据连接是一组32根线路,既可以作为寄存器文件的输出字,也可以作为它的输入字。如果某个地址端口上的值为特殊标识符0xF,则表明不需要访问寄存器。

练习题

4.1 4.2 4.5 4.6 4.8 4.10 4.11 4.12 4.16 4.17 4.19 4.21 4.24

以习题驱动,再看书,有问题及时在答疑论坛问

二、实验

1 课程QQ群中,或官网下载Y86模拟器,验证教材上不少于三人HCL代码

2.构建YIS环境:

cd ~/Code/shiyanlou_cs413
wget http://labfile.oss.aliyuncs.com/courses/413/sim.tar
tar -xvf sim.tar
cd sim
sudo apt-get install tk
sudo ln -s  /usr/lib/x86_64-linux-gnu/libtk8.6.so /usr/lib/libtk.so
sudo ln -s  /usr/lib/x86_64-linux-gnu/libtk8.6.so /usr/lib/libtk.so
make

3.YIS手册下载

4.YIS测试:

cd y86-code

进入测试代码,教材p239页代码为asuml.ys,可以通过

make asuml.yo

进行汇编,asuml.yo就是汇编后的结果,见教材p238。

make all

可以汇编运行所有代码结果。

 

第六周

标签:

原文地址:http://www.cnblogs.com/heiguirenxi/p/4889505.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!