测试采集数据通过UDP包传输到上位机 - 2026-05-22

1. 测试目的

本次测试用于确认从 ad_data_blob_generatorblob_fifo_udp_transmit,再到 UDP payload AXI-Stream 输出链路是否能够正确输出数据包。

重点检查内容:

  • b64_data_gen 持续输出 b64_datab64_valid 后,ad_data_blob_generator 是否能够生成 UDP payload 数据。

  • blob_fifo_udp_transmit 内部 FIFO 是否有数据读出。

  • UDP payload 的 tvalid/tready/tlast/tkeep/tdata 是否符合 AXI-Stream 传输规则。

  • 输出包长度、包头字段和采样点数量是否符合设计参数。

2. 测试参数

当前测试参数如下:

参数

说明

stream_mode

8'h01

连续采集模式

total_sample_num

32'd0

连续采集模式下无意义

sample_point_num

1024

一个 blob 包含 1024 个采样点

插入子卡

子卡 1、子卡 4

子卡群 0 到 4 中仅这两张插入

子卡 mask

32'hffffffff

两张子卡均打开 32 通道

有效通道数

64

2 * 32

单通道数据宽度

2 byte

AD_DATA_LENGTH = 2

单采样点数据量

128 byte

64 * 2

MAX_PAYLOAD_LENGTH

2016 byte

ad_data_blob_generator 参数

slice header 长度

16 byte

两个 64-bit header word

单包可用数据区

2000 byte

2016 - 16

单包采样点数

15

floor(2000 / 128)

3. 测试现象

ILA 观察到 UDP payload AXI-Stream 输出存在有效传输:

alt text

  • 第 514 周期检测到 tx_udp_payload_axis_tvalid && tx_udp_payload_axis_tready 同时为高,表示第一个有效 beat 被接收。

  • 第 755 周期检测到最后一个 tx_udp_payload_axis_tvalid && tx_udp_payload_axis_tready 周期,同时 tx_udp_payload_axis_tlast 为高。

  • 第 514、515 周期传输两个 64-bit 包头。

  • 后续周期传输采样数据。

  • tkeep 在有效传输期间为 8'hff

  • tvalid/tkeep/tdatatready 提前约 2 个时钟周期拉高,但在 tready 拉高前数据保持稳定。

AXI-Stream 的实际传输条件为:

tvalid && tready

因此 tvalid 先于 tready 拉高本身不构成错误。只要 tready=0 期间 tdata/tkeep/tlast/tuser 保持稳定,即符合 AXI-Stream backpressure 规则。

4. 包长度计算

有效传输周期为第 514 到第 755 周期,包含首尾:

beat_count = 755 - 514 + 1 = 242

每个 beat 为 64 bit,即 8 byte:

packet_payload_bytes = 242 * 8 = 1936 byte

根据设计参数计算:

channel_num = 64
bytes_per_sample_point = 64 * 2 = 128 byte
samples_per_packet = floor((2016 - 16) / 128) = 15
expected_packet_bytes = 16 + 15 * 128 = 1936 byte

测试观测包长 1936 byte 与设计计算值一致。

5. 包头解析

本次抓取到的两个 64-bit 包头如下:

header word 0 = 64'h000004002252db0c
header word 1 = 64'h000000020140000f

5.1 Header Word 0

ad_data_blob_generator 中第一个 header word 生成逻辑为:

{data_blob_sa_len, data_blob_sa_cnt}

解析结果:

字段

十六进制

十进制

说明

data_blob_sa_len

32'h00000400

1024

一个 blob 的采样点数

data_blob_sa_cnt

32'h2252db0c

-

当前累计采样计数

其中 data_blob_sa_len = 1024 与测试参数一致。

data_blob_sa_cnt 当前为累计计数值。现有代码中该计数不会在每个 blob 后归零,因此出现较大数值不代表包头错误。

5.2 Header Word 1

ad_data_blob_generator 中第二个 header word 生成逻辑为:

{24'd0, job_id, sample_coef, channel_num, m_data_slice_sa_len_reg}

解析结果:

字段

十六进制

十进制

说明

保留字段

24'h000000

0

固定填 0

job_id

8'h02

2

当前任务 ID

sample_coef

8'h01

1

降采样系数

channel_num

8'h40

64

有效通道数

m_data_slice_sa_len_reg

16'h000f

15

当前 slice 包含采样点数

该 header word 与当前测试参数一致。

6. 本包采样点数量

总有效 beat 数:

242 beat

其中前两个 beat 为 16 byte 包头:

data_beat_count = 242 - 2 = 240
data_bytes = 240 * 8 = 1920 byte

每个采样点为:

64 channel * 2 byte = 128 byte

因此当前包包含采样点数:

sample_points_in_packet = 1920 / 128 = 15

该结果与 m_data_slice_sa_len_reg = 15 一致。

对于一个完整 blob:

1024 = 68 * 15 + 4

因此理论上一个 blob 会拆分为:

  • 68 个满包,每包 15 个采样点;

  • 1 个尾包,包含 4 个采样点;

  • 总包数为 69。

本次截图对应的是一个 15 点满包。

7. 测试结论

根据本次 ILA 波形和参数计算:

  • UDP payload AXI-Stream 已经有连续有效输出。

  • 包长度为 1936 byte,与设计计算值一致。

  • 两个 64-bit 包头字段解析正确。

  • 当前包传输了 15 个采样点,与包头中的 m_data_slice_sa_len_reg = 15 一致。

  • tvalid/tkeep/tdata 先于 tready 拉高约 2 个时钟周期,该现象符合 AXI-Stream backpressure 机制,不是严重问题;实际传输仍应以 tvalid && tready 同时为高的周期为准。

综合判断:本次测试中,单个满包的 UDP payload 输出行为基本符合设计预期。


本文章使用limfx的vscode插件快速发布