Join GitHub today
GitHub is home to over 28 million developers working together to host and review code, manage projects, and build software together.Sign up
Darter SPICE based IBIS modelling tool
The basic workflow is:
- Build ibis_*.inc files (make, utilizes gschem).
- Obtain a .ibs file from your vendor (eg, u69a.ibs).
- Build the associated .lib file (darter.py u69a.ibs u69a.lib).
- Create a schematic using the proper IBIS components:
- Check in your .ibs file to see what model's are available.
- Create a 'SPICE directive' with a .lib line for that model (.lib u69a.lib DQ_FULL_533).
- Select the .sym file associated with the IBIS Model_type.
- Fill in the in the symbol value attribute (DQ_FULL_533).
- Optionally add spec=-1/0/1 for slow, typ, and fast respectively.
- Optionally add start_on=1/0 to change the initial state of the buffer. With the default (start_on=1), the buffer starts in whatever state is indicated by its input. With start_on=0, the buffer will start tristated and then immediately tranisition to the state given by the inputs. The latter can help with convergence is some cases.
- Connect up a stimulus to the DRV and EN pins if applicable.
- Connect up the power and ground rails.
- Connect together various models as in your own design.
- Create a SPICE netlist from your schematic (gnetlist -g spice-sdb -o example.net example.sch).
- Load the netlist in ngspice (ngspice example.net).
- Run as appropriate (tran 1p 60n).
- Plot the output (aka, go nuts).
Darter also supports pseudo-differential models. Add the suffix '_DIFF' for thekdifferential model. Threshold information is pulled from the 'Diff Pin' section or the 'Receiver Thresholds'.
Pin parasitics are supported with additional subckts:
- Add a .lib line for the component (.lib MT47H512M4EB).
- Add the 'ibis_ebd-1.sym' component.
- Fill in the symbol attribute with , or , such as MT47H512M4EB_DQ0 or MT47H512M4EB_C9. As with model, the 'spec' keyword can be used.
- Connect 'Pin' to the outside of the component, 'Gnd' to ground, and the third pin to the associated IBIS model.
There is limited support for board description files. If the board description file only connects from an external pin to internal nodes, it can be used. This is the case for board description files that describe multiple dies in a single package. It is done the same way with component pin parasitics except that a different symbol must be used depending on the number of die pads the along the path.
Because the buffers that darter generates respond to binary data, there are two scripts to assist in the generation of that data.
- gen_dat.py generates tabular data from simplified input for use with a 'd_source' device.
- gen_stream.py generates a bitstream for use with a 'd_state' device.
Darter also includes several tools for post-analysis based on Werner Hoch's spice_read.py tool.
- eye-pattern.py plots an eye pattern based on input data from a raw file. It can trigger on a signal or periodically.
- plot.py is a simple tool to generate png plots of raw SPICE data.
- Driver Schedules.
- External Models/circuits.
- ISSO PU/PD data.
- Composite current for rising/falling waveforms.
- Bus hold.
- Fall back.
- Series models.
- darter.py can generate thousands of subcircuits for some IBIS files, ngspice has a hardcoded limit of 1000 subcircutis. I'm not sure if the best workaround is to patch ngspice, or modify darter.py to split up its output. A workaround is to manually change the limit within ngspice and recompile.
- Output buffers need two rising and falling waveforms each.
- Open source/sink buffers need one rising and one falling waveform.
- Ramp data is not used.
The below image shows an overlaid comparison of a Micron U69A HSPICE model (solid grey, pink, blue), a Micron U69A IBIS model with existing IBIS tool (dotted grep, pink, blue), and the output of the model generated by darter.py (overlying solid orange, blue, and green):
Note that the Darter simulation results overlay the Micron IBIS results perfectly.
An example circuit using pseudo-differential models is shown below:
The below circuit utilize a board description file:
Example eye diagram generated by eye-pattern.py: