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