Hi all,
Following the example in Current limited voltage regulator (model, test) from
http://www.designers-guide.org/VerilogAMS/, I designed another voltage follower with limited current 'imax' and 'imin' parameters. However, when simulating with a simple circuit, it becomes very slow. The steps seem to be incorrectly set. Would any one give me some advice? I suspect that 'cross' event detection is wrongly configured. How do I use 'expr_tol' parameter only while leave 'time_tol' as null (as default) ?
Code:`include "constants.vams"
`include "disciplines.vams"
module CurrentLimiterVsource(in,out);
input in;
output out;
electrical in;
electrical out;
real v, i, vin, sum1, sum2;
parameter real imax = 1;
parameter real imin = -1;
analog begin
vin = V(in);
v = V(out);
i = -I(<out>);
sum1 = v-vin - (i-imax)*(out.potential.abstol/out.flow.abstol);
sum2 = v-vin - (i-imin)*(out.potential.abstol/out.flow.abstol);
@(cross(sum1,0,1p,out.potential.abstol))
$strobe("imax reached at time:%r, sum1:%r, sum2:%r",$abstime,sum1,sum2);
@(cross(sum2,0,1p,out.potential.abstol))
$strobe("imin reached at time:%r, sum1:%r, sum2:%r",$abstime,sum1,sum2);
if (sum1*sum2<0)
V(out) <+ vin;
else
if (sum1<=0)
I(out) <+ -imax;
else
I(out) <+ -imin;
end
endmodule
The test circuit is as below:
Code:I41 (Vin Vout) CurrentLimiterVsource imax=2500u imin=-2m
V3 (Vin 0) vsource dc=0 type=sine delay=1u freq=5M ampl=1 mag=1
C1 (net1 0) capacitor c=1u
C0 (Vout net1) capacitor c=1p
R0 (Vout net1) resistor r=1K
simulatorOptions options reltol=1e-3 vabstol=1e-6 iabstol=1e-12 temp=27 \
tnom=27 scalem=1.0 scale=1.0 gmin=1e-12 rforce=1 maxnotes=5 maxwarns=5 \
digits=5 cols=80 pivrel=1e-3 sensfile="../psf/sens.output" \
checklimitdest=psf
tran tran stop=2u errpreset=conservative write="spectre.ic" \
writefinal="spectre.fc" annotate=status maxiters=5
finalTimeOP info what=oppoint where=rawfile
dcOp dc write="spectre.dc" maxiters=150 maxsteps=10000 annotate=status
capInfo_dc info what=captab where=rawfile threshold=0.0 detail=nodetonode \
sort=name
dcOpInfo info what=oppoint where=rawfile
dc dc hysteresis=yes param=VH start=0 stop=3.3 oppoint=rawfile \
maxiters=150 maxsteps=10000 annotate=status
ac ac start=10k stop=10M annotate=status