Create L2_cache.v
diff --git a/verilog/rtl/L2_cache.v b/verilog/rtl/L2_cache.v
new file mode 100644
index 0000000..f637ee7
--- /dev/null
+++ b/verilog/rtl/L2_cache.v
@@ -0,0 +1,157 @@
+module L2_cache(clk,reset,tag,index,block_offset,find_start,cache_hit_count4,cache_hit_count8,cache_hit_count16,found_in_cache,hit_way,done,updated);
+
+    parameter way = 16;
+    parameter block_size_byte = 16;
+    parameter set_size = 64;
+    
+    parameter block_offset_index = $rtoi($ln(block_size_byte)/$ln(2)); 
+    parameter set_index = $rtoi($ln(set_size)/$ln(2));
+    parameter way_width = $rtoi($ln(way)/$ln(2));
+    parameter cache_line_width = 32-set_index-block_offset_index+1; 
+    
+    input clk,find_start,reset;
+    input [31-set_index-block_offset_index:0] tag;
+    input [set_index-1:0] index;
+    input [block_offset_index-1:0] block_offset;
+    output reg found_in_cache;
+    // this needs to get parameterized based on number of max associativity        
+    output reg [19:0] cache_hit_count4;
+    output reg [19:0] cache_hit_count8;
+    output reg [19:0] cache_hit_count16;
+    output reg [way_width:0] hit_way;   
+    output reg updated,done;        
+    
+    reg [1:0]find_state;
+    reg [way_width:0] way_index;    
+    reg [cache_line_width-1:0] cache [0:set_size-1][0:way-1];
+    reg [cache_line_width-1:0] temp_content;
+    //reg [19:0] hit_count [way-1:0];
+    
+    integer i,j;
+    
+    initial
+    begin
+        found_in_cache = 0;        
+        cache_hit_count4 = 0;        
+        cache_hit_count8 = 0;
+        cache_hit_count16 = 0;                
+        find_state = 0;
+        updated = 0;        
+        for (i=0;i<set_size;i=i+1)
+            for (j=0;j<way;j=j+1)
+                cache[i][j] = 0;
+    end
+    
+    always @ (posedge clk)
+    begin
+        if (reset)
+        begin
+            found_in_cache = 0;        
+            cache_hit_count4 = 0;        
+            cache_hit_count8 = 0;
+            cache_hit_count16 = 0;                   
+            find_state = 0;
+            updated = 0;            
+            for (i=0;i<set_size;i=i+1)
+                for (j=0;j<way;j=j+1)
+                    cache[i][j] = 0;    
+        end
+        else
+        begin
+            case (find_state)
+                2'b00: begin          
+                        found_in_cache = 1'b0;                             
+                        if(find_start)
+                        begin
+                            find_state = 2'b01;                        
+                            done = 1'b0;
+                        end        
+                      end
+                      // Find cache state (to check if particular memory address data is present in cache or not)
+                      
+                2'b01: begin
+                  
+                        if (done)
+                        begin
+                            find_state = 2'b10;                                                   
+                        end        
+                        else
+                        begin
+                            for (way_index=0;way_index<way;way_index=way_index+1'b1)
+                            begin
+                                if(cache[index][way_index][cache_line_width-1]) // valid bit
+                                begin
+                                    if(cache[index][way_index][cache_line_width-2:0]==tag) // tag comparison
+                                    begin
+                                        found_in_cache = 1'b1;                                    
+                                        hit_way = way_index;                                    
+                                        temp_content = cache[index][way_index];                                    
+                                    end
+                               end                                                                                          
+                            end                        
+                            if (found_in_cache)
+                            begin
+                                if (hit_way>=0 && hit_way<4)
+                                begin
+                                    cache_hit_count4 = cache_hit_count4 + 1;
+                                    cache_hit_count8 = cache_hit_count8 + 1;
+                                    cache_hit_count16 = cache_hit_count16 + 1;
+                                end
+                                else if (hit_way>=4 && hit_way<8)
+                                begin
+                                    cache_hit_count8 = cache_hit_count8 + 1;
+                                    cache_hit_count16 = cache_hit_count16 + 1;
+                                end
+                                else if (hit_way>=8 && hit_way<16)
+                                begin                                    
+                                    cache_hit_count16 = cache_hit_count16 + 1;
+                                end
+                                done = 1'b1;
+                                way_index = hit_way;                                                                                      
+                            end  
+                            else                                                                
+                            begin
+                                hit_way = way;
+                                done = 1'b1;
+                            end                                                  
+                        end 
+                       end
+                      
+                       // Updation of cache according LRU shift register policy
+                2'b10: begin                
+                        if(updated)
+                        begin
+                            find_state = 2'b00;
+                            updated = 1'b0;
+                        end
+                        else
+                        begin                            
+                            if(found_in_cache) // hit
+                            begin 
+                                   if(way_index != 0)
+                                    begin
+                                        cache[index][way_index] = cache[index][way_index-1];
+                                        way_index = way_index - 1;
+                                    end
+                                    else
+                                    begin            
+                                        cache[index][0] = temp_content;
+                                        updated = 1'b1;
+                                    end                                                                       
+                            end    
+                            else // miss
+                            begin                                                                                          
+                                for(way_index=way-2;way_index>0;way_index=way_index-1)                            
+                                  cache[index][way_index+1] = cache[index][way_index];                                    
+    
+                                cache[index][1] = cache[index][0];
+                                cache[index][0] = {1'b1,tag};
+                                updated = 1'b1;             
+                            end                                                                                    
+                        end                           
+                       end 
+                        
+            endcase
+         end       
+    end  
+endmodule