blob: a0f365d66e88af5d0f86ea2af189603cb0baa415 [file] [log] [blame] [edit]
module ROM_TEST #(
parameter ADDR_WIDTH = 6,
parameter DATA_WIDTH = 1,
// How much to increment the address to move 1 full data width.
parameter ADDRESS_STEP = 1,
// Max address for this memory
parameter MAX_ADDRESS = 63
) (
input rst,
input clk,
// Memory connection
input [DATA_WIDTH-1:0] read_data,
output reg [ADDR_WIDTH-1:0] read_address,
// INIT ROM
// When the memory is first initialized, it is expected to match the ROM
// port.
input [DATA_WIDTH-1:0] rom_read_data,
output reg [ADDR_WIDTH-1:0] rom_read_address,
// When an iteration is complete, success will be 1 for 1 cycle
output reg loop_complete,
// If an error occurs during a test, error will be 1 for each cycle
// with an error.
output reg error,
// error_state will contain the state of test FSM when the error occured.
output reg [7:0] error_state,
// error_address will be the read address where the error occurred.
output reg [ADDR_WIDTH-1:0] error_address,
// expected_data will be the read value expected.
output reg [DATA_WIDTH-1:0] expected_data,
// actual_data will be the read value read.
output reg [DATA_WIDTH-1:0] actual_data
);
reg [7:0] state;
reg [DATA_WIDTH-1:0] test_value;
reg [1:0] delay = 1'b0;
localparam START = 8'd1,
VERIFY_INIT = 8'd2;
always @(posedge clk) begin
if(rst) begin
state <= START;
error <= 0;
end else begin
case(state)
START: begin
loop_complete <= 0;
state <= VERIFY_INIT;
read_address <= 0;
rom_read_address <= 0;
error <= 0;
end
VERIFY_INIT: begin
if(delay == 0) begin
if(rom_read_data != read_data) begin
error <= 1;
error_state <= state;
error_address <= read_address;
expected_data <= rom_read_data;
actual_data <= read_data;
end else begin
error <= 0;
end
end
else if (delay == 1) begin
if(read_address + ADDRESS_STEP <= MAX_ADDRESS) begin
read_address <= read_address + ADDRESS_STEP;
rom_read_address <= rom_read_address + ADDRESS_STEP;
end else begin
rom_read_address <= 0;
read_address <= 0;
loop_complete <= 1;
state <= START;
end
end
delay <= delay + 1;
end
endcase
end
end
endmodule