【问题标题】:ModelSim-Altera show error "enum literal name already exists" while Quartus notModelSim-Altera 显示错误“枚举文字名称已存在”,而 Quartus 不存在
【发布时间】:2018-07-12 08:05:21
【问题描述】:

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

代码.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?

附言

当然,如果一个模块中有两个枚举并且如果这些枚举具有相同的成员,我们就会出错。但我说的是放在结构中的枚举。

例子:

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 个警告

8 个 LED 串上的结果:0010 0011

附言

我不明白 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

【问题讨论】:

    标签: struct enums system-verilog modelsim quartus


    【解决方案1】:

    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;
    

    对赋值中使用的枚举类型进行类型检查,如 参数,并且 with 运算符包含在 6.19.3。和 C 一样,没有文字的重载;因此,奖牌 2 和奖牌 3 不能在同一范围内定义,因为它们 包含相同的名称

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

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

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

    【讨论】:

    • 感谢您的回答。你能叫模拟器女巫接受我的代码吗?
    • 根据 IEEE 1800-2017 的第 23.9 节范围规则,结构不会创建范围(但类会),因此 IDLE 在同一范围内定义了两次。
    • 添加 P.P.S.带有代码示例。我认为如果 struct 根本不创建范围,它们将毫无用处。用于创建的注册范围,但不适用于枚举元素。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-10-03
    • 2016-06-24
    • 1970-01-01
    • 2022-11-01
    • 2019-06-20
    相关资源
    最近更新 更多