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