do_compare的结果为1但.compare的返回值为0

时间:2014-06-19 01:01:26

标签: system-verilog uvm

我正在关注http://cluelogic.com/2013/01/uvm-tutorial-for-candy-lovers-do-hooks/https://verificationacademy.com/cookbook/transaction/methods实施比较 唯一的区别是我正在使用

而不是大逻辑AND(&&)
virtual function bit do_compare ....
  do_compare &= <statement A>;
  do_compare &= <statement B>;

  $display (do_compare); ///< this displays 1
  return do_compare;

endfunction

但是返回的值总是为0 例如考虑序列

temp = m.compare(n);
$display (temp); ///< displays 0

我一直在尝试调试为什么temp始终为0但无法弄清楚。任何人都可以指出我正确的方向

1 个答案:

答案 0 :(得分:2)

查看compare(...)的源代码,我看到do_compare(...)的以下条件被调用:

if(!done) begin
  comparer.compare_map.set(rhs, this);
  __m_uvm_field_automation(rhs, UVM_COMPARE, "");
  dc = do_compare(rhs, comparer);
end

不确定何时设置done(一种情况是标记了使用字段宏自动化的字段的错误)。您确定要调用do_compare(...)吗?在那里添加`uvm_info或设置断点以确保。

我在John Aynsley的演示文稿中看到的另一个想法是,如果要实现自己的do_*方法,请不要使用字段自动化宏。如果您使用它们,请尝试将所有字段设置为UVM_NOCOMPARE。这是因为compare(...)的返回值计算为return (comparer.result == 0 && dc == 1);。这意味着即使您的do_compare(...)返回1,仍然可能是其中一个自动字段标记了错误(尽管我预计会出现错误消息)。