发明内容
本申请提供一种前端验证的编译仿真方法、装置及电子设备,以解决前端设计验证维护困难、扩展性差的问题。
第一方面,本申请提供一种前端验证的编译仿真方法,包括:
构建公共脚本;
获取编译仿真参数,所述编译仿真参数包括头文件、用例名称、输出目录和仿真选项;
将所述编译仿真参数输入所述公共脚本,以生成规则脚本文件,所述规则脚本文件包括目标、依赖关系、编译命令和仿真命令;
执行所述规则脚本文件。
在可选的实施方式中,所述方法还包括:
创建初始脚本;
在所述初始脚本中定义编译仿真函数和输入参数,以构建公共脚本,所述编译仿真函数包括创建参数函数和解析规则函数。
在可选的实施方式中,所述方法还包括:
获取目标规则文件;
将所述目标规则文件输入所述公共脚本,以及基于所述解析规则函数解析所述目标规则文件,以获取编译仿真参数;
获取所述创建参数函数的输入参数;
根据所述输入参数和所述编译仿真参数生成规则脚本文件。
在可选的实施方式中,所述输入参数包括用例名称参数、仿真软件打开参数、清除仿真目录参数、仿真随机种子参数、随机数量参数、并行仿真数量参数、编译参数和目标仿真服务器参数,所述用例名称参数用于表征测试用例的名称,所述仿真软件打开参数用于表征打开仿真软件,所述清除仿真目录参数用于表征清除仿真目录,所述仿真随机种子参数用于表征仿真时的随机种子,所述随机数量参数用于表征随机的数量,所述并行仿真数量参数用于表征并行仿真的数量,所述编译参数用于表征是否编译,所述目标仿真服务器参数用于表征仿真的服务器。
在可选的实施方式中,所述方法还包括:
检测所述创建参数函数中输入参数的赋值状态;
如果所述赋值状态为未赋值,则将所述输入参数设置为默认值。
在可选的实施方式中,所述方法还包括:
获取目标拓展指令;
将所述目标拓展指令封装至所述公共脚本;
在执行所述规则脚本文件时,执行所述目标拓展指令对应的拓展操作。
在可选的实施方式中,执行所述规则脚本文件的步骤,所述方法还包括:
检测所述规则脚本文件的仿真类型;
如果所述仿真类型为只仿真不编译,则仿真所述规则脚本文件;
如果所述仿真类型为编译后仿真,则编译所述规则脚本文件,以及在编译后仿真所述规则脚本文件。
在可选的实施方式中,执行所述规则脚本文件的步骤之后,还包括:
获取所述规则脚本文件的执行结果;
根据所述执行结果生成编译仿真报告。
第二方面,本申请提供一种前端验证的编译仿真装置,包括脚本构建模块、参数获取模块、规则脚本文件生成模块和编译仿真模块,其中:
脚本构建模块,用于构建公共脚本;
参数获取模块,用于获取编译仿真参数,所述编译仿真参数包括头文件、用例名称、输出目录和仿真选项;
规则脚本文件生成模块,用于将所述编译仿真参数输入所述公共脚本,以生成规则脚本文件,所述规则脚本文件包括目标、依赖关系、编译命令和仿真命令;
编译仿真模块,用于执行所述规则脚本文件。
第三方面,本申请提供一种电子设备,包括:处理器、存储器和总线。所述处理器和所述存储器通过所述总线完成相互间的通信;所述存储器存储有可被所述处理器执行的计算机程序指令,所述处理器被配置为:
构建公共脚本;
获取编译仿真参数,所述编译仿真参数包括头文件、用例名称、输出目录和仿真选项;
将所述编译仿真参数输入所述公共脚本,以生成规则脚本文件,所述规则脚本文件包括目标、依赖关系、编译命令和仿真命令;
执行所述规则脚本文件。
由以上技术方案可知,本申请提供一种前端验证的编译仿真方法、装置及电子设备,所述方法可以构建公共脚本,获取编译仿真参数,其中,编译仿真参数包括头文件、用例名称、输出目录和仿真选项。再将编译仿真参数输入公共脚本,以生成规则脚本文件,并执行规则脚本文件,其中,规则脚本文件包括目标、依赖关系、编译命令和仿真命令。所述方法可以采用全脚本的方式,引入自主定义的针对编译仿真的公共脚本,通过为公共脚本传入编译仿真参数,即可实现规则脚本文件的自动生成和运行,减少重复的冗余工作量,解决前端设计验证维护困难、扩展性差的问题。
具体实施方式
下面将详细地对实施例进行说明,其示例表示在附图中。下面的描述涉及附图时,除非另有表示,不同附图中的相同数字表示相同或相似的要素。以下实施例中描述的实施方式并不代表与本申请相一致的所有实施方式。仅是与权利要求书中所详述的、本申请的一些方面相一致的***和方法的示例。
在芯片前端设计的验证环节,需要验证工程师搭建相应的验证环境和测试用例,并在搭建完成后将所设计的代码进行编译和仿真,从而完成测试。对于代码的编译和仿真,可以通过编写makefile文件,makefile文件包含测试用例的编译和仿真参数,也就是说,makefile文件中定义一系列规则来指定需要先编译的文件、需要后编译的文件以及需要重新编译的文件等。
然而,每一个测试用例均需要一个单独的makefile文件,验证工程师不仅需要维护验证环境,还需要同步更新每个测试用例的makefile文件,进而增大验证工程师的工作量,如果makefile文件出现编写错误,可能会误导验证工程师检查验证环境或者前端的设计代码,增加排错难度。并且如果测试用例发生变化,则必须同步更新makefile文件,例如,测试用例的名字更改时,需要同步更新makefile文件,进而降低验证效率。
为了解决芯片前端设计验证维护困难、扩展性差的问题,本申请部分实施例提供一种编译仿真方法,所述编译仿真方法可以采用全脚本的方式,引入自主定义的针对编译仿真的公共脚本,通过为公共脚本传入编译仿真参数,实现规则脚本文件的自动生成和运行。需要说明的是,通过本申请提供的编译仿真方法,可以实现规则脚本文件的自动生成和运行,规则脚本文件可以是makefile文件,也可以是其他可实施的脚本文件,本申请实施例以makefile文件的生成和运行为例对编译仿真方法进行阐述。
如图1、图2所示,图1为本申请实施例提供的一种编译仿真方法的流程示意图,图2为本申请实施例提供的公共脚本的运行示意图,所述编译仿真方法包括如下步骤:
S100:构建公共脚本。
本申请实施例采用全脚本的方式,引入自主定义的编译仿真命令(xrules),即公共脚本。其中,公共脚本可以基于预设语言编写,本申请实施例对编写公共脚本的语言不作具体的限定,本领域技术人员可以根据实际情况进行调整。例如,python语言。
在构建公共脚本时,可以创建初始脚本,并基于预设语言在初始脚本中定义编译仿真函数和输入参数,以构建公共脚本。也就是说,公共脚本中包含针对编译仿真的相关函数和各类参数,用户只需要为公共脚本传入所需的编译仿真参数,即可实现makefile文件的自动生成和运行。
在一些实施例中,公共脚本中定义的编译仿真函数包括创建参数函数(create_by_args函数),用于创建公共脚本所需要用到的输入参数,包括用例名称参数、仿真软件打开参数、清除仿真目录参数、仿真随机种子参数、随机数量参数、并行仿真数量参数、编译参数和目标仿真服务器参数。其中,用例名称参数用于表征测试用例的名称,仿真软件打开参数用于表征打开仿真软件,清除仿真目录参数用于表征清除仿真目录,仿真随机种子参数用于表征仿真时的随机种子,随机数量参数用于表征随机的数量,并行仿真数量参数用于表征并行仿真的数量,编译参数用于表征是否编译,目标仿真服务器参数用于表征仿真的服务器。
其中,上述输入参数可通过预设语言字符表示,示例性的,公共脚本中的创建参数函数(create_by_args)创建的输入参数包括:
rules_file,用来指定测试用例的名称;
verdi,用来打开仿真软件,例如,Verdi软件;
clean,用来清除仿真目录;
rand_seed,用来指定仿真时的随机种子;
count,用来指定随机的数量;
max_job_hum,用来指定并行仿真的数量;
nocomp,用来选择是否进行编译;
quene,用来指定仿真用的服务器。
其中,上述输入参数的值在调用编译仿真命令(xrules)时直接从控制台输入,例如,xrules-rand_seed 815521473,表示指定编号为815521473的随机种子。对于没有赋值的可以使用默认值,即在后续生成规则脚本文件时,可以检测创建参数函数中输入参数的赋值状态,如果赋值状态为未赋值,则将输入参数设置为默认值。
S200:获取编译仿真参数。
其中,编译仿真参数为输入至公共脚本的参数,包括头文件、用例名称、输出目录和仿真选项。在一些实施例中,如图2、图3所示,编译仿真参数可以从用户维护的规则文件(rules文件)中解析得到,为了解析rules文件,公共脚本中定义的编译仿真函数包括解析规则函数(parse_rules函数),用于解析rules文件。即可以获取用户维护的目标规则文件,将目标规则文件输入公共脚本,以及基于解析规则函数解析目标规则文件,以获取编译仿真参数。
其中,rules文件包含仿真的目录、执行的测试用例的位置、指定的测试文件(testbench),例如,roles文件中的内容如下所示,表示测试用例(case)名称为random,输出目录为$OUTPUT_DIR/random,测试文件(testbench)为test_top:
-simv_workdir$OUTPUT_DIR/random
-simv+UVM_TESTNAME=test_top
-simv+DOM_CFG_FILE=$PROJ_DIR/random.case
可以理解是,用户只需要维护一个rules文件,即可实现makefile文件的自动生成和运行,并且rules文件中的数据内容较少,进而减少维护的工作量,提高验证效率。
S300:将编译仿真参数输入公共脚本,以生成规则脚本文件。
获取到编译仿真参数和公共脚本中创建参数函数的输入参数后,如图3所示,可以根据输入参数和编译仿真参数生成规则脚本文件,其中,规则脚本文件包括目标、依赖关系、编译命令和仿真命令。
例如,以上述rules文件作为输入为例,生成的makefile文件如下:
seed:815521473
vcs_workdir:=$(OUTPUT_DIR)/ip
simv_workdir:=$(OUTPUT_DIR)/ip/random/seed_$(seed)
all:vcs simv
vcs:
mkdir-p$(vcs_workdir)&&cd$(vcs_workdir)\
&&vcs-full64-sverilog-ntb_opts uvm-1.2-xlrm atox_context_width-debug_access+r-timescale=1ns/1ps-lca-kdb-partcomp=autopart_low+define+UVM_PACKER_MAX_BYTES=1500000+define+UVM_DISABLE_AUTO_ITEM_RECORDING+define+SYNOPSYS_SV+define+UVM_REG_BYTE_ADDRESSING_FIX+define+VCS-top tb_top-l vcs.log+notimingcheck+define+UVM_EVENT_CALLBACK_FIX -j16+rad-f filelist.f+vcs+lic+wait-fastpartcomp=j16
simv:
mkdir-p$(simv_workdir)&&cd$(simv_workdir)\
&&$(vcs_workdir)/simv-1simv.log+fsdb+autoflush-assert nopostproc+UVM_STACKTRACE+uvm_set_verbosity=uvm_test_top.env.axi_system_env.slave[*],_ALL_,UVM_NONE,run+uvm_set_verbosity=uvm_test_top.env.apb_system_env[*].*,_ALL_,UVM_NONE,run+UVM_TESTNAME=ip+UVM_MAX_QUIT_COUNT=1000,YES+UVM_VERBOSITY=UVM_MEDIUM+ntb_random_seed=$(seed)
其中,vcs_workdir和simv_workdir这两个变量定义输出目录的路径,用于存放编译和仿真生成的文件。all和vcs分别表示makefile文件的目标和依赖,simv表示运行仿真。
S400:执行规则脚本文件。
在生成规则脚本文件后,可以自动执行该规则脚本文件,因此,在公共脚本中定义的编译仿真函数还可以包括执行函数(excute函数),用于执行规则脚本文件。
在一些实施例中,如图4所示,可以在公共脚本中根据需求设置不同的仿真类型,可以将规则脚本文件仿真不编译,或者先将规则脚本文件编译,编译后再进行仿真。即执行规则脚本文件时,可以检测规则脚本文件的仿真类型,如果仿真类型为只仿真不编译,则仿真规则脚本文件,如果仿真类型为编译后仿真,则编译规则脚本文件,以及在编译后仿真规则脚本文件。也就是说,是否对规则脚本文件进行编译,以上述示例性的makefile文件为例,即是否执行makefile文件中的vcs选项。
具体的,在设置仿真类型时,可以对创建参数函数(create_by_args)中输入参数进行设置,以上述示例性的输入参数为例,其中,编译参数(nocomp)用来选择是否进行编译,可以对该参数进行赋值,进而设置仿真类型。例如,nocomp的值为0,则表示只仿真不编译,将nocomp的值为1,则表示编译后仿真。在执行规则脚本文件时,可以读取编译参数(nocomp)的值,以确定仿真类型。
在一些实施例中,在生成规则脚本文件的同时,还可以添加一些扩展命令,即可以预先获取目标拓展指令,并将目标拓展指令封装至公共脚本,在执行规则脚本文件时,可以执行目标拓展指令对应的拓展操作。例如,快速打开波形操作,则将打开波形的扩展命令封装在公共脚本中,可以直接通过公共脚本打开波形文件,还可以将打开波形操作生成一个可执行文件,例如,将打开波形操作生成拓展名为“.csh”的可执行文件,例如,run_verdi.csh,该文件的格式如下所示:
bsub-q verdi″cd/output/ip/random&&verdi-simflow-simBin/output/ip/simv-ssv-ssy-ssf/output/ip/random/main.vf″
用户只需输入对可执行文件的执行命令,即可快速打开波形。
在一些实施例中,还可以将生成编译仿真报告的拓展指令封装至公共脚本,则执行规则脚本文件后,可以获取规则脚本文件的执行结果,并根据执行结果生成编译仿真报告,以提供至用户。
在一些实施例中,可以实现测试用例的并行仿真,可以对创建参数函数(create_by_args)中输入参数进行设置。以上述示例性的输入参数为例,其中,随机数量参数(count)用来指定随机的数量,可以对该参数进行赋值,进而设置并行执行仿真的数量。例如,count的值为n,将会随机出n个不相等的随机种子,并分别生成n个输出目录和n个makefile文件,在一次编译完成后,可以同时进行n个不同种子的仿真并输出波形和报告文件。
示例性的,使用公共脚本的示例如下:
xrules-r random.rules-nocomp 1-quenue urgent-max_job_num 10-count 20-clean 1,其表示运行20个名字为random的测试用例,不编译,种子随机,提交到名为urgent的服务器上执行,最大的并行执行数量是10个,在执行仿真之前先清空仿真目录。
本实施例中,采用全脚本的方式,引入自主定义的针对编译仿真的公共脚本,通过为公共脚本传入编译仿真参数,即可为每个测试用例自动生成单独的makefile文件,用户仅需维护一个数据内容较小(数据内容3-4行)的规则文件,减少维护的工作量,提高验证效率。其中,公共脚本的通用性较强,实用性和灵活性较高,可以选择是否编译代码、是否指定随机种子进行仿真、选择特定的服务器进行仿真、支持测试用例的并行仿真、选择并行执行仿真的数量,支持随机产生不同种子进行仿真、支持仿真前清除仿真目录等。并且还可以根据需求增加新功能,实现快速打开波形文件、快速生成可执行文件等相关扩展应用的支持,解决前端设计验证维护困难、扩展性差的问题。
基于上述编译仿真方法。本申请的部分实施例中还提供一种前端验证的编译仿真装置,所述编译仿真装置包括脚本构建模块、参数获取模块、规则脚本文件生成模块和编译仿真模块。其中:
脚本构建模块,用于构建公共脚本。
参数获取模块,用于获取编译仿真参数,其中,编译仿真参数包括头文件、用例名称、输出目录和仿真选项。
规则脚本文件生成模块,用于将编译仿真参数输入公共脚本,以生成规则脚本文件,其中,规则脚本文件包括目标、依赖关系、编译命令和仿真命令。
编译仿真模块,用于执行规则脚本文件。
基于上述编译仿真方法,本申请的部分实施例中还提供一种电子设备,如图5所示,图5为本申请实施例提供的一种电子设备的结构框图,该电子设备800包括:至少一个处理器801,至少一个通信接口802,至少一个存储器803和至少一个总线804。其中,总线804用于实现这些组件直接的连接通信,通信接口802用于与其他节点设备进行信令或数据的通信,存储器803存储有可被处理器801执行的计算机程序指令。当电子设备800运行时,处理器801与存储器803之间通过总线804通信,处理器801调用存储器803中存储的计算机程序并执行该计算机程序可以实现本申请实施例提供的编译仿真方法。
基于上述编译仿真方法,本申请的部分实施例中还提供一种计算机程序产品,包括存储在计算机可读存储介质上的计算机程序,计算机程序包括计算机程序指令,当计算机程序指令被计算机执行时,计算机能够执行上述实施例中的编译仿真方法。
基于上述编译仿真方法,本申请的部分实施例中还提供一种计算机可读存储介质,所述计算机可读存储介质存储计算机程序指令,所述计算机程序指令被计算机运行时,使所述计算机执行前述方法实施例所述的编译仿真方法。
本申请提供的实施例之间的相似部分相互参见即可,以上提供的具体实施方式只是本申请总的构思下的几个示例,并不构成本申请保护范围的限定。对于本领域的技术人员而言,在不付出创造性劳动的前提下依据本申请方案所扩展出的任何其他实施方式都属于本申请的保护范围。