我正在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
有没有人知道出了什么问题?
答案 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