diff options
Diffstat (limited to 'src/cam.v')
| -rw-r--r-- | src/cam.v | 48 |
1 files changed, 19 insertions, 29 deletions
@@ -1,7 +1,8 @@ /* * cam.v * - * Copyright (C) 2018, 2019 Mind Chasers Inc. + * Copyright (C) 2025 Private Island Networks Inc. + * Copyright (C) 2018-2022 Mind Chasers Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -18,66 +19,55 @@ * function: single cycle, parameterized CAM * */ - -`timescale 1ns /10ps -module cam #(parameter DEPTH = 4, - parameter DEPTHW = 2, - parameter WIDTH = 32) +module cam #(parameter DEPTH = 8, DATAW = 32) ( input rstn, input clk, // input for programming + input prgclk, input sel, input we, - input [DEPTHW+1:0] addr, // add two bits for the byte selects - input [7:0] d_in, + input [$clog2(DEPTH)-1:0] addr, // include two lsbits for the byte selects + input [DATAW-1:0] d_i, + output [DATAW-1:0] d_o, input search, - input [(WIDTH-1):0]search_address, + input [DATAW-1:0] search_address, // output output reg match ); + - reg [(WIDTH-1):0] content[0:DEPTH-1]; - reg [(DEPTH-1):0] valid; + reg [DATAW-1:0] content[0:DEPTH-1]; + reg valid[0:DEPTH-1]; integer i,j; // Program the CAM - always @(posedge clk, negedge rstn) + always @(posedge prgclk, negedge rstn) if( !rstn ) begin for (i=0; i < DEPTH; i=i+1) begin - content[i] <= 32'h0; + content[i] <= 'd0; valid[i] <= 1'b0; end end else if ( we && sel ) - if (addr[1:0] == 2'b00) begin - content[addr[DEPTHW+1:2]][7:0] <= d_in; - valid[addr[DEPTHW+1:2]] <= 1'b1; - end - else if (addr[1:0] == 2'b01) begin - content[addr[DEPTHW+1:2]][15:8] <= d_in; - valid[addr[DEPTHW+1:2]] <= 1'b1; - end - else if (addr[1:0] == 2'b10) begin - content[addr[DEPTHW+1:2]][23:16] <= d_in; - valid[addr[DEPTHW+1:2]] <= 1'b1; - end - else if (addr[1:0] == 2'b11) begin - content[addr[DEPTHW+1:2]][31:24] <= d_in; - valid[addr[DEPTHW+1:2]] <= 1'b1; + begin + content[addr] <= d_i; + valid[addr] <= 1'b1; end + assign d_o = valid[addr] ? content[addr] : 'd0; + + // search the CAM always @(posedge clk) begin match <= 1'b0; for (j=0; j < DEPTH; j=j+1) begin if (search && valid[j] && search_address == content[j]) match <= 1'b1; - end end |



