首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >为什么uvm_transaction类总是从uvm_sequence_item扩展而来?

为什么uvm_transaction类总是从uvm_sequence_item扩展而来?
EN

Stack Overflow用户
提问于 2016-07-08 23:29:28
回答 3查看 3.5K关注 0票数 3

我正在学习UVM教程的基础知识。在我阅读的所有地方,事务对象总是从uvm_sequence_item而不是uvm_transaction扩展而来,因为uvm_sequence_item具有诸如transaction id等附加特性。如果是这样,为什么uvm_transaction类甚至在UVM类层次结构中?

除了从uvm_transaction扩展的uvm_sequence_item之外,还有谁在使用uvm_sequence_item

是因为遗产吗?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2016-07-09 01:20:30

UVM Class Reference就是这么说的:

“uvm_transaction类是UVM事务的根基类,继承了uvm_object的所有方法,uvm_transaction添加了一个定时和记录接口。

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

不推荐使用这个类作为用户定义事务的基础。它的子类型uvm_sequence_item将用作所有用户定义的事务类型的基类.“

票数 5
EN

Stack Overflow用户

发布于 2016-07-14 17:39:06

如果您引用uvm类层次结构(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父类,而uvm_sequence是子类。

因此,子类可以访问父类的所有属性。但是父类不能访问子类属性。

uvm_sequence_item有自己的功能,如get_sequencer_id、set_sequencer_id、get_root_sequence。

这些方法由内部使用的排序器在层序列的情况下使用。

您可以通过start方法、uvm_do系列或config_db调用序列。

每个方法都调用start_item(req)和finish_item(req)。

代码语言:javascript
运行
复制
task start_item(uvm_sequence_item item) 
task finish_item(uvm_sequence_item item)

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

总共有八个uvm类。

代码语言:javascript
运行
复制
(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_sequence_item而不是uvm_transaction。

如果您使用uvm_transaction而不是uvm_sequence_item,那么ti将从uvm_sequencer_param_base.svh发出一个错误(未找到set_sequence_id,这是uvm_sequence_item而不是uvm_transaction的属性)。

因此,顺序、排序器和驱动程序之间的通信没有完成。

在我观察到的大多数情况下,如果您有一个代码是,而不是,那么您可以使用uvm_transaction,它不会出现错误。

但是,如果您的代码包含uvm_sequener,并且使用了uvm_sequener,那么它会发出错误(无法找到成员'set_sequence_id')。

票数 1
EN

Stack Overflow用户

发布于 2017-12-25 09:55:12

注意,在uvm_transaction类中,uvm_sequence_item和uvm_objects都是继承的。因此,静态行为和非静态行为(可以说)类层次结构都是从uvm_transaction开始的。

现在,我可以将我想要的任何功能添加到uvm_sequence_item中,以便uvm_sequence_item的每个继承者都能得到这个功能。我可以在不修改uvm_transction_item的情况下做到这一点。否则,uvm_transaction中的任何更改都会导致组件类层次结构中不必要的功能(静态行为),甚至可能导致意外的副作用。

PS:其他OOPs语言和SV之间的区别之一是SV中不允许多重继承。例如,对于C++,我可以从一个新类中的两个类继承。这是不允许在SV。因此,获得uvm_transaction属性和uvm_sequence_item属性的唯一方法是从uvm_sequence_item继承。这可能是你困惑的根源。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38276720

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档