对象<name>未在verlog中声明

时间:2015-11-17 00:53:38

标签: verilog

这是我的代码,据我所知,定义中的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错误:对象&#34; LED&#34;未声明

错误:Quartus II 64位分析&amp;合成不成功。 1错误,1警告

错误(293001):Quartus II完全编译失败。 3个错误,1个警告

3 个答案:

答案 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 xreg x

SystemVerilog(1800-2012)基本相同 - 请注意reginteger_vector_typedata_type

另请注意,1364中未使用ANSI一词,SystemVerilog错误地使用它。任务/功能/端口声明看起来像ANSI-C,因为您无法在C或C ++中指定对象列表。例如,您不能声明或定义像myfunc(int a, b)这样的函数;它必须是(int a, int b)

答案 2 :(得分:0)

我认为问题是你试图从一个总阻塞中推送非ANSI样式的输出。

你可以 1.转向ANSI风格(无论如何更方便)或
2.添加一根电线,将案件结果推送给它,然后分配&#39;电线输出, 3.永远删除&#39;阻止和写:
   assign LEDs = (in == 0) ? 7'b1000000 : (in == 1) ? .....