pull the git change from https://github.com/dineshannayya/riscduino.git on 15th Feb 2022 with SRAM
diff --git a/verilog/dv/model/spiram.v b/verilog/dv/model/spiram.v
new file mode 100644
index 0000000..cd33c11
--- /dev/null
+++ b/verilog/dv/model/spiram.v
@@ -0,0 +1,329 @@
+`default_nettype none
+/*
+ *  SPDX-FileCopyrightText: 2022 <Dinesh Annayya>
+ *
+ *  Riscdunio 
+ *
+ *  Copyright (C) 2022  Dinesh Annayya <dinesha.opencore.org>
+ *
+ *  Permission to use, copy, modify, and/or distribute this software for any
+ *  purpose with or without fee is hereby granted, provided that the above
+ *  copyright notice and this permission notice appear in all copies.
+ *
+ *  THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+ *  WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+ *  MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+ *  ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+ *  WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+ *  ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
+ *  OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+ *
+ *  SPDX-License-Identifier: ISC
+ */
+
+`timescale 1 ns / 1 ps
+
+//
+// Simple SPI Ram simulation model for 128Kx8 LOW VOLTAGE, FAST SERIAL SRAM
+// (IS62/65WVS1288GALL)
+//
+// This model samples io input signals 1ns before the SPI clock edge and
+// updates output signals 1ns after the SPI clock edge.
+//
+// Supported commands:
+//    0x03, 0x02, 0x3B , 0x38, 0xFF, 0x05 , 0x01
+//    Instruction   Hex     Description
+//    READ          0x03    Read data from memory array beginning at selected address
+//    WRITE         0x02    Write data to memory array beginning at selected address
+//    ESDI          0x3B    Enter SDI mode
+//    ESQI          0x38    Enter SQI mode
+//    RSTDQI        0xFF    Reset SDI/SQI mode
+//    RDMR          0x05    Read Mode Register
+//    WRMR          0x01    Write Mode Register
+//
+
+module spiram #(
+	parameter mem_file_name = "firmware.hex"
+)(
+	input csb,
+	input clk,
+	inout io0, // MOSI
+	inout io1, // MISO
+	inout io2,
+	inout io3
+);
+	localparam verbose = 0;
+	localparam integer latency = 8;
+	
+	reg [7:0] buffer;
+	reg [3:0] reset_count = 0;
+	reg [3:0] reset_monitor = 0;
+	integer bitcount = 0;
+	integer bytecount = 0;
+	integer dummycount = 0;
+
+	reg [7:0] spi_cmd;
+	reg [23:0] spi_addr;
+
+	reg [7:0] spi_in;
+	reg [7:0] spi_out;
+	reg spi_io_vld;
+
+
+	localparam [1:0] sspi     = 1;
+	localparam [1:0] dspi     = 2;
+	localparam [1:0] qspi     = 3;
+
+	localparam [3:0] mode_sspi_rd     = 1;
+	localparam [3:0] mode_sspi_wr     = 2;
+	localparam [3:0] mode_dspi_rd     = 3;
+	localparam [3:0] mode_dspi_wr     = 4;
+	localparam [3:0] mode_qspi_rd     = 5;
+	localparam [3:0] mode_qspi_wr     = 6;
+
+	reg [3:0] spi_phase = mode_sspi_rd;
+	reg [3:0] spi_data_phase = 0;
+	reg [3:0] spi_mode = sspi;
+
+	reg io0_oe = 0;
+	reg io1_oe = 0;
+	reg io2_oe = 0;
+	reg io3_oe = 0;
+
+	reg io0_dout = 0;
+	reg io1_dout = 0;
+	reg io2_dout = 0;
+	reg io3_dout = 0;
+
+	assign #1 io0 = io0_oe ? io0_dout : 1'bz;
+	assign #1 io1 = io1_oe ? io1_dout : 1'bz;
+	assign #1 io2 = io2_oe ? io2_dout : 1'bz;
+	assign #1 io3 = io3_oe ? io3_dout : 1'bz;
+
+	wire io0_delayed;
+	wire io1_delayed;
+	wire io2_delayed;
+	wire io3_delayed;
+
+	assign #1 io0_delayed = io0;
+	assign #1 io1_delayed = io1;
+	assign #1 io2_delayed = io2;
+	assign #1 io3_delayed = io3;
+
+	// 128KB RAM
+	reg [7:0] memory [0:128*1024-1];
+
+	initial begin
+           if (!(mem_file_name == "none"))
+              $readmemh(mem_file_name,memory);
+	end
+
+	task spi_action;
+		begin
+		   spi_in = buffer;
+
+		   if (bytecount == 1) begin
+		   	spi_cmd = buffer;
+
+			if (spi_cmd == 8'h 3b) begin
+		   		spi_mode = dspi;
+			end
+
+			if (spi_cmd == 8'h 38) begin
+		   		spi_mode = qspi;
+			end
+
+			if (spi_cmd == 8'h ff) begin
+		   		spi_mode = sspi;
+			end
+
+			// spi read
+		   	if (spi_cmd == 8'h 03 && spi_mode == sspi)
+			   spi_phase = mode_sspi_rd;
+
+		        // spi write
+		   	if (spi_cmd == 8'h 02 && spi_mode == sspi)
+			   spi_phase = mode_sspi_wr;
+
+		        // dual spi read
+		   	if (spi_cmd == 8'h 03 && spi_mode == dspi)
+			   spi_phase = mode_dspi_rd;
+
+		        // dual spi write
+		   	if (spi_cmd == 8'h 02 && spi_mode == dspi)
+			   spi_phase = mode_dspi_wr;
+
+		        // quad spi read
+		   	if (spi_cmd == 8'h 03 && spi_mode == qspi)
+			   spi_phase = mode_qspi_rd;
+
+		        // quad spi write
+		   	if (spi_cmd == 8'h 02 && spi_mode == qspi)
+			   spi_phase = mode_qspi_wr;
+		   end
+
+		   if (spi_cmd == 'h 03 || (spi_cmd == 'h 02)) begin
+		   	if (bytecount == 2)
+		   		spi_addr[23:16] = buffer;
+
+		   	if (bytecount == 3)
+		   		spi_addr[15:8] = buffer;
+
+			if (bytecount == 4) begin
+		   	   spi_addr[7:0] = buffer;
+			   spi_data_phase = spi_phase;
+			end
+
+			// Dummy by selection at end of address phase for read
+			// mode only
+		   	if (bytecount == 4 && spi_mode == sspi && spi_cmd ==8'h03 )
+				dummycount = 8;
+		   	if (bytecount == 4 && spi_mode == dspi && spi_cmd ==8'h03)
+				dummycount = 4;
+		   	if (bytecount == 4 && spi_mode == qspi && spi_cmd ==8'h03)
+				dummycount = 2;
+
+		   	if (bytecount >= 4 && spi_cmd ==8'h03) begin // Data Read Phase
+		   		buffer = memory[spi_addr];
+				//$display("%m: Read Memory Address: %x Data: %x",spi_addr,buffer);
+		   		spi_addr = spi_addr + 1;
+		   	end
+		   	if (bytecount > 4 && spi_cmd ==8'h02) begin // Data Write Phase
+		   		memory[spi_addr] = buffer;
+				//$display("%m: Write Memory Address: %x Data: %x",spi_addr,buffer);
+		   		spi_addr = spi_addr + 1;
+		   	end
+		   end
+
+			spi_out = buffer;
+			spi_io_vld = 1;
+
+			if (verbose) begin
+				if (bytecount == 1)
+					$write("<SPI-START>");
+				$write("<SPI:%02x:%02x>", spi_in, spi_out);
+			end
+
+		end
+	endtask
+
+
+	always @(csb) begin
+		if (csb) begin
+			if (verbose) begin
+				$display("");
+				$fflush;
+			end
+			buffer = 0;
+			bitcount = 0;
+			bytecount = 0;
+			io0_oe = 0;
+			io1_oe = 0;
+			io2_oe = 0;
+			io3_oe = 0; 
+			spi_data_phase = 0;
+
+		end
+	end
+
+
+	always @(csb, clk) begin
+		spi_io_vld = 0;
+		if (!csb && !clk) begin
+			if (dummycount > 0) begin
+				io0_oe = 0;
+				io1_oe = 0;
+				io2_oe = 0;
+				io3_oe = 0;
+			end else
+			case (spi_data_phase)
+				mode_sspi_rd: begin
+					io0_oe = 0;
+					io1_oe = 1;
+					io2_oe = 0;
+					io3_oe = 0;
+					io1_dout = buffer[7];
+				end
+				mode_sspi_wr: begin
+					io0_oe = 0;
+					io1_oe = 0;
+					io2_oe = 0;
+					io3_oe = 0;
+				end
+				mode_dspi_wr: begin
+					io0_oe = 0;
+					io1_oe = 0;
+					io2_oe = 0;
+					io3_oe = 0;
+				end
+				mode_dspi_rd: begin
+					io0_oe = 1;
+					io1_oe = 1;
+					io2_oe = 0;
+					io3_oe = 0;
+					io0_dout = buffer[6];
+					io1_dout = buffer[7];
+				end
+				mode_qspi_wr: begin
+					io0_oe = 0;
+					io1_oe = 0;
+					io2_oe = 0;
+					io3_oe = 0;
+				end
+				mode_qspi_rd: begin
+					io0_oe = 1;
+					io1_oe = 1;
+					io2_oe = 1;
+					io3_oe = 1;
+					io0_dout = buffer[4];
+					io1_dout = buffer[5];
+					io2_dout = buffer[6];
+					io3_dout = buffer[7];
+				end
+				default: begin
+					io0_oe = 0;
+					io1_oe = 0;
+					io2_oe = 0;
+					io3_oe = 0;
+				end
+			endcase
+		end
+	end
+
+	always @(posedge clk) begin
+		if (!csb) begin
+			if (dummycount > 0) begin
+				dummycount = dummycount - 1;
+			end else
+			case (spi_mode)
+				sspi: begin
+					buffer = {buffer, io0};
+					bitcount = bitcount + 1;
+					if (bitcount == 8) begin
+						bitcount = 0;
+						bytecount = bytecount + 1;
+						spi_action;
+					end
+				end
+				dspi: begin
+					buffer = {buffer, io1, io0};
+					bitcount = bitcount + 2;
+					if (bitcount == 8) begin
+						bitcount = 0;
+						bytecount = bytecount + 1;
+						spi_action;
+					end
+				end
+				qspi: begin
+					buffer = {buffer, io3, io2, io1, io0};
+					bitcount = bitcount + 4;
+					if (bitcount == 8) begin
+						bitcount = 0;
+						bytecount = bytecount + 1;
+						spi_action;
+					end
+				end
+			endcase
+		end
+	end
+endmodule