微码指令系统,是在CISC结构下,运行一些功能复杂的指令时,所分解一系列相对简单的指令,是计算机体系结构最基本的特征。
一种堆栈型Java处理器的流水线设计针对嵌入式系统特点,设计了一种四段流水线堆栈型Java微处理器核。使用双口RAM作为Java栈,减小了存储资源的消耗。通过硬件在一个时钟周期内直接执行Java虚拟机(JVM)中大多数简单的算术/逻辑指令;通过微代码模拟在若干时钟周期内完成中等复杂指令处理;提供硬件陷阱机制,以支持;JVM中非常复杂和面向对象指令的软件仿真。综合硬件资源和运行效率两方面的需求可灵活选择不同的指令实现方式,为Java处理器在PFGA中的移植实现提供方便。1
Java虚拟机及其指令系统Java是由面向对象语言规范、标准API及Java虚拟机规范构成的系统,其中Java虚拟机是经过Java编译器编译后的字节码与目标机之间的标准接口。Java虚拟机指令系统包括大约200条不同的指令,该指令系统与传统的微处理器指令系统有很大区别,主要表现在:
(1) 面向堆栈:JVM的堆栈的作用类似于RISC处理器中的寄存器,是整个系统数据操作和数据交换的核心,指令默认的源操作数和目的地址都位于堆栈顶部的若干单元,因此消除了指令中的寄存器地址,使得Java程序的平均动态指令长度为1.38个字节回;
(2) 面向对象的特性:主要包括对象创建、访问对象域、方法调用和返回、对象类型和异常检查等面向对象特性的指令 ,这类似于高级语言特性的指令给JVM的硬件移植带来了较大的困难;
(3)虚拟地址访问特性:JVM在访问指令空间和数据空间时都采用虚拟地址,根据指针索引 采用相对寻址方式或者字符串匹配的查找方式访问存储器。
每个Java虚拟机线程都有它自己的程序计数器(PC),对应一 个Java栈(Java Stack)。在任何时间,每个Java虚拟机执行一个方法的代码。该方法是该线程的方法。每个Java方法调用将创建一个新的框架(Frame),JVM框架用于存储数据和部分结果以及进行动态链接、返回方法的值和异常调度。
框架包含的一组称为它的局部变量的字,可以从该数组的根按照字偏移寻址。框架包含的操作数栈是方法的工作栈。另据研究发现JVM中对象访问指令的动态频度与运行时间比较都较大,另 外一类复杂指令方法调用与返回指令的动态频度虽然比较 小,但是占用了较大比例的运行时间,需要进行有效的支持图。1
JVM-0 的流水线设计JVM指令集中各条指令有很大差别。有一些很简单的如在栈顶操作的算术和逻辑运算指令,另外也有一些具有高级语言特性的指令例如new和invokestatic这样的类装载和校验指令。由于这些差异性,并非所有的JVM指令都可以移植到硬件中。
在Sun的Java处理器PicoJava一║中使用的一种常用方法就是硬件执行一部分JVM指令,剩下的一些复杂指令通过陷阱(TraP)调用软件方法执行。
JP一01对于这个问题采用了不同的解决方案。JP一01拥有自己的指令集。有一些指令和JVM指令是一一对应的,可以在一个时钟周期内完成。对于较为复杂的JVM指令是通过一序列的JP一01指令进行模拟执行,每一个Java字节码指令都对应着一个一 个微码序列的起始地址(microcode)。另外一 些具有面向对象特性的指令则提供硬件陷阱机制采用软件方法进行模拟执行。如果字节码有对应的JP一01指令,它将在一个周期内执行完成并进行下一个字节码的执行。
对于较为复杂的字节码,JP一01将执行接下来的微码指令序列。当微码指令执行结束以后通过一个nextbc。指令返回 ,这个指令翻译过程需要一段额外的流水线。堆栈结构处理器具有较短的流水线,因此指令分支延迟也较小。
JP一01处理器的流水线是整个流水线设计方案。JP一01核心具有3 段流水线用来执行JP一01指令,另外有一段额外的流水线用来执行Java字节码到微码序列地址的转换。每周期可以完成一条JP一01指令。条件转移指令会引起两个周期的延迟,为了简化设计 ,当指令转移发生或者需要访问外部存储器时采用暂停流水线的处理方式。
该流水线阶段从程序存储器中取出字节码中的JVM指令通过微码指令查找表获得对应的微码序列地址,同时将获取的可能包含立即数的字节码存储在操作数寄存器中作为操作数使用。流水线第2段获取JP一01的微码指令。PJ一01的微码指令存储在微码ROM中。正常执行中微码指令计数器是递增的。如果pc指向的下一条指令是nextbc,则表示该微码指令序列执行结束,需要从第1段获取新的指令。流水线第3段包括译码和地址产生两个功能,对PJ一01微码指令进行译码产生控制信号,同时产生读写存储器地址的偏移量,偏移量结合内部存储器的堆栈指针或者外部存储器中方法的常数池指针、方法区指针从而生成存储器访问的物理地址。
流水线第4段是PJ一01微码指令执行段。由于JVM所有的算术/逻辑操作都是对操作数栈栈顶进行操作,因此将堆栈栈顶(TOS)和次栈顶(TOS一1) 分别作为寄存器A和寄存器B,将A、B作为源操作寄存器,A作为目的寄存器。所有的Laod操作,包括对于局部变量、内部寄存器以及外部存储器的操作,都将操作数载入A寄存器。因此就不需要租RISC结构处理器中常见的回写流水线阶段。1
介绍一种32位微处理机—MicroVAX 78032芯片介绍 美国DEC于1985年推出的Micro AX║系统的CPU芯片一Micro VAX78032介绍开发该芯片的背景和设计目标,所采用的压缩设计的技术途径,设计过程情况,最终芯片设计,该芯片的功能结构及其物理实现。2
压缩设计的技术途径78032设计中的原则问题是怎样在单个芯片上实现VAX体系结构的复杂性。它具有304条指令的指令系统 ,1 4种数据类型和21种寻址方式。指令长度在1字节到54字节之间变化。要求请求式页面虚拟存储器支持,以便确保与操作系统软件的兼容性。为适应这种复杂性 ,在整个一片VLSl VAX实现中要求有1. 25M个晶体管穴位。然而,在设计该芯片时的半导体技术,在单片微处理机中仅能达到其十分之 一。
所有VAX系统中的体系结构功能是按软件、微码和操作系统划分的。所有先前的VAX实现,在这三方面都有相似的边界。硬件提供寄存器和存储器,微码提供指令系统,操作系统提供程序服务。贬要求一个容量很大的控制存储器— 最小要有400K位— 以便存放指令微码。用微码或 一个支援处理机来处理控制台功能。再者,控制逻辑要支持存储管理,而可变的指令格式又是相当复杂的。
为减少微处理机芯片上的晶体管数量,采取了两种不同的途径。第一,重新划分了VAX指令系统,将控制存储器的容量削减为62K位。第二,通过简化某些功能,把某些功能并入别的地方,或者省略某个整体部分,来减少片内硬件的数目。2
重新划分指令系统作为重新划分的第一步,设计小组假定所有VAX指令都必须实现以执行所有VAX应用软件为目的。然而,有若干类指令涉及大量微码但又不经常使用。例如,典型的分时工作负荷是由基本指令、面向科学计算的指令和面向商业的指令处理的。通过对70M次以上的指令执行的分析表明,面向商业的指令仅占总执行数的0.2%。对科学计算和工程设计工作负荷的研究表明,其百分比更低。甚至在商业应用中,面向商用的指令的执行率低于总执行数的4%,多数情况下还是用基本指令。因此,在操作系统中仿真商用指令,而不是采用微码实现,便有效地缩小了控制存储器的容量; 但是由于这些指令不经常执行,所以对性能的影响甚微。
另一方面,浮点指令需要大量的微码,并且经常被执行。在用微码的情况下,浮点指令的执行速度是相对低的,除非采用单独的浮点加速器(FPA)。因此,尽管现存的VAX 实现给出微码执行和硬件浮点二者,设计小组仍然决定不用微码实现这些指令。取而代之的是用可选的浮点芯片来执行浮点指令,或者用微码仿真。
总之,用片内微码实现了304条VAX指令中的175 条,14种数据类型中的6种。其中包括整数和逻辑指令,可变位字段、控制、队列、过程调用、字符串传送、以及操作系统支持。这种微码指令子集包含了典型程序执行中所用的指令的98%以上。然而,微码仅占一个完整的VAX实现的控制存储器空间1/5的。当使用浮点芯片时,它执行七十条浮点指令和三种数据类型(F、D和G浮点 )。如果不用浮点片,则用微码仿真这些指令。余下的59条指令和五种数据类型始终都是用微码仿真的。其主要是十进制串、字符串和H浮点操作。CPU片为仿真的指令提供某种微码支持。指令系统归纳了78032芯片的指令系统。
决定用微码仿真指令,对速度是有影响的,因为仿真指令执行的时间比微码指令执行时间长三到十倍。但是,这组59条指令是不常用的,它对典型程序的执行速度的降低不超过4%。指令的划分示出了CPU芯片、FPU芯片和宏代码之间的指令划分。最重要的是,由于控制存储器的容量五倍地缩小,使芯片的工作面积减半。2
本词条内容贡献者为:
王沛 - 副教授、副研究员 - 中国科学院工程热物理研究所