UVM学习笔记(一)
UVM(Universal verification methodology)简介
所有的验证方法学服务目的都在于提供一些可以重用的类来减轻在项目之间水平复用和垂直复用的工作量
UVM类库地图 ---> P260
类库地图的分类:
- 核心基类
- 工厂(factory)类
- 事务(transaction)和序列(sequence)
- 结构创建(structure creation)类
- 环境组件(environment component)类
- 通信管道(channel)类
- 信息报告(message report)类
- 寄存器模型类
- 线程同步(thread synchronization)类
- 事务接口(transaction interface)类
工厂机制
概述
工厂机制也是软件的一种典型设计模式(design pattern)
工厂的意义
- UVM工厂的存在就是为了更方便地替换验证环境中的实例或者注册了的类型,同时工厂的注册机制也带来了配置的灵活性
- 实例或者类型替代在UVM中称作覆盖(override),而被用来替换的对象或者类型,应该满足注册(registration)和多态(polymorphism)的要求
- UVM验证环境构成可以分为两部分,一部分构成了环境的层次,这部分代码是通过uvm_component类完成,另外一部分构成了环境的属性(配置)和数据传输,这一部分通过uvm_object类完成
- uvm_component类继承于uvm_object类,而这两种类也是进出工厂的主要模具和生产对象
- 模具:通过注册,可以利用工厂完成对象创建
- 对象由工厂生产,也是利用了工厂生产模具可灵活替代的好处,使得在不修改原有验证层次和验证包的同时,实现了对环境内部组件类型或者对象的覆盖
uvm_{component,object}的例化
创建uvm_component对象时,
comp_type::type_id::create(string name, uvm_component parent);
创建uvm_object对象时,
object_type::type_id::create(string name);
工厂提供的便利——创建(create)
一般来说,运用factory的步骤可分为:
- 将类注册到工厂
- 在例化前设置覆盖对象和类型(可选的)
- 对象创建
在两种类comp1和obj1的注册中,分别使用了UVM宏 `uvm_component_utils和`uvm_object_utils
宏做的事情就是将类注册到factory中,在解释注册函数之前,我们需要懂得在整个仿真中,factory是独有的,即有且只有一个,这保证了所有类的注册都在一个“机构”中
class comp1 extends uvm_component; `uvm_component_utils(comp1) //将对象已经注册在工厂中 function new(string name="comp1", umv_component parent=null); super.new(name,parent); //继承了父类的new $display($sformatf(“%s is created”,name)); endfunction: new function void build_phase(uvm_phase phase); super.build_phase(phase); endfunction: build_phase endclass class obj1 extends uvm_object; `uvm_object_utils(obj1) //将对象已经注册在工厂中 function new(string name="obj1"); super.new(name,parent); //继承了父类的new $display($sformatf(“%s is created”,name)); endfunction: new endclass comp1 c1, c2; obj1 o1, o2; initial begin c1 = new("c1"); o1 = new("o1"); c2 = comp1::type_id::create("c2", null); o2 = obj1::type_id::create("o2"); end
浙公网安备 33010602011771号