時(shí)序邏輯電路示意圖如下。前后兩級(jí)寄存器之間有一個(gè)組合邏輯運(yùn)算電路。
假設(shè)寄存器的建立時(shí)間要求為tsetup, 保持時(shí)間要求為thold, 輸出延時(shí)為tcq(這些參數(shù)只要工藝庫或者器件確定了,就是確定的);組合邏輯電路的運(yùn)算延時(shí)為tlogic; 兩級(jí)寄存器之間的clk線路延時(shí)為tclk_delay;clk的隨機(jī)抖動(dòng)為tjitter;tcycle為時(shí)鐘周期。故電路必須滿足如下建立時(shí)間,保持時(shí)間要求:
tsetup_slack=tcycle-(tcq+tlogic) -tsetup+tclk_delay-tjitter>0
thold_slack=tcq+tlogic-thold-tclk_delay-tjitter>0
當(dāng)tsetup_slack要求不滿足時(shí),我們可以選擇增大tcycle。當(dāng)然這就使得電路的整體時(shí)鐘頻率下降,從而速度下降。
從另一個(gè)角度考慮,我們可以通過減少tlogic來使得電路的建立時(shí)間裕量滿足要求。 達(dá)到這個(gè)目的,只有兩個(gè)辦法:
第一是優(yōu)化,簡化組合邏輯電路,使得電路的延時(shí)下降。如果是ASIC設(shè)計(jì),我們可以結(jié)合卡諾圖,布爾邏輯等式代換,狄摩根定律等去對(duì)邏輯電路盡量做到優(yōu)化。如果是FPGA設(shè)計(jì),我們可以結(jié)合FPGA器件的底層單元(例如查找表(LUT))的基本邏輯功能去做邏輯優(yōu)化。
例如,在做ASIC的時(shí)候,要實(shí)現(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)過卡諾圖化簡得到布爾表達(dá)式如下:
B=C’D+A’D+ACD’
還可以進(jìn)一步化簡
B=C’D+A’D+ACD’=(A’+C’)D+ACD’=(AC)’D+ACD’=(AC)^D
最后發(fā)現(xiàn)只要一個(gè)與門,后面跟一個(gè)異或門就可以實(shí)現(xiàn)這個(gè)邏輯。
(1)所以我們?cè)趯?a target="_blank">verilog的時(shí)候如果用門級(jí)電路去描述這個(gè)邏輯電路時(shí):
assign B = (A&D)^D;
或者用結(jié)構(gòu)化的方式去描述時(shí):
and(AC,A,C);
xor(B,AC,D);
其綜合對(duì)應(yīng)出來的電路便可能是最簡單的,當(dāng)然這跟綜合庫有關(guān)。
(2)但是如果我們用行為級(jí)的方式去描述這個(gè)邏輯時(shí),例如如下。
always @( * )
if( {A,C,D} == 3b001 || {A,C,D} == 3b011 || {A,C,D}==101 ||{A,C,D} == 3b110)
B = 1b1;
else
B = 0;
那么其綜合得到的電路就是不可控的了,雖然EDA工具會(huì)對(duì)其做優(yōu)化。因此這樣綜合出來的電路如果不是最簡的,那么其延時(shí)就大。
所以在描述電路的時(shí)候,如果時(shí)序要求很高,最好要考慮邏輯化簡和器件適應(yīng)。
第二種方式便是利用流水線技術(shù),使得兩級(jí)寄存器之間組合邏輯電路的運(yùn)算量減少,從而使得tlogic減少。
例如對(duì)于一個(gè)組合邏輯電路,其功能是實(shí)現(xiàn)8bit數(shù)的全加器。我們可以將其劃分成兩個(gè)4bit數(shù)的全加器。如下圖,原本是要實(shí)現(xiàn)兩個(gè)8bit數(shù)A[7:0],B[7:0],外加一個(gè)進(jìn)位位c_in相加的,如下。
assign{c_out,sum[7:0]} =A[7:0] + B[7:0] +c_in ;
現(xiàn)在變成了前面一個(gè)全加器實(shí)現(xiàn)
assign {c_out1,sum1[3:0]} = A[3:0] + B[3:0] + c_in ;
后面一個(gè)全加器實(shí)現(xiàn)
assign{c_out,sum2[3:0]} = A[7:4] + B[7:4] + c_out1 ;
最后再將sum1,sum2合并得到sum,如下。
assign sum = {sum2,sum1};
第一個(gè)全加器算出{c_out1,sum1[3:0]} = A[3:0] + B[3:0] + c_in 之后,在時(shí)鐘有效沿到來時(shí),將c_out1,sum1[3:0],A[7:4],B[7:4] 送到中間一級(jí)寄存器暫存;然后第二個(gè)電路做{c_out,sum2[3:0]} = A[7:4] + B[7:4] + c_out1 運(yùn)算,并將結(jié)果sum1,sum2合并得到sum。這樣一來每兩級(jí)寄存器之間的全加器變成了4bit的全加器,電路延時(shí)肯定得到降低了。從而tlogic降低。
當(dāng)然還可以進(jìn)一步優(yōu)化,使得流水級(jí)數(shù)更多。一般來說保持時(shí)間不會(huì)出現(xiàn)違例情況,因?yàn)榧拇嫫鞯妮敵鲅訒r(shí)tcq,一般要大于thold。如果出現(xiàn)違例,從式子
thold_slack=tcq+tlogic-thold-tclk_delay-tjitter>0
我們可以考慮適當(dāng)增加tlogic,或者后端布局布線時(shí)去減少tclk_delay。
-
邏輯電路
+關(guān)注
關(guān)注
13文章
494瀏覽量
42581 -
寄存器
+關(guān)注
關(guān)注
31文章
5322瀏覽量
120018 -
時(shí)序
+關(guān)注
關(guān)注
5文章
386瀏覽量
37281
原文標(biāo)題:時(shí)序違例的修正與時(shí)序優(yōu)化的思考方向
文章出處:【微信號(hào):LF-FPGA,微信公眾號(hào):小魚FPGA】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論