Forum Discussion
Deshi_Intel
Regular Contributor
5 years agoHi,
I am sorry. Indeed a painful process for you.
There is one thing that I would like to clarify on your option 3 - regarding tx_ready signal.
- May I know are you referring to "avalon_st_tx_ready" as mentioned in user guide doc (page 101, table 40) ?
- https://www.intel.com/content/dam/www/programmable/us/en/pdfs/literature/ug/ug_32b_10g_ethernet_mac.pdf
- the tx_ready is actually a output status signal from MAC to user indicating condition of MAC. If MAC is busy then it will back pressure user data traffic by de-asserting tx_ready else if tx_ready is high, that's mean MAC is ok to accept user data.
- I believed if you want to stall user traffic, then the input control signal should be "avalon_st_tx_valid"
Thanks.
Regards,
dlim
- PVanL5 years ago
Occasional Contributor
Hi Deshil, Thanks, that is indeed the parameter I am using. However, there is something odd. I first built in altera_eth_10g_mac_base_r a nice fifo buffer between Avalon_st_adapter and the MAC (in the altera_eth_10g_mac_r_wrap ). SC_FIFO => AVALON_ST_ADAPTER => MAC was modified into: SC_FIFO => AVALON_ST_ADAPTER => FIFO => MAC Then I ran the testbench: passed! Below you will see the signal from end of packet 1, packet 2, and start of packet 3 Val = valid, sop = start of packet, eop = end of packet, mty = empty, dav = the ready signal. You see that the signal is nicely hold during dav = 0, and continues again after dav is made 1 again (by the MAC). So far, so good. val 1 sop 0 eop 0 mty 0 dav 1 E6FB626E 6E62FBE6 val 1 sop 0 eop 1 mty 2 dav 1 00008DD2 D28D0000 val 1 sop 1 eop 0 mty 0 dav 1 00000000 00000000 val 1 sop 0 eop 0 mty 0 dav 1 00000000 00000000 val 1 sop 0 eop 0 mty 0 dav 1 00000000 00000000 val 1 sop 0 eop 0 mty 0 dav 1 01003000 00300001 val 1 sop 0 eop 0 mty 0 dav 1 D138F5BA BAF538D1 val 1 sop 0 eop 0 mty 0 dav 1 D8D2FF84 84FFD2D8 val 1 sop 0 eop 0 mty 0 dav 1 8A497C15 157C498A val 1 sop 0 eop 0 mty 0 dav 1 2716DDDA DADD1627 val 1 sop 0 eop 0 mty 0 dav 1 F3B7CD8C 8CCDB7F3 val 1 sop 0 eop 0 mty 0 dav 0 3010BFC8 C8BF1030 val 1 sop 0 eop 0 mty 0 dav 0 3010BFC8 C8BF1030 val 1 sop 0 eop 0 mty 0 dav 0 3010BFC8 C8BF1030 val 1 sop 0 eop 0 mty 0 dav 0 3010BFC8 C8BF1030 val 1 sop 0 eop 0 mty 0 dav 0 3010BFC8 C8BF1030 val 1 sop 0 eop 0 mty 0 dav 1 3010BFC8 C8BF1030 val 1 sop 0 eop 0 mty 0 dav 1 1F34C835 35C8341F val 1 sop 0 eop 0 mty 0 dav 1 DF6B7265 65726BDF val 1 sop 0 eop 0 mty 0 dav 1 523E4CBC BC4C3E52 val 1 sop 0 eop 0 mty 0 dav 1 A39F4168 68419FA3 val 1 sop 0 eop 0 mty 0 dav 1 CCBCF5E2 E2F5BCCC val 1 sop 0 eop 1 mty 2 dav 1 0000C1C1 C1C10000 val 0 sop 0 eop 0 mty 0 dav 1 00000000 00000000 val 0 sop 0 eop 0 mty 0 dav 1 00000000 00000000 val 0 sop 1 eop 0 mty 0 dav 1 00000000 00000000 val 1 sop 1 eop 0 mty 0 dav 1 00000000 00000000 val 1 sop 0 eop 0 mty 0 dav 1 00000000 00000000 val 1 sop 0 eop 0 mty 0 dav 1 00000000 00000000 val 1 sop 0 eop 0 mty 0 dav 1 02003000 00300002 Then I built, without using this extra buffer, based on your suggestion, a simple statemachine, generating idles by making ‘avalon_st_tx_ready = ‘0’ back to the Avalon_st_adapter to indicate ‘hold your signal’. So, without using the extra fifo. After some iterations it worked. Simulation passed. SC_FIFO => AVALON_ST_ADAPTER => IDLE_GENERATOR => MAC (the idle generator has no fifo, it just holds tx_ready towards the Avalon st adapter, when a idle should be made, and forwards tx_ready from the MAC when not) val 1 sop 0 eop 0 mty 0 dav 1 00000000 00000000 val 1 sop 0 eop 0 mty 0 dav 1 01003000 00300001 val 1 sop 0 eop 0 mty 0 dav 1 D138F5BA BAF538D1 val 1 sop 0 eop 0 mty 0 dav 1 D8D2FF84 84FFD2D8 val 1 sop 0 eop 0 mty 0 dav 1 8A497C15 157C498A val 1 sop 0 eop 0 mty 0 dav 1 2716DDDA DADD1627 val 1 sop 0 eop 0 mty 0 dav 1 F3B7CD8C 8CCDB7F3 val 1 sop 0 eop 0 mty 0 dav 0 3010BFC8 C8BF1030 val 1 sop 0 eop 0 mty 0 dav 0 1F34C835 35C8341F val 1 sop 0 eop 0 mty 0 dav 1 DF6B7265 65726BDF val 1 sop 0 eop 0 mty 0 dav 1 DF6B7265 65726BDF val 1 sop 0 eop 0 mty 0 dav 1 DF6B7265 65726BDF val 1 sop 0 eop 0 mty 0 dav 1 523E4CBC BC4C3E52 val 1 sop 0 eop 0 mty 0 dav 1 A39F4168 68419FA3 val 1 sop 0 eop 0 mty 0 dav 1 CCBCF5E2 E2F5BCCC val 1 sop 0 eop 1 mty 2 dav 1 0000C1C1 C1C10000 val 0 sop 0 eop 0 mty 0 dav 1 00000000 00000000 val 0 sop 0 eop 0 mty 0 dav 1 00000000 00000000 val 0 sop 0 eop 0 mty 0 dav 1 00000000 00000000 val 0 sop 0 eop 0 mty 0 dav 1 00000000 00000000 val 1 sop 1 eop 0 mty 0 dav 1 00000000 00000000 val 1 sop 0 eop 0 mty 0 dav 1 00000000 00000000 val 1 sop 0 eop 0 mty 0 dav 1 00000000 00000000 val 1 sop 0 eop 0 mty 0 dav 1 02003000 00300002 val 1 sop 0 eop 0 mty 0 dav 1 3856DA8B 8BDA5638 val 1 sop 0 eop 0 mty 0 dav 1 4E1D101E 1E101D4E val 1 sop 0 eop 0 mty 0 dav 1 9544372D 2D374495 val 1 sop 0 eop 0 mty 0 dav 1 0A9CE36B 6BE39C0A val 1 sop 0 eop 0 mty 0 dav 1 D21E53C7 C7531ED2 val 1 sop 0 eop 0 mty 0 dav 0 5256C93A 3AC95652 val 1 sop 0 eop 0 mty 0 dav 0 E14279C8 C87942E1 val 1 sop 0 eop 0 mty 0 dav 1 409E1A9D 9D1A9E40 val 1 sop 0 eop 0 mty 0 dav 1 409E1A9D 9D1A9E40 val 1 sop 0 eop 0 mty 0 dav 1 409E1A9D 9D1A9E40 val 1 sop 0 eop 0 mty 0 dav 1 644ED592 92D54E64 val 1 sop 0 eop 0 mty 0 dav 1 864EF32D 2DF34E86 val 1 sop 0 eop 0 mty 0 dav 1 CAE46D7F 7F6DE4CA val 1 sop 0 eop 1 mty 2 dav 1 0000107C 7C100000 val 0 sop 0 eop 0 mty 0 dav 1 00000000 00000000 val 0 sop 0 eop 0 mty 0 dav 1 00000000 00000000 val 0 sop 0 eop 0 mty 0 dav 1 00000000 00000000 val 0 sop 0 eop 0 mty 0 dav 1 00000000 00000000 val 0 sop 0 eop 0 mty 0 dav 1 00000000 00000000 val 1 sop 1 eop 0 mty 0 dav 1 00000000 00000000 val 1 sop 0 eop 0 mty 0 dav 1 00000000 00000000 val 1 sop 0 eop 0 mty 0 dav 1 00000000 00000000 val 1 sop 0 eop 0 mty 0 dav 1 03003000 00300003 val 1 sop 0 eop 0 mty 0 dav 1 AE9F6EC5 C56E9FAE However, if you look closer, you will see that the relation between ‘dav’ (= tx_ready as generated by the MAC) is set to ‘0’, while the inputs keep coming, and after ‘dav’ turns to ‘1’, it repeats the signal two more clocks. So, the signal is delayed with 2 clocks compared to the ‘dav’ (which makes perfectly sense if you look at the logic of the ‘idle generator’: the ‘dav’ signal from the MAC needs 1 clock to propagate back to the adapter, and the signal from the adapter needs 1 clock to propagate to the MAC. Together 2 clocks (so, the idle generator makes an erroneous signal). So far so good. But how then can the test pass?????? Let us look at the signal coming from the TX side of the MAC into the PHY, did it indeed take out correctly the signals that are invalid? ( that is: 2 of the 3 DF6B7265’s?). Of course not, it took out 3010BFC8 and 1F34C835, as it should, as indicated by the ‘dav’ signal. Yet, the test passed! So, the evaluation gives a false positive! (a sort of corona test that gives a false negative, although the person tested is positive). Can you explain / elucidate? Do I have some misunderstanding somewhere? Or does someone @ intel has to do some homework? Regards, Pieter