如何用Verilog-a对熔丝(fuse)建模?
时间:10-02
整理:3721RD
点击:
自己编写了一个verilog-a程序,用来对熔丝(fuse)建模,在电流大于1mA时熔丝要烧断。但dc仿真却不收敛,主体程序如下:
module fuse(vp,vn)
electrical vp,vn;
parameter real r=1k;
analog begin
if(I(vp,vn)>1m) begin
I(vp,vn)<+0;
end
else begin
V(vp,vn)<+r*I(vp,vn);
end
end
endmodule
仿真发现电流超过1m时,程序就在
if(I(vp,vn)>1m) begin
I(vp,vn)<+0;
end
这个语句产生不收敛。
请教大家,如何用Verilog-a对fuse建模呢?
module fuse(vp,vn)
electrical vp,vn;
parameter real r=1k;
analog begin
if(I(vp,vn)>1m) begin
I(vp,vn)<+0;
end
else begin
V(vp,vn)<+r*I(vp,vn);
end
end
endmodule
仿真发现电流超过1m时,程序就在
if(I(vp,vn)>1m) begin
I(vp,vn)<+0;
end
这个语句产生不收敛。
请教大家,如何用Verilog-a对fuse建模呢?
模型过于理想很容易不收敛
可以设置Ron = 1k, Roff = 10M。
更好的办法是用tanh函数来平滑电阻变化。
感谢楼上的回复。自己又修改了一下,仿真通过了。
module fuse(vp,vn)
electrical vp,vn;
parameter real r=1k;integerrstate;
analog begin
@(initial_step) begin//只在程序开始仿真时执行一次
rstate=(V(vp)<2)?1:0;//此语句必须放在initial中,否则程序在每个仿真点都会执行该语句,导致vp<2时rstate又为1,即本来
end//熔断的fuse又恢复了
if(V(vp)>2&&V(vp,vn)/r>1m) begin//此语句中的V(vp,vn)/r不能用 I(vp,vn)代替,否则不收敛
rstate=0;
end
if(rstate==0)begin
I(vp,vn)<+0;
end
else begin
V(vp,vn)<+r*I(vp,vn);
end
end
endmodule
高手