2012-05-04 52 views
3

在Verilog中我有一个错误,我无法过去。这是代码的第一位,然后最后一位未知的verilog错误'期待'endmodule''

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)附近的Verilog HDL语法错误文本“case”;期望“endmodule” 错误(10170):Decoder.v(14)附近的文本“6”处的Verilog HDL语法错误;期待“endmodule”

它也做到这一点,在每个月底声明,默认和ENDCASE

我不知道为什么它这样做,我是相当新的VERILOG。

在此先感谢

回答

6

我相信你只允许使用一个case陈述或if/elsealways块内。我不知道为什么你的错误信息没有提供更多有用的信息,但这可能是问题所在。

尝试重写类似下面的代码:

//change wire types to reg type 

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

尽管解码器理论上不应该使用寄存器。它真的很重要,但它们是否是寄存器? –

+0

@AlexMousavi仅仅因为你使用'reg'数据类型并不一定意味着它被合成到一个寄存器。只要解码器中没有“保留状态”,合成就会创建合适的组合逻辑。你可以阅读这个更多的信息http://www.asic-world.com/tidbits/wire_reg.html – Tim

+0

非常感谢,它的工作。 –

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语句,程序性case语句和生成case语句。程序性案例陈述就像程序性语言一样工作,但必须出现在程序性上下文中。生成case语句在模拟开始之前进行静态评估,并且可能仅作为模块项出现在模块声明上下文中。请注意,第二个上下文需要大小写表达式不变。

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

+0

不理解这个答案的一个词。你可以吗?简化 – AAI