ModelSim-Altera 显示错误 "enum literal name already exists" 而 Quartus 没有
ModelSim-Altera show error "enum literal name already exists" while Quartus not
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显示错误:"Enum literal name 'IDLE' already exists."
我可以在 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)编译结果:
Info (293000): Quartus Prime 完整编译成功。 0 个错误,32 个警告
八个 LED 串的结果:0010 0011
P.P.S.
我不明白是否 struct create new scope of 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
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;
Type checking of enumerated types used in assignments, as
arguments, and with operators is covered in
6.19.3. As in C, there is no overloading of literals; therefore, medal2 and medal3 cannot be defined in the same scope because they
contain the same names
因此,我认为报告代码错误是正确的,因为 IDLE
文字出现了两次。
我已经在三个模拟器上试过你的代码。一个接受它,另外两个拒绝它。因此,总共有三个模拟器拒绝您的代码,一个接受它(Quartus 也是如此)。我想您的枚举是在结构中声明的这一事实会使 EDA 供应商对标准的解释变得复杂。
解决方法是更改其中一个或两个的名称(例如 IDLE1
和 IDLE2
)。
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显示错误:"Enum literal name 'IDLE' already exists."
我可以在 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)编译结果:
Info (293000): Quartus Prime 完整编译成功。 0 个错误,32 个警告
八个 LED 串的结果:0010 0011
P.P.S.
我不明白是否 struct create new scope of 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
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;
Type checking of enumerated types used in assignments, as arguments, and with operators is covered in 6.19.3. As in C, there is no overloading of literals; therefore, medal2 and medal3 cannot be defined in the same scope because they contain the same names
因此,我认为报告代码错误是正确的,因为 IDLE
文字出现了两次。
我已经在三个模拟器上试过你的代码。一个接受它,另外两个拒绝它。因此,总共有三个模拟器拒绝您的代码,一个接受它(Quartus 也是如此)。我想您的枚举是在结构中声明的这一事实会使 EDA 供应商对标准的解释变得复杂。
解决方法是更改其中一个或两个的名称(例如 IDLE1
和 IDLE2
)。