[UVM]一文讀懂UVM field_automatio機制

一文讀懂UVM field_automatio機制

一、UVM中為什麼要引入field_automatio機制機制呢?

1、回想一下,通常我們需要怎麼定義一個transaction

class mac_transaction extends uvm_sequence_item;
  rand bit[47:0]     dmac;
  rand bit[47:0]     smac;
  rand bit[15:0]     eth_type;
  rand byte          pload[];
  rand bit[31:0]     crc;
endclass
  • 注意:這裡的每個成員變量都要用rand修飾。

2、現在如果我們需要看transaction中的成員變量,就需要寫一個display函數,把每個成員變量的值打印出來

function void print();
  $display(“dmac=%0h”, dmac);
  $display(“smac=%0h”, smac);
  $display(“eth_type=%0h”, eth_type);

  for(int i = 0; I < pload.size; i++) begin
    $display(“pload[%0d]=%0h”, i, pload[i]);
  end
  $display(“crc=%0h”, crc);
endfunction

3、假如現在我們要比較Reference Model和Monitor採回來的兩個transaction是否一致,就需要定義一個compare函數

function bit compare(mac_transaction tr);
  if(this.dmac != tr.dmac)
    return 0;
  else if(this.smac != tr.dmac)
    return 0;
  else if(this.eth_type != tr.eth_type)
    return 0;
  else if(this.crc != tr.crc)
    return 0;
  else if(this.pload.size != tr.pload.size)
    return 0;
  else begin
    for(int i = 0; i < this.pload.size; i++) begin
      if(this.pload[i] != tr.pload[i])
        return 0;
    end
  end
  return 1;
endfunction

        可以看出,这样写起来将会是相当费时间的。而且对于这些常用的操作,如果transaction的定义换一下,那么这些所有的函数或任务就都需要重新写,这种代价是相当大的。仔细思考一下,这些事情的通性就是简单,重复,琐碎。那么有没有方法简化一下呢?答案是有的,这就是field_automation机制。

二、field_automation機制的使用

1、UVM中使用field_automation机制来完成这些事情。

  • 如对于上面的transaction,使用field_automation机制之后,就可以如下定义:
class mac_transaction extends uvm_sequence_item;
  rand bit[47:0] dmac;
  rand bit[47:0] smac;
  rand bit[15:0] eth_type;
  rand byte pload[];
  rand bit[31:0] crc;

  `uvm_object_utils_begin(mac_transaction)
    `uvm_field_int(dmac, UVM_ALL_ON)
    `uvm_field_int(smac, UVM_ALL_ON)
    `uvm_field_int(eth_type, UVM_ALL_ON)
    `uvm_field_array_int(pload, UVM_ALL_ON)
    `uvm_field_int(crc, UVM_ALL_ON)
  `uvm_object_utils_end
endclass

2、事实上,这其实就是factory机制的实现。

3、`uvm_field_*系列宏共有如下几种:

`define uvm_field_int(ARG,FLAG)
`define uvm_field_real(ARG,FLAG)
`define uvm_field_enum(T,ARG,FLAG)
`define uvm_field_object(ARG,FLAG)
`define uvm_field_event(ARG,FLAG)
`define uvm_field_string(ARG,FLAG)
`define uvm_field_array_enum(ARG,FLAG)
`define uvm_field_array_int(ARG,FLAG)
`define uvm_field_sarray_int(ARG,FLAG)
`define uvm_field_sarray_enum(ARG,FLAG)
`define uvm_field_array_object(ARG,FLAG)
`define uvm_field_sarray_object(ARG,FLAG)
`define uvm_field_array_string(ARG,FLAG)
`define uvm_field_sarray_string(ARG,FLAG)
`define uvm_field_queue_enum(ARG,FLAG)
`define uvm_field_queue_int(ARG,FLAG)
`define uvm_field_queue_object(ARG,FLAG)
`define uvm_field_queue_string(ARG,FLAG)
`define uvm_field_aa_int_string(ARG, FLAG)
`define uvm_field_aa_string_string(ARG, FLAG)
`define uvm_field_aa_object_string(ARG, FLAG)
`define uvm_field_aa_int_int(ARG, FLAG)
`define uvm_field_aa_int_int(ARG, FLAG)
`define uvm_field_aa_int_int_unsigned(ARG, FLAG)
`define uvm_field_aa_int_integer(ARG, FLAG)
`define uvm_field_aa_int_integer_unsigned(ARG, FLAG)
`define uvm_field_aa_int_byte(ARG, FLAG)
`define uvm_field_aa_int_byte_unsigned(ARG, FLAG)
`define uvm_field_aa_int_shortint(ARG, FLAG)
`define uvm_field_aa_int_shortint_unsigned(ARG, FLAG)
`define uvm_field_aa_int_longint(ARG, FLAG)
`define uvm_field_aa_int_longint_unsigned(ARG, FLAG)
`define uvm_field_aa_string_int(ARG, FLAG)
`define uvm_field_aa_object_int(ARG, FLAG)
  • Note:
  1. `uvm_field_array_A表示的是动态数组,A表示动态数组中存放的内容的类型
  2. `uvm_field_sarray_A表示的是静态数组,A表示此静态数组中存放的内容的类型
  3. `uvm_field_queue_A表示的是队列,A表示此队列中存放的内容的类型
  4. `uvm_field_aa_A_B表示的是联合数组,其中的B表示联合数组的索引类型,A表示联合数组中存放的内容的类型
  5. 关于宏的参数,其中的ARG表示在transaction中定义的变量的名字,FLAG表示排除某些字段

4、field_automation機制都做了哪些事情?

  • 當引入field_automation機制之後,我們就可以使用博文“[UVM]UVM Sequence item Methods”(Link)中介紹的item Methods了。

  • 5
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

元直数字电路验证

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值