微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 微波和射频技术 > RFIC设计学习交流 > 关于VerilogA的一个语法问题

关于VerilogA的一个语法问题

时间:10-02 整理:3721RD 点击:
编写的一段程序,提示下面这句 有语法问题,请高手帮忙看下~
VREF<+(VREF+0.0001*(Vdd-5)-0.0001*TempC);

额,这~
这问题有点多:
1. 赋值语句只能给节点电压或支路电流赋值,比如:
V(A, B) <+ x;或I(A, B) <+ x;
2. 你的这个赋值语句即使把语法改对了也有点小问题,赋值两端竟然能把VREF约掉。所以,尽量不要用隐性的方法来复制吧。

首先明确下Vref和Vdd的变量属性,是electrical还是real。
看你的赋值语句,应该理解为前者,那如2楼所说,需要用V(VREF)/V(VDD);

嗯~我现在 语法改正确了~但是温度的仿真有问题,结果是单调递减的,这是什么原因呢?
其中 TempC=abs($temperature-27); 非常感谢~

abs不是求绝对值么,把绝对值去掉试试

就是求绝对值之后 才不是单调变化的啊~要是去掉绝对值,就应该是线性变化的了啊?

就是求绝对值之后 才不是单调变化的啊~要是去掉绝对值,就应该是线性变化的了啊?

呵呵不好意思又整反了,那你把27改为300。看看是不是温度的单位不是“C”,而是“K”。这东西要敢试。

好吧~我试试~过两天再上一段代码 也是我写的 很短的~但是没有能实现功能 到时候 还请大师 给捉捉虫啊~嘿嘿

果然,改成300,结果就对了!非常感谢。我这里还有一段代码~还劳烦高手给指点下呗~
`include "constants.vams"
`include "disciplines.vams"
module over_voltage_protect_6v(OUT, GND, VDD, VIN);
output OUT;
electrical OUT;
input GND;
electrical GND;
input VDD;
electrical VDD;
input VIN;
electrical VIN;
parameter real Vref_high=6.6;
parameter real Vref_low =6.27;
parameter real Out_high=5;
parameter real Out_low =0;
analog begin
if(V(VIN)<=Vref_low)
V(OUT)<+Out_low;
else if(Vref_low<V(VIN)<=Vref_high)
begin
if(V(OUT)==Out_low)
V(OUT)<+Out_low;
else if(V(OUT)==Out_high)
V(OUT)<+Out_high;
end
else V(OUT)<+Out_high;
end
endmodule
我想实现的是过压保护功能,就是输入电压查过6.6V时输出高电压保护,当电压下降到6.27V的时候解除保护状态,即输出为低电平。但是现在仿真的结果输出一直都是0,这是什么原因呢?



在逻辑、判断、循环语句中,最好不要给节点电压和支路电流赋值。应该用中间变量比如:
integer x;

if (A>B) x=1;
else x=0;
V(OUT)=x*5+!x*4;
就是这个意思,领会精神。
话说你是在哪里工作的?这么爱写VerilogA不如来我这工作。

恩 领会这个概念了~我回去再改改试试~ O(∩_∩)O谢谢~
您是 自己开的公司?你们都用VerilogA代码? 在哪个城市啊?

我现在还是学生~人在北京~

功能还是不对~不能实现。其实 就是想实现滞回比较器的功能~这个 代码应该怎么来写呢?

这个不好写哈,涉及的语法比较多。给你一个思路,你可以边查资料边写。
要有两个参数:
parameter real vref=1;
parameter real voffset=0.02;
要有判断语句和中间变量:
integer x;
if (V(IN)>vref) x=1;
else if (V(IN)<(vref-voffset)) x=0;
要有时序语句
@ (cross ( V(IN)-vref, +1));
@ (corss ( V(IN)-vref, -1));
要有瞬态赋值语句
V(OUT) <+ transition(x*vhigh+!x*vlow,delay,rise,fall);
最好还要有初始状态语句和反馈语句。
能教你的就这么多了,领会精神。

我想问下 那个初始状态语句的设置 应该是在什么文件中设置呢?我看的资料上说要预先设置好,而不是在 程序中设置。难道是在头文件中设置吗?如何找到头文件呢?谢谢了~

就在命令行里面写,比如
analog begin
@ (initial_step or initial_step("dc")) begin
a=1;
b=2;
end
V(OUT) <+ V(IN)*a/b;
end

我直接写的@(initial_step) begin……
但是最后会报错……是什么原因呢?

前辈您好,我在用verilog导入到cadence时提示如下错误,但是我在.v文件中没发现错误,请您帮忙看一下是什么问题。/home/dianke/ic5141/design/sar_logic.v
assign start=!en_! & en_reg;
|
ncvlog: *E,EXPSMC (/home/dianke/ic5141/design/sar_logic.v,28|20): expecting a semicolon (';') [6.1(IEEE)].
begin
|
ncvlog: *E,CSISYX (/home/dianke/ic5141/design/sar_logic.v,110|21): case item syntax error [9.5(IEEE)].
default:
|
ncvlog: *E,NOTSTT (/home/dianke/ic5141/design/sar_logic.v,114|22): expecting a statement [9(IEEE)].
endcase
|
ncvlog: *E,NOTSTT (/home/dianke/ic5141/design/sar_logic.v,119|21): expecting a statement [9(IEEE)].
module __nclib.sar_logic:module
errors: 4, warnings: 0

小编,我现在用一个带隙基准的veriloga代码,就是你这段代码,也遇到你这行代码的语法问题,请问你当时是怎么改的,求救~


`include "constants.vams"
`include "disciplines.vams"
module over_voltage_protect_6v(OUT, GND, VDD, VIN);
inout VDD,GND;
input VIN;
output VOUT;
electrical OUT, GND, VDD, VIN;
parameter real Vref_high=6.6;
parameter real Vref_low =6.27;
parameter real Out_high=5;
parameter real Out_low =0;
integer out;
analog begin
@(initial_step) out=V(VIN)>Vref_high?1:0;
@(cross(V(VIN)-Vref_high,1)) out=1;
@(cross(V(VIN)-Vref_low,-1)) out=0;
V(VOUT)<+transition(out?Out_high:Out_low,1n,1n,1n);
end
endmodule

学习

大神请教一下,input [4:0] vi;
output [30:0] vo;



用case语句:
case(vi)
(00000):vo=0000000000000000000000000000000;
...

大神这样会报错,请问怎么解决啊,,小弟刚学veriloga ,不是很懂。

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top