diff --git a/docs/source/_static/secure_memory.png b/docs/source/_static/secure_memory.png
new file mode 100644
index 0000000..31f057f
--- /dev/null
+++ b/docs/source/_static/secure_memory.png
Binary files differ
diff --git a/docs/source/_static/trng.png b/docs/source/_static/trng.png
new file mode 100644
index 0000000..08243c2
--- /dev/null
+++ b/docs/source/_static/trng.png
Binary files differ
diff --git a/openlane/sram_wb_wrapper/config.tcl b/openlane/sram_wb_wrapper/config.tcl
deleted file mode 100644
index 5bffdca..0000000
--- a/openlane/sram_wb_wrapper/config.tcl
+++ /dev/null
@@ -1,40 +0,0 @@
-# User config
-set ::env(DESIGN_NAME) sram_wb_wrapper
-
-# Change if needed
-set ::env(VERILOG_FILES) "\
-	$::env(CARAVEL_ROOT)/verilog/rtl/defines.v \
-	$::env(DESIGN_DIR)/../../verilog/rtl/sram/sram_wb_wrapper.sv"
-
-# Fill this
-set ::env(CLOCK_PERIOD) "10.0"
-set ::env(CLOCK_PORT) "wb_clk_i"
-
-set ::env(PDK) "sky130A"
-set ::env(STD_CELL_LIBRARY) "sky130_fd_sc_hd"
-
-# Black-box verilog and views
-# set ::env(VERILOG_FILES_BLACKBOX) "\
-# 	$::env(DESIGN_DIR)/../../verilog/rtl/sram/sky130_sram_1kbyte_1rw1r_32x256_8.v"
-
-# set ::env(EXTRA_LEFS) "\
-# 	$::env(DESIGN_DIR)/../../lef/sky130_sram_1kbyte_1rw1r_32x256_8.lef"
-
-# set ::env(EXTRA_GDS_FILES) "\
-# 	$::env(DESIGN_DIR)/../../gds/sky130_sram_1kbyte_1rw1r_32x256_8.gds"
-
-# Preserve gate instances in the rtl of the design.
-
-set ::env(FP_SIZING) absolute
-set ::env(DIE_AREA) "0 0 100 333"
-
-set ::env(PL_BASIC_PLACEMENT) 1
-set ::env(PL_TARGET_DENSITY) 0.50
-
-set ::env(VDD_PIN) [list {vccd1}]
-set ::env(GND_PIN) [list {vssd1}]
-set ::env(RT_MAX_LAYER) {met4}
-set ::env(DIODE_INSERTION_STRATEGY) 4
-set ::env(RUN_CVC) 1
-set ::env(ROUTING_CORES) "8"
-
diff --git a/openlane/user_proj_example/config.tcl b/openlane/user_proj_example/config.tcl
index 81e4e28..4e09ef1 100644
--- a/openlane/user_proj_example/config.tcl
+++ b/openlane/user_proj_example/config.tcl
@@ -20,7 +20,7 @@
 
 
 # Fill this
-set ::env(CLOCK_PERIOD) "20.0"
+set ::env(CLOCK_PERIOD) "50.0"
 set ::env(CLOCK_PORT) "wb_clk_i"
 set ::env(CLOCK_NET) "wb_clk_i"
 
@@ -41,7 +41,7 @@
 
 
 set ::env(FP_SIZING) absolute
-set ::env(DIE_AREA) "0 0 1500 1000"
+set ::env(DIE_AREA) "0 0 2000 2500"
 
 #set ::env(PL_BASIC_PLACEMENT) 1
 set ::env(PL_TARGET_DENSITY) 0.50
diff --git a/openlane/wb_interconnect/config.tcl b/openlane/wb_interconnect/config.tcl
deleted file mode 100644
index 5c57399..0000000
--- a/openlane/wb_interconnect/config.tcl
+++ /dev/null
@@ -1,32 +0,0 @@
-# User config
-set ::env(DESIGN_NAME) wb_interconnect
-
-# Change if needed
-set ::env(VERILOG_FILES) "\
-	$::env(CARAVEL_ROOT)/verilog/rtl/defines.v \
-	$::env(DESIGN_DIR)/../../verilog/rtl/wb_interconnect/wb_interconnect.sv"
-
-# Fill this
-set ::env(CLOCK_PERIOD) "20.0"
-set ::env(CLOCK_PORT) "clk_i"
-
-set ::env(PDK) "sky130A"
-set ::env(STD_CELL_LIBRARY) "sky130_fd_sc_hd"
-
-
-# Preserve gate instances in the rtl of the design.
-
-
-set ::env(FP_SIZING) absolute
-set ::env(DIE_AREA) "0 0 200 400"
-
-set ::env(PL_BASIC_PLACEMENT) 1
-set ::env(PL_TARGET_DENSITY) 0.50
-
-set ::env(VDD_PIN) [list {vccd1}]
-set ::env(GND_PIN) [list {vssd1}]
-
-set ::env(RT_MAX_LAYER) {met4}
-set ::env(DIODE_INSERTION_STRATEGY) 4
-set ::env(RUN_CVC) 1
-set ::env(ROUTING_CORES) "8"
diff --git a/openlane/wbuart32/config.tcl b/openlane/wbuart32/config.tcl
deleted file mode 100644
index fd4cbc3..0000000
--- a/openlane/wbuart32/config.tcl
+++ /dev/null
@@ -1,15 +0,0 @@
-# User config
-set ::env(DESIGN_NAME) user_proj_example
-
-# Change if needed
-set ::env(VERILOG_FILES) [glob $::env(DESIGN_DIR)/src/*.v]
-
-# Fill this
-set ::env(CLOCK_PERIOD) "10.0"
-set ::env(CLOCK_PORT) "clk"
-
-set filename $::env(DESIGN_DIR)/$::env(PDK)_$::env(STD_CELL_LIBRARY)_config.tcl
-if { [file exists $filename] == 1} {
-	source $filename
-}
-
diff --git a/openlane/wbuart32/src/wbuart.v b/openlane/wbuart32/src/wbuart.v
deleted file mode 100644
index 27d38c4..0000000
--- a/openlane/wbuart32/src/wbuart.v
+++ /dev/null
@@ -1,528 +0,0 @@
-////////////////////////////////////////////////////////////////////////////////
-//
-// Filename: 	wbuart.v
-// {{{
-// Project:	wbuart32, a full featured UART with simulator
-//
-// Purpose:	Unlilke wbuart-insert.v, this is a full blown wishbone core
-//		with integrated FIFO support to support the UART transmitter
-//	and receiver found within here.  As a result, it's usage may be
-//	heavier on the bus than the insert, but it may also be more useful.
-//
-// Creator:	Dan Gisselquist, Ph.D.
-//		Gisselquist Technology, LLC
-//
-////////////////////////////////////////////////////////////////////////////////
-// }}}
-// Copyright (C) 2015-2021, Gisselquist Technology, LLC
-// {{{
-// This program is free software (firmware): you can redistribute it and/or
-// modify it under the terms of the GNU General Public License as published
-// by the Free Software Foundation, either version 3 of the License, or (at
-// your option) any later version.
-//
-// This program is distributed in the hope that it will be useful, but WITHOUT
-// ANY WARRANTY; without even the implied warranty of MERCHANTIBILITY or
-// FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
-// for more details.
-//
-// You should have received a copy of the GNU General Public License along
-// with this program.  (It's in the $(ROOT)/doc directory.  Run make with no
-// target there if the PDF file isn't present.)  If not, see
-// <http://www.gnu.org/licenses/> for a copy.
-// }}}
-// License:	GPL, v3, as defined and found on www.gnu.org,
-// {{{
-//		http://www.gnu.org/licenses/gpl.html
-//
-//
-////////////////////////////////////////////////////////////////////////////////
-//
-//
-//`default_nettype none
-// }}}
-`define	USE_LITE_UART
-module	wbuart #(
-		// {{{
-		// 4MB 8N1, when using 100MHz clock
-		parameter [30:0] INITIAL_SETUP = 31'd25,
-		parameter [3:0]	LGFLEN = 4,
-		parameter [0:0]	HARDWARE_FLOW_CONTROL_PRESENT = 1'b1
-		// Perform a simple/quick bounds check on the log FIFO length,
-		// to make sure its within the bounds we can support with our
-		// current interface.
-		
-		// }}}
-	) (
-		// {{{
-		input	wire		i_clk, i_reset,
-		// Wishbone inputs
-		input	wire		i_wb_cyc,
-		input	wire		i_wb_stb, i_wb_we,
-		input	wire	[1:0]	i_wb_addr,
-		input	wire	[31:0]	i_wb_data,
-		input	wire	[3:0]	i_wb_sel,
-		output	wire		o_wb_stall,
-		output	reg		o_wb_ack,
-		output	reg	[31:0]	o_wb_data,
-		//
-		input	wire		i_uart_rx,
-		output	wire		o_uart_tx,
-		input	wire		i_cts_n,
-		output	reg		o_rts_n,
-		output	wire		o_uart_rx_int, o_uart_tx_int,
-					o_uart_rxfifo_int, o_uart_txfifo_int
-		// }}}
-	);
-
-	localparam [3:0]	LCLLGFLEN = (LGFLEN > 4'ha)? 4'ha
-					: ((LGFLEN < 4'h2) ? 4'h2 : LGFLEN);
-
-	localparam [1:0]	UART_SETUP = 2'b00,
-				UART_FIFO  = 2'b01,
-				UART_RXREG = 2'b10,
-				UART_TXREG = 2'b11;
-
-	// Register and signal declarations
-	// {{{
-	wire	tx_busy;
-	reg	[30:0]	uart_setup;
-	// Receiver
-	wire		rx_stb, rx_break, rx_perr, rx_ferr, ck_uart;
-	wire	[7:0]	rx_uart_data;
-	reg		rx_uart_reset;
-	// Receive FIFO
-	wire		rx_empty_n, rx_fifo_err;
-	wire	[7:0]	rxf_wb_data;
-	wire	[15:0]	rxf_status;
-	reg		rxf_wb_read;
-	//
-	wire	[(LCLLGFLEN-1):0]	check_cutoff;
-	reg			r_rx_perr, r_rx_ferr;
-	wire	[31:0]		wb_rx_data;
-	// The transmitter
-	wire		tx_empty_n, txf_err, tx_break;
-	wire	[7:0]	tx_data;
-	wire	[15:0]	txf_status;
-	reg		txf_wb_write, tx_uart_reset;
-	reg	[7:0]	txf_wb_data;
-	//
-	wire	[31:0]	wb_tx_data;
-	wire	[31:0]	wb_fifo_data;
-	reg	[1:0]	r_wb_addr;
-	reg		r_wb_ack;
-	// }}}
-
-	// uart_setup
-	// {{{
-	// The UART setup parameters: bits per byte, stop bits, parity, and
-	// baud rate are all captured within this uart_setup register.
-	//
-	initial	uart_setup = INITIAL_SETUP
-		| ((HARDWARE_FLOW_CONTROL_PRESENT==1'b0)? 31'h40000000 : 0);
-	always @(posedge i_clk)
-	// Under wishbone rules, a write takes place any time i_wb_stb
-	// is high.  If that's the case, and if the write was to the
-	// setup address, then set us up for the new parameters.
-	if ((i_wb_stb)&&(i_wb_addr == UART_SETUP)&&(i_wb_we))
-	begin
-		if (i_wb_sel[0])
-			uart_setup[7:0] <= i_wb_data[7:0];
-		if (i_wb_sel[1])
-			uart_setup[15:8] <= i_wb_data[15:8];
-		if (i_wb_sel[2])
-			uart_setup[23:16] <= i_wb_data[23:16];
-		if (i_wb_sel[3])
-			uart_setup[30:24] <= { (i_wb_data[30])
-					||(!HARDWARE_FLOW_CONTROL_PRESENT),
-				i_wb_data[29:24] };
-	end
-	// }}}
-	////////////////////////////////////////////////////////////////////////
-	//
-	// The UART receiver
-	// {{{
-	////////////////////////////////////////////////////////////////////////
-	//
-	//
-
-	// The receiver itself
-	// {{{
-	// Here's our UART receiver.  Basically, it accepts our setup wires, 
-	// the UART input, a clock, and a reset line, and produces outputs:
-	// a stb (true when new data is ready), and an 8-bit data out value
-	// valid when stb is high.
-`ifdef	USE_LITE_UART
-	// {{{
-	rxuartlite	#(.CLOCKS_PER_BAUD(INITIAL_SETUP[23:0]))
-		rx(i_clk, i_uart_rx, rx_stb, rx_uart_data);
-	assign	rx_break = 1'b0;
-	assign	rx_perr  = 1'b0;
-	assign	rx_ferr  = 1'b0;
-	assign	ck_uart  = 1'b0;
-	// }}}
-`else
-	// {{{
-	// The full receiver also produces a break value (true during a break
-	// cond.), and parity/framing error flags--also valid when stb is true.
-	rxuart	#(.INITIAL_SETUP(INITIAL_SETUP)) rx(i_clk, (i_reset)||(rx_uart_reset),
-			uart_setup, i_uart_rx,
-			rx_stb, rx_uart_data, rx_break,
-			rx_perr, rx_ferr, ck_uart);
-	// The real trick is ... now that we have this extra data, what do we do
-	// with it?
-	// }}}
-`endif
-	// }}}
-
-	// The receive FIFO
-	// {{{
-	// We place new arriving data into a receiver FIFO.
-	//
-	// And here's the FIFO proper.
-	//
-	// Note that the FIFO will be cleared upon any reset: either if there's
-	// a UART break condition on the line, the receiver is in reset, or an
-	// external reset is issued.
-	//
-	// The FIFO accepts strobe and data from the receiver.
-	// We issue another wire to it (rxf_wb_read), true when we wish to read
-	// from the FIFO, and we get our data in rxf_wb_data.  The FIFO outputs
-	// four status-type values: 1) is it non-empty, 2) is the FIFO over half
-	// full, 3) a 16-bit status register, containing info regarding how full
-	// the FIFO truly is, and 4) an error indicator.
-	ufifo	#(.LGFLEN(LCLLGFLEN), .RXFIFO(1))
-		rxfifo(i_clk, (i_reset)||(rx_break)||(rx_uart_reset),
-			rx_stb, rx_uart_data,
-			rx_empty_n,
-			rxf_wb_read, rxf_wb_data,
-			rxf_status, rx_fifo_err);
-	// }}}
-
-	assign	o_uart_rxfifo_int = rxf_status[1];
-
-	// We produce four interrupts.  One of the receive interrupts indicates
-	// whether or not the receive FIFO is non-empty.  This should wake up
-	// the CPU.
-	assign	o_uart_rx_int = rxf_status[0];
-
-	// o_rts_n
-	// {{{
-	// The clear to send line, which may be ignored, but which we set here
-	// to be true any time the FIFO has fewer than N-2 items in it.
-	// Why not N-1?  Because at N-1 we are totally full, but already so full
-	// that if the transmit end starts sending we won't have a location to
-	// receive it.  (Transmit might've started on the next character by the
-	// time we set this--thus we need to set it to one, one character before
-	// necessary).
-	assign	check_cutoff = -3;
-	always @(posedge i_clk)
-		o_rts_n <= ((HARDWARE_FLOW_CONTROL_PRESENT)
-			&&(!uart_setup[30])
-			&&(rxf_status[(LCLLGFLEN+1):2] > check_cutoff));
-	// }}}
-
-	// rxf_wb_read
-	// {{{
-	// If the bus requests that we read from the receive FIFO, we need to
-	// tell this to the receive FIFO.  Note that because we are using a 
-	// clock here, the output from the receive FIFO will necessarily be
-	// delayed by an extra clock.
-	initial	rxf_wb_read = 1'b0;
-	always @(posedge i_clk)
-		rxf_wb_read <= (i_wb_stb)&&(i_wb_addr[1:0]== UART_RXREG)
-				&&(!i_wb_we);
-	// }}}
-
-	// r_rx_perr, r_rx_ferr -- parity and framing errors
-	// {{{
-	// Now, let's deal with those RX UART errors: both the parity and frame
-	// errors.  As you may recall, these are valid only when rx_stb is
-	// valid, so we need to hold on to them until the user reads them via
-	// a UART read request..
-	initial	r_rx_perr = 1'b0;
-	initial	r_rx_ferr = 1'b0;
-	always @(posedge i_clk)
-	if ((rx_uart_reset)||(rx_break))
-	begin
-		// Clear the error
-		r_rx_perr <= 1'b0;
-		r_rx_ferr <= 1'b0;
-	end else if ((i_wb_stb)
-			&&(i_wb_addr[1:0]== UART_RXREG)&&(i_wb_we))
-	begin
-		// Reset the error lines if a '1' is ever written to
-		// them, otherwise leave them alone.
-		//
-		if (i_wb_sel[1])
-		begin
-			r_rx_perr <= (r_rx_perr)&&(~i_wb_data[9]);
-			r_rx_ferr <= (r_rx_ferr)&&(~i_wb_data[10]);
-		end
-	end else if (rx_stb)
-	begin
-		// On an rx_stb, capture any parity or framing error
-		// indications.  These aren't kept with the data rcvd,
-		// but rather kept external to the FIFO.  As a result,
-		// if you get a parity or framing error, you will never
-		// know which data byte it was associated with.
-		// For now ... that'll work.
-		r_rx_perr <= (r_rx_perr)||(rx_perr);
-		r_rx_ferr <= (r_rx_ferr)||(rx_ferr);
-	end
-	// }}}
-
-	// rx_uart_reset
-	// {{{
-	initial	rx_uart_reset = 1'b1;
-	always @(posedge i_clk)
-	if ((i_reset)||((i_wb_stb)&&(i_wb_addr[1:0]== UART_SETUP)&&(i_wb_we)))
-		// The receiver reset, always set on a master reset
-		// request.
-		rx_uart_reset <= 1'b1;
-	else if ((i_wb_stb)&&(i_wb_addr[1:0]== UART_RXREG)&&(i_wb_we)&&i_wb_sel[1])
-		// Writes to the receive register will command a receive
-		// reset anytime bit[12] is set.
-		rx_uart_reset <= i_wb_data[12];
-	else
-		rx_uart_reset <= 1'b0;
-	// }}}
-
-	// wb_rx_data
-	// {{{
-	// Finally, we'll construct a 32-bit value from these various wires,
-	// to be returned over the bus on any read.  These include the data
-	// that would be read from the FIFO, an error indicator set upon
-	// reading from an empty FIFO, a break indicator, and the frame and
-	// parity error signals.
-	assign	wb_rx_data = { 16'h00,
-				3'h0, rx_fifo_err,
-				rx_break, rx_ferr, r_rx_perr, !rx_empty_n,
-				rxf_wb_data};
-	// }}}
-	// }}}
-	////////////////////////////////////////////////////////////////////////
-	//
-	// The UART transmitter
-	// {{{
-	////////////////////////////////////////////////////////////////////////
-	//
-	//
-
-	// txf_wb_write, txf_wb_data
-	// {{{
-	// Unlike the receiver which goes from RXUART -> UFIFO -> WB, the
-	// transmitter basically goes WB -> UFIFO -> TXUART.  Hence, to build
-	// support for the transmitter, we start with the command to write data
-	// into the FIFO.  In this case, we use the act of writing to the 
-	// UART_TXREG address as our indication that we wish to write to the 
-	// FIFO.  Here, we create a write command line, and latch the data for
-	// the extra clock that it'll take so that the command and data can be
-	// both true on the same clock.
-	initial	txf_wb_write = 1'b0;
-	always @(posedge i_clk)
-	begin
-		txf_wb_write <= (i_wb_stb)&&(i_wb_addr == UART_TXREG)
-					&&(i_wb_we)&&(i_wb_sel[0]);
-		txf_wb_data  <= i_wb_data[7:0];
-	end
-	// }}}
-
-	// Transmit FIFO
-	// {{{
-	// Most of this is just wire management.  The TX FIFO is identical in
-	// implementation to the RX FIFO (theyre both UFIFOs), but the TX
-	// FIFO is fed from the WB and read by the transmitter.  Some key
-	// differences to note: we reset the transmitter on any request for a
-	// break.  We read from the FIFO any time the UART transmitter is idle.
-	// and ... we just set the values (above) for controlling writing into
-	// this.
-	// ufifo	#(.LGFLEN(LGFLEN), .RXFIFO(0))
-	// 	txfifo(i_clk, (tx_break)||(tx_uart_reset),
-	// 		txf_wb_write, txf_wb_data,
-	// 		tx_empty_n,
-	// 		(!tx_busy)&&(tx_empty_n), tx_data,
-	// 		txf_status, txf_err);
-	// }}}
-
-	// Transmit interrupts
-	// {{{
-	// Let's create two transmit based interrupts from the FIFO for the CPU.
-	//	The first will be true any time the FIFO has at least one open
-	//	position within it.
-	assign	o_uart_tx_int = 1'b0;
-	//	The second will be true any time the FIFO is less than half
-	//	full, allowing us a change to always keep it (near) fully 
-	//	charged.
-	assign	o_uart_txfifo_int = 1'b0;
-	// }}}
-
-	// Break logic
-`ifndef	USE_LITE_UART
-	// {{{
-	// A break in a UART controller is any time the UART holds the line
-	// low for an extended period of time.  Here, we capture the wb_data[9]
-	// wire, on writes, as an indication we wish to break.  As long as you
-	// write unsigned characters to the interface, this will never be true
-	// unless you wish it to be true.  Be aware, though, writing a valid
-	// value to the interface will bring it out of the break condition.
-	reg	r_tx_break;
-	initial	r_tx_break = 1'b0;
-	always @(posedge i_clk)
-	if (i_reset)
-		r_tx_break <= 1'b0;
-	else if ((i_wb_stb)&&(i_wb_addr[1:0]== UART_TXREG)&&(i_wb_we)
-		&&(i_wb_sel[1]))
-		r_tx_break <= i_wb_data[9];
-
-	assign	tx_break = r_tx_break;
-	// }}}
-`else
-	// {{{
-	assign	tx_break = 1'b0;
-	// }}}
-`endif
-
-	// TX-Reset logic
-	// {{{{
-	// This is nearly identical to the RX reset logic above.  Basically,
-	// any time someone writes to bit [12] the transmitter will go through
-	// a reset cycle.  Keep bit [12] low, and everything will proceed as
-	// normal.
-	initial	tx_uart_reset = 1'b1;
-	always @(posedge i_clk)
-	if((i_reset)||((i_wb_stb)&&(i_wb_addr ==  UART_SETUP)&&(i_wb_we)))
-		tx_uart_reset <= 1'b1;
-	else if ((i_wb_stb)&&(i_wb_addr[1:0]== UART_TXREG)&&(i_wb_we) && i_wb_sel[1])
-		tx_uart_reset <= i_wb_data[12];
-	else
-		tx_uart_reset <= 1'b0;
-	// }}}
-
-	// The actuall transmitter itself
-`ifdef	USE_LITE_UART
-	// {{{
-	txuartlite #(.CLOCKS_PER_BAUD(INITIAL_SETUP[23:0])) tx(i_clk, txf_wb_write, txf_wb_data,
-			o_uart_tx, tx_busy);
-	// }}}
-`else
-	// cts_n
-	// {{{
-	wire	cts_n;
-	assign	cts_n = (HARDWARE_FLOW_CONTROL_PRESENT)&&(i_cts_n);
-	// }}}
-
-	// The *full* transmitter impleemntation
-	// {{{
-	// Finally, the UART transmitter module itself.  Note that we haven't
-	// connected the reset wire.  Transmitting is as simple as setting
-	// the stb value (here set to tx_empty_n) and the data.  When these
-	// are both set on the same clock that tx_busy is low, the transmitter
-	// will move on to the next data byte.  Really, the only thing magical
-	// here is that tx_empty_n wire--thus, if there's anything in the FIFO,
-	// we read it here.  (You might notice above, we register a read any
-	// time (tx_empty_n) and (!tx_busy) are both true---the condition for
-	// starting to transmit a new byte.)
-	txuart	#(.INITIAL_SETUP(INITIAL_SETUP)) tx(i_clk, 1'b0, uart_setup,
-			r_tx_break, (tx_empty_n), tx_data,
-			cts_n, o_uart_tx, tx_busy);
-	// }}}
-`endif
-
-	// wb_tx_data
-	// {{{
-	// Now that we are done with the chain, pick some wires for the user
-	// to read on any read of the transmit port.
-	//
-	// This port is different from reading from the receive port, since
-	// there are no side effects.  (Reading from the receive port advances
-	// the receive FIFO, here only writing to the transmit port advances the
-	// transmit FIFO--hence the read values are free for ... whatever.)  
-	// We choose here to provide information about the transmit FIFO
-	// (txf_err, txf_half_full, txf_full_n), information about the current
-	// voltage on the line (o_uart_tx)--and even the voltage on the receive
-	// line (ck_uart), as well as our current setting of the break and
-	// whether or not we are actively transmitting.
-	// assign	wb_tx_data = { 16'h00, 
-	// 		i_cts_n, txf_status[1:0], txf_err,
-	// 		ck_uart, o_uart_tx, tx_break, (tx_busy|txf_status[0]),
-	// 		(tx_busy|txf_status[0])?txf_wb_data:8'b00};
-
-	assign wb_tx_data = {24'd0, txf_wb_data};
-	// }}}
-	// }}}
-	////////////////////////////////////////////////////////////////////////
-	//
-	// Bus / register handling
-	// {{{
-	////////////////////////////////////////////////////////////////////////
-	//
-	//
-
-
-	// wb_fifo_data
-	// {{{
-	// Each of the FIFO's returns a 16 bit status value.  This value tells
-	// us both how big the FIFO is, as well as how much of the FIFO is in 
-	// use.  Let's merge those two status words together into a word we
-	// can use when reading about the FIFO.
-	//assign	wb_fifo_data = { txf_status, rxf_status };
-	assign	wb_fifo_data = { 16'd0, rxf_status };		
-	// }}}
-
-	// r_wb_addr
-	// {{{
-	// You may recall from above that reads take two clocks.  Hence, we
-	// need to delay the address decoding for a clock until the data is 
-	// ready.  We do that here.
-	always @(posedge i_clk)
-		r_wb_addr <= i_wb_addr;
-	// }}}
-
-	// r_wb_ack
-	// {{{
-	initial	r_wb_ack = 1'b0;
-	always @(posedge i_clk) // We'll ACK in two clocks
-		r_wb_ack <= i_wb_stb;
-	// }}}
-
-	// o_wb_ack
-	// {{{
-	initial	o_wb_ack = 1'b0;
-	always @(posedge i_clk) // Okay, time to set the ACK
-		o_wb_ack <= i_wb_cyc && r_wb_ack;
-	// }}}
-
-	// o_wb_data
-	// {{{
-	// Finally, set the return data.  This data must be valid on the same
-	// clock o_wb_ack is high.  On all other clocks, it is irrelelant--since
-	// no one cares, no one is reading it, it gets lost in the mux in the
-	// interconnect, etc.  For this reason, we can just simplify our logic.
-	always @(posedge i_clk)
-	casez(r_wb_addr)
-	UART_SETUP: o_wb_data <= { 1'b0, uart_setup };
-	UART_FIFO:  o_wb_data <= wb_fifo_data;
-	UART_RXREG: o_wb_data <= wb_rx_data;
-	UART_TXREG: o_wb_data <= wb_tx_data;
-	endcase
-	// }}}
-
-	// o_wb_stall
-	// {{{
-	// This device never stalls.  Sure, it takes two clocks, but they are
-	// pipelined, and nothing stalls that pipeline.  (Creates FIFO errors,
-	// perhaps, but doesn't stall the pipeline.)  Hence, we can just
-	// set this value to zero.
-	assign	o_wb_stall = 1'b0;
-	// }}}
-	// }}}
-
-	// Make verilator happy
-	// {{{
-	// verilator lint_off UNUSED
-	wire	unused;
-	assign	unused = &{ 1'b0, i_wb_data[31] };
-	// verilator lint_on UNUSED
-	// }}}
-endmodule
diff --git a/verilog/dv/wb_sram/wb_sram.c b/verilog/dv/wb_sram/wb_sram.c
index 5f9c1c3..49a012d 100644
--- a/verilog/dv/wb_sram/wb_sram.c
+++ b/verilog/dv/wb_sram/wb_sram.c
@@ -90,10 +90,10 @@
     volatile unsigned dummy;
     bool error = false;
     //writing to master key
-    *(reg_SRAM) = 0xDEADBEEF;
     *(reg_SRAM) = 0xCAFEBEEF;
-    *(reg_SRAM) = 0x01234567;
-    *(reg_SRAM) = 0x89abcdef;
+    // *(reg_SRAM) = 0xCAFEBEEF;
+    // *(reg_SRAM) = 0x01234567;
+    // *(reg_SRAM) = 0x89abcdef;
 
 
 
@@ -102,15 +102,19 @@
     *(reg_SRAM+(2*4)) = 0xDEADBEEF;
 
     //wait for wr_busy
-    while(*(reg_SRAM +2) != 0);
+    //while(*(reg_SRAM +2) != 0);
 
-    dummy = *(reg_SRAM + (2 * 4));
+    //dummy = *(reg_SRAM + (2 * 4));
 
     //wait for rd_busy
-    while(*(reg_SRAM + 2) != 0);
+   // while(*(reg_SRAM + 2) != 0);
 
-    if(*(reg_SRAM + 1) != 0xDEADBEEF)
+    //if(*(reg_SRAM + 1) != 0xDEADBEEF)
+    //    error = true;
+
+    if(*(reg_SRAM+(2*4)) != 0xDEADBEEF)
         error = true;
+
     // for (int i = 0; i < 32; i++)
     // {
     //    if(*(reg_SRAM+(i*4)) != i * 1024 )
diff --git a/verilog/includes/includes.rtl.caravel_user_project b/verilog/includes/includes.rtl.caravel_user_project
index d0827e5..37f25a5 100644
--- a/verilog/includes/includes.rtl.caravel_user_project
+++ b/verilog/includes/includes.rtl.caravel_user_project
@@ -2,7 +2,8 @@
 -v $(USER_PROJECT_VERILOG)/rtl/user_project_wrapper.v
 -v $(USER_PROJECT_VERILOG)/rtl/user_proj_example.v
 -v $(USER_PROJECT_VERILOG)/rtl/simpleUART/simple_uart.v
--v $(USER_PROJECT_VERILOG)/rtl/sram/sram_wb_wrapper.sv
+#-v $(USER_PROJECT_VERILOG)/rtl/sram/sram_wb_wrapper.sv
+-v $(USER_PROJECT_VERILOG)/rtl/sram/sram_wb_wrapper_xor.sv
 -v $(USER_PROJECT_VERILOG)/rtl/aes/aes.v
 -v $(USER_PROJECT_VERILOG)/rtl/security_monitor/lfsr.v
 -v $(USER_PROJECT_VERILOG)/rtl/spi/tiny_spi.v
diff --git a/verilog/rtl/sram/sram_wb_wrapper_xor.sv b/verilog/rtl/sram/sram_wb_wrapper_xor.sv
new file mode 100644
index 0000000..c85a374
--- /dev/null
+++ b/verilog/rtl/sram/sram_wb_wrapper_xor.sv
@@ -0,0 +1,146 @@
+//-----------------------------------------------------------------------------
+// @file      sram_wb_wrapper.vhd
+//
+// @brief     This block is a wishbone wrapper for SRAM signal mapping
+//
+// @details   This wrapper gets signal from master if it is selected
+//			  and convey to the SRAM module and vice versa.
+//
+// @author    Sukru Uzun <sukru.uzun@procenne.com>
+// @date      10.03.2022
+//
+// @todo 	  SRAM signalization should be checked
+// @warning	  SRAM signalization
+//
+// @project   https://github.com/Procenne-Digital-Design/secure-memory.git
+//
+// @revision :
+//    0.1 - 10 March 2022, Sukru Uzun
+//          initial version
+//    0.2 - 16 March 2022, Sukru Uzun
+//          remove SRAM design
+//    0.3 - 20 March 2022, Emre Goncu
+//          adding ciphering mechanism
+//-----------------------------------------------------------------------------
+
+module sram_wb_wrapper #(
+  parameter SRAM_ADDR_WD = 8 ,
+  parameter SRAM_DATA_WD = 32
+) (
+`ifdef USE_POWER_PINS
+  input  wire                      vccd1           , // User area 1 1.8V supply
+  input  wire                      vssd1           , // User area 1 digital ground
+`endif
+  input  wire                      rst             ,
+  // Wishbone Interface
+  input  wire                      wb_clk_i        , // System clock
+  input  wire                      wb_cyc_i        , // strobe/request
+  input  wire                      wb_stb_i        , // strobe/request
+  input  wire [  SRAM_ADDR_WD-1:0] wb_adr_i        , // address
+  input  wire                      wb_we_i         , // write
+  input  wire [  SRAM_DATA_WD-1:0] wb_dat_i        , // data output
+  input  wire [SRAM_DATA_WD/8-1:0] wb_sel_i        , // byte enable
+  output wire  [  SRAM_DATA_WD-1:0] wb_dat_o        , // data input
+  output reg                       wb_ack_o        , // acknowlegement
+  // SRAM Interface
+  // Port A
+  output wire                       sram_csb_a      ,
+  output wire [  SRAM_ADDR_WD-1:0] sram_addr_a     ,
+  input  wire [  SRAM_DATA_WD-1:0] sram_dout_a     ,
+  // Port B
+  output wire                       sram_csb_b      ,
+  output wire                       sram_web_b      ,
+  output wire  [SRAM_DATA_WD/8-1:0] sram_mask_b     ,
+  output wire  [  SRAM_ADDR_WD-1:0] sram_addr_b     ,
+  output wire  [  SRAM_DATA_WD-1:0] sram_din_b      ,
+  output reg                       master_key_ready,
+  input  wire [              31:0] trng_i          ,
+  input  wire                      alarm           ,
+  output reg                       alarm_set
+);
+
+
+  wire         master_key_en        ;
+  reg [31:0]   master_key           ;
+  reg  [  1:0] counter              ;
+  reg  [  4:0] trng_count           ;
+
+  reg [8:0] wb_adr_reg;
+
+
+  assign master_key_en = rst ? 1'b0 :
+    ((alarm)|| ((wb_adr_i == 32'd0) && wb_cyc_i && wb_stb_i && wb_we_i && !wb_ack_o)) ? 1'b1 : 1'b0;
+
+  always @(posedge wb_clk_i ) begin
+    if(rst)
+      begin
+        alarm_set <= 1'b0;
+      end
+    else
+      if((wb_adr_i == 32'd3) && wb_cyc_i && wb_stb_i && wb_we_i && !wb_ack_o)
+        begin
+          alarm_set <= ~alarm_set;
+        end
+  end
+
+  always @(posedge wb_clk_i) begin
+    if(rst)
+      begin
+        master_key       <= 32'd0;
+        trng_count       <= 5'd0;
+        master_key_ready <= 1'b0;
+      end
+    else
+      begin
+        master_key_ready <= 1'b0;
+        if(master_key_en)
+          begin
+            if(wb_dat_i)
+              begin
+                master_key       <= wb_dat_i;
+                master_key_ready <= 1'b1;
+              end
+            else
+              begin
+                master_key <= trng_i;
+              end
+          end
+      end
+  end
+
+
+  assign sram_csb_b  = !wb_stb_i;
+  assign sram_web_b  = !wb_we_i;
+  assign sram_mask_b = wb_sel_i;
+  assign sram_addr_b = wb_adr_i;
+  assign sram_din_b  = wb_dat_i ^ master_key;
+
+
+  assign sram_csb_a  = (wb_stb_i == 1'b1 && wb_we_i == 1'b0 && wb_cyc_i == 1'b1) ? 1'b0 : 1'b1;
+  assign sram_addr_a = wb_adr_i;
+
+  assign wb_dat_o = (wb_adr_reg == 9'd1 && wb_ack_o == 1'b1) ? {31'd0,alarm} : 
+                    (wb_ack_o == 1'b1) ? sram_dout_a ^ master_key : 32'd0; 
+
+
+// Generate once cycle delayed ACK to get the data from SRAM
+  always @(posedge wb_clk_i)
+    begin
+      if ( rst == 1'b1 )
+        begin
+          wb_ack_o <= 1'b0;
+          wb_adr_reg <= 9'd0;
+        end
+      else
+        begin
+          if((wb_stb_i == 1'b1) && (wb_cyc_i == 1'b1))
+          begin
+            wb_ack_o <= 1'b1 ;
+            wb_adr_reg <= wb_adr_i;
+          end
+          else 
+            wb_ack_o <= 1'b0 ;
+       end
+    end
+
+endmodule
diff --git a/verilog/rtl/user_proj_example.v b/verilog/rtl/user_proj_example.v
index b2e6506..de6ff88 100644
--- a/verilog/rtl/user_proj_example.v
+++ b/verilog/rtl/user_proj_example.v
@@ -238,7 +238,7 @@
     .sram_mask_b(sram_mask_b),
     .sram_addr_b(sram_addr_b),
     .sram_din_b (sram_din_b ),
-    .trng_i(trng_i),
+    .trng_i(trng_buffer_i),
     .alarm(alarm),
     .master_key_ready(master_key_ready),
     .alarm_set(alarm_set)
@@ -280,8 +280,8 @@
     .i_Clk (wb_clk_i ),
     .i_Enable (1'b1 ),
     .i_alarm_set (alarm_set),
-    .i_Seed_DV (wb_rst_i ),
-    .i_Seed_Data (trng_i ),
+    .i_Seed_DV (trng_wb_cyc_o),
+    .i_Seed_Data (trng_buffer_i ),
     .o_LFSR_Data (o_LFSR_Data ),
     .o_LFSR_Done  (),
     .i_LFSR ( io_in[17]),
