• 正文
  • 相关推荐
申请入驻 产业图谱

反射内存卡FPGA固件设计关键技术剖析

10/15 13:23
57
加入交流群
扫码加入
获取工程师必备礼包
参与热点资讯讨论

1 引言:反射内存与FPGA固件的设计边界

反射内存(Reflective Memory,RFM)是一种面向硬实时系统的共享内存网络,典型代表为GE Intelligent Platforms(原VMIC)的RFM2G系列与VMIC-5565产品。它的核心思想并不复杂:环上每个节点卡都维护一块与全网统一编址的局部SRAM,任何一个节点向自己内存的某个地址写入数据时,卡上固件会自动把这次写入封装成一帧广播到环形总线上;环上其余各节点收到该帧后,把同样的数据写入本地RAM的同一地址,从而在微秒级内实现多节点之间内存映像的强一致。

与以太网靠协议栈和操作系统协议栈逐层处理不同,反射内存的协议处理几乎全部在一片FPGA内硬件完成:光收发、8b/10b编解码、CRC校验、地址译码、环网转发、本地存储器写入、主机总线接口与中断控制都跑在RTL里,主机CPU看到的只是一段被驱动映射出来的物理地址空间。这意味着FPGA固件的RTL质量直接决定了整网的时延、抖动、误码恢复能力与可维护性。本文站在RTL设计角度,逐层剖析这类固件的关键技术模块,文中架构参考公开的RFM2G/VMIC-5565类产品描述,工作时钟与帧格式参数取其公开标称值。

2 整体FPGA架构划分

从RTL角度看,单片FPGA可划分为七个相对独立的功能模块。

需要特别强调的是时钟域划分。串行通道线速率标称2.125 Gbaud,MGT恢复出的并行内部时钟通常为8bit/16bit位宽下的一百余MHz至数百MHz;而本地主机侧是另一个时钟域(如PCIe用户侧的100~250MHz,或传统PCI的33/66MHz)。两个时钟域之间绝不能直接做组合逻辑交互,必须经过异步FIFO或带灰度指针的同步寄存器。跨时钟域设计是否干净,是这类固件能否一次跑通的分水岭。

3 光收发通道与8b/10b编解码

物理层使用Xilinx Spartan-6 GTP、Virtex-5/6 GTX/GTH级别的高速收发器,或同等工艺的SerDes硬核。环上每个节点有一对光口:RX光口接收上游节点发来的串行比特流,TX光口把转发后的串行流发往下游节点,串接成单向环。线速率取公开标称的2.125 Gbaud,经8b/10b编码后有效载荷速率约为2.125×8/10≈1.7 Gbps,这部分编码开销是为了换取直流平衡与可恢复的时钟。

编解码模块的第一要务是字节对齐。8b/10b数据流中用特定的控制字符(如K28.5comma)作为帧头标志,SerDes的逗号检测电路在连续比特流中滑动锁定到10bit边界,再由对齐状态机把10bit分组还原成8bit数据加1bit控制位。第二要务是弹性缓冲:CDR恢复出的串行时钟与FPGA本地参考时钟存在 ppm 级差异,若不做弹性缓冲,长时间运行会导致收发两端指针漂移。工程上的做法是在解码后插入一小片弹性FIFO,靠周期性的空闲集字符(IDLE)来周期性地“吸收/吐出”差异字节。

之所以沿用8b/10b而不是更高效的64b/66b,恰恰因为反射内存是存储转发结构:每经过一个节点都要在字节边界上判断帧头、做地址过滤和本地写入,字节级定界比纯块同步更适合这种逐节点处理的语义。

4 数据帧格式设计

帧格式是固件模块之间的“契约”,一旦流片或以FPGA封装固化就很难改。典型反射内存帧的字段划分如图2所示:从SOP定界符开始,依次是目标节点ID、源节点ID、帧类型/控制字、数据长度、数据载荷、CRC-32,最后以EOP定界符结束。表1给出了各字段的典型位宽与含义。

节点ID字段存在的根本原因是环网为存储转发:帧每经过一个节点就转发一跳,若没有来源与去向信息,帧会在环内无限循环。目标ID用于本地过滤——只有当目标地址与本节点ID匹配(或为广播地址)时才把载荷写进本地RAM;源ID用于回环检测与“始发剥离”——帧绕环一周后由最初发出它的节点识别出“这是我自己发的帧”,从而把它从环上撤下,避免环内堆积。控制字则区分写、读响应、广播、节点上线/下线通知等不同帧类型。

载荷按32-bit双字对齐,长度字段以双字或字节为单位计数。这样做既方便与双口RAM的32/64位端口对齐,也让CRC计算可以以双字为粒度流水展开,不必逐字节拼包。

表1 典型反射内存帧字段定义(参考RFM2G/VMIC-5565类公开架构)

字段 典型位宽 作用
SOP定界符 10b控制符(K28.5) 帧起始逗号,字节/字符对齐标志
目标节点ID 8bit 寻址目的节点,0xFF为广播
源节点ID 8bit 标识发送节点,用于始发剥离与回环检测
控制字 8~16bit 区分写/读响应/广播/节点状态帧
数据长度LEN 8~16bit 载荷长度,按双字或字节计
数据载荷 1~N×32bit 写入共享内存的数据与目标地址
CRC-32 32bit 整帧校验,多项式0x04C11DB7
EOP定界符 10b控制符 帧结束标志,标志CRC校验区间结束

5 TDM时隙仲裁与环网转发逻辑

环网上任何节点都可能发起写入,若多个节点同时抢发就会碰撞。反射内存采用时分复用(TDM)时隙仲裁:环上节点按节点ID顺序轮流获得发送窗口,某个节点只有在属于自己的时隙内才能把本地主机的未决写事务打包成帧送上环。时隙分配通常由主节点或上电阶段的节点枚举过程决定,节点上线/下线时动态重排,从而在无碰撞的前提下把带宽固定切片给每个节点。

转发逻辑是固件中时序最紧张的部分。它采用“边接收、边校验、边转发、边本地写”的流水结构。

这种流水是微秒级时延的来源:传统“收完整帧—校验—再转发”的store-and-forward会在每个节点引入一帧长度的等待,而流水转发把每跳时延压缩到接近“几个字节的校验延迟+串行化时延”。始发剥离机制保证帧绕环一周后被源节点吸收,环内帧数量恒等于当前在途事务数,不会无限增长。

6 错误检测与恢复机制

CRC校验是第一道防线。接收路径上用与以太网兼容的CRC-32生成多项式(0x04C11DB7)做并行计算,以双字为粒度流水推进,在EOP到达后的几个周期内与帧尾附带的CRC比对。校验正确才允许把载荷写进本地RAM并继续转发;校验失败则丢弃该帧,绝不更新本地共享内存,避免错误数据在全网扩散。

这里有一个容易被忽略的工程权衡:坏帧究竟要不要继续转发?如果直接停止转发,本节点下游的环段会失去时序同步;如果原样转发,坏数据会污染全网。多数商用实现采取折中——本节点吸收坏帧、不写本地RAM,但在转发方向上填充空闲集字符维持环时序,同时把CRC错误计数写入错误统计寄存器,供主机读取。

丢包与链路级错误靠寄存器统计:接收帧计数、CRC错误计数、链路失步(loss of sync)、光信号丢失(loss of signal)等都由硬件累加。主机驱动周期性读出这些计数器做健康监测。物理层支持环回(loopback)模式,既用于产线自测,也支持双反向环(counter-rotating ring)在单根光纤断裂时自动切换到反向路径,把单点断纤降级为单点故障而非全网瘫痪。

7 局部存储器的双端口管理

局部共享内存一般用FPGA内部Block RAM或外挂SRAM构成双口RAM,两个端口分别服务两类访问:一个端口接环网写入引擎,在串行时钟域把帧载荷按地址写入;另一个端口接本地主机总线,在主机时钟域被CPU随机读写。必须用双口结构的原因是:主机侧访问是随机、不定长的,而环网侧是周期性突发写入,单口RAM会在两侧同时访问时发生冲突,要么丢数据要么插入等待。

RAM控制器需要提供字节使能(byte write enable),以匹配主机侧字节、字、双字等不同访问宽度——主机写一个单字节不能把相邻字节冲掉。地址译码逻辑把环网帧里的地址字段映射到RAM偏移,同时保证主机侧BAR空间与环网侧地址落在同一段物理RAM上,二者看到的是同一份映像。

一致性上,固件必须保证环网帧的写入顺序就是帧到达顺序,多帧写同一地址时“最后写胜出”。由于环是单向串行的,帧到达顺序天然全局有序,这正是反射内存比以太网更容易做强一致的根本原因——不需要额外的分布式锁或时序戳。

8 主机总线接口与中断控制器

主机侧接口经历了从PCI/PMC到PCIe、再到VMEbus的演变:早期VMIC-5565同时提供PCI、VMEbus与PMC版本,RFM2G则以PCI/PCIe为主。FPGA内通常用Xilinx集成的PCIe Block Plus硬核(或硬核外绕AXI4-Lite/AXI4桥)实现主机接口。从主机角度看,反射内存卡非常“薄”——主机对映射BAR空间的一次普通写,会被发送引擎捕获,自动打包成一帧按TDM时隙送上环;主机的读则直接命中本地双口RAM,不产生任何网络流量。

中断控制器负责把异步事件收敛成主机可处理的中断:本地共享内存被远端更新、链路状态变化、CRC错误、节点上线/下线等事件分别挂在不同中断源上。设计上需配中断屏蔽寄存器与中断向量寄存器,并采用“写1清除”(Write-1-to-Clear)语义,避免中断服务程序与硬件异步置位之间的竞争。寄存器块还包括节点ID寄存器、链路状态寄存器与错误计数寄存器,是主机驱动初始化与诊断的主要入口。

9 固件调试要点

第一是状态机可见性。环网转发是典型的多状态流水:空闲、等待SOP、接收载荷、CRC校验、转发、本地写、异常。应在RTL中预留Vivado ILA(或同类在线逻辑分析仪)探针,抓MGT恢复出的并行数据流、帧状态机、CRC结果与TX转发使能,否则只能靠主机侧现象反推,定位极慢。

第二是跨时钟域与亚稳态。异步FIFO的满/空标志必须用格雷码指针跨域同步,绝对不能把二进制计数直接跨时钟域;本地写使能与主机读请求在双口RAM两侧握手时,也要做两级触发器同步。CDC问题在仿真中往往复现不了,上板偶发丢数据时最难查,应在设计阶段就用CDC检查工具(如SyncCheck)过一遍。

第三是时序收敛。2.125 Gbaud线速率经MGT分频后的并行时钟频率不低,转发流水路径上若把“CRC判断+地址比较+RAM写”串成一大段组合逻辑,很容易跑不到目标频率。正确做法是把转发拆成多级寄存器打拍,关键路径全部寄存化。第四是链路自测:在MGT里内置PRBS7/PRBS31发生器与检查器,可在不接对端光纤的情况下测量本端BER,是产线与现场排障的利器。

常见的“坑”集中在细节:大小端字节序与8b/10b解出的字节顺序不一致导致载荷错位;CRC计算区间忘了把SOP/EOP控制符排除在外;双口RAM两侧同地址同时读写出现读写竞争;主机侧BAR基地址与环网侧共享内存地址窗口错位,导致“写对了地址却读不到数据”。这些问题都没有捷径,只能靠结构化的探针和分模块的上板测试逐一收敛。

10 结语

反射内存卡的FPGA固件本质上是一个“硬实时存储转发引擎”:以2.125 Gbaud串行通道为物理基础,用8b/10b解决定界与直流平衡,用TDM时隙避免碰撞,用流水化转发把每跳时延压到最低,用CRC-32与始发剥离保证数据正确与环内不堆积,再用双口RAM和薄主机接口把网络透明度交给CPU。它的工程难点不在某一个炫技模块,而在于高速串行、跨时钟域、流水时序与异常恢复之间的协同——这也正是RTL工程师需要在设计初期就把时钟域边界、状态机划分和寄存器可观测性想清楚的原因。

天津拓航科技有限公司

天津拓航科技有限公司

天津拓航科技专注于实时操作系统 拥有自研生产的完全替代GE5565各型号的反射内存卡和反射内存交换机 同时代理销售GE反射内存卡 反射内存交换机

天津拓航科技专注于实时操作系统 拥有自研生产的完全替代GE5565各型号的反射内存卡和反射内存交换机 同时代理销售GE反射内存卡 反射内存交换机收起

查看更多

相关推荐

天津拓航科技专注于实时操作系统 拥有自研生产的完全替代GE5565各型号的反射内存卡和反射内存交换机 同时代理销售GE反射内存卡 反射内存交换机