EDA驗(yàn)證中覆蓋率簡(jiǎn)介
時(shí)間:2021-11-03 14:57:44
手機(jī)看文章
掃描二維碼
隨時(shí)隨地手機(jī)看文章
[導(dǎo)讀]什么是做覆蓋率?要回答這個(gè)問(wèn)題需要知道IC驗(yàn)證的目的。最終目的是保證IC所有的功能都符合我們的期望。通過(guò)和referencemodel比較我們能夠知道IC的功能是否符合我們的期望,但是如何體現(xiàn)“所有”?只能從覆蓋率上進(jìn)行體現(xiàn)。只有當(dāng)所有代碼都被執(zhí)行過(guò)時(shí),中間的功能都符合我們的期望...
什么是做覆蓋率?要回答這個(gè)問(wèn)題需要知道 IC 驗(yàn)證的目的。最終目的是保證 IC 所有的功能都符合我們的期望。通過(guò)和 reference model 比較我們能夠知道 IC 的功能是否符合我們的期望,但是如何體現(xiàn)“所有” ?只能從覆蓋率上進(jìn)行體現(xiàn)。
只有當(dāng)所有代碼都被執(zhí)行過(guò)時(shí),中間的功能都符合我們的期望,我們才能夠說(shuō)達(dá)到了目的。我們需要知道 IC 的所有功能都是正確的,而不是一部分功能或者是大部分功能都是正確的,這就做覆蓋率的意義之一。
覆蓋率能夠體現(xiàn)我們目前的 case 跑過(guò)了多少代碼?還有哪些代碼沒(méi)有跑到,在做后面的 case 時(shí),就可以有意識(shí)的往沒(méi)有覆蓋到的方向去傾斜,這就是做覆蓋率的意義之二。
總之,代碼覆蓋率檢查測(cè)試平臺(tái)和測(cè)試用例到底執(zhí)行了多少目標(biāo)代碼。另外,覆蓋率也體現(xiàn)了 IC 驗(yàn)證工程師的工作量。
單元驗(yàn)證階段,關(guān)心的是模塊功能和模塊質(zhì)量,一般業(yè)內(nèi)常用的出口條件是:行覆蓋率達(dá)到 100%,分支覆蓋率達(dá)到 100%,條件覆蓋率達(dá)到100%,狀態(tài)機(jī)覆蓋率達(dá)到 100%,對(duì)沒(méi)有覆蓋率的情況給出合理的說(shuō)明。
集成驗(yàn)證階段,關(guān)心系統(tǒng)的功能以及模塊與模塊之間的接口,此時(shí)出口條件為功能覆蓋率。一般業(yè)內(nèi)常用的出口條件是:功能覆蓋率達(dá)到 95%,對(duì)沒(méi)有覆蓋的情況給出合理的說(shuō)明。
代碼覆蓋率
代碼覆蓋率是從軟件編程的角度來(lái)分析設(shè)計(jì)代碼是否被充分的驗(yàn)證。一般的仿真器能夠在仿真的過(guò)程中自動(dòng)統(tǒng)計(jì)覆蓋率數(shù)據(jù)。代碼覆蓋率僅僅能夠表明設(shè)計(jì)中那些代碼已經(jīng)測(cè)試,而不能表明測(cè)試是否正確, 以及測(cè)試是否完善。測(cè)試工程師通過(guò)分析覆蓋率情況了解目前哪些代碼被執(zhí)行到了,哪些沒(méi)有被執(zhí)行到(這些報(bào)告在仿真軟件中可以輸出,很直觀(guān)), 而后調(diào)整測(cè)試?yán)?,保證代碼盡可被全面的測(cè)試。代碼覆蓋率可以通過(guò)以下幾個(gè)角度去統(tǒng)計(jì)。
a. 語(yǔ)句覆蓋(StatementCoverage)
語(yǔ)句覆蓋率(statement coverage):又稱(chēng)行覆蓋(LineCoverage), 這個(gè)概念是指在仿真的過(guò)程中被執(zhí)行語(yǔ)句所占的百分比。一個(gè)語(yǔ)句沒(méi)有被執(zhí)行到則肯定沒(méi)有被檢驗(yàn)過(guò),因此我們規(guī)定在一個(gè)驗(yàn)證的過(guò)程中,語(yǔ)句覆蓋率必需要達(dá)到 100%。語(yǔ)句覆蓋率是對(duì) RTL 代碼中的語(yǔ)句是否執(zhí)行過(guò)進(jìn)行統(tǒng)計(jì)。其是常用工具中支持的最基本的覆蓋形式。幾乎所有的測(cè)試都能實(shí)現(xiàn) 100%的語(yǔ)句覆蓋率, 因此被認(rèn)為“最弱的覆蓋”,它只管覆蓋代碼中的執(zhí)行語(yǔ)句,卻不考慮各種分支的組合等等。
語(yǔ)句覆蓋 100%不代表著覆蓋到所有的分支情況,不代表沒(méi)有異常情況發(fā)生。因?yàn)槊恳粭l語(yǔ)句都有很多種執(zhí)行情況,我們?cè)O(shè)計(jì)的 case 只跑過(guò)了最普通的一種情況。我們看一個(gè)最簡(jiǎn)單的例子。
現(xiàn) bug。因此用語(yǔ)句覆蓋率衡量驗(yàn)證是否完成是不靠譜的。
b. 分支覆蓋(BranchCoverage)
每一個(gè)條件語(yǔ)句“if/ else”和“case”語(yǔ)句的執(zhí)行情況。又稱(chēng)判定覆蓋, 其
是統(tǒng)計(jì)各個(gè)分支是否被執(zhí)行到。
c. 條件覆蓋(Condition Coverage)
分析在“if”的決定,三元語(yǔ)句被認(rèn)為是一個(gè)擴(kuò)展的分支覆蓋。條件覆蓋是統(tǒng)計(jì) if 語(yǔ)句中每個(gè)子表達(dá)式正確和錯(cuò)誤的結(jié)果是否被執(zhí)行到。而不考慮各個(gè)分支是否執(zhí)行到。分支覆蓋和條件覆蓋是對(duì)分支語(yǔ)句的不同方面進(jìn)行統(tǒng)計(jì),下面舉個(gè)例子詳細(xì)
說(shuō)明。
就可以,即只要 a 和 b 的值滿(mǎn)足最終執(zhí)行到兩個(gè) return 就可以。而進(jìn)行條件覆蓋時(shí),我們?cè)O(shè)計(jì) case 要考慮到(a<0)和(b<10)這兩個(gè)語(yǔ)句的真假值,只有這兩個(gè)語(yǔ)句的真假值都覆蓋到了,才說(shuō)明條件覆蓋完備了。
同時(shí)需要注意,條件覆蓋不是將判定中的每個(gè)表達(dá)式的結(jié)果進(jìn)行排列組合,而是只要每個(gè)表達(dá)式的結(jié)果都測(cè)試到就可以。
d. 表達(dá)式覆蓋(Expression Coverage)
分析賦值語(yǔ)句右邊表達(dá)式的活動(dòng)情況,當(dāng)表達(dá)式被執(zhí)行時(shí)進(jìn)行統(tǒng)計(jì)。對(duì)涉及邏輯運(yùn)算符的表達(dá)式,將會(huì)建立真值表,對(duì)應(yīng)真值表中的條件匹配行進(jìn)行計(jì)數(shù)。
e. FSM 覆蓋
又稱(chēng)有限狀態(tài)機(jī)覆蓋,對(duì)在一個(gè)有限狀態(tài)機(jī)中的狀態(tài)、轉(zhuǎn)化和路徑計(jì)數(shù)。下面這些因素將會(huì)被收集:
1. 狀態(tài)覆蓋向量:有限狀態(tài)機(jī)在仿真期間有多少狀態(tài)已經(jīng)達(dá)到。
2. 轉(zhuǎn)換覆蓋向量:狀態(tài)機(jī)仿真中多少轉(zhuǎn)換已經(jīng)被執(zhí)行。
3. 多態(tài)轉(zhuǎn)換覆蓋:在狀態(tài)機(jī)仿真中追蹤許多可能被執(zhí)行的轉(zhuǎn)換序列。這也被稱(chēng)為 sequence coverage。
功能覆蓋率
將待測(cè)模塊的功能點(diǎn)提取出來(lái),分功能進(jìn)行測(cè)試,當(dāng)所有的功能點(diǎn)都測(cè)完時(shí),就驗(yàn)證了測(cè)試的完備性、充分性。
功能覆蓋率更能體現(xiàn) IC 驗(yàn)證的目的,即確保待測(cè)模塊的實(shí)現(xiàn)功能, 比代碼覆蓋率更接近驗(yàn)證目標(biāo)。
為了確保驗(yàn)證的充分性, 建議在驗(yàn)證過(guò)程中采用功能覆蓋率和代碼覆蓋率結(jié)合的方式。當(dāng)出現(xiàn)功能覆蓋率高、代碼覆蓋率低的情況時(shí),說(shuō)明驗(yàn)證計(jì)劃不充分,需要增加功能覆蓋點(diǎn)。當(dāng)代碼覆蓋率高而功能覆蓋率低時(shí),設(shè)計(jì)沒(méi)有實(shí)現(xiàn)指定的功能。
我對(duì)于功能覆蓋率的一點(diǎn)心得:即根據(jù)模塊待測(cè)的的功能點(diǎn)來(lái)生成對(duì)應(yīng)的測(cè)試用例,然后跑代碼覆蓋率。首先要保證所有的功能點(diǎn)全部跑完,這樣代碼覆蓋率也就八九不離十了。但是在梳理功能點(diǎn)時(shí)需要注意以下幾個(gè)問(wèn)題:
1.功能點(diǎn)也分為大功能點(diǎn)和小功能點(diǎn),同時(shí)大功能點(diǎn)中有可能會(huì)嵌套有小功能點(diǎn)。代碼覆蓋率達(dá)不到預(yù)期效果的原因之一有可能是大功能點(diǎn)的部分小功能點(diǎn)未能覆蓋到。2.功能點(diǎn)分為正常功能點(diǎn)和異常功能點(diǎn),大部分的開(kāi)發(fā)人員比較重視正常功能點(diǎn),而往往忽略異常功能點(diǎn)的梳理。3.功能點(diǎn)分為基本功能點(diǎn)和擴(kuò)展功能點(diǎn),基本功能點(diǎn)用于測(cè)試模塊基本的功能,而擴(kuò)展功能點(diǎn)用于測(cè)試模塊較為復(fù)雜的功能, 只有基本功能點(diǎn)測(cè)試正確之后,才能開(kāi)始測(cè)試擴(kuò)展功能點(diǎn)。
上述三點(diǎn)要求代碼開(kāi)發(fā)人員盡可能的完善測(cè)試功能點(diǎn),并將功能點(diǎn)歸類(lèi)。
只有當(dāng)所有代碼都被執(zhí)行過(guò)時(shí),中間的功能都符合我們的期望,我們才能夠說(shuō)達(dá)到了目的。我們需要知道 IC 的所有功能都是正確的,而不是一部分功能或者是大部分功能都是正確的,這就做覆蓋率的意義之一。
覆蓋率能夠體現(xiàn)我們目前的 case 跑過(guò)了多少代碼?還有哪些代碼沒(méi)有跑到,在做后面的 case 時(shí),就可以有意識(shí)的往沒(méi)有覆蓋到的方向去傾斜,這就是做覆蓋率的意義之二。
總之,代碼覆蓋率檢查測(cè)試平臺(tái)和測(cè)試用例到底執(zhí)行了多少目標(biāo)代碼。另外,覆蓋率也體現(xiàn)了 IC 驗(yàn)證工程師的工作量。
單元驗(yàn)證階段,關(guān)心的是模塊功能和模塊質(zhì)量,一般業(yè)內(nèi)常用的出口條件是:行覆蓋率達(dá)到 100%,分支覆蓋率達(dá)到 100%,條件覆蓋率達(dá)到100%,狀態(tài)機(jī)覆蓋率達(dá)到 100%,對(duì)沒(méi)有覆蓋率的情況給出合理的說(shuō)明。
集成驗(yàn)證階段,關(guān)心系統(tǒng)的功能以及模塊與模塊之間的接口,此時(shí)出口條件為功能覆蓋率。一般業(yè)內(nèi)常用的出口條件是:功能覆蓋率達(dá)到 95%,對(duì)沒(méi)有覆蓋的情況給出合理的說(shuō)明。
代碼覆蓋率
代碼覆蓋率是從軟件編程的角度來(lái)分析設(shè)計(jì)代碼是否被充分的驗(yàn)證。一般的仿真器能夠在仿真的過(guò)程中自動(dòng)統(tǒng)計(jì)覆蓋率數(shù)據(jù)。代碼覆蓋率僅僅能夠表明設(shè)計(jì)中那些代碼已經(jīng)測(cè)試,而不能表明測(cè)試是否正確, 以及測(cè)試是否完善。測(cè)試工程師通過(guò)分析覆蓋率情況了解目前哪些代碼被執(zhí)行到了,哪些沒(méi)有被執(zhí)行到(這些報(bào)告在仿真軟件中可以輸出,很直觀(guān)), 而后調(diào)整測(cè)試?yán)?,保證代碼盡可被全面的測(cè)試。代碼覆蓋率可以通過(guò)以下幾個(gè)角度去統(tǒng)計(jì)。
a. 語(yǔ)句覆蓋(StatementCoverage)
語(yǔ)句覆蓋率(statement coverage):又稱(chēng)行覆蓋(LineCoverage), 這個(gè)概念是指在仿真的過(guò)程中被執(zhí)行語(yǔ)句所占的百分比。一個(gè)語(yǔ)句沒(méi)有被執(zhí)行到則肯定沒(méi)有被檢驗(yàn)過(guò),因此我們規(guī)定在一個(gè)驗(yàn)證的過(guò)程中,語(yǔ)句覆蓋率必需要達(dá)到 100%。語(yǔ)句覆蓋率是對(duì) RTL 代碼中的語(yǔ)句是否執(zhí)行過(guò)進(jìn)行統(tǒng)計(jì)。其是常用工具中支持的最基本的覆蓋形式。幾乎所有的測(cè)試都能實(shí)現(xiàn) 100%的語(yǔ)句覆蓋率, 因此被認(rèn)為“最弱的覆蓋”,它只管覆蓋代碼中的執(zhí)行語(yǔ)句,卻不考慮各種分支的組合等等。
語(yǔ)句覆蓋 100%不代表著覆蓋到所有的分支情況,不代表沒(méi)有異常情況發(fā)生。因?yàn)槊恳粭l語(yǔ)句都有很多種執(zhí)行情況,我們?cè)O(shè)計(jì)的 case 只跑過(guò)了最普通的一種情況。我們看一個(gè)最簡(jiǎn)單的例子。
int div(int a, int b) begin
return (a/b);
end
設(shè)置任何一個(gè)測(cè)試?yán)?,都可以達(dá)到 100%的覆蓋率。但是當(dāng) b=0 時(shí),就會(huì)出現(xiàn) bug。因此用語(yǔ)句覆蓋率衡量驗(yàn)證是否完成是不靠譜的。
b. 分支覆蓋(BranchCoverage)
每一個(gè)條件語(yǔ)句“if/ else”和“case”語(yǔ)句的執(zhí)行情況。又稱(chēng)判定覆蓋, 其
是統(tǒng)計(jì)各個(gè)分支是否被執(zhí)行到。
c. 條件覆蓋(Condition Coverage)
分析在“if”的決定,三元語(yǔ)句被認(rèn)為是一個(gè)擴(kuò)展的分支覆蓋。條件覆蓋是統(tǒng)計(jì) if 語(yǔ)句中每個(gè)子表達(dá)式正確和錯(cuò)誤的結(jié)果是否被執(zhí)行到。而不考慮各個(gè)分支是否執(zhí)行到。分支覆蓋和條件覆蓋是對(duì)分支語(yǔ)句的不同方面進(jìn)行統(tǒng)計(jì),下面舉個(gè)例子詳細(xì)
說(shuō)明。
if (a < 10 || b < 10) // 判定
return 0; // 分支一
else
return 1; // 分支二
當(dāng)進(jìn)行分支覆蓋時(shí), 我們?cè)O(shè)計(jì) case 只需要覆蓋到分支一和分支二兩種情況就可以,即只要 a 和 b 的值滿(mǎn)足最終執(zhí)行到兩個(gè) return 就可以。而進(jìn)行條件覆蓋時(shí),我們?cè)O(shè)計(jì) case 要考慮到(a<0)和(b<10)這兩個(gè)語(yǔ)句的真假值,只有這兩個(gè)語(yǔ)句的真假值都覆蓋到了,才說(shuō)明條件覆蓋完備了。
同時(shí)需要注意,條件覆蓋不是將判定中的每個(gè)表達(dá)式的結(jié)果進(jìn)行排列組合,而是只要每個(gè)表達(dá)式的結(jié)果都測(cè)試到就可以。
d. 表達(dá)式覆蓋(Expression Coverage)
分析賦值語(yǔ)句右邊表達(dá)式的活動(dòng)情況,當(dāng)表達(dá)式被執(zhí)行時(shí)進(jìn)行統(tǒng)計(jì)。對(duì)涉及邏輯運(yùn)算符的表達(dá)式,將會(huì)建立真值表,對(duì)應(yīng)真值表中的條件匹配行進(jìn)行計(jì)數(shù)。
e. FSM 覆蓋
又稱(chēng)有限狀態(tài)機(jī)覆蓋,對(duì)在一個(gè)有限狀態(tài)機(jī)中的狀態(tài)、轉(zhuǎn)化和路徑計(jì)數(shù)。下面這些因素將會(huì)被收集:
1. 狀態(tài)覆蓋向量:有限狀態(tài)機(jī)在仿真期間有多少狀態(tài)已經(jīng)達(dá)到。
2. 轉(zhuǎn)換覆蓋向量:狀態(tài)機(jī)仿真中多少轉(zhuǎn)換已經(jīng)被執(zhí)行。
3. 多態(tài)轉(zhuǎn)換覆蓋:在狀態(tài)機(jī)仿真中追蹤許多可能被執(zhí)行的轉(zhuǎn)換序列。這也被稱(chēng)為 sequence coverage。
功能覆蓋率
將待測(cè)模塊的功能點(diǎn)提取出來(lái),分功能進(jìn)行測(cè)試,當(dāng)所有的功能點(diǎn)都測(cè)完時(shí),就驗(yàn)證了測(cè)試的完備性、充分性。
功能覆蓋率更能體現(xiàn) IC 驗(yàn)證的目的,即確保待測(cè)模塊的實(shí)現(xiàn)功能, 比代碼覆蓋率更接近驗(yàn)證目標(biāo)。
為了確保驗(yàn)證的充分性, 建議在驗(yàn)證過(guò)程中采用功能覆蓋率和代碼覆蓋率結(jié)合的方式。當(dāng)出現(xiàn)功能覆蓋率高、代碼覆蓋率低的情況時(shí),說(shuō)明驗(yàn)證計(jì)劃不充分,需要增加功能覆蓋點(diǎn)。當(dāng)代碼覆蓋率高而功能覆蓋率低時(shí),設(shè)計(jì)沒(méi)有實(shí)現(xiàn)指定的功能。
我對(duì)于功能覆蓋率的一點(diǎn)心得:即根據(jù)模塊待測(cè)的的功能點(diǎn)來(lái)生成對(duì)應(yīng)的測(cè)試用例,然后跑代碼覆蓋率。首先要保證所有的功能點(diǎn)全部跑完,這樣代碼覆蓋率也就八九不離十了。但是在梳理功能點(diǎn)時(shí)需要注意以下幾個(gè)問(wèn)題:
1.功能點(diǎn)也分為大功能點(diǎn)和小功能點(diǎn),同時(shí)大功能點(diǎn)中有可能會(huì)嵌套有小功能點(diǎn)。代碼覆蓋率達(dá)不到預(yù)期效果的原因之一有可能是大功能點(diǎn)的部分小功能點(diǎn)未能覆蓋到。2.功能點(diǎn)分為正常功能點(diǎn)和異常功能點(diǎn),大部分的開(kāi)發(fā)人員比較重視正常功能點(diǎn),而往往忽略異常功能點(diǎn)的梳理。3.功能點(diǎn)分為基本功能點(diǎn)和擴(kuò)展功能點(diǎn),基本功能點(diǎn)用于測(cè)試模塊基本的功能,而擴(kuò)展功能點(diǎn)用于測(cè)試模塊較為復(fù)雜的功能, 只有基本功能點(diǎn)測(cè)試正確之后,才能開(kāi)始測(cè)試擴(kuò)展功能點(diǎn)。
上述三點(diǎn)要求代碼開(kāi)發(fā)人員盡可能的完善測(cè)試功能點(diǎn),并將功能點(diǎn)歸類(lèi)。