2024-10-02|閱讀時間 ‧ 約 0 分鐘

[Verilog] STA分析 - hold time violation如何處理 ? (原創)

上一篇內容提到說,

hold time violation的成因是因為訊號源在clk trigger edge後太快就開始要變化成新的value,

導致reg在還沒完全把data取樣下來時他的input端口就開始震動,

可能會導致reg在抓data時出現問題,雖然預期要鎖到1但是最後卻因為input端太早變化導致output又變回原本的0


那對於hold time violation我們又有幾種解法呢?

這邊來探討一下



data在clk trigger後所需維持最短的時間為hold time (上圖藍色區域),

因此以reg1為例要如何解他的hold time,

這裡大致也像setup time 一樣有4種解法

1.從data端解決

2.從clk端解決

3.從製程端解決

4.從apr tool解


hold time check的時間點是當reg 收到clk trigger的那一剎那開始算

reg0收到clk trigger的時間是1+1個▷

reg1收到clk trigger的時間是1+5個▷

Q0端在reg0收到clk trigger後把新的vaule傳到D1的時間是2個▷


對於data端來解的話,

發生violation代表 Q0 -> comb. (2* ▷)-> D1這段path傳輸得太快

導致Q0一旦開始變化就會去trigger comb變化2個▷後就帶動D1看到新的value,

到D1變動總共花4*▷

但此時clk根本還沒經過6*▷的時間傳到reg1叫開始抓data,

還須持續keep data 2個▷的時間才能動避免hold time violation


因此最直接的解法就是增加comb的深度或複雜度,讓訊號在comb.裡面流動久一點再傳到D1的點上 (e.g. comb= 4*▷) ,

電流在流動時像是水在水管裡流動,一旦水管變長的從Q0到D1就會來的久一點,

只要水管的長度撐過最短的限制就可以成功解掉hold time violation,

那增加水管長度對於在電路上最簡單的時做就是在comb中間多插一些buffer增加delay time


對於clk端來說

其實和Data端解是一個相對的概念

以拍照來舉例,

data端就像是拍照時需要物體靜止不動讓快門Trigger後可以有足夠的時間來抓取物體,

假如物體是一隻在飛的鳥我不可能讓他在空中停留下來不動,每次按下快門後鳥就飛出了觀景窗

我唯一的解法就是先預判等一下鳥會飛到哪個位置比他早到一步然後按下快門,

對於電路來說就是縮短clk->reg1(6*▷)的時間,

想像上是我的data維持一樣的速度行走(2*▷),D1看到變化共1+1+2個▷

因此我把clk->reg1縮短成1+3個▷,

就可以剛好配合data的抵達時間抓取訊號


以製程解來說,

同一個cell都會提供不同特性的cell type,

大致分成幾個種類,

HVT , SVT , LVT , ULVT

HVT : High Voltage Threshold

SVT : Standard Voltage Threshold

LVT : Low Voltage Threshold

ULVT : Ultra Low Voltage Threshold


特色是大家的leakage power和cell delay不同

這是天秤兩邊的tradeoff,

想要得到低延遲所需的代價就是漏電量很大,

想要漏電小就必須拿速度來換

速度快慢是 ULVT > LVT > SVT >HVT

漏電大小是 ULVT >LVT > SVT >HVT

ULVT的速度最快同時漏電也最大

HVT則速度慢但漏電小


因此在碰到hold time violation時代表combinational logic的電路速度太快,

不仿換顆速度慢的cell同時還可以得到low leakage的好處

setup time violation亦有一樣的解法

拿leakage power 去換cell運算速度


對於第四種解法apr tool解來說

很特別的關鍵是這裡寫的不是synthesis tool解,

和setup time解法說的不同,

這邊又要帶出一個hold time check很重要的觀念,

前面提到說hold time violation可能是因為combinational logic太簡單,

所以多加幾個buffer來增加delay,

或是因為clk流到Reg0和clk流到Reg1的時間差太多,所以縮短兩段path的差異

但是實際上這些步驟都不會在rtl的內部做任何的改動,

和Setup time violation不同,可以從rtl端下手從源頭把violation修掉(e.g.敲pipe)

通常在修hold time的步驟是留到APR的階段才執行的,

原因是因為hold time violation和clk tree及cell擺放的位置強相關,

rtl level沒有clk tree的概念,也就是clk->reg0和clk->reg1時間相差多少是未知的,

直到apr階段長好clk tree才定案,

因此可以藉由apr tool來重長新的clk tree或是重擺cell的位置分布來達到修正hold time violation的問題

這也是大家提到說synthesis階段大部分可以忽略hold time violation,只需專注於解setup time violation的原因



那來思考一下

上面說hold time violation要到apr長完clk tree後才能得知,

因為會跟cell的擺放和clk tree的走向有關,

那這點會不會對我們在synthesis時專注的Setup time check有影響?

付費訂閱
分享至
成為作者繼續創作的動力吧!
© 2024 vocus All rights reserved.