ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

IC验证“UVM验证平台加入factory机制“(六)

2020-12-08 12:01:07  阅读:218  来源: 互联网

标签:验证 driver factory UVM phase main my uvm


加入factory机制 上一节《IC验证"一个简单的UVM验证平台"是如何搭建的(五)》给出了一个只有driver、使用UVM搭建的验证平台。严格来说这根本就不算是UVM验证平台,因为UVM的特性几乎一 点都没有用到。像上节中my_driver的实例化及drv.main_phase的显式调用,即使不使用UVM,只使用简单的SystemVerilog也可以完 成。本节将会为读者展示在初学者看来感觉最神奇的一点:自动创建一个类的实例并调用其中的函数(function)和任务 (task)。

要使用这个功能,需要引入UVM的factory机制:

文件:src/ch2/section2.2/2.2.2/my_driver.sv 
3 class my_driver extends uvm_driver; 
4
5 `uvm_component_utils(my_driver) 
6 function new(string name = "my_driver", uvm_component parent = null); 
7 super.new(name, parent); 
8 `uvm_info("my_driver", "new is called", UVM_LOW); 
9 endfunction 
10 extern virtual task main_phase(uvm_phase phase); 
11 endclass 
12
13 task my_driver::main_phase(uvm_phase phase); 
14 `uvm_info("my_driver", "main_phase is called", UVM_LOW); 
15 top_tb.rxd <= 8'b0; 
16 top_tb.rx_dv <= 1'b0; 
17 while(!top_tb.rst_n) 
18 @(posedge top_tb.clk); 
19 for(int i = 0; i < 256; i++)begin 
20 @(posedge top_tb.clk); 
21 top_tb.rxd <= $urandom_range(0, 255); 
22 top_tb.rx_dv <= 1'b1; 
23 `uvm_info("my_driver", "data is drived", UVM_LOW); 
24 end 
25 @(posedge top_tb.clk); 
26 top_tb.rx_dv <= 1'b0; 
27 endtask 

factory机制的实现被集成在了一个宏中:uvm_component_utils。这个宏所做的事情非常多,其中之一就是将my_driver登记在 UVM内部的一张表中,这张表是factory功能实现的基础。只要在定义一个新的类时使用这个宏,就相当于把这个类注册到了这张 表中。

那么factory机制到底是什么?

这个宏还做了哪些事情呢?

在给driver中加入factory机制后,还需要对top_tb做一些改动:

文件:src/ch2/section2.2/2.2.2/top_tb.sv 
7 module top_tb; 
…
36 initial begin 
37 run_test("my_driver"); 
38 end 
39
40 endmodule 

这里使用一个run_test语句替换掉了代码清单2-6中第23到28行的my_driver实例化及main_phase的显式调用。运行这个新的验证 平台,会输出如下语句:

new is called
  main_phased is called

一个run_test语句会创建一个my_driver的实例,并且会自动调用my_driver的main_phase。仔细观察run_test语句,会发现传递给 它的是一个字符串。UVM根据这个字符串创建了其所代表类的一个实例。如果没有UVM,读者自己能够实现同样的功能吗?

根据类名创建一个类的实例,这是uvm_component_utils宏所带来的效果,同时也是factory机制给读者的最初印象。只有在类 定义时声明了这个宏,才能使用这个功能。所以从某种程度上来说,这个宏起到了注册的作用。只有经过注册的类,才能使用这 个功能,否则根本不能使用。请记住一点:所有派生自uvm_component及其派生类的类都应该使用uvm_component_utils宏注册。

除了根据一个字符串创建类的实例外,上述代码中另外一个神奇的地方是main_phase被自动调用了。在UVM验证平台中,只 要一个类使用uvm_component_utils注册且此类被实例化了,那么这个类的main_phase就会自动被调用。这也就是为什么上一节中 会强调实现一个driver等于实现其main_phase。所以,在driver中,最重要的就是实现main_phase。

上面的例子中,只输出到“main_phase is called”。令人沮丧的是,根本没有输出“data is drived”,而按照预期,它应该输出256 次。

关于这个问题,牵涉UVM的objection机制。

通知:

本章更新后将持续更新更新…

如果有任何疑问请在下方评论…

标签:验证,driver,factory,UVM,phase,main,my,uvm
来源: https://blog.csdn.net/weixin_52955333/article/details/110869633

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有