ModelSim-Altera显示错误“枚举文字名称已存在”而Quartus不显示

时间:2018-07-12 08:05:21

标签: struct enums system-verilog modelsim quartus

Quartus编译此代码没有任何错误。

Code.sv

module test013_LITERAL (
    input  A,
    input  B,
    output C
);
    struct{enum{IDLE,
                SOME_STAGE_1} FSM;
             logic some_register;
            } first_machine;
    struct{enum{IDLE,
                SOME_STAGE_2} FSM;
             logic some_register;
            } second_machine;            
    assign C = A ^ B;    
endmodule

testbench.vt

  module testbench();
reg test_A;
reg test_B;
wire test_C;

test013_LITERAL DUT (.A(test_A),
                     .B(test_B),
                     .C(test_C));
initial begin    
    #100
        test_A = 0;
        test_B = 0;
    #100
        test_A = 1;
        test_B = 0;    
    #100
        test_A = 0;
        test_B = 1;        
    #100
        test_A = 1;
        test_B = 1; 
end   
endmodule

但是ModelSim-Altera显示错误:“枚举文字名称'IDLE'已经存在。”

我可以在SystemVerilog上在一个模块中编写两个结构,然后在每个结构中使用相同的文字(例如“ IDLE”)进行枚举吗?另一个结构意味着另一个作用域吗?

如果没有人可以描述使用什么结构?

如果可以,谁能向我描述如何赢得ModelSim-Altera?

PS

当然,如果一个模块中有两个枚举,并且如果这些枚举具有相同的成员,则我们将出现错误。但我说的是将女巫放入结构中的枚举。

示例:

module test013_LITERAL (
    output [3:0]first_literal,
    output [3:0]second_literal
);

struct{enum{SOME_LITERAL_0_FIRST,
            SOME_LITERAL_1_FIRST,
            IDLE,
            SOME_LITERAL_3_FIRST,
            SOME_LITERAL_4_FIRST} enum_reg;
        } first_struct;

struct{enum{SOME_LITERAL_0_SECOND,
            SOME_LITERAL_1_SECOND,
            SOME_LITERAL_2_SECOND,
            IDLE,
            SOME_LITERAL_4_SECOND} enum_reg;
        } second_struct;

assign first_literal        = first_struct.IDLE;
assign second_literal   = second_struct.IDLE;

endmodule

在Quartus Prime 17.1.0(MAX-10 10M02SCE144C8G)上编译的结果:

信息(293000):Quartus Prime完全编译成功。 0个错误,32个警告

八个LED字符串上的结果:0010 0011

P.P.S。

我不明白struct是否创建了not的新范围。

此代码由Quartus和ModelSim-Altera编译,没有任何错误。

module test013_LITERAL (
    input A,
    input B,
    output C
);
    logic some_register;
    struct{logic some_register;} first_struct;
    struct{logic some_register;} second_struct;         
    assign C = A ^ B;
endmodule

1 个答案:

答案 0 :(得分:2)

IEEE 1800-2012,第6.19节说:

// Correct declaration - bronze and gold are unsized
enum bit [3:0] {bronze='h3, silver, gold='h5} medal2;
// Correct declaration - bronze and gold sizes are redundant
enum bit [3:0] {bronze=4'h3, silver, gold=4'h5} medal3;
     

对分配中使用的枚举类型进行类型检查,例如   参数,以及与运算符有关的内容   6.19.3。与C中一样,没有字面量的重载;因此,奖牌2和奖牌3不能在同一范围内定义,因为它们   包含相同的名称

因此,我想说您的代码报告错误是正确的,因为IDLE文字出现了两次。

我已经在三个模拟器上尝试了您的代码。一个接受它,另两个拒绝它。因此,总共有三个模拟器拒绝您的代码,一个模拟器接受您的代码(Quartus也是如此)。我想您的枚举是在结构中声明的,这会使EDA供应商对标准的解释变得复杂。

解决方法是更改​​一个或两个的名称(例如IDLE1IDLE2)。