CAM:给内容,一个周期内找出所有匹配的地址
更新时间:2026-09-12。本文是「集成电路大类 · 芯片设计」**进阶层(intermediate)**数字逻辑第五十七篇。SRAM是「给地址、取数据」,寄存器堆也是。而 TLB、Cache 标签、路由器转发表要的是反向操作——给数据,问它存在第几行。这一篇讲为这种搜索定制的硬件:内容可寻址存储器 CAM。
本文要回答的问题
- CAM 和普通 RAM 的访问方向为什么正好相反?
- 每个 bit 的比较单元怎么工作,为什么一个周期能搜完全表?
- TCAM 的「X 通配」是什么,路由最长前缀匹配为什么离不开它?
- 匹配线、搜索线、命中编码器如何协作?
- CAM 为什么又大又耗电,工程上怎么用 set-assoc/分块缓解?
一、反着用的存储器
普通 SRAM:输入地址 A,输出 mem[A] 这一个数据。CAM:输入搜索关键字 K,并行地把 K 与每一行内容同时比较,输出:①命中(hit,至少一行相等);②匹配行的地址(可能多行,由优先级编码器选一行或全部编码)。这是把「相等比较」在存储阵列上对所有行并行铺开,用面积和功耗换 O(1) 的搜索延迟。
二、bit 单元:存储 + 比较,挂在匹配线上
经典 NOR-type CAM 每个 bit 单元在 6T SRAM 存储之外增加比较逻辑(约 9~10 管):
- 搜索线 SL/SL̄ 送来关键字这一位及其反;
- 单元存的位与搜索位做 XNOR(相同为 1);
- 所有行的比较结果串/并到该行的匹配线 ML(matchline):只要这一行有任何一位不同,就有路径把 ML 拉低;全部相等 ML 才保持高(或反之,看约定)。
一次搜索:先预充所有 ML,再把关键字驱动到全部搜索线,整个阵列每一行同时比较,不匹配的行 ML 被下拉;剩余高 ML 即命中行,经行编码器(本质是优先级编码器/leading-one)输出匹配地址。全部发生在一个周期内,但每次搜索全阵列的 SL、ML 都在充放电,这正是它功耗极高的根源。
三、TCAM:第三位「X 通配」与最长前缀匹配
普通 CAM 只存 0/1,要么等要么不等。TCAM(Ternary CAM,三态 CAM)每 bit 用两位掩膜编码存 0、1、X 三种值,X 表示「这一位不关心、总是匹配」。这正好实现网络路由的最长前缀匹配(LPM):表项按前缀长度存,短前缀后面全是通配(如 101.10.*.*),到来的目的地址能同时匹配多条前缀,再由优先级逻辑选前缀最长(最具体)的那条出口。ACL 规则、流分类也大量依赖这种「掩码+优先级」搜索。
四、功耗/面积为什么大,怎么省
CAM 单元比 SRAM 多比较管(~16T 对 TCAM),且每次搜索整张表的搜索线和匹配线都翻转,动态功耗往往占芯片大头,密度也低。常见节能/折中手段:
- 选通未用区/分块(banked/pipelined search):先查小标签区,未命中就不激活后续大块;
- 低摆幅搜索线、匹配线预充-求值(与 SRAM 灵敏放大同源的省能手法)、NAND vs NOR 型 ML 取舍(速度/功耗);
- 用相联度换容量:不全相联,改成 set-associative——先用一部分位哈希/索引到有限几路,再在路内做 CAM 比较,把全表并行搜索缩成几路,Cache/TLB 的组相联正是这种折中;
- 容量小、命中率高的表(TLB、分支目标缓冲 BTB、Cache tag)才用硬件 CAM;大路由表常把大容量慢表放 SRAM/DRAM、热点表项放 TCAM 分级。
五、典型应用对照
| 用途 | 关键字 | 返回 | 类型 |
|---|---|---|---|
| 虚拟→物理地址 TLB | 虚页号 | 物理页号/命中 | CAM/SRAM tag |
| Cache tag array | 地址标签 | 路命中(which way) | 组相联小 CAM |
| 分支目标缓冲 BTB | PC | 目标地址/预测 | CAM |
| 路由转发表 | 目的 IP | 出端口(最长前缀) | TCAM |
| 交换机 MAC/ACL | MAC/规则 | 端口/动作 | CAM/TCAM |
写 CAM 类似 SRAM(按地址更新表项并处理有效位/老化),但它的价值全在读出方向的「全并行相等比较」。设计时还要处理多命中(返回全部或按优先级)、无效项、命中下的仲裁与更新一致性。
与现有篇目的衔接
- 前置:SRAM 单元/位线、寄存器堆、相等比较/XNOR
- 配套:优先级编码器/命中地址、译码/字线
- 应用:片上存储/Cache/TLB、网络转发与片上网络/总线、低功耗设计
总结
一句话总结:CAM 把存储器的访问方向反过来——给一个关键字,用每 bit 的 XNOR 比较单元把它和所有行并行比较,不匹配的行经搜索线把本行匹配线拉低、全部相等的行匹配线保持高,再由优先级/行编码器在一个周期内输出命中地址,本质是把相等比较在整个阵列上铺开,用面积功耗换 O(1) 搜索;TCAM 每 bit 用两位存 0/1/X,通配位总是匹配,配合优先级选择实现路由最长前缀匹配和规则匹配;由于每次搜索全阵列搜索线/匹配线都充放电且单元比 SRAM 多比较管,CAM 又大又耗电,工程上靠分块选通、低摆幅与预充求值、以及用组相联(先索引到少数几路再比较)把全相联搜索缩成几路来缓解,因此它只用在容量小但要求单周期命中的 TLB、Cache tag、BTB 和网络 TCAM,而不是大容量通用存储。