21 UVM printer

2023-12-29 18:20
文章标签 21 printer uvm

本文主要是介绍21 UVM printer,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

uvm_printer 类提供了以不同格式打印 uvm_objects 的灵活性。我们已经讨论了使用 `uvm_field_* 宏的 print() 方法,或者如果不使用 utils_begin/ end 宏,则编写 do_print() 方法。

UVM printer提供四种内置printer。

  1. uvm_printer
  2. uvm_table_printer
  3. uvm_tree_printer
  4. uvm_line_printer

1 uvm_printer hierarchy

2 UVM Printer Classes

3 UVM printer knobs

uvm_printer_knobs 类为所有printer类型的printer设置提供了额外的可行性。

uvm_printer_knobs knobs = new

uvm_printer_knobs 类中声明的一些变量。

size:控制是否打印字段的大小。

depth:表示打印对象时的递归深度。

4 UVM printer Methods

 

`include "uvm_macros.svh"
import uvm_pkg::*;typedef enum{RED, GREEN, BLUE} color_type;class temp_class extends uvm_object;rand bit [7:0] tmp_addr;rand bit [7:0] tmp_data;function new(string name = "temp_class");super.new(name);endfunction`uvm_object_utils_begin(temp_class)`uvm_field_int(tmp_addr, UVM_ALL_ON)`uvm_field_int(tmp_data, UVM_ALL_ON)`uvm_object_utils_end
endclassclass my_object extends uvm_object;rand int        value;string     names;rand color_type colors;rand byte       data[4];rand bit [7:0]  addr;rand temp_class tmp;`uvm_object_utils_begin(my_object)`uvm_field_int(value, UVM_ALL_ON)`uvm_field_string(names, UVM_ALL_ON)`uvm_field_enum(color_type, colors, UVM_ALL_ON)`uvm_field_sarray_int(data, UVM_ALL_ON)`uvm_field_int(addr, UVM_ALL_ON)`uvm_field_object(tmp, UVM_ALL_ON)`uvm_object_utils_endfunction new(string name = "my_object");super.new(name);tmp = new();this.names = "UVM";endfunction
endclassclass my_test extends uvm_test;`uvm_component_utils(my_test)my_object obj;bit packed_data_bits[];byte unsigned packed_data_bytes[];int unsigned packed_data_ints[];my_object unpack_obj;function new(string name = "my_test", uvm_component parent = null);super.new(name, parent);endfunctionfunction void build_phase(uvm_phase phase);super.build_phase(phase);obj = my_object::type_id::create("obj", this);assert(obj.randomize());`uvm_info(get_full_name(), "obj print without any argument", UVM_LOW);// Knob setting.uvm_default_printer.knobs.indent = 5;uvm_default_printer.knobs.hex_radix = "0x";obj.print();`uvm_info(get_full_name(), "obj print with uvm_default_table_printer argument", UVM_LOW);obj.print(uvm_default_table_printer);`uvm_info(get_full_name(), "obj print with uvm_default_tree_printer argument", UVM_LOW);obj.print(uvm_default_tree_printer);`uvm_info(get_full_name(), "obj print with uvm_default_line_printer argument", UVM_LOW);obj.print(uvm_default_line_printer);endfunction
endclassmodule tb_top;initial beginrun_test("my_test");end
endmodule

 output:

UVM_INFO testbench.sv(61) @ 0: uvm_test_top [uvm_test_top] obj print without any argument
--------------------------------------------------
Name                Type          Size  Value     
--------------------------------------------------
obj                 my_object     -     @349      value          integral      32    0x1f135537names          string        3     UVM       colors         color_type    32    GREEN     data           sa(integral)  4     -         [0]       integral      8     0x9f      [1]       integral      8     0x33      [2]       integral      8     0x12      [3]       integral      8     0x9c      addr           integral      8     0x2f      tmp            temp_class    -     @350      tmp_addr  integral      8     0x39      tmp_data  integral      8     0xbd      
--------------------------------------------------
UVM_INFO testbench.sv(68) @ 0: uvm_test_top [uvm_test_top] obj print with uvm_default_table_printer argument
--------------------------------------------------
Name                Type          Size  Value     
--------------------------------------------------
obj                 my_object     -     @349      value          integral      32    0x1f135537names          string        3     UVM       colors         color_type    32    GREEN     data           sa(integral)  4     -         [0]       integral      8     0x9f      [1]       integral      8     0x33      [2]       integral      8     0x12      [3]       integral      8     0x9c      addr           integral      8     0x2f      tmp            temp_class    -     @350      tmp_addr  integral      8     0x39      tmp_data  integral      8     0xbd      
--------------------------------------------------
UVM_INFO testbench.sv(70) @ 0: uvm_test_top [uvm_test_top] obj print with uvm_default_tree_printer argument
obj: (my_object@349) {value: 'h1f135537 names: UVM colors: GREEN data: {[0]: 'h9f [1]: 'h33 [2]: 'h12 [3]: 'h9c }addr: 'h2f tmp: (temp_class@350) {tmp_addr: 'h39 tmp_data: 'hbd }
}
UVM_INFO testbench.sv(72) @ 0: uvm_test_top [uvm_test_top] obj print with uvm_default_line_printer argument
obj: (my_object@349) { value: 'h1f135537  names: UVM  colors: GREEN  data: { [0]: 'h9f  [1]: 'h33  [2]: 'h12  [3]: 'h9c  } addr: 'h2f  tmp: (temp_class@350) { tmp_addr: 'h39  tmp_data: 'hbd  } } 

5 The print function defined in the uvm_object class

uvm_object 中的 print 函数实际上采用 uvm_printer 类类型作为参数。

function void uvm_object::print(uvm_printer printer=null);if (printer==null)printer = uvm_default_printer;if (printer == null)`uvm_error("NULLPRINTER","uvm_default_printer is null")$fwrite(printer.knobs.mcd,sprint(printer)); 
endfunction

这篇关于21 UVM printer的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/550292

相关文章

【LabVIEW学习篇 - 21】:DLL与API的调用

文章目录 DLL与API调用DLLAPIDLL的调用 DLL与API调用 LabVIEW虽然已经足够强大,但不同的语言在不同领域都有着自己的优势,为了强强联合,LabVIEW提供了强大的外部程序接口能力,包括DLL、CIN(C语言接口)、ActiveX、.NET、MATLAB等等。通过DLL可以使用户很方便地调用C、C++、C#、VB等编程语言写的程序以及windows自带的大

UVM:callback机制的意义和用法

1. 作用         Callback机制在UVM验证平台,最大用处就是为了提高验证平台的可重用性。在不创建复杂的OOP层次结构前提下,针对组件中的某些行为,在其之前后之后,内置一些函数,增加或者修改UVM组件的操作,增加新的功能,从而实现一个环境多个用例。此外还可以通过Callback机制构建异常的测试用例。 2. 使用步骤         (1)在UVM组件中内嵌callback函

【JavaScript】LeetCode:21-25

文章目录 21 最大子数组和22 合并区间23 轮转数组24 除自身以外数组的乘积25 缺失的第一个正数 21 最大子数组和 贪心 / 动态规划贪心:连续和(count)< 0时,放弃当前起点的连续和,将下一个数作为新起点,这里提供使用贪心算法解决本题的代码。动态规划:dp[i]:以nums[i]为结尾的最长连续子序列(子数组)和。 dp[i] = max(dp[i - 1]

react笔记 8-21 约束性 表单

1、约束性组件和非约束性组件 非约束性组件<input type="text" name="" defaultValue={this.state.msg}></input>这里他的value是用户输入的值 并没有执行操作 只是获取到了msg的值 用户输入不会改变数据非约束性组件需要使用defaultValue获取数据 否则会报错约束性组件<input type="text

[UVM]6.component driver monitor sequencer agent scoreboard env test

1.知识点回顾 (1)component需要有parent,因为参加构成组件,所以需要(继承); (2)object与component之间间隔report_object。 2.组件家族 (1)构建寄存器模型 :uvm_reg_predictor;激励器:driver/random_stimulus/sequencer_base/sequencer;监测器:monitor;

内存管理篇-21 虚拟内存管理:线性映射区

1.线性映射区的定义         这部分讲线性映射区的内容。一般老的嵌入式平台,它内存很小只有几百兆,都会直接把整个物理内存映射到线性映射区了,只有当物理内存大于1GB以上,线性映射区无法cover的时候就把剩下的放到高端内存。所以这个区域是最简单的。         线性映射区一般是指内核空间的某个部分,直接映射到低端内存的区域。并且他们之间是线性映射的。         PAGE_O

leetcode解题思路分析(三)15-21题

三数求和 最简单的做法就是三重循环判断: int length=nums.length;for(int i=0;i<length;i++){for(int j=i+1;j<length;j++){for(int k=j+1;k<length;k++){if(nums(i)+nums[j]+nums[k]==0){...}}} } 在此基础上,对第三次查找其实可以做优化:

第 21 章 DOM 操作表格及样式

第 21 章 DOM 操作表格及样式 1.操作表格 2.操作样式 DOM 在操作生成 HTML 上,还是比较简明的。不过,由于浏览器总是存在兼容和陷阱,导致最终的操作就不是那么简单方便了。本章主要了解一下 DOM 操作表格和样式的一些知识。 一.操作表格 标签是 HTML 中结构最为复杂的一个,我们可以通过 DOM 来创建生成它,或者 HTML DOM 来操作它。(PS:HTML DOM

2014年7月21日 你真的适合出国吗

郎教授说: 刘丁宁被港大辞退去读了北大,但是这个可能不是个案 郎教授在1980年那个时代,出国就做镀金 但是现在出过留学已经是一个大众化的市场了,不再是镀金了 从1978年到现在,2008年之前有105W人出国,回国比列25%,但是之后出过人数有185W,回国比列61% 也就是现在已经变成了一个大众的市场了,所以这是一个质量的问题 从2006年到现在,高中生

ftp 21端口被占用解决办法

最近发现 服务器 ftp 21端口被占用,在博客园里 找到这个方法不错,来分享下。   有时安装程序时,会出现XX端口被占用的情况,可以通过CMD命令查看什么程序占用 1. netstat -ano 查看相应端口对应程序的PID 例如: C:\>netstat -ano Active Connections Proto Local Address