综合所需的时钟约束文件(SDC)编写指南

综合所需的时钟约束文件(SDC)编写指南 前言SDCSynopsys Design Constraints是EDA工具本文以Design Compiler为例中定义设计约束的文件格式在综合过程中设计者会编辑clock_define.sdc作为专门的时钟约束文件其核心是准确描述时钟的频率、相位、抖动、延时等特性除此之外我个人习惯将端口信号的input_delayoutput_delayset memory_list约束也写在clock_define文件中下面我将对约束文件做详细介绍1、定义主时钟物理时钟##语法create_clock -name 自己起时钟名 -period 周期ns -waveform {上升沿 下降沿} [get_ports 代码中时钟端口名]##示例时钟1156MHz时钟周期6.4ns50%占空比实际约束时严格周期按照6.4*80%##示例时钟2600MHz时钟周期1.6ns50%占空比实际约束时严格周期按照1.6*80%create_clock -name CLK_clk_apb -period 5.0 -waveform {0.0 2.5} [get_ports clk_apb]create_clock -name CLK_clk_main -period 1.2 -waveform {0.0 0.6} [get_ports clk_main]2、定义虚拟时钟1虚拟时钟vs物理时钟特征虚拟时钟物理时钟绑定对象无仅定义时序特性绑定到top.v的时钟端口核心作用作为外部时钟的参考约束IO时序驱动设计内部寄存器分析内部时序典型命令create_clock -name xxx -period ycreate_clock -name xxx -period y[get_ports clk]2下面给出两个示例create_clock -name VCLK_clk_apb -period 5.0 -waveform {0.0 2.5}create_clock -name VCLK_clk_main -period 1.2 -waveform {0.0 0.6}注这里定义的两个虚拟时钟VCLK_clk_apb和VCLK_clk_main这两个虚拟时钟用于top.v数据端口的set_input_delay和set_output_delay下文会详细讲解第5点。3、定义衍生时钟以分频时钟为例##示例主时钟是上文的clk_main600MHz2分频得到300MHz的时钟set clk_main_div_pin U_PLL/.../Q ##这里的路径需参考网表得到分频器的输出引脚create_generated_clock -name GCLK_clk_main_div \-divide_by 2 \ ##如果倍频这里需改成“-multiply_by 2”-source clk_main \-master_clock [get_clocks CLK_clk_main] \[get_pins $clk_main_div_pin] -add4、三种类型时钟主、虚拟、衍生设置时钟抖动jitter、时钟组约束1设置时钟抖动模拟时钟源不稳定一般高速率时钟抖动0.1低速率时钟抖动0.2set_clock_uncertainty -setup 0.1 [get_clocks CLK_clk_main]set_clock_uncertainty -setup 0.2 [get_clocks CLK_clk_apb]set_clock_uncertainty -setup 0.1 [get_clocks GCLK_clk_main_div]注意虚拟时钟可以不设置时钟抖动2时钟组约束多时钟域时避免工具分析跨时钟域时序set_clock_groups -asynchronous \-group {CLK_clk_main VCLK_clk_main GCLK_clk_main_div} \-group {CLK_clk_apb VCLK_clk_apb}5、top.v数据端口的set_input_delay和set_output_delay##格式set_input_delay 延时为时钟周期*0.5 -clock [get_clocks 虚拟时钟名] [get_ports top.v的input信号名]set_input_delay 2.5 -clock [get_clocks VCLK_clk_apb] [get_ports din_data]set_output_delay 0.6 -clock [get_clocks VCLK_clk_main] [get_ports dout_data]6、对特定黑盒批量约束以DPRAM为例set mem_list [get_object_name [get_cells * -h -f is_black_box true full_name ~ *aaa*bbb]]foreach memtmp $mem_list{##固定测试引脚为低电平0set_case_analysis 0 [get_pins ${memtmp}/RA]set_case_analysis 0 [get_pins ${memtmp}/RA]set_case_analysis 0 [get_pins ${memtmp}/RB]set_case_analysis 0 [get_pins ${memtmp}/RB]set_case_analysis 0 [get_pins ${memtmp}/LS]set_case_analysis 0 [get_pins ${memtmp}/PF]set_case_analysis 0 [get_pins ${memtmp}/TA]set_case_analysis 0 [get_pins ${memtmp}/TB]##禁用时钟交叉路径的时序分析set_disable_timing ${memtmp} -from CLK0 -to CLK1set_disable_timing ${memtmp} -from CLK1 -to CLK0}解释这段代码核心作用是对设计中特定的黑盒内存单元批量设置固定值约束和时序禁用约束让 EDA 综合工具忽略这些单元的部分时序路径、固定其测试 / 控制引脚状态从而聚焦于核心逻辑的综合优化。7、补充我们实战中常用的还有set_case_analysis,set_false_path等语句具体情况具体分析。