STA环境

CMOS逻辑门与静态时序分析(STA):环境配置与SDC约束
文章介绍了CMOS逻辑门的工作原理,以及在执行静态时序分析(STA)前如何配置设计约束,特别是涉及输入端外接电阻和输出端外接电容对时序的影响。此外,还详细阐述了SDC对象访问指令,如`all_clocks`、`get_clocks`等,用于指定和操作设计中的各种对象。

本文介绍在执行静态时序分析(Static Timing Analysis, STA)前需要配置的环境,并附上设计约束(Synopsys Design Constraints, SDC)如何描述

aaaaaaaa585 - vivado - 优快云专栏


1. CMOS逻辑门

CMOS逻辑门使用NMOS和PMOS晶体管搭建而成。如下图给出了CMOS非门的示例。

什么是MOS晶体管?MOS晶体管工作原理和VI特性详解

CMOS非门有两种稳定状态,具体取决于输入的电平状态。

当输入A为低电平(Vss或逻辑0)时,NMOS晶体管截止、PMOS晶体管导通,输出Z电平被上拉至逻辑为1的Vdd。
当输入A为高电平(Vdd或逻辑1)时,NMOS晶体管导通,而PMOS晶体管截止,输出Z电平被下拉至逻辑为0的Vss。

在这里插入图片描述
上述特性可以扩展到任何CMOS逻辑门。

在CMOS逻辑门中,输出节点通过上拉结构(由PMOS晶体管构成)连接至Vdd,并通过下拉结构(由NMOS晶体管构成)连接至Vss,来构成输出的高电平和低电平。同时上拉和下拉结构是互补的,如果上拉结构开启,则下拉结构将关闭,反之相反。以此保证输出电平只有高电平和低电平两种情况,无一例外。

基于此,可将各种CMOS逻辑门级联起来以实现更复杂的逻辑功能。

而这些CMOS逻辑门可以组合成各种基本逻辑块或称标准单元,例如与或非门、异或门、触发器等等。这些标准单元是预先设计好的,可供设计人员搭积木式的组合拼凑,实现各种功能。

2. 波形

CMOS单元电平随时间变化构成了波形,波形如下图所示,

在这里插入图片描述

但在仿真或理想情况下常将波形等效为如下的折线。

在这里插入图片描述

3. 时钟

STA环境 - 时钟

4. 时序路径

STA环境 - 时序路径

5. 外部属性

5.1. 输入端外接电阻

可通过指定输入端的外接电阻值,以计算输入端的过渡时间,反应驱动强度。理想情况下外接电阻值为0、过渡时间为0、驱动强度为无穷大

指令如下

# 指定外接电阻
set_drive 100 UCLK
set_drive -rise 3 [ all_inputs ]
set_drive -fall 2 [ all_inputs ]

# 指定输入端口类型
set_driving_cell -lib_cell INV3 -library slow [ get_ports INPB]
set_driving_cell -lib_cell INV2 -library tech13g [ all_inputs ]
set_driving_cell -lib_cell BUFFD4 -library tech90gwc [ get_ports {testmode[3]}]

# 指定输入端口过度时间
set_input_transition 0.85 [ get_ports INPC]
set_input_transition 0.6 [ all_inputs ]
set_input_transition 0.25 [ get_ports SD_DIN*]

在这里插入图片描述

5.2. 输出端外接电容

同样会影响输出端口的延迟

# 指定输出端口电容值
set_load 5 [ get_ports OUTX]
set_load 25 [ all_outputs ]
set_load -pin_load 0.007 [ get_ports {shift_write[31]}]

# 指定内部网络电容值
set_load 0.25 [ get_nets UCNT5/NET6]

在这里插入图片描述

6. SDC对象访问指令

上述主要介绍约束指令,约束指令需要指定访问对象,此处介绍对方访问指令

ug835 - vivado tcl commands
Vivado时序约束中详细的Tcl命令

6.1. 如何描述对象

介绍指令之前,先介绍如何描述对象的名称。SDC支持直接描述对象,也支持通过正则表达式、搜索条件等描述所有满足条件的对象。

直接描述对象,需要指明模块层级。

[get_pins {clk_gen_i0/clk_core_i0/CK}]

具体的模块层级可在vivado中的Open Implemention Design中查看

也可以通过限定条件描述所有满足条件的对象,下面介绍。

*

可以使用*描述该层级的子模块或对象。注意只能描述该层级,不包括更深的层级,也不能表示无层级。

# 获取顶层模块中,所有包含uart字符模块下 的所有pins
get_pins {*uart*/*}

# 获取U_UART模块中 所有子模块中名字包含rst的pins
# 注意没有获取:U_UART.rst和U_UART下子模块的子模块的rst信号
get_pins {U_UART/*/*rst*}

# 获取顶层模块的所有pins
get_pins *

-hier

加上该条件,将从工程顶层开始,在所有层次内搜索对象。如果没有该条件,则只会搜索顶层模块中,或者是current_instance约定的模块中的对象。

注意get_portsget_clocks不能使用-hier

例如

# 所有层级下名字包含rst_global_reg的cells
get_cells -hier *rst_global_reg*

# U_CFG模块下所有层级中 名字包含rst_global_reg的cells
get_cells -hier U_CFG/*/*rst_global_reg*

关于*-hier的区别,例如下图中。所有模块中都有一个rst信号。

在这里插入图片描述

加了-hier之后*就可以跨层级了。

# 将获取 A_i0.B_i0.rst_reg、A_i0.B_i1.rst_reg、A_i0.C_i0.rst_reg
get_cells A_i0/*/*rst_reg

# 将获取 A_i0.B_i0.rst_reg、A_i0.B_i1.rst_reg、A_i0.C_i0.rst_reg和A_i0.C_i0.D_i0.rst_reg
# 加了-hier之后此处*可代表跨层级
get_cells -hier A_i0/*/*rst_reg

# 将获取 A_i0.rst_reg、A_i0.B_i0.rst_reg、A_i0.B_i1.rst_reg、A_i0.C_i0.rst_reg和A_i0.C_i0.D_i0.rst_reg
# 加了-hier之后此处*可代表跨层级
get_cells -hier A_i0/*rst_reg

正则表达式在Vivado约束文件(xdc)中的应用

-filter

表示根据属性搜索对象,需要通过大括号将属性涵盖进来,例如

# 当前模块中所有名字带有RST的输入pin
get_pins * -filter {DIRECTION == IN && NAME =~*RST*}

# 获取所有时序逻辑单元
get_cells * -hier -filter {IS_SEQUENTIAL== 1}

实际上,pins、ports、cells的属性各不相同,但-filter常用的有包括

==等于、!=不等于、=~匹配、!~不匹配、
> < >= <=不等号、
&& ||与或逻辑符、
DIRECTION == IN; DIRECTION ==OUT输入输出、NAME名称

-of

获取对象的某个类型的对象,例如

# 获取clk_gen_i0/clk_core_i0模块的输入引脚
get_pins -of [get_cells {clk_gen_i0/clk_core_i0}] -filter {DIRECTION == IN}

# 已知引脚名获取所在模块
get_cells -of [get_pins clk_gen_i0/clk_core_i0/clk_in1_n]

# 已知模块名获取与该模块相连的网线
get_nets -of [get_cells {clk_gen_i0/clk_core_i0}]

# 已知引脚名获取与该引脚相连的网线
get_nets -of [get_pins clk_gen_i0/clk_core_i0/clk_rx]

# 已知时钟引脚获取时钟引脚对应的时钟
get_clocks -of [get_pins clk_gen_i0/clk_core_i0/clk_rx]

-regexp

使用正则表达式描述对象。

常用的规则,例如*表示匹配前面的子表达式零次或多次、.表示匹配除换行符 \n 之外的任何单字符、?表示匹配前面的子表达式零次或1次。因此可使用.*表示任意数量的任意字符

正则表达式在Vivado约束文件(xdc)中的应用

-nocase

使用-regexp正则表达式时,不区分大小写

6.2. all_clocksget_clocks

all_clocks用于指定create_clock生成的所有时钟

# 用于本设计中所有时钟
set_propagated_clock [all_clocks]

get_clocks 用于指定生成的特定时钟。

格式如下

get_clocks [-regexp] [-nocase][-filter <arg>][-of_object] [-include_generated_clocks]

6.3. all_inputsall_outputsget_ports

用于指定本顶层设计的端口

get_ports [-regexp] [-nocase][-filter <arg>][-of_object] 

6.4. get_cells

用于获取综合后或者是布线后的模块、单元等内容,例如模块、LUT、FDRE等等都叫cell。

get_cells [-hier][-regexp] [-nocase][-filter <arg>][-of_object] 

可打开Open Synthesis或Open Implemention后的Netlist中查看什么是cells

6.5. get_nets

用于获取cells之间相连的网线

get_nets[-hier][-regexp] [-nocase][-filter <arg>][-of_object][-top_net_of_hierarchcial_group]

可打开Open Synthesis或Open Implemention后的Netlist中查看什么是nets。某个cell的Cell Properties中也会列出与该cell相连的Nets

6.6. get_pins

用于获取cells上面的引脚

get_pins[-hier][-regexp] [-nocase][-filter <arg>][-of_object][-leaf]

可打开Open Synthesis或Open Implemention后的Netlist中选中某个cell,其Cell Properties中也会列出该cell的Cell Pins

<think>首先,用户的问题是:“我想设置STA的transition 请问如何在STA中配置transition”。这涉及到静态时序分析(STA)中的transition设置。 从系统指令中,我知道必须: - 使用$...$格式的行内数学表达式。 - 独立公式用$$...$$格式。 - 使用中文回答。 - 生成相关问题。 - 在引用段落末尾添加引用标识。 - 回答结构清晰,逐步解决问题。 - 参考提供的引用内容。 用户提到的引用是关于STA环境的配置,特别是transition设置。引用[2]中提到了set_max_transition命令: - "set_max_transition 0.6 IOBANK # Sets a limit of 600ps on IOBANK." - 这表示set_max_transition用于设置最大transition时间,单位通常是秒或纳秒。 其他相关引用: - 引用[1]提到set_case_analysis, set_disable_timing, set_false_path, set_multicycle_path,但用户焦点在transition。 - 引用[3]讨论同步设计和STA约束。 - 引用[4]关于时钟边沿设置。 - 引用[5]关于set_false_path。 用户的问题是配置transition,所以我应该专注于set_max_transition命令。 回答结构: 1. **解释transition是什么**:在STA中,transition时间指的是信号从一个逻辑电平切换到另一个所需的时间,通常指上升时间或下降时间。设置最大transition约束确保信号变化在可接受的速度内,避免过慢导致时序问题。 2. **为什么需要设置transition**:过大的transition时间可能导致setup或hold时间违规,影响电路性能。 3. **如何配置transition**:使用set_max_transition命令。 - 语法:set_max_transition <value> <object> - <value>:最大transition时间,单位通常是秒或纳秒。 - <object>:可以是端口、引脚、或设计单元。 - 示例:从引用[2],set_max_transition 0.6 IOBANK 设置IOBANK的最大transition为0.6ns(600ps)。 4. **步骤指南**: - 确定要约束的对象:如特定端口、时钟域或整个设计。 - 选择合适的值:基于工艺库或设计需求。 - 应用命令:在STA脚本中使用set_max_transition。 5. **注意事项**: - 值单位:确保单位一致,通常STA工具使用ns或ps。 - 影响:设置太严格可能导致无法满足,太宽松可能忽略潜在问题。 - 与整体STA环境结合:如时钟定义、输入输出延迟等。 生成相关问题: - 基于用户问题,生成2-3个相关问题。 - 例如: 1. 如何确定合适的transition值? 2. transition设置不当的后果是什么? 3. STA中其他常见约束如何配置? 引用处理: - 在回答中,如果引用内容,末尾添加[^n]。 - 例如,提到set_max_transition时,引用引用[2]。 完整回答框架: - 引言:解释transition在STA中的重要性。 - 步骤:如何配置transition。 - 示例:提供代码示例(如Tcl脚本)。 - 注意事项。 - 相关问题。 使用中文回答。</think>### 如何在STA中配置transition设置 在静态时序分析(STA)中,transition时间(也称为slew rate)指的是信号从一个逻辑电平切换到另一个所需的时间,通常指上升时间或下降时间。设置transition约束是确保电路时序可靠的关键步骤,因为它直接影响信号的传播延迟和时序裕量(slack)。如果transition时间过大,可能导致setup或hold时间违规,进而引发电路故障;过小则可能不切实际或增加功耗。下面我将逐步解释如何在STA中配置transition设置,确保回答清晰可靠。 #### 步骤1: 理解transition约束的目的 - **为什么需要设置transition**:在同步数字电路中,信号transition时间过大会增加路径延迟,可能违反时序约束(如setup/hold时间)。通过设置最大transition值,STA工具能检查并报告超标情况,帮助优化设计[^3]。 - **关键概念**: - transition时间单位通常为纳秒(ns)或皮秒(ps),例如$t_{\text{transition}} \leq 0.6\,\text{ns}$。 - 约束对象可以是端口(ports)、引脚(pins)或整个设计模块。 #### 步骤2: 使用set_max_transition命令配置transition 在STA环境(如Synopsys PrimeTime)中,主要使用`set_max_transition`命令来设置最大transition时间。该命令的语法为: ```tcl set_max_transition <value> <object> ``` - **参数解释**: - `<value>`:最大允许的transition时间,单位需与STA工具一致(默认为ns)。值的选择基于工艺库(technology library)或设计规范,例如0.6ns表示600ps。 - `<object>`:应用约束的对象,可以是: - 特定端口或引脚:如`[get_ports clk]`。 - 时钟域或模块:如`IOBANK`(引用[2]示例)。 - 整个设计:使用`[current_design]`。 - **命令作用**:STA工具会检查指定对象上的信号transition是否超过设定值,如果超标,会以负slack形式报告违规[^2]。 #### 步骤3: 配置示例和最佳实践 以下是一个完整的STA脚本示例,展示如何设置transition约束。假设设计为同步电路,时钟频率为100MHz(周期10ns),我们需要约束输入端口和整个设计的transition。 ```tcl # 定义时钟(引用[3]) create_clock -name clk -period 10 [get_ports clk] # 设置输入端口transition约束(例如,最大transition为0.5ns) set_max_transition 0.5 [get_ports data_in] # 设置整个设计的transition约束(例如,最大transition为0.6ns,引用[2]) set_max_transition 0.6 [current_design] # 其他相关约束(可选,如输入/输出延迟) set_input_delay 2 -clock clk [get_ports data_in] set_output_delay 1 -clock clk [get_ports data_out] # 运行STA分析 report_timing ``` - **输出解释**:执行`report_timing`后,STA工具会列出路径的transition时间。如果任何信号超过0.5ns或0.6ns,报告会显示类似: ``` Violator: net U1/A, Transition: 0.65ns (Required: 0.6ns), Slack: -0.05ns ``` - **最佳实践**: - **选择合适值**:参考工艺库文档(如.lib文件)中的max_transition值。例如,高速设计常用0.1–0.5ns,低速设计可放宽到0.5–1ns。 - **单位一致性**:确保所有约束单位统一(如使用`set_units -time ns`)。 - **对象范围**:优先约束关键路径(如时钟端口),避免过度约束整个设计。 - **结合其他约束**:transition设置需与时钟定义、false path(引用[5])等协同,确保整体STA环境完整[^2][^3]。 - **常见错误**: - 值设置过严(如0.2ns),导致大量违规无法收敛。 - 忽略对象指定,造成约束遗漏。 #### 步骤4: 验证和调试 - **验证方法**:运行STA后,使用`report_constraint -all_violators`检查transition违规。修复方法包括: - 优化电路:增加缓冲器(buffer)减小RC延迟。 - 调整约束:如果误报,检查是否与其他命令冲突(如set_false_path引用[5])。 - **调试提示**:在STA工具中,使用波形查看器(如PrimeTime Waveform)可视化transition超标点。 #### 注意事项 - **影响分析**:transition设置不当可能导致时序违例或功耗增加。根据引用[2],set_max_transition是STA环境的基础约束,需与set_max_capacitance等命令配合[^2]。 - **工具依赖**:不同STA工具(如Cadence Tempus)语法可能略有差异,但核心逻辑相同。 - **性能权衡**:在高速设计中,transition值越小,时序越严格,但可能增加面积和功耗。 通过以上步骤,您可以有效地在STA中配置transition约束,确保设计满足时序要求。如果遇到具体问题,提供更多设计细节(如时钟频率或工艺节点)可以进一步优化配置。 ### 相关问题 1. 如何确定STA中transition约束的合适值? 2. transition时间超标会对电路性能产生什么具体影响? 3. STA中除了transition,还有哪些关键时序约束需要配置? [^1]: 常用来限制分析空间的四种常见命令如下: i. set_case_analysis:在单元的引脚或输入端口上指定常量值; ii. set_disable_timing:中断单元的时序弧; iii. set_false_path:指定实际不存在的路径,这意味着在STA中不需要检查这些路径; iv. set_multicycle_path:指定可能花费超过一个时钟周期的路径; [^2]: STA 静态时序分析 第七章——STA环境的配置(2)。作为STA的一部分,任何违背上述规则的行为,都会以裕度(slack)的形式来报告。 set_max_transition 0.6 IOBANK # Sets a limit of 600ps on IOBANK. set_max_capacitance 0.5 [current_design] # Max capacitance is set to 0.5pf on all nets in # current design. [^3]: 大多数的数字电路设计是同步的,假定DUA会与其他同步设计交互,这意味着DUA会从前一级DFF接收数据,并将数据发送到DUA后一级DFF。为了对这种设计执行STA,需要设定DFF的时钟、进入DUA和退出DUA的所有路径上的约束。 [^4]: 边沿列表中的边沿序列必须以非降序排列,但是同一边沿可重复使用,以指示不同于源时钟占空比的时钟脉冲。上例中的-edge_shift选项通过将源时钟的边沿 1 移位 0ns 获得了衍生时钟的第一个边沿,通过将源时钟的边沿 1 偏移 5ns 获得了衍生时钟的第二个边沿,而通过将源时钟的边沿 5 移位 0ns 获得了衍生时钟的第三个边沿。下图 7-17 显示了上述波形: Invert 的使用 [^5]: set_false_path:伪路径,不是时序路径;如跨时钟域电路。则可以设置这条指令,不去进行时序分析。 脚本: set_false_path -from [get_clocks USBCLK] -to [het_clocks MEMCLK]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Starry丶

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值