2014-11-04 92 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