時序邏輯電路示意圖如下。前后兩級寄存器之間有一個組合邏輯運算電路。
假設(shè)寄存器的建立時間要求為tsetup, 保持時間要求為thold, 輸出延時為tcq(這些參數(shù)只要工藝庫或者器件確定了,就是確定的);組合邏輯電路的運算延時為tlogic; 兩級寄存器之間的clk線路延時為tclk_delay;clk的隨機抖動為tjitter;tcycle為時鐘周期。故電路必須滿足如下建立時間,保持時間要求:
tsetup_slack=tcycle-(tcq+tlogic) -tsetup+tclk_delay-tjitter>0
thold_slack=tcq+tlogic-thold-tclk_delay-tjitter>0
當(dāng)tsetup_slack要求不滿足時,我們可以選擇增大tcycle。當(dāng)然這就使得電路的整體時鐘頻率下降,從而速度下降。
從另一個角度考慮,我們可以通過減少tlogic來使得電路的建立時間裕量滿足要求。 達到這個目的,只有兩個辦法:
第一是優(yōu)化,簡化組合邏輯電路,使得電路的延時下降。如果是ASIC設(shè)計,我們可以結(jié)合卡諾圖,布爾邏輯等式代換,狄摩根定律等去對邏輯電路盡量做到優(yōu)化。如果是FPGA設(shè)計,我們可以結(jié)合FPGA器件的底層單元(例如查找表(LUT))的基本邏輯功能去做邏輯優(yōu)化。
例如,在做ASIC的時候,要實現(xiàn)如下邏輯功能:
輸入 | 輸出 | ||
A | C | D | B |
0 | 0 | 0 | 0 |
0 | 0 | 1 | 1 |
0 | 1 | 0 | 0 |
0 | 1 | 1 | 1 |
1 | 0 | 0 | 0 |
1 | 0 | 1 | 1 |
1 | 1 | 0 | 1 |
1 | 1 | 1 | 0 |
經(jīng)過卡諾圖化簡得到布爾表達式如下:
B=C’D+A’D+ACD’
還可以進一步化簡
B=C’D+A’D+ACD’=(A’+C’)D+ACD’=(AC)’D+ACD’=(AC)^D
最后發(fā)現(xiàn)只要一個與門,后面跟一個異或門就可以實現(xiàn)這個邏輯。
(1)所以我們在寫verilog的時候如果用門級電路去描述這個邏輯電路時:
assign B = (A&D)^D;
或者用結(jié)構(gòu)化的方式去描述時:
and(AC,A,C);
xor(B,AC,D);
其綜合對應(yīng)出來的電路便可能是最簡單的,當(dāng)然這跟綜合庫有關(guān)。
(2)但是如果我們用行為級的方式去描述這個邏輯時,例如如下。
always @( * )
if( {A,C,D} == 3b001 || {A,C,D} == 3b011 || {A,C,D}==101 ||{A,C,D} == 3b110)
B = 1b1;
else
B = 0;
那么其綜合得到的電路就是不可控的了,雖然EDA工具會對其做優(yōu)化。因此這樣綜合出來的電路如果不是最簡的,那么其延時就大。
所以在描述電路的時候,如果時序要求很高,最好要考慮邏輯化簡和器件適應(yīng)。
第二種方式便是利用流水線技術(shù),使得兩級寄存器之間組合邏輯電路的運算量減少,從而使得tlogic減少。
例如對于一個組合邏輯電路,其功能是實現(xiàn)8bit數(shù)的全加器。我們可以將其劃分成兩個4bit數(shù)的全加器。如下圖,原本是要實現(xiàn)兩個8bit數(shù)A[7:0],B[7:0],外加一個進位位c_in相加的,如下。
assign{c_out,sum[7:0]} =A[7:0] + B[7:0] +c_in ;
現(xiàn)在變成了前面一個全加器實現(xiàn)
assign {c_out1,sum1[3:0]} = A[3:0] + B[3:0] + c_in ;
后面一個全加器實現(xiàn)
assign{c_out,sum2[3:0]} = A[7:4] + B[7:4] + c_out1 ;
最后再將sum1,sum2合并得到sum,如下。
assign sum = {sum2,sum1};
第一個全加器算出{c_out1,sum1[3:0]} = A[3:0] + B[3:0] + c_in 之后,在時鐘有效沿到來時,將c_out1,sum1[3:0],A[7:4],B[7:4] 送到中間一級寄存器暫存;然后第二個電路做{c_out,sum2[3:0]} = A[7:4] + B[7:4] + c_out1 運算,并將結(jié)果sum1,sum2合并得到sum。這樣一來每兩級寄存器之間的全加器變成了4bit的全加器,電路延時肯定得到降低了。從而tlogic降低。
當(dāng)然還可以進一步優(yōu)化,使得流水級數(shù)更多。一般來說保持時間不會出現(xiàn)違例情況,因為寄存器的輸出延時tcq,一般要大于thold。如果出現(xiàn)違例,從式子
thold_slack=tcq+tlogic-thold-tclk_delay-tjitter>0
我們可以考慮適當(dāng)增加tlogic,或者后端布局布線時去減少tclk_delay。
-
邏輯電路
+關(guān)注
關(guān)注
13文章
494瀏覽量
42709 -
寄存器
+關(guān)注
關(guān)注
31文章
5363瀏覽量
121198 -
時序
+關(guān)注
關(guān)注
5文章
392瀏覽量
37430
原文標(biāo)題:時序違例的修正與時序優(yōu)化的思考方向
文章出處:【微信號:LF-FPGA,微信公眾號:小魚FPGA】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
相關(guān)推薦
優(yōu)化高速接口的時序裕量
![<b class='flag-5'>優(yōu)化</b>高速接口的<b class='flag-5'>時序</b>裕量](https://file1.elecfans.com//web2/M00/A6/28/wKgZomUMPAOAW-dKAAAVKUt0-_M317.jpg)
靜態(tài)時序的分析原理及詳細過程
![靜態(tài)<b class='flag-5'>時序</b>的分析原理及詳細過程](https://file.elecfans.com/web1/M00/C8/53/pIYBAF9t-8OAecibAAD91SqF_y0957.png)
vivado:時序分析與約束優(yōu)化
出現(xiàn)時序違例的原因及解決辦法
基于FPGA時序優(yōu)化設(shè)計
時序約束的步驟分析
![<b class='flag-5'>時序</b>約束的步驟分析](https://file.elecfans.com/web1/M00/93/B7/o4YBAFztHoaAfGSoAAAh7xWdeuw843.jpg)
如何閱讀時序報告?
![如何閱讀<b class='flag-5'>時序</b>報告?](https://file.elecfans.com/web1/M00/C5/BD/pIYBAF9MjmqAV8V3AAARgcFzulM494.png)
一文知道時序路徑的構(gòu)成
如何降低面積和功耗?如何優(yōu)化電路時序?
![如何降低面積和功耗?如何<b class='flag-5'>優(yōu)化</b>電路<b class='flag-5'>時序</b>?](https://file.elecfans.com/web1/M00/D9/4E/pIYBAF_1ac2Ac0EEAABDkS1IP1s689.png)
評論