学习计时:共12小时
读书:4
代码:1
做业:3
博客:4html
现代微处理器能够称得上是人类创造的最复杂的系统之一。一块手指甲大小的硅片上,能够容纳一个完整的高性能处理器、大的高速缓存,以及用来链接到外部设备的逻辑电路。linux
对于Y86,当遇到这些异常的时候,咱们就简单地让处理器中止执行指令。在更完整的的设计中,处理器一般会调用一个异常处理程序,这个过程被指定用来处理遇到的某种类型的异常。就像在第8章中讲述的,异常处理程序能够被配置成不一样的结果,例如,放弃程序或者调用一个用户自定义的信号处理程序。程序员
程序中以“.”开头的词是汇编器命令。缓存
图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操做的结果只用对第一个参数求值就能肯定,那么就不会对第二个参数求值了。markdown
在处理器设计中,不少时候都须要将一个信号与许多可能匹配的信号作比较,以此来检测正在处理的某个指令代码是否属于某一类指令代码。app
为了产生时序电路,咱们必须引入按位存储信息的设备。存储设备都是由同一个时钟控制,时钟是一个周期性信号,决定何时要把新值加载到设备中。考虑两类存储器设备:框架
1.时钟寄存器(简称寄存器)存储单个位或字。时钟信号控制寄存器加载输入值。
2.随机访问存储器(简称存储器)存储多个字,用地址来选择该读或该写哪一个字。随机访问存储器的例子包括:1)处理器的虚拟存储器系统,硬件和操做系统软件结合起来使处理器能够在一个很大的地址空间内访问任意的字;2)寄存器文件,在此,寄存器标识符做为地址。在IA32或Y86处理器中,寄存器文件有8个程序寄存器。函数
大多数时候,寄存器都保持在稳定状态(用×表示)产生的输出等于它的当前状态。信号沿着寄存器前面的组合逻辑传播这时,产生了一个新的寄存器输入(用y表示)但只要时钟是低电位的,寄存器的输出就仍然保持不变。当时钟变成高电位的时候,输入信号就加载到寄存器中,成为下一个状态y直到下一个时钟上升沿,这个状态就一直是寄存器的新输出。关键是寄存器是做为电路不一样部分中的组合逻辑之间的屏障。每当每一个时钟到达上升沿时,值才会从寄存器的输入传送至输出。性能
一般,处理一条指令包括不少操做。将它们组织成某个特殊的阶段序列,即便指令的动做差别很大,但全部的指令都遵循统一的序列。每一步的具体操做取决于正在执行的指令。建立这样的框架,咱们便能设计一个充分利用硬件的处理器。简略描述:
取指
译码
执行
访存
写回
更新PC
咱们面临的一个挑战是将每条不一样指令所须要的计算放入到上述那个通用框架中。咱们会使用图4-17中所示的代码来描述不一样Y86指令的处理。表中的这种格式很容易映射到硬件,表中的每一行都描述了一个信号或存储状态的分配。阅读时能够把它当作是从上至下的顺序求值。当咱们将这些计算映射到硬件时,会发现其实并不须要严格按照顺序来执行这些求值。
硬件单元与各个处理阶段相关联:
SEQ的实现包括组合逻辑和两种存储器设备:时钟寄存器,随机访问存储器(寄存器文件、指令存储器和数据存储器)。组合逻辑不须要任什么时候序或控制。对于较小的存储器来讲(例如寄存器文件)这是一个合理的假设,而对于较大的电路来讲,能够用特殊的时钟电路来模拟这个效果。因为指令存储器只用来读指令,所以咱们能够将这个单元当作是组合逻辑。
寄存器文件有四个端口,它支持同时进行两个读(在端口A和B上)和两个写(在端口E和M)。每一个端口都有一个地址链接和―个数据链接,地址链接是一个寄存器ID,而数据链接是一组32根线路,既能够做为寄存器文件的输出字,也能够做为它的输入字。若是某个地址端口上的值为特殊标识符0xF,则代表不须要访问寄存器。
在现代逻辑设计中,电路延迟以微微秒,也就是10的负12次方秒为单位来计算。
为了更好地理解流水线是怎样工做的,详细看看流水线计算的时序和操做。图4-34是三阶段流水线的流水线图,流水线阶段之间的指令转移是由时钟信号来控制的"每隔120ps,信号从0上升至1开始下一组流水线阶段的计算。
做为实现流水线化设计的一个过渡步骤,咱们必须稍微调整一下SEQ中五个阶段的顺序,使得更新PC阶段在一个时钟周期开始时执行,而不是结束时才执行。只须要对总体硬件结构作最小的改动,对于流水线阶段中的活动的时序,它能工做得更好。咱们称这和修改过的设计为“SEQ+”。咱们移动PC阶段,使得它的逻辑在时钟周期开始时活动,使它计算当前指令的PC值。
顺序实现SEQ和SEQ+在一个时刻只处理一条指令。在流水线化的设计中,与各个指令相关联的值有多个版本,会随着指令一块儿流过系统。咱们须要很当心以确保使用的是正确版本确版本的信号,不然会致使很严重的错误。经过在信号名前面加上大写的流水线寄存器名字做为前缀,存储在流水线寄存器中的信号能够惟一的被标识。
在PIPE―设计中,咱们采起了一些措施来正确处理控制相关。流水线化设计的目的就是每一个时钟周期都发射一条新指令,也就是说每一个时钟周期都有一条新指令进入执行阶段并最终完成。要是达到这个目的就意味着吞吐量是每一个时钟周期一条指令。要作到这一点,咱们必须在取出当前指令以后,立刻肯定下一条指令的位置。不幸的是,若是取出的指令是条件分支指令,要到几个周期后,也就是指令经过执行阶段以后,咱们才能知道是否要选择分支。相似地,若是取出的指令是ret,要到指令经过访存阶段,才能肯定返回地址。
PIPE-结构是建立一个流水线化的Y86处理器的好开端。不过,回忆4.44节中的讨论,将流水线技术引入一个带反馈的系统,当相邻指令同存在相关时会致使出现问题。在完成咱们的设计以前,必须解决这个问题。
这些相关有两种形式:
1)数据相关,下一条指令会用到这条指令计算出的结果;
2)控制相关,一条指令要肯定下一条指令的位置,例如在执行跳转、调用或返回指令时,这些相关可能会致使流水线产生计算错误,称为冒险。同相关同样,冒险也能够分为两类:数据冒险和控制冒险。
暂停是避免冒险的―种经常使用技术,暂停时,处理器会中止流水线中一条或多条指令,直到冒险条件再也不知足,让一条指令停顿在译码阶段,直到产生它的源操做数的指令经过了写回阶段,这样咱们的处理器就能避免数据冒险,。它对流水线控制逻辑作了一些简单的增强。当指令addl处于译码阶段时,流水线控制逻辑发现执行、访存或写回阶段中至少有―条指令会更新寄存器。
为了充分利用数据转发技术,咱们还能够将新计算出来的值从执行阶段传到译码阶段,以免程序prog4所须要的暂停。在周期4中,译码阶段逻辑发如今访存阶段中有对寄存器%edX未进行的写,并且执行阶段中ALU正在计算的值稍后也会写入寄存器%eaX。它能够将访存阶段中的值做为操做数Va1A也能够将ALU的输出做为操做数~Va1B,注意,使用ALU的输出不会致使任什么时候序问题,译码阶段只要在时钟周期结束以前产生信号Va1A和Va1B,在时钟上升开始下一个周期时,流水线寄存器E就能装载来自译码阶段的值,而在此以前ALU的输出已是合法的了。
有类数据冒险不能单纯用转发来解决,由于存储器在流水线发生的比较晚。
咱们的指令集体系结构包括三种不一样的内部产生的异常:1:)halt指令,2)有非法指令和功能码组合的指令, 3)取指或数据读写试图访问一个非法地址。正确处理异常是任何微处理器设计中颇有挑战性的一面。异常可能出如今不可预测的时间,须要明确的中断经过处理器流水线的指令流。
如今准备建立流水线控制逻辑,以完成咱们的PIPE设计。这个逻辑必须处理如下4种控制状况,这些状况是其余机制(例如数据转发和分支预测)不能能处理的:
处理ret:流水线必须暂停直到ret指令到达写回阶段。
加载/使用冒险:流水线必须暂停一个周期。
预测错误的分支:在分支逻辑发现不该该选择分支以前,分支目标处的几条指令已经进流水线了。必须从流水线中去掉这些指令。
异常:当―条指令致使异常,咱们想要禁止后面的指令更新程序员可见的状态,并睏异常指令到达写回阶段时,中止执行。
咱们先浏览每种状况所指望的行为,而后再设计处理这些状况的控制逻辑。
咱们能够看到,全部须要流水线控制逻辑进行特殊处理的条件,都会致使流水线不可以实现每一个时钟周期发射一条新指令的目标。咱们能够经过肯定往流水线中插入气泡的频率,来衡量这种效率的损失。由于插入气泡会引起未使用的流水线周期。一条返回指令会产生三个气泡,一个加载/使用冒险会产生一个,而一个预测错误的分支会产生两个。
构建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
YIS测试:
cd y86-code
进入测试代码,教材p239页代码为asuml.ys,能够经过
make asuml.yo
进行汇编,asuml.yo就是汇编后的结果,见教材p238。
make all
能够汇编运行全部代码结果。
在实验楼中没法解析主机地址
还有不太清楚实验楼中第一项任务的要求。
解决方法:在答疑论坛中看到了同窗的提问和老师的回复。
实验楼普通用户不能联外网,因此不能够解析外部的网址,目前外网权限只对会员开放了。老师在实验楼工做人员的帮助下,已经修改了实验指导书,把外网地址改为内网地址了。