在數字后端 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.
|-------------------------------------------|