---
# System prepended metadata

title: Hardware Security PA1

---

**110020015劉祐瑋 Hardware Security PA1- ROPUF**
Hackmd link: https://hackmd.io/gROOz-h0T1uDLQNmhPmVcg?view
# Backgroug 
對電腦安全的需求顯著增加。物理不可複製函數 (PUF) 也被認為是物理單向函數，由於其製造成本低、固有的隨機性、固有的防篡改性和難以複製性，已成為一種突出的解決方案。這些特性使 PUF 成為基於硬體的安全設計的理想選擇，特別是密鑰產生和儲存。 PUF 利用晶片製造過程中的自然差異來產生獨特的裝置指紋，透過質詢回應協定提供安全的身份驗證和通訊方法。這些協議涉及向用戶發出挑戰，然後用戶必須根據一些先前商定的秘密資訊或密鑰提供回應，從而有效地證明其身份或合法性。從數學上講，PUF 可以描述為函數 ($R = f(C)$)，它將一組挑戰或輸入 $(C)$ 映射到一組響應或輸出 $(R)$，從而透過 PUF 產生響應$(R)$機制。
# Specification
我們將會設計一個RO-PUF，下圖為整個設計的架構(input signal:橘色，output signal:紅色)。

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



這裡將會解釋每個module的功能。
## Top PUF 
### 輸入與輸出介面 

| Signal Name | I/O | Width | Simple Description|
| -------- | -------- | -------- |----------|
| clk     | I     | 1     |      本系統為同步於時脈正緣之同步設計。    |
| rst     | I     | 1     |      高位準非同步(active high asynchronous)之系統重置信號。    |
| en     | I     | 1     |      使系統開始動作    |
| output_ready     | I     | 1     |      為1時代表Slave端準備好接受資料，反之|
| output_valid     | O     | 1     |      為1時代表Master端準備好傳送資料，表示目前的response為有效輸出，反之|
| challenge     | I     | 8     |      8 bit challenge data|
| response     | O     | 8     |      8 bit response data|

## FSM 
### state intoduction
- **RESET:**
  當Top_PUF.rst信號拉起後會進入此state。並且下一個cycle會直接進入WAIT state。
- **WAIT**: 
  等待Top_PUF.en信號拉起後會進入CACL state。
- **CACL**:
  在此state時會開始計算response，等待buffer.full拉起時會跳入DONE state。
- **DONE**:
  等待slave(tb)端來接收response，當Top_PUF.output_ready拉高代表成功接收response進入RESET state。
### verilog code 簡單介紹  
## Ring Oscillator
### 功能說明:
由14個not gate 與 1個 nand gate所組成且每個gate都有delay time，也正因如此可以設定不同的Delay time產生不同頻率的方波。

### I/O interface:
| Signal Name | I/O | Width | Simple Description|
| -------- | -------- | -------- |----------|
| en     | I     | 1     |      啟動ring oscillator。由FSM控制，當state=CALC時為1 |
| ro_out     | O     | 1     |     output      |

### code 簡單介紹:

ro.en(由state控制):
![image](https://hackmd.io/_uploads/ryfxNR8yC.png)

gate dalay 設計:

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

可調delay time 讓我們設計出不同頻率的RO:

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

## 8 to 1 MUX

### 功能說明:
這會有兩個MUX，MUXA 和MUXB。每個MUX會從8條不同頻率的ro_out選一條當OUTPUT，由Scrambler 的output當作sel信號來選擇。

### I/O interface:
| Signal Name | I/O | Width | Simple Description|
| -------- | -------- | -------- |----------|
| in     | I     | 8     |   每個bit為不同RO的OUTPUT|
| sel     | I     | 3     |     MUXA 為Scrabler_rdata[7:5]、MUXB 為Scrabler_rdata[2:0]      |
|out|O|1|output data|

### code 簡單介紹:
![image](https://hackmd.io/_uploads/BJ7yjCLkR.png)


## Counter 
### 功能說明:
這裡對應到MUX也會有兩個Counter，當@(posedge clk)時，en 為1時，counter會加一，然後當counter等於8時會傳出finish訊號。三種狀況會使counter　reset，第一種是當系統state =RESET 時，第二種是當另一個counter的finish拉高時會reset，第三種就是當自己數到8時也會自己reset。


### I/O interface:
| Signal Name | I/O | Width | Simple Description|
| -------- | -------- | -------- |----------|
| clk     | I     | 1     |   CLK|
| en     | I     | 1     |     連接MUX output signal      |
|rst|I|1|當state=RESET或另一個counter的finish拉高時會為1|
|finished|O|1|當數到8時，會拉為1且只會維持一個cycle|
### code 簡單介紹:

finished 設計：這裡我故意讓他只會有一個cycle為1，且注意因為不一定每次@ posedge cycle時en都剛好來，所以故意設計如果接連者來q會reset到1，但如果沒有接連者來會先reset 到0，這樣不論en有接著來或者沒接著來，reset後下一次en來都會為1，同時也可以確保finished 訊號只會維持一個cycle。 

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

counter rst signal : 如果自己數到8內部會自己reset，同時finished信號也可以當作另一個counter 的reset 信號代表有一個已經數到另一個也要重數，當然系統reset時也要OR進去。

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

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

## Arb和Buffer
### 功能說明：
Arb會比較從兩個counter端送出來的finished值，當counter A的finished大於counter B 的finished時out會為1(換句話說就是counter A比較快數到)。同時兩個finished會當作buffer的en(當兩個finished同時為1時不會拉高en)代表這時從arb比出來的值才是有效的，並且寫入data同時每次寫入時會做shift，當buffer存入8筆資料後會把full拉為1。

### I/O interface of Arb:
| Signal Name | I/O | Width | Simple Description|
| -------- | -------- | -------- |----------|
| in1     | I     | 1     |   連接counter A 的finished|
| in2     | I     | 1     |   連接counter B 的finished    |
|out|O|1|in1>in2時為1，其餘時候為0|

### I/O interface of Buffer:
| Signal Name | I/O | Width | Simple Description|
| -------- | -------- | -------- |----------|
| clk     | I     | 1     | CLK |
| en     | I     | 1     |   使wdata有效輸入 |
|rst|I|1|當state=RESET時會為1|
|wdata|I|1|連接至arb_out|
|rdata|O|8|連接至response|
|Full|O|1|當寫入8筆資料後會拉高為1|

### code 簡單介紹:
arb:

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

buffer: 每次輸入資料會做shift，當輸入8資料後會拉起full，同時不能再寫入新的data。

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

buffer_en: 因為finished 只會是1或0，當都是0或都是1時en為0，剩餘狀況為1。(應該要用xor，比較省資源但是只跑simulation就沒有特地去改過來了)
buffer_rst: 當state為RESET時會重啟buffer。

![image](https://hackmd.io/_uploads/H1YV-lPJR.png)

## Scrambler

### 功能說明: 
The scrambler receives an 8-bit Challenge input, and it will randomly encrypt the input using Non-linear Feedback Shift Register (NLFSR) to generate a output signal. While generating a new bit, it can perform bitwise XOR operation between this 8-bit Challenge input. The 8 bits coming out of the LFSR should be XORed with the 8 bits from the previous time point. the following figure gives the details of using LFSR to create NLFSR:

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

除此之外，我多設計了en這個signal，不為1時會讓chall等於wdata(亦即challenge from the testbench)，當en為1時才會開啟Scrambler讓chall開始根據上圖做變動，也就是說我並不需要特別設計rst訊號，因為當en沒有為1時就會自動的接收新的challenge input。


### I/O interface of Scrambler:
| Signal Name | I/O | Width | Simple Description|
| -------- | -------- | -------- |----------|
| clk|I|1|CLK|
| wdata     | I     | 8     |   連接challenge|
| en     | I     | 1     |   當state=CACL時為1，開始運作   |
|rdata|O|8| 連接至MUX_sel|

### code 簡單介紹
可以注意到當en不為1時，chall會為wdata，為當等於1時才會開始運作。

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

Scrambler_en: 當state為CACL時，才會為1。

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

# testbench design 
先設定輸出vcd檔，因為gtkwave我用比較習慣:

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

確保設計錯誤時可以結束模擬:

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

設定模擬CLK的週期:

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

設定連接到top_PUF的接線，注意這裡output_ready直接設為1，因為testbench隨時都可以接收資料，但如果今天進入系統等級時，CPU並不一定有空來接收資料:

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

設定如何給challenge ，且如何收response。一開始先讓系統rst ，然後輸入challenge且等待到下一個cycle才給en為了確保有效寫入Scrambler。最後等到output_valid拉高時代表這時的response為有效的輸出並且顯示出來。 如果要做下一筆前先等一個cycle，讓系統自己rst，這時在如上述一樣給challenge和收response。

![image](https://hackmd.io/_uploads/H1PoPQDk0.png)
# Waveform of each module

## Scrambler:
可以發現下圖符合上面Scrambler的specification。當chall(t0)=8'b11010100時，chall(t1)=8'b10111110。
![image](https://hackmd.io/_uploads/SJ862mD1C.png)

## MUX and RO(以一組舉例就好，共兩組):

首先in[i] 代表不同的ro ring 的output。首先下圖可以發現當ro_en為1時會讓他震盪，為0時不會震盪(紅色框框為不震盪)。

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

再者可以觀察到因為每個RO的delay time 不一樣，所以震盪頻率並不一樣。

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

最後，可以發現由sel會選擇不同條RO output 作為MUX_out。

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

## Counter and Arb:

我們可以發現如果en=1@posedge clkcounter時counter會加1。


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

當數到8時，finished 會拉高同時finished只會維持一個cycle，除此之外q會reset(當下一個cycle en 為1時會直接reset 為1，如果en為0則會reset為0)。

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

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

除此之外如果兩者有一個先數到8時，另一個也會reset至0(這樣確保兩者新的一輪時，當en=1@posedge clk 第一次q都為1)。

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


arb會判斷哪一個先數到8(要對應buffer_en一起看才是有效輸出)，counter A比較快時arb_out為1，反之。

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



## Buffer 

可以發現en寫入8次後會拉高full訊號，並且等到接受到資料後會reset。(紅色框框為8次en代表寫入了8筆資料，藍色框框為寫入8筆資料後full拉高，並且因為上述所提testbech可以馬上收走資料，所以下一個cycle就rst)

![image](https://hackmd.io/_uploads/S1-gR4vyA.png)


## 整個testbench中最外層的Top_PUF
首先rst，會使state=RESET，經過1 cycle下一個會進入WAIT state，這時會把challenge 輸入至Scrambler，然後等待en拉高時會進入CACL state，最後當state=DONE時，output_valid會為1代表這時的response為有效輸出。因為testbench馬上就收走資料，所以下一個cycle就進入RESET state。

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

同時我利用上面tb方法，連續兩次輸入一樣的challenge，驗證是否response一樣。

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

# Evalution 

To assess the performance of PUF circuits, several quality metrics, including Reliability, Uniformity, and Uniqueness, have been presented. In this Programing Assignment, I evaluate Uniformity and Uniqueness. 

## Uniformity(UF):
It estimates how uniform the proportion of 1s and 0s is in the PUF response bits. Uniformity reflects the randomness of the response bit and is measured as a percentage of the response bit’s Hamming weight (HW) according to the equation in below. 50% is the best value for uniformity:

$$ Uniformity_i=\frac{1}{n}\sum_{j=1}^{n}u_{i,j}\times 100 \%$$
where $𝑢_{𝑖,𝑗}$ is the jth bit of n-bit response of ith chip.

我利用上面tb一口氣給入5筆challenge來測每筆的uniformity

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

第1筆uniformity為:37.5%
第2筆uniformity為:37.5%
第3筆uniformity為:37.5%
第4筆uniformity為:50%
第5筆uniformity為:75%

## Uniqueness (UQ):
This statistic assesses the difference of a PUF’s responses to the same challenge when implemented on several PUF chips (k). The uniqueness is calculated as the inter-chip variation of various responses using below equation. 50% is the best value for UQ:

$$ Uniqueness=\frac{2}{k(k-1))}\sum_{i=1}^{k-1}\sum_{j=i+1}^{k}\frac{HD(S_i,S_j)}{n}\times 100 \%$$

where $𝑆_𝑖$ is n-bit response of ith chip, $𝑆_𝑗$ is n-bit responses of jth chip, k is the quantity of PUF chips, and HD($𝑆_𝑖$ , $𝑆_𝑗$ ) is the Hamming Distance between n-bit responses $𝑆_𝑖$ and $𝑆_𝑗$.


我總共利用調不同的delay，假裝有3顆(k=3)不一樣的PUF來測試。

challenge 都為11010010

第一顆response:

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


第二顆response:

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


第三顆response:

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

所以由上面的公式我們可以計算出

Uniqueness=33%

# Other PUF design (Bonus)

參考了教授上課的ref發現RO有很多種，其中一種如下，我將利用這個RO結合本次作業構思一個新的PUF。

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


新的架構圖如下(其中我們一樣在not gate上設delay):

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


大致上module與tb都跟上面介紹一致並沒有更改，在此就不特別介紹。

## Result 

waveform:

- ro output
  ![image](https://hackmd.io/_uploads/SJiCDEjkR.png)
  可以知道他一樣震盪的起來，這樣就跟我們上面設計的RO有異曲同工之妙。
  
Uniformity:

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

這裡我就只計算一筆的Uniformity=62.5%


Uniqueness:

我總共利用調不同的delay，假裝有3顆(k=3)不一樣的PUF來測試。

challenge 都為11010010

第一顆response:

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


第二顆response:

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


第三顆response:

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


所以由上面的公式我們可以計算出

Uniqueness=33%





