News:

Attention: For security reasons,please choose a user name *different* from your login name.
Also make sure to choose a secure password and change it regularly.

Main Menu

Does TE0720 Ethernet work in Vitis 2025.1?

Started by viktornikolov, October 26, 2025, 05:14:44 PM

Previous topic - Next topic

viktornikolov

Hi!

Has anybody managed to get Ethernet networking on TE0720 working in Vitis 2025.1?

My TE0720-04-62I33MA with carrier board TE0705 works like a charm with apps built in Vitis Classic 2024.2. I successfully ran Xilinx lwIP iperf TCP Client examples (standalone and RTOS).

However, when I try the same in Vitis 2025.1, the network connection is not established.
The lwIP iperf server's console output shows that Ethernet speed autonegotiation succeeded, but no connection is established.
The standalone version of the iperf server just hangs. The RTOS version says that the DHCP request timed out.

I have three different Digilent Zynq-7000 boards, and none of them worked in Vitis 2025.1 either (they do work with Vitis 2024.2).
Nevertheless, I find it hard to believe that Vitis 2025.1 is that bad.
Am I doing something wrong? ???

viktornikolov

Networking works in Vitis 2025.1 in a FreeRTOS app!

TL;DR: Vitis 2025.1 forced me to enable the lwip220_lwip_dhcp_does_acd_check option, but it doesn't work with my MikroTik switches (not even in Vitis Classic 2024.2). After I disabled this option, the FreeRTOS lwIP TCP Perf Client worked perfectly. I achieved an average transfer speed of 566 Mbits/sec.
I made the project export publicly available here.

When you use any of the lwIP examples in Vitis 2025.1, it throws an error unless you set certain lwIP parameters to the values specified in the error message.



The thing is that the default values of lwIP parameters are chosen to save memory but are not optimal for performance. Vitis 2025.1 requires you to increase several parameter values to achieve high TCP Perf Client performance.

For some reason, AMD also decided to insist on enabling the parameter lwip220_lwip_dhcp_does_acd_check, which has nothing to do with performance.
In theory, with this parameter enabled, the lwIP stack should send an ARP probe to verify that the IP address it received via DHCP is not in use by another device on the network. I don't know how it's actually implemented in the code.
However, on my MikroTik switches (I tried two different ones), it doesn't work, and the lwIP prints a misleading error message "ERROR: DHCP request timed out".
(I tried an old TP-Link router, and the dhcp_does_acd_check works OK with it.)
I don't know what's wrong with my MirkoTik switch. I can use arping normally, so an ARP probe is not prohibited.

So, I must enable the lwip220_lwip_dhcp_does_acd_check so that Vitis 2025.1 will generate an lwIP example, and then I must disable it so that the example works with my MikroTik switch. 🙂

I still have no luck with a standalone app using the RAW lwIP API in Vitis 2025.1. It simply freezes after the Ethernet speed auto negotiation, even after I disabled the dhcp_does_acd_check option.

viktornikolov

Quote from: viktornikolov on October 28, 2025, 07:23:01 PMI still have no luck with a standalone app using the RAW lwIP API in Vitis 2025.1.

I made the standalone lwIP TCP Perf Client (RAW API) work in Vitis 2025.1. 🙂 The problem was in the timer configuration.

When you try to create the lwIP TCP Perf Client example in Vitis 2025.1, it tells you that you must set the BSP parameter XILTIMER_en_interval_timer to True. But that is wrong. This parameter can remain False. Instead, you must set the value of the parameter XILTIMER_tick_timer to one of the Zynq HW timers. (I will report this as a bug to AMD.)

With the tick_timer configured, the lwIP TCP Perf Client ran without issues. I achieved an average throughput of 831 Mbits/sec.
I added the project export to my GitHub.

The issue is that the main loop of the lwIP RAW API application relies on various counters to be updated every 50 ms. That is done in a function called by a timer interrupt.
The Vitis 2025.1 version of the code uses functions XTimer_SetInterval() and XTimer_SetHandler(). The initialization of the timer driver is done automatically and relies on the setting of the XILTIMER_tick_timer BSP parameter. Unfortunately, there is no proper error checking in the XTimer_* functions. They don't tell you that you are trying to call them on an uninitialized driver.

In Vitis 2024.2, the iperf client example uses the "old school" xscutimer.h API with explicit initialization and error checking. There is no dependency on BSP parameter settings.

viktornikolov

Quote from: viktornikolov on October 28, 2025, 07:23:01 PMI don't know what's wrong with my MirkoTik switch.

There is nothing wrong with my switch. 😀

The lwIP works OK with the MikroTik switch. There is no issue with the ADC check forced by enabling the lwip220_lwip_dhcp_does_acd_check BSP option.

I was getting the "ERROR: DHCP request timed out" simply because the process of the switch offering an IP address to the Zynq board and the board doing the ACD check took more than 12 seconds. When I modified the code to extend the time limit to 16 seconds, everything worked fine.

It seems MirkoTik switches are not very fast at assigning an IP address via DHCP. The default RouterOS DHCP Server configuration includes conflict detection (the switch performs an ARP probe before assigning an IP address to a client).

Antti Lukats

Hi

thanks for posting the solution and we are glad that it worked!