Verilog中的编译错误

时间:2014-11-04 09:57:38

标签: mips verilog

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

**错误:C:\ Users \ Montifas \ Desktop \ Organwsi \ RegisterFile.v(14):' i'是Generate循环中的无效类型。必须是genvar。 **错误:C:\ Users \ Montifas \ Desktop \ Organwsi \ RegisterFile.v(16):near" [&#34 ;:语法错误,意外' [',期待IDENTIFIER或TYPE_IDENTIFIER **错误:C:\ Users \ Montifas \ Desktop \ Organwsi \ RegisterFile.v(23):near" [&#34 ;:语法错误,意外' [',期待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

有没有人知道出了什么问题?

2 个答案:

答案 0 :(得分:1)

always块第一行的分号使编译器感到困惑,使其认为剩下的编码是推断的生成块。

其他问题,您的重置是使用阻塞分配将1位值分配给32位触发器。使用非阻塞ans使位大小为32位。此外else if(reset)也不需要。 reset是一个sinle位值,只有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

答案 1 :(得分:0)

你的代码的主要问题是你的always语句之后有一个分号,所以你的always块中的其余代码实际上并不在你的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