system strap implementation + boot sequence change
diff --git a/README.md b/README.md
index 995e370..ae4ea1c 100644
--- a/README.md
+++ b/README.md
@@ -87,6 +87,9 @@
   <tr>
     <td  align="center"><img src="./docs/source/_static/Riscduino-derivatives.png" ></td>
   </tr>
+  <tr>
+    <td  align="center"><img src="./docs/source/_static/Riscduino_Series_placement.png" ></td>
+  </tr>
 
 </table>
 
@@ -128,7 +131,7 @@
   <tr>
     <td  align="center"> MPW-5 </td> 
     <td  align="center"> 21-Mar-2022  </td>
-    <td  align="center"> Riscduino-SCORE</td>
+    <td  align="center"> Riscduino-SCORE (S0)</td>
     <td  align="center"> Single 32bit RISCV core with cache + Onchip SRAM+ WB Cross Bar</td>
     <td  align="center"> <a href="https://github.com/dineshannayya/riscduino">Link</a></td>
     <td  align="center"> <a href="https://platform.efabless.com/projects/670">Link</a></td>
@@ -136,7 +139,7 @@
   <tr>
     <td  align="center"> MPW-5 </td> 
     <td  align="center"> 21-Mar-2022  </td>
-    <td  align="center"> Riscduino-DCORE</td>
+    <td  align="center"> Riscduino-DCORE (D0)</td>
     <td  align="center"> Dual 32bit RISCV core with cache + Onchip SRAM+ WB Cross Bar</td>
     <td  align="center"> <a href="https://github.com/dineshannayya/riscduino_dcore">Link</a></td>
     <td  align="center"> <a href="https://platform.efabless.com/projects/718">Link</a></td>
@@ -144,11 +147,35 @@
   <tr>
     <td  align="center"> MPW-5 </td> 
     <td  align="center"> 21-Mar-2022  </td>
-    <td  align="center"> Riscduino-QCORE</td>
+    <td  align="center"> Riscduino-QCORE (Q0)</td>
     <td  align="center"> Quad 32bit RISCV core with cache + Onchip SRAM+ WB Cross Bar</td>
     <td  align="center"> <a href="https://github.com/dineshannayya/riscduino_qcore">Link</a></td>
     <td  align="center"> <a href="https://platform.efabless.com/projects/782">Link</a></td>
   </tr>
+  <tr>
+    <td  align="center"> MPW-6 </td> 
+    <td  align="center"> 07-June-2022  </td>
+    <td  align="center"> Riscduino-SCORE (S3)</td>
+    <td  align="center"> Single 32bit RISCV core with cache + Onchip SRAM+ WB Cross Bar</td>
+    <td  align="center"> <a href="https://github.com/dineshannayya/riscduino">Link</a></td>
+    <td  align="center"> <a href="https://platform.efabless.com/projects/1047">Link</a></td>
+  </tr>
+  <tr>
+    <td  align="center"> MPW-6 </td> 
+    <td  align="center"> 07-June-2022  </td>
+    <td  align="center"> Riscduino-DCORE (D1)</td>
+    <td  align="center"> Dual 32bit RISCV core with cache + Onchip SRAM+ WB Cross Bar</td>
+    <td  align="center"> <a href="https://github.com/dineshannayya/riscduino_dcore">Link</a></td>
+    <td  align="center"> <a href="https://platform.efabless.com/projects/838">Link</a></td>
+  </tr>
+  <tr>
+    <td  align="center"> MPW-6 </td> 
+    <td  align="center"> 07-June-2022 </td>
+    <td  align="center"> Riscduino-QCORE (Q1)</td>
+    <td  align="center"> Quad 32bit RISCV core with cache + Onchip SRAM+ WB Cross Bar</td>
+    <td  align="center"> <a href="https://github.com/dineshannayya/riscduino_qcore">Link</a></td>
+    <td  align="center"> <a href="https://platform.efabless.com/projects/839">Link</a></td>
+  </tr>
 </table>
 
 # SOC Pin Mapping
@@ -162,49 +189,50 @@
 
 <table>
   <tr align="center"> <td> ATMGA328 Pin No</td> <td> Functionality           </td> <td> Arudino Pin Name</td> <td> Carvel Pin Mapping                   </td></tr>
-  <tr align="center"> <td> Pin-1           </td> <td> PC6/RESET              </td> <td>                 </td> <td> digital_io[0]                        </td></tr>
-  <tr align="center"> <td> Pin-2           </td> <td> PD0/RXD[0]             </td> <td>  D0             </td> <td> digital_io[1]                        </td></tr>
-  <tr align="center"> <td> Pin-3           </td> <td> PD1/TXD[0]             </td> <td>  D1             </td> <td> digital_io[2]                        </td></tr>
-  <tr align="center"> <td> Pin-4           </td> <td> PD2/RXD[1]/INT0        </td> <td>  D2             </td> <td> digital_io[3]                        </td></tr>
-  <tr align="center"> <td> Pin-5           </td> <td> PD3/INT1/OC2B(PWM0)    </td> <td>  D3             </td> <td> digital_io[4]                        </td></tr>
-  <tr align="center"> <td> Pin-6           </td> <td> PD4/TXD[1]             </td> <td>  D4             </td> <td> digital_io[5]                        </td></tr>
+  <tr align="center"> <td> Pin-1           </td> <td> PC6/RESET              </td> <td>                 </td> <td> digital_io[5]                        </td></tr>
+  <tr align="center"> <td> Pin-2           </td> <td> PD0/RXD[0]             </td> <td>  D0             </td> <td> digital_io[6]                        </td></tr>
+  <tr align="center"> <td> Pin-3           </td> <td> PD1/TXD[0]             </td> <td>  D1             </td> <td> digital_io[7]                        </td></tr>
+  <tr align="center"> <td> Pin-4           </td> <td> PD2/RXD[1]/INT0        </td> <td>  D2             </td> <td> digital_io[8]                        </td></tr>
+  <tr align="center"> <td> Pin-5           </td> <td> PD3/INT1/OC2B(PWM0)    </td> <td>  D3             </td> <td> digital_io[9]                        </td></tr>
+  <tr align="center"> <td> Pin-6           </td> <td> PD4/TXD[1]             </td> <td>  D4             </td> <td> digital_io[10]                        </td></tr>
   <tr align="center"> <td> Pin-7           </td> <td> VCC                    </td> <td>                 </td> <td>  -                                   </td></tr>
   <tr align="center"> <td> Pin-8           </td> <td> GND                    </td> <td>                 </td> <td>  -                                   </td></tr>
-  <tr align="center"> <td> Pin-9           </td> <td> PB6/XTAL1/TOSC1        </td> <td>                 </td> <td> digital_io[6]                        </td></tr>
-  <tr align="center"> <td> Pin-10          </td> <td> PB7/XTAL2/TOSC2        </td> <td>                 </td> <td> digital_io[7]                        </td></tr>
-  <tr align="center"> <td> Pin-11          </td> <td> PD5/SS[3]/OC0B(PWM1)/T1      </td> <td> D5              </td> <td> digital_io[8]                        </td></tr>
-  <tr align="center"> <td> Pin-12          </td> <td> PD6/SS[2]/OC0A(PWM2)/AIN0    </td> <td> D6              </td> <td> digital_io[9] /analog_io[2]          </td></tr>
-  <tr align="center"> <td> Pin-13          </td> <td> PD7/A1N1               </td> <td> D7              </td> <td> digital_io[10]/analog_io[3]          </td></tr>
-  <tr align="center"> <td> Pin-14          </td> <td> PB0/CLKO/ICP1          </td> <td> D8              </td> <td> digital_io[11]                       </td></tr>
-  <tr align="center"> <td> Pin-15          </td> <td> PB1/SS[1]OC1A(PWM3)         </td> <td> D9              </td> <td> digital_io[12]                       </td></tr>
-  <tr align="center"> <td> Pin-16          </td> <td> PB2/SS[0]/OC1B(PWM4)      </td> <td> D10             </td> <td> digital_io[13]                       </td></tr>
-  <tr align="center"> <td> Pin-17          </td> <td> PB3/MOSI/OC2A(PWM5)    </td> <td> D11             </td> <td> digital_io[14]                       </td></tr>
-  <tr align="center"> <td> Pin-18          </td> <td> PB4/MISO               </td> <td> D12             </td> <td> digital_io[15]                       </td></tr>
-  <tr align="center"> <td> Pin-19          </td> <td> PB5/SCK                </td> <td> D13             </td> <td> digital_io[16]                       </td></tr>
+  <tr align="center"> <td> Pin-9           </td> <td> PB6/XTAL1/TOSC1        </td> <td>                 </td> <td> digital_io[11]                        </td></tr>
+  <tr align="center"> <td> Pin-10          </td> <td> PB7/XTAL2/TOSC2        </td> <td>                 </td> <td> digital_io[12]                        </td></tr>
+  <tr align="center"> <td> Pin-11          </td> <td> PD5/SS[3]/OC0B(PWM1)/T1      </td> <td> D5        </td> <td> digital_io[13]                        </td></tr>
+  <tr align="center"> <td> Pin-12          </td> <td> PD6/SS[2]/OC0A(PWM2)/AIN0    </td> <td> D6        </td> <td> digital_io[14] /analog_io[2]          </td></tr>
+  <tr align="center"> <td> Pin-13          </td> <td> PD7/A1N1               </td> <td> D7              </td> <td> digital_io[15]/analog_io[3]          </td></tr>
+  <tr align="center"> <td> Pin-14          </td> <td> PB0/CLKO/ICP1          </td> <td> D8              </td> <td> digital_io[16]                       </td></tr>
+  <tr align="center"> <td> Pin-15          </td> <td> PB1/SS[1]OC1A(PWM3)         </td> <td> D9         </td> <td> digital_io[17]                       </td></tr>
+  <tr align="center"> <td> Pin-16          </td> <td> PB2/SS[0]/OC1B(PWM4)      </td> <td> D10          </td> <td> digital_io[18]                       </td></tr>
+  <tr align="center"> <td> Pin-17          </td> <td> PB3/MOSI/OC2A(PWM5)    </td> <td> D11             </td> <td> digital_io[19]                       </td></tr>
+  <tr align="center"> <td> Pin-18          </td> <td> PB4/MISO               </td> <td> D12             </td> <td> digital_io[20]                       </td></tr>
+  <tr align="center"> <td> Pin-19          </td> <td> PB5/SCK                </td> <td> D13             </td> <td> digital_io[21]                       </td></tr>
   <tr align="center"> <td> Pin-20          </td> <td> AVCC                   </td> <td>                 </td> <td> -                                    </td></tr>
   <tr align="center"> <td> Pin-21          </td> <td> AREF                   </td> <td>                 </td> <td> analog_io[10]                        </td></tr>
   <tr align="center"> <td> Pin-22          </td> <td> GND                    </td> <td>                 </td> <td> -                                    </td></tr>
-  <tr align="center"> <td> Pin-23          </td> <td> PC0/ADC0               </td> <td>  A0             </td> <td> digital_io[18]/analog_io[11]         </td></tr>
-  <tr align="center"> <td> Pin-24          </td> <td> PC1/ADC1               </td> <td>  A1             </td> <td> digital_io[19]/analog_io[12]         </td></tr>
-  <tr align="center"> <td> Pin-25          </td> <td> PC2/ADC2               </td> <td>  A2             </td> <td> digital_io[20]/analog_io[13]         </td></tr>
-  <tr align="center"> <td> Pin-26          </td> <td> PC3/ADC3               </td> <td>  A3             </td> <td> digital_io[21]/analog_io[14]         </td></tr>
-  <tr align="center"> <td> Pin-27          </td> <td> PC4/ADC4/SDA           </td> <td>  A4             </td> <td> digital_io[22]/analog_io[15]         </td></tr>
-  <tr align="center"> <td> Pin-28          </td> <td> PC5/ADC5/SCL           </td> <td>  A5             </td> <td> digital_io[23]/analog_io[16]         </td></tr>
+  <tr align="center"> <td> Pin-23          </td> <td> PC0/uartm_rxd/ADC0     </td> <td>  A0             </td> <td> digital_io[22]/analog_io[11]         </td></tr>
+  <tr align="center"> <td> Pin-24          </td> <td> PC1/uartm/ADC1         </td> <td>  A1             </td> <td> digital_io[23]/analog_io[12]         </td></tr>
+  <tr align="center"> <td> Pin-25          </td> <td> PC2/usb_dp/ADC2        </td> <td>  A2             </td> <td> digital_io[24]/analog_io[13]         </td></tr>
+  <tr align="center"> <td> Pin-26          </td> <td> PC3/usb_dn/ADC3        </td> <td>  A3             </td> <td> digital_io[25]/analog_io[14]         </td></tr>
+  <tr align="center"> <td> Pin-27          </td> <td> PC4/ADC4/SDA           </td> <td>  A4             </td> <td> digital_io[26]/analog_io[15]         </td></tr>
+  <tr align="center"> <td> Pin-28          </td> <td> PC5/ADC5/SCL           </td> <td>  A5             </td> <td> digital_io[27]/analog_io[16]         </td></tr>
   <tr align="center"> <td colspan="4">   Additional Pad used for Externam ROM/RAM/USB </td></tr>
-  <tr align="center"> <td> Sflash          </td> <td> sflash_sck             </td> <td>                 </td> <td> digital_io[24]                       </td></tr>
-  <tr align="center"> <td> SFlash          </td> <td> sflash_ss0             </td> <td>                 </td> <td> digital_io[25]                       </td></tr>
-  <tr align="center"> <td> SFlash          </td> <td> sflash_ss1             </td> <td>                 </td> <td> digital_io[26]                       </td></tr>
-  <tr align="center"> <td> SFlash          </td> <td> sflash_ss2             </td> <td>                 </td> <td> digital_io[27]                       </td></tr>
-  <tr align="center"> <td> SFlash          </td> <td> sflash_ss3             </td> <td>                 </td> <td> digital_io[28]                       </td></tr>
-  <tr align="center"> <td> SFlash          </td> <td> sflash_io0             </td> <td>                 </td> <td> digital_io[29]                       </td></tr>
-  <tr align="center"> <td> SFlash          </td> <td> sflash_io1             </td> <td>                 </td> <td> digital_io[30]                       </td></tr>
-  <tr align="center"> <td> SFlash          </td> <td> sflash_io2             </td> <td>                 </td> <td> digital_io[31]                       </td></tr>
-  <tr align="center"> <td> SFlash          </td> <td> sflash_io3             </td> <td>                 </td> <td> digital_io[32]                       </td></tr>
-  <tr align="center"> <td> SSRAM           </td> <td> dbg_clk_mon            </td> <td>                 </td> <td> digital_io[33]                       </td></tr>
-  <tr align="center"> <td> SSRAM           </td> <td> uartm rxd              </td> <td>                 </td> <td> digital_io[34]                       </td></tr>
-  <tr align="center"> <td> SSRAM           </td> <td> uartm txd              </td> <td>                 </td> <td> digital_io[35]                       </td></tr>
-  <tr align="center"> <td> usb1.1          </td> <td> usb_dp                 </td> <td>                 </td> <td> digital_io[36]                       </td></tr>
-  <tr align="center"> <td> usb1.1          </td> <td> usb_dn                 </td> <td>                 </td> <td> digital_io[37]                       </td></tr>
+  <tr align="center"> <td> Sflash          </td> <td> sflash_sck             </td> <td>                 </td> <td> digital_io[28]                       </td></tr>
+  <tr align="center"> <td> SFlash          </td> <td> sflash_ss0             </td> <td>                 </td> <td> digital_io[29]                       </td></tr>
+  <tr align="center"> <td> SFlash          </td> <td> sflash_ss1             </td> <td>                 </td> <td> digital_io[30]                       </td></tr>
+  <tr align="center"> <td> SFlash          </td> <td> sflash_ss2             </td> <td>                 </td> <td> digital_io[31]                       </td></tr>
+  <tr align="center"> <td> SFlash          </td> <td> sflash_ss3             </td> <td>                 </td> <td> digital_io[32]                       </td></tr>
+  <tr align="center"> <td> SFlash          </td> <td> sflash_io0             </td> <td>                 </td> <td> digital_io[33]                       </td></tr>
+  <tr align="center"> <td> SFlash          </td> <td> sflash_io1             </td> <td>                 </td> <td> digital_io[34]                       </td></tr>
+  <tr align="center"> <td> SFlash          </td> <td> sflash_io2             </td> <td>                 </td> <td> digital_io[35]                       </td></tr>
+  <tr align="center"> <td> SFlash          </td> <td> sflash_io3             </td> <td>                 </td> <td> digital_io[36]                       </td></tr>
+  <tr align="center"> <td> DEBUG           </td> <td> dbg_clk_mon            </td> <td>                 </td> <td> digital_io[37]                       </td></tr>
+  <tr align="center"> <td> SPARE           </td> <td> PA0                    </td> <td>                 </td> <td> digital_io[0]                       </td></tr>
+  <tr align="center"> <td> SPARE           </td> <td> PA1                    </td> <td>                 </td> <td> digital_io[1]                       </td></tr>
+  <tr align="center"> <td> SPARE           </td> <td> PA2                    </td> <td>                 </td> <td> digital_io[2]                       </td></tr>
+  <tr align="center"> <td> SPARE           </td> <td> PA3                    </td> <td>                 </td> <td> digital_io[3]                       </td></tr>
+  <tr align="center"> <td> SPARE           </td> <td> PA4                     </td> <td>                </td> <td> digital_io[4]                       </td></tr>
 </table>
 
 
@@ -312,36 +340,18 @@
     <td  align="center"> SSPI</td>
   </tr>
   <tr>
+    <td  align="center"> 0x1001_01C0 to 0x1001_013F</td> 
+    <td  align="center"> 0x1001_01C0 to 0x1001_013F</td>
+    <td  align="center"> 0x1001_01C0 to 0x1001_013F</td>
+    <td  align="center"> SSPI</td>
+  </tr>
+  <tr>
     <td  align="center"> 0x1002_0080 to 0x1002_00FF</td> 
     <td  align="center"> 0x1002_0080 to 0x1002_00FF</td>
     <td  align="center"> 0x1002_0080 to 0x1002_00FF</td>
     <td  align="center"> PINMUX</td>
   </tr>
   <tr>
-    <td  align="center"> 0x1003_0080 to 0x1003_07FF</td> 
-    <td  align="center"> 0x1003_0080 to 0x1003_07FF</td>
-    <td  align="center"> 0x1003_0080 to 0x1003_07FF</td>
-    <td  align="center"> SRAM-0 (2KB)</td>
-  </tr>
-  <tr>
-    <td  align="center"> 0x1003_0800 to 0x1003_0FFF</td> 
-    <td  align="center"> 0x1003_0800 to 0x1003_0FFF</td>
-    <td  align="center"> 0x1003_0800 to 0x1003_0FFF</td>
-    <td  align="center"> SRAM-1 (2KB)</td>
-  </tr>
-  <tr>
-    <td  align="center"> 0x1003_1000 to 0x1003_17FF</td> 
-    <td  align="center"> 0x1003_1000 to 0x1003_17FF</td>
-    <td  align="center"> 0x1003_1000 to 0x1003_17FF</td>
-    <td  align="center"> SRAM-2 (2KB)</td>
-  </tr>
-  <tr>
-    <td  align="center"> 0x1003_1800 to 0x1003_1FFF</td> 
-    <td  align="center"> 0x1003_1800 to 0x1003_1FFF</td>
-    <td  align="center"> 0x1003_1800 to 0x1003_1FFF</td>
-    <td  align="center"> SRAM-3 (2KB)</td>
-  </tr>
-  <tr>
     <td  align="center"> -</td> 
     <td  align="center"> -</td>
     <td  align="center"> 0x3080_0000 to 0x3080_00FF</td>
@@ -540,42 +550,6 @@
 
 
 
-# Repository contents
-
-```
-|verilog
-|   ├─  rtl
-|   |     |-  syntacore
-|   |     |     |─  scr1
-|   |     |     |    ├─ **docs**                           | **SCR1 documentation**
-|   |     |     |    |      ├─ scr1_eas.pdf                | SCR1 External Architecture Specification
-|   |     |     |    |      └─ scr1_um.pdf                 | SCR1 User Manual
-|   |     |     |    |─  **src**                           | **SCR1 RTL source and testbench files**
-|   |     |     |    |   ├─ includes                       | Header files
-|   |     |     |    |   ├─ core                           | Core top source files
-|   |     |     |    |   ├─ top                            | Cluster source files
-|   |     |     |    |─  **synth**                         | **SCR1 RTL Synthesis files **
-|   |     |- Qspi_master
-|   |     |     |- src                                     | Qard SPI Master Source files
-|   |     |-wb_interconnect
-|   |     |     |- src                                     | 3x4 Wishbone Interconnect
-|   |     |- digital_core
-|   |     |     |- src                                     | Digital core Source files
-|   |     |- lib                                           | common library source files
-|   |- dv
-|   |   |- la_test1                                        | carevel LA test
-|   |   |- risc_boot                                       | user core risc boot test
-|   |   |- wb_port                                         | user wishbone test
-|   |   |- user_risc_boot                                  | user standalone test without carevel soc
-|   |- gl                                                  | ** GLS Source files **
-|
-|- openlane
-    |- spi_master                                          | spi_master openlane scripts   
-    |- syntacore                                           | Risc Core openlane scripts   
-    |- user_project_wrapper                                | carvel user project wrapper 
-
-```
-
 
 # Prerequisites
    - Docker (ensure docker daemon is running) -- tested with version 19.03.12, but any recent version should suffice.
@@ -694,6 +668,14 @@
     make verify-riscv_regress                  - standalone riscv compliance test suite
     make verify-arduino_risc_boot              - standalone riscv core-0 boot using arduino tool set
     make verify-arduino_hello_world            - standalone riscv core-0 hello world test using arduino tool set
+    make verify-arduino_digital_port_control   - standalone riscv core-0 digital port control using arduino tool set
+    make verify-arduino_ascii_table            - standalone riscv core-0 ascii table using arduino tool set
+    make verify-arduino_character_analysis     - standalone riscv core-0 character analysis using arduino tool set
+    make verify-arduino_multi_serial           - standalone riscv core-0 multi uart test using arduino tool set
+    make verify-arduino_switchCase2            - standalone riscv core-0 switch case using arduino tool set
+    make verify-arduino_risc_boot              - standalone riscv core-0 boot test using arduino tool set
+    make verify-arduino_string                 - standalone riscv core-0 string usage test using arduino tool set
+    
     make verify-user_mcore                     - standalone riscv multi-core test
     make verify-user_sram_exec RISC_CORE=1     - standalone riscv core-1 test with executing code from data memory
     make verify-user_risc_boot RISC_CORE=1     - standalone user risc core-1 boot test
@@ -702,7 +684,6 @@
     make verify-user_aes  RISC_CORE=1          - standalone aes test with risc core-1
     make verify-user_cache_bypass RISC_CORE=1  - standalone icache and dcache bypass test with risc core-1
     make verify-arduino_risc_boot RISC_CORE=1  - standalone riscv core-1 boot using arduino tool set
-    make verify-arduino_hello_world RISC_CORE=1 - standalone riscv core-1 hello world test using arduino tool set
     
     make verify-user_uart SIM=RTL DUMP=OFF     - Standalone user uart-0 test using user risc core with waveform dump off
     make verify-user_uart SIM=RTL DUMP=ON      - Standalone user uart-0 test using user risc core with waveform dump on
diff --git a/TODO.md b/TODO.md
new file mode 100644
index 0000000..5870bb6
--- /dev/null
+++ b/TODO.md
@@ -0,0 +1,39 @@
+####################
+# Thsi file document the feature addition and status
+
+- 28th Aug 2022 - Dinesh A
+    A. Create 10 system strap pick following pads and generate pad direction control and master reset
+         sflash_sck, sflash_ss0,sflash_ss1,sflash_ss2,sflash_ss3,
+         sflash_io0,sflash_io1,sflash_io2,sflash_io3,dbg_clk_mon
+    B. uart master config control thrugh strap and remove dependency with caravel la_data_in
+       - baud rate control based on strap
+    C. Enable default reset enable for wishbone, qspi slave on power up (with delayed reset after strap loading)
+    D. Give option for Auto riscv core[0] removal based on strap
+    E. Default system clock selection based on strap
+       - wb clock or xtal pin
+    F. wbs and riscv, usb clock selection based on strap
+    G. strap to control the boot up configuration qspi-flash/sram
+    I. Riscv cache on/bypass through strap
+    J. Riscv SRAM edge selection through strap
+    K. Add Strap sticky bit for software based reboot
+    M. Created Master Reset control block to manage the boot sequence
+        A. Power On
+            - Power Up wait cycle  minimum 50 ms (Add fast boot with strap)
+            - Strap latch control
+            - Pad Direction control
+            - core reset control
+        B,software reset request
+            - core reset control
+           
+  
+- 2 Sept 2022 - Dinesh A
+     QSPI Design Changes
+         Test case:
+             Add QSPI test case to validate parallel Direct and Indirect access
+         Design Change:
+             A. Add previous power on strap from SRAM flash to take care of mode switching
+                1. If the current & previous sram strap is Single, then bypass mode switching
+                2. If the current=Single and Previous: Quad, then switch mode by command 0xFF (RSTDQI)
+                3. If the current=Quad and Previous: Quad, then bypass mode switching
+                4. If the current=Quad and Previous: Single, then switch mode by command 0x38 (ESQI)
+                Note: Power On Always assume previous strap = Single 
diff --git a/openlane/Makefile b/openlane/Makefile
index c21989a..14d5aac 100644
--- a/openlane/Makefile
+++ b/openlane/Makefile
@@ -43,7 +43,7 @@
 	@sleep 1
 
 	@if [ -f ./$*/interactive.tcl ]; then\
-		docker run --rm -v $(OPENLANE_ROOT):/openlane \
+		docker run --rm \
 		-v $(PDK_ROOT):$(PDK_ROOT) \
 		-v $(PWD)/..:$(PWD)/.. \
 		-v $(MCW_ROOT):$(MCW_ROOT) \
@@ -57,7 +57,7 @@
 		-u $(shell id -u $(USER)):$(shell id -g $(USER)) \
 		$(OPENLANE_IMAGE_NAME) sh -c $(OPENLANE_INTERACTIVE_COMMAND);\
 	else\
-		docker run --rm -v $(OPENLANE_ROOT):/openlane \
+		docker run --rm \
 		-v $(PDK_ROOT):$(PDK_ROOT) \
 		-v $(PWD)/..:$(PWD)/.. \
 		-v $(CARAVEL_ROOT):$(CARAVEL_ROOT) \
diff --git a/openlane/pinmux_top/config.tcl b/openlane/pinmux_top/config.tcl
index 57819dc..f5360ec 100755
--- a/openlane/pinmux_top/config.tcl
+++ b/openlane/pinmux_top/config.tcl
@@ -55,13 +55,21 @@
      $::env(DESIGN_DIR)/../../verilog/rtl/pinmux/src/timer_reg.sv \
      $::env(DESIGN_DIR)/../../verilog/rtl/pinmux/src/timer.sv     \
      $::env(DESIGN_DIR)/../../verilog/rtl/pinmux/src/semaphore_reg.sv  \
+     $::env(DESIGN_DIR)/../../verilog/rtl/pinmux/src/ws281x_top.sv \
+     $::env(DESIGN_DIR)/../../verilog/rtl/pinmux/src/ws281x_driver.sv \
+     $::env(DESIGN_DIR)/../../verilog/rtl/pinmux/src/ws281x_reg.sv \
+     $::env(DESIGN_DIR)/../../verilog/rtl/pinmux/src/strap_ctrl.sv \
+     $::env(DESIGN_DIR)/../../verilog/rtl/pinmux/src/glbl_rst_reg.sv \
      $::env(DESIGN_DIR)/../../verilog/rtl/lib/pulse_gen_type1.sv   \
      $::env(DESIGN_DIR)/../../verilog/rtl/lib/pulse_gen_type2.sv   \
      $::env(DESIGN_DIR)/../../verilog/rtl/lib/registers.v          \
      $::env(DESIGN_DIR)/../../verilog/rtl/lib/ctech_cells.sv     \
      $::env(DESIGN_DIR)/../../verilog/rtl/lib/reset_sync.sv     \
+     $::env(DESIGN_DIR)/../../verilog/rtl/lib/sync_fifo.sv     \
+     $::env(DESIGN_DIR)/../../verilog/rtl/lib/clk_ctl.v     \
      "
 
+set ::env(VERILOG_INCLUDE_DIRS) [glob $::env(DESIGN_DIR)/../../verilog/rtl/ ]
 
 set ::env(SYNTH_DEFINES) [list SYNTHESIS ]
 set ::env(SYNTH_READ_BLACKBOX_LIB) 1
@@ -80,7 +88,7 @@
 set ::env(FP_PIN_ORDER_CFG) $::env(DESIGN_DIR)/pin_order.cfg
 
 set ::env(FP_SIZING) absolute
-set ::env(DIE_AREA) "0 0 500 400"
+set ::env(DIE_AREA) "0 0 500 750"
 
 
 # If you're going to use multiple power domains, then keep this disabled.
@@ -90,23 +98,34 @@
 
 
 set ::env(PL_TIME_DRIVEN) 1
-set ::env(PL_TARGET_DENSITY) "0.40"
+set ::env(PL_TARGET_DENSITY) "0.38"
 set ::env(CELL_PAD) "4"
+#set ::env(GRT_ADJUSTMENT) {0.2}
 
-set ::env(FP_IO_VEXTEND) {6}
-set ::env(FP_IO_HEXTEND) {6}
+
+######################################################################################
+# Metal-2/3 Signal are Routed near to block boundary is creating DRC violation at Top-level 
+# during pad connectivity
+#set ::env(FP_IO_HEXTEND) {1}
+#set ::env(FP_IO_VEXTEND) {1}
+
+#set ::env(GRT_OBS) "                        \
+#                    met2  0    2   500  3,  \
+#                    met2  0    747 500  748, \
+#                    met3  2    0   3    750, \
+#                    met3  497  0 498    750"
 
 
 # helps in anteena fix
-set ::env(USE_ARC_ANTENNA_CHECK) "0"
+set ::env(USE_ARC_ANTENNA_CHECK) "1"
 
 set ::env(FP_IO_VEXTEND) 4
 set ::env(FP_IO_HEXTEND) 4
 
 set ::env(FP_PDN_VPITCH) 100
 set ::env(FP_PDN_HPITCH) 100
-set ::env(FP_PDN_VWIDTH) 5
-set ::env(FP_PDN_HWIDTH) 5
+set ::env(FP_PDN_VWIDTH) 6.2
+set ::env(FP_PDN_HWIDTH) 6.2
 
 #set ::env(GLB_RT_MAXLAYER) 5
 set ::env(RT_MAX_LAYER) {met4}
@@ -115,6 +134,10 @@
 set ::env(DIODE_INSERTION_STRATEGY) 4
 
 
+#LVS Issue - DEF Base looks to having issue
+set ::env(MAGIC_EXT_USE_GDS) {1}
+
+
 set ::env(QUIT_ON_TIMING_VIOLATIONS) "0"
 set ::env(QUIT_ON_MAGIC_DRC) "1"
 set ::env(QUIT_ON_LVS_ERROR) "1"
diff --git a/openlane/pinmux_top/pin_order.cfg b/openlane/pinmux_top/pin_order.cfg
index 6dc053a..724e4f3 100644
--- a/openlane/pinmux_top/pin_order.cfg
+++ b/openlane/pinmux_top/pin_order.cfg
@@ -2,8 +2,7 @@
 #MANUAL_PLACE
 
 #S
-h_reset_n             000 0 2
-cpu_core_rst_n\[1\]
+cpu_core_rst_n\[1\]   000 0 2
 cpu_core_rst_n\[0\]
 cpu_intf_rst_n
 qspim_rst_n
@@ -63,7 +62,82 @@
 spis_miso
 spis_mosi
 
-pinmux_debug\[0\] 0100 0  2
+cfg_strap_pad_ctrl   0100 0 4
+user_clock1
+user_clock2
+int_pll_clock
+xtal_clk
+e_reset_n
+p_reset_n
+s_reset_n
+rtc_clk
+usb_clk
+strap_sticky\[31\]
+strap_sticky\[30\]
+strap_sticky\[29\]
+strap_sticky\[28\]
+strap_sticky\[27\]
+strap_sticky\[26\]
+strap_sticky\[25\]
+strap_sticky\[24\]
+strap_sticky\[23\]
+strap_sticky\[22\]
+strap_sticky\[21\]
+strap_sticky\[20\]
+strap_sticky\[19\]
+strap_sticky\[18\]
+strap_sticky\[17\]
+strap_sticky\[16\]
+strap_sticky\[15\]
+strap_sticky\[14\]
+strap_sticky\[13\]
+strap_sticky\[12\]
+strap_sticky\[11\]
+strap_sticky\[10\]
+strap_sticky\[9\]
+strap_sticky\[8\]
+strap_sticky\[7\]
+strap_sticky\[6\]
+strap_sticky\[5\]
+strap_sticky\[4\]
+strap_sticky\[3\]
+strap_sticky\[2\]
+strap_sticky\[1\]
+strap_sticky\[0\]
+system_strap\[31\]
+system_strap\[30\]
+system_strap\[29\]
+system_strap\[28\]
+system_strap\[27\]
+system_strap\[26\]
+system_strap\[25\]
+system_strap\[24\]
+system_strap\[23\]
+system_strap\[22\]
+system_strap\[21\]
+system_strap\[20\]
+system_strap\[19\]
+system_strap\[18\]
+system_strap\[17\]
+system_strap\[16\]
+system_strap\[15\]
+system_strap\[14\]
+system_strap\[13\]
+system_strap\[12\]
+system_strap\[11\]
+system_strap\[10\]
+system_strap\[9\]
+system_strap\[8\]
+system_strap\[7\]
+system_strap\[6\]
+system_strap\[5\]
+system_strap\[4\]
+system_strap\[3\]
+system_strap\[2\]
+system_strap\[1\]
+system_strap\[0\]
+
+pinmux_debug\[0\] 0300 0  2
 pinmux_debug\[1\]
 pinmux_debug\[2\]
 pinmux_debug\[3\]
@@ -100,6 +174,22 @@
 #W
 
 soft_irq            
+irq_lines\[31\]     
+irq_lines\[30\]     
+irq_lines\[29\]     
+irq_lines\[28\]     
+irq_lines\[27\]     
+irq_lines\[26\]     
+irq_lines\[25\]     
+irq_lines\[24\]     
+irq_lines\[23\]     
+irq_lines\[22\]     
+irq_lines\[21\]     
+irq_lines\[20\]     
+irq_lines\[19\]     
+irq_lines\[18\]     
+irq_lines\[17\]     
+irq_lines\[16\]     
 irq_lines\[15\]     
 irq_lines\[14\]     
 irq_lines\[13\]     
@@ -129,6 +219,7 @@
 
 reg_cs            200 0
 reg_wr           
+reg_addr\[9\]    
 reg_addr\[8\]    
 reg_addr\[7\]    
 reg_addr\[6\]    
@@ -304,7 +395,8 @@
 
 
 #E
-digital_io_in\[0\]   0000 0 4
+
+digital_io_in\[0\]   0200 0 4
 digital_io_out\[0\]
 digital_io_oen\[0\]
 digital_io_in\[1\]
diff --git a/openlane/qspim_top/config.tcl b/openlane/qspim_top/config.tcl
index 0ce98bf..f715632 100755
--- a/openlane/qspim_top/config.tcl
+++ b/openlane/qspim_top/config.tcl
@@ -85,13 +85,13 @@
 # helps in anteena fix
 set ::env(USE_ARC_ANTENNA_CHECK) "0"
 
-set ::env(FP_IO_VEXTEND) 4
-set ::env(FP_IO_HEXTEND) 4
+#set ::env(FP_IO_VEXTEND) 4
+#set ::env(FP_IO_HEXTEND) 4
 
 set ::env(FP_PDN_VPITCH) 100
 set ::env(FP_PDN_HPITCH) 100
-set ::env(FP_PDN_VWIDTH) 5
-set ::env(FP_PDN_HWIDTH) 5
+set ::env(FP_PDN_VWIDTH) 6.2
+set ::env(FP_PDN_HWIDTH) 6.2
 
 #set ::env(GLB_RT_MAXLAYER) 5
 set ::env(RT_MAX_LAYER) {met4}
diff --git a/openlane/qspim_top/pin_order.cfg b/openlane/qspim_top/pin_order.cfg
index a0c3c37..9f93b81 100644
--- a/openlane/qspim_top/pin_order.cfg
+++ b/openlane/qspim_top/pin_order.cfg
@@ -53,8 +53,6 @@
 spi_oen\[1\]     
 spi_oen\[0\]     
 
-#N
-rst_n                  
 
 #W
 cfg_cska_sp_co\[3\]   0000 0 2
@@ -185,3 +183,12 @@
 wbd_ack_o           
 wbd_lack_o           
 wbd_err_o           
+
+
+#S
+rst_n                  
+cfg_init_bypass
+strap_sram
+strap_pre_sram
+strap_flash\[1\]
+strap_flash\[0\]
diff --git a/openlane/uart_i2cm_usb_spi_top/base.sdc b/openlane/uart_i2cm_usb_spi_top/base.sdc
index 35bba97..3218d29 100644
--- a/openlane/uart_i2cm_usb_spi_top/base.sdc
+++ b/openlane/uart_i2cm_usb_spi_top/base.sdc
@@ -60,7 +60,7 @@
 set_output_delay -max 1.0000 -clock [get_clocks {app_clk}] -add_delay [get_ports {reg_ack}]
 set_output_delay -max 1.0000 -clock [get_clocks {app_clk}] -add_delay [get_ports {reg_rdata[*]}]
 
-set_output_delay -min -2.7500 -clock [get_clocks {app_clk}] -add_delay [get_ports {reg_ack}]
+set_output_delay -min 1.0000 -clock [get_clocks {app_clk}] -add_delay [get_ports {reg_ack}]
 set_output_delay -min -2.7500 -clock [get_clocks {app_clk}] -add_delay [get_ports {reg_rdata[*]}]
 
 set_multicycle_path -setup  -from [get_ports {reg_addr[*]}] -to [get_ports {reg_ack}] 2
diff --git a/openlane/uart_i2cm_usb_spi_top/config.tcl b/openlane/uart_i2cm_usb_spi_top/config.tcl
index 39350c5..b317ba7 100644
--- a/openlane/uart_i2cm_usb_spi_top/config.tcl
+++ b/openlane/uart_i2cm_usb_spi_top/config.tcl
@@ -92,7 +92,7 @@
 
 set ::env(FP_PIN_ORDER_CFG) $::env(DESIGN_DIR)/pin_order.cfg
 set ::env(FP_SIZING) "absolute"
-set ::env(DIE_AREA) [list 0.0 0.0 520.0 725.0]
+set ::env(DIE_AREA) [list 0.0 0.0 520.0 800.0]
 
 
 
@@ -103,18 +103,18 @@
 
 
 set ::env(PL_TIME_DRIVEN) 1
-set ::env(PL_TARGET_DENSITY) "0.46"
+set ::env(PL_TARGET_DENSITY) "0.42"
 
 # helps in anteena fix
 set ::env(USE_ARC_ANTENNA_CHECK) "0"
 
-set ::env(FP_IO_VEXTEND) 4
-set ::env(FP_IO_HEXTEND) 4
+#set ::env(FP_IO_VEXTEND) 4
+#set ::env(FP_IO_HEXTEND) 4
 
 set ::env(FP_PDN_VPITCH) 100
 set ::env(FP_PDN_HPITCH) 100
-set ::env(FP_PDN_VWIDTH) 5
-set ::env(FP_PDN_HWIDTH) 5
+set ::env(FP_PDN_VWIDTH) 6.2
+set ::env(FP_PDN_HWIDTH) 6.2
 
 #set ::env(GLB_RT_MAXLAYER) 5
 set ::env(RT_MAX_LAYER) {met4}
@@ -125,8 +125,8 @@
 set ::env(PL_RESIZER_TIMING_OPTIMIZATIONS) {1}
 
 #set ::env(GLB_RT_ADJUSTMENT) {0.25}
-set ::env(GLB_RT_LAYER_ADJUSTMENTS) {0.25,0,0,0,0,0}
-set ::env(CELL_PAD) {2}
+set ::env(GRT_LAYER_ADJUSTMENTS) {0.25,0,0,0,0,0}
+set ::env(CELL_PAD) {8}
 
 set ::env(QUIT_ON_TIMING_VIOLATIONS) "0"
 set ::env(QUIT_ON_MAGIC_DRC) "1"
diff --git a/openlane/user_project_wrapper/config.tcl b/openlane/user_project_wrapper/config.tcl
index 8bace80..75b1974 100644
--- a/openlane/user_project_wrapper/config.tcl
+++ b/openlane/user_project_wrapper/config.tcl
@@ -56,7 +56,7 @@
 ### Macro Placement
 set ::env(MACRO_PLACEMENT_CFG) $::env(DESIGN_DIR)/macro.cfg
 
-#set ::env(PDN_CFG) $::env(DESIGN_DIR)/pdn_cfg.tcl
+set ::env(PDN_CFG) $::env(DESIGN_DIR)/pdn_cfg.tcl
 
 set ::env(SDC_FILE) $::env(DESIGN_DIR)/base.sdc
 set ::env(BASE_SDC_FILE) $::env(DESIGN_DIR)/base.sdc
@@ -100,8 +100,7 @@
 	$gds_root/ycr_core_top.gds \
 	$gds_root/ycr2_iconnect.gds \
 	$gds_root/digital_pll.gds \
-	$::env(PDK_ROOT)/sky130B/libs.ref/sky130_sram_macros/gds/sky130_sram_2kbyte_1rw1r_32x512_8.gds \
-	"
+	$::env(PDK_ROOT)/sky130B/libs.ref/sky130_sram_macros/gds/sky130_sram_2kbyte_1rw1r_32x512_8.gds "
 
 set ::env(SYNTH_DEFINES) [list SYNTHESIS ]
 
@@ -110,17 +109,30 @@
 #set ::env(GLB_RT_MAXLAYER) 6
 set ::env(RT_MAX_LAYER) {met5}
 
-set ::env(FP_PDN_CHECK_NODES) 0
-
-
 ## Internal Macros
 ### Macro PDN Connections
-set ::env(FP_PDN_ENABLE_MACROS_GRID) "1"
-#set ::env(FP_PDN_ENABLE_GLOBAL_CONNECTIONS) "1"
 
+set ::env(FP_PDN_ENABLE_MACROS_GRID) {1}
+set ::env(FP_PDN_ENABLE_GLOBAL_CONNECTIONS) "0"
+set ::env(FP_PDN_CHECK_NODES) 1
+set ::env(FP_PDN_ENABLE_RAILS) 0
+set ::env(FP_PDN_IRDROP) "1"
+set ::env(FP_PDN_HORIZONTAL_HALO) "10"
+set ::env(FP_PDN_VERTICAL_HALO) "10"
+set ::env(FP_PDN_VOFFSET) "5"
+set ::env(FP_PDN_VPITCH) "60"
+set ::env(FP_PDN_HOFFSET) "5"
+set ::env(FP_PDN_HPITCH) "60"
+set ::env(FP_PDN_HWIDTH) {6.2}
+set ::env(FP_PDN_VWIDTH) {6.2}
+set ::env(FP_PDN_HSPACING) {20}
+set ::env(FP_PDN_VSPACING) {20}
+
+set ::env(VDD_NETS) {vccd1 vccd2 vdda1 vdda2}
+set ::env(GND_NETS) {vssd1 vssd2 vssa1 vssa2}
 set ::env(VDD_NET) {vccd1}
-set ::env(VDD_PIN) {vccd1}
 set ::env(GND_NET) {vssd1}
+set ::env(VDD_PIN) {vccd1}
 set ::env(GND_PIN) {vssd1}
 
 
@@ -128,17 +140,15 @@
 	                li1   150 130  833.1  546.54,\
 	                met1  150 130  833.1  546.54,\
 	                met2  150 130  833.1  546.54,\
-                        met3  150 130  833.1  546.54,\
-
+                    met3  150 130  833.1  546.54,\
 	                li1   950 130  1633.1 546.54,\
 	                met1  950 130  1633.1 546.54,\
 	                met2  950 130  1633.1 546.54,\
-                        met3  950 130  1633.1 546.54,\
-
-                        li1   150  750 833.1  1166.54,\
-                        met1  150  750 833.1  1166.54,\
-                        met2  150  750 833.1  1166.54,\
-                        met3  150  750 833.1  1166.54,\
+                    met3  950 130  1633.1 546.54,\
+                    li1   150  750 833.1  1166.54,\
+                    met1  150  750 833.1  1166.54,\
+                    met2  150  750 833.1  1166.54,\
+                    met3  150  750 833.1  1166.54,\
 	                met5  0 0 2920 3520"
 
 #set ::env(FP_PDN_POWER_STRAPS) "vccd1 vssd1 1, vccd2 vssd2 0, vdda1 vssa1 1, vdda2 vssa2 1"
@@ -168,7 +178,6 @@
 set ::env(PL_RESIZER_TIMING_OPTIMIZATIONS) 0
 set ::env(PL_RESIZER_BUFFER_INPUT_PORTS) 0
 set ::env(PL_RESIZER_BUFFER_OUTPUT_PORTS) 0
-set ::env(FP_PDN_ENABLE_RAILS) 0
 set ::env(DIODE_INSERTION_STRATEGY) 0
 set ::env(FILL_INSERTION) 0
 set ::env(TAP_DECAP_INSERTION) 0
@@ -179,14 +188,4 @@
 set ::env(QUIT_ON_SLEW_VIOLATIONS) "0"
 set ::env(QUIT_ON_TIMING_VIOLATIONS) "0"
 
-set ::env(FP_PDN_IRDROP) "1"
-set ::env(FP_PDN_HORIZONTAL_HALO) "10"
-set ::env(FP_PDN_VERTICAL_HALO) "10"
-
-#
-
-set ::env(FP_PDN_VOFFSET) "5"
-set ::env(FP_PDN_VPITCH) "180"
-set ::env(FP_PDN_HOFFSET) "5"
-set ::env(FP_PDN_HPITCH) "180"
 
diff --git a/openlane/user_project_wrapper/macro.cfg b/openlane/user_project_wrapper/macro.cfg
index 994428f..cf8883d 100644
--- a/openlane/user_project_wrapper/macro.cfg
+++ b/openlane/user_project_wrapper/macro.cfg
@@ -1,16 +1,16 @@
 u_qspi_master                2250             650           N
 u_uart_i2c_usb_spi           2250            1350           N
-u_pinmux                     2250            2150           N
+u_pinmux                     2250            2250           N
 
-u_riscv_top.i_core_top_0    50	            1400 	   N
-u_riscv_top.i_core_top_1    1200	    1400	   FN
-u_riscv_top.u_connect       725	            1400	   N
-u_riscv_top.u_intf          950 	    650	           N
-u_dcache_2kb                150             130            N
-u_icache_2kb                950             130            N
-u_tsram0_2kb                150             750            N
+u_riscv_top.i_core_top_0    50	            1400 	        N
+u_riscv_top.i_core_top_1    1200	        1400	        FN
+u_riscv_top.u_connect       735	            1400	        N
+u_riscv_top.u_intf          950 	        650	            N
+u_dcache_2kb                150             130             N
+u_icache_2kb                950             130             N
+u_tsram0_2kb                150             750             N
 
 
-u_intercon                  1850            650            N
-u_wb_host                   1750            100            N
-u_pll                       2305            105            N
+u_intercon                  1850            650             N
+u_wb_host                   1750            100             N
+u_pll                       2300            68              N
diff --git a/openlane/user_project_wrapper/pdn.tcl b/openlane/user_project_wrapper/pdn.tcl
new file mode 100644
index 0000000..206ae5b
--- /dev/null
+++ b/openlane/user_project_wrapper/pdn.tcl
@@ -0,0 +1,54 @@
+# Copyright 2020-2022 Efabless Corporation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#      http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+foreach lib $::env(LIB_SYNTH_COMPLETE) {
+    read_liberty $lib
+}
+
+if { [info exists ::env(EXTRA_LIBS) ] } {
+    foreach lib $::env(EXTRA_LIBS) {
+        read_liberty $lib
+    }
+}
+
+if {[catch {read_lef $::env(MERGED_LEF)} errmsg]} {
+    puts stderr $errmsg
+    exit 1
+}
+
+if {[catch {read_def $::env(CURRENT_DEF)} errmsg]} {
+    puts stderr $errmsg
+    exit 1
+}
+
+# load the grid definitions
+if {[catch {source $::env(PDN_CFG)} errmsg]} {
+    puts stderr $errmsg
+    exit 1
+}
+
+# run PDNGEN
+if {[catch {pdngen} errmsg]} {
+    puts stderr $errmsg
+    exit 1
+}
+
+# checks for unconnected nodes (e.g., isolated rails or stripes)
+if { $::env(FP_PDN_CHECK_NODES) } {
+    check_power_grid -net $::env(VDD_NET)
+    check_power_grid -net $::env(GND_NET)
+}
+
+write_def $::env(SAVE_DEF)
+exit 1
diff --git a/openlane/user_project_wrapper/pdn_cfg.tcl b/openlane/user_project_wrapper/pdn_cfg.tcl
index 79a0f85..c1e213d 100644
--- a/openlane/user_project_wrapper/pdn_cfg.tcl
+++ b/openlane/user_project_wrapper/pdn_cfg.tcl
@@ -92,7 +92,8 @@
         -width $::env(FP_PDN_VWIDTH) \
         -pitch $::env(FP_PDN_VPITCH) \
         -offset $::env(FP_PDN_VOFFSET) \
-	    -nets "$::env(VDD_NET) $::env(GND_NET)" \
+        -spacing $::env(FP_PDN_VSPACING) \
+	-nets "$::env(VDD_NET) $::env(GND_NET)" \
         -starts_with POWER -extend_to_core_ring
 
     add_pdn_stripe \
@@ -101,6 +102,7 @@
         -width $::env(FP_PDN_HWIDTH) \
         -pitch $::env(FP_PDN_HPITCH) \
         -offset $::env(FP_PDN_HOFFSET) \
+        -spacing $::env(FP_PDN_HSPACING) \
 	-nets "$::env(VDD_NET) $::env(GND_NET)" \
         -starts_with POWER -extend_to_core_ring
 
diff --git a/openlane/wb_host/config.tcl b/openlane/wb_host/config.tcl
index 527f4cc..f69b2c4 100755
--- a/openlane/wb_host/config.tcl
+++ b/openlane/wb_host/config.tcl
@@ -42,6 +42,7 @@
 set ::env(VERILOG_FILES) "\
      $::env(DESIGN_DIR)/../../verilog/rtl/clk_skew_adjust/src/clk_skew_adjust.gv \
      $::env(DESIGN_DIR)/../../verilog/rtl/wb_host/src/wb_host.sv \
+     $::env(DESIGN_DIR)/../../verilog/rtl/wb_host/src/wb_reset_fsm.sv \
      $::env(DESIGN_DIR)/../../verilog/rtl/lib/async_fifo.sv      \
      $::env(DESIGN_DIR)/../../verilog/rtl/lib/async_wb.sv        \
      $::env(DESIGN_DIR)/../../verilog/rtl/lib/clk_ctl.v          \
@@ -52,6 +53,7 @@
      $::env(DESIGN_DIR)/../../verilog/rtl/uart/src/uart_txfsm.sv \
      $::env(DESIGN_DIR)/../../verilog/rtl/uart/src/uart_rxfsm.sv \
      $::env(DESIGN_DIR)/../../verilog/rtl/lib/double_sync_low.v  \
+     $::env(DESIGN_DIR)/../../verilog/rtl/lib/clk_div8.v  \
      $::env(DESIGN_DIR)/../../verilog/rtl/wb_interconnect/src/wb_arb.sv     \
      $::env(DESIGN_DIR)/../../verilog/rtl/uart2wb/src/uart2wb.sv \
      $::env(DESIGN_DIR)/../../verilog/rtl/uart2wb/src/uart2_core.sv \
@@ -60,6 +62,7 @@
      $::env(DESIGN_DIR)/../../verilog/rtl/sspis/src/sspis_if.sv \
      $::env(DESIGN_DIR)/../../verilog/rtl/sspis/src/spi2wb.sv \
      "
+set ::env(VERILOG_INCLUDE_DIRS) [glob $::env(DESIGN_DIR)/../../verilog/rtl/ ]
 
 set ::env(SYNTH_READ_BLACKBOX_LIB) 1
 set ::env(SYNTH_DEFINES) [list SYNTHESIS ]
@@ -92,13 +95,13 @@
 
 
 
-set ::env(FP_IO_VEXTEND) 4
-set ::env(FP_IO_HEXTEND) 4
+#set ::env(FP_IO_VEXTEND) 4
+#set ::env(FP_IO_HEXTEND) 4
 
 set ::env(FP_PDN_VPITCH) 100
 set ::env(FP_PDN_HPITCH) 100
-set ::env(FP_PDN_VWIDTH) 5
-set ::env(FP_PDN_HWIDTH) 5
+set ::env(FP_PDN_VWIDTH) 6.2
+set ::env(FP_PDN_HWIDTH) 6.2
 
 #set ::env(GLB_RT_MAXLAYER) 5
 set ::env(RT_MAX_LAYER) {met4}
diff --git a/openlane/wb_host/pin_order.cfg b/openlane/wb_host/pin_order.cfg
index d0a5a57..2c6a14d 100644
--- a/openlane/wb_host/pin_order.cfg
+++ b/openlane/wb_host/pin_order.cfg
@@ -4,10 +4,8 @@
 
 
 #W
-usb_clk          0000 0 4
 
 cpu_clk               0100 0 2
-rtc_clk
 
 
 
@@ -350,3 +348,73 @@
 wbs_cyc_o      
 
 
+cfg_strap_pad_ctrl
+e_reset_n
+int_pll_clock
+p_reset_n
+s_reset_n
+xtal_clk
+strap_sticky\[31\]
+strap_sticky\[30\]
+strap_sticky\[29\]
+strap_sticky\[28\]
+strap_sticky\[27\]
+strap_sticky\[26\]
+strap_sticky\[25\]
+strap_sticky\[24\]
+strap_sticky\[23\]
+strap_sticky\[22\]
+strap_sticky\[21\]
+strap_sticky\[20\]
+strap_sticky\[19\]
+strap_sticky\[18\]
+strap_sticky\[17\]
+strap_sticky\[16\]
+strap_sticky\[15\]
+strap_sticky\[14\]
+strap_sticky\[13\]
+strap_sticky\[12\]
+strap_sticky\[11\]
+strap_sticky\[10\]
+strap_sticky\[9\]
+strap_sticky\[8\]
+strap_sticky\[7\]
+strap_sticky\[6\]
+strap_sticky\[5\]
+strap_sticky\[4\]
+strap_sticky\[3\]
+strap_sticky\[2\]
+strap_sticky\[1\]
+strap_sticky\[0\]
+system_strap\[31\]
+system_strap\[30\]
+system_strap\[29\]
+system_strap\[28\]
+system_strap\[27\]
+system_strap\[26\]
+system_strap\[25\]
+system_strap\[24\]
+system_strap\[23\]
+system_strap\[22\]
+system_strap\[21\]
+system_strap\[20\]
+system_strap\[19\]
+system_strap\[18\]
+system_strap\[17\]
+system_strap\[16\]
+system_strap\[15\]
+system_strap\[14\]
+system_strap\[13\]
+system_strap\[12\]
+system_strap\[11\]
+system_strap\[10\]
+system_strap\[9\]
+system_strap\[8\]
+system_strap\[7\]
+system_strap\[6\]
+system_strap\[5\]
+system_strap\[4\]
+system_strap\[3\]
+system_strap\[2\]
+system_strap\[1\]
+system_strap\[0\]
diff --git a/openlane/wb_interconnect/config.tcl b/openlane/wb_interconnect/config.tcl
index c58574a..de21996 100755
--- a/openlane/wb_interconnect/config.tcl
+++ b/openlane/wb_interconnect/config.tcl
@@ -51,7 +51,7 @@
 set ::env(SYNTH_DEFINES) [list SYNTHESIS ]
 
 set ::env(SYNTH_PARAMETERS) "CH_CLK_WD=4\
-	                 CH_DATA_WD=37 \
+	                 CH_DATA_WD=53 \
 			 "
 
 set ::env(SYNTH_READ_BLACKBOX_LIB) 1
@@ -135,3 +135,7 @@
 ## FANOUT Reduced to take care of long routes
 set ::env(SYNTH_MAX_FANOUT) "2"
 
+set ::env(FP_PDN_VPITCH) 100
+set ::env(FP_PDN_HPITCH) 100
+set ::env(FP_PDN_VWIDTH) 6.2
+set ::env(FP_PDN_HWIDTH) 6.2
diff --git a/openlane/wb_interconnect/pin_order.cfg b/openlane/wb_interconnect/pin_order.cfg
index 2d8237e..93ca457 100644
--- a/openlane/wb_interconnect/pin_order.cfg
+++ b/openlane/wb_interconnect/pin_order.cfg
@@ -147,7 +147,23 @@
 
 
 #W
-ch_data_out\[36\]   000 0 2
+ch_data_out\[52\]   000 0 2
+ch_data_out\[51\] 
+ch_data_out\[50\] 
+ch_data_out\[49\] 
+ch_data_out\[48\] 
+ch_data_out\[47\] 
+ch_data_out\[46\] 
+ch_data_out\[45\] 
+ch_data_out\[44\] 
+ch_data_out\[43\] 
+ch_data_out\[42\] 
+ch_data_out\[41\] 
+ch_data_out\[40\] 
+ch_data_out\[39\] 
+ch_data_out\[38\] 
+ch_data_out\[37\] 
+ch_data_out\[36\] 
 ch_data_out\[35\] 
 ch_data_out\[34\] 
 ch_data_out\[33\] 
@@ -705,7 +721,23 @@
 s1_wbd_ack_i        
 s1_wbd_cyc_o  
 
-ch_data_in\[36\]  1500 0 2  
+ch_data_in\[52\]  1500 0 2
+ch_data_in\[51\]  
+ch_data_in\[50\]  
+ch_data_in\[49\]  
+ch_data_in\[48\]  
+ch_data_in\[47\]  
+ch_data_in\[46\]  
+ch_data_in\[45\]  
+ch_data_in\[44\]  
+ch_data_in\[43\]  
+ch_data_in\[42\]  
+ch_data_in\[41\]  
+ch_data_in\[40\]  
+ch_data_in\[39\]  
+ch_data_in\[38\]  
+ch_data_in\[37\]  
+ch_data_in\[36\]  
 ch_data_in\[35\]
 ch_data_in\[34\]
 ch_data_in\[33\]
@@ -731,6 +763,7 @@
 
 s2_wbd_stb_o         1600 0 2
 s2_wbd_we_o         
+s2_wbd_adr_o\[9\]   
 s2_wbd_adr_o\[8\]   
 s2_wbd_adr_o\[7\]   
 s2_wbd_adr_o\[6\]   
diff --git a/openlane/ycr2_iconnect/config.tcl b/openlane/ycr2_iconnect/config.tcl
index a8f0493..76ec7e5 100644
--- a/openlane/ycr2_iconnect/config.tcl
+++ b/openlane/ycr2_iconnect/config.tcl
@@ -60,7 +60,7 @@
 ## Floorplan
 set ::env(FP_PIN_ORDER_CFG) $::env(DESIGN_DIR)/pin_order.cfg
 set ::env(FP_SIZING) absolute
-set ::env(DIE_AREA) "0 0 390 1100"
+set ::env(DIE_AREA) "0 0 390 1200"
 
 set ::env(PL_TARGET_DENSITY) 0.20
 set ::env(CELL_PAD) 2
@@ -79,20 +79,10 @@
 set ::env(GLB_RESIZER_TIMING_OPTIMIZATIONS) {1}
 
 ### PDN
-#set ::env(FP_PDN_CHECK_NODES) "0"
-#set ::env(FP_PDN_HORIZONTAL_HALO) "10"
-#set ::env(FP_PDN_VERTICAL_HALO) "10"
-#
-#set ::env(FP_PDN_VOFFSET) "5"
-#set ::env(FP_PDN_VPITCH) "80"
-#set ::env(FP_PDN_VSPACING) "15.5"
-#set ::env(FP_PDN_VWIDTH) "3.1"
-#
-#set ::env(FP_PDN_HOFFSET) "10"
-#set ::env(FP_PDN_HPITCH) "100"
-#set ::env(FP_PDN_HSPACING) "10"
-#set ::env(FP_PDN_HWIDTH) "3.1"
-
+set ::env(FP_PDN_VPITCH) 100
+set ::env(FP_PDN_HPITCH) 100
+set ::env(FP_PDN_VWIDTH) 6.2
+set ::env(FP_PDN_HWIDTH) 6.2
 
 #set ::env(GLB_RT_MAXLAYER) 5
 set ::env(RT_MAX_LAYER) {met4}
diff --git a/openlane/ycr2_iconnect/pin_order.cfg b/openlane/ycr2_iconnect/pin_order.cfg
index 5cb4104..ab65df8 100644
--- a/openlane/ycr2_iconnect/pin_order.cfg
+++ b/openlane/ycr2_iconnect/pin_order.cfg
@@ -423,6 +423,22 @@
 core0_timer_val\[1\]
 core0_timer_val\[0\]
 
+core0_irq_lines\[31\]
+core0_irq_lines\[30\]
+core0_irq_lines\[29\]
+core0_irq_lines\[28\]
+core0_irq_lines\[27\]
+core0_irq_lines\[26\]
+core0_irq_lines\[25\]
+core0_irq_lines\[24\]
+core0_irq_lines\[23\]
+core0_irq_lines\[22\]
+core0_irq_lines\[21\]
+core0_irq_lines\[20\]
+core0_irq_lines\[19\]
+core0_irq_lines\[18\]
+core0_irq_lines\[17\]
+core0_irq_lines\[16\]
 core0_irq_lines\[15\]
 core0_irq_lines\[14\]
 core0_irq_lines\[13\]
@@ -736,6 +752,22 @@
 core1_timer_val\[2\]
 core1_timer_val\[1\]
 core1_timer_val\[0\]
+core1_irq_lines\[31\]
+core1_irq_lines\[30\]
+core1_irq_lines\[29\]
+core1_irq_lines\[28\]
+core1_irq_lines\[27\]
+core1_irq_lines\[26\]
+core1_irq_lines\[25\]
+core1_irq_lines\[24\]
+core1_irq_lines\[23\]
+core1_irq_lines\[22\]
+core1_irq_lines\[21\]
+core1_irq_lines\[20\]
+core1_irq_lines\[19\]
+core1_irq_lines\[18\]
+core1_irq_lines\[17\]
+core1_irq_lines\[16\]
 core1_irq_lines\[15\]
 core1_irq_lines\[14\]
 core1_irq_lines\[13\]
@@ -1115,6 +1147,23 @@
 riscv_debug\[1\]
 riscv_debug\[0\]
 
+#N
+core_irq_lines_i\[31\]
+core_irq_lines_i\[30\]
+core_irq_lines_i\[29\]
+core_irq_lines_i\[28\]
+core_irq_lines_i\[27\]
+core_irq_lines_i\[26\]
+core_irq_lines_i\[25\]
+core_irq_lines_i\[24\]
+core_irq_lines_i\[23\]
+core_irq_lines_i\[22\]
+core_irq_lines_i\[21\]
+core_irq_lines_i\[20\]
+core_irq_lines_i\[19\]
+core_irq_lines_i\[18\]
+core_irq_lines_i\[17\]
+core_irq_lines_i\[16\]
 core_irq_lines_i\[15\]
 core_irq_lines_i\[14\]
 core_irq_lines_i\[13\]
diff --git a/openlane/ycr_core_top/config.tcl b/openlane/ycr_core_top/config.tcl
index bc6ed3e..c4a2de6 100644
--- a/openlane/ycr_core_top/config.tcl
+++ b/openlane/ycr_core_top/config.tcl
@@ -76,8 +76,8 @@
 set ::env(FP_SIZING) absolute
 set ::env(DIE_AREA) "0 0 540 950 "
 
-set ::env(PL_TARGET_DENSITY) 0.43
-set ::env(CELL_PAD) "4"
+set ::env(PL_TARGET_DENSITY) 0.45
+set ::env(CELL_PAD) "8"
 
 ## Routing
 set ::env(GRT_ADJUSTMENT) 0.2
@@ -96,3 +96,7 @@
 #Need to cross-check why global timing opimization creating setup vio with hugh hold fix
 set ::env(GLB_RESIZER_TIMING_OPTIMIZATIONS) "0"
 
+set ::env(FP_PDN_VPITCH) 100
+set ::env(FP_PDN_HPITCH) 100
+set ::env(FP_PDN_VWIDTH) 6.2
+set ::env(FP_PDN_HWIDTH) 6.2
diff --git a/openlane/ycr_core_top/pin_order.cfg b/openlane/ycr_core_top/pin_order.cfg
index 79b2c6f..8fc1648 100644
--- a/openlane/ycr_core_top/pin_order.cfg
+++ b/openlane/ycr_core_top/pin_order.cfg
@@ -296,6 +296,22 @@
 core_mtimer_val_i\[1\]
 core_mtimer_val_i\[0\]
 
+core_irq_lines_i\[31\]
+core_irq_lines_i\[30\]
+core_irq_lines_i\[29\]
+core_irq_lines_i\[28\]
+core_irq_lines_i\[27\]
+core_irq_lines_i\[26\]
+core_irq_lines_i\[25\]
+core_irq_lines_i\[24\]
+core_irq_lines_i\[23\]
+core_irq_lines_i\[22\]
+core_irq_lines_i\[21\]
+core_irq_lines_i\[20\]
+core_irq_lines_i\[19\]
+core_irq_lines_i\[18\]
+core_irq_lines_i\[17\]
+core_irq_lines_i\[16\]
 core_irq_lines_i\[15\]
 core_irq_lines_i\[14\]
 core_irq_lines_i\[13\]
diff --git a/openlane/ycr_intf/config.tcl b/openlane/ycr_intf/config.tcl
index 524afd3..ab60789 100644
--- a/openlane/ycr_intf/config.tcl
+++ b/openlane/ycr_intf/config.tcl
@@ -69,8 +69,8 @@
 
 set ::env(PL_TARGET_DENSITY) 0.37
 
-set ::env(FP_IO_VEXTEND) {6}
-set ::env(FP_IO_HEXTEND) {6}
+#set ::env(FP_IO_VEXTEND) {6}
+#set ::env(FP_IO_HEXTEND) {6}
 
 set ::env(RT_MAX_LAYER) {met4}
 #set ::env(GLB_RT_MAXLAYER) "5"
@@ -86,3 +86,8 @@
 #Need to cross-check why global timing opimization creating setup vio with hugh hold fix
 set ::env(GLB_RESIZER_TIMING_OPTIMIZATIONS) "0"
 
+#PDN
+set ::env(FP_PDN_VPITCH) 100
+set ::env(FP_PDN_HPITCH) 100
+set ::env(FP_PDN_VWIDTH) 6.2
+set ::env(FP_PDN_HWIDTH) 6.2
diff --git a/signoff/pinmux_top/OPENLANE_VERSION b/signoff/pinmux_top/OPENLANE_VERSION
index d5588cd..b5bf449 100644
--- a/signoff/pinmux_top/OPENLANE_VERSION
+++ b/signoff/pinmux_top/OPENLANE_VERSION
@@ -1 +1 @@
-openlane 6ab944bc23688cae6dc6fa32444891a1e57715c8
+openlane b6bacc9d1ab469917fda7ceea61ea3a18984b818
diff --git a/signoff/pinmux_top/PDK_SOURCES b/signoff/pinmux_top/PDK_SOURCES
index e8e14ea..f9d0f46 100644
--- a/signoff/pinmux_top/PDK_SOURCES
+++ b/signoff/pinmux_top/PDK_SOURCES
@@ -1 +1 @@
-open_pdks e8294524e5f67c533c5d0c3afa0bcc5b2a5fa066
+open_pdks 44a43c23c81b45b8e774ae7a84899a5a778b6b0b
diff --git a/signoff/qspim_top/OPENLANE_VERSION b/signoff/qspim_top/OPENLANE_VERSION
index d5588cd..b5bf449 100644
--- a/signoff/qspim_top/OPENLANE_VERSION
+++ b/signoff/qspim_top/OPENLANE_VERSION
@@ -1 +1 @@
-openlane 6ab944bc23688cae6dc6fa32444891a1e57715c8
+openlane b6bacc9d1ab469917fda7ceea61ea3a18984b818
diff --git a/signoff/qspim_top/PDK_SOURCES b/signoff/qspim_top/PDK_SOURCES
index e8e14ea..f9d0f46 100644
--- a/signoff/qspim_top/PDK_SOURCES
+++ b/signoff/qspim_top/PDK_SOURCES
@@ -1 +1 @@
-open_pdks e8294524e5f67c533c5d0c3afa0bcc5b2a5fa066
+open_pdks 44a43c23c81b45b8e774ae7a84899a5a778b6b0b
diff --git a/signoff/uart_i2cm_usb_spi_top/OPENLANE_VERSION b/signoff/uart_i2cm_usb_spi_top/OPENLANE_VERSION
index d5588cd..b5bf449 100644
--- a/signoff/uart_i2cm_usb_spi_top/OPENLANE_VERSION
+++ b/signoff/uart_i2cm_usb_spi_top/OPENLANE_VERSION
@@ -1 +1 @@
-openlane 6ab944bc23688cae6dc6fa32444891a1e57715c8
+openlane b6bacc9d1ab469917fda7ceea61ea3a18984b818
diff --git a/signoff/uart_i2cm_usb_spi_top/PDK_SOURCES b/signoff/uart_i2cm_usb_spi_top/PDK_SOURCES
index e8e14ea..f9d0f46 100644
--- a/signoff/uart_i2cm_usb_spi_top/PDK_SOURCES
+++ b/signoff/uart_i2cm_usb_spi_top/PDK_SOURCES
@@ -1 +1 @@
-open_pdks e8294524e5f67c533c5d0c3afa0bcc5b2a5fa066
+open_pdks 44a43c23c81b45b8e774ae7a84899a5a778b6b0b
diff --git a/signoff/user_project_wrapper/OPENLANE_VERSION b/signoff/user_project_wrapper/OPENLANE_VERSION
index d5588cd..b5bf449 100644
--- a/signoff/user_project_wrapper/OPENLANE_VERSION
+++ b/signoff/user_project_wrapper/OPENLANE_VERSION
@@ -1 +1 @@
-openlane 6ab944bc23688cae6dc6fa32444891a1e57715c8
+openlane b6bacc9d1ab469917fda7ceea61ea3a18984b818
diff --git a/signoff/user_project_wrapper/PDK_SOURCES b/signoff/user_project_wrapper/PDK_SOURCES
index e8e14ea..f9d0f46 100644
--- a/signoff/user_project_wrapper/PDK_SOURCES
+++ b/signoff/user_project_wrapper/PDK_SOURCES
@@ -1 +1 @@
-open_pdks e8294524e5f67c533c5d0c3afa0bcc5b2a5fa066
+open_pdks 44a43c23c81b45b8e774ae7a84899a5a778b6b0b
diff --git a/signoff/wb_host/OPENLANE_VERSION b/signoff/wb_host/OPENLANE_VERSION
index d5588cd..b5bf449 100644
--- a/signoff/wb_host/OPENLANE_VERSION
+++ b/signoff/wb_host/OPENLANE_VERSION
@@ -1 +1 @@
-openlane 6ab944bc23688cae6dc6fa32444891a1e57715c8
+openlane b6bacc9d1ab469917fda7ceea61ea3a18984b818
diff --git a/signoff/wb_host/PDK_SOURCES b/signoff/wb_host/PDK_SOURCES
index e8e14ea..f9d0f46 100644
--- a/signoff/wb_host/PDK_SOURCES
+++ b/signoff/wb_host/PDK_SOURCES
@@ -1 +1 @@
-open_pdks e8294524e5f67c533c5d0c3afa0bcc5b2a5fa066
+open_pdks 44a43c23c81b45b8e774ae7a84899a5a778b6b0b
diff --git a/signoff/wb_interconnect/OPENLANE_VERSION b/signoff/wb_interconnect/OPENLANE_VERSION
index d5588cd..b5bf449 100644
--- a/signoff/wb_interconnect/OPENLANE_VERSION
+++ b/signoff/wb_interconnect/OPENLANE_VERSION
@@ -1 +1 @@
-openlane 6ab944bc23688cae6dc6fa32444891a1e57715c8
+openlane b6bacc9d1ab469917fda7ceea61ea3a18984b818
diff --git a/signoff/wb_interconnect/PDK_SOURCES b/signoff/wb_interconnect/PDK_SOURCES
index e8e14ea..f9d0f46 100644
--- a/signoff/wb_interconnect/PDK_SOURCES
+++ b/signoff/wb_interconnect/PDK_SOURCES
@@ -1 +1 @@
-open_pdks e8294524e5f67c533c5d0c3afa0bcc5b2a5fa066
+open_pdks 44a43c23c81b45b8e774ae7a84899a5a778b6b0b
diff --git a/sta/scripts/caravel_timing.tcl b/sta/scripts/caravel_timing.tcl
index 0593e3b..e8fb7d2 100644
--- a/sta/scripts/caravel_timing.tcl
+++ b/sta/scripts/caravel_timing.tcl
@@ -1,26 +1,26 @@
 
         set ::env(USER_ROOT)    ".."
-        set ::env(CARAVEL_ROOT) "/home/dinesha/workarea/efabless/MPW-6/caravel"
-        set ::env(CARAVEL_PDK_ROOT)     "/opt/pdk_mpw6"
+        set ::env(CARAVEL_ROOT) "/home/dinesha/workarea/efabless/MPW-7/caravel"
+        set ::env(CARAVEL_PDK_ROOT)     "/opt/pdk_mpw7/sky130B"
 
-        read_liberty $::env(CARAVEL_PDK_ROOT)/sky130A/libs.ref/sky130_fd_sc_hd/lib/sky130_fd_sc_hd__tt_025C_1v80.lib	
-	read_liberty $::env(CARAVEL_PDK_ROOT)/sky130A/libs.ref/sky130_sram_macros/lib/sky130_sram_2kbyte_1rw1r_32x512_8_TT_1p8V_25C.lib	
-	read_liberty $::env(CARAVEL_PDK_ROOT)/sky130A/libs.ref/sky130_sram_macros/lib/sky130_sram_1kbyte_1rw1r_32x256_8_TT_1p8V_25C.lib
-	read_liberty $::env(CARAVEL_PDK_ROOT)/sky130A/libs.ref/sky130_fd_sc_hvl/lib/sky130_fd_sc_hvl__tt_025C_3v30.lib	
-	read_liberty $::env(CARAVEL_PDK_ROOT)/sky130A/libs.ref/sky130_fd_sc_hvl/lib/sky130_fd_sc_hvl__tt_025C_3v30_lv1v80.lib	
-	read_liberty $::env(CARAVEL_PDK_ROOT)/sky130A/libs.ref/sky130_fd_io/lib/sky130_fd_io__top_gpiov2_tt_tt_025C_1v80_3v30.lib	
-	read_liberty $::env(CARAVEL_PDK_ROOT)/sky130A/libs.ref/sky130_fd_io/lib/sky130_fd_io__top_ground_hvc_wpad_tt_025C_1v80_3v30_3v30.lib	
-	read_liberty $::env(CARAVEL_PDK_ROOT)/sky130A/libs.ref/sky130_fd_io/lib/sky130_fd_io__top_ground_lvc_wpad_tt_025C_1v80_3v30.lib	
-	read_liberty $::env(CARAVEL_PDK_ROOT)/sky130A/libs.ref/sky130_fd_io/lib/sky130_fd_io__top_ground_lvc_wpad_tt_100C_1v80_3v30.lib	
-	read_liberty $::env(CARAVEL_PDK_ROOT)/sky130A/libs.ref/sky130_fd_io/lib/sky130_fd_io__top_power_lvc_wpad_tt_025C_1v80_3v30_3v30.lib	
-	read_liberty $::env(CARAVEL_PDK_ROOT)/sky130A/libs.ref/sky130_fd_io/lib/sky130_fd_io__top_xres4v2_tt_tt_025C_1v80_3v30.lib	
-	read_liberty $::env(CARAVEL_PDK_ROOT)/sky130A/libs.ref/sky130_fd_io/lib/sky130_ef_io__gpiov2_pad_tt_tt_025C_1v80_3v30.lib	
-	read_liberty $::env(CARAVEL_PDK_ROOT)/sky130A/libs.ref/sky130_fd_io/lib/sky130_ef_io__vccd_lvc_clamped_pad_tt_025C_1v80_3v30_3v30.lib	
-	read_liberty $::env(CARAVEL_PDK_ROOT)/sky130A/libs.ref/sky130_fd_io/lib/sky130_ef_io__vdda_hvc_clamped_pad_tt_025C_1v80_3v30_3v30.lib	
-	read_liberty $::env(CARAVEL_PDK_ROOT)/sky130A/libs.ref/sky130_fd_io/lib/sky130_ef_io__vssa_hvc_clamped_pad_tt_025C_1v80_3v30_3v30.lib	
-	read_liberty $::env(CARAVEL_PDK_ROOT)/sky130A/libs.ref/sky130_fd_io/lib/sky130_ef_io__vssd_lvc_clamped3_pad_tt_025C_1v80_3v30.lib	
-	read_liberty $::env(CARAVEL_PDK_ROOT)/sky130A/libs.ref/sky130_fd_io/lib/sky130_ef_io__vccd_lvc_clamped3_pad_tt_025C_1v80_3v30_3v30.lib	
-	read_liberty $::env(CARAVEL_PDK_ROOT)/sky130A/libs.ref/sky130_fd_io/lib/sky130_ef_io__vssd_lvc_clamped_pad_tt_025C_1v80_3v30.lib	
+    read_liberty $::env(CARAVEL_PDK_ROOT)/libs.ref/sky130_fd_sc_hd/lib/sky130_fd_sc_hd__tt_025C_1v80.lib	
+	read_liberty $::env(CARAVEL_PDK_ROOT)/libs.ref/sky130_sram_macros/lib/sky130_sram_2kbyte_1rw1r_32x512_8_TT_1p8V_25C.lib	
+	read_liberty $::env(CARAVEL_PDK_ROOT)/libs.ref/sky130_sram_macros/lib/sky130_sram_1kbyte_1rw1r_32x256_8_TT_1p8V_25C.lib
+	read_liberty $::env(CARAVEL_PDK_ROOT)/libs.ref/sky130_fd_sc_hvl/lib/sky130_fd_sc_hvl__tt_025C_3v30.lib	
+	read_liberty $::env(CARAVEL_PDK_ROOT)/libs.ref/sky130_fd_sc_hvl/lib/sky130_fd_sc_hvl__tt_025C_3v30_lv1v80.lib	
+	read_liberty $::env(CARAVEL_PDK_ROOT)/libs.ref/sky130_fd_io/lib/sky130_fd_io__top_gpiov2_tt_tt_025C_1v80_3v30.lib	
+	read_liberty $::env(CARAVEL_PDK_ROOT)/libs.ref/sky130_fd_io/lib/sky130_fd_io__top_ground_hvc_wpad_tt_025C_1v80_3v30_3v30.lib	
+	read_liberty $::env(CARAVEL_PDK_ROOT)/libs.ref/sky130_fd_io/lib/sky130_fd_io__top_ground_lvc_wpad_tt_025C_1v80_3v30.lib	
+	read_liberty $::env(CARAVEL_PDK_ROOT)/libs.ref/sky130_fd_io/lib/sky130_fd_io__top_ground_lvc_wpad_tt_100C_1v80_3v30.lib	
+	read_liberty $::env(CARAVEL_PDK_ROOT)/libs.ref/sky130_fd_io/lib/sky130_fd_io__top_power_lvc_wpad_tt_025C_1v80_3v30_3v30.lib	
+	read_liberty $::env(CARAVEL_PDK_ROOT)/libs.ref/sky130_fd_io/lib/sky130_fd_io__top_xres4v2_tt_tt_025C_1v80_3v30.lib	
+	read_liberty $::env(CARAVEL_PDK_ROOT)/libs.ref/sky130_fd_io/lib/sky130_ef_io__gpiov2_pad_tt_tt_025C_1v80_3v30.lib	
+	read_liberty $::env(CARAVEL_PDK_ROOT)/libs.ref/sky130_fd_io/lib/sky130_ef_io__vccd_lvc_clamped_pad_tt_025C_1v80_3v30_3v30.lib	
+	read_liberty $::env(CARAVEL_PDK_ROOT)/libs.ref/sky130_fd_io/lib/sky130_ef_io__vdda_hvc_clamped_pad_tt_025C_1v80_3v30_3v30.lib	
+	read_liberty $::env(CARAVEL_PDK_ROOT)/libs.ref/sky130_fd_io/lib/sky130_ef_io__vssa_hvc_clamped_pad_tt_025C_1v80_3v30_3v30.lib	
+	read_liberty $::env(CARAVEL_PDK_ROOT)/libs.ref/sky130_fd_io/lib/sky130_ef_io__vssd_lvc_clamped3_pad_tt_025C_1v80_3v30.lib	
+	read_liberty $::env(CARAVEL_PDK_ROOT)/libs.ref/sky130_fd_io/lib/sky130_ef_io__vccd_lvc_clamped3_pad_tt_025C_1v80_3v30_3v30.lib	
+	read_liberty $::env(CARAVEL_PDK_ROOT)/libs.ref/sky130_fd_io/lib/sky130_ef_io__vssd_lvc_clamped_pad_tt_025C_1v80_3v30.lib	
 	read_verilog $::env(CARAVEL_ROOT)/mgmt_core_wrapper/verilog/gl/mgmt_core.v	
 	read_verilog $::env(CARAVEL_ROOT)/mgmt_core_wrapper/verilog/gl/DFFRAM.v	
 	read_verilog $::env(CARAVEL_ROOT)/mgmt_core_wrapper/verilog/gl/mgmt_core_wrapper.v	
@@ -160,6 +160,7 @@
 
 
 	read_sdc -echo ./sdc/caravel.sdc	
+	set_propagated_clock [all_clocks]
 	check_setup  -verbose >  unconstraints.rpt
 	report_checks -path_delay min -fields {slew cap input nets fanout} -format full_clock_expanded -group_count 50	
 	report_checks -path_delay max -fields {slew cap input nets fanout} -format full_clock_expanded -group_count 50	
diff --git a/sta/sdc/caravel.sdc b/sta/sdc/caravel.sdc
index 950b657..b4df712 100644
--- a/sta/sdc/caravel.sdc
+++ b/sta/sdc/caravel.sdc
@@ -7,13 +7,17 @@
 set ::env(SYNTH_CLOCK_TRANSITION) 0.15
 
 ## MASTER CLOCKS
-create_clock [get_ports {"clock"} ] -name "clock"  -period 25
+create_clock [get_ports {"clock"} ] -name "master_clock"  -period 25
 create_clock [get_pins clocking/user_clk ] -name "user_clk2"  -period 25
-#create_clock [get_pins  housekeeping/_8847_/X ] -name "csclk"  -period 25
+create_generated_clock -name csclk -add -source [get_ports {clock}] -master_clock [get_clocks master_clock] -divide_by 1 -invert -comment {csclk} [get_pins housekeeping/_8847_/X]
 #create_clock [get_pins  clocking/pll_clk ] -name "pll_clk"  -period 25
 #create_clock [get_pins  clocking/pll_clk90 ] -name "pll_clk90"  -period 25
+create_clock [get_pins  housekeeping/serial_clock ] -name "serial_clock"  -period 50
+create_clock [get_pins  housekeeping/serial_load ]  -name "serial_load"  -period 50
 
-create_generated_clock -name wb_clk -add -source [get_ports {clock}] -master_clock [get_clocks clock] -divide_by 1 -comment {Wishbone User Clock} [get_pins mprj/wb_clk_i]
+
+
+create_generated_clock -name wb_clk -add -source [get_ports {clock}] -master_clock [get_clocks master_clock] -divide_by 1 -comment {Wishbone User Clock} [get_pins mprj/wb_clk_i]
 create_clock -name int_pll_clock -period 5.0000  [get_pins {mprj/u_wb_host/u_clkbuf_pll.u_buf/X}]
 
 create_clock -name wbs_ref_clk -period 5.0000   [get_pins {mprj/u_wb_host/u_wbs_ref_clkbuf.u_buf/X}]
@@ -22,13 +26,13 @@
 create_clock -name cpu_ref_clk -period 5.0000   [get_pins {mprj/u_wb_host/u_cpu_ref_clkbuf.u_buf/X}]
 create_clock -name cpu_clk     -period 10.0000  [get_pins {mprj/u_wb_host/cpu_clk}]
 
-create_clock -name rtc_clk     -period 50.0000  [get_pins {mprj/u_wb_host/rtc_clk}]
+create_clock -name rtc_clk     -period 50.0000  [get_pins {mprj/u_pinmux/rtc_clk}]
 
 create_clock -name pll_ref_clk -period 20.0000  [get_pins {mprj/u_wb_host/pll_ref_clk}]
 create_clock -name pll_clk_0   -period 5.0000   [get_pins {mprj/u_pll/ringosc.ibufp01/Y}]
 
-create_clock -name usb_ref_clk -period 5.0000   [get_pins {mprj/u_wb_host/u_usb_ref_clkbuf.u_buf/X}]
-create_clock -name usb_clk     -period 20.0000  [get_pins {mprj/u_wb_host/usb_clk}]
+create_clock -name usb_ref_clk -period 5.0000   [get_pins {mprj/u_pinmux/u_glbl_reg.u_usb_ref_clkbuf.u_buf/X}]
+create_clock -name usb_clk     -period 20.0000  [get_pins {mprj/u_pinmux/usb_clk}]
 create_clock -name uarts0_clk  -period 100.0000 [get_pins {mprj/u_uart_i2c_usb_spi/u_uart0_core.u_lineclk_buf.genblk1.u_mux/X}]
 create_clock -name uarts1_clk  -period 100.0000 [get_pins {mprj/u_uart_i2c_usb_spi/u_uart1_core.u_lineclk_buf.genblk1.u_mux/X}]
 create_clock -name uartm_clk   -period 100.0000 [get_pins {mprj/u_wb_host/u_uart2wb.u_core.u_uart_clk.genblk1.u_mux/X}]
@@ -36,41 +40,41 @@
 
 ## Case analysis
 
+set_case_analysis 0 [get_pins {mprj/u_qspi_master/cfg_cska_sp_co[3]}]
+set_case_analysis 0 [get_pins {mprj/u_qspi_master/cfg_cska_sp_co[2]}]
+set_case_analysis 0 [get_pins {mprj/u_qspi_master/cfg_cska_sp_co[1]}]
+set_case_analysis 0 [get_pins {mprj/u_qspi_master/cfg_cska_sp_co[0]}]
+
+
+set_case_analysis 1 [get_pins {mprj/u_pinmux/cfg_cska_pinmux[3]}]
+set_case_analysis 0 [get_pins {mprj/u_pinmux/cfg_cska_pinmux[2]}]
+set_case_analysis 0 [get_pins {mprj/u_pinmux/cfg_cska_pinmux[1]}]
+set_case_analysis 0 [get_pins {mprj/u_pinmux/cfg_cska_pinmux[0]}]
+
+set_case_analysis 0 [get_pins {mprj/u_uart_i2c_usb_spi/cfg_cska_uart[3]}]
+set_case_analysis 1 [get_pins {mprj/u_uart_i2c_usb_spi/cfg_cska_uart[2]}]
+set_case_analysis 1 [get_pins {mprj/u_uart_i2c_usb_spi/cfg_cska_uart[1]}]
+set_case_analysis 1 [get_pins {mprj/u_uart_i2c_usb_spi/cfg_cska_uart[0]}]
+
+set_case_analysis 1 [get_pins {mprj/u_qspi_master/cfg_cska_spi[3]}]
+set_case_analysis 0 [get_pins {mprj/u_qspi_master/cfg_cska_spi[2]}]
+set_case_analysis 0 [get_pins {mprj/u_qspi_master/cfg_cska_spi[1]}]
+set_case_analysis 1 [get_pins {mprj/u_qspi_master/cfg_cska_spi[0]}]
+
+set_case_analysis 1 [get_pins {mprj/u_riscv_top.u_intf/cfg_cska_riscv[3]}]
+set_case_analysis 0 [get_pins {mprj/u_riscv_top.u_intf/cfg_cska_riscv[2]}]
+set_case_analysis 0 [get_pins {mprj/u_riscv_top.u_intf/cfg_cska_riscv[1]}]
+set_case_analysis 0 [get_pins {mprj/u_riscv_top.u_intf/cfg_cska_riscv[0]}]
+
+set_case_analysis 1 [get_pins {mprj/u_wb_host/cfg_cska_wh[3]}]
+set_case_analysis 0 [get_pins {mprj/u_wb_host/cfg_cska_wh[2]}]
+set_case_analysis 0 [get_pins {mprj/u_wb_host/cfg_cska_wh[1]}]
+set_case_analysis 1 [get_pins {mprj/u_wb_host/cfg_cska_wh[0]}]
+
+set_case_analysis 1 [get_pins {mprj/u_intercon/cfg_cska_wi[3]}]
+set_case_analysis 0 [get_pins {mprj/u_intercon/cfg_cska_wi[2]}]
 set_case_analysis 0 [get_pins {mprj/u_intercon/cfg_cska_wi[0]}]
 set_case_analysis 0 [get_pins {mprj/u_intercon/cfg_cska_wi[1]}]
-set_case_analysis 0 [get_pins {mprj/u_intercon/cfg_cska_wi[2]}]
-set_case_analysis 1 [get_pins {mprj/u_intercon/cfg_cska_wi[3]}]
-
-set_case_analysis 0 [get_pins {mprj/u_pinmux/cfg_cska_pinmux[0]}]
-set_case_analysis 0 [get_pins {mprj/u_pinmux/cfg_cska_pinmux[1]}]
-set_case_analysis 0 [get_pins {mprj/u_pinmux/cfg_cska_pinmux[2]}]
-set_case_analysis 1 [get_pins {mprj/u_pinmux/cfg_cska_pinmux[3]}]
-
-set_case_analysis 0 [get_pins {mprj/u_qspi_master/cfg_cska_sp_co[0]}]
-set_case_analysis 0 [get_pins {mprj/u_qspi_master/cfg_cska_sp_co[1]}]
-set_case_analysis 0 [get_pins {mprj/u_qspi_master/cfg_cska_sp_co[2]}]
-set_case_analysis 0 [get_pins {mprj/u_qspi_master/cfg_cska_sp_co[3]}]
-
-set_case_analysis 1 [get_pins {mprj/u_qspi_master/cfg_cska_spi[0]}]
-set_case_analysis 0 [get_pins {mprj/u_qspi_master/cfg_cska_spi[1]}]
-set_case_analysis 0 [get_pins {mprj/u_qspi_master/cfg_cska_spi[2]}]
-set_case_analysis 1 [get_pins {mprj/u_qspi_master/cfg_cska_spi[3]}]
-
-set_case_analysis 0 [get_pins {mprj/u_riscv_top.u_intf/cfg_cska_riscv[0]}]
-set_case_analysis 0 [get_pins {mprj/u_riscv_top.u_intf/cfg_cska_riscv[1]}]
-set_case_analysis 0 [get_pins {mprj/u_riscv_top.u_intf/cfg_cska_riscv[2]}]
-set_case_analysis 1 [get_pins {mprj/u_riscv_top.u_intf/cfg_cska_riscv[3]}]
-
-set_case_analysis 1 [get_pins {mprj/u_wb_host/cfg_cska_wh[0]}]
-set_case_analysis 0 [get_pins {mprj/u_wb_host/cfg_cska_wh[1]}]
-set_case_analysis 0 [get_pins {mprj/u_wb_host/cfg_cska_wh[2]}]
-set_case_analysis 1 [get_pins {mprj/u_wb_host/cfg_cska_wh[3]}]
-
-set_case_analysis 1 [get_pins {mprj/u_uart_i2c_usb_spi/cfg_cska_uart[0]}]
-set_case_analysis 1 [get_pins {mprj/u_uart_i2c_usb_spi/cfg_cska_uart[1]}]
-set_case_analysis 1 [get_pins {mprj/u_uart_i2c_usb_spi/cfg_cska_uart[2]}]
-set_case_analysis 0 [get_pins {mprj/u_uart_i2c_usb_spi/cfg_cska_uart[3]}]
-
 
 #Keept the SRAM clock driving edge at pos edge
 set_case_analysis 0 [get_pins {mprj/u_riscv_top.u_intf/cfg_sram_lphase[0]}]
@@ -84,8 +88,13 @@
 
 set_propagated_clock [all_clocks]
 
+#set_multicycle_path -setup -from [get_clocks {master_clock}] -to [get_clocks {csclk}] 2
+#set_multicycle_path -hold -from [get_clocks {master_clock}] -to [get_clocks {csclk}] 2
+
 set_clock_groups -name async_clock -asynchronous \
- -group [get_clocks {clock wb_clk }]\
+ -group [get_clocks {wb_clk master_clock}]\
+ -group [get_clocks {csclk}]\
+ -group [get_clocks {serial_clock serial_load }]\
  -group [get_clocks {user_clk2}]\
  -group [get_clocks {int_pll_clock}]\
  -group [get_clocks {wbs_clk_i}]\
@@ -108,50 +117,50 @@
 puts "\[INFO\]: Setting output delay to: $output_delay_value"
 puts "\[INFO\]: Setting input delay to: $input_delay_value"
 
-set_input_delay $input_delay_value  -clock [get_clocks {clock}] -add_delay [get_ports {gpio}]
-set_input_delay $input_delay_value  -clock [get_clocks {clock}] -add_delay [get_ports {mprj_io[0]}]
-set_input_delay $input_delay_value  -clock [get_clocks {clock}] -add_delay [get_ports {mprj_io[1]}]
-set_input_delay $input_delay_value  -clock [get_clocks {clock}] -add_delay [get_ports {mprj_io[2]}]
-set_input_delay $input_delay_value  -clock [get_clocks {clock}] -add_delay [get_ports {mprj_io[3]}]
-set_input_delay $input_delay_value  -clock [get_clocks {clock}] -add_delay [get_ports {mprj_io[4]}]
-set_input_delay $input_delay_value  -clock [get_clocks {clock}] -add_delay [get_ports {mprj_io[5]}]
-set_input_delay $input_delay_value  -clock [get_clocks {clock}] -add_delay [get_ports {mprj_io[6]}]
-set_input_delay $input_delay_value  -clock [get_clocks {clock}] -add_delay [get_ports {mprj_io[7]}]
-set_input_delay $input_delay_value  -clock [get_clocks {clock}] -add_delay [get_ports {mprj_io[8]}]
-set_input_delay $input_delay_value  -clock [get_clocks {clock}] -add_delay [get_ports {mprj_io[9]}]
-set_input_delay $input_delay_value  -clock [get_clocks {clock}] -add_delay [get_ports {mprj_io[10]}]
-set_input_delay $input_delay_value  -clock [get_clocks {clock}] -add_delay [get_ports {mprj_io[11]}]
-set_input_delay $input_delay_value  -clock [get_clocks {clock}] -add_delay [get_ports {mprj_io[12]}]
-set_input_delay $input_delay_value  -clock [get_clocks {clock}] -add_delay [get_ports {mprj_io[13]}]
-set_input_delay $input_delay_value  -clock [get_clocks {clock}] -add_delay [get_ports {mprj_io[14]}]
-set_input_delay $input_delay_value  -clock [get_clocks {clock}] -add_delay [get_ports {mprj_io[15]}]
-set_input_delay $input_delay_value  -clock [get_clocks {clock}] -add_delay [get_ports {mprj_io[16]}]
-set_input_delay $input_delay_value  -clock [get_clocks {clock}] -add_delay [get_ports {mprj_io[17]}]
-set_input_delay $input_delay_value  -clock [get_clocks {clock}] -add_delay [get_ports {mprj_io[18]}]
-set_input_delay $input_delay_value  -clock [get_clocks {clock}] -add_delay [get_ports {mprj_io[19]}]
-set_input_delay $input_delay_value  -clock [get_clocks {clock}] -add_delay [get_ports {mprj_io[20]}]
-set_input_delay $input_delay_value  -clock [get_clocks {clock}] -add_delay [get_ports {mprj_io[21]}]
-set_input_delay $input_delay_value  -clock [get_clocks {clock}] -add_delay [get_ports {mprj_io[22]}]
-set_input_delay $input_delay_value  -clock [get_clocks {clock}] -add_delay [get_ports {mprj_io[23]}]
-set_input_delay $input_delay_value  -clock [get_clocks {clock}] -add_delay [get_ports {mprj_io[24]}]
-set_input_delay $input_delay_value  -clock [get_clocks {clock}] -add_delay [get_ports {mprj_io[25]}]
-set_input_delay $input_delay_value  -clock [get_clocks {clock}] -add_delay [get_ports {mprj_io[26]}]
-set_input_delay $input_delay_value  -clock [get_clocks {clock}] -add_delay [get_ports {mprj_io[27]}]
-set_input_delay $input_delay_value  -clock [get_clocks {clock}] -add_delay [get_ports {mprj_io[28]}]
-set_input_delay $input_delay_value  -clock [get_clocks {clock}] -add_delay [get_ports {mprj_io[29]}]
-set_input_delay $input_delay_value  -clock [get_clocks {clock}] -add_delay [get_ports {mprj_io[30]}]
-set_input_delay $input_delay_value  -clock [get_clocks {clock}] -add_delay [get_ports {mprj_io[31]}]
-set_input_delay $input_delay_value  -clock [get_clocks {clock}] -add_delay [get_ports {mprj_io[32]}]
-set_input_delay $input_delay_value  -clock [get_clocks {clock}] -add_delay [get_ports {mprj_io[33]}]
-set_input_delay $input_delay_value  -clock [get_clocks {clock}] -add_delay [get_ports {mprj_io[34]}]
-set_input_delay $input_delay_value  -clock [get_clocks {clock}] -add_delay [get_ports {mprj_io[35]}]
-set_input_delay $input_delay_value  -clock [get_clocks {clock}] -add_delay [get_ports {mprj_io[36]}]
-set_input_delay $input_delay_value  -clock [get_clocks {clock}] -add_delay [get_ports {mprj_io[37]}]
+set_input_delay $input_delay_value  -clock [get_clocks {master_clock}] -add_delay [get_ports {gpio}]
+set_input_delay $input_delay_value  -clock [get_clocks {master_clock}] -add_delay [get_ports {mprj_io[0]}]
+set_input_delay $input_delay_value  -clock [get_clocks {master_clock}] -add_delay [get_ports {mprj_io[1]}]
+set_input_delay $input_delay_value  -clock [get_clocks {master_clock}] -add_delay [get_ports {mprj_io[2]}]
+set_input_delay $input_delay_value  -clock [get_clocks {master_clock}] -add_delay [get_ports {mprj_io[3]}]
+set_input_delay $input_delay_value  -clock [get_clocks {master_clock}] -add_delay [get_ports {mprj_io[4]}]
+set_input_delay $input_delay_value  -clock [get_clocks {master_clock}] -add_delay [get_ports {mprj_io[5]}]
+set_input_delay $input_delay_value  -clock [get_clocks {master_clock}] -add_delay [get_ports {mprj_io[6]}]
+set_input_delay $input_delay_value  -clock [get_clocks {master_clock}] -add_delay [get_ports {mprj_io[7]}]
+set_input_delay $input_delay_value  -clock [get_clocks {master_clock}] -add_delay [get_ports {mprj_io[8]}]
+set_input_delay $input_delay_value  -clock [get_clocks {master_clock}] -add_delay [get_ports {mprj_io[9]}]
+set_input_delay $input_delay_value  -clock [get_clocks {master_clock}] -add_delay [get_ports {mprj_io[10]}]
+set_input_delay $input_delay_value  -clock [get_clocks {master_clock}] -add_delay [get_ports {mprj_io[11]}]
+set_input_delay $input_delay_value  -clock [get_clocks {master_clock}] -add_delay [get_ports {mprj_io[12]}]
+set_input_delay $input_delay_value  -clock [get_clocks {master_clock}] -add_delay [get_ports {mprj_io[13]}]
+set_input_delay $input_delay_value  -clock [get_clocks {master_clock}] -add_delay [get_ports {mprj_io[14]}]
+set_input_delay $input_delay_value  -clock [get_clocks {master_clock}] -add_delay [get_ports {mprj_io[15]}]
+set_input_delay $input_delay_value  -clock [get_clocks {master_clock}] -add_delay [get_ports {mprj_io[16]}]
+set_input_delay $input_delay_value  -clock [get_clocks {master_clock}] -add_delay [get_ports {mprj_io[17]}]
+set_input_delay $input_delay_value  -clock [get_clocks {master_clock}] -add_delay [get_ports {mprj_io[18]}]
+set_input_delay $input_delay_value  -clock [get_clocks {master_clock}] -add_delay [get_ports {mprj_io[19]}]
+set_input_delay $input_delay_value  -clock [get_clocks {master_clock}] -add_delay [get_ports {mprj_io[20]}]
+set_input_delay $input_delay_value  -clock [get_clocks {master_clock}] -add_delay [get_ports {mprj_io[21]}]
+set_input_delay $input_delay_value  -clock [get_clocks {master_clock}] -add_delay [get_ports {mprj_io[22]}]
+set_input_delay $input_delay_value  -clock [get_clocks {master_clock}] -add_delay [get_ports {mprj_io[23]}]
+set_input_delay $input_delay_value  -clock [get_clocks {master_clock}] -add_delay [get_ports {mprj_io[24]}]
+set_input_delay $input_delay_value  -clock [get_clocks {master_clock}] -add_delay [get_ports {mprj_io[25]}]
+set_input_delay $input_delay_value  -clock [get_clocks {master_clock}] -add_delay [get_ports {mprj_io[26]}]
+set_input_delay $input_delay_value  -clock [get_clocks {master_clock}] -add_delay [get_ports {mprj_io[27]}]
+set_input_delay $input_delay_value  -clock [get_clocks {master_clock}] -add_delay [get_ports {mprj_io[28]}]
+set_input_delay $input_delay_value  -clock [get_clocks {master_clock}] -add_delay [get_ports {mprj_io[29]}]
+set_input_delay $input_delay_value  -clock [get_clocks {master_clock}] -add_delay [get_ports {mprj_io[30]}]
+set_input_delay $input_delay_value  -clock [get_clocks {master_clock}] -add_delay [get_ports {mprj_io[31]}]
+set_input_delay $input_delay_value  -clock [get_clocks {master_clock}] -add_delay [get_ports {mprj_io[32]}]
+set_input_delay $input_delay_value  -clock [get_clocks {master_clock}] -add_delay [get_ports {mprj_io[33]}]
+set_input_delay $input_delay_value  -clock [get_clocks {master_clock}] -add_delay [get_ports {mprj_io[34]}]
+set_input_delay $input_delay_value  -clock [get_clocks {master_clock}] -add_delay [get_ports {mprj_io[35]}]
+set_input_delay $input_delay_value  -clock [get_clocks {master_clock}] -add_delay [get_ports {mprj_io[36]}]
+set_input_delay $input_delay_value  -clock [get_clocks {master_clock}] -add_delay [get_ports {mprj_io[37]}]
 
-set_output_delay $output_delay_value  -clock [get_clocks {clock}] -add_delay [get_ports {flash_csb}]
-set_output_delay $output_delay_value  -clock [get_clocks {clock}] -add_delay [get_ports {flash_clk}]
-set_output_delay $output_delay_value  -clock [get_clocks {clock}] -add_delay [get_ports {flash_io0}]
-set_output_delay $output_delay_value  -clock [get_clocks {clock}] -add_delay [get_ports {flash_io1}]
+set_output_delay $output_delay_value  -clock [get_clocks {master_clock}] -add_delay [get_ports {flash_csb}]
+set_output_delay $output_delay_value  -clock [get_clocks {master_clock}] -add_delay [get_ports {flash_clk}]
+set_output_delay $output_delay_value  -clock [get_clocks {master_clock}] -add_delay [get_ports {flash_io0}]
+set_output_delay $output_delay_value  -clock [get_clocks {master_clock}] -add_delay [get_ports {flash_io1}]
 
 set_max_fanout $::env(SYNTH_MAX_FANOUT) [current_design]
 
@@ -265,4 +274,4 @@
 
 
 puts "\[INFO\]: Setting clock transition to: $::env(SYNTH_CLOCK_TRANSITION)"
-set_clock_transition $::env(SYNTH_CLOCK_TRANSITION) [get_clocks {clock}]
+set_clock_transition $::env(SYNTH_CLOCK_TRANSITION) [get_clocks {master_clock}]
diff --git a/verilog/dv/agents/uart_agent.v b/verilog/dv/agents/uart_agent.v
index c9f11b4..5ca1813 100644
--- a/verilog/dv/agents/uart_agent.v
+++ b/verilog/dv/agents/uart_agent.v
@@ -41,6 +41,7 @@
 reg [15:0] stop_err2_cnt;
 reg [15:0] timeout_err_cnt;
 reg [15:0] err_cnt;
+reg        uart_rxenb; // uart rx enable
 
 reg 	   txd, read, write;
 wire	   uart_rx_clk;
@@ -56,6 +57,7 @@
 
 initial 
 begin
+    uart_rxenb = 0;
 	debug_mode = 1; // Keep in debug mode and enable display
 	txd = 1'b1;
  	uart_clk = 0;
@@ -77,9 +79,16 @@
 
 always @(posedge mclk)
 begin
-	timeout_count = timeout_count + 1;
-	if (timeout_count == (control_setup.maxtime * 16))
-		-> abort;
+    if(uart_rxenb) begin
+      	timeout_count = timeout_count + 1;
+      	if (timeout_count >= (control_setup.maxtime * 16)) begin
+            timeout_count = 0;
+            uart_rxenb    = 0;
+      	    -> abort;
+        end
+    end else begin
+      	timeout_count = 0;
+    end
 end
 
 always @uart_read_done
@@ -118,6 +127,7 @@
 ////////////////////////////////////////////////////////////////////////////////
 task uart_init;
 begin
+  uart_rxenb = 0;
   read = 0;
   write = 0;
   tx_count = 0;
@@ -144,9 +154,10 @@
 reg	parity;
 
 begin
-	data <= 8'h0;
-	parity <= 1;
+	data = 8'h0;
+	parity = 1;
 	timeout_count = 0;
+    uart_rxenb = 1;
 
 fork	
    begin : loop_1
@@ -162,15 +173,15 @@
 // start cycle
 	@(negedge rxd) 
 	 disable loop_1;
-	 read <= 1;
+	 read = 1;
 
 // data cycle
 	@(posedge uart_rx_clk);
 	 for (i = 0; i < data_bit_number; i = i + 1)
 	  begin
 	    @(posedge uart_rx_clk)
-	    data[i] <=  rxd;
-	    parity <= parity ^ rxd;
+	    data[i] =  rxd;
+	    parity = parity ^ rxd;
 	  end		
 
 // parity cycle
@@ -207,7 +218,7 @@
 		  end
 	end
 
-	read <= 0;
+	read = 0;
 	-> uart_read_done;
 
 	if (expected_data != data)
@@ -224,6 +235,7 @@
 	   $display ("%m:... Read Data from UART done cnt :%d...",rx_count +1);
    end
 join
+    uart_rxenb = 0;
 
 end
 
@@ -233,16 +245,17 @@
 task read_char2;
 output [7:0]	rxd_data;
 output          timeout; // 1-> timeout
-integer i;
+integer j;
 reg	[7:0] rxd_data;
 reg 	[7:0] data;
 reg	parity;
 
 begin
-	data <= 8'h0;
-	parity <= 1;
+	data = 8'h0;
+	parity = 1;
 	timeout_count = 0;
 	timeout = 0;
+    uart_rxenb = 1;
 
    fork	
    begin 
@@ -256,15 +269,15 @@
 
 // start cycle
 	@(negedge rxd) 
-	 read <= 1;
+	 read = 1;
 
 // data cycle
 	@(posedge uart_rx_clk );
-	 for (i = 0; i < data_bit_number; i = i + 1)
+	 for (j = 0; j < data_bit_number; j = j + 1)
 	  begin
 	    @(posedge uart_rx_clk)
-	    data[i] <=  rxd;
-	    parity <= parity ^ rxd;
+	    data[j] =  rxd;
+	    parity = parity ^ rxd;
 	  end		
 
 // parity cycle
@@ -301,7 +314,7 @@
 		  end
 	end
 
-	read <= 0;
+	read = 0;
 	-> uart_read_done;
 
 //      $display ("(%m) Received Data  %c", data);
@@ -312,6 +325,7 @@
    join_any
    disable fork; //disable pending fork activity
 
+    uart_rxenb = 0;
 end
 
 endtask
@@ -331,10 +345,11 @@
 reg	parity;
 
 begin
-	data <= 8'h0;
-	parity <= 1;
+	data = 8'h0;
+	parity = 1;
 	timeout_count = 0;
 	timeout = 0;
+    uart_rxenb = 1;
 
 
 fork	
@@ -352,15 +367,15 @@
 // start cycle
 	@(negedge rxd) 
 	 disable loop_1;
-	 read <= 1;
+	 read = 1;
 
 // data cycle
 	@(posedge uart_rx_clk);
 	 for (i = 0; i < data_bit_number; i = i + 1)
 	  begin
 	    @(posedge uart_rx_clk)
-	    data[i] <=  rxd;
-	    parity <= parity ^ rxd;
+	    data[i] =  rxd;
+	    parity = parity ^ rxd;
 	  end		
 
 // parity cycle
@@ -397,7 +412,7 @@
 		  end
 	end
 
-	read <= 0;
+	read = 0;
 	-> uart_read_done;
 
 	rxd_data = data;
@@ -409,6 +424,7 @@
         end
    end
 join
+    uart_rxenb = 0;
 
 end
 
@@ -424,8 +440,9 @@
 reg	parity;
 
 begin
-	data <= 8'h0;
-	parity <= 1;
+	data = 8'h0;
+	parity = 1;
+    uart_rxenb = 1;
 
 
 fork	
@@ -433,15 +450,15 @@
 
 // start cycle
 	@(negedge rxd) 
-	 read <= 1;
+	 read = 1;
 
 // data cycle
 	@(posedge uart_rx_clk);
 	 for (i = 0; i < data_bit_number; i = i + 1)
 	  begin
 	    @(posedge uart_rx_clk)
-	    data[i] <=  rxd;
-	    parity <= parity ^ rxd;
+	    data[i] =  rxd;
+	    parity = parity ^ rxd;
 	  end		
 
 // parity cycle
@@ -478,12 +495,13 @@
 		  end
 	end
 
-	read <= 0;
+	read = 0;
 	-> uart_read_done;
 
 	rxd_data = data;
    end
 join
+    uart_rxenb = 0;
 
 end
 
@@ -497,13 +515,13 @@
 reg parity;	// 0: odd parity, 1: even parity
 
 begin
-	parity <=  #1 1;
+	parity =  #1 1;
 
 // start cycle
 	@(posedge uart_clk)
 	 begin
-		txd <= #1 0;
-		write <= #1 1;
+		txd = #1 0;
+		write = #1 1;
 	 end
 
 // data cycle
@@ -511,8 +529,8 @@
 	   for (i = 0; i < data_bit_number; i = i + 1)
 	   begin
 		@(posedge uart_clk)
-		    txd <= #1 data[i];
-		parity <= parity ^ data[i];
+		    txd = #1 data[i];
+		parity = parity ^ data[i];
 	   end
 	end
 
@@ -520,24 +538,24 @@
 	if (control_setup.parity_en)
 	begin
 		@(posedge uart_clk)
-			txd <= #1 
+			txd = #1 
 //				control_setup.stick_parity ? ~control_setup.even_odd_parity : 
 				control_setup.even_odd_parity ? !parity : parity;
 	end
 
 // stop cycle 1
 	@(posedge uart_clk)
-		txd <= #1 stop_err_check ? 0 : 1;
+		txd = #1 stop_err_check ? 0 : 1;
 
 // stop cycle 2
 	@(posedge uart_clk);
-		txd <= #1 1;
+		txd = #1 1;
 	if (data_bit_number == 5)
 		@(negedge uart_clk);
 	else if (control_setup.stop_bit_number)
 		@(posedge uart_clk);
 
-	write <= #1 0;
+	write = #1 0;
 	if(debug_mode)
 	   $display ("%m:... Write data %h to UART done cnt : %d ...\n", data,tx_count+1);
         else
diff --git a/verilog/dv/agents/uart_master_tasks.sv b/verilog/dv/agents/uart_master_tasks.sv
index f0a1a7d..cd0af94 100644
--- a/verilog/dv/agents/uart_master_tasks.sv
+++ b/verilog/dv/agents/uart_master_tasks.sv
@@ -5,8 +5,6 @@
 reg [7:0] read_data;
 reg flag;
 begin
-   fork
-   begin : loop_1
        tb_master_uart.write_char("w");
        tb_master_uart.write_char("m");
        tb_master_uart.write_char(" ");
@@ -28,17 +26,13 @@
        tb_master_uart.write_char(hex2char(data[7:4]));
        tb_master_uart.write_char(hex2char(data[3:0]));
        tb_master_uart.write_char("\n");
-   end
-   begin : loop_2
        // Wait for sucess command
        flag = 0;
        while(flag == 0)
        begin
           tb_master_uart.read_char2(read_data,flag);
-          //$write ("%c",read_data);
+             //$write ("%c",read_data);
        end
-   end
-   join
 end
 endtask
 
@@ -49,28 +43,24 @@
 reg flag;
 integer i;
 begin
-   fork
-   begin : loop_1
-      tb_master_uart.write_char("r");
-      tb_master_uart.write_char("m");
-      tb_master_uart.write_char(" ");
-      tb_master_uart.write_char(hex2char(addr[31:28]));
-      tb_master_uart.write_char(hex2char(addr[27:24]));
-      tb_master_uart.write_char(hex2char(addr[23:20]));
-      tb_master_uart.write_char(hex2char(addr[19:16]));
-      tb_master_uart.write_char(hex2char(addr[15:12]));
-      tb_master_uart.write_char(hex2char(addr[11:8]));
-      tb_master_uart.write_char(hex2char(addr[7:4]));
-      tb_master_uart.write_char(hex2char(addr[3:0]));
-      tb_master_uart.write_char("\n");
-   end
-   begin : loop_2
-      // Wait for sucess command
-      flag = 0;
-      i = 0;
-      while(flag == 0)
-      begin
-         tb_master_uart.read_char2(read_data,flag);
+   tb_master_uart.write_char("r");
+   tb_master_uart.write_char("m");
+   tb_master_uart.write_char(" ");
+   tb_master_uart.write_char(hex2char(addr[31:28]));
+   tb_master_uart.write_char(hex2char(addr[27:24]));
+   tb_master_uart.write_char(hex2char(addr[23:20]));
+   tb_master_uart.write_char(hex2char(addr[19:16]));
+   tb_master_uart.write_char(hex2char(addr[15:12]));
+   tb_master_uart.write_char(hex2char(addr[11:8]));
+   tb_master_uart.write_char(hex2char(addr[7:4]));
+   tb_master_uart.write_char(hex2char(addr[3:0]));
+   tb_master_uart.write_char("\n");
+   // Wait for sucess command
+   flag = 0;
+   i = 0;
+   while(flag == 0)
+   begin
+      tb_master_uart.read_char2(read_data,flag);
          //$write ("%d:%c",i,read_data);
            case (i)
            8'd10 : data[31:28] = char2hex(read_data);
@@ -81,12 +71,10 @@
            8'd15 : data[11:8]  = char2hex(read_data);
            8'd16 : data[7:4]   = char2hex(read_data);
            8'd17 : data[3:0]   = char2hex(read_data);
-           endcase
-	   i = i+1;
-      end
-   end
-   join
+      endcase
+	  i = i+1;
    $display("received Data: %x",data);
+   end
 
 end
 endtask
@@ -99,43 +87,37 @@
 reg flag;
 integer i;
 begin
-   fork
-   begin : loop_1
-      tb_master_uart.write_char("r");
-      tb_master_uart.write_char("m");
-      tb_master_uart.write_char(" ");
-      tb_master_uart.write_char(hex2char(addr[31:28]));
-      tb_master_uart.write_char(hex2char(addr[27:24]));
-      tb_master_uart.write_char(hex2char(addr[23:20]));
-      tb_master_uart.write_char(hex2char(addr[19:16]));
-      tb_master_uart.write_char(hex2char(addr[15:12]));
-      tb_master_uart.write_char(hex2char(addr[11:8]));
-      tb_master_uart.write_char(hex2char(addr[7:4]));
-      tb_master_uart.write_char(hex2char(addr[3:0]));
-      tb_master_uart.write_char("\n");
+   tb_master_uart.write_char("r");
+   tb_master_uart.write_char("m");
+   tb_master_uart.write_char(" ");
+   tb_master_uart.write_char(hex2char(addr[31:28]));
+   tb_master_uart.write_char(hex2char(addr[27:24]));
+   tb_master_uart.write_char(hex2char(addr[23:20]));
+   tb_master_uart.write_char(hex2char(addr[19:16]));
+   tb_master_uart.write_char(hex2char(addr[15:12]));
+   tb_master_uart.write_char(hex2char(addr[11:8]));
+   tb_master_uart.write_char(hex2char(addr[7:4]));
+   tb_master_uart.write_char(hex2char(addr[3:0]));
+   tb_master_uart.write_char("\n");
+   // Wait for sucess command
+   flag = 0;
+   i = 0;
+   while(flag == 0)
+   begin
+      tb_master_uart.read_char2(read_data,flag);
+      //$write ("%d:%c",i,read_data);
+        case (i)
+        8'd10 : rxd_data[31:28] = char2hex(read_data);
+        8'd11 : rxd_data[27:24] = char2hex(read_data);
+        8'd12 : rxd_data[23:20] = char2hex(read_data);
+        8'd13 : rxd_data[19:16] = char2hex(read_data);
+        8'd14 : rxd_data[15:12] = char2hex(read_data);
+        8'd15 : rxd_data[11:8]  = char2hex(read_data);
+        8'd16 : rxd_data[7:4]   = char2hex(read_data);
+        8'd17 : rxd_data[3:0]   = char2hex(read_data);
+        endcase
+    i = i+1;
    end
-   begin : loop_2
-      // Wait for sucess command
-      flag = 0;
-      i = 0;
-      while(flag == 0)
-      begin
-         tb_master_uart.read_char2(read_data,flag);
-         //$write ("%d:%c",i,read_data);
-           case (i)
-           8'd10 : rxd_data[31:28] = char2hex(read_data);
-           8'd11 : rxd_data[27:24] = char2hex(read_data);
-           8'd12 : rxd_data[23:20] = char2hex(read_data);
-           8'd13 : rxd_data[19:16] = char2hex(read_data);
-           8'd14 : rxd_data[15:12] = char2hex(read_data);
-           8'd15 : rxd_data[11:8]  = char2hex(read_data);
-           8'd16 : rxd_data[7:4]   = char2hex(read_data);
-           8'd17 : rxd_data[3:0]   = char2hex(read_data);
-           endcase
-	   i = i+1;
-      end
-   end
-   join
    if(rxd_data == exp_data) begin
       // $display("STATUS: ADDRESS: %x RXD: %x", addr,rxd_data);
    end else begin
diff --git a/verilog/dv/agents/user_tasks.sv b/verilog/dv/agents/user_tasks.sv
new file mode 100644
index 0000000..a2c16ab
--- /dev/null
+++ b/verilog/dv/agents/user_tasks.sv
@@ -0,0 +1,143 @@
+
+/********************
+parameter bit  [15:0] PAD_STRAP = (2'b00 << `PSTRAP_CLK_SRC             ) |
+                                  (2'b00 << `PSTRAP_CLK_DIV             ) |
+                                  (1'b1  << `PSTRAP_UARTM_CFG           ) |
+                                  (1'b1  << `PSTRAP_QSPI_SRAM           ) |
+                                  (2'b10 << `PSTRAP_QSPI_FLASH          ) |
+                                  (1'b1  << `PSTRAP_RISCV_RESET_MODE    ) |
+                                  (1'b1  << `PSTRAP_RISCV_CACHE_BYPASS  ) |
+                                  (1'b1  << `PSTRAP_RISCV_SRAM_CLK_EDGE ) |
+                                  (2'b00 << `PSTRAP_CLK_SKEW            ) |
+                                  (1'b0  << `PSTRAP_DEFAULT_VALUE       ) ;
+****/
+
+`ifdef RISC_BOOT // RISCV Based Test case
+parameter bit  [15:0] PAD_STRAP = 16'b0000_0001_1011_0000;
+`else
+parameter bit  [15:0] PAD_STRAP = 16'b0000_0000_1011_0000;
+`endif
+
+/***********************************************
+
+wire  [15:0]    strap_in;
+assign strap_in[`PSTRAP_CLK_SRC] = 2'b00;            // System Clock Source wbs/riscv: User clock1
+assign strap_in[`PSTRAP_CLK_DIV] = 2'b00;            // Clock Division for wbs/riscv : 0 Div
+assign strap_in[`PSTRAP_UARTM_CFG] = 1'b0;           // uart master config control -  constant value based on system clock selection
+assign strap_in[`PSTRAP_QSPI_SRAM] = 1'b1;           // QSPI SRAM Mode Selection - Quad 
+assign strap_in[`PSTRAP_QSPI_FLASH] = 2'b10;         // QSPI Fash Mode Selection - Quad
+assign strap_in[`PSTRAP_RISCV_RESET_MODE] = 1'b1;    // Riscv Reset control - Removed Riscv on Power On Reset
+assign strap_in[`PSTRAP_RISCV_CACHE_BYPASS] = 1'b0;  // Riscv Cache Bypass: 0 - Cache Enable
+assign strap_in[`PSTRAP_RISCV_SRAM_CLK_EDGE] = 1'b0; // Riscv SRAM clock edge selection: 0 - Normal
+assign strap_in[`PSTRAP_CLK_SKEW] = 2'b00;           // Skew selection 2'b00 - Default value
+
+assign strap_in[`PSTRAP_DEFAULT_VALUE] = 1'b0;       // 0 - Normal
+***/
+
+initial
+begin
+   // Run in Fast Sim Mode
+   `ifdef GL
+       force u_top.u_wb_host._8654_.Q= 1'b1; 
+   `else
+       force u_top.u_wb_host.u_fastsim_buf.X = 1'b1; 
+    `endif
+
+end
+task init;
+begin
+   //#1 - Apply Reset
+   #1000 wb_rst_i = 0; 
+   repeat (10) @(posedge clock);
+   #1000 wb_rst_i = 1; 
+
+   //#3 - Remove Reset
+   #1000 wb_rst_i = 0; 
+   repeat (10) @(posedge clock);
+   //#4 - Wait for Power on reset removal
+   wait(u_top.p_reset_n == 1);          
+
+   // #5 - Wait for system reset removal
+   wait(u_top.s_reset_n == 1);          // Wait for system reset removal
+   repeat (10) @(posedge clock);
+
+/****
+   //#2 - Apply Strap
+   strap_in[`PSTRAP_CLK_SRC] = 2'b00;            // System Clock Source wbs/riscv: User clock1
+   strap_in[`PSTRAP_CLK_DIV] = 2'b00;            // Clock Division for wbs/riscv : 0 Div
+   strap_in[`PSTRAP_UARTM_CFG] = 1'b0;           // uart master config control -  constant value based on system clock selection
+   strap_in[`PSTRAP_QSPI_SRAM] = 1'b1;           // QSPI SRAM Mode Selection - Quad 
+   strap_in[`PSTRAP_QSPI_FLASH] = 2'b10;         // QSPI Fash Mode Selection - Quad
+   strap_in[`PSTRAP_RISCV_RESET_MODE] = 1'b1;    // Riscv Reset control - Removed Riscv on Power On Reset
+   strap_in[`PSTRAP_RISCV_CACHE_BYPASS] = 1'b0;  // Riscv Cache Bypass: 0 - Cache Enable
+   strap_in[`PSTRAP_RISCV_SRAM_CLK_EDGE] = 1'b0; // Riscv SRAM clock edge selection: 0 - Normal
+   strap_in[`PSTRAP_CLK_SKEW] = 2'b00;           // Skew selection 2'b00 - Default value
+
+   strap_in[`PSTRAP_DEFAULT_VALUE] = 1'b0;       // 0 - Normal
+
+   force u_top.io_in[36:29] = strap_in[15:8];
+   force u_top.io_in[20:13] = strap_in[7:0];
+   repeat (10) @(posedge clock);
+   
+   //#3 - Remove Reset
+   wb_rst_i = 0; // Remove Reset
+   repeat (10) @(posedge clock);
+   //#4 - Wait for Power on reset removal
+   wait(u_top.p_reset_n == 1);          
+
+    // #5 - Release the Strap
+    release u_top.io_in[36:29];
+    release u_top.io_in[20:13];
+
+    // #6 - Wait for system reset removal
+    wait(u_top.s_reset_n == 1);          // Wait for system reset removal
+    repeat (10) @(posedge clock);
+
+***/
+  end
+endtask
+
+genvar gCnt;
+generate
+ for(gCnt=0; gCnt<16; gCnt++) begin : g_strap
+    if(gCnt < 8) begin
+       if(PAD_STRAP[gCnt]) begin
+           pullup(io_in[13+gCnt]); 
+       end else begin
+           pulldown(io_in[13+gCnt]); 
+       end
+    end else begin
+       if(PAD_STRAP[gCnt]) begin
+           pullup(io_in[29+gCnt-8]); 
+       end else begin
+           pulldown(io_in[29+gCnt-8]); 
+       end
+    end
+ end 
+
+`ifdef RISC_BOOT // RISCV Based Test case
+//-------------------------------------------
+task wait_riscv_boot;
+begin
+   // GLBL_CFG_MAIL_BOX used as mail box, each core update boot up handshake at 8 bit
+   // bit[7:0]  - core-0
+   // bit[15:8]  - core-1
+   // bit[23:16] - core-2
+   // bit[31:24] - core-3
+   $display("Status:  Waiting for RISCV Core Boot ... ");
+   read_data = 0;
+   while((read_data >> (d_risc_id*8)) != 8'h1) begin
+       wb_user_core_read(`ADDR_SPACE_GLBL+`GLBL_CFG_MAIL_BOX,read_data);
+	    repeat (1000) @(posedge clock);
+   end
+
+   $display("Status:  RISCV Core is Booted ");
+
+end
+endtask
+
+`endif
+
+
+endgenerate
+
diff --git a/verilog/dv/arduino_arrays/Makefile b/verilog/dv/arduino_arrays/Makefile
index dad099c..0e61c01 100644
--- a/verilog/dv/arduino_arrays/Makefile
+++ b/verilog/dv/arduino_arrays/Makefile
@@ -97,31 +97,31 @@
 	${GCC_PREFIX}-ar rcs core.a wiring_digital.c.o
 	${GCC_PREFIX}-ar rcs core.a wiring_pulse.cpp.o
 	${GCC_PREFIX}-ar rcs core.a wiring_shift.c.o
-	${GCC_PREFIX}-g++ -T ${RISCDUINO_BOARD}/sdk/bsp/env/riscduino_score/link.lds -nostartfiles -Wl,-N -Wl,--gc-sections -Wl,--wrap=malloc -Wl,--wrap=free -Wl,--wrap=sbrk ${PATTERN}.ino.cpp.o -nostdlib -Wl,--start-group core.a -lm -lstdc++ -lc -lgloss -Wl,--end-group -lgcc -o ${PATTERN}.ino.elf
-	${GCC_PREFIX}-objcopy -R .rel.dyn -O binary ${PATTERN}.ino.elf ${PATTERN}.ino.bin
-	${GCC_PREFIX}-objcopy -R .rel.dyn -O verilog ${PATTERN}.ino.elf ${PATTERN}.ino.hex
-	${GCC_PREFIX}-objdump -D  ${PATTERN}.ino.elf >   ${PATTERN}.ino.dump
+	${GCC_PREFIX}-g++ -T ${RISCDUINO_BOARD}/sdk/bsp/env/riscduino_score/link.lds -nostartfiles -Wl,-N -Wl,--gc-sections -Wl,--wrap=malloc -Wl,--wrap=free -Wl,--wrap=sbrk ${PATTERN}.ino.cpp.o -nostdlib -Wl,--start-group core.a -lm -lstdc++ -lc -lgloss -Wl,--end-group -lgcc -o ${PATTERN}.elf
+	${GCC_PREFIX}-objcopy -R .rel.dyn -O binary ${PATTERN}.elf ${PATTERN}.bin
+	${GCC_PREFIX}-objcopy -R .rel.dyn -O verilog ${PATTERN}.elf ${PATTERN}.hex
+	${GCC_PREFIX}-objdump -D  ${PATTERN}.elf >   ${PATTERN}.dump
 	rm *.o *.a
 ifeq ($(SIM),RTL)
    ifeq ($(DUMP),OFF)
-	iverilog -g2012 -DFUNCTIONAL -DSIM -I $(PDK_PATH) \
+	iverilog -g2012 -DFUNCTIONAL -DSIM -DRISC_BOOT -I $(PDK_PATH) \
 	-f$(USER_PROJECT_VERILOG)/includes/includes.rtl.$(CONFIG) \
 	-f$(USER_PROJECT_VERILOG)/includes/includes.rtl.lib  \
 	$< -o $@ 
     else  
-	iverilog -g2012 -DWFDUMP -DFUNCTIONAL -DSIM -I $(PDK_PATH) \
+	iverilog -g2012 -DWFDUMP -DFUNCTIONAL -DRISC_BOOT -DSIM -I $(PDK_PATH) \
 	-f$(USER_PROJECT_VERILOG)/includes/includes.rtl.$(CONFIG) \
 	-f$(USER_PROJECT_VERILOG)/includes/includes.rtl.lib  \
 	$< -o $@ 
    endif
 else  
    ifeq ($(DUMP),OFF)
-	iverilog -g2012 -DFUNCTIONAL -DUSE_POWER_PINS -DGL -I $(PDK_PATH) \
+	iverilog -g2012 -DFUNCTIONAL -DUSE_POWER_PINS -DRISC_BOOT -DGL -I $(PDK_PATH) \
 	-f$(USER_PROJECT_VERILOG)/includes/includes.gl.$(CONFIG) \
 	-f$(USER_PROJECT_VERILOG)/includes/includes.gl.lib \
 	$< -o $@ 
     else  
-	iverilog -g2012 -DWFDUMP -DFUNCTIONAL -DUSE_POWER_PINS -DGL -I $(PDK_PATH) \
+	iverilog -g2012 -DWFDUMP -DFUNCTIONAL -DUSE_POWER_PINS -DRISC_BOOT -DGL -I $(PDK_PATH) \
 	-f$(USER_PROJECT_VERILOG)/includes/includes.gl.$(CONFIG) \
 	-f$(USER_PROJECT_VERILOG)/includes/includes.gl.lib \
 	$< -o $@ 
diff --git a/verilog/dv/arduino_arrays/arduino_arrays_tb.v b/verilog/dv/arduino_arrays/arduino_arrays_tb.v
index 169337d..8f8b4ae 100644
--- a/verilog/dv/arduino_arrays/arduino_arrays_tb.v
+++ b/verilog/dv/arduino_arrays/arduino_arrays_tb.v
@@ -69,8 +69,11 @@
 
 `include "sram_macros/sky130_sram_2kbyte_1rw1r_32x512_8.v"
 `include "is62wvs1288.v"
+`include "user_params.svh"
 
-module arduino_arrays_tb;
+`define TB_HEX "arduino_arrays.hex"
+`define TB_TOP  arduino_arrays_tb
+module `TB_TOP;
 	reg clock;
 	reg wb_rst_i;
 	reg power1, power2;
@@ -150,63 +153,66 @@
 	`ifdef WFDUMP
 	   initial begin
 	   	$dumpfile("simx.vcd");
-	   	$dumpvars(3, arduino_arrays_tb);
-	   	//$dumpvars(0, arduino_arrays_tb.u_top.u_riscv_top.i_core_top_0);
-	   	//$dumpvars(0, arduino_arrays_tb.u_top.u_riscv_top.u_connect);
-	   	//$dumpvars(0, arduino_arrays_tb.u_top.u_riscv_top.u_intf);
-	   	$dumpvars(0, arduino_arrays_tb.u_top.u_pinmux);
+	   	$dumpvars(3, `TB_TOP);
+	   	//$dumpvars(0, `TB_TOP.u_top.u_riscv_top.i_core_top_0);
+	   	//$dumpvars(0, `TB_TOP.u_top.u_riscv_top.u_connect);
+	   	//$dumpvars(0, `TB_TOP.u_top.u_riscv_top.u_intf);
+	   	$dumpvars(0, `TB_TOP.u_top.u_pinmux);
 	   end
        `endif
 
      /************* Port-D Mapping **********************************
       *             Arduino-No
-      *   Pin-2        0         PD0/RXD[0]                digital_io[1]
-      *   Pin-3        1         PD1/TXD[0]                digital_io[2]
-      *   Pin-4        2         PD2/RXD[1]/INT0           digital_io[3]
-      *   Pin-5        3         PD3/INT1/OC2B(PWM0)       digital_io[4]
-      *   Pin-6        4         PD4/TXD[1]                digital_io[5]
-      *   Pin-11       5         PD5/SS[3]/OC0B(PWM1)/T1   digital_io[8]
-      *   Pin-12       6         PD6/SS[2]/OC0A(PWM2)/AIN0 digital_io[9]/analog_io[2]
-      *   Pin-13       7         PD7/A1N1                  digital_io[10]/analog_io[3]
+      *   Pin-2        0         PD0/RXD[0]                digital_io[6]
+      *   Pin-3        1         PD1/TXD[0]                digital_io[7]
+      *   Pin-4        2         PD2/RXD[1]/INT0           digital_io[8]
+      *   Pin-5        3         PD3/INT1/OC2B(PWM0)       digital_io[9]
+      *   Pin-6        4         PD4/TXD[1]                digital_io[10]
+      *   Pin-11       5         PD5/SS[3]/OC0B(PWM1)/T1   digital_io[13]
+      *   Pin-12       6         PD6/SS[2]/OC0A(PWM2)/AIN0 digital_io[14]/analog_io[2]
+      *   Pin-13       7         PD7/A1N1                  digital_io[15]/analog_io[3]
       *   ********************************************************/
 
-     wire [7:0]  port_d_in = {  io_out[10],
-		                        io_out[9],
-		                        io_out[8],
-		                        io_out[5],
-			                    io_out[4],
-			                    io_out[3],
-		                        io_out[2],
-		                        io_out[1]
+     wire [7:0]  port_d_in = {  io_out[15],
+		                        io_out[14],
+		                        io_out[13],
+		                        io_out[10],
+			                    io_out[9],
+			                    io_out[8],
+		                        io_out[7],
+		                        io_out[6]
 			                };
        
 
 	initial begin
+		$value$plusargs("risc_core_id=%d", d_risc_id);
 
 		#200; // Wait for reset removal
 	        repeat (10) @(posedge clock);
 		$display("Monitor: Standalone User Risc Boot Test Started");
+   
+       init();
+       wait_riscv_boot();
 
-		$value$plusargs("risc_core_id=%d", d_risc_id);
 		// Remove Wb Reset
-		wb_user_core_write(`ADDR_SPACE_WBHOST+`WBHOST_GLBL_CFG,'h1);
+		//wb_user_core_write(`ADDR_SPACE_WBHOST+`WBHOST_GLBL_CFG,'h1);
 
 	    repeat (2) @(posedge clock);
 		#1;
 
         // Remove WB and SPI Reset and CORE under Reset
-        wb_user_core_write(`ADDR_SPACE_GLBL+`GLBL_CFG_CFG0,'h01F);
+        //wb_user_core_write(`ADDR_SPACE_GLBL+`GLBL_CFG_CFG0,'h01F);
 
 		// QSPI SRAM:CS#2 Switch to QSPI Mode
-        wb_user_core_write(`ADDR_SPACE_WBHOST+`WBHOST_BANK_SEL,'h1000); // Change the Bank Sel 1000
-		wb_user_core_write(`ADDR_SPACE_QSPI+`QSPIM_IMEM_CTRL1,{16'h0,1'b0,1'b0,4'b0000,P_MODE_SWITCH_IDLE,P_SINGLE,P_SINGLE,4'b0100});
-		wb_user_core_write(`ADDR_SPACE_QSPI+`QSPIM_IMEM_CTRL2,{8'h0,2'b00,2'b00,P_FSM_C,8'h00,8'h38});
-		wb_user_core_write(`ADDR_SPACE_QSPI+`QSPIM_IMEM_WDATA,32'h0);
+        //wb_user_core_write(`ADDR_SPACE_WBHOST+`WBHOST_BANK_SEL,'h1000); // Change the Bank Sel 1000
+		//wb_user_core_write(`ADDR_SPACE_QSPI+`QSPIM_IMEM_CTRL1,{16'h0,1'b0,1'b0,4'b0000,P_MODE_SWITCH_IDLE,P_SINGLE,P_SINGLE,4'b0100});
+		//wb_user_core_write(`ADDR_SPACE_QSPI+`QSPIM_IMEM_CTRL2,{8'h0,2'b00,2'b00,P_FSM_C,8'h00,8'h38});
+		//wb_user_core_write(`ADDR_SPACE_QSPI+`QSPIM_IMEM_WDATA,32'h0);
 
         // Remove all the reset
         if(d_risc_id == 0) begin
              $display("STATUS: Working with Risc core 0");
-             wb_user_core_write(`ADDR_SPACE_GLBL+`GLBL_CFG_CFG0,'h11F);
+             //wb_user_core_write(`ADDR_SPACE_GLBL+`GLBL_CFG_CFG0,'h11F);
         end else if(d_risc_id == 1) begin
              $display("STATUS: Working with Risc core 1");
              wb_user_core_write(`ADDR_SPACE_GLBL+`GLBL_CFG_CFG0,'h21F);
@@ -248,7 +254,7 @@
           test_fail = 0;
       end
       begin
-         repeat (30000) @(posedge clock);  // wait for Processor Get Ready
+         repeat (40000) @(posedge clock);  // wait for Processor Get Ready
          test_fail = 1;
       end
       join_any
@@ -275,11 +281,6 @@
 	    $finish;
 	end
 
-	initial begin
-		wb_rst_i <= 1'b1;
-		#100;
-		wb_rst_i <= 1'b0;	    	// Release reset
-	end
 wire USER_VDD1V8 = 1'b1;
 wire VSS = 1'b0;
 
@@ -318,6 +319,10 @@
 
 );
 
+// SSPI Slave I/F
+assign io_in[5]  = 1'b1; // RESET
+assign io_in[21] = 1'b0; // CLOCK
+
 `ifndef GL // Drive Power for Hold Fix Buf
     // All standard cell need power hook-up for functionality work
     initial begin
@@ -330,25 +335,25 @@
 //  user core using the gpio pads
 //  ----------------------------------------------------
 
-   wire flash_clk = io_out[24];
-   wire flash_csb = io_out[25];
+   wire flash_clk = io_out[28];
+   wire flash_csb = io_out[29];
    // Creating Pad Delay
-   wire #1 io_oeb_29 = io_oeb[29];
-   wire #1 io_oeb_30 = io_oeb[30];
-   wire #1 io_oeb_31 = io_oeb[31];
-   wire #1 io_oeb_32 = io_oeb[32];
-   tri  #1 flash_io0 = (io_oeb_29== 1'b0) ? io_out[29] : 1'bz;
-   tri  #1 flash_io1 = (io_oeb_30== 1'b0) ? io_out[30] : 1'bz;
-   tri  #1 flash_io2 = (io_oeb_31== 1'b0) ? io_out[31] : 1'bz;
-   tri  #1 flash_io3 = (io_oeb_32== 1'b0) ? io_out[32] : 1'bz;
+   wire #1 io_oeb_29 = io_oeb[33];
+   wire #1 io_oeb_30 = io_oeb[34];
+   wire #1 io_oeb_31 = io_oeb[35];
+   wire #1 io_oeb_32 = io_oeb[36];
+   tri  #1 flash_io0 = (io_oeb_29== 1'b0) ? io_out[33] : 1'bz;
+   tri  #1 flash_io1 = (io_oeb_30== 1'b0) ? io_out[34] : 1'bz;
+   tri  #1 flash_io2 = (io_oeb_31== 1'b0) ? io_out[35] : 1'bz;
+   tri  #1 flash_io3 = (io_oeb_32== 1'b0) ? io_out[36] : 1'bz;
 
-   assign io_in[29] = flash_io0;
-   assign io_in[30] = flash_io1;
-   assign io_in[31] = flash_io2;
-   assign io_in[32] = flash_io3;
+   assign io_in[33] = flash_io0;
+   assign io_in[34] = flash_io1;
+   assign io_in[35] = flash_io2;
+   assign io_in[36] = flash_io3;
 
    // Quard flash
-     s25fl256s #(.mem_file_name("arduino_arrays.ino.hex"),
+     s25fl256s #(.mem_file_name(`TB_HEX),
 	         .otp_file_name("none"),
                  .TimingModel("S25FL512SAGMFI010_F_30pF")) 
 		 u_spi_flash_256mb (
@@ -364,7 +369,7 @@
 
        );
 
-   wire spiram_csb = io_out[27];
+   wire spiram_csb = io_out[31];
 
    is62wvs1288 #(.mem_file_name("none"))
 	u_sram (
@@ -521,6 +526,7 @@
 
 `endif
 **/
+`include "user_tasks.sv"
 endmodule
 `include "s25fl256s.sv"
 `default_nettype wire
diff --git a/verilog/dv/arduino_ascii_table/Makefile b/verilog/dv/arduino_ascii_table/Makefile
index 30b4cfe..38987f6 100644
--- a/verilog/dv/arduino_ascii_table/Makefile
+++ b/verilog/dv/arduino_ascii_table/Makefile
@@ -97,10 +97,10 @@
 	${GCC_PREFIX}-ar rcs core.a wiring_digital.c.o
 	${GCC_PREFIX}-ar rcs core.a wiring_pulse.cpp.o
 	${GCC_PREFIX}-ar rcs core.a wiring_shift.c.o
-	${GCC_PREFIX}-g++ -T ${RISCDUINO_BOARD}/sdk/bsp/env/riscduino_score/link.lds -nostartfiles -Wl,-N -Wl,--gc-sections -Wl,--wrap=malloc -Wl,--wrap=free -Wl,--wrap=sbrk ${PATTERN}.ino.cpp.o -nostdlib -Wl,--start-group core.a -lm -lstdc++ -lc -lgloss -Wl,--end-group -lgcc -o ${PATTERN}.ino.elf
-	${GCC_PREFIX}-objcopy -R .rel.dyn -O binary ${PATTERN}.ino.elf ${PATTERN}.ino.bin
-	${GCC_PREFIX}-objcopy -R .rel.dyn -O verilog ${PATTERN}.ino.elf ${PATTERN}.ino.hex
-	${GCC_PREFIX}-objdump -D  ${PATTERN}.ino.elf >   ${PATTERN}.ino.dump
+	${GCC_PREFIX}-g++ -T ${RISCDUINO_BOARD}/sdk/bsp/env/riscduino_score/link.lds -nostartfiles -Wl,-N -Wl,--gc-sections -Wl,--wrap=malloc -Wl,--wrap=free -Wl,--wrap=sbrk ${PATTERN}.ino.cpp.o -nostdlib -Wl,--start-group core.a -lm -lstdc++ -lc -lgloss -Wl,--end-group -lgcc -o ${PATTERN}.elf
+	${GCC_PREFIX}-objcopy -R .rel.dyn -O binary ${PATTERN}.elf ${PATTERN}.bin
+	${GCC_PREFIX}-objcopy -R .rel.dyn -O verilog ${PATTERN}.elf ${PATTERN}.hex
+	${GCC_PREFIX}-objdump -D  ${PATTERN}.elf >   ${PATTERN}.dump
 	rm *.o *.a
 ifeq ($(SIM),RTL)
    ifeq ($(DUMP),OFF)
diff --git a/verilog/dv/arduino_ascii_table/arduino_ascii_table_tb.v b/verilog/dv/arduino_ascii_table/arduino_ascii_table_tb.v
index e6fa954..0927816 100644
--- a/verilog/dv/arduino_ascii_table/arduino_ascii_table_tb.v
+++ b/verilog/dv/arduino_ascii_table/arduino_ascii_table_tb.v
@@ -68,9 +68,12 @@
 `timescale 1 ns / 1 ns
 
 `include "sram_macros/sky130_sram_2kbyte_1rw1r_32x512_8.v"
+`include "is62wvs1288.v"
 `include "uart_agent.v"
 
-module arduino_ascii_table_tb;
+`define TB_HEX "arduino_ascii_table.hex"
+`define TB_TOP  arduino_ascii_table_tb
+module `TB_TOP;
 	reg clock;
 	reg wb_rst_i;
 	reg power1, power2;
@@ -142,11 +145,11 @@
 	`ifdef WFDUMP
 	   initial begin
 	   	$dumpfile("simx.vcd");
-	   	$dumpvars(3, arduino_ascii_table_tb);
-	   	$dumpvars(0, arduino_ascii_table_tb.u_top.u_riscv_top.i_core_top_0);
-	   	$dumpvars(0, arduino_ascii_table_tb.u_top.u_riscv_top.u_connect);
-	   	$dumpvars(0, arduino_ascii_table_tb.u_top.u_riscv_top.u_intf);
-	   	$dumpvars(0, arduino_ascii_table_tb.u_top.u_uart_i2c_usb_spi.u_uart0_core);
+	   	$dumpvars(3, `TB_TOP);
+	   	$dumpvars(0, `TB_TOP.u_top.u_riscv_top.i_core_top_0);
+	   	$dumpvars(0, `TB_TOP.u_top.u_riscv_top.u_connect);
+	   	$dumpvars(0, `TB_TOP.u_top.u_riscv_top.u_intf);
+	   	$dumpvars(0, `TB_TOP.u_top.u_uart_i2c_usb_spi.u_uart0_core);
 	   end
        `endif
 
@@ -316,6 +319,9 @@
     .user_irq       () 
 
 );
+// SSPI Slave I/F
+assign io_in[0]  = 1'b1; // RESET
+assign io_in[16] = 1'b0 ; // SPIS SCK 
 
 `ifndef GL // Drive Power for Hold Fix Buf
     // All standard cell need power hook-up for functionality work
@@ -329,25 +335,25 @@
 //  user core using the gpio pads
 //  ----------------------------------------------------
 
-   wire flash_clk = io_out[24];
-   wire flash_csb = io_out[25];
+   wire flash_clk = io_out[28];
+   wire flash_csb = io_out[29];
    // Creating Pad Delay
-   wire #1 io_oeb_29 = io_oeb[29];
-   wire #1 io_oeb_30 = io_oeb[30];
-   wire #1 io_oeb_31 = io_oeb[31];
-   wire #1 io_oeb_32 = io_oeb[32];
-   tri  #1 flash_io0 = (io_oeb_29== 1'b0) ? io_out[29] : 1'bz;
-   tri  #1 flash_io1 = (io_oeb_30== 1'b0) ? io_out[30] : 1'bz;
-   tri  #1 flash_io2 = (io_oeb_31== 1'b0) ? io_out[31] : 1'bz;
-   tri  #1 flash_io3 = (io_oeb_32== 1'b0) ? io_out[32] : 1'bz;
+   wire #1 io_oeb_29 = io_oeb[33];
+   wire #1 io_oeb_30 = io_oeb[34];
+   wire #1 io_oeb_31 = io_oeb[35];
+   wire #1 io_oeb_32 = io_oeb[36];
+   tri  #1 flash_io0 = (io_oeb_29== 1'b0) ? io_out[33] : 1'bz;
+   tri  #1 flash_io1 = (io_oeb_30== 1'b0) ? io_out[34] : 1'bz;
+   tri  #1 flash_io2 = (io_oeb_31== 1'b0) ? io_out[35] : 1'bz;
+   tri  #1 flash_io3 = (io_oeb_32== 1'b0) ? io_out[36] : 1'bz;
 
-   assign io_in[29] = flash_io0;
-   assign io_in[30] = flash_io1;
-   assign io_in[31] = flash_io2;
-   assign io_in[32] = flash_io3;
+   assign io_in[33] = flash_io0;
+   assign io_in[34] = flash_io1;
+   assign io_in[35] = flash_io2;
+   assign io_in[36] = flash_io3;
 
    // Quard flash
-     s25fl256s #(.mem_file_name("arduino_ascii_table.ino.hex"),
+     s25fl256s #(.mem_file_name(`TB_HEX),
 	         .otp_file_name("none"),
                  .TimingModel("S25FL512SAGMFI010_F_30pF")) 
 		 u_spi_flash_256mb (
@@ -363,14 +369,27 @@
 
        );
 
+   wire spiram_csb = io_out[31];
+
+   is62wvs1288 #(.mem_file_name("none"))
+	u_sram (
+         // Data Inputs/Outputs
+           .io0     (flash_io0),
+           .io1     (flash_io1),
+           // Controls
+           .clk    (flash_clk),
+           .csb    (spiram_csb),
+           .io2    (flash_io2),
+           .io3    (flash_io3)
+    );
 
 //---------------------------
 //  UART Agent integration
 // --------------------------
 wire uart_txd,uart_rxd;
 
-assign uart_txd   = io_out[2];
-assign io_in[1]  = uart_rxd ;
+assign uart_txd   = io_out[7];
+assign io_in[6]  = uart_rxd ;
  
 uart_agent tb_uart(
 	.mclk                (clock              ),
diff --git a/verilog/dv/arduino_character_analysis/Makefile b/verilog/dv/arduino_character_analysis/Makefile
index 9293db4..b50000c 100644
--- a/verilog/dv/arduino_character_analysis/Makefile
+++ b/verilog/dv/arduino_character_analysis/Makefile
@@ -97,31 +97,31 @@
 	${GCC_PREFIX}-ar rcs core.a wiring_digital.c.o
 	${GCC_PREFIX}-ar rcs core.a wiring_pulse.cpp.o
 	${GCC_PREFIX}-ar rcs core.a wiring_shift.c.o
-	${GCC_PREFIX}-g++ -T ${RISCDUINO_BOARD}/sdk/bsp/env/riscduino_score/link.lds -nostartfiles -Wl,-N -Wl,--gc-sections -Wl,--wrap=malloc -Wl,--wrap=free -Wl,--wrap=sbrk ${PATTERN}.ino.cpp.o -nostdlib -Wl,--start-group core.a -lm -lstdc++ -lc -lgloss -Wl,--end-group -lgcc -o ${PATTERN}.ino.elf
-	${GCC_PREFIX}-objcopy -R .rel.dyn -O binary ${PATTERN}.ino.elf ${PATTERN}.ino.bin
-	${GCC_PREFIX}-objcopy -R .rel.dyn -O verilog ${PATTERN}.ino.elf ${PATTERN}.ino.hex
-	${GCC_PREFIX}-objdump -D  ${PATTERN}.ino.elf >   ${PATTERN}.ino.dump
+	${GCC_PREFIX}-g++ -T ${RISCDUINO_BOARD}/sdk/bsp/env/riscduino_score/link.lds -nostartfiles -Wl,-N -Wl,--gc-sections -Wl,--wrap=malloc -Wl,--wrap=free -Wl,--wrap=sbrk ${PATTERN}.ino.cpp.o -nostdlib -Wl,--start-group core.a -lm -lstdc++ -lc -lgloss -Wl,--end-group -lgcc -o ${PATTERN}.elf
+	${GCC_PREFIX}-objcopy -R .rel.dyn -O binary ${PATTERN}.elf ${PATTERN}.bin
+	${GCC_PREFIX}-objcopy -R .rel.dyn -O verilog ${PATTERN}.elf ${PATTERN}.hex
+	${GCC_PREFIX}-objdump -D  ${PATTERN}.elf >   ${PATTERN}.dump
 	rm *.o *.a
 ifeq ($(SIM),RTL)
    ifeq ($(DUMP),OFF)
-	iverilog -g2012 -DFUNCTIONAL -DSIM -I $(PDK_PATH) \
+	iverilog -g2012 -DFUNCTIONAL -DSIM -DRISC_BOOT -I $(PDK_PATH) \
 	-f$(USER_PROJECT_VERILOG)/includes/includes.rtl.$(CONFIG) \
 	-f$(USER_PROJECT_VERILOG)/includes/includes.rtl.lib  \
 	$< -o $@ 
     else  
-	iverilog -g2012 -DWFDUMP -DFUNCTIONAL -DSIM -I $(PDK_PATH) \
+	iverilog -g2012 -DWFDUMP -DFUNCTIONAL -DRISC_BOOT -DSIM -I $(PDK_PATH) \
 	-f$(USER_PROJECT_VERILOG)/includes/includes.rtl.$(CONFIG) \
 	-f$(USER_PROJECT_VERILOG)/includes/includes.rtl.lib  \
 	$< -o $@ 
    endif
 else  
    ifeq ($(DUMP),OFF)
-	iverilog -g2012 -DFUNCTIONAL -DUSE_POWER_PINS -DGL -I $(PDK_PATH) \
+	iverilog -g2012 -DFUNCTIONAL -DUSE_POWER_PINS -DRISC_BOOT -DGL -I $(PDK_PATH) \
 	-f$(USER_PROJECT_VERILOG)/includes/includes.gl.$(CONFIG) \
 	-f$(USER_PROJECT_VERILOG)/includes/includes.gl.lib \
 	$< -o $@ 
     else  
-	iverilog -g2012 -DWFDUMP -DFUNCTIONAL -DUSE_POWER_PINS -DGL -I $(PDK_PATH) \
+	iverilog -g2012 -DWFDUMP -DFUNCTIONAL -DUSE_POWER_PINS -DRISC_BOOT -DGL -I $(PDK_PATH) \
 	-f$(USER_PROJECT_VERILOG)/includes/includes.gl.$(CONFIG) \
 	-f$(USER_PROJECT_VERILOG)/includes/includes.gl.lib \
 	$< -o $@ 
diff --git a/verilog/dv/arduino_character_analysis/arduino_character_analysis_tb.v b/verilog/dv/arduino_character_analysis/arduino_character_analysis_tb.v
index af8c31f..699f433 100644
--- a/verilog/dv/arduino_character_analysis/arduino_character_analysis_tb.v
+++ b/verilog/dv/arduino_character_analysis/arduino_character_analysis_tb.v
@@ -70,8 +70,11 @@
 `include "sram_macros/sky130_sram_2kbyte_1rw1r_32x512_8.v"
 `include "uart_agent.v"
 `include "is62wvs1288.v"
+`include "user_params.svh"
 
-module arduino_character_analysis;
+`define TB_HEX "arduino_character_analysis.hex"
+`define TB_TOP  arduino_character_analysis_tb
+module `TB_TOP;
 	reg clock;
 	reg wb_rst_i;
 	reg power1, power2;
@@ -115,11 +118,12 @@
         reg [15:0]     uart_tx_nu           ;
         reg [7:0]      uart_write_data [0:39];
         reg 	       uart_fifo_enable     ;	// fifo mode disable
-	reg            flag                 ;
+	    reg            flag                 ;
+        reg [7:0]      dCnt                 ; // DataCount
 
-	reg [31:0]     check_sum            ;
+	    reg [31:0]     check_sum            ;
         
-	integer    d_risc_id;
+	    integer    d_risc_id;
 
          integer i,j;
 
@@ -168,11 +172,11 @@
 	`ifdef WFDUMP
 	   initial begin
 	   	$dumpfile("simx.vcd");
-	   	$dumpvars(3, arduino_character_analysis);
-	   	$dumpvars(0, arduino_character_analysis.u_top.u_riscv_top.i_core_top_0);
-	   	$dumpvars(0, arduino_character_analysis.u_top.u_riscv_top.u_connect);
-	   	$dumpvars(0, arduino_character_analysis.u_top.u_riscv_top.u_intf);
-	   	$dumpvars(0, arduino_character_analysis.u_top.u_uart_i2c_usb_spi.u_uart0_core);
+	   	$dumpvars(2, `TB_TOP);
+	   	//$dumpvars(0, `TB_TOP.u_top.u_riscv_top.i_core_top_0);
+	   	//$dumpvars(0, `TB_TOP.u_top.u_riscv_top.u_connect);
+	   	//$dumpvars(0, `TB_TOP.u_top.u_riscv_top.u_intf);
+	   	$dumpvars(0, `TB_TOP.u_top.u_uart_i2c_usb_spi.u_uart0_core);
 	   end
        `endif
 
@@ -213,7 +217,7 @@
         uart_parity_en          = 0; // parity enable
         uart_even_odd_parity    = 1; // 0: odd parity; 1: even parity
 	    tb_set_uart_baud(50000000,1152000,uart_divisor);// 50Mhz Ref clock, Baud Rate: 230400
-        uart_timeout            = 2000;// wait time limit
+        uart_timeout            = 750;// wait time limit
         uart_fifo_enable        = 0;	// fifo mode disable
 
 		$value$plusargs("risc_core_id=%d", d_risc_id);
@@ -221,24 +225,27 @@
 		#200; // Wait for reset removal
 	    repeat (10) @(posedge clock);
 		$display("Monitor: Standalone User Risc Boot Test Started");
+   
+       init();
+       wait_riscv_boot();
 
 		// Remove Wb Reset
-		wb_user_core_write(`ADDR_SPACE_WBHOST+`WBHOST_GLBL_CFG,'h1);
+		//wb_user_core_write(`ADDR_SPACE_WBHOST+`WBHOST_GLBL_CFG,'h1);
 
 	        repeat (2) @(posedge clock);
 		#1;
         // Remove WB and SPI Reset and CORE under Reset
-        wb_user_core_write(`ADDR_SPACE_GLBL+`GLBL_CFG_CFG0,'h01F);
+        //wb_user_core_write(`ADDR_SPACE_GLBL+`GLBL_CFG_CFG0,'h01F);
 
 		// QSPI SRAM:CS#2 Switch to QSPI Mode
-        wb_user_core_write(`ADDR_SPACE_WBHOST+`WBHOST_BANK_SEL,'h1000); // Change the Bank Sel 1000
-		wb_user_core_write(`ADDR_SPACE_QSPI+`QSPIM_IMEM_CTRL1,{16'h0,1'b0,1'b0,4'b0000,P_MODE_SWITCH_IDLE,P_SINGLE,P_SINGLE,4'b0100});
-		wb_user_core_write(`ADDR_SPACE_QSPI+`QSPIM_IMEM_CTRL2,{8'h0,2'b00,2'b00,P_FSM_C,8'h00,8'h38});
-		wb_user_core_write(`ADDR_SPACE_QSPI+`QSPIM_IMEM_WDATA,32'h0);
+        //wb_user_core_write(`ADDR_SPACE_WBHOST+`WBHOST_BANK_SEL,'h1000); // Change the Bank Sel 1000
+	//	wb_user_core_write(`ADDR_SPACE_QSPI+`QSPIM_IMEM_CTRL1,{16'h0,1'b0,1'b0,4'b0000,P_MODE_SWITCH_IDLE,P_SINGLE,P_SINGLE,4'b0100});
+	//	wb_user_core_write(`ADDR_SPACE_QSPI+`QSPIM_IMEM_CTRL2,{8'h0,2'b00,2'b00,P_FSM_C,8'h00,8'h38});
+	//	wb_user_core_write(`ADDR_SPACE_QSPI+`QSPIM_IMEM_WDATA,32'h0);
         // Remove all the reset
         if(d_risc_id == 0) begin
              $display("STATUS: Working with Risc core 0");
-             wb_user_core_write(`ADDR_SPACE_GLBL+`GLBL_CFG_CFG0,'h11F);
+             //wb_user_core_write(`ADDR_SPACE_GLBL+`GLBL_CFG_CFG0,'h11F);
         end else if(d_risc_id == 1) begin
              $display("STATUS: Working with Risc core 1");
              wb_user_core_write(`ADDR_SPACE_GLBL+`GLBL_CFG_CFG0,'h21F);
@@ -257,34 +264,36 @@
         tb_uart.control_setup (uart_data_bit, uart_stop_bits, uart_parity_en, uart_even_odd_parity, 
                                            uart_stick_parity, uart_timeout, uart_divisor);
 
-        repeat (40000) @(posedge clock);  // wait for Processor Get Ready
 	    flag  = 0;
 		check_sum = 0;
+        dCnt = 0;
         fork
         begin 
            fork
            begin
-               tb_uart.write_char ("A");
-               tb_uart.write_char (" ");
-               tb_uart.write_char ("\n");
-               tb_uart.write_char ("b");
-               tb_uart.write_char (";");
-               tb_uart.write_char ("F");
-           end
-           begin
-              while(flag == 0)
+              while(dCnt < 7 )
               begin
-                 tb_uart.read_char(read_data,flag);
-		         if(flag == 0)  begin
-		            $write ("%c",read_data);
-		            check_sum = check_sum+read_data;
-		         end
+	             flag  = 0;
+                 while(flag == 0) begin
+                    tb_uart.read_char(read_data,flag);
+		            if(flag == 0)  begin
+		               $write ("%c",read_data);
+		               check_sum = check_sum+read_data;
+		            end
+                 end
+                 if(dCnt == 0) tb_uart.write_char ("A");
+                 if(dCnt == 1) tb_uart.write_char (" ");
+                 if(dCnt == 2) tb_uart.write_char ("\n");
+                 if(dCnt == 3) tb_uart.write_char ("b");
+                 if(dCnt == 4) tb_uart.write_char (";");
+                 if(dCnt == 5) tb_uart.write_char ("F");
+                 dCnt = dCnt+1;
               end
            end
            join
         end
         begin
-           repeat (3000000) @(posedge clock);  // wait for Processor Get Ready
+           repeat (4000000) @(posedge clock);  // wait for Processor Get Ready
         end
         join_any
                 
@@ -361,6 +370,9 @@
     .user_irq       () 
 
 );
+// SSPI Slave I/F
+assign io_in[5]  = 1'b1; // RESET
+assign io_in[21] = 1'b0; // CLOCK
 
 `ifndef GL // Drive Power for Hold Fix Buf
     // All standard cell need power hook-up for functionality work
@@ -374,25 +386,25 @@
 //  user core using the gpio pads
 //  ----------------------------------------------------
 
-   wire flash_clk = io_out[24];
-   wire flash_csb = io_out[25];
+   wire flash_clk = io_out[28];
+   wire flash_csb = io_out[29];
    // Creating Pad Delay
-   wire #1 io_oeb_29 = io_oeb[29];
-   wire #1 io_oeb_30 = io_oeb[30];
-   wire #1 io_oeb_31 = io_oeb[31];
-   wire #1 io_oeb_32 = io_oeb[32];
-   tri  #1 flash_io0 = (io_oeb_29== 1'b0) ? io_out[29] : 1'bz;
-   tri  #1 flash_io1 = (io_oeb_30== 1'b0) ? io_out[30] : 1'bz;
-   tri  #1 flash_io2 = (io_oeb_31== 1'b0) ? io_out[31] : 1'bz;
-   tri  #1 flash_io3 = (io_oeb_32== 1'b0) ? io_out[32] : 1'bz;
+   wire #1 io_oeb_29 = io_oeb[33];
+   wire #1 io_oeb_30 = io_oeb[34];
+   wire #1 io_oeb_31 = io_oeb[35];
+   wire #1 io_oeb_32 = io_oeb[36];
+   tri  #1 flash_io0 = (io_oeb_29== 1'b0) ? io_out[33] : 1'bz;
+   tri  #1 flash_io1 = (io_oeb_30== 1'b0) ? io_out[34] : 1'bz;
+   tri  #1 flash_io2 = (io_oeb_31== 1'b0) ? io_out[35] : 1'bz;
+   tri  #1 flash_io3 = (io_oeb_32== 1'b0) ? io_out[36] : 1'bz;
 
-   assign io_in[29] = flash_io0;
-   assign io_in[30] = flash_io1;
-   assign io_in[31] = flash_io2;
-   assign io_in[32] = flash_io3;
+   assign io_in[33] = flash_io0;
+   assign io_in[34] = flash_io1;
+   assign io_in[35] = flash_io2;
+   assign io_in[36] = flash_io3;
 
    // Quard flash
-     s25fl256s #(.mem_file_name("arduino_character_analysis.ino.hex"),
+     s25fl256s #(.mem_file_name(`TB_HEX),
 	         .otp_file_name("none"),
                  .TimingModel("S25FL512SAGMFI010_F_30pF")) 
 		 u_spi_flash_256mb (
@@ -408,7 +420,7 @@
 
        );
 
-   wire spiram_csb = io_out[27];
+   wire spiram_csb = io_out[31];
 
    is62wvs1288 #(.mem_file_name("none"))
 	u_sram (
@@ -427,8 +439,8 @@
 // --------------------------
 wire uart_txd,uart_rxd;
 
-assign uart_txd   = io_out[2];
-assign io_in[1]  = uart_rxd ;
+assign uart_txd   = io_out[7];
+assign io_in[6]  = uart_rxd ;
  
 uart_agent tb_uart(
 	.mclk                (clock              ),
@@ -566,6 +578,7 @@
 
 `endif
 **/
+`include "user_tasks.sv"
 endmodule
 `include "s25fl256s.sv"
 `default_nettype wire
diff --git a/verilog/dv/arduino_digital_port_control/Makefile b/verilog/dv/arduino_digital_port_control/Makefile
index 7168229..bd1353c 100644
--- a/verilog/dv/arduino_digital_port_control/Makefile
+++ b/verilog/dv/arduino_digital_port_control/Makefile
@@ -99,10 +99,10 @@
 	${GCC_PREFIX}-ar rcs core.a wiring_pulse.cpp.o
 	${GCC_PREFIX}-ar rcs core.a wiring_shift.c.o
 	${GCC_PREFIX}-ar rcs core.a SPI.cpp.o
-	${GCC_PREFIX}-g++ -T ${RISCDUINO_BOARD}/sdk/bsp/env/riscduino_score/link.lds -nostartfiles -Wl,-N -Wl,--gc-sections -Wl,--wrap=malloc -Wl,--wrap=free -Wl,--wrap=sbrk ${PATTERN}.ino.cpp.o -nostdlib -Wl,--start-group core.a -lm -lstdc++ -lc -lgloss -Wl,--end-group -lgcc -o ${PATTERN}.ino.elf
-	${GCC_PREFIX}-objcopy -R .rel.dyn -O binary ${PATTERN}.ino.elf ${PATTERN}.ino.bin
-	${GCC_PREFIX}-objcopy -R .rel.dyn -O verilog ${PATTERN}.ino.elf ${PATTERN}.ino.hex
-	${GCC_PREFIX}-objdump -D  ${PATTERN}.ino.elf >   ${PATTERN}.ino.dump
+	${GCC_PREFIX}-g++ -T ${RISCDUINO_BOARD}/sdk/bsp/env/riscduino_score/link.lds -nostartfiles -Wl,-N -Wl,--gc-sections -Wl,--wrap=malloc -Wl,--wrap=free -Wl,--wrap=sbrk ${PATTERN}.ino.cpp.o -nostdlib -Wl,--start-group core.a -lm -lstdc++ -lc -lgloss -Wl,--end-group -lgcc -o ${PATTERN}.elf
+	${GCC_PREFIX}-objcopy -R .rel.dyn -O binary ${PATTERN}.elf ${PATTERN}.bin
+	${GCC_PREFIX}-objcopy -R .rel.dyn -O verilog ${PATTERN}.elf ${PATTERN}.hex
+	${GCC_PREFIX}-objdump -D  ${PATTERN}.elf >   ${PATTERN}.dump
 	rm *.o *.a
 ifeq ($(SIM),RTL)
    ifeq ($(DUMP),OFF)
diff --git a/verilog/dv/arduino_digital_port_control/arduino_digital_port_control_tb.v b/verilog/dv/arduino_digital_port_control/arduino_digital_port_control_tb.v
index 1b1cbe1..07d7b46 100644
--- a/verilog/dv/arduino_digital_port_control/arduino_digital_port_control_tb.v
+++ b/verilog/dv/arduino_digital_port_control/arduino_digital_port_control_tb.v
@@ -71,6 +71,8 @@
 `include "is62wvs1288.v"
 `include "bfm_ad5205.sv"
 
+`define TB_HEX "arduino_digital_port_control.hex"
+`define TB_TOP  arduino_digital_port_control_tb
 module arduino_digital_port_control_tb;
 	reg clock;
 	reg wb_rst_i;
@@ -152,12 +154,12 @@
 	`ifdef WFDUMP
 	   initial begin
 	   	$dumpfile("simx.vcd");
-	   	$dumpvars(3, arduino_digital_port_control_tb);
-	   	//$dumpvars(0, arduino_digital_port_control_tb.u_top.u_riscv_top.i_core_top_0);
-	   	//$dumpvars(0, arduino_digital_port_control_tb.u_top.u_riscv_top.u_connect);
-	   	//$dumpvars(0, arduino_digital_port_control_tb.u_top.u_riscv_top.u_intf);
-	   	$dumpvars(0, arduino_digital_port_control_tb.u_top.u_pinmux);
-	   	$dumpvars(0, arduino_digital_port_control_tb.u_top.u_uart_i2c_usb_spi);
+	   	$dumpvars(3, `TB_TOP);
+	   	//$dumpvars(0, `TB_TOP.u_top.u_riscv_top.i_core_top_0);
+	   	//$dumpvars(0, `TB_TOP.u_top.u_riscv_top.u_connect);
+	   	//$dumpvars(0, `TB_TOP.u_top.u_riscv_top.u_intf);
+	   	$dumpvars(0, `TB_TOP.u_top.u_pinmux);
+	   	$dumpvars(0, `TB_TOP.u_top.u_uart_i2c_usb_spi);
 	   end
        `endif
 
@@ -291,14 +293,16 @@
     .user_irq       () 
 
 );
+// SSPI Slave I/F
+assign io_in[5]  = 1'b1; // RESET
 
 //-------------------------------------------------------------------------------------
 //  Integrate the Serial SPI to ad5204/5206 (4-/6-Channel Digital Potentiometers)
 //  https://www.analog.com/media/en/technical-documentation/data-sheets/ad5204_5206.pdf
 //  -----------------------------------------------------------------------------------
-   wire sspi_sck = io_out[16];
-   wire sspi_sdi = io_out[15];
-   wire sspi_ssn = io_out[13];
+   wire sspi_sck = io_out[21];
+   wire sspi_sdi = io_out[20];
+   wire sspi_ssn = io_out[18];
 
    wire [2:0]      p_channel; // potentiometer channel
    wire [7:0]      p_position; // potentiometer position
@@ -324,25 +328,25 @@
 //  user core using the gpio pads
 //  ----------------------------------------------------
 
-   wire flash_clk = io_out[24];
-   wire flash_csb = io_out[25];
+   wire flash_clk = io_out[28];
+   wire flash_csb = io_out[29];
    // Creating Pad Delay
-   wire #1 io_oeb_29 = io_oeb[29];
-   wire #1 io_oeb_30 = io_oeb[30];
-   wire #1 io_oeb_31 = io_oeb[31];
-   wire #1 io_oeb_32 = io_oeb[32];
-   tri  #1 flash_io0 = (io_oeb_29== 1'b0) ? io_out[29] : 1'bz;
-   tri  #1 flash_io1 = (io_oeb_30== 1'b0) ? io_out[30] : 1'bz;
-   tri  #1 flash_io2 = (io_oeb_31== 1'b0) ? io_out[31] : 1'bz;
-   tri  #1 flash_io3 = (io_oeb_32== 1'b0) ? io_out[32] : 1'bz;
+   wire #1 io_oeb_29 = io_oeb[33];
+   wire #1 io_oeb_30 = io_oeb[34];
+   wire #1 io_oeb_31 = io_oeb[35];
+   wire #1 io_oeb_32 = io_oeb[36];
+   tri  #1 flash_io0 = (io_oeb_29== 1'b0) ? io_out[33] : 1'bz;
+   tri  #1 flash_io1 = (io_oeb_30== 1'b0) ? io_out[34] : 1'bz;
+   tri  #1 flash_io2 = (io_oeb_31== 1'b0) ? io_out[35] : 1'bz;
+   tri  #1 flash_io3 = (io_oeb_32== 1'b0) ? io_out[36] : 1'bz;
 
-   assign io_in[29] = flash_io0;
-   assign io_in[30] = flash_io1;
-   assign io_in[31] = flash_io2;
-   assign io_in[32] = flash_io3;
+   assign io_in[33] = flash_io0;
+   assign io_in[34] = flash_io1;
+   assign io_in[35] = flash_io2;
+   assign io_in[36] = flash_io3;
 
    // Quard flash
-     s25fl256s #(.mem_file_name("arduino_digital_port_control.ino.hex"),
+     s25fl256s #(.mem_file_name(`TB_HEX),
 	         .otp_file_name("none"),
                  .TimingModel("S25FL512SAGMFI010_F_30pF")) 
 		 u_spi_flash_256mb (
@@ -358,7 +362,7 @@
 
        );
 
-   wire spiram_csb = io_out[27];
+   wire spiram_csb = io_out[31];
 
    is62wvs1288 #(.mem_file_name("none"))
 	u_sram (
diff --git a/verilog/dv/arduino_gpio_intr/Makefile b/verilog/dv/arduino_gpio_intr/Makefile
new file mode 100644
index 0000000..0912a65
--- /dev/null
+++ b/verilog/dv/arduino_gpio_intr/Makefile
@@ -0,0 +1,140 @@
+# SPDX-FileCopyrightText: 2020 Efabless Corporation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#      http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+# SPDX-License-Identifier: Apache-2.0
+
+
+# ---- Include Partitioned Makefiles ----
+
+CONFIG = caravel_user_project
+ 
+#######################################################################
+## Caravel Verilog for Integration Tests
+#######################################################################
+
+DESIGNS?=../../..
+TOOLS?=/opt/riscv32i/
+
+export USER_PROJECT_VERILOG ?=  $(DESIGNS)/verilog
+export RISCDUINO_BOARD ?=  $(USER_PROJECT_VERILOG)/dv/common/riscduino_board/custom_board/riscduino
+## YIFIVE FIRMWARE
+YIFIVE_FIRMWARE_PATH = $(USER_PROJECT_VERILOG)/dv/firmware
+GCC_PREFIX?=riscv32-unknown-elf
+
+
+## Simulation mode: RTL/GL
+SIM?=RTL
+DUMP?=OFF
+RISC_CORE?=0
+
+### To Enable IVERILOG FST DUMP
+export IVERILOG_DUMPER = fst
+
+
+.SUFFIXES:
+
+PATTERN = arduino_gpio_intr
+
+all:  ${PATTERN:=.vcd}
+
+
+vvp:  ${PATTERN:=.vvp}
+
+%.vvp: %_tb.v
+	${GCC_PREFIX}-g++ -c -O2 -march=rv32imac -fpeel-loops -ffreestanding -ffunction-sections -fdata-sections -fpermissive -Wall -fno-rtti -fno-exceptions -I${RISCDUINO_BOARD}/system/include -I${RISCDUINO_BOARD}/sdk/bsp/include -I${RISCDUINO_BOARD}/sdk/bsp/env -I${RISCDUINO_BOARD}/sdk/bsp/drivers -I${RISCDUINO_BOARD}/sdk/bsp/env/riscduino_score -include sys/cdefs.h -g -DARDUINO=10607 -DF_CPU=50000000LL -DRISCDUINO_SCORE_DEVKIT -I${RISCDUINO_BOARD}/cores/arduino -I${RISCDUINO_BOARD}/variants/standard ${PATTERN}.ino.cpp -o ${PATTERN}.ino.cpp.o
+	${GCC_PREFIX}-g++ -c -O2 -march=rv32imac -fpeel-loops -ffreestanding -ffunction-sections -fdata-sections -fpermissive -Wall -fno-rtti -fno-exceptions -I${RISCDUINO_BOARD}/system/include -I${RISCDUINO_BOARD}/sdk/bsp/include -I${RISCDUINO_BOARD}/sdk/bsp/env -I${RISCDUINO_BOARD}/sdk/bsp/drivers -I${RISCDUINO_BOARD}/sdk/bsp/env/riscduino_score -include sys/cdefs.h -g -DARDUINO=10607 -DF_CPU=50000000LL -DRISCDUINO_SCORE_DEVKIT -I${RISCDUINO_BOARD}/cores/arduino -I${RISCDUINO_BOARD}/variants/standard ${RISCDUINO_BOARD}/cores/arduino/Print.cpp -o Print.cpp.o
+	${GCC_PREFIX}-g++ -c -O2 -march=rv32imac -fpeel-loops -ffreestanding -ffunction-sections -fdata-sections -fpermissive -Wall -fno-rtti -fno-exceptions -I${RISCDUINO_BOARD}/system/include -I${RISCDUINO_BOARD}/sdk/bsp/include -I${RISCDUINO_BOARD}/sdk/bsp/env -I${RISCDUINO_BOARD}/sdk/bsp/drivers -I${RISCDUINO_BOARD}/sdk/bsp/env/riscduino_score -include sys/cdefs.h -g -DARDUINO=10607 -DF_CPU=50000000LL -DRISCDUINO_SCORE_DEVKIT -I${RISCDUINO_BOARD}/cores/arduino -I${RISCDUINO_BOARD}/variants/standard ${RISCDUINO_BOARD}/cores/arduino/WMath.cpp -o WMath.cpp.o
+	${GCC_PREFIX}-g++ -c -O2 -march=rv32imac -fpeel-loops -ffreestanding -ffunction-sections -fdata-sections -fpermissive -Wall -fno-rtti -fno-exceptions -I${RISCDUINO_BOARD}/system/include -I${RISCDUINO_BOARD}/sdk/bsp/include -I${RISCDUINO_BOARD}/sdk/bsp/env -I${RISCDUINO_BOARD}/sdk/bsp/drivers -I${RISCDUINO_BOARD}/sdk/bsp/env/riscduino_score -include sys/cdefs.h -g -DARDUINO=10607 -DF_CPU=50000000LL -DRISCDUINO_SCORE_DEVKIT -I${RISCDUINO_BOARD}/cores/arduino -I${RISCDUINO_BOARD}/variants/standard ${RISCDUINO_BOARD}/cores/arduino/WString.cpp -o WString.cpp.o
+	${GCC_PREFIX}-gcc -c -O2 -march=rv32imac -fpeel-loops -ffreestanding -ffunction-sections -fdata-sections -Wall -I${RISCDUINO_BOARD}/system/include -I${RISCDUINO_BOARD}/sdk/bsp/include -I${RISCDUINO_BOARD}/sdk/bsp/env -I${RISCDUINO_BOARD}/sdk/bsp/drivers -I${RISCDUINO_BOARD}/sdk/bsp/env/riscduino_score -include sys/cdefs.h -g -DARDUINO=10607 -DF_CPU=50000000LL -DRISCDUINO_SCORE_DEVKIT -I${RISCDUINO_BOARD}/cores/arduino -I${RISCDUINO_BOARD}/variants/standard ${RISCDUINO_BOARD}/cores/arduino/WInterrupts.c -o WInterrupts.c.o
+	${GCC_PREFIX}-gcc -c -O2 -march=rv32imac -fpeel-loops -ffreestanding -ffunction-sections -fdata-sections -Wall -I${RISCDUINO_BOARD}/system/include -I${RISCDUINO_BOARD}/sdk/bsp/include -I${RISCDUINO_BOARD}/sdk/bsp/env -I${RISCDUINO_BOARD}/sdk/bsp/drivers -I${RISCDUINO_BOARD}/sdk/bsp/env/riscduino_score -include sys/cdefs.h -g -DARDUINO=10607 -DF_CPU=50000000LL -DRISCDUINO_SCORE_DEVKIT -I${RISCDUINO_BOARD}/cores/arduino -I${RISCDUINO_BOARD}/variants/standard ${RISCDUINO_BOARD}/cores/arduino/drivers/fe300prci/fe300prci_driver.c -o fe300prci_driver.c.o
+	${GCC_PREFIX}-g++ -c -O2 -march=rv32imac -fpeel-loops -ffreestanding -ffunction-sections -fdata-sections -fpermissive -Wall -fno-rtti -fno-exceptions -I${RISCDUINO_BOARD}/system/include -I${RISCDUINO_BOARD}/sdk/bsp/include -I${RISCDUINO_BOARD}/sdk/bsp/env -I${RISCDUINO_BOARD}/sdk/bsp/drivers -I${RISCDUINO_BOARD}/sdk/bsp/env/riscduino_score -include sys/cdefs.h -g -DARDUINO=10607 -DF_CPU=50000000LL -DRISCDUINO_SCORE_DEVKIT -I${RISCDUINO_BOARD}/cores/arduino -I${RISCDUINO_BOARD}/variants/standard ${RISCDUINO_BOARD}/cores/arduino/abi.cpp -o abi.cpp.o
+	${GCC_PREFIX}-gcc -c -O2 -march=rv32imac -fpeel-loops -ffreestanding -ffunction-sections -fdata-sections -Wall -I${RISCDUINO_BOARD}/system/include -I${RISCDUINO_BOARD}/sdk/bsp/include -I${RISCDUINO_BOARD}/sdk/bsp/env -I${RISCDUINO_BOARD}/sdk/bsp/drivers -I${RISCDUINO_BOARD}/sdk/bsp/env/riscduino_score -include sys/cdefs.h -g -DARDUINO=10607 -DF_CPU=50000000LL -DRISCDUINO_SCORE_DEVKIT -I${RISCDUINO_BOARD}/cores/arduino -I${RISCDUINO_BOARD}/variants/standard ${RISCDUINO_BOARD}/cores/arduino/drivers/plic/plic_driver.c -o plic_driver.c.o
+	${GCC_PREFIX}-g++ -c -O2 -march=rv32imac -fpeel-loops -ffreestanding -ffunction-sections -fdata-sections -fpermissive -Wall -fno-rtti -fno-exceptions -I${RISCDUINO_BOARD}/system/include -I${RISCDUINO_BOARD}/sdk/bsp/include -I${RISCDUINO_BOARD}/sdk/bsp/env -I${RISCDUINO_BOARD}/sdk/bsp/drivers -I${RISCDUINO_BOARD}/sdk/bsp/env/riscduino_score -include sys/cdefs.h -g -DARDUINO=10607 -DF_CPU=50000000LL -DRISCDUINO_SCORE_DEVKIT -I${RISCDUINO_BOARD}/cores/arduino -I${RISCDUINO_BOARD}/variants/standard ${RISCDUINO_BOARD}/cores/arduino/UARTClass.cpp -o UARTClass.cpp.o
+	${GCC_PREFIX}-gcc -c -march=rv32imac -I${RISCDUINO_BOARD}/system/include -I${RISCDUINO_BOARD}/sdk/bsp/include -I${RISCDUINO_BOARD}/sdk/bsp/env -I${RISCDUINO_BOARD}/sdk/bsp/drivers -I${RISCDUINO_BOARD}/sdk/bsp/env/riscduino_score -g -DARDUINO=10607 -DF_CPU=50000000LL -DRISCDUINO_SCORE_DEVKIT -I${RISCDUINO_BOARD}/cores/arduino -I${RISCDUINO_BOARD}/variants/standard ${RISCDUINO_BOARD}/cores/arduino/entry.S -o entry.S.o
+	${GCC_PREFIX}-gcc -c -O2 -march=rv32imac -fpeel-loops -ffreestanding -ffunction-sections -fdata-sections -Wall -I${RISCDUINO_BOARD}/system/include -I${RISCDUINO_BOARD}/sdk/bsp/include -I${RISCDUINO_BOARD}/sdk/bsp/env -I${RISCDUINO_BOARD}/sdk/bsp/drivers -I${RISCDUINO_BOARD}/sdk/bsp/env/riscduino_score -include sys/cdefs.h -g -DARDUINO=10607 -DF_CPU=50000000LL -DRISCDUINO_SCORE_DEVKIT -I${RISCDUINO_BOARD}/cores/arduino -I${RISCDUINO_BOARD}/variants/standard ${RISCDUINO_BOARD}/cores/arduino/hooks.c -o hooks.c.o
+	${GCC_PREFIX}-gcc -c -march=rv32imac -I${RISCDUINO_BOARD}/system/include -I${RISCDUINO_BOARD}/sdk/bsp/include -I${RISCDUINO_BOARD}/sdk/bsp/env -I${RISCDUINO_BOARD}/sdk/bsp/drivers -I${RISCDUINO_BOARD}/sdk/bsp/env/riscduino_score -g -DARDUINO=10607 -DF_CPU=50000000LL -DRISCDUINO_SCORE_DEVKIT -I${RISCDUINO_BOARD}/cores/arduino -I${RISCDUINO_BOARD}/variants/standard ${RISCDUINO_BOARD}/cores/arduino/init.S -o init.S.o
+	${GCC_PREFIX}-gcc -c -O2 -march=rv32imac -fpeel-loops -ffreestanding -ffunction-sections -fdata-sections -Wall -I${RISCDUINO_BOARD}/system/include -I${RISCDUINO_BOARD}/sdk/bsp/include -I${RISCDUINO_BOARD}/sdk/bsp/env -I${RISCDUINO_BOARD}/sdk/bsp/drivers -I${RISCDUINO_BOARD}/sdk/bsp/env/riscduino_score -include sys/cdefs.h -g -DARDUINO=10607 -DF_CPU=50000000LL -DRISCDUINO_SCORE_DEVKIT -I${RISCDUINO_BOARD}/cores/arduino -I${RISCDUINO_BOARD}/variants/standard ${RISCDUINO_BOARD}/cores/arduino/itoa.c -o itoa.c.o
+	${GCC_PREFIX}-g++ -c -O2 -march=rv32imac -fpeel-loops -ffreestanding -ffunction-sections -fdata-sections -fpermissive -Wall -fno-rtti -fno-exceptions -I${RISCDUINO_BOARD}/system/include -I${RISCDUINO_BOARD}/sdk/bsp/include -I${RISCDUINO_BOARD}/sdk/bsp/env -I${RISCDUINO_BOARD}/sdk/bsp/drivers -I${RISCDUINO_BOARD}/sdk/bsp/env/riscduino_score -include sys/cdefs.h -g -DARDUINO=10607 -DF_CPU=50000000LL -DRISCDUINO_SCORE_DEVKIT -I${RISCDUINO_BOARD}/cores/arduino -I${RISCDUINO_BOARD}/variants/standard ${RISCDUINO_BOARD}/cores/arduino/main.cpp -o main.cpp.o
+	${GCC_PREFIX}-gcc -c -O2 -march=rv32imac -fpeel-loops -ffreestanding -ffunction-sections -fdata-sections -Wall -I${RISCDUINO_BOARD}/system/include -I${RISCDUINO_BOARD}/sdk/bsp/include -I${RISCDUINO_BOARD}/sdk/bsp/env -I${RISCDUINO_BOARD}/sdk/bsp/drivers -I${RISCDUINO_BOARD}/sdk/bsp/env/riscduino_score -include sys/cdefs.h -g -DARDUINO=10607 -DF_CPU=50000000LL -DRISCDUINO_SCORE_DEVKIT -I${RISCDUINO_BOARD}/cores/arduino -I${RISCDUINO_BOARD}/variants/standard ${RISCDUINO_BOARD}/cores/arduino/malloc.c -o malloc.c.o
+	${GCC_PREFIX}-g++ -c -O2 -march=rv32imac -fpeel-loops -ffreestanding -ffunction-sections -fdata-sections -fpermissive -Wall -fno-rtti -fno-exceptions -I${RISCDUINO_BOARD}/system/include -I${RISCDUINO_BOARD}/sdk/bsp/include -I${RISCDUINO_BOARD}/sdk/bsp/env -I${RISCDUINO_BOARD}/sdk/bsp/drivers -I${RISCDUINO_BOARD}/sdk/bsp/env/riscduino_score -include sys/cdefs.h -g -DARDUINO=10607 -DF_CPU=50000000LL -DRISCDUINO_SCORE_DEVKIT -I${RISCDUINO_BOARD}/cores/arduino -I${RISCDUINO_BOARD}/variants/standard ${RISCDUINO_BOARD}/cores/arduino/new.cpp -o new.cpp.o
+	${GCC_PREFIX}-gcc -c -O2 -march=rv32imac -fpeel-loops -ffreestanding -ffunction-sections -fdata-sections -Wall -I${RISCDUINO_BOARD}/system/include -I${RISCDUINO_BOARD}/sdk/bsp/include -I${RISCDUINO_BOARD}/sdk/bsp/env -I${RISCDUINO_BOARD}/sdk/bsp/drivers -I${RISCDUINO_BOARD}/sdk/bsp/env/riscduino_score -include sys/cdefs.h -g -DARDUINO=10607 -DF_CPU=50000000LL -DRISCDUINO_SCORE_DEVKIT -I${RISCDUINO_BOARD}/cores/arduino -I${RISCDUINO_BOARD}/variants/standard ${RISCDUINO_BOARD}/cores/arduino/sbrk.c -o sbrk.c.o
+	${GCC_PREFIX}-gcc -c -march=rv32imac -I${RISCDUINO_BOARD}/system/include -I${RISCDUINO_BOARD}/sdk/bsp/include -I${RISCDUINO_BOARD}/sdk/bsp/env -I${RISCDUINO_BOARD}/sdk/bsp/drivers -I${RISCDUINO_BOARD}/sdk/bsp/env/riscduino_score -g -DARDUINO=10607 -DF_CPU=50000000LL -DRISCDUINO_SCORE_DEVKIT -I${RISCDUINO_BOARD}/cores/arduino -I${RISCDUINO_BOARD}/variants/standard ${RISCDUINO_BOARD}/cores/arduino/start.S -o start.S.o
+	${GCC_PREFIX}-gcc -c -O2 -march=rv32imac -fpeel-loops -ffreestanding -ffunction-sections -fdata-sections -Wall -I${RISCDUINO_BOARD}/system/include -I${RISCDUINO_BOARD}/sdk/bsp/include -I${RISCDUINO_BOARD}/sdk/bsp/env -I${RISCDUINO_BOARD}/sdk/bsp/drivers -I${RISCDUINO_BOARD}/sdk/bsp/env/riscduino_score -include sys/cdefs.h -g -DARDUINO=10607 -DF_CPU=50000000LL -DRISCDUINO_SCORE_DEVKIT -I${RISCDUINO_BOARD}/cores/arduino -I${RISCDUINO_BOARD}/variants/standard ${RISCDUINO_BOARD}/cores/arduino/wiring.c -o wiring.c.o
+	${GCC_PREFIX}-gcc -c -O2 -march=rv32imac -fpeel-loops -ffreestanding -ffunction-sections -fdata-sections -Wall -I${RISCDUINO_BOARD}/system/include -I${RISCDUINO_BOARD}/sdk/bsp/include -I${RISCDUINO_BOARD}/sdk/bsp/env -I${RISCDUINO_BOARD}/sdk/bsp/drivers -I${RISCDUINO_BOARD}/sdk/bsp/env/riscduino_score -include sys/cdefs.h -g -DARDUINO=10607 -DF_CPU=50000000LL -DRISCDUINO_SCORE_DEVKIT -I${RISCDUINO_BOARD}/cores/arduino -I${RISCDUINO_BOARD}/variants/standard ${RISCDUINO_BOARD}/cores/arduino/wiring_analog.c -o wiring_analog.c.o
+	${GCC_PREFIX}-gcc -c -O2 -march=rv32imac -fpeel-loops -ffreestanding -ffunction-sections -fdata-sections -Wall -I${RISCDUINO_BOARD}/system/include -I${RISCDUINO_BOARD}/sdk/bsp/include -I${RISCDUINO_BOARD}/sdk/bsp/env -I${RISCDUINO_BOARD}/sdk/bsp/drivers -I${RISCDUINO_BOARD}/sdk/bsp/env/riscduino_score -include sys/cdefs.h -g -DARDUINO=10607 -DF_CPU=50000000LL -DRISCDUINO_SCORE_DEVKIT -I${RISCDUINO_BOARD}/cores/arduino -I${RISCDUINO_BOARD}/variants/standard ${RISCDUINO_BOARD}/cores/arduino/wiring_digital.c -o wiring_digital.c.o
+	${GCC_PREFIX}-g++ -c -O2 -march=rv32imac -fpeel-loops -ffreestanding -ffunction-sections -fdata-sections -fpermissive -Wall -fno-rtti -fno-exceptions -I${RISCDUINO_BOARD}/system/include -I${RISCDUINO_BOARD}/sdk/bsp/include -I${RISCDUINO_BOARD}/sdk/bsp/env -I${RISCDUINO_BOARD}/sdk/bsp/drivers -I${RISCDUINO_BOARD}/sdk/bsp/env/riscduino_score -include sys/cdefs.h -g -DARDUINO=10607 -DF_CPU=50000000LL -DRISCDUINO_SCORE_DEVKIT -I${RISCDUINO_BOARD}/cores/arduino -I${RISCDUINO_BOARD}/variants/standard ${RISCDUINO_BOARD}/cores/arduino/wiring_pulse.cpp -o wiring_pulse.cpp.o
+	${GCC_PREFIX}-gcc -c -O2 -march=rv32imac -fpeel-loops -ffreestanding -ffunction-sections -fdata-sections -Wall -I${RISCDUINO_BOARD}/system/include -I${RISCDUINO_BOARD}/sdk/bsp/include -I${RISCDUINO_BOARD}/sdk/bsp/env -I${RISCDUINO_BOARD}/sdk/bsp/drivers -I${RISCDUINO_BOARD}/sdk/bsp/env/riscduino_score -include sys/cdefs.h -g -DARDUINO=10607 -DF_CPU=50000000LL -DRISCDUINO_SCORE_DEVKIT -I${RISCDUINO_BOARD}/cores/arduino -I${RISCDUINO_BOARD}/variants/standard ${RISCDUINO_BOARD}/cores/arduino/wiring_shift.c -o wiring_shift.c.o
+	${GCC_PREFIX}-ar rcs core.a Print.cpp.o
+	${GCC_PREFIX}-ar rcs core.a UARTClass.cpp.o
+	${GCC_PREFIX}-ar rcs core.a WInterrupts.c.o
+	${GCC_PREFIX}-ar rcs core.a WMath.cpp.o
+	${GCC_PREFIX}-ar rcs core.a WString.cpp.o
+	${GCC_PREFIX}-ar rcs core.a abi.cpp.o
+	${GCC_PREFIX}-ar rcs core.a fe300prci_driver.c.o
+	${GCC_PREFIX}-ar rcs core.a plic_driver.c.o
+	${GCC_PREFIX}-ar rcs core.a entry.S.o
+	${GCC_PREFIX}-ar rcs core.a hooks.c.o
+	${GCC_PREFIX}-ar rcs core.a init.S.o
+	${GCC_PREFIX}-ar rcs core.a itoa.c.o
+	${GCC_PREFIX}-ar rcs core.a main.cpp.o
+	${GCC_PREFIX}-ar rcs core.a malloc.c.o
+	${GCC_PREFIX}-ar rcs core.a new.cpp.o
+	${GCC_PREFIX}-ar rcs core.a sbrk.c.o
+	${GCC_PREFIX}-ar rcs core.a start.S.o
+	${GCC_PREFIX}-ar rcs core.a wiring.c.o
+	${GCC_PREFIX}-ar rcs core.a wiring_analog.c.o
+	${GCC_PREFIX}-ar rcs core.a wiring_digital.c.o
+	${GCC_PREFIX}-ar rcs core.a wiring_pulse.cpp.o
+	${GCC_PREFIX}-ar rcs core.a wiring_shift.c.o
+	${GCC_PREFIX}-g++ -T ${RISCDUINO_BOARD}/sdk/bsp/env/riscduino_score/link.lds -nostartfiles -Wl,-N -Wl,--gc-sections -Wl,--wrap=malloc -Wl,--wrap=free -Wl,--wrap=sbrk ${PATTERN}.ino.cpp.o -nostdlib -Wl,--start-group core.a -lm -lstdc++ -lc -lgloss -Wl,--end-group -lgcc -o ${PATTERN}.elf
+	${GCC_PREFIX}-objcopy -R .rel.dyn -O binary ${PATTERN}.elf ${PATTERN}.bin
+	${GCC_PREFIX}-objcopy -R .rel.dyn -O verilog ${PATTERN}.elf ${PATTERN}.hex
+	${GCC_PREFIX}-objdump -D  ${PATTERN}.elf >   ${PATTERN}.dump
+	rm *.o *.a
+ifeq ($(SIM),RTL)
+   ifeq ($(DUMP),OFF)
+	iverilog -g2012 -DFUNCTIONAL -DSIM -DRISC_BOOT -I $(PDK_PATH) \
+	-f$(USER_PROJECT_VERILOG)/includes/includes.rtl.$(CONFIG) \
+	-f$(USER_PROJECT_VERILOG)/includes/includes.rtl.lib  \
+	$< -o $@ 
+    else  
+	iverilog -g2012 -DWFDUMP -DFUNCTIONAL -DRISC_BOOT -DSIM -I $(PDK_PATH) \
+	-f$(USER_PROJECT_VERILOG)/includes/includes.rtl.$(CONFIG) \
+	-f$(USER_PROJECT_VERILOG)/includes/includes.rtl.lib  \
+	$< -o $@ 
+   endif
+else  
+   ifeq ($(DUMP),OFF)
+	iverilog -g2012 -DFUNCTIONAL -DUSE_POWER_PINS -DRISC_BOOT -DGL -I $(PDK_PATH) \
+	-f$(USER_PROJECT_VERILOG)/includes/includes.gl.$(CONFIG) \
+	-f$(USER_PROJECT_VERILOG)/includes/includes.gl.lib \
+	$< -o $@ 
+    else  
+	iverilog -g2012 -DWFDUMP -DFUNCTIONAL -DUSE_POWER_PINS -DRISC_BOOT -DGL -I $(PDK_PATH) \
+	-f$(USER_PROJECT_VERILOG)/includes/includes.gl.$(CONFIG) \
+	-f$(USER_PROJECT_VERILOG)/includes/includes.gl.lib \
+	$< -o $@ 
+   endif
+endif
+
+%.vcd: %.vvp
+	vvp $< +risc_core_id=$(RISC_CORE)
+
+
+# ---- Clean ----
+
+clean:
+	rm -f *.elf *.hex *.bin *.vvp *.vcd *.log *.dump *.a *.o
+
+.PHONY: clean hex all
diff --git a/verilog/dv/arduino_gpio_intr/arduino_gpio_intr.ino b/verilog/dv/arduino_gpio_intr/arduino_gpio_intr.ino
new file mode 100644
index 0000000..fd1a9fe
--- /dev/null
+++ b/verilog/dv/arduino_gpio_intr/arduino_gpio_intr.ino
@@ -0,0 +1,73 @@
+
+/*
+
+  Analog input, analog output, serial output
+
+  Reads an analog input pin, maps the result to a range from 0 to 255 and uses
+
+  the result to set the pulse width modulation (PWM) of an output pin.
+
+  Also prints the results to the Serial Monitor.
+
+  The circuit:
+
+  - potentiometer connected to analog pin 0.
+
+    Center pin of the potentiometer goes to the analog pin.
+
+    side pins of the potentiometer go to +5V and ground
+
+  - LED connected from digital pin 9 to ground
+
+  created 29 Dec. 2008
+
+  modified 9 Apr 2012
+
+  by Tom Igoe
+
+  This example code is in the public domain.
+
+  http://www.arduino.cc/en/Tutorial/AnalogInOutSerial
+
+*/
+
+#include"Arduino.h"
+// These constants won't change. They're used to give names to the pins used:
+
+
+int but1=2;  
+int but2=3;  
+
+
+int pwmValue =0;
+void setup() {
+
+  // initialize serial communications at 9600 bps:
+  Serial.begin(9600);
+
+}
+
+void loop() {
+
+  attachInterrupt(digitalPinToInterrupt(but1),increase,LOW);  
+  attachInterrupt(digitalPinToInterrupt(but2),reset_pwm,FALLING);  
+
+ 
+
+  delay(1);
+}
+
+
+void increase()  
+ {  
+  pwmValue = pwmValue + 10;
+  if(pwmValue > 255) pwmValue = 0;;   
+  
+  Serial.print("String length is: ");
+  Serial.println(pwmValue);
+
+
+  }  
+ void reset_pwm(){  
+   pwmValue =0;  // 0V
+ }  
\ No newline at end of file
diff --git a/verilog/dv/arduino_gpio_intr/arduino_gpio_intr.ino.cpp b/verilog/dv/arduino_gpio_intr/arduino_gpio_intr.ino.cpp
new file mode 100644
index 0000000..8c75087
--- /dev/null
+++ b/verilog/dv/arduino_gpio_intr/arduino_gpio_intr.ino.cpp
@@ -0,0 +1,67 @@
+
+/*
+Testing the GPIO Interrupt 
+
+*/
+
+#include"Arduino.h"
+// These constants won't change. They're used to give names to the pins used:
+
+
+
+
+int pwmValue =0;
+void setup();
+void loop();
+void increase_2();
+void decrease_1();
+void setup() {
+
+  // initialize serial communications at 9600 bps:
+  Serial.begin(1152000);
+  //attachInterrupt(digitalPinToInterrupt(0),increase_2,RISING);  // Exclude UART
+  //attachInterrupt(digitalPinToInterrupt(1),decrease_1,FALLING);  // Exclude UART
+  attachInterrupt(digitalPinToInterrupt(2),increase_2,RISING);  
+  attachInterrupt(digitalPinToInterrupt(3),decrease_1,FALLING);  
+  attachInterrupt(digitalPinToInterrupt(4),increase_2,RISING);  
+  attachInterrupt(digitalPinToInterrupt(5),decrease_1,FALLING);  
+  attachInterrupt(digitalPinToInterrupt(6),increase_2,RISING);  
+  attachInterrupt(digitalPinToInterrupt(7),decrease_1,FALLING);  
+  attachInterrupt(digitalPinToInterrupt(8),increase_2,RISING);  
+  attachInterrupt(digitalPinToInterrupt(9),decrease_1,FALLING);  
+
+  attachInterrupt(digitalPinToInterrupt(10),increase_2,RISING);  
+  attachInterrupt(digitalPinToInterrupt(11),decrease_1,FALLING);  
+  attachInterrupt(digitalPinToInterrupt(12),increase_2,RISING);  
+  attachInterrupt(digitalPinToInterrupt(13),decrease_1,FALLING);  
+  attachInterrupt(digitalPinToInterrupt(14),increase_2,RISING);  
+  attachInterrupt(digitalPinToInterrupt(15),decrease_1,FALLING);  
+  attachInterrupt(digitalPinToInterrupt(16),increase_2,RISING);  
+  attachInterrupt(digitalPinToInterrupt(17),decrease_1,FALLING);  
+  attachInterrupt(digitalPinToInterrupt(18),increase_2,RISING);  
+  attachInterrupt(digitalPinToInterrupt(19),decrease_1,FALLING);  
+
+  attachInterrupt(digitalPinToInterrupt(20),increase_2,RISING);  
+  attachInterrupt(digitalPinToInterrupt(21),decrease_1,FALLING);  
+  attachInterrupt(digitalPinToInterrupt(22),increase_2,RISING);  
+}
+
+void loop() {
+
+  delay(1);
+}
+
+
+void decrease_1()  {  
+  pwmValue = pwmValue - 1;
+  
+  Serial.print("PWM Value Decrease to: ");
+  Serial.println(pwmValue);
+  }  
+
+void increase_2()  {  
+  pwmValue = pwmValue + 2;
+  
+  Serial.print("PWM Value Increase to: ");
+  Serial.println(pwmValue);
+  }  
diff --git a/verilog/dv/arduino_gpio_intr/arduino_gpio_intr_tb.v b/verilog/dv/arduino_gpio_intr/arduino_gpio_intr_tb.v
new file mode 100644
index 0000000..608d120
--- /dev/null
+++ b/verilog/dv/arduino_gpio_intr/arduino_gpio_intr_tb.v
@@ -0,0 +1,659 @@
+////////////////////////////////////////////////////////////////////////////
+// SPDX-FileCopyrightText:  2021 , Dinesh Annayya
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+// SPDX-License-Identifier: Apache-2.0
+// SPDX-FileContributor: Modified by Dinesh Annayya <dinesha@opencores.org>
+//////////////////////////////////////////////////////////////////////
+////                                                              ////
+////  Standalone User validation Test bench                       ////
+////                                                              ////
+////  This file is part of the riscdunio cores project            ////
+////  https://github.com/dineshannayya/riscdunio.git              ////
+////                                                              ////
+////  Description                                                 ////
+////   This is a standalone test bench to validate the            ////
+////   Digital core.                                              ////
+////   This test bench to validate Arduino Interrupt              ////
+////                                                              ////
+////  To Do:                                                      ////
+////    nothing                                                   ////
+////                                                              ////
+////  Author(s):                                                  ////
+////      - Dinesh Annayya, dinesh.annayya@gmail.com              ////
+////                                                              ////
+////  Revision :                                                  ////
+////    0.1 - 29th July 2022, Dinesh A                            ////
+////                                                              ////
+//////////////////////////////////////////////////////////////////////
+////                                                              ////
+//// Copyright (C) 2000 Authors and OPENCORES.ORG                 ////
+////                                                              ////
+//// This source file may be used and distributed without         ////
+//// restriction provided that this copyright statement is not    ////
+//// removed from the file and that any derivative work contains  ////
+//// the original copyright notice and the associated disclaimer. ////
+////                                                              ////
+//// This source file is free software; you can redistribute it   ////
+//// and/or modify it under the terms of the GNU Lesser General   ////
+//// Public License as published by the Free Software Foundation; ////
+//// either version 2.1 of the License, or (at your option) any   ////
+//// later version.                                               ////
+////                                                              ////
+//// This source is distributed in the hope that it will be       ////
+//// useful, but WITHOUT ANY WARRANTY; without even the implied   ////
+//// warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR      ////
+//// PURPOSE.  See the GNU Lesser General Public License for more ////
+//// details.                                                     ////
+////                                                              ////
+//// You should have received a copy of the GNU Lesser General    ////
+//// Public License along with this source; if not, download it   ////
+//// from http://www.opencores.org/lgpl.shtml                     ////
+////                                                              ////
+//////////////////////////////////////////////////////////////////////
+
+`default_nettype wire
+
+`timescale 1 ns / 1 ns
+
+`include "sram_macros/sky130_sram_2kbyte_1rw1r_32x512_8.v"
+`include "is62wvs1288.v"
+`include "user_params.svh"
+`include "uart_agent.v"
+
+`define TB_HEX "arduino_gpio_intr.hex"
+`define TB_TOP arduino_gpio_intr_tb
+
+module `TB_TOP;
+	reg clock;
+	reg wb_rst_i;
+	reg power1, power2;
+	reg power3, power4;
+
+        reg        wbd_ext_cyc_i;  // strobe/request
+        reg        wbd_ext_stb_i;  // strobe/request
+        reg [31:0] wbd_ext_adr_i;  // address
+        reg        wbd_ext_we_i;  // write
+        reg [31:0] wbd_ext_dat_i;  // data output
+        reg [3:0]  wbd_ext_sel_i;  // byte enable
+
+        wire [31:0] wbd_ext_dat_o;  // data input
+        wire        wbd_ext_ack_o;  // acknowlegement
+        wire        wbd_ext_err_o;  // error
+
+	// User I/O
+	wire [37:0] io_oeb;
+	wire [37:0] io_out;
+	wire [37:0] io_in;
+
+	wire gpio;
+	wire [37:0] mprj_io;
+	wire [7:0] mprj_io_0;
+	reg         test_fail;
+	reg [31:0] read_data;
+    //----------------------------------
+    // Uart Configuration
+    // ---------------------------------
+    reg [1:0]      uart_data_bit        ;
+    reg	       uart_stop_bits       ; // 0: 1 stop bit; 1: 2 stop bit;
+    reg	       uart_stick_parity    ; // 1: force even parity
+    reg	       uart_parity_en       ; // parity enable
+    reg	       uart_even_odd_parity ; // 0: odd parity; 1: even parity
+    
+    reg [7:0]      uart_data            ;
+    reg [15:0]     uart_divisor         ;	// divided by n * 16
+    reg [15:0]     uart_timeout         ;// wait time limit
+    
+    reg [15:0]     uart_rx_nu           ;
+    reg [15:0]     uart_tx_nu           ;
+    reg [7:0]      uart_write_data [0:39];
+    reg 	       uart_fifo_enable     ;	// fifo mode disable
+	reg            flag                 ;
+    reg            compare_start        ; // User Need to make sure that compare start match with RiscV core completing initial booting
+
+	reg [31:0]     check_sum            ;
+        
+	integer    d_risc_id;
+
+         integer i,j;
+
+
+
+
+	// 50Mhz CLock
+	always #10 clock <= (clock === 1'b0);
+
+	initial begin
+		clock = 0;
+	    flag  = 0;
+        compare_start = 0;
+        wbd_ext_cyc_i ='h0;  // strobe/request
+        wbd_ext_stb_i ='h0;  // strobe/request
+        wbd_ext_adr_i ='h0;  // address
+        wbd_ext_we_i  ='h0;  // write
+        wbd_ext_dat_i ='h0;  // data output
+        wbd_ext_sel_i ='h0;  // byte enable
+	end
+
+	`ifdef WFDUMP
+	   initial begin
+	   	$dumpfile("simx.vcd");
+	   	$dumpvars(3, `TB_TOP);
+	   	$dumpvars(0, `TB_TOP.u_top.u_riscv_top);
+	   	$dumpvars(0, `TB_TOP.u_top.u_pinmux);
+	   end
+       `endif
+
+
+	wire [15:0] irq_lines = u_top.u_pinmux.u_glbl_reg.irq_lines;
+
+
+/**********************************************************************
+    Arduino Digital PinMapping
+              ATMGA328 Pin No 	Functionality 	      Arduino Pin 	       Carvel Pin Mapping
+              Pin-2 	        PD0/RXD[0] 	                0 	           digital_io[6]
+              Pin-3 	        PD1/TXD[0] 	                1 	           digital_io[7]
+              Pin-4 	        PD2/RXD[1]/INT0 	        2 	           digital_io[8]
+              Pin-5 	        PD3/INT1/OC2B(PWM0)         3 	           digital_io[9] 
+              Pin-6 	        PD4/TXD[1] 	                4 	           digital_io[10] 
+              Pin-11 	        PD5/SS[3]/OC0B(PWM1)/T1 	5 	           digital_io[13]
+              Pin-12 	        PD6/SS[2]/OC0A(PWM2)/AIN0 	6 	           digital_io[14]/analog_io[2]
+              Pin-13 	        PD7/A1N1 	                7 	           digital_io[15]/analog_io[3]
+              Pin-14 	        PB0/CLKO/ICP1 	            8 	           digital_io[11]
+              Pin-15 	        PB1/SS[1]OC1A(PWM3) 	    9 	           digital_io[12]
+              Pin-16 	        PB2/SS[0]/OC1B(PWM4) 	    10 	           digital_io[13]
+              Pin-17 	        PB3/MOSI/OC2A(PWM5) 	    11 	           digital_io[14]
+              Pin-18 	        PB4/MISO 	                12 	           digital_io[15]
+              Pin-19 	        PB5/SCK 	                13 	           digital_io[16] 
+
+              Pin-23 	        ADC0 	                    14 	           digital_io[22] 
+              Pin-24 	        ADC1 	                    15 	           digital_io[23] 
+              Pin-25 	        ADC2 	                    16 	           digital_io[24] 
+              Pin-26 	        ADC3 	                    17 	           digital_io[25] 
+              Pin-27 	        SDA 	                    18 	           digital_io[26] 
+              Pin-28 	        SCL 	                    19 	           digital_io[27] 
+
+              Pin-9             XTAL1                       20             digital_io[11]
+              Pin-10            XTAL2                       21             digital_io[12]
+              Pin-1             RESET                       22             digital_io[5] 
+*****************************************************************************/
+
+// Exclude UART TXD/RXD and RESET
+reg [21:2] arduino_din;
+assign  {  
+           //io_in[0], - Exclude RESET
+           io_in[12],
+           io_in[11],
+           io_in[27],
+           io_in[26],
+           io_in[25],
+           io_in[24],
+           io_in[23],
+           io_in[22],
+           io_in[21],
+           io_in[20],
+           io_in[19],
+           io_in[18],
+           io_in[17],
+           io_in[16],
+           io_in[15],
+           io_in[14],
+           io_in[13],
+           io_in[10],
+           io_in[9],
+           io_in[8]
+           // Uart pins io_in[2], io_in[1] are excluded
+          } = (u_top.p_reset_n == 0) ? 23'hZZ_ZZZZ: arduino_din; // Tri-state untill Strap pull completed
+                    
+       /*************************************************************************
+       * This is Baud Rate to clock divider conversion for Test Bench
+       * Note: DUT uses 16x baud clock, where are test bench uses directly
+       * baud clock, Due to 16x Baud clock requirement at RTL, there will be
+       * some resolution loss, we expect at lower baud rate this resolution
+       * loss will be less. For Quick simulation perpose higher baud rate used
+       * *************************************************************************/
+       task tb_set_uart_baud;
+       input [31:0] ref_clk;
+       input [31:0] baud_rate;
+       output [31:0] baud_div;
+       reg   [31:0] baud_div;
+       begin
+	  // for 230400 Baud = (50Mhz/230400) = 216.7
+	  baud_div = ref_clk/baud_rate; // Get the Bit Baud rate
+	  // Baud 16x = 216/16 = 13
+          baud_div = baud_div/16; // To find the RTL baud 16x div value to find similar resolution loss in test bench
+	  // Test bench baud clock , 16x of above value
+	  // 13 * 16 = 208,  
+	  // (Note if you see original value was 216, now it's 208 )
+          baud_div = baud_div * 16;
+	  // Test bench half cycle counter to toggle it 
+	  // 208/2 = 104
+           baud_div = baud_div/2;
+	  //As counter run's from 0 , substract from 1
+	   baud_div = baud_div-1;
+       end
+       endtask
+       
+
+    reg[7:0] pinmap[0:22]; //ardiono to gpio pinmaping
+
+	initial begin
+        arduino_din[22:2]  = 23'b010_1010_1010_1010_1010_10; // Initialise based on test case edge
+        pinmap[0]   = 24;    // PD0 - GPIO-24 
+	    pinmap[1]   = 25;    // PD1 - GPIO-25
+	    pinmap[2]   = 26;    // PD2 - GPIO-26
+	    pinmap[3]   = 27;    // PD3 - GPIO-27
+	    pinmap[4]   = 28;    // PD4 - GPIO-28
+	    pinmap[5]   = 29;    // PD5 - GPIO-29
+	    pinmap[6]   = 30;    // PD6 - GPIO-30
+	    pinmap[7]   = 31;    // PD7 - GPIO-31
+	    pinmap[8]   = 8;     // PB0 - GPIO-8
+	    pinmap[9]   = 9;     // PB1 - GPIO-9
+	    pinmap[10]  = 10;    // PB2 - GPIO-10
+	    pinmap[11]  = 11;    // PB3 - GPIO-11
+	    pinmap[12]  = 12;    // PB4 - GPIO-12
+	    pinmap[13]  = 13;    // PB5 - GPIO-13
+	    pinmap[14]  = 16;    // PC0 - GPIO-16
+	    pinmap[15]  = 17;    // PC1 - GPIO-17
+	    pinmap[16]  = 18;    // PC2 - GPIO-18
+	    pinmap[17]  = 19;    // PC3 - GPIO-19
+	    pinmap[18]  = 20;    // PC4 - GPIO-20
+	    pinmap[19]  = 21;    // PC5 - GPIO-21
+	    pinmap[20]  = 14;    // PB6 - GPIO-14
+	    pinmap[21]  = 15;    // PB7 - GPIO-15
+	    pinmap[22]  = 22;    // PC6 - GPIO-22
+
+
+        uart_data_bit           = 2'b11;
+        uart_stop_bits          = 0; // 0: 1 stop bit; 1: 2 stop bit;
+        uart_stick_parity       = 0; // 1: force even parity
+        uart_parity_en          = 0; // parity enable
+        uart_even_odd_parity    = 1; // 0: odd parity; 1: even parity
+	    tb_set_uart_baud(50000000,1152000,uart_divisor);// 50Mhz Ref clock, Baud Rate: 230400
+        uart_timeout            = 1000;// wait time limit
+        uart_fifo_enable        = 0;	// fifo mode disable
+
+		$value$plusargs("risc_core_id=%d", d_risc_id);
+ 
+	    init();
+       	wait_riscv_boot();
+
+		#200; // Wait for reset removal
+	    repeat (10) @(posedge clock);
+		$display("Monitor: Standalone User Risc Boot Test Started");
+
+		// Remove Wb Reset
+		//wb_user_core_write(`ADDR_SPACE_WBHOST+`WBHOST_GLBL_CFG,'h1);
+
+	    repeat (2) @(posedge clock);
+		#1;
+        // Remove all the reset
+        if(d_risc_id == 0) begin
+             $display("STATUS: Working with Risc core 0");
+             //wb_user_core_write(`ADDR_SPACE_GLBL+`GLBL_CFG_CFG0,'h11F);
+        end else if(d_risc_id == 1) begin
+             $display("STATUS: Working with Risc core 1");
+             wb_user_core_write(`ADDR_SPACE_GLBL+`GLBL_CFG_CFG0,'h21F);
+        end else if(d_risc_id == 2) begin
+             $display("STATUS: Working with Risc core 2");
+             wb_user_core_write(`ADDR_SPACE_GLBL+`GLBL_CFG_CFG0,'h41F);
+        end else if(d_risc_id == 3) begin
+             $display("STATUS: Working with Risc core 3");
+             wb_user_core_write(`ADDR_SPACE_GLBL+`GLBL_CFG_CFG0,'h81F);
+        end
+
+        repeat (100) @(posedge clock);  // wait for Processor Get Ready
+
+	    tb_uart.debug_mode = 0; // disable debug display
+        tb_uart.uart_init;
+        tb_uart.control_setup (uart_data_bit, uart_stop_bits, uart_parity_en, uart_even_odd_parity, 
+                                       uart_stick_parity, uart_timeout, uart_divisor);
+
+        repeat (40000) @(posedge clock);  // wait for Processor Get Ready
+	    flag  = 0;
+		check_sum = 0;
+        compare_start = 1;
+        
+        fork
+
+           begin
+		      $display("Start : Processing One Interrupt At a Time ");
+              // Interrupt- One After One
+              for(i =2; i < 22; i = i+1) begin
+                  arduino_din[i] = !arduino_din[i]; // Invert the edge to create interrupt;
+                  repeat (10) @(posedge clock);  
+                  arduino_din[i] = !arduino_din[i]; // Invert the edge to remove the interrupt
+                  repeat (10) @(posedge clock);  
+                  wait(u_top.u_riscv_top.irq_lines[pinmap[i]] == 1'b1); // Wait for Interrupt assertion
+                  wait(u_top.u_riscv_top.irq_lines[pinmap[i]] == 1'b0); // Wait for Interrupt De-assertion
+
+              end
+              repeat (10000) @(posedge clock);  // Wait for flush our uart message
+		      $display("End : Processing One Interrupt At a Time ");
+
+              // Generate all interrupt and Wait for all interrupt clearing
+		      $display("Start: Processing All Interrupt ");
+              for(i =2; i < 22; i = i+1) begin
+                  arduino_din[i] = !arduino_din[i]; // Invert the edge to create interrupt;
+                  repeat (5) @(posedge clock);  
+                  arduino_din[i] = !arduino_din[i]; // Invert the edge to remove the interrupt
+                  repeat (5) @(posedge clock);  
+                  wait(u_top.u_riscv_top.irq_lines[pinmap[i]] == 1'b1); // Wait for Interrupt assertion
+
+              end
+              wait(u_top.u_riscv_top.irq_lines == 'h0); // Wait for All Interrupt De-assertion
+              repeat (10000) @(posedge clock);  // Wait for flush our uart message
+		      $display("End: Processing All Interrupt ");
+           end
+           begin
+              while(flag == 0)
+              begin
+                 tb_uart.read_char(read_data,flag);
+		         if(flag == 0)  begin
+		            $write ("%c",read_data);
+		            check_sum = check_sum+read_data;
+		         end
+              end
+           end
+           begin
+              repeat (900000) @(posedge clock);  // wait for Processor Get Ready
+           end
+           join_any
+        
+           #1000
+           tb_uart.report_status(uart_rx_nu, uart_tx_nu);
+        
+           test_fail = 0;
+
+		   $display("Total Rx Char: %d Check Sum : %x ",uart_rx_nu, check_sum);
+           // Check 
+           // if all the 102 byte received
+           // if no error 
+           if(uart_rx_nu != 1063) test_fail = 1;
+           if(check_sum != 32'h143de) test_fail = 1;
+           if(tb_uart.err_cnt != 0) test_fail = 1;
+
+	   
+	    	$display("###################################################");
+          	if(test_fail == 0) begin
+		   `ifdef GL
+	    	       $display("Monitor: Standalone String (GL) Passed");
+		   `else
+		       $display("Monitor: Standalone String (RTL) Passed");
+		   `endif
+	        end else begin
+		    `ifdef GL
+	    	        $display("Monitor: Standalone String (GL) Failed");
+		    `else
+		        $display("Monitor: Standalone String (RTL) Failed");
+		    `endif
+		 end
+	    	$display("###################################################");
+	    $finish;
+	end
+
+wire USER_VDD1V8 = 1'b1;
+wire VSS = 1'b0;
+
+user_project_wrapper u_top(
+`ifdef USE_POWER_PINS
+    .vccd1(USER_VDD1V8),	// User area 1 1.8V supply
+    .vssd1(VSS),	// User area 1 digital ground
+`endif
+    .wb_clk_i        (clock),  // System clock
+    .user_clock2     (1'b1),  // Real-time clock
+    .wb_rst_i        (wb_rst_i),  // Regular Reset signal
+
+    .wbs_cyc_i   (wbd_ext_cyc_i),  // strobe/request
+    .wbs_stb_i   (wbd_ext_stb_i),  // strobe/request
+    .wbs_adr_i   (wbd_ext_adr_i),  // address
+    .wbs_we_i    (wbd_ext_we_i),  // write
+    .wbs_dat_i   (wbd_ext_dat_i),  // data output
+    .wbs_sel_i   (wbd_ext_sel_i),  // byte enable
+
+    .wbs_dat_o   (wbd_ext_dat_o),  // data input
+    .wbs_ack_o   (wbd_ext_ack_o),  // acknowlegement
+
+ 
+    // Logic Analyzer Signals
+    .la_data_in      ('1) ,
+    .la_data_out     (),
+    .la_oenb         ('0),
+ 
+
+    // IOs
+    .io_in          (io_in)  ,
+    .io_out         (io_out) ,
+    .io_oeb         (io_oeb) ,
+
+    .user_irq       () 
+
+);
+// SSPI Slave I/F
+assign io_in[5]  = 1'b1; // RESET
+//assign io_in[21] = 1'b0; // CLOCK
+
+`ifndef GL // Drive Power for Hold Fix Buf
+    // All standard cell need power hook-up for functionality work
+    initial begin
+
+    end
+`endif    
+
+//------------------------------------------------------
+//  Integrate the Serial flash with qurd support to
+//  user core using the gpio pads
+//  ----------------------------------------------------
+
+   wire flash_clk = io_out[28];
+   wire flash_csb = io_out[29];
+   // Creating Pad Delay
+   wire #1 io_oeb_29 = io_oeb[33];
+   wire #1 io_oeb_30 = io_oeb[34];
+   wire #1 io_oeb_31 = io_oeb[35];
+   wire #1 io_oeb_32 = io_oeb[36];
+   tri  #1 flash_io0 = (io_oeb_29== 1'b0) ? io_out[33] : 1'bz;
+   tri  #1 flash_io1 = (io_oeb_30== 1'b0) ? io_out[34] : 1'bz;
+   tri  #1 flash_io2 = (io_oeb_31== 1'b0) ? io_out[35] : 1'bz;
+   tri  #1 flash_io3 = (io_oeb_32== 1'b0) ? io_out[36] : 1'bz;
+
+   assign io_in[33] = flash_io0;
+   assign io_in[34] = flash_io1;
+   assign io_in[35] = flash_io2;
+   assign io_in[36] = flash_io3;
+
+   // Quard flash
+     s25fl256s #(.mem_file_name(`TB_HEX),
+	         .otp_file_name("none"),
+                 .TimingModel("S25FL512SAGMFI010_F_30pF")) 
+		 u_spi_flash_256mb (
+           // Data Inputs/Outputs
+       .SI      (flash_io0),
+       .SO      (flash_io1),
+       // Controls
+       .SCK     (flash_clk),
+       .CSNeg   (flash_csb),
+       .WPNeg   (flash_io2),
+       .HOLDNeg (flash_io3),
+       .RSTNeg  (!wb_rst_i)
+
+       );
+
+   wire spiram_csb = io_out[31];
+
+   is62wvs1288 #(.mem_file_name("none"))
+	u_sram (
+         // Data Inputs/Outputs
+           .io0     (flash_io0),
+           .io1     (flash_io1),
+           // Controls
+           .clk    (flash_clk),
+           .csb    (spiram_csb),
+           .io2    (flash_io2),
+           .io3    (flash_io3)
+    );
+
+//---------------------------
+//  UART Agent integration
+// --------------------------
+wire uart_txd,uart_rxd;
+
+assign uart_txd   = io_out[7];
+assign io_in[6]  = uart_rxd ;
+ 
+uart_agent tb_uart(
+	.mclk                (clock              ),
+	.txd                 (uart_rxd           ),
+	.rxd                 (uart_txd           )
+	);
+
+
+//----------------------------
+// All the task are defined here
+//----------------------------
+
+
+
+task wb_user_core_write;
+input [31:0] address;
+input [31:0] data;
+begin
+  repeat (1) @(posedge clock);
+  #1;
+  wbd_ext_adr_i =address;  // address
+  wbd_ext_we_i  ='h1;  // write
+  wbd_ext_dat_i =data;  // data output
+  wbd_ext_sel_i ='hF;  // byte enable
+  wbd_ext_cyc_i ='h1;  // strobe/request
+  wbd_ext_stb_i ='h1;  // strobe/request
+  wait(wbd_ext_ack_o == 1);
+  repeat (1) @(posedge clock);
+  #1;
+  wbd_ext_cyc_i ='h0;  // strobe/request
+  wbd_ext_stb_i ='h0;  // strobe/request
+  wbd_ext_adr_i ='h0;  // address
+  wbd_ext_we_i  ='h0;  // write
+  wbd_ext_dat_i ='h0;  // data output
+  wbd_ext_sel_i ='h0;  // byte enable
+  $display("DEBUG WB USER ACCESS WRITE Address : %x, Data : %x",address,data);
+  repeat (2) @(posedge clock);
+end
+endtask
+
+task  wb_user_core_read;
+input [31:0] address;
+output [31:0] data;
+reg    [31:0] data;
+begin
+  repeat (1) @(posedge clock);
+  #1;
+  wbd_ext_adr_i =address;  // address
+  wbd_ext_we_i  ='h0;  // write
+  wbd_ext_dat_i ='0;  // data output
+  wbd_ext_sel_i ='hF;  // byte enable
+  wbd_ext_cyc_i ='h1;  // strobe/request
+  wbd_ext_stb_i ='h1;  // strobe/request
+  wait(wbd_ext_ack_o == 1);
+  repeat (1) @(negedge clock);
+  data  = wbd_ext_dat_o;  
+  repeat (1) @(posedge clock);
+  #1;
+  wbd_ext_cyc_i ='h0;  // strobe/request
+  wbd_ext_stb_i ='h0;  // strobe/request
+  wbd_ext_adr_i ='h0;  // address
+  wbd_ext_we_i  ='h0;  // write
+  wbd_ext_dat_i ='h0;  // data output
+  wbd_ext_sel_i ='h0;  // byte enable
+  $display("DEBUG WB USER ACCESS READ Address : %x, Data : %x",address,data);
+  repeat (2) @(posedge clock);
+end
+endtask
+
+task  wb_user_core_read_check;
+input [31:0] address;
+output [31:0] data;
+input [31:0] cmp_data;
+reg    [31:0] data;
+begin
+  repeat (1) @(posedge clock);
+  #1;
+  wbd_ext_adr_i =address;  // address
+  wbd_ext_we_i  ='h0;  // write
+  wbd_ext_dat_i ='0;  // data output
+  wbd_ext_sel_i ='hF;  // byte enable
+  wbd_ext_cyc_i ='h1;  // strobe/request
+  wbd_ext_stb_i ='h1;  // strobe/request
+  wait(wbd_ext_ack_o == 1);
+  repeat (1) @(negedge clock);
+  data  = wbd_ext_dat_o;  
+  repeat (1) @(posedge clock);
+  #1;
+  wbd_ext_cyc_i ='h0;  // strobe/request
+  wbd_ext_stb_i ='h0;  // strobe/request
+  wbd_ext_adr_i ='h0;  // address
+  wbd_ext_we_i  ='h0;  // write
+  wbd_ext_dat_i ='h0;  // data output
+  wbd_ext_sel_i ='h0;  // byte enable
+  if(data !== cmp_data) begin
+     $display("ERROR : WB USER ACCESS READ  Address : 0x%x, Exd: 0x%x Rxd: 0x%x ",address,cmp_data,data);
+     test_fail = 1;
+  end else begin
+     $display("STATUS: WB USER ACCESS READ  Address : 0x%x, Data : 0x%x",address,data);
+  end
+  repeat (2) @(posedge clock);
+end
+endtask
+
+`ifdef GL
+
+wire        wbd_spi_stb_i   = u_top.u_qspi_master.wbd_stb_i;
+wire        wbd_spi_ack_o   = u_top.u_qspi_master.wbd_ack_o;
+wire        wbd_spi_we_i    = u_top.u_qspi_master.wbd_we_i;
+wire [31:0] wbd_spi_adr_i   = u_top.u_qspi_master.wbd_adr_i;
+wire [31:0] wbd_spi_dat_i   = u_top.u_qspi_master.wbd_dat_i;
+wire [31:0] wbd_spi_dat_o   = u_top.u_qspi_master.wbd_dat_o;
+wire [3:0]  wbd_spi_sel_i   = u_top.u_qspi_master.wbd_sel_i;
+
+wire        wbd_uart_stb_i  = u_top.u_uart_i2c_usb_spi.reg_cs;
+wire        wbd_uart_ack_o  = u_top.u_uart_i2c_usb_spi.reg_ack;
+wire        wbd_uart_we_i   = u_top.u_uart_i2c_usb_spi.reg_wr;
+wire [8:0]  wbd_uart_adr_i  = u_top.u_uart_i2c_usb_spi.reg_addr;
+wire [7:0]  wbd_uart_dat_i  = u_top.u_uart_i2c_usb_spi.reg_wdata;
+wire [7:0]  wbd_uart_dat_o  = u_top.u_uart_i2c_usb_spi.reg_rdata;
+wire        wbd_uart_sel_i  = u_top.u_uart_i2c_usb_spi.reg_be;
+
+`endif
+
+/**
+`ifdef GL
+//-----------------------------------------------------------------------------
+// RISC IMEM amd DMEM Monitoring TASK
+//-----------------------------------------------------------------------------
+
+`define RISC_CORE  user_uart_tb.u_top.u_core.u_riscv_top
+
+always@(posedge `RISC_CORE.wb_clk) begin
+    if(`RISC_CORE.wbd_imem_ack_i)
+          $display("RISCV-DEBUG => IMEM ADDRESS: %x Read Data : %x", `RISC_CORE.wbd_imem_adr_o,`RISC_CORE.wbd_imem_dat_i);
+    if(`RISC_CORE.wbd_dmem_ack_i && `RISC_CORE.wbd_dmem_we_o)
+          $display("RISCV-DEBUG => DMEM ADDRESS: %x Write Data: %x Resonse: %x", `RISC_CORE.wbd_dmem_adr_o,`RISC_CORE.wbd_dmem_dat_o);
+    if(`RISC_CORE.wbd_dmem_ack_i && !`RISC_CORE.wbd_dmem_we_o)
+          $display("RISCV-DEBUG => DMEM ADDRESS: %x READ Data : %x Resonse: %x", `RISC_CORE.wbd_dmem_adr_o,`RISC_CORE.wbd_dmem_dat_i);
+end
+
+`endif
+**/
+`include "user_tasks.sv"
+endmodule
+`include "s25fl256s.sv"
+`default_nettype wire
diff --git a/verilog/dv/arduino_hello_world/Makefile b/verilog/dv/arduino_hello_world/Makefile
index 497a39e..06f0645 100644
--- a/verilog/dv/arduino_hello_world/Makefile
+++ b/verilog/dv/arduino_hello_world/Makefile
@@ -97,31 +97,31 @@
 	${GCC_PREFIX}-ar rcs core.a wiring_digital.c.o
 	${GCC_PREFIX}-ar rcs core.a wiring_pulse.cpp.o
 	${GCC_PREFIX}-ar rcs core.a wiring_shift.c.o
-	${GCC_PREFIX}-g++ -T ${RISCDUINO_BOARD}/sdk/bsp/env/riscduino_score/link.lds -nostartfiles -Wl,-N -Wl,--gc-sections -Wl,--wrap=malloc -Wl,--wrap=free -Wl,--wrap=sbrk ${PATTERN}.ino.cpp.o -nostdlib -Wl,--start-group core.a -lm -lstdc++ -lc -lgloss -Wl,--end-group -lgcc -o ${PATTERN}.ino.elf
-	${GCC_PREFIX}-objcopy -R .rel.dyn -O binary ${PATTERN}.ino.elf ${PATTERN}.ino.bin
-	${GCC_PREFIX}-objcopy -R .rel.dyn -O verilog ${PATTERN}.ino.elf ${PATTERN}.ino.hex
-	${GCC_PREFIX}-objdump -D  ${PATTERN}.ino.elf >   ${PATTERN}.ino.dump
+	${GCC_PREFIX}-g++ -T ${RISCDUINO_BOARD}/sdk/bsp/env/riscduino_score/link.lds -nostartfiles -Wl,-N -Wl,--gc-sections -Wl,--wrap=malloc -Wl,--wrap=free -Wl,--wrap=sbrk ${PATTERN}.ino.cpp.o -nostdlib -Wl,--start-group core.a -lm -lstdc++ -lc -lgloss -Wl,--end-group -lgcc -o ${PATTERN}.elf
+	${GCC_PREFIX}-objcopy -R .rel.dyn -O binary ${PATTERN}.elf ${PATTERN}.bin
+	${GCC_PREFIX}-objcopy -R .rel.dyn -O verilog ${PATTERN}.elf ${PATTERN}.hex
+	${GCC_PREFIX}-objdump -D  ${PATTERN}.elf >   ${PATTERN}.dump
 	rm *.o *.a
 ifeq ($(SIM),RTL)
    ifeq ($(DUMP),OFF)
-	iverilog -g2012 -DFUNCTIONAL -DSIM -I $(PDK_PATH) \
+	iverilog -g2012 -DFUNCTIONAL -DSIM -DRISC_BOOT -I $(PDK_PATH) \
 	-f$(USER_PROJECT_VERILOG)/includes/includes.rtl.$(CONFIG) \
 	-f$(USER_PROJECT_VERILOG)/includes/includes.rtl.lib  \
 	$< -o $@ 
     else  
-	iverilog -g2012 -DWFDUMP -DFUNCTIONAL -DSIM -I $(PDK_PATH) \
+	iverilog -g2012 -DWFDUMP -DFUNCTIONAL -DRISC_BOOT -DSIM -I $(PDK_PATH) \
 	-f$(USER_PROJECT_VERILOG)/includes/includes.rtl.$(CONFIG) \
 	-f$(USER_PROJECT_VERILOG)/includes/includes.rtl.lib  \
 	$< -o $@ 
    endif
 else  
    ifeq ($(DUMP),OFF)
-	iverilog -g2012 -DFUNCTIONAL -DUSE_POWER_PINS -DGL -I $(PDK_PATH) \
+	iverilog -g2012 -DFUNCTIONAL -DUSE_POWER_PINS -DRISC_BOOT -DGL -I $(PDK_PATH) \
 	-f$(USER_PROJECT_VERILOG)/includes/includes.gl.$(CONFIG) \
 	-f$(USER_PROJECT_VERILOG)/includes/includes.gl.lib \
 	$< -o $@ 
     else  
-	iverilog -g2012 -DWFDUMP -DFUNCTIONAL -DUSE_POWER_PINS -DGL -I $(PDK_PATH) \
+	iverilog -g2012 -DWFDUMP -DFUNCTIONAL -DUSE_POWER_PINS -DRISC_BOOT -DGL -I $(PDK_PATH) \
 	-f$(USER_PROJECT_VERILOG)/includes/includes.gl.$(CONFIG) \
 	-f$(USER_PROJECT_VERILOG)/includes/includes.gl.lib \
 	$< -o $@ 
diff --git a/verilog/dv/arduino_hello_world/arduino_hello_world_tb.v b/verilog/dv/arduino_hello_world/arduino_hello_world_tb.v
index 344e480..8fc236c 100644
--- a/verilog/dv/arduino_hello_world/arduino_hello_world_tb.v
+++ b/verilog/dv/arduino_hello_world/arduino_hello_world_tb.v
@@ -68,9 +68,13 @@
 `timescale 1 ns / 1 ns
 
 `include "sram_macros/sky130_sram_2kbyte_1rw1r_32x512_8.v"
+`include "is62wvs1288.v"
+`include "user_params.svh"
 `include "uart_agent.v"
 
-module arduino_hello_world_tb;
+`define TB_HEX "arduino_hello_world.hex"
+`define TB_TOP  arduino_hello_world_tb
+module `TB_TOP;
 	reg clock;
 	reg wb_rst_i;
 	reg power1, power2;
@@ -140,11 +144,11 @@
 	`ifdef WFDUMP
 	   initial begin
 	   	$dumpfile("simx.vcd");
-	   	$dumpvars(3, arduino_hello_world_tb);
-	   	//$dumpvars(0, arduino_hello_world_tb.u_top.u_riscv_top.i_core_top_0);
-	   	//$dumpvars(0, arduino_hello_world_tb.u_top.u_riscv_top.u_connect);
-	   	//$dumpvars(0, arduino_hello_world_tb.u_top.u_riscv_top.u_intf);
-	   	$dumpvars(0, arduino_hello_world_tb.u_top.u_uart_i2c_usb_spi.u_uart0_core);
+	   	$dumpvars(3, `TB_TOP);
+	   	//$dumpvars(0, `TB_TOP.u_top.u_riscv_top.i_core_top_0);
+	   	//$dumpvars(0, `TB_TOP.u_top.u_riscv_top.u_connect);
+	   	//$dumpvars(0, `TB_TOP.u_top.u_riscv_top.u_intf);
+	   	$dumpvars(0, `TB_TOP.u_top.u_uart_i2c_usb_spi.u_uart0_core);
 	   end
        `endif
 
@@ -194,15 +198,17 @@
 	        repeat (10) @(posedge clock);
 		$display("Monitor: Standalone User Risc Boot Test Started");
 
+	       init();
+	       wait_riscv_boot();
 		// Remove Wb Reset
-		wb_user_core_write(`ADDR_SPACE_WBHOST+`WBHOST_GLBL_CFG,'h1);
+		//wb_user_core_write(`ADDR_SPACE_WBHOST+`WBHOST_GLBL_CFG,'h1);
 
 	        repeat (2) @(posedge clock);
 		#1;
                 // Remove all the reset
                 if(d_risc_id == 0) begin
                      $display("STATUS: Working with Risc core 0");
-                     wb_user_core_write(`ADDR_SPACE_GLBL+`GLBL_CFG_CFG0,'h11F);
+                     //wb_user_core_write(`ADDR_SPACE_GLBL+`GLBL_CFG_CFG0,'h11F);
                 end else if(d_risc_id == 1) begin
                      $display("STATUS: Working with Risc core 1");
                      wb_user_core_write(`ADDR_SPACE_GLBL+`GLBL_CFG_CFG0,'h21F);
@@ -220,7 +226,6 @@
                 tb_uart.control_setup (uart_data_bit, uart_stop_bits, uart_parity_en, uart_even_odd_parity, 
                                                uart_stick_parity, uart_timeout, uart_divisor);
 
-                repeat (45000) @(posedge clock);  // wait for Processor Get Ready
 	        flag  = 1;
                 
                 
@@ -319,6 +324,9 @@
     .user_irq       () 
 
 );
+// SSPI Slave I/F
+assign io_in[5]  = 1'b1; // RESET
+assign io_in[21] = 1'b0; // CLOCK
 
 `ifndef GL // Drive Power for Hold Fix Buf
     // All standard cell need power hook-up for functionality work
@@ -332,25 +340,25 @@
 //  user core using the gpio pads
 //  ----------------------------------------------------
 
-   wire flash_clk = io_out[24];
-   wire flash_csb = io_out[25];
+   wire flash_clk = io_out[28];
+   wire flash_csb = io_out[29];
    // Creating Pad Delay
-   wire #1 io_oeb_29 = io_oeb[29];
-   wire #1 io_oeb_30 = io_oeb[30];
-   wire #1 io_oeb_31 = io_oeb[31];
-   wire #1 io_oeb_32 = io_oeb[32];
-   tri  #1 flash_io0 = (io_oeb_29== 1'b0) ? io_out[29] : 1'bz;
-   tri  #1 flash_io1 = (io_oeb_30== 1'b0) ? io_out[30] : 1'bz;
-   tri  #1 flash_io2 = (io_oeb_31== 1'b0) ? io_out[31] : 1'bz;
-   tri  #1 flash_io3 = (io_oeb_32== 1'b0) ? io_out[32] : 1'bz;
+   wire #1 io_oeb_29 = io_oeb[33];
+   wire #1 io_oeb_30 = io_oeb[34];
+   wire #1 io_oeb_31 = io_oeb[35];
+   wire #1 io_oeb_32 = io_oeb[36];
+   tri  #1 flash_io0 = (io_oeb_29== 1'b0) ? io_out[33] : 1'bz;
+   tri  #1 flash_io1 = (io_oeb_30== 1'b0) ? io_out[34] : 1'bz;
+   tri  #1 flash_io2 = (io_oeb_31== 1'b0) ? io_out[35] : 1'bz;
+   tri  #1 flash_io3 = (io_oeb_32== 1'b0) ? io_out[36] : 1'bz;
 
-   assign io_in[29] = flash_io0;
-   assign io_in[30] = flash_io1;
-   assign io_in[31] = flash_io2;
-   assign io_in[32] = flash_io3;
+   assign io_in[33] = flash_io0;
+   assign io_in[34] = flash_io1;
+   assign io_in[35] = flash_io2;
+   assign io_in[36] = flash_io3;
 
    // Quard flash
-     s25fl256s #(.mem_file_name("arduino_hello_world.ino.hex"),
+     s25fl256s #(.mem_file_name(`TB_HEX),
 	         .otp_file_name("none"),
                  .TimingModel("S25FL512SAGMFI010_F_30pF")) 
 		 u_spi_flash_256mb (
@@ -366,14 +374,27 @@
 
        );
 
+   wire spiram_csb = io_out[31];
+
+   is62wvs1288 #(.mem_file_name("none"))
+	u_sram (
+         // Data Inputs/Outputs
+           .io0     (flash_io0),
+           .io1     (flash_io1),
+           // Controls
+           .clk    (flash_clk),
+           .csb    (spiram_csb),
+           .io2    (flash_io2),
+           .io3    (flash_io3)
+    );
 
 //---------------------------
 //  UART Agent integration
 // --------------------------
 wire uart_txd,uart_rxd;
 
-assign uart_txd   = io_out[2];
-assign io_in[1]  = uart_rxd ;
+assign uart_txd   = io_out[7];
+assign io_in[6]  = uart_rxd ;
  
 uart_agent tb_uart(
 	.mclk                (clock              ),
@@ -511,6 +532,7 @@
 
 `endif
 **/
+`include "user_tasks.sv"
 endmodule
 `include "s25fl256s.sv"
 `default_nettype wire
diff --git a/verilog/dv/arduino_i2c_scaner/Makefile b/verilog/dv/arduino_i2c_scaner/Makefile
index e6d5947..06dc4bd 100644
--- a/verilog/dv/arduino_i2c_scaner/Makefile
+++ b/verilog/dv/arduino_i2c_scaner/Makefile
@@ -52,9 +52,8 @@
 vvp:  ${PATTERN:=.vvp}
 
 %.vvp: %_tb.v
-	${GCC_PREFIX}-g++ -c -O2 -march=rv32imac -fpeel-loops -ffreestanding -ffunction-sections -fdata-sections -fpermissive -Wall -fno-rtti -fno-exceptions -I${RISCDUINO_BOARD}/system/include -I${RISCDUINO_BOARD}/sdk/bsp/include -I${RISCDUINO_BOARD}/sdk/bsp/env -I${RISCDUINO_BOARD}/sdk/bsp/drivers -I${RISCDUINO_BOARD}/sdk/bsp/env/riscduino_score -include sys/cdefs.h -g -DARDUINO=10607 -DF_CPU=50000000LL -DRISCDUINO_SCORE_DEVKIT -I${RISCDUINO_BOARD}/cores/arduino -I${RISCDUINO_BOARD}/variants/standard -I${RISCDUINO_BOARD}/libraries/Wire ${PATTERN}.ino.cpp -o ${PATTERN}.ino.cpp.o
-	${GCC_PREFIX}-g++ -c -O2 -march=rv32imac -fpeel-loops -ffreestanding -ffunction-sections -fdata-sections -fpermissive -Wall -fno-rtti -fno-exceptions -I${RISCDUINO_BOARD}/system/include -I${RISCDUINO_BOARD}/sdk/bsp/include -I${RISCDUINO_BOARD}/sdk/bsp/env -I${RISCDUINO_BOARD}/sdk/bsp/drivers -I${RISCDUINO_BOARD}/sdk/bsp/env/riscduino_score -include sys/cdefs.h -g -DARDUINO=10607 -DF_CPU=50000000LL -DRISCDUINO_SCORE_DEVKIT -I${RISCDUINO_BOARD}/cores/arduino -I${RISCDUINO_BOARD}/variants/standard -I${RISCDUINO_BOARD}/libraries/Wire -I${RISCDUINO_BOARD}/libraries/Wire/utility ${RISCDUINO_BOARD}/libraries/Wire/Wire.cpp -o Wire.cpp.o
-	${GCC_PREFIX}-gcc -c -O2 -march=rv32imac -fpeel-loops -ffreestanding -ffunction-sections -fdata-sections -Wall -I${RISCDUINO_BOARD}/system/include -I${RISCDUINO_BOARD}/sdk/bsp/include -I${RISCDUINO_BOARD}/sdk/bsp/env -I${RISCDUINO_BOARD}/sdk/bsp/drivers -I${RISCDUINO_BOARD}/sdk/bsp/env/riscduino_score -include sys/cdefs.h -g -DARDUINO=10607 -DF_CPU=50000000LL -DRISCDUINO_SCORE_DEVKIT -I${RISCDUINO_BOARD}/cores/arduino -I${RISCDUINO_BOARD}/variants/standard -I${RISCDUINO_BOARD}/libraries/Wire -I${RISCDUINO_BOARD}/libraries/Wire/utility ${RISCDUINO_BOARD}/libraries/Wire/utility/twi.c -o twi.c.o
+	${GCC_PREFIX}-g++ -c -O2 -march=rv32imac -fpeel-loops -ffreestanding -ffunction-sections -fdata-sections -fpermissive -Wall -fno-rtti -fno-exceptions -I${RISCDUINO_BOARD}/system/include -I${RISCDUINO_BOARD}/sdk/bsp/include -I${RISCDUINO_BOARD}/sdk/bsp/env -I${RISCDUINO_BOARD}/sdk/bsp/drivers -I${RISCDUINO_BOARD}/sdk/bsp/env/riscduino_score -include sys/cdefs.h -g -DARDUINO=10607 -DF_CPU=50000000LL -DRISCDUINO_SCORE_DEVKIT -I${RISCDUINO_BOARD}/cores/arduino -I${RISCDUINO_BOARD}/variants/standard -I${RISCDUINO_BOARD}/libraries/Wire/src ${PATTERN}.ino.cpp -o ${PATTERN}.ino.cpp.o
+	${GCC_PREFIX}-g++ -c -O2 -march=rv32imac -fpeel-loops -ffreestanding -ffunction-sections -fdata-sections -fpermissive -Wall -fno-rtti -fno-exceptions -I${RISCDUINO_BOARD}/system/include -I${RISCDUINO_BOARD}/sdk/bsp/include -I${RISCDUINO_BOARD}/sdk/bsp/env -I${RISCDUINO_BOARD}/sdk/bsp/drivers -I${RISCDUINO_BOARD}/sdk/bsp/env/riscduino_score -include sys/cdefs.h -g -DARDUINO=10607 -DF_CPU=50000000LL -DRISCDUINO_SCORE_DEVKIT -I${RISCDUINO_BOARD}/cores/arduino -I${RISCDUINO_BOARD}/variants/standard -I${RISCDUINO_BOARD}/libraries/Wire/src -I${RISCDUINO_BOARD}/libraries/Wire/src/utility ${RISCDUINO_BOARD}/libraries/Wire/src/Wire.cpp -o Wire.cpp.o
 	${GCC_PREFIX}-g++ -c -O2 -march=rv32imac -fpeel-loops -ffreestanding -ffunction-sections -fdata-sections -fpermissive -Wall -fno-rtti -fno-exceptions -I${RISCDUINO_BOARD}/system/include -I${RISCDUINO_BOARD}/sdk/bsp/include -I${RISCDUINO_BOARD}/sdk/bsp/env -I${RISCDUINO_BOARD}/sdk/bsp/drivers -I${RISCDUINO_BOARD}/sdk/bsp/env/riscduino_score -include sys/cdefs.h -g -DARDUINO=10607 -DF_CPU=50000000LL -DRISCDUINO_SCORE_DEVKIT -I${RISCDUINO_BOARD}/cores/arduino -I${RISCDUINO_BOARD}/variants/standard ${RISCDUINO_BOARD}/cores/arduino/Print.cpp -o Print.cpp.o
 	${GCC_PREFIX}-g++ -c -O2 -march=rv32imac -fpeel-loops -ffreestanding -ffunction-sections -fdata-sections -fpermissive -Wall -fno-rtti -fno-exceptions -I${RISCDUINO_BOARD}/system/include -I${RISCDUINO_BOARD}/sdk/bsp/include -I${RISCDUINO_BOARD}/sdk/bsp/env -I${RISCDUINO_BOARD}/sdk/bsp/drivers -I${RISCDUINO_BOARD}/sdk/bsp/env/riscduino_score -include sys/cdefs.h -g -DARDUINO=10607 -DF_CPU=50000000LL -DRISCDUINO_SCORE_DEVKIT -I${RISCDUINO_BOARD}/cores/arduino -I${RISCDUINO_BOARD}/variants/standard ${RISCDUINO_BOARD}/cores/arduino/WMath.cpp -o WMath.cpp.o
 	${GCC_PREFIX}-g++ -c -O2 -march=rv32imac -fpeel-loops -ffreestanding -ffunction-sections -fdata-sections -fpermissive -Wall -fno-rtti -fno-exceptions -I${RISCDUINO_BOARD}/system/include -I${RISCDUINO_BOARD}/sdk/bsp/include -I${RISCDUINO_BOARD}/sdk/bsp/env -I${RISCDUINO_BOARD}/sdk/bsp/drivers -I${RISCDUINO_BOARD}/sdk/bsp/env/riscduino_score -include sys/cdefs.h -g -DARDUINO=10607 -DF_CPU=50000000LL -DRISCDUINO_SCORE_DEVKIT -I${RISCDUINO_BOARD}/cores/arduino -I${RISCDUINO_BOARD}/variants/standard ${RISCDUINO_BOARD}/cores/arduino/WString.cpp -o WString.cpp.o
@@ -99,10 +98,10 @@
 	${GCC_PREFIX}-ar rcs core.a wiring_digital.c.o
 	${GCC_PREFIX}-ar rcs core.a wiring_pulse.cpp.o
 	${GCC_PREFIX}-ar rcs core.a wiring_shift.c.o
-	${GCC_PREFIX}-g++ -T ${RISCDUINO_BOARD}/sdk/bsp/env/riscduino_score/link.lds -nostartfiles -Wl,-N -Wl,--gc-sections -Wl,--wrap=malloc -Wl,--wrap=free -Wl,--wrap=sbrk ${PATTERN}.ino.cpp.o  Wire.cpp.o twi.c.o -nostdlib -Wl,--start-group core.a -lm -lstdc++ -lc -lgloss -Wl,--end-group -lgcc -o ${PATTERN}.ino.elf
-	${GCC_PREFIX}-objcopy -R .rel.dyn -O binary ${PATTERN}.ino.elf ${PATTERN}.ino.bin
-	${GCC_PREFIX}-objcopy -R .rel.dyn -O verilog ${PATTERN}.ino.elf ${PATTERN}.ino.hex
-	${GCC_PREFIX}-objdump -D  ${PATTERN}.ino.elf >   ${PATTERN}.ino.dump
+	${GCC_PREFIX}-g++ -T ${RISCDUINO_BOARD}/sdk/bsp/env/riscduino_score/link.lds -nostartfiles -Wl,-N -Wl,--gc-sections -Wl,--wrap=malloc -Wl,--wrap=free -Wl,--wrap=sbrk ${PATTERN}.ino.cpp.o  Wire.cpp.o -nostdlib -Wl,--start-group core.a -lm -lstdc++ -lc -lgloss -Wl,--end-group -lgcc -o ${PATTERN}.elf
+	${GCC_PREFIX}-objcopy -R .rel.dyn -O binary ${PATTERN}.elf ${PATTERN}.bin
+	${GCC_PREFIX}-objcopy -R .rel.dyn -O verilog ${PATTERN}.elf ${PATTERN}.hex
+	${GCC_PREFIX}-objdump -D  ${PATTERN}.elf >   ${PATTERN}.dump
 	rm *.o *.a
 ifeq ($(SIM),RTL)
    ifeq ($(DUMP),OFF)
diff --git a/verilog/dv/arduino_i2c_scaner/arduino_i2c_scaner.ino.cpp b/verilog/dv/arduino_i2c_scaner/arduino_i2c_scaner.ino.cpp
index dc656cb..1900e1f 100644
--- a/verilog/dv/arduino_i2c_scaner/arduino_i2c_scaner.ino.cpp
+++ b/verilog/dv/arduino_i2c_scaner/arduino_i2c_scaner.ino.cpp
@@ -45,7 +45,7 @@
 
   Serial.println("Scanning...");
 
-  for (byte address = 1; address < 127; ++address) {
+  for (byte address = 1; address < 32; ++address) {
     // The i2c_scanner uses the return value of
     // the Wire.endTransmission to see if
     // a device did acknowledge to the address.
@@ -67,6 +67,13 @@
         Serial.print("0");
       }
       Serial.println(address, HEX);
+    } else {
+      Serial.print("No I2C device found at address 0x");
+      if (address < 16) {
+        Serial.print("0");
+      }
+      Serial.println(address, HEX);
+
     }
   }
   if (nDevices == 0) {
diff --git a/verilog/dv/arduino_i2c_scaner/arduino_i2c_scaner_tb.v b/verilog/dv/arduino_i2c_scaner/arduino_i2c_scaner_tb.v
index 98948a9..6cb6a4d 100644
--- a/verilog/dv/arduino_i2c_scaner/arduino_i2c_scaner_tb.v
+++ b/verilog/dv/arduino_i2c_scaner/arduino_i2c_scaner_tb.v
@@ -70,8 +70,11 @@
 `include "sram_macros/sky130_sram_2kbyte_1rw1r_32x512_8.v"
 `include "uart_agent.v"
 `include "i2c_slave_model.v"
+`include "is62wvs1288.v"
 
-module arduino_i2c_scaner_tb;
+`define TB_HEX "arduino_i2c_scaner.hex"
+`define TB_TOP  arduino_i2c_scaner_tb
+module `TB_TOP;
 	reg clock;
 	reg wb_rst_i;
 	reg power1, power2;
@@ -145,12 +148,13 @@
 	`ifdef WFDUMP
 	   initial begin
 	   	$dumpfile("simx.vcd");
-	   	$dumpvars(3, arduino_i2c_scaner_tb);
-	   	$dumpvars(0, arduino_i2c_scaner_tb.u_top.u_riscv_top.i_core_top_0);
-	   	$dumpvars(0, arduino_i2c_scaner_tb.u_top.u_riscv_top.u_connect);
-	   	$dumpvars(0, arduino_i2c_scaner_tb.u_top.u_riscv_top.u_intf);
-	   	$dumpvars(0, arduino_i2c_scaner_tb.u_top.u_uart_i2c_usb_spi.u_uart0_core);
-	   	$dumpvars(0, arduino_i2c_scaner_tb.u_top.u_uart_i2c_usb_spi.u_i2cm);
+	   	$dumpvars(3, `TB_TOP);
+	   	$dumpvars(0, `TB_TOP.u_top.u_riscv_top.i_core_top_0);
+	   	$dumpvars(0, `TB_TOP.u_top.u_riscv_top.u_connect);
+	   	$dumpvars(0, `TB_TOP.u_top.u_riscv_top.u_intf);
+	   	$dumpvars(0, `TB_TOP.u_top.u_uart_i2c_usb_spi.u_uart0_core);
+	   	$dumpvars(0, `TB_TOP.u_top.u_uart_i2c_usb_spi.u_i2cm);
+	   	$dumpvars(0, `TB_TOP.u_top.u_pinmux);
 	   end
        `endif
 
@@ -208,16 +212,16 @@
         // Remove all the reset
         if(d_risc_id == 0) begin
              $display("STATUS: Working with Risc core 0");
-             wb_user_core_write(`ADDR_SPACE_PINMUX+`PINMUX_GBL_CFG0,'h11F);
+             wb_user_core_write(`ADDR_SPACE_GLBL+`GLBL_CFG_CFG0,'h11F);
         end else if(d_risc_id == 1) begin
              $display("STATUS: Working with Risc core 1");
-             wb_user_core_write(`ADDR_SPACE_PINMUX+`PINMUX_GBL_CFG0,'h21F);
+             wb_user_core_write(`ADDR_SPACE_GLBL+`GLBL_CFG_CFG0,'h21F);
         end else if(d_risc_id == 2) begin
              $display("STATUS: Working with Risc core 2");
-             wb_user_core_write(`ADDR_SPACE_PINMUX+`PINMUX_GBL_CFG0,'h41F);
+             wb_user_core_write(`ADDR_SPACE_GLBL+`GLBL_CFG_CFG0,'h41F);
         end else if(d_risc_id == 3) begin
              $display("STATUS: Working with Risc core 3");
-             wb_user_core_write(`ADDR_SPACE_PINMUX+`PINMUX_GBL_CFG0,'h81F);
+             wb_user_core_write(`ADDR_SPACE_GLBL+`GLBL_CFG_CFG0,'h81F);
         end
 
         repeat (100) @(posedge clock);  // wait for Processor Get Ready
@@ -227,6 +231,12 @@
         tb_uart.control_setup (uart_data_bit, uart_stop_bits, uart_parity_en, uart_even_odd_parity, 
                                        uart_stick_parity, uart_timeout, uart_divisor);
 
+         u_i2c_slave_0.debug = 0; // disable i2c bfm debug message
+         u_i2c_slave_1.debug = 0; // disable i2c bfm debug message
+         u_i2c_slave_2.debug = 0; // disable i2c bfm debug message
+         u_i2c_slave_3.debug = 0; // disable i2c bfm debug message
+         u_i2c_slave_4.debug = 0; // disable i2c bfm debug message
+
         repeat (45000) @(posedge clock);  // wait for Processor Get Ready
 	    flag  = 0;
 		check_sum = 0;
@@ -244,7 +254,7 @@
               end
            end
            begin
-              repeat (200000) @(posedge clock);  // wait for Processor Get Ready
+              repeat (800000) @(posedge clock);  // wait for Processor Get Ready
            end
            join_any
         
@@ -255,25 +265,24 @@
 
 		   $display("Total Rx Char: %d Check Sum : %x ",uart_rx_nu, check_sum);
            // Check 
-           // if all the 102 byte received
+           // if all the byte received
            // if no error 
-           if(uart_rx_nu != 102) test_fail = 1;
-           if(check_sum != 32'h1fab) test_fail = 1;
-           if(tb_uart.err_cnt != 0) test_fail = 1;
+           if(uart_rx_nu != 1181) test_fail = 1;
+           if(check_sum != 32'h000170c9) test_fail = 1;
 
 	   
 	    	$display("###################################################");
           	if(test_fail == 0) begin
 		   `ifdef GL
-	    	       $display("Monitor: Standalone String (GL) Passed");
+	    	       $display("Monitor: Standalone i2c scanner (GL) Passed");
 		   `else
-		       $display("Monitor: Standalone String (RTL) Passed");
+		       $display("Monitor: Standalone i2c scanner (RTL) Passed");
 		   `endif
 	        end else begin
 		    `ifdef GL
-	    	        $display("Monitor: Standalone String (GL) Failed");
+	    	        $display("Monitor: Standalone i2c scanner (GL) Failed");
 		    `else
-		        $display("Monitor: Standalone String (RTL) Failed");
+		        $display("Monitor: Standalone i2c scanner (RTL) Failed");
 		    `endif
 		 end
 	    	$display("###################################################");
@@ -322,22 +331,45 @@
     .user_irq       () 
 
 );
+// SSPI Slave I/F
+assign io_in[0]  = 1'b1; // RESET
+assign io_in[16] = 1'b0 ; // SPIS SCK 
 
 //---------------------------
 // I2C
 // --------------------------
 tri scl,sda;
 
-assign sda  =  (io_oeb[22] == 1'b0) ? io_out[22] : 1'bz;
-assign scl   = (io_oeb[23] == 1'b0) ? io_out[23]: 1'bz;
-assign io_in[22]  =  sda;
-assign io_in[23]  =  scl;
+assign sda  =  (io_oeb[26] == 1'b0) ? io_out[26] : 1'bz;
+assign scl   = (io_oeb[27] == 1'b0) ? io_out[27]: 1'bz;
+assign io_in[26]  =  sda;
+assign io_in[27]  =  scl;
 
 pullup p1(scl); // pullup scl line
 pullup p2(sda); // pullup sda line
 
  
-i2c_slave_model  #(.I2C_ADR(7'h4)) u_i2c_slave (
+i2c_slave_model  #(.I2C_ADR(7'h4)) u_i2c_slave_0 (
+	.scl   (scl), 
+	.sda   (sda)
+       );
+
+i2c_slave_model  #(.I2C_ADR(7'h8)) u_i2c_slave_1 (
+	.scl   (scl), 
+	.sda   (sda)
+       );
+
+i2c_slave_model  #(.I2C_ADR(7'h10)) u_i2c_slave_2 (
+	.scl   (scl), 
+	.sda   (sda)
+       );
+
+i2c_slave_model  #(.I2C_ADR(7'h11)) u_i2c_slave_3 (
+	.scl   (scl), 
+	.sda   (sda)
+       );
+
+i2c_slave_model  #(.I2C_ADR(7'h13)) u_i2c_slave_4 (
 	.scl   (scl), 
 	.sda   (sda)
        );
@@ -354,26 +386,26 @@
 //  user core using the gpio pads
 //  ----------------------------------------------------
 
-   wire flash_clk = io_out[24];
-   wire flash_csb = io_out[25];
+   wire flash_clk = io_out[28];
+   wire flash_csb = io_out[29];
    // Creating Pad Delay
-   wire #1 io_oeb_29 = io_oeb[29];
-   wire #1 io_oeb_30 = io_oeb[30];
-   wire #1 io_oeb_31 = io_oeb[31];
-   wire #1 io_oeb_32 = io_oeb[32];
-   tri  #1 flash_io0 = (io_oeb_29== 1'b0) ? io_out[29] : 1'bz;
-   tri  #1 flash_io1 = (io_oeb_30== 1'b0) ? io_out[30] : 1'bz;
-   tri  #1 flash_io2 = (io_oeb_31== 1'b0) ? io_out[31] : 1'bz;
-   tri  #1 flash_io3 = (io_oeb_32== 1'b0) ? io_out[32] : 1'bz;
+   wire #1 io_oeb_29 = io_oeb[33];
+   wire #1 io_oeb_30 = io_oeb[34];
+   wire #1 io_oeb_31 = io_oeb[35];
+   wire #1 io_oeb_32 = io_oeb[36];
+   tri  #1 flash_io0 = (io_oeb_29== 1'b0) ? io_out[33] : 1'bz;
+   tri  #1 flash_io1 = (io_oeb_30== 1'b0) ? io_out[34] : 1'bz;
+   tri  #1 flash_io2 = (io_oeb_31== 1'b0) ? io_out[35] : 1'bz;
+   tri  #1 flash_io3 = (io_oeb_32== 1'b0) ? io_out[36] : 1'bz;
 
-   assign io_in[29] = flash_io0;
-   assign io_in[30] = flash_io1;
-   assign io_in[31] = flash_io2;
-   assign io_in[32] = flash_io3;
+   assign io_in[33] = flash_io0;
+   assign io_in[34] = flash_io1;
+   assign io_in[35] = flash_io2;
+   assign io_in[36] = flash_io3;
 
    // Quard flash
-     s25fl256s #(.mem_file_name("arduino_i2c_scaner.ino.hex"),
-	             .otp_file_name("none"),
+     s25fl256s #(.mem_file_name(`TB_HEX),
+	         .otp_file_name("none"),
                  .TimingModel("S25FL512SAGMFI010_F_30pF")) 
 		 u_spi_flash_256mb (
            // Data Inputs/Outputs
@@ -388,14 +420,27 @@
 
        );
 
+   wire spiram_csb = io_out[31];
+
+   is62wvs1288 #(.mem_file_name("none"))
+	u_sram (
+         // Data Inputs/Outputs
+           .io0     (flash_io0),
+           .io1     (flash_io1),
+           // Controls
+           .clk    (flash_clk),
+           .csb    (spiram_csb),
+           .io2    (flash_io2),
+           .io3    (flash_io3)
+    );
 
 //---------------------------
 //  UART Agent integration
 // --------------------------
 wire uart_txd,uart_rxd;
 
-assign uart_txd   = io_out[2];
-assign io_in[1]  = uart_rxd ;
+assign uart_txd   = io_out[7];
+assign io_in[6]  = uart_rxd ;
  
 uart_agent tb_uart(
 	.mclk                (clock              ),
diff --git a/verilog/dv/arduino_i2c_wr_rd/Makefile b/verilog/dv/arduino_i2c_wr_rd/Makefile
new file mode 100644
index 0000000..b868513
--- /dev/null
+++ b/verilog/dv/arduino_i2c_wr_rd/Makefile
@@ -0,0 +1,141 @@
+# SPDX-FileCopyrightText: 2020 Efabless Corporation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#      http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+# SPDX-License-Identifier: Apache-2.0
+
+
+# ---- Include Partitioned Makefiles ----
+
+CONFIG = caravel_user_project
+ 
+#######################################################################
+## Caravel Verilog for Integration Tests
+#######################################################################
+
+DESIGNS?=../../..
+TOOLS?=/opt/riscv32i/
+
+export USER_PROJECT_VERILOG ?=  $(DESIGNS)/verilog
+export RISCDUINO_BOARD ?=  $(USER_PROJECT_VERILOG)/dv/common/riscduino_board/custom_board/riscduino
+## YIFIVE FIRMWARE
+YIFIVE_FIRMWARE_PATH = $(USER_PROJECT_VERILOG)/dv/firmware
+GCC_PREFIX?=riscv32-unknown-elf
+
+
+## Simulation mode: RTL/GL
+SIM?=RTL
+DUMP?=OFF
+RISC_CORE?=0
+
+### To Enable IVERILOG FST DUMP
+export IVERILOG_DUMPER = fst
+
+
+.SUFFIXES:
+
+PATTERN = arduino_i2c_wr_rd
+
+all:  ${PATTERN:=.vcd}
+
+
+vvp:  ${PATTERN:=.vvp}
+
+%.vvp: %_tb.v
+	${GCC_PREFIX}-g++ -c -O2 -march=rv32imac -fpeel-loops -ffreestanding -ffunction-sections -fdata-sections -fpermissive -Wall -fno-rtti -fno-exceptions -I${RISCDUINO_BOARD}/system/include -I${RISCDUINO_BOARD}/sdk/bsp/include -I${RISCDUINO_BOARD}/sdk/bsp/env -I${RISCDUINO_BOARD}/sdk/bsp/drivers -I${RISCDUINO_BOARD}/sdk/bsp/env/riscduino_score -include sys/cdefs.h -g -DARDUINO=10607 -DF_CPU=50000000LL -DRISCDUINO_SCORE_DEVKIT -I${RISCDUINO_BOARD}/cores/arduino -I${RISCDUINO_BOARD}/variants/standard -I${RISCDUINO_BOARD}/libraries/Wire/src ${PATTERN}.ino.cpp -o ${PATTERN}.ino.cpp.o
+	${GCC_PREFIX}-g++ -c -O2 -march=rv32imac -fpeel-loops -ffreestanding -ffunction-sections -fdata-sections -fpermissive -Wall -fno-rtti -fno-exceptions -I${RISCDUINO_BOARD}/system/include -I${RISCDUINO_BOARD}/sdk/bsp/include -I${RISCDUINO_BOARD}/sdk/bsp/env -I${RISCDUINO_BOARD}/sdk/bsp/drivers -I${RISCDUINO_BOARD}/sdk/bsp/env/riscduino_score -include sys/cdefs.h -g -DARDUINO=10607 -DF_CPU=50000000LL -DRISCDUINO_SCORE_DEVKIT -I${RISCDUINO_BOARD}/cores/arduino -I${RISCDUINO_BOARD}/variants/standard -I${RISCDUINO_BOARD}/libraries/Wire/src -I${RISCDUINO_BOARD}/libraries/Wire/src/utility ${RISCDUINO_BOARD}/libraries/Wire/src/Wire.cpp -o Wire.cpp.o
+	${GCC_PREFIX}-g++ -c -O2 -march=rv32imac -fpeel-loops -ffreestanding -ffunction-sections -fdata-sections -fpermissive -Wall -fno-rtti -fno-exceptions -I${RISCDUINO_BOARD}/system/include -I${RISCDUINO_BOARD}/sdk/bsp/include -I${RISCDUINO_BOARD}/sdk/bsp/env -I${RISCDUINO_BOARD}/sdk/bsp/drivers -I${RISCDUINO_BOARD}/sdk/bsp/env/riscduino_score -include sys/cdefs.h -g -DARDUINO=10607 -DF_CPU=50000000LL -DRISCDUINO_SCORE_DEVKIT -I${RISCDUINO_BOARD}/cores/arduino -I${RISCDUINO_BOARD}/variants/standard ${RISCDUINO_BOARD}/cores/arduino/Print.cpp -o Print.cpp.o
+	${GCC_PREFIX}-g++ -c -O2 -march=rv32imac -fpeel-loops -ffreestanding -ffunction-sections -fdata-sections -fpermissive -Wall -fno-rtti -fno-exceptions -I${RISCDUINO_BOARD}/system/include -I${RISCDUINO_BOARD}/sdk/bsp/include -I${RISCDUINO_BOARD}/sdk/bsp/env -I${RISCDUINO_BOARD}/sdk/bsp/drivers -I${RISCDUINO_BOARD}/sdk/bsp/env/riscduino_score -include sys/cdefs.h -g -DARDUINO=10607 -DF_CPU=50000000LL -DRISCDUINO_SCORE_DEVKIT -I${RISCDUINO_BOARD}/cores/arduino -I${RISCDUINO_BOARD}/variants/standard ${RISCDUINO_BOARD}/cores/arduino/WMath.cpp -o WMath.cpp.o
+	${GCC_PREFIX}-g++ -c -O2 -march=rv32imac -fpeel-loops -ffreestanding -ffunction-sections -fdata-sections -fpermissive -Wall -fno-rtti -fno-exceptions -I${RISCDUINO_BOARD}/system/include -I${RISCDUINO_BOARD}/sdk/bsp/include -I${RISCDUINO_BOARD}/sdk/bsp/env -I${RISCDUINO_BOARD}/sdk/bsp/drivers -I${RISCDUINO_BOARD}/sdk/bsp/env/riscduino_score -include sys/cdefs.h -g -DARDUINO=10607 -DF_CPU=50000000LL -DRISCDUINO_SCORE_DEVKIT -I${RISCDUINO_BOARD}/cores/arduino -I${RISCDUINO_BOARD}/variants/standard ${RISCDUINO_BOARD}/cores/arduino/WString.cpp -o WString.cpp.o
+	${GCC_PREFIX}-gcc -c -O2 -march=rv32imac -fpeel-loops -ffreestanding -ffunction-sections -fdata-sections -Wall -I${RISCDUINO_BOARD}/system/include -I${RISCDUINO_BOARD}/sdk/bsp/include -I${RISCDUINO_BOARD}/sdk/bsp/env -I${RISCDUINO_BOARD}/sdk/bsp/drivers -I${RISCDUINO_BOARD}/sdk/bsp/env/riscduino_score -include sys/cdefs.h -g -DARDUINO=10607 -DF_CPU=50000000LL -DRISCDUINO_SCORE_DEVKIT -I${RISCDUINO_BOARD}/cores/arduino -I${RISCDUINO_BOARD}/variants/standard ${RISCDUINO_BOARD}/cores/arduino/WInterrupts.c -o WInterrupts.c.o
+	${GCC_PREFIX}-gcc -c -O2 -march=rv32imac -fpeel-loops -ffreestanding -ffunction-sections -fdata-sections -Wall -I${RISCDUINO_BOARD}/system/include -I${RISCDUINO_BOARD}/sdk/bsp/include -I${RISCDUINO_BOARD}/sdk/bsp/env -I${RISCDUINO_BOARD}/sdk/bsp/drivers -I${RISCDUINO_BOARD}/sdk/bsp/env/riscduino_score -include sys/cdefs.h -g -DARDUINO=10607 -DF_CPU=50000000LL -DRISCDUINO_SCORE_DEVKIT -I${RISCDUINO_BOARD}/cores/arduino -I${RISCDUINO_BOARD}/variants/standard ${RISCDUINO_BOARD}/cores/arduino/drivers/fe300prci/fe300prci_driver.c -o fe300prci_driver.c.o
+	${GCC_PREFIX}-g++ -c -O2 -march=rv32imac -fpeel-loops -ffreestanding -ffunction-sections -fdata-sections -fpermissive -Wall -fno-rtti -fno-exceptions -I${RISCDUINO_BOARD}/system/include -I${RISCDUINO_BOARD}/sdk/bsp/include -I${RISCDUINO_BOARD}/sdk/bsp/env -I${RISCDUINO_BOARD}/sdk/bsp/drivers -I${RISCDUINO_BOARD}/sdk/bsp/env/riscduino_score -include sys/cdefs.h -g -DARDUINO=10607 -DF_CPU=50000000LL -DRISCDUINO_SCORE_DEVKIT -I${RISCDUINO_BOARD}/cores/arduino -I${RISCDUINO_BOARD}/variants/standard ${RISCDUINO_BOARD}/cores/arduino/abi.cpp -o abi.cpp.o
+	${GCC_PREFIX}-gcc -c -O2 -march=rv32imac -fpeel-loops -ffreestanding -ffunction-sections -fdata-sections -Wall -I${RISCDUINO_BOARD}/system/include -I${RISCDUINO_BOARD}/sdk/bsp/include -I${RISCDUINO_BOARD}/sdk/bsp/env -I${RISCDUINO_BOARD}/sdk/bsp/drivers -I${RISCDUINO_BOARD}/sdk/bsp/env/riscduino_score -include sys/cdefs.h -g -DARDUINO=10607 -DF_CPU=50000000LL -DRISCDUINO_SCORE_DEVKIT -I${RISCDUINO_BOARD}/cores/arduino -I${RISCDUINO_BOARD}/variants/standard ${RISCDUINO_BOARD}/cores/arduino/drivers/plic/plic_driver.c -o plic_driver.c.o
+	${GCC_PREFIX}-g++ -c -O2 -march=rv32imac -fpeel-loops -ffreestanding -ffunction-sections -fdata-sections -fpermissive -Wall -fno-rtti -fno-exceptions -I${RISCDUINO_BOARD}/system/include -I${RISCDUINO_BOARD}/sdk/bsp/include -I${RISCDUINO_BOARD}/sdk/bsp/env -I${RISCDUINO_BOARD}/sdk/bsp/drivers -I${RISCDUINO_BOARD}/sdk/bsp/env/riscduino_score -include sys/cdefs.h -g -DARDUINO=10607 -DF_CPU=50000000LL -DRISCDUINO_SCORE_DEVKIT -I${RISCDUINO_BOARD}/cores/arduino -I${RISCDUINO_BOARD}/variants/standard ${RISCDUINO_BOARD}/cores/arduino/UARTClass.cpp -o UARTClass.cpp.o
+	${GCC_PREFIX}-gcc -c -march=rv32imac -I${RISCDUINO_BOARD}/system/include -I${RISCDUINO_BOARD}/sdk/bsp/include -I${RISCDUINO_BOARD}/sdk/bsp/env -I${RISCDUINO_BOARD}/sdk/bsp/drivers -I${RISCDUINO_BOARD}/sdk/bsp/env/riscduino_score -g -DARDUINO=10607 -DF_CPU=50000000LL -DRISCDUINO_SCORE_DEVKIT -I${RISCDUINO_BOARD}/cores/arduino -I${RISCDUINO_BOARD}/variants/standard ${RISCDUINO_BOARD}/cores/arduino/entry.S -o entry.S.o
+	${GCC_PREFIX}-gcc -c -O2 -march=rv32imac -fpeel-loops -ffreestanding -ffunction-sections -fdata-sections -Wall -I${RISCDUINO_BOARD}/system/include -I${RISCDUINO_BOARD}/sdk/bsp/include -I${RISCDUINO_BOARD}/sdk/bsp/env -I${RISCDUINO_BOARD}/sdk/bsp/drivers -I${RISCDUINO_BOARD}/sdk/bsp/env/riscduino_score -include sys/cdefs.h -g -DARDUINO=10607 -DF_CPU=50000000LL -DRISCDUINO_SCORE_DEVKIT -I${RISCDUINO_BOARD}/cores/arduino -I${RISCDUINO_BOARD}/variants/standard ${RISCDUINO_BOARD}/cores/arduino/hooks.c -o hooks.c.o
+	${GCC_PREFIX}-gcc -c -march=rv32imac -I${RISCDUINO_BOARD}/system/include -I${RISCDUINO_BOARD}/sdk/bsp/include -I${RISCDUINO_BOARD}/sdk/bsp/env -I${RISCDUINO_BOARD}/sdk/bsp/drivers -I${RISCDUINO_BOARD}/sdk/bsp/env/riscduino_score -g -DARDUINO=10607 -DF_CPU=50000000LL -DRISCDUINO_SCORE_DEVKIT -I${RISCDUINO_BOARD}/cores/arduino -I${RISCDUINO_BOARD}/variants/standard ${RISCDUINO_BOARD}/cores/arduino/init.S -o init.S.o
+	${GCC_PREFIX}-gcc -c -O2 -march=rv32imac -fpeel-loops -ffreestanding -ffunction-sections -fdata-sections -Wall -I${RISCDUINO_BOARD}/system/include -I${RISCDUINO_BOARD}/sdk/bsp/include -I${RISCDUINO_BOARD}/sdk/bsp/env -I${RISCDUINO_BOARD}/sdk/bsp/drivers -I${RISCDUINO_BOARD}/sdk/bsp/env/riscduino_score -include sys/cdefs.h -g -DARDUINO=10607 -DF_CPU=50000000LL -DRISCDUINO_SCORE_DEVKIT -I${RISCDUINO_BOARD}/cores/arduino -I${RISCDUINO_BOARD}/variants/standard ${RISCDUINO_BOARD}/cores/arduino/itoa.c -o itoa.c.o
+	${GCC_PREFIX}-g++ -c -O2 -march=rv32imac -fpeel-loops -ffreestanding -ffunction-sections -fdata-sections -fpermissive -Wall -fno-rtti -fno-exceptions -I${RISCDUINO_BOARD}/system/include -I${RISCDUINO_BOARD}/sdk/bsp/include -I${RISCDUINO_BOARD}/sdk/bsp/env -I${RISCDUINO_BOARD}/sdk/bsp/drivers -I${RISCDUINO_BOARD}/sdk/bsp/env/riscduino_score -include sys/cdefs.h -g -DARDUINO=10607 -DF_CPU=50000000LL -DRISCDUINO_SCORE_DEVKIT -I${RISCDUINO_BOARD}/cores/arduino -I${RISCDUINO_BOARD}/variants/standard ${RISCDUINO_BOARD}/cores/arduino/main.cpp -o main.cpp.o
+	${GCC_PREFIX}-gcc -c -O2 -march=rv32imac -fpeel-loops -ffreestanding -ffunction-sections -fdata-sections -Wall -I${RISCDUINO_BOARD}/system/include -I${RISCDUINO_BOARD}/sdk/bsp/include -I${RISCDUINO_BOARD}/sdk/bsp/env -I${RISCDUINO_BOARD}/sdk/bsp/drivers -I${RISCDUINO_BOARD}/sdk/bsp/env/riscduino_score -include sys/cdefs.h -g -DARDUINO=10607 -DF_CPU=50000000LL -DRISCDUINO_SCORE_DEVKIT -I${RISCDUINO_BOARD}/cores/arduino -I${RISCDUINO_BOARD}/variants/standard ${RISCDUINO_BOARD}/cores/arduino/malloc.c -o malloc.c.o
+	${GCC_PREFIX}-g++ -c -O2 -march=rv32imac -fpeel-loops -ffreestanding -ffunction-sections -fdata-sections -fpermissive -Wall -fno-rtti -fno-exceptions -I${RISCDUINO_BOARD}/system/include -I${RISCDUINO_BOARD}/sdk/bsp/include -I${RISCDUINO_BOARD}/sdk/bsp/env -I${RISCDUINO_BOARD}/sdk/bsp/drivers -I${RISCDUINO_BOARD}/sdk/bsp/env/riscduino_score -include sys/cdefs.h -g -DARDUINO=10607 -DF_CPU=50000000LL -DRISCDUINO_SCORE_DEVKIT -I${RISCDUINO_BOARD}/cores/arduino -I${RISCDUINO_BOARD}/variants/standard ${RISCDUINO_BOARD}/cores/arduino/new.cpp -o new.cpp.o
+	${GCC_PREFIX}-gcc -c -O2 -march=rv32imac -fpeel-loops -ffreestanding -ffunction-sections -fdata-sections -Wall -I${RISCDUINO_BOARD}/system/include -I${RISCDUINO_BOARD}/sdk/bsp/include -I${RISCDUINO_BOARD}/sdk/bsp/env -I${RISCDUINO_BOARD}/sdk/bsp/drivers -I${RISCDUINO_BOARD}/sdk/bsp/env/riscduino_score -include sys/cdefs.h -g -DARDUINO=10607 -DF_CPU=50000000LL -DRISCDUINO_SCORE_DEVKIT -I${RISCDUINO_BOARD}/cores/arduino -I${RISCDUINO_BOARD}/variants/standard ${RISCDUINO_BOARD}/cores/arduino/sbrk.c -o sbrk.c.o
+	${GCC_PREFIX}-gcc -c -march=rv32imac -I${RISCDUINO_BOARD}/system/include -I${RISCDUINO_BOARD}/sdk/bsp/include -I${RISCDUINO_BOARD}/sdk/bsp/env -I${RISCDUINO_BOARD}/sdk/bsp/drivers -I${RISCDUINO_BOARD}/sdk/bsp/env/riscduino_score -g -DARDUINO=10607 -DF_CPU=50000000LL -DRISCDUINO_SCORE_DEVKIT -I${RISCDUINO_BOARD}/cores/arduino -I${RISCDUINO_BOARD}/variants/standard ${RISCDUINO_BOARD}/cores/arduino/start.S -o start.S.o
+	${GCC_PREFIX}-gcc -c -O2 -march=rv32imac -fpeel-loops -ffreestanding -ffunction-sections -fdata-sections -Wall -I${RISCDUINO_BOARD}/system/include -I${RISCDUINO_BOARD}/sdk/bsp/include -I${RISCDUINO_BOARD}/sdk/bsp/env -I${RISCDUINO_BOARD}/sdk/bsp/drivers -I${RISCDUINO_BOARD}/sdk/bsp/env/riscduino_score -include sys/cdefs.h -g -DARDUINO=10607 -DF_CPU=50000000LL -DRISCDUINO_SCORE_DEVKIT -I${RISCDUINO_BOARD}/cores/arduino -I${RISCDUINO_BOARD}/variants/standard ${RISCDUINO_BOARD}/cores/arduino/wiring.c -o wiring.c.o
+	${GCC_PREFIX}-gcc -c -O2 -march=rv32imac -fpeel-loops -ffreestanding -ffunction-sections -fdata-sections -Wall -I${RISCDUINO_BOARD}/system/include -I${RISCDUINO_BOARD}/sdk/bsp/include -I${RISCDUINO_BOARD}/sdk/bsp/env -I${RISCDUINO_BOARD}/sdk/bsp/drivers -I${RISCDUINO_BOARD}/sdk/bsp/env/riscduino_score -include sys/cdefs.h -g -DARDUINO=10607 -DF_CPU=50000000LL -DRISCDUINO_SCORE_DEVKIT -I${RISCDUINO_BOARD}/cores/arduino -I${RISCDUINO_BOARD}/variants/standard ${RISCDUINO_BOARD}/cores/arduino/wiring_analog.c -o wiring_analog.c.o
+	${GCC_PREFIX}-gcc -c -O2 -march=rv32imac -fpeel-loops -ffreestanding -ffunction-sections -fdata-sections -Wall -I${RISCDUINO_BOARD}/system/include -I${RISCDUINO_BOARD}/sdk/bsp/include -I${RISCDUINO_BOARD}/sdk/bsp/env -I${RISCDUINO_BOARD}/sdk/bsp/drivers -I${RISCDUINO_BOARD}/sdk/bsp/env/riscduino_score -include sys/cdefs.h -g -DARDUINO=10607 -DF_CPU=50000000LL -DRISCDUINO_SCORE_DEVKIT -I${RISCDUINO_BOARD}/cores/arduino -I${RISCDUINO_BOARD}/variants/standard ${RISCDUINO_BOARD}/cores/arduino/wiring_digital.c -o wiring_digital.c.o
+	${GCC_PREFIX}-g++ -c -O2 -march=rv32imac -fpeel-loops -ffreestanding -ffunction-sections -fdata-sections -fpermissive -Wall -fno-rtti -fno-exceptions -I${RISCDUINO_BOARD}/system/include -I${RISCDUINO_BOARD}/sdk/bsp/include -I${RISCDUINO_BOARD}/sdk/bsp/env -I${RISCDUINO_BOARD}/sdk/bsp/drivers -I${RISCDUINO_BOARD}/sdk/bsp/env/riscduino_score -include sys/cdefs.h -g -DARDUINO=10607 -DF_CPU=50000000LL -DRISCDUINO_SCORE_DEVKIT -I${RISCDUINO_BOARD}/cores/arduino -I${RISCDUINO_BOARD}/variants/standard ${RISCDUINO_BOARD}/cores/arduino/wiring_pulse.cpp -o wiring_pulse.cpp.o
+	${GCC_PREFIX}-gcc -c -O2 -march=rv32imac -fpeel-loops -ffreestanding -ffunction-sections -fdata-sections -Wall -I${RISCDUINO_BOARD}/system/include -I${RISCDUINO_BOARD}/sdk/bsp/include -I${RISCDUINO_BOARD}/sdk/bsp/env -I${RISCDUINO_BOARD}/sdk/bsp/drivers -I${RISCDUINO_BOARD}/sdk/bsp/env/riscduino_score -include sys/cdefs.h -g -DARDUINO=10607 -DF_CPU=50000000LL -DRISCDUINO_SCORE_DEVKIT -I${RISCDUINO_BOARD}/cores/arduino -I${RISCDUINO_BOARD}/variants/standard ${RISCDUINO_BOARD}/cores/arduino/wiring_shift.c -o wiring_shift.c.o
+	${GCC_PREFIX}-ar rcs core.a Print.cpp.o
+	${GCC_PREFIX}-ar rcs core.a UARTClass.cpp.o
+	${GCC_PREFIX}-ar rcs core.a WInterrupts.c.o
+	${GCC_PREFIX}-ar rcs core.a WMath.cpp.o
+	${GCC_PREFIX}-ar rcs core.a WString.cpp.o
+	${GCC_PREFIX}-ar rcs core.a abi.cpp.o
+	${GCC_PREFIX}-ar rcs core.a fe300prci_driver.c.o
+	${GCC_PREFIX}-ar rcs core.a plic_driver.c.o
+	${GCC_PREFIX}-ar rcs core.a entry.S.o
+	${GCC_PREFIX}-ar rcs core.a hooks.c.o
+	${GCC_PREFIX}-ar rcs core.a init.S.o
+	${GCC_PREFIX}-ar rcs core.a itoa.c.o
+	${GCC_PREFIX}-ar rcs core.a main.cpp.o
+	${GCC_PREFIX}-ar rcs core.a malloc.c.o
+	${GCC_PREFIX}-ar rcs core.a new.cpp.o
+	${GCC_PREFIX}-ar rcs core.a sbrk.c.o
+	${GCC_PREFIX}-ar rcs core.a start.S.o
+	${GCC_PREFIX}-ar rcs core.a wiring.c.o
+	${GCC_PREFIX}-ar rcs core.a wiring_analog.c.o
+	${GCC_PREFIX}-ar rcs core.a wiring_digital.c.o
+	${GCC_PREFIX}-ar rcs core.a wiring_pulse.cpp.o
+	${GCC_PREFIX}-ar rcs core.a wiring_shift.c.o
+	${GCC_PREFIX}-g++ -T ${RISCDUINO_BOARD}/sdk/bsp/env/riscduino_score/link.lds -nostartfiles -Wl,-N -Wl,--gc-sections -Wl,--wrap=malloc -Wl,--wrap=free -Wl,--wrap=sbrk ${PATTERN}.ino.cpp.o  Wire.cpp.o -nostdlib -Wl,--start-group core.a -lm -lstdc++ -lc -lgloss -Wl,--end-group -lgcc -o ${PATTERN}.elf
+	${GCC_PREFIX}-objcopy -R .rel.dyn -O binary ${PATTERN}.elf ${PATTERN}.bin
+	${GCC_PREFIX}-objcopy -R .rel.dyn -O verilog ${PATTERN}.elf ${PATTERN}.hex
+	${GCC_PREFIX}-objdump -D  ${PATTERN}.elf >   ${PATTERN}.dump
+	rm *.o *.a
+ifeq ($(SIM),RTL)
+   ifeq ($(DUMP),OFF)
+	iverilog -g2012 -DFUNCTIONAL -DSIM -I $(PDK_PATH) \
+	-f$(USER_PROJECT_VERILOG)/includes/includes.rtl.$(CONFIG) \
+	-f$(USER_PROJECT_VERILOG)/includes/includes.rtl.lib  \
+	$< -o $@ 
+    else  
+	iverilog -g2012 -DWFDUMP -DFUNCTIONAL -DSIM -I $(PDK_PATH) \
+	-f$(USER_PROJECT_VERILOG)/includes/includes.rtl.$(CONFIG) \
+	-f$(USER_PROJECT_VERILOG)/includes/includes.rtl.lib  \
+	$< -o $@ 
+   endif
+else  
+   ifeq ($(DUMP),OFF)
+	iverilog -g2012 -DFUNCTIONAL -DUSE_POWER_PINS -DGL -I $(PDK_PATH) \
+	-f$(USER_PROJECT_VERILOG)/includes/includes.gl.$(CONFIG) \
+	-f$(USER_PROJECT_VERILOG)/includes/includes.gl.lib \
+	$< -o $@ 
+    else  
+	iverilog -g2012 -DWFDUMP -DFUNCTIONAL -DUSE_POWER_PINS -DGL -I $(PDK_PATH) \
+	-f$(USER_PROJECT_VERILOG)/includes/includes.gl.$(CONFIG) \
+	-f$(USER_PROJECT_VERILOG)/includes/includes.gl.lib \
+	$< -o $@ 
+   endif
+endif
+
+%.vcd: %.vvp
+	vvp $< +risc_core_id=$(RISC_CORE)
+
+
+# ---- Clean ----
+
+clean:
+	rm -f *.elf *.hex *.bin *.vvp *.vcd *.log *.dump *.a *.o
+
+.PHONY: clean hex all
diff --git a/verilog/dv/arduino_i2c_wr_rd/arduino_i2c_wr_rd.ino b/verilog/dv/arduino_i2c_wr_rd/arduino_i2c_wr_rd.ino
new file mode 100644
index 0000000..158e3f1
--- /dev/null
+++ b/verilog/dv/arduino_i2c_wr_rd/arduino_i2c_wr_rd.ino
@@ -0,0 +1,50 @@
+// --------------------------------------
+// I2C Write and Reading to Memory
+//  https://microchipdeveloper.com/i2c:sequential-read
+// --------------------------------------
+
+#include <Wire.h>
+
+void setup() {
+  Wire.begin();
+
+  Serial.begin(9600);
+  while (!Serial); // Leonardo: wait for Serial Monitor
+  Serial.println("\nI2C Write Read");
+}
+
+void loop() {
+
+  // step 1: instruct sensor to read echoes
+  Wire.beginTransmission(0x4); // transmit to device #4 (0x0x4)
+  Wire.write(byte(0x02));      // sets memory  pointer (0x02)  
+  Wire.write(byte(0x11));      // Write Location-0: 0x11
+  Wire.write(byte(0x22));      // Write Location-0: 0x22
+  Wire.write(byte(0x33));      // Write Location-0: 0x33
+  Wire.write(byte(0x44));      // Write Location-0: 0x44
+  Wire.write(byte(0x55));      // Write Location-0: 0x55
+  Wire.write(byte(0x66));      // Write Location-0: 0x66
+  Wire.write(byte(0x77));      // Write Location-0: 0x77
+  Wire.write(byte(0x88));      // Write Location-0: 0x88
+  Wire.endTransmission();      // stop transmitting
+
+  // step 2: Reset the the memory pointer
+  Wire.beginTransmission(0x4); // transmit to device #4 (0x4)
+  Wire.write(byte(0x02));      // sets memory pointer (0x02)
+  Wire.endTransmission();      // stop transmitting
+
+  // step 3: request reading from sensor
+  Wire.requestFrom(0x4, 8);    // request 8 bytes from slave device #4
+
+  // step 4: receive reading from sensor
+
+  Serial.println("\nRead Back Data:");
+  while(Wire.available())    // slave may send less than requested
+  { 
+    char c = Wire.read(); // receive a byte as character
+    Serial.println(c,HEX);  // print the character
+  }
+
+
+  delay(5000); // Wait 5 seconds for next scan
+}
diff --git a/verilog/dv/arduino_i2c_wr_rd/arduino_i2c_wr_rd.ino.cpp b/verilog/dv/arduino_i2c_wr_rd/arduino_i2c_wr_rd.ino.cpp
new file mode 100644
index 0000000..92e1de1
--- /dev/null
+++ b/verilog/dv/arduino_i2c_wr_rd/arduino_i2c_wr_rd.ino.cpp
@@ -0,0 +1,94 @@
+// --------------------------------------
+// I2C Write and Reading to Memory
+//  https://microchipdeveloper.com/i2c:sequential-read
+// --------------------------------------
+#include <Arduino.h>
+
+#include <Wire.h>
+
+void setup();
+void loop();
+void setup() {
+  Wire.begin();
+
+  Serial.begin(1152000);
+  while (!Serial); // Leonardo: wait for Serial Monitor
+  Serial.println("\nI2C Write Read");
+}
+
+void loop() {
+
+  //----------------------------- 
+  // Write & Read to Device #4
+  //------------------------------
+  // step 1: instruct sensor to read echoes
+  Wire.beginTransmission(0x4); // transmit to device #4 (0x0x4)
+  Wire.write(byte(0x02));      // sets memory  pointer (0x02)  
+  Wire.write(byte(0x11));      // Write Location-0: 0x11
+  Wire.write(byte(0x22));      // Write Location-0: 0x22
+  Wire.write(byte(0x33));      // Write Location-0: 0x33
+  Wire.write(byte(0x44));      // Write Location-0: 0x44
+  Wire.write(byte(0x55));      // Write Location-0: 0x55
+  Wire.write(byte(0x66));      // Write Location-0: 0x66
+  Wire.write(byte(0x77));      // Write Location-0: 0x77
+  Wire.write(byte(0x88));      // Write Location-0: 0x88
+  Wire.endTransmission();      // stop transmitting
+
+  // step 2: Reset the the memory pointer
+  Wire.beginTransmission(0x4); // transmit to device #4 (0x4)
+  Wire.write(byte(0x02));      // sets memory pointer (0x02)
+  Wire.endTransmission();      // stop transmitting
+
+  // step 3: request reading from sensor
+  Wire.requestFrom(0x4, 8);    // request 8 bytes from slave device #4
+  Wire.available();
+  
+  // step 4: receive reading from sensor
+
+  Serial.println("Read Back Data from Port-0x04:"); 
+  while(Wire.available())    // slave may send less than requested
+  { 
+    uint8_t c = Wire.read(); // receive a byte as character
+    Serial.println(c,HEX);  // print the character
+  }
+  Wire.endTransmission();      // stop transmitting
+
+  //----------------------------- 
+  // Write & Read to Device #4
+  //------------------------------
+  // step 1: instruct sensor to read echoes
+  Wire.beginTransmission(0x10); // transmit to device #10 (0x10)
+  Wire.write(byte(0x20));      // sets memory  pointer (0x20)  
+  Wire.write(byte(0x01));      // Write Location-0: 0x11
+  Wire.write(byte(0x02));      // Write Location-0: 0x22
+  Wire.write(byte(0x03));      // Write Location-0: 0x33
+  Wire.write(byte(0x04));      // Write Location-0: 0x44
+  Wire.write(byte(0x05));      // Write Location-0: 0x55
+  Wire.write(byte(0x06));      // Write Location-0: 0x66
+  Wire.write(byte(0x07));      // Write Location-0: 0x77
+  Wire.write(byte(0x08));      // Write Location-0: 0x88
+  Wire.endTransmission();      // stop transmitting
+
+
+  // step 2: Reset the the memory pointer
+  Wire.beginTransmission(0x10); // transmit to device #10 (0x10)
+  Wire.write(byte(0x20));      // sets memory pointer (0x10)
+  Wire.endTransmission();      // stop transmitting
+
+  // step 3: request reading from sensor
+  Wire.requestFrom(0x10, 8);    // request 8 bytes from slave device #4
+  Wire.available();
+  
+  // step 4: receive reading from sensor
+
+  Serial.println("\nRead Back Data from Port-0x10:"); 
+  while(Wire.available())    // slave may send less than requested
+  { 
+    uint8_t c = Wire.read(); // receive a byte as character
+    Serial.println(c,HEX);  // print the character
+  }
+  Wire.endTransmission();      // stop transmitting
+
+  delay(5000); // Wait 5 seconds for next scan
+}
+
diff --git a/verilog/dv/arduino_i2c_wr_rd/arduino_i2c_wr_rd_tb.v b/verilog/dv/arduino_i2c_wr_rd/arduino_i2c_wr_rd_tb.v
new file mode 100644
index 0000000..ee7124a
--- /dev/null
+++ b/verilog/dv/arduino_i2c_wr_rd/arduino_i2c_wr_rd_tb.v
@@ -0,0 +1,565 @@
+////////////////////////////////////////////////////////////////////////////
+// SPDX-FileCopyrightText:  2021 , Dinesh Annayya
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+// SPDX-License-Identifier: Apache-2.0
+// SPDX-FileContributor: Modified by Dinesh Annayya <dinesha@opencores.org>
+//////////////////////////////////////////////////////////////////////
+////                                                              ////
+////  Standalone User validation Test bench                       ////
+////                                                              ////
+////  This file is part of the riscdunio cores project            ////
+////  https://github.com/dineshannayya/riscdunio.git              ////
+////                                                              ////
+////  Description                                                 ////
+////   This is a standalone test bench to validate the            ////
+////   Digital core.                                              ////
+////   This test bench to valid Arduino example:                  ////
+////     <example><Wire><i2c_scanner>                             ////
+////                                                              ////
+////  To Do:                                                      ////
+////    nothing                                                   ////
+////                                                              ////
+////  Author(s):                                                  ////
+////      - Dinesh Annayya, dinesh.annayya@gmail.com              ////
+////                                                              ////
+////  Revision :                                                  ////
+////    0.1 - 29th July 2022, Dinesh A                            ////
+////                                                              ////
+//////////////////////////////////////////////////////////////////////
+////                                                              ////
+//// Copyright (C) 2000 Authors and OPENCORES.ORG                 ////
+////                                                              ////
+//// This source file may be used and distributed without         ////
+//// restriction provided that this copyright statement is not    ////
+//// removed from the file and that any derivative work contains  ////
+//// the original copyright notice and the associated disclaimer. ////
+////                                                              ////
+//// This source file is free software; you can redistribute it   ////
+//// and/or modify it under the terms of the GNU Lesser General   ////
+//// Public License as published by the Free Software Foundation; ////
+//// either version 2.1 of the License, or (at your option) any   ////
+//// later version.                                               ////
+////                                                              ////
+//// This source is distributed in the hope that it will be       ////
+//// useful, but WITHOUT ANY WARRANTY; without even the implied   ////
+//// warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR      ////
+//// PURPOSE.  See the GNU Lesser General Public License for more ////
+//// details.                                                     ////
+////                                                              ////
+//// You should have received a copy of the GNU Lesser General    ////
+//// Public License along with this source; if not, download it   ////
+//// from http://www.opencores.org/lgpl.shtml                     ////
+////                                                              ////
+//////////////////////////////////////////////////////////////////////
+
+`default_nettype wire
+
+`timescale 1 ns / 1 ns
+
+`include "sram_macros/sky130_sram_2kbyte_1rw1r_32x512_8.v"
+`include "is62wvs1288.v"
+`include "uart_agent.v"
+`include "i2c_slave_model.v"
+
+`define TB_HEX "arduino_i2c_wr_rd.hex"
+`define TB_TOP arduino_i2c_wr_rd_tb
+module `TB_TOP;
+	reg clock;
+	reg wb_rst_i;
+	reg power1, power2;
+	reg power3, power4;
+
+        reg        wbd_ext_cyc_i;  // strobe/request
+        reg        wbd_ext_stb_i;  // strobe/request
+        reg [31:0] wbd_ext_adr_i;  // address
+        reg        wbd_ext_we_i;  // write
+        reg [31:0] wbd_ext_dat_i;  // data output
+        reg [3:0]  wbd_ext_sel_i;  // byte enable
+
+        wire [31:0] wbd_ext_dat_o;  // data input
+        wire        wbd_ext_ack_o;  // acknowlegement
+        wire        wbd_ext_err_o;  // error
+
+	// User I/O
+	wire [37:0] io_oeb;
+	wire [37:0] io_out;
+	wire [37:0] io_in;
+
+	wire gpio;
+	wire [37:0] mprj_io;
+	wire [7:0] mprj_io_0;
+	reg         test_fail;
+	reg [31:0] read_data;
+    //----------------------------------
+    // Uart Configuration
+    // ---------------------------------
+    reg [1:0]      uart_data_bit        ;
+    reg	       uart_stop_bits       ; // 0: 1 stop bit; 1: 2 stop bit;
+    reg	       uart_stick_parity    ; // 1: force even parity
+    reg	       uart_parity_en       ; // parity enable
+    reg	       uart_even_odd_parity ; // 0: odd parity; 1: even parity
+    
+    reg [7:0]      uart_data            ;
+    reg [15:0]     uart_divisor         ;	// divided by n * 16
+    reg [15:0]     uart_timeout         ;// wait time limit
+    
+    reg [15:0]     uart_rx_nu           ;
+    reg [15:0]     uart_tx_nu           ;
+    reg [7:0]      uart_write_data [0:39];
+    reg 	       uart_fifo_enable     ;	// fifo mode disable
+	reg            flag                 ;
+    reg            compare_start        ; // User Need to make sure that compare start match with RiscV core completing initial booting
+
+	reg [31:0]     check_sum            ;
+        
+	integer    d_risc_id;
+
+         integer i,j;
+
+
+
+
+	// 50Mhz CLock
+	always #10 clock <= (clock === 1'b0);
+
+	initial begin
+		clock = 0;
+	    flag  = 0;
+        compare_start = 0;
+        wbd_ext_cyc_i ='h0;  // strobe/request
+        wbd_ext_stb_i ='h0;  // strobe/request
+        wbd_ext_adr_i ='h0;  // address
+        wbd_ext_we_i  ='h0;  // write
+        wbd_ext_dat_i ='h0;  // data output
+        wbd_ext_sel_i ='h0;  // byte enable
+	end
+
+	`ifdef WFDUMP
+	   initial begin
+	   	$dumpfile("simx.vcd");
+	   	$dumpvars(3, `TB_TOP);
+	   	$dumpvars(0, `TB_TOP.u_top.u_riscv_top.i_core_top_0);
+	   	$dumpvars(0, `TB_TOP.u_top.u_riscv_top.u_connect);
+	   	$dumpvars(0, `TB_TOP.u_top.u_riscv_top.u_intf);
+	   	$dumpvars(0, `TB_TOP.u_top.u_uart_i2c_usb_spi.u_uart0_core);
+	   	$dumpvars(0, `TB_TOP.u_top.u_uart_i2c_usb_spi.u_i2cm);
+	   	$dumpvars(0, `TB_TOP.u_top.u_pinmux);
+	   end
+       `endif
+
+       /*************************************************************************
+       * This is Baud Rate to clock divider conversion for Test Bench
+       * Note: DUT uses 16x baud clock, where are test bench uses directly
+       * baud clock, Due to 16x Baud clock requirement at RTL, there will be
+       * some resolution loss, we expect at lower baud rate this resolution
+       * loss will be less. For Quick simulation perpose higher baud rate used
+       * *************************************************************************/
+       task tb_set_uart_baud;
+       input [31:0] ref_clk;
+       input [31:0] baud_rate;
+       output [31:0] baud_div;
+       reg   [31:0] baud_div;
+       begin
+	  // for 230400 Baud = (50Mhz/230400) = 216.7
+	  baud_div = ref_clk/baud_rate; // Get the Bit Baud rate
+	  // Baud 16x = 216/16 = 13
+          baud_div = baud_div/16; // To find the RTL baud 16x div value to find similar resolution loss in test bench
+	  // Test bench baud clock , 16x of above value
+	  // 13 * 16 = 208,  
+	  // (Note if you see original value was 216, now it's 208 )
+          baud_div = baud_div * 16;
+	  // Test bench half cycle counter to toggle it 
+	  // 208/2 = 104
+           baud_div = baud_div/2;
+	  //As counter run's from 0 , substract from 1
+	   baud_div = baud_div-1;
+       end
+       endtask
+       
+
+	initial begin
+        uart_data_bit           = 2'b11;
+        uart_stop_bits          = 0; // 0: 1 stop bit; 1: 2 stop bit;
+        uart_stick_parity       = 0; // 1: force even parity
+        uart_parity_en          = 0; // parity enable
+        uart_even_odd_parity    = 1; // 0: odd parity; 1: even parity
+	    tb_set_uart_baud(50000000,1152000,uart_divisor);// 50Mhz Ref clock, Baud Rate: 230400
+        uart_timeout            = 20000;// wait time limit
+        uart_fifo_enable        = 0;	// fifo mode disable
+
+		$value$plusargs("risc_core_id=%d", d_risc_id);
+
+		#200; // Wait for reset removal
+	    repeat (10) @(posedge clock);
+		$display("Monitor: Standalone User Risc Boot Test Started");
+
+		// Remove Wb Reset
+		wb_user_core_write(`ADDR_SPACE_WBHOST+`WBHOST_GLBL_CFG,'h1);
+
+	    repeat (2) @(posedge clock);
+		#1;
+        // Remove all the reset
+        if(d_risc_id == 0) begin
+             $display("STATUS: Working with Risc core 0");
+             wb_user_core_write(`ADDR_SPACE_GLBL+`GLBL_CFG_CFG0,'h11F);
+        end else if(d_risc_id == 1) begin
+             $display("STATUS: Working with Risc core 1");
+             wb_user_core_write(`ADDR_SPACE_GLBL+`GLBL_CFG_CFG0,'h21F);
+        end else if(d_risc_id == 2) begin
+             $display("STATUS: Working with Risc core 2");
+             wb_user_core_write(`ADDR_SPACE_GLBL+`GLBL_CFG_CFG0,'h41F);
+        end else if(d_risc_id == 3) begin
+             $display("STATUS: Working with Risc core 3");
+             wb_user_core_write(`ADDR_SPACE_GLBL+`GLBL_CFG_CFG0,'h81F);
+        end
+
+        repeat (100) @(posedge clock);  // wait for Processor Get Ready
+
+	    tb_uart.debug_mode = 0; // disable debug display
+        tb_uart.uart_init;
+        tb_uart.control_setup (uart_data_bit, uart_stop_bits, uart_parity_en, uart_even_odd_parity, 
+                                       uart_stick_parity, uart_timeout, uart_divisor);
+
+         u_i2c_slave_0.debug = 1; // disable i2c bfm debug message
+         u_i2c_slave_1.debug = 1; // disable i2c bfm debug message
+
+        repeat (45000) @(posedge clock);  // wait for Processor Get Ready
+	    flag  = 0;
+		check_sum = 0;
+        compare_start = 1;
+        
+        fork
+           begin
+              while(flag == 0)
+              begin
+                 tb_uart.read_char(read_data,flag);
+		         if(flag == 0)  begin
+		            $write ("%c",read_data);
+		            check_sum = check_sum+read_data;
+		         end
+              end
+           end
+           begin
+              repeat (250000) @(posedge clock);  // wait for Processor Get Ready
+           end
+           join_any
+        
+           #100
+           tb_uart.report_status(uart_rx_nu, uart_tx_nu);
+        
+           test_fail = 0;
+
+		   $display("Total Rx Char: %d Check Sum : %x ",uart_rx_nu, check_sum);
+           // Check 
+           // if all the byte received
+           // if no error 
+           if(uart_rx_nu != 138) test_fail = 1;
+           if(check_sum != 32'h00001e9d) test_fail = 1;
+
+	   
+	    	$display("###################################################");
+          	if(test_fail == 0) begin
+		   `ifdef GL
+	    	       $display("Monitor: Standalone i2c scanner (GL) Passed");
+		   `else
+		       $display("Monitor: Standalone i2c scanner (RTL) Passed");
+		   `endif
+	        end else begin
+		    `ifdef GL
+	    	        $display("Monitor: Standalone i2c scanner (GL) Failed");
+		    `else
+		        $display("Monitor: Standalone i2c scanner (RTL) Failed");
+		    `endif
+		 end
+	    	$display("###################################################");
+	    $finish;
+	end
+
+	initial begin
+		wb_rst_i <= 1'b1;
+		#100;
+		wb_rst_i <= 1'b0;	    	// Release reset
+	end
+wire USER_VDD1V8 = 1'b1;
+wire VSS = 1'b0;
+
+user_project_wrapper u_top(
+`ifdef USE_POWER_PINS
+    .vccd1(USER_VDD1V8),	// User area 1 1.8V supply
+    .vssd1(VSS),	// User area 1 digital ground
+`endif
+    .wb_clk_i        (clock),  // System clock
+    .user_clock2     (1'b1),  // Real-time clock
+    .wb_rst_i        (wb_rst_i),  // Regular Reset signal
+
+    .wbs_cyc_i   (wbd_ext_cyc_i),  // strobe/request
+    .wbs_stb_i   (wbd_ext_stb_i),  // strobe/request
+    .wbs_adr_i   (wbd_ext_adr_i),  // address
+    .wbs_we_i    (wbd_ext_we_i),  // write
+    .wbs_dat_i   (wbd_ext_dat_i),  // data output
+    .wbs_sel_i   (wbd_ext_sel_i),  // byte enable
+
+    .wbs_dat_o   (wbd_ext_dat_o),  // data input
+    .wbs_ack_o   (wbd_ext_ack_o),  // acknowlegement
+
+ 
+    // Logic Analyzer Signals
+    .la_data_in      ('1) ,
+    .la_data_out     (),
+    .la_oenb         ('0),
+ 
+
+    // IOs
+    .io_in          (io_in)  ,
+    .io_out         (io_out) ,
+    .io_oeb         (io_oeb) ,
+
+    .user_irq       () 
+
+);
+// SSPI Slave I/F
+assign io_in[5]  = 1'b1; // RESET
+
+//---------------------------
+// I2C
+// --------------------------
+tri scl,sda;
+
+assign sda  =  (io_oeb[26] == 1'b0) ? io_out[26] : 1'bz;
+assign scl   = (io_oeb[27] == 1'b0) ? io_out[27]: 1'bz;
+assign io_in[26]  =  sda;
+assign io_in[27]  =  scl;
+
+pullup p1(scl); // pullup scl line
+pullup p2(sda); // pullup sda line
+
+ 
+i2c_slave_model  #(.I2C_ADR(7'h4)) u_i2c_slave_0 (
+	.scl   (scl), 
+	.sda   (sda)
+       );
+
+i2c_slave_model  #(.I2C_ADR(7'h10)) u_i2c_slave_1 (
+	.scl   (scl), 
+	.sda   (sda)
+       );
+
+`ifndef GL // Drive Power for Hold Fix Buf
+    // All standard cell need power hook-up for functionality work
+    initial begin
+
+    end
+`endif    
+
+//------------------------------------------------------
+//  Integrate the Serial flash with qurd support to
+//  user core using the gpio pads
+//  ----------------------------------------------------
+
+   wire flash_clk = io_out[28];
+   wire flash_csb = io_out[29];
+   // Creating Pad Delay
+   wire #1 io_oeb_29 = io_oeb[33];
+   wire #1 io_oeb_30 = io_oeb[34];
+   wire #1 io_oeb_31 = io_oeb[35];
+   wire #1 io_oeb_32 = io_oeb[36];
+   tri  #1 flash_io0 = (io_oeb_29== 1'b0) ? io_out[33] : 1'bz;
+   tri  #1 flash_io1 = (io_oeb_30== 1'b0) ? io_out[34] : 1'bz;
+   tri  #1 flash_io2 = (io_oeb_31== 1'b0) ? io_out[35] : 1'bz;
+   tri  #1 flash_io3 = (io_oeb_32== 1'b0) ? io_out[36] : 1'bz;
+
+   assign io_in[33] = flash_io0;
+   assign io_in[34] = flash_io1;
+   assign io_in[35] = flash_io2;
+   assign io_in[36] = flash_io3;
+
+   // Quard flash
+     s25fl256s #(.mem_file_name(`TB_HEX),
+	         .otp_file_name("none"),
+                 .TimingModel("S25FL512SAGMFI010_F_30pF")) 
+		 u_spi_flash_256mb (
+           // Data Inputs/Outputs
+       .SI      (flash_io0),
+       .SO      (flash_io1),
+       // Controls
+       .SCK     (flash_clk),
+       .CSNeg   (flash_csb),
+       .WPNeg   (flash_io2),
+       .HOLDNeg (flash_io3),
+       .RSTNeg  (!wb_rst_i)
+
+       );
+
+   wire spiram_csb = io_out[31];
+
+   is62wvs1288 #(.mem_file_name("none"))
+	u_sram (
+         // Data Inputs/Outputs
+           .io0     (flash_io0),
+           .io1     (flash_io1),
+           // Controls
+           .clk    (flash_clk),
+           .csb    (spiram_csb),
+           .io2    (flash_io2),
+           .io3    (flash_io3)
+    );
+
+//-------------------------------------
+//---------------------------
+//  UART Agent integration
+// --------------------------
+wire uart_txd,uart_rxd;
+
+assign uart_txd   = io_out[7];
+assign io_in[6]  = uart_rxd ;
+ 
+uart_agent tb_uart(
+	.mclk                (clock              ),
+	.txd                 (uart_rxd           ),
+	.rxd                 (uart_txd           )
+	);
+
+
+task wb_user_core_write;
+input [31:0] address;
+input [31:0] data;
+begin
+  repeat (1) @(posedge clock);
+  #1;
+  wbd_ext_adr_i =address;  // address
+  wbd_ext_we_i  ='h1;  // write
+  wbd_ext_dat_i =data;  // data output
+  wbd_ext_sel_i ='hF;  // byte enable
+  wbd_ext_cyc_i ='h1;  // strobe/request
+  wbd_ext_stb_i ='h1;  // strobe/request
+  wait(wbd_ext_ack_o == 1);
+  repeat (1) @(posedge clock);
+  #1;
+  wbd_ext_cyc_i ='h0;  // strobe/request
+  wbd_ext_stb_i ='h0;  // strobe/request
+  wbd_ext_adr_i ='h0;  // address
+  wbd_ext_we_i  ='h0;  // write
+  wbd_ext_dat_i ='h0;  // data output
+  wbd_ext_sel_i ='h0;  // byte enable
+  $display("DEBUG WB USER ACCESS WRITE Address : %x, Data : %x",address,data);
+  repeat (2) @(posedge clock);
+end
+endtask
+
+task  wb_user_core_read;
+input [31:0] address;
+output [31:0] data;
+reg    [31:0] data;
+begin
+  repeat (1) @(posedge clock);
+  #1;
+  wbd_ext_adr_i =address;  // address
+  wbd_ext_we_i  ='h0;  // write
+  wbd_ext_dat_i ='0;  // data output
+  wbd_ext_sel_i ='hF;  // byte enable
+  wbd_ext_cyc_i ='h1;  // strobe/request
+  wbd_ext_stb_i ='h1;  // strobe/request
+  wait(wbd_ext_ack_o == 1);
+  repeat (1) @(negedge clock);
+  data  = wbd_ext_dat_o;  
+  repeat (1) @(posedge clock);
+  #1;
+  wbd_ext_cyc_i ='h0;  // strobe/request
+  wbd_ext_stb_i ='h0;  // strobe/request
+  wbd_ext_adr_i ='h0;  // address
+  wbd_ext_we_i  ='h0;  // write
+  wbd_ext_dat_i ='h0;  // data output
+  wbd_ext_sel_i ='h0;  // byte enable
+  $display("DEBUG WB USER ACCESS READ Address : %x, Data : %x",address,data);
+  repeat (2) @(posedge clock);
+end
+endtask
+
+task  wb_user_core_read_check;
+input [31:0] address;
+output [31:0] data;
+input [31:0] cmp_data;
+reg    [31:0] data;
+begin
+  repeat (1) @(posedge clock);
+  #1;
+  wbd_ext_adr_i =address;  // address
+  wbd_ext_we_i  ='h0;  // write
+  wbd_ext_dat_i ='0;  // data output
+  wbd_ext_sel_i ='hF;  // byte enable
+  wbd_ext_cyc_i ='h1;  // strobe/request
+  wbd_ext_stb_i ='h1;  // strobe/request
+  wait(wbd_ext_ack_o == 1);
+  repeat (1) @(negedge clock);
+  data  = wbd_ext_dat_o;  
+  repeat (1) @(posedge clock);
+  #1;
+  wbd_ext_cyc_i ='h0;  // strobe/request
+  wbd_ext_stb_i ='h0;  // strobe/request
+  wbd_ext_adr_i ='h0;  // address
+  wbd_ext_we_i  ='h0;  // write
+  wbd_ext_dat_i ='h0;  // data output
+  wbd_ext_sel_i ='h0;  // byte enable
+  if(data !== cmp_data) begin
+     $display("ERROR : WB USER ACCESS READ  Address : 0x%x, Exd: 0x%x Rxd: 0x%x ",address,cmp_data,data);
+     test_fail = 1;
+  end else begin
+     $display("STATUS: WB USER ACCESS READ  Address : 0x%x, Data : 0x%x",address,data);
+  end
+  repeat (2) @(posedge clock);
+end
+endtask
+
+`ifdef GL
+
+wire        wbd_spi_stb_i   = u_top.u_qspi_master.wbd_stb_i;
+wire        wbd_spi_ack_o   = u_top.u_qspi_master.wbd_ack_o;
+wire        wbd_spi_we_i    = u_top.u_qspi_master.wbd_we_i;
+wire [31:0] wbd_spi_adr_i   = u_top.u_qspi_master.wbd_adr_i;
+wire [31:0] wbd_spi_dat_i   = u_top.u_qspi_master.wbd_dat_i;
+wire [31:0] wbd_spi_dat_o   = u_top.u_qspi_master.wbd_dat_o;
+wire [3:0]  wbd_spi_sel_i   = u_top.u_qspi_master.wbd_sel_i;
+
+wire        wbd_uart_stb_i  = u_top.u_uart_i2c_usb_spi.reg_cs;
+wire        wbd_uart_ack_o  = u_top.u_uart_i2c_usb_spi.reg_ack;
+wire        wbd_uart_we_i   = u_top.u_uart_i2c_usb_spi.reg_wr;
+wire [8:0]  wbd_uart_adr_i  = u_top.u_uart_i2c_usb_spi.reg_addr;
+wire [7:0]  wbd_uart_dat_i  = u_top.u_uart_i2c_usb_spi.reg_wdata;
+wire [7:0]  wbd_uart_dat_o  = u_top.u_uart_i2c_usb_spi.reg_rdata;
+wire        wbd_uart_sel_i  = u_top.u_uart_i2c_usb_spi.reg_be;
+
+`endif
+
+/**
+`ifdef GL
+//-----------------------------------------------------------------------------
+// RISC IMEM amd DMEM Monitoring TASK
+//-----------------------------------------------------------------------------
+
+`define RISC_CORE  user_uart_tb.u_top.u_core.u_riscv_top
+
+always@(posedge `RISC_CORE.wb_clk) begin
+    if(`RISC_CORE.wbd_imem_ack_i)
+          $display("RISCV-DEBUG => IMEM ADDRESS: %x Read Data : %x", `RISC_CORE.wbd_imem_adr_o,`RISC_CORE.wbd_imem_dat_i);
+    if(`RISC_CORE.wbd_dmem_ack_i && `RISC_CORE.wbd_dmem_we_o)
+          $display("RISCV-DEBUG => DMEM ADDRESS: %x Write Data: %x Resonse: %x", `RISC_CORE.wbd_dmem_adr_o,`RISC_CORE.wbd_dmem_dat_o);
+    if(`RISC_CORE.wbd_dmem_ack_i && !`RISC_CORE.wbd_dmem_we_o)
+          $display("RISCV-DEBUG => DMEM ADDRESS: %x READ Data : %x Resonse: %x", `RISC_CORE.wbd_dmem_adr_o,`RISC_CORE.wbd_dmem_dat_i);
+end
+
+`endif
+**/
+endmodule
+`include "s25fl256s.sv"
+`default_nettype wire
diff --git a/verilog/dv/arduino_multi_serial/Makefile b/verilog/dv/arduino_multi_serial/Makefile
index 8c1fa01..d0899fd 100644
--- a/verilog/dv/arduino_multi_serial/Makefile
+++ b/verilog/dv/arduino_multi_serial/Makefile
@@ -97,10 +97,10 @@
 	${GCC_PREFIX}-ar rcs core.a wiring_digital.c.o
 	${GCC_PREFIX}-ar rcs core.a wiring_pulse.cpp.o
 	${GCC_PREFIX}-ar rcs core.a wiring_shift.c.o
-	${GCC_PREFIX}-g++ -T ${RISCDUINO_BOARD}/sdk/bsp/env/riscduino_score/link.lds -nostartfiles -Wl,-N -Wl,--gc-sections -Wl,--wrap=malloc -Wl,--wrap=free -Wl,--wrap=sbrk ${PATTERN}.ino.cpp.o -nostdlib -Wl,--start-group core.a -lm -lstdc++ -lc -lgloss -Wl,--end-group -lgcc -o ${PATTERN}.ino.elf
-	${GCC_PREFIX}-objcopy -R .rel.dyn -O binary ${PATTERN}.ino.elf ${PATTERN}.ino.bin
-	${GCC_PREFIX}-objcopy -R .rel.dyn -O verilog ${PATTERN}.ino.elf ${PATTERN}.ino.hex
-	${GCC_PREFIX}-objdump -D  ${PATTERN}.ino.elf >   ${PATTERN}.ino.dump
+	${GCC_PREFIX}-g++ -T ${RISCDUINO_BOARD}/sdk/bsp/env/riscduino_score/link.lds -nostartfiles -Wl,-N -Wl,--gc-sections -Wl,--wrap=malloc -Wl,--wrap=free -Wl,--wrap=sbrk ${PATTERN}.ino.cpp.o -nostdlib -Wl,--start-group core.a -lm -lstdc++ -lc -lgloss -Wl,--end-group -lgcc -o ${PATTERN}.elf
+	${GCC_PREFIX}-objcopy -R .rel.dyn -O binary ${PATTERN}.elf ${PATTERN}.bin
+	${GCC_PREFIX}-objcopy -R .rel.dyn -O verilog ${PATTERN}.elf ${PATTERN}.hex
+	${GCC_PREFIX}-objdump -D  ${PATTERN}.elf >   ${PATTERN}.dump
 	rm *.o *.a
 ifeq ($(SIM),RTL)
    ifeq ($(DUMP),OFF)
diff --git a/verilog/dv/arduino_multi_serial/arduino_multi_serial_tb.v b/verilog/dv/arduino_multi_serial/arduino_multi_serial_tb.v
index 6ad86a1..8cfeed9 100644
--- a/verilog/dv/arduino_multi_serial/arduino_multi_serial_tb.v
+++ b/verilog/dv/arduino_multi_serial/arduino_multi_serial_tb.v
@@ -69,9 +69,12 @@
 `timescale 1 ns / 1 ns
 
 `include "sram_macros/sky130_sram_2kbyte_1rw1r_32x512_8.v"
+`include "is62wvs1288.v"
 `include "uart_agent.v"
 
-module arduino_multi_serial_tb;
+`define TB_HEX "arduino_multi_serial.hex"
+`define TB_TOP  arduino_multi_serial_tb
+module `TB_TOP;
 	reg clock;
 	reg wb_rst_i;
 	reg power1, power2;
@@ -144,12 +147,12 @@
 	`ifdef WFDUMP
 	   initial begin
 	   	$dumpfile("simx.vcd");
-	   	$dumpvars(3, arduino_multi_serial_tb);
-	   	//$dumpvars(0, arduino_multi_serial_tb.u_top.u_riscv_top.i_core_top_0);
-	   	//$dumpvars(0, arduino_multi_serial_tb.u_top.u_riscv_top.u_connect);
-	   	//$dumpvars(0, arduino_multi_serial_tb.u_top.u_riscv_top.u_intf);
-	   	$dumpvars(0, arduino_multi_serial_tb.u_top.u_uart_i2c_usb_spi.u_uart0_core);
-	   	$dumpvars(0, arduino_multi_serial_tb.u_top.u_uart_i2c_usb_spi.u_uart1_core);
+	   	$dumpvars(3, `TB_TOP);
+	   	//$dumpvars(0, `TB_TOP.u_top.u_riscv_top.i_core_top_0);
+	   	//$dumpvars(0, `TB_TOP.u_top.u_riscv_top.u_connect);
+	   	//$dumpvars(0, `TB_TOP.u_top.u_riscv_top.u_intf);
+	   	$dumpvars(0, `TB_TOP.u_top.u_uart_i2c_usb_spi.u_uart0_core);
+	   	$dumpvars(0, `TB_TOP.u_top.u_uart_i2c_usb_spi.u_uart1_core);
 	   end
        `endif
 
@@ -348,6 +351,9 @@
     .user_irq       () 
 
 );
+// SSPI Slave I/F
+assign io_in[0]  = 1'b1; // RESET
+assign io_in[16] = 1'b0 ; // SPIS SCK 
 
 `ifndef GL // Drive Power for Hold Fix Buf
     // All standard cell need power hook-up for functionality work
@@ -361,25 +367,25 @@
 //  user core using the gpio pads
 //  ----------------------------------------------------
 
-   wire flash_clk = io_out[24];
-   wire flash_csb = io_out[25];
+   wire flash_clk = io_out[28];
+   wire flash_csb = io_out[29];
    // Creating Pad Delay
-   wire #1 io_oeb_29 = io_oeb[29];
-   wire #1 io_oeb_30 = io_oeb[30];
-   wire #1 io_oeb_31 = io_oeb[31];
-   wire #1 io_oeb_32 = io_oeb[32];
-   tri  #1 flash_io0 = (io_oeb_29== 1'b0) ? io_out[29] : 1'bz;
-   tri  #1 flash_io1 = (io_oeb_30== 1'b0) ? io_out[30] : 1'bz;
-   tri  #1 flash_io2 = (io_oeb_31== 1'b0) ? io_out[31] : 1'bz;
-   tri  #1 flash_io3 = (io_oeb_32== 1'b0) ? io_out[32] : 1'bz;
+   wire #1 io_oeb_29 = io_oeb[33];
+   wire #1 io_oeb_30 = io_oeb[34];
+   wire #1 io_oeb_31 = io_oeb[35];
+   wire #1 io_oeb_32 = io_oeb[36];
+   tri  #1 flash_io0 = (io_oeb_29== 1'b0) ? io_out[33] : 1'bz;
+   tri  #1 flash_io1 = (io_oeb_30== 1'b0) ? io_out[34] : 1'bz;
+   tri  #1 flash_io2 = (io_oeb_31== 1'b0) ? io_out[35] : 1'bz;
+   tri  #1 flash_io3 = (io_oeb_32== 1'b0) ? io_out[36] : 1'bz;
 
-   assign io_in[29] = flash_io0;
-   assign io_in[30] = flash_io1;
-   assign io_in[31] = flash_io2;
-   assign io_in[32] = flash_io3;
+   assign io_in[33] = flash_io0;
+   assign io_in[34] = flash_io1;
+   assign io_in[35] = flash_io2;
+   assign io_in[36] = flash_io3;
 
    // Quard flash
-     s25fl256s #(.mem_file_name("arduino_multi_serial.ino.hex"),
+     s25fl256s #(.mem_file_name(`TB_HEX),
 	         .otp_file_name("none"),
                  .TimingModel("S25FL512SAGMFI010_F_30pF")) 
 		 u_spi_flash_256mb (
@@ -395,14 +401,26 @@
 
        );
 
+   wire spiram_csb = io_out[31];
 
+   is62wvs1288 #(.mem_file_name("none"))
+	u_sram (
+         // Data Inputs/Outputs
+           .io0     (flash_io0),
+           .io1     (flash_io1),
+           // Controls
+           .clk    (flash_clk),
+           .csb    (spiram_csb),
+           .io2    (flash_io2),
+           .io3    (flash_io3)
+    );
 //---------------------------
 //  UART-0 Agent integration
 // --------------------------
 wire uart0_txd,uart0_rxd;
 
-assign uart0_txd   = io_out[2];
-assign io_in[1]  = uart0_rxd ;
+assign uart0_txd   = io_out[7];
+assign io_in[6]  = uart0_rxd ;
  
 uart_agent tb_uart0(
 	.mclk                (clock              ),
@@ -415,8 +433,8 @@
 // --------------------------
 wire uart1_txd,uart1_rxd;
 
-assign uart1_txd   = io_out[5];
-assign io_in[3]  = uart1_rxd ;
+assign uart1_txd   = io_out[10];
+assign io_in[8]  = uart1_rxd ;
  
 uart_agent tb_uart1(
 	.mclk                (clock              ),
diff --git a/verilog/dv/arduino_risc_boot/Makefile b/verilog/dv/arduino_risc_boot/Makefile
index 5c074b3..68dd9fc 100644
--- a/verilog/dv/arduino_risc_boot/Makefile
+++ b/verilog/dv/arduino_risc_boot/Makefile
@@ -97,10 +97,10 @@
 	${GCC_PREFIX}-ar rcs core.a wiring_digital.c.o
 	${GCC_PREFIX}-ar rcs core.a wiring_pulse.cpp.o
 	${GCC_PREFIX}-ar rcs core.a wiring_shift.c.o
-	${GCC_PREFIX}-g++ -T ${RISCDUINO_BOARD}/sdk/bsp/env/riscduino_score/link.lds -nostartfiles -Wl,-N -Wl,--gc-sections -Wl,--wrap=malloc -Wl,--wrap=free -Wl,--wrap=sbrk ${PATTERN}.ino.cpp.o -nostdlib -Wl,--start-group core.a -lm -lstdc++ -lc -lgloss -Wl,--end-group -lgcc -o ${PATTERN}.ino.elf
-	${GCC_PREFIX}-objcopy -R .rel.dyn -O binary ${PATTERN}.ino.elf ${PATTERN}.ino.bin
-	${GCC_PREFIX}-objcopy -R .rel.dyn -O verilog ${PATTERN}.ino.elf ${PATTERN}.ino.hex
-	${GCC_PREFIX}-objdump -D  ${PATTERN}.ino.elf >   ${PATTERN}.ino.dump
+	${GCC_PREFIX}-g++ -T ${RISCDUINO_BOARD}/sdk/bsp/env/riscduino_score/link.lds -nostartfiles -Wl,-N -Wl,--gc-sections -Wl,--wrap=malloc -Wl,--wrap=free -Wl,--wrap=sbrk ${PATTERN}.ino.cpp.o -nostdlib -Wl,--start-group core.a -lm -lstdc++ -lc -lgloss -Wl,--end-group -lgcc -o ${PATTERN}.elf
+	${GCC_PREFIX}-objcopy -R .rel.dyn -O binary ${PATTERN}.elf ${PATTERN}.bin
+	${GCC_PREFIX}-objcopy -R .rel.dyn -O verilog ${PATTERN}.elf ${PATTERN}.hex
+	${GCC_PREFIX}-objdump -D  ${PATTERN}.elf >   ${PATTERN}.dump
 	rm *.o *.a
 ifeq ($(SIM),RTL)
    ifeq ($(DUMP),OFF)
diff --git a/verilog/dv/arduino_risc_boot/arduino_risc_boot_tb.v b/verilog/dv/arduino_risc_boot/arduino_risc_boot_tb.v
index 0349606..eb4d0d0 100644
--- a/verilog/dv/arduino_risc_boot/arduino_risc_boot_tb.v
+++ b/verilog/dv/arduino_risc_boot/arduino_risc_boot_tb.v
@@ -67,7 +67,12 @@
 `timescale 1 ns / 1 ns
 
 `include "sram_macros/sky130_sram_2kbyte_1rw1r_32x512_8.v"
-module arduino_risc_boot_tb;
+`include "is62wvs1288.v"
+
+`define TB_HEX "arduino_risc_boot.hex"
+`define TB_TOP  arduino_risc_boot_tb
+
+module `TB_TOP;
 	reg clock;
 	reg wb_rst_i;
 	reg power1, power2;
@@ -117,7 +122,7 @@
 	`ifdef WFDUMP
 	   initial begin
 	   	$dumpfile("simx.vcd");
-	   	$dumpvars(3, arduino_risc_boot_tb);
+	   	$dumpvars(3, `TB_TOP);
 	   end
        `endif
 
@@ -231,6 +236,9 @@
     .user_irq       () 
 
 );
+// SSPI Slave I/F
+assign io_in[0]  = 1'b1; // RESET
+assign io_in[16] = 1'b0 ; // SPIS SCK 
 
 `ifndef GL // Drive Power for Hold Fix Buf
     // All standard cell need power hook-up for functionality work
@@ -244,25 +252,25 @@
 //  user core using the gpio pads
 //  ----------------------------------------------------
 
-   wire flash_clk = io_out[24];
-   wire flash_csb = io_out[25];
+   wire flash_clk = io_out[28];
+   wire flash_csb = io_out[29];
    // Creating Pad Delay
-   wire #1 io_oeb_29 = io_oeb[29];
-   wire #1 io_oeb_30 = io_oeb[30];
-   wire #1 io_oeb_31 = io_oeb[31];
-   wire #1 io_oeb_32 = io_oeb[32];
-   tri  #1 flash_io0 = (io_oeb_29== 1'b0) ? io_out[29] : 1'bz;
-   tri  #1 flash_io1 = (io_oeb_30== 1'b0) ? io_out[30] : 1'bz;
-   tri  #1 flash_io2 = (io_oeb_31== 1'b0) ? io_out[31] : 1'bz;
-   tri  #1 flash_io3 = (io_oeb_32== 1'b0) ? io_out[32] : 1'bz;
+   wire #1 io_oeb_29 = io_oeb[33];
+   wire #1 io_oeb_30 = io_oeb[34];
+   wire #1 io_oeb_31 = io_oeb[35];
+   wire #1 io_oeb_32 = io_oeb[36];
+   tri  #1 flash_io0 = (io_oeb_29== 1'b0) ? io_out[33] : 1'bz;
+   tri  #1 flash_io1 = (io_oeb_30== 1'b0) ? io_out[34] : 1'bz;
+   tri  #1 flash_io2 = (io_oeb_31== 1'b0) ? io_out[35] : 1'bz;
+   tri  #1 flash_io3 = (io_oeb_32== 1'b0) ? io_out[36] : 1'bz;
 
-   assign io_in[29] = flash_io0;
-   assign io_in[30] = flash_io1;
-   assign io_in[31] = flash_io2;
-   assign io_in[32] = flash_io3;
+   assign io_in[33] = flash_io0;
+   assign io_in[34] = flash_io1;
+   assign io_in[35] = flash_io2;
+   assign io_in[36] = flash_io3;
 
    // Quard flash
-     s25fl256s #(.mem_file_name("arduino_risc_boot.ino.hex"),
+     s25fl256s #(.mem_file_name(`TB_HEX),
 	         .otp_file_name("none"),
                  .TimingModel("S25FL512SAGMFI010_F_30pF")) 
 		 u_spi_flash_256mb (
@@ -278,6 +286,22 @@
 
        );
 
+   wire spiram_csb = io_out[31];
+
+   is62wvs1288 #(.mem_file_name("none"))
+	u_sram (
+         // Data Inputs/Outputs
+           .io0     (flash_io0),
+           .io1     (flash_io1),
+           // Controls
+           .clk    (flash_clk),
+           .csb    (spiram_csb),
+           .io2    (flash_io2),
+           .io3    (flash_io3)
+    );
+
+//-------------------------------------
+
 
 
 
diff --git a/verilog/dv/arduino_string/Makefile b/verilog/dv/arduino_string/Makefile
index 78fc16e..bf750df 100644
--- a/verilog/dv/arduino_string/Makefile
+++ b/verilog/dv/arduino_string/Makefile
@@ -97,10 +97,10 @@
 	${GCC_PREFIX}-ar rcs core.a wiring_digital.c.o
 	${GCC_PREFIX}-ar rcs core.a wiring_pulse.cpp.o
 	${GCC_PREFIX}-ar rcs core.a wiring_shift.c.o
-	${GCC_PREFIX}-g++ -T ${RISCDUINO_BOARD}/sdk/bsp/env/riscduino_score/link.lds -nostartfiles -Wl,-N -Wl,--gc-sections -Wl,--wrap=malloc -Wl,--wrap=free -Wl,--wrap=sbrk ${PATTERN}.ino.cpp.o -nostdlib -Wl,--start-group core.a -lm -lstdc++ -lc -lgloss -Wl,--end-group -lgcc -o ${PATTERN}.ino.elf
-	${GCC_PREFIX}-objcopy -R .rel.dyn -O binary ${PATTERN}.ino.elf ${PATTERN}.ino.bin
-	${GCC_PREFIX}-objcopy -R .rel.dyn -O verilog ${PATTERN}.ino.elf ${PATTERN}.ino.hex
-	${GCC_PREFIX}-objdump -D  ${PATTERN}.ino.elf >   ${PATTERN}.ino.dump
+	${GCC_PREFIX}-g++ -T ${RISCDUINO_BOARD}/sdk/bsp/env/riscduino_score/link.lds -nostartfiles -Wl,-N -Wl,--gc-sections -Wl,--wrap=malloc -Wl,--wrap=free -Wl,--wrap=sbrk ${PATTERN}.ino.cpp.o -nostdlib -Wl,--start-group core.a -lm -lstdc++ -lc -lgloss -Wl,--end-group -lgcc -o ${PATTERN}.elf
+	${GCC_PREFIX}-objcopy -R .rel.dyn -O binary ${PATTERN}.elf ${PATTERN}.bin
+	${GCC_PREFIX}-objcopy -R .rel.dyn -O verilog ${PATTERN}.elf ${PATTERN}.hex
+	${GCC_PREFIX}-objdump -D  ${PATTERN}.elf >   ${PATTERN}.dump
 	rm *.o *.a
 ifeq ($(SIM),RTL)
    ifeq ($(DUMP),OFF)
diff --git a/verilog/dv/arduino_string/arduino_string_tb.v b/verilog/dv/arduino_string/arduino_string_tb.v
index 1bd4b91..f57b93f 100644
--- a/verilog/dv/arduino_string/arduino_string_tb.v
+++ b/verilog/dv/arduino_string/arduino_string_tb.v
@@ -68,9 +68,12 @@
 `timescale 1 ns / 1 ns
 
 `include "sram_macros/sky130_sram_2kbyte_1rw1r_32x512_8.v"
+`include "is62wvs1288.v"
 `include "uart_agent.v"
 
-module arduino_string_tb;
+`define TB_HEX "arduino_string.hex"
+`define TB_TOP  arduino_string_tb
+module `TB_TOP;
 	reg clock;
 	reg wb_rst_i;
 	reg power1, power2;
@@ -144,11 +147,11 @@
 	`ifdef WFDUMP
 	   initial begin
 	   	$dumpfile("simx.vcd");
-	   	$dumpvars(3, arduino_string_tb);
-	   	$dumpvars(0, arduino_string_tb.u_top.u_riscv_top.i_core_top_0);
-	   	$dumpvars(0, arduino_string_tb.u_top.u_riscv_top.u_connect);
-	   	$dumpvars(0, arduino_string_tb.u_top.u_riscv_top.u_intf);
-	   	$dumpvars(0, arduino_string_tb.u_top.u_uart_i2c_usb_spi.u_uart0_core);
+	   	$dumpvars(3, `TB_TOP);
+	   	$dumpvars(0, `TB_TOP.u_top.u_riscv_top.i_core_top_0);
+	   	$dumpvars(0, `TB_TOP.u_top.u_riscv_top.u_connect);
+	   	$dumpvars(0, `TB_TOP.u_top.u_riscv_top.u_intf);
+	   	$dumpvars(0, `TB_TOP.u_top.u_uart_i2c_usb_spi.u_uart0_core);
 	   end
        `endif
 
@@ -321,6 +324,9 @@
 
 );
 
+// SSPI Slave I/F
+assign io_in[0]  = 1'b1; // RESET
+
 `ifndef GL // Drive Power for Hold Fix Buf
     // All standard cell need power hook-up for functionality work
     initial begin
@@ -333,26 +339,26 @@
 //  user core using the gpio pads
 //  ----------------------------------------------------
 
-   wire flash_clk = io_out[24];
-   wire flash_csb = io_out[25];
+   wire flash_clk = io_out[28];
+   wire flash_csb = io_out[29];
    // Creating Pad Delay
-   wire #1 io_oeb_29 = io_oeb[29];
-   wire #1 io_oeb_30 = io_oeb[30];
-   wire #1 io_oeb_31 = io_oeb[31];
-   wire #1 io_oeb_32 = io_oeb[32];
-   tri  #1 flash_io0 = (io_oeb_29== 1'b0) ? io_out[29] : 1'bz;
-   tri  #1 flash_io1 = (io_oeb_30== 1'b0) ? io_out[30] : 1'bz;
-   tri  #1 flash_io2 = (io_oeb_31== 1'b0) ? io_out[31] : 1'bz;
-   tri  #1 flash_io3 = (io_oeb_32== 1'b0) ? io_out[32] : 1'bz;
+   wire #1 io_oeb_29 = io_oeb[33];
+   wire #1 io_oeb_30 = io_oeb[34];
+   wire #1 io_oeb_31 = io_oeb[35];
+   wire #1 io_oeb_32 = io_oeb[36];
+   tri  #1 flash_io0 = (io_oeb_29== 1'b0) ? io_out[33] : 1'bz;
+   tri  #1 flash_io1 = (io_oeb_30== 1'b0) ? io_out[34] : 1'bz;
+   tri  #1 flash_io2 = (io_oeb_31== 1'b0) ? io_out[35] : 1'bz;
+   tri  #1 flash_io3 = (io_oeb_32== 1'b0) ? io_out[36] : 1'bz;
 
-   assign io_in[29] = flash_io0;
-   assign io_in[30] = flash_io1;
-   assign io_in[31] = flash_io2;
-   assign io_in[32] = flash_io3;
+   assign io_in[33] = flash_io0;
+   assign io_in[34] = flash_io1;
+   assign io_in[35] = flash_io2;
+   assign io_in[36] = flash_io3;
 
    // Quard flash
-     s25fl256s #(.mem_file_name("arduino_string.ino.hex"),
-	             .otp_file_name("none"),
+     s25fl256s #(.mem_file_name(`TB_HEX),
+	         .otp_file_name("none"),
                  .TimingModel("S25FL512SAGMFI010_F_30pF")) 
 		 u_spi_flash_256mb (
            // Data Inputs/Outputs
@@ -367,14 +373,27 @@
 
        );
 
+   wire spiram_csb = io_out[31];
+
+   is62wvs1288 #(.mem_file_name("none"))
+	u_sram (
+         // Data Inputs/Outputs
+           .io0     (flash_io0),
+           .io1     (flash_io1),
+           // Controls
+           .clk    (flash_clk),
+           .csb    (spiram_csb),
+           .io2    (flash_io2),
+           .io3    (flash_io3)
+    );
 
 //---------------------------
 //  UART Agent integration
 // --------------------------
 wire uart_txd,uart_rxd;
 
-assign uart_txd   = io_out[2];
-assign io_in[1]  = uart_rxd ;
+assign uart_txd   = io_out[7];
+assign io_in[6]  = uart_rxd ;
  
 uart_agent tb_uart(
 	.mclk                (clock              ),
diff --git a/verilog/dv/arduino_switchCase2/Makefile b/verilog/dv/arduino_switchCase2/Makefile
index 2533931..6470aef 100644
--- a/verilog/dv/arduino_switchCase2/Makefile
+++ b/verilog/dv/arduino_switchCase2/Makefile
@@ -97,10 +97,10 @@
 	${GCC_PREFIX}-ar rcs core.a wiring_digital.c.o
 	${GCC_PREFIX}-ar rcs core.a wiring_pulse.cpp.o
 	${GCC_PREFIX}-ar rcs core.a wiring_shift.c.o
-	${GCC_PREFIX}-g++ -T ${RISCDUINO_BOARD}/sdk/bsp/env/riscduino_score/link.lds -nostartfiles -Wl,-N -Wl,--gc-sections -Wl,--wrap=malloc -Wl,--wrap=free -Wl,--wrap=sbrk ${PATTERN}.ino.cpp.o -nostdlib -Wl,--start-group core.a -lm -lstdc++ -lc -lgloss -Wl,--end-group -lgcc -o ${PATTERN}.ino.elf
-	${GCC_PREFIX}-objcopy -R .rel.dyn -O binary ${PATTERN}.ino.elf ${PATTERN}.ino.bin
-	${GCC_PREFIX}-objcopy -R .rel.dyn -O verilog ${PATTERN}.ino.elf ${PATTERN}.ino.hex
-	${GCC_PREFIX}-objdump -D  ${PATTERN}.ino.elf >   ${PATTERN}.ino.dump
+	${GCC_PREFIX}-g++ -T ${RISCDUINO_BOARD}/sdk/bsp/env/riscduino_score/link.lds -nostartfiles -Wl,-N -Wl,--gc-sections -Wl,--wrap=malloc -Wl,--wrap=free -Wl,--wrap=sbrk ${PATTERN}.ino.cpp.o -nostdlib -Wl,--start-group core.a -lm -lstdc++ -lc -lgloss -Wl,--end-group -lgcc -o ${PATTERN}.elf
+	${GCC_PREFIX}-objcopy -R .rel.dyn -O binary ${PATTERN}.elf ${PATTERN}.bin
+	${GCC_PREFIX}-objcopy -R .rel.dyn -O verilog ${PATTERN}.elf ${PATTERN}.hex
+	${GCC_PREFIX}-objdump -D  ${PATTERN}.elf >   ${PATTERN}.dump
 	rm *.o *.a
 ifeq ($(SIM),RTL)
    ifeq ($(DUMP),OFF)
diff --git a/verilog/dv/arduino_switchCase2/arduino_switchCase2_tb.v b/verilog/dv/arduino_switchCase2/arduino_switchCase2_tb.v
index c3e9ffb..8a3a7d8 100644
--- a/verilog/dv/arduino_switchCase2/arduino_switchCase2_tb.v
+++ b/verilog/dv/arduino_switchCase2/arduino_switchCase2_tb.v
@@ -70,7 +70,9 @@
 `include "uart_agent.v"
 `include "is62wvs1288.v"
 
-module arduino_switchCase2_tb;
+`define TB_HEX "arduino_switchCase2.hex"
+`define TB_TOP  arduino_switchCase2_tb
+module `TB_TOP;
 	reg clock;
 	reg wb_rst_i;
 	reg power1, power2;
@@ -167,11 +169,11 @@
 	`ifdef WFDUMP
 	   initial begin
 	   	$dumpfile("simx.vcd");
-	   	$dumpvars(3, arduino_switchCase2_tb);
-	   	$dumpvars(0, arduino_switchCase2_tb.u_top.u_riscv_top.i_core_top_0);
-	   	$dumpvars(0, arduino_switchCase2_tb.u_top.u_riscv_top.u_connect);
-	   	$dumpvars(0, arduino_switchCase2_tb.u_top.u_riscv_top.u_intf);
-	   	$dumpvars(0, arduino_switchCase2_tb.u_top.u_uart_i2c_usb_spi.u_uart0_core);
+	   	$dumpvars(3, `TB_TOP);
+	   	$dumpvars(0, `TB_TOP.u_top.u_riscv_top.i_core_top_0);
+	   	$dumpvars(0, `TB_TOP.u_top.u_riscv_top.u_connect);
+	   	$dumpvars(0, `TB_TOP.u_top.u_riscv_top.u_intf);
+	   	$dumpvars(0, `TB_TOP.u_top.u_uart_i2c_usb_spi.u_uart0_core);
 	   end
        `endif
 
@@ -207,24 +209,24 @@
 
      /************* Port-D Mapping **********************************
       *             Arduino-No
-      *   Pin-2        0         PD0/RXD[0]                digital_io[1]
-      *   Pin-3        1         PD1/TXD[0]                digital_io[2]
-      *   Pin-4        2         PD2/RXD[1]/INT0           digital_io[3]
-      *   Pin-5        3         PD3/INT1/OC2B(PWM0)       digital_io[4]
-      *   Pin-6        4         PD4/TXD[1]                digital_io[5]
-      *   Pin-11       5         PD5/SS[3]/OC0B(PWM1)/T1   digital_io[8]
-      *   Pin-12       6         PD6/SS[2]/OC0A(PWM2)/AIN0 digital_io[9]/analog_io[2]
-      *   Pin-13       7         PD7/A1N1                  digital_io[10]/analog_io[3]
+      *   Pin-2        0         PD0/RXD[0]                digital_io[6]
+      *   Pin-3        1         PD1/TXD[0]                digital_io[7]
+      *   Pin-4        2         PD2/RXD[1]/INT0           digital_io[8]
+      *   Pin-5        3         PD3/INT1/OC2B(PWM0)       digital_io[9]
+      *   Pin-6        4         PD4/TXD[1]                digital_io[10]
+      *   Pin-11       5         PD5/SS[3]/OC0B(PWM1)/T1   digital_io[13]
+      *   Pin-12       6         PD6/SS[2]/OC0A(PWM2)/AIN0 digital_io[14]/analog_io[2]
+      *   Pin-13       7         PD7/A1N1                  digital_io[15]/analog_io[3]
       *   ********************************************************/
 
-     wire [7:0]  port_d_in = {  io_out[10],
-		                        io_out[9],
-		                        io_out[8],
-		                        io_out[5],
-			                    io_out[4],
-			                    io_out[3],
-		                        io_out[2],
-		                        io_out[1]
+     wire [7:0]  port_d_in = {  io_out[15],
+		                        io_out[14],
+		                        io_out[13],
+		                        io_out[10],
+			                    io_out[9],
+			                    io_out[8],
+		                        io_out[7],
+		                        io_out[6]
 			                };
 	initial begin
                uart_data_bit           = 2'b11;
@@ -377,6 +379,9 @@
     .user_irq       () 
 
 );
+// SSPI Slave I/F
+assign io_in[0]  = 1'b1; // RESET
+assign io_in[16] = 1'b0 ; // SPIS SCK 
 
 `ifndef GL // Drive Power for Hold Fix Buf
     // All standard cell need power hook-up for functionality work
@@ -390,25 +395,25 @@
 //  user core using the gpio pads
 //  ----------------------------------------------------
 
-   wire flash_clk = io_out[24];
-   wire flash_csb = io_out[25];
+   wire flash_clk = io_out[28];
+   wire flash_csb = io_out[29];
    // Creating Pad Delay
-   wire #1 io_oeb_29 = io_oeb[29];
-   wire #1 io_oeb_30 = io_oeb[30];
-   wire #1 io_oeb_31 = io_oeb[31];
-   wire #1 io_oeb_32 = io_oeb[32];
-   tri  #1 flash_io0 = (io_oeb_29== 1'b0) ? io_out[29] : 1'bz;
-   tri  #1 flash_io1 = (io_oeb_30== 1'b0) ? io_out[30] : 1'bz;
-   tri  #1 flash_io2 = (io_oeb_31== 1'b0) ? io_out[31] : 1'bz;
-   tri  #1 flash_io3 = (io_oeb_32== 1'b0) ? io_out[32] : 1'bz;
+   wire #1 io_oeb_29 = io_oeb[33];
+   wire #1 io_oeb_30 = io_oeb[34];
+   wire #1 io_oeb_31 = io_oeb[35];
+   wire #1 io_oeb_32 = io_oeb[36];
+   tri  #1 flash_io0 = (io_oeb_29== 1'b0) ? io_out[33] : 1'bz;
+   tri  #1 flash_io1 = (io_oeb_30== 1'b0) ? io_out[34] : 1'bz;
+   tri  #1 flash_io2 = (io_oeb_31== 1'b0) ? io_out[35] : 1'bz;
+   tri  #1 flash_io3 = (io_oeb_32== 1'b0) ? io_out[36] : 1'bz;
 
-   assign io_in[29] = flash_io0;
-   assign io_in[30] = flash_io1;
-   assign io_in[31] = flash_io2;
-   assign io_in[32] = flash_io3;
+   assign io_in[33] = flash_io0;
+   assign io_in[34] = flash_io1;
+   assign io_in[35] = flash_io2;
+   assign io_in[36] = flash_io3;
 
    // Quard flash
-     s25fl256s #(.mem_file_name("arduino_switchCase2.ino.hex"),
+     s25fl256s #(.mem_file_name(`TB_HEX),
 	         .otp_file_name("none"),
                  .TimingModel("S25FL512SAGMFI010_F_30pF")) 
 		 u_spi_flash_256mb (
@@ -424,8 +429,7 @@
 
        );
 
-
-   wire spiram_csb = io_out[27];
+   wire spiram_csb = io_out[31];
 
    is62wvs1288 #(.mem_file_name("none"))
 	u_sram (
@@ -443,8 +447,8 @@
 // --------------------------
 wire uart_txd,uart_rxd;
 
-assign uart_txd   = io_out[2];
-assign io_in[1]  = uart_rxd ;
+assign uart_txd   = io_out[7];
+assign io_in[6]  = uart_rxd ;
  
 uart_agent tb_uart(
 	.mclk                (clock              ),
diff --git a/verilog/dv/arduino_timer_intr/Makefile b/verilog/dv/arduino_timer_intr/Makefile
new file mode 100644
index 0000000..4a23ffa
--- /dev/null
+++ b/verilog/dv/arduino_timer_intr/Makefile
@@ -0,0 +1,144 @@
+# SPDX-FileCopyrightText: 2020 Efabless Corporation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#      http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+# SPDX-License-Identifier: Apache-2.0
+
+
+# ---- Include Partitioned Makefiles ----
+
+CONFIG = caravel_user_project
+ 
+#######################################################################
+## Caravel Verilog for Integration Tests
+#######################################################################
+
+DESIGNS?=../../..
+TOOLS?=/opt/riscv32i/
+
+export USER_PROJECT_VERILOG ?=  $(DESIGNS)/verilog
+export RISCDUINO_BOARD ?=  $(USER_PROJECT_VERILOG)/dv/common/riscduino_board/custom_board/riscduino
+## YIFIVE FIRMWARE
+YIFIVE_FIRMWARE_PATH = $(USER_PROJECT_VERILOG)/dv/firmware
+GCC_PREFIX?=riscv32-unknown-elf
+
+
+## Simulation mode: RTL/GL
+SIM?=RTL
+DUMP?=OFF
+RISC_CORE?=0
+
+### To Enable IVERILOG FST DUMP
+export IVERILOG_DUMPER = fst
+
+
+.SUFFIXES:
+
+PATTERN = arduino_timer_intr
+
+all:  ${PATTERN:=.vcd}
+
+
+vvp:  ${PATTERN:=.vvp}
+
+%.vvp: %_tb.v
+	${GCC_PREFIX}-g++ -c -O2 -march=rv32imac -fpeel-loops -ffreestanding -ffunction-sections -fdata-sections -fpermissive -Wall -fno-rtti -fno-exceptions -I${RISCDUINO_BOARD}/system/include -I${RISCDUINO_BOARD}/sdk/bsp/include -I${RISCDUINO_BOARD}/sdk/bsp/env -I${RISCDUINO_BOARD}/sdk/bsp/drivers -I${RISCDUINO_BOARD}/sdk/bsp/env/riscduino_score -include sys/cdefs.h -g -DARDUINO=10607 -DF_CPU=50000000LL -DRISCDUINO_SCORE_DEVKIT -I${RISCDUINO_BOARD}/cores/arduino -I${RISCDUINO_BOARD}/variants/standard ${PATTERN}.ino.cpp -o ${PATTERN}.ino.cpp.o
+	${GCC_PREFIX}-g++ -c -O2 -march=rv32imac -fpeel-loops -ffreestanding -ffunction-sections -fdata-sections -fpermissive -Wall -fno-rtti -fno-exceptions -I${RISCDUINO_BOARD}/system/include -I${RISCDUINO_BOARD}/sdk/bsp/include -I${RISCDUINO_BOARD}/sdk/bsp/env -I${RISCDUINO_BOARD}/sdk/bsp/drivers -I${RISCDUINO_BOARD}/sdk/bsp/env/riscduino_score -include sys/cdefs.h -g -DARDUINO=10607 -DF_CPU=50000000LL -DRISCDUINO_SCORE_DEVKIT -I${RISCDUINO_BOARD}/cores/arduino -I${RISCDUINO_BOARD}/variants/standard ${RISCDUINO_BOARD}/cores/arduino/Print.cpp -o Print.cpp.o
+	${GCC_PREFIX}-g++ -c -O2 -march=rv32imac -fpeel-loops -ffreestanding -ffunction-sections -fdata-sections -fpermissive -Wall -fno-rtti -fno-exceptions -I${RISCDUINO_BOARD}/system/include -I${RISCDUINO_BOARD}/sdk/bsp/include -I${RISCDUINO_BOARD}/sdk/bsp/env -I${RISCDUINO_BOARD}/sdk/bsp/drivers -I${RISCDUINO_BOARD}/sdk/bsp/env/riscduino_score -include sys/cdefs.h -g -DARDUINO=10607 -DF_CPU=50000000LL -DRISCDUINO_SCORE_DEVKIT -I${RISCDUINO_BOARD}/cores/arduino -I${RISCDUINO_BOARD}/variants/standard ${RISCDUINO_BOARD}/cores/arduino/WMath.cpp -o WMath.cpp.o
+	${GCC_PREFIX}-g++ -c -O2 -march=rv32imac -fpeel-loops -ffreestanding -ffunction-sections -fdata-sections -fpermissive -Wall -fno-rtti -fno-exceptions -I${RISCDUINO_BOARD}/system/include -I${RISCDUINO_BOARD}/sdk/bsp/include -I${RISCDUINO_BOARD}/sdk/bsp/env -I${RISCDUINO_BOARD}/sdk/bsp/drivers -I${RISCDUINO_BOARD}/sdk/bsp/env/riscduino_score -include sys/cdefs.h -g -DARDUINO=10607 -DF_CPU=50000000LL -DRISCDUINO_SCORE_DEVKIT -I${RISCDUINO_BOARD}/cores/arduino -I${RISCDUINO_BOARD}/variants/standard ${RISCDUINO_BOARD}/cores/arduino/WString.cpp -o WString.cpp.o
+	${GCC_PREFIX}-gcc -c -O2 -march=rv32imac -fpeel-loops -ffreestanding -ffunction-sections -fdata-sections -Wall -I${RISCDUINO_BOARD}/system/include -I${RISCDUINO_BOARD}/sdk/bsp/include -I${RISCDUINO_BOARD}/sdk/bsp/env -I${RISCDUINO_BOARD}/sdk/bsp/drivers -I${RISCDUINO_BOARD}/sdk/bsp/env/riscduino_score -include sys/cdefs.h -g -DARDUINO=10607 -DF_CPU=50000000LL -DRISCDUINO_SCORE_DEVKIT -I${RISCDUINO_BOARD}/cores/arduino -I${RISCDUINO_BOARD}/variants/standard ${RISCDUINO_BOARD}/cores/arduino/WInterrupts.c -o WInterrupts.c.o
+	${GCC_PREFIX}-gcc -c -O2 -march=rv32imac -fpeel-loops -ffreestanding -ffunction-sections -fdata-sections -Wall -I${RISCDUINO_BOARD}/system/include -I${RISCDUINO_BOARD}/sdk/bsp/include -I${RISCDUINO_BOARD}/sdk/bsp/env -I${RISCDUINO_BOARD}/sdk/bsp/drivers -I${RISCDUINO_BOARD}/sdk/bsp/env/riscduino_score -include sys/cdefs.h -g -DARDUINO=10607 -DF_CPU=50000000LL -DRISCDUINO_SCORE_DEVKIT -I${RISCDUINO_BOARD}/cores/arduino -I${RISCDUINO_BOARD}/variants/standard ${RISCDUINO_BOARD}/cores/arduino/drivers/fe300prci/fe300prci_driver.c -o fe300prci_driver.c.o
+	${GCC_PREFIX}-g++ -c -O2 -march=rv32imac -fpeel-loops -ffreestanding -ffunction-sections -fdata-sections -fpermissive -Wall -fno-rtti -fno-exceptions -I${RISCDUINO_BOARD}/system/include -I${RISCDUINO_BOARD}/sdk/bsp/include -I${RISCDUINO_BOARD}/sdk/bsp/env -I${RISCDUINO_BOARD}/sdk/bsp/drivers -I${RISCDUINO_BOARD}/sdk/bsp/env/riscduino_score -include sys/cdefs.h -g -DARDUINO=10607 -DF_CPU=50000000LL -DRISCDUINO_SCORE_DEVKIT -I${RISCDUINO_BOARD}/cores/arduino -I${RISCDUINO_BOARD}/variants/standard ${RISCDUINO_BOARD}/cores/arduino/abi.cpp -o abi.cpp.o
+	${GCC_PREFIX}-gcc -c -O2 -march=rv32imac -fpeel-loops -ffreestanding -ffunction-sections -fdata-sections -Wall -I${RISCDUINO_BOARD}/system/include -I${RISCDUINO_BOARD}/sdk/bsp/include -I${RISCDUINO_BOARD}/sdk/bsp/env -I${RISCDUINO_BOARD}/sdk/bsp/drivers -I${RISCDUINO_BOARD}/sdk/bsp/env/riscduino_score -include sys/cdefs.h -g -DARDUINO=10607 -DF_CPU=50000000LL -DRISCDUINO_SCORE_DEVKIT -I${RISCDUINO_BOARD}/cores/arduino -I${RISCDUINO_BOARD}/variants/standard ${RISCDUINO_BOARD}/cores/arduino/drivers/plic/plic_driver.c -o plic_driver.c.o
+	${GCC_PREFIX}-g++ -c -O2 -march=rv32imac -fpeel-loops -ffreestanding -ffunction-sections -fdata-sections -fpermissive -Wall -fno-rtti -fno-exceptions -I${RISCDUINO_BOARD}/system/include -I${RISCDUINO_BOARD}/sdk/bsp/include -I${RISCDUINO_BOARD}/sdk/bsp/env -I${RISCDUINO_BOARD}/sdk/bsp/drivers -I${RISCDUINO_BOARD}/sdk/bsp/env/riscduino_score -include sys/cdefs.h -g -DARDUINO=10607 -DF_CPU=50000000LL -DRISCDUINO_SCORE_DEVKIT -I${RISCDUINO_BOARD}/cores/arduino -I${RISCDUINO_BOARD}/variants/standard ${RISCDUINO_BOARD}/cores/arduino/UARTClass.cpp -o UARTClass.cpp.o
+
+	${GCC_PREFIX}-g++ -c -O2 -march=rv32imac -fpeel-loops -ffreestanding -ffunction-sections -fdata-sections -fpermissive -Wall -fno-rtti -fno-exceptions -I${RISCDUINO_BOARD}/system/include -I${RISCDUINO_BOARD}/sdk/bsp/include -I${RISCDUINO_BOARD}/sdk/bsp/env -I${RISCDUINO_BOARD}/sdk/bsp/drivers -I${RISCDUINO_BOARD}/sdk/bsp/env/riscduino_score -include sys/cdefs.h -g -DARDUINO=10607 -DF_CPU=50000000LL -DRISCDUINO_SCORE_DEVKIT -I${RISCDUINO_BOARD}/cores/arduino -I${RISCDUINO_BOARD}/variants/standard ${RISCDUINO_BOARD}/cores/arduino/TIMERClass.cpp -o TIMERClass.cpp.o
+
+	${GCC_PREFIX}-gcc -c -march=rv32imac -I${RISCDUINO_BOARD}/system/include -I${RISCDUINO_BOARD}/sdk/bsp/include -I${RISCDUINO_BOARD}/sdk/bsp/env -I${RISCDUINO_BOARD}/sdk/bsp/drivers -I${RISCDUINO_BOARD}/sdk/bsp/env/riscduino_score -g -DARDUINO=10607 -DF_CPU=50000000LL -DRISCDUINO_SCORE_DEVKIT -I${RISCDUINO_BOARD}/cores/arduino -I${RISCDUINO_BOARD}/variants/standard ${RISCDUINO_BOARD}/cores/arduino/entry.S -o entry.S.o
+	${GCC_PREFIX}-gcc -c -O2 -march=rv32imac -fpeel-loops -ffreestanding -ffunction-sections -fdata-sections -Wall -I${RISCDUINO_BOARD}/system/include -I${RISCDUINO_BOARD}/sdk/bsp/include -I${RISCDUINO_BOARD}/sdk/bsp/env -I${RISCDUINO_BOARD}/sdk/bsp/drivers -I${RISCDUINO_BOARD}/sdk/bsp/env/riscduino_score -include sys/cdefs.h -g -DARDUINO=10607 -DF_CPU=50000000LL -DRISCDUINO_SCORE_DEVKIT -I${RISCDUINO_BOARD}/cores/arduino -I${RISCDUINO_BOARD}/variants/standard ${RISCDUINO_BOARD}/cores/arduino/hooks.c -o hooks.c.o
+	${GCC_PREFIX}-gcc -c -march=rv32imac -I${RISCDUINO_BOARD}/system/include -I${RISCDUINO_BOARD}/sdk/bsp/include -I${RISCDUINO_BOARD}/sdk/bsp/env -I${RISCDUINO_BOARD}/sdk/bsp/drivers -I${RISCDUINO_BOARD}/sdk/bsp/env/riscduino_score -g -DARDUINO=10607 -DF_CPU=50000000LL -DRISCDUINO_SCORE_DEVKIT -I${RISCDUINO_BOARD}/cores/arduino -I${RISCDUINO_BOARD}/variants/standard ${RISCDUINO_BOARD}/cores/arduino/init.S -o init.S.o
+	${GCC_PREFIX}-gcc -c -O2 -march=rv32imac -fpeel-loops -ffreestanding -ffunction-sections -fdata-sections -Wall -I${RISCDUINO_BOARD}/system/include -I${RISCDUINO_BOARD}/sdk/bsp/include -I${RISCDUINO_BOARD}/sdk/bsp/env -I${RISCDUINO_BOARD}/sdk/bsp/drivers -I${RISCDUINO_BOARD}/sdk/bsp/env/riscduino_score -include sys/cdefs.h -g -DARDUINO=10607 -DF_CPU=50000000LL -DRISCDUINO_SCORE_DEVKIT -I${RISCDUINO_BOARD}/cores/arduino -I${RISCDUINO_BOARD}/variants/standard ${RISCDUINO_BOARD}/cores/arduino/itoa.c -o itoa.c.o
+	${GCC_PREFIX}-g++ -c -O2 -march=rv32imac -fpeel-loops -ffreestanding -ffunction-sections -fdata-sections -fpermissive -Wall -fno-rtti -fno-exceptions -I${RISCDUINO_BOARD}/system/include -I${RISCDUINO_BOARD}/sdk/bsp/include -I${RISCDUINO_BOARD}/sdk/bsp/env -I${RISCDUINO_BOARD}/sdk/bsp/drivers -I${RISCDUINO_BOARD}/sdk/bsp/env/riscduino_score -include sys/cdefs.h -g -DARDUINO=10607 -DF_CPU=50000000LL -DRISCDUINO_SCORE_DEVKIT -I${RISCDUINO_BOARD}/cores/arduino -I${RISCDUINO_BOARD}/variants/standard ${RISCDUINO_BOARD}/cores/arduino/main.cpp -o main.cpp.o
+	${GCC_PREFIX}-gcc -c -O2 -march=rv32imac -fpeel-loops -ffreestanding -ffunction-sections -fdata-sections -Wall -I${RISCDUINO_BOARD}/system/include -I${RISCDUINO_BOARD}/sdk/bsp/include -I${RISCDUINO_BOARD}/sdk/bsp/env -I${RISCDUINO_BOARD}/sdk/bsp/drivers -I${RISCDUINO_BOARD}/sdk/bsp/env/riscduino_score -include sys/cdefs.h -g -DARDUINO=10607 -DF_CPU=50000000LL -DRISCDUINO_SCORE_DEVKIT -I${RISCDUINO_BOARD}/cores/arduino -I${RISCDUINO_BOARD}/variants/standard ${RISCDUINO_BOARD}/cores/arduino/malloc.c -o malloc.c.o
+	${GCC_PREFIX}-g++ -c -O2 -march=rv32imac -fpeel-loops -ffreestanding -ffunction-sections -fdata-sections -fpermissive -Wall -fno-rtti -fno-exceptions -I${RISCDUINO_BOARD}/system/include -I${RISCDUINO_BOARD}/sdk/bsp/include -I${RISCDUINO_BOARD}/sdk/bsp/env -I${RISCDUINO_BOARD}/sdk/bsp/drivers -I${RISCDUINO_BOARD}/sdk/bsp/env/riscduino_score -include sys/cdefs.h -g -DARDUINO=10607 -DF_CPU=50000000LL -DRISCDUINO_SCORE_DEVKIT -I${RISCDUINO_BOARD}/cores/arduino -I${RISCDUINO_BOARD}/variants/standard ${RISCDUINO_BOARD}/cores/arduino/new.cpp -o new.cpp.o
+	${GCC_PREFIX}-gcc -c -O2 -march=rv32imac -fpeel-loops -ffreestanding -ffunction-sections -fdata-sections -Wall -I${RISCDUINO_BOARD}/system/include -I${RISCDUINO_BOARD}/sdk/bsp/include -I${RISCDUINO_BOARD}/sdk/bsp/env -I${RISCDUINO_BOARD}/sdk/bsp/drivers -I${RISCDUINO_BOARD}/sdk/bsp/env/riscduino_score -include sys/cdefs.h -g -DARDUINO=10607 -DF_CPU=50000000LL -DRISCDUINO_SCORE_DEVKIT -I${RISCDUINO_BOARD}/cores/arduino -I${RISCDUINO_BOARD}/variants/standard ${RISCDUINO_BOARD}/cores/arduino/sbrk.c -o sbrk.c.o
+	${GCC_PREFIX}-gcc -c -march=rv32imac -I${RISCDUINO_BOARD}/system/include -I${RISCDUINO_BOARD}/sdk/bsp/include -I${RISCDUINO_BOARD}/sdk/bsp/env -I${RISCDUINO_BOARD}/sdk/bsp/drivers -I${RISCDUINO_BOARD}/sdk/bsp/env/riscduino_score -g -DARDUINO=10607 -DF_CPU=50000000LL -DRISCDUINO_SCORE_DEVKIT -I${RISCDUINO_BOARD}/cores/arduino -I${RISCDUINO_BOARD}/variants/standard ${RISCDUINO_BOARD}/cores/arduino/start.S -o start.S.o
+	${GCC_PREFIX}-gcc -c -O2 -march=rv32imac -fpeel-loops -ffreestanding -ffunction-sections -fdata-sections -Wall -I${RISCDUINO_BOARD}/system/include -I${RISCDUINO_BOARD}/sdk/bsp/include -I${RISCDUINO_BOARD}/sdk/bsp/env -I${RISCDUINO_BOARD}/sdk/bsp/drivers -I${RISCDUINO_BOARD}/sdk/bsp/env/riscduino_score -include sys/cdefs.h -g -DARDUINO=10607 -DF_CPU=50000000LL -DRISCDUINO_SCORE_DEVKIT -I${RISCDUINO_BOARD}/cores/arduino -I${RISCDUINO_BOARD}/variants/standard ${RISCDUINO_BOARD}/cores/arduino/wiring.c -o wiring.c.o
+	${GCC_PREFIX}-gcc -c -O2 -march=rv32imac -fpeel-loops -ffreestanding -ffunction-sections -fdata-sections -Wall -I${RISCDUINO_BOARD}/system/include -I${RISCDUINO_BOARD}/sdk/bsp/include -I${RISCDUINO_BOARD}/sdk/bsp/env -I${RISCDUINO_BOARD}/sdk/bsp/drivers -I${RISCDUINO_BOARD}/sdk/bsp/env/riscduino_score -include sys/cdefs.h -g -DARDUINO=10607 -DF_CPU=50000000LL -DRISCDUINO_SCORE_DEVKIT -I${RISCDUINO_BOARD}/cores/arduino -I${RISCDUINO_BOARD}/variants/standard ${RISCDUINO_BOARD}/cores/arduino/wiring_analog.c -o wiring_analog.c.o
+	${GCC_PREFIX}-gcc -c -O2 -march=rv32imac -fpeel-loops -ffreestanding -ffunction-sections -fdata-sections -Wall -I${RISCDUINO_BOARD}/system/include -I${RISCDUINO_BOARD}/sdk/bsp/include -I${RISCDUINO_BOARD}/sdk/bsp/env -I${RISCDUINO_BOARD}/sdk/bsp/drivers -I${RISCDUINO_BOARD}/sdk/bsp/env/riscduino_score -include sys/cdefs.h -g -DARDUINO=10607 -DF_CPU=50000000LL -DRISCDUINO_SCORE_DEVKIT -I${RISCDUINO_BOARD}/cores/arduino -I${RISCDUINO_BOARD}/variants/standard ${RISCDUINO_BOARD}/cores/arduino/wiring_digital.c -o wiring_digital.c.o
+	${GCC_PREFIX}-g++ -c -O2 -march=rv32imac -fpeel-loops -ffreestanding -ffunction-sections -fdata-sections -fpermissive -Wall -fno-rtti -fno-exceptions -I${RISCDUINO_BOARD}/system/include -I${RISCDUINO_BOARD}/sdk/bsp/include -I${RISCDUINO_BOARD}/sdk/bsp/env -I${RISCDUINO_BOARD}/sdk/bsp/drivers -I${RISCDUINO_BOARD}/sdk/bsp/env/riscduino_score -include sys/cdefs.h -g -DARDUINO=10607 -DF_CPU=50000000LL -DRISCDUINO_SCORE_DEVKIT -I${RISCDUINO_BOARD}/cores/arduino -I${RISCDUINO_BOARD}/variants/standard ${RISCDUINO_BOARD}/cores/arduino/wiring_pulse.cpp -o wiring_pulse.cpp.o
+	${GCC_PREFIX}-gcc -c -O2 -march=rv32imac -fpeel-loops -ffreestanding -ffunction-sections -fdata-sections -Wall -I${RISCDUINO_BOARD}/system/include -I${RISCDUINO_BOARD}/sdk/bsp/include -I${RISCDUINO_BOARD}/sdk/bsp/env -I${RISCDUINO_BOARD}/sdk/bsp/drivers -I${RISCDUINO_BOARD}/sdk/bsp/env/riscduino_score -include sys/cdefs.h -g -DARDUINO=10607 -DF_CPU=50000000LL -DRISCDUINO_SCORE_DEVKIT -I${RISCDUINO_BOARD}/cores/arduino -I${RISCDUINO_BOARD}/variants/standard ${RISCDUINO_BOARD}/cores/arduino/wiring_shift.c -o wiring_shift.c.o
+	${GCC_PREFIX}-ar rcs core.a Print.cpp.o
+	${GCC_PREFIX}-ar rcs core.a UARTClass.cpp.o
+	${GCC_PREFIX}-ar rcs core.a TIMERClass.cpp.o
+	${GCC_PREFIX}-ar rcs core.a WInterrupts.c.o
+	${GCC_PREFIX}-ar rcs core.a WMath.cpp.o
+	${GCC_PREFIX}-ar rcs core.a WString.cpp.o
+	${GCC_PREFIX}-ar rcs core.a abi.cpp.o
+	${GCC_PREFIX}-ar rcs core.a fe300prci_driver.c.o
+	${GCC_PREFIX}-ar rcs core.a plic_driver.c.o
+	${GCC_PREFIX}-ar rcs core.a entry.S.o
+	${GCC_PREFIX}-ar rcs core.a hooks.c.o
+	${GCC_PREFIX}-ar rcs core.a init.S.o
+	${GCC_PREFIX}-ar rcs core.a itoa.c.o
+	${GCC_PREFIX}-ar rcs core.a main.cpp.o
+	${GCC_PREFIX}-ar rcs core.a malloc.c.o
+	${GCC_PREFIX}-ar rcs core.a new.cpp.o
+	${GCC_PREFIX}-ar rcs core.a sbrk.c.o
+	${GCC_PREFIX}-ar rcs core.a start.S.o
+	${GCC_PREFIX}-ar rcs core.a wiring.c.o
+	${GCC_PREFIX}-ar rcs core.a wiring_analog.c.o
+	${GCC_PREFIX}-ar rcs core.a wiring_digital.c.o
+	${GCC_PREFIX}-ar rcs core.a wiring_pulse.cpp.o
+	${GCC_PREFIX}-ar rcs core.a wiring_shift.c.o
+	${GCC_PREFIX}-g++ -T ${RISCDUINO_BOARD}/sdk/bsp/env/riscduino_score/link.lds -nostartfiles -Wl,-N -Wl,--gc-sections -Wl,--wrap=malloc -Wl,--wrap=free -Wl,--wrap=sbrk ${PATTERN}.ino.cpp.o -nostdlib -Wl,--start-group core.a -lm -lstdc++ -lc -lgloss -Wl,--end-group -lgcc -o ${PATTERN}.elf
+	${GCC_PREFIX}-objcopy -R .rel.dyn -O binary ${PATTERN}.elf ${PATTERN}.bin
+	${GCC_PREFIX}-objcopy -R .rel.dyn -O verilog ${PATTERN}.elf ${PATTERN}.hex
+	${GCC_PREFIX}-objdump -D  ${PATTERN}.elf >   ${PATTERN}.dump
+	rm *.o *.a
+ifeq ($(SIM),RTL)
+   ifeq ($(DUMP),OFF)
+	iverilog -g2012 -DFUNCTIONAL -DSIM -I $(PDK_PATH) \
+	-f$(USER_PROJECT_VERILOG)/includes/includes.rtl.$(CONFIG) \
+	-f$(USER_PROJECT_VERILOG)/includes/includes.rtl.lib  \
+	$< -o $@ 
+    else  
+	iverilog -g2012 -DWFDUMP -DFUNCTIONAL -DSIM -I $(PDK_PATH) \
+	-f$(USER_PROJECT_VERILOG)/includes/includes.rtl.$(CONFIG) \
+	-f$(USER_PROJECT_VERILOG)/includes/includes.rtl.lib  \
+	$< -o $@ 
+   endif
+else  
+   ifeq ($(DUMP),OFF)
+	iverilog -g2012 -DFUNCTIONAL -DUSE_POWER_PINS -DGL -I $(PDK_PATH) \
+	-f$(USER_PROJECT_VERILOG)/includes/includes.gl.$(CONFIG) \
+	-f$(USER_PROJECT_VERILOG)/includes/includes.gl.lib \
+	$< -o $@ 
+    else  
+	iverilog -g2012 -DWFDUMP -DFUNCTIONAL -DUSE_POWER_PINS -DGL -I $(PDK_PATH) \
+	-f$(USER_PROJECT_VERILOG)/includes/includes.gl.$(CONFIG) \
+	-f$(USER_PROJECT_VERILOG)/includes/includes.gl.lib \
+	$< -o $@ 
+   endif
+endif
+
+%.vcd: %.vvp
+	vvp $< +risc_core_id=$(RISC_CORE)
+
+
+# ---- Clean ----
+
+clean:
+	rm -f *.elf *.hex *.bin *.vvp *.vcd *.log *.dump *.a *.o
+
+.PHONY: clean hex all
diff --git a/verilog/dv/arduino_timer_intr/arduino_timer_intr.ino b/verilog/dv/arduino_timer_intr/arduino_timer_intr.ino
new file mode 100644
index 0000000..f38f333
--- /dev/null
+++ b/verilog/dv/arduino_timer_intr/arduino_timer_intr.ino
@@ -0,0 +1,81 @@
+
+/*
+
+  Analog input, analog output, serial output
+
+  Reads an analog input pin, maps the result to a range from 0 to 255 and uses
+
+  the result to set the pulse width modulation (PWM) of an output pin.
+
+  Also prints the results to the Serial Monitor.
+
+  The circuit:
+
+  - potentiometer connected to analog pin 0.
+
+    Center pin of the potentiometer goes to the analog pin.
+
+    side pins of the potentiometer go to +5V and ground
+
+  - LED connected from digital pin 9 to ground
+
+  created 29 Dec. 2008
+
+  modified 9 Apr 2012
+
+  by Tom Igoe
+
+  This example code is in the public domain.
+
+  http://www.arduino.cc/en/Tutorial/AnalogInOutSerial
+
+*/
+
+#include"Arduino.h"
+// These constants won't change. They're used to give names to the pins used:
+
+
+int but1=2;  
+int but2=3;  
+
+
+int Timer_us =0;
+int Timer_ms =0;
+void setup() {
+
+  Timer.begin();  
+  Timer.enable(0, TIMER_MICRO_STEP, 10); // 10 Micro Second
+  Timer.enable(1, TIMER_MILLI_STEP, 1); // 1 Milli Second
+  // initialize serial communications at 9600 bps:
+  Serial.begin(9600);
+  attachInterrupt(timerToInterrupt(0),timer_us_intr,RISING);  
+  attachInterrupt(timerToInterrupt(1),timer_ms_intr,RISING);  
+
+}
+
+void loop() {
+
+  delay(1);
+}
+
+
+void timer_us_intr()  
+ {  
+  Timer_us = Timer_us + 1;
+  if(Timer_us > 255) Timer_us = 0;;   
+  
+  Serial.print("Micro Second: ");
+  Serial.println(Timer_us);
+
+
+  }  
+void timer_ms_intr()  
+ {  
+  Timer_ms = Timer_ms + 1;
+  if(Timer_ms > 255) Timer_ms = 0;;   
+  
+  Serial.print("Milli Second: ");
+  Serial.println(Timer_ms);
+
+
+  }   
diff --git a/verilog/dv/arduino_timer_intr/arduino_timer_intr.ino.cpp b/verilog/dv/arduino_timer_intr/arduino_timer_intr.ino.cpp
new file mode 100644
index 0000000..5c6104b
--- /dev/null
+++ b/verilog/dv/arduino_timer_intr/arduino_timer_intr.ino.cpp
@@ -0,0 +1,64 @@
+
+/*
+Testing the Timer Interrupt 
+
+*/
+
+#include"Arduino.h"
+// These constants won't change. They're used to give names to the pins used:
+
+
+
+
+uint8_t Timer_us =0;
+uint8_t Timer_ms =0;
+void setup();
+void loop();
+void timer_us_intr();
+void timer_ms_intr();
+void setup() {
+
+  Timer.begin();  
+  Timer.enable(0, TIMER_MICRO_STEP, 400); // 1000 Micro Second
+  Timer.enable(1, TIMER_MILLI_STEP, 2); // 2 Milli Second
+  // initialize serial communications at 9600 bps:
+  Serial.begin(1152000);
+  attachInterrupt(timerToInterrupt(0),timer_us_intr,RISING);  
+  attachInterrupt(timerToInterrupt(1),timer_ms_intr,RISING);  
+
+}
+
+void loop() {
+
+  delay(1);
+
+}
+
+
+void timer_us_intr()  
+ {  
+  Timer_us = Timer_us + 1;
+  if(Timer_us > 255) Timer_us = 0;;   
+  
+  Serial.print("Timer-0 Step: ");
+  Serial.println(Timer_us);
+  if(Timer_us > 19) {
+    Timer.disable(0);
+  }
+
+
+
+  }  
+void timer_ms_intr()  
+ {  
+  Timer_ms = Timer_ms + 1;
+  if(Timer_ms > 255) Timer_ms = 0;;   
+  
+  Serial.print("Timer-1 Step: ");
+  Serial.println(Timer_ms);
+
+  if(Timer_ms > 4) {
+    Timer.disable(1);
+  }
+
+  }   
diff --git a/verilog/dv/arduino_timer_intr/arduino_timer_intr_tb.v b/verilog/dv/arduino_timer_intr/arduino_timer_intr_tb.v
new file mode 100644
index 0000000..4107a97
--- /dev/null
+++ b/verilog/dv/arduino_timer_intr/arduino_timer_intr_tb.v
@@ -0,0 +1,549 @@
+////////////////////////////////////////////////////////////////////////////
+// SPDX-FileCopyrightText:  2021 , Dinesh Annayya
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+// SPDX-License-Identifier: Apache-2.0
+// SPDX-FileContributor: Modified by Dinesh Annayya <dinesha@opencores.org>
+//////////////////////////////////////////////////////////////////////
+////                                                              ////
+////  Standalone User validation Test bench                       ////
+////                                                              ////
+////  This file is part of the riscdunio cores project            ////
+////  https://github.com/dineshannayya/riscdunio.git              ////
+////                                                              ////
+////  Description                                                 ////
+////   This is a standalone test bench to validate the            ////
+////   Digital core.                                              ////
+////   This test bench to validate Arduino Interrupt              ////
+////                                                              ////
+////  To Do:                                                      ////
+////    nothing                                                   ////
+////                                                              ////
+////  Author(s):                                                  ////
+////      - Dinesh Annayya, dinesh.annayya@gmail.com              ////
+////                                                              ////
+////  Revision :                                                  ////
+////    0.1 - 29th July 2022, Dinesh A                            ////
+////                                                              ////
+//////////////////////////////////////////////////////////////////////
+////                                                              ////
+//// Copyright (C) 2000 Authors and OPENCORES.ORG                 ////
+////                                                              ////
+//// This source file may be used and distributed without         ////
+//// restriction provided that this copyright statement is not    ////
+//// removed from the file and that any derivative work contains  ////
+//// the original copyright notice and the associated disclaimer. ////
+////                                                              ////
+//// This source file is free software; you can redistribute it   ////
+//// and/or modify it under the terms of the GNU Lesser General   ////
+//// Public License as published by the Free Software Foundation; ////
+//// either version 2.1 of the License, or (at your option) any   ////
+//// later version.                                               ////
+////                                                              ////
+//// This source is distributed in the hope that it will be       ////
+//// useful, but WITHOUT ANY WARRANTY; without even the implied   ////
+//// warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR      ////
+//// PURPOSE.  See the GNU Lesser General Public License for more ////
+//// details.                                                     ////
+////                                                              ////
+//// You should have received a copy of the GNU Lesser General    ////
+//// Public License along with this source; if not, download it   ////
+//// from http://www.opencores.org/lgpl.shtml                     ////
+////                                                              ////
+//////////////////////////////////////////////////////////////////////
+
+`default_nettype wire
+
+`timescale 1 ns / 1 ns
+
+`include "sram_macros/sky130_sram_2kbyte_1rw1r_32x512_8.v"
+`include "is62wvs1288.v"
+`include "uart_agent.v"
+
+`define TB_HEX "arduino_timer_intr.hex"
+`define TB_TOP arduino_timer_intr_tb
+
+module `TB_TOP;
+	reg clock;
+	reg wb_rst_i;
+	reg power1, power2;
+	reg power3, power4;
+
+        reg        wbd_ext_cyc_i;  // strobe/request
+        reg        wbd_ext_stb_i;  // strobe/request
+        reg [31:0] wbd_ext_adr_i;  // address
+        reg        wbd_ext_we_i;  // write
+        reg [31:0] wbd_ext_dat_i;  // data output
+        reg [3:0]  wbd_ext_sel_i;  // byte enable
+
+        wire [31:0] wbd_ext_dat_o;  // data input
+        wire        wbd_ext_ack_o;  // acknowlegement
+        wire        wbd_ext_err_o;  // error
+
+	// User I/O
+	wire [37:0] io_oeb;
+	wire [37:0] io_out;
+	wire [37:0] io_in;
+
+	wire gpio;
+	wire [37:0] mprj_io;
+	wire [7:0] mprj_io_0;
+	reg         test_fail;
+	reg [31:0] read_data;
+    //----------------------------------
+    // Uart Configuration
+    // ---------------------------------
+    reg [1:0]      uart_data_bit        ;
+    reg	       uart_stop_bits       ; // 0: 1 stop bit; 1: 2 stop bit;
+    reg	       uart_stick_parity    ; // 1: force even parity
+    reg	       uart_parity_en       ; // parity enable
+    reg	       uart_even_odd_parity ; // 0: odd parity; 1: even parity
+    
+    reg [7:0]      uart_data            ;
+    reg [15:0]     uart_divisor         ;	// divided by n * 16
+    reg [15:0]     uart_timeout         ;// wait time limit
+    
+    reg [15:0]     uart_rx_nu           ;
+    reg [15:0]     uart_tx_nu           ;
+    reg [7:0]      uart_write_data [0:39];
+    reg 	       uart_fifo_enable     ;	// fifo mode disable
+	reg            flag                 ;
+    reg            compare_start        ; // User Need to make sure that compare start match with RiscV core completing initial booting
+
+	reg [31:0]     check_sum            ;
+        
+	integer    d_risc_id;
+
+         integer i,j;
+
+
+
+
+	// 50Mhz CLock
+	always #10 clock <= (clock === 1'b0);
+
+	initial begin
+		clock = 0;
+	    flag  = 0;
+        compare_start = 0;
+        wbd_ext_cyc_i ='h0;  // strobe/request
+        wbd_ext_stb_i ='h0;  // strobe/request
+        wbd_ext_adr_i ='h0;  // address
+        wbd_ext_we_i  ='h0;  // write
+        wbd_ext_dat_i ='h0;  // data output
+        wbd_ext_sel_i ='h0;  // byte enable
+	end
+
+	`ifdef WFDUMP
+	   initial begin
+	   	$dumpfile("simx.vcd");
+	   	$dumpvars(3, `TB_TOP);
+	   	$dumpvars(0, `TB_TOP.u_top.u_riscv_top);
+	   	$dumpvars(0, `TB_TOP.u_top.u_pinmux);
+	   	$dumpvars(0, `TB_TOP.u_top.u_uart_i2c_usb_spi);
+	   end
+       `endif
+
+
+	wire [15:0] irq_lines = u_top.u_pinmux.u_glbl_reg.irq_lines;
+
+
+
+       /*************************************************************************
+       * This is Baud Rate to clock divider conversion for Test Bench
+       * Note: DUT uses 16x baud clock, where are test bench uses directly
+       * baud clock, Due to 16x Baud clock requirement at RTL, there will be
+       * some resolution loss, we expect at lower baud rate this resolution
+       * loss will be less. For Quick simulation perpose higher baud rate used
+       * *************************************************************************/
+       task tb_set_uart_baud;
+       input [31:0] ref_clk;
+       input [31:0] baud_rate;
+       output [31:0] baud_div;
+       reg   [31:0] baud_div;
+       begin
+	  // for 230400 Baud = (50Mhz/230400) = 216.7
+	  baud_div = ref_clk/baud_rate; // Get the Bit Baud rate
+	  // Baud 16x = 216/16 = 13
+          baud_div = baud_div/16; // To find the RTL baud 16x div value to find similar resolution loss in test bench
+	  // Test bench baud clock , 16x of above value
+	  // 13 * 16 = 208,  
+	  // (Note if you see original value was 216, now it's 208 )
+          baud_div = baud_div * 16;
+	  // Test bench half cycle counter to toggle it 
+	  // 208/2 = 104
+           baud_div = baud_div/2;
+	  //As counter run's from 0 , substract from 1
+	   baud_div = baud_div-1;
+       end
+       endtask
+       
+
+
+	initial begin
+
+
+        uart_data_bit           = 2'b11;
+        uart_stop_bits          = 0; // 0: 1 stop bit; 1: 2 stop bit;
+        uart_stick_parity       = 0; // 1: force even parity
+        uart_parity_en          = 0; // parity enable
+        uart_even_odd_parity    = 1; // 0: odd parity; 1: even parity
+	    tb_set_uart_baud(50000000,1152000,uart_divisor);// 50Mhz Ref clock, Baud Rate: 230400
+        uart_timeout            = 2000;// wait time limit
+        uart_fifo_enable        = 0;	// fifo mode disable
+
+		$value$plusargs("risc_core_id=%d", d_risc_id);
+
+		#200; // Wait for reset removal
+	    repeat (10) @(posedge clock);
+		$display("Monitor: Standalone User Risc Boot Test Started");
+
+		// Remove Wb Reset
+		wb_user_core_write(`ADDR_SPACE_WBHOST+`WBHOST_GLBL_CFG,'h1);
+
+	    repeat (2) @(posedge clock);
+		#1;
+        // Remove all the reset
+        if(d_risc_id == 0) begin
+             $display("STATUS: Working with Risc core 0");
+             wb_user_core_write(`ADDR_SPACE_GLBL+`GLBL_CFG_CFG0,'h11F);
+        end else if(d_risc_id == 1) begin
+             $display("STATUS: Working with Risc core 1");
+             wb_user_core_write(`ADDR_SPACE_GLBL+`GLBL_CFG_CFG0,'h21F);
+        end else if(d_risc_id == 2) begin
+             $display("STATUS: Working with Risc core 2");
+             wb_user_core_write(`ADDR_SPACE_GLBL+`GLBL_CFG_CFG0,'h41F);
+        end else if(d_risc_id == 3) begin
+             $display("STATUS: Working with Risc core 3");
+             wb_user_core_write(`ADDR_SPACE_GLBL+`GLBL_CFG_CFG0,'h81F);
+        end
+
+        repeat (100) @(posedge clock);  // wait for Processor Get Ready
+
+	    tb_uart.debug_mode = 0; // disable debug display
+        tb_uart.uart_init;
+        tb_uart.control_setup (uart_data_bit, uart_stop_bits, uart_parity_en, uart_even_odd_parity, 
+                                       uart_stick_parity, uart_timeout, uart_divisor);
+
+        repeat (55000) @(posedge clock);  // wait for Processor Get Ready
+	    flag  = 0;
+		check_sum = 0;
+        compare_start = 1;
+        
+        fork
+
+           begin
+              while(flag == 0)
+              begin
+                 tb_uart.read_char(read_data,flag);
+		         if(flag == 0)  begin
+		            $write ("%c",read_data);
+		            check_sum = check_sum+read_data;
+		         end
+              end
+           end
+           begin
+              repeat (510000) @(posedge clock);  // wait for Processor Get Ready
+           end
+           join_any
+        
+           #1000
+           tb_uart.report_status(uart_rx_nu, uart_tx_nu);
+        
+           test_fail = 0;
+
+		   $display("Total Rx Char: %d Check Sum : %x ",uart_rx_nu, check_sum);
+           // Check 
+           // if all the 102 byte received
+           // if no error 
+           if(uart_rx_nu != 436) test_fail = 1;
+           if(check_sum != 32'h78cd) test_fail = 1;
+           if(tb_uart.err_cnt != 0) test_fail = 1;
+
+	   
+	    	$display("###################################################");
+          	if(test_fail == 0) begin
+		   `ifdef GL
+	    	       $display("Monitor: Standalone String (GL) Passed");
+		   `else
+		       $display("Monitor: Standalone String (RTL) Passed");
+		   `endif
+	        end else begin
+		    `ifdef GL
+	    	        $display("Monitor: Standalone String (GL) Failed");
+		    `else
+		        $display("Monitor: Standalone String (RTL) Failed");
+		    `endif
+		 end
+	    	$display("###################################################");
+	    $finish;
+	end
+
+	initial begin
+		wb_rst_i <= 1'b1;
+		#100;
+		wb_rst_i <= 1'b0;	    	// Release reset
+	end
+wire USER_VDD1V8 = 1'b1;
+wire VSS = 1'b0;
+
+user_project_wrapper u_top(
+`ifdef USE_POWER_PINS
+    .vccd1(USER_VDD1V8),	// User area 1 1.8V supply
+    .vssd1(VSS),	// User area 1 digital ground
+`endif
+    .wb_clk_i        (clock),  // System clock
+    .user_clock2     (1'b1),  // Real-time clock
+    .wb_rst_i        (wb_rst_i),  // Regular Reset signal
+
+    .wbs_cyc_i   (wbd_ext_cyc_i),  // strobe/request
+    .wbs_stb_i   (wbd_ext_stb_i),  // strobe/request
+    .wbs_adr_i   (wbd_ext_adr_i),  // address
+    .wbs_we_i    (wbd_ext_we_i),  // write
+    .wbs_dat_i   (wbd_ext_dat_i),  // data output
+    .wbs_sel_i   (wbd_ext_sel_i),  // byte enable
+
+    .wbs_dat_o   (wbd_ext_dat_o),  // data input
+    .wbs_ack_o   (wbd_ext_ack_o),  // acknowlegement
+
+ 
+    // Logic Analyzer Signals
+    .la_data_in      ('1) ,
+    .la_data_out     (),
+    .la_oenb         ('0),
+ 
+
+    // IOs
+    .io_in          (io_in)  ,
+    .io_out         (io_out) ,
+    .io_oeb         (io_oeb) ,
+
+    .user_irq       () 
+
+);
+// SSPI Slave I/F
+assign io_in[5]  = 1'b1; // RESET
+//assign io_in[16] = 1'b0 ; // SPIS SCK 
+
+`ifndef GL // Drive Power for Hold Fix Buf
+    // All standard cell need power hook-up for functionality work
+    initial begin
+
+    end
+`endif    
+
+//------------------------------------------------------
+//  Integrate the Serial flash with qurd support to
+//  user core using the gpio pads
+//  ----------------------------------------------------
+
+   wire flash_clk = io_out[28];
+   wire flash_csb = io_out[29];
+   // Creating Pad Delay
+   wire #1 io_oeb_29 = io_oeb[33];
+   wire #1 io_oeb_30 = io_oeb[34];
+   wire #1 io_oeb_31 = io_oeb[35];
+   wire #1 io_oeb_32 = io_oeb[36];
+   tri  #1 flash_io0 = (io_oeb_29== 1'b0) ? io_out[33] : 1'bz;
+   tri  #1 flash_io1 = (io_oeb_30== 1'b0) ? io_out[34] : 1'bz;
+   tri  #1 flash_io2 = (io_oeb_31== 1'b0) ? io_out[35] : 1'bz;
+   tri  #1 flash_io3 = (io_oeb_32== 1'b0) ? io_out[36] : 1'bz;
+
+   assign io_in[33] = flash_io0;
+   assign io_in[34] = flash_io1;
+   assign io_in[35] = flash_io2;
+   assign io_in[36] = flash_io3;
+
+   // Quard flash
+     s25fl256s #(.mem_file_name(`TB_HEX),
+	         .otp_file_name("none"),
+                 .TimingModel("S25FL512SAGMFI010_F_30pF")) 
+		 u_spi_flash_256mb (
+           // Data Inputs/Outputs
+       .SI      (flash_io0),
+       .SO      (flash_io1),
+       // Controls
+       .SCK     (flash_clk),
+       .CSNeg   (flash_csb),
+       .WPNeg   (flash_io2),
+       .HOLDNeg (flash_io3),
+       .RSTNeg  (!wb_rst_i)
+
+       );
+
+   wire spiram_csb = io_out[31];
+
+   is62wvs1288 #(.mem_file_name("none"))
+	u_sram (
+         // Data Inputs/Outputs
+           .io0     (flash_io0),
+           .io1     (flash_io1),
+           // Controls
+           .clk    (flash_clk),
+           .csb    (spiram_csb),
+           .io2    (flash_io2),
+           .io3    (flash_io3)
+    );
+//---------------------------
+//  UART Agent integration
+// --------------------------
+wire uart_txd,uart_rxd;
+
+assign uart_txd   = io_out[7];
+assign io_in[6]  = uart_rxd ;
+ 
+uart_agent tb_uart(
+	.mclk                (clock              ),
+	.txd                 (uart_rxd           ),
+	.rxd                 (uart_txd           )
+	);
+
+
+//----------------------------
+// All the task are defined here
+//----------------------------
+
+
+
+task wb_user_core_write;
+input [31:0] address;
+input [31:0] data;
+begin
+  repeat (1) @(posedge clock);
+  #1;
+  wbd_ext_adr_i =address;  // address
+  wbd_ext_we_i  ='h1;  // write
+  wbd_ext_dat_i =data;  // data output
+  wbd_ext_sel_i ='hF;  // byte enable
+  wbd_ext_cyc_i ='h1;  // strobe/request
+  wbd_ext_stb_i ='h1;  // strobe/request
+  wait(wbd_ext_ack_o == 1);
+  repeat (1) @(posedge clock);
+  #1;
+  wbd_ext_cyc_i ='h0;  // strobe/request
+  wbd_ext_stb_i ='h0;  // strobe/request
+  wbd_ext_adr_i ='h0;  // address
+  wbd_ext_we_i  ='h0;  // write
+  wbd_ext_dat_i ='h0;  // data output
+  wbd_ext_sel_i ='h0;  // byte enable
+  $display("DEBUG WB USER ACCESS WRITE Address : %x, Data : %x",address,data);
+  repeat (2) @(posedge clock);
+end
+endtask
+
+task  wb_user_core_read;
+input [31:0] address;
+output [31:0] data;
+reg    [31:0] data;
+begin
+  repeat (1) @(posedge clock);
+  #1;
+  wbd_ext_adr_i =address;  // address
+  wbd_ext_we_i  ='h0;  // write
+  wbd_ext_dat_i ='0;  // data output
+  wbd_ext_sel_i ='hF;  // byte enable
+  wbd_ext_cyc_i ='h1;  // strobe/request
+  wbd_ext_stb_i ='h1;  // strobe/request
+  wait(wbd_ext_ack_o == 1);
+  repeat (1) @(negedge clock);
+  data  = wbd_ext_dat_o;  
+  repeat (1) @(posedge clock);
+  #1;
+  wbd_ext_cyc_i ='h0;  // strobe/request
+  wbd_ext_stb_i ='h0;  // strobe/request
+  wbd_ext_adr_i ='h0;  // address
+  wbd_ext_we_i  ='h0;  // write
+  wbd_ext_dat_i ='h0;  // data output
+  wbd_ext_sel_i ='h0;  // byte enable
+  $display("DEBUG WB USER ACCESS READ Address : %x, Data : %x",address,data);
+  repeat (2) @(posedge clock);
+end
+endtask
+
+task  wb_user_core_read_check;
+input [31:0] address;
+output [31:0] data;
+input [31:0] cmp_data;
+reg    [31:0] data;
+begin
+  repeat (1) @(posedge clock);
+  #1;
+  wbd_ext_adr_i =address;  // address
+  wbd_ext_we_i  ='h0;  // write
+  wbd_ext_dat_i ='0;  // data output
+  wbd_ext_sel_i ='hF;  // byte enable
+  wbd_ext_cyc_i ='h1;  // strobe/request
+  wbd_ext_stb_i ='h1;  // strobe/request
+  wait(wbd_ext_ack_o == 1);
+  repeat (1) @(negedge clock);
+  data  = wbd_ext_dat_o;  
+  repeat (1) @(posedge clock);
+  #1;
+  wbd_ext_cyc_i ='h0;  // strobe/request
+  wbd_ext_stb_i ='h0;  // strobe/request
+  wbd_ext_adr_i ='h0;  // address
+  wbd_ext_we_i  ='h0;  // write
+  wbd_ext_dat_i ='h0;  // data output
+  wbd_ext_sel_i ='h0;  // byte enable
+  if(data !== cmp_data) begin
+     $display("ERROR : WB USER ACCESS READ  Address : 0x%x, Exd: 0x%x Rxd: 0x%x ",address,cmp_data,data);
+     test_fail = 1;
+  end else begin
+     $display("STATUS: WB USER ACCESS READ  Address : 0x%x, Data : 0x%x",address,data);
+  end
+  repeat (2) @(posedge clock);
+end
+endtask
+
+`ifdef GL
+
+wire        wbd_spi_stb_i   = u_top.u_qspi_master.wbd_stb_i;
+wire        wbd_spi_ack_o   = u_top.u_qspi_master.wbd_ack_o;
+wire        wbd_spi_we_i    = u_top.u_qspi_master.wbd_we_i;
+wire [31:0] wbd_spi_adr_i   = u_top.u_qspi_master.wbd_adr_i;
+wire [31:0] wbd_spi_dat_i   = u_top.u_qspi_master.wbd_dat_i;
+wire [31:0] wbd_spi_dat_o   = u_top.u_qspi_master.wbd_dat_o;
+wire [3:0]  wbd_spi_sel_i   = u_top.u_qspi_master.wbd_sel_i;
+
+wire        wbd_uart_stb_i  = u_top.u_uart_i2c_usb_spi.reg_cs;
+wire        wbd_uart_ack_o  = u_top.u_uart_i2c_usb_spi.reg_ack;
+wire        wbd_uart_we_i   = u_top.u_uart_i2c_usb_spi.reg_wr;
+wire [8:0]  wbd_uart_adr_i  = u_top.u_uart_i2c_usb_spi.reg_addr;
+wire [7:0]  wbd_uart_dat_i  = u_top.u_uart_i2c_usb_spi.reg_wdata;
+wire [7:0]  wbd_uart_dat_o  = u_top.u_uart_i2c_usb_spi.reg_rdata;
+wire        wbd_uart_sel_i  = u_top.u_uart_i2c_usb_spi.reg_be;
+
+`endif
+
+/**
+`ifdef GL
+//-----------------------------------------------------------------------------
+// RISC IMEM amd DMEM Monitoring TASK
+//-----------------------------------------------------------------------------
+
+`define RISC_CORE  user_uart_tb.u_top.u_core.u_riscv_top
+
+always@(posedge `RISC_CORE.wb_clk) begin
+    if(`RISC_CORE.wbd_imem_ack_i)
+          $display("RISCV-DEBUG => IMEM ADDRESS: %x Read Data : %x", `RISC_CORE.wbd_imem_adr_o,`RISC_CORE.wbd_imem_dat_i);
+    if(`RISC_CORE.wbd_dmem_ack_i && `RISC_CORE.wbd_dmem_we_o)
+          $display("RISCV-DEBUG => DMEM ADDRESS: %x Write Data: %x Resonse: %x", `RISC_CORE.wbd_dmem_adr_o,`RISC_CORE.wbd_dmem_dat_o);
+    if(`RISC_CORE.wbd_dmem_ack_i && !`RISC_CORE.wbd_dmem_we_o)
+          $display("RISCV-DEBUG => DMEM ADDRESS: %x READ Data : %x Resonse: %x", `RISC_CORE.wbd_dmem_adr_o,`RISC_CORE.wbd_dmem_dat_i);
+end
+
+`endif
+**/
+endmodule
+`include "s25fl256s.sv"
+`default_nettype wire
diff --git a/verilog/dv/arduino_ws281x/Makefile b/verilog/dv/arduino_ws281x/Makefile
new file mode 100644
index 0000000..0a22bf8
--- /dev/null
+++ b/verilog/dv/arduino_ws281x/Makefile
@@ -0,0 +1,144 @@
+# SPDX-FileCopyrightText: 2020 Efabless Corporation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#      http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+# SPDX-License-Identifier: Apache-2.0
+
+
+# ---- Include Partitioned Makefiles ----
+
+CONFIG = caravel_user_project
+ 
+#######################################################################
+## Caravel Verilog for Integration Tests
+#######################################################################
+
+DESIGNS?=../../..
+TOOLS?=/opt/riscv32i/
+
+export USER_PROJECT_VERILOG ?=  $(DESIGNS)/verilog
+export RISCDUINO_BOARD ?=  $(USER_PROJECT_VERILOG)/dv/common/riscduino_board/custom_board/riscduino
+## YIFIVE FIRMWARE
+YIFIVE_FIRMWARE_PATH = $(USER_PROJECT_VERILOG)/dv/firmware
+GCC_PREFIX?=riscv32-unknown-elf
+
+
+## Simulation mode: RTL/GL
+SIM?=RTL
+DUMP?=OFF
+RISC_CORE?=0
+
+### To Enable IVERILOG FST DUMP
+export IVERILOG_DUMPER = fst
+
+
+.SUFFIXES:
+
+PATTERN = arduino_ws281x
+
+all:  ${PATTERN:=.vcd}
+
+
+vvp:  ${PATTERN:=.vvp}
+
+%.vvp: %_tb.v
+	${GCC_PREFIX}-g++ -c -O2 -march=rv32imac -fpeel-loops -ffreestanding -ffunction-sections -fdata-sections -fpermissive -Wall -fno-rtti -fno-exceptions -I${RISCDUINO_BOARD}/system/include -I${RISCDUINO_BOARD}/sdk/bsp/include -I${RISCDUINO_BOARD}/sdk/bsp/env -I${RISCDUINO_BOARD}/sdk/bsp/drivers -I${RISCDUINO_BOARD}/sdk/bsp/env/riscduino_score -include sys/cdefs.h -g -DARDUINO=10607 -DF_CPU=50000000LL -DRISCDUINO_SCORE_DEVKIT -I${RISCDUINO_BOARD}/cores/arduino -I${RISCDUINO_BOARD}/variants/standard ${PATTERN}.ino.cpp -I${RISCDUINO_BOARD}/libraries/WS281X/src -o ${PATTERN}.ino.cpp.o
+	${GCC_PREFIX}-g++ -c -O2 -march=rv32imac -fpeel-loops -ffreestanding -ffunction-sections -fdata-sections -fpermissive -Wall -fno-rtti -fno-exceptions -I${RISCDUINO_BOARD}/system/include -I${RISCDUINO_BOARD}/sdk/bsp/include -I${RISCDUINO_BOARD}/sdk/bsp/env -I${RISCDUINO_BOARD}/sdk/bsp/drivers -I${RISCDUINO_BOARD}/sdk/bsp/env/riscduino_score -include sys/cdefs.h -g -DARDUINO=10607 -DF_CPU=50000000LL -DRISCDUINO_SCORE_DEVKIT -I${RISCDUINO_BOARD}/cores/arduino -I${RISCDUINO_BOARD}/variants/standard ${RISCDUINO_BOARD}/cores/arduino/Print.cpp -o Print.cpp.o
+	${GCC_PREFIX}-g++ -c -O2 -march=rv32imac -fpeel-loops -ffreestanding -ffunction-sections -fdata-sections -fpermissive -Wall -fno-rtti -fno-exceptions -I${RISCDUINO_BOARD}/system/include -I${RISCDUINO_BOARD}/sdk/bsp/include -I${RISCDUINO_BOARD}/sdk/bsp/env -I${RISCDUINO_BOARD}/sdk/bsp/drivers -I${RISCDUINO_BOARD}/sdk/bsp/env/riscduino_score -include sys/cdefs.h -g -DARDUINO=10607 -DF_CPU=50000000LL -DRISCDUINO_SCORE_DEVKIT -I${RISCDUINO_BOARD}/cores/arduino -I${RISCDUINO_BOARD}/variants/standard ${RISCDUINO_BOARD}/cores/arduino/WMath.cpp -o WMath.cpp.o
+	${GCC_PREFIX}-g++ -c -O2 -march=rv32imac -fpeel-loops -ffreestanding -ffunction-sections -fdata-sections -fpermissive -Wall -fno-rtti -fno-exceptions -I${RISCDUINO_BOARD}/system/include -I${RISCDUINO_BOARD}/sdk/bsp/include -I${RISCDUINO_BOARD}/sdk/bsp/env -I${RISCDUINO_BOARD}/sdk/bsp/drivers -I${RISCDUINO_BOARD}/sdk/bsp/env/riscduino_score -include sys/cdefs.h -g -DARDUINO=10607 -DF_CPU=50000000LL -DRISCDUINO_SCORE_DEVKIT -I${RISCDUINO_BOARD}/cores/arduino -I${RISCDUINO_BOARD}/variants/standard ${RISCDUINO_BOARD}/cores/arduino/WString.cpp -o WString.cpp.o
+	${GCC_PREFIX}-gcc -c -O2 -march=rv32imac -fpeel-loops -ffreestanding -ffunction-sections -fdata-sections -Wall -I${RISCDUINO_BOARD}/system/include -I${RISCDUINO_BOARD}/sdk/bsp/include -I${RISCDUINO_BOARD}/sdk/bsp/env -I${RISCDUINO_BOARD}/sdk/bsp/drivers -I${RISCDUINO_BOARD}/sdk/bsp/env/riscduino_score -include sys/cdefs.h -g -DARDUINO=10607 -DF_CPU=50000000LL -DRISCDUINO_SCORE_DEVKIT -I${RISCDUINO_BOARD}/cores/arduino -I${RISCDUINO_BOARD}/variants/standard ${RISCDUINO_BOARD}/cores/arduino/WInterrupts.c -o WInterrupts.c.o
+	${GCC_PREFIX}-gcc -c -O2 -march=rv32imac -fpeel-loops -ffreestanding -ffunction-sections -fdata-sections -Wall -I${RISCDUINO_BOARD}/system/include -I${RISCDUINO_BOARD}/sdk/bsp/include -I${RISCDUINO_BOARD}/sdk/bsp/env -I${RISCDUINO_BOARD}/sdk/bsp/drivers -I${RISCDUINO_BOARD}/sdk/bsp/env/riscduino_score -include sys/cdefs.h -g -DARDUINO=10607 -DF_CPU=50000000LL -DRISCDUINO_SCORE_DEVKIT -I${RISCDUINO_BOARD}/cores/arduino -I${RISCDUINO_BOARD}/variants/standard ${RISCDUINO_BOARD}/cores/arduino/drivers/fe300prci/fe300prci_driver.c -o fe300prci_driver.c.o
+	${GCC_PREFIX}-g++ -c -O2 -march=rv32imac -fpeel-loops -ffreestanding -ffunction-sections -fdata-sections -fpermissive -Wall -fno-rtti -fno-exceptions -I${RISCDUINO_BOARD}/system/include -I${RISCDUINO_BOARD}/sdk/bsp/include -I${RISCDUINO_BOARD}/sdk/bsp/env -I${RISCDUINO_BOARD}/sdk/bsp/drivers -I${RISCDUINO_BOARD}/sdk/bsp/env/riscduino_score -include sys/cdefs.h -g -DARDUINO=10607 -DF_CPU=50000000LL -DRISCDUINO_SCORE_DEVKIT -I${RISCDUINO_BOARD}/cores/arduino -I${RISCDUINO_BOARD}/variants/standard ${RISCDUINO_BOARD}/cores/arduino/abi.cpp -o abi.cpp.o
+	${GCC_PREFIX}-gcc -c -O2 -march=rv32imac -fpeel-loops -ffreestanding -ffunction-sections -fdata-sections -Wall -I${RISCDUINO_BOARD}/system/include -I${RISCDUINO_BOARD}/sdk/bsp/include -I${RISCDUINO_BOARD}/sdk/bsp/env -I${RISCDUINO_BOARD}/sdk/bsp/drivers -I${RISCDUINO_BOARD}/sdk/bsp/env/riscduino_score -include sys/cdefs.h -g -DARDUINO=10607 -DF_CPU=50000000LL -DRISCDUINO_SCORE_DEVKIT -I${RISCDUINO_BOARD}/cores/arduino -I${RISCDUINO_BOARD}/variants/standard ${RISCDUINO_BOARD}/cores/arduino/drivers/plic/plic_driver.c -o plic_driver.c.o
+	${GCC_PREFIX}-g++ -c -O2 -march=rv32imac -fpeel-loops -ffreestanding -ffunction-sections -fdata-sections -fpermissive -Wall -fno-rtti -fno-exceptions -I${RISCDUINO_BOARD}/system/include -I${RISCDUINO_BOARD}/sdk/bsp/include -I${RISCDUINO_BOARD}/sdk/bsp/env -I${RISCDUINO_BOARD}/sdk/bsp/drivers -I${RISCDUINO_BOARD}/sdk/bsp/env/riscduino_score -include sys/cdefs.h -g -DARDUINO=10607 -DF_CPU=50000000LL -DRISCDUINO_SCORE_DEVKIT -I${RISCDUINO_BOARD}/cores/arduino -I${RISCDUINO_BOARD}/variants/standard ${RISCDUINO_BOARD}/cores/arduino/UARTClass.cpp -o UARTClass.cpp.o
+	${GCC_PREFIX}-g++ -c -O2 -march=rv32imac -fpeel-loops -ffreestanding -ffunction-sections -fdata-sections -fpermissive -Wall -fno-rtti -fno-exceptions -I${RISCDUINO_BOARD}/system/include -I${RISCDUINO_BOARD}/sdk/bsp/include -I${RISCDUINO_BOARD}/sdk/bsp/env -I${RISCDUINO_BOARD}/sdk/bsp/drivers -I${RISCDUINO_BOARD}/sdk/bsp/env/riscduino_score -include sys/cdefs.h -g -DARDUINO=10607 -DF_CPU=50000000LL -DRISCDUINO_SCORE_DEVKIT -I${RISCDUINO_BOARD}/cores/arduino -I${RISCDUINO_BOARD}/variants/standard ${RISCDUINO_BOARD}/cores/arduino/TIMERClass.cpp -o TIMERClass.cpp.o
+	${GCC_PREFIX}-g++ -c -O2 -march=rv32imac -fpeel-loops -ffreestanding -ffunction-sections -fdata-sections -fpermissive -Wall -fno-rtti -fno-exceptions -I${RISCDUINO_BOARD}/system/include -I${RISCDUINO_BOARD}/sdk/bsp/include -I${RISCDUINO_BOARD}/sdk/bsp/env -I${RISCDUINO_BOARD}/sdk/bsp/drivers -I${RISCDUINO_BOARD}/sdk/bsp/env/riscduino_score -include sys/cdefs.h -g -DARDUINO=10607 -DF_CPU=50000000LL -DRISCDUINO_SCORE_DEVKIT -I${RISCDUINO_BOARD}/cores/arduino -I${RISCDUINO_BOARD}/variants/standard -I${RISCDUINO_BOARD}/libraries/WS281X/src ${RISCDUINO_BOARD}/libraries/WS281X/src/WS281X.cpp -o WS281X.cpp.o
+	${GCC_PREFIX}-gcc -c -march=rv32imac -I${RISCDUINO_BOARD}/system/include -I${RISCDUINO_BOARD}/sdk/bsp/include -I${RISCDUINO_BOARD}/sdk/bsp/env -I${RISCDUINO_BOARD}/sdk/bsp/drivers -I${RISCDUINO_BOARD}/sdk/bsp/env/riscduino_score -g -DARDUINO=10607 -DF_CPU=50000000LL -DRISCDUINO_SCORE_DEVKIT -I${RISCDUINO_BOARD}/cores/arduino -I${RISCDUINO_BOARD}/variants/standard ${RISCDUINO_BOARD}/cores/arduino/entry.S -o entry.S.o
+	${GCC_PREFIX}-gcc -c -O2 -march=rv32imac -fpeel-loops -ffreestanding -ffunction-sections -fdata-sections -Wall -I${RISCDUINO_BOARD}/system/include -I${RISCDUINO_BOARD}/sdk/bsp/include -I${RISCDUINO_BOARD}/sdk/bsp/env -I${RISCDUINO_BOARD}/sdk/bsp/drivers -I${RISCDUINO_BOARD}/sdk/bsp/env/riscduino_score -include sys/cdefs.h -g -DARDUINO=10607 -DF_CPU=50000000LL -DRISCDUINO_SCORE_DEVKIT -I${RISCDUINO_BOARD}/cores/arduino -I${RISCDUINO_BOARD}/variants/standard ${RISCDUINO_BOARD}/cores/arduino/hooks.c -o hooks.c.o
+	${GCC_PREFIX}-gcc -c -march=rv32imac -I${RISCDUINO_BOARD}/system/include -I${RISCDUINO_BOARD}/sdk/bsp/include -I${RISCDUINO_BOARD}/sdk/bsp/env -I${RISCDUINO_BOARD}/sdk/bsp/drivers -I${RISCDUINO_BOARD}/sdk/bsp/env/riscduino_score -g -DARDUINO=10607 -DF_CPU=50000000LL -DRISCDUINO_SCORE_DEVKIT -I${RISCDUINO_BOARD}/cores/arduino -I${RISCDUINO_BOARD}/variants/standard ${RISCDUINO_BOARD}/cores/arduino/init.S -o init.S.o
+	${GCC_PREFIX}-gcc -c -O2 -march=rv32imac -fpeel-loops -ffreestanding -ffunction-sections -fdata-sections -Wall -I${RISCDUINO_BOARD}/system/include -I${RISCDUINO_BOARD}/sdk/bsp/include -I${RISCDUINO_BOARD}/sdk/bsp/env -I${RISCDUINO_BOARD}/sdk/bsp/drivers -I${RISCDUINO_BOARD}/sdk/bsp/env/riscduino_score -include sys/cdefs.h -g -DARDUINO=10607 -DF_CPU=50000000LL -DRISCDUINO_SCORE_DEVKIT -I${RISCDUINO_BOARD}/cores/arduino -I${RISCDUINO_BOARD}/variants/standard ${RISCDUINO_BOARD}/cores/arduino/itoa.c -o itoa.c.o
+	${GCC_PREFIX}-g++ -c -O2 -march=rv32imac -fpeel-loops -ffreestanding -ffunction-sections -fdata-sections -fpermissive -Wall -fno-rtti -fno-exceptions -I${RISCDUINO_BOARD}/system/include -I${RISCDUINO_BOARD}/sdk/bsp/include -I${RISCDUINO_BOARD}/sdk/bsp/env -I${RISCDUINO_BOARD}/sdk/bsp/drivers -I${RISCDUINO_BOARD}/sdk/bsp/env/riscduino_score -include sys/cdefs.h -g -DARDUINO=10607 -DF_CPU=50000000LL -DRISCDUINO_SCORE_DEVKIT -I${RISCDUINO_BOARD}/cores/arduino -I${RISCDUINO_BOARD}/variants/standard ${RISCDUINO_BOARD}/cores/arduino/main.cpp -o main.cpp.o
+	${GCC_PREFIX}-gcc -c -O2 -march=rv32imac -fpeel-loops -ffreestanding -ffunction-sections -fdata-sections -Wall -I${RISCDUINO_BOARD}/system/include -I${RISCDUINO_BOARD}/sdk/bsp/include -I${RISCDUINO_BOARD}/sdk/bsp/env -I${RISCDUINO_BOARD}/sdk/bsp/drivers -I${RISCDUINO_BOARD}/sdk/bsp/env/riscduino_score -include sys/cdefs.h -g -DARDUINO=10607 -DF_CPU=50000000LL -DRISCDUINO_SCORE_DEVKIT -I${RISCDUINO_BOARD}/cores/arduino -I${RISCDUINO_BOARD}/variants/standard ${RISCDUINO_BOARD}/cores/arduino/malloc.c -o malloc.c.o
+	${GCC_PREFIX}-g++ -c -O2 -march=rv32imac -fpeel-loops -ffreestanding -ffunction-sections -fdata-sections -fpermissive -Wall -fno-rtti -fno-exceptions -I${RISCDUINO_BOARD}/system/include -I${RISCDUINO_BOARD}/sdk/bsp/include -I${RISCDUINO_BOARD}/sdk/bsp/env -I${RISCDUINO_BOARD}/sdk/bsp/drivers -I${RISCDUINO_BOARD}/sdk/bsp/env/riscduino_score -include sys/cdefs.h -g -DARDUINO=10607 -DF_CPU=50000000LL -DRISCDUINO_SCORE_DEVKIT -I${RISCDUINO_BOARD}/cores/arduino -I${RISCDUINO_BOARD}/variants/standard ${RISCDUINO_BOARD}/cores/arduino/new.cpp -o new.cpp.o
+	${GCC_PREFIX}-gcc -c -O2 -march=rv32imac -fpeel-loops -ffreestanding -ffunction-sections -fdata-sections -Wall -I${RISCDUINO_BOARD}/system/include -I${RISCDUINO_BOARD}/sdk/bsp/include -I${RISCDUINO_BOARD}/sdk/bsp/env -I${RISCDUINO_BOARD}/sdk/bsp/drivers -I${RISCDUINO_BOARD}/sdk/bsp/env/riscduino_score -include sys/cdefs.h -g -DARDUINO=10607 -DF_CPU=50000000LL -DRISCDUINO_SCORE_DEVKIT -I${RISCDUINO_BOARD}/cores/arduino -I${RISCDUINO_BOARD}/variants/standard ${RISCDUINO_BOARD}/cores/arduino/sbrk.c -o sbrk.c.o
+	${GCC_PREFIX}-gcc -c -march=rv32imac -I${RISCDUINO_BOARD}/system/include -I${RISCDUINO_BOARD}/sdk/bsp/include -I${RISCDUINO_BOARD}/sdk/bsp/env -I${RISCDUINO_BOARD}/sdk/bsp/drivers -I${RISCDUINO_BOARD}/sdk/bsp/env/riscduino_score -g -DARDUINO=10607 -DF_CPU=50000000LL -DRISCDUINO_SCORE_DEVKIT -I${RISCDUINO_BOARD}/cores/arduino -I${RISCDUINO_BOARD}/variants/standard ${RISCDUINO_BOARD}/cores/arduino/start.S -o start.S.o
+	${GCC_PREFIX}-gcc -c -O2 -march=rv32imac -fpeel-loops -ffreestanding -ffunction-sections -fdata-sections -Wall -I${RISCDUINO_BOARD}/system/include -I${RISCDUINO_BOARD}/sdk/bsp/include -I${RISCDUINO_BOARD}/sdk/bsp/env -I${RISCDUINO_BOARD}/sdk/bsp/drivers -I${RISCDUINO_BOARD}/sdk/bsp/env/riscduino_score -include sys/cdefs.h -g -DARDUINO=10607 -DF_CPU=50000000LL -DRISCDUINO_SCORE_DEVKIT -I${RISCDUINO_BOARD}/cores/arduino -I${RISCDUINO_BOARD}/variants/standard ${RISCDUINO_BOARD}/cores/arduino/wiring.c -o wiring.c.o
+	${GCC_PREFIX}-gcc -c -O2 -march=rv32imac -fpeel-loops -ffreestanding -ffunction-sections -fdata-sections -Wall -I${RISCDUINO_BOARD}/system/include -I${RISCDUINO_BOARD}/sdk/bsp/include -I${RISCDUINO_BOARD}/sdk/bsp/env -I${RISCDUINO_BOARD}/sdk/bsp/drivers -I${RISCDUINO_BOARD}/sdk/bsp/env/riscduino_score -include sys/cdefs.h -g -DARDUINO=10607 -DF_CPU=50000000LL -DRISCDUINO_SCORE_DEVKIT -I${RISCDUINO_BOARD}/cores/arduino -I${RISCDUINO_BOARD}/variants/standard ${RISCDUINO_BOARD}/cores/arduino/wiring_analog.c -o wiring_analog.c.o
+	${GCC_PREFIX}-gcc -c -O2 -march=rv32imac -fpeel-loops -ffreestanding -ffunction-sections -fdata-sections -Wall -I${RISCDUINO_BOARD}/system/include -I${RISCDUINO_BOARD}/sdk/bsp/include -I${RISCDUINO_BOARD}/sdk/bsp/env -I${RISCDUINO_BOARD}/sdk/bsp/drivers -I${RISCDUINO_BOARD}/sdk/bsp/env/riscduino_score -include sys/cdefs.h -g -DARDUINO=10607 -DF_CPU=50000000LL -DRISCDUINO_SCORE_DEVKIT -I${RISCDUINO_BOARD}/cores/arduino -I${RISCDUINO_BOARD}/variants/standard ${RISCDUINO_BOARD}/cores/arduino/wiring_digital.c -o wiring_digital.c.o
+	${GCC_PREFIX}-g++ -c -O2 -march=rv32imac -fpeel-loops -ffreestanding -ffunction-sections -fdata-sections -fpermissive -Wall -fno-rtti -fno-exceptions -I${RISCDUINO_BOARD}/system/include -I${RISCDUINO_BOARD}/sdk/bsp/include -I${RISCDUINO_BOARD}/sdk/bsp/env -I${RISCDUINO_BOARD}/sdk/bsp/drivers -I${RISCDUINO_BOARD}/sdk/bsp/env/riscduino_score -include sys/cdefs.h -g -DARDUINO=10607 -DF_CPU=50000000LL -DRISCDUINO_SCORE_DEVKIT -I${RISCDUINO_BOARD}/cores/arduino -I${RISCDUINO_BOARD}/variants/standard ${RISCDUINO_BOARD}/cores/arduino/wiring_pulse.cpp -o wiring_pulse.cpp.o
+	${GCC_PREFIX}-gcc -c -O2 -march=rv32imac -fpeel-loops -ffreestanding -ffunction-sections -fdata-sections -Wall -I${RISCDUINO_BOARD}/system/include -I${RISCDUINO_BOARD}/sdk/bsp/include -I${RISCDUINO_BOARD}/sdk/bsp/env -I${RISCDUINO_BOARD}/sdk/bsp/drivers -I${RISCDUINO_BOARD}/sdk/bsp/env/riscduino_score -include sys/cdefs.h -g -DARDUINO=10607 -DF_CPU=50000000LL -DRISCDUINO_SCORE_DEVKIT -I${RISCDUINO_BOARD}/cores/arduino -I${RISCDUINO_BOARD}/variants/standard ${RISCDUINO_BOARD}/cores/arduino/wiring_shift.c -o wiring_shift.c.o
+	${GCC_PREFIX}-ar rcs core.a Print.cpp.o
+	${GCC_PREFIX}-ar rcs core.a UARTClass.cpp.o
+	${GCC_PREFIX}-ar rcs core.a TIMERClass.cpp.o
+	${GCC_PREFIX}-ar rcs core.a WS281X.cpp.o
+	${GCC_PREFIX}-ar rcs core.a WInterrupts.c.o
+	${GCC_PREFIX}-ar rcs core.a WMath.cpp.o
+	${GCC_PREFIX}-ar rcs core.a WString.cpp.o
+	${GCC_PREFIX}-ar rcs core.a abi.cpp.o
+	${GCC_PREFIX}-ar rcs core.a fe300prci_driver.c.o
+	${GCC_PREFIX}-ar rcs core.a plic_driver.c.o
+	${GCC_PREFIX}-ar rcs core.a entry.S.o
+	${GCC_PREFIX}-ar rcs core.a hooks.c.o
+	${GCC_PREFIX}-ar rcs core.a init.S.o
+	${GCC_PREFIX}-ar rcs core.a itoa.c.o
+	${GCC_PREFIX}-ar rcs core.a main.cpp.o
+	${GCC_PREFIX}-ar rcs core.a malloc.c.o
+	${GCC_PREFIX}-ar rcs core.a new.cpp.o
+	${GCC_PREFIX}-ar rcs core.a sbrk.c.o
+	${GCC_PREFIX}-ar rcs core.a start.S.o
+	${GCC_PREFIX}-ar rcs core.a wiring.c.o
+	${GCC_PREFIX}-ar rcs core.a wiring_analog.c.o
+	${GCC_PREFIX}-ar rcs core.a wiring_digital.c.o
+	${GCC_PREFIX}-ar rcs core.a wiring_pulse.cpp.o
+	${GCC_PREFIX}-ar rcs core.a wiring_shift.c.o
+	${GCC_PREFIX}-g++ -T ${RISCDUINO_BOARD}/sdk/bsp/env/riscduino_score/link.lds -nostartfiles -Wl,-N -Wl,--gc-sections -Wl,--wrap=malloc -Wl,--wrap=free -Wl,--wrap=sbrk ${PATTERN}.ino.cpp.o -nostdlib -Wl,--start-group core.a -lm -lstdc++ -lc -lgloss -Wl,--end-group -lgcc -o ${PATTERN}.elf
+	${GCC_PREFIX}-objcopy -R .rel.dyn -O binary ${PATTERN}.elf ${PATTERN}.bin
+	${GCC_PREFIX}-objcopy -R .rel.dyn -O verilog ${PATTERN}.elf ${PATTERN}.hex
+	${GCC_PREFIX}-objdump -D  ${PATTERN}.elf >   ${PATTERN}.dump
+	rm *.o *.a
+ifeq ($(SIM),RTL)
+   ifeq ($(DUMP),OFF)
+	iverilog -g2012 -DFUNCTIONAL -DSIM -I $(PDK_PATH) \
+	-f$(USER_PROJECT_VERILOG)/includes/includes.rtl.$(CONFIG) \
+	-f$(USER_PROJECT_VERILOG)/includes/includes.rtl.lib  \
+	$< -o $@ 
+    else  
+	iverilog -g2012 -DWFDUMP -DFUNCTIONAL -DSIM -I $(PDK_PATH) \
+	-f$(USER_PROJECT_VERILOG)/includes/includes.rtl.$(CONFIG) \
+	-f$(USER_PROJECT_VERILOG)/includes/includes.rtl.lib  \
+	$< -o $@ 
+   endif
+else  
+   ifeq ($(DUMP),OFF)
+	iverilog -g2012 -DFUNCTIONAL -DUSE_POWER_PINS -DGL -I $(PDK_PATH) \
+	-f$(USER_PROJECT_VERILOG)/includes/includes.gl.$(CONFIG) \
+	-f$(USER_PROJECT_VERILOG)/includes/includes.gl.lib \
+	$< -o $@ 
+    else  
+	iverilog -g2012 -DWFDUMP -DFUNCTIONAL -DUSE_POWER_PINS -DGL -I $(PDK_PATH) \
+	-f$(USER_PROJECT_VERILOG)/includes/includes.gl.$(CONFIG) \
+	-f$(USER_PROJECT_VERILOG)/includes/includes.gl.lib \
+	$< -o $@ 
+   endif
+endif
+
+%.vcd: %.vvp
+	vvp $< +risc_core_id=$(RISC_CORE)
+
+
+# ---- Clean ----
+
+clean:
+	rm -f *.elf *.hex *.bin *.vvp *.vcd *.log *.dump *.a *.o
+
+.PHONY: clean hex all
diff --git a/verilog/dv/arduino_ws281x/arduino_ws281x.ino b/verilog/dv/arduino_ws281x/arduino_ws281x.ino
new file mode 100644
index 0000000..20517d7
--- /dev/null
+++ b/verilog/dv/arduino_ws281x/arduino_ws281x.ino
@@ -0,0 +1,60 @@
+
+/*
+
+  Analog input, analog output, serial output
+
+  Reads an analog input pin, maps the result to a range from 0 to 255 and uses
+
+  the result to set the pulse width modulation (PWM) of an output pin.
+
+  Also prints the results to the Serial Monitor.
+
+  The circuit:
+
+  - potentiometer connected to analog pin 0.
+
+    Center pin of the potentiometer goes to the analog pin.
+
+    side pins of the potentiometer go to +5V and ground
+
+  - LED connected from digital pin 9 to ground
+
+  created 29 Dec. 2008
+
+  modified 9 Apr 2012
+
+  by Tom Igoe
+
+  This example code is in the public domain.
+
+  http://www.arduino.cc/en/Tutorial/AnalogInOutSerial
+
+*/
+
+#include"Arduino.h"
+// These constants won't change. They're used to give names to the pins used:
+
+
+int but1=2;  
+int but2=3;  
+
+
+void setup() {
+
+  ws281x.begin(WS2811_LOW_SPEED);  
+  ws281x.enable(2);
+}
+
+void loop() {
+
+  ws281x.write(2, 0x112233);
+  ws281x.write(2, 0x223344);
+  ws281x.write(2, 0x334455);
+  ws281x.write(2, 0x445566);
+  ws281x.write(2, 0x556677);
+  ws281x.write(2, 0x667788);
+  ws281x.write(2, 0x778899);
+  delay(1);
+}
+
+
diff --git a/verilog/dv/arduino_ws281x/arduino_ws281x.ino.cpp b/verilog/dv/arduino_ws281x/arduino_ws281x.ino.cpp
new file mode 100644
index 0000000..db5dc4a
--- /dev/null
+++ b/verilog/dv/arduino_ws281x/arduino_ws281x.ino.cpp
@@ -0,0 +1,135 @@
+#line 1 "/home/dinesha/Arduino/ws281x_example1/ws281x_example1.ino"
+
+/*
+
+  Analog input, analog output, serial output
+
+  Reads an analog input pin, maps the result to a range from 0 to 255 and uses
+
+  the result to set the pulse width modulation (PWM) of an output pin.
+
+  Also prints the results to the Serial Monitor.
+
+  The circuit:
+
+  - potentiometer connected to analog pin 0.
+
+    Center pin of the potentiometer goes to the analog pin.
+
+    side pins of the potentiometer go to +5V and ground
+
+  - LED connected from digital pin 9 to ground
+
+  created 29 Dec. 2008
+
+  modified 9 Apr 2012
+
+  by Tom Igoe
+
+  This example code is in the public domain.
+
+  http://www.arduino.cc/en/Tutorial/AnalogInOutSerial
+
+*/
+
+#include"Arduino.h"
+#include"WS281X.h"
+// These constants won't change. They're used to give names to the pins used:
+
+
+int port0 = 2;
+int port1 = 3;
+int port2 = 5;
+int port3 = 9;
+
+
+void setup();
+void loop();
+void setup() {
+
+  ws281x.begin(WS2811_HIGH_SPEED);  
+
+  // Enable WS_281X PORT-0
+  ws281x.enable(port0);
+  ws281x.write(port0, 0x112233);
+  ws281x.write(port0, 0x223344);
+  ws281x.write(port0, 0x334455);
+  ws281x.write(port0, 0x445566);
+  ws281x.write(port0, 0x556677);
+  ws281x.write(port0, 0x667788);
+  ws281x.write(port0, 0x778899);
+  ws281x.write(port0, 0x8899AA);
+  ws281x.write(port0, 0x99AABB);
+  ws281x.write(port0, 0xAABBCC);
+  ws281x.write(port0, 0xBBCCDD);
+  ws281x.write(port0, 0xCCDDEE);
+  ws281x.write(port0, 0xDDEEFF);
+  ws281x.write(port0, 0xEEFF00);
+  ws281x.write(port0, 0xFF0011);
+  ws281x.write(port0, 0x001122);
+  
+// Enable WS_281X PORT-1
+  ws281x.enable(port1);
+  ws281x.write(port1, 0x010203);
+  ws281x.write(port1, 0x020304);
+  ws281x.write(port1, 0x030405);
+  ws281x.write(port1, 0x040506);
+  ws281x.write(port1, 0x050607);
+  ws281x.write(port1, 0x060708);
+  ws281x.write(port1, 0x070809);
+  ws281x.write(port1, 0x08090A);
+  ws281x.write(port1, 0x090A0B);
+  ws281x.write(port1, 0x0A0B0C);
+  ws281x.write(port1, 0x0B0C0D);
+  ws281x.write(port1, 0x0C0D0E);
+  ws281x.write(port1, 0x0D0E0F);
+  ws281x.write(port1, 0x0E0F00);
+  ws281x.write(port1, 0x0F0001);
+  ws281x.write(port1, 0x000102);
+
+// Enable WS_281X PORT-2
+  ws281x.enable(port2);
+  ws281x.write(port2, 0x102030);
+  ws281x.write(port2, 0x203040);
+  ws281x.write(port2, 0x304050);
+  ws281x.write(port2, 0x405060);
+  ws281x.write(port2, 0x506070);
+  ws281x.write(port2, 0x607080);
+  ws281x.write(port2, 0x708090);
+  ws281x.write(port2, 0x8090A0);
+  ws281x.write(port2, 0x90A0B0);
+  ws281x.write(port2, 0xA0B0C0);
+  ws281x.write(port2, 0xB0C0D0);
+  ws281x.write(port2, 0xC0D0E0);
+  ws281x.write(port2, 0xD0E0F0);
+  ws281x.write(port2, 0xE0F000);
+  ws281x.write(port2, 0xF00010);
+  ws281x.write(port2, 0x001020);
+  
+// Enable WS_281X PORT-3
+  ws281x.enable(port3);
+  ws281x.write(port3, 0x012345);
+  ws281x.write(port3, 0x123456);
+  ws281x.write(port3, 0x234567);
+  ws281x.write(port3, 0x345678);
+  ws281x.write(port3, 0x456789);
+  ws281x.write(port3, 0x56789A);
+  ws281x.write(port3, 0x6789AB);
+  ws281x.write(port3, 0x789ABC);
+  ws281x.write(port3, 0x89ABCD);
+  ws281x.write(port3, 0x9ABCDE);
+  ws281x.write(port3, 0xABCDEF);
+  ws281x.write(port3, 0xBCDEF0);
+  ws281x.write(port3, 0xCDEF01);
+  ws281x.write(port3, 0xDEF012);
+  ws281x.write(port3, 0xEF0123);
+  ws281x.write(port3, 0xF01234);
+}
+
+void loop() {
+
+  delay(1);
+}
+
+
+
diff --git a/verilog/dv/arduino_ws281x/arduino_ws281x_tb.v b/verilog/dv/arduino_ws281x/arduino_ws281x_tb.v
new file mode 100644
index 0000000..a6cc886
--- /dev/null
+++ b/verilog/dv/arduino_ws281x/arduino_ws281x_tb.v
@@ -0,0 +1,572 @@
+////////////////////////////////////////////////////////////////////////////
+// SPDX-FileCopyrightText:  2021 , Dinesh Annayya
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+// SPDX-License-Identifier: Apache-2.0
+// SPDX-FileContributor: Modified by Dinesh Annayya <dinesha@opencores.org>
+//////////////////////////////////////////////////////////////////////
+////                                                              ////
+////  Standalone User validation Test bench                       ////
+////                                                              ////
+////  This file is part of the riscdunio cores project            ////
+////  https://github.com/dineshannayya/riscdunio.git              ////
+////                                                              ////
+////  Description                                                 ////
+////   This is a standalone test bench to validate the            ////
+////   Digital core.                                              ////
+////   This test bench to validate ws281x driver                  ////
+////                                                              ////
+////  To Do:                                                      ////
+////    nothing                                                   ////
+////                                                              ////
+////  Author(s):                                                  ////
+////      - Dinesh Annayya, dinesh.annayya@gmail.com              ////
+////                                                              ////
+////  Revision :                                                  ////
+////    0.1 - 29th July 2022, Dinesh A                            ////
+////                                                              ////
+//////////////////////////////////////////////////////////////////////
+////                                                              ////
+//// Copyright (C) 2000 Authors and OPENCORES.ORG                 ////
+////                                                              ////
+//// This source file may be used and distributed without         ////
+//// restriction provided that this copyright statement is not    ////
+//// removed from the file and that any derivative work contains  ////
+//// the original copyright notice and the associated disclaimer. ////
+////                                                              ////
+//// This source file is free software; you can redistribute it   ////
+//// and/or modify it under the terms of the GNU Lesser General   ////
+//// Public License as published by the Free Software Foundation; ////
+//// either version 2.1 of the License, or (at your option) any   ////
+//// later version.                                               ////
+////                                                              ////
+//// This source is distributed in the hope that it will be       ////
+//// useful, but WITHOUT ANY WARRANTY; without even the implied   ////
+//// warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR      ////
+//// PURPOSE.  See the GNU Lesser General Public License for more ////
+//// details.                                                     ////
+////                                                              ////
+//// You should have received a copy of the GNU Lesser General    ////
+//// Public License along with this source; if not, download it   ////
+//// from http://www.opencores.org/lgpl.shtml                     ////
+////                                                              ////
+//////////////////////////////////////////////////////////////////////
+
+`default_nettype wire
+
+`timescale 1 ns / 1 ns
+
+`include "sram_macros/sky130_sram_2kbyte_1rw1r_32x512_8.v"
+`include "is62wvs1288.v"
+`include "uart_agent.v"
+`include "bfm_ws281x.sv"
+
+`define TB_HEX "arduino_ws281x.hex"
+`define TB_TOP arduino_ws281x_tb
+
+module `TB_TOP;
+	reg clock;
+	reg wb_rst_i;
+	reg power1, power2;
+	reg power3, power4;
+
+        reg        wbd_ext_cyc_i;  // strobe/request
+        reg        wbd_ext_stb_i;  // strobe/request
+        reg [31:0] wbd_ext_adr_i;  // address
+        reg        wbd_ext_we_i;  // write
+        reg [31:0] wbd_ext_dat_i;  // data output
+        reg [3:0]  wbd_ext_sel_i;  // byte enable
+
+        wire [31:0] wbd_ext_dat_o;  // data input
+        wire        wbd_ext_ack_o;  // acknowlegement
+        wire        wbd_ext_err_o;  // error
+
+	// User I/O
+	wire [37:0] io_oeb;
+	wire [37:0] io_out;
+	wire [37:0] io_in;
+
+	wire gpio;
+	wire [37:0] mprj_io;
+	wire [7:0] mprj_io_0;
+	reg         test_fail;
+	reg [31:0] read_data;
+	reg            flag                 ;
+    reg            compare_start        ; // User Need to make sure that compare start match with RiscV core completing initial booting
+
+	reg [31:0]     rx_wcnt              ;
+	reg [31:0]     check_sum            ;
+        
+	integer    d_risc_id;
+
+         integer i,j;
+
+//-----------------------------------------------
+// WS281X BFM integration
+//----------------------------------------------
+parameter WS2811_LS  = 0;
+parameter WS2811_HS  = 1;
+parameter WS2812_HS  = 2;
+parameter WS2812S_HS = 3;
+parameter WS2812B_HS = 4;
+
+wire [3:0] ws281x_port ;
+reg        ws281x_enb ;
+
+
+
+	// 50Mhz CLock
+	always #10 clock <= (clock === 1'b0);
+
+	initial begin
+		clock = 0;
+	    flag  = 0;
+        compare_start = 0;
+        wbd_ext_cyc_i ='h0;  // strobe/request
+        wbd_ext_stb_i ='h0;  // strobe/request
+        wbd_ext_adr_i ='h0;  // address
+        wbd_ext_we_i  ='h0;  // write
+        wbd_ext_dat_i ='h0;  // data output
+        wbd_ext_sel_i ='h0;  // byte enable
+	end
+
+	`ifdef WFDUMP
+	   initial begin
+	   	$dumpfile("simx.vcd");
+	   	$dumpvars(3, `TB_TOP);
+	   	$dumpvars(0, `TB_TOP.u_top.u_riscv_top);
+	   	$dumpvars(0, `TB_TOP.u_top.u_pinmux);
+	   	$dumpvars(0, `TB_TOP.u_top.u_uart_i2c_usb_spi);
+	   end
+       `endif
+
+
+
+
+/**********************************************************************
+    Arduino Digital PinMapping
+* Pin Mapping    Arduino              ATMGE CONFIG
+*   ATMEGA328     Port                                        caravel Pin Mapping
+*   Pin-1         22            PC6/WS[0]/RESET*                digital_io[5]
+*   Pin-2         0             PD0/WS[0]/RXD[0]                digital_io[6]
+*   Pin-3         1             PD1/WS[0]/TXD[0]                digital_io[7]
+*   Pin-4         2             PD2/WS[0]/RXD[1]/INT0           digital_io[8]
+*   Pin-5         3             PD3/WS[1]INT1/OC2B(PWM0)        digital_io[9]
+*   Pin-6         4             PD4/WS[1]TXD[1]                 digital_io[10]
+*   Pin-7                       VCC                  -
+*   Pin-8                       GND                  -
+*   Pin-9         20            PB6/WS[1]/XTAL1/TOSC1           digital_io[11]
+*   Pin-10        21            PB7/WS[1]/XTAL2/TOSC2           digital_io[12]
+*   Pin-11        5             PD5/WS[2]/SS[3]/OC0B(PWM1)/T1   digital_io[13]
+*   Pin-12        6             PD6/WS[2]/SS[2]/OC0A(PWM2)/AIN0 digital_io[14]/analog_io[2]
+*   Pin-13        7             PD7/WS[2]/A1N1                  digital_io[15]/analog_io[3]
+*   Pin-14        8             PB0/WS[2]/CLKO/ICP1             digital_io[16]
+*   Pin-15        9             PB1/WS[3]/SS[1]OC1A(PWM3)       digital_io[17]
+*   Pin-16        10            PB2/WS[3]/SS[0]/OC1B(PWM4)      digital_io[18]
+*   Pin-17        11            PB3/WS[3]/MOSI/OC2A(PWM5)       digital_io[19]
+*   Pin-18        12            PB4/WS[3]/MISO                  digital_io[20]
+*   Pin-19        13            PB5/SCK                         digital_io[21]
+*   Pin-20                      AVCC                -
+*   Pin-21                      AREF                            analog_io[10]
+*   Pin-22                      GND                 -
+*   Pin-23        14            PC0/ADC0                        digital_io[22]/analog_io[11]
+*   Pin-24        15            PC1/ADC1                        digital_io[23]/analog_io[12]
+*   Pin-25        16            PC2/ADC2                        digital_io[24]/analog_io[13]
+*   Pin-26        17            PC3/ADC3                        digital_io[25]/analog_io[14]
+*   Pin-27        18            PC4/ADC4/SDA                    digital_io[26]/analog_io[15]
+*   Pin-28        19            PC5/ADC5/SCL                    digital_io[27]/analog_io[16]
+*****************************************************************************/
+
+
+	initial begin
+
+        ws281x_enb              = 0;
+
+		$value$plusargs("risc_core_id=%d", d_risc_id);
+
+		#200; // Wait for reset removal
+	    repeat (10) @(posedge clock);
+		$display("Monitor: Standalone User Risc Boot Test Started");
+
+		// Remove Wb Reset
+		wb_user_core_write(`ADDR_SPACE_WBHOST+`WBHOST_GLBL_CFG,'h1);
+
+	    repeat (2) @(posedge clock);
+		#1;
+        // Remove all the reset
+        if(d_risc_id == 0) begin
+             $display("STATUS: Working with Risc core 0");
+             wb_user_core_write(`ADDR_SPACE_GLBL+`GLBL_CFG_CFG0,'h11F);
+        end else if(d_risc_id == 1) begin
+             $display("STATUS: Working with Risc core 1");
+             wb_user_core_write(`ADDR_SPACE_GLBL+`GLBL_CFG_CFG0,'h21F);
+        end else if(d_risc_id == 2) begin
+             $display("STATUS: Working with Risc core 2");
+             wb_user_core_write(`ADDR_SPACE_GLBL+`GLBL_CFG_CFG0,'h41F);
+        end else if(d_risc_id == 3) begin
+             $display("STATUS: Working with Risc core 3");
+             wb_user_core_write(`ADDR_SPACE_GLBL+`GLBL_CFG_CFG0,'h81F);
+        end
+
+        repeat (100) @(posedge clock);  // wait for Processor Get Ready
+
+
+        repeat (40000) @(posedge clock);  // wait for Processor Get Ready
+        ws281x_enb = 1;
+	    flag  = 0;
+		check_sum = 0;
+        compare_start = 1;
+        
+        fork
+           begin
+              wait(u_ws281x_port0.rx_wcnt == 16);
+              wait(u_ws281x_port1.rx_wcnt == 16);
+              wait(u_ws281x_port2.rx_wcnt == 16);
+              wait(u_ws281x_port3.rx_wcnt == 16);
+           end
+           begin
+              repeat (300000) @(posedge clock);  // wait for Processor Get Ready
+           end
+           join_any
+        
+           #1000
+        
+           test_fail = 0;
+           rx_wcnt = u_ws281x_port0.rx_wcnt + u_ws281x_port1.rx_wcnt + u_ws281x_port2.rx_wcnt + u_ws281x_port3.rx_wcnt;
+           check_sum = u_ws281x_port0.check_sum + u_ws281x_port1.check_sum + u_ws281x_port2.check_sum + u_ws281x_port3.check_sum;
+
+		   $display("Total Rx Cnt: %d Check Sum : %x ",rx_wcnt, check_sum);
+           // Check 
+           // if all the 102 byte received
+           // if no error 
+           if(rx_wcnt != 64) test_fail = 1;
+           if(check_sum != 32'h2ffe8) test_fail = 1;
+
+	   
+	    	$display("###################################################");
+          	if(test_fail == 0) begin
+		   `ifdef GL
+	    	       $display("Monitor: Standalone String (GL) Passed");
+		   `else
+		       $display("Monitor: Standalone String (RTL) Passed");
+		   `endif
+	        end else begin
+		    `ifdef GL
+	    	        $display("Monitor: Standalone String (GL) Failed");
+		    `else
+		        $display("Monitor: Standalone String (RTL) Failed");
+		    `endif
+		 end
+	    	$display("###################################################");
+	    $finish;
+	end
+
+	initial begin
+		wb_rst_i <= 1'b1;
+		#100;
+		wb_rst_i <= 1'b0;	    	// Release reset
+	end
+wire USER_VDD1V8 = 1'b1;
+wire VSS = 1'b0;
+
+user_project_wrapper u_top(
+`ifdef USE_POWER_PINS
+    .vccd1(USER_VDD1V8),	// User area 1 1.8V supply
+    .vssd1(VSS),	// User area 1 digital ground
+`endif
+    .wb_clk_i        (clock),  // System clock
+    .user_clock2     (1'b1),  // Real-time clock
+    .wb_rst_i        (wb_rst_i),  // Regular Reset signal
+
+    .wbs_cyc_i   (wbd_ext_cyc_i),  // strobe/request
+    .wbs_stb_i   (wbd_ext_stb_i),  // strobe/request
+    .wbs_adr_i   (wbd_ext_adr_i),  // address
+    .wbs_we_i    (wbd_ext_we_i),  // write
+    .wbs_dat_i   (wbd_ext_dat_i),  // data output
+    .wbs_sel_i   (wbd_ext_sel_i),  // byte enable
+
+    .wbs_dat_o   (wbd_ext_dat_o),  // data input
+    .wbs_ack_o   (wbd_ext_ack_o),  // acknowlegement
+
+ 
+    // Logic Analyzer Signals
+    .la_data_in      ('1) ,
+    .la_data_out     (),
+    .la_oenb         ('0),
+ 
+
+    // IOs
+    .io_in          (io_in)  ,
+    .io_out         (io_out) ,
+    .io_oeb         (io_oeb) ,
+
+    .user_irq       () 
+
+);
+// SSPI Slave I/F
+assign io_in[0]  = 1'b1; // RESET
+//assign io_in[16] = 1'b0 ; // SPIS SCK 
+
+`ifndef GL // Drive Power for Hold Fix Buf
+    // All standard cell need power hook-up for functionality work
+    initial begin
+
+    end
+`endif    
+
+//------------------------------------------------------
+//  Integrate the Serial flash with qurd support to
+//  user core using the gpio pads
+//  ----------------------------------------------------
+
+   wire flash_clk = io_out[28];
+   wire flash_csb = io_out[29];
+   // Creating Pad Delay
+   wire #1 io_oeb_29 = io_oeb[33];
+   wire #1 io_oeb_30 = io_oeb[34];
+   wire #1 io_oeb_31 = io_oeb[35];
+   wire #1 io_oeb_32 = io_oeb[36];
+   tri  #1 flash_io0 = (io_oeb_29== 1'b0) ? io_out[33] : 1'bz;
+   tri  #1 flash_io1 = (io_oeb_30== 1'b0) ? io_out[34] : 1'bz;
+   tri  #1 flash_io2 = (io_oeb_31== 1'b0) ? io_out[35] : 1'bz;
+   tri  #1 flash_io3 = (io_oeb_32== 1'b0) ? io_out[36] : 1'bz;
+
+   assign io_in[33] = flash_io0;
+   assign io_in[34] = flash_io1;
+   assign io_in[35] = flash_io2;
+   assign io_in[36] = flash_io3;
+
+   // Quard flash
+     s25fl256s #(.mem_file_name(`TB_HEX),
+	         .otp_file_name("none"),
+                 .TimingModel("S25FL512SAGMFI010_F_30pF")) 
+		 u_spi_flash_256mb (
+           // Data Inputs/Outputs
+       .SI      (flash_io0),
+       .SO      (flash_io1),
+       // Controls
+       .SCK     (flash_clk),
+       .CSNeg   (flash_csb),
+       .WPNeg   (flash_io2),
+       .HOLDNeg (flash_io3),
+       .RSTNeg  (!wb_rst_i)
+
+       );
+
+   wire spiram_csb = io_out[31];
+
+   is62wvs1288 #(.mem_file_name("none"))
+	u_sram (
+         // Data Inputs/Outputs
+           .io0     (flash_io0),
+           .io1     (flash_io1),
+           // Controls
+           .clk    (flash_clk),
+           .csb    (spiram_csb),
+           .io2    (flash_io2),
+           .io3    (flash_io3)
+    );
+
+//-----------------------------------------------
+// WS281X BFM integration
+//----------------------------------------------
+assign ws281x_port[0] = io_out[8];
+
+bfm_ws281x #(
+              .PORT_ID(0),
+              .MODE(WS2811_HS)) u_ws281x_port0(
+                  .reset_n   (!wb_rst_i     ),
+                  .clk       (clock         ),
+                  .enb       (ws281x_enb    ),
+                  .rxd       (ws281x_port[0])
+               );
+
+//-----------------------------------------------
+// WS281X BFM integration
+//----------------------------------------------
+assign ws281x_port[1] = io_out[9];
+
+bfm_ws281x #(
+              .PORT_ID(1),
+              .MODE(WS2811_HS)) u_ws281x_port1(
+                  .reset_n   (!wb_rst_i     ),
+                  .clk       (clock         ),
+                  .enb       (ws281x_enb    ),
+                  .rxd       (ws281x_port[1])
+               );
+
+//-----------------------------------------------
+// WS281X BFM integration
+//----------------------------------------------
+assign ws281x_port[2] = io_out[13];
+
+bfm_ws281x #(
+              .PORT_ID(2),
+              .MODE(WS2811_HS)) u_ws281x_port2(
+                  .reset_n   (!wb_rst_i     ),
+                  .clk       (clock         ),
+                  .enb       (ws281x_enb    ),
+                  .rxd       (ws281x_port[2])
+               );
+
+//-----------------------------------------------
+// WS281X BFM integration
+//----------------------------------------------
+assign ws281x_port[3] = io_out[17];
+
+bfm_ws281x #(
+              .PORT_ID(3),
+              .MODE(WS2811_HS)) u_ws281x_port3(
+                  .reset_n   (!wb_rst_i     ),
+                  .clk       (clock         ),
+                  .enb       (ws281x_enb    ),
+                  .rxd       (ws281x_port[3])
+               );
+//----------------------------
+// All the task are defined here
+//----------------------------
+
+
+
+task wb_user_core_write;
+input [31:0] address;
+input [31:0] data;
+begin
+  repeat (1) @(posedge clock);
+  #1;
+  wbd_ext_adr_i =address;  // address
+  wbd_ext_we_i  ='h1;  // write
+  wbd_ext_dat_i =data;  // data output
+  wbd_ext_sel_i ='hF;  // byte enable
+  wbd_ext_cyc_i ='h1;  // strobe/request
+  wbd_ext_stb_i ='h1;  // strobe/request
+  wait(wbd_ext_ack_o == 1);
+  repeat (1) @(posedge clock);
+  #1;
+  wbd_ext_cyc_i ='h0;  // strobe/request
+  wbd_ext_stb_i ='h0;  // strobe/request
+  wbd_ext_adr_i ='h0;  // address
+  wbd_ext_we_i  ='h0;  // write
+  wbd_ext_dat_i ='h0;  // data output
+  wbd_ext_sel_i ='h0;  // byte enable
+  $display("DEBUG WB USER ACCESS WRITE Address : %x, Data : %x",address,data);
+  repeat (2) @(posedge clock);
+end
+endtask
+
+task  wb_user_core_read;
+input [31:0] address;
+output [31:0] data;
+reg    [31:0] data;
+begin
+  repeat (1) @(posedge clock);
+  #1;
+  wbd_ext_adr_i =address;  // address
+  wbd_ext_we_i  ='h0;  // write
+  wbd_ext_dat_i ='0;  // data output
+  wbd_ext_sel_i ='hF;  // byte enable
+  wbd_ext_cyc_i ='h1;  // strobe/request
+  wbd_ext_stb_i ='h1;  // strobe/request
+  wait(wbd_ext_ack_o == 1);
+  repeat (1) @(negedge clock);
+  data  = wbd_ext_dat_o;  
+  repeat (1) @(posedge clock);
+  #1;
+  wbd_ext_cyc_i ='h0;  // strobe/request
+  wbd_ext_stb_i ='h0;  // strobe/request
+  wbd_ext_adr_i ='h0;  // address
+  wbd_ext_we_i  ='h0;  // write
+  wbd_ext_dat_i ='h0;  // data output
+  wbd_ext_sel_i ='h0;  // byte enable
+  $display("DEBUG WB USER ACCESS READ Address : %x, Data : %x",address,data);
+  repeat (2) @(posedge clock);
+end
+endtask
+
+task  wb_user_core_read_check;
+input [31:0] address;
+output [31:0] data;
+input [31:0] cmp_data;
+reg    [31:0] data;
+begin
+  repeat (1) @(posedge clock);
+  #1;
+  wbd_ext_adr_i =address;  // address
+  wbd_ext_we_i  ='h0;  // write
+  wbd_ext_dat_i ='0;  // data output
+  wbd_ext_sel_i ='hF;  // byte enable
+  wbd_ext_cyc_i ='h1;  // strobe/request
+  wbd_ext_stb_i ='h1;  // strobe/request
+  wait(wbd_ext_ack_o == 1);
+  repeat (1) @(negedge clock);
+  data  = wbd_ext_dat_o;  
+  repeat (1) @(posedge clock);
+  #1;
+  wbd_ext_cyc_i ='h0;  // strobe/request
+  wbd_ext_stb_i ='h0;  // strobe/request
+  wbd_ext_adr_i ='h0;  // address
+  wbd_ext_we_i  ='h0;  // write
+  wbd_ext_dat_i ='h0;  // data output
+  wbd_ext_sel_i ='h0;  // byte enable
+  if(data !== cmp_data) begin
+     $display("ERROR : WB USER ACCESS READ  Address : 0x%x, Exd: 0x%x Rxd: 0x%x ",address,cmp_data,data);
+     test_fail = 1;
+  end else begin
+     $display("STATUS: WB USER ACCESS READ  Address : 0x%x, Data : 0x%x",address,data);
+  end
+  repeat (2) @(posedge clock);
+end
+endtask
+
+`ifdef GL
+
+wire        wbd_spi_stb_i   = u_top.u_qspi_master.wbd_stb_i;
+wire        wbd_spi_ack_o   = u_top.u_qspi_master.wbd_ack_o;
+wire        wbd_spi_we_i    = u_top.u_qspi_master.wbd_we_i;
+wire [31:0] wbd_spi_adr_i   = u_top.u_qspi_master.wbd_adr_i;
+wire [31:0] wbd_spi_dat_i   = u_top.u_qspi_master.wbd_dat_i;
+wire [31:0] wbd_spi_dat_o   = u_top.u_qspi_master.wbd_dat_o;
+wire [3:0]  wbd_spi_sel_i   = u_top.u_qspi_master.wbd_sel_i;
+
+wire        wbd_uart_stb_i  = u_top.u_uart_i2c_usb_spi.reg_cs;
+wire        wbd_uart_ack_o  = u_top.u_uart_i2c_usb_spi.reg_ack;
+wire        wbd_uart_we_i   = u_top.u_uart_i2c_usb_spi.reg_wr;
+wire [8:0]  wbd_uart_adr_i  = u_top.u_uart_i2c_usb_spi.reg_addr;
+wire [7:0]  wbd_uart_dat_i  = u_top.u_uart_i2c_usb_spi.reg_wdata;
+wire [7:0]  wbd_uart_dat_o  = u_top.u_uart_i2c_usb_spi.reg_rdata;
+wire        wbd_uart_sel_i  = u_top.u_uart_i2c_usb_spi.reg_be;
+
+`endif
+
+/**
+`ifdef GL
+//-----------------------------------------------------------------------------
+// RISC IMEM amd DMEM Monitoring TASK
+//-----------------------------------------------------------------------------
+
+`define RISC_CORE  user_uart_tb.u_top.u_core.u_riscv_top
+
+always@(posedge `RISC_CORE.wb_clk) begin
+    if(`RISC_CORE.wbd_imem_ack_i)
+          $display("RISCV-DEBUG => IMEM ADDRESS: %x Read Data : %x", `RISC_CORE.wbd_imem_adr_o,`RISC_CORE.wbd_imem_dat_i);
+    if(`RISC_CORE.wbd_dmem_ack_i && `RISC_CORE.wbd_dmem_we_o)
+          $display("RISCV-DEBUG => DMEM ADDRESS: %x Write Data: %x Resonse: %x", `RISC_CORE.wbd_dmem_adr_o,`RISC_CORE.wbd_dmem_dat_o);
+    if(`RISC_CORE.wbd_dmem_ack_i && !`RISC_CORE.wbd_dmem_we_o)
+          $display("RISCV-DEBUG => DMEM ADDRESS: %x READ Data : %x Resonse: %x", `RISC_CORE.wbd_dmem_adr_o,`RISC_CORE.wbd_dmem_dat_i);
+end
+
+`endif
+**/
+endmodule
+`include "s25fl256s.sv"
+`default_nettype wire
diff --git a/verilog/dv/bfm/bfm_ws281x.sv b/verilog/dv/bfm/bfm_ws281x.sv
new file mode 100644
index 0000000..6caa57c
--- /dev/null
+++ b/verilog/dv/bfm/bfm_ws281x.sv
@@ -0,0 +1,225 @@
+
+`timescale 1 ns / 1 ns
+
+module bfm_ws281x #(
+              parameter PORT_ID = 0,
+              parameter MODE    = 0) (
+                      input logic       reset_n,
+                      input logic       clk,
+                      input logic       enb,
+                      input logic       rxd
+                  );
+
+//---------------------------------------------------
+// Parameter decleration
+//---------------------------------------------------
+parameter WS2811_LS  = 0;
+parameter WS2811_HS  = 1;
+parameter WS2812_HS  = 2;
+parameter WS2812S_HS = 3;
+parameter WS2812B_HS = 4;
+
+
+parameter WS281X_LS_PERIOD =  2500 ;  // 400Khz - 2.5us 
+parameter WS281X_HS_PERIOD =  1250 ; // 800Khz - 1.25us
+
+parameter WS2811_LS_TOH    =  500    ;// 0.5us - 500ns
+parameter WS2811_LS_T1H    =  1200   ;// 1.2us - 1200ns
+
+parameter WS2811_HS_TOH    = 250     ;// 0.25us - 250ns
+parameter WS2811_HS_T1H    = 600     ;// 0.6us  - 600ns
+
+parameter WS2812_HS_TOH   = 350      ;// 0.35us - 350ns
+parameter WS2812_HS_T1H   = 700      ;// 0.7us  - 700ns
+
+parameter WS2812S_HS_TOH  = 350      ;// 0.35us  - 350ns
+parameter WS2812S_HS_T1H  = 700      ;// 0.7us   - 700ns
+
+parameter WS2812B_HS_TOH  = 350     ;// 0.35us   - 350ns
+parameter WS2812B_HS_T1H  = 900     ;// 0.9us    - 900ns
+
+parameter WS281X_TOLERENCE = 150 ; // 150ns
+
+parameter WS281X_RST   = 50000      ;// 50us - 50000ns
+
+parameter WS281X_PERIOD = (MODE == WS2811_LS)  ? WS281X_LS_PERIOD :
+                          (MODE == WS2811_HS)  ? WS281X_HS_PERIOD :                        
+                          (MODE == WS2812_HS)  ? WS281X_HS_PERIOD :                        
+                          (MODE == WS2812S_HS) ? WS281X_HS_PERIOD :                        
+                          (MODE == WS2812B_HS) ? WS281X_HS_PERIOD : WS281X_LS_PERIOD;
+
+parameter WS281X_TOH = (MODE == WS2811_LS)  ? WS2811_LS_TOH :
+                       (MODE == WS2811_HS)  ? WS2811_HS_TOH :                        
+                       (MODE == WS2812_HS)  ? WS2812S_HS_TOH :                        
+                       (MODE == WS2812S_HS) ? WS2812S_HS_TOH :                        
+                       (MODE == WS2812B_HS) ? WS2812B_HS_TOH : WS2811_LS_TOH;
+                       
+parameter WS281X_T1H = (MODE == WS2811_LS)  ? WS2811_LS_T1H :
+                       (MODE == WS2811_HS)  ? WS2811_HS_T1H :                        
+                       (MODE == WS2812_HS)  ? WS2812S_HS_T1H :                        
+                       (MODE == WS2812S_HS) ? WS2812S_HS_T1H :                        
+                       (MODE == WS2812B_HS) ? WS2812B_HS_T1H : WS2811_LS_T1H;
+
+
+//---------------------------------------------------------
+// FSM State
+//---------------------------------------------------------
+parameter  STATE_RESET         = 3'b000;
+parameter  STATE_WAIT_POS_EDGE = 3'b001;
+parameter  STATE_WAIT_NEG_EDGE = 3'b010;
+parameter  STATE_DATA0_LOW     = 3'b011;
+parameter  STATE_DATA1_LOW     = 3'b100;
+
+//---------------------------------------------------
+// Variable decleration
+//---------------------------------------------------
+logic [15:0] rx_wcnt       ;
+logic [15:0] clk_cnt      ;
+logic [7:0]  bit_cnt      ;
+logic [15:0] check_sum    ;
+logic [23:0] led_data     ;
+time         neg_edge_time ;
+time         pos_edge_time ;
+time         time_ref     ;
+logic [2:0]  state        ;
+
+
+always @(negedge rxd) begin
+ neg_edge_time = $time;
+end 
+
+always @(posedge rxd) begin
+ pos_edge_time = $time;
+end 
+
+
+always @ (posedge clk) begin
+  if(reset_n == 0) begin
+       rx_wcnt      = 0;  // rx word count
+       bit_cnt      = 0;  // bit count
+       clk_cnt      = 0;  // clock edge count
+       check_sum    = 0;
+       state        = STATE_RESET;
+       time_ref     = $time;
+       led_data     = 0;
+  end else begin
+      if(enb == 0) begin
+          state        = STATE_RESET;
+      end else begin
+         case(state)
+         STATE_RESET: begin
+            if(rxd == 0) begin
+               if(($time - time_ref) > WS281X_RST) begin
+                  $display("STATUS-WS281X-%0d: RESET PHASE DETECTED",PORT_ID);
+                  state = STATE_WAIT_POS_EDGE;
+               end
+            end else begin
+                time_ref     = $time;
+                $display("ERROR-WS281X-%0d: Out of Spec Positive Pulse Width Detected at Reset Phase : %t",PORT_ID,$time);
+                #1000;
+                $stop;
+            end
+         end
+         STATE_WAIT_POS_EDGE: begin
+            if(rxd == 1) begin
+               state = STATE_WAIT_NEG_EDGE;
+            end
+         end
+         STATE_WAIT_NEG_EDGE: begin
+            if(rxd == 0) begin
+               if(((neg_edge_time-pos_edge_time) > (WS281X_TOH-WS281X_TOLERENCE)) &&
+                  ((neg_edge_time-pos_edge_time) < (WS281X_TOH+WS281X_TOLERENCE))) begin
+                   // Check of the Width Match with Data-0: High Pulse width
+                   state = STATE_DATA0_LOW;
+               end else if(((neg_edge_time-pos_edge_time) > (WS281X_T1H-WS281X_TOLERENCE)) &&
+                            (neg_edge_time-pos_edge_time) < (WS281X_T1H+WS281X_TOLERENCE)) begin
+                   // Check of the Width Match with Data-1: High Pulse width
+                   state = STATE_DATA1_LOW;
+               end else begin
+                    $display("ERROR-WS281X-%0d: Out of Spec Positive Pulse Width Detected : %t",PORT_ID,neg_edge_time-pos_edge_time);
+                    #1000;
+                    $stop;
+               end
+            end else if(($time-pos_edge_time) > (WS281X_T1H+WS281X_TOLERENCE)) begin
+                $display("ERROR-WS281X-%0d: Out of Spec Positive Pulse Width Detected : %t",PORT_ID,$time);
+                #1000;
+                $stop;
+            end
+         end
+
+          // Check Data low period for DATA-0
+          STATE_DATA0_LOW: begin
+            if(rxd == 1) begin
+               if(((pos_edge_time-neg_edge_time) > (WS281X_PERIOD-WS281X_TOH-WS281X_TOLERENCE)) &&
+                  ((pos_edge_time-neg_edge_time) < (WS281X_PERIOD-WS281X_TOH+WS281X_TOLERENCE))) begin
+                   // Check of the Width Match with Data-0: Neg Pulse width
+                   led_data = led_data << 1; // Data is zero
+                   bit_cnt  = bit_cnt+1;
+                   if(bit_cnt == 24) begin
+                      bit_cnt  = 0;
+                      rx_wcnt = rx_wcnt+1;
+                      $display("STATUS-WS281X-%0d: Word Cnt: %d Green: %x Red: %x Blue: %x",PORT_ID,rx_wcnt,led_data[23:16],led_data[15:8],led_data[7:0]);
+                      check_sum = check_sum+{led_data[23:16],led_data[15:8],led_data[7:0]};
+                   end
+                   state = STATE_WAIT_POS_EDGE;
+               end else begin
+                    $display("ERROR-WS281X-%0d: Data-0 => Out of Spec Negative Pulse Width Detected : %t",PORT_ID,pos_edge_time-neg_edge_time);
+                    #1000;
+                    $stop;
+               end
+            end else begin
+               if((($time-neg_edge_time) > (WS281X_PERIOD-WS281X_TOH+WS281X_TOLERENCE))) begin
+                   led_data = led_data << 1; // Data is zero
+                   bit_cnt  = bit_cnt+1;
+                   if(bit_cnt != 24) begin
+                      $display("ERROR-WS281X-%0d: Partial Data Detected , Rx Count: %d Bit count: %d",PORT_ID,rx_wcnt,bit_cnt);
+                      #1000;
+                      $stop;
+                   end
+                   rx_wcnt = rx_wcnt+1;
+                   $display("STATUS-WS281X-%0d: Word Cnt: %d Green: %x Red: %x Blue: %x",PORT_ID,rx_wcnt,led_data[23:16],led_data[15:8],led_data[7:0]);
+                   check_sum = check_sum+{led_data[23:16],led_data[15:8],led_data[7:0]};
+                   time_ref  = $time;
+                   state     = STATE_RESET;
+                end
+            end
+          end
+          // Check Data low period for DATA-1
+          STATE_DATA1_LOW: begin
+            if(rxd == 1) begin
+               if(((pos_edge_time-neg_edge_time) > (WS281X_PERIOD-WS281X_T1H-WS281X_TOLERENCE)) &&
+                  ((pos_edge_time-neg_edge_time) < (WS281X_PERIOD-WS281X_T1H+WS281X_TOLERENCE))) begin
+                   // Check of the Width Match with Data-0: Neg Pulse width
+                   led_data = (led_data << 1) | 1'b1; // Data is high
+                   bit_cnt  = bit_cnt+1;
+                   if(bit_cnt == 24) begin
+                      bit_cnt  = 0;
+                      rx_wcnt = rx_wcnt+1;
+                      $display("STATUS-WS281X-%0d: Word Cnt: %d Green: %x Red: %x Blue: %x",PORT_ID,rx_wcnt,led_data[23:16],led_data[15:8],led_data[7:0]);
+                      check_sum = check_sum+{led_data[23:16],led_data[15:8],led_data[7:0]};
+                   end
+                   state = STATE_WAIT_POS_EDGE;
+               end else begin
+                  if((($time-neg_edge_time) > (WS281X_PERIOD-WS281X_T1H+WS281X_TOLERENCE))) begin
+                      led_data = (led_data << 1) | 1'b1; // Data is Hih
+                      bit_cnt  = bit_cnt+1;
+                      if(bit_cnt != 24) begin
+                         $display("ERROR-WS281X-%0d: Partial Data Detected , Rx Count: %d Bit count: %d",PORT_ID,rx_wcnt,bit_cnt);
+                         #1000;
+                         $stop;
+                      end
+                      rx_wcnt = rx_wcnt+1;
+                      $display("STATUS-WS281X-%0d: Word Cnt: %d Green: %x Red: %x Blue: %x",PORT_ID,rx_wcnt,led_data[23:16],led_data[15:8],led_data[7:0]);
+                      check_sum = check_sum+{led_data[23:16],led_data[15:8],led_data[7:0]};
+                      time_ref  = $time;
+                      state     = STATE_RESET;
+                   end
+               end
+            end
+          end
+         endcase
+      end
+   end
+end
+
+endmodule
diff --git a/verilog/dv/c_func/inc/ext_reg_map.h b/verilog/dv/c_func/inc/ext_reg_map.h
index cdb04f3..c5a46c0 100644
--- a/verilog/dv/c_func/inc/ext_reg_map.h
+++ b/verilog/dv/c_func/inc/ext_reg_map.h
@@ -11,54 +11,53 @@
 #define reg_glbl_intr_msk      (*(volatile uint32_t*)0x3002000C)  // reg_3  - Global Interrupt Mask
 #define reg_glbl_intr          (*(volatile uint32_t*)0x30020010)  // reg_4  - Global Interrupt
 #define reg_glbl_multi_func    (*(volatile uint32_t*)0x30020014)  // reg_5 - GPIO Multi Function
-#define reg_glbl_soft_reg_0    (*(volatile uint32_t*)0x30020018)  // reg_6 - Soft Register-0
-#define reg_glbl_soft_reg_1    (*(volatile uint32_t*)0x3002001C)  // reg_7 - Sof Register-1
-#define reg_glbl_soft_reg_2    (*(volatile uint32_t*)0x30020020)  // reg_8 - Sof Register-2
-#define reg_glbl_soft_reg_3    (*(volatile uint32_t*)0x30020024)  // reg_9 - Sof Register-3
-#define reg_glbl_soft_reg_4    (*(volatile uint32_t*)0x30020028)  // reg_10 - Sof Register-4
-#define reg_glbl_soft_reg_5    (*(volatile uint32_t*)0x3002002C)  // reg_11 - Sof Register-5
+#define reg_glbl_clk_ctrl      (*(volatile uint32_t*)0x30020018)  // reg_6 -  RTC/USB Clock control
+#define reg_glbl_pad_strap     (*(volatile uint32_t*)0x30020030)  // reg_6 -  RTC/USB Clock control
+#define reg_glbl_strap_sticky  (*(volatile uint32_t*)0x30020034)  // reg_6 -  RTC/USB Clock control
+#define reg_glbl_system_strap  (*(volatile uint32_t*)0x30020038)  // reg_6 -  RTC/USB Clock control
+#define reg_glbl_mail_box      (*(volatile uint32_t*)0x3002003C)  // reg_15 - Mail Box
 
-#define reg_gpio_dsel         (*(volatile uint32_t*)0x30020040)  // reg_0  - GPIO Direction Select
-#define reg_gpio_type         (*(volatile uint32_t*)0x30020044)  // reg_1  - GPIO TYPE - Static/Waveform
-#define reg_gpio_idata        (*(volatile uint32_t*)0x30020048)  // reg_2  - GPIO Data In
-#define reg_gpio_odata        (*(volatile uint32_t*)0x3002004C)  // reg_3  - GPIO Data Out
-#define reg_gpio_intr_stat    (*(volatile uint32_t*)0x30020050)  // reg_4  - GPIO Interrupt status
-#define reg_gpio_intr_clr     (*(volatile uint32_t*)0x30020050)  // reg_5  - GPIO Interrupt Clear
-#define reg_gpio_intr_set     (*(volatile uint32_t*)0x30020054)  // reg_6 - GPIO Interrupt Set
-#define reg_gpio_intr_mask    (*(volatile uint32_t*)0x30020058)  // reg_7 - GPIO Interrupt Mask
-#define reg_gpio_pos_intr     (*(volatile uint32_t*)0x3002005C)  // reg_8 - GPIO Posedge Interrupt
-#define reg_gpio_neg_intr     (*(volatile uint32_t*)0x30020060)  // reg_9 - GPIO Neg Interrupt
+#define reg_gpio_dsel         (*(volatile uint32_t*)0x30020080)  // reg_0  - GPIO Direction Select
+#define reg_gpio_type         (*(volatile uint32_t*)0x30020084)  // reg_1  - GPIO TYPE - Static/Waveform
+#define reg_gpio_idata        (*(volatile uint32_t*)0x30020088)  // reg_2  - GPIO Data In
+#define reg_gpio_odata        (*(volatile uint32_t*)0x3002008C)  // reg_3  - GPIO Data Out
+#define reg_gpio_intr_stat    (*(volatile uint32_t*)0x30020090)  // reg_4  - GPIO Interrupt status
+#define reg_gpio_intr_clr     (*(volatile uint32_t*)0x30020090)  // reg_5  - GPIO Interrupt Clear
+#define reg_gpio_intr_set     (*(volatile uint32_t*)0x30020094)  // reg_6 - GPIO Interrupt Set
+#define reg_gpio_intr_mask    (*(volatile uint32_t*)0x30020098)  // reg_7 - GPIO Interrupt Mask
+#define reg_gpio_pos_intr     (*(volatile uint32_t*)0x3002009C)  // reg_8 - GPIO Posedge Interrupt
+#define reg_gpio_neg_intr     (*(volatile uint32_t*)0x300200A0)  // reg_9 - GPIO Neg Interrupt
 
-#define reg_pinmux_glbl_cfg   (*(volatile uint32_t*)0x30020080)  // reg_0 - PWM Reg-0
-#define reg_pinmux_cfg_pwm0   (*(volatile uint32_t*)0x30020084)  // reg_1 - PWM Reg-0
-#define reg_pinmux_cfg_pwm1   (*(volatile uint32_t*)0x30020088)  // reg_2 - PWM Reg-1
-#define reg_pinmux_cfg_pwm2   (*(volatile uint32_t*)0x3002008C)  // reg_3 - PWM Reg-2
-#define reg_pinmux_cfg_pwm3   (*(volatile uint32_t*)0x30020090)  // reg_4 - PWM Reg-3
-#define reg_pinmux_cfg_pwm4   (*(volatile uint32_t*)0x30020094)  // reg_5 - PWM Reg-4
-#define reg_pinmux_cfg_pwm5   (*(volatile uint32_t*)0x30020098)  // reg_6 - PWM Reg-5
+#define reg_pwm_glbl_cfg      (*(volatile uint32_t*)0x30020100)  // reg_0 - PWM Reg-0
+#define reg_pwm_cfg_pwm0      (*(volatile uint32_t*)0x30020104)  // reg_1 - PWM Reg-0
+#define reg_pwm_cfg_pwm1      (*(volatile uint32_t*)0x30020108)  // reg_2 - PWM Reg-1
+#define reg_pwm_cfg_pwm2      (*(volatile uint32_t*)0x3002010C)  // reg_3 - PWM Reg-2
+#define reg_pwm_cfg_pwm3      (*(volatile uint32_t*)0x30020110)  // reg_4 - PWM Reg-3
+#define reg_pwm_cfg_pwm4      (*(volatile uint32_t*)0x30020114)  // reg_5 - PWM Reg-4
+#define reg_pwm_cfg_pwm5      (*(volatile uint32_t*)0x30020118)  // reg_6 - PWM Reg-5
 
-#define reg_timer_glbl_cfg    (*(volatile uint32_t*)0x300200C0)  // reg_0 - Global config
-#define reg_timer_cfg_timer0  (*(volatile uint32_t*)0x300200C4)  // reg_1 - Timer-0
-#define reg_timer_cfg_timer1  (*(volatile uint32_t*)0x300200C8)  // reg_2 - Timer-1
-#define reg_timer_cfg_timer2  (*(volatile uint32_t*)0x300200CC)  // reg_3 - Timer-2
+#define reg_timer_glbl_cfg    (*(volatile uint32_t*)0x30020180)  // reg_0 - Global config
+#define reg_timer_cfg_timer0  (*(volatile uint32_t*)0x30020184)  // reg_1 - Timer-0
+#define reg_timer_cfg_timer1  (*(volatile uint32_t*)0x30020188)  // reg_2 - Timer-1
+#define reg_timer_cfg_timer2  (*(volatile uint32_t*)0x3002018C)  // reg_3 - Timer-2
 
-#define reg_sema_lock0        (*(volatile uint32_t*)0x30020100)  // reg_0  - Hardware Lock-0
-#define reg_sema_lock1        (*(volatile uint32_t*)0x30020104)  // reg_1  - Hardware Lock-1
-#define reg_sema_lock2        (*(volatile uint32_t*)0x30020108)  // reg_2  - Hardware Lock-2
-#define reg_sema_lock3        (*(volatile uint32_t*)0x3002010C)  // reg_3  - Hardware Lock-3
-#define reg_sema_lock4        (*(volatile uint32_t*)0x30020110)  // reg_4  - Hardware Lock-4
-#define reg_sema_lock5        (*(volatile uint32_t*)0x30020114)  // reg_5  - Hardware Lock-5
-#define reg_sema_lock6        (*(volatile uint32_t*)0x30020118)  // reg_6  - Hardware Lock-6
-#define reg_sema_lock7        (*(volatile uint32_t*)0x3002011C)  // reg_7  - Hardware Lock-7
-#define reg_sema_lock8        (*(volatile uint32_t*)0x30020120)  // reg_8  - Hardware Lock-8
-#define reg_sema_lock9        (*(volatile uint32_t*)0x30020124)  // reg_9  - Hardware Lock-9
-#define reg_sema_lock10       (*(volatile uint32_t*)0x30020128)  // reg_10 - Hardware Lock-10
-#define reg_sema_lock11       (*(volatile uint32_t*)0x3002012C)  // reg_11 - Hardware Lock-11
-#define reg_sema_lock12       (*(volatile uint32_t*)0x30020130)  // reg_12 - Hardware Lock-12
-#define reg_sema_lock13       (*(volatile uint32_t*)0x30020134)  // reg_13 - Hardware Lock-13
-#define reg_sema_lock14       (*(volatile uint32_t*)0x30020138)  // reg_14 - Hardware Lock-14
-#define reg_sema_lock_cfg     (*(volatile uint32_t*)0x3002013C)  // reg_15 - Hardware Lock config
-#define reg_sema_lock_stat    (*(volatile uint32_t*)0x3002013C)  // reg_15 - Hardware Lock Status
+#define reg_sema_lock0        (*(volatile uint32_t*)0x30020200)  // reg_0  - Hardware Lock-0
+#define reg_sema_lock1        (*(volatile uint32_t*)0x30020204)  // reg_1  - Hardware Lock-1
+#define reg_sema_lock2        (*(volatile uint32_t*)0x30020208)  // reg_2  - Hardware Lock-2
+#define reg_sema_lock3        (*(volatile uint32_t*)0x3002020C)  // reg_3  - Hardware Lock-3
+#define reg_sema_lock4        (*(volatile uint32_t*)0x30020210)  // reg_4  - Hardware Lock-4
+#define reg_sema_lock5        (*(volatile uint32_t*)0x30020214)  // reg_5  - Hardware Lock-5
+#define reg_sema_lock6        (*(volatile uint32_t*)0x30020218)  // reg_6  - Hardware Lock-6
+#define reg_sema_lock7        (*(volatile uint32_t*)0x3002021C)  // reg_7  - Hardware Lock-7
+#define reg_sema_lock8        (*(volatile uint32_t*)0x30020220)  // reg_8  - Hardware Lock-8
+#define reg_sema_lock9        (*(volatile uint32_t*)0x30020224)  // reg_9  - Hardware Lock-9
+#define reg_sema_lock10       (*(volatile uint32_t*)0x30020228)  // reg_10 - Hardware Lock-10
+#define reg_sema_lock11       (*(volatile uint32_t*)0x3002022C)  // reg_11 - Hardware Lock-11
+#define reg_sema_lock12       (*(volatile uint32_t*)0x30020230)  // reg_12 - Hardware Lock-12
+#define reg_sema_lock13       (*(volatile uint32_t*)0x30020234)  // reg_13 - Hardware Lock-13
+#define reg_sema_lock14       (*(volatile uint32_t*)0x30020238)  // reg_14 - Hardware Lock-14
+#define reg_sema_lock_cfg     (*(volatile uint32_t*)0x3002023C)  // reg_15 - Hardware Lock config
+#define reg_sema_lock_stat    (*(volatile uint32_t*)0x3002023C)  // reg_15 - Hardware Lock Status
 
 
 #define reg_uart0_ctrl         (*(volatile uint32_t*)0x30010000)  // Reg-0
@@ -81,3 +80,6 @@
 #define reg_uart1_txfifo_stat  (*(volatile uint32_t*)0x3001011C)  // Reg-7
 #define reg_uart1_rxfifo_stat  (*(volatile uint32_t*)0x30010120)  // Reg-8
 
+
+
+#define reg_mprj_wbhost_ctrl (*(volatile uint32_t*)0x30080000)
diff --git a/verilog/dv/c_func/inc/int_reg_map.h b/verilog/dv/c_func/inc/int_reg_map.h
index 669499d..3e38aed 100644
--- a/verilog/dv/c_func/inc/int_reg_map.h
+++ b/verilog/dv/c_func/inc/int_reg_map.h
@@ -10,55 +10,62 @@
 #define reg_glbl_cfg1          (*(volatile uint32_t*)0x10020008)  // reg_2  - Global Config-1
 #define reg_glbl_intr_msk      (*(volatile uint32_t*)0x1002000C)  // reg_3  - Global Interrupt Mask
 #define reg_glbl_intr          (*(volatile uint32_t*)0x10020010)  // reg_4  - Global Interrupt
-#define reg_glbl_multi_func    (*(volatile uint32_t*)0x10020014)  // reg_5 - GPIO Multi Function
-#define reg_glbl_soft_reg_0    (*(volatile uint32_t*)0x10020018)  // reg_6 - Soft Register-0
-#define reg_glbl_soft_reg_1    (*(volatile uint32_t*)0x1002001C)  // reg_7 - Sof Register-1
-#define reg_glbl_soft_reg_2    (*(volatile uint32_t*)0x10020020)  // reg_8 - Sof Register-2
-#define reg_glbl_soft_reg_3    (*(volatile uint32_t*)0x10020024)  // reg_9 - Sof Register-3
-#define reg_glbl_soft_reg_4    (*(volatile uint32_t*)0x10020028)  // reg_10 - Sof Register-4
-#define reg_glbl_soft_reg_5    (*(volatile uint32_t*)0x1002002C)  // reg_11 - Sof Register-5
+#define reg_glbl_multi_func    (*(volatile uint32_t*)0x10020014)  // reg_5 -  GPIO Multi Function
+#define reg_glbl_clk_ctrl      (*(volatile uint32_t*)0x10020018)  // reg_6 -  RTC/USB Clock control
+#define reg_glbl_pad_strap     (*(volatile uint32_t*)0x10020030)  // reg_6 -  RTC/USB Clock control
+#define reg_glbl_strap_sticky  (*(volatile uint32_t*)0x10020034)  // reg_6 -  RTC/USB Clock control
+#define reg_glbl_system_strap  (*(volatile uint32_t*)0x10020038)  // reg_6 -  RTC/USB Clock control
+#define reg_glbl_mail_box      (*(volatile uint32_t*)0x1002003C)  // reg_15 - Mail Box
+#define reg_glbl_soft_reg_0    (*(volatile uint32_t*)0x10020040)  // reg_16 - Soft Register-0
+#define reg_glbl_soft_reg_1    (*(volatile uint32_t*)0x10020044)  // reg_17 - Soft Register-1
+#define reg_glbl_soft_reg_2    (*(volatile uint32_t*)0x10020048)  // reg_18 - Soft Register-2
+#define reg_glbl_soft_reg_3    (*(volatile uint32_t*)0x1002004C)  // reg_19 - Soft Register-3
+#define reg_glbl_soft_reg_4    (*(volatile uint32_t*)0x10020050)  // reg_20 - Soft Register-4
+#define reg_glbl_soft_reg_5    (*(volatile uint32_t*)0x10020054)  // reg_21 - Soft Register-5
+#define reg_glbl_soft_reg_6    (*(volatile uint32_t*)0x10020058)  // reg_22 - Soft Register-6
+#define reg_glbl_soft_reg_7    (*(volatile uint32_t*)0x1002005C)  // reg_23 - Soft Register-7
 
-#define reg_gpio_dsel         (*(volatile uint32_t*)0x10020040)  // reg_0  - GPIO Direction Select
-#define reg_gpio_type         (*(volatile uint32_t*)0x10020044)  // reg_1  - GPIO TYPE - Static/Waveform
-#define reg_gpio_idata        (*(volatile uint32_t*)0x10020048)  // reg_2  - GPIO Data In
-#define reg_gpio_odata        (*(volatile uint32_t*)0x1002004C)  // reg_3  - GPIO Data Out
-#define reg_gpio_intr_stat    (*(volatile uint32_t*)0x10020050)  // reg_4  - GPIO Interrupt status
-#define reg_gpio_intr_clr     (*(volatile uint32_t*)0x10020050)  // reg_5  - GPIO Interrupt Clear
-#define reg_gpio_intr_set     (*(volatile uint32_t*)0x10020054)  // reg_6 - GPIO Interrupt Set
-#define reg_gpio_intr_mask    (*(volatile uint32_t*)0x10020058)  // reg_7 - GPIO Interrupt Mask
-#define reg_gpio_pos_intr     (*(volatile uint32_t*)0x1002005C)  // reg_8 - GPIO Posedge Interrupt
-#define reg_gpio_neg_intr     (*(volatile uint32_t*)0x10020060)  // reg_9 - GPIO Neg Interrupt
+#define reg_gpio_dsel         (*(volatile uint32_t*)0x10020080)  // reg_0  - GPIO Direction Select
+#define reg_gpio_type         (*(volatile uint32_t*)0x10020084)  // reg_1  - GPIO TYPE - Static/Waveform
+#define reg_gpio_idata        (*(volatile uint32_t*)0x10020088)  // reg_2  - GPIO Data In
+#define reg_gpio_odata        (*(volatile uint32_t*)0x1002008C)  // reg_3  - GPIO Data Out
+#define reg_gpio_intr_stat    (*(volatile uint32_t*)0x10020090)  // reg_4  - GPIO Interrupt status
+#define reg_gpio_intr_clr     (*(volatile uint32_t*)0x10020090)  // reg_5  - GPIO Interrupt Clear
+#define reg_gpio_intr_set     (*(volatile uint32_t*)0x10020094)  // reg_6 - GPIO Interrupt Set
+#define reg_gpio_intr_mask    (*(volatile uint32_t*)0x10020098)  // reg_7 - GPIO Interrupt Mask
+#define reg_gpio_pos_intr     (*(volatile uint32_t*)0x1002009C)  // reg_8 - GPIO Posedge Interrupt
+#define reg_gpio_neg_intr     (*(volatile uint32_t*)0x100200A0)  // reg_9 - GPIO Neg Interrupt
 
-#define reg_pinmux_glbl_cfg   (*(volatile uint32_t*)0x10020080)  // reg_0 - PWM Reg-0
-#define reg_pinmux_cfg_pwm0   (*(volatile uint32_t*)0x10020084)  // reg_1 - PWM Reg-0
-#define reg_pinmux_cfg_pwm1   (*(volatile uint32_t*)0x10020088)  // reg_2 - PWM Reg-1
-#define reg_pinmux_cfg_pwm2   (*(volatile uint32_t*)0x1002008C)  // reg_3 - PWM Reg-2
-#define reg_pinmux_cfg_pwm3   (*(volatile uint32_t*)0x10020090)  // reg_4 - PWM Reg-3
-#define reg_pinmux_cfg_pwm4   (*(volatile uint32_t*)0x10020094)  // reg_5 - PWM Reg-4
-#define reg_pinmux_cfg_pwm5   (*(volatile uint32_t*)0x10020098)  // reg_6 - PWM Reg-5
+#define reg_pwm_glbl_cfg      (*(volatile uint32_t*)0x10020100)  // reg_0 - PWM Reg-0
+#define reg_pwm_cfg_pwm0      (*(volatile uint32_t*)0x10020104)  // reg_1 - PWM Reg-0
+#define reg_pwm_cfg_pwm1      (*(volatile uint32_t*)0x10020108)  // reg_2 - PWM Reg-1
+#define reg_pwm_cfg_pwm2      (*(volatile uint32_t*)0x1002011C)  // reg_3 - PWM Reg-2
+#define reg_pwm_cfg_pwm3      (*(volatile uint32_t*)0x10020110)  // reg_4 - PWM Reg-3
+#define reg_pwm_cfg_pwm4      (*(volatile uint32_t*)0x10020114)  // reg_5 - PWM Reg-4
+#define reg_pwm_cfg_pwm5      (*(volatile uint32_t*)0x10020118)  // reg_6 - PWM Reg-5
 
-#define reg_timer_glbl_cfg    (*(volatile uint32_t*)0x100200C0)  // reg_0 - Global config
-#define reg_timer_cfg_timer0  (*(volatile uint32_t*)0x100200C4)  // reg_1 - Timer-0
-#define reg_timer_cfg_timer1  (*(volatile uint32_t*)0x100200C8)  // reg_2 - Timer-1
-#define reg_timer_cfg_timer2  (*(volatile uint32_t*)0x100200CC)  // reg_3 - Timer-2
+#define reg_timer_glbl_cfg    (*(volatile uint32_t*)0x10020180)  // reg_0 - Global config
+#define reg_timer_cfg_timer0  (*(volatile uint32_t*)0x10020184)  // reg_1 - Timer-0
+#define reg_timer_cfg_timer1  (*(volatile uint32_t*)0x10020188)  // reg_2 - Timer-1
+#define reg_timer_cfg_timer2  (*(volatile uint32_t*)0x1002018C)  // reg_3 - Timer-2
 
-#define reg_sema_lock0        (*(volatile uint32_t*)0x10020100)  // reg_0  - Hardware Lock-0
-#define reg_sema_lock1        (*(volatile uint32_t*)0x10020104)  // reg_1  - Hardware Lock-1
-#define reg_sema_lock2        (*(volatile uint32_t*)0x10020108)  // reg_2  - Hardware Lock-2
-#define reg_sema_lock3        (*(volatile uint32_t*)0x1002010C)  // reg_3  - Hardware Lock-3
-#define reg_sema_lock4        (*(volatile uint32_t*)0x10020110)  // reg_4  - Hardware Lock-4
-#define reg_sema_lock5        (*(volatile uint32_t*)0x10020114)  // reg_5  - Hardware Lock-5
-#define reg_sema_lock6        (*(volatile uint32_t*)0x10020118)  // reg_6  - Hardware Lock-6
-#define reg_sema_lock7        (*(volatile uint32_t*)0x1002011C)  // reg_7  - Hardware Lock-7
-#define reg_sema_lock8        (*(volatile uint32_t*)0x10020120)  // reg_8  - Hardware Lock-8
-#define reg_sema_lock9        (*(volatile uint32_t*)0x10020124)  // reg_9  - Hardware Lock-9
-#define reg_sema_lock10       (*(volatile uint32_t*)0x10020128)  // reg_10 - Hardware Lock-10
-#define reg_sema_lock11       (*(volatile uint32_t*)0x1002012C)  // reg_11 - Hardware Lock-11
-#define reg_sema_lock12       (*(volatile uint32_t*)0x10020130)  // reg_12 - Hardware Lock-12
-#define reg_sema_lock13       (*(volatile uint32_t*)0x10020134)  // reg_13 - Hardware Lock-13
-#define reg_sema_lock14       (*(volatile uint32_t*)0x10020138)  // reg_14 - Hardware Lock-14
-#define reg_sema_lock_cfg     (*(volatile uint32_t*)0x1002013C)  // reg_15 - Hardware Lock config
-#define reg_sema_lock_stat    (*(volatile uint32_t*)0x1002013C)  // reg_15 - Hardware Lock Status
+#define reg_sema_lock0        (*(volatile uint32_t*)0x10020200)  // reg_0  - Hardware Lock-0
+#define reg_sema_lock1        (*(volatile uint32_t*)0x10020204)  // reg_1  - Hardware Lock-1
+#define reg_sema_lock2        (*(volatile uint32_t*)0x10020208)  // reg_2  - Hardware Lock-2
+#define reg_sema_lock3        (*(volatile uint32_t*)0x1002020C)  // reg_3  - Hardware Lock-3
+#define reg_sema_lock4        (*(volatile uint32_t*)0x10020210)  // reg_4  - Hardware Lock-4
+#define reg_sema_lock5        (*(volatile uint32_t*)0x10020214)  // reg_5  - Hardware Lock-5
+#define reg_sema_lock6        (*(volatile uint32_t*)0x10020218)  // reg_6  - Hardware Lock-6
+#define reg_sema_lock7        (*(volatile uint32_t*)0x1002021C)  // reg_7  - Hardware Lock-7
+#define reg_sema_lock8        (*(volatile uint32_t*)0x10020220)  // reg_8  - Hardware Lock-8
+#define reg_sema_lock9        (*(volatile uint32_t*)0x10020224)  // reg_9  - Hardware Lock-9
+#define reg_sema_lock10       (*(volatile uint32_t*)0x10020228)  // reg_10 - Hardware Lock-10
+#define reg_sema_lock11       (*(volatile uint32_t*)0x1002022C)  // reg_11 - Hardware Lock-11
+#define reg_sema_lock12       (*(volatile uint32_t*)0x10020230)  // reg_12 - Hardware Lock-12
+#define reg_sema_lock13       (*(volatile uint32_t*)0x10020234)  // reg_13 - Hardware Lock-13
+#define reg_sema_lock14       (*(volatile uint32_t*)0x10020238)  // reg_14 - Hardware Lock-14
+#define reg_sema_lock_cfg     (*(volatile uint32_t*)0x1002023C)  // reg_15 - Hardware Lock config
+#define reg_sema_lock_stat    (*(volatile uint32_t*)0x1002023C)  // reg_15 - Hardware Lock Status
 
 
 #define reg_uart0_ctrl         (*(volatile uint32_t*)0x10010000)  // Reg-0
diff --git a/verilog/dv/common/riscduino_board b/verilog/dv/common/riscduino_board
index 09f42e8..5b5dd05 160000
--- a/verilog/dv/common/riscduino_board
+++ b/verilog/dv/common/riscduino_board
@@ -1 +1 @@
-Subproject commit 09f42e80c78b05785fb7088fb3bff16b2044c6c8
+Subproject commit 5b5dd057677b00948b02288291ad2141f0543108
diff --git a/verilog/dv/model/i2c_slave_model.v b/verilog/dv/model/i2c_slave_model.v
index 83b8f8b..7151c3c 100755
--- a/verilog/dv/model/i2c_slave_model.v
+++ b/verilog/dv/model/i2c_slave_model.v
@@ -100,7 +100,7 @@
 	//
 	// Variable declaration
 	//
-	wire debug = 1'b1;
+	reg debug = 1'b1;
 
 	reg [7:0] mem [255:0]; // initiate memory
 	reg [7:0] mem_adr;   // memory address
@@ -130,6 +130,7 @@
 	parameter data_ack    = 3'b101;
 
 	reg [2:0] state; // synopsys enum_state
+    reg       block;
 
 	//
 	// module body
@@ -174,14 +175,14 @@
 	  if(scl)
 	    begin
 	        sta   <= #1 1'b1;
-		d_sta <= #1 1'b0;
-		sto   <= #1 1'b0;
+		    d_sta <= #1 1'b0;
+		    sto   <= #1 1'b0;
 
 	        if(debug)
-	          $display("DEBUG i2c_slave; start condition detected at %t", $time);
+	          $display("DEBUG i2c_slave-%0d: start condition detected at %t",I2C_ADR, $time);
 	    end
 	  else
-	    sta <= #1 1'b0;
+	         sta <= #1 1'b0;
 
 	always @(posedge scl)
 	  d_sta <= #1 sta;
@@ -194,7 +195,7 @@
 	       sto <= #1 1'b1;
 
 	       if(debug)
-	         $display("DEBUG i2c_slave; stop condition detected at %t", $time);
+	         $display("DEBUG i2c_slave-%0d: stop condition detected at %t",I2C_ADR, $time);
 	    end
 	  else
 	    sto <= #1 1'b0;
@@ -206,6 +207,7 @@
 	always @(negedge scl or posedge sto)
 	  if (sto || (sta && !d_sta) )
 	    begin
+            block <= 0;
 	        state <= #1 idle; // reset statemachine
 
 	        sda_o <= #1 1'b1;
@@ -219,7 +221,7 @@
 
 	        case(state) // synopsys full_case parallel_case
 	            idle: // idle state
-	              if (acc_done && my_adr)
+	              if (acc_done && my_adr && !block)
 	                begin
 	                    state <= #1 slave_ack;
 	                    rw <= #1 sr[0];
@@ -227,9 +229,9 @@
 
 	                    #2;
 	                    if(debug && rw)
-	                      $display("DEBUG i2c_slave; command byte received (read) at %t", $time);
+	                      $display("DEBUG i2c_slave-%0d: command byte received (read) at %t",I2C_ADR, $time);
 	                    if(debug && !rw)
-	                      $display("DEBUG i2c_slave; command byte received (write) at %t", $time);
+	                      $display("DEBUG i2c_slave-%0d: command byte received (write) at %t",I2C_ADR, $time);
 
 	                    if(rw)
 	                      begin
@@ -237,11 +239,13 @@
 
 	                          if(debug)
 	                            begin
-	                                #2 $display("DEBUG i2c_slave; data block read %x from address %x (1)", mem_do, mem_adr);
-	                                #2 $display("DEBUG i2c_slave; memcheck [%x]=%x", mem_adr, mem[mem_adr]);
+	                                #2 $display("DEBUG i2c_slave-%0d: data block read %x from address %x (1)",I2C_ADR, mem_do, mem_adr);
+	                                //#2 $display("DEBUG i2c_slave-%0d: memcheck [%x]=%x",I2C_ADR, mem_adr, mem[mem_adr]);
 	                            end
 	                      end
-	                end
+	              end else if (acc_done) begin // Wait for Next Start or Stop
+                      block <= 1;
+                  end
 
 	            slave_ack:
 	              begin
@@ -264,7 +268,7 @@
 	                    sda_o <= #1 !(sr <= 255); // generate i2c_ack, for valid address
 
 	                    if(debug)
-	                      #1 $display("DEBUG i2c_slave; address received. adr=%x, ack=%b", sr, sda_o);
+	                      #1 $display("DEBUG i2c_slave-%0d; address received. adr=%x, ack=%b",I2C_ADR, sr, sda_o);
 	                end
 
 	            gma_ack:
@@ -289,7 +293,7 @@
 	                              #3 mem_do <= mem[mem_adr];
 
 	                              if(debug)
-	                                #5 $display("DEBUG i2c_slave; data block read %x from address %x (2)", mem_do, mem_adr);
+	                                #5 $display("DEBUG i2c_slave-%0d: data block read %x from address %x (2)",I2C_ADR, mem_do, mem_adr);
 	                          end
 
 	                        if(!rw)
@@ -297,7 +301,7 @@
 	                              mem[ mem_adr ] <= #1 sr; // store data in memory
 
 	                              if(debug)
-	                                #2 $display("DEBUG i2c_slave; data block write %x to address %x", sr, mem_adr);
+	                                #2 $display("DEBUG i2c_slave-%0d: data block write %x to address %x",I2C_ADR, sr, mem_adr);
 	                          end
 	                    end
 	              end
diff --git a/verilog/dv/riscv_regress/riscv_runtests.sv b/verilog/dv/riscv_regress/riscv_runtests.sv
index a487c7a..0dca105 100644
--- a/verilog/dv/riscv_regress/riscv_runtests.sv
+++ b/verilog/dv/riscv_regress/riscv_runtests.sv
@@ -71,9 +71,9 @@
  end
 ***/
 
-wire [31:0] pc_curr_ff         = (d_risc_id == 0) ? u_top.u_riscv_top.i_core_top_0.i_pipe_top.i_pipe_exu.pc_curr_ff         : u_top.u_riscv_top.i_core_top_1.i_pipe_top.i_pipe_exu.pc_curr_ff;
-wire [31:0] exu2pipe_pc_curr_o = (d_risc_id == 0) ? u_top.u_riscv_top.i_core_top_0.i_pipe_top.i_pipe_exu.exu2pipe_pc_curr_o : u_top.u_riscv_top.i_core_top_1.i_pipe_top.i_pipe_exu.exu2pipe_pc_curr_o;
-wire [31:0] mprf_int_10        = (d_risc_id == 0) ? u_top.u_riscv_top.i_core_top_0.i_pipe_top.i_pipe_mprf.mprf_int[10]      : u_top.u_riscv_top.i_core_top_1.i_pipe_top.i_pipe_mprf.mprf_int[10];
+wire [31:0] pc_curr_ff         = u_top.u_riscv_top.i_core_top_0.i_pipe_top.i_pipe_exu.pc_curr_ff         ;
+wire [31:0] exu2pipe_pc_curr_o = u_top.u_riscv_top.i_core_top_0.i_pipe_top.i_pipe_exu.exu2pipe_pc_curr_o ;
+wire [31:0] mprf_int_10        = u_top.u_riscv_top.i_core_top_0.i_pipe_top.i_pipe_mprf.mprf_int[10]      ;
 
 always @(posedge clk) begin
     bit test_pass;
@@ -240,10 +240,7 @@
             if (f_test != 0) begin
             // Launch new test
                 `ifdef YCR1_TRACE_LOG_EN
-		    if(d_risc_id == 0)
-                        u_top.u_riscv_top.i_core_top_0.i_pipe_top.i_tracelog.test_name = test_file;
-		    else
-                        u_top.u_riscv_top.i_core_top_1.i_pipe_top.i_tracelog.test_name = test_file;
+                    u_top.u_riscv_top.i_core_top_0.i_pipe_top.i_tracelog.test_name = test_file;
                 `endif // SCR1_TRACE_LOG_EN
                 //i_memory_tb.test_file = test_file;
                 //i_memory_tb.test_file_init = 1'b1;
diff --git a/verilog/dv/riscv_regress/user_risc_regress_tb.v b/verilog/dv/riscv_regress/user_risc_regress_tb.v
index e444404..2c53c8c 100644
--- a/verilog/dv/riscv_regress/user_risc_regress_tb.v
+++ b/verilog/dv/riscv_regress/user_risc_regress_tb.v
@@ -233,6 +233,7 @@
 	   	$dumpvars(0, user_risc_regress_tb.u_top.u_riscv_top);
 	   	$dumpvars(0, user_risc_regress_tb.u_top.u_qspi_master);
 	   	$dumpvars(0, user_risc_regress_tb.u_top.u_intercon);
+	   	$dumpvars(0, user_risc_regress_tb.u_top.u_pinmux);
 	   end
        `endif
 
@@ -361,6 +362,9 @@
     .user_irq       () 
 
 );
+// SSPI Slave I/F
+assign io_in[0]  = 1'b1; // RESET
+assign io_in[16] = 1'b0 ; // SPIS SCK 
 
 
 logic [31:0] riscv_dmem_req_cnt; // cnt dmem req
diff --git a/verilog/dv/uart_master/Makefile b/verilog/dv/uart_master/Makefile
index 3ec839e..12331ba 100644
--- a/verilog/dv/uart_master/Makefile
+++ b/verilog/dv/uart_master/Makefile
@@ -155,12 +155,14 @@
 ifeq ($(SIM),RTL)
    ifeq ($(DUMP),OFF)
 	iverilog -g2005-sv -Ttyp -DFUNCTIONAL -DSIM -DUSE_POWER_PINS -DUNIT_DELAY=#0.1 \
+        -f$(USER_PROJECT_VERILOG)/includes/includes.rtl.$(CONFIG) \
         -f$(VERILOG_PATH)/includes/includes.rtl.caravel \
-        -f$(USER_PROJECT_VERILOG)/includes/includes.rtl.$(CONFIG) -o $@ $<
+        -o $@ $<
     else  
 	iverilog -g2005-sv -DWFDUMP -Ttyp -DFUNCTIONAL -DSIM -DUSE_POWER_PINS -DUNIT_DELAY=#0.1 \
+        -f$(USER_PROJECT_VERILOG)/includes/includes.rtl.$(CONFIG) \
         -f$(VERILOG_PATH)/includes/includes.rtl.caravel \
-        -f$(USER_PROJECT_VERILOG)/includes/includes.rtl.$(CONFIG) -o $@ $<
+        -o $@ $<
    endif
 endif
 
diff --git a/verilog/dv/uart_master/uart_master.c b/verilog/dv/uart_master/uart_master.c
index 46d6e97..e1a4bf0 100644
--- a/verilog/dv/uart_master/uart_master.c
+++ b/verilog/dv/uart_master/uart_master.c
@@ -18,7 +18,7 @@
 // This include is relative to $CARAVEL_PATH (see Makefile)
 #include <defs.h>
 #include <stub.c>
-#include "../c_func/inc/user_reg_map.h"
+#include "../c_func/inc/ext_reg_map.h"
 
 // User Project Slaves (0x3000_0000)
 
@@ -40,7 +40,7 @@
 void main()
 {
 
-	int bFail = 0;
+	//int bFail = 0;
 	/* 
 	IO Control Registers
 	| DM     | VTRIP | SLOW  | AN_POL | AN_SEL | AN_EN | MOD_SEL | INP_DIS | HOLDH | OEB_N | MGMT_EN |
@@ -62,8 +62,8 @@
 	/* Set up the housekeeping SPI to be connected internally so	*/
 	/* that external pin changes don't affect it.			*/
 
-    reg_spi_enable = 1;
-    reg_wb_enable = 1;
+    //reg_spi_enable = 1;
+    //reg_wb_enable = 1;
 	// reg_spimaster_config = 0xa002;	// Enable, prescaler = 2,
                                         // connect to housekeeping SPI
 
@@ -71,26 +71,26 @@
 	// so that the CSB line is not left floating.  This allows
 	// all of the GPIO pins to be used for user functions.
 
-    reg_mprj_io_31 = GPIO_MODE_MGMT_STD_OUTPUT;
-    reg_mprj_io_30 = GPIO_MODE_MGMT_STD_OUTPUT;
-    reg_mprj_io_29 = GPIO_MODE_MGMT_STD_OUTPUT;
-    reg_mprj_io_28 = GPIO_MODE_MGMT_STD_OUTPUT;
-    reg_mprj_io_27 = GPIO_MODE_MGMT_STD_OUTPUT;
-    reg_mprj_io_26 = GPIO_MODE_MGMT_STD_OUTPUT;
-    reg_mprj_io_25 = GPIO_MODE_MGMT_STD_OUTPUT;
-    reg_mprj_io_24 = GPIO_MODE_MGMT_STD_OUTPUT;
-    reg_mprj_io_23 = GPIO_MODE_MGMT_STD_OUTPUT;
-    reg_mprj_io_22 = GPIO_MODE_MGMT_STD_OUTPUT;
-    reg_mprj_io_21 = GPIO_MODE_MGMT_STD_OUTPUT;
-    reg_mprj_io_20 = GPIO_MODE_MGMT_STD_OUTPUT;
-    reg_mprj_io_19 = GPIO_MODE_MGMT_STD_OUTPUT;
-    reg_mprj_io_18 = GPIO_MODE_MGMT_STD_OUTPUT;
-    reg_mprj_io_17 = GPIO_MODE_MGMT_STD_OUTPUT;
-    reg_mprj_io_16 = GPIO_MODE_MGMT_STD_OUTPUT;
+    //reg_mprj_io_31 = GPIO_MODE_MGMT_STD_OUTPUT;
+    //reg_mprj_io_30 = GPIO_MODE_MGMT_STD_OUTPUT;
+    //reg_mprj_io_29 = GPIO_MODE_MGMT_STD_OUTPUT;
+    //reg_mprj_io_28 = GPIO_MODE_MGMT_STD_OUTPUT;
+    //reg_mprj_io_27 = GPIO_MODE_MGMT_STD_OUTPUT;
+    //reg_mprj_io_26 = GPIO_MODE_MGMT_STD_OUTPUT;
+    //reg_mprj_io_25 = GPIO_MODE_MGMT_STD_OUTPUT;
+    //reg_mprj_io_24 = GPIO_MODE_MGMT_STD_OUTPUT;
+    //reg_mprj_io_23 = GPIO_MODE_MGMT_STD_OUTPUT;
+    //reg_mprj_io_22 = GPIO_MODE_MGMT_STD_OUTPUT;
+    //reg_mprj_io_21 = GPIO_MODE_MGMT_STD_OUTPUT;
+    //reg_mprj_io_20 = GPIO_MODE_MGMT_STD_OUTPUT;
+    //reg_mprj_io_19 = GPIO_MODE_MGMT_STD_OUTPUT;
+    //reg_mprj_io_18 = GPIO_MODE_MGMT_STD_OUTPUT;
+    //reg_mprj_io_17 = GPIO_MODE_MGMT_STD_OUTPUT;
+    //reg_mprj_io_16 = GPIO_MODE_MGMT_STD_OUTPUT;
 
-     /* Apply configuration */
-    reg_mprj_xfer = 1;
-    while (reg_mprj_xfer == 1);
+    // /* Apply configuration */
+    //reg_mprj_xfer = 1;
+    //while (reg_mprj_xfer == 1);
 
     reg_la0_oenb = reg_la0_iena = 0xFFFFFFFF;    // [31:0]
 
@@ -99,50 +99,53 @@
 
     //-----------------------------------------------------
     // Start of User Functionality and take over the GPIO Pins
-    // ------------------------------------------------------
+    // --------------------------------------------------------------------
     // User block decide on the GPIO function
-    reg_mprj_io_37 = GPIO_MODE_USER_STD_BIDIRECTIONAL_PULLUP;
-    reg_mprj_io_36 = GPIO_MODE_USER_STD_BIDIRECTIONAL_PULLUP;
-    reg_mprj_io_35 = GPIO_MODE_USER_STD_BIDIRECTIONAL_PULLUP;
-    reg_mprj_io_34 = GPIO_MODE_USER_STD_BIDIRECTIONAL_PULLUP;
-    reg_mprj_io_33 = GPIO_MODE_USER_STD_BIDIRECTIONAL_PULLUP;
-    reg_mprj_io_32 = GPIO_MODE_USER_STD_BIDIRECTIONAL_PULLUP;
-    reg_mprj_io_31 = GPIO_MODE_USER_STD_BIDIRECTIONAL_PULLUP;
-    reg_mprj_io_30 = GPIO_MODE_USER_STD_BIDIRECTIONAL_PULLUP;
-    reg_mprj_io_29 = GPIO_MODE_USER_STD_BIDIRECTIONAL_PULLUP;
-    reg_mprj_io_28 = GPIO_MODE_USER_STD_BIDIRECTIONAL_PULLUP;
-    reg_mprj_io_27 = GPIO_MODE_USER_STD_BIDIRECTIONAL_PULLUP;
-    reg_mprj_io_26 = GPIO_MODE_USER_STD_BIDIRECTIONAL_PULLUP;
-    reg_mprj_io_25 = GPIO_MODE_USER_STD_BIDIRECTIONAL_PULLUP;
-    reg_mprj_io_24 = GPIO_MODE_USER_STD_BIDIRECTIONAL_PULLUP;
-    reg_mprj_io_23 = GPIO_MODE_USER_STD_BIDIRECTIONAL_PULLUP;
-    reg_mprj_io_22 = GPIO_MODE_USER_STD_BIDIRECTIONAL_PULLUP;
-    reg_mprj_io_21 = GPIO_MODE_USER_STD_BIDIRECTIONAL_PULLUP;
-    reg_mprj_io_20 = GPIO_MODE_USER_STD_BIDIRECTIONAL_PULLUP;
-    reg_mprj_io_19 = GPIO_MODE_USER_STD_BIDIRECTIONAL_PULLUP;
-    reg_mprj_io_18 = GPIO_MODE_USER_STD_BIDIRECTIONAL_PULLUP;
-    reg_mprj_io_17 = GPIO_MODE_USER_STD_BIDIRECTIONAL_PULLUP;
-    reg_mprj_io_16 = GPIO_MODE_USER_STD_BIDIRECTIONAL_PULLUP;
-    reg_mprj_io_15 = GPIO_MODE_USER_STD_BIDIRECTIONAL_PULLUP;
-    reg_mprj_io_14 = GPIO_MODE_USER_STD_BIDIRECTIONAL_PULLUP;
-    reg_mprj_io_13 = GPIO_MODE_USER_STD_BIDIRECTIONAL_PULLUP;
-    reg_mprj_io_12 = GPIO_MODE_USER_STD_BIDIRECTIONAL_PULLUP;
-    reg_mprj_io_11 = GPIO_MODE_USER_STD_BIDIRECTIONAL_PULLUP;
-    reg_mprj_io_10 = GPIO_MODE_USER_STD_BIDIRECTIONAL_PULLUP;
-    reg_mprj_io_9  = GPIO_MODE_USER_STD_BIDIRECTIONAL_PULLUP;
-    reg_mprj_io_8  = GPIO_MODE_USER_STD_BIDIRECTIONAL_PULLUP;
-    reg_mprj_io_7  = GPIO_MODE_USER_STD_BIDIRECTIONAL_PULLUP;
-    reg_mprj_io_6 =  GPIO_MODE_USER_STD_BIDIRECTIONAL_PULLUP;
-    reg_mprj_io_5 =  GPIO_MODE_USER_STD_BIDIRECTIONAL_PULLUP;
-    reg_mprj_io_4 =  GPIO_MODE_USER_STD_BIDIRECTIONAL_PULLUP;
-    reg_mprj_io_3 =  GPIO_MODE_USER_STD_BIDIRECTIONAL_PULLUP;
-    reg_mprj_io_2 =  GPIO_MODE_USER_STD_BIDIRECTIONAL_PULLUP;
-    reg_mprj_io_1 =  GPIO_MODE_USER_STD_BIDIRECTIONAL_PULLUP;
-    reg_mprj_io_0 =  GPIO_MODE_USER_STD_BIDIRECTIONAL_PULLUP;
+    // io[6] to 37 are set to default bio-direction using user_define.h file
+    //---------------------------------------------------------------------
 
-     /* Apply configuration */
-    reg_mprj_xfer = 1;
-    while (reg_mprj_xfer == 1);
+    //reg_mprj_io_37 = GPIO_MODE_USER_STD_BIDIRECTIONAL_PULLUP;
+    //reg_mprj_io_36 = GPIO_MODE_USER_STD_BIDIRECTIONAL_PULLUP;
+    //reg_mprj_io_35 = GPIO_MODE_USER_STD_BIDIRECTIONAL_PULLUP;
+    //reg_mprj_io_34 = GPIO_MODE_USER_STD_BIDIRECTIONAL_PULLUP;
+    //reg_mprj_io_33 = GPIO_MODE_USER_STD_BIDIRECTIONAL_PULLUP;
+    //reg_mprj_io_32 = GPIO_MODE_USER_STD_BIDIRECTIONAL_PULLUP;
+    //reg_mprj_io_31 = GPIO_MODE_USER_STD_BIDIRECTIONAL_PULLUP;
+    //reg_mprj_io_30 = GPIO_MODE_USER_STD_BIDIRECTIONAL_PULLUP;
+    //reg_mprj_io_29 = GPIO_MODE_USER_STD_BIDIRECTIONAL_PULLUP;
+    //reg_mprj_io_28 = GPIO_MODE_USER_STD_BIDIRECTIONAL_PULLUP;
+    //reg_mprj_io_27 = GPIO_MODE_USER_STD_BIDIRECTIONAL_PULLUP;
+    //reg_mprj_io_26 = GPIO_MODE_USER_STD_BIDIRECTIONAL_PULLUP;
+    //reg_mprj_io_25 = GPIO_MODE_USER_STD_BIDIRECTIONAL_PULLUP;
+    //reg_mprj_io_24 = GPIO_MODE_USER_STD_BIDIRECTIONAL_PULLUP;
+    //reg_mprj_io_23 = GPIO_MODE_USER_STD_BIDIRECTIONAL_PULLUP;
+    //reg_mprj_io_22 = GPIO_MODE_USER_STD_BIDIRECTIONAL_PULLUP;
+    //reg_mprj_io_21 = GPIO_MODE_USER_STD_BIDIRECTIONAL_PULLUP;
+    //reg_mprj_io_20 = GPIO_MODE_USER_STD_BIDIRECTIONAL_PULLUP;
+    //reg_mprj_io_19 = GPIO_MODE_USER_STD_BIDIRECTIONAL_PULLUP;
+    //reg_mprj_io_18 = GPIO_MODE_USER_STD_BIDIRECTIONAL_PULLUP;
+    //reg_mprj_io_17 = GPIO_MODE_USER_STD_BIDIRECTIONAL_PULLUP;
+    //reg_mprj_io_16 = GPIO_MODE_USER_STD_BIDIRECTIONAL_PULLUP;
+    //reg_mprj_io_15 = GPIO_MODE_USER_STD_BIDIRECTIONAL_PULLUP;
+    //reg_mprj_io_14 = GPIO_MODE_USER_STD_BIDIRECTIONAL_PULLUP;
+    //reg_mprj_io_13 = GPIO_MODE_USER_STD_BIDIRECTIONAL_PULLUP;
+    //reg_mprj_io_12 = GPIO_MODE_USER_STD_BIDIRECTIONAL_PULLUP;
+    //reg_mprj_io_11 = GPIO_MODE_USER_STD_BIDIRECTIONAL_PULLUP;
+    //reg_mprj_io_10 = GPIO_MODE_USER_STD_BIDIRECTIONAL_PULLUP;
+    //reg_mprj_io_9  = GPIO_MODE_USER_STD_BIDIRECTIONAL_PULLUP;
+    //reg_mprj_io_8  = GPIO_MODE_USER_STD_BIDIRECTIONAL_PULLUP;
+    //reg_mprj_io_7  = GPIO_MODE_USER_STD_BIDIRECTIONAL_PULLUP;
+    //reg_mprj_io_6 =  GPIO_MODE_USER_STD_BIDIRECTIONAL_PULLUP;
+    //reg_mprj_io_5 =  GPIO_MODE_USER_STD_BIDIRECTIONAL_PULLUP;
+    //reg_mprj_io_4 =  GPIO_MODE_USER_STD_BIDIRECTIONAL_PULLUP;
+    //reg_mprj_io_3 =  GPIO_MODE_USER_STD_BIDIRECTIONAL_PULLUP;
+    //reg_mprj_io_2 =  GPIO_MODE_USER_STD_BIDIRECTIONAL_PULLUP;
+    //reg_mprj_io_1 =  GPIO_MODE_USER_STD_BIDIRECTIONAL_PULLUP;
+    //reg_mprj_io_0 =  GPIO_MODE_USER_STD_BIDIRECTIONAL_PULLUP;
+
+    // /* Apply configuration */
+    //reg_mprj_xfer = 1;
+    //while (reg_mprj_xfer == 1);
 
     reg_la0_data = 0x000;
     //reg_la0_data = 0x000;
diff --git a/verilog/dv/uart_master/uart_master_tb.v b/verilog/dv/uart_master/uart_master_tb.v
index f49daab..ea30b91 100644
--- a/verilog/dv/uart_master/uart_master_tb.v
+++ b/verilog/dv/uart_master/uart_master_tb.v
@@ -18,7 +18,9 @@
 `timescale 1 ns / 1 ps
 `include "uart_agent.v"
 
-module uart_master_tb;
+`define TB_HEX "uart_master.hex"
+`define TB_TOP  uart_master_tb
+module `TB_TOP;
 	reg clock;
 	reg RSTB;
 	reg CSB;
@@ -70,13 +72,11 @@
 	`ifdef WFDUMP
 	initial begin
 		$dumpfile("simx.vcd");
-		$dumpvars(1, uart_master_tb);
-		$dumpvars(1, uart_master_tb.uut);
-		$dumpvars(1, uart_master_tb.uut.mprj);
-		$dumpvars(1, uart_master_tb.uut.mprj.u_wb_host);
-		$dumpvars(1, uart_master_tb.uut.mprj.u_wb_host.u_uart2wb);
-		$dumpvars(1, uart_master_tb.tb_master_uart);
-		//$dumpvars(2, uart_master_tb.uut.mprj.u_pinmux);
+		$dumpvars(2, `TB_TOP);
+		$dumpvars(0, `TB_TOP.tb_master_uart);
+		$dumpvars(0, `TB_TOP.uut.mprj.u_wb_host.u_uart2wb);
+		$dumpvars(1, `TB_TOP.tb_master_uart);
+		$dumpvars(0, `TB_TOP.uut.mprj.u_pinmux);
 	end
        `endif
 
@@ -84,7 +84,7 @@
 
 		// Repeat cycles of 1000 clock edges as needed to complete testbench
 		repeat (400) begin
-			repeat (1000) @(posedge clock);
+			repeat (10000) @(posedge clock);
 			// $display("+1000 cycles");
 		end
 		$display("%c[1;31m",27);
@@ -101,25 +101,26 @@
 
 	initial begin
             uart_data_bit           = 2'b11;
-            uart_stop_bits          = 1; // 0: 1 stop bit; 1: 2 stop bit;
+            uart_stop_bits          = 0; // 0: 1 stop bit; 1: 2 stop bit;
             uart_stick_parity       = 0; // 1: force even parity
             uart_parity_en          = 0; // parity enable
             uart_even_odd_parity    = 1; // 0: odd parity; 1: even parity
             uart_divisor            = 15;// divided by n * 16
-            uart_timeout            = 600;// wait time limit
+            uart_timeout            = 200;// wait time limit
             uart_fifo_enable        = 0;	// fifo mode disable
             tb_master_uart.debug_mode = 0; // disable debug display
 
             #200; // Wait for reset removal
 
- 	    wait(checkbits == 16'h AB60);
-		$display("Monitor: UART Master Test Started");
+ 	//    wait(checkbits == 16'h AB60);
+	//	$display("Monitor: UART Master Test Started");
 
-	   repeat (50000) @(posedge clock);  
+	   repeat (10000) @(posedge clock);  
             tb_master_uart.uart_init;
             tb_master_uart.control_setup (uart_data_bit, uart_stop_bits, uart_parity_en, uart_even_odd_parity, 
         	                          uart_stick_parity, uart_timeout, uart_divisor);
            //$write ("\n(%t)Response:\n",$time);
+           // Wait for Initial Command Format from the uart master
            flag = 0;
            while(flag == 0)
            begin
@@ -174,11 +175,11 @@
 
 	initial begin
 		RSTB <= 1'b0;
-		CSB  <= 1'b1;		// Force CSB high
+		//CSB  <= 1'b1;		// Force CSB high
 		#2000;
 		RSTB <= 1'b1;	    	// Release reset
 		#170000;
-		CSB = 1'b0;		// CSB can be released
+		//CSB = 1'b0;		// CSB can be released
 	end
 
 	initial begin		// Power-up sequence
@@ -262,8 +263,8 @@
 // --------------------------
 wire uart_txd,uart_rxd;
 
-assign uart_txd   = mprj_io[35];
-assign mprj_io[34]  = uart_rxd ;
+assign uart_txd   = mprj_io[23];
+assign mprj_io[22]  = uart_rxd ;
  
 uart_agent tb_master_uart(
 	.mclk                (clock              ),
@@ -276,6 +277,4 @@
 
 endmodule
 
-// SSFLASH has 1ps/1ps time scale
-`include "s25fl256s.sv"
 `default_nettype wire
diff --git a/verilog/dv/user_aes/user_aes_tb.v b/verilog/dv/user_aes/user_aes_tb.v
index 8d236d4..769596e 100644
--- a/verilog/dv/user_aes/user_aes_tb.v
+++ b/verilog/dv/user_aes/user_aes_tb.v
@@ -194,7 +194,13 @@
 		end else if(d_risc_id == 1) begin
 		     $display("STATUS: Working with Risc core 1");
                      wb_user_core_write(`ADDR_SPACE_GLBL+`GLBL_CFG_CFG0,'h21F);
-		end 
+		end else if(d_risc_id == 2) begin
+		     $display("STATUS: Working with Risc core 2");
+                     wb_user_core_write(`ADDR_SPACE_GLBL+`GLBL_CFG_CFG0,'h41F);
+		end else if(d_risc_id == 3) begin
+		     $display("STATUS: Working with Risc core 3");
+                     wb_user_core_write(`ADDR_SPACE_GLBL+`GLBL_CFG_CFG0,'h81F);
+		end
 
                repeat (100) @(posedge clock);  // wait for Processor Get Ready
 
@@ -281,6 +287,9 @@
     .user_irq       () 
 
 );
+// SSPI Slave I/F
+assign io_in[0]  = 1'b1; // RESET
+assign io_in[16] = 1'b0 ; // SPIS SCK 
 
 `ifndef GL // Drive Power for Hold Fix Buf
     // All standard cell need power hook-up for functionality work
diff --git a/verilog/dv/user_basic/user_basic_tb.v b/verilog/dv/user_basic/user_basic_tb.v
index 5f1c60b..f6c36e5 100644
--- a/verilog/dv/user_basic/user_basic_tb.v
+++ b/verilog/dv/user_basic/user_basic_tb.v
@@ -71,16 +71,20 @@
 
 `default_nettype wire
 
-`timescale 1 ns/10 ps
+`timescale 1 ns/1 ps
 
 `include "sram_macros/sky130_sram_2kbyte_1rw1r_32x512_8.v"
+`include "user_params.svh"
 
 module user_basic_tb;
 parameter CLK1_PERIOD = 10;
-parameter CLK2_PERIOD = 2;
+parameter CLK2_PERIOD = 2.5;
+parameter IPLL_PERIOD = 5.008;
+parameter XTAL_PERIOD = 6;
 
 reg            clock         ;
 reg            clock2        ;
+reg            xtal_clk      ;
 reg            wb_rst_i      ;
 reg            power1, power2;
 reg            power3, power4;
@@ -104,6 +108,7 @@
 wire [37:0]    mprj_io       ;
 wire [7:0]     mprj_io_0     ;
 reg            test_fail     ;
+reg [31:0]     write_data     ;
 reg [31:0]     read_data     ;
 //----------------------------------
 // Uart Configuration
@@ -125,6 +130,81 @@
 
 wire           clock_mon;
 integer        test_step;
+reg  [15:0]    strap_in;
+wire [31:0]    strap_sticky;
+reg  [7:0]     test_id;
+
+assign io_in = {26'h0,xtal_clk,11'h0};
+
+wire [14:0] pstrap_select;
+
+assign pstrap_select = (strap_in[15] == 1'b1) ?  PSTRAP_DEFAULT_VALUE : strap_in[14:0];
+
+
+assign strap_sticky = {
+                   2'b0            , // bit[31:30]   - reserved
+                   pstrap_select[12:11] , // bit[29:28]   - cfg_cska_qspi_co Skew selection
+                   pstrap_select[12:11] , // bit[27:26]   - cfg_cska_pinmux Skew selection
+                   pstrap_select[12:11] , // bit[25:24]   - cfg_cska_uart  Skew selection
+                   pstrap_select[12:11] , // bit[23:22]   - cfg_cska_qspi  Skew selection
+                   pstrap_select[12:11] , // bit[21:20]   - cfg_cska_riscv Skew selection
+                   pstrap_select[12:11] , // bit[19:18]   - cfg_cska_wh Skew selection
+                   pstrap_select[12:11] , // bit[17:16]   - cfg_cska_wi Skew selection
+                   1'b0               , // bit[15]      - Soft Reboot Request - Need to double sync to local clock
+                   pstrap_select[10]    , // bit[14]      - Riscv SRAM clock edge selection
+                   pstrap_select[9]     , // bit[13]      - Riscv Cache Bypass
+                   pstrap_select[8]     , // bit[12]      - Riscv Reset control
+                   pstrap_select[7:6]   , // bit[11:10]   - QSPI FLASH Mode Selection CS#0
+                   pstrap_select[5]     , // bit[9]       - QSPI SRAM Mode Selection CS#2
+                   pstrap_select[4]     , // bit[8]       - uart master config control
+                   pstrap_select[3:2]   , // bit[7:6]     - riscv clock div
+                   pstrap_select[1:0]   , // bit[5:4]     - riscv clock source sel
+                   pstrap_select[3:2]   , // bit[3:2]     - wbs clock division
+                   pstrap_select[1:0]     // bit[1:0]     - wbs clock source sel
+                   };
+
+
+reg [1:0]  strap_skew;
+wire [31:0] skew_config;
+
+assign skew_config[3:0]   =   (strap_skew == 2'b00) ?  SKEW_RESET_VAL[3:0] :
+                              (strap_skew == 2'b01) ?  SKEW_RESET_VAL[3:0] + 2 :
+                              (strap_skew == 2'b10) ?  SKEW_RESET_VAL[3:0] + 4 : SKEW_RESET_VAL[3:0]-4;
+
+assign skew_config[7:4]   =   (strap_skew == 2'b00) ?  SKEW_RESET_VAL[7:4]  :
+                              (strap_skew == 2'b01) ?  SKEW_RESET_VAL[7:4] + 2 :
+                              (strap_skew == 2'b10) ?  SKEW_RESET_VAL[7:4] + 4 : SKEW_RESET_VAL[7:4]-4;
+
+assign skew_config[11:8]  =   (strap_skew == 2'b00) ?  SKEW_RESET_VAL[11:8]  :
+                              (strap_skew == 2'b01) ?  SKEW_RESET_VAL[11:8] + 2 :
+                              (strap_skew == 2'b10) ?  SKEW_RESET_VAL[11:8] + 4 : SKEW_RESET_VAL[11:8]-4;
+
+assign skew_config[15:12] =   (strap_skew == 2'b00) ?  SKEW_RESET_VAL[15:12]  :
+                              (strap_skew == 2'b01) ?  SKEW_RESET_VAL[15:12] + 2 :
+                              (strap_skew == 2'b10) ?  SKEW_RESET_VAL[15:12] + 4 : SKEW_RESET_VAL[15:12]-4;
+
+assign skew_config[19:16] =   (strap_skew == 2'b00) ?  SKEW_RESET_VAL[19:16]  :
+                              (strap_skew == 2'b01) ?  SKEW_RESET_VAL[19:16] + 2 :
+                              (strap_skew == 2'b10) ?  SKEW_RESET_VAL[19:16] + 4 : SKEW_RESET_VAL[19:16]-4;
+
+assign skew_config[23:20] =   (strap_skew == 2'b00) ?  SKEW_RESET_VAL[23:20]  :
+                              (strap_skew == 2'b01) ?  SKEW_RESET_VAL[23:20] + 2 :
+                              (strap_skew == 2'b10) ?  SKEW_RESET_VAL[23:20] + 4 : SKEW_RESET_VAL[23:20]-4;
+
+assign skew_config[27:24] =   (strap_skew == 2'b00) ?  SKEW_RESET_VAL[27:24] :
+                              (strap_skew == 2'b01) ?  SKEW_RESET_VAL[27:24] + 2 :
+                              (strap_skew == 2'b10) ?  SKEW_RESET_VAL[27:24] + 4 : SKEW_RESET_VAL[27:24]-4;
+
+assign skew_config[31:28] = 4'b0;
+
+//----------------------------------------------------------
+reg [3:0] cpu_clk_cfg,wbs_clk_cfg;
+wire [7:0] clk_ctrl2 = {cpu_clk_cfg,wbs_clk_cfg};
+
+
+
+//-----------------------------------------------------------
+
 
 integer i,j;
 
@@ -134,6 +214,7 @@
 
 	always #(CLK1_PERIOD/2) clock  <= (clock === 1'b0);
 	always #(CLK2_PERIOD/2) clock2 <= (clock2 === 1'b0);
+	always #(XTAL_PERIOD/2) xtal_clk <= (xtal_clk === 1'b0);
 
 	initial begin
 		test_step = 0;
@@ -151,18 +232,20 @@
 	   initial begin
 	   	$dumpfile("simx.vcd");
 	   	$dumpvars(1, user_basic_tb);
-	   	//$dumpvars(1, user_basic_tb.u_top);
+	   	$dumpvars(1, user_basic_tb.u_top);
 	   	//$dumpvars(0, user_basic_tb.u_top.u_pll);
 	   	$dumpvars(0, user_basic_tb.u_top.u_wb_host);
+	   	//$dumpvars(0, user_basic_tb.u_top.u_intercon);
 	   	//$dumpvars(1, user_basic_tb.u_top.u_intercon);
-	   	//$dumpvars(1, user_basic_tb.u_top.u_intercon);
-	   	//$dumpvars(1, user_basic_tb.u_top.u_pinmux);
+	   	$dumpvars(0, user_basic_tb.u_top.u_pinmux);
 	   end
        `endif
 
 	initial begin
+		wb_rst_i <= 1'b0;
+		#1000;
 		wb_rst_i <= 1'b1;
-		#100;
+		#1000;
 		wb_rst_i <= 1'b0;	    	// Release reset
 	end
 
@@ -177,118 +260,247 @@
    repeat (2) @(posedge clock);
 
    test_fail=0;
+   // Run in Fast Sim Mode
+   `ifdef GL
+       force u_top.u_wb_host._8654_.Q= 1'b1; 
+   `else
+       force u_top.u_wb_host.u_fastsim_buf.X = 1'b1; 
+    `endif
+
    fork
-      begin
-	  // Default Value Check
-	  // cfg_wb_clk_ctrl      = cfg_clk_ctrl2[7:0];
-          // cfg_rtc_clk_ctrl     = cfg_clk_ctrl2[15:8];
-          // cfg_cpu_clk_ctrl     = cfg_clk_ctrl2[23:16];
-          // cfg_usb_clk_ctrl     = cfg_clk_ctrl2[31:24];
-
-
-	  $display("Step-1, CPU: CLOCK1, USB: CLOCK2,RTC: CLOCK2 *2, WBS:CLOCK1");
-	  test_step = 1;
-          wb_user_core_write(`ADDR_SPACE_WBHOST+`WBHOST_CLK_CTRL2,{8'h0,8'h0,8'h0,8'h0});
-	  clock_monitor(CLK1_PERIOD,CLK1_PERIOD,CLK2_PERIOD*2,CLK1_PERIOD);
-
-	  $display("Step-2, CPU: CLOCK2, USB: CLOCK2/2, RTC: CLOCK2/(2+1), WBS:CLOCK2");
-	  test_step = 2;
-          wb_user_core_write(`ADDR_SPACE_WBHOST+`WBHOST_CLK_CTRL2,{8'h40,8'h60,8'h1,8'h40});
-	  clock_monitor(CLK2_PERIOD,2*CLK2_PERIOD,(3)*CLK2_PERIOD,CLK2_PERIOD);
-
-	  $display("Step-3, CPU: CLOCK1/2,USB: CLOCK2/(2+1), RTC: CLOCK2/(2+2), WBS:CLOCK1/2");
-	  test_step = 3;
-          wb_user_core_write(`ADDR_SPACE_WBHOST+`WBHOST_CLK_CTRL2,{8'h20,8'h61,8'h2,8'h20});
-	  clock_monitor(2*CLK1_PERIOD,(3)*CLK2_PERIOD,4*CLK2_PERIOD,2*CLK1_PERIOD);
-
-	  $display("Step-4, CPU: CLOCK1/3, USB: CLOCK2/(2+2), RTC: CLOCK2/(2+3), WBS:CLOCK1/3");
-	  test_step = 4;
-          wb_user_core_write(`ADDR_SPACE_WBHOST+`WBHOST_CLK_CTRL2,{8'h21,8'h62,8'h3,8'h21});
-	  clock_monitor(3*CLK1_PERIOD,4*CLK2_PERIOD,5*CLK2_PERIOD,3*CLK1_PERIOD);
-
-	  $display("Step-5, CPU: CLOCK1/4, USB: CLOCK2/(2+3), RTC: CLOCK2/(2+4), WBS:CLOCK1/4");
-	  test_step = 5;
-          wb_user_core_write(`ADDR_SPACE_WBHOST+`WBHOST_CLK_CTRL2,{8'h22,8'h63,8'h4,8'h22});
-	  clock_monitor(4*CLK1_PERIOD,5*CLK2_PERIOD,6*CLK2_PERIOD,4*CLK1_PERIOD);
-
-	  $display("Step-6, CPU: CLOCK1/(2+3),USB: CLOCK2/(2+4), RTC: CLOCK2/(2+5), WBS:CLOCK1/(2+3)");
-	  test_step = 6;
-          wb_user_core_write(`ADDR_SPACE_WBHOST+`WBHOST_CLK_CTRL2,{8'h23,8'h64,8'h5,8'h23});
-	  clock_monitor(5*CLK1_PERIOD,6*CLK2_PERIOD,7*CLK2_PERIOD,5*CLK1_PERIOD);
-
-	  $display("Step-7, CPU: CLOCK2/(2), USB: CLOCK2/(2+5), RTC: CLOCK2/(2+6), WBS:CLOCK2/(2)");
-	  test_step = 7;
-          wb_user_core_write(`ADDR_SPACE_WBHOST+`WBHOST_CLK_CTRL2,{8'h60,8'h65,8'h6,8'h60});
-	  clock_monitor(2*CLK2_PERIOD,7*CLK2_PERIOD,8*CLK2_PERIOD,2*CLK2_PERIOD);
-
-	  $display("Step-8, CPU: CLOCK2/3, USB: CLOCK2/(2+6), RTC: CLOCK2/(2+7), WBS:CLOCK2/3");
-	  test_step = 8;
-          wb_user_core_write(`ADDR_SPACE_WBHOST+`WBHOST_CLK_CTRL2,{8'h61,8'h66,8'h7,8'h61});
-	  clock_monitor(3*CLK2_PERIOD,8*CLK2_PERIOD,9*CLK2_PERIOD,3*CLK2_PERIOD);
-
-	  $display("Step-9, CPU: CLOCK2/4,USB: CLOCK2/(2+7), RTC: CLOCK2/(2+8), WBS:CLOCK2/4");
-	  test_step = 9;
-          wb_user_core_write(`ADDR_SPACE_WBHOST+`WBHOST_CLK_CTRL2,{8'h62,8'h67,8'h8,8'h62});
-	  clock_monitor(4*CLK2_PERIOD,9*CLK2_PERIOD,10*CLK2_PERIOD,4*CLK2_PERIOD);
-
-	  $display("Step-10, CPU: CLOCK2/(2+3), USB: CLOCK2/(2+8), RTC: CLOCK2/(2+128), WBS:CLOCK1/(2+3)");
-	  test_step = 10;
-          wb_user_core_write(`ADDR_SPACE_WBHOST+`WBHOST_CLK_CTRL2,{8'h63,8'h68,8'h80,8'h63});
-	  clock_monitor(5*CLK2_PERIOD,10*CLK2_PERIOD,130*CLK2_PERIOD,5*CLK2_PERIOD);
-
-	  $display("Step-11, CPU: CLOCK2/(2+3), USB: CLOCK2/(2+9), RTC: CLOCK2/(2+255), WBS:CLOCK2/(2+4)");
-	  test_step = 10;
-          wb_user_core_write(`ADDR_SPACE_WBHOST+`WBHOST_CLK_CTRL2,{8'h63,8'h69,8'hFF,8'h64});
-	  clock_monitor(5*CLK2_PERIOD,11*CLK2_PERIOD,257*CLK2_PERIOD,6*CLK2_PERIOD);
- 
-     `ifndef GL  
-     $display("###################################################");
-     $display("Monitor: Checking the PLL:");
-     $display("###################################################");
-	 test_step = 11;
-	 // Set PLL enable, no DCO mode ; Set PLL output divider to 0x03
-     wb_user_core_write(`ADDR_SPACE_WBHOST+`WBHOST_GLBL_CFG,{16'h0,1'b1,3'b100,4'b0000,8'h2});
-     wb_user_core_write(`ADDR_SPACE_WBHOST+`WBHOST_PLL_CTRL,{1'b0,5'h3,26'h00000});
-     repeat (100) @(posedge clock);
-	 pll_clock_monitor(5);
-
-	 test_step = 12;
-	 // Set PLL enable, DCO mode ; Set PLL output divider to 0x01
-     wb_user_core_write(`ADDR_SPACE_WBHOST+`WBHOST_GLBL_CFG,{16'h0,1'b1,3'b000,4'b0000,8'h2});
-     wb_user_core_write(`ADDR_SPACE_WBHOST+`WBHOST_PLL_CTRL,{1'b1,5'h0,26'h0000});
-     repeat (100) @(posedge clock);
-	 pll_clock_monitor(4);
-
-     $display("###################################################");
-     $display("Monitor: Monitor Clock output:");
-     $display("###################################################");
-	 $display("Monitor: CPU: CLOCK2/(2+3), USB: CLOCK2/(2+9), RTC: CLOCK2/(2+255), WBS:CLOCK2/(2+4)");
-	 test_step = 13;
-     wb_user_core_write(`ADDR_SPACE_WBHOST+`WBHOST_CLK_CTRL2,{8'h63,8'h69,8'hFF,8'h64});
-
-	 // Set PLL enable, DCO mode ; Set PLL output divider to 0x01
-     wb_user_core_write(`ADDR_SPACE_WBHOST+`WBHOST_GLBL_CFG,{16'h0,1'b1,3'b000,4'b0000,8'h2});
-     wb_user_core_write(`ADDR_SPACE_WBHOST+`WBHOST_PLL_CTRL,{1'b1,5'h0,26'h0000});
-	 dbg_clk_monitor(79,60,5*CLK2_PERIOD,11*CLK2_PERIOD,257*CLK2_PERIOD,6*CLK2_PERIOD);
-     `endif
+   begin
+       $display("##########################################################");
+       $display("Step-1, Checking the Strap Loading");
+       test_id = 1;
+       for(i = 0; i < 16; i = i+1) begin
+          //#1 - Apply Reset
+          wb_rst_i = 1; 
+          test_step = 1;
+          //#2 - Apply Strap
+          strap_in = 1 << i; 
+          force u_top.io_in[36:29] = strap_in[15:8];
+          force u_top.io_in[20:13] = strap_in[7:0];
+          repeat (10) @(posedge clock);
+          test_step = 2;
          
-	 $display("###################################################");
-         $display("Monitor: Checking the chip signature :");
-         $display("###################################################");
-	 test_step = 14;
-         // Remove Wb/PinMux Reset
-         wb_user_core_write(`ADDR_SPACE_WBHOST+`WBHOST_GLBL_CFG,'h1);
+          //#3 - Remove Reset
+          wb_rst_i = 0; // Remove Reset
+          test_step = 3;
 
-	 wb_user_core_read_check(`ADDR_SPACE_GLBL+`GLBL_CFG_SOFT_REG_0,read_data,32'h8273_8343);
-	 wb_user_core_read_check(`ADDR_SPACE_GLBL+`GLBL_CFG_SOFT_REG_1,read_data,32'h1508_2022);
-	 wb_user_core_read_check(`ADDR_SPACE_GLBL+`GLBL_CFG_SOFT_REG_2,read_data,32'h0005_0000);
+          //#4 - Wait for Power on reset removal
+          wait(u_top.p_reset_n == 1);          
+          test_step = 4;
 
+          // #5 - Release the Strap
+          release u_top.io_in[36:29];
+          release u_top.io_in[20:13];
+          test_step = 5;
+
+          // #6 - Wait for system reset removal
+          wait(u_top.s_reset_n == 1);          // Wait for system reset removal
+          repeat (10) @(posedge clock);
+          test_step = 6;
+
+          //#7 - Check the strap reg value
+          wb_user_core_read_check(`ADDR_SPACE_GLBL+`GLBL_CFG_PAD_STRAP,read_data,strap_in);
+          wb_user_core_read_check(`ADDR_SPACE_GLBL+`GLBL_CFG_STRAP_STICKY,read_data,strap_sticky);
+          wb_user_core_read_check(`ADDR_SPACE_GLBL+`GLBL_CFG_SYSTEM_STRAP,read_data,strap_sticky);
+          test_step = 7;
+       end
+ 
+       
+       if(test_fail == 1) begin
+          $display("ERROR: Step-1, Checking the Strap Loading - FAILED");
+       end else begin
+          $display("STATUS: Step-1, Checking the Strap Loading - PASSED");
+       end
+       $display("##########################################################");
+       $display("Step-2, Checking the Clock Skew Configuration");
+       test_id = 2;
+       for(i = 0; i < 4; i = i+1) begin
+          //#1 - Apply Reset
+          wb_rst_i = 1; 
+          //#2 - Apply Strap
+          strap_in = 0;
+          strap_in[12:11] = i;
+          strap_skew = i;
+          force u_top.io_in[36:29] = strap_in[15:8];
+          force u_top.io_in[20:13] = strap_in[7:0];
+          repeat (10) @(posedge clock);
+         
+          //#3 - Remove Reset
+          wb_rst_i = 0; // Remove Reset
+
+          //#4 - Wait for Power on reset removal
+          wait(u_top.p_reset_n == 1);          
+
+          // #5 - Release the Strap
+          release u_top.io_in[36:29];
+          release u_top.io_in[20:13];
+
+          // #6 - Wait for system reset removal
+          wait(u_top.s_reset_n == 1);          // Wait for system reset removal
+          repeat (10) @(posedge clock);
+
+          //#7 - Check the strap reg value
+          wb_user_core_read_check(`ADDR_SPACE_GLBL+`GLBL_CFG_PAD_STRAP,read_data,strap_in);
+          wb_user_core_read_check(`ADDR_SPACE_GLBL+`GLBL_CFG_STRAP_STICKY,read_data,strap_sticky);
+          wb_user_core_read_check(`ADDR_SPACE_GLBL+`GLBL_CFG_SYSTEM_STRAP,read_data,strap_sticky);
+          wb_user_core_read_check(`ADDR_SPACE_WBHOST+`WBHOST_CLK_CTRL1,read_data,skew_config);
+       end
+       if(test_fail == 1) begin
+          $display("ERROR: Step-2, Checking the Clock Skew Configuration - FAILED");
+       end else begin
+          $display("STATUS: Step-2, Checking the Clock Skew Configuration - PASSED");
+       end
+       $display("##########################################################");
+       $display("Step-3, Checking the riscv/wbs clock Selection though Strap");
+       test_id = 3;
+       for(i = 0; i < 4; i = i+1) begin
+          for(j = 0; j < 4; j = j+1) begin
+              //#1 - Apply Reset
+              wb_rst_i = 1; 
+              //#2 - Apply Strap
+              strap_in = 0;
+
+              strap_in[1:0] = i;
+              cpu_clk_cfg[1:0]=i;
+              wbs_clk_cfg[1:0]=i;
+
+              strap_in[3:2] = j;
+              cpu_clk_cfg[3:2]=j;
+              wbs_clk_cfg[3:2]=j;
+
+              strap_in[3:2] = j;
+              force u_top.io_in[36:29] = strap_in[15:8];
+              force u_top.io_in[20:13] = strap_in[7:0];
+              repeat (10) @(posedge clock);
+         
+              //#3 - Remove Reset
+              wb_rst_i = 0; // Remove Reset
+
+              //#4 - Wait for Power on reset removal
+              wait(u_top.p_reset_n == 1);          
+
+              // #5 - Release the Strap
+              release u_top.io_in[36:29];
+              release u_top.io_in[20:13];
+
+              // #6 - Wait for system reset removal
+              wait(u_top.s_reset_n == 1);          // Wait for system reset removal
+              repeat (10) @(posedge clock);
+
+              //#7 - Check the strap reg value
+              wb_user_core_read_check(`ADDR_SPACE_GLBL+`GLBL_CFG_PAD_STRAP,read_data,strap_in);
+              wb_user_core_read_check(`ADDR_SPACE_GLBL+`GLBL_CFG_STRAP_STICKY,read_data,strap_sticky);
+              wb_user_core_read_check(`ADDR_SPACE_GLBL+`GLBL_CFG_SYSTEM_STRAP,read_data,strap_sticky);
+              wb_user_core_read_check(`ADDR_SPACE_WBHOST+`WBHOST_CLK_CTRL2,read_data,clk_ctrl2);
+              clock_monitor2(cpu_clk_cfg,wbs_clk_cfg);
+          end
+       end
+       if(test_fail == 1) begin
+          $display("ERROR: Step-3, Checking the riscv/wbs clock Selection though Strap - FAILED");
+       end else begin
+          $display("STATUS: Step-3, Checking the riscv/wbs clock Selection though Strap - PASSED");
+       end
+       $display("##########################################################");
+
+       $display("##########################################################");
+       $display("Step-4, Checking the soft reboot sequence");
+       test_id = 4;
+       for(i = 0; i < 31; i = i+1) begin
+         // #1 - Write Data to Sticky bit and Set Reboot Request
+          wait(u_top.s_reset_n == 1);          // Wait for system reset removal
+         write_data = (1<< i) ; // bit[31] = 1 in soft reboot request
+         write_data = write_data + (1 << `STRAP_SOFT_REBOOT_REQ); // bit[STRAP_SOFT_REBOOT_REQ] = 1 in soft reboot request
+         wb_user_core_write(`ADDR_SPACE_GLBL+`GLBL_CFG_STRAP_STICKY,write_data);
+
+
+          // #3 - Wait for system reset removal
+          wait(u_top.s_reset_n == 1);          // Wait for system reset removal
+          wb_user_core_read_check(`ADDR_SPACE_GLBL+`GLBL_CFG_STRAP_STICKY,read_data,{1'b0,write_data[30:0]});
+          wb_user_core_read_check(`ADDR_SPACE_GLBL+`GLBL_CFG_SYSTEM_STRAP,read_data,write_data);
+          repeat (10) @(posedge clock);
+
+       end
+
+       if(test_fail == 1) begin
+          $display("ERROR: Step-4, Checking the soft reboot sequence - FAILED");
+       end else begin
+          $display("STATUS: Step-4, Checking the soft reboot sequence - PASSED");
+       end
+       $display("##########################################################");
+
+       /*** 
+       `ifndef GL  
+       $display("###################################################");
+       $display("Step-5,Monitor: Checking the PLL:");
+       $display("###################################################");
+       test_id = 5;
+       // Set PLL enable, no DCO mode ; Set PLL output divider to 0x03
+       wb_user_core_write(`ADDR_SPACE_WBHOST+`WBHOST_GLBL_CFG,{16'h0,1'b1,3'b100,4'b0000,8'h2});
+       wb_user_core_write(`ADDR_SPACE_WBHOST+`WBHOST_PLL_CTRL,{1'b0,5'h3,26'h00000});
+       repeat (100) @(posedge clock);
+       pll_clock_monitor(5.101);
+
+       test_step = 12;
+       // Set PLL enable, DCO mode ; Set PLL output divider to 0x01
+       wb_user_core_write(`ADDR_SPACE_WBHOST+`WBHOST_GLBL_CFG,{16'h0,1'b1,3'b000,4'b0000,8'h2});
+       wb_user_core_write(`ADDR_SPACE_WBHOST+`WBHOST_PLL_CTRL,{1'b1,5'h0,26'h0000});
+       repeat (100) @(posedge clock);
+       pll_clock_monitor(4.080);
+
+       if(test_fail == 1) begin
+          $display("ERROR: Step-5, Checking the PLL - FAILED");
+       end else begin
+          $display("STATUS: Step-5, Checking the PLL - PASSED");
+       end
+       $display("##########################################################");
+
+       $display("###################################################");
+       $display("Step-6,Monitor: PLL Monitor Clock output:");
+       $display("###################################################");
+       $display("Monitor: CPU: CLOCK2/(2+3), USB: CLOCK2/(2+9), RTC: CLOCK2/(2+255), WBS:CLOCK2/(2+4)");
+       test_id = 6;
+       test_step = 13;
+       wb_user_core_write(`ADDR_SPACE_WBHOST+`WBHOST_CLK_CTRL2,{8'h63,8'h69,8'hFF,8'h64});
+
+       // Set PLL enable, DCO mode ; Set PLL output divider to 0x01
+       wb_user_core_write(`ADDR_SPACE_WBHOST+`WBHOST_GLBL_CFG,{16'h0,1'b1,3'b000,4'b0000,8'h2});
+       wb_user_core_write(`ADDR_SPACE_WBHOST+`WBHOST_PLL_CTRL,{1'b1,5'h0,26'h0000});
+       dbg_clk_monitor(79,60,5*CLK2_PERIOD,11*CLK2_PERIOD,257*CLK2_PERIOD,6*CLK2_PERIOD);
+       `endif
+          
+       if(test_fail == 1) begin
+          $display("ERROR: Step-6, PLL Monitor Clock output - FAILED");
+       end else begin
+          $display("STATUS: Step-6, PLL Monitor Clock output - PASSED");
+       end
+      ****/
+       $display("##########################################################");
+        $display("Step-7,Monitor: Checking the chip signature :");
+        $display("###################################################");
+       test_id = 7;
+        test_step = 14;
+        // Remove Wb/PinMux Reset
+        wb_user_core_write(`ADDR_SPACE_WBHOST+`WBHOST_GLBL_CFG,'h1);
+
+         wb_user_core_read_check(`ADDR_SPACE_GLBL+`GLBL_CFG_SOFT_REG_0,read_data,32'h8273_8343);
+         wb_user_core_read_check(`ADDR_SPACE_GLBL+`GLBL_CFG_SOFT_REG_1,read_data,32'h2608_2022);
+         wb_user_core_read_check(`ADDR_SPACE_GLBL+`GLBL_CFG_SOFT_REG_2,read_data,32'h0005_2000);
+         if(test_fail == 1) begin
+            $display("ERROR: Step-7,Monitor: Checking the chip signature - FAILED");
+         end else begin
+            $display("STATUS: Step-7,Monitor: Checking the chip signature - PASSED");
+
+         $display("##########################################################");
+
+          end
       end
-   
       begin
-      repeat (30000) @(posedge clock);
-   		// $display("+1000 cycles");
-      test_fail = 1;
+         repeat (30000) @(posedge clock);
+   	       // $display("+1000 cycles");
+         test_fail = 1;
       end
       join_any
       disable fork; //disable pending fork activity
@@ -345,7 +557,7 @@
  
 
     // IOs
-    .io_in          ('h0)  ,
+    .io_in          (io_in )  ,
     .io_out         (io_out) ,
     .io_oeb         (io_oeb) ,
 
@@ -353,6 +565,7 @@
 
 );
 
+
 `ifndef GL // Drive Power for Hold Fix Buf
     // All standard cell need power hook-up for functionality work
     initial begin
@@ -361,6 +574,57 @@
     end
 `endif    
 
+task clock_monitor2;
+input [3:0] cpu_cfg;
+input [3:0] wbs_cfg;
+real        exp_cpu_period; // ns
+real        exp_wbs_period; // ns
+begin
+   force clock_mon = u_top.u_wb_host.cpu_clk;
+   case(cpu_cfg)
+   4'b0000: exp_cpu_period = CLK1_PERIOD;
+   4'b0001: exp_cpu_period = CLK2_PERIOD;
+   4'b0010: exp_cpu_period = IPLL_PERIOD;
+   4'b0011: exp_cpu_period = XTAL_PERIOD;
+   4'b0100: exp_cpu_period = CLK1_PERIOD*2;
+   4'b0101: exp_cpu_period = CLK2_PERIOD*2;
+   4'b0110: exp_cpu_period = IPLL_PERIOD*2;
+   4'b0111: exp_cpu_period = XTAL_PERIOD*2;
+   4'b1000: exp_cpu_period = CLK1_PERIOD*4;
+   4'b1001: exp_cpu_period = CLK2_PERIOD*4;
+   4'b1010: exp_cpu_period = IPLL_PERIOD*4;
+   4'b1011: exp_cpu_period = XTAL_PERIOD*4;
+   4'b1100: exp_cpu_period = CLK1_PERIOD*8;
+   4'b1101: exp_cpu_period = CLK2_PERIOD*8;
+   4'b1110: exp_cpu_period = IPLL_PERIOD*8;
+   4'b1111: exp_cpu_period = XTAL_PERIOD*8;
+   endcase 
+   check_clock_period("CPU CLock",exp_cpu_period);
+   release clock_mon;
+
+   force clock_mon = u_top.u_wb_host.wbs_clk_out;
+   case(wbs_cfg)
+   4'b0000: exp_wbs_period = CLK1_PERIOD;
+   4'b0001: exp_wbs_period = CLK2_PERIOD;
+   4'b0010: exp_wbs_period = IPLL_PERIOD;
+   4'b0011: exp_wbs_period = XTAL_PERIOD;
+   4'b0100: exp_wbs_period = CLK1_PERIOD*2;
+   4'b0101: exp_wbs_period = CLK2_PERIOD*2;
+   4'b0110: exp_wbs_period = IPLL_PERIOD*2;
+   4'b0111: exp_wbs_period = XTAL_PERIOD*2;
+   4'b1000: exp_wbs_period = CLK1_PERIOD*4;
+   4'b1001: exp_wbs_period = CLK2_PERIOD*4;
+   4'b1010: exp_wbs_period = IPLL_PERIOD*4;
+   4'b1011: exp_wbs_period = XTAL_PERIOD*4;
+   4'b1100: exp_wbs_period = CLK1_PERIOD*8;
+   4'b1101: exp_wbs_period = CLK2_PERIOD*8;
+   4'b1110: exp_wbs_period = IPLL_PERIOD*8;
+   4'b1111: exp_wbs_period = XTAL_PERIOD*8;
+   endcase 
+   check_clock_period("WBS Clock",exp_wbs_period);
+   release clock_mon;
+end
+endtask
 
 task clock_monitor;
 input [15:0] exp_cpu_period;
@@ -372,11 +636,11 @@
    check_clock_period("CPU CLock",exp_cpu_period);
    release clock_mon;
 
-   force clock_mon = u_top.u_wb_host.usb_clk;
+   force clock_mon = u_top.u_pinmux.usb_clk;
    check_clock_period("USB Clock",exp_usb_period);
    release clock_mon;
 
-   force clock_mon = u_top.u_wb_host.rtc_clk;
+   force clock_mon = u_top.u_pinmux.rtc_clk;
    check_clock_period("RTC Clock",exp_rtc_period);
    release clock_mon;
 
@@ -387,7 +651,7 @@
 endtask
 
 task pll_clock_monitor;
-input [15:0] exp_period;
+input real exp_period;
 begin
    //force clock_mon = u_top.u_wb_host.pll_clk_out[0];
    `ifdef GL
@@ -439,22 +703,32 @@
 //----------------------------------
 task check_clock_period;
 input [127:0] clk_name;
-input [15:0] clk_period; // in NS
-time prev_t, next_t, periodd;
+input real    period; 
+real edge2, edge1, clock_period;
+real tolerance,min_period,max_period;
 begin
-	$timeformat(-12,3,"ns",10);
+
+  tolerance = 0.01;
+
+   min_period = period * (1-tolerance);
+   max_period = period * (1+tolerance);
+
+   //$timeformat(-12,2,"ps",10);
    repeat(1) @(posedge clock_mon);
    repeat(1) @(posedge clock_mon);
-   prev_t  = $realtime;
+   edge1  = $realtime;
    repeat(100) @(posedge clock_mon);
-   next_t  = $realtime;
-   periodd = (next_t-prev_t)/100;
-   //periodd = (periodd)/1e9;
-   if(clk_period != periodd) begin
-       $display("STATUS: FAIL => %s Exp Period: %d Rxd: %d",clk_name,clk_period,periodd);
+   edge2  = $realtime;
+   clock_period = (edge2-edge1)/100;
+
+   if ( clock_period > max_period ) begin
+       $display("STATUS: FAIL => %s clock is too fast => Exp: %.3fns Rxd: %.3fns",clk_name,clock_period,max_period);
+       test_fail = 1;
+   end else if ( clock_period < min_period ) begin
+       $display("STATUS: FAIL => %s clock is too slow => Exp: %.3fns Rxd: %.3fns",clk_name,clock_period,min_period);
        test_fail = 1;
    end else begin
-       $display("STATUS: PASS => %s  Period: %d ",clk_name,clk_period);
+       $display("STATUS: PASS => %s  Period: %.3fns ",clk_name,period);
    end
 end
 endtask
diff --git a/verilog/dv/user_cache_bypass/user_cache_bypass_tb.v b/verilog/dv/user_cache_bypass/user_cache_bypass_tb.v
index 45a24d3..28c8f2c 100644
--- a/verilog/dv/user_cache_bypass/user_cache_bypass_tb.v
+++ b/verilog/dv/user_cache_bypass/user_cache_bypass_tb.v
@@ -234,6 +234,9 @@
     .user_irq       () 
 
 );
+// SSPI Slave I/F
+assign io_in[0]  = 1'b1; // RESET
+assign io_in[16] = 1'b0 ; // SPIS SCK 
 
 `ifndef GL // Drive Power for Hold Fix Buf
     // All standard cell need power hook-up for functionality work
diff --git a/verilog/dv/user_gpio/Makefile b/verilog/dv/user_gpio/Makefile
index c5090ee..28bcc52 100644
--- a/verilog/dv/user_gpio/Makefile
+++ b/verilog/dv/user_gpio/Makefile
@@ -78,7 +78,7 @@
 endif
 
 %.vcd: %.vvp
-	vvp $<
+	vvp $< +risc_core_id=$(RISC_CORE)
 
 
 # ---- Clean ----
diff --git a/verilog/dv/user_gpio/user_gpio_tb.v b/verilog/dv/user_gpio/user_gpio_tb.v
index 0451459..a0ab607 100644
--- a/verilog/dv/user_gpio/user_gpio_tb.v
+++ b/verilog/dv/user_gpio/user_gpio_tb.v
@@ -103,9 +103,11 @@
 	wire [7:0] mprj_io_0;
 	reg        test_fail;
 	reg [31:0] read_data;
-        integer    test_step;
-        wire       clock_mon;
+    reg        test_start;
+    integer    test_step;
+    wire       clock_mon;
 
+	integer    d_risc_id;
 
 	// External clock is used by default.  Make this artificially fast for the
 	// simulation.  Normally this would be a slow clock and the digital PLL
@@ -115,109 +117,129 @@
 
 
      /************* Port-A Mapping **********************************
+     *                PA0        digital_io[0]
+     *                PA1        digital_io[1]
+     *                PA2        digital_io[2]
+     *                PA3        digital_io[3]
+     *                PA4        digital_io[4]
      *   ********************************************************/
 
      reg  [7:0]  port_a_out;
-     wire [7:0]  port_a_in = 8'h0;
+     wire [7:0]  port_a_in = {   3'b0,
+		                         io_out[4],
+			                     io_out[3],
+			                     io_out[2],
+		                         io_out[1],
+		                         io_out[0]
+			                 };
+
+
+   assign {     io_in[4],
+		        io_in[3],
+		        io_in[2],
+		        io_in[1],
+		        io_in[0]
+		} = (test_start) ? port_a_out[4:0]: 5'hZ;
+
 
      /************* Port-B Mapping **********************************
-     *   Pin-14       PB0/CLKO/ICP1             digital_io[11]
-     *   Pin-15       PB1/SS[1]OC1A(PWM3)       digital_io[12]
-     *   Pin-16       PB2/SS[0]/OC1B(PWM4)      digital_io[13]
-     *   Pin-17       PB3/MOSI/OC2A(PWM5)       digital_io[14]
-     *   Pin-18       PB4/MISO                  digital_io[15]
-     *   Pin-19       PB5/SCK                   digital_io[16]
-     *   Pin-9        PB6/XTAL1/TOSC1           digital_io[6]
-     *   Pin-10       PB7/XTAL2/TOSC2           digital_io[7]
+       *   Pin-14        8             PB0/WS[2]/CLKO/ICP1             strap[3]    digital_io[16]
+       *   Pin-15        9             PB1/WS[3]/SS[1]OC1A(PWM3)       strap[4]    digital_io[17]
+       *   Pin-16        10            PB2/WS[3]/SS[0]/OC1B(PWM4)      strap[5]    digital_io[18]
+       *   Pin-17        11            PB3/WS[3]/MOSI/OC2A(PWM5)       strap[6]    digital_io[19]
+       *   Pin-18        12            PB4/WS[3]/MISO                  strap[7]    digital_io[20]
+       *   Pin-19        13            PB5/SCK                                     digital_io[21]
+       *   Pin-9         20            PB6/WS[1]/XTAL1/TOSC1                       digital_io[11]
+       *   Pin-10        21            PB7/WS[1]/XTAL2/TOSC2                       digital_io[12]
      *   ********************************************************/
 
      reg  [7:0]  port_b_out;
-     wire [7:0]  port_b_in = {   io_out[7],
-		                 io_out[6],
-		                 io_out[16],
-		                 io_out[15],
-			         io_out[14],
-			         io_out[13],
-		                 io_out[12],
-		                 io_out[11]
+     wire [7:0]  port_b_in = {   io_out[12],
+		                         io_out[11],
+		                         io_out[21],
+		                         io_out[20],
+			                     io_out[19],
+			                     io_out[18],
+		                         io_out[17],
+		                         io_out[16]
 			     };
      
-     assign {   io_in[7],
-		io_in[6],
-		io_in[16],
-		io_in[15],
-		io_in[14],
-		io_in[13],
-		io_in[12],
-		io_in[11]
-		} = port_b_out;
+     assign {   io_in[12],
+		        io_in[11],
+		        io_in[21],
+		        io_in[20],
+		        io_in[19],
+		        io_in[18],
+		        io_in[17],
+		        io_in[16]
+		} = (test_start) ? port_b_out: 8'hZ;
 
      /************* Port-C Mapping **********************************
-     *   Pin-1        PC6/RESET*          digital_io[0]
-     *   Pin-23       PC0/ADC0            digital_io[18]/analog_io[11]
-     *   Pin-24       PC1/ADC1            digital_io[19]/analog_io[12]
-     *   Pin-25       PC2/ADC2            digital_io[20]/analog_io[13]
-     *   Pin-26       PC3/ADC3            digital_io[21]/analog_io[14]
-     *   Pin-27       PC4/ADC4/SDA        digital_io[22]/analog_io[15]
-     *   Pin-28       PC5/ADC5/SCL        digital_io[23]/analog_io[16]
+     *   Pin-23        14            PC0/uartm_rxd/ADC0                          digital_io[22]/analog_io[11]
+     *   Pin-24        15            PC1/uartm_txd/ADC1                          digital_io[23]/analog_io[12]
+     *   Pin-25        16            PC2/usb_dp/ADC2                             digital_io[24]/analog_io[13]
+     *   Pin-26        17            PC3/usb_dn/ADC3                             digital_io[25]/analog_io[14]
+     *   Pin-27        18            PC4/ADC4/SDA                                digital_io[26]/analog_io[15]
+     *   Pin-28        19            PC5/ADC5/SCL                                digital_io[27]/analog_io[16]
+     *   Pin-1         22            PC6/WS[0]/RESET*                            digital_io[5]
      *   ********************************************************/
 
      reg  [7:0]  port_c_out;
      wire [7:0]  port_c_in = {   1'b0,
-		             io_out[0],
+		             io_out[5],
+		             io_out[27],
+		             io_out[26],
+			         io_out[25],
+			         io_out[24],
 		             io_out[23],
-		             io_out[22],
-			     io_out[21],
-			     io_out[20],
-		             io_out[19],
-		             io_out[18]
+		             io_out[22]
 			     };
-      assign {  io_in[0],
-	        io_in[23],
-	        io_in[22],
-	        io_in[21],
-	        io_in[20],
-	        io_in[19],
-	        io_in[18]
-	        } = port_c_out[6:0];
+      assign {  io_in[5],
+	            io_in[27],
+	            io_in[26],
+	            io_in[25],
+	            io_in[24],
+	            io_in[23],
+	            io_in[22]
+	        } = (test_start) ? port_c_out[6:0] : 7'hZ;
 
 
      /************* Port-D Mapping **********************************
-      *   Pin-2        PD0/RXD[0]                digital_io[1]
-      *   Pin-3        PD1/TXD[0]                digital_io[2]
-      *   Pin-4        PD2/RXD[1]/INT0           digital_io[3]
-      *   Pin-5        PD3/INT1/OC2B(PWM0)       digital_io[4]
-      *   Pin-6        PD4/TXD[1]                digital_io[5]
-      *   Pin-11       PD5/SS[3]/OC0B(PWM1)/T1   digital_io[8]
-      *   Pin-12       PD6/SS[2]/OC0A(PWM2)/AIN0 digital_io[9]/analog_io[2]
-      *   Pin-13       PD7/A1N1                  digital_io[10]/analog_io[3]
+      *   Pin-2         0             PD0/WS[0]/RXD[0]                            digital_io[6]
+      *   Pin-3         1             PD1/WS[0]/TXD[0]                            digital_io[7]
+      *   Pin-4         2             PD2/WS[0]/RXD[1]/INT0                       digital_io[8]
+      *   Pin-5         3             PD3/WS[1]INT1/OC2B(PWM0)                    digital_io[9]
+      *   Pin-6         4             PD4/WS[1]TXD[1]                             digital_io[10]
+      *   Pin-11        5             PD5/WS[2]/SS[3]/OC0B(PWM1)/T1   strap[0]    digital_io[13]
+      *   Pin-12        6             PD6/WS[2]/SS[2]/OC0A(PWM2)/AIN0 strap[1]    digital_io[14]/analog_io[2]
+      *   Pin-13        7             PD7/WS[2]/A1N1                  strap[2]    digital_io[15]/analog_io[3]
       *   ********************************************************/
 
      reg  [7:0]  port_d_out;
-     wire [7:0]  port_d_in = {  io_out[10],
-		                io_out[9],
-		                io_out[8],
-		                io_out[5],
-			        io_out[4],
-			        io_out[3],
-		                io_out[2],
-		                io_out[1]
+     wire [7:0]  port_d_in = {  io_out[15],
+		                        io_out[14],
+		                        io_out[13],
+		                        io_out[10],
+			                    io_out[9],
+			                    io_out[8],
+		                        io_out[7],
+		                        io_out[6]
 			        };
 
-	assign {  io_in[10],
-		  io_in[9],
-		  io_in[8],
-		  io_in[5],
-		  io_in[4],
-		  io_in[3],
-		  io_in[2],
-		  io_in[1]
-		}  =  port_d_out;
+	assign {  io_in[15],
+		      io_in[14],
+		      io_in[13],
+		      io_in[10],
+		      io_in[9],
+		      io_in[8],
+		      io_in[7],
+		      io_in[6]
+		   }  =  (test_start) ? port_d_out : 8'hz;
 
 
 	/*****************************/
 
-	wire [15:0] irq_lines = u_top.u_pinmux.u_glbl_reg.irq_lines;
+	wire [31:0] irq_lines = u_top.u_pinmux.u_glbl_reg.irq_lines;
 
 	initial begin
 		clock = 0;
@@ -240,27 +262,32 @@
        `endif
 
 	initial begin
+        test_start = 0;
 		test_fail = 0;
+        $value$plusargs("risc_core_id=%d", d_risc_id);
+
+        init();
+        test_start = 1;
 
 		#200; // Wait for reset removal
 	        repeat (10) @(posedge clock);
 		$display("Monitor: Standalone User Risc Boot Test Started");
 
 
-	        repeat (2) @(posedge clock);
+	    repeat (2) @(posedge clock);
 		#1;
-                wb_user_core_write(`ADDR_SPACE_WBHOST+`WBHOST_GLBL_CFG,'h1);
+        //wb_user_core_write(`ADDR_SPACE_WBHOST+`WBHOST_GLBL_CFG,'h1);
 
-                // Disable Multi func
-                wb_user_core_write(`ADDR_SPACE_GLBL+`GLBL_CFG_MUTI_FUNC,'h000);
+        // Disable Multi func
+        wb_user_core_write(`ADDR_SPACE_GLBL+`GLBL_CFG_MUTI_FUNC,'h000);
 
 		/************* GPIO As Output ******************/
 		$display("#####################################");
 		$display("Step-1: Testing GPIO As Output ");
 		// Set the Direction as Output
-                wb_user_core_write(`ADDR_SPACE_GPIO+`GPIO_CFG_DSEL,'hFFFFFFFF);
+        wb_user_core_write(`ADDR_SPACE_GPIO+`GPIO_CFG_DSEL,'hFFFFFFFF);
 		// Set the GPIO Output data: 0x55555555
-                wb_user_core_write(`ADDR_SPACE_GPIO+`GPIO_CFG_ODATA,'h55555555);
+        wb_user_core_write(`ADDR_SPACE_GPIO+`GPIO_CFG_ODATA,'h55555555);
 		cmp_gpio_output(8'h55,8'h55,8'h55,8'h55);
 
 		// Set the GPIO Output data: 0xAAAAAAAA
@@ -279,7 +306,7 @@
 		$display("#####################################");
 		$display("Step-2: Testing GPIO As Input ");
 		// Set the Direction as Input
-                wb_user_core_write(`ADDR_SPACE_GPIO+`GPIO_CFG_DSEL,'h00000000);
+        wb_user_core_write(`ADDR_SPACE_GPIO+`GPIO_CFG_DSEL,'h00000000);
 
 		cmp_gpio_input(8'h55,8'h55,8'h55,8'h55);
 		cmp_gpio_input(8'hAA,8'hAA,8'hAA,8'hAA);
@@ -290,12 +317,12 @@
 		$display("#####################################");
 		$display("Step-3: Testing GPIO As Posedge Interrupt ");
 		// Set the Direction as Input
-                wb_user_core_write(`ADDR_SPACE_GPIO+`GPIO_CFG_DSEL,'h00000000);
+        wb_user_core_write(`ADDR_SPACE_GPIO+`GPIO_CFG_DSEL,'h00000000);
 		// Set GPIO for posedge Interrupt
-                wb_user_core_write(`ADDR_SPACE_GPIO+`GPIO_CFG_INTR_MASK,'hFFFFFFFF);
-                wb_user_core_write(`ADDR_SPACE_GPIO+`GPIO_CFG_POS_INTR_SEL,'hFFFFFFFF);
-                wb_user_core_write(`ADDR_SPACE_GPIO+`GPIO_CFG_NEG_INTR_SEL,'h00000000);
-                wb_user_core_write(`ADDR_SPACE_GLBL+`GLBL_CFG_INTR_MSK,'hFFFF);
+        wb_user_core_write(`ADDR_SPACE_GPIO+`GPIO_CFG_INTR_MASK,'hFFFFFFFF);
+        wb_user_core_write(`ADDR_SPACE_GPIO+`GPIO_CFG_POS_INTR_SEL,'hFFFFFFFF);
+        wb_user_core_write(`ADDR_SPACE_GPIO+`GPIO_CFG_NEG_INTR_SEL,'h00000000);
+        wb_user_core_write(`ADDR_SPACE_GLBL+`GLBL_CFG_INTR_MSK,'hFFFFFF00);
 		
 		// Drive GPIO with 0x55
 		cmp_gpio_pos_intr(8'h55,8'h55,8'h55,8'h55);
@@ -356,11 +383,6 @@
 	        $finish;
 	end
 
-	initial begin
-		wb_rst_i  = 1'b1;
-		#100;
-		wb_rst_i  = 1'b0;	    	// Release reset
-	end
 wire USER_VDD1V8 = 1'b1;
 wire VSS = 1'b0;
 
@@ -407,32 +429,6 @@
     end
 `endif    
 
-//------------------------------------------------------
-//  Integrate the Serial flash with qurd support to
-//  user core using the gpio pads
-//  ----------------------------------------------------
-   wire flash_io1;
-   wire flash_clk = io_out[16];
-   wire spiram_csb = io_out[13];
-   tri  #1 flash_io0 = io_out[15];
-   assign io_in[14] = flash_io1;
-
-   tri  #1 flash_io2 = 1'b1;
-   tri  #1 flash_io3 = 1'b1;
-
-
-   is62wvs1288 #(.mem_file_name("flash1.hex"))
-	u_sfram (
-         // Data Inputs/Outputs
-           .io0     (flash_io0),
-           .io1     (flash_io1),
-           // Controls
-           .clk    (flash_clk),
-           .csb    (spiram_csb),
-           .io2    (flash_io2),
-           .io3    (flash_io3)
-    );
-
 
 //----------------------------------------------------
 //  Task
@@ -457,12 +453,12 @@
     // Wait for some cycle to reg to be written through wbbone host
     repeat (20) @(posedge clock); 
 
-    if((exp_port_a & 8'h00) != (port_a_in & 8'h00))
+    if((exp_port_a & 8'h1F) != (port_a_in & 8'h1F))
     begin
-       $display("ERROR: PORT A Exp: %x  Rxd: %x",exp_port_a & 8'h00,port_a_in & 8'h00);
+       $display("ERROR: PORT A Exp: %x  Rxd: %x",exp_port_a & 8'h1F,port_a_in & 8'h1F);
        `TB_GLBL.test_fail = 1;
     end else begin
-       $display("STATYS: PORT A Data: %x Matched  ",port_a_in & 8'h00);
+       $display("STATYS: PORT A Data: %x Matched  ",port_a_in & 8'h1F);
     end
     
     if((exp_port_b & 8'hFF) != (port_b_in & 8'hFF))
@@ -506,7 +502,7 @@
     port_c_out  = port_c;
     port_d_out  = port_d;
 
-    wb_user_core_read_check(`ADDR_SPACE_GPIO+`GPIO_CFG_IDATA,read_data,{port_d,port_c & 8'h7F,port_b,8'h0});
+    wb_user_core_read_check(`ADDR_SPACE_GPIO+`GPIO_CFG_IDATA,read_data,{port_d,port_c & 8'h7F,port_b,port_a & 8'h1F});
 end
 endtask
 
@@ -522,13 +518,12 @@
    // Drive GPIO with zero
     cmp_gpio_input(8'h00,8'h00,8'h00,8'h00);
 
-    // Clear Global Interrupt
-    wb_user_core_write(`ADDR_SPACE_GLBL+`GLBL_CFG_INTR_STAT,'h00008000);
-
    // Clear all the Interrupt
     wb_user_core_write(`ADDR_SPACE_GPIO+`GPIO_CFG_INTR_CLR,'hFFFFFFFF);
-
     wb_user_core_read_check(`ADDR_SPACE_GPIO+`GPIO_CFG_INTR_STAT,read_data,32'h0);
+    // Clear Global Interrupt
+    wb_user_core_write(`ADDR_SPACE_GLBL+`GLBL_CFG_INTR_STAT,'hFFFFFFFF);
+    wb_user_core_read_check(`ADDR_SPACE_GLBL+`GPIO_CFG_INTR_STAT,read_data,32'h0);
 
     // Drive Ports
     cmp_gpio_input(port_d,port_c,port_b,port_a);
@@ -544,12 +539,12 @@
     repeat (20) @(posedge clock); 
 
     // Check the GPIO Interrupt
-    wb_user_core_read_check(`ADDR_SPACE_GPIO+`GPIO_CFG_INTR_STAT,read_data,{port_d,port_c & 8'h7F,port_b,8'h0});
+    wb_user_core_read_check(`ADDR_SPACE_GPIO+`GPIO_CFG_INTR_STAT,read_data,{port_d,port_c & 8'h7F,port_b,port_a & 8'h1F});
     
     // Check The Global Interrupt
-    wb_user_core_read_check(`ADDR_SPACE_GLBL+`GLBL_CFG_INTR_STAT,read_data,32'h8000);
+    wb_user_core_read_check(`ADDR_SPACE_GLBL+`GLBL_CFG_INTR_STAT,read_data,{port_d,port_c & 8'h7F,port_b,8'h0});
     
-    if(irq_lines[15] != 1'b1) begin
+    if(irq_lines[31:8] == 0) begin
 	$display("ERROR: Global GPIO Interrupt not detected");
        `TB_GLBL.test_fail = 1;
     end
@@ -557,8 +552,8 @@
     // Clear The GPIO Interrupt
     wb_user_core_write(`ADDR_SPACE_GPIO+`GPIO_CFG_INTR_CLR,32'hFFFFFFFF);
 
-    // Clear GPIO Interrupt
-    wb_user_core_write(`ADDR_SPACE_GLBL+`GLBL_CFG_INTR_STAT,'h8000);
+    // Clear GLBL Interrupt
+    wb_user_core_write(`ADDR_SPACE_GLBL+`GLBL_CFG_INTR_STAT,'hFFFFFFFF);
 
 
     // Check Interrupt are cleared
@@ -583,12 +578,12 @@
    // Drive GPIO with All One's
     cmp_gpio_input(8'hFF,8'hFF,8'hFF,8'hFF);
 
-    // Clear Global Interrupt
-    wb_user_core_write(`ADDR_SPACE_GLBL+`GLBL_CFG_INTR_STAT,'h00008000);
-
-   // Clear all the Interrupt
     wb_user_core_write(`ADDR_SPACE_GPIO+`GPIO_CFG_INTR_CLR,'hFFFFFFFF);
     wb_user_core_read_check(`ADDR_SPACE_GPIO+`GPIO_CFG_INTR_STAT,read_data,32'h0);
+    // Clear Global Interrupt
+    wb_user_core_write(`ADDR_SPACE_GLBL+`GLBL_CFG_INTR_STAT,'hFFFFFFFF);
+    wb_user_core_read_check(`ADDR_SPACE_GLBL+`GLBL_CFG_INTR_STAT,read_data,32'h0);
+
 
     // Drive Ports
     cmp_gpio_input(port_d,port_c,port_b,port_a);
@@ -603,12 +598,12 @@
     repeat (20) @(posedge clock); 
 
     // Neg edge interrupt is will compliment  of input value
-    wb_user_core_read_check(`ADDR_SPACE_GPIO+`GPIO_CFG_INTR_STAT,read_data,{port_d ^ 8'hFF,(port_c ^ 8'hFF) & 8'h7F,port_b ^ 8'hFF,8'h0});
+    wb_user_core_read_check(`ADDR_SPACE_GPIO+`GPIO_CFG_INTR_STAT,read_data,{port_d ^ 8'hFF,(port_c ^ 8'hFF) & 8'h7F,port_b ^ 8'hFF,(port_a ^ 8'hFF )& 8'h1F});
     
     // Check The Global Interrupt
-    wb_user_core_read_check(`ADDR_SPACE_GLBL+`GLBL_CFG_INTR_STAT,read_data,32'h8000);
+    wb_user_core_read_check(`ADDR_SPACE_GLBL+`GLBL_CFG_INTR_STAT,read_data,{port_d ^ 8'hFF,(port_c ^ 8'hFF) & 8'h7F,port_b ^ 8'hFF,8'h0});
 
-    if(irq_lines[15] != 1'b1) begin
+    if(irq_lines[31:8] == 0) begin
 	$display("ERROR: Global GPIO Interrupt not detected");
        `TB_GLBL.test_fail = 1;
     end
@@ -617,7 +612,7 @@
     wb_user_core_write(`ADDR_SPACE_GPIO+`GPIO_CFG_INTR_CLR,32'hFFFFFFFF);
 
     // Clear GPIO Interrupt
-    wb_user_core_write(`ADDR_SPACE_GLBL+`GLBL_CFG_INTR_STAT,'h8000);
+    wb_user_core_write(`ADDR_SPACE_GLBL+`GLBL_CFG_INTR_STAT,'hFFFFFFFF);
 
     // Check Interrupt are cleared
     wb_user_core_read_check(`ADDR_SPACE_GLBL+`GLBL_CFG_INTR_STAT,read_data,32'h0);
@@ -761,5 +756,6 @@
 `endif
 **/
 
+`include "user_tasks.sv"
 endmodule
 `default_nettype wire
diff --git a/verilog/dv/user_i2cm/user_i2cm_tb.v b/verilog/dv/user_i2cm/user_i2cm_tb.v
index 87b94a3..a343366 100644
--- a/verilog/dv/user_i2cm/user_i2cm_tb.v
+++ b/verilog/dv/user_i2cm/user_i2cm_tb.v
@@ -124,15 +124,11 @@
 	   end
        `endif
 
-	initial begin
-		wb_rst_i <= 1'b1;
-		#100;
-		wb_rst_i <= 1'b0;	    	// Release reset
-	end
 initial
 begin
    test_fail = 0;
-
+           init();
+    
    #200; // Wait for reset removal
    repeat (10) @(posedge clock);
    $display("############################################");
@@ -337,6 +333,8 @@
     .user_irq       () 
 
 );
+// SSPI Slave I/F
+assign io_in[0]  = 1'b1; // RESET
 
 `ifndef GL // Drive Power for Hold Fix Buf
     // All standard cell need power hook-up for functionality work
@@ -350,10 +348,10 @@
 // --------------------------
 tri scl,sda;
 
-assign sda  =  (io_oeb[22] == 1'b0) ? io_out[22] : 1'bz;
-assign scl   = (io_oeb[23] == 1'b0) ? io_out[23]: 1'bz;
-assign io_in[22]  =  sda;
-assign io_in[23]  =  scl;
+assign sda  =  (io_oeb[26] == 1'b0) ? io_out[26] : 1'bz;
+assign scl   = (io_oeb[27] == 1'b0) ? io_out[27]: 1'bz;
+assign io_in[26]  =  sda;
+assign io_in[27]  =  scl;
 
 pullup p1(scl); // pullup scl line
 pullup p2(sda); // pullup sda line
@@ -386,7 +384,7 @@
   wbd_ext_we_i  ='h0;  // write
   wbd_ext_dat_i ='h0;  // data output
   wbd_ext_sel_i ='h0;  // byte enable
-  $display("DEBUG WB USER ACCESS WRITE Address : %x, Data : %x",address,data);
+  $display("STATUS: WB USER ACCESS WRITE Address : 0x%x, Data : 0x%x",address,data);
   repeat (2) @(posedge clock);
 end
 endtask
@@ -415,7 +413,7 @@
   wbd_ext_we_i  ='h0;  // write
   wbd_ext_dat_i ='h0;  // data output
   wbd_ext_sel_i ='h0;  // byte enable
-  //$display("DEBUG WB USER ACCESS READ Address : %x, Data : %x",address,data);
+  //$display("STATUS: WB USER ACCESS READ  Address : 0x%x, Data : 0x%x",address,data);
   repeat (2) @(posedge clock);
 end
 endtask
@@ -493,5 +491,6 @@
 
 `endif
 **/
+`include "user_tasks.sv"
 endmodule
 `default_nettype wire
diff --git a/verilog/dv/user_mcore_test1/user_mcore_test1_tb.v b/verilog/dv/user_mcore_test1/user_mcore_test1_tb.v
index a4bda85..1d75851 100644
--- a/verilog/dv/user_mcore_test1/user_mcore_test1_tb.v
+++ b/verilog/dv/user_mcore_test1/user_mcore_test1_tb.v
@@ -230,6 +230,9 @@
     .user_irq       () 
 
 );
+// SSPI Slave I/F
+assign io_in[0]  = 1'b1; // RESET
+assign io_in[16] = 1'b0 ; // SPIS SCK 
 
 `ifndef GL // Drive Power for Hold Fix Buf
     // All standard cell need power hook-up for functionality work
diff --git a/verilog/dv/user_mcore_test2/user_mcore_test2_tb.v b/verilog/dv/user_mcore_test2/user_mcore_test2_tb.v
index 7ee2ba2..18f5cf0 100644
--- a/verilog/dv/user_mcore_test2/user_mcore_test2_tb.v
+++ b/verilog/dv/user_mcore_test2/user_mcore_test2_tb.v
@@ -314,6 +314,9 @@
     .user_irq       () 
 
 );
+// SSPI Slave I/F
+assign io_in[0]  = 1'b1; // RESET
+assign io_in[16] = 1'b0 ; // SPIS SCK 
 
 `ifndef GL // Drive Power for Hold Fix Buf
     // All standard cell need power hook-up for functionality work
diff --git a/verilog/dv/user_pwm/user_pwm_tb.v b/verilog/dv/user_pwm/user_pwm_tb.v
index c6f24b7..32b5b69 100644
--- a/verilog/dv/user_pwm/user_pwm_tb.v
+++ b/verilog/dv/user_pwm/user_pwm_tb.v
@@ -135,40 +135,41 @@
 
 	initial begin
 		$dumpon;
+        init();
 
 		#200; // Wait for reset removal
 	        repeat (10) @(posedge clock);
 		$display("Monitor: Standalone User Risc Boot Test Started");
 
 		// Remove Wb Reset
-		wb_user_core_write(`ADDR_SPACE_WBHOST+`WBHOST_GLBL_CFG,'h1);
+		//wb_user_core_write(`ADDR_SPACE_WBHOST+`WBHOST_GLBL_CFG,'h1);
 
-                // Enable PWM Multi Functional Ports
-                wb_user_core_write(`ADDR_SPACE_GLBL+`GLBL_CFG_MUTI_FUNC,'h03F);
+        // Enable PWM Multi Functional Ports
+        wb_user_core_write(`ADDR_SPACE_GLBL+`GLBL_CFG_MUTI_FUNC,'h03F);
 
-	        repeat (2) @(posedge clock);
+	    repeat (2) @(posedge clock);
 		#1;
 
-                // Remove the reset
+        // Remove the reset
 		// Remove WB and SPI/UART Reset, Keep CORE under Reset
-                wb_user_core_write(`ADDR_SPACE_GLBL+`GLBL_CFG_CFG0,'h01F);
+        //wb_user_core_write(`ADDR_SPACE_GLBL+`GLBL_CFG_CFG0,'h01F);
 
 		// config 1us based on system clock - 1000/25ns = 40 
-                wb_user_core_write(`ADDR_SPACE_TIMER+`TIMER_CFG_GLBL,39);
+        wb_user_core_write(`ADDR_SPACE_TIMER+`TIMER_CFG_GLBL,39);
 
 		test_fail = 0;
-	        repeat (200) @(posedge clock);
-                wb_user_core_write(`ADDR_SPACE_WBHOST+`WBHOST_BANK_SEL,'h1000); // Change the Bank Sel 1000
+	    repeat (200) @(posedge clock);
+        wb_user_core_write(`ADDR_SPACE_WBHOST+`WBHOST_BANK_SEL,'h1000); // Change the Bank Sel 1000
 
-	        $display("Step-1, PWM-0: 1ms/2 = 500Hz; PWM-1: 1ms/3; PWM-2: 1ms/4, PWM-3: 1ms/5, PWM-4: 1ms/6, PWM-5: 1ms/7");
-	        test_step = 1;
-                wb_user_core_write(`ADDR_SPACE_PWM+`PWM_CFG_PWM_0,'h0000_0000);
-                wb_user_core_write(`ADDR_SPACE_PWM+`PWM_CFG_PWM_1,'h0000_0001);
-                wb_user_core_write(`ADDR_SPACE_PWM+`PWM_CFG_PWM_2,'h0001_0001);
-                wb_user_core_write(`ADDR_SPACE_PWM+`PWM_CFG_PWM_3,'h0001_0002);
-                wb_user_core_write(`ADDR_SPACE_PWM+`PWM_CFG_PWM_4,'h0002_0002);
-                wb_user_core_write(`ADDR_SPACE_PWM+`PWM_CFG_PWM_5,'h0002_0003);
-	        pwm_monitor(OneMsPeriod*2,OneMsPeriod*3,OneMsPeriod*4,OneMsPeriod*5,OneMsPeriod*6,OneMsPeriod*7);
+	    $display("Step-1, PWM-0: 1ms/2 = 500Hz; PWM-1: 1ms/3; PWM-2: 1ms/4, PWM-3: 1ms/5, PWM-4: 1ms/6, PWM-5: 1ms/7");
+	    test_step = 1;
+        wb_user_core_write(`ADDR_SPACE_PWM+`PWM_CFG_PWM_0,'h0000_0000);
+        wb_user_core_write(`ADDR_SPACE_PWM+`PWM_CFG_PWM_1,'h0000_0001);
+        wb_user_core_write(`ADDR_SPACE_PWM+`PWM_CFG_PWM_2,'h0001_0001);
+        wb_user_core_write(`ADDR_SPACE_PWM+`PWM_CFG_PWM_3,'h0001_0002);
+        wb_user_core_write(`ADDR_SPACE_PWM+`PWM_CFG_PWM_4,'h0002_0002);
+        wb_user_core_write(`ADDR_SPACE_PWM+`PWM_CFG_PWM_5,'h0002_0003);
+	    pwm_monitor(OneMsPeriod*2,OneMsPeriod*3,OneMsPeriod*4,OneMsPeriod*5,OneMsPeriod*6,OneMsPeriod*7);
 
 		repeat (100) @(posedge clock);
 			// $display("+1000 cycles");
@@ -190,20 +191,15 @@
 	        $finish;
 	end
 
-	initial begin
-		wb_rst_i <= 1'b1;
-		#100;
-		wb_rst_i <= 1'b0;	    	// Release reset
-	end
 wire USER_VDD1V8 = 1'b1;
 wire VSS = 1'b0;
 
-wire pwm0 = io_out[4];
-wire pwm1 = io_out[8];
-wire pwm2 = io_out[9];
-wire pwm3 = io_out[12];
-wire pwm4 = io_out[13];
-wire pwm5 = io_out[14];
+wire pwm0 = io_out[9];
+wire pwm1 = io_out[13];
+wire pwm2 = io_out[14];
+wire pwm3 = io_out[17];
+wire pwm4 = io_out[18];
+wire pwm5 = io_out[19];
 
 
 task pwm_monitor;
@@ -300,6 +296,8 @@
     .user_irq       () 
 
 );
+// SSPI Slave I/F
+assign io_in[0]  = 1'b1; // RESET
 
 `ifndef GL // Drive Power for Hold Fix Buf
     // All standard cell need power hook-up for functionality work
@@ -450,5 +448,6 @@
 `endif
 **/
 
+`include "user_tasks.sv"
 endmodule
 `default_nettype wire
diff --git a/verilog/dv/user_qspi/user_qspi_tb.v b/verilog/dv/user_qspi/user_qspi_tb.v
index 8f984e1..e4785b1 100644
--- a/verilog/dv/user_qspi/user_qspi_tb.v
+++ b/verilog/dv/user_qspi/user_qspi_tb.v
@@ -192,9 +192,10 @@
 
 	initial begin
 		$dumpon;
+        init();
 
 		#200; // Wait for reset removal
-	        repeat (10) @(posedge clock);
+	    repeat (10) @(posedge clock);
 		$display("Monitor: Standalone User Risc Boot Test Started");
 
 		// Remove Wb Reset
@@ -202,15 +203,23 @@
 
 	        repeat (2) @(posedge clock);
 		#1;
-		// Remove only WB and SPI Reset
-                wb_user_core_write(`ADDR_SPACE_GLBL+`GLBL_CFG_CFG0,'h2);
+		// Enable SPI Reset
+        wb_user_core_read(`ADDR_SPACE_GLBL+`GLBL_CFG_CFG0,read_data);
+        read_data = read_data | 8'h02;
+        wb_user_core_write(`ADDR_SPACE_GLBL+`GLBL_CFG_CFG0,read_data);
 
-                wb_user_core_write(`ADDR_SPACE_WBHOST+`WBHOST_BANK_SEL,'h0000); // Change the Bank Sel 0000
+        wb_user_core_write(`ADDR_SPACE_WBHOST+`WBHOST_BANK_SEL,'h0000); // Change the Bank Sel 0000
 
 
 		test_fail = 0;
-	        repeat (200) @(posedge clock);
-                wb_user_core_write(`ADDR_SPACE_WBHOST+`WBHOST_BANK_SEL,'h1000); // Change the Bank Sel 1000
+	    repeat (200) @(posedge clock);
+        wb_user_core_write(`ADDR_SPACE_WBHOST+`WBHOST_BANK_SEL,'h1000); // Change the Bank Sel 1000
+
+        if(u_top.strap_qspi_sram) begin // if the SRAM STRAP in QUAD Mode, then send reset command to switch to SINGLE PHASE
+		   wb_user_core_write(`ADDR_SPACE_QSPI+`QSPIM_IMEM_CTRL1,{16'h0,1'b0,1'b0,4'b0000,P_MODE_SWITCH_IDLE,P_QUAD,P_QUAD,4'b0100});
+		   wb_user_core_write(`ADDR_SPACE_QSPI+`QSPIM_IMEM_CTRL2,{8'h0,2'b00,2'b00,P_FSM_C,8'h00,8'hFF});
+		   wb_user_core_write(`ADDR_SPACE_QSPI+`QSPIM_IMEM_WDATA,32'h0);
+        end
 		// CS#2 SSPI Indirect RAM READ ACCESS-
 		wb_user_core_write(`ADDR_SPACE_QSPI+`QSPIM_IMEM_CTRL1,{16'h0,1'b0,1'b0,4'b0000,P_MODE_SWITCH_IDLE,P_SINGLE,P_SINGLE,4'b0100});
 		wb_user_core_write(`ADDR_SPACE_QSPI+`QSPIM_IMEM_CTRL2,{8'h4,2'b00,2'b10,P_FSM_CADR,8'h00,8'h03});
@@ -1152,11 +1161,6 @@
 	        $finish;
 	end
 
-	initial begin
-		wb_rst_i <= 1'b1;
-		#100;
-		wb_rst_i <= 1'b0;	    	// Release reset
-	end
 wire USER_VDD1V8 = 1'b1;
 wire VSS = 1'b0;
 
@@ -1195,6 +1199,9 @@
 
 );
 
+// SSPI Slave I/F
+assign io_in[0]  = 1'b1; // RESET
+
 `ifndef GL // Drive Power for Hold Fix Buf
     // All standard cell need power hook-up for functionality work
     initial begin
@@ -1207,22 +1214,22 @@
 //  user core using the gpio pads
 //  ----------------------------------------------------
 
-   wire flash_clk = io_out[24];
-   wire flash_csb = io_out[25];
+   wire flash_clk = io_out[28];
+   wire flash_csb = io_out[29];
    // Creating Pad Delay
-   wire #1 io_oeb_29 = io_oeb[29];
-   wire #1 io_oeb_30 = io_oeb[30];
-   wire #1 io_oeb_31 = io_oeb[31];
-   wire #1 io_oeb_32 = io_oeb[32];
-   tri  #1 flash_io0 = (io_oeb_29== 1'b0) ? io_out[29] : 1'bz;
-   tri  #1 flash_io1 = (io_oeb_30== 1'b0) ? io_out[30] : 1'bz;
-   tri  #1 flash_io2 = (io_oeb_31== 1'b0) ? io_out[31] : 1'bz;
-   tri  #1 flash_io3 = (io_oeb_32== 1'b0) ? io_out[32] : 1'bz;
+   wire #1 io_oeb_29 = io_oeb[33];
+   wire #1 io_oeb_30 = io_oeb[34];
+   wire #1 io_oeb_31 = io_oeb[35];
+   wire #1 io_oeb_32 = io_oeb[36];
+   tri  #1 flash_io0 = (io_oeb_29== 1'b0) ? io_out[33] : 1'bz;
+   tri  #1 flash_io1 = (io_oeb_30== 1'b0) ? io_out[34] : 1'bz;
+   tri  #1 flash_io2 = (io_oeb_31== 1'b0) ? io_out[35] : 1'bz;
+   tri  #1 flash_io3 = (io_oeb_32== 1'b0) ? io_out[36] : 1'bz;
 
-   assign io_in[29] = flash_io0;
-   assign io_in[30] = flash_io1;
-   assign io_in[31] = flash_io2;
-   assign io_in[32] = flash_io3;
+   assign io_in[33] = flash_io0;
+   assign io_in[34] = flash_io1;
+   assign io_in[35] = flash_io2;
+   assign io_in[36] = flash_io3;
 
 
    // Quad flash
@@ -1242,7 +1249,7 @@
 
        );
 
-   wire spiram_csb = io_out[27];
+   wire spiram_csb = io_out[31];
 
    is62wvs1288 #(.mem_file_name("flash1.hex"))
 	u_sfram (
@@ -1387,6 +1394,7 @@
 
 `endif
 **/
+`include "user_tasks.sv"
 endmodule
 `include "s25fl256s.sv"
 `default_nettype wire
diff --git a/verilog/dv/user_risc_boot/Makefile b/verilog/dv/user_risc_boot/Makefile
index 0417a18..d83adcc 100644
--- a/verilog/dv/user_risc_boot/Makefile
+++ b/verilog/dv/user_risc_boot/Makefile
@@ -51,32 +51,32 @@
 vvp:  ${PATTERN:=.vvp}
 
 %.vvp: %_tb.v
-	${GCC_PREFIX}-gcc -O2 -funroll-loops -fpeel-loops -fgcse-sm -fgcse-las  -D__RVC_EXT -static -std=gnu99 -fno-common -fno-builtin-printf -DTCM=0 -Wa,-march=rv32imc -march=rv32imc -mabi=ilp32 -DFLAGS_STR=\""-O2 -funroll-loops -fpeel-loops -fgcse-sm -fgcse-las "\"  -c -I./ -I$(YIFIVE_FIRMWARE_PATH)  user_risc_boot.c -o user_risc_boot.o
+	${GCC_PREFIX}-gcc -O2 -funroll-loops -fpeel-loops -fgcse-sm -fgcse-las  -D__RVC_EXT -static -std=gnu99 -fno-common -fno-builtin-printf -DTCM=0 -Wa,-march=rv32imc -march=rv32imc -mabi=ilp32 -DFLAGS_STR=\""-O2 -funroll-loops -fpeel-loops -fgcse-sm -fgcse-las "\"  -c -I./ -I$(YIFIVE_FIRMWARE_PATH) ${PATTERN}.c -o ${PATTERN}.o
 	${GCC_PREFIX}-gcc -O2 -funroll-loops -fpeel-loops -fgcse-sm -fgcse-las  -D__RVC_EXT -static -std=gnu99 -fno-common -fno-builtin-printf -DTCM=0 -Wa,-march=rv32imc -march=rv32imc -mabi=ilp32 -DFLAGS_STR=\""-O2 -funroll-loops -fpeel-loops -fgcse-sm -fgcse-las "\"  -D__ASSEMBLY__=1 -c -I./ -I$(YIFIVE_FIRMWARE_PATH)  $(YIFIVE_FIRMWARE_PATH)/crt.S -o crt.o
-	${GCC_PREFIX}-gcc -o user_risc_boot.elf -T $(YIFIVE_FIRMWARE_PATH)/link.ld user_risc_boot.o crt.o -nostartfiles -nostdlib -lc -lgcc -march=rv32imc -mabi=ilp32 -N
-	${GCC_PREFIX}-objcopy -O verilog user_risc_boot.elf user_risc_boot.hex
-	${GCC_PREFIX}-objdump -D user_risc_boot.elf > user_risc_boot.dump
-	rm crt.o user_risc_boot.o
+	${GCC_PREFIX}-gcc -o ${PATTERN}.elf -T $(YIFIVE_FIRMWARE_PATH)/link.ld ${PATTERN}.o crt.o -nostartfiles -nostdlib -lc -lgcc -march=rv32imc -mabi=ilp32 -N
+	${GCC_PREFIX}-objcopy -O verilog ${PATTERN}.elf ${PATTERN}.hex
+	${GCC_PREFIX}-objdump -D ${PATTERN}.elf > ${PATTERN}.dump
+	rm crt.o ${PATTERN}.o
 ifeq ($(SIM),RTL)
    ifeq ($(DUMP),OFF)
-	iverilog -g2012 -DFUNCTIONAL -DSIM -I $(PDK_PATH) \
+	iverilog -g2012 -DFUNCTIONAL -DSIM -DRISC_BOOT -I $(PDK_PATH) \
 	-f$(USER_PROJECT_VERILOG)/includes/includes.rtl.$(CONFIG) \
 	-f$(USER_PROJECT_VERILOG)/includes/includes.rtl.lib  \
 	$< -o $@ 
     else  
-	iverilog -g2012 -DWFDUMP -DFUNCTIONAL -DSIM -I $(PDK_PATH) \
+	iverilog -g2012 -DWFDUMP -DFUNCTIONAL -DRISC_BOOT -DSIM -I $(PDK_PATH) \
 	-f$(USER_PROJECT_VERILOG)/includes/includes.rtl.$(CONFIG) \
 	-f$(USER_PROJECT_VERILOG)/includes/includes.rtl.lib  \
 	$< -o $@ 
    endif
 else  
    ifeq ($(DUMP),OFF)
-	iverilog -g2012 -DFUNCTIONAL -DUSE_POWER_PINS -DGL -I $(PDK_PATH) \
+	iverilog -g2012 -DFUNCTIONAL -DUSE_POWER_PINS -DRISC_BOOT -DGL -I $(PDK_PATH) \
 	-f$(USER_PROJECT_VERILOG)/includes/includes.gl.$(CONFIG) \
 	-f$(USER_PROJECT_VERILOG)/includes/includes.gl.lib \
 	$< -o $@ 
     else  
-	iverilog -g2012 -DWFDUMP -DFUNCTIONAL -DUSE_POWER_PINS -DGL -I $(PDK_PATH) \
+	iverilog -g2012 -DWFDUMP -DFUNCTIONAL -DUSE_POWER_PINS -DRISC_BOOT -DGL -I $(PDK_PATH) \
 	-f$(USER_PROJECT_VERILOG)/includes/includes.gl.$(CONFIG) \
 	-f$(USER_PROJECT_VERILOG)/includes/includes.gl.lib \
 	$< -o $@ 
diff --git a/verilog/dv/user_risc_boot/user_risc_boot.c b/verilog/dv/user_risc_boot/user_risc_boot.c
index c14c9a7..923dba7 100644
--- a/verilog/dv/user_risc_boot/user_risc_boot.c
+++ b/verilog/dv/user_risc_boot/user_risc_boot.c
@@ -16,37 +16,29 @@
 // SPDX-FileContributor: Dinesh Annayya <dinesha@opencores.org>
 // //////////////////////////////////////////////////////////////////////////
 #define SC_SIM_OUTPORT (0xf0000000)
-#define uint32_t  long
+#include "../c_func/inc/int_reg_map.h"
+#include "common_misc.h"
+#include "common_bthread.h"
 
-#define reg_mprj_globl_reg0  (*(volatile uint32_t*)0x10020000) // Chip ID
-#define reg_mprj_globl_reg1  (*(volatile uint32_t*)0x10020004) // Global Config-0
-#define reg_mprj_globl_reg2  (*(volatile uint32_t*)0x10020008) // Global Config-1
-#define reg_mprj_globl_reg3  (*(volatile uint32_t*)0x1002000C) // Global Interrupt Mask
-#define reg_mprj_globl_reg4  (*(volatile uint32_t*)0x10020010) // Global Interrupt
-#define reg_mprj_globl_reg5  (*(volatile uint32_t*)0x10020014) // Multi functional sel
-#define reg_mprj_globl_soft0  (*(volatile uint32_t*)0x10020018) // Sof Register-0
-#define reg_mprj_globl_soft1  (*(volatile uint32_t*)0x1002001C) // Sof Register-1
-#define reg_mprj_globl_soft2  (*(volatile uint32_t*)0x10020020) // Sof Register-2
-#define reg_mprj_globl_soft3  (*(volatile uint32_t*)0x10020024) // Sof Register-3
-#define reg_mprj_globl_soft4 (*(volatile uint32_t*)0x10020028) // Sof Register-4
-#define reg_mprj_globl_soft5 (*(volatile uint32_t*)0x1002002C) // Sof Register-5
 
 int main()
 {
 
-    //volatile long *out_ptr = (volatile long*)SC_SIM_OUTPORT;
-    //*out_ptr = 0xAABBCCDD;
-    //*out_ptr = 0xBBCCDDEE;
-    //*out_ptr = 0xCCDDEEFF;
-    //*out_ptr = 0xDDEEFF00;
+   // GLBL_CFG_MAIL_BOX used as mail box, each core update boot up handshake at 8 bit
+   // bit[7:0]   - core-0
+   // bit[15:8]  - core-1
+   // bit[23:16] - core-2
+   // bit[31:24] - core-3
+
+   reg_glbl_mail_box = 0x1 << (bthread_get_core_id() * 8); // Start of Main 
 
     // Write software Write & Read Register
-    reg_mprj_globl_soft0  = 0x11223344; 
-    reg_mprj_globl_soft1  = 0x22334455; 
-    reg_mprj_globl_soft2  = 0x33445566; 
-    reg_mprj_globl_soft3  = 0x44556677; 
-    reg_mprj_globl_soft4 = 0x55667788; 
-    reg_mprj_globl_soft5 = 0x66778899; 
+    reg_glbl_soft_reg_0  = 0x11223344; 
+    reg_glbl_soft_reg_1  = 0x22334455; 
+    reg_glbl_soft_reg_2  = 0x33445566; 
+    reg_glbl_soft_reg_3  = 0x44556677; 
+    reg_glbl_soft_reg_4 = 0x55667788; 
+    reg_glbl_soft_reg_5 = 0x66778899; 
     //reg_mprj_globl_reg12 = 0x778899AA; 
     //reg_mprj_globl_reg13 = 0x8899AABB; 
     //reg_mprj_globl_reg14 = 0x99AABBCC; 
diff --git a/verilog/dv/user_risc_boot/user_risc_boot_tb.v b/verilog/dv/user_risc_boot/user_risc_boot_tb.v
index 79c705b..cf5b14d 100644
--- a/verilog/dv/user_risc_boot/user_risc_boot_tb.v
+++ b/verilog/dv/user_risc_boot/user_risc_boot_tb.v
@@ -75,7 +75,10 @@
 `timescale 1 ns / 1 ns
 
 `include "sram_macros/sky130_sram_2kbyte_1rw1r_32x512_8.v"
-module user_risc_boot_tb;
+
+`define TB_HEX "user_risc_boot.hex"
+`define TB_TOP  user_risc_boot_tb
+module `TB_TOP;
 	reg clock;
 	reg wb_rst_i;
 	reg power1, power2;
@@ -125,11 +128,12 @@
 	`ifdef WFDUMP
 	   initial begin
 	   	$dumpfile("simx.vcd");
-	   	$dumpvars(3, user_risc_boot_tb);
+	   	$dumpvars(3, `TB_TOP);
 	   end
        `endif
 
 	initial begin
+        init();
 
 		$value$plusargs("risc_core_id=%d", d_risc_id);
 
@@ -138,26 +142,20 @@
 		$display("Monitor: Standalone User Risc Boot Test Started");
 
 		// Remove Wb Reset
-		wb_user_core_write(`ADDR_SPACE_WBHOST+`WBHOST_GLBL_CFG,'h1);
+		//wb_user_core_write(`ADDR_SPACE_WBHOST+`WBHOST_GLBL_CFG,'h1);
 
 	        repeat (2) @(posedge clock);
 		#1;
 		// Remove all the reset
 		if(d_risc_id == 0) begin
 		     $display("STATUS: Working with Risc core 0");
-                     wb_user_core_write(`ADDR_SPACE_GLBL+`GLBL_CFG_CFG0,'h11F);
+             //wb_user_core_write(`ADDR_SPACE_GLBL+`GLBL_CFG_CFG0,'h11F);
 		end else begin
 		     $display("STATUS: Working with Risc core 1");
                      wb_user_core_write(`ADDR_SPACE_GLBL+`GLBL_CFG_CFG0,'h21F);
 		end
 
-
-		// Repeat cycles of 1000 clock edges as needed to complete testbench
-		repeat (30) begin
-			repeat (1000) @(posedge clock);
-			// $display("+1000 cycles");
-		end
-
+        wait_riscv_boot();
 
 		$display("Monitor: Reading Back the expected value");
 		// User RISC core expect to write these value in global
@@ -197,11 +195,6 @@
 	    $finish;
 	end
 
-	initial begin
-		wb_rst_i <= 1'b1;
-		#100;
-		wb_rst_i <= 1'b0;	    	// Release reset
-	end
 wire USER_VDD1V8 = 1'b1;
 wire VSS = 1'b0;
 
@@ -241,8 +234,8 @@
 );
 
 // SSPI Slave I/F
-assign io_in[0]  = 1'b1; // RESET
-assign io_in[16] = 1'b0 ; // SPIS SCK 
+assign io_in[5]  = 1'b1; // RESET
+assign io_in[21] = 1'b0; // CLOCK
 
 
 `ifndef GL // Drive Power for Hold Fix Buf
@@ -257,28 +250,30 @@
 //  user core using the gpio pads
 //  ----------------------------------------------------
 
-   wire flash_clk = io_out[24];
-   wire flash_csb = io_out[25];
+   wire flash_clk = io_out[28];
+   wire flash_csb = io_out[29];
    // Creating Pad Delay
-   wire #1 io_oeb_29 = io_oeb[29];
-   wire #1 io_oeb_30 = io_oeb[30];
-   wire #1 io_oeb_31 = io_oeb[31];
-   wire #1 io_oeb_32 = io_oeb[32];
-   tri  #1 flash_io0 = (io_oeb_29== 1'b0) ? io_out[29] : 1'bz;
-   tri  #1 flash_io1 = (io_oeb_30== 1'b0) ? io_out[30] : 1'bz;
-   tri  #1 flash_io2 = (io_oeb_31== 1'b0) ? io_out[31] : 1'bz;
-   tri  #1 flash_io3 = (io_oeb_32== 1'b0) ? io_out[32] : 1'bz;
+   wire #1 io_oeb_29 = io_oeb[33];
+   wire #1 io_oeb_30 = io_oeb[34];
+   wire #1 io_oeb_31 = io_oeb[35];
+   wire #1 io_oeb_32 = io_oeb[36];
+   tri  #1 flash_io0 = (io_oeb_29== 1'b0) ? io_out[33] : 1'bz;
+   tri  #1 flash_io1 = (io_oeb_30== 1'b0) ? io_out[34] : 1'bz;
+   tri  #1 flash_io2 = (io_oeb_31== 1'b0) ? io_out[35] : 1'bz;
+   tri  #1 flash_io3 = (io_oeb_32== 1'b0) ? io_out[36] : 1'bz;
 
-   assign io_in[29] = flash_io0;
-   assign io_in[30] = flash_io1;
-   assign io_in[31] = flash_io2;
-   assign io_in[32] = flash_io3;
+   assign io_in[33] = flash_io0;
+   assign io_in[34] = flash_io1;
+   assign io_in[35] = flash_io2;
+   assign io_in[36] = flash_io3;
+
 
    // Quard flash
-     s25fl256s #(.mem_file_name("user_risc_boot.hex"),
-	         .otp_file_name("none"),
+     s25fl256s #(.mem_file_name(`TB_HEX),
+	         .otp_file_name("none"), 
                  .TimingModel("S25FL512SAGMFI010_F_30pF")) 
-		 u_spi_flash_256mb (
+		 u_spi_flash_256mb
+       (
            // Data Inputs/Outputs
        .SI      (flash_io0),
        .SO      (flash_io1),
@@ -423,6 +418,7 @@
 
 `endif
 **/
+`include "user_tasks.sv"
 endmodule
 `include "s25fl256s.sv"
 `default_nettype wire
diff --git a/verilog/dv/user_risc_boot/user_uart.c b/verilog/dv/user_risc_boot/user_uart.c
deleted file mode 100644
index 04512bc..0000000
--- a/verilog/dv/user_risc_boot/user_uart.c
+++ /dev/null
@@ -1,60 +0,0 @@
-//////////////////////////////////////////////////////////////////////////////
-// SPDX-FileCopyrightText: 2021, Dinesh Annayya
-// 
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//      http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-// SPDX-License-Identifier: Apache-2.0
-// SPDX-FileContributor: Dinesh Annayya <dinesha@opencores.org>
-// //////////////////////////////////////////////////////////////////////////
-
-#define SC_SIM_OUTPORT (0xf0000000)
-#define uint32_t  long
-
-#define reg_mprj_globl_reg0  (*(volatile uint32_t*)0x30000000)
-#define reg_mprj_globl_reg1  (*(volatile uint32_t*)0x30000004)
-#define reg_mprj_globl_reg2  (*(volatile uint32_t*)0x30000008)
-#define reg_mprj_globl_reg3  (*(volatile uint32_t*)0x3000000C)
-#define reg_mprj_globl_reg4  (*(volatile uint32_t*)0x30000010)
-#define reg_mprj_globl_reg5  (*(volatile uint32_t*)0x30000014)
-#define reg_mprj_globl_reg6  (*(volatile uint32_t*)0x30000018)
-#define reg_mprj_globl_reg7  (*(volatile uint32_t*)0x3000001C)
-#define reg_mprj_globl_reg8  (*(volatile uint32_t*)0x30000020)
-#define reg_mprj_globl_reg9  (*(volatile uint32_t*)0x30000024)
-#define reg_mprj_globl_reg10 (*(volatile uint32_t*)0x30000028)
-#define reg_mprj_globl_reg11 (*(volatile uint32_t*)0x3000002C)
-#define reg_mprj_globl_reg12 (*(volatile uint32_t*)0x30000030)
-#define reg_mprj_globl_reg13 (*(volatile uint32_t*)0x30000034)
-#define reg_mprj_globl_reg14 (*(volatile uint32_t*)0x30000038)
-#define reg_mprj_globl_reg15 (*(volatile uint32_t*)0x3000003C)
-
-#define reg_mprj_uart_reg0 (*(volatile uint32_t*)0x30010000)
-#define reg_mprj_uart_reg1 (*(volatile uint32_t*)0x30010004)
-#define reg_mprj_uart_reg2 (*(volatile uint32_t*)0x30010008)
-#define reg_mprj_uart_reg3 (*(volatile uint32_t*)0x3001000C)
-#define reg_mprj_uart_reg4 (*(volatile uint32_t*)0x30010010)
-#define reg_mprj_uart_reg5 (*(volatile uint32_t*)0x30010014)
-#define reg_mprj_uart_reg6 (*(volatile uint32_t*)0x30010018)
-#define reg_mprj_uart_reg7 (*(volatile uint32_t*)0x3001001C)
-#define reg_mprj_uart_reg8 (*(volatile uint32_t*)0x30010020)
-
-int main()
-{
-
-    while(1) {
-       // Check UART RX fifo has data, if available loop back the data
-       if(reg_mprj_uart_reg8 != 0) { 
-	   reg_mprj_uart_reg5 = reg_mprj_uart_reg6;
-       }
-    }
-
-    return 0;
-}
diff --git a/verilog/dv/user_sema/user_sema_tb.v b/verilog/dv/user_sema/user_sema_tb.v
index 9b61ce6..a4e08a2 100644
--- a/verilog/dv/user_sema/user_sema_tb.v
+++ b/verilog/dv/user_sema/user_sema_tb.v
@@ -269,6 +269,9 @@
     .user_irq       () 
 
 );
+// SSPI Slave I/F
+assign io_in[0]  = 1'b1; // RESET
+assign io_in[16] = 1'b0 ; // SPIS SCK 
 
 `ifndef GL // Drive Power for Hold Fix Buf
     // All standard cell need power hook-up for functionality work
diff --git a/verilog/dv/user_spi_isp/user_spi_isp_tb.v b/verilog/dv/user_spi_isp/user_spi_isp_tb.v
index 95e4e51..7d78ef2 100644
--- a/verilog/dv/user_spi_isp/user_spi_isp_tb.v
+++ b/verilog/dv/user_spi_isp/user_spi_isp_tb.v
@@ -137,16 +137,14 @@
 	end
 initial
 begin
-   wb_rst_i <= 1'b1;
 
-   #100;
-   wb_rst_i <= 1'b0;	    	// Release reset
+   init();
 
    $display("Monitor: Standalone User SPI ISP Test Started");
 
 
    // Remove Wb Reset
-   u_spim.reg_wr_dword(`ADDR_SPACE_WBHOST+`WBHOST_GLBL_CFG,'h1);
+   //u_spim.reg_wr_dword(`ADDR_SPACE_WBHOST+`WBHOST_GLBL_CFG,'h1);
 
    repeat (2) @(posedge clock);
    #1;
@@ -229,16 +227,17 @@
 
 );
 
+// SSPI Slave I/F
 `ifndef GL // Drive Power for Hold Fix Buf
     // All standard cell need power hook-up for functionality work
     initial begin
     end
 `endif    
 
-assign io_in[0]  = 1'b0;
-assign io_in[16] = sclk;
-assign io_in[15] = sdi;
-assign sdo       = io_out[14];
+assign io_in[5]  = 1'b0;
+assign io_in[21] = sclk;
+assign io_in[20] = sdi;
+assign sdo       = io_out[19];
 
 bfm_spim  u_spim (
           // SPI
@@ -250,5 +249,6 @@
                 );
 
 
+`include "user_tasks.sv"
 endmodule
 `default_nettype wire
diff --git a/verilog/dv/user_sram_exec/user_sram_exec_tb.v b/verilog/dv/user_sram_exec/user_sram_exec_tb.v
index a8f6568..555fc4b 100644
--- a/verilog/dv/user_sram_exec/user_sram_exec_tb.v
+++ b/verilog/dv/user_sram_exec/user_sram_exec_tb.v
@@ -138,9 +138,15 @@
 		if(d_risc_id == 0) begin
 		     $display("STATUS: Working with Risc core 0");
                      wb_user_core_write(`ADDR_SPACE_GLBL+`GLBL_CFG_CFG0,'h11F);
-		end else begin
+		end else if(d_risc_id == 1) begin
 		     $display("STATUS: Working with Risc core 1");
                      wb_user_core_write(`ADDR_SPACE_GLBL+`GLBL_CFG_CFG0,'h21F);
+		end else if(d_risc_id == 2) begin
+		     $display("STATUS: Working with Risc core 2");
+                     wb_user_core_write(`ADDR_SPACE_GLBL+`GLBL_CFG_CFG0,'h41F);
+		end else if(d_risc_id == 3) begin
+		     $display("STATUS: Working with Risc core 3");
+                     wb_user_core_write(`ADDR_SPACE_GLBL+`GLBL_CFG_CFG0,'h81F);
 		end
 
 
@@ -231,6 +237,9 @@
     .user_irq       () 
 
 );
+// SSPI Slave I/F
+assign io_in[0]  = 1'b1; // RESET
+assign io_in[16] = 1'b0 ; // SPIS SCK 
 
 `ifndef GL // Drive Power for Hold Fix Buf
     // All standard cell need power hook-up for functionality work
diff --git a/verilog/dv/user_sspi/user_sspi_tb.v b/verilog/dv/user_sspi/user_sspi_tb.v
index eee28ca..11f2901 100644
--- a/verilog/dv/user_sspi/user_sspi_tb.v
+++ b/verilog/dv/user_sspi/user_sspi_tb.v
@@ -131,38 +131,39 @@
 
 	initial begin
 		$dumpon;
+        init();
 
 		#200; // Wait for reset removal
-	        repeat (10) @(posedge clock);
+	    repeat (10) @(posedge clock);
 		$display("Monitor: Standalone User Risc Boot Test Started");
 
 		// Remove Wb Reset
-		wb_user_core_write(`ADDR_SPACE_WBHOST+`WBHOST_GLBL_CFG,'h1);
+		//wb_user_core_write(`ADDR_SPACE_WBHOST+`WBHOST_GLBL_CFG,'h1);
 
-                // Enable SPI Multi Functional Ports
-                // wire        cfg_spim_enb         = cfg_multi_func_sel[10];
-                // wire [3:0]  cfg_spim_cs_enb      = cfg_multi_func_sel[14:11];
-                wb_user_core_write(`ADDR_SPACE_GLBL+`GLBL_CFG_MUTI_FUNC,'h7C00);
+        // Enable SPI Multi Functional Ports
+        // wire        cfg_spim_enb         = cfg_multi_func_sel[10];
+        // wire [3:0]  cfg_spim_cs_enb      = cfg_multi_func_sel[14:11];
+        wb_user_core_write(`ADDR_SPACE_GLBL+`GLBL_CFG_MUTI_FUNC,'h7C00);
 
-	        repeat (2) @(posedge clock);
+	    repeat (2) @(posedge clock);
 		#1;
 
-                // Remove the reset
+        // Remove the reset
 		// Remove WB and SPI/UART Reset, Keep CORE under Reset
-                wb_user_core_write(`ADDR_SPACE_GLBL+`GLBL_CFG_CFG0,'h01F);
+        wb_user_core_write(`ADDR_SPACE_GLBL+`GLBL_CFG_CFG0,'h01F);
 
 
 		test_fail = 0;
 		sspi_init();
-	        repeat (200) @(posedge clock);
-                wb_user_core_write(`ADDR_SPACE_WBHOST+`WBHOST_BANK_SEL,'h1000); // Change the Bank Sel 1000
-                $display("############################################");
-                $display("   Testing IS62/65WVS1288GALL SSRAM[0] Read/Write Access       ");
-                $display("############################################");
+	    repeat (200) @(posedge clock);
+        wb_user_core_write(`ADDR_SPACE_WBHOST+`WBHOST_BANK_SEL,'h1000); // Change the Bank Sel 1000
+        $display("############################################");
+        $display("   Testing IS62/65WVS1288GALL SSRAM[0] Read/Write Access       ");
+        $display("############################################");
 		// SSPI Indirect RAM READ ACCESS-
 		// Byte Read Option
 		// <Instr:0x3> <Addr:24Bit Address> <Read Data Out>
-                spi_chip_no = 2'b00; // Select the Chip Select to zero
+        spi_chip_no = 2'b00; // Select the Chip Select to zero
 		sspi_dw_read_check(8'h03,24'h0000,32'h03020100);
 		sspi_dw_read_check(8'h03,24'h0004,32'h07060504);
 		sspi_dw_read_check(8'h03,24'h0008,32'h0b0a0908);
@@ -209,13 +210,13 @@
 		sspi_dw_read_check(8'h03,24'h0208,32'h99AABBCC);
 		sspi_dw_read_check(8'h03,24'h020C,32'hDDEEFF00);
 
-                $display("############################################");
-                $display("   Testing IS62/65WVS1288GALL SSRAM[1] Read/Write Access       ");
-                $display("############################################");
+        $display("############################################");
+        $display("   Testing IS62/65WVS1288GALL SSRAM[1] Read/Write Access       ");
+        $display("############################################");
 		// SSPI Indirect RAM READ ACCESS-
 		// Byte Read Option
 		// <Instr:0x3> <Addr:24Bit Address> <Read Data Out>
-                spi_chip_no = 2'b01; // Select the Chip Select to zero
+        spi_chip_no = 2'b01; // Select the Chip Select to zero
 		sspi_dw_read_check(8'h03,24'h0000,32'h13121110);
 		sspi_dw_read_check(8'h03,24'h0004,32'h17161514);
 		sspi_dw_read_check(8'h03,24'h0008,32'h1B1A1918);
@@ -268,13 +269,13 @@
 		sspi_dw_read_check(8'h03,24'h0208,32'h99AABBCC);
 		sspi_dw_read_check(8'h03,24'h020C,32'hDDEEFF00);
 
-                $display("############################################");
-                $display("   Testing IS62/65WVS1288GALL SSRAM[2] Read/Write Access       ");
-                $display("############################################");
+        $display("############################################");
+        $display("   Testing IS62/65WVS1288GALL SSRAM[2] Read/Write Access       ");
+        $display("############################################");
 		// SSPI Indirect RAM READ ACCESS-
 		// Byte Read Option
 		// <Instr:0x3> <Addr:24Bit Address> <Read Data Out>
-                spi_chip_no = 2'b10; // Select the Chip Select to zero
+        spi_chip_no = 2'b10; // Select the Chip Select to zero
 		sspi_dw_read_check(8'h03,24'h0000,32'h23222120);
 		sspi_dw_read_check(8'h03,24'h0004,32'h27262524);
 		sspi_dw_read_check(8'h03,24'h0008,32'h2b2a2928);
@@ -332,13 +333,13 @@
 		sspi_dw_read_check(8'h03,24'h0208,32'h99AABBCC);
 		sspi_dw_read_check(8'h03,24'h020C,32'hDDEEFF00);
 
-                $display("############################################");
-                $display("   Testing IS62/65WVS1288GALL SSRAM[3] Read/Write Access       ");
-                $display("############################################");
+        $display("############################################");
+        $display("   Testing IS62/65WVS1288GALL SSRAM[3] Read/Write Access       ");
+        $display("############################################");
 		// SSPI Indirect RAM READ ACCESS-
 		// Byte Read Option
 		// <Instr:0x3> <Addr:24Bit Address> <Read Data Out>
-                spi_chip_no = 2'b11; // Select the Chip Select to zero
+        spi_chip_no = 2'b11; // Select the Chip Select to zero
 		sspi_dw_read_check(8'h03,24'h0000,32'h33323130);
 		sspi_dw_read_check(8'h03,24'h0004,32'h37363534);
 		sspi_dw_read_check(8'h03,24'h0008,32'h3b3a3938);
@@ -386,14 +387,14 @@
 		sspi_dw_read_check(8'h03,24'h0208,32'h99AABBCC);
 		sspi_dw_read_check(8'h03,24'h020C,32'hDDEEFF00);
 		repeat (100) @(posedge clock);
-			// $display("+1000 cycles");
+		// $display("+1000 cycles");
 
-          	if(test_fail == 0) begin
-		   `ifdef GL
-	    	       $display("Monitor: SPI Master Mode (GL) Passed");
-		   `else
-		       $display("Monitor: SPI Master Mode (RTL) Passed");
-		   `endif
+        if(test_fail == 0) begin
+		`ifdef GL
+	    	$display("Monitor: SPI Master Mode (GL) Passed");
+		`else
+		    $display("Monitor: SPI Master Mode (RTL) Passed");
+		`endif
 	        end else begin
 		    `ifdef GL
 	    	        $display("Monitor: SPI Master Mode (GL) Failed");
@@ -405,11 +406,6 @@
 	        $finish;
 	end
 
-	initial begin
-		wb_rst_i <= 1'b1;
-		#100;
-		wb_rst_i <= 1'b0;	    	// Release reset
-	end
 wire USER_VDD1V8 = 1'b1;
 wire VSS = 1'b0;
 
@@ -450,7 +446,6 @@
 
 // SSPI Slave I/F
 assign io_in[0]  = 1'b1; // RESET
-assign io_in[16] = 1'b0 ; // SPIS SCK 
 
 
 `ifndef GL // Drive Power for Hold Fix Buf
@@ -465,15 +460,15 @@
 //  user core using the gpio pads
 //  ----------------------------------------------------
    wire flash_io1;
-   wire flash_clk = io_out[16];
-   tri  #1 flash_io0 = io_out[15];
-   assign io_in[14] = flash_io1;
+   wire flash_clk = io_out[21];
+   tri  #1 flash_io0 = io_out[20];
+   assign io_in[19] = flash_io1;
 
    tri  #1 flash_io2 = 1'b1;
    tri  #1 flash_io3 = 1'b1;
 
 
-   wire spiram_csb0 = io_out[13];
+   wire spiram_csb0 = io_out[18];
    is62wvs1288 #(.mem_file_name("flash0.hex"))
 	u_sfram_0 (
          // Data Inputs/Outputs
@@ -486,7 +481,7 @@
            .io3    (flash_io3)
     );
 
-   wire spiram_csb1 = io_out[12];
+   wire spiram_csb1 = io_out[17];
    is62wvs1288 #(.mem_file_name("flash1.hex"))
 	u_sfram_1 (
          // Data Inputs/Outputs
@@ -499,7 +494,7 @@
            .io3    (flash_io3)
     );
 
-   wire spiram_csb2 = io_out[9];
+   wire spiram_csb2 = io_out[14];
 is62wvs1288 #(.mem_file_name("flash2.hex"))
      u_sfram_2 (
       // Data Inputs/Outputs
@@ -512,7 +507,7 @@
 	.io3    (flash_io3)
  );
 
-   wire spiram_csb3 = io_out[8];
+   wire spiram_csb3 = io_out[13];
 is62wvs1288 #(.mem_file_name("flash3.hex"))
      u_sfram_3 (
       // Data Inputs/Outputs
@@ -665,6 +660,6 @@
 `endif
 **/
 `include "sspi_task.v"
-
+`include "user_tasks.sv"
 endmodule
 `default_nettype wire
diff --git a/verilog/dv/user_timer/user_timer_tb.v b/verilog/dv/user_timer/user_timer_tb.v
index 5a4f0ab..d39122d 100644
--- a/verilog/dv/user_timer/user_timer_tb.v
+++ b/verilog/dv/user_timer/user_timer_tb.v
@@ -133,26 +133,27 @@
 
 	initial begin
 		$dumpon;
+        init();
 
 		#200; // Wait for reset removal
 	        repeat (10) @(posedge clock);
 		$display("Monitor: Standalone User Risc Boot Test Started");
 
 		// Remove Wb Reset
-		wb_user_core_write(`ADDR_SPACE_WBHOST+`WBHOST_GLBL_CFG,'h1);
+		//wb_user_core_write(`ADDR_SPACE_WBHOST+`WBHOST_GLBL_CFG,'h1);
 
 	        repeat (2) @(posedge clock);
 		#1;
 
                 // Remove the reset
 		// Remove WB and SPI/UART Reset, Keep CORE under Reset
-                wb_user_core_write(`ADDR_SPACE_GLBL+`GLBL_CFG_CFG0,'h01F);
+                //wb_user_core_write(`ADDR_SPACE_GLBL+`GLBL_CFG_CFG0,'h01F);
 
 		// config 1us based on system clock - 1000/25ns = 40 
                 wb_user_core_write(`ADDR_SPACE_TIMER+`TIMER_CFG_GLBL,39);
 
 		// Enable Timer Interrupt
-                wb_user_core_write(`ADDR_SPACE_GLBL+`GLBL_CFG_INTR_MSK,'h700);
+                wb_user_core_write(`ADDR_SPACE_GLBL+`GLBL_CFG_INTR_MSK,'h007);
 
 		test_fail = 0;
 	        repeat (200) @(posedge clock);
@@ -174,12 +175,12 @@
                 wb_user_core_write(`ADDR_SPACE_TIMER+`TIMER_CFG_TIMER_2,'h0000_012B);
 
                 wb_user_core_read(`ADDR_SPACE_GLBL+`GPIO_CFG_INTR_STAT,read_data);
-		if((u_top.u_pinmux.irq_lines[10:8] == 3'b111) && (read_data[10:8] == 3'b111)) begin
+		if((u_top.u_pinmux.irq_lines[2:0] == 3'b111) && (read_data[2:0] == 3'b111)) begin
 		    $display("STATUS: Timer Interrupt detected ");
 		    // Clearing the Timer Interrupt
-                    wb_user_core_write(`ADDR_SPACE_GLBL+`GPIO_CFG_INTR_CLR,'h700);
+                    wb_user_core_write(`ADDR_SPACE_GLBL+`GPIO_CFG_INTR_CLR,'h007);
                     wb_user_core_read(`ADDR_SPACE_GLBL+`GPIO_CFG_INTR_STAT,read_data);
-		    if((u_top.u_pinmux.irq_lines[10:8] == 3'b111) && (read_data[10:8] == 3'b000)) begin
+		    if((u_top.u_pinmux.irq_lines[2:0] == 3'b111) && (read_data[2:0] == 3'b000)) begin
 		       $display("ERROR: Timer Interrupt not cleared ");
 		       test_fail = 1;
 		    end else begin
@@ -206,12 +207,12 @@
                 wb_user_core_write(`ADDR_SPACE_TIMER+`TIMER_CFG_TIMER_2,'h0000_012B);
 
                 wb_user_core_read(`ADDR_SPACE_GLBL+`GPIO_CFG_INTR_STAT,read_data);
-		if((u_top.u_pinmux.irq_lines[10:8] == 3'b111) && (read_data[10:8] == 3'b111)) begin
+		if((u_top.u_pinmux.irq_lines[2:0] == 3'b111) && (read_data[2:0] == 3'b111)) begin
 		    $display("STATUS: Timer Interrupt detected ");
 		    // Clearing the Timer Interrupt
-                    wb_user_core_write(`ADDR_SPACE_GLBL+`GPIO_CFG_INTR_CLR,'h700);
+                    wb_user_core_write(`ADDR_SPACE_GLBL+`GPIO_CFG_INTR_CLR,'h007);
                     wb_user_core_read(`ADDR_SPACE_GLBL+`GPIO_CFG_INTR_STAT,read_data);
-		    if((u_top.u_pinmux.irq_lines[10:8] == 3'b111) && (read_data[10:8] == 3'b000)) begin
+		    if((u_top.u_pinmux.irq_lines[2:0] == 3'b111) && (read_data[2:0] == 3'b000)) begin
 		       $display("ERROR: Timer Interrupt not cleared ");
 		       test_fail = 1;
 		    end else begin
@@ -242,11 +243,6 @@
 	        $finish;
 	end
 
-	initial begin
-		wb_rst_i <= 1'b1;
-		#100;
-		wb_rst_i <= 1'b0;	    	// Release reset
-	end
 wire USER_VDD1V8 = 1'b1;
 wire VSS = 1'b0;
 
@@ -335,6 +331,8 @@
     .user_irq       () 
 
 );
+// SSPI Slave I/F
+assign io_in[0]  = 1'b1; // RESET
 
 `ifndef GL // Drive Power for Hold Fix Buf
     // All standard cell need power hook-up for functionality work
@@ -485,5 +483,6 @@
 `endif
 **/
 
+`include "user_tasks.sv"
 endmodule
 `default_nettype wire
diff --git a/verilog/dv/user_uart/Makefile b/verilog/dv/user_uart/Makefile
index 1ca5cd8..fc9b113 100644
--- a/verilog/dv/user_uart/Makefile
+++ b/verilog/dv/user_uart/Makefile
@@ -51,32 +51,32 @@
 vvp:  ${PATTERN:=.vvp}
 
 %.vvp: %_tb.v
-	${GCC_PREFIX}-gcc -O2 -funroll-loops -fpeel-loops -fgcse-sm -fgcse-las  -D__RVC_EXT -static -std=gnu99 -fno-common -fno-builtin-printf -DTCM=0 -Wa,-march=rv32imc -march=rv32imc -mabi=ilp32 -DFLAGS_STR=\""-O2 -funroll-loops -fpeel-loops -fgcse-sm -fgcse-las "\"  -c -I./ -I$(YIFIVE_FIRMWARE_PATH) user_uart.c -o user_uart.o
+	${GCC_PREFIX}-gcc -O2 -funroll-loops -fpeel-loops -fgcse-sm -fgcse-las  -D__RVC_EXT -static -std=gnu99 -fno-common -fno-builtin-printf -DTCM=0 -Wa,-march=rv32imc -march=rv32imc -mabi=ilp32 -DFLAGS_STR=\""-O2 -funroll-loops -fpeel-loops -fgcse-sm -fgcse-las "\"  -c -I./ -I$(YIFIVE_FIRMWARE_PATH) ${PATTERN}.c -o ${PATTERN}.o
 	${GCC_PREFIX}-gcc -O2 -funroll-loops -fpeel-loops -fgcse-sm -fgcse-las  -D__RVC_EXT -static -std=gnu99 -fno-common -fno-builtin-printf -DTCM=0 -Wa,-march=rv32imc -march=rv32imc -mabi=ilp32 -DFLAGS_STR=\""-O2 -funroll-loops -fpeel-loops -fgcse-sm -fgcse-las "\"  -D__ASSEMBLY__=1 -c -I./ -I$(YIFIVE_FIRMWARE_PATH)  $(YIFIVE_FIRMWARE_PATH)/crt.S -o crt.o
-	${GCC_PREFIX}-gcc -o user_uart.elf -T $(YIFIVE_FIRMWARE_PATH)/link.ld user_uart.o crt.o -nostartfiles -nostdlib -lc -lgcc -march=rv32imc -mabi=ilp32 -N
-	${GCC_PREFIX}-objcopy -O verilog user_uart.elf user_uart.hex
-	${GCC_PREFIX}-objdump -D user_uart.elf > user_uart.dump
-	rm crt.o user_uart.o
+	${GCC_PREFIX}-gcc -o ${PATTERN}.elf -T $(YIFIVE_FIRMWARE_PATH)/link.ld ${PATTERN}.o crt.o -nostartfiles -nostdlib -lc -lgcc -march=rv32imc -mabi=ilp32 -N
+	${GCC_PREFIX}-objcopy -O verilog ${PATTERN}.elf ${PATTERN}.hex
+	${GCC_PREFIX}-objdump -D ${PATTERN}.elf > ${PATTERN}.dump
+	rm crt.o ${PATTERN}.o
 ifeq ($(SIM),RTL)
    ifeq ($(DUMP),OFF)
-	iverilog -g2012 -DFUNCTIONAL -DSIM -I $(PDK_PATH) \
+	iverilog -g2012 -DFUNCTIONAL -DSIM -DRISC_BOOT -I $(PDK_PATH) \
 	-f$(USER_PROJECT_VERILOG)/includes/includes.rtl.$(CONFIG) \
 	-f$(USER_PROJECT_VERILOG)/includes/includes.rtl.lib  \
 	$< -o $@ 
     else  
-	iverilog -g2012 -DWFDUMP -DFUNCTIONAL -DSIM -I $(PDK_PATH) \
+	iverilog -g2012 -DWFDUMP -DFUNCTIONAL -DRISC_BOOT -DSIM -I $(PDK_PATH) \
 	-f$(USER_PROJECT_VERILOG)/includes/includes.rtl.$(CONFIG) \
 	-f$(USER_PROJECT_VERILOG)/includes/includes.rtl.lib  \
 	$< -o $@ 
    endif
 else  
    ifeq ($(DUMP),OFF)
-	iverilog -g2012 -DFUNCTIONAL -DUSE_POWER_PINS -DGL -I $(PDK_PATH) \
+	iverilog -g2012 -DFUNCTIONAL -DUSE_POWER_PINS -DRISC_BOOT -DGL -I $(PDK_PATH) \
 	-f$(USER_PROJECT_VERILOG)/includes/includes.gl.$(CONFIG) \
 	-f$(USER_PROJECT_VERILOG)/includes/includes.gl.lib \
 	$< -o $@ 
     else  
-	iverilog -g2012 -DWFDUMP -DFUNCTIONAL -DUSE_POWER_PINS -DGL -I $(PDK_PATH) \
+	iverilog -g2012 -DWFDUMP -DFUNCTIONAL -DUSE_POWER_PINS -DRISC_BOOT -DGL -I $(PDK_PATH) \
 	-f$(USER_PROJECT_VERILOG)/includes/includes.gl.$(CONFIG) \
 	-f$(USER_PROJECT_VERILOG)/includes/includes.gl.lib \
 	$< -o $@ 
@@ -92,4 +92,4 @@
 clean:
 	rm -f *.elf *.hex *.bin *.vvp *.vcd *.log *.dump
 
-.PHONY: clean all
+.PHONY: clean hex all
diff --git a/verilog/dv/user_uart/user_uart.c b/verilog/dv/user_uart/user_uart.c
index 4a82878..e75590d 100644
--- a/verilog/dv/user_uart/user_uart.c
+++ b/verilog/dv/user_uart/user_uart.c
@@ -16,27 +16,32 @@
 // SPDX-FileContributor: Dinesh Annayya <dinesha@opencores.org>
 // //////////////////////////////////////////////////////////////////////////
 #define SC_SIM_OUTPORT (0xf0000000)
-#define uint32_t  long
+#include "../c_func/inc/int_reg_map.h"
+#include "common_misc.h"
+#include "common_bthread.h"
 
 
-#define reg_mprj_uart_reg0 (*(volatile uint32_t*)0x10010000)
-#define reg_mprj_uart_reg1 (*(volatile uint32_t*)0x10010004)
-#define reg_mprj_uart_reg2 (*(volatile uint32_t*)0x10010008)
-#define reg_mprj_uart_reg3 (*(volatile uint32_t*)0x1001000C)
-#define reg_mprj_uart_reg4 (*(volatile uint32_t*)0x10010010)
-#define reg_mprj_uart_reg5 (*(volatile uint32_t*)0x10010014)
-#define reg_mprj_uart_reg6 (*(volatile uint32_t*)0x10010018)
-#define reg_mprj_uart_reg7 (*(volatile uint32_t*)0x1001001C)
-#define reg_mprj_uart_reg8 (*(volatile uint32_t*)0x10010020)
 
 int main()
 {
 
+   reg_glbl_cfg0 |= 0x1F;       // Remove Reset for UART
+   reg_glbl_multi_func |=0x100; // Enable UART Multi func
+   reg_uart0_ctrl = 0x07;       // Enable Uart Access {3'h0,2'b00,1'b1,1'b1,1'b1}
+
+   // GLBL_CFG_MAIL_BOX used as mail box, each core update boot up handshake at 8 bit
+   // bit[7:0]   - core-0
+   // bit[15:8]  - core-1
+   // bit[23:16] - core-2
+   // bit[31:24] - core-3
+
+   reg_glbl_mail_box = 0x1 << (bthread_get_core_id() * 8); // Start of Main 
+
     while(1) {
        // Check UART RX fifo has data, if available loop back the data
        // Also check txfifo is not full
-       if((reg_mprj_uart_reg8 != 0) && ((reg_mprj_uart_reg4 & 0x1) != 0x1)) { 
-	   reg_mprj_uart_reg5 = reg_mprj_uart_reg6;
+       if((reg_uart0_rxfifo_stat != 0) && ((reg_uart0_status & 0x1) != 0x1)) { 
+	   reg_uart0_txdata = reg_uart0_rxdata;
        }
     }
 
diff --git a/verilog/dv/user_uart/user_uart_tb.v b/verilog/dv/user_uart/user_uart_tb.v
index 0096617..a4e25f8 100644
--- a/verilog/dv/user_uart/user_uart_tb.v
+++ b/verilog/dv/user_uart/user_uart_tb.v
@@ -76,9 +76,13 @@
 
 `include "sram_macros/sky130_sram_2kbyte_1rw1r_32x512_8.v"
 `include "uart_agent.v"
+`include "user_params.svh"
 
 
-module user_uart_tb;
+`define TB_HEX "user_uart.hex"
+`define TB_TOP  user_uart_tb
+module `TB_TOP;
+
 
 reg            clock         ;
 reg            wb_rst_i      ;
@@ -146,18 +150,19 @@
 	`ifdef WFDUMP
 	   initial begin
 	   	$dumpfile("simx.vcd");
-	   	$dumpvars(1, user_uart_tb);
-	   	$dumpvars(1, user_uart_tb.u_top);
+	   	$dumpvars(1, `TB_TOP);
+	   	$dumpvars(2, `TB_TOP.u_top);
+	   	$dumpvars(0, `TB_TOP.u_top.u_wb_host);
+	   	$dumpvars(0, `TB_TOP.u_top.u_pinmux);
 	   end
        `endif
 
-	initial begin
-		wb_rst_i <= 1'b1;
-		#100;
-		wb_rst_i <= 1'b0;	    	// Release reset
-	end
+
 initial
 begin
+
+   init();
+
    uart_data_bit           = 2'b11;
    uart_stop_bits          = 0; // 0: 1 stop bit; 1: 2 stop bit;
    uart_stick_parity       = 0; // 1: force even parity
@@ -174,17 +179,17 @@
    $display("Monitor: Standalone User Uart Test Started");
    
    // Remove Wb Reset
-   wb_user_core_write(`ADDR_SPACE_WBHOST+`WBHOST_GLBL_CFG,'h1);
+   //wb_user_core_write(`ADDR_SPACE_WBHOST+`WBHOST_GLBL_CFG,'h1);
 
    // Enable UART Multi Functional Ports
-   wb_user_core_write(`ADDR_SPACE_GLBL+`GLBL_CFG_MUTI_FUNC,'h100);
+   //wb_user_core_write(`ADDR_SPACE_GLBL+`GLBL_CFG_MUTI_FUNC,'h100);
    
    repeat (2) @(posedge clock);
    #1;
    // Remove all the reset
    if(d_risc_id == 0) begin
 	$display("STATUS: Working with Risc core 0");
-	wb_user_core_write(`ADDR_SPACE_GLBL+`GLBL_CFG_CFG0,'h11F);
+	//wb_user_core_write(`ADDR_SPACE_GLBL+`GLBL_CFG_CFG0,'h11F);
    end else if(d_risc_id == 1) begin
 	$display("STATUS: Working with Risc core 1");
 	wb_user_core_write(`ADDR_SPACE_GLBL+`GLBL_CFG_CFG0,'h21F);
@@ -199,11 +204,12 @@
    repeat (100) @(posedge clock);  // wait for Processor Get Ready
 
    tb_uart.uart_init;
-   wb_user_core_write(`ADDR_SPACE_UART0+8'h0,{3'h0,2'b00,1'b1,1'b1,1'b1});  
+   //wb_user_core_write(`ADDR_SPACE_UART0+`UART_CTRL,{3'h0,2'b00,1'b1,1'b1,1'b1});  
    tb_uart.control_setup (uart_data_bit, uart_stop_bits, uart_parity_en, uart_even_odd_parity, 
 	                          uart_stick_parity, uart_timeout, uart_divisor);
 
-   repeat (30000) @(posedge clock);  // wait for Processor Get Ready
+
+    wait_riscv_boot();
    
    
    for (i=0; i<40; i=i+1)
@@ -301,8 +307,8 @@
 );
 
 // SSPI Slave I/F
-assign io_in[0]  = 1'b1; // RESET
-assign io_in[16] = 1'b0 ; // SPIS SCK 
+assign io_in[5]  = 1'b1; // RESET
+assign io_in[21] = 1'b0; // CLOCK
 
 
 `ifndef GL // Drive Power for Hold Fix Buf
@@ -317,26 +323,26 @@
 //  user core using the gpio pads
 //  ----------------------------------------------------
 
-   wire flash_clk = io_out[24];
-   wire flash_csb = io_out[25];
+   wire flash_clk = io_out[28];
+   wire flash_csb = io_out[29];
    // Creating Pad Delay
-   wire #1 io_oeb_29 = io_oeb[29];
-   wire #1 io_oeb_30 = io_oeb[30];
-   wire #1 io_oeb_31 = io_oeb[31];
-   wire #1 io_oeb_32 = io_oeb[32];
-   tri  #1 flash_io0 = (io_oeb_29== 1'b0) ? io_out[29] : 1'bz;
-   tri  #1 flash_io1 = (io_oeb_30== 1'b0) ? io_out[30] : 1'bz;
-   tri  #1 flash_io2 = (io_oeb_31== 1'b0) ? io_out[31] : 1'bz;
-   tri  #1 flash_io3 = (io_oeb_32== 1'b0) ? io_out[32] : 1'bz;
+   wire #1 io_oeb_29 = io_oeb[33];
+   wire #1 io_oeb_30 = io_oeb[34];
+   wire #1 io_oeb_31 = io_oeb[35];
+   wire #1 io_oeb_32 = io_oeb[36];
+   tri  #1 flash_io0 = (io_oeb_29== 1'b0) ? io_out[33] : 1'bz;
+   tri  #1 flash_io1 = (io_oeb_30== 1'b0) ? io_out[34] : 1'bz;
+   tri  #1 flash_io2 = (io_oeb_31== 1'b0) ? io_out[35] : 1'bz;
+   tri  #1 flash_io3 = (io_oeb_32== 1'b0) ? io_out[36] : 1'bz;
 
-   assign io_in[29] = flash_io0;
-   assign io_in[30] = flash_io1;
-   assign io_in[31] = flash_io2;
-   assign io_in[32] = flash_io3;
+   assign io_in[33] = flash_io0;
+   assign io_in[34] = flash_io1;
+   assign io_in[35] = flash_io2;
+   assign io_in[36] = flash_io3;
 
 
    // Quard flash
-     s25fl256s #(.mem_file_name("user_uart.hex"),
+     s25fl256s #(.mem_file_name(`TB_HEX),
 	         .otp_file_name("none"), 
                  .TimingModel("S25FL512SAGMFI010_F_30pF")) 
 		 u_spi_flash_256mb
@@ -359,8 +365,8 @@
 // --------------------------
 wire uart_txd,uart_rxd;
 
-assign uart_txd   = io_out[2];
-assign io_in[1]  = uart_rxd ;
+assign uart_txd   = io_out[7];
+assign io_in[6]  = uart_rxd ;
  
 uart_agent tb_uart(
 	.mclk                (clock              ),
@@ -424,6 +430,40 @@
 end
 endtask
 
+task  wb_user_core_read_check;
+input [31:0] address;
+output [31:0] data;
+input [31:0] cmp_data;
+reg    [31:0] data;
+begin
+  repeat (1) @(posedge clock);
+  #1;
+  wbd_ext_adr_i =address;  // address
+  wbd_ext_we_i  ='h0;  // write
+  wbd_ext_dat_i ='0;  // data output
+  wbd_ext_sel_i ='hF;  // byte enable
+  wbd_ext_cyc_i ='h1;  // strobe/request
+  wbd_ext_stb_i ='h1;  // strobe/request
+  wait(wbd_ext_ack_o == 1);
+  repeat (1) @(negedge clock);
+  data  = wbd_ext_dat_o;  
+  repeat (1) @(posedge clock);
+  #1;
+  wbd_ext_cyc_i ='h0;  // strobe/request
+  wbd_ext_stb_i ='h0;  // strobe/request
+  wbd_ext_adr_i ='h0;  // address
+  wbd_ext_we_i  ='h0;  // write
+  wbd_ext_dat_i ='h0;  // data output
+  wbd_ext_sel_i ='h0;  // byte enable
+  if(data !== cmp_data) begin
+     $display("ERROR : WB USER ACCESS READ  Address : 0x%x, Exd: 0x%x Rxd: 0x%x ",address,cmp_data,data);
+     `TB_TOP.test_fail = 1;
+  end else begin
+     $display("STATUS: WB USER ACCESS READ  Address : 0x%x, Data : 0x%x",address,data);
+  end
+  repeat (2) @(posedge clock);
+end
+endtask
 `ifdef GL
 
 wire        wbd_spi_stb_i   = u_top.u_qspi_master.wbd_stb_i;
@@ -463,6 +503,7 @@
 
 `endif
 **/
+`include "user_tasks.sv"
 endmodule
 `include "s25fl256s.sv"
 `default_nettype wire
diff --git a/verilog/dv/user_uart1/Makefile b/verilog/dv/user_uart1/Makefile
index c6bc358..280fed2 100644
--- a/verilog/dv/user_uart1/Makefile
+++ b/verilog/dv/user_uart1/Makefile
@@ -51,32 +51,32 @@
 vvp:  ${PATTERN:=.vvp}
 
 %.vvp: %_tb.v
-	${GCC_PREFIX}-gcc -O2 -funroll-loops -fpeel-loops -fgcse-sm -fgcse-las  -D__RVC_EXT -static -std=gnu99 -fno-common -fno-builtin-printf -DTCM=0 -Wa,-march=rv32imc -march=rv32imc -mabi=ilp32 -DFLAGS_STR=\""-O2 -funroll-loops -fpeel-loops -fgcse-sm -fgcse-las "\"  -c -I./ -I$(YIFIVE_FIRMWARE_PATH) user_uart.c -o user_uart.o
+	${GCC_PREFIX}-gcc -O2 -funroll-loops -fpeel-loops -fgcse-sm -fgcse-las  -D__RVC_EXT -static -std=gnu99 -fno-common -fno-builtin-printf -DTCM=0 -Wa,-march=rv32imc -march=rv32imc -mabi=ilp32 -DFLAGS_STR=\""-O2 -funroll-loops -fpeel-loops -fgcse-sm -fgcse-las "\"  -c -I./ -I$(YIFIVE_FIRMWARE_PATH) ${PATTERN}.c -o ${PATTERN}.o
 	${GCC_PREFIX}-gcc -O2 -funroll-loops -fpeel-loops -fgcse-sm -fgcse-las  -D__RVC_EXT -static -std=gnu99 -fno-common -fno-builtin-printf -DTCM=0 -Wa,-march=rv32imc -march=rv32imc -mabi=ilp32 -DFLAGS_STR=\""-O2 -funroll-loops -fpeel-loops -fgcse-sm -fgcse-las "\"  -D__ASSEMBLY__=1 -c -I./ -I$(YIFIVE_FIRMWARE_PATH)  $(YIFIVE_FIRMWARE_PATH)/crt.S -o crt.o
-	${GCC_PREFIX}-gcc -o user_uart.elf -T $(YIFIVE_FIRMWARE_PATH)/link.ld user_uart.o crt.o -nostartfiles -nostdlib -lc -lgcc -march=rv32imc -mabi=ilp32 -N
-	${GCC_PREFIX}-objcopy -O verilog user_uart.elf user_uart.hex
-	${GCC_PREFIX}-objdump -D user_uart.elf > user_uart.dump
-	rm crt.o user_uart.o
+	${GCC_PREFIX}-gcc -o ${PATTERN}.elf -T $(YIFIVE_FIRMWARE_PATH)/link.ld ${PATTERN}.o crt.o -nostartfiles -nostdlib -lc -lgcc -march=rv32imc -mabi=ilp32 -N
+	${GCC_PREFIX}-objcopy -O verilog ${PATTERN}.elf ${PATTERN}.hex
+	${GCC_PREFIX}-objdump -D ${PATTERN}.elf > ${PATTERN}.dump
+	rm crt.o ${PATTERN}.o
 ifeq ($(SIM),RTL)
    ifeq ($(DUMP),OFF)
-	iverilog -g2012 -DFUNCTIONAL -DSIM -I $(PDK_PATH) \
+	iverilog -g2012 -DFUNCTIONAL -DSIM -DRISC_BOOT -I $(PDK_PATH) \
 	-f$(USER_PROJECT_VERILOG)/includes/includes.rtl.$(CONFIG) \
 	-f$(USER_PROJECT_VERILOG)/includes/includes.rtl.lib  \
 	$< -o $@ 
     else  
-	iverilog -g2012 -DWFDUMP -DFUNCTIONAL -DSIM -I $(PDK_PATH) \
+	iverilog -g2012 -DWFDUMP -DFUNCTIONAL -DRISC_BOOT -DSIM -I $(PDK_PATH) \
 	-f$(USER_PROJECT_VERILOG)/includes/includes.rtl.$(CONFIG) \
 	-f$(USER_PROJECT_VERILOG)/includes/includes.rtl.lib  \
 	$< -o $@ 
    endif
 else  
    ifeq ($(DUMP),OFF)
-	iverilog -g2012 -DFUNCTIONAL -DUSE_POWER_PINS -DGL -I $(PDK_PATH) \
+	iverilog -g2012 -DFUNCTIONAL -DUSE_POWER_PINS -DRISC_BOOT -DGL -I $(PDK_PATH) \
 	-f$(USER_PROJECT_VERILOG)/includes/includes.gl.$(CONFIG) \
 	-f$(USER_PROJECT_VERILOG)/includes/includes.gl.lib \
 	$< -o $@ 
     else  
-	iverilog -g2012 -DWFDUMP -DFUNCTIONAL -DUSE_POWER_PINS -DGL -I $(PDK_PATH) \
+	iverilog -g2012 -DWFDUMP -DFUNCTIONAL -DUSE_POWER_PINS -DRISC_BOOT -DGL -I $(PDK_PATH) \
 	-f$(USER_PROJECT_VERILOG)/includes/includes.gl.$(CONFIG) \
 	-f$(USER_PROJECT_VERILOG)/includes/includes.gl.lib \
 	$< -o $@ 
diff --git a/verilog/dv/user_uart1/user_uart.c b/verilog/dv/user_uart1/user_uart.c
deleted file mode 100644
index ac8c50f..0000000
--- a/verilog/dv/user_uart1/user_uart.c
+++ /dev/null
@@ -1,43 +0,0 @@
-//////////////////////////////////////////////////////////////////////////////
-// SPDX-FileCopyrightText: 2021, Dinesh Annayya
-// 
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//      http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-// SPDX-License-Identifier: Apache-2.0
-// SPDX-FileContributor: Dinesh Annayya <dinesha@opencores.org>
-// //////////////////////////////////////////////////////////////////////////
-#define SC_SIM_OUTPORT (0xf0000000)
-#define uint32_t  long
-
-
-#define reg_mprj_uart_reg0 (*(volatile uint32_t*)0x10010100)
-#define reg_mprj_uart_reg1 (*(volatile uint32_t*)0x10010104)
-#define reg_mprj_uart_reg2 (*(volatile uint32_t*)0x10010108)
-#define reg_mprj_uart_reg3 (*(volatile uint32_t*)0x1001010C)
-#define reg_mprj_uart_reg4 (*(volatile uint32_t*)0x10010110)
-#define reg_mprj_uart_reg5 (*(volatile uint32_t*)0x10010114)
-#define reg_mprj_uart_reg6 (*(volatile uint32_t*)0x10010118)
-#define reg_mprj_uart_reg7 (*(volatile uint32_t*)0x1001011C)
-#define reg_mprj_uart_reg8 (*(volatile uint32_t*)0x10010120)
-
-int main()
-{
-
-    while(1) {
-       // Check UART RX fifo has data, if available loop back the data
-       if(reg_mprj_uart_reg8 != 0) { 
-	   reg_mprj_uart_reg5 = reg_mprj_uart_reg6;
-       }
-    }
-
-    return 0;
-}
diff --git a/verilog/dv/user_uart1/user_uart1.c b/verilog/dv/user_uart1/user_uart1.c
new file mode 100644
index 0000000..e680062
--- /dev/null
+++ b/verilog/dv/user_uart1/user_uart1.c
@@ -0,0 +1,49 @@
+//////////////////////////////////////////////////////////////////////////////
+// SPDX-FileCopyrightText: 2021, Dinesh Annayya
+// 
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+// SPDX-License-Identifier: Apache-2.0
+// SPDX-FileContributor: Dinesh Annayya <dinesha@opencores.org>
+// //////////////////////////////////////////////////////////////////////////
+#define SC_SIM_OUTPORT (0xf0000000)
+#include "../c_func/inc/int_reg_map.h"
+#include "common_misc.h"
+#include "common_bthread.h"
+
+
+
+int main()
+{
+
+   reg_glbl_cfg0 |= 0x43;       // Remove Reset for UART
+   reg_glbl_multi_func |=0x200; // Enable UART Multi func
+   reg_uart1_ctrl = 0x07;       // Enable Uart Access {3'h0,2'b00,1'b1,1'b1,1'b1}
+
+   // GLBL_CFG_MAIL_BOX used as mail box, each core update boot up handshake at 8 bit
+   // bit[7:0]   - core-0
+   // bit[15:8]  - core-1
+   // bit[23:16] - core-2
+   // bit[31:24] - core-3
+
+   reg_glbl_mail_box = 0x1 << (bthread_get_core_id() * 8); // Start of Main 
+
+    while(1) {
+       // Check UART RX fifo has data, if available loop back the data
+       // Also check txfifo is not full
+       if((reg_uart1_rxfifo_stat != 0) && ((reg_uart1_status & 0x1) != 0x1)) { 
+	   reg_uart1_txdata = reg_uart1_rxdata;
+       }
+    }
+
+    return 0;
+}
diff --git a/verilog/dv/user_uart1/user_uart1_tb.v b/verilog/dv/user_uart1/user_uart1_tb.v
index 6a2d3c5..8559565 100644
--- a/verilog/dv/user_uart1/user_uart1_tb.v
+++ b/verilog/dv/user_uart1/user_uart1_tb.v
@@ -78,7 +78,9 @@
 `include "uart_agent.v"
 
 
-module user_uart1_tb;
+`define TB_HEX "user_uart1.hex"
+`define TB_TOP  user_uart1_tb
+module `TB_TOP;
 
 reg            clock         ;
 reg            wb_rst_i      ;
@@ -146,17 +148,19 @@
 	`ifdef WFDUMP
 	   initial begin
 	   	$dumpfile("simx.vcd");
-	   	$dumpvars(0, user_uart1_tb);
+	   	$dumpvars(1, `TB_TOP);
+	   	$dumpvars(1, `TB_TOP.u_top);
+	   	$dumpvars(1, `TB_TOP.u_top.u_wb_host);
+	   	$dumpvars(1, `TB_TOP.u_top.u_pinmux);
+	   	$dumpvars(1, `TB_TOP.u_top.u_uart_i2c_usb_spi);
 	   end
        `endif
 
-	initial begin
-		wb_rst_i <= 1'b1;
-		#100;
-		wb_rst_i <= 1'b0;	    	// Release reset
-	end
 initial
 begin
+
+   init();
+
    uart_data_bit           = 2'b11;
    uart_stop_bits          = 0; // 0: 1 stop bit; 1: 2 stop bit;
    uart_stick_parity       = 0; // 1: force even parity
@@ -173,17 +177,17 @@
    $display("Monitor: Standalone User Uart Test Started");
    
    // Remove Wb Reset
-   wb_user_core_write(`ADDR_SPACE_WBHOST+`WBHOST_GLBL_CFG,'h1);
+   //wb_user_core_write(`ADDR_SPACE_WBHOST+`WBHOST_GLBL_CFG,'h1);
 
    // Enable UART Multi Functional Ports
-   wb_user_core_write(`ADDR_SPACE_GLBL+`GLBL_CFG_MUTI_FUNC,'h200);
+   //wb_user_core_write(`ADDR_SPACE_GLBL+`GLBL_CFG_MUTI_FUNC,'h200);
    
    repeat (2) @(posedge clock);
    #1;
    // Remove all the reset
    if(d_risc_id == 0) begin
 	$display("STATUS: Working with Risc core 0");
-	wb_user_core_write(`ADDR_SPACE_GLBL+`GLBL_CFG_CFG0,'h143);
+	//wb_user_core_write(`ADDR_SPACE_GLBL+`GLBL_CFG_CFG0,'h143);
    end else if(d_risc_id == 1) begin
 	$display("STATUS: Working with Risc core 1");
 	wb_user_core_write(`ADDR_SPACE_GLBL+`GLBL_CFG_CFG0,'h243);
@@ -198,11 +202,12 @@
    repeat (100) @(posedge clock);  // wait for Processor Get Ready
 
    tb_uart.uart_init;
-   wb_user_core_write(`ADDR_SPACE_UART1+8'h0,{3'h0,2'b00,1'b1,1'b1,1'b1});  
+   //wb_user_core_write(`ADDR_SPACE_UART1+`UART_CTRL,{3'h0,2'b00,1'b1,1'b1,1'b1});  
    tb_uart.control_setup (uart_data_bit, uart_stop_bits, uart_parity_en, uart_even_odd_parity, 
 	                          uart_stick_parity, uart_timeout, uart_divisor);
 
-   repeat (30000) @(posedge clock);  // wait for Processor Get Ready
+
+    wait_riscv_boot();
    
    
    for (i=0; i<40; i=i+1)
@@ -300,8 +305,8 @@
 );
 
 // SSPI Slave I/F
-assign io_in[0]  = 1'b1; // RESET
-assign io_in[16] = 1'b0 ; // SPIS SCK 
+assign io_in[5]  = 1'b1; // RESET
+assign io_in[21] = 1'b0; // CLOCK
 
 
 `ifndef GL // Drive Power for Hold Fix Buf
@@ -316,26 +321,26 @@
 //  user core using the gpio pads
 //  ----------------------------------------------------
 
-   wire flash_clk = io_out[24];
-   wire flash_csb = io_out[25];
+   wire flash_clk = io_out[28];
+   wire flash_csb = io_out[29];
    // Creating Pad Delay
-   wire #1 io_oeb_29 = io_oeb[29];
-   wire #1 io_oeb_30 = io_oeb[30];
-   wire #1 io_oeb_31 = io_oeb[31];
-   wire #1 io_oeb_32 = io_oeb[32];
-   tri  #1 flash_io0 = (io_oeb_29== 1'b0) ? io_out[29] : 1'bz;
-   tri  #1 flash_io1 = (io_oeb_30== 1'b0) ? io_out[30] : 1'bz;
-   tri  #1 flash_io2 = (io_oeb_31== 1'b0) ? io_out[31] : 1'bz;
-   tri  #1 flash_io3 = (io_oeb_32== 1'b0) ? io_out[32] : 1'bz;
+   wire #1 io_oeb_29 = io_oeb[33];
+   wire #1 io_oeb_30 = io_oeb[34];
+   wire #1 io_oeb_31 = io_oeb[35];
+   wire #1 io_oeb_32 = io_oeb[36];
+   tri  #1 flash_io0 = (io_oeb_29== 1'b0) ? io_out[33] : 1'bz;
+   tri  #1 flash_io1 = (io_oeb_30== 1'b0) ? io_out[34] : 1'bz;
+   tri  #1 flash_io2 = (io_oeb_31== 1'b0) ? io_out[35] : 1'bz;
+   tri  #1 flash_io3 = (io_oeb_32== 1'b0) ? io_out[36] : 1'bz;
 
-   assign io_in[29] = flash_io0;
-   assign io_in[30] = flash_io1;
-   assign io_in[31] = flash_io2;
-   assign io_in[32] = flash_io3;
+   assign io_in[33] = flash_io0;
+   assign io_in[34] = flash_io1;
+   assign io_in[35] = flash_io2;
+   assign io_in[36] = flash_io3;
 
 
    // Quard flash
-     s25fl256s #(.mem_file_name("user_uart.hex"),
+     s25fl256s #(.mem_file_name(`TB_HEX),
 	         .otp_file_name("none"), 
                  .TimingModel("S25FL512SAGMFI010_F_30pF")) 
 		 u_spi_flash_256mb
@@ -358,8 +363,8 @@
 // --------------------------
 wire uart_txd,uart_rxd;
 
-assign uart_txd   = io_out[5];
-assign io_in[3]  = uart_rxd ;
+assign uart_txd   = io_out[10];
+assign io_in[8]  = uart_rxd ;
  
 uart_agent tb_uart(
 	.mclk                (clock              ),
@@ -423,6 +428,40 @@
 end
 endtask
 
+task  wb_user_core_read_check;
+input [31:0] address;
+output [31:0] data;
+input [31:0] cmp_data;
+reg    [31:0] data;
+begin
+  repeat (1) @(posedge clock);
+  #1;
+  wbd_ext_adr_i =address;  // address
+  wbd_ext_we_i  ='h0;  // write
+  wbd_ext_dat_i ='0;  // data output
+  wbd_ext_sel_i ='hF;  // byte enable
+  wbd_ext_cyc_i ='h1;  // strobe/request
+  wbd_ext_stb_i ='h1;  // strobe/request
+  wait(wbd_ext_ack_o == 1);
+  repeat (1) @(negedge clock);
+  data  = wbd_ext_dat_o;  
+  repeat (1) @(posedge clock);
+  #1;
+  wbd_ext_cyc_i ='h0;  // strobe/request
+  wbd_ext_stb_i ='h0;  // strobe/request
+  wbd_ext_adr_i ='h0;  // address
+  wbd_ext_we_i  ='h0;  // write
+  wbd_ext_dat_i ='h0;  // data output
+  wbd_ext_sel_i ='h0;  // byte enable
+  if(data !== cmp_data) begin
+     $display("ERROR : WB USER ACCESS READ  Address : 0x%x, Exd: 0x%x Rxd: 0x%x ",address,cmp_data,data);
+     `TB_TOP.test_fail = 1;
+  end else begin
+     $display("STATUS: WB USER ACCESS READ  Address : 0x%x, Data : 0x%x",address,data);
+  end
+  repeat (2) @(posedge clock);
+end
+endtask
 `ifdef GL
 
 wire        wbd_spi_stb_i   = u_top.u_qspi_master.wbd_stb_i;
@@ -462,6 +501,7 @@
 
 `endif
 **/
+`include "user_tasks.sv"
 endmodule
 `include "s25fl256s.sv"
 `default_nettype wire
diff --git a/verilog/dv/user_uart_master/user_uart_master_tb.v b/verilog/dv/user_uart_master/user_uart_master_tb.v
index 4ed2f00..5d9006b 100644
--- a/verilog/dv/user_uart_master/user_uart_master_tb.v
+++ b/verilog/dv/user_uart_master/user_uart_master_tb.v
@@ -149,7 +149,7 @@
 	end
 initial
 begin
-   wb_rst_i <= 1'b1;
+   init();
    uart_data_bit           = 2'b11;
    uart_stop_bits          = 1; // 0: 1 stop bit; 1: 2 stop bit;
    uart_stick_parity       = 0; // 1: force even parity
@@ -167,7 +167,6 @@
    la_data_in[17:16] = 2'b00; //  priority mode, 0 -> nop, 1 -> Even, 2 -> Odd
 
    #100;
-   wb_rst_i <= 1'b0;	    	// Release reset
 
    $display("Monitor: Standalone User Uart master Test Started");
 
@@ -269,6 +268,8 @@
     .user_irq       () 
 
 );
+// SSPI Slave I/F
+assign io_in[0]  = 1'b1; // RESET
 
 `ifndef GL // Drive Power for Hold Fix Buf
     // All standard cell need power hook-up for functionality work
@@ -282,8 +283,8 @@
 // --------------------------
 wire uart_txd,uart_rxd;
 
-assign uart_txd   = io_out[35];
-assign io_in[34]  = uart_rxd ;
+assign uart_txd   = io_out[23];
+assign io_in[22]  = uart_rxd ;
  
 uart_agent tb_master_uart(
 	.mclk                (clock              ),
@@ -294,5 +295,6 @@
 
 
 `include "uart_master_tasks.sv"
+`include "user_tasks.sv"
 endmodule
 `default_nettype wire
diff --git a/verilog/dv/user_usb/user_usb_tb.v b/verilog/dv/user_usb/user_usb_tb.v
index 98115f7..b63b948 100644
--- a/verilog/dv/user_usb/user_usb_tb.v
+++ b/verilog/dv/user_usb/user_usb_tb.v
@@ -166,34 +166,30 @@
 
 	initial begin
 		$dumpon;
-
+                        init();
 		#200; // Wait for reset removal
 	        repeat (10) @(posedge clock);
 		$display("Monitor: Standalone User Risc Boot Test Started");
 
          
-		// Remove Wb/PinMux Reset
-                wb_user_core_write(`ADDR_SPACE_WBHOST+`WBHOST_GLBL_CFG,'h1);
 
-                // Enable SPI Multi Functional Ports
-                wb_user_core_write(`ADDR_SPACE_GLBL+`GLBL_CFG_MUTI_FUNC,'h400);
+         // Enable USB Multi Functional Ports
+         wb_user_core_write(`ADDR_SPACE_GLBL+`GLBL_CFG_MUTI_FUNC,'h10000);
 
 	        repeat (2) @(posedge clock);
 		#1;
          
-                // Remove Wb/PinMux Reset
-                wb_user_core_write(`ADDR_SPACE_WBHOST+`WBHOST_GLBL_CFG,'h1);
-	        // Set USB clock : 180/3 = 60Mhz	
-                wb_user_core_write(`ADDR_SPACE_WBHOST+`WBHOST_CLK_CTRL2,{8'h0,8'h61,8'h0,8'h0});
+	     // Set USB clock : 180/3 = 60Mhz	
+         wb_user_core_write(`ADDR_SPACE_GLBL+`GLBL_CFG_CLK_CTRL,{16'h0,8'h61,8'h0});
 
-                // Remove the reset
+         // Remove the reset
 		// Remove WB and SPI/UART Reset, Keep CORE under Reset
-                wb_user_core_write(`ADDR_SPACE_GLBL+`GLBL_CFG_CFG0,'h03F);
+         wb_user_core_write(`ADDR_SPACE_GLBL+`GLBL_CFG_CFG0,'h03F);
 
 
 		test_fail = 0;
-	        repeat (200) @(posedge clock);
-                wb_user_core_write(`ADDR_SPACE_WBHOST+`WBHOST_BANK_SEL,'h1000); // Change the Bank Sel 10
+	    repeat (200) @(posedge clock);
+        wb_user_core_write(`ADDR_SPACE_WBHOST+`WBHOST_BANK_SEL,'h1000); // Change the Bank Sel 10
 
 
 		//usb_test1;
@@ -257,6 +253,11 @@
     .user_irq       () 
 
 );
+// SSPI Slave I/F
+assign io_in[0]  = 1'b1; // RESET
+
+
+
     usb_agent u_usb_agent();
     test_control test_control();
 
@@ -269,11 +270,11 @@
 
 // Drive USB Pads
 //
-tri usbd_txdp = (io_oeb[36] == 1'b0) ? io_out[36] : 1'bz;
-tri usbd_txdn = (io_oeb[37] == 1'b0) ? io_out[37] : 1'bz;
+tri usbd_txdp = (io_oeb[24] == 1'b0) ? io_out[24] : 1'bz;
+tri usbd_txdn = (io_oeb[25] == 1'b0) ? io_out[25] : 1'bz;
 
-assign io_in[36] = usbd_txdp;
-assign io_in[37] = usbd_txdn;
+assign io_in[24] = usbd_txdp;
+assign io_in[25] = usbd_txdn;
 
 // Full Speed Device Indication
 
@@ -551,6 +552,6 @@
 **/
 `include "tests/usb_test1.v"
 `include "tests/usb_test2.v"
-
+`include "user_tasks.sv"
 endmodule
 `default_nettype wire
diff --git a/verilog/dv/wb_port/wb_port.c b/verilog/dv/wb_port/wb_port.c
index 642303c..99df59c 100644
--- a/verilog/dv/wb_port/wb_port.c
+++ b/verilog/dv/wb_port/wb_port.c
@@ -18,12 +18,9 @@
 // This include is relative to $CARAVEL_PATH (see Makefile)
 #include <defs.h>
 #include <stub.c>
-#include "../c_func/inc/user_reg_map.h"
+#include "../c_func/inc/ext_reg_map.h"
 
-// User Project Slaves (0x3000_0000)
-#define reg_mprj_slave (*(volatile uint32_t*)0x30000000)
 
-#define reg_mprj_wbhost_reg0 (*(volatile uint32_t*)0x30080000)
 
 
 
@@ -95,7 +92,7 @@
 	reg_mprj_datal = 0xAB600000;
 
     // Remove Wishbone Reset
-    reg_mprj_wbhost_reg0 = 0x1;
+    reg_mprj_wbhost_ctrl = 0x1;
 
     // Remove Reset
     reg_glbl_cfg0 = 0x01f;
diff --git a/verilog/includes/includes.gl.caravel_user_project b/verilog/includes/includes.gl.caravel_user_project
index d355b07..5a964c4 100644
--- a/verilog/includes/includes.gl.caravel_user_project
+++ b/verilog/includes/includes.gl.caravel_user_project
@@ -29,8 +29,10 @@
 #-v $(USER_PROJECT_VERILOG)/rtl/yifive/ycr2c/src/cache/src/core/icache_top.sv
 #-v $(USER_PROJECT_VERILOG)/rtl/yifive/ycr2c/src/cache/src/core/icache_app_fsm.sv
 #-v $(USER_PROJECT_VERILOG)/rtl/yifive/ycr2c/src/lib/ycr_async_wbb.sv
+#-v $(USER_PROJECT_VERILOG)/rtl/yifive/ycr2c/src/lib/sync_fifo2.sv
 #-v $(USER_PROJECT_VERILOG)/rtl/yifive/ycr2c/src/top/ycr_dmem_wb.sv
 #-v $(USER_PROJECT_VERILOG)/rtl/yifive/ycr2c/src/top/ycr_intf.sv
+#-v $(USER_PROJECT_VERILOG)/rtl/yifive/ycr2c/src/top/ycr_sram_mux.sv
 #else
 $(USER_PROJECT_VERILOG)/gl/ycr_intf.v
 #endif
@@ -75,6 +77,8 @@
 #-v $(USER_PROJECT_VERILOG)/rtl/yifive/ycr2c/src/core/pipeline/ycr_pipe_hdu.sv
 #-v $(USER_PROJECT_VERILOG)/rtl/yifive/ycr2c/src/core/pipeline/ycr_pipe_tdu.sv
 #-v $(USER_PROJECT_VERILOG)/rtl/yifive/ycr2c/src/core/pipeline/ycr_ipic.sv
+#-v $(USER_PROJECT_VERILOG)/rtl/yifive/ycr2c/src/core/primitives/ycr_reset_cells.sv
+#-v $(USER_PROJECT_VERILOG)/rtl/yifive/ycr2c/src/top/ycr_req_retiming.sv
 #else
 $(USER_PROJECT_VERILOG)/gl/ycr_core_top.v
 #endif
@@ -99,10 +103,28 @@
 ### WB_HOST
 ##################################################
 #ifdef WB_HOST_RTL
+#-v $(USER_PROJECT_VERILOG)/rtl/clk_skew_adjust/src/clk_skew_adjust.v
 #-v $(USER_PROJECT_VERILOG)/rtl/wb_host/src/wb_host.sv
+#-v $(USER_PROJECT_VERILOG)/rtl/wb_host/src/wb_reset_fsm.sv
+#-v $(USER_PROJECT_VERILOG)/rtl/lib/async_fifo.sv
+#-v $(USER_PROJECT_VERILOG)/rtl/lib/async_wb.sv
+#-v $(USER_PROJECT_VERILOG)/rtl/lib/clk_ctl.v
+#-v $(USER_PROJECT_VERILOG)/rtl/lib/ctech_cells.sv
+#-v $(USER_PROJECT_VERILOG)/rtl/lib/registers.v
+#-v $(USER_PROJECT_VERILOG)/rtl/lib/reset_sync.sv
+#-v $(USER_PROJECT_VERILOG)/rtl/lib/async_reg_bus.sv
+#-v $(USER_PROJECT_VERILOG)/rtl/lib/double_sync_low.v
+#-v $(USER_PROJECT_VERILOG)/rtl/lib/clk_div8.v
+#-v $(USER_PROJECT_VERILOG)/rtl/lib/async_fifo_th.sv
+#-v $(USER_PROJECT_VERILOG)/rtl/wb_interconnect/src/wb_arb.sv
+#-v $(USER_PROJECT_VERILOG)/rtl/uart/src/uart_txfsm.sv
+#-v $(USER_PROJECT_VERILOG)/rtl/uart/src/uart_rxfsm.sv
 #-v $(USER_PROJECT_VERILOG)/rtl/uart2wb/src/uart2wb.sv
 #-v $(USER_PROJECT_VERILOG)/rtl/uart2wb/src/uart2_core.sv
 #-v $(USER_PROJECT_VERILOG)/rtl/uart2wb/src/uart_msg_handler.v
+#-v $(USER_PROJECT_VERILOG)/rtl/sspis/src/sspis_top.sv
+#-v $(USER_PROJECT_VERILOG)/rtl/sspis/src/sspis_if.sv
+#-v $(USER_PROJECT_VERILOG)/rtl/sspis/src/spi2wb.sv
 #else
 $(USER_PROJECT_VERILOG)/gl/wb_host.v
 #endif
@@ -111,11 +133,32 @@
 ### PINMUX
 ##################################################
 #ifdef PINMUX_RTL
+#-v $(USER_PROJECT_VERILOG)/rtl/pinmux/src/pinmux_top.sv
 #-v $(USER_PROJECT_VERILOG)/rtl/pinmux/src/pinmux.sv
-#-v $(USER_PROJECT_VERILOG)/rtl/pinmux/src/pinmux_reg.sv
+#-v $(USER_PROJECT_VERILOG)/rtl/pinmux/src/glbl_reg.sv
+#-v $(USER_PROJECT_VERILOG)/rtl/pinmux/src/gpio_top.sv
 #-v $(USER_PROJECT_VERILOG)/rtl/pinmux/src/gpio_intr.sv
+#-v $(USER_PROJECT_VERILOG)/rtl/pinmux/src/gpio_reg.sv
+#-v $(USER_PROJECT_VERILOG)/rtl/pinmux/src/pwm_top.sv
+#-v $(USER_PROJECT_VERILOG)/rtl/pinmux/src/pwm_reg.sv
 #-v $(USER_PROJECT_VERILOG)/rtl/pinmux/src/pwm.sv
+#-v $(USER_PROJECT_VERILOG)/rtl/pinmux/src/timer_top.sv
+#-v $(USER_PROJECT_VERILOG)/rtl/pinmux/src/timer_reg.sv
 #-v $(USER_PROJECT_VERILOG)/rtl/pinmux/src/timer.sv
+#-v $(USER_PROJECT_VERILOG)/rtl/pinmux/src/semaphore_reg.sv
+#-v $(USER_PROJECT_VERILOG)/rtl/pinmux/src/ws281x_top.sv
+#-v $(USER_PROJECT_VERILOG)/rtl/pinmux/src/ws281x_driver.sv
+#-v $(USER_PROJECT_VERILOG)/rtl/pinmux/src/ws281x_reg.sv
+#-v $(USER_PROJECT_VERILOG)/rtl/pinmux/src/strap_ctrl.sv
+#-v $(USER_PROJECT_VERILOG)/rtl/pinmux/src/glbl_rst_reg.sv
+#-v $(USER_PROJECT_VERILOG)/rtl/lib/pulse_gen_type1.sv
+#-v $(USER_PROJECT_VERILOG)/rtl/lib/pulse_gen_type2.sv
+#-v $(USER_PROJECT_VERILOG)/rtl/lib/registers.v
+#-v $(USER_PROJECT_VERILOG)/rtl/lib/ctech_cells.sv
+#-v $(USER_PROJECT_VERILOG)/rtl/lib/reset_sync.sv
+#-v $(USER_PROJECT_VERILOG)/rtl/lib/sync_fifo.sv
+#-v $(USER_PROJECT_VERILOG)/rtl/lib/clk_ctl.v
+#-v $(USER_PROJECT_VERILOG)/rtl/lib/clk_skew_adjust.gv
 #else
 $(USER_PROJECT_VERILOG)/gl/pinmux_top.v
 #endif
@@ -141,6 +184,7 @@
 #-v $(USER_PROJECT_VERILOG)/rtl/sspim/src/sspim_ctl.sv
 #-v $(USER_PROJECT_VERILOG)/rtl/sspim/src/sspim_if.sv 
 #-v $(USER_PROJECT_VERILOG)/rtl/sspim/src/sspim_cfg.sv
+#-v $(USER_PROJECT_VERILOG)/rtl/sspim/src/sspim_clkgen.sv
 #-v $(USER_PROJECT_VERILOG)/rtl/uart_i2c_usb_spi/src/uart_i2c_usb_spi.sv
 #else
 $(USER_PROJECT_VERILOG)/gl/uart_i2c_usb_spi_top.v
@@ -152,6 +196,7 @@
 #ifdef WB_INTER_RTL
 #-v $(USER_PROJECT_VERILOG)/rtl/wb_interconnect/src/wb_slave_port.sv
 #-v $(USER_PROJECT_VERILOG)/rtl/wb_interconnect/src/wb_interconnect.sv
+#-v $(USER_PROJECT_VERILOG)/rtl/lib/sync_wbb.sv
 #else
 $(USER_PROJECT_VERILOG)/gl/wb_interconnect.v
 #endif
diff --git a/verilog/includes/includes.gl.lib b/verilog/includes/includes.gl.lib
index d82a5c2..9a0c428 100644
--- a/verilog/includes/includes.gl.lib
+++ b/verilog/includes/includes.gl.lib
@@ -1,11 +1,14 @@
 ###########################################################
 # STD CELLS - they need to be below the defines.v files 
 ###########################################################
--v $(PDK_ROOT)/sky130A/libs.ref/sky130_fd_io/verilog/sky130_fd_io.v
--v $(PDK_ROOT)/sky130A/libs.ref/sky130_fd_io/verilog/sky130_ef_io.v
--v $(PDK_ROOT)/sky130A/libs.ref/sky130_fd_sc_hd/verilog/primitives.v
--v $(PDK_ROOT)/sky130A/libs.ref/sky130_fd_sc_hd/verilog/sky130_fd_sc_hd.v
--v $(PDK_ROOT)/sky130A/libs.ref/sky130_fd_sc_hvl/verilog/primitives.v
--v $(PDK_ROOT)/sky130A/libs.ref/sky130_fd_sc_hvl/verilog/sky130_fd_sc_hvl.v
+-v $(PDK_ROOT)/sky130B/libs.ref/sky130_fd_io/verilog/sky130_fd_io.v
+-v $(PDK_ROOT)/sky130B/libs.ref/sky130_fd_io/verilog/sky130_ef_io.v
+-v $(PDK_ROOT)/sky130B/libs.ref/sky130_fd_sc_hd/verilog/primitives.v
+-v $(PDK_ROOT)/sky130B/libs.ref/sky130_fd_sc_hd/verilog/sky130_fd_sc_hd.v
+-v $(PDK_ROOT)/sky130B/libs.ref/sky130_fd_sc_hvl/verilog/primitives.v
+-v $(PDK_ROOT)/sky130B/libs.ref/sky130_fd_sc_hvl/verilog/sky130_fd_sc_hvl.v
 
-$(USER_PROJECT_VERILOG)/gl/digital_pll.v
+#$(USER_PROJECT_VERILOG)/gl/digital_pll.v
+-v $(USER_PROJECT_VERILOG)/rtl/digital_pll/src/digital_pll_controller.v
+-v $(USER_PROJECT_VERILOG)/rtl/digital_pll/src/digital_pll.v
+-v $(USER_PROJECT_VERILOG)/rtl/digital_pll/src/ring_osc2x13.v
diff --git a/verilog/includes/includes.rtl.caravel_user_project b/verilog/includes/includes.rtl.caravel_user_project
index 01f8d3c..ff47b70 100644
--- a/verilog/includes/includes.rtl.caravel_user_project
+++ b/verilog/includes/includes.rtl.caravel_user_project
@@ -20,8 +20,14 @@
 -v $(USER_PROJECT_VERILOG)/rtl/pinmux/src/timer_reg.sv
 -v $(USER_PROJECT_VERILOG)/rtl/pinmux/src/timer.sv
 -v $(USER_PROJECT_VERILOG)/rtl/pinmux/src/semaphore_reg.sv
+-v $(USER_PROJECT_VERILOG)/rtl/pinmux/src/ws281x_top.sv
+-v $(USER_PROJECT_VERILOG)/rtl/pinmux/src/ws281x_driver.sv
+-v $(USER_PROJECT_VERILOG)/rtl/pinmux/src/ws281x_reg.sv
+-v $(USER_PROJECT_VERILOG)/rtl/pinmux/src/strap_ctrl.sv
+-v $(USER_PROJECT_VERILOG)/rtl/pinmux/src/glbl_rst_reg.sv
 -v $(USER_PROJECT_VERILOG)/rtl/lib/pulse_gen_type1.sv
 -v $(USER_PROJECT_VERILOG)/rtl/lib/pulse_gen_type2.sv
+-v $(USER_PROJECT_VERILOG)/rtl/lib/clk_div8.v
 -v $(USER_PROJECT_VERILOG)/rtl/qspim/src/qspim_top.sv
 -v $(USER_PROJECT_VERILOG)/rtl/qspim/src/qspim_if.sv
 -v $(USER_PROJECT_VERILOG)/rtl/qspim/src/qspim_fifo.sv
@@ -62,6 +68,7 @@
 -v $(USER_PROJECT_VERILOG)/rtl/lib/ser_shift.sv
 -v $(USER_PROJECT_VERILOG)/rtl/digital_core/src/glbl_cfg.sv
 -v $(USER_PROJECT_VERILOG)/rtl/wb_host/src/wb_host.sv
+-v $(USER_PROJECT_VERILOG)/rtl/wb_host/src/wb_reset_fsm.sv
 -v $(USER_PROJECT_VERILOG)/rtl/sspis/src/sspis_top.sv
 -v $(USER_PROJECT_VERILOG)/rtl/sspis/src/sspis_if.sv
 -v $(USER_PROJECT_VERILOG)/rtl/sspis/src/spi2wb.sv
diff --git a/verilog/rtl/digital_pll/src/digital_pll.v b/verilog/rtl/digital_pll/src/digital_pll.v
index f5400d8..a4f189b 100644
--- a/verilog/rtl/digital_pll/src/digital_pll.v
+++ b/verilog/rtl/digital_pll/src/digital_pll.v
@@ -13,6 +13,39 @@
 // limitations under the License.
 // SPDX-License-Identifier: Apache-2.0
 
+
+/*****************************************************************
+
+Offset	bcount	4x clock period	clock period (ns)	clock (Mhz)
+1.168	0	    1.168	            4.672	        214.041095890411
+1.168	1	    1.18	            4.72	        211.864406779661
+1.168	2	    1.192	            4.768	        209.731543624161
+1.168	3	    1.204	            4.816	        207.641196013289
+1.168	4	    1.216	            4.864	        205.592105263158
+1.168	5	    1.228	            4.912	        203.583061889251
+1.168	6	    1.24	            4.96	        201.612903225806
+1.168	7	    1.252	            5.008	        199.680511182109
+1.168	8	    1.264	            5.056	        197.784810126582
+1.168	9	    1.276	            5.104	        195.924764890282
+1.168	10	    1.288	            5.152	        194.099378881988
+1.168	11	    1.3	                5.2	            192.307692307692
+1.168	12	    1.312	            5.248	        190.548780487805
+1.168	13	    1.324	            5.296	        188.821752265861
+1.168	14	    1.336	            5.344	        187.125748502994
+1.168	15	    1.348	            5.392	        185.459940652819
+1.168	16	    1.36	            5.44	        183.823529411765
+1.168	17	    1.372	            5.488	        182.215743440233
+1.168	18	    1.384	            5.536	        180.635838150289
+1.168	19	    1.396	            5.584	        179.083094555874
+1.168	20	    1.408	            5.632	        177.556818181818
+1.168	21	    1.42	            5.68	        176.056338028169
+1.168	22	    1.432	            5.728	        174.581005586592
+1.168	23	    1.444	            5.776	        173.130193905817
+1.168	24	    1.456	            5.824	        171.703296703297
+1.168	25	    1.468	            5.872	        170.299727520436
+1.168	26	    1.48	            5.92	        168.918918918919
+
+**************************************************/
 `default_nettype none
 // Digital PLL (ring oscillator + controller)
 // Technically this is a frequency locked loop, not a phase locked loop.
diff --git a/verilog/rtl/i2cm/src/core/i2cm_byte_ctrl.v b/verilog/rtl/i2cm/src/core/i2cm_byte_ctrl.v
index 002b51e..e50d66b 100755
--- a/verilog/rtl/i2cm/src/core/i2cm_byte_ctrl.v
+++ b/verilog/rtl/i2cm/src/core/i2cm_byte_ctrl.v
@@ -95,6 +95,7 @@
 	output reg   cmd_ack,
 	output reg   ack_out,
 	output       i2c_busy,
+    output       i2c_fsm_busy,
 	output       i2c_al,
 	output [7:0] dout,
 
@@ -161,6 +162,9 @@
 		.sda_oen ( sda_oen  )
 	);
 
+    // Generate I2C FSM Busy
+    assign i2c_fsm_busy = (c_state !=0);
+
 	// generate go-signal
 	assign go = (read | write | stop) & ~cmd_ack;
 
diff --git a/verilog/rtl/i2cm/src/core/i2cm_top.v b/verilog/rtl/i2cm/src/core/i2cm_top.v
index 3b32db9..2fea533 100755
--- a/verilog/rtl/i2cm/src/core/i2cm_top.v
+++ b/verilog/rtl/i2cm/src/core/i2cm_top.v
@@ -40,6 +40,8 @@
 //          1. Initail version picked from
 //              http://www.opencores.org/projects/i2c/
 //          2. renaming of reset signal to aresetn and sresetn
+//     v0.1 - Dinesh A, 28th Aug 2022
+//          Generated i2c_fsm_busy to identify fsm busy state 
 //
 //////////////////////////////////////////////////////////////////////
 ////                                                              ////
@@ -123,6 +125,7 @@
 	reg  tip;         // transfer in progress
 	reg  irq_flag;    // interrupt pending flag
 	wire i2c_busy;    // bus busy (start signal detected)
+	wire i2c_fsm_busy;// i2C FSM Busy
 	wire i2c_al;      // i2c bus arbitration lost
 	reg  al;          // status register arbitration lost bit
 
@@ -212,28 +215,29 @@
 
 	// hookup byte controller block
 	i2cm_byte_ctrl u_byte_ctrl (
-		.clk      ( wb_clk_i     ),
-		.sresetn  ( sresetn      ),
-		.aresetn  ( aresetn      ),
-		.ena      ( core_en      ),
-		.clk_cnt  ( prer         ),
-		.start    ( sta          ),
-		.stop     ( sto          ),
-		.read     ( rd           ),
-		.write    ( wr           ),
-		.ack_in   ( ack          ),
-		.din      ( txr          ),
-		.cmd_ack  ( done         ),
-		.ack_out  ( irxack       ),
-		.dout     ( rxr          ),
-		.i2c_busy ( i2c_busy     ),
-		.i2c_al   ( i2c_al       ),
-		.scl_i    ( scl_pad_i    ),
-		.scl_o    ( scl_pad_o    ),
-		.scl_oen  ( scl_padoen_o ),
-		.sda_i    ( sda_pad_i    ),
-		.sda_o    ( sda_pad_o    ),
-		.sda_oen  ( sda_padoen_o )
+		.clk          ( wb_clk_i     ),
+		.sresetn      ( sresetn      ),
+		.aresetn      ( aresetn      ),
+		.ena          ( core_en      ),
+		.clk_cnt      ( prer         ),
+		.start        ( sta          ),
+		.stop         ( sto          ),
+		.read         ( rd           ),
+		.write        ( wr           ),
+		.ack_in       ( ack          ),
+		.din          ( txr          ),
+		.cmd_ack      ( done         ),
+		.ack_out      ( irxack       ),
+		.dout         ( rxr          ),
+		.i2c_busy     ( i2c_busy     ),
+		.i2c_fsm_busy ( i2c_fsm_busy ),
+		.i2c_al       ( i2c_al       ),
+		.scl_i        ( scl_pad_i    ),
+		.scl_o        ( scl_pad_o    ),
+		.scl_oen      ( scl_padoen_o ),
+		.sda_i        ( sda_pad_i    ),
+		.sda_o        ( sda_pad_o    ),
+		.sda_oen      ( sda_padoen_o )
 	);
 
 	// status register block + interrupt request signal
@@ -273,7 +277,8 @@
 	assign sr[7]   = rxack;
 	assign sr[6]   = i2c_busy;
 	assign sr[5]   = al;
-	assign sr[4:2] = 3'h0; // reserved
+	assign sr[4]   = i2c_fsm_busy; // I2C FSM Busy
+	assign sr[3:2] = 2'h0; // reserved
 	assign sr[1]   = tip;
 	assign sr[0]   = irq_flag;
 
diff --git a/verilog/rtl/lib/clk_div8.v b/verilog/rtl/lib/clk_div8.v
new file mode 100644
index 0000000..d4731b7
--- /dev/null
+++ b/verilog/rtl/lib/clk_div8.v
@@ -0,0 +1,62 @@
+//////////////////////////////////////////////////////////////////////////////
+// SPDX-FileCopyrightText: 2021 , Dinesh Annayya                          
+// 
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+// SPDX-License-Identifier: Apache-2.0
+// SPDX-FileContributor: Created by Dinesh Annayya <dinesh.annayya@gmail.com>
+////////////////////////////////////////////////////////////////////////
+
+// #################################################################
+// Module: clock div by 2,4,8 supported
+//
+//
+//  
+// #################################################################
+
+
+module clk_div8 (
+   // Outputs
+       output logic clk_div_8,
+       output logic clk_div_4,
+       output logic clk_div_2,
+   // Inputs
+       input logic  mclk,
+       input logic  reset_n 
+   );
+
+
+               
+
+//------------------------------------
+// Clock Divide func is done here
+//------------------------------------
+reg  [2:0]      clk_cnt       ; // high level counter
+
+
+assign clk_div_2  = clk_cnt[0];
+assign clk_div_4  = clk_cnt[1];
+assign clk_div_8  = clk_cnt[2];
+
+always @ (posedge mclk or negedge reset_n)
+begin // {
+   if(reset_n == 1'b0) 
+   begin 
+      clk_cnt  <= 'h0;
+   end   else begin 
+      clk_cnt  <= clk_cnt + 1;
+   end   // }
+end   // }
+
+
+endmodule 
+
diff --git a/verilog/rtl/lib/ctech_cells.sv b/verilog/rtl/lib/ctech_cells.sv
index bd34f11..26e5cbb 100644
--- a/verilog/rtl/lib/ctech_cells.sv
+++ b/verilog/rtl/lib/ctech_cells.sv
@@ -118,3 +118,22 @@
 `endif
 
 endmodule
+
+module ctech_clk_gate (
+	input  logic GATE  ,
+	input  logic CLK   ,
+	output logic GCLK
+     );
+
+`ifndef SYNTHESIS
+   assign GCLK = CLK & GATE;
+`else
+    sky130_fd_sc_hd__dlclkp_2 u_gate(
+                                   .GATE    (GATE     ), 
+                                   .CLK     (CLK      ), 
+                                   .GCLK    (GCLK     )
+                                  );
+`endif
+
+endmodule
+
diff --git a/verilog/rtl/lib/registers.v b/verilog/rtl/lib/registers.v
index b9a093e..ef5d356 100755
--- a/verilog/rtl/lib/registers.v
+++ b/verilog/rtl/lib/registers.v
@@ -366,3 +366,45 @@
 
 
 endmodule
+
+/*********************************************************************
+ module: generic 32b register
+***********************************************************************/
+module  gen_32b_reg2	(
+	      //List of Inputs
+          rst_in,
+	      cs,
+	      we,		 
+	      data_in,
+	      reset_n,
+	      clk,
+	      
+	      //List of Outs
+	      data_out
+	      );
+
+  input [31:0]     rst_in;
+  input [3:0]      we;	
+  input            cs;
+  input [31:0]     data_in;	
+  input            reset_n;
+  input		       clk;
+  output [31:0]    data_out;
+
+
+  reg [31:0]    data_out;
+
+always @ (posedge clk) begin 
+  if (reset_n == 1'b0) begin
+    data_out  <= rst_in ;
+  end
+  else begin
+    if(cs && we[0]) data_out[7:0]   <= data_in[7:0];
+    if(cs && we[1]) data_out[15:8]  <= data_in[15:8];
+    if(cs && we[2]) data_out[23:16] <= data_in[23:16];
+    if(cs && we[3]) data_out[31:24] <= data_in[31:24];
+  end
+end
+
+
+endmodule
diff --git a/verilog/rtl/pinmux/src/glbl_reg.sv b/verilog/rtl/pinmux/src/glbl_reg.sv
index d91ff4e..bb52a2b 100644
--- a/verilog/rtl/pinmux/src/glbl_reg.sv
+++ b/verilog/rtl/pinmux/src/glbl_reg.sv
@@ -34,13 +34,34 @@
 ////  Revision :                                                  ////
 ////    0.1 - 16th Feb 2021, Dinesh A                             ////
 ////          initial version                                     ////
+////    0.2 - 28th Aug 2022, Dinesh A                             ////
+////          Additional Mail Box Register added at addr 0xF      ////
 //////////////////////////////////////////////////////////////////////
 //
+`include "user_params.svh"
+
 module glbl_reg (
                        // System Signals
                        // Inputs
 		               input logic             mclk                   ,
-                       input logic             h_reset_n              ,
+	                   input logic             e_reset_n              ,  // external reset
+	                   input logic             p_reset_n              ,  // power-on reset
+                       input logic             s_reset_n              ,  // soft reset
+
+                       input logic [15:0]      pad_strap_in           , // strap from pad
+
+                       input logic            user_clock1            ,
+                       input logic            user_clock2            ,
+                       input logic            int_pll_clock          ,
+                       input logic            xtal_clk               ,
+
+                       output logic            usb_clk                ,
+                       output logic            rtc_clk                ,
+
+                       // to/from Global Reset FSM
+	                    input  logic [31:0]    system_strap           ,
+	                    output logic [31:0]    strap_sticky           ,
+                       
 
                        // Global Reset control
                        output logic  [1:0]     cpu_core_rst_n         ,
@@ -54,7 +75,7 @@
 		       // Reg Bus Interface Signal
                        input logic             reg_cs                 ,
                        input logic             reg_wr                 ,
-                       input logic [3:0]       reg_addr               ,
+                       input logic [4:0]       reg_addr               ,
                        input logic [31:0]      reg_wdata              ,
                        input logic [3:0]       reg_be                 ,
 
@@ -65,7 +86,7 @@
 		               input  logic [1:0]      ext_intr_in            ,
 
 		      // Risc configuration
-                       output logic [15:0]     irq_lines              ,
+                       output logic [31:0]     irq_lines              ,
                        output logic            soft_irq               ,
                        output logic [2:0]      user_irq               ,
 		               input  logic            usb_intr               ,
@@ -76,7 +97,7 @@
                         
 
 		               input   logic [2:0]      timer_intr            ,
-		               input   logic            gpio_intr             
+		               input   logic [31:0]     gpio_intr             
    ); 
 
 
@@ -85,6 +106,7 @@
 // Internal Wire Declarations
 //-----------------------------------------------------------------------
 
+logic [15:0]    strap_latch           ;
 logic          sw_rd_en               ;
 logic          sw_wr_en;
 logic [4:0]    sw_addr; // addressing 16 registers
@@ -92,19 +114,39 @@
 logic [3:0]    wr_be  ;
 
 logic [31:0]   reg_out;
-logic  [31:0]   reg_0;  // Chip ID
-logic  [31:0]   reg_1;  // Global Reg-0
-logic  [31:0]   reg_2;  // Global Reg-1
-logic  [31:0]   reg_3;  // Global Interrupt Mask
-logic [31:0]    reg_4;  // Global Interrupt Status
-logic [31:0]    reg_5;  // Multi Function Sel
-logic [31:0]    reg_6;  // Software Reg-0
-logic [31:0]    reg_7;  // Software Reg-1
-logic [31:0]    reg_8;  // Software Reg-2
-logic [31:0]    reg_9;  // Software Reg-3
-logic  [31:0]   reg_10; // Software Reg-4
-logic [31:0]    reg_11; // Software Reg-5
+logic [31:0]   reg_0;  // Chip ID
+logic [31:0]   reg_1;  // Global Reg-0
+logic [31:0]   reg_2;  // Global Reg-1
+logic [31:0]   reg_3;  // Global Interrupt Mask
+logic [31:0]   reg_4;  // Global Interrupt Status
+logic [31:0]   reg_5;  // Multi Function Sel
+logic [31:0]   reg_6;  // 
+logic [31:0]   reg_7;  // 
+logic [31:0]   reg_8;  // 
+logic [31:0]   reg_9;  // 
+logic [31:0]   reg_10; // 
+logic [31:0]   reg_11; // 
+logic [31:0]   reg_12; // Latched Strap 
+logic [31:0]   reg_13; // Strap Sticky
+logic [31:0]   reg_14; // System Strap
+logic [31:0]   reg_15; // MailBox Reg
 
+logic [31:0]   reg_16;  // Software Reg-0  - p_reset
+logic [31:0]   reg_17;  // Software Reg-1  - p_reset
+logic [31:0]   reg_18;  // Software Reg-2  - p_reset
+logic [31:0]   reg_19;  // Software Reg-3  - p_reset
+logic [31:0]   reg_20;  // Software Reg-4  - s_reset
+logic [31:0]   reg_21;  // Software Reg-5  - s_reset
+logic [31:0]   reg_22;  // Software Reg-6  - s_reset
+logic [31:0]   reg_23;  // Software Reg-7  - s_reset
+logic [31:0]   reg_24;  // Reserved
+logic [31:0]   reg_25;  // Reserved
+logic [31:0]   reg_26;  // Reserved
+logic [31:0]   reg_27;  // Reserved
+logic [31:0]   reg_28;  // Reserved
+logic [31:0]   reg_29;  // Reserved
+logic [31:0]   reg_30;  // Reserved
+logic [31:0]   reg_31;  // Reserved
 
 logic           cs_int;
 
@@ -116,9 +158,9 @@
 assign       sw_reg_wdata  = reg_wdata;
 
 
-always @ (posedge mclk or negedge h_reset_n)
+always @ (posedge mclk or negedge s_reset_n)
 begin : preg_out_Seq
-   if (h_reset_n == 1'b0) begin
+   if (s_reset_n == 1'b0) begin
       reg_rdata  <= 'h0;
       reg_ack    <= 1'b0;
    end else if (reg_cs && !reg_ack) begin
@@ -134,32 +176,71 @@
 //-----------------------------------------------------------------------
 // register read enable and write enable decoding logic
 //-----------------------------------------------------------------------
-wire   sw_wr_en_0 = sw_wr_en  & (sw_addr == 4'h0);
-wire   sw_wr_en_1 = sw_wr_en  & (sw_addr == 4'h1);
-wire   sw_wr_en_2 = sw_wr_en  & (sw_addr == 4'h2);
-wire   sw_wr_en_3 = sw_wr_en  & (sw_addr == 4'h3);
-wire   sw_wr_en_4 = sw_wr_en  & (sw_addr == 4'h4);
-wire   sw_wr_en_5 = sw_wr_en  & (sw_addr == 4'h5);
-wire   sw_wr_en_6 = sw_wr_en  & (sw_addr == 4'h6);
-wire   sw_wr_en_7 = sw_wr_en  & (sw_addr == 4'h7);
-wire   sw_wr_en_8 = sw_wr_en  & (sw_addr == 4'h8);
-wire   sw_wr_en_9 = sw_wr_en  & (sw_addr == 4'h9);
-wire   sw_wr_en_10 = sw_wr_en & (sw_addr == 4'hA);
-wire   sw_wr_en_11 = sw_wr_en & (sw_addr == 4'hB);
+wire   sw_wr_en_0  = sw_wr_en  & (sw_addr == 5'h0);
+wire   sw_wr_en_1  = sw_wr_en  & (sw_addr == 5'h1);
+wire   sw_wr_en_2  = sw_wr_en  & (sw_addr == 5'h2);
+wire   sw_wr_en_3  = sw_wr_en  & (sw_addr == 5'h3);
+wire   sw_wr_en_4  = sw_wr_en  & (sw_addr == 5'h4);
+wire   sw_wr_en_5  = sw_wr_en  & (sw_addr == 5'h5);
+wire   sw_wr_en_6  = sw_wr_en  & (sw_addr == 5'h6);
+wire   sw_wr_en_7  = sw_wr_en  & (sw_addr == 5'h7);
+wire   sw_wr_en_8  = sw_wr_en  & (sw_addr == 5'h8);
+wire   sw_wr_en_9  = sw_wr_en  & (sw_addr == 5'h9);
+wire   sw_wr_en_10 = sw_wr_en  & (sw_addr == 5'hA);
+wire   sw_wr_en_11 = sw_wr_en  & (sw_addr == 5'hB);
+wire   sw_wr_en_12 = sw_wr_en  & (sw_addr == 5'hC);
+wire   sw_wr_en_13 = sw_wr_en  & (sw_addr == 5'hD);
+wire   sw_wr_en_14 = sw_wr_en  & (sw_addr == 5'hE);
+wire   sw_wr_en_15 = sw_wr_en  & (sw_addr == 5'hF);
+wire   sw_wr_en_16 = sw_wr_en  & (sw_addr == 5'h10);
+wire   sw_wr_en_17 = sw_wr_en  & (sw_addr == 5'h11);
+wire   sw_wr_en_18 = sw_wr_en  & (sw_addr == 5'h12);
+wire   sw_wr_en_19 = sw_wr_en  & (sw_addr == 5'h13);
+wire   sw_wr_en_20 = sw_wr_en  & (sw_addr == 5'h14);
+wire   sw_wr_en_21 = sw_wr_en  & (sw_addr == 5'h15);
+wire   sw_wr_en_22 = sw_wr_en  & (sw_addr == 5'h16);
+wire   sw_wr_en_23 = sw_wr_en  & (sw_addr == 5'h17);
+wire   sw_wr_en_24 = sw_wr_en  & (sw_addr == 5'h18);
+wire   sw_wr_en_25 = sw_wr_en  & (sw_addr == 5'h19);
+wire   sw_wr_en_26 = sw_wr_en  & (sw_addr == 5'h1A);
+wire   sw_wr_en_27 = sw_wr_en  & (sw_addr == 5'h1B);
+wire   sw_wr_en_28 = sw_wr_en  & (sw_addr == 5'h1C);
+wire   sw_wr_en_29 = sw_wr_en  & (sw_addr == 5'h1D);
+wire   sw_wr_en_30 = sw_wr_en  & (sw_addr == 5'h1E);
+wire   sw_wr_en_31 = sw_wr_en  & (sw_addr == 5'h1F);
 
-
-wire   sw_rd_en_0  = sw_rd_en  & (sw_addr == 4'h0);
-wire   sw_rd_en_1  = sw_rd_en  & (sw_addr == 4'h1);
-wire   sw_rd_en_2  = sw_rd_en  & (sw_addr == 4'h2);
-wire   sw_rd_en_3  = sw_rd_en  & (sw_addr == 4'h3);
-wire   sw_rd_en_4  = sw_rd_en  & (sw_addr == 4'h4);
-wire   sw_rd_en_5  = sw_rd_en  & (sw_addr == 4'h5);
-wire   sw_rd_en_6  = sw_rd_en  & (sw_addr == 4'h6);
-wire   sw_rd_en_7  = sw_rd_en  & (sw_addr == 4'h7);
-wire   sw_rd_en_8  = sw_rd_en  & (sw_addr == 4'h8);
-wire   sw_rd_en_9  = sw_rd_en  & (sw_addr == 4'h9);
-wire   sw_rd_en_10 = sw_rd_en  & (sw_addr == 4'hA);
-wire   sw_rd_en_11 = sw_rd_en  & (sw_addr == 4'hB);
+wire   sw_rd_en_0  = sw_rd_en  & (sw_addr == 5'h0);
+wire   sw_rd_en_1  = sw_rd_en  & (sw_addr == 5'h1);
+wire   sw_rd_en_2  = sw_rd_en  & (sw_addr == 5'h2);
+wire   sw_rd_en_3  = sw_rd_en  & (sw_addr == 5'h3);
+wire   sw_rd_en_4  = sw_rd_en  & (sw_addr == 5'h4);
+wire   sw_rd_en_5  = sw_rd_en  & (sw_addr == 5'h5);
+wire   sw_rd_en_6  = sw_rd_en  & (sw_addr == 5'h6);
+wire   sw_rd_en_7  = sw_rd_en  & (sw_addr == 5'h7);
+wire   sw_rd_en_8  = sw_rd_en  & (sw_addr == 5'h8);
+wire   sw_rd_en_9  = sw_rd_en  & (sw_addr == 5'h9);
+wire   sw_rd_en_10 = sw_rd_en  & (sw_addr == 5'hA);
+wire   sw_rd_en_11 = sw_rd_en  & (sw_addr == 5'hB);
+wire   sw_rd_en_12 = sw_rd_en  & (sw_addr == 5'hC);
+wire   sw_rd_en_13 = sw_rd_en  & (sw_addr == 5'hD);
+wire   sw_rd_en_14 = sw_rd_en  & (sw_addr == 5'hE);
+wire   sw_rd_en_15 = sw_rd_en  & (sw_addr == 5'hF);
+wire   sw_rd_en_16 = sw_rd_en  & (sw_addr == 5'h10);
+wire   sw_rd_en_17 = sw_rd_en  & (sw_addr == 5'h11);
+wire   sw_rd_en_18 = sw_rd_en  & (sw_addr == 5'h12);
+wire   sw_rd_en_19 = sw_rd_en  & (sw_addr == 5'h13);
+wire   sw_rd_en_20 = sw_rd_en  & (sw_addr == 5'h14);
+wire   sw_rd_en_21 = sw_rd_en  & (sw_addr == 5'h15);
+wire   sw_rd_en_22 = sw_rd_en  & (sw_addr == 5'h16);
+wire   sw_rd_en_23 = sw_rd_en  & (sw_addr == 5'h17);
+wire   sw_rd_en_24 = sw_rd_en  & (sw_addr == 5'h18);
+wire   sw_rd_en_25 = sw_rd_en  & (sw_addr == 5'h19);
+wire   sw_rd_en_26 = sw_rd_en  & (sw_addr == 5'h1A);
+wire   sw_rd_en_27 = sw_rd_en  & (sw_addr == 5'h1B);
+wire   sw_rd_en_28 = sw_rd_en  & (sw_addr == 5'h1C);
+wire   sw_rd_en_29 = sw_rd_en  & (sw_addr == 5'h1D);
+wire   sw_rd_en_30 = sw_rd_en  & (sw_addr == 5'h1E);
+wire   sw_rd_en_31 = sw_rd_en  & (sw_addr == 5'h1F);
 
 //-----------------------------------------------------------------------
 // Individual register assignments
@@ -187,22 +268,35 @@
 //------------------------------------------
 // reg-1: GLBL_CFG_0
 //------------------------------------------
-wire [31:0] cfg_glb_ctrl = reg_1;
+wire [31:0] cfg_rst_ctrl = reg_1;
 
-ctech_buf u_buf_cpu_intf_rst  (.A(cfg_glb_ctrl[0]),.X(cpu_intf_rst_n));
-ctech_buf u_buf_qspim_rst     (.A(cfg_glb_ctrl[1]),.X(qspim_rst_n));
-ctech_buf u_buf_sspim_rst     (.A(cfg_glb_ctrl[2]),.X(sspim_rst_n));
-ctech_buf u_buf_uart0_rst     (.A(cfg_glb_ctrl[3]),.X(uart_rst_n[0]));
-ctech_buf u_buf_i2cm_rst      (.A(cfg_glb_ctrl[4]),.X(i2cm_rst_n));
-ctech_buf u_buf_usb_rst       (.A(cfg_glb_ctrl[5]),.X(usb_rst_n));
-ctech_buf u_buf_uart1_rst     (.A(cfg_glb_ctrl[6]),.X(uart_rst_n[1]));
+ctech_buf u_buf_cpu_intf_rst  (.A(cfg_rst_ctrl[0]),.X(cpu_intf_rst_n));
+ctech_buf u_buf_qspim_rst     (.A(cfg_rst_ctrl[1]),.X(qspim_rst_n));
+ctech_buf u_buf_sspim_rst     (.A(cfg_rst_ctrl[2]),.X(sspim_rst_n));
+ctech_buf u_buf_uart0_rst     (.A(cfg_rst_ctrl[3]),.X(uart_rst_n[0]));
+ctech_buf u_buf_i2cm_rst      (.A(cfg_rst_ctrl[4]),.X(i2cm_rst_n));
+ctech_buf u_buf_usb_rst       (.A(cfg_rst_ctrl[5]),.X(usb_rst_n));
+ctech_buf u_buf_uart1_rst     (.A(cfg_rst_ctrl[6]),.X(uart_rst_n[1]));
 
-ctech_buf u_buf_cpu0_rst      (.A(cfg_glb_ctrl[8]),.X(cpu_core_rst_n[0]));
-ctech_buf u_buf_cpu1_rst      (.A(cfg_glb_ctrl[9]),.X(cpu_core_rst_n[1]));
+ctech_buf u_buf_cpu0_rst      (.A(cfg_rst_ctrl[8]),.X(cpu_core_rst_n[0]));
+ctech_buf u_buf_cpu1_rst      (.A(cfg_rst_ctrl[9]),.X(cpu_core_rst_n[1]));
 
-gen_32b_reg  #(32'h0) u_reg_1	(
+//---------------------------------------------------------
+// Default reset value decided based on riscv boot mode
+//
+//   bit [12]  - Riscv Reset control
+//               0 - Keep Riscv on Reset
+//               1 - Removed Riscv on Power On Reset
+//  Default cpu_intf_rst_n & qspim_rst_n reset is removed
+//---------------------------------------------------------
+wire        strap_riscv_bmode = system_strap[`STRAP_RISCV_RESET_MODE];
+wire [31:0] rst_in = (strap_riscv_bmode) ? 32'h103 : 32'h03;
+
+glbl_rst_reg  #(32'h0) u_reg_1	(
 	      //List of Inputs
-	      .reset_n    (h_reset_n     ),
+          .e_reset_n  (e_reset_n     ),
+	      .s_reset_n  (s_reset_n     ),
+          .rst_in     (rst_in        ),
 	      .clk        (mclk          ),
 	      .cs         (sw_wr_en_1    ),
 	      .we         (wr_be         ),		 
@@ -216,9 +310,21 @@
 // reg-2: GLBL_CFG_1
 //------------------------------------------
 
-gen_32b_reg  #(32'h0) u_reg_2	(
+wire [31:0] reg_2_rst_val = {4'h0,
+                             system_strap[`STRAP_RISCV_CACHE_BYPASS],
+                             system_strap[`STRAP_RISCV_CACHE_BYPASS],
+                             2'b0,
+                             1'b0,
+                             3'b0,
+                             system_strap[`STRAP_RISCV_SRAM_CLK_EDGE],
+                             system_strap[`STRAP_RISCV_SRAM_CLK_EDGE],
+                             system_strap[`STRAP_RISCV_SRAM_CLK_EDGE],
+                             system_strap[`STRAP_RISCV_SRAM_CLK_EDGE],
+                             16'h0};
+gen_32b_reg2  u_reg_2	(
 	      //List of Inputs
-	      .reset_n    (h_reset_n     ),
+	      .reset_n    (s_reset_n     ),
+          .rst_in     (reg_2_rst_val ),
 	      .clk        (mclk          ),
 	      .cs         (sw_wr_en_2    ),
 	      .we         (wr_be         ),		 
@@ -228,7 +334,9 @@
 	      .data_out   (reg_2         )
 	      );
 
-assign cfg_riscv_ctrl      = reg_2[31:16];
+assign  soft_irq      = reg_2[3]; 
+assign  user_irq      = reg_2[2:0]; 
+assign cfg_riscv_ctrl = reg_2[31:16];
 
 //-----------------------------------------------------------------------
 //   reg-3 : Global Interrupt Mask
@@ -236,7 +344,7 @@
 
 gen_32b_reg  #(32'h0) u_reg_3	(
 	      //List of Inputs
-	      .reset_n    (h_reset_n     ),
+	      .reset_n    (s_reset_n     ),
 	      .clk        (mclk          ),
 	      .cs         (sw_wr_en_3    ),
 	      .we         (wr_be         ),		 
@@ -249,53 +357,29 @@
 //-----------------------------------------------------------------------
 //   reg-4 : Global Interrupt Status
 //-----------------------------------------------------------------
-assign  irq_lines     = reg_3[15:0] & reg_4[15:0]; 
-assign  soft_irq      = reg_3[16]   & reg_4[16]; 
-assign  user_irq      = reg_3[19:17]& reg_4[19:17]; 
+assign  irq_lines     = reg_3[31:0] & reg_4[31:0]; 
 
+// In Arduino GPIO[7:0] is corresponds to PORT-A which is not available for user access
+wire [31:0] hware_intr_req = {gpio_intr[31:8], 3'b0,usb_intr, i2cm_intr,timer_intr[2:0]};
 
-generic_register #(8,0  ) u_reg4_be0 (
-	      .we            ({8{sw_wr_en_4 & 
-                                 wr_be[0]   }}   ),		 
-	      .data_in       (sw_reg_wdata[7:0]  ),
-	      .reset_n       (h_reset_n          ),
-	      .clk           (mclk               ),
-	      
-	      //List of Outs
-	      .data_out      (reg_4[7:0]         )
-          );
-
-
-wire [7:0] hware_intr_req = {gpio_intr, ext_intr_in[1:0], usb_intr, i2cm_intr,timer_intr[2:0]};
-
-generic_intr_stat_reg #(.WD(8),
-	                .RESET_DEFAULT(0)) u_reg4_be1 (
+generic_intr_stat_reg #(.WD(32),
+	                .RESET_DEFAULT(0)) u_reg4 (
 		 //inputs
 		 .clk         (mclk              ),
-		 .reset_n     (h_reset_n         ),
-	         .reg_we      ({8{sw_wr_en_4 & reg_ack & 
-                                 wr_be[1]   }}  ),		 
-		 .reg_din    (sw_reg_wdata[15:8] ),
+		 .reset_n     (s_reset_n         ),
+	     .reg_we      ({{8{sw_wr_en_4 & reg_ack & wr_be[3]}},
+                        {8{sw_wr_en_4 & reg_ack & wr_be[2]}},
+                        {8{sw_wr_en_4 & reg_ack & wr_be[1]}},
+                        {8{sw_wr_en_4 & reg_ack & wr_be[0]}}}),		 
+		 .reg_din    (sw_reg_wdata[31:0] ),
 		 .hware_req  (hware_intr_req     ),
 		 
 		 //outputs
-		 .data_out    (reg_4[15:8]       )
+		 .data_out    (reg_4[31:0]       )
 	      );
 
 
 
-generic_register #(4,0  ) u_reg4_be2 (
-	      .we            ({4{sw_wr_en_4 & 
-                                 wr_be[2]   }}  ),		 
-	      .data_in       (sw_reg_wdata[19:16]),
-	      .reset_n       (h_reset_n           ),
-	      .clk           (mclk              ),
-	      
-	      //List of Outs
-	      .data_out      (reg_4[19:16]        )
-          );
-
-assign reg_4[31:20] = '0;
 
 
 //-----------------------------------------------------------------------
@@ -303,10 +387,11 @@
 //-----------------------------------------------------------------------
 assign  cfg_multi_func_sel = reg_5[31:0]; // to be used for read
 
+// bit[31] '1' - uart master enable on power up
 
-gen_32b_reg  #(32'h0) u_reg_5	(
+gen_32b_reg  #(32'h8000_0000) u_reg_5	(
 	      //List of Inputs
-	      .reset_n    (h_reset_n     ),
+	      .reset_n    (s_reset_n     ),
 	      .clk        (mclk          ),
 	      .cs         (sw_wr_en_5    ),
 	      .we         (wr_be         ),		 
@@ -316,98 +401,186 @@
 	      .data_out   (reg_5        )
 	      );
 
+
 //-----------------------------------------
-// Software Reg-0 : ASCI Representation of RISC = 32'h8273_8343
+// Reg-6: Clock Control
 // ----------------------------------------
-gen_32b_reg  #(32'h8273_8343) u_reg_6	(
+gen_32b_reg  #(32'h0) u_reg_6	(
 	      //List of Inputs
-	      .reset_n    (h_reset_n     ),
+	      .reset_n    (s_reset_n     ),
 	      .clk        (mclk          ),
-	      .cs         (sw_wr_en_6    ),
+	      .cs         (sw_wr_en_6   ),
 	      .we         (wr_be         ),		 
 	      .data_in    (sw_reg_wdata  ),
 	      
 	      //List of Outs
 	      .data_out   (reg_6       )
 	      );
+wire [7:0] cfg_rtc_clk_ctrl     = reg_6[7:0];
+wire [7:0] cfg_usb_clk_ctrl     = reg_6[15:8];
+
+
+//-------------------------------------------------
+// Strap control
+//---------------------------------------------
+strap_ctrl u_strap (
+	       .clk                 (mclk        ),
+	       .e_reset_n           (e_reset_n   ),  // external reset
+	       .p_reset_n           (p_reset_n   ),  // power-on reset
+	       .s_reset_n           (s_reset_n   ),  // soft reset
+
+           .pad_strap_in        (pad_strap_in), // strap from pad
+	      //List of Inputs
+	       .cs                  (sw_wr_en_13 ),
+	       .we                  (wr_be       ),		 
+	       .data_in             (sw_reg_wdata),
+	      
+	      //List of Outs
+           .strap_latch         (strap_latch ),
+	       .strap_sticky        (strap_sticky) 
+         );
+
+
+assign  reg_12 = {16'h0,strap_latch};
+assign  reg_13 = strap_sticky;
+assign  reg_14 = system_strap;
+
+//-----------------------------------------
+// MailBox Register
+// ----------------------------------------
+gen_32b_reg  #(32'h0) u_reg_15	(
+	      //List of Inputs
+	      .reset_n    (s_reset_n     ),
+	      .clk        (mclk          ),
+	      .cs         (sw_wr_en_15   ),
+	      .we         (wr_be         ),		 
+	      .data_in    (sw_reg_wdata  ),
+	      
+	      //List of Outs
+	      .data_out   (reg_15       )
+	      );
+
+
+
+//-----------------------------------------
+// Software Reg-0 : ASCI Representation of RISC = 32'h8273_8343
+// ----------------------------------------
+gen_32b_reg  #(CHIP_SIGNATURE) u_reg_16	(
+	      //List of Inputs
+	      .reset_n    (p_reset_n     ),
+	      .clk        (mclk          ),
+	      .cs         (sw_wr_en_16    ),
+	      .we         (wr_be         ),		 
+	      .data_in    (sw_reg_wdata  ),
+	      
+	      //List of Outs
+	      .data_out   (reg_16       )
+	      );
 
 //-----------------------------------------
 // Software Reg-1, Release date: <DAY><MONTH><YEAR>
 // ----------------------------------------
-gen_32b_reg  #(32'h1508_2022) u_reg_7	(
+gen_32b_reg  #(CHIP_RELEASE_DATE) u_reg_17	(
 	      //List of Inputs
-	      .reset_n    (h_reset_n     ),
+	      .reset_n    (p_reset_n     ),
 	      .clk        (mclk          ),
-	      .cs         (sw_wr_en_7    ),
+	      .cs         (sw_wr_en_17    ),
 	      .we         (wr_be         ),		 
 	      .data_in    (sw_reg_wdata  ),
 	      
 	      //List of Outs
-	      .data_out   (reg_7       )
+	      .data_out   (reg_17       )
 	      );
 
 //-----------------------------------------
-// Software Reg-2: Poject Revison 5.0 = 0005000
+// Software Reg-2: Poject Revison 5.1 = 0005200
 // ----------------------------------------
-gen_32b_reg  #(32'h0005_0000) u_reg_8	(
+gen_32b_reg  #(CHIP_REVISION) u_reg_18	(
 	      //List of Inputs
-	      .reset_n    (h_reset_n     ),
+	      .reset_n    (p_reset_n     ),
 	      .clk        (mclk          ),
-	      .cs         (sw_wr_en_8    ),
+	      .cs         (sw_wr_en_18    ),
 	      .we         (wr_be         ),		 
 	      .data_in    (sw_reg_wdata  ),
 	      
 	      //List of Outs
-	      .data_out   (reg_8       )
+	      .data_out   (reg_18       )
 	      );
 
 //-----------------------------------------
 // Software Reg-3
 // ----------------------------------------
-gen_32b_reg  #(32'h0) u_reg_9	(
+gen_32b_reg  #(32'h0) u_reg_19	(
 	      //List of Inputs
-	      .reset_n    (h_reset_n     ),
+	      .reset_n    (s_reset_n     ),
 	      .clk        (mclk          ),
-	      .cs         (sw_wr_en_9   ),
+	      .cs         (sw_wr_en_19   ),
 	      .we         (wr_be         ),		 
 	      .data_in    (sw_reg_wdata  ),
 	      
 	      //List of Outs
-	      .data_out   (reg_9       )
+	      .data_out   (reg_19       )
 	      );
 
 //-----------------------------------------
 // Software Reg-4
 // ----------------------------------------
-gen_32b_reg  #(32'h0) u_reg_10	(
+gen_32b_reg  #(32'h0) u_reg_20	(
 	      //List of Inputs
-	      .reset_n    (h_reset_n     ),
+	      .reset_n    (s_reset_n     ),
 	      .clk        (mclk          ),
-	      .cs         (sw_wr_en_10   ),
+	      .cs         (sw_wr_en_20   ),
 	      .we         (wr_be         ),		 
 	      .data_in    (sw_reg_wdata  ),
 	      
 	      //List of Outs
-	      .data_out   (reg_10       )
+	      .data_out   (reg_20       )
 	      );
 
 //-----------------------------------------
 // Software Reg-5
 // ----------------------------------------
-gen_32b_reg  #(32'h0) u_reg_11	(
+gen_32b_reg  #(32'h0) u_reg_21	(
 	      //List of Inputs
-	      .reset_n    (h_reset_n     ),
+	      .reset_n    (s_reset_n     ),
 	      .clk        (mclk          ),
-	      .cs         (sw_wr_en_11   ),
+	      .cs         (sw_wr_en_21    ),
 	      .we         (wr_be         ),		 
 	      .data_in    (sw_reg_wdata  ),
 	      
 	      //List of Outs
-	      .data_out   (reg_11       )
+	      .data_out   (reg_21       )
 	      );
 
+//-----------------------------------------
+// Software Reg-6: 
+// ----------------------------------------
+gen_32b_reg  #(32'h0) u_reg_22	(
+	      //List of Inputs
+	      .reset_n    (s_reset_n     ),
+	      .clk        (mclk          ),
+	      .cs         (sw_wr_en_22    ),
+	      .we         (wr_be         ),		 
+	      .data_in    (sw_reg_wdata  ),
+	      
+	      //List of Outs
+	      .data_out   (reg_22       )
+	      );
 
-
+//-----------------------------------------
+// Software Reg-7
+// ----------------------------------------
+gen_32b_reg  #(32'h0) u_reg_23	(
+	      //List of Inputs
+	      .reset_n    (s_reset_n     ),
+	      .clk        (mclk          ),
+	      .cs         (sw_wr_en_23   ),
+	      .we         (wr_be         ),		 
+	      .data_in    (sw_reg_wdata  ),
+	      
+	      //List of Outs
+	      .data_out   (reg_23       )
+	      );
 //-----------------------------------------------------------------------
 // Register Read Path Multiplexer instantiation
 //-----------------------------------------------------------------------
@@ -416,22 +589,104 @@
 begin 
   reg_out [31:0] = 32'h0;
 
-  case (sw_addr [3:0])
-    4'b0000 : reg_out [31:0] = reg_0  [31:0];     
-    4'b0001 : reg_out [31:0] = reg_1  [31:0];    
-    4'b0010 : reg_out [31:0] = reg_2  [31:0];     
-    4'b0011 : reg_out [31:0] = reg_3  [31:0];    
-    4'b0100 : reg_out [31:0] = reg_4  [31:0];    
-    4'b0101 : reg_out [31:0] = reg_5  [31:0];    
-    4'b0110 : reg_out [31:0] = reg_6  [31:0];    
-    4'b0111 : reg_out [31:0] = reg_7  [31:0];    
-    4'b1000 : reg_out [31:0] = reg_8  [31:0];    
-    4'b1001 : reg_out [31:0] = reg_9  [31:0];    
-    4'b1010 : reg_out [31:0] = reg_10 [31:0];   
-    4'b1011 : reg_out [31:0] = reg_11 [31:0];   
+  case (sw_addr [4:0])
+    5'b00000 : reg_out [31:0] = reg_0  ;     
+    5'b00001 : reg_out [31:0] = reg_1  ;    
+    5'b00010 : reg_out [31:0] = reg_2  ;     
+    5'b00011 : reg_out [31:0] = reg_3  ;    
+    5'b00100 : reg_out [31:0] = reg_4  ;    
+    5'b00101 : reg_out [31:0] = reg_5  ;    
+    5'b00110 : reg_out [31:0] = reg_6  ;    
+    5'b00111 : reg_out [31:0] = reg_7  ;    
+    5'b01000 : reg_out [31:0] = reg_8  ;    
+    5'b01001 : reg_out [31:0] = reg_9  ;    
+    5'b01010 : reg_out [31:0] = reg_10 ;   
+    5'b01011 : reg_out [31:0] = reg_11 ;   
+    5'b01100 : reg_out [31:0] = reg_12 ;   
+    5'b01101 : reg_out [31:0] = reg_13 ;   
+    5'b01110 : reg_out [31:0] = reg_14 ;   
+    5'b01111 : reg_out [31:0] = reg_15 ;   
+    5'b10000 : reg_out [31:0] = reg_16  ;     
+    5'b10001 : reg_out [31:0] = reg_17  ;    
+    5'b10010 : reg_out [31:0] = reg_18  ;     
+    5'b10011 : reg_out [31:0] = reg_19  ;    
+    5'b10100 : reg_out [31:0] = reg_20  ;    
+    5'b10101 : reg_out [31:0] = reg_21  ;    
+    5'b10110 : reg_out [31:0] = reg_22  ;    
+    5'b10111 : reg_out [31:0] = reg_23  ;    
+    5'b11000 : reg_out [31:0] = reg_24  ;    
+    5'b11001 : reg_out [31:0] = reg_25  ;    
+    5'b11010 : reg_out [31:0] = reg_26 ;   
+    5'b11011 : reg_out [31:0] = reg_27 ;   
+    5'b11100 : reg_out [31:0] = reg_28 ;   
+    5'b11101 : reg_out [31:0] = reg_29 ;   
+    5'b11110 : reg_out [31:0] = reg_30 ;   
+    5'b11111 : reg_out [31:0] = reg_31 ;   
     default  : reg_out [31:0] = 32'h0;
   endcase
 end
 
 
+//----------------------------------
+// Generate RTC Clock Generation
+//----------------------------------
+wire   rtc_clk_div;
+wire   rtc_ref_clk_int;
+wire   rtc_ref_clk;
+wire   rtc_clk_int;
+
+wire [1:0] cfg_rtc_clk_sel_sel   = cfg_rtc_clk_ctrl[7:6];
+wire       cfg_rtc_clk_div       = cfg_rtc_clk_ctrl[5];
+wire [4:0] cfg_rtc_clk_ratio     = cfg_rtc_clk_ctrl[4:0];
+
+assign rtc_ref_clk_int = (cfg_rtc_clk_sel_sel ==2'b00) ? user_clock1   :
+                         (cfg_rtc_clk_sel_sel ==2'b01) ? user_clock2   :	
+                         (cfg_rtc_clk_sel_sel ==2'b01) ? int_pll_clock : xtal_clk;	
+ctech_clk_buf u_rtc_ref_clkbuf (.A (rtc_ref_clk_int), . X(rtc_ref_clk));
+//assign rtc_clk_int = (cfg_rtc_clk_div)     ? rtc_clk_div : rtc_ref_clk;
+ctech_mux2x1 u_rtc_clk_sel (.A0 (rtc_ref_clk), .A1 (rtc_clk_div), .S  (cfg_rtc_clk_div), .X  (rtc_clk_int));
+
+
+ctech_clk_buf u_clkbuf_rtc (.A (rtc_clk_int), . X(rtc_clk));
+
+clk_ctl #(4) u_rtcclk (
+   // Outputs
+       .clk_o         (rtc_clk_div      ),
+   // Inputs
+       .mclk          (rtc_ref_clk      ),
+       .reset_n       (s_reset_n        ), 
+       .clk_div_ratio (cfg_rtc_clk_ratio)
+   );
+
+//----------------------------------
+// Generate USB Clock Generation
+//----------------------------------
+wire   usb_clk_div;
+wire   usb_ref_clk_int;
+wire   usb_ref_clk;
+wire   usb_clk_int;
+
+wire [1:0] cfg_usb_clk_sel_sel   = cfg_usb_clk_ctrl[7:6];
+wire       cfg_usb_clk_div       = cfg_usb_clk_ctrl[5];
+wire [4:0] cfg_usb_clk_ratio     = cfg_usb_clk_ctrl[4:0];
+
+assign usb_ref_clk_int = (cfg_usb_clk_sel_sel ==2'b00) ? user_clock1   :
+                         (cfg_usb_clk_sel_sel ==2'b01) ? user_clock2   :	
+                         (cfg_usb_clk_sel_sel ==2'b01) ? int_pll_clock : xtal_clk;	
+ctech_clk_buf u_usb_ref_clkbuf (.A (usb_ref_clk_int), . X(usb_ref_clk));
+//assign usb_clk_int = (cfg_usb_clk_div)     ? usb_clk_div : usb_ref_clk;
+ctech_mux2x1 u_usb_clk_sel (.A0 (usb_ref_clk), .A1 (usb_clk_div), .S  (cfg_usb_clk_div), .X  (usb_clk_int));
+
+
+ctech_clk_buf u_clkbuf_usb (.A (usb_clk_int), . X(usb_clk));
+
+clk_ctl #(4) u_usbclk (
+   // Outputs
+       .clk_o         (usb_clk_div      ),
+   // Inputs
+       .mclk          (usb_ref_clk      ),
+       .reset_n       (s_reset_n        ), 
+       .clk_div_ratio (cfg_usb_clk_ratio)
+   );
+
 endmodule                       
diff --git a/verilog/rtl/pinmux/src/glbl_rst_reg.sv b/verilog/rtl/pinmux/src/glbl_rst_reg.sv
new file mode 100644
index 0000000..cca7d0b
--- /dev/null
+++ b/verilog/rtl/pinmux/src/glbl_rst_reg.sv
@@ -0,0 +1,63 @@
+//////////////////////////////////////////////////////////////////////////////
+// SPDX-FileCopyrightText: 2021 , Dinesh Annayya                          
+// 
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+// SPDX-License-Identifier: Apache-2.0
+// SPDX-FileContributor: Created by Dinesh Annayya <dinesha@opencores.org>
+//
+//////////////////////////////////////////////////////////////////////
+
+/********************************************************************************
+  To handle reset removal on power up new logic is created,
+  One power up data_out will be reset value and one cycle later it will latch the rst_in.
+
+This will handle case when one of the bit of rst_n high, Still reset will be asserted in dataout 
+and one cycle latter it will get updated
+**********************************************************************************/
+
+module  glbl_rst_reg	(
+	      input logic        e_reset_n,
+	      input logic        s_reset_n,
+	      //List of Inputs
+          input logic [31:0] rst_in,
+	      input logic        cs,
+	      input logic [3:0]  we,		 
+	      input logic [31:0] data_in,
+	      input logic        clk,
+	      
+	      //List of Outs
+	      output logic [31:0]data_out
+	      );
+
+  parameter   RESET_DEFAULT    = 32'h0;  
+
+logic [31:0] data_out_l;
+
+always @ (posedge clk or negedge e_reset_n) begin 
+  if (e_reset_n == 1'b0) begin
+    data_out       <= RESET_DEFAULT ;
+    data_out_l     <= 'h0 ;
+  end else if (s_reset_n == 1'b0) begin
+    data_out       <= RESET_DEFAULT ;
+    data_out_l     <= rst_in ;
+  end else begin
+    data_out  <= data_out_l;
+    if(cs && we[0]) data_out_l[7:0]   <= data_in[7:0];
+    if(cs && we[1]) data_out_l[15:8]  <= data_in[15:8];
+    if(cs && we[2]) data_out_l[23:16] <= data_in[23:16];
+    if(cs && we[3]) data_out_l[31:24] <= data_in[31:24];
+  end
+end
+
+
+endmodule
diff --git a/verilog/rtl/pinmux/src/gpio_reg.sv b/verilog/rtl/pinmux/src/gpio_reg.sv
index be61923..10b90bd 100644
--- a/verilog/rtl/pinmux/src/gpio_reg.sv
+++ b/verilog/rtl/pinmux/src/gpio_reg.sv
@@ -58,13 +58,13 @@
                        input  logic  [31:0]  gpio_int_event           ,
                        output logic  [31:0]  cfg_gpio_out_data        ,// GPIO statuc O/P data from config reg
                        output logic  [31:0]  cfg_gpio_dir_sel         ,// decides on GPIO pin is I/P or O/P at pad level, 0 -> Input, 1 -> Output
-                       output logic  [31:0]  cfg_gpio_out_type        ,// GPIO Type, Unused
+                       output logic  [31:0]  cfg_gpio_out_type        ,// GPIO Type, 1 - WS_281X port
                        output logic  [31:0]  cfg_multi_func_sel       ,// GPIO Multi function type
                        output logic  [31:0]  cfg_gpio_posedge_int_sel ,// select posedge interrupt
                        output logic  [31:0]  cfg_gpio_negedge_int_sel ,// select negedge interrupt
                        output logic  [31:00] cfg_gpio_data_in         ,
 
-                       output logic          gpio_intr          
+                       output logic  [31:0]  gpio_intr          
 
 
                 ); 
@@ -253,7 +253,7 @@
 //-----------------------------------------------------------------------
 wire [31:0]  cfg_gpio_int_mask = reg_6[31:0]; // to be used for read
 
-assign gpio_intr  = ( | (reg_4 & reg_6) ); // interrupt pin to the RISC
+assign gpio_intr  = reg_4 & reg_6; // interrupt pin to the RISC
 
 
 //  Register-11
diff --git a/verilog/rtl/pinmux/src/gpio_top.sv b/verilog/rtl/pinmux/src/gpio_top.sv
index 0a7fd02..097623f 100644
--- a/verilog/rtl/pinmux/src/gpio_top.sv
+++ b/verilog/rtl/pinmux/src/gpio_top.sv
@@ -52,19 +52,19 @@
                        // Outputs
                        output logic [31:0]   reg_rdata,
                        output logic          reg_ack,
-                   
+
+                       output logic  [31:0]  cfg_gpio_out_type ,// GPIO Type, 1 - ws281x
                        output  logic [31:0]  cfg_gpio_dir_sel, 
                        input   logic [31:0]  pad_gpio_in,
                        output  logic [31:0]  pad_gpio_out,
 
-                       output  logic         gpio_intr
+                       output  logic [31:0]  gpio_intr
 
                 ); 
 
 
 logic  [31:0]  gpio_prev_indata         ;// previously captured GPIO I/P pins data
 logic  [31:0]  cfg_gpio_out_data        ;// GPIO statuc O/P data from config reg
-logic  [31:0]  cfg_gpio_out_type        ;// GPIO Type, Unused
 logic  [31:0]  cfg_multi_func_sel       ;// GPIO Multi function type
 logic  [31:0]  cfg_gpio_posedge_int_sel ;// select posedge interrupt
 logic  [31:0]  cfg_gpio_negedge_int_sel ;// select negedge interrupt
diff --git a/verilog/rtl/pinmux/src/pinmux.sv b/verilog/rtl/pinmux/src/pinmux.sv
index 54c0ef9..652305d 100755
--- a/verilog/rtl/pinmux/src/pinmux.sv
+++ b/verilog/rtl/pinmux/src/pinmux.sv
@@ -34,65 +34,79 @@
 ////  Revision :                                                  ////
 ////    0.1 - 16th Aug 2022, Dinesh A                             ////
 ////          Seperated the pinmux from pinmux_top module         ////
+////    0.2 - 21th Aug 2022, Dinesh A                             ////
+////          uart_master disable option added                    ////
+////    0.3 - 28th Aug 2022, Dinesh A                             ////
+////          Due to caravel io[4:0] reserved on power up, we have////
+////          re-arrange the arduino pins from 5 onward           ////
 //////////////////////////////////////////////////////////////////////
 /************************************************
-* Pin Mapping    ATMGE CONFIG
-*   ATMEGA328                        caravel Pin Mapping
-*   Pin-1        PC6/RESET*          digital_io[0]
-*   Pin-2        PD0/RXD[0]          digital_io[1]
-*   Pin-3        PD1/TXD[0]          digital_io[2]
-*   Pin-4        PD2/RXD[1]/INT0     digital_io[3]
-*   Pin-5        PD3/INT1/OC2B(PWM0) digital_io[4]
-*   Pin-6        PD4/TXD[1]          digital_io[5]
-*   Pin-7        VCC                  -
-*   Pin-8        GND                  -
-*   Pin-9        PB6/XTAL1/TOSC1           digital_io[6]
-*   Pin-10       PB7/XTAL2/TOSC2           digital_io[7]
-*   Pin-11       PD5/SS[3]/OC0B(PWM1)/T1   digital_io[8]
-*   Pin-12       PD6/SS[2]/OC0A(PWM2)/AIN0 digital_io[9]/analog_io[2]
-*   Pin-13       PD7/A1N1                  digital_io[10]/analog_io[3]
-*   Pin-14       PB0/CLKO/ICP1             digital_io[11]
-*   Pin-15       PB1/SS[1]OC1A(PWM3)       digital_io[12]
-*   Pin-16       PB2/SS[0]/OC1B(PWM4)      digital_io[13]
-*   Pin-17       PB3/MOSI/OC2A(PWM5)       digital_io[14]
-*   Pin-18       PB4/MISO                  digital_io[15]
-*   Pin-19       PB5/SCK                   digital_io[16]
-*   Pin-20       AVCC                -
-*   Pin-21       AREF                      analog_io[10]
-*   Pin-22       GND                 -
-*   Pin-23       PC0/ADC0            digital_io[18]/analog_io[11]
-*   Pin-24       PC1/ADC1            digital_io[19]/analog_io[12]
-*   Pin-25       PC2/ADC2            digital_io[20]/analog_io[13]
-*   Pin-26       PC3/ADC3            digital_io[21]/analog_io[14]
-*   Pin-27       PC4/ADC4/SDA        digital_io[22]/analog_io[15]
-*   Pin-28       PC5/ADC5/SCL        digital_io[23]/analog_io[16]
+* Pin Mapping    Arduino              ATMGE CONFIG
+*   ATMEGA328     Port                                                      caravel Pin Mapping
+*   Pin-1         22            PC6/WS[0]/RESET*                            digital_io[5]
+*   Pin-2         0             PD0/WS[0]/RXD[0]                            digital_io[6]
+*   Pin-3         1             PD1/WS[0]/TXD[0]                            digital_io[7]
+*   Pin-4         2             PD2/WS[0]/RXD[1]/INT0                       digital_io[8]
+*   Pin-5         3             PD3/WS[1]INT1/OC2B(PWM0)                    digital_io[9]
+*   Pin-6         4             PD4/WS[1]TXD[1]                             digital_io[10]
+*   Pin-7                       VCC                  -
+*   Pin-8                       GND                  -
+*   Pin-9         20            PB6/WS[1]/XTAL1/TOSC1                       digital_io[11]
+*   Pin-10        21            PB7/WS[1]/XTAL2/TOSC2                       digital_io[12]
+*   Pin-11        5             PD5/WS[2]/SS[3]/OC0B(PWM1)/T1   strap[0]    digital_io[13]
+*   Pin-12        6             PD6/WS[2]/SS[2]/OC0A(PWM2)/AIN0 strap[1]    digital_io[14]/analog_io[2]
+*   Pin-13        7             PD7/WS[2]/A1N1                  strap[2]    digital_io[15]/analog_io[3]
+*   Pin-14        8             PB0/WS[2]/CLKO/ICP1             strap[3]    digital_io[16]
+*   Pin-15        9             PB1/WS[3]/SS[1]OC1A(PWM3)       strap[4]    digital_io[17]
+*   Pin-16        10            PB2/WS[3]/SS[0]/OC1B(PWM4)      strap[5]    digital_io[18]
+*   Pin-17        11            PB3/WS[3]/MOSI/OC2A(PWM5)       strap[6]    digital_io[19]
+*   Pin-18        12            PB4/WS[3]/MISO                  strap[7]    digital_io[20]
+*   Pin-19        13            PB5/SCK                                     digital_io[21]
+*   Pin-20                      AVCC                -
+*   Pin-21                      AREF                                        analog_io[10]
+*   Pin-22                      GND                 -
+*   Pin-23        14            PC0/uartm_rxd/ADC0                          digital_io[22]/analog_io[11]
+*   Pin-24        15            PC1/uartm_txd/ADC1                          digital_io[23]/analog_io[12]
+*   Pin-25        16            PC2/usb_dp/ADC2                             digital_io[24]/analog_io[13]
+*   Pin-26        17            PC3/usb_dn/ADC3                             digital_io[25]/analog_io[14]
+*   Pin-27        18            PC4/ADC4/SDA                                digital_io[26]/analog_io[15]
+*   Pin-28        19            PC5/ADC5/SCL                                digital_io[27]/analog_io[16]
 *
 *  Additional Pad used for Externam ROM/RAM
-*                sflash_sck          digital_io[24]
-*                sflash_ss[0]        digital_io[25]
-*                sflash_ss[1]        digital_io[26]
-*                sflash_ss[2]        digital_io[27]
-*                sflash_ss[3]        digital_io[28]
-*                sflash_io0          digital_io[29]
-*                sflash_io1          digital_io[30]
-*                sflash_io2          digital_io[31]
-*                sflash_io3          digital_io[32]
-*                dbg_clk_mon         digital_io[33]
-*                uartm_rxd           digital_io[34]
-*                uartm_txd           digital_io[35]
-*                usb_dp              digital_io[36]
-*                usb_dn              digital_io[37]
+*                               sflash_sck                                 digital_io[28]
+*                               sflash_ss[0]                  strap[8]     digital_io[29]
+*                               sflash_ss[1]                  strap[9]     digital_io[30]
+*                               sflash_ss[2]                  strap[10]    digital_io[31]
+*                               sflash_ss[3]                  strap[11]    digital_io[32]
+*                               sflash_io0                    strap[12]    digital_io[33]
+*                               sflash_io1                    strap[13]    digital_io[34]
+*                               sflash_io2                    strap[14]    digital_io[35]
+*                               sflash_io3                    strap[15]    digital_io[36]
+*                               dbg_clk_mon                                digital_io[37]
+*   These port are not available at power up
+*                               PA0                                        digital_io[0]
+*                               PA1                                        digital_io[1]
+*                               PA2                                        digital_io[2]
+*                               PA3                                        digital_io[3]
+*                               PA4                                        digital_io[4]
 ****************************************************************
 * Pin-1 RESET is not supported as there is no suppport for fuse config
+
+
 **************/
 
 module pinmux (
+               input logic             cfg_strap_pad_ctrl      , // 1 - Keep the Pad in input direction
+               output logic [15:0]     pad_strap_in            , // Strap value
                // Digital IO
                output logic [37:0]     digital_io_out          ,
                output logic [37:0]     digital_io_oen          ,
                input  logic [37:0]     digital_io_in           ,
 
+               output logic            xtal_clk                ,
+
                // Config
+               input logic  [31:0]    cfg_gpio_out_type        ,// GPIO Type, 1 - WS_281X port
                input logic  [31:0]    cfg_gpio_dir_sel         ,
                input logic  [31:0]    cfg_multi_func_sel       ,
 
@@ -151,6 +165,9 @@
                output  logic            uartm_rxd ,
                input logic              uartm_txd ,       
 
+               // WS_281X TXD Port
+               input logic [3:0]        ws_txd,
+
 		       input   logic           dbg_clk_mon
 
    ); 
@@ -167,6 +184,13 @@
 wire [7:0]    port_c_out;     // PORT C Data Out
 wire [7:0]    port_d_out;     // PORT D Data Out
 
+//--------------------------------------------------
+// Strap Pin Mapping
+//--------------------------------------------------
+assign pad_strap_in = {digital_io_in[36:29],digital_io_in[20:13] };
+
+assign xtal_clk  = digital_io_in[11];
+
 // GPIO to PORT Mapping
 assign      pad_gpio_in[7:0]     = port_a_in;
 assign      pad_gpio_in[15:8]    = port_b_in;
@@ -185,17 +209,23 @@
 wire        cfg_spim_enb         = cfg_multi_func_sel[10];
 wire [3:0]  cfg_spim_cs_enb      = cfg_multi_func_sel[14:11];
 wire        cfg_i2cm_enb         = cfg_multi_func_sel[15];
+wire        cfg_usb_enb          = cfg_multi_func_sel[16];
+wire        cfg_muart_enb        = cfg_multi_func_sel[31]; // 1 - uart master enable, 
 
 wire [7:0]  cfg_port_a_dir_sel   = cfg_gpio_dir_sel[7:0];
 wire [7:0]  cfg_port_b_dir_sel   = cfg_gpio_dir_sel[15:8];
 wire [7:0]  cfg_port_c_dir_sel   = cfg_gpio_dir_sel[23:16];
 wire [7:0]  cfg_port_d_dir_sel   = cfg_gpio_dir_sel[31:24];
 
+wire [7:0]  cfg_port_a_port_type   = cfg_gpio_out_type[7:0];
+wire [7:0]  cfg_port_b_port_type   = cfg_gpio_out_type[15:8];
+wire [7:0]  cfg_port_c_port_type   = cfg_gpio_out_type[23:16];
+wire [7:0]  cfg_port_d_port_type   = cfg_gpio_out_type[31:24];
 
 // This logic to create spi slave interface
 logic        pin_resetn,spis_boot;
 
-// On Reset internal SPI Master is disabled, If pin_reset = 0, then we are in
+// On Reset internal SPI Master is disabled, If cfg_spim_enb = 0, then we are in
 // SPIS Boot Mode
 assign      spis_boot = (cfg_spim_enb ) ? 1'b0: !pin_resetn; 
 assign      spis_ssn  = (spis_boot    ) ? pin_resetn : 1'b1;
@@ -212,329 +242,389 @@
      i2cm_data_i= 'h0;
      i2cm_clk_i = 'h0;
 
-     //Pin-1        PC6/RESET*          digital_io[0]
-     port_c_in[6] = digital_io_in[0];
-     pin_resetn   = digital_io_in[0];
+     //Pin-1        PC6/RESET*          digital_io[5]
+     port_c_in[6] = digital_io_in[5];
+     pin_resetn   = digital_io_in[5];
 
-     //Pin-2        PD0/RXD[0]             digital_io[1]
-     port_d_in[0] = digital_io_in[1];
-     if(cfg_uart_enb[0])  uart_rxd[0]   = digital_io_in[1];
+     //Pin-2        PD0/RXD[0]             digital_io[6]
+     port_d_in[0] = digital_io_in[6];
+     if(cfg_uart_enb[0])  uart_rxd[0]   = digital_io_in[6];
   
-     //Pin-3        PD1/TXD[0]             digital_io[2]
-     port_d_in[1] = digital_io_in[2];
+     //Pin-3        PD1/TXD[0]             digital_io[7]
+     port_d_in[1] = digital_io_in[7];
 
 
-     //Pin-4        PD2/RXD[1]/INT0       digital_io[3]
-     port_d_in[2] = digital_io_in[3];
-     if(cfg_uart_enb[1])     uart_rxd[1]    = digital_io_in[3];
-     else if(cfg_int_enb[0]) ext_intr_in[0] = digital_io_in[3];
+     //Pin-4        PD2/RXD[1]/INT0      digital_io[8]
+     port_d_in[2] = digital_io_in[8];
+     if(cfg_uart_enb[1])     uart_rxd[1]    = digital_io_in[8];
+     else if(cfg_int_enb[0]) ext_intr_in[0] = digital_io_in[8];
 
-     //Pin-5        PD3/INT1/OC2B(PWM0)  digital_io[4]
-     port_d_in[3] = digital_io_in[4];
-     if(cfg_int_enb[1]) ext_intr_in[1] = digital_io_in[4];
+     //Pin-5        PD3/INT1/OC2B(PWM0)  digital_io[9]
+     port_d_in[3] = digital_io_in[9];
+     if(cfg_int_enb[1]) ext_intr_in[1] = digital_io_in[9];
 
-     //Pin-6        PD4/TXD[1]          digital_io[5]
-     port_d_in[4] = digital_io_in[5];
+     //Pin-6        PD4/TXD[1]          digital_io[10]
+     port_d_in[4] = digital_io_in[10];
 
-     //Pin-9        PB6/XTAL1/TOSC1     digital_io[6]
-     port_b_in[6] = digital_io_in[6];
+     //Pin-9        PB6/XTAL1/TOSC1     digital_io[11]
+     port_b_in[6] = digital_io_in[11];
 
-     // Pin-10       PB7/XTAL2/TOSC2     digital_io[7]
-     port_b_in[7] = digital_io_in[7];
+     // Pin-10       PB7/XTAL2/TOSC2     digital_io[12]
+     port_b_in[7] = digital_io_in[12];
 
-     //Pin-11       PD5/OC0B(PWM1)/T1   digital_io[8]
-     port_d_in[5] = digital_io_in[8];
+     //Pin-11       PD5/OC0B(PWM1)/T1   digital_io[13]
+     port_d_in[5] = digital_io_in[13];
 
-     //Pin-12       PD6/OC0A(PWM2)/AIN0 digital_io[9] /analog_io[2]
-     port_d_in[6] = digital_io_in[9];
+     //Pin-12       PD6/OC0A(PWM2)/AIN0 digital_io[14] /analog_io[2]
+     port_d_in[6] = digital_io_in[14];
 
-     //Pin-13       PD7/A1N1            digital_io[10]/analog_io[3]
-     port_d_in[7] = digital_io_in[10];
+     //Pin-13       PD7/A1N1            digital_io[15]/analog_io[3]
+     port_d_in[7] = digital_io_in[15];
      
-     //Pin-14       PB0/CLKO/ICP1       digital_io[11]
-     port_b_in[0] =  digital_io_in[11];
+     //Pin-14       PB0/CLKO/ICP1       digital_io[16]
+     port_b_in[0] =  digital_io_in[16];
 
-     //Pin-15       PB1/OC1A(PWM3)      digital_io[12]
-     port_b_in[1] = digital_io_in[12];
+     //Pin-15       PB1/OC1A(PWM3)      digital_io[17]
+     port_b_in[1] = digital_io_in[17];
 
-     //Pin-16       PB2/SS/OC1B(PWM4)   digital_io[13]
-     port_b_in[2] = digital_io_in[13];
+     //Pin-16       PB2/SS/OC1B(PWM4)   digital_io[18]
+     port_b_in[2] = digital_io_in[18];
 
-     //Pin-17       PB3/MOSI/OC2A(PWM5) digital_io[14]
-     port_b_in[3] = digital_io_in[14];
-     if(cfg_spim_enb) spim_mosi = digital_io_in[14];        // SPIM MOSI (Input) = SPIS MISO (Output)
+     //Pin-17       PB3/MOSI/OC2A(PWM5) digital_io[19]
+     port_b_in[3] = digital_io_in[19];
+     if(cfg_spim_enb) spim_mosi = digital_io_in[19];        // SPIM MOSI (Input) = SPIS MISO (Output)
 
-     //Pin-18       PB4/MISO            digital_io[15]
-     port_b_in[4] = digital_io_in[15];
-     spis_mosi    = (spis_boot) ? digital_io_in[15] : 1'b0;  // SPIM MISO (Output) = SPIS MOSI (Input)
+     //Pin-18       PB4/MISO            digital_io[20]
+     port_b_in[4] = digital_io_in[20];
+     spis_mosi    = (spis_boot) ? digital_io_in[20] : 1'b0;  // SPIM MISO (Output) = SPIS MOSI (Input)
 
-     //Pin-19       PB5/SCK             digital_io[16]
-     port_b_in[5]= digital_io_in[16];
-     spis_sck    = (spis_boot) ? digital_io_in[16] : 1'b1;   // SPIM SCK (Output) = SPIS SCK (Input)
+     //Pin-19       PB5/SCK             digital_io[21]
+     port_b_in[5]= digital_io_in[21];
+     spis_sck    = (spis_boot) ? digital_io_in[21] : 1'b1;   // SPIM SCK (Output) = SPIS SCK (Input)
      
-     //Pin-23       PC0/ADC0            digital_io[18]/analog_io[11]
-     port_c_in[0] = digital_io_in[18];
+     //Pin-23       PC0/ADC0            digital_io[22]/uartm_rxd/analog_io[11]
+     uartm_rxd    = (cfg_muart_enb) ?  digital_io_in[22]: 1'b1;
+     port_c_in[0] = digital_io_in[22];
 
-     //Pin-24       PC1/ADC1            digital_io[19]/analog_io[12]
-     port_c_in[1] = digital_io_in[19];
+     //Pin-24       PC1/ADC1            digital_io[23]/uartm_txd/analog_io[12]
+     port_c_in[1] = digital_io_in[23];
 
-     //Pin-25       PC2/ADC2            digital_io[20]/analog_io[13]
-     port_c_in[2] = digital_io_in[20];
+     //Pin-25       PC2/ADC2            digital_io[24]/usb_dp/analog_io[13]
+     usb_dp_i     = (cfg_usb_enb) ? digital_io_in[24] : 1'b1;
+     port_c_in[2] = digital_io_in[24];
 
-     //Pin-26       PC3/ADC3            digital_io[21]/analog_io[14]
-     port_c_in[3] = digital_io_in[21];
+     //Pin-26       PC3/ADC3            digital_io[25]/usb_dn/analog_io[14]
+     usb_dn_i     = (cfg_usb_enb) ? digital_io_in[25] : 1'b1;
+     port_c_in[3] = digital_io_in[25];
 
-     //Pin-27       PC4/ADC4/SDA        digital_io[22]/analog_io[15]
-     port_c_in[4] = digital_io_in[22];
-     if(cfg_i2cm_enb)  i2cm_data_i = digital_io_in[22];
+     //Pin-27       PC4/ADC4/SDA        digital_io[26]/analog_io[15]
+     port_c_in[4] = digital_io_in[26];
+     if(cfg_i2cm_enb)  i2cm_data_i = digital_io_in[26];
 
-     //Pin-28       PC5/ADC5/SCL        digital_io[23]/analog_io[16]
-     port_c_in[5] = digital_io_in[23];
-     if(cfg_i2cm_enb)  i2cm_clk_i = digital_io_in[23];
+     //Pin-28       PC5/ADC5/SCL        digital_io[27]/analog_io[16]
+     port_c_in[5] = digital_io_in[27];
+     if(cfg_i2cm_enb)  i2cm_clk_i = digital_io_in[27];
 
-     sflash_di[0] = digital_io_in[29];
-     sflash_di[1] = digital_io_in[30];
-     sflash_di[2] = digital_io_in[31];
-     sflash_di[3] = digital_io_in[32];
+     sflash_di[0] = digital_io_in[33];
+     sflash_di[1] = digital_io_in[34];
+     sflash_di[2] = digital_io_in[35];
+     sflash_di[3] = digital_io_in[36];
+     
+     port_a_in[0] = digital_io_in[0];
+     port_a_in[1] = digital_io_in[1];
+     port_a_in[2] = digital_io_in[2];
+     port_a_in[3] = digital_io_in[3];
+     port_a_in[4] = digital_io_in[4];
 
-     // UAR MASTER I/F
-     uartm_rxd    = digital_io_in[34];
-
-     usb_dp_i    = digital_io_in[36];
-     usb_dn_i    = digital_io_in[37];
 end
 
 // dataout selection
 always_comb begin
      digital_io_out = 'h0;
-     //Pin-1        PC6/RESET*          digital_io[0]
-     if(cfg_port_c_dir_sel[6])       digital_io_out[0]   = port_c_out[6];
+     //Pin-1        PC6/WS[0]/RESET*       digital_io[5]
+     if(cfg_port_c_port_type[6])       digital_io_out[5]   = ws_txd[0];
+     else if(cfg_port_c_dir_sel[6])    digital_io_out[5]   = port_c_out[6];
 
-     //Pin-2        PD0/RXD[0]       digital_io[1]
-     if(cfg_port_d_dir_sel[0])       digital_io_out[1]   = port_d_out[0];
+     //Pin-2        PD0/WS[0]/RXD[0]       digital_io[6]
+     if(cfg_port_d_port_type[0])       digital_io_out[6]   = ws_txd[0];
+     else if(cfg_port_d_dir_sel[0])    digital_io_out[6]   = port_d_out[0];
   
-     //Pin-3        PD1/TXD[0]             digital_io[2]
-     if     (cfg_uart_enb[0])        digital_io_out[2]   = uart_txd[0];
-     else if(cfg_port_d_dir_sel[1])  digital_io_out[2]   = port_d_out[1];
+     //Pin-3        PD1/WS[0]/TXD[0]       digital_io[7]
+     if     (cfg_uart_enb[0])         digital_io_out[7]  = uart_txd[0];
+     else if(cfg_port_d_port_type[1]) digital_io_out[7]  = ws_txd[0];
+     else if(cfg_port_d_dir_sel[1])   digital_io_out[7]  = port_d_out[1];
 
 
-     //Pin-4        PD2/RXD[1]/INT0  digital_io[3]
-     if(cfg_port_d_dir_sel[2])       digital_io_out[3]   = port_d_out[2];
+     //Pin-4        PD2/WS[0]/RXD[1]/INT0  digital_io[8]
+     if(cfg_port_d_port_type[2])      digital_io_out[8]   = ws_txd[0];
+     else if(cfg_port_d_dir_sel[2])   digital_io_out[8]   = port_d_out[2];
 
-     //Pin-5        PD3/INT1/OC2B(PWM0)  digital_io[4]
-     if(cfg_pwm_enb[0])              digital_io_out[4]   = pwm_wfm[0];
-     else if(cfg_port_d_dir_sel[3])  digital_io_out[4]   = port_d_out[3];
+     //Pin-5        PD3/WS[1]INT1/OC2B(PWM0)  digital_io[9]
+     if(cfg_pwm_enb[0])              digital_io_out[9]   = pwm_wfm[0];
+     else if(cfg_port_d_port_type[3])digital_io_out[9]   = ws_txd[1];
+     else if(cfg_port_d_dir_sel[3])  digital_io_out[9]   = port_d_out[3];
 
-     //Pin-6        PD4/TXD[1]                 digital_io[5]
-     if   (cfg_uart_enb[1])               digital_io_out[5]   = uart_txd[1];
-     else if(cfg_port_d_dir_sel[4])       digital_io_out[5]   = port_d_out[4];
+     //Pin-6        PD4/WS[1]/TXD[1]         digital_io[10]
+     if   (cfg_uart_enb[1])               digital_io_out[10]   = uart_txd[1];
+     else if(cfg_port_d_port_type[4])     digital_io_out[10]   = ws_txd[1];
+     else if(cfg_port_d_dir_sel[4])       digital_io_out[10]   = port_d_out[4];
 
-     //Pin-9        PB6/XTAL1/TOSC1     digital_io[6]
-     if(cfg_port_b_dir_sel[6])       digital_io_out[6]   = port_b_out[6];
+     //Pin-9        PB6/XTAL1/WS[1]/TOSC1     digital_io[11]
+     if(cfg_port_b_port_type[6])       digital_io_out[11]   = ws_txd[1];
+     else if(cfg_port_b_dir_sel[6])    digital_io_out[11]   = port_b_out[6];
 
 
-     // Pin-10       PB7/XTAL2/TOSC2     digital_io[7]
-     if(cfg_port_b_dir_sel[7])       digital_io_out[7]   = port_b_out[7];
+     // Pin-10       PB7/XTAL2/WS[1]/TOSC2     digital_io[12]
+     if(cfg_port_b_port_type[7])       digital_io_out[12]   = ws_txd[1];
+     else if(cfg_port_b_dir_sel[7])    digital_io_out[12]   = port_b_out[7];
 
-     //Pin-11       PD5/SS[3]/OC0B(PWM1)/T1   digital_io[8]
-     if(cfg_pwm_enb[1])              digital_io_out[8]   = pwm_wfm[1];
-     else if(cfg_spim_cs_enb[3])     digital_io_out[8]  = spim_ssn[3];
-     else if(cfg_port_d_dir_sel[5])  digital_io_out[8]   = port_d_out[5];
+     //Pin-11       PD5/SS[3]/WS[2]/OC0B(PWM1)/T1   digital_io[13]
+     if(cfg_pwm_enb[1])              digital_io_out[13]   = pwm_wfm[1];
+     else if(cfg_spim_cs_enb[3])     digital_io_out[13]  = spim_ssn[3];
+     else if(cfg_port_d_port_type[5])digital_io_out[13]   = ws_txd[2];
+     else if(cfg_port_d_dir_sel[5])  digital_io_out[13]   = port_d_out[5];
 
-     //Pin-12       PD6/SS[2]/OC0A(PWM2)/AIN0 digital_io[9] /analog_io[2]
-     if(cfg_pwm_enb[2])              digital_io_out[9]   = pwm_wfm[2];
-     else if(cfg_spim_cs_enb[2])     digital_io_out[9]   = spim_ssn[2];
-     else if(cfg_port_d_dir_sel[6])  digital_io_out[9]   = port_d_out[6];
+     //Pin-12       PD6/SS[2]/WS[2]/OC0A(PWM2)/AIN0 digital_io[14] /analog_io[2]
+     if(cfg_pwm_enb[2])              digital_io_out[14]   = pwm_wfm[2];
+     else if(cfg_spim_cs_enb[2])     digital_io_out[14]   = spim_ssn[2];
+     else if(cfg_port_d_port_type[6])digital_io_out[14]   = ws_txd[2];
+     else if(cfg_port_d_dir_sel[6])  digital_io_out[14]   = port_d_out[6];
 
 
-     //Pin-13       PD7/A1N1            digital_io[10]/analog_io[3]
-     if(cfg_port_d_dir_sel[7])       digital_io_out[10]  = port_d_out[7];
+     //Pin-13       PD7/A1N1/WS[2]            digital_io[15]/analog_io[3]
+     if(cfg_port_d_port_type[7])     digital_io_out[15]  = ws_txd[2];
+     else if(cfg_port_d_dir_sel[7])  digital_io_out[15]  = port_d_out[7];
      
-     //Pin-14       PB0/CLKO/ICP1       digital_io[11]
-     if(cfg_port_b_dir_sel[0])       digital_io_out[11]  = port_b_out[0];
+     //Pin-14       PB0/CLKO/WS[2]/ICP1       digital_io[16]
+     if(cfg_port_b_port_type[0])     digital_io_out[16]  = ws_txd[2];
+     else if(cfg_port_b_dir_sel[0])  digital_io_out[16]  = port_b_out[0];
 
-     //Pin-15       PB1/SS[1]/OC1A(PWM3)      digital_io[12]
-     if(cfg_pwm_enb[3])              digital_io_out[12]  = pwm_wfm[3];
-     else if(cfg_spim_cs_enb[1])     digital_io_out[12]  = spim_ssn[1];
-     else if(cfg_port_b_dir_sel[1])  digital_io_out[12]  = port_b_out[1];
+     //Pin-15       PB1/SS[1]/WS[3]/OC1A(PWM3)      digital_io[17]
+     if(cfg_pwm_enb[3])              digital_io_out[17]    = pwm_wfm[3];
+     else if(cfg_spim_cs_enb[1])     digital_io_out[17]    = spim_ssn[1];
+     else if(cfg_port_b_port_type[1])digital_io_out[17]  = ws_txd[3];
+     else if(cfg_port_b_dir_sel[1])  digital_io_out[17]    = port_b_out[1];
 
-     //Pin-16       PB2/SS[0]/OC1B(PWM4)   digital_io[13]
-     if(cfg_pwm_enb[4])              digital_io_out[13]  = pwm_wfm[4];
-     else if(cfg_spim_cs_enb[0])     digital_io_out[13]  = spim_ssn[0];
-     else if(cfg_port_b_dir_sel[2])  digital_io_out[13]  = port_b_out[2];
+     //Pin-16       PB2/SS[0]/WS[3]/OC1B(PWM4)   digital_io[18]
+     if(cfg_pwm_enb[4])              digital_io_out[18]  = pwm_wfm[4];
+     else if(cfg_spim_cs_enb[0])     digital_io_out[18]  = spim_ssn[0];
+     else if(cfg_port_b_port_type[2])digital_io_out[18]  = ws_txd[3];
+     else if(cfg_port_b_dir_sel[2])  digital_io_out[18]  = port_b_out[2];
 
-     //Pin-17       PB3/MOSI/OC2A(PWM5) digital_io[14]
-     if(cfg_pwm_enb[5])              digital_io_out[14]  = pwm_wfm[5];
-     else if(cfg_port_b_dir_sel[3])  digital_io_out[14]  = port_b_out[3];
-     else if(spis_boot)              digital_io_out[14]  = spis_miso;   // SPIM MOSI (Input) = SPIS MISO (Output)
+     //Pin-17       PB3/MOSI/WS[3]/OC2A(PWM5) digital_io[19]
+     if(cfg_pwm_enb[5])              digital_io_out[19]  = pwm_wfm[5];
+     else if(cfg_port_b_port_type[3])  digital_io_out[19]  = ws_txd[3];
+     else if(cfg_port_b_dir_sel[3])  digital_io_out[19]  = port_b_out[3];
+     else if(spis_boot)              digital_io_out[19]  = spis_miso;   // SPIM MOSI (Input) = SPIS MISO (Output)
 
-     //Pin-18       PB4/MISO            digital_io[15]
-     if(cfg_spim_enb)                digital_io_out[15]  = spim_miso;   // SPIM MISO (Output) = SPIS MOSI (Input)
-     else if(cfg_port_b_dir_sel[4])  digital_io_out[15]  = port_b_out[4];
+     //Pin-18       PB4/WS[3]/MISO            digital_io[20]
+     if(cfg_spim_enb)                digital_io_out[20]  = spim_miso;   // SPIM MISO (Output) = SPIS MOSI (Input)
+     else if(cfg_port_b_port_type[4])digital_io_out[20]  = ws_txd[3];
+     else if(cfg_port_b_dir_sel[4])  digital_io_out[20]  = port_b_out[4];
 
-     //Pin-19       PB5/SCK             digital_io[16]
-     if(cfg_spim_enb)             digital_io_out[16]  = spim_sck;      // SPIM SCK (Output) = SPIS SCK (Input)
-     else if(cfg_port_b_dir_sel[5])  digital_io_out[16]  = port_b_out[5];
+     //Pin-19       PB5/SCK             digital_io[21]
+     if(cfg_spim_enb)             digital_io_out[21]  = spim_sck;      // SPIM SCK (Output) = SPIS SCK (Input)
+     else if(cfg_port_b_dir_sel[5])  digital_io_out[21]  = port_b_out[5];
      
-     //Pin-23       PC0/ADC0            digital_io[18]/analog_io[11]
-     if(cfg_port_c_dir_sel[0])       digital_io_out[18]  = port_c_out[0];
+     //Pin-23       PC0/MRXD/ADC0    digital_io[22]/analog_io[11]
+     if(cfg_muart_enb)               digital_io_out[22]  = 1'b1;
+     else if(cfg_port_c_dir_sel[0])  digital_io_out[22]  = port_c_out[0];
 
-     //Pin-24       PC1/ADC1            digital_io[19]/analog_io[12]
-     if(cfg_port_c_dir_sel[1])       digital_io_out[19]  = port_c_out[1];
+     //Pin-24       PC1/MTXD/ADC1    digital_io[23]/analog_io[12]
+     if(cfg_muart_enb)               digital_io_out[23]  = uartm_txd;
+     else if(cfg_port_c_dir_sel[1])  digital_io_out[23]  = port_c_out[1];
 
-     //Pin-25       PC2/ADC2            digital_io[20]/analog_io[13]
-     if(cfg_port_c_dir_sel[2])       digital_io_out[20]  = port_c_out[2];
+     //Pin-25       PC2/USB_DP/ADC2  digital_io[24]/analog_io[13]
+     if(cfg_usb_enb)                 digital_io_out[24]  = usb_dp_o;
+     else if(cfg_port_c_dir_sel[2])  digital_io_out[24]  = port_c_out[2];
 
-     //Pin-26       PC3/ADC3            digital_io[21]/analog_io[14]
-     if(cfg_port_c_dir_sel[3])       digital_io_out[21]  = port_c_out[3];
+     //Pin-26       PC3/USB_DN/ADC3  digital_io[25]/analog_io[14]
+     if(cfg_usb_enb)                 digital_io_out[25]  = usb_dn_o;
+     if(cfg_port_c_dir_sel[3])       digital_io_out[25]  = port_c_out[3];
 
-     //Pin-27       PC4/ADC4/SDA        digital_io[22]/analog_io[15]
-     if(cfg_i2cm_enb)                digital_io_out[22]  = i2cm_data_o;
-     else if(cfg_port_c_dir_sel[4])  digital_io_out[22]  = port_c_out[4];
+     //Pin-27       PC4/ADC4/SDA        digital_io[26]/analog_io[15]
+     if(cfg_i2cm_enb)                digital_io_out[26]  = i2cm_data_o;
+     else if(cfg_port_c_dir_sel[4])  digital_io_out[26]  = port_c_out[4];
 
-     //Pin-28       PC5/ADC5/SCL        digital_io[23]/analog_io[16]
-     if(cfg_i2cm_enb)                digital_io_out[23]  = i2cm_clk_o;
-     else if(cfg_port_c_dir_sel[5])  digital_io_out[23]  = port_c_out[5];
+     //Pin-28       PC5/ADC5/SCL        digital_io[27]/analog_io[16]
+     if(cfg_i2cm_enb)                digital_io_out[27]  = i2cm_clk_o;
+     else if(cfg_port_c_dir_sel[5])  digital_io_out[27]  = port_c_out[5];
 
      // Serial Flash
-     digital_io_out[24] = sflash_sck   ;
-     digital_io_out[25] = sflash_ss[0] ;
-     digital_io_out[26] = sflash_ss[1] ;
-     digital_io_out[27] = sflash_ss[2] ;
-     digital_io_out[28] = sflash_ss[3] ;
-     digital_io_out[29] = sflash_do[0] ;
-     digital_io_out[30] = sflash_do[1] ;
-     digital_io_out[31] = sflash_do[2] ;
-     digital_io_out[32] = sflash_do[3] ;
+     digital_io_out[28] = sflash_sck   ;
+     digital_io_out[29] = sflash_ss[0] ;
+     digital_io_out[30] = sflash_ss[1] ;
+     digital_io_out[31] = sflash_ss[2] ;
+     digital_io_out[32] = sflash_ss[3] ;
+     digital_io_out[33] = sflash_do[0] ;
+     digital_io_out[34] = sflash_do[1] ;
+     digital_io_out[35] = sflash_do[2] ;
+     digital_io_out[36] = sflash_do[3] ;
                        
      // dbg_clk_mon - Pll clock output monitor
-     digital_io_out[33] = dbg_clk_mon;
+     digital_io_out[37] = dbg_clk_mon;
 
-     // UART MASTER I/f
-     digital_io_out[34] = 1'b0         ; // RXD
-     digital_io_out[35] = uartm_txd    ; // TXD
-                  
-     // USB 1.1     
-     digital_io_out[36] = usb_dp_o     ;
-     digital_io_out[37] = usb_dn_o     ;
+     digital_io_out[0] = port_a_out[0] ;
+     digital_io_out[1] = port_a_out[1] ;
+     digital_io_out[2] = port_a_out[2] ;
+     digital_io_out[3] = port_a_out[3] ;
+     digital_io_out[4] = port_a_out[4] ;
 end
 
 // dataoen selection
 always_comb begin
      digital_io_oen = 38'h3F_FFFF_FFFF;
-     //Pin-1        PC6/RESET*          digital_io[0]
-     if(cfg_port_c_dir_sel[6])       digital_io_oen[0]   = 1'b0;
 
-     //Pin-2        PD0/RXD[0]          digital_io[1]
-     if     (cfg_uart_enb[0])        digital_io_oen[1]   = 1'b1;
-     else if(cfg_port_d_dir_sel[0])  digital_io_oen[1]   = 1'b0;
+     //Pin-1        PC6/WS[0]/RESET*          digital_io[5]
+     if(cfg_port_c_port_type[6])       digital_io_oen[5]   = 1'b1;
+     else if(cfg_port_c_dir_sel[6])    digital_io_oen[5]   = 1'b0;
 
-     //Pin-3        PD1/TXD[0]          digital_io[2]
-     if     (cfg_uart_enb[0])        digital_io_oen[2]   = 1'b0;
-     else if(cfg_port_d_dir_sel[1])  digital_io_oen[2]   = 1'b0;
+     //Pin-2        PD0/WS[0]/RXD[0]          digital_io[6]
+     if     (cfg_uart_enb[0])        digital_io_oen[6]   = 1'b1;
+     else if(cfg_port_d_port_type[0])digital_io_oen[6]   = 1'b1;
+     else if(cfg_port_d_dir_sel[0])  digital_io_oen[6]   = 1'b0;
 
-    //Pin-4        PD2/RXD[1]/INT0      digital_io[3]
-     if   (cfg_uart_enb[1])          digital_io_oen[3]   = 1'b1;
-     else if(cfg_int_enb[0])         digital_io_oen[3]   = 1'b1;
-     else if(cfg_port_d_dir_sel[2])  digital_io_oen[3]   = 1'b0;
+     //Pin-3        PD1/WS[0]/TXD[0]          digital_io[7]
+     if     (cfg_uart_enb[0])        digital_io_oen[7]   = 1'b0;
+     else if(cfg_port_d_port_type[1])digital_io_oen[7]   = 1'b1;
+     else if(cfg_port_d_dir_sel[1])  digital_io_oen[7]   = 1'b0;
 
-     //Pin-5        PD3/INT1/OC2B(PWM0)  digital_io[4]
-     if(cfg_pwm_enb[0])              digital_io_oen[4]   = 1'b0;
-     else if(cfg_int_enb[1])         digital_io_oen[4]   = 1'b1;
-     else if(cfg_port_d_dir_sel[3])  digital_io_oen[4]   = 1'b0;
+    //Pin-4        PD2/WS[0]/RXD[1]/INT0      digital_io[8]
+     if(cfg_int_enb[0])         digital_io_oen[8]   = 1'b1;
+     else if(cfg_port_d_port_type[2])digital_io_oen[8]   = 1'b1;
+     else if(cfg_port_d_dir_sel[2])  digital_io_oen[8]   = 1'b0;
 
-     //Pin-6        PD4/TXD[1]       digital_io[5]
-     if   (cfg_uart_enb[1])          digital_io_oen[5]   = 1'b0;
-     else if(cfg_port_d_dir_sel[4])  digital_io_oen[5]   = 1'b0;
+     //Pin-5        PD3/WS[1]/INT1/OC2B(PWM0)  digital_io[9]
+     if(cfg_pwm_enb[0])              digital_io_oen[9]   = 1'b0;
+     else if(cfg_int_enb[1])         digital_io_oen[9]   = 1'b1;
+     else if(cfg_port_d_port_type[3])digital_io_oen[9]   = 1'b1;
+     else if(cfg_port_d_dir_sel[3])  digital_io_oen[9]   = 1'b0;
 
-     //Pin-9        PB6/XTAL1/TOSC1     digital_io[6]
-     if(cfg_port_b_dir_sel[6])       digital_io_oen[6]   = 1'b0;
+     //Pin-6        PD4/WS[1]/TXD[1]       digital_io[10]
+     if   (cfg_uart_enb[1])          digital_io_oen[10]   = 1'b0;
+     else if(cfg_port_d_port_type[4])digital_io_oen[10]   = 1'b1;
+     else if(cfg_port_d_dir_sel[4])  digital_io_oen[10]   = 1'b0;
 
-     // Pin-10       PB7/XTAL2/TOSC2     digital_io[7]
-     if(cfg_port_b_dir_sel[7])       digital_io_oen[7]   = 1'b0;
+     //Pin-9        PB6/WS[1]/XTAL1/TOSC1     digital_io[11]
+     if   (cfg_uart_enb[1])          digital_io_oen[11]   = 1'b1;
+     else if(cfg_port_b_port_type[6]) digital_io_oen[11]   = 1'b1;
+     else if(cfg_port_b_dir_sel[6])    digital_io_oen[11]   = 1'b0;
 
-     //Pin-11       PD5/SS[3]/OC0B(PWM1)/T1   digital_io[8]
-     if(cfg_pwm_enb[1])              digital_io_oen[8]   = 1'b0;
-     else if(cfg_spim_cs_enb[3])     digital_io_oen[8]   = 1'b0;
-     else if(cfg_port_d_dir_sel[5])  digital_io_oen[8]   = 1'b0;
+     // Pin-10       PB7/WS[1]/XTAL2/TOSC2     digital_io[12]
+     if(cfg_port_b_port_type[7])       digital_io_oen[12]   = 1'b1;
+     else if(cfg_port_b_dir_sel[7])    digital_io_oen[12]   = 1'b0;
 
-     //Pin-12       PD6/SS[2]/OC0A(PWM2)/AIN0 digital_io[9] /analog_io[2]
-     if(cfg_pwm_enb[2])              digital_io_oen[9]   = 1'b0;
-     else if(cfg_spim_cs_enb[2])     digital_io_oen[9]   = 1'b0;
-     else if(cfg_port_d_dir_sel[6])  digital_io_oen[9]   = 1'b0;
+     //Pin-11       PD5/WS[2]/SS[3]/OC0B(PWM1)/T1   digital_io[13]
+     if(cfg_strap_pad_ctrl)          digital_io_oen[13]   = 1'b1;
+     else if(cfg_pwm_enb[1])         digital_io_oen[13]   = 1'b0;
+     else if(cfg_spim_cs_enb[3])     digital_io_oen[13]   = 1'b0;
+     else if(cfg_port_d_port_type[5])digital_io_oen[13]   = 1'b1;
+     else if(cfg_port_d_dir_sel[5])  digital_io_oen[13]   = 1'b0;
 
-     //Pin-13       PD7/A1N1            digital_io[10]/analog_io[3]
-     if(cfg_port_d_dir_sel[7])       digital_io_oen[10]  = 1'b0;
+     //Pin-12       PD6/SS[2]/OC0A(PWM2)/AIN0 digital_io[14] /analog_io[2]
+     if(cfg_strap_pad_ctrl)          digital_io_oen[14]   = 1'b1;
+     else if(cfg_pwm_enb[2])         digital_io_oen[14]   = 1'b0;
+     else if(cfg_spim_cs_enb[2])     digital_io_oen[14]   = 1'b0;
+     else if(cfg_port_d_port_type[6])digital_io_oen[14]   = 1'b1;
+     else if(cfg_port_d_dir_sel[6])  digital_io_oen[14]   = 1'b0;
+
+     //Pin-13       PD7/WS[2]/A1N1            digital_io[15]/analog_io[3]
+     if(cfg_strap_pad_ctrl)          digital_io_oen[15]   = 1'b1;
+     else if(cfg_port_d_port_type[7])digital_io_oen[15]  = 1'b1;
+     else if(cfg_port_d_dir_sel[7])  digital_io_oen[15]  = 1'b0;
      
-     //Pin-14       PB0/CLKO/ICP1       digital_io[11]
-     if(cfg_port_b_dir_sel[0])       digital_io_oen[11]  = 1'b0;
+     //Pin-14       PB0/WS[2]/CLKO/ICP1       digital_io[16]
+     if(cfg_strap_pad_ctrl)          digital_io_oen[16]   = 1'b1;
+     else if(cfg_port_b_port_type[0])digital_io_oen[16]  = 1'b1;
+     else if(cfg_port_b_dir_sel[0])  digital_io_oen[16]  = 1'b0;
 
-     //Pin-15       PB1/SS[1]/OC1A(PWM3)      digital_io[12]
-     if(cfg_pwm_enb[3])              digital_io_oen[12]  = 1'b0;
-     else if(cfg_spim_cs_enb[1])     digital_io_oen[12]  = 1'b0;
-     else if(cfg_port_b_dir_sel[1])  digital_io_oen[12]  = 1'b0;
+     //Pin-15       PB1/WS[3]/SS[1]/OC1A(PWM3)      digital_io[17]
+     if(cfg_strap_pad_ctrl)          digital_io_oen[17]   = 1'b1;
+     else if(cfg_pwm_enb[3])         digital_io_oen[17]  = 1'b0;
+     else if(cfg_spim_cs_enb[1])     digital_io_oen[17]  = 1'b0;
+     else if(cfg_port_b_port_type[1])digital_io_oen[17]  = 1'b1;
+     else if(cfg_port_b_dir_sel[1])  digital_io_oen[17]  = 1'b0;
 
-     //Pin-16       PB2/SS[0]/OC1B(PWM4)   digital_io[13]
-     if(cfg_pwm_enb[4])              digital_io_oen[13]  = 1'b0;
-     else if(cfg_spim_cs_enb[0])     digital_io_oen[13]  = 1'b0;
-     else if(cfg_port_b_dir_sel[2])  digital_io_oen[13]  = 1'b0;
+     //Pin-16       PB2/WS[3]/SS[0]/OC1B(PWM4)   digital_io[18]
+     if(cfg_strap_pad_ctrl)          digital_io_oen[18]   = 1'b1;
+     else if(cfg_pwm_enb[4])         digital_io_oen[18]  = 1'b0;
+     else if(cfg_spim_cs_enb[0])     digital_io_oen[18]  = 1'b0;
+	 else if(cfg_port_b_port_type[2])digital_io_oen[18]  = 1'b1;
+     else if(cfg_port_b_dir_sel[2])  digital_io_oen[18]  = 1'b0;
 
-     //Pin-17       PB3/MOSI/OC2A(PWM5) digital_io[14]
-     if(cfg_spim_enb)                digital_io_oen[14]  = 1'b1; // SPIM MOSI (Input)
-     else if(cfg_pwm_enb[5])         digital_io_oen[14]  = 1'b0;
-     else if(cfg_port_b_dir_sel[3])  digital_io_oen[14]  = 1'b0;
-     else if(spis_boot)              digital_io_oen[14]  = 1'b0; // SPIS MISO (Output)
+     //Pin-17       PB3/WS[3]/MOSI/OC2A(PWM5) digital_io[19]
+     if(cfg_strap_pad_ctrl)          digital_io_oen[19]   = 1'b1;
+     else if(cfg_spim_enb)           digital_io_oen[19]  = 1'b1; // SPIM MOSI (Input)
+     else if(cfg_pwm_enb[5])         digital_io_oen[19]  = 1'b0;
+     else if(cfg_port_b_port_type[3])digital_io_oen[19]  = 1'b1;
+     else if(cfg_port_b_dir_sel[3])  digital_io_oen[19]  = 1'b0;
+     else if(spis_boot)              digital_io_oen[19]  = 1'b0; // SPIS MISO (Output)
 
-     //Pin-18       PB4/MISO         digital_io[15]
-     if(cfg_spim_enb)                digital_io_oen[15]  = 1'b0; // SPIM MISO (Output) 
-     else if(cfg_port_b_dir_sel[4])  digital_io_oen[15]  = 1'b0;
-     else if(spis_boot)              digital_io_oen[15]  = 1'b1; // SPIS MOSI (Input)
+     //Pin-18       PB4/WS[3]/MISO         digital_io[20]
+     if(cfg_strap_pad_ctrl)          digital_io_oen[20]  = 1'b1;
+     else if(cfg_spim_enb)           digital_io_oen[20]  = 1'b0; // SPIM MISO (Output) 
+     else if(cfg_port_b_port_type[4])digital_io_oen[20]  = 1'b1;
+     else if(cfg_port_b_dir_sel[4])  digital_io_oen[20]  = 1'b0;
+     else if(spis_boot)              digital_io_oen[20]  = 1'b1; // SPIS MOSI (Input)
 
-     //Pin-19       PB5/SCK             digital_io[16]
-     if(cfg_spim_enb)                digital_io_oen[16]  = 1'b0; // SPIM SCK (Output)
-     else if(cfg_port_b_dir_sel[5])  digital_io_oen[16]  = 1'b0;
-     else if(spis_boot)              digital_io_oen[16]  = 1'b1; // SPIS SCK (Input)
+     //Pin-19       PB5/SCK             digital_io[21]
+     if(cfg_spim_enb)                digital_io_oen[21]  = 1'b0; // SPIM SCK (Output)
+     else if(cfg_port_b_dir_sel[5])  digital_io_oen[21]  = 1'b0;
+     else if(spis_boot)              digital_io_oen[21]  = 1'b1; // SPIS SCK (Input)
      
-     //Pin-23       PC0/ADC0            digital_io[18]/analog_io[11]
-     if(cfg_port_c_dir_sel[0])       digital_io_oen[18]  = 1'b0;
+     //Pin-23       PC0/MRXD/ADC0    digital_io[22]/analog_io[11]
+     if(cfg_muart_enb)               digital_io_oen[22]  = 1'b1; 
+     else if(cfg_port_c_dir_sel[0])  digital_io_oen[22]  = 1'b0;
 
-     //Pin-24       PC1/ADC1            digital_io[19]/analog_io[12]
-     if(cfg_port_c_dir_sel[1])       digital_io_oen[19]  = 1'b0;
+     //Pin-24       PC1/MTXD/ADC1    digital_io[23]/analog_io[12]
+     if(cfg_muart_enb)               digital_io_oen[23]  = 1'b0; 
+     if(cfg_port_c_dir_sel[1])       digital_io_oen[23]  = 1'b0;
 
-     //Pin-25       PC2/ADC2            digital_io[20]/analog_io[13]
-     if(cfg_port_c_dir_sel[2])       digital_io_oen[20]  = 1'b0;
+     //Pin-25       PC2/USB_DP/ADC2  digital_io[24]/analog_io[13]
+     if(cfg_usb_enb)                 digital_io_oen[24]  = usb_oen;
+     else if(cfg_port_c_dir_sel[2])  digital_io_oen[24]  = 1'b0;
 
-     //Pin-26       PC3/ADC3            digital_io[21]/analog_io[14]
-     if(cfg_port_c_dir_sel[3])       digital_io_oen[21]  = 1'b0;
+     //Pin-26       PC3/USB_DN/ADC3  digital_io[25]/analog_io[14]
+     if(cfg_usb_enb)                 digital_io_oen[25]  = usb_oen;
+     else if(cfg_port_c_dir_sel[3])  digital_io_oen[25]  = 1'b0;
 
-     //Pin-27       PC4/ADC4/SDA        digital_io[22]/analog_io[15]
-     if(cfg_i2cm_enb)                digital_io_oen[22]  = i2cm_data_oen;
-     else if(cfg_port_c_dir_sel[4])  digital_io_oen[22]  = 1'b0;
+     //Pin-27       PC4/ADC4/SDA        digital_io[26]/analog_io[15]
+     if(cfg_i2cm_enb)                digital_io_oen[26]  = i2cm_data_oen;
+     else if(cfg_port_c_dir_sel[4])  digital_io_oen[26]  = 1'b0;
 
-     //Pin-28       PC5/ADC5/SCL        digital_io[23]/analog_io[16]
-     if(cfg_i2cm_enb)                digital_io_oen[23]  = i2cm_clk_oen;
-     else if(cfg_port_c_dir_sel[5])  digital_io_oen[23]  = 1'b0;
+     //Pin-28       PC5/ADC5/SCL        digital_io[27]/analog_io[16]
+     if(cfg_i2cm_enb)                digital_io_oen[27]  = i2cm_clk_oen;
+     else if(cfg_port_c_dir_sel[5])  digital_io_oen[27]  = 1'b0;
 
      // Serial Flash
-     digital_io_oen[24] = 1'b0   ;
-     digital_io_oen[25] = 1'b0   ;
-     digital_io_oen[26] = 1'b0   ;
-     digital_io_oen[27] = 1'b0   ;
-     digital_io_oen[28] = 1'b0   ;
-     digital_io_oen[29] = sflash_oen[0];
-     digital_io_oen[30] = sflash_oen[1];
-     digital_io_oen[31] = sflash_oen[2];
-     digital_io_oen[32] = sflash_oen[3];
+     if(cfg_strap_pad_ctrl)          digital_io_oen[28]  = 1'b1;
+     else                            digital_io_oen[28]  = 1'b0;
+     if(cfg_strap_pad_ctrl)          digital_io_oen[29]  = 1'b1;
+     else                            digital_io_oen[29]  = 1'b0;
+     if(cfg_strap_pad_ctrl)          digital_io_oen[30]  = 1'b1;
+     else                            digital_io_oen[30]  = 1'b0;
+     if(cfg_strap_pad_ctrl)          digital_io_oen[31]  = 1'b1;
+     else                            digital_io_oen[31]  = 1'b0;
+     if(cfg_strap_pad_ctrl)          digital_io_oen[32]  = 1'b1;
+     else                            digital_io_oen[32]  = 1'b0;
+     if(cfg_strap_pad_ctrl)          digital_io_oen[33]  = 1'b1;
+     else                            digital_io_oen[33]  = sflash_oen[0];
+     if(cfg_strap_pad_ctrl)          digital_io_oen[34]  = 1'b1;
+     else                            digital_io_oen[34]  = sflash_oen[1];
+     if(cfg_strap_pad_ctrl)          digital_io_oen[35]  = 1'b1;
+     else                            digital_io_oen[35]  = sflash_oen[2];
+     if(cfg_strap_pad_ctrl)          digital_io_oen[36]  = 1'b1;
+     else                            digital_io_oen[36]  = sflash_oen[3];
                        
      // dbg_clk_mon
-     digital_io_oen[33] = 1'b0  ;
-     // UART MASTER
-     digital_io_oen[34] = 1'b1; // RXD
-     digital_io_oen[35] = 1'b0; // TXD
+     if(cfg_strap_pad_ctrl)          digital_io_oen[37] = 1'b1;
+     else                            digital_io_oen[37] = 1'b0  ;
                   
-     // USB 1.1     
-     digital_io_oen[36] = usb_oen;
-     digital_io_oen[37] = usb_oen;
+     if(cfg_port_a_dir_sel[0])  digital_io_oen[0]   = 1'b0;
+     if(cfg_port_a_dir_sel[1])  digital_io_oen[1]   = 1'b0;
+     if(cfg_port_a_dir_sel[2])  digital_io_oen[2]   = 1'b0;
+     if(cfg_port_a_dir_sel[3])  digital_io_oen[3]   = 1'b0;
+     if(cfg_port_a_dir_sel[4])  digital_io_oen[4]   = 1'b0;
 end
 
 
diff --git a/verilog/rtl/pinmux/src/pinmux_top.sv b/verilog/rtl/pinmux/src/pinmux_top.sv
index c84c1a7..d253eea 100755
--- a/verilog/rtl/pinmux/src/pinmux_top.sv
+++ b/verilog/rtl/pinmux/src/pinmux_top.sv
@@ -17,7 +17,7 @@
 //
 //////////////////////////////////////////////////////////////////////
 ////                                                              ////
-////  Pinmux                                                     ////
+////  Pinmux                                                      ////
 ////                                                              ////
 ////  This file is part of the riscduino cores project            ////
 ////  https://github.com/dineshannayya/riscduino.git              ////
@@ -45,21 +45,63 @@
 ////    0.4 - 20 July 2022, Dinesh A                              ////
 ////         On Power On, If RESET* = 0, then system will enter   ////
 ////         in to SPIS slave mode to support boot                ////
+////    0.5  Aug 5 2022, Dinesh A                                 ////
+////         changes in sspim                                     ////
+////           A. SPI Mode 0 to 3 support added,                  ////
+////           B. SPI Duplex mode TX-RX Mode added                ////
+////    0.6  Aug 15 2022, Dinesh A                                ////
+////          A. 15 Hardware Semahore added                       ////
+////    0.7 - 24 Aug 2022, Dinesh A                               ////
+////          A. GPIO interrupt generation changed from 1 to 32   ////
+////          B. uart_master disable option added                 ////
+////          C. Timer interrupt related clean-up                 ////
+////          D. 4x ws281x driver logic added                     ////
+////          E. 4x ws281x driver are mux with 16x gpio           ////
+////          F. gpio type select the normal gpio vs ws281x       ////
+////    0.7 - 26th Aug 2022, Dinesh A                             ////
+////          As digitial-io[0-4] reserved at power up.           ////
+////          A. to keep at least one uart access,                ////
+////              we have moved UART_RXD[1] from io[3] to io[6]   ////
+////          B. SPI Slave SSN move from io[0] to [7]             ////
+////          C. Additional Mail Box Register added at addr 0xF   ////
+////          D. Due to power on digitalio[0-4] access issue,we   ////
+////             have moved arduino pin mapping from io 5 onward  ////
+////    0.8 - 1 Sept 2022, Dinesh A                               ////
+////          A. System strap implementation                      ////
+////          B. glbl address space increased from 16 to 32       ////
+////          C. software register address moved, 4 register will ////
+////             reset under power-on reset, 4 register will reset////
+////             system reset                                     ////
 //////////////////////////////////////////////////////////////////////
-
+`include "user_params.svh"
 module pinmux_top (
                     `ifdef USE_POWER_PINS
-                       input logic         vccd1,// User area 1 1.8V supply
-                       input logic         vssd1,// User area 1 digital ground
+                       input logic             vccd1,// User area 1 1.8V supply
+                       input logic             vssd1,// User area 1 digital ground
                     `endif
                         // clock skew adjust
-                       input logic [3:0]        cfg_cska_pinmux,
-                       input logic	        wbd_clk_int,
-                       output logic	        wbd_clk_pinmux,
+                       input logic [3:0]       cfg_cska_pinmux,
+                       input logic	           wbd_clk_int,
+                       output logic	           wbd_clk_pinmux,
                        // System Signals
                        // Inputs
-		       input logic             mclk,
-                       input logic             h_reset_n,
+		               input logic             mclk,
+	                   input logic             e_reset_n              ,  // external reset
+	                   input logic             p_reset_n              ,  // power-on reset
+                       input logic             s_reset_n              ,  // soft reset
+
+                       // to/from Global Reset FSM
+                        input  logic           cfg_strap_pad_ctrl     ,
+	                    input  logic [31:0]    system_strap           ,
+	                    output logic [31:0]    strap_sticky           ,
+
+                        input logic            user_clock1            ,
+                        input logic            user_clock2            ,
+                        input logic            int_pll_clock          ,
+                        output logic           xtal_clk               ,
+
+                        output logic           usb_clk                ,
+                        output logic           rtc_clk                ,
 
                        // Global Reset control
                        output logic  [1:0]     cpu_core_rst_n   ,
@@ -70,12 +112,12 @@
                        output logic            i2cm_rst_n       ,
                        output logic            usb_rst_n        ,
 
-		       output logic [15:0]     cfg_riscv_ctrl,
+		               output logic [15:0]     cfg_riscv_ctrl,
 
 		       // Reg Bus Interface Signal
                        input logic             reg_cs,
                        input logic             reg_wr,
-                       input logic [8:0]       reg_addr,
+                       input logic [9:0]       reg_addr,
                        input logic [31:0]      reg_wdata,
                        input logic [3:0]       reg_be,
 
@@ -84,11 +126,11 @@
                        output logic            reg_ack,
 
 		      // Risc configuration
-                       output logic [15:0]     irq_lines,
+                       output logic [31:0]     irq_lines,
                        output logic            soft_irq,
                        output logic [2:0]      user_irq,
-		       input  logic            usb_intr,
-		       input  logic            i2cm_intr,
+		               input  logic            usb_intr,
+		               input  logic            i2cm_intr,
 
                        // Digital IO
                        output logic [37:0]     digital_io_out,
@@ -96,11 +138,11 @@
                        input  logic [37:0]     digital_io_in,
 
 		       // SFLASH I/F
-		       input  logic            sflash_sck,
-		       input  logic [3:0]      sflash_ss,
-		       input  logic [3:0]      sflash_oen,
-		       input  logic [3:0]      sflash_do,
-		       output logic [3:0]      sflash_di,
+		               input  logic            sflash_sck,
+		               input  logic [3:0]      sflash_ss,
+		               input  logic [3:0]      sflash_oen,
+		               input  logic [3:0]      sflash_do,
+		               output logic [3:0]      sflash_di,
 
 		       // SSRAM I/F - Temp Masked
 		       //input  logic            ssram_sck,
@@ -144,16 +186,18 @@
                        output  logic            uartm_rxd ,
                        input logic              uartm_txd  ,       
 
-		       output  logic           pulse1m_mclk,
-	               output  logic [31:0]    pinmux_debug,
+		               output  logic           pulse1m_mclk,
+	                   output  logic [31:0]    pinmux_debug,
 
-		       input   logic           dbg_clk_mon
+		               input   logic           dbg_clk_mon
 
    ); 
 
 
 
-logic sreset_n;  // Sync Reset
+logic         s_reset_ssn;  // Sync Reset
+logic         p_reset_ssn;  // Sync Reset
+logic [15:0]  pad_strap_in;
    
 /* clock pulse */
 //********************************************************
@@ -173,6 +217,7 @@
 logic [5:0]     pwm_wfm                 ;
 
 
+logic [31:0]  gpio_intr                ;
 wire  [31:0]  cfg_gpio_dir_sel         ;// decides on GPIO pin is I/P or O/P at pad level, 0 -> Input, 1 -> Output
 wire  [31:0]  cfg_gpio_out_type        ;// GPIO Type, Unused
 wire  [31:0]  cfg_multi_func_sel       ;// GPIO Multi function type
@@ -192,17 +237,19 @@
 wire [31:0]   gpio_int_event; // GPIO Interrupt indication
 reg [1:0]     ext_intr_in;    // External PAD level interrupt
 
+logic [3:0]     ws_txd        ; // ws281x txd port
 
 assign      pinmux_debug = '0; // Todo: Need to fix
 
 //------------------------------------------------------
 // Register Map Decoding
 
-`define SEL_GLBL  3'b000   // GLOBAL REGISTER
-`define SEL_GPIO  3'b001   // GPIO REGISTER
-`define SEL_PWM   3'b010   // PWM REGISTER
-`define SEL_TIMER 3'b011   // TIMER REGISTER
-`define SEL_SEMA  3'b100   // SEMAPHORE REGISTER
+`define SEL_GLBL    3'b000   // GLOBAL REGISTER
+`define SEL_GPIO    3'b001   // GPIO REGISTER
+`define SEL_PWM     3'b010   // PWM REGISTER
+`define SEL_TIMER   3'b011   // TIMER REGISTER
+`define SEL_SEMA    3'b100   // SEMAPHORE REGISTER
+`define SEL_WS      3'b101   // WS281x  REGISTER
 
 
 //----------------------------------------
@@ -223,24 +270,29 @@
 logic [15:0]  reg_sema_rdata;
 logic         reg_sema_ack;
 
+logic [31:0]  reg_ws_rdata;
+logic         reg_ws_ack;
 
-assign reg_rdata = (reg_addr[8:6] == `SEL_GLBL)  ? {reg_glbl_rdata} : 
-	               (reg_addr[8:6] == `SEL_GPIO)  ? {reg_gpio_rdata} :
-	               (reg_addr[8:6] == `SEL_PWM)   ? {reg_pwm_rdata}  :
-	               (reg_addr[8:6] == `SEL_TIMER) ? reg_timer_rdata  : 
-	               (reg_addr[8:6] == `SEL_SEMA)  ? {16'h0,reg_sema_rdata} : 'h0;
+assign reg_rdata = (reg_addr[9:7] == `SEL_GLBL)  ? {reg_glbl_rdata} : 
+	               (reg_addr[9:7] == `SEL_GPIO)  ? {reg_gpio_rdata} :
+	               (reg_addr[9:7] == `SEL_PWM)   ? {reg_pwm_rdata}  :
+	               (reg_addr[9:7] == `SEL_TIMER) ? reg_timer_rdata  : 
+	               (reg_addr[9:7] == `SEL_SEMA)  ? {16'h0,reg_sema_rdata} : 
+	               (reg_addr[9:7] == `SEL_WS)    ? reg_ws_rdata     : 'h0;
 
-assign reg_ack   = (reg_addr[8:6] == `SEL_GLBL)  ? reg_glbl_ack   : 
-	               (reg_addr[8:6] == `SEL_GPIO)  ? reg_gpio_ack   : 
-	               (reg_addr[8:6] == `SEL_PWM)   ? reg_pwm_ack    : 
-	               (reg_addr[8:6] == `SEL_TIMER) ? reg_timer_ack  : 
-	               (reg_addr[8:6] == `SEL_SEMA)  ? reg_sema_ack   : 1'b0;
+assign reg_ack   = (reg_addr[9:7] == `SEL_GLBL)  ? reg_glbl_ack   : 
+	               (reg_addr[9:7] == `SEL_GPIO)  ? reg_gpio_ack   : 
+	               (reg_addr[9:7] == `SEL_PWM)   ? reg_pwm_ack    : 
+	               (reg_addr[9:7] == `SEL_TIMER) ? reg_timer_ack  : 
+	               (reg_addr[9:7] == `SEL_SEMA)  ? reg_sema_ack   : 
+	               (reg_addr[9:7] == `SEL_WS)    ? reg_ws_ack     : 1'b0;
 
-wire reg_glbl_cs  = (reg_addr[8:6] == `SEL_GLBL) ? reg_cs : 1'b0;
-wire reg_gpio_cs  = (reg_addr[8:6] == `SEL_GPIO) ? reg_cs : 1'b0;
-wire reg_pwm_cs   = (reg_addr[8:6] == `SEL_PWM)  ? reg_cs : 1'b0;
-wire reg_timer_cs = (reg_addr[8:6] == `SEL_TIMER)? reg_cs : 1'b0;
-wire reg_sema_cs  = (reg_addr[8:6] == `SEL_SEMA) ? reg_cs : 1'b0;
+wire reg_glbl_cs  = (reg_addr[9:7] == `SEL_GLBL) ? reg_cs : 1'b0;
+wire reg_gpio_cs  = (reg_addr[9:7] == `SEL_GPIO) ? reg_cs : 1'b0;
+wire reg_pwm_cs   = (reg_addr[9:7] == `SEL_PWM)  ? reg_cs : 1'b0;
+wire reg_timer_cs = (reg_addr[9:7] == `SEL_TIMER)? reg_cs : 1'b0;
+wire reg_sema_cs  = (reg_addr[9:7] == `SEL_SEMA) ? reg_cs : 1'b0;
+wire reg_ws_cs    = (reg_addr[9:7] == `SEL_WS) ? reg_cs : 1'b0;
 
 //---------------------------------------------------------------------
 
@@ -264,12 +316,20 @@
        );
 
 reset_sync  u_rst_sync (
-	      .scan_mode  (1'b0        ),
-              .dclk       (mclk        ), // Destination clock domain
-	      .arst_n     (h_reset_n   ), // active low async reset
-              .srst_n     (sreset_n    )
+	      .scan_mode  (1'b0           ),
+          .dclk       (mclk           ), // Destination clock domain
+	      .arst_n     (s_reset_n      ), // active low async reset
+          .srst_n     (s_reset_ssn    )
           );
 
+reset_sync  u_prst_sync (
+	      .scan_mode  (1'b0           ),
+          .dclk       (mclk           ), // Destination clock domain
+	      .arst_n     (p_reset_n      ), // active low async reset
+          .srst_n     (p_reset_ssn    )
+          );
+
+
 //------------------------------------------------------------------
 // Global Register
 //------------------------------------------------------------------
@@ -277,7 +337,22 @@
       // System Signals
       // Inputs
           .mclk                         (mclk                    ),
-          .h_reset_n                    (sreset_n                ),
+	      .e_reset_n                    (e_reset_n               ),  // external reset
+	      .p_reset_n                    (p_reset_ssn             ),  // power-on reset
+          .s_reset_n                    (s_reset_ssn             ),
+
+          .pad_strap_in                 (pad_strap_in            ),
+          .system_strap                 (system_strap            ),
+          .strap_sticky                 (strap_sticky            ),
+
+          .user_clock1                  (user_clock1             ),
+          .user_clock2                  (user_clock2             ),
+          .int_pll_clock                (int_pll_clock           ),
+          .xtal_clk                     (xtal_clk                ),
+
+          .usb_clk                      (usb_clk                 ),
+          .rtc_clk                      (rtc_clk                 ),
+
 
           .cpu_core_rst_n               (cpu_core_rst_n          ),
           .cpu_intf_rst_n               (cpu_intf_rst_n          ),
@@ -294,7 +369,7 @@
       // Reg read/write Interface Inputs
           .reg_cs                       (reg_glbl_cs             ),
           .reg_wr                       (reg_wr                  ),
-          .reg_addr                     (reg_addr[5:2]           ),
+          .reg_addr                     (reg_addr[6:2]           ),
           .reg_wdata                    (reg_wdata               ),
           .reg_be                       (reg_be                  ),
 
@@ -324,7 +399,7 @@
               // System Signals
               // Inputs
 		      .mclk                     ( mclk                      ),
-              .h_reset_n                (h_reset_n                  ),
+              .h_reset_n                (s_reset_ssn                ),
 
 		      // Reg Bus Interface Signal
               .reg_cs                   (reg_gpio_cs                ),
@@ -338,6 +413,7 @@
               .reg_ack                  (reg_gpio_ack               ),
 
 
+              .cfg_gpio_out_type        (cfg_gpio_out_type           ),
               .cfg_gpio_dir_sel         (cfg_gpio_dir_sel           ),
               .pad_gpio_in              (pad_gpio_in                ),
               .pad_gpio_out             (pad_gpio_out               ),
@@ -354,7 +430,7 @@
               // System Signals
               // Inputs
 		      .mclk                     ( mclk                      ),
-              .h_reset_n                (h_reset_n                  ),
+              .h_reset_n                (s_reset_ssn                ),
 
 		      // Reg Bus Interface Signal
               .reg_cs                   (reg_pwm_cs                 ),
@@ -378,8 +454,8 @@
 timer_top  u_timer(
               // System Signals
               // Inputs
-		      .mclk                     ( mclk                      ),
-              .h_reset_n                (h_reset_n                  ),
+		      .mclk                     (mclk                     ),
+              .h_reset_n                (s_reset_ssn              ),
 
 		      // Reg Bus Interface Signal
               .reg_cs                   (reg_timer_cs               ),
@@ -403,7 +479,7 @@
               // System Signals
               // Inputs
 		      .mclk                     ( mclk                      ),
-              .h_reset_n                (h_reset_n                  ),
+              .h_reset_n                (s_reset_ssn                ),
 
 		      // Reg Bus Interface Signal
               .reg_cs                   (reg_sema_cs                ),
@@ -417,14 +493,45 @@
               .reg_ack                  (reg_sema_ack               )
          );
 
+//-----------------------------------------------------------------------
+// 4 Port ws281x driver 
+//----------------------------------------------------------------------
+
+ws281x_top  u_ws281x(
+		                .mclk           (mclk             ),
+                        .h_reset_n      (s_reset_ssn      ),
+                                                          
+                        .reg_cs         (reg_ws_cs        ),
+                        .reg_wr         (reg_wr           ),
+                        .reg_addr       (reg_addr[5:2]    ),
+                        .reg_wdata      (reg_wdata        ),
+                        .reg_be         (reg_be           ),
+
+                        .reg_rdata      (reg_ws_rdata     ),
+                        .reg_ack        (reg_ws_ack       ),
+
+                        .txd            (ws_txd           )
+
+                ); 
+
+
+
+//----------------------------------------------------------------------
+// Pinmux 
+//----------------------------------------------------------------------
 
 pinmux u_pinmux (
+               .cfg_strap_pad_ctrl      (cfg_strap_pad_ctrl  ),
+               .pad_strap_in            (pad_strap_in        ),
                // Digital IO
                .digital_io_out          (digital_io_out      ),
                .digital_io_oen          (digital_io_oen      ),
                .digital_io_in           (digital_io_in       ),
 
+               .xtal_clk                (xtal_clk            ),
+
                // Config
+               .cfg_gpio_out_type       (cfg_gpio_out_type   ),
                .cfg_gpio_dir_sel        (cfg_gpio_dir_sel    ),
                .cfg_multi_func_sel      (cfg_multi_func_sel  ),
 
@@ -474,10 +581,13 @@
 
                // UART MASTER I/F
                .uartm_rxd               (uartm_rxd           ),
-               .uartm_txd               (uartm_txd           ),       
+               .uartm_txd               (uartm_txd           ),
+
+               .ws_txd                  (ws_txd              ),       
                                                    
 		       .dbg_clk_mon             (dbg_clk_mon         )
 
+
    ); 
 
 endmodule 
diff --git a/verilog/rtl/pinmux/src/strap_ctrl.sv b/verilog/rtl/pinmux/src/strap_ctrl.sv
new file mode 100644
index 0000000..643a6de
--- /dev/null
+++ b/verilog/rtl/pinmux/src/strap_ctrl.sv
@@ -0,0 +1,235 @@
+//////////////////////////////////////////////////////////////////////////////
+// SPDX-FileCopyrightText: 2021 , Dinesh Annayya                          
+// 
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+// SPDX-License-Identifier: Apache-2.0
+// SPDX-FileContributor: Created by Dinesh Annayya <dinesha@opencores.org>
+//
+//////////////////////////////////////////////////////////////////////
+////                                                              ////
+////  strap control                                               ////
+////                                                              ////
+////  This file is part of the riscduino cores project            ////
+////  https://github.com/dineshannayya/riscduino.git              ////
+////                                                              ////
+////  Description                                                 ////
+////      Manages all the strap related func                      ////
+////                                                              ////
+////  To Do:                                                      ////
+////    nothing                                                   ////
+////                                                              ////
+////  Author(s):                                                  ////
+////      - Dinesh Annayya, dinesha@opencores.org                 ////
+////                                                              ////
+////  Revision :                                                  ////
+////    0.1 - 29th Aug 2022, Dinesh A                             ////
+////                                                              ////
+//////////////////////////////////////////////////////////////////////
+
+/*************************************************************************
+  This block control the system/soft/sticky strap generation
+
+expected Reset removal sequence
+   
+               _________                 __________________________________________________
+                        |                |
+e_reset_n               |________________|
+               
+               ________                           ________________________________________
+               XXXXXXXXX                          |
+p_reset_n      XXXXXXXXX__________________________|
+               
+                                                                     ____________
+              XXXXXXXXX                                             |
+clk_enb       XXXXXXXXX_____________________________________________|
+
+                                                                                ____________
+               XXXXXXXXX                                                        |
+s_reset_n      XXXXXXXXX________________________________________________________|
+
+pad_strap_in decoding
+     bit[1:0] - System Clock Source Selection for wbs/riscv
+                 00 - User clock1  (Default)
+                 01 - User clock2 
+                 10 - Internal PLL
+                 11 - Xtal
+     bit[3:2] - Clock Division for wbs/riscv
+                 00 - 0 Div (Default)
+                 01 - 2 Div
+                 10 - 4 Div
+                 11 - 8 Div
+     bit [4]   - uart master config control
+                 0   - load from LA
+                 1   - constant value based on system clock selection (Default)
+     bit [5]   - QSPI SRAM Mode Selection
+                 1'b0 - Single (Default)
+                 1'b1 - Quad
+     bit [7:6] - QSPI Fash Mode Selection
+                 2'b00 - Single (Default)
+                 2'b01 - Double
+                 2'b10 - Quad
+                 2'b11 - QDDR
+     bit [8]   - Riscv Reset control
+                 0 - Keep Riscv on Reset
+                 1 - Removed Riscv on Power On Reset (Default)
+     bit [9]   - Riscv Cache Bypass
+                 0 - Cache Enable
+                 1 - Bypass cache (Default
+     bit [10]  - Riscv SRAM clock edge selection
+                 0 - Normal
+                 1 - Invert (Default)
+     bit [12:11] - Skew selection
+                 2'b00 - Default value (Default
+                 2'b01 - Default value + 2               
+                 2'b10 - Default value + 4               
+                 2'b11 - Default value - 4 
+     bit [14:13] - Reserved
+     bit [15]    - Strap Mode
+                   0 - Normal
+                   1 - Pick Default Value
+
+system strap decoding
+     bit[1:0] - System Clock Source Selection for wbs
+                 00 - User clock1 
+                 01 - User clock2 
+                 10 - Internal PLL
+                 11 - Xtal
+     bit[3:2] - Clock Division for wbs
+                 00 - 0 Div
+                 01 - 2 Div
+                 10 - 4 Div
+                 11 - 8 Div
+     bit[5:4] - System Clock Source Selection for riscv
+                 00 - User clock1 
+                 01 - User clock2 
+                 10 - Internal PLL
+                 11 - Xtal
+     bit[7:6] - Clock Division for riscv
+                 00 - 0 Div
+                 01 - 2 Div
+                 10 - 4 Div
+                 11 - 8 Div
+     bit [8]   - uart master config control
+                 0   - load from LA
+                 1   - constant value based on system clock selection
+     bit [9]   - QSPI SRAM Mode Selection CS#2
+                 1'b0 - Single
+                 1'b1 - Quad
+     bit [11:10] - QSPI FLASH Mode Selection CS#0
+                 2'b00 - Single
+                 2'b01 - Double
+                 2'b10 - Quad
+                 2'b11 - QDDR
+     bit [12]  - Riscv Reset control
+                 0 - Keep Riscv on Reset
+                 1 - Removed Riscv on Power On Reset
+     bit [13]   - Riscv Cache Bypass
+                 1 - Cache Enable
+                 0 - Bypass cache
+     bit [14]  - Riscv SRAM clock edge selection
+                 0 - Normal
+                 1 - Invert
+
+     bit [15]    -  Soft Reboot Request
+     bit [17:16] -  cfg_cska_wi Skew selection      
+     bit [19:18] -  cfg_cska_wh Skew selection        
+     bit [21:20] -  cfg_cska_riscv Skew selection      
+     bit [23:22] -  cfg_cska_qspi  Skew selection      
+     bit [25:24] -  cfg_cska_uart  Skew selection       
+     bit [27:26] -  cfg_cska_pinmux Skew selection     
+     bit [29:28] -  cfg_cska_qspi_co Skew selection    
+
+**************************************************************************/
+module strap_ctrl (
+
+	         input logic        clk                 ,
+	         input logic        e_reset_n           ,  // external reset
+	         input logic        p_reset_n           ,  // power-on reset
+	         input logic        s_reset_n           ,  // soft reset
+
+             input logic [15:0] pad_strap_in        , // strap from pad
+	         //List of Inputs
+	         input logic        cs                  ,
+	         input logic [3:0]  we                  ,		 
+	         input logic [31:0] data_in             ,
+	         
+	         //List of Outs
+             output logic [15:0] strap_latch         ,
+	         output logic [31:0] strap_sticky 
+
+         );
+
+
+//---------------------------------------------
+// Strap Mapping
+//----------------------------------------------
+logic [31:0] strap_map;
+logic [14:0] pstrap_select;
+
+// Pad Strap selection based on strap mode
+assign pstrap_select = (strap_latch[15] == 1'b1) ?  PSTRAP_DEFAULT_VALUE : strap_latch[14:0];
+
+assign strap_map = {
+                   1'b0               ,   // bit[31]      - Soft Reboot Request - Need to double sync to local clock
+                   1'b0               ,   // bit[30]      - reserved
+                   pstrap_select[12:11] , // bit[29:28]   - cfg_cska_qspi_co Skew selection
+                   pstrap_select[12:11] , // bit[27:26]   - cfg_cska_pinmux Skew selection
+                   pstrap_select[12:11] , // bit[25:24]   - cfg_cska_uart  Skew selection
+                   pstrap_select[12:11] , // bit[23:22]   - cfg_cska_qspi  Skew selection
+                   pstrap_select[12:11] , // bit[21:20]   - cfg_cska_riscv Skew selection
+                   pstrap_select[12:11] , // bit[19:18]   - cfg_cska_wh Skew selection
+                   pstrap_select[12:11] , // bit[17:16]   - cfg_cska_wi Skew selection
+                   1'b0                 , // bit[15]      - Reserved
+                   pstrap_select[10]    , // bit[14]      - Riscv SRAM clock edge selection
+                   pstrap_select[9]     , // bit[13]      - Riscv Cache Bypass
+                   pstrap_select[8]     , // bit[12]      - Riscv Reset control
+                   pstrap_select[7:6]   , // bit[11:10]   - QSPI FLASH Mode Selection CS#0
+                   pstrap_select[5]     , // bit[9]       - QSPI SRAM Mode Selection CS#2
+                   pstrap_select[4]     , // bit[8]       - uart master config control
+                   pstrap_select[3:2]   , // bit[7:6]     - riscv clock div
+                   pstrap_select[1:0]   , // bit[5:4]     - riscv clock source sel
+                   pstrap_select[3:2]   , // bit[3:2]     - wbs clock division
+                   pstrap_select[1:0]     // bit[1:0]     - wbs clock source sel
+                   };
+
+//------------------------------------
+// Generating strap latch
+//------------------------------------
+always_latch begin
+  if ( ~e_reset_n )
+  begin
+    strap_latch =  pad_strap_in[15:0];
+  end
+end
+
+//--------------------------------------------
+// Software controller Strap Register
+//--------------------------------------------
+
+
+always @ (posedge clk or negedge e_reset_n) begin 
+   if(e_reset_n == 1'b0) begin
+       strap_sticky  <= 'h0 ;
+   end else if (p_reset_n == 1'b0) begin
+     strap_sticky  <= strap_map ;
+   end else if(s_reset_n == 1'b0) begin
+       strap_sticky[`STRAP_SOFT_REBOOT_REQ] <= 1'b0;
+   end else begin
+       if(cs && we[0]) strap_sticky[7:0]   <= data_in[7:0];
+       if(cs && we[1]) strap_sticky[15:8]  <= data_in[15:8];
+       if(cs && we[2]) strap_sticky[23:16] <= data_in[23:16];
+       if(cs && we[3]) strap_sticky[31:24] <= data_in[31:24];
+   end
+end
+
+endmodule
diff --git a/verilog/rtl/pinmux/src/timer_reg.sv b/verilog/rtl/pinmux/src/timer_reg.sv
index cd48587..1a561f6 100644
--- a/verilog/rtl/pinmux/src/timer_reg.sv
+++ b/verilog/rtl/pinmux/src/timer_reg.sv
@@ -56,8 +56,7 @@
                        output logic [2:0]    cfg_timer_update   , // CPU write to timer register
                        output logic [18:0]   cfg_timer0         , // Timer-0 register
                        output logic [18:0]   cfg_timer1         , // Timer-1 register
-                       output logic [18:0]   cfg_timer2         , // Timer-2 register
-                       output logic [2:0]    timer_intr         
+                       output logic [18:0]   cfg_timer2           // Timer-2 register
 
                 ); 
 
diff --git a/verilog/rtl/pinmux/src/timer_top.sv b/verilog/rtl/pinmux/src/timer_top.sv
index ae981dc..127d62f 100644
--- a/verilog/rtl/pinmux/src/timer_top.sv
+++ b/verilog/rtl/pinmux/src/timer_top.sv
@@ -132,7 +132,7 @@
 
 timer  u_timer_0
   (
-     .reset_n                      (sreset_n             ),// system syn reset
+     .reset_n                      (h_reset_n            ),// system syn reset
      .mclk                         (mclk                 ),// master clock
      .pulse_1us                    (pulse_1us            ),
      .pulse_1ms                    (pulse_1ms            ),
@@ -152,7 +152,7 @@
 wire [15:0] cfg_timer1_compare = cfg_timer1[15:0];
 timer  u_timer_1
   (
-     .reset_n                      (sreset_n             ),// system syn reset
+     .reset_n                      (h_reset_n            ),// system syn reset
      .mclk                         (mclk                 ),// master clock
      .pulse_1us                    (pulse_1us            ),
      .pulse_1ms                    (pulse_1ms            ),
@@ -173,7 +173,7 @@
 
 timer  u_timer_2
   (
-     .reset_n                      (sreset_n             ),// system syn reset
+     .reset_n                      (h_reset_n            ),// system syn reset
      .mclk                         (mclk                 ),// master clock
      .pulse_1us                    (pulse_1us            ),
      .pulse_1ms                    (pulse_1ms            ),
diff --git a/verilog/rtl/pinmux/src/ws281x_driver.sv b/verilog/rtl/pinmux/src/ws281x_driver.sv
new file mode 100644
index 0000000..9974a83
--- /dev/null
+++ b/verilog/rtl/pinmux/src/ws281x_driver.sv
@@ -0,0 +1,110 @@
+
+// 24 bit ws281x led driver
+
+module ws281x_driver (
+    input  logic          clk                  ,   // Clock input.
+    input  logic          reset_n              ,   // Resets the internal state of the driver
+
+    input  logic[15:0]    cfg_reset_period     ,   // Reset period interm of clk
+    input  logic [9:0]    cfg_clk_period       ,   // Total bit clock period
+    input  logic [9:0]    cfg_th0_period        ,   // bit-0 drive low period
+    input  logic [9:0]    cfg_th1_period        ,   // bit-1 drive low period
+
+    input  logic          port_enb               , 
+    input  logic          data_available       , 
+    input  logic [7:0]    green_in             ,   // 8-bit green data
+    input  logic [7:0]    red_in               ,   // 8-bit red data
+    input  logic [7:0]    blue_in              ,   // 8-bit blue data
+    output logic          data_rd              ,   // data read
+    
+    output logic          txd                      // Signal to send to WS2811 chain.
+    );
+	
+
+   parameter  STATE_RESET    = 1'd0;
+   parameter  STATE_TRANSMIT = 1'd1;
+   /////////////////////////////////////////////////////////////
+   // Timing parameters for the WS2811                        //
+   // The LEDs are reset by driving D0 low for at least 50us. //
+   // Data is transmitted using a 800kHz signal.              //
+   // A '1' is 50% duty cycle, a '0' is 20% duty cycle.       //
+   /////////////////////////////////////////////////////////////
+
+   reg [15:0]             clk_cnt       ;   // Clock divider for a cycle
+   reg                    state         ;   // FSM state
+   reg [23:0]             led_data      ;   // Current byte to send
+   reg [4:0]              bit_cnt       ;   // Current bit index to send
+
+
+
+   
+   always @ (posedge clk or negedge reset_n) begin
+      if (reset_n == 1'b0) begin
+         state         <= STATE_RESET;
+         txd           <= 0;
+         data_rd       <= 0;
+         bit_cnt       <= 23;
+         clk_cnt       <= 0;
+         led_data      <= 0;
+      end
+      else begin
+         case (state)
+           STATE_RESET: begin
+              if(port_enb) begin
+                  if (clk_cnt == cfg_reset_period) begin
+                     if(data_available) begin
+                         led_data      <= {green_in,red_in,blue_in};
+                         bit_cnt       <= 23;
+                         clk_cnt       <= 0;
+                         txd           <= 1;
+                         data_rd       <= 1;
+                         state         <= STATE_TRANSMIT;
+                     end
+                  end
+                  else begin
+                    // De-assert txd       , and wait for 75 us.
+                     txd        <= 0;
+                     clk_cnt    <= clk_cnt + 1;
+                  end
+              end else begin
+                 txd        <= 0;
+                 clk_cnt    <= 0;
+              end
+           end // case: STATE_RESET
+           STATE_TRANSMIT: begin
+              // Advance cycle counter
+              if (clk_cnt   == cfg_clk_period) begin
+                 txd        <= 1;
+                 clk_cnt    <= 'h0;
+                 if (bit_cnt != 0) begin
+                     bit_cnt <= bit_cnt -1;
+                     // Start sending next bit of data
+                     led_data     <= {led_data [22:0], 1'b0};
+                 end else begin
+                    if(data_available) begin // if new data available
+                        led_data      <= {green_in,red_in,blue_in};
+                        bit_cnt       <= 23;
+                        data_rd       <= 1;
+                    end else begin
+                       state   <= STATE_RESET;
+                    end
+
+                 end
+              end else begin
+                  data_rd       <= 0;
+                  // De-assert txd   after a certain amount of time, depending on if you're transmitting a 1 or 0.
+                  if (led_data[23] == 0 && clk_cnt   >= cfg_th0_period) begin
+                     txd   <= 0;
+                  end
+                  else if (led_data[23] == 1 && clk_cnt   >= cfg_th1_period) begin
+                     txd   <= 0;
+                  end
+                  clk_cnt   <= clk_cnt   + 1;
+              end
+           end
+         endcase
+      end
+   end
+   
+endmodule
+
diff --git a/verilog/rtl/pinmux/src/ws281x_reg.sv b/verilog/rtl/pinmux/src/ws281x_reg.sv
new file mode 100644
index 0000000..31f25c1
--- /dev/null
+++ b/verilog/rtl/pinmux/src/ws281x_reg.sv
@@ -0,0 +1,278 @@
+//////////////////////////////////////////////////////////////////////////////
+// SPDX-FileCopyrightText: 2021 , Dinesh Annayya                          
+// 
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+// SPDX-License-Identifier: Apache-2.0
+// SPDX-FileContributor: Created by Dinesh Annayya <dinesha@opencores.org>
+//
+//////////////////////////////////////////////////////////////////////
+////                                                              ////
+////  ws281x Register                                             ////
+////                                                              ////
+////  This file is part of the riscduino cores project            ////
+////  https://github.com/dineshannayya/riscduino.git              ////
+////                                                              ////
+////  Description                                                 ////
+////     Manages the 4x ws281x driver register                    ////
+////                                                              ////
+////  To Do:                                                      ////
+////    nothing                                                   ////
+////                                                              ////
+////  Author(s):                                                  ////
+////      - Dinesh Annayya, dinesha@opencores.org                 ////
+////                                                              ////
+////  Revision :                                                  ////
+////    0.1 - 23rd Aug 2022, Dinesh A                             ////
+////          initial version                                     ////
+//////////////////////////////////////////////////////////////////////
+
+
+module ws281x_reg  #(   parameter NP = 2,     // Number of PORT
+                        parameter DW = 32,    // DATA WIDTH
+                        parameter AW = 4,     // ADDRESS WIDTH
+                        parameter BW = 4      // BYTE WIDTH
+                    ) (
+                       // System Signals
+                       // Inputs
+		               input logic           mclk                 ,
+                       input logic           h_reset_n            ,
+
+		               // Reg Bus Interface Signal
+                       input logic           reg_cs               ,
+                       input logic           reg_wr               ,
+                       input logic [AW-1:0]  reg_addr             ,
+                       input logic [DW-1:0]  reg_wdata            ,
+                       input logic [BW-1:0]  reg_be               ,
+
+                       // Outputs
+                       output logic [DW-1:0] reg_rdata            ,
+                       output logic          reg_ack              ,
+
+                       output logic[15:0]    cfg_reset_period     ,   // Reset period interm of clk
+                       output logic [9:0]    cfg_clk_period       ,   // Total bit clock period
+                       output logic [9:0]    cfg_th0_period        ,   // bit-0 drive low period
+                       output logic [9:0]    cfg_th1_period        ,   // bit-1 drive low period
+
+                       // wd281x port-0 data
+                       output  logic          port0_enb            ,
+                       input  logic          port0_rd             ,
+                       output logic [23:0]   port0_data           ,
+                       output logic          port0_dval           ,
+
+                       // wd281x port-1 data
+                       output  logic          port1_enb            ,
+                       input  logic          port1_rd             ,
+                       output logic [23:0]   port1_data           ,
+                       output logic          port1_dval           
+
+                       //// wd281x port-2 data
+                       //output  logic          port2_enb            ,
+                       //input  logic          port2_rd             ,
+                       //output logic [23:0]   port2_data           ,
+                       //output logic          port2_dval           ,
+
+                       //// wd281x port-3 data
+                       //output  logic         port3_enb            ,
+                       //input  logic          port3_rd             ,    
+                       //output logic [23:0]   port3_data           ,
+                       //output logic          port3_dval             
+
+
+                ); 
+
+//-----------------------------------------------------------------------
+// Internal Wire Declarations
+//-----------------------------------------------------------------------
+
+logic          sw_rd_en              ;
+logic          sw_wr_en              ;
+logic [AW-1:0] sw_addr               ; 
+logic [DW-1:0] sw_reg_wdata          ;
+logic [BW-1:0] sw_be                 ;
+
+logic [DW-1:0] reg_out               ;
+logic [DW-1:0] reg_0                 ; 
+logic [DW-1:0] reg_1                 ; 
+logic [DW-1:0] reg_2                 ; 
+logic [DW-1:0] reg_3                 ; 
+
+logic [NP-1:0] fifo_full             ;
+logic [NP-1:0] fifo_empty            ;
+logic [NP-1:0] fifo_wr               ;
+logic [NP-1:0] fifo_rd               ;
+logic [23:0]   fifo_rdata[0:NP-1]    ;
+logic [NP-1:0] port_op_done          ;
+
+assign       sw_addr       = reg_addr;
+assign       sw_be         = reg_be;
+assign       sw_rd_en      = reg_cs & !reg_wr;
+assign       sw_wr_en      = reg_cs & reg_wr;
+assign       sw_reg_wdata  = reg_wdata;
+
+//-----------------------------------------------------------------------
+// register read enable and write enable decoding logic
+//-----------------------------------------------------------------------
+wire   sw_wr_en_0  = sw_wr_en  & (sw_addr == 4'h0);
+wire   sw_wr_en_1  = sw_wr_en  & (sw_addr == 4'h1);
+wire   sw_wr_en_2  = sw_wr_en  & (sw_addr == 4'h2);
+wire   sw_wr_en_3  = sw_wr_en  & (sw_addr == 4'h3);
+wire   sw_wr_en_4  = sw_wr_en  & (sw_addr == 4'h4) & !fifo_full[0]; // Write only if fifo is not full
+wire   sw_wr_en_5  = sw_wr_en  & (sw_addr == 4'h5) & !fifo_full[1]; // Write only if fifo is not full
+wire   sw_wr_en_6  = sw_wr_en  & (sw_addr == 4'h6) & !fifo_full[2]; // Write only if fifo is not full
+wire   sw_wr_en_7  = sw_wr_en  & (sw_addr == 4'h7) & !fifo_full[3]; // Write only if fifo is not full
+
+
+// Generated seperate write enable case to block the reg ack duration when fifo is full
+wire  sw_wr_en_t =  sw_wr_en_0 | sw_wr_en_1 | sw_wr_en_2 | sw_wr_en_3 | sw_wr_en_4 | sw_wr_en_5 | sw_wr_en_6 | sw_wr_en_7;
+
+
+always @ (posedge mclk or negedge h_reset_n)
+begin : preg_out_Seq
+   if (h_reset_n == 1'b0) begin
+      reg_rdata  <= 'h0;
+      reg_ack    <= 1'b0;
+   end else if (reg_cs && !reg_ack && sw_rd_en) begin
+      reg_rdata  <= reg_out[DW-1:0] ;
+      reg_ack    <= 1'b1;
+   end else if (reg_cs && !reg_ack && sw_wr_en_t) begin // Block Ack generation when FIFO is full
+      reg_ack    <= 1'b1;
+   end else begin
+      reg_ack    <= 1'b0;
+   end
+end
+
+//----------------------------------------
+// Hardware Command Register
+//  Assumption: Maximum 32 port assumed
+//----------------------------------------
+
+assign port0_enb    = reg_0[0];
+assign port1_enb    = reg_0[1];
+//assign port2_enb    = reg_0[2];
+//assign port3_enb    = reg_0[3];
+
+ generic_register	#(.WD(4)) u_reg_0(
+	      //List of Inputs
+	      .we         ({4{sw_wr_en_0 & 
+                          sw_be[0]   }}),
+	      .data_in    (sw_reg_wdata[3:0]),
+	      .reset_n    (h_reset_n        ),
+	      .clk        (mclk             ),
+	      
+	      //List of Outs
+	      .data_out   (reg_0[3:0]       )
+	      );
+
+// CONFIG-0
+assign cfg_reset_period = reg_1[15:0];
+gen_16b_reg  #(32'h0) u_reg_1	(
+	      //List of Inputs
+	      .reset_n    (h_reset_n           ),
+	      .clk        (mclk                ),
+	      .cs         (sw_wr_en_1          ),
+	      .we         (sw_be[1:0]          ),		 
+	      .data_in    (sw_reg_wdata[15:0]  ),
+	      
+	      //List of Outs
+	      .data_out   (reg_1[15:0]         )
+	      );
+
+// CONFIG-1
+
+assign cfg_th1_period  = reg_2[29:20]; // High Exit Period for Data-1
+assign cfg_th0_period  = reg_2[19:10];  // High Exit period for Data-0
+assign cfg_clk_period  = reg_2[9:0];
+
+gen_32b_reg  #(32'h0) u_reg_2	(
+	      //List of Inputs
+	      .reset_n    (h_reset_n     ),
+	      .clk        (mclk          ),
+	      .cs         (sw_wr_en_2    ),
+	      .we         (sw_be         ),		 
+	      .data_in    (sw_reg_wdata  ),
+	      
+	      //List of Outs
+	      .data_out   (reg_2         )
+	      );
+
+
+
+assign port0_dval =!fifo_empty[0];
+assign port1_dval =!fifo_empty[1];
+//assign port2_dval =!fifo_empty[2];
+//assign port3_dval =!fifo_empty[3];
+
+assign reg_3 = { 2'b00,fifo_empty[1],fifo_full[1],
+                 2'b00,fifo_empty[0],fifo_full[0]};
+
+
+//----------------------------------------------------
+//  DATA FIFO
+//----------------------------------------------------
+
+assign fifo_wr[0] = sw_wr_en_4 & reg_ack;
+assign fifo_wr[1] = sw_wr_en_5 & reg_ack;
+//assign fifo_wr[2] = sw_wr_en_6 & reg_ack;
+//assign fifo_wr[3] = sw_wr_en_7 & reg_ack;
+
+assign fifo_rd[0] = port0_rd;
+assign fifo_rd[1] = port1_rd;
+//assign fifo_rd[2] = port2_rd;
+//assign fifo_rd[3] = port3_rd;
+
+assign port0_data = fifo_rdata[0];
+assign port1_data = fifo_rdata[1];
+//assign port2_data = fifo_rdata[2];
+//assign port3_data = fifo_rdata[3];
+
+genvar port;
+generate
+for (port = 0; $unsigned(port) < NP; port=port+1) begin : gfifo
+
+sync_fifo #(.W(24), .D(8)) u_fifo
+           (
+            .clk         (mclk                 ),
+	        .reset_n     (h_reset_n            ),
+		    .wr_en       (fifo_wr[port]        ),
+		    .wr_data     (sw_reg_wdata[23:0]   ),
+		    .full        (fifo_full[port]      ),
+		    .empty       (fifo_empty[port]     ),
+		    .rd_en       (fifo_rd[port]        ),
+		    .rd_data     (fifo_rdata[port]     ) 
+           );
+
+end
+endgenerate // gfifo
+
+
+//-----------------------------------------------------------------------
+// Register Read Path Multiplexer instantiation
+//-----------------------------------------------------------------------
+
+always_comb
+begin 
+  reg_out [31:0] = 32'h0;
+
+  case (sw_addr [3:0])
+    4'b0000    : reg_out [31:0] = reg_0 [31:0];     
+    4'b0001    : reg_out [31:0] = reg_1 [31:0];    
+    4'b0010    : reg_out [31:0] = reg_2 [31:0];     
+    4'b0011    : reg_out [31:0] = reg_3 [31:0];    
+    4'b0100    : reg_out [31:0] = port0_data;
+    4'b0101    : reg_out [31:0] = port1_data;
+//    4'b0110    : reg_out [31:0] = port2_data;
+//    4'b0111    : reg_out [31:0] = port3_data;
+    default    : reg_out [31:0] = 32'h0;
+  endcase
+end
+endmodule
diff --git a/verilog/rtl/pinmux/src/ws281x_top.sv b/verilog/rtl/pinmux/src/ws281x_top.sv
new file mode 100644
index 0000000..6ab06fa
--- /dev/null
+++ b/verilog/rtl/pinmux/src/ws281x_top.sv
@@ -0,0 +1,194 @@
+//////////////////////////////////////////////////////////////////////////////
+// SPDX-FileCopyrightText: 2021 , Dinesh Annayya                          
+// 
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+// SPDX-License-Identifier: Apache-2.0
+// SPDX-FileContributor: Created by Dinesh Annayya <dinesha@opencores.org>
+//
+//////////////////////////////////////////////////////////////////////
+////                                                              ////
+////  ws281x Top                                                  ////
+////                                                              ////
+////  This file is part of the riscduino cores project            ////
+////  https://github.com/dineshannayya/riscduino.git              ////
+////                                                              ////
+////  Description                                                 ////
+////                                                              ////
+////  To Do:                                                      ////
+////    nothing                                                   ////
+////                                                              ////
+////  Author(s):                                                  ////
+////      - Dinesh Annayya, dinesha@opencores.org                 ////
+////                                                              ////
+////  Revision :                                                  ////
+////    0.1 - 23rd Aug 2022, Dinesh A                             ////
+////          initial version                                     ////
+//////////////////////////////////////////////////////////////////////
+
+module ws281x_top  (
+                       // System Signals
+                       // Inputs
+		               input logic           mclk,
+                       input logic           h_reset_n,
+
+		               // Reg Bus Interface Signal
+                       input logic           reg_cs,
+                       input logic           reg_wr,
+                       input logic [3:0]     reg_addr,
+                       input logic [31:0]    reg_wdata,
+                       input logic [3:0]     reg_be,
+
+                       // Outputs
+                       output logic [31:0]   reg_rdata,
+                       output logic          reg_ack,
+
+                       output logic [3:0]    txd 
+
+                ); 
+
+assign txd[2] = txd[0];
+assign txd[3] = txd[1];
+
+logic[15:0]    cfg_reset_period     ;   // Reset period interm of clk
+logic [9:0]    cfg_clk_period       ;   // Total bit clock period
+logic [9:0]    cfg_th0_period       ;   // bit-0 drive low period
+logic [9:0]    cfg_th1_period       ;   // bit-1 drive low period
+
+logic [23:0]   port0_data           ;
+logic [23:0]   port1_data           ;
+//logic [23:0]   port2_data         ;
+//logic [23:0]   port3_data         ;
+
+ws281x_reg  u_reg (
+                .mclk                ( mclk                 ),
+                .h_reset_n           ( h_reset_n            ),
+
+                .reg_cs              ( reg_cs               ),
+                .reg_wr              ( reg_wr               ),
+                .reg_addr            ( reg_addr             ),
+                .reg_wdata           ( reg_wdata            ),
+                .reg_be              ( reg_be               ),
+
+                .reg_rdata           ( reg_rdata            ),
+                .reg_ack             ( reg_ack              ),
+
+                .cfg_reset_period    ( cfg_reset_period     ),   // Reset period interm of clk
+                .cfg_clk_period      ( cfg_clk_period       ),   // Total bit clock period
+                .cfg_th0_period      ( cfg_th0_period       ),   // bit-0 drive low period
+                .cfg_th1_period      ( cfg_th1_period       ),   // bit-1 drive low period
+
+                .port0_enb           ( port0_enb            ),
+                .port0_rd            ( port0_rd             ),
+                .port0_data          ( port0_data           ),
+                .port0_dval          ( port0_dval           ),
+
+                .port1_enb           ( port1_enb            ),
+                .port1_rd            ( port1_rd             ),
+                .port1_data          ( port1_data           ),
+                .port1_dval          ( port1_dval           )
+
+                //.port2_enb           ( port2_enb            ),
+                //.port2_rd            ( port2_rd             ),
+                //.port2_data          ( port2_data           ),
+                //.port2_dval          ( port2_dval           ),
+
+                //.port3_enb           ( port3_enb            ),
+                //.port3_rd            ( port3_rd             ),    
+                //.port3_data          ( port3_data           ),
+                //.port3_dval          ( port3_dval           )  
+
+                ); 
+
+
+//wx281x port-0
+ws281x_driver u_txd_0(
+    .clk                 (mclk             ), // Clock input.
+    .reset_n             (h_reset_n        ), // Resets the internal state of the driver
+
+    .cfg_reset_period    (cfg_reset_period ), // Reset period interm of clk
+    .cfg_clk_period      (cfg_clk_period   ), // Total bit clock period
+    .cfg_th0_period      (cfg_th0_period   ), // bit-0 drive low period
+    .cfg_th1_period      (cfg_th1_period   ), // bit-1 drive low period
+
+    .port_enb            (port0_enb        ), 
+    .data_available      (port0_dval       ), 
+    .green_in            (port0_data[23:16]), // 8-bit green data
+    .red_in              (port0_data[15:8] ), // 8-bit red data
+    .blue_in             (port0_data[7:0]  ), // 8-bit blue data
+    .data_rd             (port0_rd         ), // data read
+
+    .txd                 (txd[0]           )  // Signal to send to WS2811 chain.
+    );
+
+//wx281x port-1
+ws281x_driver u_txd_1(
+    .clk                 (mclk             ), // Clock input.
+    .reset_n             (h_reset_n        ), // Resets the internal state of the driver
+
+    .cfg_reset_period    (cfg_reset_period ), // Reset period interm of clk
+    .cfg_clk_period      (cfg_clk_period   ), // Total bit clock period
+    .cfg_th0_period      (cfg_th0_period   ), // bit-0 drive low period
+    .cfg_th1_period      (cfg_th1_period   ), // bit-1 drive low period
+
+    .port_enb            (port1_enb        ), 
+    .data_available      (port1_dval       ), 
+    .green_in            (port1_data[23:16]), // 8-bit green data
+    .red_in              (port1_data[15:8] ), // 8-bit red data
+    .blue_in             (port1_data[7:0]  ), // 8-bit blue data
+    .data_rd             (port1_rd         ), // data read
+
+    .txd                 (txd[1]           )  // Signal to send to WS2811 chain.
+    );
+
+/***
+//wx281x port-2
+ws281x_driver u_txd_2(
+    .clk                 (mclk             ), // Clock input.
+    .reset_n             (h_reset_n        ), // Resets the internal state of the driver
+
+    .cfg_reset_period    (cfg_reset_period ), // Reset period interm of clk
+    .cfg_clk_period      (cfg_clk_period   ), // Total bit clock period
+    .cfg_th0_period      (cfg_th0_period   ), // bit-0 drive low period
+    .cfg_th1_period      (cfg_th1_period   ), // bit-1 drive low period
+
+    .port_enb            (port2_enb     ), 
+    .data_available      (port2_dval       ), 
+    .green_in            (port2_data[23:16]), // 8-bit green data
+    .red_in              (port2_data[15:8] ), // 8-bit red data
+    .blue_in             (port2_data[7:0]  ), // 8-bit blue data
+    .data_rd             (port2_rd         ), // data read
+
+    .txd                 (txd[2]           )  // Signal to send to WS2811 chain.
+    );
+
+//wx281x port-3
+ws281x_driver u_txd_3(
+    .clk                 (mclk             ), // Clock input.
+    .reset_n             (h_reset_n        ), // Resets the internal state of the driver
+
+    .cfg_reset_period    (cfg_reset_period ), // Reset period interm of clk
+    .cfg_clk_period      (cfg_clk_period   ), // Total bit clock period
+    .cfg_th0_period      (cfg_th0_period   ), // bit-0 drive low period
+    .cfg_th1_period      (cfg_th1_period   ), // bit-1 drive low period
+
+    .port_enb            (port3_enb        ), 
+    .data_available      (port3_dval       ), 
+    .green_in            (port3_data[23:16]), // 8-bit green data
+    .red_in              (port3_data[15:8] ), // 8-bit red data
+    .blue_in             (port3_data[7:0]  ), // 8-bit blue data
+    .data_rd             (port3_rd         ), // data read
+
+    .txd                 (txd[3]           )  // Signal to send to WS2811 chain.
+    );
+***/
+endmodule
diff --git a/verilog/rtl/qspim b/verilog/rtl/qspim
index 201a604..ee4d23b 160000
--- a/verilog/rtl/qspim
+++ b/verilog/rtl/qspim
@@ -1 +1 @@
-Subproject commit 201a6047f18db8ec792d948a52327b070013ab53
+Subproject commit ee4d23bb8a6edf84545f1aa0ba5db083d12440d7
diff --git a/verilog/rtl/uart/src/uart_rxfsm.sv b/verilog/rtl/uart/src/uart_rxfsm.sv
index 58916e6..7129b9c 100644
--- a/verilog/rtl/uart/src/uart_rxfsm.sv
+++ b/verilog/rtl/uart/src/uart_rxfsm.sv
@@ -36,6 +36,8 @@
 ////        1. initial version picked from                        ////
 ////          http://www.opencores.org/cores/oms8051mini          ////
 ////                                                              ////
+////    0.2 - 1st Sept 2022, Dinesh A                             ////
+////        1. Moved the Fifo Write to last stop phase            //// 
 //////////////////////////////////////////////////////////////////////
 ////                                                              ////
 //// Copyright (C) 2000 Authors and OPENCORES.ORG                 ////
@@ -140,6 +142,7 @@
       offset     <= offset + 1;
       case(rxstate)
        idle_st   : begin
+            fifo_wr <= 0;
             if(!si) begin // Start indication
                if(fifo_aval && cfg_rx_enable) begin
                  rxstate   <=   xfr_start;
@@ -171,7 +174,6 @@
                 fifo_data[cnt] <= si;
                 cnt            <= cnt+1;
                 if(cnt == 7) begin
-                   fifo_wr <= 1;
                    if(cfg_pri_mod == 2'b00)  // No Priority
                        rxstate <=   xfr_stop_st1;
                    else rxstate <= xfr_pri_st;  
@@ -179,7 +181,6 @@
              end
           end
        xfr_pri_st   : begin
-            fifo_wr <= 0;
             if(rxpos == offset) begin
                if(cfg_pri_mod == 2'b10)  // even priority
                   if( si != ^fifo_data) error_ind <= 2'b10;
@@ -189,21 +190,24 @@
             end
          end
        xfr_stop_st1  : begin
-          fifo_wr <= 0;
           if(rxpos == offset) begin
              if(si) begin
                if(cfg_stop_bit) // Two Stop bit
                   rxstate <=   xfr_stop_st2;
-               else   
+               else  begin  
+                  fifo_wr <= 1;
                   rxstate <=   idle_st;
+               end
              end else begin // Framing error
                 error_ind <= 2'b01;
+                fifo_wr <= 1;
                 rxstate   <=   idle_st;
              end
           end
        end
        xfr_stop_st2  : begin
           if(rxpos == offset) begin
+          fifo_wr <= 1;
              if(si) begin
                 rxstate <=   idle_st;
              end else begin // Framing error
diff --git a/verilog/rtl/user_defines.v b/verilog/rtl/user_defines.v
new file mode 100644
index 0000000..1e2cb90
--- /dev/null
+++ b/verilog/rtl/user_defines.v
@@ -0,0 +1,87 @@
+// SPDX-FileCopyrightText: 2020 Efabless Corporation
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+// SPDX-License-Identifier: Apache-2.0
+
+`default_nettype none
+
+`ifndef __USER_DEFINES_H
+// User GPIO initial configuration parameters
+`define __USER_DEFINES_H
+
+// Useful GPIO mode values.  These match the names used in defs.h.
+`define GPIO_MODE_MGMT_STD_INPUT_NOPULL    13'h0403
+`define GPIO_MODE_MGMT_STD_INPUT_PULLDOWN  13'h0803
+`define GPIO_MODE_MGMT_STD_INPUT_PULLUP    13'h0c03
+`define GPIO_MODE_MGMT_STD_OUTPUT          13'h1809
+`define GPIO_MODE_MGMT_STD_BIDIRECTIONAL   13'h1801
+`define GPIO_MODE_MGMT_STD_ANALOG          13'h000b
+
+`define GPIO_MODE_USER_STD_INPUT_NOPULL    13'h0402
+`define GPIO_MODE_USER_STD_INPUT_PULLDOWN  13'h0802
+`define GPIO_MODE_USER_STD_INPUT_PULLUP    13'h0c02
+`define GPIO_MODE_USER_STD_OUTPUT          13'h1808
+`define GPIO_MODE_USER_STD_BIDIRECTIONAL   13'h1800
+`define GPIO_MODE_USER_STD_OUT_MONITORED   13'h1802
+`define GPIO_MODE_USER_STD_ANALOG          13'h000a
+
+// The power-on configuration for GPIO 0 to 4 is fixed and cannot be
+// modified (allowing the SPI and debug to always be accessible unless
+// overridden by a flash program).
+
+// The values below can be any of the standard types defined above,
+// or they can be any 13-bit value if the user wants a non-standard
+// startup state for the GPIO.  By default, every GPIO from 5 to 37
+// is set to power up as an input controlled by the management SoC.
+// Users may want to redefine these so that the user project powers
+// up in a state that can be used immediately without depending on
+// the management SoC to run a startup program to configure the GPIOs.
+
+`define USER_CONFIG_GPIO_5_INIT  `GPIO_MODE_USER_STD_BIDIRECTIONAL     // UART_TXD[1]
+`define USER_CONFIG_GPIO_6_INIT  `GPIO_MODE_USER_STD_BIDIRECTIONAL     // UART_RXD[1]
+`define USER_CONFIG_GPIO_7_INIT  `GPIO_MODE_USER_STD_BIDIRECTIONAL
+`define USER_CONFIG_GPIO_8_INIT  `GPIO_MODE_USER_STD_BIDIRECTIONAL
+`define USER_CONFIG_GPIO_9_INIT  `GPIO_MODE_USER_STD_BIDIRECTIONAL
+`define USER_CONFIG_GPIO_10_INIT `GPIO_MODE_USER_STD_BIDIRECTIONAL
+`define USER_CONFIG_GPIO_11_INIT `GPIO_MODE_USER_STD_BIDIRECTIONAL
+`define USER_CONFIG_GPIO_12_INIT `GPIO_MODE_USER_STD_BIDIRECTIONAL
+`define USER_CONFIG_GPIO_13_INIT `GPIO_MODE_USER_STD_BIDIRECTIONAL
+`define USER_CONFIG_GPIO_14_INIT `GPIO_MODE_USER_STD_BIDIRECTIONAL
+
+// Configurations of GPIO 15 to 25 are used on caravel but not caravan.
+`define USER_CONFIG_GPIO_15_INIT `GPIO_MODE_USER_STD_BIDIRECTIONAL
+`define USER_CONFIG_GPIO_16_INIT `GPIO_MODE_USER_STD_BIDIRECTIONAL
+`define USER_CONFIG_GPIO_17_INIT `GPIO_MODE_USER_STD_BIDIRECTIONAL
+`define USER_CONFIG_GPIO_18_INIT `GPIO_MODE_USER_STD_BIDIRECTIONAL
+`define USER_CONFIG_GPIO_19_INIT `GPIO_MODE_USER_STD_BIDIRECTIONAL
+`define USER_CONFIG_GPIO_20_INIT `GPIO_MODE_USER_STD_BIDIRECTIONAL
+`define USER_CONFIG_GPIO_21_INIT `GPIO_MODE_USER_STD_BIDIRECTIONAL
+`define USER_CONFIG_GPIO_22_INIT `GPIO_MODE_USER_STD_BIDIRECTIONAL
+`define USER_CONFIG_GPIO_23_INIT `GPIO_MODE_USER_STD_BIDIRECTIONAL
+`define USER_CONFIG_GPIO_24_INIT `GPIO_MODE_USER_STD_BIDIRECTIONAL
+`define USER_CONFIG_GPIO_25_INIT `GPIO_MODE_USER_STD_BIDIRECTIONAL
+
+`define USER_CONFIG_GPIO_26_INIT `GPIO_MODE_USER_STD_BIDIRECTIONAL
+`define USER_CONFIG_GPIO_27_INIT `GPIO_MODE_USER_STD_BIDIRECTIONAL
+`define USER_CONFIG_GPIO_28_INIT `GPIO_MODE_USER_STD_BIDIRECTIONAL
+`define USER_CONFIG_GPIO_29_INIT `GPIO_MODE_USER_STD_BIDIRECTIONAL
+`define USER_CONFIG_GPIO_30_INIT `GPIO_MODE_USER_STD_BIDIRECTIONAL
+`define USER_CONFIG_GPIO_31_INIT `GPIO_MODE_USER_STD_BIDIRECTIONAL
+`define USER_CONFIG_GPIO_32_INIT `GPIO_MODE_USER_STD_BIDIRECTIONAL
+`define USER_CONFIG_GPIO_33_INIT `GPIO_MODE_USER_STD_BIDIRECTIONAL
+`define USER_CONFIG_GPIO_34_INIT `GPIO_MODE_USER_STD_BIDIRECTIONAL
+`define USER_CONFIG_GPIO_35_INIT `GPIO_MODE_USER_STD_BIDIRECTIONAL
+`define USER_CONFIG_GPIO_36_INIT `GPIO_MODE_USER_STD_BIDIRECTIONAL
+`define USER_CONFIG_GPIO_37_INIT `GPIO_MODE_USER_STD_BIDIRECTIONAL
+
+`endif // __USER_DEFINES_H
diff --git a/verilog/rtl/user_params.svh b/verilog/rtl/user_params.svh
new file mode 100644
index 0000000..7664338
--- /dev/null
+++ b/verilog/rtl/user_params.svh
@@ -0,0 +1,150 @@
+`ifndef USER_PARMS
+`define USER_PARMS
+
+// ASCI Representation of RISC = 32'h8273_8343
+parameter CHIP_SIGNATURE = 32'h8273_8343;
+// Software Reg-1, Release date: <DAY><MONTH><YEAR>
+parameter CHIP_RELEASE_DATE = 32'h0309_2022;
+// Software Reg-2: Poject Revison 5.1 = 0005200
+parameter CHIP_REVISION   = 32'h0005_3000;
+
+parameter SKEW_RESET_VAL = 32'b0000_0000_1000_0111_1001_1000_1001_1000;
+
+parameter PSTRAP_DEFAULT_VALUE = 15'b000_0111_1011_0000;
+
+/*****************************************************
+pad_strap_in decoding
+     bit[1:0] - System Clock Source Selection for wbs/riscv
+                 00 - User clock1 (Default)
+                 01 - User clock2 
+                 10 - Internal PLL
+                 11 - Xtal
+     bit[3:2] - Clock Division for wbs/riscv
+                 00 - 0 Div       (Default)
+                 01 - 2 Div       
+                 10 - 4 Div
+                 11 - 8 Div
+     bit [4]   - uart master config control
+                 0   - load from LA
+                 1   - constant value based 
+                       on system clock selection  (Default)
+     bit [5]   - QSPI SRAM Mode Selection
+                 1'b0 - Single    
+                 1'b1 - Quad      (Default)
+     bit [7:6] - QSPI Fash Mode Selection
+                 2'b00 - Single   
+                 2'b01 - Double
+                 2'b10 - Quad     (Default
+                 2'b11 - QDDR
+     bit [8]   - Riscv Reset control
+                 0 - Keep Riscv on Reset
+                 1 - Removed Riscv on Power On Reset (Default)
+     bit [9]   - Riscv Cache Bypass
+                 0 - Cache Enable
+                 1 - Bypass cache  (Default)
+     bit [10]  - Riscv SRAM clock edge selection
+                 0 - Normal
+                 1 - Invert        (Default)
+     bit [12:11] - Skew selection
+                 2'b00 - Default value  (Default)
+                 2'b01 - Default value + 2               
+                 2'b10 - Default value + 4               
+                 2'b11 - Default value - 4 
+
+     bit[15]   - Strap Mode
+                0 - [14:0] loaded from pad
+                1 - Default reset value loaded
+                    PSTRAP_DEFAULT_VALUE
+****************************************************/
+
+`define PSTRAP_CLK_SRC             1:0
+`define PSTRAP_CLK_DIV             3:2
+`define PSTRAP_UARTM_CFG           4
+`define PSTRAP_QSPI_SRAM           5
+`define PSTRAP_QSPI_FLASH          7:6
+`define PSTRAP_RISCV_RESET_MODE    8
+`define PSTRAP_RISCV_CACHE_BYPASS  9
+`define PSTRAP_RISCV_SRAM_CLK_EDGE 10
+`define PSTRAP_CLK_SKEW            12:11
+
+`define PSTRAP_DEFAULT_VALUE       15
+
+/************************************************************
+system strap decoding
+     bit[1:0] - System Clock Source Selection for wbs
+                 00 - User clock1 
+                 01 - User clock2 
+                 10 - Internal PLL
+                 11 - Xtal
+     bit[3:2] - Clock Division for wbs
+                 00 - 0 Div
+                 01 - 2 Div
+                 10 - 4 Div
+                 11 - 8 Div
+     bit[5:4] - System Clock Source Selection for riscv
+                 00 - User clock1 
+                 01 - User clock2 
+                 10 - Internal PLL
+                 11 - Xtal
+     bit[7:6] - Clock Division for riscv
+                 00 - 0 Div
+                 01 - 2 Div
+                 10 - 4 Div
+                 11 - 8 Div
+     bit [8]   - uart master config control
+                 0   - load from LA
+                 1   - constant value based on system clock selection
+     bit [9]   - QSPI SRAM Mode Selection CS#2
+                 1'b0 - Single
+                 1'b1 - Quad
+     bit [11:10] - QSPI FLASH Mode Selection CS#0
+                 2'b00 - Single
+                 2'b01 - Double
+                 2'b10 - Quad
+                 2'b11 - QDDR
+     bit [12]  - Riscv Reset control
+                 0 - Keep Riscv on Reset
+                 1 - Removed Riscv on Power On Reset
+     bit [13]   - Riscv Cache Bypass
+                 1 - Cache Enable
+                 0 - Bypass cache
+     bit [14]  - Riscv SRAM clock edge selection
+                 0 - Normal
+                 1 - Invert
+
+     bit [15]    -  Soft Reboot Request
+     bit [17:16] -  cfg_cska_wi Skew selection      
+     bit [19:18] -  cfg_cska_wh Skew selection        
+     bit [21:20] -  cfg_cska_riscv Skew selection      
+     bit [23:22] -  cfg_cska_qspi  Skew selection      
+     bit [25:24] -  cfg_cska_uart  Skew selection       
+     bit [27:26] -  cfg_cska_pinmux Skew selection     
+     bit [29:28] -  cfg_cska_qspi_co Skew selection    
+
+
+********************************************************/
+// Stikcy Strap
+`define STRAP_WB_CLK_SRC           1:0
+`define STRAP_WB_CLK_DIV           3:2
+`define STRAP_RISCV_CLK_SRC        5:4
+`define STRAP_RISCV_CLK_DIV        7:6
+`define STRAP_UARTM_CFG            8
+`define STRAP_QSPI_SRAM            9
+`define STRAP_QSPI_FLASH           11:10
+`define STRAP_RISCV_RESET_MODE     12
+`define STRAP_RISCV_CACHE_BYPASS   13
+`define STRAP_RISCV_SRAM_CLK_EDGE  14
+`define STRAP_QSPI_PRE_SRAM        15      // Previous SRAM Strap Status
+`define STRAP_CLK_SKEW_WI          17:16
+`define STRAP_CLK_SKEW_WH          19:18
+`define STRAP_CLK_SKEW_RISCV       21:20
+`define STRAP_CLK_SKEW_QSPI        23:22
+`define STRAP_CLK_SKEW_UART        25:24
+`define STRAP_CLK_SKEW_PINMUX      27:26
+`define STRAP_CLK_SKEW_QSPI_CO     29:28
+`define STRAP_QSPI_INIT_BYPASS     30
+`define STRAP_SOFT_REBOOT_REQ      31
+
+
+`endif // USER_PARMS
+
diff --git a/verilog/rtl/user_project_wrapper.v b/verilog/rtl/user_project_wrapper.v
index 3429628..cc05b3a 100644
--- a/verilog/rtl/user_project_wrapper.v
+++ b/verilog/rtl/user_project_wrapper.v
@@ -25,17 +25,21 @@
 ////  Description                                                 ////
 ////      This is digital core and integrate all the main block   ////
 ////      here.  Following block are integrated here              ////
-////      1. Risc V Core                                          ////
-////      2. Quad SPI Master                                      ////
-////      3. Wishbone Cross Bar                                   ////
-////      4. UART                                                 ////
-////      5, USB 1.1                                              ////
-////      6. SPI Master (Single)                                  ////
-////      7. TCM SRAM 2KB                                         ////
-////      8. 2KB icache and 2KB dcache                            ////
-////      8. 6 Channel ADC                                        ////
-////      9. Pinmux with GPIO and 6 PWM                           ////
-////
+////      1.  2x 32 bit Risc V Core                               ////
+////      2.  Quad SPI Master(SPI Flash/SRAM)                     ////
+////      3.  Wishbone Cross Bar                                  ////
+////      4.  2 x UART                                            ////
+////      5,  USB 1.1 Host                                        ////
+////      6.  SPI Master (Single)                                 ////
+////      7.  TCM SRAM 2KB                                        ////
+////      8.  2KB icache and 2KB dcache                           ////
+////      9.  6 Channel ADC (Pending)                             ////
+////      10. Pinmux with GPIO and 6 PWM                          ////
+////      11. 15 x hardware Semaphore                             ////
+////      12. 4 x ws281x driver                                   //// 
+////      13. 3 x Hardware Timer                                  ////
+////      14. UART Master                                         ////
+////      15. SPI Slave (As Arduino ISP)                          ////
 ////                                                              ////
 ////  To Do:                                                      ////
 ////    nothing                                                   ////
@@ -178,7 +182,7 @@
 ////       wishbone slave clock generation config increase from   ////
 ////       3 to 4 bit support clock source selection              ////
 ////       B.  Changed Module: qspim                              ////
-//////      1. Bug fix in spi rise and fall pulse relation w.r.t  ////
+////        1. Bug fix in spi rise and fall pulse relation w.r.t  ////
 ////           spi_clk. Note: Previous version work only with     ////
 ////           spi clock config = 0x2                             ////
 ////        2. spi_oen generation fix for different spi mode      ////
@@ -202,7 +206,7 @@
 ////    4.2  April 6 2022, Dinesh A                               ////
 ////         1. SSPI CS# increased from 1 to 4                    ////
 ////         2. uart port increase to two                         ////
-////    4.3  May 23 2022, Dinesh A                                ////
+////    4.3  May 24 2022, Dinesh A                                ////
 ////         Re targetted the design to mpw-6 tools set and risc  ////
 ////         core logic are timing optimized to 100mhz            ////
 ////    4.4  May 29 2022, Dinesh A                                ////
@@ -230,6 +234,31 @@
 ////             `define ADDR_SPACE_PWM     32'h1002_0080         ////
 ////             `define ADDR_SPACE_TIMER   32'h1002_00C0         ////
 ////             `define ADDR_SPACE_SEMA    32'h1002_0100         ////
+////    5.1  Aug 24 2022, Dinesh A                                ////
+////          A. GPIO interrupt generation changed from 1 to 32   ////
+////          B. Total interrupt to Riscv changed from 16 to 32   ////
+////          C. uart_master disable option added at pinmux       ////
+////          D. Timer interrupt related clean-up                 ////
+////          E. 4x ws281x driver logic added                     ////
+////          F. 4x ws281x driver are mux with 16x gpio           ////
+////          G. gpio type select the normal gpio vs ws281x       ////
+////    5.2  Aug 26 2022, Dinesh A                                ////
+////          A. We have copied the user_defines.h from caravel   ////
+////          and configured all the GPIO from 5 onwards as       ////
+////          GPIO_MODE_USER_STD_BIDIRECTIONAL                    ////
+////                                                              ////
+////          As digitial-io[0-5] reserved at power up.           ////
+////          B. to keep at least one uart access,                ////
+////              we have moved UART_RXD[1] from io[3] to io[6]   ////
+////          C. SPI Slave SSN move from io[0] to [7]             ////
+////    5.3  Sept 2 2022, Dinesh A                                ////
+////          A. System Strap implementation                      ////
+////          B. Arduino pins are moved to take care of caravel   ////
+////            digital-io[0-4] resevred                          ////
+////          C. global register space increased from 16 to 32    ////
+////          D. reset fsm is implementation with soft reboot     ////
+////             option                                           ////
+////          E. strap based booting option added for qspi        ////
 ////                                                              ////
 //////////////////////////////////////////////////////////////////////
 ////                                                              ////
@@ -284,6 +313,52 @@
        0x3000_0000 to 0x307F_FFFF  - Indirect Address
                                      {Bank_Sel[15:3],WB ADDR[18:0]}
 ***********************************************************************/
+/***********************************************************************
+ * Caravel I/O mapping 
+ *
+ * mprj_io[37]  io_in/out/oeb/in_3v3[26]  ---                    ---
+ * mprj_io[36]  io_in/out/oeb/in_3v3[25]  ---                    ---
+ * mprj_io[35]  io_in/out/oeb/in_3v3[24]  gpio_analog/noesd[17]  ---
+ * mprj_io[34]  io_in/out/oeb/in_3v3[23]  gpio_analog/noesd[16]  ---
+ * mprj_io[33]  io_in/out/oeb/in_3v3[22]  gpio_analog/noesd[15]  ---
+ * mprj_io[32]  io_in/out/oeb/in_3v3[21]  gpio_analog/noesd[14]  ---
+ * mprj_io[31]  io_in/out/oeb/in_3v3[20]  gpio_analog/noesd[13]  ---
+ * mprj_io[30]  io_in/out/oeb/in_3v3[19]  gpio_analog/noesd[12]  ---
+ * mprj_io[29]  io_in/out/oeb/in_3v3[18]  gpio_analog/noesd[11]  ---
+ * mprj_io[28]  io_in/out/oeb/in_3v3[17]  gpio_analog/noesd[10]  ---
+ * mprj_io[27]  io_in/out/oeb/in_3v3[16]  gpio_analog/noesd[9]   ---
+ * mprj_io[26]  io_in/out/oeb/in_3v3[15]  gpio_analog/noesd[8]   ---
+ * mprj_io[25]  io_in/out/oeb/in_3v3[14]  gpio_analog/noesd[7]   ---
+ * mprj_io[24]  ---                       ---                    user_analog[10]
+ * mprj_io[23]  ---                       ---                    user_analog[9]
+ * mprj_io[22]  ---                       ---                    user_analog[8]
+ * mprj_io[21]  ---                       ---                    user_analog[7]
+ * mprj_io[20]  ---                       ---                    user_analog[6]  clamp[2]
+ * mprj_io[19]  ---                       ---                    user_analog[5]  clamp[1]
+ * mprj_io[18]  ---                       ---                    user_analog[4]  clamp[0]
+ * mprj_io[17]  ---                       ---                    user_analog[3]
+ * mprj_io[16]  ---                       ---                    user_analog[2]
+ * mprj_io[15]  ---                       ---                    user_analog[1]
+ * mprj_io[14]  ---                       ---                    user_analog[0]
+ * mprj_io[13]  io_in/out/oeb/in_3v3[13]  gpio_analog/noesd[6]   ---
+ * mprj_io[12]  io_in/out/oeb/in_3v3[12]  gpio_analog/noesd[5]   ---
+ * mprj_io[11]  io_in/out/oeb/in_3v3[11]  gpio_analog/noesd[4]   ---
+ * mprj_io[10]  io_in/out/oeb/in_3v3[10]  gpio_analog/noesd[3]   ---
+ * mprj_io[9]   io_in/out/oeb/in_3v3[9]   gpio_analog/noesd[2]   ---
+ * mprj_io[8]   io_in/out/oeb/in_3v3[8]   gpio_analog/noesd[1]   ---
+ * mprj_io[7]   io_in/out/oeb/in_3v3[7]   gpio_analog/noesd[0]   ---
+ * mprj_io[6]   io_in/out/oeb/in_3v3[6]   ---                    ---
+ * mprj_io[5]   io_in/out/oeb/in_3v3[5]   ---                    ---
+ * mprj_io[4]   io_in/out/oeb/in_3v3[4]   ---                    ---
+ * mprj_io[3]   io_in/out/oeb/in_3v3[3]   ---                    ---
+ * mprj_io[2]   io_in/out/oeb/in_3v3[2]   ---                    ---
+ * mprj_io[1]   io_in/out/oeb/in_3v3[1]   ---                    ---
+ * mprj_io[0]   io_in/out/oeb/in_3v3[0]   ---                    ---
+
+
+************************************************************************/
+
+`include "user_params.svh"
 
 module user_project_wrapper (
 `ifdef USE_POWER_PINS
@@ -459,7 +534,7 @@
 //    Global Register Wishbone Interface
 //---------------------------------------------------------------------
 wire                           wbd_glbl_stb_o                         ; // strobe/request
-wire   [8:0]                   wbd_glbl_adr_o                         ; // address
+wire   [9:0]                   wbd_glbl_adr_o                         ; // address
 wire                           wbd_glbl_we_o                          ; // write
 wire   [WB_WIDTH-1:0]          wbd_glbl_dat_o                         ; // data output
 wire   [3:0]                   wbd_glbl_sel_o                         ; // byte enable
@@ -504,7 +579,7 @@
 wire                           wbd_int_rst_n                          ;
 wire                           wbd_pll_rst_n                          ;
 
-wire [15:0]                    irq_lines                              ;
+wire [31:0]                    irq_lines                              ;
 wire                           soft_irq                               ;
 
 
@@ -526,7 +601,7 @@
 wire [3:0]                     cfg_cska_pinmux_rp                     ; // clock skew adjust for pinmux
 wire [3:0]                     cfg_cska_qspi_co_rp                    ; // clock skew adjust for global reg
 
-wire [15:0]                    irq_lines_rp                           ; // Repeater
+wire [31:0]                    irq_lines_rp                           ; // Repeater
 wire                           soft_irq_rp                            ; // Repeater
 
 wire                           wbd_clk_risc_rp                        ;
@@ -661,6 +736,17 @@
 
 wire [3:0]                     spi_csn                                ;
 
+//---------------------------------------------------------------------
+// Strap
+//---------------------------------------------------------------------
+wire [31:0]                    system_strap                           ;
+wire [31:0]                    strap_sticky                           ;
+wire [1:0]  strap_qspi_flash       = system_strap[`STRAP_QSPI_FLASH];
+wire        strap_qspi_sram        = system_strap[`STRAP_QSPI_SRAM];
+wire        strap_qspi_pre_sram    = system_strap[`STRAP_QSPI_PRE_SRAM];
+wire        strap_qspi_init_bypass = system_strap[`STRAP_QSPI_INIT_BYPASS];
+
+
 //--------------------------------------------------------------------------
 // Pinmux Risc core config
 // -------------------------------------------------------------------------
@@ -694,10 +780,18 @@
 `endif
           .user_clock1             (wb_clk_i                ),
           .user_clock2             (user_clock2             ),
+          .int_pll_clock           (int_pll_clock             ),
 
           .cpu_clk                 (cpu_clk                 ),
-          .rtc_clk                 (rtc_clk                 ),
-          .usb_clk                 (usb_clk                 ),
+
+       // to/from Pinmux
+          .xtal_clk                (xtal_clk                ),
+	      .e_reset_n               (e_reset_n               ),  // external reset
+	      .p_reset_n               (p_reset_n               ),  // power-on reset
+          .s_reset_n               (s_reset_n               ),  // soft reset
+          .cfg_strap_pad_ctrl      (cfg_strap_pad_ctrl      ),
+	      .system_strap            (system_strap            ),
+	      .strap_sticky            (strap_sticky            ),
 
           .wbd_int_rst_n           (wbd_int_rst_n           ),
           .wbd_pll_rst_n           (wbd_pll_rst_n           ),
@@ -1023,6 +1117,11 @@
           .mclk                    (wbd_clk_spi             ),
           .rst_n                   (qspim_rst_n             ),
 
+          .strap_flash             (strap_qspi_flash        ),
+          .strap_pre_sram          (strap_qspi_pre_sram     ),
+          .strap_sram              (strap_qspi_sram         ),
+          .cfg_init_bypass         (strap_qspi_init_bypass  ),
+
     // Clock Skew Adjust
           .cfg_cska_sp_co          (cfg_cska_qspi_co_rp     ),
           .cfg_cska_spi            (cfg_cska_qspi_rp        ),
@@ -1056,8 +1155,8 @@
 
 wb_interconnect  #(
 	`ifndef SYNTHESIS
-          .CH_CLK_WD               (4                       ),
-	  .CH_DATA_WD              (37                      )
+          .CH_CLK_WD           (4                       ),
+	      .CH_DATA_WD          (53                      )
         `endif
 	) u_intercon (
 `ifdef USE_POWER_PINS
@@ -1077,24 +1176,24 @@
 	  .ch_data_in              ({
 			 
 	                              soft_irq,
-			              irq_lines[15:0],
+			                      irq_lines[31:0],
 
-			              cfg_cska_qspi_co[3:0],
-		                      cfg_cska_pinmux[3:0],
-			              cfg_cska_uart[3:0],
-		                      cfg_cska_qspi[3:0],
-                                      cfg_cska_riscv[3:0]
+			                      cfg_cska_qspi_co[3:0],
+		                          cfg_cska_pinmux[3:0],
+			                      cfg_cska_uart[3:0],
+		                          cfg_cska_qspi[3:0],
+                                  cfg_cska_riscv[3:0]
 			             }                             ),
 	  .ch_data_out             ({
 
 	                              soft_irq_rp,
-			              irq_lines_rp[15:0],
+			                      irq_lines_rp[31:0],
 
-			              cfg_cska_qspi_co_rp[3:0],
-		                      cfg_cska_pinmux_rp[3:0],
-			              cfg_cska_uart_rp[3:0],
-		                      cfg_cska_qspi_rp[3:0],
-                                      cfg_cska_riscv_rp[3:0]
+			                      cfg_cska_qspi_co_rp[3:0],
+		                          cfg_cska_pinmux_rp[3:0],
+			                      cfg_cska_uart_rp[3:0],
+		                          cfg_cska_qspi_rp[3:0],
+                                  cfg_cska_riscv_rp[3:0]
                                     }                              ),
      // Clock Skew adjust
 	  .wbd_clk_int             (wbd_clk_int             ), 
@@ -1211,7 +1310,7 @@
           .usb_rstn                (usb_rst_n               ), // USB reset
           .spi_rstn                (sspim_rst_n             ), // SPI reset
           .app_clk                 (wbd_clk_uart_skew       ),
-	  .usb_clk                 (usb_clk                 ),
+	      .usb_clk                 (usb_clk                 ),
 
         // Reg Bus Interface Signal
           .reg_cs                  (wbd_uart_stb_o          ),
@@ -1268,8 +1367,22 @@
         // System Signals
         // Inputs
           .mclk                    (wbd_clk_pinmux_skew     ),
-          .h_reset_n               (wbd_int_rst_n           ),
+          .e_reset_n               (e_reset_n               ),
+          .p_reset_n               (p_reset_n               ),
+          .s_reset_n               (wbd_int_rst_n           ),
 
+          .cfg_strap_pad_ctrl      (cfg_strap_pad_ctrl      ),
+          .system_strap            (system_strap            ),
+          .strap_sticky            (strap_sticky            ),
+
+          .user_clock1             (wb_clk_i                ),
+          .user_clock2             (user_clock2             ),
+          .int_pll_clock           (int_pll_clock           ),
+          .xtal_clk                (xtal_clk                ),
+
+
+          .rtc_clk                 (rtc_clk                 ),
+          .usb_clk                 (usb_clk                 ),
 	// Reset Control
           .cpu_core_rst_n          (cpu_core_rst_n          ),
           .cpu_intf_rst_n          (cpu_intf_rst_n          ),
@@ -1279,7 +1392,7 @@
           .i2cm_rst_n              (i2c_rst_n               ),
           .usb_rst_n               (usb_rst_n               ),
 
-	  .cfg_riscv_ctrl          (cfg_riscv_ctrl          ),
+	      .cfg_riscv_ctrl          (cfg_riscv_ctrl          ),
 
         // Reg Bus Interface Signal
           .reg_cs                  (wbd_glbl_stb_o          ),
diff --git a/verilog/rtl/user_reg_map.v b/verilog/rtl/user_reg_map.v
index 53d8331..80de782 100644
--- a/verilog/rtl/user_reg_map.v
+++ b/verilog/rtl/user_reg_map.v
@@ -10,10 +10,10 @@
 `define ADDR_SPACE_UART1   32'h3001_0100
 `define ADDR_SPACE_PINMUX  32'h3002_0000
 `define ADDR_SPACE_GLBL    32'h3002_0000
-`define ADDR_SPACE_GPIO    32'h3002_0040
-`define ADDR_SPACE_PWM     32'h3002_0080
-`define ADDR_SPACE_TIMER   32'h3002_00C0
-`define ADDR_SPACE_SEMA    32'h3002_0100
+`define ADDR_SPACE_GPIO    32'h3002_0080
+`define ADDR_SPACE_PWM     32'h3002_0100
+`define ADDR_SPACE_TIMER   32'h3002_0180
+`define ADDR_SPACE_SEMA    32'h3002_0200
 `define ADDR_SPACE_WBHOST  32'h3008_0000
 
 //--------------------------------------------------
@@ -34,12 +34,19 @@
 `define GLBL_CFG_INTR_MSK      8'h0C  // reg_3  - Global Interrupt Mask
 `define GLBL_CFG_INTR_STAT     8'h10  // reg_4  - Global Interrupt
 `define GLBL_CFG_MUTI_FUNC     8'h14  // reg_5  - Multi functional sel
-`define GLBL_CFG_SOFT_REG_0    8'h18  // reg_6 - Sof Register
-`define GLBL_CFG_SOFT_REG_1    8'h1C  // reg_7 - Sof Register
-`define GLBL_CFG_SOFT_REG_2    8'h20  // reg_8 - Sof Register
-`define GLBL_CFG_SOFT_REG_3    8'h24  // reg_9 - Sof Register
-`define GLBL_CFG_SOFT_REG_4    8'h28  // reg_10 - Sof Register
-`define GLBL_CFG_SOFT_REG_5    8'h2C  // reg_11 - Sof Register
+`define GLBL_CFG_CLK_CTRL      8'h18  // reg_6  - RTC/USB CLK CTRL
+`define GLBL_CFG_PAD_STRAP     8'h30  // Strap as seen in Pad
+`define GLBL_CFG_STRAP_STICKY  8'h34  // Sticky Strap used in next soft boot
+`define GLBL_CFG_SYSTEM_STRAP  8'h38  // Current System Strap
+`define GLBL_CFG_MAIL_BOX      8'h3C  // reg_15 - Mail Box
+`define GLBL_CFG_SOFT_REG_0    8'h40  // reg_16 - Sof Register
+`define GLBL_CFG_SOFT_REG_1    8'h44  // reg_17 - Sof Register
+`define GLBL_CFG_SOFT_REG_2    8'h48  // reg_18 - Sof Register
+`define GLBL_CFG_SOFT_REG_3    8'h4C  // reg_19 - Sof Register
+`define GLBL_CFG_SOFT_REG_4    8'h50  // reg_20 - Sof Register
+`define GLBL_CFG_SOFT_REG_5    8'h54  // reg_21 - Sof Register
+`define GLBL_CFG_SOFT_REG_6    8'h58  // reg_22 - Sof Register
+`define GLBL_CFG_SOFT_REG_7    8'h5C  // reg_23 - Sof Register
 
 //--------------------------------------------------
 // GPIO Register
diff --git a/verilog/rtl/wb_host/src/wb_host.sv b/verilog/rtl/wb_host/src/wb_host.sv
index d3d85cc..766a87d 100644
--- a/verilog/rtl/wb_host/src/wb_host.sv
+++ b/verilog/rtl/wb_host/src/wb_host.sv
@@ -50,6 +50,9 @@
 ////              indirect Map {Bank_Sel[15:3], wbm_adr_i[18:0]}  ////
 ////          2.wbm_cyc_i need to qualified with wbm_stb_i        //// 
 ////                                                              ////
+////    0.5 - Aug 30 2022, Dinesh A                               ////
+////          A. System strap related changes, reset_fsm added    ////
+////          B. rtc and usb clock moved to pinmux                ////
 ////                                                              //// 
 //////////////////////////////////////////////////////////////////////
 ////                                                              ////
@@ -78,6 +81,8 @@
 ////                                                              ////
 //////////////////////////////////////////////////////////////////////
 
+`include "user_params.svh"
+
 module wb_host (
 
 `ifdef USE_POWER_PINS
@@ -88,12 +93,23 @@
        input logic                 user_clock2      ,
 
        output logic                cpu_clk          ,
-       output logic                rtc_clk          ,
-       output logic                usb_clk          ,
+
        // Global Reset control
        output logic                wbd_int_rst_n    ,
        output logic                wbd_pll_rst_n    ,
 
+
+       // to/from Pinmux
+        output  logic              int_pll_clock     ,
+        input   logic              xtal_clk          ,
+	    output  logic              e_reset_n         ,  // external reset
+	    output  logic              p_reset_n         ,  // power-on reset
+        output  logic              s_reset_n         ,  // soft reset
+        output  logic              cfg_strap_pad_ctrl,
+	    output  logic [31:0]       system_strap      ,
+	    input   logic [31:0]       strap_sticky      ,
+
+
     // Master Port
        input   logic               wbm_rst_i        ,  // Regular Reset signal
        input   logic               wbm_clk_i        ,  // System clock
@@ -173,13 +189,11 @@
 logic               sw_wr_en_3;
 logic [15:0]        cfg_bank_sel;
 logic [31:0]        reg_0;  // Software_Reg_0
-logic [31:0]        cfg_clk_ctrl2;
+logic [8:0]         cfg_clk_ctrl2;
 
 logic  [31:0]       cfg_pll_ctrl; 
-logic  [7:0]        cfg_wb_clk_ctrl;
-logic  [7:0]        cfg_cpu_clk_ctrl;
-logic  [7:0]        cfg_rtc_clk_ctrl;
-logic  [7:0]        cfg_usb_clk_ctrl;
+logic  [3:0]        cfg_wb_clk_ctrl;
+logic  [3:0]        cfg_cpu_clk_ctrl;
 logic  [31:0]       cfg_glb_ctrl;
 
 
@@ -222,19 +236,25 @@
 logic               wb_err_int            ; // error
 
 logic [3:0]         cfg_mon_sel           ;
-logic               int_pll_clock         ;
 logic               pll_clk_div16         ;
 logic               pll_clk_div16_buf     ;
 logic [2:0]         cfg_ref_pll_div       ;
+logic               arst_n                ;
+logic               soft_reboot           ;
+logic               clk_enb               ;
+
+assign	  e_reset_n              = wbm_rst_n ;  // sync external reset
+assign    cfg_strap_pad_ctrl     = !p_reset_n;
+
+wire      soft_boot_req     = strap_sticky[`STRAP_SOFT_REBOOT_REQ];
 
 
-assign cfg_pll_enb      = cfg_glb_ctrl[15];
-assign cfg_ref_pll_div  = cfg_glb_ctrl[14:12];
-assign cfg_mon_sel      = cfg_glb_ctrl[11:8];
-
-assign cfg_dco_mode     = cfg_pll_ctrl[31];
-assign cfg_pll_fed_div  = cfg_pll_ctrl[30:26];
-assign cfg_dc_trim      = cfg_pll_ctrl[25:0];
+//------------------------------------------
+// PLL Trim Value
+//-----------------------------------------
+assign    cfg_dco_mode     = cfg_pll_ctrl[31];
+assign    cfg_pll_fed_div  = cfg_pll_ctrl[30:26];
+assign    cfg_dc_trim      = cfg_pll_ctrl[25:0];
 
 //assign   int_pll_clock    = pll_clk_out[0];
 ctech_clk_buf u_clkbuf_pll     (.A (pll_clk_out[0]), . X(int_pll_clock));
@@ -243,48 +263,81 @@
 
 // Debug clock monitor optin
 assign dbg_clk_mon  = (cfg_mon_sel == 4'b000) ? pll_clk_div16_buf:
-	              (cfg_mon_sel == 4'b001) ? pll_ref_clk  :
-	              (cfg_mon_sel == 4'b010) ? wbs_clk_out  :
-	              (cfg_mon_sel == 4'b011) ? cpu_clk_int  :
-	              (cfg_mon_sel == 4'b100) ? rtc_clk_div  :
-	              (cfg_mon_sel == 4'b101) ? usb_clk_int  : 1'b0;
+	                  (cfg_mon_sel == 4'b001) ? pll_ref_clk  :
+	                  (cfg_mon_sel == 4'b010) ? wbs_clk_out  :
+	                  (cfg_mon_sel == 4'b011) ? cpu_clk_int  : 1'b0;
 
 
 
-// Reset control
-ctech_buf u_buf_wb_rst        (.A(cfg_glb_ctrl[0]),.X(wbd_int_rst_n));
-ctech_buf u_buf_pll_rst       (.A(cfg_glb_ctrl[1]),.X(wbd_pll_rst_n));
 
 //--------------------------------------------------------------------------------
 // Look like wishbone reset removed early than user Power up sequence
 // To control the reset phase, we have added additional control through la[0]
 // ------------------------------------------------------------------------------
-wire    arst_n = !wbm_rst_i & la_data_in[0];
+assign    arst_n = !wbm_rst_i;
 reset_sync  u_wbm_rst (
-	      .scan_mode  (1'b0           ),
+	          .scan_mode  (1'b0           ),
               .dclk       (wbm_clk_i      ), // Destination clock domain
-	      .arst_n     (arst_n         ), // active low async reset
+	          .arst_n     (arst_n         ), // active low async reset
               .srst_n     (wbm_rst_n      )
           );
 
 reset_sync  u_wbs_rst (
-	      .scan_mode  (1'b0           ),
+	          .scan_mode  (1'b0           ),
               .dclk       (wbs_clk_i      ), // Destination clock domain
-	      .arst_n     (arst_n         ), // active low async reset
+	          .arst_n     (s_reset_n      ), // active low async reset
               .srst_n     (wbs_rst_n      )
           );
 
+//------------------------------------------
+// Reset FSM
+//------------------------------------------
+// Keep WBS in Ref clock during initial boot to strap loading 
+logic force_refclk;
+wb_reset_fsm u_reset_fsm (
+	      .clk                 (wbm_clk_i   ),
+	      .e_reset_n           (e_reset_n   ),  // external reset
+          .cfg_fast_sim        (cfg_fast_sim),
+          .soft_boot_req       (soft_boot_req),
+
+	      .p_reset_n           (p_reset_n   ),  // power-on reset
+	      .s_reset_n           (s_reset_n   ),  // soft reset
+          .clk_enb             (clk_enb     ),
+          .soft_reboot         (soft_reboot ),
+          .force_refclk        (force_refclk)
+
+);
+
+
+//-------------------------------------------------
+// UART2WB HOST
+//    Uart Baud-16x computation
+//      Assumption is default wb clock is 40Mhz 
+//      For 9600 Baud
+//        40,000,000/(9600*16) = 260;
+//      Configured Value = 260-1 = 259
+//-------------------------------------------------
+
+wire strap_uart_cfg_mode = system_strap[`STRAP_UARTM_CFG];
+
+wire       cfg_uartm_tx_enable   = (strap_uart_cfg_mode) ? la_data_in[1]     : 1'b1;
+wire       cfg_uartm_rx_enable   = (strap_uart_cfg_mode) ? la_data_in[2]     : 1'b1;
+wire       cfg_uartm_stop_bit    = (strap_uart_cfg_mode) ? la_data_in[3]     : 1'b1;
+wire [11:0]cfg_uart_baud_16x     = (strap_uart_cfg_mode) ? la_data_in[15:4]  : 259;
+wire [1:0] cfg_uartm_cfg_pri_mod = (strap_uart_cfg_mode) ? la_data_in[17:16] : 2'b0;
+
+
 // UART Master
 uart2wb u_uart2wb (  
-        .arst_n          (wbm_rst_n         ), //  sync reset
-        .app_clk         (wbm_clk_i         ), //  sys clock    
+        .arst_n          (s_reset_n               ), //  sync reset
+        .app_clk         (wbm_clk_i               ), //  sys clock    
 
 	// configuration control
-       .cfg_tx_enable    (la_data_in[1]     ), // Enable Transmit Path
-       .cfg_rx_enable    (la_data_in[2]     ), // Enable Received Path
-       .cfg_stop_bit     (la_data_in[3]     ), // 0 -> 1 Start , 1 -> 2 Stop Bits
-       .cfg_baud_16x     (la_data_in[15:4]  ), // 16x Baud clock generation
-       .cfg_pri_mod      (la_data_in[17:16] ), // priority mode, 0 -> nop, 1 -> Even, 2 -> Odd
+       .cfg_tx_enable    (cfg_uartm_tx_enable     ), // Enable Transmit Path
+       .cfg_rx_enable    (cfg_uartm_rx_enable     ), // Enable Received Path
+       .cfg_stop_bit     (cfg_uartm_stop_bit      ), // 0 -> 1 Start , 1 -> 2 Stop Bits
+       .cfg_baud_16x     (cfg_uart_baud_16x       ), // 16x Baud clock generation
+       .cfg_pri_mod      (cfg_uartm_cfg_pri_mod   ), // priority mode, 0 -> nop, 1 -> Even, 2 -> Odd
 
     // Master Port
        .wbm_cyc_o        (wbm_uart_cyc_i ),  // strobe/request
@@ -309,34 +362,40 @@
 
      );
 
+//----------------------------------------
+// SPI as ISP
+//----------------------------------------
+
 sspis_top u_spi2wb(
 
 	     .sys_clk         (wbm_clk_i       ),
-	     .rst_n           (wbm_rst_n       ),
+	     .rst_n           (e_reset_n       ),
 
-             .sclk            (sclk            ),
-             .ssn             (ssn             ),
-             .sdin            (sdin            ),
-             .sdout           (sdout           ),
-             .sdout_oen       (sdout_oen       ),
+         .sclk            (sclk            ),
+         .ssn             (ssn             ),
+         .sdin            (sdin            ),
+         .sdout           (sdout           ),
+         .sdout_oen       (sdout_oen       ),
 
           // WB Master Port
-             .wbm_cyc_o       (wbm_spi_cyc_i   ),  // strobe/request
-             .wbm_stb_o       (wbm_spi_stb_i   ),  // strobe/request
-             .wbm_adr_o       (wbm_spi_adr_i   ),  // address
-             .wbm_we_o        (wbm_spi_we_i    ),  // write
-             .wbm_dat_o       (wbm_spi_dat_i   ),  // data output
-             .wbm_sel_o       (wbm_spi_sel_i   ),  // byte enable
-             .wbm_dat_i       (wbm_spi_dat_o   ),  // data input
-             .wbm_ack_i       (wbm_spi_ack_o   ),  // acknowlegement
-             .wbm_err_i       (wbm_spi_err_o   )   // error
+         .wbm_cyc_o       (wbm_spi_cyc_i   ),  // strobe/request
+         .wbm_stb_o       (wbm_spi_stb_i   ),  // strobe/request
+         .wbm_adr_o       (wbm_spi_adr_i   ),  // address
+         .wbm_we_o        (wbm_spi_we_i    ),  // write
+         .wbm_dat_o       (wbm_spi_dat_i   ),  // data output
+         .wbm_sel_o       (wbm_spi_sel_i   ),  // byte enable
+         .wbm_dat_i       (wbm_spi_dat_o   ),  // data input
+         .wbm_ack_i       (wbm_spi_ack_o   ),  // acknowlegement
+         .wbm_err_i       (wbm_spi_err_o   )   // error
     );
 
-// Arbitor to select between external wb vs uart wb
+//--------------------------------------------------
+// Arbitor to select between external wb vs uart wb vs spi
+//---------------------------------------------------
 wire [1:0] grnt;
 wb_arb u_arb(
 	.clk      (wbm_clk_i), 
-	.rstn     (wbm_rst_n), 
+	.rstn     (s_reset_n), 
 	.req      ({1'b0,wbm_spi_stb_i,wbm_uart_stb_i,(wbm_stb_i & wbm_cyc_i)}), 
 	.gnt      (grnt)
         );
@@ -389,8 +448,8 @@
 ctech_delay_buf u_delay1_stb0 (.X(wb_stb_d1),.A(wb_stb_i));
 ctech_delay_buf u_delay2_stb1 (.X(wb_stb_d2),.A(wb_stb_d1));
 ctech_delay_buf u_delay2_stb2 (.X(wb_stb_d3),.A(wb_stb_d2));
-always_ff @(negedge wbm_rst_n or posedge wbm_clk_i) begin
-    if ( wbm_rst_n == 1'b0 ) begin
+always_ff @(negedge s_reset_n or posedge wbm_clk_i) begin
+    if ( s_reset_n == 1'b0 ) begin
         wb_req    <= '0;
 	wb_dat_o <= '0;
 	wb_ack_o <= '0;
@@ -431,9 +490,9 @@
 assign  sw_wr_en_4 = sw_wr_en && (sw_addr==4);
 assign  sw_wr_en_5 = sw_wr_en && (sw_addr==5);
 
-always @ (posedge wbm_clk_i or negedge wbm_rst_n)
+always @ (posedge wbm_clk_i or negedge s_reset_n)
 begin : preg_out_Seq
-   if (wbm_rst_n == 1'b0)
+   if (s_reset_n == 1'b0)
    begin
       reg_rdata  <= 'h0;
       reg_ack    <= 1'b0;
@@ -455,11 +514,22 @@
 //-------------------------------------
 // Global + Clock Control
 // -------------------------------------
-assign cfg_glb_ctrl         = reg_0[31:0];
-assign cfg_wb_clk_ctrl      = cfg_clk_ctrl2[7:0];
-assign cfg_rtc_clk_ctrl     = cfg_clk_ctrl2[15:8];
-assign cfg_usb_clk_ctrl     = cfg_clk_ctrl2[23:16];
-assign cfg_cpu_clk_ctrl     = cfg_clk_ctrl2[31:24];
+assign cfg_glb_ctrl     = reg_0[31:0];
+// Reset control
+// On Power-up wb & pll power default enabled
+ctech_buf u_buf_wb_rst        (.A(cfg_glb_ctrl[0] & s_reset_n),.X(wbd_int_rst_n));
+ctech_buf u_buf_pll_rst       (.A(cfg_glb_ctrl[1] & s_reset_n),.X(wbd_pll_rst_n));
+
+//assign cfg_fast_sim        = cfg_glb_ctrl[8]; 
+ctech_clk_buf u_fastsim_buf (.A (cfg_glb_ctrl[8]), . X(cfg_fast_sim)); // To Bypass Reset FSM initial wait time
+
+assign cfg_pll_enb         = cfg_glb_ctrl[15];
+assign cfg_ref_pll_div     = cfg_glb_ctrl[14:12];
+assign cfg_mon_sel         = cfg_glb_ctrl[11:8];
+
+
+assign cfg_wb_clk_ctrl      = cfg_clk_ctrl2[3:0];
+assign cfg_cpu_clk_ctrl     = cfg_clk_ctrl2[7:4];
 
 
 always @( *)
@@ -470,18 +540,19 @@
     3'b000 :   reg_out [31:0] = reg_0;
     3'b001 :   reg_out [31:0] = {16'h0,cfg_bank_sel [15:0]};     
     3'b010 :   reg_out [31:0] = cfg_clk_ctrl1 [31:0];    
-    3'b011 :   reg_out [31:0] = cfg_clk_ctrl2 [31:0];    
+    3'b011 :   reg_out [31:0] = {24'h0,cfg_clk_ctrl2 [7:0]};    
     3'b100 :   reg_out [31:0] = cfg_pll_ctrl [31:0];     
+    3'b101 :   reg_out [31:0] = system_strap [31:0];     
     default : reg_out [31:0] = 'h0;
   endcase
 end
 
 
 
-generic_register #(32,0  ) u_glb_ctrl (
+generic_register #(32,32'h8003  ) u_glb_ctrl (
 	      .we            ({32{sw_wr_en_0}}   ),		 
 	      .data_in       (wb_dat_i[31:0]    ),
-	      .reset_n       (wbm_rst_n         ),
+	      .reset_n       (e_reset_n         ),
 	      .clk           (wbm_clk_i         ),
 	      
 	      //List of Outs
@@ -491,37 +562,84 @@
 generic_register #(16,16'h1000 ) u_bank_sel (
 	      .we            ({16{sw_wr_en_1}}   ),		 
 	      .data_in       (wb_dat_i[15:0]    ),
-	      .reset_n       (wbm_rst_n         ),
+	      .reset_n       (e_reset_n         ),
 	      .clk           (wbm_clk_i         ),
 	      
 	      //List of Outs
 	      .data_out      (cfg_bank_sel[15:0] )
           );
 
+//-----------------------------------------------
+// clock control-1
+//----------------------------------------------
 
-generic_register #(32,0  ) u_clk_ctrl1 (
-	      .we            ({32{sw_wr_en_2}}   ),		 
-	      .data_in       (wb_dat_i[31:0]    ),
-	      .reset_n       (wbm_rst_n          ),
-	      .clk           (wbm_clk_i          ),
-	      
-	      //List of Outs
-	      .data_out      (cfg_clk_ctrl1[31:0])
-          );
+wire [31:0] rst_clk_ctrl1;
 
-generic_register #(32,0  ) u_clk_ctrl2 (
-	      .we            ({32{sw_wr_en_3}}  ),		 
-	      .data_in       (wb_dat_i[31:0]   ),
-	      .reset_n       (wbm_rst_n         ),
-	      .clk           (wbm_clk_i         ),
-	      
-	      //List of Outs
-	      .data_out      (cfg_clk_ctrl2[31:0])
-          );
-generic_register #(32,0  ) u_pll_ctrl (
+assign rst_clk_ctrl1[3:0]   = (strap_sticky[`STRAP_CLK_SKEW_WI] == 2'b00) ?  SKEW_RESET_VAL[3:0] :
+                              (strap_sticky[`STRAP_CLK_SKEW_WI] == 2'b01) ?  SKEW_RESET_VAL[3:0] + 2 :
+                              (strap_sticky[`STRAP_CLK_SKEW_WI] == 2'b10) ?  SKEW_RESET_VAL[3:0] + 4 : SKEW_RESET_VAL[3:0]-4;
+
+assign rst_clk_ctrl1[7:4]   = (strap_sticky[`STRAP_CLK_SKEW_WH] == 2'b00) ?  SKEW_RESET_VAL[7:4]  :
+                              (strap_sticky[`STRAP_CLK_SKEW_WH] == 2'b01) ?  SKEW_RESET_VAL[7:4] + 2 :
+                              (strap_sticky[`STRAP_CLK_SKEW_WH] == 2'b10) ?  SKEW_RESET_VAL[7:4] + 4 : SKEW_RESET_VAL[7:4]-4;
+
+assign rst_clk_ctrl1[11:8]  = (strap_sticky[`STRAP_CLK_SKEW_RISCV] == 2'b00) ?  SKEW_RESET_VAL[11:8]  :
+                              (strap_sticky[`STRAP_CLK_SKEW_RISCV] == 2'b01) ?  SKEW_RESET_VAL[11:8] + 2 :
+                              (strap_sticky[`STRAP_CLK_SKEW_RISCV] == 2'b10) ?  SKEW_RESET_VAL[11:8] + 4 : SKEW_RESET_VAL[11:8]-4;
+
+assign rst_clk_ctrl1[15:12] = (strap_sticky[`STRAP_CLK_SKEW_QSPI] == 2'b00) ?  SKEW_RESET_VAL[15:12]  :
+                              (strap_sticky[`STRAP_CLK_SKEW_QSPI] == 2'b01) ?  SKEW_RESET_VAL[15:12] + 2 :
+                              (strap_sticky[`STRAP_CLK_SKEW_QSPI] == 2'b10) ?  SKEW_RESET_VAL[15:12] + 4 : SKEW_RESET_VAL[15:12]-4;
+
+assign rst_clk_ctrl1[19:16] = (strap_sticky[`STRAP_CLK_SKEW_UART] == 2'b00) ?  SKEW_RESET_VAL[19:16]  :
+                              (strap_sticky[`STRAP_CLK_SKEW_UART] == 2'b01) ?  SKEW_RESET_VAL[19:16] + 2 :
+                              (strap_sticky[`STRAP_CLK_SKEW_UART] == 2'b10) ?  SKEW_RESET_VAL[19:16] + 4 : SKEW_RESET_VAL[19:16]-4;
+
+assign rst_clk_ctrl1[23:20] = (strap_sticky[`STRAP_CLK_SKEW_PINMUX] == 2'b00) ?  SKEW_RESET_VAL[23:20]  :
+                              (strap_sticky[`STRAP_CLK_SKEW_PINMUX] == 2'b01) ?  SKEW_RESET_VAL[23:20] + 2 :
+                              (strap_sticky[`STRAP_CLK_SKEW_PINMUX] == 2'b10) ?  SKEW_RESET_VAL[23:20] + 4 : SKEW_RESET_VAL[23:20]-4;
+
+assign rst_clk_ctrl1[27:24] = (strap_sticky[`STRAP_CLK_SKEW_QSPI_CO] == 2'b00) ?  SKEW_RESET_VAL[27:24] :
+                              (strap_sticky[`STRAP_CLK_SKEW_QSPI_CO] == 2'b01) ?  SKEW_RESET_VAL[27:24] + 2 :
+                              (strap_sticky[`STRAP_CLK_SKEW_QSPI_CO] == 2'b10) ?  SKEW_RESET_VAL[27:24] + 4 : SKEW_RESET_VAL[27:24]-4;
+
+assign rst_clk_ctrl1[31:28] = 4'b0;
+
+
+always @ (posedge wbm_clk_i ) begin 
+  if (p_reset_n == 1'b0) begin
+     cfg_clk_ctrl1  <= rst_clk_ctrl1 ;
+  end
+  else begin 
+     if(sw_wr_en_2 ) 
+       cfg_clk_ctrl1   <= wb_dat_i[31:0];
+  end
+end
+
+//--------------------------------
+// clock control-2
+//--------------------------------
+always @ (posedge wbm_clk_i) begin 
+  if (p_reset_n == 1'b0) begin
+     cfg_clk_ctrl2  <= strap_sticky[7:0] ;
+  end
+  else begin 
+     if(sw_wr_en_3 ) 
+       cfg_clk_ctrl2   <= wb_dat_i[7:0];
+  end
+end
+//--------------------------------
+// Pll Control
+//--------------------------------
+// PLL clock : 199.680 Mhz Period: 5.008 & bcount: 7, period
+// cfg_dc_trim = 26'b0000000000000_1010101101001
+// cfg_pll_fed_div = 5'b00000
+// cfg_dco_mode    = 1'b1
+
+generic_register #(32,{1'b1,5'b00000,26'b0000000000000_1010101101001} ) u_pll_ctrl (
 	      .we            ({32{sw_wr_en_4}}  ),		 
 	      .data_in       (wb_dat_i[31:0]   ),
-	      .reset_n       (wbm_rst_n         ),
+	      .reset_n       (e_reset_n         ),
 	      .clk           (wbm_clk_i         ),
 	      
 	      //List of Outs
@@ -529,6 +647,32 @@
           );
 
 
+always @ (posedge wbm_clk_i ) begin 
+  if (p_reset_n == 1'b0) begin
+     cfg_clk_ctrl2  <= strap_sticky[7:0] ;
+  end
+  else begin 
+     if(sw_wr_en_3 ) 
+       cfg_clk_ctrl2   <= wb_dat_i[7:0];
+  end
+end
+//-------------------------------------------------------------
+// Note: system_strap reset (p_reset_n) will be released
+//     eariler than s_reset_n to take care of strap loading
+//--------------------------------------------------------------
+always @ (posedge wbm_clk_i) begin 
+  if (s_reset_n == 1'b0) begin
+     system_strap  <= {soft_reboot,strap_sticky[30:0]};
+  end
+  else if(sw_wr_en_5 ) begin
+       system_strap   <= wb_dat_i;
+  end
+end
+
+
+//--------------------- End of Register Bank  ------------------------
+
+
 assign wb_stb_int = wb_req & !reg_sel;
 
 // Since design need more than 16MB address space, we have implemented
@@ -537,7 +681,7 @@
 
 async_wb u_async_wb(
 // Master Port
-       .wbm_rst_n   (wbm_rst_n     ),  
+       .wbm_rst_n   (s_reset_n     ),  
        .wbm_clk_i   (wbm_clk_i     ),  
        .wbm_cyc_i   (wb_cyc_i      ),  
        .wbm_stb_i   (wb_stb_int    ),  
@@ -571,7 +715,7 @@
        .clk_o         (pll_ref_clk      ),
    // Inputs
        .mclk          (user_clock1      ),
-       .reset_n       (wbm_rst_n        ), 
+       .reset_n       (e_reset_n        ), 
        .clk_div_ratio (cfg_ref_pll_div  )
    );
 
@@ -582,39 +726,41 @@
        .clk_o         (pll_clk_div16    ),
    // Inputs
        .mclk          (int_pll_clock    ),
-       .reset_n       (wbm_rst_n        ), 
+       .reset_n       (e_reset_n        ), 
        .clk_div_ratio (4'hF )
    );
 
 //----------------------------------
 // Generate Internal WishBone Clock
 //----------------------------------
-logic       wb_clk_div;
-logic       wbs_ref_clk_int;
-logic       wbs_ref_clk;
+logic         wb_clk_div;
+logic         wbs_ref_clk_int;
+logic         wbs_ref_clk;
 
-wire  [1:0]   cfg_wb_clk_src_sel   =  cfg_wb_clk_ctrl[7:6];
-wire          cfg_wb_clk_div       =  cfg_wb_clk_ctrl[5];
-wire  [4:0]   cfg_wb_clk_ratio     =  cfg_wb_clk_ctrl[4:0];
+wire  [1:0]   cfg_wb_clk_src_sel   =  cfg_wb_clk_ctrl[1:0];
+wire  [1:0]   cfg_wb_clk_ratio     =  cfg_wb_clk_ctrl[3:2];
 
-
+ // Keep WBS in Ref clock during initial boot to strap loading 
 assign wbs_ref_clk_int = (cfg_wb_clk_src_sel ==2'b00) ? user_clock1 :
                          (cfg_wb_clk_src_sel ==2'b01) ? user_clock2 :	
-	                 int_pll_clock;
+                         (cfg_wb_clk_src_sel ==2'b10) ? int_pll_clock :	xtal_clk;
 
 ctech_clk_buf u_wbs_ref_clkbuf (.A (wbs_ref_clk_int), . X(wbs_ref_clk));
+ctech_clk_gate u_clkgate_wbs (.GATE (clk_enb), . CLK(wbs_clk_div), .GCLK(wbs_clk_out));
 
-//assign wbs_clk_out  = (cfg_wb_clk_div)  ? wb_clk_div : wbm_clk_i;
-ctech_mux2x1 u_wbs_clk_sel (.A0 (wbs_ref_clk), .A1 (wb_clk_div), .S  (cfg_wb_clk_div), .X  (wbs_clk_out));
+assign wbs_clk_div   =(force_refclk)             ? user_clock1 :
+                      (cfg_wb_clk_ratio == 2'b00) ? wbs_ref_clk :
+                      (cfg_wb_clk_ratio == 2'b01) ? wbs_ref_clk_div_2 :
+                      (cfg_wb_clk_ratio == 2'b10) ? wbs_ref_clk_div_4 : wbs_ref_clk_div_8;
 
-
-clk_ctl #(4) u_wbclk (
+clk_div8  u_wbclk (
    // Outputs
-       .clk_o         (wb_clk_div      ),
+       .clk_div_8     (wbs_ref_clk_div_8      ),
+       .clk_div_4     (wbs_ref_clk_div_4      ),
+       .clk_div_2     (wbs_ref_clk_div_2      ),
    // Inputs
-       .mclk          (wbs_ref_clk       ),
-       .reset_n       (wbm_rst_n        ), 
-       .clk_div_ratio (cfg_wb_clk_ratio )
+       .mclk          (wbs_ref_clk            ),
+       .reset_n       (p_reset_n              ) 
    );
 
 
@@ -626,78 +772,29 @@
 wire   cpu_ref_clk;
 wire   cpu_clk_int;
 
-wire [1:0] cfg_cpu_clk_src_sel   = cfg_cpu_clk_ctrl[7:6];
-wire       cfg_cpu_clk_div       = cfg_cpu_clk_ctrl[5];
-wire [4:0] cfg_cpu_clk_ratio     = cfg_cpu_clk_ctrl[4:0];
+wire [1:0] cfg_cpu_clk_src_sel   = cfg_cpu_clk_ctrl[1:0];
+wire [1:0] cfg_cpu_clk_ratio     = cfg_cpu_clk_ctrl[3:2];
 
 assign cpu_ref_clk_int = (cfg_cpu_clk_src_sel ==2'b00) ? user_clock1 :
                          (cfg_cpu_clk_src_sel ==2'b01) ? user_clock2 :	
-	                 int_pll_clock;
+                         (cfg_cpu_clk_src_sel ==2'b10) ? int_pll_clock : xtal_clk;	
 
 ctech_clk_buf u_cpu_ref_clkbuf (.A (cpu_ref_clk_int), . X(cpu_ref_clk));
 
-//assign cpu_clk_int = (cfg_cpu_clk_div)     ? cpu_clk_div : cpu_ref_clk;
-ctech_mux2x1 u_cpu_clk_sel (.A0 (cpu_ref_clk), .A1 (cpu_clk_div), .S  (cfg_cpu_clk_div),     .X  (cpu_clk_int));
+ctech_clk_gate u_clkgate_cpu (.GATE (clk_enb), . CLK(cpu_clk_div), .GCLK(cpu_clk));
 
-ctech_clk_buf u_clkbuf_cpu (.A (cpu_clk_int), . X(cpu_clk));
+assign cpu_clk_div   = (cfg_wb_clk_ratio == 2'b00) ? cpu_ref_clk :
+                       (cfg_wb_clk_ratio == 2'b01) ? cpu_ref_clk_div_2 :
+                       (cfg_wb_clk_ratio == 2'b10) ? cpu_ref_clk_div_4 : cpu_ref_clk_div_8;
 
-clk_ctl #(4) u_cpuclk (
+
+clk_div8 u_cpuclk (
    // Outputs
-       .clk_o         (cpu_clk_div      ),
+       .clk_div_8     (cpu_ref_clk_div_8      ),
+       .clk_div_4     (cpu_ref_clk_div_4      ),
+       .clk_div_2     (cpu_ref_clk_div_2      ),
    // Inputs
-       .mclk          (cpu_ref_clk      ),
-       .reset_n       (wbm_rst_n        ), 
-       .clk_div_ratio (cfg_cpu_clk_ratio)
+       .mclk          (cpu_ref_clk            ),
+       .reset_n       (p_reset_n              )
    );
-
-//----------------------------------
-// Generate RTC Clock Generation
-//----------------------------------
-wire   rtc_clk_div;
-wire [7:0] cfg_rtc_clk_ratio     = cfg_rtc_clk_ctrl[7:0];
-
-
-ctech_clk_buf u_clkbuf_rtc (.A (rtc_clk_div), . X(rtc_clk));
-
-clk_ctl #(7) u_rtcclk (
-   // Outputs
-       .clk_o         (rtc_clk_div      ),
-   // Inputs
-       .mclk          (user_clock2      ),
-       .reset_n       (wbm_rst_n        ), 
-       .clk_div_ratio (cfg_rtc_clk_ratio)
-   );
-
-
-//----------------------------------
-// Generate USB Clock Generation
-//----------------------------------
-wire   usb_clk_div;
-wire   usb_ref_clk_int;
-wire   usb_ref_clk;
-wire   usb_clk_int;
-
-wire [1:0] cfg_usb_clk_sel_sel   = cfg_usb_clk_ctrl[7:6];
-wire       cfg_usb_clk_div       = cfg_usb_clk_ctrl[5];
-wire [4:0] cfg_usb_clk_ratio     = cfg_usb_clk_ctrl[4:0];
-
-assign usb_ref_clk_int = (cfg_usb_clk_sel_sel ==2'b00) ? user_clock1 :
-                         (cfg_usb_clk_sel_sel ==2'b01) ? user_clock2 :	
-	                 int_pll_clock;
-ctech_clk_buf u_usb_ref_clkbuf (.A (usb_ref_clk_int), . X(usb_ref_clk));
-//assign usb_clk_int = (cfg_usb_clk_div)     ? usb_clk_div : usb_ref_clk;
-ctech_mux2x1 u_usb_clk_sel (.A0 (usb_ref_clk), .A1 (usb_clk_div), .S  (cfg_usb_clk_div), .X  (usb_clk_int));
-
-
-ctech_clk_buf u_clkbuf_usb (.A (usb_clk_int), . X(usb_clk));
-
-clk_ctl #(4) u_usbclk (
-   // Outputs
-       .clk_o         (usb_clk_div      ),
-   // Inputs
-       .mclk          (usb_ref_clk      ),
-       .reset_n       (wbm_rst_n        ), 
-       .clk_div_ratio (cfg_usb_clk_ratio)
-   );
-
 endmodule
diff --git a/verilog/rtl/wb_host/src/wb_reset_fsm.sv b/verilog/rtl/wb_host/src/wb_reset_fsm.sv
new file mode 100644
index 0000000..23fd015
--- /dev/null
+++ b/verilog/rtl/wb_host/src/wb_reset_fsm.sv
@@ -0,0 +1,146 @@
+
+/*************************************************************************
+  This block control the reset sequence
+
+expected Reset removal sequence
+   
+               _________                 __________________________________________________
+                        |                |
+e_reset_n               |________________|
+               
+               ________                           ________________________________________
+               XXXXXXXXX                          |
+p_reset_n      XXXXXXXXX__________________________|
+               
+          
+                                                                             ____________
+              XXXXXXXXX                                                     |
+clk_enb       XXXXXXXXX_____________________________________________________|
+
+                                                                                        ____________
+               XXXXXXXXX                                                                |
+s_reset_n      XXXXXXXXX________________________________________________________________|
+
+************************************************************************************************************/
+
+module wb_reset_fsm (
+	      input  logic    clk                 ,
+	      input  logic    e_reset_n           ,  // external reset
+          input  logic    cfg_fast_sim        ,
+          input  logic    soft_boot_req       ,
+
+	      output logic    p_reset_n           ,  // power-on reset
+	      output logic    s_reset_n           ,  // soft reset
+          output logic    clk_enb             ,
+          output logic    soft_reboot         ,  // Indicate Soft Reboot 
+          output logic    force_refclk          // Keep WBS in Ref clock during initial boot to strap loading         
+
+);
+
+logic [2:0]  state;
+logic [15:0] clk_cnt;
+
+parameter  FSM_POWER_UP        = 3'b000;
+parameter  FSM_POWERON_RESET   = 3'b001;
+parameter  FSM_STRAP_LOAD      = 3'b010;
+parameter  FSM_STRAP_CLK_ENB   = 3'b011;
+parameter  FSM_DEASSERT_FORCE  = 3'b100;
+parameter  FSM_SOFT_RESET      = 3'b101;
+parameter  FSM_SOFT_BOOT_REQ   = 3'b110;
+parameter  FSM_CLK_EN_DEASSERT = 3'b111;
+
+logic boot_req_s,boot_req_ss;
+
+wire [15:0] clk_exit_cnt = (cfg_fast_sim) ? 100 : 60000;
+
+always @ (posedge clk or negedge e_reset_n) begin 
+   if (e_reset_n == 1'b0) begin
+       boot_req_s    <= 1'b0;
+       boot_req_ss   <= 1'b0;
+       state         <= FSM_POWER_UP;
+       s_reset_n     <= 0;
+       p_reset_n     <= 0;
+       clk_cnt       <= 0;
+       soft_reboot   <= 0;
+       clk_enb       <= 0;
+       force_refclk  <= 1;
+   end else begin
+       // Double Sync the incoming signal
+       boot_req_s  <= soft_boot_req;
+       boot_req_ss <= boot_req_s;
+      case(state)
+      FSM_POWER_UP : begin
+                if(clk_cnt == clk_exit_cnt) begin
+                   clk_cnt   <= 0;
+                   state     <= FSM_STRAP_CLK_ENB;
+                end else begin
+                   clk_cnt   <= clk_cnt + 1;
+                end
+             end
+      FSM_STRAP_CLK_ENB : begin
+                if(clk_cnt == 15) begin
+                   clk_enb      <= 1;
+                   clk_cnt      <= 0;
+                   state        <= FSM_POWERON_RESET;
+                end else begin
+                   clk_cnt   <= clk_cnt + 1;
+                end
+             end
+      FSM_POWERON_RESET : begin
+                if(clk_cnt == 15) begin
+                   p_reset_n <= 1;
+                   clk_cnt   <= 0;
+                   state     <= FSM_DEASSERT_FORCE;
+                end else begin
+                   clk_cnt   <= clk_cnt + 1;
+                end
+             end
+
+      FSM_DEASSERT_FORCE : begin
+                if(clk_cnt == 15) begin
+                   force_refclk <= 0;
+                   clk_cnt   <= 0;
+                   state     <= FSM_SOFT_RESET;
+                end else begin
+                   clk_cnt   <= clk_cnt + 1;
+                end
+             end
+
+      FSM_SOFT_RESET : begin
+                if(clk_cnt == 15) begin
+                   s_reset_n <= 1;
+                   clk_cnt   <= 0;
+                   state     <= FSM_SOFT_BOOT_REQ;
+                end else begin
+                   clk_cnt   <= clk_cnt + 1;
+                end
+             end
+      FSM_SOFT_BOOT_REQ : begin
+                if(boot_req_ss) begin
+                   soft_reboot  <= 1;
+                   clk_cnt      <= 0;
+                   force_refclk <= 1;
+                   clk_enb      <= 0;
+                   state        <= FSM_CLK_EN_DEASSERT;
+                end
+             end
+      // Disable clock to avoid to block all transation
+      FSM_CLK_EN_DEASSERT : begin
+                if(clk_cnt == 15) begin
+                   s_reset_n  <= 0;
+                   clk_enb    <= 1;
+                   clk_cnt    <= 0;
+                   state      <= FSM_SOFT_RESET;
+                end else begin
+                   clk_cnt   <= clk_cnt + 1;
+                end
+             end
+
+      endcase
+
+   end
+end
+   
+
+
+endmodule
diff --git a/verilog/rtl/wb_interconnect/src/wb_interconnect.sv b/verilog/rtl/wb_interconnect/src/wb_interconnect.sv
index 7e348fc..e595919 100644
--- a/verilog/rtl/wb_interconnect/src/wb_interconnect.sv
+++ b/verilog/rtl/wb_interconnect/src/wb_interconnect.sv
@@ -203,7 +203,7 @@
          input	logic 	        s2_wbd_ack_i,
          // input	logic 	s2_wbd_err_i, - unused
          output	logic [31:0]	s2_wbd_dat_o,
-         output	logic [8:0]	    s2_wbd_adr_o, // glbl reg need only 9 bits
+         output	logic [9:0]	    s2_wbd_adr_o, // glbl reg need only 9 bits
          output	logic [3:0]	    s2_wbd_sel_o,
          output	logic 	        s2_wbd_we_o,
          output	logic 	        s2_wbd_cyc_o,
@@ -677,7 +677,7 @@
  assign  s1_wbd_stb_o =  s1_wb_wr.wbd_stb ;
                       
  assign  s2_wbd_dat_o =  s2_wb_wr.wbd_dat ;
- assign  s2_wbd_adr_o =  s2_wb_wr.wbd_adr[8:0] ; // Global Reg Need 8 bit
+ assign  s2_wbd_adr_o =  s2_wb_wr.wbd_adr[9:0] ; // Global Reg Need 8 bit
  assign  s2_wbd_sel_o =  s2_wb_wr.wbd_sel ;
  assign  s2_wbd_we_o  =  s2_wb_wr.wbd_we  ;
  assign  s2_wbd_cyc_o =  s2_wb_wr.wbd_cyc ;
diff --git a/verilog/rtl/yifive/ycr2c b/verilog/rtl/yifive/ycr2c
index 1c7c248..c9d988c 160000
--- a/verilog/rtl/yifive/ycr2c
+++ b/verilog/rtl/yifive/ycr2c
@@ -1 +1 @@
-Subproject commit 1c7c248e0fbf41b2db64a746a61651742c9120c7
+Subproject commit c9d988cbb4df50e5528ff6cb990010a33d0f597c