第四章 逻辑综合

4.1 逻辑综合概述和基本知识

需要掌握:

  1. 为什么要
  2. 基本原理
  3. 提供哪些文件
  4. 施加哪些约束
  5. 产生哪些结果

回顾设计流程

前端和后端的分水岭

概述

  1. 将行为描述的RTL(HDL语言) 转换到 基于工艺库的门级网表的过程
  2. 工具,Design Compiler(Synopsys)
  3. 决定电路门级结构、时序和面积的平衡、时序和功耗的平衡、增强电路的测试性

三个阶段

synthesis 逻辑综合 = translation 转译 + optimization 优化 + mapping 映射

设计对象 Design Object

  • Design:待综合的整个对象
  • Port:最外部的端口
  • Clock:时钟,单独处理
  • Cell:多个复用的例化的单元
  • Reference and Design:原电路
  • Pin:Cell的引脚
  • Net:内部连线
CLK指的是clock、port、net 还是pin object

时序路径 Timing Path

起点是input port和clock,重点是DFF的D端和output port,划分为四种时序路径

指标

建立时间:时钟到来之前需要保持稳定的时间
保持时间:时钟到来之后需要保持稳定的时间

Design Compiler 流程示意图

  1. 预综合过程(Pre-synthesis Processes)
    1. DC启动
    2. 设置库文件
    3. 创建启动脚本
    4. 读入设计文件
    5. DC中的设计对象
    6. 模块划分
    7. Verilog编码
  2. 施加设计约束(Contrainting the Design)
    1. 设计环境约束
    2. 设计时序约束,等
  3. 设计综合(Synthesizing the Design)
  4. 后综合过程(Post-synthesis Process)

DC的启动

  1. dc_shell-t
  2. dc_shell
  3. design_analyzer
  4. design_vision(-tcl)

自动创建两个日志文件:command.log,view_command.log
记录DC访问过的目录(包括库、源文件等):filenames.log ,退出时自动删除

读入设计文件

两种读入设计文件的方式

  1. read支持多种HDL,(.db, .v, .vhd)
  2. 配对使用analyze & elaborate
    1. analyze 分析HDL源程序,并将产生的中间文件保存于work目录下(或自定义)
    2. elaborate 在产生的中间文件中生成verilog模块或VHDL实体(缺省读取work目录)
    3. 允许设计者在GTECH建立之前,分析设计的语法错误和进行代码转换
    4. analyze 做语法检查 ,产生.syn文件
类别analyzer&elaborateread
格式verilog或VHDLverilog、VHDL、EDIF、db
用途综合verilog或VHDL的TRL设计读网表,设计预编译
设计库用-library选项定义设计库名,存储.syn文件用缺省的设置,不能存储中间结果
Generics(VHDL)可以对parameter进行操作不能对parameter进行操作
Architecture(VHDL)可以进行结构化操作不可用

link命令,将DC存储区的模块或实体连接起来

4.2 标准单元库

概述

  1. 目标库 target_library
    1. 综合后电路网表需要映射到的库,基本单元
    2. .db格式(可由文本格式的.lib转化),DC内部格式,不能由文本打开
    3. 由晶圆厂Foundary提供
    4. 包含门级单元的:行为、引脚、面积、时序信息、功耗等参数
      1. 在逻辑功能相同的情况下,替换单元的大小尺寸
      2. 依据:延迟、面积、功耗
  2. 链接库 link_library
    1. 设置模块或单元电路的引用
    2. 对应IP:存储器、IO、PAD
    3. 注意搜索路径:search_path
  3. 符号库 symbol_library
    1. 定义了单元电路的显示Schematic的库,.sdb
    2. 可视化,查看分析电路时
  4. 算术运算库 synthetic_library
    1. 高性能运算库,加法器(串行进位)→(超前进位)

工艺库:单元时序信息

提供精确的时序

时序模型→单元的详细电路模拟→模拟单元操作的实际情况

阈值:50%VDD

Timing arc 延迟取决于两个因素

  1. 输出负载,引脚电容负载
  2. 输入信号的转换时间

延迟与负载电容直接相关:负载电容越大,延迟越大

时序模型有两种

  1. 线性时序模型,亚微米尺度不准确
  2. 非线性时序模型,二维表
    1. 上升延迟
    2. 下降延迟

Slew值基于库中指定的测量阈值

Vdd 的 30%~70%

转换Derate系数

通常为0.5。阈值为30%~70%
必须乘以0.5,以获得相对应的转换时间。表中实际为10%~90%

组合逻辑单元和时序逻辑单元的时序模型

4.3 时序约束

约束驱动(constrain-driven)

如何给电路施加约束条件:时许约束面积约束

定义面积:

(小技巧,预先综合标准而输入与非门,查看report)

  1. 两输入与非门,1
  2. 晶体管,4
  3. 实际面积,其他值

时序路径约束:

  1. 输入->寄存器
  2. 寄存器->寄存器
  3. 寄存器->输出
  4. 输入->输出

以时钟为基准计算路径延迟

定义时钟:

  1. 时钟远点
  2. 时钟周期

dont_touch,在综合阶段不对Clk信号优化

方法:

  1. 定义时钟
  2. 定义I/O相对于时钟的时序
    1. 定义输入延迟:被综合模块外,寄存器触发的信号 -> 被综合模块之前的延时

小练习

create_clock -period 20 [get_ports CLK]
set_dont_touch_network [get_clocks CLK]
set_input_delay -max 7.4 -clock Clk [get_ports A]

定义输出延迟

DRC约束

  1. set_max_transition:
    1. data transition time, clock transition time(小)
    2. 负载越大,transition time 越大
    3. 约小约严格
  2. set_max_fanout:
    1. 对design,net,output,port操作,无量纲数,表示相对负载的数目,不是真实电容值
  3. set_max_capacitance

以上三个由工艺厂商提供,我们可以约束得更紧

4.4 环境约束

遗漏的约束

  1. 供电电压、外界温度
  2. 电平转化时间
  1. 操作条件
  2. 负载
  3. 驱动强度
  4. 线载模型

设置负载,set_load

设置外部驱动强度, set_driven_cell

设置工作条件,工艺P、电压V、温度T
best case(hold time),typical case,worst case(setup time)

连线负载模型
估算连线延迟 -> 连线的扇出 -> 根据扇出查表,得出长度 -> 计算出它的电阻和电容
根据综合出来模块的大小(不同gates数)选择负载模型

连线负载模式

  1. 围绕型(enclosed)
  2. 顶层(top)
  3. 分段(segmented)

检查约束是否施加成功的命令

  1. check_timing,检查是否有路径没有加入约束
  2. check_design,检查悬空或短接的情况
  3. write_script,将施加的约束和属性写到一个文件中,检查文件是否正确

保存.db文件
保存网表
保存.sdf
面积报告、时序报告、约束违例

时序报告的主要内容

  1. 表头
  2. 数据发射路径
  3. 数据捕获路径
  4. 时序结果

4.5优化电路的常用方法

DC进行优化的目的,权衡timing和area约束

优化基于用户对design所施加的约束

  1. design rule constraint (DRC):transition、fanout、capacitance
  2. optimization constraint:delay、area

DC的优化策略

  1. 数据通道
  2. 状态机
  3. 布尔逻辑

creating path groups,划分path group,指定DC专注于该路径优化。默认根据不同时钟划分path group。

optimizing near-critical paths,在关键路径附近指定范围之内的所有路径(设定为时钟的10%)。默认情况只优化关键路径(slack最差的路径)

performing high-effort compile,在关键路径上重新综合,对其周围的逻辑restructure和remap

  1. compile_ultra command
  2. compile command

increamental , 只进行门级(gate-level)优化

gate-level optimizations,通过选择库中的合适的标准单元来对电路进行优化,分为三个阶段执行

  1. delay optimization,DC对电路进行局部调整
  2. design rule fixing,插入buffer,调整单元大小等来满足DRC约束
  3. area recovery,不会引起DRC和delay违例,一般只是对非关键路径进行优化

Automatic ungrouping,取消设计层次,移出层次边界,通过共享减小面积

adaptive retiming,在时序路径上前后移动寄存器(具有相同时序约束),提高电路的时序性能。

high-level optimization and datapath optimization,对数据通路优化

  1. 树形结构,a+b+c+d -> (a+b)+(c+d)
  2. 逻辑简化, (a*3*5) -> (a*15)
  3. 资源共享
  1. 使用design ware库
  2. 数据路径提取
  3. 对加乘进行重新分配
  4. 比较器共享
  5. 优化并行的常数相乘
  6. 操作数重排

verifying functional equivalence,优化导致网表与RTL的不一致,使用formality工具进行一致性检查

partitioning for Synthesis

  1. 不要让一个组合逻辑电路穿越多个模块
  2. 寄存模块的输出
  3. 根据综合时间长短,控制模块大小
  4. 将同步逻辑部分与其他部分分离

4.6 Synopsys TCL 语言

TCL = tool command language

  1. Builtin commands
  2. Application commands
  3. User defined commands

使用TCL获取电路并解析

  1. get_ports portsName,返回对应portsName的ports object
  2. get_ports *, 返回所有ports object
  3. get_cells cellsName,返回对应cell的instance name object
  4. get_nets netsName,
  5. 返回有多少个net
    1. TCL支持,llength [get_object_name [get_nets *]]
    2. synopsys TCL支持,sizeof_collection [get_nets *]
  6. get_pins pinsName
  7. 获得属性 get_attribute
    1. ref_name
    2. owner_net
    3. direction
    4. full_name
  8. -f 过滤属性,获得想要的object
    1. get_ports * -f “direction ==in” ,得到所有方向是input 的port
  9. get_* [object] -of, 得到与你指定object相连的object

小测验

作业

发表评论

您的电子邮箱地址不会被公开。