4.1 核心约束命令:时钟、端口与输出负载


文档摘要

4.1 核心约束命令:时钟、端口与输出负载 本节摘要:基础约束回答三个问题:片内时钟沿在哪里(时钟定义)、外部数据何时到何时走(输入输出延迟)、外部环境长什么样(驱动与负载)。本节逐条讲清核心命令的参数含义与常见误用,最后给出一份完整的 0.5ns 设计 SDC 注释版。 「SDC」是约束的事实标准,语法简单到只有几十条命令,难的是每条命令背后的承诺边界。本节按"时钟、端口环境、电气环境"的顺序展开,每条命令都回答两个问题:它告诉了工具什么?写错或漏写会怎样? 时钟族:create 与 generated createclock 是整份约束的地基,它在某个引脚或端口上定义一个理想时钟源:名字、周期、波形(占空比)、以及可选的源延迟与抖动。1.3 已经交代过周期与波形;

4.1 核心约束命令:时钟、端口与输出负载

本节摘要:基础约束回答三个问题:片内时钟沿在哪里(时钟定义)、外部数据何时到何时走(输入输出延迟)、外部环境长什么样(驱动与负载)。本节逐条讲清核心命令的参数含义与常见误用,最后给出一份完整的 0.5ns 设计 SDC 注释版。

「SDC」是约束的事实标准,语法简单到只有几十条命令,难的是每条命令背后的承诺边界。本节按"时钟、端口环境、电气环境"的顺序展开,每条命令都回答两个问题:它告诉了工具什么?写错或漏写会怎样?

时钟族:create 与 generated

create_clock 是整份约束的地基,它在某个引脚或端口上定义一个理想时钟源:名字、周期、波形(占空比)、以及可选的源延迟与抖动。1.3 已经交代过周期与波形;这里补两个常被忽略的参数:-name 决定后续所有按名字引用的锚点,命名混乱的时钟体系是约束管理灾难的头号来源;源端不确定度(-source_latency 或配套的 set_clock_uncertainty -source)描述晶振到片上的抖动,与片内不确定度分开声明,便于分项管理。

create_generated_clock 声明派生时钟:分频器、门控时钟、时钟选择器输出的每一条衍生时钟,都要指明主时钟、分频比与沿的映射。它的意义不只是"让工具知道这里有时钟",更重要的是建立跨域检查的基准——没有生成时钟声明,工具无法判断两个域之间的路径该按同频还是异频对待。set_propagated_clock 把时钟模型从理想切换为真实传播(1.3 详述过),布线后流程的必选项;漏写它的典型症状是所有路径的时钟网络延迟显示为 0,报告上方挂着 ideal 字样而无人注意。

端口环境:数据何时来、何时走

输入延迟(set_input_delay)声明外部数据相对捕获时钟沿的到达时刻:片外的发送方在沿之后多久把数据放到你的端口上。它直接决定 in2reg 路径的可用预算——周期减输入延迟,剩下的才是片内第一级的份额。输出延迟(set_output_delay)对称地声明外部接收方的要求:你的寄存器打出数据后,外部逻辑需要在多少时间内采走。两条命令都分 -max 与 -min 两档:max 服务建立账,min 服务保持账,四个数字一起构成完整的端口时序契约。

# 端口时序:外部器件在 clk 上升沿后 0.12ns 才稳定数据(max), # 最早 0.03ns 就可能改数据(min)——分别交给建立账与保持账 set_input_delay -max 0.12 -clock clk [get_ports data_in*] set_input_delay -min 0.03 -clock clk [get_ports data_in*] # 下游芯片要求输出沿后 0.15ns 内有效(max),且至少保持 0.05ns(min) set_output_delay -max 0.15 -clock clk [get_ports data_out*] set_output_delay -min 0.05 -clock clk [get_ports data_out*]

这套数字从哪里来?接口文档或对端芯片的 datasheet。约束工程师的职责是把协议条款翻译成这四行,并在评审时能指着数字说出条款出处——4.3 的约束审计以此为第一条。

电气环境:驱动与负载

端口上的信号不是凭空出现的:外部驱动源有自己的强度(set_driving_cell 用库里的某个单元模拟外部驱动的输出电阻,进而决定端口翻转率),外部负载有自己的电容(set_load,单位 pF,含扇出线与对端引脚)。漏写 set_driving_cell 时工具默认理想驱动(翻转率为零),端口后第一级的延迟会被系统性低估;漏写 set_load 时输出路径同理被低估。这两类低估都朝"报告更漂亮"的方向偏——恰恰是最危险的偏法。

# 完整的 0.5ns 设计基础约束(时钟部分见 1.3) set_driving_cell -lib_cell BUF_X2 -pin Z [get_ports {data_in* reset_n}] set_load 0.02 [all_outputs] ;# 20fF 板级与对端负载 set_max_fanout 16 [current_design] ;# 设计规则类约束 set_max_transition 0.12 [current_design] ;# 翻转率上限,防慢沿 set_case_analysis 1 [get_ports test_mode_n] ;# 固定静态端口,裁剪路径

最后两行属于"设计规则"约束:set_max_transition 与 set_max_fanout 不是时序检查,而是防退化护栏——慢沿会恶化下一级查表索引(3.1 的链条),高扇出会放大负载失衡。set_case_analysis 把静态配置位钉死,让工具裁掉永远不活跃的路径,是减少假违例的第一道工具(更正式的裁剪在 4.2 的例外层)。

一份装配好的契约

把三层拼起来看整体:时钟族定义"沿在哪",端口延迟定义"数据何时进出",电气环境定义"沿长什么样"。三者共同把 0.5ns 的目标频率翻译成可判分的时序命题——而判分范围之外的承诺(哪些路径不查)属于 4.2 的例外层。基础约束的检查清单可以浓缩为五问:每个时钟域都有 create_clock 吗;每条派生路径都有 generated_clock 吗;所有输入端口都有 input_delay 吗;所有输出端口都有 output_delay 吗;propagated 与 case_analysis 按阶段正确设置了吗。五问全过,才有资格谈例外。

本节要点回顾

  • 时钟定义是地基:create_clock 定源、generated_clock 定派生、propagated 定真实性,缺一层的后果都是"安静地查错对象"。
  • 端口契约四个数字:输入输出延迟各带 max 与 min,分别服务建立与保持,出处是对端 datasheet。
  • 电气环境防系统性低估:驱动单元与负载电容缺失时,报告朝乐观方向偏。
  • 设计规则约束是护栏:翻转率与扇出上限保护查表索引的有效性。
  • 约束即承诺:写下的每一行都会成为签核标准,评审时每个数字都要能说出出处。

基础约束画好了判分范围,下一节处理范围之外的部分:伪路径、多周期与时钟组——例外声明用得好是精确,用得滥就是自欺。


作者与出处
原作者: 灏天文库
来源:灏天文库
整理: 灏天文库整理
由灏天文库平台收录,内容或由平台用户上传,仅供学习交流
发布者: 作者: 灏天文库 转发
评论区 (0)
U