System verilog 为什么我们总是从uvm_序列项扩展uvm_事务类?

System verilog 为什么我们总是从uvm_序列项扩展uvm_事务类?,system-verilog,uvm,System Verilog,Uvm,我正在学习UVM教程的基础知识。无论我读到哪里,事务对象总是从uvm_序列_项扩展而不是uvm_事务,因为uvm_序列_项具有事务id等附加功能。如果是这样,为什么uvm_事务类甚至在uvm类层次结构中也存在 除了从中扩展的uvm\u序列项目之外,谁在使用uvm\u事务 这是因为传统吗?这是关于这一点的说法: “uvm_事务类是uvm事务的根基类。uvm_事务继承了uvm_对象的所有方法,添加了计时和录制接口 此类提供时间戳属性、通知事件和事务记录支持 不推荐使用此类作为用户定义事务的基类。它的

我正在学习UVM教程的基础知识。无论我读到哪里,事务对象总是从
uvm_序列_项
扩展而不是
uvm_事务
,因为
uvm_序列_项
具有事务id等附加功能。如果是这样,为什么
uvm_事务
类甚至在uvm类层次结构中也存在

除了从中扩展的
uvm\u序列项目
之外,谁在使用
uvm\u事务

这是因为传统吗?

这是关于这一点的说法:

“uvm_事务类是uvm事务的根基类。uvm_事务继承了uvm_对象的所有方法,添加了计时和录制接口

此类提供时间戳属性、通知事件和事务记录支持


不推荐使用此类作为用户定义事务的基类。它的子类型uvm_sequence_item应用作所有用户定义事务类型的基类。

如果引用uvm类层次结构(链接:[),则会发现uvm_事务父类,而uvm_sequence是子类

因此,子类可以访问父类的所有属性。 但父类无法访问子类属性

uvm_sequence_项有自己的功能,如获取_sequencer_id、设置_sequencer_id、获取_root_sequence

对于层序列,sequencer内部使用这些方法

您可以通过start方法、uvm_do family或config_db调用sequence

这些方法中的每一个都调用start_项(req)和finish_项(req)

如果在两个函数的第一个参数中都观察到数据类型,则函数为uvm_sequence_item

总共有八个uvm课程

(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
这些类是用uvm_序列_项参数化的,而不是用uvm_事务参数化的

如果使用uvm_事务而不是uvm_序列_项,则ti将从uvm_sequencer_param_base.svh中呼出错误(未找到set_sequence_id,该id是uvm_序列_项而非uvm_事务的属性)

因此,序列、定序器和驱动器的通信未完成

在我观察到的大多数情况下,如果您有一个代码,其中您将使用uvm_sequencer,那么您可以使用uvm_事务,它不会显示错误


但是如果您的代码包含uvm_sequenner并且您使用uvm_事务,那么它将发出一个错误(找不到成员“set_sequence_id”)。

请注意,从uvm_事务类继承uvm_sequence_项以及uvm_对象。因此,静态行为和非静态行为(也就是说)类层次结构都从uvm_事务开始

现在,我可以将我想要的任何功能添加到uvm_sequence_项中,以便uvm_sequence_项的每个继承者都可以获得此功能。我可以在不修改uvm_transaction_项的情况下执行此操作。否则,uvm_事务中的任何更改都将导致组件类层次结构中不需要的功能(静态行为)甚至会导致意外的副作用


PS:其他OOP语言和SV的区别之一是SV中不允许多重继承。例如,在C++的情况下,我可以从一个新类中继承2个类。SV中不允许这样做。因此,从UVMMY序列中获得UVMY事务的唯一方法,以及从UvMySt测序项目中获得的唯一方法是继承UVM序列。物品。这可能是你困惑的根源。

是的。我理解。我的问题是,为什么uvm_序列_物品不能有它现在拥有的东西加上uvm_交易?为什么我们需要单独的uvm_交易?你可能想得太多了-你是对的,我们可以用它现在拥有的东西实现
uvm_序列_物品
uvm_事务中的所有代码
,这本来是很好的。基类开发人员可能从后者开始,然后通过扩展该类来实现额外的东西。那时,他们可能决定将
uvm_序列_项
作为任何用户定义的推荐基类类型。
(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