為什么在 cts 過程中 func clock 和 scan clock 經常長不齊?


在數字后端 CTS 過程中,有時候會碰到這樣一種情況:

只開 function scenario 來做cts,可以得到很 balance 的 tree,

但是一旦帶上 scan scenario 去做 cts,就容易出現不balance。

 

首先說說為什么會出現這種現象:

假設一個design 中只有兩個 function clock: clk1、clk2,如下圖所示:

clk1 的 sink 點是 R1~R3

clk2 的 sink 點是 R4~R6

那么在cts時,clk1 和 clk2 就會單獨長tree,各自內部長齊,

假設 clk1 的 clock latency 比較短,而 clk2 的clock latency 比較長,

由於所有的reg 都要串起來做成一條 scan chain,所以scan_clk 的sink點就是圖中的 R1~R6,

又因為 R1~R3 的 clock latency 比 R4~R6 的clock latency 小很多,

所以在 scan scenario 下必然會有較大的skew。

 

那么這個問題該如何解決?

1) 只開 scan scenario 去做 cts,讓所有的sink點都長齊,這種方法顯然得不償失,白白增加了大量的clock buffer,不可取

2) 只開 func  scenario 去做 cts,此時 clk1 和 clk2 兩組clock 各自內部單獨長齊,比較合理;但是在 scan mode 下,R3 與 R4 之間可能會有較大的 hold violation,這個問題可以參考這篇博文來解決: 如何使用 lockup latch 來修 hold violation 

https://www.cnblogs.com/xiaoxie2014/p/12518376.html

 

除了上面這種方法,還有一種簡單的辦法:

同時開啟 func 和 scan,但是要在上圖中的兩個 MUX 的 scan 輸入端設置 exclude pin,這樣在cts 時,scan clock 就不會穿透mux ,不會影響到mux 后的時鍾樹

這樣做的代價是 scan clock 並沒有做平,可能會出現hold,不過由於 scan 的周期比較大,setup 余量較大,所以對於 scan hold 還是可以通過墊 buffer 修掉

 

關於func 和 scan clock 的一個案例:

某設計中的時鍾結構如下圖:

 

其中定義在 port A 上的時鍾 clk 是 func clock,定義在 D 點后的 clk_gen 是 clk 的 generated clock,clk 與 clk_gen 在EF點的與門匯合,scan clock 定義在 port C上

1. 在不設置任何exception 的條件下,直接做 cts ,發現工具在 HD 之間加了很多ckbuffer,看名字是為了墊長這段時鍾,工具似乎把D 點當作了一個sink pin,而 D 點定義的是一個 generated clock,cts 應該會穿透 generated clock,為什么這里沒有穿透?

這里的 clk_gen 的 source 是 clk,所以對於 clk 來說, clk_gen 是 generated clock ,但是對於 scanclk 時, clk_gen 並不是 generated clock,所以在給 scanclk 做 cts 時,工具會把 D 點作為一個 sink pin 來做 balance ,所以 HD 之間的這些 buffer 都是在 scanclk cts 過程中加入的

解決辦法:把圖中兩個mux 的 1 端都設置成 exclude pin,這樣 cts 時, scanclk 不會穿透 mux ,就不會出現上面的情況了,但是這樣做的代價就是 scanclk 並沒有長齊,可能會有時序問題,但是由於 scanclk 一般都比較慢,周期較長,即使時序出了問題也比較好修

2.

 

 

 

|-------------------------------------------|

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM