在 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
我正在尝试在 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