UVM模型(五)之factory机制

UVM模型(五)之factory机制

factory其实就是一个宏,当设计set_override等操作时,才有必要去理解factory机制的原理。factory机制更多的是体现在内部编程应用上,它为众多其他机制的实现提供了可能。换句话说,factory机制是UVM的内功,那么UVM的外功自然就是field automation机制。

1.UVM认证

在定义一个类时,UVM强烈建议使用uvm_component_utils或uvm_object_utils宏来注册。UVM就知道我们定义了一个类:

class A extends uvm_component;

`uvm_component_utils(A)

....

endclass

当使用上述代码注册A后,那么要创建一个A的实例可以这样做:

A a;

a = A::type_id::create(“a”,this);

假设前面你的A没有使用uvm_component_utils实例化,那么A实例化只要使用这种方式:

A a;

a = new(“a”,this);

这种想法看上去比上一种法子更简单一些,不过上一种法子才是UVM推荐的。使用UVM认证的方式实例化,可以使用UVM的众多功能,而后者不行。

2.override功能

假设我们已经自己定义了一个my_driver,在跑80%的case的时候,这个driver是足够使用的,但是在剩余的20%的case中,我们需要对my_driver的行为做出某些改变,这时就可以用到override功能。使用override功能的第一步要先从my_driver派生出一个类,把这个类的行为定义好:

class new_driver extends my_driver;

...

`uvm_component_utils(new_driver)

endclass

之后,在具体的case的build_case中,调用override相关函数:

class case_x extends base_test;

function void build_phase(uvm_phase phase);

...

set_type_override_by_type(my_driver::get_type(),new driver::get_type());

endfunction

endclass

经过上述过程之后,那么在跑case_x的时候,系统中运行的my_driver就是new_driver类型的,其行为是new_driver的行为。不过这有一个前提,那就是my_driver在他的agent中实例化的时候,要使用factory的方式实例化。

class my_agent;

my_driver drv;

function void build_phase(uvm_phase phase);

...

drv=my_driver::type_id::create(“drv”,this);

endfunction

endclass

假如不使用上面的这种写法,而是使用drv=new(“drv”,this)的写法进行实例化,那么override功能是不能实现的。

3.factory的本质:重写了new函数

有了factory之后,除了可以使用类名创建实例之外,还可以通过一个代表类名字的字符串来进行实例化,除此之外还可以进行override功能。所以从本质上看,factory机制其实是对systemverilog中new函数的重载。因为这个原始的new函数实在是太简单了,功能太少,经过factory机制的改良之后,进行实例化的方法就多了很多。

原文发布于微信公众号 - 瓜大三哥(xiguazai_tortoise)

原文发表时间:2017-10-17

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏葡萄城控件技术团队

C#开发人员应该知道的13件事情

本文讲述了C#开发人员应该了解到的13件事情,希望对C#开发人员有所帮助。 1. 开发过程 开发过程是错误和缺陷开始的地方。使用工具可以帮助你在发布之后,解决掉...

2219
来自专栏人工智能

机器学习如何从 Python 2 迁移到 Python 3

关键时刻,第一时间送达! ? 本文经授权转自人工智能头条。 Python 已经成为机器学习及其他科学领域中的主流语言。它不但与多种深度学习框架兼容,而且还包含优...

3026
来自专栏鸿的学习笔记

聊聊一些垃圾回收算法

不是所有的GC都是完美的,每一个GC算法的选用都有其背后的原因。而我们选择GC算法,有四个评价标准:吞吐量(也就是说,在单位时间内你回收的对象(这里是指通过应用...

762
来自专栏新智元

Go 2.0发布在即,程序员有太多话要说

Go语言的开发者正着手准备开发2.0版本,并从以下三个方面发布了初步的设计方案(非官方正式版),以供社区开展讨论:

6241
来自专栏程序人生

Promise: 给我一个承诺,我还你一个承诺

处理concurrent programming,除了threading/multi-processing外,各家语言都有自己的绝活:erlang/elixir...

2904
来自专栏ThoughtWorks

TW洞见〡getter和setter的那些事

文章作者来自ThoughtWorks:佟达 相信每一个以Java或者C++作为编程入门语言的程序员,一定会记得一条金科玉律:字段(Filed)要声明成priv...

3116
来自专栏我的技术专栏

Java多线程编程—锁优化

1507
来自专栏玄魂工作室

Hacker基础之Python篇:一、环境安装和基础知识

0x01. 前言 emmmmmmm...你只需知道这是一门用途很广的语言,上到大数据AI,下到Linux运维,都可以使用Python,当然,黑客也用Pyth...

2926
来自专栏工科狗和生物喵

【计算机本科补全计划】指令:计算机的语言(MIPS) Part3

正文之前 今天学的很尴尬,因为有事情,而且新认识了两个计算机学院的保研大佬,不得不感叹我找的导师之强,第一个去上交的,是被金老师推荐去的,听说是跟了目前亚洲第一...

3218
来自专栏做全栈攻城狮

C#入门教程(二)–C#常用快捷键、变量、类型转换-打造C#

C#入门教程(一)–.Net平台技术介绍、C#语言及开发工具介绍-打造C#学习教程

1365

扫码关注云+社区

领取腾讯云代金券