在 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_delaycreate_generated_clock 等)。

  • get_cells
    获取设计实例(逻辑单元、模块实例、触发器等)。
    用途:对特定单元设置属性,或者作为 get_pins 的前置。

  • get_nets
    获取网络信号(连接在端口或管脚之间的连线)。
    用途:调试、布线约束。


2. 时钟相关对象

  • get_clocks
    获取设计中的时钟对象(由 create_clockcreate_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_clockcreate_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 衍生
  • ⚠️ 如果在中间层级建主时钟,可能丢失前级路径的建模。

Logo

火山引擎开发者社区是火山引擎打造的AI技术生态平台,聚焦Agent与大模型开发,提供豆包系列模型(图像/视频/视觉)、智能分析与会话工具,并配套评测集、动手实验室及行业案例库。社区通过技术沙龙、挑战赛等活动促进开发者成长,新用户可领50万Tokens权益,助力构建智能应用。

更多推荐