vivado时序约束中get_xxx有哪些
✅ 时钟约束不是物理“线”,而是定义 STA 里的时钟对象。在已知的根源点约束,后续用 generated clock 衍生。⚠️ 如果在中间层级建主时钟,可能丢失前级路径的建模。
在 Vivado 的 Tcl STA 环境里,常见的 get_xxx 命令是用来获取不同对象的集合,便于你写时序约束或做调试。下面给你做一个分类总结:
1. 设计层次对象
-
get_ports
获取顶层设计的输入/输出端口(对应 FPGA 的 package pin)。
用途:IO 延时约束 (set_input_delay/set_output_delay)。 -
get_pins
获取单元的管脚(寄存器的 D/Q,LUT 输入输出,模块实例的端口)。
用途:内部时序约束(set_max_delay、create_generated_clock等)。 -
get_cells
获取设计实例(逻辑单元、模块实例、触发器等)。
用途:对特定单元设置属性,或者作为get_pins的前置。 -
get_nets
获取网络信号(连接在端口或管脚之间的连线)。
用途:调试、布线约束。
2. 时钟相关对象
-
get_clocks
获取设计中的时钟对象(由create_clock或create_generated_clock定义)。
用途:时序约束的基础,例如延时约束引用的时钟。 -
get_generated_clocks
获取由原始时钟派生出来的时钟。
用途:确认分频、倍频、MMCM/PLL 输出的时钟。
3. I/O & 物理资源
-
get_sites
获取 FPGA 物理位置(例如 SLICE_X0Y0、IOB_X1Y12)。
用途:布线/IO 约束。 -
get_package_pins
获取封装引脚。
用途:IO 绑定。 -
get_iobanks
获取 I/O bank 资源。
用途:IO 电压、标准相关约束。
4. 约束/属性对象
-
get_timing_paths
获取具体的时序路径。
用途:做时序分析或调试。 -
get_clock_interaction
查看不同 clock domain 的交互。 -
get_false_paths/get_multicycle_paths
获取你设置的例外路径约束对象。
5. 典型用法示例
# 获取顶层所有输入端口
get_ports *
# 获取名为 data_out 的寄存器输出管脚
get_pins -hier *data_out_reg/Q
# 获取名为 clk 的时钟
get_clocks clk
# 获取所有 PLL/MMCM 生成的时钟
get_generated_clocks
# 获取一个模块实例
get_cells -hier *my_module*
Vivado 的时钟约束对象不是“信号线”本身,而是 STA 里识别的时钟对象 (clock object)。
1. 时钟约束的本质
create_clock或create_generated_clock定义时钟后,Vivado 会在时序图里生成一个 时钟对象。- 这个对象不是物理线,而是 从某个端点(port/pin/net)出发,沿着时钟树传播 的抽象。
- 只要你约束了时钟的 根源 (source point),Vivado 就会沿着所有 buffer、BUFG、MMCM、PLL 等传播。
2. 不同层级的约束效果
-
顶层端口约束:
比如 FPGA 的输入时钟clk_in,你在顶层端口上create_clock,就能覆盖整棵时钟树。create_clock -period 10 [get_ports clk_in] -
内部节点约束:
如果你在内部 BUFG/MMCM 输出端口上约束,也可以生效:create_clock -period 10 [get_pins my_mmcm/CLKOUT0]但这样会失去输入时钟到 MMCM 的延迟建模,等效于“只告诉 STA 这个点之后的时钟是 100 MHz”,而没覆盖到前级路径。
-
重复约束:
如果对同一时钟树既在顶层端口又在 BUFG 上建时钟,Vivado 可能会报 时钟重叠 (overlapping clocks) 的 warning。
3. 正确做法
-
原则:时钟约束应定义在 最根源的已知时钟(通常是顶层输入端口或 FPGA 内部 PLL/MMCM 输出)。
-
输入时钟 → 用
create_clock [get_ports clk_in]。 -
PLL/MMCM/BUFG 分频/倍频输出 → 用
create_generated_clock。create_generated_clock -name clk_div2 -source [get_pins u_mmcm/CLKIN1] \ -divide_by 2 [get_pins u_mmcm/CLKOUT0]
这样 STA 才能准确理解整个时钟域的关系。
4. 总结
- ✅ 时钟约束不是物理“线”,而是定义 STA 里的时钟对象。
- ✅ 在任意层级都能约束,但最佳实践是:在已知的根源点约束,后续用 generated clock 衍生。
- ⚠️ 如果在中间层级建主时钟,可能丢失前级路径的建模。
火山引擎开发者社区是火山引擎打造的AI技术生态平台,聚焦Agent与大模型开发,提供豆包系列模型(图像/视频/视觉)、智能分析与会话工具,并配套评测集、动手实验室及行业案例库。社区通过技术沙龙、挑战赛等活动促进开发者成长,新用户可领50万Tokens权益,助力构建智能应用。
更多推荐
所有评论(0)