**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:紅色)。

這裡將會解釋每個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控制):

gate dalay 設計:

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

## 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 簡單介紹:

## 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。

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


## 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:

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

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

## 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:

除此之外,我多設計了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時才會開始運作。

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

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

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

設定模擬CLK的週期:

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

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

# Waveform of each module
## Scrambler:
可以發現下圖符合上面Scrambler的specification。當chall(t0)=8'b11010100時,chall(t1)=8'b10111110。

## MUX and RO(以一組舉例就好,共兩組):
首先in[i] 代表不同的ro ring 的output。首先下圖可以發現當ro_en為1時會讓他震盪,為0時不會震盪(紅色框框為不震盪)。

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

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

## Counter and Arb:
我們可以發現如果en=1@posedge clkcounter時counter會加1。

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


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

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

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

## 整個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。

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

# 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

第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:

第二顆response:

第三顆response:

所以由上面的公式我們可以計算出
Uniqueness=33%
# Other PUF design (Bonus)
參考了教授上課的ref發現RO有很多種,其中一種如下,我將利用這個RO結合本次作業構思一個新的PUF。

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

大致上module與tb都跟上面介紹一致並沒有更改,在此就不特別介紹。
## Result
waveform:
- ro output

可以知道他一樣震盪的起來,這樣就跟我們上面設計的RO有異曲同工之妙。
Uniformity:

這裡我就只計算一筆的Uniformity=62.5%
Uniqueness:
我總共利用調不同的delay,假裝有3顆(k=3)不一樣的PUF來測試。
challenge 都為11010010
第一顆response:

第二顆response:

第三顆response:

所以由上面的公式我們可以計算出
Uniqueness=33%