针对FPGA的IDL—Verilog编译器的设计与实现
2017-07-25吴湛王玲吴宇
吴湛+王玲+吴宇
摘 要: 软件通信体系结构规范(SCA)规定采用CORBA中间件来实现运行在不同处理器上的波形组件之间的相互通信,然而目前缺少能够有效支持FPGA上CORBA 中间件的IDL编译器。为此设计实现了一种IDL?Verilog编译器,该编译器能够支持用户自定义的任意IDL文件,并根据FPGA波形组件功能需要,自动生成运行在FPGA上的ORB核心、FPGA组件框架代码,从而真正实现FPGA组件与GPP组件的统一CORBA通信。介绍IDL?Verilog编译器的整体结构,并对该编译器的设计与实现进行详细阐述,最后对编译器进行测试。结果表明,该编译器能够正确解析IDL文件,并实现从IDL到Verilog语言的映射,自动生成的一系列目标文件使FPGA真正具备CORBA通信能力。
关键词: 软件通信体系结构; CORBA; FPGA; IDL编译器
中图分类号: TN915?34; TP314 文献标识码: A 文章编号: 1004?373X(2017)14?0018?05
Abstract: The software communications architecture (SCA) norm stipulates that the CORBA middleware should be used to realize intercommunication between the waveform components running in the different processors, but there is no IDL compiler which can support the CORBA middleware on FPGA effectively. Therefore, an IDL?Verilog compiler was designed, which can support any IDL files defined by users themselves, and generate the ORB core and FPGA component framework code running on FPGA automatically according to the functional requirements of FPGA components, so as to realize the CORBA communication between FPGA components and GPP components. The whole structure of IDL?Verilog compiler is introduced. The design and implementation of the compiler are expounded in detail. Some tests for the compiler were carried out. The results show that the IDL?Verilog compiler can parse the IDL files correctly, implement the mapping from IDL to Verilog language, and generate the target files automatically to make FPGA really have the ability of CORBA communication.
Keywords: software communication architecture; CORBA; FPGA; IDL compiler
0 引 言
软件无线电(Software Defined Radio,SDR)是一种基于通用硬件平台依靠软件实现其功能的无线电通信技术,其体系结构是通过软件通信体系架构(Software Communication Architecture,SCA)来定义的[1?2]。SCA采用CORBA中间件来实现其所需的分布式计算环境[3?4],其硬件平台通常包含通用处理器(GPP)、数字信号处理器(DSP)、可编程门阵列(FPGA)等。虽然CORBA(公共对象请求代理体系结构)中间件技术在GPP上已经广泛应用,但在DSP,FPGA等专用处理器上实现起来较为困难,目前只有OIS公司开发的ORBexpress FPGA[5]和Prismtech公司开发的集成电路ORB(ICO)[6]实现了FPGA上的CORBA通信,但考虑到国防安全问题,不允许在我国军事领域中使用[7]。基于以上考虑,为了实现FPGA上的CORBA通信,研发了支持FPGA处理器的CORBA中间件产品FPGA?ORB。
FPGA?ORB中间件主要包括运行在FPGA处理器上的ORB核心、客户端桩和服务器框架以及运行在PC机上的IDL?Verilog编译器,其体系结构如图1所示。其中,ORB核心用于实现客户端请求和服务器对象之间的连接,客户端的ORB核心接收被调用操作的参数并将其组码为网络可接收的格式,服务器的ORB核心将来自网络的操作参数解组,然后送给服务器来执行所调用的操作。客户端桩用于将客户端的请求编码,通过客户端的ORB发送到服务器,并把返回的结果解码后送给客户端。服务器框架负责把客户端通过ORB发过来的请求解码,通过对象操作实现,然后把结果编码后通过服务器ORB发送给客户端。客户端调用的接口和服务器实现的接口是通过接口描述语言(Interface Definition Language,IDL)来定义的,但是与某一种具体编程语言不同,IDL 是一种纯说明性语言,它只能够给出该接口的定义和每个操作要求的参数而不牵涉到具体的实现[8?9],因此要用IDL?Verilog编译器对IDL文件进行编译,然后根据解析得到的IDL文件信息修改模板文件代码,最后生成Verilog语言实现的ORB核心、客户端桩和服务器框架。可见,IDL?Verilog编译器是FPGA?ORB的关键模块,本文主要论述IDL?Verilog编译器的设计与实现。
1 IDL?Verilog编译器的设计与实现
本文设计的IDL?Verilog编译器划分为三个子系统:参数解析子系统、编译前端子系统、编译后端子系统,其具体结构如图2所示。其中,参数解析子系统用于完成对用户编译命令的解析,存储编译器控制信息;编译前端子系统用于完成对输入IDL文件的解析,并生成一棵抽象语法树;编译器后端子系统用于完成对编译前端子系统生成的抽象语法树的遍历,并提取相关信息完成对输入模板文件的修改,然后生成目标文件。这种设计方式带来的好处是,可以保持参数解析子系统和编译前端子系统的代码不变,仅仅通过改变编译后端子系统的代码就可以实现针对不同处理器和开发语言的IDL编译器,这样就大大增强了IDL编译器的通用性。下面分别对三个子系统进行详细的阐述。
1.1 参数解析子系统
参数解析子系统的作用是通过解析处理用户输入的命令参数以获取控制命令信息来实现对编译器的控制。文中设计的IDL?Verilog编译器需要输入的命令参数包括:源文件名、包含文件路径、输出目标代码文件路径、模板文件路径、参数传递文件路径以及帮助查询命令。
1.2 编译前端子系统
编译器前端子系统主要由预处理模块、词法分析模块和语法分析模块组成。下面分别对三个模块进行详细的阐述。
1.2.1 预处理模块
预处理模块的主要作用是对输入的IDL文件进行预处理,以方便词法分析模块、语法分析模块进行后续处理。其主要功能子模块包括:源文件包含处理子模块、宏定义处理子模块和条件编译处理子模块。
(1) 源文件包含处理子模块。源文件包含处理子模块用来对源文件当中的“#include”语句进行解析,提取输入源文件中的包含文件;然后以包含文件的绝对路径作为输入文件递归调用预处理模块;最后按由外向内和由前向后的原则存储包含文件的绝对路径。IDL?Verilog编译器将按照存储的包含文件的绝对路径的先后顺序对相关文件逐一进行解析处理。
(2) 宏定义处理子模块。宏定义处理子模块用来对源文件和包含文件当中的“#define”语句进行解析,将宏定义中的宏名存储,用于预处理模块当中条件编译的判断处理,而并不进行宏定义替换。在语法解析模块中,则会提取完整的宏定义信息,然后将基本数据类型的标识符和已存储的有效宏名进行匹配,如果匹配成功,则将该标识符替换为宏定义的字符串。
(3) 条件编译处理子模块。条件编译处理子模块用来对源文件和包含文件当中的“#ifdef”,“#if defined”等语句进行解析,具体方法就是将参数解析模块存储的预定义变量名和预处理模块存储的宏名作为依据,对条件编译语句进行判断,找出需要编译的语句。
为了确保源文件和包含文件内容的不变性,预处理模块为每个源文件和包含文件都新建一个与之对应的临时文件。将预处理之后的源文件和包含文件存入与之对应的临时文件。词法分析模块、语法分析模块对源文件和包含文件的后续处理就转化为对临时文件的解析。当所有解析处理结束之后,IDL?Verilog编译器会删除预处理模块生成的临时文件。
预处理模块具体执行流程图如图3所示。
1.2.2 词法分析模块
词法分析模块是 IDL?Verilog 编译器前端子系统的关键模块之一。该模块按从左往右的顺序对源文件进行扫描,在扫描的过程中会跳过空格和换行符并删除注释,将若干连续字符拼接成一个符合IDL语言的构词规则的标识符并提取,然后将提取的标识符交给语法分析模块进行后续处理,其具体过程如图4所示。
1.2.3 语法分析模块
语法分析模块采用“边检查、边存储、边转换”的方式来对输入文件进行语法解析:每当语法分析模块从输入文件中检查到一种语法成分时,则调用相对应的语法解析函数对该语法成分进行解析;接着按照IDL语言的语法规则来对语法成分进行解析和检查,并在解析和检查过程中,将该语法成分的信息存储;将Verilog语言不支持的函数参数类型转换为基本数据类型,当函数参数类型为结构体时,则将其按结构体成员的数量拆分为基本数据类型,当函数参数类型为别名时,则将其与存储的别名信息对比,找出其原始基本数据类型。其具体执行流程图如图5所示。最终,一个IDL文件经预处理模块、词法分析模块和语法分析模块会生成一棵抽象语法树,该抽象语法树存储了完整的IDL文件信息[10]。每棵抽象语法树可能包含十棵子树,这十棵子树分别存储:包含文件信息、宏定义信息、常量信息、结构体信息、别名信息、异常信息、枚举信息、联合信息、接口信息、模块信息。
语法分析流程如下:
(1) 判断文件是否结束,如果是则执行第(6)步,否则继续执行第(2)步。
(2) 从文件中读取一个字符串。
(3) 判断该字符串是否为合法字符串,如果为合法字符串,则执行第(4)步,否则执行第(5)步。
(4) 判断字符串,如果字符串为函数,则调用函数解析接口进行函数信息提取和存储,并将函数参数的数据类型转换为基本数据类型存储,然后返回第(1)步继续执行;如果字符串为文件包含、属性、异常和用户定义的数据类型(宏定义、别名、常量、结构、枚举、联合),则调用相应的解析函数,完成相应信息的提取和存储,然后返回第(1)步继续执行;如果字符串为接口,则提取接口名和继承接口信息并存储,然后返回第(1)步继续执行;如果字符串为模块,则提取并存储模块名,然后返回第(1)步继续执行;如果字符串不是上面提到的任一字符串,则返回第(1)步继续执行。
(5) 报告错误文件名字、错误行数和错误类型。
(6) 結束。
1.3 编译后端子系统
编译后端子系统主要包括目标代码生成模块。目标代码生成模块是IDL?Verilog编译器最后一个关键模块。这一模块的主要作用是通过遍历语法分析模块生成的抽象语法树来提取接口信息,然后根据提取的信息完成对模板文件的修改来生成目标文件。
为了方便生成目标代码,本文为每一个需要更改的FPGA?ORB模板文件内容都做了注释标记,目标文件生成函数会从抽象语法树中提取相应信息对模板文件中的标记内容进行修改,并生成目标文件,这样就大大减少了目标代码生成模块的工作量。生成的目标文件按功能可以划分为:ORB模块、IOR解析模块、选择器模块、客户端桩模块、服务器框架模块、组件接口模块,其结构如图6所示。
(1) ORB模块。该模块主要用于GIOP报文头、请求报文头、应答报文头的解析和封装。
(2) IOR解析模块。该模块用于解析应答报文中的对象引用(IOR),获取相应的对象密钥(objectkey)。
(3) 选择器模块。该模块为选择器模块,用于报文发送和接收选择。
(4) 客户端桩模块。该模块包含多个客户端桩子模块,其数量与组件端口数量相同,其主要作用是对请求报文中的函数参数进行封装以及对应答报文中的函数参数进行解析。
(5) 服务器框架模块。该模块包含多个服务器框架模子模块,其数量与组件端口数量相同,其主要作用是对请求报文中的函数参数进行解析以及对应答报文中的函数参数进行封装。
(6) 组件接口模块。该模块采用硬件抽象层(HAL)的接口规范[11],其主要作用是实现FPGA组件端口和FPGA?ORB之间的数据传递。
2 IDL?Verilog编译器测试
本文对IDL?Verilog编译器的测试主要分为本地测试和CORBA通信测试两个方面。
(1) IDL?Verilog编译器本地测试。IDL?Verilog编译器本地测试主要是测试IDL?Verilog编译器对IDL文件的解析处理能力。因为输入的IDL文件是无法穷举的,本文采用了等价类测试的方法来测试[12]。通过将输入的文件中的语句划分成能够覆盖IDL语法各种情况的等价类,并对每个等价类完成了测试。由于各等价类的测试步骤相同,本文仅选用了一个测试用例来介绍本地测试的过程。测试的IDL文件test.idl如图7所示,该IDL文件经IDL?Verilog编译器编译之后生成的目标文件如表1所示。测试表明,IDL?Verilog编译器能够实现对输入IDL文件的正确解析,并成功生成目标文件。
(2) CORBA通信测试。CORBA通信测试主要是测试表1中的目标文件能否配合的FPGA?ORB实现FPGA上的CORBA通信。
立足于实验室的测试条件,搭建一个如图8所示的测试平台。该测试平台主要由GPP和FPGA组成,其中,GPP主要用来运行核心框架和GPP波形组件A,FPGA用来运行FPGA波形组件B。GPP采用 TAO进行CORBA通信,FPGA采用表1中目标文件组成的FPGA?ORB进行CORBA通信,GPP ORB与FPGA ORB之间实际通过ELBC总线相连。
测试平台的通信过程如图9所示,上电之后,FPGA组件B也能像GPP组件A一样通过FPGA?ORB向核心框架中的域管理器进行注册,然后域管理器对组件A进行初始化、端口连接和参数配置以完成整个波形组件的初始化;最后组件A和组件B可以通过各自的中间件向对方发送函数调用请求,并返回调用结果。测试表明,IDL?Verilog编译器生成的目标文件成功地实现了FPGA与GPP之间的CORBA通信。
3 结 语
本文根据IDL语言的语法规则,使用C语言实现了IDL?Verilog编译器。该编译器采用模块化的设计方法,將整个编译器按功能划分为不同的子模块,可以通过改变其子模块实现不同的语言映射,大大提高了IDL编译器的通用性。同时该编译器生成的目标文件能够正确完成IDL语言到Verilog语言的映射。IDL?Verilog编译器目前已经调试通过,并作为FPGA?ORB重要组成部分实现了FPGA上CORBA通信。
参考文献
[1] JOHNSON C R, Jr, SETHARES W A.软件无线电[M].北京:机械工业出版社,2008.
[2] 粟欣,许希斌.软件无线电原理与技术[M].北京:人民邮电出版社,2010.
[3] 崔小鹏,胡中豫,张豪.SCA中CORBA与硬件抽象层技术研究[J].现代电子技术,2011,34(6):32?35.
[4] 李雅萍,杨尚森,李阳.CORBA技术在SCA系统中的应用[J].计算机工程与设计,2008,29(16):4200?4203.
[5] BECKWITH W, DELLER S, GTHOMPSON J. Hardware communications infrastructure supporting location transparency and dynamic partial reconfiguration: US 2008/0229326 A1 [P]. 2008?09?18.
[6] Prismtech. Prismtech openfusion CORBA products [EB/OL]. [2013?12?10]. http://www.prismtech.com/sectionitem.
[7] 高宏伟.SCA系统中针对FPGA处理器的中间件关键技术研究与实现[D].长沙:国防科技大学,2011.
[8] HENNING Michi, VINOSKI Steve.基于C++ CORBA高级编程[M].北京:清华大学出版社,2007.
[9] 韦乐平.CORBA语言映射[M].北京:电子工业出版社,2001.
[10] AHO A V.编译原理[M].北京:机械工业出版社,2009.
[11] 王金波.基于SCA的硬件抽象层连接设计及其在DSP/FPGA上的实现[D].长沙:国防科技大学,2005.
[12] 李颖,胡明.基于C语言实现的IDL编译器[J].计算机技术与发展,2013,23(3):5?9.