三种种类的时钟
- primary
- generated
- virtual
同步,非同步,exclusive(专用)时钟,
什么是primary 时钟(主时钟)
主时钟就是从输入端口typically创建的;
create_clock -period 4 [get_ports CLK]
时钟穿过组合逻辑传播(propagate)
unate分为positive unate 和negative unate:
其中positive unate意识是指,输出的上升沿依赖输入的上升沿,输出的下降沿依赖输入的下降沿;
negative unate意思是指,输出的上升沿依赖输入的下降沿,输出的下降沿依赖输入的上升沿;
non-unate意思是,输出的上升沿依赖输入的上升沿或者下降沿,输出的下降沿依赖输入的上升沿或者下降沿
non-unate一般是一个clock加上一个同或,或者异或门构成,分析的时候要设置set_case_analysis
generated clock :internal derived clocks(内部起源的时钟)
create_generated_clock -divide_by 2 -name div_clk -source [get_ports CLK] FF3/Q
关于generated_clock的source latency
generated_clock specification assume 生成时钟要求获得 rise_rise and rise_fall边缘关系
如果时钟路径存在inversion颠倒,那么这种时钟沿关系是不存在的;
从CLK输入下降沿导致在分频寄存器输出上升或者下降沿;这就意味着只有fall_rise fall_fall的edge relationship存在,这个设计不能提供要求的generated_clock的传播路径;这时候就用到zero source latency了;
zero source latency 是解决generated_clock edge relationship的一种方法
指定生成时钟的source pin 也就是dividing flip flop的时钟输入端口;
create_generated_clock -name CLKdiv2 -divided_by 2 \
-source_pin [get_pins Udiv/CP] [get_pins Udiv2/Q]
源内部同步
component
virtual clock
这个时钟对象并没有source;
为input/output delay提供参考;
create_clock -period 5 -name vclk
set_input_delay -max 2 -clock vclk [get_ports in1]
set_output_delay -max 2 -clock vclk [get_ports out2]
使用report_clock for all clock
使用-full_clock_expanded 选项报告generated_clock的source latency
report_timing -to sd_DQ[0] -path_type full_clock_expanded
同步时钟与非同步时钟\
却别在于 edge_edge relationship, 在非同步时钟下,两个时钟的edge是没有关系的;
全面的分析 != 有规划的分析
STA的分析是全面的,但有些不存在的路径也会分析进去; 特别是在多时钟的时候;
所以clock relationship必须被正确的定义;
interacting clock 互相作用时钟和multiple STA的运行;
如何在单次分析中,将所有的时钟 path 覆盖
set_clock_groups -logically_exclusive -group clk1 -group clk2
set_clock_groups -logically_exclusive -group clk3 -group clk4
时钟组可以 logically or physically exclusive 逻辑上和物理上的隔离(独立)
automatic inference of clock muxes 时钟选通器的自动诊断
set timing_enable_auto_mux_clock_exclusivity true
#这样就会自动识别clock mux 将 clk1 和 clk2 隔离开来
下面可以正常的create_clock 不用set_clock_group -physically_exclusive
而且 clock mux 可以被报告出来,而且已经被写到attribute中,可被queried
report_clock -exclusivity
#或者检查属性
get_attribute [get_pins Mux/z] is_clock_exclusivity
#它会返回true 或者 false
reliable 准确的 data capture
interacting 相互作用的
override: 手动控制 手动消除
clock crossing 时钟交叉 clock domain crossing时钟域交叉
restore_session savedsession
check_timing -v -override clock_crossing
report for unconstrained paths
set_app_var timing_report_unconstrained_paths true
report_timing -from [get_clocks SYS_CLK] -to [get_clocks SDRAM_CLK]
如果你report_timing时 它提示信息为no_constrained_Path 可用以上方法,报告出未约束的路径长度;
如果提示信息为: No paths:
那就没有办法报告,之间不存在path
在非同步的时钟域存在没有约束的路径;
为了更好的减少运行时间,建议关闭报告没有约束路径的选项:
附加的检查和约束
1. 非同步的clear/reset pin
寄存器的非同步的复位/置位pin的assertion是被考虑为非同步的,并且对于静态时序分析的工具来说是没办法计算其timing的;
所以 在STA 分析中有这样的两个值:
recovery:
这个类似setup 的检查;在有效的时钟上升沿之前,非同步信号变有效的时间
removal:
与hold 检查类似;
2. clock gating
3.data to data check
4.clock_min_pulse width
1.基于锁存器的分析
锁存器是电平敏感的devise
一个锁存器除了G-Q之外,还有一个D-Q的timing arc
D-Q的timing arc is used if timing borrowing is involved
咱也不知道 这个timing borrowing 汉语翻译过来是个啥玩意;
timing borrow: