different version of i5 module with changes in pin mapping (V7 vs. undocumented V8?)
There's is a another version of the i5 V7.0 module, which features different components and a changed pin mapping compared to the one described in this repository. It is probably a newer version of the i5 (maybe a V7.1 or V8.0, but wrongly labeled ?) and can be seen on the top here (below is the 'regular' i5 V7.0 module):
Notable differences encountered so far:
- Both modules carry the
V7.0label, but only the top module has actually writteni5on it - The top module has two more mounting wholes in the corners (the right corner hole is the same size & location as on the i9 module)
- The top module is missing the 3 TI multiplexers CD4051 (chip marking CM051B, one is on the back side)
- The top module features the smaller 256-pin ECP5 BGA package (LFE5U-25F-6BG 256 C) => the bottom, 'regular' module uses the a larger 381-pin BGA (LFE5U-25F-6BG 381 C) => both got the same number of I/Os, the smaller chip has fewer VCC & GND pads and of course a different pin mapping scheme!
- The top module features a different SDRAM chip: M12L64322A-6B => it is compatible with the other one below, EM638325-6H
- the top module features a different FLASH chip: Winbond 25Q32 => it has the same (Q)SPI interface but features twice the size compared to the lower one (GD25Q16)
Since the main chip differences are hidden below the heat sink plate, it took me a while to understand that I am assuming the wrong pin mapping for this newer i5 module due to the different ECP5 package!
Surprisingly, a lot of things like the Ethernet phy 0 work just as usual when using the regular litex-boards i5 platform pin map, which configures the bitstream for a 'regular' i5 V7.0 module target: LFE5U-25F-6BG 381 C.
I am assuming most physical BGA pin identifiers that exist for both chips have been routed on both PCB modules to the same connections on purpose. However, since the smaller 256-BGA only features pin coordinates from A-T and 1-16, certain pin identifiers just don't exists on the top module.
That also explains sneaky problems I discovered using LiteX's regular colorlight_i5 platform pin mapping (the one also documented in this repo):
- the SDRAM cannot be properly accessed, ~~only every second word = 32-bits (most likely due to A17/B17 pins being replaced)~~ (seems to be more complicated, see below)
- ~~the FLASH chip cannot be accessed from the ECP5 (most likely due to W2/V2 pins being replaced) = > flashing itself via the on-board CMSISDAP JTAG adapter works just fine~~
- several pmod/pin header I/Os cannot be reached (certainly pin ids above >T,>16, didn't yet try the serial pin finder approach)
Does anyone have already the correct pin map for this presumably newer i5 V7.0 module featuring a LFE5U-25F-6BG 256 C?
The pictures on Alixexpress always show the bottom i5 V7.0 module. Another store, selling the top module is here. Interestingly, this webpage of a Colorlight partner features a very similar looking module that's differently labeled: i5**_V8.0**. A few minor layout differences can be spotted around the heat sink.
I've received 3 of the top modules shown in the image here, purchasing from Muse Labs' Aliexpress store, in the beginning of this year.
Let me reference a few people who contributed colorlight module stuff to Github: @chmousset, @Kazkojima, @DaveBerkeley, @Peter-Van-Tol, @chenzhuoyu, @kittennbfive, @tomverbeure, @zyp.
I've had a couple of the V8.0 labelled modules for a while:
I am assuming most physical BGA pin identifiers that exist for both chips have been routed on both PCB modules to the same connections on purpose. However, since the smaller 256-BGA only features pin coordinates from A-T and 1-16, certain pin identifiers just don't exists on the top module.
They haven't used the same ball coordinates. They've used the balls that correspond to the same die pads, so that an image built for V7.0 will work unmodified on V8.0 as well.
All IOs present on the LFE5U BG381 are also available on the BG256. The only difference is that the BG381 has a bunch of reserved balls that's used for the SERDES blocks in the LFE5UM.
FWIW I also dumped the original image that was on the flash of the V8.0, and the comment section of the image says Part: LFE5U-25F-6CABGA381, so even the vendor haven't bothered making a separate image explicitly targeting BG256.
thanks @zyp! good to know that the boards labeled i5_V8.0 are working well. Where did you purchase them?
Do you by chance also use the SDRAM?
In my case, the mem_test of Litex Bios reports 50% data errors with my modules labeled i5 V7.0 (the top one in my first post).
While the same design & Bios mem_test runs successfully on a i9 module and SimPlatform() (simulating the actual SDRAM chip on the i5). Unfortunately the single older, regular i5 V7.0 module that I own is bricked (the bottom one), so I can't directly compare Bios mem_test results between both i5 V7.0 variants.
Maybe my boards are a predecessor to the final i5 V8.0 and actually do have certain routing changes? I think there was a similar issues with i5 V6 boards that made only half of the SDRAM accessible. The layout and part placement on your proper module is again slightly different.
I noticed that one change on my V8.0 compared to both of your variants is that they've changed to different ethernet PHYs.
So far I've only done limited testing on the V8.0, so I can't rule out minor differences I haven't caught yet. I don't think I've used the SDRAM yet.
I'm guessing the four-digit print in the silk is production year and week, indicating that your boards are from 2018 and 2020 respectively, and mine are from 2023.
Edit: thanks for your heads-up on the dates marking! I'd agree to your guess, judged by the marks at least none of them seems that brand new. Other users could have run into SDRAM issues already.
my SDRAM issue can be verified using the vanilla litex-boards colorlight_i5 target:
$ cd litex-boards
$ python3 -m litex_boards.targets.colorlight_i5 --build --load
$ litex_term /dev/ttyACM0
litex> reboot (or just "mem_test 0x40000000 0x800000"))
LiteX BIOS generates the following failed SDRAM test result on every boot.
__ _ __ _ __
/ / (_) /____ | |/_/
/ /__/ / __/ -_)> <
/____/_/\__/\__/_/|_|
Build your hardware, easily!
(c) Copyright 2012-2025 Enjoy-Digital
(c) Copyright 2007-2015 M-Labs
BIOS built on Jul 31 2025 13:39:44
BIOS CRC passed (2e5afe73)
LiteX git sha1: 4568f9cea
--=============== SoC ==================--
CPU: VexRiscv @ 60MHz
BUS: wishbone 32-bit @ 4GiB
CSR: 32-bit data
ROM: 128.0KiB
SRAM: 8.0KiB
L2: 8.0KiB
FLASH: 2.0MiB
SDRAM: 8.0MiB 32-bit @ 60MT/s (CL-2 CWL-2)
MAIN-RAM: 8.0MiB
--========== Initialization ============--
Initializing SDRAM @0x40000000...
Switching SDRAM to software control.
Switching SDRAM to hardware control.
Memtest at 0x40000000 (2.0MiB)...
Write: 0x40000000-0x40200000 2.0MiB
Read: 0x40000000-0x40200000 2.0MiB
bus errors: 0/256
addr errors: 0/8192
data errors: 262144/524288
Memtest KO
Memory initialization failed
Initializing gd25q16 SPI Flash @0x00200000...
SPI Flash clk configured to 30 MHz
Memspeed at 0x200000 (Sequential, 4.0KiB)...
Read speed: 2.9MiB/s
Memspeed at 0x200000 (Random, 4.0KiB)...
Read speed: 1.6MiB/s
--============= Console ================--
It's the same result when using a twice as fast SDRAM clock via --sdram-rate 1:2. Exactly 50% data errors.
Note the FLASH works just fine here, but is reported as GD25Q16 instead of the actually mounted GD25Q32 since the LiteX colorlight_i5 platform instantiates the former. My problem about accessing the FLASH I reported earlier might be user related and just an issue on my side...
Edit:
On my i9 module the same vanilla litex-board's SDRAM test passes, see below. Since the following command synthesizes exactly the same LiteX platform design as dfor i5 modules (only with different FLASH) using the exact same SDRAM pin map, I'm tending towards a hardware issue on my i5 V7.0 boards with date code "2007".
$ python3 -m litex_boards.targets.colorlight_i5 --board i9 --revision 7.2 --build --load
$ litex_term /dev/ttyACM0
litex> reboot
(...)
--========== Initialization ============--
Initializing SDRAM @0x40000000...
Switching SDRAM to software control.
Switching SDRAM to hardware control.
Memtest at 0x40000000 (2.0MiB)...
Write: 0x40000000-0x40200000 2.0MiB
Read: 0x40000000-0x40200000 2.0MiB
Memtest OK
Memspeed at 0x40000000 (Sequential, 2.0MiB)...
Write speed: 22.1MiB/s
Read speed: 30.2MiB/s
(...)
it looks like the issue only appears when more than 0x800/4 words are read from the RAM. The offset address doesn't matter, which makes me think that maybe some data and address pins could be mixed up in the newer i5 V7.0 boards with date code 20:07? I guess it's time to remove the RAM chip and check the wiring with pin finder code.
litex> mem_test 0x40000000 0x800
Memtest at 0x40000000 (2.0KiB)...
Write: 0x40000000-0x40000800 2.0KiB
Read: 0x40000000-0x40000800 2.0KiB
Memtest OK
litex> mem_test 0x40000000 0x810
Memtest at 0x40000000 (2.0KiB)...
Write: 0x40000000-0x40000810 2.0KiB
memtest_data error @ 0x40000000: 0x00000202 vs 0x00000002
memtest_data error @ 0x40000004: 0x00000203 vs 0x00000003
memtest_data error @ 0x40000008: 0x00000204 vs 0x00000004
memtest_data error @ 0x4000000c: 0x00000205 vs 0x00000005
Read: 0x40000000-0x40000810 2.0KiB
bus errors: 0/256
addr errors: 0/516
data errors: 4/516
Memtest KO
litex> mem_test 0x40012300 0x1000
Memtest at 0x40012300 (4.0KiB)...
Write: 0x40012300-0x40013300 4.0KiB
memtest_data error @ 0x40012300: 0x00000202 vs 0x00000002
memtest_data error @ 0x40012304: 0x00000203 vs 0x00000003
memtest_data error @ 0x40012308: 0x00000204 vs 0x00000004
memtest_data error @ 0x4001230c: 0x00000205 vs 0x00000005
memtest_data error @ 0x40012310: 0x00000206 vs 0x00000006
memtest_data error @ 0x40012314: 0x00000207 vs 0x00000007
memtest_data error @ 0x40012318: 0x00000208 vs 0x00000008
memtest_data error @ 0x4001231c: 0x00000209 vs 0x00000009
memtest_data error @ 0x40012320: 0x0000020a vs 0x0000000a
memtest_data error @ 0x40012324: 0x0000020b vs 0x0000000b
memtest_data error @ 0x40012328: 0x0000020c vs 0x0000000c
memtest_data error @ 0x4001232c: 0x0000020d vs 0x0000000d
memtest_data error @ 0x40012330: 0x0000020e vs 0x0000000e
memtest_data error @ 0x40012334: 0x0000020f vs 0x0000000f
memtest_data error @ 0x40012338: 0x00000210 vs 0x00000010
memtest_data error @ 0x4001233c: 0x00000211 vs 0x00000011
memtest_data error @ 0x40012340: 0x00000212 vs 0x00000012
memtest_data error @ 0x40012344: 0x00000213 vs 0x00000013
memtest_data error @ 0x40012348: 0x00000214 vs 0x00000014
memtest_data error @ 0x4001234c: 0x00000215 vs 0x00000015
memtest_data error @ 0x40012350: 0x00000216 vs 0x00000016
memtest_data error @ 0x40012354: 0x00000217 vs 0x00000017
memtest_data error @ 0x40012358: 0x00000218 vs 0x00000018
memtest_data error @ 0x4001235c: 0x00000219 vs 0x00000019
memtest_data error @ 0x40012360: 0x0000021a vs 0x0000001a
memtest_data error @ 0x40012364: 0x0000021b vs 0x0000001b
memtest_data error @ 0x40012368: 0x0000021c vs 0x0000001c
memtest_data error @ 0x4001236c: 0x0000021d vs 0x0000001d
memtest_data error @ 0x40012370: 0x0000021e vs 0x0000001e
memtest_data error @ 0x40012374: 0x0000021f vs 0x0000001f
memtest_data error @ 0x40012378: 0x00000220 vs 0x00000020
memtest_data error @ 0x4001237c: 0x00000221 vs 0x00000021
memtest_data error @ 0x40012380: 0x00000222 vs 0x00000022
memtest_data error @ 0x40012384: 0x00000223 vs 0x00000023
memtest_data error @ 0x40012388: 0x00000224 vs 0x00000024
memtest_data error @ 0x4001238c: 0x00000225 vs 0x00000025
memtest_data error @ 0x40012390: 0x00000226 vs 0x00000026
memtest_data error @ 0x40012394: 0x00000227 vs 0x00000027
memtest_data error @ 0x40012398: 0x00000228 vs 0x00000028
memtest_data error @ 0x4001239c: 0x00000229 vs 0x00000029
memtest_data error @ 0x400123a0: 0x0000022a vs 0x0000002a
memtest_data error @ 0x400123a4: 0x0000022b vs 0x0000002b
memtest_data error @ 0x400123a8: 0x0000022c vs 0x0000002c
memtest_data error @ 0x400123ac: 0x0000022d vs 0x0000002d
memtest_data error @ 0x400123b0: 0x0000022e vs 0x0000002e
memtest_data error @ 0x400123b4: 0x0000022f vs 0x0000002f
memtest_data error @ 0x400123b8: 0x00000230 vs 0x00000030
memtest_data error @ 0x400123bc: 0x00000231 vs 0x00000031
memtest_data error @ 0x400123c0: 0x00000232 vs 0x00000032
memtest_data error @ 0x400123c4: 0x00000233 vs 0x00000033
memtest_data error @ 0x400123c8: 0x00000234 vs 0x00000034
memtest_data error @ 0x400123cc: 0x00000235 vs 0x00000035
memtest_data error @ 0x400123d0: 0x00000236 vs 0x00000036
memtest_data error @ 0x400123d4: 0x00000237 vs 0x00000037
memtest_data error @ 0x400123d8: 0x00000238 vs 0x00000038
memtest_data error @ 0x400123dc: 0x00000239 vs 0x00000039
memtest_data error @ 0x400123e0: 0x0000023a vs 0x0000003a
memtest_data error @ 0x400123e4: 0x0000023b vs 0x0000003b
memtest_data error @ 0x400123e8: 0x0000023c vs 0x0000003c
memtest_data error @ 0x400123ec: 0x0000023d vs 0x0000003d
memtest_data error @ 0x400123f0: 0x0000023e vs 0x0000003e
memtest_data error @ 0x400123f4: 0x0000023f vs 0x0000003f
memtest_data error @ 0x400123f8: 0x00000240 vs 0x00000040
memtest_data error @ 0x400123fc: 0x00000241 vs 0x00000041
memtest_data error @ 0x40012400: 0x00000242 vs 0x00000042
memtest_data error @ 0x40012404: 0x00000243 vs 0x00000043
memtest_data error @ 0x40012408: 0x00000244 vs 0x00000044
memtest_data error @ 0x4001240c: 0x00000245 vs 0x00000045
memtest_data error @ 0x40012410: 0x00000246 vs 0x00000046
memtest_data error @ 0x40012414: 0x00000247 vs 0x00000047
memtest_data error @ 0x40012418: 0x00000248 vs 0x00000048
memtest_data error @ 0x4001241c: 0x00000249 vs 0x00000049
memtest_data error @ 0x40012420: 0x0000024a vs 0x0000004a
memtest_data error @ 0x40012424: 0x0000024b vs 0x0000004b
memtest_data error @ 0x40012428: 0x0000024c vs 0x0000004c
memtest_data error @ 0x4001242c: 0x0000024d vs 0x0000004d
memtest_data error @ 0x40012430: 0x0000024e vs 0x0000004e
memtest_data error @ 0x40012434: 0x0000024f vs 0x0000004f
memtest_data error @ 0x40012438: 0x00000250 vs 0x00000050
memtest_data error @ 0x4001243c: 0x00000251 vs 0x00000051
memtest_data error @ 0x40012440: 0x00000252 vs 0x00000052
memtest_data error @ 0x40012444: 0x00000253 vs 0x00000053
memtest_data error @ 0x40012448: 0x00000254 vs 0x00000054
memtest_data error @ 0x4001244c: 0x00000255 vs 0x00000055
memtest_data error @ 0x40012450: 0x00000256 vs 0x00000056
memtest_data error @ 0x40012454: 0x00000257 vs 0x00000057
memtest_data error @ 0x40012458: 0x00000258 vs 0x00000058
memtest_data error @ 0x4001245c: 0x00000259 vs 0x00000059
memtest_data error @ 0x40012460: 0x0000025a vs 0x0000005a
memtest_data error @ 0x40012464: 0x0000025b vs 0x0000005b
memtest_data error @ 0x40012468: 0x0000025c vs 0x0000005c
memtest_data error @ 0x4001246c: 0x0000025d vs 0x0000005d
memtest_data error @ 0x40012470: 0x0000025e vs 0x0000005e
memtest_data error @ 0x40012474: 0x0000025f vs 0x0000005f
memtest_data error @ 0x40012478: 0x00000260 vs 0x00000060
memtest_data error @ 0x4001247c: 0x00000261 vs 0x00000061
memtest_data error @ 0x40012480: 0x00000262 vs 0x00000062
memtest_data error @ 0x40012484: 0x00000263 vs 0x00000063
memtest_data error @ 0x40012488: 0x00000264 vs 0x00000064
memtest_data error @ 0x4001248c: 0x00000265 vs 0x00000065
memtest_data error @ 0x40012490: 0x00000266 vs 0x00000066
memtest_data error @ 0x40012494: 0x00000267 vs 0x00000067
memtest_data error @ 0x40012498: 0x00000268 vs 0x00000068
memtest_data error @ 0x4001249c: 0x00000269 vs 0x00000069
memtest_data error @ 0x400124a0: 0x0000026a vs 0x0000006a
memtest_data error @ 0x400124a4: 0x0000026b vs 0x0000006b
memtest_data error @ 0x400124a8: 0x0000026c vs 0x0000006c
memtest_data error @ 0x400124ac: 0x0000026d vs 0x0000006d
memtest_data error @ 0x400124b0: 0x0000026e vs 0x0000006e
memtest_data error @ 0x400124b4: 0x0000026f vs 0x0000006f
memtest_data error @ 0x400124b8: 0x00000270 vs 0x00000070
memtest_data error @ 0x400124bc: 0x00000271 vs 0x00000071
memtest_data error @ 0x400124c0: 0x00000272 vs 0x00000072
memtest_data error @ 0x400124c4: 0x00000273 vs 0x00000073
memtest_data error @ 0x400124c8: 0x00000274 vs 0x00000074
memtest_data error @ 0x400124cc: 0x00000275 vs 0x00000075
memtest_data error @ 0x400124d0: 0x00000276 vs 0x00000076
memtest_data error @ 0x400124d4: 0x00000277 vs 0x00000077
memtest_data error @ 0x400124d8: 0x00000278 vs 0x00000078
memtest_data error @ 0x400124dc: 0x00000279 vs 0x00000079
memtest_data error @ 0x400124e0: 0x0000027a vs 0x0000007a
memtest_data error @ 0x400124e4: 0x0000027b vs 0x0000007b
memtest_data error @ 0x400124e8: 0x0000027c vs 0x0000007c
memtest_data error @ 0x400124ec: 0x0000027d vs 0x0000007d
memtest_data error @ 0x400124f0: 0x0000027e vs 0x0000007e
memtest_data error @ 0x400124f4: 0x0000027f vs 0x0000007f
memtest_data error @ 0x400124f8: 0x00000280 vs 0x00000080
memtest_data error @ 0x400124fc: 0x00000281 vs 0x00000081
memtest_data error @ 0x40012500: 0x00000282 vs 0x00000082
memtest_data error @ 0x40012504: 0x00000283 vs 0x00000083
memtest_data error @ 0x40012508: 0x00000284 vs 0x00000084
memtest_data error @ 0x4001250c: 0x00000285 vs 0x00000085
memtest_data error @ 0x40012510: 0x00000286 vs 0x00000086
memtest_data error @ 0x40012514: 0x00000287 vs 0x00000087
memtest_data error @ 0x40012518: 0x00000288 vs 0x00000088
memtest_data error @ 0x4001251c: 0x00000289 vs 0x00000089
memtest_data error @ 0x40012520: 0x0000028a vs 0x0000008a
memtest_data error @ 0x40012524: 0x0000028b vs 0x0000008b
memtest_data error @ 0x40012528: 0x0000028c vs 0x0000008c
memtest_data error @ 0x4001252c: 0x0000028d vs 0x0000008d
memtest_data error @ 0x40012530: 0x0000028e vs 0x0000008e
memtest_data error @ 0x40012534: 0x0000028f vs 0x0000008f
memtest_data error @ 0x40012538: 0x00000290 vs 0x00000090
memtest_data error @ 0x4001253c: 0x00000291 vs 0x00000091
memtest_data error @ 0x40012540: 0x00000292 vs 0x00000092
memtest_data error @ 0x40012544: 0x00000293 vs 0x00000093
memtest_data error @ 0x40012548: 0x00000294 vs 0x00000094
memtest_data error @ 0x4001254c: 0x00000295 vs 0x00000095
memtest_data error @ 0x40012550: 0x00000296 vs 0x00000096
memtest_data error @ 0x40012554: 0x00000297 vs 0x00000097
memtest_data error @ 0x40012558: 0x00000298 vs 0x00000098
memtest_data error @ 0x4001255c: 0x00000299 vs 0x00000099
memtest_data error @ 0x40012560: 0x0000029a vs 0x0000009a
memtest_data error @ 0x40012564: 0x0000029b vs 0x0000009b
memtest_data error @ 0x40012568: 0x0000029c vs 0x0000009c
memtest_data error @ 0x4001256c: 0x0000029d vs 0x0000009d
memtest_data error @ 0x40012570: 0x0000029e vs 0x0000009e
memtest_data error @ 0x40012574: 0x0000029f vs 0x0000009f
memtest_data error @ 0x40012578: 0x000002a0 vs 0x000000a0
memtest_data error @ 0x4001257c: 0x000002a1 vs 0x000000a1
memtest_data error @ 0x40012580: 0x000002a2 vs 0x000000a2
memtest_data error @ 0x40012584: 0x000002a3 vs 0x000000a3
memtest_data error @ 0x40012588: 0x000002a4 vs 0x000000a4
memtest_data error @ 0x4001258c: 0x000002a5 vs 0x000000a5
memtest_data error @ 0x40012590: 0x000002a6 vs 0x000000a6
memtest_data error @ 0x40012594: 0x000002a7 vs 0x000000a7
memtest_data error @ 0x40012598: 0x000002a8 vs 0x000000a8
memtest_data error @ 0x4001259c: 0x000002a9 vs 0x000000a9
memtest_data error @ 0x400125a0: 0x000002aa vs 0x000000aa
memtest_data error @ 0x400125a4: 0x000002ab vs 0x000000ab
memtest_data error @ 0x400125a8: 0x000002ac vs 0x000000ac
memtest_data error @ 0x400125ac: 0x000002ad vs 0x000000ad
memtest_data error @ 0x400125b0: 0x000002ae vs 0x000000ae
memtest_data error @ 0x400125b4: 0x000002af vs 0x000000af
memtest_data error @ 0x400125b8: 0x000002b0 vs 0x000000b0
memtest_data error @ 0x400125bc: 0x000002b1 vs 0x000000b1
memtest_data error @ 0x400125c0: 0x000002b2 vs 0x000000b2
memtest_data error @ 0x400125c4: 0x000002b3 vs 0x000000b3
memtest_data error @ 0x400125c8: 0x000002b4 vs 0x000000b4
memtest_data error @ 0x400125cc: 0x000002b5 vs 0x000000b5
memtest_data error @ 0x400125d0: 0x000002b6 vs 0x000000b6
memtest_data error @ 0x400125d4: 0x000002b7 vs 0x000000b7
memtest_data error @ 0x400125d8: 0x000002b8 vs 0x000000b8
memtest_data error @ 0x400125dc: 0x000002b9 vs 0x000000b9
memtest_data error @ 0x400125e0: 0x000002ba vs 0x000000ba
memtest_data error @ 0x400125e4: 0x000002bb vs 0x000000bb
memtest_data error @ 0x400125e8: 0x000002bc vs 0x000000bc
memtest_data error @ 0x400125ec: 0x000002bd vs 0x000000bd
memtest_data error @ 0x400125f0: 0x000002be vs 0x000000be
memtest_data error @ 0x400125f4: 0x000002bf vs 0x000000bf
memtest_data error @ 0x400125f8: 0x000002c0 vs 0x000000c0
memtest_data error @ 0x400125fc: 0x000002c1 vs 0x000000c1
memtest_data error @ 0x40012600: 0x000002c2 vs 0x000000c2
memtest_data error @ 0x40012604: 0x000002c3 vs 0x000000c3
memtest_data error @ 0x40012608: 0x000002c4 vs 0x000000c4
memtest_data error @ 0x4001260c: 0x000002c5 vs 0x000000c5
memtest_data error @ 0x40012610: 0x000002c6 vs 0x000000c6
memtest_data error @ 0x40012614: 0x000002c7 vs 0x000000c7
memtest_data error @ 0x40012618: 0x000002c8 vs 0x000000c8
memtest_data error @ 0x4001261c: 0x000002c9 vs 0x000000c9
memtest_data error @ 0x40012620: 0x000002ca vs 0x000000ca
memtest_data error @ 0x40012624: 0x000002cb vs 0x000000cb
memtest_data error @ 0x40012628: 0x000002cc vs 0x000000cc
memtest_data error @ 0x4001262c: 0x000002cd vs 0x000000cd
memtest_data error @ 0x40012630: 0x000002ce vs 0x000000ce
memtest_data error @ 0x40012634: 0x000002cf vs 0x000000cf
memtest_data error @ 0x40012638: 0x000002d0 vs 0x000000d0
memtest_data error @ 0x4001263c: 0x000002d1 vs 0x000000d1
memtest_data error @ 0x40012640: 0x000002d2 vs 0x000000d2
memtest_data error @ 0x40012644: 0x000002d3 vs 0x000000d3
memtest_data error @ 0x40012648: 0x000002d4 vs 0x000000d4
memtest_data error @ 0x4001264c: 0x000002d5 vs 0x000000d5
memtest_data error @ 0x40012650: 0x000002d6 vs 0x000000d6
memtest_data error @ 0x40012654: 0x000002d7 vs 0x000000d7
memtest_data error @ 0x40012658: 0x000002d8 vs 0x000000d8
memtest_data error @ 0x4001265c: 0x000002d9 vs 0x000000d9
memtest_data error @ 0x40012660: 0x000002da vs 0x000000da
memtest_data error @ 0x40012664: 0x000002db vs 0x000000db
memtest_data error @ 0x40012668: 0x000002dc vs 0x000000dc
memtest_data error @ 0x4001266c: 0x000002dd vs 0x000000dd
memtest_data error @ 0x40012670: 0x000002de vs 0x000000de
memtest_data error @ 0x40012674: 0x000002df vs 0x000000df
memtest_data error @ 0x40012678: 0x000002e0 vs 0x000000e0
memtest_data error @ 0x4001267c: 0x000002e1 vs 0x000000e1
memtest_data error @ 0x40012680: 0x000002e2 vs 0x000000e2
memtest_data error @ 0x40012684: 0x000002e3 vs 0x000000e3
memtest_data error @ 0x40012688: 0x000002e4 vs 0x000000e4
memtest_data error @ 0x4001268c: 0x000002e5 vs 0x000000e5
memtest_data error @ 0x40012690: 0x000002e6 vs 0x000000e6
memtest_data error @ 0x40012694: 0x000002e7 vs 0x000000e7
memtest_data error @ 0x40012698: 0x000002e8 vs 0x000000e8
memtest_data error @ 0x4001269c: 0x000002e9 vs 0x000000e9
memtest_data error @ 0x400126a0: 0x000002ea vs 0x000000ea
memtest_data error @ 0x400126a4: 0x000002eb vs 0x000000eb
memtest_data error @ 0x400126a8: 0x000002ec vs 0x000000ec
memtest_data error @ 0x400126ac: 0x000002ed vs 0x000000ed
memtest_data error @ 0x400126b0: 0x000002ee vs 0x000000ee
memtest_data error @ 0x400126b4: 0x000002ef vs 0x000000ef
memtest_data error @ 0x400126b8: 0x000002f0 vs 0x000000f0
memtest_data error @ 0x400126bc: 0x000002f1 vs 0x000000f1
memtest_data error @ 0x400126c0: 0x000002f2 vs 0x000000f2
memtest_data error @ 0x400126c4: 0x000002f3 vs 0x000000f3
memtest_data error @ 0x400126c8: 0x000002f4 vs 0x000000f4
memtest_data error @ 0x400126cc: 0x000002f5 vs 0x000000f5
memtest_data error @ 0x400126d0: 0x000002f6 vs 0x000000f6
memtest_data error @ 0x400126d4: 0x000002f7 vs 0x000000f7
memtest_data error @ 0x400126d8: 0x000002f8 vs 0x000000f8
memtest_data error @ 0x400126dc: 0x000002f9 vs 0x000000f9
memtest_data error @ 0x400126e0: 0x000002fa vs 0x000000fa
memtest_data error @ 0x400126e4: 0x000002fb vs 0x000000fb
memtest_data error @ 0x400126e8: 0x000002fc vs 0x000000fc
memtest_data error @ 0x400126ec: 0x000002fd vs 0x000000fd
memtest_data error @ 0x400126f0: 0x000002fe vs 0x000000fe
memtest_data error @ 0x400126f4: 0x000002ff vs 0x000000ff
memtest_data error @ 0x400126f8: 0x00000300 vs 0x00000100
memtest_data error @ 0x400126fc: 0x00000301 vs 0x00000101
memtest_data error @ 0x40012700: 0x00000302 vs 0x00000102
memtest_data error @ 0x40012704: 0x00000303 vs 0x00000103
memtest_data error @ 0x40012708: 0x00000304 vs 0x00000104
memtest_data error @ 0x4001270c: 0x00000305 vs 0x00000105
memtest_data error @ 0x40012710: 0x00000306 vs 0x00000106
memtest_data error @ 0x40012714: 0x00000307 vs 0x00000107
memtest_data error @ 0x40012718: 0x00000308 vs 0x00000108
memtest_data error @ 0x4001271c: 0x00000309 vs 0x00000109
memtest_data error @ 0x40012720: 0x0000030a vs 0x0000010a
memtest_data error @ 0x40012724: 0x0000030b vs 0x0000010b
memtest_data error @ 0x40012728: 0x0000030c vs 0x0000010c
memtest_data error @ 0x4001272c: 0x0000030d vs 0x0000010d
memtest_data error @ 0x40012730: 0x0000030e vs 0x0000010e
memtest_data error @ 0x40012734: 0x0000030f vs 0x0000010f
memtest_data error @ 0x40012738: 0x00000310 vs 0x00000110
memtest_data error @ 0x4001273c: 0x00000311 vs 0x00000111
memtest_data error @ 0x40012740: 0x00000312 vs 0x00000112
memtest_data error @ 0x40012744: 0x00000313 vs 0x00000113
memtest_data error @ 0x40012748: 0x00000314 vs 0x00000114
memtest_data error @ 0x4001274c: 0x00000315 vs 0x00000115
memtest_data error @ 0x40012750: 0x00000316 vs 0x00000116
memtest_data error @ 0x40012754: 0x00000317 vs 0x00000117
memtest_data error @ 0x40012758: 0x00000318 vs 0x00000118
memtest_data error @ 0x4001275c: 0x00000319 vs 0x00000119
memtest_data error @ 0x40012760: 0x0000031a vs 0x0000011a
memtest_data error @ 0x40012764: 0x0000031b vs 0x0000011b
memtest_data error @ 0x40012768: 0x0000031c vs 0x0000011c
memtest_data error @ 0x4001276c: 0x0000031d vs 0x0000011d
memtest_data error @ 0x40012770: 0x0000031e vs 0x0000011e
memtest_data error @ 0x40012774: 0x0000031f vs 0x0000011f
memtest_data error @ 0x40012778: 0x00000320 vs 0x00000120
memtest_data error @ 0x4001277c: 0x00000321 vs 0x00000121
memtest_data error @ 0x40012780: 0x00000322 vs 0x00000122
memtest_data error @ 0x40012784: 0x00000323 vs 0x00000123
memtest_data error @ 0x40012788: 0x00000324 vs 0x00000124
memtest_data error @ 0x4001278c: 0x00000325 vs 0x00000125
memtest_data error @ 0x40012790: 0x00000326 vs 0x00000126
memtest_data error @ 0x40012794: 0x00000327 vs 0x00000127
memtest_data error @ 0x40012798: 0x00000328 vs 0x00000128
memtest_data error @ 0x4001279c: 0x00000329 vs 0x00000129
memtest_data error @ 0x400127a0: 0x0000032a vs 0x0000012a
memtest_data error @ 0x400127a4: 0x0000032b vs 0x0000012b
memtest_data error @ 0x400127a8: 0x0000032c vs 0x0000012c
memtest_data error @ 0x400127ac: 0x0000032d vs 0x0000012d
memtest_data error @ 0x400127b0: 0x0000032e vs 0x0000012e
memtest_data error @ 0x400127b4: 0x0000032f vs 0x0000012f
memtest_data error @ 0x400127b8: 0x00000330 vs 0x00000130
memtest_data error @ 0x400127bc: 0x00000331 vs 0x00000131
memtest_data error @ 0x400127c0: 0x00000332 vs 0x00000132
memtest_data error @ 0x400127c4: 0x00000333 vs 0x00000133
memtest_data error @ 0x400127c8: 0x00000334 vs 0x00000134
memtest_data error @ 0x400127cc: 0x00000335 vs 0x00000135
memtest_data error @ 0x400127d0: 0x00000336 vs 0x00000136
memtest_data error @ 0x400127d4: 0x00000337 vs 0x00000137
memtest_data error @ 0x400127d8: 0x00000338 vs 0x00000138
memtest_data error @ 0x400127dc: 0x00000339 vs 0x00000139
memtest_data error @ 0x400127e0: 0x0000033a vs 0x0000013a
memtest_data error @ 0x400127e4: 0x0000033b vs 0x0000013b
memtest_data error @ 0x400127e8: 0x0000033c vs 0x0000013c
memtest_data error @ 0x400127ec: 0x0000033d vs 0x0000013d
memtest_data error @ 0x400127f0: 0x0000033e vs 0x0000013e
memtest_data error @ 0x400127f4: 0x0000033f vs 0x0000013f
memtest_data error @ 0x400127f8: 0x00000340 vs 0x00000140
memtest_data error @ 0x400127fc: 0x00000341 vs 0x00000141
Read: 0x40012300-0x40013300 4.0KiB
bus errors: 0/256
addr errors: 0/1024
data errors: 320/1024
Memtest KO
I've disabled use of random data (MEMTEST_DATA_RANDOM 0 in memtest.c) for these tests to make it more clear.
The read data (left of 'vs') is always offset from the true value (right) with some leading bits, but only when the read size is larger than 0x800. I wonder if that could be somehow related to the masking pins, DQM, being wired to the ECP5 but not used properly?
After trying another i5 V7.0 module with the older date code 18:13 (my other one, shown in the top post was broken), I could confirm that these modules together with the i9 modules don't show this SDRAM issue. The working i9 modules I got also feature the same M12L64322A-6B chip as my i5 modules with date code 20:07 - which doesn't work. So it seems this is not about a subtle difference between this SDRAM chip and the EM638325-6H. I also adapted the SDRAM timing parameters of LiteX to the slowest speed grade settings and also played with different sys clock speeds. Didn't affect this issue.
@wuxx: do you know anything about these two different variants of the i5 V7.0 module?
@zyp in case you've got some spare time, could you maybe check your newer i5 modules with the litex-boards BIOS/memtest? (https://github.com/wuxx/Colorlight-FPGA-Projects/issues/26#issuecomment-3140310904)
Here's from a v8.0:
__ _ __ _ __
/ / (_) /____ | |/_/
/ /__/ / __/ -_)> <
/____/_/\__/\__/_/|_|
Build your hardware, easily!
(c) Copyright 2012-2024 Enjoy-Digital
(c) Copyright 2007-2015 M-Labs
BIOS built on Aug 26 2025 19:37:24
BIOS CRC passed (27d8e719)
LiteX git sha1: --------
--=============== SoC ==================--
CPU: VexRiscv @ 60MHz
BUS: wishbone 32-bit @ 4GiB
CSR: 32-bit data
ROM: 128.0KiB
SRAM: 8.0KiB
L2: 8.0KiB
FLASH: 2.0MiB
SDRAM: 8.0MiB 32-bit @ 60MT/s (CL-2 CWL-2)
MAIN-RAM: 8.0MiB
--========== Initialization ============--
Initializing SDRAM @0x40000000...
Switching SDRAM to software control.
Switching SDRAM to hardware control.
Memtest at 0x40000000 (2.0MiB)...
Write: 0x40000000-0x40200000 2.0MiB
Read: 0x40000000-0x40200000 2.0MiB
Memtest OK
Memspeed at 0x40000000 (Sequential, 2.0MiB)...
Write speed: 22.1MiB/s
Read speed: 30.2MiB/s
Initializing gd25q16 SPI Flash @0x00200000...
First SPI Flash block erased, unable to perform freq test.
Memspeed at 0x200000 (Sequential, 4.0KiB)...
Read speed: 1.5MiB/s
Memspeed at 0x200000 (Random, 4.0KiB)...
Read speed: 869.1KiB/s
--============== Boot ==================--
Booting from serial...
Press Q or ESC to abort boot completely.
sL5DdSMmkekro
Timeout
No boot medium found
--============= Console ================--
thanks for the quick test @zyp!
I found the root of the SDRAM access issue, the second bank address pin seems to be not connected on my V7.0 boards labeled 2007.
Apparently this is similar with older V6.0 modules: https://github.com/wuxx/Colorlight-FPGA-Projects/blob/67aecc05736702cf527ddbaea8f9db080691b373/README.md?plain=1#L184
This picture of a i5 V6.0 module, from this very repo, looks quite similar to my i5 V7.0 modules with 2007 label (besides the ECP5 package size) and zyp's i5 V8.0 modules (besides different Ethernet phys), at least layout-wise. They all don't have the multiplexer chips in the lower right corner:

The second bank address pin can be ignored in LiteX by instantiating a M12L16161A() module instead of the M12L64322A().
The M12L16161A has physically only a 16-bit wide data bus and is therefore only 2MB large (divided into 2 banks). Since LiteX infers the data bus width from the number of defined DQ pins in the platform file, this still gives access to the whole 4MB of the lower two banks (=1 bank address pin) of an actual M12L64322A chip.