Design Compiler常用命令大总结~
目录
②compile_ultra -no_autoungroup
①compile_ultra -timing_high_effort_script
自适应重定时(Adaptive retiming)和寄存器重定时(Register retiming)
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
(根据后续学习过程进行持续更新中~)