^

AR# 34089 MIG Spartan-6 FPGA MCB - In ES Devices, some bits of the MCB address bus (mcbx_dram_addr) might violate the input hold time (tIH) specification of the memory device


In the Spartan-6 Engineering Sample (ES) devices, some bits of the MCB address bus (mcbx_dram_addr) might violate the input hold time (tIH) specification of the memory device under certain operating conditions. These specific tIH violations can be seen as data errors.

This issue is limited to ES devices and is fixed in the Spartan-6 Production devices.


To determine if data errors are due to this address bus timing issue, delay can be inserted into each address bit path to move the window and avoid the possibility of a tIH violation. Xilinx has tested this delay insertion by instantiating ODELAY into each address bit output path and setting the delay to '0'. The added delay through the ODELAY component shifts the address bus timing to avoid a hold time violation.

To add ODELAY to each address bit, the "mcb_raw_wrapper.v" module (located in the MIG output 'rtl' directory) must be manually modified:

NOTE: If you are using the MPMC module in EDK, the file is located in $XILINX_EDK\hw\XilinxProcessorIPLib\pcores\mpmc_v6_00_a\hdl\verilog where $XILINX_EDK is the location of the EDK install.

Step 1 - Add delay wire declarations

wire [C_MEM_ADDR_WIDTH-1:0]ioi_addr_delay;
wire [C_MEM_ADDR_WIDTH-1:0]t_addr_delay;

Step 2 - Modify the address output logic. Locate the generate statement for the address output (this starts at line 6300 in MIG 3.3).

Comment out the following code:

//// Address

genvar addr_i;
generate
for(addr_i = 0; addr_i < C_MEM_ADDR_WIDTH; addr_i = addr_i + 1) begin : gen_addr_obuft
OBUFT iob_addr_inst
(.I ( ioi_addr[addr_i]),
.T ( t_addr[addr_i]),
.O ( mcbx_dram_addr[addr_i])
);
end
endgenerate

Replace with:

//// Address

genvar addr_delay_i;
generate
for(addr_delay_i = 0; addr_delay_i < C_MEM_ADDR_WIDTH; addr_delay_i = addr_delay_i + 1) begin : gen_addr_delay_obuft
IODELAY2 #(
.ODELAY_VALUE (0), // 0 to 255 inclusive
.DELAY_SRC ("ODATAIN"),
.SIM_TAPDELAY_VALUE (50) // 10 to 90 inclusive
) delay_addr_inst
(.DOUT (ioi_addr_delay[addr_delay_i]),
.TOUT (t_addr_delay[addr_delay_i]),
.ODATAIN (ioi_addr[addr_delay_i]),
.T ( t_addr[addr_delay_i])
);
end
endgenerate

//// Address

genvar addr_i;
generate
for(addr_i = 0; addr_i < C_MEM_ADDR_WIDTH; addr_i = addr_i + 1) begin : gen_addr_obuft
OBUFT iob_addr_inst
(.I ( ioi_addr_delay[addr_i]),
.T ( t_addr_delay[addr_i]),
.O ( mcbx_dram_addr[addr_i])
);
end
endgenerate

This adds ODELAY components to each address bit.

Step 3 - Run the MIG design again through Synthesis, Implementation, and BitGen using the MIG provided "ise_flow.bat" file (located in the 'example_design/par' and 'user_design/par' directories).

Test the modified ".bit" file in hardware to see if the data errors still occur. If the data errors are resolved, the Engineering Sample does exhibit this address bit hold violation errata item. This issue is scheduled to be resolved in production silicon and the above noted ODELAY work-around can be used in the interim.
AR# 34089
Date Created 01/13/2010
Last Updated 06/25/2010
Status Active
Type
IP
  • MIG
Feed Back