VHDL及Verilog,遇到的各种编译错误及修改办法

1.type mismatch

signal a : std_ulogic;
signal b : std_ulogic;
signal c : std_ulogic;

a <= b and ( c = ‘1’);

编译报错:
and 左右两边类型不匹配。
b是std_ulogic,(c = ‘1’)返回值是bool类型。
所以报错。

另外,VHDL中的when ( ) else语句中,when后的条件,必须是bool类型的值,其他的值,比如std_logic等,不行!!
比如:
signal a : std_ulogic;
a<= 1;
when( a ) else…..
编译报错,类型错误。
修改:
when(a=’1’)else ….
正确。

2.VHDL代码引用函数(function)

如果文件a.vhdl需要引用b.vhdl中的某个函数(function),则需要在a.vhdl的开头先引用b.vhdl文件。

注意:一般会默认将b.vhdl(package)文件编译到work目录。
在a.vhdl的开头添加:
library work;
use work.b.all;

3.Verilog编译头文件报错: the type of file XXXX could not be determined
这种XXXX文件,一般是头文件,比如head.vh,或者库文件lib.vlib。
这些文件内部用verilog写的,但是文件的名称的后缀不是.v,而是.vh或.vlib等别的后缀,直接编译,并不能成功。

修改办法:
在编译的命令中加上
-vlog_ext +.vlib,.vh
这个命令的意思是,要编译器认识加了后缀的文件,比如.vlib和.vh。是的,这里是同时认识这两种文件,中间用“,”逗号隔开。
重新编译,通过!

4.Verilog编译报错:文件或module被重复编译。
这种问题容易出现在大型项目中。
因为,项目规模大,文件众多,当不同文件重复引用了同一个文件,就可能出现重复编译的情况。

解决办法:
在编译命令中添加 -ALLOWREDEFINITION
重新编译,通过!

5.SystemVerilog编译时报错:缺少endmodule。
这是个匪夷所思的错误,因为,代码最后是有endmodule的,这个错误提示的位置在代码中真正endmodule的前面。
而且,之前代码都可以正常仿真,添加了部分逻辑后,就不行了。仔细检查了添加的代码,没有逻辑问题。
最后检查发现,是前方添加的代码中某个begin漏写了end。
添加上end。
重新编译,通过!

教训:一定要先写好begin/end,再添加代码。

你可能感兴趣的:(VHDL)