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