基于FPGA的M2M异构虚拟化系统(一)
扫描二维码
随时随地手机看文章
摘要
在多核体系构架与并行计算时代,尤其是云计算的出现,虚拟化技术正迅速发展成为计算系统中的一项核心技术。虚拟化技术提供了系统层次之间的抽象化,并将资源以一个或多个虚拟的运行环境提供给用户。目前对虚拟化的研究工作主要关注于资源的分割,独立和封装等研究点,但主要在一个特定处理器体系结构以及处理器同构的前提下。
本项目提出一种新颖的M2M(Multiple ISAs applications to Multiple heter-ogeneous core,M2M)概念,将虚拟化系统分为多核异构层、虚拟化管理层、二进制翻译层、软件应用层四个层次,创新地在传统的虚拟化管理层上增加二进制翻译层,从而引入多个不同体系结构的应用程序,虚拟化管理器调度分配给硬件层引入的异构处理器。M2M的特性使虚拟化系统上层应用的灵活性大大增加,并且硬件异构化也使系统的效率有效提升。
本项目主要贡献点和创新点有:
多指令集体系应用虚拟环境。在应用层提供不同指令集体系构架的虚拟运行环境,以支持不同应用系统的应用程序。
软硬协同的二进制翻译层。在二进制翻译层,采用软硬协同的方式实现不同架构体系间的动态二进制翻译,提高硬件目标代码生成和运行的性能和灵活性。
设计实现了自主可扩展32位的SoC核。在多核异构层,设计了一个自主,可扩展,可配置的32位RISC处理器。基于此处理器核可配置实现多个RISC SoC平台(QS-I)。本项目在XUP Virtex-5和Digilent Nexys3 FPGA开发平台构建了多核异构层。
动态虚拟化管理。在虚拟化管理层,以轻量级的方式实现了系统资源与上层应用的管理。通过资源管理与任务调度动态分配或迁移运行任务。虚拟层的多个体系结构的应用程序(如x86和MIPS)可动态运行于异构的处理器核上(如处理能力不同的MIPS核)。
提供了系统库和运行程序。在软件应用层,为自主设计的QS-I平台提供完善的程序运行环境并设计了多样化的应用程序。项目完全自主地设计实现了系统库(如图形库、I/O库)以及典型的多样化应用软件,包括MIPS下的吃豆子游戏、X86下的推箱子游戏。
1.项目背景
在计算机科学领域中,虚拟化代表着对计算资源的抽象,而不仅仅局限于虚拟机的概念,实现虚拟化的方法不止一种,无论何种方法都是以不同层次的抽象来实现某一视角对应的效果。
1.1.项目需求
虚拟化技术正迅速发展成为计算系统中的一项核心技术,它提供了计算机系统层次之间的抽象层,并将资源分配以提供一个或多个虚拟的运行环境。现在对虚拟化的研究工作主要关注于资源的分割,独立和封装等研究点,但主要在一个特定处理器体系结构以及处理器同构的前提下。本项目提出一种新颖的M2M(Multiple ISAs applications to Multiple heterogeneous core,M2M)概念,将虚拟化系统分为多核异构层、虚拟化管理层、二进制翻译层、软件应用层四个层次,创新地在传统的虚拟化管理层上增加二进制翻译层,从而引入多个不同体系结构的应用程序,并在硬件层引入处理器的异构性。M2M的特性使虚拟化系统的上层应用的灵活性大大增加,并且硬件异构化也使系统的效率有效提升。
1.2.相关技术及其发展现状
本小节将介绍虚拟化以及动态翻译等技术的基本概念及其发展现状。
1.2.1.虚拟化技术的基本概念
虚拟化技术最早可以追溯到上个世纪60年代,IBM公司的System 360系统对运行多个虚拟化系统进行了最早的尝试。如今,虚拟化技术正迅速发展成为计算机系统中的一项核心技术,它提供了计算机系统层次之间的抽象层,并将资源分配以提供一个或多个虚拟的运行环境。
例如计算机系统可分为如图 1中所示的四个层次,由最底层的硬件自下而上分别是操作系统、用户库、应用程序。相应地,虚拟化技术可以针对各个层次进行抽象虚拟,从而为上一层的应用提供一个或多个虚拟环境。
图 1 计算机系统的四个层次
更具体地,虚拟化的层次可分为如图 2所示的指令集架构(ISA)、硬件抽象层(HAL)、操作系统、用户级库、应用程序的五个层次。图 2中还在各个层次下方列出了与其对应的知名产品。
图 2 虚拟化技术的五个层次及其相应产品
1.2.2.ISA层的虚拟化技术
ISA层的虚拟化是虚拟化技术中的一个重要内容,它的主要目的是为上层应用提供一个或多个不同于物理层实际处理器ISA的ISA抽象层,从而使得多个处理器架构的应用程序能够在同一个处理器上运行,如图 3所示。
图 3 ISA层的虚拟化
ISA层虚拟化所产生的异构性使处理器本身的性能得到提高[1]。同时,x86架构凭借其强大的软硬件支持,仍将在未来的处理器竞争中占有统治地位[2] 。本项目将重点实现不同ISA(x86和MIPS)之间的虚拟化技术,使该RISC处理器与x86架构达到二进制兼容。
1.2.3.动态翻译技术
在ISA层的虚拟化中,二进制翻译是最重要的实现技术。二进制翻译是指把一中体系结构的机器码翻译成为另一种体系结构的机器码。通过二进制翻译,体系结构将成为一个软件层,它使得复杂的遗留体系结构能够用简单的硬件来实现,并且使得新颖的体系结构能够兼容原来的软件;此外,二进制翻译能够促进软件的优化[3]。
二进制翻译有两种主要的实现方法,一种是静态翻译,另一种动态翻译。
静态翻译把整个二进制可执行文件翻译成目标体系结构的指令集,它不需要先运行代码,所有的翻译都在编译时完成。所以静态翻译很难做到正确性,因为不是所有的代码都能在编译时被翻译器发现。比如,可执行文件的某些部分只能通过间接跳转才能到达,而间接跳转的目标值只有在运行时才知道。
动态翻译把一小段源体系结构的代码翻译成目标体系结构的代码并把这一小段生成的代码缓存起来。只有当代码被运行时才开始执行翻译。跳转指令会被指定到已经翻译和缓存起来的代码段上。
2.项目目标及开发平台选择
2.1.项目目标及内容
本项目提出一种新颖的M2M(Multiple ISAs applications to Multiple heter-ogeneous core,M2M)概念,在虚拟化管理层上增加二进制翻译层,从而引入多个不同体系结构的应用程序,并在硬件层引入处理器的异构性。如图 4所示的项目总体层次包括多核异构层、虚拟化管理层、二进制翻译层以及软件应用层。
图 4 项目总体层次
本项目目标是基于Xilinx公司的XUP Virtex-5和Digilent的Nexys3 FPGA开发板实现多个RISC SoC平台建立硬件多核异构层;选择MIPS和x86 ISA构架设计吃豆子、俄罗斯方块等典型应用程序构成多样化应用场景,实现M2M原型系统。
具体任务如下:
多核异构层
实现MIPS基本指令集,支持精确中断,含一级Cache的32位RISC CPU的RTL描述及其验证;
完成VGA(或DVI)、PS/2、SRAM、UART等外设的控制器模块描述及各个模块的验证;
引入Wishbone总线,集成SoC平台的各个模块;
基于不同FPGA的RISC SoC平台(分别在XUP Vritex-5和Digilent Nexys3上基于自主软核QS-I搭建了RISC SoC平台),构建多核异构层
虚拟化管理层
对多核异构层的资源管理;
对应用层多样化程序的调度分配
二进制翻译层
以软硬件协同方式完成RISC处理器在ISA层对x86的虚拟化,使得RISC处理器能够与多架构(如x86)二进制兼容;
动态翻译的软件架构设计
软件应用层
系统软件编写。系统软件包括外设的驱动程序及系统控制程序;
运行环境及库编写。设计实现系统库(如图形库、I/O库);
应用软件编写。应用软件包括多个SoC完整应用系统(x86和MIPS),如简单的游戏程序。
2.2.开发平台选择
本项目主要选用Xilinx公司的XUP Virtex-5开发平台及Digilent公司的Nexys3开发平台。
2.2.1.XUP Virtex-5 FPGA开发平台简介
XUP Virtex5是集成了OpenSparcT1开源微处理器的一个强大系统。其丰富的特色以及开发平台的通用性,使得该板卡非常适合在教学及研究的领域搭建各种系统。如数字设计、嵌入式系统、通讯系统、网络、视频及图像处理等各个领域。XUP Virtex-5实体图见图 5,其资源模块图如图 6所示。XUP Virtex-5含有丰富的片上资源以及完整的工业标准接口。
图 5 XUP Virtex-5 FPGA开发平台
图 6 XUP Virtex-5平台资源模块
本项目基于XUP Virtex-5 FPGA开发平台构建了基于自主软核QS-I的RISC SoC平台。
2.2.2.Digilent Nexys3 FPGA开发平台简介
Digilent公司的Nexys3平台是一个基于Xilinx Sparten-6 FPGA的完整,易用的数字电路开发平台。Sparten-6 FPGA为高性能逻辑设计做了充分优化,其片内的block RAM,时钟管理模块,DSP等资源为高级逻辑设计提供了必要硬件基础。Nexys3实体图见图 7,其平台资源模块如图 8。
图 7 Digilent Nexys3 FPGA开发平台
图 8 Digilent Nexys3平台资源模块[!--empirenews.page--]
本项目基于Digilent Nexys3 FPGA开发平台构建了基于自主软核QS-I的RISC SoC平台。
3.总体设计方案说明
3.1.1.系统总体框架及关键技术分析
本项目的总体框架如图 9,实现时采用V5-MIPS core和N3-MIPS core构成异构原型。
图 9 项目总体框架图
项目的关键技术包括:
多核异构层
32位RISC处理器的结构竞争、控制竞争、数据竞争三大竞争的解决以及扩展CPU指令集,支持GNU的mips_elf_gcc编译器等开源工具链
流水线中的精确中断及异常的实现
CPU的Cache设计:
Cache的映射策略
Cache的写策略
CPU和各个外设模块对Wishbone总线的集成:
CPU的对外接口设计
各个外设符合Wishbone协议的接口设计
各个模块与总线的集成
基于不同FPGA的RISC SoC平台(分别在XUP Vritex-5和Digilent Nexys3上基于自主软核QS-I搭建了RISC SoC平台),构建多核异构层。基于单个核的可扩展SoC框架核心如图 10
图 10 RISC SoC
虚拟化管理层
对多核异构层的资源管理策略;
对应用层程序的调度分配策略
二进制翻译层
以基本块为翻译单位的动态翻译实现
寄存器的映射
Big endian(MIPS)与little endian(x86)
X86标志位处理
x86中断及系统调用的模拟
转移分发器
翻译块管理
软件应用层
SoC系统软件模块
各个外设模块的驱动程序
3.1.2.RISC CPU(QS-I)结构
RISC CPU(QS-I)的总体框架如图 11所示。QS-I中的整数流水线采用Fetch à Decode à Execute à Memory à Writeback的五级流水线结构。QS-I中采用哈佛结构的指令Cache和数据Cache。此外,为了加速ISA层虚拟化的动态翻译实现,QS-I中含有专门的硬件模块以加速动态翻译。
图 11 RISC CPU(QS-I)总体框架图
3.1.3.动态翻译策略与方案
图 12 动态翻译及执行架构图
二进制动态翻译及执行架构如图 12所示,主要有翻译及执行两个过程。翻译过程将源体系的程序进行翻译,生成新体系的程序。执行过程负责生成块在新体系下的运行。以8086转MIPS为例,源体系为8086,新体系为MIPS。图中SMEM代表的是源内存,保存的是8086可执行程序,TMEM代表的是目标内存,保存的是8086程序块翻译后得到的相应MIPS程序块。翻译过程是在MIPS环境中,翻译块的执行在虚拟环境中。两种环境的转换需要经过上下文切换。切换时,先保存当前状态,包括它自己的一套寄存器组,再载入新的状态。
跳转缓存为硬件模块,加速生成块的执行。跳转缓存保存的是对,SPC为某指令在SMEM中的地址,TPC则是在TMEM中相应的地址。在执行生成块遇到转移跳转指令时,根据SPC在跳转缓存中找对应的TPC,以继续执行生成块。
3.1.4.Wishbone总线及基本外设
Wishbone 总线最先是由Silicon公司提出,现在己被移交给OpenCores组织维护,它通过在IP核之间建立一个通用接口完成互联。可以用于在软核、固核以及硬核之间进行互联。
Wishbone规范具有如下特点:
简单、紧凑,需要很少的逻辑门
完整的普通数据据传输总线协议,包括单个读写传输周期和事件周期
支持大端数据和小端数据,接口自动完成两者之间的转换
支持存储器映射、FIFO存储器、交叉互联
采用握手协议,允许速率控制,可以达到每个时钟周期进行一次数据传输
支持普通周期结束、重试结束、错误结束等总线周期形式,支持用户自定义的标志
采用MASTER/SLAVE体系结构,支持多点进程(Multi-MASTER)
支持各种各样的IP核互联,包括USB、双向总线、复用器互联等
相对于其他的IP核接口规范来说,Wishbone接口规范具有简单、开放、高效、利于实现等特点而且完全免费,并没有专利保护。基于上述优点,因此采用Wishbone总线进行接口设计。
QS-I 硬件系统在团队自主研发的MIPS体系结构5级流水CPU的基础上,采用Wishbone开源总线,将主存、显示器、键盘、RS232等外部设备与CPU进行互联。CPU作为Wishbone开源总线MASTER/SLAVE体系结构中的MASTER设备,向总线发起访问外设的请求;Wishbone总线接收来自CPU的访问请求和访问命令,向外设发起访问请求;外设相应请求后,数据通过Wishbone总线传给CPU。采用Wishbone总线后,系统能够高效的访问各种外设,而且具有较好的可扩展性,比如在Wishbone开源总线MASTER/SLAVE体系结构中,MASTER设备和SLAVE设备都是可已同时联接多个的,总线会解决相关的访问冲突。
下文将介绍Wishbone开源总线的相关信号的定义及作用。
图 13 Wishbone总线规范中使用的主要信号
所有的Wishbone接口信号都是高电平有效,设计成高电平有效的主要原因是由于低电平有效信号的书写问题,不同的设计者表达低电平有效信号的方式不同,拿最常见的低电平有效的复位信号来说,其表示方法就有_RST_I、N_RST_I、#RST_I和/RST_I,而高电平有效的信号其表达方式通常只有一种。所有的Wishbone接口信号都以_I或者_O结束。_I表示输入,_O表示输出。()表示该信号为总线信号,总线的宽度可以为1,也可以为大于1的任何值。
在图7中,主设备具有遵守Wishbone规范的主设备接口,从设备具有遵守Wishbone规范的从设备接口,INTERCON模块将主设备和从设备的对应数据、地址和控制线连接起来,SYSCON模块提供时钟和复位信号,这两个信号被送入主设备和从设备。图7给出了Wishbone接口的常见信号,这些信号有些是必须的,有些是可选的。这些信号的基本功能描述如下:
CLK_O/CLK_I:时钟信号。时钟信号由SYSCON模块产生,并送入各个主设备和从设备。SYSCON通常内部存在一个锁相环,将来源于芯片外的晶体振荡器或者时钟输入信号整形、分频或者倍频为芯片内所需要的时钟信号。所有Wishbone信号都同步到时钟信号上,包括复位信号。
RST_O/RST_I:同步复位信号,高电平有效。复位信号由SYSCON模块产生,并送入各主设备及从设备。
DAT_O()/DAT_I():主设备和从设备的之间的数据信号,数据可以由主设备传送给从设备,也可以由从设备传送给主设备。一对主设备和从设备之间最多存在两条数据总线,一条用于主设备向从设备传输数据,另外一条用于从设备向主设备传输数据。Wishbone规定数据总线的最大宽度为64位,这一规定实际上是考虑到目前商用处理器的最大位数为64,实际上数据总线的宽度可以是任意值。就笔者看来,在64位处理器以后,处理器将向多核方向发展,总线将向高速串行方向发展。
ADR_O(n…m)/ADR_I(n…m):地址信号,主设备输出地址到从设备。n取决于IP核的地址宽度,m取决于数据总线DAT_O()/DAT_I()的宽度和粒度。数据总线的粒度指的是数据总线能够一次传送的最小比特数,很多处理器如ARM的数据总线的粒度为1个字节,但是也有一些处理器如CEVA TeakLite DSP的数据总线粒度为2个字节。一个位宽为32比特、粒度为1个字节的数据总线的地址信号应定义为ADR_O(n…2)/ADR_I(n…2)。在传送数据时,具体哪些字节有效通过SEL_O()/SEL_I()信号(见下文)控制。
TGD_O/TGD_I()、TGA_O()/TGA_I():TGD_O/TGD_I()为数据标签,具体讲是附加于在数据总线DAT_O()/DAT_I()的标签,该标签可以用于传送关于数据总线的额外信息如奇偶校验信息、时间戳信息等。TGA_O/TGA_I()为地址标签,具体讲是附加于在地址总线ADR_O()/ADR_I()的标签,该标签可以用于传送关于地址总线的额外信息如地址总线奇偶校验信息、存储器保护信息等。Wishbone只规定了TGD_O/TGD_I和TGA_O()/TGA_I()的接口时序,用户可以定义TGD_O/TGD_I的具体含义。
TGC_O/TGC_I():TGC_O/TGC_I()为总线周期标签,该标签可以用于传送关于当前总线周期所进行操作的描述如操作类型(包括单次操作、块操作、RMW操作)、中断应答类型、缓存操作类型等。类似的,Wishbone只规定了TGC_O/TGC_I()的接口时序,用户可以定义TGD_O/TGD_I的具体含义。
ACK_O/ACK_I、ERR_O/ERR_I、RTY_O/RTY_I:主从设备间的操作结束方式信号。ACK表示成功,ERR表示错误,RTY表示重试(Retry)。操作总是在某一总线周期内完成的,因此操作结束方式也称为总线周期结束方式。成功是操作的正常结束方式,错误表示操作失败,造成失败的原因可能是地址或者数据校验错误,写操作或者读操作不支持等。重试表示从设备当前忙,不能及时处理该操作,该操作可以稍后重新发起。接收到操作失败或者重试后,主设备如何响应取决于主设备的设计者。
SEL_O()/SEL_I():有效数据总线选择信号,标识当前操作中数据总线上哪些比特是有效的,以总线粒度为单位。SEL_O()/SEL_I()的宽度为数据总线宽度除以数据总线粒度。比如一个具有32位宽、粒度为1个字节的数据总线的选择信号应定义为SEL_O(3:0)/ SEL_I(3:0),SEL(4’b1001)代表当前操作中数据总线的最高和最低字节有效。
CYC_O/CYC_I、LOCK_O/LOCK_I、GNT_O()/GNT_I:总线周期信号CYC_O/CYC_I有效代表一个主设备请求总线使用权或者正在占有总线,但是不一定正在进行总线操作(是否正在进行总线操作取决于选通信号STB_O/STB_I是否有效)。只有该信号有效,Wishbone主设备和从设备接口的其它信号才有意义。CYC_O/CYC_I信号在一次总线操作过程中必须持续有效,比如一次块读操作可能需要多个时钟周期,CYC_O/CYC_I信号必须保持持续有效。实际上,该信号的实际作用等同于其他总线标准中的仲裁申请信号。当存在多个主设备时,它们可能希望同时进行总线操作,主设备通过仲裁申请信号向仲裁器申请总线占有权,仲裁器通过一定的仲裁优先级逻辑向其中一个选定的主设备发送总线允许信号GNT_O()/GNT_I,表示该主设备可以占用总线。GNT_O()是仲裁器输出的允许信号,一般有多个;而对于一个主设备,其允许信号输入GNT_I却只有一个。一次总线操作可能需要多个时钟周期,比如一次块操作。在操作过程中,仲裁器可能会提前将总线占用权收回并分配给其他主设备从而打断当前主设备的操作,LOCK_O/LOCK_I有效代表本次总线操作是不可打断的。仲裁器收到LOCK_I信号,就不会提前收回总线使用权。图 13中只有一个主设备和一个从设备,因此没画出仲裁器模块,该模块可以视为是INTERCON的一部分,见本章最后给出的例子。
STB_O/STB_I:选通信号。选通有效代表主设备发起一次总线操作。只有选通信号有效(此时CYC_O/CYC_I也必须为高),ADR_O/ADR_I()、DAT_O()/DAT_I()、SEL_O()/SEL_I()才有意义。在Wishbone总线规范中,CYC_O/CYC_I是最高层的控制信号,只有该信号有效,STB_O/STB_I信号才有意义。一个信号有意义是指该信号的当前值是需要主设备或者从设备解释的,0为无效,1为有效,而一个信号没有意义是指该信号的当前值主设备和从设备不必关心,是0还是1都无效。
WE_O/WE_I:写使能信号,代表当前周期中进行的操作是写操作还是读操作。1代表写,0代表读。
3.1.5.系统库及应用程序设计
为了能够更好地发挥系统功能,扩大系统的应用范围,充分利用系统的各种硬件资源以及外围设备,包括键盘、串口、显示器,项目团队开发出了供应用程序调用的系统库。根据外设,可以将系统库函数分为四部分:系统宏定义和端口常量、键盘接口函数、显示器接口函数和串口接口函数。
图 14 系统库及应用程序总体结构[!--empirenews.page--]
如图 14,在团队自主研发的QS-I 硬件系统的基础上,团队开发了函数系统库和多个应用程序。其中系统函数库包括图形库、VGA显示器接口、RS232串口接口、PS/2键盘接口。应用程序根据所最终运行时的机器码可以分为MIPS体系结构应用程序和x86体系结构应用程序。其中,MIPS体系结构应用程序包括使用MIPS汇编语言编写的俄罗斯方块游戏和使用C语言编写的吃豆子游戏;x86体系结构应用程序包括使用8086汇编语言编写的推箱子游戏。
该项目的硬件系统是自主研发的,因而需要开发基于该系统的软硬件接口函数库,并且需要编写应用程序测试系统的各种功能。
该项目的硬件系统支持MIPS体系结构的指令集。基于MIPS指令集,团队开发了将MIPS汇编语言翻译成机器码的汇编程序,并分别使用MIPS汇编语言和C语言开发了系统函数库。使用MIPS汇编语言开发应用程序,用来验证五级流水线CPU的功能正确性,检测出数据相关和控制相关出现的问题,验证硬件系统对MIPS指令集的支持度,验证CPU与各种外部设备互联的正确性以及系统的总体性能。
基于MIPS汇编语言开发了俄罗斯方块游戏。俄罗斯方块的基本规则是移动、旋转和摆放游戏自动输出的各种方块,使之排列成完整的一行或多行并且消除得分。本设计的俄罗斯方块有5种基本形状,7种颜色;可通过键盘控制左移(A)、右移(D)、旋转(W)、加速下降(S)、暂停(Space)、退出(Q)、选择级别(L);游戏设置两种级别,普通下降速度和较快下降速度两级;游戏界面显示帮助、玩家所得分数、下一个即将下落的形状等信息;当方块到达顶端时,游戏失败;玩家通过不断的刷新最高分获得愉悦。
为了提高软件开发的效率,使软件开发人员方便的使用硬件系统及其外设资源,团队使用Gcc编译器和MASM汇编器的组合,项目团队开发了基于C语言的应用程序,验证硬件系统对Gcc编译器和MASM汇编器生成的机器指令的支持。团队还开发了基于C语言的系统函数库,包括图形库、VGA显示器接口、键盘接口和串口接口等。此外,团队还使用JAVA语言,开发了MIPS指令CPU模拟器,使得在软件的开发过程中不需要每次都传输到硬件开发板上就可以进行调试,大大提高程序开发的效率。
基于C语言开发了吃豆子游戏。吃豆子的基本规则是控制packman的移动,使之吃完所有的豆子,并且躲开怪物的追捕。本程序设计的怪物有2个;豆子有两种,一种普通的小豆子,还有一种大豆子,吃了大豆子能让怪物慢下来几秒钟;可通过键盘控制左移(A)、右移(D)、旋转(W)、加速下降(S)、暂停(Space)、退出(Q);游戏界面显示帮助、玩家所得分数等信息;当玩家被怪物抓到时,游戏失败;玩家将所有的豆子都吃光时,游戏正常结束。
该硬件系统能够执行不同指令集体系结构的机器码。为了验证系统执行不同指令集机器码的正确性,调试出硬件系统中存在的问题,团队开发了基于x86汇编语言的应用程序。团队还开发了基于x86语言的系统函数库,包括图形库、VGA显示器接口、键盘接口和串口接口等。
基于x86汇编语言开发了推箱子游戏。推箱子的基本规则是控制机器人的移动,使之把所有的箱子放到指定的位置。箱子只有1种;可通过键盘控制左移(A)、右移(D)、旋转(W)、加速下降(S)、暂停(Space)、退出(Q);游戏界面显示帮助、玩家所用的时间等信息;玩家将所有的箱子都放到适当的位置时,游戏正常结束。
4.详细设计方案
4.1.RISC CPU详细设计方案
4.1.1.RISC CPU(QS-I)整体模块
图 15 QS-I CPU整体模块图
如图 15所示,QS-I的整体模块中主要包括两部分,第一部分是五级流水线和Cache,另一个模块是动态二进制翻译加速模块(DBT Accelerator)。CPU的对外接口符合Wishbone总线标准。
在下一节中,我们将会介绍QS-I CPU中各个单元模块功能以及其时序。
4.1.2.RISC CPU(QS-I)各单元模块功能与时序
4.1.2.1五级流水线模块详细设计方案
功能描述
本模块的功能是完成指令的五级流水化执行,并支持中断及异常。一条指令的执行经过是Fetch(取指) à Decode(译码) à Execute(执行) à Memory(访存) à Writeback(写回)五个阶段。其中Fetch阶段从指令Cache中由PC(Praogram Counter)取得下一条指令;Decode阶段完成指令的大部分译码工作,并产生相应的控制信号;Execute阶段主要完成指令的算术运算以及少量选择电路;Memory阶段完成访存任务,数据将从数据Cache中读取或者写入;Writeback阶段完成写回指令的修改Register File(寄存器堆)的写操作。此外,本模块完成了流水线中的精确中断处理。
- 子模块列表
Module |
Description |
pc_reg |
Module of PC register |
if_stage |
Instruction Fetch stage |
if_id_reg |
Registers between IF and ID stages |
id_stage |
Instruction Decode stage |
id_exe_stage |
Registers between ID and EXE stages |
exe_stage |
Execute stage |
exe_mem_reg |
Registers between EXE and MEM stages |
mem_stage |
Memory stage |
mem_wb_reg |
Registers between MEM and WB stages |
wb_stage |
Writeback stage |
except |
Module of exception handling |
详细设计
pc_reg
本模块完成对PC寄存器的更新任务。若流水线中出现stall或者Cache发生miss等情况则延迟对PC寄存器的更新。本模块的时序如下图所示。
图 16 pc_reg时序图
if_stage
本模块完成对指令Cache的取指。模块的对外接口符合Wishbone总线标准。CPU的对外接口包括IBus(指令总线)和DBus(数据总线),为了将CPU成功集成入Wishbone总线中,CPU的对外接口部分的逻辑设计必须符合Wishbone标准。此外,CPU对外部设备(如RAM,ROM,UART)的访问速度以及CPU有无Cache(高速缓存)是未知的,因此这部分的逻辑设计必须带有通用性。
本模块的主要时序如下图。
图 17 if_stage时序图
if_id_reg
本模块完成IF和ID两个阶段之间的信号流水。本模块的时序图如下。
图 18 if_id_reg时序图
id_stage
本模块完成指令的基本译码,并产生相应的控制信号。RISC处理器的结构竞争、控制竞争、数据竞争三大竞争的解决:
采用旁路(bypass)技术解决数据竞争,双跳(double bump)解决结构竞争,延时槽技术解决控制竞争。
本模块的基本时序图如下。
图 19 id_stage时序图
id_exe_stage
本模块完成IF和ID两个阶段之间的信号流水。本模块的时序图如下。
图 20 id_exe_reg时序图
exe_stage
本模块完成指令的算术逻辑运算。其中,运算包括add, sub, and, or, xor, nor, sll, srl, sra, lui等算术或逻辑运算。
为了x86架构动态翻译的加速需要,在ALU(算术运算单元)中增加了x86 flag标志寄存器,并将该寄存器作为一个系统寄存器,用户程序可通过mfc0,mtc0指令来修改flag标志寄存器。
本模块的时序图如下。
图 21 exe_stage时序图