基于FPGA的M2M异构虚拟化系统(一)
本项目基于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 系统库及应用程序总体结构
评论