一. 前言
最近在学习VerilogA对模拟系统的描述,在大规模系统设计前期采用verilogA对系统进行行为级描述,可以大大缩短系统仿真的时间,并且还可以通过跑系统的功能来确定一些小模块的指标,但是网上的中文教程特别少,尤其是当一个module不能完成所有功能的时候,例化就很重要,然而,verilogA中的例化要注意以下几个问题:
1. 只能生成最开始的写的module的symbol,所以各个模块的位置就很重要
2. 模块内部的连接要定义electrical类型,这样可以保留各个模块的电气特性
二. 代码
下面是我写的一段生成占空比可变的vpulse信号的代码
`include "constants.vams"
`include "disciplines.vams"
module xy_pulse(f_clk,tx_en, pulsewidth, vpulse);
input f_clk,tx_en;
input [7:0] pulsewidth;
output vpulse;
electrical f_clk,vpulse,tx_en;
electrical [7:0] pulsewidth;
parameter real vdd = 3.3 from [0:inf);
parameter real tdel = 1p from [0:inf);
parameter real trise = 1p from (0:inf);
parameter real tfall = 1p from (0:inf);
electrical vout;
real out;
t_delay D1(
.in(f_clk),
.pulse_width(pulsewidth),
.out(aa)
);
gate G1(
.vin1(f_clk),
.vin2(aa),
.out(vout)
);
analog begin
@(initial_step) out=0;
if(V(tx_en)<vdd/2) out=0;
else out=V(vout);
V(vpulse)<+transition(out,tdel,trise,tfall);
end
endmodule
module t_delay(in,pulse_width,out);
input in;
input [7:0]pulse_width;
output out;
electrical in,out;
electrical [7:0]pulse_width;
parameter real t_rise=10p from [0:inf);
parameter real t_fall=10p from [0:inf);
parameter real vdd=3.3 from [0:inf);
real vout;
real tdelay;
analog begin
@(initial_step)begin
vout=0;end
if(V(pulse_width[0])>vdd/2)
tdelay=0;
if(V(pulse_width[1])>vdd/2)
tdelay=6.25n;
if(V(pulse_width[2])>vdd/2)
tdelay=2*6.25n;
if(V(pulse_width[3])>vdd/2)
tdelay=3*6.25n;
if(V(pulse_width[4])>vdd/2)
tdelay=4*6.25n;
if(V(pulse_width[5])>vdd/2)
tdelay=5*6.25n;
if(V(pulse_width[6])>vdd/2)
tdelay=6*6.25n;
if(V(pulse_width[7])>vdd/2)
tdelay=7*6.25n;
vout=V(in);
V(out)<+transition(vout,tdelay,t_rise,t_fall);
end
endmodule
module gate(vin1,vin2,out);
input vin1,vin2;
output out;
electrical vin1,vin2,out;
parameter real vdd = 3.3 from [0:inf);
parameter real tdel = 1p from [0:inf);
parameter real trise = 1p from (0:inf);
parameter real tfall = 1p from (0:inf);
real vout_val;
integer logic1, logic2;
analog begin
@(initial_step)
vout_val=0;
logic1=V(vin1)>vdd/2;
logic2=V(vin2)>vdd/2;
@(cross(V(vin1)-vdd/2,1)) logic1=1;
@(cross(V(vin1)-vdd/2,-1)) logic1=0;
@(cross(V(vin2)-vdd/2,1)) logic2=0;
@(cross(V(vin2)-vdd/2,-1)) logic2=1;
vout_val=(logic1 && logic2) ? vdd:0;
V(out)<+transition(vout_val,tdel,trise,tfall);
end
endmodule
三. 仿真
1.系统框图
2.testbench
3.仿真结果