basic automated functional test
diff --git a/verilog/dv/caravel/rapcore/io_ports/io_ports_tb.v b/verilog/dv/caravel/rapcore/io_ports/io_ports_tb.v
index 3d9caee..410e501 100644
--- a/verilog/dv/caravel/rapcore/io_ports/io_ports_tb.v
+++ b/verilog/dv/caravel/rapcore/io_ports/io_ports_tb.v
@@ -40,11 +40,8 @@
 	reg power1, power2;
 	reg power3, power4;
 
-    	wire gpio;
-    	wire [37:0] mprj_io;
-	wire [16:0] mprj_io_0;
-
-	assign mprj_io_0 = mprj_io[30:14];
+	wire gpio;
+	wire [37:0] mprj_io;
     assign mprj_io[3] = 1'b1;
 
 	// External clock is used by default.  Make this artificially fast for the
@@ -73,15 +70,70 @@
 	end
 
 	initial begin
-	    // Observe Output pins [7:0]
-		wait(mprj_io_0 == 17'b01000011001100110);
-		wait(mprj_io_0 == 17'b01100011000101110);
-		wait(mprj_io_0 == 17'b01000011001100110);
-		wait(mprj_io_0 == 17'b01100011001100011);
-		wait(mprj_io_0 == 17'b01000011001100110);
-		wait(mprj_io_0 == 17'b01110011000101110);
-		wait(mprj_io_0 == 17'b01101011001100011);
-		wait(mprj_io_0 == 17'b01100011001100011);
+	    // Observe Output pins
+		wait(mprj_io[24] == 1'b1); // Move done =0
+		wait(mprj_io[37:36] == 2'b10); // DTR:CIPO
+		#1 $display("SPI response");
+		wait(mprj_io[37:36] == 2'b11);
+		wait(mprj_io[37:36] == 2'b10);
+		#1 $display("Encoder data transmit");
+		wait(mprj_io[15] == 1'b1);
+		wait(mprj_io[15] == 1'b0);
+		wait(mprj_io[15] == 1'b1);
+		#1 $display("Charge pump switching");
+		wait(mprj_io[27] == 1'b1);
+		wait(mprj_io[27] == 1'b0);
+		wait(mprj_io[27] == 1'b1);
+		wait(mprj_io[28] == 1'b1);
+		wait(mprj_io[28] == 1'b0);
+		wait(mprj_io[28] == 1'b1);
+		#1 $display("Both ADC outputs switching");
+		wait(mprj_io[24] == 1'b1);
+		#1 $display("DDA running");
+		wait(mprj_io[30] == 0); // Step out
+		wait(mprj_io[31] == 0); // Direction output only tested in one direction
+		wait(mprj_io[30] == 1); // Step out
+		wait(mprj_io[30] == 0); // Step out
+		#1 $display("Step out switching");
+		wait(mprj_io[23] == 1'b1);
+		wait(mprj_io[19] == 1'b1);
+		wait(mprj_io[16] == 1'b1);
+		wait(mprj_io[20] == 1'b1);
+		wait(mprj_io[21] == 1'b1);
+		wait(mprj_io[18] == 1'b1);
+		wait(mprj_io[14] == 1'b1);
+		wait(mprj_io[17] == 1'b1);
+
+		wait(mprj_io[23] == 1'b0);
+		wait(mprj_io[19] == 1'b0);
+		wait(mprj_io[16] == 1'b0);
+		wait(mprj_io[20] == 1'b0);
+		wait(mprj_io[21] == 1'b0);
+		wait(mprj_io[18] == 1'b0);
+		wait(mprj_io[14] == 1'b0);
+		wait(mprj_io[17] == 1'b0);
+
+		wait(mprj_io[23] == 1'b1);
+		wait(mprj_io[19] == 1'b1);
+		wait(mprj_io[16] == 1'b1);
+		wait(mprj_io[20] == 1'b1);
+		wait(mprj_io[21] == 1'b1);
+		wait(mprj_io[18] == 1'b1);
+		wait(mprj_io[14] == 1'b1);
+		wait(mprj_io[17] == 1'b1);
+
+		wait(mprj_io[23] == 1'b0);
+		wait(mprj_io[19] == 1'b0);
+		wait(mprj_io[16] == 1'b0);
+		wait(mprj_io[20] == 1'b0);
+		wait(mprj_io[21] == 1'b0);
+		wait(mprj_io[18] == 1'b0);
+		wait(mprj_io[14] == 1'b0);
+		wait(mprj_io[17] == 1'b0);
+		#1 $display("Bridge outputs switching");
+		//wait(mprj_io[10] ==  // Enable output
+		//wait(mprj_io[24] ==  // Move done
+		//wait(mprj_io[29] ==  // Halt
 	    $display("Monitor: Test 1 RAPcores Passed");
 	    $finish;
 	end
@@ -107,8 +159,8 @@
         //bootdone <= 1'b1;
 	end
 
-	always @(mprj_io) begin
-		#1 $display("MPRJ-IO state = %b ", mprj_io[37:0]);
+	always @(mprj_io[5]) begin
+		#1 $display("Booting ", mprj_io[37:5]);
 	end
 
 	wire flash_csb;