Corrected an issue with the JTAG and SDO pins that prevented them from
being converted to general purpose digital I/O signals by the management
SoC. This was showing up in the timer testbench which was not seeing
the low two output bits.
diff --git a/verilog/dv/caravel/mgmt_soc/mprj_ctrl/mprj_ctrl_tb.v b/verilog/dv/caravel/mgmt_soc/mprj_ctrl/mprj_ctrl_tb.v
index 85f0c48..ed06c6d 100644
--- a/verilog/dv/caravel/mgmt_soc/mprj_ctrl/mprj_ctrl_tb.v
+++ b/verilog/dv/caravel/mgmt_soc/mprj_ctrl/mprj_ctrl_tb.v
@@ -14,7 +14,7 @@
wire flash_clk;
wire flash_io0;
wire flash_io1;
- wire [36:0] user_io;
+ wire [37:0] user_io;
wire SDO;
wire [3:0] checkbits;
diff --git a/verilog/dv/caravel/mgmt_soc/timer/timer_tb.v b/verilog/dv/caravel/mgmt_soc/timer/timer_tb.v
index 5218ee3..9d04404 100644
--- a/verilog/dv/caravel/mgmt_soc/timer/timer_tb.v
+++ b/verilog/dv/caravel/mgmt_soc/timer/timer_tb.v
@@ -69,26 +69,26 @@
/* Add checks here */
wait(checkbits == 6'h01);
- $display(" countbits = 0x%x (should be 0xdcba7eb0)", countbits);
- if(countbits !== 32'hdcba7eb0) begin
+ $display(" countbits = 0x%x (should be 0xdcba7eb3)", countbits);
+ if(countbits !== 32'hdcba7eb3) begin
$display("Monitor: Test Timer (RTL) Failed");
$finish;
end
wait(checkbits == 6'h02);
- $display(" countbits = 0x%x (should be 0x10)", countbits);
- if(countbits !== 32'h10) begin
+ $display(" countbits = 0x%x (should be 0x11)", countbits);
+ if(countbits !== 32'h11) begin
$display("Monitor: Test Timer (RTL) Failed");
$finish;
end
wait(checkbits == 6'h03);
- $display(" countbits = %x (should be 0x0c)", countbits);
- if(countbits !== 32'h0c) begin
+ $display(" countbits = %x (should be 0x0f)", countbits);
+ if(countbits !== 32'h0f) begin
$display("Monitor: Test Timer (RTL) Failed");
$finish;
end
wait(checkbits == 6'h04);
- $display(" countbits = %x (should be 0x0c)", countbits);
- if(countbits !== 32'h0c) begin
+ $display(" countbits = %x (should be 0x0f)", countbits);
+ if(countbits !== 32'h0f) begin
$display("Monitor: Test Timer (RTL) Failed");
$finish;
end
diff --git a/verilog/dv/caravel/mgmt_soc/timer2/timer2_tb.v b/verilog/dv/caravel/mgmt_soc/timer2/timer2_tb.v
index 30b54f1..b6db4b8 100644
--- a/verilog/dv/caravel/mgmt_soc/timer2/timer2_tb.v
+++ b/verilog/dv/caravel/mgmt_soc/timer2/timer2_tb.v
@@ -69,26 +69,26 @@
/* Add checks here */
wait(checkbits == 6'h01);
- $display(" countbits = 0x%x (should be 0xdcba7eb0)", countbits);
- if(countbits !== 32'hdcba7eb0) begin
+ $display(" countbits = 0x%x (should be 0xdcba7eb3)", countbits);
+ if(countbits !== 32'hdcba7eb3) begin
$display("Monitor: Test Timer2 (RTL) Failed");
$finish;
end
wait(checkbits == 6'h02);
- $display(" countbits = 0x%x (should be 0x10)", countbits);
- if(countbits !== 32'h10) begin
+ $display(" countbits = 0x%x (should be 0x11)", countbits);
+ if(countbits !== 32'h11) begin
$display("Monitor: Test Timer2 (RTL) Failed");
$finish;
end
wait(checkbits == 6'h03);
- $display(" countbits = %x (should be 0x0c)", countbits);
- if(countbits !== 32'h0c) begin
+ $display(" countbits = %x (should be 0x0f)", countbits);
+ if(countbits !== 32'h0f) begin
$display("Monitor: Test Timer (RTL) Failed");
$finish;
end
wait(checkbits == 6'h04);
- $display(" countbits = %x (should be 0x0c)", countbits);
- if(countbits !== 32'h0c) begin
+ $display(" countbits = %x (should be 0x0f)", countbits);
+ if(countbits !== 32'h0f) begin
$display("Monitor: Test Timer2 (RTL) Failed");
$finish;
end
@@ -100,8 +100,8 @@
end
wait(checkbits == 6'h06);
- $display(" countbits = %x (should be 0x0054)", countbits);
- if(countbits !== 32'h0054) begin
+ $display(" countbits = %x (should be 0x0055)", countbits);
+ if(countbits !== 32'h0055) begin
$display("Monitor: Test Timer2 (RTL) Failed");
$finish;
end
@@ -114,8 +114,8 @@
end
wait(checkbits == 6'h08);
- $display(" countbits = %x (should be 0x0218)", countbits);
- if(countbits !== 32'h0218) begin
+ $display(" countbits = %x (should be 0x0219)", countbits);
+ if(countbits !== 32'h0219) begin
$display("Monitor: Test Timer2 (RTL) Failed");
$finish;
end
diff --git a/verilog/rtl/caravel.v b/verilog/rtl/caravel.v
index a9caf12..b55ec62 100644
--- a/verilog/rtl/caravel.v
+++ b/verilog/rtl/caravel.v
@@ -488,7 +488,7 @@
gpio_control_block #(
.DM_INIT(3'b110), // Mode = output, strong up/down
- .OENB_INIT(1'b0) // Enable output signaling from wire
+ .OENB_INIT(1'b1) // Enable output signaling from wire
) gpio_control_bidir [1:0] (
`ifdef LVS
inout vccd,
diff --git a/verilog/rtl/counter_timer_low.v b/verilog/rtl/counter_timer_low.v
index 66989d2..b9e1191 100755
--- a/verilog/rtl/counter_timer_low.v
+++ b/verilog/rtl/counter_timer_low.v
@@ -168,7 +168,6 @@
assign value_cur_plus = value_cur + 1;
assign value_cur_minus = value_cur - 1;
-assign loc_enable = enable_in && enable;
assign loc_enable = (chain == 1'b1) ? (enable && enable_in) : enable;
assign enable_out = enable;
diff --git a/verilog/rtl/mgmt_core.v b/verilog/rtl/mgmt_core.v
index e7511c6..4db3ada 100644
--- a/verilog/rtl/mgmt_core.v
+++ b/verilog/rtl/mgmt_core.v
@@ -75,15 +75,25 @@
wire hk_connect;
// JTAG (to be implemented)
- wire jtag_out = 1'b0;
+ wire jtag_out;
+ wire jtag_out_pre = 1'b0;
wire jtag_outenb = 1'b1;
+ // SDO
+ wire sdo_out;
+ wire sdo_out_pre;
+
// Housekeeping SPI vectors
wire [4:0] spi_pll_div;
wire [2:0] spi_pll_sel;
wire [2:0] spi_pll90_sel;
wire [25:0] spi_pll_trim;
+ // Override default function for SDO and JTAG outputs if purposely
+ // set for override by the management SoC.
+ assign sdo_out = (sdo_oenb_state == 1'b0) ? mgmt_out_data[1] : sdo_out_pre;
+ assign jtag_out = (jtag_oenb_state == 1'b0) ? mgmt_out_data[0] : jtag_out_pre;
+
caravel_clocking clocking(
`ifdef LVS
.vdd1v8(vdd1v8),
@@ -177,6 +187,9 @@
.pass_thru_mgmt_sck(pass_thru_mgmt_sck),
.pass_thru_mgmt_sdi(pass_thru_mgmt_sdi),
.pass_thru_mgmt_sdo(pass_thru_mgmt_sdo),
+ // SDO and JTAG state for output override
+ .sdo_oenb_state(sdo_oenb_state),
+ .jtag_oenb_state(jtag_oenb_state),
// SPI master->slave direct connection
.hk_connect(hk_connect),
// Secondary clock (for monitoring)
@@ -231,7 +244,7 @@
.SCK((hk_connect) ? mgmt_out_data[4] : mgmt_in_data[4]),
.SDI((hk_connect) ? mgmt_out_data[2] : mgmt_in_data[2]),
.CSB((hk_connect) ? mgmt_out_data[3] : mgmt_in_data[3]),
- .SDO(sdo_out),
+ .SDO(sdo_out_pre),
.sdo_enb(sdo_outenb),
.pll_dco_ena(spi_pll_dco_ena),
.pll_sel(spi_pll_sel),
diff --git a/verilog/rtl/mgmt_soc.v b/verilog/rtl/mgmt_soc.v
index 67a2c17..f92fa36 100644
--- a/verilog/rtl/mgmt_soc.v
+++ b/verilog/rtl/mgmt_soc.v
@@ -124,6 +124,9 @@
input pass_thru_mgmt_sdi,
output pass_thru_mgmt_sdo,
+ // State of JTAG and SDO pins (override for management output use)
+ output sdo_oenb_state,
+ output jtag_oenb_state,
// SPI master->slave direct link
output hk_connect,
// User clock monitoring
@@ -693,6 +696,8 @@
.serial_clock(mprj_io_loader_clock),
.serial_resetn(mprj_io_loader_resetn),
.serial_data_out(mprj_io_loader_data),
+ .sdo_oenb_state(sdo_oenb_state),
+ .jtag_oenb_state(jtag_oenb_state),
.mgmt_gpio_out(mgmt_out_pre),
.mgmt_gpio_in(mgmt_in_data)
);
diff --git a/verilog/rtl/mprj_ctrl.v b/verilog/rtl/mprj_ctrl.v
index ff04158..d7b8ec3 100644
--- a/verilog/rtl/mprj_ctrl.v
+++ b/verilog/rtl/mprj_ctrl.v
@@ -24,6 +24,11 @@
output serial_resetn,
output serial_data_out,
+ // Pass state of OEB bit on SDO and JTAG back to the core
+ // so that the function can be overridden for management output
+ output sdo_oenb_state,
+ output jtag_oenb_state,
+
// Read/write data to each GPIO pad from management SoC
input [IO_PADS-1:0] mgmt_gpio_in,
output [IO_PADS-1:0] mgmt_gpio_out
@@ -59,6 +64,8 @@
.serial_clock(serial_clock),
.serial_resetn(serial_resetn),
.serial_data_out(serial_data_out),
+ .sdo_oenb_state(sdo_oenb_state),
+ .jtag_oenb_state(jtag_oenb_state),
// .mgmt_gpio_io(mgmt_gpio_io)
.mgmt_gpio_in(mgmt_gpio_in),
.mgmt_gpio_out(mgmt_gpio_out)
@@ -89,6 +96,8 @@
output serial_clock,
output serial_resetn,
output serial_data_out,
+ output sdo_oenb_state,
+ output jtag_oenb_state,
input [IO_PADS-1:0] mgmt_gpio_in,
output [IO_PADS-1:0] mgmt_gpio_out
);
@@ -119,6 +128,16 @@
wire [PWR_PADS-1:0] pwr_ctrl_sel;
wire [IO_PADS-1:0] mgmt_gpio_in;
+ wire sdo_oenb_state, jtag_oenb_state;
+
+ // JTAG and housekeeping SDO are normally controlled by their respective
+ // modules with OEB set to the default 1 value. If configured for an
+ // additional output by setting the OEB bit low, then pass this information
+ // back to the core so that the default signals can be overridden.
+
+ assign jtag_oenb_state = io_ctrl[0][OEB];
+ assign sdo_oenb_state = io_ctrl[1][OEB];
+
assign xfer_sel = (iomem_addr[7:0] == XFER_ADJ);
genvar i;
@@ -195,10 +214,10 @@
always @(posedge clk) begin
if (!resetn) begin
// NOTE: This initialization must match the defaults passed
- // to the control blocks. Specifically, 0x1801 is for a
+ // to the control blocks. Specifically, 0x1803 is for a
// bidirectional pad, and 0x0403 is for a simple input pad
if (i < 2) begin
- io_ctrl[i] <= 'h1801;
+ io_ctrl[i] <= 'h1803;
end else begin
io_ctrl[i] <= 'h0403;
end