一言以蔽之:設計與驗證分離,可以避免球員兼裁判。
![IC](/wp-content/image/6/644-IC.webp)
前文提到digital designer負責寫RTL code,那怎麼確定DD寫的RTL是對的呢?就是需要跑模擬驗證,不過如果DD自己設計、自己驗證,就是球員兼裁判,很容易有疏漏。我想大家都有過這樣的經驗:寫完考卷後還檢查了三次,覺得都沒有錯,考卷發下來後發現自己粗心大意寫了「13+21=35」。
為什麼在考場人們總是檢查不出「題目說要對的打勾、我卻把錯的打叉」這種很明顯的錯?這是因為『在考試壓力下作答、人就容易慌』,『題目太長、專注力不足而讀到分神』。類似的道理,當DD在專案壓力下設計、就容易寫錯,而且datasheet厚厚一大本、讀了後面就忘了前面。
還記得同學一眼就看到自己犯的白痴錯「13+21=35」嗎?要避免錯誤發生的最簡單方法,就是找另外一批人來看,因此就有了另外一個職缺——數位驗證工程師(Digital Verification engineer、簡稱DV)。
DV做的事包括:
- 研讀spec,撰寫驗證計劃
- 建立驗證環境,例如test bench、VIP(Verification IP)
- 提高驗證coverage
- 和DD co-work來debug
因此,DV需要的技能有:
- 認識protocol(例如UART、I2C、SPI)
- 對規格要很了解,所以要讀spec和datasheet
- 理解設計,例如用Verilog
- 會跑模擬,例如用VCS
- 會寫script跑大量模擬,例如用shell scipt、Python、Tcl
- 會debug,例如用Verdi
- 會系統端語言,例如用SystemVerilog、UVM
有些公司人力不足,就會DD兼任DV。兼差verification的DD常常會有漏球的問題,就是所謂的verification coverage不夠全。舉例來說,DD想要做一個y=a&b&c的電路,DD做完設計後,就隨便跑了二個模擬,看起來二個都對,就放這電路過關了。
a | b | c | y |
---|---|---|---|
1 | 1 | 1 | 1 |
0 | 1 | 1 | 0 |
但其實DD把RTL寫錯了,DD寫成y=a&b,此時如果有DV進場跑個完整的模擬,發現結果如下,錯誤就被DV抓到了。
a | b | c | y |
---|---|---|---|
0 | 0 | 0 | 0 |
0 | 0 | 1 | 0 |
0 | 1 | 0 | 0 |
0 | 1 | 1 | 0 |
1 | 0 | 0 | 0 |
1 | 0 | 1 | 0 |
1 | 1 | 0 | 1(與預期不合) |
1 | 1 | 1 | 1 |
當然電路不會這麼簡單,我們不可能總是掃完全部input組合(因為模擬時間會超過幾十年),所以DV必須設計在少數的模擬,就能toggle最多的電路,制定一個驗證計劃,在有限的模擬下增加驗證的包覆性,來提高設計的正確性。
如果到了更上層的系統,常常發生單一IP的電路A和B都是正確的,但A+B接起來就是不正確的,因而系統整合的驗證就是一門更難的課題了。