SpectreHDL is no longer supported since MMSIM61
请问该怎么解决?
修改相应SpectreHDL文件为等效的Verilog-A文件,或者使用5141自带spectre。
通常这是电阻的AHDL模型出了问题,不过SpectreHDL和Verilog-A语法还算接近,所以修改还算容易。
例如module定义语法不同,前者是
- module(端口1,端口2,端口3……)(参数1,参数2,参数3,……)
- {
- ……
- }
复制代码后者是
- module (端口1,端口2,端口3……);
- ……
- endmodule;
复制代码例如热力学温度定义不同,
前者是$temp(),后者是$temperature。
例如节点语法不通,前者是node,后者是electrical。
例如analog语法不通,前者是
- analog {……}
复制代码后者是
- analog begin……end
复制代码在例如模拟赋值语法不同,前者是
- V(p,n)<-Expression
复制代码后者是
- V(p,n)<+Expression
复制代码另外建议Verilog-A的文件开头加上一句
- `include "discipline.h"
复制代码总的来说,举个例子,一个电阻的模型被修改成了Verilog-A格式如下:
- `include "discipline.h"
- module polyres_hdl (n2, n1, ctrl2, ctrl1); //(wr, lr, rtemp, jc1a, jc1b, jc2a, jc2b, tc1, tc2, etch, tnom, rsh0, rmaxvcoef, rminvcoef)
- electricaln2, n1, ctrl2, ctrl1;
- parameter real lr=0.0;parameter real wr=0.0;
- parameter real rtemp=($temperature - 273.15);
- parameter real jc1a = 0;parameter real jc1b = 0;
- parameter real jc2a = 0;parameter real jc2b= 0;
- parameter real tc1 = 0;parameter real tc2 = 0;
- parameter real etch = 0;parameter real tnom = 25.0;
- parameter real rsh0 = 1;parameter real rmaxvcoef = 3;
- parameter real rminvcoef = 0.33;
- real dt, absv, vc1, vc2, tcoef, vcoef, r0, weff;
- analog begin
- dt = (rtemp - tnom);
- vc1 = jc1a + jc1b / lr;vc2 = (jc2a + jc2b / lr) / lr;
- absv = abs(V(ctrl2, ctrl1));
- tcoef = 1.0 + dt * (tc1 + dt * tc2);
- vcoef = 1.0 + absv * (vc1 + absv * vc2);
- vcoef = min(vcoef, rmaxvcoef);
- vcoef = max(vcoef, rminvcoef);
- weff = (wr - 2.0 * etch);
- r0 = rsh0 * lr / weff * tcoef * vcoef;
- V(n2, n1) <+ I(n2, n1) * r0;
- end
- endmodule
复制代码
参见
Modeling Diffusion Resistors Using Verilog-A
http://www.designers-guide.org/Modeling/diffusion-resistors.pdf
修改后还是不行
res.def 修改为:
`include "discipline.h"
module polyres_hdl (n2, n1, ctrl2, ctrl1);
electrical n2, n1, ctrl2, ctrl1;
parameter real lr=0.0;
parameter real wr=0.0;
parameter real rtemp=$temperature - 273.15;
parameter real jc1a = 0;
parameter real jc1b = 0;
parameter real jc2a = 0;
parameter real jc2b= 0;
parameter real tc1 = 0;
parameter real tc2 = 0;
parameter real etch = 0;
parameter real tnom = 25.0;
parameter real rsh0 = 1;
parameter real rmaxvcoef = 3;
parameter real rminvcoef = 0.33;
real dt, absv, vc1, vc2, tcoef, vcoef, r0, weff;
initial
begin
end
analog begin
dt = (rtemp - tnom);
vc1 = jc1a + jc1b / lr;
vc2 = (jc2a + jc2b / lr) / lr;
absv = abs(V(ctrl2, ctrl1));
tcoef = 1.0 + dt * (tc1 + dt * tc2);
vcoef = 1.0 + absv * (vc1 + absv * vc2);
vcoef = min(vcoef, rmaxvcoef);
vcoef = max(vcoef, rminvcoef);
weff = (wr - 2.0 * etch);
r0 = rsh0 * lr / weff * tcoef * vcoef;
V(n2, n1) <+ I(n2, n1) * r0;
end
final
begin
end
endmodule
module diffres_hdl (n2, n1, ctrl2, ctrl1);
electrical n2, n1, ctrl2, ctrl1;
parameter real lr=0.0;
parameter real wr=0.0;
parameter real rtemp=$temperature - 273.15;
parameter real jc1a = 0;
parameter real jc1b = 0;
parameter real jc2a = 0;
parameter real jc2b= 0;
parameter real tc1 = 0;
parameter real tc2 = 0;
parameter real etch = 0;
parameter real tnom = 25.0;
parameter real rsh0 = 1;
parameter real rmaxvcoef = 3;
parameter real rminvcoef = 0.33;
real dt, vc1, vc2, tcoef, vcoef, r0, weff;
initial
begin
end
analog begin
dt = (rtemp - tnom);
vc1 = jc1a + jc1b / lr;
vc2 = (jc2a + jc2b / lr) / lr;
tcoef = 1.0 + dt * (tc1 + dt * tc2);
vcoef = 1.0 + V(ctrl2, ctrl1) * (vc1 + V(ctrl2, ctrl1) * vc2);
vcoef = min(vcoef, rmaxvcoef);
vcoef = max(vcoef, rminvcoef);
weff = (wr - 2.0 * etch);
r0 = rsh0 * lr / weff * tcoef * vcoef;
V(n2, n1) <+ I(n2, n1) * r0;
end
final
begin
end
endmodule
module absrint_hdl (n2, n1, ctrl2, ctrl1);
electrical n2, n1, ctrl2, ctrl1;
parameter real wr=0.0;
parameter real rtemp=$temperature - 273.15;
parameter real jc1a = 0;
parameter real jc1b = 0;
parameter real jc2a = 0;
parameter real jc2b= 0;
parameter real tc1 = 0;
parameter real tc2 = 0;
parameter real etch = 0;
parameter real tnom = 25.0;
parameter real rshc = 1;
parameter real rsh0 = 0;
parameter real rsh1 = 0;
parameter real rmaxvcoef = 3;
parameter real rminvcoef = 0.33;
real dt, absv, vc1, vc2, tcoef, vcoef, r0, weff;
initial
begin
end
analog begin
dt = (rtemp - tnom);
weff = (wr - 2.0 * etch);
vc1 = jc1a + jc1b * weff;
vc2 = jc2a + jc2b * weff;
absv = abs(V(ctrl2, ctrl1));
tcoef = 1.0 + dt * (tc1 + dt * tc2);
vcoef = 1.0 + absv * (vc1 + absv * vc2);
vcoef = min(vcoef, rmaxvcoef);
vcoef = max(vcoef, rminvcoef);
r0 = (rshc + rsh0 / weff + rsh1 / (weff * weff)) * tcoef * vcoef;
V(n2, n1) <+ I(n2, n1) * r0;
end
final
begin
end
endmodule
module rint_hdl (n2, n1, ctrl2, ctrl1);
electrical n2, n1, ctrl2, ctrl1;
parameter real wr=0.0;
parameter real rtemp=$temperature - 273.15;
parameter real jc1a = 0;
parameter real jc1b = 0;
parameter real jc2a = 0;
parameter real jc2b= 0;
parameter real tc1 = 0;
parameter real tc2 = 0;
parameter real etch = 0;
parameter real tnom = 25.0;
parameter real rshc = 1;
parameter real rsh0 = 0;
parameter real rsh1 = 0;
parameter real rmaxvcoef = 3;
parameter real rminvcoef = 0.33;
real dt, vc1, vc2, tcoef, vcoef, r0, weff;
initial
begin
end
analog begin
dt = (rtemp - tnom);
weff = (wr - 2.0 * etch);
vc1 = jc1a + jc1b * weff;
vc2 = jc2a + jc2b * weff;
tcoef = 1.0 + dt * (tc1 + dt * tc2);
vcoef = 1.0 + V(ctrl2, ctrl1) * (vc1 + V(ctrl2, ctrl1) * vc2);
vcoef = min(vcoef, rmaxvcoef);
vcoef = max(vcoef, rminvcoef);
r0 = (rshc + rsh0 / weff + rsh1 / (weff * weff)) * tcoef * vcoef;
V(n2, n1) <+ I(n2, n1) * r0;
end
final
begin
end
endmodule
res_rf.def修改为:
`include "discipline.h"
module polyres_hdl (n2, n1, ctrl2, ctrl1);
electrical n2, n1, ctrl2, ctrl1;
parameter real lr=0.0;
parameter real wr=0.0;
parameter real rtemp=$temperature - 273.15;
parameter real jc1a = 0;
parameter real jc1b = 0;
parameter real jc2a = 0;
parameter real jc2b= 0;
parameter real tc1 = 0;
parameter real tc2 = 0;
parameter real etch = 0;
parameter real dl = 0;
parameter real tnom = 25.0;
parameter real rsh0 = 1;
parameter real rmaxvcoef = 3;
parameter real rminvcoef = 0.33;
real dt, absv, vc1, vc2, tcoef, vcoef, r0, weff;
initial
begin
end
analog begin
dt = (rtemp - tnom);
vc1 = jc1a + jc1b / lr;
vc2 = (jc2a + jc2b / lr) / lr;
absv = abs(V(ctrl2, ctrl1));
tcoef = 1.0 + dt * (tc1 + dt * tc2);
vcoef = 1.0 + absv * (vc1 + absv * vc2);
vcoef = min(vcoef, rmaxvcoef);
vcoef = max(vcoef, rminvcoef);
weff = (wr - 2.0 * etch);
r0 = rsh0 * (lr -2*dl) / weff * tcoef * vcoef;
V(n2, n1) <+ I(n2, n1) * r0;
end
final
begin
end
endmodule
module diffres_hdl (n2, n1, ctrl2, ctrl1);
electrical n2, n1, ctrl2, ctrl1;
parameter real lr=0.0;
parameter real wr=0.0;
parameter real rtemp=$temperature - 273.15;
parameter real jc1a = 0;
parameter real jc1b = 0;
parameter real jc2a = 0;
parameter real jc2b= 0;
parameter real tc1 = 0;
parameter real tc2 = 0;
parameter real etch = 0;
parameter real dl = 0;
parameter real tnom = 25.0;
parameter real rsh0 = 1;
parameter real rmaxvcoef = 3;
parameter real rminvcoef = 0.33;
real dt, vc1, vc2, tcoef, vcoef, r0, weff;
initial
begin
end
analog begin
dt = (rtemp - tnom);
vc1 = jc1a + jc1b / lr;
vc2 = (jc2a + jc2b / lr) / lr;
tcoef = 1.0 + dt * (tc1 + dt * tc2);
vcoef = 1.0 + V(ctrl2, ctrl1) * (vc1 + V(ctrl2, ctrl1) * vc2);
vcoef = min(vcoef, rmaxvcoef);
vcoef = max(vcoef, rminvcoef);
weff = (wr - 2.0 * etch);
r0 = rsh0 * (lr -2*dl) / weff * tcoef * vcoef;
V(n2, n1) <+ I(n2, n1) * r0;
end
final
begin
end
endmodule