标签:
定义一个指令集体系结构,例如Y86,包括定义各种状态元素、指令集和他们的编码、一组变成规范和异常事件处理。
1程序员可见的状态:Y86中每条指令都会读取或修改处理器状态的某些部分。这里的“程序员”既可以是用汇编代码写程序的人,也可以是产生机器代码的编译器。
Y86的处理器状态类似IA32。有8个程序寄存器:%eax,%ecx,%edx,%ebx,%esi,%esp和%ebp。处理器的每个程序寄存器存储一个字。
2存储器,从概念上来说是一个很大的字节数组,保存着程序和数据。Y86程序用虚拟地址来引用存储器位置。硬件和操作系统软件联合起来将虚拟地址翻译成实际或物理地址,指明数据实际保存在存储器那个地方。
Y86指令集基本上是IA32指令集的一个子集。它只包括四字节整数操作、寻址方式比较少、操作也较少。因为只有四字节数据,所以称之为“字”不会有任何歧义。
左边是指令的汇编码表示,右边是字节编码。汇编码格式类似于IA32的ATT格式。
1.在movl指令中,指令名字的第一个字母就表明了源类型。指令第二个字母指明了目的类型。立即数(i)、寄存器(r)、存储器(m)。两个存储器传送指令中的存储器引用方式是简单地基址和偏移量形式。在地址计算中,不支持第二变址寄存器和任何寄存器值的伸缩。不允许从一个存储器地址直接传送到另一个存储器地址,也不允许将立即数传送到存储器。
2.addl,subl,andl,xorl是四个整数操作指令,Y86中只允许对寄存器数据进行操作(IA32中还允许对存储器数据进行操作),这些指令会设置条件码ZF、SF、OF。
3.jmp,jle,jl,je,jne,jge,jg是七个跳转指令,根据分支指令的类型和条件码的设置来选择分支。
4.cmovle,cmovl,cmove,cmovne,cmovge,cmovg是六个条件传送指令,这些指令的格式与寄存器-寄存器传送指令rrmovl一样,但只有当条件码满足所需要的约束时,才会更新目的寄存器的值。
5.call指令将返回地址入栈,然后跳到目的地址。ret指令从这样的过程调用中返回。
6.pushl和popl指令实现了入栈和出栈。
7.halt指令停止指令的执行(IA32中的指令hlt)。IA32中应用程序不允许使用这条指令,因为它会导致整个系统暂停运行。对于Y86而言,执行halt指令会导致处理器停止,并将状态码设置为HLT。
1.每条指令需要1~6个字节不等,这取决于需要哪些字段。
2.86中的寄存器编号跟IA32中的相同。程序寄存器存在CPU中的一个寄存器文件中,这个寄存器文件就
是一个小的、以寄存器ID作为地址的随机访问存储器。在指令编码中以及在我们的硬件设计中,当需要指明不应访问任何寄存器时,就用ID值0xF来表示。
3.有的指令只有一个字节长,而有的需要操作数的指令编码就更长一些。首先,可能有附加的寄存器指示符字节,指定一个或两个寄存器。
4.指令的汇编代码表示中可以看到,根据指令类型,指令可以指定用于数据源和目的的寄存器,或是用于地址计算的基址寄存器。没有寄存器操作数的指令,例如分支指令和call指令,就没有寄存器指示符字节。那些只需要一个寄存器操作数的指令将另一个寄存器指示符设为OxF。这种约定在我们的处理器实现中非常有用。
5.有些指令需要一个附加的4字节常数字。
对于Y86,当遇到这些异常的时候,我们就简单的让处理器停业执行指令。
在更完整的设计中,处理器通常会调用一个异常处理程序,这个过程被指定用来处理遇到的某种类型的异常。
Y86代码与IA32代码的主要区别在于,它可能需要多条指令来执行一条IA32指令所完成的功能。
Y86没有伸缩寻址模式。
命令指明应该将代码或数据放在什么位置,以及如何对齐。这个程序详细说明了栈的防治、数据初始化、程序初始化和程序结束等问题。
以“.”开头的词是汇编命令,他们告诉汇编器调整地址,以便在那儿产生代码或插入一些数据。命令.pos0告诉编译器应该从地址0处开始产生代码。这个地址是所有Y86程序的起点。
创建Y86代码的唯一工具是汇编器。
指令集模拟器YIS的目的是模拟Y86机器代码程序的执行,而不用试图去模拟任何具体处理器实现的行为。这种形式的模拟有助于在实际硬件可用之前调试程序,也有助于检查模拟硬件或者在硬件上运行程序的结果。
一些Y86指令的详情
大多数Y86指令是以一种直接的方式修改程序状态的。
6 一些Y86的详情
1逻辑门
1.逻辑门产生的输出:等于它们输入位值的某个布尔函数。
2.对应的HCL表达式:
AND 用&&表示 OR 用||表示 NOT 用!表示
3.注意:逻辑门只对单个位的数进行操作,而不是整个字。
逻辑门总是活动的,输入变化输出很快就跟着变化。
参考C语言中运算符(2.1.9节)
2组合电路和HCL布尔表达式
1.构建计算块(称为组合电路)的限制
1两个或多个逻辑门的输出不能连接在一起 2必须无环
2.组合逻辑电路和c语言中逻辑表达式的区别
1组合电路的输出会持续响应输入变化,c语言表达式只有在执行过程中被遇到才求值
2逻辑门只对0和1操作,c语言表达式中参数可以是任意整数,0是FALSE,不是0的都是TRUE
3C 的逻辑表达式有个属性就是他们可能只被部分求值
3字级的组合电路和HCL整数表达式
1.关于HCL的几点说明 HCL中所有字级的信号都声明为int;
在画字级电路的时候,用中等粗度的线表示携带字的每个位的线路,用虚线来表示布尔信号的结果
在HCL中,表示默认情况(即所有条件都没有被选中的情况)一般用1
2.多路复用函数的情况表达式描述
[
select_1 : expr_1
select_2 : expr_2
.......
select_k : expr_k
]
从逻辑上讲,这些选择表达式是顺序求值的。
4集合关系
判断集合关系的通用格式是:iexpr in {iexpr1,iexpr2,...,iexprk}
注意:被测试的值iexpr和带匹配的值iexprk等都是整数表达式
5存储器和时钟
时序电路两类存储器设备:
(1)时钟寄存器(简称寄存器):储存单个位或字。时钟信号控制寄存器加载输入值
(2)随机访问储存器(简称储存器):储存多个字,用地址选择该读或写哪个字
下面是关于各个阶段以及各阶段内执行操作的简略描述:
取指:取指阶段从存储器读取指令字节,地址为程序计数器(PC)的值。
译码:译码阶段从寄存器文件读入最多两个操作数,得到val A/val B.
执行:执行阶段,算术/逻辑单元要么执行指令明确的操作(根据ifun的值),计算存储器引用的有效地址,要么增加或减少栈指针。得到的值称为valE
访存:访存阶段可将数据写入存储器或从存储器读出数据
写回:最多可写两个结果到存储器。
更新PC:将PC设置成下一指令的地址。
SEQ的实现包括组合逻辑和两种存储器设备:时钟寄存器,随机访问存储器(寄存器文件、指令存储器和数据存储器)。组合逻辑不需要任何时序或控制。对于较小的存储器来说(例如寄存器文件)这是一个合理的假设,而对于较大的电路来说,可以用特殊的时钟电路来模拟这个效果。由于指令存储器只用来读指令,因此我们可以将这个单元看成是组合逻辑。
寄存器文件有四个端口,它支持同时进行两个读(在端口A和B上)和两个写(在端口E和M)。每个端口都有一个地址连接和―个数据连接,地址连接是一个寄存器ID,而数据连接是一组32根线路,既可以作为寄存器文件的输出字,也可以作为它的输入字。如果某个地址端口上的值为特殊标识符0xF,则表明不需要访问寄存器。
在现代逻辑设计中,电路延迟以微微秒,也就是10的负12次方秒为单位来计算。
为了更好地理解流水线是怎样工作的,详细看看流水线计算的时序和操作。图4-34是三阶段流水线的流水线图,流水线阶段之间的指令转移是由时钟信号来控制的"每隔120ps,信号从0上升至1开始下一组流水线阶段的计算。
标签:
原文地址:http://www.cnblogs.com/1551127024hwy/p/4889411.html