如何在尝试进行简单的数字比较时摆脱错误 <variableName> is not constant?

How to get rid of the error <variableName> is not constant while trying to do simple number comparison?

我是 SystemVerilog 和 Basys3 的新手。我正在尝试学习 七段显示。为此,我编写了一个简单的演示:

1- Take input from switches
2- From that Input, decide which seven segment output will be used with comparing numbers
3- Display on the seven segment display.

你可以看到我的代码。

module SevenSegmentNumber(input logic[3:0] inputFile, output logic [6:0] outputFile);
    
    if (inputFile == 3'b000) begin
        assign outputFile[6] = 0;
        assign outputFile[5] = 0;
        assign outputFile[4] = 0;
        assign outputFile[3] = 0;
        assign outputFile[2] = 0;
        assign outputFile[1] = 0;
        assign outputFile[0] = 1;
    end
    
    else if (inputFile == 3'b001) begin
            assign outputFile[6] = 1;
            assign outputFile[5] = 0;
            assign outputFile[4] = 0;
            assign outputFile[3] = 1;
            assign outputFile[2] = 1;
            assign outputFile[1] = 1;
            assign outputFile[0] = 1;
    end
    
    else if (inputFile == 3'b010) begin
            assign outputFile[6] = 0;
            assign outputFile[5] = 0;
            assign outputFile[4] = 1;
            assign outputFile[3] = 0;
            assign outputFile[2] = 0;
            assign outputFile[1] = 1;
            assign outputFile[0] = 0;
    end
endmodule

assign outputFile[n] 是根据我在 Internet 上找到的七段显示的工作原理进行硬编码的。

我的问题是我无法比较输入文件是否等于 0、1 或 2

错误信息是:

inputFile is not constant

我也试过用表格写代码

inputFile == 0
inputFile == 1
inputFile == 2

这并没有解决我的问题。我该如何解决这个问题?

您的错误消息告诉您 inputFile 输入端口不能以那种方式使用,因为它是一个变量类型。您的代码看起来像是在使用隐式 generate 构造,它要求 inputFile 是常量类型,例如 parameter.

修复代码的一种方法是将 if/else 语句放在程序块中。由于您正在描述组合逻辑,因此可以使用 always_comb。在这种情况下,不需要使用 assign 关键字。

module SevenSegmentNumber(input logic[3:0] inputFile, output logic [6:0] outputFile);
    
always_comb begin
    outputFile = '0;

    if (inputFile == 3'b000) begin
        outputFile[6] = 0;
        outputFile[5] = 0;
        outputFile[4] = 0;
        outputFile[3] = 0;
        outputFile[2] = 0;
        outputFile[1] = 0;
        outputFile[0] = 1;
    end
    
    else if (inputFile == 3'b001) begin
        outputFile[6] = 1;
        outputFile[5] = 0;
        outputFile[4] = 0;
        outputFile[3] = 1;
        outputFile[2] = 1;
        outputFile[1] = 1;
        outputFile[0] = 1;
    end
    
    else if (inputFile == 3'b010) begin
        outputFile[6] = 0;
        outputFile[5] = 0;
        outputFile[4] = 1;
        outputFile[3] = 0;
        outputFile[2] = 0;
        outputFile[1] = 1;
        outputFile[0] = 0;
    end
end

endmodule

请注意,我在块的顶部将 outputFile 初始化为 0。这避免了在合成时推断锁存器。您可以将 0 更改为对您的设计更有意义的东西(当输入不是 0、1 或 2 时您的逻辑应该做什么)。