1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327
|
LOGIC Tile Documentation
========================
Span-4 and Span-12 Wires
------------------------
The *span-4* and *span-12* wires are the main interconnect resource in
iCE40 FPGAs. They "span" (have a length of) 4 or 12 cells in horizontal
or vertical direction.
All routing resources in iCE40 are directional tristate buffers. The
bits marked routing use the all-zeros config pattern for tristate, while
the bits marked buffer have a dedicated buffer-enable bit, which is 1 in
all non-tristate configurations.
Span-4 Horizontal
~~~~~~~~~~~~~~~~~
|Span-4 Horizontal|
The image on the right shows the *horizontal span-4* wires of a logic or
ram cell (click to enlarge).
On the left side of the cell there are 48 connections named sp4_h_l_0 to
sp4_h_l_47. The lower 36 of those wires are connected to sp4_h_r_12 to
sp4_h_r_47 on the right side of the cell. (IceStorm normalizes this wire
names to sp4_h_r_0 to sp4_h_r_35. Note: the Lattice tools use a
different normalization scheme for this wire names.) The wires
connecting the left and right horizontal span-4 ports are pairwise
crossed-out.
The wires sp4_h_l_36 to sp4_h_l_47 terminate in the cell as do the wires
sp4_h_r_0 to sp4_h_r_11.
This wires "span" 4 cells, i.e. they connect 5 cells if you count the
cells on both ends of the wire.
For example, the wire sp4_h_r_0 in cell (x, y) has the following names:
================ ===================== =====================
Cell Coordinates sp4_h_l\_\* wire name sp4_h_r\_\* wire name
================ ===================== =====================
x, y -- sp4_h_r_0
x+1, y sp4_h_l_0 sp4_h_r_13
x+2, y sp4_h_l_13 sp4_h_r_24
x+3, y sp4_h_l_24 sp4_h_r_37
x+4, y sp4_h_l_37 --
================ ===================== =====================
Span-4 Vertical
~~~~~~~~~~~~~~~
|Span-4 Vertical|
The image on the right shows the *vertical span-4* wires of a logic or
ram cell (click to enlarge).
Similar to the horizontal span-4 wires there are 48 connections on the
top (sp4_v_t_0 to sp4_v_t_47) and 48 connections on the bottom
(sp4_v_b_0 to sp4_v_b_47). The wires sp4_v_t_0 to sp4_v_t_35 are
connected to sp4_v_b_12 to sp4_v_b_47 (with pairwise crossing out). Wire
names are normalized to sp4_v_b_12 to sp4_v_b_47.
But in addition to that, each cell also has access to sp4_v_b_0 to
sp4_v_b_47 of its right neighbour. This are the wires sp4_r_v_b_0 to
sp4_r_v_b_47. So over all a single vertical span-4 wire connects 9
cells. For example, the wire sp4_v_b_0 in cell (x, y) has the following
names:
+----------------+----------------+----------------+----------------+
| Cell | sp4_v_t\_\* | sp4_v_b\_\* | sp4_r_v_b\_\* |
| Coordinates | wire name | wire name | wire name |
+================+================+================+================+
| x, y | -- | sp4_v_b_0 | -- |
+----------------+----------------+----------------+----------------+
| x, y-1 | sp4_v_t_0 | sp4_v_b_13 | -- |
+----------------+----------------+----------------+----------------+
| x, y-2 | sp4_v_t_13 | sp4_v_b_24 | -- |
+----------------+----------------+----------------+----------------+
| x, y-3 | sp4_v_t_24 | sp4_v_b_37 | -- |
+----------------+----------------+----------------+----------------+
| x, y-4 | sp4_v_t_37 | -- | -- |
+----------------+----------------+----------------+----------------+
| x-1, y | -- | -- | sp4_r_v_b_0 |
+----------------+----------------+----------------+----------------+
| x-1, y-1 | -- | -- | sp4_r_v_b_13 |
+----------------+----------------+----------------+----------------+
| x-1, y-2 | -- | -- | sp4_r_v_b_24 |
+----------------+----------------+----------------+----------------+
| x-1, y-3 | -- | -- | sp4_r_v_b_37 |
+----------------+----------------+----------------+----------------+
Span-12 Horizontal and Vertical
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Similar to the span-4 wires there are also longer horizontal and
vertical span-12 wires.
There are 24 connections sp12_v_t_0 to sp12_v_t_23 on the top of the
cell and 24 connections sp12_v_b_0 to sp12_v_b_23 on the bottom of the
cell. The wires sp12_v_t_0 to sp12_v_t_21 are connected to sp12_v_b_2 to
sp12_v_b_23 (with pairwise crossing out). The connections sp12_v_b_0,
sp12_v_b_1, sp12_v_t_22, and sp12_v_t_23 terminate in the cell. Wire
names are normalized to sp12_v_b_2 to sp12_v_b_23.
There are also 24 connections sp12_h_l_0 to sp12_h_l_23 on the left of
the cell and 24 connections sp12_h_r_0 to sp12_h_r_23 on the right of
the cell. The wires sp12_h_l_0 to sp12_h_l_21 are connected to
sp12_h_r_2 to sp12_h_r_23 (with pairwise crossing out). The connections
sp12_h_r_0, sp12_h_r_1, sp12_h_l_22, and sp12_h_l_23 terminate in the
cell. Wire names are normalized to sp12_v_r_2 to sp12_h_r_23.
Local Tracks
------------
The *local tracks* are the gateway to the logic cell inputs. Signals
from the span-wires and the logic cell outputs of the eight neighbour
cells can be routed to the local tracks and signals from the local
tracks can be routed to the logic cell inputs.
Each logic tile has 32 local tracks. They are organized in 4 groups of 8
wires each: local_g0_0 to local_g3_7.
The span wires, global signals, and neighbour outputs can be routed to
the local tracks. But not all of those signals can be routed to all of
the local tracks. Instead there is a different mix of 16 signals for
each local track.
The buffer driving the local track has 5 configuration bits. One enable
bit and 4 bits that select the input wire. For example for local_g0_0
(copy&paste from the bitstream doku):
+--------+--------+--------+--------+--------+----------+----------------+-----------------+
| B0[14] | B1[14] | B1[15] | B1[16] | B1[17] | Function | Source-Net | Destination-Net |
+========+========+========+========+========+==========+================+=================+
| 0 | 0 | 0 | 0 | 1 | buffer | sp4_r_v_b_24 | local_g0_0 |
+--------+--------+--------+--------+--------+----------+----------------+-----------------+
| 0 | 0 | 0 | 1 | 1 | buffer | sp12_h_r_8 | local_g0_0 |
+--------+--------+--------+--------+--------+----------+----------------+-----------------+
| 0 | 0 | 1 | 0 | 1 | buffer | neigh_op_bot_0 | local_g0_0 |
+--------+--------+--------+--------+--------+----------+----------------+-----------------+
| 0 | 0 | 1 | 1 | 1 | buffer | sp4_v_b_16 | local_g0_0 |
+--------+--------+--------+--------+--------+----------+----------------+-----------------+
| 0 | 1 | 0 | 0 | 1 | buffer | sp4_r_v_b_35 | local_g0_0 |
+--------+--------+--------+--------+--------+----------+----------------+-----------------+
| 0 | 1 | 0 | 1 | 1 | buffer | sp12_h_r_16 | local_g0_0 |
+--------+--------+--------+--------+--------+----------+----------------+-----------------+
| 0 | 1 | 1 | 0 | 1 | buffer | neigh_op_top_0 | local_g0_0 |
+--------+--------+--------+--------+--------+----------+----------------+-----------------+
| 0 | 1 | 1 | 1 | 1 | buffer | sp4_h_r_0 | local_g0_0 |
+--------+--------+--------+--------+--------+----------+----------------+-----------------+
| 1 | 0 | 0 | 0 | 1 | buffer | lutff_0/out | local_g0_0 |
+--------+--------+--------+--------+--------+----------+----------------+-----------------+
| 1 | 0 | 0 | 1 | 1 | buffer | sp4_v_b_0 | local_g0_0 |
+--------+--------+--------+--------+--------+----------+----------------+-----------------+
| 1 | 0 | 1 | 0 | 1 | buffer | neigh_op_lft_0 | local_g0_0 |
+--------+--------+--------+--------+--------+----------+----------------+-----------------+
| 1 | 0 | 1 | 1 | 1 | buffer | sp4_h_r_8 | local_g0_0 |
+--------+--------+--------+--------+--------+----------+----------------+-----------------+
| 1 | 1 | 0 | 0 | 1 | buffer | neigh_op_bnr_0 | local_g0_0 |
+--------+--------+--------+--------+--------+----------+----------------+-----------------+
| 1 | 1 | 0 | 1 | 1 | buffer | sp4_v_b_8 | local_g0_0 |
+--------+--------+--------+--------+--------+----------+----------------+-----------------+
| 1 | 1 | 1 | 0 | 1 | buffer | sp12_h_r_0 | local_g0_0 |
+--------+--------+--------+--------+--------+----------+----------------+-----------------+
| 1 | 1 | 1 | 1 | 1 | buffer | sp4_h_r_16 | local_g0_0 |
+--------+--------+--------+--------+--------+----------+----------------+-----------------+
Then the signals on the local tracks can be routed to the input pins of
the logic cells. Like before, not every local track can be routed to
every logic cell input pin. Instead there is a different mix of 16 local
track for each logic cell input. For example for lutff_0/in_0:
====== ====== ====== ====== ====== ======== ========== ===============
B0[26] B1[26] B1[27] B1[28] B1[29] Function Source-Net Destination-Net
====== ====== ====== ====== ====== ======== ========== ===============
0 0 0 0 1 buffer local_g0_0 lutff_0/in_0
0 0 0 1 1 buffer local_g2_0 lutff_0/in_0
0 0 1 0 1 buffer local_g1_1 lutff_0/in_0
0 0 1 1 1 buffer local_g3_1 lutff_0/in_0
0 1 0 0 1 buffer local_g0_2 lutff_0/in_0
0 1 0 1 1 buffer local_g2_2 lutff_0/in_0
0 1 1 0 1 buffer local_g1_3 lutff_0/in_0
0 1 1 1 1 buffer local_g3_3 lutff_0/in_0
1 0 0 0 1 buffer local_g0_4 lutff_0/in_0
1 0 0 1 1 buffer local_g2_4 lutff_0/in_0
1 0 1 0 1 buffer local_g1_5 lutff_0/in_0
1 0 1 1 1 buffer local_g3_5 lutff_0/in_0
1 1 0 0 1 buffer local_g0_6 lutff_0/in_0
1 1 0 1 1 buffer local_g2_6 lutff_0/in_0
1 1 1 0 1 buffer local_g1_7 lutff_0/in_0
1 1 1 1 1 buffer local_g3_7 lutff_0/in_0
====== ====== ====== ====== ====== ======== ========== ===============
The 8 global nets on the iCE40 can be routed to the local track via the
glb2local_0 to glb2local_3 nets using a similar two-stage process. The
logic block clock-enable and set-reset inputs can be driven directly
from one of 4 global nets or from one of 4 local tracks. The logic block
clock input can be driven from any of the global nets and from a few
local tracks. See the bitstream documentation for details.
Logic Block
-----------
Each logic tile has a logic block containing 8 logic cells. Each logic
cell contains a 4-input LUT, a carry unit and a flip-flop. Clock, clock
enable, and set/reset inputs are shared along the 8 logic cells. So is
the bit that configures positive/negative edge for the flip flops. But
the three configuration bits that specify if the flip flop should be
used, if it is set or reset by the set/reset input, and if the set/reset
is synchronous or asynchronous exist for each logic cell individually.
Each LUT *i* has four input wires lutff\_\ i/in_0 to lutff\_\ i/in_3.
Input lutff\_\ i/in_3 can be configured to be driven by the carry output
of the previous logic cell, or by carry_in_mux in case of *i*\ =0. Input
lutff\_\ i/in_2 can be configured to be driven by the output of the
previous LUT for *i*>0 (LUT cascade). The LUT uses its 4 input signals
to calculate lutff\_\ i/lout. The signal is then passed through the
built-in FF and becomes lutff\_\ i/out. With the exception of LUT
cascades, only the signal after the FF is visible from outside the logic
block.
The carry unit calculates lutff\_\ i/cout = lutff\_\ i/in_1 +
lutff\_\ i/in_2 + lutff\_\ (i-1)/cout > 1. In case of *i*\ =0,
carry_in_mux is used as third input. carry_in_mux can be configured to
be constant 0, 1 or the lutff_7/cout signal from the logic tile below.
Part of the functionality described above is documented as part of the
routing bitstream documentation (see the buffers for lutff\_ inputs).
The NegClk bit switches all 8 FFs in the tile to negative edge mode. The
CarryInSet bit drives the carry_in_mux high (it defaults to low when not
driven via the buffer from carry_in).
The remaining functions of the logic cell are configured via the LC\_\ i
bits. This are 20 bit per logic cell. We have arbitrarily labeled those
bits as follows:
+-----------------+--------+--------+--------+--------+--------+---------+---------+---------+
| Label | LC_0 | LC_1 | LC_2 | LC_3 | LC_4 | LC_5 | LC_6 | LC_7 |
+=================+========+========+========+========+========+=========+=========+=========+
| LC\_\ *i*\ [0] | B0[36] | B2[36] | B4[36] | B6[36] | B8[36] | B10[36] | B12[36] | B14[36] |
+-----------------+--------+--------+--------+--------+--------+---------+---------+---------+
| LC\_\ *i*\ [1] | B0[37] | B2[37] | B4[37] | B6[37] | B8[37] | B10[37] | B12[37] | B14[37] |
+-----------------+--------+--------+--------+--------+--------+---------+---------+---------+
| LC\_\ *i*\ [2] | B0[38] | B2[38] | B4[38] | B6[38] | B8[38] | B10[38] | B12[38] | B14[38] |
+-----------------+--------+--------+--------+--------+--------+---------+---------+---------+
| LC\_\ *i*\ [3] | B0[39] | B2[39] | B4[39] | B6[39] | B8[39] | B10[39] | B12[39] | B14[39] |
+-----------------+--------+--------+--------+--------+--------+---------+---------+---------+
| LC\_\ *i*\ [4] | B0[40] | B2[40] | B4[40] | B6[40] | B8[40] | B10[40] | B12[40] | B14[40] |
+-----------------+--------+--------+--------+--------+--------+---------+---------+---------+
| LC\_\ *i*\ [5] | B0[41] | B2[41] | B4[41] | B6[41] | B8[41] | B10[41] | B12[41] | B14[41] |
+-----------------+--------+--------+--------+--------+--------+---------+---------+---------+
| LC\_\ *i*\ [6] | B0[42] | B2[42] | B4[42] | B6[42] | B8[42] | B10[42] | B12[42] | B14[42] |
+-----------------+--------+--------+--------+--------+--------+---------+---------+---------+
| LC\_\ *i*\ [7] | B0[43] | B2[43] | B4[43] | B6[43] | B8[43] | B10[43] | B12[43] | B14[43] |
+-----------------+--------+--------+--------+--------+--------+---------+---------+---------+
| LC\_\ *i*\ [8] | B0[44] | B2[44] | B4[44] | B6[44] | B8[44] | B10[44] | B12[44] | B14[44] |
+-----------------+--------+--------+--------+--------+--------+---------+---------+---------+
| LC\_\ *i*\ [9] | B0[45] | B2[45] | B4[45] | B6[45] | B8[45] | B10[45] | B12[45] | B14[45] |
+-----------------+--------+--------+--------+--------+--------+---------+---------+---------+
| LC\_\ *i*\ [10] | B1[36] | B3[36] | B5[36] | B7[36] | B9[36] | B11[36] | B13[36] | B15[36] |
+-----------------+--------+--------+--------+--------+--------+---------+---------+---------+
| LC\_\ *i*\ [11] | B1[37] | B3[37] | B5[37] | B7[37] | B9[37] | B11[37] | B13[37] | B15[37] |
+-----------------+--------+--------+--------+--------+--------+---------+---------+---------+
| LC\_\ *i*\ [12] | B1[38] | B3[38] | B5[38] | B7[38] | B9[38] | B11[38] | B13[38] | B15[38] |
+-----------------+--------+--------+--------+--------+--------+---------+---------+---------+
| LC\_\ *i*\ [13] | B1[39] | B3[39] | B5[39] | B7[39] | B9[39] | B11[39] | B13[39] | B15[39] |
+-----------------+--------+--------+--------+--------+--------+---------+---------+---------+
| LC\_\ *i*\ [14] | B1[40] | B3[40] | B5[40] | B7[40] | B9[40] | B11[40] | B13[40] | B15[40] |
+-----------------+--------+--------+--------+--------+--------+---------+---------+---------+
| LC\_\ *i*\ [15] | B1[41] | B3[41] | B5[41] | B7[41] | B9[41] | B11[41] | B13[41] | B15[41] |
+-----------------+--------+--------+--------+--------+--------+---------+---------+---------+
| LC\_\ *i*\ [16] | B1[42] | B3[42] | B5[42] | B7[42] | B9[42] | B11[42] | B13[42] | B15[42] |
+-----------------+--------+--------+--------+--------+--------+---------+---------+---------+
| LC\_\ *i*\ [17] | B1[43] | B3[43] | B5[43] | B7[43] | B9[43] | B11[43] | B13[43] | B15[43] |
+-----------------+--------+--------+--------+--------+--------+---------+---------+---------+
| LC\_\ *i*\ [18] | B1[44] | B3[44] | B5[44] | B7[44] | B9[44] | B11[44] | B13[44] | B15[44] |
+-----------------+--------+--------+--------+--------+--------+---------+---------+---------+
| LC\_\ *i*\ [19] | B1[45] | B3[45] | B5[45] | B7[45] | B9[45] | B11[45] | B13[45] | B15[45] |
+-----------------+--------+--------+--------+--------+--------+---------+---------+---------+
LC\_\ i\ [8] is the CarryEnable bit. This bit must be set if the carry
logic is used.
LC\_\ i\ [9] is the DffEnable bit. It enables the output flip-flop for
the LUT.
LC\_\ i\ [18] is the Set_NoReset bit. When this bit is set then the
set/reset signal will set, not reset the flip-flop.
LC\_\ i\ [19] is the AsyncSetReset bit. When this bit is set then the
set/reset signal is asynchronous to the clock.
The LUT implements the following truth table:
==== ==== ==== ==== =============
in_3 in_2 in_1 in_0 lout
==== ==== ==== ==== =============
0 0 0 0 LC\_\ i\ [4]
0 0 0 1 LC\_\ i\ [14]
0 0 1 0 LC\_\ i\ [15]
0 0 1 1 LC\_\ i\ [5]
0 1 0 0 LC\_\ i\ [6]
0 1 0 1 LC\_\ i\ [16]
0 1 1 0 LC\_\ i\ [17]
0 1 1 1 LC\_\ i\ [7]
1 0 0 0 LC\_\ i\ [3]
1 0 0 1 LC\_\ i\ [13]
1 0 1 0 LC\_\ i\ [12]
1 0 1 1 LC\_\ i\ [2]
1 1 0 0 LC\_\ i\ [1]
1 1 0 1 LC\_\ i\ [11]
1 1 1 0 LC\_\ i\ [10]
1 1 1 1 LC\_\ i\ [0]
==== ==== ==== ==== =============
LUT inputs that are not connected to anything are driven low. The
set/reset signal is also driven low if not connected to any other
driver, and the clock enable signal is driven high when left
unconnected.
.. |Span-4 Horizontal| image:: _static/images/sp4h.svg
:height: 200px
:target: _static/images/sp4h.svg
.. |Span-4 Vertical| image:: _static/images/sp4v.svg
:height: 200px
:target: _static/images/sp4v.svg
|