Add adv_dbg_if files
diff --git a/verilog/rtl/ips/adv_dbg_if b/verilog/rtl/ips/adv_dbg_if
deleted file mode 160000
index 20655af..0000000
--- a/verilog/rtl/ips/adv_dbg_if
+++ /dev/null
@@ -1 +0,0 @@
-Subproject commit 20655aff9c4bfdeabf928f75e035e5e36bfc54f9
diff --git a/verilog/rtl/ips/adv_dbg_if/rtl/adbg_axi_biu.v b/verilog/rtl/ips/adv_dbg_if/rtl/adbg_axi_biu.v
new file mode 100644
index 0000000..bd432c1
--- /dev/null
+++ b/verilog/rtl/ips/adv_dbg_if/rtl/adbg_axi_biu.v
@@ -0,0 +1,443 @@
+module adbg_axi_biu 
+#(
+    parameter AXI_ADDR_WIDTH = 32,
+    parameter AXI_DATA_WIDTH = 64,
+    parameter AXI_USER_WIDTH = 6,
+    parameter AXI_ID_WIDTH   = 3
+)
+(
+	tck_i,
+	trstn_i,
+	data_i,
+	data_o,
+	addr_i,
+	strobe_i,
+	rd_wrn_i,
+	rdy_o,
+	err_o,
+	word_size_i,
+	axi_aclk,
+	axi_aresetn,
+	axi_master_aw_valid,
+	axi_master_aw_addr,
+	axi_master_aw_prot,
+	axi_master_aw_region,
+	axi_master_aw_len,
+	axi_master_aw_size,
+	axi_master_aw_burst,
+	axi_master_aw_lock,
+	axi_master_aw_cache,
+	axi_master_aw_qos,
+	axi_master_aw_id,
+	axi_master_aw_user,
+	axi_master_aw_ready,
+	axi_master_ar_valid,
+	axi_master_ar_addr,
+	axi_master_ar_prot,
+	axi_master_ar_region,
+	axi_master_ar_len,
+	axi_master_ar_size,
+	axi_master_ar_burst,
+	axi_master_ar_lock,
+	axi_master_ar_cache,
+	axi_master_ar_qos,
+	axi_master_ar_id,
+	axi_master_ar_user,
+	axi_master_ar_ready,
+	axi_master_w_valid,
+	axi_master_w_data,
+	axi_master_w_strb,
+	axi_master_w_user,
+	axi_master_w_last,
+	axi_master_w_ready,
+	axi_master_r_valid,
+	axi_master_r_data,
+	axi_master_r_resp,
+	axi_master_r_last,
+	axi_master_r_id,
+	axi_master_r_user,
+	axi_master_r_ready,
+	axi_master_b_valid,
+	axi_master_b_resp,
+	axi_master_b_id,
+	axi_master_b_user,
+	axi_master_b_ready
+);
+	//parameter AXI_ADDR_WIDTH = 32;
+	//parameter AXI_DATA_WIDTH = 64;
+	//parameter AXI_USER_WIDTH = 6;
+	//parameter AXI_ID_WIDTH = 3;
+	input wire tck_i;
+	input wire trstn_i;
+	input wire [63:0] data_i;
+	output reg [63:0] data_o;
+	input wire [31:0] addr_i;
+	input wire strobe_i;
+	input wire rd_wrn_i;
+	output reg rdy_o;
+	output wire err_o;
+	input wire [3:0] word_size_i;
+	input wire axi_aclk;
+	input wire axi_aresetn;
+	output reg axi_master_aw_valid;
+	output wire [AXI_ADDR_WIDTH - 1:0] axi_master_aw_addr;
+	output wire [2:0] axi_master_aw_prot;
+	output wire [3:0] axi_master_aw_region;
+	output wire [7:0] axi_master_aw_len;
+	output reg [2:0] axi_master_aw_size;
+	output wire [1:0] axi_master_aw_burst;
+	output wire axi_master_aw_lock;
+	output wire [3:0] axi_master_aw_cache;
+	output wire [3:0] axi_master_aw_qos;
+	output wire [AXI_ID_WIDTH - 1:0] axi_master_aw_id;
+	output wire [AXI_USER_WIDTH - 1:0] axi_master_aw_user;
+	input wire axi_master_aw_ready;
+	output reg axi_master_ar_valid;
+	output wire [AXI_ADDR_WIDTH - 1:0] axi_master_ar_addr;
+	output wire [2:0] axi_master_ar_prot;
+	output wire [3:0] axi_master_ar_region;
+	output wire [7:0] axi_master_ar_len;
+	output reg [2:0] axi_master_ar_size;
+	output wire [1:0] axi_master_ar_burst;
+	output wire axi_master_ar_lock;
+	output wire [3:0] axi_master_ar_cache;
+	output wire [3:0] axi_master_ar_qos;
+	output wire [AXI_ID_WIDTH - 1:0] axi_master_ar_id;
+	output wire [AXI_USER_WIDTH - 1:0] axi_master_ar_user;
+	input wire axi_master_ar_ready;
+	output reg axi_master_w_valid;
+	output wire [AXI_DATA_WIDTH - 1:0] axi_master_w_data;
+	output wire [(AXI_DATA_WIDTH / 8) - 1:0] axi_master_w_strb;
+	output wire [AXI_USER_WIDTH - 1:0] axi_master_w_user;
+	output wire axi_master_w_last;
+	input wire axi_master_w_ready;
+	input wire axi_master_r_valid;
+	input wire [AXI_DATA_WIDTH - 1:0] axi_master_r_data;
+	input wire [1:0] axi_master_r_resp;
+	input wire axi_master_r_last;
+	input wire [AXI_ID_WIDTH - 1:0] axi_master_r_id;
+	input wire [AXI_USER_WIDTH - 1:0] axi_master_r_user;
+	output reg axi_master_r_ready;
+	input wire axi_master_b_valid;
+	input wire [1:0] axi_master_b_resp;
+	input wire [AXI_ID_WIDTH - 1:0] axi_master_b_id;
+	input wire [AXI_USER_WIDTH - 1:0] axi_master_b_user;
+	output reg axi_master_b_ready;
+	reg [(AXI_DATA_WIDTH / 8) - 1:0] sel_reg;
+	reg [AXI_ADDR_WIDTH - 1:0] addr_reg;
+	reg [AXI_DATA_WIDTH - 1:0] data_in_reg;
+	reg [AXI_DATA_WIDTH - 1:0] data_out_reg;
+	reg wr_reg;
+	reg str_sync;
+	reg rdy_sync;
+	reg err_reg;
+	reg rdy_sync_tff1;
+	reg rdy_sync_tff2;
+	reg rdy_sync_tff2q;
+	reg str_sync_wbff1;
+	reg str_sync_wbff2;
+	reg str_sync_wbff2q;
+	reg data_o_en;
+	reg rdy_sync_en;
+	reg err_en;
+	reg [(AXI_DATA_WIDTH / 8) - 1:0] be_dec;
+	wire start_toggle;
+	reg [AXI_DATA_WIDTH - 1:0] swapped_data_i;
+	reg [AXI_DATA_WIDTH - 1:0] swapped_data_out;
+	reg [1:0] axi_fsm_state;
+	reg [1:0] next_fsm_state;
+	always @(*)
+		if (AXI_DATA_WIDTH == 64)
+			case (word_size_i)
+				4'h1:
+					if (addr_i[2:0] == 3'b000)
+						be_dec = 8'b00000001;
+					else if (addr_i[2:0] == 3'b001)
+						be_dec = 8'b00000010;
+					else if (addr_i[2:0] == 3'b010)
+						be_dec = 8'b00000100;
+					else if (addr_i[2:0] == 3'b011)
+						be_dec = 8'b00001000;
+					else if (addr_i[2:0] == 3'b100)
+						be_dec = 8'b00010000;
+					else if (addr_i[2:0] == 3'b101)
+						be_dec = 8'b00100000;
+					else if (addr_i[2:0] == 3'b110)
+						be_dec = 8'b01000000;
+					else
+						be_dec = 8'b10000000;
+				4'h2:
+					if (addr_i[2:1] == 2'b00)
+						be_dec = 8'b00000011;
+					else if (addr_i[2:1] == 2'b01)
+						be_dec = 8'b00001100;
+					else if (addr_i[2:1] == 2'b10)
+						be_dec = 8'b00110000;
+					else
+						be_dec = 8'b11000000;
+				4'h4:
+					if (addr_i[2] == 1'b0)
+						be_dec = 8'b00001111;
+					else
+						be_dec = 8'b11110000;
+				4'h8: be_dec = 8'b11111111;
+				default: be_dec = 8'b11111111;
+			endcase
+		else if (AXI_DATA_WIDTH == 32)
+			case (word_size_i)
+				4'h1:
+					if (addr_i[1:0] == 2'b00)
+						be_dec = 4'b0001;
+					else if (addr_i[1:0] == 2'b01)
+						be_dec = 4'b0010;
+					else if (addr_i[1:0] == 2'b10)
+						be_dec = 4'b0100;
+					else
+						be_dec = 4'b1000;
+				4'h2:
+					if (addr_i[1] == 1'b0)
+						be_dec = 4'b0011;
+					else
+						be_dec = 4'b1100;
+				4'h4: be_dec = 4'b1111;
+				4'h8: be_dec = 4'b1111;
+				default: be_dec = 4'b1111;
+			endcase
+	always @(*)
+		if (AXI_DATA_WIDTH == 64)
+			case (be_dec)
+				8'b00001111: swapped_data_i = {32'h00000000, data_i[63:32]};
+				8'b11110000: swapped_data_i = {data_i[63:32], 32'h00000000};
+				8'b00000011: swapped_data_i = {48'h000000000000, data_i[63:48]};
+				8'b00001100: swapped_data_i = {32'h00000000, data_i[63:48], 16'h0000};
+				8'b00110000: swapped_data_i = {16'h0000, data_i[63:48], 32'h00000000};
+				8'b11000000: swapped_data_i = {data_i[63:48], 48'h000000000000};
+				8'b00000001: swapped_data_i = {56'h00000000000000, data_i[63:56]};
+				8'b00000010: swapped_data_i = {48'h000000000000, data_i[63:56], 8'h00};
+				8'b00000100: swapped_data_i = {40'h0000000000, data_i[63:56], 16'h0000};
+				8'b00001000: swapped_data_i = {32'h00000000, data_i[63:56], 24'h000000};
+				8'b00010000: swapped_data_i = {24'h000000, data_i[63:56], 32'h00000000};
+				8'b00100000: swapped_data_i = {16'h0000, data_i[63:56], 40'h0000000000};
+				8'b01000000: swapped_data_i = {8'h00, data_i[63:56], 48'h000000000000};
+				8'b10000000: swapped_data_i = {data_i[63:56], 56'h00000000000000};
+				default: swapped_data_i = data_i;
+			endcase
+		else if (AXI_DATA_WIDTH == 32)
+			case (be_dec)
+				4'b1111: swapped_data_i = data_i[63:32];
+				4'b0011: swapped_data_i = {16'h0000, data_i[63:48]};
+				4'b1100: swapped_data_i = {data_i[63:48], 16'h0000};
+				4'b0001: swapped_data_i = {24'h000000, data_i[63:56]};
+				4'b0010: swapped_data_i = {16'h0000, data_i[63:56], 8'h00};
+				4'b0100: swapped_data_i = {8'h00, data_i[63:56], 16'h0000};
+				4'b1000: swapped_data_i = {data_i[63:56], 24'h000000};
+				default: swapped_data_i = data_i[63:32];
+			endcase
+	generate
+		if (AXI_DATA_WIDTH == 64) begin : genblk1
+			always @(*)
+				case (sel_reg)
+					8'b00001111: swapped_data_out = axi_master_r_data;
+					8'b11110000: swapped_data_out = {32'h00000000, axi_master_r_data[63:32]};
+					8'b00000011: swapped_data_out = axi_master_r_data;
+					8'b00001100: swapped_data_out = {16'h0000, axi_master_r_data[63:16]};
+					8'b00110000: swapped_data_out = {32'h00000000, axi_master_r_data[63:32]};
+					8'b11000000: swapped_data_out = {48'h000000000000, axi_master_r_data[63:48]};
+					8'b00000001: swapped_data_out = axi_master_r_data;
+					8'b00000010: swapped_data_out = {8'h00, axi_master_r_data[63:8]};
+					8'b00000100: swapped_data_out = {16'h0000, axi_master_r_data[63:16]};
+					8'b00001000: swapped_data_out = {24'h000000, axi_master_r_data[63:24]};
+					8'b00010000: swapped_data_out = {32'h00000000, axi_master_r_data[63:32]};
+					8'b00100000: swapped_data_out = {40'h0000000000, axi_master_r_data[63:40]};
+					8'b01000000: swapped_data_out = {48'h000000000000, axi_master_r_data[63:48]};
+					8'b10000000: swapped_data_out = {56'h00000000000000, axi_master_r_data[63:56]};
+					default: swapped_data_out = axi_master_r_data;
+				endcase
+		end
+		else if (AXI_DATA_WIDTH == 32) begin : genblk1
+			always @(*)
+				case (sel_reg)
+					4'b1111: swapped_data_out = axi_master_r_data;
+					4'b0011: swapped_data_out = axi_master_r_data;
+					4'b1100: swapped_data_out = {16'h0000, axi_master_r_data[31:16]};
+					4'b0001: swapped_data_out = axi_master_r_data;
+					4'b0010: swapped_data_out = {8'h00, axi_master_r_data[31:8]};
+					4'b0100: swapped_data_out = {16'h0000, axi_master_r_data[31:16]};
+					4'b1000: swapped_data_out = {24'h000000, axi_master_r_data[31:24]};
+					default: swapped_data_out = axi_master_r_data;
+				endcase
+		end
+	endgenerate
+	always @(posedge tck_i or negedge trstn_i)
+		if (~trstn_i) begin
+			sel_reg <= 'h0;
+			addr_reg <= 'h0;
+			data_in_reg <= 'h0;
+			wr_reg <= 1'b0;
+		end
+		else if (strobe_i && rdy_o) begin
+			sel_reg <= be_dec;
+			addr_reg <= addr_i;
+			if (!rd_wrn_i)
+				data_in_reg <= swapped_data_i;
+			wr_reg <= ~rd_wrn_i;
+		end
+	always @(posedge tck_i or negedge trstn_i)
+		if (~trstn_i)
+			str_sync <= 1'b0;
+		else if (strobe_i && rdy_o)
+			str_sync <= ~str_sync;
+	always @(posedge tck_i or negedge trstn_i)
+		if (~trstn_i) begin
+			rdy_sync_tff1 <= 1'b0;
+			rdy_sync_tff2 <= 1'b0;
+			rdy_sync_tff2q <= 1'b0;
+		end
+		else begin
+			rdy_sync_tff1 <= rdy_sync;
+			rdy_sync_tff2 <= rdy_sync_tff1;
+			rdy_sync_tff2q <= rdy_sync_tff2;
+		end
+	always @(posedge tck_i or negedge trstn_i)
+		if (~trstn_i)
+			rdy_o <= 1'b1;
+		else if (strobe_i && rdy_o)
+			rdy_o <= 1'b0;
+		else if (rdy_sync_tff2 != rdy_sync_tff2q)
+			rdy_o <= 1'b1;
+	assign axi_master_ar_addr = addr_reg;
+	assign axi_master_aw_addr = addr_reg;
+	assign axi_master_w_data = data_in_reg;
+	assign axi_master_w_strb = sel_reg;
+	always @(*)
+		if (AXI_DATA_WIDTH == 64)
+			data_o = data_out_reg;
+		else if (AXI_DATA_WIDTH == 32)
+			data_o = {32'h00000000, data_out_reg};
+	assign err_o = err_reg;
+	assign axi_master_aw_prot = 'h0;
+	assign axi_master_aw_region = 'h0;
+	assign axi_master_aw_len = 'h0;
+	assign axi_master_aw_burst = 'h0;
+	assign axi_master_aw_lock = 'h0;
+	assign axi_master_aw_cache = 'h0;
+	assign axi_master_aw_qos = 'h0;
+	assign axi_master_aw_id = 'h0;
+	assign axi_master_aw_user = 'h0;
+	assign axi_master_ar_prot = 'h0;
+	assign axi_master_ar_region = 'h0;
+	assign axi_master_ar_len = 'h0;
+	assign axi_master_ar_burst = 'h0;
+	assign axi_master_ar_lock = 'h0;
+	assign axi_master_ar_cache = 'h0;
+	assign axi_master_ar_qos = 'h0;
+	assign axi_master_ar_id = 'h0;
+	assign axi_master_ar_user = 'h0;
+	assign axi_master_w_user = 'h0;
+	assign axi_master_w_last = 1'b1;
+	always @(*)
+		case (word_size_i)
+			4'h1: begin
+				axi_master_aw_size = 3'b000;
+				axi_master_ar_size = 3'b000;
+			end
+			4'h2: begin
+				axi_master_aw_size = 3'b001;
+				axi_master_ar_size = 3'b001;
+			end
+			4'h4: begin
+				axi_master_aw_size = 3'b010;
+				axi_master_ar_size = 3'b010;
+			end
+			4'h8: begin
+				axi_master_aw_size = 3'b011;
+				axi_master_ar_size = 3'b011;
+			end
+			default: begin
+				axi_master_aw_size = 3'b011;
+				axi_master_ar_size = 3'b011;
+			end
+		endcase
+	always @(posedge axi_aclk or negedge axi_aresetn)
+		if (!axi_aresetn) begin
+			str_sync_wbff1 <= 1'b0;
+			str_sync_wbff2 <= 1'b0;
+			str_sync_wbff2q <= 1'b0;
+		end
+		else begin
+			str_sync_wbff1 <= str_sync;
+			str_sync_wbff2 <= str_sync_wbff1;
+			str_sync_wbff2q <= str_sync_wbff2;
+		end
+	assign start_toggle = str_sync_wbff2 != str_sync_wbff2q;
+	always @(posedge axi_aclk or negedge axi_aresetn)
+		if (!axi_aresetn)
+			err_reg <= 1'b0;
+		else if (err_en)
+			err_reg <= (wr_reg ? (axi_master_b_resp == 2'b00 ? 1'b0 : 1'b1) : (axi_master_r_resp == 2'b00 ? 1'b0 : 1'b1));
+	always @(posedge axi_aclk or negedge axi_aresetn)
+		if (!axi_aresetn)
+			data_out_reg <= 32'h00000000;
+		else if (data_o_en)
+			data_out_reg <= swapped_data_out;
+	always @(posedge axi_aclk or negedge axi_aresetn)
+		if (!axi_aresetn)
+			rdy_sync <= 1'b0;
+		else if (rdy_sync_en)
+			rdy_sync <= ~rdy_sync;
+	always @(posedge axi_aclk or negedge axi_aresetn)
+		if (~axi_aresetn)
+			axi_fsm_state <= 2'd0;
+		else
+			axi_fsm_state <= next_fsm_state;
+	always @(*) begin
+		axi_master_aw_valid = 1'b0;
+		axi_master_w_valid = 1'b0;
+		axi_master_ar_valid = 1'b0;
+		axi_master_b_ready = 1'b0;
+		axi_master_r_ready = 1'b0;
+		next_fsm_state = axi_fsm_state;
+		rdy_sync_en = 1'b0;
+		data_o_en = 1'b0;
+		err_en = 1'b0;
+		case (axi_fsm_state)
+			2'd0:
+				if (start_toggle)
+					next_fsm_state = 2'd1;
+				else
+					next_fsm_state = 2'd0;
+			2'd1: begin
+				if (wr_reg)
+					axi_master_aw_valid = 1'b1;
+				else
+					axi_master_ar_valid = 1'b1;
+				if (wr_reg && axi_master_aw_ready)
+					next_fsm_state = 2'd2;
+				else if (!wr_reg && axi_master_ar_ready)
+					next_fsm_state = 2'd3;
+			end
+			2'd2: begin
+				axi_master_w_valid = 1'b1;
+				if (axi_master_w_ready)
+					next_fsm_state = 2'd3;
+			end
+			2'd3: begin
+				if (wr_reg)
+					axi_master_b_ready = 1'b1;
+				else
+					axi_master_r_ready = 1'b1;
+				if (wr_reg && axi_master_b_valid) begin
+					next_fsm_state = 2'd0;
+					rdy_sync_en = 1'b1;
+					err_en = 1'b1;
+				end
+				else if (!wr_reg && axi_master_r_valid) begin
+					data_o_en = 1'b1;
+					next_fsm_state = 2'd0;
+					rdy_sync_en = 1'b1;
+					err_en = 1'b1;
+				end
+			end
+		endcase
+	end
+endmodule
diff --git a/verilog/rtl/ips/adv_dbg_if/rtl/adbg_axi_defines.v b/verilog/rtl/ips/adv_dbg_if/rtl/adbg_axi_defines.v
new file mode 100644
index 0000000..b9fe191
--- /dev/null
+++ b/verilog/rtl/ips/adv_dbg_if/rtl/adbg_axi_defines.v
@@ -0,0 +1,94 @@
+//////////////////////////////////////////////////////////////////////
+////                                                              ////
+////  adbg_wb_defines.v                                           ////
+////                                                              ////
+////                                                              ////
+////  This file is part of the SoC Advanced Debug Interface.      ////
+////                                                              ////
+////  Author(s):                                                  ////
+////       Nathan Yawn (nathan.yawn@opencores.org)                ////
+////                                                              ////
+////                                                              ////
+////                                                              ////
+//////////////////////////////////////////////////////////////////////
+////                                                              ////
+//// Copyright (C) 2008-2010        Authors                       ////
+////                                                              ////
+//// This source file may be used and distributed without         ////
+//// restriction provided that this copyright statement is not    ////
+//// removed from the file and that any derivative work contains  ////
+//// the original copyright notice and the associated disclaimer. ////
+////                                                              ////
+//// This source file is free software; you can redistribute it   ////
+//// and/or modify it under the terms of the GNU Lesser General   ////
+//// Public License as published by the Free Software Foundation; ////
+//// either version 2.1 of the License, or (at your option) any   ////
+//// later version.                                               ////
+////                                                              ////
+//// This source is distributed in the hope that it will be       ////
+//// useful, but WITHOUT ANY WARRANTY; without even the implied   ////
+//// warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR      ////
+//// PURPOSE.  See the GNU Lesser General Public License for more ////
+//// details.                                                     ////
+////                                                              ////
+//// You should have received a copy of the GNU Lesser General    ////
+//// Public License along with this source; if not, download it   ////
+//// from http://www.opencores.org/lgpl.shtml                     ////
+////                                                              ////
+//////////////////////////////////////////////////////////////////////
+//
+// CVS Revision History
+//
+// $Log: adbg_wb_defines.v,v $
+// Revision 1.4  2010-01-10 22:54:11  Nathan
+// Update copyright dates
+//
+// Revision 1.3  2009/05/17 20:54:57  Nathan
+// Changed email address to opencores.org
+//
+// Revision 1.2  2009/05/04 00:50:11  Nathan
+// Changed the AXI BIU to use big-endian byte ordering, to match the OR1000.  Kept little-endian ordering as a compile-time option in case this is ever used with a little-endian CPU.
+//
+// Revision 1.1  2008/07/22 20:28:32  Nathan
+// Changed names of all files and modules (prefixed an a, for advanced).  Cleanup, indenting.  No functional changes.
+//
+
+// Endian-ness of the Wishbone interface.
+// Default is BIG endian, to match the OR1200.
+// If using a LITTLE endian CPU, e.g. an x86, un-comment this line.
+//`define DBG_AXI_LITTLE_ENDIAN
+
+// These relate to the number of internal registers, and how
+// many bits are required in the Reg. Select register
+`define DBG_AXI_REGSELECT_SIZE 1
+`define DBG_AXI_NUM_INTREG 1
+
+// Register index definitions for module-internal registers
+// The AXI module has just 1, the error register
+`define DBG_AXI_INTREG_ERROR 1'b0
+
+// Valid commands/opcodes for the wishbone debug module
+// 0000  NOP
+// 0001  Write burst, 8-bit access
+// 0010  Write burst, 16-bit access
+// 0011  Write burst, 32-bit access
+// 0100  Write burst, 64-bit access
+// 0101  Read burst, 8-bit access
+// 0110  Read burst, 16-bit access
+// 0111  Read burst, 32-bit access
+// 1000  Read burst, 64-bit access
+// 1001  Internal register select/write
+// 1010 - 1100 Reserved
+// 1101  Internal register select
+// 1110 - 1111 Reserved
+
+`define DBG_AXI_CMD_BWRITE8  4'h1
+`define DBG_AXI_CMD_BWRITE16 4'h2
+`define DBG_AXI_CMD_BWRITE32 4'h3
+`define DBG_AXI_CMD_BWRITE64 4'h4
+`define DBG_AXI_CMD_BREAD8   4'h5
+`define DBG_AXI_CMD_BREAD16  4'h6
+`define DBG_AXI_CMD_BREAD32  4'h7
+`define DBG_AXI_CMD_BREAD64  4'h8
+`define DBG_AXI_CMD_IREG_WR  4'h9
+`define DBG_AXI_CMD_IREG_SEL 4'hd
diff --git a/verilog/rtl/ips/adv_dbg_if/rtl/adbg_axi_module.v b/verilog/rtl/ips/adv_dbg_if/rtl/adbg_axi_module.v
new file mode 100644
index 0000000..bd65b3c
--- /dev/null
+++ b/verilog/rtl/ips/adv_dbg_if/rtl/adbg_axi_module.v
@@ -0,0 +1,630 @@
+module adbg_axi_module 
+#(
+	parameter AXI_ADDR_WIDTH = 32,
+	parameter AXI_DATA_WIDTH = 64,
+	parameter AXI_USER_WIDTH = 6,
+	parameter AXI_ID_WIDTH   = 3
+)
+(
+	tck_i,
+	module_tdo_o,
+	tdi_i,
+	capture_dr_i,
+	shift_dr_i,
+	update_dr_i,
+	data_register_i,
+	module_select_i,
+	top_inhibit_o,
+	trstn_i,
+	axi_aclk,
+	axi_aresetn,
+	axi_master_aw_valid,
+	axi_master_aw_addr,
+	axi_master_aw_prot,
+	axi_master_aw_region,
+	axi_master_aw_len,
+	axi_master_aw_size,
+	axi_master_aw_burst,
+	axi_master_aw_lock,
+	axi_master_aw_cache,
+	axi_master_aw_qos,
+	axi_master_aw_id,
+	axi_master_aw_user,
+	axi_master_aw_ready,
+	axi_master_ar_valid,
+	axi_master_ar_addr,
+	axi_master_ar_prot,
+	axi_master_ar_region,
+	axi_master_ar_len,
+	axi_master_ar_size,
+	axi_master_ar_burst,
+	axi_master_ar_lock,
+	axi_master_ar_cache,
+	axi_master_ar_qos,
+	axi_master_ar_id,
+	axi_master_ar_user,
+	axi_master_ar_ready,
+	axi_master_w_valid,
+	axi_master_w_data,
+	axi_master_w_strb,
+	axi_master_w_user,
+	axi_master_w_last,
+	axi_master_w_ready,
+	axi_master_r_valid,
+	axi_master_r_data,
+	axi_master_r_resp,
+	axi_master_r_last,
+	axi_master_r_id,
+	axi_master_r_user,
+	axi_master_r_ready,
+	axi_master_b_valid,
+	axi_master_b_resp,
+	axi_master_b_id,
+	axi_master_b_user,
+	axi_master_b_ready
+);
+	//parameter AXI_ADDR_WIDTH = 32;
+	//parameter AXI_DATA_WIDTH = 64;
+	//parameter AXI_USER_WIDTH = 6;
+	//parameter AXI_ID_WIDTH = 3;
+	input wire tck_i;
+	output reg module_tdo_o;
+	input wire tdi_i;
+	input wire capture_dr_i;
+	input wire shift_dr_i;
+	input wire update_dr_i;
+	input wire [63:0] data_register_i;
+	input wire module_select_i;
+	output reg top_inhibit_o;
+	input wire trstn_i;
+	input wire axi_aclk;
+	input wire axi_aresetn;
+	output wire axi_master_aw_valid;
+	output wire [AXI_ADDR_WIDTH - 1:0] axi_master_aw_addr;
+	output wire [2:0] axi_master_aw_prot;
+	output wire [3:0] axi_master_aw_region;
+	output wire [7:0] axi_master_aw_len;
+	output wire [2:0] axi_master_aw_size;
+	output wire [1:0] axi_master_aw_burst;
+	output wire axi_master_aw_lock;
+	output wire [3:0] axi_master_aw_cache;
+	output wire [3:0] axi_master_aw_qos;
+	output wire [AXI_ID_WIDTH - 1:0] axi_master_aw_id;
+	output wire [AXI_USER_WIDTH - 1:0] axi_master_aw_user;
+	input wire axi_master_aw_ready;
+	output wire axi_master_ar_valid;
+	output wire [AXI_ADDR_WIDTH - 1:0] axi_master_ar_addr;
+	output wire [2:0] axi_master_ar_prot;
+	output wire [3:0] axi_master_ar_region;
+	output wire [7:0] axi_master_ar_len;
+	output wire [2:0] axi_master_ar_size;
+	output wire [1:0] axi_master_ar_burst;
+	output wire axi_master_ar_lock;
+	output wire [3:0] axi_master_ar_cache;
+	output wire [3:0] axi_master_ar_qos;
+	output wire [AXI_ID_WIDTH - 1:0] axi_master_ar_id;
+	output wire [AXI_USER_WIDTH - 1:0] axi_master_ar_user;
+	input wire axi_master_ar_ready;
+	output wire axi_master_w_valid;
+	output wire [AXI_DATA_WIDTH - 1:0] axi_master_w_data;
+	output wire [(AXI_DATA_WIDTH / 8) - 1:0] axi_master_w_strb;
+	output wire [AXI_USER_WIDTH - 1:0] axi_master_w_user;
+	output wire axi_master_w_last;
+	input wire axi_master_w_ready;
+	input wire axi_master_r_valid;
+	input wire [AXI_DATA_WIDTH - 1:0] axi_master_r_data;
+	input wire [1:0] axi_master_r_resp;
+	input wire axi_master_r_last;
+	input wire [AXI_ID_WIDTH - 1:0] axi_master_r_id;
+	input wire [AXI_USER_WIDTH - 1:0] axi_master_r_user;
+	output wire axi_master_r_ready;
+	input wire axi_master_b_valid;
+	input wire [1:0] axi_master_b_resp;
+	input wire [AXI_ID_WIDTH - 1:0] axi_master_b_id;
+	input wire [AXI_USER_WIDTH - 1:0] axi_master_b_user;
+	output wire axi_master_b_ready;
+	reg [31:0] address_counter;
+	reg [5:0] bit_count;
+	reg [15:0] word_count;
+	reg [3:0] operation;
+	reg [64:0] data_out_shift_reg;
+	reg [0:0] internal_register_select;
+	reg [32:0] internal_reg_error;
+	reg addr_sel;
+	reg addr_ct_en;
+	reg op_reg_en;
+	reg bit_ct_en;
+	reg bit_ct_rst;
+	reg word_ct_sel;
+	reg word_ct_en;
+	reg out_reg_ld_en;
+	reg out_reg_shift_en;
+	reg out_reg_data_sel;
+	reg [1:0] tdo_output_sel;
+	reg biu_strobe;
+	reg crc_clr;
+	reg crc_en;
+	reg crc_in_sel;
+	reg crc_shift_en;
+	reg regsel_ld_en;
+	reg intreg_ld_en;
+	reg error_reg_en;
+	reg biu_clr_err;
+	wire word_count_zero;
+	wire bit_count_max;
+	wire module_cmd;
+	wire biu_ready;
+	wire biu_err;
+	wire burst_read;
+	wire burst_write;
+	wire intreg_instruction;
+	wire intreg_write;
+	reg rd_op;
+	wire crc_match;
+	wire bit_count_32;
+	reg [5:0] word_size_bits;
+	reg [3:0] word_size_bytes;
+	wire [32:0] incremented_address;
+	wire [31:0] data_to_addr_counter;
+	wire [15:0] data_to_word_counter;
+	wire [15:0] decremented_word_count;
+	wire [31:0] address_data_in;
+	wire [15:0] count_data_in;
+	wire [3:0] operation_in;
+	wire [63:0] data_to_biu;
+	wire [63:0] data_from_biu;
+	wire [31:0] crc_data_out;
+	wire crc_data_in;
+	wire crc_serial_out;
+	wire [0:0] reg_select_data;
+	wire [64:0] out_reg_data;
+	reg [64:0] data_from_internal_reg;
+	wire biu_rst;
+	reg [3:0] module_state;
+	reg [3:0] module_next_state;
+	assign module_cmd = ~data_register_i[63];
+	assign operation_in = data_register_i[62:59];
+	assign address_data_in = data_register_i[58:27];
+	assign count_data_in = data_register_i[26:11];
+	assign data_to_biu = {tdi_i, data_register_i[63:1]};
+	assign reg_select_data = data_register_i[58:57];
+	assign intreg_instruction = (operation_in == 4'h9) | (operation_in == 4'hd);
+	assign intreg_write = operation_in == 4'h9;
+	assign burst_write = (((operation_in == 4'h1) | (operation_in == 4'h2)) | (operation_in == 4'h3)) | (operation_in == 4'h4);
+	assign burst_read = (((operation_in == 4'h5) | (operation_in == 4'h6)) | (operation_in == 4'h7)) | (operation_in == 4'h8);
+	always @(*)
+		case (operation)
+			4'h1: begin
+				word_size_bits = 6'd7;
+				word_size_bytes = 4'd1;
+				rd_op = 1'b0;
+			end
+			4'h2: begin
+				word_size_bits = 6'd15;
+				word_size_bytes = 4'd2;
+				rd_op = 1'b0;
+			end
+			4'h3: begin
+				word_size_bits = 6'd31;
+				word_size_bytes = 4'd4;
+				rd_op = 1'b0;
+			end
+			4'h4: begin
+				word_size_bits = 6'd63;
+				word_size_bytes = 4'd8;
+				rd_op = 1'b0;
+			end
+			4'h5: begin
+				word_size_bits = 6'd7;
+				word_size_bytes = 4'd1;
+				rd_op = 1'b1;
+			end
+			4'h6: begin
+				word_size_bits = 6'd15;
+				word_size_bytes = 4'd2;
+				rd_op = 1'b1;
+			end
+			4'h7: begin
+				word_size_bits = 6'd31;
+				word_size_bytes = 4'd4;
+				rd_op = 1'b1;
+			end
+			4'h8: begin
+				word_size_bits = 6'd63;
+				word_size_bytes = 4'd4;
+				rd_op = 1'b1;
+			end
+			default: begin
+				word_size_bits = 6'b000000;
+				word_size_bytes = 4'b0000;
+				rd_op = 1'b0;
+			end
+		endcase
+	always @(posedge tck_i or negedge trstn_i)
+		if (~trstn_i)
+			internal_register_select <= 1'h0;
+		else if (regsel_ld_en)
+			internal_register_select <= reg_select_data;
+	always @(*)
+		case (internal_register_select)
+			1'b0: data_from_internal_reg = internal_reg_error;
+			default: data_from_internal_reg = internal_reg_error;
+		endcase
+	always @(posedge tck_i or negedge trstn_i)
+		if (~trstn_i)
+			internal_reg_error <= 33'h000000000;
+		else if (intreg_ld_en && (reg_select_data == 1'b0)) begin
+			if (data_register_i[46])
+				internal_reg_error[0] <= 1'b0;
+		end
+		else if (error_reg_en && !internal_reg_error[0]) begin
+			if (biu_err || !biu_ready)
+				internal_reg_error[0] <= 1'b1;
+			else if (biu_strobe)
+				internal_reg_error[32:1] <= address_counter;
+		end
+		else if (biu_strobe && !internal_reg_error[0])
+			internal_reg_error[32:1] <= address_counter;
+	assign data_to_addr_counter = (addr_sel ? incremented_address[31:0] : address_data_in);
+	assign incremented_address = address_counter + word_size_bytes;
+	always @(posedge tck_i or negedge trstn_i)
+		if (~trstn_i)
+			address_counter <= 32'h00000000;
+		else if (addr_ct_en)
+			address_counter <= data_to_addr_counter;
+	always @(posedge tck_i or negedge trstn_i)
+		if (~trstn_i)
+			operation <= 4'h0;
+		else if (op_reg_en)
+			operation <= operation_in;
+	always @(posedge tck_i or negedge trstn_i)
+		if (~trstn_i)
+			bit_count <= 6'h00;
+		else if (bit_ct_rst)
+			bit_count <= 6'h00;
+		else if (bit_ct_en)
+			bit_count <= bit_count + 6'h01;
+	assign bit_count_max = (bit_count == word_size_bits ? 1'b1 : 1'b0);
+	assign bit_count_32 = (bit_count == 6'h20 ? 1'b1 : 1'b0);
+	assign data_to_word_counter = (word_ct_sel ? decremented_word_count : count_data_in);
+	assign decremented_word_count = word_count - 16'h0001;
+	always @(posedge tck_i or negedge trstn_i)
+		if (~trstn_i)
+			word_count <= 16'h0000;
+		else if (word_ct_en)
+			word_count <= data_to_word_counter;
+	assign word_count_zero = word_count == 16'h0000;
+	assign out_reg_data = (out_reg_data_sel ? data_from_internal_reg : {1'b0, data_from_biu});
+	always @(posedge tck_i or negedge trstn_i)
+		if (~trstn_i)
+			data_out_shift_reg <= 'h0;
+		else if (out_reg_ld_en)
+			data_out_shift_reg <= out_reg_data;
+		else if (out_reg_shift_en)
+			data_out_shift_reg <= {1'b0, data_out_shift_reg[64:1]};
+	always @(*)
+		if (tdo_output_sel == 2'h0)
+			module_tdo_o = biu_ready;
+		else if (tdo_output_sel == 2'h1)
+			module_tdo_o = data_out_shift_reg[0];
+		else if (tdo_output_sel == 2'h2)
+			module_tdo_o = crc_match;
+		else
+			module_tdo_o = crc_serial_out;
+	adbg_axi_biu #(
+		.AXI_ADDR_WIDTH(AXI_ADDR_WIDTH),
+		.AXI_DATA_WIDTH(AXI_DATA_WIDTH),
+		.AXI_USER_WIDTH(AXI_USER_WIDTH),
+		.AXI_ID_WIDTH(AXI_ID_WIDTH)
+	) axi_biu_i(
+		.tck_i(tck_i),
+		.trstn_i(trstn_i),
+		.data_i(data_to_biu),
+		.data_o(data_from_biu),
+		.addr_i(address_counter),
+		.strobe_i(biu_strobe),
+		.rd_wrn_i(rd_op),
+		.rdy_o(biu_ready),
+		.err_o(biu_err),
+		.word_size_i(word_size_bytes),
+		.axi_aclk(axi_aclk),
+		.axi_aresetn(axi_aresetn),
+		.axi_master_aw_valid(axi_master_aw_valid),
+		.axi_master_aw_addr(axi_master_aw_addr),
+		.axi_master_aw_prot(axi_master_aw_prot),
+		.axi_master_aw_region(axi_master_aw_region),
+		.axi_master_aw_len(axi_master_aw_len),
+		.axi_master_aw_size(axi_master_aw_size),
+		.axi_master_aw_burst(axi_master_aw_burst),
+		.axi_master_aw_lock(axi_master_aw_lock),
+		.axi_master_aw_cache(axi_master_aw_cache),
+		.axi_master_aw_qos(axi_master_aw_qos),
+		.axi_master_aw_id(axi_master_aw_id),
+		.axi_master_aw_user(axi_master_aw_user),
+		.axi_master_aw_ready(axi_master_aw_ready),
+		.axi_master_ar_valid(axi_master_ar_valid),
+		.axi_master_ar_addr(axi_master_ar_addr),
+		.axi_master_ar_prot(axi_master_ar_prot),
+		.axi_master_ar_region(axi_master_ar_region),
+		.axi_master_ar_len(axi_master_ar_len),
+		.axi_master_ar_size(axi_master_ar_size),
+		.axi_master_ar_burst(axi_master_ar_burst),
+		.axi_master_ar_lock(axi_master_ar_lock),
+		.axi_master_ar_cache(axi_master_ar_cache),
+		.axi_master_ar_qos(axi_master_ar_qos),
+		.axi_master_ar_id(axi_master_ar_id),
+		.axi_master_ar_user(axi_master_ar_user),
+		.axi_master_ar_ready(axi_master_ar_ready),
+		.axi_master_w_valid(axi_master_w_valid),
+		.axi_master_w_data(axi_master_w_data),
+		.axi_master_w_strb(axi_master_w_strb),
+		.axi_master_w_user(axi_master_w_user),
+		.axi_master_w_last(axi_master_w_last),
+		.axi_master_w_ready(axi_master_w_ready),
+		.axi_master_r_valid(axi_master_r_valid),
+		.axi_master_r_data(axi_master_r_data),
+		.axi_master_r_resp(axi_master_r_resp),
+		.axi_master_r_last(axi_master_r_last),
+		.axi_master_r_id(axi_master_r_id),
+		.axi_master_r_user(axi_master_r_user),
+		.axi_master_r_ready(axi_master_r_ready),
+		.axi_master_b_valid(axi_master_b_valid),
+		.axi_master_b_resp(axi_master_b_resp),
+		.axi_master_b_id(axi_master_b_id),
+		.axi_master_b_user(axi_master_b_user),
+		.axi_master_b_ready(axi_master_b_ready)
+	);
+	assign crc_data_in = (crc_in_sel ? tdi_i : data_out_shift_reg[0]);
+	adbg_crc32 axi_crc_i(
+		.clk(tck_i),
+		.data(crc_data_in),
+		.enable(crc_en),
+		.shift(crc_shift_en),
+		.clr(crc_clr),
+		.rstn(trstn_i),
+		.crc_out(crc_data_out),
+		.serial_out(crc_serial_out)
+	);
+	assign crc_match = (data_register_i[63:32] == crc_data_out ? 1'b1 : 1'b0);
+	always @(posedge tck_i or negedge trstn_i)
+		if (~trstn_i)
+			module_state <= 4'd0;
+		else
+			module_state <= module_next_state;
+	always @(*)
+		case (module_state)
+			4'd0:
+				if (((module_cmd && module_select_i) && update_dr_i) && burst_read)
+					module_next_state = 4'd1;
+				else if (((module_cmd && module_select_i) && update_dr_i) && burst_write)
+					module_next_state = 4'd5;
+				else
+					module_next_state = 4'd0;
+			4'd1:
+				if (word_count_zero)
+					module_next_state = 4'd0;
+				else
+					module_next_state = 4'd2;
+			4'd2:
+				if (module_select_i && capture_dr_i)
+					module_next_state = 4'd3;
+				else
+					module_next_state = 4'd2;
+			4'd3:
+				if (update_dr_i)
+					module_next_state = 4'd0;
+				else if (biu_ready)
+					module_next_state = 4'd4;
+				else
+					module_next_state = 4'd3;
+			4'd4:
+				if (update_dr_i)
+					module_next_state = 4'd0;
+				else if (bit_count_max && word_count_zero)
+					module_next_state = 4'd9;
+				else
+					module_next_state = 4'd4;
+			4'd9:
+				if (update_dr_i)
+					module_next_state = 4'd0;
+				else
+					module_next_state = 4'd9;
+			4'd5:
+				if (word_count_zero)
+					module_next_state = 4'd0;
+				else if (module_select_i && capture_dr_i)
+					module_next_state = 4'd6;
+				else
+					module_next_state = 4'd5;
+			4'd6:
+				if (update_dr_i)
+					module_next_state = 4'd0;
+				else if (module_select_i && data_register_i[63])
+					module_next_state = 4'd7;
+				else
+					module_next_state = 4'd6;
+			4'd7:
+				if (update_dr_i)
+					module_next_state = 4'd0;
+				else if (bit_count_max) begin
+					if (word_count_zero)
+						module_next_state = 4'd10;
+					else
+						module_next_state = 4'd7;
+				end
+				else
+					module_next_state = 4'd7;
+			4'd8:
+				if (update_dr_i)
+					module_next_state = 4'd0;
+				else if (word_count_zero)
+					module_next_state = 4'd10;
+				else
+					module_next_state = 4'd7;
+			4'd10:
+				if (update_dr_i)
+					module_next_state = 4'd0;
+				else if (bit_count_32)
+					module_next_state = 4'd11;
+				else
+					module_next_state = 4'd10;
+			4'd11:
+				if (update_dr_i)
+					module_next_state = 4'd0;
+				else
+					module_next_state = 4'd11;
+			default: module_next_state = 4'd0;
+		endcase
+	always @(*) begin
+		addr_sel = 1'b1;
+		addr_ct_en = 1'b0;
+		op_reg_en = 1'b0;
+		bit_ct_en = 1'b0;
+		bit_ct_rst = 1'b0;
+		word_ct_sel = 1'b1;
+		word_ct_en = 1'b0;
+		out_reg_ld_en = 1'b0;
+		out_reg_shift_en = 1'b0;
+		tdo_output_sel = 2'b01;
+		biu_strobe = 1'b0;
+		crc_clr = 1'b0;
+		crc_en = 1'b0;
+		crc_in_sel = 1'b0;
+		crc_shift_en = 1'b0;
+		out_reg_data_sel = 1'b1;
+		regsel_ld_en = 1'b0;
+		intreg_ld_en = 1'b0;
+		error_reg_en = 1'b0;
+		biu_clr_err = 1'b0;
+		top_inhibit_o = 1'b0;
+		case (module_state)
+			4'd0: begin
+				addr_sel = 1'b0;
+				word_ct_sel = 1'b0;
+				if (module_select_i & shift_dr_i)
+					out_reg_shift_en = 1'b1;
+				if (module_select_i & capture_dr_i) begin
+					out_reg_data_sel = 1'b1;
+					out_reg_ld_en = 1'b1;
+				end
+				if ((module_select_i & module_cmd) & update_dr_i) begin
+					if (intreg_instruction)
+						regsel_ld_en = 1'b1;
+					if (intreg_write)
+						intreg_ld_en = 1'b1;
+				end
+				if (module_next_state != 4'd0) begin
+					addr_ct_en = 1'b1;
+					op_reg_en = 1'b1;
+					bit_ct_rst = 1'b1;
+					word_ct_en = 1'b1;
+					crc_clr = 1'b1;
+				end
+			end
+			4'd1:
+				if (!word_count_zero) begin
+					biu_strobe = 1'b1;
+					addr_sel = 1'b1;
+					addr_ct_en = 1'b1;
+				end
+			4'd2:
+				;
+			4'd3: begin
+				tdo_output_sel = 2'h0;
+				top_inhibit_o = 1'b1;
+				if (module_next_state == 4'd4) begin
+					error_reg_en = 1'b1;
+					out_reg_data_sel = 1'b0;
+					out_reg_ld_en = 1'b1;
+					bit_ct_rst = 1'b1;
+					word_ct_sel = 1'b1;
+					word_ct_en = 1'b1;
+					if ((decremented_word_count != 0) && !word_count_zero) begin
+						biu_strobe = 1'b1;
+						addr_sel = 1'b1;
+						addr_ct_en = 1'b1;
+					end
+				end
+			end
+			4'd4: begin
+				tdo_output_sel = 2'h1;
+				out_reg_shift_en = 1'b1;
+				bit_ct_en = 1'b1;
+				crc_en = 1'b1;
+				crc_in_sel = 1'b0;
+				top_inhibit_o = 1'b1;
+				if (bit_count_max) begin
+					error_reg_en = 1'b1;
+					out_reg_data_sel = 1'b0;
+					out_reg_ld_en = 1'b1;
+					bit_ct_rst = 1'b1;
+					word_ct_sel = 1'b1;
+					word_ct_en = 1'b1;
+					if ((decremented_word_count != 0) && !word_count_zero) begin
+						biu_strobe = 1'b1;
+						addr_sel = 1'b1;
+						addr_ct_en = 1'b1;
+					end
+				end
+			end
+			4'd9: begin
+				tdo_output_sel = 2'h3;
+				crc_shift_en = 1'b1;
+				top_inhibit_o = 1'b1;
+			end
+			4'd5:
+				;
+			4'd6: begin
+				tdo_output_sel = 2'h1;
+				top_inhibit_o = 1'b1;
+				if (module_next_state == 4'd7) begin
+					biu_clr_err = 1'b1;
+					bit_ct_en = 1'b1;
+					word_ct_sel = 1'b1;
+					word_ct_en = 1'b1;
+					crc_en = 1'b1;
+					crc_in_sel = 1'b1;
+				end
+			end
+			4'd7: begin
+				bit_ct_en = 1'b1;
+				tdo_output_sel = 2'h1;
+				crc_en = 1'b1;
+				crc_in_sel = 1'b1;
+				top_inhibit_o = 1'b1;
+				if (bit_count_max) begin
+					error_reg_en = 1'b1;
+					bit_ct_rst = 1'b1;
+					biu_strobe = 1'b1;
+					addr_ct_en = 1'b1;
+					word_ct_sel = 1'b1;
+					word_ct_en = 1'b1;
+				end
+			end
+			4'd8: begin
+				tdo_output_sel = 2'h0;
+				error_reg_en = 1'b1;
+				biu_strobe = 1'b1;
+				word_ct_sel = 1'b1;
+				word_ct_en = 1'b1;
+				bit_ct_rst = 1'b1;
+				addr_ct_en = 1'b1;
+				top_inhibit_o = 1'b1;
+			end
+			4'd10: begin
+				bit_ct_en = 1'b1;
+				top_inhibit_o = 1'b1;
+				if (module_next_state == 4'd11)
+					tdo_output_sel = 2'h2;
+			end
+			4'd11: begin
+				tdo_output_sel = 2'h2;
+				top_inhibit_o = 1'b1;
+				if (module_next_state == 4'd0)
+					error_reg_en = 1'b1;
+			end
+			default:
+				;
+		endcase
+	end
+endmodule
diff --git a/verilog/rtl/ips/adv_dbg_if/rtl/adbg_axionly_top.v b/verilog/rtl/ips/adv_dbg_if/rtl/adbg_axionly_top.v
new file mode 100644
index 0000000..11ab4dc
--- /dev/null
+++ b/verilog/rtl/ips/adv_dbg_if/rtl/adbg_axionly_top.v
@@ -0,0 +1,225 @@
+module adbg_axionly_top 
+#(
+	parameter NB_CORES       = 4,
+	parameter AXI_ADDR_WIDTH = 32,
+	parameter AXI_DATA_WIDTH = 64,
+	parameter AXI_USER_WIDTH = 6,
+	parameter AXI_ID_WIDTH   = 3
+)
+(
+	tck_i,
+	tdi_i,
+	tdo_o,
+	trstn_i,
+	shift_dr_i,
+	pause_dr_i,
+	update_dr_i,
+	capture_dr_i,
+	debug_select_i,
+	axi_aclk,
+	axi_aresetn,
+	axi_master_aw_valid,
+	axi_master_aw_addr,
+	axi_master_aw_prot,
+	axi_master_aw_region,
+	axi_master_aw_len,
+	axi_master_aw_size,
+	axi_master_aw_burst,
+	axi_master_aw_lock,
+	axi_master_aw_cache,
+	axi_master_aw_qos,
+	axi_master_aw_id,
+	axi_master_aw_user,
+	axi_master_aw_ready,
+	axi_master_ar_valid,
+	axi_master_ar_addr,
+	axi_master_ar_prot,
+	axi_master_ar_region,
+	axi_master_ar_len,
+	axi_master_ar_size,
+	axi_master_ar_burst,
+	axi_master_ar_lock,
+	axi_master_ar_cache,
+	axi_master_ar_qos,
+	axi_master_ar_id,
+	axi_master_ar_user,
+	axi_master_ar_ready,
+	axi_master_w_valid,
+	axi_master_w_data,
+	axi_master_w_strb,
+	axi_master_w_user,
+	axi_master_w_last,
+	axi_master_w_ready,
+	axi_master_r_valid,
+	axi_master_r_data,
+	axi_master_r_resp,
+	axi_master_r_last,
+	axi_master_r_id,
+	axi_master_r_user,
+	axi_master_r_ready,
+	axi_master_b_valid,
+	axi_master_b_resp,
+	axi_master_b_id,
+	axi_master_b_user,
+	axi_master_b_ready
+);
+	//parameter NB_CORES = 4;
+	//parameter AXI_ADDR_WIDTH = 32;
+	//parameter AXI_DATA_WIDTH = 64;
+	//parameter AXI_USER_WIDTH = 6;
+	//parameter AXI_ID_WIDTH = 3;
+	input wire tck_i;
+	input wire tdi_i;
+	output reg tdo_o;
+	input wire trstn_i;
+	input wire shift_dr_i;
+	input wire pause_dr_i;
+	input wire update_dr_i;
+	input wire capture_dr_i;
+	input wire debug_select_i;
+	input wire axi_aclk;
+	input wire axi_aresetn;
+	output wire axi_master_aw_valid;
+	output wire [AXI_ADDR_WIDTH - 1:0] axi_master_aw_addr;
+	output wire [2:0] axi_master_aw_prot;
+	output wire [3:0] axi_master_aw_region;
+	output wire [7:0] axi_master_aw_len;
+	output wire [2:0] axi_master_aw_size;
+	output wire [1:0] axi_master_aw_burst;
+	output wire axi_master_aw_lock;
+	output wire [3:0] axi_master_aw_cache;
+	output wire [3:0] axi_master_aw_qos;
+	output wire [AXI_ID_WIDTH - 1:0] axi_master_aw_id;
+	output wire [AXI_USER_WIDTH - 1:0] axi_master_aw_user;
+	input wire axi_master_aw_ready;
+	output wire axi_master_ar_valid;
+	output wire [AXI_ADDR_WIDTH - 1:0] axi_master_ar_addr;
+	output wire [2:0] axi_master_ar_prot;
+	output wire [3:0] axi_master_ar_region;
+	output wire [7:0] axi_master_ar_len;
+	output wire [2:0] axi_master_ar_size;
+	output wire [1:0] axi_master_ar_burst;
+	output wire axi_master_ar_lock;
+	output wire [3:0] axi_master_ar_cache;
+	output wire [3:0] axi_master_ar_qos;
+	output wire [AXI_ID_WIDTH - 1:0] axi_master_ar_id;
+	output wire [AXI_USER_WIDTH - 1:0] axi_master_ar_user;
+	input wire axi_master_ar_ready;
+	output wire axi_master_w_valid;
+	output wire [AXI_DATA_WIDTH - 1:0] axi_master_w_data;
+	output wire [(AXI_DATA_WIDTH / 8) - 1:0] axi_master_w_strb;
+	output wire [AXI_USER_WIDTH - 1:0] axi_master_w_user;
+	output wire axi_master_w_last;
+	input wire axi_master_w_ready;
+	input wire axi_master_r_valid;
+	input wire [AXI_DATA_WIDTH - 1:0] axi_master_r_data;
+	input wire [1:0] axi_master_r_resp;
+	input wire axi_master_r_last;
+	input wire [AXI_ID_WIDTH - 1:0] axi_master_r_id;
+	input wire [AXI_USER_WIDTH - 1:0] axi_master_r_user;
+	output wire axi_master_r_ready;
+	input wire axi_master_b_valid;
+	input wire [1:0] axi_master_b_resp;
+	input wire [AXI_ID_WIDTH - 1:0] axi_master_b_id;
+	input wire [AXI_USER_WIDTH - 1:0] axi_master_b_user;
+	output wire axi_master_b_ready;
+	wire tdo_axi;
+	wire tdo_cpu;
+	reg [63:0] input_shift_reg;
+	reg [4:0] module_id_reg;
+	wire select_cmd;
+	wire [4:0] module_id_in;
+	reg [1:0] module_selects;
+	wire select_inhibit;
+	wire [1:0] module_inhibit;
+	integer j;
+	assign tdo_cpu = 1'b0;
+	assign select_cmd = input_shift_reg[63];
+	assign module_id_in = input_shift_reg[62:58];
+	always @(posedge tck_i or negedge trstn_i)
+		if (~trstn_i)
+			module_id_reg <= 5'h00;
+		else if (((debug_select_i && select_cmd) && update_dr_i) && !select_inhibit)
+			module_id_reg <= module_id_in;
+	always @(*)
+		if (module_id_reg == 0)
+			module_selects = 2'b01;
+		else
+			module_selects = 2'b10;
+	always @(posedge tck_i or negedge trstn_i)
+		if (~trstn_i)
+			input_shift_reg <= 'h0;
+		else if (debug_select_i && shift_dr_i)
+			input_shift_reg <= {tdi_i, input_shift_reg[63:1]};
+	adbg_axi_module #(
+		.AXI_ADDR_WIDTH(AXI_ADDR_WIDTH),
+		.AXI_DATA_WIDTH(AXI_DATA_WIDTH),
+		.AXI_USER_WIDTH(AXI_USER_WIDTH),
+		.AXI_ID_WIDTH(AXI_ID_WIDTH)
+	) i_dbg_axi(
+		.tck_i(tck_i),
+		.module_tdo_o(tdo_axi),
+		.tdi_i(tdi_i),
+		.capture_dr_i(capture_dr_i),
+		.shift_dr_i(shift_dr_i),
+		.update_dr_i(update_dr_i),
+		.data_register_i(input_shift_reg),
+		.module_select_i(module_selects[0]),
+		.top_inhibit_o(module_inhibit[0]),
+		.trstn_i(trstn_i),
+		.axi_aclk(axi_aclk),
+		.axi_aresetn(axi_aresetn),
+		.axi_master_aw_valid(axi_master_aw_valid),
+		.axi_master_aw_addr(axi_master_aw_addr),
+		.axi_master_aw_prot(axi_master_aw_prot),
+		.axi_master_aw_region(axi_master_aw_region),
+		.axi_master_aw_len(axi_master_aw_len),
+		.axi_master_aw_size(axi_master_aw_size),
+		.axi_master_aw_burst(axi_master_aw_burst),
+		.axi_master_aw_lock(axi_master_aw_lock),
+		.axi_master_aw_cache(axi_master_aw_cache),
+		.axi_master_aw_qos(axi_master_aw_qos),
+		.axi_master_aw_id(axi_master_aw_id),
+		.axi_master_aw_user(axi_master_aw_user),
+		.axi_master_aw_ready(axi_master_aw_ready),
+		.axi_master_ar_valid(axi_master_ar_valid),
+		.axi_master_ar_addr(axi_master_ar_addr),
+		.axi_master_ar_prot(axi_master_ar_prot),
+		.axi_master_ar_region(axi_master_ar_region),
+		.axi_master_ar_len(axi_master_ar_len),
+		.axi_master_ar_size(axi_master_ar_size),
+		.axi_master_ar_burst(axi_master_ar_burst),
+		.axi_master_ar_lock(axi_master_ar_lock),
+		.axi_master_ar_cache(axi_master_ar_cache),
+		.axi_master_ar_qos(axi_master_ar_qos),
+		.axi_master_ar_id(axi_master_ar_id),
+		.axi_master_ar_user(axi_master_ar_user),
+		.axi_master_ar_ready(axi_master_ar_ready),
+		.axi_master_w_valid(axi_master_w_valid),
+		.axi_master_w_data(axi_master_w_data),
+		.axi_master_w_strb(axi_master_w_strb),
+		.axi_master_w_user(axi_master_w_user),
+		.axi_master_w_last(axi_master_w_last),
+		.axi_master_w_ready(axi_master_w_ready),
+		.axi_master_r_valid(axi_master_r_valid),
+		.axi_master_r_data(axi_master_r_data),
+		.axi_master_r_resp(axi_master_r_resp),
+		.axi_master_r_last(axi_master_r_last),
+		.axi_master_r_id(axi_master_r_id),
+		.axi_master_r_user(axi_master_r_user),
+		.axi_master_r_ready(axi_master_r_ready),
+		.axi_master_b_valid(axi_master_b_valid),
+		.axi_master_b_resp(axi_master_b_resp),
+		.axi_master_b_id(axi_master_b_id),
+		.axi_master_b_user(axi_master_b_user),
+		.axi_master_b_ready(axi_master_b_ready)
+	);
+	assign select_inhibit = |module_inhibit;
+	always @(*)
+		if (module_id_reg == 0)
+			tdo_o = tdo_axi;
+		else if (module_id_reg == 1)
+			tdo_o = tdo_cpu;
+		else
+			tdo_o = 1'b0;
+endmodule
diff --git a/verilog/rtl/ips/adv_dbg_if/rtl/adbg_crc32.v b/verilog/rtl/ips/adv_dbg_if/rtl/adbg_crc32.v
new file mode 100644
index 0000000..6e04790
--- /dev/null
+++ b/verilog/rtl/ips/adv_dbg_if/rtl/adbg_crc32.v
@@ -0,0 +1,121 @@
+//////////////////////////////////////////////////////////////////////
+// File:  CRC32.v                             
+// Date:  Thu Nov 27 13:56:49 2003                                                      
+//                                                                     
+// Copyright (C) 1999-2003 Easics NV.                 
+// This source file may be used and distributed without restriction    
+// provided that this copyright statement is not removed from the file 
+// and that any derivative work contains the original copyright notice
+// and the associated disclaimer.
+//
+// THIS SOURCE FILE IS PROVIDED "AS IS" AND WITHOUT ANY EXPRESS
+// OR IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
+// WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
+//
+// Purpose: Verilog module containing a synthesizable CRC function
+//   * polynomial: (0 1 2 4 5 7 8 10 11 12 16 22 23 26 32)
+//   * data width: 1
+//                                                                     
+// Info: janz@easics.be (Jan Zegers)                           
+//       http://www.easics.com
+//
+// Modified by Nathan Yawn for the Advanced Debug Module
+// Changes (C) 2008 - 2010 Nathan Yawn                                 
+///////////////////////////////////////////////////////////////////////
+//
+// CVS Revision History
+//
+// $Log: adbg_crc32.v,v $
+// Revision 1.3  2011-10-24 02:25:11  natey
+// Removed extraneous '#1' delays, which were a holdover from the original
+// versions in the previous dbg_if core.
+//
+// Revision 1.2  2010-01-10 22:54:10  Nathan
+// Update copyright dates
+//
+// Revision 1.1  2008/07/22 20:28:29  Nathan
+// Changed names of all files and modules (prefixed an a, for advanced).  Cleanup, indenting.  No functional changes.
+//
+// Revision 1.3  2008/07/06 20:02:53  Nathan
+// Fixes for synthesis with Xilinx ISE (also synthesizable with 
+// Quartus II 7.0).  Ran through dos2unix.
+//
+// Revision 1.2  2008/06/20 19:22:10  Nathan
+// Reversed the direction of the CRC computation shift, for a more 
+// hardware-efficient implementation.
+//
+//
+//
+//
+
+
+module adbg_crc32 (clk, data, enable, shift, clr, rstn, crc_out, serial_out);
+
+input         clk;
+input         data;
+input         enable;
+input         shift;
+input         clr;
+input         rstn;
+output [31:0] crc_out;
+output        serial_out;
+
+
+reg    [31:0] crc;
+wire   [31:0] new_crc;
+
+
+// You may notice that the 'poly' in this implementation is backwards.
+// This is because the shift is also 'backwards', so that the data can
+// be shifted out in the same direction, which saves on logic + routing.
+assign new_crc[0] = crc[1];
+assign new_crc[1] = crc[2];
+assign new_crc[2] = crc[3];
+assign new_crc[3] = crc[4];
+assign new_crc[4] = crc[5];
+assign new_crc[5] = crc[6] ^ data ^ crc[0];
+assign new_crc[6] = crc[7];
+assign new_crc[7] = crc[8];
+assign new_crc[8] = crc[9] ^ data ^ crc[0];
+assign new_crc[9] = crc[10] ^ data ^ crc[0];
+assign new_crc[10] = crc[11];
+assign new_crc[11] = crc[12];
+assign new_crc[12] = crc[13];
+assign new_crc[13] = crc[14];
+assign new_crc[14] = crc[15];
+assign new_crc[15] = crc[16] ^ data ^ crc[0];
+assign new_crc[16] = crc[17];
+assign new_crc[17] = crc[18];
+assign new_crc[18] = crc[19];
+assign new_crc[19] = crc[20] ^ data ^ crc[0];
+assign new_crc[20] = crc[21] ^ data ^ crc[0];
+assign new_crc[21] = crc[22] ^ data ^ crc[0];
+assign new_crc[22] = crc[23];
+assign new_crc[23] = crc[24] ^ data ^ crc[0];
+assign new_crc[24] = crc[25] ^ data ^ crc[0];
+assign new_crc[25] = crc[26];
+assign new_crc[26] = crc[27] ^ data ^ crc[0];
+assign new_crc[27] = crc[28] ^ data ^ crc[0];
+assign new_crc[28] = crc[29];
+assign new_crc[29] = crc[30] ^ data ^ crc[0];
+assign new_crc[30] = crc[31] ^ data ^ crc[0];
+assign new_crc[31] =           data ^ crc[0];
+
+always @ (posedge clk or negedge rstn)
+begin
+  if(~rstn)
+    crc[31:0] <= 32'hffffffff;
+  else if(clr)
+    crc[31:0] <= 32'hffffffff;
+  else if(enable)
+    crc[31:0] <= new_crc;
+  else if (shift)
+    crc[31:0] <= {1'b0, crc[31:1]};
+end
+
+
+//assign crc_match = (crc == 32'h0);
+assign crc_out = crc; //[31];
+assign serial_out = crc[0];
+
+endmodule
diff --git a/verilog/rtl/ips/adv_dbg_if/rtl/adbg_defines.v b/verilog/rtl/ips/adv_dbg_if/rtl/adbg_defines.v
new file mode 100644
index 0000000..0644ea0
--- /dev/null
+++ b/verilog/rtl/ips/adv_dbg_if/rtl/adbg_defines.v
@@ -0,0 +1,75 @@
+//////////////////////////////////////////////////////////////////////
+////                                                              ////
+////  adbg_defines.v                                              ////
+////                                                              ////
+////                                                              ////
+////  This file is part of the Advanced Debug Interface.          ////
+////                                                              ////
+////  Author(s):                                                  ////
+////       Nathan Yawn (nathan.yawn@opencores.org)                ////
+////                                                              ////
+////                                                              ////
+////                                                              ////
+//////////////////////////////////////////////////////////////////////
+////                                                              ////
+//// Copyright (C) 2008 - 2010 Authors                            ////
+////                                                              ////
+//// This source file may be used and distributed without         ////
+//// restriction provided that this copyright statement is not    ////
+//// removed from the file and that any derivative work contains  ////
+//// the original copyright notice and the associated disclaimer. ////
+////                                                              ////
+//// This source file is free software; you can redistribute it   ////
+//// and/or modify it under the terms of the GNU Lesser General   ////
+//// Public License as published by the Free Software Foundation; ////
+//// either version 2.1 of the License, or (at your option) any   ////
+//// later version.                                               ////
+////                                                              ////
+//// This source is distributed in the hope that it will be       ////
+//// useful, but WITHOUT ANY WARRANTY; without even the implied   ////
+//// warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR      ////
+//// PURPOSE.  See the GNU Lesser General Public License for more ////
+//// details.                                                     ////
+////                                                              ////
+//// You should have received a copy of the GNU Lesser General    ////
+//// Public License along with this source; if not, download it   ////
+//// from http://www.opencores.org/lgpl.shtml                     ////
+////                                                              ////
+//////////////////////////////////////////////////////////////////////
+
+
+// Length of the MODULE ID register
+`define	DBG_TOP_MODULE_ID_LENGTH	2
+
+// How many modules can be supported by the module id length
+`define     DBG_TOP_MAX_MODULES           4
+
+// Chains
+`define DBG_TOP_WISHBONE_DEBUG_MODULE  2'h0
+`define DBG_TOP_CPU0_DEBUG_MODULE      2'h1
+`define DBG_TOP_CPU1_DEBUG_MODULE      2'h2
+`define DBG_TOP_JSP_DEBUG_MODULE       2'h3
+
+// Length of data
+`define DBG_TOP_MODULE_DATA_LEN  64
+
+
+// If WISHBONE sub-module is supported uncomment the following line
+`define DBG_WISHBONE_SUPPORTED
+
+// If CPU_0 sub-module is supported uncomment the following line
+`define DBG_CPU0_SUPPORTED
+
+// If CPU_1 sub-module is supported uncomment the following line
+//`define DBG_CPU1_SUPPORTED
+
+// To include the JTAG Serial Port (JSP), uncomment the following line
+`define DBG_JSP_SUPPORTED  
+
+// Define this if you intend to use the JSP in a system with multiple
+// devices on the JTAG chain
+`define ADBG_JSP_SUPPORT_MULTI
+
+// If this is defined, status bits will be skipped on burst
+// reads and writes to improve download speeds.
+`define ADBG_USE_HISPEED
diff --git a/verilog/rtl/ips/adv_dbg_if/rtl/adbg_lint_biu.v b/verilog/rtl/ips/adv_dbg_if/rtl/adbg_lint_biu.v
new file mode 100644
index 0000000..b778f70
--- /dev/null
+++ b/verilog/rtl/ips/adv_dbg_if/rtl/adbg_lint_biu.v
@@ -0,0 +1,324 @@
+module adbg_lint_biu 
+#(
+    parameter ADDR_WIDTH = 32,
+    parameter DATA_WIDTH = 64,
+    parameter AUX_WIDTH = 6
+)
+(
+	tck_i,
+	trstn_i,
+	data_i,
+	data_o,
+	addr_i,
+	strobe_i,
+	rd_wrn_i,
+	rdy_o,
+	err_o,
+	word_size_i,
+	clk_i,
+	rstn_i,
+	lint_req_o,
+	lint_add_o,
+	lint_wen_o,
+	lint_wdata_o,
+	lint_be_o,
+	lint_aux_o,
+	lint_gnt_i,
+	lint_r_aux_i,
+	lint_r_valid_i,
+	lint_r_rdata_i,
+	lint_r_opc_i
+);
+	//parameter ADDR_WIDTH = 32;
+	//parameter DATA_WIDTH = 64;
+	//parameter AUX_WIDTH = 6;
+	input wire tck_i;
+	input wire trstn_i;
+	input wire [63:0] data_i;
+	output reg [63:0] data_o;
+	input wire [31:0] addr_i;
+	input wire strobe_i;
+	input wire rd_wrn_i;
+	output reg rdy_o;
+	output wire err_o;
+	input wire [3:0] word_size_i;
+	input wire clk_i;
+	input wire rstn_i;
+	output reg lint_req_o;
+	output wire [ADDR_WIDTH - 1:0] lint_add_o;
+	output reg lint_wen_o;
+	output wire [DATA_WIDTH - 1:0] lint_wdata_o;
+	output wire [(DATA_WIDTH / 8) - 1:0] lint_be_o;
+	output wire [AUX_WIDTH - 1:0] lint_aux_o;
+	input wire lint_gnt_i;
+	input wire lint_r_aux_i;
+	input wire lint_r_valid_i;
+	input wire [DATA_WIDTH - 1:0] lint_r_rdata_i;
+	input wire lint_r_opc_i;
+	reg [(DATA_WIDTH / 8) - 1:0] sel_reg;
+	reg [ADDR_WIDTH - 1:0] addr_reg;
+	reg [DATA_WIDTH - 1:0] data_in_reg;
+	reg [DATA_WIDTH - 1:0] data_out_reg;
+	reg wr_reg;
+	reg str_sync;
+	reg rdy_sync;
+	reg err_reg;
+	reg rdy_sync_tff1;
+	reg rdy_sync_tff2;
+	reg rdy_sync_tff2q;
+	reg str_sync_wbff1;
+	reg str_sync_wbff2;
+	reg str_sync_wbff2q;
+	reg data_o_en;
+	reg rdy_sync_en;
+	reg err_en;
+	reg [(DATA_WIDTH / 8) - 1:0] be_dec;
+	wire start_toggle;
+	reg [DATA_WIDTH - 1:0] swapped_data_i;
+	reg [DATA_WIDTH - 1:0] swapped_data_out;
+	reg [1:0] lint_fsm_state;
+	reg [1:0] next_fsm_state;
+	generate
+		if (DATA_WIDTH == 64) begin : genblk1
+			always @(*)
+				case (word_size_i)
+					4'h1:
+						if (addr_i[2:0] == 3'b000)
+							be_dec = 8'b00000001;
+						else if (addr_i[2:0] == 3'b001)
+							be_dec = 8'b00000010;
+						else if (addr_i[2:0] == 3'b010)
+							be_dec = 8'b00000100;
+						else if (addr_i[2:0] == 3'b011)
+							be_dec = 8'b00001000;
+						else if (addr_i[2:0] == 3'b100)
+							be_dec = 8'b00010000;
+						else if (addr_i[2:0] == 3'b101)
+							be_dec = 8'b00100000;
+						else if (addr_i[2:0] == 3'b110)
+							be_dec = 8'b01000000;
+						else
+							be_dec = 8'b10000000;
+					4'h2:
+						if (addr_i[2:1] == 2'b00)
+							be_dec = 8'b00000011;
+						else if (addr_i[2:1] == 2'b01)
+							be_dec = 8'b00001100;
+						else if (addr_i[2:1] == 2'b10)
+							be_dec = 8'b00110000;
+						else
+							be_dec = 8'b11000000;
+					4'h4:
+						if (addr_i[2] == 1'b0)
+							be_dec = 8'b00001111;
+						else
+							be_dec = 8'b11110000;
+					4'h8: be_dec = 8'b11111111;
+					default: be_dec = 8'b11111111;
+				endcase
+		end
+		else if (DATA_WIDTH == 32) begin : genblk1
+			always @(*)
+				case (word_size_i)
+					4'h1:
+						if (addr_i[1:0] == 2'b00)
+							be_dec = 4'b0001;
+						else if (addr_i[1:0] == 2'b01)
+							be_dec = 4'b0010;
+						else if (addr_i[1:0] == 2'b10)
+							be_dec = 4'b0100;
+						else
+							be_dec = 4'b1000;
+					4'h2:
+						if (addr_i[1] == 1'b0)
+							be_dec = 4'b0011;
+						else
+							be_dec = 4'b1100;
+					4'h4: be_dec = 4'b1111;
+					4'h8: be_dec = 4'b1111;
+					default: be_dec = 4'b1111;
+				endcase
+		end
+		if (DATA_WIDTH == 64) begin : genblk2
+			always @(*)
+				case (be_dec)
+					8'b00001111: swapped_data_i = {32'h00000000, data_i[63:32]};
+					8'b11110000: swapped_data_i = {data_i[63:32], 32'h00000000};
+					8'b00000011: swapped_data_i = {48'h000000000000, data_i[63:48]};
+					8'b00001100: swapped_data_i = {32'h00000000, data_i[63:48], 16'h0000};
+					8'b00110000: swapped_data_i = {16'h0000, data_i[63:48], 32'h00000000};
+					8'b11000000: swapped_data_i = {data_i[63:48], 48'h000000000000};
+					8'b00000001: swapped_data_i = {56'h00000000000000, data_i[63:56]};
+					8'b00000010: swapped_data_i = {48'h000000000000, data_i[63:56], 8'h00};
+					8'b00000100: swapped_data_i = {40'h0000000000, data_i[63:56], 16'h0000};
+					8'b00001000: swapped_data_i = {32'h00000000, data_i[63:56], 24'h000000};
+					8'b00010000: swapped_data_i = {24'h000000, data_i[63:56], 32'h00000000};
+					8'b00100000: swapped_data_i = {16'h0000, data_i[63:56], 40'h0000000000};
+					8'b01000000: swapped_data_i = {8'h00, data_i[63:56], 48'h000000000000};
+					8'b10000000: swapped_data_i = {data_i[63:56], 56'h00000000000000};
+					default: swapped_data_i = data_i;
+				endcase
+		end
+		else if (DATA_WIDTH == 32) begin : genblk2
+			always @(*)
+				case (be_dec)
+					4'b1111: swapped_data_i = data_i[63:32];
+					4'b0011: swapped_data_i = {16'h0000, data_i[63:48]};
+					4'b1100: swapped_data_i = {data_i[63:48], 16'h0000};
+					4'b0001: swapped_data_i = {24'h000000, data_i[63:56]};
+					4'b0010: swapped_data_i = {16'h0000, data_i[63:56], 8'h00};
+					4'b0100: swapped_data_i = {8'h00, data_i[63:56], 16'h0000};
+					4'b1000: swapped_data_i = {data_i[63:56], 24'h000000};
+					default: swapped_data_i = data_i[63:32];
+				endcase
+		end
+		if (DATA_WIDTH == 64) begin : genblk3
+			always @(*)
+				case (sel_reg)
+					8'b00001111: swapped_data_out = lint_r_rdata_i;
+					8'b11110000: swapped_data_out = {32'h00000000, lint_r_rdata_i[63:32]};
+					8'b00000011: swapped_data_out = lint_r_rdata_i;
+					8'b00001100: swapped_data_out = {16'h0000, lint_r_rdata_i[63:16]};
+					8'b00110000: swapped_data_out = {32'h00000000, lint_r_rdata_i[63:32]};
+					8'b11000000: swapped_data_out = {48'h000000000000, lint_r_rdata_i[63:48]};
+					8'b00000001: swapped_data_out = lint_r_rdata_i;
+					8'b00000010: swapped_data_out = {8'h00, lint_r_rdata_i[63:8]};
+					8'b00000100: swapped_data_out = {16'h0000, lint_r_rdata_i[63:16]};
+					8'b00001000: swapped_data_out = {24'h000000, lint_r_rdata_i[63:24]};
+					8'b00010000: swapped_data_out = {32'h00000000, lint_r_rdata_i[63:32]};
+					8'b00100000: swapped_data_out = {40'h0000000000, lint_r_rdata_i[63:40]};
+					8'b01000000: swapped_data_out = {48'h000000000000, lint_r_rdata_i[63:48]};
+					8'b10000000: swapped_data_out = {56'h00000000000000, lint_r_rdata_i[63:56]};
+					default: swapped_data_out = lint_r_rdata_i;
+				endcase
+		end
+		else if (DATA_WIDTH == 32) begin : genblk3
+			always @(*)
+				case (sel_reg)
+					4'b1111: swapped_data_out = lint_r_rdata_i;
+					4'b0011: swapped_data_out = lint_r_rdata_i;
+					4'b1100: swapped_data_out = {16'h0000, lint_r_rdata_i[31:16]};
+					4'b0001: swapped_data_out = lint_r_rdata_i;
+					4'b0010: swapped_data_out = {8'h00, lint_r_rdata_i[31:8]};
+					4'b0100: swapped_data_out = {16'h0000, lint_r_rdata_i[31:16]};
+					4'b1000: swapped_data_out = {24'h000000, lint_r_rdata_i[31:24]};
+					default: swapped_data_out = lint_r_rdata_i;
+				endcase
+		end
+	endgenerate
+	always @(posedge tck_i or negedge trstn_i)
+		if (~trstn_i) begin
+			sel_reg <= 'h0;
+			addr_reg <= 'h0;
+			data_in_reg <= 'h0;
+			wr_reg <= 1'b0;
+		end
+		else if (strobe_i && rdy_o) begin
+			sel_reg <= be_dec;
+			addr_reg <= addr_i;
+			if (!rd_wrn_i)
+				data_in_reg <= swapped_data_i;
+			wr_reg <= ~rd_wrn_i;
+		end
+	always @(posedge tck_i or negedge trstn_i)
+		if (~trstn_i)
+			str_sync <= 1'b0;
+		else if (strobe_i && rdy_o)
+			str_sync <= ~str_sync;
+	always @(posedge tck_i or negedge trstn_i)
+		if (~trstn_i) begin
+			rdy_sync_tff1 <= 1'b0;
+			rdy_sync_tff2 <= 1'b0;
+			rdy_sync_tff2q <= 1'b0;
+		end
+		else begin
+			rdy_sync_tff1 <= rdy_sync;
+			rdy_sync_tff2 <= rdy_sync_tff1;
+			rdy_sync_tff2q <= rdy_sync_tff2;
+		end
+	always @(posedge tck_i or negedge trstn_i)
+		if (~trstn_i)
+			rdy_o <= 1'b1;
+		else if (strobe_i && rdy_o)
+			rdy_o <= 1'b0;
+		else if (rdy_sync_tff2 != rdy_sync_tff2q)
+			rdy_o <= 1'b1;
+	assign lint_add_o = addr_reg;
+	assign lint_wdata_o = data_in_reg;
+	assign lint_be_o = sel_reg;
+	always @(*)
+		if (DATA_WIDTH == 64)
+			data_o = data_out_reg;
+		else if (DATA_WIDTH == 32)
+			data_o = {32'h00000000, data_out_reg};
+	assign err_o = err_reg;
+	assign lint_aux_o = 'h0;
+	always @(posedge clk_i or negedge rstn_i)
+		if (!rstn_i) begin
+			str_sync_wbff1 <= 1'b0;
+			str_sync_wbff2 <= 1'b0;
+			str_sync_wbff2q <= 1'b0;
+		end
+		else begin
+			str_sync_wbff1 <= str_sync;
+			str_sync_wbff2 <= str_sync_wbff1;
+			str_sync_wbff2q <= str_sync_wbff2;
+		end
+	assign start_toggle = str_sync_wbff2 != str_sync_wbff2q;
+	always @(posedge clk_i or negedge rstn_i)
+		if (!rstn_i)
+			err_reg <= 1'b0;
+		else if (err_en)
+			err_reg <= 1'b0;
+	always @(posedge clk_i or negedge rstn_i)
+		if (!rstn_i)
+			data_out_reg <= 32'h00000000;
+		else if (data_o_en)
+			data_out_reg <= swapped_data_out;
+	always @(posedge clk_i or negedge rstn_i)
+		if (!rstn_i)
+			rdy_sync <= 1'b0;
+		else if (rdy_sync_en)
+			rdy_sync <= ~rdy_sync;
+	always @(posedge clk_i or negedge rstn_i)
+		if (~rstn_i)
+			lint_fsm_state <= 2'd0;
+		else
+			lint_fsm_state <= next_fsm_state;
+	always @(*) begin
+		lint_wen_o = 1'b1;
+		lint_req_o = 1'b0;
+		next_fsm_state = lint_fsm_state;
+		rdy_sync_en = 1'b0;
+		data_o_en = 1'b0;
+		err_en = 1'b0;
+		case (lint_fsm_state)
+			2'd0:
+				if (start_toggle)
+					next_fsm_state = 2'd1;
+				else
+					next_fsm_state = 2'd0;
+			2'd1: begin
+				lint_req_o = 1'b1;
+				if (wr_reg)
+					lint_wen_o = 1'b0;
+				if (lint_gnt_i)
+					if (wr_reg) begin
+						next_fsm_state = 2'd0;
+						rdy_sync_en = 1'b1;
+						err_en = 1'b1;
+					end
+					else
+						next_fsm_state = 2'd2;
+			end
+			2'd2:
+				if (lint_r_valid_i) begin
+					next_fsm_state = 2'd0;
+					rdy_sync_en = 1'b1;
+					err_en = 1'b1;
+					if (!wr_reg)
+						data_o_en = 1'b1;
+				end
+		endcase
+	end
+endmodule
diff --git a/verilog/rtl/ips/adv_dbg_if/rtl/adbg_lint_defines.v b/verilog/rtl/ips/adv_dbg_if/rtl/adbg_lint_defines.v
new file mode 100644
index 0000000..0eb9c4c
--- /dev/null
+++ b/verilog/rtl/ips/adv_dbg_if/rtl/adbg_lint_defines.v
@@ -0,0 +1,94 @@
+//////////////////////////////////////////////////////////////////////
+////                                                              ////
+////  adbg_wb_defines.v                                           ////
+////                                                              ////
+////                                                              ////
+////  This file is part of the SoC Advanced Debug Interface.      ////
+////                                                              ////
+////  Author(s):                                                  ////
+////       Nathan Yawn (nathan.yawn@opencores.org)                ////
+////                                                              ////
+////                                                              ////
+////                                                              ////
+//////////////////////////////////////////////////////////////////////
+////                                                              ////
+//// Copyright (C) 2008-2010        Authors                       ////
+////                                                              ////
+//// This source file may be used and distributed without         ////
+//// restriction provided that this copyright statement is not    ////
+//// removed from the file and that any derivative work contains  ////
+//// the original copyright notice and the associated disclaimer. ////
+////                                                              ////
+//// This source file is free software; you can redistribute it   ////
+//// and/or modify it under the terms of the GNU Lesser General   ////
+//// Public License as published by the Free Software Foundation; ////
+//// either version 2.1 of the License, or (at your option) any   ////
+//// later version.                                               ////
+////                                                              ////
+//// This source is distributed in the hope that it will be       ////
+//// useful, but WITHOUT ANY WARRANTY; without even the implied   ////
+//// warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR      ////
+//// PURPOSE.  See the GNU Lesser General Public License for more ////
+//// details.                                                     ////
+////                                                              ////
+//// You should have received a copy of the GNU Lesser General    ////
+//// Public License along with this source; if not, download it   ////
+//// from http://www.opencores.org/lgpl.shtml                     ////
+////                                                              ////
+//////////////////////////////////////////////////////////////////////
+//
+// CVS Revision History
+//
+// $Log: adbg_wb_defines.v,v $
+// Revision 1.4  2010-01-10 22:54:11  Nathan
+// Update copyright dates
+//
+// Revision 1.3  2009/05/17 20:54:57  Nathan
+// Changed email address to opencores.org
+//
+// Revision 1.2  2009/05/04 00:50:11  Nathan
+// Changed the AXI BIU to use big-endian byte ordering, to match the OR1000.  Kept little-endian ordering as a compile-time option in case this is ever used with a little-endian CPU.
+//
+// Revision 1.1  2008/07/22 20:28:32  Nathan
+// Changed names of all files and modules (prefixed an a, for advanced).  Cleanup, indenting.  No functional changes.
+//
+
+// Endian-ness of the Wishbone interface.
+// Default is BIG endian, to match the OR1200.
+// If using a LITTLE endian CPU, e.g. an x86, un-comment this line.
+//`define DBG_AXI_LITTLE_ENDIAN
+
+// These relate to the number of internal registers, and how
+// many bits are required in the Reg. Select register
+`define DBG_LINT_REGSELECT_SIZE 1
+`define DBG_LINT_NUM_INTREG 1
+
+// Register index definitions for module-internal registers
+// The LINT module has just 1, the error register
+`define DBG_LINT_INTREG_ERROR 1'b0
+
+// Valid commands/opcodes for the wishbone debug module
+// 0000  NOP
+// 0001  Write burst, 8-bit access
+// 0010  Write burst, 16-bit access
+// 0011  Write burst, 32-bit access
+// 0100  Write burst, 64-bit access
+// 0101  Read burst, 8-bit access
+// 0110  Read burst, 16-bit access
+// 0111  Read burst, 32-bit access
+// 1000  Read burst, 64-bit access
+// 1001  Internal register select/write
+// 1010 - 1100 Reserved
+// 1101  Internal register select
+// 1110 - 1111 Reserved
+
+`define DBG_LINT_CMD_BWRITE8  4'h1
+`define DBG_LINT_CMD_BWRITE16 4'h2
+`define DBG_LINT_CMD_BWRITE32 4'h3
+`define DBG_LINT_CMD_BWRITE64 4'h4
+`define DBG_LINT_CMD_BREAD8   4'h5
+`define DBG_LINT_CMD_BREAD16  4'h6
+`define DBG_LINT_CMD_BREAD32  4'h7
+`define DBG_LINT_CMD_BREAD64  4'h8
+`define DBG_LINT_CMD_IREG_WR  4'h9
+`define DBG_LINT_CMD_IREG_SEL 4'hd
diff --git a/verilog/rtl/ips/adv_dbg_if/rtl/adbg_lint_module.v b/verilog/rtl/ips/adv_dbg_if/rtl/adbg_lint_module.v
new file mode 100644
index 0000000..d9b3cdc
--- /dev/null
+++ b/verilog/rtl/ips/adv_dbg_if/rtl/adbg_lint_module.v
@@ -0,0 +1,528 @@
+module adbg_lint_module 
+#(
+    parameter ADDR_WIDTH = 32,
+    parameter DATA_WIDTH = 64,
+    parameter AUX_WIDTH = 6
+)
+(
+	tck_i,
+	module_tdo_o,
+	tdi_i,
+	capture_dr_i,
+	shift_dr_i,
+	update_dr_i,
+	data_register_i,
+	module_select_i,
+	top_inhibit_o,
+	trstn_i,
+	clk_i,
+	rstn_i,
+	lint_req_o,
+	lint_add_o,
+	lint_wen_o,
+	lint_wdata_o,
+	lint_be_o,
+	lint_aux_o,
+	lint_gnt_i,
+	lint_r_aux_i,
+	lint_r_valid_i,
+	lint_r_rdata_i,
+	lint_r_opc_i
+);
+	//parameter ADDR_WIDTH = 32;
+	//parameter DATA_WIDTH = 64;
+	//parameter AUX_WIDTH = 6;
+	input wire tck_i;
+	output reg module_tdo_o;
+	input wire tdi_i;
+	input wire capture_dr_i;
+	input wire shift_dr_i;
+	input wire update_dr_i;
+	input wire [63:0] data_register_i;
+	input wire module_select_i;
+	output reg top_inhibit_o;
+	input wire trstn_i;
+	input wire clk_i;
+	input wire rstn_i;
+	output wire lint_req_o;
+	output wire [ADDR_WIDTH - 1:0] lint_add_o;
+	output wire lint_wen_o;
+	output wire [DATA_WIDTH - 1:0] lint_wdata_o;
+	output wire [(DATA_WIDTH / 8) - 1:0] lint_be_o;
+	output wire [AUX_WIDTH - 1:0] lint_aux_o;
+	input wire lint_gnt_i;
+	input wire lint_r_aux_i;
+	input wire lint_r_valid_i;
+	input wire [DATA_WIDTH - 1:0] lint_r_rdata_i;
+	input wire lint_r_opc_i;
+	reg [31:0] address_counter;
+	reg [5:0] bit_count;
+	reg [15:0] word_count;
+	reg [3:0] operation;
+	reg [64:0] data_out_shift_reg;
+	reg [0:0] internal_register_select;
+	reg [32:0] internal_reg_error;
+	reg addr_sel;
+	reg addr_ct_en;
+	reg op_reg_en;
+	reg bit_ct_en;
+	reg bit_ct_rst;
+	reg word_ct_sel;
+	reg word_ct_en;
+	reg out_reg_ld_en;
+	reg out_reg_shift_en;
+	reg out_reg_data_sel;
+	reg [1:0] tdo_output_sel;
+	reg biu_strobe;
+	reg crc_clr;
+	reg crc_en;
+	reg crc_in_sel;
+	reg crc_shift_en;
+	reg regsel_ld_en;
+	reg intreg_ld_en;
+	reg error_reg_en;
+	reg biu_clr_err;
+	wire word_count_zero;
+	wire bit_count_max;
+	wire module_cmd;
+	wire biu_ready;
+	wire biu_err;
+	wire burst_read;
+	wire burst_write;
+	wire intreg_instruction;
+	wire intreg_write;
+	reg rd_op;
+	wire crc_match;
+	wire bit_count_32;
+	reg [5:0] word_size_bits;
+	reg [3:0] word_size_bytes;
+	wire [32:0] incremented_address;
+	wire [31:0] data_to_addr_counter;
+	wire [15:0] data_to_word_counter;
+	wire [15:0] decremented_word_count;
+	wire [31:0] address_data_in;
+	wire [15:0] count_data_in;
+	wire [3:0] operation_in;
+	wire [63:0] data_to_biu;
+	wire [63:0] data_from_biu;
+	wire [31:0] crc_data_out;
+	wire crc_data_in;
+	wire crc_serial_out;
+	wire [0:0] reg_select_data;
+	wire [64:0] out_reg_data;
+	reg [64:0] data_from_internal_reg;
+	wire biu_rst;
+	reg [3:0] module_state;
+	reg [3:0] module_next_state;
+	assign module_cmd = ~data_register_i[63];
+	assign operation_in = data_register_i[62:59];
+	assign address_data_in = data_register_i[58:27];
+	assign count_data_in = data_register_i[26:11];
+	assign data_to_biu = {tdi_i, data_register_i[63:1]};
+	assign reg_select_data = data_register_i[58:57];
+	assign intreg_instruction = (operation_in == 4'h9) | (operation_in == 4'hd);
+	assign intreg_write = operation_in == 4'h9;
+	assign burst_write = (((operation_in == 4'h1) | (operation_in == 4'h2)) | (operation_in == 4'h3)) | (operation_in == 4'h4);
+	assign burst_read = (((operation_in == 4'h5) | (operation_in == 4'h6)) | (operation_in == 4'h7)) | (operation_in == 4'h8);
+	always @(operation)
+		case (operation)
+			4'h1: begin
+				word_size_bits <= 6'd7;
+				word_size_bytes <= 4'd1;
+				rd_op <= 1'b0;
+			end
+			4'h2: begin
+				word_size_bits <= 6'd15;
+				word_size_bytes <= 4'd2;
+				rd_op <= 1'b0;
+			end
+			4'h3: begin
+				word_size_bits <= 6'd31;
+				word_size_bytes <= 4'd4;
+				rd_op <= 1'b0;
+			end
+			4'h4: begin
+				word_size_bits <= 6'd63;
+				word_size_bytes <= 4'd8;
+				rd_op <= 1'b0;
+			end
+			4'h5: begin
+				word_size_bits <= 6'd7;
+				word_size_bytes <= 4'd1;
+				rd_op <= 1'b1;
+			end
+			4'h6: begin
+				word_size_bits <= 6'd15;
+				word_size_bytes <= 4'd2;
+				rd_op <= 1'b1;
+			end
+			4'h7: begin
+				word_size_bits <= 6'd31;
+				word_size_bytes <= 4'd4;
+				rd_op <= 1'b1;
+			end
+			4'h8: begin
+				word_size_bits <= 6'd63;
+				word_size_bytes <= 4'd4;
+				rd_op <= 1'b1;
+			end
+			default: begin
+				word_size_bits <= 6'hxx;
+				word_size_bytes <= 4'hx;
+				rd_op <= 1'bx;
+			end
+		endcase
+	always @(posedge tck_i or negedge trstn_i)
+		if (~trstn_i)
+			internal_register_select = 1'h0;
+		else if (regsel_ld_en)
+			internal_register_select = reg_select_data;
+	always @(internal_register_select or internal_reg_error)
+		case (internal_register_select)
+			1'b0: data_from_internal_reg = internal_reg_error;
+			default: data_from_internal_reg = internal_reg_error;
+		endcase
+	always @(posedge tck_i or negedge trstn_i)
+		if (~trstn_i)
+			internal_reg_error = 33'h000000000;
+		else if (intreg_ld_en && (reg_select_data == 1'b0)) begin
+			if (data_register_i[46])
+				internal_reg_error[0] = 1'b0;
+		end
+		else if (error_reg_en && !internal_reg_error[0]) begin
+			if (biu_err || !biu_ready)
+				internal_reg_error[0] = 1'b1;
+			else if (biu_strobe)
+				internal_reg_error[32:1] = address_counter;
+		end
+		else if (biu_strobe && !internal_reg_error[0])
+			internal_reg_error[32:1] = address_counter;
+	assign data_to_addr_counter = (addr_sel ? incremented_address[31:0] : address_data_in);
+	assign incremented_address = address_counter + word_size_bytes;
+	always @(posedge tck_i or negedge trstn_i)
+		if (~trstn_i)
+			address_counter <= 32'h00000000;
+		else if (addr_ct_en)
+			address_counter <= data_to_addr_counter;
+	always @(posedge tck_i or negedge trstn_i)
+		if (~trstn_i)
+			operation <= 4'h0;
+		else if (op_reg_en)
+			operation <= operation_in;
+	always @(posedge tck_i or negedge trstn_i)
+		if (~trstn_i)
+			bit_count <= 6'h00;
+		else if (bit_ct_rst)
+			bit_count <= 6'h00;
+		else if (bit_ct_en)
+			bit_count <= bit_count + 6'h01;
+	assign bit_count_max = (bit_count == word_size_bits ? 1'b1 : 1'b0);
+	assign bit_count_32 = (bit_count == 6'h20 ? 1'b1 : 1'b0);
+	assign data_to_word_counter = (word_ct_sel ? decremented_word_count : count_data_in);
+	assign decremented_word_count = word_count - 16'h0001;
+	always @(posedge tck_i or negedge trstn_i)
+		if (~trstn_i)
+			word_count <= 16'h0000;
+		else if (word_ct_en)
+			word_count <= data_to_word_counter;
+	assign word_count_zero = word_count == 16'h0000;
+	assign out_reg_data = (out_reg_data_sel ? data_from_internal_reg : {1'b0, data_from_biu});
+	always @(posedge tck_i or negedge trstn_i)
+		if (~trstn_i)
+			data_out_shift_reg <= 'h0;
+		else if (out_reg_ld_en)
+			data_out_shift_reg <= out_reg_data;
+		else if (out_reg_shift_en)
+			data_out_shift_reg <= {1'b0, data_out_shift_reg[64:1]};
+	always @(tdo_output_sel or data_out_shift_reg[0] or biu_ready or crc_match or crc_serial_out)
+		if (tdo_output_sel == 2'h0)
+			module_tdo_o <= biu_ready;
+		else if (tdo_output_sel == 2'h1)
+			module_tdo_o <= data_out_shift_reg[0];
+		else if (tdo_output_sel == 2'h2)
+			module_tdo_o <= crc_match;
+		else
+			module_tdo_o <= crc_serial_out;
+	adbg_lint_biu #(
+		.ADDR_WIDTH(ADDR_WIDTH),
+		.DATA_WIDTH(DATA_WIDTH),
+		.AUX_WIDTH(AUX_WIDTH)
+	) lint_biu_i(
+		.tck_i(tck_i),
+		.trstn_i(trstn_i),
+		.data_i(data_to_biu),
+		.data_o(data_from_biu),
+		.addr_i(address_counter),
+		.strobe_i(biu_strobe),
+		.rd_wrn_i(rd_op),
+		.rdy_o(biu_ready),
+		.err_o(biu_err),
+		.word_size_i(word_size_bytes),
+		.clk_i(clk_i),
+		.rstn_i(rstn_i),
+		.lint_req_o(lint_req_o),
+		.lint_add_o(lint_add_o),
+		.lint_wen_o(lint_wen_o),
+		.lint_wdata_o(lint_wdata_o),
+		.lint_be_o(lint_be_o),
+		.lint_aux_o(lint_aux_o),
+		.lint_gnt_i(lint_gnt_i),
+		.lint_r_aux_i(lint_r_aux_i),
+		.lint_r_valid_i(lint_r_valid_i),
+		.lint_r_rdata_i(lint_r_rdata_i),
+		.lint_r_opc_i(lint_r_opc_i)
+	);
+	assign crc_data_in = (crc_in_sel ? tdi_i : data_out_shift_reg[0]);
+	adbg_crc32 lint_crc_i(
+		.clk(tck_i),
+		.data(crc_data_in),
+		.enable(crc_en),
+		.shift(crc_shift_en),
+		.clr(crc_clr),
+		.rstn(trstn_i),
+		.crc_out(crc_data_out),
+		.serial_out(crc_serial_out)
+	);
+	assign crc_match = (data_register_i[63:32] == crc_data_out ? 1'b1 : 1'b0);
+	always @(posedge tck_i or negedge trstn_i)
+		if (~trstn_i)
+			module_state <= 4'd0;
+		else
+			module_state <= module_next_state;
+	always @(module_state or module_select_i or module_cmd or update_dr_i or capture_dr_i or operation_in[2] or word_count_zero or bit_count_max or data_register_i[63] or bit_count_32 or biu_ready or burst_read or burst_write)
+		case (module_state)
+			4'd0:
+				if (((module_cmd && module_select_i) && update_dr_i) && burst_read)
+					module_next_state <= 4'd1;
+				else if (((module_cmd && module_select_i) && update_dr_i) && burst_write)
+					module_next_state <= 4'd5;
+				else
+					module_next_state <= 4'd0;
+			4'd1:
+				if (word_count_zero)
+					module_next_state <= 4'd0;
+				else
+					module_next_state <= 4'd2;
+			4'd2:
+				if (module_select_i && capture_dr_i)
+					module_next_state <= 4'd3;
+				else
+					module_next_state <= 4'd2;
+			4'd3:
+				if (update_dr_i)
+					module_next_state <= 4'd0;
+				else if (biu_ready)
+					module_next_state <= 4'd4;
+				else
+					module_next_state <= 4'd3;
+			4'd4:
+				if (update_dr_i)
+					module_next_state <= 4'd0;
+				else if (bit_count_max && word_count_zero)
+					module_next_state <= 4'd9;
+				else
+					module_next_state <= 4'd4;
+			4'd9:
+				if (update_dr_i)
+					module_next_state <= 4'd0;
+				else
+					module_next_state <= 4'd9;
+			4'd5:
+				if (word_count_zero)
+					module_next_state <= 4'd0;
+				else if (module_select_i && capture_dr_i)
+					module_next_state <= 4'd6;
+				else
+					module_next_state <= 4'd5;
+			4'd6:
+				if (update_dr_i)
+					module_next_state <= 4'd0;
+				else if (module_select_i && data_register_i[63])
+					module_next_state <= 4'd7;
+				else
+					module_next_state <= 4'd6;
+			4'd7:
+				if (update_dr_i)
+					module_next_state <= 4'd0;
+				else if (bit_count_max) begin
+					if (word_count_zero)
+						module_next_state <= 4'd10;
+					else
+						module_next_state <= 4'd7;
+				end
+				else
+					module_next_state <= 4'd7;
+			4'd8:
+				if (update_dr_i)
+					module_next_state <= 4'd0;
+				else if (word_count_zero)
+					module_next_state <= 4'd10;
+				else
+					module_next_state <= 4'd7;
+			4'd10:
+				if (update_dr_i)
+					module_next_state <= 4'd0;
+				else if (bit_count_32)
+					module_next_state <= 4'd11;
+				else
+					module_next_state <= 4'd10;
+			4'd11:
+				if (update_dr_i)
+					module_next_state <= 4'd0;
+				else
+					module_next_state <= 4'd11;
+			default: module_next_state <= 4'd0;
+		endcase
+	always @(module_state or module_next_state or module_select_i or update_dr_i or capture_dr_i or shift_dr_i or operation_in[2] or word_count_zero or bit_count_max or data_register_i[52] or biu_ready or intreg_instruction or module_cmd or intreg_write or decremented_word_count) begin
+		addr_sel <= 1'b1;
+		addr_ct_en <= 1'b0;
+		op_reg_en <= 1'b0;
+		bit_ct_en <= 1'b0;
+		bit_ct_rst <= 1'b0;
+		word_ct_sel <= 1'b1;
+		word_ct_en <= 1'b0;
+		out_reg_ld_en <= 1'b0;
+		out_reg_shift_en <= 1'b0;
+		tdo_output_sel <= 2'b01;
+		biu_strobe <= 1'b0;
+		crc_clr <= 1'b0;
+		crc_en <= 1'b0;
+		crc_in_sel <= 1'b0;
+		crc_shift_en <= 1'b0;
+		out_reg_data_sel <= 1'b1;
+		regsel_ld_en <= 1'b0;
+		intreg_ld_en <= 1'b0;
+		error_reg_en <= 1'b0;
+		biu_clr_err <= 1'b0;
+		top_inhibit_o <= 1'b0;
+		case (module_state)
+			4'd0: begin
+				addr_sel <= 1'b0;
+				word_ct_sel <= 1'b0;
+				if (module_select_i & shift_dr_i)
+					out_reg_shift_en <= 1'b1;
+				if (module_select_i & capture_dr_i) begin
+					out_reg_data_sel <= 1'b1;
+					out_reg_ld_en <= 1'b1;
+				end
+				if ((module_select_i & module_cmd) & update_dr_i) begin
+					if (intreg_instruction)
+						regsel_ld_en <= 1'b1;
+					if (intreg_write)
+						intreg_ld_en <= 1'b1;
+				end
+				if (module_next_state != 4'd0) begin
+					addr_ct_en <= 1'b1;
+					op_reg_en <= 1'b1;
+					bit_ct_rst <= 1'b1;
+					word_ct_en <= 1'b1;
+					crc_clr <= 1'b1;
+				end
+			end
+			4'd1:
+				if (!word_count_zero) begin
+					biu_strobe <= 1'b1;
+					addr_sel <= 1'b1;
+					addr_ct_en <= 1'b1;
+				end
+			4'd2:
+				;
+			4'd3: begin
+				tdo_output_sel <= 2'h0;
+				top_inhibit_o <= 1'b1;
+				if (module_next_state == 4'd4) begin
+					error_reg_en <= 1'b1;
+					out_reg_data_sel <= 1'b0;
+					out_reg_ld_en <= 1'b1;
+					bit_ct_rst <= 1'b1;
+					word_ct_sel <= 1'b1;
+					word_ct_en <= 1'b1;
+					if ((decremented_word_count != 0) && !word_count_zero) begin
+						biu_strobe <= 1'b1;
+						addr_sel <= 1'b1;
+						addr_ct_en <= 1'b1;
+					end
+				end
+			end
+			4'd4: begin
+				tdo_output_sel <= 2'h1;
+				out_reg_shift_en <= 1'b1;
+				bit_ct_en <= 1'b1;
+				crc_en <= 1'b1;
+				crc_in_sel <= 1'b0;
+				top_inhibit_o <= 1'b1;
+				if (bit_count_max) begin
+					error_reg_en <= 1'b1;
+					out_reg_data_sel <= 1'b0;
+					out_reg_ld_en <= 1'b1;
+					bit_ct_rst <= 1'b1;
+					word_ct_sel <= 1'b1;
+					word_ct_en <= 1'b1;
+					if ((decremented_word_count != 0) && !word_count_zero) begin
+						biu_strobe <= 1'b1;
+						addr_sel <= 1'b1;
+						addr_ct_en <= 1'b1;
+					end
+				end
+			end
+			4'd9: begin
+				tdo_output_sel <= 2'h3;
+				crc_shift_en <= 1'b1;
+				top_inhibit_o <= 1'b1;
+			end
+			4'd5:
+				;
+			4'd6: begin
+				tdo_output_sel <= 2'h1;
+				top_inhibit_o <= 1'b1;
+				if (module_next_state == 4'd7) begin
+					biu_clr_err <= 1'b1;
+					bit_ct_en <= 1'b1;
+					word_ct_sel <= 1'b1;
+					word_ct_en <= 1'b1;
+					crc_en <= 1'b1;
+					crc_in_sel <= 1'b1;
+				end
+			end
+			4'd7: begin
+				bit_ct_en <= 1'b1;
+				tdo_output_sel <= 2'h1;
+				crc_en <= 1'b1;
+				crc_in_sel <= 1'b1;
+				top_inhibit_o <= 1'b1;
+				if (bit_count_max) begin
+					error_reg_en <= 1'b1;
+					bit_ct_rst <= 1'b1;
+					biu_strobe <= 1'b1;
+					addr_ct_en <= 1'b1;
+					word_ct_sel <= 1'b1;
+					word_ct_en <= 1'b1;
+				end
+			end
+			4'd8: begin
+				tdo_output_sel <= 2'h0;
+				error_reg_en <= 1'b1;
+				biu_strobe <= 1'b1;
+				word_ct_sel <= 1'b1;
+				word_ct_en <= 1'b1;
+				bit_ct_rst <= 1'b1;
+				addr_ct_en <= 1'b1;
+				top_inhibit_o <= 1'b1;
+			end
+			4'd10: begin
+				bit_ct_en <= 1'b1;
+				top_inhibit_o <= 1'b1;
+				if (module_next_state == 4'd11)
+					tdo_output_sel <= 2'h2;
+			end
+			4'd11: begin
+				tdo_output_sel <= 2'h2;
+				top_inhibit_o <= 1'b1;
+				if (module_next_state == 4'd0)
+					error_reg_en <= 1'b1;
+			end
+			default:
+				;
+		endcase
+	end
+endmodule
diff --git a/verilog/rtl/ips/adv_dbg_if/rtl/adbg_lintonly_top.v b/verilog/rtl/ips/adv_dbg_if/rtl/adbg_lintonly_top.v
new file mode 100644
index 0000000..13fb29c
--- /dev/null
+++ b/verilog/rtl/ips/adv_dbg_if/rtl/adbg_lintonly_top.v
@@ -0,0 +1,120 @@
+module adbg_lintonly_top 
+#(
+    parameter ADDR_WIDTH = 32,
+    parameter DATA_WIDTH = 64,
+    parameter AUX_WIDTH = 6
+)
+(
+	tck_i,
+	tdi_i,
+	tdo_o,
+	trstn_i,
+	shift_dr_i,
+	pause_dr_i,
+	update_dr_i,
+	capture_dr_i,
+	debug_select_i,
+	clk_i,
+	rstn_i,
+	lint_req_o,
+	lint_add_o,
+	lint_wen_o,
+	lint_wdata_o,
+	lint_be_o,
+	lint_aux_o,
+	lint_gnt_i,
+	lint_r_aux_i,
+	lint_r_valid_i,
+	lint_r_rdata_i,
+	lint_r_opc_i
+);
+	//parameter ADDR_WIDTH = 32;
+	//parameter DATA_WIDTH = 64;
+	//parameter AUX_WIDTH = 6;
+	input wire tck_i;
+	input wire tdi_i;
+	output reg tdo_o;
+	input wire trstn_i;
+	input wire shift_dr_i;
+	input wire pause_dr_i;
+	input wire update_dr_i;
+	input wire capture_dr_i;
+	input wire debug_select_i;
+	input wire clk_i;
+	input wire rstn_i;
+	output wire lint_req_o;
+	output wire [ADDR_WIDTH - 1:0] lint_add_o;
+	output wire lint_wen_o;
+	output wire [DATA_WIDTH - 1:0] lint_wdata_o;
+	output wire [(DATA_WIDTH / 8) - 1:0] lint_be_o;
+	output wire [AUX_WIDTH - 1:0] lint_aux_o;
+	input wire lint_gnt_i;
+	input wire lint_r_aux_i;
+	input wire lint_r_valid_i;
+	input wire [DATA_WIDTH - 1:0] lint_r_rdata_i;
+	input wire lint_r_opc_i;
+	wire tdo_axi;
+	wire tdo_cpu;
+	reg [63:0] input_shift_reg;
+	reg [4:0] module_id_reg;
+	wire select_cmd;
+	wire [4:0] module_id_in;
+	reg [1:0] module_selects;
+	wire select_inhibit;
+	wire [1:0] module_inhibit;
+	integer j;
+	assign select_cmd = input_shift_reg[63];
+	assign module_id_in = input_shift_reg[62:58];
+	always @(posedge tck_i or negedge trstn_i)
+		if (~trstn_i)
+			module_id_reg <= 5'h00;
+		else if (((debug_select_i && select_cmd) && update_dr_i) && !select_inhibit)
+			module_id_reg <= module_id_in;
+	always @(*)
+		if (module_id_reg == 0)
+			module_selects = 2'b01;
+		else
+			module_selects = 2'b10;
+	always @(posedge tck_i or negedge trstn_i)
+		if (~trstn_i)
+			input_shift_reg <= 'h0;
+		else if (debug_select_i && shift_dr_i)
+			input_shift_reg <= {tdi_i, input_shift_reg[63:1]};
+	adbg_lint_module #(
+		.ADDR_WIDTH(ADDR_WIDTH),
+		.DATA_WIDTH(DATA_WIDTH),
+		.AUX_WIDTH(AUX_WIDTH)
+	) i_dbg_lint(
+		.tck_i(tck_i),
+		.module_tdo_o(tdo_axi),
+		.tdi_i(tdi_i),
+		.capture_dr_i(capture_dr_i),
+		.shift_dr_i(shift_dr_i),
+		.update_dr_i(update_dr_i),
+		.data_register_i(input_shift_reg),
+		.module_select_i(module_selects[0]),
+		.top_inhibit_o(module_inhibit[0]),
+		.trstn_i(trstn_i),
+		.clk_i(clk_i),
+		.rstn_i(rstn_i),
+		.lint_req_o(lint_req_o),
+		.lint_add_o(lint_add_o),
+		.lint_wen_o(lint_wen_o),
+		.lint_wdata_o(lint_wdata_o),
+		.lint_be_o(lint_be_o),
+		.lint_aux_o(lint_aux_o),
+		.lint_gnt_i(lint_gnt_i),
+		.lint_r_aux_i(lint_r_aux_i),
+		.lint_r_valid_i(lint_r_valid_i),
+		.lint_r_rdata_i(lint_r_rdata_i),
+		.lint_r_opc_i(lint_r_opc_i)
+	);
+	assign select_inhibit = |module_inhibit;
+	always @(module_id_reg or tdo_axi or tdo_cpu)
+		if (module_id_reg == 0)
+			tdo_o <= tdo_axi;
+		else if (module_id_reg == 1)
+			tdo_o <= tdo_cpu;
+		else
+			tdo_o <= 1'b0;
+endmodule
diff --git a/verilog/rtl/ips/adv_dbg_if/rtl/adbg_or1k_biu.v b/verilog/rtl/ips/adv_dbg_if/rtl/adbg_or1k_biu.v
new file mode 100644
index 0000000..3547656
--- /dev/null
+++ b/verilog/rtl/ips/adv_dbg_if/rtl/adbg_or1k_biu.v
@@ -0,0 +1,188 @@
+module adbg_or1k_biu 
+#( 
+		parameter NB_CORES = 4
+    )
+(
+	tck_i,
+	trstn_i,
+	cpu_select_i,
+	data_i,
+	data_o,
+	addr_i,
+	strobe_i,
+	rd_wrn_i,
+	rdy_o,
+	cpu_clk_i,
+	cpu_rstn_i,
+	cpu_addr_o,
+	cpu_data_i,
+	cpu_data_o,
+	cpu_stb_o,
+	cpu_we_o,
+	cpu_ack_i
+);
+	//parameter NB_CORES = 4;
+	input wire tck_i;
+	input wire trstn_i;
+	input wire [3:0] cpu_select_i;
+	input wire [31:0] data_i;
+	output wire [31:0] data_o;
+	input wire [31:0] addr_i;
+	input wire strobe_i;
+	input wire rd_wrn_i;
+	output reg rdy_o;
+	input wire cpu_clk_i;
+	input wire cpu_rstn_i;
+	output reg [(NB_CORES * 16) - 1:0] cpu_addr_o;
+	input wire [(NB_CORES * 32) - 1:0] cpu_data_i;
+	output reg [(NB_CORES * 32) - 1:0] cpu_data_o;
+	output reg [NB_CORES - 1:0] cpu_stb_o;
+	output reg [NB_CORES - 1:0] cpu_we_o;
+	input wire [NB_CORES - 1:0] cpu_ack_i;
+	reg [31:0] cpu_data_int;
+	reg cpu_ack_int;
+	reg cpu_stb_int;
+	reg [31:0] addr_reg;
+	reg [31:0] data_in_reg;
+	reg [31:0] data_out_reg;
+	reg wr_reg;
+	reg str_sync;
+	reg rdy_sync;
+	reg rdy_sync_tff1;
+	reg rdy_sync_tff2;
+	reg rdy_sync_tff2q;
+	reg str_sync_wbff1;
+	reg str_sync_wbff2;
+	reg str_sync_wbff2q;
+	reg data_o_en;
+	reg rdy_sync_en;
+	wire start_toggle;
+	wire valid_selection;
+	assign valid_selection = (cpu_select_i < NB_CORES ? 1'b1 : 1'b0);
+	always @(posedge tck_i or negedge trstn_i)
+		if (~trstn_i) begin
+			addr_reg <= 32'h00000000;
+			data_in_reg <= 32'h00000000;
+			wr_reg <= 1'b0;
+		end
+		else if (strobe_i && rdy_o) begin
+			addr_reg <= addr_i;
+			if (!rd_wrn_i)
+				data_in_reg <= data_i;
+			wr_reg <= ~rd_wrn_i;
+		end
+	always @(posedge tck_i or negedge trstn_i)
+		if (~trstn_i)
+			str_sync <= 1'b0;
+		else if (strobe_i && rdy_o)
+			str_sync <= ~str_sync;
+	always @(posedge tck_i or negedge trstn_i)
+		if (~trstn_i) begin
+			rdy_sync_tff1 <= 1'b0;
+			rdy_sync_tff2 <= 1'b0;
+			rdy_sync_tff2q <= 1'b0;
+			rdy_o <= 1'b1;
+		end
+		else begin
+			rdy_sync_tff1 <= rdy_sync;
+			rdy_sync_tff2 <= rdy_sync_tff1;
+			rdy_sync_tff2q <= rdy_sync_tff2;
+			if (strobe_i && rdy_o)
+				rdy_o <= 1'b0;
+			else if (rdy_sync_tff2 != rdy_sync_tff2q)
+				rdy_o <= 1'b1;
+		end
+	assign data_o = data_out_reg;
+	always @(*) begin : sv2v_autoblock_1
+		reg signed [31:0] i;
+		for (i = 0; i < NB_CORES; i = i + 1)
+			if (cpu_select_i == i) begin
+				cpu_data_o[i * 32+:32] = data_in_reg;
+				cpu_we_o[i] = wr_reg;
+				cpu_addr_o[i * 16+:16] = addr_reg;
+				cpu_stb_o[i] = cpu_stb_int;
+			end
+			else begin
+				cpu_data_o[i * 32+:32] = 'h0;
+				cpu_we_o[i] = 1'b0;
+				cpu_addr_o[i * 16+:16] = 'h0;
+				cpu_stb_o[i] = 1'b0;
+			end
+	end
+	always @(*) begin
+		cpu_data_int = 'h0;
+		cpu_ack_int = 1'b0;
+		begin : sv2v_autoblock_2
+			reg signed [31:0] i;
+			for (i = 0; i < NB_CORES; i = i + 1)
+				if (cpu_select_i == i) begin
+					cpu_data_int = cpu_data_i[i * 32+:32];
+					cpu_ack_int = cpu_ack_i[i];
+				end
+		end
+	end
+	always @(posedge cpu_clk_i or negedge cpu_rstn_i)
+		if (~cpu_rstn_i) begin
+			str_sync_wbff1 <= 1'b0;
+			str_sync_wbff2 <= 1'b0;
+			str_sync_wbff2q <= 1'b0;
+		end
+		else begin
+			str_sync_wbff1 <= str_sync;
+			str_sync_wbff2 <= str_sync_wbff1;
+			str_sync_wbff2q <= str_sync_wbff2;
+		end
+	assign start_toggle = str_sync_wbff2 != str_sync_wbff2q;
+	always @(posedge cpu_clk_i or negedge cpu_rstn_i)
+		if (~cpu_rstn_i)
+			data_out_reg <= 32'h00000000;
+		else if (data_o_en)
+			data_out_reg <= cpu_data_int;
+	always @(posedge cpu_clk_i or negedge cpu_rstn_i)
+		if (~cpu_rstn_i)
+			rdy_sync <= 1'b0;
+		else if (rdy_sync_en)
+			rdy_sync <= ~rdy_sync;
+	reg cpu_fsm_state;
+	reg next_fsm_state;
+	always @(posedge cpu_clk_i or negedge cpu_rstn_i)
+		if (~cpu_rstn_i)
+			cpu_fsm_state <= 1'h0;
+		else
+			cpu_fsm_state <= next_fsm_state;
+	always @(cpu_fsm_state or start_toggle or cpu_ack_int)
+		case (cpu_fsm_state)
+			1'h0:
+				if (start_toggle && !cpu_ack_int)
+					next_fsm_state <= 1'h1;
+				else
+					next_fsm_state <= 1'h0;
+			1'h1:
+				if (cpu_ack_int)
+					next_fsm_state <= 1'h0;
+				else
+					next_fsm_state <= 1'h1;
+		endcase
+	always @(cpu_fsm_state or start_toggle or cpu_ack_int or wr_reg) begin
+		rdy_sync_en = 1'b0;
+		data_o_en = 1'b0;
+		cpu_stb_int = 1'b0;
+		case (cpu_fsm_state)
+			1'h0:
+				if (start_toggle) begin
+					cpu_stb_int = 1'b1;
+					if (cpu_ack_int)
+						rdy_sync_en = 1'b1;
+					if (cpu_ack_int && !wr_reg)
+						data_o_en = 1'b1;
+				end
+			1'h1: begin
+				cpu_stb_int = 1'b1;
+				if (cpu_ack_int) begin
+					data_o_en = 1'b1;
+					rdy_sync_en = 1'b1;
+				end
+			end
+		endcase
+	end
+endmodule
diff --git a/verilog/rtl/ips/adv_dbg_if/rtl/adbg_or1k_defines.v b/verilog/rtl/ips/adv_dbg_if/rtl/adbg_or1k_defines.v
new file mode 100644
index 0000000..d38fd08
--- /dev/null
+++ b/verilog/rtl/ips/adv_dbg_if/rtl/adbg_or1k_defines.v
@@ -0,0 +1,83 @@
+//////////////////////////////////////////////////////////////////////
+////                                                              ////
+////  adbg_or1k_defines.v                                         ////
+////                                                              ////
+////                                                              ////
+////  This file is part of the SoC Advanced Debug Interface.      ////
+////                                                              ////
+////  Author(s):                                                  ////
+////       Nathan Yawn (nathan.yawn@opencores.org)                ////
+////                                                              ////
+////                                                              ////
+////                                                              ////
+//////////////////////////////////////////////////////////////////////
+////                                                              ////
+//// Copyright (C) 2008 - 2010       Authors                      ////
+////                                                              ////
+//// This source file may be used and distributed without         ////
+//// restriction provided that this copyright statement is not    ////
+//// removed from the file and that any derivative work contains  ////
+//// the original copyright notice and the associated disclaimer. ////
+////                                                              ////
+//// This source file is free software; you can redistribute it   ////
+//// and/or modify it under the terms of the GNU Lesser General   ////
+//// Public License as published by the Free Software Foundation; ////
+//// either version 2.1 of the License, or (at your option) any   ////
+//// later version.                                               ////
+////                                                              ////
+//// This source is distributed in the hope that it will be       ////
+//// useful, but WITHOUT ANY WARRANTY; without even the implied   ////
+//// warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR      ////
+//// PURPOSE.  See the GNU Lesser General Public License for more ////
+//// details.                                                     ////
+////                                                              ////
+//// You should have received a copy of the GNU Lesser General    ////
+//// Public License along with this source; if not, download it   ////
+//// from http://www.opencores.org/lgpl.shtml                     ////
+////                                                              ////
+//////////////////////////////////////////////////////////////////////
+//
+// CVS Revision History
+//
+// $Log: adbg_or1k_defines.v,v $
+// Revision 1.3  2010-01-10 22:54:10  Nathan
+// Update copyright dates
+//
+// Revision 1.2  2009/05/17 20:54:56  Nathan
+// Changed email address to opencores.org
+//
+// Revision 1.1  2008/07/22 20:28:31  Nathan
+// Changed names of all files and modules (prefixed an a, for advanced).  Cleanup, indenting.  No functional changes.
+//
+// Revision 1.3  2008/07/06 20:02:54  Nathan
+// Fixes for synthesis with Xilinx ISE (also synthesizable with 
+// Quartus II 7.0).  Ran through dos2unix.
+//
+// Revision 1.2  2008/06/26 20:52:31  Nathan
+// OR1K module tested and working.  Added copyright / license info 
+// to _define files.  Other cleanup.
+//
+
+
+
+// Register index definitions for module-internal registers
+// Index 0 is the Status register, used for stall and reset
+`define DBG_OR1K_INTREG_STATUS 3'b000
+
+// Valid commands/opcodes for the or1k debug module
+// 0000  NOP
+// 0001 - 0010 Reserved
+// 0011  Write burst, 32-bit access
+// 0100 - 0110  Reserved
+// 0111  Read burst, 32-bit access
+// 1000  Reserved
+// 1001  Internal register select/write
+// 1010 - 1100 Reserved
+// 1101  Internal register select
+// 1110 - 1111 Reserved
+
+
+`define DBG_OR1K_CMD_BWRITE32 4'h3
+`define DBG_OR1K_CMD_BREAD32  4'h7
+`define DBG_OR1K_CMD_IREG_WR  4'h9
+`define DBG_OR1K_CMD_IREG_SEL 4'hd
diff --git a/verilog/rtl/ips/adv_dbg_if/rtl/adbg_or1k_module.v b/verilog/rtl/ips/adv_dbg_if/rtl/adbg_or1k_module.v
new file mode 100644
index 0000000..4e6a5dd
--- /dev/null
+++ b/verilog/rtl/ips/adv_dbg_if/rtl/adbg_or1k_module.v
@@ -0,0 +1,460 @@
+module adbg_or1k_module 
+#(
+		parameter NB_CORES = 4
+    )
+	(
+	tck_i,
+	module_tdo_o,
+	tdi_i,
+	capture_dr_i,
+	shift_dr_i,
+	update_dr_i,
+	data_register_i,
+	module_select_i,
+	top_inhibit_o,
+	trstn_i,
+	cpu_clk_i,
+	cpu_rstn_i,
+	cpu_addr_o,
+	cpu_data_i,
+	cpu_data_o,
+	cpu_bp_i,
+	cpu_stall_o,
+	cpu_stb_o,
+	cpu_we_o,
+	cpu_ack_i
+);
+	//parameter NB_CORES = 4;
+	input wire tck_i;
+	output reg module_tdo_o;
+	input wire tdi_i;
+	input wire capture_dr_i;
+	input wire shift_dr_i;
+	input wire update_dr_i;
+	input wire [56:0] data_register_i;
+	input wire module_select_i;
+	output reg top_inhibit_o;
+	input wire trstn_i;
+	input cpu_clk_i;
+	input cpu_rstn_i;
+	output wire [(NB_CORES * 16) - 1:0] cpu_addr_o;
+	input wire [(NB_CORES * 32) - 1:0] cpu_data_i;
+	output wire [(NB_CORES * 32) - 1:0] cpu_data_o;
+	input wire [NB_CORES - 1:0] cpu_bp_i;
+	output wire [NB_CORES - 1:0] cpu_stall_o;
+	output wire [NB_CORES - 1:0] cpu_stb_o;
+	output wire [NB_CORES - 1:0] cpu_we_o;
+	input wire [NB_CORES - 1:0] cpu_ack_i;
+	reg [31:0] address_counter;
+	reg [5:0] bit_count;
+	reg [15:0] word_count;
+	reg [3:0] operation;
+	reg [31:0] data_out_shift_reg;
+	reg [2:0] internal_register_select;
+	wire [NB_CORES - 1:0] internal_reg_status;
+	reg addr_sel;
+	reg addr_ct_en;
+	reg op_reg_en;
+	reg bit_ct_en;
+	reg bit_ct_rst;
+	reg word_ct_sel;
+	reg word_ct_en;
+	reg out_reg_ld_en;
+	reg out_reg_shift_en;
+	reg out_reg_data_sel;
+	reg [1:0] tdo_output_sel;
+	reg biu_strobe;
+	reg crc_clr;
+	reg crc_en;
+	reg crc_in_sel;
+	reg crc_shift_en;
+	reg regsel_ld_en;
+	reg intreg_ld_en;
+	reg cpusel_ld_en;
+	wire word_count_zero;
+	wire bit_count_max;
+	wire module_cmd;
+	wire biu_ready;
+	wire burst_instruction;
+	wire intreg_instruction;
+	wire intreg_write;
+	wire rd_op;
+	wire crc_match;
+	wire bit_count_32;
+	wire [5:0] word_size_bits;
+	wire [2:0] address_increment;
+	wire [32:0] incremented_address;
+	wire [31:0] data_to_addr_counter;
+	wire [15:0] data_to_word_counter;
+	wire [15:0] decremented_word_count;
+	wire [31:0] address_data_in;
+	wire [15:0] count_data_in;
+	wire [3:0] operation_in;
+	wire [31:0] data_to_biu;
+	wire [31:0] data_from_biu;
+	wire [31:0] crc_data_out;
+	wire crc_data_in;
+	wire crc_serial_out;
+	wire [2:0] reg_select_data;
+	wire [31:0] out_reg_data;
+	reg [31:0] data_from_internal_reg;
+	wire status_reg_wr;
+	reg [3:0] cpu_select;
+	wire [3:0] cpu_select_in;
+	wire [15:0] status_reg_data;
+	reg [3:0] module_state;
+	reg [3:0] module_next_state;
+	assign module_cmd = ~data_register_i[56];
+	assign operation_in = data_register_i[55:52];
+	assign cpu_select_in = data_register_i[51:48];
+	assign address_data_in = data_register_i[47:16];
+	assign count_data_in = data_register_i[15:0];
+	assign data_to_biu = {tdi_i, data_register_i[56:26]};
+	assign reg_select_data = data_register_i[51:49];
+	assign status_reg_data = data_register_i[48:33];
+	assign burst_instruction = (operation_in == 4'h3) | (operation_in == 4'h7);
+	assign intreg_instruction = (operation_in == 4'h9) | (operation_in == 4'hd);
+	assign intreg_write = operation_in == 4'h9;
+	assign word_size_bits = 5'd31;
+	assign address_increment = 3'd1;
+	assign rd_op = operation[2];
+	always @(posedge tck_i or negedge trstn_i)
+		if (~trstn_i)
+			internal_register_select = 'h0;
+		else if (regsel_ld_en)
+			internal_register_select = reg_select_data;
+	always @(posedge tck_i or negedge trstn_i)
+		if (~trstn_i)
+			cpu_select = 'h0;
+		else if (cpusel_ld_en)
+			cpu_select = cpu_select_in;
+	always @(internal_register_select or internal_reg_status)
+		case (internal_register_select)
+			3'b000: data_from_internal_reg = {{32 - NB_CORES {1'b0}}, internal_reg_status};
+			default: data_from_internal_reg = {{32 - NB_CORES {1'b0}}, internal_reg_status};
+		endcase
+	assign status_reg_wr = intreg_ld_en & (reg_select_data == 3'b000);
+	adbg_or1k_status_reg #(.NB_CORES(NB_CORES)) or1k_statusreg_i(
+		.data_i(status_reg_data),
+		.we_i(status_reg_wr),
+		.tck_i(tck_i),
+		.bp_i(cpu_bp_i),
+		.trstn_i(trstn_i),
+		.cpu_clk_i(cpu_clk_i),
+		.cpu_rstn_i(cpu_rstn_i),
+		.ctrl_reg_o(internal_reg_status),
+		.cpu_stall_o(cpu_stall_o)
+	);
+	assign data_to_addr_counter = (addr_sel ? incremented_address[31:0] : address_data_in);
+	assign incremented_address = address_counter + address_increment;
+	always @(posedge tck_i or negedge trstn_i)
+		if (~trstn_i)
+			address_counter <= 32'h00000000;
+		else if (addr_ct_en)
+			address_counter <= data_to_addr_counter;
+	always @(posedge tck_i or negedge trstn_i)
+		if (~trstn_i)
+			operation <= 4'h0;
+		else if (op_reg_en)
+			operation <= operation_in;
+	always @(posedge tck_i or negedge trstn_i)
+		if (~trstn_i)
+			bit_count <= 6'h00;
+		else if (bit_ct_rst)
+			bit_count <= 6'h00;
+		else if (bit_ct_en)
+			bit_count <= bit_count + 6'h01;
+	assign bit_count_max = (bit_count == word_size_bits ? 1'b1 : 1'b0);
+	assign bit_count_32 = (bit_count == 6'h20 ? 1'b1 : 1'b0);
+	assign data_to_word_counter = (word_ct_sel ? decremented_word_count : count_data_in);
+	assign decremented_word_count = word_count - 16'h0001;
+	always @(posedge tck_i or negedge trstn_i)
+		if (~trstn_i)
+			word_count <= 16'h0000;
+		else if (word_ct_en)
+			word_count <= data_to_word_counter;
+	assign word_count_zero = word_count == 16'h0000;
+	assign out_reg_data = (out_reg_data_sel ? data_from_internal_reg : data_from_biu);
+	always @(posedge tck_i or negedge trstn_i)
+		if (~trstn_i)
+			data_out_shift_reg <= 32'h00000000;
+		else if (out_reg_ld_en)
+			data_out_shift_reg <= out_reg_data;
+		else if (out_reg_shift_en)
+			data_out_shift_reg <= {1'b0, data_out_shift_reg[31:1]};
+	always @(tdo_output_sel or data_out_shift_reg[0] or biu_ready or crc_match or crc_serial_out)
+		if (tdo_output_sel == 2'h0)
+			module_tdo_o <= biu_ready;
+		else if (tdo_output_sel == 2'h1)
+			module_tdo_o <= data_out_shift_reg[0];
+		else if (tdo_output_sel == 2'h2)
+			module_tdo_o <= crc_match;
+		else
+			module_tdo_o <= crc_serial_out;
+	adbg_or1k_biu #(.NB_CORES(NB_CORES)) or1k_biu_i(
+		.tck_i(tck_i),
+		.trstn_i(trstn_i),
+		.cpu_select_i(cpu_select),
+		.data_i(data_to_biu),
+		.data_o(data_from_biu),
+		.addr_i(address_counter),
+		.strobe_i(biu_strobe),
+		.rd_wrn_i(rd_op),
+		.rdy_o(biu_ready),
+		.cpu_clk_i(cpu_clk_i),
+		.cpu_rstn_i(cpu_rstn_i),
+		.cpu_addr_o(cpu_addr_o),
+		.cpu_data_i(cpu_data_i),
+		.cpu_data_o(cpu_data_o),
+		.cpu_stb_o(cpu_stb_o),
+		.cpu_we_o(cpu_we_o),
+		.cpu_ack_i(cpu_ack_i)
+	);
+	assign crc_data_in = (crc_in_sel ? tdi_i : data_out_shift_reg[0]);
+	adbg_crc32 or1k_crc_i(
+		.clk(tck_i),
+		.data(crc_data_in),
+		.enable(crc_en),
+		.shift(crc_shift_en),
+		.clr(crc_clr),
+		.rstn(trstn_i),
+		.crc_out(crc_data_out),
+		.serial_out(crc_serial_out)
+	);
+	assign crc_match = (data_register_i[56:25] == crc_data_out ? 1'b1 : 1'b0);
+	always @(posedge tck_i or negedge trstn_i)
+		if (~trstn_i)
+			module_state <= 4'd0;
+		else
+			module_state <= module_next_state;
+	always @(module_state or module_select_i or update_dr_i or capture_dr_i or shift_dr_i or operation_in[2] or word_count_zero or bit_count_max or data_register_i[56] or bit_count_32 or biu_ready or module_cmd or intreg_write or decremented_word_count or burst_instruction)
+		case (module_state)
+			4'd0:
+				if ((((module_cmd && module_select_i) && update_dr_i) && burst_instruction) && operation_in[2])
+					module_next_state <= 4'd1;
+				else if (((module_cmd && module_select_i) && update_dr_i) && burst_instruction)
+					module_next_state <= 4'd5;
+				else
+					module_next_state <= 4'd0;
+			4'd1:
+				if (word_count_zero)
+					module_next_state <= 4'd0;
+				else
+					module_next_state <= 4'd2;
+			4'd2:
+				if (module_select_i && capture_dr_i)
+					module_next_state <= 4'd3;
+				else
+					module_next_state <= 4'd2;
+			4'd3:
+				if (update_dr_i)
+					module_next_state <= 4'd0;
+				else if (biu_ready)
+					module_next_state <= 4'd4;
+				else
+					module_next_state <= 4'd3;
+			4'd4:
+				if (update_dr_i)
+					module_next_state <= 4'd0;
+				else if (bit_count_max && word_count_zero)
+					module_next_state <= 4'd9;
+				else
+					module_next_state <= 4'd4;
+			4'd9:
+				if (update_dr_i)
+					module_next_state <= 4'd0;
+				else
+					module_next_state <= 4'd9;
+			4'd5:
+				if (word_count_zero)
+					module_next_state <= 4'd0;
+				else if (module_select_i && capture_dr_i)
+					module_next_state <= 4'd6;
+				else
+					module_next_state <= 4'd5;
+			4'd6:
+				if (update_dr_i)
+					module_next_state <= 4'd0;
+				else if (module_select_i && data_register_i[56])
+					module_next_state <= 4'd7;
+				else
+					module_next_state <= 4'd6;
+			4'd7:
+				if (update_dr_i)
+					module_next_state <= 4'd0;
+				else if (bit_count_max) begin
+					if (word_count_zero)
+						module_next_state <= 4'd10;
+					else
+						module_next_state <= 4'd7;
+				end
+				else
+					module_next_state <= 4'd7;
+			4'd8:
+				if (update_dr_i)
+					module_next_state <= 4'd0;
+				else if (word_count_zero)
+					module_next_state <= 4'd10;
+				else
+					module_next_state <= 4'd7;
+			4'd10:
+				if (update_dr_i)
+					module_next_state <= 4'd0;
+				else if (bit_count_32)
+					module_next_state <= 4'd11;
+				else
+					module_next_state <= 4'd10;
+			4'd11:
+				if (update_dr_i)
+					module_next_state <= 4'd0;
+				else
+					module_next_state <= 4'd11;
+			default: module_next_state <= 4'd0;
+		endcase
+	always @(module_state or module_next_state or module_select_i or update_dr_i or capture_dr_i or shift_dr_i or operation_in[2] or word_count_zero or bit_count_max or data_register_i[52] or biu_ready or intreg_instruction or burst_instruction or module_cmd or intreg_write or decremented_word_count) begin
+		addr_sel <= 1'b1;
+		addr_ct_en <= 1'b0;
+		op_reg_en <= 1'b0;
+		bit_ct_en <= 1'b0;
+		bit_ct_rst <= 1'b0;
+		word_ct_sel <= 1'b1;
+		word_ct_en <= 1'b0;
+		out_reg_ld_en <= 1'b0;
+		out_reg_shift_en <= 1'b0;
+		tdo_output_sel <= 2'b01;
+		biu_strobe <= 1'b0;
+		crc_clr <= 1'b0;
+		crc_en <= 1'b0;
+		crc_in_sel <= 1'b0;
+		crc_shift_en <= 1'b0;
+		out_reg_data_sel <= 1'b1;
+		regsel_ld_en <= 1'b0;
+		cpusel_ld_en <= 1'b0;
+		intreg_ld_en <= 1'b0;
+		top_inhibit_o <= 1'b0;
+		case (module_state)
+			4'd0: begin
+				addr_sel <= 1'b0;
+				word_ct_sel <= 1'b0;
+				if (module_select_i & shift_dr_i)
+					out_reg_shift_en <= 1'b1;
+				if (module_select_i & capture_dr_i) begin
+					out_reg_data_sel <= 1'b1;
+					out_reg_ld_en <= 1'b1;
+				end
+				if ((module_select_i & module_cmd) & update_dr_i) begin
+					if (intreg_instruction)
+						regsel_ld_en <= 1'b1;
+					if (intreg_write)
+						intreg_ld_en <= 1'b1;
+					if (burst_instruction)
+						cpusel_ld_en <= 1'b1;
+				end
+				if (module_next_state != 4'd0) begin
+					addr_ct_en <= 1'b1;
+					op_reg_en <= 1'b1;
+					bit_ct_rst <= 1'b1;
+					word_ct_en <= 1'b1;
+					crc_clr <= 1'b1;
+				end
+			end
+			4'd1:
+				if (!word_count_zero) begin
+					biu_strobe <= 1'b1;
+					addr_sel <= 1'b1;
+					addr_ct_en <= 1'b1;
+				end
+			4'd2:
+				;
+			4'd3: begin
+				tdo_output_sel <= 2'h0;
+				top_inhibit_o <= 1'b1;
+				if (module_next_state == 4'd4) begin
+					out_reg_data_sel <= 1'b0;
+					out_reg_ld_en <= 1'b1;
+					bit_ct_rst <= 1'b1;
+					word_ct_sel <= 1'b1;
+					word_ct_en <= 1'b1;
+					if ((decremented_word_count != 0) && !word_count_zero) begin
+						biu_strobe <= 1'b1;
+						addr_sel <= 1'b1;
+						addr_ct_en <= 1'b1;
+					end
+				end
+			end
+			4'd4: begin
+				tdo_output_sel <= 2'h1;
+				out_reg_shift_en <= 1'b1;
+				bit_ct_en <= 1'b1;
+				crc_en <= 1'b1;
+				crc_in_sel <= 1'b0;
+				top_inhibit_o <= 1'b1;
+				if (bit_count_max) begin
+					out_reg_data_sel <= 1'b0;
+					out_reg_ld_en <= 1'b1;
+					bit_ct_rst <= 1'b1;
+					word_ct_sel <= 1'b1;
+					word_ct_en <= 1'b1;
+					if ((decremented_word_count != 0) && !word_count_zero) begin
+						biu_strobe <= 1'b1;
+						addr_sel <= 1'b1;
+						addr_ct_en <= 1'b1;
+					end
+				end
+			end
+			4'd9: begin
+				tdo_output_sel <= 2'h3;
+				crc_shift_en <= 1'b1;
+				top_inhibit_o <= 1'b1;
+			end
+			4'd5:
+				;
+			4'd6: begin
+				tdo_output_sel <= 2'h1;
+				top_inhibit_o <= 1'b1;
+				if (module_next_state == 4'd7) begin
+					bit_ct_en <= 1'b1;
+					word_ct_sel <= 1'b1;
+					word_ct_en <= 1'b1;
+					crc_en <= 1'b1;
+					crc_in_sel <= 1'b1;
+				end
+			end
+			4'd7: begin
+				bit_ct_en <= 1'b1;
+				tdo_output_sel <= 2'h1;
+				crc_en <= 1'b1;
+				crc_in_sel <= 1'b1;
+				top_inhibit_o <= 1'b1;
+				if (bit_count_max) begin
+					bit_ct_rst <= 1'b1;
+					biu_strobe <= 1'b1;
+					addr_ct_en <= 1'b1;
+					word_ct_sel <= 1'b1;
+					word_ct_en <= 1'b1;
+				end
+			end
+			4'd8: begin
+				tdo_output_sel <= 2'h0;
+				biu_strobe <= 1'b1;
+				word_ct_sel <= 1'b1;
+				word_ct_en <= 1'b1;
+				bit_ct_rst <= 1'b1;
+				addr_ct_en <= 1'b1;
+				top_inhibit_o <= 1'b1;
+			end
+			4'd10: begin
+				bit_ct_en <= 1'b1;
+				top_inhibit_o <= 1'b1;
+				if (module_next_state == 4'd11)
+					tdo_output_sel <= 2'h2;
+			end
+			4'd11: begin
+				tdo_output_sel <= 2'h2;
+				top_inhibit_o <= 1'b1;
+			end
+			default:
+				;
+		endcase
+	end
+endmodule
diff --git a/verilog/rtl/ips/adv_dbg_if/rtl/adbg_or1k_status_reg.v b/verilog/rtl/ips/adv_dbg_if/rtl/adbg_or1k_status_reg.v
new file mode 100644
index 0000000..3d17036
--- /dev/null
+++ b/verilog/rtl/ips/adv_dbg_if/rtl/adbg_or1k_status_reg.v
@@ -0,0 +1,74 @@
+module adbg_or1k_status_reg 
+#( 
+        parameter NB_CORES = 4
+    )
+(
+	tck_i,
+	trstn_i,
+	we_i,
+	cpu_clk_i,
+	cpu_rstn_i,
+	data_i,
+	bp_i,
+	ctrl_reg_o,
+	cpu_stall_o
+);
+	//parameter NB_CORES = 4;
+	input tck_i;
+	input trstn_i;
+	input we_i;
+	input cpu_clk_i;
+	input cpu_rstn_i;
+	input wire [15:0] data_i;
+	input wire [NB_CORES - 1:0] bp_i;
+	output wire [NB_CORES - 1:0] ctrl_reg_o;
+	output wire [NB_CORES - 1:0] cpu_stall_o;
+	reg [NB_CORES - 1:0] stall_bp;
+	reg [NB_CORES - 1:0] stall_bp_csff;
+	reg [NB_CORES - 1:0] stall_bp_tck;
+	reg [NB_CORES - 1:0] stall_reg;
+	reg [NB_CORES - 1:0] stall_reg_csff;
+	reg [NB_CORES - 1:0] stall_reg_cpu;
+	always @(posedge cpu_clk_i or negedge cpu_rstn_i)
+		if (~cpu_rstn_i)
+			stall_bp <= 1'sb0;
+		else begin : sv2v_autoblock_1
+			reg signed [31:0] i;
+			for (i = 0; i < NB_CORES; i = i + 1)
+				if (bp_i[i])
+					stall_bp[i] <= 1'b1;
+				else if (stall_reg_cpu[i])
+					stall_bp[i] <= 1'b0;
+		end
+	always @(posedge tck_i or negedge trstn_i)
+		if (~trstn_i) begin
+			stall_bp_csff <= 1'sb0;
+			stall_bp_tck <= 1'sb0;
+		end
+		else begin
+			stall_bp_csff <= stall_bp;
+			stall_bp_tck <= stall_bp_csff;
+		end
+	always @(posedge cpu_clk_i or negedge cpu_rstn_i)
+		if (~cpu_rstn_i) begin
+			stall_reg_csff <= 1'sb0;
+			stall_reg_cpu <= 1'sb0;
+		end
+		else begin
+			stall_reg_csff <= stall_reg;
+			stall_reg_cpu <= stall_reg_csff;
+		end
+	assign cpu_stall_o = (bp_i | stall_bp) | stall_reg_cpu;
+	always @(posedge tck_i or negedge trstn_i)
+		if (~trstn_i)
+			stall_reg <= 1'sb0;
+		else begin : sv2v_autoblock_2
+			reg signed [31:0] i;
+			for (i = 0; i < NB_CORES; i = i + 1)
+				if (stall_bp_tck[i])
+					stall_reg[i] <= 1'b1;
+				else if (we_i)
+					stall_reg[i] <= data_i[i];
+		end
+	assign ctrl_reg_o = {stall_reg};
+endmodule
diff --git a/verilog/rtl/ips/adv_dbg_if/rtl/adbg_tap_defines.v b/verilog/rtl/ips/adv_dbg_if/rtl/adbg_tap_defines.v
new file mode 100644
index 0000000..95c346f
--- /dev/null
+++ b/verilog/rtl/ips/adv_dbg_if/rtl/adbg_tap_defines.v
@@ -0,0 +1,79 @@
+//////////////////////////////////////////////////////////////////////
+////                                                              ////
+////  tap_defines.v                                               ////
+////                                                              ////
+////                                                              ////
+////  This file is part of the JTAG Test Access Port (TAP)        ////
+////  http://www.opencores.org/projects/jtag/                     ////
+////                                                              ////
+////  Author(s):                                                  ////
+////       Igor Mohor (igorm@opencores.org)                       ////
+////                                                              ////
+////                                                              ////
+////  All additional information is avaliable in the README.txt   ////
+////  file.                                                       ////
+////                                                              ////
+//////////////////////////////////////////////////////////////////////
+////                                                              ////
+//// Copyright (C) 2000 - 2003 Authors                            ////
+////                                                              ////
+//// This source file may be used and distributed without         ////
+//// restriction provided that this copyright statement is not    ////
+//// removed from the file and that any derivative work contains  ////
+//// the original copyright notice and the associated disclaimer. ////
+////                                                              ////
+//// This source file is free software; you can redistribute it   ////
+//// and/or modify it under the terms of the GNU Lesser General   ////
+//// Public License as published by the Free Software Foundation; ////
+//// either version 2.1 of the License, or (at your option) any   ////
+//// later version.                                               ////
+////                                                              ////
+//// This source is distributed in the hope that it will be       ////
+//// useful, but WITHOUT ANY WARRANTY; without even the implied   ////
+//// warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR      ////
+//// PURPOSE.  See the GNU Lesser General Public License for more ////
+//// details.                                                     ////
+////                                                              ////
+//// You should have received a copy of the GNU Lesser General    ////
+//// Public License along with this source; if not, download it   ////
+//// from http://www.opencores.org/lgpl.shtml                     ////
+////                                                              ////
+//////////////////////////////////////////////////////////////////////
+//
+// CVS Revision History
+//
+// $Log: tap_defines.v,v $
+// Revision 1.1.1.1  2008-05-14 12:07:33  Nathan
+// Original from OpenCores
+//
+// Revision 1.3  2004/03/02 17:39:45  mohor
+// IDCODE_VALUE changed to Flextronics ID.
+//
+// Revision 1.2  2004/01/27 10:00:33  mohor
+// Unused registers removed.
+//
+// Revision 1.1  2003/12/23 14:52:14  mohor
+// Directory structure changed. New version of TAP.
+//
+//
+//
+
+
+// Define IDCODE Value
+`define IDCODE_VALUE  32'h249511c3
+// 0001             version
+// 0100100101010001 part number (IQ)
+// 00011100001      manufacturer id (flextronics)
+// 1                required by standard
+
+// Length of the Instruction register
+`define	IR_LENGTH	4
+
+// Supported Instructions
+`define EXTEST          4'b0000
+`define SAMPLE_PRELOAD  4'b0001
+`define IDCODE          4'b0010
+`define DEBUG           4'b1000
+`define MBIST           4'b1001
+`define BYPASS          4'b1111
+
diff --git a/verilog/rtl/ips/adv_dbg_if/rtl/adbg_tap_top.v b/verilog/rtl/ips/adv_dbg_if/rtl/adbg_tap_top.v
new file mode 100644
index 0000000..972a77c
--- /dev/null
+++ b/verilog/rtl/ips/adv_dbg_if/rtl/adbg_tap_top.v
@@ -0,0 +1,551 @@
+//////////////////////////////////////////////////////////////////////
+////                                                              ////
+////  tap_top.v                                                   ////
+////                                                              ////
+////                                                              ////
+////  This file is part of the JTAG Test Access Port (TAP)        ////
+////                                                              ////
+////  Author(s):                                                  ////
+////       Igor Mohor (igorm@opencores.org)                       ////
+////       Nathan Yawn (nathan.yawn@opencores.org)                ////
+////                                                              ////
+////                                                              ////
+////  All additional information is avaliable in the jtag.pdf     ////
+////  file.                                                       ////
+////                                                              ////
+//////////////////////////////////////////////////////////////////////
+////                                                              ////
+//// Copyright (C) 2000 - 2008 Authors                            ////
+////                                                              ////
+//// This source file may be used and distributed without         ////
+//// restriction provided that this copyright statement is not    ////
+//// removed from the file and that any derivative work contains  ////
+//// the original copyright notice and the associated disclaimer. ////
+////                                                              ////
+//// This source file is free software; you can redistribute it   ////
+//// and/or modify it under the terms of the GNU Lesser General   ////
+//// Public License as published by the Free Software Foundation; ////
+//// either version 2.1 of the License, or (at your option) any   ////
+//// later version.                                               ////
+////                                                              ////
+//// This source is distributed in the hope that it will be       ////
+//// useful, but WITHOUT ANY WARRANTY; without even the implied   ////
+//// warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR      ////
+//// PURPOSE.  See the GNU Lesser General Public License for more ////
+//// details.                                                     ////
+////                                                              ////
+//// You should have received a copy of the GNU Lesser General    ////
+//// Public License along with this source; if not, download it   ////
+//// from http://www.opencores.org/lgpl.shtml                     ////
+////                                                              ////
+//////////////////////////////////////////////////////////////////////
+//
+// CVS Revision History
+//
+// $Log: tap_top.v,v $
+// Revision 1.6  2011-10-24 02:18:58  natey
+// Removed '#1' delays, which were a holdover from the original version. Ran
+// through dos2unix.
+//
+// Revision 1.5  2009-06-16 02:53:58  Nathan
+// Changed some signal names for better consistency between different hardware modules. Removed stale CVS log/comments.
+//
+// Revision 1.4  2009/05/17 20:54:38  Nathan
+// Changed email address to opencores.org
+//
+// Revision 1.3  2008/06/18 18:45:07  Nathan
+// Improved reset slightly.  Cleanup.
+//
+//
+// Revision 1.2 2008/05/14 13:13:24 Nathan
+// Rewrote TAP FSM in canonical form, for readability.  Switched
+// from one-hot to binary encoding.  Made reset signal active-
+// low, per JTAG spec.  Removed FF chain for 5 TMS reset - reset
+// done in Test Logic Reset mode.  Added test_logic_reset_o and
+// run_test_idle_o signals.  Removed double registers from IR data
+// path.  Unified the registers at the output of each data register
+// to a single shared FF.
+//
+
+`include "adbg_tap_defines.v"
+
+// Top module
+module adbg_tap_top(
+                // JTAG pads
+                tms_pad_i, 
+                tck_pad_i, 
+                trstn_pad_i, 
+                tdi_pad_i, 
+                tdo_pad_o, 
+                tdo_padoe_o,
+
+                test_mode_i,
+
+                // TAP states
+				test_logic_reset_o,
+				run_test_idle_o,
+                shift_dr_o,
+                pause_dr_o, 
+                update_dr_o,
+                capture_dr_o,
+                
+                // Select signals for boundary scan or mbist
+                extest_select_o, 
+                sample_preload_select_o,
+                mbist_select_o,
+                debug_select_o,
+                
+                // TDO signal that is connected to TDI of sub-modules.
+                tdi_o, 
+                
+                // TDI signals from sub-modules
+                debug_tdo_i,    // from debug module
+                bs_chain_tdo_i, // from Boundary Scan Chain
+                mbist_tdo_i     // from Mbist Chain
+              );
+
+
+// JTAG pins
+input   tms_pad_i;      // JTAG test mode select pad
+input   tck_pad_i;      // JTAG test clock pad
+input   trstn_pad_i;     // JTAG test reset pad
+input   tdi_pad_i;      // JTAG test data input pad
+output  tdo_pad_o;      // JTAG test data output pad
+output  tdo_padoe_o;    // Output enable for JTAG test data output pad 
+
+input   test_mode_i;     // test mode input
+
+// TAP states
+output  test_logic_reset_o;
+output  run_test_idle_o;
+output  shift_dr_o;
+output  pause_dr_o;
+output  update_dr_o;
+output  capture_dr_o;
+
+// Select signals for boundary scan or mbist
+output  extest_select_o;
+output  sample_preload_select_o;
+output  mbist_select_o;
+output  debug_select_o;
+
+// TDO signal that is connected to TDI of sub-modules.
+output  tdi_o;
+
+// TDI signals from sub-modules
+input   debug_tdo_i;    // from debug module
+input   bs_chain_tdo_i; // from Boundary Scan Chain
+input   mbist_tdo_i;    // from Mbist Chain
+
+// Wires which depend on the state of the TAP FSM
+reg     test_logic_reset;
+reg     run_test_idle;
+reg     select_dr_scan;
+reg     capture_dr;
+reg     shift_dr;
+reg     exit1_dr;
+reg     pause_dr;
+reg     exit2_dr;
+reg     update_dr;
+reg     select_ir_scan;
+reg     capture_ir;
+reg     shift_ir;
+reg     exit1_ir;
+reg     pause_ir;
+reg     exit2_ir;
+reg     update_ir;
+
+// Wires which depend on the current value in the IR
+reg     extest_select;
+reg     sample_preload_select;
+reg     idcode_select;
+reg     mbist_select;
+reg     debug_select;
+reg     bypass_select;
+
+// TDO and enable
+reg     tdo_pad_o;
+reg     tdo_padoe_o;
+
+wire    s_clk_neg;
+wire    s_tck_inv;
+
+cluster_clock_inverter u_clk_inv (.clk_i(tck_pad_i), .clk_o(s_tck_inv));
+cluster_clock_mux2 u_clk_mux(
+    .clk0_i(s_tck_inv),
+    .clk1_i(tck_pad_i),
+    .clk_sel_i(test_mode_i),
+    .clk_o(s_clk_neg)
+);
+
+assign tdi_o = tdi_pad_i;
+
+assign test_logic_reset_o = test_logic_reset;
+assign run_test_idle_o = run_test_idle;
+assign shift_dr_o = shift_dr;
+assign pause_dr_o = pause_dr;
+assign update_dr_o = update_dr;
+assign capture_dr_o = capture_dr;
+
+assign extest_select_o = extest_select;
+assign sample_preload_select_o = sample_preload_select;
+assign mbist_select_o = mbist_select;
+assign debug_select_o = debug_select;
+
+
+/**********************************************************************************
+*                                                                                 *
+*   TAP State Machine: Fully JTAG compliant                                       *
+*                                                                                 *
+**********************************************************************************/
+// Definition of machine state values.  We could one-hot encode this, and use 16
+// registers, but this uses binary encoding for the minimum of 4 DFF's instead.
+`define STATE_test_logic_reset 4'hF
+`define STATE_run_test_idle    4'hC
+`define STATE_select_dr_scan   4'h7
+`define STATE_capture_dr       4'h6
+`define STATE_shift_dr         4'h2
+`define STATE_exit1_dr         4'h1
+`define STATE_pause_dr         4'h3
+`define STATE_exit2_dr         4'h0
+`define STATE_update_dr        4'h5
+`define STATE_select_ir_scan   4'h4
+`define STATE_capture_ir       4'hE
+`define STATE_shift_ir         4'hA
+`define STATE_exit1_ir         4'h9
+`define STATE_pause_ir         4'hB
+`define STATE_exit2_ir         4'h8
+`define STATE_update_ir        4'hD
+
+reg [3:0] TAP_state;          // FIXED NOT POSSIBLE IN SYNTHESIS -->  = `STATE_test_logic_reset;  // current state of the TAP controller
+reg [3:0] next_TAP_state;     // state TAP will take at next rising TCK, combinational signal
+
+// sequential part of the FSM
+always @ (posedge tck_pad_i or negedge trstn_pad_i)
+begin
+	if(trstn_pad_i == 0)
+		TAP_state = `STATE_test_logic_reset;
+	else
+		TAP_state = next_TAP_state;
+end
+
+
+// Determination of next state; purely combinatorial
+always @ (TAP_state or tms_pad_i)
+begin
+	case(TAP_state)
+		`STATE_test_logic_reset:
+			begin
+			if(tms_pad_i) next_TAP_state = `STATE_test_logic_reset; 
+			else next_TAP_state = `STATE_run_test_idle;
+			end
+		`STATE_run_test_idle:
+			begin
+			if(tms_pad_i) next_TAP_state = `STATE_select_dr_scan; 
+			else next_TAP_state = `STATE_run_test_idle;
+			end
+		`STATE_select_dr_scan:
+			begin
+			if(tms_pad_i) next_TAP_state = `STATE_select_ir_scan; 
+			else next_TAP_state = `STATE_capture_dr;
+			end
+		`STATE_capture_dr:
+			begin
+			if(tms_pad_i) next_TAP_state = `STATE_exit1_dr; 
+			else next_TAP_state = `STATE_shift_dr;
+			end
+		`STATE_shift_dr:
+			begin
+			if(tms_pad_i) next_TAP_state = `STATE_exit1_dr; 
+			else next_TAP_state = `STATE_shift_dr;
+			end
+		`STATE_exit1_dr:
+			begin
+			if(tms_pad_i) next_TAP_state = `STATE_update_dr; 
+			else next_TAP_state = `STATE_pause_dr;
+			end
+		`STATE_pause_dr:
+			begin
+			if(tms_pad_i) next_TAP_state = `STATE_exit2_dr; 
+			else next_TAP_state = `STATE_pause_dr;
+			end
+		`STATE_exit2_dr:
+			begin
+			if(tms_pad_i) next_TAP_state = `STATE_update_dr; 
+			else next_TAP_state = `STATE_shift_dr;
+			end
+		`STATE_update_dr:
+			begin
+			if(tms_pad_i) next_TAP_state = `STATE_select_dr_scan; 
+			else next_TAP_state = `STATE_run_test_idle;
+			end
+		`STATE_select_ir_scan:
+			begin
+			if(tms_pad_i) next_TAP_state = `STATE_test_logic_reset;
+			else next_TAP_state = `STATE_capture_ir;
+			end
+		`STATE_capture_ir:
+			begin
+			if(tms_pad_i) next_TAP_state = `STATE_exit1_ir; 
+			else next_TAP_state = `STATE_shift_ir;
+			end
+		`STATE_shift_ir:
+			begin
+			if(tms_pad_i) next_TAP_state = `STATE_exit1_ir; 
+			else next_TAP_state = `STATE_shift_ir;
+			end
+		`STATE_exit1_ir:
+			begin
+			if(tms_pad_i) next_TAP_state = `STATE_update_ir;
+			else next_TAP_state = `STATE_pause_ir;
+			end
+		`STATE_pause_ir:
+			begin
+			if(tms_pad_i) next_TAP_state = `STATE_exit2_ir;
+			else next_TAP_state = `STATE_pause_ir;
+			end
+		`STATE_exit2_ir:
+			begin
+			if(tms_pad_i) next_TAP_state = `STATE_update_ir;
+			else next_TAP_state = `STATE_shift_ir;
+			end
+		`STATE_update_ir:
+			begin
+			if(tms_pad_i) next_TAP_state = `STATE_select_dr_scan;
+			else next_TAP_state = `STATE_run_test_idle;
+			end
+		default: next_TAP_state = `STATE_test_logic_reset;  // can't actually happen
+	endcase
+end
+
+
+// Outputs of state machine, pure combinatorial
+always @ (TAP_state)
+begin
+	// Default everything to 0, keeps the case statement simple
+	test_logic_reset = 1'b0;
+	run_test_idle = 1'b0;
+	select_dr_scan = 1'b0;
+	capture_dr = 1'b0;
+	shift_dr = 1'b0;
+	exit1_dr = 1'b0;
+	pause_dr = 1'b0;
+	exit2_dr = 1'b0;
+	update_dr = 1'b0;
+	select_ir_scan = 1'b0;
+	capture_ir = 1'b0;
+	shift_ir = 1'b0;
+	exit1_ir = 1'b0;
+	pause_ir = 1'b0;
+	exit2_ir = 1'b0;
+	update_ir = 1'b0;
+
+	case(TAP_state)
+		`STATE_test_logic_reset: test_logic_reset = 1'b1;
+		`STATE_run_test_idle:    run_test_idle = 1'b1;
+		`STATE_select_dr_scan:   select_dr_scan = 1'b1;
+		`STATE_capture_dr:       capture_dr = 1'b1;
+		`STATE_shift_dr:         shift_dr = 1'b1;
+		`STATE_exit1_dr:         exit1_dr = 1'b1;
+		`STATE_pause_dr:         pause_dr = 1'b1;
+		`STATE_exit2_dr:         exit2_dr = 1'b1;
+		`STATE_update_dr:        update_dr = 1'b1;
+		`STATE_select_ir_scan:   select_ir_scan = 1'b1;
+		`STATE_capture_ir:       capture_ir = 1'b1;
+		`STATE_shift_ir:         shift_ir = 1'b1;
+		`STATE_exit1_ir:         exit1_ir = 1'b1;
+		`STATE_pause_ir:         pause_ir = 1'b1;
+		`STATE_exit2_ir:         exit2_ir = 1'b1;
+		`STATE_update_ir:        update_ir = 1'b1;
+		default: ;
+	endcase
+end
+
+/**********************************************************************************
+*                                                                                 *
+*   End: TAP State Machine                                                        *
+*                                                                                 *
+**********************************************************************************/
+
+
+
+/**********************************************************************************
+*                                                                                 *
+*   jtag_ir:  JTAG Instruction Register                                           *
+*                                                                                 *
+**********************************************************************************/
+reg [`IR_LENGTH-1:0]  jtag_ir;          // Instruction register
+reg [`IR_LENGTH-1:0]  latched_jtag_ir; //, latched_jtag_ir_neg;
+wire                  instruction_tdo;
+
+always @ (posedge tck_pad_i or negedge trstn_pad_i)
+begin
+  if(trstn_pad_i == 0)
+    jtag_ir[`IR_LENGTH-1:0] <= `IR_LENGTH'b0;
+  else if (test_logic_reset == 1)
+	jtag_ir[`IR_LENGTH-1:0] <= `IR_LENGTH'b0;
+  else if(capture_ir)
+    jtag_ir <= 4'b0101;          // This value is fixed for easier fault detection
+  else if(shift_ir)
+    jtag_ir[`IR_LENGTH-1:0] <= {tdi_pad_i, jtag_ir[`IR_LENGTH-1:1]};
+end
+
+assign instruction_tdo = jtag_ir[0];  // This is latched on a negative TCK edge after the output MUX
+
+// Updating jtag_ir (Instruction Register)
+// jtag_ir should be latched on FALLING EDGE of TCK when capture_ir == 1
+always @ (posedge s_clk_neg or negedge trstn_pad_i)
+begin
+  if(trstn_pad_i == 0)
+    latched_jtag_ir <= `IDCODE;   // IDCODE selected after reset
+  else if (test_logic_reset)
+    latched_jtag_ir <= `IDCODE;   // IDCODE selected after reset
+  else if(update_ir)
+    latched_jtag_ir <= jtag_ir;
+end
+
+/**********************************************************************************
+*                                                                                 *
+*   End: jtag_ir                                                                  *
+*                                                                                 *
+**********************************************************************************/
+
+
+
+/**********************************************************************************
+*                                                                                 *
+*   idcode logic                                                                  *
+*                                                                                 *
+**********************************************************************************/
+reg [31:0] idcode_reg;
+wire        idcode_tdo;
+
+always @ (posedge tck_pad_i or negedge trstn_pad_i)
+begin
+  if(trstn_pad_i == 0)
+    idcode_reg <= `IDCODE_VALUE;   // IDCODE selected after reset
+  else if (test_logic_reset)
+    idcode_reg <= `IDCODE_VALUE;   // IDCODE selected after reset
+  else if(idcode_select & capture_dr)
+    idcode_reg <=  `IDCODE_VALUE;
+  else if(idcode_select & shift_dr)
+    idcode_reg <=  {tdi_pad_i, idcode_reg[31:1]};
+
+end
+
+assign idcode_tdo = idcode_reg[0];   // This is latched on a negative TCK edge after the output MUX
+
+/**********************************************************************************
+*                                                                                 *
+*   End: idcode logic                                                             *
+*                                                                                 *
+**********************************************************************************/
+
+
+/**********************************************************************************
+*                                                                                 *
+*   Bypass logic                                                                  *
+*                                                                                 *
+**********************************************************************************/
+wire  bypassed_tdo;
+reg   bypass_reg;  // This is a 1-bit register
+
+always @ (posedge tck_pad_i or negedge trstn_pad_i)
+begin
+  if (trstn_pad_i == 0)
+     bypass_reg <=  1'b0;
+  else if (test_logic_reset == 1)
+     bypass_reg <=  1'b0;
+  else if (bypass_select & capture_dr)
+    bypass_reg<= 1'b0;
+  else if(bypass_select & shift_dr)
+    bypass_reg<= tdi_pad_i;
+end
+
+assign bypassed_tdo = bypass_reg;   // This is latched on a negative TCK edge after the output MUX
+
+/**********************************************************************************
+*                                                                                 *
+*   End: Bypass logic                                                             *
+*                                                                                 *
+**********************************************************************************/
+
+
+/**********************************************************************************
+*                                                                                 *
+*   Selecting active data register                                                *
+*                                                                                 *
+**********************************************************************************/
+always @ (latched_jtag_ir)
+begin
+  extest_select           = 1'b0;
+  sample_preload_select   = 1'b0;
+  idcode_select           = 1'b0;
+  mbist_select            = 1'b0;
+  debug_select            = 1'b0;
+  bypass_select           = 1'b0;
+
+  case(latched_jtag_ir)    /* synthesis parallel_case */ 
+    `EXTEST:            extest_select           = 1'b1;    // External test
+    `SAMPLE_PRELOAD:    sample_preload_select   = 1'b1;    // Sample preload
+    `IDCODE:            idcode_select           = 1'b1;    // ID Code
+    `MBIST:             mbist_select            = 1'b1;    // Mbist test
+    `DEBUG:             debug_select            = 1'b1;    // Debug
+    `BYPASS:            bypass_select           = 1'b1;    // BYPASS
+    default:            bypass_select           = 1'b1;    // BYPASS
+  endcase
+end
+
+
+/**********************************************************************************
+*                                                                                 *
+*   Multiplexing TDO data                                                         *
+*                                                                                 *
+**********************************************************************************/
+reg tdo_mux_out;  // really just a wire
+
+always @ (shift_ir or instruction_tdo or latched_jtag_ir or idcode_tdo or
+          debug_tdo_i or bs_chain_tdo_i or mbist_tdo_i or bypassed_tdo or
+			bs_chain_tdo_i)
+begin
+  if(shift_ir)
+    tdo_mux_out = instruction_tdo;
+  else
+    begin
+      case(latched_jtag_ir)    // synthesis parallel_case
+        `IDCODE:            tdo_mux_out = idcode_tdo;       // Reading ID code
+        `DEBUG:             tdo_mux_out = debug_tdo_i;      // Debug
+        `SAMPLE_PRELOAD:    tdo_mux_out = bs_chain_tdo_i;   // Sampling/Preloading
+        `EXTEST:            tdo_mux_out = bs_chain_tdo_i;   // External test
+        `MBIST:             tdo_mux_out = mbist_tdo_i;      // Mbist test
+        default:            tdo_mux_out = bypassed_tdo;     // BYPASS instruction
+      endcase
+    end
+end
+
+
+// TDO changes state at negative edge of TCK
+always @ (posedge s_clk_neg or negedge trstn_pad_i)
+begin
+  if (trstn_pad_i == 0)
+    tdo_pad_o <= 1'b0;
+  else
+    tdo_pad_o <= tdo_mux_out;
+end
+
+
+// Tristate control for tdo_pad_o pin
+always @ (posedge s_clk_neg or negedge trstn_pad_i)
+begin
+  if (trstn_pad_i == 0)
+    tdo_padoe_o <= 1'b0;
+  else
+    tdo_padoe_o <= shift_ir | shift_dr;
+end
+/**********************************************************************************
+*                                                                                 *
+*   End: Multiplexing TDO data                                                    *
+*                                                                                 *
+**********************************************************************************/
+
+endmodule
diff --git a/verilog/rtl/ips/adv_dbg_if/rtl/adbg_top.v b/verilog/rtl/ips/adv_dbg_if/rtl/adbg_top.v
new file mode 100644
index 0000000..b133af2
--- /dev/null
+++ b/verilog/rtl/ips/adv_dbg_if/rtl/adbg_top.v
@@ -0,0 +1,264 @@
+module adbg_top 
+#(
+	parameter NB_CORES       = 4,
+	parameter AXI_ADDR_WIDTH = 32,
+	parameter AXI_DATA_WIDTH = 64,
+	parameter AXI_USER_WIDTH = 6,
+	parameter AXI_ID_WIDTH   = 3
+)
+(
+	tck_i,
+	tdi_i,
+	tdo_o,
+	trstn_i,
+	shift_dr_i,
+	pause_dr_i,
+	update_dr_i,
+	capture_dr_i,
+	debug_select_i,
+	cpu_addr_o,
+	cpu_data_i,
+	cpu_data_o,
+	cpu_bp_i,
+	cpu_stall_o,
+	cpu_stb_o,
+	cpu_we_o,
+	cpu_ack_i,
+	cpu_rst_o,
+	axi_aclk,
+	axi_aresetn,
+	axi_master_aw_valid,
+	axi_master_aw_addr,
+	axi_master_aw_prot,
+	axi_master_aw_region,
+	axi_master_aw_len,
+	axi_master_aw_size,
+	axi_master_aw_burst,
+	axi_master_aw_lock,
+	axi_master_aw_cache,
+	axi_master_aw_qos,
+	axi_master_aw_id,
+	axi_master_aw_user,
+	axi_master_aw_ready,
+	axi_master_ar_valid,
+	axi_master_ar_addr,
+	axi_master_ar_prot,
+	axi_master_ar_region,
+	axi_master_ar_len,
+	axi_master_ar_size,
+	axi_master_ar_burst,
+	axi_master_ar_lock,
+	axi_master_ar_cache,
+	axi_master_ar_qos,
+	axi_master_ar_id,
+	axi_master_ar_user,
+	axi_master_ar_ready,
+	axi_master_w_valid,
+	axi_master_w_data,
+	axi_master_w_strb,
+	axi_master_w_user,
+	axi_master_w_last,
+	axi_master_w_ready,
+	axi_master_r_valid,
+	axi_master_r_data,
+	axi_master_r_resp,
+	axi_master_r_last,
+	axi_master_r_id,
+	axi_master_r_user,
+	axi_master_r_ready,
+	axi_master_b_valid,
+	axi_master_b_resp,
+	axi_master_b_id,
+	axi_master_b_user,
+	axi_master_b_ready
+);
+	//parameter NB_CORES = 4;
+	//parameter AXI_ADDR_WIDTH = 32;
+	//parameter AXI_DATA_WIDTH = 64;
+	//parameter AXI_USER_WIDTH = 6;
+	//parameter AXI_ID_WIDTH = 3;
+	input wire tck_i;
+	input wire tdi_i;
+	output reg tdo_o;
+	input wire trstn_i;
+	input wire shift_dr_i;
+	input wire pause_dr_i;
+	input wire update_dr_i;
+	input wire capture_dr_i;
+	input wire debug_select_i;
+	output wire [(NB_CORES * 16) - 1:0] cpu_addr_o;
+	input wire [(NB_CORES * 32) - 1:0] cpu_data_i;
+	output wire [(NB_CORES * 32) - 1:0] cpu_data_o;
+	input wire [NB_CORES - 1:0] cpu_bp_i;
+	output wire [NB_CORES - 1:0] cpu_stall_o;
+	output wire [NB_CORES - 1:0] cpu_stb_o;
+	output wire [NB_CORES - 1:0] cpu_we_o;
+	input wire [NB_CORES - 1:0] cpu_ack_i;
+	output wire [NB_CORES - 1:0] cpu_rst_o;
+	input wire axi_aclk;
+	input wire axi_aresetn;
+	output wire axi_master_aw_valid;
+	output wire [AXI_ADDR_WIDTH - 1:0] axi_master_aw_addr;
+	output wire [2:0] axi_master_aw_prot;
+	output wire [3:0] axi_master_aw_region;
+	output wire [7:0] axi_master_aw_len;
+	output wire [2:0] axi_master_aw_size;
+	output wire [1:0] axi_master_aw_burst;
+	output wire axi_master_aw_lock;
+	output wire [3:0] axi_master_aw_cache;
+	output wire [3:0] axi_master_aw_qos;
+	output wire [AXI_ID_WIDTH - 1:0] axi_master_aw_id;
+	output wire [AXI_USER_WIDTH - 1:0] axi_master_aw_user;
+	input wire axi_master_aw_ready;
+	output wire axi_master_ar_valid;
+	output wire [AXI_ADDR_WIDTH - 1:0] axi_master_ar_addr;
+	output wire [2:0] axi_master_ar_prot;
+	output wire [3:0] axi_master_ar_region;
+	output wire [7:0] axi_master_ar_len;
+	output wire [2:0] axi_master_ar_size;
+	output wire [1:0] axi_master_ar_burst;
+	output wire axi_master_ar_lock;
+	output wire [3:0] axi_master_ar_cache;
+	output wire [3:0] axi_master_ar_qos;
+	output wire [AXI_ID_WIDTH - 1:0] axi_master_ar_id;
+	output wire [AXI_USER_WIDTH - 1:0] axi_master_ar_user;
+	input wire axi_master_ar_ready;
+	output wire axi_master_w_valid;
+	output wire [AXI_DATA_WIDTH - 1:0] axi_master_w_data;
+	output wire [(AXI_DATA_WIDTH / 8) - 1:0] axi_master_w_strb;
+	output wire [AXI_USER_WIDTH - 1:0] axi_master_w_user;
+	output wire axi_master_w_last;
+	input wire axi_master_w_ready;
+	input wire axi_master_r_valid;
+	input wire [AXI_DATA_WIDTH - 1:0] axi_master_r_data;
+	input wire [1:0] axi_master_r_resp;
+	input wire axi_master_r_last;
+	input wire [AXI_ID_WIDTH - 1:0] axi_master_r_id;
+	input wire [AXI_USER_WIDTH - 1:0] axi_master_r_user;
+	output wire axi_master_r_ready;
+	input wire axi_master_b_valid;
+	input wire [1:0] axi_master_b_resp;
+	input wire [AXI_ID_WIDTH - 1:0] axi_master_b_id;
+	input wire [AXI_USER_WIDTH - 1:0] axi_master_b_user;
+	output wire axi_master_b_ready;
+	wire tdo_axi;
+	wire tdo_cpu;
+	reg [63:0] input_shift_reg;
+	reg [4:0] module_id_reg;
+	wire select_cmd;
+	wire [4:0] module_id_in;
+	reg [1:0] module_selects;
+	wire select_inhibit;
+	wire [1:0] module_inhibit;
+	integer j;
+	assign select_cmd = input_shift_reg[63];
+	assign module_id_in = input_shift_reg[62:58];
+	always @(posedge tck_i or negedge trstn_i)
+		if (~trstn_i)
+			module_id_reg <= 5'h00;
+		else if (((debug_select_i && select_cmd) && update_dr_i) && !select_inhibit)
+			module_id_reg <= module_id_in;
+	always @(*)
+		if (module_id_reg == 0)
+			module_selects = 2'b01;
+		else
+			module_selects = 2'b10;
+	always @(posedge tck_i or negedge trstn_i)
+		if (~trstn_i)
+			input_shift_reg <= 'h0;
+		else if (debug_select_i && shift_dr_i)
+			input_shift_reg <= {tdi_i, input_shift_reg[63:1]};
+	adbg_axi_module #(
+		.AXI_ADDR_WIDTH(AXI_ADDR_WIDTH),
+		.AXI_DATA_WIDTH(AXI_DATA_WIDTH),
+		.AXI_USER_WIDTH(AXI_USER_WIDTH),
+		.AXI_ID_WIDTH(AXI_ID_WIDTH)
+	) i_dbg_axi(
+		.tck_i(tck_i),
+		.module_tdo_o(tdo_axi),
+		.tdi_i(tdi_i),
+		.capture_dr_i(capture_dr_i),
+		.shift_dr_i(shift_dr_i),
+		.update_dr_i(update_dr_i),
+		.data_register_i(input_shift_reg),
+		.module_select_i(module_selects[0]),
+		.top_inhibit_o(module_inhibit[0]),
+		.trstn_i(trstn_i),
+		.axi_aclk(axi_aclk),
+		.axi_aresetn(axi_aresetn),
+		.axi_master_aw_valid(axi_master_aw_valid),
+		.axi_master_aw_addr(axi_master_aw_addr),
+		.axi_master_aw_prot(axi_master_aw_prot),
+		.axi_master_aw_region(axi_master_aw_region),
+		.axi_master_aw_len(axi_master_aw_len),
+		.axi_master_aw_size(axi_master_aw_size),
+		.axi_master_aw_burst(axi_master_aw_burst),
+		.axi_master_aw_lock(axi_master_aw_lock),
+		.axi_master_aw_cache(axi_master_aw_cache),
+		.axi_master_aw_qos(axi_master_aw_qos),
+		.axi_master_aw_id(axi_master_aw_id),
+		.axi_master_aw_user(axi_master_aw_user),
+		.axi_master_aw_ready(axi_master_aw_ready),
+		.axi_master_ar_valid(axi_master_ar_valid),
+		.axi_master_ar_addr(axi_master_ar_addr),
+		.axi_master_ar_prot(axi_master_ar_prot),
+		.axi_master_ar_region(axi_master_ar_region),
+		.axi_master_ar_len(axi_master_ar_len),
+		.axi_master_ar_size(axi_master_ar_size),
+		.axi_master_ar_burst(axi_master_ar_burst),
+		.axi_master_ar_lock(axi_master_ar_lock),
+		.axi_master_ar_cache(axi_master_ar_cache),
+		.axi_master_ar_qos(axi_master_ar_qos),
+		.axi_master_ar_id(axi_master_ar_id),
+		.axi_master_ar_user(axi_master_ar_user),
+		.axi_master_ar_ready(axi_master_ar_ready),
+		.axi_master_w_valid(axi_master_w_valid),
+		.axi_master_w_data(axi_master_w_data),
+		.axi_master_w_strb(axi_master_w_strb),
+		.axi_master_w_user(axi_master_w_user),
+		.axi_master_w_last(axi_master_w_last),
+		.axi_master_w_ready(axi_master_w_ready),
+		.axi_master_r_valid(axi_master_r_valid),
+		.axi_master_r_data(axi_master_r_data),
+		.axi_master_r_resp(axi_master_r_resp),
+		.axi_master_r_last(axi_master_r_last),
+		.axi_master_r_id(axi_master_r_id),
+		.axi_master_r_user(axi_master_r_user),
+		.axi_master_r_ready(axi_master_r_ready),
+		.axi_master_b_valid(axi_master_b_valid),
+		.axi_master_b_resp(axi_master_b_resp),
+		.axi_master_b_id(axi_master_b_id),
+		.axi_master_b_user(axi_master_b_user),
+		.axi_master_b_ready(axi_master_b_ready)
+	);
+	adbg_or1k_module #(.NB_CORES(NB_CORES)) i_dbg_cpu_or1k(
+		.tck_i(tck_i),
+		.module_tdo_o(tdo_cpu),
+		.tdi_i(tdi_i),
+		.capture_dr_i(capture_dr_i),
+		.shift_dr_i(shift_dr_i),
+		.update_dr_i(update_dr_i),
+		.data_register_i(input_shift_reg[63:7]),
+		.module_select_i(module_selects[1]),
+		.top_inhibit_o(module_inhibit[1]),
+		.trstn_i(trstn_i),
+		.cpu_clk_i(axi_aclk),
+		.cpu_rstn_i(axi_aresetn),
+		.cpu_addr_o(cpu_addr_o),
+		.cpu_data_i(cpu_data_i),
+		.cpu_data_o(cpu_data_o),
+		.cpu_bp_i(cpu_bp_i),
+		.cpu_stall_o(cpu_stall_o),
+		.cpu_stb_o(cpu_stb_o),
+		.cpu_we_o(cpu_we_o),
+		.cpu_ack_i(cpu_ack_i)
+	);
+	assign select_inhibit = |module_inhibit;
+	always @(module_id_reg or tdo_axi or tdo_cpu)
+		if (module_id_reg == 0)
+			tdo_o <= tdo_axi;
+		else if (module_id_reg == 1)
+			tdo_o <= tdo_cpu;
+		else
+			tdo_o <= 1'b0;
+endmodule
diff --git a/verilog/rtl/ips/adv_dbg_if/rtl/adv_dbg_if.v b/verilog/rtl/ips/adv_dbg_if/rtl/adv_dbg_if.v
new file mode 100644
index 0000000..8c5d5bb
--- /dev/null
+++ b/verilog/rtl/ips/adv_dbg_if/rtl/adv_dbg_if.v
@@ -0,0 +1,249 @@
+module adv_dbg_if 
+#(
+	parameter NB_CORES       = 4,
+	parameter AXI_ADDR_WIDTH = 32,
+	parameter AXI_DATA_WIDTH = 64,
+	parameter AXI_USER_WIDTH = 6,
+	parameter AXI_ID_WIDTH   = 3
+)
+(
+	tms_pad_i,
+	tck_pad_i,
+	trstn_pad_i,
+	tdi_pad_i,
+	tdo_pad_o,
+	tdo_padoe_o,
+	test_mode_i,
+	cpu_clk_i,
+	cpu_addr_o,
+	cpu_data_i,
+	cpu_data_o,
+	cpu_bp_i,
+	cpu_stall_o,
+	cpu_stb_o,
+	cpu_we_o,
+	cpu_ack_i,
+	cpu_rst_o,
+	axi_aclk,
+	axi_aresetn,
+	axi_master_aw_valid,
+	axi_master_aw_addr,
+	axi_master_aw_prot,
+	axi_master_aw_region,
+	axi_master_aw_len,
+	axi_master_aw_size,
+	axi_master_aw_burst,
+	axi_master_aw_lock,
+	axi_master_aw_cache,
+	axi_master_aw_qos,
+	axi_master_aw_id,
+	axi_master_aw_user,
+	axi_master_aw_ready,
+	axi_master_ar_valid,
+	axi_master_ar_addr,
+	axi_master_ar_prot,
+	axi_master_ar_region,
+	axi_master_ar_len,
+	axi_master_ar_size,
+	axi_master_ar_burst,
+	axi_master_ar_lock,
+	axi_master_ar_cache,
+	axi_master_ar_qos,
+	axi_master_ar_id,
+	axi_master_ar_user,
+	axi_master_ar_ready,
+	axi_master_w_valid,
+	axi_master_w_data,
+	axi_master_w_strb,
+	axi_master_w_user,
+	axi_master_w_last,
+	axi_master_w_ready,
+	axi_master_r_valid,
+	axi_master_r_data,
+	axi_master_r_resp,
+	axi_master_r_last,
+	axi_master_r_id,
+	axi_master_r_user,
+	axi_master_r_ready,
+	axi_master_b_valid,
+	axi_master_b_resp,
+	axi_master_b_id,
+	axi_master_b_user,
+	axi_master_b_ready
+);
+	//parameter NB_CORES = 4;
+	//parameter AXI_ADDR_WIDTH = 32;
+	//parameter AXI_DATA_WIDTH = 64;
+	//parameter AXI_USER_WIDTH = 6;
+	//parameter AXI_ID_WIDTH = 3;
+	input wire tms_pad_i;
+	input wire tck_pad_i;
+	input wire trstn_pad_i;
+	input wire tdi_pad_i;
+	output wire tdo_pad_o;
+	output wire tdo_padoe_o;
+	input wire test_mode_i;
+	input wire [NB_CORES - 1:0] cpu_clk_i;
+	output wire [(NB_CORES * 16) - 1:0] cpu_addr_o;
+	input wire [(NB_CORES * 32) - 1:0] cpu_data_i;
+	output wire [(NB_CORES * 32) - 1:0] cpu_data_o;
+	input wire [NB_CORES - 1:0] cpu_bp_i;
+	output wire [NB_CORES - 1:0] cpu_stall_o;
+	output wire [NB_CORES - 1:0] cpu_stb_o;
+	output wire [NB_CORES - 1:0] cpu_we_o;
+	input wire [NB_CORES - 1:0] cpu_ack_i;
+	output wire [NB_CORES - 1:0] cpu_rst_o;
+	input wire axi_aclk;
+	input wire axi_aresetn;
+	output wire axi_master_aw_valid;
+	output wire [AXI_ADDR_WIDTH - 1:0] axi_master_aw_addr;
+	output wire [2:0] axi_master_aw_prot;
+	output wire [3:0] axi_master_aw_region;
+	output wire [7:0] axi_master_aw_len;
+	output wire [2:0] axi_master_aw_size;
+	output wire [1:0] axi_master_aw_burst;
+	output wire axi_master_aw_lock;
+	output wire [3:0] axi_master_aw_cache;
+	output wire [3:0] axi_master_aw_qos;
+	output wire [AXI_ID_WIDTH - 1:0] axi_master_aw_id;
+	output wire [AXI_USER_WIDTH - 1:0] axi_master_aw_user;
+	input wire axi_master_aw_ready;
+	output wire axi_master_ar_valid;
+	output wire [AXI_ADDR_WIDTH - 1:0] axi_master_ar_addr;
+	output wire [2:0] axi_master_ar_prot;
+	output wire [3:0] axi_master_ar_region;
+	output wire [7:0] axi_master_ar_len;
+	output wire [2:0] axi_master_ar_size;
+	output wire [1:0] axi_master_ar_burst;
+	output wire axi_master_ar_lock;
+	output wire [3:0] axi_master_ar_cache;
+	output wire [3:0] axi_master_ar_qos;
+	output wire [AXI_ID_WIDTH - 1:0] axi_master_ar_id;
+	output wire [AXI_USER_WIDTH - 1:0] axi_master_ar_user;
+	input wire axi_master_ar_ready;
+	output wire axi_master_w_valid;
+	output wire [AXI_DATA_WIDTH - 1:0] axi_master_w_data;
+	output wire [(AXI_DATA_WIDTH / 8) - 1:0] axi_master_w_strb;
+	output wire [AXI_USER_WIDTH - 1:0] axi_master_w_user;
+	output wire axi_master_w_last;
+	input wire axi_master_w_ready;
+	input wire axi_master_r_valid;
+	input wire [AXI_DATA_WIDTH - 1:0] axi_master_r_data;
+	input wire [1:0] axi_master_r_resp;
+	input wire axi_master_r_last;
+	input wire [AXI_ID_WIDTH - 1:0] axi_master_r_id;
+	input wire [AXI_USER_WIDTH - 1:0] axi_master_r_user;
+	output wire axi_master_r_ready;
+	input wire axi_master_b_valid;
+	input wire [1:0] axi_master_b_resp;
+	input wire [AXI_ID_WIDTH - 1:0] axi_master_b_id;
+	input wire [AXI_USER_WIDTH - 1:0] axi_master_b_user;
+	output wire axi_master_b_ready;
+	wire s_test_logic_reset;
+	wire s_run_test_idle;
+	wire s_shift_dr;
+	wire s_pause_dr;
+	wire s_update_dr;
+	wire s_capture_dr;
+	wire s_extest_select;
+	wire s_sample_preload_select;
+	wire s_mbist_select;
+	wire s_debug_select;
+	wire s_tdi;
+	wire s_debug_tdo;
+	adbg_tap_top cluster_tap_i(
+		.tms_pad_i(tms_pad_i),
+		.tck_pad_i(tck_pad_i),
+		.trstn_pad_i(trstn_pad_i),
+		.tdi_pad_i(tdi_pad_i),
+		.tdo_pad_o(tdo_pad_o),
+		.tdo_padoe_o(tdo_padoe_o),
+		.test_mode_i(test_mode_i),
+		.test_logic_reset_o(s_test_logic_reset),
+		.run_test_idle_o(s_run_test_idle),
+		.shift_dr_o(s_shift_dr),
+		.pause_dr_o(s_pause_dr),
+		.update_dr_o(s_update_dr),
+		.capture_dr_o(s_capture_dr),
+		.extest_select_o(s_extest_select),
+		.sample_preload_select_o(s_sample_preload_select),
+		.mbist_select_o(s_mbist_select),
+		.debug_select_o(s_debug_select),
+		.tdi_o(s_tdi),
+		.debug_tdo_i(s_debug_tdo),
+		.bs_chain_tdo_i(1'b0),
+		.mbist_tdo_i(1'b0)
+	);
+	adbg_top #(
+		.NB_CORES(NB_CORES),
+		.AXI_ADDR_WIDTH(AXI_ADDR_WIDTH),
+		.AXI_DATA_WIDTH(AXI_DATA_WIDTH),
+		.AXI_USER_WIDTH(AXI_USER_WIDTH),
+		.AXI_ID_WIDTH(AXI_ID_WIDTH)
+	) dbg_module_i(
+		.tck_i(tck_pad_i),
+		.tdi_i(s_tdi),
+		.tdo_o(s_debug_tdo),
+		.trstn_i(trstn_pad_i),
+		.shift_dr_i(s_shift_dr),
+		.pause_dr_i(s_pause_dr),
+		.update_dr_i(s_update_dr),
+		.capture_dr_i(s_capture_dr),
+		.debug_select_i(s_debug_select),
+		.cpu_addr_o(cpu_addr_o),
+		.cpu_data_i(cpu_data_i),
+		.cpu_data_o(cpu_data_o),
+		.cpu_bp_i(cpu_bp_i),
+		.cpu_stall_o(cpu_stall_o),
+		.cpu_stb_o(cpu_stb_o),
+		.cpu_we_o(cpu_we_o),
+		.cpu_ack_i(cpu_ack_i),
+		.cpu_rst_o(cpu_rst_o),
+		.axi_aclk(axi_aclk),
+		.axi_aresetn(axi_aresetn),
+		.axi_master_aw_valid(axi_master_aw_valid),
+		.axi_master_aw_addr(axi_master_aw_addr),
+		.axi_master_aw_prot(axi_master_aw_prot),
+		.axi_master_aw_region(axi_master_aw_region),
+		.axi_master_aw_len(axi_master_aw_len),
+		.axi_master_aw_size(axi_master_aw_size),
+		.axi_master_aw_burst(axi_master_aw_burst),
+		.axi_master_aw_lock(axi_master_aw_lock),
+		.axi_master_aw_cache(axi_master_aw_cache),
+		.axi_master_aw_qos(axi_master_aw_qos),
+		.axi_master_aw_id(axi_master_aw_id),
+		.axi_master_aw_user(axi_master_aw_user),
+		.axi_master_aw_ready(axi_master_aw_ready),
+		.axi_master_ar_valid(axi_master_ar_valid),
+		.axi_master_ar_addr(axi_master_ar_addr),
+		.axi_master_ar_prot(axi_master_ar_prot),
+		.axi_master_ar_region(axi_master_ar_region),
+		.axi_master_ar_len(axi_master_ar_len),
+		.axi_master_ar_size(axi_master_ar_size),
+		.axi_master_ar_burst(axi_master_ar_burst),
+		.axi_master_ar_lock(axi_master_ar_lock),
+		.axi_master_ar_cache(axi_master_ar_cache),
+		.axi_master_ar_qos(axi_master_ar_qos),
+		.axi_master_ar_id(axi_master_ar_id),
+		.axi_master_ar_user(axi_master_ar_user),
+		.axi_master_ar_ready(axi_master_ar_ready),
+		.axi_master_w_valid(axi_master_w_valid),
+		.axi_master_w_data(axi_master_w_data),
+		.axi_master_w_strb(axi_master_w_strb),
+		.axi_master_w_user(axi_master_w_user),
+		.axi_master_w_last(axi_master_w_last),
+		.axi_master_w_ready(axi_master_w_ready),
+		.axi_master_r_valid(axi_master_r_valid),
+		.axi_master_r_data(axi_master_r_data),
+		.axi_master_r_resp(axi_master_r_resp),
+		.axi_master_r_last(axi_master_r_last),
+		.axi_master_r_id(axi_master_r_id),
+		.axi_master_r_user(axi_master_r_user),
+		.axi_master_r_ready(axi_master_r_ready),
+		.axi_master_b_valid(axi_master_b_valid),
+		.axi_master_b_resp(axi_master_b_resp),
+		.axi_master_b_id(axi_master_b_id),
+		.axi_master_b_user(axi_master_b_user),
+		.axi_master_b_ready(axi_master_b_ready)
+	);
+endmodule
diff --git a/verilog/rtl/ips/adv_dbg_if/rtl/bytefifo.v b/verilog/rtl/ips/adv_dbg_if/rtl/bytefifo.v
new file mode 100644
index 0000000..ab3dc4e
--- /dev/null
+++ b/verilog/rtl/ips/adv_dbg_if/rtl/bytefifo.v
@@ -0,0 +1,225 @@
+//////////////////////////////////////////////////////////////////////
+////                                                              ////
+////  bytefifo.v                                                  ////
+////                                                              ////
+////                                                              ////
+////  A simple byte-wide FIFO with byte and free space counts     ////
+////                                                              ////
+////  Author(s):                                                  ////
+////       Nathan Yawn (nathan.yawn@opencores.org)                ////
+////                                                              ////
+////                                                              ////
+////                                                              ////
+//////////////////////////////////////////////////////////////////////
+////                                                              ////
+//// Copyright (C) 2010 Authors                                   ////
+////                                                              ////
+//// This source file may be used and distributed without         ////
+//// restriction provided that this copyright statement is not    ////
+//// removed from the file and that any derivative work contains  ////
+//// the original copyright notice and the associated disclaimer. ////
+////                                                              ////
+//// This source file is free software; you can redistribute it   ////
+//// and/or modify it under the terms of the GNU Lesser General   ////
+//// Public License as published by the Free Software Foundation; ////
+//// either version 2.1 of the License, or (at your option) any   ////
+//// later version.                                               ////
+////                                                              ////
+//// This source is distributed in the hope that it will be       ////
+//// useful, but WITHOUT ANY WARRANTY; without even the implied   ////
+//// warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR      ////
+//// PURPOSE.  See the GNU Lesser General Public License for more ////
+//// details.                                                     ////
+////                                                              ////
+//// You should have received a copy of the GNU Lesser General    ////
+//// Public License along with this source; if not, download it   ////
+//// from http://www.opencores.org/lgpl.shtml                     ////
+////                                                              ////
+//////////////////////////////////////////////////////////////////////
+//
+// This is an 8-entry, byte-wide, single-port FIFO.  It can either
+// push or pop a byte each clock cycle (but not both).  It includes
+// outputs indicating the number of bytes in the FIFO, and the number
+// of bytes free - if you don't connect BYTES_FREE, the synthesis
+// tool should eliminate the hardware to generate it.
+//
+// This attempts to use few resources.  There is only 1 counter,
+// and only 1 decoder.  The FIFO works like a big shift register:
+// bytes are always written to entry '0' of the FIFO, and older
+// bytes are shifted toward entry '7' as newer bytes are added.
+// The counter determines which entry the output reads.
+//
+// One caveat is that the DATA_OUT will glitch during a 'push'
+// operation.  If the output is being sent to another clock
+// domain, you should register it first.
+//
+// Ports:
+// CLK:  Clock for all synchronous elements
+// RST:  Zeros the counter and all registers asynchronously
+// DATA_IN: Data to be pushed into the FIFO
+// DATA_OUT: Always shows the data at the head of the FIFO, 'XX' if empty
+// PUSH_POPn: When high (and EN is high), DATA_IN will be pushed onto the
+//            FIFO and the count will be incremented at the next posedge
+//            of CLK (assuming the FIFO is not full).  When low (and EN
+//            is high), the count will be decremented and the output changed
+//            to the next value in the FIFO (assuming FIFO not empty).
+// EN: When high at posedege CLK, a push or pop operation will be performed,
+//     based on the value of PUSH_POPn, assuming sufficient data or space.
+// BYTES_AVAIL: Number of bytes in the FIFO.  May be in the range 0 to 8.
+// BYTES_FREE: Free space in the FIFO.  May be in the range 0 to 8.          
+
+
+// Top module
+module bytefifo (
+		 CLK,
+		 RSTN,
+                 DATA_IN,
+		 DATA_OUT,
+		 PUSH_POPn,
+                 EN,
+                 BYTES_AVAIL,
+		 BYTES_FREE
+		);
+
+
+   input        CLK;
+   input        RSTN;
+   input  [7:0] DATA_IN;
+   output [7:0] DATA_OUT;
+   input        PUSH_POPn;
+   input        EN;
+   output [3:0] BYTES_AVAIL;
+   output [3:0] BYTES_FREE;
+
+   reg [7:0] 	reg0, reg1, reg2, reg3, reg4, reg5, reg6, reg7;
+   reg [3:0] 	counter;
+      
+   reg [7:0]  DATA_OUT;
+   wire [3:0]  BYTES_AVAIL;
+   wire [3:0] 	BYTES_FREE;
+   wire 	push_ok;
+   wire    pop_ok;
+   
+   ///////////////////////////////////
+   // Combinatorial assignments
+   
+   assign BYTES_AVAIL = counter;  
+   assign  BYTES_FREE = 4'h8 - BYTES_AVAIL;
+   assign  push_ok = !(counter == 4'h8);
+   assign  pop_ok = !(counter == 4'h0);
+   
+   ///////////////////////////////////
+   // FIFO memory / shift registers
+   
+   // Reg 0 - takes input from DATA_IN
+   always @ (posedge CLK or negedge RSTN)
+     begin
+	if(~RSTN)
+	  reg0 <= 8'h0;
+	else if(EN & PUSH_POPn & push_ok)
+	  reg0 <= DATA_IN;
+     end
+
+
+   // Reg 1 - takes input from reg0
+   always @ (posedge CLK or negedge RSTN)
+     begin
+	if(~RSTN)
+	  reg1 <= 8'h0;
+	else if(EN & PUSH_POPn & push_ok)
+	  reg1 <= reg0;
+     end
+
+   
+   // Reg 2 - takes input from reg1
+   always @ (posedge CLK or negedge RSTN)
+     begin
+	if(~RSTN)
+	  reg2 <= 8'h0;
+	else if(EN & PUSH_POPn & push_ok)
+	  reg2 <= reg1;
+     end
+
+   
+   // Reg 3 - takes input from reg2
+   always @ (posedge CLK or negedge RSTN)
+     begin
+	if(~RSTN)
+	  reg3 <= 8'h0;
+	else if(EN & PUSH_POPn & push_ok)
+	  reg3 <= reg2;
+     end
+
+   
+   // Reg 4 - takes input from reg3
+   always @ (posedge CLK or negedge RSTN)
+     begin
+	if(~RSTN)
+	  reg4 <= 8'h0;
+	else if(EN & PUSH_POPn & push_ok)
+	  reg4 <= reg3;
+     end
+
+   
+   // Reg 5 - takes input from reg4
+   always @ (posedge CLK or negedge RSTN)
+     begin
+	if(~RSTN)
+	  reg5 <= 8'h0;
+	else if(EN & PUSH_POPn & push_ok)
+	  reg5 <= reg4;
+     end
+
+   
+   // Reg 6 - takes input from reg5
+   always @ (posedge CLK or negedge RSTN)
+     begin
+	if(~RSTN)
+	  reg6 <= 8'h0;
+	else if(EN & PUSH_POPn & push_ok)
+	  reg6 <= reg5;
+     end
+
+   
+   // Reg 7 - takes input from reg6
+   always @ (posedge CLK or negedge RSTN)
+     begin
+	if(~RSTN)
+	  reg7 <= 8'h0;
+	else if(EN & PUSH_POPn & push_ok)
+	  reg7 <= reg6;
+     end
+
+   ///////////////////////////////////////////////////
+   // Read counter
+   // This is a 4-bit saturating up/down counter
+  // The 'saturating' is done via push_ok and pop_ok
+  
+   always @ (posedge CLK or negedge RSTN)
+     begin
+	if(~RSTN)             counter <= 4'h0;
+	else if(EN & PUSH_POPn & push_ok)  counter <= counter + 4'h1;
+	else if(EN & (~PUSH_POPn) & pop_ok)    counter <= counter - 4'h1;
+     end
+
+   /////////////////////////////////////////////////
+   // Output decoder
+   
+   always @ (counter or reg0 or reg1 or reg2 or reg3 or reg4 or reg5
+	     or reg6 or reg7)
+     begin
+	case (counter)
+	  4'h1:     DATA_OUT <= reg0; 
+	  4'h2:     DATA_OUT <= reg1;
+	  4'h3:     DATA_OUT <= reg2;
+	  4'h4:     DATA_OUT <= reg3;
+	  4'h5:     DATA_OUT <= reg4;
+	  4'h6:     DATA_OUT <= reg5;
+	  4'h7:     DATA_OUT <= reg6;
+	  4'h8:     DATA_OUT <= reg7;
+	  default:  DATA_OUT <= 8'hXX;
+	endcase
+     end
+
+   
+endmodule
diff --git a/verilog/rtl/ips/adv_dbg_if/rtl/syncflop.v b/verilog/rtl/ips/adv_dbg_if/rtl/syncflop.v
new file mode 100644
index 0000000..e6a8d56
--- /dev/null
+++ b/verilog/rtl/ips/adv_dbg_if/rtl/syncflop.v
@@ -0,0 +1,126 @@
+//////////////////////////////////////////////////////////////////////
+////                                                              ////
+////  syncflop.v                                                  ////
+////                                                              ////
+////                                                              ////
+////  A generic synchronization device between two clock domains  ////
+////                                                              ////
+////  Author(s):                                                  ////
+////       Nathan Yawn (nathan.yawn@opencores.org)                ////
+////                                                              ////
+////                                                              ////
+////                                                              ////
+//////////////////////////////////////////////////////////////////////
+////                                                              ////
+//// Copyright (C) 2010 Authors                                   ////
+////                                                              ////
+//// This source file may be used and distributed without         ////
+//// restriction provided that this copyright statement is not    ////
+//// removed from the file and that any derivative work contains  ////
+//// the original copyright notice and the associated disclaimer. ////
+////                                                              ////
+//// This source file is free software; you can redistribute it   ////
+//// and/or modify it under the terms of the GNU Lesser General   ////
+//// Public License as published by the Free Software Foundation; ////
+//// either version 2.1 of the License, or (at your option) any   ////
+//// later version.                                               ////
+////                                                              ////
+//// This source is distributed in the hope that it will be       ////
+//// useful, but WITHOUT ANY WARRANTY; without even the implied   ////
+//// warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR      ////
+//// PURPOSE.  See the GNU Lesser General Public License for more ////
+//// details.                                                     ////
+////                                                              ////
+//// You should have received a copy of the GNU Lesser General    ////
+//// Public License along with this source; if not, download it   ////
+//// from http://www.opencores.org/lgpl.shtml                     ////
+////                                                              ////
+//////////////////////////////////////////////////////////////////////
+//
+// This is a synchronization element between two clock domains. It
+// uses toggle signaling - that is, clock domain 1 changes the state
+// of TOGGLE_IN to indicate a change, rather than setting the level
+// high.  When TOGGLE_IN changes state, the output on D_OUT will be
+// set to level '1', and will hold that value until D_RST is held
+// high during a rising edge of DEST_CLK.  D_OUT will be updated
+// on the second rising edge of DEST_CLK after the state of
+// TOGGLE_IN has changed.
+// RESET is asynchronous.  This is necessary to coordinate the reset
+// between different clock domains with potentially different reset
+// signals.
+//
+// Ports:
+// DEST_CLK:  Clock for the target clock domain
+// D_SET:     Synchronously set the output to '1'
+// D_CLR:     Synchronously reset the output to '0'
+// RESET:     Set all FF's to '0' (asynchronous)
+// TOGGLE_IN: Toggle data signal from source clock domain
+// D_OUT:     Output to clock domain 2
+
+
+// Top module
+module syncflop(
+                DEST_CLK,
+		D_SET,
+		D_RST,
+		RESETN,
+                TOGGLE_IN,
+                D_OUT
+		);
+
+
+   input   DEST_CLK;
+   input   D_SET;
+   input   D_RST;
+   input   RESETN;
+   input   TOGGLE_IN;
+   output  D_OUT;
+
+   reg 	   sync1;
+   reg 	   sync2;
+   reg 	   syncprev;
+   reg 	   srflop;
+   
+   wire    syncxor;
+   wire    srinput;
+   wire    D_OUT;
+
+   // Combinatorial assignments
+   assign  syncxor = sync2 ^ syncprev;
+   assign  srinput = syncxor | D_SET;  
+   assign  D_OUT = srflop | syncxor;
+ 	   
+   // First DFF (always enabled)
+   always @ (posedge DEST_CLK or negedge RESETN)
+     begin
+	if(~RESETN) sync1 <= 1'b0;
+	else sync1 <= TOGGLE_IN;
+     end
+
+	   
+   // Second DFF (always enabled)
+   always @ (posedge DEST_CLK or negedge RESETN)
+     begin
+	if(~RESETN) sync2 <= 1'b0;
+	else sync2 <= sync1;
+     end
+
+	   
+   // Third DFF (always enabled, used to detect toggles)
+   always @ (posedge DEST_CLK or negedge RESETN)
+     begin
+	if(~RESETN) syncprev <= 1'b0;
+	else syncprev <= sync2;
+     end
+
+   
+   // Set/Reset FF (holds detected toggles)
+   always @ (posedge DEST_CLK or negedge RESETN)
+     begin
+	if(~RESETN)         srflop <= 1'b0;
+	else if(D_RST)    srflop <= 1'b0;
+	else if (srinput) srflop <= 1'b1;
+     end
+   
+
+endmodule
diff --git a/verilog/rtl/ips/adv_dbg_if/rtl/syncreg.v b/verilog/rtl/ips/adv_dbg_if/rtl/syncreg.v
new file mode 100644
index 0000000..ecc9764
--- /dev/null
+++ b/verilog/rtl/ips/adv_dbg_if/rtl/syncreg.v
@@ -0,0 +1,158 @@
+//////////////////////////////////////////////////////////////////////
+////                                                              ////
+////  syncreg.v                                                   ////
+////                                                              ////
+////                                                              ////
+////  Synchronizes a register between two clock domains           ////
+////                                                              ////
+////  Author(s):                                                  ////
+////       Nathan Yawn (nathan.yawn@opencores.org)                ////
+////                                                              ////
+////                                                              ////
+////                                                              ////
+//////////////////////////////////////////////////////////////////////
+////                                                              ////
+//// Copyright (C) 2010 Authors                                   ////
+////                                                              ////
+//// This source file may be used and distributed without         ////
+//// restriction provided that this copyright statement is not    ////
+//// removed from the file and that any derivative work contains  ////
+//// the original copyright notice and the associated disclaimer. ////
+////                                                              ////
+//// This source file is free software; you can redistribute it   ////
+//// and/or modify it under the terms of the GNU Lesser General   ////
+//// Public License as published by the Free Software Foundation; ////
+//// either version 2.1 of the License, or (at your option) any   ////
+//// later version.                                               ////
+////                                                              ////
+//// This source is distributed in the hope that it will be       ////
+//// useful, but WITHOUT ANY WARRANTY; without even the implied   ////
+//// warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR      ////
+//// PURPOSE.  See the GNU Lesser General Public License for more ////
+//// details.                                                     ////
+////                                                              ////
+//// You should have received a copy of the GNU Lesser General    ////
+//// Public License along with this source; if not, download it   ////
+//// from http://www.opencores.org/lgpl.shtml                     ////
+////                                                              ////
+//////////////////////////////////////////////////////////////////////
+//
+// This is a synchronization element between two clock domains. Domain A
+// is considered the 'source' domain (produces the data), and Domain B
+// is considered the 'destination' domain (consumes the data).  It is assumed
+// that clock A is faster than clock B, but this element will work
+// regardless.  The idea here is NOT to insure that domain B sees every
+// change to the value generated by domain A.  Rather, this device
+// attempts to keep the value seen by domain B as current as possible,
+// always updating to the latest value of the input in domain A.
+// Thus, there may be dozens or hundreds of changes to register A
+// which are not seen by domain B.  There is no external acknowledge
+// of receipt from domain B.  Domain B simply wants the most current
+// value of register A possible at any given time.
+// Note the reset is asynchronous; this is necessary to coordinate between
+// two clock domains which may have separate reset signals.  I could find
+// no other way to insure correct initialization with two separate 
+// reset signals.
+//
+// Ports:
+// CLKA:  Clock for the source domain
+// CLKB:  Clock for the destination domain
+// RST:  Asynchronously resets all sync elements, prepares
+//       unit for operation.
+// DATA_IN:  Data input from clock domain A
+// DATA_OUT: Data output to clock domain B
+// 
+
+
+// Top module
+module syncreg (
+                CLKA,
+		CLKB,
+		RSTN,
+                DATA_IN,
+                DATA_OUT
+		);
+
+
+   input   CLKA;
+   input   CLKB;
+   input   RSTN;
+   input   [3:0] DATA_IN;
+   output  [3:0] DATA_OUT;
+
+   reg 	   [3:0] regA;
+   reg 	   [3:0] regB;
+   reg 	   strobe_toggle;
+   reg 	   ack_toggle;
+   
+   wire    A_not_equal;
+   wire    A_enable;
+   wire    strobe_sff_out;
+   wire    ack_sff_out;
+   wire [3:0]   DATA_OUT;
+
+   // Combinatorial assignments
+   assign  A_enable = A_not_equal & ack_sff_out;
+   assign  A_not_equal = !(DATA_IN == regA);
+   assign DATA_OUT = regB;   
+ 	   
+   // register A (latches input any time it changes)
+   always @ (posedge CLKA or negedge RSTN)
+     begin
+	if(~RSTN)
+	  regA <= 4'b0;
+	else if(A_enable)
+	  regA <= DATA_IN;
+     end
+
+	   
+   // register B (latches data from regA when enabled by the strobe SFF)
+   always @ (posedge CLKB or negedge RSTN)
+     begin
+	if(~RSTN)
+	  regB <= 4'b0;
+	else if(strobe_sff_out)
+	  regB <= regA;
+     end
+
+	   
+   // 'strobe' toggle FF
+   always @ (posedge CLKA or negedge RSTN)
+     begin
+	if(~RSTN)
+	  strobe_toggle <= 1'b0;
+	else if(A_enable)
+	  strobe_toggle <= ~strobe_toggle;
+     end
+
+   
+   // 'ack' toggle FF
+   // This is set to '1' at reset, to initialize the unit.
+   always @ (posedge CLKB or negedge RSTN)
+     begin
+	if(~RSTN)
+	  ack_toggle <= 1'b1;
+	else if (strobe_sff_out)
+	  ack_toggle <= ~ack_toggle;
+     end
+   
+   // 'strobe' sync element
+   syncflop strobe_sff (
+			.DEST_CLK (CLKB),
+			.D_SET (1'b0),
+			.D_RST (strobe_sff_out),
+			.RESETN (RSTN),
+			.TOGGLE_IN (strobe_toggle),
+			.D_OUT (strobe_sff_out)
+			);
+ 
+   // 'ack' sync element
+   syncflop ack_sff (
+		     .DEST_CLK (CLKA),
+		     .D_SET (1'b0),
+		     .D_RST (A_enable),
+		     .RESETN (RSTN),
+		     .TOGGLE_IN (ack_toggle),
+		     .D_OUT (ack_sff_out)
+		     );  
+endmodule