---
# System prepended metadata

title: Hardware Security PA3

---

**110020015劉祐瑋 Hardware Security PA3- Hardware Trojan Detection**
Hackmd link: https://hackmd.io/IJCukOBSTfO1VHxzTfveFQ?view
完成度:100%
- [x] Write a Makefile
- [x] HT1 
   - [x] nHT
   - [x] improveHT
- [x] HT2 
   - [x] nHT
   - [x] improveHT
- [x] HT3 
   - [x] nHT
   - [x] improveHT

目錄:
[TOC]
# Makefile 解釋
## com:
```
com:
	vcs -full64 -R \
		-debug_access+all \
		+v2k \
		-f sim.f \
		-l sim.log \
		-cm line+branch+cond+fsm+tgl \
		-cm_line contassign \
		-cm_cond std+allops \
		-cm_noconst \
		-cm_fsmopt report2StateFsms \
```

- vcs -full64 -R:
  - vcs: Command to invoke the VCS (Verilog Compiled Simulator).
  - full64: Enables compilation and simulation in 64 bit mode.
  - R: Runs the executable file immediately after VCS links together the executable file.
- debug_access+all:
  - debug_access: Sets the debugging mode.
  - +all:  Allows all forms of debug access, providing deeper insights.
- +v2k:Enables new language features in the proposed IEEE 1364-2001 standard.
- -f sim.f:
  - -f: Specifies a list file.
  - sim.f: A file containing the files and options needed for compilation.
- -l sim.log:
  - -l: Specifies the name of the output log file.
  - sim.log: The name of the simulation log file.
- -cm line+branch+cond+fsm+tgl:
  - -cm: Specifies compiling for the specified type or types of coverage.
  - line: Compile for line or statement coverage.
  - branch: Compile for branch coverage
  - cond: Compile for condition coverage.
  - fsm: Compile for FSM coverage.
  - tgl: Compile for toggle coverage
- -cm_line contassign:
  - contassign: Specified enabling line coverage for Verilog continuous assignments
- -cm_cond std+allops: Modifies condition coverage as specified by the argument or arguments:
  - std: The default: only logical, multiple, sensitized conditions.
  - allops: Logical and non-logical conditions.
- -cm_noconst: Tells VCS not to monitor for conditions that can never be met or lines that can never execute because a signal is permanently at a 1 0r 0 value.
- -cm_fsmopt report2StateFsms:
  - report2StateFsms: By default VCS does not extract two state FSMs. This keyword tells VCS to extract them.
## sim:
```
sim:
    ./simv
```
After using VCS (Verilog Compiled Simulator) for simulation, a compiled executable file named simv is usually produced. This file is generated by the VCS compiler based on the Verilog or SystemVerilog source code you provided.

./simv: This command is used to execute the executable file named simv located in the current directory.

## cov:
```
cov:
    verdi -cov -covdir ./simv.vdb &
```
- -cov: This option tells Verdi to enable coverage analysis. Coverage analysis is used to measure how thoroughly the testbench exercises the design under test.

- -covdir: This option specifies the directory where the coverage data is located.

- ./simv.vdb: This path is the directory specified by -covdir and contains the coverage database generated during simulation by VCS. The .vdb extension refers to a Verdi DataBase which stores various forms of data including coverage data.
## clean:
```
clean:
    rm -rf simv* csrc* *.log *.key ucli.key novas* vdCovLog .fsm.sch.verilog.xml
```
Delete the files generated by com.


# HT1- HT_Tri and HT_TSC
## nHT:
我們先看未移除前的各個module的coverage report如下圖:
![image](https://hackmd.io/_uploads/B185aq7rA.png)
可以發現有很多module的Score分數並不高，所以我們可以針對分數不高的module下手。首先，我們先看到HT_Tri module:

![image](https://hackmd.io/_uploads/HJje1smHR.png)

![image](https://hackmd.io/_uploads/r1jkkj7BR.png)


我們由上面可以發現HT_Tri module中toggle report 有兩條線的wire分數過低，第一條是Tj_trig，第二條是state，那我們設計testbench state是只給0-1000所以也只有[8:0]會有切換的動作，所以蠻正常的，但另一條Tj_trig就顯得不正常，可以觀察他的design，可以發現他可能是一個惡意電路的trigger。我們可以再進一步去觀察他output的線連到哪裡，

![image](https://hackmd.io/_uploads/rJD4_7mr0.png)

由上圖可以發現它連線到HT_TSC這個module，所以我們可以去觀察這個module的report看有沒有甚麼異常:

![image](https://hackmd.io/_uploads/r1K7JjXBC.png)

![image](https://hackmd.io/_uploads/r1uSysmrR.png)

我們可以觀察toggle report發現，HT_tri是因為上一個HT_Tri module的緣故才這麼低，而key是因為tb只有給0-1000才這麼低，所以我們在進一步分析branch report發現 out 為50%而其中一條為0%使用率，這時可以懷疑它應該是個惡意電路，我們再去看design可以發現這個MUX是一個payload。所以HT_Tri以及HT_TSC是一組trojan。
- Triger design is:
  ![image](https://hackmd.io/_uploads/SJzNyvQr0.png =60%x)
- Payload design is:
  ![image](https://hackmd.io/_uploads/Hyyw1wmS0.png =60%x)

現在我們要直接把這個module移除，所以aes_top module 會變成下圖:

![image](https://hackmd.io/_uploads/By531w7BA.png =60%x)

這時再跑一次make com，並且利用make sim 確認功能正常(確認最後一組OUT data是否一致):

![image](https://hackmd.io/_uploads/SkJzgvmHA.png =60%x)
(最後一段模擬截圖)

最後利用make cov打開report，發現確實把第一組trojan 給拿掉了:

![image](https://hackmd.io/_uploads/HJeE05XHA.png)

且同時我們利用Hierarchy來看的話的確發現整體coverage分數提高了:

![image](https://hackmd.io/_uploads/S1g7AqQSA.png)


## ImproveHT:
根據[Defeating UCI: Building Stealthy and Malicious Hardware](https://www.cs.unc.edu/~csturton/papers/defeating-uci-oak11.pdf)這篇paper內容來improve我們的circuit，論文中說明UCI是利用判斷output wire 是否跟input wire有所關聯，來判斷是否是惡意電路。

![image](https://hackmd.io/_uploads/rJqHgFNH0.png)

然而論文提到"by converting MUX gates to their AND and OR gate representation and treating them as pure data flow elements"，這樣可以提高coverage report 的score分數。因為AND and OR gate這可能會導致在邏輯模擬中觸發更多的分支和條件路徑。因此在進行覆蓋率測試時可能會檢測到更多的細節。

所以我們修改HT1中的?:邏輯寫法:

![image](https://hackmd.io/_uploads/rJBUEKErA.png)

第一種寫法可能有助於提高程式碼覆蓋率，因為它涉及多個邏輯操作（位元擴展、位元與、位元或），這可能會導致觸發更多的分支和條件路徑。特別是在位元操作層面，每個操作都可能被視為一個獨立的邏輯單元，因此在進行覆蓋率測試時可能會檢測到更多的細節。

第二種寫法雖然在寫法和理解上較為簡單直接，但在覆蓋率測試中不如第一種方法表現出多的邏輯路徑。因為它直接表達了一個高層次的邏輯決策，而沒有涉及更多的中間步驟或細節操作。

Result:

首先，我們先check simulation的正確性(這部分原本有規定，要模擬trigger啟動的結果，但因為我並沒有改trigger condition，所以這部分應該是跟助教設計是一樣的，我就沒有特別模擬)

![image](https://hackmd.io/_uploads/rkq_UY4rC.png =60%x)
(最後一段模擬截圖)

同時我們利用Hierarchy來看的話的確發現整體coverage分數並沒有提高，反而降低，這可能是因為我們改進了下層級module提高其覆蓋率，但是，這些修改可能導致整個層級結構中的資料流或控制流發生變化，影響其他模組的執行路徑，使得某些先前被覆蓋的路徑不再被觸發。即使單一模組的測試覆蓋率提高，如果這些測試不夠有效，無法觸發上層或下層模組的關鍵邏輯路徑，整體層級結構的覆蓋率可能因此受到影響。通常在層級結構中，上層模組的行為通常依賴下層模組的輸出。如果下層模組的邏輯或行為被修改，可能會影響上層模組的覆蓋率，即使下層模組本身的覆蓋率有所提高。但我們這裡的重點應該是放在target module的分數而不整個Design，因為UCI檢測是判斷每個module來判斷是否為trogan。所以觀看module發現確實有提高分數。(之後在HT2、HT3我只會針對module 來說明)

DUT:
![image](https://hackmd.io/_uploads/BySZvYVHA.png)

HT_TSC module:
![image](https://hackmd.io/_uploads/Hyq4DYNHC.png)
# HT2- HT_dynamic_key
## nHT
我們先看未移除前的各個module的coverage report如下圖:

![image](https://hackmd.io/_uploads/rJY3ejmSR.png)

可以發現有很多module的Score分數並不高，所以我們可以針對分數不高的module下手。在HT1中我們討論過了HT_Tri和HT_TSC module，現在我們專注於HT_dynamic_key:

![image](https://hackmd.io/_uploads/HkUYn7VrR.png)

我們由上面可以發現HT_dynamic_key module中toggle report 有兩條線的wire分數過低，第一條是HT_key，第二條是key，那我們設計testbench key是只給0-1000所以也只有[8:0]會有切換的動作，所以蠻正常的，但另一條HT_key就顯得不正常，可以觀察他的design，可以發現他可能是一個惡意電路。我們可以再進一步去觀察他output的線連到哪裡，

![image](https://hackmd.io/_uploads/S1_gYwmB0.png =80%x)

由上圖可以發現它並沒有連線到其他module，所以這可能是個多餘的design，並不會影響到其他功能，那它就很可能是惡意電路，這時我們在去研究這部分的design。

![image](https://hackmd.io/_uploads/HyvOYDmBC.png =60%x)

由上圖可以發現，這其實它的效果類似oscillator，當如果今天key不為0時，它每個cycle 時HT_key會從0變成key，下一個cycle再從key變成0如此循環。這其實是一種消耗功耗的惡意電路。其實這部分trigger跟payload並不好說明，我會認為trigger 是對 HT_key 的值判斷是否為0(但其實我們應該也可以說是否是key的值為0)，而 payload 則是對HT_key的賦值。

現在我們要直接把這個module移除，所以aes_128 module 會變成下圖:

![image](https://hackmd.io/_uploads/ryTipw7r0.png =80%x)

這時再跑一次make com，並且利用make sim 確認功能正常(確認最後一組OUT data是否一致):

![image](https://hackmd.io/_uploads/Sy2paD7r0.png =60%x)
(最後一段模擬截圖)

最後利用make cov打開report，發現確實把第二組trojan 給拿掉了:

![image](https://hackmd.io/_uploads/HJ7bTmVHR.png)

且同時我們利用Hierarchy來看的話的確發現整體coverage分數提高了:

![image](https://hackmd.io/_uploads/Bk1nRmES0.png)

## improveHT
我們先看到未improve 前的 module report:
![image](https://hackmd.io/_uploads/r1cXgcVB0.png)

由上圖可以發現這部分design並沒有branch，也就是沒有了MUX，所以我們無法利用HT1相同的方法來提高我們的Score，但我們一樣可以根據論文的論點也就是讓output wire 竟可能的跟input wire 有關係。那這邊report可以看出可以改進的部分為toggle report的部分，那因為toggle 是代表一個bit 是否有switch，那因為剛好我tb key只有[10:0]有在改變進一步影響這部分HT_key也只有[10:0]在改變，剛剛好的被我利用這種test pattern測試出來，所以我們設計的時候可以想到如果別人test pattern 只動key[10:0]就可能被偵測到，所以我們要讓HT_key竟可能的跟不同的bit有所關連而不是一一對應，所以我設計了一個counter來盡可能的提高在可能遇到不同的test pattern 都有較好的表現。

![image](https://hackmd.io/_uploads/B1ONN5NSA.png)

Result:

首先，我們先check simulation的正確性(因為這部分並沒有接線接出來，所以無法模擬出來被trigger。)

![image](https://hackmd.io/_uploads/BkP9E54HC.png =60%x)
(最後一段模擬截圖)

觀查module report發現確實有提高分數:

![image](https://hackmd.io/_uploads/ByvkH5EBC.png)


# HT3- HT_Comp
## nHT
我們先看未移除前的各個module的coverage report如下圖:

![image](https://hackmd.io/_uploads/HJpdpmVrC.png)

可以發現有很多module的Score分數並不高，所以我們可以針對分數不高的module下手。在HT1中我們討論過了HT_Tri和HT_TSC module，以及在HT2中我們討論過了HT_dynamic_key，現在我們專注於aes_128:

![image](https://hackmd.io/_uploads/ByCoaXESC.png)

我們由上面可以發現aes_128 module中toggle report，有好幾條線分數都過低，但細看那些其實要不是tb的因素就是HT2中所導致的，所以由toggle report並找不出甚麼有用的資訊。

![image](https://hackmd.io/_uploads/Sk406Q4SC.png)

我們在進一步分析branch report發現 out 為50%而其中一條為0%使用率，這時可以懷疑它應該是個惡意電路，我們再去看design可以發現這個MUX可能是一個payload。而它的可能的trigger 為HT_cond，這時我們需要進一步的判斷HT_cond到底有沒有必要。

![image](https://hackmd.io/_uploads/SybPmOXSA.png =75%x)

![image](https://hackmd.io/_uploads/rJQoXdXSA.png =70%x)

![image](https://hackmd.io/_uploads/H1ao7dmS0.png =60%x)

由上面我們可以發現其實，HT_cond是藉由one_round所產生，然而由one_round中的HT_Comp產生，而我們可以發現其one_round不包含HT_Comp這個module就已經是符合aes128的design，所以這是個多餘的電路，更是惡意電路，是一個trigger。所以這組的trigger是由HT_Comp中state_in1與state_in2 XOR產生。

現在我們要直接把這整組trojan移除，所以aes_128 module 以及 round module會變成如下圖(同時移除HT_Comp module):

![image](https://hackmd.io/_uploads/SyBn4uQHC.png =80%x)

![image](https://hackmd.io/_uploads/HJ3TEOmHA.png =60%x)


這時再跑一次make com，並且利用make sim 確認功能正常(確認最後一組OUT data是否一致):

![image](https://hackmd.io/_uploads/HkkfSd7H0.png =60%x)
(最後一段模擬截圖)

最後利用make cov打開report，發現確實把第三組trojan 給拿掉了:

![image](https://hackmd.io/_uploads/H1pHCmEBR.png)

且同時我們利用Hierarchy來看的話的確發現整體coverage分數並沒有提高，反而降低，但可能在刪除module時有更改部分wire接線影響到了baseline，所以可能計算的基底不一樣，導致整體分數沒有判斷價值。除此之外，其實我們在test的時候並不是在意整體的分數，而是每個module的分數，才來判斷那個module是否為正常(在HT1 HT2中是因為把整個拿掉了，所以我們以整個DUT為compared)，所以我們現在只focus分析aes_128 module 發現確實score分數提高，代表我們使用率提高，也消除了不必要的惡意電路。

![image](https://hackmd.io/_uploads/ryE00Q4SA.png)

![image](https://hackmd.io/_uploads/B1xrk4Vr0.png)

## improveHT
我們先觀察HT3的aes_128 module(因為payload在aes_128 module)，可以發現他有branch代表我們可以利用HT1所提供的方法來improve這個設計。
![image](https://hackmd.io/_uploads/SyxTBqVrR.png)

所以更改地方如下:
![image](https://hackmd.io/_uploads/S1tvDc4BR.png)

Result:
首先，我們先check simulation的正確性(這部分原本有規定，要模擬trigger啟動的結果，但因為我並沒有改trigger condition，所以這部分應該是跟助教設計是一樣的，我就沒有特別模擬)

![image](https://hackmd.io/_uploads/rkq_UY4rC.png =60%x)
(最後一段模擬截圖)

觀查module report發現確實有提高Score:

![image](https://hackmd.io/_uploads/SkNwc9VSC.png)


# Hardness of this assignment:
我認為這篇困難的點是要improve trojan逃過UCI檢測，最後我讀了很多的paper才找到一種最簡單最適合我的方法來完成這次的design。