我們先看UG949中舉的例子:
時序場景如下圖所示,clk0和clk1兩個時鐘輸入,經過BUFGMUX后,輸出到后面的邏輯,但同時clk0和clk1還分別驅動了其他邏輯。
此時,如果路徑A/B/C都不存在,其中A路徑表示clk0與選擇器輸出的時鐘之間的數據交互,B路徑表示clk1與選擇器輸出的時鐘之間的數據交互,C路徑表示clk0和clk1之間的數據交互,那么使用下面的約束就可以了:
set_clock_groups-logically_exclusive-groupclk0-groupclk1
如果clk0和clk1之間有數據交互,則需要使用下面的約束:
create_generated_clock-nameclk0mux-divide_by1 -source[get_pinsmux/I0][get_pinsmux/O] create_generated_clock-nameclk1mux-divide_by1 -add-master_clockclk1 -source[get_pinsmux/I1][get_pinsmux/O] set_clock_groups-physically_exclusive-groupclk0mux-groupclk1mux
這里我們解釋一下logically_exclusive和physically_exclusive的區別:
-logical_exclusive
logical_exclusiveisusedfortwoclocksthataredefinedondifferentsourceroots. Logicallyexclusiveclocksdonothaveanyfunctionalpathsbetweenthem,butmighthavecouplinginteractionswitheachother. Anexampleoflogicallyexclusiveclocksismultipleclocks,whichareselectedbyaMUXbutcanstillinteractthroughcouplingupstreamoftheMUXcell. Whentherearephysicallyexistingbutlogicallyfalsepathsbetweenthetwoclocks,use"set_clock_groups-logical_exclusive".
-physical_exclusive
physical_exclusiveisusedfortwoclocksthataredefinedonthesamesourcerootby"create_clock-add". Timingpathsbetweenthesetwoclocksdonotphysicallyexist. Asaresultyouwillneedtouse"set_clock_groups-physical_exclusive"tosetthemasfalsepaths.
簡而言之,logical_exclusive用于選擇器的電路,兩個時鐘的source不一樣;而physical_exclusive兩個時鐘的source是一樣,比如在同一個時鐘輸入口,但可能會輸入兩個不同的時鐘。
下面我們來看下為什么要這樣約束。
我們先來復習一下set_clock_groups的用法,set_clock_groups后面可以加的參數有三個,除了logically_exclusive和physically_exclusive,還有我們最常用的-asynchronous,無論后面是哪個參數,set_clock_groups就是讓工具不去分析我們后面約束的時鐘組,只是這三個參數的應用場景略有不同。
在第一個場景中,clk0和clk1之間沒有數據交互,因此工具不需要分析它們之間的路徑,而且它們后面有時鐘選擇器,符合logical_exclusive的使用場景,因此約束是
set_clock_groups-logically_exclusive-groupclk0-groupclk1
在第二個場景中,clk0和clk1之間是有數據交互的,就不能直接把這個時鐘設置clock group,但經過MUX之后的時鐘,只會有一個存在,這兩個時鐘之間肯定是不存在交互的,所以這兩個時鐘需要設置clock group,而這兩個時鐘有same source root,因此使用的參數是physical_exclusive。
有同學可能會問,對于第一個場景,MUX之后的時鐘也是只存在一個,為什么不需要再分別generate clock,然后設置physical_exclusive呢?
我個人理解,這就跟時鐘傳播有關系,什么情況下時鐘不向后傳播:
Thesourcelatencypathsdonotflowthroughsequentialelementclockpins,transparentlatchdatapins,orsourcepinsofothergeneratedclocks.
選擇器既不是sequential element,也不是latch,因此只要我們后面沒有create generated clock,那么時序路徑就可以繼續向后傳播,我們已經設置了前面的兩個時鐘的logically_exclusive,因此后面的電路,只要時鐘路徑沒有斷,那就都存在logically_exclusive。
需要注意一點:create_clock或者create_generated_clock之后,原來在當前點傳播的clk不在向后傳播
因此,針對上面的電路,假設clk0和clk1之間有數據交互,我們還可以用下面的方法約束:
在pinI0和pinI1處,我們create一個generated_clock,這樣clk0和clk1就不再向mux傳播,但FD0和FD1仍然是clk0和clk1所在的時鐘路徑。(下面默認clk0和clk1已經create)
create_generated_clock-nameclk_I0 [get_pinsmux/I0] -master_clockclk0 -divide_by1 -source[get_portspinclk0] -add create_generated_clock-nameclk_I1 [get_pinsmux/I1] -master_clockclk1 -divide_by1 -source[get_portspinclk1] -add set_clock_groups-logically_exclusive-groupclk_I0-groupclk_I1
在網上還看到有個說法,而且已經經過了DC工具的驗證:set_clock_groups的三個參數asynchronous、logically_exclusive和physically_exclusive的實際作用是一樣的,都是設成異步,因此上面的約束中,這三個參數可以隨便用。
但是既然工具給出了三種參數的使用場景,那我們就應該按照場景來使用這三個參數。
審核編輯:湯梓紅
-
時鐘
+關注
關注
11文章
1747瀏覽量
131863 -
約束
+關注
關注
0文章
82瀏覽量
12777 -
選擇器
+關注
關注
0文章
109瀏覽量
14593
原文標題:經過BUFGMUX的時鐘該如何約束(更新)
文章出處:【微信號:傅里葉的貓,微信公眾號:傅里葉的貓】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
FPGA時序約束之衍生時鐘約束和時鐘分組約束
FPGA時鐘約束問題
BUFGMUX出現錯誤:地點:1108幫助/原因?
BUFGMUX定時時鐘偏差太大
為什么使用并發賦值語句而不是BUFGMUX原語?
DCM輸出時鐘約束的示例
時序約束一主時鐘與生成時鐘
![時序<b class='flag-5'>約束</b>一主<b class='flag-5'>時鐘</b>與生成<b class='flag-5'>時鐘</b>](https://file1.elecfans.com/web3/M00/00/6A/wKgZPGdJL3mAa0qAAAATtpEneAs782.png)
評論