CN117406996A - 硬件描述代码的语义分析方法及装置 - Google Patents

硬件描述代码的语义分析方法及装置 Download PDF

Info

Publication number
CN117406996A
CN117406996A CN202311366523.3A CN202311366523A CN117406996A CN 117406996 A CN117406996 A CN 117406996A CN 202311366523 A CN202311366523 A CN 202311366523A CN 117406996 A CN117406996 A CN 117406996A
Authority
CN
China
Prior art keywords
statement
code
ifdefflag
definition
macro definition
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.)
Granted
Application number
CN202311366523.3A
Other languages
English (en)
Other versions
CN117406996B (zh
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.)
Beijing Chenzhi Semiconductor Technology Co ltd
Original Assignee
Beijing Chenzhi Semiconductor Technology Co ltd
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 Beijing Chenzhi Semiconductor Technology Co ltd filed Critical Beijing Chenzhi Semiconductor Technology Co ltd
Priority to CN202311366523.3A priority Critical patent/CN117406996B/zh
Publication of CN117406996A publication Critical patent/CN117406996A/zh
Application granted granted Critical
Publication of CN117406996B publication Critical patent/CN117406996B/zh
Active legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Classifications

    • 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/436Semantic checking
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F11/00Error detection; Error correction; Monitoring
    • G06F11/36Preventing errors by testing or debugging software
    • G06F11/3604Software analysis for verifying properties of programs
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F8/00Arrangements for software engineering
    • G06F8/40Transformation of program code
    • G06F8/41Compilation
    • G06F8/42Syntactic analysis
    • G06F8/427Parsing
    • YGENERAL TAGGING OF NEW TECHNOLOGICAL DEVELOPMENTS; GENERAL TAGGING OF CROSS-SECTIONAL TECHNOLOGIES SPANNING OVER SEVERAL SECTIONS OF THE IPC; TECHNICAL SUBJECTS COVERED BY FORMER USPC CROSS-REFERENCE ART COLLECTIONS [XRACs] AND DIGESTS
    • Y02TECHNOLOGIES OR APPLICATIONS FOR MITIGATION OR ADAPTATION AGAINST CLIMATE CHANGE
    • Y02DCLIMATE CHANGE MITIGATION TECHNOLOGIES IN INFORMATION AND COMMUNICATION TECHNOLOGIES [ICT], I.E. INFORMATION AND COMMUNICATION TECHNOLOGIES AIMING AT THE REDUCTION OF THEIR OWN ENERGY USE
    • Y02D10/00Energy efficient computing, e.g. low power processors, power management or thermal management

Landscapes

  • Engineering & Computer Science (AREA)
  • Theoretical Computer Science (AREA)
  • General Engineering & Computer Science (AREA)
  • Software Systems (AREA)
  • Physics & Mathematics (AREA)
  • General Physics & Mathematics (AREA)
  • Computational Linguistics (AREA)
  • Computer Hardware Design (AREA)
  • Quality & Reliability (AREA)
  • Stored Programmes (AREA)
  • Devices For Executing Special Programs (AREA)

Abstract

本发明提供了一种硬件描述代码的语义分析方法及装置,所述方法包括:读取芯片中功能模块待测试的硬件描述代码;删除所述硬件描述代码中的注释和断言代码,得到目标代码;查找所述目标代码中的宏定义代码;对所述宏定义代码进行宏定义分析,得到第一分析结果;采用List和Flag基于所述第一分析结果对所述目标代码进行条件编译,提取所述目标代码中的头文件语句和定义文件语句;对所述头文件语句和所述定义文件语句进行语义分析。本方案解决了相关技术中自动分析硬件描述代码的效率低的技术问题,提高了硬件描述代码的分析效率,进而提高了芯片功能的开发效率。

Description

硬件描述代码的语义分析方法及装置
技术领域
本发明涉及计算机技术领域,具体而言,涉及一种硬件描述代码的语义分析方法及装置。
背景技术
相关技术中,随着SOC变得越来越大,里面的模块越来越多。为了提高开发的效率,很多开发的流程已经开始使用自动化的脚本流程了,尤其是汽车相关的开发,很多的SOC系统集成为了避免出错都要求使用脚本来做。但是集成的结果是不是正确的,如果需要靠开发者来自己分析就效率很低了。为了提升开发效率保证结果是对的,就需要有相关的工具来分析生成的RTL(寄存器转换级电路,register transfer level)的层次是不是对的,他们的输入和输出数量是不是有问题。
相关技术中,工具无法处理always等模块的RTL,对于define的处理不是很好,当define有参数的时候需要逐个字符的分析,对于define内部只有一对括弧,而且以)结尾的话,无法分辨括号内是参数还是具体的信息。
针对相关技术中存在的上述问题,目前尚未发现有效的解决方案。
发明内容
本发明实施例提供了一种硬件描述代码的语义分析方法及装置。
根据本发明的一个实施例,提供了一种硬件描述代码的语义分析方法,包括:读取芯片中功能模块待测试的硬件描述代码;删除所述硬件描述代码中的注释和断言代码,得到目标代码;查找所述目标代码中的宏定义代码;对所述宏定义代码进行宏定义分析,得到第一分析结果;采用List和Flag基于所述第一分析结果对所述目标代码进行条件编译,提取所述目标代码中的头文件语句和定义文件语句;对所述头文件语句和所述定义文件语句进行语义分析。
可选的,对所述宏定义代码进行宏定义分析,得到第一分析结果,包括:利用空格符切分所述宏定义代码的语句,得到多个切分结果;判断所述多个切分结果中的第二个结果是否包含(;若所述多个切分结果中的第二个结果包含(,确定所述宏定义代码带参数,采用所述多个切分结果中的所述第二个结果(以后至最后一个结果中的字符构建参数清单,采用所述参数清单生成所述宏定义代码的宏定义信息;若所述多个切分结果中的第二个结果不包含(,确定所述宏定义代码不带参数,采用所述多个切分结果中的第三个结果至最后一个结果中的空字符构建参数清单,采用所述参数清单拼接所述宏定义代码的宏定义信息;在所述宏定义代码的字典中添加键值对,其中,所述键值对的key为所述第二个结果,所述键值对的value为yy=[参数清单,宏定义信息,文件名];根据所述键值在所述宏定义代码的字典中存放所述宏定义代码的参数清单和宏定义展开,其中,所述第一分析结果包括所述参数清单和所述宏定义展开。
可选的,采用List和Flag基于所述第一分析结果对所述目标代码进行条件编译,提取所述目标代码中的头文件语句和定义文件语句,包括:构建空的defList和空的condList,并初始化ifdefFlag=1,ifCondHit=0;迭代解析所述目标代码在本行存在的条件语句,其中,所述条件语句包括:ifdef、ifndef、`elsif、`else、`endif;在本行删除所述条件语句,根据所述条件语句和所述第一分析结果将所述ifdefFlag和ifCondHit分别添加至所述defList和所述condList,并对所述ifdefFlag和所述ifCondHit赋值,直到所述目标代码解析完成,将剩余的代码输出为目标代码中的头文件语句和定义文件语句,其中,所述第一分析结果包括所述defList和所述condList。
可选的,根据所述条件语句和所述第一分析结果将所述ifdefFlag和ifCondHit分别添加至所述defList和所述condList,并对所述ifdefFlag和所述ifCondHit赋值,包括:判断所述条件编译代码本行是否有ifdef语句;若所述条件编译代码本行有ifdef语句,将所述ifdefFlag和所述ifCondHit分别推送至所述defList和所述condList;判断所述ifdef是否存在宏定义;若所述ifdef不存在宏定义,赋值ifdefFlag=0,ifCondHit=0;若所述ifdef存在宏定义,且ifdefFlag==1,赋值ifCondHit=1;删除所述ifdef语句,判断所述条件编译代码本行是否有ifndef语句;若所述条件编译代码本行有ifndef语句,将所述ifdefFlag和所述ifCondHit分别推送至所述defList和所述condList;判断所述ifndef语句是否存在宏定义;若所述ifdef语句存在宏定义,赋值ifdefFlag=0,ifCondHit=0;若所述ifdef语句不存在宏定义,若ifdefFlag==1,赋值ifCondHit=1;删除所述ifndef语句,判断所述条件编译代码本行是否有`elsif语句;若所述条件编译代码本行有`elsif语句,若ifdefFlag==1,则赋值ifdefFlag=0;若ifdefFlag==0,且ifCondHit==0,判断defList中最后一个ifdefFlag是否为1;如果是1,且`elsif语句存在宏定义,赋值ifdefFlag=1,ifCondHit=1;删除所述`elsif语句,判断所述条件编译代码本行是否有`else语句;若所述条件编译代码本行有`else语句,若ifdefFlag==1,赋值ifdefFlag=0;若所述条件编译代码本行没有`else语句,判断defList中最后一个ifdefFlag是否为1,同时判断ifCondHit是否为0,若defList中最后一个ifdefFlag为1,且ifCondHit为0,赋值ifdefFlag=1;删除所述`else语句,判断所述条件编译代码本行是否有`endif语句;若所述条件编译代码本行有`endif语句,将ifdefFlag和ifCondHit分别从所述defList和所述condList中pop出来,并删除所述`endif语句。
可选的,对所述头文件语句和所述定义文件语句进行语义分析包括:针对功能模块内的头文件语句,将所述头文件语句中的宏定义和参数存放至文件名为标识的第一代码字典的参数中,针对功能模块外的头文件语句,将所述头文件语句中的宏定义和参数存放至模块名为标识的第二代码字典的参数中;解析所述头文件语句的参数或宏定义的符号类型,其中,所述符号类型包括:数字、表达式;若所述头文件语句的参数或宏定义为表达式,将运算符和括号确定为正则表达式分段的pattern;采用所述pattern对所述表达式执行正则表达式分段,以将所述表达式划分成包含以下元素的中缀表达式:字符、数据、运算符、括号;将所述中缀表达式转换为后缀表达式,并将所述后缀表达式确定为所述头文件语句的头文件分析结果;根据所述头文件分析结果对所述定义文件语句进行语义分析。
可选的,根据所述头文件分析结果对所述定义文件语句进行语义分析包括:针对每个定义文件语句,判断当前语句是否存在相关的宏定义;若当前语句存在相关的宏定义,则对所述当前语句进行宏定义展开;确定当前语句中每个语法的表达式,并将相同类型的语法的表达式合并为同一个通用表达式;将语法拆分为多条正则表达式,其中,每一条表达式对应一个关键字;采用分号作为输入正则表达式的断句提示符,并将所述多条正则表达式输入至匹配器,从所述匹配器输出每条语句的语句关键字和匹配语句,得到所有语句的结果内容;对所述结果内容进行语义分析。
可选的,对所述结果内容进行语义分析包括:采用ifelse语句结构分层存放所述结果内容,其中,每个if和else之间的语句为当前if的下一层语句,当前else后面的语句为当前else后面的语句;定位所述结果内容中包含typedef的目标代码行;针对每个目标代码行,判断所述目标代码行中的正括号与反括号的数量是否相同;若所述目标代码行中的正括号与反括号的数量相同,采用解析器对所述目标代码行进行语法分析;若所述目标代码行中的正括号与反括号的数量不相同,将剩下语句的字符串逐个添加至当前的目标代码行,直到当前的目标代码行满足预设的语句格式,采用解析器对更新后的目标代码行进行语法分析。
根据本发明的另一个实施例,提供了一种硬件描述代码的语义分析装置,包括:读取模块,用于读取芯片中功能模块待测试的硬件描述代码;删除模块,用于删除所述硬件描述代码中的注释和断言代码,得到目标代码;查找模块,用于查找所述目标代码中的宏定义代码;第一分析模块,用于对所述宏定义代码进行宏定义分析,得到第一分析结果;编译模块,用于采用List和Flag基于所述第一分析结果对所述目标代码进行条件编译,提取所述目标代码中的头文件语句和定义文件语句;第二分析模块,用于对所述头文件语句和所述定义文件语句进行语义分析。
可选的,所述第一分析模块包括:切分单元,用于利用空格符切分所述宏定义代码的语句,得到多个切分结果;判断单元,用于判断所述多个切分结果中的第二个结果是否包含(;处理单元,用于若所述多个切分结果中的第二个结果包含(,确定所述宏定义代码带参数,采用所述多个切分结果中的所述第二个结果(以后至最后一个结果中的字符构建参数清单,采用所述参数清单生成所述宏定义代码的宏定义信息;若所述多个切分结果中的第二个结果不包含(,确定所述宏定义代码不带参数,采用所述多个切分结果中的第三个结果至最后一个结果中的空字符构建参数清单,采用所述参数清单拼接所述宏定义代码的宏定义信息;添加单元,用于在所述宏定义代码的字典中添加键值对,其中,所述键值对的key为所述第二个结果,所述键值对的value为yy=[参数清单,宏定义信息,文件名];存储单元,用于根据所述键值在所述宏定义代码的字典中存放所述宏定义代码的参数清单和宏定义展开,其中,所述第一分析结果包括所述参数清单和所述宏定义展开。
可选的,所述编译模块包括:构建单元,用于构建空的defList和空的condList,并初始化ifdefFlag=1,ifCondHit=0;解析单元,用于迭代解析所述目标代码在本行存在的条件语句,其中,所述条件语句包括:ifdef、ifndef、`elsif、`else、`endif;输出单元,用于在本行删除所述条件语句,根据所述条件语句和所述第一分析结果将所述ifdefFlag和ifCondHit分别添加至所述defList和所述condList,并对所述ifdefFlag和所述ifCondHit赋值,直到所述目标代码解析完成,将剩余的代码输出为目标代码中的头文件语句和定义文件语句,其中,所述第一分析结果包括所述defList和所述condList。
可选的,所述输出单元包括:第一判断子单元,用于判断所述条件编译代码本行是否有ifdef语句;第一处理子单元,用于若所述条件编译代码本行有ifdef语句,将所述ifdefFlag和所述ifCondHit分别推送至所述defList和所述condList;第二判断子单元,用于判断所述ifdef是否存在宏定义;第二处理子单元,用于若所述ifdef不存在宏定义,赋值ifdefFlag=0,ifCondHit=0;若所述ifdef存在宏定义,且ifdefFlag==1,赋值ifCondHit=1;第三判断子单元,用于删除所述ifdef语句,判断所述条件编译代码本行是否有ifndef语句;第三处理子单元,用于若所述条件编译代码本行有ifndef语句,将所述ifdefFlag和所述ifCondHit分别推送至所述defList和所述condList;第四判断子单元,用于判断所述ifndef语句是否存在宏定义;第四处理子单元,用于若所述ifdef语句存在宏定义,赋值ifdefFlag=0,ifCondHit=0;若所述ifdef语句不存在宏定义,若ifdefFlag==1,赋值ifCondHit=1;第五判断子单元,用于删除所述ifndef语句,判断所述条件编译代码本行是否有`elsif语句;第五处理子单元,用于若所述条件编译代码本行有`elsif语句,若ifdefFlag==1,则赋值ifdefFlag=0;若ifdefFlag==0,且ifCondHit==0,判断defList中最后一个ifdefFlag是否为1;如果是1,且`elsif语句存在宏定义,赋值ifdefFlag=1,ifCondHit=1;第六判断子单元,用于删除所述`elsif语句,判断所述条件编译代码本行是否有`else语句;第六处理子单元,用于若所述条件编译代码本行有`else语句,若ifdefFlag==1,赋值ifdefFlag=0;若所述条件编译代码本行没有`else语句,判断defList中最后一个ifdefFlag是否为1,同时判断ifCondHit是否为0,若defList中最后一个ifdefFlag为1,且ifCondHit为0,赋值ifdefFlag=1;第七判断子单元,用于删除所述`else语句,判断所述条件编译代码本行是否有`endif语句;第七处理子单元,用于若所述条件编译代码本行有`endif语句,将ifdefFlag和ifCondHit分别从所述defList和所述condList中pop出来,并删除所述`endif语句。
可选的,所述第二分析模块包括:存储单元,用于针对功能模块内的头文件语句,将所述头文件语句中的宏定义和参数存放至文件名为标识的第一代码字典的参数中,针对功能模块外的头文件语句,将所述头文件语句中的宏定义和参数存放至模块名为标识的第二代码字典的参数中;解析单元,用于解析所述头文件语句的参数或宏定义的符号类型,其中,所述符号类型包括:数字、表达式;确定单元,用于若所述头文件语句的参数或宏定义为表达式,将运算符和括号确定为正则表达式分段的pattern;划分单元,用于采用所述pattern对所述表达式执行正则表达式分段,以将所述表达式划分成包含以下元素的中缀表达式:字符、数据、运算符、括号;确定单元,用于将所述中缀表达式转换为后缀表达式,并将所述后缀表达式确定为所述头文件语句的头文件分析结果;分析单元,用于根据所述头文件分析结果对所述定义文件语句进行语义分析。
可选的,所述分析单元包括:判断子单元,用于针对每个定义文件语句,判断当前语句是否存在相关的宏定义;展开子单元,用于若当前语句存在相关的宏定义,则对所述当前语句进行宏定义展开;确定子单元,用于确定当前语句中每个语法的表达式,并将相同类型的语法的表达式合并为同一个通用表达式;拆分子单元,用于将语法拆分为多条正则表达式,其中,每一条表达式对应一个关键字;处理子单元,用于采用分号作为输入正则表达式的断句提示符,并将所述多条正则表达式输入至匹配器,从所述匹配器输出每条语句的语句关键字和匹配语句,得到所有语句的结果内容;分析子单元,用于对所述结果内容进行语义分析。
可选的,所述分析子单元还用于:采用ifelse语句结构分层存放所述结果内容,其中,每个if和else之间的语句为当前if的下一层语句,当前else后面的语句为当前else后面的语句;定位所述结果内容中包含typedef的目标代码行;针对每个目标代码行,判断所述目标代码行中的正括号与反括号的数量是否相同;若所述目标代码行中的正括号与反括号的数量相同,采用解析器对所述目标代码行进行语法分析;若所述目标代码行中的正括号与反括号的数量不相同,将剩下语句的字符串逐个添加至当前的目标代码行,直到当前的目标代码行满足预设的语句格式,采用解析器对更新后的目标代码行进行语法分析。
根据本发明的又一个实施例,还提供了一种存储介质,所述存储介质中存储有计算机程序,其中,所述计算机程序被设置为运行时执行上述任一项方法实施例中的步骤。
根据本发明的又一个实施例,还提供了一种电子装置,包括存储器和处理器,所述存储器中存储有计算机程序,所述处理器被设置为运行所述计算机程序以执行上述任一项方法实施例中的步骤。
通过本发明,读取芯片中功能模块待测试的硬件描述代码,删除硬件描述代码中的注释和断言代码,得到目标代码,查找目标代码中的宏定义代码;对宏定义代码进行宏定义分析,得到第一分析结果,基于第一分析结果对目标代码进行条件编译,提取目标代码中的头文件语句和定义文件语句,对头文件语句和定义文件语句进行语义分析,通过对硬件描述代码进行宏定义分析、条件编译和头文件处理,实现了一种高效分析硬件描述代码的方案,解决了相关技术中自动分析硬件描述代码的效率低的技术问题,提高了硬件描述代码的分析效率,进而提高了芯片功能的开发效率。
附图说明
此处所说明的附图用来提供对本发明的进一步理解,构成本申请的一部分,本发明的示意性实施例及其说明用于解释本发明,并不构成对本发明的不当限定。在附图中:
图1是本发明实施例的一种硬件描述代码的语义分析计算机的硬件结构框图;
图2是根据本发明实施例的一种硬件描述代码的语义分析方法的流程示意图;
图3是本发明实施例中always语句块的层级示意图;
图4是本发明实施例的一个流程示意图;
图5是根据本发明实施例的一种硬件描述代码的语义分析装置的结构框图。
具体实施方式
为了使本技术领域的人员更好地理解本申请方案,下面将结合本申请实施例中的附图,对本申请实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本申请一部分的实施例,而不是全部的实施例。基于本申请中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都应当属于本申请保护的范围。需要说明的是,在不冲突的情况下,本申请中的实施例及实施例中的特征可以相互组合。
需要说明的是,本申请的说明书和权利要求书及上述附图中的术语“第一”、“第二”等是用于区别类似的对象,而不必用于描述特定的顺序或先后次序。应该理解这样使用的数据在适当情况下可以互换,以便这里描述的本申请的实施例能够以除了在这里图示或描述的那些以外的顺序实施。此外,术语“包括”和“具有”以及他们的任何变形,意图在于覆盖不排他的包含,例如,包含了一系列步骤或单元的过程、方法、产品或设备不必限于清楚地列出的那些步骤或单元,而是可包括没有清楚地列出的或对于这些过程、方法、产品或设备固有的其它步骤或单元。
实施例1
本申请实施例一所提供的方法实施例可以在手机、平板、服务器、计算机或者类似的电子终端中执行。以运行在计算机上为例,图1是本发明实施例的一种硬件描述代码的语义分析计算机的硬件结构框图。如图1所示,计算机可以包括一个或多个(图1中仅示出一个)处理器102(处理器102可以包括但不限于微处理器MCU或可编程逻辑器件FPGA等的处理装置)和用于存储数据的存储器104,可选地,上述计算机还可以包括用于通信功能的传输设备106以及输入输出设备108。本领域普通技术人员可以理解,图1所示的结构仅为示意,其并不对上述计算机的结构造成限定。例如,计算机还可包括比图1中所示更多或者更少的组件,或者具有与图1所示不同的配置。
存储器104可用于存储计算机程序,例如,应用软件的软件程序以及模块,如本发明实施例中的一种硬件描述代码的语义分析方法对应的计算机程序,处理器102通过运行存储在存储器104内的计算机程序,从而执行各种功能应用以及数据处理,即实现上述的方法。存储器104可包括高速随机存储器,还可包括非易失性存储器,如一个或者多个磁性存储装置、闪存、或者其他非易失性固态存储器。在一些实例中,存储器104可进一步包括相对于处理器102远程设置的存储器,这些远程存储器可以通过网络连接至计算机。上述网络的实例包括但不限于互联网、企业内部网、局域网、移动通信网及其组合。在本实施例中,处理器104用于响应人机交互指令和系统指令,执行代码分析任务。存储器104用于存储配置信息,脚本信息等。
传输设备106用于经由一个网络接收或者发送数据。上述的网络具体实例可包括计算机的通信供应商提供的无线网络。在一个实例中,传输设备106包括一个网络适配器(Network Interface Controller,简称为NIC),其可通过基站与其他网络设备相连从而可与互联网进行通讯。在一个实例中,传输设备106可以为射频(Radio Frequency,简称为RF)模块,其用于通过无线方式与互联网进行通讯。
可选的,输入输出设备108还包括人机交互屏幕用于通过人机交互接口获取人机交互指令,还用于呈现人机交互界面;
在本实施例中提供了一种硬件描述代码的语义分析方法,图2是根据本发明实施例的一种硬件描述代码的语义分析方法的流程示意图,如图2所示,该流程包括如下步骤:
步骤S202,读取芯片中功能模块待测试的硬件描述代码;
步骤S204,删除硬件描述代码中的注释和断言代码,得到目标代码;
先按行读入文件,然后将文件中注释和assertion相关的代码给剔除出去,例如,如果本行有//,则它后面的东西就直接删除了;如果本行中有/*,则认为是块注释的开始。在后续读入的行中检测是不是有*/,找到*/以后就将第一个/*和第一个*/之间的东西给删除了。对于一行有//还有/*的话,就需要利用字符串分析来首先获得//和/*的位置,然后根据谁的位置在前面来确定用/*还是//。
为了避免单个文件太大,本实施例利用python字典的功能,利用模块名做为关键字(标识),建立一个代码字典(define,undef,模块名),将本模块相关的代码按种类进行划分:io,parameter,function,logic,variable,task,instances,type,import,topparameter(存放上层传送下来的参数)。
步骤S206,查找目标代码中的宏定义代码;
对于删除完注释的代码,下一步就是代码分析,完成条件编译分析和宏定义分析。
步骤S208,对宏定义代码进行宏定义分析,得到第一分析结果;
步骤S210,基于第一分析结果对目标代码进行条件编译,提取目标代码中的头文件语句和定义文件语句;
步骤S212,对头文件语句和定义文件语句进行语义分析;
通过上述步骤,读取芯片中功能模块待测试的硬件描述代码,删除硬件描述代码中的注释和断言代码,得到目标代码,查找目标代码中的宏定义代码;对宏定义代码进行宏定义分析,得到第一分析结果,基于第一分析结果对目标代码进行条件编译,提取目标代码中的头文件语句和定义文件语句,对头文件语句和定义文件语句进行语义分析,通过对硬件描述代码进行宏定义分析、条件编译和头文件处理,实现了一种高效分析硬件描述代码的方案,解决了相关技术中自动分析硬件描述代码的效率低的技术问题,提高了硬件描述代码的分析效率,通过list没有嵌套次数的限制,利用list和flag可以高效完成条件编译的分析,需要的资源比较少还不容易出错,进而提高了芯片功能的开发效率。
在本实施例的一个实施方式中,对宏定义代码进行宏定义分析,得到第一分析结果,包括:利用空格符切分宏定义代码的语句,得到多个切分结果;判断多个切分结果中的第二个结果是否包含(;若多个切分结果中的第二个结果包含(,确定宏定义代码带参数,采用多个切分结果中的第二个结果(以后至最后一个结果中的字符构建参数清单,采用参数清单生成宏定义代码的宏定义信息;若多个切分结果中的第二个结果不包含(,确定宏定义代码不带参数,采用多个切分结果中的第三个结果至最后一个结果中的空字符构建参数清单,采用参数清单拼接宏定义代码的宏定义信息;在宏定义代码的字典中添加键值对,其中,键值对的key为第二个结果,键值对的value为yy=[参数清单,宏定义信息,文件名];根据键值在宏定义代码的字典中存放宏定义代码的参数清单和宏定义展开,其中,第一分析结果包括参数清单和宏定义展开。
首先判断当前行代码中是否有`,有的话,利用`\w+从代码中找出条件编译和宏定义相关的代码。对于`define之类的,需要在代码字典的define小字典中将相关的宏定义加上。对于`undef之类的,需要在代码字典中的parameter中将宏定义剔除,同时在undef中加入这个宏定义的相关信息。
在分析过程中,先利用空格对define语句进行切分,判断第二个结果中是不是包含(,如果是的话,就认为是有参数的,同时将第二个结果(以后的字符取出,将它和第三到最后一个结果利用空格拼接起来做为XX,建立一个list,对XX按次序逐个字符的进行分析,如果不是逗号也不是括号,则将这个字符追加到list的最后,如果是逗号而且(的个数跟)个数不等,则将当前list里面的字符都链接起来,变成一个参数,如果(的个数跟)的个数相等,则认为参数分析完成,后面的字符串就是对应的宏定义。对于第二个结果不包含(,就认为宏定义不包含参数,直接将第3到最后一个结果利用一个空格拼接获得宏定义的信息,参数的list则是一个空的list。最后在define的字典加入一组key和value,其中这个第二个结果做为key,然后yy=[参数list,宏定义信息,文件名]作为value,define的语法中是可以带参数,通过判断define XXX(中XXX和(之间是不是有空格,从而初步判断(后面的信息是不是参数,如果初步判断是参数的话,则确认define的格式中(和)的数目是否一致,同时define XXX(YYYYY)中没有其他的括号了,而YYYY)后面的相关信息就是宏展开,YYYY中不同的参数是采用逗号来分开的,可以利用逗号来将它们分开,将结果放到一个list里面,define如果不带参数的话,就直接利用define XXX YYYY中的空格作为分段,参数就是空的list,YYYY就是对应的宏展开,最后在define的小字典里面XXX=两个部分,一个部分是参数的List,第二个部分是对应的宏展开。
在本实施例的一个示例中,基于第一分析结果对目标代码进行条件编译,提取目标代码中的头文件语句和定义文件语句,包括:
S11,构建空的defList和空的condList,并初始化ifdefFlag=1,ifCondHit=0;
S12,迭代解析目标代码在本行存在的条件语句,其中,条件语句包括:ifdef、ifndef、`elsif、`else、`endif;
S13,在本行删除条件语句,根据条件语句和第一分析结果将ifdefFlag和ifCondHit分别添加至defList和condList,并对ifdefFlag和ifCondHit赋值,直到目标代码解析完成,将剩余的代码输出为目标代码中的头文件语句和定义文件语句,其中,第一分析结果包括defList和condList。
可选的,根据条件语句和第一分析结果将ifdefFlag和ifCondHit分别添加至defList和condList,并对ifdefFlag和ifCondHit赋值,包括:判断条件编译代码本行是否有ifdef语句;若条件编译代码本行有ifdef语句,将ifdefFlag和ifCondHit分别推送至defList和condList;判断ifdef是否存在宏定义;若ifdef不存在宏定义,赋值ifdefFlag=0,ifCondHit=0;若ifdef存在宏定义,且ifdefFlag==1,赋值ifCondHit=1;删除ifdef语句,判断条件编译代码本行是否有ifndef语句;若条件编译代码本行有ifndef语句,将ifdefFlag和ifCondHit分别推送至defList和condList;判断ifndef语句是否存在宏定义;若ifdef语句存在宏定义,赋值ifdefFlag=0,ifCondHit=0;若ifdef语句不存在宏定义,若ifdefFlag==1,赋值ifCondHit=1;删除ifndef语句,判断条件编译代码本行是否有`elsif语句;若条件编译代码本行有`elsif语句,若ifdefFlag==1,则赋值ifdefFlag=0;若ifdefFlag==0,且ifCondHit==0,判断defList中最后一个ifdefFlag是否为1;如果是1,且`elsif语句存在宏定义,赋值ifdefFlag=1,ifCondHit=1;删除`elsif语句,判断条件编译代码本行是否有`else语句;若条件编译代码本行有`else语句,若ifdefFlag==1,赋值ifdefFlag=0;若条件编译代码本行没有`else语句,判断defList中最后一个ifdefFlag是否为1,同时判断ifCondHit是否为0,若defList中最后一个ifdefFlag为1,且ifCondHit为0,赋值ifdefFlag=1;删除`else语句,判断条件编译代码本行是否有`endif语句;若条件编译代码本行有`endif语句,将ifdefFlag和ifCondHit分别从defList和condList中pop出来,并删除`endif语句。
本实施例在进行条件编译时,利用两个list+两个flag高效的完成条件编译的分析。
对于条件编译,准备两个list(defList和condList)和两个flag(ifdefFlag和ifCondHit),默认ifdefFlag=1,ifCondHit=0。
如果本行有ifdef XXXX:
则先将ifdefFlag push到defList,ifCondHit push到condlist里面,然后在字典define中检测XXXX有没有define。如果没有定义的话,则ifdefFlag=0,ifCondHit=0;如果有定义而且ifdefFlag==1,则ifCondHit=1,同时将代码中ifdef XXXX给删除;
如果本行有ifndef XXX:
先将ifdefFlag push到defList,ifCondHit push到condlist里面,然后在字典define中检测XXXX有没有define。如果有定义的话,则ifdefFlag=0,ifCondHit=0;如果没有定义而且ifdefFlag==1,则ifCondHit=1,同时将代码中ifndef XXXX给删除;
如果本行有`elsif XXXX:
如果ifdefFlag==1,则ifdefFlag=0;2.如果ifdefFlag==0而且ifCondHit==0的话,则需要判断defList中最后一个ifdefFlag是不是1,如果是1,而且XXXX在字典define中,ifdefFlag=1,ifCondHit=1,同时将`elsif XXXX从代码中删除;
如果本行有`else:
如果ifdefFlag==1,则ifdefFlag=0;否则的话,就需要判断defList中最后一个ifdefFlag是不是1同时ifCondHit是不是0:是的话,ifdefFlag=1,同时删除代码中的`else;
如果本行有`endif:
将ifdefFlag和ifCondHit从list中pop出来,然后将代码中的`endif删除
对于其他的代码如果ifdefFlag==1,则继续分析,否者就忽略相关的代码,对于其他的语法关键字例如celldefine,endcelldefine,default_nettype则直接忽略对应的代码,因为他们对整个代码分析基本没有影响。
在本实施例的一个实施方式中,对头文件语句和定义文件语句进行语义分析包括:
S21,针对功能模块内的头文件语句,将头文件语句中的宏定义和参数存放至文件名为标识的第一代码字典的参数中,针对功能模块外的头文件语句,将头文件语句中的宏定义和参数存放至模块名为标识的第二代码字典的参数中;
对于放在模块外面的include的话,包括的范围宽一下,soc设计文件的其他模块也用得到,会利用文件名作为关键字加入到代码字典里面去,将include文件中的define和parameter放到以这个文件名为关键字的代码字典的parameter里面去。对于放在模块内部的include的话,只对本模块有用,会将include文件中的define和parameter放到代码字典本模块名作为关键字的parameter里去。
S22,解析头文件语句的参数或宏定义的符号类型,其中,符号类型包括:数字、表达式;
S23,若头文件语句的参数或宏定义为表达式,将运算符和括号确定为正则表达式分段的pattern;
S24,采用pattern对表达式执行正则表达式分段,以将表达式划分成包含以下元素的中缀表达式:字符、数据、运算符、括号;
S25,将中缀表达式转换为后缀表达式,并将后缀表达式确定为头文件语句的头文件分析结果;
在处理的过程中,如果parameter或者是define不是具体的数字,而是表达式的话,就需要对表达式进行分析处理:首先利用运算符和括号做为正则表达式分段的pattern同时还保留这些分段的pattern,从而将表达式划分成字符,数据,运算符,括号等等几类。对于字符的话,则直接在parameter的字典中寻找,如果没有找到的话,就直接报错。找到的话,就直接将字符替换成对应的数据或者字符(如果是字符的话,就还需要循环本操作直到字符变成数值),将中缀表达式变成后缀表达式,从而可以将结果计算出来。
实际分析中,不是所有的parameter都会被使用到,所以对所有的parameter都分析其实没有必要,只在条件语句中需要用到parameter的时候才进行实际的运算,或者用户需要看到parameter都变成数据的情况下才全部计算。
S65,根据头文件分析结果对定义文件语句进行语义分析。
在一个示例中,根据头文件分析结果对定义文件语句进行语义分析包括:针对每个定义文件语句,判断当前语句是否存在相关的宏定义;若当前语句存在相关的宏定义,则对当前语句进行宏定义展开;确定当前语句中每个语法的表达式,并将相同类型的语法的表达式合并为同一个通用表达式;将语法拆分为多条正则表达式,其中,每一条表达式对应一个关键字;采用分号作为输入正则表达式的断句提示符,并将多条正则表达式输入至匹配器,从匹配器输出每条语句的语句关键字和匹配语句,得到所有语句的结果内容;对结果内容进行语义分析。
首先判断语句中是否有`相关的define,有的话,就利用define中的信息进行替代(宏定义展开),如果在define中找不到对应的信息,则直接报错退出。
根据verilog语法开发对应的正则表达式,为了减少匹配的数量,考虑将语法格式类似的项目进行合并,例如begin,end,endmodule,endfunction,endtask等等语言就可以采用同一个表达式:re.compile(r'^((begin|end|endmodule|endpackage|endproperty|endinterface|endfunction|endtask)\b\s*(:\s*([\w_]+))?)')。
将复杂的语法分成多条正则表达式,基本上每一条表达式只有一个关键字。例如task…endtask,就可以分成多条的表达式,第一条匹配task的定义,然后中间的task描述其实就是普通的Verilog语言的设计就可以复用verilog的语法匹配,最后一条是endtask。
对于always语句块来说,也采用多条语句的方法进行匹配(将整个语句块,分成always,if…else,begin…end等等的单一表达式进行匹配处理)。首先通过匹配always关键字找到语句块的开始,然后利用if…else的语句结构来进行分层处理,分层处理的好处,整个always语句块就可以看成一个层级1的语句块,对于一个有很复杂always语句块的模块来说,从顶层看下去就只有一个层级1的语句块,从而简化了模块的分析。对于Always语句块中没有beginend开头的语句,则直接将当前的语句放到if…else当前层级的下一层去并直接返回当前层级,对于有begin…end结构的语句,则利用begin来开启下一层级,在没有遇到end以前则将语句都放到这个层级(如果遇到新的begin则在当前层向下开一个新的层级),只有遇到了end才返回上一层级。这个方案很好的处理了if…else中遇到if…else的嵌套,在整个always语句块处理完以后,语句的处理层级应该是返回到最上层。利用语句处理层级的信息也可以很好的知道对于always语句块的处理是不是成功的。
图3是本发明实施例中always语句块的层级示意图,包括层级1~层级3,对于最后这个从层级2返回层级1的操作是通过判断新语句(assign语句)不是if…else或者begin…end的语句来实现的,从module顶层来看的话,就只看到了两个层级1的语句块(always后面的语句都被折叠起来了),从而达到简化表述的目的。
对于task的相关语句块也采用类似的处理,只是task最后有endtask语句来提示返回层级1。
利用分号来做为送到匹配器的提示信号,所以每次送到匹配器可能是一个或者是多个语句,匹配器一次只匹配一条语句,每次匹配完成以后,返回[语句关键字,匹配信息,剩余语句],如果剩余语句不为空,则循环匹配。对于代码的最后的部分则在完成全部代码读入后一次性进行匹配和分析。
在一个实施场景中,对结果内容进行语义分析包括:采用ifelse语句结构分层存放结果内容,其中,每个if和else之间的语句为当前if的下一层语句,当前else后面的语句为当前else后面的语句;定位结果内容中包含typedef的目标代码行;针对每个目标代码行,判断目标代码行中的正括号与反括号的数量是否相同;若目标代码行中的正括号与反括号的数量相同,采用解析器对目标代码行进行语法分析;若目标代码行中的正括号与反括号的数量不相同,将剩下语句的字符串逐个添加至当前的目标代码行,直到当前的目标代码行满足预设的语句格式,采用解析器对更新后的目标代码行进行语法分析。
本实施例为了便于后面的代码处理,对分析结果分层存放,利用if,else之类的语句将它们包含的语句都放到下一层去,这样的话,如果if不成立的话,下一层的语句就不要处理,直接就可以跳到后面语句就是else的分支,这样可以提高处理的效。例如,在if…else的结构中,if和else之间的语句就直接认为是if的下一层的语句(按verilog的语法它们可以是一行或者是多行需要begin/end来标识)。对于else后面的语句就直接认为是else的下一层语句(按verilog的语法它们可以是一行或者是多行需要begin/end来标识),所以对begin/end在parse中做了专门的配对处理来满足分层的需求。
对于systemverilog里面包含有typedef的行,首先判断typedef这个关键字,然后通过行中【和】,{和}的个数是否一致来预判是否合适可以送到parse去。因为parse可能不能很好的完成对tyepdef语法的匹配,一般在匹配以后再对匹配的结果进一步的分析。
对于struct等比较复杂的数据结构,正则匹配很难完全匹配多个)]}的层级,所以先利用正则匹配+一层([{匹配将关键字和能匹配的定义提取出来,在完成正则匹配以后根据关键字知道这个语句是struct等类型,然后分析整个被匹配的字符串中([{的个数是不是跟)]}个数是不是一致,不是的话,就需要从被匹配以后剩下的语句中一个一个字符串加入进来,直到那个字符串完全满足struct等语句的格式。
代码parse还有一个很重要的分析功能就是产生子模块实例化列表和信号连接等等信息。主要是通过模块名+空格+可能的parameter重定义+实例化名字+信号连接列表这样的格式来完成匹配,子模块相关的信息存放到代码字典中instances中。
图4是本发明实施例的一个流程示意图,包括:读入硬件描述代码;剔除代码中的注释;条件编译语句的相关分析;头文件处理和内容提取;代码的parser。
采用本实施例的方案,利用两个list+两个flag高效的完成条件编译的分析。对于宏定义:利用空格切分宏定义的语句,利用宏定义名字跟(的关系判断宏定义是否带参数;利用字典的key value对来对宏定义名,参数和定义展开进行存放。对于头文件:进行选择性的参数计算,就是只有需要用到参数才会进行计算,Generate for(I=0;I<parameterA,i++)--》这个i才需要计算,对于参数分析则采用正则表达式,利用运算符和括号作为正则表达式分段的pattern同时还保留这些分段的pattern,从而将表达式划分成字符,数据,运算符,括号。语义分析时:首先完成宏定义展开,利用关键字做出正则表达式逐句分析RTL,将复杂的语法分成多条正则表达式,基本上每一条表达式只有一个关键字,将一些语法格式类似的表达式进行合并,利用分号作为输入正则表达式的断句提示符,提出一种新的对typedef等复杂语句分析的方法。
采用本实施例的方案,高效的完成条件编译的处理,同时提出一种简单的处理宏定义的方法,它能支持普通的宏定义和复杂的带参数的宏定义,对头文件只处理设计中用到的,其他的部分只读取,不做处理,提升处理效率,将复杂的语法格式例如typedef等等按关键字来分别处理,对于语法类似的表达式进行合并分析,从而减少语法分析的次数,将出现概率高的表达式的匹配放到语法分析系统的前面,减少了语法分析的次数。
通过以上的实施方式的描述,本领域的技术人员可以清楚地了解到根据上述实施例的方法可借助软件加必需的通用硬件平台的方式来实现,当然也可以通过硬件,但很多情况下前者是更佳的实施方式。基于这样的理解,本发明的技术方案本质上或者说对现有技术做出贡献的部分可以以软件产品的形式体现出来,该计算机软件产品存储在一个存储介质(如ROM/RAM、磁碟、光盘)中,包括若干指令用以使得一台终端设备(可以是手机,计算机,服务器,或者网络设备等)执行本发明各个实施例所述的方法。
实施例2
在本实施例中还提供了一种硬件描述代码的语义分析装置,用于实现上述实施例及优选实施方式,已经进行过说明的不再赘述。如以下所使用的,术语“模块”可以实现预定功能的软件和/或硬件的组合。尽管以下实施例所描述的装置较佳地以软件来实现,但是硬件,或者软件和硬件的组合的实现也是可能并被构想的。
图5是根据本发明实施例的一种硬件描述代码的语义分析装置的结构框图,如图5所示,该装置包括:读取模块50,删除模块52,查找模块55,第一分析模块56,编译模块58,第二分析模块60,其中,
读取模块50,用于读取芯片中功能模块待测试的硬件描述代码;
删除模块52,用于删除所述硬件描述代码中的注释和断言代码,得到目标代码;
查找模块55,用于查找所述目标代码中的宏定义代码;
第一分析模块56,用于对所述宏定义代码进行宏定义分析,得到第一分析结果;
编译模块58,用于采用List和Flag基于所述第一分析结果对所述目标代码进行条件编译,提取所述目标代码中的头文件语句和定义文件语句;
第二分析模块60,用于对所述头文件语句和所述定义文件语句进行语义分析。
可选的,所述第一分析模块包括:切分单元,用于利用空格符切分所述宏定义代码的语句,得到多个切分结果;判断单元,用于判断所述多个切分结果中的第二个结果是否包含(;处理单元,用于若所述多个切分结果中的第二个结果包含(,确定所述宏定义代码带参数,采用所述多个切分结果中的所述第二个结果(以后至最后一个结果中的字符构建参数清单,采用所述参数清单生成所述宏定义代码的宏定义信息;若所述多个切分结果中的第二个结果不包含(,确定所述宏定义代码不带参数,采用所述多个切分结果中的第三个结果至最后一个结果中的空字符构建参数清单,采用所述参数清单拼接所述宏定义代码的宏定义信息;添加单元,用于在所述宏定义代码的字典中添加键值对,其中,所述键值对的key为所述第二个结果,所述键值对的value为yy=[参数清单,宏定义信息,文件名];存储单元,用于根据所述键值在所述宏定义代码的字典中存放所述宏定义代码的参数清单和宏定义展开,其中,所述第一分析结果包括所述参数清单和所述宏定义展开。
可选的,所述编译模块包括:构建单元,用于构建空的defList和空的condList,并初始化ifdefFlag=1,ifCondHit=0;解析单元,用于迭代解析所述目标代码在本行存在的条件语句,其中,所述条件语句包括:ifdef、ifndef、`elsif、`else、`endif;输出单元,用于在本行删除所述条件语句,根据所述条件语句和所述第一分析结果将所述ifdefFlag和ifCondHit分别添加至所述defList和所述condList,并对所述ifdefFlag和所述ifCondHit赋值,直到所述目标代码解析完成,将剩余的代码输出为目标代码中的头文件语句和定义文件语句,其中,所述第一分析结果包括所述defList和所述condList。
可选的,所述输出单元包括:第一判断子单元,用于判断所述条件编译代码本行是否有ifdef语句;第一处理子单元,用于若所述条件编译代码本行有ifdef语句,将所述ifdefFlag和所述ifCondHit分别推送至所述defList和所述condList;第二判断子单元,用于判断所述ifdef是否存在宏定义;第二处理子单元,用于若所述ifdef不存在宏定义,赋值ifdefFlag=0,ifCondHit=0;若所述ifdef存在宏定义,且ifdefFlag==1,赋值ifCondHit=1;第三判断子单元,用于删除所述ifdef语句,判断所述条件编译代码本行是否有ifndef语句;第三处理子单元,用于若所述条件编译代码本行有ifndef语句,将所述ifdefFlag和所述ifCondHit分别推送至所述defList和所述condList;第四判断子单元,用于判断所述ifndef语句是否存在宏定义;第四处理子单元,用于若所述ifdef语句存在宏定义,赋值ifdefFlag=0,ifCondHit=0;若所述ifdef语句不存在宏定义,若ifdefFlag==1,赋值ifCondHit=1;第五判断子单元,用于删除所述ifndef语句,判断所述条件编译代码本行是否有`elsif语句;第五处理子单元,用于若所述条件编译代码本行有`elsif语句,若ifdefFlag==1,则赋值ifdefFlag=0;若ifdefFlag==0,且ifCondHit==0,判断defList中最后一个ifdefFlag是否为1;如果是1,且`elsif语句存在宏定义,赋值ifdefFlag=1,ifCondHit=1;第六判断子单元,用于删除所述`elsif语句,判断所述条件编译代码本行是否有`else语句;第六处理子单元,用于若所述条件编译代码本行有`else语句,若ifdefFlag==1,赋值ifdefFlag=0;若所述条件编译代码本行没有`else语句,判断defList中最后一个ifdefFlag是否为1,同时判断ifCondHit是否为0,若defList中最后一个ifdefFlag为1,且ifCondHit为0,赋值ifdefFlag=1;第七判断子单元,用于删除所述`else语句,判断所述条件编译代码本行是否有`endif语句;第七处理子单元,用于若所述条件编译代码本行有`endif语句,将ifdefFlag和ifCondHit分别从所述defList和所述condList中pop出来,并删除所述`endif语句。
可选的,所述第二分析模块包括:存储单元,用于针对功能模块内的头文件语句,将所述头文件语句中的宏定义和参数存放至文件名为标识的第一代码字典的参数中,针对功能模块外的头文件语句,将所述头文件语句中的宏定义和参数存放至模块名为标识的第二代码字典的参数中;解析单元,用于解析所述头文件语句的参数或宏定义的符号类型,其中,所述符号类型包括:数字、表达式;确定单元,用于若所述头文件语句的参数或宏定义为表达式,将运算符和括号确定为正则表达式分段的pattern;划分单元,用于采用所述pattern对所述表达式执行正则表达式分段,以将所述表达式划分成包含以下元素的中缀表达式:字符、数据、运算符、括号;确定单元,用于将所述中缀表达式转换为后缀表达式,并将所述后缀表达式确定为所述头文件语句的头文件分析结果;分析单元,用于根据所述头文件分析结果对所述定义文件语句进行语义分析。
可选的,所述分析单元包括:判断子单元,用于针对每个定义文件语句,判断当前语句是否存在相关的宏定义;展开子单元,用于若当前语句存在相关的宏定义,则对所述当前语句进行宏定义展开;确定子单元,用于确定当前语句中每个语法的表达式,并将相同类型的语法的表达式合并为同一个通用表达式;拆分子单元,用于将语法拆分为多条正则表达式,其中,每一条表达式对应一个关键字;处理子单元,用于采用分号作为输入正则表达式的断句提示符,并将所述多条正则表达式输入至匹配器,从所述匹配器输出每条语句的语句关键字和匹配语句,得到所有语句的结果内容;分析子单元,用于对所述结果内容进行语义分析。
可选的,所述分析子单元还用于:采用ifelse语句结构分层存放所述结果内容,其中,每个if和else之间的语句为当前if的下一层语句,当前else后面的语句为当前else后面的语句;定位所述结果内容中包含typedef的目标代码行;针对每个目标代码行,判断所述目标代码行中的正括号与反括号的数量是否相同;若所述目标代码行中的正括号与反括号的数量相同,采用解析器对所述目标代码行进行语法分析;若所述目标代码行中的正括号与反括号的数量不相同,将剩下语句的字符串逐个添加至当前的目标代码行,直到当前的目标代码行满足预设的语句格式,采用解析器对更新后的目标代码行进行语法分析。
需要说明的是,上述各个模块是可以通过软件或硬件来实现的,对于后者,可以通过以下方式实现,但不限于此:上述模块均位于同一处理器中;或者,上述各个模块以任意组合的形式分别位于不同的处理器中。
实施例3
本发明的实施例还提供了一种存储介质,该存储介质中存储有计算机程序,其中,该计算机程序被设置为运行时执行上述任一项方法实施例中的步骤。
可选地,在本实施例中,上述存储介质可以被设置为存储用于执行以下步骤的计算机程序:
S1,读取芯片中功能模块待测试的硬件描述代码;
S2,删除所述硬件描述代码中的注释和断言代码,得到目标代码;
S3,查找所述目标代码中的宏定义代码;
S4,对所述宏定义代码进行宏定义分析,得到第一分析结果;
S5,采用List和Flag基于所述第一分析结果对所述目标代码进行条件编译,提取所述目标代码中的头文件语句和定义文件语句;
S6,对所述头文件语句和所述定义文件语句进行语义分析。
可选地,在本实施例中,上述存储介质可以包括但不限于:U盘、只读存储器(Read-Only Memory,简称为ROM)、随机存取存储器(Random Access Memory,简称为RAM)、移动硬盘、磁碟或者光盘等各种可以存储计算机程序的介质。
本发明的实施例还提供了一种电子装置,包括存储器和处理器,该存储器中存储有计算机程序,该处理器被设置为运行计算机程序以执行上述任一项方法实施例中的步骤。
可选地,上述电子装置还可以包括传输设备以及输入输出设备,其中,该传输设备和上述处理器连接,该输入输出设备和上述处理器连接。
可选地,在本实施例中,上述处理器可以被设置为通过计算机程序执行以下步骤:
S1,读取芯片中功能模块待测试的硬件描述代码;
S2,删除所述硬件描述代码中的注释和断言代码,得到目标代码;
S3,查找所述目标代码中的宏定义代码;
S4,对所述宏定义代码进行宏定义分析,得到第一分析结果;
S5,采用List和Flag基于所述第一分析结果对所述目标代码进行条件编译,提取所述目标代码中的头文件语句和定义文件语句;
S6,对所述头文件语句和所述定义文件语句进行语义分析。
可选地,本实施例中的具体示例可以参考上述实施例及可选实施方式中所描述的示例,本实施例在此不再赘述。
上述本申请实施例序号仅仅为了描述,不代表实施例的优劣。
在本申请的上述实施例中,对各个实施例的描述都各有侧重,某个实施例中没有详述的部分,可以参见其他实施例的相关描述。
在本申请所提供的几个实施例中,应该理解到,所揭露的技术内容,可通过其它的方式实现。其中,以上所描述的装置实施例仅仅是示意性的,例如所述单元的划分,仅仅为一种逻辑功能划分,实际实现时可以有另外的划分方式,例如多个单元或组件可以结合或者可以集成到另一个系统,或一些特征可以忽略,或不执行。另一点,所显示或讨论的相互之间的耦合或直接耦合或通信连接可以是通过一些接口,单元或模块的间接耦合或通信连接,可以是电性或其它的形式。
所述作为分离部件说明的单元可以是或者也可以不是物理上分开的,作为单元显示的部件可以是或者也可以不是物理单元,即可以位于一个地方,或者也可以分布到多个网络单元上。可以根据实际的需要选择其中的部分或者全部单元来实现本实施例方案的目的。
另外,在本申请各个实施例中的各功能单元可以集成在一个处理单元中,也可以是各个单元单独物理存在,也可以两个或两个以上单元集成在一个单元中。上述集成的单元既可以采用硬件的形式实现,也可以采用软件功能单元的形式实现。
所述集成的单元如果以软件功能单元的形式实现并作为独立的产品销售或使用时,可以存储在一个计算机可读取存储介质中。基于这样的理解,本申请的技术方案本质上或者说对现有技术做出贡献的部分或者该技术方案的全部或部分可以以软件产品的形式体现出来,该计算机软件产品存储在一个存储介质中,包括若干指令用以使得一台计算机设备(可为个人计算机、服务器或者网络设备等)执行本申请各个实施例所述方法的全部或部分步骤。而前述的存储介质包括:U盘、只读存储器(ROM,Read-Only Memory)、随机存取存储器(RAM,Random Access Memory)、移动硬盘、磁碟或者光盘等各种可以存储程序代码的介质。
以上所述仅是本申请的优选实施方式,应当指出,对于本技术领域的普通技术人员来说,在不脱离本申请原理的前提下,还可以做出若干改进和润饰,这些改进和润饰也应视为本申请的保护范围。

Claims (10)

1.一种硬件描述代码的语义分析方法,其特征在于,包括:
读取芯片中功能模块待测试的硬件描述代码;
删除所述硬件描述代码中的注释和断言代码,得到目标代码;
查找所述目标代码中的宏定义代码;
对所述宏定义代码进行宏定义分析,得到第一分析结果;
采用List和Flag基于所述第一分析结果对所述目标代码进行条件编译,提取所述目标代码中的头文件语句和定义文件语句;
对所述头文件语句和所述定义文件语句进行语义分析。
2.根据权利要求1所述的方法,其特征在于,对所述宏定义代码进行宏定义分析,得到第一分析结果,包括:
利用空格符切分所述宏定义代码的语句,得到多个切分结果;
判断所述多个切分结果中的第二个结果是否包含(;
若所述多个切分结果中的第二个结果包含(,则确定所述宏定义代码带参数,采用所述多个切分结果中的所述第二个结果(以后至最后一个结果中的字符构建参数清单,采用所述参数清单生成所述宏定义代码的宏定义信息;若所述多个切分结果中的第二个结果不包含(,确定所述宏定义代码不带参数,采用所述多个切分结果中的第三个结果至最后一个结果中的空字符构建参数清单,采用所述参数清单拼接所述宏定义代码的宏定义信息;
在所述宏定义代码的字典中添加键值对,其中,所述键值对的key为所述第二个结果,所述键值对的value为yy=[参数清单,宏定义信息,文件名];
根据所述键值在所述宏定义代码的字典中存放所述宏定义代码的参数清单和宏定义展开,其中,所述第一分析结果包括所述参数清单和所述宏定义展开。
3.根据权利要求1所述的方法,其特征在于,采用List和Flag基于所述第一分析结果对所述目标代码进行条件编译,提取所述目标代码中的头文件语句和定义文件语句,包括:
构建空的defList和空的condList,并初始化ifdefFlag=1,ifCondHit=0;
迭代解析所述目标代码在本行存在的条件语句,其中,所述条件语句包括:ifdef、ifndef、`elsif、`else、`endif;
在本行删除所述条件语句,根据所述条件语句和所述第一分析结果将所述ifdefFlag和ifCondHit分别添加至所述defList和所述condList,并对所述ifdefFlag和所述ifCondHit赋值,直到所述目标代码解析完成,将剩余的代码输出为目标代码中的头文件语句和定义文件语句,其中,所述第一分析结果包括所述defList和所述condList。
4.根据权利要求3所述的方法,其特征在于,根据所述条件语句和所述第一分析结果将所述ifdefFlag和ifCondHit分别添加至所述defList和所述condList,并对所述ifdefFlag和所述ifCondHit赋值,包括:
判断所述条件编译代码本行是否有ifdef语句;
若所述条件编译代码本行有ifdef语句,将所述ifdefFlag和所述ifCondHit分别推送至所述defList和所述condList;
判断所述ifdef是否存在宏定义;
若所述ifdef不存在宏定义,赋值ifdefFlag=0,ifCondHit=0;若所述ifdef存在宏定义,且ifdefFlag==1,赋值ifCondHit=1;
删除所述ifdef语句,判断所述条件编译代码本行是否有ifndef语句;
若所述条件编译代码本行有ifndef语句,将所述ifdefFlag和所述ifCondHit分别推送至所述defList和所述condList;
判断所述ifndef语句是否存在宏定义;
若所述ifdef语句存在宏定义,赋值ifdefFlag=0,ifCondHit=0;若所述ifdef语句不存在宏定义,若ifdefFlag==1,赋值ifCondHit=1;
删除所述ifndef语句,判断所述条件编译代码本行是否有`elsif语句;
若所述条件编译代码本行有`elsif语句,若ifdefFlag==1,则赋值ifdefFlag=0;若ifdefFlag==0,且ifCondHit==0,判断defList中最后一个ifdefFlag是否为1;如果是1,且`elsif语句存在宏定义,赋值ifdefFlag=1,ifCondHit=1;
删除所述`elsif语句,判断所述条件编译代码本行是否有`else语句;
若所述条件编译代码本行有`else语句,若ifdefFlag==1,赋值ifdefFlag=0;若所述条件编译代码本行没有`else语句,判断defList中最后一个ifdefFlag是否为1,同时判断ifCondHit是否为0,若defList中最后一个ifdefFlag为1,且ifCondHit为0,赋值ifdefFlag=1;
删除所述`else语句,判断所述条件编译代码本行是否有`endif语句;
若所述条件编译代码本行有`endif语句,将ifdefFlag和ifCondHit分别从所述defList和所述condList中pop出来,并删除所述`endif语句。
5.根据权利要求1所述的方法,其特征在于,对所述头文件语句和所述定义文件语句进行语义分析包括:
针对功能模块内的头文件语句,将所述头文件语句中的宏定义和参数存放至文件名为标识的第一代码字典的参数中,针对功能模块外的头文件语句,将所述头文件语句中的宏定义和参数存放至模块名为标识的第二代码字典的参数中;
解析所述头文件语句的参数或宏定义的符号类型,其中,所述符号类型包括:数字、表达式;
若所述头文件语句的参数或宏定义为表达式,将运算符和括号确定为正则表达式分段的pattern;
采用所述pattern对所述表达式执行正则表达式分段,以将所述表达式划分成包含以下元素的中缀表达式:字符、数据、运算符、括号;
将所述中缀表达式转换为后缀表达式,并将所述后缀表达式确定为所述头文件语句的头文件分析结果;
根据所述头文件分析结果对所述定义文件语句进行语义分析。
6.根据权利要求5所述的方法,其特征在于,根据所述头文件分析结果对所述定义文件语句进行语义分析包括:
针对每个定义文件语句,判断当前语句是否存在相关的宏定义;
若当前语句存在相关的宏定义,则对所述当前语句进行宏定义展开;
确定当前语句中每个语法的表达式,并将相同类型的语法的表达式合并为同一个通用表达式;
将语法拆分为多条正则表达式,其中,每一条表达式对应一个关键字;
采用分号作为输入正则表达式的断句提示符,并将所述多条正则表达式输入至匹配器,从所述匹配器输出每条语句的语句关键字和匹配语句,得到所有语句的结果内容;
对所述结果内容进行语义分析。
7.根据权利要求6所述的方法,其特征在于,对所述结果内容进行语义分析包括:
采用ifelse语句结构分层存放所述结果内容,其中,每个if和else之间的语句为当前if的下一层语句,当前else后面的语句为当前else后面的语句;
定位所述结果内容中包含typedef的目标代码行;
针对每个目标代码行,判断所述目标代码行中的正括号与反括号的数量是否相同;
若所述目标代码行中的正括号与反括号的数量相同,采用解析器对所述目标代码行进行语法分析;若所述目标代码行中的正括号与反括号的数量不相同,将剩下语句的字符串逐个添加至当前的目标代码行,直到当前的目标代码行满足预设的语句格式,采用解析器对更新后的目标代码行进行语法分析。
8.一种硬件描述代码的语义分析装置,其特征在于,包括:
读取模块,用于读取芯片中功能模块待测试的硬件描述代码;
删除模块,用于删除所述硬件描述代码中的注释和断言代码,得到目标代码;
查找模块,用于查找所述目标代码中的宏定义代码;
第一分析模块,用于对所述宏定义代码进行宏定义分析,得到第一分析结果;
编译模块,用于采用List和Flag基于所述第一分析结果对所述目标代码进行条件编译,提取所述目标代码中的头文件语句和定义文件语句;
第二分析模块,用于对所述头文件语句和所述定义文件语句进行语义分析。
9.一种存储介质,其特征在于,所述存储介质中存储有计算机程序,其中,所述计算机程序被设置为运行时执行权利要求1至7任一项中所述的方法。
10.一种电子装置,包括存储器和处理器,其特征在于,所述存储器中存储有计算机程序,所述处理器被设置为运行所述计算机程序以执行权利要求1至7任一项中所述的方法。
CN202311366523.3A 2023-10-20 2023-10-20 硬件描述代码的语义分析方法及装置 Active CN117406996B (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN202311366523.3A CN117406996B (zh) 2023-10-20 2023-10-20 硬件描述代码的语义分析方法及装置

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN202311366523.3A CN117406996B (zh) 2023-10-20 2023-10-20 硬件描述代码的语义分析方法及装置

Publications (2)

Publication Number Publication Date
CN117406996A true CN117406996A (zh) 2024-01-16
CN117406996B CN117406996B (zh) 2024-04-16

Family

ID=89486536

Family Applications (1)

Application Number Title Priority Date Filing Date
CN202311366523.3A Active CN117406996B (zh) 2023-10-20 2023-10-20 硬件描述代码的语义分析方法及装置

Country Status (1)

Country Link
CN (1) CN117406996B (zh)

Citations (7)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
KR20030018720A (ko) * 2001-08-31 2003-03-06 (주) 소프트4소프트 소프트웨어 유지보수를 위한 소스 코드 브라우저 자동생성 방법 및 시스템
KR20120121978A (ko) * 2011-04-28 2012-11-07 슈어소프트테크주식회사 코드 컨버팅 장치, 방법 및 컴퓨터 판독 가능한 기록 매체
CN104536797A (zh) * 2015-01-14 2015-04-22 大唐微电子技术有限公司 一种Java程序预编译方法和预编译器
CN107678749A (zh) * 2017-09-29 2018-02-09 深圳市山龙智控有限公司 基于结构化语言编程的转码方法及装置
CN110673854A (zh) * 2019-09-24 2020-01-10 深圳前海微众银行股份有限公司 Sas语言编译方法、装置、设备及可读存储介质
CN115617352A (zh) * 2022-12-02 2023-01-17 中汽研软件测评(天津)有限公司 基于安全编码标准的c代码检测方法、设备和存储介质
CN115904393A (zh) * 2023-01-05 2023-04-04 拉扎斯网络科技(上海)有限公司 条件编译实现方法、装置、介质及设备

Patent Citations (7)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
KR20030018720A (ko) * 2001-08-31 2003-03-06 (주) 소프트4소프트 소프트웨어 유지보수를 위한 소스 코드 브라우저 자동생성 방법 및 시스템
KR20120121978A (ko) * 2011-04-28 2012-11-07 슈어소프트테크주식회사 코드 컨버팅 장치, 방법 및 컴퓨터 판독 가능한 기록 매체
CN104536797A (zh) * 2015-01-14 2015-04-22 大唐微电子技术有限公司 一种Java程序预编译方法和预编译器
CN107678749A (zh) * 2017-09-29 2018-02-09 深圳市山龙智控有限公司 基于结构化语言编程的转码方法及装置
CN110673854A (zh) * 2019-09-24 2020-01-10 深圳前海微众银行股份有限公司 Sas语言编译方法、装置、设备及可读存储介质
CN115617352A (zh) * 2022-12-02 2023-01-17 中汽研软件测评(天津)有限公司 基于安全编码标准的c代码检测方法、设备和存储介质
CN115904393A (zh) * 2023-01-05 2023-04-04 拉扎斯网络科技(上海)有限公司 条件编译实现方法、装置、介质及设备

Also Published As

Publication number Publication date
CN117406996B (zh) 2024-04-16

Similar Documents

Publication Publication Date Title
CN106776544B (zh) 人物关系识别方法及装置和分词方法
CN110929038A (zh) 基于知识图谱的实体链接方法、装置、设备和存储介质
CN110096599B (zh) 知识图谱的生成方法及装置
CN112416962A (zh) 数据查询方法、装置以及存储介质
CN113282762A (zh) 知识图谱构建方法、装置、电子设备和存储介质
CN111723192B (zh) 代码推荐方法和装置
US9390117B2 (en) Method of transforming sets of input strings into at least one pattern expression that is string expressing sets of input strings, method of extracting transformation pattern as approximate pattern expression, and computer and computer program for the methods
CN113947084A (zh) 基于图嵌入的问答知识检索方法、装置及设备
CN110069769A (zh) 应用标签生成方法、装置及存储设备
CN117406996B (zh) 硬件描述代码的语义分析方法及装置
CN112749258A (zh) 数据搜索的方法和装置、电子设备和存储介质
CN114416107A (zh) 翻译逻辑的方法、装置、存储介质和设备
CN114385776A (zh) 信息定位方法、存储介质及装置
CN114528218A (zh) 测试程序的生成方法、装置、存储介质以及电子设备
EP3255558A1 (en) Syntax analyzing device, learning device, machine translation device and recording medium
CN112732743A (zh) 一种基于中文自然语言的数据分析方法及装置
CN108255808B (zh) 文本划分的方法、装置和存储介质以及电子设备
CN111753548A (zh) 信息获取方法及装置、计算机存储介质、电子设备
CN112749316A (zh) 翻译质量的确定方法、装置、存储介质和处理器
CN112836057A (zh) 知识图谱的生成方法、装置、终端以及存储介质
CN111221843A (zh) 大数据处理方法及装置
CN111625749B (zh) 参会公司网站详情页信息提取方法、装置、设备及介质
CN111563387A (zh) 语句相似度确定方法及装置、语句翻译方法及装置
CN109902147A (zh) 用于查询处理的方法、装置、设备和存储介质
CN117591624B (zh) 一种基于语义索引关系的测试用例推荐方法

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
GR01 Patent grant
GR01 Patent grant