SystemVerilog下组合逻辑实现CAM+环形缓冲的索引查找方案咨询
SystemVerilog CAM查找逻辑实现方案
核心实现思路
由于仅需要64个条目、优先保障查找速度,直接采用全并行比较+优先编码器的组合逻辑实现即可,所有比较逻辑并行执行,无遍历延迟,完全符合需求。
代码实现
已完成的复位、写入逻辑无需修改,新增查找逻辑如下:
1. 内部信号定义
// 匹配掩码:每一位对应buffer一个条目的匹配状态,1表示匹配 logic [2**DEPTH_BITS - 1 : 0] match_mask; // 组合逻辑输出的查找结果 logic [DEPTH_BITS - 1 : 0] index_comb; logic index_valid_comb;
2. 组合逻辑查找块(完全无时序逻辑)
always_comb begin // 赋默认值避免生成锁存器 match_mask = '0; index_comb = '0; index_valid_comb = 1'b0; if (rd_en) begin // 并行比较所有buffer条目,生成匹配掩码 for (int i = 0; i < 2**DEPTH_BITS; i++) begin match_mask[i] = (buffer[i] == inp); end // 存在匹配条目时输出第一个命中的索引(任意命中即可,选第一个实现最简单) if (|match_mask) begin index_valid_comb = 1'b1; // SV2012内置$find_first_set返回第一个置1位的1-based序号,转换为0-based索引 index_comb = $clog2($find_first_set(match_mask)) - 1'b1; end end end
3. 输出打拍时序逻辑(仅此处有时序)
always_ff @(posedge clk or negedge rst_n) begin if (!rst_n) begin index <= '0; index_valid <= 1'b0; end else begin index <= index_comb; index_valid <= index_valid_comb; end end
FPGA适配说明
- 上述逻辑在无CAM硬核的Lattice、Xilinx器件上均可正常综合,静态展开的并行比较会被映射为LUT实现的比较逻辑,64条目规模下100MHz以上时钟频率无时序压力
- 若部分旧版EDA工具对
$find_first_set支持不完善,可替换为自定义优先编码器逻辑,只需把索引计算部分替换为从高到低/从低到高遍历match_mask取第一个置1位即可,仍为纯组合逻辑 - 若后续需要优先返回最新写入的匹配条目,只需调整匹配掩码的遍历顺序,从
next指针的前一个位置反向查找即可,修改成本极低
内容的提问来源于stack exchange,提问作者Trevor
相关产品推荐
相关产品推荐

