關於過兩級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的輸出時鍾。

 

如果喜歡也請多多分享喲,謝謝您的關注


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM