带有内联约束的`uvm_do_with

时间:2016-12-16 16:37:33

标签: system-verilog uvm

我在uvm_do_with宏的序列中使用了内联约束,我遇到了一些我不太了解的内容。希望有人能够对此有所了解:

假设我的my_seq_item有2个兰特变量 - dataaddr

my_sequence.sv

class my_sequence extends uvm_sequence;
// Constructor, .... etc etc

virtual task body();
  my_sequence_item tx;
  bit [31:0] addr = 'h0101_0101;
  bit [31:0] data = 'hDEAD_BEEF;

  `uvm_do_with(tx , { tx.addr == addr;
                      tx.data == data;
                    });
endtask: body

这不好玩。代替:

 `uvm_do_with(tx , { tx.addr == local::addr;
                     tx.data == local::data;
                   }

工作正常。

另一个解决方案是将local变量命名为addrdata以外的其他变量。

uvm_do_with宏的扩展说它调用item.randomize(),所以我假设在这种情况下,调用将是

item.randomize(addr, data) with {addr == local::addr;
                                 data == local::data;
                                } 

这是否意味着如果约束块中的变量范围是item而不是当前对象?如果是这种情况,那么我应该可以致电:

 `uvm_do_with(tx , { addr == local::addr;
                     data == local::data;
                   }

如果这也是真的,那么为什么将变量命名为其他东西呢?

1 个答案:

答案 0 :(得分:2)

内联约束具有复杂的标识符搜索语义。它首先搜索调用randomize()的对象(在这种情况下为item)。如果未找到标识符,则搜索通常从发生randomize()的调用点开始(来自body()任务)。

因此,当项目和正文中都有相同的标识符名称时,约束首先会找到item标识符。当名称不相同时,您不会遇到此问题。使用local::可以显示您不希望项目被搜索的意图。我建议您只需要本地范围搜索时使用local::,无论项目中是否存在具有相同名称的标识符。