mirror of
				https://github.com/YosysHQ/yosys
				synced 2025-10-31 03:32:29 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			60 lines
		
	
	
	
		
			1.7 KiB
		
	
	
	
		
			Verilog
		
	
	
	
	
	
			
		
		
	
	
			60 lines
		
	
	
	
		
			1.7 KiB
		
	
	
	
		
			Verilog
		
	
	
	
	
	
| //-----------------------------------------------------
 | |
| // Design Name : cam
 | |
| // File Name   : cam.v
 | |
| // Function    : CAM
 | |
| // Coder       : Deepak Kumar Tala
 | |
| //-----------------------------------------------------
 | |
| module cam (
 | |
| clk         , // Cam clock
 | |
| cam_enable  , // Cam enable
 | |
| cam_data_in , // Cam data to match
 | |
| cam_hit_out , // Cam match has happened
 | |
| cam_addr_out  // Cam output address 
 | |
| );
 | |
| 
 | |
| parameter ADDR_WIDTH  = 8;
 | |
| parameter DEPTH       = 1 << ADDR_WIDTH;
 | |
| //------------Input Ports--------------
 | |
| input                    clk;      
 | |
| input                    cam_enable;   
 | |
| input  [DEPTH-1:0]       cam_data_in;  
 | |
| //----------Output Ports--------------
 | |
| output                   cam_hit_out;  
 | |
| output [ADDR_WIDTH-1:0]  cam_addr_out;  
 | |
| //------------Internal Variables--------
 | |
| reg [ADDR_WIDTH-1:0]  cam_addr_out;
 | |
| reg                   cam_hit_out;
 | |
| reg [ADDR_WIDTH-1:0]  cam_addr_combo;
 | |
| reg                   cam_hit_combo;
 | |
| reg                   found_match;
 | |
| integer               i;
 | |
| //-------------Code Starts Here-------
 | |
| always @(cam_data_in) begin
 | |
|   cam_addr_combo   = {ADDR_WIDTH{1'b0}};
 | |
|   found_match      = 1'b0;
 | |
|   cam_hit_combo    = 1'b0;
 | |
|   for (i=0; i<DEPTH; i=i+1) begin
 | |
|     if (cam_data_in[i] && !found_match) begin
 | |
|       found_match     = 1'b1;
 | |
|       cam_hit_combo   = 1'b1;
 | |
|       cam_addr_combo  = i;
 | |
|     end else begin
 | |
|       found_match     = found_match;
 | |
|       cam_hit_combo   = cam_hit_combo;
 | |
|       cam_addr_combo  = cam_addr_combo;
 | |
|     end
 | |
|   end
 | |
| end
 | |
| 
 | |
| // Register the outputs 
 | |
| always @(posedge clk) begin
 | |
|   if (cam_enable) begin
 | |
|     cam_hit_out  <=  cam_hit_combo;
 | |
|     cam_addr_out <=  cam_addr_combo;
 | |
|   end else begin
 | |
|     cam_hit_out  <=  1'b0;
 | |
|     cam_addr_out <=  {ADDR_WIDTH{1'b0}};
 | |
|   end
 | |
| end
 | |
| 
 | |
| endmodule 
 |