ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

《PCIe 四架构实测(零):为什么要做这个实验——硬件平台、数据帧格式与测量口径》

《PCIe 四架构实测(零):为什么要做这个实验——硬件平台、数据帧格式与测量口径》 PCIe 四架构实测零为什么要做这个实验——硬件平台、数据帧格式与测量口径系列《PCIe 四架构实测》第 0 篇 · 开篇平台XC7K325TFFG900-2I · Vivado 2023.1 · XDMA · PCIe Gen2 ×8 · Windows 上位机Python ctypes读法这一篇不含任何架构二的实现细节——它只干一件事把后面四篇要用的规矩立好平台、时钟、帧格式、指标定义。后面每一篇都会回头引用它。看到表格别跳过。文章目录PCIe 四架构实测零为什么要做这个实验——硬件平台、数据帧格式与测量口径[toc]0 这一篇要交给你什么1 为什么要做这个实验1.1 场景数据要从 FPGA 跑到主机1.2 最容易犯的错拿链路速度当系统速度1.3 四个问题 架构二的答案先剧透2 四种架构是什么2.1 为什么先做 ②3 硬件平台基线3.1 这块板3.2 基线数字后面每篇都要引用3.3 主机软件栈全景3.4 XDMA 平台级配置四架构共用4 时钟规划为什么 user_clk 必须是 250 MHz4.1 时钟从哪来、到哪去4.2 250 MHz 是被逼出来的不是挑出来的5 理论天花板这张算式是全系列的分母5.1 逐层剥5.2 再往上还有两刀6 统一假数据帧格式6.1 为什么必须有帧6.2 帧长什么样6.3 FLAGS 里的 arch / chan / data_mode6.4 校验字这里有个真实的工程取舍6.5 一条必须记住的规律实体帧长 N 367 四项指标的严格定义7.1 吞吐Throughput7.2 带宽利用率Utilization7.3 延迟Latency——这里有两个完全不同的数务必分清7.4 稳定性Stability7.5 ★ 每一项指标怎么测的全系列总表8 主机软件栈驱动 为什么 Python 就够8.1 驱动从哪来8.2 为什么 Python ctypes 就够了9 Windows 环境隔离清单10 系列导航附本篇用到的图与复现方式下一篇0 这一篇要交给你什么读完你应当能做到对应小节说清四种 DMA 架构各自是什么、代价是什么、什么时候该用哪个§2报出这个平台的基线与理论天花板并知道数字是怎么算出来的§3、§5说清user_clk为什么必须是 250 MHz而不是随便挑的§4画出本项目统一的假数据帧格式并解释每个字段为什么存在§6说清吞吐 / 利用率 / 延迟 / 稳定性这四个词的严格口径§7复现出实验环境驱动怎么装、Windows 要关哪些东西§8、§9知道后面四篇各讲什么、先读哪篇§10一句话概括这一篇“先把尺子做出来再去量东西。”1 为什么要做这个实验1.1 场景数据要从 FPGA 跑到主机做数据采集卡的人都会撞上同一堵墙板子上采到的数据怎么最省事、最快地送进主机内存FPGA 里数据是流一个拍一个拍地出主机里数据是内存一个地址一个地址地放。这两边天生不一样中间必须有个搬运工。这个搬运工就是 DMA在 Xilinx 的生态里用得最多的搬运工叫XDMADMA Subsystem for PCI Express。于是问题变成这块搬运工的活有几种干法每种干法在吞吐、延迟、资源上各是什么代价1.2 最容易犯的错拿链路速度当系统速度新手包括我第一反应是翻数据手册PCIe Gen2 ×8 ⇒ 5.0 GT/s × 8 lane ⇒ 4 000 MB/s。然后得出结论“我这板子能跑 4 GB/s。”这句话是错的——它只是链路的能力不是系统的能力。真实的数据要经过这么多手传感器/ADC → FPGA 内部逻辑 → DMA 引擎 → PCIe 链路 → 主机根复合体 → 驱动 → 操作系统 → 你的程序 ① ② ③ ④ ⑤ ⑥ ⑦第 ③ 步链路确实是 4 GB/s 级的但第 ⑥⑦ 步驱动 操作系统 你自己的程序很可能比它慢一个数量级。这个实验的全部意义就是把这七段路拆开量出每一段到底吃掉多少。结论会让你吃惊在这块板子上第 ③ 步大家最关心的 PCIe 链路根本不是瓶颈。1.3 四个问题 架构二的答案先剧透问题量什么架构二实测折算成线速① 板上能跑多快FPGA 侧产数速率3 942.7 MB/s98.6%② 主机实收多少主机 read 到的有效载荷≈ 133 MB/s3.3%③ 延迟多大FPGA 内部回环 / 端到端往返8 ns/54.0 µsP504 KB 请求—④ 长时间稳不稳30 分钟分段长跑9 171 万帧91 708 725零错 / 零丢 / 零超时—① 和 ② 差了约 30 倍。这两个数都是真的、都测对了——它们量的不是同一样东西。差 30 倍从头到尾就是这个系列要讲的事篇 2 讲 ②篇 3 讲 ③篇 4 讲 ④ 和为什么②这么低还不怪链路。2 四种架构是什么架构在这里不是指硬件电路而是指数据在 FPGA 内部走哪条路。四种典型做法一句话总结每种架构一句话主打代价① DDR 大缓存先把数据攒进 DDR32 GB攒成大块再整块搬走能吸收突发、能重传、容量大多两趟 DDR 读写时序收敛最难MIG 是硬骨头② Streaming 直通数据不在 FPGA 里停一拍 16 B 直接过FPGA 侧延迟最低、零拷贝、逻辑最少无弹性缓冲、不能重传——丢了就是丢了只能靠帧头发现③ BRAM 轻缓存用片上 BRAM256 KB当小缓冲延迟比 DDR 低能吸收小抖动容量小吞吐仍被 C2H 卡住收益有限④ 多通道直通 2 条 C2H / 2 条 H2C 并行唯一能顶开单通道天花板的做法逻辑面积 ×N主机侧要分核/多进程2.1 为什么先做 ②它是基线。②是四种里逻辑最简单、延迟最低的一种它测出来的数字 ≈ “这块板 XDMA 的物理上限”。后面三种拿它做对照才有意义。它的结论最反直觉——“板上 98.6% 线速主机只有 3.3%”这句话足以撑起一整篇文章。换架构时唯一变量干净。四种架构共用同一套帧格式、同一套寄存器、同一套上位机换架构只换中间那段数据通路。这是数据可比的前提见上面那张图的底注。⚠️一个必须提前说的坑架构四我说的是2 条通道不是我原计划的 4 条。原因是本器件的XDMA IP 通道数上限就是 2见 §3.4。这不是取舍是硬约束。3 硬件平台基线3.1 这块板注意实物图左侧那排金手指旁边板上丝印就印着PCIe 2.0 X8——这不是我挑的配置是这块板子线路只有 8 个 lane、且只跑到 Gen2。3.2 基线数字后面每篇都要引用项值说明FPGAXC7K325TFFG900-2IKintex-7-2 速度等级325K 逻辑单元板载内存DDR3 2 GB / 64 bit / 1600 MT/s理论1600 MT/s × 8 B 12.8 GB/s只有架构一用PCIeGen2 ×85.0 GT/s × 8 lane板卡线路上限参考时钟100 MHz 差分板载晶振给 PCIe 硬核用用户时钟user_clk 250 MHz见 §4AXI 数据位宽128 bit 一拍 16 字节全设计统一一拍 16 B开发工具Vivado 2023.1全程统一四套工程同版本DMA IPXDMADMA/Bridge Subsystem for PCI ExpressAXI-Stream 接口模式主机Windows Python 3 ctypes不写一行 C见 §83.3 主机软件栈全景这张图请记住一个结构一个设计里其实只有两条通路——一条控制路主机读写寄存器慢但对走 AXI-Lite一条数据路高速流走 AXI-Stream / DMA。后面所有问题几乎都能归到这两条路里谁在挡道。3.4 XDMA 平台级配置四架构共用配置页项值为什么Basic模式AXI-Stream架构二/四AXI-MM架构一/三这是架构这个变量本身BasicDevice / Vendor ID7028/10EE主机按这个认设备Basic链路速度 / 宽度5.0 GT/s / ×8板卡线路只有 Gen2 ×8Basic参考时钟100 MHz板载差分晶振BasicAXI 数据位宽128 bit250 MHz × 128 bit 4 GB/s 线速Basic通道数C2H / H2C1 / 1架构四改成 2 / 2⚠️ 本器件上限就是 2BasicRIDsC2H 32 / H2C 16允许同时挂起多少条读请求PCIeAXI-Lite Master开启窗口 1 MB控制流的唯一入口PCIeBARBAR0 AXI-Lite寄存器窗口MSI-X中断开启1 vector主机靠它知道数据到了缓存HAS_CACHE0AXI-Stream 模式不涉及“通道数上限 2” 的依据官方 PG195 原文“最多 4 条主机到卡H2C/读取数据通道针对 7 系列 Gen2 IP 最多 2 条数据通道。最多 4 条卡到主机C2H/写入数据通道针对 7 系列 Gen2 IP 最多 2 条数据通道。”XC7K325T 走的就是7 系列 Gen2 IP⇒2 条是天花板想要 4 条得换 UltraScale 器件。别的教程里写XDMA 支持 4 通道是对的但那说的是 UltraScale。看手册一定要看针对哪个器件那一句。顺带一个有用的事实AXI 数据位宽在 7 系 Gen2 IP 上只有 64 bit 和 128 bit 两档也是 PG195 写的。这个限制直接决定了 §4 的时钟选择。4 时钟规划为什么user_clk必须是 250 MHz时钟是这类工程里最容易抄错了还不知道的地方。这里把来龙去脉讲清楚。4.1 时钟从哪来、到哪去板载 100 MHz 差分晶振 └─ util_ds_buf差分转单端 └─ xdma_0 / refclk PCIe 硬核的参考时钟 └─ [PCIe 硬核内部 PLL 时钟域切换XDMA 自己搞定] └─ xdma_0 / axi_aclk user_clk 250 MHz └─ 扇出到全部用户逻辑data_gen / data_verify / stream_mux / ts_counter / 寄存器块关键点用户逻辑里没有第二个时钟。全设计只有一个用户时钟域PCIe 时钟域到用户时钟域的跨越由 XDMA 内部完成。所以用户逻辑内部不需要写任何异步 FIFO不存在 CDC 问题——这是这个工程时序能收敛的前提篇 1 / 篇 3 的时序部分都建立在这条上。这也是为什么用 IP 而不是自己写 PCIe 逻辑的最大好处之一跨时钟域这个最容易翻车的地方IP 厂商替你做了而且是验证过的。4.2 250 MHz 是被逼出来的不是挑出来的想让用户时钟不成为瓶颈只有一条路让它的数据搬运能力 ≥ 链路能力。链路能力 4 000 MB/s 用户时钟需满足 : 频率 × 位宽 ÷ 8 ≥ 4 000 MB/s代入可选位宽7 系 Gen2 IP 只有 64 / 128 bit 两档AXI 位宽需要的频率7 系能做到吗64 bit4000 ÷ 8 500 MHz❌ 用户逻辑跑 500 MHz 在 -2 器件上是自找麻烦128 bit4000 ÷ 16 250 MHz✅ 常规做法时序有余量256 bit125 MHz❌ 7 系 Gen2 IP 不支持 256 bit 数据路径所以128 bit × 250 MHz 4 GB/s 线速——用户时钟恰好不成为瓶颈也没有浪费。这就是 250 这个数的全部理由。 换个说法如果哪天有人告诉你用户时钟随便给 200 MHz 也行你要能立刻算出来——200 MHz × 128 bit 3.2 GB/s用户时钟已经自己把带宽砍掉了 20%你测出来的所有吞吐数字都会被这个错误的天花板压住而且看起来像是 PCIe 不行。5 理论天花板这张算式是全系列的分母5.1 逐层剥5.0 GT/s × 8 lane 40 GT/s ← 链路物理速率GT/s是每秒传输次数不是每秒比特 40 × 8/10 32 Gb/s ← Gen1/Gen2 用 8b/10b 编码每 10 bit 只有 8 bit 是数据 32 Gb/s ÷ 8 4 GB/s ← 换成字节 4 000 MB/s ← ★ 全系列所有百分比的分母三个容易记错的点GT/s不是Gb/s。5.0 GT/s 是每秒 50 亿次传输经过 8b/10b 之后实际数据率是它的 0.8 倍。忘了这个 0.8你的天花板会凭空高 25%。8b/10b是 Gen1/Gen2 的编码。Gen3 换成 128b/130b开销从 20% 降到 1.5%——所以 Gen3 的到账率看起来高得多。本板是 Gen2老老实实乘 0.8。÷ 8是把比特换成字节。这是最常见的一处笔误把32 Gb/s直接当成32 GB/s结果算出 4 倍的天花板。5.2 再往上还有两刀链路不是纯数据管道上面还跑着协议层开销来源剩下的比例TLP 层每个 TLP事务层包有包头、还有流控信用维护约88% ~ 92%读偏低、写偏高软件层驱动 操作系统 你的程序这一层没有理论值得实测⇒链路真正能交给软件的是 3.5 GB/s 量级。而架构二实测主机侧只有133 MB/s。所以本文反复说的那句话瓶颈不在链路。篇 2 会把 133 MB/s 这个数的成因拆到底。这张算式是后面所有百分比的标尺说98.6% 线速就是3942.7 ÷ 4000说只用 3.3%就是133 ÷ 4000。分母永远是这个 4 000 MB/s。6 统一假数据帧格式6.1 为什么必须有帧直通架构没有存储、不能重传。那怎么知道数据对不对、有没有丢唯一的办法让数据自己带身份证。这就是帧的由来——每帧前面带一个头说明我是谁、第几号、什么时候生的尾巴上带一个校验字说我整帧是完整的。主机或 FPGA 里的解析器只要逐帧对齐就能算出丢帧率、错误率。没有帧头就什么都判不了只能看到一堆字节。6.2 帧长什么样-------- 32 B 帧头 -------------------- N 字节载荷 --------------- 4 B --- | MAGIC SEQ TS_TX FLAGS ... | 计数器第 k 个字 k | 校验字 | --------------------------------------------------------------------------- 实体帧长 N 36 字节偏移字段宽度含义0x00MAGIC4 B0xA5C30000 | arch8 | ver架构二 0xA5C30200。扫流时看第一个字就知道是不是我们的帧0x04SEQ4 B帧序号每通道独立递增首帧 00x08TS_TX6 B组帧时刻的 48 bit 时间戳250 MHz 秒表回绕周期 13 天0x0EFLAGS2 B[15:12] arch / [11:8] chan / [7:4] data_mode / [3:0] rsv00x10LENGTH4 B载荷字节数N注意不是帧总长0x14SEED4 BPRBS 种子可复现随机数据用0x18RSV8 B常规帧全 0回应帧的[47:0]放到达时刻TS_RX0x20PAYLOADN B计数器载荷第 k 个 32 bit 字 k“位置即期望值”验证器不用查表就能对拍末尾校验字4 B见 §6.4为什么帧头是 32 B 而不是更短32 B 128 bit × 2 整拍AXI 位宽是 128 bit。这样帧头永远占满整数拍、不产生尾拍也不用处理帧头被切成两半的麻烦。同时 4 字节对齐满足所有 DMA 的对齐要求。6.3FLAGS里的arch/chan/data_mode位域名称取值谁写 / 谁读[15:12]arch1DDR / 2Streaming / 3BRAM / 4多通道data_gen按当前位流写死解析器核对[11:8]chan架构一~三恒 0架构四 0 或 1按通道实例化时写死多通道时用来分桶统计[7:4]data_mode0计数器 / 13PRBS / 4WALK1 / 56全0/全F / 7随机 /8回应帧解析器按此模式重算期望值再比对[3:0]rsv恒 0解析器检查非 0 即报格式错——多一层帧头没被撕坏的判定为什么这些信息要写进帧里而不是只放在寄存器因为配置会变、数据会滞留。中途从计数器模式换成 PRBSDDR 里还存着旧模式的帧数据落地成文件后板卡可能都下电了。帧内字段是唯一跟着数据走的元数据。这叫自描述。另外注意MAGIC的[11:8]也编了arch——同一信息编了两遍是有意的单 bit 翻转想同时骗过两处概率远小于骗过一处。6.4 校验字这里有个真实的工程取舍先把结论说清楚本项目的校验字是 32 位加法校验和把帧头 8 个字 全部载荷字按小端 32 bit 累加模 2³²不是标准 CRC32。字段名沿用了文档里的CRC32寄存器也叫CRC_ERR但实现是加法校验和——RTL 里对此有明确注释。为什么要换掉 CRC32答案是时序收敛。标准 CRC32 是一个串行 LFSR每个字节都要经过几级异或而且下一拍要用上一拍的结果——这是一条又长又无法并行化的组合路径在 250 MHz4 ns下是典型的关键路径来源。而加法校验和可以做成闭式载荷是第 k 个字 k的计数器 ⇒ 载荷字之和 0 1 2 ... (nw-1) nw(nw-1)/2 ← 一次乘法就能算出来 ⇒ 校验字 Σ(帧头 8 字) nw(nw-1)/2 ← 只剩一级 32 bit 加法约 0.5 ns于是这条路径从几十级串行异或变成一次乘加时序立刻轻松。⚠️代价必须说清加法校验和的检错能力弱于 CRC32比如它抓不住两个字整体调换位置这类错误。本项目接受这个代价是因为① 载荷有独立的逐 lane 位置比对第 k 字必须等于 k这才是主力检查② 校验字只当帧头 载荷整体没被撕坏的兜底③ 换来的时序余量对 250 MHz 下的直通设计是刚需。这是一次典型的用检错强度换时序余量的取舍——不是偷懒是算过账的。6.5 一条必须记住的规律实体帧长 N 36名词含义payload_len N只算载荷计数器那部分实体帧长 N 36帧头 32 B 载荷 N 校验字 4 B ——真正在总线上跑的长度算吞吐、选块长、算拍数都必须用实体帧长。把这两者搞混是本项目里真实踩过的坑篇 2 详细讲。篇 2 的伏笔实体帧长必须是16 字节的整数倍因为一拍是 16 B。这条约束会让特定的帧长刚好整除另一些最后剩 4 个字节——而后者实测能让吞吐掉 20%。看到N 36这个式子就该想到它。7 四项指标的严格定义吞吐多少这句话在没有口径的情况下毫无意义。下面四个词在本系列里各只有一个意思请以此为准。7.1 吞吐Throughput只算有效载荷字节数 ÷ 耗时MB/s。帧头、校验字一律不算。所以同一份数据流按实体帧算和按有效载荷算能差几个百分点——本系列统一用有效载荷。7.2 带宽利用率Utilization吞吐 ÷ 4 000 MB/s。分母就是 §5 那张算式的结论全系列唯一。7.3 延迟Latency——这里有两个完全不同的数务必分清名字量的是什么架构二实测FPGA 内部回环延迟FPGA收完最后一拍到发出第一拍之间隔了多少拍2 拍 8 nsILA 逐拍量的端到端往返 RTT主机发出请求到收完响应54.0 µsP504 KB 请求差了约 7500 倍而且两个数都是对的——它们量的是完全不同的两段路。篇 3 整篇都在讲这件事以及为什么用帧内两个时间戳相减得到的不是回环延迟。延迟一律报P50 P99中位数 尾延迟。只报平均值的延迟数据基本没有信息量 —— 平均值会掩盖掉偶尔卡一下这种最要命的现象。7.4 稳定性Stability分段长跑每段读一次寄存器增量看四条判据。四条判据来自本项目上位机的tc03ΔCRC_ERR ΔSEQ_ERR 0没有错帧末段吞吐 ≥ 最快段 × 98%没有明显衰减全程无读超时FPGA 的FRAMES_OK增量等于主机实际发帧数两侧对齐⚠️ 长跑必须先钉核把线程绑定到指定的 CPU 核。不钉核的话你测的其实是Windows 调度器不是你的板子——篇 4 会给出实锤证据。7.5 ★ 每一项指标怎么测的全系列总表这是本系列最实用的一张表——任何数字都能在这里找到它的来源。指标怎么测工具 / 命令关键注意点FPGA 侧产数速率理论 4000 ÷ rate_div实测 帧计数增量 × 帧长 ÷ 时间窗读0x3C TX_COUNT算实体帧长别只算载荷主机实收吞吐收到的有效载荷字节数÷ 耗时QueryPerformanceCountertc01/scan组帧与拷贝必须移出计时窗否则测的是 Python 不是 PCIe带宽利用率吞吐 ÷ 4 000 MB/s计算分母唯一FPGA 逻辑延迟① 响应帧内两个时间戳相减② ILA 逐拍数tc04 ILA两种口径差 7500 倍必须注明是哪种真回环延迟ILA 量s_axis_tlast握手沿 →m_axis_tvalid上升沿ILA触发echo_req实测2 拍 8 ns端到端 RTT主机QPC发请求前打 t0收完响应打 t1报 P50P99tc04 --mode wait一问一答拷贝在窗外错误率 / 丢帧率读FRAMES_OK/CRC_ERR/SEQ_ERR/TX_COUNTregs丢帧率 1 − (OKCRCSEQ)/TX_COUNT只在 GEN 模式下有意义稳定性分段长跑每段读寄存器增量四条判据自动判定tc03必须先钉核CPU 频率对照量CallNtPowerInformation读每个逻辑核当前 MHz纯 ctypestc03内置全核平均值没有诊断力必须看线程所在的那个核线程落核GetCurrentProcessorNumber定时采样tc03内置是模态值最常驻的核不是逐帧真值8 主机软件栈驱动 为什么 Python 就够8.1 驱动从哪来项内容来源Xilinx 官方仓库dma_ip_drivers内含 Windows 驱动源码 示例程序编译用WDK编仓库里有现成的工程文件装之前管理员 cmdbcdedit /set testsigning on→重启驱动没有正式签名必须开测试签名模式装完认设备设备管理器里出现4 个节点xdma0_h2c_0/xdma0_c2h_0/xdma0_user/xdma0_control寄存器读写用仓库自带的xdma_rw.exe或自己用DeviceIoControl写⚠️设备 ID 必须对上本设计是10EE:7028。如果INF里写的是别的 ID驱动装上也是部分节点出现。看到一个叫DEV_7018的设备那是残留的旧设备记录不是你的板子——上位机只认DEV_7028。8.2 为什么 Python ctypes 就够了这是很多人的疑问“性能测试不用 C 能行吗”能而且在这个场景下 C 帮不了你。理由瓶颈不在语言在系统调用。架构二实测主机侧只有 133 MB/s——慢在驱动 操作系统 内核往返这一段不在你的循环里。用 C 写同样的逻辑还是走同一套ReadFile一分钱省不出来。数据直接从设备读到 Python 的可写缓冲区。ctypes让 Python 能拿到一块原生内存ReadFile直接往里写零中间拷贝。这一步用 C 也是这样。解析热点可以用 numpy。本项目里memoryviewnumpy视图把解析开销压到可忽略实测比最初实现快了几十倍解析根本不是瓶颈。唯一必须遵守的纪律计时窗里只准有设备 I/O。组帧、算校验、打印、拷贝数据——全部移到窗外。否则你测到的是 Python 的解释器速度而它会伪装成PCIe 很慢。这条纪律在篇 4 会被反复引用。9 Windows 环境隔离清单Windows 会主动干扰你的测量。开测前逐项确认本系列全部测试都在这个状态下跑的项设置为什么PCIe ASPM关闭电源选项 → 高级 → PCI Express → 链接状态电源管理 → 关闭省电模式会拉高延迟、拉低吞吐而且是动态的让结果不可复现驱动签名bcdedit /set testsigning on重启生效不装驱动就没得测Defender 实时扫描关闭或对测试目录豁免它会插在文件 I/O 路径上线程绑核测试程序用SetThreadAffinityMask钉核不钉核 测 Windows 调度器固定 PCIe 插槽前后用同一个槽换槽 换根复合体路径数据不可比后台程序关浏览器 / 关同步盘 / 关更新它们抢 CPU 和内存带宽预热每次测前先跑几十帧预热第一次访问总有冷启动开销重要预告上面这张清单在第四篇会被证明远远不够。我们实测发现同一句命令连跑两次快慢方向居然相反最后定位到的原因是CPU 频率本机 14 个核里 8 个跑 3600 MHz、6 个跑 4200 MHz而有意思的是——你把电源计划切成高性能 处理器最小状态 100%反而会把快的那一档彻底消灭。那一篇就是整张清单的血泪补充版。10 系列导航#标题讲什么依赖0本篇为什么做这个实验——平台、帧格式、口径立规矩—1《PCIe AXI-Stream 架构一从零搭一个 XDMA 直通工程——逐模块讲清数据流与控制流》9 个 BD 组件、5 个自写模块、三条通路、寄存器表、bring-up 六步、4 个真坑本篇2《PCIe AXI-Stream 架构二XDMA 吞吐只有 133 MB/s一次完整的瓶颈定位》板上 98.6% 线速 vs 主机 3.3%帧长对齐规则为什么换 RTL 救不了本篇 §5 §73《PCIe AXI-Stream 架构三直通延迟到底是 8 ns 还是 60 µs》8 ns 与 54 µs 的关系ILA 逐拍证据RTT 由什么组成本篇 §7.34《PCIe AXI-Stream 架构四你测到的可能不是 PCIe是 Windows——主机侧测量的四个陷阱》同命令两跑结果相反的原因两档位因果归因长跑稳定性本篇 §9建议读法只想学怎么搭 XDMA 直通工程→ 直接读篇 1它自洽。只关心性能为什么上不去→ 读篇 2 篇 4一个讲是什么一个讲别把测量假象当结论。想学怎么量硬件延迟→ 读篇 3。附本篇用到的图与复现方式文件内容fig/csdn_p0_arch.png四种架构对比数据路径 / 代价 / 适用场景fig/csdn_p0_system.png平台基线主机软件栈 · PCIe 链路 · FPGA 用户逻辑fig/csdn_p0_budget.png理论天花板算式4000 MB/s 怎么来的、被什么吃掉fig/csdn_p1_frame_format.png统一假数据帧格式字节偏移 拍内字段序fig/实物图.jpg板卡实物金手指丝印PCIe 2.0 X8所有结构图都由脚本生成tools/make_csdn_figures.pymatplotlib改参数可重出——读者可照着复现不必相信我截的图。下一篇规矩立完了。篇 1开始干活从空目录搭一个能跑通的 XDMA AXI-Stream 直通工程——9 个 BD 组件一个都不留白三条数据通路逐拍讲清控制信号谁接谁、谁故意不接谁全部列出来最后附上我真实踩过的 4 个坑。
返回列表