在 verilog 中实现 CAM 的组合方式

Combinational way of implementing a CAM in verilog

我正在尝试在 SystemVerilog 中实现缓存和索引查找内存。这是一个简单的 CAM + 循环缓冲区。界面是:

input rst_n;
input clk;
input [WORD_BITS-1:0] inp;
input rd_en;
input wr_en;
output logic [DEPTH_BITS-1:0] index;
output logic index_valid;

reg [WORD_BITS-1:0] buffer[$pow(2, DEPTH_BITS)];
reg [DEPTH_BITS-1:0] next;

有基本的异步重置代码。有一个同步块将 inp 存储在缓冲区中,并在 wr_en 为高时前进 next

现在我正试图想出一种有效且可读的方法来在 rd_en 很高时找到 inp 的索引。看起来这可能是完全组合的,除非将结果计时到 index 输出中。我在脑海中想象它的方式是对所有缓冲区位置进行异或 inp (它将相当小,可能有 64 个条目),然后如果它等于 0,则找到条目。然后一个块任意选择一个具有 0 值的索引。这是与传统 CAM 不同的地方,同一值可能有多个条目,但我真的只需要其中之一的索引,而哪一个并不重要。

关于如何在 System Verilog (2012) 中执行此操作的任何想法?我知道我可以同步遍历所有内存位置并节省一堆区域,但我宁愿它快而不是小。我的目标是 FPGA。 (最初便宜的 Lattice 和 Xilinx 部件)我知道一些 Lattice 部件实际上有 CAM 块,但这是针对那些不可用的情况。

根据另一个论坛的建议,以下似乎很有效。

        always_comb begin
                index_valid = 0;
                for (int i=0; i < 64; i=i+1) begin
                        if (rd_en) begin
                                if (inp == buffer[i]) begin
                                        index = i;
                                        index_valid = 1'b1;
                                end
                        end
                end
        end