Design Compiler常用命令大总结~

Design Compiler常用命令大总结~

目录

Design Compiler常用命令大总结~

1.读取RTL级代码

方式①——read_verilog

方式②——analyze&elaborate

2.一些常用的约束(时序、环境)

对于内部路径的时序约束(reg-to-reg)

①create_clock

②set_clock_uncertainty

③set_clock_latency

④set_clock_transition

对于输入路径的约束(port-to-reg)

①set_input_delay

②set_input_transition

③set_driving_cell

对于输出路径的约束(reg-to-port)

①set_output_delay

②set_load

3.综合命令compile_ultra

自动取消分组(auto ungroup)

①set_ungroup

②compile_ultra  -no_autoungroup

边界优化

① compile_ultra  -no_boundary

扫描寄存器及自动移位寄存器识别

①compile_ultra   -scan

时序QoR集中优化

①compile_ultra  -timing_high_effort_script

寄存器复制

①compile_ultra  -timing

自适应重定时(Adaptive retiming)和寄存器重定时(Register retiming)

①compile_ultra  -retime

用户自定义多个路径组(group)

①group_path  -name

①report_path_group


1.读取RTL级代码

方式①——read_verilog

read_verilog  {A.v B.v Top.v} #读取RTL文件
current_design    Top.v #设置当前设计
link
check_design #检查RTL代码是否正确

方式②——analyze&elaborate

analyze -format varilog {A.v  TOP.v}
elaborate    MY_TOP

2.一些常用的约束(时序、环境)

在DC中,通常是基于路径(PATH)进行时序约束。将一个完整的RTL级代码的所有路径可分为以下三种:

  • 输入路径(输入端口寄存器D端
  • 内部路径(寄存器clock端寄存器D端
  • 输出路径(寄存器clock端输出端口

对于内部路径的时序约束(reg-to-reg)

create_clock
create_clock  -period  2  [get_ports  clk]

定义一个时钟周期为2ns,此时时钟网络为理想的时钟网络。为了更加贴合实际的工作环境,需要预估不确定性(uncertainty = skew+jitter+margin)、延迟(Latency)和转换时间(Transition)并将其建模以便更准确的表示时钟行为;

 对于纯组合逻辑时序约束

设置虚拟时钟

create_clock    -name VCLK    -period 2
'''
-name 必须命名
'''
②set_clock_uncertainty

设置时钟网络中可能会出现的一些不确定情形;

set_uncertainty  -setup  Tu  [get_clocks clk]
'''
-setup:    建立时间
-hold:     保持时间
无:        既给建立时间设置,又给保持时间设置
'''
③set_clock_latency
  • 源延时模型(Source Latency):从实际时钟源晶振产生clock的地方)到create_clock端口或pin的延迟;
  • 网络延时模型(NetWork Latency):从create_clock端口或引脚寄存器时钟引脚的平均“内部”延迟;
set_clock_latency  -source  -max  0.3  [get_clocks clk]
set_clock_latency  -max  0.3  [get_clocks clk]
'''
-max  ———— 建立时间
-min  ———— 保持时间
'''
④set_clock_transition
set_clock_transition  Tt  [get_clocks  clk]

对于输入路径的约束(port-to-reg)

set_input_delay
单个输入端口A进行约束:
set_input_delay  -max  0.6  -clock  clk  [get_ports A]
#-max 外部可消耗的最大delay
所有输入端口(时钟端口clk除外)进行约束:

所有输入端口的输入延迟都相同

set_input_delay    -max    0.6    -clock clk  \
          [remove_from_collection    [all_inputs] [get_ports clk]]
'''
1. "\"表示换行
2. remove_from_collection
3. all_inputs
'''

另一种方式,部分端口输入延迟相同

set_input_delay    -max 0.5    -clock clk [all_inputs]
set_input_delay    -max 0.8    -clock clk [get_ports C] #该命令可覆盖上一命令中对端口C的时序约束
remove_input_delay [get_ports clk]
'''
remove_input_delay
'''
set_input_transition

输入端口的上升和下降转换时间会影响输入门的单元延迟,并且该延迟会依次传递到后续的电路中;

'''
单个输入端口A上的(上升/下降)输入转换时间为0.12ns(精确到时间)
'''
set_input_transition  0.12    [get_ports    A]
set_driving_cell

若不知道具体输入端口的转换时间,则根据该输入端口所连接的(上一个逻辑块的)逻辑门(驱动单元)的引脚的驱动能力【从工艺库中选取】

'''
1.输入端口A的上一级逻辑RTL块的输出为OR3B逻辑门的引脚;
2.输入端口A的上一级逻辑RTL块的输出为FF11触发器的Qn引脚;
PS:当驱动单元有多个输出引脚时,需指定引脚名称(如D触发器有Q和Qn两个输出引脚)
'''
set_driving_cell    -lib_cell    OR3B    [get_ports    A]
set_driving_cell    -lib_cell    FF1  -pin  Qn  [get_ports    A]

对于输出路径的约束(reg-to-port)

set_output_delay
对单个输出端口B进行约束;
set_output_delay  -max  0.8  -clock  clk  [get_ports  B]
限制所有输出端口都相同
set_output_delay    -max 0.8    -clock clk    [all_outputs]
'''
all_outputs
'''
set_load

输出端口上的电容负载会影响输出驱动的转换时间,从而导致单元延迟。(当电容越大时,充电的时间就越久,延迟越长

'''
1.输出端口B上的最大电容负载为30fF
2.(不知道具体的负载电容值)输出端口B后连接了1个AN2门
3.输出端口B后连接了3个inv1a0门
'''
set_load    [expr    30.0/1000]     [get_ports  B]
set_load    [load_of    my_lib/AN2/A]    [get_ports  B]
set_load    [expr    {[load_of  my_lib/inv1a0/a]*3} ] [get_ports  B]

'''
电容的单位为pF
A为引脚
load_of 
'''

3.综合命令compile_ultra

下面主要给出与综合命令compile_ultra相关的命令;

自动取消分组(auto ungroup)

①set_ungroup

在使用compile_ultra命令时,会自动开启取消分组。若想选择性的对某些子设计禁用自动取消分组功能;

set_ungroup    <references or cells>    false
compile_ultra
②compile_ultra  -no_autoungroup

若想完全禁用自动取消分组功能;

compile_ultra    -no_autoungroup

边界优化

① compile_ultra  -no_boundary

自动取消分组功能(auto ungroup)关闭后,会默认开启边界优化

#可选择性关闭或者完全关闭边界优化功能
set_boundary_optimization    <cells_designs> false
compile_ultra    -no_boundary
'''
set_boundary_optimization    
-no_boundary
'''

扫描寄存器及自动移位寄存器识别

①compile_ultra   -scan

普通寄存器替换为扫描寄存器

compile_ultra    -scan

在扫描插入过程中(-scan)可自动识别移位寄存器,在移位寄存器中只有第一个会被替换为扫描寄存器。在compile_ultra   -scan默认状态下,该功能处于启用中,若将该功能禁用:

set_app_var    compile_seqmap_identify_shift_registers    false
'''
compile_seqmap_identify_shift_registers    
'''

时序QoR集中优化

当经过前面的优化步骤后当前设计仍然存在时序违例时:

①compile_ultra  -timing_high_effort_script
compile_ultra  -timing_high_effort_script
'''
推荐用于时序关键型高性能设计
如果不是时序关键,请不要使用此选项
'''

寄存器复制

①compile_ultra  -timing
compile_ultra  -timing

自适应重定时(Adaptive retiming)和寄存器重定时(Register retiming)

区别:

  • Adaptive retiming主要用于“局部优化”,仅作用于潜在的关键时序路径上,无法针对整个Design。Register retiming是Adaptive retiming的可替代方法;
  • 两种技术都将移动,合并和拆分寄存器;
  • Adaptive retiming旨在减少非流水线寄存器之间的WNS;
  • Register retiming旨在改善纯流水线设计的时序特性或面积;
①compile_ultra  -retime
#对特定寄存器或子设计中禁用重定时: 不移动U_pipeline设计中的P3_reg寄存器
set_dont_retime    [get_cells  U_pipeline/P3_reg*] true 
set_optimize_registers    true    -design    pipeline 
#在compile_ultra -retime前添加该约束表示register retiming
compile_ultra  -retime    #Adaptive retiming
'''
set_optimize_registers    
set_dont_retime
'''

用户自定义多个路径组(group)

前言:①在编译过程中,每个时序路径被放置在与该路径的捕获时钟关联的路径组中,然后DC依次优化每个路径组,开始优化每个组的关键路径(时序最差的路径),但是不优化每个组的次关键路径

        ②将input path,reg-to-reg path和output path设置在同一个路径组中,若手动设置的input path和output path的延时较悲观,则中间的reg-to-reg path也无法进一步进行优化。因此,可通过自定义多个路径组允许对优化进行更多的控制

①group_path  -name
group_path  -name  INPUTS  -from    [all_inputs]
group_path  -name  OUTPUTS  -to     [all_outputs]
'''
reg-to-reg路径在CLK路径组中
'''
group_path  -name  CLK    -critical_range    0.2  -weight    5
'''
-critical_range: 对在关键路径的0.2ns范围的次关键路径进行优化;
                 对次关键路径的优化可能有助于关键路径的优化;
-weight: 为路径组指定相对优先级或权重 
·将权重5应用于最关键的路径(reg-to-reg)
·将权重2应用于较不关键的路径
·将权重1分配给所有其他路径(默认权重为1)    
'''
①report_path_group

报告当前Design中有哪些group

report_path_group

(根据后续学习过程进行持续更新中~)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值