Revised the mprj_ctrl module verilog so that it does not generate
conflicting drivers for the register input from the viewpoint of the
synthesis tools. Updated the testbench to remove references to the
"mega-project", and made a few updates to the datasheet.
diff --git a/verilog/dv/caravel/mgmt_soc/mprj_ctrl/mprj_ctrl.c b/verilog/dv/caravel/mgmt_soc/mprj_ctrl/mprj_ctrl.c
index a48759f..75b41d4 100644
--- a/verilog/dv/caravel/mgmt_soc/mprj_ctrl/mprj_ctrl.c
+++ b/verilog/dv/caravel/mgmt_soc/mprj_ctrl/mprj_ctrl.c
@@ -3,7 +3,7 @@
// --------------------------------------------------------
/*
- * Mega-Project IO Control Test
+ * User Project IO Control Test
*/
void main()
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 ed06c6d..f8de811 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
@@ -39,43 +39,43 @@
$display("+1000 cycles");
end
$display("%c[1;31m",27);
- $display ("Monitor: Timeout, Test Mega-Project (RTL) Failed");
+ $display ("Monitor: Timeout, Test User Project (RTL) Failed");
$display("%c[0m",27);
$finish;
end
always @(checkbits) begin
if(checkbits == 4'h5) begin
- $display("Mega-Project control Test started");
+ $display("User Project control Test started");
end else if(checkbits == 4'h6) begin
$display("%c[1;31m",27);
- $display("Monitor: IO control R/W failed");
+ $display("Monitor: IO control R/W failed (check 6)");
$display("%c[0m",27);
$finish;
end else if(checkbits == 4'h7) begin
- $display("Monitor: IO control R/W passed");
+ $display("Monitor: IO control R/W passed (check 7)");
end else if(checkbits == 4'h8) begin
$display("%c[1;31m",27);
- $display("Monitor: power control R/W failed");
+ $display("Monitor: power control R/W failed (check 8)");
$display("%c[0m",27);
$finish;
end else if(checkbits == 4'h9) begin
- $display("Monitor: power control R/W passed");
+ $display("Monitor: power control R/W passed (check 9)");
end else if(checkbits == 4'ha) begin
$display("%c[1;31m",27);
- $display("Monitor: power control R/W failed");
+ $display("Monitor: power control R/W failed (check 10)");
$display("%c[0m",27);
$finish;
end else if(checkbits == 4'hb) begin
- $display("Monitor: power control R/W passed");
+ $display("Monitor: power control R/W passed (check 11)");
end else if(checkbits == 4'hc) begin
$display("%c[1;31m",27);
- $display("Monitor: power control R/W failed");
+ $display("Monitor: power control R/W failed (check 12)");
$display("%c[0m",27);
$finish;
end else if(checkbits == 4'hd) begin
- $display("Monitor: power control R/W passed");
- $display("Monitor: Mega-Project control (RTL) test passed.");
+ $display("Monitor: power control R/W passed (check 13)");
+ $display("Monitor: User Project control (RTL) test passed.");
$finish;
end
end
diff --git a/verilog/rtl/mprj_ctrl.v b/verilog/rtl/mprj_ctrl.v
index e0a4683..961b29a 100644
--- a/verilog/rtl/mprj_ctrl.v
+++ b/verilog/rtl/mprj_ctrl.v
@@ -129,6 +129,7 @@
wire pwr_data_sel;
wire xfer_sel;
wire [IO_PADS-1:0] io_ctrl_sel;
+ wire [31:0] iomem_rdata_pre;
wire [IO_PADS-1:0] mgmt_gpio_in;
@@ -142,11 +143,17 @@
assign jtag_oenb_state = io_ctrl[0][OEB];
assign sdo_oenb_state = io_ctrl[1][OEB];
- assign xfer_sel = (iomem_addr[7:0] == XFER);
- assign pwr_data_sel = (iomem_addr[7:0] == PWRDATA);
+ `define wtop (((i+1)*32 > IO_PADS) ? IO_PADS-1 : (i+1)*32-1)
+ `define wbot (i*32)
+ `define rtop (`wtop - `wbot)
genvar i;
+ // Assign selection bits per address
+
+ assign xfer_sel = (iomem_addr[7:0] == XFER);
+ assign pwr_data_sel = (iomem_addr[7:0] == PWRDATA);
+
generate
for (i=0; i<IO_WORDS; i=i+1) begin
assign io_data_sel[i] = (iomem_addr[7:0] == (IODATA + i*4));
@@ -159,7 +166,44 @@
end
endgenerate
- // I/O transfer of xfer bit. Also handles iomem_ready signal and power data.
+ // Set selection and iomem_rdata_pre
+
+ assign selected = xfer_sel || pwr_data_sel || (|io_data_sel) || (|io_ctrl_sel);
+
+ assign iomem_rdata_pre = (selected == 0) ? 0 :
+ (xfer_sel) ? {31'b0, busy} :
+ (pwr_data_sel) ? pwr_ctrl_out :
+ 'bz;
+
+ generate
+ for (i=0; i<IO_WORDS; i=i+1) begin
+ assign iomem_rdata_pre = (io_data_sel[i]) ? mgmt_gpio_in[`wtop:`wbot] : 'bz;
+ end
+
+ for (i=0; i<IO_PADS; i=i+1) begin
+ assign iomem_rdata_pre = (io_ctrl_sel[i]) ? io_ctrl[i] : 'bz;
+ end
+ endgenerate
+
+ // General I/O transfer
+
+ always @(posedge clk) begin
+ if (!resetn) begin
+ iomem_rdata <= 0;
+ iomem_ready <= 0;
+ end else begin
+ iomem_ready <= 0;
+ if (iomem_valid && !iomem_ready && iomem_addr[31:8] == BASE_ADR[31:8]) begin
+ iomem_ready <= 1'b 1;
+
+ if (selected) begin
+ iomem_rdata <= iomem_rdata_pre;
+ end
+ end
+ end
+ end
+
+ // I/O write of xfer bit. Also handles iomem_ready signal and power data.
always @(posedge clk) begin
if (!resetn) begin
@@ -168,13 +212,9 @@
end else begin
iomem_ready <= 0;
if (iomem_valid && !iomem_ready && iomem_addr[31:8] == BASE_ADR[31:8]) begin
- iomem_ready <= 1'b 1;
-
if (xfer_sel) begin
- iomem_rdata <= {31'd0, busy};
if (iomem_wstrb[0]) xfer_ctrl <= iomem_wdata[0];
end else if (pwr_data_sel) begin
- iomem_rdata <= pwr_ctrl_out;
if (iomem_wstrb[0]) pwr_ctrl_out <= iomem_wdata[PWR_PADS-1:0];
end
end else begin
@@ -186,10 +226,6 @@
// I/O transfer of gpio data to/from user project region under management
// SoC control
- `define wtop (((i+1)*32 > IO_PADS) ? IO_PADS-1 : (i+1)*32-1)
- `define wbot (i*32)
- `define rtop (`wtop - `wbot)
-
generate
for (i=0; i<IO_WORDS; i=i+1) begin
always @(posedge clk) begin
@@ -199,7 +235,6 @@
if (iomem_valid && !iomem_ready && iomem_addr[31:8] ==
BASE_ADR[31:8]) begin
if (io_data_sel[i]) begin
- iomem_rdata <= mgmt_gpio_in[`wtop:`wbot];
if (iomem_wstrb[0]) begin
mgmt_gpio_outr[`wtop:`wbot] <= iomem_wdata[`rtop:0];
end
@@ -224,7 +259,6 @@
if (iomem_valid && !iomem_ready &&
iomem_addr[31:8] == BASE_ADR[31:8]) begin
if (io_ctrl_sel[i]) begin
- iomem_rdata <= io_ctrl[i];
// NOTE: Byte-wide write to io_ctrl is prohibited
if (iomem_wstrb[0])
io_ctrl[i] <= iomem_wdata[IO_CTRL_BITS-1:0];
@@ -241,11 +275,6 @@
reg serial_clock;
reg serial_resetn;
- // NOTE: Ignoring power control bits for now. . . need to revisit.
- // Depends on how the power pads are arranged among the GPIO, and
- // whether or not switching will be internal and under the control
- // of the SoC.
-
reg [IO_CTRL_BITS-1:0] serial_data_staging;
wire serial_data_out;