|
发表于 2017-5-11 14:06:40
|
显示全部楼层
本帖最后由 david_reg 于 2017-5-11 14:07 编辑
在hspice中没有switch这个基本元件,要使用它需要在icfb中load hspice目录下的cadence接口“$HSP_HOME\interface\HSPICE.ile”, 然后用icfb菜单中出现的“Tools/Hspice Library Update Utility” 把analogLib做一次转换,生成hspice view,这时switch这个cell就有了hspice view和veriloga view, 然后在ADE里面的把simulator选成HSPICE,产生hspice网表,可以看到网表中的switch模块是以veriloga的形式调用的。
另一个容易一点的方法,不用转换lib,是直接在switch里面建立一个veriloga模块(内容如下),然后在ade里面生成hspiceD网表时,把veriloga添加到switch veiw list和stop veiw list里面,写在hspiceD的后面即可。
--------------------------------
// VerilogA for analogLib, switch, veriloga
`include "constants.vams"
`include "disciplines.vams"
module switch(\N+ , \N- , \NC+ , \NC- );
inout \N+ ;
electrical \N+ ;
inout \N- ;
electrical \N- ;
inout \NC+ ;
electrical \NC+ ;
inout \NC- ;
electrical \NC- ;
parameter real r = 1K ;
parameter real vt1 = 0.0;
parameter real vt2 = vt1 + 1.0;
parameter real rc = 1.0 ;
parameter real ro = 1T ;
parameter real ts = 0.0 ;
parameter real td = 0.0 ;
parameter real vsw = 0.0 ;
real vc;
real gmin, gmax, g;
real t1t2delta, gdelta, tmp;
analog begin
@(initial_step) begin
if (ro <= 0) begin
$strobe(" error: ro must be greater than zero.") ;
$finish(1);
end
if (rc <= 0) begin
$strobe(" error: rc must be greater than zero.") ;
$finish(1);
end
gmin = 1.0 / ro;
gmax = 1.0 / rc;
gdelta = gmin - gmax;
t1t2delta = vt2 - vt1;
if ((vt1 == 0) && (vt2 == 0)) begin
$strobe(" notice: vt2 defaults to 1.0 greater than vt1.") ;
t1t2delta = 1.0;
end
if (t1t2delta == 0) begin
$strobe(" error: vt2 should not be equal to vt1.") ;
$finish(1);
end
end
vc = V( \NC+ , \NC- );
tmp = vc - vt1;
if ( tmp * (vc-vt2) > 0 ) begin
if ( ( (vt1 < vt2) && (vc < vt1) ) ||
( (vt1 > vt2) && (vc > vt1) ) )
g = gmin;
else
g = gmax;
end else begin
tmp = tmp / t1t2delta;
tmp = 2 * tmp * tmp * tmp - 3 * tmp * tmp;
g = gmin + gdelta * tmp;
end
g = g * V(\N+ , \N- ) ;
I(\N+ , \N- ) <+ g;
end
endmodule |
|