基于详细的时钟结构图,定义时钟的命令有两个:create_clock和create_generated_clock
其中,create_clock命令比较简单易懂,格式如下
create_clock [-name clock_name] \
-period period_value \
[-waveform edge_list] \
[-add] \
[source_objects]
create_generated_clock [-name clock_name] \
-source master_pin \
[-master_clock clock] \
[-edge edge_list] \
[-edge_shift shift_list] \
[-divide_by factor] \
[-multiply_by factor] \
[-duty_cycle percent] \
[-combinational]
[-invert] \
[-add] \
source_objects
create_generated_clock 需要指定源时钟(master clock)的master_pin,在CTS时,默认会去balance这两个时钟(即generated clock 和 master clock),让skew尽可能小。
而且在计算generated clock的clock latency时,会把从master clock pin 到generated clock pin之间的delay也考虑在内。
在工具中report_timing的时候,通过选项-path_type full_clock_expanded可以将master clock的部分也展开。
report_timing -path_type full_clock
report_timing -path_type full_clock_expanded
需要注意:在使用create_generated_clock时,需要保证电路结构和命令的效果是一致的,否则工具在report_timing时会报错,比如下面的错误(UITE-461),这时就要仔细检查分频电路结构了。
Error: Generated clock 'CLKdiv2 with source pin Udiv/Q' 'rise_edge' is not satisfiable; zero
source latency will be used. (UITE-461)
Error: Generated clock 'CLKdiv2 with source pin Udiv/Q' 'fall_edge' is not satisfiable; zero
source latency will be used. (UITE-461)
简单2分频
先看一个简单的2分频的实际的例子,命令和效果图如下:
create_clock -name SYSCLK \
-period 2 \
[get_ports SYSCLK]
create_generated_clock -name DIVIDE \
-source [get_ports SYSCLK] \
-divide_by 2 \
[get_pins FF1/Q]

考虑了edge/edge_shift的3分频实例
下面是3分频的实例,-edge选项中{3 5 9}分别表示SYSCLK的第3、5、9个时钟沿(clock edge),也分别对应DIV3B的一个完整时钟周期(上升、下降、上升)的时钟沿时间点。
而-edge_shift选项{2.2 2.2 2.2}表示将DIV3B每个时钟沿都往后延迟2.2ns,命令和效果图如下:
create_clock -name SYSCLK \
-period 2.2 \
[get_ports SYSCLK]
create_generated_clock -name DIV3B \
-source [get_ports SYSCLK] \
-edges { 3 5 9 } \
[get_pins U3/Q]
create_generated_clock -name DIV3C \
-source [get_ports SYSCLK] \
-edges { 3 5 9 } \
-edge_shift {2.2 2.2 2.2} \
[get_pins U4/QN]

考虑invert/preinvert的实例
create_generated_clock使用-invert/-preinvert选项都表明generated clock与master clock相位相反,但这两个选项的区别是:
-
preinvert : Creates a generated clock based on the inverted sense of the master clock.
-
invert : Creates an inverted generated clock based on the non-inverted sense of the master clock.
命令和效果图如下:
create_generated_clock -name gclk_pos \
-source [get_pins FF1/CLK] \
-divide_by 2 \
[get_pins FF1/Q]
create_generated_clock -name gclk_neg \
-source [get_pins FF1/CLK] \
-divide_by 2 \
-preinvert \
[get_pins FF1/Q]
create_generated_clock -name glk_inv \
-source [get_pins FF1/CLK] \
-divide_by 2 \
-invert \
[get_pins FF1/Q]
同一点定义多个generated clock
在实际电路中比较常见的情况是,不同的场景下使用不同频率的时钟来驱动电路,如下图所示,同一个时钟,与经过二分频,四分频后的时钟经过MUX输出给电路使用。
这种情况下,需要在UMUX输出点定义三个时钟CLKbypass/CLKdiv2/CLKdiv4,而且这三个时钟在物理上是不能共存的(physically_exclusive),可以考虑使用以下命令来定义时钟:
create_clock -period 10 CLK
create_generated_clock -name CLKbypass \
-source [get_ports CLK] \
-master CLK \
-divide_by 1 \
-combinational \
-add \
UMUX/Y
create_generated_clock -name CLKdiv2 \
-source FFdiv2/CK \
-master CLK \
-divide_by 2 \
-add \
UMUX/Y
create_generated_clock -name CLKdiv4 \
-source FFdiv4/CK \
-master CLK \
-divide_by 4 \
-add \
UMUX/Y
set_clock_groups -physically_exclusive \
-group {CLKbypass} \
-group {CLKdiv2} \
-group {CLKdiv4}
在Solvnet上给出了更恰当的处理方式,具体命令如下:
# create parent clock
create_clock -period 10 CLK
# create divide-by-2, divide-by-4 generated clocks
create_generated_clock -name CLKdiv2 -divide_by 2 FFdiv2/Q -source FFdiv2/CK
create_generated_clock -name CLKdiv4 -divide_by 4 FFdiv4/Q -source FFdiv4/CK
# create "MUXed" versions of all clocks arriving at MUX
create_generated_clock -name CLK_mux -combinational UMUX/A -source UMUX/A
create_generated_clock -name CLKdiv2_mux -combinational UMUX/B -source UMUX/B
create_generated_clock -name CLKdiv4_mux -combinational UMUX/C -source UMUX/C
# create divide-by-3 versions of all clocks arriving at FFdiv3
create_generated_clock -name CLK_mux_div3 \
-divide_by 3 FFdiv3/Q -source FFdiv3/CK -master CLK_mux -add
create_generated_clock -name CLKdiv2_mux_div3 \
-divide_by 3 FFdiv3/Q -source FFdiv3/CK -master CLKdiv2_mux -add
create_generated_clock -name CLKdiv4_mux_div3 \
-divide_by 3 FFdiv3/Q -source FFdiv3/CK -master CLKdiv4_mux -add
# apply physical exclusivity to all clock families (generated clocks included)
# which are exclusive due to statically switched MUX
set_clock_groups -physically_exclusive \
-group {CLK_mux CLK_mux_div3} \
-group {CLKdiv2_mux CLKdiv2_mux_div3} \
-group {CLKdiv4_mux CLKdiv4_mux_div3}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 周边上新:园子的第一款马克杯温暖上架