Split the main power supply into managment and two user areas.  Mostly
put back together again from phase2, although only the gpio testbench
has been updated, and the gpio tesbench is currently not passing although
most signals seem to be right.  Modified the memory map to allow for an
additional word in the management I/O GPIO read/write data, and rewrote
the code to handle any number of I/Os in the user space, expanding the
memory map by one word for every 32 user GPIO pads (there are currently
37 user GPIO pads specified, so this change resolves issues with the
upper 5 pads;  the last phase2 design defined only 32 user I/O pads).
diff --git a/verilog/dv/caravel/defs.h b/verilog/dv/caravel/defs.h
index 660b103..f777c39 100644
--- a/verilog/dv/caravel/defs.h
+++ b/verilog/dv/caravel/defs.h
@@ -35,47 +35,48 @@
 #define reg_la3_ena (*(volatile uint32_t*)0x2200001c)
 
 // Mega Project Control (0x2300_0000)
-#define reg_mprj_data (*(volatile uint32_t*)0x23000000)
-#define reg_mprj_xfer (*(volatile uint32_t*)0x23000004)
+#define reg_mprj_datal (*(volatile uint32_t*)0x23000000)
+#define reg_mprj_datah (*(volatile uint32_t*)0x23000004)
+#define reg_mprj_xfer (*(volatile uint32_t*)0x23000008)
 
-#define reg_mprj_io_0 (*(volatile uint32_t*)0x23000008)
-#define reg_mprj_io_1 (*(volatile uint32_t*)0x2300000c)
-#define reg_mprj_io_2 (*(volatile uint32_t*)0x23000010)
-#define reg_mprj_io_3 (*(volatile uint32_t*)0x23000014)
-#define reg_mprj_io_4 (*(volatile uint32_t*)0x23000018)
-#define reg_mprj_io_5 (*(volatile uint32_t*)0x2300001c)
-#define reg_mprj_io_6 (*(volatile uint32_t*)0x23000020)
+#define reg_mprj_io_0 (*(volatile uint32_t*)0x2300000c)
+#define reg_mprj_io_1 (*(volatile uint32_t*)0x23000010)
+#define reg_mprj_io_2 (*(volatile uint32_t*)0x23000014)
+#define reg_mprj_io_3 (*(volatile uint32_t*)0x23000018)
+#define reg_mprj_io_4 (*(volatile uint32_t*)0x2300001c)
+#define reg_mprj_io_5 (*(volatile uint32_t*)0x23000020)
+#define reg_mprj_io_6 (*(volatile uint32_t*)0x23000024)
 
-#define reg_mprj_io_7 (*(volatile uint32_t*)0x23000024)
-#define reg_mprj_io_8 (*(volatile uint32_t*)0x23000028)
-#define reg_mprj_io_9 (*(volatile uint32_t*)0x2300002c)
-#define reg_mprj_io_10 (*(volatile uint32_t*)0x23000030)
+#define reg_mprj_io_7 (*(volatile uint32_t*)0x23000028)
+#define reg_mprj_io_8 (*(volatile uint32_t*)0x2300002c)
+#define reg_mprj_io_9 (*(volatile uint32_t*)0x23000030)
+#define reg_mprj_io_10 (*(volatile uint32_t*)0x23000034)
 
-#define reg_mprj_io_11 (*(volatile uint32_t*)0x23000034)
-#define reg_mprj_io_12 (*(volatile uint32_t*)0x23000038)
-#define reg_mprj_io_13 (*(volatile uint32_t*)0x2300003c)
-#define reg_mprj_io_14 (*(volatile uint32_t*)0x23000040)
+#define reg_mprj_io_11 (*(volatile uint32_t*)0x23000038)
+#define reg_mprj_io_12 (*(volatile uint32_t*)0x2300003c)
+#define reg_mprj_io_13 (*(volatile uint32_t*)0x23000040)
+#define reg_mprj_io_14 (*(volatile uint32_t*)0x23000044)
 
-#define reg_mprj_io_15 (*(volatile uint32_t*)0x23000044)
-#define reg_mprj_io_16 (*(volatile uint32_t*)0x23000048)
-#define reg_mprj_io_17 (*(volatile uint32_t*)0x2300004c)
-#define reg_mprj_io_18 (*(volatile uint32_t*)0x23000050)
+#define reg_mprj_io_15 (*(volatile uint32_t*)0x23000048)
+#define reg_mprj_io_16 (*(volatile uint32_t*)0x2300004c)
+#define reg_mprj_io_17 (*(volatile uint32_t*)0x23000050)
+#define reg_mprj_io_18 (*(volatile uint32_t*)0x23000054)
 
-#define reg_mprj_io_19 (*(volatile uint32_t*)0x23000054)
-#define reg_mprj_io_20 (*(volatile uint32_t*)0x23000058)
-#define reg_mprj_io_21 (*(volatile uint32_t*)0x2300005c)
-#define reg_mprj_io_22 (*(volatile uint32_t*)0x23000060)
+#define reg_mprj_io_19 (*(volatile uint32_t*)0x23000058)
+#define reg_mprj_io_20 (*(volatile uint32_t*)0x2300005c)
+#define reg_mprj_io_21 (*(volatile uint32_t*)0x23000060)
+#define reg_mprj_io_22 (*(volatile uint32_t*)0x23000064)
 
-#define reg_mprj_io_23 (*(volatile uint32_t*)0x23000064)
-#define reg_mprj_io_24 (*(volatile uint32_t*)0x23000068)
-#define reg_mprj_io_25 (*(volatile uint32_t*)0x2300006c)
-#define reg_mprj_io_26 (*(volatile uint32_t*)0x23000070)
+#define reg_mprj_io_23 (*(volatile uint32_t*)0x23000068)
+#define reg_mprj_io_24 (*(volatile uint32_t*)0x2300006c)
+#define reg_mprj_io_25 (*(volatile uint32_t*)0x23000070)
+#define reg_mprj_io_26 (*(volatile uint32_t*)0x23000074)
 
-#define reg_mprj_io_27 (*(volatile uint32_t*)0x23000074)
-#define reg_mprj_io_28 (*(volatile uint32_t*)0x23000078)
-#define reg_mprj_io_29 (*(volatile uint32_t*)0x2300007c)
-#define reg_mprj_io_30 (*(volatile uint32_t*)0x23000080)
-#define reg_mprj_io_31 (*(volatile uint32_t*)0x23000084)
+#define reg_mprj_io_27 (*(volatile uint32_t*)0x23000078)
+#define reg_mprj_io_28 (*(volatile uint32_t*)0x2300007c)
+#define reg_mprj_io_29 (*(volatile uint32_t*)0x23000080)
+#define reg_mprj_io_30 (*(volatile uint32_t*)0x23000084)
+#define reg_mprj_io_31 (*(volatile uint32_t*)0x23000088)
 
 // Mega Project Slaves (0x3000_0000)
 #define reg_mprj_slave (*(volatile uint32_t*)0x30000000)
diff --git a/verilog/dv/caravel/mgmt_soc/gpio/gpio.c b/verilog/dv/caravel/mgmt_soc/gpio/gpio.c
index d58c176..1e1e48a 100644
--- a/verilog/dv/caravel/mgmt_soc/gpio/gpio.c
+++ b/verilog/dv/caravel/mgmt_soc/gpio/gpio.c
@@ -14,7 +14,7 @@
 	int i;
 
 	/* Set data out to zero */
-	reg_mprj_data = 0;
+	reg_mprj_datal = 0;
 
 	/* Lower 8 pins are input and upper 8 pins are output */
 	reg_mprj_io_31 = GPIO_MODE_MGMT_STD_OUTPUT;
@@ -40,7 +40,7 @@
 	while (reg_mprj_xfer == 1);
 
 	// change the pull up and pull down (checked by the TB)
-	reg_mprj_data = 0xa0000000;
+	reg_mprj_datal = 0xa0000000;
 
 	reg_mprj_io_23 = GPIO_MODE_MGMT_STD_INPUT_PULLDOWN;
 	reg_mprj_io_22 = GPIO_MODE_MGMT_STD_INPUT_PULLDOWN;
@@ -56,7 +56,7 @@
 	reg_mprj_xfer = 1;
 	while (reg_mprj_xfer == 1);
 
-	reg_mprj_data = 0x0b000000;
+	reg_mprj_datal = 0x0b000000;
 
 	reg_mprj_io_23 = GPIO_MODE_MGMT_STD_INPUT_PULLUP;
 	reg_mprj_io_22 = GPIO_MODE_MGMT_STD_INPUT_PULLUP;
@@ -88,11 +88,11 @@
 
 	// read the lower 8 pins, add 1 then output the result
 	// checked by the TB
-	reg_mprj_data = 0xab000000;
+	reg_mprj_datal = 0xab000000;
 
 	while (1){
-		int x = (reg_mprj_data & 0xff0000) >> 16;
-		reg_mprj_data = (x+1) << 24;
+		int x = (reg_mprj_datal & 0xff0000) >> 16;
+		reg_mprj_datal = (x+1) << 24;
 	}
 }
 
diff --git a/verilog/dv/caravel/mgmt_soc/gpio/gpio_tb.v b/verilog/dv/caravel/mgmt_soc/gpio/gpio_tb.v
index 615e4d1..01dc63e 100644
--- a/verilog/dv/caravel/mgmt_soc/gpio/gpio_tb.v
+++ b/verilog/dv/caravel/mgmt_soc/gpio/gpio_tb.v
@@ -50,12 +50,13 @@
 		$finish;
 	end
 
+	wire [36:0] mprj_io;	// Most of these are no-connects
 	wire [15:0] checkbits;
-
-	reg [7:0] checkbits_lo;
+	reg  [7:0] checkbits_lo;
 	wire [7:0] checkbits_hi;
 
-	assign checkbits[7:0] = checkbits_lo;
+	assign mprj_io[23:16] = checkbits_lo;
+	assign checkbits = mprj_io[31:16];
 	assign checkbits_hi = checkbits[15:8];
 
 	wire flash_csb;
@@ -64,36 +65,35 @@
 	wire flash_io1;
 
 	reg RSTB;
-	wire SDO;
 
 	// Transactor
 	initial begin
-		checkbits_lo = {8{1'bz}};
+		checkbits_lo <= {8{1'bz}};
 		wait(checkbits_hi == 8'hA0);
-		checkbits_lo = 8'hF0;
+		checkbits_lo <= 8'hF0;
 		wait(checkbits_hi == 8'h0B);
-		checkbits_lo = 8'h0F;
+		checkbits_lo <= 8'h0F;
 		wait(checkbits_hi == 8'hAB);
-		checkbits_lo = 8'h0;
+		checkbits_lo <= 8'h0;
 		repeat (1000) @(posedge clock);
-		checkbits_lo = 8'h1;
+		checkbits_lo <= 8'h1;
 		repeat (1000) @(posedge clock);
-		checkbits_lo = 8'h3;
+		checkbits_lo <= 8'h3;
 	end
 
 	// Monitor
 	initial begin
 		wait(checkbits_hi == 8'hA0);
-		wait(checkbits[7:0] == 8'hF0);
-		wait(checkbits_hi== 8'h0B);
-		wait(checkbits[7:0] == 8'h0F);
-		wait(checkbits_hi== 8'hAB);
-		wait(checkbits[7:0] == 8'h00);
-		wait(checkbits_hi== 8'h01);
-		wait(checkbits[7:0] == 8'h01);
-		wait(checkbits_hi== 8'h02);
-		wait(checkbits[7:0] == 8'h03);
-		wait(checkbits_hi== 8'h04);
+		wait(checkbits[7:0]  == 8'hF0);
+		wait(checkbits_hi == 8'h0B);
+		wait(checkbits[7:0]  == 8'h0F);
+		wait(checkbits_hi == 8'hAB);
+		wait(checkbits[7:0]  == 8'h00);
+		wait(checkbits_hi == 8'h01);
+		wait(checkbits[7:0]  == 8'h01);
+		wait(checkbits_hi == 8'h02);
+		wait(checkbits[7:0]  == 8'h03);
+		wait(checkbits_hi == 8'h04);
 		$display("Monitor: Test GPIO (RTL) Passed");
 		$finish;
 	end
@@ -128,23 +128,25 @@
 	// ser_rx    = mgmt_gpio_io[5]              (input)
 	// ser_tx    = mgmt_gpio_io[6]              (output)
 	// irq       = mgmt_gpio_io[7]              (input)
-	//
-	// Therefore to connect SDO, SDI, CSB, and SCK,
-	// apply {27'bz, SCK, CSB, SDI, SDO, 1'bz} to mprj_io (32 bits)
-
-	wire [11:0] noconnect;
-	wire [2:0] spi_sigs;
-
-	assign spi_sigs = 3'b010;	// Set SCK, CSB, and SDI
 
 	caravel uut (
-		.vdd3v3	  (VDD3V3),
-		.vdd1v8	  (VDD1V8),
-		.vss	  (VSS),
+		.vddio	  (VDD3V3),
+		.vssio	  (VSS),
+		.vdda	  (VDD3V3),
+		.vssa	  (VSS),
+		.vccd	  (VDD1V8),
+		.vssd	  (VSS),
+		.vdda1    (VDD3V3),
+		.vdda2    (VDD3V3),
+		.vssa1	  (VSS),
+		.vssa2	  (VSS),
+		.vccd1	  (VDD1V8),
+		.vccd2	  (VDD1V8),
+		.vssd1	  (VSS),
+		.vssd2	  (VSS),
 		.clock	  (clock),
 		.gpio     (gpio),
-		.mprj_io  ({checkbits, noconnect[11:1],
-				spi_sigs, SDO, noconnect[0]}),
+		.mprj_io  (mprj_io),
 		.flash_csb(flash_csb),
 		.flash_clk(flash_clk),
 		.flash_io0(flash_io0),
diff --git a/verilog/dv/caravel/mgmt_soc/gpio/make.log b/verilog/dv/caravel/mgmt_soc/gpio/make.log
deleted file mode 100644
index 7ce024a..0000000
--- a/verilog/dv/caravel/mgmt_soc/gpio/make.log
+++ /dev/null
@@ -1,2 +0,0 @@
-vvp gpio.vvp
-make: *** [Makefile:21: gpio.vcd] Interrupt
diff --git a/verilog/rtl/caravel.v b/verilog/rtl/caravel.v
index 3e92b15..5fc90d4 100644
--- a/verilog/rtl/caravel.v
+++ b/verilog/rtl/caravel.v
@@ -17,7 +17,8 @@
 `define functional
 `define UNIT_DELAY #1
 
-`define MPRJ_IO_PADS 32
+`define MPRJ_IO_PADS 37
+`define MPRJ_PWR_PADS 4		/* vdda1, vccd1, vdda2, vccd2 */
 
 `include "pads.v"
 
@@ -58,9 +59,21 @@
 `endif
 
 module caravel (
-    inout vdd3v3,
-    inout vdd1v8,
-    inout vss,
+    inout vddio,	// Common 3.3V padframe/ESD power
+    inout vssio,	// Common padframe/ESD ground
+    inout vdda,		// Management 3.3V power
+    inout vssa,		// Common analog ground
+    inout vccd,		// Management/Common 1.8V power
+    inout vssd,		// Common digital ground
+    inout vdda1,	// User area 1 3.3V power
+    inout vdda2,	// User area 2 3.3V power
+    inout vssa1,	// User area 1 analog ground
+    inout vssa2,	// User area 2 analog ground
+    inout vccd1,	// User area 1 1.8V power
+    inout vccd2,	// User area 2 1.8V power
+    inout vssd1,	// User area 1 digital ground
+    inout vssd2,	// User area 2 digital ground
+
     inout gpio,			// Used for external LDO control
     inout [`MPRJ_IO_PADS-1:0] mprj_io,
     input clock,	    	// CMOS core clock input, not a crystal
@@ -186,14 +199,26 @@
     // To be considered:  Master hold signal on all user pads (?)
     // For now, set holdh_n to 1 (NOTE:  This is in the 3.3V domain)
     // and setting enh to porb_h.
-    assign mprj_io_hldh_n = {`MPRJ_IO_PADS{vdd3v3}};
+    assign mprj_io_hldh_n = {`MPRJ_IO_PADS{vddio}};
     assign mprj_io_enh = {`MPRJ_IO_PADS{porb_h}};
 
     chip_io padframe(
 	// Package Pins
-	.vdd3v3(vdd3v3),
-	.vdd1v8(vdd1v8),
-	.vss(vss),
+	.vddio(vddio),
+	.vssio(vssio),
+	.vdda(vdda),
+	.vssa(vssa),
+	.vccd(vccd),
+	.vssd(vssd),
+	.vdda1(vdda1),
+	.vdda2(vdda2),
+	.vssa1(vssa1),
+	.vssa2(vssa2),
+	.vccd1(vccd1),
+	.vccd2(vccd2),
+	.vssd1(vssd1),
+	.vssd2(vssd2),
+
 	.gpio(gpio),
 	.mprj_io(mprj_io),
 	.clock(clock),
@@ -279,10 +304,13 @@
     // Mask revision
     wire [31:0] mask_rev;
 
-    mgmt_core soc (
+    mgmt_core #(
+	.MPRJ_IO_PADS(`MPRJ_IO_PADS),
+	.MPRJ_PWR_PADS(`MPRJ_PWR_PADS)
+    ) soc (
 	`ifdef LVS
-		.vdd1v8(vdd1v8),
-		.vss(vss),
+		.vdd(vccd),
+		.vss(vssa),
 	`endif
 		// GPIO (1 pin)
 		.gpio_out_pad(gpio_out_core),
@@ -360,7 +388,20 @@
 	/* User project is instantiated  here	*/
 	/*--------------------------------------*/
 
-	user_proj_example mprj ( 
+	user_proj_example #(
+	    .IO_PADS(`MPRJ_IO_PADS),
+	    .PWR_PADS(`MPRJ_PWR_PADS)
+	) mprj ( 
+	    `ifdef LVS
+		vdda1,	// User area 1 3.3V power
+		vdda2,	// User area 2 3.3V power
+		vssa1,	// User area 1 analog ground
+		vssa2,	// User area 2 analog ground
+		vccd1,	// User area 1 1.8V power
+		vccd2,	// User area 2 1.8V power
+		vssa1,	// User area 1 digital ground
+		vssa2,	// User area 2 digital ground
+	    `endif
     		.wb_clk_i(caravel_clk),
     		.wb_rst_i(!caravel_rstn),
 		// MGMT SoC Wishbone Slave 
@@ -474,11 +515,11 @@
 
     sky130_fd_sc_hvl__lsbufhv2lv porb_level (
 	`ifdef LVS
-		.vpwr(vdd3v3),
-		.vpb(vdd3v3),
-		.lvpwr(vdd1v8),
-		.vnb(vss),
-		.vgnd(vss),
+		.vpwr(vddio),
+		.vpb(vddio),
+		.lvpwr(vccd),
+		.vnb(vssio),
+		.vgnd(vssio),
 	`endif
 		.A(porb_h),
 		.X(porb_l)
@@ -492,19 +533,19 @@
 
     // Power-on-reset circuit
     simple_por por (
-		.vdd3v3(vdd3v3),
-		.vss(vss),
+		.vdd3v3(vddio),
+		.vss(vssio),
 		.porb_h(porb_h)
     );
 
     // XRES (chip input pin reset) reset level converter
     sky130_fd_sc_hvl__lsbufhv2lv rstb_level (
 	`ifdef LVS
-		.vpwr(vdd3v3),
-		.vpb(vdd3v3),
+		.vpwr(vddio),
+		.vpb(vddio),
 		.lvpwr(vdd1v8),
-		.vnb(vss),
-		.vgnd(vss),
+		.vnb(vssio),
+		.vgnd(vssio),
 	`endif
 		.A(rstb_h),
 		.X(rstb_l)
diff --git a/verilog/rtl/chip_io.v b/verilog/rtl/chip_io.v
index d34cfec..ebe0234 100644
--- a/verilog/rtl/chip_io.v
+++ b/verilog/rtl/chip_io.v
@@ -1,8 +1,20 @@
 module chip_io(
 	// Package Pins
-	inout  vdd3v3,
-    	inout  vdd1v8,
-    	inout  vss,
+	inout  vddio,		// Common padframe/ESD supply
+	inout  vssio,		// Common padframe/ESD ground
+	inout  vccd,		// Common 1.8V supply
+	inout  vssd,		// Common digital ground
+	inout  vdda,		// Management analog 3.3V supply
+	inout  vssa,		// Management analog ground
+	inout  vdda1,		// User area 1 3.3V supply
+	inout  vdda2,		// User area 2 3.3V supply
+	inout  vssa1,		// User area 1 analog ground
+	inout  vssa2,		// User area 2 analog ground
+	inout  vccd1,		// User area 1 1.8V supply
+	inout  vccd2,		// User area 2 1.8V supply
+	inout  vssd1,		// User area 1 digital ground
+	inout  vssd2,		// User area 2 digital ground
+
 	inout  gpio,
 	input  clock,
 	input  resetb,
@@ -56,78 +68,141 @@
 
 	wire analog_a, analog_b;
 	wire vddio_q, vssio_q;
-	// Instantiate power cells for VDD3V3 domain (8 total; 4 high clamps and
-    	// 4 low clamps)
-    	s8iom0_vdda_hvc_pad vdd3v3hclamp [1:0] (
-		`ABUTMENT_PINS
-		.drn_hvc(),
-		.src_bdy_hvc()
+
+	// Instantiate power and ground pads for management domain
+	// 12 pads:  vddio, vssio, vdda, vssa, vccd, vssd
+	// One each HV and LV clamp.
+
+    	s8iom0_vddio_hvc_pad mgmt_vddio_hvclamp_pad (
+		`MGMT_ABUTMENT_PINS
+		`HVCLAMP_PINS
+    	);
+    	s8iom0_vddio_lvc_pad mgmt_vddio_lvclamp_pad (
+		`MGMT_ABUTMENT_PINS
+		`LVCLAMP_PINS
     	);
 
-    	s8iom0_vddio_hvc_pad vddiohclamp [1:0] (
-		`ABUTMENT_PINS
-		.drn_hvc(),
-		.src_bdy_hvc()
+    	s8iom0_vdda_hvc_pad mgmt_vdda_hvclamp_pad (
+		`MGMT_ABUTMENT_PINS
+		`HVCLAMP_PINS
     	);
-	
-    	s8iom0_vdda_lvc_pad vdd3v3lclamp [3:0] (
-		`ABUTMENT_PINS
-		.bdy2_b2b(),
-		.drn_lvc1(),
-		.drn_lvc2(),
-		.src_bdy_lvc1(),
-		.src_bdy_lvc2()
+    	s8iom0_vdda_lvc_pad mgmt_vdda_lvclamp_pad (
+		`MGMT_ABUTMENT_PINS
+		`LVCLAMP_PINS
     	);
 
-    	// Instantiate the core voltage supply (since it is not generated on-chip)
-    	// (1.8V) (4 total, 2 high and 2 low clamps)
-    	s8iom0_vccd_hvc_pad vdd1v8hclamp [1:0] (
-		`ABUTMENT_PINS
-		.drn_hvc(),
-		.src_bdy_hvc()
+    	s8iom0_vccd_hvc_pad mgmt_vccd_hvclamp_pad (
+		`MGMT_ABUTMENT_PINS
+		`HVCLAMP_PINS
+    	);
+    	s8iom0_vccd_lvc_pad mgmt_vccd_lvclamp_pad (
+		`MGMT_ABUTMENT_PINS
+		`LVCLAMP_PINS
     	);
 
-    	s8iom0_vccd_lvc_pad vdd1v8lclamp [1:0] (
-		`ABUTMENT_PINS
-		.bdy2_b2b(),
-		.drn_lvc1(),
-		.drn_lvc2(),
-		.src_bdy_lvc1(),
-		.src_bdy_lvc2()
+    	s8iom0_vssio_hvc_pad mgmt_vssio_hvclamp_pad (
+		`MGMT_ABUTMENT_PINS
+		`HVCLAMP_PINS
+    	);
+    	s8iom0_vssio_lvc_pad mgmt_vssio_lvclamp_pad (
+		`MGMT_ABUTMENT_PINS
+		`LVCLAMP_PINS
     	);
 
-    	// Instantiate ground cells (7 total, 4 high clamps and 3 low clamps)
-    	s8iom0_vssa_hvc_pad vsshclamp [3:0] (
-		`ABUTMENT_PINS
-		.drn_hvc(),
-		.src_bdy_hvc()
+    	s8iom0_vssa_hvc_pad mgmt_vssa_hvclamp_pad (
+		`MGMT_ABUTMENT_PINS
+		`HVCLAMP_PINS
+    	);
+    	s8iom0_vssa_lvc_pad mgmt_vssa_lvclamp_pad (
+		`MGMT_ABUTMENT_PINS
+		`LVCLAMP_PINS
     	);
 
-    	s8iom0_vssa_lvc_pad vssalclamp (
-		`ABUTMENT_PINS
-		.bdy2_b2b(),
-		.drn_lvc1(),
-		.drn_lvc2(),
-		.src_bdy_lvc1(),
-		.src_bdy_lvc2()
+    	s8iom0_vssd_hvc_pad mgmt_vssd_hvclamp_pad (
+		`MGMT_ABUTMENT_PINS
+		`HVCLAMP_PINS
+    	);
+    	s8iom0_vssd_lvc_pad mgmt_vssd_lvclmap_pad (
+		`MGMT_ABUTMENT_PINS
+		`LVCLAMP_PINS
     	);
 
-    	s8iom0_vssd_lvc_pad vssdlclamp (
-		`ABUTMENT_PINS
-		.bdy2_b2b(),
-		.drn_lvc1(),
-		.drn_lvc2(),
-		.src_bdy_lvc1(),
-		.src_bdy_lvc2()
+	// Instantiate power and ground pads for user 1 domain
+	// 8 pads:  vdda, vssa, vccd, vssd;  One each HV and LV clamp.
+
+    	s8iom0_vdda_hvc_pad user1_vdda_hvclamp_pad (
+		`USER1_ABUTMENT_PINS
+		`HVCLAMP_PINS
+    	);
+    	s8iom0_vdda_lvc_pad user1_vdda_lvclamp_pad (
+		`USER1_ABUTMENT_PINS
+		`LVCLAMP_PINS
     	);
 
-    	s8iom0_vssio_lvc_pad vssiolclamp (
-		`ABUTMENT_PINS
-		.bdy2_b2b(),
-		.drn_lvc1(),
-		.drn_lvc2(),
-		.src_bdy_lvc1(),
-		.src_bdy_lvc2()
+    	s8iom0_vccd_hvc_pad user1_vccd_hvclamp_pad (
+		`USER1_ABUTMENT_PINS
+		`HVCLAMP_PINS
+    	);
+    	s8iom0_vccd_lvc_pad user1_vccd_lvclamp_pad (
+		`USER1_ABUTMENT_PINS
+		`LVCLAMP_PINS
+    	);
+
+    	s8iom0_vssa_hvc_pad user1_vssa_hvclamp_pad (
+		`USER1_ABUTMENT_PINS
+		`HVCLAMP_PINS
+    	);
+    	s8iom0_vssa_lvc_pad user1_vssa_lvclamp_pad (
+		`USER1_ABUTMENT_PINS
+		`LVCLAMP_PINS
+    	);
+
+    	s8iom0_vssd_hvc_pad user1_vssd_hvclamp_pad (
+		`USER1_ABUTMENT_PINS
+		`HVCLAMP_PINS
+    	);
+    	s8iom0_vssd_lvc_pad user1_vssd_lvclmap_pad (
+		`USER1_ABUTMENT_PINS
+		`LVCLAMP_PINS
+    	);
+
+	// Instantiate power and ground pads for user 2 domain
+	// 8 pads:  vdda, vssa, vccd, vssd;  One each HV and LV clamp.
+
+    	s8iom0_vdda_hvc_pad user2_vdda_hvclamp_pad (
+		`USER2_ABUTMENT_PINS
+		`HVCLAMP_PINS
+    	);
+    	s8iom0_vdda_lvc_pad user2_vdda_lvclamp_pad (
+		`USER2_ABUTMENT_PINS
+		`LVCLAMP_PINS
+    	);
+
+    	s8iom0_vccd_hvc_pad user2_vccd_hvclamp_pad (
+		`USER2_ABUTMENT_PINS
+		`HVCLAMP_PINS
+    	);
+    	s8iom0_vccd_lvc_pad user2_vccd_lvclamp_pad (
+		`USER2_ABUTMENT_PINS
+		`LVCLAMP_PINS
+    	);
+
+    	s8iom0_vssa_hvc_pad user2_vssa_hvclamp_pad (
+		`USER2_ABUTMENT_PINS
+		`HVCLAMP_PINS
+    	);
+    	s8iom0_vssa_lvc_pad user2_vssa_lvclamp_pad (
+		`USER2_ABUTMENT_PINS
+		`LVCLAMP_PINS
+    	);
+
+    	s8iom0_vssd_hvc_pad user2_vssd_hvclamp_pad (
+		`USER2_ABUTMENT_PINS
+		`HVCLAMP_PINS
+    	);
+    	s8iom0_vssd_lvc_pad user2_vssd_lvclmap_pad (
+		`USER2_ABUTMENT_PINS
+		`LVCLAMP_PINS
     	);
 
 	wire [2:0] dm_all =
@@ -137,12 +212,15 @@
 	wire[2:0] flash_io1_mode = 
 		{flash_io1_ieb_core, flash_io1_ieb_core, flash_io1_oeb_core};
 
-    	// GPIO pad
+	// Management clock input pad
+	`INPUT_PAD(clock, clock_core); 	    
+
+    	// Management GPIO pad
 	`INOUT_PAD(
 		gpio, gpio_in_core, gpio_out_core,
 		gpio_inenb_core, gpio_outenb_core, dm_all);
 	
-	// Flash pads
+	// Management Flash SPI pads
 	`INOUT_PAD(
 		flash_io0, flash_io0_di_core, flash_io0_do_core,
 		flash_io0_ieb_core, flash_io0_oeb_core, flash_io0_mode);
@@ -150,19 +228,16 @@
 		flash_io1, flash_io1_di_core, flash_io1_do_core,
 		flash_io1_ieb_core, flash_io1_oeb_core, flash_io1_mode);
 
-	`INPUT_PAD(clock, clock_core); 	    
-
-	// Output Pads
 	`OUTPUT_PAD(flash_csb, flash_csb_core, flash_csb_ieb_core, flash_csb_oeb_core);  
 	`OUTPUT_PAD(flash_clk, flash_clk_core, flash_clk_ieb_core, flash_clk_oeb_core);
 
-
 	// NOTE:  The analog_out pad from the raven chip has been replaced by
     	// the digital reset input resetb on caravel due to the lack of an on-board
     	// power-on-reset circuit.  The XRES pad is used for providing a glitch-
     	// free reset.
+
 	s8iom0s8_top_xres4v2 resetb_pad (
-		`ABUTMENT_PINS 
+		`MGMT_ABUTMENT_PINS 
 		`ifndef	TOP_ROUTING
 		    .pad(resetb),
 		`endif
@@ -171,38 +246,76 @@
 		.tie_lo_esd(),
 		.pad_a_esd_h(xresloop),
 		.xres_h_n(resetb_core_h),
-		.disable_pullup_h(vss),	    // 0 = enable pull-up on reset pad
-		.enable_h(vdd3v3),	    // Power-on-reset to the power-on-reset input??
-		.en_vddio_sig_h(vss),	    // No idea.
-		.inp_sel_h(vss),	    // 1 = use filt_in_h else filter the pad input
-		.filt_in_h(vss),	    // Alternate input for glitch filter
-		.pullup_h(vss),		    // Pullup connection for alternate filter input
-		.enable_vddio(vdd1v8)
+		.disable_pullup_h(vssio),    // 0 = enable pull-up on reset pad
+		.enable_h(porb_h),	    // Power-on-reset
+		.en_vddio_sig_h(vssio),	    // No idea.
+		.inp_sel_h(vssio),	    // 1 = use filt_in_h else filter the pad input
+		.filt_in_h(vssio),	    // Alternate input for glitch filter
+		.pullup_h(vssio),	    // Pullup connection for alternate filter input
+		.enable_vddio(vccd)
     	);
 
 	// Corner cells (These are overlay cells;  it is not clear what is normally
-    	// supposed to go under them.)
+    	// supposed to go under them.)  
+
 	`ifndef TOP_ROUTING   
-	    s8iom0_corner_pad corner [3:0] (
-		.vssio(vss),
-		.vddio(vdd3v3),
+	    s8iom0_corner_pad mgmt_corner [1:0] (
+		.vssio(vssio),
+		.vddio(vddio),
 		.vddio_q(vddio_q),
 		.vssio_q(vssio_q),
 		.amuxbus_a(analog_a),
 		.amuxbus_b(analog_b),
-		.vssd(vss),
-		.vssa(vss),
-		.vswitch(vdd3v3),
-		.vdda(vdd3v3),
-		.vccd(vdd1v8),
-		.vcchib(vdd1v8)
+		.vssd(vssio),
+		.vssa(vssio),
+		.vswitch(vddio),
+		.vdda(vdda),
+		.vccd(vccd),
+		.vcchib(vccd)
+    	    );
+	    s8iom0_corner_pad user1_corner (
+		.vssio(vssio),
+		.vddio(vddio),
+		.vddio_q(vddio_q),
+		.vssio_q(vssio_q),
+		.amuxbus_a(analog_a),
+		.amuxbus_b(analog_b),
+		.vssd(vssd1),
+		.vssa(vssa1),
+		.vswitch(vddio),
+		.vdda(vdda1),
+		.vccd(vccd1),
+		.vcchib(vccd)
+    	    );
+	    s8iom0_corner_pad user2_corner (
+		.vssio(vssio),
+		.vddio(vddio),
+		.vddio_q(vddio_q),
+		.vssio_q(vssio_q),
+		.amuxbus_a(analog_a),
+		.amuxbus_b(analog_b),
+		.vssd(vssd2),
+		.vssa(vssa2),
+		.vswitch(vddio),
+		.vdda(vdda2),
+		.vccd(vccd2),
+		.vcchib(vccd)
     	    );
 	`endif
 
 	mprj_io mprj_pads(
-		.vdd3v3(vdd3v3),
-		.vdd1v8(vdd1v8),
-		.vss(vss),
+		.vddio(vddio),
+		.vssio(vssio),
+		.vccd(vccd),
+		.vssd(vssd),
+		.vdda1(vdda1),
+		.vdda2(vdda2),
+		.vssa1(vssa1),
+		.vssa2(vssa2),
+		.vccd1(vccd1),
+		.vccd2(vccd2),
+		.vssd1(vssd1),
+		.vssd2(vssd2),
 		.vddio_q(vddio_q),
 		.vssio_q(vssio_q),
 		.analog_a(analog_a),
diff --git a/verilog/rtl/mgmt_core.v b/verilog/rtl/mgmt_core.v
index 032d2f5..49b29cd 100644
--- a/verilog/rtl/mgmt_core.v
+++ b/verilog/rtl/mgmt_core.v
@@ -1,4 +1,7 @@
-module mgmt_core(
+module mgmt_core #(
+	parameter MPRJ_IO_PADS = 32,
+	parameter MPRJ_PWR_PADS = 32
+) (
 `ifdef LVS
 	inout vdd1v8,	   
 	inout vss,
@@ -41,8 +44,8 @@
 	output jtag_out,
 	output jtag_outenb,
 	// Mega-Project Control Signals
-	input [`MPRJ_IO_PADS-1:0] mgmt_in_data,
-	output [`MPRJ_IO_PADS-1:0] mgmt_out_data,
+	input [MPRJ_IO_PADS-1:0] mgmt_in_data,
+	output [MPRJ_IO_PADS-1:0] mgmt_out_data,
 	output mprj_io_loader_resetn,
 	output mprj_io_loader_clock,
 	output mprj_io_loader_data,
@@ -110,7 +113,11 @@
 	// the pad.  All others have OEB controlled by the configuration bit
 	// in the control block.
 
-	mgmt_soc soc (
+	mgmt_soc #(
+	    .MPRJ_IO_PADS(MPRJ_IO_PADS),
+	    .MPRJ_PWR_PADS(MPRJ_PWR_PADS)
+	) soc (
+	
     	    `ifdef LVS
         	.vdd1v8(vdd1v8),
         	.vss(vss),
diff --git a/verilog/rtl/mgmt_soc.v b/verilog/rtl/mgmt_soc.v
index 0de30f2..f6cf0f6 100644
--- a/verilog/rtl/mgmt_soc.v
+++ b/verilog/rtl/mgmt_soc.v
@@ -42,7 +42,10 @@
 `include "mprj_ctrl.v"
 `include "convert_gpio_sigs.v"
 
-module mgmt_soc (
+module mgmt_soc #(
+    parameter MPRJ_IO_PADS = 32,
+    parameter MPRJ_PWR_PADS = 32
+) (
 `ifdef LVS
     inout vdd1v8,	    /* 1.8V domain */
     inout vss,
@@ -194,10 +197,6 @@
     parameter LA_ENA_2  = 8'h18;
     parameter LA_ENA_3  = 8'h1c;
     
-    // Mega-Project Control
-    parameter MPRJ_IO_PADS  = 32;
-    parameter MPRJ_PWR_PADS = 32;
-   
     // System Control Registers
     parameter PLL_OUT       = 8'h00;
     parameter TRAP_OUT      = 8'h04;
@@ -639,7 +638,7 @@
     wire mprj_ctrl_stb_i;
     wire mprj_ctrl_ack_o;
     wire [31:0] mprj_ctrl_dat_o;
-    wire [31:0] mgmt_out_pre;
+    wire [MPRJ_IO_PADS-1:0] mgmt_out_pre;
 
     // Bits assigned to specific functions as outputs prevent the
     // mprj GPIO-as-output from applying data when that function
diff --git a/verilog/rtl/mprj_ctrl.v b/verilog/rtl/mprj_ctrl.v
index 117fcfe..ff04158 100644
--- a/verilog/rtl/mprj_ctrl.v
+++ b/verilog/rtl/mprj_ctrl.v
@@ -4,7 +4,7 @@
     parameter XFER   = 8'h 04,
     parameter CONFIG = 8'h 08,
     parameter IO_PADS = 32,   // Number of IO control registers
-    parameter PWR_PADS = 32   // Number of power control registers
+    parameter PWR_PADS = 32  // Number of power control registers
 )(
     input wb_clk_i,
     input wb_rst_i,
@@ -98,10 +98,14 @@
 `define XBYTE	2'b10
 `define LOAD	2'b11
 
-    localparam IO_BASE_ADR = (BASE_ADR | CONFIG);
-    localparam PWR_BASE_ADR = (BASE_ADR | CONFIG) + IO_PADS*4;
+    localparam IO_WORDS = 1 + (IO_PADS / 32);
+    localparam PWR_WORDS = 1 + (PWR_PADS / 32);
+
+    localparam IO_BASE_ADR = (BASE_ADR | CONFIG) + ((IO_WORDS + PWR_WORDS - 2) * 4);
+    localparam PWR_BASE_ADR = IO_BASE_ADR + (IO_PADS * 4);
     localparam OEB = 1;			// Offset of output enable in shift register.
     localparam INP_DIS = 3;		// Offset of input disable in shift register. 
+    localparam XFER_ADJ = XFER + ((IO_WORDS + PWR_WORDS - 2) * 4);
 
     reg [IO_CTRL_BITS-1:0] io_ctrl[IO_PADS-1:0];  // I/O control, 1 word per gpio pad
     reg [PWR_CTRL_BITS-1:0] pwr_ctrl[PWR_PADS-1:0]; // Power control, 1 word per power pad
@@ -109,16 +113,22 @@
     wire [IO_PADS-1:0] mgmt_gpio_out;	 // I/O write data output when input disabled
     reg xfer_ctrl;			// Transfer control (1 bit)
 
-    wire [IO_PADS-1:0] io_ctrl_sel;	// wishbone selects
-    wire [PWR_PADS-1:0] pwr_ctrl_sel;
-    wire io_data_sel;
+    wire [IO_WORDS-1:0] io_data_sel;	// wishbone selects
     wire xfer_sel;
+    wire [IO_PADS-1:0] io_ctrl_sel;
+    wire [PWR_PADS-1:0] pwr_ctrl_sel;
     wire [IO_PADS-1:0] mgmt_gpio_in;
 
-    assign xfer_sel = (iomem_addr[7:0] == XFER);
-    assign io_data_sel = (iomem_addr[7:0] == DATA); 
+    assign xfer_sel = (iomem_addr[7:0] == XFER_ADJ);
 
     genvar i;
+
+    generate
+        for (i=0; i<IO_WORDS; i=i+1) begin
+    	    assign io_data_sel[i] = (iomem_addr[7:0] == (DATA + i*4)); 
+	end
+    endgenerate
+
     generate
         for (i=0; i<IO_PADS; i=i+1) begin
             assign io_ctrl_sel[i] = (iomem_addr[7:0] == (IO_BASE_ADR[7:0] + i*4)); 
@@ -133,25 +143,17 @@
         end
     endgenerate
 
-    // I/O transfer of xfer bit and gpio data to/from user project region under
-    // management SoC control
+    // I/O transfer of xfer bit.  Also handles iomem_ready signal.
 
     always @(posedge clk) begin
 	if (!resetn) begin
 	    xfer_ctrl <= 0;
-	    mgmt_gpio_outr <= 'd0;
 	end else begin
 	    iomem_ready <= 0;
 	    if (iomem_valid && !iomem_ready && iomem_addr[31:8] == BASE_ADR[31:8]) begin
 		iomem_ready <= 1'b 1;
 
-		if (io_data_sel) begin
-		    iomem_rdata <= mgmt_gpio_in;
-		    if (iomem_wstrb[0]) begin
-			mgmt_gpio_outr[IO_PADS-1:0] <= iomem_wdata[IO_PADS-1:0];
-		    end
-
-		end else if (xfer_sel) begin
+		if (xfer_sel) begin
 		    iomem_rdata <= {31'd0, busy};
 		    if (iomem_wstrb[0]) xfer_ctrl <= iomem_wdata[0];
 		end
@@ -161,6 +163,33 @@
 	end
     end
 
+    // I/O transfer of gpio data to/from user project region under management
+    // SoC control
+
+    `define wtop (((i+1)*32 > IO_PADS) ? IO_PADS-1 : (i+1)*32-1)
+    `define wbot (i*32)
+    `define rtop (`wtop - `wbot + 1)
+
+    generate 
+        for (i=0; i<IO_WORDS; i=i+1) begin
+	    always @(posedge clk) begin
+		if (!resetn) begin
+		    mgmt_gpio_outr[`wtop:`wbot] <= 'd0;
+		end else begin
+		    if (iomem_valid && !iomem_ready && iomem_addr[31:8] ==
+					BASE_ADR[31:8]) begin
+			if (io_data_sel[i]) begin
+			    iomem_rdata[`rtop:0] <= mgmt_gpio_in[`wtop:`wbot];
+			    if (iomem_wstrb[0]) begin
+				mgmt_gpio_outr[`wtop:`wbot] <= iomem_wdata[`rtop:0];
+			    end
+			end
+		    end
+		end
+	    end
+	end
+    endgenerate
+
     generate 
         for (i=0; i<IO_PADS; i=i+1) begin
              always @(posedge clk) begin
diff --git a/verilog/rtl/mprj_io.v b/verilog/rtl/mprj_io.v
index 32ae628..90f8400 100644
--- a/verilog/rtl/mprj_io.v
+++ b/verilog/rtl/mprj_io.v
@@ -1,7 +1,22 @@
-module mprj_io(
-    inout vdd3v3,
-    inout vdd1v8,
-    inout vss,
+module mprj_io #(
+    parameter AREA1PADS = 18	// Highest numbered pad in area 1
+) (
+    inout vddio,
+    inout vssio,
+    inout vdda,
+    inout vssa,
+    inout vccd,
+    inout vssd,
+
+    inout vdda1,
+    inout vdda2,
+    inout vssa1,
+    inout vssa2,
+    inout vccd1,
+    inout vccd2,
+    inout vssd1,
+    inout vssd2,
+
     input vddio_q,
     input vssio_q,
     input analog_a,
@@ -24,9 +39,69 @@
     input [`MPRJ_IO_PADS*3-1:0] dm,
     output [`MPRJ_IO_PADS-1:0] io_in
 );
-    `MPRJ_IO_PAD_V(io, io_in, io_out, `MPRJ_IO_PADS, 
-    		oeb, hldh_n, enh, inp_dis, ib_mode_sel,
-    		vtrip_sel, slow_sel, holdover,
-    		analog_en, analog_sel, analog_pol, dm);
+
+    wire [`MPRJ_IO_PADS-1:0] loop1_io;
+
+    s8iom0_gpiov2_pad  area1_io_pad [AREA1PADS - 1:0] (
+	`USER1_ABUTMENT_PINS
+	`ifndef	TOP_ROUTING
+	    .pad(io[AREA1PADS - 1:0]),
+	`endif
+	    .out(io_out[AREA1PADS - 1:0]),
+	    .oe_n(oeb[AREA1PADS - 1:0]),
+	    .hld_h_n(hldh_n[AREA1PADS - 1:0]),
+	    .enable_h(enh[AREA1PADS - 1:0]),
+	    .enable_inp_h(loop1_io[AREA1PADS - 1:0]),
+	    .enable_vdda_h(porb_h),
+	    .enable_vswitch_h(vssa),
+	    .enable_vddio(vccd),
+	    .inp_dis(inp_dis[AREA1PADS - 1:0]),
+	    .ib_mode_sel(ib_mode_sel[AREA1PADS - 1:0]),
+	    .vtrip_sel(vtrip_sel[AREA1PADS - 1:0]),
+	    .slow(slow_sel[AREA1PADS - 1:0]),
+	    .hld_ovr(holdover[AREA1PADS - 1:0]),
+	    .analog_en(analog_en[AREA1PADS - 1:0]),
+	    .analog_sel(analog_sel[AREA1PADS - 1:0]),
+	    .analog_pol(analog_pol[AREA1PADS - 1:0]),
+	    .dm(dm[AREA1PADS*3 - 1:0]),
+	    .pad_a_noesd_h(),
+	    .pad_a_esd_0_h(),
+	    .pad_a_esd_1_h(),
+	    .in(io_in[AREA1PADS - 1:0]),
+	    .in_h(),
+	    .tie_hi_esd(),
+	    .tie_lo_esd(loop1_io[AREA1PADS - 1:0])
+    );
+
+    s8iom0_gpiov2_pad area2_io_pad [`MPRJ_IO_PADS - AREA1PADS - 1:0] (
+	`USER2_ABUTMENT_PINS
+	`ifndef	TOP_ROUTING
+	    .pad(io[`MPRJ_IO_PADS - AREA1PADS - 1:0]),
+	`endif
+	    .out(io_out[`MPRJ_IO_PADS - 1:AREA1PADS]),
+	    .oe_n(oeb[`MPRJ_IO_PADS - 1:AREA1PADS]),
+	    .hld_h_n(hldh_n[`MPRJ_IO_PADS - 1:AREA1PADS]),
+	    .enable_h(enh[`MPRJ_IO_PADS - 1:AREA1PADS]),
+	    .enable_inp_h(loop1_io[`MPRJ_IO_PADS - 1:AREA1PADS]),
+	    .enable_vdda_h(porb_h),
+	    .enable_vswitch_h(vssa),
+	    .enable_vddio(vccd),
+	    .inp_dis(inp_dis[`MPRJ_IO_PADS - 1:AREA1PADS]),
+	    .ib_mode_sel(ib_mode_sel[`MPRJ_IO_PADS - 1:AREA1PADS]),
+	    .vtrip_sel(vtrip_sel[`MPRJ_IO_PADS - 1:AREA1PADS]),
+	    .slow(slow_sel[`MPRJ_IO_PADS - 1:AREA1PADS]),
+	    .hld_ovr(holdover[`MPRJ_IO_PADS - 1:AREA1PADS]),
+	    .analog_en(analog_en[`MPRJ_IO_PADS - 1:AREA1PADS]),
+	    .analog_sel(analog_sel[`MPRJ_IO_PADS - 1:AREA1PADS]),
+	    .analog_pol(analog_pol[`MPRJ_IO_PADS - 1:AREA1PADS]),
+	    .dm(dm[`MPRJ_IO_PADS*3 - 1:AREA1PADS*3]),
+	    .pad_a_noesd_h(),
+	    .pad_a_esd_0_h(),
+	    .pad_a_esd_1_h(),
+	    .in(io_in[`MPRJ_IO_PADS - 1:AREA1PADS]),
+	    .in_h(),
+	    .tie_hi_esd(),
+	    .tie_lo_esd(loop1_io[`MPRJ_IO_PADS - 1:AREA1PADS])
+    );
 
 endmodule
diff --git a/verilog/rtl/pads.v b/verilog/rtl/pads.v
index 472f6ec..b17bf1d 100644
--- a/verilog/rtl/pads.v
+++ b/verilog/rtl/pads.v
@@ -1,45 +1,86 @@
 `ifndef TOP_ROUTING 
-	`define ABUTMENT_PINS \
+	`define USER1_ABUTMENT_PINS \
 	.amuxbus_a(analog_a),\
 	.amuxbus_b(analog_b),\
-	.vssa(vss),\
-	.vdda(vdd3v3),\
-	.vswitch(vdd3v3),\
+	.vssa(vssa1),\
+	.vdda(vdda1),\
+	.vswitch(vddio),\
 	.vddio_q(vddio_q),\
-	.vcchib(vdd1v8),\
-	.vddio(vdd3v3),\
-	.vccd(vdd1v8),\
-	.vssio(vss),\
-	.vssd(vss),\
+	.vcchib(vccd),\
+	.vddio(vddio),\
+	.vccd(vccd1),\
+	.vssio(vssio),\
+	.vssd(vssd1),\
+	.vssio_q(vssio_q),
+
+	`define USER2_ABUTMENT_PINS \
+	.amuxbus_a(analog_a),\
+	.amuxbus_b(analog_b),\
+	.vssa(vssa2),\
+	.vdda(vdda2),\
+	.vswitch(vddio),\
+	.vddio_q(vddio_q),\
+	.vcchib(vccd),\
+	.vddio(vddio),\
+	.vccd(vccd2),\
+	.vssio(vssio),\
+	.vssd(vssd2),\
+	.vssio_q(vssio_q),
+
+	`define MGMT_ABUTMENT_PINS \
+	.amuxbus_a(analog_a),\
+	.amuxbus_b(analog_b),\
+	.vssa(vssa),\
+	.vdda(vdda),\
+	.vswitch(vddio),\
+	.vddio_q(vddio_q),\
+	.vcchib(vccd),\
+	.vddio(vddio),\
+	.vccd(vccd),\
+	.vssio(vssio),\
+	.vssd(vssa),\
 	.vssio_q(vssio_q),
 `else 
-	`define ABUTMENT_PINS 
+	`define USER1_ABUTMENT_PINS 
+	`define USER2_ABUTMENT_PINS 
+	`define MGMT_ABUTMENT_PINS 
 `endif
 
+`define HVCLAMP_PINS \
+	.drn_hvc(), \
+	.src_bdy_hvc()
+
+`define LVCLAMP_PINS \
+	.bdy2_b2b(), \
+	.drn_lvc1(), \
+	.drn_lvc2(), \
+	.src_bdy_lvc1(), \
+	.src_bdy_lvc2()
+
 `define INPUT_PAD(X,Y) \
 	wire loop_``X; \
 	s8iom0_gpiov2_pad X``_pad ( \
-	`ABUTMENT_PINS \
+	`MGMT_ABUTMENT_PINS \
 	`ifndef	TOP_ROUTING \
 		.pad(X), \
 	`endif	\
-		.out(vss),	\
-		.oe_n(vdd1v8), \
-		.hld_h_n(vdd3v3),	\
+		.out(vssa),	\
+		.oe_n(vccd), \
+		.hld_h_n(vddio),	\
 		.enable_h(porb_h), \
 		.enable_inp_h(loop_``X), \
 		.enable_vdda_h(porb_h), \
-		.enable_vswitch_h(vss), \
-		.enable_vddio(vdd1v8), \
+		.enable_vswitch_h(vssa), \
+		.enable_vddio(vccd), \
 		.inp_dis(por), \
-		.ib_mode_sel(vss), \
-		.vtrip_sel(vss), \
-		.slow(vss),	\
-		.hld_ovr(vss), \
-		.analog_en(vss), \
-		.analog_sel(vss), \
-		.analog_pol(vss), \
-		.dm({vss, vss, vdd1v8}), \
+		.ib_mode_sel(vssa), \
+		.vtrip_sel(vssa), \
+		.slow(vssa),	\
+		.hld_ovr(vssa), \
+		.analog_en(vssa), \
+		.analog_sel(vssa), \
+		.analog_pol(vssa), \
+		.dm({vssa, vssa, vccd}), \
 		.pad_a_noesd_h(), \
 		.pad_a_esd_0_h(), \
 		.pad_a_esd_1_h(), \
@@ -48,94 +89,30 @@
 		.tie_hi_esd(), \
 		.tie_lo_esd(loop_``X) ) 
 
-`define INPUT_PAD_ANALOG(X,SEL,POL) \
-	wire loop_``X; \
-	s8iom0_gpiov2_pad X``_pad ( \
-	`ABUTMENT_PINS \
-	`ifndef	TOP_ROUTING \
-		.pad(X), \
-	`endif	\
-		.out(vss),	\
-		.oe_n(vdd1v8), \
-		.hld_h_n(vdd3v3),	\
-		.enable_h(porb_h), \
-		.enable_inp_h(loop_``X), \
-		.enable_vdda_h(porb_h), \
-		.enable_vswitch_h(vss), \
-		.enable_vddio(vdd1v8), \
-		.inp_dis(vdd1v8), \
-		.ib_mode_sel(vss), \
-		.vtrip_sel(vss), \
-		.slow(vss),	\
-		.hld_ovr(vss), \
-		.analog_en(vdd1v8), \
-		.analog_sel(SEL), \
-		.analog_pol(POL), \
-		.dm({vss, vss, vss}), \
-		.pad_a_noesd_h(), \
-		.pad_a_esd_0_h(), \
-		.pad_a_esd_1_h(), \
-		.in(), \
-		.in_h(), \
-		.tie_hi_esd(), \
-		.tie_lo_esd() ) 
-
-`define INPUT_PAD_V(X,Y,V) \
-	wire [V-1:0] loop_``X; \
-	s8iom0_gpiov2_pad X``_pad [V-1:0] ( \
-	`ABUTMENT_PINS \
-	`ifndef	TOP_ROUTING \
-		.pad(X),\
-	`endif	\
-		.out(),	\
-		.oe_n(vdd1v8), \
-		.hld_h_n(vdd3v3),	\
-		.enable_h(vdd3v3), \
-		.enable_inp_h(loop_``X), \
-		.enable_vdda_h(vdd3v3), \
-		.enable_vswitch_h(vss), \
-		.enable_vddio(vdd1v8), \
-		.inp_dis(por), \
-		.ib_mode_sel(vss), \
-		.vtrip_sel(vss), \
-		.slow(vss),	\
-		.hld_ovr(vss), \
-		.analog_en(vss), \
-		.analog_sel(vss), \
-		.analog_pol(vss), \
-		.dm({vss, vss, vdd1v8}), \
-		.pad_a_noesd_h(), \
-		.pad_a_esd_0_h(), \
-		.pad_a_esd_1_h(), \
-		.in(Y),  \
-		.in_h(), \
-		.tie_hi_esd(), \
-		.tie_lo_esd(loop_``X) )
-	
 `define OUTPUT_PAD(X,Y,INP_DIS,OUT_EN_N) \
 	wire loop_``X; \
 	s8iom0_gpiov2_pad X``_pad ( \
-	`ABUTMENT_PINS \
+	`MGMT_ABUTMENT_PINS \
 	`ifndef	TOP_ROUTING \
 		.pad(X), \
 	`endif \
 		.out(Y), \
 		.oe_n(OUT_EN_N), \
-		.hld_h_n(vdd3v3), \
+		.hld_h_n(vddio), \
 		.enable_h(porb_h),	\
 		.enable_inp_h(loop_``X), \
 		.enable_vdda_h(porb_h), \
-		.enable_vswitch_h(vss), \
-		.enable_vddio(vdd1v8), \
+		.enable_vswitch_h(vssa), \
+		.enable_vddio(vccd), \
 		.inp_dis(INP_DIS), \
-		.ib_mode_sel(vss), \
-		.vtrip_sel(vss), \
-		.slow(vss),	\
-		.hld_ovr(vss), \
-		.analog_en(vss), \
-		.analog_sel(vss), \
-		.analog_pol(vss), \
-		.dm({vdd1v8, vdd1v8, vss}),	\
+		.ib_mode_sel(vssa), \
+		.vtrip_sel(vssa), \
+		.slow(vssa),	\
+		.hld_ovr(vssa), \
+		.analog_en(vssa), \
+		.analog_sel(vssa), \
+		.analog_pol(vssa), \
+		.dm({vccd, vccd, vssa}),	\
 		.pad_a_noesd_h(), \
 		.pad_a_esd_0_h(), \
 		.pad_a_esd_1_h(), \
@@ -144,60 +121,28 @@
 		.tie_hi_esd(), \
 		.tie_lo_esd(loop_``X)) 
 
-`define INOUT_PAD_V(X,Y,Y_OUT,V,INP_DIS,OUT_EN_N,MODE) \
-	wire [V-1:0] loop_``X; \
-	s8iom0_gpiov2_pad X``_pad [V-1:0] ( \
-	`ABUTMENT_PINS \
-	`ifndef	TOP_ROUTING \
-		.pad(X),\
-	`endif	\
-		.out(Y_OUT),	\
-		.oe_n(OUT_EN_N), \
-		.hld_h_n(vdd3v3),	\
-		.enable_h(porb_h), \
-		.enable_inp_h(loop_``X), \
-		.enable_vdda_h(porb_h), \
-		.enable_vswitch_h(vss), \
-		.enable_vddio(vdd1v8), \
-		.inp_dis(INP_DIS), \
-		.ib_mode_sel(vss), \
-		.vtrip_sel(vss), \
-		.slow(vss),	\
-		.hld_ovr(vss), \
-		.analog_en(vss), \
-		.analog_sel(vss), \
-		.analog_pol(vss), \
-		.dm(MODE), \
-		.pad_a_noesd_h(), \
-		.pad_a_esd_0_h(), \
-		.pad_a_esd_1_h(), \
-		.in(Y),  \
-		.in_h(), \
-		.tie_hi_esd(), \
-		.tie_lo_esd(loop_``X) )
-
 `define INOUT_PAD(X,Y,Y_OUT,INP_DIS,OUT_EN_N,MODE) \
 	s8iom0_gpiov2_pad X``_pad ( \
-	`ABUTMENT_PINS \
+	`MGMT_ABUTMENT_PINS \
 	`ifndef	TOP_ROUTING \
 		.pad(X),\
 	`endif	\
 		.out(Y_OUT),	\
 		.oe_n(OUT_EN_N), \
-		.hld_h_n(vdd3v3),	\
+		.hld_h_n(vddio),	\
 		.enable_h(porb_h), \
 		.enable_inp_h(loop_``X), \
 		.enable_vdda_h(porb_h), \
-		.enable_vswitch_h(vss), \
-		.enable_vddio(vdd1v8), \
+		.enable_vswitch_h(vssa), \
+		.enable_vddio(vccd), \
 		.inp_dis(INP_DIS), \
-		.ib_mode_sel(vss), \
-		.vtrip_sel(vss), \
-		.slow(vss),	\
-		.hld_ovr(vss), \
-		.analog_en(vss), \
-		.analog_sel(vss), \
-		.analog_pol(vss), \
+		.ib_mode_sel(vssa), \
+		.vtrip_sel(vssa), \
+		.slow(vssa),	\
+		.hld_ovr(vssa), \
+		.analog_en(vssa), \
+		.analog_sel(vssa), \
+		.analog_pol(vssa), \
 		.dm(MODE), \
 		.pad_a_noesd_h(), \
 		.pad_a_esd_0_h(), \
@@ -207,34 +152,3 @@
 		.tie_hi_esd(), \
 		.tie_lo_esd(loop_``X) )
 
-`define MPRJ_IO_PAD_V(X,Y,Y_OUT,V,OUT_EN_N,HLD_N, ENH, INP_DIS, MODE_SEL, VTRIP_SEL, SLOW_SEL, HOLD_SEL, AN_EN, AN_SEL, AN_POL, MODE) \
-	wire [V-1:0] loop_``X; \
-	s8iom0_gpiov2_pad  X``_pad [V-1:0] ( \
-	`ABUTMENT_PINS \
-	`ifndef	TOP_ROUTING \
-		.pad(X),\
-	`endif	\
-		.out(Y_OUT),	\
-		.oe_n(OUT_EN_N), \
-		.hld_h_n(HLD_N),	\
-		.enable_h(ENH), \
-		.enable_inp_h(loop_``X), \
-		.enable_vdda_h(porb_h), \
-		.enable_vswitch_h(vss), \
-		.enable_vddio(vdd1v8), \
-		.inp_dis(INP_DIS), \
-		.ib_mode_sel(MODE_SEL), \
-		.vtrip_sel(VTRIP_SEL), \
-		.slow(SLOW_SEL),	\
-		.hld_ovr(HOLD_SEL), \
-		.analog_en(AN_EN), \
-		.analog_sel(AN_SEL), \
-		.analog_pol(AN_POL), \
-		.dm(MODE), \
-		.pad_a_noesd_h(), \
-		.pad_a_esd_0_h(), \
-		.pad_a_esd_1_h(), \
-		.in(Y),  \
-		.in_h(), \
-		.tie_hi_esd(), \
-		.tie_lo_esd(loop_``X) )
diff --git a/verilog/rtl/test.v b/verilog/rtl/test.v
new file mode 100644
index 0000000..25a3197
--- /dev/null
+++ b/verilog/rtl/test.v
@@ -0,0 +1,63 @@
+`define MPRJ1_IO_PAD_V(X,Y,Y_OUT,V,OUT_EN_N,HLD_N, ENH, INP_DIS, MODE_SEL, VTRIP_SEL, SLOW_SEL, HOLD_SEL, AN_EN, AN_SEL, AN_POL, MODE) \
+	wire [V-1:0] loop1_``X; \
+	s8iom0_gpiov2_pad  X``_pad [V-1:0] ( \
+	`USER1_ABUTMENT_PINS \
+	`ifndef	TOP_ROUTING \
+		.pad(X),\
+	`endif	\
+		.out(Y_OUT),	\
+		.oe_n(OUT_EN_N), \
+		.hld_h_n(HLD_N),	\
+		.enable_h(ENH), \
+		.enable_inp_h(loop1_``X), \
+		.enable_vdda_h(porb_h), \
+		.enable_vswitch_h(vssa), \
+		.enable_vddio(vccd), \
+		.inp_dis(INP_DIS), \
+		.ib_mode_sel(MODE_SEL), \
+		.vtrip_sel(VTRIP_SEL), \
+		.slow(SLOW_SEL),	\
+		.hld_ovr(HOLD_SEL), \
+		.analog_en(AN_EN), \
+		.analog_sel(AN_SEL), \
+		.analog_pol(AN_POL), \
+		.dm(MODE), \
+		.pad_a_noesd_h(), \
+		.pad_a_esd_0_h(), \
+		.pad_a_esd_1_h(), \
+		.in(Y),  \
+		.in_h(), \
+		.tie_hi_esd(), \
+		.tie_lo_esd(loop1_``X) )
+
+`define MPRJ2_IO_PAD_V(X,Y,Y_OUT,V,OUT_EN_N,HLD_N, ENH, INP_DIS, MODE_SEL, VTRIP_SEL, SLOW_SEL, HOLD_SEL, AN_EN, AN_SEL, AN_POL, MODE) \
+	wire [V-1:0] loop2_``X; \
+	s8iom0_gpiov2_pad  X``_pad [V-1:0] ( \
+	`USER2_ABUTMENT_PINS \
+	`ifndef	TOP_ROUTING \
+		.pad(X),\
+	`endif	\
+		.out(Y_OUT),	\
+		.oe_n(OUT_EN_N), \
+		.hld_h_n(HLD_N),	\
+		.enable_h(ENH), \
+		.enable_inp_h(loop2_``X), \
+		.enable_vdda_h(porb_h), \
+		.enable_vswitch_h(vssa), \
+		.enable_vddio(vccd), \
+		.inp_dis(INP_DIS), \
+		.ib_mode_sel(MODE_SEL), \
+		.vtrip_sel(VTRIP_SEL), \
+		.slow(SLOW_SEL),	\
+		.hld_ovr(HOLD_SEL), \
+		.analog_en(AN_EN), \
+		.analog_sel(AN_SEL), \
+		.analog_pol(AN_POL), \
+		.dm(MODE), \
+		.pad_a_noesd_h(), \
+		.pad_a_esd_0_h(), \
+		.pad_a_esd_1_h(), \
+		.in(Y),  \
+		.in_h(), \
+		.tie_hi_esd(), \
+		.tie_lo_esd(loop2_``X) )
diff --git a/verilog/rtl/user_proj_example.v b/verilog/rtl/user_proj_example.v
index af198c4..742977c 100644
--- a/verilog/rtl/user_proj_example.v
+++ b/verilog/rtl/user_proj_example.v
@@ -20,9 +20,21 @@
  */
 
 module user_proj_example #(
-    parameter IO_PADS = 32,
+    parameter IO_PADS = 37,
+    parameter PWR_PADS = 4,
     parameter BITS = 32
 )(
+`ifdef LVS
+    inout vdda1,	// User area 1 3.3V supply
+    inout vdda2,	// User area 2 3.3V supply
+    inout vssa1,	// User area 1 analog ground
+    inout vssa2,	// User area 2 analog ground
+    inout vccd1,	// User area 1 1.8V supply
+    inout vccd2,	// User area 2 1.8v supply
+    inout vssd1,	// User area 1 digital ground
+    inout vssd2,	// User area 2 digital ground
+`endif
+
     // Wishbone Slave ports (WB MI A)
     input wb_clk_i,
     input wb_rst_i,