Test mangling GPIO test
diff --git a/verilog/dv/caravel/mgmt_soc/gpio/gpio.c b/verilog/dv/caravel/mgmt_soc/gpio/gpio.c
index 73dd397..ae6e621 100644
--- a/verilog/dv/caravel/mgmt_soc/gpio/gpio.c
+++ b/verilog/dv/caravel/mgmt_soc/gpio/gpio.c
@@ -1,115 +1,51 @@
-/*
- * SPDX-FileCopyrightText: 2020 Efabless Corporation
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- * SPDX-License-Identifier: Apache-2.0
- */
-
#include "../../defs.h"
+#include "../../stub.c"
+#include "printio.h"
-// --------------------------------------------------------
+void main() {
+ unsigned int s = 0;
+ for(int i = 0; i < 10000; i++) s += i;
+ printstr("test\n");
+ printstr((char*)0x30000050);
+ printstr("\n");
-/*
- * GPIO Test
- * Tests PU and PD on the lower 8 pins while being driven from outside
- * Tests Writing to the upper 8 pins
- * Tests reading from the lower 8 pins
- */
+ // Load key as 114849718896073566083416993308083054187
+ *((volatile uint32_t*) 0x30000040) = 1449607251;
+ *((volatile uint32_t*) 0x30000040) = 1734159223;
+ *((volatile uint32_t*) 0x30000040) = 1713582630;
+ *((volatile uint32_t*) 0x30000040) = 908945003;
-void main()
-{
- int i;
+ // Update key
+ *((volatile uint32_t*) 0x3000000C) = 1;
+ printstr("key\n");
+ while((*((volatile uint32_t*) 0x30000000) & 0x3) != 0x3);
- /* Set data out to zero */
- reg_mprj_datal = 0;
+ // Set IV to 94605682877008349257125771496548550738
+ *((volatile uint32_t*) 0x30000000) = 0;
+ *((volatile uint32_t*) 0x30000010) = 1194091594;
+ *((volatile uint32_t*) 0x30000010) = 577847158;
+ *((volatile uint32_t*) 0x30000010) = 1245724226;
+ *((volatile uint32_t*) 0x30000010) = 1512654930;
+ *((volatile uint32_t*) 0x30000008) = 1;
+ printstr("iv\n");
+ while((*((volatile uint32_t*) 0x30000000) & 0x4) != 0x4);
+ *((volatile uint32_t*) 0x30000000) = 8;
- /* Lower 8 pins are input and upper 8 pins are output */
- reg_mprj_io_31 = GPIO_MODE_MGMT_STD_OUTPUT;
- reg_mprj_io_30 = GPIO_MODE_MGMT_STD_OUTPUT;
- reg_mprj_io_29 = GPIO_MODE_MGMT_STD_OUTPUT;
- reg_mprj_io_28 = GPIO_MODE_MGMT_STD_OUTPUT;
- reg_mprj_io_27 = GPIO_MODE_MGMT_STD_OUTPUT;
- reg_mprj_io_26 = GPIO_MODE_MGMT_STD_OUTPUT;
- reg_mprj_io_25 = GPIO_MODE_MGMT_STD_OUTPUT;
- reg_mprj_io_24 = GPIO_MODE_MGMT_STD_OUTPUT;
+ // Encrypt 54758945827980741386470298169332301409
+ *((volatile uint32_t*) 0x30000010) = 691155065;
+ *((volatile uint32_t*) 0x30000010) = 845884219;
+ *((volatile uint32_t*) 0x30000010) = 1382968177;
+ *((volatile uint32_t*) 0x30000010) = 1333362273;
+ *((volatile uint32_t*) 0x30000004) = 1;
+ printstr("enc\n");
+ while((*((volatile uint32_t*) 0x30000000) & 0x4) != 0x4);
- reg_mprj_io_23 = GPIO_MODE_MGMT_STD_INPUT_NOPULL;
- reg_mprj_io_22 = GPIO_MODE_MGMT_STD_INPUT_NOPULL;
- reg_mprj_io_21 = GPIO_MODE_MGMT_STD_INPUT_NOPULL;
- reg_mprj_io_20 = GPIO_MODE_MGMT_STD_INPUT_NOPULL;
- reg_mprj_io_19 = GPIO_MODE_MGMT_STD_INPUT_NOPULL;
- reg_mprj_io_18 = GPIO_MODE_MGMT_STD_INPUT_NOPULL;
- reg_mprj_io_17 = GPIO_MODE_MGMT_STD_INPUT_NOPULL;
- reg_mprj_io_16 = GPIO_MODE_MGMT_STD_INPUT_NOPULL;
+ // Read back result
+ printhex(*((volatile uint32_t*) 0x30000030), true); // should be 2f93dcae
+ printhex(*((volatile uint32_t*) 0x30000034), true); // should be dbcedead
+ printhex(*((volatile uint32_t*) 0x30000038), true); // should be 545145d7
+ printhex(*((volatile uint32_t*) 0x3000003C), true); // should be aeb28360
- /* Apply configuration */
- reg_mprj_xfer = 1;
- while (reg_mprj_xfer == 1);
-
- // change the pull up and pull down (checked by the TB)
- reg_mprj_datal = 0xa0000000;
-
- reg_mprj_io_23 = GPIO_MODE_MGMT_STD_INPUT_PULLDOWN;
- reg_mprj_io_22 = GPIO_MODE_MGMT_STD_INPUT_PULLDOWN;
- reg_mprj_io_21 = GPIO_MODE_MGMT_STD_INPUT_PULLDOWN;
- reg_mprj_io_20 = GPIO_MODE_MGMT_STD_INPUT_PULLDOWN;
-
- reg_mprj_io_19 = GPIO_MODE_MGMT_STD_INPUT_PULLUP;
- reg_mprj_io_18 = GPIO_MODE_MGMT_STD_INPUT_PULLUP;
- reg_mprj_io_17 = GPIO_MODE_MGMT_STD_INPUT_PULLUP;
- reg_mprj_io_16 = GPIO_MODE_MGMT_STD_INPUT_PULLUP;
-
- /* Apply configuration */
- reg_mprj_xfer = 1;
- while (reg_mprj_xfer == 1);
-
- reg_mprj_datal = 0x0b000000;
-
- reg_mprj_io_23 = GPIO_MODE_MGMT_STD_INPUT_PULLUP;
- reg_mprj_io_22 = GPIO_MODE_MGMT_STD_INPUT_PULLUP;
- reg_mprj_io_21 = GPIO_MODE_MGMT_STD_INPUT_PULLUP;
- reg_mprj_io_20 = GPIO_MODE_MGMT_STD_INPUT_PULLUP;
-
- reg_mprj_io_19 = GPIO_MODE_MGMT_STD_INPUT_PULLDOWN;
- reg_mprj_io_18 = GPIO_MODE_MGMT_STD_INPUT_PULLDOWN;
- reg_mprj_io_17 = GPIO_MODE_MGMT_STD_INPUT_PULLDOWN;
- reg_mprj_io_16 = GPIO_MODE_MGMT_STD_INPUT_PULLDOWN;
-
- /* Apply configuration */
- reg_mprj_xfer = 1;
- while (reg_mprj_xfer == 1);
-
- reg_mprj_io_23 = GPIO_MODE_MGMT_STD_INPUT_PULLDOWN;
- reg_mprj_io_22 = GPIO_MODE_MGMT_STD_INPUT_PULLDOWN;
- reg_mprj_io_21 = GPIO_MODE_MGMT_STD_INPUT_PULLDOWN;
- reg_mprj_io_20 = GPIO_MODE_MGMT_STD_INPUT_PULLDOWN;
-
- reg_mprj_io_19 = GPIO_MODE_MGMT_STD_INPUT_PULLUP;
- reg_mprj_io_18 = GPIO_MODE_MGMT_STD_INPUT_PULLUP;
- reg_mprj_io_17 = GPIO_MODE_MGMT_STD_INPUT_PULLUP;
- reg_mprj_io_16 = GPIO_MODE_MGMT_STD_INPUT_PULLUP;
-
- /* Apply configuration */
- reg_mprj_xfer = 1;
- while (reg_mprj_xfer == 1);
-
- // read the lower 8 pins, add 1 then output the result
- // checked by the TB
- reg_mprj_datal = 0xab000000;
-
- while (1){
- int x = (reg_mprj_datal & 0xff0000) >> 16;
- reg_mprj_datal = (x+1) << 24;
- }
+ endtest();
}
diff --git a/verilog/dv/caravel/mgmt_soc/gpio/printio.h b/verilog/dv/caravel/mgmt_soc/gpio/printio.h
new file mode 100644
index 0000000..94da39d
--- /dev/null
+++ b/verilog/dv/caravel/mgmt_soc/gpio/printio.h
@@ -0,0 +1,115 @@
+void shift_char(char c) {
+ *((volatile char*)®_mprj_datal) = c;
+
+ reg_gpio_ena = 0;
+ reg_gpio_data = 1;
+ reg_gpio_data = 1;
+ // should be enough delay to detect output
+ reg_gpio_data = 0;
+}
+
+void setup_out() {
+ reg_mprj_io_7 = GPIO_MODE_MGMT_STD_OUTPUT;
+ reg_mprj_io_6 = GPIO_MODE_MGMT_STD_OUTPUT;
+ reg_mprj_io_5 = GPIO_MODE_MGMT_STD_OUTPUT;
+ reg_mprj_io_4 = GPIO_MODE_MGMT_STD_OUTPUT;
+ reg_mprj_io_3 = GPIO_MODE_MGMT_STD_OUTPUT;
+ reg_mprj_io_2 = GPIO_MODE_MGMT_STD_OUTPUT;
+ reg_mprj_io_1 = GPIO_MODE_MGMT_STD_OUTPUT;
+ reg_mprj_io_0 = GPIO_MODE_MGMT_STD_OUTPUT;
+
+ reg_mprj_xfer = 1;
+ while (reg_mprj_xfer == 1);
+}
+
+void write_char(char c) {
+ uint32_t tmp7 = reg_mprj_io_7;
+ uint32_t tmp6 = reg_mprj_io_6;
+ uint32_t tmp5 = reg_mprj_io_5;
+ uint32_t tmp4 = reg_mprj_io_4;
+ uint32_t tmp3 = reg_mprj_io_3;
+ uint32_t tmp2 = reg_mprj_io_2;
+ uint32_t tmp1 = reg_mprj_io_1;
+ uint32_t tmp0 = reg_mprj_io_0;
+
+ setup_out();
+
+ shift_char(c);
+
+ reg_mprj_io_7 = tmp7;
+ reg_mprj_io_6 = tmp6;
+ reg_mprj_io_5 = tmp5;
+ reg_mprj_io_4 = tmp4;
+ reg_mprj_io_3 = tmp3;
+ reg_mprj_io_2 = tmp2;
+ reg_mprj_io_1 = tmp1;
+ reg_mprj_io_0 = tmp0;
+
+ reg_mprj_xfer = 1;
+ while (reg_mprj_xfer == 1);
+}
+
+void printhex(uint32_t x, bool newline) {
+ uint32_t tmp7 = reg_mprj_io_7;
+ uint32_t tmp6 = reg_mprj_io_6;
+ uint32_t tmp5 = reg_mprj_io_5;
+ uint32_t tmp4 = reg_mprj_io_4;
+ uint32_t tmp3 = reg_mprj_io_3;
+ uint32_t tmp2 = reg_mprj_io_2;
+ uint32_t tmp1 = reg_mprj_io_1;
+ uint32_t tmp0 = reg_mprj_io_0;
+
+ setup_out();
+
+ char *s = "0123456789abcdef";
+
+ for (int i = 0; i < 8; i++) {
+ shift_char(s[(x & 0xF0000000) >> 28]);
+ x = x << 4;
+ }
+ if(newline) shift_char('\n');
+
+ reg_mprj_io_7 = tmp7;
+ reg_mprj_io_6 = tmp6;
+ reg_mprj_io_5 = tmp5;
+ reg_mprj_io_4 = tmp4;
+ reg_mprj_io_3 = tmp3;
+ reg_mprj_io_2 = tmp2;
+ reg_mprj_io_1 = tmp1;
+ reg_mprj_io_0 = tmp0;
+
+ reg_mprj_xfer = 1;
+ while (reg_mprj_xfer == 1);
+}
+
+void printstr(char *str) {
+ uint32_t tmp7 = reg_mprj_io_7;
+ uint32_t tmp6 = reg_mprj_io_6;
+ uint32_t tmp5 = reg_mprj_io_5;
+ uint32_t tmp4 = reg_mprj_io_4;
+ uint32_t tmp3 = reg_mprj_io_3;
+ uint32_t tmp2 = reg_mprj_io_2;
+ uint32_t tmp1 = reg_mprj_io_1;
+ uint32_t tmp0 = reg_mprj_io_0;
+
+ setup_out();
+
+ char c;
+ while (*str) shift_char(*str++);
+
+ reg_mprj_io_7 = tmp7;
+ reg_mprj_io_6 = tmp6;
+ reg_mprj_io_5 = tmp5;
+ reg_mprj_io_4 = tmp4;
+ reg_mprj_io_3 = tmp3;
+ reg_mprj_io_2 = tmp2;
+ reg_mprj_io_1 = tmp1;
+ reg_mprj_io_0 = tmp0;
+
+ reg_mprj_xfer = 1;
+ while (reg_mprj_xfer == 1);
+}
+
+void endtest() {
+ printstr("\x04");
+}