硬件验证语言——简介
硬件验证语言 (HVL) 是一种编程语言,用于验证以硬件描述语言 (HDL) 编写的电子电路设计。 HVL 通常包括高级编程语言(如 C++ 或 Java)的特性,以及类似于 HDL 中的易于位级操作的特性。许多 HVL 将提供受约束的随机激励生成和功能覆盖构造,以协助进行复杂的硬件验证。如果 HDL 意味着设计,那么 HVL 意味着验证那些 HDL 代码。
现在问题来了,为什么我们需要 HVL?这与软件领域有关。随着软件变得越来越复杂,人们从汇编语言转向了 BASIC 和 C 等过程语言。但是,编写和维护大型程序仍然很困难。这是人们开发面向对象的编程范式的时候。 OOP 无疑是一项革命性的发展,它使计算机程序能够以前所未有的水平抽象现实世界的问题。它使编写程序更加高效,并且还可以维护和扩展它。
在通常的实践中,我们为我们的设计编写 HDL 代码并使用测试台(也用 HDL 编写)来验证我们的设计。我们的门数每天都在增加,因此它们的验证成了严峻的挑战。过去,验证是使用设计语言完成的。我们创建了“测试台”,将预定的输入应用于我们的设计模型,并将生成的输出与设计人员提供的预期输出进行比较。这是可能的,因为数字电路遵循布尔逻辑,可以预测它们的输出。可以编写一个计算机程序来执行此操作,而这正是模拟中发生的事情。
在那些日子里,几乎所有你能想到的编程语言都用来实现验证环境——C、Pascal、Verilog、脚本语言……。你能用这些语言做什么?例如,您可以编写一个带有输入的长文件(即 CPU 指令列表),并将它们一一注入到被测设备 (DUT) 中。当时的设计比现在小得多,因此大多数工程师对这些测试台感到满意。
几年过去了,设计变得更大更复杂,使用主要用于设计的 HDL 编写测试平台将无助于验证具有更高门密度的电路,EDA 行业意识到旧的定向测试方法无法扩展和扩展。为了创建更复杂的验证环境,需要一种特殊的语言。这就是为什么在当今的 ASIC 世界中,他们使用不同的语言来验证您的设计。这些被称为硬件验证语言(HVL)。
虽然一些 HDL 有一种内置的 HVL。例如,VHDL 有许多语言结构,它们不打算用于硬件综合,但可用于测试平台以在仿真中刺激或分析其他代码。然而,像 VHDL 或 Verilog 这样的 HDL 主要针对 RTL 设计和行为建模。它们的设计并没有真正考虑到功能验证要求。
1996 年,Specman 在拉斯维加斯的 DAC 1996 上被介绍给公众。这种介绍不仅仅是一种新工具——它是一种新概念的介绍。 Specman 包含了 e,因此,随着该介绍,第一个硬件验证语言诞生了。 2002 年,还创建了一个新标准 SystemVerilog。
现在有不同的验证语言可用,其中 e、SystemVerilog、SystemC 和 OpenVera 是最常用的 HVL。基本上,他们利用面向对象的编程(以及其他不太重要的东西)来编写高级抽象的测试平台,从而使验证过程更加健壮和快速。
HVL 在某种程度上是 HDL 和脚本语言的混合体。 HDL 旨在可合成到电路中,而 HVL 旨在作为软件运行,为实际硬件或模拟硬件(来自 HDL)提供激励,以验证硬件的正确功能。
通过 HVL,我们将 OOP 技术应用到硬件验证领域。我们通过使在更高抽象级别上验证设计成为可能来做到这一点。同时,它们包含特别适合验证的特性,而不是编写可综合的代码。
使用基于标准的验证语言,例如 SystemC 和 Sugar/PSL,设计人员可以访问关键分析功能,例如事务和断言,从而能够验证复杂的功能行为。
那么,HVL 语言应该包含什么?
HVL 应能够提供 2 个重要特性。这些是并发断言和约束随机测试。与断言检查表达式在给定时间是否为真一样,并发断言检查以确保信号切换的顺序正确。约束随机测试不必编写必须应用到正在验证的设计的每一条激励,而是加班地应用符合验证工程师给出的约束的所有可能的激励。这样可以节省大量编写刺激的时间。
对于与 RTL 设计的交互,HVL 应该有时间概念和一些连接被测设备的方法。 (在 e 的早期,使用“tick access”;几年后添加了端口。)
为了在最小化手动工作的同时创建有趣的场景,HVL 应该具有随机化功能,以便可以用包含少量约束的短测试替换长的、有向的输入文件。工程师需要的不仅仅是一个简单的“在 0 到 100 之间随机化一个值”。验证环境需要能够定义字段之间的复杂关系,包括不同结构的字段。
在创建测试时,使用约束求解器生成环境可以节省大量时间。它还减少了维护负担(添加一个约束,而不是更改数百个测试)并产生更强大的验证环境。你见过有 10 年历史的定向测试,没有人敢修改它们,因为没有人记得它们最初的目的是什么?
但更重要的是,生成环境是一种新的(在 1990 年代是新的)验证方法的一部分——覆盖驱动验证。根据 CDV,您让工具为您工作。您定义协议规则和验证目标并运行随机测试。每隔一段时间,您就会分析覆盖率报告并决定需要添加哪些约束以将生成扩展到未覆盖的区域。
下面我们简要介绍主要 HVL 的一些关键特性。
SystemVerilog (1985 Gateway Design Automation / Cadence / Co-Design Automation / Synopsys / 2002 Accellera / IEEE)
HILO-2/Occam 并行处理语言 -> Verilog / (1985) ->Superlog(1998) -> SystemVerilog(2002)
SystemVerilog,标准化为 IEEE 1800,是一种硬件描述和硬件验证语言,用于对电子系统进行建模、设计、仿真、测试和实施。 SystemVerilog 基于 Verilog 和一些扩展,自 2008 年以来,Verilog 现在是同一 IEEE 标准的一部分。作为 Verilog 的演变,它通常用于半导体和电子设计行业。
SystemVerilog 始于 2002 年初创公司 Co-Design Automation 向 Accellera 捐赠 Superlog 语言。大部分验证功能基于 Synopsys 捐赠的 OpenVera 语言。 2005 年,SystemVerilog 被采用为 IEEE 标准 1800-2005。 2009 年,该标准与基础 Verilog (IEEE 1364-2005) 标准合并,创建了 IEEE 标准 1800-2009。当前版本是 IEEE 标准 1800-2017。
SystemVerilog 的功能集可以分为两个不同的角色:
SystemVerilog for register-transfer level (RTL) 设计是 Verilog-2005 的扩展; SystemVerilog 中提供了该语言的所有功能。因此,Verilog 是 SystemVerilog 的一个子集。
用于验证的 SystemVerilog 使用广泛的面向对象编程技术,并且与 Java 的关系比 Verilog 更密切。这些构造通常是不可合成的。
SystemVerilog 语言是多种语言概念的组合。 SystemVerilog 语言组件是,
Verilog HDL 的概念
基于 Vera 的测试台构造
OpenVera 断言
Synopsys 的 C 和 C++ 的 VCS DirectC 仿真接口
提供覆盖率指标链接的覆盖率应用程序编程接口
e 硬件验证语言(1996,Verisity / Cadence)
开发商: Verisity 的 Yoav Hollander(一家后来被 Cadence Design Systems 收购的以色列公司)
发布年份:在 1996 年设计自动化会议上。
特征
随机和受约束的随机刺激生成
功能覆盖度量定义和收集
可用于编写断言的时间语言
具有反射能力的面向方面的编程语言
语言是 DUT 中立的,因为您可以使用单个 e 测试台来验证 SystemC/C++ 模型、RTL 模型、门级模型,甚至是驻留在硬件加速盒中的 DUT(使用 UVM Acceleration for e 方法)
可以创建高度可重用的代码,尤其是当测试台是按照通用验证方法 (UVM) 编写时
Specman 作为工具/编译器/调试器提供以使用 E 语言。
OpenVera (2001, Sun Micro Systems / Synopsys)
由 SystemVerilog 替代
Vera -> OpenVera -> SystemVerilog
OpenVera 的前身是 Vera。
Vera 语言最初是在 Sun Micro Systems 中开发的,用于内部 ASIC 验证项目。后来带有 VERA 编译器的 VERA 语言被 System Science 推向市场。 System Science 后来将 Vera 卖给了 Synopsys。 Synopsys 于 2001 年发布了作为 OpenVera 的封闭 Vera 语言,后来在 VCS 中作为 NTB 实现。目前,@hdl Simulator 和 VCS Compiler 支持 OpenVera。
后来 Synopsys 将部分 Vera 语言捐赠给 Verilog,以赋予 Verilog 统一的设计和验证功能。这种新语言称为 SystemVerilog。
OpenVera 是一种硬件验证语言,旨在提高复杂系统的建模和测试效率。它是由 Synopsys 领导的开源计划的一部分,它将使许多将上市时间作为关键因素的行业受益。
OpenVera 是一种可互操作的开放式硬件验证语言,用于创建测试平台。 OpenVera 语言被用作 IEEE Std 中高级验证功能的基础。 1800 SystemVerilog 标准,造福于整个验证社区,包括半导体、系统、IP 和 EDA 行业的公司以及验证服务。
SystemC (2000, Accellera/IEEE)
SystemC 是一组提供事件驱动仿真接口的 C++ 类和宏(另请参见离散事件仿真)。这些工具使设计人员能够模拟并发进程,每个进程都使用简单的 C++ 语法进行描述。 SystemC 进程可以在模拟的实时环境中进行通信,使用 C++ 提供的所有数据类型的信号、SystemC 库提供的一些附加信号以及用户定义的信号。在某些方面,SystemC 刻意模仿硬件描述语言 VHDL 和 Verilog,但更恰当地描述为系统级建模语言。
SystemC 应用于系统级建模、架构探索、性能建模、软件开发、功能验证和高级综合。 SystemC 通常与电子系统级 (ESL) 设计和事务级建模 (TLM) 相关联。
SystemC 由 Open SystemC Initiative (OSCI - 现在的 Accellera) 定义和推广,并已被 IEEE 标准协会批准为 IEEE 1666-2011 - SystemC 语言参考手册 (LRM)。 LRM 提供了 SystemC 语义的明确声明。 OSCI 还提供了一个开源的概念验证模拟器(有时被错误地称为参考模拟器),可以从 OSCI 网站下载。尽管 OSCI 的意图是商业供应商和学术界可以创建符合 IEEE 1666 的原始软件,但实际上大多数 SystemC 实现至少部分基于 OSCI 概念验证模拟器。
SystemC 与 VHDL 和 Verilog 具有语义相似性,但在用作硬件描述语言时,可以说与这些相比具有语法开销。另一方面,它提供了更大范围的表达,类似于面向对象的设计分区和模板类。尽管严格来说是一个 C++ 类库,但 SystemC 有时被视为一种独立的语言。可以使用 SystemC 库(包括仿真内核)编译源代码以提供可执行文件。当用于寄存器传输级仿真时,OSCI 开源实现的性能通常不如商业 VHDL/Verilog 仿真器最佳。
属性规范语言 (PSL/Sugar) (2004, Accellera / IEEE)
属性规范语言 (PSL) 是一种时间逻辑,它使用一系列运算符扩展线性时间逻辑,以方便表达和增强表达能力。 PSL 广泛使用正则表达式和语法糖化。它广泛用于硬件设计和验证行业,其中形式验证工具(例如模型检查)和/或逻辑仿真工具用于证明或反驳给定 PSL 公式适用于给定设计。
PSL 最初由 Accellera 开发,用于指定有关硬件设计的属性或断言。自 2004 年 9 月起,IEEE 1850 工作组对语言进行了标准化。 2005 年 9 月,IEEE 1850 属性规范语言标准 (PSL) 发布。
属性规范语言可与多种电子系统设计语言 (HDL) 一起使用,例如:
VHDL (IEEE 1076)
Verilog (IEEE 1364)
SystemVerilog (IEEE 1800)
开放 SystemC 倡议 (OSCI) 的 SystemC (IEEE 1666)。
当 PSL 与上述 HDL 之一结合使用时,其布尔层使用相应 HDL 的运算符。