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

【数字静态时序分析】复杂时钟树的时序约束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.kler.cn/a/390732.html

相关文章:

  • 车载空气净化器语音芯片方案
  • idea 解决缓存损坏问题
  • 【VBA实战】用Excel制作排序算法动画续
  • stringUtils详细解释
  • YUM 的使用
  • 【css】html里面的图片宽度设为百分比,高度要与宽度一样
  • 视觉SLAM数学基础
  • 《重学Java设计模式》之 原型模式
  • K8资源之endpoint资源EP资源
  • 2024年计算机视觉与图像处理国际学术会议 (CVIP 2024)
  • (十)Python字典基本操作
  • Netty实现WebSocket Server是否开启压缩深度分析
  • 6. ARM_ARM指令寻址
  • 【MongoDB】MongoDB的存储引擎及Wiredtiger的读/写缓存、数据结构设计、Page生命周期等实现原理(超详细)
  • 数字化转型实践:金蝶云星空与钉钉集成提升企业运营效率
  • 刘艳兵-DBA028-您可以在 ORCL1 和 ORCL2 数据库都运行其实例的主机上安装“独立服务器的 Oracle 网格基础结构“。哪两个陈述是正确的?
  • Day106:代码审计-PHP原生开发篇文件安全上传监控功能定位关键搜索1day挖掘
  • 力扣 二叉树的最大深度-104
  • 【qt】控件篇(Enable|geometry)
  • ubuntu20.04 ROS 临时修改功能包名并作一系列对应修改 (ubuntu20.04)
  • 梧桐数据库聚合函数使用举例
  • docker desktop运行rabittmq容器,控制台无法访问
  • 各种环境换源教程
  • 智启未来,趣享生活 德国卡赫举办系列新品首发活动
  • 例题解析:利用异或运算(XOR)找出单独的数
  • 2.索引:MySQL 索引分类