module ram ( input clk, input [7:0] data, input [9:0] rdaddress, input rden, input aclr, input [9:0] wraddress, input wren, output [7:0] q ); reg [9:0] addr_reg; reg [7:0] mem [0:1023]; wire [7:0] q_reg; genvar i; always @(posedge clk) begin if (aclr) begin addr_reg <= 10'd0; for (i = 0; i <= 1023; i = i + 1) begin mem[i] <= 8'h00; end end else if (wren) begin mem[wraddress] <= data; end addr_reg <= rdaddress; end assign q_reg = rden ? mem[addr_reg] : 8'h00; assign q = q_reg; endmodule代码报错Error (10049): Verilog HDL error at ram.v(20): value must not be assigned to nonvariable "i"
时间: 2023-12-14 20:36:06 浏览: 162
stm32 TIM input capture
这个错误是因为在 Verilog 语言中,genvar 声明的变量 i 是一个循环计数器,在循环过程中不能被赋值。因此,你需要将循环中的 i = i + 1 这个赋值操作改成 i = i + 1'd1 或者是 i = i + 1'b1,这样就可以通过编译了。
修改后的代码如下:
```
module ram (
input clk,
input [7:0] data,
input [9:0] rdaddress,
input rden,
input aclr,
input [9:0] wraddress,
input wren,
output [7:0] q
);
reg [9:0] addr_reg;
reg [7:0] mem [0:1023];
wire [7:0] q_reg;
genvar i;
always @(posedge clk) begin
if (aclr) begin
addr_reg <= 10'd0;
for (i = 0; i <= 1023; i = i + 1'd1) begin
mem[i] <= 8'h00;
end
end
else if (wren) begin
mem[wraddress] <= data;
end
addr_reg <= rdaddress;
end
assign q_reg = rden ? mem[addr_reg] : 8'h00;
assign q = q_reg;
endmodule
```
阅读全文