未知的verilog错误'期待'endmodule“'

时间:2012-05-04 05:53:39

标签: verilog

在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
     

endmodule

它一直给我以下错误

错误(10170):Decoder.v(7)附近文本“case”的Verilog HDL语法错误;期待“endmodule” 错误(10170):Decoder.v(14)附近文本“6”的Verilog HDL语法错误;期待“endmodule”

它也在每个结束语句和默认和结束时执行此操作

我不知道为什么会这样做,我对verilog来说还是新手。

提前致谢

2 个答案:

答案 0 :(得分:6)

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

尝试重写您的代码,如下所示:

//change wire types to reg type

always @*
begin
  case (op)
    6'b000000: begin
      aluop = 3'b000
    end
    ...
  endcase
end

答案 1 :(得分: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,那么您看到的错误消息是有意义的。