--- title: Josh 的学习笔记之 Verilog(Part 1 —— 初识 HDL 设计方法) date: 2020-11-27 22:58:07 tags: - Verilog - HDL - 硬件描述语言 - 行为级 - RTL - 寄存器传输级 categories: - [Verilog, Verilog 简介] - [Josh 的学习笔记, Verilog] mathjax: true comments: true copyright: true sticky: false toc: enable: true number: false wrap: true expand_all: true max_depth: 4 abbrlink: 460433dd --- 本文阐述了 HDL 语言/设计方法的基本概念。主要介绍了数字系统建模方法的演变,引入了 HDL 语言的基本概念,对 Verilog HDL 和 VHDL、Verilog HDL 和 C 的联系与区别进行了说明,在最后引入了 HDL 的设计和验证流程,并对各个流程进行了简单介绍。 # 1. 设计方法的变迁 随着微电子设计技术与工艺的发展,数字集成电路从电子管、晶体管、中小规模集成电路、超大规模集成电路(Very Large Scale Integrated Circuit, VLSIC)逐步发展到今天的专用集成电路(Application Specific Integrated Circuit, ASIC),愈发数字化的产品如计算机、手机、数字电视等都运用了复杂的专用数字集成电路。数字逻辑器件从简单的逻辑门到复杂的 SoC,种类繁多,提供了对复杂系统的灵活支撑。 随着数字电路系统的不断发展,系统的逻辑复杂度与规模日益增加,数字系统的设计方法也随之不断演进。早期简单的门逻辑设计阶段,EDA 工具应用范围十分有限,工程师们习惯于使用**{% label @卡诺图 %}**简化设计,然后通过面包板等实验系统验证设计;系统相对复杂后,工程师们借助 EDA 工具通过原理图描述数字系统。 {% note default %} 原理图由元件库中的元件构成,使用 EDA(Electronic Design Automation,电子设计自动化)工具可以对原理图进行仿真并分析其性能。 {% endnote %} 当数字系统发展到 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 电路描述解析到门级,这些将大大节约设计与仿真时间,这个**{% label @从高层次的电路描述通过 EDA 工具解析到门级等低层次的电路描述的过程就叫“综合”(Synthesize),或者逻辑综合 %}**。 {% note default %} 综合工具能将高层次的 HDL 语言、原理图等设计描述翻译成由与、或、非门等基本逻辑单元组成的门级连接(**网表**)并根据设计目标与要求(约束条件)优化所生成的逻辑连接,输出门级网表文件。 {% endnote %} 目前最成熟的综合工具是 RTL 级综合工具,它能将 RTL 级描述翻译并优化为门级网表。综合工具的产生支撑了直接从 RTL 级描述硬件电路,这种从门级描述抽象到 RTL 级描述数字电路是设计方法的又一次伟大飞跃。 从上面描述可以看到 HDL 语言是分层次的,关于上述 HDL 语言设计层次的含义在 [3. HDL 的设计与验证流程](#03)小节和 [《Part 3——描述方式和设计层次》的 5. 设计层次](https://josh-gao.blog.csdn.net/article/details/105262549#5__1023)小节有详细论述。) # 2. Verilog 语言的特点 ## 2.1. Verilog 的由来 Verilog 是 Verilog HDL 的简称。 {% note info %} Verilog 语言最初于1983年由 Gateway Design Automation 公司开发,于1995年接受为 IEEE 标准。 {% endnote %} 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 个基本概念: - **{% label primary @互连(connectivity) %}**:硬件系统中,互连是非常重要的组成部分,而在 C 语言中并没有直接可以用来表示模块间互连的变量;而 Verilog 的 `wire` 型变量配合一些驱动结构能有效地描述网线的互连。 - **{% label primary @并发(concurrency) %}**:C 语言天生是**串行**的,不能描述硬件之间并发的特性,C 语言编译后,其机器指令在 CPU 的高速缓冲队列中基本是顺序执行;而 Verilog 可以有效地描述并行的硬件系统,硬件系统比软件系统速度快、实时性高的一个重要原因就是硬件系统中**各个单元的运算是独立的,信号流是并行的**。 - **{% label primary @时间(time) %}**:C 程序运行的时候,没有一个严格的时间概念,程序运行的时间长短取决于处理器本身的性能;而 Verilog 语言本身定义了绝对和相对的时间度量,在仿真时可以通过时间度量与周期关系描述信号直接的时间关系。 2. HDL 语言的本质 硬件描述语言(HDL)同软件语言(如 C、C++ 等)是有本质区别的。Verilog 作为硬件描述语言,**它的本质作用在于描述硬件**。Verilog 虽然采用了 C 语言形式,但是它的最终描述结果是芯片内部的实际电路。所以评判一段 HDL 代码优劣的最终标准是其描述并实现的硬件电路的性能(包括面积和速度两个方面)。评价一个设计的代码水平较高,仅仅是说这个设计由硬件向 HDL 代码这种表现形式转换得更流畅、合理。而一个设计的最终性能更大程度上取决于设计工程师所构想的硬件实现方案的效率以及合理性。 {% note warning %} 初学者,特别是由软件转行的初学者,片面追求代码的整洁、简短,这是错误的,是与评价 HDL 的标准背道而驰的。正确的编写代码的方法是,首先要做到对所需实现的硬件电路“胸有成竹”,对该部分硬件的结构与连接十分清晰,然后再用适当的 HDL 语句表达出来即可。 {% endnote %} 3. Verilog 与 C 的结合 Verilog 毕竟是硬件描述语言,在抽象层次上比 C 语言要差一些,语法不如 C 灵活,例如文件输入和输出方面,Verilog 的功能显然不如 C。为了克服 Verilog 高级抽象的缺陷,Verilog 的设计者们发明了 PLI。PLI 可以在仿真器中将 C 语言的程序和 Verilog 的程序互相通信,或者在 Verilog 中调用 C 语言的函数库,这样就大大扩展了 Verilog 语言的灵活性和高层次抽象的能力。开发时,一方面,硬件设计者使用 Verilog 进行硬件建模;另一方面,验证工程师却常常使用 C 来编写测试向量,然后通过 Verilog 的 PLI 将 Verilog 和 C 联系起来。这样,C 语言就很好地弥补了 Verilog 高层次建模的缺陷。 # 3. HDL 的设计与验证流程 HDL 的基本功能就是有效地描述并仿真硬件系统。在此部分,抛开具体的 PLD 或 ASIC 设计流程,从 HDL 语言层次入手,分析典型的 HDL 设计与验证流程。基于 HDL 的设计、仿真流程如下图所示。图中,虚线框表示的步骤可以根据项目的复杂度省略,而实线框表示的步骤为必须执行的步骤。