自定义 AXI4‑Stream 接口 - 2023.2 简体中文

Vitis 高层次综合用户指南 (UG1399)

Document ID
UG1399
Release Date
2023-12-18
Version
2023.2 简体中文

不含旁路的 AXI4‑Stream 实例(例如,hls::stream<ap_axiu<32, 0, 0, 0>>)会导致在接口上出现以下 RTL 信号:

  • TVALID
  • TREADY
  • TDATA[ ]
  • TLAST[ ]
  • TKEEP[ ]
  • TSTRB[ ]

在您的设计中可能并不需要或者并不希望出现其中部分信号(TLASTTKEEPTSTRB)。此外,在某些用例中,不需要 TDATA,因为建模者会使用 TUSER 来移动数据。为支持这些额外用例,hls::axis<T> 定义支持以下选项:

template <typename T,
          std::size_t WUser = 0,
          std::size_t WId = 0,
          std::size_t WDest = 0,
          uint8_t EnableSignals = (AXIS_ENABLE_KEEP |
                                   AXIS_ENABLE_LAST |
                                   AXIS_ENABLE_STRB),
          bool StrictEnablement = false>
struct axis {
  // members
  T data;
  ap_uint<bytesof<T>> strb;
  ap_uint<bytesof<T>> keep;
  ap_uint<WUser>      user;
  ap_uint<WId>        id;
  ap_uint<WDest>      dest;
  ap_uint<1>          last;
  
  // get_* methods
  …
  // set_* methods
  …
};

EnableSignals 字段和 StrictEnablement 字段允许您使用特殊宏规范来指定以下三个信号中的哪个信号应出现在您的设计中:TKEEPTLASTTSTRB。完整的宏列表如下所示:

// Enablement for axis signals
#define AXIS_ENABLE_DATA 0b00000001
#define AXIS_ENABLE_DEST 0b00000010
#define AXIS_ENABLE_ID   0b00000100
#define AXIS_ENABLE_KEEP 0b00001000
#define AXIS_ENABLE_LAST 0b00010000
#define AXIS_ENABLE_STRB 0b00100000
#define AXIS_ENABLE_USER 0b01000000
  
// Disablement mask for DATA axis signals
#define AXIS_DISABLE_DATA (0b11111111 ^ AXIS_ENABLE_DATA) & \
                          (0b11111111 ^ AXIS_ENABLE_KEEP) & \
                          (0b11111111 ^ AXIS_ENABLE_STRB)
  
// Enablement/disablement of all axis signals
#define AXIS_ENABLE_ALL  0b01111111
#define AXIS_DISABLE_ALL 0b00000000
提示: 这些宏还支持某些错误检查,以识别规范不完整的情况。

除了允许您启用或禁用特定旁路信号外,这组宏已扩展至允许指定信号的 allnone 规范。这样即可允许定义特殊的 hls::axis_data<>hls::axis_user<> 帮助程序类,以便于准确选取信号规范。这些特殊帮助程序类的定义如下所示:

// Struct: axis_data (alternative to axis)
//   DATA signal always enabled
//   All other signals are optional, disabled by default
template <typename TData,
          uint8_t EnableSignals = AXIS_ENABLE_DATA,
          std::size_t WUser = 0,
          std::size_t WId = 0,
          std::size_t WDest = 0,
          bool StrictEnablement = true>
using axis_data = axis<TData, WUser, WId, WDest,
                       (EnableSignals | AXIS_ENABLE_DATA),
                       StrictEnablement>;
// Struct: axis_user (alternative to axis)
//   USER signal always enabled
//   DATA signal always disabled
//   All other signals are optional, disabled by default
template <std::size_t WUser,
          uint8_t EnableSignals = AXIS_ENABLE_USER,
          std::size_t WId = 0,
          std::size_t WDest = 0,
          bool StrictEnablement = true>
using axis_user = axis<void, WUser, WId, WDest,
                       (EnableSignals & AXIS_DISABLE_DATA),
                       StrictEnablement>;

以下用例展示了各种选项,以支持您自定义与 AXI4‑Stream 接口关联的信号:

// Allow user to control existence of TKEEP, TSTRB and TLAST by template parameter `EnableSideChannels`
 
// Enable only TKEEP
using data_t = hls::axis<int, 0, 0, 0, AXIS_ENABLE_KEEP>; Or using data_t = hls::axis_data<int, AXIS_ENABLE_KEEP>
  
// Enable two channels TKEEP and TLAST
using data_t = hls::axis_data<int, AXIS_ENABLE_KEEP|AXIS_ENABLE_LAST>;
  
// Disable all side-channels
using data_t = hls::axis_data<int, AXIS_DISABLE_ALL>;
  
// Enable all side-channels
using data_t = hls::axis_data<int, AXIS_ENABLE_ALL, 4, 2, 3>;
 
// Error case: All signals enabled but zero size specified for WUser/WId/WDest
using data_t = hls::axis_data<int, AXIS_ENABLE_ALL>;
 
// Allow user to control existence of TDATA by specifying template parameter `T` with `void` type
// and only use TUSER channel
using data_t = hls::axis<void, 5, 0, 0, AXIS_DISABLE_ALL>; Or using data_t = hls::axis_user<5>
 
// Use default enabling of TDATA, TKEEP, TSTRB and TLAST
using data_t = hls::axis<int>;