2014-10-19 292 views
-2

变量声明:Verilog的错误 - 精时间常数

output reg a, b, c; 

有什么不对的下面,用Verilog编码:

generate 

if (!a && !b && !c) 
    call call1(param1, param2, param3); 

endgenerate 

我上if陈述线以下错误:

Error - unknown or bad value for genvar 
Elaboration time unknown or bad value encountered for generate if-statement 
condition expression. 
Please make sure it is elaboration time constant. 

我甚至试过以下内容:

always @* begin 

if (!a && !b && !c) 
    call call1(param1, param2, param3); 

end 

当我做什么的正上方(always块),我得到以下语法错误:

Token is '(' 

call call1(param1, param2, param3); 
        ^
+0

是A,B,C genvars?你能否展开这个例子来涵盖变量声明。注意,没有调用它们是实例,您描述的物理硬件不是编程例程。 – Morgan 2014-10-20 05:20:12

+0

基本上我只想在几个模块中包含一个if语句,但是当我不包含'always @ *'头文件时,我得到了阐述时间未知错误。当我包含'always @ *'头部时,我得到不正确的输出(x's)。附:我如何确定是否是genvar? NB代表什么? – thetypist 2014-10-20 07:03:22

+0

注意:[在wikipeida]上(http://en.wikipedia.org/wiki/Nota_bene),只是表示注意。 – Morgan 2014-10-20 08:14:32

回答

3

有看起来是一些混淆您使用Verilog的方式,尤其是来自命名惯例你已经使用。

使用示例的编译版本生成on EDA Playground

module test; 

    localparam a = 0; 
    localparam b = 0; 
    localparam c = 0; 

    generate 
    if (!a && !b && !c) begin 
     call call1(param1, param2, param3); 
    end 
    endgenerate 

endmodule 

module call(
    input param1, 
    input param2, 
    input param3 
); 
endmodule 

此实例调用,即创建硬件如果a,b和c为0。由于我们不能创建和销毁硬件A,B, c必须是常数。

你已经打电话给你的模块呼叫,这听起来像你看它是一个软件功能调用。这不是硬件块。

您的端口被命名为param,端口不是参数,它们表示硬件中将模块相互连接的物理连线。

这听起来像你实际上试图有选择性的逻辑,在这种情况下,你需要组合硬件来选择使用哪个输出。

wire out1,out2,result; 

call   call1  (input1, input2, out1); //<-- Hardware always exists 
othercall instance_2(input1, input2, out2); 

always @* begin 
    if (!a && !b && !c) 
    result = out1;  //<-- Output from different modules selected 
    else 
    result = out2; 
end 

如果不是两个输出之间进行选择:

call   call1  (input1, input2, out1); //<-- Hardware always exists 

always @* begin 
    if (!a && !b && !c) 
    result = out1;  //<-- Output from module selected 
    else 
    result = 'b0;  // Otherwise drive 0 
end 
+0

初始开始工作吗?我得到两个不同的输出,每个输出一个。我应该如何知道使用哪一个? – thetypist 2014-10-20 07:34:24

+1

@thetypist不,初始只评估一次,所以选择是静态的。即结果永远不会改变。我不明白你的2个不同的输出。结果应该总是被驱动。 – Morgan 2014-10-20 07:44:26