Clock定義指令
Clock分為兩大類,一類是root clock,其定義指令是 create_clock ;另外一類是generated clock,其定義指令是 create_generated_clock 。在做設計約束時,如何選擇合適的約束指令和指令option是非常關鍵的,這將直接影響到工具的行為,如果選擇有誤,將會讓工具的行為不符合自己的預期。
create_clock ** option淺析**
圖1 create_clock介紹
如圖1中所示,列出了create_clock的所有option以及其詳細的解釋。在這些當中加“[]”的為可選項,其它的為必選項。其中比較關鍵的-add,推薦大家最好是都要加上,防止PAD/port共用,造成clock被覆蓋;-name,推薦大家一定要加上,杜絕系統自動分配命名。
create_generated_clock option淺析
圖2 create_generated_clock options
如圖2所示,列出了create_generated_clock的所有option以及詳細解釋,供大家參考。在這些當中,用“}”包起來的可以看做是一組參數,有類似的功能。接下來,重點跟大家探討下create_generated_clock中的一些option的使用區別。
multiply_by/duty_cycle詳解
首先說下multiply_by選項,其意思是倍頻多少,主要應用在PLL的倍頻clock的輸出點的clock的定義,如果其master clock的duty cycle不是50%,然而,經過PLL之后,duty cycle往往都是設計成50%輸出,所以可以配合-duty_cycle選項改變定義的clock的duty cycle。
divide_by/edges詳解
divider_by表示除頻的意思,例如最常見的2分頻電路可以用-divide_by 2定義,如圖3右中波形所示。但是有時,design設計的divider可能是采用ICG抹掉時鐘邊沿的方式實現的,如圖3左所示。這時經過divider之后出來的波形并不是標準的2分頻波形,這時候就不能直接采用-divider_by 2的方式定義分頻之后的clock,因為如果采用了divide_by的方式定義了,那么其工具認知的行為波形,跟design實際輸出的波形是不符的,如果分頻后的時鐘,應用在falling edge觸發的DFF當中,可能就會造成工具timing check錯誤。(此處不詳細解釋了,大家可自己畫波形思考)
圖3 divide_by/edges options
invert/preinvt/edge_shift詳解
-invert/preinvert分別表示:先定義clock后clock取反還是先clock取反后定義clock。我通過兩個例子跟大家解釋一下。如圖4所示,將剛才圖3右中clock的定義點修改到register的Q-pin上,如果繼續使用-divide_by 2的方式定義此clock,那么工具認為的DFF/Q的波形應該是圖4右所示的。但是實際上,分析可以知道,design輸出的clock波形應該是圖4左所示的波形。
工具在做setup timing分析時,是從launch DFF的觸發沿到capture DFF的下一個觸發沿之間的時間,所以基于錯誤的clock定義之后,工具的timing check行為將變成圖4右藍色箭頭所示的行為。但是實際design預期的行為應該是圖4左藍色箭頭的行為。從圖中對比可以看出,工具timing check與designer預期不符。如果要正確的在DFF/Q pin上定義clock,應該加上-invert選項(即-divide_by 2 -invert)。
圖4 invert option示例
雖然在圖4示例中,工具的行為跟designer預期不符,但是分析可知,此時是加緊了工具的行為,即變得悲觀了,可能結果是浪費一些PPA,但是不至于design最終行為出錯。但是如果出現如圖5所示的情況就不一樣了。如果是按照圖5所示的分頻設計,我們同樣在DFF/Q pin上定義2分頻的clock,同樣僅使用-divide_by 2的方式,那么定義完之后,工具認為的clock波形是如圖5右所示的情況,而design實際的波形應該是圖5左所示的情況。這時工具如果繼續按照圖5右藍色箭頭去做setup timing check,很明顯是放松了對整個design的行為約束,這樣導致的后果將是,最終timing收斂完成之后,行為跟實際design的行為不符,完全沒有達到預期的timing約束程度,導致整個design失敗。如果design如圖5中所示,我們想在DFF/Q pin上正確的定義clock,需要加上-preinvert選項(-divide_by 2 -preinvert)。
圖5 preinvert option示例
在圖4,圖5中的clock定義,上面講到的都是如果采用-divide_by的方式如何正確的定義,那么能不能采用-edge的方式來定義呢?以圖5為例,可以替換成-edge并且配合-edge_shift的方式來定義,其定義方式如圖6所示。但是,此處需要注意,-edge_shift,其后面list列表中的數目要跟-edge中list數目完全一致,并且,-edge_shift后面list中的number可以為正,可以為負,如果為正,則表示右移,為負則表示左移,其是float類型的,表示右移/左移多少個時間單位。
圖6 edge_shift option示例
圖6中的定義,那么能不能直接用-edges {2 4 6}的方式呢?以及圖4中的示例,能不能替換為-edges的方式定義呢?可以自己思考一下。
敲黑板,劃重點
在此可以跟大家分享兩條基本原則,有助于分析clock定義是否合理。采用create_generated_clock定義的clock,其一:繼承的mater clock的edge一定要正確;其二:跟master clock之間的實際通路一定要物理上存在,并且要通。總結起來就是,clock定義要按照實際design來定義,不能想當然,如果在不清楚如何使用option時,可以先手畫波形圖,然后按照圖再去選擇option的使用。
-
分頻器
+關注
關注
43文章
492瀏覽量
51142 -
觸發器
+關注
關注
14文章
2039瀏覽量
62129 -
PLL電路
+關注
關注
0文章
92瀏覽量
6801 -
dff
+關注
關注
0文章
26瀏覽量
3651
發布評論請先 登錄
Stm32_Clock_Init函數如何定義
介紹一下STM32L151的clock tree
基于Stm32_Clock_Init()函數的流水燈設計
什么是Clock Tree
探討一下深度學習在嵌入式設備上的應用
請教一下各位標準單元庫中clock buffer的設計很復雜嗎
探討軟件定義未來醫療的新藍圖
怎樣通過設置clock group來確認各個時鐘之間的關系?

時序分析基本概念介紹<generate clock>

評論