| |
ParameterizedTests
Introduction
配置test environment时,有两种情况,SystemVerilog参数是唯一可用的选项 - 类型参数和用于指定位向量大小的参数。由于SystemVerilog参数的性质,可以设置这些值的最新时间是在elaboration time期间,通常是在您调用仿真器的位置(请参阅下面的回归测试性能)。
DVCon 2011 Paper
本文中的信息也在XConx的DVCon 2011上展示了。DVCon论文可供下载((Parameters And OVM - Can't They Just Get Along?)。本文中的内容是Mentor和Xilinx合作的结果。
Registering Parameterized classes with the String-based Factory
参数化类使用`uvm_component_param_utils和`uvm_object_param_utils宏来向factory进行注册。实际上有两个factories - 一个基于string,一个基于type。 param_utils宏仅向基于type的factory注册。
有时,您可能希望使用基于string的factory来创建组件或对象。使用基于string的factory的最常见情况是在调用run_test()期间。run_test()使用其字符串参数或UVM_TESTNAME plusarg中的字符串值来从基于string的factory请求组件。
由于参数化组件默认情况下不会向基于字符串的factory注册,因此您需要为顶层test class创建基于字符串的注册,以便可以通过run_test()对它们进行实例化。
要完成此任务,您需要手动实现param_utils宏执行的操作。
例如,给定一个名为alu_basic_test#(DATA_WIDTH)的参数化test class,对宏`uvm_component_param_utils(alu_basic_test#(DATA_WIDTH))的调用将扩展为:
typedef uvm_component_registry #(alu_basic_test #(DATA_WIDTH)) type_id;
static function type_id get_type();
return type_id::get();
endfunction
virtual function uvm_object_wrapper get_object_type();
return type_id::get();
endfunction
上面代码中的typedef创建了uvm_component_registry类型的专属化,但该类型有两个parameter arguments - 第一个是正在注册到factory的类型(在本例中为alu_basic_test#(DATA_WIDTH)),第二个是用于在基于字符串的注册表中唯一标识该类型的字符串名称。由于param_utils宏没有为第二个参数提供值,因此它默认为空字符串,并且不执行基于字符串的注册。
要创建基于字符串的注册,您需要为第二个parameter argument提供一个字符串,该字符串对于test class的每个专属化都是唯一的。
typedef uvm_component_registry #(alu_basic_test #(DATA_WIDTH), "basic_test1") type_id;
此外,您需要声明参数化test class的“dummy”专属化,以便上面指定的字符串名称与特定参数值相关联。
module testbench #(int DATA_WIDTH);
alu_rtl #(DATA_WIDTH) dut ( /* port connections */ );
// Associate the string "basic_test1" with the value of DATA_WIDTH
typedef alu_basic_test #(DATA_WIDTH) dummy;
initial begin
run_test("basic_test1");【笔误:少一个end】
endmodule
注意:您可以使用下面描述的宏来生成字符串名称,例如“basic_test _#(8)”,并将实际参数值作为字符串的一部分,而不是像“basic_test1”这样的名称。
Regression Test Performance with Parameters
为了提高仿真性能,QuestaSim通过vopt工具在单独的优化步骤中执行一些elaboration任务,包括指定顶层参数。该工具采用顶层参数并将其“bakes”到设计中,以便充分利用优化设计结构。
不幸的是,这意味着如果要更改这些参数的值,则需要在调用仿真器之前重新优化整个设计。这可能会对回归测试性能产生重大影响,其中许多测试运行使用不同的参数值。为避免这种情况,您可以告诉vopt某些参数应该被视为“floating”,并且稍后将使用命令行选项+ floatparameters(对于Verilog)和+ floatgenerics(对于VHDL)来指定。
将参数指定为floating后,可以使用vsim中的-g选项设置参数值。对参数值的后续更改仅需要使用新值重新调用vsim,并且不需要重新优化设计。
然而,需要权衡注意的一点是,这些参数值不会用于帮助优化设计以获得最佳run-time性能。因此,建议您仅在必要时谨慎使用此技术(例如,当优化的时间成本是总仿真运行时间的可测量百分比时)。如有必要,您可以使用多个参数值单独预优化设计,然后选择最好的一个在运行时使用即可。
Maintaining Consistency in Parameter Lists
许多SystemVerilog参数自然可以在概念上的“参数列表”中组合在一起。这些参数倾向于一起声明,并且在test environment中的许多地方使用。
对参数列表的任何更改(例如,添加新参数)通常需要仔细编辑多个不同文件中的多个不同类,并且是一个容易出错的过程。
可以使用的可选技术是创建一组宏,以减少错误的可能性并强制达到一致性。
【此处需一个表】
这些宏遵循最小化变化领域的重用理念。通过使用宏,有一个明确定义的位置可以在参数列表中进行更改。