处理器体系结构

Y86指令集体系结构

4.1.1 程序员可见的状态:

        Y86程序中的每条指令都会读取或者修改处理器状态的某些部分。

        这里的“程序员”既可以是用汇编代码写程序的人,也可以是产生机器级代码的编译器。

        Y86的处理器类似于IA32.有八个程序寄存器:%eax.%edx.%ebx.%esi.%edi.%esp和%ebp。

        存储器:

                 从概念来说就是一个很大的字节数组,保存着程序和数据。Y86程序用虚拟地址来引用存储器位置。硬件和操作系统软件联合起来将虚拟地址翻译成实际或者物理地址,指明数据实际保存在存储器的那个地方。

4.1.2 Y86指令:

        IA32的movl指令分成了4个不同的指令:

                                                         irmovl .  rrmovl . mrmovl . rmmovl

       源可以是:

                 立即数.寄存器.存储器.

       在地址计算中,我们不支持第二变址寄存器和任何寄存器值的伸缩.

       4个整数操作指令:

                             addl . subl. andl . xorl.

       7个跳转指令:

                          jmp . jle .jl .je .jne .jge .jg.

       6个条件传送指令:

                          cmovle .  cmovl . cmove . cmovne . cmovge . cmovg

       call指令将返回地址入栈,然后跳到目的地址.

       pushl和popl指令实现入栈和出栈.

       halt指令停止指令的执行.

4.1.5 Y86程序:

       Y86汇编程序与IA32汇编程序的比较。Sum函数计算一个整数数组的和。Y86代码与IA32代码的主要的区别在于,它可能需要多条指令来执行一条IA32指令所完成的功能。

      一个指令集模拟器,称为YIS,它的目的是模拟Y86机器代码程序的执行,而不用去试图去模拟任何具体处理器实现的行为。这种形式的模拟有助于在有实际硬件可用之前调试程序,也有助于检查模拟硬件或者在硬件上运行程序的结果。

4.1.6一些Y86指令的详情:

       pushl指令会把栈指针减4,并且将一个寄存器的值写入存储器中。因此,当执行pushl%esp指令时,处理器的行为是不确定的,因为要入栈的寄存器会被同一条指令修改。通常有两种约定:

        1) 压入%esp的原始值

        2)压入减去4的%esp的值

4.2逻辑设计和硬件控制语言HCL

4.2.1逻辑门:

       逻辑门是数字电路的基本计算元素。

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

       构建逻辑门的网有两条限制:

              1)两个或者多个逻辑门的输出不能连接在一起。否则它们可能会使线上的信号矛盾,可能会导致一个不合法的电压或者电路电路故障;

              2)这个网必须是无环的。这也就是网中不能有路径经过一系列的门而形成一个回路,这样的回路会导致该网络计算的函数有歧义。

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

         通过将逻辑门组合成大的网,可以构造出能计算更加复杂函数的组合电路。通常,我们设计能对数据字进行操作的电路。有一些位级信号,代表一个整数或一些控制模式。

         执行字级计算的组合电路根据输入字的各个位,用逻辑门来计算输出字的各个位。

         处理器中会用到很多种多路复用器。

         允许不互相排斥的选择表达式使得HCL代码的可读性更好。

         选择表达式可以是任意的布尔表达式,可以有任意多的情况。

4.2.4集合关系:

       判断集合关系的通用格式是:

       iexpr in{iexper1,iexpr2,...,iexperk}

      在这里被测试的值iexpr和待匹配的值iexper1~iexprk都是整数表达式。

4.2.5存储器和时钟:

       时钟寄存器

       随机访问存储器

4.3Y86的顺序实现

4.3.1将处理组织成阶段:
          取指:

                 取指阶段从存储器读取指令字节,地址为程序计算器的值。

         译码:

                 译码阶段从寄存器文件读入最多两个操作数。

         执行:

                在执行阶段,算术/逻辑单元要么执行指令指明的操作,计算存储器引用的有效地址,要么增加或者减少栈指针。

         访问:

               访问阶段可以将数据写入存储器,或者从存储器读出数据。

        写回:

              写回阶段最多可以写两个结果到寄存器文件。

        更新PC:

              将PC设置成下一条指令的地址。

 P252跟踪subl指令的执行

 P254跟踪rmmovl指令的执行

 P255跟踪pushl指令的执行

 P256跟踪je指令的执行

 P257跟踪ret指令的执行

4.3.2 SEQ硬件结构:

         取指:

           将程序计数器寄存器作为地址,指令存储器读取指令的字节。

       译码:

           寄存器文件有两个读端口A和B,同时读寄存器的值vala和valb

      执行:

          执行阶段会根据指令的类型,将算术/逻辑单元用于不同的目的。

      访问:

          在执行访问操作时,数据存储器读出或写入一个存储字。

      写回:

          寄存器文件有两个端口。E用来写入ALU计算出来的值,而端口M用写从数据存储器中读出的值。

4.3.3SEQ的时序:

        处理器从来不需要为了完成一条指令的执行而去读由该指令更新了的状态。

4.3.4 SEQ阶段的实现:

     1.取指阶段

    2.译码和写回阶段

     3.执行阶段

     4.访存阶段

     5.更新PC阶段

     6.SEQ小结

4.4流水线的通用原理

4.4.1计算流水线:

            最大吞吐量:
                             3.12GIPS

4.4.2流水线操作的详细说明:
          我们可以知道,减缓时钟不会影响流水线的行为。

         根据对SEQ处理器的讨论,我们看到这种组合逻辑块之间采用时钟寄存器的简单机制,足够控制流水线中的指令流。随着时钟周而复始地上升和下降,不同的指令就会通过流水线的各个阶段,不会互相干扰。

4.4.3流水线的局域性

    1.不一致的划分

 2.流水线过深,收益反而下降

4.4.4带反馈的流水线系统:

    当我们将流水线技术引入Y86处理器时,必须正确处理反馈的影响。

4.5Y86的流水线实现

4.5.1SEQ+:重新安排计算阶段

         作为实现流水线设计的一个过渡过程,我们必须稍微调整一下SEQ中的五个阶段的顺序,使得更新PC阶段在一个时钟周期开始时执行,而不是结束时才执行。只需要对整体硬件结构做最小的改动。

4.5.2插流水线寄存器:

       流水线寄存器按一下方式标号:

          F

          D

          E

          M

         W

4.5.3 对信号进行重新排列和标号:

       信号M_stat和m_stat的差别

4.5.4 预测下一个PC

4.5.5流水线冒险:
       列举数据冒险的类型:

               程序寄存器

               程序计数器

               存储器

               条件码寄存器

               状态寄存器

4.5.6 用暂停来避免数据冒险

4.5.7用转发来避免数据冒险

4.5.8加载/使用数据冒险

4.5.9 异常处理

4.5.10 PIPE各阶段的实现:

        1.PC选择和取指阶段

        2.译码和写回阶段

        3.执行阶段

        4.访存阶段

4.5.11流水线控制逻辑

      处理ret

      加载/使用冒险

      预测错误的分支

      异常

1.特殊控制情况所期望的处理

2.发现特殊控制条件

3.流水线控制机制

4.控制条件的组合

4.5.12 性能分析

4.5.13 未完成的工作:

     1.多周期指令

     2.与存储系统的接口。