Struct ModelSim Altera显示错误“;枚举文字名称已存在";而夸特斯不是

Struct ModelSim Altera显示错误“;枚举文字名称已存在";而夸特斯不是,struct,enums,system-verilog,modelsim,quartus,Struct,Enums,System Verilog,Modelsim,Quartus,Quartus编译此代码时没有任何错误 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 代

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

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

p.S.

当然,如果一个模块中有两个枚举,并且这些枚举具有相同的成员,则会出现错误。但我要说的是被放置到结构中的枚举

例如:

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是否创建了新的范围

这段代码由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

IEEE 1800-2012第6.19节规定:

分配中使用的枚举类型的类型检查,如 中介绍了参数和运算符 6.19.3. 与C语言一样,没有文字重载;因此,medal2和medal3不能在同一范围内定义,因为它们 包含相同的名称

因此,我认为报告代码错误是正确的,因为
IDLE
文本出现两次

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


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

IEEE 1800-2012,第6.19节规定:

分配中使用的枚举类型的类型检查,如 中介绍了参数和运算符 6.19.3. 与C语言一样,没有文字重载;因此,medal2和medal3不能在同一范围内定义,因为它们 包含相同的名称

因此,我认为报告代码错误是正确的,因为
IDLE
文本出现两次

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


解决方法是更改一个或两个名称(例如
IDLE1
IDLE2
)。

谢谢您的回答。你能调用接受我的代码的模拟器吗?根据IEEE 1800-2017第23.9节范围规则,结构不创建范围(但类创建范围),因此
IDLE
在同一范围内定义了两次。使用代码示例添加P.P.S。我认为,如果struct根本不创建作用域,它们将毫无用处。用于已创建的注册范围,但不用于枚举元素。谢谢您的回答。你能调用接受我的代码的模拟器吗?根据IEEE 1800-2017第23.9节范围规则,结构不创建范围(但类创建范围),因此
IDLE
在同一范围内定义了两次。使用代码示例添加P.P.S。我认为,如果struct根本不创建作用域,它们将毫无用处。用于已创建但不用于枚举元素的寄存器范围。