2014-11-04 87 views
0

我正在设计一个verilog中的32位MIPS处理器,我刚刚完成了RegisterFile。当我尝试编译我得到这些错误:Verilog编译错误

**错误:C:\ Users \ Montifas \ Desktop \ Organwsi \ RegisterFile.v(14):'我'是在生成循环中的无效类型。必须是genvar。 **错误:C:\ Users \ Montifas \ Desktop \ Organwsi \ RegisterFile.v(16):接近“[”:语法错误,意外''',期待IDENTIFIER或TYPE_IDENTIFIER **错误:C:\ Users \ Montifas \ Desktop \ Organwsi \ RegisterFile.v(23):接近“[”:语法错误,意外的'[',期待IDENTIFIER或TYPE_IDENTIFIER

我粘贴代码,直到这些消息显示的行评论:

module RegFile (clock, reset, raA, raB, wa, wen, wd, rdA, rdB); 
    input clock, reset, wen; 
    input [4:0] raA, raB, wa; 
    input [31:0] wd; 
    output [31:0] rdA, rdB; 
    reg [31:0] data[31:0]; 
    integer i; 

    always @ (negedge clock or negedge reset); 
     begin 
      if(~reset) 
       begin 
        for(i=0; i<32; i=i+1) //LINE14 
         begin 
          data[i] = 1'b0; //LINE16 
         end 
       end 
      else if(reset) 
       begin  
        if(wen) 
         begin 
           data[wa] <= wd; //LINE23 
         end 
       end 
     end 

有没有人有一个想法是什么错?

回答

0

你的代码的主要问题是你总是声明后有一个分号,所以总是阻塞的代码中的其余部分实际上并不在你的always块中。第二个问题是,我应该是genvar这样使用时不是一个整数。

module RegFile (clock, reset, raA, raB, wa, wen, wd, rdA, rdB); 
    input clock, reset, wen; 
    input [4:0] raA, raB, wa; 
    input [31:0] wd; 
    output [31:0] rdA, rdB; 
    reg [31:0] data[31:0]; 
    genvar i; 

    always @ (negedge clock or negedge reset) 
     begin 
      if(~reset) 
       begin 
        for(i=0; i<32; i=i+1) //LINE14 
         begin 
          data[i] = 1'b0; //LINE16 
         end 
       end 
      else if(reset) 
       begin  
        if(wen) 
         begin 
           data[wa] <= wd; //LINE23 
         end 
       end 
     end 
+0

关闭,但错了。 '我'应该是一个'整数'。 'genvar'用于生成循环。 always块第一行的分号混淆了编译器,使其认为剩下的编码是推断生成的块。 – Greg 2014-11-04 17:26:38

+0

非常感谢!你是对的!我看不到分号... – 2014-11-04 21:15:36

1

always块的第一行上的分号混淆了编译器,使得它认为剩下的编码是推断生成的块。

其他问题,您的重置是使用阻塞赋值为一个32位触发器分配一个1位值。使用非阻塞并使位大小为32位。也不需要else if(reset)。重置是一个罪恶的价值,只是一个else的作品。

always @ (negedge clock or negedge reset) // <-- no semicolon 
    begin 
     if(~reset) 
      begin 
       for(i=0; i<32; i=i+1) //LINE14 
        begin 
         data[i] <= 32'b0; //LINE16 // <-- non-blocking 32-bit 
        end 
      end 
     else // <-- 'if(reset)' is not needed 
      begin  
       if(wen) 
        begin 
          data[wa] <= wd; //LINE23 
        end 
      end 
    end