数字电路综合基础

参考:

数字集成电路设计流程是怎样
专业集成电路设计实用教程[M]. 虞希清

逻辑综合基本步骤

综合是将RTL转换成门级网表(gate-level netlist)的过程。综合过程分为转换(translation),优化(optimization)、映射(mapping)。综合工具先通过read命令将RTL代码转化成通用的布尔等式,即GTECH (generic technology)。然后执行compile命令,根据设计者施加的延时,面积等约束,对网表进行优化。最后将RTL网表映射到工艺库上,成为一个门级网表。门级网表输入到布局布线工具,由它产生GDSll文件,验证正确后,交付芯片生产商制造。

综合以时序路径为基础进行优化。DC在对设计做综合时,其过程包括了进行静态时序分析(static timing analysis STA)。DC使用内建的时序分析器把设计分解成多条时间路径,然后根据设计的约束对路径进行优化。如果某条路径的延时大于约束的值,则时序违例。也可以用Prime Time作静态时序分析。PT是独立的时序分析器,主要用于整个芯片门级电路的静态时序分析。

输入文件:

  • RTL文件
  • 工艺库(.db)
  • 约束文件

输出文件:

  • 门级网表,用于布局布线,时序后仿
  • 标准延时文件SDF。用于时序仿真(后仿)
  • 各种报告:timing report,area report, constrained report, clock report,Violation report等文件

一些库的介绍说明:

a) 工艺库(target_library):工艺库是综合后电路网表要最终映射到的库,读入的HDL代码首先由synopsys自带的GTECH库转换成Design Compiler内部交换的格式,然后经过映射到工艺库和优化生成门级网表。工艺库他是由Foundary提供的,一般是.db的格式。这种格式是DC认识的一种内部文件格式,不能由文本方式打开。.db格式可以由文本格式的.lib转化过来,他们包含的信息是一致的。
b) 链接库(link_library):link_library设置模块或者单元电路的引用,对于所有DC可能用到的库,我们都需要在link_library中指定,其中也包括要用到的IP。此处还要将search_path加进来,这样才能找到.db文件,否则只会搜索当前目录。
c) 符号库 (symbol_library):symbol_library是定义了单元电路显示的Schematic的库。用户如果想启动design_analyzer或design_vision来查看、分析电路时需要设置symbol_library。符号库的后缀是.sdb,加入没有设置,DC会用默认的符号库取代。
d) 综合库 synthetic_library:它包含了一些可综合的与工艺无关的 IP。 dw_foundation.sldb 是Synopsys 提供的名为 Design Ware(important)的综合库,它包含了基本的算术运算逻辑、控制逻辑、可综合存储器等 IP,在综合是调用这些 IP 有助于提高电路性能和减少综合时间。
例: set synthetic_library dw_foundation.sldb

设计约束

约束的目的是模拟芯片真实的工作条件,并查看综合后的门级网表能否在此条件下正确工作。综合过程除了要满足时序要求,还要考虑面积,功耗等因素。
常用约束命令:
时钟约束:creat_clock,set_input_delay,set_output_delay,create_generated_clock
设计环境约束:set_driving_cell,set_load,set_wire_load_model,set_operating_conditions,
设计规则约束:set_max_fanout,set_max_capacitance,set_max_transition
报告命令有:report_clock,report_design,
清除约束命令有:reset_path,reset_design
设置面积目标命令:set_max_area

时钟约束

时钟约束决定了路径的最大延时。

创建时钟

creat_clock -period 10 -n clk [get_ports CLK]

考虑时钟抖动(jitter)偏差(skew)

set_clock_uncertainty 0.1 clk //单位ns

考虑时钟转换时间(transition)。只需在版图前考虑,版图之后不考虑。

set_clock_transition 0.25 clk

考虑时钟延时(latency)。
在这里插入图片描述

set_clock_latency -source 3 [get_clocks CLK]
set_clock_latency 1 [get_clocks CLK] //pre layout
set_propagated_clock [get_clocks CLK] // post layout

输入端口延时

set all_in_ext_clk [remove_from_collection [all_inputs] [get_ports CLK]]
set clk_to_q 6
set_input_delay -max $clk_to_q -clock CLK $all_in_ext_clk

输出端口延时

set_output_delay -max $clk_to_q -clock CLK [all_outputs]

设计环境约束

路径延时由门单元(cell)延时和线(wire)延时决定。门单元延时由非线性延时模型(non-linear delay model)算出。半导体厂商提供的工艺库中有一个二维表格,根据门单元的输出负载输入转换时间找到门单元的延时和输出转换时间。线延时一般用线负载模型算出(wire load model)。
设计环境约束是为了精确的计算输入/输出路径延时。对于输入路径,需要知道输入转换时间,对于输出路径,需要知道输出负载。
在这里插入图片描述
输入路径
用set_drving_cell命令说明输入端口由一个真实的外部单元驱动。

set_driving_cell -lib_cell FD1 -pin Q [get_ports IN1]

输出路径
使用set_load命令说明输出端口上的外部电容负载

set_load 5 [get_ports OUT1] //在输出端口上指定一个常数负载值
set_load [expt [load_of my_lib/AND/A] *3 ] [get_ports OUT1] //将工艺库中门单元引脚的负载加载到输出端口上

假设设计者不知道输入驱动单元和输出负载,可用下面规则产生负载预算(budget)

  • 驱动单元为驱动能力弱的单元驱动
  • 使用set_max_capacitance限制每一个输入端口的输入电容
  • 估算输出端口的驱动模块数量

设计规则约束

设计规则由半导体厂商提供的工艺库决定。这些规则按优先级排序包括,最大电容负载,最大转换时间,最大扇出。如果设计中单元的驱动负载超过设计规则给定的最大电容负载,半导体厂商不能保证芯片能正常工作。

set_max_capacitance设置一个节点的最大电容。

从工艺库找出设计中预期驱动器的最大允许电容负载
set DRIVE_PIN TECH_LIB/invla27/Y
set MAX_CAP [get_attribute $DRIVE_PIN max_capacitance] // 假设为3.6
在驱动器增加一些富裕量使DC不会满载
set CONSERVATIVE_MAX_CAP [expr $MAX_CAP / 2.0] // 值为1.8
set_max_capacitance $CONSERVATIVE_MAX_CAP [get_ports IN1]
set_load 1.2 [get_ports IN1]
DC可以给输入端IN1施加的最大内部负载是 1.8-1.2 = 0.6pF

set_max_transition设置一个节点的最大转换时间
max_transition的值一般不要超过预期驱动器的最大允许转换时间。

set_max_fanout设置一个节点的最大扇出值。注意这里的值不是值扇出数目,而是扇出负载的值。
例如,set_max_fanout 6 [get_ports IN]

get_attribute INV1/A fanout_load // if 0.25
get_attribute INV2/A fanout_load // if 3

则IN这个节点可以接24个INV1,或者两个INV2

复杂时序约束

多时钟同步设计

设计中所有的时钟信号都来自同一个时钟源。例如对200M时钟进行2分频,4分频,分别送给A,B两个模块。A,B模块有信号互相传输,对B模块约束时,可先定义虚拟时钟,用虚拟时钟对输入输出信号进行约束。

creat_clock -period 10 -name CLKA
creat_clock -period 20 -name CLKB [get_ports CLKB]
set_input_delay -max 12 -clock CLKA [get_ports IN1]
set_output_delay -max 12 -clock CLKA [get_ports OUT1]

异步设计

异步电路时钟来自于不同时钟源,时钟之间是不同频率或同频不同相的关系。对于穿过异步边界的任何路径,我们不需要对此做任何优化,因为不同时钟的之间的相位关系是不确定的。使用set_false_path命令对这些路径做优化。

set_false_path -from [get_ports CLKA] -to [get_ports CLKB]

该命令除了约束异步路径,还用于约束“伪路径”,物理上存在,但没有数据传输。用report_timing_requirements -ignored命令报告无效路径。要去掉任何不要的例外,可使用reset_path命令。

多时钟周期

假设时钟周期为10ns,加法器的延时约为6个时钟周期,则加法器允许的最大延时是:
60-T_setup-T_uncertainty-T_clk_q
加法器的最小延时是:
T_hold+T_uncertainty
约束脚本如下:

create_clock -period 10 [get_ports CLK]
set_multicycle_path -setup 6 -to [get_pins C_reg[*]/D]
set_multicycle_path -hold 5 -to [get_pins C_reg[*]/D]

意思是在在第5个时钟周期时检查保持时间,在第0个时钟周期时检查建立时间。
在这里插入图片描述

门控时钟

门控是低功耗设计的有效方法,常用带锁存器的门控电路:
在这里插入图片描述

DC能自动辨认门控时钟电路,综合时,根据下面的约束在门控时钟电路中增加/删除逻辑以满足使能信号的建立和保持时间要求

set_clock_gating_check -setup 0.5 -hold 0.5 [current_design]

分频电路和多路传输电路的时钟约束

对于带时钟选择的电路,可使用set_disable_timing命令或set_case_analysis命令:
在这里插入图片描述

create_clock ext_clk -period 10
create_clock test_clk -period 100
set_dont_touch_network [get_clocks ext_clk]
set_dont_touch_network [get_clocks test_clk]
set_disable_timing CLOCK_GEN/U1 -from 1 - to y
也可以使用set_case_analysis命令
set_case_analysis 0 [get_pins U1/sel]

对于分频器产生的时钟,使用create_generated_clock命令。

create_clock -period 50 [get_ports ext_clk]
create_generated_clock -name int_clk -source [get_pins CLOCK_GEN/U2/CP] -divide_by 2

猜你喜欢

转载自blog.csdn.net/zhong_ethan/article/details/109205047