摘要:为实现Verilog语言的跨平台操作,完成软硬件之间的协同设计验证,提出了在线翻译器Verilog2Java的设计思路。通过对Verilog和Java语言的比较,首先设计出一组从Verilog到Java的翻译规则,然后采用B/S结构,将已定义的规则加载到配置好的Eclipse工作环境下,再到数据库中执行相应的查询操作,最终生成功能等价的Java目标代码。结果表明:该翻译器经多次实例验证,可完成预期的设计功能。
关键词:Verilog; Java; 在线翻译器; 协同设计;
Abstract:A design thinking that translates from Verilog to Java is proposed to achieve cross-platform operation of Verilog language and complete collaborative design and verification between hardware and software. By comparing the similarities between Verilog and Java language,a set of conversion rules for the translation from Verilog to Java is designed. Then the B / S structure is adopted to load the defined rules to configure Eclipse working environment,and then execute the search operation in the database. Finally,a functional equivalent of the Java language is generated. The results show that the translator is able to complete the expected design function.
Keyword:Verilog; Java; Online translator; Collaborative design;
Verilog因其具有很强的灵活性,语法简单,容易理解等优点而成为目前应用最为广泛的硬件描述语言之一。而Java语言也因其平台无关性和“一次编译,随处运行”的特点逐渐成为一种系统设计和开发的高级程序设计语言。随着专用集成电路ASIC发展速度的加快和集成度的不断提高,设计人员急需一种软硬件协同设计模式来替代其繁琐的跨平台操作。而Verilog2Java在线翻译器正好提供了这样的功能。通过在Eclipse工作平台下的配置和Tomcat服务器上的部署,把硬件语言描述的功能转换为软件实现的方法,再经过预定义的翻译规则,将软件模块对硬件功能的调用转化为同种语言之间的相互调用,从而完成软硬件之间的协同设计[1,2] 验证,为Verilog语言的跨平台应用提供了一种全新的实现方法。
1、Verilog2Java在线翻译器设计思路
本文所采用的B/S体系结构主要是利用Web技术与浏览器Java Script相互结合,再处理浏览器提出的请求。用户在使用在线翻译器软件的过程中,只需通过浏览器就可随时随地实现翻译功能。
本文的主要工作是在B/S架构上设计一个由Verilog向Java转换的在线翻译器,其设计思路是通过对两种语言的对比后得出的。从语言的语法特点上来看,两种语言在许多方面都具有共性,可以将这些共性提取出来,重新定义为一种新的概念,并对这些新概念进行数据化的表示,以保证实现二者之间的翻译[3] 功能。这些共性主要在以下几个方面上体现:
(1)Verilog语言中的模块化思想与Java中的封装类实现的功能相同。对于Verilog中的模块,可以将其转换为Java中的一个封装类来实现。Verilog有时在实现某些复杂的功能时,需要使用一个模块去调用另一个模块的实例元件来实现,转换为Java语言时,就相当于实现一个难度较大的方法需调用已定义的方法类提供特定的功能来实现。
(2)Verilog中的任务task和函数function语句的实现在Java语言中可以用外部定义一个特定的方法类来进行具体的描述和转换。
(3)Verilog中的行为描述语句如if条件语句,while循环语句和for语句以及case生成语句等,在Java中都有相似的语法来实现它们之间的转换。
根据这些相似性,给出Verilog2Java的总体设计思路:首先将Verilog源文件经过预处理模块后保存到Verilog数据表中。然后再利用在线翻译器(需事先将运行平台和服务器都设置完成)中预先定义好的翻译规则,在Verilog数据表和预先定义好的Java数据表中进行查询,完成两者之间的转换,最后生成Java目标代码。整个Verilog2Java的设计如图1所示。
图1 Verilog2Java总体设计
2、Verilog2Java在线翻译器的翻译规则
在Verilog转换为Java的过程中,需要事先定义Verilog元素转换为Java语言的翻译规则,下面是一些主要的翻译规则。
2.1、模块的调用与端口的翻译
Verilog设计中的基本功能块就是模块。模块[4] 由描述接口和实现逻辑功能两部分组成。模块描述的接口即是端口,它是模块与外界交互的界面,它代表的是模块的输入和输出口名,也是与别的模块联系的端口的标识。基于这些方面,可将其转换为Java语言方法,因为Java中的方法定义了对象提供的服务,也定义了对象与使用对象程序之间的接口。这样做的优势在于可以比较自然地将Verilog定义的端口作为Java方法中的参数传入,来实现翻译的功能。当一个模块功能的实现需要调用另一个模块来完成时,只需对该模块的元件实例进行调用即可。这种模块的调用映射为Java语言时,可以在Java中提前定义好一个类,当需要使用时,另一个方法调用该事先定义好的类即可实现Verilog所描述的功能。
接下来通过一个具体的实例来说明模块之间的转换,如表1所示。
表1 Verilog模块及其对应的Java类
从该实例中可以更加明显看出,Verilog对于模块的调用对应转换为Java中方法的调用。而Verilog中的端口列表则与Java定义的Data Type类中的参数一一对应。
2.2、数据类型的翻译
Verilog中最基本的数据类型:reg型、wire型、integer型和parameter型。在进行转换时,需要事先使用Java定义类的方法在Java代码中定义一个新的数据类型Data Type类。该类的主要作用是处理Verilog中所有与数值有关的语句。包括Verilog中各个赋值数据的当前值Current Value和在赋值过程中所记录的值History Value,以及判断某个变量是否满足上升沿Rising Edge()或下降沿Falling Edge()条件的方法,这两种方法均返回boolean类型的结果。当Verilog模块的行为描述语句需要明确事件是否满足触发条件时,Java语言可以调用该类对象的成员方法进行相应的翻译去判断,这样做可以减小翻译出现的错误率,方便之后的校正。
2.3、结构说明语句的翻译
Verilog中主要包括4种结构说明语句:initial、always、task和function。initial和always语句在程序运行时就开始执行。每个initial语句代码只运行一次,其表现形式为initial……,将其翻译为Java语句时,只需给变量赋初值即可。而always语句则是只要满足触发条件就不断地重复进行,直到模块运行结束。其表现形式为always@(事件表达式)begin……end,将其翻译为Java语言时,需要用到Java语言中的if语句来判断其触发条件是否成立,若成立,则继续执行下面的语句。而begin……end中的数据在翻译时就需要比较变量的当前值和历史所记录的值。上一次赋值后所保存的值存放于历史记录值History Value中,而变量当前的值则存放于Current Value中。每当语句执行结束后,需将每个变量的当前值Current Value赋给各自的历史值History Value,此时可以在Data Type类中新添加一个成员类的方法Final Number(),该方法返回的是void类型。其中的事件表达式可以调用数据类型翻译时定义的Data Type类中的上升沿Rising Edge()方法和下降沿Falling Edge()方法来实现。接下来通过一个实例来具体地阐述这两种说明语句块的翻译。如表2所示。
表2 initial语句和always语句对应的翻译方法
task和function语句分别用来对任务和函数进行定义,当编写一个较大的程序模块代码时,往往需要将其分解为许多较小的任务和函数来进行编写和调试。在翻译为Java语言时,可以首先定义一个外部的方法类Method,当Verilog需要某项功能翻译为Java语言时,可以直接调用Method类中定义的内容来实现我们所要的功能,这样方便代码的重构。
2.4、过程赋值语句的翻译
Verilog包括两种类型的过程赋值语句:非阻塞赋值和阻塞赋值[5] 。
(1)非阻塞赋值语句(如y<=x)
非阻塞的赋值方式在Verilog语句块中使用时,上面语句所赋的变量值不能立即就为下面的语句所用;块结束后才能完成这次赋值操作,而所赋的变量值是上一次赋值所得到的。非阻塞赋值的最大特点在于语句执行的并行性,可以有效地避免竞争现象的发生。针对此特点,在翻译为Java代码时,可以将等号右边变量的历史记录值History Value赋给左边变量的当前值Current Value,因为历史记录的值中保存的正是上一个时钟周期该变量的值。具体的实例如表3所示。
表3 非阻塞赋值语句的翻译
从表3中可以看出,对于非阻塞赋值,由于代码的执行方式是并行的,因此,每次执行完成后,z的值是上一个时钟周期时y的值。
(2)阻塞赋值语句(如y=x)
对于阻塞赋值语句,在该语句执行结束时,y的值就会立刻变为x所表示的值。当翻译为Java语言时,只需将等号右边变量的当前值赋给等号左边的变量,然后再调用Final Number()方法将各个变量的当前值保存起来即可。具体的转换如表4所示。
表4 阻塞赋值语句的转换实例
从表4中可以看出,这种赋值方式是立即执行的,也就是说在执行下一条语句时,y的值已和x的值保持一致,即在同一个时钟周期内,两个变量的值可能是相同的。
2.5、行为描述语句的翻译
行为描述语句中的条件语句用于根据某个条件来确定是否执行其后的语句,关键字if和else用于表示条件语句。执行过程为:首先判断其条件表达式是否成立,再根据成立与否判断执行哪一条语句。在翻译为Java语言时,比较简单,只需在判断条件处做一些微小的改动即可。Verilog的循环语句while和for语句的执行过程和Java语言执行此功能的代码相同,翻译时可直接翻译。而对于case生成语句,它的执行过程为:首先计算条件表达式的值,然后按照顺序将它和各个候选项进行比较:若等于第一个候选项,则执行其对应的语句,若和全部候选项都不相等,则执行default语句。而将其翻译为Java语句时,需要用到switch(表达式){case子句},switch语句计算初始表达式的值,并将其值和每个case子句中表达式的值进行匹配。程序将执行匹配的case子句中的语句块。如果没有匹配的case子句,程序将执行可选的default(默认)子句。表5展示了行为描述语句的具体翻译过程。
表5 行为描述语句的翻译
3、开发平台及具体实现
本文采用Eclipse与Dreamweaver8的相互作用进行页面的设计开发。Web服务器的操作系统为Windows Server 2003、用Tomcat6.0作为Java的运行环境和对外提供Web服务,用SQL Server 2005作为数据库[6] 服务。
在线翻译页面的设计中有两个文本域Text Area,上面的文本域用于输入待翻译的句子,输入内容的格式为Verilog文件形式。下面的文本域用于显示服务器的翻译结果,当点击在线翻译按钮时,去数据库中查询相关的信息,进行翻译。然后将翻译之后的结果显示出来。
数据库SQL Server中有两个数据表,一个是存储Verilog数据表,由于Verilog语言具有自己的语法特点[7] ,不可能把Verilog的所有模块以及语法格式都翻译成Java。所以首先在Verilog的预处理模块中,对Verilog某些不可翻译的语法成分做一些细微的改变,进而对翻译器的实现进行了简化。然后将改动后的部分添加到Verilog数据表中。对于Verilog中的一些专用元素,Java中没有元素能够与其相对应,必须设计另一个预先设计好的Java数据表。
下面来详细的分析其执行过程[8] :
用户登录到Verilog2Java在线翻译器的页面中,按照Verilog的语法规则输入要翻译的内容,然后点击翻译按钮将请求发送到Tomcat服务器端,服务器根据资源的配置文件web.xml对接受到的请求进行深入的分析,再根据配置文件中的信息:
可知提交的请求是将Verilog转换为Java语言,然后调用服务层servlet中的com.ypc.servlet.Translator执行该请求。在Translator中的public void do Post(Http ServletRequest request,Http ServletResponse response)throws Servlet Exception,IOException{}方法中获得页面中输入的全部信息;然后创建实现翻译的会话层接口Translator Dao与数据库进行连接,之后调用public void search(String id,String name)方法执行查询操作;最终经过两个数据表的比较之后,对数据库进行更新操作,调用数据库实现层com.ypc.dao.implement的public int update(String sqls)方法来实现,之后调用Translator类中的方法将更新之后的数据显示在页面上。
4、设计实例
一个在Verilog2Java在线翻译器平台上运行的四位脉动进位计数器的Verilog源代码描述以及翻译之后的Java目标代码的显示实例,如图2所示。
图2 设计实例展示
经过Verilog2Java翻译器部署在Tomcat 6.0服务器上的验证,可以看出基本符合文中所定义的翻译规则,从而验证了Verilog2Java在线翻译器的可实现性和正确性。
5、结语
本文介绍了以Java为目标语言的Verilog2Java的在线翻译器,通过比较Verilog和Java语法的差别和共同点,有针对性地设计翻译模式。在转换的过程中,充分利用Java对象来封装Verilog程序中的一些信息。Verilog2Java翻译器采用B/S结构、Java EE架构和SQL数据存储技术,在Eclipse配置的环境下结合Tomcat服务器完成了一个基础的功能模块,经过多次测试,运行基本正常,运行结果也基本符合所定义的规律。接下来的工作是,实现Verilog和Java之间的相互翻译,并且充分利用Java语言的特点,使得Verilog2Java在线翻译器性能更加稳定。
参考文献
[1]周海芳,陈虎,杨学军.嵌入式系统软硬件联合设计方法研究[J].计算机工程与科学,2001,23(6):98-101.
[2]Ohana E,Luca C.RTL modeling and simulation using JA-VA[C]//2012 13th International Conference on Optimization of Electrical and Electronic Equipment,2012:1253-1258.
[3]张红艳,李茵茵,蔡洁云.KRL到Java翻译器KtoJ的设计与实现[J].计算机应用与软件,2011,28(8):184-186.
[4]安健,吴悦,杨洪斌,等.Verilog到VHDL翻译器的设计与实现[J].计算机工程与设计,2005,26(10):2695-2697.
[5]董鑫,宋国新.Verilog到Java翻译器VtoJ的设计与实现[J].计算机与数字工程,2005,33(7):100-103.
[6]考持坤.基于J2EE的Web数据库应用技术[D].南京:南京理工大学,2004.
[7]胡燕翔.Verilog语义的ASM表示方法研究[J].计算机工程,2006,32(21):1-2,21.
[8]尼玛扎西.汉藏在线翻译多媒体电子词典设计研究与实现[D].拉萨:西藏大学,2008.