目录
1.1.2 NTF的预处理(#include,环境变量获取)
1. Regression功能使用指南
1.1 NTF格式介绍
Cadence的Vmanager工具采用vsif类型的文件作为regression的输入文件,采用vplanx/csv类型的文件作为vplan的输入文件,vplanx、vsif文件采用标准的嵌套文本格式(NTF),NTF是一种元格式,类似于XML,本文有关于Vmanager采用的NTF格式的介绍如下:
- NTF的BNF(巴克斯范式)描述
- NTF的预处理(#include,环境变量)
- NTF的限制
- NTF的错误处理
1.1.1 NTF的BNF(巴克斯范式)描述
BNF可以理解为专门用于描述(定义)语言的元语言,就是用书面文字的方式来定义编程语言,多出现在各种语言的官方文档中,比如Python官方文档:
NTF的BNF格式如下:
- 容器(container)的标识符取决于文件类型,比如:
- vsif files--session,group,test
- vplan files--import,section,perspective,coverage,extend,instantiate,within
- 标识符不区分大小写;
- 可以在任何BNF元素之间自由使用空白。若要保留名称或属性值中的空格,需要将其放在双引号中;
- 使用“//”或者“--”可以注释掉该行;
- 容器(container)的关闭符号“}”后面的分号“;”是可选的;
- vManager在读取文件时从字符串中删除引号;
- 有关{属性(attribute): 值(value)}的完整说明,可以参阅attribute : value;
- NTF 中没有前向引用(需要按顺序定义属性)。例如,在 vplan 文件中,必须首先定义section属性,然后定义views属性,然后定义section的扩展属性 within 属性。
1.1.1.1 {属性:值}定义
使用“:”定义一个属性的具体值。
1.1.1.2类别
属于容器的成员变量(可以把容器理解为一个类,属性就是该类的成员变量,值就是成员变量的具体值)
1.1.1.3语法
attribute_name: attribute-value;
- attribute_name 是仅包含字母数字字符和下划线字符的标识符。attribute_name中不允许有空格,但允许在attribute_name前后使用空格。attribute_name区分大小写。session属性的name必须与所有的test属性的name不同。换言之,不能在test和session中使用相同的attribute_name。
- attribute_value可以为空或者按如下语法:
- 字符串,可选用引号括起来,如果attribute_value在引号中,则删除引号,保留引号中的内容。如果attribute_value不在引号中,则删除初始和最终空格,并将任何多个空格替换为一个空格。
- 注意(所有字符串属性(预定义和用户定义)限制为 32672 个字符。当尝试输入超过 32672 个字符时(在所有方法中 - vsif、edit、scanning),该值将被截断并以“ ..."代替.)
- vManager沿 $VMANAGER_PATH 搜索file的完整或部分路径名
- 多行文本,按如下方式括起来<text></text>,<text>必须是第一行中的第一个非空格标记,并且</text>必须是最后一行中的最后一个非空白标记。<text> 和</text>可能出现在同一行上,尽管这相当于在实际文本周围使用双引号。
- 举例:如下2个dut_error含义相同:
- 注意,后定义的容器内属性会覆盖以前的属性。
1.1.2 NTF的预处理(#include,环境变量获取)
在 vsif 文件中,可以使用任何标准 C++ 指令。有关详细信息,请参阅标准 C++ 指令。在其他 NTF 文件中,可以在文件中的任何位置添加 #include 指令。vManager 将 include 指令视为文件内容写入其中。
#include语法如下:
- 包含的文件必须用双引号括起来。
- 每个 include 指令都必须写在仅包含自身的一行中。
- 不允许在 include 指令的末尾使用分号。
- include 指令中允许使用环境变量。使用类似 shell 的语法 $ENV_VAR 或 ${ENV_VAR}。
- 不要在 #include 指令中使用 vsif 指令 $ENV()、$RUN_DIR、$DIR() 或 $ATTR()。
如果未将包含的文件指定为绝对路径,vManager 将搜索以下目录:
- 包含文件的目录(包含 #include 指令或 import {} 的文件)。
- 运行vManager 的目录。
- $VMANAGER_PATH 环境变量指定的任何目录。
1.1.3 NTF的限制
- 如果数据本身带<text>这个字符的话,vManager就不能编译在<text> </text>标识符之间的数据。
- NTF 容器必须在打开它们的文件中关闭。如果在一个文件中打开容器,则无法在包含的文件中关闭它。
- 例如,不支持以下内容:
1.1.4 NTF的错误处理
解析 NTF 文件时,可能有两种类型的错误:
- NTF 不兼容错误 -- 文件不是 NTF 格式。
- 特定于应用程序的错误 -- 文件采用 NTF 格式,但根据正在读取的格式,其中的数据是错误的。例如,编写“seed: 123”是有效的 NTF 语法,把seed作为vsif中的container的{属性:值}是正确的,但seed放在vplan 中会产生错误。
1.2 vsif文件中有效的container
vsif 文件指定要在单个session中运行的一个或多个test。为了支持 vsif 文件的链接,一个 vsif 文件中允许有多个session容器。
vsif 文件还允许以下语法:
- 标准 C++ 编译器指令,包括 #include、#define、#ifdef 和 #ifndef;
- 属性值指令,包括 $ENV、$RUN_ENV、$ATTR 和 $DIR;
以下是 vsif 文件中的有效 NTF 容器:
对于上面每个容器,它可以容纳的用户定义属性数是有限制的。如下:
其中:
- other types包括:path,duration,enum,long,double,boolen。
- other containters包括:test,group,session,run,session_output。
1.2.1 session {…}
在session容器中可以定义如下属性:
1.2.2 group/test {…}
在group/test中可以定义如下属性:
1.2.2.1 auto_scan_args
- 描述:将用户参数传递给自动扫描命令(尤其是 vm_scan.pl);
- 语法:auto_scan_args: arguments
- 举例:
group long_tests {
auto_scan_args: -max_patterns 50;
}
- 解释:日志扫描分两个步骤执行:
- 在 vsif 中执行由 scan_script 属性定义的扫描规范
- 使用 Xcelium 等 Cadence 工具时自动完成补充扫描。
虽然第一步由用户定义,但第二步是自动完成的。使用auto_scan_args属性,用户可以将参数传递给在互补扫描中执行的vm_scan.pl命令。指定为此属性的值的参数将追加到原始 vm_scan.pl 命令中。
1.2.2.2 bundle_group
- 描述:将组作为单个 DRM 作业执行
- 语法:bundle_group:boolean(默认为FAUSE)
- 解释:boolean 是一个布尔值。如果为 TRUE,则整个group(包括pre_session和post_session脚本)以及grouptest的整个子层次结构将捆绑到一个 DRM 作业中。如果为 FALSE(默认值),则不应用用户定义的捆绑规范。
1.2.2.3 code_coverage
- 描述:打开或关闭代码覆盖率收集
- 语法:code_coverage:string, 其中string 可以为用双引号或不加引号的<text></text>括起来的任何字符串。如果不加引号,则字符串只能包含字母数字字符、下划线、点或斜杠。
- 例子:
4.解释:如果在 vsif 中定义此属性,vManager 会将该定义导出为环境变量 (BRUN_CODE_COVERAGE)。但是,仿真器不会自动拾取此信息。您必须在运行脚本中将其传递给模拟器。例如:
xrun -svseed $BRUN_SV_SEED $BRUN_CODE_COVERAGE $BRUN_HDL_FILES
1.2.2.4 count
- 描述:指定test的运行次数
- 语法:count : int
- 例子:
- 解释:此属性指定您希望在单个session中执行test的次数。如果使用 seed 或 sv_seed 属性指定多个种子,则运行的测试数等于种子总数乘以 repetitions 属性的值。如果种子数与 count 属性表示的数字不匹配,则会选择一个随机种子,vManager 会发出警告。有关count和repetition的综合效果的示例,见repetition。作为一般准则,建议不要在单个session中启动超过 10,000 次运行。此属性不支持使用 $RUN_ENV。
- 注意:如果seed属性结合count属性使用,将会以如下规则为准:
- 当seed具有单个值时,运行次数将等于 count 的值;
- 当seed具有多个值时,运行次数将等于seed数;
- 如果seed数与count数匹配,则 vManager 将运行该数目的测试;
- 如果seed数小于count数,则 vManager 将运行所有seed测试,然后对超出的count数使用随机seed。
- 如果seed数大于count数,则 vManager 将运行所有seed测试(忽略count)。
- seed中的重复值将仅计数一次。例如:
下例中的seed有重复,根据规则4和1,等同于采用positive_gen_random种子一次,随机种子4次,运行5次
下例中seed有5个(1重复),count只有2个,根据规则6,相当于有4个种子,再根据规5,运行4次
1.2.2.5 repetition
- 描述:为test或group中的test将run的次数定义一个乘数
- 语法:repetition:unit(int为非负数,默认值为1)
- 例子:将会复制my_file文件到run目录下。
- 解释:此属性用于将文件复制到 session/group/run 目录。
1.2.2.6 copied_files
- 描述:要复制到 session/group/run 目录中的文件。
- 语法:copied_files:pathname,其中pathname 是要复制到 session/group/run 目录的文件的完整路径。
- 例子:将会复制my_file文件到run目录下。
- 解释:此属性用于将文件复制到 session/group/run 目录。
1.2.2.7 depends_on
- 描述:在测试之间创建依赖关系。
- 语法:depends_on:pathname,其中pathname 是相对路径(使用 ../[../]name shell 格式),该test或group必须在运行当前test之前完成其执行。vsif 中test和group的相对路径名必须是唯一的。。
- 例子:下例中要求group2的pre_group要在group3所有jobs完成后执行。
- 解释:每个session都在具有依赖关系的阶段中执行。可以在test之间、group之间或test与group之间定义其他依赖关系。这些依赖项通过指定在test或group中的test可以运行之前必须完成的test来充当阻止操作。由于可以通过将group嵌套在其他group中来隐式定义依赖关系,也可以通过添加 depends_on 属性来显式定义依赖关系,因此可能会出现依赖关系冲突。例如,以下 vsif 包含依赖矛盾(循环依赖):
一方面,由于 group2 嵌套在 group1 中,因此隐式组依赖关系要求 group1 的pre_group脚本在 group2 的jobs开始运行之前完成其执行。
另一方面,由于 group1 显式依赖于 group2 ,因此所有 group2 的jobs都必须在 group1 的pre_group脚本开始之前完成其执行。
- 注意:vmanager运行器会在开始运行之前识别到依赖关系的矛盾并报错。
- 例如:如下的vsif文件中定义了2个显示依赖关系
1.2.2.8 details
- 描述:用于描述一个test的用途、目的。
- 语法:details:<text>text</text>
- 解释:如果在与此属性相同的test或group容器中定义的任何test也被标识为具有 vplan_ref vsif 属性或 directed_test vplan 属性的定向测试,则 vManager 会在“验证计划”窗格中显示此文本作为说明。。
1.2.2.9 drm_job_priority_vmgr
- 描述:指定 DRM 作业优先级。
- 语法:drm_job_priority_vmgr:int,其中int 是一个整数值。有效值的范围因 DRM 而异。vManager 不会验证此处指定的值,如果值无效,job提交将失败。没有默认值。因此,如果未指定值,则会为job分配默认优先级(由 DRM 配置)。
- 例子:
- 解释:通过设定该属性以指定DRM jobs的优先级。
1.2.2.10 dut_name
- 描述:指定DUT名字。
- 语法:dut_name:string
- 例子:
- 解释:通过设定该属性以指定DUT名字。
1.2.2.11 exit_on
- 描述:定义Specman退出条件。
- 语法:exit_on:option,其中option可为 normal_stop , error , all.
- 例子:
- 解释:该属性只对Specman工具生效。
1.2.2.12 fully_directed
- 描述:指定这是完全定向的测试。
- 语法:fully_directed:boolean,默认值为FALSE
- 例子:
- 解释:完全定向测试仅在session的第一次迭代中运行一次。
1.2.2.13 gui_mode
- 描述:打开或关闭交互模式。
- 语法:gui_mode:string
- 例子:
- 解释:如果在 vsif 中定义此属性,vManager 会将该定义导出为环境变量 (BRUN_GUI_MODE)。但是,仿真器不会自动拾取此信息。您必须在运行脚本中将其传递给仿真器。
1.2.2.14 linked_files
- 描述:要链接到 session/group/run 目录的文件。。
- 语法:linked_files: pathname
- 例子:会在run目录下产生一个连接文件,连接到my_file
- 解释:此属性用于在 session/group/run 目录中创建指向文件系统中其他文件的链接。
1.2.2.15 pre_group_script
- 描述:在调用一组test之前的pre_group阶段执行任何 shell 命令。
- 语法:pre_group_script:pathname,pathname应为绝对或相对路径;
- 例子:
- 解释:在调用group中的任何test之前,可以使用此属性运行任何脚本。
- 注意:pre_group_script属性的解析度是本地的。换言之,该定义仅适用于本组,而不适用于任何子组。此属性不能在任何重新运行方案中使用,因为它不会复制到 vsof。要扫描pre_group日志,请将 scan 命令附加到pre_group_script。示例:
1.2.2.16 pre_run_script
- 描述:在调用run之前执行任何 shell 脚本。
- 语法:pre_run_script:pathname,pathname应为绝对或相对路径;
- 例子:
- 解释:在调用test之前,可以使用此属性运行任何脚本。
1.2.2.17 primary_run
- 描述:指示所选运行是否为主运行。此属性的默认值为 false。
- 语法:primary_run:true
- 例子:
- 解释:只能在 collect 或 vsif 期间定义primary_run。之后,每当您进行analysis或export_merge时,您都会得到您设置的内容。此外,在数据库中有一组run后,可以手动将其中一个运行设置为主运行。《vManager 用户指南》的“收集运行”部分中也讨论了 PrimaryRun。
1.2.2.18 post_group_script
- 描述:在调用一组test之后的post_group阶段执行任何 shell 命令。
- 语法:post_group_script:pathname,pathname应为绝对或相对路径;
- 例子:
-
-
- 解释:在调用group中的所有test之后,可以使用此属性运行任何脚本。
- 注意:post_group_script属性的解析度是本地的。换言之,该定义仅适用于本组,而不适用于任何子组。此属性不能在任何rerun方案中使用,因为它不会复制到 vsof。要扫描pre_group日志,请将 scan 命令附加到pre_group_script。示例:
1.2.2.19 post_run_script
- 描述:scan脚本执行完成后执行任何 shell 命令。
- 语法:post_run_script:pathname,pathname应为绝对或相对路径;
- 例子:
-
-
- 解释:您可以使用此属性在scan脚本完成后和post_session脚本之前运行任何脚本。
1.2.2.20 post_simulate_script
- 描述:在run完成后,在调用scan脚本之前执行任何 shell 命令。
- 语法:post_simulate_script:pathname,pathname应为绝对或相对路径;
- 例子:
-
-
- 解释:可以使用此属性在单次run脚本完成后和调用scan脚本之前运行任何脚本。
1.2.2.21 revision
- 描述:提供每次运行的修订信息。。
- 语法:revision:string;其中,string可以被“”或者<text></text>括起来;
- 例子:
- 解释:此属性允许您查询特定修订版中的测试。例如,您可能希望查找在特定修订版中执行的所有运行。修订信息按以下模式输出到日志文件:revision 属性可以包含在group和test容器中。
1.2.2.22 run_mode
- 描述:指定运行模式。
- 语法:run_mode:string,其中string可以为batch,interactive,batch_debug,interactive_debug这四种;(默认为batch)
- 例子:
-
-
- 解释:运行器将 BRUN_RUN_MODE 环境变量设置为与 run_mode 属性相同的值。这允许 $BRUN_RUN_SCRIPT 根据需要调用命令行界面或图形界面,无论是否使用其他调试工具。
1.2.2.23 run_script
- 描述:指定使用 SVE 调用组合的simulator/vManager可执行文件的脚本。
- 语法:run_script:path,其中path为绝对路径或相对路径;(默认为batch)
- 例子:
-
-
- 解释:运行器希望 run_script 属性指定一个 shell 命令,该命令调用组合的 vManager 模拟器可执行文件并启动单个运行。例如,在vm_xor示例中,run_script属性设置为:/<INSTALL_DIR>/vmanager/vm_lib/vm_xsoc/scripts/run_ex_vm_xsoc.sh。运行脚本可以使用由各种 vsif 属性创建的所有环境变量,以及由 sve 文件设置的环境变量。例如,运行脚本可以根据 local_run.sh 中设置的 $BRUN_RUN_MODE 的值,调用具有或不具有其他调试工具的交互式或批处理运行。
1.2.2.24 scan_script
- 描述:指定用于扫描仿真输出以查找故障的脚本。
- 语法:scan_script:path,其中path为绝对路径或相对路径;(默认为batch)
- 例子:
-
-
- 解释:运行器期望 scan_script 属性指定一个 shell 脚本,该脚本扫描运行的标准输出,查找失败和其他特殊信息。该脚本使用各种筛选器文件中指定的模式来查找特定工具输出的消息。您可以修改这些筛选器文件或创建新的筛选器文件,以处理特定于项目的要求。使用 scan_script 属性时,必须显式指定筛选器。 您可以使用 vManager vm_scan.pl提供的基本scan脚本。有关预定义筛选器文件的完整列表,请参阅使用扫描脚本和预定义的筛选器文件。可以使用vmanager系统自带的标准filter,如以下几个:
1.2.2.25 seed
- 描述:指定一个test的seed。
- 语法:seed:value,value可以为一个32bit的整型变量,或一个整型集合。
-
-
- 例子:
-
-
- 解释:此属性指定运行器自动传递给 Specman 生成器的种子。通过传递特定种子,可以多次运行完全相同的测试。 需要注意的是,此处的 seed 属性将用作 VSOF 报告属性,而不是像 Specman 那样用作 VSIF 属性。最好使用sv_seed单独传递种子。
- 注意:如果为seed和sv_seed属性指定了多个种子,则只有以下组合是合法的:
- 两个seed都有单/随机值。
- 一个seed有多个值,而另一个seed只有一个值(随机或常量)。
- 两个seed具有完全相同数量的多个值。在这种情况下,运行的测试数是不同seed值的数量,并且seed被确定为成对。(第一个seed值与第一个sv_seed值配对,第二个seed值与第二个sv_seed值配对,依此类推)。
- 注意:运行器将每个测试的seed值写入 vsof,如下所示:
- 如果在 vsif 中将种子指定为整数,则该值将写入本地 vsof。
- 如果指定了 gen_random 或 positive_gen_random,则计算该值并将其写入本地 vsof。
- 如果指定了 random,则在运行开始之前不会将任何值写入本地 vsof。
- 在运行结束时,扫描脚本会查找运行中实际使用的种子,并将其写入 vsof。如果运行失败,并且扫描脚本未提取种子,则运行器写入的初始值生效。此行为使你能够使用应在该运行中使用的相同种子重新运行失败的运行。如果使用 random,并且运行失败,则重新运行将使用默认种子值,即 random。
- 不建议对此属性使用 $RUN_ENV。
1.2.2.26 sim_args
- 描述:指定要在用户的运行脚本 $BRUN_SIM_ARGS 中使用的仿真参数。
- 语法:sim_args:arguments,其中arguments可以是任何仿真参数。
- 例子:
-
-
- 解释:此属性用于在用户的运行脚本 $BRUN_SIM_ARGS 中指定仿真参数。
1.2.2.27 sv_seed
- 描述:指定此测试的种子。
- 语法:sv_seed:value,value同seed属性。
- 例子:
-
-
- 解释:此属性指定任何代理(如 Incisive Simulator)的种子。如果在 vsif 中定义此属性,vManager 会将该定义导出为环境变量 ( BRUN_SV_SEED )。但是,运行器不会自动将此值传递给代理。必须在 run-script 中显式传递它。例如:xrun -svseed $BRUN_SV_SEED $BRUN_HDL_,由于此行是在运行环境中执行的,因此定义了变量 BRUN_SV_SEED,因此会正确计算和传递。如果定义多个种子,则运行的测试数等于种子总数乘以重复属性的值。如果种子数与 count 属性表示的数字不匹配,vManager 将发出警告。
1.2.2.28 sve_name
- 描述:设置验证环境。
- 语法:sve_name:attribute-value,attribute-value 是 SVE 文件的绝对或相对路径名,扩展名为 .sve。输入 sve 文件的完整路径。
- 例子:
-
-
- 解释:sve 文件仅设置控制运行所需的环境变量;它不应包含其他命令。运行器在执行运行之前获取 SVE 文件。
1.2.2.29 timeout
- 描述:为一个run设置timeout时间。
- 语法:timeout:time,time 是一个非负数,表示终止运行前的秒数。如果此属性设置为 0,则禁用超时机制。默認值為900s
- 例子:
-
-
- 解释:timeout定义 run_script 属性中给定的命令的最长执行时间。在目标主机上调用运行时,测量开始。如果运行未在指定时间内完成,则会终止该运行并标记为错误。
1.2.2.30 verbosity
- 描述:打开或关闭vbt程度。
- 语法:verbosity:string。
- 例子:
-
-
- 解释:如果在 vsif 中定义此属性,vManager 会将该定义导出为环境变量 ( BRUN_VERBOSITY )。但是,仿真器不会自动拾取此信息。您必须在运行脚本中将其传递给仿真器。例如:
xrun -svseed $BRUN_SV_SEED $BRUN_VERBOSITY $BRUN_HDL_FILES
1.2.2.31 vplan_ref
- 描述:指定test所对应的vplan部分的名称。
- 语法:vplan_ref:pathname,pathname 是一个字符串,指定一个或多个验证计划部分的分层路径,格式为:[[/]section-name/...]节名[,...]该字符串可以包含 AWK 样式的通配符,以匹配不同的 vPlan 部分名称。如果在字符串中指定相对路径,则该选项将匹配以指定路径结尾的所有 vPlan 部分。例如,A/B 等同于 .*A/B。此选项区分大小写,但对空格不敏感。连续的空白将折叠成一个空格。。
- 例子:
- 解释:使用此属性可以指定定向测试所属的 vPlan 节的名称。可以输入多个 vPlan 部分,用逗号分隔。vManager 在 vPlan 窗格中显式加载的任何 vsif 文件中查找测试。如果未读取 vsif 文件,vManager 将搜索当前上下文中存在的测试。如果 vManager 找到测试或一组测试的vplan_ref属性,则会在 vPlan 的指定部分下显示这些测试的覆盖率结果。
1.2.2.30 waveform
- 描述:打开或关闭波形。
- 语法:waveform:string。
- 例子:
- 解释:如果在 vsif 中定义此属性,vManager 会将该定义导出为环境变量 ( BRUN_WAVEFORM )。但是,仿真器不会自动拾取此信息。您必须在运行脚本中将其传递给仿真器。例如:xrun -svseed $BRUN_SV_SEED $BRUN_WAVEFORM $BRUN_HDL_FILES
1.2.2.31 write_metrics
- 描述:通过 vManager 控制覆盖率数据的生成。
- 语法:write_metrics:disable,应将 write_metrics 属性设置为禁用,以便通过 vManager 生成覆盖率衡量指标。 (默认为TRUE)
- 例子:
-
-
- 解释:如果 write_metrics 属性设置为禁用,则会生成 UXE 运行的覆盖率指标。
1.3 vsif文件中环境变量的设置
vmanager支持如下环境变量:
1.3.1 $ENV环境变量
- 描述:引用静态环境变量。此变量必须在调用 vManager 之前定义,并在解析 vsif 时使用。
- 语法:$ENV(env_var)
- 例子:
- 解释:使用 $ENV() 指定的环境变量在解析 vsif 时在session启动期间进行评估。为了提供稳定的rerun环境,rerun时使用 $ENV 指令指定的属性的值与原始运行期间使用的值相同。在rerun测试之前更改环境变量对新运行没有影响。以下属性需要静态值,因此这些属性中使用的任何环境变量都必须使用 $ENV() 指定:
1.3.2 $RUN_ENV环境变量
- 描述:引用仅在运行时已知的动态环境变量。此环境变量可以在 SVE 文件中定义,并在运行时由job使用。
- 语法:$RUN_ENV(env_var)
- 例子:
- 解释:使用 $RUN_ENV() 指定的环境变量在run的执行阶段进行评估。使用此指令指定的值在rerun期间不稳定,并且会重新计算以重新执行run。例如,您可以在 sve 文件中设置使用 $RUN_ENV() 指定的变量的值。vManager 支持表中所示的构造,用于引用 vsif 中的attribute。
-
-
- 评估:每个container的attribute值在 vsif 层次结构中最内层(最低)位置(“最内层优先”)进行评估。如果根本没有为层次结构定义attribute,则使用默认值。使用此指令给出的值在rerun期间重新计算,以便为新session/chain提供相关value。数据库中显示的最终值是展开所有属性引用后在运行期间使用的值。
-
如下例子中:由于test t的最内层优先原则,导致model_dir的路径被设置为dir2.
-
-
1.3.3 $DIR环境变量
注: 请使用 $DIR(),而不是使用 vManager 的运行包装脚本中设置的变量,例如 $BRUN_SESSION_DIR。
- 描述:keyword是session/chain/group/run之一。运行器将 $DIR(keyword)替换为指定目录的完整路径。
- 语法:$DIR(keyword)
- 例子:
- 注意:如果多个层次都定义了同样一个attribute,则服从最内层优先原则,如果在层次结构的级别上使用此指令,而该层次结构没有请求的目录(例如,在group内使用 $DIR(run)),则该值为空字符串。在下例中,组 g 的 model_dir 属性为 /model_dir,因为 $DIR(run) 在组容器中返回一个空字符串。$DIR(run) 为测试 t1 和测试 t2 正确扩展。测试 T1 继承组的 model_dir 属性,但对于测试 T2,此值将被覆盖。
1.3.4 SVE文件的编写
验证项目通常需要一个或多个验证环境(SVE)。通常,SVE 的某些特征被定义为 vsif 属性,而其他特征则被定义为 sve 文件中的环境变量。SVE 文件和 vsif 文件仅影响运行器启动的运行,它们不会影响当前对 vManager 的调用。在启动 vManager 之前,必须设置与 vManager 调用相关的所有环境变量,可以用作环境变量,也可以在 system.specman 文件中设置。
SVE 通常由以下部分定义:
- 测试平台(通常为 e 或 SystemVerilog);
- DUT(通常为 HDL 或 C);
- 代理(通常为 IES);
- 基本工具集参数,例如build脚本、scan脚本和run脚本的名称;
- 其他工具集参数,例如操作系统以及模拟器的名称和版本;
SVE文件的编写如下例:
TC_NAME="cpto_sw_v200_tc001_aes_enc"; export TC_NAME
在vsif文件中按照如下方式应用:
1.4 采用vmgr执行regression的具体操作流程
以CPTO项目为例,首先编写的vsif文件,如下所示:
session cpto_sw_v200_session {
top_dir : $ENV(PROJ_SRC)/verification/bt/cpto_sw_v200/vm_test;
drm : parallel_local;
max_runs_in_parallel : 50;
free_hosts : TRUE;
create_debug_logs : TRUE;
create_optimized_coverage_data : ALL_SESSION;
output_mode: terminal;
verification_scope : cpto_sw_v200_normal_test;
description : <text>This session contains 50 tests run with seed=0000 used for cpto_sw_v200 BT verification !!!</text>;
//pre_session_script : "" ;
post_session_script : "make -f $ENV(PROJ_SRC)/verification/bt/cpto_sw_v200/sim_xrun/makefile com";
//model_dir : "$ENV(PROJ_SRC)/verification/bt/cpto_sw_v200/cov/imc/cov_work/scope";
local_top_dir : "$ENV(PROJ_SRC)/verification/bt/cpto_sw_v200/vm_test/my_local_dir";
}
group cpto_sw_v200_single_aes_mode {
bundle_group : FALSE;
repetitions : 1;
count : 1;
sv_seed : 0000;
gui_mode : "off";
run_mode : "batch";
//pre_group_script : ;
//post_group_script : ;
scan_script : "vm_scan.pl uvm.flt shell.flt ius.flt" ;
dut_name : cpto_sw_v200 ;
sve_name : "$ENV(PROJ_SRC)/verification/bt/cpto_sw_v200/vm_test/env_var.sve" ;
verbosity : "UVM_MEDIUM";
waveform : "off";
code_coverage : "-covfile $ENV(PROJ_SRC)/verification/bt/cpto_sw_v200/sim_xrun/cov_config.ccf";
test single_aes_enc {
//pre_run_script : "";
run_script : "make -f $ENV(PROJ_SRC)/verification/bt/cpto_sw_v200/sim_xrun/makefile run tc=$RUN_ENV(TC_NAME) seed=$ATTR(sv_seed) fsdb=off vbt=$ATTR(verbosity)";
//post_run_script : "";
//copied_files : ;
details : <text> Used for cpto single_aes_enc_mode test!!</text>;
}
test single_aes_dec_deckey {
//pre_run_script : "";
run_script : "make -f $ENV(PROJ_SRC)/verification/bt/cpto_sw_v200/sim_xrun/makefile run tc=cpto_sw_v200_tc002_aes_dec_deckey seed=0000 fsdb=off vbt=$ATTR(verbosity)";
//post_run_script : "";
//copied_files : ;
details : <text> Used for cpto single_aes_dec_deckey_mode test!!</text>;
}
test single_aes_dec_enckey {
//pre_run_script : "";
run_script : "make -f $ENV(PROJ_SRC)/verification/bt/cpto_sw_v200/sim_xrun/makefile run tc=cpto_sw_v200_tc003_aes_dec_enckey seed=0000 fsdb=off vbt=$ATTR(verbosity)";
//post_run_script : "";
//copied_files : ;
details : <text> Used for cpto single_aes_dec_enckey_mode test!!</text>;
}
test single_aes_key_gen {
//pre_run_script : "";
run_script : "make -f $ENV(PROJ_SRC)/verification/bt/cpto_sw_v200/sim_xrun/makefile run tc=cpto_sw_v200_tc004_aes_key_gen seed=0000 fsdb=off vbt=$ATTR(verbosity)";
//post_run_script : "";
//copied_files : ;
details : <text> Used for cpto key_gen_mode test!!</text>;
}
}
group cpto_sw_v200_ecb_mode {
bundle_group : FALSE;
repetitions : 1;
count : 1;
//sv_seed : 0000;
gui_mode : "off";
run_mode : "batch";
//pre_group_script : ;
//post_group_script : ;
scan_script : "vm_scan.pl uvm.flt shell.flt ius.flt";
dut_name : cpto_sw_v200 ;
//sve_name : "*.sve" ;
verbosity : "UVM_MEDIUM";
code_coverage : "-covfile $ENV(PROJ_SRC)/verification/bt/cpto_sw_v200/sim_xrun/cov_config.ccf";
test ecb_enc {
//pre_run_script : "";
run_script : "make -f $ENV(PROJ_SRC)/verification/bt/cpto_sw_v200/sim_xrun/makefile run tc=cpto_sw_v200_tc005_ecb_enc seed=0000 fsdb=off vbt=$ATTR(verbosity)";
//post_run_script : "";
//copied_files : ;
details : <text> Used for cpto ecb_enc_mode test!!</text>;
}
test ecb_dec {
//pre_run_script : "";
run_script : "make -f $ENV(PROJ_SRC)/verification/bt/cpto_sw_v200/sim_xrun/makefile run tc=cpto_sw_v200_tc006_ecb_dec seed=0000 fsdb=off vbt=$ATTR(verbosity)";
//post_run_script : "";
//copied_files : ;
details : <text> Used for cpto ecb_dec_mode test!!</text>;
}
}
然后打开vmanager,在launch中载入刚刚编写的vsif文件:
回归开始执行:
在analysis中可以查看回归结果,在vsif中我们设置了一组session因此有一次回归,session下有2个group,分别对应两种不同的模式,group下有分别有4个、2个test,对应具体的测试用例,因此最终提交了6个回归:
选择对应的case还可以查看其log信息: