存储器与 FIFO:地址、冲突与一致性
约 14 分钟
寄存器、RAM、ROM和FIFO的接口看似都是读写数据,实际同步读延迟、写优先、双口冲突和初始化行为因器件与综合目标而异。可移植RTL必须明确而非依赖仿真默认。
同步与异步读
FPGA块RAM通常同步读,地址打一拍后数据出现;写成异步读可能综合成分布式逻辑。微架构应把延迟纳入握手,不能仿真中一拍即取后期待硬件相同。
同地址读写
read-first、write-first或no-change决定冲突拍输出旧值、新值或保持。不同器件模式不同,若算法依赖具体行为,应显式实现或约束。
FIFO计数
空满可由读写指针与额外翻转位判断。允许同时读写时计数保持;在空读或满写时必须定义是拒绝、报错还是覆盖,默认沉默会丢数据。
水位与背压
almost-full提前考虑流水线中已在路上的写请求,almost-empty服务突发读。阈值由路径延迟和最大在途量推导。
数据完整性
片上存储也可能受软错误,关键数据可用奇偶或ECC。ECC能纠一位不代表地址、控制和多位故障全被覆盖。
初始化文件和字节序也需固定并测试。
练习:设计深度非2次幂的同步FIFO,写空满、同时读写和越界断言。
小纸条
为什么 FIFO 的 almost-full 阈值要考虑流水线中的在途数据?