【UVM 1.2】宏uvm_field_aa_object_int的UVM_COMPARE相关代码存在问题

【UVM 1.2】宏uvm_field_aa_object_int的UVM_COMPARE相关代码存在问题

在源码uvm-1.2\src\macros\uvm_object_defines.svh中Line:2392调用`M_UVM_FIELD_DATA_AA_object_int宏。如下图所示:

在这里插入图片描述

`M_UVM_FIELD_DATA_AA_object_int用于根据FLAG设置aa_object_int类型的field与compare,copy,print相关的操作。其中在UVM_COMPARE case部分,第3066行存在问题,如下图所示:

在这里插入图片描述

foreach语句遍历以int类型为key的object类型关联数组,索引_key__从第一个存在key-value pair的索引开始,但是lhs却是lhs=ARG[key__]; 该索引是key__在3047行定义并一直保持默认初始值0,并不是foreach语句使用的索引_key__!!!这将导致UVM_COMPARE部分的逻辑为:被比较的关联数组的所有元素均与调用比较的关联数组的0索引位置上的值比较。下面的例子将说明上述问题:

module top;
  import uvm_pkg::*;
  
  class my_object extends uvm_object;
    function new(string name = "my_object");
      super.new(name);
    endfunction
  endclass

  class my_transaction extends uvm_sequence_item;
    my_object asc_array_comp [int];
    `uvm_object_utils_begin(my_transaction)
      `uvm_field_aa_object_int(asc_array_comp, UVM_DEFAULT)
    `uvm_object_utils_end
      
    function new(string name = "my_transaction");
      super.new(name);
    endfunction

  endclass

  class my_agent extends uvm_agent;
    `uvm_component_utils(my_agent)

    my_transaction tr, new_tr_1;
    my_object my_obj_inst, my_obj_inst_1;
    bit compare_ret;
    
    function new(string name = "my_component", uvm_component parent = null);
      super.new(name, parent);
    endfunction

    task main_phase(uvm_phase phase);
      tr = new("tr");
      new_tr_1 = new("new_tr_1");
      my_obj_inst = new("my_obj_inst");
      my_obj_inst_1 = new("my_obj_inst_1");
        
      tr.asc_array_comp[0] = my_obj_inst;
      tr.asc_array_comp[1] = my_obj_inst_1;
      
      new_tr_1.asc_array_comp[0] = my_obj_inst;
      new_tr_1.asc_array_comp[1] = my_obj_inst;

      compare_ret = tr.compare(new_tr_1);
      $display("compare return is %0b", compare_ret);
    endtask

  endclass

  // UVM test
  class test extends uvm_test;
    `uvm_component_utils(test)
    my_agent agent;
    function new(string name = "test", uvm_component parent = null);
      super.new(name, parent);
    endfunction
    function void build_phase(uvm_phase phase);
      agent = my_agent::type_id::create("my_agent", this);
    endfunction
  endclass

  //watchdog
  initial begin
    #10000;
    $display("%0t: %0s", $time,"TIMEOUT, Terminate simulation!");
    $display("TEST FAILED");
    $finish;
  end

  initial begin
    //run throughout test
    run_test("test");
    $display("test finish.");
  end

endmodule

该程序的该代码段可以明显看出trnew_tr_1不相同:

      tr.asc_array_comp[0] = my_obj_inst;
      tr.asc_array_comp[1] = my_obj_inst_1;
      
      new_tr_1.asc_array_comp[0] = my_obj_inst;
      new_tr_1.asc_array_comp[1] = my_obj_inst;

但是该程序输出的比较结果为仍为1:

compare return is 1

说明被比较的new_tr_1.asc_array_comp的所有元素均是和调用比较的tr的关联数组索引0位置的tr.asc_array_comp[0]值比较。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值