Some SPICE simulators do not understand Verilog syntax or semantics. A subset of the structural part of Verilog maps nicely to Spice, given a library that maps devices to a representation that works with the targeted Spice engine.
A device instance has a type, a label as well as parameter and port assignments.
mytype #(.myparameter(42)) mylabel(.someport(a), .otherport(b));
There is little hope for an automatic conversion to spice, due to the irregular syntax. A string template can be used to carry a representation that a spice simulator will understand. For example (see CanEDA or KiCAD for real world spice instance templates) an instance could carry a template as follows.
(* some_spice="R${label} ${port[someport]} ${port[otherport]} ${par[value]} *) mytype #(.value(42)) mydevice(.otherport(b), .someport(a));
With this, an automatic transcription will be feasible (here, targetting “some_spice”), and result in
Rmydevice b a 42
Note that the circuit containing mydevice is still compliant with Verilog syntax, and understood by compliant tools.
In order to decouple circuits from simulator specifics, string templates can be moved to a device library for use in a specific (Spice) simulator. This completely makes up for the missing Verilog support in a simulator.
Suppose a circuit contains an instance similar to the example above, but without any knowledge about Spice specifics or their variants.
mytype #(.value(42)) mydevice2(.otherport(b), .someport(a));
A library file (ideally provided by Spice simulator maintainers) may provide the additional mapping template withuout interference.
(* some_other_spice="X${label} (${port[someport]} ${port[otherport]}) value=${par[value]} *) module mytype(otherport, someport); parameter value=0; endmodule
Which will instruct the exporter to represent mydevice2 as
Xmydevice (b a) value=42
When targeting some other Spice.
A resistor declaration such as
(* spice="R${label} (${port[p]} ${port[n]}) ${par[r]}" *) module resistor(p, n); parameter real r=1; endmodule
should work with nearly any spice simulator.
A net device could be defined as follows
(* ngspice="R${label} (${port[a]} ${port[b]}) 0" *) module net(.a(i), .b(i)); endmodule
And instances of it will now swiftly work with ngSpice (after the export).