时钟约束:定义芯片的工作速度,即时钟的频率。包括create_clock和create_generated_clock等命令,用于定义时钟的源、周期、占空比以及信号的上升沿和下降沿时间点,这里也包括虚拟时钟和时钟分组。
接口时序约束:描述芯片的输入和输出延迟,包括set_input_delay和set_output_delay等命令,用于定义信号在进入芯片(输入延迟)和离开芯片(输出延迟)时的延迟。
接口物理约束:包括set_load、set_drive、set_driving_cell、set_fanout_load、set_port_fanout_number和set_input_transition等命令,用于定义接口的负载、驱动能力、驱动单元、扇出负载和输入转换速率等。
设计规则约束:包括set_max_fanout、set_max_capacitance和set_max_transition等命令,用于定义设计中的最大扇出、最大电容和最大转换速率等规则。
特殊单元约束:如set_dont_touch这类对寄存器单元的处理约束。
时序例外约束:描述设计中的一些特殊路径,包括set_false_path和set_multicycle_path等命令,用于定义不参与时序分析的路径或多周期路径。除了set_false_path和set_multicycle_path外,还包括set_max_delay、set_min_delay等命令,用于定义最大和最小延迟的例外路径,通常为异步路径。
DFT约束:DFT接口与信号是与其他部分处于不同时钟域和功能域的部分,可以单独设置约束, 包括扫描链(Scan Chain)和MBIST(Memory Built-In Self-Test)路径。
其他命令:包括set_wire_load_mode、set_wire_load_selection_group、set_wire_load_min_block_size、set_units、set_operating_condition和sdc_version等,用于定义线负载模型、操作条件、一些优化选项甚至SDC版本等。
除去这些基本是需要被集成到顶层sdc的,比如内部的异步路径约束、multicycle操作、对一些镜像寄存器设置的dont_touch甚至对内部时钟节点的set_clock_delay理论上都是需要的。而DFT的sdc比较特殊,我不确定其是否需要被集成所以独立出来交给DFT工程师处理好了。
依据刚刚的分析,我们可以把sdc划分为两个大的部分:
因此,可以以如下的形式对系统整体的sdc进行拆分组织。
xxx.define.sdc:定义各种变量,这个详细说下。包括$xxx_top_path、$clock_name、$clock_period、$port_delay_ratio、$async_delay_ratio等各种后面需要的量,集中定义集中管理。在此文件中通常还会source chip.generate.define.sdc,chip.generate.define.sdc中可能有很多整个芯片项目通用的定义比如不同档的时钟频率数值、最大扇入扇出值、delay_ratio等,通过source的方式可以避免重复同时可以直接在其基础上进行进一步的定义。
xxx.clock.sdc:定义时钟,处理时钟分组等问题。
xxx.port.sdc:接口时序约束和接口物理约束。
xxx.set.sdc:设计规则以及其他命令。
xxx.except.sdc:时序例外,以异步、multicycle、false_path为主。
xxx.other.sdc:其他内部约束与设置比如dont_touch、set_clock_latency等。
xxx.dft.sdc:DFT相关约束。
系列文章入口——
【芯片验证】sva_assertion: 15道助力飞升的断言练习 |
【芯片验证】可能是RTL定向验证的巅峰之作 |
【芯片验证】RTL仿真中X态行为的传播 —— 从xprop说起 |
【芯片验证】年轻人的第一个systemVerilog验证环境全工程与解析 |
【芯片设计】verilog中有符号数和无符号数的本质探究 |
【芯片设计】论RTL中always语法的消失术 |
【芯片设计】代码即注释,注释即代码 |
【芯片设计】700行代码的risc处理器你确实不能要求太多了 |
入职芯片开发部门后,每天摸鱼之外的时间我们要做些什么呢 |
如何计算系统的outstanding 和 burst length? |
芯片搬砖日常·逼死强迫症的关键词不对齐事件 |
熟人社会里,一群没有社会价值的局外人 |