Add CAN IP test case 2
diff --git a/verilog/dv/can_test_2/Makefile b/verilog/dv/can_test_2/Makefile
new file mode 100644
index 0000000..3fd0b56
--- /dev/null
+++ b/verilog/dv/can_test_2/Makefile
@@ -0,0 +1,32 @@
+# 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
+
+
+
+PWDD := $(shell pwd)
+BLOCKS := $(shell basename $(PWDD))
+
+# ---- Include Partitioned Makefiles ----
+
+CONFIG = caravel_user_project
+
+
+include $(MCW_ROOT)/verilog/dv/make/env.makefile
+include $(MCW_ROOT)/verilog/dv/make/var.makefile
+include $(MCW_ROOT)/verilog/dv/make/cpu.makefile
+include $(MCW_ROOT)/verilog/dv/make/sim.makefile
+
+
diff --git a/verilog/dv/can_test_2/YONGA_CAN_IP_regs.h b/verilog/dv/can_test_2/YONGA_CAN_IP_regs.h
new file mode 100644
index 0000000..89b992a
--- /dev/null
+++ b/verilog/dv/can_test_2/YONGA_CAN_IP_regs.h
@@ -0,0 +1,188 @@
+// -----------------------------------------------------------------------------
+// 'YONGA_CAN_IP' Register Definitions
+// Revision: 68
+// -----------------------------------------------------------------------------
+// Generated on 2022-09-07 at 10:18 (UTC) by airhdl version 2022.08.2-618538036
+// -----------------------------------------------------------------------------
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
+// LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+// POSSIBILITY OF SUCH DAMAGE.
+// -----------------------------------------------------------------------------
+
+#ifndef YONGA_CAN_IP_REGS_H
+#define YONGA_CAN_IP_REGS_H
+
+/* Revision number of the 'YONGA_CAN_IP' register map */
+#define YONGA_CAN_IP_REVISION 68
+
+/* Default base address of the 'YONGA_CAN_IP' register map */
+#define YONGA_CAN_IP_DEFAULT_BASEADDR 0xA0000000
+
+/* Size of the 'YONGA_CAN_IP' register map, in bytes */
+#define YONGA_CAN_IP_RANGE_BYTES 28
+
+/* Register 'BAUD_RATE_CFG' */
+#define BAUD_RATE_CFG_OFFSET 0x00000000 /* address offset of the 'BAUD_RATE_CFG' register */
+
+/* Field 'BAUD_RATE_CFG.TSEG2' */
+#define BAUD_RATE_CFG_TSEG2_BIT_OFFSET 0 /* bit offset of the 'TSEG2' field */
+#define BAUD_RATE_CFG_TSEG2_BIT_WIDTH 9 /* bit width of the 'TSEG2' field */
+#define BAUD_RATE_CFG_TSEG2_BIT_MASK 0x000001FF /* bit mask of the 'TSEG2' field */
+#define BAUD_RATE_CFG_TSEG2_RESET 0x0 /* reset value of the 'TSEG2' field */
+
+/* Field 'BAUD_RATE_CFG.TSEG1' */
+#define BAUD_RATE_CFG_TSEG1_BIT_OFFSET 9 /* bit offset of the 'TSEG1' field */
+#define BAUD_RATE_CFG_TSEG1_BIT_WIDTH 9 /* bit width of the 'TSEG1' field */
+#define BAUD_RATE_CFG_TSEG1_BIT_MASK 0x0003FE00 /* bit mask of the 'TSEG1' field */
+#define BAUD_RATE_CFG_TSEG1_RESET 0x0 /* reset value of the 'TSEG1' field */
+
+/* Field 'BAUD_RATE_CFG.BRP' */
+#define BAUD_RATE_CFG_BRP_BIT_OFFSET 18 /* bit offset of the 'BRP' field */
+#define BAUD_RATE_CFG_BRP_BIT_WIDTH 9 /* bit width of the 'BRP' field */
+#define BAUD_RATE_CFG_BRP_BIT_MASK 0x07FC0000 /* bit mask of the 'BRP' field */
+#define BAUD_RATE_CFG_BRP_RESET 0x0 /* reset value of the 'BRP' field */
+
+/* Field 'BAUD_RATE_CFG.SJW' */
+#define BAUD_RATE_CFG_SJW_BIT_OFFSET 27 /* bit offset of the 'SJW' field */
+#define BAUD_RATE_CFG_SJW_BIT_WIDTH 5 /* bit width of the 'SJW' field */
+#define BAUD_RATE_CFG_SJW_BIT_MASK 0xF8000000 /* bit mask of the 'SJW' field */
+#define BAUD_RATE_CFG_SJW_RESET 0x0 /* reset value of the 'SJW' field */
+
+/* Register 'MSG_ID' */
+#define MSG_ID_OFFSET 0x00000004 /* address offset of the 'MSG_ID' register */
+
+/* Field 'MSG_ID.EID' */
+#define MSG_ID_EID_BIT_OFFSET 0 /* bit offset of the 'EID' field */
+#define MSG_ID_EID_BIT_WIDTH 18 /* bit width of the 'EID' field */
+#define MSG_ID_EID_BIT_MASK 0x0003FFFF /* bit mask of the 'EID' field */
+#define MSG_ID_EID_RESET 0x0 /* reset value of the 'EID' field */
+
+/* Field 'MSG_ID.IDE' */
+#define MSG_ID_IDE_BIT_OFFSET 18 /* bit offset of the 'IDE' field */
+#define MSG_ID_IDE_BIT_WIDTH 1 /* bit width of the 'IDE' field */
+#define MSG_ID_IDE_BIT_MASK 0x00040000 /* bit mask of the 'IDE' field */
+#define MSG_ID_IDE_RESET 0x0 /* reset value of the 'IDE' field */
+
+/* Field 'MSG_ID.SID' */
+#define MSG_ID_SID_BIT_OFFSET 19 /* bit offset of the 'SID' field */
+#define MSG_ID_SID_BIT_WIDTH 11 /* bit width of the 'SID' field */
+#define MSG_ID_SID_BIT_MASK 0x3FF80000 /* bit mask of the 'SID' field */
+#define MSG_ID_SID_RESET 0x0 /* reset value of the 'SID' field */
+
+/* Register 'MSG_CFG' */
+#define MSG_CFG_OFFSET 0x00000008 /* address offset of the 'MSG_CFG' register */
+
+/* Field 'MSG_CFG.DLC' */
+#define MSG_CFG_DLC_BIT_OFFSET 0 /* bit offset of the 'DLC' field */
+#define MSG_CFG_DLC_BIT_WIDTH 4 /* bit width of the 'DLC' field */
+#define MSG_CFG_DLC_BIT_MASK 0x0000000F /* bit mask of the 'DLC' field */
+#define MSG_CFG_DLC_RESET 0x0 /* reset value of the 'DLC' field */
+
+/* Field 'MSG_CFG.RTR' */
+#define MSG_CFG_RTR_BIT_OFFSET 4 /* bit offset of the 'RTR' field */
+#define MSG_CFG_RTR_BIT_WIDTH 1 /* bit width of the 'RTR' field */
+#define MSG_CFG_RTR_BIT_MASK 0x00000010 /* bit mask of the 'RTR' field */
+#define MSG_CFG_RTR_RESET 0x0 /* reset value of the 'RTR' field */
+
+/* Register 'DATA_REG1' */
+#define DATA_REG1_OFFSET 0x0000000C /* address offset of the 'DATA_REG1' register */
+
+/* Field 'DATA_REG1.DATA_BYTE_0' */
+#define DATA_REG1_DATA_BYTE_0_BIT_OFFSET 0 /* bit offset of the 'DATA_BYTE_0' field */
+#define DATA_REG1_DATA_BYTE_0_BIT_WIDTH 8 /* bit width of the 'DATA_BYTE_0' field */
+#define DATA_REG1_DATA_BYTE_0_BIT_MASK 0x000000FF /* bit mask of the 'DATA_BYTE_0' field */
+#define DATA_REG1_DATA_BYTE_0_RESET 0x0 /* reset value of the 'DATA_BYTE_0' field */
+
+/* Field 'DATA_REG1.DATA_BYTE_1' */
+#define DATA_REG1_DATA_BYTE_1_BIT_OFFSET 8 /* bit offset of the 'DATA_BYTE_1' field */
+#define DATA_REG1_DATA_BYTE_1_BIT_WIDTH 8 /* bit width of the 'DATA_BYTE_1' field */
+#define DATA_REG1_DATA_BYTE_1_BIT_MASK 0x0000FF00 /* bit mask of the 'DATA_BYTE_1' field */
+#define DATA_REG1_DATA_BYTE_1_RESET 0x0 /* reset value of the 'DATA_BYTE_1' field */
+
+/* Field 'DATA_REG1.DATA_BYTE_2' */
+#define DATA_REG1_DATA_BYTE_2_BIT_OFFSET 16 /* bit offset of the 'DATA_BYTE_2' field */
+#define DATA_REG1_DATA_BYTE_2_BIT_WIDTH 8 /* bit width of the 'DATA_BYTE_2' field */
+#define DATA_REG1_DATA_BYTE_2_BIT_MASK 0x00FF0000 /* bit mask of the 'DATA_BYTE_2' field */
+#define DATA_REG1_DATA_BYTE_2_RESET 0x0 /* reset value of the 'DATA_BYTE_2' field */
+
+/* Field 'DATA_REG1.DATA_BYTE_3' */
+#define DATA_REG1_DATA_BYTE_3_BIT_OFFSET 24 /* bit offset of the 'DATA_BYTE_3' field */
+#define DATA_REG1_DATA_BYTE_3_BIT_WIDTH 8 /* bit width of the 'DATA_BYTE_3' field */
+#define DATA_REG1_DATA_BYTE_3_BIT_MASK 0xFF000000 /* bit mask of the 'DATA_BYTE_3' field */
+#define DATA_REG1_DATA_BYTE_3_RESET 0x0 /* reset value of the 'DATA_BYTE_3' field */
+
+/* Register 'DATA_REG2' */
+#define DATA_REG2_OFFSET 0x00000010 /* address offset of the 'DATA_REG2' register */
+
+/* Field 'DATA_REG2.DATA_BYTE_4' */
+#define DATA_REG2_DATA_BYTE_4_BIT_OFFSET 0 /* bit offset of the 'DATA_BYTE_4' field */
+#define DATA_REG2_DATA_BYTE_4_BIT_WIDTH 8 /* bit width of the 'DATA_BYTE_4' field */
+#define DATA_REG2_DATA_BYTE_4_BIT_MASK 0x000000FF /* bit mask of the 'DATA_BYTE_4' field */
+#define DATA_REG2_DATA_BYTE_4_RESET 0x0 /* reset value of the 'DATA_BYTE_4' field */
+
+/* Field 'DATA_REG2.DATA_BYTE_5' */
+#define DATA_REG2_DATA_BYTE_5_BIT_OFFSET 8 /* bit offset of the 'DATA_BYTE_5' field */
+#define DATA_REG2_DATA_BYTE_5_BIT_WIDTH 8 /* bit width of the 'DATA_BYTE_5' field */
+#define DATA_REG2_DATA_BYTE_5_BIT_MASK 0x0000FF00 /* bit mask of the 'DATA_BYTE_5' field */
+#define DATA_REG2_DATA_BYTE_5_RESET 0x0 /* reset value of the 'DATA_BYTE_5' field */
+
+/* Field 'DATA_REG2.DATA_BYTE_6' */
+#define DATA_REG2_DATA_BYTE_6_BIT_OFFSET 16 /* bit offset of the 'DATA_BYTE_6' field */
+#define DATA_REG2_DATA_BYTE_6_BIT_WIDTH 8 /* bit width of the 'DATA_BYTE_6' field */
+#define DATA_REG2_DATA_BYTE_6_BIT_MASK 0x00FF0000 /* bit mask of the 'DATA_BYTE_6' field */
+#define DATA_REG2_DATA_BYTE_6_RESET 0x0 /* reset value of the 'DATA_BYTE_6' field */
+
+/* Field 'DATA_REG2.DATA_BYTE_7' */
+#define DATA_REG2_DATA_BYTE_7_BIT_OFFSET 24 /* bit offset of the 'DATA_BYTE_7' field */
+#define DATA_REG2_DATA_BYTE_7_BIT_WIDTH 8 /* bit width of the 'DATA_BYTE_7' field */
+#define DATA_REG2_DATA_BYTE_7_BIT_MASK 0xFF000000 /* bit mask of the 'DATA_BYTE_7' field */
+#define DATA_REG2_DATA_BYTE_7_RESET 0x0 /* reset value of the 'DATA_BYTE_7' field */
+
+/* Register 'SYS_CFG' */
+#define SYS_CFG_OFFSET 0x00000014 /* address offset of the 'SYS_CFG' register */
+
+/* Field 'SYS_CFG.MODE' */
+#define SYS_CFG_MODE_BIT_OFFSET 0 /* bit offset of the 'MODE' field */
+#define SYS_CFG_MODE_BIT_WIDTH 1 /* bit width of the 'MODE' field */
+#define SYS_CFG_MODE_BIT_MASK 0x00000001 /* bit mask of the 'MODE' field */
+#define SYS_CFG_MODE_RESET 0x0 /* reset value of the 'MODE' field */
+
+/* Enumerated values for field 'SYS_CFG.MODE' */
+#define SYS_CFG_MODE_BUS_MODE 0
+#define SYS_CFG_MODE_LOOPBACK_MODE 1
+
+/* Field 'SYS_CFG.ENABLE' */
+#define SYS_CFG_ENABLE_BIT_OFFSET 1 /* bit offset of the 'ENABLE' field */
+#define SYS_CFG_ENABLE_BIT_WIDTH 1 /* bit width of the 'ENABLE' field */
+#define SYS_CFG_ENABLE_BIT_MASK 0x00000002 /* bit mask of the 'ENABLE' field */
+#define SYS_CFG_ENABLE_RESET 0x0 /* reset value of the 'ENABLE' field */
+
+/* Register 'SYS_CTRL_STS' */
+#define SYS_CTRL_STS_OFFSET 0x00000018 /* address offset of the 'SYS_CTRL_STS' register */
+
+/* Field 'SYS_CTRL_STS.SEND' */
+#define SYS_CTRL_STS_SEND_BIT_OFFSET 0 /* bit offset of the 'SEND' field */
+#define SYS_CTRL_STS_SEND_BIT_WIDTH 1 /* bit width of the 'SEND' field */
+#define SYS_CTRL_STS_SEND_BIT_MASK 0x00000001 /* bit mask of the 'SEND' field */
+#define SYS_CTRL_STS_SEND_RESET 0x0 /* reset value of the 'SEND' field */
+
+/* Field 'SYS_CTRL_STS.STATUS_CODE' */
+#define SYS_CTRL_STS_STATUS_CODE_BIT_OFFSET 1 /* bit offset of the 'STATUS_CODE' field */
+#define SYS_CTRL_STS_STATUS_CODE_BIT_WIDTH 3 /* bit width of the 'STATUS_CODE' field */
+#define SYS_CTRL_STS_STATUS_CODE_BIT_MASK 0x0000000E /* bit mask of the 'STATUS_CODE' field */
+#define SYS_CTRL_STS_STATUS_CODE_RESET 0x0 /* reset value of the 'STATUS_CODE' field */
+
+/* Enumerated values for field 'SYS_CTRL_STS.STATUS_CODE' */
+#define SYS_CTRL_STS_STATUS_CODE_TX_FAILED 3
+#define SYS_CTRL_STS_STATUS_CODE_TX_SUCCESSFUL 1
+#define SYS_CTRL_STS_STATUS_CODE_ARBITRATION_LOST 2
+
+#endif /* YONGA_CAN_IP_REGS_H */
diff --git a/verilog/dv/can_test_2/can_test2.c b/verilog/dv/can_test_2/can_test2.c
new file mode 100644
index 0000000..ba0eb10
--- /dev/null
+++ b/verilog/dv/can_test_2/can_test2.c
@@ -0,0 +1,193 @@
+/*
+ * 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
+ */
+
+// This include is relative to $CARAVEL_PATH (see Makefile)
+#include <defs.h>
+#include <stub.c>
+
+#include "YONGA_CAN_IP_regs.h"
+
+/*
+ CAN TX Transaction Test in Loopback Mode:
+ - Transmitted frame format: CAN BASE FORMAT
+*/
+
+#define BAUD_RATE_CFG_REG (YONGA_CAN_IP_DEFAULT_BASEADDR + BAUD_RATE_CFG_OFFSET)
+#define MSG_ID_REG (YONGA_CAN_IP_DEFAULT_BASEADDR + MSG_ID_OFFSET)
+#define MSG_CFG_REG (YONGA_CAN_IP_DEFAULT_BASEADDR + MSG_CFG_OFFSET)
+#define DATA_REG1_REG (YONGA_CAN_IP_DEFAULT_BASEADDR + DATA_REG1_OFFSET)
+#define DATA_REG2_REG (YONGA_CAN_IP_DEFAULT_BASEADDR + DATA_REG2_OFFSET)
+#define SYS_CFG_REG (YONGA_CAN_IP_DEFAULT_BASEADDR + SYS_CFG_OFFSET)
+#define SYS_CTRL_STS_REG (YONGA_CAN_IP_DEFAULT_BASEADDR + SYS_CTRL_STS_OFFSET)
+
+#define CONFIG_EN SYS_CFG_ENABLE_BIT_MASK
+#define LOOPBACK_EN SYS_CFG_MODE_BIT_MASK
+#define SEND SYS_CTRL_STS_SEND_BIT_MASK
+#define TX_SUCCESSFUL SYS_CTRL_STS_STATUS_CODE_TX_SUCCESSFUL
+
+#define WR_EN 0x20
+
+void device_register_write(uint32_t, uint32_t);
+
+uint32_t device_register_read(uint32_t);
+
+void main()
+{
+
+ /*
+ IO Control Registers
+ | DM | VTRIP | SLOW | AN_POL | AN_SEL | AN_EN | MOD_SEL | INP_DIS | HOLDH | OEB_N | MGMT_EN |
+ | 3-bits | 1-bit | 1-bit | 1-bit | 1-bit | 1-bit | 1-bit | 1-bit | 1-bit | 1-bit | 1-bit |
+ Output: 0000_0110_0000_1110 (0x1808) = GPIO_MODE_USER_STD_OUTPUT
+ | DM | VTRIP | SLOW | AN_POL | AN_SEL | AN_EN | MOD_SEL | INP_DIS | HOLDH | OEB_N | MGMT_EN |
+ | 110 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | 0 |
+
+
+ Input: 0000_0001_0000_1111 (0x0402) = GPIO_MODE_USER_STD_INPUT_NOPULL
+ | DM | VTRIP | SLOW | AN_POL | AN_SEL | AN_EN | MOD_SEL | INP_DIS | HOLDH | OEB_N | MGMT_EN |
+ | 001 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 |
+ */
+
+ /* Set up the housekeeping SPI to be connected internally so */
+ /* that external pin changes don't affect it. */
+
+ reg_spi_enable = 1;
+ reg_wb_enable = 1;
+ // reg_spimaster_config = 0xa002; // Enable, prescaler = 2,
+ // connect to housekeeping SPI
+
+ // Connect the housekeeping SPI to the SPI master
+ // so that the CSB line is not left floating. This allows
+ // all of the GPIO pins to be used for user functions.
+
+ 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;
+ reg_mprj_io_23 = GPIO_MODE_MGMT_STD_OUTPUT;
+ reg_mprj_io_22 = GPIO_MODE_MGMT_STD_OUTPUT;
+ reg_mprj_io_21 = GPIO_MODE_MGMT_STD_OUTPUT;
+ reg_mprj_io_20 = GPIO_MODE_MGMT_STD_OUTPUT;
+ reg_mprj_io_19 = GPIO_MODE_MGMT_STD_OUTPUT;
+ reg_mprj_io_18 = GPIO_MODE_MGMT_STD_OUTPUT;
+ reg_mprj_io_17 = GPIO_MODE_MGMT_STD_OUTPUT;
+ reg_mprj_io_16 = GPIO_MODE_MGMT_STD_OUTPUT;
+
+ /* Apply configuration */
+ reg_mprj_xfer = 1;
+ while (reg_mprj_xfer == 1);
+
+ // Configure LA probes [63:0] as outputs from the cpu
+ // Configure LA probes [127:64] as inputs to the cpu
+ // the output enable is active low, the input enable is active high
+ reg_la0_oenb = reg_la0_iena = 0xFFFFFFFF; // [31:0]
+ reg_la1_oenb = reg_la1_iena = 0xFFFFFFFF; // [63:32]
+ reg_la2_oenb = reg_la2_iena = 0x00000000; // [95:64]
+ reg_la3_oenb = reg_la3_iena = 0x00000000; // [127:96]
+
+ // Flag start of the test
+ reg_mprj_datal = 0xAB600000;
+
+ // Set configuration data
+ uint32_t TSEG2 = 0x8;
+ uint32_t TSEG1 = 0x10;
+ uint32_t BRP = 0x2;
+ uint32_t SID = 0xAB;
+ uint32_t IDE = 0x1;
+ uint32_t EID = 0x413;
+ uint32_t DLC = 0x5;
+ uint32_t DATA_BYTE_0 = 0xEE;
+ uint32_t DATA_BYTE_1 = 0xEE;
+ uint32_t DATA_BYTE_2 = 0xFF;
+ uint32_t DATA_BYTE_3 = 0xCA;
+ uint32_t DATA_BYTE_4 = 0x30;
+ uint32_t DATA_BYTE_5 = 0xB0;
+ uint32_t DATA_BYTE_6 = 0x0A;
+ uint32_t DATA_BYTE_7 = 0xAB;
+
+ // Enable device configuration
+ device_register_write(SYS_CFG_REG, CONFIG_EN);
+
+ // Enable loopback mode
+ device_register_write(SYS_CFG_REG, (CONFIG_EN | LOOPBACK_EN));
+
+ // Apply configuration
+ device_register_write(BAUD_RATE_CFG_REG, ( \
+ (TSEG2 << BAUD_RATE_CFG_TSEG2_BIT_OFFSET) | \
+ (TSEG1 << BAUD_RATE_CFG_TSEG1_BIT_OFFSET) | \
+ (BRP << BAUD_RATE_CFG_BRP_BIT_OFFSET) \
+ ) \
+ );
+ device_register_write(MSG_ID_REG, ( \
+ (SID << MSG_ID_SID_BIT_OFFSET) | \
+ (IDE << MSG_ID_IDE_BIT_OFFSET) | \
+ (EID << MSG_ID_EID_BIT_OFFSET) \
+ ) \
+ );
+ device_register_write(MSG_CFG_REG, (DLC << MSG_CFG_DLC_BIT_OFFSET));
+ device_register_write(DATA_REG1_REG, ( \
+ (DATA_BYTE_0 << DATA_REG1_DATA_BYTE_0_BIT_OFFSET) | \
+ (DATA_BYTE_1 << DATA_REG1_DATA_BYTE_1_BIT_OFFSET) | \
+ (DATA_BYTE_2 << DATA_REG1_DATA_BYTE_2_BIT_OFFSET) | \
+ (DATA_BYTE_3 << DATA_REG1_DATA_BYTE_3_BIT_OFFSET) \
+ ) \
+ );
+ device_register_write(DATA_REG2_REG, ( \
+ (DATA_BYTE_4 << DATA_REG2_DATA_BYTE_4_BIT_OFFSET) | \
+ (DATA_BYTE_5 << DATA_REG2_DATA_BYTE_5_BIT_OFFSET) | \
+ (DATA_BYTE_6 << DATA_REG2_DATA_BYTE_6_BIT_OFFSET) | \
+ (DATA_BYTE_7 << DATA_REG2_DATA_BYTE_7_BIT_OFFSET) \
+ ) \
+ );
+
+ // Disable device configuration
+ device_register_write(SYS_CFG_REG, (~CONFIG_EN | LOOPBACK_EN));
+
+ // Initiate CAN transfer
+ device_register_write(SYS_CTRL_STS_REG, SEND);
+
+ uint32_t tmp;
+ while (1) {
+ if (device_register_read(SYS_CTRL_STS_REG) & TX_SUCCESSFUL) break;
+ }
+
+}
+
+void device_register_write(uint32_t device_addr, uint32_t val){
+
+ reg_la0_data = WR_EN | device_addr;
+ reg_la1_data = val;
+
+ // send access request to the peripheral
+ reg_mprj_slave = 0x1;
+
+}
+
+uint32_t device_register_read(uint32_t device_addr){
+
+ reg_la0_data = device_addr;
+
+ // send access request to the peripheral
+ reg_mprj_slave = 0x1;
+
+ return reg_la2_data_in;
+
+}
diff --git a/verilog/dv/can_test_2/can_test2_tb.v b/verilog/dv/can_test_2/can_test2_tb.v
new file mode 100644
index 0000000..d994361
--- /dev/null
+++ b/verilog/dv/can_test_2/can_test2_tb.v
@@ -0,0 +1,135 @@
+// 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
+
+`default_nettype none
+
+`timescale 1 ns / 1 ps
+
+module can_test2_tb;
+ reg clock;
+ reg RSTB;
+ reg CSB;
+ reg power1, power2;
+ reg power3, power4;
+
+ wire gpio;
+ wire [37:0] mprj_io;
+ wire [7:0] mprj_io_0;
+ wire [15:0] checkbits;
+
+ assign checkbits = mprj_io[31:16];
+
+ assign mprj_io[3] = 1'b1;
+
+ // External clock is used by default. Make this artificially fast for the
+ // simulation. Normally this would be a slow clock and the digital PLL
+ // would be the fast clock.
+
+ always #12.5 clock <= (clock === 1'b0);
+
+ initial begin
+ clock = 0;
+ end
+
+ initial begin
+ $dumpfile("can_test2.vcd");
+ $dumpvars(0, can_test2_tb);
+
+ // Repeat cycles of 1000 clock edges as needed to complete testbench
+ repeat (200) begin
+ repeat (1000) @(posedge clock);
+ $display("+1000 cycles");
+ end
+ $display("%c[1;31m",27);
+ `ifdef GL
+ $display ("Monitor: Timeout, GL simulation Finished");
+ `else
+ $display ("Monitor: Timeout, RTL simulation Finished");
+ `endif
+ $display("%c[0m",27);
+ $finish;
+ end
+
+ initial begin
+ RSTB <= 1'b0;
+ CSB <= 1'b1; // Force CSB high
+ #2000;
+ RSTB <= 1'b1; // Release reset
+ #100000;
+ CSB = 1'b0; // CSB can be released
+ end
+
+ initial begin // Power-up sequence
+ power1 <= 1'b0;
+ power2 <= 1'b0;
+ #200;
+ power1 <= 1'b1;
+ #200;
+ power2 <= 1'b1;
+ end
+
+ wire flash_csb;
+ wire flash_clk;
+ wire flash_io0;
+ wire flash_io1;
+
+ wire VDD3V3 = power1;
+ wire VDD1V8 = power2;
+ wire USER_VDD3V3 = power3;
+ wire USER_VDD1V8 = power4;
+ wire VSS = 1'b0;
+
+ caravel uut (
+ .vddio (VDD3V3),
+ .vddio_2 (VDD3V3),
+ .vssio (VSS),
+ .vssio_2 (VSS),
+ .vdda (VDD3V3),
+ .vssa (VSS),
+ .vccd (VDD1V8),
+ .vssd (VSS),
+ .vdda1 (VDD3V3),
+ .vdda1_2 (VDD3V3),
+ .vdda2 (VDD3V3),
+ .vssa1 (VSS),
+ .vssa1_2 (VSS),
+ .vssa2 (VSS),
+ .vccd1 (VDD1V8),
+ .vccd2 (VDD1V8),
+ .vssd1 (VSS),
+ .vssd2 (VSS),
+ .clock (clock),
+ .gpio (gpio),
+ .mprj_io (mprj_io),
+ .flash_csb(flash_csb),
+ .flash_clk(flash_clk),
+ .flash_io0(flash_io0),
+ .flash_io1(flash_io1),
+ .resetb (RSTB)
+ );
+
+ spiflash #(
+ .FILENAME("can_test2.hex")
+ ) spiflash (
+ .csb(flash_csb),
+ .clk(flash_clk),
+ .io0(flash_io0),
+ .io1(flash_io1),
+ .io2(), // not used
+ .io3() // not used
+ );
+
+endmodule
+`default_nettype wire