UVM学习 DAY 1

221 阅读2分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路!


  1. uvm之工厂机制

工厂机制的概述

  • (工厂)factory机制是UVM的真正魅力所在。
  • 工厂机制也是软件设计模式(design pattern)

工厂机制的意义

  • UVM工厂的存在就是方便地替换验证环境中地实例或者注册了的类型,同时工厂的注册机制也带来了配置的灵活性。
  • 这里的实例或者类型替代,在UVM中称作覆盖(override),而被用来替换的对象或者类型,应该满足注册(registeration)和多态(polymorphism)的要求。
  • UVM的验证环境构成了可以分为两部分,一部分构成了环境的层次,这部分代码是通过uvm_component类完成,另外一部分构成了环境的属性(例如配置)和数据传输,这一部分通过uvm_object类完成。
  • 从类库地图可以看出,uvm_component类继承于uvm_object类,而这两个类也是进出工厂的主要模具和生产对象。
  • 之所以称为模具,是因为通过注册,可以利用工厂完成对象创建
  • 而之所以对象由工厂生产,也是利用了工厂生成模具可灵活替代的好处,这使得在不修改原有验证环境层次和验证包的同时,实现了对环境内部组件类型或者对象的覆盖。

工厂机制之uvm_component和uvm_object

  • uvm_component 和uvm_object将会伴随着整个UVM的学习
  • 参照SV模块学习中组件的概念,即验证环境的不动产,大致包含:
  1. generator
  2. stimulator
  3. monitor
  4. agent
  5. checker/reference model
  6. environment
  7. test
  • 这些组件在uvm_component的子类中均有对应的组件
  • SV中的非固定资产即那些TLM transaction,从generator流向stimulator的数据包,或者从monitor流向checker的数据包,而这些类在UVM中统一由uvm_object表示。

工厂机制之uvm_{component,object}的例化

  • 每一个uvm_{component,object}在例化的时候都应该给予一个名字(string)
  • "fullname"指的是component所处的完整层次结构
  • 在每个层次中例化的组件名称,应该独一无二(unique)
  • 创建component或者object的方法如下:
    创建uvm_component对象时,
    comp_type::type_id::create(string name,uvm_component parent)
    创建uvm_object时,
    object_type::type_id::create(string name);
    

工厂机制——创建

class comp1 extends uvm_component;  // 定义
	`uvm_component_utils(comp1)  // 注册
	function new(string name= "comp1",uvm_component parent = null);  // 构建new函数
		super.new(name,parent);
		$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);
		$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