当我们总是从 uvm_sequence_item 扩展时,为什么 uvm_transaction class?
Why uvm_transaction class when we always extend from uvm_sequence_item?
我正在学习 UVM 教程的基础知识。在我阅读的所有地方,交易对象总是从 uvm_sequence_item
而不是 uvm_transaction
扩展,因为 uvm_sequence_item
具有交易 ID 等附加功能。如果是这样,为什么 uvm_transaction
class 即使在 UVM class 层次结构中?
除了 uvm_sequence_item
之外,还有谁在使用 uvm_transaction
?
是因为遗留问题吗?
UVM Class Reference 是这样说的:
”uvm_transactionclass是UVM交易的根基class。继承了uvm_object的所有方法,uvm_transaction增加了一个时序和录制界面。
此 class 提供时间戳属性、通知事件和事务记录支持。
不推荐使用此 class 作为用户定义事务的基础。它的子类型 uvm_sequence_item 应用作所有用户定义交易类型的基础 class。"
如果你参考 uvm class hierarchy (Link:[https://www.google.co.in/search?biw=1366&bih=620&tbm=isch&sa=1&btnG=Search&q=uvm+class+hierarchy#imgrc=Laxc9UWNpnGTpM%3A][1] ) 那么你会发现 uvm_transaction parent class while uvm_sequence 是 child class.
所以,childclass可以访问parentclass的所有属性。
但是parentclass无法访问childclass属性.
uvm_sequence_item 有自己的功能,如 get_sequencer_id、set_sequencer_id、get_root_sequence.
在图层序列的情况下,sequencer 在内部使用这些方法。
你通过启动方法调用序列,uvm_do家族或config_db。
每个方法调用 start_item(req) 和 finish_item(req)。
task start_item(uvm_sequence_item item)
task finish_item(uvm_sequence_item item)
如果您观察到函数中第一个参数的数据类型是 uvm_sequence_item.
共有八个uvm classes.
(1) uvm_driver.svh
(2) uvm_push_driver.svh
(3) uvm_sequencer.svh
(4) uvm_push_sequencer.svh
(5) uvm_sequencer_library.svh
(6) uvm_sequencer_analysis_fifo.svh
(7) uvm_sequence.svh
(8) uvm_sequencer_param_base.svh
这些 classes 参数化为 uvm_sequence_item 而不是 uvm_transaction.
如果你使用 uvm_transaction 而不是 uvm_sequence_item 那么我会报错(set_sequence_id not found which is 属性 of uvm_sequence_item not uvm_transaction ) 来自 uvm_sequencer_param_base.svh.
所以,sequence,sequencer,driver的通信没有完成
在我观察到的大多数情况下,如果您的代码 不 打算使用 uvm_sequencer 那么您可以使用 uvm_transaction 不会报错
但是如果你的代码包含uvm_sequener并且你使用uvm_transaction那么它会报错( 找不到成员 'set_sequence_id').
请注意,从 uvm_transaction class、uvm_sequence_item 以及 uvm_objects 继承。所以,静态行为和非静态行为(可以这么说)class层次结构都是从uvm_transaction.
开始的
现在,我可以向 uvm_sequence_item 添加我想要的任何功能,以便 uvm_sequence_item 的每个继承者都能获得它。我可以在不修改 uvm_transction_item 的情况下做到这一点。否则,uvm_transaction 中的任何更改都会导致组件 class 层次结构中不需要的功能(静态行为),甚至可能导致意外的副作用。
PS:其他OOPs语言与SV的区别之一是SV不允许多重继承。例如,对于 C++,我可以在新的 class 中继承 2 classes。这在 SV 中是不允许的。因此,获得 uvm_transaction 和 uvm_sequence_item 属性的唯一方法是继承 uvm_sequence_item。这可能是您困惑的根源。
我正在学习 UVM 教程的基础知识。在我阅读的所有地方,交易对象总是从 uvm_sequence_item
而不是 uvm_transaction
扩展,因为 uvm_sequence_item
具有交易 ID 等附加功能。如果是这样,为什么 uvm_transaction
class 即使在 UVM class 层次结构中?
除了 uvm_sequence_item
之外,还有谁在使用 uvm_transaction
?
是因为遗留问题吗?
UVM Class Reference 是这样说的:
”uvm_transactionclass是UVM交易的根基class。继承了uvm_object的所有方法,uvm_transaction增加了一个时序和录制界面。
此 class 提供时间戳属性、通知事件和事务记录支持。
不推荐使用此 class 作为用户定义事务的基础。它的子类型 uvm_sequence_item 应用作所有用户定义交易类型的基础 class。"
如果你参考 uvm class hierarchy (Link:[https://www.google.co.in/search?biw=1366&bih=620&tbm=isch&sa=1&btnG=Search&q=uvm+class+hierarchy#imgrc=Laxc9UWNpnGTpM%3A][1] ) 那么你会发现 uvm_transaction parent class while uvm_sequence 是 child class.
所以,childclass可以访问parentclass的所有属性。 但是parentclass无法访问childclass属性.
uvm_sequence_item 有自己的功能,如 get_sequencer_id、set_sequencer_id、get_root_sequence.
在图层序列的情况下,sequencer 在内部使用这些方法。
你通过启动方法调用序列,uvm_do家族或config_db。
每个方法调用 start_item(req) 和 finish_item(req)。
task start_item(uvm_sequence_item item)
task finish_item(uvm_sequence_item item)
如果您观察到函数中第一个参数的数据类型是 uvm_sequence_item.
共有八个uvm classes.
(1) uvm_driver.svh
(2) uvm_push_driver.svh
(3) uvm_sequencer.svh
(4) uvm_push_sequencer.svh
(5) uvm_sequencer_library.svh
(6) uvm_sequencer_analysis_fifo.svh
(7) uvm_sequence.svh
(8) uvm_sequencer_param_base.svh
这些 classes 参数化为 uvm_sequence_item 而不是 uvm_transaction.
如果你使用 uvm_transaction 而不是 uvm_sequence_item 那么我会报错(set_sequence_id not found which is 属性 of uvm_sequence_item not uvm_transaction ) 来自 uvm_sequencer_param_base.svh.
所以,sequence,sequencer,driver的通信没有完成
在我观察到的大多数情况下,如果您的代码 不 打算使用 uvm_sequencer 那么您可以使用 uvm_transaction 不会报错
但是如果你的代码包含uvm_sequener并且你使用uvm_transaction那么它会报错( 找不到成员 'set_sequence_id').
请注意,从 uvm_transaction class、uvm_sequence_item 以及 uvm_objects 继承。所以,静态行为和非静态行为(可以这么说)class层次结构都是从uvm_transaction.
开始的现在,我可以向 uvm_sequence_item 添加我想要的任何功能,以便 uvm_sequence_item 的每个继承者都能获得它。我可以在不修改 uvm_transction_item 的情况下做到这一点。否则,uvm_transaction 中的任何更改都会导致组件 class 层次结构中不需要的功能(静态行为),甚至可能导致意外的副作用。
PS:其他OOPs语言与SV的区别之一是SV不允许多重继承。例如,对于 C++,我可以在新的 class 中继承 2 classes。这在 SV 中是不允许的。因此,获得 uvm_transaction 和 uvm_sequence_item 属性的唯一方法是继承 uvm_sequence_item。这可能是您困惑的根源。