SDC是如何炼成的?create_generated_clock花式定义方法

定义时钟
从最早的芯片规格定义分解出系统所需要的时钟和频率,以及各个模块需要的时钟和频率。soc的时钟一般是由pll产生,然后经过时钟生成电路和分配网络,最终给具体的功能模块使用。一般地,第三方ip供应商都会提供比较成熟的sdc,soc集成时需稍作修改。对于自研的ip和soc顶层,设计人员在提供rtl的同时,也需提供一份时钟结构图,一方面是方便撰写sdc,另一方面对后端pnr有针对性的进行cts也非常有帮助。
时钟结构图分不同的层次,或抽象或具体,看具体的需要了,下面是一颗mcu全局时钟分布的结构图,大家有个认识就可以:
基于详细的时钟结构图,定义时钟的命令有两个:create_clock和create_generated_clock
其中,create_clock命令比较简单易懂,格式如下:
create_clock [-name clock_name] \\ -period period_value \\ [-waveform edge_list] \\ [-add] \\ [source_objects]create_generated_clock命令解析
create_generated_clock命令格式如下,主要是定义generated clock和master clock的关系:
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_objectscreate_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_clockreport_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; zerosource latency will be used. (uite-461)error: generated clock 'clkdiv2 with source pin udiv/q' 'fall_edge' is not satisfiable; zerosource 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 clkcreate_generated_clock -name clkbypass \\ -source [get_ports clk] \\ -master clk \\ -divide_by 1 \\ -combinational \\ -add \\ umux/ycreate_generated_clock -name clkdiv2 \\ -source ffdiv2/ck \\ -master clk \\ -divide_by 2 \\ -add \\ umux/ycreate_generated_clock -name clkdiv4 \\ -source ffdiv4/ck \\ -master clk \\ -divide_by 4 \\ -add \\ umux/yset_clock_groups -physically_exclusive \\ -group {clkbypass} \\ -group {clkdiv2} \\ -group {clkdiv4}注意,这种方式定义时钟看似合理,但是容易造成问题,因为在clk和umux/y之间有三条不同的路径,延迟大小不同,所以在计算timing时,在launch path和capture path上选择的路径会不同,带来悲观的影响,如下图所示,也有可能在计算min_pulse_width时造成假的违例。
在solvnet上给出了更恰当的处理方式,具体命令如下:
# create parent clockcreate_clock -period 10 clk# create divide-by-2, divide-by-4 generated clockscreate_generated_clock -name clkdiv2 -divide_by 2 ffdiv2/q -source ffdiv2/ckcreate_generated_clock -name clkdiv4 -divide_by 4 ffdiv4/q -source ffdiv4/ck# create muxed versions of all clocks arriving at muxcreate_generated_clock -name clk_mux -combinational umux/a -source umux/acreate_generated_clock -name clkdiv2_mux -combinational umux/b -source umux/bcreate_generated_clock -name clkdiv4_mux -combinational umux/c -source umux/c# create divide-by-3 versions of all clocks arriving at ffdiv3create_generated_clock -name clk_mux_div3 \\ -divide_by 3 ffdiv3/q -source ffdiv3/ck -master clk_mux -addcreate_generated_clock -name clkdiv2_mux_div3 \\ -divide_by 3 ffdiv3/q -source ffdiv3/ck -master clkdiv2_mux -addcreate_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 muxset_clock_groups -physically_exclusive \\ -group {clk_mux clk_mux_div3} \\ -group {clkdiv2_mux clkdiv2_mux_div3} \\ -group {clkdiv4_mux clkdiv4_mux_div3}

神奇Li-Fi市场坐拥千亿美元“前景” 如今它有何最新成果?
千方科技宣布新的AI子公司博观智能正式落处济南
供应罗德与施瓦茨DVSG数字视频信号源
图文详解17种电容的分类
工业互联网创新发展助推制造业数字化转型
SDC是如何炼成的?create_generated_clock花式定义方法
智能路由器大战一触即发,生态环境尚需完善
智嵌物联4G DTU/RTU系列产品接入阿里云演示
中国EDA战略研讨会暨华大九天成立大会召开
研华工控机工业平板电脑在巡检场景中的应用
新一轮集成电路产业扶持规划或近期出台
Transography美国数据产品为交通建模和分析提供准确性
新加坡发明更快速持久的防伪新技术
Aeroflex推出全球首款用于飞机航线测试的便携式射频高度
小米A3系列新机通过FCC认证
区块链在商品防伪溯源上有没有作为
苹果、三星、华为、LG 和小米等已大量投资 AI 的开发
为何中国移动如此急着推动5G商用
亨通海底光缆累计交付量已突破1万公里
2012 款宝马 X6 xDrive35i 车 中央显示屏经常会提示“发动机异常”