Create L1_cache.v
diff --git a/verilog/rtl/L1_cache.v b/verilog/rtl/L1_cache.v
new file mode 100644
index 0000000..9e17647
--- /dev/null
+++ b/verilog/rtl/L1_cache.v
@@ -0,0 +1,175 @@
+module L1_cache(clk,reset,tag,index,block_offset,find_start,prefetch_hit,L2_cache_hit,cache_hit_count,found_in_cache,updated,done_L1,done_prefetch);
+
+ parameter way = 4;
+ parameter block_size_byte = 16;
+ parameter cache_size_byte = 32*1024;
+
+ parameter block_offset_index = $rtoi($ln(block_size_byte)/$ln(2));
+ parameter set = cache_size_byte/(block_size_byte*way);
+ parameter set_index = $rtoi($ln(set)/$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,L2_cache_hit,prefetch_hit,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;
+ output reg [19:0] cache_hit_count;
+ output reg updated,done_L1,done_prefetch;
+
+ reg [1:0]find_state;
+ reg [1:0]flag;
+ reg bi_flag;
+ reg [way_width:0] way_index;
+ reg [way_width-1:0] hit_way;
+ reg [cache_line_width-1:0] cache [0:set-1][0:way-1];
+ reg [cache_line_width-1:0] temp_content;
+ reg [cache_line_width-1:0] temp_content1 [0:way-1];
+
+ integer i,j;
+
+ initial
+ begin
+ found_in_cache = 0;
+ cache_hit_count = 0;
+ find_state = 0;
+ flag = 0;
+ bi_flag = 0;
+ updated = 0;
+ done_prefetch = 0;
+ for (i=0;i<set;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_count = 0;
+ //cache_miss_count = 0;
+ find_state = 0;
+ flag = 0;
+ bi_flag = 0;
+ updated = 0;
+ done_prefetch = 0;
+ for (i=0;i<set;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_L1 = 1'b0;
+ end
+ end
+
+ 2'b01: begin
+
+ if (done_L1 && !found_in_cache)
+ begin
+ find_state = 2'b10;
+ done_L1 = 1'b0;
+ end
+ else if (done_L1 && found_in_cache)
+ begin
+ find_state = 2'b11;
+ done_L1 = 1'b0;
+ 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];
+ cache_hit_count = cache_hit_count + 1'b1;
+ done_L1 = 1'b1;
+ end
+ end
+ end
+ if (way_index==way&&!found_in_cache)
+ begin
+ //cache_miss_count = cache_miss_count + 1'b1;
+ found_in_cache = 1'b0;
+ done_L1 = 1'b1;
+ end
+ end
+ end
+
+ 2'b10: begin
+ if(done_prefetch)
+ begin
+ find_state= 2'b11;
+ done_prefetch = 1'b0;
+ flag = 1'b0;
+ end
+ else
+ begin
+ if(!flag)
+ flag = 1'b1;
+ else
+ begin
+ if(prefetch_hit&flag)
+ begin
+ flag = 1'b0;
+ cache_hit_count = cache_hit_count + 1'b1;
+ end
+ //else
+ //cache_miss_count = cache_miss_count + 1'b1;
+ done_prefetch = 1'b1;
+ end
+ end
+ end
+
+ 2'b11: begin
+ if(updated)
+ begin
+ find_state = 2'b00;
+ updated = 1'b0;
+ end
+
+ else
+ begin
+ if(found_in_cache) // hit
+ begin
+ if(hit_way != 0)
+ begin
+ cache[index][hit_way] = cache[index][hit_way-1];
+ hit_way = hit_way - 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