Quartus无报错但ModelSim提示空begin/end块错误的原因排查
ModelSim编译Verilog代码时的空begin/end块错误分析
问题描述
Quartus中对Verilog项目进行分析与综合操作时无任何错误,但在ModelSim中编译文件时,出现如下错误提示:
错误:C:/Users/deivi/OneDrive/Documents/ingegneria_progetti/EMBEDDED/prima_esercitazione/Gestione_sensori/conta_periodo.v(90): 发现一个内容为空的begin/end块。这在SystemVerilog中是允许的,但在Verilog中不被允许。请检查是否存在多余的分号。
涉事代码
module conta_periodo (avvia, fatto, enable , start_count, ck, rst_l,rst_sync); input avvia, rst_l, ck, enable; output reg start_count, fatto, rst_sync; reg [2:0] s_reg, s_next; parameter [2:0] s_i = 3'b000, s_1 = 3'b001, s_2 = 3'b010, s_3 = 3'b011; initial s_reg = 3'b000; always @ (posedge ck) // memoria di stato begin if (rst_l) s_reg <= s_i; else begin if (enable) s_reg <= s_next; else s_reg <= s_reg; end end always @ (*) begin s_next = s_reg; case (s_reg) s_i: if (avvia) s_next = s_1; else s_next = s_i; s_1: s_next = s_2; s_2: s_next = s_3; s_3: s_next = s_i; default: s_next = s_i; endcase end always @ (s_reg) begin case (s_reg) s_i: begin start_count = 1'b0; fatto =1'b0; rst_sync=1'b1; end s_1: begin start_count = 1'b1; fatto =1'b0; rst_sync=1'b1; end s_2: begin start_count = 1'b1; fatto =1'b0; rst_sync=1'b1; end s_3: begin start_count = 1'b0; fatto =1'b1; rst_sync=1'b0; end default: begin start_count = 1'b0; fatto =1'b0; rst_sync=1'b0; end endcase; end endmodule
错误原因
- 错误定位在第90行:代码最后一个
case语句的endcase后面多了一个分号(endcase;)。 - Verilog语法规定,
endcase作为语句块的结束关键字,不需要额外加分号。这个多余的分号会被编译器解析为一个空语句,导致always块内出现了逻辑上的空begin/end块,违反Verilog标准。 - Quartus综合器对这类非标准语法的容忍度较高,不会报错;但ModelSim严格遵循Verilog规范,因此触发了错误提示。
解决方法
删除endcase后面的分号,将代码中的endcase;修改为endcase即可。
内容的提问来源于stack exchange,提问作者Dev
相关产品推荐
相关产品推荐

