---
# System prepended metadata

title: VLSI_HW1

---

# VLSI HW1
姓名:劉祐瑋
學校:國立清華大學
學號:110020015
## 目錄
- [CMOS_原理](#CMOS_原理)
- [環境設定](#環境設定)
- [sp檔指令說明](#sp檔指令說明)
- [Inverter](#Inverter)
- [OR gate](#OR_gate)
- [AND gate](#AND_gate)
- [logic function](#logic_function)
- [4 to 1 mux](#4_to_1_Mux)
- [The hardness in this assignment](#The_hardness_in_this_assignment)
- [Conclusion_and_Feedback](#Conclusion_and_Feedback)
- [Reference](#Reference)
## CMOS_原理
因為本實驗要CMOS來組合電路，所以這邊簡單講解nmos跟pmos的characteristics.

nFET switching characteristics:
![](https://hackmd.io/_uploads/Hk9rgQAba.png)

pFET switching characteristics:
![](https://hackmd.io/_uploads/By6LlX0ba.png)

## 環境設定
首先利用Mobaxterm連接至學校工作站。

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


緊接著連線到機台(X記得要大寫，不然無法使用wv)
```
ssh -X ic53
```
再來初始化source，等等才能使用hspice和waveview
```
source /users/cad/synopsys/CIC/hspice.cshrc
source /users/cad/synopsys/CIC_new/customexplorer.cshrc
```
最後在書寫.sp檔時，要設定溫度為30，且要使用TSRI所提供的製程檔
```
.lib "/users/course/2023F/cs312000110001/u110020015/HW1/cic018.l" TT
** Environment setting **
.temp 30
```
## sp檔指令說明
nmos/pmos表示法:
```
mname [drain] [gate] [source] [body] [p_18/n_18] [w=width] [l=length]
```
建立subckt
```
.subckt subckt_name node1 node2... noden
** describe the subckt **
.ends
```
呼叫subckt
```
Xname node1 node2... noden subckt_name
```
設定電壓源
```
Vname nide1 node2 dc value **fixed**
Vname node1 node2 pulse (V1 V2 Td tr tf pw per) ** square wave **
```

![](https://hackmd.io/_uploads/HJm38_0-T.png)

## Inverter
### CMOS Implement 
我們可以根據nmos和pmos原理來簡單設計出inverter gate !

![](https://hackmd.io/_uploads/B1hTm_aZa.png =40%x)

最後利用code實現上圖(in5->A, inv_out->Q):
```
*** Inverter ***
.subckt INV in5 inv_out vdd vss
Mp1 inv_out in5 vdd vdd p_18 w=2.5u l=0.18u
Mn1 inv_out in5 vss vss n_18 w=1u l=0.18u
.ends
```
### Simulation
先在.sp檔中利用X、V指令來呼叫subckt和給予input, vdd, vss的值，加上模擬方式跟時間。
```
*** call subckt ***
Xinv in5 inv_out vdd vss INV
*** input signal ***
Vvdd vdd GND dc 1.8v
Vvss vss GND dc 0v
Vin5 in5 GND pulse (0v 1.8v 2ns 100ps 100ps 2ns 5ns)
********************
.trans 0.1n 40n
.end
```
接著利用 HSPICE程式產生出相對應的檔案
```
hspice –i <inputFile.sp> –o <outputFile.lis>
```
會產生以下五種檔案:
- .tr0檔：這是Transient Analysis（瞬態分析）的輸出文件，用於記錄電路在不同時間點上的響應數據，通常是電流和電壓隨時間的變化。
- .st0檔：這是Steady-State Analysis（穩態分析）的輸出文件，用於記錄電路在穩態條件下的狀態，包括節點電壓、電流值等。
- .pa0檔：這是AC Analysis（交流分析）的輸出文件，記錄了電路對不同頻率的交流訊號的反應，通常以振幅和相位的形式表示。
- .lis檔案：這是HSPICE的模擬日誌文件，用於記錄模擬過程中的詳細信息，包括警告、錯誤和其他模擬參數的設定。
- .ic0檔：這是Initial Conditions（初始條件）的輸出文件，用於記錄模擬的初始狀態，包括電路元件的初始電壓和電流值。

最後其中的.tr0檔可利用waveview觀察波型
```
wv <outputFile.tr0> &
```
波型如下:
![](https://hackmd.io/_uploads/SyHskKab6.png)


由上圖我們可以畫出相對應的truth table

| in5    |inv_out     |
| --- | --- |
| 0   | 1   |
| 1   | 0   |


符合inverter gate的truth table.
## OR_gate 
### CMOS Implement
我們可以根據nmos和pmos原理來設計出or gate ! 我設計的想法設計出 nor gate(下圖左半部)再接上inverter(下圖右半部)

![](https://hackmd.io/_uploads/Syri0Zp-6.png)

最後利用code實現上圖(in2->B, in1->A, OR->Q):
```
*** OR ***
.subckt OR2 in1 in2 OR vdd vss
Mn1 out in1 vss vss n_18 w=1u l=0.18u 
Mn2 out in2 vss vss n_18 w=1u l=0.18u
Mn3 OR out vss vss n_18 w=1u l=0.18u
Mp1 node1 in1 vdd vdd p_18 w=2.5u l=0.18u 
Mp2 out in2 node1 node1 p_18 w=2.5u l=0.18u
Mp3 OR out vdd vdd p_18 w=2.5u l=0.18u
.ends
```

### Simulation
先在.sp檔中利用X、V指令來呼叫subckt和給予input, vdd, vss的值，加上模擬方式跟時間。
```
*** call subckt ***
Xor in1 in2 OR vdd vss OR2
*** input signal ***
Vvdd vdd GND dc 1.8v
Vvss vss GND dc 0v
Vin1 in1 GND pulse (0v 1.8v 4.1ns 100ps 100ps 4.1ns 8.4ns)
Vin2 in2 GND pulse (0v 1.8v 2ns 100ps 100ps 2ns 4.2ns)
********************
.trans 0.1n 40n
.end
```
接著利用 HSPICE程式產生出相對應的檔案
```
hspice –i <inputFile.sp> –o <outputFile.lis>
```
會產生以下五種檔案:
- .tr0檔：這是Transient Analysis（瞬態分析）的輸出文件，用於記錄電路在不同時間點上的響應數據，通常是電流和電壓隨時間的變化。
- .st0檔：這是Steady-State Analysis（穩態分析）的輸出文件，用於記錄電路在穩態條件下的狀態，包括節點電壓、電流值等。
- .pa0檔：這是AC Analysis（交流分析）的輸出文件，記錄了電路對不同頻率的交流訊號的反應，通常以振幅和相位的形式表示。
- .lis檔案：這是HSPICE的模擬日誌文件，用於記錄模擬過程中的詳細信息，包括警告、錯誤和其他模擬參數的設定。
- .ic0檔：這是Initial Conditions（初始條件）的輸出文件，用於記錄模擬的初始狀態，包括電路元件的初始電壓和電流值。

最後其中的.tr0檔可利用waveview觀察波型
```
wv <outputFile.tr0> &
```
波型如下:
![](https://hackmd.io/_uploads/BksZ7uT-T.png)

由上圖我們可以畫出相對應的truth table

| in1 | in2 | OR |
| -------- | -------- | -------- |
| 0         |0          |0         |
| 0         |1          |1         |
| 1         |0          |1         |
| 1         |1          |1         |

符合OR gate的truth table.
## AND_gate
### CMOS Implement
我們可以根據nmos和pmos原理來設計出and gate ! 我設計的想法設計出 nand gate(下圖左半部)再接上inverter(下圖右半部)

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

最後利用code實現上圖(in3->B, in4->A, AND->Q):
``` 
*** AND ***
.subckt AND2 in3 in4 AND vdd vss
Mn1 node1 in3 vss vss n_18 w=1u l=0.18u
Mn2 out in4 node1 node1 n_18 w=1u l=0.18u
Mn3 AND out vss vss n_18 w=1u l=0.18u
Mp1 out in3 vdd vdd p_18 w=2.5u l=0.18u
Mp2 out in4 vdd vdd p_18 w=2.5u l=0.18u
Mp3 AND out vdd vdd p_18 w=2.5u l=0.18u
.ends
```
### Simulation
先在.sp檔中利用X、V指令來呼叫subckt和給予input, vdd, vss的值，加上模擬方式跟時間。
```
*** Call subckt ***
Xand in3 in4 AND vdd vss AND2
*** input signal ***
Vvdd vdd GND dc 1.8v
Vvss vss GND dc 0v
Vin3 in3 GND pulse (0v 1.8v 4.1ns 100ps 100ps 4.1ns 8.4ns)
Vin4 in4 GND pulse (0v 1.8v 2ns 100ps 100ps 2ns 4.2ns)
********************
.trans 0.1n 40n
.end
```
接著利用 HSPICE程式產生出相對應的檔案
```
hspice –i <inputFile.sp> –o <outputFile.lis>
```
會產生以下五種檔案:
- .tr0檔：這是Transient Analysis（瞬態分析）的輸出文件，用於記錄電路在不同時間點上的響應數據，通常是電流和電壓隨時間的變化。
- .st0檔：這是Steady-State Analysis（穩態分析）的輸出文件，用於記錄電路在穩態條件下的狀態，包括節點電壓、電流值等。
- .pa0檔：這是AC Analysis（交流分析）的輸出文件，記錄了電路對不同頻率的交流訊號的反應，通常以振幅和相位的形式表示。
- .lis檔案：這是HSPICE的模擬日誌文件，用於記錄模擬過程中的詳細信息，包括警告、錯誤和其他模擬參數的設定。
- .ic0檔：這是Initial Conditions（初始條件）的輸出文件，用於記錄模擬的初始狀態，包括電路元件的初始電壓和電流值。

最後其中的.tr0檔可利用waveview觀察波型
```
wv <outputFile.tr0> &
```
波型如下:
![](https://hackmd.io/_uploads/BySHlOTWa.png)




由上圖我們可以畫出相對應的truth table

| in3 | in4 | AND |
| -------- | -------- | -------- |
| 0         |0          |0         |
| 0         |1          |0         |
| 1         |0          |0         |
| 1         |1          |1         |

符合AND gate的truth table.

## logic_function
### CMOS Implement
The logic function is F=$\overline{a\cdot(b+c)}$ 
For pFET design: F(a,b,c)=$\overline{a\cdot(b+c)}$=$\overline{a}$+$\overline{(b+c)}$=$\overline{a}$ $\cdot$ 1+( $\overline{b}$ $\cdot$ $\overline{c}$ )$\cdot$ 1

所以由上式，我們可以知道b,c在pmos中要串聯然後與a並聯，故如下圖所示:

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

For nFET design: 這比較簡單，可以藉由pmos產生對稱，串聯變並聯，並聯變串聯，如下圖所示:

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

最後把Out相連，code實現如下(F->Out):
```
*** logic function ***
.subckt logic A B C F vdd vss
Mp1 F A vdd vdd p_18 w=4u l=0.18u
Mp2 node1 B vdd vdd p_18 w=3.5u l=0.18u
Mp3 F C noe1 node1 p_18 w=0.25u l=0.18u
Mn1 node2 C vss vss n_18 w=0.25u l=0.18u
Mn2 node2 B vss vss n_18 w=0.25u l=0.18u
Mn3 F A node2 node2 n_18 w=0.25u l=0.18u
.ends
```
### Simulation
先在.sp檔中利用X、V指令來呼叫subckt和給予input, vdd, vss的值，加上模擬方式跟時間。
```
*** Call subckt ***
Xlogic A B C F vdd vss logic
*** input signal ***
Vvdd vdd GND dc 1.8v
Vvss vss GND dc 0v
VA A GND pulse (0v 1.8v 8.3ns 100ps 100ps 8.3ns 16.8ns)
VB B GND pulse (0v 1.8v 4.1ns 100ps 100ps 4.1ns 8.4ns)
VC C GND pulse (0v 1.8v 2ns 100ps 100ps 2ns 4.2ns)
********************
.trans 0.1n 40n
.end
```
接著利用 HSPICE程式產生出相對應的檔案
```
hspice –i <inputFile.sp> –o <outputFile.lis>
```
會產生以下五種檔案:
- .tr0檔：這是Transient Analysis（瞬態分析）的輸出文件，用於記錄電路在不同時間點上的響應數據，通常是電流和電壓隨時間的變化。
- .st0檔：這是Steady-State Analysis（穩態分析）的輸出文件，用於記錄電路在穩態條件下的狀態，包括節點電壓、電流值等。
- .pa0檔：這是AC Analysis（交流分析）的輸出文件，記錄了電路對不同頻率的交流訊號的反應，通常以振幅和相位的形式表示。
- .lis檔案：這是HSPICE的模擬日誌文件，用於記錄模擬過程中的詳細信息，包括警告、錯誤和其他模擬參數的設定。
- .ic0檔：這是Initial Conditions（初始條件）的輸出文件，用於記錄模擬的初始狀態，包括電路元件的初始電壓和電流值。

最後其中的.tr0檔可利用waveview觀察波型
```
wv <outputFile.tr0> &
```
波型如下:

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




由上圖我們可以畫出相對應的truth table

| a   | b   | c   | F   |
| --- | --- | --- | --- |
| 0   | 0   |  0  | 1   |
| 0   | 0   |  1  | 1   |
| 0   | 1   |  0  | 1   |
| 0   | 1   |  1  | 1   |
| 1   | 0   |  0  | 1   |
| 1   | 0   |  1  | 0   |
| 1   | 1   |  0  | 0   |
| 1   | 1   |  1  | 0   |

符合F的truth table
## 4_to_1_Mux
### CMOS Implement
我們知道一個4 to 1 mux可以用 2 to 1 mux來實現如下圖:

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

結合上課所學，一個2 to 1 mux可以用 cmos transmission gate 來實現如下圖:

![](https://hackmd.io/_uploads/BkJv5F6-p.png =50%x)

結合以上兩點，4 to 1 mux implement by transmission gate如下:

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

code實現如下(S0->C0, S1->C1, D0->X0, D1->X1, D2->X2, D3->X3, Y->OUTPUT):
```
*** 4 to 1 MUX ***
.subckt MUX S0 S1 D0 D1 D2 D3 Y vdd vss
Mp1 S0_inv S0 vdd vdd p_18 w=2.5u l=0.18u
Mn1 S0_inv S0 vss vss n_18 w=1.5u l=0.18u
Mp2 S1_inv S1 vdd vdd p_18 w=2.5u l=0.18u
Mn2 S1_inv S1 vss vss n_18 w=1.5u l=0.18u

Mn3 node0 S0_inv D0 vss n_18 w=4u l=0.18u
Mp3 node0 S0  D0 vdd p_18 w=2u l=0.18u

Mn4 node0 S0 D1 vss n_18 w=4u l=0.18u
Mp4 node0 S0_inv  D1 vdd p_18 w=2u l=0.18u

Mn5 node1 S0_inv D2 vss n_18 w=4u l=0.18u
Mp5 node1 S0  D2 vdd p_18 w=2u l=0.18u

Mn6 node1 S0 D3 vss n_18 w=4u l=0.18u
Mp6 node1 S0_inv D3 vdd p_18 w=2u l=0.18u

Mn7 Y S1_inv node0 vss n_18 w=8u l=0.18u
Mp7 Y S1 node0 vdd p_18 w=1u l=0.18u

Mn8 Y S1 node1 vss n_18 w=8u l=0.18u
Mp8 Y S1_inv node1 vdd p_18 w=1u l=0.18u

.ends
```
### Simulation
先在.sp檔中利用X、V指令來呼叫subckt和給予input, vdd, vss的值，加上模擬方式跟時間。
```
*** Call subckt ***
Xmux S0 S1 D0 D1 D2 D3 Y vdd vss MUX
*** input signal ***
Vvdd vdd GND dc 1.8v
Vvss vss GND dc 0v
Vin1 S1 GND pulse (0v 1.8v 4.1ns 100ps 100ps 4.1ns 8.4ns)
Vin2 S0 GND pulse (0v 1.8v 2ns 100ps 100ps 2ns 4.2ns)
V0 D0 GND pulse (0v 1.8v 0ns 100ps 100ps 8.2ns 33.6ns)
V1 D1 GND pulse (0v 1.8v 8.4ns 100ps 100ps 8.2ns 33.6ns)
V2 D2 GND pulse (0v 1.8v 16.8ns 100ps 100ps 8.2ns 33.6ns)
V3 D3 GND pulse (0v 1.8v 25.2ns 100ps 100ps 8.2ns 33.6ns)
********************
.trans 0.1n 33.7n
.end
```
這簡單說明如何模擬:我們每個小循環(意旨(S1,S0)從(0,0)到(1,1))，只會有一個$D_i$有值，然後會有四個大循環(分別每個$D_i$都有輸入)，這樣可以觀察到每個循環中(S1,S0)所對應的$D_i$。(詳如波型圖)

接著利用 HSPICE程式產生出相對應的檔案
```
hspice –i <inputFile.sp> –o <outputFile.lis>
```
會產生以下五種檔案:
- .tr0檔：這是Transient Analysis（瞬態分析）的輸出文件，用於記錄電路在不同時間點上的響應數據，通常是電流和電壓隨時間的變化。
- .st0檔：這是Steady-State Analysis（穩態分析）的輸出文件，用於記錄電路在穩態條件下的狀態，包括節點電壓、電流值等。
- .pa0檔：這是AC Analysis（交流分析）的輸出文件，記錄了電路對不同頻率的交流訊號的反應，通常以振幅和相位的形式表示。
- .lis檔案：這是HSPICE的模擬日誌文件，用於記錄模擬過程中的詳細信息，包括警告、錯誤和其他模擬參數的設定。
- .ic0檔：這是Initial Conditions（初始條件）的輸出文件，用於記錄模擬的初始狀態，包括電路元件的初始電壓和電流值。

最後其中的.tr0檔可利用waveview觀察波型
```
wv <outputFile.tr0> &
```
波型如下:
![](https://hackmd.io/_uploads/Hy2ujj6bT.png)

故從上圖可以寫出truth table:
| S1  | S0  | Y   |
| --- | --- | --- |
| 0   | 0   | D0  |
| 0   | 1   | D1  |
| 1   | 0   | D2  |
| 1   | 1   | D3  |

符合4 to 1 NUX 的truth table.
## The_hardness_in_this_assignment
雖然完成了本次作業，但在這次的設計中也遇到幾個困難如下:
- W/L的設定: 我們從電子學可以知道，電流與W/L有關(如下圖所示)。所以當W/L設定不好時可能會出現降壓的問題，如在logic function 中如果前面的gate 會導致無法推動後面，波型就會出現降壓，除此之外，我們從可以觀察到4 to 1 MUX波型中有些許的突起在rise and fall time，這裡也跟W/L的設定有關，他可以縮小突起範圍，不過我考慮的這是使用在數位且同時只有在rise and fall time 會有影響，我就沒有特別調大來調整，畢竟在設計中，面積也是一個很重要的討論點。

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

- CMOS的使用: 除了 4 to 1 MUX有特別規定使用transmission gate來設計，其他沒有特別規定，我們可以發現 AND gate或其他logic function設計方式都不只一種，如AND Gate也可以使用trnasmission gate來設計，所以我們可以根據我們的需求來做取捨，有時候要要求mos的數量，或面積等等，因應不同的情況，我們可能會有不同的設計。
## Conclusion_and_Feedback
從這次的作業，我學到了如何利用mos來設計邏輯砸，不同以往的，我們以前都是寫Verilog Code由上往下做IC Design，但在這次我們是從下往上，這裡用HSPICE這個模擬工具來模擬cmos的作用，設計出以前邏輯設計中常用AND gate 或 OR gate ，甚至是logic function。雖然這次較少在Simulation Debugging ，不過這我覺得這也是使用HSPICE模擬時，需要具備的能力，希望有機會可以進一步的摸索。
## Reference
workbook-https://eeclass.nthu.edu.tw/course/homework/27481
HackMD-https://hackmd.io/@you8132/B1ssObpW6

