Add PseudoRandom module
diff --git a/caravel b/caravel
new file mode 160000
index 0000000..477c17f
--- /dev/null
+++ b/caravel
@@ -0,0 +1 @@
+Subproject commit 477c17fb986b0d3f7f3581e940095b68bd62422f
diff --git a/caravel_pico b/caravel_pico
new file mode 160000
index 0000000..1fc14b5
--- /dev/null
+++ b/caravel_pico
@@ -0,0 +1 @@
+Subproject commit 1fc14b5c9a25cd0f4e46cdd02b8017dc3eae0d05
diff --git a/mgmt_core_wrapper b/mgmt_core_wrapper
new file mode 160000
index 0000000..3fee299
--- /dev/null
+++ b/mgmt_core_wrapper
@@ -0,0 +1 @@
+Subproject commit 3fee299f8177cebf7919eb0e6da7f0f5ad7af31d
diff --git a/openlane/user_project_wrapper/pin_order.cfg b/openlane/user_project_wrapper/pin_order.cfg
index 8797dcd..7293cef 120000
--- a/openlane/user_project_wrapper/pin_order.cfg
+++ b/openlane/user_project_wrapper/pin_order.cfg
@@ -1 +1 @@
-../../../caravel/openlane/user_project_wrapper_empty/pin_order.cfg
\ No newline at end of file
+pin_order.cfg
\ No newline at end of file
diff --git a/verilog/dv/Makefile b/verilog/dv/Makefile
index 94d0ead..5927800 100644
--- a/verilog/dv/Makefile
+++ b/verilog/dv/Makefile
@@ -20,7 +20,7 @@
 .SILENT: clean all
 
 
-PATTERNS = nec_ir_receiver
+PATTERNS = pseudorandom nec_ir_receiver
 
 all:  ${PATTERNS}
 
diff --git a/verilog/dv/nec_ir_receiver/nec_ir_receiver.c b/verilog/dv/nec_ir_receiver/nec_ir_receiver.c
index 74c3958..e8e17ef 100644
--- a/verilog/dv/nec_ir_receiver/nec_ir_receiver.c
+++ b/verilog/dv/nec_ir_receiver/nec_ir_receiver.c
@@ -90,7 +90,7 @@
     reg_mprj_io_3  = GPIO_MODE_MGMT_STD_OUTPUT;
     reg_mprj_io_2  = GPIO_MODE_MGMT_STD_OUTPUT;
     reg_mprj_io_1  = GPIO_MODE_MGMT_STD_OUTPUT;
-    //reg_mprj_io_0  = GPIO_MODE_MGMT_STD_OUTPUT;
+    reg_mprj_io_0  = GPIO_MODE_MGMT_STD_OUTPUT;
     
     /* Config IR receiver */
     // 70 312,5ns / 25ns
@@ -111,6 +111,6 @@
   do {
      ir_data = reg_mprj_ir_data;
   } while ((ir_data & 0x80000000) != 0x80000000 );
-  reg_mprj_datal = 0xAB610000 | ((ir_data << 1) & 0x0000FFFE) ;
+  reg_mprj_datal = 0xAB610000 | (ir_data & 0x0000FFFF) ;
 
 }
diff --git a/verilog/dv/nec_ir_receiver/nec_ir_receiver_tb.v b/verilog/dv/nec_ir_receiver/nec_ir_receiver_tb.v
index 7b49d27..385d30f 100644
--- a/verilog/dv/nec_ir_receiver/nec_ir_receiver_tb.v
+++ b/verilog/dv/nec_ir_receiver/nec_ir_receiver_tb.v
@@ -17,7 +17,7 @@
 
 `timescale 1 ns / 1 ps
 
-module wb_port_tb;
+module nec_ir_receiver_tb;
   reg clock;
   reg RSTB;
   reg CSB;
@@ -35,10 +35,8 @@
   reg [7:0]  cmd_data;
 
   assign checkbits = mprj_io[31:16];
-  assign addrbits = {1'b0, mprj_io[15:9]};
-  assign databits = mprj_io[8:1];
-
-  //assign mprj_io[3] = 1'b1;
+  assign addrbits  = mprj_io[15:8];
+  assign databits  = mprj_io[7:0];
 
   // External clock is used by default.  Make this artificially fast for the
   // simulation.  Normally this would be a slow clock and the digital PLL
@@ -52,7 +50,7 @@
 
   initial begin
     $dumpfile("nec_ir_receiver.vcd");
-    $dumpvars(0, wb_port_tb);
+    $dumpvars(0, nec_ir_receiver_tb);
 
     // Repeat cycles of 1000 clock edges as needed to complete testbench
     repeat (7000) begin
@@ -78,20 +76,20 @@
     $display("Monitor: MPRJ-Logic WB Started");
     ir_drv.send_nec(cmd_addr, cmd_data);
     wait (checkbits == 16'hAB61);
-      if ((addrbits[6:0] == cmd_addr[6:0]) && (databits == cmd_data)) begin
-        `ifdef GL
-          $display("Monitor: Mega-Project WB (GL) Passed");
-        `else
-          $display("Monitor: Mega-Project WB (RTL) Passed");
-        `endif
-      end else begin
-        `ifdef GL
-          $display("Monitor: Mega-Project WB (GL) Failed [0x%h -> 0x%h]", addrbits, databits);
-        `else
-          $display("Monitor: Mega-Project WB (RTL) Failed [0x%h -> 0x%h]", addrbits, databits);
-        `endif
-      end
-      $finish;
+    if ((addrbits == cmd_addr) && (databits == cmd_data)) begin
+      `ifdef GL
+        $display("Monitor: Mega-Project WB (GL) Passed");
+      `else
+        $display("Monitor: Mega-Project WB (RTL) Passed");
+      `endif
+    end else begin
+      `ifdef GL
+        $display("Monitor: Mega-Project WB (GL) Failed [0x%h -> 0x%h]", addrbits, databits);
+      `else
+        $display("Monitor: Mega-Project WB (RTL) Failed [0x%h -> 0x%h]", addrbits, databits);
+      `endif
+    end
+    $finish;
   end
 
   initial begin
@@ -124,7 +122,7 @@
   wire VSS = 1'b0;
   
   ir_behavioral_driver ir_drv(
-    .ir_signal(mprj_io[0])
+    .ir_signal(mprj_io[37])
   );
 
   caravel uut (
diff --git a/verilog/dv/pseudorandom/Makefile b/verilog/dv/pseudorandom/Makefile
new file mode 100644
index 0000000..3fd0b56
--- /dev/null
+++ b/verilog/dv/pseudorandom/Makefile
@@ -0,0 +1,32 @@
+# 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
+
+
+ 
+PWDD := $(shell pwd)
+BLOCKS := $(shell basename $(PWDD))
+
+# ---- Include Partitioned Makefiles ----
+
+CONFIG = caravel_user_project
+
+
+include $(MCW_ROOT)/verilog/dv/make/env.makefile
+include $(MCW_ROOT)/verilog/dv/make/var.makefile
+include $(MCW_ROOT)/verilog/dv/make/cpu.makefile
+include $(MCW_ROOT)/verilog/dv/make/sim.makefile
+
+
diff --git a/verilog/dv/pseudorandom/pseudorandom.c b/verilog/dv/pseudorandom/pseudorandom.c
new file mode 100644
index 0000000..6b82d38
--- /dev/null
+++ b/verilog/dv/pseudorandom/pseudorandom.c
@@ -0,0 +1,121 @@
+/*
+ * 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
+ */
+
+// This include is relative to $CARAVEL_PATH (see Makefile)
+#include <defs.h>
+#include <stub.c>
+
+/*
+	Wishbone Test:
+		- Configures MPRJ lower 8-IO pins as outputs
+		- Checks counter value through the wishbone port
+*/
+
+#define reg_mprj_ir_cmd        (*(volatile uint32_t*)0x30000000)
+#define reg_mprj_ir_multiplier (*(volatile uint32_t*)0x30000004)
+#define reg_mprj_ir_divider    (*(volatile uint32_t*)0x30000008)
+#define reg_mprj_ir_data       (*(volatile uint32_t*)0x3000000C)
+
+#define reg_mprj_rand          (*(volatile uint32_t*)0x30010000)
+
+void main()
+{
+
+	/* 
+	IO Control Registers
+	| DM     | VTRIP | SLOW  | AN_POL | AN_SEL | AN_EN | MOD_SEL | INP_DIS | HOLDH | OEB_N | MGMT_EN |
+	| 3-bits | 1-bit | 1-bit | 1-bit  | 1-bit  | 1-bit | 1-bit   | 1-bit   | 1-bit | 1-bit | 1-bit   |
+	Output: 0000_0110_0000_1110  (0x1808) = GPIO_MODE_USER_STD_OUTPUT
+	| DM     | VTRIP | SLOW  | AN_POL | AN_SEL | AN_EN | MOD_SEL | INP_DIS | HOLDH | OEB_N | MGMT_EN |
+	| 110    | 0     | 0     | 0      | 0      | 0     | 0       | 1       | 0     | 0     | 0       |
+	
+	 
+	Input: 0000_0001_0000_1111 (0x0402) = GPIO_MODE_USER_STD_INPUT_NOPULL
+	| DM     | VTRIP | SLOW  | AN_POL | AN_SEL | AN_EN | MOD_SEL | INP_DIS | HOLDH | OEB_N | MGMT_EN |
+	| 001    | 0     | 0     | 0      | 0      | 0     | 0       | 0       | 0     | 1     | 0       |
+	*/
+
+	/* 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_spimaster_config = 0xa002;	// Enable, prescaler = 2,
+                                        // connect to housekeeping SPI
+
+	// Connect the housekeeping SPI to the SPI master
+	// 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_15 = GPIO_MODE_MGMT_STD_OUTPUT;
+    reg_mprj_io_14 = GPIO_MODE_MGMT_STD_OUTPUT;
+    reg_mprj_io_13 = GPIO_MODE_MGMT_STD_OUTPUT;
+    reg_mprj_io_12 = GPIO_MODE_MGMT_STD_OUTPUT;
+    reg_mprj_io_11 = GPIO_MODE_MGMT_STD_OUTPUT;
+    reg_mprj_io_10 = GPIO_MODE_MGMT_STD_OUTPUT;
+    reg_mprj_io_9  = GPIO_MODE_MGMT_STD_OUTPUT;
+    reg_mprj_io_8  = GPIO_MODE_MGMT_STD_OUTPUT;
+    reg_mprj_io_7  = GPIO_MODE_MGMT_STD_OUTPUT;
+    reg_mprj_io_6  = GPIO_MODE_MGMT_STD_OUTPUT;
+    reg_mprj_io_5  = GPIO_MODE_MGMT_STD_OUTPUT;
+    reg_mprj_io_4  = GPIO_MODE_MGMT_STD_OUTPUT;
+    reg_mprj_io_3  = GPIO_MODE_MGMT_STD_OUTPUT;
+    reg_mprj_io_2  = GPIO_MODE_MGMT_STD_OUTPUT;
+    reg_mprj_io_1  = GPIO_MODE_MGMT_STD_OUTPUT;
+    reg_mprj_io_0  = GPIO_MODE_MGMT_STD_OUTPUT;
+
+  /* Apply configuration */
+  reg_mprj_xfer = 1;
+  while (reg_mprj_xfer == 1);
+
+  reg_la2_oenb = reg_la2_iena = 0x00000000;    // [95:64]
+
+  // Flag start of the test
+  reg_mprj_datal = 0xAB600000;
+
+  int i, error, data, last_data;
+  error = 0;
+  last_data = 0x00000000;
+
+  for(i=0;i<4;i++) {
+    data = reg_mprj_rand;
+    if (data == 0x00000000) error++;
+    if (data == 0xFFFFFFFF) error++;
+    if (data == last_data ) error++;
+    last_data = data;
+  }
+  
+  // Flag end of the test
+  reg_mprj_datal = 0xAB610000 | (error & 0x0000FFFF);
+
+}
diff --git a/verilog/dv/pseudorandom/pseudorandom_tb.v b/verilog/dv/pseudorandom/pseudorandom_tb.v
new file mode 100644
index 0000000..c32c9b8
--- /dev/null
+++ b/verilog/dv/pseudorandom/pseudorandom_tb.v
@@ -0,0 +1,159 @@
+// 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
+
+`timescale 1 ns / 1 ps
+
+module pseudorandom_tb;
+  reg clock;
+  reg RSTB;
+  reg CSB;
+  reg power1, power2;
+  reg power3, power4;
+
+  wire gpio;
+  wire [37:0] mprj_io;
+  wire [7:0] mprj_io_0;
+  wire [15:0] checkbits;
+  wire [15:0] errorbits;
+  
+  reg [7:0]  cmd_addr;
+  reg [7:0]  cmd_data;
+
+  assign checkbits = mprj_io[31:16];
+  assign errorbits = mprj_io[15:0];
+
+  // External clock is used by default.  Make this artificially fast for the
+  // simulation.  Normally this would be a slow clock and the digital PLL
+  // would be the fast clock.
+
+  always #12.5 clock <= (clock === 1'b0);
+
+  initial begin
+    clock = 0;
+  end
+
+  initial begin
+    $dumpfile("pseudorandom.vcd");
+    $dumpvars(0, pseudorandom_tb);
+
+    // Repeat cycles of 1000 clock edges as needed to complete testbench
+    repeat (7000) begin
+      repeat (1000) @(posedge clock);
+      // $display("+1000 cycles");
+    end
+    $display("%c[1;31m",27);
+    `ifdef GL
+      $display ("Monitor: Timeout, Test Mega-Project WB Port (GL) Failed");
+    `else
+      $display ("Monitor: Timeout, Test Mega-Project WB Port (RTL) Failed");
+    `endif
+    $display("%c[0m",27);
+    $finish;
+  end
+
+  initial begin
+
+    wait(checkbits == 16'hAB60);
+    $display("Monitor: MPRJ-Logic WB Started");
+    wait (checkbits == 16'hAB61);
+    if (errorbits == 16'h0000) begin
+      `ifdef GL
+        $display("Monitor: Mega-Project WB (GL) Passed");
+      `else
+        $display("Monitor: Mega-Project WB (RTL) Passed");
+      `endif
+    end else begin
+      `ifdef GL
+        $display("Monitor: Mega-Project WB (GL) Failed [0x%h errors]", errorbits);
+      `else
+        $display("Monitor: Mega-Project WB (RTL) Failed [0x%h errors]", errorbits);
+      `endif
+    end
+    $finish;
+  end
+
+  initial begin
+    RSTB <= 1'b0;
+    CSB  <= 1'b1;    // Force CSB high
+    #2000;
+    RSTB <= 1'b1;        // Release reset
+    #100000;
+    CSB = 1'b0;    // CSB can be released
+  end
+
+  initial begin    // Power-up sequence
+    power1 <= 1'b0;
+    power2 <= 1'b0;
+    #200;
+    power1 <= 1'b1;
+    #200;
+    power2 <= 1'b1;
+  end
+
+  wire flash_csb;
+  wire flash_clk;
+  wire flash_io0;
+  wire flash_io1;
+
+  wire VDD3V3 = power1;
+  wire VDD1V8 = power2;
+  wire USER_VDD3V3 = power3;
+  wire USER_VDD1V8 = power4;
+  wire VSS = 1'b0;
+
+  caravel uut (
+    .vddio    (VDD3V3),
+    .vddio_2  (VDD3V3),
+    .vssio    (VSS),
+    .vssio_2  (VSS),
+    .vdda    (VDD3V3),
+    .vssa    (VSS),
+    .vccd    (VDD1V8),
+    .vssd    (VSS),
+    .vdda1    (VDD3V3),
+    .vdda1_2  (VDD3V3),
+    .vdda2    (VDD3V3),
+    .vssa1    (VSS),
+    .vssa1_2  (VSS),
+    .vssa2    (VSS),
+    .vccd1    (VDD1V8),
+    .vccd2    (VDD1V8),
+    .vssd1    (VSS),
+    .vssd2    (VSS),
+    .clock    (clock),
+    .gpio     (gpio),
+    .mprj_io  (mprj_io),
+    .flash_csb(flash_csb),
+    .flash_clk(flash_clk),
+    .flash_io0(flash_io0),
+    .flash_io1(flash_io1),
+    .resetb    (RSTB)
+  );
+
+  spiflash #(
+    .FILENAME("pseudorandom.hex")
+  ) spiflash (
+    .csb(flash_csb),
+    .clk(flash_clk),
+    .io0(flash_io0),
+    .io1(flash_io1),
+    .io2(),      // not used
+    .io3()      // not used
+  );
+
+endmodule
+`default_nettype wire
diff --git a/verilog/includes/includes.rtl.caravel_user_project b/verilog/includes/includes.rtl.caravel_user_project
index 7f8d973..039a4cd 100644
--- a/verilog/includes/includes.rtl.caravel_user_project
+++ b/verilog/includes/includes.rtl.caravel_user_project
@@ -1,7 +1,9 @@
 # Caravel user project includes
 -v $(USER_PROJECT_VERILOG)/rtl/user_project_wrapper.v	     
 -v $(USER_PROJECT_VERILOG)/rtl/user_proj_example.v
+-v $(USER_PROJECT_VERILOG)/rtl/wishbone_1mst_to_8slv.v
 -v $(USER_PROJECT_VERILOG)/rtl/simple_fifo.v
 -v $(USER_PROJECT_VERILOG)/rtl/nec_ir_receiver.v
+-v $(USER_PROJECT_VERILOG)/rtl/pseudorandom.v
 -v $(USER_PROJECT_VERILOG)/beh/ir_behavioral_driver.v
  
diff --git a/verilog/rtl/nec_ir_receiver.v b/verilog/rtl/nec_ir_receiver.v
index f04e892..f1df164 100644
--- a/verilog/rtl/nec_ir_receiver.v
+++ b/verilog/rtl/nec_ir_receiver.v
@@ -672,11 +672,17 @@
           end

           status_reg_addr : begin

             wbs_dat_o[31]    <= frame_available;

-            wbs_dat_o[30]    <= frame_repeat;

-            wbs_dat_o[29]    <= frame_lost;

-            wbs_dat_o[28:16] <= 13'b0;

-            wbs_dat_o[15:8]  <= frame_addr;

-            wbs_dat_o[7:0]   <= frame_data;

+            

+            if (frame_available == 1'b1) begin

+              wbs_dat_o[31]    <= 1'b1;

+              wbs_dat_o[30]    <= frame_repeat;

+              wbs_dat_o[29]    <= frame_lost;

+              wbs_dat_o[28:16] <= 13'b0;

+              wbs_dat_o[15:8]  <= frame_addr;

+              wbs_dat_o[7:0]   <= frame_data;

+            end else begin

+              wbs_dat_o        <= 32'h00000000;

+            end

           end

         endcase

 

diff --git a/verilog/rtl/pseudorandom.v b/verilog/rtl/pseudorandom.v
new file mode 100644
index 0000000..72f205a
--- /dev/null
+++ b/verilog/rtl/pseudorandom.v
@@ -0,0 +1,96 @@
+////////////////////////////////////////////////////////////////////////////

+// SPDX-FileCopyrightText: 2022 , Julien OURY                       

+// 

+// 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 Julien OURY <julien.oury@outlook.fr>

+//

+////////////////////////////////////////////////////////////////////////////

+

+module pseudorandom (

+  input  wire        rst_n     , // Asynchronous reset (active low)

+  input  wire        clk       , // Clock (rising edge)

+

+  // Wishbone bus

+  input  wire        wbs_cyc_i , // Wishbone strobe/request

+  input  wire        wbs_stb_i , // Wishbone strobe/request

+  input  wire [31:0] wbs_adr_i , // Wishbone address

+  input  wire        wbs_we_i  , // Wishbone write (1:write, 0:read)

+  input  wire [31:0] wbs_dat_i , // Wishbone data output

+  input  wire [3:0]  wbs_sel_i , // Wishbone byte enable

+  output reg  [31:0] wbs_dat_o , // Wishbone data input

+  output wire        wbs_ack_o   // Wishbone acknowlegement

+);

+  reg ready;

+  wire [31:0] rand_data;

+

+  always @(negedge rst_n or posedge clk) begin

+    if (rst_n == 1'b0) begin

+      wbs_dat_o <= 32'h00000000;

+      ready     <= 1'b0;

+    end else begin

+      if (wbs_cyc_i && wbs_stb_i && ~wbs_we_i && ~ready) begin

+        wbs_dat_o <= rand_data;

+        ready     <= 1'b1;

+      end else begin

+        ready     <= 1'b0;

+      end

+    end

+  end

+

+  xoroshiro_64_plus_plus i_xoroshiro_64_plus_plus(

+    .rst_n (rst_n    ),

+    .clk   (clk      ),

+    .next  (ready    ),

+    .random(rand_data)

+  );

+  

+  assign wbs_ack_o = ready;

+

+endmodule

+

+/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

+// Xoroshiro64++

+/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

+module xoroshiro_64_plus_plus (

+  input  wire        rst_n     , // Asynchronous reset (active low)

+  input  wire        clk       , // Clock (rising edge)

+  input  wire        next      , // Request next value

+  output wire [31:0] random      // Random value

+);

+  reg  [31:0] s0;

+  reg  [31:0] s1;

+  wire [31:0] n0;

+  wire [31:0] n1;

+  wire [31:0] s1_xor_s0;

+  wire [31:0] n1_plus_n0;

+

+  assign s1_xor_s0 = (s1 ^ s0);

+  assign n1_plus_n0 = (n0 + n1);

+  assign n0 = (({s0[5:0],s0[31:6]} ^ s1_xor_s0) ^ (s1_xor_s0 <<< 9));

+  assign n1 = {s1_xor_s0[18:0],s1_xor_s0[31:19]};

+  assign random = ({n1_plus_n0[14:0],n1_plus_n0[31 : 15]} + n0);

+  

+  always @(negedge rst_n or posedge clk) begin

+    if (rst_n == 1'b0) begin

+      s0 <= (32'h00000001);

+      s1 <= (32'h00000000);

+    end else begin

+      if (next == 1'b1) begin

+        s0 <= n0;

+        s1 <= n1;

+      end

+    end

+  end

+

+endmodule

diff --git a/verilog/rtl/simple_fifo.v b/verilog/rtl/simple_fifo.v
index 26b8429..aa11bc1 100644
--- a/verilog/rtl/simple_fifo.v
+++ b/verilog/rtl/simple_fifo.v
@@ -63,15 +63,9 @@
   end

 

   // Write operation

-  always @(negedge rst_n or posedge clk) begin

-    if (rst_n == 1'b0) begin

-      for (i = 0; i < (2**ASIZE); i = i + 1) begin

-        memory[i] <= {DSIZE{1'b0}};

-      end

-    end else begin

-      if (wr_valid && wr_ready) begin

-        memory[wr_ptr] <= wr_data;

-      end

+  always @(posedge clk) begin

+    if (wr_valid && wr_ready) begin

+      memory[wr_ptr] <= wr_data;

     end

   end

 

diff --git a/verilog/rtl/uprj_netlists.v b/verilog/rtl/uprj_netlists.v
index 62241d0..2d55d6e 100644
--- a/verilog/rtl/uprj_netlists.v
+++ b/verilog/rtl/uprj_netlists.v
@@ -25,6 +25,8 @@
 `else
     `include "user_project_wrapper.v"
     `include "user_proj_example.v"
+	`include "wishbone_1mst_to_8slv.v"
     `include "simple_fifo.v"
     `include "nec_ir_receiver.v"
+	`include "pseudorandom.v"
 `endif
\ No newline at end of file
diff --git a/verilog/rtl/user_proj_example.v b/verilog/rtl/user_proj_example.v
index c76f860..7f8a672 100644
--- a/verilog/rtl/user_proj_example.v
+++ b/verilog/rtl/user_proj_example.v
@@ -1,5 +1,6 @@
-// SPDX-FileCopyrightText: 2020 Efabless Corporation
-//
+////////////////////////////////////////////////////////////////////////////
+// SPDX-FileCopyrightText: 2022 , Julien OURY                       
+// 
 // 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
@@ -12,67 +13,124 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 // SPDX-License-Identifier: Apache-2.0
-
-`default_nettype none
-/*
- *-------------------------------------------------------------
- *
- * user_proj_example
- *
- * This is an example of a (trivially simple) user project,
- * showing how the user project can connect to the logic
- * analyzer, the wishbone bus, and the I/O pads.
- *
- * This project generates an integer count, which is output
- * on the user area GPIO pads (digital output only).  The
- * wishbone connection allows the project to be controlled
- * (start and stop) from the management SoC program.
- *
- * See the testbenches in directory "mprj_counter" for the
- * example programs that drive this user project.  The three
- * testbenches are "io_ports", "la_test1", and "la_test2".
- *
- *-------------------------------------------------------------
- */
+// SPDX-FileContributor: Created by Julien OURY <julien.oury@outlook.fr>
+//
+////////////////////////////////////////////////////////////////////////////
 
 module user_proj_example(
 
 `ifdef USE_POWER_PINS
-    inout vccd1,	// User area 1 1.8V supply
-    inout vssd1,	// User area 1 digital ground
+    inout  wire vccd1,	// User area 1 1.8V supply
+    inout  wire vssd1,	// User area 1 digital ground
 `endif
 
     // Wishbone Slave ports (WB MI A)
-    input wb_clk_i,
-    input wb_rst_i,
-    input wbs_stb_i,
-    input wbs_cyc_i,
-    input wbs_we_i,
-    input [3:0] wbs_sel_i,
-    input [31:0] wbs_dat_i,
-    input [31:0] wbs_adr_i,
-    output wbs_ack_o,
-    output [31:0] wbs_dat_o,
+    input  wire         wb_clk_i,
+    input  wire         wb_rst_i,
+    input  wire         wbs_stb_i,
+    input  wire         wbs_cyc_i,
+    input  wire         wbs_we_i,
+    input  wire [3:0]   wbs_sel_i,
+    input  wire [31:0]  wbs_dat_i,
+    input  wire [31:0]  wbs_adr_i,
+    output wire         wbs_ack_o,
+    output wire [31:0]  wbs_dat_o,
 
     // Logic Analyzer Signals
-    input  [127:0] la_data_in,
-    output [127:0] la_data_out,
-    input  [127:0] la_oenb,
+    input  wire [127:0] la_data_in,
+    output wire [127:0] la_data_out,
+    input  wire [127:0] la_oenb,
 
     // IOs
-    input  [`MPRJ_IO_PADS-1:0] io_in,
-    output [`MPRJ_IO_PADS-1:0] io_out,
-    output [`MPRJ_IO_PADS-1:0] io_oeb,
+    input  wire [`MPRJ_IO_PADS-1:0] io_in,
+    output wire [`MPRJ_IO_PADS-1:0] io_out,
+    output wire [`MPRJ_IO_PADS-1:0] io_oeb,
 
     // IRQ
-    output [2:0] irq
+    output wire [2:0] irq
 );
 
     wire rst_n;
-
-    wire [`MPRJ_IO_PADS-1:0] io_in;
-    wire [`MPRJ_IO_PADS-1:0] io_out;
-    wire [`MPRJ_IO_PADS-1:0] io_oeb;
+    
+    // Wishbone SLV 0 interface
+    wire           wbs_s0_cyc_o ;
+    wire           wbs_s0_stb_o ;
+    wire [31:0]    wbs_s0_adr_o ;
+    wire           wbs_s0_we_o  ;
+    wire [31:0]    wbs_s0_dat_o ;
+    wire [3:0]     wbs_s0_sel_o ;
+    wire [31:0]    wbs_s0_dat_i ;
+    wire           wbs_s0_ack_i ;
+    
+    // Wishbone SLV 1 interface
+    wire           wbs_s1_cyc_o ;
+    wire           wbs_s1_stb_o ;
+    wire [31:0]    wbs_s1_adr_o ;
+    wire           wbs_s1_we_o  ;
+    wire [31:0]    wbs_s1_dat_o ;
+    wire [3:0]     wbs_s1_sel_o ;
+    wire [31:0]    wbs_s1_dat_i ;
+    wire           wbs_s1_ack_i ;
+    
+    // Wishbone SLV 2 interface
+    wire           wbs_s2_cyc_o ;
+    wire           wbs_s2_stb_o ;
+    wire [31:0]    wbs_s2_adr_o ;
+    wire           wbs_s2_we_o  ;
+    wire [31:0]    wbs_s2_dat_o ;
+    wire [3:0]     wbs_s2_sel_o ;
+    wire [31:0]    wbs_s2_dat_i ;
+    wire           wbs_s2_ack_i ;
+    
+    // Wishbone SLV 3 interface
+    wire           wbs_s3_cyc_o ;
+    wire           wbs_s3_stb_o ;
+    wire [31:0]    wbs_s3_adr_o ;
+    wire           wbs_s3_we_o  ;
+    wire [31:0]    wbs_s3_dat_o ;
+    wire [3:0]     wbs_s3_sel_o ;
+    wire [31:0]    wbs_s3_dat_i ;
+    wire           wbs_s3_ack_i ;
+    
+    // Wishbone SLV 4 interface
+    wire           wbs_s4_cyc_o ;
+    wire           wbs_s4_stb_o ;
+    wire [31:0]    wbs_s4_adr_o ;
+    wire           wbs_s4_we_o  ;
+    wire [31:0]    wbs_s4_dat_o ;
+    wire [3:0]     wbs_s4_sel_o ;
+    wire [31:0]    wbs_s4_dat_i ;
+    wire           wbs_s4_ack_i ;
+    
+    // Wishbone SLV 5 interface
+    wire           wbs_s5_cyc_o ;
+    wire           wbs_s5_stb_o ;
+    wire [31:0]    wbs_s5_adr_o ;
+    wire           wbs_s5_we_o  ;
+    wire [31:0]    wbs_s5_dat_o ;
+    wire [3:0]     wbs_s5_sel_o ;
+    wire [31:0]    wbs_s5_dat_i ;
+    wire           wbs_s5_ack_i ;
+    
+    // Wishbone SLV 6 interface
+    wire           wbs_s6_cyc_o ;
+    wire           wbs_s6_stb_o ;
+    wire [31:0]    wbs_s6_adr_o ;
+    wire           wbs_s6_we_o  ;
+    wire [31:0]    wbs_s6_dat_o ;
+    wire [3:0]     wbs_s6_sel_o ;
+    wire [31:0]    wbs_s6_dat_i ;
+    wire           wbs_s6_ack_i ;
+    
+    // Wishbone SLV 7 interface
+    wire           wbs_s7_cyc_o ;
+    wire           wbs_s7_stb_o ;
+    wire [31:0]    wbs_s7_adr_o ;
+    wire           wbs_s7_we_o  ;
+    wire [31:0]    wbs_s7_dat_o ;
+    wire [3:0]     wbs_s7_sel_o ;
+    wire [31:0]    wbs_s7_dat_i ;
+    wire           wbs_s7_ack_i ;
 
     // IO
     assign io_out = {(`MPRJ_IO_PADS){1'b0}};
@@ -86,26 +144,163 @@
 
     assign rst_n = ~wb_rst_i;
 	
+	wishbone_1mst_to_8slv #(
+      .ADDR_S0(32'h30000000), // Base address of Wishbone SLV 0
+      .MASK_S0(32'hFFFF0000), // Mask address of Wishbone SLV 0
+      .ADDR_S1(32'h30010000), // Base address of Wishbone SLV 1
+      .MASK_S1(32'hFFFF0000), // Mask address of Wishbone SLV 1
+      .ADDR_S2(32'h30020000), // Base address of Wishbone SLV 2
+      .MASK_S2(32'hFFFF0000), // Mask address of Wishbone SLV 2
+      .ADDR_S3(32'h30030000), // Base address of Wishbone SLV 3
+      .MASK_S3(32'hFFFF0000), // Mask address of Wishbone SLV 3
+      .ADDR_S4(32'h30040000), // Base address of Wishbone SLV 4
+      .MASK_S4(32'hFFFF0000), // Mask address of Wishbone SLV 4
+      .ADDR_S5(32'h30050000), // Base address of Wishbone SLV 5
+      .MASK_S5(32'hFFFF0000), // Mask address of Wishbone SLV 5
+      .ADDR_S6(32'h30060000), // Base address of Wishbone SLV 6
+      .MASK_S6(32'hFFFF0000), // Mask address of Wishbone SLV 6
+      .ADDR_S7(32'h30070000), // Base address of Wishbone SLV 7
+      .MASK_S7(32'hFFFF0000)  // Mask address of Wishbone SLV 7
+    ) i_wishbone_1mst_to_8slv (
+    
+      // Wishbone MST interface
+      .wbs_m_cyc_i(wbs_cyc_i),
+      .wbs_m_stb_i(wbs_stb_i),
+      .wbs_m_adr_i(wbs_adr_i),
+      .wbs_m_we_i (wbs_we_i ),
+      .wbs_m_dat_i(wbs_dat_i),
+      .wbs_m_sel_i(wbs_sel_i),
+      .wbs_m_dat_o(wbs_dat_o),
+      .wbs_m_ack_o(wbs_ack_o),
+    
+      // Wishbone SLV 0 interface
+      .wbs_s0_cyc_o(wbs_s0_cyc_o),
+      .wbs_s0_stb_o(wbs_s0_stb_o),
+      .wbs_s0_adr_o(wbs_s0_adr_o),
+      .wbs_s0_we_o (wbs_s0_we_o ),
+      .wbs_s0_dat_o(wbs_s0_dat_o),
+      .wbs_s0_sel_o(wbs_s0_sel_o),
+      .wbs_s0_dat_i(wbs_s0_dat_i),
+      .wbs_s0_ack_i(wbs_s0_ack_i),
+    
+      // Wishbone SLV 1 interface
+      .wbs_s1_cyc_o(wbs_s1_cyc_o),
+      .wbs_s1_stb_o(wbs_s1_stb_o),
+      .wbs_s1_adr_o(wbs_s1_adr_o),
+      .wbs_s1_we_o (wbs_s1_we_o ),
+      .wbs_s1_dat_o(wbs_s1_dat_o),
+      .wbs_s1_sel_o(wbs_s1_sel_o),
+      .wbs_s1_dat_i(wbs_s1_dat_i),
+      .wbs_s1_ack_i(wbs_s1_ack_i),
+    
+      // Wishbone SLV 2 interface
+      .wbs_s2_cyc_o(wbs_s2_cyc_o),
+      .wbs_s2_stb_o(wbs_s2_stb_o),
+      .wbs_s2_adr_o(wbs_s2_adr_o),
+      .wbs_s2_we_o (wbs_s2_we_o ),
+      .wbs_s2_dat_o(wbs_s2_dat_o),
+      .wbs_s2_sel_o(wbs_s2_sel_o),
+      .wbs_s2_dat_i(wbs_s2_dat_i),
+      .wbs_s2_ack_i(wbs_s2_ack_i),
+    
+      // Wishbone SLV 3 interface
+      .wbs_s3_cyc_o(wbs_s3_cyc_o),
+      .wbs_s3_stb_o(wbs_s3_stb_o),
+      .wbs_s3_adr_o(wbs_s3_adr_o),
+      .wbs_s3_we_o (wbs_s3_we_o ),
+      .wbs_s3_dat_o(wbs_s3_dat_o),
+      .wbs_s3_sel_o(wbs_s3_sel_o),
+      .wbs_s3_dat_i(wbs_s3_dat_i),
+      .wbs_s3_ack_i(wbs_s3_ack_i),
+    
+      // Wishbone SLV 4 interface
+      .wbs_s4_cyc_o(wbs_s4_cyc_o),
+      .wbs_s4_stb_o(wbs_s4_stb_o),
+      .wbs_s4_adr_o(wbs_s4_adr_o),
+      .wbs_s4_we_o (wbs_s4_we_o ),
+      .wbs_s4_dat_o(wbs_s4_dat_o),
+      .wbs_s4_sel_o(wbs_s4_sel_o),
+      .wbs_s4_dat_i(wbs_s4_dat_i),
+      .wbs_s4_ack_i(wbs_s4_ack_i),
+    
+      // Wishbone SLV 5 interface
+      .wbs_s5_cyc_o(wbs_s5_cyc_o),
+      .wbs_s5_stb_o(wbs_s5_stb_o),
+      .wbs_s5_adr_o(wbs_s5_adr_o),
+      .wbs_s5_we_o (wbs_s5_we_o ),
+      .wbs_s5_dat_o(wbs_s5_dat_o),
+      .wbs_s5_sel_o(wbs_s5_sel_o),
+      .wbs_s5_dat_i(wbs_s5_dat_i),
+      .wbs_s5_ack_i(wbs_s5_ack_i),
+    
+      // Wishbone SLV 6 interface
+      .wbs_s6_cyc_o(wbs_s6_cyc_o),
+      .wbs_s6_stb_o(wbs_s6_stb_o),
+      .wbs_s6_adr_o(wbs_s6_adr_o),
+      .wbs_s6_we_o (wbs_s6_we_o ),
+      .wbs_s6_dat_o(wbs_s6_dat_o),
+      .wbs_s6_sel_o(wbs_s6_sel_o),
+      .wbs_s6_dat_i(wbs_s6_dat_i),
+      .wbs_s6_ack_i(wbs_s6_ack_i),
+    
+      // Wishbone SLV 7 interface
+      .wbs_s7_cyc_o(wbs_s7_cyc_o),
+      .wbs_s7_stb_o(wbs_s7_stb_o),
+      .wbs_s7_adr_o(wbs_s7_adr_o),
+      .wbs_s7_we_o (wbs_s7_we_o ),
+      .wbs_s7_dat_o(wbs_s7_dat_o),
+      .wbs_s7_sel_o(wbs_s7_sel_o),
+      .wbs_s7_dat_i(wbs_s7_dat_i),
+      .wbs_s7_ack_i(wbs_s7_ack_i)
+    
+    );
+	
     nec_ir_receiver #(
       .NB_STAGES (10),
       .PSIZE     (20),
       .DSIZE     (11),
-      .ASIZE     ( 2)
-    ) nec_ir_receiver (
-      .rst_n(rst_n),
-      .clk  (wb_clk_i),
-      .wbs_cyc_i(wbs_cyc_i) ,
-      .wbs_stb_i(wbs_stb_i),
-      .wbs_adr_i(wbs_adr_i),
-      .wbs_we_i (wbs_we_i),
-      .wbs_dat_i(wbs_dat_i),
-      .wbs_sel_i(wbs_sel_i),
-      .wbs_dat_o(wbs_dat_o),
-      .wbs_ack_o(wbs_ack_o),
-      .ir_in(io_in[0]),
-      .irq(irq[0])
+      .ASIZE     ( 4)
+    ) i_nec_ir_receiver (
+      .rst_n    (rst_n       ),
+      .clk      (wb_clk_i    ),
+      .wbs_cyc_i(wbs_s0_cyc_o),
+      .wbs_stb_i(wbs_s0_stb_o),
+      .wbs_adr_i(wbs_s0_adr_o),
+      .wbs_we_i (wbs_s0_we_o ),
+      .wbs_dat_i(wbs_s0_dat_o),
+      .wbs_sel_i(wbs_s0_sel_o),
+      .wbs_dat_o(wbs_s0_dat_i),
+      .wbs_ack_o(wbs_s0_ack_i),
+      .ir_in    (io_in[37]   ),
+      .irq      (irq[0]      )
     );
+	
+	pseudorandom i_pseudorandom (
+      .rst_n     (rst_n       ),
+      .clk       (wb_clk_i    ),
+
+      // Wishbone bus
+      .wbs_cyc_i (wbs_s1_cyc_o),
+      .wbs_stb_i (wbs_s1_stb_o),
+      .wbs_adr_i (wbs_s1_adr_o),
+      .wbs_we_i  (wbs_s1_we_o ),
+      .wbs_dat_i (wbs_s1_dat_o),
+      .wbs_sel_i (wbs_s1_sel_o),
+      .wbs_dat_o (wbs_s1_dat_i),
+      .wbs_ack_o (wbs_s1_ack_i) 
+    );
+	
+    assign wbs_s2_dat_i = 32'h00000000;
+    assign wbs_s3_dat_i = 32'h00000000;
+    assign wbs_s4_dat_i = 32'h00000000;
+    assign wbs_s5_dat_i = 32'h00000000;
+    assign wbs_s6_dat_i = 32'h00000000;
+    assign wbs_s7_dat_i = 32'h00000000;
+    assign wbs_s2_ack_i = wbs_s2_stb_o;
+    assign wbs_s3_ack_i = wbs_s3_stb_o;
+    assign wbs_s4_ack_i = wbs_s4_stb_o;
+    assign wbs_s5_ack_i = wbs_s5_stb_o;
+    assign wbs_s6_ack_i = wbs_s6_stb_o;
+    assign wbs_s7_ack_i = wbs_s7_stb_o;
 
 endmodule
-
-`default_nettype wire
diff --git a/verilog/rtl/wishbone_1mst_to_8slv.v b/verilog/rtl/wishbone_1mst_to_8slv.v
new file mode 100644
index 0000000..f879c42
--- /dev/null
+++ b/verilog/rtl/wishbone_1mst_to_8slv.v
@@ -0,0 +1,233 @@
+////////////////////////////////////////////////////////////////////////////

+// SPDX-FileCopyrightText: 2022 , Julien OURY                       

+// 

+// 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 Julien OURY <julien.oury@outlook.fr>

+//

+////////////////////////////////////////////////////////////////////////////

+

+module wishbone_1mst_to_8slv #(

+  parameter [31:0] ADDR_S0 = 32'h00000000 , // Base address of Wishbone SLV 0

+  parameter [31:0] MASK_S0 = 32'hFFFFFFFF , // Mask address of Wishbone SLV 0

+  parameter [31:0] ADDR_S1 = 32'h00000000 , // Base address of Wishbone SLV 1

+  parameter [31:0] MASK_S1 = 32'hFFFFFFFF , // Mask address of Wishbone SLV 1

+  parameter [31:0] ADDR_S2 = 32'h00000000 , // Base address of Wishbone SLV 2

+  parameter [31:0] MASK_S2 = 32'hFFFFFFFF , // Mask address of Wishbone SLV 2

+  parameter [31:0] ADDR_S3 = 32'h00000000 , // Base address of Wishbone SLV 3

+  parameter [31:0] MASK_S3 = 32'hFFFFFFFF , // Mask address of Wishbone SLV 3

+  parameter [31:0] ADDR_S4 = 32'h00000000 , // Base address of Wishbone SLV 4

+  parameter [31:0] MASK_S4 = 32'hFFFFFFFF , // Mask address of Wishbone SLV 4

+  parameter [31:0] ADDR_S5 = 32'h00000000 , // Base address of Wishbone SLV 5

+  parameter [31:0] MASK_S5 = 32'hFFFFFFFF , // Mask address of Wishbone SLV 5

+  parameter [31:0] ADDR_S6 = 32'h00000000 , // Base address of Wishbone SLV 6

+  parameter [31:0] MASK_S6 = 32'hFFFFFFFF , // Mask address of Wishbone SLV 6

+  parameter [31:0] ADDR_S7 = 32'h00000000 , // Base address of Wishbone SLV 7

+  parameter [31:0] MASK_S7 = 32'hFFFFFFFF   // Mask address of Wishbone SLV 7

+)(

+  

+  // Wishbone MST interface

+  input  wire           wbs_m_cyc_i  , // Wishbone MST strobe/request

+  input  wire           wbs_m_stb_i  , // Wishbone MST strobe/request

+  input  wire [31:0]    wbs_m_adr_i  , // Wishbone MST address

+  input  wire           wbs_m_we_i   , // Wishbone MST write (1:write, 0:read)

+  input  wire [31:0]    wbs_m_dat_i  , // Wishbone MST data output

+  input  wire [3:0]     wbs_m_sel_i  , // Wishbone MST byte enable

+  output reg  [31:0]    wbs_m_dat_o  , // Wishbone MST data input

+  output reg            wbs_m_ack_o  , // Wishbone MST acknowlegement

+

+  // Wishbone SLV 0 interface

+  output wire           wbs_s0_cyc_o , // Wishbone SLV 0 strobe/request

+  output wire           wbs_s0_stb_o , // Wishbone SLV 0 strobe/request

+  output wire [31:0]    wbs_s0_adr_o , // Wishbone SLV 0 address

+  output wire           wbs_s0_we_o  , // Wishbone SLV 0 write (1:write, 0:read)

+  output wire [31:0]    wbs_s0_dat_o , // Wishbone SLV 0 data output

+  output wire [3:0]     wbs_s0_sel_o , // Wishbone SLV 0 byte enable

+  input  wire [31:0]    wbs_s0_dat_i , // Wishbone SLV 0 data input

+  input  wire           wbs_s0_ack_i , // Wishbone SLV 0 acknowlegement

+

+  // Wishbone SLV 1 interface

+  output wire           wbs_s1_cyc_o , // Wishbone SLV 1 strobe/request

+  output wire           wbs_s1_stb_o , // Wishbone SLV 1 strobe/request

+  output wire [31:0]    wbs_s1_adr_o , // Wishbone SLV 1 address

+  output wire           wbs_s1_we_o  , // Wishbone SLV 1 write (1:write, 0:read)

+  output wire [31:0]    wbs_s1_dat_o , // Wishbone SLV 1 data output

+  output wire [3:0]     wbs_s1_sel_o , // Wishbone SLV 1 byte enable

+  input  wire [31:0]    wbs_s1_dat_i , // Wishbone SLV 1 data input

+  input  wire           wbs_s1_ack_i , // Wishbone SLV 1 acknowlegement

+

+  // Wishbone SLV 2 interface

+  output wire           wbs_s2_cyc_o , // Wishbone SLV 2 strobe/request

+  output wire           wbs_s2_stb_o , // Wishbone SLV 2 strobe/request

+  output wire [31:0]    wbs_s2_adr_o , // Wishbone SLV 2 address

+  output wire           wbs_s2_we_o  , // Wishbone SLV 2 write (1:write, 0:read)

+  output wire [31:0]    wbs_s2_dat_o , // Wishbone SLV 2 data output

+  output wire [3:0]     wbs_s2_sel_o , // Wishbone SLV 2 byte enable

+  input  wire [31:0]    wbs_s2_dat_i , // Wishbone SLV 2 data input

+  input  wire           wbs_s2_ack_i , // Wishbone SLV 2 acknowlegement

+

+  // Wishbone SLV 3 interface

+  output wire           wbs_s3_cyc_o , // Wishbone SLV 3 strobe/request

+  output wire           wbs_s3_stb_o , // Wishbone SLV 3 strobe/request

+  output wire [31:0]    wbs_s3_adr_o , // Wishbone SLV 3 address

+  output wire           wbs_s3_we_o  , // Wishbone SLV 3 write (1:write, 0:read)

+  output wire [31:0]    wbs_s3_dat_o , // Wishbone SLV 3 data output

+  output wire [3:0]     wbs_s3_sel_o , // Wishbone SLV 3 byte enable

+  input  wire [31:0]    wbs_s3_dat_i , // Wishbone SLV 3 data input

+  input  wire           wbs_s3_ack_i , // Wishbone SLV 3 acknowlegement

+

+  // Wishbone SLV 4 interface

+  output wire           wbs_s4_cyc_o , // Wishbone SLV 4 strobe/request

+  output wire           wbs_s4_stb_o , // Wishbone SLV 4 strobe/request

+  output wire [31:0]    wbs_s4_adr_o , // Wishbone SLV 4 address

+  output wire           wbs_s4_we_o  , // Wishbone SLV 4 write (1:write, 0:read)

+  output wire [31:0]    wbs_s4_dat_o , // Wishbone SLV 4 data output

+  output wire [3:0]     wbs_s4_sel_o , // Wishbone SLV 4 byte enable

+  input  wire [31:0]    wbs_s4_dat_i , // Wishbone SLV 4 data input

+  input  wire           wbs_s4_ack_i , // Wishbone SLV 4 acknowlegement

+

+  // Wishbone SLV 5 interface

+  output wire           wbs_s5_cyc_o , // Wishbone SLV 5 strobe/request

+  output wire           wbs_s5_stb_o , // Wishbone SLV 5 strobe/request

+  output wire [31:0]    wbs_s5_adr_o , // Wishbone SLV 5 address

+  output wire           wbs_s5_we_o  , // Wishbone SLV 5 write (1:write, 0:read)

+  output wire [31:0]    wbs_s5_dat_o , // Wishbone SLV 5 data output

+  output wire [3:0]     wbs_s5_sel_o , // Wishbone SLV 5 byte enable

+  input  wire [31:0]    wbs_s5_dat_i , // Wishbone SLV 5 data input

+  input  wire           wbs_s5_ack_i , // Wishbone SLV 5 acknowlegement

+

+  // Wishbone SLV 6 interface

+  output wire           wbs_s6_cyc_o , // Wishbone SLV 6 strobe/request

+  output wire           wbs_s6_stb_o , // Wishbone SLV 6 strobe/request

+  output wire [31:0]    wbs_s6_adr_o , // Wishbone SLV 6 address

+  output wire           wbs_s6_we_o  , // Wishbone SLV 6 write (1:write, 0:read)

+  output wire [31:0]    wbs_s6_dat_o , // Wishbone SLV 6 data output

+  output wire [3:0]     wbs_s6_sel_o , // Wishbone SLV 6 byte enable

+  input  wire [31:0]    wbs_s6_dat_i , // Wishbone SLV 6 data input

+  input  wire           wbs_s6_ack_i , // Wishbone SLV 6 acknowlegement

+

+  // Wishbone SLV 7 interface

+  output wire           wbs_s7_cyc_o , // Wishbone SLV 7 strobe/request

+  output wire           wbs_s7_stb_o , // Wishbone SLV 7 strobe/request

+  output wire [31:0]    wbs_s7_adr_o , // Wishbone SLV 7 address

+  output wire           wbs_s7_we_o  , // Wishbone SLV 7 write (1:write, 0:read)

+  output wire [31:0]    wbs_s7_dat_o , // Wishbone SLV 7 data output

+  output wire [3:0]     wbs_s7_sel_o , // Wishbone SLV 7 byte enable

+  input  wire [31:0]    wbs_s7_dat_i , // Wishbone SLV 7 data input

+  input  wire           wbs_s7_ack_i   // Wishbone SLV 7 acknowlegement

+

+);

+

+  wire [7:0] selected;

+

+  assign selected[0] = ((wbs_m_adr_i & MASK_S0) == (ADDR_S0 & MASK_S0)) ? 1'b1 : 1'b0;

+  assign selected[1] = ((wbs_m_adr_i & MASK_S1) == (ADDR_S1 & MASK_S1)) ? 1'b1 : 1'b0;

+  assign selected[2] = ((wbs_m_adr_i & MASK_S2) == (ADDR_S2 & MASK_S2)) ? 1'b1 : 1'b0;

+  assign selected[3] = ((wbs_m_adr_i & MASK_S3) == (ADDR_S3 & MASK_S3)) ? 1'b1 : 1'b0;

+  assign selected[4] = ((wbs_m_adr_i & MASK_S4) == (ADDR_S4 & MASK_S4)) ? 1'b1 : 1'b0;

+  assign selected[5] = ((wbs_m_adr_i & MASK_S5) == (ADDR_S5 & MASK_S5)) ? 1'b1 : 1'b0;

+  assign selected[6] = ((wbs_m_adr_i & MASK_S6) == (ADDR_S6 & MASK_S6)) ? 1'b1 : 1'b0;

+  assign selected[7] = ((wbs_m_adr_i & MASK_S7) == (ADDR_S7 & MASK_S7)) ? 1'b1 : 1'b0;

+

+  assign wbs_s0_cyc_o = (selected[0] == 1'b1) ? wbs_m_cyc_i : 1'b0;

+  assign wbs_s1_cyc_o = (selected[1] == 1'b1) ? wbs_m_cyc_i : 1'b0;

+  assign wbs_s2_cyc_o = (selected[2] == 1'b1) ? wbs_m_cyc_i : 1'b0;

+  assign wbs_s3_cyc_o = (selected[3] == 1'b1) ? wbs_m_cyc_i : 1'b0;

+  assign wbs_s4_cyc_o = (selected[4] == 1'b1) ? wbs_m_cyc_i : 1'b0;

+  assign wbs_s5_cyc_o = (selected[5] == 1'b1) ? wbs_m_cyc_i : 1'b0;

+  assign wbs_s6_cyc_o = (selected[6] == 1'b1) ? wbs_m_cyc_i : 1'b0;

+  assign wbs_s7_cyc_o = (selected[7] == 1'b1) ? wbs_m_cyc_i : 1'b0;

+  

+  assign wbs_s0_stb_o = (selected[0] == 1'b1) ? wbs_m_stb_i : 1'b0;

+  assign wbs_s1_stb_o = (selected[1] == 1'b1) ? wbs_m_stb_i : 1'b0;

+  assign wbs_s2_stb_o = (selected[2] == 1'b1) ? wbs_m_stb_i : 1'b0;

+  assign wbs_s3_stb_o = (selected[3] == 1'b1) ? wbs_m_stb_i : 1'b0;

+  assign wbs_s4_stb_o = (selected[4] == 1'b1) ? wbs_m_stb_i : 1'b0;

+  assign wbs_s5_stb_o = (selected[5] == 1'b1) ? wbs_m_stb_i : 1'b0;

+  assign wbs_s6_stb_o = (selected[6] == 1'b1) ? wbs_m_stb_i : 1'b0;

+  assign wbs_s7_stb_o = (selected[7] == 1'b1) ? wbs_m_stb_i : 1'b0;

+  

+  assign wbs_s0_adr_o = wbs_m_adr_i;

+  assign wbs_s1_adr_o = wbs_m_adr_i;

+  assign wbs_s2_adr_o = wbs_m_adr_i;

+  assign wbs_s3_adr_o = wbs_m_adr_i;

+  assign wbs_s4_adr_o = wbs_m_adr_i;

+  assign wbs_s5_adr_o = wbs_m_adr_i;

+  assign wbs_s6_adr_o = wbs_m_adr_i;

+  assign wbs_s7_adr_o = wbs_m_adr_i;

+  

+  assign wbs_s0_we_o = wbs_m_we_i;

+  assign wbs_s1_we_o = wbs_m_we_i;

+  assign wbs_s2_we_o = wbs_m_we_i;

+  assign wbs_s3_we_o = wbs_m_we_i;

+  assign wbs_s4_we_o = wbs_m_we_i;

+  assign wbs_s5_we_o = wbs_m_we_i;

+  assign wbs_s6_we_o = wbs_m_we_i;

+  assign wbs_s7_we_o = wbs_m_we_i;

+  

+  assign wbs_s0_dat_o = wbs_m_dat_i;

+  assign wbs_s1_dat_o = wbs_m_dat_i;

+  assign wbs_s2_dat_o = wbs_m_dat_i;

+  assign wbs_s3_dat_o = wbs_m_dat_i;

+  assign wbs_s4_dat_o = wbs_m_dat_i;

+  assign wbs_s5_dat_o = wbs_m_dat_i;

+  assign wbs_s6_dat_o = wbs_m_dat_i;

+  assign wbs_s7_dat_o = wbs_m_dat_i;

+  

+  assign wbs_s0_sel_o = wbs_m_sel_i;

+  assign wbs_s1_sel_o = wbs_m_sel_i;

+  assign wbs_s2_sel_o = wbs_m_sel_i;

+  assign wbs_s3_sel_o = wbs_m_sel_i;

+  assign wbs_s4_sel_o = wbs_m_sel_i;

+  assign wbs_s5_sel_o = wbs_m_sel_i;

+  assign wbs_s6_sel_o = wbs_m_sel_i;

+  assign wbs_s7_sel_o = wbs_m_sel_i;

+

+  always @(*) begin

+      case (selected)

+      8'b10000000 : begin

+        wbs_m_dat_o  <= wbs_s7_dat_i;

+        wbs_m_ack_o  <= wbs_s7_ack_i;

+      end

+      8'b01000000 : begin

+        wbs_m_dat_o  <= wbs_s6_dat_i;

+        wbs_m_ack_o  <= wbs_s6_ack_i;

+      end

+      8'b00100000 : begin

+        wbs_m_dat_o  <= wbs_s5_dat_i;

+        wbs_m_ack_o  <= wbs_s5_ack_i;

+      end

+      8'b00010000 : begin

+        wbs_m_dat_o  <= wbs_s4_dat_i;

+        wbs_m_ack_o  <= wbs_s4_ack_i;

+      end

+      8'b00001000 : begin

+        wbs_m_dat_o  <= wbs_s3_dat_i;

+        wbs_m_ack_o  <= wbs_s3_ack_i;

+      end

+      8'b00000100 : begin

+        wbs_m_dat_o  <= wbs_s2_dat_i;

+        wbs_m_ack_o  <= wbs_s2_ack_i;

+      end

+      8'b00000010 : begin

+        wbs_m_dat_o  <= wbs_s1_dat_i;

+        wbs_m_ack_o  <= wbs_s1_ack_i;

+      end

+      default : begin

+        wbs_m_dat_o  <= wbs_s0_dat_i;

+        wbs_m_ack_o  <= wbs_s0_ack_i;

+      end

+    endcase

+  end

+

+endmodule
\ No newline at end of file