There are no separate back-pressure signals for the user metadata interfaces. These interfaces follow the corresponding packet TREADY signals of the packet AXIS interfaces, for example:
If s_axis_tvalid and user_metadata_in_valid
are asserted for the first word of a packet, and s_axis_tready = 0,
then s_axis_tvalid and user_metadata_in_valid should
remain asserted until at least the cycle after s_axis_tready = 1, as
shown in the following timing diagram.
Similarly, if m_axis_tready = 0 during the first word of a
packet, then m_axis_valid and user_metadata_out_valid
should remain asserted until the cycle after m_axis_tready = 1, at
which time user_metadata_out_valid is deasserted if there are further
data words for the same packet.
There is an option to allow metadata to be output for dropped packets. When
this option is enabled, the dropped packet becomes a “zero-length” or “null” packet.
This is a single-beat packet with m_axis_tvalid = 1,
m_axis_tlast = 1 and m_axis_tkeep = 0. The
metadata output shall be aligned with this single-beat packet as shown in the following
timing diagram.
If this option is disabled, there are no m_axis_tvalid or
user_metadata_out_valid signals for the dropped packet.
If the keywords axis_tuser, axis_tid or
axis_tdest are used in the metadata structure, the signals are
mapped to/from the TUSER/TID/TDEST ports. In this case there are still placeholders for
these fields in the user_metadata_in structure but these are ignored by Vitis Networking P4. The values are output in both the
user_metadata_out structure and the TUSER/TID/TDEST ports. These
keywords can be used with simple bit-string definitions or with a sub-struct definition,
to further breakdown the TUSER/TID/TDEST into multiple sub-fields. This is demonstrated
in the following example:
struct tuser_format {
bit<8> field_a;
bit<16> field_b;
bit<16> field_c;
}
// User metadata structure
struct metadata {
bit<9> dummy3;
bit<29> axis_tid;
bit<7> dummy2;
bit<13> axis_tdest;
bit<5> dummy1;
tuser_format axis_tuser; // still using the same “axis_tuser” keyword here, but the type is a struct instead of a bit<> format
bit<1> dummy0;
}