提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
文章目录
前言
主要学习内容:
- 工厂的注册、创建和覆盖机制
- 域的自动化以及uvm_object的常用方法
- phase机制
- config机制
- 消息管理
提示:以下是本篇文章正文内容,下面案例可供参考
一、工厂的注册、创建和覆盖机制
uvm只有两种注册宏:
- `uvm_object_utils(T)
- `uvm_component_utils(T)
UVM所有的类都继承于uvm_object或uvm_component类因此只需要两种注册宏。
添加factory_mechanism.sv,编译,输入仿真命令:
vsim -novopt -classdebug +UVM_TESTNAME=object_create work.factory_mechanism
+UVM_TESTNAME=<test_name>它的作用等同于lab0中的run_test(“test_name”),在仿真命令添加测试用例便于后续修改。
上述命令就是运行测试object_create

1.1完成类型创建
使用不同的方法完成对t1、t2、t3、t4uvm_object类的对象的创建
- 方法一:
new(string name)
- 方法二:
uvm_object::type_id::create(string name)
👻该方法第一个参数是实例名称,创建uvm_object类型只有一个参数
- 方法三:
uvm_factory.create_object_by_name(uvm_object_wrapper requested_type,,string parent_inst_path="", string name)
👻此方法是直接通过工厂调用第一个参数指的是创建并返回的请求创建对象的类型(指导手册上写的the requested_type is a handle to the type’s proxy object不太理解这个 type’s proxy是什么意思),必须是uvm_object的子类,在这里指的是trans类型,通过trans::get_type()得到;第二个参数是结构层次路径,用于索引实例覆盖,通过调用parent(这里不是指父类)方法即uvm_componnet::get_full_name()方法来得到;第三个参数就是实例名称。
- 方法四:
uvm_component.create_object (string requested_type_name,string name="");
👻该方法使用的是uvm_component类自带的方法,可以创建uvm_object类型的对象,它实际上也是间接调用工厂创建对象,因此等同于方法三。第一个参数是请求创建对象类型的名称,第二个参数是实例名。
需要注意的是方法三、四返回的句柄类型。尝试编译可以发现报错信息,赋值类型不匹配

【类型创建的都是uvm_object类型的句柄,不能直接赋值给trans类型。需要进行类型转换,$cast即可作为函数调用也可以作为任务调用,作为函数调用时有int类型0/1的返回值,因此需要void’()使得函数转换成无返回值类型才可以单独调用,同时强制类型转换是隐性的赋值,并不是单纯的转换类型就结束了】
使用不同的方法完成对u1、u2、u3、u4uvm_component类的对象的创建,方法同上。
需要注意的是创建uvm_componnet类型时方法三还有一个parent参数。

结果:

object_create测试字符串name没有传递进去?不知道为什么打印信息是默认的name,但是trans变量类型创建成功








616

被折叠的 条评论
为什么被折叠?



