当前位置: 首页 > news >正文

【数字静态时序分析】复杂时钟树的时序约束SDC写法

以上图为例,SoC芯片上往往存在几种不同的时钟源,有pll时钟、环振时钟、外部的晶振时钟,在SoC不同的模块或者不同的运行阶段使用的时钟也往往不同,所以在使用的时候,相同的模块会出现选择不同的时钟源的情况。上图的情形就会出现。这里先不展开各个时钟源之间的区别,也不展开clk_mux和div的设计因为还没写哈哈,但是可以去看我clk_gate的那一篇了解下clk_gate。【数字】一篇文章读懂数字芯片中的时钟门控单元/时序/ICG/clk gater-CSDN博客

进入对上述结构的sdc约束:

//进行时钟创建约束
//假设rco、HXT 50M,pll 200M,sleep 32K,LXT 32.768K
//-period表示时钟周期,waveform表示占空比,get_ports指明端口名
create_clock -name rco -period 20 -waveform {0 10} [get_ports rco]
create_clock -name HXT -period 20 -waveform {0 10} [get_ports HXT]
create_clock -name pll -period 5  -waveform {0 10} [get_ports pll]
create_clock -name LXT -period 30517 -waveform {0 15258} [get_ports LXT]
create_clock -name sleep -period 31250 -waveform {0 15625} [get_ports sleep]
//设置时钟的uncertainty
...
set_clock_uncertainty -setup/-hold [period 10%] [get_clocks rco]
...

 至此第一步成功设立,以M0这个mux为例,创建mux两侧的clock,这些clock是源自rco或者HXT的所以需要使用generated clk,创建generated clk的原则是需要使用就近原则,-source的时候需要选择靠近的clk。

//创建M0前的clk,因为实际电路中需要进行SI的分析,需要将这种clk声明出来
//因为将generated clock创建在了不同的pins上,这样可以确保这些generated clock的source latency都是来自指定的位置,保证正确的时序分析
create_generated_clock -name m0_rco_a -source [get_ports rco] -divide 1 [get_pins m0/A]
create_generated_clock -name m0_HXT_b -source [get_ports HXT] -divide 1 [get_pins m0/B]//创建M0 output上的clk
create_generated_clock -name m0_rco_z -divide 1 m0/z -source m0/A -master_clock m0_rco_a -add
create_generated_clock -name m0_HXT_z -divide 1 m0/z -source m0/B -master_clock m0_HXT_b -add//设置logically_exclusive之后能保证这样的时钟线,实际布局的时候会摆放的比较远
set_clock_groups -logically_exclusive -group {m0_rco_a} -group {m0_HXT_b}
//M0后的时钟不会同时出现,所以是物理互斥的
set_clock_groups -physically_exclusive -group {m0_rco_z} -group {m0_HXT_z}

那按照这样的设置我们成功的把M0左右两端的时钟约束成功了!

那现在时钟传播到M2上,对M2进行clock约束。

//M2的A端,这个时候有2个clk已经在之前定义了,M2的B端是PLL的时钟,直接创建MUXed之后的时钟
create_generated_clock -name m2_rco_z -divide 1 m2/z -source m2/A -master_clock m0_rco_z -add
create_generated_clock -name m2_HXT_z -divide 1 m2/z -source m2/A -master_clock m0_HXT_z -add
create_generated_clock -name m2_pll_z -divide 1 m2/z -source m2/B -master_clock pll -add
//声明物理互斥
set_clock_group -physically_exclusive -group {m2_rco_z} -group {m2_HXT_z} -group {m2_pll_z}set_clock_group -logically_exclusive -group {pll} -group {m0_rco_z}
set_clock_group -logically_exclusive -group {pll} -group {m0_HXT_z}

按照这个规律同理我们能得到M1前后的clock,M3前后的clock,最终我们会在M3的Z端得到5个物理互斥的时钟,m3_rco_z,m3_HXT_z,m3_pll_z,m3_sleep_z,m3_LXT_z。

那如果经过DIV之后的DFF需要设置set_output_delay这种输出约束,-clock应该设置在上述哪一个时钟上呢?

因为M3的Z端的时钟必定只有一个输出出去,并且有可能不同情况下输出的时钟频率也不同,可以使用set_case_analysis来指定M0~M3的选择情况,以使用rco为例,sel0~sel3可以是0X00。

set_case_analysis 0 [get_ports {m0/sel m2/sel m3/sel}]
set_case_analysis 1 [get_ports {m1/sel}]

那在DIV之前加一个buf的目的是什么呢?

为了改名!

以m3_rco_z为例,set_output_delay -get_port A -clock m3_rco_z,那如果DIV后的时钟在使用m3_pll_z的时候驱动的是B,那B那边的约束就要把-clock 后面改成m3_pll_z,这样未免有些麻烦,所以用一个buf在那里将名字更改成同一个但是case不同source源不同,这样写不同模块的SDC约束的时候就可以简化很多。

经过分频器之后假设分频系数是3分频,且经过buf的clk为clk_buf

//经过buf的clk
create_generated_clock -name clk_buf -divide 1 buf/Q -source buf/D -master m3_rco_z//经过分频之后的clk
create_generated_clock -name clk_div -divide 3 div/Q -source div/CK -master clk_buf 

另外需要强调的是在设置-asynchronous时

set_clock_groups -asynchronous -group {rco x0} -group {HXT x1}
set_clock_groups -asynchronous -group {rco a0} -group {HXT a1}

x0和a0之间工具仍然会分析,并没认为他们是异步的还需要声明x0与a0的异步关系才能消除工具的分析。

set_clock_groups -asynchronous -group x0 -group a0


http://www.mrgr.cn/news/71308.html

相关文章:

  • 软件测试——自动化测试常见函数
  • Elasticsearch 开放推理 API 增加了对 IBM watsonx.ai Slate 嵌入模型的支持
  • java基础概念37:正则表达式2-爬虫
  • django——创建 Django 项目和 APP
  • [QDS]从零开始,写第一个Qt Design Studio到程序调用的项目
  • 定时器的小应用
  • 力扣 LeetCode 704. 二分查找(Day1:数组)
  • 移门缓冲支架的作用与优势
  • 继承的学习
  • 虚拟机的安装
  • 软件设计课程笔记
  • 一篇文章学会-图标组件库的搭建
  • 前端监控与埋点 全总结
  • 使用R语言survminer获取生存分析高风险和低风险的最佳截断值cut-off
  • python基础概念
  • 论分布式事务及其解决方案
  • Linux(CentOS 7) yum一键安装mysql8
  • 【Linux】注释和配置文件的介绍
  • 丹摩征文活动|智谱AI引领是实现文本可视化 - CogVideoX-2b 部署与使用
  • 访问网页的全过程(知识串联)
  • linux本地磁盘分区
  • IO作业5
  • 使用YOLOv9进行图像与视频检测
  • C++根据特定字符截取字符串
  • 蓝队基础知识和网络七层杀伤链
  • 中阳智能交易模型的进阶探索与实战应用