Josh's Note — Verilog
Part 1 初识 HDL 设计方法

1. 设计方法的变迁

随着微电子设计技术与工艺的发展,数字集成电路从电子管、晶体管、中小规模集成电路、超大规模集成电路(Very Large Scale Integrated Circuit, VLSIC)逐步发展到今天的专用集成电路(Application Specific Integrated Circuit, ASIC),愈发数字化的产品如计算机、手机、数字电视等都运用了复杂的专用数字集成电路。数字逻辑器件从简单的逻辑门到复杂的 SoC,种类繁多,提供了对复杂系统的灵活支撑。

随着数字电路系统的不断发展,系统的逻辑复杂度与规模日益增加,数字系统的设计方法也随之不断演进。在早期简单的门逻辑设计阶段,EDA(Electronic Design Automation,电子设计自动化)工具应用范围十分有限,工程师们习惯于使用卡诺图简化设计,然后通过面包板等实验系统验证设计;系统相对复杂后,工程师们借助 EDA 工具通过原理图描述数字系统。

原理图由元件库中的元件构成,使用 EDA 工具可以对原理图进行仿真并分析其性能。

当数字系统发展到 ASIC 与 PLD(Programmable Logic Device,可编程逻辑器件)设计阶段后,原理图不利于移植、维护费时费力等缺点逐步显现,这时需要抽象度更高、更灵活的设计方式 —— HDL(Hardware Description Language,硬件描述语言)。

使用 HDL 语言,可以从算法、系统级(System Level)、功能模块级(Functional Model Level)、行为级(Behavioral Level)、寄存器传输级(RTL, Register Transfer Level)、门级(Gate Level)到开关级(Switch Level)等不同层次描述数字电路系统,然后通过 EDA 工具综合、仿真并实现该系统。可以说 HDL 语言的出现是数字系统设计方法的一个重大飞跃。

数字电路系统设计方法的另一个重大飞跃是随着 EDA 工具的不断推陈出新发生的。早期 ASIC 和 PLD 设计时,需要直接描述 CMOS 的开关电路或门级电路,其设计量庞大,仿真速度也非常慢,用开关级或门级方法描述如当今门数量为千万门级的 FPGA 在当时是不可想象的。这时人们就希望能够使用 HDL 直接从更高的层次描述电路,然后使用 EDA 工具自动将高层次的 HDL 电路描述解析到门级,这些将大大节约设计与仿真时间,这个从高层次的电路描述通过 EDA 工具解析到门级等低层次的电路描述的过程就叫“综合”(Synthesize),或者逻辑综合

综合工具能将高层次的 HDL 语言、原理图等设计描述翻译成由与、或、非门等基本逻辑单元组成的门级连接(网表)并根据设计目标与要求(约束条件)优化所生成的逻辑连接,输出门级网表文件。

目前最成熟的综合工具是 RTL 级综合工具,它能将 RTL 级描述翻译并优化为门级网表。综合工具的产生支撑了直接从 RTL 级描述硬件电路,这种从门级描述抽象到 RTL 级描述数字电路是设计方法的又一次伟大飞跃。

从上面描述可以看到 HDL 语言是分层次的,关于上述 HDL 语言设计层次的含义在本文的 3. HDL 的设计与验证流程小节和 Part 3——描述方式和设计层次的 5. 设计层次小节有详细论述。

2. Verilog 语言的特点

2.1. Verilog 的由来

Verilog 是 Verilog HDL 的简称。

Verilog 语言最初于1983年由 Gateway Design Automation 公司开发,于1995年接受为 IEEE 标准。

Verilog 语言不仅定义了语法,而且对每个语法结构都清晰定义了仿真语义,从而便于仿真调试。而且 Verilog 从 C 语言继承了很多操作符和语法结构,对初学者而言易学易用。另外 Verilog 语言具有很强的扩展能力,最新的 Verilog 2001 标准1大大扩展了 Verilog 的应用灵活性。

另外一个流行的 HDL 语言是 VHDL,其发展初期受到美国国防部支持,并于 1987 年成为 IEEE 标准。VHDL 语言的特点是描述严谨。

2.2. Verilog 和 VHDL

Verilog 和 VHDL 作为最为流行的 HDL 语言,从设计能力上而言都能胜任数字电路系统的设计任务。

VHDL 最初用作文档来描述数字硬件的行为,因此其描述性和抽象层次更高。也就是说,VHDL 更适合描述更高层次(如行为级、系统级等)的硬件电路。

Verilog 最初是为了更简洁有效地描述数字硬件电路和仿真而设计的,它的许多关键字与语法集成了 C 语言的体系,因此易学易懂,接受度很广。

前面已经提到最流行的 HDL 语言是 Verilog 和 VHDL。在其基础上发展出了许多抽象程度更高的硬件描述语言,如 SystemVerilog、Superlog、SystemC、CoWare C,这些高级 HDL 语言的语法结枃更加丰富,更适合做系统级、功能级等高层次的设计描述和仿真。

2.3. Verilog 和 C

Verilog 语言是根据 C 语言发明而来的,因此 Verilog 具备了 C 语言的简洁易用的特点。Verilog 从 C 语言中借鉴了许多语法,例如预编译指令和一些高级编程语言结构。

  1. C 语言与 Verilog 的最大区别

    C 语言与 Verilog 的最大区别在于 C 缺乏硬件描述的 3 个基本概念:

    • 互连(connectivity):硬件系统中,互连是非常重要的组成部分,而在 C 语言中并没有直接可以用来表示模块间互连的变量;而 Verilog 的 wire 型变量配合一些驱动结构能有效地描述网线的互连。

    • 并发(concurrency):C 语言天生是串行的,不能描述硬件之间并发的特性,C 语言编译后,其机器指令在 CPU 的高速缓冲队列中基本是顺序执行;而 Verilog 可以有效地描述并行的硬件系统,硬件系统比软件系统速度快、实时性高的一个重要原因就是硬件系统中各个单元的运算是独立的,信号流是并行的

    • 时间(time):C 程序运行的时候,没有一个严格的时间概念,程序运行的时间长短取决于处理器本身的性能;而 Verilog 语言本身定义了绝对和相对的时间度量,在仿真时可以通过时间度量与周期关系描述信号直接的时间关系。

  2. HDL 语言的本质

    硬件描述语言(HDL)同软件语言(如 C、C++ 等)是有本质区别的。Verilog 作为硬件描述语言,它的本质作用在于描述硬件。Verilog 虽然采用了 C 语言形式,但是它的最终描述结果是芯片内部的实际电路。所以评判一段 HDL 代码优劣的最终标准是其描述并实现的硬件电路的性能(包括面积速度两个方面)。评价一个设计的代码水平较高,仅仅是说这个设计由硬件向 HDL 代码这种表现形式转换得更流畅、合理。而一个设计的最终性能更大程度上取决于设计工程师所构想的硬件实现方案的效率以及合理性。

    初学者,特别是由软件转行的初学者,片面追求代码的整洁、简短,这是错误的,是与评价 HDL 的标准背道而驰的。正确的编写代码的方法是,首先要做到对所需实现的硬件电路“胸有成竹”,对该部分硬件的结构与连接十分清晰,然后再用适当的 HDL 语句表达出来即可。

  3. Verilog 与 C 的结合

    Verilog 毕竟是硬件描述语言,在抽象层次上比 C 语言要差一些,语法不如 C 灵活,例如文件输入和输出方面,Verilog 的功能显然不如 C。为了克服 Verilog 高级抽象的缺陷,Verilog 的设计者们发明了 PLI(Programming Language Interface)。PLI 可以在仿真器中将 C 语言的程序和 Verilog 的程序互相通信,或者在 Verilog 中调用 C 语言的函数库,这样就大大扩展了 Verilog 语言的灵活性和高层次抽象的能力。开发时,一方面,硬件设计者使用 Verilog 进行硬件建模;另一方面,验证工程师却常常使用 C 来编写测试向量,然后通过 Verilog 的 PLI 将 Verilog 和 C 联系起来。这样,C 语言就很好地弥补了 Verilog 高层次建模的缺陷。

3. HDL 的设计与验证流程

HDL 的基本功能就是有效地描述并仿真硬件系统。在此部分,抛开具体的 PLD 或 ASIC 设计流程,从 HDL 语言层次入手,分析典型的 HDL 设计与验证流程。基于 HDL 的设计、仿真流程如图 1-1 所示。图中,虚线框表示的步骤可以根据项目的复杂度省略,而实线框表示的步骤为必须执行的步骤。

图 1-1 基于 HDL 的设计、仿真流程

下面对一些关键设计步骤与概念进行展开。

3.1. 系统与功能模块定义(系统与功能模块级)

在大型系统的设计与实现中,首先要进行详细的系统规划和描述,此时 HDL 描述 侧重于整体系统的划分和实现。对系统级的仿真侧重于对整个系统的功能和性能指标的考量。功能模块级设计时将系统整体功能划分为可实现的具体功能模块,大致确定模块间的接口,如时钟、读写信号、数据流、控制信号等。在有些情况下,还要根据系统要求,描述每个模块或进程的时序约束。另外在此层次,必须权衡整个系统多种的实现方式的优劣,选出系统性能指标优并且可以高效实现的设计方案。功能模块级仿真主要是考察每个功能的功能和基本时序情况。系统与功能模块级设计与仿真常常要借助于 C 语言和抽象程度较高的 HDL 语言描述,如 SystemC、Coware C、SystemVerilog、Superlog 等。

3.2. 行为级描述测试激励(Behavioral Level)

行为级模块描述的最大特点是 必须明确每个模块间的所有接口和边界。此时模块内部的功能已经明确,模块间的所有接口,顶层的输入、输出信号等在行为级已经被清晰地描述出来。在 PLD 和 ASIC 设计流程中,常用行为级描述方式编写测试激励。延时描述、监视描述等命令都是在编写测试激励过程中常用的行为级语法。行为级描述常用 HDL 语言如 Verilog 和 VHDL 等。

3.3. 寄存器传输级(RTL)

寄存器传输级指不关注寄存器和组合逻辑的细节(如使用了多少逻辑门,逻辑门之间的连接拓扑结构等),通过描述寄存器到寄存器之间的逻辑功能描述电路的 HDL 层次。RTL 级是比门级更高的抽象层次,一般使用 RTL 级语言描述硬件电路比门级描述电路简单、高效得多。寄存器传输级描述的最大特点是可以直接用综合工具综合门级网表。RTL 设计直接决定着设计的功能和效率。好的 RTL 设计能在满足逻辑功能的前提下,使设计的速度和面积达到一种平衡的优化。RTL 级描述最常用的 HDL 语言是 Verilog 和 VHDL 语言。

3.4 对 RTL 级描述进行功能仿真

一般来说需要对 RTL 级设计进行功能仿真,仿真的目的为 验证 RTL 级描述是否与设计意图一致。为了提高效率,一般功能仿真的测试激励使用行为级的 HDL 语言描述。

3.5. 逻辑综合(使用 RTL 级 EDA 工具)

RTL 级综合指 将 RTL 级 HDL 语言翻译成由与、或、非门等基本逻辑单元组成的门级连接(网表),并根据设计目标与要求(约束条件)优化所生成的逻辑连接,输出门级网表文件。随着综合工具的不断智能化,使用 RTL 级语言描述硬件电路越来越方便,特别是在 PLD(主要指 FPGA 和 CPLD)设计领域,最重要的代码设计层次就是 RTL 级。

3.6. 门级(Gate Level)

由于目前 FPGA 设计大多数依靠专业综合工具完成从 RTL 级代码向门级代码的转换,所有设计者直接用 HDL 语言描述门级模型的情况越来越少,高效的综合工具将设计者从复杂繁琐的门级描述中彻底解脱出来。目前直接使用门级描述的场合一般是 ASIC 和 FPGA 设计中 某些面积或时序要求较高的模块。门级描述的特点是整个设计用逻辑门实现,通过逻辑门的组合显化描述了设计的引脚、功能、时钟周期等所有信息。

3.7. 综合后门级仿真

综合完成后,如果需要检查综合结果是否与原设计一致,就需要做综合后仿真。在仿真时,把综合生成的标准延时文件反标注到综合仿真模型中去,可估计门延时带来的影响。综合后仿真虽然比功能仿真精确一些,但是只能估计门延时,不能估计线延时,仿真结果与布线后的实际情况还有一定的差距,并不十分准确。这种仿真的主要目的在于 检查综合器的综合结果是否与设计输入一致。目前主流综合工具日益成熟,对于一般性设计,如果设计者确信自己表述明确,没有综合歧义发生,则可以省略综合后仿真步骤。一般情况下,综合后仿真与功能仿真的仿真激励相同

3.8. 布局规划与布局布线

综合的门级结果最终要映射到目标库(如 ASIC 设计)或目标器件(如 PLD 设计)。ASIC 与 PLD 设计的相关流程在此不深究 。

3.9. 布局布线后时序仿真与验证

将最终布局规划或布局布线的时延信息反标注到设计网表中,所进行的仿真就叫时序仿真或布局规划与布局布线后仿真,简称后仿真。布局规划与布局布线之后生成的仿真时延文件包含的时延信息最全,不仅包含门延时,还包含实际布线延时,所以时序仿真最准确,能较好地反映芯片的实际工作情况。一般来说,建议进行时序仿真步骤,通过时序仿真能检查设计时序与芯片实际运行情况是否一致,确保设计的可靠性和稳定性。时序仿真的主要目的在于发现时序违规(Timing Violation),即不满足时序约束条件或者器件固有时序规则(建立时间、保持时间等)的情况。

参考文献

EDA 先锋工作室. 轻松成为设计高手——Verilog HDL 实用精解. 北京航空航天大学出版社, 2012.