# Hspice 筆記
Hspice 為硬體電路描述語言,常應用於類比IC設計的模擬上,Hspice基本上都是在Linux作業系統的工作站操作,因此會需要了解一些基本的Linux語法才能操作。檔案附檔名通常是.sp或.cir。
## 基本語法
**"*"** 為Hspice中的註解,**星號**開頭,後面則是撰寫你的註解。
以下為基本的語法結構
```
Vdd VDD 0 1.8 * 電壓源:Vname 節點+ 節點− 值
M1 D G S B model_name * MOSFET:Mname Drain Gate Source Body model
R1 out in 1k * 電阻:Rname 節點1 節點2 電阻值
C1 out 0 1p * 電容:Cname 節點1 節點2 電容值
X1 a b out my_subckt * 子電路:Xname 節點1 ... 節點N 子電路名稱
.tran 1p 100n * 直流暫態模擬:每點 1ps,模擬 100ns
.end * 結束
```
## 元件命名規則
| 元件名稱 | Hspice 語法 |
| --------| -------- |
| MOSFET | MM1, MM2, ... |
| 電容 (Capacitance) | CC0, CC1, ...|
| 電阻 (Resistance) | RR0, RR1, ...|
| 子電路 (整體的電路名稱) |Xinv (X+inverter), X後面加電路名稱|
|VDD、VSS | 根據globel net而有所不同,如vdd!, vss!|
## 實際例子
```
MM1 net1 Vin VDD! VDD! NM
```

與基本語法對照:
**M1**: MOSFET 的名稱
**net1**: Drain 的節點名稱,net為連到其他元件的Wire,在其他電路上看到一樣的電路名稱代表兩者連在一起
**Vin**: Gate 的節點名稱,Vin為電壓輸入源
**VDD!**: Source 的節點名稱,VDD為直流電壓源,數值會根據MOSFET的設計而有所不同。
**VDD!**: Body 的節點名稱,與Source接在一起所以名稱跟Source一樣,這跟製程相關,Body在NMOS中通常都跟Souce連在一起,PMOS則跟Drain。
**NM**: 使用NMOS model,PMOS model則為PM,這部分的參數會來自製程的PDK。
### Section Summary:
以上步驟僅為「**電路布線**」,並不包括給主動式電壓源或電流源,確定PIN腳都有接好後才得以開始供電觀察電路的實際行為。
## Global Net 宣告
* 是「**全電路共用的節點名稱**」
* 常用於VDD (vdd!)、VSS (vss!)、GND,**不需要在每個.SUBCKRT中重複列出**
* 由.Global宣告,例如:
```
.GLOBAL VDD! vss!
```
`VDD!`中的`!`是表示全域節點的意思,舉例來說今天如果沒有加驚嘆號,如VDD。我們在子電路會給電壓(下一個section會講到),假設設VDD=1V,後續再寫的時候不小心又寫了一次VDD=1.8V,則VDD的就會被覆寫過去
* 在任何階層都能自動識別,適合用來連接電源
## SUBCKT (子電路)
* 是**定義一段模組化電路的區塊**(像function)
* 方便重複使用、層級化設計
* 由.SUBCKT宣告,例如:
```
.SUBCKT xxx in out VDD! vss!
...
.ENDS
```
***xxx***: 電路的名稱
***in***: 訊號輸入的PIN腳位
***out***: 訊號輸出的PIN腳位
***VDD***: 直流電壓源
***VSS***: 直流電壓源 (通常設為接地)
* 使用方式 (呼叫),例如:
```
Xxxx in out VDD! vss! xxx
```
**X** 後加上電路的名稱,寫入剛剛SUBCKT宣告的變數,最後再以電路名稱結尾。
## 總結
整體範例 (Inverter電路):
```
.GLOBAL vdd!
+ vss!
************************************************************************
* Library Name: VLSI
* Cell Name: inv
* View Name: schematic
************************************************************************
.SUBCKT inv IN OUT
*.PININFO IN:I OUT:I
MM1 OUT IN vss! vss! NM
MM0 OUT IN vdd! vdd! PM
.ENDS
Xinv in out inv
vdd vdd! 0 1.8
vss vss! 0 0
vin in 0 pulse (0 1.8 0 0.1n 0.1n 0.3n 1n)
.trans 1ps 4ns
.probe tran V(in) V(out)
.end
```
此範例的節點名稱有vdd、vss、vin。
* vdd! 設為低電壓0,高電壓1.8,使變數vdd的值為vdd! (e.g. Vpower vdd! 0 1.8)
* vss! 設為低電壓0,高電壓0,也就是接地,是變數名稱vss的值為vss!
* vin 為方波輸入,語法規則如下:
vin in 0 pulse ("Low Voltage", "High Voltage", "Time Delay", "Rising Time", "Falling Time", "High Voltage Time", "A Period Time")
.trans為暫態模擬,在此範例中模擬總時間是1 ns,時間步長為1 ps
.probe 儲存要輸出的暫態波形,這裡指定要觀察的節點是V(in)和V(out)