block层sdc merge到chip层方法介绍
在芯片综合中将Block级SDC合并到top级是一个比较繁琐且麻烦的工作,需要多次迭代才能获得一个较为稳定的版本,下文简述一下在向上merge时需要注意的点。
01 merge前的准备工作
确保Block级SDC完整性
1) 检查Block内未约束路径check_timing(如无时钟寄存器、无输入/输出延迟的端口)
2) 通过 report_analysis_coverage 统计约束覆盖率,确保所有路径(包括异步路径)均被明确声明(如 false_path、set_case_analysis)
注意:Block内部的时序例外(如Multi cycle path)需独立验证,避免遗漏导致顶层时序违例。
02 合并时需要注意的点
确保Block级SDC完整性
1) 主时钟传递:若时钟源在顶层(如PLL输出),Block中无需重复定义时钟,仅需通过 get_clocks 引用顶层时钟名
2) 生成时钟对齐:Block内 create_generated_clock 必须与顶层时钟源同步,避免分频/门控逻辑冲突
create_clock -name block_clk -ports [get_ports clk]
create_generated_clock -divide_by 1 -combinational -master_clock chip_clk -name block_clk ${hier}clk
3) 时钟组声明: 需要在顶层重新审视所有时钟的同/异步关系,在顶层sdc完善 set_clock_groups
4) 时序例外:Block内 false_path、multicycle_path 需逐条合并至顶层,并验证是否与顶层约束冲突。
set_multicycle_path 一般加层次保留
max_delay/min_delay 一般保留,但需要将对应的pin,ports 带上层次,个别clock需要修改时钟名。
set_max_delay -from [get_clocks clka] -to [get_clocks clkb]
set_false_path 如果在两个pin上加上对应的层次即可,如果在port上可以使用-through来替代-from/-to
例:set_false_path -from [get_ports portA] -to [get_pins pinB]
set_false_path -through [get_ports/get_pins ${hier}portA] -to [get_pins ${hier}pinB]
block中的这几类set_input_delay set_output_delay set_driving_cell set_load 一般也不需要保留,IO delay需要在顶层重新设置。
set_case_analysis定义在block-level input port的很多是mode selection的信号,例如test_mode, 这种往往在chip-level定义一次就可以,而block-level的定义都可以删除。
5) 禁用时序弧:Block中 set_disable_timing 需确保不影响顶层路径分析