我正在关注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但无法弄清楚。任何人都可以指出我正确的方向
答案 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,仍然可能是其中一个自动字段标记了错误(尽管我预计会出现错误消息)。