
sv和UVM参数化类的相关介绍不多但实际使用起来与普通类有微小的差异无论是声明注册还是转换踩坑同时留做记录一、class1. 定义参数化的类注册时要专门的宏定义注册class m_agent#(int T0)extends uvm_agent; driver drv; monitor mon; sequencer sqr; uvm_component_param_utils(m_agent#(T)) //注册 endclass2. 声明例化声明和例化时都需要传参否则报错或传参失败class env extends uvm_env; m_agent#(0) agt0; //声明时传参 m_agent#(1) agt1; m_agent#(2) agt2; m_agent#(3) agt3; function void build_phase(uvm_phase phase); super.build_phase(phase); agt0 m_agent#(0)::type_id::create(agt0,this);//例化时传参 agt1 m_agent#(1)::type_id::create(agt0,this); agt2 m_agent#(2)::type_id::create(agt0,this); agt3 m_agent#(3)::type_id::create(agt0,this); endfunction endclass二、interface1.定义interfaceinterface inf #(parameter A90)( input clk, input rst );2.例化和传递inf #( .A(10) ) u_inf( .clk(clk), .rst(rst) ); initial begin uvm_config_db #(virtual inf #(A))::set(null, *agt*, bus, u_inf); end定义时参数化类需要默认参数否则编译时会报no override or default value错误不同类型的参数化类不能强制转换UVM的factory是不能重载parameterized class的原文链接如下UVM factory机制如何重载带参数的object - 知乎 (zhihu.com)