Illinois Institute of Technology · ECE 429

Lab 2 Tutorial: Inverter Schematic and Simulation

Create a CMOS inverter in Cadence Virtuoso, build a transient testbench, export and run an HSPICE simulation, and measure propagation delay in Synopsys WaveView.

Created by Jia Wang (May 2011). Revised by Erdal Oruklu (Jan. 2013) and Ken Choi (Sep. 2014; Feb. 2020; Jan. 2021; Jan. 2022, Aug. 2026). Updated for the current Endeavour/Rocky Linux tool flow in Sep. 2026.

Overview

This tutorial introduces the Cadence Virtuoso custom IC design environment. You will create a CMOS inverter schematic, generate a reusable symbol, build a testbench, export an HSPICE netlist, run a transient simulation, and inspect the results in Synopsys WaveView.

Remote access: If you are outside the Illinois Tech network, connect to the IIT VPN before starting a Remote Desktop session to Endeavour. See the ECE systems documentation.
Save frequently. Use Check and Save whenever you complete a schematic or symbol step.

1. Setting up Your Account Environment

Use the ECE teaching server Endeavour (endeavour.ece.iit.edu), which runs Rocky Linux.

Open a terminal

  1. Click Activities in the upper-left corner of the Rocky Linux desktop.
  2. Open Terminal from the applications menu or search for “Terminal.”
  3. Confirm that the prompt shows your Endeavour account.
Rocky Linux desktop on Endeavour
Figure 1. Rocky Linux desktop on Endeavour.
Terminal window on Endeavour
Figure 2. Terminal window on Endeavour.

Create the ECE 429 working directory and load the environment

Create one working directory in your home directory and enter it:

mkdir ~/ece429
cd ~/ece429

Load the course environment:

source /import/scripts/ece429.cshrc

After the setup completes, files such as cds.lib and lib.defs should be present in the working directory.

ECE429 environment setup in terminal
Figure 3. ECE 429 working directory and environment setup.
Future sessions: return to ~/ece429 and run source /import/scripts/ece429.cshrc before launching the design tools.

2. Inverter Schematic Using Virtuoso

2.1 Start Virtuoso

From ~/ece429, launch Virtuoso:

virtuoso

Virtuoso Studio and the Library Manager should open. Verify that the FreePDK45 libraries are visible, including NCSU_Devices_FreePDK45 and NCSU_TechLib_FreePDK45.

Virtuoso Studio IC23.1 and Library Manager
Figure 4. Virtuoso Studio and Library Manager on Endeavour.

2.2 Create your design library

  1. In Library Manager, choose File → New → Library.
  2. Set the library name to my429. Keep the directory in your current ECE 429 working directory, then click OK.
  3. In Technology File for New Library, choose Attach to an existing technology library and click OK.
  4. Select NCSU_TechLib_FreePDK45 and click OK.
New Library dialog
Figure 5. Open the New Library dialog.
Creating the my429 library
Figure 6. Create the my429 library.
Attach to an existing technology library
Figure 7. Attach the new library to an existing technology library.
You only create my429 once. Reuse the same library in later sessions.

2.3 Create the inverter schematic

In Library Manager, select my429 and choose File → New → Cell View. Create a cell named lab02 with view schematic.

Add PMOS and NMOS devices

  1. Press i to open Add Instance. Select library NCSU_Devices_FreePDK45, cell PMOS_VTL, view symbol, and place the PMOS.
  2. Select the PMOS and press q. Change Width from 90 nm to 180 nm, then click Apply and OK.
  3. Press i again and place an NMOS_VTL below the PMOS. Keep the NMOS width at 90 nm.
Adding PMOS VTL instance
Figure 8. Add PMOS_VTL from NCSU_Devices_FreePDK45.
Editing PMOS width to 180 nm
Figure 9. Change the PMOS width to 180 nm.
Device choice matters: use PMOS_VTL and NMOS_VTL for this lab. Do not substitute VTH or other threshold-voltage variants, because later lab steps and expected results assume the VTL devices.

Add input and output pins

  1. Choose Create → Pin. Name the input pin in and leave Direction = input. Place it to the left of the transistors.
  2. Choose Create → Pin again. Name the output pin out, set Direction = output, and place it to the right.
Create output pin dialog
Figure 10. Create the out pin with direction set to output.

Add power symbols and wire the inverter

  1. Press i, switch the library to analogLib, add vdd above the PMOS, and add gnd below the NMOS.
  2. Press w to wire the circuit. Connect both gates to in, join the drains to out, connect the PMOS source/body to vdd, and connect the NMOS source/body to gnd.
  3. Press Esc when wiring is complete.
Selecting vdd from analogLib
Figure 11. Add vdd from analogLib.
VDD and ground placed around inverter
Figure 12. Place vdd above the PMOS and gnd below the NMOS.
Completed CMOS inverter schematic
Figure 13. Completed inverter schematic.

Run Check and Save. Continue only when there are no schematic errors.

2.4 Create the inverter symbol

  1. With the checked schematic open, choose Create → Cellview → From Cellview.
  2. Verify the first dialog and click OK.
  3. In Symbol Generation Options, verify that in is under Left Pins and out is under Right Pins. Keep the other defaults and click OK.
  4. In the Symbol Editor, run Check and Save.
Symbol generation options with input left and output right
Figure 14. Verify symbol pin placement.
Generated lab02 inverter symbol
Figure 15. Generated lab02 symbol.

The my429 library should now contain both schematic and symbol views for lab02.

3. Inverter Simulation Using HSPICE

3.1 Create the testing circuit

Close the inverter schematic and symbol editors. In Library Manager, choose File → New → Cell View and create lab02_testing in library my429 with view schematic.

  1. Press i. Select library my429, cell lab02, view symbol, and place the inverter.
  2. From analogLib, add vdd, gnd, one vdc, one vpulse, and one cap.
  3. Press w and wire the circuit as shown. Press Esc to exit wiring.
Adding lab02 inverter symbol to testbench
Figure 16. Place the lab02 inverter symbol in lab02_testing.
Wired inverter testbench
Figure 17. Testbench topology before final component values are entered.

Set source and load values

Select each component and press q (or use Edit → Properties → Objects).

ComponentRequired setting
vdcDC voltage = 1.1 V
vpulseV1 = 0 V, V2 = 1.1 V, Period = 100 ps, Delay = 0 s, Rise = 10 ps, Fall = 10 ps, Pulse width = 40 ps
capCapacitance = 1 fF (change from the default 1 pF)
VDC properties set to 1.1 volts
Figure 18. Set the DC supply to 1.1 V.
VPULSE input settings
Figure 19. Set the transient input pulse parameters.
Capacitor set to one femtofarad
Figure 20. Set the output load capacitor to 1 fF.

Name the input and output nets

Choose Create → Wire Name. Label the inverter input wire input and the inverter output wire output. Then run Check and Save.

Completed testbench with input and output wire names
Figure 21. Completed testbench with input and output net names.

3.2 Configure ADE Explorer and export the HSPICE netlist

  1. With lab02_testing open, choose Launch → ADE Explorer. Select Create New View and click OK.
  2. Choose Setup → Simulator/Directory/Host, select hspiceD, and click OK.
  3. Choose Setup → Model Libraries and add:
    /apps/FreePDK45/ncsu_basekit/models/hspice/hspice_nom.include
    Click Apply, then OK.
  4. Choose Analyses → Choose. Select tran and set Start = 0, Stop = 200p, Step = 1p. Ensure Enabled is checked.
  5. Choose Simulation → Netlist → Create.
  6. In the generated netlist window, choose File → Save As and save the file as lab02.sp in ~/ece429.
ADE Explorer simulator set to hspiceD
Figure 22. Select hspiceD in ADE Explorer.
Selecting the FreePDK45 HSPICE nominal model file
Figure 23. Add the FreePDK45 nominal HSPICE model file.
Transient analysis from zero to two hundred picoseconds
Figure 24. Transient analysis settings: 0–200 ps, 1 ps step.
Generated HSPICE netlist
Figure 25. Generated HSPICE netlist.
Saving netlist as lab02.sp
Figure 26. Save the netlist as lab02.sp.
Before continuing: close ADE Explorer, Virtuoso, Library Manager, and the schematic windows. Leave a terminal open.

3.3 Run HSPICE

In ~/ece429, verify that the netlist exists:

ls
lab02.sp present in working directory
Figure 27. Confirm that lab02.sp is present.

Open the netlist in your preferred text editor. For example:

gedit lab02.sp

In the .OPTION section, add + POST immediately after + PSF=2:

.OPTION
+    ...
+    PSF=2
+    POST
+    ...
Adding POST option in lab02.sp
Figure 28. Add + POST after + PSF=2, then save and close the editor.

Run HSPICE:

hspice lab02.sp | tee lab02.hspice.output

This displays the simulation log in the terminal and saves a copy to lab02.hspice.output.

Successful HSPICE job concluded message
Figure 29. A successful run ends with “hspice job concluded.”
Success check: look for hspice job concluded. If HSPICE reports job aborted, inspect lab02.sp and the earlier setup steps. If the error remains, contact the TA.

4. View Waveforms and Measure Propagation Delay

4.1 Open the waveform in Synopsys WaveView

Launch WaveView from the terminal:

wv
  1. Choose Open Waveform, browse to ~/ece429, select lab02.tr0, and click OK.
  2. Double-click D0:lab02.tr0 in the waveform browser, then open toplevel.
  3. From the signal list, select v(input) and v(output) and drag them into the waveform display. You may use Ctrl to select multiple signals.
WaveView open waveform dialog selecting lab02.tr0
Figure 30. Open lab02.tr0.
WaveView top-level signal list
Figure 31. Expand the waveform file and open the top-level signal list.
Input and output inverter waveforms
Figure 32. Inverter input and output waveforms.

4.2 Measure propagation delay

Open Measurement Tool and choose Delay under Time Domain. Use v(output) as Signal and v(input) as Ref. Signal. Set both measurement levels to 50%. For a 0–1.1 V logic swing, the 50% crossing is 0.55 V. If WaveView requests explicit top/baseline levels, use 1.1 V and 0 V.

DelayOutput transitionTriggerRef. TriggerPremise
tPHLHigh → LowFallRisePositive Delay
tPLHLow → HighRiseFallPositive Delay

Click Apply for each configuration.

WaveView delay measurement tool
Figure 33. Configure the Delay Measurement Tool.
WaveView propagation delay annotations
Figure 34. Example delay annotations at the 50% crossing points.

Average propagation delay

tpd = (tPHL + tPLH) / 2

For the example waveform:

ParameterExample value
tPHL8.75 ps
tPLH6.81 ps
tpd7.78 ps
Example values only: your measured values may differ slightly. Report the values from your own waveform.

Show delay results across the waveform

Right-click a displayed delay annotation and choose Measure Results. In the Measure Results window, enable the Show check box for the delay results you want displayed.

WaveView Measure Results dialog
Figure 35. Use Measure Results to control which delay measurements are shown.
Multiple propagation delay measurements across waveform
Figure 36. Delay measurements displayed across the full waveform.

5. Useful Virtuoso Schematic Hotkeys

ActionKey / method
Add instancei
Edit object propertiesSelect object, then q
Draw wirew
Name wirel or Create → Wire Name
Move objectm
Exit active commandEsc

Virtuoso also displays mouse-button actions and command hints in the status area at the bottom of the editor.