sequence_item、sequence、sequencer、driver的关系

本文深入探讨了UVM(Universal Verification Methodology)中的关键组件,包括sequence_item、sequence、sequencer和driver的作用与交互方式。解释了sequence机制的必要性,并介绍了sequence机制中的内部协议,帮助读者更好地理解UVM验证平台的设计。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

试写,纯属看书个人理解;无任何实践经验。

框图

这里写图片描述

  1. sequence_item,负责定义事务,就是transaction;
  2. sequence,负责产生事务。注意sequence是uvm_object,不在UVM树形结构里,它要负责raise_objectiondrop_objection的工作,从而决定了仿真的结束$finish
  3. sequencer,负责事务相关请求的调度。sequence、sequencer、driver之间有一个完整的协议(这时由OVM之sequence机制的一篇网文了解的。类似总线的握手协议),需要遵守。这个协议,是由uvm内部的factory机制实现。
  4. driver,负责申请事务。另外还要负责事务到信号的转换。

简单描述

基于UVM实战的代码2.5.2章节。

driver

关键功能,都在task main_phase里。
1. 申请事务transaction。利用的TLM(Transaction Level Model),端口之类的原理。
2. 事务转化为信号级别。
3. 申请事务结束,表明事务处理完成。
4. 循环上述1~3步骤;表示申请下一个事务。注意:是个永久循环,因为driver,不同于uvm_object,不存在仿真生命周期,在仿真过程中,需要保持一直存在。

sequencer

  1. 只需要factory机制化,就可以了。背后的动作,暂时不考虑,按照OVM的说法,整个sequence机制有一套完整的以事务为接口的传输协议,sequencer只是一个调度者而已。uvm_component之间,就是以事务为单位互连的。

sequence

关键功能都在task body里。注意:sequence必须保证要有task body。
1. starting_phase.raise_objection;
2. uvm_do宏,发起事务给sequencer。
3.
starting_phase.drop_objection`;

sequence_item

负责定义各种各样的transaction
1. rand变量定义;
2. constraint约束定义;
3. 字段注册。目的是使得各个事务transaction都可以使用下述函数,比如copy/print/compare/pack/unpack等等。

细节理解

最初的验证平台,只需要driver即可,为什么还需要sequence机制?

如果事务在driver里定义,会产生一个问题。比如事务种类繁多,岂不是每次启动一个事务,都要修改driver的main_phase代码部分。
如果定义多个driver,那么会把UVM树形结构搞的乱七八糟。

所以,要从driver里剥离,事务产生(具体包括事务定义、事务产生的步骤)的代码部分。driver只负责事务驱动即可。
补充一句,验证的case_list,是用sequence机制去实现的;并保证了UVM树形结构的单一性、统一性。使得可维护的能力大大加强。

上述解释,也是sequence和sequence_item不属于uvm_componet的原因。case相关的代码改动,都在sequence和sequence_item里实现。

sequence机制的内部协议

还没做。。
下面是plantuml画图工具的源码,借此备份一下。

@startuml
scale 500*500

driver   -> sequencer: seq_item_port.get_next_item(req) ,申请事务
sequence -> sequencer: 
driver   -> dut: 事务转换为信号,驱动DUT
driver   -> sequencer: seq_item_port.item_done()

caption figure uvm sequence机制
@enduml

sequence还有很多细节需要补充

  1. sequence负责事务的产生;
  2. sequencer负责sequence和driver之间的事务请求调度;
  3. sequencer可以并行执行多个sequence;
  4. sequencer可以按照优先级顺序执行多个sequence;也有lock、grab、is_relevant方式去按照顺序执行多个sequence。
  5. sequence的uvm_do宏,告知相关sequencer,已经有事务产生了。这个时候如果driver申请事务,sequencer就会把sequence的事务传给driver。
  6. sequence可以嵌套。意义是新建sequence时,可以利用已有sequence去构建;而不是非得用uvm_do宏定义。方便代码的实现和理解。
  7. 一个sequencer和一个driver,如何实现传输多种transaction事务?这个是由sequencer和driver类定义时的参数决定的。只需要参数写为uvm_sequence_item即可。这时,考虑driver的seq_item_port.get_next_item(req),req通过$case(your_tr,req)去判断请求的事务类型,是哪一种。
  8. 待续。。。
<think>嗯,用户问的是关于UVM中的`uuv_sequence_item`自带了哪些函数。首先,我需要确认`uuv_sequence_item`是不是用户可能拼写错误了,因为通常在UVM中,基础类名是`uvm_sequence_item`。可能用户多打了一个'u',或者是指某个特定库或自定义的类。但考虑到UVM的标准类,我应该先假设是`uvm_sequence_item`,并在回答中说明这一点,避免混淆。 接下来,我需要回忆`uvm_sequence_item`的标准函数。UVM中的sequence item是用于在sequencerdriver之间传递事务的基本单元,继承自`uvm_transaction`,而后者又继承自`uvm_object`。因此,`uvm_sequence_item`会继承`uvm_object`的方法,同时添加一些与sequence相关的功能。 标准的方法包括: 1. **`do_copy`**: 用于深拷贝对象,需要用户根据需要覆盖。 2. **`do_compare`**: 用于比较两个对象的内容,通常在`compare`方法中被调用。 3. **`convert2string`**: 将对象内容转换为字符串,便于打印调试。 4. **`do_record`**: 用于记录字段到波形数据库,比如在仿真中记录事务信息。 5. **`create`**: 工厂方法,用于创建对象实例。 6. **`get_type_name`**: 返回类型名称,便于工厂其他机制使用。 7. **`start_item``finish_item`**: 虽然这些方法通常由sequence调用,但item本身可能需要与之配合。 此外,`uvm_sequence_item`可能还有一些与传输延迟、状态相关的函数,比如设置获取传输的延迟时间,或者处理父子sequence关系。但需要确认这些是否是基类的一部分,还是由用户扩展的。 用户可能需要具体的函数列表,以及它们的作用。比如,`copy`、`compare`、`clone`等方法是来自`uvm_object`的,而`start_item``finish_item`是由sequence调用的,但item本身可能需要实现某些回调。 需要确保回答的结构清晰,分点列出函数,并简要说明每个函数的用途,帮助用户理解如何在他们的验证环境中使用这些方法。同时,提醒用户如果是指自定义的`uuv_sequence_item`,可能需要查阅具体文档,因为标准UVM中没有这个类。</think>根据您的问题,笔者推测您可能指的是UVM验证方法学中的标准类`uvm_sequence_item`(UVM标准类名中没有uuv_sequence_item)。以下是其核心功能函数的解析: --- ### **uvm_sequence_item 核心函数** (继承自`uvm_transaction``uvm_object`) 1. **基础操作函数** - `copy()`:执行对象深拷贝(调用`do_copy()`实现) - `compare(uvm_object rhs)`:比较两个对象内容(调用`do_compare()`) - `clone()`:创建对象的副本 - `convert2string()`:将对象内容转为可读字符串(需覆盖`do_convert2string()`) 2. **工厂机制相关** - `create(string name="")`:通过工厂模式创建对象实例 - `get_type_name()`:返回类型名称字符串(通常为"uvm_sequence_item") 3. **字段自动化(需配合`uvm_field_*宏)** - `pack()`/`unpack()`:序列化/反序列化字段 - `record()`:记录字段到波形数据库(调用`do_record()`) 4. **传输控制** - `set_id_info(uvm_sequence_item item)`:复制源sequence的ID优先级 - `get_transaction_id()`:获取事务唯一ID 5. **调试函数** - `print()`:打印对象内容(依赖`convert2string()`实现) - `sprint()`:返回格式化的字符串描述 --- ### **典型使用场景** ```systemverilog class my_transaction extends uvm_sequence_item; rand logic [7:0] data; rand int delay; // 注册字段自动化 `uvm_object_utils_begin(my_transaction) `uvm_field_int(data, UVM_ALL_ON) `uvm_field_int(delay, UVM_DEFAULT) `uvm_object_utils_end // 自定义比较逻辑 virtual function bit do_compare(uvm_object rhs, uvm_comparer comparer); my_transaction tx; if (!$cast(tx, rhs)) return 0; return (this.data == tx.data) && (this.delay == tx.delay); endfunction endclass ``` --- ### **注意事项** - 如果实际使用的是自定义`uuv_sequence_item`,请检查是否继承自标准UVM类 - 关键函数如`do_copy`/`do_compare`需要用户根据业务逻辑覆盖实现 - 建议通过`uvm_object_utils宏实现工厂注册字段自动化 需要更具体的函数原型或使用示例,可提供更详细的应用场景说明。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值