| |
Factory Coding Convention 2: Constructor Defaults
uvm_component和uvm_object构造函数是virtual methods,这意味着用户必须遵循其原型模板。为了在build phase期间支持延迟构造,factory构造函数应该包含构造函数参数的默认值。这允许使用默认值在factory内部构建factory注册类,然后将类属性重新分配给通过uvm_component_registry包装类的create method传递的参数。 components and objects的默认值不同:
// For a component:
class my_component extends uvm_component;
function new(string name = "my_component", uvm_component parent = null);
super.new(name, parent);
endfunction
// For an object
class my_item extends uvm_sequence_item;
function new(string name = "my_item");
super.new(name);
endfunction
Factory Coding Convention 3: Component and Object creation
使用uvm_component_registry的create method在build phase期间创建测试平台组件。首先构造该类,然后在正确分配名称和父参数后,将指针指向该类的指针到其测试平台中的声明句柄。对于components来说,构建过程是自上而下的,它允许更高层次的组件和配置来控制实际构建的内容。
根据需要创建object类,同样使用create method。
以下代码片段说明了如何完成此操作:
class env extends uvm_env;
my_component m_my_component;
my_param_component #(.ADDR_WIDTH(32), .DATA_WIDTH(32)) m_my_p_component;
// Constructor & registration macro left out
// Component and Parameterized Component create examples
function void build_phase( uvm_phase phase );
m_my_component = my_component::type_id::create("m_my_component", this);
m_my_p_component = my_param_component #(32, 32)::type_id::create("m_my_p_component", this);
endfunction: build
task run_phase( uvm_phase phase );
my_seq test_seq;
my_param_seq #(.ADDR_WIDTH(32), .DATA_WIDTH(32)) p_test_seq;
// Object and parameterised ojbect create examples
test_seq = my_seq::type_id::create("test_seq");
p_test_seq = my_param_seq #(32,32)::type_id::create("p_test_seq");
//....
endtask: run【应该是笔误:应为"endtask: run_phase"】