Verilog 逻辑综合

本教程经常有提及综合这个词语。或者说有些逻辑不能综合成实际电路,或者说有些逻辑设计综合后的电路会有一些安全隐患。本章就简单介绍下逻辑综合的相关知识,仅从理论层次和普遍认知的角度来阐述。待那个懵懂求知少年变成中年秃顶大叔,再来介绍逻辑综合的具体实践。好像也没有多少时日了(手动狗头)。

1. 基本概念

综合,就是在标准单元库和特定的设计约束基础上,把数字设计的高层次描述转换为优化的门级网表的过程。标准单元库对应工艺库,可以包含简单的与门、非门等基本逻辑门单元,也可以包含特殊的宏单元,例如乘法器、特殊的时钟触发器等。设计约束一般包括时序、负载、面积、功耗等方面的约束。

无论是数字芯片设计,还是 FPGA 开发,现在综合过程基本都是借用计算机辅助逻辑综合工具,自动的将高层次描述转换为逻辑门电路。设计人员可以将精力集中在系统结构方案、高层次描述、设计约束和标准工艺库等方面,而不用去关心高层次的描述怎么转换为门级电路。综合工具在内部反复进行逻辑转换、优化,最终生成最优的门级电路。该过程如下所示。

2. 结构解释

简单的赋值语句通常被综合为基本的逻辑门单元

assign F = (A & B) | C ;

上述代码通常会被综合为如下门级电路:

条件语句通常被综合为选择器

assign F = sel ? A : B ;

上述代码通常会被综合为如下门级电路:

always 块中时钟触发的赋值语句通常被综合为触发器

always @(posedge clk) begin
  q <= d ;
end    

上述代码通常会被综合为如下电路:

再复杂的设计,综合之后,都会被转换为由各种单元库原件组成的门级网表。总之,逻辑综合可以狭隘的理解为,将 Verilog 设计转换为用优化的基本逻辑门单元、特殊的宏单元表示的过程。

13 综合流程

从高层次 RTL 描述到门级网表的详细综合过程如下图所示。

RTL 描述

用硬件描述语言(例如 Verilog)设计数字电路,并进行仿真保证逻辑功能的正确性。

翻译

RTL 描述会被综合工具转换为一个未经优化的中间表示。该过程读入 Verilog 描述的基本原语和操作,不考虑面积、时序、功耗等设计约束,仅完成简单的内部资源分配。

未优化的中间表示

翻译过程中产生的中间表示,数据格式由综合工具内部识别,用户无法也无需了解。

逻辑优化

优化设计逻辑,删除冗余逻辑。该过程往往会将 RTL 设计的一些变量删除,或重新命名,逻辑实现过程往往也会改变,以达到逻辑的最优化实现。该过程会产生优化的内部表示。

工艺映射和优化

此步骤之前,设计的描述过程是独立于目标工艺的。该步骤中,综合工具将使用工艺库(标准单元库)中提供的逻辑单元,实现设计的内部表示。即设计会被映射到目标工艺。实现过程中,还必须满足时序、面积和功耗的约束,执行一些局部的优化。

标准单元库

如之前所述,标准单元库对应工艺库,可以包含简单的与门、非门等基本逻辑门单元,也可以包含特殊的宏单元,例如乘法器、特殊的触发器等。

为了更好的映射与优化,每个逻辑单元,应当包含以下信息:

  • 1、功能描述
  • 2、版图面积
  • 3、时序信息
  • 4、 功耗信息

设计约束

设计约束一般包括时序、面积、功耗等方面的约束。三者之间往往存在制约关系。为了优化时序,可能需要增加硬件资源,导致电路面积增大,功耗增加。为了产生规模更小的电路,又必须在电路速度上进行妥协。数字电路设计时往往要综合各种因素进行取舍。

优化的门级表示

工艺映射与优化完成后,最终会生成由目标工艺库所描述的优化后的门级网表。如果该网表满足各种约束要求,则会被制作成最终的版图。否则还需要修改设计约束或优化 RTL 描述,以获得满足约束要求的门级网表结果。这个过程是反复的,直至最终网表满足要求。

下一章:Verilog 可综合性设计

Verilog 主要用于数字电路设计的描述,但不是所有的描述方式都可以被综合成实际的硬件电路。例如一些用于仿真验证的关键字,属于仿真验证语言,只能在仿真时使用,不能被综合成电路,如系统任务 $dsiplay, ...