tianfei1201

不一定是最完美的,但会是最细致的!My email:tianfei@ict.ac.cn

导航

逻辑综合

Posted on 2012-10-12 16:34  tianfei1201  阅读(1896)  评论(0编辑  收藏  举报

4.1 逻辑综合概述
4.1.1 逻辑综合的概念

 

综合(synthesis):就是把思想转换为实现欲想功能的可制造的设计。综合是约束驱动 和基于路径的。
在这里,综合也就是把行为级或 RTL 级的 HDL 描述转换为门级电路的过程,用公式表示 就是:
综合等于  = 翻译  + 优化  + 映射
( Synthesis  = Transiation  + Optimization  + Mapping  ) 用图形表示就是:(见图 4.1)


图 4.1 综合的概念

4.1.2 逻辑综合的工具介绍

。工具操作界面

设计编译器(Design Compiler 简称 DC)是 Synopsys 综合工具的核心。综合一个设计 时,可以选用两种界面: A 。设计分析器(Design Analyzer 简称 DA)-图形窗口界面。 B 。 dc_shell—命令行界面。
DA 图形窗口界面的启动:%da
dc_shell 命令行界面的启动;%dc_shell
dc_shell 界面的提示符为:dc_shell  >
dc_shell 命令行界面支持两种脚本语言:dcsh 模式和 dctcl 模式。
dcsh 是使用源于 Synopsys 的语言。 dctcl 使用工具命令语言( Tool Command Langugae )。
dcsh 模式和 dctcl 模式比较
tcl 是一种开放型的工业标准语言。它比 dc_shell 更加强大。
启动 dcsh 模式用 dc_shell 命令,启动 dctcl 模式用 dc_shell  -t

 


如果你已经有了 dcsh 的 setup 文件或脚本文件(.scr),你想转换为 Tcl 的 setup 文件和约束文件,则我们只需执行下面命令即可.
setup 文件的转换:
设 dcsh 的 setup 文件为.synopsys_dc.setup.old,要转换为 Tcl 的 setup 文
件.synopsys_dc.setup 则
% dc-transcript  .synopsys_dc.setup.old  .synopsys_dc.setup 脚本文件的转换:
设 dcsh 的约束文件为 old_scriptfile.scr,dctcl 的约束文件为 tcl_script.tcl ,则 % dc-transcript old_scriptfile.scr tcl_script.tcl
由于 dcsh 和 dctcl 是可以转换的,以下的介绍中,在支持 dcsh 的地方,将都用 dcsh 命令。
。Synopsys 格式
大多数 Synopsys 产品都支持和共享一个公用的中间结构--”db”格式。 db 文件是描述
文本数据的二进制已编译表格式。 DC 可以读和写以下的所有格式: Verilog , VHDL ,
EDIF 。
逻辑综合的流程
流程图如图 4.2 :
 


图 4.2 逻辑综合设计流程

4.2  setup 文件,库以及一些基本概念
4.2.1    setup 文件

把行为级描述转换为门级电路,在映射过程种,必须有技术库的支持,否则它将找不 参照的元器件。为此我们在综合前必须在 setup 文件中设置好综合所需的技术库。这里所 需的技术库的格式为.db 和.sdb 格式。技术库的描述略。
Synopsys 的设计编译器(Design Compiler,简称 DC)提供了三个同名的 setup 文
件.synopsys_dc.setup 。一个为安装目录下的 setup 文件,它提供系统管理员指定的系统变量设置。一个为你根目录下的 setup 文件,它提供你的工作环境变量的设置:公司的名 字,你的名字,背景色。这是由用户指定的 DC 值。
一个为你工作目录下的 setup 文件,它规定了你设计所指定的 DC 值,如:
search path, target library, link library  , symbol library.
启动 DC 工具时,它依次读入这三个文件,且读的越后的文件优先级别更高,即相同的

变量,后面的设置值将覆盖前面的设置。
 根目录下的 setup 例子如下:
company  =  “ your_company”;
designer  =  “your_name”;
view_blackground  =  “black”;
工作目录下的 setup 文件例子如下:
dcsh 模式:
searsh_path  =  {}  + search_path
link_library  =  {MTC45000.db};
target_library  =  {MTC45000.db};
symbol_library  =  {MTC45000.sdb};
define_design_lib work  -path work  ;
Tcl 模式:
set search_path  [concat  [list]  $search_path]
set link_library  [list MTC45000.DB]
set target_library  [list MTC45000.db]
set symbol_library  [list MTC45000.sdb]
define_design_lib work  -path work
说明:
search_path:为 DC 提供未分析设计标准的搜寻路径,亦即你的技术库的搜寻路径。
 如果你的库不是放在 DC 的安装目录下的库的目录下,则你还需修改你的 search+path,
 指定库的目录。方法是:
dcsh 模式:
search_path  =  {directory}  + search_path dctcl 模式:
set search_path  [concat  [list directory]  $search_path] link_library:
指明了你的设计所参照的子设计的位置。 DC 根据 link_library 寻找它所参照的设 计。如果参考设计的完整名字在 link_library 里没有定义,则需在 search_path 中包括这 参考设计的路径。 link_library 定义了被单独使用的元器件的库的名字。即,
link_library 里的元器件是不被 DC 所 inferred 的。


4.2.2 库

target_library:
指明了在你优化设计时用到的元器件的库。
symbol library:指明了含技术库元件的图形描述的库。


4.2.3 对象
在进行综合时,我们经常会遇到一些对象的概念。搞清楚这些概念具体是指代什幺是 很有必要的。
Design: 对应于执行一定逻辑功能的电路描述。 design 可以是独立的一个,也可以含有其他的子设计。子设计虽然可以是设计的一部分,但是 Synopsys 也把它看成是一个设计。
 Cell: 是 design 中的子设计的一个 instance 。在 Synopsys 的术语中, cell 和
instance 被认为是一样的。
Reference: cell 或 instance 参考的源设计的定义。
Port: 指主要 inputs,outputs 或 design 的 IO 管脚。
Pin: 对应于设计中的 cell 的 input,output,或 IO 管脚。
Net: 这是信号的名字,即通过连接 ports 与 pins 或 pins 与 pins 而把一个设计连在一 起的的金属线的名字。
Clock: 作为时钟源的 port 或 pin..
library: 对应于设计的综合目标或参考连接的工艺指定单元的集合。 具体示例如图 4.3 :
 

图 4.3  对象

 

4.3 设计分块

分块(partitioning):把复杂的设计分成各个小部分的过程。
Partitioning  = Divide  +Conquer
概念如图 4.4

 
图 4.4 分块的概念


 

分块是成功的进行综合和布局布线的关键。传统上的分块是根据逻辑功能,而不考虑综合的。固定的边界降低了综合结果的质量,使优化难以进行。正确的给设计分块能大大的增 强设计结果,而且降低编译的时间和简化脚本的管理。
以下是分块的几条建议:
1.   把相关的组合逻辑保留在同一模块中;
2.   考虑设计的重用;
3.   根据它们的功能划分模块;
4.   把结构逻辑和随机逻辑分开;
5.   合理的块大小(每个块最大大约为 10K 个门);
6.   把顶层分块出来(独立 I/OPads,边界扫描 Boundary Scan  ,核心逻辑,Clocks);
7.   顶层避免存在 glue-logic;
8.   把状态机和其他逻辑独立开来;
9.   避免在一个块中存在多时钟;
10.  把用来同步多个时钟的块独立出来;
11.  分块时考虑你的版图设计。
块的产生: entity 和 module 语句定义了层次的块。 entity 或 module 的示例也产生了一个新层。算术电路(  +,-  ,*,。。)的 inference 也能产生新层。 process 和 always 语句不会产生层次。
逻辑优化并不能穿过块的界线。最好的分块是把相关的组合逻辑和它的目的寄存器聚集在同一个块中。这样组合优化技术能被完全的利用,时序优化也可以吸收一些组合逻辑到复杂的触发器中(JK,T,Clock-enabled)。好的分块如图 4.5 所示:

 

 

图 4.5 最佳的分块

什幺是 glue-logic :就是用一个组合逻辑把几个块结合起来,这个组合逻辑就是 glue logic.由于这 glue logic 不能被吸收,优化是被限制的,要删除这 glue logic,我们把这 NAND 放进后面的逻辑电路中。这样 glue logic 就可以和其他逻辑一起优化了。顶层设计只 能是一个结构的网表,不需要被编译。换句话说,就是顶层不能含 glue logic ,当然其他 层最好也是不要存在 glue logic 。
分块时各个块的大小最好不要相差太大,因为,太小多余的边界将限制优化,太大编 译的时间又太长。尽量减少不必要的层。编写 HDL 源代码时每一个块的输出最好都是通过 寄存器实现,这样可以可以简化约束的说明和方便优化。 input delay 和 output delay 可 以不用设置。块的名字必须和文件名相同,否则在分析是将会出错。
初始的分块由 HDL 定义。不满意的话, DC 可以进行调整。 DC 分块的命令是 group 与 ungroup.
例如我们把两个块 U1,U2 合并为一个块 U23,则转到当前层后 group  {U1,U2}  -cell_name U23
ungroup  {U23}
命令的具体应用请查看在线帮助。


4.4 读进设计

DC 的输入格式可以是 Verilog HDL,VHDL 等硬件描述语言,可编程逻辑阵列(PLA), EDIF2000 ,格式。
对于 HDL 格式, DC 要求用 analyze 和 elaborate 读进设计。
analyze :读进 VHDL,或 Verilog 文件,检查语法和可综合逻辑,并把设计已中间格式 存在设计工作库(WORK)中。 analyze 后,在 DA(Design Analyzer)中并看不到有什幺东西出 现。 analyze 命令可以同时对若干个文件执行操作。
elaborate :从工作库中把 analyze 后的中间文件转换为一个设计。 elaborate 命令 用综合的操作符代替 HDL 的操作符,且决定正确的总线大小。 elaborate 命令后,在 DA 中 你可以看到出来了一个一个的模块。一个文件一个,即一个 entity 或 module 一个。
elaborate 一次只能对一个文件进行操作。这点需要注意。
在这里我们需要提醒一下的是, entity 或 module 的名字,即设计的名字必须和文件
 

名相同。因为 analyze 后它存在 WORK 里的名字是设计的名字(entity or module)而不是你源程序的文件名,所以如果你 elaborate 的是文件名,那幺如果设计和文件名不同, DC 将 找不到你的设计,出现 error 。当然如果你不厌其烦的特别让 elaborate 他的设计名,这 问题就不存在了。
对于其他非 HDL 文件, DC 用 read 命令读进设计。
read 命令并不产生中间文件,而是之间把他转换为了 DC 里的符号。
理论上, read 可以读进所以的设计,不管是不是 HDL 文件,但是建议对 HDL 文件用 analyze 和 elaborate 读。
对于 VHDL 的 package 文件,我们应该用 read 命令读,且必须在读进 VHDL 源程序前读。
 

4.5 设计约束
为了从 DC 中能得到合适的结果,设计者必须通过描述其的设计环境,目标任务和设计规则来系统的约束其设计。约束包含时序和面积信息。它们通常是从规格说明中提取出来的。 DC 用这些约束去综合和优化设计以符合其目标任务。本文只讲些最常用的约束命令,且不会讲的很详细。约束命令的具体用法请 参照在线帮助。
 

4.5.1 设计环境
几个环境变量含义如图 4.6 所示:

 


图 4.6 环境变量
 

 


图 4.7 时序图

set_operating_conditions :描述了设计的工艺,电压和温度等条件。通常以
WORST,TYPICAL,BEST 的情况进行描述。技术库通常具有正常情况的的特性。为了查找芯片

商提供的运行环境,我们可以用 report_lib libname 命令。
set_operating_conditions  例子:
dc_shell> current_design  =  “addtwo”
dc_shell> set_operating_conditions  -max  “typ_124_4.50” 最坏(即最慢)的运行条件是最低的电压和最高的温度。
最好(即最快)的运行条件是最高的电压和最低的温度。
对于设置 the best case 的运行条件是:
set_operating_conditions  -max WORSTC_OPCONDS  -min BESTC_OPCONDS
如果你想检查你的设置,你可以用 report_port  -verbose,write_script 和 report_design 命令。
set_load: 定义了输出单元总的驱动能力。
set_load   
例子:
直接指定一个值: dc_shell> set_load  4 find  (port OUT1)
利用 load_of(lib/cell/pin)命令把技术库的门作为负载数的衡量: dc_shell> set_load load_of(CBA/AN2/A) find  (port OUT1)
load_of(lib/cell/pin)可以乘以系数:
dc_shell> set_load load_of(CBA/IVA/A)  *  3 find  (port OUT1)
set_driving_cell: 模拟了驱动输入管脚的的驱动单元的驱动电阻。定义了信号到达输入管脚的传输时间,可以直接指明驱动输入管脚的外部实际单元。