diff options
Diffstat (limited to 'fpga/usrp3/lib/control/map/cam.v')
-rw-r--r-- | fpga/usrp3/lib/control/map/cam.v | 103 |
1 files changed, 103 insertions, 0 deletions
diff --git a/fpga/usrp3/lib/control/map/cam.v b/fpga/usrp3/lib/control/map/cam.v new file mode 100644 index 000000000..6b3237b6f --- /dev/null +++ b/fpga/usrp3/lib/control/map/cam.v @@ -0,0 +1,103 @@ +/* + +Copyright (c) 2015-2016 Alex Forencich + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + +*/ + +// Language: Verilog 2001 + +`timescale 1ns / 1ps + +/* + * Content Addressable Memory + */ +module cam #( + // search data bus width + parameter DATA_WIDTH = 64, + // memory size in log2(words) + parameter ADDR_WIDTH = 5, + // CAM style (SRL, BRAM) + parameter CAM_STYLE = "SRL", + // width of data bus slices + parameter SLICE_WIDTH = 4 +) +( + input wire clk, + input wire rst, + + input wire [ADDR_WIDTH-1:0] write_addr, + input wire [DATA_WIDTH-1:0] write_data, + input wire write_delete, + input wire write_enable, + output wire write_busy, + + input wire [DATA_WIDTH-1:0] compare_data, + output wire [2**ADDR_WIDTH-1:0] match_many, + output wire [2**ADDR_WIDTH-1:0] match_single, + output wire [ADDR_WIDTH-1:0] match_addr, + output wire match +); + +generate + if (CAM_STYLE == "SRL") begin + cam_srl #( + .DATA_WIDTH(DATA_WIDTH), + .ADDR_WIDTH(ADDR_WIDTH), + .SLICE_WIDTH(SLICE_WIDTH) + ) + cam_inst ( + .clk(clk), + .rst(rst), + .write_addr(write_addr), + .write_data(write_data), + .write_delete(write_delete), + .write_enable(write_enable), + .write_busy(write_busy), + .compare_data(compare_data), + .match_many(match_many), + .match_single(match_single), + .match_addr(match_addr), + .match(match) + ); + end else if (CAM_STYLE == "BRAM") begin + cam_bram #( + .DATA_WIDTH(DATA_WIDTH), + .ADDR_WIDTH(ADDR_WIDTH), + .SLICE_WIDTH(SLICE_WIDTH) + ) + cam_inst ( + .clk(clk), + .rst(rst), + .write_addr(write_addr), + .write_data(write_data), + .write_delete(write_delete), + .write_enable(write_enable), + .write_busy(write_busy), + .compare_data(compare_data), + .match_many(match_many), + .match_single(match_single), + .match_addr(match_addr), + .match(match) + ); + end +endgenerate + +endmodule |