在2.3.3节中引入my_mointor时,在my_transaction中加入了my_print函数;

在2.3.5节中引入reference model时,加入了my_copy函数;

在2.3.6节引入scoreboard时,加入了my_compare函数。

上述三个函数虽然各自不同,但是对于不同的transaction来说,都是类似的:它们都需要逐字段地对transaction进行某些操作。

那么有没有某种简单的方法,可以通过定义某些规则自动实现这三个函数呢?答案是肯定的。这就是UVM中的field_automation机制,使用uvm_field系列宏实现:


代码清单 2-52
文件:src/ch2/section2.3/2.3.7/my_transaction.sv
  4 class my_transaction extends uvm_sequence_item;
  5
  6   rand bit[47:0] dmac;
  7   rand bit[47:0] smac;
  8   rand bit[15:0] ether_type;
  9   rand byte      pload[];
 10   rand bit[31:0] crc;
 …
 25   `uvm_object_utils_begin(my_transaction)
 26     `uvm_field_int(dmac, UVM_ALL_ON)
 27     `uvm_field_int(smac, UVM_ALL_ON)
 28     `uvm_field_int(ether_type, UVM_ALL_ON)
 29     `uvm_field_array_int(pload, UVM_ALL_ON)
 30     `uvm_field_int(crc, UVM_ALL_ON)
 31   `uvm_object_utils_end
 …
 37 endclass


这里使用uvm_object_utils_begin和uvm_object_utils_end来实现my_transaction的factory注册,在这两个宏中间,使用uvm_field宏注册所有字段。uvm_field系列宏随着transaction成员变量的不同而不同,如上面的定义中出现了针对bit类型的uvm_field_int及针对byte类型动态数组的uvm_field_array_int。

3.3.1节列出了所有的uvm_field系列宏。

当使用上述宏注册之后,可以直接调用copy、compare、print等函数,而无需自己定义。这极大地简化了验证平台的搭建,提高了效率:


代码清单 2-53
文件:src/ch2/section2.3/2.3.7/my_model.sv
 26 task my_model::main_phase(uvm_phase phase);
 27   my_transaction tr;
 28   my_transaction new_tr;
 29   super.main_phase(phase);
 30   while(1) begin
 31     port.get(tr);
 32     new_tr = new("new_tr");
 33     new_tr.copy(tr);
 34     `uvm_info("my_model", "get one transaction, copy and print it:", UVM_LOW)
 35     new_tr.print();
 36     ap.write(new_tr);
 37   end
 38 endtask



代码清单 2-54
文件:src/ch2/section2.3/2.3.7/my_scoreboard.sv

 34      while (1) begin
 35        act_port.get(get_actual);
 36        if(expect_queue.size() > 0) begin
 37          tmp_tran = expect_queue.pop_front();
 38          result = get_actual.compare(tmp_tran);
 39          if(result) begin
 40            `uvm_info("my_scoreboard", "Compare SUCCESSFULLY", UVM_LOW);
 41          end


引入field_automation机制的另外一大好处是简化了driver和monitor。在2.3.1节及2.3.3节中,my_driver的drv_one_pkt任务和my_monitor的collect_one_pkt任务代码很长,但是几乎都是一些重复性的代码。使用field_automation机制后,drv_one_pkt任务可以简化为:


代码清单 2-55
文件:src/ch2/section2.3/2.3.7/my_driver.sv
 38 task my_driver::drive_one_pkt(my_transaction tr);
 39   byte unsigned data_q[];
 40   int  data_size;
 41
 42   data_size = tr.pack_bytes(data_q) / 8;
 43   `uvm_info("my_driver", "begin to drive one pkt", UVM_LOW);
 44   repeat(3) @(posedge vif.clk);
 45   for ( int i = 0; i < data_size; i++ ) begin
 46      @(posedge vif.clk);
 47      vif.valid <= 1'b1;
 48      vif.data <= data_q[i];
 49   end
 50
 51   @(posedge vif.clk);
 52   vif.valid <= 1'b0;
 53   `uvm_info("my_driver", "end drive one pkt", UVM_LOW);
 54 endtask


第42行调用pack_bytes将tr中所有的字段变成byte流放入data_q中,在2.3.1节中是手工地将所有字段放入data_q中的。

pack_bytes极大地减少了代码量。在把所有的字段变成byte流放入data_q中时,字段按照uvm_field系列宏书写的顺序排列。在上述代码中是先放入dmac,再依次放入smac、ether_type、pload、crc。假如my_transaction定义时各个字段的顺序如下:


代码清单 2-56
`uvm_object_utils_begin(my_transaction)
   `uvm_field_int(smac, UVM_ALL_ON)
   `uvm_field_int(dmac, UVM_ALL_ON)
   `uvm_field_int(ether_type, UVM_ALL_ON)
   `uvm_field_array_int(pload, UVM_ALL_ON)
   `uvm_field_int(crc, UVM_ALL_ON)
`uvm_object_utils_end


那么将会先放入smac,再依次放入dmac、ether_type、pload、crc。

my_monitor的collect_one_pkt可以简化成:


代码清单 2-57
文件:src/ch2/section2.3/2.3.7/my_monitor.sv
 34 task my_monitor::collect_one_pkt(my_transaction tr);
 35   byte unsigned data_q[$];
 36   byte unsigned data_array[];
 37   logic [7:0] data;
 38   logic valid = 0;
 39   int data_size;
 …
 46   `uvm_info("my_monitor", "begin to collect one pkt", UVM_LOW);
 47   while(vif.valid) begin
 48      data_q.push_back(vif.data);
 49      @(posedge vif.clk);
 50   end
 51   data_size  = data_q.size();
 52   data_array = new[data_size];
 53   for ( int i = 0; i < data_size; i++ ) begin
 54      data_array[i] = data_q[i];
 55   end
 56   tr.pload = new[data_size - 18]; //da sa, e_type, crc
 57   data_size = tr.unpack_bytes(data_array) / 8;
 58   `uvm_info("my_monitor", "end collect one pkt", UVM_LOW);
 59 endtask


这里使用unpack_bytes函数将data_q中的byte流转换成tr中的各个字段。unpack_bytes函数的输入参数必须是一个动态数组,所以需要先把收集到的、放在data_q中的数据复制到一个动态数组中。由于tr中的pload是一个动态数组,所以需要在调用unpack_bytes之前指定其大小,这样unpack_bytes函数才能正常工作。

转载于:https://www.cnblogs.com/YINBin/p/6915664.html

*2-3-7-加入field_automation机制相关推荐

  1. UVM学习笔记(一)工厂、phase机制、config

    目录 一.工厂机制 1.1 使用步骤 1.2 um_coreservice_t类 1.3 factory创建component.object实例的方法 1.4 UVM创建component.objec ...

  2. uvm 形式验证_UVM基础

    uvm_component与uvm_object 1. 几乎所有的类都派生于uvm_object,包括uvm_component. uvm_component有两大特性是uvm_object所没有的: ...

  3. UVM jelly_bean

    jelly_bean 源代码 https://github.com/cluelogic/uvm-tutorial-for-candy-lovers 子弹 transaction // 首先建立一个tr ...

  4. uvm pack/unpack

    packing: 将一组数据(item中的某些域 da sa payload)打包到一个比特数组(bit流)中. unpacking:将一个比特数组拆解成一组数据(item中的某些域 da sa pa ...

  5. UVM Object

    目录 Base Classes UVM utility & field macros UVM Object Print UVM Object Copy/Clone UVM Object com ...

  6. UVM学习整理——UVM结构(component派生类)

    目录 二.UVM结构 2.1UVM组件 2.1.1uvm_driver 2.1.2uvm_monitor 2.1.3uvm_sequencer 2.1.4uvm_agent 2.1.5uvm_scor ...

  7. 诙谐有趣的《UVM实战》笔记——第二章 一个简单的UVM验证平台

    前言 某天白天在地铁上听鬼故事,结果晚上要睡觉时,故事里的情节都历历在目,给我鸡皮疙瘩起的~ 不过我倒是没有吓得睡不着,而是转念一想,为啥我学知识忘得很快,随便听的鬼故事却记得这么清楚咧? 那如果能像 ...

  8. IC验证——UVM学习

    UVM是一种基于Systemverilog的验证方法学,其特征是提供用于基本验证结构和可调用的基础类库,可让验证工程师快速搭建可靠的验证框架.UVM自定义的框架构建类和测试类能够帮助验证师减轻环境构建 ...

  9. 【UVM】-- UVM调试

    1.引入factory机制: 在要注册类开头配置: `uvm_component_utils(className);注册类 在top中可以直接运行run_test("className&qu ...

最新文章

  1. 三分钟破解无线网——无线网络安全攻防
  2. python入门代码示例-Python入门简单的静态网页爬虫3.0 (爬虫的示例代码)
  3. 阿里来了位技术新童鞋,一秒K.O八位律师
  4. 20145238-荆玉茗 《信息安全系统设计基础》第7周学习总结
  5. centos7硬盘分区
  6. python函数代码_如何显示Python函数的代码?
  7. 演示数据块整理(合并)的效果
  8. win11如何自动启用禁用设置时区 windows11自动启用禁用设置时区的步骤方法
  9. “21天好习惯”第一期-9
  10. 实战:考虑性能--Solr索引的schema设计
  11. linux 每日学一点《将LINUX变成路由器》
  12. labview计算机论文,毕业论文:基于Labview的信号发生器设计
  13. 简述er图的作用_ER图的理解
  14. 2022-2028年中国直线电机行业市场现状分析及投资前景评估报告
  15. Unity 游戏数据的存档读档,数据加密与解密
  16. java计算机毕业设计网上花店源码+系统+mysql数据库+LW文档+部署文件
  17. Ubuntu16.04搜索不到wifi
  18. 改进排队买票多线程问题
  19. 利用Adobe Acrobat 7.0 Professional 自带的导出图片的功能(转)
  20. static变量会被垃圾回收吗_来自灵魂的拷问,你会扔垃圾了吗?

热门文章

  1. VMware+Win7+windbg 双机调试
  2. Objective-C NSString字符串操作总结
  3. Matlab C++混合编程 在VisualStudio下的编程 使用了Opencv库
  4. Linux中的进程组及会话
  5. github生成密钥
  6. php批量打印快递单,excel怎么利用vba实现批量套打快递单批量打印单据?
  7. 3分钟了解带参数的main函数
  8. STL-hasmap源码
  9. 关于数据库与LoaderManager的联合使用,节流???。。。。。
  10. matplotlib 旋转刻度_Matplotlib数据可视化:文本与坐标轴