From b5bfa2ebf2458e67a557e726bea30401e601db87 Mon Sep 17 00:00:00 2001
From: Rutherther <rutherther@ditigal.xyz>
Date: Mon, 30 Dec 2024 17:59:11 +0100
Subject: [PATCH] fix: assumptions about synthesizable code

---
 hdl_spi/manifest.scm                  |   2 +
 hdl_spi/models/spi_models.py          |   1 +
 hdl_spi/src/rs_latch.vhd              |  12 +-
 hdl_spi/src/spi_masterslave.vhd       | 186 +++++++++++++-------------
 hdl_spi/src/spi_multiplexor.vhd       |  63 ---------
 hdl_spi/src/spi_peripheral.vhd        |  38 ++++--
 hdl_spi/tests/Makefile                |   2 +-
 hdl_spi/tests/test_spi_masterslave.py |  29 ++--
 hdl_spi/tests/test_spi_peripheral.py  |   5 +-
 9 files changed, 146 insertions(+), 192 deletions(-)
 delete mode 100644 hdl_spi/src/spi_multiplexor.vhd

diff --git a/hdl_spi/manifest.scm b/hdl_spi/manifest.scm
index 0b674a4..e2f2acf 100644
--- a/hdl_spi/manifest.scm
+++ b/hdl_spi/manifest.scm
@@ -60,6 +60,8 @@ testbenches in Python.")
    (list
     "python-pytest"
     "python"
+    "python-pudb"
+    "python-pytest-pudb"
     "vhdl-ls"
     "make"
 
diff --git a/hdl_spi/models/spi_models.py b/hdl_spi/models/spi_models.py
index 3de4f7f..a1680d6 100644
--- a/hdl_spi/models/spi_models.py
+++ b/hdl_spi/models/spi_models.py
@@ -123,6 +123,7 @@ class SpiSlave:
 
             if first != csn_falling:
                 self._log.error(f"CSN did not fall in time ({max} {unit})!")
+                raise Exception(f"CSN did not fall in time ({max} {unit})!")
                 continue
 
             # csn fell
diff --git a/hdl_spi/src/rs_latch.vhd b/hdl_spi/src/rs_latch.vhd
index 64fd526..1af8dcd 100644
--- a/hdl_spi/src/rs_latch.vhd
+++ b/hdl_spi/src/rs_latch.vhd
@@ -11,16 +11,20 @@ entity rs_latch is
 end entity rs_latch;
 
 architecture a1 of rs_latch is
-
+  signal q : std_logic;
 begin  -- architecture a1
 
-  data: process (reset_i, set_i) is
+  data: process (all) is
   begin  -- process data
     if set_i = '1' then
-      q_o <= '1';
+      q <= '1';
     elsif reset_i = '1' then
-      q_o <= '0';
+      q <= '0';
+    else
+      q <= q;
     end if;
   end process data;
 
+  q_o <= q;
+
 end architecture a1;
diff --git a/hdl_spi/src/spi_masterslave.vhd b/hdl_spi/src/spi_masterslave.vhd
index f613321..00257e6 100644
--- a/hdl_spi/src/spi_masterslave.vhd
+++ b/hdl_spi/src/spi_masterslave.vhd
@@ -16,37 +16,45 @@ entity spi_masterslave is
 
   port (
     -- IOs
-    sck_io               : inout std_logic;
-    miso_io              : inout std_logic;
-    mosi_io              : inout std_logic;
-    csn_io               : inout std_logic;
+    sck_i                : in  std_logic;
+    miso_i               : in  std_logic;
+    mosi_i               : in  std_logic;
+    csn_i                : in  std_logic;
+    sck_o                : out std_logic;
+    miso_o               : out std_logic;
+    mosi_o               : out std_logic;
+    csn_o                : out std_logic;
+    sck_t                : out std_logic;
+    miso_t               : out std_logic;
+    mosi_t               : out std_logic;
+    csn_t                : out std_logic;
     -- Control
-    clk_i                : in    std_logic;
-    rst_in               : in    std_logic;
-    en_i                 : in    std_logic;
-    master_i             : in    std_logic;
-    clock_polarity_i     : in    std_logic;
-    clock_phase_i        : in    std_logic;
-    size_sel_i           : in    std_logic_vector(SIZES_2LOG - 1 downto 0);
-    div_sel_i            : in    std_logic_vector(DIVISORS_LOG2 - 1 downto 0);
-    pulse_csn_i          : in    std_logic;
-    rx_block_on_full_i   : in    std_logic;
-    lsbfirst_i           : in    std_logic;
+    clk_i                : in  std_logic;
+    rst_in               : in  std_logic;
+    en_i                 : in  std_logic;
+    master_i             : in  std_logic;
+    clock_polarity_i     : in  std_logic;
+    clock_phase_i        : in  std_logic;
+    size_sel_i           : in  std_logic_vector(SIZES_2LOG - 1 downto 0);
+    div_sel_i            : in  std_logic_vector(DIVISORS_LOG2 - 1 downto 0);
+    pulse_csn_i          : in  std_logic;
+    rx_block_on_full_i   : in  std_logic;
+    lsbfirst_i           : in  std_logic;
     -- Data
     -- Rx
-    rx_en_i              : in    std_logic;
-    rx_data_o            : out   std_logic_vector(get_max_natural(SIZES) - 1 downto 0);
-    rx_valid_o           : out   std_logic;
-    rx_ready_i           : in    std_logic;
+    rx_en_i              : in  std_logic;
+    rx_data_o            : out std_logic_vector(get_max_natural(SIZES) - 1 downto 0);
+    rx_valid_o           : out std_logic;
+    rx_ready_i           : in  std_logic;
     -- Tx
-    tx_en_i              : in    std_logic;
-    tx_data_i            : in    std_logic_vector(get_max_natural(SIZES) - 1 downto 0);
-    tx_valid_i           : in    std_logic;
-    tx_ready_o           : out   std_logic;
+    tx_en_i              : in  std_logic;
+    tx_data_i            : in  std_logic_vector(get_max_natural(SIZES) - 1 downto 0);
+    tx_valid_i           : in  std_logic;
+    tx_ready_o           : out std_logic;
     -- State
-    busy_o               : out   std_logic;
-    err_lost_rx_data_o   : out   std_logic;
-    clear_lost_rx_data_i : in    std_logic);
+    busy_o               : out std_logic;
+    err_lost_rx_data_o   : out std_logic;
+    clear_lost_rx_data_i : in  std_logic);
 
 end entity spi_masterslave;
 
@@ -106,6 +114,9 @@ architecture a1 of spi_masterslave is
   signal master_latch_sample_data : std_logic;
   signal master_latch_change_data : std_logic;
 
+  signal csn, sck, mosi, miso : std_logic;
+  signal csn_en, sck_en, mosi_en, miso_en : std_logic;
+
 begin  -- architecture a1
   master_en <= en_i and master_i;
   slave_en <= en_i and not master_i;
@@ -204,8 +215,8 @@ begin  -- architecture a1
       rst_in           => slave_ctrl_rst_n,
       clock_polarity_i => clock_polarity_i,
       clock_phase_i    => clock_phase_i,
-      sck_i            => sck_io,
-      csn_i            => csn_io,
+      sck_i            => sck_i,
+      csn_i            => csn_i,
       clock_rising_o   => slave_clock_rising,
       sample_data_o    => slave_latch_sample_data,
       change_data_o    => slave_latch_change_data);
@@ -243,72 +254,57 @@ begin  -- architecture a1
       q_o     => tx_serial_data,
       latch_i => latch_change_data_out);
 
-  master_connection : entity work.spi_multiplexor
-    port map (
-      en_i                => master_en,
-      mosi_en_i           => master_mosi_en,
-      miso_en_i           => master_miso_en,
-      sck_en_i            => master_sck_en,
-      csn_en_i            => master_csn_en,
-      mosi_i              => tx_serial_data(0),
-      miso_i              => '0',
-      sck_i               => master_sck,
-      csn_i               => master_csn,
-      mosi_o              => mosi_io,
-      miso_o              => miso_io,
-      sck_o               => sck_io,
-      csn_o               => csn_io,
-      rx_valid_i          => master_rx_valid,
-      rx_valid_o          => rx_valid_o,
-      tx_ready_i          => master_tx_ready,
-      tx_ready_o          => tx_ready_o,
-      busy_i              => master_busy,
-      busy_o              => busy_o,
-      err_lost_rx_data_i  => master_err_lost_rx_data,
-      err_lost_rx_data_o  => err_lost_rx_data_o,
-      rst_in              => master_ctrl_rst_n,
-      rst_on              => ctrl_rst_n,
-      latch_tx_data_i     => master_latch_new_tx_data,
-      latch_tx_data_o     => latch_new_tx_data,
-      latch_sample_data_i => master_latch_sample_data,
-      latch_sample_data_o => latch_sample_data,
-      latch_change_data_i => master_latch_change_data,
-      latch_change_data_o => latch_change_data_out,
-      rx_serial_i         => miso_io,
-      rx_serial_o         => rx_serial_data);
-
-  slave_connection : entity work.spi_multiplexor
-    port map (
-      en_i                => slave_en,
-      mosi_en_i           => slave_mosi_en,
-      miso_en_i           => slave_miso_en,
-      sck_en_i            => slave_sck_en,
-      csn_en_i            => slave_csn_en,
-      mosi_i              => '0',
-      miso_i              => tx_serial_data(0),
-      sck_i               => '0',
-      csn_i               => '0',
-      mosi_o              => mosi_io,
-      miso_o              => miso_io,
-      sck_o               => sck_io,
-      csn_o               => csn_io,
-      rx_valid_i          => slave_rx_valid,
-      rx_valid_o          => rx_valid_o,
-      tx_ready_i          => slave_tx_ready,
-      tx_ready_o          => tx_ready_o,
-      busy_i              => slave_busy,
-      busy_o              => busy_o,
-      err_lost_rx_data_i  => slave_err_lost_rx_data,
-      err_lost_rx_data_o  => err_lost_rx_data_o,
-      rst_in              => slave_ctrl_rst,
-      rst_on              => ctrl_rst_n,
-      latch_tx_data_i     => slave_latch_new_tx_data,
-      latch_tx_data_o     => latch_new_tx_data,
-      latch_sample_data_i => slave_latch_sample_data,
-      latch_sample_data_o => latch_sample_data,
-      latch_change_data_i => slave_latch_change_data,
-      latch_change_data_o => latch_change_data_out,
-      rx_serial_i         => mosi_io,
-      rx_serial_o         => rx_serial_data);
+  mosi_t <= slave_mosi_en when slave_en = '1' else
+             master_mosi_en when master_en = '1' else
+             '0';
+  miso_t <= slave_miso_en when slave_en = '1' else
+             master_miso_en when master_en = '1' else
+             '0';
+  sck_t <= slave_sck_en when slave_en = '1' else
+             master_sck_en when master_en = '1' else
+             '0';
+  csn_t <= slave_csn_en when slave_en = '1' else
+             master_csn_en when master_en = '1' else
+             '0';
+
+  mosi_o <= tx_serial_data(0) when master_en = '1' else
+          '0' when slave_en = '1' else
+          '0';
+
+  miso_o <= '0' when master_en = '1' else
+          tx_serial_data(0) when slave_en = '1' else '0';
+
+  sck_o <= master_sck when master_en = '1' else
+         '0';
+
+  csn_o <= master_csn when master_en = '1' else '0';
+
+  rx_valid_o <= master_rx_valid when master_en = '1' else
+                slave_rx_valid when slave_en = '1' else
+                '0';
+  tx_ready_o <= master_tx_ready when master_en = '1' else
+                slave_tx_ready when slave_en = '1' else
+                '0';
+  busy_o <= master_busy when master_en = '1' else
+                slave_busy when slave_en = '1' else
+                '0';
+  err_lost_rx_data_o <= master_err_lost_rx_data when master_en = '1' else
+                        slave_err_lost_rx_data when slave_en = '1' else
+                        '0';
+  ctrl_rst_n <= master_ctrl_rst_n when master_en = '1' else
+                slave_ctrl_rst_n when slave_en = '1' else
+                '0';
+  latch_new_tx_data <= master_latch_new_tx_data when master_en = '1' else
+                       slave_latch_new_tx_data when slave_en = '1' else
+                       '0';
+  rx_serial_data <= miso_i when master_en =  '1' else
+                    mosi_i when slave_en = '1' else
+                    '0';
+  latch_sample_data <= master_latch_sample_data when master_en = '1' else
+                slave_latch_sample_data when slave_en = '1' else
+                '0';
+  latch_change_data_out <= master_latch_change_data when master_en = '1' else
+                slave_latch_change_data when slave_en = '1' else
+                '0';
 
 end architecture a1;
diff --git a/hdl_spi/src/spi_multiplexor.vhd b/hdl_spi/src/spi_multiplexor.vhd
deleted file mode 100644
index c2d3a01..0000000
--- a/hdl_spi/src/spi_multiplexor.vhd
+++ /dev/null
@@ -1,63 +0,0 @@
-library ieee;
-use ieee.std_logic_1164.all;
-
-entity spi_multiplexor is
-
-  port (
-    en_i               : in  std_logic;
-    mosi_en_i          : in  std_logic;
-    miso_en_i          : in  std_logic;
-    sck_en_i           : in  std_logic;
-    csn_en_i           : in  std_logic;
-    mosi_i             : in  std_logic;
-    miso_i             : in  std_logic;
-    sck_i              : in  std_logic;
-    csn_i              : in  std_logic;
-    mosi_o             : out std_logic;
-    miso_o             : out std_logic;
-    sck_o              : out std_logic;
-    csn_o              : out std_logic;
-    rx_valid_i         : in  std_logic;
-    rx_valid_o         : out std_logic;
-    tx_ready_i         : in  std_logic;
-    tx_ready_o         : out std_logic;
-    busy_i             : in  std_logic;
-    busy_o             : out std_logic;
-    err_lost_rx_data_i : in  std_logic;
-    err_lost_rx_data_o : out std_logic;
-    rst_in             : in  std_logic;
-    rst_on             : out std_logic;
-
-    latch_tx_data_i : in  std_logic;
-    latch_tx_data_o : out std_logic;
-
-    latch_sample_data_i : in  std_logic;
-    latch_sample_data_o : out std_logic;
-
-    latch_change_data_i : in  std_logic;
-    latch_change_data_o : out std_logic;
-
-    rx_serial_i : in  std_logic;
-    rx_serial_o : out std_logic);
-
-end entity spi_multiplexor;
-
-architecture a1 of spi_multiplexor is
-
-begin  -- architecture a1
-
-  mosi_o <= mosi_i when mosi_en_i = '1' and en_i = '1' else 'Z';
-  miso_o <= miso_i when miso_en_i = '1' and en_i = '1' else 'Z';
-  sck_o <= sck_i when sck_en_i = '1' and en_i = '1' else'Z';
-  csn_o <= csn_i when csn_en_i = '1' and en_i = '1' else'Z';
-  rx_valid_o <= rx_valid_i when en_i = '1' else'Z';
-  tx_ready_o <= tx_ready_i when en_i = '1' else'Z';
-  busy_o <= busy_i when en_i = '1' else'Z';
-  err_lost_rx_data_o <= err_lost_rx_data_i when en_i = '1' else'Z';
-  rst_on <= rst_in when en_i = '1' else'Z';
-  latch_tx_data_o <= latch_tx_data_i when en_i = '1' else'Z';
-  latch_sample_data_o <= latch_sample_data_i when en_i = '1' else'Z';
-  latch_change_data_o <= latch_change_data_i when en_i = '1' else'Z';
-  rx_serial_o <= rx_serial_i when en_i = '1' else 'Z';
-
-end architecture a1;
diff --git a/hdl_spi/src/spi_peripheral.vhd b/hdl_spi/src/spi_peripheral.vhd
index 90e3926..da2a93d 100644
--- a/hdl_spi/src/spi_peripheral.vhd
+++ b/hdl_spi/src/spi_peripheral.vhd
@@ -20,10 +20,18 @@ entity spi_peripheral is
     write_i            : in    std_logic;
     read_i             : in    std_logic;
     -- IOs
-    sck_io             : inout std_logic;
-    miso_io            : inout std_logic;
-    mosi_io            : inout std_logic;
-    csn_io             : inout std_logic;
+    sck_i                : in  std_logic;
+    miso_i               : in  std_logic;
+    mosi_i               : in  std_logic;
+    csn_i                : in  std_logic;
+    sck_o                : out std_logic;
+    miso_o               : out std_logic;
+    mosi_o               : out std_logic;
+    csn_o                : out std_logic;
+    sck_t                : out std_logic;
+    miso_t               : out std_logic;
+    mosi_t               : out std_logic;
+    csn_t                : out std_logic;
     -- Control
     clk_i              : in    std_logic;
     rst_in             : in    std_logic;
@@ -131,10 +139,18 @@ begin  -- architecture a1
       CSN_PULSE_CYCLES => CSN_PULSE_CYCLES)
     port map (
       -- IOs
-      sck_io               => sck_io,
-      miso_io              => miso_io,
-      mosi_io              => mosi_io,
-      csn_io               => csn_io,
+      sck_o               => sck_o,
+      miso_o              => miso_o,
+      mosi_o              => mosi_o,
+      csn_o               => csn_o,
+      sck_i               => sck_i,
+      miso_i              => miso_i,
+      mosi_i              => mosi_i,
+      csn_i               => csn_i,
+      sck_t               => sck_t,
+      miso_t              => miso_t,
+      mosi_t              => mosi_t,
+      csn_t               => csn_t,
       -- Control
       clk_i                => clk_i,
       rst_in               => rst_in,
@@ -207,9 +223,9 @@ begin  -- architecture a1
     case raddress_i is
       when CTRL_ADDRESS => rdata_o <= reg_control;
       when STATUS_ADDRESS => rdata_o <= reg_status;
-      when DATA_ADDRESS => rdata_o <= (rx_buffer'range => rx_buffer, others => '0');
+      when DATA_ADDRESS => rdata_o <= (15 downto 0 => rx_buffer, others => '0');
       when INTMASK_ADDRESS => rdata_o <= reg_intmask;
-      when others => null;
+      when others => rdata_o <= (others => '0');
     end case;
   end process output_register;
 
@@ -253,7 +269,7 @@ begin  -- architecture a1
                 err_lost_rx_data &
                 busy &
                 "0" &
-                tx_buffer_full &
+                (not tx_buffer_full) &
                 rx_buffer_full;
 
   tx_data <= tx_buffer;
diff --git a/hdl_spi/tests/Makefile b/hdl_spi/tests/Makefile
index b1f3a9a..84b3292 100644
--- a/hdl_spi/tests/Makefile
+++ b/hdl_spi/tests/Makefile
@@ -6,7 +6,7 @@ TOPLEVEL_LANG ?= vhdl
 
 SRC = $(PWD)/../src
 
-VHDL_SOURCES=$(SRC)/spi_pkg.vhd $(SRC)/rs_latch.vhd $(SRC)/register.vhd $(SRC)/shift_register.vhd $(SRC)/spi_clkgen.vhd $(SRC)/spi_clkmon.vhd $(SRC)/spi_multiplexor.vhd $(SRC)/spi_slave_ctrl.vhd $(SRC)/spi_master_ctrl.vhd $(SRC)/spi_master.vhd $(SRC)/spi_masterslave.vhd $(SRC)/spi_peripheral.vhd
+VHDL_SOURCES=$(SRC)/spi_pkg.vhd $(SRC)/rs_latch.vhd $(SRC)/register.vhd $(SRC)/shift_register.vhd $(SRC)/spi_clkgen.vhd $(SRC)/spi_clkmon.vhd $(SRC)/spi_slave_ctrl.vhd $(SRC)/spi_master_ctrl.vhd $(SRC)/spi_master.vhd $(SRC)/spi_masterslave.vhd $(SRC)/spi_peripheral.vhd
 
 VCOM_ARGS = -2008
 GHDL_ARGS= --std=08
diff --git a/hdl_spi/tests/test_spi_masterslave.py b/hdl_spi/tests/test_spi_masterslave.py
index c85f89f..967a86d 100644
--- a/hdl_spi/tests/test_spi_masterslave.py
+++ b/hdl_spi/tests/test_spi_masterslave.py
@@ -18,7 +18,7 @@ if cocotb.simulator.is_running():
 
 async def init(dut, master: int = 1, tx_en: int = 1):
     dut._log.info("Init started!")
-    dut.miso_io.value = 0;
+    dut.miso_i.value = 0;
     dut.rst_in.value = 0;
     dut.lsbfirst_i.value = 0;
     dut.clock_polarity_i.value = 0;
@@ -157,7 +157,7 @@ class DutDriver:
 @cocotb.test()
 async def single_transmit(dut):
     clk = Clock(dut.clk_i, 5, "ns")
-    interface = SpiInterface(dut.csn_io, dut.sck_io, dut.miso_io, dut.mosi_io)
+    interface = SpiInterface(dut.csn_o, dut.sck_o, dut.miso_i, dut.mosi_o)
     config = SpiConfig(8, RisingEdge, FallingEdge, 10, "ns")
     slave = SpiSlave(interface, config)
     driver = DutDriver(dut)
@@ -197,7 +197,7 @@ async def single_transmit(dut):
 @cocotb.test()
 async def lsbfirst(dut):
     clk = Clock(dut.clk_i, 5, "ns")
-    interface = SpiInterface(dut.csn_io, dut.sck_io, dut.miso_io, dut.mosi_io)
+    interface = SpiInterface(dut.csn_o, dut.sck_o, dut.miso_i, dut.mosi_o)
     config = SpiConfig(8, RisingEdge, FallingEdge, 10, "ns")
     slave = SpiSlave(interface, config)
     driver = DutDriver(dut)
@@ -250,7 +250,7 @@ async def lsbfirst(dut):
 @cocotb.test()
 async def rx_tx_disabled(dut):
     clk = Clock(dut.clk_i, 5, "ns")
-    interface = SpiInterface(dut.csn_io, dut.sck_io, dut.miso_io, dut.mosi_io)
+    interface = SpiInterface(dut.csn_o, dut.sck_o, dut.miso_i, dut.mosi_o)
     config = SpiConfig(8, RisingEdge, FallingEdge, 10, "ns")
     slave = SpiSlave(interface, config)
     driver = DutDriver(dut)
@@ -305,7 +305,7 @@ async def rx_tx_disabled(dut):
     await FallingEdge(dut.clk_i)
     await FallingEdge(dut.clk_i)
 
-    assert str(dut.mosi_io.value[0]) == "Z"
+    assert int(dut.mosi_t.value) == 0
 
     await slave.send_data(tx, 8)
     await slave.expect_transaction_in(15, "ns")
@@ -314,7 +314,7 @@ async def rx_tx_disabled(dut):
     await driver.send_data(rx)
 
     timeout = Timer(10 * (8 + 5), "ns")
-    mosi_event = Edge(dut.mosi_io)
+    mosi_event = Edge(dut.mosi_t)
 
     res = await First(timeout, mosi_event)
     if res == mosi_event:
@@ -361,7 +361,7 @@ async def perform_multiple_transmits(count, dut, slave, driver, size = 8):
 @cocotb.test()
 async def multiple_transmits(dut):
     clk = Clock(dut.clk_i, 5, "ns")
-    interface = SpiInterface(dut.csn_io, dut.sck_io, dut.miso_io, dut.mosi_io)
+    interface = SpiInterface(dut.csn_o, dut.sck_o, dut.miso_i, dut.mosi_o)
     config = SpiConfig(8, RisingEdge, FallingEdge, 10, "ns")
     slave = SpiSlave(interface, config)
     driver = DutDriver(dut)
@@ -383,7 +383,7 @@ async def multiple_transmits(dut):
 @cocotb.test()
 async def lost_rx_data(dut):
     clk = Clock(dut.clk_i, 5, "ns")
-    interface = SpiInterface(dut.csn_io, dut.sck_io, dut.miso_io, dut.mosi_io)
+    interface = SpiInterface(dut.csn_o, dut.sck_o, dut.miso_i, dut.mosi_o)
     config = SpiConfig(8, RisingEdge, FallingEdge, 10, "ns")
     slave = SpiSlave(interface, config)
     driver = DutDriver(dut)
@@ -407,7 +407,7 @@ async def lost_rx_data(dut):
 @cocotb.test()
 async def different_clock(dut):
     clk = Clock(dut.clk_i, 5, "ns")
-    interface = SpiInterface(dut.csn_io, dut.sck_io, dut.miso_io, dut.mosi_io)
+    interface = SpiInterface(dut.csn_o, dut.sck_o, dut.miso_i, dut.mosi_o)
     config = SpiConfig(8, RisingEdge, FallingEdge, 20, "ns")
     slave = SpiSlave(interface, config)
     driver = DutDriver(dut)
@@ -430,7 +430,7 @@ async def different_clock(dut):
 @cocotb.test()
 async def inverted_clock(dut):
     clk = Clock(dut.clk_i, 5, "ns")
-    interface = SpiInterface(dut.csn_io, dut.sck_io, dut.miso_io, dut.mosi_io)
+    interface = SpiInterface(dut.csn_o, dut.sck_o, dut.miso_i, dut.mosi_o)
     config = SpiConfig(8, RisingEdge, FallingEdge, 20, "ns")
     slave = SpiSlave(interface, config)
     driver = DutDriver(dut)
@@ -454,7 +454,7 @@ async def inverted_clock(dut):
 @cocotb.test()
 async def shifted_inverted_clock(dut):
     clk = Clock(dut.clk_i, 5, "ns")
-    interface = SpiInterface(dut.csn_io, dut.sck_io, dut.miso_io, dut.mosi_io)
+    interface = SpiInterface(dut.csn_o, dut.sck_o, dut.miso_i, dut.mosi_o)
     config = SpiConfig(8, FallingEdge, RisingEdge, 20, "ns")
     slave = SpiSlave(interface, config)
     driver = DutDriver(dut)
@@ -485,7 +485,7 @@ async def shifted_inverted_clock(dut):
 @cocotb.test()
 async def sixteen_bits(dut):
     clk = Clock(dut.clk_i, 5, "ns")
-    interface = SpiInterface(dut.csn_io, dut.sck_io, dut.miso_io, dut.mosi_io)
+    interface = SpiInterface(dut.csn_o, dut.sck_o, dut.miso_i, dut.mosi_o)
     config = SpiConfig(16, FallingEdge, RisingEdge, 20, "ns")
     slave = SpiSlave(interface, config)
     driver = DutDriver(dut)
@@ -512,7 +512,7 @@ async def sixteen_bits(dut):
 @cocotb.test()
 async def rx_blocking_tx(dut):
     clk = Clock(dut.clk_i, 5, "ns")
-    interface = SpiInterface(dut.csn_io, dut.sck_io, dut.miso_io, dut.mosi_io)
+    interface = SpiInterface(dut.csn_o, dut.sck_o, dut.miso_i, dut.mosi_o)
     config = SpiConfig(16, RisingEdge, FallingEdge, 10, "ns", csn_pulse = True)
     slave = SpiSlave(interface, config)
     driver = DutDriver(dut)
@@ -537,7 +537,7 @@ async def rx_blocking_tx(dut):
 @cocotb.test()
 async def csn_pulse(dut):
     clk = Clock(dut.clk_i, 5, "ns")
-    interface = SpiInterface(dut.csn_io, dut.sck_io, dut.miso_io, dut.mosi_io)
+    interface = SpiInterface(dut.csn_o, dut.sck_o, dut.miso_i, dut.mosi_o)
     config = SpiConfig(16, RisingEdge, FallingEdge, 20, "ns", csn_pulse = True)
     slave = SpiSlave(interface, config)
     driver = DutDriver(dut)
@@ -574,7 +574,6 @@ def spi_tests_runner():
         proj_path / "src" / "shift_register.vhd",
         proj_path / "src" / "spi_clkgen.vhd",
         proj_path / "src" / "spi_clkmon.vhd",
-        proj_path / "src" / "spi_multiplexor.vhd",
         proj_path / "src" / "spi_slave_ctrl.vhd",
         proj_path / "src" / "spi_master_ctrl.vhd",
         proj_path / "src" / "spi_master.vhd",
diff --git a/hdl_spi/tests/test_spi_peripheral.py b/hdl_spi/tests/test_spi_peripheral.py
index c577f5d..4e55430 100644
--- a/hdl_spi/tests/test_spi_peripheral.py
+++ b/hdl_spi/tests/test_spi_peripheral.py
@@ -120,7 +120,7 @@ class DutDriver:
 @cocotb.test()
 async def single_transission(dut):
     clk = Clock(dut.clk_i, 5, "ns")
-    interface = SpiInterface(dut.csn_io, dut.sck_io, dut.miso_io, dut.mosi_io)
+    interface = SpiInterface(dut.csn_o, dut.sck_o, dut.miso_i, dut.mosi_o)
     config = SpiConfig(16, RisingEdge, FallingEdge, 40, "ns")
     slave = SpiSlave(interface, config)
     driver = DutDriver(dut)
@@ -149,7 +149,7 @@ async def single_transission(dut):
     tx = random.randint(0, 255)
 
     await slave.send_data(tx, 16)
-    await slave.expect_transaction_in(20, "ns")
+    await slave.expect_transaction_in(100, "ns")
 
     await driver.write(ADDR_DATA, rx)
 
@@ -181,7 +181,6 @@ def spi_peripheral_tests_runner():
         proj_path / "src" / "shift_register.vhd",
         proj_path / "src" / "spi_clkgen.vhd",
         proj_path / "src" / "spi_clkmon.vhd",
-        proj_path / "src" / "spi_multiplexor.vhd",
         proj_path / "src" / "spi_slave_ctrl.vhd",
         proj_path / "src" / "spi_master_ctrl.vhd",
         proj_path / "src" / "spi_master.vhd",
-- 
2.48.1