CN117270863A - 一种基于增量编译的Verilog语法分析方法 - Google Patents

一种基于增量编译的Verilog语法分析方法 Download PDF

Info

Publication number
CN117270863A
CN117270863A CN202311164607.9A CN202311164607A CN117270863A CN 117270863 A CN117270863 A CN 117270863A CN 202311164607 A CN202311164607 A CN 202311164607A CN 117270863 A CN117270863 A CN 117270863A
Authority
CN
China
Prior art keywords
module
verilog
modules
dependency
file
Prior art date
Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
Pending
Application number
CN202311164607.9A
Other languages
English (en)
Inventor
陈乡栎
陈钢
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
Nanjing University of Aeronautics and Astronautics
Original Assignee
Nanjing University of Aeronautics and Astronautics
Priority date (The priority date is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the date listed.)
Filing date
Publication date
Application filed by Nanjing University of Aeronautics and Astronautics filed Critical Nanjing University of Aeronautics and Astronautics
Priority to CN202311164607.9A priority Critical patent/CN117270863A/zh
Publication of CN117270863A publication Critical patent/CN117270863A/zh
Pending legal-status Critical Current

Links

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F8/00Arrangements for software engineering
    • G06F8/40Transformation of program code
    • G06F8/41Compilation
    • G06F8/42Syntactic analysis
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F8/00Arrangements for software engineering
    • G06F8/30Creation or generation of source code
    • G06F8/31Programming languages or programming paradigms
    • G06F8/315Object-oriented languages
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F8/00Arrangements for software engineering
    • G06F8/40Transformation of program code
    • G06F8/41Compilation
    • G06F8/43Checking; Contextual analysis
    • G06F8/433Dependency analysis; Data or control flow analysis

Abstract

本发明公开了一种基于增量编译的Verilog语法分析方法,包括首次编译和再编译两个阶段;以模块为基本单位对硬件代码进行语法分析,通过模块实例化语句获取模块间的依赖关系,将得到的抽象语法树结构和模块依赖关系表存储在二进制文件中;代码发生修改需要重新进行语法分析时,根据模块依赖表,只对修改的模块及其相关模块重新进行语法分析,可以极大地缩短编译时间;本发明语法分析得到的抽象语法树结构具有通用性,将其作为增量编译的中间结果表示,解决了现有增量编译技术中间语言与目标应用耦合过紧的问题,能够更灵活地支持不同应用的增量编译实现。

Description

一种基于增量编译的Verilog语法分析方法
技术领域
本发明涉及电子设计自动化技术领域,具体涉及一种基于增量编译的Verilog语法分析方法。
背景技术
增量编译技术最早起源于软件领域,其技术核心是只编译代码中被修改的部分,以提高编译效率。因此,基于增量编译的程序开发必须考虑编译结果的保存问题,以便下一次编译时使用。在软件开发中,增量编译的结果通常只需要满足一个单一的需求,即生成计算机底层的机器码。因此,软件编程语言中的增量编译技术通常保存与目标代码结构相似的中间结果,也就是同汇编代码接近的.o文件。所以,增量编译中间结果的数据结构往往同目标语言绑定。
随着硬件设计规模的扩大,增量编译技术在硬件领域也变得流行。与软件领域增量编译单一的需求不同,硬件语言编译的中间结果具有多种用途,包括仿真、网表生成、形式化验证、时序分析以及不同硬件语言之间代码转换等。然而,现有的硬件语言编译技术都与特定应用密切相关,比如,同仿真有关的增量编译产生的中间代码是适合仿真的中间代码。这样导致所保存的增量编译结果缺少通用性,只能直接满足目标应用需求。例如,在论文《基于层次化设计的Verilog HDL增量编译方法》中,提出了一种利用Verilog语言层次化特点的增量编译方法。由于该论文的目的是将Verilog语言转化为VHDL语言,因此在编译结果的生成上,选择了一种更适合VHDL语言生成的层次结构。但是,这种结构缺乏通用性,无法直接用于逻辑综合等其他开发用途。此外,为了生成这种专门的中间结果,每次编译都需要对代码中的模块进行排序,优先编译底层模块,这在一定程度上影响了编译效率。
发明内容
发明目的:本发明的目的是提供一种基于增量编译的Verilog语法分析方法解决了现有增量编译技术中间语言与目标应用紧密相关的问题;采用以模块为单位的增量编译方法,当出现微小的修改仅限于某个模块时,相较于整个文件的重新编译,仅对发生修改的模块本身及其依赖模块进行重编译能够显著节省重编译所需的时间。
技术方案:本发明所述的一种基于增量编译的Verilog语法分析方法,包括首次编译和再编译两个阶段;
首次编译阶段对Verilog文件全部模块进行语法分析,包括以下步骤:
(1)获取待分析的Verilog文件代码,以模块为单位读入;
(2)对读入模块代码进行预处理,主要进行宏定义替换,并删除代码中的宏定义部分;
(3)对预处理后的模块代码进行语法分析,得到该模块对应的抽象语法树结构,将抽象语法树结构存储到二进制文件中;
(4)分析抽象语法树结构内部的模块依赖关系,获得模块依赖集合,存储到全局模块依赖关系表中;
(5)当Verilog文件中所有模块都编译完毕,将得到的模块依赖关系表结构写入二进制文件开头。
进一步的,再编译阶段对Verilog文件中用户指定模块重新进行语法分析,包括以下步骤:
(S1)获取用户指定需要重编译的模块名称;
(S2)根据用户指定模块名获取相应代码,对其进行语法分析,并分析修改类型,若是外向型修改则根据模块依赖关系得到需要重新进行语法分析的模块集合,否则将当前模块的语法分析结果直接存储到新二进制文件中,其余模块的语法分析结果从步骤(3)二进制文件中获取;
(S3)以模块为单位读入代码,判断当前模块是否存在于需要重新进行语法分析的模块集合中,若存在则对该模块重新进行预处理、语法分析以及模块依赖分析操作,并将得到的抽象语法树结构输出到新的二进制文件中,若不存在则从步骤(3)的二进制文件获取当前模块上一次语法分析结构存入新的二进制文件;
(S4)当Verilog文件中所有模块处理完毕,将更新后的模块依赖关系表结构写入新的二进制文件开头,并删除旧的二进制文件。
进一步的,所述步骤(4)包括:分析抽象语法树结构内部是否存在模块实例化相关语句,若存在则向全局模块依赖关系表中添加相应的模块依赖关系,若不存在则继续读取下一模块代码。
进一步的,所述步骤(S1)获取用户指定需要重编译的模块名称包括:获取Verilog文件首次编译得到的二进制文件头部的模块依赖关系表;根据模块依赖关系表获取依赖用户指定模块的所有模块,这些模块同用户指定模块一同构成需要重新进行语法分析的模块集合。
进一步的,所述模块实例化相关语句包括:在当前模块中对其他模块进行实例化;在当前模块中直接使用其他模块名进行层次调用。
进一步的,向全局模块依赖关系表中添加相应的模块依赖关系包括:从模块实例化相关语句中获得被实例化的模块名;从全局模块依赖关系表中查找被实例化的模块的依赖模块集合,将当前模块添加到该依赖集合中。
进一步的,所述根据模块依赖关系表获取依赖用户指定模块的所有模块具体如下:以用户指定模块名为键,在模块依赖关系表中检索其对应的值,得到依赖用户指定模块的所有模块构成的集合。
本发明所述的一种基于增量编译的Verilog语法分析系统,包括:
输入单元,包括命令行指令读取和待分析的Verilog代码读取,其中Verilog代码的读取以模块为单位进行;
选项处理单元,用于解析命令行指令中的选项参数;
预处理单元,用于对Verilog文件进行宏定义替换等预处理操作;
模块依赖关系分析单元,根据模块内部实例化相关语句分析Verilog文件的模块依赖关系;
语法分析单元,分析修改类型,根据用户输入的模块名,在模块依赖表中查找所有依赖于该模块的模块,这些模块同用户指定模块一起构成需要重新进行语法分析的模块集合,再编译时,仅对该模块集合中的模块重新进行语法分析;
本发明所述的一种设备,包括存储器、处理器及存储在存储器上并可在处理器上运行的程序,其特征在于,所述处理器执行所述程序时实现任一项所述的一种基于增量编译的Verilog语法分析方法中的步骤。
本发明所述的一种存储介质,存储有计算机程序,其特征在于,所述计算机程序被设计为运行时实现根据任一项所述的一种基于增量编译的Verilog语法分析方法中的步骤。
有益效果:与现有技术相比,本发明具有如下显著优点:以模块为单位读入代码进行编译,解决了超大规模Verilog设计代码一次性读取会突破内存限制导致语法分析程序崩溃的问题;根据模块语句获取模块间的依赖关系,并将模块依赖关系表和语法分析得到的抽象语法树结构存储在二进制文件中,代码发生修改时,根据模块修改类型和模块依赖关系表,得到需要重新进行语法分析的模块所组成列表,只对该列表中的模块重新进行语法分析,其余模块则保留二进制文件中存储的结果,有效缩短了硬件代码语法分析简短迭代的时间,提高了开发的效率;将抽象语法树结构作为中间结果保存在二进制文件中,可以更具通用性地支持后续其他EDA工具开发,显著提高了EDA工具开发的快捷性。
附图说明
图1为本发明的流程示意图;
图2为本发明某个实施场景中使用的项目文件结构图;
图3为本发明某个实施场景中使用的项目文件结构图所对应的模块依赖关系图;
图4为本发明首次编译的过程示意图;
图5为本发明再编译的过程示意图;
图6为本发明系统结构图。
具体实施方式
下面结合附图对本发明的技术方案作进一步说明。
本发明实施例提供了一种基于增量编译的Verilog语法分析方法,包括首次编译和再编译两个阶段;
首次编译阶段对Verilog文件全部模块进行语法分析,包括以下步骤:
(1)获取待分析的Verilog文件代码,以模块为单位读入;
(2)对读入模块代码进行预处理,主要进行宏定义替换,并删除代码中的宏定义部分;
(3)对预处理后的模块代码进行语法分析,得到该模块对应的抽象语法树结构,将抽象语法树结构存储到二进制文件中;
(4)分析抽象语法树结构内部的模块依赖关系,获得模块依赖集合,存储到全局模块依赖关系表中;包括:分析抽象语法树结构内部是否存在模块实例化相关语句,若存在则向全局模块依赖关系表中添加相应的模块依赖关系,若不存在则继续读取下一模块代码。模块实例化相关语句包括:在当前模块中对其他模块进行实例化;在当前模块中直接使用其他模块名进行层次调用。向全局模块依赖关系表中添加相应的模块依赖关系包括:从模块实例化相关语句中获得被实例化的模块名;从全局模块依赖关系表中查找被实例化的模块的依赖模块集合,将当前模块添加到该依赖集合中。
(5)当Verilog文件中所有模块都编译完毕,将得到的模块依赖关系表结构写入二进制文件开头。
再编译阶段对Verilog文件中用户指定模块重新进行语法分析,包括以下步骤:
(S1)获取用户指定需要重编译的模块名称;包括:获取Verilog文件首次编译得到的二进制文件头部的模块依赖关系表;根据模块依赖关系表获取依赖用户指定模块的所有模块,这些模块同用户指定模块一同构成需要重新进行语法分析的模块集合。根据模块依赖关系表获取依赖用户指定模块的所有模块具体如下:以用户指定模块名为键,在模块依赖关系表中检索其对应的值,得到依赖用户指定模块的所有模块构成的集合。
(S2)根据用户指定模块名获取相应代码,对其进行语法分析,并分析修改类型,若是外向型修改则根据模块依赖关系得到需要重新进行语法分析的模块集合,否则将当前模块的语法分析结果直接存储到新二进制文件中,其余模块的语法分析结果从步骤(3)二进制文件中获取;
(S3)以模块为单位读入代码,判断当前模块是否存在于需要重新进行语法分析的模块集合中,若存在则对该模块重新进行预处理、语法分析以及模块依赖分析操作,并将得到的抽象语法树结构输出到新的二进制文件中,若不存在则从步骤(3)的二进制文件获取当前模块上一次语法分析结构存入新的二进制文件;
(S4)当Verilog文件中所有模块处理完毕,将更新后的模块依赖关系表结构写入新的二进制文件开头,并删除旧的二进制文件。
具体实施例如下:
实施例1:
本实施例提供的方法针对Verilog硬件代码项目,本发明提出了以模块为基本单位的增量编译技术,每次读入一个模块代码,执行预处理、语法分析等一系列操作后,再读入下一模块代码,并重复这一过程直至整个文件代码都编译完成。以模块为基本单位进行增量式语法分析,这是增量式语法分析技术的要点之一,它解决了超大规模芯片设计代码语法分析在代码读入阶段就发生崩溃的问题。
本发明的第二个要点是将语法分析结果作为中间结果存储在二进制文件中,具体包括语法分析得到的抽象语法树结构和根据模块内部实例化语句得到的模块间依赖关系表。Verilog文件代码的各个模块之间并不完全独立,而是通过实例化的方式建立联系,并以实例名或层次名访问的方式实现信息交互,形成模块间的依赖关系。当一个模块内部发生代码修改,所有依赖于该模块的模块也需要重新进行语法分析。
如图1所示,本发明实施例提供的一种基于语法树的通用增量编译方法具体步骤如下:
步骤101:对需要编译的文件进行语法分析和模块依赖分析,将分析得到的抽象语法数结构和模块依赖表存储在二进制文件中。
在本实施例中,最小的编译单元是模块,一方面,按顺序读入并处理单个模块,避免了一次性读入超大规模硬件代码所带来的存储空间爆炸问题,另一方面,增量编译是,不需要对整个文件进行编译,而只需编译发生修改的模块及其影响到的相关模块,减少了需要重编译的代码量,提高了编译效率。
Verilog项目通常由多个文件组成,所以可能存在跨文件的模块依赖,为了后续重编译时能够快速定位模块所在位置,在进行模块依赖分析的时候,我们需要不仅需要记录模块名称,还需要记录文件名。在本实例中,为了描述方便,直接用文件名.模块名表示目标模块,在实际应用中,可以将文件名和模块名分开存储,例如,在某些开发软件中,可以将模块名作为文件名信息的字段。例如,在文件A中通过include关键字引用了文件B,并且文件A中的模块m1实例化了文件B中的模块m2。当模块m2发生修改,可能导致模块m1需要进行重编译。因此,我们称B.m2和A.m1具有依赖关系,具体地,A.m1依赖于B.m2,B.m2的修改可能会影响A.m1。
在具体实施实例中,可以根据具体使用的开发软件语言进行依赖分析表的建立,在本实例中,通过依赖关系表来表示模块之间的依赖关系,依赖关系表中的每一行代表目标文件中的每一个模块,每一行的内容为多个模块名称组成的依赖集,依赖集中的模块依赖于该行所表示模块。在本具体实施实例中,发生修改的模块名称由外部提供,因此,默认修改集中于单个模块中,由于各个模块之间通过端口间信号交流进行信息传递,因此模块之间的依赖关系影响不存在传递性。例如,A.m1依赖于B.m2,B.m2依赖于B.m3,A.m1在B.m2的依赖集中,B.m2在B.m3的依赖集中,但是A.m1不在B.m3的依赖集中。并且,由于模块之间没有重要程度之分,模块名称在依赖集中的前后位置对增量编译顺序无影响。
模块之间依赖关系的确立是由模块内部语句决定的,在本实例中,在进行语法分析的同时进行模块依赖分析,当模块语法分析中出现模块实例化和模块引用时,存在模块之间依赖关系,具体分析:
(1)模块实例化:如下代码所示,对模块A.m1进行语法分析时,A.m1中存在实例化语句m2 test(m,n,0),则认为A.m1和B.m2之间存在依赖关系,A.m1依赖于B.m2,将A.m1模块名加入到B.m2所代表的模块依赖集中,表示为B.m2:{A.m1}。
filename A.v:
include“B.v”
module m1(input m,n,output o);
...
m2 test(m,n,o);
...
endmodule
(2)模块引用:如下代码所示,模块C.m3内部对模块D.m4内部信号para进行了引用,则认为C.m3和D.m4之间存在依赖关系,C.m3依赖于D.m4,将C.m3模块名加入到D.m4所代表的模块依赖集中,表示为D.m4:{C.m3}。
filename C.v:
include“D.v”
module m3(input m,n,output o);
...
m4.para=2;
...
endmodule
图2所示是某个简单项目结构,该项目案例没有实现特殊的逻辑功能,仅为了完整展示模块间依赖关系的提取和存储。图3的左边是图2项目中各个文件模块间的依赖关系,“->”表示箭头的始端依赖于箭头的末端,例如,最上面的,“A.top->A.sub_m3”表示模块A.top依赖于模块A.sub_m3,因此,将A.top添加到A.sub_m3的依赖集合中,同样的道理,模块A.sub_m3依赖于B.sub_m1和B.sub_m2,将A.sub_m3分别被添加到B.sub_m1和B.sub_m2的依赖集合中;类似的分析方式,模块B.sub_m2内部实例化了模块B.sub_m1,模块B.sub_2被添加到模块B.sub_1的依赖集合。至此,我们得到图3右边完整的模块依赖关系表。在具体案例实施中,模块依赖关系表可以根据实际需要采取任意数据结构,例如:列表、哈希表等。
语法分析和依赖分析的结果作为中间结果存储在二进制文件中,二进制文件的命名和后缀可以根据需要任意选取,只需保证重编译时系统可以清楚找到找到中间结果文件。
步骤102:外部提供发生修改的模块名称,获取发生了修改的模块代码,分析修改类型。
在本实施例中,发生修改的模块名称由外部提供,在具体的案例场景中,外部提供方有可能是用户,也有可能是其他系统模块。对代码进行修改的类型不同,需要重新编译的模块数量也不同。具体分为内部修改和外部修改两种,内部修改只影响模块内部,而外部修改将对其他模块造成影响。例如,若对当前模块端口数量进行修改,属于外部修改,当前模块及所有实例化了当前模块的模块代码都需要重新编译;若仅修改当前模块内部的逻辑实现语句或者注释,属于内部修改,则仅需要对该模块本身进行重编译。
修改类型的检查涉及到同修改前代码的对比,即跟上次语法分析后存储在二进制文件中的抽象语法树结构进行对比,在本实施例中,为了方便对比,采取的策略为先从新的目标源代码中读取发生了修改的模块,对其进行语法分析,得到抽象语法结构,同时从二进制文件中读取相应模块之前的抽象语法结构,对两个抽象语法结构进行对比,以快速定位修改的类型。
具体实施过程中,以开发语言为函数式语言OCaml为例,假设用记录类型对模块的语法结构进行表示,则按顺序对记录中每个字段进行相等性判断,当某个字段出现不同时,根据该字段所表示的语义判断是否可以确认修改的类型,如果可以则结束对比,否则,进一步对该字段内部的结构进行对比,直至可以确认修改的类型或者碰到基本类型。在具体实施场景下,采用不同的软件编程语言实现,对比的方式可能存在不同,本案例中采取深度优先搜索的方式进行对比,采用其他数据结构表示语法分析结果,可能存在其他对比方式。
下面提供一些比较笼统的、常见的修改类型及其所属修改类型,在实际实施过程中,可以根据具体修改类型的具体定义、所使用软件语言的特性,项目实际架构等设置相应的修改类型判断规则。
(1)当修改的语法类型是模块名称或者端口名时,修改类型为外部修改。
(2)当修改的语法类型是端口个数或者端口定义时,修改类型为外部修改。
(3)当修改的语法类型是内部参数时,修改类型为内部修改。
(4)当修改的语法类型是实例化和模块引用之外的内部逻辑实现,具体地,包括参数的个数和类型修改,赋值语句、条件语句、循环语句等,修改类型为内部修改。
步骤103:根据模块依赖关系表,找到需要重编译的模块,重新对其进行语法分析,更新二进制文件。
具体实施过程中,根据修改类型不同,需要重编译的模块也不同。
对于内部修改类型,只需要重新对当前模块进行语法分析,在本实例中,进行模块修改类型分析之前就对当前模块进行了语法分析,因此,不再需要重新进行语法分析,只需用语法分析的结果替换掉二进制文件中原来的语法分析结果。
对于外部修改类型,需要对所有依赖于当前模块的模块代码重新编译,具体地,根据外部提供的模块名,从模块依赖关系表中获取其对应依赖集,对依赖集中的所有模块重新进行语法分析和模块依赖分析,同时更新二进制文件。
代码修改可能会带来模块依赖关系的变化,在语法分析的同时,也需要重新对模块的依赖关系进行分析,并更新二进制文件中的模块依赖关系表。
同样以图2案例进行说明,假设修改模块B.sub_m1,新增了一个输入端口,分析其修改类型为外部修改,因此需要重编译所有依赖于B.sub_m1的模块,从图3右边的模块依赖表可知,{B.sub_m2,A.sub_m3}都需要重新进行语法分析和模块依赖分析,同时更新二进制文件。
在不同的具体应用场景中,还可以根据不同的需求和具体情况进行补充和调整。以下简单提供一些开发思路,可以根据项目实际需要进行参考补充。
步骤102考虑到了系统同外部的信息交互,即通过外部获取修改的模块名称,然而在实际实施过程中,系统外部还可以提供其他信息作为编译参数,主要包括:修改的模块列表、中间结果文件、依赖关系。
(1)修改的模块列表:明确指定哪些模块发生了改变,在进行增量编译时编译器跳过步骤102,直接对指定的模块进行重新语法分析。
(2)中间结果文件:指定编译的中间结果文件。
(3)依赖关系:可以使用现成的代码管理工具得到现成的模块依赖关系,提供给编译器。
在实际应用场景中,可以根据选择的开发软件,使用不同的数据结构来表示上述参数,并且根据具体需求,还可以补充提供其他的参数。
实施例2:
根据实施例1,在不同应用场景中,可以采用不同的实施方法。本实施例给出一种具体场景下的案例。
Verilog代码的增量编译可以分为首次编译和再编译两个阶段。
首次编译的流程图如图4所示:
步骤201:读取一个模块代码。
步骤202:对当前模块代码进行预处理,包括一些宏定义替换和其他必要的转换。例如,对于以“include”关键字定义的文件引用,可以用目标文件代码替换“include”语句。
步骤203:对预处理后的模块代码进行语法分析,得到抽象语法树结构。
步骤204:将语法分析得到的抽象语法树结构存储到二进制文件中。
步骤205:判断当前模块是否存在模块间依赖关系,存在转步骤206,否则转步骤201.
步骤206:将模块关系存储到全局依赖表中,具体地,在全局依赖表中找到实例化模块所在行,将当前读取的模块加到实例化模块的依赖集中。
重复上述步骤直至步骤201无法再进一步读取模块。
再编译的流程图如图5所示:
步骤301:根据外部输入的发生了代码修改的模块名称,读入相应模块,对相应模块进行语法分析,判断修改类型。
步骤302:分析修改类型,判断是否为外向型修改,若是,转步骤303,否则转步骤304。
步骤303:根据依赖关系表获取所有需要重新编译的模块名列表。
步骤304:将抽象语法树结构存储到新的二进制文件,并从旧的二进制文件中读取其他模块之前的语法分析结果,存储到新的二进制文件中,重编译结束。
步骤305:针对整个项目文件,按照文件顺序和模块顺序读入一个模块。
步骤306:判断当前读取到的模块名是否在需要重编译的模块名列表中,若是转步骤307,否则转步骤308。
步骤307:对当前读取到的模块进行语法分析和模块依赖分析,语法分析结果存储到新的二进制文件中,同时更新全局模块依赖关系表。
步骤308:从旧的二进制文件中读入之前的语法分析结果,存储到新的二进制文件中。
重复上述步骤直至步骤305无法再进一步读取模块或步骤304重编译结束。
如图6所示,一种基于语法树的Verilog语言增量编译系统架构包括:输入单元、选项处理单元、预处理单元、模块依赖分析单元、语法分析单元。
输入单元:负责处理工具的输入,包括命令行指令读取和Verilog代码读取,命令行指令的读取包括文件路径和命令行参数信息,可以通过命令行窗口进行输入,也可以以文件形式给出。
选项处理单元:对命令行指令进行解析,具体包括:解析文件路径,读取文件代码;解析命令行参数,得到增量编译信息。
预处理单元:为了方便后续增量编译,对Verilog文件代码进行预处理。
模块依赖关系分析单元:分析Verilog代码文件,分析模块内部语句,确定模块之间的依赖关系,构建得到模块依赖表结构。
语法分析单元:分析修改类型,根据修改类型和用户输入模块,确定需要重新进行语法分析的模块集合。在编译时,仅对该集合中的模块进行语法分析,优化了编译过程的效率。
实施例3:
在实例2提供的基于语法树的Verilog语言增量编译系统架构基础上,本发明还提供了一个具体的实现实例,该实施例是一个命令行工具,以Stagira命名。
Stagira通过命令行指令同用户进行交互,指令的一般格式为:
./stagira.exe<Verilog文件路径><命令行参数>
同增量编译有关的命令行参数如下表1所示
表1:
输入单元对命令行指令进行解析,根据指令所给的<Verilog文件路径>,以模块为单位读取代码,然后传递给预处理单元,同时,输入单元还会将命令行指令中的<命令行参数>传递给选项处理单元,选项处理单元对<命令行参数>进行解析,解析结果会传递给预处理单元、模块依赖分析单元、语法分析单元。三个单元根据不同的解析结果执行不同的操作。下面以图2的项目为例,介绍具体操作流程。
运行下面命令行指令对其进行增量语法分析:
./stagira pro-incr-wtbin
首先,输入单元解析该指令得到Verilog代码路径pro/和命令行参数-incr-wtbin,根据路径读入代码(按文件代码顺序读入),并将参数传递给选项处理单元,选项处理单元解析参数,得知应该对读入的代码进行增量式语法分析并将结果存储在二进制文件,解析的结果传入预处理单元、模块依赖单元以及语法分析单元,这三个单元对项目pro进行首次编译操作,并将得到的依赖分析表(图3右)和语法分析结果存储到二进制文件pro.out中。
假设对模块A.sub_m3进行修改,增添输入端口c,相应的,模块A.top中对模块A.sub_m3的层次引用做出修改。执行下面的命令行指令对A.top模块进行重编译:
./stagira pro-module_name sub_m3-rdbin
对于重编译过程,输入单元和选项处理单元执行的操作同首次编译是一样的。用户指定重编译模块A.sub_m3,模块依赖分析单元首先创建新的二进制文件top.out2,然后从二进制文件pro.out头部取出依赖关系表(图3右),查找到依赖模块A.sub_m3的模块集合只包含模块A.top,也就是说,需要重新进行语法分析的模块构成的集合是:{A.sub_m3、A.top}
按顺序读入各个模块,对于集合S中的模块A.sub_m3和A.top,重新进行语法分析和模块依赖分析,更新模块依赖表(本实施例中无需更新模块依赖表),并将分析结果输出到top.out2中;而对于不在集合S中的模块B.sub_m1和B.sub_m2,从pro.out文件中读取上一次语法分析结果,写入pro.out2文件。
所有模块都处理完毕后,将模块依赖表插入pro.out2文件头部,删除pro.out文件,并更改pro.out2文件名称为pro.out。
对比图2项目的首次编译和再编译过程,再编译过程省去了对模块B.sub_m1和B.sub_m2的语法分析操作,减少了编译时间,提高了硬件代码语法分析的效率。随着设计代码的增加,这样的效率提升会更为明显。
应理解,尽管在上文中描述了系统的若干单元及各个单元所执行的操作,但是单元及单元操作的划分方式不限于此。事实上,上文描述的多个单元操作可以合并在一个单元中实现,反过来,上文描述的一个单元也可以进一步划分为多个单元,相应地,单元原本执行的操作也可以进一步细分。
本发明实施例还提供了一种设备,包括存储器、处理器及存储在存储器上并可在处理器上运行的程序,其特征在于,所述处理器执行所述程序时实现任一项所述的一种基于增量编译的Verilog语法分析方法中的步骤。
本发明实施例还提供了一种存储介质,存储有计算机程序,其特征在于,所述计算机程序被设计为运行时实现根据任一项所述的一种基于增量编译的Verilog语法分析方法中的步骤。

Claims (10)

1.一种基于增量编译的Verilog语法分析方法,其特征在于,包括首次编译和再编译两个阶段;首次编译阶段对Verilog文件全部模块进行语法分析,包括以下步骤:
(1)获取待分析的Verilog文件代码,以模块为单位读入;
(2)对读入模块代码进行预处理,主要进行宏定义替换,并删除代码中的宏定义部分;
(3)对预处理后的模块代码进行语法分析,得到该模块对应的抽象语法树结构,将抽象语法树结构存储到二进制文件中;
(4)分析抽象语法树结构内部的模块依赖关系,获得模块依赖集合,存储到全局模块依赖关系表中;
(5)当Verilog文件中所有模块都编译完毕,将得到的模块依赖关系表结构写入二进制文件开头。
2.根据权利要求1所述的一种基于增量编译的Verilog语法分析方法,其特征在于,再编译阶段对Verilog文件中用户指定模块重新进行语法分析,包括以下步骤:
(S1)获取用户指定需要重编译的模块名称;
(S2)根据用户指定模块名获取相应代码,对其进行语法分析,并分析修改类型,若是外向型修改则根据模块依赖关系得到需要重新进行语法分析的模块集合,否则将当前模块的语法分析结果直接存储到新二进制文件中,其余模块的语法分析结果从步骤(3)二进制文件中获取;
(S3)以模块为单位读入代码,判断当前模块是否存在于需要重新进行语法分析的模块集合中,若存在则对该模块重新进行预处理、语法分析以及模块依赖分析操作,并将得到的抽象语法树结构输出到新的二进制文件中,若不存在则从步骤(3)的二进制文件获取当前模块上一次语法分析结构存入新的二进制文件;
(S4)当Verilog文件中所有模块处理完毕,将更新后的模块依赖关系表结构写入新的二进制文件开头,并删除旧的二进制文件。
3.根据权利要求1所述的一种基于增量编译的Verilog语法分析方法,其特征在于,所述步骤(4)包括:分析抽象语法树结构内部是否存在模块实例化相关语句,若存在则向全局模块依赖关系表中添加相应的模块依赖关系,若不存在则继续读取下一模块代码。
4.根据权利要求2所述的一种基于增量编译的Verilog语法分析方法,其特征在于,所述步骤(S1)获取用户指定需要重编译的模块名称包括:获取Verilog文件首次编译得到的二进制文件头部的模块依赖关系表;根据模块依赖关系表获取依赖用户指定模块的所有模块,这些模块同用户指定模块一同构成需要重新进行语法分析的模块集合。
5.根据权利要求3所述的一种基于增量编译的Verilog语法分析方法,其特征在于,所述模块实例化相关语句包括:在当前模块中对其他模块进行实例化;在当前模块中直接使用其他模块名进行层次调用。
6.根据权利要求3所述的一种基于增量编译的Verilog语法分析方法,其特征在于,向全局模块依赖关系表中添加相应的模块依赖关系包括:从模块实例化相关语句中获得被实例化的模块名;从全局模块依赖关系表中查找被实例化的模块的依赖模块集合,将当前模块添加到该依赖集合中。
7.根据权利要求4所述的一种基于增量编译的Verilog语法分析方法,其特征在于,所述根据模块依赖关系表获取依赖用户指定模块的所有模块具体如下:以用户指定模块名为键,在模块依赖关系表中检索其对应的值,得到依赖用户指定模块的所有模块构成的集合。
8.一种基于增量编译的Verilog语法分析系统,其特征在于,包括:
输入单元,包括命令行指令读取和待分析的Verilog代码读取,其中Verilog代码的读取以模块为单位进行;
选项处理单元,用于解析命令行指令中的选项参数;
预处理单元,用于对Verilog文件进行宏定义替换等预处理操作;
模块依赖关系分析单元,根据模块内部实例化相关语句分析Verilog文件的模块依赖关系;
语法分析单元,分析修改类型,根据用户输入的模块名,在模块依赖表中查找所有依赖于该模块的模块,这些模块同用户指定模块一起构成需要重新进行语法分析的模块集合,再编译时,仅对该模块集合中的模块重新进行语法分析。
9.一种设备,包括存储器、处理器及存储在存储器上并可在处理器上运行的程序,其特征在于,所述处理器执行所述程序时实现如权利要求1-7任一项所述的一种基于增量编译的Verilog语法分析方法中的步骤。
10.一种存储介质,存储有计算机程序,其特征在于,所述计算机程序被设计为运行时实现根据权利要求1至7任一项所述的一种基于增量编译的Verilog语法分析方法中的步骤。
CN202311164607.9A 2023-09-11 2023-09-11 一种基于增量编译的Verilog语法分析方法 Pending CN117270863A (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN202311164607.9A CN117270863A (zh) 2023-09-11 2023-09-11 一种基于增量编译的Verilog语法分析方法

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN202311164607.9A CN117270863A (zh) 2023-09-11 2023-09-11 一种基于增量编译的Verilog语法分析方法

Publications (1)

Publication Number Publication Date
CN117270863A true CN117270863A (zh) 2023-12-22

Family

ID=89216969

Family Applications (1)

Application Number Title Priority Date Filing Date
CN202311164607.9A Pending CN117270863A (zh) 2023-09-11 2023-09-11 一种基于增量编译的Verilog语法分析方法

Country Status (1)

Country Link
CN (1) CN117270863A (zh)

Similar Documents

Publication Publication Date Title
Marwedel et al. Code generation for embedded processors
US7571427B2 (en) Methods for comparing versions of a program
KR101150003B1 (ko) 소프트웨어 개발 툴 생성 방법
JP2602205B2 (ja) データベース・アクセス制御方法
US7657878B2 (en) Compiler, method of compiling and program development tool
US9081586B2 (en) Systems and methods for customizing optimization/transformation/ processing strategies
Rompf et al. Functional pearl: a SQL to C compiler in 500 lines of code
US7350180B1 (en) Search algorithm for inheriting clock contexts in hardware description language translation tools
US20090328016A1 (en) Generalized expression trees
US20070074185A1 (en) Identifier expressions
Aiken et al. A toolkit for constructing type-and constraint-based program analyses
JPH06501583A (ja) 多言語最適化コンパイラ内のフォールディングメカニズムを構成する方法
US7716656B2 (en) Nullable and late binding
CN114841103B (zh) 门级电路的并行仿真方法、系统、存储介质及设备
US6687899B1 (en) Relocation format for linking
US20230113783A1 (en) Cross-platform code conversion method and device
CN117270863A (zh) 一种基于增量编译的Verilog语法分析方法
US11550556B1 (en) Efficient semantic analysis of program code
GB2420638A (en) Method of substituting code fragments in Internal Representation
CN114489653A (zh) 基于编译器的数据处理方法、装置以及可读存储介质
CN111767033A (zh) 用于机械臂程序开发的编程系统及功能扩展方法
US7506287B2 (en) Method, system, and program product for pre-compile processing of hardware design language (HDL) source files
JPH11272475A (ja) 非リエントラントプログラムの自動リエントラント化方法及びシステム
CN116560667B (zh) 一种基于预编译延迟执行的拆分调度系统及方法
US20120330878A1 (en) Conventions for inferring data models

Legal Events

Date Code Title Description
PB01 Publication
PB01 Publication
SE01 Entry into force of request for substantive examination
SE01 Entry into force of request for substantive examination