Merge branch 'main' of https://github.com/AmoghLonkar/openram_testchip into main
diff --git a/verilog/dv/gpio_test/gpio_test.c b/verilog/dv/gpio_test/gpio_test.c
index fa53b87..f071539 100644
--- a/verilog/dv/gpio_test/gpio_test.c
+++ b/verilog/dv/gpio_test/gpio_test.c
@@ -20,9 +20,9 @@
#include "verilog/dv/caravel/stub.c"
/*
- GPIO Test:
- - Configures MPRJ pin 21 as outputs
- - Observes gpio out value (in the testbench)
+ IO Test:
+ - Configures MPRJ lower 8-IO pins as outputs
+ - Observes counter value through the MPRJ lower 8 IO pins (in the testbench)
*/
void main()
@@ -53,10 +53,17 @@
// so that the CSB line is not left floating. This allows
// all of the GPIO pins to be used for user functions.
- // Configure IO pin 21 as user output
- // Observe value in the testbench
+ // Configure Pin 22 as user output
+ // Observe counter value in the testbench
reg_mprj_io_22 = GPIO_MODE_USER_STD_OUTPUT;
+ reg_mprj_io_15 = GPIO_MODE_USER_STD_INPUT_NOPULL;
+ reg_mprj_io_16 = GPIO_MODE_USER_STD_INPUT_NOPULL;
+ reg_mprj_io_17 = GPIO_MODE_USER_STD_INPUT_NOPULL;
+ reg_mprj_io_18 = GPIO_MODE_USER_STD_INPUT_NOPULL;
+ reg_mprj_io_19 = GPIO_MODE_USER_STD_INPUT_NOPULL;
+ reg_mprj_io_20 = GPIO_MODE_USER_STD_INPUT_NOPULL;
+ reg_mprj_io_21 = GPIO_MODE_USER_STD_INPUT_NOPULL;
/* Apply configuration */
reg_mprj_xfer = 1;
while (reg_mprj_xfer == 1);
diff --git a/verilog/dv/gpio_test/gpio_test_tb.v b/verilog/dv/gpio_test/gpio_test_tb.v
index 522ef0b..8249637 100644
--- a/verilog/dv/gpio_test/gpio_test_tb.v
+++ b/verilog/dv/gpio_test/gpio_test_tb.v
@@ -32,9 +32,6 @@
wire [37:0] mprj_io;
wire mprj_io_22;
- reg gpio_clk;
- assign gpio_clk = mprj_io[17];
-
assign mprj_io_22 = mprj_io[22];
// assign mprj_io_0 = {mprj_io[8:4],mprj_io[2:0]};
@@ -45,43 +42,127 @@
// simulation. Normally this would be a slow clock and the digital PLL
// would be the fast clock.
- always #5 clock <= (clock === 1'b0);
+ always #12.5 clock <= (clock === 1'b0);
initial begin
clock = 0;
end
+
+ reg gpio_clk;
+ reg gpio_scan;
+ reg gpio_sram_load;
+ reg global_csb;
+ reg gpio_in;
+ assign mprj_io[15] = 1;
+ assign mprj_io[16] = 1;
+ assign mprj_io[17] = gpio_clk;
+ assign mprj_io[18] = gpio_in;
+ assign mprj_io[20] = gpio_scan;
+ assign mprj_io[21] = gpio_sram_load;
+
+ always #12.5 gpio_clk = !gpio_clk;
+
initial begin
$dumpfile("gpio_test.vcd");
$dumpvars(0, gpio_test_tb);
-
- //mprj_io[15] = 1;
- //mprj_io[21] = 1;
- //mprj_io[17] = 1;
-
- /*
+
// Repeat cycles of 1000 clock edges as needed to complete testbench
repeat (25) begin
repeat (1000) @(posedge clock);
// $display("+1000 cycles");
end
- $display("%c[1;31m",27);
`ifdef GL
- $display ("Monitor: Timeout, Test Mega-Project IO Ports (GL) Failed");
+ $display ("Monitor: Timeout, Test GPIO Full Chip Sim (GL) Failed");
`else
- $display ("Monitor: Timeout, Test Mega-Project IO Ports (RTL) Failed");
+ $display ("Monitor: Timeout, Test GPIO Full Chip Sim (RTL) Failed");
`endif
- $display("%c[0m",27);
$finish;
- */
end
- always #5 assign gpio_clk = !gpio_clk;
+ integer i, j;
+ reg [3:0] sel;
+ reg [111:0] in_data;
+ reg [111:0] out_data;
initial begin
- // Observe Output pins [22]
- //wait(mprj_io_22 == 8'h00);
+ gpio_clk = 1;
+ global_csb = 1;
+
+ //Testing 32B Dual Port Memories
+ for(i = 0; i < 5; i = i + 1) begin
+ sel = i;
+
+ //Write 1 to addr1 using GPIO Pins
+ gpio_scan = 1;
+ gpio_sram_load = 0;
+ in_data = {sel, 16'd1, 32'd1, 1'b0, 1'b0, 4'd15, 16'd0, 32'd0, 1'b1, 1'b1, 4'd0};
+
+ for(j = 0; j < 112; j = j + 1) begin
+ gpio_in = in_data[111 - j];
+ #10;
+ end
+
+ gpio_scan = 0;
+ global_csb = 0;
+ #10;
+ global_csb = 1;
+ gpio_sram_load = 1;
+ #10;
+
+ //Write 2 to addr2 using GPIO Pins
+ gpio_scan = 1;
+ gpio_sram_load = 0;
+ in_data = {sel, 16'd2, 32'd2, 1'b0, 1'b0, 4'd15, 16'd0, 32'd0, 1'b1, 1'b1, 4'd0};
+
+ for(j = 0; j < 112; j = j + 1) begin
+ gpio_in = in_data[111 - j];
+ #10;
+ end
+
+ gpio_scan = 0;
+ global_csb = 0;
+ #10;
+ global_csb = 1;
+ gpio_sram_load = 1;
+ #10;
+
+ #10;
+ //Read addr1 and addr2
+ gpio_scan = 1;
+ gpio_sram_load = 0;
+ in_data = {sel, 16'd1, 32'd0, 1'b0, 1'b1, 4'd0, 16'd2, 32'd0, 1'b0, 1'b1, 4'd0};
+
+ for(j = 0; j < 112; j = j + 1) begin
+ gpio_in = in_data[111 - j];
+ #10;
+ end
+
+ gpio_scan = 0;
+ global_csb = 0;
+ #10;
+ global_csb = 1;
+ gpio_sram_load = 1;
+ #10;
+
+ #10
+ gpio_sram_load = 0;
+ gpio_scan = 1;
+ for(j = 0; j < 112; j = j + 1) begin
+ out_data[111 - j] = mprj_io_22;
+ #10;
+ end
+ #10;
+ //`assert(out_data, {sel, 16'd1, 32'd1, 1'b0, 1'b1, 4'd0, 16'd2, 32'd2, 1'b0, 1'b1, 4'd0});
+ end
+
+ #10; $finish;
+ end
+
+ initial begin
+ // Observe Output pin 22
+ wait(mprj_io_22 == 8'h01);
/*
`ifdef GL
@@ -90,11 +171,9 @@
$display("Monitor: Test 1 Mega-Project IO (RTL) Passed");
`endif
*/
- //$finish;
+ $finish;
end
-
-
initial begin
RSTB <= 1'b0;
CSB <= 1'b1; // Force CSB high
@@ -120,7 +199,7 @@
end
always @(mprj_io) begin
- #1 $display("MPRJ-IO state = %b ", mprj_io[22]);
+ //#1 $display("MPRJ-IO state = %b ", mprj_io[22]);
end
wire flash_csb;
diff --git a/verilog/rtl/openram_testchip_gpio_tb.v b/verilog/rtl/openram_testchip_gpio_tb.v
index d8f0116..df152e8 100644
--- a/verilog/rtl/openram_testchip_gpio_tb.v
+++ b/verilog/rtl/openram_testchip_gpio_tb.v
@@ -28,7 +28,7 @@
reg gpio_in;
reg gpio_scan;
reg gpio_sram_load;
- reg global_csr;
+ reg global_csb;
wire [`ADDR_SIZE-1:0] addr0;
wire [`DATA_SIZE-1:0] din0;
@@ -86,7 +86,7 @@
.gpio_in(gpio_in),
.gpio_scan(gpio_scan),
.gpio_sram_load(gpio_sram_load),
- .global_csr(global_csr),
+ .global_csb(global_csb),
.sram0_data0(sram0_data0),
.sram0_data1(sram0_data1),
.sram1_data0(sram1_data0),
@@ -332,7 +332,7 @@
la_sram_load = 0;
la_data_in = 0;
resetn = 1;
- global_csr = 1;
+ global_csb = 1;
clk = 1;
//Testing 32B Dual Port Memories
@@ -350,9 +350,9 @@
end
gpio_scan = 0;
- global_csr = 0;
+ global_csb = 0;
#10;
- global_csr = 1;
+ global_csb = 1;
gpio_sram_load = 1;
#10;
@@ -367,9 +367,9 @@
end
gpio_scan = 0;
- global_csr = 0;
+ global_csb = 0;
#10;
- global_csr = 1;
+ global_csb = 1;
gpio_sram_load = 1;
#10;
@@ -385,9 +385,9 @@
end
gpio_scan = 0;
- global_csr = 0;
+ global_csb = 0;
#10;
- global_csr = 1;
+ global_csb = 1;
gpio_sram_load = 1;
#10;
@@ -417,9 +417,9 @@
end
gpio_scan = 0;
- global_csr = 0;
+ global_csb = 0;
#10;
- global_csr = 1;
+ global_csb = 1;
gpio_sram_load = 1;
#10;
@@ -434,9 +434,9 @@
end
gpio_scan = 0;
- global_csr = 0;
+ global_csb = 0;
#10;
- global_csr = 1;
+ global_csb = 1;
gpio_sram_load = 1;
#10;
@@ -465,9 +465,9 @@
end
gpio_scan = 0;
- global_csr = 0;
+ global_csb = 0;
#10;
- global_csr = 1;
+ global_csb = 1;
gpio_sram_load = 1;
#10;
@@ -482,9 +482,9 @@
end
gpio_scan = 0;
- global_csr = 0;
+ global_csb = 0;
#10;
- global_csr = 1;
+ global_csb = 1;
gpio_sram_load = 1;
#10;
diff --git a/verilog/rtl/user_project_wrapper.v b/verilog/rtl/user_project_wrapper.v
index a958105..b87ab89 100644
--- a/verilog/rtl/user_project_wrapper.v
+++ b/verilog/rtl/user_project_wrapper.v
@@ -98,11 +98,10 @@
wire in_select = io_in[16];
wire resetn = io_in[15];
wire gpio_clk = io_in[17];
- wire gpio_sram_clk = io_in[18];
wire gpio_scan = io_in[19];
wire gpio_sram_load = io_in[20];
wire global_csb = io_in[21];
- wire gpio_in = io_in[22];
+ wire gpio_in = io_in[18];
wire la_clk = la_data_in[127];
wire la_in_load = la_data_in[125];
wire la_sram_load = la_data_in[124];