(计算机系统结构专业论文)龙芯rtl+verilog到c翻译器的设计与实现.pdf_第1页
(计算机系统结构专业论文)龙芯rtl+verilog到c翻译器的设计与实现.pdf_第2页
(计算机系统结构专业论文)龙芯rtl+verilog到c翻译器的设计与实现.pdf_第3页
(计算机系统结构专业论文)龙芯rtl+verilog到c翻译器的设计与实现.pdf_第4页
(计算机系统结构专业论文)龙芯rtl+verilog到c翻译器的设计与实现.pdf_第5页
已阅读5页,还剩43页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

摘要 v e r i l o g 硬件描述语言( i e e es t a n d a r dv e r i l o g h a r d w a r ed e s c r i p t i o nl a n g u a g e ) 为电 子系统各阶段的建立提供统一的形式符号在i c 设计中,使用v e r i l o g 编写寄存器级描 述( r t l ) 对目标系统建立行为级模型后,对r t l 进行大量的软件仿真不仅可以及早发 现潜在的逻辑错误,而且能够对目标系统的性能进行初步评估。 目前,使用商业仿真软件成为i c 设计工程师们的首选,但商业仿真软件由于成本过 高、使用环境复杂等局限性,不适用于性能分析和系统评测等一般应用。对于一般应用, 有针对性的开发专有的仿真软件不仅可以节约成本、简化仿真环境,还能提高仿真速度。 本文的研究工作主要是针对特殊的语法语义,设计并实现r t lv e r i l o g 到c 的翻译 器,并以此翻译器为基础进行高级语言生成式仿真。文中首先详细描述了该翻译器前端 的分析流程,分别讨论了每个阶段使用的重要数据结构和算法,然后描述了翻译器后端 代码生成的过程,提出仿真简化模型,并给出该仿真简化模型的实现方法和意义,接着 提出针对生成代码的运算优化方法和访存优化原则,最后对生产代码的测试展开讨论并 给出实验结果。 本文的研究结果作为中国科学院计算技术研究所龙芯c p u 课题组研究工作的一部 份,已应用于龙芯c p u 设计早期的性能分析和系统评估。 关键字:软件仿真,r t lv e r i l o g ,c ,龙芯 a v e r i l o g t oct r a n s l a t et o o lf o rg o d s o nr t l d a id i ( c o m p u t e r a r c h i t e c t u r e ) d i r e c t e db yh aw e i w u v e r i l o gh d l i saf o r m a ln o t a t i o ni n t e n d e df o ru s ei na l lp h a s e so ft h ec r e a t i o no f e l e c t r o n i cs y s t e m s i ni cd e s i g n , i ti sac o m m o nm e t h o dt os e tu pb e h a v i o rm o d e l sf o r t a r g e t s y s t e m sb yr t l ( r e g i s t e rt r a n s f e rl e v e l ) v e r i l o gc o d e s p e o p l ec a l lf i n dt h ep o t e n t i a ll o g i c b u g sa n dp r i m a r i l ye v a l u a t et h ep e r f o r m a n c eo ft a r g e ts y s t e m sb yd e p l o y i n gs o f t w a r e s i m u l a t i o nf o rr t lc o d e s c u r r e n t l y , m a n yi cd e s i g ne n g i n e e r sc h o o s ec o m m e r c i a ls i m u l a t i o ns o f t w a r e b u tt h e c o m m e r c i a ls i m u l a t i o nt o o l sa r en o tf i tf o rt h eg e n e r a la p p l i c a t i o n ,s u c ha sp e r f o r m a n c e a n a l y s i sa n ds y s t e me v a l u a t i o n , b e c a u s eo ft h e i rh i i g hc o s t sa n dc o m p l e xe n v i r o n m e n t f o r g e n e r a la p p l i c a t i o n , d e v e l o p i n gp r o p r i e t a r ys i m u l a t i o nt o o l sf o rs p e c i a lt a r g e ts y s t e m sc a n r e d u c et h ec o s t s ,s i m p l i f ys i m u l a t i o ne n v i r o n m e n ta n da c c e l e r a t es i m u l a t i o np r o c e d u r e t h er e s e a r c hw o r ki nt h i st h e s i si st od e s i g na n di m p l e m e n tat r a n s l a t o rf r o mr t l v 舐l o g c o d e st oc c o d e s ,a i m i n ga ts p e c i a ll e x i e a la n ds e m a n t i cc h a r a c t e r i s t i c w ea l s op e r f o r m a n c e t h eh i g hl e v e lp r o g r a m m i n gl a n g u a g eb u i l d i n gs i m u l a t i o nb a s e do nt h i st r a n s l a t o r i nt h ef i r s t p a r to ft h i st h e s i s ,w ei n t r o d u c et h ea n a l y s i sf l o wi nt h ef r o n te n do ft h et r a n s l a t o gt h e i m p o r t a n td a t as t r u c t u r ea n da l g o r i t h mi ne a c hs t e pa r ed i s c u s s e d t h es e c o n dp a r to ft h i s t h e s i si st od e s c r i p tt h ec o d eg e n e r a t i n gf l o wi nt h eb a c ke n do f t h et r a n s l a t o r t h es i m p l i f i e d s i m u l a t i o nm o d e la n di t si m p l e m e n t a t i o nm e t h o da r eg i v e ni nt h i sp a r t t h e n ,w ep r o p o s et h e o p e r a t i o no p t i m i z a t i o nm e t h o da n do p t i m i z a t i o np r i n c i p l e so fm e m o r ya c c e s s i n gf o r g e n e r a t i n gc o d e s f m a l l 弘t h eg e n e r a t e dc o d e sa r et e s t e d ,a n dt h ee x p e d m e n t a lr e s u l t sa r e p r o v i d e di nt h i st h e s i s a sap a r to ft h er e s e a r c hw o r ko fg o d s o nc p ug r o u pi ni n s t i t u t eo fc o m p u t i n g t e c h n o l o g y , c h i n e s ea c a d e m yo f s c i e n c e s ,t h er e s u l t so f t h i st h e s i si sa p p l i e dt op e r f o r m a n c e a n a l y s i sa n ds y s t e me v a l u a t i o ni ne a r l yd e s i g no f t h eg o d s o nc p u k e y w o r d s :s o f t - w a r es i m u l a t i o n , r t lv e r i l o g , c ,g o d s o n 图1 1 图3 1 图3 2 图3 3 图3 4 图3 5 图4 1 图4 2 图4 3 图4 4 图4 5 图4 6 图4 7 图4 8 图4 9 图5 1 图5 2 图5 3 图5 4 图6 1 图目录 高级语言生成式仿真流程图2 条件编译原理图:。1 0 m o d u l e 结构示意图1 3 目运算表达式示意图1 4 连接运算表达式示意图1 4 变量引用型表达式示意图1 5 过程化生成法示例电路结构图1 9 深度优先和广度优先展开示意图2 0 物理上同事件块合并流程图2 2 表达式回溯的流程图2 3 龙芯r t l 事件传递流程图2 4 依赖树示例2 5 非阻塞赋值示例相关图2 6 非阻塞赋值示例生成代码相关图2 7 内存访问优化2 9 软件测试的主要流程图3 3 行为测试示意图3 4 验证测试示意图 仿真嵌入测试示意图3 6 重要实验数据比较3 8 表2 1 表2 2 表3 1 表3 2 表4 1 表6 1 表目录 z 值真值表 b i t s 运算符重载。7 关键字 运算符 表达式生成格式2 9 初步实验数据。 声明 我声明本论文是我本人在导师指导下进行的研究工作及取得的研究成 果。尽我所知,除了文中特别加以标注和致谓 的地方外,本论文中不包含 其他人已经发表或撰写过的研究成果。与我一同工作的同志对本研究所做 的任何贡献均已在论文中作了明确的说明并表示了谢意。 作者签名: 戮笛口期:郦岁艿 论文版权使用授权书 本人授权中国科学院计算技术研究所可以保留并向国家有关部门或机 构送交本论文的复印件和电子文档,允许本论文被查阅和借阅,可以将本 论文的全部或部分内容编入有关数据库进行检索,可以采用影印、缩印或 扫描等复制手段保存、汇编本论文。 ( 保密论文在解密后适用本授权书。) 、 作者签名:或辔导师签名:亍9 孛彩日期:掀步艿 1 1 背景介绍 第一章引言 在i c 设计中,在各个阶段进行大量的仿真是非常必要的,不仅可以及早检测出潜在 的功能故障,而且够做出系统评估和早期性能分析。仿真可以按照支持环境的不同分为 硬件仿真、软件仿真和软硬件协同仿真。 硬件仿真是使用如硬件仿真加速器和f p g a 等物理设备模拟目标系统的分析方式, 该方式不仅速度快,且接近于实际硬件行为,但硬件仿真设备价格昂贵,使用过程复杂, 可测性和可控性不能尽如人意,所以只在大型项目中使用。 软件仿真是在普通p c 或者服务器上使用r t l 级仿真软件对目标系统各个层次的 r t l 描述进行仿真的分析方式。尽管使用商业r t l 仿真软件能够很方便地调试与修改, 但其通用性使得仿真速度过于缓慢。 软硬件协同仿真是使用硬件设备模拟目标系统,使用软件通过特殊接口来控制硬件 设备的仿真方式,虽然对可测性和可控性有一定的提高,但仍然需要使用价格不菲的硬 件设备。 针对如性能评估等在r t l 级就可进行的作业,可以设计专门的仿真软件,不仅可 以提高仿真速度,还能在简单的环境下进行仿真而无需购买任何使用许可。 1 2 软件仿真类型 v e r i l o g 仿真软件按照仿真方式可以大致分为三类:解释执行式、编译执行式和高级 语言生成式 1 2 1 解释执行式 将v e r i l o g 代码编译为某种中间表示后,按照v e r i l o g 行为模型中的事件激励模式进 行仿真,依照标准维护多个事件队列,并执行当前事件队列里各事件所对应的语句,并 将新产生的事件加入到相应队列中,直到结束。 该方法严格的按照v e r i l o g 标准中的行为模型仿真,易于实现,早期的v e r i l o g 仿真 软件多采用该方法。 1 2 2 编译执行式 随着设计规模的不断增大,解释执行的速度渐渐不能满足要求,将中间表示编译成 可执行模块后加载执行的方式正逐渐被现代仿真软件所采用。该方法可以显著地提高仿 真速度,但在编译成可执行模块的过程中需要用到大量的编译优化技术,实现难度较大 中国科学院硕士学位论文一龙芯r t l v e r d o g 到c 翻译器的设计与实现 1 2 3 高级语言生成式 图1 1 高级语言生成式仿真流程图 该方法首先将中间表示翻译为高级语言( 如c ,c + + ) 代码,再使用高级语言编译器 ( 如g c c g + + ) 生成可执行模块,最后结合辅助模块链接成可执行文件。生成的可执行 文件在普通可执行环境上以独立进程的形式运行,以达到仿真效果。该方法的使用流程 如图1 1 。 该方法将编译优化等工作交由成熟的高级语言编译器来完成,而把重点放在原文件 的分析和高级语言代码的生成上。某些大型项目采用该方法实现专有的仿真软件,为特 殊的需求( 如性能评估等) 提供仿真平台。 1 3 国内外现状 目前,编译执行式的商业仿真软件已非常成熟,如s y n o p s y s 的v c s 等,解释执行 2 第一章0 l 苦 式的仿真软件已基本退出e d a 的舞台,而高级语言生成式仿真软件没有得到广泛的使 用,只在特定应用时才会开发专有的此类仿真软件 比较知名的商业高级语言生成式仿真软件有t e n i s o ne d a 公司出品的v t o c ,将 v e d l o g 翻译为c + + 或者s y s t e m c ,并由其另外的两个产品v t o cr u n t i m e 和v t o c v a l i d a t e 进行仿真支持和验证。 也有一些自由软件爱好者编写了免费的高级语言生成式仿真软件由w i l s o n s n y d e r 、p a u l w a s s o n 、d u a n e g a l b i 等人编写v e r i l a t o r 是该类型自由软件中知名度最 高的,也不乏使用者,但该软件是作者为其自身的项目所开发的,不提供更新和维护, 且需要有p e r l 环境的支持来自w w w s o u r c r f o r g e c o m 的v e r i l 0 9 2 c + + 虽然也具有一定的 高级语言生成的功能,但只支持了很少一部分语法,只能对部分符合输入要求的v e r i l o g 进行仿真。 1 4 本文的研究贡献 本文将针对龙芯r t l 的语法特点,设计专用的c ,c + + 语言生成式仿真软件,将龙芯 处理器的r t l 翻译成c c 什代码,为性能分析和系统评估提供统一的平台,并对基于 t r a c eb a s e d 模型的模拟( 图1 2 ) 提供与r t l 等价的模拟器部件。本文的研究工作 主要包括如下三个方面: 语法分析与中间表示 本部分主要针对龙芯r t l 的语法特点,对预处理,词法分析和语法分析等阶段 的数据结构设计与算法进行讨论良好的数据结构可以提高分析速度,并能对 中国科学院硕士学位论文一龙芯r t l v c n l o g 到c 翻译器的设计与实现 后续分析和优化提供统一的格式。 代码生成方式与优化 本部分针对龙芯r t l 的行为特点,对代码生成方式和生成代码的结构进行讨论, 并给出一些可在源代码级别优化的方法。 生成代码的测试 对于生成代码,如何确定其正确性也是非常关键的,在该部分中将分别以软件 工程的思想和i c 设计中验证的思想对生成代码的测试进行讨论,并提供多种测 试方法。 本文的主要贡献包括以下几个方面: 提供简洁的r t l 中间表示,为可能的分析提供统一的格式; 给出将r t l 转化为c c + + 语言的普适方法: 快速准确地生成龙芯处理器的模拟模型,为性能分析和系统评测提供可靠的模 拟部件; 有效地提高仿真速度及简化仿真流程。 1 5 论文组织 本文主要分七个章节进行讨论: 第一章,引言部分,首先讲述软件仿真的历史发展,然后分析国内外现状,最后阐 述为龙芯r t l 设计到c 翻译器的意义和作用; 第二章,讨论v e r i l o g 中值的表示和数据表示方法: 第三章,讨论翻译器前端的结构、使用的重要数据结构和算法; 第四章,讨论翻译器后段的流程、仿真简化模型、优化方法和代码生成方式; 第五章,讨论翻译器测试的方法,为生成代码的正确使用提供理论基础; 第六章,给出初步实验结果; 第七章,总结全文并展望未来。 最后是参考文献、作者简介以及致谢。 4 2 1 值的表示 第二章值与数据 在v e f i l o g 标准( i e e e s t d l 3 6 4 2 0 0 1 ) 中,值的表示包含四种逻辑:0 、1 、x 和z 。 其中0 和l 是基本逻辑值,分别代表低电位( 假) 和高电位( 真) ,x 代表未知状态,z 代表高阻状态由于在实际硬件中只存在高电位l 、低电位0 和高阻三种状态,所以在 可综合的龙芯r t l v e r i l o g 代码中,一般不会使用到x 值。 z 值在表达式或者门输入时可等价为x ,分析z 在各种类型线上的真值表( 表2 1 ) , 不难发现z 在普通线上的真值表( 第2 列) 与逻辑值l 在与线上的真值表( 第3 列) 和 逻辑值0 在或线上的真值表( 第4 列) 是一致的,故在处理普通线上z 值时,无需特殊 处理,而只需将普通线当作与线( 此时z 转化为逻辑值1 ,将各驱动值进行与操作来确 定线的值) 或者当作或线( 此时z 转化为逻辑值0 ,将各驱动值进行或操作来确定线的 值) 处理即可。 表2 1z 值真值表 w i r e zw a i l d 1w o r 0 o 0 oo l l ll x xx x z z lo 2 2 数据的表示 v e r i l o g 中的主要数据类型是线( w k e ) 和寄存器( r e g ) 。它们由一位或多位的值组成。 在生成代码中,需要有相应的数据表示方法对这些数据类型进行模拟,并需要实现 v e r i l o g 中的运算。 s y s t e m c 提供了一套抽象模板类( t e m p l a t ec l a s s ) 对v e r i l o g 中的数据类型进行模拟, 但由于其通用性,效率并没有达到最高考虑到一般仿真具有数据非指针定位和位选择 在翻译期就可以确定等特性,通过对s y s t e m c 源代码的分析后,设计了b i t s 抽象模板类 对线数据类型和寄存器数据类型进行模拟。其原形如下: t e m p l a t e c l a s sb i t s ; 其中h i g h 和l o w 分别表示终止位索引和起始位索引,由于各类型数据一般都是从位 0 开始进行索引的,所以l o w 的缺省值设置为0 。 中国科学院硕士学位论文一龙芯r t l v e n l o g 到c 翻译器的设计与实现 2 2 1 成员变量、预定义类型和宏 龙芯r t l 中没有使用带符号的数据类型,而且位索引都是非负整数,所以首先定义 非负整数类:t y p e d e f u n s i g n e di n tu 烈t - 为了便于跨平台移植,整数的长度交由编译器设定,定义一些宏,可以使得b i t s 的 运算不与特殊的整数长度相关,这些宏是: # d e f i n es o i s i z e o f ( u i n t ) # d e f i n em a x _ v a l u eu i n t ( - 1 ) 数据存储在该类唯一的成员变量- d 中, 的声明形式是: :整数长度 :,最大的非负整数 由于声明的变量都会从0 开始索引,所以- d p r i v a t e :m u t a b l eu i n t - d ( h i g h + s o d s 0 1 ; 2 2 2 接口成员函数 接口函数是一组让对象使用者安全访问对象私有信息( 如长度等) 的成员函数,较 重要的有: e o n s tu i n t g e t d a t a 0 c o n s t:胎出私有数据的起始地址 u i n t g e t l e n g t h 0 c o n s t :数据长度 u i n t g e t h i g h 0 c o n s t :终止位索引 u i n t g e t l o w 0 c o n s t :,起始位索引 2 2 3 静态成员函数 为了方便运算,将常用到的运算抽象为静态的成员函数,较重要的有: u i n tg e t m a s k ( u i n tm ) c o n s t v 获得最高整数位的掩码 u i n t g a u m a s k ( u i n t m ) e o n s t ;获得最低整数位的掩码 v o i d c o p y d a t a ( t 心r r + d e s ,u i n t + s r e ,u i n td 1 1 ,u i n td l ,u i n ts h ,u i n ts 1 ) ; ,将s r c s h :s 1 拷贝到d e s d h :d 1 1 2 2 4 位选择函数和多倍展开函数 位选择是v e r i l o g 里非常重要的形式,它不仅可以作为表达式的一部分,还可以被改 写。如何才能将位选择也表示为b i t s 的形式呢? 直观的方法就是重载o 运算, 使用模板成员函数: t e m p l a t e b i t s & o p e r a t o r o ( u 1 n tn e w h i g h ,u i n tn e w l o w ) ; 来完成,但是很遗憾,这样的模板函数并不被c + + 标准所认可,会产生语法错误 鉴于一般位选择的高低位索引都是常数,可编写一新的类s e l e c t r e f , 该类没有任何 成员,仅仅有两个模板参数,其原形如下: t e m p l a t e c l a s s s e l e c t r e f ; 6 第二章值与数据 重写o p e r a t o r o 函数: t e m p l a t c b i 拓 & o p e r a t o r o ( s e l e c t r e 鼬j + ) e o n s t ; 在代码生成时,将位选择的索引作为s e l e c t r e f 的模板参数即可,例如有f o o 是 b i t s 类型的,通过f o o ( ( s e l e c t r e f * ) n u l l ) 可选择其低1 6 位。 同样的原理,对于多倍展开语句,也增加了m u l t i r e f 抽象类辅助生成。 2 2 5 运算符重载 为b i t s 重载v e f i l o g 中的运算符不仅可以简化代码生成,而且可以提高生成代码的 可读性。 b i t s 重载的运算符的返回值和参数等细节,请参考表2 2 。 表2 2b i t s 运算符重载 返回类型运算符名参数目数 u d 盯 l b i t s l u d j t b i t s a n d1 i 肿b i t s o rl u d 盯b i t s x o r1 b i t sb i t s &2 u d r r = =i = b i t s &2 i 肌= b i t s &2 u d 汀 & & l i b i t s &2 b i t s = “u 烈t &2 b i t s& i “i m q t & 2 | = u 矾t &2 b i t s &u d h &2 u i n t o p e r a t o ru i n t l b o o l o p e r a t o rb o o i l 7 第三章翻译器前端 翻译器前端是一独立的程序v t o c c ( v e r i l o gt occ o m p i l e r ) ,以v e r i l o g 源文件作 为输入,经过预处理,词法分析,语法分圻后,以模块为单位输出为中间表示文件( v o ) , 为后续的分析提供简洁的统一格式 3 1 预处理 预处理( c o m p i l e r d i r e c t i v e s ) 在v e r i l o g 标准第1 9 章描述,其中不影响到仿真结果 的预处理语句将被忽略,该类语句有t i m e s c a l e 和l i n e ,而另外一些会影响到仿真结果 但不会出现在龙芯r t l 中的预处理语句将导致错误,这些语句包括c e l l d e f i n e 、 d e f a u l t _ n e t t y p e 、e n d c e l l d e f m e 、n o u n c o n n e c t e d _ d r i v e 、r e s e t a l l 和u n c o n n e c t e d _ d r i v e 下面就其他常用的预处理语句进行讨论。 3 1 1 i n c l u d e i n c l u d e 将其指示文件的内容嵌入到当前文件中,而嵌入的文件中有可能也包含 i n c l u d e 预处理语句,所以必须维护一个信息栈以保存处理i n c l u d e 时的上下文,上下文 不仅包含当前分析文件指针的偏移,而且包含当前分析行数等词法分析信息。f l e x 已经 为类似的多文件分析提供了上下文保存和恢复的机制,所以文件信息类设计为: c l a s sf i l e l n f o p u b l i c : s t r i n g f i l e n a m e ,文件名 i n l i n e n u m v 行号 v o i d *y b s ;f l e x 使用的上下文地址 ) 为处理i n c l u d e 而维护的栈对象可声明为: s t d :s t a c k i n c l u d e _ s t a c k ; 3 1 2 d e f i n e 与u n d e f 和c 语言一样,d e f i n e 与u n d e f 是定义宏和取消宏的预处理语句,由于龙芯r t l 中 没有使用含参数的宏,支持这两个预处理语句只需维护一个查找表即可,关键字是宏名, 而内容为替换字符串使用标准模版库中的m a p 类可快速构造查找表,其原形为: t y p e d e fs t d :m a p m a c r od e f i n et a b l e ; s t d :m a p 的内部实现由红黑树完成,其查找复杂度为0 ( 1 0 9 n ) 。 9 中国科学院硕:t 学位论文一尼芯r t l v c n l o g 到c 翻译器的设计与实现 3 1 3 f d e 矿i f n d e f 、e l s i f 、e l s e 和e n d i f 条件编译检查其表达式以确定到达下一个条件表达式之间的内容是否被分析,条件 编译语句可以嵌套,但不允许出现不匹配。当匹配到i f d e i f n d e f 时查找宏替换表,以 确定是否满足条件,而匹配到e l s e 和e l s e i f 时不仅需要查找宏替换表,而且需要查看同 一层次之前所处的状态才能确定是否满足条件,所以每一个条件编译层都包含两个信息 位:当前编译块是否有效和当前编译层是否已经有效过。 用一个整数来实现条件编译的状态字:每一个条件编译层占两位,低位代表当前块 可用,高位代表当前层是否已经有效过。每当匹配到i f d e f i f n d e f 时状态字左移两位, 依据上一层控制信息和条件表达式修改状态字,遇到e l s e 和e l s e i f 时依据条件表达式和 当前控制信息修改状态字,遇到e n d i f 时状态字右移两位,能够分析的嵌套层数为l = ( s o 砣一i ) 。图3 1 是该算法的原理图。 3 2 词法分析 词法分析根据v e f i l o g 标准第二章的叙述,参考附录a 8 、a 9 的b n f 定义、附录b 中的关键词列表,使用f l e x 实现,其输入是经过预处理后的语句。b n f 的形式与f l e x 所识别的语言只有些许差别,稍加修改就可以直接应用在规则部分 o 第三章翻译器前端 3 2 1 关键宇 对于v e r i l o g 支持的1 2 0 多个关键字中,只保留了龙芯r t l 使用到的一部分( 表3 1 ) 。 表3 1 关键字 ia l w a y s a s s i g nb e g i n c a s ed e f a u l te l s ee n de n d c a s e e n d m o d u l ef o r i f m o u t i n p u ti n t e g e r m o d u l e l n e g e d g e 0 r o u t p u tp a r a m e t e rp o s e d g er e g w l r e 当f l e x 匹配到这些关键字时,将返回给语法分析程序以“k _ ”为前缀的预定义宏a 3 2 2 运算符 由于龙芯r t l 中只使用了无符号类型,所以除了对个别操作符忽略外,对大部分运 算符( 表3 2 ) 均给予了有效的支持。 表3 2 运算符 类型支持的运算符不支持的运算符 目 连接 “”不确定 算数l 一 2 关系 = f = = 位运算 & i “2 kj 约简运算& ,& ii l 。 条件 ? :3 事件或 o f2 3 2 3 数值型常量 v e r i l o g 中的数值型常量不仅有大小,而且还包含可缺省的长度和进制信息,其一般 形式为:s i z e b a s en u m b e r 为了简化数值型常量的处理,将其看作是表达式的一种,每 当匹配到一个数值型常量时,总会采取如下步骤进行处理: 1 ) 分解出长度和进制信息,并用s t d :s t r i n g 类保存其数值串; 2 ) 将数值串中的z 和x 使用0 替换: 3 ) 对非l o 进制的数值串,一律转换为1 6 进制表示; 4 ) 构造一个表达式对象,并设置为数值型常量类型,其定义如下: c l a s se x p r e s s i o n :n u m b e r _ b y _ p o i n t e r p u b l i c : u i n t _ l e n g t h : 长度,缺省为0 l l 中国科学院硕士学位论文一屁芯r t l v e n l o g 到c 翻译器的设计与实现 u i n t _ b a s e : ,进制,l o 或者1 6 s t r i n g_ d a t a ; 指向数值串的指针 ; 5 ) 将该表达式加入到表达式表中,并将其在表中的序号设置为语法分析中n u m b e r 终结符的属性,最后返回给语法分析程序n u m b e r 终结符 3 2 4 标识符 由于在词法分析阶段无法确定标识符的属性,所以只在符号表中查找标识符,若 没有找寻到,则为其申请一个新表项。将标识符在符号表中的序号作为语法分析中的 i d e n t i f i e r 终结符的属性,最后返回给语法分析程序i d e n t i f i e r 终结符。 3 3 语法分析与语义检查 根据龙芯r t l 的语法特点,在语法分析阶段支持了行为级模型的大部分语法。由于 输入的龙芯r t l 是没有语义错误的,所以语义检查予以忽略。语法分析用y a c c b i s o n 来 实现,v e r i l o g 标准的附录中有详细的语法b n f 描述,值得注意的是,b n f 描述中包含 了语义信息,直接在y a c c b i s o n 中使用将会产生归约,归约和移进归约等常见的语法二 义性错误,修正这些错误会使语法丢失部分b n f 所描述的语义信息。 语法分析中,语法树的结构非常重要,合理的设计不仅可以达到满意的分析速度, 并能为后续的分析和优化提供简洁的中间表示,下面就一些重要的数据结构予以讨论 3 3 1 模块 语法分析以模块作为最小单位,每一个模块有各自的资源( 如符号表等) ,每当匹配 到一个新的模块时,则为其生成m o d u l e 对象。直到该模块分析结束,此模块对象都作 为资源的拥有和分配者每个模块包含符号表s y m b o lt a b l e 、参数信息p a r a - l i s t 、接口 信息p o r t _ l i s t 、子模块信息m o d u l e l n s t a n c e 、事件块集合a l w a y s _ s e t 和表达式表 e x p r e s s i o n _ s e t ,结构如图3 2 : 1 2 第三鼋翻译器前端 3 3 2 表达式表 表达式( e x p r e s s i o n ) 用来表示运算、变量引用或者数值型常量,通过分析,一共设 置了6 种表达式类型:l 目运算、2 日运算、3 目运算、连接运算、数值型常量和变量 引用。 这些类型对应的枚举值的低1 6 位均是0 ,这是为了l 目运算和2 目运算能够在低1 6 位存储其子运算类型而设计的。 数字形常量已经在上一节讨论过了,不再赘述。1 目、2 目、3 目运算使用 e x p r e s s i o n :o p e r a n d s 类表示,其三个成员变量o p l ,o p 2 和o p 3 为所需操作数的表达式 索引,其示结构如图3 3 。 连接使用一个指针型变量e x p r e s s i o n :_ e x p s 存储指向连接操作的操作数索引数组的 指针,其结构如图3 4 。 中国科学院硕士学位论文龙芯r t l v e n l o g 到c 翻译器的设计与实现 图3 4 连接运算表达式示意图 至于变量的引用,则记录对应标识符在符号表中的索引i d ,位选择范围r a n g e 和数 组下标d i m ,对应的数掘结构为e x p r e e s i o n :i d e n t i f c rr e f e r e n c e ,结构如图3 5 。 最后,声明一个联合体,包含各种表达式类型对应的数掘结构,按照类型使用联合 体,可以有效地节约空间 表达式表是所有表达式的集合,由一个查找树实现,可以通过表达式对象快速查找 索引号,也可以通过索引号引用表达式对象 1 4 第三章翻详器前端 3 3 3 符号表 每一个标识符占用一个符号表项,符号表的第一项是模块名,接着是接口,其次是 参数,最后是变量标示符由抽象类s y m b o l 表示,共有9 种不同的类型:输入接口、 输出接口、输出寄存器、双向接口、参数、线、寄存器、整数和其他。 每一个标识符都有一个s t d :s t r i n g 型变量r e _ n a m e 存储其名字,而每一类型对应的 数据结构则有选择的包含宽度、数组长度、持续赋值表和缺省赋值。 对于线类型、输出接口和双向接口,需要记录多个持续赋值信息,每个持续赋值信 息记录该变量的某个位选择由某个表达式所确定,定义如下: c l a s se x p r e s s i o n :w i r e :a s s i g n p u b l i c : r a n g e_ r a n g e ; 位选择范围 u i n t e i d ;持续赋值的表达式索引 而多个的持续赋值信息由s t d :v e c t o r 表示。 符号表由一个查找表和一个引用数组构成,使用数组可由索引以o ( 1 ) 的复杂度查 找标识符,而通过查找表可由标识符的名字以oo g n ) 的复杂度查找标识符,定义如 下: c l a s ss y m b o l t a b l e p u b l i c : m a p s t r i n g _ t a b l e ; v e c t o r s y m b o l _ v e c t o r ; ) 中国科学院硕士学位论文一龙芯r t l v e n l o g 到c 翻译器的设计与实现 3 3 4 参数和接口 每个参数和接口都已经在符号表中存在了。所以简单的使用v e c t o r 记录下相 应的索引即可( 图3 2 ) ,为后续的模块展开提供信息 3 3 5 子模块信息 每一个模块都可以通过传递参数和接口的方式实例化其他的模块,所以予模块 ( m o d u l e l n s t a n c e ) 包含实例名、传递的参数信息和传递的接口信息。 3 3 6 事件块集合 每个a l w a y s 块构成一个事件块,包含一个事件列表和对应得语句。每一个模块所 有的事件块按照事件列表排序构成事件块集合,可以通过事件列表快速得到对应得语 句,在语法分析中,具有相同事件列表的事件块对应的语句将会整合在一起,这样不会 改变其语义,但可以简化分析过程。 语句( s t a t e m e n t ) 共有6 种:阻塞赋值、非阻塞赋值、f o r 循环、c a s e 语句、i f e l s e 和语句块。因为这些结构可以互相嵌套,所以只能使用指针的形式保存包含的其他语句。 这些结构的设计和表达式类的设计相似,相关实现请参考源代码中的a l w a y s h 。 3 4 中间文件存储 当语法分析无误后,将每个模块存储到以模块名加后缀“v o ”的文件中。为每一个 数据类编写s a v e 例程能简单得以递归的方式保存模块。指针变量在装载时将不再有效, 仅仅作为判断空指针的依据。 至此,翻译器前端v t o c c 的过程讨论完毕,当所有的源文件都顺利通过前端的分 析后,就使用接下来介绍的v t o c l 将所有模块链接生成最终的c c + + 代码。 6 第四章翻译器后端 当所有的v e r i l o g 源文件都由v t o c c 成功地以模块为单位存储为中间表示文件后, 使用另一独立的程序v t o c l ( v e r i l o g t ocl i n k e r ) 将所有的“v o ”文件恢复后链接并 进一步分析,然后生成相应的c c + + 代码。 4 1 常用的生成方法 由中间表示,根据v e r i l o g 源文件的语法语义特点,有多种方法生成可用的c 厄+ + 代码,下面先介绍几种常用方法,然后对v t o c l 的分析过程进行讨论。 4 1 1 宏替换法 鉴于v e f i l o g 的语法特点与c c + + 语言相似,可编写一系列的宏( m a c r o ) 和过程来 支持那些c 伦+ + 不支持的语法和关键字,对源文件稍加文本级别的处理就能得到可用的 数据结构和过程,仿真时调用对应模块的生成过程即可 例如如下的v e r i l o g 模块: m o d u l ef o o ( i n p u t 且o u t p u t _ o u t ) ; a s s i g n _ o u r = i n ; e n d m o d u l e 将如下宏定义 # d e f i n em o d u l ev o i d # d e f i n ei n p u tu 1 n t # d e f i n eo u t p u tu d 盯& # d e 缸ea s s i g n # d e f i n ee n d m o d u l e ) 嵌入到模块之前,只需将第一行末尾的分号去掉即可成为语法与功能皆正确的c 语 言函数。 尽管这个例子过于特殊,但不难发现这种方法生成的代码可以保持v e r i l o g 源文件的 层次结构和接口信息,可读性强,但适用范围非常小,代码效率由于参数传递和过程调 用开销过大而偏低 4 1 2 过程化生成法 分析单个模块的中间表示,直接为该模块生成一些数据结构和过程,仿真时调用该 模块的对应过程完成对应的仿真,其内部所需数据以参数的形式

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论