tb wip
diff --git a/rapcores b/rapcores
index b7587ab..af0fa8a 160000
--- a/rapcores
+++ b/rapcores
@@ -1 +1 @@
-Subproject commit b7587ab780f9b5c5c3a264019ab4ee1e8c0964fd
+Subproject commit af0fa8a9764b66a8737bf6f1ab3b89956ffd4c71
diff --git a/verilog/dv/caravel/user_proj_example/io_ports/Makefile b/verilog/dv/caravel/user_proj_example/io_ports/Makefile
index 2f91b86..8237f6f 100644
--- a/verilog/dv/caravel/user_proj_example/io_ports/Makefile
+++ b/verilog/dv/caravel/user_proj_example/io_ports/Makefile
@@ -1,4 +1,5 @@
 FIRMWARE_PATH = ../..
+VERILOG_PATH = ../../../..
 RTL_PATH = ../../../../rtl
 IP_PATH = ../../../../ip
 BEHAVIOURAL_MODELS = ../../
@@ -21,16 +22,14 @@
 %.vvp: %_tb.v %.hex
 ifeq ($(SIM),RTL)
 	iverilog -DFUNCTIONAL -DSIM -I $(BEHAVIOURAL_MODELS) \
-	-I $(PDK_PATH) -I $(IP_PATH) -I $(RTL_PATH) -I $(RAPCORES_PATH)/.. -I $(RAPCORES_PATH)/src \
- 	-I $(RAPCORES_PATH)/testbench -I $(RAPCORES_PATH)/boards \
+	-I $(PDK_PATH) -I $(IP_PATH) -I $(RTL_PATH) -I $(RAPCORES_PATH)/.. -I $(RAPCORES_PATH)/src -I $(RAPCORES_PATH)/testbench -I $(RAPCORES_PATH)/boards \
 	-o $@ $<
 else
-	iverilog -DFUNCTIONAL -DSIM -DGL -I $(BEHAVIOURAL_MODELS) -I $(RAPCORES_PATH)/boards \
-	-I $(PDK_PATH) -I $(IP_PATH) -I $(RTL_PATH) -I $(VERILOG_PATH) -I $(RAPCORES_PATH)/.. -I $(RAPCORES_PATH)/src \
- 	-I $(RAPCORES_PATH)/testbench -I $(RAPCORES_PATH)/boards \
-	$< -o $@
+	iverilog -DPROJ_GL -DFUNCTIONAL -DSIM -I $(BEHAVIOURAL_MODELS) \
+	-I $(PDK_PATH) -I $(IP_PATH) -I $(VERILOG_PATH) -I $(RTL_PATH) -I $(RAPCORES_PATH)/.. -I $(RAPCORES_PATH)/src \
+	-o $@ $<
 endif
-# MERGE: -I $(VERILOG_PATH) maybe needed for GL
+
 
 %.vcd: %.vvp
 	vvp $<
diff --git a/verilog/dv/caravel/user_proj_example/io_ports/io_ports.c b/verilog/dv/caravel/user_proj_example/io_ports/io_ports.c
index add8845..19c3652 100644
--- a/verilog/dv/caravel/user_proj_example/io_ports/io_ports.c
+++ b/verilog/dv/caravel/user_proj_example/io_ports/io_ports.c
@@ -8,7 +8,7 @@
 
 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   |
@@ -16,8 +16,8 @@
 	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       |
@@ -65,7 +65,7 @@
         reg_mprj_xfer = 1;
         while (reg_mprj_xfer == 1);
 
-	// Configure LA probes [31:0], [127:64] as inputs to the cpu 
+	// Configure LA probes [31:0], [127:64] as inputs to the cpu
 	// Configure LA probes [63:32] as outputs from the cpu
 	reg_la0_ena = 0xFFFFFFFF;    // [31:0]
 	reg_la1_ena = 0x00000000;    // [95:64]
@@ -76,4 +76,3 @@
 	reg_la2_data = 0x00000003;
 
 }
-
diff --git a/verilog/dv/caravel/user_proj_example/io_ports/io_ports.hex b/verilog/dv/caravel/user_proj_example/io_ports/io_ports.hex
new file mode 100755
index 0000000..246493d
--- /dev/null
+++ b/verilog/dv/caravel/user_proj_example/io_ports/io_ports.hex
@@ -0,0 +1,56 @@
+@00000000

+81 40 81 41 01 42 81 42 01 43 81 43 01 44 81 44

+01 45 81 45 01 46 81 46 01 47 81 47 01 48 81 48

+01 49 81 49 01 4A 81 4A 01 4B 81 4B 01 4C 81 4C

+01 4D 81 4D 01 4E 81 4E 01 4F 81 4F 17 05 00 00

+13 05 45 33 93 05 00 00 13 06 00 00 63 D8 C5 00

+14 41 94 C1 11 05 91 05 E3 CC C5 FE 13 05 00 00

+93 05 00 00 63 57 B5 00 23 20 05 00 11 05 E3 4D

+B5 FE 71 28 01 A0 01 00 B7 02 00 28 13 03 00 12

+23 90 62 00 A3 81 02 00 05 C6 21 4F 93 73 F6 0F

+93 DE 73 00 23 80 D2 01 93 EE 0E 01 23 80 D2 01

+86 03 93 F3 F3 0F 7D 1F E3 14 0F FE 23 80 62 00

+A1 C9 13 0F 00 02 83 23 05 00 A1 4F 93 DE F3 01

+23 80 D2 01 93 EE 0E 01 23 80 D2 01 83 CE 02 00

+93 FE 2E 00 93 DE 1E 00 86 03 B3 E3 D3 01 7D 1F

+63 17 0F 00 23 20 75 00 11 05 83 23 05 00 FD 1F

+E3 96 0F FC FD 15 F1 F1 63 04 0F 00 23 20 75 00

+13 03 00 08 A3 81 62 00 82 80 01 00 00 00 41 11

+22 C6 00 08 B7 07 00 26 93 87 07 02 09 67 13 07

+87 80 98 C3 B7 07 00 26 93 87 47 02 09 67 13 07

+87 80 98 C3 B7 07 00 26 93 87 87 02 09 67 13 07

+87 80 98 C3 B7 07 00 26 93 87 C7 02 09 67 13 07

+87 80 98 C3 B7 07 00 26 93 87 07 03 09 67 13 07

+87 80 98 C3 B7 07 00 26 93 87 47 03 09 67 13 07

+87 80 98 C3 B7 07 00 26 93 87 87 03 13 07 20 40

+98 C3 B7 07 00 26 93 87 C7 03 13 07 20 40 98 C3

+B7 07 00 26 93 87 C7 05 09 67 13 07 87 80 98 C3

+B7 07 00 26 93 87 07 06 09 67 13 07 87 80 98 C3

+B7 07 00 26 93 87 87 05 09 67 13 07 87 80 98 C3

+B7 07 00 26 93 87 C7 05 09 67 13 07 87 80 98 C3

+B7 07 00 26 93 87 07 06 09 67 13 07 87 80 98 C3

+B7 07 00 26 93 87 47 06 09 67 13 07 87 80 98 C3

+B7 07 00 26 93 87 87 06 09 67 13 07 87 80 98 C3

+B7 07 00 26 93 87 C7 06 09 67 13 07 87 80 98 C3

+B7 07 00 26 93 87 07 07 09 67 13 07 87 80 98 C3

+B7 07 00 26 93 87 47 07 09 67 13 07 87 80 98 C3

+B7 07 00 26 93 87 87 07 13 07 20 40 98 C3 B7 07

+00 26 93 87 C7 07 09 67 13 07 87 80 98 C3 B7 07

+00 26 93 87 07 08 09 67 13 07 87 80 98 C3 B7 07

+00 26 93 87 47 08 13 07 20 40 98 C3 B7 07 00 26

+93 87 87 08 13 07 20 40 98 C3 B7 07 00 26 93 87

+C7 08 09 67 13 07 87 80 98 C3 B7 07 00 26 93 87

+07 09 09 67 13 07 87 80 98 C3 B7 07 00 26 93 87

+47 09 13 07 20 40 98 C3 B7 07 00 26 93 87 87 09

+09 67 13 07 87 80 98 C3 B7 07 00 26 93 87 C7 09

+09 67 13 07 87 80 98 C3 B7 07 00 26 93 87 07 0A

+13 07 20 40 98 C3 B7 07 00 26 93 87 47 0A 13 07

+20 40 98 C3 B7 07 00 26 93 87 87 0A 13 07 20 40

+98 C3 B7 07 00 26 93 87 C7 0A 13 07 20 40 98 C3

+B7 07 00 26 93 87 07 0B 09 67 13 07 87 80 98 C3

+B7 07 00 26 93 87 47 0B 09 67 13 07 87 80 98 C3

+B7 07 00 26 05 47 98 C3 01 00 B7 07 00 26 98 43

+85 47 E3 0C F7 FE B7 07 00 25 C1 07 7D 57 98 C3

+B7 07 00 25 D1 07 23 A0 07 00 B7 07 00 25 E1 07

+23 A0 07 00 B7 07 00 25 F1 07 7D 57 98 C3 B7 07

+00 25 A1 07 0D 47 98 C3 01 00 32 44 41 01 82 80

diff --git a/verilog/dv/caravel/user_proj_example/io_ports/io_ports.vvp b/verilog/dv/caravel/user_proj_example/io_ports/io_ports.vvp
new file mode 100755
index 0000000..07064c5
--- /dev/null
+++ b/verilog/dv/caravel/user_proj_example/io_ports/io_ports.vvp
Binary files differ
diff --git a/verilog/dv/caravel/user_proj_example/io_ports/io_ports_tb.v b/verilog/dv/caravel/user_proj_example/io_ports/io_ports_tb.v
index 5148a69..79aaa81 100644
--- a/verilog/dv/caravel/user_proj_example/io_ports/io_ports_tb.v
+++ b/verilog/dv/caravel/user_proj_example/io_ports/io_ports_tb.v
@@ -2,9 +2,6 @@
 
 `timescale 1 ns / 1 ps
 
-//`define USE_POWER_PINS
-
-
 `include "defines.v"
 `include "mpw_one_defines.v"
 `include "macro_params.v"
@@ -24,9 +21,12 @@
 `include "rapcore.v"
 `include "hbridge_coil.v"
 `include "pwm_duty.v"
+`include "rapcore_harness_tb.v"
 
-`ifdef GL
-  `include "gl/rapcores.v"
+//`define USE_POWER_PINS
+
+`ifdef PROJ_GL
+  `include "gl/rapcore.v"
 `else
   `include "rapcores.v"
 `endif
@@ -135,86 +135,40 @@
     wire signed  [12:0]  current1;
     wire signed  [12:0]  current2;
 
-	wire analog_out1;
-	wire analog_out2;
-    reg             analog_cmp1;
-    reg             analog_cmp2;
-    reg     [40:0]  step_clock;
-    reg     [20:0]  cnt;
-    reg     [12:0]  current_abs1;
-    reg     [12:0]  current_abs2;
-    wire            phase_a1_l;
-    wire            phase_a2_l;
-    wire            phase_b1_l;
-    wire            phase_b2_l;
-    wire            phase_a1_h;
-    wire            phase_a2_h;
-    wire            phase_b1_h;
-    wire            phase_b2_h;
-	wire 			resetn;
+	//assign resetn = RSTB;
 
-//	assign CHARGEPUMP		= mprj_io[15];
-	assign analog_out1		= mprj_io[27];
-	assign analog_out2		= mprj_io[28];
-	assign phase_a1_l			= mprj_io[23];
-	assign phase_a2_l			= mprj_io[19];
-	assign phase_b1_l			= mprj_io[16];
-	assign phase_b2_l			= mprj_io[20];
-	assign phase_a1_h		= mprj_io[21];
-	assign phase_a2_h		= mprj_io[18];
-	assign phase_b1_h		= mprj_io[14];
-	assign phase_b2_h		= mprj_io[17];
-//	assign BUFFER_DTR		= mprj_io[37];
-//	assign MOVE_DONE		= mprj_io[24];
-//	assign CIPO				= mprj_io[36];
-//	assign STEPOUTPUT		= mprj_io[30];
-//	assign DIROUTPUT		= mprj_io[31];
-	assign mprj_io[25]		= analog_cmp1;
-	assign mprj_io[26]		= analog_cmp2;
-//	assign mprj_io[18]		= ENC_B;
-//	assign mprj_io[19]		= ENC_A;
-//	assign mprj_io[29]		= HALT;
-//	assign mprj_io[35]		= SCK;
-//	assign mprj_io[34]		= CS;
-//	assign mprj_io[22]		= COPI;
-	assign mprj_io[32]		= step;
-	assign mprj_io[33]		= dir;
-	assign resetn = RSTB;
-
-    always @(posedge clock) begin
-        if (!resetn) begin
-            cnt <= 0;
-            analog_cmp1 <= 1;
-            analog_cmp2 <= 1;
-            step <= 1;
-            step_clock <= 40'b0;
-        end
-        else begin
-            cnt <= cnt + 1;
-            enable_in <= 1;
-            if (current1[12] == 1'b1) begin
-                current_abs1 = -current1;
-            end
-            else begin
-                current_abs1 = current1;
-            end
-            if (current2[12] == 1'b1) begin
-                current_abs2 = -current2;
-            end
-            else begin
-                current_abs2 = current2;
-            end
-            step_clock <= step_clock + 1;
-            step <= step_clock[10];
-            analog_cmp1 <= (current_abs1[11:0] >= target_current1[11:0]); // compare unsigned
-            analog_cmp2 <= (current_abs2[11:0] >= target_current2[11:0]);
-            if (cnt <= 20'hC400) begin
-                dir <= 1;
-            end
-            else
-                dir <= 0;
-        end
-    end
+  rapcore_harness harness0 (
+        .CLK(clock),
+        //.resetn_in(resetn),
+        .CHARGEPUMP(mprj_io[15]),
+        .analog_cmp1(mprj_io[25]),
+        .analog_out1(mprj_io[27]),
+        .analog_cmp2(mprj_io[26]),
+        .analog_out2(mprj_io[28]),
+        .PHASE_A1(mprj_io[23]),
+        .PHASE_A2(mprj_io[19]),
+        .PHASE_B1(mprj_io[16]),
+        .PHASE_B2(mprj_io[20]),
+        .PHASE_A1_H(mprj_io[21]),
+        .PHASE_A2_H(mprj_io[18]),
+        .PHASE_B1_H(mprj_io[14]),
+        .PHASE_B2_H(mprj_io[17]),
+        .ENC_B(mprj_io[12]),
+        .ENC_A(mprj_io[13]),
+        .BUFFER_DTR(mprj_io[37]),
+        .MOVE_DONE(mprj_io[24]),
+        .HALT(mprj_io[29]),
+        .SCK(mprj_io[35]),
+        .CS(mprj_io[34]),
+        .COPI(mprj_io[22]),
+        .CIPO(mprj_io[36]),
+        .STEPOUTPUT(mprj_io[30]),
+        .DIROUTPUT(mprj_io[31]),
+        .STEPINPUT(mprj_io[32]),
+        .DIRINPUT(mprj_io[33]),
+        .ENINPUT(mprj_io[11]),
+        .ENOUTPUT(mprj_io[10])
+  );
 
 	caravel uut (
 		.vddio	  (VDD3V3),
@@ -253,37 +207,5 @@
 		.io3()			// not used
 	);
 
-    pwm_duty duty1(
-        .clk(clock),
-        .resetn(resetn),
-        .pwm(analog_out1),
-        .duty(target_current1)
-    );
-    pwm_duty duty2(
-        .clk(clock),
-        .resetn(resetn),
-        .pwm(analog_out2),
-        .duty(target_current2)
-    );
-    hbridge_coil hbridge_coil1(
-        .clk(clock),
-        .resetn(resetn),
-        .low_1(phase_a1_l),
-        .high_1(phase_a1_h),
-        .low_2(phase_a2_l),
-        .high_2(phase_a2_h),
-        .current(current1),
-        .polarity_invert_config(1'b0)
-    );
-    hbridge_coil hbridge_coil2(
-        .clk(clock),
-        .resetn(resetn),
-        .low_1(phase_b1_l),
-        .high_1(phase_b1_h),
-        .low_2(phase_b2_l),
-        .high_2(phase_b2_h),
-        .current(current2),
-        .polarity_invert_config(1'b0)
-    );
 endmodule
 `default_nettype wire