这是我的代码,据我所知,定义中的LED
module sevenseg (LEDs,in);
output reg [6:0] LEDs;
input [3:0] in;
always@(in) begin
case(in)
0 : LEDs = 7'b1000000;
1 : LEDs = 7'b1111001;
2 : LEDs = 7'b0100100;
3 : LEDs = 7'b0110000;
4 : LEDs = 7'b0011001;
5 : LEDs = 7'b0001010;
6 : LEDs = 7'b0000010;
7 : LEDs = 7'b1111000;
8 : LEDs = 7'b0000000;
9 : LEDs = 7'b00010000;
default : LEDs = 7'b1111111;
endcase
end
endmodule
这是编译错误
错误(10161):7seg2.v(39)处的Verilog HDL错误:对象" LED"未声明
错误:Quartus II 64位分析&合成不成功。 1错误,1警告
错误(293001):Quartus II完全编译失败。 3个错误,1个警告
答案 0 :(得分:5)
您正在混合ANSI和非ANSI标头样式。这是非法的语法。一些模拟器/合成器允许它,但这是不好的做法。
您应该使用ANSI:IEEE Std 1800-2012§23.2.2.2 ANSI样式的端口声明列表
function(){
if(false){
??? // Perhaps use a "this". Not sure.
}
}
或非ANSI:IEEE Std 1800-2012§23.2.2.1非ANSI样式端口声明
module sevenseg (
output reg [6:0] LEDs,
input [3:0] in );
IEEE Std 1364-1995需要非ANSI。自IEEE Std 1364-2001以来,支持ANSI。
答案 1 :(得分:1)
接受的答案是错误的 - 在Verilog(2001/2005)或SystemVerilog中,这不是非法的。如果您的编译器认为它是,那么它是错误的或假设Verilog-1995(没有理智的商业编译器)。
对于Verilog(1364-2005),12.3.3陈述:
port_expression中的每个port_identifier都在端口列表中 模块声明也应在模块正文中声明为 以下端口声明之一:input,output或inout (双向)。这是对任何其他数据类型的补充 特定端口的声明 - 例如,reg或wire。该 语法12-4中给出了端口声明的语法。
12-4将output_declaration
定义为
output_declaration ::=
output [ net_type ] [ signed ] [ range ] list_of_port_identifiers
| output reg [ signed ] [ range ] list_of_variable_port_identifiers
| output output_variable_type list_of_variable_port_identifiers
因此,当您拥有端口标识符的简单列表时,output reg
有效。 12-4下面的文字说明了
如果端口声明不包含网络或变量类型,则可以再次在网络中声明端口或 变量声明。
因此Greg建议的更改是允许,而不是必需(reg
当然是'变量类型')。换句话说,如果您没有output reg x
,那么您可以将其拆分为两个语句 - output x
和reg x
。
SystemVerilog(1800-2012)基本相同 - 请注意reg
是integer_vector_type
,data_type
。
另请注意,1364中未使用ANSI一词,SystemVerilog错误地使用它。任务/功能/端口声明不看起来像ANSI-C,因为您无法在C或C ++中指定对象列表。例如,您不能声明或定义像myfunc(int a, b)
这样的函数;它必须是(int a, int b)
。
答案 2 :(得分:0)
我认为问题是你试图从一个总阻塞中推送非ANSI样式的输出。
你可以
1.转向ANSI风格(无论如何更方便)或
2.添加一根电线,将案件结果推送给它,然后分配'电线输出,
3.永远删除'阻止和写:
assign LEDs = (in == 0) ? 7'b1000000 : (in == 1) ?
.....