Added rtl and macros configuration
diff --git a/verilog/rtl/elpis/storebuffer.v b/verilog/rtl/elpis/storebuffer.v
new file mode 100644
index 0000000..bc173fc
--- /dev/null
+++ b/verilog/rtl/elpis/storebuffer.v
@@ -0,0 +1,138 @@
+/*
+*
+* This file is part of the Elpis processor project.
+*
+* Copyright © 2020-present. All rights reserved.
+* Authors: Aurora Tomas and Rodrigo Huerta.
+*
+* This file is licensed under both the BSD-3 license for individual/non-commercial
+* use. Full text of both licenses can be found in LICENSE file.
+*/
+
+`default_nettype none
+
+`ifdef TESTS
+	`include "elpis/definitions.v"
+`else
+    `include "/project/openlane/user_proj_example/../../verilog/rtl/elpis/definitions.v"
+`endif
+
+module storebuffer(
+	input clk,
+	input reset,
+	input[31:0] addr_in,
+	input[31:0] data_in,
+	input is_byte,
+	input sb_we,  // Add a new entry into SB
+	input sb_re,  // Read request (bypass) from an entry of SB
+	input stall_dcache,
+	input hit_dtlb,
+	output reg sb_hit,
+	output full_out,
+	output empty_out,
+	output reg[31:0] addr_out,
+	output reg[31:0] data_out,
+	output reg is_byte_out,
+	output reg drain_out,
+	output reg is_data_to_cache
+);
+	reg useless_bit, hold_value_to_cache;
+	reg[31:0] sb_addr[0:`SB_NUM_ENTRIES-1];
+	reg[31:0] sb_data[0:`SB_NUM_ENTRIES-1];
+	reg sb_size[0:`SB_NUM_ENTRIES-1]; // 0 - word, 1 - byte
+	reg sb_valid[0:`SB_NUM_ENTRIES-1];
+  
+	reg[$clog2(`SB_NUM_ENTRIES)-1:0] head;
+	reg[$clog2(`SB_NUM_ENTRIES)-1:0] tail;
+	reg[$clog2(`SB_NUM_ENTRIES)-1:0] tail_last;
+	reg[$clog2(`SB_NUM_ENTRIES):0] entry_count;
+
+	wire[31:0] ld_first_byte, ld_last_byte;
+	wire[1:0] offset;
+  
+	assign ld_first_byte = addr_in;
+	assign ld_last_byte = (is_byte) ? addr_in : (addr_in+3);
+	assign offset = addr_in[1:0];
+  
+	assign empty_out = (entry_count == 0);
+	assign full_out = (entry_count == `SB_NUM_ENTRIES);
+
+	reg[1:0] hit_pos;
+    integer i;
+	always@(*) begin
+		sb_hit = 1'b0;
+		for (i = 0; (i < `SB_NUM_ENTRIES); i=i+1) begin
+			if (sb_valid[i] && (sb_addr[i] <= ld_first_byte) && ( (sb_addr[i] + (sb_size[i] ? 0 : 3'b11) ) >= ld_last_byte) ) begin
+				sb_hit = 1'b1;
+				hit_pos = i[1:0];
+			end
+		end
+		if (!sb_hit) begin
+			hit_pos = 2'b0;
+		end
+	end
+
+	always@(posedge clk) begin
+		if (reset) begin
+			head <= 2'b0;
+			tail <= 2'b0;
+			entry_count <= 3'b0;
+			for(i = 0; i < `SB_NUM_ENTRIES; i=i+1) begin
+				sb_valid[i] <= 1'b0;
+			end
+		end else begin
+			if (sb_re && sb_hit) begin
+				data_out <= (is_byte && sb_size[hit_pos]) ? {24'b0, sb_data[hit_pos][offset*'d8]} : sb_data[hit_pos];
+			end
+
+			if(sb_we && sb_hit) begin
+				if (is_byte && !sb_size[hit_pos]) begin
+					// We have a word and want to write a byte
+					sb_data[hit_pos][offset*8+:8] <= data_in[7:0]; 
+				end else if (is_byte && sb_size[hit_pos]) begin
+					// We have a byte and want to write a byte
+					sb_data[hit_pos] <= {24'b0, data_in[7:0]};
+				end else begin
+					// We have (byte or word) and we want to write a word
+					sb_data[hit_pos] <= data_in;
+					sb_size[hit_pos] <= 1'b0;
+				end
+			end
+
+			if ((full_out && !stall_dcache) || (!sb_we && !sb_re && !empty_out && !stall_dcache)) begin
+				drain_out <= 1'b1;
+				tail_last <= tail; 
+				is_data_to_cache <= 1'b1;
+				addr_out <= sb_addr[tail];
+				data_out <= sb_data[tail];
+				is_byte_out <= sb_size[tail];
+				entry_count <= entry_count - 1'b1;
+				sb_valid[tail] <= 1'b0;
+				{useless_bit, tail} <= (tail+1'b1)%`SB_NUM_ENTRIES;
+				hold_value_to_cache <= 1'b1;
+			end else if(stall_dcache && hold_value_to_cache) begin 
+				drain_out <= 1'b1;
+				is_data_to_cache <= 1'b1;
+				addr_out <= sb_addr[tail_last];
+				data_out <= sb_data[tail_last];
+				is_byte_out <= sb_size[tail_last];
+				hold_value_to_cache <= 1'b1;
+			end else begin
+				drain_out <= 1'b0;
+				is_data_to_cache <= 1'b0;
+				hold_value_to_cache <= 1'b0;
+				tail_last <= 'b0;
+			end
+
+			if (sb_we && !full_out && !sb_hit && hit_dtlb) begin
+				sb_addr[head] <= addr_in;
+				sb_data[head] <= data_in;
+				sb_size[head] <= is_byte;
+				sb_valid[head] <= 1'b1;
+				entry_count <= entry_count + 1'b1;
+				{useless_bit, head} <= (head + 1'b1)%`SB_NUM_ENTRIES;
+			end
+		end
+  	end
+  
+endmodule