diff --git a/verilog/rtl/yonga_lz4_decoder_top.v b/verilog/rtl/yonga_lz4_decoder_top.v
index e37bf93..d2600a9 100644
--- a/verilog/rtl/yonga_lz4_decoder_top.v
+++ b/verilog/rtl/yonga_lz4_decoder_top.v
@@ -1,197 +1,202 @@
-// 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
-
-module yonga_lz4_decoder_top (
-    input  clk,
-    input  rst,
-
-    input  valid,
-    output reg [31:0] rdata,
-    input  [31:0] wdata,
-    output reg ready,
-    input wr_en,
-
-    input [7:0] compressed_data1,
-    output [7:0] decompressed_data1,
-
-    input rx,
-    output tx
-);
-
-wire rstn;
-reg select;
- 
-reg  decompress_data_read_en1;
-reg  i_fifo_wr_en1;
-reg [7:0] i_fifo_w_data1;
-reg decompress_fifo_data_ready1;
-
-reg uart_tx_full_flag_control1;
-reg [2:0] uart_tx_full_flag_count1;
-
-wire decompress_fifo_empty1;
-
-wire o_in_fifo_full1;
-wire [7:0] decompress_data1;
-wire idle1;
-
-reg lz4_o_fifo_read_request1;
-wire rx_fifo_not_empty1;
-wire rx_empty1;
-wire [7:0] uart_r_data1;
-wire tx_full1;
-wire [5:0] decompress_fifo_data_count1;
-
-assign rstn = !rst;
-assign rx_fifo_not_empty1 = !rx_empty1;
-
-always@(*) begin
-    rdata = 32'b0;
-    rdata[0]  = idle1;
-    rdata[4]  = decompress_fifo_empty1;
-    rdata[8]  = decompress_fifo_data_ready1;
-    rdata[12] = o_in_fifo_full1;
-end
-
-    yonga_lz4_decoder U1 //  LZ4-CORE-1
-        (
-            .clk    (clk),
-            .rstn   (rstn),
-
-            .i_lz4_decompress_enable  (1'b0),
-            .lz4_decompress_start     (1'b0),
-            
-            .i_compress_data_write    (i_fifo_wr_en1),
-            .o_compress_fifo_full     (o_in_fifo_full1),    
-            .i_compress_data          (i_fifo_w_data1),
-            
-            .i_decompress_data_read   (decompress_data_read_en1),
-            .o_decompress_fifo_empty  (decompress_fifo_empty1),
-            .o_fifo2_data_count       (decompress_fifo_data_count1),
-            .o_decompress_data        (decompressed_data1),
-            
-            .o_idle      (idle1)
-        );
-        
-    // ------------------------------UART------------------
-    uart    // UART-1
-        #(
-           .DBIT(8), 
-           .SB_TICK(16), 
-           .DVSR(163), 
-           .DVSR_BIT(8), 
-           .FIFO_W(2) 
-         )
-        U5(
-            .clk(clk),
-            .reset(!rstn),
-            .tx(tx),
-            .rx(rx),
-            .rd_uart(rx_fifo_not_empty1),
-            .wr_uart(lz4_o_fifo_read_request1),
-            .r_data(uart_r_data1),
-            .w_data(decompressed_data1),
-            .tx_full(tx_full1),
-            .rx_empty(rx_empty1)          
-        ); 
-        
-//------------------------------------------------------------------------------------------------------------//    
-//-----------------Uart or Logic Analyzer Select--------------------------------------------------------------//       
-        always @(posedge clk) begin
-            if(rstn == 1'b0) 
-                select <= 1'b1;
-            else begin
-                if(valid && !ready) begin
-                    if(wr_en ==1'b1 && wdata[8] == 1'b1) // uart enable
-                        select <= 1'b0;
-                    else if(wr_en ==1'b1 && wdata[9] == 1'b1) // Logic Analyzer enable
-                        select <= 1'b1;
-                end     
-            end  
-        end
-//------------------------------------------------------------------------------------------------------------//            
-//-----------------Decompress Fifo Data Ready Control---------------------------------------------------------// 
-        always @(posedge clk) begin
-            if(rstn == 1'b0) begin
-                decompress_fifo_data_ready1 <= 1'b0;
-            end else begin
-                if(decompress_fifo_data_count1> 20)
-                    decompress_fifo_data_ready1 <= 1'b1;
-                else
-                    decompress_fifo_data_ready1 <= 1'b0;
-            end  
-        end
-//------------------------------------------------------------------------------------------------------------//            
-                      
-        always @(posedge clk) begin
-            if(rstn == 1'b0) begin 
-                ready         <= 1'b0; 
-                i_fifo_wr_en1 <= 1'b0;
-                decompress_data_read_en1 <= 1'b0;
-                lz4_o_fifo_read_request1 <= 1'b0;
-                i_fifo_w_data1 <= 0;
-                uart_tx_full_flag_control1 <= 1'b1;
-                uart_tx_full_flag_count1 <= 0;
-            end else begin             
-                ready         <= 1'b0;
-                i_fifo_wr_en1 <= 1'b0;
-                decompress_data_read_en1 <= 1'b0;
-                
-                if(valid && !ready) 
-                    ready  <= 1'b1;
-//------------------------------------------Uart---------------------------------------------------------------//                         
-                if(select == 1'b0) begin // uart enable
-//                           Write fifo data
-                    lz4_o_fifo_read_request1 <= decompress_data_read_en1;
-                  
-                    if(rx_fifo_not_empty1 == 1'b1)begin
-                        i_fifo_wr_en1  <= 1'b1;
-                        i_fifo_w_data1 <= uart_r_data1;
-                    end
-//------------------------------------------------------------------------------------------------------------//                                                
-//                      Read fifo data                    
-                    if(!decompress_fifo_empty1 && uart_tx_full_flag_control1 == 1 && tx_full1 == 1'b0)begin 
-                       decompress_data_read_en1   <=  1'b1;
-                       uart_tx_full_flag_control1 <=  1'b0;
-                    end
-//------------------------------------------------------------------------------------------------------------//                          
-//                      uart_tx_full_flag_control                     
-                    if(uart_tx_full_flag_control1 ==  1'b0 )begin                        
-                        if(uart_tx_full_flag_count1 == 2)begin
-                            uart_tx_full_flag_count1   <= 0;
-                            uart_tx_full_flag_control1 <= 1'b1;
-                        end else
-                            uart_tx_full_flag_count1 <= uart_tx_full_flag_count1+1;
-                    end                   
-//------------------------------------------------------------------------------------------------------------//   
-//-------------------------------------------Logic Analyzer---------------------------------------------------//
-                end else begin 
-                    if(valid && !ready) begin // Logic Analyzer enable
-//                       Write fifo data
-                        if(wr_en ==1'b1 && wdata[0]) begin
-                            i_fifo_wr_en1  <= 1'b1;
-                            i_fifo_w_data1 <= compressed_data1;
-                        end
-//------------------------------------------------------------------------------------------------------------//                                                
-//                      Read fifo data
-                        if(wr_en ==1'b1 && wdata[4])
-                            decompress_data_read_en1 <=  1'b1;      
-                    end     
-//------------------------------------------------------------------------------------------------------------//                                                                                              
-                end                                             
-            end
-        end
-            
-endmodule
+// =====================================================================================  
+// (C) COPYRIGHT 2016 YongaTek (Yonga Technology Microelectronics)
+// All rights reserved.
+// This file contains confidential and proprietary information of YongaTek and 
+// is protected under international copyright and other intellectual property laws.
+// =====================================================================================
+// Project           : lz4_decompress
+// File ID           : %%
+// Design Unit Name  : user_pro_example.v
+// Description       : 
+// Comments          :
+// Revision          : %%
+// Last Changed Date : %%
+// Last Changed By   : 
+// Designer
+//          Name     : Bahadir TÜRKOGLU
+//          E-mail   : bahadir.turkoglu@yongatek.com          
+// =====================================================================================
+
+`default_nettype none
+module yonga_lz4_decoder_top (
+    input  clk,
+    input  rst,
+
+    input  valid,
+    output reg [31:0] rdata,
+    input  [31:0] wdata,
+    output reg ready,
+    input wr_en,
+
+    input [7:0] compressed_data1,
+    output [7:0] decompressed_data1,
+
+    input rx,
+    output tx
+);
+
+wire rstn;
+reg select;
+ 
+reg  decompress_data_read_en1;
+reg  i_fifo_wr_en1;
+reg [7:0] i_fifo_w_data1;
+reg decompress_fifo_data_ready1;
+
+reg uart_tx_full_flag_control1;
+reg [2:0] uart_tx_full_flag_count1;
+
+wire decompress_fifo_empty1;
+
+wire o_in_fifo_full1;
+wire [7:0] decompress_data1;
+wire idle1;
+
+reg lz4_o_fifo_read_request1;
+wire rx_fifo_not_empty1;
+wire rx_empty1;
+wire [7:0] uart_r_data1;
+wire tx_full1;
+wire [5:0] decompress_fifo_data_count1;
+
+assign rstn = !rst;
+assign rx_fifo_not_empty1 = !rx_empty1;
+
+always@(*) begin
+    rdata = 32'b0;
+    rdata[0]  = idle1;
+    rdata[4]  = decompress_fifo_empty1;
+    rdata[8]  = decompress_fifo_data_ready1;
+    rdata[12] = o_in_fifo_full1;
+end
+
+    yonga_lz4_decoder U1 //  LZ4-CORE-1
+        (
+            .clk    (clk),
+            .rstn   (rstn),
+
+            .i_lz4_decompress_enable  (1'b0),
+            .lz4_decompress_start     (1'b0),
+            
+            .i_compress_data_write    (i_fifo_wr_en1),
+            .o_compress_fifo_full     (o_in_fifo_full1),    
+            .i_compress_data          (i_fifo_w_data1),
+            
+            .i_decompress_data_read   (decompress_data_read_en1),
+            .o_decompress_fifo_empty  (decompress_fifo_empty1),
+            .o_fifo2_data_count       (decompress_fifo_data_count1),
+            .o_decompress_data        (decompressed_data1),
+            
+            .o_idle      (idle1)
+        );
+        
+    // ------------------------------UART------------------
+    uart    // UART-1
+        #(
+           .DBIT(8), 
+           .SB_TICK(16), 
+           .DVSR(163), 
+           .DVSR_BIT(8), 
+           .FIFO_W(2) 
+         )
+        U5(
+            .clk(clk),
+            .reset(!rstn),
+            .tx(tx),
+            .rx(rx),
+            .rd_uart(rx_fifo_not_empty1),
+            .wr_uart(lz4_o_fifo_read_request1),
+            .r_data(uart_r_data1),
+            .w_data(decompressed_data1),
+            .tx_full(tx_full1),
+            .rx_empty(rx_empty1)          
+        ); 
+        
+//------------------------------------------------------------------------------------------------------------//    
+//-----------------Uart or Logic Analyzer Select--------------------------------------------------------------//       
+        always @(posedge clk) begin
+            if(rstn == 1'b0) 
+                select <= 1'b1;
+            else begin
+                if(valid && !ready) begin
+                    if(wr_en ==1'b1 && wdata[8] == 1'b1) // uart enable
+                        select <= 1'b0;
+                    else if(wr_en ==1'b1 && wdata[9] == 1'b1) // Logic Analyzer enable
+                        select <= 1'b1;
+                end     
+            end  
+        end
+//------------------------------------------------------------------------------------------------------------//            
+//-----------------Decompress Fifo Data Ready Control---------------------------------------------------------// 
+        always @(posedge clk) begin
+            if(rstn == 1'b0) begin
+                decompress_fifo_data_ready1 <= 1'b0;
+            end else begin
+                if(decompress_fifo_data_count1> 20)
+                    decompress_fifo_data_ready1 <= 1'b1;
+                else
+                    decompress_fifo_data_ready1 <= 1'b0;
+            end  
+        end
+//------------------------------------------------------------------------------------------------------------//            
+                      
+        always @(posedge clk) begin
+            if(rstn == 1'b0) begin 
+                ready         <= 1'b0; 
+                i_fifo_wr_en1 <= 1'b0;
+                decompress_data_read_en1 <= 1'b0;
+                lz4_o_fifo_read_request1 <= 1'b0;
+                i_fifo_w_data1 <= 0;
+                uart_tx_full_flag_control1 <= 1'b1;
+                uart_tx_full_flag_count1 <= 0;
+            end else begin             
+                ready         <= 1'b0;
+                i_fifo_wr_en1 <= 1'b0;
+                decompress_data_read_en1 <= 1'b0;
+                
+                if(valid && !ready) 
+                    ready  <= 1'b1;
+//------------------------------------------Uart---------------------------------------------------------------//                         
+                if(select == 1'b0) begin // uart enable
+//                           Write fifo data
+                    lz4_o_fifo_read_request1 <= decompress_data_read_en1;
+                  
+                    if(rx_fifo_not_empty1 == 1'b1)begin
+                        i_fifo_wr_en1  <= 1'b1;
+                        i_fifo_w_data1 <= uart_r_data1;
+                    end
+//------------------------------------------------------------------------------------------------------------//                                                
+//                      Read fifo data                    
+                    if(!decompress_fifo_empty1 && uart_tx_full_flag_control1 == 1 && tx_full1 == 1'b0)begin 
+                       decompress_data_read_en1   <=  1'b1;
+                       uart_tx_full_flag_control1 <=  1'b0;
+                    end
+//------------------------------------------------------------------------------------------------------------//                          
+//                      uart_tx_full_flag_control                     
+                    if(uart_tx_full_flag_control1 ==  1'b0 )begin                        
+                        if(uart_tx_full_flag_count1 == 2)begin
+                            uart_tx_full_flag_count1   <= 0;
+                            uart_tx_full_flag_control1 <= 1'b1;
+                        end else
+                            uart_tx_full_flag_count1 <= uart_tx_full_flag_count1+1;
+                    end                   
+//------------------------------------------------------------------------------------------------------------//   
+//-------------------------------------------Logic Analyzer---------------------------------------------------//
+                end else begin 
+                    if(valid && !ready) begin // Logic Analyzer enable
+//                       Write fifo data
+                        if(wr_en ==1'b1 && wdata[0]) begin
+                            i_fifo_wr_en1  <= 1'b1;
+                            i_fifo_w_data1 <= compressed_data1;
+                        end
+//------------------------------------------------------------------------------------------------------------//                                                
+//                      Read fifo data
+                        if(wr_en ==1'b1 && wdata[4])
+                            decompress_data_read_en1 <=  1'b1;      
+                    end     
+//------------------------------------------------------------------------------------------------------------//                                                                                              
+                end                                             
+            end
+        end
+            
+endmodule
