---
# System prepended metadata

title: Hspice 筆記

---

# 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
```
![image](https://hackmd.io/_uploads/BkU-LjObel.png)


與基本語法對照:

**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)