我看到很多文章讨论你是否应该使用字段宏。
一般准则是:
`uvm_do... macro:
可以使用,但如果你很懒,请尽量避免。
`uvm_field... macro:
像瘟疫一样避免。
当然,人们也告诉不要使用
`uvm_component_param_utils...
`uvm_object_param_utils...
但我似乎无法找到任何人对
的看法`uvm_component_utils...
`uvm_object_utils...
他们应该避免吗?或者它们可以毫无问题地使用?
谢谢:)
答案 0 :(得分:3)
* _utils宏不会引入任何性能损失。他们确实节省了一些打字并可能减少印刷错误,但我希望人们在使用之前能够学习宏背后的代码。见http://go.mentor.com/mcem
答案 1 :(得分:2)
本周我教了我的第一个UVM课程(Doulos CTO - John Aynsley - 作为备用)。在他对我的表现的评价中,他对宏表示了这一点,我确信他不会因为我的重复而不知所措:
- `uvm_component_utils和朋友 - 好事
- `uvm_do和朋友 - 有点顽皮
- Field macros - evil
答案 2 :(得分:1)
我总是使用uvm_field_
和uvm_object_utils/uvm_component_utils
宏。它们提供了许多漂亮的功能。
我喜欢的一个功能:如果您使用uvm_field_*
注册,uvm_component将自动从uvm_config_db获取变量。
例如:
class myclass extends uvm_component;
bit enable;
`uvm_component_utils_begin(myclass)
`uvm_field_int(bit, UVM_ALL_ON) // UVM_READ_ONLY wouldn't work for this feature
`uvm_component_utils_end
virtual class build_phase(uvm_phase phase);
super.build_phase(phase);
endclass
virtual task run_phase(uvm_phase phase);
if (enable) begin
// blah blah
end
endtask
endclass
要设置位启用,您需要在级别较高的级别中执行的所有操作都是uvm_config_db(int)::set(this, "path/to/class", "enable", 1)
课堂本身不需要任何“获取”。有点整洁......
答案 3 :(得分:1)
我认为你不能解决这两个宏。
`uvm_component_utils...
`uvm_object_utils...
这两个成立了工厂。如果你不使用它们,你必须在你的每个uvm_object或uvm_component中编写相同的几行繁琐的样板代码。
uvm_component_param_utils
uvm_object_param_utils
与前两个相同,当uvm_object或uvm_component具有参数时,需要使用它们。我发现uvm_object / uvm_componet中的参数在某些情况下很方便,但我知道有人认为这是一个坏主意。但那是另一场辩论。
就个人而言,我避免使用uvm_do
宏,我更喜欢用完全控制来创建和随机化我的seq_item,然后使用`uvm_send(这只是一些锅炉板序列器簿记)
我参加了Doulos培训,我记得他们说避免使用uvm_field
宏。不知怎的,我只是觉得uvm_field
宏有点复杂,所以他们只是避免教它,因为我们没有足够的时间。
uvm_field
宏非常有用,特别是如果您构建自己的uvm_comparer
。是否实现自己的do_copy, do_print
功能是一个品味问题,但uvm_comparer
非常有用。我建议您始终使用uvm_field
宏