【问题标题】:Unknown verilog error 'expecting "endmodule"'未知的verilog错误'期待“endmodule”'
【发布时间】:2012-05-13 16:13:05
【问题描述】:

在 verilog 中,我有一个无法通过的错误。这是代码的第一位,然后是最后一位

 module Decoder(op,funct,aluop,mwr,mreg,mrd,alusrc,regdst,regwr,btype);
  input[5:0] op,funct;
  output[2:0] aluop;
  output[1:0] btype;
  output mwr,mreg,mrd,alusrc,regdst,regwr;
  wire aluop,mwr,mreg,mrd,alusrc,regdst,regwr,btype;
  case(op)
      6'b000000: begin
          case(funct)
              6'b001010:
                  assign aluop = 3'b010;
              6'b001100:
                  assign aluop = 3'b111;
              6'b010001:
                  assign aluop = 3'b011;
              default:
                  assign aluop = 3'b000;          
          endcase
          assign btype = 2'b00;
          assign mwr = 1'b0;
          assign mreg = 1'b0;
          assign mrd = 1'b0;
          assign alusrc = 1'b0;
          assign regdst = 1'b1;
          assign regwr = 1'b1;
          end

...

  default: begin
      assign aluop = 3'b000;
        assign mwr = 0;
        assign mreg = 0;
        assign mrd = 0;
        assign alusrc = 0;
        assign btype = 2'b00;
        assign regdst = 0;
        assign regwr = 0;
        end
endcase

结束模块

它总是给我以下错误

错误 (10170):在 Decoder.v(7) 的文本“case”附近出现 Verilog HDL 语法错误;期待“结束模块” 错误 (10170):Decoder.v(14) 中文本“6”附近的 Verilog HDL 语法错误;期待“endmodule”

它也在每个 end 语句和 default 和 endcase 中都这样做

我不知道为什么会这样,我对 verilog 还很陌生。

提前致谢

【问题讨论】:

    标签: verilog


    【解决方案1】:

    我相信您只能在 always 块内使用 case 语句或 if/else。我不确定为什么您的错误消息没有说一些更有帮助的东西,但这很可能是问题所在。

    尝试像下面这样重写你的代码:

    //change wire types to reg type
    
    always @*
    begin
      case (op)
        6'b000000: begin
          aluop = 3'b000
        end
        ...
      endcase
    end
    

    【讨论】:

    • 理论上解码器不应该使用寄存器。如果它们是寄存器,这真的很重要吗?
    • @AlexMousavi 仅仅因为您使用“reg”数据类型并不一定意味着它会被综合到寄存器中。只要解码器中没有“保留状态”,综合就会创建适当的组合逻辑。您可以阅读本文以获取更多信息asic-world.com/tidbits/wire_reg.html
    【解决方案2】:

    这是一个猜测,但编译器正在抱怨,因为它可能需要 IEEE 1364-2001 verilog,并且您的代码对于此版本的语言无效。无论如何,Tim 的代码可能就是您正在寻找的功能。

    至于为什么它无效,Verilog 在每个模块声明中基本上包含两个“上下文”。任何直接出现在模块中的都是模块项。其中包括 reg/wire 声明、assign 语句、always 语句、生成构造和模块实例。

    module mod;
    
    reg reg1;           //Module item
    wire wire1;         //Module item
    assign wire1 = 0;   //Module item
    always reg1 = 0;    //Module item
    parameter con1 = 0; //Module item
     //Instances a different module based on con1
    case(con1)          //Module item
      0:mod2 inst1(reg1);
      1:mod3 inst1(reg1);
      2:mod4 inst1(reg1);
    endcase
    
    endmodule
    

    其次,存在可以存在程序语句的程序上下文。这是任务声明、函数声明、总是块、初始块和其他一些区域内的任何代码。

    module mod2;
    reg a;
    
    always
      begin
      a = 0; //Procedural statement
      end
    
    initial
       a = 0; //Procedural statement 
    
    function func1(input arg1);
    case (arg1) //Procedural statement 
      0:func1 = 0; 
      default:func1 = 9;
    endcase
    endfunction
    
    endmodule
    

    自 2001 年以来,Verilog 包含两种类型的案例陈述,程序案例陈述和生成案例陈述。过程案例语句就像它们在过程语言中一样工作,但必须出现在过程上下文中。生成案例语句在模拟开始之前静态评估,并且可能仅作为模块项出现在模块声明上下文中。请注意,第二个上下文要求 case 表达式保持不变。

    在最新版本的 verilog 1364-2005 中,生成案例可能直接出现在模块范围内,但是在 2001 版本的语言中,任何生成项都必须用 generate..endgenerate 关键字包围。如果您的编译器需要 IEEE 1364-2001,那么您看到的错误消息是有道理的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-06-17
      • 2015-08-28
      • 1970-01-01
      相关资源
      最近更新 更多