UVM transaction 定义 方法和用法(未完)

简介

  • Q1: 所有高级的基于类的验证方法都使用类来表示事务,但为什么呢?为什么不使用结构体?
    1 对于高级用户而言,答案是显而易见的,但是对于新手而言,这些问题并没有在任何文献中得到解答。
    2 问题是,大多数现有的 UVM 的参考指南都是由非常非常聪明的软件工程师编写的,他们假设所有用户自然知道这个问题和许多其他问题的答案,但这不是一个有效的假设
    了解这些问题答案的第一步是将基于类的事务功能与基于结构的事务功能进行比较。
  • 类和结构都具有多个字段。类可以有随机化字段,而结构体字段不能自动随机化。
  • 类可以包含随机化约束,而结构不能包含自动约束随机化约束。
  • 类可以有重要的内置方法,而结构不能有内置方法
  • 类是动态类型,您可以在运行时生成任意数量的结构,而结构是静态类型,用户必须在模拟开始时预期并静态声明所有所需的结构。
  • 类类型可以扩展,但结构的新版本必须从原始版本复制并添加新字段。  ‧

  • 类可以放入  UVM  工厂中,以便于运行时替换,而结构则不能。

  • ans:原因:类基本上是动态的、超灵活的结构,可以轻松地随机化、轻松地控制随机化,并在需要时创建。类具有结构中存在的多字段封装功能, 此外还有更多功能。这就是为什么类是表示测试平台事务的首选结构。

  • Q2: UVM trasaction类应该是什么?

  • ans:UVM testbench 的transaction都是 uvm_sequencer_item类的拓展。该类是uvm_object类的派生类,uvm_object 是所有UVM组件和transaction的基类类型(不包括uvm_void类)。

类参数类型 uvm_sequence_item & int。

  1. 参数化为事务类型和uvm_sequence类型的  UVM  组件的默认事务类型是uvm_sequence_item类型。参数化为 uvm_sequence_item的示例组件类型包括uvm_driver和uvm_sequencer。所有用户交易都将是 uvm_sequence_item类型的衍生品。
  2. 参数化为事务类型的许多其他  UVM  基类类型的默认类型是  32  位、2  状态int类型。没有人会使用int类型作为事务类型。  int类型只是参数化类中默认的、基于类型的占位符,以确保基于类的  UVM  库 能够正确编译。  EVERYBODY  替换了int类型,通常使用基于类的事务类型。参数化为int类型的常用组件的示例包括 uvm_tlm_fifo和uvm_analysis_tlm_fifo。

uvm transaction

  • 第一次进行基于类的验证时,验证工程师 很想为 输入 创建一种事物类型,为输出创建另一种事物类型,因为完成定向测试的验证工程师习惯于将输入发送到设计中,然后进行采样用于验证目的的输出。
  • 将  UVM  事务与定向测试方法进行比较时,事务在同一事务中同时具有输入和输出字段,而定向测试将输入字段与输出字段分开。这是最初学习基于类的验证时的重要一点。
  • 在  UVM  测试平台环境中,代理包括驱动程序和监视器。即使为驱动程序提供了包含输入和输出的整个事务对象的副本,驱动程序也会收集事务输入并仅将事务输入发送到被测设计  (DUT)。交易输出被驱动程序忽略。驱动器是测试台组件之一,必须提取各个输入信号并将其正确发送到  DUT
  • 监视器实际上对  DUT  接口的输入和输出进行采样。驱动侧代理有一个监视器,将对输入和输出进行采样,但只有输入会被记分板内部的预测器处理,如图  1  所示。采样的输出仍在该事务中,但它们被完全忽略。
  • 输出侧代理使用完全相同的监视器,对来自  DUT  接口的输入和输出进行采样,但在输出侧监视器上,即使输入和输出都已采样并发送到记分板,输入将被记分板中的比较器丢弃,如图  1  所示,实际  DUT  输出将用于 与预测输出进行比较。
posted @ 2024-04-01 23:59  LeslieQ  阅读(64)  评论(0编辑  收藏  举报