UPGRADE YOUR BROWSER

We have detected your current browser version is not the latest one. Xilinx.com uses the latest web technologies to bring you the best online experience possible. Please upgrade to a Xilinx.com supported browser:Chrome, Firefox, Internet Explorer 11, Safari. Thank you!

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

Description


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 result in data errors.

This issue is limited to rev 1.0 and 1.1 ES devices and is fixed in rev 2.0 and higher ES devices and the Spartan-6 Production devices.

Solution


To determine if data errors are due to this address bus timing issue, a 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/07/2010
Last Updated 10/29/2015
Status Active
Type General Article
IP
  • MIG