====== Recursive paramset ======
A [[gnucap:manual:languages:verilog#paramset]] permits the recursive definition of component models.
In this example we analyse a chain of RC lowpass filters whithout having to type it out explicitly.
some typing.
First, define two modules as follows.
module tln0(a, b);
parameter r;
parameter c;
resistor #(.r(r)) r(a b);
capacitor #(.c(c)) c(b, 0);
endmodule
module tln1(a, b);
parameter length
parameter r;
parameter c;
resistor #(.r(r)) r(a i);
capacitor #(.c(c)) c(i, 0);
tln #(.length(length - 1) .c(c) .r(r)) t(i, b);
endmodule
The first one is easily seen to be an RC. The second one has an additional parameter "length", it defines an RC followed by a "tln" of length one less.
In Verilog, we can define how tln maps to one of the two, depending on the length parameter value only. We do this as follows.
paramset tln tln1
parameter length from [2:999];
parameter r;
parameter c;
.length = length;
.r = r;
.c = c;
endparamset
paramset tln tln0
parameter length from [1:1];
parameter r;
parameter c;
.r = r;
.c = c;
endparamset
Note that both paramsets define a component by the same name "tln". The simulator will evaluate the "length" parameter and pick the right one.
We define and instanciate a main circuit.
module main(1 2);
parameter len=10
tln #(.length(len) .c(1/len) .r(1/len)) t1(1, 2);
endmodule
main #() m(1 2);
Then we switch to spice mode, build some test circuit, and run a simulation.
spice
.options noinsensitive
V1 1 0 sin amplitude=1 frequency=1
R1 2 0 1
.print tran v(nodes)
.tran 5 > tln.out
.status notime
.end
Note how the actual number of nodes in the circuit is reported by the status command. Try a different value for length, look at the node number, and observe how the output transient changes.