uvm验证环境中struct(结构体)和class的区别与联系
新手常常会问:为什么在验证中要使用类类型而不是结构体?
为了更好地理解为何使用类而非结构体,对比 SystemVerilog 中类和结构体的不同能力是很有帮助的。
- 类和结构体都可包含多个字段。
- 类能包含可随机化的字段,而结构体的字段无法自动被随机化。
- 类可包含随机化约束,而结构体无法包含自动的随机化约束。
- 类可拥有重要的内置方法,而结构体不能有内置方法。
- 类是动态类型,你可以在运行时根据需要生成任意多个类的实例;而结构体是静态类型,用户必须在仿真开始时就预先声明所有需要的结构体。
- 类类型可以被扩展(继承),而结构体的新版本必须从原始版本复制后再添加新字段。
- 类可以放入 UVM 工厂中,以便在运行时轻松实现替换;而结构体不能。
类本质上是动态的、超灵活的 “结构体”—— 它们可以轻松被随机化、轻松控制随机化过程,还能在需要时被创建。类具备结构体所拥有的多字段封装能力,除此之外还有更多特性。这就是为什么类是表示测试平台事务的首选结构。
类和结构体还共享另一个优势:无论事务中包含 1 个信号还是 1000 个信号,它们都能作为一个整体在测试平台中传递。因此,通过 “单一单元操作” 就能很容易地在测试平台环境中传递信号。如果信号被添加到事务中或从事务中移除,测试平台的大部分结构都无需修改。只有少数测试平台组件需要单独与所有组件信号交互、
具体比对如下
类(Classes)
- ✓ 可以包含多个字段。
- ✓ 可以包含可随机化的字段。
- ✓ 可以包含随机化约束。
- ✓ 拥有内置的
randomize()
方法。 - ✓ 可以包含重要的用户自定义方法(如
copy
、compare
和print-my-contents
)。 - ✓ 是动态类型,可根据需要生成。
- ✓ 类类型可以被扩展,从而轻松创建添加了字段和方法的新版本。
- ✓ 类可以放入 UVM 工厂,以便在运行时轻松替换。
结构体(Structs)
- ✓ 可以包含多个字段。
- × 不能拥有自动可随机化的字段。
- × 不能包含随机化约束。
- × 没有内置的
randomize()
方法。 - × 不能包含用户自定义方法。
- × 是静态类型,要求所有用户定义的结构体在仿真开始时就声明。
- × 结构体的新版本需要用户将原始版本完整复制到新结构体中,然后添加新字段。
- × 非动态的结构体不能放入 UVM 工厂。