| 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 |