You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.21 11:07:02