---
# System prepended metadata

title: HW5_Improve code coverage of your Design

---

# Improve code coverage of Design
---
**學號:B1095105
姓名:李彥霆
指導老師:林宏益**

---
#  1.實驗目的
>![image](https://hackmd.io/_uploads/Bk-5TV5Va.png)
1. 解釋為什麼FSM coverage只有75%。
2. 要如何提升 (A)Line, (B)FSM, ( C )Condition, (D)Branch "這四項"的coverage覆蓋率? 請證明。
>![image](https://hackmd.io/_uploads/SJ4u0VcN6.png)
>FSM狀態示意圖

# 2.實驗結果
### A.Line Coverage
經觀察，Line Coverage無法達到100%的原因是因為case中的default，在模擬時沒有跑到default那行，導致Line Coverage無法達到滿分。
>![image](https://hackmd.io/_uploads/r1ZLUL946.png)
### B.FSM Coverage
>![image](https://hackmd.io/_uploads/H1raAE5Np.png)

觀察講義所提供之test.v、test_bench.v所產生之波型圖發現，沒有S0->IDLE的情況發生，而依照本題FSM應該會有如下表格之幾種狀態發生。

| curr_state | next_state |
|:----------:|:----------:|
|    IDLE    |     S0     |
|     S0     |    IDLE    |
|     S0     |     S1     |
|     S1     |    IDLE    |

本應要有四種狀態轉換卻少了一種的情況下，FSM coverage就會是(4-1)*100%/4 = 75%。
>![image](https://hackmd.io/_uploads/BJ8ttB5Na.png)

因為原test_bench中Delay的數量給到了#100(100個時間單位)，等於Testbench Pattern的切換需要1ps*100=100ps，而由於Clock Cycle只有10ps因此在curr_state=S0時永遠吃不到input=0的訊號，所以少了S0->IDLE的轉換。
對此，我將切換pattern時的Delay縮小至#10(10個時間單位)
```
initial
begin
    rst_n = 1'b0;
    inp = 1'b0
    #10 rst_n = 1'b1；inp = 1'b0
    #10 inp=1'b1; 
    #10 inp=1'b0; 
    #10 inp=1'b1;
    #10 inp=1'b1;
    #10 inp=1'b1;
    #10 inp=1'b0; 
    #10 inp=1'b1;
    #10 inp=1'b0;
    $finish;
end
```
>![image](https://hackmd.io/_uploads/HJRHpScN6.png)
>更改test_bench後的波型

### C.Condition Coverage
須將所有input測試一遍。


### D.Branch Coverage
Branch Coverage無法達到100%的原因如同Line Coverage，由於在default
導致Coverage無法達到100%。
>![image](https://hackmd.io/_uploads/B1CPIIcEp.png)




#  3.實驗討論

### 解決方法
```
always @(curr_state)
begin

    case(curr_state[1:0])
        //IDLE:outp = 1'd0;
        S0:outp = 1'd0;
        S1:outp = 1'd1;
        default:outp = 1'd0;
    endcase
end    
```
將IDLE的情況收進default，避免case只會在前三項(IDLE,S0,S1)執行而沒有執行到default。
>![image](https://hackmd.io/_uploads/r1mPqUcE6.png)
>All coverage 100%
#  4.實驗心得
這次實驗不是自己做出一個成品，而是找出一個半成品的錯誤並想辦法除錯，我覺得非常有挑戰性，在做作業的同時需要重複跑模擬和開軟體來驗證方法是否可行，也在慢慢提升操作軟體的熟練度。