zoukankan      html  css  js  c++  java
  • 关于过两级mux的时序约束的添加(一个非常经典的时序约束问题)

    非常开心自己的微信公众号:

    《数字集成电路设计及EDA教程》

    关注者超过了1700

    里面主要讲解数字IC前端、后端、DFT、低功耗设计以及验证等相关知识,并且讲解了其中用到的各种EDA工具的教程。

    为了纪念,同时考虑到微信公众平台上面发布的很多推文百度搜索不到,所以以后的推文也会在这里进行转载。

     

    一文、一曲、一图

    文:

     《童话里的生日祝福》

     微风躲在霞草里舞蹈

    提醒我你的生日快到

    玫瑰刺拽着衬衫衣角

    你的礼物我怎么会忘掉

    绵云像麦芽糖被阳光发酵

    是你也想了解的味道

    我站在山坡上踮起脚

    只有这个角度刚刚好

    想象里摘一朵送给你要不要

    下过雨的天怎么更吸引小鸟

    关于这个问题我一直在思考

    原来是涂了彩虹颜色的唇膏

    于是我悄悄偷一点放在你的化装盒

    想你也一定喜欢得不得了

    庄园里刚结出的花苞

    九百九十九朵不多也不少

    让我用勤劳培育给你的祈祷

    那一株花蕊轻盈像你的睫毛

    那一朵欲放未放是你羞涩而温暖的笑

    风车缓缓地绕陪着牛儿吃草

    夕阳懒懒地照在等黎明破晓

    你倔起嘴巴在撒娇

    又溜走一岁这时光飞逝的年少

    风筝飞呀飞系着愿望在飘

    秋千摇呀摇我累得快睡着

    想起这首旋律古老的歌谣

    化身田园诗人为你唱:

    祝你生日快乐

    祝你生日快乐

    祝你生日快乐

    祝你生日快乐

     

    曲:

    暂时不知道怎么弄

     

    图:

     

    时序约束是逻辑综合以及布局布线中一个非常重要的环节,如果设计中时钟非常多,那么时序约束将非常复杂,下面给出一个经典案例来给出多时钟且时钟经过两级MUX的时序约束问题的最佳解决方案。

     

    关于过两级mux的时序约束的添加

    参考链接:http://bbs.eetop.cn/thread-458928-1-1.html

     

    如上图,分频器都是寄存器做的,mux是用组合逻辑实现的,时序图列出了clkx与clkz之间4分频时的数据采集关系。

     

    问:本电路完整的时序约束SDC文件,尤其是clkx和clkz之间应该如何约束?

     

    答:

    set_app_var timing_enable_multiple_clocks_per_reg true

     

    create_generated_clock -divide_by 1 -name clkx_div1 -source [get_ports clkx] [get_pins freq_divA/clkx_div1]

    create_generated_clock -divide_by 2 -name clkx_div2 -source [get_ports clkx] [get_pins freq_divA/clkx_div2]

    create_generated_clock -divide_by 3 -name clkx_div3 -source [get_ports clkx] [get_pins freq_divA/clkx_div3]

    create_generated_clock -divide_by 4 -name clkx_div4 -source [get_ports clkx] [get_pins freq_divA/clkx_div4]

    set_clock_group -logically_exclusive -group clkx_div1 -group clkx_div2 -group clkx_div3 -group clkx_div4

     

    create_generated_clock -divide_by 1 -name clky_1 -source [get_pins freq_divA/clkx_div1] [get_pins MUX1/clky]

    create_generated_clock -divide_by 1 -name clky_2 -source [get_pins freq_divA/clkx_div2] [get_pins MUX1/clky] -add

    create_generated_clock -divide_by 1 -name clky_3 -source [get_pins freq_divA/clkx_div3] [get_pins MUX1/clky] -add

    create_generated_clock -divide_by 1 -name clky_4 -source [get_pins freq_divA/clkx_div4] [get_pins MUX1/clky] -add

    set_clock_group -physically_exclusive -group clky_1 -group clky_2 -group clky_3 -group clky_4

     

    create_generated_clock -divide_by 1 -name clky_div1 -source [get_pins MUX1/clky] [get_pins freq_divB/clky_div1]

    create_generated_clock -divide_by 2 -name clky_div2 -source [get_pins MUX1/clky] [get_pins freq_divB/clky_div2]

    create_generated_clock -divide_by 4 -name clky_div4 -source [get_pins MUX1/clky] [get_pins freq_divB/clky_div4]

    create_generated_clock -divide_by 8 -name clky_div8 -source [get_pins MUX1/clky] [get_pins freq_divB/clky_div8]

    set_clock_group -logically_exclusive -group clky_div1 -group clky_div2 -group clky_div4 -group clky_div8

     

    create_generated_clock -divide_by 1 -name clkz_1 -source [get_pins freq_divB/clky_div1] [get_pins MUX2/clkz]

    create_generated_clock -divide_by 1 -name clkz_2 -source [get_pins freq_divB/clky_div2] [get_pins MUX2/clkz] -add

    create_generated_clock -divide_by 1 -name clkz_4 -source [get_pins freq_divB/clky_div4] [get_pins MUX2/clkz] -add

    create_generated_clock -divide_by 1 -name clkz_8 -source [get_pins freq_divB/clky_div8] [get_pins MUX2/clkz] -add

    set_clock_group -physically_exclusive -group clkz_1 -group clkz_2 -group clkz_4 -group clkz_8

     

    之后再继续设定各个generated clokc的uncertainty、network latency和transition:set_clock_transition和set_clock_uncertainty

    以及set_clock_latency -network 。。。,需要写的命令是多一些。但还是比用set_false_path命令好,DC会分析4*4=16条时序路径,

    因此你需要些32句set_false_path命令,而用set_clock_group,只需要4句命令。

    由你的图中,可知clkx_div?四个生成时钟是逻辑上互斥的,物理上不互斥,这样就不会分析它们之间的时序关系,但会分析它们之间的信号

    完整性(PT SI),而引脚clky之后作用在launchregister的时钟之间既是逻辑互斥也是物理互斥。同样可以分析第二个分频器和mux的原理。

     

    当然也可以采用如下写法:

    create_generated_clock -divide_by 1 -name clky_1 -source [get_ports clkx] [get_pins MUX1/clky]

    create_generated_clock -divide_by 2 -name clky_2 -source [get_ports clkx] [get_pins MUX1/clky] -add

    create_generated_clock -divide_by 3 -name clky_3 -source [get_ports clkx] [get_pins MUX1/clky] -add

    create_generated_clock -divide_by 4 -name clky_4 -source [get_ports clkx] [get_pins MUX1/clky] -add

    set_clock_group -physically_exclusive -group clky_1 -group clky_2 -group clky_3 -group clky_4

     

    create_generated_clock -divide_by 1 -name clkz_1 -source [get_pins MUX1/clky] [get_pins MUX2/clkz]

    create_generated_clock -divide_by 2 -name clkz_2 -source [get_pins MUX1/clky] [get_pins MUX2/clkz] -add

    create_generated_clock -divide_by 4 -name clkz_4 -source [get_pins MUX1/clky] [get_pins MUX2/clkz] -add

    create_generated_clock -divide_by 8 -name clkz_8 -source [get_pins MUX1/clky] [get_pins MUX2/clkz] -add

    set_clock_group -physically_exclusive -group clkz_1 -group clkz_2 -group clkz_4 -group clkz_8

    同样设置各个generated clokc的network latency、uncertainty和transition。

     

    问:那DC还会分析clkx 和 clky_div1/clky_div2/clky_div4/clky_div8 之间,以及clkx_div? 与clky_div? 之间的时序关系吗?

     

    答:用set_clock_groups -logicall_exclusive 很方便,只要你不设false path(包括case analaysis,clock groups),dc都会分析

     

    注:物理互斥表示两个时钟不会同时存在,最好用于一个引脚上可能输入几种不同的时钟频率。逻辑互斥表示两个时钟可以同时存在,但最终只有一个时钟有效,一般用于MUX的输出时钟。

     

    如果喜欢也请多多分享哟,谢谢您的关注

  • 相关阅读:
    DataTable Clone()方法和Copy()方法的区别
    element-ui的使用
    解决VS Code 软件PowerShell执行策略问题
    Vue-Router
    Vue的生命周期
    vue-cli脚手架和webpack
    Vue组件
    Vue基本用法和指令
    ES6常用语法
    前端-Bootstrap框架
  • 原文地址:https://www.cnblogs.com/ASIC-Horizon/p/7889800.html
Copyright © 2011-2022 走看看