I made a code like this:
input [7:0] Address, WriteData;
input MemRead = 0, MemWrite = 0, CLK;
output reg[7:0] ReadData;
reg [31:0] Input[7:0], Output[7:0];
reg [31:0] Sel;
wire [4:0] addr = Address[4:0];
integer i;
initial begin
for(i = 0; i < 16; i = i + 1) begin
Output[i] = i;
Output[15 + i] = 255 - i + 1;
end
Sel = 32'b0;
end
always @(MemRead or MemWrite) begin
if(MemRead == 1) begin
ReadData <= Output[7]; // here is error point
end
else if(MemWrite == 1) begin
Input[addr] <= WriteData;
Sel[addr] <= MemWrite;
end
end
It initializes array Output
like:
Output[0] = 0, Output[1] = 1, Output[2] = 2...
When I gave ReadData <= Output[number]
with number < 8, and simulate, it gives expected result: ReadData = 00000111
for Output[7]
.
But, when I gave number >= 8, result changes: ReadData = XXXXXXXX
for Output[8]
.
I did not changed anything but the number. How can this happen?
You declared
Output
as following:It means that you have 8 vectors, 32 bits each. Judging by your confusion and one of your loops, I'd say that you want 32 vectors, 8 bits (1 byte) each. In that case, you should declare
Output
as:Btw you should rather avoid naming your signals almost like Verilog keywords (input, output, etc)