Keyboard shortcuts

Press or to navigate between chapters

Press ? to show this help

Press Esc to hide this help

Bitstream structure — XC9500XL/XV

The main differences from XC9500 are:

  1. The UIM wire-AND area is completely gone, only the main areas exist.
  2. The main area has 108 rows per FB instead of 72.
  3. Unprogrammed fuse state is 0, programmed fuse state is 1. Thus, the sense of every bitstream bit is inverted from the XC9500 version.
  4. While in XC9500 all areas are loaded sequentially, in XC9500XL/XV the areas are loaded in parallel. Thus, the JTAG unit is not a byte, but a word of size 8 * num_fbs. Likewise, the bytes for each FB are interleaved in the JED format.

On a high level, the whole bitstream is split into “areas”. Each FB of the device corresponds to one area.

Each area is made of 108 “rows”. Each row is made of 15 “columns”. Each column is made of 6 or 8 bits: columns 0-8 are made of 8 bits, while columns 9-14 are made of 6 bits.

The low 6 bits of every column are used to store product term masks, and the high 2 bits of columns 0-8 are used to store everything else.

When programmed or read via JTAG, the bitstream is transmitted as words. Each word is 8 bits per FB. Each word of the bitstream has its address. Not all addresses are valid, and valid addresses are not contiguous. Address is 16 bits long, and is split to several fields:

  • bits 12-15: FB index (only used for JTAG FERASE operation, doesn’t matter for reading and programming)
  • bits 5-11: row
  • bits 3-4: column / 5
  • bits 0-2: column % 5

The unprogrammed state of a bit on XC9500XL/XV is 0. The programmed state is 1. Thus, whenever a boolean fuse is mentioned in the documentation, the “true” value is actually represented as 1 in the bitstream.

JED format mapping

In the JED format, all fuses of the device are simply concatenated in order, skipping over invalid addresses. The bytes are not padded to 8 bits, but have their native size. Thus, converting from JED fuse index to device address involves some complex calculations::

row_bits = (8 * 9 + 6 * 6) * device.num_fbs
total_bits = row_bits * 108

def jed_to_jtag(fuse):
    row = fuse // row_bits
    fuse %= row_bits
    if fuse < 8 * 9 * device.num_fbs:
        column = fuse // (8 * device.num_fbs)
        fuse %= (8 * device.num_fbs)
        fb = fuse // 8
        bit = fuse % 8
    else:
        fuse -= 8 * 9 * device.num_fbs
        column = 9 + fuse // (6 * device.num_fbs)
        fuse %= (6 * device.num_fbs)
        fb = fuse // 6
        bit = fuse % 6
    return (
        row << 5 | 
        (column // 5) << 3 |
        (column % 5)
    ), (fb * 8 + bit)

def jtag_to_jed(addr, bit):
    fb = bit // 8
    bit %= 8
    row = addr >> 5 & 0x7f
    assert row < 108
    col_hi = addr >> 3 & 3
    assert col_hi < 3
    col_lo = addr & 7
    assert col_lo < 5
    column = col_hi * 5 + col_lo
    if column < 9:
        cfuse = column * 8 * device.num_fbs + fb * 8 + bit
    else:
        cfuse = 8 * 8 + (column - 9) * 6 * device.num_fbs + fb * 6 + bit
    return row * row_bits + cfuse

Fuses — product terms

The product term masks are stored in bits 0-5 of every column and every row of the main area. The formulas are as follows (unchanged from XC9500, but now with more rows):

  1. FB[i].MC[j].PT[k].IM[l].P is stored at:
    • row: l * 2 + 1
    • column: k + (j % 3) * 5
    • bit: j // 3
  2. FB[i].MC[j].PT[k].IM[l].N is stored at:
    • row: l * 2
    • column: k + (j % 3) * 5
    • bit: j // 3

Fuses — macrocells

Per-MC config fuses (that are not product term masks) are stored in bits 6-7 of columns 0-8 of rows 12-49 of the main area. The formulas are as follows:

  • row: corresponds to fuse function
  • column: mc_idx % 9
  • bit: 6 + mc_idx // 9
xc9500xl mc rect R0
FrameBit
B0
F0 -
F1 -
F2 -
F3 -
F4 -
F5 -
F6 -
F7 -
F8 -
F9 -
F10 -
F11 -
F12 PT[0].ALLOC[0]
F13 PT[0].ALLOC[1]
F14 PT[1].ALLOC[0]
F15 PT[1].ALLOC[1]
F16 PT[2].ALLOC[0]
F17 PT[2].ALLOC[1]
F18 PT[3].ALLOC[0]
F19 PT[3].ALLOC[1]
F20 PT[4].ALLOC[0]
F21 PT[4].ALLOC[1]
F22 INV
F23 IMPORT_UP_ALLOC[0]
F24 IMPORT_DOWN_ALLOC[0]
F25 EXPORT_CHAIN_DIR[0]
F26 SUM_HP
F27 OE_MUX[0]
F28 OE_MUX[1]
F29 OE_MUX[2]
F30 OE_INV
F31 -
F32 OUT_MUX[0]
F33 CLK_MUX[0]
F34 CLK_MUX[1]
F35 CLK_INV
F36 CE_MUX[0]
F37 CE_MUX[1]
F38 -
F39 REG_MODE[0]
F40 RST_MUX[0]
F41 SET_MUX[0]
F42 REG_INIT
F43 IOB_GND
F44 IOB_SLEW[0]
F45 PT[0].HP
F46 PT[1].HP
F47 PT[2].HP
F48 PT[3].HP
F49 PT[4].HP
CE_MUX 0.F37.B0 0.F36.B0
NONE 0 0
PT2 0 1
PT3 1 0
CLK_INV 0.F35.B0
INV 0.F22.B0
IOB_GND 0.F43.B0
OE_INV 0.F30.B0
PT[0].HP 0.F45.B0
PT[1].HP 0.F46.B0
PT[2].HP 0.F47.B0
PT[3].HP 0.F48.B0
PT[4].HP 0.F49.B0
REG_INIT 0.F42.B0
SUM_HP 0.F26.B0
non-inverted [0]
CLK_MUX 0.F34.B0 0.F33.B0
FCLK1 0 0
FCLK2 0 1
FCLK0 1 0
PT 1 1
EXPORT_CHAIN_DIR 0.F25.B0
UP 0
DOWN 1
IMPORT_DOWN_ALLOC 0.F24.B0
IMPORT_UP_ALLOC 0.F23.B0
EXPORT 0
SUM 1
IOB_SLEW 0.F44.B0
SLOW 0
FAST 1
OE_MUX 0.F29.B0 0.F28.B0 0.F27.B0
PT 0 0 0
FOE0 0 0 1
FOE1 0 1 1
FOE2 1 0 1
FOE3 1 1 1
OUT_MUX 0.F32.B0
FF 0
COMB 1
PT[0].ALLOC 0.F13.B0 0.F12.B0
PT[1].ALLOC 0.F15.B0 0.F14.B0
PT[2].ALLOC 0.F17.B0 0.F16.B0
PT[3].ALLOC 0.F19.B0 0.F18.B0
PT[4].ALLOC 0.F21.B0 0.F20.B0
NONE 0 0
SUM 0 1
EXPORT 1 0
SPECIAL 1 1
REG_MODE 0.F39.B0
DFF 0
TFF 1
RST_MUX 0.F40.B0
SET_MUX 0.F41.B0
PT 0
FSR 1
xc9500xv mc rect R0
FrameBit
B0
F0 -
F1 -
F2 -
F3 -
F4 -
F5 -
F6 -
F7 -
F8 -
F9 -
F10 -
F11 -
F12 PT[0].ALLOC[0]
F13 PT[0].ALLOC[1]
F14 PT[1].ALLOC[0]
F15 PT[1].ALLOC[1]
F16 PT[2].ALLOC[0]
F17 PT[2].ALLOC[1]
F18 PT[3].ALLOC[0]
F19 PT[3].ALLOC[1]
F20 PT[4].ALLOC[0]
F21 PT[4].ALLOC[1]
F22 INV
F23 IMPORT_UP_ALLOC[0]
F24 IMPORT_DOWN_ALLOC[0]
F25 EXPORT_CHAIN_DIR[0]
F26 SUM_HP
F27 OE_MUX[0]
F28 OE_MUX[1]
F29 OE_MUX[2]
F30 OE_INV
F31 -
F32 OUT_MUX[0]
F33 CLK_MUX[0]
F34 CLK_MUX[1]
F35 CLK_INV
F36 CE_MUX[0]
F37 CE_MUX[1]
F38 -
F39 REG_MODE[0]
F40 RST_MUX[0]
F41 SET_MUX[0]
F42 REG_INIT
F43 IOB_GND
F44 IOB_SLEW[0]
F45 PT[0].HP
F46 PT[1].HP
F47 PT[2].HP
F48 PT[3].HP
F49 PT[4].HP
CE_MUX 0.F37.B0 0.F36.B0
NONE 0 0
PT2 0 1
PT3 1 0
CLK_INV 0.F35.B0
INV 0.F22.B0
IOB_GND 0.F43.B0
OE_INV 0.F30.B0
PT[0].HP 0.F45.B0
PT[1].HP 0.F46.B0
PT[2].HP 0.F47.B0
PT[3].HP 0.F48.B0
PT[4].HP 0.F49.B0
REG_INIT 0.F42.B0
SUM_HP 0.F26.B0
non-inverted [0]
CLK_MUX 0.F34.B0 0.F33.B0
FCLK1 0 0
FCLK2 0 1
FCLK0 1 0
PT 1 1
EXPORT_CHAIN_DIR 0.F25.B0
UP 0
DOWN 1
IMPORT_DOWN_ALLOC 0.F24.B0
IMPORT_UP_ALLOC 0.F23.B0
EXPORT 0
SUM 1
IOB_SLEW 0.F44.B0
SLOW 0
FAST 1
OE_MUX 0.F29.B0 0.F28.B0 0.F27.B0
PT 0 0 0
FOE0 0 0 1
FOE1 0 1 1
FOE2 1 0 1
FOE3 1 1 1
OUT_MUX 0.F32.B0
FF 0
COMB 1
PT[0].ALLOC 0.F13.B0 0.F12.B0
PT[1].ALLOC 0.F15.B0 0.F14.B0
PT[2].ALLOC 0.F17.B0 0.F16.B0
PT[3].ALLOC 0.F19.B0 0.F18.B0
PT[4].ALLOC 0.F21.B0 0.F20.B0
NONE 0 0
SUM 0 1
EXPORT 1 0
SPECIAL 1 1
REG_MODE 0.F39.B0
DFF 0
TFF 1
RST_MUX 0.F40.B0
SET_MUX 0.F41.B0
PT 0
FSR 1

Fuses — FB inputs

The FB input mux configuraton is stored in rows 50-76, columns 0-8, bits 6-7. FB[i].IM[j].MUX has 9 bits and is stored at the following coordinates:

  • row: 50 + j % 27
  • column: mux fuse index (0-8)
  • bit: 6 if j < 27, 7 otherwise

The exact bit assignments are irregular and should be obtained from the database.

Fuses — per-FB bits and globals

Per-FB bits are stored in row 78, columns 0-8, bits 6-7. The bits are (row, bit, column):

xc9500xl block rect R0
FrameBit
B0 B1 B2 B3 B4 B5 B6
F0 - - - - - - -
F1 - - - - - - -
F2 - - - - - - -
F3 - - - - - - -
F4 - - - - - - -
F5 - - - - - - -
F6 - - - - - - -
F7 - - - - - - -
F8 - - - - - - -
F9 - - - - - - -
F10 - - - - - - -
F11 WRITE_PROT - - READ_PROT - - -
F12 - - - - - - -
F13 - - - - - - -
F14 - - - - - - -
F15 - - - - - - -
F16 - - - - - - -
F17 - - - - - - -
F18 - - - - - - -
F19 - - - - - - -
F20 - - - - - - -
F21 - - - - - - -
F22 - - - - - - -
F23 - - - - - - -
F24 - - - - - - -
F25 - - - - - - -
F26 - - - - - - -
F27 - - - - - - -
F28 - - - - - - -
F29 - - - - - - -
F30 - - - - - - -
F31 - - - - - - -
F32 - - - - - - -
F33 - - - - - - -
F34 - - - - - - -
F35 - - - - - - -
F36 - - - - - - -
F37 - - - - - - -
F38 - - - - - - -
F39 - - - - - - -
F40 - - - - - - -
F41 - - - - - - -
F42 - - - - - - -
F43 - - - - - - -
F44 - - - - - - -
F45 - - - - - - -
F46 - - - - - - -
F47 - - - - - - -
F48 - - - - - - -
F49 - - - - - - -
F50 - - - - - - -
F51 - - - - - - -
F52 - - - - - - -
F53 - - - - - - -
F54 - - - - - - -
F55 - - - - - - -
F56 - - - - - - -
F57 - - - - - - -
F58 - - - - - - -
F59 - - - - - - -
F60 - - - - - - -
F61 - - - - - - -
F62 - - - - - - -
F63 - - - - - - -
F64 - - - - - - -
F65 - - - - - - -
F66 - - - - - - -
F67 - - - - - - -
F68 - - - - - - -
F69 - - - - - - -
F70 - - - - - - -
F71 - - - - - - -
F72 - - - - - - -
F73 - - - - - - -
F74 - - - - - - -
F75 - - - - - - -
F76 - - - - - - -
F77 - - - - - - -
F78 ENABLE EXPORT_ENABLE - - - - PULLUP_DISABLE
ENABLE 0.F78.B0
EXPORT_ENABLE 0.F78.B1
PULLUP_DISABLE 0.F78.B6
READ_PROT 0.F11.B3
WRITE_PROT 0.F11.B0
non-inverted [0]
xc9500xv block rect R0
FrameBit
B0 B1 B2 B3 B4 B5 B6
F0 - - - - - - -
F1 - - - - - - -
F2 - - - - - - -
F3 - - - - - - -
F4 - - - - - - -
F5 - - - - - - -
F6 - - - - - - -
F7 - - - - - - -
F8 - - - - - - -
F9 - - - - - - -
F10 - - - - - - -
F11 WRITE_PROT - - READ_PROT - - -
F12 - - - - - - -
F13 - - - - - - -
F14 - - - - - - -
F15 - - - - - - -
F16 - - - - - - -
F17 - - - - - - -
F18 - - - - - - -
F19 - - - - - - -
F20 - - - - - - -
F21 - - - - - - -
F22 - - - - - - -
F23 - - - - - - -
F24 - - - - - - -
F25 - - - - - - -
F26 - - - - - - -
F27 - - - - - - -
F28 - - - - - - -
F29 - - - - - - -
F30 - - - - - - -
F31 - - - - - - -
F32 - - - - - - -
F33 - - - - - - -
F34 - - - - - - -
F35 - - - - - - -
F36 - - - - - - -
F37 - - - - - - -
F38 - - - - - - -
F39 - - - - - - -
F40 - - - - - - -
F41 - - - - - - -
F42 - - - - - - -
F43 - - - - - - -
F44 - - - - - - -
F45 - - - - - - -
F46 - - - - - - -
F47 - - - - - - -
F48 - - - - - - -
F49 - - - - - - -
F50 - - - - - - -
F51 - - - - - - -
F52 - - - - - - -
F53 - - - - - - -
F54 - - - - - - -
F55 - - - - - - -
F56 - - - - - - -
F57 - - - - - - -
F58 - - - - - - -
F59 - - - - - - -
F60 - - - - - - -
F61 - - - - - - -
F62 - - - - - - -
F63 - - - - - - -
F64 - - - - - - -
F65 - - - - - - -
F66 - - - - - - -
F67 - - - - - - -
F68 - - - - - - -
F69 - - - - - - -
F70 - - - - - - -
F71 - - - - - - -
F72 - - - - - - -
F73 - - - - - - -
F74 - - - - - - -
F75 - - - - - - -
F76 - - - - - - -
F77 - - - - - - -
F78 ENABLE EXPORT_ENABLE - - - - PULLUP_DISABLE
ENABLE 0.F78.B0
EXPORT_ENABLE 0.F78.B1
PULLUP_DISABLE 0.F78.B6
READ_PROT 0.F11.B3
WRITE_PROT 0.F11.B0
non-inverted [0]

Global bits are stored in rows (2, 6, 7), columns 0-8, bits 6-7 of FB 0. The bits are (fb, row, bit, column):

xc9500xl global rect R0
FrameBit
B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 B10 B11 B12 B13 B14 B15 B16
F0 - - - - - - - - - - - - - - - - -
F1 - - - - - - - - - - - - - - - - -
F2 FSR_INV FCLK0_ENABLE FCLK1_ENABLE FCLK2_ENABLE FOE0_ENABLE FOE1_ENABLE FOE2_ENABLE FOE3_ENABLE TERM_MODE[0] - - - - - - - -
F3 - - - - - - - - - - - - - - - - -
F4 - - - - - - - - - - - - - - - - -
F5 - - - - - - - - - - - - - - - - -
F6 USERCODE[30] USERCODE[28] USERCODE[26] USERCODE[24] USERCODE[22] USERCODE[20] USERCODE[18] USERCODE[16] - USERCODE[31] USERCODE[29] USERCODE[27] USERCODE[25] USERCODE[23] USERCODE[21] USERCODE[19] USERCODE[17]
F7 USERCODE[14] USERCODE[12] USERCODE[10] USERCODE[8] USERCODE[6] USERCODE[4] USERCODE[2] USERCODE[0] - USERCODE[15] USERCODE[13] USERCODE[11] USERCODE[9] USERCODE[7] USERCODE[5] USERCODE[3] USERCODE[1]
FCLK0_ENABLE 0.F2.B1
FCLK1_ENABLE 0.F2.B2
FCLK2_ENABLE 0.F2.B3
FOE0_ENABLE 0.F2.B4
FOE1_ENABLE 0.F2.B5
FOE2_ENABLE 0.F2.B6
FOE3_ENABLE 0.F2.B7
FSR_INV 0.F2.B0
non-inverted [0]
TERM_MODE 0.F2.B8
KEEPER 0
FLOAT 1
USERCODE 0.F6.B9 0.F6.B0 0.F6.B10 0.F6.B1 0.F6.B11 0.F6.B2 0.F6.B12 0.F6.B3 0.F6.B13 0.F6.B4 0.F6.B14 0.F6.B5 0.F6.B15 0.F6.B6 0.F6.B16 0.F6.B7 0.F7.B9 0.F7.B0 0.F7.B10 0.F7.B1 0.F7.B11 0.F7.B2 0.F7.B12 0.F7.B3 0.F7.B13 0.F7.B4 0.F7.B14 0.F7.B5 0.F7.B15 0.F7.B6 0.F7.B16 0.F7.B7
non-inverted [31] [30] [29] [28] [27] [26] [25] [24] [23] [22] [21] [20] [19] [18] [17] [16] [15] [14] [13] [12] [11] [10] [9] [8] [7] [6] [5] [4] [3] [2] [1] [0]
xc9500xv global rect R0
FrameBit
B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 B10 B11 B12 B13 B14 B15 B16
F0 - - - - - - - - - - - - - - - - -
F1 - - - - - - - - - - - - - - - - -
F2 FSR_INV FCLK0_ENABLE FCLK1_ENABLE FCLK2_ENABLE FOE0_ENABLE FOE1_ENABLE FOE2_ENABLE FOE3_ENABLE TERM_MODE[0] - - - - - - - -
F3 - - - - - - - - - - - - - - - - -
F4 - - - - - - - - - - - - - - - - -
F5 - - - - - - - - - - - - - - - - -
F6 USERCODE[30] USERCODE[28] USERCODE[26] USERCODE[24] USERCODE[22] USERCODE[20] USERCODE[18] USERCODE[16] - USERCODE[31] USERCODE[29] USERCODE[27] USERCODE[25] USERCODE[23] USERCODE[21] USERCODE[19] USERCODE[17]
F7 USERCODE[14] USERCODE[12] USERCODE[10] USERCODE[8] USERCODE[6] USERCODE[4] USERCODE[2] USERCODE[0] - USERCODE[15] USERCODE[13] USERCODE[11] USERCODE[9] USERCODE[7] USERCODE[5] USERCODE[3] USERCODE[1]
F8 - - - - - - - - - - - - - - - - -
F9 - - - - - - - - - - - - - - - - -
F10 - - - - - - - - - - - - - - - - -
F11 - - - - - - DONE - - - - - - - - - -
DONE 0.F11.B6
FCLK0_ENABLE 0.F2.B1
FCLK1_ENABLE 0.F2.B2
FCLK2_ENABLE 0.F2.B3
FOE0_ENABLE 0.F2.B4
FOE1_ENABLE 0.F2.B5
FOE2_ENABLE 0.F2.B6
FOE3_ENABLE 0.F2.B7
FSR_INV 0.F2.B0
non-inverted [0]
TERM_MODE 0.F2.B8
KEEPER 0
FLOAT 1
USERCODE 0.F6.B9 0.F6.B0 0.F6.B10 0.F6.B1 0.F6.B11 0.F6.B2 0.F6.B12 0.F6.B3 0.F6.B13 0.F6.B4 0.F6.B14 0.F6.B5 0.F6.B15 0.F6.B6 0.F6.B16 0.F6.B7 0.F7.B9 0.F7.B0 0.F7.B10 0.F7.B1 0.F7.B11 0.F7.B2 0.F7.B12 0.F7.B3 0.F7.B13 0.F7.B4 0.F7.B14 0.F7.B5 0.F7.B15 0.F7.B6 0.F7.B16 0.F7.B7
non-inverted [31] [30] [29] [28] [27] [26] [25] [24] [23] [22] [21] [20] [19] [18] [17] [16] [15] [14] [13] [12] [11] [10] [9] [8] [7] [6] [5] [4] [3] [2] [1] [0]

The DONE bit is only applicable to XC9500XV.