【芯片设计】sdc配置的组织、集成与拆分思考

乐活   2025-01-22 12:03   北京  
关于sdc的组织方式,之前在虚拟项目里有过一次简单的讨论,这次借着交付总结的机会来比较详细的总结下思路。目前的芯片项目在对后端交付时,由于面积较大一般不会整芯片交付,而是会拆分成若干的子系统或者harden独立交付后,在完成综合、布局布线等后端操作后再组成最终的网表。因此一个子系统或者对外交付IP的sdc就需要考虑向上集成的事。一个系统的sdc会约束哪些方面的事情呢,大概有这些:
  • 时钟约束:定义芯片的工作速度,即时钟的频率。包括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不同交付层之间集成的事情,集成时对于RTL来说必然时这样的一个结构。那么此时子系统的时钟就不需要单独定义了,因为其必然是顶层时钟走线接入的,只需要在上层定义清楚。同理虚拟时钟也再不需要,换顶层去定义更“高维”的虚拟时钟吧。同时对外接口也不(一定)是顶层对外接口,大概路只是顶层内部的走线,故对接口设置的set_input_delay和set_output_delay也不再需要,同理接口的物理约束顶层也不需要。而其他命令各种设置一般也不需要被集成,因为上一层会有更为整体全面考量的配置。

除去这些基本是需要被集成到顶层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相关约束。

进一步也就明确集成规则,上层的sdc会集成xxx.except.sdc、xxx.other.sdc和xxx.dft.sdc走,抛弃xxx.define.sdc、xxx.clock.sdc、xxx.port.sdc和xxx.set.sdc。之后顶层会在自己的sdc中设置xxx.define.sdc、xxx.clock.sdc和xxx.port.sdc。而后在source子系统的xxx.except.sdc、xxx.other.sdc和xxx.dft.sdc之前,重定义$xxx_top_path等关联信息,保证约束的正确性。如果一个子系统例化多次,则每次都需要重定义$xxx_top_path等定义。

系列文章入口——

【芯片设计】SoC 101(一):绪论
【芯片设计】FIFO漫谈(零)从无处不在的FIFO开始说起
【芯片设计】计算机体系结构(一)虚拟内存

【芯片设计】深入理解AMBA总线(零)绪论

【芯片设计】握手协议的介绍与时序说明
【芯片设计】复位那些小事 —— 复位消抖
【芯片设计】快速入门数字芯片设计(一)Introduction
【芯片验证】UVM源码计划(零)下定决心读源码前的自测环节
【芯片设计】异步电路碎碎念(一) 到底什么是异步电路
【芯片设计】从RTL到GDS(一):Introduction
其他文章链接——
【芯片验证】sva_assertion: 15道助力飞升的断言练习
【芯片验证】可能是RTL定向验证的巅峰之作
【芯片验证】RTL仿真中X态行为的传播 —— 从xprop说起
【芯片验证】年轻人的第一个systemVerilog验证环境全工程与解析
【芯片设计】verilog中有符号数和无符号数的本质探究
【芯片设计】论RTL中always语法的消失术
【芯片设计】代码即注释,注释即代码
【芯片设计】700行代码的risc处理器你确实不能要求太多了
入职芯片开发部门后,每天摸鱼之外的时间我们要做些什么呢
如何计算系统的outstanding 和 burst length?
芯片搬砖日常·逼死强迫症的关键词不对齐事件
熟人社会里,一群没有社会价值的局外人


芯时代青年
专心数字前端全流程,芯时代有为青年的自我修养
 最新文章