From 5a79410ddd31d89a5582abb1c45acc7efcfce219 Mon Sep 17 00:00:00 2001 From: dwf1m12 <d.w.flynn@soton.ac.uk> Date: Sun, 12 Feb 2023 22:00:58 +0000 Subject: [PATCH] Initial soclabs nanosoc design for review --- .../software/cmsis/CMSIS/Include/core_cm0.h | 682 ++ .../cmsis/CMSIS/Include/core_cm0plus.h | 793 ++ .../cmsis/CMSIS/Include/core_cmFunc.h | 636 ++ .../cmsis/CMSIS/Include/core_cmInstr.h | 688 ++ .../Device/ARM/CMSDK_CM0/Include/CMSDK_CM0.h | 1313 +++ .../ARM/CMSDK_CM0/Include/CMSDK_driver.h | 293 + .../ARM/CMSDK_CM0/Include/system_CMSDK_CM0.h | 64 + .../CMSDK_CM0/Source/ARM/startup_CMSDK_CM0.s | 250 + .../ARM/CMSDK_CM0/Source/CMSDK_driver.c | 659 ++ .../CMSDK_CM0/Source/GCC/startup_CMSDK_CM0.s | 270 + .../ARM/CMSDK_CM0/Source/system_CMSDK_CM0.c | 68 + .../software/common/bootloader/bootloader.c | 142 + .../software/common/debug_tests/debug_tests.c | 508 ++ .../software/common/debug_tests/debug_tests.h | 83 + .../software/common/demos/dualtimer_demo.c | 877 ++ .../software/common/demos/interrupt_demo.c | 494 ++ .../software/common/demos/self_reset_demo.c | 234 + .../software/common/demos/sleep_demo.c | 543 ++ .../software/common/demos/watchdog_demo.c | 355 + Cortex-M0/nanosoc/software/common/dhry/dhry.h | 455 + .../nanosoc/software/common/dhry/dhry_1.c | 465 + .../nanosoc/software/common/dhry/dhry_2.c | 190 + .../software/common/retarget/retarget.c | 86 + .../software/common/retarget/uart_stdout.c | 78 + .../software/common/retarget/uart_stdout.h | 30 + .../common/romtable_tests/romtable_tests.c | 607 ++ .../common/romtable_tests/romtable_tests.h | 83 + .../common/scripts/cmsdk_bootloader.ld | 40 + .../software/common/scripts/cmsdk_cm0.ld | 43 + .../software/common/scripts/debugtester.ld | 40 + .../software/common/scripts/lib-nosys.ld | 2 + .../software/common/scripts/lib-rdimon.ld | 2 + .../common/scripts/sections-nokeep.ld | 162 + .../software/common/scripts/sections.ld | 163 + .../common/validation/apb_mux_tests.c | 367 + .../common/validation/bitband_tests.c | 602 ++ .../common/validation/default_slaves_tests.c | 240 + .../software/common/validation/dma_tests.c | 543 ++ .../common/validation/ext_sys_tests.c | 677 ++ .../common/validation/gpio_driver_tests.c | 705 ++ .../software/common/validation/gpio_tests.c | 2004 +++++ .../software/common/validation/memory_tests.c | 645 ++ .../common/validation/timer_driver_tests.c | 548 ++ .../software/common/validation/timer_tests.c | 824 ++ .../common/validation/uart_driver_tests.c | 408 + .../software/common/validation/uart_tests.c | 1241 +++ .../nanosoc/software/debug_tester/Makefile | 264 + .../software/debug_tester/cmsdk_debugtester.h | 336 + .../software/debug_tester/debugtester.c | 2775 ++++++ .../software/debug_tester/debugtester.h | 237 + .../software/debug_tester/debugtester_cm0.sct | 38 + .../debug_tester/debugtester_cm0_be.uvopt | 245 + .../debug_tester/debugtester_cm0_be.uvproj | 430 + .../debug_tester/debugtester_cm0_le.uvopt | 245 + .../debug_tester/debugtester_cm0_le.uvproj | 430 + .../debug_tester/debugtester_cm0plus.sct | 38 + .../debug_tester/debugtester_cm0plus_be.uvopt | 230 + .../debugtester_cm0plus_be.uvproj | 427 + .../debug_tester/debugtester_cm0plus_le.uvopt | 230 + .../debugtester_cm0plus_le.uvproj | 427 + .../debug_tester/debugtester_functions.h | 52 + .../debug_tester/retarget_cmsdk_debugtester.c | 97 + .../debug_tester/system_cmsdk_debugtester.c | 61 + .../debug_tester/system_cmsdk_debugtester.h | 41 + .../mcu/fpga_imp/build_fpga_pynq_z2.scr | 1 + .../mcu/fpga_imp/build_fpga_pynq_zcu104.scr | 1 + .../systems/mcu/fpga_imp/clean_fpga.scr | 8 + .../ip_repo/axi_stream_io_1.0/bd/bd.tcl | 86 + .../ip_repo/axi_stream_io_1.0/component.xml | 1456 ++++ .../axi_stream_io_v1_0/data/axi_stream_io.mdd | 10 + .../axi_stream_io_v1_0/data/axi_stream_io.tcl | 5 + .../drivers/axi_stream_io_v1_0/src/Makefile | 26 + .../axi_stream_io_v1_0/src/axi_stream_io.c | 6 + .../axi_stream_io_v1_0/src/axi_stream_io.h | 79 + .../src/axi_stream_io_selftest.c | 60 + .../soclabs.org_user_axi_stream_io_1.0.zip | Bin 0 -> 15835 bytes .../src/axi_stream_io_v1_0_axi_s.v | 424 + .../xgui/axi_stream_io_v1_0.tcl | 58 + .../ip_repo/ft1248x1_to_stream8_1.0/bd/bd.tcl | 86 + .../ft1248x1_to_stream8_1.0/component.xml | 127 + .../ft1248x1_to_stream8_0.xcix | Bin 0 -> 253 bytes .../hdl/ft1248x1_to_stream8_v1_0.v | 75 + .../hdl/ft1248x1_to_stream8_v1_0_RXD8.v | 167 + .../hdl/ft1248x1_to_stream8_v1_0_TXD8.v | 228 + .../ip_project_archive.zip | Bin 0 -> 19366 bytes ...clabs.org_user_ft1248x1_to_stream8_1.0.zip | Bin 0 -> 22475 bytes .../src/ft1248x1_to_stream8.v | 187 + .../ft1248x1_to_stream8_1.0/src/synclib.v | 139 + .../xgui/ft1248x1_to_stream8_v1_0.tcl | 10 + .../soclabs/driver/uartlite.py | 88 + .../soclabs/soclabs_cm0sdk_mcu.ipynb | 372 + .../soclabs/driver/uartlite.py | 88 + .../soclabs/soclabs_cm0sdk_mcu.ipynb | 372 + .../fpga_imp/scripts/build_mcu_fpga_batch.tcl | 122 + .../fpga_imp/scripts/build_mcu_fpga_ip.tcl | 127 + .../scripts/build_mcu_fpga_pynq_z2.tcl | 118 + .../scripts/build_mcu_fpga_pynq_zcu104.tcl | 115 + .../mcu/fpga_imp/scripts/rtl_source_cm0.tcl | 17 + .../mcu/fpga_imp/scripts/rtl_source_cmsdk.tcl | 17 + .../fpga_imp/scripts/rtl_source_dma230.tcl | 8 + .../fpga_imp/scripts/rtl_source_fpga_ip.tcl | 9 + .../scripts/rtl_source_soclabs_ip.tcl | 7 + .../target_fpga_ac701/fpga_pinmap.xdc | 983 +++ .../fpga_imp/target_fpga_ac701/fpga_synth.tcl | 40 + .../target_fpga_ac701/fpga_timing.xdc | 95 + .../target_fpga_arm_mps3/fpga_pinmap.xdc | 915 ++ .../target_fpga_arm_mps3/fpga_synth.tcl | 1 + .../target_fpga_arm_mps3/fpga_timing.xdc | 99 + .../fpga_imp/target_fpga_pynq_z2/design_1.tcl | 508 ++ .../target_fpga_pynq_z2/design_1_wrapper.v | 107 + .../target_fpga_pynq_z2/fpga_pinmap.xdc | 33 + .../target_fpga_pynq_z2/fpga_synth.tcl | 1 + .../target_fpga_pynq_z2/fpga_timing.xdc | 95 + .../fpga_imp/target_fpga_zcu104/design_1.tcl | 1017 +++ .../target_fpga_zcu104/design_1_wrapper.v | 107 + .../target_fpga_zcu104/fpga_pinmap.xdc | 1031 +++ .../target_fpga_zcu104/fpga_synth.tcl | 1 + .../target_fpga_zcu104/fpga_timing.xdc | 95 + Cortex-M0/nanosoc/systems/mcu/rtl_sim/adp.cmd | 29 + .../nanosoc/systems/mcu/rtl_sim/makefile | 555 ++ .../apb_mux_tests/apb_mux_tests_cm0.uvopt | 261 + .../apb_mux_tests/apb_mux_tests_cm0.uvproj | 435 + .../apb_mux_tests/apb_mux_tests_cm0p.uvopt | 244 + .../apb_mux_tests/apb_mux_tests_cm0p.uvproj | 432 + .../mcu/testcodes/apb_mux_tests/makefile | 251 + .../testcodes/bootloader/bootloader_cm0.uvopt | 229 + .../bootloader/bootloader_cm0.uvproj | 425 + .../bootloader/bootloader_cm0p.uvopt | 216 + .../bootloader/bootloader_cm0p.uvproj | 422 + .../systems/mcu/testcodes/bootloader/makefile | 254 + .../debug_tests/debug_tests_cm0.uvopt | 293 + .../debug_tests/debug_tests_cm0.uvproj | 445 + .../debug_tests/debug_tests_cm0p.uvopt | 272 + .../debug_tests/debug_tests_cm0p.uvproj | 442 + .../mcu/testcodes/debug_tests/makefile | 265 + .../default_slaves_tests_cm0.uvopt | 261 + .../default_slaves_tests_cm0.uvproj | 435 + .../default_slaves_tests_cm0p.uvopt | 244 + .../default_slaves_tests_cm0p.uvproj | 432 + .../testcodes/default_slaves_tests/makefile | 251 + .../systems/mcu/testcodes/dhry/dhry_cm0.uvopt | 277 + .../mcu/testcodes/dhry/dhry_cm0.uvproj | 440 + .../mcu/testcodes/dhry/dhry_cm0p.uvopt | 258 + .../mcu/testcodes/dhry/dhry_cm0p.uvproj | 437 + .../systems/mcu/testcodes/dhry/makefile | 260 + .../systems/mcu/testcodes/dhry/transcript | 14 + .../testcodes/dma_tests/dma_tests_cm0.uvopt | 261 + .../testcodes/dma_tests/dma_tests_cm0.uvproj | 435 + .../testcodes/dma_tests/dma_tests_cm0p.uvopt | 244 + .../testcodes/dma_tests/dma_tests_cm0p.uvproj | 432 + .../systems/mcu/testcodes/dma_tests/makefile | 253 + .../dualtimer_demo/dualtimer_demo_cm0.uvopt | 261 + .../dualtimer_demo/dualtimer_demo_cm0.uvproj | 435 + .../dualtimer_demo/dualtimer_demo_cm0p.uvopt | 244 + .../dualtimer_demo/dualtimer_demo_cm0p.uvproj | 432 + .../mcu/testcodes/dualtimer_demo/makefile | 250 + .../systems/mcu/testcodes/generic/config_id.h | 408 + .../generic/mcu_debugtester_interface.c | 131 + .../generic/mcu_debugtester_interface.h | 102 + .../gpio_driver_tests_cm0.uvopt | 277 + .../gpio_driver_tests_cm0.uvproj | 440 + .../gpio_driver_tests_cm0p.uvopt | 258 + .../gpio_driver_tests_cm0p.uvproj | 437 + .../mcu/testcodes/gpio_driver_tests/makefile | 255 + .../testcodes/gpio_tests/gpio_tests_cm0.uvopt | 261 + .../gpio_tests/gpio_tests_cm0.uvproj | 435 + .../gpio_tests/gpio_tests_cm0p.uvopt | 244 + .../gpio_tests/gpio_tests_cm0p.uvproj | 432 + .../systems/mcu/testcodes/gpio_tests/makefile | 253 + .../systems/mcu/testcodes/hello/.project | 11 + .../systems/mcu/testcodes/hello/hello.c | 52 + .../mcu/testcodes/hello/hello_cm0.uvopt | 261 + .../mcu/testcodes/hello/hello_cm0.uvproj | 435 + .../mcu/testcodes/hello/hello_cm0p.uvopt | 244 + .../mcu/testcodes/hello/hello_cm0p.uvproj | 432 + .../systems/mcu/testcodes/hello/makefile | 255 + .../interrupt_demo/interrupt_demo_cm0.uvopt | 277 + .../interrupt_demo/interrupt_demo_cm0.uvproj | 440 + .../interrupt_demo/interrupt_demo_cm0p.uvopt | 258 + .../interrupt_demo/interrupt_demo_cm0p.uvproj | 437 + .../mcu/testcodes/interrupt_demo/makefile | 255 + .../mcu/testcodes/memory_tests/makefile | 251 + .../memory_tests/memory_tests_cm0.uvopt | 261 + .../memory_tests/memory_tests_cm0.uvproj | 435 + .../memory_tests/memory_tests_cm0p.uvopt | 244 + .../memory_tests/memory_tests_cm0p.uvproj | 432 + .../mcu/testcodes/romtable_tests/makefile | 266 + .../romtable_tests/romtable_tests_cm0.uvopt | 293 + .../romtable_tests/romtable_tests_cm0.uvproj | 445 + .../romtable_tests/romtable_tests_cm0p.uvopt | 272 + .../romtable_tests/romtable_tests_cm0p.uvproj | 442 + .../mcu/testcodes/rtx_demo/RTX_Config.c | 187 + .../systems/mcu/testcodes/rtx_demo/makefile | 101 + .../systems/mcu/testcodes/rtx_demo/rtx_demo.c | 86 + .../mcu/testcodes/rtx_demo/rtx_demo_cm0.hex | 4996 +++++++++++ .../mcu/testcodes/rtx_demo/rtx_demo_cm0.uvopt | 277 + .../testcodes/rtx_demo/rtx_demo_cm0.uvproj | 440 + .../mcu/testcodes/rtx_demo/rtx_demo_cm0p.hex | 4996 +++++++++++ .../testcodes/rtx_demo/rtx_demo_cm0p.uvopt | 258 + .../testcodes/rtx_demo/rtx_demo_cm0p.uvproj | 437 + .../mcu/testcodes/self_reset_demo/makefile | 251 + .../self_reset_demo/self_reset_demo_cm0.uvopt | 261 + .../self_reset_demo_cm0.uvproj | 435 + .../self_reset_demo_cm0p.uvopt | 244 + .../self_reset_demo_cm0p.uvproj | 432 + .../systems/mcu/testcodes/setup_ds5_tools.scr | 6 + .../systems/mcu/testcodes/sleep_demo/makefile | 256 + .../testcodes/sleep_demo/sleep_demo_cm0.uvopt | 277 + .../sleep_demo/sleep_demo_cm0.uvproj | 440 + .../sleep_demo/sleep_demo_cm0p.uvopt | 258 + .../sleep_demo/sleep_demo_cm0p.uvproj | 437 + .../mcu/testcodes/timer_driver_tests/makefile | 254 + .../timer_driver_tests_cm0.uvopt | 277 + .../timer_driver_tests_cm0.uvproj | 440 + .../timer_driver_tests_cm0p.uvopt | 258 + .../timer_driver_tests_cm0p.uvproj | 437 + .../mcu/testcodes/timer_tests/makefile | 250 + .../timer_tests/timer_tests_cm0.uvopt | 261 + .../timer_tests/timer_tests_cm0.uvproj | 435 + .../timer_tests/timer_tests_cm0p.uvopt | 244 + .../timer_tests/timer_tests_cm0p.uvproj | 432 + .../mcu/testcodes/uart_driver_tests/makefile | 255 + .../uart_driver_tests_cm0.uvopt | 277 + .../uart_driver_tests_cm0.uvproj | 440 + .../uart_driver_tests_cm0p.uvopt | 258 + .../uart_driver_tests_cm0p.uvproj | 437 + .../systems/mcu/testcodes/uart_tests/makefile | 251 + .../testcodes/uart_tests/uart_tests_cm0.uvopt | 261 + .../uart_tests/uart_tests_cm0.uvproj | 435 + .../uart_tests/uart_tests_cm0p.uvopt | 244 + .../uart_tests/uart_tests_cm0p.uvproj | 432 + .../mcu/testcodes/watchdog_demo/makefile | 250 + .../watchdog_demo/watchdog_demo_cm0.uvopt | 261 + .../watchdog_demo/watchdog_demo_cm0.uvproj | 435 + .../watchdog_demo/watchdog_demo_cm0p.uvopt | 244 + .../watchdog_demo/watchdog_demo_cm0p.uvproj | 432 + .../systems/mcu/tools/setup_ds5_tools.scr | 3 + Cortex-M0/nanosoc/systems/mcu/v2html_doc.tgz | Bin 0 -> 661430 bytes .../nanosoc/systems/mcu/verilog/ahb_bootrom.v | 29 + .../nanosoc/systems/mcu/verilog/bootrom.v | 277 + .../mcu/verilog/cmsdk_ahb_cs_rom_table.v | 272 + .../systems/mcu/verilog/cmsdk_apb_usrt.v | 1159 +++ .../systems/mcu/verilog/cmsdk_clkreset.v | 62 + .../mcu/verilog/cmsdk_ft1248x1_adpio.v | 157 + .../systems/mcu/verilog/cmsdk_mcu_clkctrl.v | 191 + .../systems/mcu/verilog/cmsdk_mcu_pin_mux.v | 233 + .../systems/mcu/verilog/cmsdk_mcu_stclkctrl.v | 80 + .../systems/mcu/verilog/cmsdk_mcu_sysctrl.v | 351 + .../systems/mcu/verilog/cmsdk_uart_capture.v | 251 + .../mcu/verilog/gen_ahb_busmatrix/README.txt | 66 + .../gen_ahb_busmatrix/bin/BuildBusMatrix.pl | 2975 +++++++ .../gen_ahb_busmatrix/bin/lib/xmlparser.pm | 1393 +++ .../gen_soclabs_4x7_AhbMatrix.scr | 2 + .../soclabs_4x7_AhbMatrix.xml | 4257 +++++++++ .../soclabs_4x7_AhbMatrix_lite.xml | 3902 +++++++++ .../ipxact/src/cmsdk_ahb_busmatrix_ipxact.xml | 1050 +++ .../src/cmsdk_ahb_busmatrix_lite_ipxact.xml | 921 ++ .../gen_ahb_busmatrix/soclabs_ahb32_4x7.log | 74 + .../soclabs_4x7_AhbMatrix.v | 2151 +++++ .../soclabs_4x7_AhbMatrix_default_slave.v | 140 + .../soclabs_4x7_AhbMatrix_lite.v | 985 +++ .../soclabs_4x7_Arbiter.v | 330 + .../soclabs_4x7_MasterInput.v | 473 + .../soclabs_4x7_MatrixDecode_adp.v | 630 ++ .../soclabs_4x7_MatrixDecode_cpu.v | 630 ++ .../soclabs_4x7_MatrixDecode_dma.v | 566 ++ .../soclabs_4x7_MatrixDecode_dma2.v | 566 ++ .../soclabs_4x7_SlaveOutput.v | 628 ++ .../verilog/src/cmsdk_ahb_bm_burst_arb.v | 327 + .../verilog/src/cmsdk_ahb_bm_decode.v | 458 + .../verilog/src/cmsdk_ahb_bm_default_slave.v | 141 + .../verilog/src/cmsdk_ahb_bm_fixed_arb.v | 179 + .../verilog/src/cmsdk_ahb_bm_input_stage.v | 544 ++ .../verilog/src/cmsdk_ahb_bm_output_stage.v | 538 ++ .../verilog/src/cmsdk_ahb_bm_round_arb.v | 375 + .../verilog/src/cmsdk_ahb_bm_single_arb.v | 160 + .../src/cmsdk_ahb_bm_single_output_stage.v | 416 + .../verilog/src/cmsdk_ahb_busmatrix.v | 526 ++ .../verilog/src/cmsdk_ahb_busmatrix_lite.v | 340 + .../gen_ahb_busmatrix/xml/example2x3_full.xml | 85 + .../xml/example2x3_sparse.xml | 81 + .../xml/soclabs_ahb32_4x7.xml | 156 + .../systems/mcu/verilog/nanosoc_chip.v | 1583 ++++ .../systems/mcu/verilog/nanosoc_chip_pads.v | 406 + .../nanosoc/systems/mcu/verilog/nanosoc_cpu.v | 250 + .../mcu/verilog/nanosoc_sys_ahb_decode.v | 100 + .../systems/mcu/verilog/nanosoc_sysio.v | 493 ++ .../nanosoc/systems/mcu/verilog/pl230_defs.v | 189 + .../nanosoc/systems/mcu/verilog/tb_nanosoc.v | 571 ++ .../nanosoc/systems/mcu/verilog/tbench_M0.vc | 145 + .../nanosoc/systems/mcu/verilog/v2html_M0.vc | 120 + FPGALIB/pads/verilog/PAD_INOUT8MA_NOE.v | 37 + FPGALIB/pads/verilog/PAD_VDDIO.v | 29 + FPGALIB/pads/verilog/PAD_VDDSOC.v | 29 + FPGALIB/pads/verilog/PAD_VSS.v | 29 + FPGALIB/pads/verilog/PAD_VSSIO.v | 29 + GLIB/mem/verilog/SROM_Ax32.v | 127 + GLIB/pads/verilog/GLIB_PADLIB.v | 139 + GLIB/pads/verilog/PAD_ANALOG.v | 18 + GLIB/pads/verilog/PAD_INOUT8MA_NOE.v | 39 + GLIB/pads/verilog/PAD_INOUT8MA_OE.v | 39 + GLIB/pads/verilog/PAD_VDDIO.v | 18 + GLIB/pads/verilog/PAD_VDDSOC.v | 19 + GLIB/pads/verilog/PAD_VSS.v | 18 + GLIB/pads/verilog/PAD_VSSIO.v | 19 + .../ADPcontrol_v1_0/ADPcontrol_adv__mangled.v | 7744 +++++++++++++++++ .../ADPcontrol_v1_0/ADPcontrol_bas__mangled.v | 4923 +++++++++++ IPLIB/ADPcontrol_v1_0/ADPcontrol_v1_0.v | 103 + IPLIB/ADPcontrol_v1_0/ADPmanager.v | 786 ++ .../ft1248_streamio_v1_0.v | 305 + IPLIB/axi_stream_io_v1_0/axi_stream_io_v1_0.v | 114 + .../axi_stream_io_v1_0_axi_s.v | 424 + 312 files changed, 130539 insertions(+) create mode 100644 Cortex-M0/nanosoc/software/cmsis/CMSIS/Include/core_cm0.h create mode 100644 Cortex-M0/nanosoc/software/cmsis/CMSIS/Include/core_cm0plus.h create mode 100644 Cortex-M0/nanosoc/software/cmsis/CMSIS/Include/core_cmFunc.h create mode 100644 Cortex-M0/nanosoc/software/cmsis/CMSIS/Include/core_cmInstr.h create mode 100644 Cortex-M0/nanosoc/software/cmsis/Device/ARM/CMSDK_CM0/Include/CMSDK_CM0.h create mode 100644 Cortex-M0/nanosoc/software/cmsis/Device/ARM/CMSDK_CM0/Include/CMSDK_driver.h create mode 100644 Cortex-M0/nanosoc/software/cmsis/Device/ARM/CMSDK_CM0/Include/system_CMSDK_CM0.h create mode 100644 Cortex-M0/nanosoc/software/cmsis/Device/ARM/CMSDK_CM0/Source/ARM/startup_CMSDK_CM0.s create mode 100644 Cortex-M0/nanosoc/software/cmsis/Device/ARM/CMSDK_CM0/Source/CMSDK_driver.c create mode 100644 Cortex-M0/nanosoc/software/cmsis/Device/ARM/CMSDK_CM0/Source/GCC/startup_CMSDK_CM0.s create mode 100644 Cortex-M0/nanosoc/software/cmsis/Device/ARM/CMSDK_CM0/Source/system_CMSDK_CM0.c create mode 100644 Cortex-M0/nanosoc/software/common/bootloader/bootloader.c create mode 100644 Cortex-M0/nanosoc/software/common/debug_tests/debug_tests.c create mode 100644 Cortex-M0/nanosoc/software/common/debug_tests/debug_tests.h create mode 100644 Cortex-M0/nanosoc/software/common/demos/dualtimer_demo.c create mode 100644 Cortex-M0/nanosoc/software/common/demos/interrupt_demo.c create mode 100644 Cortex-M0/nanosoc/software/common/demos/self_reset_demo.c create mode 100644 Cortex-M0/nanosoc/software/common/demos/sleep_demo.c create mode 100644 Cortex-M0/nanosoc/software/common/demos/watchdog_demo.c create mode 100644 Cortex-M0/nanosoc/software/common/dhry/dhry.h create mode 100644 Cortex-M0/nanosoc/software/common/dhry/dhry_1.c create mode 100644 Cortex-M0/nanosoc/software/common/dhry/dhry_2.c create mode 100644 Cortex-M0/nanosoc/software/common/retarget/retarget.c create mode 100644 Cortex-M0/nanosoc/software/common/retarget/uart_stdout.c create mode 100644 Cortex-M0/nanosoc/software/common/retarget/uart_stdout.h create mode 100644 Cortex-M0/nanosoc/software/common/romtable_tests/romtable_tests.c create mode 100644 Cortex-M0/nanosoc/software/common/romtable_tests/romtable_tests.h create mode 100644 Cortex-M0/nanosoc/software/common/scripts/cmsdk_bootloader.ld create mode 100644 Cortex-M0/nanosoc/software/common/scripts/cmsdk_cm0.ld create mode 100644 Cortex-M0/nanosoc/software/common/scripts/debugtester.ld create mode 100644 Cortex-M0/nanosoc/software/common/scripts/lib-nosys.ld create mode 100644 Cortex-M0/nanosoc/software/common/scripts/lib-rdimon.ld create mode 100644 Cortex-M0/nanosoc/software/common/scripts/sections-nokeep.ld create mode 100644 Cortex-M0/nanosoc/software/common/scripts/sections.ld create mode 100644 Cortex-M0/nanosoc/software/common/validation/apb_mux_tests.c create mode 100644 Cortex-M0/nanosoc/software/common/validation/bitband_tests.c create mode 100644 Cortex-M0/nanosoc/software/common/validation/default_slaves_tests.c create mode 100644 Cortex-M0/nanosoc/software/common/validation/dma_tests.c create mode 100644 Cortex-M0/nanosoc/software/common/validation/ext_sys_tests.c create mode 100644 Cortex-M0/nanosoc/software/common/validation/gpio_driver_tests.c create mode 100644 Cortex-M0/nanosoc/software/common/validation/gpio_tests.c create mode 100644 Cortex-M0/nanosoc/software/common/validation/memory_tests.c create mode 100644 Cortex-M0/nanosoc/software/common/validation/timer_driver_tests.c create mode 100644 Cortex-M0/nanosoc/software/common/validation/timer_tests.c create mode 100644 Cortex-M0/nanosoc/software/common/validation/uart_driver_tests.c create mode 100644 Cortex-M0/nanosoc/software/common/validation/uart_tests.c create mode 100644 Cortex-M0/nanosoc/software/debug_tester/Makefile create mode 100644 Cortex-M0/nanosoc/software/debug_tester/cmsdk_debugtester.h create mode 100644 Cortex-M0/nanosoc/software/debug_tester/debugtester.c create mode 100644 Cortex-M0/nanosoc/software/debug_tester/debugtester.h create mode 100644 Cortex-M0/nanosoc/software/debug_tester/debugtester_cm0.sct create mode 100644 Cortex-M0/nanosoc/software/debug_tester/debugtester_cm0_be.uvopt create mode 100644 Cortex-M0/nanosoc/software/debug_tester/debugtester_cm0_be.uvproj create mode 100644 Cortex-M0/nanosoc/software/debug_tester/debugtester_cm0_le.uvopt create mode 100644 Cortex-M0/nanosoc/software/debug_tester/debugtester_cm0_le.uvproj create mode 100644 Cortex-M0/nanosoc/software/debug_tester/debugtester_cm0plus.sct create mode 100644 Cortex-M0/nanosoc/software/debug_tester/debugtester_cm0plus_be.uvopt create mode 100644 Cortex-M0/nanosoc/software/debug_tester/debugtester_cm0plus_be.uvproj create mode 100644 Cortex-M0/nanosoc/software/debug_tester/debugtester_cm0plus_le.uvopt create mode 100644 Cortex-M0/nanosoc/software/debug_tester/debugtester_cm0plus_le.uvproj create mode 100644 Cortex-M0/nanosoc/software/debug_tester/debugtester_functions.h create mode 100644 Cortex-M0/nanosoc/software/debug_tester/retarget_cmsdk_debugtester.c create mode 100644 Cortex-M0/nanosoc/software/debug_tester/system_cmsdk_debugtester.c create mode 100644 Cortex-M0/nanosoc/software/debug_tester/system_cmsdk_debugtester.h create mode 100755 Cortex-M0/nanosoc/systems/mcu/fpga_imp/build_fpga_pynq_z2.scr create mode 100755 Cortex-M0/nanosoc/systems/mcu/fpga_imp/build_fpga_pynq_zcu104.scr create mode 100755 Cortex-M0/nanosoc/systems/mcu/fpga_imp/clean_fpga.scr create mode 100755 Cortex-M0/nanosoc/systems/mcu/fpga_imp/ip_repo/axi_stream_io_1.0/bd/bd.tcl create mode 100755 Cortex-M0/nanosoc/systems/mcu/fpga_imp/ip_repo/axi_stream_io_1.0/component.xml create mode 100755 Cortex-M0/nanosoc/systems/mcu/fpga_imp/ip_repo/axi_stream_io_1.0/drivers/axi_stream_io_v1_0/data/axi_stream_io.mdd create mode 100755 Cortex-M0/nanosoc/systems/mcu/fpga_imp/ip_repo/axi_stream_io_1.0/drivers/axi_stream_io_v1_0/data/axi_stream_io.tcl create mode 100755 Cortex-M0/nanosoc/systems/mcu/fpga_imp/ip_repo/axi_stream_io_1.0/drivers/axi_stream_io_v1_0/src/Makefile create mode 100755 Cortex-M0/nanosoc/systems/mcu/fpga_imp/ip_repo/axi_stream_io_1.0/drivers/axi_stream_io_v1_0/src/axi_stream_io.c create mode 100755 Cortex-M0/nanosoc/systems/mcu/fpga_imp/ip_repo/axi_stream_io_1.0/drivers/axi_stream_io_v1_0/src/axi_stream_io.h create mode 100755 Cortex-M0/nanosoc/systems/mcu/fpga_imp/ip_repo/axi_stream_io_1.0/drivers/axi_stream_io_v1_0/src/axi_stream_io_selftest.c create mode 100644 Cortex-M0/nanosoc/systems/mcu/fpga_imp/ip_repo/axi_stream_io_1.0/soclabs.org_user_axi_stream_io_1.0.zip create mode 100755 Cortex-M0/nanosoc/systems/mcu/fpga_imp/ip_repo/axi_stream_io_1.0/src/axi_stream_io_v1_0_axi_s.v create mode 100755 Cortex-M0/nanosoc/systems/mcu/fpga_imp/ip_repo/axi_stream_io_1.0/xgui/axi_stream_io_v1_0.tcl create mode 100644 Cortex-M0/nanosoc/systems/mcu/fpga_imp/ip_repo/ft1248x1_to_stream8_1.0/bd/bd.tcl create mode 100644 Cortex-M0/nanosoc/systems/mcu/fpga_imp/ip_repo/ft1248x1_to_stream8_1.0/component.xml create mode 100644 Cortex-M0/nanosoc/systems/mcu/fpga_imp/ip_repo/ft1248x1_to_stream8_1.0/ft1248x1_to_stream8_0.xcix create mode 100644 Cortex-M0/nanosoc/systems/mcu/fpga_imp/ip_repo/ft1248x1_to_stream8_1.0/hdl/ft1248x1_to_stream8_v1_0.v create mode 100644 Cortex-M0/nanosoc/systems/mcu/fpga_imp/ip_repo/ft1248x1_to_stream8_1.0/hdl/ft1248x1_to_stream8_v1_0_RXD8.v create mode 100644 Cortex-M0/nanosoc/systems/mcu/fpga_imp/ip_repo/ft1248x1_to_stream8_1.0/hdl/ft1248x1_to_stream8_v1_0_TXD8.v create mode 100755 Cortex-M0/nanosoc/systems/mcu/fpga_imp/ip_repo/ft1248x1_to_stream8_1.0/ip_project_archive.zip create mode 100644 Cortex-M0/nanosoc/systems/mcu/fpga_imp/ip_repo/ft1248x1_to_stream8_1.0/soclabs.org_user_ft1248x1_to_stream8_1.0.zip create mode 100755 Cortex-M0/nanosoc/systems/mcu/fpga_imp/ip_repo/ft1248x1_to_stream8_1.0/src/ft1248x1_to_stream8.v create mode 100755 Cortex-M0/nanosoc/systems/mcu/fpga_imp/ip_repo/ft1248x1_to_stream8_1.0/src/synclib.v create mode 100644 Cortex-M0/nanosoc/systems/mcu/fpga_imp/ip_repo/ft1248x1_to_stream8_1.0/xgui/ft1248x1_to_stream8_v1_0.tcl create mode 100755 Cortex-M0/nanosoc/systems/mcu/fpga_imp/pynq_export/pz104/jupyter_notebooks/soclabs/driver/uartlite.py create mode 100755 Cortex-M0/nanosoc/systems/mcu/fpga_imp/pynq_export/pz104/jupyter_notebooks/soclabs/soclabs_cm0sdk_mcu.ipynb create mode 100755 Cortex-M0/nanosoc/systems/mcu/fpga_imp/pynq_export/pz2/jupyter_notebooks/soclabs/driver/uartlite.py create mode 100755 Cortex-M0/nanosoc/systems/mcu/fpga_imp/pynq_export/pz2/jupyter_notebooks/soclabs/soclabs_cm0sdk_mcu.ipynb create mode 100644 Cortex-M0/nanosoc/systems/mcu/fpga_imp/scripts/build_mcu_fpga_batch.tcl create mode 100644 Cortex-M0/nanosoc/systems/mcu/fpga_imp/scripts/build_mcu_fpga_ip.tcl create mode 100644 Cortex-M0/nanosoc/systems/mcu/fpga_imp/scripts/build_mcu_fpga_pynq_z2.tcl create mode 100644 Cortex-M0/nanosoc/systems/mcu/fpga_imp/scripts/build_mcu_fpga_pynq_zcu104.tcl create mode 100644 Cortex-M0/nanosoc/systems/mcu/fpga_imp/scripts/rtl_source_cm0.tcl create mode 100644 Cortex-M0/nanosoc/systems/mcu/fpga_imp/scripts/rtl_source_cmsdk.tcl create mode 100644 Cortex-M0/nanosoc/systems/mcu/fpga_imp/scripts/rtl_source_dma230.tcl create mode 100644 Cortex-M0/nanosoc/systems/mcu/fpga_imp/scripts/rtl_source_fpga_ip.tcl create mode 100644 Cortex-M0/nanosoc/systems/mcu/fpga_imp/scripts/rtl_source_soclabs_ip.tcl create mode 100644 Cortex-M0/nanosoc/systems/mcu/fpga_imp/target_fpga_ac701/fpga_pinmap.xdc create mode 100644 Cortex-M0/nanosoc/systems/mcu/fpga_imp/target_fpga_ac701/fpga_synth.tcl create mode 100644 Cortex-M0/nanosoc/systems/mcu/fpga_imp/target_fpga_ac701/fpga_timing.xdc create mode 100644 Cortex-M0/nanosoc/systems/mcu/fpga_imp/target_fpga_arm_mps3/fpga_pinmap.xdc create mode 100644 Cortex-M0/nanosoc/systems/mcu/fpga_imp/target_fpga_arm_mps3/fpga_synth.tcl create mode 100644 Cortex-M0/nanosoc/systems/mcu/fpga_imp/target_fpga_arm_mps3/fpga_timing.xdc create mode 100644 Cortex-M0/nanosoc/systems/mcu/fpga_imp/target_fpga_pynq_z2/design_1.tcl create mode 100644 Cortex-M0/nanosoc/systems/mcu/fpga_imp/target_fpga_pynq_z2/design_1_wrapper.v create mode 100644 Cortex-M0/nanosoc/systems/mcu/fpga_imp/target_fpga_pynq_z2/fpga_pinmap.xdc create mode 100644 Cortex-M0/nanosoc/systems/mcu/fpga_imp/target_fpga_pynq_z2/fpga_synth.tcl create mode 100644 Cortex-M0/nanosoc/systems/mcu/fpga_imp/target_fpga_pynq_z2/fpga_timing.xdc create mode 100644 Cortex-M0/nanosoc/systems/mcu/fpga_imp/target_fpga_zcu104/design_1.tcl create mode 100644 Cortex-M0/nanosoc/systems/mcu/fpga_imp/target_fpga_zcu104/design_1_wrapper.v create mode 100644 Cortex-M0/nanosoc/systems/mcu/fpga_imp/target_fpga_zcu104/fpga_pinmap.xdc create mode 100644 Cortex-M0/nanosoc/systems/mcu/fpga_imp/target_fpga_zcu104/fpga_synth.tcl create mode 100644 Cortex-M0/nanosoc/systems/mcu/fpga_imp/target_fpga_zcu104/fpga_timing.xdc create mode 100644 Cortex-M0/nanosoc/systems/mcu/rtl_sim/adp.cmd create mode 100644 Cortex-M0/nanosoc/systems/mcu/rtl_sim/makefile create mode 100644 Cortex-M0/nanosoc/systems/mcu/testcodes/apb_mux_tests/apb_mux_tests_cm0.uvopt create mode 100644 Cortex-M0/nanosoc/systems/mcu/testcodes/apb_mux_tests/apb_mux_tests_cm0.uvproj create mode 100644 Cortex-M0/nanosoc/systems/mcu/testcodes/apb_mux_tests/apb_mux_tests_cm0p.uvopt create mode 100644 Cortex-M0/nanosoc/systems/mcu/testcodes/apb_mux_tests/apb_mux_tests_cm0p.uvproj create mode 100644 Cortex-M0/nanosoc/systems/mcu/testcodes/apb_mux_tests/makefile create mode 100644 Cortex-M0/nanosoc/systems/mcu/testcodes/bootloader/bootloader_cm0.uvopt create mode 100644 Cortex-M0/nanosoc/systems/mcu/testcodes/bootloader/bootloader_cm0.uvproj create mode 100644 Cortex-M0/nanosoc/systems/mcu/testcodes/bootloader/bootloader_cm0p.uvopt create mode 100644 Cortex-M0/nanosoc/systems/mcu/testcodes/bootloader/bootloader_cm0p.uvproj create mode 100644 Cortex-M0/nanosoc/systems/mcu/testcodes/bootloader/makefile create mode 100644 Cortex-M0/nanosoc/systems/mcu/testcodes/debug_tests/debug_tests_cm0.uvopt create mode 100644 Cortex-M0/nanosoc/systems/mcu/testcodes/debug_tests/debug_tests_cm0.uvproj create mode 100644 Cortex-M0/nanosoc/systems/mcu/testcodes/debug_tests/debug_tests_cm0p.uvopt create mode 100644 Cortex-M0/nanosoc/systems/mcu/testcodes/debug_tests/debug_tests_cm0p.uvproj create mode 100644 Cortex-M0/nanosoc/systems/mcu/testcodes/debug_tests/makefile create mode 100644 Cortex-M0/nanosoc/systems/mcu/testcodes/default_slaves_tests/default_slaves_tests_cm0.uvopt create mode 100644 Cortex-M0/nanosoc/systems/mcu/testcodes/default_slaves_tests/default_slaves_tests_cm0.uvproj create mode 100644 Cortex-M0/nanosoc/systems/mcu/testcodes/default_slaves_tests/default_slaves_tests_cm0p.uvopt create mode 100644 Cortex-M0/nanosoc/systems/mcu/testcodes/default_slaves_tests/default_slaves_tests_cm0p.uvproj create mode 100644 Cortex-M0/nanosoc/systems/mcu/testcodes/default_slaves_tests/makefile create mode 100644 Cortex-M0/nanosoc/systems/mcu/testcodes/dhry/dhry_cm0.uvopt create mode 100644 Cortex-M0/nanosoc/systems/mcu/testcodes/dhry/dhry_cm0.uvproj create mode 100644 Cortex-M0/nanosoc/systems/mcu/testcodes/dhry/dhry_cm0p.uvopt create mode 100644 Cortex-M0/nanosoc/systems/mcu/testcodes/dhry/dhry_cm0p.uvproj create mode 100644 Cortex-M0/nanosoc/systems/mcu/testcodes/dhry/makefile create mode 100644 Cortex-M0/nanosoc/systems/mcu/testcodes/dhry/transcript create mode 100644 Cortex-M0/nanosoc/systems/mcu/testcodes/dma_tests/dma_tests_cm0.uvopt create mode 100644 Cortex-M0/nanosoc/systems/mcu/testcodes/dma_tests/dma_tests_cm0.uvproj create mode 100644 Cortex-M0/nanosoc/systems/mcu/testcodes/dma_tests/dma_tests_cm0p.uvopt create mode 100644 Cortex-M0/nanosoc/systems/mcu/testcodes/dma_tests/dma_tests_cm0p.uvproj create mode 100644 Cortex-M0/nanosoc/systems/mcu/testcodes/dma_tests/makefile create mode 100644 Cortex-M0/nanosoc/systems/mcu/testcodes/dualtimer_demo/dualtimer_demo_cm0.uvopt create mode 100644 Cortex-M0/nanosoc/systems/mcu/testcodes/dualtimer_demo/dualtimer_demo_cm0.uvproj create mode 100644 Cortex-M0/nanosoc/systems/mcu/testcodes/dualtimer_demo/dualtimer_demo_cm0p.uvopt create mode 100644 Cortex-M0/nanosoc/systems/mcu/testcodes/dualtimer_demo/dualtimer_demo_cm0p.uvproj create mode 100644 Cortex-M0/nanosoc/systems/mcu/testcodes/dualtimer_demo/makefile create mode 100644 Cortex-M0/nanosoc/systems/mcu/testcodes/generic/config_id.h create mode 100644 Cortex-M0/nanosoc/systems/mcu/testcodes/generic/mcu_debugtester_interface.c create mode 100644 Cortex-M0/nanosoc/systems/mcu/testcodes/generic/mcu_debugtester_interface.h create mode 100644 Cortex-M0/nanosoc/systems/mcu/testcodes/gpio_driver_tests/gpio_driver_tests_cm0.uvopt create mode 100644 Cortex-M0/nanosoc/systems/mcu/testcodes/gpio_driver_tests/gpio_driver_tests_cm0.uvproj create mode 100644 Cortex-M0/nanosoc/systems/mcu/testcodes/gpio_driver_tests/gpio_driver_tests_cm0p.uvopt create mode 100644 Cortex-M0/nanosoc/systems/mcu/testcodes/gpio_driver_tests/gpio_driver_tests_cm0p.uvproj create mode 100644 Cortex-M0/nanosoc/systems/mcu/testcodes/gpio_driver_tests/makefile create mode 100644 Cortex-M0/nanosoc/systems/mcu/testcodes/gpio_tests/gpio_tests_cm0.uvopt create mode 100644 Cortex-M0/nanosoc/systems/mcu/testcodes/gpio_tests/gpio_tests_cm0.uvproj create mode 100644 Cortex-M0/nanosoc/systems/mcu/testcodes/gpio_tests/gpio_tests_cm0p.uvopt create mode 100644 Cortex-M0/nanosoc/systems/mcu/testcodes/gpio_tests/gpio_tests_cm0p.uvproj create mode 100644 Cortex-M0/nanosoc/systems/mcu/testcodes/gpio_tests/makefile create mode 100644 Cortex-M0/nanosoc/systems/mcu/testcodes/hello/.project create mode 100644 Cortex-M0/nanosoc/systems/mcu/testcodes/hello/hello.c create mode 100644 Cortex-M0/nanosoc/systems/mcu/testcodes/hello/hello_cm0.uvopt create mode 100644 Cortex-M0/nanosoc/systems/mcu/testcodes/hello/hello_cm0.uvproj create mode 100644 Cortex-M0/nanosoc/systems/mcu/testcodes/hello/hello_cm0p.uvopt create mode 100644 Cortex-M0/nanosoc/systems/mcu/testcodes/hello/hello_cm0p.uvproj create mode 100644 Cortex-M0/nanosoc/systems/mcu/testcodes/hello/makefile create mode 100644 Cortex-M0/nanosoc/systems/mcu/testcodes/interrupt_demo/interrupt_demo_cm0.uvopt create mode 100644 Cortex-M0/nanosoc/systems/mcu/testcodes/interrupt_demo/interrupt_demo_cm0.uvproj create mode 100644 Cortex-M0/nanosoc/systems/mcu/testcodes/interrupt_demo/interrupt_demo_cm0p.uvopt create mode 100644 Cortex-M0/nanosoc/systems/mcu/testcodes/interrupt_demo/interrupt_demo_cm0p.uvproj create mode 100644 Cortex-M0/nanosoc/systems/mcu/testcodes/interrupt_demo/makefile create mode 100644 Cortex-M0/nanosoc/systems/mcu/testcodes/memory_tests/makefile create mode 100644 Cortex-M0/nanosoc/systems/mcu/testcodes/memory_tests/memory_tests_cm0.uvopt create mode 100644 Cortex-M0/nanosoc/systems/mcu/testcodes/memory_tests/memory_tests_cm0.uvproj create mode 100644 Cortex-M0/nanosoc/systems/mcu/testcodes/memory_tests/memory_tests_cm0p.uvopt create mode 100644 Cortex-M0/nanosoc/systems/mcu/testcodes/memory_tests/memory_tests_cm0p.uvproj create mode 100644 Cortex-M0/nanosoc/systems/mcu/testcodes/romtable_tests/makefile create mode 100644 Cortex-M0/nanosoc/systems/mcu/testcodes/romtable_tests/romtable_tests_cm0.uvopt create mode 100644 Cortex-M0/nanosoc/systems/mcu/testcodes/romtable_tests/romtable_tests_cm0.uvproj create mode 100644 Cortex-M0/nanosoc/systems/mcu/testcodes/romtable_tests/romtable_tests_cm0p.uvopt create mode 100644 Cortex-M0/nanosoc/systems/mcu/testcodes/romtable_tests/romtable_tests_cm0p.uvproj create mode 100644 Cortex-M0/nanosoc/systems/mcu/testcodes/rtx_demo/RTX_Config.c create mode 100644 Cortex-M0/nanosoc/systems/mcu/testcodes/rtx_demo/makefile create mode 100644 Cortex-M0/nanosoc/systems/mcu/testcodes/rtx_demo/rtx_demo.c create mode 100644 Cortex-M0/nanosoc/systems/mcu/testcodes/rtx_demo/rtx_demo_cm0.hex create mode 100644 Cortex-M0/nanosoc/systems/mcu/testcodes/rtx_demo/rtx_demo_cm0.uvopt create mode 100644 Cortex-M0/nanosoc/systems/mcu/testcodes/rtx_demo/rtx_demo_cm0.uvproj create mode 100644 Cortex-M0/nanosoc/systems/mcu/testcodes/rtx_demo/rtx_demo_cm0p.hex create mode 100644 Cortex-M0/nanosoc/systems/mcu/testcodes/rtx_demo/rtx_demo_cm0p.uvopt create mode 100644 Cortex-M0/nanosoc/systems/mcu/testcodes/rtx_demo/rtx_demo_cm0p.uvproj create mode 100644 Cortex-M0/nanosoc/systems/mcu/testcodes/self_reset_demo/makefile create mode 100644 Cortex-M0/nanosoc/systems/mcu/testcodes/self_reset_demo/self_reset_demo_cm0.uvopt create mode 100644 Cortex-M0/nanosoc/systems/mcu/testcodes/self_reset_demo/self_reset_demo_cm0.uvproj create mode 100644 Cortex-M0/nanosoc/systems/mcu/testcodes/self_reset_demo/self_reset_demo_cm0p.uvopt create mode 100644 Cortex-M0/nanosoc/systems/mcu/testcodes/self_reset_demo/self_reset_demo_cm0p.uvproj create mode 100644 Cortex-M0/nanosoc/systems/mcu/testcodes/setup_ds5_tools.scr create mode 100644 Cortex-M0/nanosoc/systems/mcu/testcodes/sleep_demo/makefile create mode 100644 Cortex-M0/nanosoc/systems/mcu/testcodes/sleep_demo/sleep_demo_cm0.uvopt create mode 100644 Cortex-M0/nanosoc/systems/mcu/testcodes/sleep_demo/sleep_demo_cm0.uvproj create mode 100644 Cortex-M0/nanosoc/systems/mcu/testcodes/sleep_demo/sleep_demo_cm0p.uvopt create mode 100644 Cortex-M0/nanosoc/systems/mcu/testcodes/sleep_demo/sleep_demo_cm0p.uvproj create mode 100644 Cortex-M0/nanosoc/systems/mcu/testcodes/timer_driver_tests/makefile create mode 100644 Cortex-M0/nanosoc/systems/mcu/testcodes/timer_driver_tests/timer_driver_tests_cm0.uvopt create mode 100644 Cortex-M0/nanosoc/systems/mcu/testcodes/timer_driver_tests/timer_driver_tests_cm0.uvproj create mode 100644 Cortex-M0/nanosoc/systems/mcu/testcodes/timer_driver_tests/timer_driver_tests_cm0p.uvopt create mode 100644 Cortex-M0/nanosoc/systems/mcu/testcodes/timer_driver_tests/timer_driver_tests_cm0p.uvproj create mode 100644 Cortex-M0/nanosoc/systems/mcu/testcodes/timer_tests/makefile create mode 100644 Cortex-M0/nanosoc/systems/mcu/testcodes/timer_tests/timer_tests_cm0.uvopt create mode 100644 Cortex-M0/nanosoc/systems/mcu/testcodes/timer_tests/timer_tests_cm0.uvproj create mode 100644 Cortex-M0/nanosoc/systems/mcu/testcodes/timer_tests/timer_tests_cm0p.uvopt create mode 100644 Cortex-M0/nanosoc/systems/mcu/testcodes/timer_tests/timer_tests_cm0p.uvproj create mode 100644 Cortex-M0/nanosoc/systems/mcu/testcodes/uart_driver_tests/makefile create mode 100644 Cortex-M0/nanosoc/systems/mcu/testcodes/uart_driver_tests/uart_driver_tests_cm0.uvopt create mode 100644 Cortex-M0/nanosoc/systems/mcu/testcodes/uart_driver_tests/uart_driver_tests_cm0.uvproj create mode 100644 Cortex-M0/nanosoc/systems/mcu/testcodes/uart_driver_tests/uart_driver_tests_cm0p.uvopt create mode 100644 Cortex-M0/nanosoc/systems/mcu/testcodes/uart_driver_tests/uart_driver_tests_cm0p.uvproj create mode 100644 Cortex-M0/nanosoc/systems/mcu/testcodes/uart_tests/makefile create mode 100644 Cortex-M0/nanosoc/systems/mcu/testcodes/uart_tests/uart_tests_cm0.uvopt create mode 100644 Cortex-M0/nanosoc/systems/mcu/testcodes/uart_tests/uart_tests_cm0.uvproj create mode 100644 Cortex-M0/nanosoc/systems/mcu/testcodes/uart_tests/uart_tests_cm0p.uvopt create mode 100644 Cortex-M0/nanosoc/systems/mcu/testcodes/uart_tests/uart_tests_cm0p.uvproj create mode 100644 Cortex-M0/nanosoc/systems/mcu/testcodes/watchdog_demo/makefile create mode 100644 Cortex-M0/nanosoc/systems/mcu/testcodes/watchdog_demo/watchdog_demo_cm0.uvopt create mode 100644 Cortex-M0/nanosoc/systems/mcu/testcodes/watchdog_demo/watchdog_demo_cm0.uvproj create mode 100644 Cortex-M0/nanosoc/systems/mcu/testcodes/watchdog_demo/watchdog_demo_cm0p.uvopt create mode 100644 Cortex-M0/nanosoc/systems/mcu/testcodes/watchdog_demo/watchdog_demo_cm0p.uvproj create mode 100644 Cortex-M0/nanosoc/systems/mcu/tools/setup_ds5_tools.scr create mode 100644 Cortex-M0/nanosoc/systems/mcu/v2html_doc.tgz create mode 100644 Cortex-M0/nanosoc/systems/mcu/verilog/ahb_bootrom.v create mode 100644 Cortex-M0/nanosoc/systems/mcu/verilog/bootrom.v create mode 100644 Cortex-M0/nanosoc/systems/mcu/verilog/cmsdk_ahb_cs_rom_table.v create mode 100644 Cortex-M0/nanosoc/systems/mcu/verilog/cmsdk_apb_usrt.v create mode 100644 Cortex-M0/nanosoc/systems/mcu/verilog/cmsdk_clkreset.v create mode 100644 Cortex-M0/nanosoc/systems/mcu/verilog/cmsdk_ft1248x1_adpio.v create mode 100644 Cortex-M0/nanosoc/systems/mcu/verilog/cmsdk_mcu_clkctrl.v create mode 100644 Cortex-M0/nanosoc/systems/mcu/verilog/cmsdk_mcu_pin_mux.v create mode 100644 Cortex-M0/nanosoc/systems/mcu/verilog/cmsdk_mcu_stclkctrl.v create mode 100644 Cortex-M0/nanosoc/systems/mcu/verilog/cmsdk_mcu_sysctrl.v create mode 100644 Cortex-M0/nanosoc/systems/mcu/verilog/cmsdk_uart_capture.v create mode 100755 Cortex-M0/nanosoc/systems/mcu/verilog/gen_ahb_busmatrix/README.txt create mode 100755 Cortex-M0/nanosoc/systems/mcu/verilog/gen_ahb_busmatrix/bin/BuildBusMatrix.pl create mode 100755 Cortex-M0/nanosoc/systems/mcu/verilog/gen_ahb_busmatrix/bin/lib/xmlparser.pm create mode 100644 Cortex-M0/nanosoc/systems/mcu/verilog/gen_ahb_busmatrix/gen_soclabs_4x7_AhbMatrix.scr create mode 100644 Cortex-M0/nanosoc/systems/mcu/verilog/gen_ahb_busmatrix/ipxact/built/soclabs_4x7_AhbMatrix/soclabs_4x7_AhbMatrix.xml create mode 100644 Cortex-M0/nanosoc/systems/mcu/verilog/gen_ahb_busmatrix/ipxact/built/soclabs_4x7_AhbMatrix/soclabs_4x7_AhbMatrix_lite.xml create mode 100755 Cortex-M0/nanosoc/systems/mcu/verilog/gen_ahb_busmatrix/ipxact/src/cmsdk_ahb_busmatrix_ipxact.xml create mode 100755 Cortex-M0/nanosoc/systems/mcu/verilog/gen_ahb_busmatrix/ipxact/src/cmsdk_ahb_busmatrix_lite_ipxact.xml create mode 100644 Cortex-M0/nanosoc/systems/mcu/verilog/gen_ahb_busmatrix/soclabs_ahb32_4x7.log create mode 100644 Cortex-M0/nanosoc/systems/mcu/verilog/gen_ahb_busmatrix/verilog/built/soclabs_4x7_AhbMatrix/soclabs_4x7_AhbMatrix.v create mode 100644 Cortex-M0/nanosoc/systems/mcu/verilog/gen_ahb_busmatrix/verilog/built/soclabs_4x7_AhbMatrix/soclabs_4x7_AhbMatrix_default_slave.v create mode 100644 Cortex-M0/nanosoc/systems/mcu/verilog/gen_ahb_busmatrix/verilog/built/soclabs_4x7_AhbMatrix/soclabs_4x7_AhbMatrix_lite.v create mode 100644 Cortex-M0/nanosoc/systems/mcu/verilog/gen_ahb_busmatrix/verilog/built/soclabs_4x7_AhbMatrix/soclabs_4x7_Arbiter.v create mode 100644 Cortex-M0/nanosoc/systems/mcu/verilog/gen_ahb_busmatrix/verilog/built/soclabs_4x7_AhbMatrix/soclabs_4x7_MasterInput.v create mode 100644 Cortex-M0/nanosoc/systems/mcu/verilog/gen_ahb_busmatrix/verilog/built/soclabs_4x7_AhbMatrix/soclabs_4x7_MatrixDecode_adp.v create mode 100644 Cortex-M0/nanosoc/systems/mcu/verilog/gen_ahb_busmatrix/verilog/built/soclabs_4x7_AhbMatrix/soclabs_4x7_MatrixDecode_cpu.v create mode 100644 Cortex-M0/nanosoc/systems/mcu/verilog/gen_ahb_busmatrix/verilog/built/soclabs_4x7_AhbMatrix/soclabs_4x7_MatrixDecode_dma.v create mode 100644 Cortex-M0/nanosoc/systems/mcu/verilog/gen_ahb_busmatrix/verilog/built/soclabs_4x7_AhbMatrix/soclabs_4x7_MatrixDecode_dma2.v create mode 100644 Cortex-M0/nanosoc/systems/mcu/verilog/gen_ahb_busmatrix/verilog/built/soclabs_4x7_AhbMatrix/soclabs_4x7_SlaveOutput.v create mode 100755 Cortex-M0/nanosoc/systems/mcu/verilog/gen_ahb_busmatrix/verilog/src/cmsdk_ahb_bm_burst_arb.v create mode 100755 Cortex-M0/nanosoc/systems/mcu/verilog/gen_ahb_busmatrix/verilog/src/cmsdk_ahb_bm_decode.v create mode 100755 Cortex-M0/nanosoc/systems/mcu/verilog/gen_ahb_busmatrix/verilog/src/cmsdk_ahb_bm_default_slave.v create mode 100755 Cortex-M0/nanosoc/systems/mcu/verilog/gen_ahb_busmatrix/verilog/src/cmsdk_ahb_bm_fixed_arb.v create mode 100755 Cortex-M0/nanosoc/systems/mcu/verilog/gen_ahb_busmatrix/verilog/src/cmsdk_ahb_bm_input_stage.v create mode 100755 Cortex-M0/nanosoc/systems/mcu/verilog/gen_ahb_busmatrix/verilog/src/cmsdk_ahb_bm_output_stage.v create mode 100755 Cortex-M0/nanosoc/systems/mcu/verilog/gen_ahb_busmatrix/verilog/src/cmsdk_ahb_bm_round_arb.v create mode 100755 Cortex-M0/nanosoc/systems/mcu/verilog/gen_ahb_busmatrix/verilog/src/cmsdk_ahb_bm_single_arb.v create mode 100755 Cortex-M0/nanosoc/systems/mcu/verilog/gen_ahb_busmatrix/verilog/src/cmsdk_ahb_bm_single_output_stage.v create mode 100755 Cortex-M0/nanosoc/systems/mcu/verilog/gen_ahb_busmatrix/verilog/src/cmsdk_ahb_busmatrix.v create mode 100755 Cortex-M0/nanosoc/systems/mcu/verilog/gen_ahb_busmatrix/verilog/src/cmsdk_ahb_busmatrix_lite.v create mode 100755 Cortex-M0/nanosoc/systems/mcu/verilog/gen_ahb_busmatrix/xml/example2x3_full.xml create mode 100755 Cortex-M0/nanosoc/systems/mcu/verilog/gen_ahb_busmatrix/xml/example2x3_sparse.xml create mode 100644 Cortex-M0/nanosoc/systems/mcu/verilog/gen_ahb_busmatrix/xml/soclabs_ahb32_4x7.xml create mode 100644 Cortex-M0/nanosoc/systems/mcu/verilog/nanosoc_chip.v create mode 100644 Cortex-M0/nanosoc/systems/mcu/verilog/nanosoc_chip_pads.v create mode 100644 Cortex-M0/nanosoc/systems/mcu/verilog/nanosoc_cpu.v create mode 100644 Cortex-M0/nanosoc/systems/mcu/verilog/nanosoc_sys_ahb_decode.v create mode 100644 Cortex-M0/nanosoc/systems/mcu/verilog/nanosoc_sysio.v create mode 100644 Cortex-M0/nanosoc/systems/mcu/verilog/pl230_defs.v create mode 100644 Cortex-M0/nanosoc/systems/mcu/verilog/tb_nanosoc.v create mode 100644 Cortex-M0/nanosoc/systems/mcu/verilog/tbench_M0.vc create mode 100644 Cortex-M0/nanosoc/systems/mcu/verilog/v2html_M0.vc create mode 100644 FPGALIB/pads/verilog/PAD_INOUT8MA_NOE.v create mode 100644 FPGALIB/pads/verilog/PAD_VDDIO.v create mode 100644 FPGALIB/pads/verilog/PAD_VDDSOC.v create mode 100644 FPGALIB/pads/verilog/PAD_VSS.v create mode 100644 FPGALIB/pads/verilog/PAD_VSSIO.v create mode 100644 GLIB/mem/verilog/SROM_Ax32.v create mode 100755 GLIB/pads/verilog/GLIB_PADLIB.v create mode 100644 GLIB/pads/verilog/PAD_ANALOG.v create mode 100644 GLIB/pads/verilog/PAD_INOUT8MA_NOE.v create mode 100644 GLIB/pads/verilog/PAD_INOUT8MA_OE.v create mode 100644 GLIB/pads/verilog/PAD_VDDIO.v create mode 100644 GLIB/pads/verilog/PAD_VDDSOC.v create mode 100644 GLIB/pads/verilog/PAD_VSS.v create mode 100644 GLIB/pads/verilog/PAD_VSSIO.v create mode 100755 IPLIB/ADPcontrol_v1_0/ADPcontrol_adv__mangled.v create mode 100755 IPLIB/ADPcontrol_v1_0/ADPcontrol_bas__mangled.v create mode 100755 IPLIB/ADPcontrol_v1_0/ADPcontrol_v1_0.v create mode 100755 IPLIB/ADPcontrol_v1_0/ADPmanager.v create mode 100755 IPLIB/FT1248_streamio_v1_0/ft1248_streamio_v1_0.v create mode 100755 IPLIB/axi_stream_io_v1_0/axi_stream_io_v1_0.v create mode 100755 IPLIB/axi_stream_io_v1_0/axi_stream_io_v1_0_axi_s.v diff --git a/Cortex-M0/nanosoc/software/cmsis/CMSIS/Include/core_cm0.h b/Cortex-M0/nanosoc/software/cmsis/CMSIS/Include/core_cm0.h new file mode 100644 index 0000000..ab31de0 --- /dev/null +++ b/Cortex-M0/nanosoc/software/cmsis/CMSIS/Include/core_cm0.h @@ -0,0 +1,682 @@ +/**************************************************************************//** + * @file core_cm0.h + * @brief CMSIS Cortex-M0 Core Peripheral Access Layer Header File + * @version V3.20 + * @date 25. February 2013 + * + * @note + * + ******************************************************************************/ +/* Copyright (c) 2009 - 2013 ARM LIMITED + + All rights reserved. + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + - Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + - Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + - Neither the name of ARM nor the names of its contributors may be used + to endorse or promote products derived from this software without + specific prior written permission. + * + 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 COPYRIGHT HOLDERS AND 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. + ---------------------------------------------------------------------------*/ + + +#if defined ( __ICCARM__ ) + #pragma system_include /* treat file as system include file for MISRA check */ +#endif + +#ifdef __cplusplus + extern "C" { +#endif + +#ifndef __CORE_CM0_H_GENERIC +#define __CORE_CM0_H_GENERIC + +/** \page CMSIS_MISRA_Exceptions MISRA-C:2004 Compliance Exceptions + CMSIS violates the following MISRA-C:2004 rules: + + \li Required Rule 8.5, object/function definition in header file.<br> + Function definitions in header files are used to allow 'inlining'. + + \li Required Rule 18.4, declaration of union type or object of union type: '{...}'.<br> + Unions are used for effective representation of core registers. + + \li Advisory Rule 19.7, Function-like macro defined.<br> + Function-like macros are used to allow more efficient code. + */ + + +/******************************************************************************* + * CMSIS definitions + ******************************************************************************/ +/** \ingroup Cortex_M0 + @{ + */ + +/* CMSIS CM0 definitions */ +#define __CM0_CMSIS_VERSION_MAIN (0x03) /*!< [31:16] CMSIS HAL main version */ +#define __CM0_CMSIS_VERSION_SUB (0x20) /*!< [15:0] CMSIS HAL sub version */ +#define __CM0_CMSIS_VERSION ((__CM0_CMSIS_VERSION_MAIN << 16) | \ + __CM0_CMSIS_VERSION_SUB ) /*!< CMSIS HAL version number */ + +#define __CORTEX_M (0x00) /*!< Cortex-M Core */ + + +#if defined ( __CC_ARM ) + #define __ASM __asm /*!< asm keyword for ARM Compiler */ + #define __INLINE __inline /*!< inline keyword for ARM Compiler */ + #define __STATIC_INLINE static __inline + +#elif defined ( __ICCARM__ ) + #define __ASM __asm /*!< asm keyword for IAR Compiler */ + #define __INLINE inline /*!< inline keyword for IAR Compiler. Only available in High optimization mode! */ + #define __STATIC_INLINE static inline + +#elif defined ( __GNUC__ ) + #define __ASM __asm /*!< asm keyword for GNU Compiler */ + #define __INLINE inline /*!< inline keyword for GNU Compiler */ + #define __STATIC_INLINE static inline + +#elif defined ( __TASKING__ ) + #define __ASM __asm /*!< asm keyword for TASKING Compiler */ + #define __INLINE inline /*!< inline keyword for TASKING Compiler */ + #define __STATIC_INLINE static inline + +#endif + +/** __FPU_USED indicates whether an FPU is used or not. This core does not support an FPU at all +*/ +#define __FPU_USED 0 + +#if defined ( __CC_ARM ) + #if defined __TARGET_FPU_VFP + #warning "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #endif + +#elif defined ( __ICCARM__ ) + #if defined __ARMVFP__ + #warning "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #endif + +#elif defined ( __GNUC__ ) + #if defined (__VFP_FP__) && !defined(__SOFTFP__) + #warning "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #endif + +#elif defined ( __TASKING__ ) + #if defined __FPU_VFP__ + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #endif +#endif + +#include <stdint.h> /* standard types definitions */ +#include <core_cmInstr.h> /* Core Instruction Access */ +#include <core_cmFunc.h> /* Core Function Access */ + +#endif /* __CORE_CM0_H_GENERIC */ + +#ifndef __CMSIS_GENERIC + +#ifndef __CORE_CM0_H_DEPENDANT +#define __CORE_CM0_H_DEPENDANT + +/* check device defines and use defaults */ +#if defined __CHECK_DEVICE_DEFINES + #ifndef __CM0_REV + #define __CM0_REV 0x0000 + #warning "__CM0_REV not defined in device header file; using default!" + #endif + + #ifndef __NVIC_PRIO_BITS + #define __NVIC_PRIO_BITS 2 + #warning "__NVIC_PRIO_BITS not defined in device header file; using default!" + #endif + + #ifndef __Vendor_SysTickConfig + #define __Vendor_SysTickConfig 0 + #warning "__Vendor_SysTickConfig not defined in device header file; using default!" + #endif +#endif + +/* IO definitions (access restrictions to peripheral registers) */ +/** + \defgroup CMSIS_glob_defs CMSIS Global Defines + + <strong>IO Type Qualifiers</strong> are used + \li to specify the access to peripheral variables. + \li for automatic generation of peripheral register debug information. +*/ +#ifdef __cplusplus + #define __I volatile /*!< Defines 'read only' permissions */ +#else + #define __I volatile const /*!< Defines 'read only' permissions */ +#endif +#define __O volatile /*!< Defines 'write only' permissions */ +#define __IO volatile /*!< Defines 'read / write' permissions */ + +/*@} end of group Cortex_M0 */ + + + +/******************************************************************************* + * Register Abstraction + Core Register contain: + - Core Register + - Core NVIC Register + - Core SCB Register + - Core SysTick Register + ******************************************************************************/ +/** \defgroup CMSIS_core_register Defines and Type Definitions + \brief Type definitions and defines for Cortex-M processor based devices. +*/ + +/** \ingroup CMSIS_core_register + \defgroup CMSIS_CORE Status and Control Registers + \brief Core Register type definitions. + @{ + */ + +/** \brief Union type to access the Application Program Status Register (APSR). + */ +typedef union +{ + struct + { +#if (__CORTEX_M != 0x04) + uint32_t _reserved0:27; /*!< bit: 0..26 Reserved */ +#else + uint32_t _reserved0:16; /*!< bit: 0..15 Reserved */ + uint32_t GE:4; /*!< bit: 16..19 Greater than or Equal flags */ + uint32_t _reserved1:7; /*!< bit: 20..26 Reserved */ +#endif + uint32_t Q:1; /*!< bit: 27 Saturation condition flag */ + uint32_t V:1; /*!< bit: 28 Overflow condition code flag */ + uint32_t C:1; /*!< bit: 29 Carry condition code flag */ + uint32_t Z:1; /*!< bit: 30 Zero condition code flag */ + uint32_t N:1; /*!< bit: 31 Negative condition code flag */ + } b; /*!< Structure used for bit access */ + uint32_t w; /*!< Type used for word access */ +} APSR_Type; + + +/** \brief Union type to access the Interrupt Program Status Register (IPSR). + */ +typedef union +{ + struct + { + uint32_t ISR:9; /*!< bit: 0.. 8 Exception number */ + uint32_t _reserved0:23; /*!< bit: 9..31 Reserved */ + } b; /*!< Structure used for bit access */ + uint32_t w; /*!< Type used for word access */ +} IPSR_Type; + + +/** \brief Union type to access the Special-Purpose Program Status Registers (xPSR). + */ +typedef union +{ + struct + { + uint32_t ISR:9; /*!< bit: 0.. 8 Exception number */ +#if (__CORTEX_M != 0x04) + uint32_t _reserved0:15; /*!< bit: 9..23 Reserved */ +#else + uint32_t _reserved0:7; /*!< bit: 9..15 Reserved */ + uint32_t GE:4; /*!< bit: 16..19 Greater than or Equal flags */ + uint32_t _reserved1:4; /*!< bit: 20..23 Reserved */ +#endif + uint32_t T:1; /*!< bit: 24 Thumb bit (read 0) */ + uint32_t IT:2; /*!< bit: 25..26 saved IT state (read 0) */ + uint32_t Q:1; /*!< bit: 27 Saturation condition flag */ + uint32_t V:1; /*!< bit: 28 Overflow condition code flag */ + uint32_t C:1; /*!< bit: 29 Carry condition code flag */ + uint32_t Z:1; /*!< bit: 30 Zero condition code flag */ + uint32_t N:1; /*!< bit: 31 Negative condition code flag */ + } b; /*!< Structure used for bit access */ + uint32_t w; /*!< Type used for word access */ +} xPSR_Type; + + +/** \brief Union type to access the Control Registers (CONTROL). + */ +typedef union +{ + struct + { + uint32_t nPRIV:1; /*!< bit: 0 Execution privilege in Thread mode */ + uint32_t SPSEL:1; /*!< bit: 1 Stack to be used */ + uint32_t FPCA:1; /*!< bit: 2 FP extension active flag */ + uint32_t _reserved0:29; /*!< bit: 3..31 Reserved */ + } b; /*!< Structure used for bit access */ + uint32_t w; /*!< Type used for word access */ +} CONTROL_Type; + +/*@} end of group CMSIS_CORE */ + + +/** \ingroup CMSIS_core_register + \defgroup CMSIS_NVIC Nested Vectored Interrupt Controller (NVIC) + \brief Type definitions for the NVIC Registers + @{ + */ + +/** \brief Structure type to access the Nested Vectored Interrupt Controller (NVIC). + */ +typedef struct +{ + __IO uint32_t ISER[1]; /*!< Offset: 0x000 (R/W) Interrupt Set Enable Register */ + uint32_t RESERVED0[31]; + __IO uint32_t ICER[1]; /*!< Offset: 0x080 (R/W) Interrupt Clear Enable Register */ + uint32_t RSERVED1[31]; + __IO uint32_t ISPR[1]; /*!< Offset: 0x100 (R/W) Interrupt Set Pending Register */ + uint32_t RESERVED2[31]; + __IO uint32_t ICPR[1]; /*!< Offset: 0x180 (R/W) Interrupt Clear Pending Register */ + uint32_t RESERVED3[31]; + uint32_t RESERVED4[64]; + __IO uint32_t IP[8]; /*!< Offset: 0x300 (R/W) Interrupt Priority Register */ +} NVIC_Type; + +/*@} end of group CMSIS_NVIC */ + + +/** \ingroup CMSIS_core_register + \defgroup CMSIS_SCB System Control Block (SCB) + \brief Type definitions for the System Control Block Registers + @{ + */ + +/** \brief Structure type to access the System Control Block (SCB). + */ +typedef struct +{ + __I uint32_t CPUID; /*!< Offset: 0x000 (R/ ) CPUID Base Register */ + __IO uint32_t ICSR; /*!< Offset: 0x004 (R/W) Interrupt Control and State Register */ + uint32_t RESERVED0; + __IO uint32_t AIRCR; /*!< Offset: 0x00C (R/W) Application Interrupt and Reset Control Register */ + __IO uint32_t SCR; /*!< Offset: 0x010 (R/W) System Control Register */ + __IO uint32_t CCR; /*!< Offset: 0x014 (R/W) Configuration Control Register */ + uint32_t RESERVED1; + __IO uint32_t SHP[2]; /*!< Offset: 0x01C (R/W) System Handlers Priority Registers. [0] is RESERVED */ + __IO uint32_t SHCSR; /*!< Offset: 0x024 (R/W) System Handler Control and State Register */ +} SCB_Type; + +/* SCB CPUID Register Definitions */ +#define SCB_CPUID_IMPLEMENTER_Pos 24 /*!< SCB CPUID: IMPLEMENTER Position */ +#define SCB_CPUID_IMPLEMENTER_Msk (0xFFUL << SCB_CPUID_IMPLEMENTER_Pos) /*!< SCB CPUID: IMPLEMENTER Mask */ + +#define SCB_CPUID_VARIANT_Pos 20 /*!< SCB CPUID: VARIANT Position */ +#define SCB_CPUID_VARIANT_Msk (0xFUL << SCB_CPUID_VARIANT_Pos) /*!< SCB CPUID: VARIANT Mask */ + +#define SCB_CPUID_ARCHITECTURE_Pos 16 /*!< SCB CPUID: ARCHITECTURE Position */ +#define SCB_CPUID_ARCHITECTURE_Msk (0xFUL << SCB_CPUID_ARCHITECTURE_Pos) /*!< SCB CPUID: ARCHITECTURE Mask */ + +#define SCB_CPUID_PARTNO_Pos 4 /*!< SCB CPUID: PARTNO Position */ +#define SCB_CPUID_PARTNO_Msk (0xFFFUL << SCB_CPUID_PARTNO_Pos) /*!< SCB CPUID: PARTNO Mask */ + +#define SCB_CPUID_REVISION_Pos 0 /*!< SCB CPUID: REVISION Position */ +#define SCB_CPUID_REVISION_Msk (0xFUL << SCB_CPUID_REVISION_Pos) /*!< SCB CPUID: REVISION Mask */ + +/* SCB Interrupt Control State Register Definitions */ +#define SCB_ICSR_NMIPENDSET_Pos 31 /*!< SCB ICSR: NMIPENDSET Position */ +#define SCB_ICSR_NMIPENDSET_Msk (1UL << SCB_ICSR_NMIPENDSET_Pos) /*!< SCB ICSR: NMIPENDSET Mask */ + +#define SCB_ICSR_PENDSVSET_Pos 28 /*!< SCB ICSR: PENDSVSET Position */ +#define SCB_ICSR_PENDSVSET_Msk (1UL << SCB_ICSR_PENDSVSET_Pos) /*!< SCB ICSR: PENDSVSET Mask */ + +#define SCB_ICSR_PENDSVCLR_Pos 27 /*!< SCB ICSR: PENDSVCLR Position */ +#define SCB_ICSR_PENDSVCLR_Msk (1UL << SCB_ICSR_PENDSVCLR_Pos) /*!< SCB ICSR: PENDSVCLR Mask */ + +#define SCB_ICSR_PENDSTSET_Pos 26 /*!< SCB ICSR: PENDSTSET Position */ +#define SCB_ICSR_PENDSTSET_Msk (1UL << SCB_ICSR_PENDSTSET_Pos) /*!< SCB ICSR: PENDSTSET Mask */ + +#define SCB_ICSR_PENDSTCLR_Pos 25 /*!< SCB ICSR: PENDSTCLR Position */ +#define SCB_ICSR_PENDSTCLR_Msk (1UL << SCB_ICSR_PENDSTCLR_Pos) /*!< SCB ICSR: PENDSTCLR Mask */ + +#define SCB_ICSR_ISRPREEMPT_Pos 23 /*!< SCB ICSR: ISRPREEMPT Position */ +#define SCB_ICSR_ISRPREEMPT_Msk (1UL << SCB_ICSR_ISRPREEMPT_Pos) /*!< SCB ICSR: ISRPREEMPT Mask */ + +#define SCB_ICSR_ISRPENDING_Pos 22 /*!< SCB ICSR: ISRPENDING Position */ +#define SCB_ICSR_ISRPENDING_Msk (1UL << SCB_ICSR_ISRPENDING_Pos) /*!< SCB ICSR: ISRPENDING Mask */ + +#define SCB_ICSR_VECTPENDING_Pos 12 /*!< SCB ICSR: VECTPENDING Position */ +#define SCB_ICSR_VECTPENDING_Msk (0x1FFUL << SCB_ICSR_VECTPENDING_Pos) /*!< SCB ICSR: VECTPENDING Mask */ + +#define SCB_ICSR_VECTACTIVE_Pos 0 /*!< SCB ICSR: VECTACTIVE Position */ +#define SCB_ICSR_VECTACTIVE_Msk (0x1FFUL << SCB_ICSR_VECTACTIVE_Pos) /*!< SCB ICSR: VECTACTIVE Mask */ + +/* SCB Application Interrupt and Reset Control Register Definitions */ +#define SCB_AIRCR_VECTKEY_Pos 16 /*!< SCB AIRCR: VECTKEY Position */ +#define SCB_AIRCR_VECTKEY_Msk (0xFFFFUL << SCB_AIRCR_VECTKEY_Pos) /*!< SCB AIRCR: VECTKEY Mask */ + +#define SCB_AIRCR_VECTKEYSTAT_Pos 16 /*!< SCB AIRCR: VECTKEYSTAT Position */ +#define SCB_AIRCR_VECTKEYSTAT_Msk (0xFFFFUL << SCB_AIRCR_VECTKEYSTAT_Pos) /*!< SCB AIRCR: VECTKEYSTAT Mask */ + +#define SCB_AIRCR_ENDIANESS_Pos 15 /*!< SCB AIRCR: ENDIANESS Position */ +#define SCB_AIRCR_ENDIANESS_Msk (1UL << SCB_AIRCR_ENDIANESS_Pos) /*!< SCB AIRCR: ENDIANESS Mask */ + +#define SCB_AIRCR_SYSRESETREQ_Pos 2 /*!< SCB AIRCR: SYSRESETREQ Position */ +#define SCB_AIRCR_SYSRESETREQ_Msk (1UL << SCB_AIRCR_SYSRESETREQ_Pos) /*!< SCB AIRCR: SYSRESETREQ Mask */ + +#define SCB_AIRCR_VECTCLRACTIVE_Pos 1 /*!< SCB AIRCR: VECTCLRACTIVE Position */ +#define SCB_AIRCR_VECTCLRACTIVE_Msk (1UL << SCB_AIRCR_VECTCLRACTIVE_Pos) /*!< SCB AIRCR: VECTCLRACTIVE Mask */ + +/* SCB System Control Register Definitions */ +#define SCB_SCR_SEVONPEND_Pos 4 /*!< SCB SCR: SEVONPEND Position */ +#define SCB_SCR_SEVONPEND_Msk (1UL << SCB_SCR_SEVONPEND_Pos) /*!< SCB SCR: SEVONPEND Mask */ + +#define SCB_SCR_SLEEPDEEP_Pos 2 /*!< SCB SCR: SLEEPDEEP Position */ +#define SCB_SCR_SLEEPDEEP_Msk (1UL << SCB_SCR_SLEEPDEEP_Pos) /*!< SCB SCR: SLEEPDEEP Mask */ + +#define SCB_SCR_SLEEPONEXIT_Pos 1 /*!< SCB SCR: SLEEPONEXIT Position */ +#define SCB_SCR_SLEEPONEXIT_Msk (1UL << SCB_SCR_SLEEPONEXIT_Pos) /*!< SCB SCR: SLEEPONEXIT Mask */ + +/* SCB Configuration Control Register Definitions */ +#define SCB_CCR_STKALIGN_Pos 9 /*!< SCB CCR: STKALIGN Position */ +#define SCB_CCR_STKALIGN_Msk (1UL << SCB_CCR_STKALIGN_Pos) /*!< SCB CCR: STKALIGN Mask */ + +#define SCB_CCR_UNALIGN_TRP_Pos 3 /*!< SCB CCR: UNALIGN_TRP Position */ +#define SCB_CCR_UNALIGN_TRP_Msk (1UL << SCB_CCR_UNALIGN_TRP_Pos) /*!< SCB CCR: UNALIGN_TRP Mask */ + +/* SCB System Handler Control and State Register Definitions */ +#define SCB_SHCSR_SVCALLPENDED_Pos 15 /*!< SCB SHCSR: SVCALLPENDED Position */ +#define SCB_SHCSR_SVCALLPENDED_Msk (1UL << SCB_SHCSR_SVCALLPENDED_Pos) /*!< SCB SHCSR: SVCALLPENDED Mask */ + +/*@} end of group CMSIS_SCB */ + + +/** \ingroup CMSIS_core_register + \defgroup CMSIS_SysTick System Tick Timer (SysTick) + \brief Type definitions for the System Timer Registers. + @{ + */ + +/** \brief Structure type to access the System Timer (SysTick). + */ +typedef struct +{ + __IO uint32_t CTRL; /*!< Offset: 0x000 (R/W) SysTick Control and Status Register */ + __IO uint32_t LOAD; /*!< Offset: 0x004 (R/W) SysTick Reload Value Register */ + __IO uint32_t VAL; /*!< Offset: 0x008 (R/W) SysTick Current Value Register */ + __I uint32_t CALIB; /*!< Offset: 0x00C (R/ ) SysTick Calibration Register */ +} SysTick_Type; + +/* SysTick Control / Status Register Definitions */ +#define SysTick_CTRL_COUNTFLAG_Pos 16 /*!< SysTick CTRL: COUNTFLAG Position */ +#define SysTick_CTRL_COUNTFLAG_Msk (1UL << SysTick_CTRL_COUNTFLAG_Pos) /*!< SysTick CTRL: COUNTFLAG Mask */ + +#define SysTick_CTRL_CLKSOURCE_Pos 2 /*!< SysTick CTRL: CLKSOURCE Position */ +#define SysTick_CTRL_CLKSOURCE_Msk (1UL << SysTick_CTRL_CLKSOURCE_Pos) /*!< SysTick CTRL: CLKSOURCE Mask */ + +#define SysTick_CTRL_TICKINT_Pos 1 /*!< SysTick CTRL: TICKINT Position */ +#define SysTick_CTRL_TICKINT_Msk (1UL << SysTick_CTRL_TICKINT_Pos) /*!< SysTick CTRL: TICKINT Mask */ + +#define SysTick_CTRL_ENABLE_Pos 0 /*!< SysTick CTRL: ENABLE Position */ +#define SysTick_CTRL_ENABLE_Msk (1UL << SysTick_CTRL_ENABLE_Pos) /*!< SysTick CTRL: ENABLE Mask */ + +/* SysTick Reload Register Definitions */ +#define SysTick_LOAD_RELOAD_Pos 0 /*!< SysTick LOAD: RELOAD Position */ +#define SysTick_LOAD_RELOAD_Msk (0xFFFFFFUL << SysTick_LOAD_RELOAD_Pos) /*!< SysTick LOAD: RELOAD Mask */ + +/* SysTick Current Register Definitions */ +#define SysTick_VAL_CURRENT_Pos 0 /*!< SysTick VAL: CURRENT Position */ +#define SysTick_VAL_CURRENT_Msk (0xFFFFFFUL << SysTick_VAL_CURRENT_Pos) /*!< SysTick VAL: CURRENT Mask */ + +/* SysTick Calibration Register Definitions */ +#define SysTick_CALIB_NOREF_Pos 31 /*!< SysTick CALIB: NOREF Position */ +#define SysTick_CALIB_NOREF_Msk (1UL << SysTick_CALIB_NOREF_Pos) /*!< SysTick CALIB: NOREF Mask */ + +#define SysTick_CALIB_SKEW_Pos 30 /*!< SysTick CALIB: SKEW Position */ +#define SysTick_CALIB_SKEW_Msk (1UL << SysTick_CALIB_SKEW_Pos) /*!< SysTick CALIB: SKEW Mask */ + +#define SysTick_CALIB_TENMS_Pos 0 /*!< SysTick CALIB: TENMS Position */ +#define SysTick_CALIB_TENMS_Msk (0xFFFFFFUL << SysTick_VAL_CURRENT_Pos) /*!< SysTick CALIB: TENMS Mask */ + +/*@} end of group CMSIS_SysTick */ + + +/** \ingroup CMSIS_core_register + \defgroup CMSIS_CoreDebug Core Debug Registers (CoreDebug) + \brief Cortex-M0 Core Debug Registers (DCB registers, SHCSR, and DFSR) + are only accessible over DAP and not via processor. Therefore + they are not covered by the Cortex-M0 header file. + @{ + */ +/*@} end of group CMSIS_CoreDebug */ + + +/** \ingroup CMSIS_core_register + \defgroup CMSIS_core_base Core Definitions + \brief Definitions for base addresses, unions, and structures. + @{ + */ + +/* Memory mapping of Cortex-M0 Hardware */ +#define SCS_BASE (0xE000E000UL) /*!< System Control Space Base Address */ +#define SysTick_BASE (SCS_BASE + 0x0010UL) /*!< SysTick Base Address */ +#define NVIC_BASE (SCS_BASE + 0x0100UL) /*!< NVIC Base Address */ +#define SCB_BASE (SCS_BASE + 0x0D00UL) /*!< System Control Block Base Address */ + +#define SCB ((SCB_Type *) SCB_BASE ) /*!< SCB configuration struct */ +#define SysTick ((SysTick_Type *) SysTick_BASE ) /*!< SysTick configuration struct */ +#define NVIC ((NVIC_Type *) NVIC_BASE ) /*!< NVIC configuration struct */ + + +/*@} */ + + + +/******************************************************************************* + * Hardware Abstraction Layer + Core Function Interface contains: + - Core NVIC Functions + - Core SysTick Functions + - Core Register Access Functions + ******************************************************************************/ +/** \defgroup CMSIS_Core_FunctionInterface Functions and Instructions Reference +*/ + + + +/* ########################## NVIC functions #################################### */ +/** \ingroup CMSIS_Core_FunctionInterface + \defgroup CMSIS_Core_NVICFunctions NVIC Functions + \brief Functions that manage interrupts and exceptions via the NVIC. + @{ + */ + +/* Interrupt Priorities are WORD accessible only under ARMv6M */ +/* The following MACROS handle generation of the register offset and byte masks */ +#define _BIT_SHIFT(IRQn) ( (((uint32_t)(IRQn) ) & 0x03) * 8 ) +#define _SHP_IDX(IRQn) ( ((((uint32_t)(IRQn) & 0x0F)-8) >> 2) ) +#define _IP_IDX(IRQn) ( ((uint32_t)(IRQn) >> 2) ) + + +/** \brief Enable External Interrupt + + The function enables a device-specific interrupt in the NVIC interrupt controller. + + \param [in] IRQn External interrupt number. Value cannot be negative. + */ +__STATIC_INLINE void NVIC_EnableIRQ(IRQn_Type IRQn) +{ + NVIC->ISER[0] = (1 << ((uint32_t)(IRQn) & 0x1F)); +} + + +/** \brief Disable External Interrupt + + The function disables a device-specific interrupt in the NVIC interrupt controller. + + \param [in] IRQn External interrupt number. Value cannot be negative. + */ +__STATIC_INLINE void NVIC_DisableIRQ(IRQn_Type IRQn) +{ + NVIC->ICER[0] = (1 << ((uint32_t)(IRQn) & 0x1F)); +} + + +/** \brief Get Pending Interrupt + + The function reads the pending register in the NVIC and returns the pending bit + for the specified interrupt. + + \param [in] IRQn Interrupt number. + + \return 0 Interrupt status is not pending. + \return 1 Interrupt status is pending. + */ +__STATIC_INLINE uint32_t NVIC_GetPendingIRQ(IRQn_Type IRQn) +{ + return((uint32_t) ((NVIC->ISPR[0] & (1 << ((uint32_t)(IRQn) & 0x1F)))?1:0)); +} + + +/** \brief Set Pending Interrupt + + The function sets the pending bit of an external interrupt. + + \param [in] IRQn Interrupt number. Value cannot be negative. + */ +__STATIC_INLINE void NVIC_SetPendingIRQ(IRQn_Type IRQn) +{ + NVIC->ISPR[0] = (1 << ((uint32_t)(IRQn) & 0x1F)); +} + + +/** \brief Clear Pending Interrupt + + The function clears the pending bit of an external interrupt. + + \param [in] IRQn External interrupt number. Value cannot be negative. + */ +__STATIC_INLINE void NVIC_ClearPendingIRQ(IRQn_Type IRQn) +{ + NVIC->ICPR[0] = (1 << ((uint32_t)(IRQn) & 0x1F)); /* Clear pending interrupt */ +} + + +/** \brief Set Interrupt Priority + + The function sets the priority of an interrupt. + + \note The priority cannot be set for every core interrupt. + + \param [in] IRQn Interrupt number. + \param [in] priority Priority to set. + */ +__STATIC_INLINE void NVIC_SetPriority(IRQn_Type IRQn, uint32_t priority) +{ + if(IRQn < 0) { + SCB->SHP[_SHP_IDX(IRQn)] = (SCB->SHP[_SHP_IDX(IRQn)] & ~(0xFF << _BIT_SHIFT(IRQn))) | + (((priority << (8 - __NVIC_PRIO_BITS)) & 0xFF) << _BIT_SHIFT(IRQn)); } + else { + NVIC->IP[_IP_IDX(IRQn)] = (NVIC->IP[_IP_IDX(IRQn)] & ~(0xFF << _BIT_SHIFT(IRQn))) | + (((priority << (8 - __NVIC_PRIO_BITS)) & 0xFF) << _BIT_SHIFT(IRQn)); } +} + + +/** \brief Get Interrupt Priority + + The function reads the priority of an interrupt. The interrupt + number can be positive to specify an external (device specific) + interrupt, or negative to specify an internal (core) interrupt. + + + \param [in] IRQn Interrupt number. + \return Interrupt Priority. Value is aligned automatically to the implemented + priority bits of the microcontroller. + */ +__STATIC_INLINE uint32_t NVIC_GetPriority(IRQn_Type IRQn) +{ + + if(IRQn < 0) { + return((uint32_t)(((SCB->SHP[_SHP_IDX(IRQn)] >> _BIT_SHIFT(IRQn) ) & 0xFF) >> (8 - __NVIC_PRIO_BITS))); } /* get priority for Cortex-M0 system interrupts */ + else { + return((uint32_t)(((NVIC->IP[ _IP_IDX(IRQn)] >> _BIT_SHIFT(IRQn) ) & 0xFF) >> (8 - __NVIC_PRIO_BITS))); } /* get priority for device specific interrupts */ +} + + +/** \brief System Reset + + The function initiates a system reset request to reset the MCU. + */ +__STATIC_INLINE void NVIC_SystemReset(void) +{ + __DSB(); /* Ensure all outstanding memory accesses included + buffered write are completed before reset */ + SCB->AIRCR = ((0x5FA << SCB_AIRCR_VECTKEY_Pos) | + SCB_AIRCR_SYSRESETREQ_Msk); + __DSB(); /* Ensure completion of memory access */ + while(1); /* wait until reset */ +} + +/*@} end of CMSIS_Core_NVICFunctions */ + + + +/* ################################## SysTick function ############################################ */ +/** \ingroup CMSIS_Core_FunctionInterface + \defgroup CMSIS_Core_SysTickFunctions SysTick Functions + \brief Functions that configure the System. + @{ + */ + +#if (__Vendor_SysTickConfig == 0) + +/** \brief System Tick Configuration + + The function initializes the System Timer and its interrupt, and starts the System Tick Timer. + Counter is in free running mode to generate periodic interrupts. + + \param [in] ticks Number of ticks between two interrupts. + + \return 0 Function succeeded. + \return 1 Function failed. + + \note When the variable <b>__Vendor_SysTickConfig</b> is set to 1, then the + function <b>SysTick_Config</b> is not included. In this case, the file <b><i>device</i>.h</b> + must contain a vendor-specific implementation of this function. + + */ +__STATIC_INLINE uint32_t SysTick_Config(uint32_t ticks) +{ + if ((ticks - 1) > SysTick_LOAD_RELOAD_Msk) return (1); /* Reload value impossible */ + + SysTick->LOAD = ticks - 1; /* set reload register */ + NVIC_SetPriority (SysTick_IRQn, (1<<__NVIC_PRIO_BITS) - 1); /* set Priority for Systick Interrupt */ + SysTick->VAL = 0; /* Load the SysTick Counter Value */ + SysTick->CTRL = SysTick_CTRL_CLKSOURCE_Msk | + SysTick_CTRL_TICKINT_Msk | + SysTick_CTRL_ENABLE_Msk; /* Enable SysTick IRQ and SysTick Timer */ + return (0); /* Function successful */ +} + +#endif + +/*@} end of CMSIS_Core_SysTickFunctions */ + + + + +#endif /* __CORE_CM0_H_DEPENDANT */ + +#endif /* __CMSIS_GENERIC */ + +#ifdef __cplusplus +} +#endif diff --git a/Cortex-M0/nanosoc/software/cmsis/CMSIS/Include/core_cm0plus.h b/Cortex-M0/nanosoc/software/cmsis/CMSIS/Include/core_cm0plus.h new file mode 100644 index 0000000..5cea74e --- /dev/null +++ b/Cortex-M0/nanosoc/software/cmsis/CMSIS/Include/core_cm0plus.h @@ -0,0 +1,793 @@ +/**************************************************************************//** + * @file core_cm0plus.h + * @brief CMSIS Cortex-M0+ Core Peripheral Access Layer Header File + * @version V3.20 + * @date 25. February 2013 + * + * @note + * + ******************************************************************************/ +/* Copyright (c) 2009 - 2013 ARM LIMITED + + All rights reserved. + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + - Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + - Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + - Neither the name of ARM nor the names of its contributors may be used + to endorse or promote products derived from this software without + specific prior written permission. + * + 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 COPYRIGHT HOLDERS AND 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. + ---------------------------------------------------------------------------*/ + + +#if defined ( __ICCARM__ ) + #pragma system_include /* treat file as system include file for MISRA check */ +#endif + +#ifdef __cplusplus + extern "C" { +#endif + +#ifndef __CORE_CM0PLUS_H_GENERIC +#define __CORE_CM0PLUS_H_GENERIC + +/** \page CMSIS_MISRA_Exceptions MISRA-C:2004 Compliance Exceptions + CMSIS violates the following MISRA-C:2004 rules: + + \li Required Rule 8.5, object/function definition in header file.<br> + Function definitions in header files are used to allow 'inlining'. + + \li Required Rule 18.4, declaration of union type or object of union type: '{...}'.<br> + Unions are used for effective representation of core registers. + + \li Advisory Rule 19.7, Function-like macro defined.<br> + Function-like macros are used to allow more efficient code. + */ + + +/******************************************************************************* + * CMSIS definitions + ******************************************************************************/ +/** \ingroup Cortex-M0+ + @{ + */ + +/* CMSIS CM0P definitions */ +#define __CM0PLUS_CMSIS_VERSION_MAIN (0x03) /*!< [31:16] CMSIS HAL main version */ +#define __CM0PLUS_CMSIS_VERSION_SUB (0x20) /*!< [15:0] CMSIS HAL sub version */ +#define __CM0PLUS_CMSIS_VERSION ((__CM0PLUS_CMSIS_VERSION_MAIN << 16) | \ + __CM0PLUS_CMSIS_VERSION_SUB) /*!< CMSIS HAL version number */ + +#define __CORTEX_M (0x00) /*!< Cortex-M Core */ + + +#if defined ( __CC_ARM ) + #define __ASM __asm /*!< asm keyword for ARM Compiler */ + #define __INLINE __inline /*!< inline keyword for ARM Compiler */ + #define __STATIC_INLINE static __inline + +#elif defined ( __ICCARM__ ) + #define __ASM __asm /*!< asm keyword for IAR Compiler */ + #define __INLINE inline /*!< inline keyword for IAR Compiler. Only available in High optimization mode! */ + #define __STATIC_INLINE static inline + +#elif defined ( __GNUC__ ) + #define __ASM __asm /*!< asm keyword for GNU Compiler */ + #define __INLINE inline /*!< inline keyword for GNU Compiler */ + #define __STATIC_INLINE static inline + +#elif defined ( __TASKING__ ) + #define __ASM __asm /*!< asm keyword for TASKING Compiler */ + #define __INLINE inline /*!< inline keyword for TASKING Compiler */ + #define __STATIC_INLINE static inline + +#endif + +/** __FPU_USED indicates whether an FPU is used or not. This core does not support an FPU at all +*/ +#define __FPU_USED 0 + +#if defined ( __CC_ARM ) + #if defined __TARGET_FPU_VFP + #warning "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #endif + +#elif defined ( __ICCARM__ ) + #if defined __ARMVFP__ + #warning "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #endif + +#elif defined ( __GNUC__ ) + #if defined (__VFP_FP__) && !defined(__SOFTFP__) + #warning "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #endif + +#elif defined ( __TASKING__ ) + #if defined __FPU_VFP__ + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #endif +#endif + +#include <stdint.h> /* standard types definitions */ +#include <core_cmInstr.h> /* Core Instruction Access */ +#include <core_cmFunc.h> /* Core Function Access */ + +#endif /* __CORE_CM0PLUS_H_GENERIC */ + +#ifndef __CMSIS_GENERIC + +#ifndef __CORE_CM0PLUS_H_DEPENDANT +#define __CORE_CM0PLUS_H_DEPENDANT + +/* check device defines and use defaults */ +#if defined __CHECK_DEVICE_DEFINES + #ifndef __CM0PLUS_REV + #define __CM0PLUS_REV 0x0000 + #warning "__CM0PLUS_REV not defined in device header file; using default!" + #endif + + #ifndef __MPU_PRESENT + #define __MPU_PRESENT 0 + #warning "__MPU_PRESENT not defined in device header file; using default!" + #endif + + #ifndef __VTOR_PRESENT + #define __VTOR_PRESENT 0 + #warning "__VTOR_PRESENT not defined in device header file; using default!" + #endif + + #ifndef __NVIC_PRIO_BITS + #define __NVIC_PRIO_BITS 2 + #warning "__NVIC_PRIO_BITS not defined in device header file; using default!" + #endif + + #ifndef __Vendor_SysTickConfig + #define __Vendor_SysTickConfig 0 + #warning "__Vendor_SysTickConfig not defined in device header file; using default!" + #endif +#endif + +/* IO definitions (access restrictions to peripheral registers) */ +/** + \defgroup CMSIS_glob_defs CMSIS Global Defines + + <strong>IO Type Qualifiers</strong> are used + \li to specify the access to peripheral variables. + \li for automatic generation of peripheral register debug information. +*/ +#ifdef __cplusplus + #define __I volatile /*!< Defines 'read only' permissions */ +#else + #define __I volatile const /*!< Defines 'read only' permissions */ +#endif +#define __O volatile /*!< Defines 'write only' permissions */ +#define __IO volatile /*!< Defines 'read / write' permissions */ + +/*@} end of group Cortex-M0+ */ + + + +/******************************************************************************* + * Register Abstraction + Core Register contain: + - Core Register + - Core NVIC Register + - Core SCB Register + - Core SysTick Register + - Core MPU Register + ******************************************************************************/ +/** \defgroup CMSIS_core_register Defines and Type Definitions + \brief Type definitions and defines for Cortex-M processor based devices. +*/ + +/** \ingroup CMSIS_core_register + \defgroup CMSIS_CORE Status and Control Registers + \brief Core Register type definitions. + @{ + */ + +/** \brief Union type to access the Application Program Status Register (APSR). + */ +typedef union +{ + struct + { +#if (__CORTEX_M != 0x04) + uint32_t _reserved0:27; /*!< bit: 0..26 Reserved */ +#else + uint32_t _reserved0:16; /*!< bit: 0..15 Reserved */ + uint32_t GE:4; /*!< bit: 16..19 Greater than or Equal flags */ + uint32_t _reserved1:7; /*!< bit: 20..26 Reserved */ +#endif + uint32_t Q:1; /*!< bit: 27 Saturation condition flag */ + uint32_t V:1; /*!< bit: 28 Overflow condition code flag */ + uint32_t C:1; /*!< bit: 29 Carry condition code flag */ + uint32_t Z:1; /*!< bit: 30 Zero condition code flag */ + uint32_t N:1; /*!< bit: 31 Negative condition code flag */ + } b; /*!< Structure used for bit access */ + uint32_t w; /*!< Type used for word access */ +} APSR_Type; + + +/** \brief Union type to access the Interrupt Program Status Register (IPSR). + */ +typedef union +{ + struct + { + uint32_t ISR:9; /*!< bit: 0.. 8 Exception number */ + uint32_t _reserved0:23; /*!< bit: 9..31 Reserved */ + } b; /*!< Structure used for bit access */ + uint32_t w; /*!< Type used for word access */ +} IPSR_Type; + + +/** \brief Union type to access the Special-Purpose Program Status Registers (xPSR). + */ +typedef union +{ + struct + { + uint32_t ISR:9; /*!< bit: 0.. 8 Exception number */ +#if (__CORTEX_M != 0x04) + uint32_t _reserved0:15; /*!< bit: 9..23 Reserved */ +#else + uint32_t _reserved0:7; /*!< bit: 9..15 Reserved */ + uint32_t GE:4; /*!< bit: 16..19 Greater than or Equal flags */ + uint32_t _reserved1:4; /*!< bit: 20..23 Reserved */ +#endif + uint32_t T:1; /*!< bit: 24 Thumb bit (read 0) */ + uint32_t IT:2; /*!< bit: 25..26 saved IT state (read 0) */ + uint32_t Q:1; /*!< bit: 27 Saturation condition flag */ + uint32_t V:1; /*!< bit: 28 Overflow condition code flag */ + uint32_t C:1; /*!< bit: 29 Carry condition code flag */ + uint32_t Z:1; /*!< bit: 30 Zero condition code flag */ + uint32_t N:1; /*!< bit: 31 Negative condition code flag */ + } b; /*!< Structure used for bit access */ + uint32_t w; /*!< Type used for word access */ +} xPSR_Type; + + +/** \brief Union type to access the Control Registers (CONTROL). + */ +typedef union +{ + struct + { + uint32_t nPRIV:1; /*!< bit: 0 Execution privilege in Thread mode */ + uint32_t SPSEL:1; /*!< bit: 1 Stack to be used */ + uint32_t FPCA:1; /*!< bit: 2 FP extension active flag */ + uint32_t _reserved0:29; /*!< bit: 3..31 Reserved */ + } b; /*!< Structure used for bit access */ + uint32_t w; /*!< Type used for word access */ +} CONTROL_Type; + +/*@} end of group CMSIS_CORE */ + + +/** \ingroup CMSIS_core_register + \defgroup CMSIS_NVIC Nested Vectored Interrupt Controller (NVIC) + \brief Type definitions for the NVIC Registers + @{ + */ + +/** \brief Structure type to access the Nested Vectored Interrupt Controller (NVIC). + */ +typedef struct +{ + __IO uint32_t ISER[1]; /*!< Offset: 0x000 (R/W) Interrupt Set Enable Register */ + uint32_t RESERVED0[31]; + __IO uint32_t ICER[1]; /*!< Offset: 0x080 (R/W) Interrupt Clear Enable Register */ + uint32_t RSERVED1[31]; + __IO uint32_t ISPR[1]; /*!< Offset: 0x100 (R/W) Interrupt Set Pending Register */ + uint32_t RESERVED2[31]; + __IO uint32_t ICPR[1]; /*!< Offset: 0x180 (R/W) Interrupt Clear Pending Register */ + uint32_t RESERVED3[31]; + uint32_t RESERVED4[64]; + __IO uint32_t IP[8]; /*!< Offset: 0x300 (R/W) Interrupt Priority Register */ +} NVIC_Type; + +/*@} end of group CMSIS_NVIC */ + + +/** \ingroup CMSIS_core_register + \defgroup CMSIS_SCB System Control Block (SCB) + \brief Type definitions for the System Control Block Registers + @{ + */ + +/** \brief Structure type to access the System Control Block (SCB). + */ +typedef struct +{ + __I uint32_t CPUID; /*!< Offset: 0x000 (R/ ) CPUID Base Register */ + __IO uint32_t ICSR; /*!< Offset: 0x004 (R/W) Interrupt Control and State Register */ +#if (__VTOR_PRESENT == 1) + __IO uint32_t VTOR; /*!< Offset: 0x008 (R/W) Vector Table Offset Register */ +#else + uint32_t RESERVED0; +#endif + __IO uint32_t AIRCR; /*!< Offset: 0x00C (R/W) Application Interrupt and Reset Control Register */ + __IO uint32_t SCR; /*!< Offset: 0x010 (R/W) System Control Register */ + __IO uint32_t CCR; /*!< Offset: 0x014 (R/W) Configuration Control Register */ + uint32_t RESERVED1; + __IO uint32_t SHP[2]; /*!< Offset: 0x01C (R/W) System Handlers Priority Registers. [0] is RESERVED */ + __IO uint32_t SHCSR; /*!< Offset: 0x024 (R/W) System Handler Control and State Register */ +} SCB_Type; + +/* SCB CPUID Register Definitions */ +#define SCB_CPUID_IMPLEMENTER_Pos 24 /*!< SCB CPUID: IMPLEMENTER Position */ +#define SCB_CPUID_IMPLEMENTER_Msk (0xFFUL << SCB_CPUID_IMPLEMENTER_Pos) /*!< SCB CPUID: IMPLEMENTER Mask */ + +#define SCB_CPUID_VARIANT_Pos 20 /*!< SCB CPUID: VARIANT Position */ +#define SCB_CPUID_VARIANT_Msk (0xFUL << SCB_CPUID_VARIANT_Pos) /*!< SCB CPUID: VARIANT Mask */ + +#define SCB_CPUID_ARCHITECTURE_Pos 16 /*!< SCB CPUID: ARCHITECTURE Position */ +#define SCB_CPUID_ARCHITECTURE_Msk (0xFUL << SCB_CPUID_ARCHITECTURE_Pos) /*!< SCB CPUID: ARCHITECTURE Mask */ + +#define SCB_CPUID_PARTNO_Pos 4 /*!< SCB CPUID: PARTNO Position */ +#define SCB_CPUID_PARTNO_Msk (0xFFFUL << SCB_CPUID_PARTNO_Pos) /*!< SCB CPUID: PARTNO Mask */ + +#define SCB_CPUID_REVISION_Pos 0 /*!< SCB CPUID: REVISION Position */ +#define SCB_CPUID_REVISION_Msk (0xFUL << SCB_CPUID_REVISION_Pos) /*!< SCB CPUID: REVISION Mask */ + +/* SCB Interrupt Control State Register Definitions */ +#define SCB_ICSR_NMIPENDSET_Pos 31 /*!< SCB ICSR: NMIPENDSET Position */ +#define SCB_ICSR_NMIPENDSET_Msk (1UL << SCB_ICSR_NMIPENDSET_Pos) /*!< SCB ICSR: NMIPENDSET Mask */ + +#define SCB_ICSR_PENDSVSET_Pos 28 /*!< SCB ICSR: PENDSVSET Position */ +#define SCB_ICSR_PENDSVSET_Msk (1UL << SCB_ICSR_PENDSVSET_Pos) /*!< SCB ICSR: PENDSVSET Mask */ + +#define SCB_ICSR_PENDSVCLR_Pos 27 /*!< SCB ICSR: PENDSVCLR Position */ +#define SCB_ICSR_PENDSVCLR_Msk (1UL << SCB_ICSR_PENDSVCLR_Pos) /*!< SCB ICSR: PENDSVCLR Mask */ + +#define SCB_ICSR_PENDSTSET_Pos 26 /*!< SCB ICSR: PENDSTSET Position */ +#define SCB_ICSR_PENDSTSET_Msk (1UL << SCB_ICSR_PENDSTSET_Pos) /*!< SCB ICSR: PENDSTSET Mask */ + +#define SCB_ICSR_PENDSTCLR_Pos 25 /*!< SCB ICSR: PENDSTCLR Position */ +#define SCB_ICSR_PENDSTCLR_Msk (1UL << SCB_ICSR_PENDSTCLR_Pos) /*!< SCB ICSR: PENDSTCLR Mask */ + +#define SCB_ICSR_ISRPREEMPT_Pos 23 /*!< SCB ICSR: ISRPREEMPT Position */ +#define SCB_ICSR_ISRPREEMPT_Msk (1UL << SCB_ICSR_ISRPREEMPT_Pos) /*!< SCB ICSR: ISRPREEMPT Mask */ + +#define SCB_ICSR_ISRPENDING_Pos 22 /*!< SCB ICSR: ISRPENDING Position */ +#define SCB_ICSR_ISRPENDING_Msk (1UL << SCB_ICSR_ISRPENDING_Pos) /*!< SCB ICSR: ISRPENDING Mask */ + +#define SCB_ICSR_VECTPENDING_Pos 12 /*!< SCB ICSR: VECTPENDING Position */ +#define SCB_ICSR_VECTPENDING_Msk (0x1FFUL << SCB_ICSR_VECTPENDING_Pos) /*!< SCB ICSR: VECTPENDING Mask */ + +#define SCB_ICSR_VECTACTIVE_Pos 0 /*!< SCB ICSR: VECTACTIVE Position */ +#define SCB_ICSR_VECTACTIVE_Msk (0x1FFUL << SCB_ICSR_VECTACTIVE_Pos) /*!< SCB ICSR: VECTACTIVE Mask */ + +#if (__VTOR_PRESENT == 1) +/* SCB Interrupt Control State Register Definitions */ +#define SCB_VTOR_TBLOFF_Pos 8 /*!< SCB VTOR: TBLOFF Position */ +#define SCB_VTOR_TBLOFF_Msk (0xFFFFFFUL << SCB_VTOR_TBLOFF_Pos) /*!< SCB VTOR: TBLOFF Mask */ +#endif + +/* SCB Application Interrupt and Reset Control Register Definitions */ +#define SCB_AIRCR_VECTKEY_Pos 16 /*!< SCB AIRCR: VECTKEY Position */ +#define SCB_AIRCR_VECTKEY_Msk (0xFFFFUL << SCB_AIRCR_VECTKEY_Pos) /*!< SCB AIRCR: VECTKEY Mask */ + +#define SCB_AIRCR_VECTKEYSTAT_Pos 16 /*!< SCB AIRCR: VECTKEYSTAT Position */ +#define SCB_AIRCR_VECTKEYSTAT_Msk (0xFFFFUL << SCB_AIRCR_VECTKEYSTAT_Pos) /*!< SCB AIRCR: VECTKEYSTAT Mask */ + +#define SCB_AIRCR_ENDIANESS_Pos 15 /*!< SCB AIRCR: ENDIANESS Position */ +#define SCB_AIRCR_ENDIANESS_Msk (1UL << SCB_AIRCR_ENDIANESS_Pos) /*!< SCB AIRCR: ENDIANESS Mask */ + +#define SCB_AIRCR_SYSRESETREQ_Pos 2 /*!< SCB AIRCR: SYSRESETREQ Position */ +#define SCB_AIRCR_SYSRESETREQ_Msk (1UL << SCB_AIRCR_SYSRESETREQ_Pos) /*!< SCB AIRCR: SYSRESETREQ Mask */ + +#define SCB_AIRCR_VECTCLRACTIVE_Pos 1 /*!< SCB AIRCR: VECTCLRACTIVE Position */ +#define SCB_AIRCR_VECTCLRACTIVE_Msk (1UL << SCB_AIRCR_VECTCLRACTIVE_Pos) /*!< SCB AIRCR: VECTCLRACTIVE Mask */ + +/* SCB System Control Register Definitions */ +#define SCB_SCR_SEVONPEND_Pos 4 /*!< SCB SCR: SEVONPEND Position */ +#define SCB_SCR_SEVONPEND_Msk (1UL << SCB_SCR_SEVONPEND_Pos) /*!< SCB SCR: SEVONPEND Mask */ + +#define SCB_SCR_SLEEPDEEP_Pos 2 /*!< SCB SCR: SLEEPDEEP Position */ +#define SCB_SCR_SLEEPDEEP_Msk (1UL << SCB_SCR_SLEEPDEEP_Pos) /*!< SCB SCR: SLEEPDEEP Mask */ + +#define SCB_SCR_SLEEPONEXIT_Pos 1 /*!< SCB SCR: SLEEPONEXIT Position */ +#define SCB_SCR_SLEEPONEXIT_Msk (1UL << SCB_SCR_SLEEPONEXIT_Pos) /*!< SCB SCR: SLEEPONEXIT Mask */ + +/* SCB Configuration Control Register Definitions */ +#define SCB_CCR_STKALIGN_Pos 9 /*!< SCB CCR: STKALIGN Position */ +#define SCB_CCR_STKALIGN_Msk (1UL << SCB_CCR_STKALIGN_Pos) /*!< SCB CCR: STKALIGN Mask */ + +#define SCB_CCR_UNALIGN_TRP_Pos 3 /*!< SCB CCR: UNALIGN_TRP Position */ +#define SCB_CCR_UNALIGN_TRP_Msk (1UL << SCB_CCR_UNALIGN_TRP_Pos) /*!< SCB CCR: UNALIGN_TRP Mask */ + +/* SCB System Handler Control and State Register Definitions */ +#define SCB_SHCSR_SVCALLPENDED_Pos 15 /*!< SCB SHCSR: SVCALLPENDED Position */ +#define SCB_SHCSR_SVCALLPENDED_Msk (1UL << SCB_SHCSR_SVCALLPENDED_Pos) /*!< SCB SHCSR: SVCALLPENDED Mask */ + +/*@} end of group CMSIS_SCB */ + + +/** \ingroup CMSIS_core_register + \defgroup CMSIS_SysTick System Tick Timer (SysTick) + \brief Type definitions for the System Timer Registers. + @{ + */ + +/** \brief Structure type to access the System Timer (SysTick). + */ +typedef struct +{ + __IO uint32_t CTRL; /*!< Offset: 0x000 (R/W) SysTick Control and Status Register */ + __IO uint32_t LOAD; /*!< Offset: 0x004 (R/W) SysTick Reload Value Register */ + __IO uint32_t VAL; /*!< Offset: 0x008 (R/W) SysTick Current Value Register */ + __I uint32_t CALIB; /*!< Offset: 0x00C (R/ ) SysTick Calibration Register */ +} SysTick_Type; + +/* SysTick Control / Status Register Definitions */ +#define SysTick_CTRL_COUNTFLAG_Pos 16 /*!< SysTick CTRL: COUNTFLAG Position */ +#define SysTick_CTRL_COUNTFLAG_Msk (1UL << SysTick_CTRL_COUNTFLAG_Pos) /*!< SysTick CTRL: COUNTFLAG Mask */ + +#define SysTick_CTRL_CLKSOURCE_Pos 2 /*!< SysTick CTRL: CLKSOURCE Position */ +#define SysTick_CTRL_CLKSOURCE_Msk (1UL << SysTick_CTRL_CLKSOURCE_Pos) /*!< SysTick CTRL: CLKSOURCE Mask */ + +#define SysTick_CTRL_TICKINT_Pos 1 /*!< SysTick CTRL: TICKINT Position */ +#define SysTick_CTRL_TICKINT_Msk (1UL << SysTick_CTRL_TICKINT_Pos) /*!< SysTick CTRL: TICKINT Mask */ + +#define SysTick_CTRL_ENABLE_Pos 0 /*!< SysTick CTRL: ENABLE Position */ +#define SysTick_CTRL_ENABLE_Msk (1UL << SysTick_CTRL_ENABLE_Pos) /*!< SysTick CTRL: ENABLE Mask */ + +/* SysTick Reload Register Definitions */ +#define SysTick_LOAD_RELOAD_Pos 0 /*!< SysTick LOAD: RELOAD Position */ +#define SysTick_LOAD_RELOAD_Msk (0xFFFFFFUL << SysTick_LOAD_RELOAD_Pos) /*!< SysTick LOAD: RELOAD Mask */ + +/* SysTick Current Register Definitions */ +#define SysTick_VAL_CURRENT_Pos 0 /*!< SysTick VAL: CURRENT Position */ +#define SysTick_VAL_CURRENT_Msk (0xFFFFFFUL << SysTick_VAL_CURRENT_Pos) /*!< SysTick VAL: CURRENT Mask */ + +/* SysTick Calibration Register Definitions */ +#define SysTick_CALIB_NOREF_Pos 31 /*!< SysTick CALIB: NOREF Position */ +#define SysTick_CALIB_NOREF_Msk (1UL << SysTick_CALIB_NOREF_Pos) /*!< SysTick CALIB: NOREF Mask */ + +#define SysTick_CALIB_SKEW_Pos 30 /*!< SysTick CALIB: SKEW Position */ +#define SysTick_CALIB_SKEW_Msk (1UL << SysTick_CALIB_SKEW_Pos) /*!< SysTick CALIB: SKEW Mask */ + +#define SysTick_CALIB_TENMS_Pos 0 /*!< SysTick CALIB: TENMS Position */ +#define SysTick_CALIB_TENMS_Msk (0xFFFFFFUL << SysTick_VAL_CURRENT_Pos) /*!< SysTick CALIB: TENMS Mask */ + +/*@} end of group CMSIS_SysTick */ + +#if (__MPU_PRESENT == 1) +/** \ingroup CMSIS_core_register + \defgroup CMSIS_MPU Memory Protection Unit (MPU) + \brief Type definitions for the Memory Protection Unit (MPU) + @{ + */ + +/** \brief Structure type to access the Memory Protection Unit (MPU). + */ +typedef struct +{ + __I uint32_t TYPE; /*!< Offset: 0x000 (R/ ) MPU Type Register */ + __IO uint32_t CTRL; /*!< Offset: 0x004 (R/W) MPU Control Register */ + __IO uint32_t RNR; /*!< Offset: 0x008 (R/W) MPU Region RNRber Register */ + __IO uint32_t RBAR; /*!< Offset: 0x00C (R/W) MPU Region Base Address Register */ + __IO uint32_t RASR; /*!< Offset: 0x010 (R/W) MPU Region Attribute and Size Register */ +} MPU_Type; + +/* MPU Type Register */ +#define MPU_TYPE_IREGION_Pos 16 /*!< MPU TYPE: IREGION Position */ +#define MPU_TYPE_IREGION_Msk (0xFFUL << MPU_TYPE_IREGION_Pos) /*!< MPU TYPE: IREGION Mask */ + +#define MPU_TYPE_DREGION_Pos 8 /*!< MPU TYPE: DREGION Position */ +#define MPU_TYPE_DREGION_Msk (0xFFUL << MPU_TYPE_DREGION_Pos) /*!< MPU TYPE: DREGION Mask */ + +#define MPU_TYPE_SEPARATE_Pos 0 /*!< MPU TYPE: SEPARATE Position */ +#define MPU_TYPE_SEPARATE_Msk (1UL << MPU_TYPE_SEPARATE_Pos) /*!< MPU TYPE: SEPARATE Mask */ + +/* MPU Control Register */ +#define MPU_CTRL_PRIVDEFENA_Pos 2 /*!< MPU CTRL: PRIVDEFENA Position */ +#define MPU_CTRL_PRIVDEFENA_Msk (1UL << MPU_CTRL_PRIVDEFENA_Pos) /*!< MPU CTRL: PRIVDEFENA Mask */ + +#define MPU_CTRL_HFNMIENA_Pos 1 /*!< MPU CTRL: HFNMIENA Position */ +#define MPU_CTRL_HFNMIENA_Msk (1UL << MPU_CTRL_HFNMIENA_Pos) /*!< MPU CTRL: HFNMIENA Mask */ + +#define MPU_CTRL_ENABLE_Pos 0 /*!< MPU CTRL: ENABLE Position */ +#define MPU_CTRL_ENABLE_Msk (1UL << MPU_CTRL_ENABLE_Pos) /*!< MPU CTRL: ENABLE Mask */ + +/* MPU Region Number Register */ +#define MPU_RNR_REGION_Pos 0 /*!< MPU RNR: REGION Position */ +#define MPU_RNR_REGION_Msk (0xFFUL << MPU_RNR_REGION_Pos) /*!< MPU RNR: REGION Mask */ + +/* MPU Region Base Address Register */ +#define MPU_RBAR_ADDR_Pos 8 /*!< MPU RBAR: ADDR Position */ +#define MPU_RBAR_ADDR_Msk (0xFFFFFFUL << MPU_RBAR_ADDR_Pos) /*!< MPU RBAR: ADDR Mask */ + +#define MPU_RBAR_VALID_Pos 4 /*!< MPU RBAR: VALID Position */ +#define MPU_RBAR_VALID_Msk (1UL << MPU_RBAR_VALID_Pos) /*!< MPU RBAR: VALID Mask */ + +#define MPU_RBAR_REGION_Pos 0 /*!< MPU RBAR: REGION Position */ +#define MPU_RBAR_REGION_Msk (0xFUL << MPU_RBAR_REGION_Pos) /*!< MPU RBAR: REGION Mask */ + +/* MPU Region Attribute and Size Register */ +#define MPU_RASR_ATTRS_Pos 16 /*!< MPU RASR: MPU Region Attribute field Position */ +#define MPU_RASR_ATTRS_Msk (0xFFFFUL << MPU_RASR_ATTRS_Pos) /*!< MPU RASR: MPU Region Attribute field Mask */ + +#define MPU_RASR_XN_Pos 28 /*!< MPU RASR: ATTRS.XN Position */ +#define MPU_RASR_XN_Msk (1UL << MPU_RASR_XN_Pos) /*!< MPU RASR: ATTRS.XN Mask */ + +#define MPU_RASR_AP_Pos 24 /*!< MPU RASR: ATTRS.AP Position */ +#define MPU_RASR_AP_Msk (0x7UL << MPU_RASR_AP_Pos) /*!< MPU RASR: ATTRS.AP Mask */ + +#define MPU_RASR_TEX_Pos 19 /*!< MPU RASR: ATTRS.TEX Position */ +#define MPU_RASR_TEX_Msk (0x7UL << MPU_RASR_TEX_Pos) /*!< MPU RASR: ATTRS.TEX Mask */ + +#define MPU_RASR_S_Pos 18 /*!< MPU RASR: ATTRS.S Position */ +#define MPU_RASR_S_Msk (1UL << MPU_RASR_S_Pos) /*!< MPU RASR: ATTRS.S Mask */ + +#define MPU_RASR_C_Pos 17 /*!< MPU RASR: ATTRS.C Position */ +#define MPU_RASR_C_Msk (1UL << MPU_RASR_C_Pos) /*!< MPU RASR: ATTRS.C Mask */ + +#define MPU_RASR_B_Pos 16 /*!< MPU RASR: ATTRS.B Position */ +#define MPU_RASR_B_Msk (1UL << MPU_RASR_B_Pos) /*!< MPU RASR: ATTRS.B Mask */ + +#define MPU_RASR_SRD_Pos 8 /*!< MPU RASR: Sub-Region Disable Position */ +#define MPU_RASR_SRD_Msk (0xFFUL << MPU_RASR_SRD_Pos) /*!< MPU RASR: Sub-Region Disable Mask */ + +#define MPU_RASR_SIZE_Pos 1 /*!< MPU RASR: Region Size Field Position */ +#define MPU_RASR_SIZE_Msk (0x1FUL << MPU_RASR_SIZE_Pos) /*!< MPU RASR: Region Size Field Mask */ + +#define MPU_RASR_ENABLE_Pos 0 /*!< MPU RASR: Region enable bit Position */ +#define MPU_RASR_ENABLE_Msk (1UL << MPU_RASR_ENABLE_Pos) /*!< MPU RASR: Region enable bit Disable Mask */ + +/*@} end of group CMSIS_MPU */ +#endif + + +/** \ingroup CMSIS_core_register + \defgroup CMSIS_CoreDebug Core Debug Registers (CoreDebug) + \brief Cortex-M0+ Core Debug Registers (DCB registers, SHCSR, and DFSR) + are only accessible over DAP and not via processor. Therefore + they are not covered by the Cortex-M0 header file. + @{ + */ +/*@} end of group CMSIS_CoreDebug */ + + +/** \ingroup CMSIS_core_register + \defgroup CMSIS_core_base Core Definitions + \brief Definitions for base addresses, unions, and structures. + @{ + */ + +/* Memory mapping of Cortex-M0+ Hardware */ +#define SCS_BASE (0xE000E000UL) /*!< System Control Space Base Address */ +#define SysTick_BASE (SCS_BASE + 0x0010UL) /*!< SysTick Base Address */ +#define NVIC_BASE (SCS_BASE + 0x0100UL) /*!< NVIC Base Address */ +#define SCB_BASE (SCS_BASE + 0x0D00UL) /*!< System Control Block Base Address */ + +#define SCB ((SCB_Type *) SCB_BASE ) /*!< SCB configuration struct */ +#define SysTick ((SysTick_Type *) SysTick_BASE ) /*!< SysTick configuration struct */ +#define NVIC ((NVIC_Type *) NVIC_BASE ) /*!< NVIC configuration struct */ + +#if (__MPU_PRESENT == 1) + #define MPU_BASE (SCS_BASE + 0x0D90UL) /*!< Memory Protection Unit */ + #define MPU ((MPU_Type *) MPU_BASE ) /*!< Memory Protection Unit */ +#endif + +/*@} */ + + + +/******************************************************************************* + * Hardware Abstraction Layer + Core Function Interface contains: + - Core NVIC Functions + - Core SysTick Functions + - Core Register Access Functions + ******************************************************************************/ +/** \defgroup CMSIS_Core_FunctionInterface Functions and Instructions Reference +*/ + + + +/* ########################## NVIC functions #################################### */ +/** \ingroup CMSIS_Core_FunctionInterface + \defgroup CMSIS_Core_NVICFunctions NVIC Functions + \brief Functions that manage interrupts and exceptions via the NVIC. + @{ + */ + +/* Interrupt Priorities are WORD accessible only under ARMv6M */ +/* The following MACROS handle generation of the register offset and byte masks */ +#define _BIT_SHIFT(IRQn) ( (((uint32_t)(IRQn) ) & 0x03) * 8 ) +#define _SHP_IDX(IRQn) ( ((((uint32_t)(IRQn) & 0x0F)-8) >> 2) ) +#define _IP_IDX(IRQn) ( ((uint32_t)(IRQn) >> 2) ) + + +/** \brief Enable External Interrupt + + The function enables a device-specific interrupt in the NVIC interrupt controller. + + \param [in] IRQn External interrupt number. Value cannot be negative. + */ +__STATIC_INLINE void NVIC_EnableIRQ(IRQn_Type IRQn) +{ + NVIC->ISER[0] = (1 << ((uint32_t)(IRQn) & 0x1F)); +} + + +/** \brief Disable External Interrupt + + The function disables a device-specific interrupt in the NVIC interrupt controller. + + \param [in] IRQn External interrupt number. Value cannot be negative. + */ +__STATIC_INLINE void NVIC_DisableIRQ(IRQn_Type IRQn) +{ + NVIC->ICER[0] = (1 << ((uint32_t)(IRQn) & 0x1F)); +} + + +/** \brief Get Pending Interrupt + + The function reads the pending register in the NVIC and returns the pending bit + for the specified interrupt. + + \param [in] IRQn Interrupt number. + + \return 0 Interrupt status is not pending. + \return 1 Interrupt status is pending. + */ +__STATIC_INLINE uint32_t NVIC_GetPendingIRQ(IRQn_Type IRQn) +{ + return((uint32_t) ((NVIC->ISPR[0] & (1 << ((uint32_t)(IRQn) & 0x1F)))?1:0)); +} + + +/** \brief Set Pending Interrupt + + The function sets the pending bit of an external interrupt. + + \param [in] IRQn Interrupt number. Value cannot be negative. + */ +__STATIC_INLINE void NVIC_SetPendingIRQ(IRQn_Type IRQn) +{ + NVIC->ISPR[0] = (1 << ((uint32_t)(IRQn) & 0x1F)); +} + + +/** \brief Clear Pending Interrupt + + The function clears the pending bit of an external interrupt. + + \param [in] IRQn External interrupt number. Value cannot be negative. + */ +__STATIC_INLINE void NVIC_ClearPendingIRQ(IRQn_Type IRQn) +{ + NVIC->ICPR[0] = (1 << ((uint32_t)(IRQn) & 0x1F)); /* Clear pending interrupt */ +} + + +/** \brief Set Interrupt Priority + + The function sets the priority of an interrupt. + + \note The priority cannot be set for every core interrupt. + + \param [in] IRQn Interrupt number. + \param [in] priority Priority to set. + */ +__STATIC_INLINE void NVIC_SetPriority(IRQn_Type IRQn, uint32_t priority) +{ + if(IRQn < 0) { + SCB->SHP[_SHP_IDX(IRQn)] = (SCB->SHP[_SHP_IDX(IRQn)] & ~(0xFF << _BIT_SHIFT(IRQn))) | + (((priority << (8 - __NVIC_PRIO_BITS)) & 0xFF) << _BIT_SHIFT(IRQn)); } + else { + NVIC->IP[_IP_IDX(IRQn)] = (NVIC->IP[_IP_IDX(IRQn)] & ~(0xFF << _BIT_SHIFT(IRQn))) | + (((priority << (8 - __NVIC_PRIO_BITS)) & 0xFF) << _BIT_SHIFT(IRQn)); } +} + + +/** \brief Get Interrupt Priority + + The function reads the priority of an interrupt. The interrupt + number can be positive to specify an external (device specific) + interrupt, or negative to specify an internal (core) interrupt. + + + \param [in] IRQn Interrupt number. + \return Interrupt Priority. Value is aligned automatically to the implemented + priority bits of the microcontroller. + */ +__STATIC_INLINE uint32_t NVIC_GetPriority(IRQn_Type IRQn) +{ + + if(IRQn < 0) { + return((uint32_t)(((SCB->SHP[_SHP_IDX(IRQn)] >> _BIT_SHIFT(IRQn) ) & 0xFF) >> (8 - __NVIC_PRIO_BITS))); } /* get priority for Cortex-M0 system interrupts */ + else { + return((uint32_t)(((NVIC->IP[ _IP_IDX(IRQn)] >> _BIT_SHIFT(IRQn) ) & 0xFF) >> (8 - __NVIC_PRIO_BITS))); } /* get priority for device specific interrupts */ +} + + +/** \brief System Reset + + The function initiates a system reset request to reset the MCU. + */ +__STATIC_INLINE void NVIC_SystemReset(void) +{ + __DSB(); /* Ensure all outstanding memory accesses included + buffered write are completed before reset */ + SCB->AIRCR = ((0x5FA << SCB_AIRCR_VECTKEY_Pos) | + SCB_AIRCR_SYSRESETREQ_Msk); + __DSB(); /* Ensure completion of memory access */ + while(1); /* wait until reset */ +} + +/*@} end of CMSIS_Core_NVICFunctions */ + + + +/* ################################## SysTick function ############################################ */ +/** \ingroup CMSIS_Core_FunctionInterface + \defgroup CMSIS_Core_SysTickFunctions SysTick Functions + \brief Functions that configure the System. + @{ + */ + +#if (__Vendor_SysTickConfig == 0) + +/** \brief System Tick Configuration + + The function initializes the System Timer and its interrupt, and starts the System Tick Timer. + Counter is in free running mode to generate periodic interrupts. + + \param [in] ticks Number of ticks between two interrupts. + + \return 0 Function succeeded. + \return 1 Function failed. + + \note When the variable <b>__Vendor_SysTickConfig</b> is set to 1, then the + function <b>SysTick_Config</b> is not included. In this case, the file <b><i>device</i>.h</b> + must contain a vendor-specific implementation of this function. + + */ +__STATIC_INLINE uint32_t SysTick_Config(uint32_t ticks) +{ + if ((ticks - 1) > SysTick_LOAD_RELOAD_Msk) return (1); /* Reload value impossible */ + + SysTick->LOAD = ticks - 1; /* set reload register */ + NVIC_SetPriority (SysTick_IRQn, (1<<__NVIC_PRIO_BITS) - 1); /* set Priority for Systick Interrupt */ + SysTick->VAL = 0; /* Load the SysTick Counter Value */ + SysTick->CTRL = SysTick_CTRL_CLKSOURCE_Msk | + SysTick_CTRL_TICKINT_Msk | + SysTick_CTRL_ENABLE_Msk; /* Enable SysTick IRQ and SysTick Timer */ + return (0); /* Function successful */ +} + +#endif + +/*@} end of CMSIS_Core_SysTickFunctions */ + + + + +#endif /* __CORE_CM0PLUS_H_DEPENDANT */ + +#endif /* __CMSIS_GENERIC */ + +#ifdef __cplusplus +} +#endif diff --git a/Cortex-M0/nanosoc/software/cmsis/CMSIS/Include/core_cmFunc.h b/Cortex-M0/nanosoc/software/cmsis/CMSIS/Include/core_cmFunc.h new file mode 100644 index 0000000..0a18faf --- /dev/null +++ b/Cortex-M0/nanosoc/software/cmsis/CMSIS/Include/core_cmFunc.h @@ -0,0 +1,636 @@ +/**************************************************************************//** + * @file core_cmFunc.h + * @brief CMSIS Cortex-M Core Function Access Header File + * @version V3.20 + * @date 25. February 2013 + * + * @note + * + ******************************************************************************/ +/* Copyright (c) 2009 - 2013 ARM LIMITED + + All rights reserved. + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + - Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + - Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + - Neither the name of ARM nor the names of its contributors may be used + to endorse or promote products derived from this software without + specific prior written permission. + * + 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 COPYRIGHT HOLDERS AND 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 __CORE_CMFUNC_H +#define __CORE_CMFUNC_H + + +/* ########################### Core Function Access ########################### */ +/** \ingroup CMSIS_Core_FunctionInterface + \defgroup CMSIS_Core_RegAccFunctions CMSIS Core Register Access Functions + @{ + */ + +#if defined ( __CC_ARM ) /*------------------RealView Compiler -----------------*/ +/* ARM armcc specific functions */ + +#if (__ARMCC_VERSION < 400677) + #error "Please use ARM Compiler Toolchain V4.0.677 or later!" +#endif + +/* intrinsic void __enable_irq(); */ +/* intrinsic void __disable_irq(); */ + +/** \brief Get Control Register + + This function returns the content of the Control Register. + + \return Control Register value + */ +__STATIC_INLINE uint32_t __get_CONTROL(void) +{ + register uint32_t __regControl __ASM("control"); + return(__regControl); +} + + +/** \brief Set Control Register + + This function writes the given value to the Control Register. + + \param [in] control Control Register value to set + */ +__STATIC_INLINE void __set_CONTROL(uint32_t control) +{ + register uint32_t __regControl __ASM("control"); + __regControl = control; +} + + +/** \brief Get IPSR Register + + This function returns the content of the IPSR Register. + + \return IPSR Register value + */ +__STATIC_INLINE uint32_t __get_IPSR(void) +{ + register uint32_t __regIPSR __ASM("ipsr"); + return(__regIPSR); +} + + +/** \brief Get APSR Register + + This function returns the content of the APSR Register. + + \return APSR Register value + */ +__STATIC_INLINE uint32_t __get_APSR(void) +{ + register uint32_t __regAPSR __ASM("apsr"); + return(__regAPSR); +} + + +/** \brief Get xPSR Register + + This function returns the content of the xPSR Register. + + \return xPSR Register value + */ +__STATIC_INLINE uint32_t __get_xPSR(void) +{ + register uint32_t __regXPSR __ASM("xpsr"); + return(__regXPSR); +} + + +/** \brief Get Process Stack Pointer + + This function returns the current value of the Process Stack Pointer (PSP). + + \return PSP Register value + */ +__STATIC_INLINE uint32_t __get_PSP(void) +{ + register uint32_t __regProcessStackPointer __ASM("psp"); + return(__regProcessStackPointer); +} + + +/** \brief Set Process Stack Pointer + + This function assigns the given value to the Process Stack Pointer (PSP). + + \param [in] topOfProcStack Process Stack Pointer value to set + */ +__STATIC_INLINE void __set_PSP(uint32_t topOfProcStack) +{ + register uint32_t __regProcessStackPointer __ASM("psp"); + __regProcessStackPointer = topOfProcStack; +} + + +/** \brief Get Main Stack Pointer + + This function returns the current value of the Main Stack Pointer (MSP). + + \return MSP Register value + */ +__STATIC_INLINE uint32_t __get_MSP(void) +{ + register uint32_t __regMainStackPointer __ASM("msp"); + return(__regMainStackPointer); +} + + +/** \brief Set Main Stack Pointer + + This function assigns the given value to the Main Stack Pointer (MSP). + + \param [in] topOfMainStack Main Stack Pointer value to set + */ +__STATIC_INLINE void __set_MSP(uint32_t topOfMainStack) +{ + register uint32_t __regMainStackPointer __ASM("msp"); + __regMainStackPointer = topOfMainStack; +} + + +/** \brief Get Priority Mask + + This function returns the current state of the priority mask bit from the Priority Mask Register. + + \return Priority Mask value + */ +__STATIC_INLINE uint32_t __get_PRIMASK(void) +{ + register uint32_t __regPriMask __ASM("primask"); + return(__regPriMask); +} + + +/** \brief Set Priority Mask + + This function assigns the given value to the Priority Mask Register. + + \param [in] priMask Priority Mask + */ +__STATIC_INLINE void __set_PRIMASK(uint32_t priMask) +{ + register uint32_t __regPriMask __ASM("primask"); + __regPriMask = (priMask); +} + + +#if (__CORTEX_M >= 0x03) + +/** \brief Enable FIQ + + This function enables FIQ interrupts by clearing the F-bit in the CPSR. + Can only be executed in Privileged modes. + */ +#define __enable_fault_irq __enable_fiq + + +/** \brief Disable FIQ + + This function disables FIQ interrupts by setting the F-bit in the CPSR. + Can only be executed in Privileged modes. + */ +#define __disable_fault_irq __disable_fiq + + +/** \brief Get Base Priority + + This function returns the current value of the Base Priority register. + + \return Base Priority register value + */ +__STATIC_INLINE uint32_t __get_BASEPRI(void) +{ + register uint32_t __regBasePri __ASM("basepri"); + return(__regBasePri); +} + + +/** \brief Set Base Priority + + This function assigns the given value to the Base Priority register. + + \param [in] basePri Base Priority value to set + */ +__STATIC_INLINE void __set_BASEPRI(uint32_t basePri) +{ + register uint32_t __regBasePri __ASM("basepri"); + __regBasePri = (basePri & 0xff); +} + + +/** \brief Get Fault Mask + + This function returns the current value of the Fault Mask register. + + \return Fault Mask register value + */ +__STATIC_INLINE uint32_t __get_FAULTMASK(void) +{ + register uint32_t __regFaultMask __ASM("faultmask"); + return(__regFaultMask); +} + + +/** \brief Set Fault Mask + + This function assigns the given value to the Fault Mask register. + + \param [in] faultMask Fault Mask value to set + */ +__STATIC_INLINE void __set_FAULTMASK(uint32_t faultMask) +{ + register uint32_t __regFaultMask __ASM("faultmask"); + __regFaultMask = (faultMask & (uint32_t)1); +} + +#endif /* (__CORTEX_M >= 0x03) */ + + +#if (__CORTEX_M == 0x04) + +/** \brief Get FPSCR + + This function returns the current value of the Floating Point Status/Control register. + + \return Floating Point Status/Control register value + */ +__STATIC_INLINE uint32_t __get_FPSCR(void) +{ +#if (__FPU_PRESENT == 1) && (__FPU_USED == 1) + register uint32_t __regfpscr __ASM("fpscr"); + return(__regfpscr); +#else + return(0); +#endif +} + + +/** \brief Set FPSCR + + This function assigns the given value to the Floating Point Status/Control register. + + \param [in] fpscr Floating Point Status/Control value to set + */ +__STATIC_INLINE void __set_FPSCR(uint32_t fpscr) +{ +#if (__FPU_PRESENT == 1) && (__FPU_USED == 1) + register uint32_t __regfpscr __ASM("fpscr"); + __regfpscr = (fpscr); +#endif +} + +#endif /* (__CORTEX_M == 0x04) */ + + +#elif defined ( __ICCARM__ ) /*------------------ ICC Compiler -------------------*/ +/* IAR iccarm specific functions */ + +#include <cmsis_iar.h> + + +#elif defined ( __TMS470__ ) /*---------------- TI CCS Compiler ------------------*/ +/* TI CCS specific functions */ + +#include <cmsis_ccs.h> + + +#elif defined ( __GNUC__ ) /*------------------ GNU Compiler ---------------------*/ +/* GNU gcc specific functions */ + +/** \brief Enable IRQ Interrupts + + This function enables IRQ interrupts by clearing the I-bit in the CPSR. + Can only be executed in Privileged modes. + */ +__attribute__( ( always_inline ) ) __STATIC_INLINE void __enable_irq(void) +{ + __ASM volatile ("cpsie i" : : : "memory"); +} + + +/** \brief Disable IRQ Interrupts + + This function disables IRQ interrupts by setting the I-bit in the CPSR. + Can only be executed in Privileged modes. + */ +__attribute__( ( always_inline ) ) __STATIC_INLINE void __disable_irq(void) +{ + __ASM volatile ("cpsid i" : : : "memory"); +} + + +/** \brief Get Control Register + + This function returns the content of the Control Register. + + \return Control Register value + */ +__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __get_CONTROL(void) +{ + uint32_t result; + + __ASM volatile ("MRS %0, control" : "=r" (result) ); + return(result); +} + + +/** \brief Set Control Register + + This function writes the given value to the Control Register. + + \param [in] control Control Register value to set + */ +__attribute__( ( always_inline ) ) __STATIC_INLINE void __set_CONTROL(uint32_t control) +{ + __ASM volatile ("MSR control, %0" : : "r" (control) : "memory"); +} + + +/** \brief Get IPSR Register + + This function returns the content of the IPSR Register. + + \return IPSR Register value + */ +__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __get_IPSR(void) +{ + uint32_t result; + + __ASM volatile ("MRS %0, ipsr" : "=r" (result) ); + return(result); +} + + +/** \brief Get APSR Register + + This function returns the content of the APSR Register. + + \return APSR Register value + */ +__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __get_APSR(void) +{ + uint32_t result; + + __ASM volatile ("MRS %0, apsr" : "=r" (result) ); + return(result); +} + + +/** \brief Get xPSR Register + + This function returns the content of the xPSR Register. + + \return xPSR Register value + */ +__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __get_xPSR(void) +{ + uint32_t result; + + __ASM volatile ("MRS %0, xpsr" : "=r" (result) ); + return(result); +} + + +/** \brief Get Process Stack Pointer + + This function returns the current value of the Process Stack Pointer (PSP). + + \return PSP Register value + */ +__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __get_PSP(void) +{ + register uint32_t result; + + __ASM volatile ("MRS %0, psp\n" : "=r" (result) ); + return(result); +} + + +/** \brief Set Process Stack Pointer + + This function assigns the given value to the Process Stack Pointer (PSP). + + \param [in] topOfProcStack Process Stack Pointer value to set + */ +__attribute__( ( always_inline ) ) __STATIC_INLINE void __set_PSP(uint32_t topOfProcStack) +{ + __ASM volatile ("MSR psp, %0\n" : : "r" (topOfProcStack) : "sp"); +} + + +/** \brief Get Main Stack Pointer + + This function returns the current value of the Main Stack Pointer (MSP). + + \return MSP Register value + */ +__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __get_MSP(void) +{ + register uint32_t result; + + __ASM volatile ("MRS %0, msp\n" : "=r" (result) ); + return(result); +} + + +/** \brief Set Main Stack Pointer + + This function assigns the given value to the Main Stack Pointer (MSP). + + \param [in] topOfMainStack Main Stack Pointer value to set + */ +__attribute__( ( always_inline ) ) __STATIC_INLINE void __set_MSP(uint32_t topOfMainStack) +{ + __ASM volatile ("MSR msp, %0\n" : : "r" (topOfMainStack) : "sp"); +} + + +/** \brief Get Priority Mask + + This function returns the current state of the priority mask bit from the Priority Mask Register. + + \return Priority Mask value + */ +__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __get_PRIMASK(void) +{ + uint32_t result; + + __ASM volatile ("MRS %0, primask" : "=r" (result) ); + return(result); +} + + +/** \brief Set Priority Mask + + This function assigns the given value to the Priority Mask Register. + + \param [in] priMask Priority Mask + */ +__attribute__( ( always_inline ) ) __STATIC_INLINE void __set_PRIMASK(uint32_t priMask) +{ + __ASM volatile ("MSR primask, %0" : : "r" (priMask) : "memory"); +} + + +#if (__CORTEX_M >= 0x03) + +/** \brief Enable FIQ + + This function enables FIQ interrupts by clearing the F-bit in the CPSR. + Can only be executed in Privileged modes. + */ +__attribute__( ( always_inline ) ) __STATIC_INLINE void __enable_fault_irq(void) +{ + __ASM volatile ("cpsie f" : : : "memory"); +} + + +/** \brief Disable FIQ + + This function disables FIQ interrupts by setting the F-bit in the CPSR. + Can only be executed in Privileged modes. + */ +__attribute__( ( always_inline ) ) __STATIC_INLINE void __disable_fault_irq(void) +{ + __ASM volatile ("cpsid f" : : : "memory"); +} + + +/** \brief Get Base Priority + + This function returns the current value of the Base Priority register. + + \return Base Priority register value + */ +__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __get_BASEPRI(void) +{ + uint32_t result; + + __ASM volatile ("MRS %0, basepri_max" : "=r" (result) ); + return(result); +} + + +/** \brief Set Base Priority + + This function assigns the given value to the Base Priority register. + + \param [in] basePri Base Priority value to set + */ +__attribute__( ( always_inline ) ) __STATIC_INLINE void __set_BASEPRI(uint32_t value) +{ + __ASM volatile ("MSR basepri, %0" : : "r" (value) : "memory"); +} + + +/** \brief Get Fault Mask + + This function returns the current value of the Fault Mask register. + + \return Fault Mask register value + */ +__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __get_FAULTMASK(void) +{ + uint32_t result; + + __ASM volatile ("MRS %0, faultmask" : "=r" (result) ); + return(result); +} + + +/** \brief Set Fault Mask + + This function assigns the given value to the Fault Mask register. + + \param [in] faultMask Fault Mask value to set + */ +__attribute__( ( always_inline ) ) __STATIC_INLINE void __set_FAULTMASK(uint32_t faultMask) +{ + __ASM volatile ("MSR faultmask, %0" : : "r" (faultMask) : "memory"); +} + +#endif /* (__CORTEX_M >= 0x03) */ + + +#if (__CORTEX_M == 0x04) + +/** \brief Get FPSCR + + This function returns the current value of the Floating Point Status/Control register. + + \return Floating Point Status/Control register value + */ +__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __get_FPSCR(void) +{ +#if (__FPU_PRESENT == 1) && (__FPU_USED == 1) + uint32_t result; + + /* Empty asm statement works as a scheduling barrier */ + __ASM volatile (""); + __ASM volatile ("VMRS %0, fpscr" : "=r" (result) ); + __ASM volatile (""); + return(result); +#else + return(0); +#endif +} + + +/** \brief Set FPSCR + + This function assigns the given value to the Floating Point Status/Control register. + + \param [in] fpscr Floating Point Status/Control value to set + */ +__attribute__( ( always_inline ) ) __STATIC_INLINE void __set_FPSCR(uint32_t fpscr) +{ +#if (__FPU_PRESENT == 1) && (__FPU_USED == 1) + /* Empty asm statement works as a scheduling barrier */ + __ASM volatile (""); + __ASM volatile ("VMSR fpscr, %0" : : "r" (fpscr) : "vfpcc"); + __ASM volatile (""); +#endif +} + +#endif /* (__CORTEX_M == 0x04) */ + + +#elif defined ( __TASKING__ ) /*------------------ TASKING Compiler --------------*/ +/* TASKING carm specific functions */ + +/* + * The CMSIS functions have been implemented as intrinsics in the compiler. + * Please use "carm -?i" to get an up to date list of all instrinsics, + * Including the CMSIS ones. + */ + +#endif + +/*@} end of CMSIS_Core_RegAccFunctions */ + + +#endif /* __CORE_CMFUNC_H */ diff --git a/Cortex-M0/nanosoc/software/cmsis/CMSIS/Include/core_cmInstr.h b/Cortex-M0/nanosoc/software/cmsis/CMSIS/Include/core_cmInstr.h new file mode 100644 index 0000000..ab3a010 --- /dev/null +++ b/Cortex-M0/nanosoc/software/cmsis/CMSIS/Include/core_cmInstr.h @@ -0,0 +1,688 @@ +/**************************************************************************//** + * @file core_cmInstr.h + * @brief CMSIS Cortex-M Core Instruction Access Header File + * @version V3.20 + * @date 05. March 2013 + * + * @note + * + ******************************************************************************/ +/* Copyright (c) 2009 - 2013 ARM LIMITED + + All rights reserved. + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + - Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + - Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + - Neither the name of ARM nor the names of its contributors may be used + to endorse or promote products derived from this software without + specific prior written permission. + * + 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 COPYRIGHT HOLDERS AND 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 __CORE_CMINSTR_H +#define __CORE_CMINSTR_H + + +/* ########################## Core Instruction Access ######################### */ +/** \defgroup CMSIS_Core_InstructionInterface CMSIS Core Instruction Interface + Access to dedicated instructions + @{ +*/ + +#if defined ( __CC_ARM ) /*------------------RealView Compiler -----------------*/ +/* ARM armcc specific functions */ + +#if (__ARMCC_VERSION < 400677) + #error "Please use ARM Compiler Toolchain V4.0.677 or later!" +#endif + + +/** \brief No Operation + + No Operation does nothing. This instruction can be used for code alignment purposes. + */ +#define __NOP __nop + + +/** \brief Wait For Interrupt + + Wait For Interrupt is a hint instruction that suspends execution + until one of a number of events occurs. + */ +#define __WFI __wfi + + +/** \brief Wait For Event + + Wait For Event is a hint instruction that permits the processor to enter + a low-power state until one of a number of events occurs. + */ +#define __WFE __wfe + + +/** \brief Send Event + + Send Event is a hint instruction. It causes an event to be signaled to the CPU. + */ +#define __SEV __sev + + +/** \brief Instruction Synchronization Barrier + + Instruction Synchronization Barrier flushes the pipeline in the processor, + so that all instructions following the ISB are fetched from cache or + memory, after the instruction has been completed. + */ +#define __ISB() __isb(0xF) + + +/** \brief Data Synchronization Barrier + + This function acts as a special kind of Data Memory Barrier. + It completes when all explicit memory accesses before this instruction complete. + */ +#define __DSB() __dsb(0xF) + + +/** \brief Data Memory Barrier + + This function ensures the apparent order of the explicit memory operations before + and after the instruction, without ensuring their completion. + */ +#define __DMB() __dmb(0xF) + + +/** \brief Reverse byte order (32 bit) + + This function reverses the byte order in integer value. + + \param [in] value Value to reverse + \return Reversed value + */ +#define __REV __rev + + +/** \brief Reverse byte order (16 bit) + + This function reverses the byte order in two unsigned short values. + + \param [in] value Value to reverse + \return Reversed value + */ +#ifndef __NO_EMBEDDED_ASM +__attribute__((section(".rev16_text"))) __STATIC_INLINE __ASM uint32_t __REV16(uint32_t value) +{ + rev16 r0, r0 + bx lr +} +#endif + +/** \brief Reverse byte order in signed short value + + This function reverses the byte order in a signed short value with sign extension to integer. + + \param [in] value Value to reverse + \return Reversed value + */ +#ifndef __NO_EMBEDDED_ASM +__attribute__((section(".revsh_text"))) __STATIC_INLINE __ASM int32_t __REVSH(int32_t value) +{ + revsh r0, r0 + bx lr +} +#endif + + +/** \brief Rotate Right in unsigned value (32 bit) + + This function Rotate Right (immediate) provides the value of the contents of a register rotated by a variable number of bits. + + \param [in] value Value to rotate + \param [in] value Number of Bits to rotate + \return Rotated value + */ +#define __ROR __ror + + +/** \brief Breakpoint + + This function causes the processor to enter Debug state. + Debug tools can use this to investigate system state when the instruction at a particular address is reached. + + \param [in] value is ignored by the processor. + If required, a debugger can use it to store additional information about the breakpoint. + */ +#define __BKPT(value) __breakpoint(value) + + +#if (__CORTEX_M >= 0x03) + +/** \brief Reverse bit order of value + + This function reverses the bit order of the given value. + + \param [in] value Value to reverse + \return Reversed value + */ +#define __RBIT __rbit + + +/** \brief LDR Exclusive (8 bit) + + This function performs a exclusive LDR command for 8 bit value. + + \param [in] ptr Pointer to data + \return value of type uint8_t at (*ptr) + */ +#define __LDREXB(ptr) ((uint8_t ) __ldrex(ptr)) + + +/** \brief LDR Exclusive (16 bit) + + This function performs a exclusive LDR command for 16 bit values. + + \param [in] ptr Pointer to data + \return value of type uint16_t at (*ptr) + */ +#define __LDREXH(ptr) ((uint16_t) __ldrex(ptr)) + + +/** \brief LDR Exclusive (32 bit) + + This function performs a exclusive LDR command for 32 bit values. + + \param [in] ptr Pointer to data + \return value of type uint32_t at (*ptr) + */ +#define __LDREXW(ptr) ((uint32_t ) __ldrex(ptr)) + + +/** \brief STR Exclusive (8 bit) + + This function performs a exclusive STR command for 8 bit values. + + \param [in] value Value to store + \param [in] ptr Pointer to location + \return 0 Function succeeded + \return 1 Function failed + */ +#define __STREXB(value, ptr) __strex(value, ptr) + + +/** \brief STR Exclusive (16 bit) + + This function performs a exclusive STR command for 16 bit values. + + \param [in] value Value to store + \param [in] ptr Pointer to location + \return 0 Function succeeded + \return 1 Function failed + */ +#define __STREXH(value, ptr) __strex(value, ptr) + + +/** \brief STR Exclusive (32 bit) + + This function performs a exclusive STR command for 32 bit values. + + \param [in] value Value to store + \param [in] ptr Pointer to location + \return 0 Function succeeded + \return 1 Function failed + */ +#define __STREXW(value, ptr) __strex(value, ptr) + + +/** \brief Remove the exclusive lock + + This function removes the exclusive lock which is created by LDREX. + + */ +#define __CLREX __clrex + + +/** \brief Signed Saturate + + This function saturates a signed value. + + \param [in] value Value to be saturated + \param [in] sat Bit position to saturate to (1..32) + \return Saturated value + */ +#define __SSAT __ssat + + +/** \brief Unsigned Saturate + + This function saturates an unsigned value. + + \param [in] value Value to be saturated + \param [in] sat Bit position to saturate to (0..31) + \return Saturated value + */ +#define __USAT __usat + + +/** \brief Count leading zeros + + This function counts the number of leading zeros of a data value. + + \param [in] value Value to count the leading zeros + \return number of leading zeros in value + */ +#define __CLZ __clz + +#endif /* (__CORTEX_M >= 0x03) */ + + + +#elif defined ( __ICCARM__ ) /*------------------ ICC Compiler -------------------*/ +/* IAR iccarm specific functions */ + +#include <cmsis_iar.h> + + +#elif defined ( __TMS470__ ) /*---------------- TI CCS Compiler ------------------*/ +/* TI CCS specific functions */ + +#include <cmsis_ccs.h> + + +#elif defined ( __GNUC__ ) /*------------------ GNU Compiler ---------------------*/ +/* GNU gcc specific functions */ + +/* Define macros for porting to both thumb1 and thumb2. + * For thumb1, use low register (r0-r7), specified by constrant "l" + * Otherwise, use general registers, specified by constrant "r" */ +#if defined (__thumb__) && !defined (__thumb2__) +#define __CMSIS_GCC_OUT_REG(r) "=l" (r) +#define __CMSIS_GCC_USE_REG(r) "l" (r) +#else +#define __CMSIS_GCC_OUT_REG(r) "=r" (r) +#define __CMSIS_GCC_USE_REG(r) "r" (r) +#endif + +/** \brief No Operation + + No Operation does nothing. This instruction can be used for code alignment purposes. + */ +__attribute__( ( always_inline ) ) __STATIC_INLINE void __NOP(void) +{ + __ASM volatile ("nop"); +} + + +/** \brief Wait For Interrupt + + Wait For Interrupt is a hint instruction that suspends execution + until one of a number of events occurs. + */ +__attribute__( ( always_inline ) ) __STATIC_INLINE void __WFI(void) +{ + __ASM volatile ("wfi"); +} + + +/** \brief Wait For Event + + Wait For Event is a hint instruction that permits the processor to enter + a low-power state until one of a number of events occurs. + */ +__attribute__( ( always_inline ) ) __STATIC_INLINE void __WFE(void) +{ + __ASM volatile ("wfe"); +} + + +/** \brief Send Event + + Send Event is a hint instruction. It causes an event to be signaled to the CPU. + */ +__attribute__( ( always_inline ) ) __STATIC_INLINE void __SEV(void) +{ + __ASM volatile ("sev"); +} + + +/** \brief Instruction Synchronization Barrier + + Instruction Synchronization Barrier flushes the pipeline in the processor, + so that all instructions following the ISB are fetched from cache or + memory, after the instruction has been completed. + */ +__attribute__( ( always_inline ) ) __STATIC_INLINE void __ISB(void) +{ + __ASM volatile ("isb"); +} + + +/** \brief Data Synchronization Barrier + + This function acts as a special kind of Data Memory Barrier. + It completes when all explicit memory accesses before this instruction complete. + */ +__attribute__( ( always_inline ) ) __STATIC_INLINE void __DSB(void) +{ + __ASM volatile ("dsb"); +} + + +/** \brief Data Memory Barrier + + This function ensures the apparent order of the explicit memory operations before + and after the instruction, without ensuring their completion. + */ +__attribute__( ( always_inline ) ) __STATIC_INLINE void __DMB(void) +{ + __ASM volatile ("dmb"); +} + + +/** \brief Reverse byte order (32 bit) + + This function reverses the byte order in integer value. + + \param [in] value Value to reverse + \return Reversed value + */ +__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __REV(uint32_t value) +{ +#if (__GNUC__ > 4) || (__GNUC__ == 4 && __GNUC_MINOR__ >= 5) + return __builtin_bswap32(value); +#else + uint32_t result; + + __ASM volatile ("rev %0, %1" : __CMSIS_GCC_OUT_REG (result) : __CMSIS_GCC_USE_REG (value) ); + return(result); +#endif +} + + +/** \brief Reverse byte order (16 bit) + + This function reverses the byte order in two unsigned short values. + + \param [in] value Value to reverse + \return Reversed value + */ +__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __REV16(uint32_t value) +{ + uint32_t result; + + __ASM volatile ("rev16 %0, %1" : __CMSIS_GCC_OUT_REG (result) : __CMSIS_GCC_USE_REG (value) ); + return(result); +} + + +/** \brief Reverse byte order in signed short value + + This function reverses the byte order in a signed short value with sign extension to integer. + + \param [in] value Value to reverse + \return Reversed value + */ +__attribute__( ( always_inline ) ) __STATIC_INLINE int32_t __REVSH(int32_t value) +{ +#if (__GNUC__ > 4) || (__GNUC__ == 4 && __GNUC_MINOR__ >= 8) + return (short)__builtin_bswap16(value); +#else + uint32_t result; + + __ASM volatile ("revsh %0, %1" : __CMSIS_GCC_OUT_REG (result) : __CMSIS_GCC_USE_REG (value) ); + return(result); +#endif +} + + +/** \brief Rotate Right in unsigned value (32 bit) + + This function Rotate Right (immediate) provides the value of the contents of a register rotated by a variable number of bits. + + \param [in] value Value to rotate + \param [in] value Number of Bits to rotate + \return Rotated value + */ +__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __ROR(uint32_t op1, uint32_t op2) +{ + return (op1 >> op2) | (op1 << (32 - op2)); +} + + +/** \brief Breakpoint + + This function causes the processor to enter Debug state. + Debug tools can use this to investigate system state when the instruction at a particular address is reached. + + \param [in] value is ignored by the processor. + If required, a debugger can use it to store additional information about the breakpoint. + */ +#define __BKPT(value) __ASM volatile ("bkpt "#value) + + +#if (__CORTEX_M >= 0x03) + +/** \brief Reverse bit order of value + + This function reverses the bit order of the given value. + + \param [in] value Value to reverse + \return Reversed value + */ +__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __RBIT(uint32_t value) +{ + uint32_t result; + + __ASM volatile ("rbit %0, %1" : "=r" (result) : "r" (value) ); + return(result); +} + + +/** \brief LDR Exclusive (8 bit) + + This function performs a exclusive LDR command for 8 bit value. + + \param [in] ptr Pointer to data + \return value of type uint8_t at (*ptr) + */ +__attribute__( ( always_inline ) ) __STATIC_INLINE uint8_t __LDREXB(volatile uint8_t *addr) +{ + uint32_t result; + +#if (__GNUC__ > 4) || (__GNUC__ == 4 && __GNUC_MINOR__ >= 8) + __ASM volatile ("ldrexb %0, %1" : "=r" (result) : "Q" (*addr) ); +#else + /* Prior to GCC 4.8, "Q" will be expanded to [rx, #0] which is not + accepted by assembler. So has to use following less efficient pattern. + */ + __ASM volatile ("ldrexb %0, [%1]" : "=r" (result) : "r" (addr) : "memory" ); +#endif + return(result); +} + + +/** \brief LDR Exclusive (16 bit) + + This function performs a exclusive LDR command for 16 bit values. + + \param [in] ptr Pointer to data + \return value of type uint16_t at (*ptr) + */ +__attribute__( ( always_inline ) ) __STATIC_INLINE uint16_t __LDREXH(volatile uint16_t *addr) +{ + uint32_t result; + +#if (__GNUC__ > 4) || (__GNUC__ == 4 && __GNUC_MINOR__ >= 8) + __ASM volatile ("ldrexh %0, %1" : "=r" (result) : "Q" (*addr) ); +#else + /* Prior to GCC 4.8, "Q" will be expanded to [rx, #0] which is not + accepted by assembler. So has to use following less efficient pattern. + */ + __ASM volatile ("ldrexh %0, [%1]" : "=r" (result) : "r" (addr) : "memory" ); +#endif + return(result); +} + + +/** \brief LDR Exclusive (32 bit) + + This function performs a exclusive LDR command for 32 bit values. + + \param [in] ptr Pointer to data + \return value of type uint32_t at (*ptr) + */ +__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __LDREXW(volatile uint32_t *addr) +{ + uint32_t result; + + __ASM volatile ("ldrex %0, %1" : "=r" (result) : "Q" (*addr) ); + return(result); +} + + +/** \brief STR Exclusive (8 bit) + + This function performs a exclusive STR command for 8 bit values. + + \param [in] value Value to store + \param [in] ptr Pointer to location + \return 0 Function succeeded + \return 1 Function failed + */ +__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __STREXB(uint8_t value, volatile uint8_t *addr) +{ + uint32_t result; + + __ASM volatile ("strexb %0, %2, %1" : "=&r" (result), "=Q" (*addr) : "r" (value) ); + return(result); +} + + +/** \brief STR Exclusive (16 bit) + + This function performs a exclusive STR command for 16 bit values. + + \param [in] value Value to store + \param [in] ptr Pointer to location + \return 0 Function succeeded + \return 1 Function failed + */ +__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __STREXH(uint16_t value, volatile uint16_t *addr) +{ + uint32_t result; + + __ASM volatile ("strexh %0, %2, %1" : "=&r" (result), "=Q" (*addr) : "r" (value) ); + return(result); +} + + +/** \brief STR Exclusive (32 bit) + + This function performs a exclusive STR command for 32 bit values. + + \param [in] value Value to store + \param [in] ptr Pointer to location + \return 0 Function succeeded + \return 1 Function failed + */ +__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __STREXW(uint32_t value, volatile uint32_t *addr) +{ + uint32_t result; + + __ASM volatile ("strex %0, %2, %1" : "=&r" (result), "=Q" (*addr) : "r" (value) ); + return(result); +} + + +/** \brief Remove the exclusive lock + + This function removes the exclusive lock which is created by LDREX. + + */ +__attribute__( ( always_inline ) ) __STATIC_INLINE void __CLREX(void) +{ + __ASM volatile ("clrex" ::: "memory"); +} + + +/** \brief Signed Saturate + + This function saturates a signed value. + + \param [in] value Value to be saturated + \param [in] sat Bit position to saturate to (1..32) + \return Saturated value + */ +#define __SSAT(ARG1,ARG2) \ +({ \ + uint32_t __RES, __ARG1 = (ARG1); \ + __ASM ("ssat %0, %1, %2" : "=r" (__RES) : "I" (ARG2), "r" (__ARG1) ); \ + __RES; \ + }) + + +/** \brief Unsigned Saturate + + This function saturates an unsigned value. + + \param [in] value Value to be saturated + \param [in] sat Bit position to saturate to (0..31) + \return Saturated value + */ +#define __USAT(ARG1,ARG2) \ +({ \ + uint32_t __RES, __ARG1 = (ARG1); \ + __ASM ("usat %0, %1, %2" : "=r" (__RES) : "I" (ARG2), "r" (__ARG1) ); \ + __RES; \ + }) + + +/** \brief Count leading zeros + + This function counts the number of leading zeros of a data value. + + \param [in] value Value to count the leading zeros + \return number of leading zeros in value + */ +__attribute__( ( always_inline ) ) __STATIC_INLINE uint8_t __CLZ(uint32_t value) +{ + uint32_t result; + + __ASM volatile ("clz %0, %1" : "=r" (result) : "r" (value) ); + return(result); +} + +#endif /* (__CORTEX_M >= 0x03) */ + + + + +#elif defined ( __TASKING__ ) /*------------------ TASKING Compiler --------------*/ +/* TASKING carm specific functions */ + +/* + * The CMSIS functions have been implemented as intrinsics in the compiler. + * Please use "carm -?i" to get an up to date list of all intrinsics, + * Including the CMSIS ones. + */ + +#endif + +/*@}*/ /* end of group CMSIS_Core_InstructionInterface */ + +#endif /* __CORE_CMINSTR_H */ diff --git a/Cortex-M0/nanosoc/software/cmsis/Device/ARM/CMSDK_CM0/Include/CMSDK_CM0.h b/Cortex-M0/nanosoc/software/cmsis/Device/ARM/CMSDK_CM0/Include/CMSDK_CM0.h new file mode 100644 index 0000000..ed3df93 --- /dev/null +++ b/Cortex-M0/nanosoc/software/cmsis/Device/ARM/CMSDK_CM0/Include/CMSDK_CM0.h @@ -0,0 +1,1313 @@ +//----------------------------------------------------------------------------- +// enhanced top-level example Cortex-M0 controller +// A joint work commissioned on behalf of SoC Labs, under Arm Academic Access license. +// +// Contributors +// +// David Flynn (d.w.flynn@soton.ac.uk) +// +// Copyright � 2021-2, SoC Labs (www.soclabs.org) +//----------------------------------------------------------------------------- + +/**************************************************************************//** + * @file CMSDK_CM0.h + * @brief CMSIS Cortex-M0 Core Peripheral Access Layer Header File for + * Device CMSDK + * @version V3.01 + * @date 06. March 2012 + * + * @note + * Copyright (C) 2010-2012 ARM Limited. All rights reserved. + * + * @par + * ARM Limited (ARM) is supplying this software for use with Cortex-M + * processor based microcontrollers. This file can be freely distributed + * within development tools that are supporting such ARM based processors. + * + * @par + * THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED + * OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. + * ARM SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR + * CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. + * + ******************************************************************************/ + + +#ifndef CMSDK_H +#define CMSDK_H + +#ifdef __cplusplus + extern "C" { +#endif + +/** @addtogroup CMSDK_Definitions CMSDK Definitions + This file defines all structures and symbols for CMSDK: + - registers and bitfields + - peripheral base address + - peripheral ID + - Peripheral definitions + @{ +*/ + + +/******************************************************************************/ +/* Processor and Core Peripherals */ +/******************************************************************************/ +/** @addtogroup CMSDK_CMSIS Device CMSIS Definitions + Configuration of the Cortex-M0 Processor and Core Peripherals + @{ +*/ + +/* + * ========================================================================== + * ---------- Interrupt Number Definition ----------------------------------- + * ========================================================================== + */ + +typedef enum IRQn +{ +/****** Cortex-M0 Processor Exceptions Numbers ***************************************************/ + +/* ToDo: use this Cortex interrupt numbers if your device is a CORTEX-M0 device */ + NonMaskableInt_IRQn = -14, /*!< 2 Cortex-M0 Non Maskable Interrupt */ + HardFault_IRQn = -13, /*!< 3 Cortex-M0 Hard Fault Interrupt */ + SVCall_IRQn = -5, /*!< 11 Cortex-M0 SV Call Interrupt */ + PendSV_IRQn = -2, /*!< 14 Cortex-M0 Pend SV Interrupt */ + SysTick_IRQn = -1, /*!< 15 Cortex-M0 System Tick Interrupt */ + +/****** CMSDK Specific Interrupt Numbers *********************************************************/ + UARTRX0_IRQn = 0, /*!< UART 0 RX Interrupt */ + UARTTX0_IRQn = 1, /*!< UART 0 TX Interrupt */ + UARTRX1_IRQn = 2, /*!< UART 1 RX Interrupt */ + UARTTX1_IRQn = 3, /*!< UART 1 TX Interrupt */ + UARTRX2_IRQn = 4, /*!< UART 2 RX Interrupt */ + UARTTX2_IRQn = 5, /*!< UART 2 TX Interrupt */ + PORT0_ALL_IRQn = 6, /*!< Port 1 combined Interrupt */ + PORT1_ALL_IRQn = 7, /*!< Port 1 combined Interrupt */ + TIMER0_IRQn = 8, /*!< TIMER 0 Interrupt */ + TIMER1_IRQn = 9, /*!< TIMER 1 Interrupt */ + DUALTIMER_IRQn = 10, /*!< Dual Timer Interrupt */ + /*!< IRQ11 - Unused */ + UARTOVF0_IRQn = 12, /*!< UART 0 Overflow Interrupt */ + UARTOVF1_IRQn = 13, /*!< UART 1 Overflow Interrupt */ + UARTOVF2_IRQn = 14, /*!< UART 2 Overflow Interrupt */ + DMA_IRQn = 15, /*!< PL230 DMA Done + Error Interrupt */ + PORT0_0_IRQn = 16, /*!< All P0 I/O pins can be used as interrupt source. */ + PORT0_1_IRQn = 17, /*!< There are 16 pins in total */ + PORT0_2_IRQn = 18, + PORT0_3_IRQn = 19, + PORT0_4_IRQn = 20, + PORT0_5_IRQn = 21, + PORT0_6_IRQn = 22, + PORT0_7_IRQn = 23, + PORT0_8_IRQn = 24, + PORT0_9_IRQn = 25, + PORT0_10_IRQn = 26, + PORT0_11_IRQn = 27, + PORT0_12_IRQn = 28, + PORT0_13_IRQn = 29, + PORT0_14_IRQn = 30, + PORT0_15_IRQn = 31, +} IRQn_Type; + + +/* + * ========================================================================== + * ----------- Processor and Core Peripheral Section ------------------------ + * ========================================================================== + */ + +/* Configuration of the Cortex-M0 Processor and Core Peripherals */ +#define __CM0_REV 0x0000 /*!< Core Revision r0p0 */ +#define __NVIC_PRIO_BITS 2 /*!< Number of Bits used for Priority Levels */ +#define __Vendor_SysTickConfig 0 /*!< Set to 1 if different SysTick Config is used */ +#define __MPU_PRESENT 0 /*!< MPU present or not */ + +/*@}*/ /* end of group CMSDK_CMSIS */ + + +#include "core_cm0.h" /* Cortex-M0 processor and core peripherals */ +#include "system_CMSDK_CM0.h" /* CMSDK System include file */ + + +/******************************************************************************/ +/* Device Specific Peripheral registers structures */ +/******************************************************************************/ +/** @addtogroup CMSDK_Peripherals CMSDK Peripherals + CMSDK Device Specific Peripheral registers structures + @{ +*/ + +#if defined ( __CC_ARM ) +#pragma anon_unions +#endif + +/*------------- Universal Asynchronous Receiver Transmitter (UART) -----------*/ +/** @addtogroup CMSDK_UART CMSDK Universal Asynchronous Receiver/Transmitter + memory mapped structure for CMSDK_UART + @{ +*/ +typedef struct +{ + __IO uint32_t DATA; /*!< Offset: 0x000 Data Register (R/W) */ + __IO uint32_t STATE; /*!< Offset: 0x004 Status Register (R/W) */ + __IO uint32_t CTRL; /*!< Offset: 0x008 Control Register (R/W) */ + union { + __I uint32_t INTSTATUS; /*!< Offset: 0x00C Interrupt Status Register (R/ ) */ + __O uint32_t INTCLEAR; /*!< Offset: 0x00C Interrupt Clear Register ( /W) */ + }; + __IO uint32_t BAUDDIV; /*!< Offset: 0x010 Baudrate Divider Register (R/W) */ + +} CMSDK_UART_TypeDef; + +/* CMSDK_UART DATA Register Definitions */ + +#define CMSDK_UART_DATA_Pos 0 /*!< CMSDK_UART_DATA_Pos: DATA Position */ +#define CMSDK_UART_DATA_Msk (0xFFul << CMSDK_UART_DATA_Pos) /*!< CMSDK_UART DATA: DATA Mask */ + +#define CMSDK_UART_STATE_RXOR_Pos 3 /*!< CMSDK_UART STATE: RXOR Position */ +#define CMSDK_UART_STATE_RXOR_Msk (0x1ul << CMSDK_UART_STATE_RXOR_Pos) /*!< CMSDK_UART STATE: RXOR Mask */ + +#define CMSDK_UART_STATE_TXOR_Pos 2 /*!< CMSDK_UART STATE: TXOR Position */ +#define CMSDK_UART_STATE_TXOR_Msk (0x1ul << CMSDK_UART_STATE_TXOR_Pos) /*!< CMSDK_UART STATE: TXOR Mask */ + +#define CMSDK_UART_STATE_RXBF_Pos 1 /*!< CMSDK_UART STATE: RXBF Position */ +#define CMSDK_UART_STATE_RXBF_Msk (0x1ul << CMSDK_UART_STATE_RXBF_Pos) /*!< CMSDK_UART STATE: RXBF Mask */ + +#define CMSDK_UART_STATE_TXBF_Pos 0 /*!< CMSDK_UART STATE: TXBF Position */ +#define CMSDK_UART_STATE_TXBF_Msk (0x1ul << CMSDK_UART_STATE_TXBF_Pos ) /*!< CMSDK_UART STATE: TXBF Mask */ + +#define CMSDK_UART_CTRL_HSTM_Pos 6 /*!< CMSDK_UART CTRL: HSTM Position */ +#define CMSDK_UART_CTRL_HSTM_Msk (0x01ul << CMSDK_UART_CTRL_HSTM_Pos) /*!< CMSDK_UART CTRL: HSTM Mask */ + +#define CMSDK_UART_CTRL_RXORIRQEN_Pos 5 /*!< CMSDK_UART CTRL: RXORIRQEN Position */ +#define CMSDK_UART_CTRL_RXORIRQEN_Msk (0x01ul << CMSDK_UART_CTRL_RXORIRQEN_Pos) /*!< CMSDK_UART CTRL: RXORIRQEN Mask */ + +#define CMSDK_UART_CTRL_TXORIRQEN_Pos 4 /*!< CMSDK_UART CTRL: TXORIRQEN Position */ +#define CMSDK_UART_CTRL_TXORIRQEN_Msk (0x01ul << CMSDK_UART_CTRL_TXORIRQEN_Pos) /*!< CMSDK_UART CTRL: TXORIRQEN Mask */ + +#define CMSDK_UART_CTRL_RXIRQEN_Pos 3 /*!< CMSDK_UART CTRL: RXIRQEN Position */ +#define CMSDK_UART_CTRL_RXIRQEN_Msk (0x01ul << CMSDK_UART_CTRL_RXIRQEN_Pos) /*!< CMSDK_UART CTRL: RXIRQEN Mask */ + +#define CMSDK_UART_CTRL_TXIRQEN_Pos 2 /*!< CMSDK_UART CTRL: TXIRQEN Position */ +#define CMSDK_UART_CTRL_TXIRQEN_Msk (0x01ul << CMSDK_UART_CTRL_TXIRQEN_Pos) /*!< CMSDK_UART CTRL: TXIRQEN Mask */ + +#define CMSDK_UART_CTRL_RXEN_Pos 1 /*!< CMSDK_UART CTRL: RXEN Position */ +#define CMSDK_UART_CTRL_RXEN_Msk (0x01ul << CMSDK_UART_CTRL_RXEN_Pos) /*!< CMSDK_UART CTRL: RXEN Mask */ + +#define CMSDK_UART_CTRL_TXEN_Pos 0 /*!< CMSDK_UART CTRL: TXEN Position */ +#define CMSDK_UART_CTRL_TXEN_Msk (0x01ul << CMSDK_UART_CTRL_TXEN_Pos) /*!< CMSDK_UART CTRL: TXEN Mask */ + +#define CMSDK_UART_INTSTATUS_RXORIRQ_Pos 3 /*!< CMSDK_UART CTRL: RXORIRQ Position */ +#define CMSDK_UART_CTRL_RXORIRQ_Msk (0x01ul << CMSDK_UART_INTSTATUS_RXORIRQ_Pos) /*!< CMSDK_UART CTRL: RXORIRQ Mask */ + +#define CMSDK_UART_CTRL_TXORIRQ_Pos 2 /*!< CMSDK_UART CTRL: TXORIRQ Position */ +#define CMSDK_UART_CTRL_TXORIRQ_Msk (0x01ul << CMSDK_UART_CTRL_TXORIRQ_Pos) /*!< CMSDK_UART CTRL: TXORIRQ Mask */ + +#define CMSDK_UART_CTRL_RXIRQ_Pos 1 /*!< CMSDK_UART CTRL: RXIRQ Position */ +#define CMSDK_UART_CTRL_RXIRQ_Msk (0x01ul << CMSDK_UART_CTRL_RXIRQ_Pos) /*!< CMSDK_UART CTRL: RXIRQ Mask */ + +#define CMSDK_UART_CTRL_TXIRQ_Pos 0 /*!< CMSDK_UART CTRL: TXIRQ Position */ +#define CMSDK_UART_CTRL_TXIRQ_Msk (0x01ul << CMSDK_UART_CTRL_TXIRQ_Pos) /*!< CMSDK_UART CTRL: TXIRQ Mask */ + +#define CMSDK_UART_BAUDDIV_Pos 0 /*!< CMSDK_UART BAUDDIV: BAUDDIV Position */ +#define CMSDK_UART_BAUDDIV_Msk (0xFFFFFul << CMSDK_UART_BAUDDIV_Pos) /*!< CMSDK_UART BAUDDIV: BAUDDIV Mask */ + +/*@}*/ /* end of group CMSDK_UART */ + + +/*----------------------------- Timer (TIMER) -------------------------------*/ +/** @addtogroup CMSDK_TIMER CMSDK Timer + @{ +*/ +typedef struct +{ + __IO uint32_t CTRL; /*!< Offset: 0x000 Control Register (R/W) */ + __IO uint32_t VALUE; /*!< Offset: 0x004 Current Value Register (R/W) */ + __IO uint32_t RELOAD; /*!< Offset: 0x008 Reload Value Register (R/W) */ + union { + __I uint32_t INTSTATUS; /*!< Offset: 0x00C Interrupt Status Register (R/ ) */ + __O uint32_t INTCLEAR; /*!< Offset: 0x00C Interrupt Clear Register ( /W) */ + }; + +} CMSDK_TIMER_TypeDef; + +/* CMSDK_TIMER CTRL Register Definitions */ + +#define CMSDK_TIMER_CTRL_IRQEN_Pos 3 /*!< CMSDK_TIMER CTRL: IRQEN Position */ +#define CMSDK_TIMER_CTRL_IRQEN_Msk (0x01ul << CMSDK_TIMER_CTRL_IRQEN_Pos) /*!< CMSDK_TIMER CTRL: IRQEN Mask */ + +#define CMSDK_TIMER_CTRL_SELEXTCLK_Pos 2 /*!< CMSDK_TIMER CTRL: SELEXTCLK Position */ +#define CMSDK_TIMER_CTRL_SELEXTCLK_Msk (0x01ul << CMSDK_TIMER_CTRL_SELEXTCLK_Pos) /*!< CMSDK_TIMER CTRL: SELEXTCLK Mask */ + +#define CMSDK_TIMER_CTRL_SELEXTEN_Pos 1 /*!< CMSDK_TIMER CTRL: SELEXTEN Position */ +#define CMSDK_TIMER_CTRL_SELEXTEN_Msk (0x01ul << CMSDK_TIMER_CTRL_SELEXTEN_Pos) /*!< CMSDK_TIMER CTRL: SELEXTEN Mask */ + +#define CMSDK_TIMER_CTRL_EN_Pos 0 /*!< CMSDK_TIMER CTRL: EN Position */ +#define CMSDK_TIMER_CTRL_EN_Msk (0x01ul << CMSDK_TIMER_CTRL_EN_Pos) /*!< CMSDK_TIMER CTRL: EN Mask */ + +#define CMSDK_TIMER_VAL_CURRENT_Pos 0 /*!< CMSDK_TIMER VALUE: CURRENT Position */ +#define CMSDK_TIMER_VAL_CURRENT_Msk (0xFFFFFFFFul << CMSDK_TIMER_VAL_CURRENT_Pos) /*!< CMSDK_TIMER VALUE: CURRENT Mask */ + +#define CMSDK_TIMER_RELOAD_VAL_Pos 0 /*!< CMSDK_TIMER RELOAD: RELOAD Position */ +#define CMSDK_TIMER_RELOAD_VAL_Msk (0xFFFFFFFFul << CMSDK_TIMER_RELOAD_VAL_Pos) /*!< CMSDK_TIMER RELOAD: RELOAD Mask */ + +#define CMSDK_TIMER_INTSTATUS_Pos 0 /*!< CMSDK_TIMER INTSTATUS: INTSTATUSPosition */ +#define CMSDK_TIMER_INTSTATUS_Msk (0x01ul << CMSDK_TIMER_INTSTATUS_Pos) /*!< CMSDK_TIMER INTSTATUS: INTSTATUSMask */ + +#define CMSDK_TIMER_INTCLEAR_Pos 0 /*!< CMSDK_TIMER INTCLEAR: INTCLEAR Position */ +#define CMSDK_TIMER_INTCLEAR_Msk (0x01ul << CMSDK_TIMER_INTCLEAR_Pos) /*!< CMSDK_TIMER INTCLEAR: INTCLEAR Mask */ + +/*@}*/ /* end of group CMSDK_TIMER */ + + +/*------------- Timer (TIM) --------------------------------------------------*/ +// <g> Timer (TIM) + +/** @addtogroup CMSDK_DualTIMER CMSDK Dual Timer + @{ +*/ + +typedef struct +{ + __IO uint32_t Timer1Load; // <h> Timer 1 Load </h> + __I uint32_t Timer1Value; // <h> Timer 1 Counter Current Value <r></h> + __IO uint32_t Timer1Control;// <h> Timer 1 Control + // <o.7> TimerEn: Timer Enable + // <o.6> TimerMode: Timer Mode + // <0=> Freerunning-mode + // <1=> Periodic mode + // <o.5> IntEnable: Interrupt Enable + // <o.2..3> TimerPre: Timer Prescale + // <0=> / 1 + // <1=> / 16 + // <2=> / 256 + // <3=> Undefined! + // <o.1> TimerSize: Timer Size + // <0=> 16-bit counter + // <1=> 32-bit counter + // <o.0> OneShot: One-shoot mode + // <0=> Wrapping mode + // <1=> One-shot mode + // </h> + __O uint32_t Timer1IntClr; // <h> Timer 1 Interrupt Clear <w></h> + __I uint32_t Timer1RIS; // <h> Timer 1 Raw Interrupt Status <r></h> + __I uint32_t Timer1MIS; // <h> Timer 1 Masked Interrupt Status <r></h> + __IO uint32_t Timer1BGLoad; // <h> Background Load Register </h> + uint32_t RESERVED0; + __IO uint32_t Timer2Load; // <h> Timer 2 Load </h> + __I uint32_t Timer2Value; // <h> Timer 2 Counter Current Value <r></h> + __IO uint32_t Timer2Control;// <h> Timer 2 Control + // <o.7> TimerEn: Timer Enable + // <o.6> TimerMode: Timer Mode + // <0=> Freerunning-mode + // <1=> Periodic mode + // <o.5> IntEnable: Interrupt Enable + // <o.2..3> TimerPre: Timer Prescale + // <0=> / 1 + // <1=> / 16 + // <2=> / 256 + // <3=> Undefined! + // <o.1> TimerSize: Timer Size + // <0=> 16-bit counter + // <1=> 32-bit counter + // <o.0> OneShot: One-shoot mode + // <0=> Wrapping mode + // <1=> One-shot mode + // </h> + __O uint32_t Timer2IntClr; // <h> Timer 2 Interrupt Clear <w></h> + __I uint32_t Timer2RIS; // <h> Timer 2 Raw Interrupt Status <r></h> + __I uint32_t Timer2MIS; // <h> Timer 2 Masked Interrupt Status <r></h> + __IO uint32_t Timer2BGLoad; // <h> Background Load Register </h> + uint32_t RESERVED1[945]; + __IO uint32_t ITCR; // <h> Integration Test Control Register </h> + __O uint32_t ITOP; // <h> Integration Test Output Set Register </h> +} CMSDK_DUALTIMER_BOTH_TypeDef; + +#define CMSDK_DUALTIMER1_LOAD_Pos 0 /*!< CMSDK_DUALTIMER1 LOAD: LOAD Position */ +#define CMSDK_DUALTIMER1_LOAD_Msk (0xFFFFFFFFul << CMSDK_DUALTIMER1_LOAD_Pos) /*!< CMSDK_DUALTIMER1 LOAD: LOAD Mask */ + +#define CMSDK_DUALTIMER1_VALUE_Pos 0 /*!< CMSDK_DUALTIMER1 VALUE: VALUE Position */ +#define CMSDK_DUALTIMER1_VALUE_Msk (0xFFFFFFFFul << CMSDK_DUALTIMER1_VALUE_Pos) /*!< CMSDK_DUALTIMER1 VALUE: VALUE Mask */ + +#define CMSDK_DUALTIMER1_CTRL_EN_Pos 7 /*!< CMSDK_DUALTIMER1 CTRL_EN: CTRL Enable Position */ +#define CMSDK_DUALTIMER1_CTRL_EN_Msk (0x1ul << CMSDK_DUALTIMER1_CTRL_EN_Pos) /*!< CMSDK_DUALTIMER1 CTRL_EN: CTRL Enable Mask */ + +#define CMSDK_DUALTIMER1_CTRL_MODE_Pos 6 /*!< CMSDK_DUALTIMER1 CTRL_MODE: CTRL MODE Position */ +#define CMSDK_DUALTIMER1_CTRL_MODE_Msk (0x1ul << CMSDK_DUALTIMER1_CTRL_MODE_Pos) /*!< CMSDK_DUALTIMER1 CTRL_MODE: CTRL MODE Mask */ + +#define CMSDK_DUALTIMER1_CTRL_INTEN_Pos 5 /*!< CMSDK_DUALTIMER1 CTRL_INTEN: CTRL Int Enable Position */ +#define CMSDK_DUALTIMER1_CTRL_INTEN_Msk (0x1ul << CMSDK_DUALTIMER1_CTRL_INTEN_Pos) /*!< CMSDK_DUALTIMER1 CTRL_INTEN: CTRL Int Enable Mask */ + +#define CMSDK_DUALTIMER1_CTRL_PRESCALE_Pos 2 /*!< CMSDK_DUALTIMER1 CTRL_PRESCALE: CTRL PRESCALE Position */ +#define CMSDK_DUALTIMER1_CTRL_PRESCALE_Msk (0x3ul << CMSDK_DUALTIMER1_CTRL_PRESCALE_Pos) /*!< CMSDK_DUALTIMER1 CTRL_PRESCALE: CTRL PRESCALE Mask */ + +#define CMSDK_DUALTIMER1_CTRL_SIZE_Pos 1 /*!< CMSDK_DUALTIMER1 CTRL_SIZE: CTRL SIZE Position */ +#define CMSDK_DUALTIMER1_CTRL_SIZE_Msk (0x1ul << CMSDK_DUALTIMER1_CTRL_SIZE_Pos) /*!< CMSDK_DUALTIMER1 CTRL_SIZE: CTRL SIZE Mask */ + +#define CMSDK_DUALTIMER1_CTRL_ONESHOOT_Pos 0 /*!< CMSDK_DUALTIMER1 CTRL_ONESHOOT: CTRL ONESHOOT Position */ +#define CMSDK_DUALTIMER1_CTRL_ONESHOOT_Msk (0x1ul << CMSDK_DUALTIMER1_CTRL_ONESHOOT_Pos) /*!< CMSDK_DUALTIMER1 CTRL_ONESHOOT: CTRL ONESHOOT Mask */ + +#define CMSDK_DUALTIMER1_INTCLR_Pos 0 /*!< CMSDK_DUALTIMER1 INTCLR: INT Clear Position */ +#define CMSDK_DUALTIMER1_INTCLR_Msk (0x1ul << CMSDK_DUALTIMER1_INTCLR_Pos) /*!< CMSDK_DUALTIMER1 INTCLR: INT Clear Mask */ + +#define CMSDK_DUALTIMER1_RAWINTSTAT_Pos 0 /*!< CMSDK_DUALTIMER1 RAWINTSTAT: Raw Int Status Position */ +#define CMSDK_DUALTIMER1_RAWINTSTAT_Msk (0x1ul << CMSDK_DUALTIMER1_RAWINTSTAT_Pos) /*!< CMSDK_DUALTIMER1 RAWINTSTAT: Raw Int Status Mask */ + +#define CMSDK_DUALTIMER1_MASKINTSTAT_Pos 0 /*!< CMSDK_DUALTIMER1 MASKINTSTAT: Mask Int Status Position */ +#define CMSDK_DUALTIMER1_MASKINTSTAT_Msk (0x1ul << CMSDK_DUALTIMER1_MASKINTSTAT_Pos) /*!< CMSDK_DUALTIMER1 MASKINTSTAT: Mask Int Status Mask */ + +#define CMSDK_DUALTIMER1_BGLOAD_Pos 0 /*!< CMSDK_DUALTIMER1 BGLOAD: Background Load Position */ +#define CMSDK_DUALTIMER1_BGLOAD_Msk (0xFFFFFFFFul << CMSDK_DUALTIMER1_BGLOAD_Pos) /*!< CMSDK_DUALTIMER1 BGLOAD: Background Load Mask */ + +#define CMSDK_DUALTIMER2_LOAD_Pos 0 /*!< CMSDK_DUALTIMER2 LOAD: LOAD Position */ +#define CMSDK_DUALTIMER2_LOAD_Msk (0xFFFFFFFFul << CMSDK_DUALTIMER2_LOAD_Pos) /*!< CMSDK_DUALTIMER2 LOAD: LOAD Mask */ + +#define CMSDK_DUALTIMER2_VALUE_Pos 0 /*!< CMSDK_DUALTIMER2 VALUE: VALUE Position */ +#define CMSDK_DUALTIMER2_VALUE_Msk (0xFFFFFFFFul << CMSDK_DUALTIMER2_VALUE_Pos) /*!< CMSDK_DUALTIMER2 VALUE: VALUE Mask */ + +#define CMSDK_DUALTIMER2_CTRL_EN_Pos 7 /*!< CMSDK_DUALTIMER2 CTRL_EN: CTRL Enable Position */ +#define CMSDK_DUALTIMER2_CTRL_EN_Msk (0x1ul << CMSDK_DUALTIMER2_CTRL_EN_Pos) /*!< CMSDK_DUALTIMER2 CTRL_EN: CTRL Enable Mask */ + +#define CMSDK_DUALTIMER2_CTRL_MODE_Pos 6 /*!< CMSDK_DUALTIMER2 CTRL_MODE: CTRL MODE Position */ +#define CMSDK_DUALTIMER2_CTRL_MODE_Msk (0x1ul << CMSDK_DUALTIMER2_CTRL_MODE_Pos) /*!< CMSDK_DUALTIMER2 CTRL_MODE: CTRL MODE Mask */ + +#define CMSDK_DUALTIMER2_CTRL_INTEN_Pos 5 /*!< CMSDK_DUALTIMER2 CTRL_INTEN: CTRL Int Enable Position */ +#define CMSDK_DUALTIMER2_CTRL_INTEN_Msk (0x1ul << CMSDK_DUALTIMER2_CTRL_INTEN_Pos) /*!< CMSDK_DUALTIMER2 CTRL_INTEN: CTRL Int Enable Mask */ + +#define CMSDK_DUALTIMER2_CTRL_PRESCALE_Pos 2 /*!< CMSDK_DUALTIMER2 CTRL_PRESCALE: CTRL PRESCALE Position */ +#define CMSDK_DUALTIMER2_CTRL_PRESCALE_Msk (0x3ul << CMSDK_DUALTIMER2_CTRL_PRESCALE_Pos) /*!< CMSDK_DUALTIMER2 CTRL_PRESCALE: CTRL PRESCALE Mask */ + +#define CMSDK_DUALTIMER2_CTRL_SIZE_Pos 1 /*!< CMSDK_DUALTIMER2 CTRL_SIZE: CTRL SIZE Position */ +#define CMSDK_DUALTIMER2_CTRL_SIZE_Msk (0x1ul << CMSDK_DUALTIMER2_CTRL_SIZE_Pos) /*!< CMSDK_DUALTIMER2 CTRL_SIZE: CTRL SIZE Mask */ + +#define CMSDK_DUALTIMER2_CTRL_ONESHOOT_Pos 0 /*!< CMSDK_DUALTIMER2 CTRL_ONESHOOT: CTRL ONESHOOT Position */ +#define CMSDK_DUALTIMER2_CTRL_ONESHOOT_Msk (0x1ul << CMSDK_DUALTIMER2_CTRL_ONESHOOT_Pos) /*!< CMSDK_DUALTIMER2 CTRL_ONESHOOT: CTRL ONESHOOT Mask */ + +#define CMSDK_DUALTIMER2_INTCLR_Pos 0 /*!< CMSDK_DUALTIMER2 INTCLR: INT Clear Position */ +#define CMSDK_DUALTIMER2_INTCLR_Msk (0x1ul << CMSDK_DUALTIMER2_INTCLR_Pos) /*!< CMSDK_DUALTIMER2 INTCLR: INT Clear Mask */ + +#define CMSDK_DUALTIMER2_RAWINTSTAT_Pos 0 /*!< CMSDK_DUALTIMER2 RAWINTSTAT: Raw Int Status Position */ +#define CMSDK_DUALTIMER2_RAWINTSTAT_Msk (0x1ul << CMSDK_DUALTIMER2_RAWINTSTAT_Pos) /*!< CMSDK_DUALTIMER2 RAWINTSTAT: Raw Int Status Mask */ + +#define CMSDK_DUALTIMER2_MASKINTSTAT_Pos 0 /*!< CMSDK_DUALTIMER2 MASKINTSTAT: Mask Int Status Position */ +#define CMSDK_DUALTIMER2_MASKINTSTAT_Msk (0x1ul << CMSDK_DUALTIMER2_MASKINTSTAT_Pos) /*!< CMSDK_DUALTIMER2 MASKINTSTAT: Mask Int Status Mask */ + +#define CMSDK_DUALTIMER2_BGLOAD_Pos 0 /*!< CMSDK_DUALTIMER2 BGLOAD: Background Load Position */ +#define CMSDK_DUALTIMER2_BGLOAD_Msk (0xFFFFFFFFul << CMSDK_DUALTIMER2_BGLOAD_Pos) /*!< CMSDK_DUALTIMER2 BGLOAD: Background Load Mask */ + + +typedef struct +{ + __IO uint32_t TimerLoad; // <h> Timer Load </h> + __I uint32_t TimerValue; // <h> Timer Counter Current Value <r></h> + __IO uint32_t TimerControl; // <h> Timer Control + // <o.7> TimerEn: Timer Enable + // <o.6> TimerMode: Timer Mode + // <0=> Freerunning-mode + // <1=> Periodic mode + // <o.5> IntEnable: Interrupt Enable + // <o.2..3> TimerPre: Timer Prescale + // <0=> / 1 + // <1=> / 16 + // <2=> / 256 + // <3=> Undefined! + // <o.1> TimerSize: Timer Size + // <0=> 16-bit counter + // <1=> 32-bit counter + // <o.0> OneShot: One-shoot mode + // <0=> Wrapping mode + // <1=> One-shot mode + // </h> + __O uint32_t TimerIntClr; // <h> Timer Interrupt Clear <w></h> + __I uint32_t TimerRIS; // <h> Timer Raw Interrupt Status <r></h> + __I uint32_t TimerMIS; // <h> Timer Masked Interrupt Status <r></h> + __IO uint32_t TimerBGLoad; // <h> Background Load Register </h> +} CMSDK_DUALTIMER_SINGLE_TypeDef; + +#define CMSDK_DUALTIMER_LOAD_Pos 0 /*!< CMSDK_DUALTIMER LOAD: LOAD Position */ +#define CMSDK_DUALTIMER_LOAD_Msk (0xFFFFFFFFul << CMSDK_DUALTIMER_LOAD_Pos) /*!< CMSDK_DUALTIMER LOAD: LOAD Mask */ + +#define CMSDK_DUALTIMER_VALUE_Pos 0 /*!< CMSDK_DUALTIMER VALUE: VALUE Position */ +#define CMSDK_DUALTIMER_VALUE_Msk (0xFFFFFFFFul << CMSDK_DUALTIMER_VALUE_Pos) /*!< CMSDK_DUALTIMER VALUE: VALUE Mask */ + +#define CMSDK_DUALTIMER_CTRL_EN_Pos 7 /*!< CMSDK_DUALTIMER CTRL_EN: CTRL Enable Position */ +#define CMSDK_DUALTIMER_CTRL_EN_Msk (0x1ul << CMSDK_DUALTIMER_CTRL_EN_Pos) /*!< CMSDK_DUALTIMER CTRL_EN: CTRL Enable Mask */ + +#define CMSDK_DUALTIMER_CTRL_MODE_Pos 6 /*!< CMSDK_DUALTIMER CTRL_MODE: CTRL MODE Position */ +#define CMSDK_DUALTIMER_CTRL_MODE_Msk (0x1ul << CMSDK_DUALTIMER_CTRL_MODE_Pos) /*!< CMSDK_DUALTIMER CTRL_MODE: CTRL MODE Mask */ + +#define CMSDK_DUALTIMER_CTRL_INTEN_Pos 5 /*!< CMSDK_DUALTIMER CTRL_INTEN: CTRL Int Enable Position */ +#define CMSDK_DUALTIMER_CTRL_INTEN_Msk (0x1ul << CMSDK_DUALTIMER_CTRL_INTEN_Pos) /*!< CMSDK_DUALTIMER CTRL_INTEN: CTRL Int Enable Mask */ + +#define CMSDK_DUALTIMER_CTRL_PRESCALE_Pos 2 /*!< CMSDK_DUALTIMER CTRL_PRESCALE: CTRL PRESCALE Position */ +#define CMSDK_DUALTIMER_CTRL_PRESCALE_Msk (0x3ul << CMSDK_DUALTIMER_CTRL_PRESCALE_Pos) /*!< CMSDK_DUALTIMER CTRL_PRESCALE: CTRL PRESCALE Mask */ + +#define CMSDK_DUALTIMER_CTRL_SIZE_Pos 1 /*!< CMSDK_DUALTIMER CTRL_SIZE: CTRL SIZE Position */ +#define CMSDK_DUALTIMER_CTRL_SIZE_Msk (0x1ul << CMSDK_DUALTIMER_CTRL_SIZE_Pos) /*!< CMSDK_DUALTIMER CTRL_SIZE: CTRL SIZE Mask */ + +#define CMSDK_DUALTIMER_CTRL_ONESHOOT_Pos 0 /*!< CMSDK_DUALTIMER CTRL_ONESHOOT: CTRL ONESHOOT Position */ +#define CMSDK_DUALTIMER_CTRL_ONESHOOT_Msk (0x1ul << CMSDK_DUALTIMER_CTRL_ONESHOOT_Pos) /*!< CMSDK_DUALTIMER CTRL_ONESHOOT: CTRL ONESHOOT Mask */ + +#define CMSDK_DUALTIMER_INTCLR_Pos 0 /*!< CMSDK_DUALTIMER INTCLR: INT Clear Position */ +#define CMSDK_DUALTIMER_INTCLR_Msk (0x1ul << CMSDK_DUALTIMER_INTCLR_Pos) /*!< CMSDK_DUALTIMER INTCLR: INT Clear Mask */ + +#define CMSDK_DUALTIMER_RAWINTSTAT_Pos 0 /*!< CMSDK_DUALTIMER RAWINTSTAT: Raw Int Status Position */ +#define CMSDK_DUALTIMER_RAWINTSTAT_Msk (0x1ul << CMSDK_DUALTIMER_RAWINTSTAT_Pos) /*!< CMSDK_DUALTIMER RAWINTSTAT: Raw Int Status Mask */ + +#define CMSDK_DUALTIMER_MASKINTSTAT_Pos 0 /*!< CMSDK_DUALTIMER MASKINTSTAT: Mask Int Status Position */ +#define CMSDK_DUALTIMER_MASKINTSTAT_Msk (0x1ul << CMSDK_DUALTIMER_MASKINTSTAT_Pos) /*!< CMSDK_DUALTIMER MASKINTSTAT: Mask Int Status Mask */ + +#define CMSDK_DUALTIMER_BGLOAD_Pos 0 /*!< CMSDK_DUALTIMER BGLOAD: Background Load Position */ +#define CMSDK_DUALTIMER_BGLOAD_Msk (0xFFFFFFFFul << CMSDK_DUALTIMER_BGLOAD_Pos) /*!< CMSDK_DUALTIMER BGLOAD: Background Load Mask */ + +/*@}*/ /* end of group CMSDK_DualTIMER */ + + +/*-------------------- General Purpose Input Output (GPIO) -------------------*/ + +/** @addtogroup CMSDK_GPIO CMSDK GPIO + @{ +*/ +typedef struct +{ + __IO uint32_t DATA; /*!< Offset: 0x000 DATA Register (R/W) */ + __IO uint32_t DATAOUT; /*!< Offset: 0x004 Data Output Latch Register (R/W) */ + uint32_t RESERVED0[2]; + __IO uint32_t OUTENABLESET; /*!< Offset: 0x010 Output Enable Set Register (R/W) */ + __IO uint32_t OUTENABLECLR; /*!< Offset: 0x014 Output Enable Clear Register (R/W) */ + __IO uint32_t ALTFUNCSET; /*!< Offset: 0x018 Alternate Function Set Register (R/W) */ + __IO uint32_t ALTFUNCCLR; /*!< Offset: 0x01C Alternate Function Clear Register (R/W) */ + __IO uint32_t INTENSET; /*!< Offset: 0x020 Interrupt Enable Set Register (R/W) */ + __IO uint32_t INTENCLR; /*!< Offset: 0x024 Interrupt Enable Clear Register (R/W) */ + __IO uint32_t INTTYPESET; /*!< Offset: 0x028 Interrupt Type Set Register (R/W) */ + __IO uint32_t INTTYPECLR; /*!< Offset: 0x02C Interrupt Type Clear Register (R/W) */ + __IO uint32_t INTPOLSET; /*!< Offset: 0x030 Interrupt Polarity Set Register (R/W) */ + __IO uint32_t INTPOLCLR; /*!< Offset: 0x034 Interrupt Polarity Clear Register (R/W) */ + union { + __I uint32_t INTSTATUS; /*!< Offset: 0x038 Interrupt Status Register (R/ ) */ + __O uint32_t INTCLEAR; /*!< Offset: 0x038 Interrupt Clear Register ( /W) */ + }; + uint32_t RESERVED1[241]; + __IO uint32_t LB_MASKED[256]; /*!< Offset: 0x400 - 0x7FC Lower byte Masked Access Register (R/W) */ + __IO uint32_t UB_MASKED[256]; /*!< Offset: 0x800 - 0xBFC Upper byte Masked Access Register (R/W) */ +} CMSDK_GPIO_TypeDef; + +#define CMSDK_GPIO_DATA_Pos 0 /*!< CMSDK_GPIO DATA: DATA Position */ +#define CMSDK_GPIO_DATA_Msk (0xFFFFul << CMSDK_GPIO_DATA_Pos) /*!< CMSDK_GPIO DATA: DATA Mask */ + +#define CMSDK_GPIO_DATAOUT_Pos 0 /*!< CMSDK_GPIO DATAOUT: DATAOUT Position */ +#define CMSDK_GPIO_DATAOUT_Msk (0xFFFFul << CMSDK_GPIO_DATAOUT_Pos) /*!< CMSDK_GPIO DATAOUT: DATAOUT Mask */ + +#define CMSDK_GPIO_OUTENSET_Pos 0 /*!< CMSDK_GPIO OUTEN: OUTEN Position */ +#define CMSDK_GPIO_OUTENSET_Msk (0xFFFFul << CMSDK_GPIO_OUTEN_Pos) /*!< CMSDK_GPIO OUTEN: OUTEN Mask */ + +#define CMSDK_GPIO_OUTENCLR_Pos 0 /*!< CMSDK_GPIO OUTEN: OUTEN Position */ +#define CMSDK_GPIO_OUTENCLR_Msk (0xFFFFul << CMSDK_GPIO_OUTEN_Pos) /*!< CMSDK_GPIO OUTEN: OUTEN Mask */ + +#define CMSDK_GPIO_ALTFUNCSET_Pos 0 /*!< CMSDK_GPIO ALTFUNC: ALTFUNC Position */ +#define CMSDK_GPIO_ALTFUNCSET_Msk (0xFFFFul << CMSDK_GPIO_ALTFUNC_Pos) /*!< CMSDK_GPIO ALTFUNC: ALTFUNC Mask */ + +#define CMSDK_GPIO_ALTFUNCCLR_Pos 0 /*!< CMSDK_GPIO ALTFUNC: ALTFUNC Position */ +#define CMSDK_GPIO_ALTFUNCCLR_Msk (0xFFFFul << CMSDK_GPIO_ALTFUNC_Pos) /*!< CMSDK_GPIO ALTFUNC: ALTFUNC Mask */ + +#define CMSDK_GPIO_INTENSET_Pos 0 /*!< CMSDK_GPIO INTEN: INTEN Position */ +#define CMSDK_GPIO_INTENSET_Msk (0xFFFFul << CMSDK_GPIO_INTEN_Pos) /*!< CMSDK_GPIO INTEN: INTEN Mask */ + +#define CMSDK_GPIO_INTENCLR_Pos 0 /*!< CMSDK_GPIO INTEN: INTEN Position */ +#define CMSDK_GPIO_INTENCLR_Msk (0xFFFFul << CMSDK_GPIO_INTEN_Pos) /*!< CMSDK_GPIO INTEN: INTEN Mask */ + +#define CMSDK_GPIO_INTTYPESET_Pos 0 /*!< CMSDK_GPIO INTTYPE: INTTYPE Position */ +#define CMSDK_GPIO_INTTYPESET_Msk (0xFFFFul << CMSDK_GPIO_INTTYPE_Pos) /*!< CMSDK_GPIO INTTYPE: INTTYPE Mask */ + +#define CMSDK_GPIO_INTTYPECLR_Pos 0 /*!< CMSDK_GPIO INTTYPE: INTTYPE Position */ +#define CMSDK_GPIO_INTTYPECLR_Msk (0xFFFFul << CMSDK_GPIO_INTTYPE_Pos) /*!< CMSDK_GPIO INTTYPE: INTTYPE Mask */ + +#define CMSDK_GPIO_INTPOLSET_Pos 0 /*!< CMSDK_GPIO INTPOL: INTPOL Position */ +#define CMSDK_GPIO_INTPOLSET_Msk (0xFFFFul << CMSDK_GPIO_INTPOL_Pos) /*!< CMSDK_GPIO INTPOL: INTPOL Mask */ + +#define CMSDK_GPIO_INTPOLCLR_Pos 0 /*!< CMSDK_GPIO INTPOL: INTPOL Position */ +#define CMSDK_GPIO_INTPOLCLR_Msk (0xFFFFul << CMSDK_GPIO_INTPOL_Pos) /*!< CMSDK_GPIO INTPOL: INTPOL Mask */ + +#define CMSDK_GPIO_INTSTATUS_Pos 0 /*!< CMSDK_GPIO INTSTATUS: INTSTATUS Position */ +#define CMSDK_GPIO_INTSTATUS_Msk (0xFFul << CMSDK_GPIO_INTSTATUS_Pos) /*!< CMSDK_GPIO INTSTATUS: INTSTATUS Mask */ + +#define CMSDK_GPIO_INTCLEAR_Pos 0 /*!< CMSDK_GPIO INTCLEAR: INTCLEAR Position */ +#define CMSDK_GPIO_INTCLEAR_Msk (0xFFul << CMSDK_GPIO_INTCLEAR_Pos) /*!< CMSDK_GPIO INTCLEAR: INTCLEAR Mask */ + +#define CMSDK_GPIO_MASKLOWBYTE_Pos 0 /*!< CMSDK_GPIO MASKLOWBYTE: MASKLOWBYTE Position */ +#define CMSDK_GPIO_MASKLOWBYTE_Msk (0x00FFul << CMSDK_GPIO_MASKLOWBYTE_Pos) /*!< CMSDK_GPIO MASKLOWBYTE: MASKLOWBYTE Mask */ + +#define CMSDK_GPIO_MASKHIGHBYTE_Pos 0 /*!< CMSDK_GPIO MASKHIGHBYTE: MASKHIGHBYTE Position */ +#define CMSDK_GPIO_MASKHIGHBYTE_Msk (0xFF00ul << CMSDK_GPIO_MASKHIGHBYTE_Pos) /*!< CMSDK_GPIO MASKHIGHBYTE: MASKHIGHBYTE Mask */ + +/*@}*/ /* end of group CMSDK_GPIO */ + + +/*------------- System Control (SYSCON) --------------------------------------*/ +/** @addtogroup CMSDK_SYSCON CMSDK System Control + @{ +*/ +typedef struct +{ + __IO uint32_t REMAP; /*!< Offset: 0x000 Remap Control Register (R/W) */ + __IO uint32_t PMUCTRL; /*!< Offset: 0x004 PMU Control Register (R/W) */ + __IO uint32_t RESETOP; /*!< Offset: 0x008 Reset Option Register (R/W) */ + __IO uint32_t EMICTRL; /*!< Offset: 0x00C EMI Control Register (R/W) */ + __IO uint32_t RSTINFO; /*!< Offset: 0x010 Reset Information Register (R/W) */ +} CMSDK_SYSCON_TypeDef; + +#define CMSDK_SYSCON_REMAP_Pos 0 +#define CMSDK_SYSCON_REMAP_Msk (0x01ul << CMSDK_SYSCON_REMAP_Pos) /*!< CMSDK_SYSCON MEME_CTRL: REMAP Mask */ + +#define CMSDK_SYSCON_PMUCTRL_EN_Pos 0 +#define CMSDK_SYSCON_PMUCTRL_EN_Msk (0x01ul << CMSDK_SYSCON_PMUCTRL_EN_Pos) /*!< CMSDK_SYSCON PMUCTRL: PMUCTRL ENABLE Mask */ + +#define CMSDK_SYSCON_LOCKUPRST_RESETOP_Pos 0 +#define CMSDK_SYSCON_LOCKUPRST_RESETOP_Msk (0x01ul << CMSDK_SYSCON_LOCKUPRST_RESETOP_Pos) /*!< CMSDK_SYSCON SYS_CTRL: LOCKUP RESET ENABLE Mask */ + +#define CMSDK_SYSCON_EMICTRL_SIZE_Pos 24 +#define CMSDK_SYSCON_EMICTRL_SIZE_Msk (0x00001ul << CMSDK_SYSCON_EMICTRL_SIZE_Pos) /*!< CMSDK_SYSCON EMICTRL: SIZE Mask */ + +#define CMSDK_SYSCON_EMICTRL_TACYC_Pos 16 +#define CMSDK_SYSCON_EMICTRL_TACYC_Msk (0x00007ul << CMSDK_SYSCON_EMICTRL_TACYC_Pos) /*!< CMSDK_SYSCON EMICTRL: TURNAROUNDCYCLE Mask */ + +#define CMSDK_SYSCON_EMICTRL_WCYC_Pos 8 +#define CMSDK_SYSCON_EMICTRL_WCYC_Msk (0x00003ul << CMSDK_SYSCON_EMICTRL_WCYC_Pos) /*!< CMSDK_SYSCON EMICTRL: WRITECYCLE Mask */ + +#define CMSDK_SYSCON_EMICTRL_RCYC_Pos 0 +#define CMSDK_SYSCON_EMICTRL_RCYC_Msk (0x00007ul << CMSDK_SYSCON_EMICTRL_RCYC_Pos) /*!< CMSDK_SYSCON EMICTRL: READCYCLE Mask */ + +#define CMSDK_SYSCON_RSTINFO_SYSRESETREQ_Pos 0 +#define CMSDK_SYSCON_RSTINFO_SYSRESETREQ_Msk (0x00001ul << CMSDK_SYSCON_RSTINFO_SYSRESETREQ_Pos) /*!< CMSDK_SYSCON RSTINFO: SYSRESETREQ Mask */ + +#define CMSDK_SYSCON_RSTINFO_WDOGRESETREQ_Pos 1 +#define CMSDK_SYSCON_RSTINFO_WDOGRESETREQ_Msk (0x00001ul << CMSDK_SYSCON_RSTINFO_WDOGRESETREQ_Pos) /*!< CMSDK_SYSCON RSTINFO: WDOGRESETREQ Mask */ + +#define CMSDK_SYSCON_RSTINFO_LOCKUPRESET_Pos 2 +#define CMSDK_SYSCON_RSTINFO_LOCKUPRESET_Msk (0x00001ul << CMSDK_SYSCON_RSTINFO_LOCKUPRESET_Pos) /*!< CMSDK_SYSCON RSTINFO: LOCKUPRESET Mask */ + +/*@}*/ /* end of group CMSDK_SYSCON */ + +/*------------- PL230 uDMA (PL230) --------------------------------------*/ +/** @addtogroup CMSDK_PL230 CMSDK uDMA controller + @{ +*/ +typedef struct +{ + __I uint32_t DMA_STATUS; /*!< Offset: 0x000 DMA status Register (R/W) */ + __O uint32_t DMA_CFG; /*!< Offset: 0x004 DMA configuration Register ( /W) */ + __IO uint32_t CTRL_BASE_PTR; /*!< Offset: 0x008 Channel Control Data Base Pointer Register (R/W) */ + __I uint32_t ALT_CTRL_BASE_PTR; /*!< Offset: 0x00C Channel Alternate Control Data Base Pointer Register (R/ ) */ + __I uint32_t DMA_WAITONREQ_STATUS; /*!< Offset: 0x010 Channel Wait On Request Status Register (R/ ) */ + __O uint32_t CHNL_SW_REQUEST; /*!< Offset: 0x014 Channel Software Request Register ( /W) */ + __IO uint32_t CHNL_USEBURST_SET; /*!< Offset: 0x018 Channel UseBurst Set Register (R/W) */ + __O uint32_t CHNL_USEBURST_CLR; /*!< Offset: 0x01C Channel UseBurst Clear Register ( /W) */ + __IO uint32_t CHNL_REQ_MASK_SET; /*!< Offset: 0x020 Channel Request Mask Set Register (R/W) */ + __O uint32_t CHNL_REQ_MASK_CLR; /*!< Offset: 0x024 Channel Request Mask Clear Register ( /W) */ + __IO uint32_t CHNL_ENABLE_SET; /*!< Offset: 0x028 Channel Enable Set Register (R/W) */ + __O uint32_t CHNL_ENABLE_CLR; /*!< Offset: 0x02C Channel Enable Clear Register ( /W) */ + __IO uint32_t CHNL_PRI_ALT_SET; /*!< Offset: 0x030 Channel Primary-Alterante Set Register (R/W) */ + __O uint32_t CHNL_PRI_ALT_CLR; /*!< Offset: 0x034 Channel Primary-Alterante Clear Register ( /W) */ + __IO uint32_t CHNL_PRIORITY_SET; /*!< Offset: 0x038 Channel Priority Set Register (R/W) */ + __O uint32_t CHNL_PRIORITY_CLR; /*!< Offset: 0x03C Channel Priority Clear Register ( /W) */ + uint32_t RESERVED0[3]; + __IO uint32_t ERR_CLR; /*!< Offset: 0x04C Bus Error Clear Register (R/W) */ + +} CMSDK_PL230_TypeDef; + +#define PL230_DMA_CHNL_BITS 0 + +#define CMSDK_PL230_DMA_STATUS_MSTREN_Pos 0 /*!< CMSDK_PL230 DMA STATUS: MSTREN Position */ +#define CMSDK_PL230_DMA_STATUS_MSTREN_Msk (0x00000001ul << CMSDK_PL230_DMA_STATUS_MSTREN_Pos) /*!< CMSDK_PL230 DMA STATUS: MSTREN Mask */ + +#define CMSDK_PL230_DMA_STATUS_STATE_Pos 0 /*!< CMSDK_PL230 DMA STATUS: STATE Position */ +#define CMSDK_PL230_DMA_STATUS_STATE_Msk (0x0000000Ful << CMSDK_PL230_DMA_STATUS_STATE_Pos) /*!< CMSDK_PL230 DMA STATUS: STATE Mask */ + +#define CMSDK_PL230_DMA_STATUS_CHNLS_MINUS1_Pos 0 /*!< CMSDK_PL230 DMA STATUS: CHNLS_MINUS1 Position */ +#define CMSDK_PL230_DMA_STATUS_CHNLS_MINUS1_Msk (0x0000001Ful << CMSDK_PL230_DMA_STATUS_CHNLS_MINUS1_Pos) /*!< CMSDK_PL230 DMA STATUS: CHNLS_MINUS1 Mask */ + +#define CMSDK_PL230_DMA_STATUS_TEST_STATUS_Pos 0 /*!< CMSDK_PL230 DMA STATUS: TEST_STATUS Position */ +#define CMSDK_PL230_DMA_STATUS_TEST_STATUS_Msk (0x00000001ul << CMSDK_PL230_DMA_STATUS_TEST_STATUS_Pos) /*!< CMSDK_PL230 DMA STATUS: TEST_STATUS Mask */ + +#define CMSDK_PL230_DMA_CFG_MSTREN_Pos 0 /*!< CMSDK_PL230 DMA CFG: MSTREN Position */ +#define CMSDK_PL230_DMA_CFG_MSTREN_Msk (0x00000001ul << CMSDK_PL230_DMA_CFG_MSTREN_Pos) /*!< CMSDK_PL230 DMA CFG: MSTREN Mask */ + +#define CMSDK_PL230_DMA_CFG_CPCCACHE_Pos 2 /*!< CMSDK_PL230 DMA CFG: CPCCACHE Position */ +#define CMSDK_PL230_DMA_CFG_CPCCACHE_Msk (0x00000001ul << CMSDK_PL230_DMA_CFG_CPCCACHE_Pos) /*!< CMSDK_PL230 DMA CFG: CPCCACHE Mask */ + +#define CMSDK_PL230_DMA_CFG_CPCBUF_Pos 1 /*!< CMSDK_PL230 DMA CFG: CPCBUF Position */ +#define CMSDK_PL230_DMA_CFG_CPCBUF_Msk (0x00000001ul << CMSDK_PL230_DMA_CFG_CPCBUF_Pos) /*!< CMSDK_PL230 DMA CFG: CPCBUF Mask */ + +#define CMSDK_PL230_DMA_CFG_CPCPRIV_Pos 0 /*!< CMSDK_PL230 DMA CFG: CPCPRIV Position */ +#define CMSDK_PL230_DMA_CFG_CPCPRIV_Msk (0x00000001ul << CMSDK_PL230_DMA_CFG_CPCPRIV_Pos) /*!< CMSDK_PL230 DMA CFG: CPCPRIV Mask */ + +#define CMSDK_PL230_CTRL_BASE_PTR_Pos PL230_DMA_CHNL_BITS + 5 /*!< CMSDK_PL230 STATUS: BASE_PTR Position */ +#define CMSDK_PL230_CTRL_BASE_PTR_Msk (0x0FFFFFFFul << CMSDK_PL230_CTRL_BASE_PTR_Pos) /*!< CMSDK_PL230 STATUS: BASE_PTR Mask */ + +#define CMSDK_PL230_ALT_CTRL_BASE_PTR_Pos 0 /*!< CMSDK_PL230 STATUS: MSTREN Position */ +#define CMSDK_PL230_ALT_CTRL_BASE_PTR_Msk (0xFFFFFFFFul << CMSDK_PL230_ALT_CTRL_BASE_PTR_Pos) /*!< CMSDK_PL230 STATUS: MSTREN Mask */ + +#define CMSDK_PL230_DMA_WAITONREQ_STATUS_Pos 0 /*!< CMSDK_PL230 DMA_WAITONREQ_STATUS: DMA_WAITONREQ_STATUS Position */ +#define CMSDK_PL230_DMA_WAITONREQ_STATUS_Msk (0xFFFFFFFFul << CMSDK_PL230_DMA_WAITONREQ_STATUS_Pos) /*!< CMSDK_PL230 DMA_WAITONREQ_STATUS: DMA_WAITONREQ_STATUS Mask */ + +#define CMSDK_PL230_CHNL_SW_REQUEST_Pos 0 /*!< CMSDK_PL230 CHNL_SW_REQUEST: CHNL_SW_REQUEST Position */ +#define CMSDK_PL230_CHNL_SW_REQUEST_Msk (0xFFFFFFFFul << CMSDK_PL230_CHNL_SW_REQUEST_Pos) /*!< CMSDK_PL230 CHNL_SW_REQUEST: CHNL_SW_REQUEST Mask */ + +#define CMSDK_PL230_CHNL_USEBURST_SET_Pos 0 /*!< CMSDK_PL230 CHNL_USEBURST: SET Position */ +#define CMSDK_PL230_CHNL_USEBURST_SET_Msk (0xFFFFFFFFul << CMSDK_PL230_CHNL_USEBURST_SET_Pos) /*!< CMSDK_PL230 CHNL_USEBURST: SET Mask */ + +#define CMSDK_PL230_CHNL_USEBURST_CLR_Pos 0 /*!< CMSDK_PL230 CHNL_USEBURST: CLR Position */ +#define CMSDK_PL230_CHNL_USEBURST_CLR_Msk (0xFFFFFFFFul << CMSDK_PL230_CHNL_USEBURST_CLR_Pos) /*!< CMSDK_PL230 CHNL_USEBURST: CLR Mask */ + +#define CMSDK_PL230_CHNL_REQ_MASK_SET_Pos 0 /*!< CMSDK_PL230 CHNL_REQ_MASK: SET Position */ +#define CMSDK_PL230_CHNL_REQ_MASK_SET_Msk (0xFFFFFFFFul << CMSDK_PL230_CHNL_REQ_MASK_SET_Pos) /*!< CMSDK_PL230 CHNL_REQ_MASK: SET Mask */ + +#define CMSDK_PL230_CHNL_REQ_MASK_CLR_Pos 0 /*!< CMSDK_PL230 CHNL_REQ_MASK: CLR Position */ +#define CMSDK_PL230_CHNL_REQ_MASK_CLR_Msk (0xFFFFFFFFul << CMSDK_PL230_CHNL_REQ_MASK_CLR_Pos) /*!< CMSDK_PL230 CHNL_REQ_MASK: CLR Mask */ + +#define CMSDK_PL230_CHNL_ENABLE_SET_Pos 0 /*!< CMSDK_PL230 CHNL_ENABLE: SET Position */ +#define CMSDK_PL230_CHNL_ENABLE_SET_Msk (0xFFFFFFFFul << CMSDK_PL230_CHNL_ENABLE_SET_Pos) /*!< CMSDK_PL230 CHNL_ENABLE: SET Mask */ + +#define CMSDK_PL230_CHNL_ENABLE_CLR_Pos 0 /*!< CMSDK_PL230 CHNL_ENABLE: CLR Position */ +#define CMSDK_PL230_CHNL_ENABLE_CLR_Msk (0xFFFFFFFFul << CMSDK_PL230_CHNL_ENABLE_CLR_Pos) /*!< CMSDK_PL230 CHNL_ENABLE: CLR Mask */ + +#define CMSDK_PL230_CHNL_PRI_ALT_SET_Pos 0 /*!< CMSDK_PL230 CHNL_PRI_ALT: SET Position */ +#define CMSDK_PL230_CHNL_PRI_ALT_SET_Msk (0xFFFFFFFFul << CMSDK_PL230_CHNL_PRI_ALT_SET_Pos) /*!< CMSDK_PL230 CHNL_PRI_ALT: SET Mask */ + +#define CMSDK_PL230_CHNL_PRI_ALT_CLR_Pos 0 /*!< CMSDK_PL230 CHNL_PRI_ALT: CLR Position */ +#define CMSDK_PL230_CHNL_PRI_ALT_CLR_Msk (0xFFFFFFFFul << CMSDK_PL230_CHNL_PRI_ALT_CLR_Pos) /*!< CMSDK_PL230 CHNL_PRI_ALT: CLR Mask */ + +#define CMSDK_PL230_CHNL_PRIORITY_SET_Pos 0 /*!< CMSDK_PL230 CHNL_PRIORITY: SET Position */ +#define CMSDK_PL230_CHNL_PRIORITY_SET_Msk (0xFFFFFFFFul << CMSDK_PL230_CHNL_PRIORITY_SET_Pos) /*!< CMSDK_PL230 CHNL_PRIORITY: SET Mask */ + +#define CMSDK_PL230_CHNL_PRIORITY_CLR_Pos 0 /*!< CMSDK_PL230 CHNL_PRIORITY: CLR Position */ +#define CMSDK_PL230_CHNL_PRIORITY_CLR_Msk (0xFFFFFFFFul << CMSDK_PL230_CHNL_PRIORITY_CLR_Pos) /*!< CMSDK_PL230 CHNL_PRIORITY: CLR Mask */ + +#define CMSDK_PL230_ERR_CLR_Pos 0 /*!< CMSDK_PL230 ERR: CLR Position */ +#define CMSDK_PL230_ERR_CLR_Msk (0x00000001ul << CMSDK_PL230_ERR_CLR_Pos) /*!< CMSDK_PL230 ERR: CLR Mask */ + + +/*@}*/ /* end of group CMSDK_PL230 */ + + +/*------------- PrimeCell UART (PL110) --------------------------------------*/ +/** @addtogroup CMSDK_PL110 CMSDK PrimeCell UART + @{ +*/ + +typedef struct +{ + __IO uint32_t UARTDR; // <h> Data + // <o.11> OE: Overrun error <r> + // <o.10> BE: Break error <r> + // <o.9> PE: Parity error <r> + // <o.8> FE: Framing error <r> + // <o.0..7> DATA: Received or Transmitting data (0..255) + // </h> + union { + __I uint32_t UARTRSR; // <h> Receive Status <r> + // <o.3> OE: Overrun error <r> + // <o.2> BE: Break error <r> + // <o.1> PE: Parity error <r> + // <o.0> FE: Framing error <r> + // </h> + __O uint32_t UARTECR; // <h> Error Clear <w> + // <o.3> OE: Overrun error <w> + // <o.2> BE: Break error <w> + // <o.1> PE: Parity error <w> + // <o.0> FE: Framing error <w> + // </h> + }; + uint32_t RESERVED0[4]; + __IO uint32_t UARTFR; // <h> Flags <r> + // <o.8> RI: Ring indicator <r> + // <o.7> TXFE: Transmit FIFO empty <r> + // <o.6> RXFF: Receive FIFO full <r> + // <o.5> TXFF: Transmit FIFO full <r> + // <o.4> RXFE: Receive FIFO empty <r> + // <o.3> BUSY: UART busy <r> + // <o.2> DCD: Data carrier detect <r> + // <o.1> DSR: Data set ready <r> + // <o.0> CTS: Clear to send <r> + // </h> + uint32_t RESERVED1; + __IO uint32_t UARTILPR; // <h> IrDA Low-power Counter + // <o.0..7> ILPDVSR: 8-bit low-power divisor value (0..255) + // </h> + __IO uint32_t UARTIBRD; // <h> Integer Baud Rate + // <o.0..15> BAUD DIVINT: Integer baud rate divisor (0..65535) + // </h> + __IO uint32_t UARTFBRD; // <h> Fractional Baud Rate + // <o.0..5> BAUD DIVFRAC: Fractional baud rate divisor (0..63) + // </h> + __IO uint32_t UARTLCR_H; // <h> Line Control + // <o.8> SPS: Stick parity select + // <o.5..6> WLEN: Word length + // <0=> 5 bits + // <1=> 6 bits + // <2=> 7 bits + // <3=> 8 bits + // <o.4> FEN: Enable FIFOs + // <o.3> STP2: Two stop bits select + // <o.2> EPS: Even parity select + // <o.1> PEN: Parity enable + // <o.0> BRK: Send break + // </h> + __IO uint32_t UARTCR; // <h> Control + // <o.15> CTSEn: CTS hardware flow control enable + // <o.14> RTSEn: RTS hardware flow control enable + // <o.13> Out2: Complement of Out2 modem status output + // <o.12> Out1: Complement of Out1 modem status output + // <o.11> RTS: Request to send + // <o.10> DTR: Data transmit ready + // <o.9> RXE: Receive enable + // <o.8> TXE: Transmit enable + // <o.7> LBE: Loop-back enable + // <o.2> SIRLP: IrDA SIR low power mode + // <o.1> SIREN: SIR enable + // <o.0> UARTEN: UART enable + // </h> + __IO uint32_t UARTIFLS; // <h> Interrupt FIFO Level Select + // <o.3..5> RXIFLSEL: Receive interrupt FIFO level select + // <0=> >= 1/8 full + // <1=> >= 1/4 full + // <2=> >= 1/2 full + // <3=> >= 3/4 full + // <4=> >= 7/8 full + // <5=> reserved + // <6=> reserved + // <7=> reserved + // <o.0..2> TXIFLSEL: Transmit interrupt FIFO level select + // <0=> <= 1/8 full + // <1=> <= 1/4 full + // <2=> <= 1/2 full + // <3=> <= 3/4 full + // <4=> <= 7/8 full + // <5=> reserved + // <6=> reserved + // <7=> reserved + // </h> + __IO uint32_t UARTIMSC; // <h> Interrupt Mask Set / Clear + // <o.10> OEIM: Overrun error interrupt mask + // <o.9> BEIM: Break error interrupt mask + // <o.8> PEIM: Parity error interrupt mask + // <o.7> FEIM: Framing error interrupt mask + // <o.6> RTIM: Receive interrupt mask + // <o.5> TXIM: Transmit interrupt mask + // <o.4> RXIM: Receive interrupt mask + // <o.3> DSRMIM: nUARTDSR modem interrupt mask + // <o.2> DCDMIM: nUARTDCD modem interrupt mask + // <o.1> CTSMIM: nUARTCTS modem interrupt mask + // <o.0> RIMIM: nUARTRI modem interrupt mask + // </h> + __IO uint32_t UARTRIS; // <h> Raw Interrupt Status <r> + // <o.10> OERIS: Overrun error interrupt status <r> + // <o.9> BERIS: Break error interrupt status <r> + // <o.8> PERIS: Parity error interrupt status <r> + // <o.7> FERIS: Framing error interrupt status <r> + // <o.6> RTRIS: Receive timeout interrupt status <r> + // <o.5> TXRIS: Transmit interrupt status <r> + // <o.4> RXRIS: Receive interrupt status <r> + // <o.3> DSRRMIS: nUARTDSR modem interrupt status <r> + // <o.2> DCDRMIS: nUARTDCD modem interrupt status <r> + // <o.1> CTSRMIS: nUARTCTS modem interrupt status <r> + // <o.0> RIRMIS: nUARTRI modem interrupt status <r> + // </h> + __IO uint32_t UARTMIS; // <h> Masked Interrupt Status <r> + // <o.10> OEMIS: Overrun error masked interrupt status <r> + // <o.9> BEMIS: Break error masked interrupt status <r> + // <o.8> PEMIS: Parity error masked interrupt status <r> + // <o.7> FEMIS: Framing error masked interrupt status <r> + // <o.6> RTMIS: Receive timeout masked interrupt status <r> + // <o.5> TXMIS: Transmit masked interrupt status <r> + // <o.4> RXMIS: Receive masked interrupt status <r> + // <o.3> DSRMMIS: nUARTDSR modem masked interrupt status <r> + // <o.2> DCDMMIS: nUARTDCD modem masked interrupt status <r> + // <o.1> CTSMMIS: nUARTCTS modem masked interrupt status <r> + // <o.0> RIMMIS: nUARTRI modem masked interrupt status <r> + // </h> + __O uint32_t UARTICR; // <h> Interrupt Clear <w> + // <o.10> OEIC: Overrun error interrupt clear <w> + // <o.9> BEIC: Break error interrupt clear <w> + // <o.8> PEIC: Parity error interrupt clear <w> + // <o.7> FEIC: Framing error interrupt clear <w> + // <o.6> RTIC: Receive timeout interrupt clear <w> + // <o.5> TXIC: Transmit interrupt clear <w> + // <o.4> RXIC: Receive interrupt clear <w> + // <o.3> DSRMIC: nUARTDSR modem interrupt clear <w> + // <o.2> DCDMIC: nUARTDCD modem interrupt clear <w> + // <o.1> CTSMIC: nUARTCTS modem interrupt clear <w> + // <o.0> RIMIC: nUARTRI modem interrupt clear <w> + // </h> + __IO uint32_t UARTDMACR; // <h> DMA Control + // <o.2> DMAONERR: DMA on error + // <o.1> TXDMAE: Transmit DMA enable + // <o.0> RXDMAE: Receive DMA enable + // </h> +} PL110_UART_TypeDef; + +#define CMSDK_PL110_DATAOVRRUN_Pos 11 /*!< CMSDK_PL110 DATAOVRRUN: Data Overrun Position */ +#define CMSDK_PL110_DATAOVRRUN_Msk (0x1ul << CMSDK_PL110_DATAOVRRUN_Pos) /*!< CMSDK_PL110 DATAOVRRUN: Data Overrun Mask */ + +#define CMSDK_PL110_DATABREAKERR_Pos 10 /*!< CMSDK_PL110 DATABREAKERR: Data Break Error Position */ +#define CMSDK_PL110_DATABREAKERR_Msk (0x1ul << CMSDK_PL110_DATABREAKERR_Pos) /*!< CMSDK_PL110 DATABREAKERR: Data Break Error Mask */ + +#define CMSDK_PL110_DATAPARITYERR_Pos 9 /*!< CMSDK_PL110 DATAPARITYERR: Data Parity Error Position */ +#define CMSDK_PL110_DATAPARITYERR_Msk (0x1ul << CMSDK_PL110_DATAPARITYERR_Pos) /*!< CMSDK_PL110 DATAPARITYERR: Data Parity Error Mask */ + +#define CMSDK_PL110_DATAFRAMEERR_Pos 8 /*!< CMSDK_PL110 DATAFRAMEERR: Data Frame Error Position */ +#define CMSDK_PL110_DATAFRAMEERR_Msk (0x1ul << CMSDK_PL110_DATAFRAMEERR_Pos) /*!< CMSDK_PL110 DATAFRAMEERR: Data Frame Error Mask */ + +#define CMSDK_PL110_RECOVRRUN_Pos 3 /*!< CMSDK_PL110 RECOVRRUN: Receive Overrun Position */ +#define CMSDK_PL110_RECOVRRUN_Msk (0x1ul << CMSDK_PL110_RECOVRRUN_Pos) /*!< CMSDK_PL110 RECOVRRUN: Receive Overrun Mask */ + +#define CMSDK_PL110_RECBREAKERR_Pos 2 /*!< CMSDK_PL110 RECBREAKERR: Receive Break Error Position */ +#define CMSDK_PL110_RECBREAKERR_Msk (0x1ul << CMSDK_PL110_RECBREAKERR_Pos) /*!< CMSDK_PL110 RECBREAKERR: Receive Break Error Mask */ + +#define CMSDK_PL110_RECPARITYERR_Pos 1 /*!< CMSDK_PL110 RECPARITYERR: Receive Parity Error Position */ +#define CMSDK_PL110_RECPARITYERR_Msk (0x1ul << CMSDK_PL110_RECPARITYERR_Pos) /*!< CMSDK_PL110 RECPARITYERR: Receive Parity Error Mask */ + +#define CMSDK_PL110_RECFRAMEERR_Pos 0 /*!< CMSDK_PL110 RECFRAMEERR: Receive Frame Error Position */ +#define CMSDK_PL110_RECFRAMEERR_Msk (0x1ul << CMSDK_PL110_RECFRAMEERR_Pos) /*!< CMSDK_PL110 RECFRAMEERR: Receive Frame Error Mask */ + +#define CMSDK_PL110_ERRCLROVRRUN_Pos 3 /*!< CMSDK_PL110 ERRCLROVRRUN: Clear Overrun Position */ +#define CMSDK_PL110_ERRCLROVRRUN_Msk (0x1ul << CMSDK_PL110_ERRCLROVRRUN_Pos) /*!< CMSDK_PL110 ERRCLROVRRUN: Clear Overrun Mask */ + +#define CMSDK_PL110_ERRCLRBREAKERR_Pos 2 /*!< CMSDK_PL110 ERRCLRBREAKERR: Clear Break Error Position */ +#define CMSDK_PL110_ERRCLRBREAKERR_Msk (0x1ul << CMSDK_PL110_ERRCLRBREAKERR_Pos) /*!< CMSDK_PL110 ERRCLRBREAKERR: Clear Break Error Mask */ + +#define CMSDK_PL110_ERRCLRPARITYERR_Pos 1 /*!< CMSDK_PL110 ERRCLRPARITYERR: Clear Parity Error Position */ +#define CMSDK_PL110_ERRCLRPARITYERR_Msk (0x1ul << CMSDK_PL110_ERRCLRPARITYERR_Pos) /*!< CMSDK_PL110 ERRCLRPARITYERR: Clear Parity Error Mask */ + +#define CMSDK_PL110_ERRCLRFRAMEERR_Pos 0 /*!< CMSDK_PL110 ERRCLRFRAMEERR: Clear Frame Error Position */ +#define CMSDK_PL110_ERRCLRFRAMEERR_Msk (0x1ul << CMSDK_PL110_ERRCLRFRAMEERR_Pos) /*!< CMSDK_PL110 ERRCLRFRAMEERR: Clear Frame Error Mask */ + +#define CMSDK_PL110_FLAG_RINGIND_Pos 8 /*!< CMSDK_PL110 FLAG_RINGIND: Ring Indicator Position */ +#define CMSDK_PL110_FLAG_RINGIND_Msk (0x1ul << CMSDK_PL110_FLAG_RINGIND_Pos) /*!< CMSDK_PL110 FLAG_RINGIND: Ring Indicator Mask */ + +#define CMSDK_PL110_FLAG_TXFEMPTY_Pos 7 /*!< CMSDK_PL110 FLAG_TXFEMPTY: Transmit FIFO Empty Position */ +#define CMSDK_PL110_FLAG_TXFEMPTY_Msk (0x1ul << CMSDK_PL110_FLAG_TXFEMPTY_Pos) /*!< CMSDK_PL110 FLAG_TXFEMPTY: Transmit FIFO Empty Mask */ + +#define CMSDK_PL110_FLAG_RXFFULL_Pos 6 /*!< CMSDK_PL110 FLAG_RXFFULL: Receive FIFO Full Position */ +#define CMSDK_PL110_FLAG_RXFFULL_Msk (0x1ul << CMSDK_PL110_FLAG_RXFFULL_Pos) /*!< CMSDK_PL110 FLAG_RXFFULL: Receive FIFO Full Mask */ + +#define CMSDK_PL110_FLAG_TXFFULL_Pos 5 /*!< CMSDK_PL110 FLAG_TXFFULL: Transmit FIFO Full Position */ +#define CMSDK_PL110_FLAG_TXFFULL_Msk (0x1ul << CMSDK_PL110_FLAG_TXFFULL_Pos) /*!< CMSDK_PL110 FLAG_TXFFULL: Transmit FIFO Full Mask */ + +#define CMSDK_PL110_FLAG_RXFEMPTY_Pos 4 /*!< CMSDK_PL110 FLAG_RXFEMPTY: Receive FIFO Empty Position */ +#define CMSDK_PL110_FLAG_RXFEMPTY_Msk (0x1ul << CMSDK_PL110_FLAG_RXFEMPTY_Pos) /*!< CMSDK_PL110 FLAG_RXFEMPTY: Receive FIFO Empty Mask */ + +#define CMSDK_PL110_FLAG_UARTBUSY_Pos 3 /*!< CMSDK_PL110 FLAG_UARTBUSY: UART Busy Position */ +#define CMSDK_PL110_FLAG_UARTBUSY_Msk (0x1ul << CMSDK_PL110_FLAG_UARTBUSY_Pos) /*!< CMSDK_PL110 FLAG_UARTBUSY: UART Busy Mask */ + +#define CMSDK_PL110_FLAG_CARRIERDETECT_Pos 2 /*!< CMSDK_PL110 FLAG_CARRIERDETECT: Carrier Detect Position */ +#define CMSDK_PL110_FLAG_CARRIERDETECT_Msk (0x1ul << CMSDK_PL110_FLAG_CARRIERDETECT_Pos) /*!< CMSDK_PL110 FLAG_CARRIERDETECT: Carrier Detect Mask */ + +#define CMSDK_PL110_FLAG_DATASETREADY_Pos 1 /*!< CMSDK_PL110 FLAG_DATASETREADY: Data Set Ready Position */ +#define CMSDK_PL110_FLAG_DATASETREADY_Msk (0x1ul << CMSDK_PL110_FLAG_DATASETREADY_Pos) /*!< CMSDK_PL110 FLAG_DATASETREADY: Data Set Ready Mask */ + +#define CMSDK_PL110_FLAG_CLR2SEND_Pos 0 /*!< CMSDK_PL110 FLAG_CLR2SEND: Clear To Send Position */ +#define CMSDK_PL110_FLAG_CLR2SEND_Msk (0x1ul << CMSDK_PL110_FLAG_CLR2SEND_Pos) /*!< CMSDK_PL110 FLAG_CLR2SEND: Clear To Send Mask */ + +#define CMSDK_PL110_IRDALOWPOWERCOUNT_Pos 0 /*!< CMSDK_PL110 IRDALOWPOWERCOUNT: IrDA 8-bit low-power divisor value Position */ +#define CMSDK_PL110_IRDALOWPOWERCOUNT_Msk (0xFFul << CMSDK_PL110_IRDALOWPOWERCOUNT_Pos) /*!< CMSDK_PL110 IRDALOWPOWERCOUNT: IrDA 8-bit low-power divisor value Mask */ + +#define CMSDK_PL110_INTDIVIDER_Pos 0 /*!< CMSDK_PL110 INTDIVIDER: Integer Divider Position */ +#define CMSDK_PL110_INTDIVIDER_Msk (0xFFFFul << CMSDK_PL110_INTDIVIDER_Pos) /*!< CMSDK_PL110 INTDIVIDER: Integer Divider Mask */ + +#define CMSDK_PL110_FRACTDIVIDER_Pos 0 /*!< CMSDK_PL110 FRACTDIVIDER: Fractional Divider Position */ +#define CMSDK_PL110_FRACTDIVIDER_Msk (0x3Ful << CMSDK_PL110_FRACTDIVIDER_Pos) /*!< CMSDK_PL110 FRACTDIVIDER: Fractional Divider Mask */ + +#define CMSDK_PL110_STICKPARITYSEL_Pos 8 /*!< CMSDK_PL110 STICKPARITYSEL: Stick parity select Position */ +#define CMSDK_PL110_STICKPARITYSEL_Msk (0x1ul << CMSDK_PL110_STICKPARITYSEL_Pos) /*!< CMSDK_PL110 STICKPARITYSEL: Stick parity select Mask */ + +#define CMSDK_PL110_WORDLEN_Pos 5 /*!< CMSDK_PL110 WORDLEN: Word Length Select Position */ +#define CMSDK_PL110_WORDLEN_Msk (0x3ul << CMSDK_PL110_WORDLEN_Pos) /*!< CMSDK_PL110 WORDLEN: Word Length Select Mask */ + +#define CMSDK_PL110_ENFIFOS_Pos 4 /*!< CMSDK_PL110 ENFIFOS: Enable FIFOs Position */ +#define CMSDK_PL110_ENFIFOS_Msk (0x1ul << CMSDK_PL110_ENFIFOS_Pos) /*!< CMSDK_PL110 ENFIFOS: Enable FIFOs Mask */ + +#define CMSDK_PL110_2STOPBITS_Pos 3 /*!< CMSDK_PL110 2STOPBITS: Two Stop Bits Select Position */ +#define CMSDK_PL110_2STOPBITS_Msk (0x1ul << CMSDK_PL110_2STOPBITS_Pos) /*!< CMSDK_PL110 2STOPBITS: Two Stop Bits Select Mask */ + +#define CMSDK_PL110_EVENPARITY_Pos 2 /*!< CMSDK_PL110 EVENPARITY: Even Parity Select Position */ +#define CMSDK_PL110_EVENPARITY_Msk (0x1ul << CMSDK_PL110_EVENPARITY_Pos) /*!< CMSDK_PL110 EVENPARITY: Even Parity Select Mask */ + +#define CMSDK_PL110_PARITYEN_Pos 1 /*!< CMSDK_PL110 PARITYEN: Parity Enable Position */ +#define CMSDK_PL110_PARITYEN_Msk (0x1ul << CMSDK_PL110_PARITYEN_Pos) /*!< CMSDK_PL110 PARITYEN: Parity Enable Mask */ + +#define CMSDK_PL110_SENDBREAK_Pos 0 /*!< CMSDK_PL110 SENDBREAK: Send Break Position */ +#define CMSDK_PL110_SENDBREAK_Msk (0x1ul << CMSDK_PL110_SENDBREAK_Pos) /*!< CMSDK_PL110 SENDBREAK: Send Break Mask */ + +#define CMSDK_PL110_CTS_FLOWCTRL_Pos 15 /*!< CMSDK_PL110 CTS_FLOWCTRL: Enable CTS Flow Control Position */ +#define CMSDK_PL110_CTS_FLOWCTRL_Msk (0x1ul << CMSDK_PL110_CTS_FLOWCTRL_Pos) /*!< CMSDK_PL110 CTS_FLOWCTRL: Enable CTS Flow Control Mask */ + +#define CMSDK_PL110_RTS_FLOWCTRL_Pos 14 /*!< CMSDK_PL110 RTS_FLOWCTRL: Enable RTS Flow Control Position */ +#define CMSDK_PL110_RTS_FLOWCTRL_Msk (0x1ul << CMSDK_PL110_RTS_FLOWCTRL_Pos) /*!< CMSDK_PL110 RTS_FLOWCTRL: Enable RTS Flow Control Mask */ + +#define CMSDK_PL110_OUT2_Pos 13 /*!< CMSDK_PL110 OUT2: Complement of Out2 modem status output Position */ +#define CMSDK_PL110_OUT2_Msk (0x1ul << CMSDK_PL110_OUT2_Pos) /*!< CMSDK_PL110 OUT2: Complement of Out2 modem status output Mask */ + +#define CMSDK_PL110_OUT1_Pos 12 /*!< CMSDK_PL110 OUT1: Complement of Out1 modem status output Position */ +#define CMSDK_PL110_OUT1_Msk (0x1ul << CMSDK_PL110_OUT1_Pos) /*!< CMSDK_PL110 OUT1: Complement of Out1 modem status output Mask */ + +#define CMSDK_PL110_REQ2SEND_Pos 11 /*!< CMSDK_PL110 REQ2SEND: Request To Send Position */ +#define CMSDK_PL110_REQ2SEND_Msk (0x1ul << CMSDK_PL110_REQ2SEND_Pos) /*!< CMSDK_PL110 REQ2SEND: Request To Send Mask */ + +#define CMSDK_PL110_DATATRANSREADY_Pos 10 /*!< CMSDK_PL110 DATATRANSREADY: Transmit Ready Position */ +#define CMSDK_PL110_DATATRANSREADY_Msk (0x1ul << CMSDK_PL110_DATATRANSREADY_Pos) /*!< CMSDK_PL110 DATATRANSREADY: Transmit Ready Mask */ + +#define CMSDK_PL110_RXEN_Pos 9 /*!< CMSDK_PL110 RXEN: Receive Enable Position */ +#define CMSDK_PL110_RXEN_Msk (0x1ul << CMSDK_PL110_RXEN_Pos) /*!< CMSDK_PL110 RXEN: Receive Enable Mask */ + +#define CMSDK_PL110_TXEN_Pos 8 /*!< CMSDK_PL110 TXEN: Transmit Enable Position */ +#define CMSDK_PL110_TXEN_Msk (0x1ul << CMSDK_PL110_TXEN_Pos) /*!< CMSDK_PL110 TXEN: Transmit Enable Mask */ + +#define CMSDK_PL110_LOOPBACKEN_Pos 7 /*!< CMSDK_PL110 LOOPBACKEN: Loopback Enable Position */ +#define CMSDK_PL110_LOOPBACKEN_Msk (0x1ul << CMSDK_PL110_LOOPBACKEN_Pos) /*!< CMSDK_PL110 LOOPBACKEN: Loopback Enable Mask */ + +#define CMSDK_PL110_IRDASIRLPM_Pos 2 /*!< CMSDK_PL110 IRDASIRLPM: IRDA SIR Low Power Position */ +#define CMSDK_PL110_IRDASIRLPM_Msk (0x1ul << CMSDK_PL110_IRDASIRLPM_Pos) /*!< CMSDK_PL110 IRDASIRLPM: IRDA SIR Low Power Mask */ + +#define CMSDK_PL110_SIREN_Pos 1 /*!< CMSDK_PL110 SIREN: SIR Enable Position */ +#define CMSDK_PL110_SIREN_Msk (0x1ul << CMSDK_PL110_SIREN_Pos) /*!< CMSDK_PL110 SIREN: SIR Enable Mask */ + +#define CMSDK_PL110_UARTEN_Pos 0 /*!< CMSDK_PL110 UARTEN: UART Enable Position */ +#define CMSDK_PL110_UARTEN_Msk (0x1ul << CMSDK_PL110_UARTEN_Pos) /*!< CMSDK_PL110 UARTEN: UART Enable Mask */ + +#define CMSDK_PL110_RECINTFIFOLEVEL_Pos 3 /*!< CMSDK_PL110 RECINTFIFOLEVEL: Set Receive Int FIFO Level Position */ +#define CMSDK_PL110_RECINTFIFOLEVEL_Msk (0x7ul << CMSDK_PL110_RECINTFIFOLEVEL_Pos) /*!< CMSDK_PL110 RECINTFIFOLEVEL: Set Receive Int FIFO Level Mask */ + +#define CMSDK_PL110_TRANSINTFIFOLEVEL_Pos 0 /*!< CMSDK_PL110 TRANSINTFIFOLEVEL: Set Transmit Int FIFO Level Position */ +#define CMSDK_PL110_TRANSINTFIFOLEVEL_Msk (0x7ul << CMSDK_PL110_TRANSINTFIFOLEVEL_Pos) /*!< CMSDK_PL110 TRANSINTFIFOLEVEL: Set Transmit Int FIFO Level Mask */ + +#define CMSDK_PL110_SETMASK_OVRRUNERRINT_Pos 10 /*!< CMSDK_PL110 SETMASK_OVRRUNERRINT: Set Overrun Error Int Mask Position */ +#define CMSDK_PL110_SETMASK_OVRRUNERRINT_Msk (0x1ul << CMSDK_PL110_SETMASK_OVRRUNERRINT_Pos) /*!< CMSDK_PL110 SETMASK_OVRRUNERRINT: Set Overrun Error Int Mask Mask */ + +#define CMSDK_PL110_SETMASK_BREAKERRINT_Pos 9 /*!< CMSDK_PL110 SETMASK_BREAKERRINT: Set Break Error Int Mask Position */ +#define CMSDK_PL110_SETMASK_BREAKERRINT_Msk (0x1ul << CMSDK_PL110_SETMASK_BREAKERRINT_Pos) /*!< CMSDK_PL110 SETMASK_BREAKERRINT: Set Break Error Int Mask Mask */ + +#define CMSDK_PL110_SETMASK_PARITYERRINT_Pos 8 /*!< CMSDK_PL110 SETMASK_PARITYERRINT: Set Parity Error Int Mask Position */ +#define CMSDK_PL110_SETMASK_PARITYERRINT_Msk (0x1ul << CMSDK_PL110_SETMASK_PARITYERRINT_Pos) /*!< CMSDK_PL110 SETMASK_PARITYERRINT: Set Parity Error Int Mask Mask */ + +#define CMSDK_PL110_SETMASK_FRAMEERRINT_Pos 7 /*!< CMSDK_PL110 SETMASK_FRAMEERRINT: Set Frame Error Int Mask Position */ +#define CMSDK_PL110_SETMASK_FRAMEERRINT_Msk (0x1ul << CMSDK_PL110_SETMASK_FRAMEERRINT_Pos) /*!< CMSDK_PL110 SETMASK_FRAMEERRINT: Set Frame Error Int Mask Mask */ + +#define CMSDK_PL110_SETMASK_RECTRANSINT_Pos 6 /*!< CMSDK_PL110 SETMASK_RECTRANSINT: Set Transmit Receive Comb Int Mask Position */ +#define CMSDK_PL110_SETMASK_RECTRANSINT_Msk (0x1ul << CMSDK_PL110_SETMASK_RECTRANSINT_Pos) /*!< CMSDK_PL110 SETMASK_RECTRANSINT: Set Transmit Receive Comb Int Mask Mask */ + +#define CMSDK_PL110_SETMASK_TRANSINT_Pos 5 /*!< CMSDK_PL110 SETMASK_TRANSINT: Set Transmit Int Mask Position */ +#define CMSDK_PL110_SETMASK_TRANSINT_Msk (0x1ul << CMSDK_PL110_SETMASK_TRANSINT_Pos) /*!< CMSDK_PL110 SETMASK_TRANSINT: Set Transmit Int Mask Mask */ + +#define CMSDK_PL110_SETMASK_RECINT_Pos 4 /*!< CMSDK_PL110 SETMASK_RECINT: Set Receive Int Mask Position */ +#define CMSDK_PL110_SETMASK_RECINT_Msk (0x1ul << CMSDK_PL110_SETMASK_RECINT_Pos) /*!< CMSDK_PL110 SETMASK_RECINT: Set Receive Int Mask Mask */ + +#define CMSDK_PL110_SETMASK_UART_DSRMODINT_Pos 3 /*!< CMSDK_PL110 SETMASK_UART_DSRMODINT: Set Data Set Ready Modem Int Mask Position */ +#define CMSDK_PL110_SETMASK_UART_DSRMODINT_Msk (0x1ul << CMSDK_PL110_SETMASK_UARTD_SRMODINT_Pos) /*!< CMSDK_PL110 SETMASK_UART_DSRMODINT: Set Data Set Ready Modem Int Mask Mask */ + +#define CMSDK_PL110_SETMASK_UART_DCDMODINT_Pos 2 /*!< CMSDK_PL110 SETMASK_UART_DCDMODINT: Set Data Carrier Detect Modem Int Mask Position */ +#define CMSDK_PL110_SETMASK_UART_DCDMODINT_Msk (0x1ul << CMSDK_PL110_SETMASK_UART_DCDMODINT_Pos) /*!< CMSDK_PL110 SETMASK_UART_DCDMODINT: Set Data Carrier Detect Modem Int Mask Mask */ + +#define CMSDK_PL110_SETMASK_UART_CTSMODINT_Pos 1 /*!< CMSDK_PL110 SETMASK_UART_CTSMODINT: Set Clear To Send Modem Int Mask Position */ +#define CMSDK_PL110_SETMASK_UART_CTSMODINT_Msk (0x1ul << CMSDK_PL110_SETMASK_UART_CTSMODINT_Pos) /*!< CMSDK_PL110 SETMASK_UART_CTSMODINT: Set Clear To Send Modem Int Mask Mask */ + +#define CMSDK_PL110_SETMASK_UART_RIMODINT_Pos 0 /*!< CMSDK_PL110 SETMASK_UART_RIMODINT: Set nUARTRI Modem Int Mask Position */ +#define CMSDK_PL110_SETMASK_UART_RIMODINT_Msk (0x1ul << CMSDK_PL110_SETMASK_UART_RIMODINT_Pos) /*!< CMSDK_PL110 SETMASK_UART_RIMODINT: Set nUARTRI Modem Int Mask Mask */ + +#define CMSDK_PL110_RAWINTSTAT_OVRRUNERRINT_Pos 10 /*!< CMSDK_PL110 RAWINTSTAT_OVRRUNERRINT: Raw Overrun Error Int Status Mask Position */ +#define CMSDK_PL110_RAWINTSTAT_OVRRUNERRINT_Msk (0x1ul << CMSDK_PL110_RAWINTSTAT_OVRRUNERRINT_Pos) /*!< CMSDK_PL110 RAWINTSTAT_OVRRUNERRINT: Raw Overrun Error Int Status Mask */ + +#define CMSDK_PL110_RAWINTSTAT_BREAKERRINT_Pos 9 /*!< CMSDK_PL110 RAWINTSTAT_BREAKERRINT: Raw Break Error Int Status Mask Position */ +#define CMSDK_PL110_RAWINTSTAT_BREAKERRINT_Msk (0x1ul << CMSDK_PL110_RAWINTSTAT_BREAKERRINT_Pos) /*!< CMSDK_PL110 RAWINTSTAT_BREAKERRINT: Raw Break Error Int Status Mask */ + +#define CMSDK_PL110_RAWINTSTAT_PARITYERRINT_Pos 8 /*!< CMSDK_PL110 RAWINTSTAT_PARITYERRINT: Raw Parity Error Int Status Mask Position */ +#define CMSDK_PL110_RAWINTSTAT_PARITYERRINT_Msk (0x1ul << CMSDK_PL110_RAWINTSTAT_PARITYERRINT_Pos) /*!< CMSDK_PL110 RAWINTSTAT_PARITYERRINT: Raw Parity Error Int Status Mask */ + +#define CMSDK_PL110_RAWINTSTAT_FRAMEERRINT_Pos 7 /*!< CMSDK_PL110 RAWINTSTAT_FRAMEERRINT: Raw Frame Error Int Status Mask Position */ +#define CMSDK_PL110_RAWINTSTAT_FRAMEERRINT_Msk (0x1ul << CMSDK_PL110_RAWINTSTAT_FRAMEERRINT_Pos) /*!< CMSDK_PL110 RAWINTSTAT_FRAMEERRINT: Raw Frame Error Int Status Mask */ + +#define CMSDK_PL110_RAWINTSTAT_RECTRANSINT_Pos 6 /*!< CMSDK_PL110 RAWINTSTAT_RECTRANSINT: Raw Transmit Receive Comb Int Status Position */ +#define CMSDK_PL110_RAWINTSTAT_RECTRANSINT_Msk (0x1ul << CMSDK_PL110_RAWINTSTAT_RECTRANSINT_Pos) /*!< CMSDK_PL110 RAWINTSTAT_RECTRANSINT: Raw Transmit Receive Comb Int Status Mask */ + +#define CMSDK_PL110_RAWINTSTAT_TRANSINT_Pos 5 /*!< CMSDK_PL110 RAWINTSTAT_TRANSINT: Raw Transmit Int Status Position */ +#define CMSDK_PL110_RAWINTSTAT_TRANSINT_Msk (0x1ul << CMSDK_PL110_RAWINTSTAT_TRANSINT_Pos) /*!< CMSDK_PL110 RAWINTSTAT_TRANSINT: Raw Transmit Int Status Mask */ + +#define CMSDK_PL110_RAWINTSTAT_RECINT_Pos 4 /*!< CMSDK_PL110 RAWINTSTAT_RECINT: Raw Receive Int Status Position */ +#define CMSDK_PL110_RAWINTSTAT_RECINT_Msk (0x1ul << CMSDK_PL110_RAWINTSTAT_RECINT_Pos) /*!< CMSDK_PL110 RAWINTSTAT_RECINT: Raw Receive Int Status Mask */ + +#define CMSDK_PL110_RAWINTSTAT_UART_DSRMODINT_Pos 3 /*!< CMSDK_PL110 RAWINTSTAT_UART_DSRMODINT: Raw Data Set Ready Int Status Position */ +#define CMSDK_PL110_RAWINTSTAT_UART_DSRMODINT_Msk (0x1ul << CMSDK_PL110_RAWINTSTAT_UARTD_SRMODINT_Pos) /*!< CMSDK_PL110 RAWINTSTAT_UARTD_SRMODINT: Raw Data Set Ready Int Status Mask */ + +#define CMSDK_PL110_RAWINTSTAT_UART_DCDMODINT_Pos 2 /*!< CMSDK_PL110 RAWINTSTAT_UART_DCDMODINT: Raw Data Carrier Detect Int Status Position */ +#define CMSDK_PL110_RAWINTSTAT_UART_DCDMODINT_Msk (0x1ul << CMSDK_PL110_RAWINTSTAT_UART_DCDMODINT_Pos) /*!< CMSDK_PL110 RAWINTSTAT_UART_DCDMODINT: Raw Data Carrier Detect Int Status Mask */ + +#define CMSDK_PL110_RAWINTSTAT_UART_CTSMODINT_Pos 1 /*!< CMSDK_PL110 RAWINTSTAT_UART_CTSMODINT: Raw Clear To Send Int Status Position */ +#define CMSDK_PL110_RAWINTSTAT_UART_CTSMODINT_Msk (0x1ul << CMSDK_PL110_RAWINTSTAT_UART_CTSMODINT_Pos) /*!< CMSDK_PL110 RAWINTSTAT_UART_CTSMODINT: Raw Clear To Send Int Status Mask */ + +#define CMSDK_PL110_RAWINTSTAT_UART_RIMODINT_Pos 0 /*!< CMSDK_PL110 RAWINTSTAT_UART_RIMODINT: Raw nUARTRI Modem Int Status Position */ +#define CMSDK_PL110_RAWINTSTAT_UART_RIMODINT_Msk (0x1ul << CMSDK_PL110_RAWINTSTAT_UART_RIMODINT_Pos) /*!< CMSDK_PL110 RAWINTSTAT_UART_RIMODINT: Raw nUARTRI Modem Int Status Mask */ + +#define CMSDK_PL110_MSKINTSTAT_OVRRUNERRINT_Pos 10 /*!< CMSDK_PL110 MSKINTSTAT_OVRRUNERRINT: Masked Overrun Error Int Status Position */ +#define CMSDK_PL110_MSKINTSTAT_OVRRUNERRINT_Msk (0x1ul << CMSDK_PL110_MSKINTSTAT_OVRRUNERRINT_Pos) /*!< CMSDK_PL110 MSKINTSTAT_OVRRUNERRINT: Masked Overrun Error Int Status Mask */ + +#define CMSDK_PL110_MSKINTSTAT_BREAKERRINT_Pos 9 /*!< CMSDK_PL110 MSKINTSTAT_BREAKERRINT: Masked Break Error Int Status Position */ +#define CMSDK_PL110_MSKINTSTAT_BREAKERRINT_Msk (0x1ul << CMSDK_PL110_MSKINTSTAT_BREAKERRINT_Pos) /*!< CMSDK_PL110 MSKINTSTAT_BREAKERRINT: Masked Break Error Int Status Mask */ + +#define CMSDK_PL110_MSKINTSTAT_PARITYERRINT_Pos 8 /*!< CMSDK_PL110 MSKINTSTAT_PARITYERRINT: Masked Parity Error Int Status Position */ +#define CMSDK_PL110_MSKINTSTAT_PARITYERRINT_Msk (0x1ul << CMSDK_PL110_MSKINTSTAT_PARITYERRINT_Pos) /*!< CMSDK_PL110 MSKINTSTAT_PARITYERRINT: Masked Parity Error Int Status Mask */ + +#define CMSDK_PL110_MSKINTSTAT_FRAMEERRINT_Pos 7 /*!< CMSDK_PL110 MSKINTSTAT_FRAMEERRINT: Masked Frame Error Int Status Position */ +#define CMSDK_PL110_MSKINTSTAT_FRAMEERRINT_Msk (0x1ul << CMSDK_PL110_MSKINTSTAT_FRAMEERRINT_Pos) /*!< CMSDK_PL110 MSKINTSTAT_FRAMEERRINT: Masked Frame Error Int Status Mask */ + +#define CMSDK_PL110_MSKINTSTAT_RECTRANSINT_Pos 6 /*!< CMSDK_PL110 MSKINTSTAT_RECTRANSINT: Masked Transmit Receive Comb Int Status Position */ +#define CMSDK_PL110_MSKINTSTAT_RECTRANSINT_Msk (0x1ul << CMSDK_PL110_MSKINTSTAT_RECTRANSINT_Pos) /*!< CMSDK_PL110 MSKINTSTAT_RECTRANSINT: Masked Transmit Receive Comb Int Status Mask */ + +#define CMSDK_PL110_MSKINTSTAT_TRANSINT_Pos 5 /*!< CMSDK_PL110 MSKINTSTAT_TRANSINT: Masked Transmit Int Status Position */ +#define CMSDK_PL110_MSKINTSTAT_TRANSINT_Msk (0x1ul << CMSDK_PL110_MSKINTSTAT_TRANSINT_Pos) /*!< CMSDK_PL110 MSKINTSTAT_TRANSINT: Masked Transmit Int Status Mask */ + +#define CMSDK_PL110_MSKINTSTAT_RECINT_Pos 4 /*!< CMSDK_PL110 MSKINTSTAT_RECINT: Masked Receive Int Status Position */ +#define CMSDK_PL110_MSKINTSTAT_RECINT_Msk (0x1ul << CMSDK_PL110_MSKINTSTAT_RECINT_Pos) /*!< CMSDK_PL110 MSKINTSTAT_RECINT: Masked Receive Int Status Mask */ + +#define CMSDK_PL110_MSKINTSTAT_UART_DSRMODINT_Pos 3 /*!< CMSDK_PL110 MSKINTSTAT_UART_DSRMODINT: Masked Data Set Ready Int Status Position */ +#define CMSDK_PL110_MSKINTSTAT_UART_DSRMODINT_Msk (0x1ul << CMSDK_PL110_MSKINTSTAT_UARTD_SRMODINT_Pos) /*!< CMSDK_PL110 MSKINTSTAT_UART_DSRMODINT: Masked Data Set Ready Int Status Mask */ + +#define CMSDK_PL110_MSKINTSTAT_UART_DCDMODINT_Pos 2 /*!< CMSDK_PL110 MSKINTSTAT_UART_DCDMODINT: Masked Data Carrier Detect Int Status Position */ +#define CMSDK_PL110_MSKINTSTAT_UART_DCDMODINT_Msk (0x1ul << CMSDK_PL110_MSKINTSTAT_UART_DCDMODINT_Pos) /*!< CMSDK_PL110 MSKINTSTAT_UART_DCDMODINT: Masked Data Carrier Detect Int Status Mask */ + +#define CMSDK_PL110_MSKINTSTAT_UART_CTSMODINT_Pos 1 /*!< CMSDK_PL110 MSKINTSTAT_UART_CTSMODINT: Masked Clear To Send Int Status Position */ +#define CMSDK_PL110_MSKINTSTAT_UART_CTSMODINT_Msk (0x1ul << CMSDK_PL110_MSKINTSTAT_UART_CTSMODINT_Pos) /*!< CMSDK_PL110 MSKINTSTAT_UART_CTSMODINT: Masked Clear To Send Int Status Mask */ + +#define CMSDK_PL110_MSKINTSTAT_UART_RIMODINT_Pos 0 /*!< CMSDK_PL110 MSKINTSTAT_UART_RIMODINT: Masked nUARTRI Modem Int Status Position */ +#define CMSDK_PL110_MSKINTSTAT_UART_RIMODINT_Msk (0x1ul << CMSDK_PL110_MSKINTSTAT_UART_RIMODINT_Pos) /*!< CMSDK_PL110 MSKINTSTAT_UART_RIMODINT: Masked nUARTRI Modem Int Status Mask */ + +#define CMSDK_PL110_INTCLR_OVRRUNERRINT_Pos 10 /*!< CMSDK_PL110 INTCLR_OVRRUNERRINT: Clear Overrun Error Int Position */ +#define CMSDK_PL110_INTCLR_OVRRUNERRINT_Msk (0x1ul << CMSDK_PL110_INTCLR_OVRRUNERRINT_Pos) /*!< CMSDK_PL110 INTCLR_OVRRUNERRINT: Clear Overrun Error Int Mask */ + +#define CMSDK_PL110_INTCLR_BREAKERRINT_Pos 9 /*!< CMSDK_PL110 INTCLR_BREAKERRINT: Clear Break Error Int Position */ +#define CMSDK_PL110_INTCLR_BREAKERRINT_Msk (0x1ul << CMSDK_PL110_INTCLR_BREAKERRINT_Pos) /*!< CMSDK_PL110 INTCLR_BREAKERRINT: Clear Break Error Int Mask */ + +#define CMSDK_PL110_INTCLR_PARITYERRINT_Pos 8 /*!< CMSDK_PL110 INTCLR_PARITYERRINT: Clear Parity Error Int Position */ +#define CMSDK_PL110_INTCLR_PARITYERRINT_Msk (0x1ul << CMSDK_PL110_INTCLR_PARITYERRINT_Pos) /*!< CMSDK_PL110 INTCLR_PARITYERRINT: Clear Parity Error Int Mask */ + +#define CMSDK_PL110_INTCLR_FRAMEERRINT_Pos 7 /*!< CMSDK_PL110 INTCLR_FRAMEERRINT: Clear Frame Error Int Position */ +#define CMSDK_PL110_INTCLR_FRAMEERRINT_Msk (0x1ul << CMSDK_PL110_INTCLR_FRAMEERRINT_Pos) /*!< CMSDK_PL110 INTCLR_FRAMEERRINT: Clear Frame Error Int Mask */ + +#define CMSDK_PL110_INTCLR_RECTRANSINT_Pos 6 /*!< CMSDK_PL110 INTCLR_RECTRANSINT: Clear Receive Transmit Comb Int Position */ +#define CMSDK_PL110_INTCLR_RECTRANSINT_Msk (0x1ul << CMSDK_PL110_INTCLR_RECTRANSINT_Pos) /*!< CMSDK_PL110 INTCLR_RECTRANSINT: Clear Receive Transmit Comb Int Mask */ + +#define CMSDK_PL110_INTCLR_TRANSINT_Pos 5 /*!< CMSDK_PL110 INTCLR_TRANSINT: Clear Transmit Int Position */ +#define CMSDK_PL110_INTCLR_TRANSINT_Msk (0x1ul << CMSDK_PL110_INTCLR_TRANSINT_Pos) /*!< CMSDK_PL110 INTCLR_TRANSINT: Clear Transmit Int Mask */ + +#define CMSDK_PL110_INTCLR_RECINT_Pos 4 /*!< CMSDK_PL110 INTCLR_RECINT: Clear Receive Int Position */ +#define CMSDK_PL110_INTCLR_RECINT_Msk (0x1ul << CMSDK_PL110_INTCLR_RECINT_Pos) /*!< CMSDK_PL110 INTCLR_RECINT: Clear Receive Int Mask */ + +#define CMSDK_PL110_INTCLR_UART_DSRMODINT_Pos 3 /*!< CMSDK_PL110 INTCLR_UART_DSRMODINT: Clear Data Carrier Detect Int Position */ +#define CMSDK_PL110_INTCLR_UART_DSRMODINT_Msk (0x1ul << CMSDK_PL110_INTCLR_UARTD_SRMODINT_Pos) /*!< CMSDK_PL110 INTCLR_UARTD_SRMODINT: Clear Data Carrier Detect Int Mask */ + +#define CMSDK_PL110_INTCLR_UART_DCDMODINT_Pos 2 /*!< CMSDK_PL110 INTCLR_UART_DCDMODINT: Clear Data Set Ready Int Position */ +#define CMSDK_PL110_INTCLR_UART_DCDMODINT_Msk (0x1ul << CMSDK_PL110_INTCLR_UART_DCDMODINT_Pos) /*!< CMSDK_PL110 INTCLR_UART_DCDMODINT: Clear Data Set Ready Int Mask */ + +#define CMSDK_PL110_INTCLR_UART_CTSMODINT_Pos 1 /*!< CMSDK_PL110 INTCLR_UART_CTSMODINT: Clear Clear To Sent Int Position */ +#define CMSDK_PL110_INTCLR_UART_CTSMODINT_Msk (0x1ul << CMSDK_PL110_INTCLR_UART_CTSMODINT_Pos) /*!< CMSDK_PL110 INTCLR_UART_CTSMODINT: Clear Clear To Sent Int Mask */ + +#define CMSDK_PL110_INTCLR_UART_RIMODINT_Pos 0 /*!< CMSDK_PL110 INTCLR_UART_RIMODINT: Clear nUARTRI Modem Int Position */ +#define CMSDK_PL110_INTCLR_UART_RIMODINT_Msk (0x1ul << CMSDK_PL110_INTCLR_UART_RIMODINT_Pos) /*!< CMSDK_PL110 INTCLR_UART_RIMODINT: Clear nUARTRI Modem Int Mask */ + +#define CMSDK_PL110_DMA_ERR_Pos 2 /*!< CMSDK_PL110 DMA_ERR: DMA Error Position */ +#define CMSDK_PL110_DMA_ERR_Msk (0x1ul << CMSDK_PL110_DMA_ERR_Pos) /*!< CMSDK_PL110 DMA_ERR: DMA Error Mask */ + +#define CMSDK_PL110_DMA_TRANS_EN_Pos 1 /*!< CMSDK_PL110 DMA_TRANS_EN: DMA Transmit Error Position */ +#define CMSDK_PL110_DMA_TRANS_EN_Msk (0x1ul << CMSDK_PL110_DMA_TRANS_EN_Pos) /*!< CMSDK_PL110 DMA_TRANS_EN: DMA Transmit Error Mask */ + +#define CMSDK_PL110_DMA_REC_EN_Pos 0 /*!< CMSDK_PL110 DMA_REC_EN: DMA Receive Error Position */ +#define CMSDK_PL110_DMA_REC_EN_Msk (0x1ul << CMSDK_PL110_DMA_REC_EN_Pos) /*!< CMSDK_PL110 DMA_REC_EN: DMA Receive Error Mask */ + + +/*@}*/ /* end of group CMSDK_PL110 */ + +/*------------------- Watchdog ----------------------------------------------*/ +/** @addtogroup CMSDK_Watchdog CMSDK Watchdog + @{ +*/ +typedef struct +{ + + __IO uint32_t LOAD; // <h> Watchdog Load Register </h> + __I uint32_t VALUE; // <h> Watchdog Value Register </h> + __IO uint32_t CTRL; // <h> Watchdog Control Register + // <o.1> RESEN: Reset enable + // <o.0> INTEN: Interrupt enable + // </h> + __O uint32_t INTCLR; // <h> Watchdog Clear Interrupt Register </h> + __I uint32_t RAWINTSTAT; // <h> Watchdog Raw Interrupt Status Register </h> + __I uint32_t MASKINTSTAT; // <h> Watchdog Interrupt Status Register </h> + uint32_t RESERVED0[762]; + __IO uint32_t LOCK; // <h> Watchdog Lock Register </h> + uint32_t RESERVED1[191]; + __IO uint32_t ITCR; // <h> Watchdog Integration Test Control Register </h> + __O uint32_t ITOP; // <h> Watchdog Integration Test Output Set Register </h> + +}CMSDK_WATCHDOG_TypeDef; + +#define CMSDK_Watchdog_LOAD_Pos 0 /*!< CMSDK_Watchdog LOAD: LOAD Position */ +#define CMSDK_Watchdog_LOAD_Msk (0xFFFFFFFFul << CMSDK_Watchdog_LOAD_Pos) /*!< CMSDK_Watchdog LOAD: LOAD Mask */ + +#define CMSDK_Watchdog_VALUE_Pos 0 /*!< CMSDK_Watchdog VALUE: VALUE Position */ +#define CMSDK_Watchdog_VALUE_Msk (0xFFFFFFFFul << CMSDK_Watchdog_VALUE_Pos) /*!< CMSDK_Watchdog VALUE: VALUE Mask */ + +#define CMSDK_Watchdog_CTRL_RESEN_Pos 1 /*!< CMSDK_Watchdog CTRL_RESEN: Enable Reset Output Position */ +#define CMSDK_Watchdog_CTRL_RESEN_Msk (0x1ul << CMSDK_Watchdog_CTRL_RESEN_Pos) /*!< CMSDK_Watchdog CTRL_RESEN: Enable Reset Output Mask */ + +#define CMSDK_Watchdog_CTRL_INTEN_Pos 0 /*!< CMSDK_Watchdog CTRL_INTEN: Int Enable Position */ +#define CMSDK_Watchdog_CTRL_INTEN_Msk (0x1ul << CMSDK_Watchdog_CTRL_INTEN_Pos) /*!< CMSDK_Watchdog CTRL_INTEN: Int Enable Mask */ + +#define CMSDK_Watchdog_INTCLR_Pos 0 /*!< CMSDK_Watchdog INTCLR: Int Clear Position */ +#define CMSDK_Watchdog_INTCLR_Msk (0x1ul << CMSDK_Watchdog_INTCLR_Pos) /*!< CMSDK_Watchdog INTCLR: Int Clear Mask */ + +#define CMSDK_Watchdog_RAWINTSTAT_Pos 0 /*!< CMSDK_Watchdog RAWINTSTAT: Raw Int Status Position */ +#define CMSDK_Watchdog_RAWINTSTAT_Msk (0x1ul << CMSDK_Watchdog_RAWINTSTAT_Pos) /*!< CMSDK_Watchdog RAWINTSTAT: Raw Int Status Mask */ + +#define CMSDK_Watchdog_MASKINTSTAT_Pos 0 /*!< CMSDK_Watchdog MASKINTSTAT: Mask Int Status Position */ +#define CMSDK_Watchdog_MASKINTSTAT_Msk (0x1ul << CMSDK_Watchdog_MASKINTSTAT_Pos) /*!< CMSDK_Watchdog MASKINTSTAT: Mask Int Status Mask */ + +#define CMSDK_Watchdog_LOCK_Pos 0 /*!< CMSDK_Watchdog LOCK: LOCK Position */ +#define CMSDK_Watchdog_LOCK_Msk (0x1ul << CMSDK_Watchdog_LOCK_Pos) /*!< CMSDK_Watchdog LOCK: LOCK Mask */ + +#define CMSDK_Watchdog_INTEGTESTEN_Pos 0 /*!< CMSDK_Watchdog INTEGTESTEN: Integration Test Enable Position */ +#define CMSDK_Watchdog_INTEGTESTEN_Msk (0x1ul << CMSDK_Watchdog_INTEGTESTEN_Pos) /*!< CMSDK_Watchdog INTEGTESTEN: Integration Test Enable Mask */ + +#define CMSDK_Watchdog_INTEGTESTOUTSET_Pos 1 /*!< CMSDK_Watchdog INTEGTESTOUTSET: Integration Test Output Set Position */ +#define CMSDK_Watchdog_INTEGTESTOUTSET_Msk (0x1ul << CMSDK_Watchdog_INTEGTESTOUTSET_Pos) /*!< CMSDK_Watchdog INTEGTESTOUTSET: Integration Test Output Set Mask */ + +/*@}*/ /* end of group CMSDK_Watchdog */ + +/*------------------- PrimeCell APB GPIO --------------------------------------*/ +/** @addtogroup CMSDK_PL061 CMSDK APB GPIO + @{ +*/ +typedef struct +{ + +__IO uint32_t DATA[256]; +__IO uint32_t DIR; +__IO uint32_t INTSENSE; +__IO uint32_t INTBOTHEDGE; +__IO uint32_t INTEVENT; +__IO uint32_t INTMASK; +__O uint32_t RAWINTSTAT; +__O uint32_t MASKINTSTAT; +__I uint32_t INTCLR; +__IO uint32_t MODECTRL; + +}APBGPIO_TypeDef; + +#define CMSDK_PL061_DATA_Pos 0 /*!< CMSDK_PL061 DATA: DATA Position */ +#define CMSDK_PL061_DATA_Msk (0xFFFFFFFFul << CMSDK_PL061_LOAD_Pos) /*!< CMSDK_PL061 DATA: DATA Mask */ + +#define CMSDK_PL061_DIR_Pos 0 /*!< CMSDK_PL061 DIR: Data Direction Position */ +#define CMSDK_PL061_DIR_Msk (0x1ul << CMSDK_PL061_DIR_Pos) /*!< CMSDK_PL061 DIR: Data Direction Mask */ + +#define CMSDK_PL061_INTSENSE_Pos 0 /*!< CMSDK_PL061 INTSENSE: INT SENSE Position */ +#define CMSDK_PL061_INTSENSE_Msk (0x1ul << CMSDK_PL061_INTSENSE_Pos) /*!< CMSDK_PL061 INTSENSE: INT SENSE Mask */ + +#define CMSDK_PL061_INTBOTHEDGE_Pos 0 /*!< CMSDK_PL061 INTBOTHEDGE: INT BOTH EDGE Position */ +#define CMSDK_PL061_INTBOTHEDGE_Msk (0x1ul << CMSDK_PL061_INTBOTHEDGE_Pos) /*!< CMSDK_PL061 INTBOTHEDGE: INT BOTH EDGE Mask */ + +#define CMSDK_PL061_INTEVENT_Pos 0 /*!< CMSDK_PL061 INTEVENT: INT EVENT Position */ +#define CMSDK_PL061_INTEVENT_Msk (0x1ul << CMSDK_PL061_INTEVENT_Pos) /*!< CMSDK_PL061 INTEVENT: INT EVENT Mask */ + +#define CMSDK_PL061_INTMASK_Pos 0 /*!< CMSDK_PL061 INTMASK: INT MASK Position */ +#define CMSDK_PL061_INTMASK_Msk (0x1ul << CMSDK_PL061_INTMASK_Pos) /*!< CMSDK_PL061 INTMASK: INT MASK Mask */ + +#define CMSDK_PL061_RAWINTSTAT_Pos 0 /*!< CMSDK_PL061 RAWINTSTAT: Raw Int Status Position */ +#define CMSDK_PL061_RAWINTSTAT_Msk (0x1ul << CMSDK_PL061_RAWINTSTAT_Pos) /*!< CMSDK_PL061 RAWINTSTAT: Raw Int Status Mask */ + +#define CMSDK_PL061_MASKINTSTAT_Pos 0 /*!< CMSDK_PL061 MASKINTSTAT: Mask Int Status Position */ +#define CMSDK_PL061_MASKINTSTAT_Msk (0x1ul << CMSDK_PL061_MASKINTSTAT_Pos) /*!< CMSDK_PL061 MASKINTSTAT: Mask Int Status Mask */ + +#define CMSDK_PL061_INTCLR_Pos 0 /*!< CMSDK_PL061 INTCLR: Int Clear Position */ +#define CMSDK_PL061_INTCLR_Msk (0x1ul << CMSDK_PL061_INTCLR_Pos) /*!< CMSDK_PL061 INTCLR: Int Clear Mask */ + +#define CMSDK_PL061_MODECTRL_HWEN_Pos 0 /*!< CMSDK_PL061 MODECTRL_HWEN: Mode Control Hardware Enable Position */ +#define CMSDK_PL061_MODECTRL_HWEN_Msk (0x1ul << CMSDK_PL061_MODECTRL_HWEN_Pos) /*!< CMSDK_PL061 MODECTRL_HWEN: Mode Control Hardware Enable Mask */ + + +/*@}*/ /* end of group CMSDK_PL061 */ + + +#if defined ( __CC_ARM ) +#pragma no_anon_unions +#endif + +/*@}*/ /* end of group CMSDK_Peripherals */ + + +/******************************************************************************/ +/* Peripheral memory map */ +/******************************************************************************/ +/** @addtogroup CMSDK_MemoryMap CMSDK Memory Mapping + @{ +*/ + +/* Peripheral and SRAM base address */ +#define CMSDK_FLASH_BASE (0x00000000UL) /*!< (FLASH ) Base Address */ +#define CMSDK_SRAM_BASE (0x20000000UL) /*!< (SRAM ) Base Address */ +#define CMSDK_PERIPH_BASE (0x40000000UL) /*!< (Peripheral) Base Address */ + +#define CMSDK_RAM_BASE (0x20000000UL) +#define CMSDK_APB_BASE (0x40000000UL) +#define CMSDK_AHB_BASE (0x40010000UL) + +/* APB peripherals */ +#define CMSDK_TIMER0_BASE (CMSDK_APB_BASE + 0x0000UL) +#define CMSDK_TIMER1_BASE (CMSDK_APB_BASE + 0x1000UL) +#define CMSDK_DUALTIMER_BASE (CMSDK_APB_BASE + 0x2000UL) +#define CMSDK_DUALTIMER_1_BASE (CMSDK_DUALTIMER_BASE) +#define CMSDK_DUALTIMER_2_BASE (CMSDK_DUALTIMER_BASE + 0x20UL) +#define CMSDK_UART0_BASE (CMSDK_APB_BASE + 0x4000UL) +#define CMSDK_UART1_BASE (CMSDK_APB_BASE + 0x5000UL) +#define CMSDK_UART2_BASE (CMSDK_APB_BASE + 0x6000UL) +#define CMSDK_USRT2_BASE (CMSDK_APB_BASE + 0xE000UL) //0x6000UL) +#define CMSDK_WATCHDOG_BASE (CMSDK_APB_BASE + 0x8000UL) +#define CMSDK_PL230_BASE (CMSDK_APB_BASE + 0xF000UL) + +/* AHB peripherals */ +#define CMSDK_GPIO0_BASE (CMSDK_AHB_BASE + 0x0000UL) +#define CMSDK_GPIO1_BASE (CMSDK_AHB_BASE + 0x1000UL) +#define CMSDK_SYSCTRL_BASE (CMSDK_AHB_BASE + 0xF000UL) +/*@}*/ /* end of group CMSDK_MemoryMap */ + + +/******************************************************************************/ +/* Peripheral declaration */ +/******************************************************************************/ + +/** @addtogroup CMSDK_PeripheralDecl CMSDK Peripheral Declaration + @{ +*/ + +#define CMSDK_UART0 ((CMSDK_UART_TypeDef *) CMSDK_UART0_BASE ) +#define CMSDK_UART1 ((CMSDK_UART_TypeDef *) CMSDK_UART1_BASE ) +#define CMSDK_UART2 ((CMSDK_UART_TypeDef *) CMSDK_UART2_BASE ) +#define CMSDK_USRT2 ((CMSDK_UART_TypeDef *) CMSDK_USRT2_BASE ) +#define CMSDK_TIMER0 ((CMSDK_TIMER_TypeDef *) CMSDK_TIMER0_BASE ) +#define CMSDK_TIMER1 ((CMSDK_TIMER_TypeDef *) CMSDK_TIMER1_BASE ) +#define CMSDK_DUALTIMER ((CMSDK_DUALTIMER_BOTH_TypeDef *) CMSDK_DUALTIMER_BASE ) +#define CMSDK_DUALTIMER1 ((CMSDK_DUALTIMER_SINGLE_TypeDef *) CMSDK_DUALTIMER_1_BASE ) +#define CMSDK_DUALTIMER2 ((CMSDK_DUALTIMER_SINGLE_TypeDef *) CMSDK_DUALTIMER_2_BASE ) +#define CMSDK_WATCHDOG ((CMSDK_WATCHDOG_TypeDef *) CMSDK_WATCHDOG_BASE ) +#define CMSDK_DMA ((CMSDK_PL230_TypeDef *) CMSDK_PL230_BASE ) +#define CMSDK_GPIO0 ((CMSDK_GPIO_TypeDef *) CMSDK_GPIO0_BASE ) +#define CMSDK_GPIO1 ((CMSDK_GPIO_TypeDef *) CMSDK_GPIO1_BASE ) +#define CMSDK_SYSCON ((CMSDK_SYSCON_TypeDef *) CMSDK_SYSCTRL_BASE ) +/*@}*/ /* end of group CMSDK_PeripheralDecl */ + +/*@}*/ /* end of group CMSDK_Definitions */ + +#ifdef __cplusplus +} +#endif + +#endif /* CMSDK_H */ diff --git a/Cortex-M0/nanosoc/software/cmsis/Device/ARM/CMSDK_CM0/Include/CMSDK_driver.h b/Cortex-M0/nanosoc/software/cmsis/Device/ARM/CMSDK_CM0/Include/CMSDK_driver.h new file mode 100644 index 0000000..6b7b49a --- /dev/null +++ b/Cortex-M0/nanosoc/software/cmsis/Device/ARM/CMSDK_CM0/Include/CMSDK_driver.h @@ -0,0 +1,293 @@ +/* + *----------------------------------------------------------------------------- + * The confidential and proprietary information contained in this file may + * only be used by a person authorised under and to the extent permitted + * by a subsisting licensing agreement from Arm Limited or its affiliates. + * + * (C) COPYRIGHT 2010-2011 Arm Limited or its affiliates. + * ALL RIGHTS RESERVED + * + * This entire notice must be reproduced on all copies of this file + * and copies of this file may only be made by a person if such person is + * permitted to do so under the terms of a subsisting license agreement + * from Arm Limited or its affiliates. + * + * SVN Information + * + * Checked In : $Date: 2017-10-10 15:55:38 +0100 (Tue, 10 Oct 2017) $ + * + * Revision : $Revision: 371321 $ + * + * Release Information : Cortex-M System Design Kit-r1p1-00rel0 + *----------------------------------------------------------------------------- + */ +/*************************************************************************//** + * @file CMSDK_driver.h + * @brief CMSDK Example Device Driver Header File + * @version $State:$ + * @date $Date: 2017-10-10 15:55:38 +0100 (Tue, 10 Oct 2017) $ + * + ******************************************************************************/ + + +/** @addtogroup CMSIS_CM0_CMSDK_Driver_definitions CMSDK Driver definitions + This file defines all CMSDK Driver functions for CMSIS core for the following modules: + - Timer + - UART + - GPIO + @{ + */ + + #include "CMSDK_CM0.h" + + + /*UART Driver Declarations*/ + + /** + * @brief Initializes UART module. + */ + + extern uint32_t CMSDK_uart_init(CMSDK_UART_TypeDef *CMSDK_UART, uint32_t divider, uint32_t tx_en, + uint32_t rx_en, uint32_t tx_irq_en, uint32_t rx_irq_en, uint32_t tx_ovrirq_en, uint32_t rx_ovrirq_en); + + /** + * @brief Returns whether the UART RX Buffer is Full. + */ + + extern uint32_t CMSDK_uart_GetRxBufferFull(CMSDK_UART_TypeDef *CMSDK_UART); + + /** + * @brief Returns whether the UART TX Buffer is Full. + */ + + extern uint32_t CMSDK_uart_GetTxBufferFull(CMSDK_UART_TypeDef *CMSDK_UART); + + /** + * @brief Sends a character to the UART TX Buffer. + */ + + + extern void CMSDK_uart_SendChar(CMSDK_UART_TypeDef *CMSDK_UART, char txchar); + + /** + * @brief Receives a character from the UART RX Buffer. + */ + + extern char CMSDK_uart_ReceiveChar(CMSDK_UART_TypeDef *CMSDK_UART); + + /** + * @brief Returns UART Overrun status. + */ + + extern uint32_t CMSDK_uart_GetOverrunStatus(CMSDK_UART_TypeDef *CMSDK_UART); + + /** + * @brief Clears UART Overrun status Returns new UART Overrun status. + */ + + extern uint32_t CMSDK_uart_ClearOverrunStatus(CMSDK_UART_TypeDef *CMSDK_UART); + + /** + * @brief Returns UART Baud rate Divider value. + */ + + extern uint32_t CMSDK_uart_GetBaudDivider(CMSDK_UART_TypeDef *CMSDK_UART); + + /** + * @brief Return UART TX Interrupt Status. + */ + + extern uint32_t CMSDK_uart_GetTxIRQStatus(CMSDK_UART_TypeDef *CMSDK_UART); + + /** + * @brief Return UART RX Interrupt Status. + */ + + extern uint32_t CMSDK_uart_GetRxIRQStatus(CMSDK_UART_TypeDef *CMSDK_UART); + + /** + * @brief Clear UART TX Interrupt request. + */ + + extern void CMSDK_uart_ClearTxIRQ(CMSDK_UART_TypeDef *CMSDK_UART); + + /** + * @brief Clear UART RX Interrupt request. + */ + + extern void CMSDK_uart_ClearRxIRQ(CMSDK_UART_TypeDef *CMSDK_UART); + + /** + * @brief Set CMSDK Timer for multi-shoot mode with internal clock + */ + + /*Timer Driver Declarations*/ + + extern void CMSDK_timer_Init_IntClock(CMSDK_TIMER_TypeDef *CMSDK_TIMER, uint32_t reload, + uint32_t irq_en); + + /** + * @brief Set CMSDK Timer for multi-shoot mode with external enable + */ + + extern void CMSDK_timer_Init_ExtClock(CMSDK_TIMER_TypeDef *CMSDK_TIMER, uint32_t reload, + uint32_t irq_en); + + + /** + * @brief Set CMSDK Timer for multi-shoot mode with external clock + */ + + extern void CMSDK_timer_Init_ExtEnable(CMSDK_TIMER_TypeDef *CMSDK_TIMER, uint32_t reload, + uint32_t irq_en); + + /** + * @brief CMSDK Timer interrupt clear + */ + + + extern void CMSDK_timer_ClearIRQ(CMSDK_TIMER_TypeDef *CMSDK_TIMER); + + /** + * @brief Returns timer IRQ status + */ + + uint32_t CMSDK_timer_StatusIRQ(CMSDK_TIMER_TypeDef *CMSDK_TIMER); + + /** + * @brief Returns Timer Reload value. + */ + + extern uint32_t CMSDK_timer_GetReload(CMSDK_TIMER_TypeDef *CMSDK_TIMER); + + /** + * @brief Sets Timer Reload value. + */ + + extern void CMSDK_timer_SetReload(CMSDK_TIMER_TypeDef *CMSDK_TIMER, uint32_t value); + + /** + * @brief Returns Timer current value. + */ + + uint32_t CMSDK_timer_GetValue(CMSDK_TIMER_TypeDef *CMSDK_TIMER); + + /** + * @brief Sets Timer current value. + */ + + extern void CMSDK_timer_SetValue(CMSDK_TIMER_TypeDef *CMSDK_TIMER, uint32_t value); + + /** + * @brief Stops CMSDK Timer. + */ + + extern void CMSDK_timer_StopTimer(CMSDK_TIMER_TypeDef *CMSDK_TIMER); + + /** + * @brief Starts CMSDK Timer. + */ + + extern void CMSDK_timer_StartTimer(CMSDK_TIMER_TypeDef *CMSDK_TIMER); + + /** + * @brief Enables CMSDK Timer Interrupt requests. + */ + + extern void CMSDK_timer_EnableIRQ(CMSDK_TIMER_TypeDef *CMSDK_TIMER); + + /** + * @brief Disables CMSDK Timer Interrupt requests. + */ + + extern void CMSDK_timer_DisableIRQ(CMSDK_TIMER_TypeDef *CMSDK_TIMER); + + /** + * @brief Set CMSDK GPIO Output Enable. + */ + + /*GPIO Driver Declarations*/ + + extern void CMSDK_gpio_SetOutEnable(CMSDK_GPIO_TypeDef *CMSDK_GPIO, uint32_t outenableset); + + /** + * @brief Clear CMSDK GPIO Output Enable. + */ + + extern void CMSDK_gpio_ClrOutEnable(CMSDK_GPIO_TypeDef *CMSDK_GPIO, uint32_t outenableclr); + + /** + * @brief Returns CMSDK GPIO Output Enable. + */ + + extern uint32_t CMSDK_gpio_GetOutEnable(CMSDK_GPIO_TypeDef *CMSDK_GPIO); + + /** + * @brief Set CMSDK GPIO Alternate function Enable. + */ + + extern void CMSDK_gpio_SetAltFunc(CMSDK_GPIO_TypeDef *CMSDK_GPIO, uint32_t AltFuncset); + + /** + * @brief Clear CMSDK GPIO Alternate function Enable. + */ + + extern void CMSDK_gpio_ClrAltFunc(CMSDK_GPIO_TypeDef *CMSDK_GPIO, uint32_t AltFuncclr); + + /** + * @brief Returns CMSDK GPIO Alternate function Enable. + */ + + extern uint32_t CMSDK_gpio_GetAltFunc(CMSDK_GPIO_TypeDef *CMSDK_GPIO); + + /** + * @brief Clear CMSDK GPIO Interrupt request. + */ + + extern uint32_t CMSDK_gpio_IntClear(CMSDK_GPIO_TypeDef *CMSDK_GPIO, uint32_t Num); + + /** + * @brief Enable CMSDK GPIO Interrupt request. + */ + + extern uint32_t CMSDK_gpio_SetIntEnable(CMSDK_GPIO_TypeDef *CMSDK_GPIO, uint32_t Num); + + /** + * @brief Disable CMSDK GPIO Interrupt request. + */ + + extern uint32_t CMSDK_gpio_ClrIntEnable(CMSDK_GPIO_TypeDef *CMSDK_GPIO, uint32_t Num); + + /** + * @brief Setup CMSDK GPIO Interrupt as high level. + */ + + extern void CMSDK_gpio_SetIntHighLevel(CMSDK_GPIO_TypeDef *CMSDK_GPIO, uint32_t Num); + + /** + * @brief Setup CMSDK GPIO Interrupt as rising edge. + */ + + extern void CMSDK_gpio_SetIntRisingEdge(CMSDK_GPIO_TypeDef *CMSDK_GPIO, uint32_t Num); + + /** + * @brief Setup CMSDK GPIO Interrupt as low level. + */ + + extern void CMSDK_gpio_SetIntLowLevel(CMSDK_GPIO_TypeDef *CMSDK_GPIO, uint32_t Num); + + /** + * @brief Setup CMSDK GPIO Interrupt as falling edge. + */ + + extern void CMSDK_gpio_SetIntFallingEdge(CMSDK_GPIO_TypeDef *CMSDK_GPIO, uint32_t Num); + + /** + * @brief Setup CMSDK GPIO output value using Masked access. + */ + + extern void CMSDK_gpio_MaskedWrite(CMSDK_GPIO_TypeDef *CMSDK_GPIO, uint32_t value, uint32_t mask); + + /*@}*/ /* end of group CMSIS_CM0_CMSDK_Driver_definitions CMSDK Driver definitions */ + + diff --git a/Cortex-M0/nanosoc/software/cmsis/Device/ARM/CMSDK_CM0/Include/system_CMSDK_CM0.h b/Cortex-M0/nanosoc/software/cmsis/Device/ARM/CMSDK_CM0/Include/system_CMSDK_CM0.h new file mode 100644 index 0000000..9e74cf3 --- /dev/null +++ b/Cortex-M0/nanosoc/software/cmsis/Device/ARM/CMSDK_CM0/Include/system_CMSDK_CM0.h @@ -0,0 +1,64 @@ +/**************************************************************************//** + * @file system_CMSDK_CM0.h + * @brief CMSIS Cortex-M0 Device Peripheral Access Layer Header File for + * Device <Device> + * @version V3.01 + * @date 06. March 2012 + * + * @note + * Copyright (C) 2010-2012 ARM Limited. All rights reserved. + * + * @par + * ARM Limited (ARM) is supplying this software for use with Cortex-M + * processor based microcontrollers. This file can be freely distributed + * within development tools that are supporting such ARM based processors. + * + * @par + * THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED + * OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. + * ARM SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR + * CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. + * + ******************************************************************************/ + + +#ifndef SYSTEM_CMSDK_CM0_H +#define SYSTEM_CMSDK_CM0_H + +#ifdef __cplusplus +extern "C" { +#endif + +#include <stdint.h> + +extern uint32_t SystemCoreClock; /*!< System Clock Frequency (Core Clock) */ + + +/** + * Initialize the system + * + * @param none + * @return none + * + * @brief Setup the microcontroller system. + * Initialize the System and update the SystemCoreClock variable. + */ +extern void SystemInit (void); + +/** + * Update SystemCoreClock variable + * + * @param none + * @return none + * + * @brief Updates the SystemCoreClock with current core Clock + * retrieved from cpu registers. + */ +extern void SystemCoreClockUpdate (void); + +#ifdef __cplusplus +} +#endif + +#endif /* SYSTEM_CMSDK_CM0_H */ diff --git a/Cortex-M0/nanosoc/software/cmsis/Device/ARM/CMSDK_CM0/Source/ARM/startup_CMSDK_CM0.s b/Cortex-M0/nanosoc/software/cmsis/Device/ARM/CMSDK_CM0/Source/ARM/startup_CMSDK_CM0.s new file mode 100644 index 0000000..29bc88a --- /dev/null +++ b/Cortex-M0/nanosoc/software/cmsis/Device/ARM/CMSDK_CM0/Source/ARM/startup_CMSDK_CM0.s @@ -0,0 +1,250 @@ +;/**************************************************************************//** +; * @file startup_CMSDK_CM0.s +; * @brief CMSIS Cortex-M0 Core Device Startup File for +; * Device CMSDK_CM0 +; * @version V3.01 +; * @date 06. March 2012 +; * +; * @note +; * Copyright (C) 2012 ARM Limited. All rights reserved. +; * +; * @par +; * ARM Limited (ARM) is supplying this software for use with Cortex-M +; * processor based microcontrollers. This file can be freely distributed +; * within development tools that are supporting such ARM based processors. +; * +; * @par +; * THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED +; * OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF +; * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. +; * ARM SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR +; * CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. +; * +; ******************************************************************************/ +;/* +;//-------- <<< Use Configuration Wizard in Context Menu >>> ------------------ +;*/ + + +; <h> Stack Configuration +; <o> Stack Size (in Bytes) <0x0-0xFFFFFFFF:8> +; </h> + +Stack_Size EQU 0x00000200 + + AREA STACK, NOINIT, READWRITE, ALIGN=3 +Stack_Mem SPACE Stack_Size +__initial_sp + + +; <h> Heap Configuration +; <o> Heap Size (in Bytes) <0x0-0xFFFFFFFF:8> +; </h> + +Heap_Size EQU 0x00000100 + + AREA HEAP, NOINIT, READWRITE, ALIGN=3 +__heap_base +Heap_Mem SPACE Heap_Size +__heap_limit + + + PRESERVE8 + THUMB + + +; Vector Table Mapped to Address 0 at Reset + + AREA RESET, DATA, READONLY + EXPORT __Vectors + EXPORT __Vectors_End + EXPORT __Vectors_Size + +__Vectors DCD __initial_sp ; Top of Stack + DCD Reset_Handler ; Reset Handler + DCD NMI_Handler ; NMI Handler + DCD HardFault_Handler ; Hard Fault Handler + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD SVC_Handler ; SVCall Handler + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD PendSV_Handler ; PendSV Handler + DCD SysTick_Handler ; SysTick Handler + DCD UARTRX0_Handler ; UART 0 RX Handler + DCD UARTTX0_Handler ; UART 0 TX Handler + DCD UARTRX1_Handler ; UART 1 RX Handler + DCD UARTTX1_Handler ; UART 1 TX Handler + DCD UARTRX2_Handler ; UART 2 RX Handler + DCD UARTTX2_Handler ; UART 2 TX Handler + DCD PORT0_COMB_Handler ; GPIO Port 0 Combined Handler + DCD PORT1_COMB_Handler ; GPIO Port 1 Combined Handler + DCD TIMER0_Handler ; TIMER 0 handler + DCD TIMER1_Handler ; TIMER 1 handler + DCD DUALTIMER_HANDLER ; Dual timer handler + DCD 0 ; Reserved + DCD UARTOVF0_Handler ; UART 0 Overflow Handler + DCD UARTOVF1_Handler ; UART 1 Overflow Handler + DCD UARTOVF2_Handler ; UART 2 Overflow Handler + DCD DMA_Handler ; DMA handler + DCD PORT0_0_Handler ; GPIO Port 0 pin 0 Handler + DCD PORT0_1_Handler ; GPIO Port 0 pin 1 Handler + DCD PORT0_2_Handler ; GPIO Port 0 pin 2 Handler + DCD PORT0_3_Handler ; GPIO Port 0 pin 3 Handler + DCD PORT0_4_Handler ; GPIO Port 0 pin 4 Handler + DCD PORT0_5_Handler ; GPIO Port 0 pin 5 Handler + DCD PORT0_6_Handler ; GPIO Port 0 pin 6 Handler + DCD PORT0_7_Handler ; GPIO Port 0 pin 7 Handler + DCD PORT0_8_Handler ; GPIO Port 0 pin 8 Handler + DCD PORT0_9_Handler ; GPIO Port 0 pin 9 Handler + DCD PORT0_10_Handler ; GPIO Port 0 pin 10 Handler + DCD PORT0_11_Handler ; GPIO Port 0 pin 11 Handler + DCD PORT0_12_Handler ; GPIO Port 0 pin 12 Handler + DCD PORT0_13_Handler ; GPIO Port 0 pin 13 Handler + DCD PORT0_14_Handler ; GPIO Port 0 pin 14 Handler + DCD PORT0_15_Handler ; GPIO Port 0 pin 15 Handler +__Vectors_End + +__Vectors_Size EQU __Vectors_End - __Vectors + + AREA |.text|, CODE, READONLY + + +; Reset Handler + +Reset_Handler PROC + EXPORT Reset_Handler [WEAK] + IMPORT SystemInit + IMPORT __main + LDR R0, =SystemInit + BLX R0 + LDR R0, =__main + BX R0 + ENDP + + +; Dummy Exception Handlers (infinite loops which can be modified) + +NMI_Handler PROC + EXPORT NMI_Handler [WEAK] + B . + ENDP +HardFault_Handler\ + PROC + EXPORT HardFault_Handler [WEAK] + B . + ENDP +SVC_Handler PROC + EXPORT SVC_Handler [WEAK] + B . + ENDP +PendSV_Handler PROC + EXPORT PendSV_Handler [WEAK] + B . + ENDP +SysTick_Handler PROC + EXPORT SysTick_Handler [WEAK] + B . + ENDP +Default_Handler PROC + EXPORT UARTRX0_Handler [WEAK] + EXPORT UARTTX0_Handler [WEAK] + EXPORT UARTRX1_Handler [WEAK] + EXPORT UARTTX1_Handler [WEAK] + EXPORT UARTRX2_Handler [WEAK] + EXPORT UARTTX2_Handler [WEAK] + EXPORT PORT0_COMB_Handler [WEAK] + EXPORT PORT1_COMB_Handler [WEAK] + EXPORT TIMER0_Handler [WEAK] + EXPORT TIMER1_Handler [WEAK] + EXPORT DUALTIMER_HANDLER [WEAK] + EXPORT UARTOVF0_Handler [WEAK] + EXPORT UARTOVF1_Handler [WEAK] + EXPORT UARTOVF2_Handler [WEAK] + EXPORT DMA_Handler [WEAK] + EXPORT PORT0_0_Handler [WEAK] + EXPORT PORT0_1_Handler [WEAK] + EXPORT PORT0_2_Handler [WEAK] + EXPORT PORT0_3_Handler [WEAK] + EXPORT PORT0_4_Handler [WEAK] + EXPORT PORT0_5_Handler [WEAK] + EXPORT PORT0_6_Handler [WEAK] + EXPORT PORT0_7_Handler [WEAK] + EXPORT PORT0_8_Handler [WEAK] + EXPORT PORT0_9_Handler [WEAK] + EXPORT PORT0_10_Handler [WEAK] + EXPORT PORT0_11_Handler [WEAK] + EXPORT PORT0_12_Handler [WEAK] + EXPORT PORT0_13_Handler [WEAK] + EXPORT PORT0_14_Handler [WEAK] + EXPORT PORT0_15_Handler [WEAK] +UARTRX0_Handler +UARTTX0_Handler +UARTRX1_Handler +UARTTX1_Handler +UARTRX2_Handler +UARTTX2_Handler +PORT0_COMB_Handler +PORT1_COMB_Handler +TIMER0_Handler +TIMER1_Handler +DUALTIMER_HANDLER +UARTOVF0_Handler +UARTOVF1_Handler +UARTOVF2_Handler +DMA_Handler +PORT0_0_Handler +PORT0_1_Handler +PORT0_2_Handler +PORT0_3_Handler +PORT0_4_Handler +PORT0_5_Handler +PORT0_6_Handler +PORT0_7_Handler +PORT0_8_Handler +PORT0_9_Handler +PORT0_10_Handler +PORT0_11_Handler +PORT0_12_Handler +PORT0_13_Handler +PORT0_14_Handler +PORT0_15_Handler + B . + ENDP + + + ALIGN + + +; User Initial Stack & Heap + + IF :DEF:__MICROLIB + + EXPORT __initial_sp + EXPORT __heap_base + EXPORT __heap_limit + + ELSE + + IMPORT __use_two_region_memory + EXPORT __user_initial_stackheap + +__user_initial_stackheap PROC + LDR R0, = Heap_Mem + LDR R1, =(Stack_Mem + Stack_Size) + LDR R2, = (Heap_Mem + Heap_Size) + LDR R3, = Stack_Mem + BX LR + ENDP + + ALIGN + + ENDIF + + + END diff --git a/Cortex-M0/nanosoc/software/cmsis/Device/ARM/CMSDK_CM0/Source/CMSDK_driver.c b/Cortex-M0/nanosoc/software/cmsis/Device/ARM/CMSDK_CM0/Source/CMSDK_driver.c new file mode 100644 index 0000000..27b0f44 --- /dev/null +++ b/Cortex-M0/nanosoc/software/cmsis/Device/ARM/CMSDK_CM0/Source/CMSDK_driver.c @@ -0,0 +1,659 @@ +/* + *----------------------------------------------------------------------------- + * The confidential and proprietary information contained in this file may + * only be used by a person authorised under and to the extent permitted + * by a subsisting licensing agreement from Arm Limited or its affiliates. + * + * (C) COPYRIGHT 2010-2011 Arm Limited or its affiliates. + * ALL RIGHTS RESERVED + * + * This entire notice must be reproduced on all copies of this file + * and copies of this file may only be made by a person if such person is + * permitted to do so under the terms of a subsisting license agreement + * from Arm Limited or its affiliates. + * + * SVN Information + * + * Checked In : $Date: 2017-10-10 15:55:38 +0100 (Tue, 10 Oct 2017) $ + * + * Revision : $Revision: 371321 $ + * + * Release Information : Cortex-M System Design Kit-r1p1-00rel0 + *----------------------------------------------------------------------------- + */ +/*********************************************************************//****** + * @file CMSDK_driver.c + * @brief CMSDK Example Device Driver C File + * @version $State:$ + * @date $Date: 2017-10-10 15:55:38 +0100 (Tue, 10 Oct 2017) $ + * + ******************************************************************************/ + +#include "CMSDK_CM0.h" + + + +/** \mainpage ARM CMSDK LIBRARY + * + * + * This user manual describes the ARM Corex M Series CMSDK Library which utilises the + * Cortex Microcontroller Software Interface Standard (CMSIS). it also includes drivers + * for the following modules: + * + * - UART + * - Timer + * - GPIO + * + * The library contains C and assembly functions that have been ported and tested on the MDK + * toolchain. + */ + + +/** + * + * @param *CMSDK_TIMER Timer Pointer + * @return none + * + * @brief Enable the microcontroller timer interrupts. + */ + + void CMSDK_timer_EnableIRQ(CMSDK_TIMER_TypeDef *CMSDK_TIMER) + { + CMSDK_TIMER->CTRL |= CMSDK_TIMER_CTRL_IRQEN_Msk; + } + +/** + * + * @param *CMSDK_TIMER Timer Pointer + * @return none + * + * @brief Disable the microcontroller timer interrutps. + */ + + void CMSDK_timer_DisableIRQ(CMSDK_TIMER_TypeDef *CMSDK_TIMER) + { + CMSDK_TIMER->CTRL &= ~CMSDK_TIMER_CTRL_IRQEN_Msk; + } + +/** + * + * @param *CMSDK_TIMER Timer Pointer + * @return none + * + * @brief Start the Timer. + */ + + void CMSDK_timer_StartTimer(CMSDK_TIMER_TypeDef *CMSDK_TIMER) + { + CMSDK_TIMER->CTRL |= CMSDK_TIMER_CTRL_EN_Msk; + } + +/** + * + * @param *CMSDK_TIMER Timer Pointer + * @return none + * + * @brief Stop the Timer. + */ + + void CMSDK_timer_StopTimer(CMSDK_TIMER_TypeDef *CMSDK_TIMER) + { + CMSDK_TIMER->CTRL &= ~CMSDK_TIMER_CTRL_EN_Msk; + } + +/** + * + * @param *CMSDK_TIMER Timer Pointer + * @return TimerValue + * + * @brief Returns the current value of the timer. + */ + + uint32_t CMSDK_timer_GetValue(CMSDK_TIMER_TypeDef *CMSDK_TIMER) + { + return CMSDK_TIMER->VALUE; + } + +/** + * + * @param *CMSDK_TIMER Timer Pointer + * @param value the value to which the timer is to be set + * @return TimerValue + * + * @brief Sets the timer to the specified value. + */ + + void CMSDK_timer_SetValue(CMSDK_TIMER_TypeDef *CMSDK_TIMER, uint32_t value) + { + CMSDK_TIMER->VALUE = value; + } + +/** + * + * @param *CMSDK_TIMER Timer Pointer + * @return TimerReload + * + * @brief Returns the reload value of the timer. The reload value is the value which the timer is set to after an underflow occurs. + */ + + uint32_t CMSDK_timer_GetReload(CMSDK_TIMER_TypeDef *CMSDK_TIMER) + { + return CMSDK_TIMER->RELOAD; + } + +/** + * + * @param *CMSDK_TIMER Timer Pointer + * @param value Value to be loaded + * @return none + * + * @brief Sets the reload value of the timer to the specified value. The reload value is the value which the timer is set to after an underflow occurs. + */ + + void CMSDK_timer_SetReload(CMSDK_TIMER_TypeDef *CMSDK_TIMER, uint32_t value) + { + CMSDK_TIMER->RELOAD = value; + } + +/** + * + * @param *CMSDK_TIMER Timer Pointer + * @return none + * + * @brief Clears the timer IRQ if set. + */ + + void CMSDK_timer_ClearIRQ(CMSDK_TIMER_TypeDef *CMSDK_TIMER) + { + CMSDK_TIMER->INTCLEAR = CMSDK_TIMER_INTCLEAR_Msk; + } + +/** + * + * @param *CMSDK_TIMER Timer Pointer + * @return none + * + * @brief Returns the IRQ status of the timer in question. + */ + + uint32_t CMSDK_timer_StatusIRQ(CMSDK_TIMER_TypeDef *CMSDK_TIMER) + { + return CMSDK_TIMER->INTSTATUS; + } + +/** + * + * @param *CMSDK_TIMER Timer Pointer + * @param reload The value to which the timer is to be set after an underflow has occurred + * @param irq_en Defines whether the timer IRQ is to be enabled + * @return none + * + * @brief Initialises the timer to use the internal clock and specifies the timer reload value and whether IRQ is enabled or not. + */ + + void CMSDK_timer_Init_IntClock(CMSDK_TIMER_TypeDef *CMSDK_TIMER, uint32_t reload, + uint32_t irq_en) + { + CMSDK_TIMER->CTRL = 0; + CMSDK_TIMER->VALUE = reload; + CMSDK_TIMER->RELOAD = reload; + if (irq_en!=0) /* non zero - enable IRQ */ + CMSDK_TIMER->CTRL = (CMSDK_TIMER_CTRL_IRQEN_Msk | CMSDK_TIMER_CTRL_EN_Msk); + else{ /* zero - do not enable IRQ */ + CMSDK_TIMER->CTRL = ( CMSDK_TIMER_CTRL_EN_Msk); /* enable timer */ + } + } + +/** + * + * @param *CMSDK_TIMER Timer Pointer + * @param reload The value to which the timer is to be set after an underflow has occurred + * @param irq_en Defines whether the timer IRQ is to be enabled + * @return none + * + * @brief Initialises the timer to use the external clock and specifies the timer reload value and whether IRQ is enabled or not. + */ + + void CMSDK_timer_Init_ExtClock(CMSDK_TIMER_TypeDef *CMSDK_TIMER, uint32_t reload, + uint32_t irq_en) + { + CMSDK_TIMER->CTRL = 0; + CMSDK_TIMER->VALUE = reload; + CMSDK_TIMER->RELOAD = reload; + if (irq_en!=0) /* non zero - enable IRQ */ + CMSDK_TIMER->CTRL = (CMSDK_TIMER_CTRL_IRQEN_Msk | + CMSDK_TIMER_CTRL_SELEXTCLK_Msk |CMSDK_TIMER_CTRL_EN_Msk); + else { /* zero - do not enable IRQ */ + CMSDK_TIMER->CTRL = ( CMSDK_TIMER_CTRL_EN_Msk | + CMSDK_TIMER_CTRL_SELEXTCLK_Msk); /* enable timer */ + } + } + +/** + * + * @brief Initialises the timer to use the internal clock but with an external enable. It also specifies the timer reload value and whether IRQ is enabled or not. + * + * @param *CMSDK_TIMER Timer Pointer + * @param reload The value to which the timer is to be set after an underflow has occurred + * @param irq_en Defines whether the timer IRQ is to be enabled + * @return none + * + * + */ + + void CMSDK_timer_Init_ExtEnable(CMSDK_TIMER_TypeDef *CMSDK_TIMER, uint32_t reload, + uint32_t irq_en) + { + CMSDK_TIMER->CTRL = 0; + CMSDK_TIMER->VALUE = reload; + CMSDK_TIMER->RELOAD = reload; + if (irq_en!=0) /* non zero - enable IRQ */ + CMSDK_TIMER->CTRL = (CMSDK_TIMER_CTRL_IRQEN_Msk | + CMSDK_TIMER_CTRL_SELEXTEN_Msk | CMSDK_TIMER_CTRL_EN_Msk); + else { /* zero - do not enable IRQ */ + CMSDK_TIMER->CTRL = ( CMSDK_TIMER_CTRL_EN_Msk | + CMSDK_TIMER_CTRL_SELEXTEN_Msk); /* enable timer */ + } + } + + + /*UART driver functions*/ + +/** + * + * @brief Initialises the UART specifying the UART Baud rate divider value and whether the send and recieve functionality is enabled. It also specifies which of the various interrupts are enabled. + * + * @param *CMSDK_UART UART Pointer + * @param divider The value to which the UART baud rate divider is to be set + * @param tx_en Defines whether the UART transmit is to be enabled + * @param rx_en Defines whether the UART receive is to be enabled + * @param tx_irq_en Defines whether the UART transmit buffer full interrupt is to be enabled + * @param rx_irq_en Defines whether the UART receive buffer full interrupt is to be enabled + * @param tx_ovrirq_en Defines whether the UART transmit buffer overrun interrupt is to be enabled + * @param rx_ovrirq_en Defines whether the UART receive buffer overrun interrupt is to be enabled + * @return 1 if initialisation failed, 0 if successful. + */ + + uint32_t CMSDK_uart_init(CMSDK_UART_TypeDef *CMSDK_UART, uint32_t divider, uint32_t tx_en, + uint32_t rx_en, uint32_t tx_irq_en, uint32_t rx_irq_en, uint32_t tx_ovrirq_en, uint32_t rx_ovrirq_en) + { + uint32_t new_ctrl=0; + + if (tx_en!=0) new_ctrl |= CMSDK_UART_CTRL_TXEN_Msk; + if (rx_en!=0) new_ctrl |= CMSDK_UART_CTRL_RXEN_Msk; + if (tx_irq_en!=0) new_ctrl |= CMSDK_UART_CTRL_TXIRQEN_Msk; + if (rx_irq_en!=0) new_ctrl |= CMSDK_UART_CTRL_RXIRQEN_Msk; + if (tx_ovrirq_en!=0) new_ctrl |= CMSDK_UART_CTRL_TXORIRQEN_Msk; + if (rx_ovrirq_en!=0) new_ctrl |= CMSDK_UART_CTRL_RXORIRQEN_Msk; + + CMSDK_UART->CTRL = 0; /* Disable UART when changing configuration */ + CMSDK_UART->BAUDDIV = divider; + CMSDK_UART->CTRL = new_ctrl; /* Update CTRL register to new value */ + + if((CMSDK_UART->STATE & (CMSDK_UART_STATE_RXOR_Msk | CMSDK_UART_STATE_TXOR_Msk))) return 1; + else return 0; + } + +/** + * + * @param *CMSDK_UART UART Pointer + * @return RxBufferFull + * + * @brief Returns whether the RX buffer is full. + */ + + uint32_t CMSDK_uart_GetRxBufferFull(CMSDK_UART_TypeDef *CMSDK_UART) + { + return ((CMSDK_UART->STATE & CMSDK_UART_STATE_RXBF_Msk)>> CMSDK_UART_STATE_RXBF_Pos); + } + +/** + * + * @param *CMSDK_UART UART Pointer + * @return TxBufferFull + * + * @brief Returns whether the TX buffer is full. + */ + + uint32_t CMSDK_uart_GetTxBufferFull(CMSDK_UART_TypeDef *CMSDK_UART) + { + return ((CMSDK_UART->STATE & CMSDK_UART_STATE_TXBF_Msk)>> CMSDK_UART_STATE_TXBF_Pos); + } + +/** + * + * @param *CMSDK_UART UART Pointer + * @param txchar Character to be sent + * @return none + * + * @brief Sends a character to the TX buffer for transmission. + */ + + void CMSDK_uart_SendChar(CMSDK_UART_TypeDef *CMSDK_UART, char txchar) + { + while(CMSDK_UART->STATE & CMSDK_UART_STATE_TXBF_Msk); + CMSDK_UART->DATA = (uint32_t)txchar; + } + +/** + * + * @param *CMSDK_UART UART Pointer + * @return rxchar + * + * @brief returns the character from the RX buffer which has been received. + */ + + char CMSDK_uart_ReceiveChar(CMSDK_UART_TypeDef *CMSDK_UART) + { + while(!(CMSDK_UART->STATE & CMSDK_UART_STATE_RXBF_Msk)); + return (char)(CMSDK_UART->DATA); + } + +/** + * + * @param *CMSDK_UART UART Pointer + * @return 0 - No overrun + * @return 1 - TX overrun + * @return 2 - RX overrun + * @return 3 - TX & RX overrun + * + * @brief returns the current overrun status of both the RX & TX buffers. + */ + + + uint32_t CMSDK_uart_GetOverrunStatus(CMSDK_UART_TypeDef *CMSDK_UART) + { + return ((CMSDK_UART->STATE & (CMSDK_UART_STATE_RXOR_Msk | CMSDK_UART_STATE_TXOR_Msk))>>CMSDK_UART_STATE_TXOR_Pos); + } + +/** + * + * @param *CMSDK_UART UART Pointer + * @return 0 - No overrun + * @return 1 - TX overrun + * @return 2 - RX overrun + * @return 3 - TX & RX overrun + * + * @brief Clears the overrun status of both the RX & TX buffers and then returns the current overrun status. + */ + + uint32_t CMSDK_uart_ClearOverrunStatus(CMSDK_UART_TypeDef *CMSDK_UART) + { + CMSDK_UART->STATE = (CMSDK_UART_STATE_RXOR_Msk | CMSDK_UART_STATE_TXOR_Msk); + return ((CMSDK_UART->STATE & (CMSDK_UART_STATE_RXOR_Msk | CMSDK_UART_STATE_TXOR_Msk))>>CMSDK_UART_STATE_TXOR_Pos); + } + +/** + * + * @param *CMSDK_UART UART Pointer + * @return BaudDiv + * + * @brief Returns the current UART Baud rate divider. Note that the Baud rate divider is the difference between the clock frequency and the Baud frequency. + */ + + uint32_t CMSDK_uart_GetBaudDivider(CMSDK_UART_TypeDef *CMSDK_UART) + { + return CMSDK_UART->BAUDDIV; + } + + /** + * + * @param *CMSDK_UART UART Pointer + * @return TXStatus + * + * @brief Returns the TX interrupt status. + */ + + uint32_t CMSDK_uart_GetTxIRQStatus(CMSDK_UART_TypeDef *CMSDK_UART) + { + return ((CMSDK_UART->INTSTATUS & CMSDK_UART_CTRL_TXIRQ_Msk)>>CMSDK_UART_CTRL_TXIRQ_Pos); + } + +/** + * + * @param *CMSDK_UART UART Pointer + * @return RXStatus + * + * @brief Returns the RX interrupt status. + */ + + uint32_t CMSDK_uart_GetRxIRQStatus(CMSDK_UART_TypeDef *CMSDK_UART) + { + return ((CMSDK_UART->INTSTATUS & CMSDK_UART_CTRL_RXIRQ_Msk)>>CMSDK_UART_CTRL_RXIRQ_Pos); + } + + /** + * + * @param *CMSDK_UART UART Pointer + * @return none + * + * @brief Clears the TX buffer full interrupt status. + */ + + void CMSDK_uart_ClearTxIRQ(CMSDK_UART_TypeDef *CMSDK_UART) + { + CMSDK_UART->INTCLEAR = CMSDK_UART_CTRL_TXIRQ_Msk; + } + +/** + * + * @param *CMSDK_UART UART Pointer + * @return none + * + * @brief Clears the RX interrupt status. + */ + + void CMSDK_uart_ClearRxIRQ(CMSDK_UART_TypeDef *CMSDK_UART) + { + CMSDK_UART->INTCLEAR = CMSDK_UART_CTRL_RXIRQ_Msk; + } + + + /*GPIO driver functions*/ + +/** + * + * @param *CMSDK_GPIO GPIO Pointer + * @param outenable Bit pattern to be used to set output enable register + * @return none + * + * @brief Sets pins on a port as an output. Set the bit corresponding to the pin number to 1 for output i.e. Set bit 1 of outenable to 1 to set pin 1 as an output. This function is thread safe. + */ + + void CMSDK_gpio_SetOutEnable(CMSDK_GPIO_TypeDef *CMSDK_GPIO, uint32_t outenableset) + { + CMSDK_GPIO->OUTENABLESET = outenableset; + } + +/** + * + * @param *CMSDK_GPIO GPIO Pointer + * @param outenable Bit pattern to be used to set output enable register + * @return none + * + * @brief Sets pins on a port as an input. Set the bit corresponding to the pin number to 1 for input i.e. Set bit 1 of outenable to 1 to set pin 1 as an input. This function is thread safe. + */ + + void CMSDK_gpio_ClrOutEnable(CMSDK_GPIO_TypeDef *CMSDK_GPIO, uint32_t outenableclr) + { + CMSDK_GPIO->OUTENABLECLR = outenableclr; + } + +/** + * + * @param *CMSDK_GPIO GPIO Pointer + * @return outputstatus + * + * @brief returns a uint32_t which defines the whether pins on a port are set as inputs or outputs i.e. if bit 1 of the returned uint32_t is set to 1 then this means that pin 1 is an output. + */ + + uint32_t CMSDK_gpio_GetOutEnable(CMSDK_GPIO_TypeDef *CMSDK_GPIO) + { + return CMSDK_GPIO->OUTENABLESET; + } + +/** + * + * @param *CMSDK_GPIO GPIO Pointer + * @param AltFunc uint32_t to specify whether the alternate function for the pins on the port is enabled + * @return none + * + * @brief enables the alternative function for pins. Set the bit corresponding to the pin number to 1 for alternate function i.e. Set bit 1 of ALtFunc to 1 to set pin 1 to its alternative function. This function is thread safe. + */ + + void CMSDK_gpio_SetAltFunc(CMSDK_GPIO_TypeDef *CMSDK_GPIO, uint32_t AltFuncset) + { + CMSDK_GPIO->ALTFUNCSET = AltFuncset; + } + +/** + * + * @param *CMSDK_GPIO GPIO Pointer + * @param AltFunc uint32_t to specify whether the alternate function for the pins on the port is enabled + * @return none + * + * @brief disables the alternative function for pins. Set the bit corresponding to the pin number to 1 to disable alternate function i.e. Set bit 1 of ALtFunc to 1 to set pin 1 to the orignal output function. This function is thread safe. + */ + + void CMSDK_gpio_ClrAltFunc(CMSDK_GPIO_TypeDef *CMSDK_GPIO, uint32_t AltFuncclr) + { + CMSDK_GPIO->ALTFUNCCLR = AltFuncclr; + } + +/** + * + * @param *CMSDK_GPIO GPIO Pointer + * @return AltFuncStatus + * + * @brief returns a uint32_t which defines the whether pins on a port are set to their alternative or their original output functionality i.e. if bit 1 of the returned uint32_t is set to 1 then this means that pin 1 is set to its alternative function. + */ + + uint32_t CMSDK_gpio_GetAltFunc(CMSDK_GPIO_TypeDef *CMSDK_GPIO) + { + return CMSDK_GPIO->ALTFUNCSET; + } + +/** + * + * @param *CMSDK_GPIO GPIO Pointer + * @param Num The pin number for which to clear the Interrupt + * @return NewIntStatus + * + * @brief Clears the interrupt flag for the specified pin and then returns the new interrupt status of the pin. This function is thread safe. + */ + + uint32_t CMSDK_gpio_IntClear(CMSDK_GPIO_TypeDef *CMSDK_GPIO, uint32_t Num) + { + CMSDK_GPIO->INTCLEAR = (1 << Num); + + return CMSDK_GPIO->INTSTATUS; + } + +/** + * + * @param *CMSDK_GPIO GPIO Pointer + * @param Num The pin number for which to enable the Interrupt + * @return NewIntEnStatus + * + * @brief Enables interrupts for the specified pin and then returns the new interrupt enable status of the pin. This function is thread safe. + */ + + uint32_t CMSDK_gpio_SetIntEnable(CMSDK_GPIO_TypeDef *CMSDK_GPIO, uint32_t Num) + { + CMSDK_GPIO->INTENSET = (1 << Num); + + return CMSDK_GPIO->INTENSET; + } + +/** + * + * @param *CMSDK_GPIO GPIO Pointer + * @param Num The pin number for which to disable the Interrupt + * @return NewIntEnStatus + * + * @brief Disables interrupts for the specified pin and then returns the new interrupt enable status of the pin. This function is thread safe. + */ + + uint32_t CMSDK_gpio_ClrIntEnable(CMSDK_GPIO_TypeDef *CMSDK_GPIO, uint32_t Num) + { + CMSDK_GPIO->INTENCLR = (1 << Num); + + return CMSDK_GPIO->INTENCLR; + } + +/** + * + * @param *CMSDK_GPIO GPIO Pointer + * @param Num The pin number for which to set the Interrupt type + * @return none + * + * @brief Changes the interrupt type for the specified pin to a high level interrupt. This function is thread safe. + */ + + void CMSDK_gpio_SetIntHighLevel(CMSDK_GPIO_TypeDef *CMSDK_GPIO, uint32_t Num) + { + CMSDK_GPIO->INTTYPECLR = (1 << Num); /* Clear INT TYPE bit */ + CMSDK_GPIO->INTPOLSET = (1 << Num); /* Set INT POLarity bit */ + } + +/** + * + * @param *CMSDK_GPIO GPIO Pointer + * @param Num The pin number for which to set the Interrupt type + * @return none + * + * @brief Changes the interrupt type for the specified pin to a rising edge interrupt. This function is thread safe. + */ + + void CMSDK_gpio_SetIntRisingEdge(CMSDK_GPIO_TypeDef *CMSDK_GPIO, uint32_t Num) + { + CMSDK_GPIO->INTTYPESET = (1 << Num); /* Set INT TYPE bit */ + CMSDK_GPIO->INTPOLSET = (1 << Num); /* Set INT POLarity bit */ + } + +/** + * + * @param *CMSDK_GPIO GPIO Pointer + * @param Num The pin number for which to set the Interrupt type + * @return none + * + * @brief Changes the interrupt type for the specified pin to a low level interrupt. This function is thread safe. + */ + + void CMSDK_gpio_SetIntLowLevel(CMSDK_GPIO_TypeDef *CMSDK_GPIO, uint32_t Num) + { + CMSDK_GPIO->INTTYPECLR = (1 << Num); /* Clear INT TYPE bit */ + CMSDK_GPIO->INTPOLCLR = (1 << Num); /* Clear INT POLarity bit */ + } + +/** + * + * @param *CMSDK_GPIO GPIO Pointer + * @param Num The pin number for which to set the Interrupt type + * @return none + * + * @brief Changes the interrupt type for the specified pin to a falling edge interrupt. This function is thread safe. + */ + + void CMSDK_gpio_SetIntFallingEdge(CMSDK_GPIO_TypeDef *CMSDK_GPIO, uint32_t Num) + { + CMSDK_GPIO->INTTYPESET = (1 << Num); /* Set INT TYPE bit */ + CMSDK_GPIO->INTPOLCLR = (1 << Num); /* Clear INT POLarity bit */ + } + +/** + * + * @param *CMSDK_GPIO GPIO Pointer + * @param mask The output port mask + * @param value The value to output to the specified port + * @return none + * + * @brief Outputs the specified value on the desired port using the user defined mask to perform Masked access. + */ + + void CMSDK_gpio_MaskedWrite(CMSDK_GPIO_TypeDef *CMSDK_GPIO, uint32_t value, uint32_t mask) + { + CMSDK_GPIO->LB_MASKED[0x00FF & mask] = value; + CMSDK_GPIO->UB_MASKED[((0xFF00 & mask) >> 8)] = value; + } + diff --git a/Cortex-M0/nanosoc/software/cmsis/Device/ARM/CMSDK_CM0/Source/GCC/startup_CMSDK_CM0.s b/Cortex-M0/nanosoc/software/cmsis/Device/ARM/CMSDK_CM0/Source/GCC/startup_CMSDK_CM0.s new file mode 100644 index 0000000..b67683a --- /dev/null +++ b/Cortex-M0/nanosoc/software/cmsis/Device/ARM/CMSDK_CM0/Source/GCC/startup_CMSDK_CM0.s @@ -0,0 +1,270 @@ +/**************************************************************************//** + * @file startup_CMSDK_CM0.s + * @brief CMSIS Cortex-M0 Core Device Startup File for + * Device CMSDK_CM0 + * @version V3.01 + * @date 06. March 2012 + * + * @note Should use with GCC for ARM Embedded Processors + * Copyright (C) 2012 ARM Limited. All rights reserved. + * + * @par + * ARM Limited (ARM) is supplying this software for use with Cortex-M + * processor based microcontrollers. This file can be freely distributed + * within development tools that are supporting such ARM based processors. + * + * @par + * THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED + * OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. + * ARM SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR + * CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. + * + ******************************************************************************/ +/*****************************************************************************/ +/* startup_CMSDK_CM3.s: Startup file for CMSDK device series */ +/*****************************************************************************/ +/* Version: GNU Tools for ARM Embedded Processors */ +/*****************************************************************************/ + + + .syntax unified + .arch armv6-m + + .section .stack + .align 3 + +/* +// <h> Stack Configuration +// <o> Stack Size (in Bytes) <0x0-0xFFFFFFFF:8> +// </h> +*/ + + .section .stack + .align 3 +#ifdef __STACK_SIZE + .equ Stack_Size, __STACK_SIZE +#else + .equ Stack_Size, 0x200 +#endif + .globl __StackTop + .globl __StackLimit +__StackLimit: + .space Stack_Size + .size __StackLimit, . - __StackLimit +__StackTop: + .size __StackTop, . - __StackTop + + +/* +// <h> Heap Configuration +// <o> Heap Size (in Bytes) <0x0-0xFFFFFFFF:8> +// </h> +*/ + + .section .heap + .align 3 +#ifdef __HEAP_SIZE + .equ Heap_Size, __HEAP_SIZE +#else + .equ Heap_Size, 0 +#endif + .globl __HeapBase + .globl __HeapLimit +__HeapBase: + .if Heap_Size + .space Heap_Size + .endif + .size __HeapBase, . - __HeapBase +__HeapLimit: + .size __HeapLimit, . - __HeapLimit + + +/* Vector Table */ + + .section .isr_vector + .align 2 + .globl __isr_vector +__isr_vector: + .long __StackTop /* Top of Stack */ + .long Reset_Handler /* Reset Handler */ + .long NMI_Handler /* NMI Handler */ + .long HardFault_Handler /* Hard Fault Handler */ + .long 0 /* Reserved */ + .long 0 /* Reserved */ + .long 0 /* Reserved */ + .long 0 /* Reserved */ + .long 0 /* Reserved */ + .long 0 /* Reserved */ + .long 0 /* Reserved */ + .long SVC_Handler /* SVCall Handler */ + .long 0 /* Debug Monitor Handler */ + .long 0 /* Reserved */ + .long PendSV_Handler /* PendSV Handler */ + .long SysTick_Handler /* SysTick Handler */ + + /* External Interrupts */ + .long UARTRX0_Handler /* 16+ 0: UART 0 RX Handler */ + .long UARTTX0_Handler /* 16+ 1: UART 0 TX Handler */ + .long UARTRX1_Handler /* 16+ 2: UART 1 RX Handler */ + .long UARTTX1_Handler /* 16+ 3: UART 1 TX Handler */ + .long UARTRX2_Handler /* 16+ 4: UART 2 RX Handler */ + .long UARTTX2_Handler /* 16+ 5: UART 2 TX Handler */ + .long PORT0_COMB_Handler /* 16+ 6: GPIO Port 0 Combined Handler */ + .long PORT1_COMB_Handler /* 16+ 7: GPIO Port 1 Combined Handler */ + .long TIMER0_Handler /* 16+ 8: TIMER 0 handler */ + .long TIMER1_Handler /* 16+ 9: TIMER 1 handler */ + .long DUALTIMER_HANDLER /* 16+10: Dual timer 2 handler */ + .long 0 /* 16+11: Reserved */ + .long UARTOVF0_Handler /* 16+12: UART 0 Overflow Handler */ + .long UARTOVF1_Handler /* 16+13: UART 1 Overflow Handler */ + .long UARTOVF2_Handler /* 16+14: UART 2 Overflow Handler */ + .long DMA_Handler /* 16+15: DMA done + error Handler */ + .long PORT0_0_Handler /* 16+16: GPIO Port 0 pin 0 Handler */ + .long PORT0_1_Handler /* 16+17: GPIO Port 0 pin 1 Handler */ + .long PORT0_2_Handler /* 16+18: GPIO Port 0 pin 2 Handler */ + .long PORT0_3_Handler /* 16+19: GPIO Port 0 pin 3 Handler */ + .long PORT0_4_Handler /* 16+20: GPIO Port 0 pin 4 Handler */ + .long PORT0_5_Handler /* 16+21: GPIO Port 0 pin 5 Handler */ + .long PORT0_6_Handler /* 16+22: GPIO Port 0 pin 6 Handler */ + .long PORT0_7_Handler /* 16+23: GPIO Port 0 pin 7 Handler */ + .long PORT0_8_Handler /* 16+24: GPIO Port 0 pin 8 Handler */ + .long PORT0_9_Handler /* 16+25: GPIO Port 0 pin 9 Handler */ + .long PORT0_10_Handler /* 16+26: GPIO Port 0 pin 10 Handler */ + .long PORT0_11_Handler /* 16+27: GPIO Port 0 pin 11 Handler */ + .long PORT0_12_Handler /* 16+28: GPIO Port 0 pin 12 Handler */ + .long PORT0_13_Handler /* 16+29: GPIO Port 0 pin 13 Handler */ + .long PORT0_14_Handler /* 16+30: GPIO Port 0 pin 14 Handler */ + .long PORT0_15_Handler /* 16+31: GPIO Port 0 pin 15 Handler */ + + .size __isr_vector, . - __isr_vector + +/* Reset Handler */ + .text + .thumb + .thumb_func + .align 2 + .globl Reset_Handler + .type Reset_Handler, %function +Reset_Handler: +/* Loop to copy data from read only memory to RAM. The ranges + * of copy from/to are specified by following symbols evaluated in + * linker script. + * __etext: End of code section, i.e., begin of data sections to copy from. + * __data_start__/__data_end__: RAM address range that data should be + * copied to. Both must be aligned to 4 bytes boundary. */ + + ldr r1, =__etext + ldr r2, =__data_start__ + ldr r3, =__data_end__ + + subs r3, r2 + ble .LC1 +.LC0: + subs r3, #4 + ldr r0, [r1, r3] + str r0, [r2, r3] + bgt .LC0 +.LC1: + +#ifdef __STARTUP_CLEAR_BSS +/* This part of work usually is done in C library startup code. Otherwise, + * define this macro to enable it in this startup. + * + * Loop to zero out BSS section, which uses following symbols + * in linker script: + * __bss_start__: start of BSS section. Must align to 4 + * __bss_end__: end of BSS section. Must align to 4 + */ + ldr r1, =__bss_start__ + ldr r2, =__bss_end__ + + subs r2, r1 + ble .LC3 + + movs r0, 0 +.LC2: + str r0, [r1, r2] + subs r2, 4 + bge .LC2 +.LC3: +#endif /* __STARTUP_CLEAR_BSS */ + +#ifndef __NO_SYSTEM_INIT + /* bl SystemInit */ + ldr r0,=SystemInit + blx r0 +#endif + + bl _start + + .pool + .size Reset_Handler, . - Reset_Handler + +/* Macro to define default handlers. Default handler + * will be weak symbol and just dead loops. They can be + * overwritten by other handlers */ + .macro def_default_handler handler_name + .align 1 + .thumb_func + .weak \handler_name + .type \handler_name, %function +\handler_name : + b . + .size \handler_name, . - \handler_name + .endm + +/* System Exception Handlers */ + + def_default_handler NMI_Handler + def_default_handler HardFault_Handler + def_default_handler MemManage_Handler + def_default_handler BusFault_Handler + def_default_handler UsageFault_Handler + def_default_handler SVC_Handler + def_default_handler DebugMon_Handler + def_default_handler PendSV_Handler + def_default_handler SysTick_Handler + +/* IRQ Handlers */ + + def_default_handler UARTRX0_Handler + def_default_handler UARTTX0_Handler + def_default_handler UARTRX1_Handler + def_default_handler UARTTX1_Handler + def_default_handler UARTRX2_Handler + def_default_handler UARTTX2_Handler + def_default_handler PORT0_COMB_Handler + def_default_handler PORT1_COMB_Handler + def_default_handler TIMER0_Handler + def_default_handler TIMER1_Handler + def_default_handler DUALTIMER_HANDLER + def_default_handler UARTOVF0_Handler + def_default_handler UARTOVF1_Handler + def_default_handler UARTOVF2_Handler + def_default_handler DMA_Handler + def_default_handler PORT0_0_Handler + def_default_handler PORT0_1_Handler + def_default_handler PORT0_2_Handler + def_default_handler PORT0_3_Handler + def_default_handler PORT0_4_Handler + def_default_handler PORT0_5_Handler + def_default_handler PORT0_6_Handler + def_default_handler PORT0_7_Handler + def_default_handler PORT0_8_Handler + def_default_handler PORT0_9_Handler + def_default_handler PORT0_10_Handler + def_default_handler PORT0_11_Handler + def_default_handler PORT0_12_Handler + def_default_handler PORT0_13_Handler + def_default_handler PORT0_14_Handler + def_default_handler PORT0_15_Handler + + + /* + def_default_handler Default_Handler + .weak DEF_IRQHandler + .set DEF_IRQHandler, Default_Handler + */ + .end + diff --git a/Cortex-M0/nanosoc/software/cmsis/Device/ARM/CMSDK_CM0/Source/system_CMSDK_CM0.c b/Cortex-M0/nanosoc/software/cmsis/Device/ARM/CMSDK_CM0/Source/system_CMSDK_CM0.c new file mode 100644 index 0000000..9056bf4 --- /dev/null +++ b/Cortex-M0/nanosoc/software/cmsis/Device/ARM/CMSDK_CM0/Source/system_CMSDK_CM0.c @@ -0,0 +1,68 @@ +/**************************************************************************//** + * @file system_CMSDK_CM0.c + * @brief CMSIS Cortex-M0 Device Peripheral Access Layer Source File for + * Device CMSDK + * @version V3.01 + * @date 06. March 2012 + * + * @note + * Copyright (C) 2010-2012 ARM Limited. All rights reserved. + * + * @par + * ARM Limited (ARM) is supplying this software for use with Cortex-M + * processor based microcontrollers. This file can be freely distributed + * within development tools that are supporting such ARM based processors. + * + * @par + * THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED + * OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. + * ARM SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR + * CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. + * + ******************************************************************************/ + + +#include <stdint.h> +#include "CMSDK_CM0.h" + + +/*---------------------------------------------------------------------------- + DEFINES + *----------------------------------------------------------------------------*/ + +/*---------------------------------------------------------------------------- + Define clocks + *----------------------------------------------------------------------------*/ + +#define XTAL (100000000UL) /* Oscillator frequency */ + + +/*---------------------------------------------------------------------------- + Clock Variable definitions + *----------------------------------------------------------------------------*/ +uint32_t SystemFrequency = XTAL; /*!< System Clock Frequency (Core Clock) */ +uint32_t SystemCoreClock = XTAL; /*!< Processor Clock Frequency */ + + +/*---------------------------------------------------------------------------- + Clock functions + *----------------------------------------------------------------------------*/ +void SystemCoreClockUpdate (void) /* Get Core Clock Frequency */ +{ + SystemCoreClock = XTAL; +} + +/** + * Initialize the system + * + * @param none + * @return none + * + * @brief Setup the microcontroller system. + * Initialize the System. + */ +void SystemInit (void) +{ + SystemCoreClock = XTAL; +} diff --git a/Cortex-M0/nanosoc/software/common/bootloader/bootloader.c b/Cortex-M0/nanosoc/software/common/bootloader/bootloader.c new file mode 100644 index 0000000..fcebe2c --- /dev/null +++ b/Cortex-M0/nanosoc/software/common/bootloader/bootloader.c @@ -0,0 +1,142 @@ +//----------------------------------------------------------------------------- +// customised Cortex-M0 'nanosoc' controller +// A joint work commissioned on behalf of SoC Labs, under Arm Academic Access license. +// +// Contributors +// +// David Flynn (d.w.flynn@soton.ac.uk) +// +// Copyright � 2021-3, SoC Labs (www.soclabs.org) +//----------------------------------------------------------------------------- + +//----------------------------------------------------------------------------- +// The confidential and proprietary information contained in this file may +// only be used by a person authorised under and to the extent permitted +// by a subsisting licensing agreement from Arm Limited or its affiliates. +// +// (C) COPYRIGHT 2010-2013 Arm Limited or its affiliates. +// ALL RIGHTS RESERVED +// +// This entire notice must be reproduced on all copies of this file +// and copies of this file may only be made by a person if such person is +// permitted to do so under the terms of a subsisting license agreement +// from Arm Limited or its affiliates. +// +// SVN Information +// +// Checked In : $Date: 2017-10-10 15:55:38 +0100 (Tue, 10 Oct 2017) $ +// +// Revision : $Revision: 371321 $ +// +// Release Information : Cortex-M System Design Kit-r1p1-00rel0 +//----------------------------------------------------------------------------- +// + +// +// Simple boot loader +// - display a message that the boot loader is running +// - clear remap control (user flash accessible from address 0x0) +// - execute program from user flash +// + +#ifdef CORTEX_M0 +#include "CMSDK_CM0.h" +#endif +#ifdef CORTEX_M0PLUS +#include "CMSDK_CM0plus.h" +#endif +#ifdef CORTEX_M3 +#include "CMSDK_CM3.h" +#endif +#ifdef CORTEX_M4 +#include "CMSDK_CM4.h" +#endif + +void UartStdOutInit(void) +{ +// CMSDK_UART2->BAUDDIV = 16; +// CMSDK_UART2->CTRL = 0x41; // High speed test mode, TX only + CMSDK_UART2->BAUDDIV = 2080; //(20MHz/9600) + CMSDK_UART2->CTRL = 0x01; //TX only, standard UART + CMSDK_USRT2->CTRL = 0x01; //TX only, FT1248 USRT + CMSDK_GPIO1->ALTFUNCSET = (1<<5); + return; +} +// Output a character +unsigned char UartPutc(unsigned char my_ch) +{ +/// while ((CMSDK_UART2->STATE & 1)); // Wait if Transmit Holding register is full +/// CMSDK_UART2->DATA = my_ch; // write to transmit holding register +/// if ((CMSDK_USRT2->STATE & 1) == 0) + while ((CMSDK_USRT2->STATE & 1)); // Wait if Transmit Holding register is full + if ((CMSDK_USRT2->STATE & 1) == 0) + CMSDK_USRT2->DATA = my_ch; // write to transmit holding register + return (my_ch); +} +// Uart string output +void UartPuts(unsigned char * mytext) +{ + unsigned char CurrChar; + do { + CurrChar = *mytext; + if (CurrChar != (char) 0x0) { + UartPutc(CurrChar); // Normal data + } + *mytext++; + } while (CurrChar != 0); + return; +} +#if defined ( __CC_ARM ) +/* ARM RVDS or Keil MDK */ +__asm void FlashLoader_ASM(void) +{ + MOVS R0,#0 + LDR R1,[R0] ; Get initial MSP value + MOV SP, R1 + LDR R1,[R0, #4] ; Get initial PC value + BX R1 +} + +#else +/* ARM GCC */ +void FlashLoader_ASM(void) __attribute__((naked)); +void FlashLoader_ASM(void) +{ + __asm(" movs r0,#0\n" + " ldr r1,[r0]\n" /* Get initial MSP value */ + " mov sp, r1\n" + " ldr r1,[r0, #4]\n" /* Get initial PC value */ + " bx r1\n"); +} + +#endif + +void FlashLoader(void) +{ + if (CMSDK_SYSCON->REMAP==0) { + /* Remap is already cleared. Something has gone wrong. + Likely that the user is trying to run bootloader as a test, + which is not what this program is for. + */ + UartPuts("@Error: REMAP cleared\n"); + UartPutc(0x4); // Terminate simulation + while (1); + } + UartPuts("** Remap->RAM2\n"); // CMSDK boot loader\n"); + CMSDK_SYSCON->REMAP = 0; // Clear remap + __DSB(); + __ISB(); + + FlashLoader_ASM(); +}; + +int main (void) +{ + // UART init + UartStdOutInit(); + + UartPuts("\n\n\nSOCLABS: ARM Cortex-M0 nanosoc\n"); + FlashLoader(); + return 0; +} + diff --git a/Cortex-M0/nanosoc/software/common/debug_tests/debug_tests.c b/Cortex-M0/nanosoc/software/common/debug_tests/debug_tests.c new file mode 100644 index 0000000..88fc02e --- /dev/null +++ b/Cortex-M0/nanosoc/software/common/debug_tests/debug_tests.c @@ -0,0 +1,508 @@ +/* + *----------------------------------------------------------------------------- + * The confidential and proprietary information contained in this file may + * only be used by a person authorised under and to the extent permitted + * by a subsisting licensing agreement from Arm Limited or its affiliates. + * + * (C) COPYRIGHT 2010-2013 Arm Limited or its affiliates. + * ALL RIGHTS RESERVED + * + * This entire notice must be reproduced on all copies of this file + * and copies of this file may only be made by a person if such person is + * permitted to do so under the terms of a subsisting license agreement + * from Arm Limited or its affiliates. + * + * SVN Information + * + * Checked In : $Date: 2017-10-10 15:55:38 +0100 (Tue, 10 Oct 2017) $ + * + * Revision : $Revision: 371321 $ + * + * Release Information : Cortex-M System Design Kit-r1p1-00rel0 + *----------------------------------------------------------------------------- + */ + +//============================================================================== +// +// CORTEX-M System Design Kit Debug Test +// +//============================================================================== + + +// If DBG is present, this test checks: +// +// ID value check +// +// - Check some ID registers like CPUID, BASEADDRESS, +// +// WFI SLEEPDEEP, Debugger Wakeup +// +// - Check when processor in deep sleep mode, the debugger can wakeup +// the processor +// +// DAP Access +// +// - The test uses the debug tester to read and write to memory using +// Word, Halfword and Byte accesses. +// +// +// LOCKUP +// +// - The test enters the architected lock-up state by accessing faulting +// memory from within the HardFault handler. The debug tester checks +// that lockup has been entered and checks that the LOCKUP pin has been +// driven by reading the example MCU internal debug register. +// +// + + +#ifdef CORTEX_M0 +#include "CMSDK_CM0.h" +#include "core_cm0.h" + +#else +#ifdef CORTEX_M0PLUS +#include "CMSDK_CM0plus.h" +#include "core_cm0plus.h" + +#else +#ifdef CORTEX_M3 +#include "CMSDK_CM3.h" +#include "core_cm3.h" + +#else +#ifdef CORTEX_M4 +#include "CMSDK_CM4.h" +#include "core_cm4.h" + +#endif +#endif +#endif +#endif + +#include <stdio.h> +#include "uart_stdout.h" +#include "mcu_debugtester_interface.h" // For definition of interface to the debug tester +#include "CMSDK_driver.h" + + +#include "config_id.h" +#include "debug_tests.h" +#include "debugtester_functions.h" + + +/////////////////////////////////////////////////////////////////////// +// Global Variables to track test progress +/////////////////////////////////////////////////////////////////////// + +uint32_t Errors = 0; +volatile uint32_t ExpectHardFault = 0; +uint32_t HardFaultTaken = 0; + +typedef void (* FuncPtr)(void); + + +/////////////////////////////////////////////////////////////////////// +//Function prototype +/////////////////////////////////////////////////////////////////////// +void HardFault_Handler(void); + + +/////////////////////////////////////////////////////////////////////// +//Main code +/////////////////////////////////////////////////////////////////////// + +int main (void) +{ + + // UART init + UartStdOutInit(); + + // This test requires DBG to be present. + // If EXPECTED_DBG indicates that DBG is not present, this test will + // PASS to allow a clean test run. + + printf("%s - Debug Test\n", MCU_CPU_NAME); + + if(EXPECTED_DBG != 1) + { + puts("EXPECTED_DBG parameter set to 0\n** TEST SKIPPED **\n"); + UartEndSimulation(); // stop simulation + return 1; + } + else + { + + EnableDebugTester(); + + puts("Debug Test is now enabled\n"); + + ///////////////////////////////////////////////////////////////////////////// + // Initialise debug tester to correct protocol + ///////////////////////////////////////////////////////////////////////////// + //DAP must be power down when setting the interface mode + + puts("Setting debug interface mode\n"); + if(EXPECTED_JTAGnSW) + { + CallDebugTester(FnSetInterfaceJTAG); + } + else + { + CallDebugTester(FnSetInterfaceSW); + } + + puts("Debug Test interface set successfully\n"); + + + ///////////////////////////////////////////////////////////////////////////// + // Check DAP powerup + ///////////////////////////////////////////////////////////////////////////// + puts("Checking DAP powerup:\n"); + if (CallDebugTester (FnDAPPowerUp) == TEST_PASS ) + { + puts("\tPASS\n"); + } + else + { + Errors++; + puts("\tFAIL\n"); + } + + + ///////////////////////////////////////////////////////////////////////////// + // Check CPU ID + ///////////////////////////////////////////////////////////////////////////// + puts("Checking CPU ID:\n"); + + // Write CPUID address to stacktop + DEBUGTESTERDATA[0] = 0xE000ED00; + + // Call GetAPMem() + if( CallDebugTester(FnGetAPMem) == TEST_PASS ) + { + // Check returned value matches expected CPU ID + + if(DEBUGTESTERDATA[0] == MCU_CPU_ID_VALUE) + { + puts("\tPASS\n"); + } + else + { + Errors++; + printf("\tFAIL - Expected %x, got %x\n", MCU_CPU_ID_VALUE, DEBUGTESTERDATA[0]); + } + } + else + { + Errors++; + puts("\tFAIL\n"); + } + + + if (EXPECTED_SIMPLE_CHECK) + { + //Above check is enough + } + else + { + //Complex check start here + + ///////////////////////////////////////////////////////////////////////////// + // Check DP ID + ///////////////////////////////////////////////////////////////////////////// + puts("Checking DP ID:\n"); + + DEBUGTESTERDATA[0] = 0x0; //DPIDR + + if (CallDebugTester (FnGetDPReg) == TEST_PASS ) + { + if(DEBUGTESTERDATA[0] == MCU_DP_IDR_VALUE) + { + puts("\tPASS\n"); + } + else + { + Errors++; + printf("\tFAIL - Expected %x, got %x\n", MCU_DP_IDR_VALUE, DEBUGTESTERDATA[0]); + } + } + else + { + Errors++; + puts("\tFAIL\n"); + } + + ///////////////////////////////////////////////////////////////////////////// + // Check AP ID + ///////////////////////////////////////////////////////////////////////////// + + puts("Checking AP ID:\n"); + + DEBUGTESTERDATA[0] = 0xFC; //APIDR + + if (CallDebugTester (FnGetAPReg) == TEST_PASS ) + { + if(DEBUGTESTERDATA[0] == MCU_AP_IDR_VALUE) + { + puts("\tPASS\n"); + } + else + { + Errors++; + printf("\tFAIL - Expected %x, got %x\n", MCU_AP_IDR_VALUE, DEBUGTESTERDATA[0]); + } + } + else + { + Errors++; + puts("\tFAIL\n"); + } + + + ///////////////////////////////////////////////////////////////////////////// + // Check BASE + ///////////////////////////////////////////////////////////////////////////// + puts("Checking BASE:\n"); + + DEBUGTESTERDATA[0] = 0xF8; //APBASE + + if (CallDebugTester (FnGetAPReg) == TEST_PASS ) + { + if(DEBUGTESTERDATA[0] == MCU_AP_BASE_VALUE) + { + puts("\tPASS\n"); + } + else + { + Errors++; + printf("\tFAIL - Expected %x, got %x\n", MCU_AP_BASE_VALUE, DEBUGTESTERDATA[0]); + } + } + else + { + Errors++; + puts("\tFAIL\n"); + } + + + ///////////////////////////////////////////////////////////////////////////// + // WFI SLEEPDEEP, Debugger Wakeup + ///////////////////////////////////////////////////////////////////////////// + puts("WFI SLEEPDEEP, Debugger Wakeup:\n"); + // Clear data value + DEBUGTESTERDATA[0] = 0; + // Ensure we SLEEPDEEP - SLEEPDEEP should be set + SET_SLEEP_DEEP(); + + // Wakeup will be due to the debugger + StartDebugTester(FnConnectWakeUnhalt); + + // Wait For Interrupt loop + while(DEBUGTESTERDATA[0] == 0) + { + __WFI(); + __ISB(); + } + + if(CheckDebugTester() == TEST_PASS) + { + puts("\tPASS\n"); + } + else + { + Errors++; + puts("\tFAIL\n"); + } + + + ///////////////////////////////////////////////////////////////////////////// + // DAP Access + // + // Check Word, Halfword and Byte accesses to memory + // via the DAP, using the debug tester. + ///////////////////////////////////////////////////////////////////////////// + + puts("DAP Access:\n"); + + DEBUGTESTERDATA[0] = 0; + + if( CallDebugTester(FnDAPAccess) == TEST_PASS ) + { + // Check returned value from debug tester + puts("DAP Access: Test pass, checking returned values ....\n"); + printf("After testing: DEBUGTESTERDATA[0] == %x :\n",DEBUGTESTERDATA[0] ); + puts("\tWORD: "); + + if( (DEBUGTESTERDATA[0]) & 0x1 ) + { + puts("\tPASS\n"); + } + else + { + Errors++; + puts("\tFAIL\n"); + } + + puts("\tHALFWORD: "); + + if( (DEBUGTESTERDATA[0]) & 0x2 ) + { + puts("\tPASS\n"); + } + else + { + Errors++; + puts("\tFAIL\n"); + } + + puts("\tBYTE: "); + + if( (DEBUGTESTERDATA[0]) & 0x4 ) + { + puts("\tPASS\n"); + } + else + { + Errors++; + puts("\tFAIL\n"); + } + + } + else + { + Errors++; + puts("\tFAIL\n"); + } + + // Clear data value + DEBUGTESTERDATA[0] = 0; + + + ///////////////////////////////////////////////////////////////////////////// + // LOCKUP + // + // Create LOCKUP scenario by accessing faulting instruction within the HardFault Handler + // We enter the HardFault Handler by accessing faulting instruction + // The debugger will check for lockup before allowing execution to resume. + ///////////////////////////////////////////////////////////////////////////// + + // Set up memory locations pointed to by FaultFunction + // to contain instruction code that will cause a hardware fault + // + + // HardwareFault is generated by accessing the undefined instruction + // so we can generate a fault like this: + // xxxxx (0xf123) // non-exist instruction like 0xf123 + // BX LR (0x4770) // + + // + // Set up a faulting version and a non faulting version. + // The debugger will copy the non-faulting version over the + // faulting version to enable the MCU to return to the function + // without incurring further faults. + // + + // Little Endian Encodings: + // FAULTLOAD 0xf123 //Non-exist instruction 0xf123 + // NONFAULT 0x0000 //NOP + // RETURN 0x4770 //BX LR + + if(EXPECTED_BE) + { + // Non Faulting + DEBUGTESTERDATA[2] = 0x00007047; + // Faulting + DEBUGTESTERDATA[3] = 0x23f17047; + } + else + { + // Non Faulting + DEBUGTESTERDATA[2] = 0x47700000; + // Faulting + DEBUGTESTERDATA[3] = 0x4770f123; + } + + + puts("LOCKUP:\n"); + + ExpectHardFault = 1; + + + // Start Debug Tester function that will get us out of Lockup + StartDebugTester(FnConnectCheckUnlockup); + + while(HardFaultTaken == 0) + { + ((FuncPtr) ( 1+(uint32_t)(&(DEBUGTESTERDATA[3]))) ) (); + } + + printf("HardFaultTaken = %x\n", HardFaultTaken); + + // Get here if we took HardFault -> LOCKUP -> Debugger returned us + + if( (CheckDebugTester() == TEST_PASS) && HardFaultTaken) + { + puts("\tPASS\n"); + } + else + { + Errors++; + puts("\tFAIL\n"); + } + + //Complex check end here + } + + ///////////////////////////////////////////////////////////////////////////// + // Check DAP powerdown + ///////////////////////////////////////////////////////////////////////////// + puts("Checking DAP power down:\n"); + if (CallDebugTester (FnDAPPowerDown) == TEST_PASS ) + { + puts("\tPASS\n"); + } + else + { + Errors++; + puts("\tFAIL\n"); + } + + + //Print final test result + if (Errors == 0) { + puts("** TEST PASSED **\n"); + } else { + printf("** TEST FAILED ** with Error code:%d\n", Errors); + } + + DisableDebugTester(); + + return Errors; + } +} + + + +///////////////////////////////////////////////////////////////////////////// +// Hardware Fault Handlers +///////////////////////////////////////////////////////////////////////////// +void HardFault_Handler(void) +{ + // The HardFault Handler is used for testing LOCKUP in this test + + if(ExpectHardFault == 1) + { + // Tell main() that we took the HardFault + HardFaultTaken = 1; + + // Access the undefined instruction to take core into LOCKUP + ((FuncPtr) (1+(uint32_t)(&(DEBUGTESTERDATA[3])))) (); //Branch to the undefined instruction address + //with the LSB of the instruction to be 1 + } + else + { + // Not expecting a fault + puts("Unexpected HardFault - FAIL\n"); + } +} diff --git a/Cortex-M0/nanosoc/software/common/debug_tests/debug_tests.h b/Cortex-M0/nanosoc/software/common/debug_tests/debug_tests.h new file mode 100644 index 0000000..3c4602e --- /dev/null +++ b/Cortex-M0/nanosoc/software/common/debug_tests/debug_tests.h @@ -0,0 +1,83 @@ +//----------------------------------------------------------------------------- +// The confidential and proprietary information contained in this file may +// only be used by a person authorised under and to the extent permitted +// by a subsisting licensing agreement from Arm Limited or its affiliates. +// +// (C) COPYRIGHT 2010-2013 Arm Limited or its affiliates. +// ALL RIGHTS RESERVED +// +// This entire notice must be reproduced on all copies of this file +// and copies of this file may only be made by a person if such person is +// permitted to do so under the terms of a subsisting license agreement +// from Arm Limited or its affiliates. +// +// SVN Information +// +// Checked In : $Date: 2017-10-10 15:55:38 +0100 (Tue, 10 Oct 2017) $ +// +// Revision : $Revision: 371321 $ +// +// Release Information : Cortex-M System Design Kit-r1p1-00rel0 +//----------------------------------------------------------------------------- +// + +//============================================================================== +// Cortex-M0/M0+ Debug test header File +//============================================================================== + +#define TEST_PASS 0 +#define TEST_FAIL 1 + +//Test command sequence definition +#define DBG_ESCAPE 0x1B +#define DBG_CONNECT_ENABLE 0x11 +#define DBG_CONNECT_DISABLE 0x12 +#define DBG_SIM_STOP 0x4 + + +// GPIO0 bit allocation +// +// CM0_MCU GPIO0 -------------------------------------- Debug Tester +// +// GPIO[15] 7 <----------------------------------------< Running +// GPIO[14] 6 <----------------------------------------< Error +// GPIO[13] 5 >----------------------------------------> Function Strobe +// GPIO[12] 4 >----------------------------------------> Function Select bit 4 +// GPIO[11] 3 >----------------------------------------> Function Select bit 3 +// GPIO[10] 2 >----------------------------------------> Function Select bit 2 +// GPIO[9] 1 >----------------------------------------> Function Select bit 1 +// GPIO[8] 0 >----------------------------------------> Function Select bit 0 +// +#define DEBUG_BIT_LOC 8 //GPIO[8] is the least bit of Function Select +#define DEBUG_CMD 0x3f<<8 //GPIO [13:8] +#define DEBUG_STROBE 0x00002000 //GPIO [13] +#define DEBUG_ERROR 0x00004000 //GPIO [14] +#define DEBUG_RUNNING 0x00008000 //GPIO [15] + +// GPIO1[7] 7 +// GPIO1[6] 6 +// GPIO1[5] 5 +// GPIO1[4] 4 +// GPIO1[3] 3 +// GPIO1[2] 2 +// GPIO1[1] 1 +// GPIO1[0] 0 + + +// CM0 MCU's view of the memory shared with the debugtester +// (4 words above stack top) +// This macro uses the SP value from the vector table as stacktop +// The stacktop can not be set to the top of the memory. +#define DEBUGTESTERDATA ((volatile uint32_t *) *((uint32_t *) 0x0)) + + +// A convenient way to access the AHB Default Slave +// (1st word above top of RAM) +#define AHBDEFAULTSLAVE ((volatile uint32_t *) ((uint32_t) 0x20010000)) + + +//Function definition +// Ensure we SLEEPDEEP - SLEEPDEEP should be set +// SCR[2] = SLEEPDEEP +#define SET_SLEEP_DEEP() SCB->SCR |= SCB_SCR_SLEEPDEEP_Msk + diff --git a/Cortex-M0/nanosoc/software/common/demos/dualtimer_demo.c b/Cortex-M0/nanosoc/software/common/demos/dualtimer_demo.c new file mode 100644 index 0000000..2a69f5a --- /dev/null +++ b/Cortex-M0/nanosoc/software/common/demos/dualtimer_demo.c @@ -0,0 +1,877 @@ +/* + *----------------------------------------------------------------------------- + * The confidential and proprietary information contained in this file may + * only be used by a person authorised under and to the extent permitted + * by a subsisting licensing agreement from Arm Limited or its affiliates. + * + * (C) COPYRIGHT 2010-2013 Arm Limited or its affiliates. + * ALL RIGHTS RESERVED + * + * This entire notice must be reproduced on all copies of this file + * and copies of this file may only be made by a person if such person is + * permitted to do so under the terms of a subsisting license agreement + * from Arm Limited or its affiliates. + * + * SVN Information + * + * Checked In : $Date: 2017-10-10 15:55:38 +0100 (Tue, 10 Oct 2017) $ + * + * Revision : $Revision: 371321 $ + * + * Release Information : Cortex-M System Design Kit-r1p1-00rel0 + *----------------------------------------------------------------------------- + */ +/* + Dual timer demonstration + + This test demonstrate setting the dual timer in different modes/ + Since the execution speed of the program can be affected by memory speed + and hence result can change, the only checks in this program is the + occurrence of interrupts. +*/ + +#ifdef CORTEX_M0 +#include "CMSDK_CM0.h" +#endif + +#ifdef CORTEX_M0PLUS +#include "CMSDK_CM0plus.h" +#endif + +#ifdef CORTEX_M3 +#include "CMSDK_CM3.h" +#endif + +#ifdef CORTEX_M4 +#include "CMSDK_CM4.h" +#endif + +#include <stdio.h> +#include "uart_stdout.h" + +#define PRESCALE_1_1 0 +#define PRESCALE_1_16 1 +#define PRESCALE_1_256 2 +#define NO_IRQ 0 +#define USE_IRQ 1 + +/* Software variables for interrupt detection */ +volatile int dtimer_irq_expected; +volatile int dtimer1_irq_occurred; +volatile int dtimer2_irq_occurred; +volatile int dtimer_integration_test=0; + +/* Demonstration functions */ +void dualtimer_16_free_running_demo(CMSDK_DUALTIMER_SINGLE_TypeDef *CMSDK_DUALTIMERx); +void dualtimer_32_free_running_demo(CMSDK_DUALTIMER_SINGLE_TypeDef *CMSDK_DUALTIMERx); +void dualtimer_16_periodic_demo(CMSDK_DUALTIMER_SINGLE_TypeDef *CMSDK_DUALTIMERx); +void dualtimer_32_periodic_demo(CMSDK_DUALTIMER_SINGLE_TypeDef *CMSDK_DUALTIMERx); +void dualtimer_16_one_shot_demo(CMSDK_DUALTIMER_SINGLE_TypeDef *CMSDK_DUALTIMERx); +void dualtimer_32_one_shot_demo(CMSDK_DUALTIMER_SINGLE_TypeDef *CMSDK_DUALTIMERx); +int dualtimer_integration_test(void); +int dualtimer_id_check(void); + +/* Functions for setting up the dual timer */ + /* 16-bit free running mode */ +void dualtimer_setup_freerunning16(CMSDK_DUALTIMER_SINGLE_TypeDef *CMSDK_DUALTIMERx, + unsigned int cycle, unsigned int prescale, unsigned int interrupt); + /* 16-bit periodic mode */ +void dualtimer_setup_periodic16(CMSDK_DUALTIMER_SINGLE_TypeDef *CMSDK_DUALTIMERx, + unsigned int cycle, unsigned int prescale, unsigned int interrupt); + /* 16-bit free one shot mode */ +void dualtimer_setup_oneshot16(CMSDK_DUALTIMER_SINGLE_TypeDef *CMSDK_DUALTIMERx, + unsigned int cycle, unsigned int prescale, unsigned int interrupt); + /* 32-bit free running mode */ +void dualtimer_setup_freerunning32(CMSDK_DUALTIMER_SINGLE_TypeDef *CMSDK_DUALTIMERx, + unsigned int cycle, unsigned int prescale, unsigned int interrupt); + /* 32-bit periodic mode */ +void dualtimer_setup_periodic32(CMSDK_DUALTIMER_SINGLE_TypeDef *CMSDK_DUALTIMERx, + unsigned int cycle, unsigned int prescale, unsigned int interrupt); + /* 32-bit free one shot mode */ +void dualtimer_setup_oneshot32(CMSDK_DUALTIMER_SINGLE_TypeDef *CMSDK_DUALTIMERx, + unsigned int cycle, unsigned int prescale, unsigned int interrupt); + + /* Start a timer */ +void dualtimer_start(CMSDK_DUALTIMER_SINGLE_TypeDef *CMSDK_DUALTIMERx); + /* Stop a timer */ +void dualtimer_stop(CMSDK_DUALTIMER_SINGLE_TypeDef *CMSDK_DUALTIMERx); + /* Clear a timer interrupt request */ +void dualtimer_irq_clear(CMSDK_DUALTIMER_SINGLE_TypeDef *CMSDK_DUALTIMERx); + + /* Text buffer for displaying value */ +char text_buf[20]; +void int_to_hex(unsigned int value, char text[]); + +/* ----------------------------------------------------------------- */ +int main(void) +{ + // UART init + UartStdOutInit(); + + // Test banner message and revision number + puts("\nCortex Microcontroller System Design Kit - Dual Timer Demo - revision $Revision: 371321 $\n"); + + if (dualtimer_id_check()!=0) { + puts ("** TEST SKIPPED ** Dual timer not present.\n"); + UartEndSimulation(); + return 0;} + + puts ("\n--------------------------------"); + puts ("Timer 1"); + puts ("--------------------------------\n"); + + dualtimer_16_free_running_demo(CMSDK_DUALTIMER1); + dualtimer_16_periodic_demo(CMSDK_DUALTIMER1); + dualtimer_16_one_shot_demo(CMSDK_DUALTIMER1); + dualtimer_32_free_running_demo(CMSDK_DUALTIMER1); + dualtimer_32_periodic_demo(CMSDK_DUALTIMER1); + dualtimer_32_one_shot_demo(CMSDK_DUALTIMER1); + + puts ("\n--------------------------------"); + puts ("Timer 2"); + puts ("--------------------------------\n"); + + dualtimer_16_free_running_demo(CMSDK_DUALTIMER2); + dualtimer_16_periodic_demo(CMSDK_DUALTIMER2); + dualtimer_16_one_shot_demo(CMSDK_DUALTIMER2); + dualtimer_32_free_running_demo(CMSDK_DUALTIMER2); + dualtimer_32_periodic_demo(CMSDK_DUALTIMER2); + dualtimer_32_one_shot_demo(CMSDK_DUALTIMER2); + + puts ("\n--------------------------------"); + puts ("Integration test"); + puts ("--------------------------------\n"); + dualtimer_integration_test(); + + puts ("** TEST PASSED ** \n"); + UartEndSimulation(); + /* Simulation stops in UartEndSimulation */ + +} +/* ----------------------------------------------------------------- */ +/* Detect the ARM ID and part number to see if device is present */ +int dualtimer_id_check(void) +{ +unsigned char dualtimer_id; +#define HW32_REG(ADDRESS) (*((volatile unsigned long *)(ADDRESS))) +#define HW8_REG(ADDRESS) (*((volatile unsigned char *)(ADDRESS))) + + dualtimer_id = HW8_REG(CMSDK_DUALTIMER_BASE + 0xFE8) & 0x07; + + if ((HW32_REG(CMSDK_DUALTIMER_BASE + 0xFE0) != 0x23) || + (HW32_REG(CMSDK_DUALTIMER_BASE + 0xFE4) != 0xB8) || + (dualtimer_id != 0x03)) + return 1; /* part ID & ARM ID does not match dual timer */ + else + return 0; +} +/* ----------------------------------------------------------------- */ +void dualtimer_16_free_running_demo(CMSDK_DUALTIMER_SINGLE_TypeDef *CMSDK_DUALTIMERx) +{ + unsigned int read_value; + unsigned int i; + + /* Clear software variables for interrupt tests */ + dtimer_irq_expected = 0; + dtimer1_irq_occurred = 0; + dtimer2_irq_occurred = 0; + + /* ------------------------------------------------------------- */ + puts ("16-bit free running mode, prescale = 1:1, no interrupt"); + /* 16-bit Free running timer, 5000 cycles, prescale = 1:1, no interrupt */ + dualtimer_setup_freerunning16(CMSDK_DUALTIMERx, 5000, PRESCALE_1_1, NO_IRQ); + i=0; + while (i<10){ + read_value = CMSDK_DUALTIMERx->TimerValue; + /* Display value of timer */ + /* timing of printf can be very different between different toolchain. + Use puts instead */ + int_to_hex(read_value, &text_buf[0]); + puts(text_buf); + i++; + } + dualtimer_stop(CMSDK_DUALTIMERx); + /* ------------------------------------------------------------- */ + puts ("16-bit free running mode, prescale = 1:16, no interrupt"); + /* 16-bit Free running timer, 200 cycles, prescale = 1:16, no interrupt */ + dualtimer_setup_freerunning16(CMSDK_DUALTIMERx, 200, PRESCALE_1_16, NO_IRQ); + i=0; + while (i<10){ + read_value = CMSDK_DUALTIMERx->TimerValue; + /* Display value of timer */ + /* timing of printf can be very different between different toolchain. + Use puts instead */ + int_to_hex(read_value, &text_buf[0]); + puts(text_buf); + i++; + } + dualtimer_stop(CMSDK_DUALTIMERx); + /* ------------------------------------------------------------- */ + puts ("16-bit free running mode, prescale = 1:256, no interrupt"); + /* 16-bit Free running timer, 20 cycles, prescale = 1:256, no interrupt */ + dualtimer_setup_freerunning16(CMSDK_DUALTIMERx, 20, PRESCALE_1_256, NO_IRQ); + i=0; + while (i<10){ + read_value = CMSDK_DUALTIMERx->TimerValue; + /* Display value of timer */ + /* timing of printf can be very different between different toolchain. + Use puts instead */ + int_to_hex(read_value, &text_buf[0]); + puts(text_buf); + i++; + } + dualtimer_stop(CMSDK_DUALTIMERx); + /* ------------------------------------------------------------- */ + puts ("16-bit free running mode, prescale = 1:1, with interrupt"); + /* 16-bit Free running timer, 5000 cycles, prescale = 1:1, with interrupt */ + dtimer_irq_expected = 1; + NVIC_EnableIRQ(DUALTIMER_IRQn); + dualtimer_setup_freerunning16(CMSDK_DUALTIMERx, 5000, PRESCALE_1_1, USE_IRQ); + i=0; + while (i<1){ + /* Wait until timer interrupt take place */ + while ((dtimer1_irq_occurred + dtimer2_irq_occurred)==0); + dtimer1_irq_occurred = 0; + dtimer2_irq_occurred = 0; + puts (" IRQ"); + i++; + } + dualtimer_stop(CMSDK_DUALTIMERx); + NVIC_DisableIRQ(DUALTIMER_IRQn); + /* Clear software variables for interrupt tests */ + dtimer_irq_expected = 0; + dtimer1_irq_occurred = 0; + dtimer2_irq_occurred = 0; + +} +/* ----------------------------------------------------------------- */ +void dualtimer_32_free_running_demo(CMSDK_DUALTIMER_SINGLE_TypeDef *CMSDK_DUALTIMERx) +{ + unsigned int read_value; + unsigned int i; + + /* Clear software variables for interrupt tests */ + dtimer_irq_expected = 0; + dtimer1_irq_occurred = 0; + dtimer2_irq_occurred = 0; + + /* ------------------------------------------------------------- */ + puts ("32-bit free running mode, prescale = 1:1, no interrupt"); + /* 32-bit Free running timer, 5000 cycles, prescale = 1:1, no interrupt */ + dualtimer_setup_freerunning32(CMSDK_DUALTIMERx, 5000, PRESCALE_1_1, NO_IRQ); + i=0; + while (i<10){ + read_value = CMSDK_DUALTIMERx->TimerValue; + /* Display value of timer */ + /* timing of printf can be very different between different toolchain. + Use puts instead */ + int_to_hex(read_value, &text_buf[0]); + puts(text_buf); + i++; + } + dualtimer_stop(CMSDK_DUALTIMERx); + /* ------------------------------------------------------------- */ + puts ("32-bit free running mode, prescale = 1:16, no interrupt"); + /* 32-bit Free running timer, 200 cycles, prescale = 1:16, no interrupt */ + dualtimer_setup_freerunning32(CMSDK_DUALTIMERx, 200, PRESCALE_1_16, NO_IRQ); + i=0; + while (i<10){ + read_value = CMSDK_DUALTIMERx->TimerValue; + /* Display value of timer */ + /* timing of printf can be very different between different toolchain. + Use puts instead */ + int_to_hex(read_value, &text_buf[0]); + puts(text_buf); + i++; + } + dualtimer_stop(CMSDK_DUALTIMERx); + /* ------------------------------------------------------------- */ + puts ("32-bit free running mode, prescale = 1:256, no interrupt"); + /* 32-bit Free running timer, 20 cycles, prescale = 1:256, no interrupt */ + dualtimer_setup_freerunning32(CMSDK_DUALTIMERx, 20, PRESCALE_1_256, NO_IRQ); + i=0; + while (i<10){ + read_value = CMSDK_DUALTIMERx->TimerValue; + /* Display value of timer */ + /* timing of printf can be very different between different toolchain. + Use puts instead */ + int_to_hex(read_value, &text_buf[0]); + puts(text_buf); + i++; + } + dualtimer_stop(CMSDK_DUALTIMERx); + /* ------------------------------------------------------------- */ + puts ("32-bit free running mode, prescale = 1:1, with interrupt"); + /* 32-bit Free running timer, 5000 cycles, prescale = 1:1, with interrupt */ + dtimer_irq_expected = 1; + NVIC_EnableIRQ(DUALTIMER_IRQn); + dualtimer_setup_freerunning32(CMSDK_DUALTIMERx, 5000, PRESCALE_1_1, USE_IRQ); + i=0; + while (i<1){ + /* Wait until timer interrupt take place */ + while ((dtimer1_irq_occurred + dtimer2_irq_occurred)==0); + dtimer1_irq_occurred = 0; + dtimer2_irq_occurred = 0; + puts (" IRQ"); + i++; + } + dualtimer_stop(CMSDK_DUALTIMERx); + NVIC_DisableIRQ(DUALTIMER_IRQn); + /* Clear software variables for interrupt tests */ + dtimer_irq_expected = 0; + dtimer1_irq_occurred = 0; + dtimer2_irq_occurred = 0; + +} +/* ----------------------------------------------------------------- */ +void dualtimer_16_periodic_demo(CMSDK_DUALTIMER_SINGLE_TypeDef *CMSDK_DUALTIMERx) +{ + unsigned int read_value; + unsigned int i; + + /* Clear software variables for interrupt tests */ + dtimer_irq_expected = 0; + dtimer1_irq_occurred = 0; + dtimer2_irq_occurred = 0; + + /* ------------------------------------------------------------- */ + puts ("16-bit periodic mode, prescale = 1:1, no interrupt"); + /* 16-bit periodic timer, 1000 cycles, prescale = 1:1, no interrupt */ + dualtimer_setup_periodic16(CMSDK_DUALTIMERx, 1000, PRESCALE_1_1, NO_IRQ); + i=0; + while (i<10){ + read_value = CMSDK_DUALTIMERx->TimerValue; + /* Display value of timer */ + /* timing of printf can be very different between different toolchain. + Use puts instead */ + int_to_hex(read_value, &text_buf[0]); + puts(text_buf); + i++; + } + dualtimer_stop(CMSDK_DUALTIMERx); + /* ------------------------------------------------------------- */ + puts ("16-bit periodic mode, prescale = 1:16, no interrupt"); + /* 16-bit periodic timer, 200 cycles, prescale = 1:16, no interrupt */ + dualtimer_setup_periodic16(CMSDK_DUALTIMERx, 200, PRESCALE_1_16, NO_IRQ); + i=0; + while (i<10){ + read_value = CMSDK_DUALTIMERx->TimerValue; + /* Display value of timer */ + /* timing of printf can be very different between different toolchain. + Use puts instead */ + int_to_hex(read_value, &text_buf[0]); + puts(text_buf); + i++; + } + dualtimer_stop(CMSDK_DUALTIMERx); + /* ------------------------------------------------------------- */ + puts ("16-bit periodic mode, prescale = 1:256, no interrupt"); + /* 16-bit periodic timer, 20 cycles, prescale = 1:256, no interrupt */ + dualtimer_setup_periodic16(CMSDK_DUALTIMERx, 20, PRESCALE_1_256, NO_IRQ); + i=0; + while (i<10){ + read_value = CMSDK_DUALTIMERx->TimerValue; + /* Display value of timer */ + /* timing of printf can be very different between different toolchain. + Use puts instead */ + int_to_hex(read_value, &text_buf[0]); + puts(text_buf); + i++; + } + dualtimer_stop(CMSDK_DUALTIMERx); + /* ------------------------------------------------------------- */ + puts ("16-bit periodic mode, prescale = 1:1, with interrupt x4"); + /* 16-bit periodic timer, 3000 cycles, prescale = 1:1, with interrupt */ + dtimer_irq_expected = 1; + NVIC_EnableIRQ(DUALTIMER_IRQn); + dualtimer_setup_periodic16(CMSDK_DUALTIMERx, 3000, PRESCALE_1_1, USE_IRQ); + i=0; + while (i<4){ + /* Wait until timer interrupt take place */ + while ((dtimer1_irq_occurred + dtimer2_irq_occurred)==0); + dtimer1_irq_occurred = 0; + dtimer2_irq_occurred = 0; + puts (" IRQ"); + i++; + } + dualtimer_stop(CMSDK_DUALTIMERx); + NVIC_DisableIRQ(DUALTIMER_IRQn); + /* Clear software variables for interrupt tests */ + dtimer_irq_expected = 0; + dtimer1_irq_occurred = 0; + dtimer2_irq_occurred = 0; + +} +/* ----------------------------------------------------------------- */ +void dualtimer_32_periodic_demo(CMSDK_DUALTIMER_SINGLE_TypeDef *CMSDK_DUALTIMERx) +{ + unsigned int read_value; + unsigned int i; + + /* Clear software variables for interrupt tests */ + dtimer_irq_expected = 0; + dtimer1_irq_occurred = 0; + dtimer2_irq_occurred = 0; + + /* ------------------------------------------------------------- */ + puts ("32-bit periodic mode, prescale = 1:1, no interrupt"); + /* 32-bit periodic timer, 1000 cycles, prescale = 1:1, no interrupt */ + dualtimer_setup_periodic32(CMSDK_DUALTIMERx, 1000, PRESCALE_1_1, NO_IRQ); + i=0; + while (i<10){ + read_value = CMSDK_DUALTIMERx->TimerValue; + /* Display value of timer */ + /* timing of printf can be very different between different toolchain. + Use puts instead */ + int_to_hex(read_value, &text_buf[0]); + puts(text_buf); + i++; + } + dualtimer_stop(CMSDK_DUALTIMERx); + /* ------------------------------------------------------------- */ + puts ("32-bit periodic mode, prescale = 1:16, no interrupt"); + /* 32-bit periodic timer, 200 cycles, prescale = 1:16, no interrupt */ + dualtimer_setup_periodic32(CMSDK_DUALTIMERx, 200, PRESCALE_1_16, NO_IRQ); + i=0; + while (i<10){ + read_value = CMSDK_DUALTIMERx->TimerValue; + /* Display value of timer */ + /* timing of printf can be very different between different toolchain. + Use puts instead */ + int_to_hex(read_value, &text_buf[0]); + puts(text_buf); + i++; + } + dualtimer_stop(CMSDK_DUALTIMERx); + /* ------------------------------------------------------------- */ + puts ("32-bit periodic mode, prescale = 1:256, no interrupt"); + /* 32-bit periodic timer, 20 cycles, prescale = 1:256, no interrupt */ + dualtimer_setup_periodic32(CMSDK_DUALTIMERx, 20, PRESCALE_1_256, NO_IRQ); + i=0; + while (i<10){ + read_value = CMSDK_DUALTIMERx->TimerValue; + /* timing of printf can be very different between different toolchain. + Use puts instead */ + int_to_hex(read_value, &text_buf[0]); + puts(text_buf); + i++; + } + dualtimer_stop(CMSDK_DUALTIMERx); + /* ------------------------------------------------------------- */ + puts ("32-bit periodic mode, prescale = 1:1, with interrupt x4"); + /* 16-bit periodic timer, 3000 cycles, prescale = 1:1, with interrupt */ + dtimer_irq_expected = 1; + NVIC_EnableIRQ(DUALTIMER_IRQn); + dualtimer_setup_periodic32(CMSDK_DUALTIMERx, 3000, PRESCALE_1_1, USE_IRQ); + i=0; + while (i<4){ + /* Wait until timer interrupt take place */ + while ((dtimer1_irq_occurred + dtimer2_irq_occurred)==0); + dtimer1_irq_occurred = 0; + dtimer2_irq_occurred = 0; + puts (" IRQ"); + i++; + } + dualtimer_stop(CMSDK_DUALTIMERx); + NVIC_DisableIRQ(DUALTIMER_IRQn); + /* Clear software variables for interrupt tests */ + dtimer_irq_expected = 0; + dtimer1_irq_occurred = 0; + dtimer2_irq_occurred = 0; + +} +/* ----------------------------------------------------------------- */ +void dualtimer_16_one_shot_demo(CMSDK_DUALTIMER_SINGLE_TypeDef *CMSDK_DUALTIMERx) +{ + unsigned int read_value; + unsigned int i; + + /* Clear software variables for interrupt tests */ + dtimer_irq_expected = 0; + dtimer1_irq_occurred = 0; + dtimer2_irq_occurred = 0; + + /* ------------------------------------------------------------- */ + puts ("16-bit one shot mode, prescale = 1:1, no interrupt"); + /* 16-bit one shot timer, 2000 cycles, prescale = 1:1, no interrupt */ + dualtimer_setup_oneshot16(CMSDK_DUALTIMERx, 2000, PRESCALE_1_1, NO_IRQ); + i=0; + while (i<10){ + read_value = CMSDK_DUALTIMERx->TimerValue; + /* Display value of timer */ + /* timing of printf can be very different between different toolchain. + Use puts instead */ + int_to_hex(read_value, &text_buf[0]); + puts(text_buf); + i++; + } + dualtimer_stop(CMSDK_DUALTIMERx); + /* ------------------------------------------------------------- */ + puts ("16-bit one shot mode, prescale = 1:16, no interrupt"); + /* 16-bit one shot timer, 100 cycles, prescale = 1:16, no interrupt */ + dualtimer_setup_oneshot16(CMSDK_DUALTIMERx, 100, PRESCALE_1_16, NO_IRQ); + i=0; + while (i<10){ + read_value = CMSDK_DUALTIMERx->TimerValue; + /* Display value of timer */ + /* timing of printf can be very different between different toolchain. + Use puts instead */ + int_to_hex(read_value, &text_buf[0]); + puts(text_buf); + i++; + } + dualtimer_stop(CMSDK_DUALTIMERx); + /* ------------------------------------------------------------- */ + puts ("16-bit one shot mode, prescale = 1:1, with interrupt"); + /* 16-bit one shot timer, 3000 cycles, prescale = 1:1, with interrupt */ + dtimer_irq_expected = 1; + NVIC_EnableIRQ(DUALTIMER_IRQn); + dualtimer_setup_oneshot16(CMSDK_DUALTIMERx, 3000, PRESCALE_1_1, USE_IRQ); + i=0; + while (i<1){ + /* Wait until timer interrupt take place */ + while ((dtimer1_irq_occurred + dtimer2_irq_occurred)==0); + dtimer1_irq_occurred = 0; + dtimer2_irq_occurred = 0; + puts (" IRQ"); + i++; + } + dualtimer_stop(CMSDK_DUALTIMERx); + NVIC_DisableIRQ(DUALTIMER_IRQn); + /* Clear software variables for interrupt tests */ + dtimer_irq_expected = 0; + dtimer1_irq_occurred = 0; + dtimer2_irq_occurred = 0; + +} +/* ----------------------------------------------------------------- */ +void dualtimer_32_one_shot_demo(CMSDK_DUALTIMER_SINGLE_TypeDef *CMSDK_DUALTIMERx) +{ + unsigned int read_value; + unsigned int i; + + /* Clear software variables for interrupt tests */ + dtimer_irq_expected = 0; + dtimer1_irq_occurred = 0; + dtimer2_irq_occurred = 0; + + /* ------------------------------------------------------------- */ + puts ("32-bit one shot mode, prescale = 1:1, no interrupt"); + /* 32-bit one shot timer, 2000 cycles, prescale = 1:1, no interrupt */ + dualtimer_setup_oneshot32(CMSDK_DUALTIMERx, 2000, PRESCALE_1_1, NO_IRQ); + i=0; + while (i<10){ + read_value = CMSDK_DUALTIMERx->TimerValue; + /* Display value of timer */ + /* timing of printf can be very different between different toolchain. + Use puts instead */ + int_to_hex(read_value, &text_buf[0]); + puts(text_buf); + i++; + } + dualtimer_stop(CMSDK_DUALTIMERx); + /* ------------------------------------------------------------- */ + puts ("32-bit one shot mode, prescale = 1:16, no interrupt"); + /* 32-bit one shot timer, 100 cycles, prescale = 1:16, no interrupt */ + dualtimer_setup_oneshot32(CMSDK_DUALTIMERx, 100, PRESCALE_1_16, NO_IRQ); + i=0; + while (i<10){ + read_value = CMSDK_DUALTIMERx->TimerValue; + /* Display value of timer */ + /* timing of printf can be very different between different toolchain. + Use puts instead */ + int_to_hex(read_value, &text_buf[0]); + puts(text_buf); + i++; + } + dualtimer_stop(CMSDK_DUALTIMERx); + /* ------------------------------------------------------------- */ + puts ("32-bit one shot mode, prescale = 1:1, with interrupt"); + /* 32-bit one shot timer, 3000 cycles, prescale = 1:1, with interrupt */ + dtimer_irq_expected = 1; + NVIC_EnableIRQ(DUALTIMER_IRQn); + dualtimer_setup_oneshot32(CMSDK_DUALTIMERx, 3000, PRESCALE_1_1, USE_IRQ); + i=0; + while (i<1){ + /* Wait until timer interrupt take place */ + while ((dtimer1_irq_occurred + dtimer2_irq_occurred)==0); + dtimer1_irq_occurred = 0; + dtimer2_irq_occurred = 0; + puts (" IRQ"); + i++; + } + dualtimer_stop(CMSDK_DUALTIMERx); + NVIC_DisableIRQ(DUALTIMER_IRQn); + /* Clear software variables for interrupt tests */ + dtimer_irq_expected = 0; + dtimer1_irq_occurred = 0; + dtimer2_irq_occurred = 0; + +} + + +/* ----------------------------------------------------------------- */ +/* Interrupt handler for dual timer */ +void DUALTIMER_HANDLER(void) +{ +if (dtimer_integration_test==0) { /* Normal operation mode */ + /* The Dual Timer interrupt handler are shared by the two timers */ + if (CMSDK_DUALTIMER1->TimerMIS != 0){ + dualtimer_irq_clear(CMSDK_DUALTIMER1); + dtimer1_irq_occurred++; + if (dtimer_irq_expected==0) { + puts("ERROR: Unexpected dual timer 1 IRQ"); + UartEndSimulation(); /* Simulation stops in UartEndSimulation */ + } /* end if (dtimer1_irq_expected==0) */ + } /* end if (CMSDK_DUALTIMER1->TimerMIS != 0) */ + if (CMSDK_DUALTIMER2->TimerMIS != 0){ + dualtimer_irq_clear(CMSDK_DUALTIMER2); + dtimer2_irq_occurred++; + if (dtimer_irq_expected==0) { + puts("ERROR: Unexpected dual timer 2 IRQ"); + UartEndSimulation(); /* Simulation stops in UartEndSimulation */ + } /* end if (dtimer2_irq_expected==0) */ + } /* end if (CMSDK_DUALTIMER2->TimerMIS != 0) */ + } +else { /* Integration test mode */ + /* Cannot tell which timer interrupt is asserted because + ITOP is write only and both timer shared the same interrupt. + So increment both variables. */ + CMSDK_DUALTIMER->ITOP=0; + dtimer1_irq_occurred++; + dtimer2_irq_occurred++; + puts (" [Dualtimer interrupt triggered]"); + } +} + +/* ----------------------------------------------------------------- */ +/* Functions for setting up the dual timer */ + + +/* 16-bit Free running timer mode */ +void dualtimer_setup_freerunning16(CMSDK_DUALTIMER_SINGLE_TypeDef *CMSDK_DUALTIMERx, + unsigned int cycle, unsigned int prescale, unsigned int interrupt) +{ + int ctrl_val; + CMSDK_DUALTIMERx->TimerControl = 0; /* Disable during programming */ + /* Previous timer activities might have trigger interrupt flag, + so need to clear it */ + dualtimer_irq_clear(CMSDK_DUALTIMERx); + CMSDK_DUALTIMERx->TimerLoad = cycle; + + ctrl_val = (prescale & 0x3) << CMSDK_DUALTIMER_CTRL_PRESCALE_Pos | + (interrupt & 0x1) << CMSDK_DUALTIMER_CTRL_INTEN_Pos | + CMSDK_DUALTIMER_CTRL_EN_Msk; + + CMSDK_DUALTIMERx->TimerControl = ctrl_val; +} + +/* 32-bit Free running timer mode */ +void dualtimer_setup_freerunning32(CMSDK_DUALTIMER_SINGLE_TypeDef *CMSDK_DUALTIMERx, + unsigned int cycle, unsigned int prescale, unsigned int interrupt) +{ + int ctrl_val; + CMSDK_DUALTIMERx->TimerControl = 0; /* Disable during programming */ + /* Previous timer activities might have trigger interrupt flag, + so need to clear it */ + dualtimer_irq_clear(CMSDK_DUALTIMERx); + CMSDK_DUALTIMERx->TimerLoad = cycle; + + ctrl_val = (prescale & 0x3) << CMSDK_DUALTIMER_CTRL_PRESCALE_Pos | + (interrupt & 0x1) << CMSDK_DUALTIMER_CTRL_INTEN_Pos | + CMSDK_DUALTIMER_CTRL_EN_Msk | + CMSDK_DUALTIMER_CTRL_SIZE_Msk; + + CMSDK_DUALTIMERx->TimerControl = ctrl_val; +} + +/* 16-bit Periodic timer mode */ +void dualtimer_setup_periodic16(CMSDK_DUALTIMER_SINGLE_TypeDef *CMSDK_DUALTIMERx, + unsigned int cycle, unsigned int prescale, unsigned int interrupt) +{ + int ctrl_val; + CMSDK_DUALTIMERx->TimerControl = 0; /* Disable during programming */ + /* Previous timer activities might have trigger interrupt flag, + so need to clear it */ + dualtimer_irq_clear(CMSDK_DUALTIMERx); + CMSDK_DUALTIMERx->TimerLoad = cycle; + + ctrl_val = (prescale & 0x3) << CMSDK_DUALTIMER_CTRL_PRESCALE_Pos | + (interrupt & 0x1) << CMSDK_DUALTIMER_CTRL_INTEN_Pos | + CMSDK_DUALTIMER_CTRL_EN_Msk | + CMSDK_DUALTIMER_CTRL_MODE_Msk; + + CMSDK_DUALTIMERx->TimerControl = ctrl_val; +} + +/* 32-bit Periodic timer mode */ +void dualtimer_setup_periodic32(CMSDK_DUALTIMER_SINGLE_TypeDef *CMSDK_DUALTIMERx, + unsigned int cycle, unsigned int prescale, unsigned int interrupt) +{ + int ctrl_val; + CMSDK_DUALTIMERx->TimerControl = 0; /* Disable during programming */ + /* Previous timer activities might have trigger interrupt flag, + so need to clear it */ + dualtimer_irq_clear(CMSDK_DUALTIMERx); + CMSDK_DUALTIMERx->TimerLoad = cycle; + + ctrl_val = (prescale & 0x3) << CMSDK_DUALTIMER_CTRL_PRESCALE_Pos | + (interrupt & 0x1) << CMSDK_DUALTIMER_CTRL_INTEN_Pos | + CMSDK_DUALTIMER_CTRL_EN_Msk | + CMSDK_DUALTIMER_CTRL_MODE_Msk| + CMSDK_DUALTIMER_CTRL_SIZE_Msk; + + CMSDK_DUALTIMERx->TimerControl = ctrl_val; +} + +/* 16-bit One shot timer mode */ +void dualtimer_setup_oneshot16(CMSDK_DUALTIMER_SINGLE_TypeDef *CMSDK_DUALTIMERx, + unsigned int cycle, unsigned int prescale, unsigned int interrupt) +{ + int ctrl_val; + CMSDK_DUALTIMERx->TimerControl = 0; /* Disable during programming */ + /* Previous timer activities might have trigger interrupt flag, + so need to clear it */ + dualtimer_irq_clear(CMSDK_DUALTIMERx); + CMSDK_DUALTIMERx->TimerLoad = cycle; + + ctrl_val = (prescale & 0x3) << CMSDK_DUALTIMER_CTRL_PRESCALE_Pos | + (interrupt & 0x1) << CMSDK_DUALTIMER_CTRL_INTEN_Pos | + CMSDK_DUALTIMER_CTRL_EN_Msk | + CMSDK_DUALTIMER_CTRL_MODE_Msk | + CMSDK_DUALTIMER_CTRL_ONESHOOT_Msk; + + CMSDK_DUALTIMERx->TimerControl = ctrl_val; +} + +/* 32-bit One shot timer mode */ +void dualtimer_setup_oneshot32(CMSDK_DUALTIMER_SINGLE_TypeDef *CMSDK_DUALTIMERx, + unsigned int cycle, unsigned int prescale, unsigned int interrupt) +{ + int ctrl_val; + CMSDK_DUALTIMERx->TimerControl = 0; /* Disable during programming */ + /* Previous timer activities might have trigger interrupt flag, + so need to clear it */ + dualtimer_irq_clear(CMSDK_DUALTIMERx); + CMSDK_DUALTIMERx->TimerLoad = cycle; + + ctrl_val = (prescale & 0x3) << CMSDK_DUALTIMER_CTRL_PRESCALE_Pos | + (interrupt & 0x1) << CMSDK_DUALTIMER_CTRL_INTEN_Pos | + CMSDK_DUALTIMER_CTRL_EN_Msk | + CMSDK_DUALTIMER_CTRL_MODE_Msk | + CMSDK_DUALTIMER_CTRL_ONESHOOT_Msk| + CMSDK_DUALTIMER_CTRL_SIZE_Msk; + + CMSDK_DUALTIMERx->TimerControl = ctrl_val; +} + +/* Demonstrate integration test feature in the dual timer */ +int dualtimer_integration_test(void) +{ + int result = 0; + /* Instead of triggering timer interrupt using normal timer operation, you can also + test the watchdog connection using integration test register. + ITCR - bit 0 enable integration test mode + ITOP - bit 0 enable timer 1 irq when integration test mode is enabled + bit 1 enable timer 2 irq when integration test mode is enabled + */ + + puts ("Integration test demo"); + dtimer_integration_test = 1; + + dtimer_irq_expected = 0; + dtimer1_irq_occurred = 0; + dtimer2_irq_occurred = 0; + CMSDK_DUALTIMER->ITOP=0; // Ensure interrupts are not asserted before start + CMSDK_DUALTIMER->ITCR=1; // Enable integration test mode + if (CMSDK_DUALTIMER->ITCR == 0) { + puts (" - Integration Test Control Register read error"); + result++; + } + else { + dtimer_integration_test = 1; + dtimer_irq_expected = 1; + NVIC_EnableIRQ(DUALTIMER_IRQn); + CMSDK_DUALTIMER->ITOP=1; // Set timer 1 interrupt + CMSDK_DUALTIMER->ITOP=0; // Deassert timer 1 interrupt + + if (dtimer1_irq_occurred == 0) { + puts (" - Integration Test operation 1 failed"); + result++; + } + dtimer1_irq_occurred = 0; /* clear variables */ + dtimer2_irq_occurred = 0; + + CMSDK_DUALTIMER->ITOP=2; // Set timer 2 interrupt + CMSDK_DUALTIMER->ITOP=0; // Deassert timer 2 interrupt + + if (dtimer2_irq_occurred == 0) { + puts (" - Integration Test operation 2 failed"); + result++; + } + CMSDK_DUALTIMER->ITCR = 0; // Disable integration test mode + if (CMSDK_DUALTIMER->ITCR != 0) { + puts (" - Integration Control clear error"); + result++; + } + } + dtimer_integration_test = 0; + NVIC_DisableIRQ(DUALTIMER_IRQn); + + if (result != 0) { + puts ("ERROR: Integration test failed\n"); + return (1); + } else { + puts ("Integration test completed successfully\n"); + return (0); + } + +} + + + +/* Start the timer */ +void dualtimer_start(CMSDK_DUALTIMER_SINGLE_TypeDef *CMSDK_DUALTIMERx) +{ + CMSDK_DUALTIMERx->TimerControl |= CMSDK_DUALTIMER_CTRL_EN_Msk; +} +/* Stop the timer */ +void dualtimer_stop(CMSDK_DUALTIMER_SINGLE_TypeDef *CMSDK_DUALTIMERx) +{ + CMSDK_DUALTIMERx->TimerControl &= ~CMSDK_DUALTIMER_CTRL_EN_Msk; +} +/* Clear the interrupt request */ +void dualtimer_irq_clear(CMSDK_DUALTIMER_SINGLE_TypeDef *CMSDK_DUALTIMERx) +{ + CMSDK_DUALTIMERx->TimerIntClr = 0; +} +/* Convert hex value into text in text buffer */ +void int_to_hex(unsigned int value, char text[]) +{ + int i=0; + int length=0; + unsigned int mask = 0xF0000000UL; + int nibble; + + /* extra space in front for indent */ + for (length=0;length<2; length++){ + text[length] =' '; /* space */ + } + length = 2; + /* Remove leading zero */ + while (((mask & value)==0) & (i!=7)) { + i ++; + mask = mask >> 4; + } + while (i!=8) { + nibble = (mask & value) >> ((7-i)*4); /* shift to LSB */ + if (nibble>9) text[length] = (char) (nibble+87); // Convert to ASCII a to f + else text[length] = (char) (nibble+48); // Convert to ASCII 0 to 9 + i++; + length++; + mask = mask>> 4; + } + text[length]=(char) 0; /* null termination */ + return; +} + diff --git a/Cortex-M0/nanosoc/software/common/demos/interrupt_demo.c b/Cortex-M0/nanosoc/software/common/demos/interrupt_demo.c new file mode 100644 index 0000000..d0598c0 --- /dev/null +++ b/Cortex-M0/nanosoc/software/common/demos/interrupt_demo.c @@ -0,0 +1,494 @@ +/* + *----------------------------------------------------------------------------- + * The confidential and proprietary information contained in this file may + * only be used by a person authorised under and to the extent permitted + * by a subsisting licensing agreement from Arm Limited or its affiliates. + * + * (C) COPYRIGHT 2010-2013 Arm Limited or its affiliates. + * ALL RIGHTS RESERVED + * + * This entire notice must be reproduced on all copies of this file + * and copies of this file may only be made by a person if such person is + * permitted to do so under the terms of a subsisting license agreement + * from Arm Limited or its affiliates. + * + * SVN Information + * + * Checked In : $Date: 2017-10-10 15:55:38 +0100 (Tue, 10 Oct 2017) $ + * + * Revision : $Revision: 371321 $ + * + * Release Information : Cortex-M System Design Kit-r1p1-00rel0 + *----------------------------------------------------------------------------- + */ +/* + Interrupt demonstration + + This test demonstrate interrupt generation using various peripherals. + - using simple timer + - using gpio with various configurations + - using uart + +*/ + +#ifdef CORTEX_M0 +#include "CMSDK_CM0.h" +#endif +#ifdef CORTEX_M0PLUS +#include "CMSDK_CM0plus.h" +#endif +#ifdef CORTEX_M3 +#include "CMSDK_CM3.h" +#endif +#ifdef CORTEX_M4 +#include "CMSDK_CM4.h" +#endif + +#include "uart_stdout.h" +#include "CMSDK_driver.h" +#include <stdio.h> + +// +// Global Variables to track test progress +// + +volatile uint32_t tx_count = 0; /*transmit counter */ +volatile uint32_t rx_count = 0; /*receive counter */ +const char str_tx[12] = "hello world"; /*transmission string*/ +const int uart_str_length = 11; +volatile char str_rx[12] ; /*string that is received*/ + +volatile int irq_triggered; /* Detected interrupt operation from GPIO IRQ handler */ +volatile uint32_t timer_stopped = 0; /* timer irq executed and stopped */ + +// +// Demonstrations +// + +int TimerExample(void); // Timer interrupt +int GPIOIntExample(void); // GPIO interrupt +void UartExample(void); // UART interrupt +int gpio0_id_check(void); // Detect GPIO 0 present +int timer0_id_check(void); // Detect Timer 0 present +int uart0_id_check(void); // Detect UART 0 present +int uart1_id_check(void); // Detect UART 1 present + +// ---------------------------------------------------------- +// Main program +// ---------------------------------------------------------- + +int main (void) +{ + // UART init + UartStdOutInit(); // Initialize UART2 for printf (retargeting) + + // Test banner message and revision number + puts("\nCortex Microcontroller System Design Kit - Interrupt Demo - revision $Revision: 371321 $\n"); + + if (timer0_id_check()!=0) puts ("Timer 0 not present. TimerExample skipped."); + else TimerExample(); // Timer 0 interrupt example + + if (gpio0_id_check()!=0) puts ("GPIO 0 not present. GPIOIntExample skipped."); + else GPIOIntExample(); // GPIO PORT0 interrupt example + + if ((uart0_id_check()!=0)||(uart1_id_check()!=0)) + puts ("UART 0 or UART 1 not present. UartExample skipped."); + else UartExample(); // Uart interrupt example + + puts ("** TEST PASSED ** \n"); + UartEndSimulation(); // send test end character to finish test + /* Simulation stops in UartEndSimulation */ + + return 0; +} + +// ---------------------------------------------------------- +// Timer demo +// ---------------------------------------------------------- +int TimerExample(void) +{ + puts("\n\n\n"); + puts("+*************************+"); + puts("* *"); + puts("* Timer0 Interrupt demo *"); + puts("* *"); + puts("+*************************+\n\n"); + + NVIC_ClearPendingIRQ(TIMER0_IRQn); + NVIC_EnableIRQ(TIMER0_IRQn); + + // initialise Timer0 with internal clock, with interrupt generation + CMSDK_timer_Init_IntClock(CMSDK_TIMER0, 0x100, 1); + + while (timer_stopped==0) { + __WFE(); // enter sleep + } + puts(" Timer test done"); // Banner + + return 0; +} +// ---------------------------------------------------------- +// UART demo +// ---------------------------------------------------------- + +/* Timer IRQ Driven UART Transmission of "hello world" + + - Program UART 0 to operate as transmit only, with transmit IRQ enabled + - Program UART 1 to operate as receive only, with receive IRQ enabled + - The first character of the "hello world" message is transmit + - The rest of the message transmission is handled by UART transmit IRQ, until + all characters are transmitted. + - The receive process is also handled by UART receive IRQ. + - A while loop is used to wait until both transmit and receive has completed the test + - When finished then print string received + */ + + +// ---------------------------------------------------------- +// UART interrupt test +// ---------------------------------------------------------- + +void UartExample(void) +{ + uint32_t transmission_complete = 0; /*transmission complete bool*/ + + puts("+*************************+"); + puts("* *"); + puts("* UART Interrupt demo *"); + puts("* *"); + puts("+*************************+\n\n"); + + CMSDK_gpio_SetAltFunc(CMSDK_GPIO1, 0x000F); //enable alt functions for UART transmission + + // Ensure Interrupt is not pending + + NVIC_ClearPendingIRQ(UARTTX0_IRQn); + NVIC_ClearPendingIRQ(UARTRX1_IRQn); + + // Enable Interrupts + + NVIC_EnableIRQ(UARTTX0_IRQn); + NVIC_EnableIRQ(UARTRX1_IRQn); + + /* Initialize UART in cross over configuration + uint32_t CMSDK_uart_init(CMSDK_UART_TypeDef *CMSDK_UART, + uint32_t divider, + uint32_t tx_en, + uint32_t rx_en, + uint32_t tx_irq_en, + uint32_t rx_irq_en, + uint32_t tx_ovrirq_en, + uint32_t rx_ovrirq_en) + */ + /* enable UARTs with selected baud rate + UART #0 - transmit + UART #1 - receive + */ + CMSDK_uart_init(CMSDK_UART0, 0x200, 1, 0, 1, 0, 0, 0); + CMSDK_uart_init(CMSDK_UART1, 0x200, 0, 1, 0, 1, 0, 0); + + rx_count = 0; + tx_count = 0; + + printf ("Transmit message : %s\n", str_tx); + + /* Start first character transfer */ + tx_count++; + CMSDK_uart_SendChar(CMSDK_UART0, str_tx[0]); // send the character + /* The rest of the transfers are handled by interrupts */ + + while(transmission_complete==0) // loop until transmission completed + { + + if ((tx_count==uart_str_length) && (rx_count==uart_str_length)) transmission_complete = 1; + } + + printf ("Received message : %s\n", str_rx); + + + NVIC_DisableIRQ(UARTTX0_IRQn); //disable both UART0 TX and UART1 RX IRQs + NVIC_DisableIRQ(UARTRX1_IRQn); + + return; +} + +// ---------------------------------------------------------- +// GPIO interrupt test +// ---------------------------------------------------------- +/* + GPIO interrupt example + + - Enable all pins as output + - Set DataOut to 0xA ready for a test of all IRQs + - Set pin0 as a High Level, pin1 as a Low Level, pin2 as a Rising Edge and pin3 as a Falling Edge, + then clear all pending IRQs + - enable the CMSDK GPIO interrupt for pins 0, 1, 2, 3. + - set Dataout to 0xB to test the high level interrupt on pin 0 + - if irq_triggered != 0 (set in ISR) then print message saying IRQ occurred and set irq_triggered = 0 + - else amend err_code + - set Dataout to 0x9 to test the low level interrupt on pin 1 + - if irq_triggered != 0 (set in ISR) then print message saying IRQ occurred and set irq_triggered = 0 + - else amend err_code + - set Dataout to 0xD to test the rising edge interrupt on pin 2 + - if irq_triggered != 0 (set in ISR) then print message saying IRQ occurred and set irq_triggered = 0 + - else amend err_code + - set Dataout to 0x5 to test the falling edge interrupt on pin 3 + - if irq_triggered != 0 (set in ISR) then print message saying IRQ occurred and set irq_triggered = 0 + - else amend err_code + - if test on all pins pass the test as a whole passes and return 0 to main + - else return an error and print error message +*/ +int GPIOIntExample(void) +{ + + int i = 0; + int irq_counter = 0; + int err_code = 0; + + puts("\n\n\n"); + puts("+*************************+"); + puts("* *"); + puts("* GPIO PORT0: Interrupt *"); + puts("* Example *"); + puts("* *"); + puts("+*************************+\n\n"); + + CMSDK_gpio_SetOutEnable(CMSDK_GPIO0, 0xFFFF); //set output enable to output on all ports of GPIO 0 + // By setting the port to output the pins are controllable by software + + CMSDK_GPIO0->DATAOUT = 0xA; // set current I/O port value + + CMSDK_gpio_SetIntHighLevel(CMSDK_GPIO0, 0); //set pin 0 to high level interrupts + CMSDK_gpio_SetIntLowLevel(CMSDK_GPIO0, 1); //set pin 1 to low level interrupts + CMSDK_gpio_SetIntRisingEdge(CMSDK_GPIO0, 2); //set pin 2 to rising edge interrupts + CMSDK_gpio_SetIntFallingEdge(CMSDK_GPIO0, 3); //set pin 3 to falling edge interrupts + + NVIC_ClearPendingIRQ(PORT0_0_IRQn); //clear all global NVIC PORT0 pending interrupts + NVIC_ClearPendingIRQ(PORT0_1_IRQn); + NVIC_ClearPendingIRQ(PORT0_2_IRQn); + NVIC_ClearPendingIRQ(PORT0_3_IRQn); + + NVIC_EnableIRQ(PORT0_0_IRQn); //enable NVIC interrupts on PORT0 + NVIC_EnableIRQ(PORT0_1_IRQn); + NVIC_EnableIRQ(PORT0_2_IRQn); + NVIC_EnableIRQ(PORT0_3_IRQn); + + if ((NVIC->ISER[0]>>PORT0_0_IRQn)!=0x0F) { // Cortex-M0 DesignStart only has 16 IRQ + printf("Not all of IRQ[%d to %d] are available.\nUse combined GPIO interrupt for test\n\n", + PORT0_0_IRQn,PORT0_3_IRQn); + NVIC_EnableIRQ(PORT0_ALL_IRQn); //enable combined NVIC interrupts on PORT0 + } + + + for(i = 0; i < 4; i++) CMSDK_gpio_SetIntEnable(CMSDK_GPIO0, i); //enable interrupts on pins 0 -3 + + CMSDK_GPIO0->DATAOUT = 0xB; // emulating high level input on pin 0. + + puts(" ...Test GPIO0[0]...\n"); + + if(irq_triggered){ //if irq flag set then print message else amend error code + puts(" High Level IRQ:\n Detected On Pin 0\n\n"); + irq_triggered = 0; + irq_counter++; + } + else err_code |= (1 << irq_counter); + + CMSDK_GPIO0->DATAOUT = 0x9; // emulating low level input on pin 1. + + puts(" ...Test GPIO0[1]...\n"); + + if(irq_triggered){ //if irq flag set then print message else amend error code + puts(" Low Level IRQ\n Detected On Pin 0\n\n"); + irq_triggered = 0; + irq_counter++; + } + else err_code |= (1 << 1); + + CMSDK_GPIO0->DATAOUT = 0xD; // emulating rising edge input on pin 2. + + puts(" ...Test GPIO0[2]...\n"); + + if(irq_triggered){ //if irq flag set then print message else amend error code + puts(" Rising Edge IRQ\n Detected On Pin 0\n\n"); + irq_triggered = 0; + irq_counter++; + } + else err_code |= (1 << 2); + + CMSDK_GPIO0->DATAOUT = 0x5; // emulating falling edge input on pin 3. + + puts(" ...Test GPIO0[3]...\n"); + + if(irq_triggered){ //if irq flag set then print message else amend error code + puts(" Falling Edge IRQ:\n Detected On Pin 0\n\n"); + irq_triggered = 0; + irq_counter++; + } + else err_code |= (1 << 3); + + /* check to see whether intstatus, for the specified pin, is 1, which corresponds to a rising edge interrupt */ + + if(irq_counter == 4){ + printf(" All %d IRQs Detected\n\n", i); + } + + + // print pass or fail message depending on the status of the test + + if(err_code == 0){ + puts("\n"); + puts(" +***********************+"); + puts(" * *"); + puts(" * GPIO 0 IRQ Tests *"); + puts(" * Passed Successfully *"); + puts(" * *"); + puts(" +***********************+\n"); + } + else{ + + /*if the port did not have 1 of each IRQs as expected then display error*/ + + printf("\n** TEST FAILED ** IRQ Tests Error Code: (0x%x\n", err_code); + } + + NVIC_DisableIRQ(PORT0_0_IRQn); //disable GPIO0 IRQ + NVIC_DisableIRQ(PORT0_1_IRQn); + NVIC_DisableIRQ(PORT0_2_IRQn); + NVIC_DisableIRQ(PORT0_3_IRQn); + NVIC_DisableIRQ(PORT0_ALL_IRQn); + return err_code; +} + +// ---------------------------------------------------------- +// Peripheral detection +// ---------------------------------------------------------- +/* Detect the part number to see if device is present */ + +int gpio0_id_check(void) +{ +#define HW32_REG(ADDRESS) (*((volatile unsigned long *)(ADDRESS))) +if ((HW32_REG(CMSDK_GPIO0_BASE + 0xFE0) != 0x20) || + (HW32_REG(CMSDK_GPIO0_BASE + 0xFE4) != 0xB8)) + return 1; /* part ID does not match */ +else + return 0; +} + +int timer0_id_check(void) +{ +if ((HW32_REG(CMSDK_TIMER0_BASE + 0xFE0) != 0x22) || + (HW32_REG(CMSDK_TIMER0_BASE + 0xFE4) != 0xB8)) + return 1; /* part ID does not match */ +else + return 0; +} + +int uart0_id_check(void) +{ +if ((HW32_REG(CMSDK_UART0_BASE + 0xFE0) != 0x21) || + (HW32_REG(CMSDK_UART0_BASE + 0xFE4) != 0xB8)) + return 1; /* part ID does not match */ +else + return 0; +} +int uart1_id_check(void) +{ +if ((HW32_REG(CMSDK_UART1_BASE + 0xFE0) != 0x21) || + (HW32_REG(CMSDK_UART1_BASE + 0xFE4) != 0xB8)) + return 1; /* part ID does not match */ +else + return 0; +} +// ---------------------------------------------------------- +// Handlers +// ---------------------------------------------------------- +// --------------------------------- +// UART 0 Interrupt service routines +// --------------------------------- +// + +void UARTTX0_Handler(void) +{ + CMSDK_uart_ClearTxIRQ(CMSDK_UART0); // clear TX IRQ + // If the message output is not finished, output next character + if (tx_count < uart_str_length) { + CMSDK_uart_SendChar(CMSDK_UART0,str_tx[tx_count]); + tx_count++; + } + +} + +// --------------------------------- +// UART 1 Interrupt service routines +// --------------------------------- + +void UARTRX1_Handler(void) +{ + CMSDK_uart_ClearRxIRQ(CMSDK_UART1); //clear RX IRQ + str_rx[rx_count]=CMSDK_uart_ReceiveChar(CMSDK_UART1); // Read data + rx_count++; +} + +// --------------------------------- +// Timer 0 Interrupt service routines +// --------------------------------- + +void TIMER0_Handler(void) +{ + timer_stopped = 1; // set timer stopped bool, so that + // system does not wait for another interrupt + CMSDK_timer_StopTimer(CMSDK_TIMER0); // stop timer + CMSDK_timer_ClearIRQ(CMSDK_TIMER0); // clear timer 0 IRQ + puts(" [Timer 0 IRQ]"); +} + +// --------------------------------- +// GPIO Port 0 Interrupt service routines +// --------------------------------- +// +void PORT0_0_Handler(void) +{ + irq_triggered = 1; /* high level */ + CMSDK_GPIO0->DATAOUT = 0xA; /* Deassert Port 0 pin 0 to 0 */ + CMSDK_gpio_IntClear(CMSDK_GPIO0, 0); //clear GPIO interrupt on pin N +} + +void PORT0_1_Handler(void) +{ + irq_triggered = 1; /*low level*/ + CMSDK_GPIO0->DATAOUT = 0xB; /* Deassert Port 0 pin 1 to 1 */ + CMSDK_gpio_IntClear(CMSDK_GPIO0, 1); //clear GPIO interrupt on pin N +} + +void PORT0_2_Handler(void) +{ + irq_triggered = 1; /*rising edge*/ + CMSDK_gpio_IntClear(CMSDK_GPIO0, 2); //clear GPIO interrupt on pin N +} + +void PORT0_3_Handler(void) +{ + irq_triggered = 1; /*falling edge*/ + CMSDK_gpio_IntClear(CMSDK_GPIO0, 3); //clear GPIO interrupt on pin N +} + +void PORT0_COMB_Handler(void) /* Combined handler */ +{ + irq_triggered = 1; + if (CMSDK_GPIO0->INTSTATUS & 0x01){ /* high level */ + CMSDK_GPIO0->DATAOUT = 0xA; /* Deassert Port 0 pin 0 to 0 */ + CMSDK_gpio_IntClear(CMSDK_GPIO0, 0); //clear GPIO interrupt on pin N + } + if (CMSDK_GPIO0->INTSTATUS & 0x02){ /* low level*/ + CMSDK_GPIO0->DATAOUT = 0xB; /* Deassert Port 0 pin 1 to 1 */ + CMSDK_gpio_IntClear(CMSDK_GPIO0, 1); //clear GPIO interrupt on pin N + } + if (CMSDK_GPIO0->INTSTATUS & 0x04){ /* rising edge*/ + CMSDK_gpio_IntClear(CMSDK_GPIO0, 2); //clear GPIO interrupt on pin N + } + if (CMSDK_GPIO0->INTSTATUS & 0x08){ /* falling edge*/ + CMSDK_gpio_IntClear(CMSDK_GPIO0, 3); //clear GPIO interrupt on pin N + } + return; +} + diff --git a/Cortex-M0/nanosoc/software/common/demos/self_reset_demo.c b/Cortex-M0/nanosoc/software/common/demos/self_reset_demo.c new file mode 100644 index 0000000..697b3ec --- /dev/null +++ b/Cortex-M0/nanosoc/software/common/demos/self_reset_demo.c @@ -0,0 +1,234 @@ +/* + *----------------------------------------------------------------------------- + * The confidential and proprietary information contained in this file may + * only be used by a person authorised under and to the extent permitted + * by a subsisting licensing agreement from Arm Limited or its affiliates. + * + * (C) COPYRIGHT 2010-2013 Arm Limited or its affiliates. + * ALL RIGHTS RESERVED + * + * This entire notice must be reproduced on all copies of this file + * and copies of this file may only be made by a person if such person is + * permitted to do so under the terms of a subsisting license agreement + * from Arm Limited or its affiliates. + * + * SVN Information + * + * Checked In : $Date: 2017-10-10 15:55:38 +0100 (Tue, 10 Oct 2017) $ + * + * Revision : $Revision: 371321 $ + * + * Release Information : Cortex-M System Design Kit-r1p1-00rel0 + *----------------------------------------------------------------------------- + */ + + /* Check self reset using SYSRESETREQ and LOCKUP reset */ + +#ifdef CORTEX_M0 +#include "CMSDK_CM0.h" +#endif + +#ifdef CORTEX_M0PLUS +#include "CMSDK_CM0plus.h" +#endif + +#ifdef CORTEX_M3 +#include "CMSDK_CM3.h" +#endif + +#ifdef CORTEX_M4 +#include "CMSDK_CM4.h" +#endif + +#include <stdio.h> +#include "uart_stdout.h" + +#define HW32_REG(ADDRESS) (*((volatile unsigned long *)(ADDRESS))) +#define BAD_ADDRESS 0xC0000001 + +void main_prog_part_1(void); /* Carry out SYSRESETREQ */ +void main_prog_part_2(void); /* Check reset info, carry out lockup reset */ +void main_prog_part_3(void); /* Check reset info */ +int sysctrl_id_check(void); + +/* + Test process: + - if system controller is not available, skip test + - check reset status, which should be 0 in the beginning of test, goto execute part 1 + - part 1 : Use System Reset Request function from CMSIS + - <system reset> + - Restarted, if system controller is not available, skip test + - check reset status, which should be 1 (SYSRESETREQ), goto execute part 2 + - clear reset status, and check reset status is cleared. + - enable automatic reset for lockup + - check the reset option register read back value is correct + - trigger hardfault by reading BAD_ADDRESS + - enter hardfault handler, and then trigger lock up by reading BAD_ADDRESS again + - <lockup -> system reset> + - Restarted, if system controller is not available, skip test + - check reset status, which should be 4 (Lockup reset), goto execute part 3 + - clear reset status, and check reset status is cleared. + - test completed , end test + +*/ + +/* ----------------------------------------------------------------- */ +/* Start of main code */ +int main (void) +{ + // UART init + UartStdOutInit(); + + // Test banner message and revision number + puts("\nCortex Microcontroller System Design Kit - Self Reset Demo - revision $Revision: 371321 $\n"); + + if (sysctrl_id_check()!=0) { + puts ("** TEST SKIPPED ** SysCtrl not present."); + UartEndSimulation(); + return 0;} + + puts("[System started]\n"); + /* Check CMSDK_SYSCON->RSTINFO Reset Information register */ + /* 0 = cold reset */ + /* 1 (bit 0) = reset from SYSRESETREQ */ + /* 2 (bit 1) = reset from Watchdog */ + /* 4 (bit 2) = reset from Lockup auto reset */ + if ((CMSDK_SYSCON->RSTINFO & CMSDK_SYSCON_RSTINFO_SYSRESETREQ_Msk) !=0) { + puts ("Restarted by SYSRESETREQ reset"); + main_prog_part_2(); /* Check result from part 1 and trigger reset using lockup reset */ + UartEndSimulation(); /* Should not get here. */ + } + else if ((CMSDK_SYSCON->RSTINFO & CMSDK_SYSCON_RSTINFO_LOCKUPRESET_Msk) !=0) { + puts ("Restarted by Lockup reset"); + main_prog_part_3(); /* Check result */ + UartEndSimulation(); /* Should not get here. Simulation stops in UartEndSimulation */ + while(1); + } + else if ((CMSDK_SYSCON->RSTINFO & CMSDK_SYSCON_RSTINFO_WDOGRESETREQ_Msk) !=0) { + puts ("Restarted by Watchdog reset"); + puts ("ERROR: Watchdog was not used in this test. Reset info register value incorrect.\n"); + UartEndSimulation(); /* Should not get here. Simulation stops in UartEndSimulation */ + } + else { + puts("Self Reset demo test\n"); + main_prog_part_1(); /* Trigger self reset */ + } + UartEndSimulation(); /* Should not get here. */ + /* Simulation stops in UartEndSimulation */ +} + +/* ----------------------------------------------------------------- */ +/* Use ID value to detect if the system controller is present */ +int sysctrl_id_check(void) +{ /* CMSDK SysCtrl part ID range from 826 to 829 */ +#define HW32_REG(ADDRESS) (*((volatile unsigned long *)(ADDRESS))) +if ((HW32_REG(CMSDK_SYSCTRL_BASE + 0xFE0) < 0x26) || + (HW32_REG(CMSDK_SYSCTRL_BASE + 0xFE0) > 0x29) || + (HW32_REG(CMSDK_SYSCTRL_BASE + 0xFE4) != 0xB8)) + return 1; /* part ID does not match */ +else + return 0; +} + +/* ----------------------------------------------------------------- */ +/* First part of the test program */ +void main_prog_part_1(void) +{ + puts("Using CMSIS function to generate self reset...\n"); + + NVIC_SystemReset(); + while(1); + +} + +/* ----------------------------------------------------------------- */ +/* Second part of the main test program - execute after SYSRESETREQ reset */ +void main_prog_part_2(void) +{ + int result=0; + unsigned int read_data; + + puts("- Self reset completed"); + read_data = CMSDK_SYSCON->RSTINFO; + printf (" SYSCON->RSTINFO = %x\n", read_data); + if (read_data != CMSDK_SYSCON_RSTINFO_SYSRESETREQ_Msk) result++; + puts("- Clear reset info"); + CMSDK_SYSCON->RSTINFO = CMSDK_SYSCON_RSTINFO_SYSRESETREQ_Msk; + read_data = CMSDK_SYSCON->RSTINFO; + printf (" SYSCON->RSTINFO = %x\n", read_data); + if (read_data != 0) result++; + if (result != 0) { + puts ("ERROR: reset info register value incorrect.\n"); + } else { + puts ("SYSRESETREQ test done\nNow test reset caused by lockup\n"); + } + + /* Test Lockup reset */ + CMSDK_SYSCON->RESETOP = CMSDK_SYSCON_LOCKUPRST_RESETOP_Msk; + read_data = CMSDK_SYSCON->RESETOP; + if (read_data != CMSDK_SYSCON_LOCKUPRST_RESETOP_Msk) { + puts ("ERROR: reset option register value incorrect.\n"); + UartEndSimulation(); + } + read_data = CMSDK_SYSCON->RSTINFO; + if (read_data != 0) { + puts ("ERROR: reset info register value incorrect.\n"); + UartEndSimulation(); + } + + /* Trigger hard fault */ + read_data=HW32_REG(BAD_ADDRESS); + + puts ("ERROR: Hard fault not triggered"); + + UartEndSimulation(); + /* Simulation stops in UartEndSimulation */ + + return; +} + +/* ----------------------------------------------------------------- */ +/* Get to here after lockup auto-reset */ +void main_prog_part_3(void) +{ + int result=0; + unsigned int read_data; + + puts("- Self reset completed"); + /* Check reset info register value */ + read_data = CMSDK_SYSCON->RSTINFO; + printf (" SYSCON->RSTINFO = %x\n", read_data); + if (read_data != CMSDK_SYSCON_RSTINFO_LOCKUPRESET_Msk) result++; + puts("- Clear reset info"); + CMSDK_SYSCON->RSTINFO = CMSDK_SYSCON_RSTINFO_LOCKUPRESET_Msk; + read_data = CMSDK_SYSCON->RSTINFO; + printf (" SYSCON->RSTINFO = %x\n", read_data); + if (read_data != 0) result++; + if (result != 0) { + puts ("ERROR: reset info register value incorrect.\n"); + } else { + puts ("Lockup reset test completed successfully\n"); + puts ("** TEST PASSED ** \n"); + } + UartEndSimulation(); + /* Simulation stops in UartEndSimulation */ + + return; +} + +/* ----------------------------------------------------------------- */ +void HardFault_Handler(void) +{ + unsigned int dummy; /* dummy variable for read that trigger hardfault */ + + puts("[Hard fault handler]"); + puts("- trigger fault again to enter lockup"); + + /* Trigger lockup */ + dummy=HW32_REG(BAD_ADDRESS); + puts ("ERROR: Lockup not triggered"); + + UartEndSimulation(); + /* Simulation stops in UartEndSimulation */ +} + diff --git a/Cortex-M0/nanosoc/software/common/demos/sleep_demo.c b/Cortex-M0/nanosoc/software/common/demos/sleep_demo.c new file mode 100644 index 0000000..9e99d3d --- /dev/null +++ b/Cortex-M0/nanosoc/software/common/demos/sleep_demo.c @@ -0,0 +1,543 @@ +/* + *----------------------------------------------------------------------------- + * The confidential and proprietary information contained in this file may + * only be used by a person authorised under and to the extent permitted + * by a subsisting licensing agreement from Arm Limited or its affiliates. + * + * (C) COPYRIGHT 2010-2013 Arm Limited or its affiliates. + * ALL RIGHTS RESERVED + * + * This entire notice must be reproduced on all copies of this file + * and copies of this file may only be made by a person if such person is + * permitted to do so under the terms of a subsisting license agreement + * from Arm Limited or its affiliates. + * + * SVN Information + * + * Checked In : $Date: 2017-10-10 15:55:38 +0100 (Tue, 10 Oct 2017) $ + * + * Revision : $Revision: 371321 $ + * + * Release Information : Cortex-M System Design Kit-r1p1-00rel0 + *----------------------------------------------------------------------------- + */ +//============================================================================== +// +// Sleep Demonstration +// +//============================================================================== +// +// This test demonstrates various sleep modes and different ways to enter sleeps. +// A timer is programmed before entering sleep and interrupt is generated to +// wake up the processor. +// +// SLEEPING +// +// - The test enters normal sleep mode using WFI and WFE. +// +// +// SLEEPDEEP +// +// - The test checks that the SLEEPDEEP output is asserted when the core enters +// sleep mode, by using the CM0IKMCU internal GPIO to cause a wake-up interrupt +// when the SLEEPDEEP signal is asserted. +// +// +// WIC mode SLEEPDEEP +// +// +// +// + + +#ifdef CORTEX_M0 +#include "CMSDK_CM0.h" +#endif + +#ifdef CORTEX_M0PLUS +#include "CMSDK_CM0plus.h" +#endif + +#ifdef CORTEX_M3 +#include "CMSDK_CM3.h" +#endif + +#ifdef CORTEX_M4 +#include "CMSDK_CM4.h" +#endif + +#include "uart_stdout.h" +#include "CMSDK_driver.h" +#include <stdio.h> + +// +// Global Variables to track test progress +// + +volatile uint32_t IntTaken = 0; +volatile uint32_t SleepOnExitTest = 0; + +int timer0_id_check(void); // Detect Timer 0 present + + +int main (void) +{ + // UART init + UartStdOutInit(); + + // Test banner message and revision number + puts("\nCortex Microcontroller System Design Kit - Sleep Demo - revision $Revision: 371321 $\n"); + + if (timer0_id_check()!=0) { + puts ("** TEST SKIPPED ** Timer 0 not present."); + UartEndSimulation(); + return 0;} + + + // -------------------------------------------- + // WFI Normal SLEEP + // -------------------------------------------- + puts("\n- WFI SLEEP:"); + + // Ensure we use normal SLEEP - SLEEPDEEP should be clear + // SCR[2] = SLEEPDEEP + SCB->SCR &= ~(1UL << 2); + + // Ensure timer interrupt is not pending before the test + NVIC_ClearPendingIRQ(TIMER0_IRQn); + + // Set timer 0 to decrement from 0xF0 with internal clock, + // interrupt enabled + CMSDK_timer_Init_IntClock(CMSDK_TIMER0, 0xF0, 1); + + // Enable Interrupts + NVIC_EnableIRQ(TIMER0_IRQn); + + // Wait For Interrupt + __WFI(); // Enter sleep mode + // Wakeup when timer interrupt is triggered + + // Stop the timer and disable interrupt generation + CMSDK_timer_StopTimer(CMSDK_TIMER0); + CMSDK_timer_DisableIRQ(CMSDK_TIMER0); + + // Check result + if (IntTaken) puts(" TIMER IRQ.\n"); + + // Disable Interrupt and Interrupt Source + NVIC_DisableIRQ(TIMER0_IRQn); + IntTaken = 0; // Reset software variable + + + // -------------------------------------------- + // WFE Normal SLEEP + // -------------------------------------------- + puts("\n- WFE SLEEP:"); + + // Ensure we use normal SLEEP - SLEEPDEEP should be clear + // SCR[2] = SLEEPDEEP + SCB->SCR &= ~(1UL << 2); + + // Ensure timer interrupt is not pending before the test + NVIC_ClearPendingIRQ(TIMER0_IRQn); + + IntTaken = 0; // Reset software variable + + // Set timer 0 to decrement from 0xF0 with internal clock, + // interrupt enabled + CMSDK_timer_Init_IntClock(CMSDK_TIMER0, 0xF0, 1); + + // Enable Interrupts + NVIC_EnableIRQ(TIMER0_IRQn); + + while (IntTaken==0) { /* Loop for sleep : + (first WFE could be woken up immediately due to event from the past) + */ + // Wait For Event + __WFE();// Enter sleep mode + // Wakeup when timer interrupt is triggered + } + + // Stop the timer and disable interrupt generation + CMSDK_timer_StopTimer(CMSDK_TIMER0); + CMSDK_timer_DisableIRQ(CMSDK_TIMER0); + + // Show message (no need to test variable because of the loop) + puts(" TIMER IRQ.\n"); + IntTaken = 0; // Reset software variable + + // -------------------------------------------- + // SLEEP-ON-EXIT + // -------------------------------------------- + puts("\n- SLEEP-ON-EXIT:"); + + // Ensure we use normal SLEEP - SLEEPDEEP should be clear + // SCR[2] = SLEEPDEEP + SCB->SCR &= ~(1UL << 2); + + // Enable sleep on exit feature + SCB->SCR |= (1UL << 1); + + // Ensure timer interrupt is not pending before the test + NVIC_ClearPendingIRQ(TIMER0_IRQn); + + IntTaken = 0; // Reset software variable + SleepOnExitTest = 1; + + // Set timer 0 to decrement from 0x2000 with internal clock, + // interrupt enabled + // Duration is longer than other test due to message display + // inside interrupt handler + CMSDK_timer_Init_IntClock(CMSDK_TIMER0, 0x2000, 1); + + // Enable Interrupts + NVIC_EnableIRQ(TIMER0_IRQn); + + while (IntTaken==0) { + /* Wait for first interrupt */ + /* Then the processor will enter sleep after Timer IRQ handler */ + /* Sleep on exit is disabled by timer IRQ handler in second occurrence */ + } + + // Stop the timer and disable interrupt generation + CMSDK_timer_StopTimer(CMSDK_TIMER0); + CMSDK_timer_DisableIRQ(CMSDK_TIMER0); + + // Show message (no need to test variable because of the loop) + IntTaken = 0; // Reset software variable + SleepOnExitTest = 0; + // Disable sleep on exit feature + SCB->SCR &= ~(1UL << 1); + + + + // -------------------------------------------- + // WFI Deep SLEEP + // -------------------------------------------- + puts("\n- WFI DEEP SLEEP:"); + + // Ensure we use deep SLEEP - SLEEPDEEP should be set + // SCR[2] = SLEEPDEEP + SCB->SCR |= (1UL << 2); + + // Ensure timer interrupt is not pending before the test + NVIC_ClearPendingIRQ(TIMER0_IRQn); + + // Set timer 0 to decrement from 0xF0 with internal clock, + // interrupt enabled + CMSDK_timer_Init_IntClock(CMSDK_TIMER0, 0xF0, 1); + + // Enable Interrupts + NVIC_EnableIRQ(TIMER0_IRQn); + + // Wait For Interrupt + __WFI(); // Enter sleep mode + // Wakeup when timer interrupt is triggered + + // Stop the timer and disable interrupt generation + CMSDK_timer_StopTimer(CMSDK_TIMER0); + CMSDK_timer_DisableIRQ(CMSDK_TIMER0); + + // Check result + if (IntTaken) puts(" TIMER IRQ.\n"); + + // Disable Interrupt and Interrupt Source + NVIC_DisableIRQ(TIMER0_IRQn); + IntTaken = 0; // Reset software variable + + + // -------------------------------------------- + // WFE Deep SLEEP + // -------------------------------------------- + puts("\n- WFE DEEP SLEEP:"); + + // Ensure we use deep SLEEP - SLEEPDEEP should be set + // SCR[2] = SLEEPDEEP + SCB->SCR |= (1UL << 2); + + // Ensure timer interrupt is not pending before the test + NVIC_ClearPendingIRQ(TIMER0_IRQn); + + IntTaken = 0; // Reset software variable + + // Set timer 0 to decrement from 0xF0 with internal clock, + // interrupt enabled + CMSDK_timer_Init_IntClock(CMSDK_TIMER0, 0xF0, 1); + + // Enable Interrupts + NVIC_EnableIRQ(TIMER0_IRQn); + + while (IntTaken==0) { /* Loop for sleep : + (first WFE could be woken up immediately due to event from the past) + */ + // Wait For Event + __WFE();// Enter sleep mode + // Wakeup when timer interrupt is triggered + } + + // Stop the timer and disable interrupt generation + CMSDK_timer_StopTimer(CMSDK_TIMER0); + CMSDK_timer_DisableIRQ(CMSDK_TIMER0); + + // Show message (no need to test variable because of the loop) + puts(" TIMER IRQ.\n"); + IntTaken = 0; // Reset software variable + + // -------------------------------------------- + // SLEEP-ON-EXIT + // -------------------------------------------- + puts("\n- SLEEP-ON-EXIT deep sleep:"); + + // Ensure we use deep SLEEP - SLEEPDEEP should be set + // SCR[2] = SLEEPDEEP + SCB->SCR |= (1UL << 2); + + // Enable sleep on exit feature + SCB->SCR |= (1UL << 1); + + // Ensure timer interrupt is not pending before the test + NVIC_ClearPendingIRQ(TIMER0_IRQn); + + IntTaken = 0; // Reset software variable + SleepOnExitTest = 1; + + // Set timer 0 to decrement from 0x2000 with internal clock, + // interrupt enabled + // Duration is longer than other test due to message display + // inside interrupt handler + CMSDK_timer_Init_IntClock(CMSDK_TIMER0, 0x2000, 1); + + // Enable Interrupts + NVIC_EnableIRQ(TIMER0_IRQn); + + while (IntTaken==0) { + /* Wait for first interrupt */ + /* Then the processor will enter sleep after Timer IRQ handler */ + /* Sleep on exit is disabled by timer IRQ handler in second occurrence */ + } + + // Stop the timer and disable interrupt generation + CMSDK_timer_StopTimer(CMSDK_TIMER0); + CMSDK_timer_DisableIRQ(CMSDK_TIMER0); + + // Show message (no need to test variable because of the loop) + IntTaken = 0; // Reset software variable + SleepOnExitTest = 0; + // Disable sleep on exit feature + SCB->SCR &= ~(1UL << 1); + + // -------------------------------------------- + // WFI Deep SLEEP with PMU enabled + // -------------------------------------------- + + puts("\n- Detecting PMU control"); + CMSDK_SYSCON->PMUCTRL = CMSDK_SYSCON_PMUCTRL_EN_Msk; // set bit + if ((CMSDK_SYSCON->PMUCTRL & CMSDK_SYSCON_PMUCTRL_EN_Msk)==0) { + puts ("PMU not available\n"); + } + else { + + puts("\n- WFI DEEP SLEEP with WIC"); + + // Ensure we use deep SLEEP - SLEEPDEEP should be set + // SCR[2] = SLEEPDEEP + SCB->SCR |= (1UL << 2); + + // Ensure timer interrupt is not pending before the test + NVIC_ClearPendingIRQ(TIMER0_IRQn); + + // Set timer 0 to decrement from 0xF0 with internal clock, + // interrupt enabled + CMSDK_timer_Init_IntClock(CMSDK_TIMER0, 0xF0, 1); + + // Enable Interrupts + NVIC_EnableIRQ(TIMER0_IRQn); + + // Wait For Interrupt + __WFI(); // Enter sleep mode + // Wakeup when timer interrupt is triggered + + // Stop the timer and disable interrupt generation + CMSDK_timer_StopTimer(CMSDK_TIMER0); + CMSDK_timer_DisableIRQ(CMSDK_TIMER0); + + // Check result + if (IntTaken) puts(" TIMER IRQ.\n"); + + // Disable Interrupt and Interrupt Source + NVIC_DisableIRQ(TIMER0_IRQn); + IntTaken = 0; // Reset software variable + + + // -------------------------------------------- + // WFE Deep SLEEP with PMU enabled + // -------------------------------------------- + puts("\n- WFE DEEP SLEEP with WIC"); + + // Ensure we use deep SLEEP - SLEEPDEEP should be set + // SCR[2] = SLEEPDEEP + SCB->SCR |= (1UL << 2); + + // Ensure timer interrupt is not pending before the test + NVIC_ClearPendingIRQ(TIMER0_IRQn); + + IntTaken = 0; // Reset software variable + + // Set timer 0 to decrement from 0xF0 with internal clock, + // interrupt enabled + CMSDK_timer_Init_IntClock(CMSDK_TIMER0, 0xF0, 1); + + // Enable Interrupts + NVIC_EnableIRQ(TIMER0_IRQn); + + while (IntTaken==0) { /* Loop for sleep : + (first WFE could be woken up immediately due to event from the past) + */ + // Wait For Event + __WFE();// Enter sleep mode + // Wakeup when timer interrupt is triggered + } + + // Stop the timer and disable interrupt generation + CMSDK_timer_StopTimer(CMSDK_TIMER0); + CMSDK_timer_DisableIRQ(CMSDK_TIMER0); + + // Check result + // Show message (no need to test variable because of the loop) + puts(" TIMER IRQ.\n"); + IntTaken = 0; // Reset software variable + + // -------------------------------------------- + // SLEEP-ON-EXIT + // -------------------------------------------- + puts("\n- SLEEP-ON-EXIT with WIC:"); + + // Enable sleep on exit feature + SCB->SCR |= (1UL << 1); + + // Ensure timer interrupt is not pending before the test + NVIC_ClearPendingIRQ(TIMER0_IRQn); + + IntTaken = 0; // Reset software variable + SleepOnExitTest = 1; + + // Set timer 0 to decrement from 0x2000 with internal clock, + // interrupt enabled + // Duration is longer than other test due to message display + // inside interrupt handler + CMSDK_timer_Init_IntClock(CMSDK_TIMER0, 0x2000, 1); + + // Enable Interrupts + NVIC_EnableIRQ(TIMER0_IRQn); + + while (IntTaken==0) { + /* Wait for first interrupt */ + /* Then the processor will enter sleep after Timer IRQ handler */ + /* Sleep on exit is disabled by timer IRQ handler in second occurrence */ + } + + // Stop the timer and disable interrupt generation + CMSDK_timer_StopTimer(CMSDK_TIMER0); + CMSDK_timer_DisableIRQ(CMSDK_TIMER0); + + // Show message (no need to test variable because of the loop) + IntTaken = 0; // Reset software variable + SleepOnExitTest = 0; + // Disable sleep on exit feature + SCB->SCR &= ~(1UL << 1); + + } + + // -------------------------------------------- + // Disable PMU + // -------------------------------------------- + CMSDK_SYSCON->PMUCTRL = 0; // Clear bit + if ((CMSDK_SYSCON->PMUCTRL & CMSDK_SYSCON_PMUCTRL_EN_Msk)!=0) { + puts ("ERROR:PMU control cannot be cleared\n"); + } + + puts("\n- WFI DEEP SLEEP with WIC switched off"); + + // Ensure we use deep SLEEP - SLEEPDEEP should be set + // SCR[2] = SLEEPDEEP + SCB->SCR |= (1UL << 2); + + // Ensure timer interrupt is not pending before the test + NVIC_ClearPendingIRQ(TIMER0_IRQn); + + // Set timer 0 to decrement from 0xF0 with internal clock, + // interrupt enabled + CMSDK_timer_Init_IntClock(CMSDK_TIMER0, 0xF0, 1); + + // Enable Interrupts + NVIC_EnableIRQ(TIMER0_IRQn); + + // Wait For Interrupt + __WFI(); // Enter sleep mode + // Wakeup when timer interrupt is triggered + + // Stop the timer and disable interrupt generation + CMSDK_timer_StopTimer(CMSDK_TIMER0); + CMSDK_timer_DisableIRQ(CMSDK_TIMER0); + + // Check result + if (IntTaken) puts(" TIMER IRQ.\n"); + + // Disable Interrupt and Interrupt Source + NVIC_DisableIRQ(TIMER0_IRQn); + IntTaken = 0; + + printf("** TEST PASSED ** \n"); + + UartEndSimulation(); + /* Simulation stops in UartEndSimulation */ + + return 0; +} + +// +// Timer 0 detection +// +/* Macros for word access to address */ +#define HW32_REG(ADDRESS) (*((volatile unsigned long *)(ADDRESS))) + +int timer0_id_check(void) +{ +if ((HW32_REG(CMSDK_TIMER0_BASE + 0xFE0) != 0x22) || + (HW32_REG(CMSDK_TIMER0_BASE + 0xFE4) != 0xB8)) + return 1; /* part ID does not match */ +else + return 0; +} + + +// +// Timer interrupt handler +// + +void TIMER0_Handler(void) +{ + CMSDK_timer_ClearIRQ(CMSDK_TIMER0); + // Signal to main code that the INT was taken + IntTaken++; + if (SleepOnExitTest==1){ + puts(" TIMER IRQ."); + if (IntTaken==1){ + puts(" Enter sleep..."); + } + + if (IntTaken==2){ + // Disable sleep on exit feature + SCB->SCR &= ~(1UL << 1); + // Stop the timer and disable interrupt generation + CMSDK_timer_StopTimer(CMSDK_TIMER0); + CMSDK_timer_DisableIRQ(CMSDK_TIMER0); + } + } else { + // Stop the timer and disable interrupt generation + CMSDK_timer_StopTimer(CMSDK_TIMER0); + CMSDK_timer_DisableIRQ(CMSDK_TIMER0); + } + +} + diff --git a/Cortex-M0/nanosoc/software/common/demos/watchdog_demo.c b/Cortex-M0/nanosoc/software/common/demos/watchdog_demo.c new file mode 100644 index 0000000..9c574f5 --- /dev/null +++ b/Cortex-M0/nanosoc/software/common/demos/watchdog_demo.c @@ -0,0 +1,355 @@ +/* + *----------------------------------------------------------------------------- + * The confidential and proprietary information contained in this file may + * only be used by a person authorised under and to the extent permitted + * by a subsisting licensing agreement from Arm Limited or its affiliates. + * + * (C) COPYRIGHT 2010-2013 Arm Limited or its affiliates. + * ALL RIGHTS RESERVED + * + * This entire notice must be reproduced on all copies of this file + * and copies of this file may only be made by a person if such person is + * permitted to do so under the terms of a subsisting license agreement + * from Arm Limited or its affiliates. + * + * SVN Information + * + * Checked In : $Date: 2017-10-10 15:55:38 +0100 (Tue, 10 Oct 2017) $ + * + * Revision : $Revision: 371321 $ + * + * Release Information : Cortex-M System Design Kit-r1p1-00rel0 + *----------------------------------------------------------------------------- + */ + + /* Check demonstrate watchdog functionality */ + +#ifdef CORTEX_M0 +#include "CMSDK_CM0.h" +#endif + +#ifdef CORTEX_M0PLUS +#include "CMSDK_CM0plus.h" +#endif + +#ifdef CORTEX_M3 +#include "CMSDK_CM3.h" +#endif + +#ifdef CORTEX_M4 +#include "CMSDK_CM4.h" +#endif + +#include <stdio.h> +#include "uart_stdout.h" + +/* Macros for word access to address */ +#define HW32_REG(ADDRESS) (*((volatile unsigned long *)(ADDRESS))) + +void main_prog_part_1(void); +void main_prog_part_2(void); +int watchdog_id_check(void); +int sysctrl_id_check(void); +void watchdog_init(unsigned int cycle, int type); + /* Program watchdog: */ + /* type = 0 : No action */ + /* type = 1 : Interrupt */ + /* type = 2 : Reset */ +void watchdog_set(unsigned int cycle); /* update watchdog counter */ +void watchdog_unlock(void); /* unlock watchdog */ +void watchdog_lock(void); /* lock watchdog */ +void watchdog_irq_clear(void); /* clear watchdog interrupt */ + +/* Software variables for testing */ +volatile int nmi_occurred; +volatile int nmi_expected; +volatile int reset_test; /* set to 1 during watchdog reset test so that NMI + handler will not clear the watchdog */ +volatile int integration_test=0; /* set to 1 during watchdog integration test so that NMI + handler will clear integration test output */ + +/* Start of main code */ +int main (void) +{ + // UART init + UartStdOutInit(); + + // Test banner message and revision number + puts("\nCortex Microcontroller System Design Kit - Watchdog Demo - revision $Revision: 371321 $\n"); + + if (sysctrl_id_check()!=0) { + puts ("** TEST SKIPPED ** SysCtrl not present."); + UartEndSimulation(); + return 0;} + + /* Check CMSDK_SYSCON->RSTINFO Reset Information register */ + /* 0 = cold reset */ + /* 1 = reset from SYSRESETREQ */ + /* 2 = reset from Watchdog */ + if ((CMSDK_SYSCON->RSTINFO & CMSDK_SYSCON_RSTINFO_WDOGRESETREQ_Msk) !=0) { + puts ("Restarted by Watchdog reset"); + main_prog_part_2(); + UartEndSimulation(); /* Simulation stop */ + } + else if ((CMSDK_SYSCON->RSTINFO & CMSDK_SYSCON_RSTINFO_SYSRESETREQ_Msk) !=0) { + puts ("Restarted by SYSRESETREQ reset"); + puts ("ERROR: reset info register value incorrect.\n"); + UartEndSimulation(); /* Simulation stop */ + } + else { + puts("Watchdog demo test\n"); + + if (watchdog_id_check()!=0) { + puts ("** TEST SKIPPED ** Watchdog not present."); + UartEndSimulation(); + return 0;} + + main_prog_part_1(); + } + puts ("** TEST PASSED ** \n"); + UartEndSimulation(); /* Simulation stop */ +} +/* ----------------------------------------------------------------- */ +/* Detect the ARM ID and part number to see if device is present */ +int watchdog_id_check(void) +{ +unsigned char wdog_id; +#define HW32_REG(ADDRESS) (*((volatile unsigned long *)(ADDRESS))) +#define HW8_REG(ADDRESS) (*((volatile unsigned char *)(ADDRESS))) + +wdog_id = HW8_REG(CMSDK_WATCHDOG_BASE + 0xFE8) & 0x07; + +if ((HW32_REG(CMSDK_WATCHDOG_BASE + 0xFE0) != 0x24) || + (HW32_REG(CMSDK_WATCHDOG_BASE + 0xFE4) != 0xB8) || + (wdog_id != 0x03)) + return 1; /* part ID & ARM ID does not match */ +else + return 0; +} +int sysctrl_id_check(void) +{ /* CMSDK SysCtrl part ID range from 826 to 829 */ +if ((HW32_REG(CMSDK_SYSCTRL_BASE + 0xFE0) < 0x26) || + (HW32_REG(CMSDK_SYSCTRL_BASE + 0xFE0) > 0x29) || + (HW32_REG(CMSDK_SYSCTRL_BASE + 0xFE4) != 0xB8)) + return 1; /* part ID does not match */ +else + return 0; +} + +/* ----------------------------------------------------------------- */ +/* First part of the test program */ +void main_prog_part_1(void) +{ + int i; + const char expected_id[8]={0x24, 0xB8, 0x1B, 0x00, 0x0D, 0xF0, 0x05, 0xB1}; + unsigned int read_data; + reset_test = 0; + + puts("Main program part 1\n"); + puts("- Detect ID registers\n"); + // Check the IDs and not revision number + for (i=0; i<8; i++){ + read_data = HW32_REG(CMSDK_WATCHDOG_BASE + 0xFE0 + i*4); + if (read_data==expected_id[i]){ + printf ("Values[%x]=0x%x\n", i, read_data); + } else { + printf ("ERROR : Values[%x]=0x%x, expected 0x%x\n", i, read_data,expected_id[i]); + UartEndSimulation(); + } + } + puts("\n- Program watchdog for 10000 cycles"); + watchdog_init(10000, 1); /* Generate NMI */ + nmi_occurred = 0; + nmi_expected = 0; + puts("- Run loop with watchdog set regularly 10 times\n"); + i = 0; + while (i<10) { + read_data = CMSDK_WATCHDOG->VALUE; + if (read_data < 8000) //the threshold must be large enough so that the NMI interrupt + //won't be triggered before the watchdog value is set again + { + watchdog_set(10000); + i++; + puts (" Watchdog value set again"); + } + } + + watchdog_init(5000, 0); /* Set watchdog to no action */ + if (nmi_occurred!=0) { + puts ("ERROR : NMI occurred unexpectedly\n"); + UartEndSimulation(); /* Simulation stop */ + } + + puts("\n- Test NMI generation"); + nmi_occurred = 0; + nmi_expected = 1; + watchdog_init(5000, 1); /* Generate NMI */ + + while (nmi_occurred==0) { + //Wait for the watchdog interrupt + } + + watchdog_init(5000, 0); /* Set watchdog to no action */ + puts("\n- Test reset generation"); + nmi_occurred = 0; + nmi_expected = 1; /* NMI will be triggered first */ + reset_test = 1; /* put NMI handler to reset test operation */ + watchdog_init(5000, 2); /* Generate Reset */ + while (1) { + // wait for NMI... + } +} + + +/* ----------------------------------------------------------------- */ +/* Second part of the main test program - execute after watchdog reset */ +void main_prog_part_2(void) +{ + int result=0; + unsigned int read_data; + puts("Main program part 2"); + puts("- Watchdog reset completed"); + read_data = CMSDK_SYSCON->RSTINFO; + printf (" SYSCON->RSTINFO = %x\n", read_data); + + if (read_data != CMSDK_SYSCON_RSTINFO_WDOGRESETREQ_Msk) { + result++; + } + puts("- Clear reset info"); + CMSDK_SYSCON->RSTINFO = CMSDK_SYSCON_RSTINFO_WDOGRESETREQ_Msk; + read_data = CMSDK_SYSCON->RSTINFO; + printf (" SYSCON->RSTINFO = %x\n", read_data); + + if (read_data != 0)/* RSTINFO should be cleared */ + { + result++; + } + + if (result != 0) { + puts ("ERROR: reset info register value incorrect.\n"); + } else { + puts ("Watchdog reset performed successfully\n"); + } + + /* */ + /* A simple integration test for Watchdog using NMI */ + /* */ + + /* Instead of trigger NMI using normal watchdog operation, you can also + test the watchdog connection using integration test register. + ITCR - bit 0 enable integration test mode + ITOP - bit 0 enable watchdog reset when integration test mode is enabled + bit 1 enable watchdog interrupt when integration test mode is enabled + + Here we demonstrate the generation of interrupt (NMI) using integration test + registers. You can also use integration test register to generate reset + but this will cause this part of the test running again and again, so we + will not demonstrate it here. + */ + + puts("Testing generation of NMI using integration test register"); + reset_test = 0; + integration_test = 1; + nmi_expected = 0; + nmi_occurred = 0; + watchdog_unlock(); + CMSDK_WATCHDOG->ITOP = 0; // Ensure NMI and reset in integration test mode are 0 + CMSDK_WATCHDOG->ITCR = 1; // Enable integration test mode + if (CMSDK_WATCHDOG->ITCR == 0) { + puts (" - Integration Control read error"); + result++; + } + else { + nmi_expected = 1; + CMSDK_WATCHDOG->ITOP = 2; // Set NMI output to 1 + CMSDK_WATCHDOG->ITOP = 0; // Set NMI output to 0 + if (nmi_occurred==0) { + puts (" - Integration Test operation failed"); + result++; + } + CMSDK_WATCHDOG->ITCR = 0; // Disable integration test mode + if (CMSDK_WATCHDOG->ITCR != 0) { + puts (" - Integration Control clear error"); + result++; + } + } + if (result != 0) { + puts ("** TEST FAILED ** Errors in Watchdog test\n"); + } else { + puts ("Watchdog demo completed successfully\n** TEST PASSED ** \n"); + } + + UartEndSimulation(); /* Simulation stops in UartEndSimulation */ +} + +/* ----------------------------------------------------------------- */ +void NMI_Handler(void) +{ + + puts ("NMI Handler Entered! \n"); + if (reset_test==1){ /* When testing watchdog reset, need to stay + in NMI handler until the watchdog overflows again */ + while (1) { + // wait for reset... + } + } + watchdog_irq_clear(); /* Deassert Watchdog interrupt */ + nmi_occurred++; /* Update software flag */ + if (nmi_expected==0) { /* error check */ + puts ("ERROR : NMI occurred unexpectedly\n"); + UartEndSimulation(); /* Simulation stop */ + } + if (integration_test!=0) { + watchdog_unlock(); + CMSDK_WATCHDOG->ITOP = 0; // Set NMI output to 0 + } +} +/* ----------------------------------------------------------------- */ +/* Watchdog initialization */ +void watchdog_init(unsigned int cycle, int type) +{ + puts (" Unlocking watchdog..."); + watchdog_unlock(); + CMSDK_WATCHDOG->LOAD = cycle; + if (type==0) { + puts (" Set to no action"); + CMSDK_WATCHDOG->CTRL = 0; + } else if (type==1) { + puts (" Set to NMI generation"); + CMSDK_WATCHDOG->CTRL = CMSDK_Watchdog_CTRL_INTEN_Msk; + } else { + puts (" Set to reset generation"); + CMSDK_WATCHDOG->CTRL = CMSDK_Watchdog_CTRL_RESEN_Msk|CMSDK_Watchdog_CTRL_INTEN_Msk; + } + puts (" Locking watchdog..."); + watchdog_lock(); +} +/* ----------------------------------------------------------------- */ +/* Update watchdog counter */ +void watchdog_set(unsigned int cycle) +{ + watchdog_unlock(); + CMSDK_WATCHDOG->CTRL = cycle; + watchdog_lock(); +} +/* ----------------------------------------------------------------- */ +/* Unlock watchdog access */ +void watchdog_unlock(void) +{ + CMSDK_WATCHDOG->LOCK = 0x1ACCE551; +} +/* ----------------------------------------------------------------- */ +/* Lock watchdog access */ +void watchdog_lock(void) +{ + CMSDK_WATCHDOG->LOCK = 0; +} +/* ----------------------------------------------------------------- */ +/* Clear watchdog interrupt request */ +void watchdog_irq_clear(void) +{ + watchdog_unlock(); + CMSDK_WATCHDOG->INTCLR = CMSDK_Watchdog_INTCLR_Msk; + watchdog_lock(); +} + diff --git a/Cortex-M0/nanosoc/software/common/dhry/dhry.h b/Cortex-M0/nanosoc/software/common/dhry/dhry.h new file mode 100644 index 0000000..5845c12 --- /dev/null +++ b/Cortex-M0/nanosoc/software/common/dhry/dhry.h @@ -0,0 +1,455 @@ +/* +This is a MODIFIED version of the Dhrystone 2.1 Benchmark program. + +The only changes which have been made are: +1) the 'old-style' K&R function declarations have been replaced with +'ANSI-C-style' function declarations (in dhry_1.c and dhry_2,c), and +2) function prototypes have been added (in dhry.h) +3) dhry.h uses CLOCKS_PER_SEC instead of CLK_TCK (to build with -strict) + +These changes allow an ANSI-C compiler to produce more efficient code, with +no warnings. +*/ + +/* + **************************************************************************** + * + * "DHRYSTONE" Benchmark Program + * ----------------------------- + * + * Version: C, Version 2.1 + * + * File: dhry.h (part 1 of 3) + * + * Date: May 25, 1988 + * + * Author: Reinhold P. Weicker + * Siemens AG, E STE 35 + * Postfach 3240 + * 8520 Erlangen + * Germany (West) + * Phone: [xxx-49]-9131-7-20330 + * (8-17 Central European Time) + * Usenet: ..!mcvax!unido!estevax!weicker + * + * Original Version (in Ada) published in + * "Communications of the ACM" vol. 27., no. 10 (Oct. 1984), + * pp. 1013 - 1030, together with the statistics + * on which the distribution of statements etc. is based. + * + * In this C version, the following C library functions are used: + * - strcpy, strcmp (inside the measurement loop) + * - printf, scanf (outside the measurement loop) + * In addition, Berkeley UNIX system calls "times ()" or "time ()" + * are used for execution time measurement. For measurements + * on other systems, these calls have to be changed. + * + * Collection of Results: + * Reinhold Weicker (address see above) and + * + * Rick Richardson + * PC Research. Inc. + * 94 Apple Orchard Drive + * Tinton Falls, NJ 07724 + * Phone: (201) 389-8963 (9-17 EST) + * Usenet: ...!uunet!pcrat!rick + * + * Please send results to Rick Richardson and/or Reinhold Weicker. + * Complete information should be given on hardware and software used. + * Hardware information includes: Machine type, CPU, type and size + * of caches; for microprocessors: clock frequency, memory speed + * (number of wait states). + * Software information includes: Compiler (and runtime library) + * manufacturer and version, compilation switches, OS version. + * The Operating System version may give an indication about the + * compiler; Dhrystone itself performs no OS calls in the measurement loop. + * + * The complete output generated by the program should be mailed + * such that at least some checks for correctness can be made. + * + *************************************************************************** + * + * History: This version C/2.1 has been made for two reasons: + * + * 1) There is an obvious need for a common C version of + * Dhrystone, since C is at present the most popular system + * programming language for the class of processors + * (microcomputers, minicomputers) where Dhrystone is used most. + * There should be, as far as possible, only one C version of + * Dhrystone such that results can be compared without + * restrictions. In the past, the C versions distributed + * by Rick Richardson (Version 1.1) and by Reinhold Weicker + * had small (though not significant) differences. + * + * 2) As far as it is possible without changes to the Dhrystone + * statistics, optimizing compilers should be prevented from + * removing significant statements. + * + * This C version has been developed in cooperation with + * Rick Richardson (Tinton Falls, NJ), it incorporates many + * ideas from the "Version 1.1" distributed previously by + * him over the UNIX network Usenet. + * I also thank Chaim Benedelac (National Semiconductor), + * David Ditzel (SUN), Earl Killian and John Mashey (MIPS), + * Alan Smith and Rafael Saavedra-Barrera (UC at Berkeley) + * for their help with comments on earlier versions of the + * benchmark. + * + * Changes: In the initialization part, this version follows mostly + * Rick Richardson's version distributed via Usenet, not the + * version distributed earlier via floppy disk by Reinhold Weicker. + * As a concession to older compilers, names have been made + * unique within the first 8 characters. + * Inside the measurement loop, this version follows the + * version previously distributed by Reinhold Weicker. + * + * At several places in the benchmark, code has been added, + * but within the measurement loop only in branches that + * are not executed. The intention is that optimizing compilers + * should be prevented from moving code out of the measurement + * loop, or from removing code altogether. Since the statements + * that are executed within the measurement loop have NOT been + * changed, the numbers defining the "Dhrystone distribution" + * (distribution of statements, operand types and locality) + * still hold. Except for sophisticated optimizing compilers, + * execution times for this version should be the same as + * for previous versions. + * + * Since it has proven difficult to subtract the time for the + * measurement loop overhead in a correct way, the loop check + * has been made a part of the benchmark. This does have + * an impact - though a very minor one - on the distribution + * statistics which have been updated for this version. + * + * All changes within the measurement loop are described + * and discussed in the companion paper "Rationale for + * Dhrystone version 2". + * + * Because of the self-imposed limitation that the order and + * distribution of the executed statements should not be + * changed, there are still cases where optimizing compilers + * may not generate code for some statements. To a certain + * degree, this is unavoidable for small synthetic benchmarks. + * Users of the benchmark are advised to check code listings + * whether code is generated for all statements of Dhrystone. + * + * Version 2.1 is identical to version 2.0 distributed via + * the UNIX network Usenet in March 1988 except that it corrects + * some minor deficiencies that were found by users of version 2.0. + * The only change within the measurement loop is that a + * non-executed "else" part was added to the "if" statement in + * Func_3, and a non-executed "else" part removed from Proc_3. + * + *************************************************************************** + * + * Defines: The following "Defines" are possible: + * -DREG=register (default: Not defined) + * As an approximation to what an average C programmer + * might do, the "register" storage class is applied + * (if enabled by -DREG=register) + * - for local variables, if they are used (dynamically) + * five or more times + * - for parameters if they are used (dynamically) + * six or more times + * Note that an optimal "register" strategy is + * compiler-dependent, and that "register" declarations + * do not necessarily lead to faster execution. + * -DNOSTRUCTASSIGN (default: Not defined) + * Define if the C compiler does not support + * assignment of structures. + * -DNOENUMS (default: Not defined) + * Define if the C compiler does not support + * enumeration types. + * -DTIMES (default) + * -DTIME + * The "times" function of UNIX (returning process times) + * or the "time" function (returning wallclock time) + * is used for measurement. + * For single user machines, "time ()" is adequate. For + * multi-user machines where you cannot get single-user + * access, use the "times ()" function. If you have + * neither, use a stopwatch in the dead of night. + * "printf"s are provided marking the points "Start Timer" + * and "Stop Timer". DO NOT use the UNIX "time(1)" + * command, as this will measure the total time to + * run this program, which will (erroneously) include + * the time to allocate storage (malloc) and to perform + * the initialization. + * -DHZ=nnn + * In Berkeley UNIX, the function "times" returns process + * time in 1/HZ seconds, with HZ = 60 for most systems. + * CHECK YOUR SYSTEM DESCRIPTION BEFORE YOU JUST APPLY + * A VALUE. + * + *************************************************************************** + * + * Compilation model and measurement (IMPORTANT): + * + * This C version of Dhrystone consists of three files: + * - dhry.h (this file, containing global definitions and comments) + * - dhry_1.c (containing the code corresponding to Ada package Pack_1) + * - dhry_2.c (containing the code corresponding to Ada package Pack_2) + * + * The following "ground rules" apply for measurements: + * - Separate compilation + * - No procedure merging + * - Otherwise, compiler optimizations are allowed but should be indicated + * - Default results are those without register declarations + * See the companion paper "Rationale for Dhrystone Version 2" for a more + * detailed discussion of these ground rules. + * + * For 16-Bit processors (e.g. 80186, 80286), times for all compilation + * models ("small", "medium", "large" etc.) should be given if possible, + * together with a definition of these models for the compiler system used. + * + ************************************************************************** + * + * Dhrystone (C version) statistics: + * + * [Comment from the first distribution, updated for version 2. + * Note that because of language differences, the numbers are slightly + * different from the Ada version.] + * + * The following program contains statements of a high level programming + * language (here: C) in a distribution considered representative: + * + * assignments 52 (51.0 %) + * control statements 33 (32.4 %) + * procedure, function calls 17 (16.7 %) + * + * 103 statements are dynamically executed. The program is balanced with + * respect to the three aspects: + * + * - statement type + * - operand type + * - operand locality + * operand global, local, parameter, or constant. + * + * The combination of these three aspects is balanced only approximately. + * + * 1. Statement Type: + * ----------------- number + * + * V1 = V2 9 + * (incl. V1 = F(..) + * V = Constant 12 + * Assignment, 7 + * with array element + * Assignment, 6 + * with record component + * -- + * 34 34 + * + * X = Y +|-|"&&"|"|" Z 5 + * X = Y +|-|"==" Constant 6 + * X = X +|- 1 3 + * X = Y *|/ Z 2 + * X = Expression, 1 + * two operators + * X = Expression, 1 + * three operators + * -- + * 18 18 + * + * if .... 14 + * with "else" 7 + * without "else" 7 + * executed 3 + * not executed 4 + * for ... 7 | counted every time + * while ... 4 | the loop condition + * do ... while 1 | is evaluated + * switch ... 1 + * break 1 + * declaration with 1 + * initialization + * -- + * 34 34 + * + * P (...) procedure call 11 + * user procedure 10 + * library procedure 1 + * X = F (...) + * function call 6 + * user function 5 + * library function 1 + * -- + * 17 17 + * --- + * 103 + * + * The average number of parameters in procedure or function calls + * is 1.82 (not counting the function values aX * + * + * 2. Operators + * ------------ + * number approximate + * percentage + * + * Arithmetic 32 50.8 + * + * + 21 33.3 + * - 7 11.1 + * * 3 4.8 + * / (int div) 1 1.6 + * + * Comparison 27 42.8 + * + * == 9 14.3 + * /= 4 6.3 + * > 1 1.6 + * < 3 4.8 + * >= 1 1.6 + * <= 9 14.3 + * + * Logic 4 6.3 + * + * && (AND-THEN) 1 1.6 + * | (OR) 1 1.6 + * ! (NOT) 2 3.2 + * + * -- ----- + * 63 100.1 + * + * + * 3. Operand Type (counted once per operand reference): + * --------------- + * number approximate + * percentage + * + * Integer 175 72.3 % + * Character 45 18.6 % + * Pointer 12 5.0 % + * String30 6 2.5 % + * Array 2 0.8 % + * Record 2 0.8 % + * --- ------- + * 242 100.0 % + * + * When there is an access path leading to the final operand (e.g. a record + * component), only the final data type on the access path is counted. + * + * + * 4. Operand Locality: + * ------------------- + * number approximate + * percentage + * + * local variable 114 47.1 % + * global variable 22 9.1 % + * parameter 45 18.6 % + * value 23 9.5 % + * reference 22 9.1 % + * function result 6 2.5 % + * constant 55 22.7 % + * --- ------- + * 242 100.0 % + * + * + * The program does not compute anything meaningful, but it is syntactically + * and semantically correct. All variables have a value assigned to them + * before they are used as a source operand. + * + * There has been no explicit effort to account for the effects of a + * cache, or to balance the use of long or short displacements for code or + * data. + * + *************************************************************************** + */ + +#include <string.h> +#include <stdlib.h> + +/* Compiler and system dependent definitions: */ + + /* Use times(2) time function unless */ + /* explicitly defined otherwise */ + +#ifdef MSC_CLOCK +#undef HZ +#undef TIMES +#include <time.h> +#define HZ CLOCKS_PER_SEC +#endif + /* Use Microsoft C hi-res clock */ + +#ifdef TIMES +#include <sys/types.h> +#include <sys/times.h> + /* for "times" */ +#endif + +#define Mic_secs_Per_Second 1000000.0 + /* Berkeley UNIX C returns process times in seconds/HZ */ + +#ifdef NOSTRUCTASSIGN +#define structassign(d, s) memcpy(&(d), &(s), sizeof(d)) +#else +#define structassign(d, s) (d = s) +#endif + +#ifdef NOENUM +#define Ident_1 0 +#define Ident_2 1 +#define Ident_3 2 +#define Ident_4 3 +#define Ident_5 4 + typedef int Enumeration; +#else + typedef enum {Ident_1, Ident_2, Ident_3, Ident_4, Ident_5} + Enumeration; +#endif + /* for boolean and enumeration types in Ada, Pascal */ + +/* General definitions: */ + +#include <stdio.h> + /* for strcpy, strcmp */ + +#define Null 0 + /* Value of a Null pointer */ +#define true 1 +#define false 0 + +typedef int One_Thirty; +typedef int One_Fifty; +typedef char Capital_Letter; +typedef int Boolean; +typedef char Str_30 [31]; +typedef int Arr_1_Dim [50]; +typedef int Arr_2_Dim [50] [50]; + +typedef struct record + { + struct record *Ptr_Comp; + Enumeration Discr; + union { + struct { + Enumeration Enum_Comp; + int Int_Comp; + char Str_Comp [31]; + } var_1; + struct { + Enumeration E_Comp_2; + char Str_2_Comp [31]; + } var_2; + struct { + char Ch_1_Comp; + char Ch_2_Comp; + } var_3; + } variant; + } Rec_Type, *Rec_Pointer; + + +void Proc_1 (Rec_Pointer Ptr_Val_Par); +void Proc_2 (One_Fifty *Int_Par_Ref); +void Proc_3 (Rec_Pointer *Ptr_Ref_Par); +void Proc_4 (void); +void Proc_5 (void); +void Proc_6 (Enumeration Enum_Val_Par, Enumeration *Enum_Ref_Par); +void Proc_7 (One_Fifty Int_1_Par_Val, One_Fifty Int_2_Par_Val, One_Fifty *Int_Par_Ref); +void Proc_8 (Arr_1_Dim Arr_1_Par_Ref, Arr_2_Dim Arr_2_Par_Ref, int Int_1_Par_Val, int Int_2_Par_Val); +Enumeration Func_1 (Capital_Letter Ch_1_Par_Val, Capital_Letter Ch_2_Par_Val); +Boolean Func_2 (Str_30 Str_1_Par_Ref, Str_30 Str_2_Par_Ref); +Boolean Func_3 (Enumeration Enum_Par_Val); + diff --git a/Cortex-M0/nanosoc/software/common/dhry/dhry_1.c b/Cortex-M0/nanosoc/software/common/dhry/dhry_1.c new file mode 100644 index 0000000..090af85 --- /dev/null +++ b/Cortex-M0/nanosoc/software/common/dhry/dhry_1.c @@ -0,0 +1,465 @@ +/* +This is a MODIFIED version of the Dhrystone 2.1 Benchmark program. + +The only changes which have been made are: +1) the 'old-style' K&R function declarations have been replaced with +'ANSI-C-style' function declarations (in dhry_1.c and dhry_2,c), and +2) function prototypes have been added (in dhry.h) +3) dhry.h uses CLOCKS_PER_SEC instead of CLK_TCK (to build with -strict) + +These changes allow an ANSI-C compiler to produce more efficient code, with +no warnings. +*/ + +/* + **************************************************************************** + * + * "DHRYSTONE" Benchmark Program + * ----------------------------- + * + * Version: C, Version 2.1 + * + * File: dhry_1.c (part 2 of 3) + * + * Date: May 25, 1988 + * + * Author: Reinhold P. Weicker + * + **************************************************************************** + */ + +#ifdef CORTEX_M0 +#include "CMSDK_CM0.h" +#endif +#ifdef CORTEX_M0PLUS +#include "CMSDK_CM0plus.h" +#endif +#ifdef CORTEX_M3 +#include "CMSDK_CM3.h" +#endif +#ifdef CORTEX_M4 +#include "CMSDK_CM4.h" +#endif +#include "uart_stdout.h" +#define EXPECTED_SYST +#define MSC_CLOCK +#include "dhry.h" + +/* Global Variables: */ + +Rec_Pointer Ptr_Glob, + Next_Ptr_Glob; +int Int_Glob; +Boolean Bool_Glob; +char Ch_1_Glob, + Ch_2_Glob; +int Arr_1_Glob [50]; +int Arr_2_Glob [50] [50]; + +#ifndef REG + Boolean Reg = false; +#define REG + /* REG becomes defined as empty */ + /* i.e. no register variables */ +#else + Boolean Reg = true; +#endif + +/* variables for time measurement: */ + +#ifdef TIMES +struct tms time_info; +extern int times (void); + /* see library function "times" */ +#define Too_Small_Time (2*HZ) + /* Measurements should last at least about 2 seconds */ +#endif +#ifdef TIME +extern long time(long *); + /* see library function "time" */ +#define Too_Small_Time 2 + /* Measurements should last at least 2 seconds */ +#endif +#ifdef MSC_CLOCK +extern clock_t clock(void); +#define Too_Small_Time (2*HZ) +#endif + +long Begin_Time, + End_Time, + User_Time; +float Microseconds, + Dhrystones_Per_Second; + +#ifdef NOMSG +/*extern void EarlyExit(void);*/ +#endif + +/* end of variables for time measurement */ + + +int main (void) +/*****/ + + /* main program, corresponds to procedures */ + /* Main and Proc_0 in the Ada version */ +{ + One_Fifty Int_1_Loc; + REG One_Fifty Int_2_Loc; + One_Fifty Int_3_Loc; + REG char Ch_Index; + Enumeration Enum_Loc; + Str_30 Str_1_Loc; + Str_30 Str_2_Loc; + REG int Run_Index; + REG int Number_Of_Runs; + + // UART init + UartStdOutInit(); + + /* Initializations */ + + Next_Ptr_Glob = (Rec_Pointer) malloc (sizeof (Rec_Type)); + Ptr_Glob = (Rec_Pointer) malloc (sizeof (Rec_Type)); + + Ptr_Glob->Ptr_Comp = Next_Ptr_Glob; + Ptr_Glob->Discr = Ident_1; + Ptr_Glob->variant.var_1.Enum_Comp = Ident_3; + Ptr_Glob->variant.var_1.Int_Comp = 40; + strcpy (Ptr_Glob->variant.var_1.Str_Comp, + "DHRYSTONE PROGRAM, SOME STRING"); + strcpy (Str_1_Loc, "DHRYSTONE PROGRAM, 1'ST STRING"); + + Arr_2_Glob [8][7] = 10; + /* Was missing in published program. Without this statement, */ + /* Arr_2_Glob [8][7] would have an undefined value. */ + /* Warning: With 16-Bit processors and Number_Of_Runs > 32000, */ + /* overflow may occur for this array element. */ + +#ifdef NOMSG + Number_Of_Runs = ITERATIONS; +#else + printf ("\n"); + printf ("Dhrystone Benchmark, Version 2.1 (Language: C)\n"); + printf ("\n"); + if (Reg) + { + printf ("Program compiled with 'register' attribute\n"); + printf ("\n"); + } + else + { + printf ("Program compiled without 'register' attribute\n"); + printf ("\n"); + } + printf ("Please give the number of runs through the benchmark: "); + { + //int n; + // scanf ("%d", &n); + Number_Of_Runs = ITERATIONS; + } + printf ("\n"); + + printf ("Execution starts, %d runs through Dhrystone\n", Number_Of_Runs); +#endif + + /***************/ + /* Start timer */ + /***************/ + +#ifdef TIMES + times (&time_info); + Begin_Time = (long) time_info.tms_utime; +#endif +#ifdef TIME + Begin_Time = time ( (long *) 0); +#endif +#ifdef MSC_CLOCK +#ifdef EXPECTED_SYST + SysTick->LOAD = 0x00FFFFFF; /* Reload value : lots of time */ + SysTick->VAL = 0x0; /* Current value clear to 0x0 */ + SysTick->CTRL = 0x5; /* Enable systick, no interrupt */ + while (SysTick->VAL == 0); /* wait until current value reloaded */ + Begin_Time = SysTick->VAL; +#else + Begin_Time = 0; +#endif +#endif + for (Run_Index = 1; Run_Index <= Number_Of_Runs; ++Run_Index) + { + + Proc_5(); + Proc_4(); + /* Ch_1_Glob == 'A', Ch_2_Glob == 'B', Bool_Glob == true */ + Int_1_Loc = 2; + Int_2_Loc = 3; + strcpy (Str_2_Loc, "DHRYSTONE PROGRAM, 2'ND STRING"); + Enum_Loc = Ident_2; + Bool_Glob = ! Func_2 (Str_1_Loc, Str_2_Loc); + /* Bool_Glob == 1 */ + while (Int_1_Loc < Int_2_Loc) /* loop body executed once */ + { + Int_3_Loc = 5 * Int_1_Loc - Int_2_Loc; + /* Int_3_Loc == 7 */ + Proc_7 (Int_1_Loc, Int_2_Loc, &Int_3_Loc); + /* Int_3_Loc == 7 */ + Int_1_Loc += 1; + } /* while */ + /* Int_1_Loc == 3, Int_2_Loc == 3, Int_3_Loc == 7 */ + Proc_8 (Arr_1_Glob, Arr_2_Glob, Int_1_Loc, Int_3_Loc); + /* Int_Glob == 5 */ + Proc_1 (Ptr_Glob); + for (Ch_Index = 'A'; Ch_Index <= Ch_2_Glob; ++Ch_Index) + /* loop body executed twice */ + { + if (Enum_Loc == Func_1 (Ch_Index, 'C')) + /* then, not executed */ + { + Proc_6 (Ident_1, &Enum_Loc); + strcpy (Str_2_Loc, "DHRYSTONE PROGRAM, 3'RD STRING"); + Int_2_Loc = Run_Index; + Int_Glob = Run_Index; + } + } + /* Int_1_Loc == 3, Int_2_Loc == 3, Int_3_Loc == 7 */ + Int_2_Loc = Int_2_Loc * Int_1_Loc; + Int_1_Loc = Int_2_Loc / Int_3_Loc; + Int_2_Loc = 7 * (Int_2_Loc - Int_3_Loc) - Int_1_Loc; + /* Int_1_Loc == 1, Int_2_Loc == 13, Int_3_Loc == 7 */ + Proc_2 (&Int_1_Loc); + /* Int_1_Loc == 5 */ + + } /* loop "for Run_Index" */ + +#ifdef EARLY_EXIT + exit(0); +#endif + /**************/ + /* Stop timer */ + /**************/ + +#ifdef TIMES + times (&time_info); + End_Time = (long) time_info.tms_utime; +#endif +#ifdef TIME + End_Time = time ( (long *) 0); +#endif +#ifdef MSC_CLOCK +#ifdef EXPECTED_SYST + End_Time = SysTick->VAL; // Get current value; +#else + End_Time = 1; +#endif +#endif + +#ifdef NOMSG + +#ifdef ENABLE_THUMB + printf ("\n"); + printf ("\n"); + exit(1); +#else + exit(0); + /*EarlyExit();*/ +#endif + +/* Uncomment these lines if compiling with tcc (thumb) */ +#endif + + printf ("Execution ends\n"); + printf ("\n"); + printf ("Final values of the variables used in the benchmark:\n"); + printf ("\n"); + printf ("Int_Glob: %d\n", Int_Glob); + printf (" should be: %d\n", 5); + printf ("Bool_Glob: %d\n", Bool_Glob); + printf (" should be: %d\n", 1); + printf ("Ch_1_Glob: %c\n", Ch_1_Glob); + printf (" should be: %c\n", 'A'); + printf ("Ch_2_Glob: %c\n", Ch_2_Glob); + printf (" should be: %c\n", 'B'); + printf ("Arr_1_Glob[8]: %d\n", Arr_1_Glob[8]); + printf (" should be: %d\n", 7); + printf ("Arr_2_Glob[8][7]: %d\n", Arr_2_Glob[8][7]); + printf (" should be: Number_Of_Runs + 10\n"); + printf ("Ptr_Glob->\n"); + printf (" Ptr_Comp: %d\n", (int) Ptr_Glob->Ptr_Comp); + printf (" should be: (implementation-dependent)\n"); + printf (" Discr: %d\n", Ptr_Glob->Discr); + printf (" should be: %d\n", 0); + printf (" Enum_Comp: %d\n", Ptr_Glob->variant.var_1.Enum_Comp); + printf (" should be: %d\n", 2); + printf (" Int_Comp: %d\n", Ptr_Glob->variant.var_1.Int_Comp); + printf (" should be: %d\n", 17); + printf (" Str_Comp: %s\n", Ptr_Glob->variant.var_1.Str_Comp); + printf (" should be: DHRYSTONE PROGRAM, SOME STRING\n"); + printf ("Next_Ptr_Glob->\n"); + printf (" Ptr_Comp: %d\n", (int) Next_Ptr_Glob->Ptr_Comp); + printf (" should be: (implementation-dependent), same as above\n"); + printf (" Discr: %d\n", Next_Ptr_Glob->Discr); + printf (" should be: %d\n", 0); + printf (" Enum_Comp: %d\n", Next_Ptr_Glob->variant.var_1.Enum_Comp); + printf (" should be: %d\n", 1); + printf (" Int_Comp: %d\n", Next_Ptr_Glob->variant.var_1.Int_Comp); + printf (" should be: %d\n", 18); + printf (" Str_Comp: %s\n", + Next_Ptr_Glob->variant.var_1.Str_Comp); + printf (" should be: DHRYSTONE PROGRAM, SOME STRING\n"); + printf ("Int_1_Loc: %d\n", Int_1_Loc); + printf (" should be: %d\n", 5); + printf ("Int_2_Loc: %d\n", Int_2_Loc); + printf (" should be: %d\n", 13); + printf ("Int_3_Loc: %d\n", Int_3_Loc); + printf (" should be: %d\n", 7); + printf ("Enum_Loc: %d\n", Enum_Loc); + printf (" should be: %d\n", 1); + printf ("Str_1_Loc: %s\n", Str_1_Loc); + printf (" should be: DHRYSTONE PROGRAM, 1'ST STRING\n"); + printf ("Str_2_Loc: %s\n", Str_2_Loc); + printf (" should be: DHRYSTONE PROGRAM, 2'ND STRING\n"); + printf ("\n"); + +#ifdef EXPECTED_SYST + User_Time = Begin_Time - End_Time; // SysTick is a decrement counter +#else + User_Time = End_Time - Begin_Time; +#endif + + +#ifdef EXPECTED_SYST + printf ("Number of cycles for %d iteration is %d\n",Number_Of_Runs,User_Time); + +#else + if (User_Time < Too_Small_Time) + { + printf ("Measured time too small to obtain meaningful results\n"); + printf ("Please increase number of runs\n"); + printf ("\n"); + } + else + { +#ifdef TIME + Microseconds = (float) User_Time * Mic_secs_Per_Second + / (float) Number_Of_Runs; + Dhrystones_Per_Second = (float) Number_Of_Runs / (float) User_Time; +#else + + Microseconds = (float) User_Time * Mic_secs_Per_Second + / ((float) HZ * ((float) Number_Of_Runs)); + Dhrystones_Per_Second = ((float) HZ * (float) Number_Of_Runs) + / (float) User_Time; +#endif + printf ("Microseconds for one run through Dhrystone: "); + printf ("%6.1f \n", Microseconds); + printf ("Dhrystones per Second: "); + printf ("%6.1f \n", Dhrystones_Per_Second); + printf ("\n"); + } + +#endif + printf ("** TEST PASSED ** \n"); + UartPutc((char) 0x4); /* end simulation */ + return 0; +} + + +void Proc_1 (REG Rec_Pointer Ptr_Val_Par) +/******************/ + /* executed once */ +{ + REG Rec_Pointer Next_Record = Ptr_Val_Par->Ptr_Comp; + /* == Ptr_Glob_Next */ + /* Local variable, initialized with Ptr_Val_Par->Ptr_Comp, */ + /* corresponds to "rename" in Ada, "with" in Pascal */ + + structassign (*Ptr_Val_Par->Ptr_Comp, *Ptr_Glob); + Ptr_Val_Par->variant.var_1.Int_Comp = 5; + Next_Record->variant.var_1.Int_Comp + = Ptr_Val_Par->variant.var_1.Int_Comp; + Next_Record->Ptr_Comp = Ptr_Val_Par->Ptr_Comp; + Proc_3 (&Next_Record->Ptr_Comp); + /* Ptr_Val_Par->Ptr_Comp->Ptr_Comp + == Ptr_Glob->Ptr_Comp */ + if (Next_Record->Discr == Ident_1) + /* then, executed */ + { + Next_Record->variant.var_1.Int_Comp = 6; + Proc_6 (Ptr_Val_Par->variant.var_1.Enum_Comp, + &Next_Record->variant.var_1.Enum_Comp); + Next_Record->Ptr_Comp = Ptr_Glob->Ptr_Comp; + Proc_7 (Next_Record->variant.var_1.Int_Comp, 10, + &Next_Record->variant.var_1.Int_Comp); + } + else /* not executed */ + structassign (*Ptr_Val_Par, *Ptr_Val_Par->Ptr_Comp); +} /* Proc_1 */ + + +void Proc_2 (One_Fifty *Int_Par_Ref) +/******************/ + /* executed once */ + /* *Int_Par_Ref == 1, becomes 4 */ +{ + One_Fifty Int_Loc; + Enumeration Enum_Loc; + + Int_Loc = *Int_Par_Ref + 10; + do /* executed once */ + if (Ch_1_Glob == 'A') + /* then, executed */ + { + Int_Loc -= 1; + *Int_Par_Ref = Int_Loc - Int_Glob; + Enum_Loc = Ident_1; + } /* if */ + while (Enum_Loc != Ident_1); /* true */ +} /* Proc_2 */ + + +void Proc_3 (Rec_Pointer *Ptr_Ref_Par) +/******************/ + /* executed once */ + /* Ptr_Ref_Par becomes Ptr_Glob */ +{ + if (Ptr_Glob != Null) + /* then, executed */ + *Ptr_Ref_Par = Ptr_Glob->Ptr_Comp; + Proc_7 (10, Int_Glob, &Ptr_Glob->variant.var_1.Int_Comp); +} /* Proc_3 */ + + +void Proc_4 (void) /* without parameters */ +/*******/ + /* executed once */ +{ + Boolean Bool_Loc; + + Bool_Loc = Ch_1_Glob == 'A'; + Bool_Glob = Bool_Loc | Bool_Glob; + Ch_2_Glob = 'B'; +} /* Proc_4 */ + + +void Proc_5 (void) /* without parameters */ +/*******/ + /* executed once */ +{ + Ch_1_Glob = 'A'; + Bool_Glob = false; +} /* Proc_5 */ + + + /* Procedure for the assignment of structures, */ + /* if the C compiler doesn't support this feature */ +#ifdef NOSTRUCTASSIGN +memcpy (d, s, l) +register char *d; +register char *s; +register int l; +{ + while (l--) *d++ = *s++; +} +#endif + + diff --git a/Cortex-M0/nanosoc/software/common/dhry/dhry_2.c b/Cortex-M0/nanosoc/software/common/dhry/dhry_2.c new file mode 100644 index 0000000..b123ae9 --- /dev/null +++ b/Cortex-M0/nanosoc/software/common/dhry/dhry_2.c @@ -0,0 +1,190 @@ +/* +This is a MODIFIED version of the Dhrystone 2.1 Benchmark program. + +The only changes which have been made are: +1) the 'old-style' K&R function declarations have been replaced with +'ANSI-C-style' function declarations (in dhry_1.c and dhry_2,c), and +2) function prototypes have been added (in dhry.h) +3) dhry.h uses CLOCKS_PER_SEC instead of CLK_TCK (to build with -strict) + +These changes allow an ANSI-C compiler to produce more efficient code, with +no warnings. +*/ + +/* + **************************************************************************** + * + * "DHRYSTONE" Benchmark Program + * ----------------------------- + * + * Version: C, Version 2.1 + * + * File: dhry_2.c (part 3 of 3) + * + * Date: May 25, 1988 + * + * Author: Reinhold P. Weicker + * + **************************************************************************** + */ + +#ifndef COMBINED +#include "dhry.h" +#endif + +#ifndef REG +#define REG + /* REG becomes defined as empty */ + /* i.e. no register variables */ +#endif + +extern int Int_Glob; +extern char Ch_1_Glob; + + +void Proc_6 (Enumeration Enum_Val_Par, Enumeration *Enum_Ref_Par) +/*********************************/ + /* executed once */ + /* Enum_Val_Par == Ident_3, Enum_Ref_Par becomes Ident_2 */ +{ + *Enum_Ref_Par = Enum_Val_Par; + if (! Func_3 (Enum_Val_Par)) + /* then, not executed */ + *Enum_Ref_Par = Ident_4; + switch (Enum_Val_Par) + { + case Ident_1: + *Enum_Ref_Par = Ident_1; + break; + case Ident_2: + if (Int_Glob > 100) + /* then */ + *Enum_Ref_Par = Ident_1; + else *Enum_Ref_Par = Ident_4; + break; + case Ident_3: /* executed */ + *Enum_Ref_Par = Ident_2; + break; + case Ident_4: break; + case Ident_5: + *Enum_Ref_Par = Ident_3; + break; + } /* switch */ +} /* Proc_6 */ + + +void Proc_7 (One_Fifty Int_1_Par_Val, One_Fifty Int_2_Par_Val, One_Fifty *Int_Par_Ref) +/**********************************************/ + /* executed three times */ + /* first call: Int_1_Par_Val == 2, Int_2_Par_Val == 3, */ + /* Int_Par_Ref becomes 7 */ + /* second call: Int_1_Par_Val == 10, Int_2_Par_Val == 5, */ + /* Int_Par_Ref becomes 17 */ + /* third call: Int_1_Par_Val == 6, Int_2_Par_Val == 10, */ + /* Int_Par_Ref becomes 18 */ +{ + One_Fifty Int_Loc; + + Int_Loc = Int_1_Par_Val + 2; + *Int_Par_Ref = Int_2_Par_Val + Int_Loc; +} /* Proc_7 */ + + +void Proc_8 (Arr_1_Dim Arr_1_Par_Ref, Arr_2_Dim Arr_2_Par_Ref, int Int_1_Par_Val, int Int_2_Par_Val) +/*********************************************************************/ + /* executed once */ + /* Int_Par_Val_1 == 3 */ + /* Int_Par_Val_2 == 7 */ +{ + REG One_Fifty Int_Index; + REG One_Fifty Int_Loc; + + Int_Loc = Int_1_Par_Val + 5; + Arr_1_Par_Ref [Int_Loc] = Int_2_Par_Val; + Arr_1_Par_Ref [Int_Loc+1] = Arr_1_Par_Ref [Int_Loc]; + Arr_1_Par_Ref [Int_Loc+30] = Int_Loc; + for (Int_Index = Int_Loc; Int_Index <= Int_Loc+1; ++Int_Index) + Arr_2_Par_Ref [Int_Loc] [Int_Index] = Int_Loc; + Arr_2_Par_Ref [Int_Loc] [Int_Loc-1] += 1; + Arr_2_Par_Ref [Int_Loc+20] [Int_Loc] = Arr_1_Par_Ref [Int_Loc]; + Int_Glob = 5; +} /* Proc_8 */ + + +Enumeration Func_1 (Capital_Letter Ch_1_Par_Val, Capital_Letter Ch_2_Par_Val) +/*************************************************/ + /* executed three times */ + /* first call: Ch_1_Par_Val == 'H', Ch_2_Par_Val == 'R' */ + /* second call: Ch_1_Par_Val == 'A', Ch_2_Par_Val == 'C' */ + /* third call: Ch_1_Par_Val == 'B', Ch_2_Par_Val == 'C' */ +{ + Capital_Letter Ch_1_Loc; + Capital_Letter Ch_2_Loc; + + Ch_1_Loc = Ch_1_Par_Val; + Ch_2_Loc = Ch_1_Loc; + if (Ch_2_Loc != Ch_2_Par_Val) + /* then, executed */ + return (Ident_1); + else /* not executed */ + { + Ch_1_Glob = Ch_1_Loc; + return (Ident_2); + } +} /* Func_1 */ + + +Boolean Func_2 (Str_30 Str_1_Par_Ref, Str_30 Str_2_Par_Ref) +/*************************************************/ + /* executed once */ + /* Str_1_Par_Ref == "DHRYSTONE PROGRAM, 1'ST STRING" */ + /* Str_2_Par_Ref == "DHRYSTONE PROGRAM, 2'ND STRING" */ +{ + REG One_Thirty Int_Loc; + Capital_Letter Ch_Loc; + + Int_Loc = 2; + while (Int_Loc <= 2) /* loop body executed once */ + if (Func_1 (Str_1_Par_Ref[Int_Loc], + Str_2_Par_Ref[Int_Loc+1]) == Ident_1) + /* then, executed */ + { + Ch_Loc = 'A'; + Int_Loc += 1; + } /* if, while */ + if (Ch_Loc >= 'W' && Ch_Loc < 'Z') + /* then, not executed */ + Int_Loc = 7; + if (Ch_Loc == 'R') + /* then, not executed */ + return (true); + else /* executed */ + { + if (strcmp (Str_1_Par_Ref, Str_2_Par_Ref) > 0) + /* then, not executed */ + { + Int_Loc += 7; + Int_Glob = Int_Loc; + return (true); + } + else /* executed */ + return (false); + } /* if Ch_Loc */ +} /* Func_2 */ + + +Boolean Func_3 (Enumeration Enum_Par_Val) +/***************************/ + /* executed once */ + /* Enum_Par_Val == Ident_3 */ +{ + Enumeration Enum_Loc; + + Enum_Loc = Enum_Par_Val; + if (Enum_Loc == Ident_3) + /* then, executed */ + return (true); + else /* not executed */ + return (false); +} /* Func_3 */ + diff --git a/Cortex-M0/nanosoc/software/common/retarget/retarget.c b/Cortex-M0/nanosoc/software/common/retarget/retarget.c new file mode 100644 index 0000000..5a9ed20 --- /dev/null +++ b/Cortex-M0/nanosoc/software/common/retarget/retarget.c @@ -0,0 +1,86 @@ +/* + *----------------------------------------------------------------------------- + * The confidential and proprietary information contained in this file may + * only be used by a person authorised under and to the extent permitted + * by a subsisting licensing agreement from Arm Limited or its affiliates. + * + * (C) COPYRIGHT 2010-2013 Arm Limited or its affiliates. + * ALL RIGHTS RESERVED + * + * This entire notice must be reproduced on all copies of this file + * and copies of this file may only be made by a person if such person is + * permitted to do so under the terms of a subsisting license agreement + * from Arm Limited or its affiliates. + * + * SVN Information + * + * Checked In : $Date: 2017-10-10 15:55:38 +0100 (Tue, 10 Oct 2017) $ + * + * Revision : $Revision: 371321 $ + * + * Release Information : Cortex-M System Design Kit-r1p1-00rel0 + *----------------------------------------------------------------------------- + */ + + +#if defined ( __CC_ARM ) +/******************************************************************************/ +/* Retarget functions for ARM DS-5 Professional / Keil MDK */ +/******************************************************************************/ + +#include <stdio.h> +#include <time.h> +#include <rt_misc.h> +#pragma import(__use_no_semihosting_swi) + +extern unsigned char UartGetc(void); +extern unsigned char UartPutc(unsigned char my_ch); +struct __FILE { int handle; /* Add whatever you need here */ }; +FILE __stdout; +FILE __stdin; + + +int fputc(int ch, FILE *f) { + return (UartPutc(ch)); +} + +int fgetc(FILE *f) { + return (UartPutc(UartGetc())); +} + +int ferror(FILE *f) { + /* Your implementation of ferror */ + return EOF; +} + + +void _ttywrch(int ch) { + UartPutc (ch); +} + + +void _sys_exit(int return_code) { +label: goto label; /* endless loop */ +} + +#else + +/******************************************************************************/ +/* Retarget functions for GNU Tools for ARM Embedded Processors */ +/******************************************************************************/ +#include <stdio.h> +#include <sys/stat.h> + +extern unsigned char UartPutc(unsigned char my_ch); + +__attribute__ ((used)) int _write (int fd, char *ptr, int len) +{ + size_t i; + for (i=0; i<len;i++) { + UartPutc(ptr[i]); // call character output function + } + return len; +} + + +#endif diff --git a/Cortex-M0/nanosoc/software/common/retarget/uart_stdout.c b/Cortex-M0/nanosoc/software/common/retarget/uart_stdout.c new file mode 100644 index 0000000..a962275 --- /dev/null +++ b/Cortex-M0/nanosoc/software/common/retarget/uart_stdout.c @@ -0,0 +1,78 @@ +/* + *----------------------------------------------------------------------------- + * The confidential and proprietary information contained in this file may + * only be used by a person authorised under and to the extent permitted + * by a subsisting licensing agreement from Arm Limited or its affiliates. + * + * (C) COPYRIGHT 2010-2013 Arm Limited or its affiliates. + * ALL RIGHTS RESERVED + * + * This entire notice must be reproduced on all copies of this file + * and copies of this file may only be made by a person if such person is + * permitted to do so under the terms of a subsisting license agreement + * from Arm Limited or its affiliates. + * + * SVN Information + * + * Checked In : $Date: 2017-10-10 15:55:38 +0100 (Tue, 10 Oct 2017) $ + * + * Revision : $Revision: 371321 $ + * + * Release Information : Cortex-M System Design Kit-r1p1-00rel0 + *----------------------------------------------------------------------------- + */ + + /* + + UART functions for retargetting + + */ +#ifdef CORTEX_M0 +#include "CMSDK_CM0.h" +#endif + +#ifdef CORTEX_M0PLUS +#include "CMSDK_CM0plus.h" +#endif + +#ifdef CORTEX_M3 +#include "CMSDK_CM3.h" +#endif + +#ifdef CORTEX_M4 +#include "CMSDK_CM4.h" +#endif + +void UartStdOutInit(void) +{ +// CMSDK_UART2->BAUDDIV = 16; +// CMSDK_UART2->CTRL = 0x41; // High speed test mode, TX only + CMSDK_UART2->BAUDDIV = 2080; //(1MHz/9600) + CMSDK_UART2->CTRL = 0x01; //TX only, standard UART + CMSDK_USRT2->BAUDDIV = 2080; //(1MHz/9600) + CMSDK_USRT2->CTRL = 0x01; //TX only, standard UART + CMSDK_GPIO1->ALTFUNCSET = (1<<5); + return; +} +// Output a character +unsigned char UartPutc(unsigned char my_ch) +{ + while ((CMSDK_UART2->STATE & 1)); // Wait if Transmit Holding register is full + CMSDK_UART2->DATA = my_ch; // write to transmit holding register + while ((CMSDK_USRT2->STATE & 1)); // Wait if Transmit Holding register is full + CMSDK_USRT2->DATA = my_ch; // write to transmit holding register + return (my_ch); +} +// Get a character +unsigned char UartGetc(void) +{ + while ((CMSDK_UART2->STATE & 2)==0); // Wait if Receive Holding register is empty + return (CMSDK_UART2->DATA); +} + +void UartEndSimulation(void) +{ + UartPutc((char) 0x4); // End of simulation + while(1); +} + diff --git a/Cortex-M0/nanosoc/software/common/retarget/uart_stdout.h b/Cortex-M0/nanosoc/software/common/retarget/uart_stdout.h new file mode 100644 index 0000000..ec0f88b --- /dev/null +++ b/Cortex-M0/nanosoc/software/common/retarget/uart_stdout.h @@ -0,0 +1,30 @@ +/* + *----------------------------------------------------------------------------- + * The confidential and proprietary information contained in this file may + * only be used by a person authorised under and to the extent permitted + * by a subsisting licensing agreement from Arm Limited or its affiliates. + * + * (C) COPYRIGHT 2010-2013 Arm Limited or its affiliates. + * ALL RIGHTS RESERVED + * + * This entire notice must be reproduced on all copies of this file + * and copies of this file may only be made by a person if such person is + * permitted to do so under the terms of a subsisting license agreement + * from Arm Limited or its affiliates. + * + * SVN Information + * + * Checked In : $Date: 2017-10-10 15:55:38 +0100 (Tue, 10 Oct 2017) $ + * + * Revision : $Revision: 371321 $ + * + * Release Information : Cortex-M System Design Kit-r1p1-00rel0 + *----------------------------------------------------------------------------- + */ +/* Functions for stdout during simulation */ +/* The functions are implemented in shared/software/common/uart_stdout.c */ + +extern void UartStdOutInit(void); +extern unsigned char UartPutc(unsigned char my_ch); +extern unsigned char UartGetc(void); +extern unsigned char UartEndSimulation(void); diff --git a/Cortex-M0/nanosoc/software/common/romtable_tests/romtable_tests.c b/Cortex-M0/nanosoc/software/common/romtable_tests/romtable_tests.c new file mode 100644 index 0000000..f2ffb83 --- /dev/null +++ b/Cortex-M0/nanosoc/software/common/romtable_tests/romtable_tests.c @@ -0,0 +1,607 @@ +/* + *----------------------------------------------------------------------------- + * The confidential and proprietary information contained in this file may + * only be used by a person authorised under and to the extent permitted + * by a subsisting licensing agreement from Arm Limited or its affiliates. + * + * (C) COPYRIGHT 2011-2013 Arm Limited or its affiliates. + * ALL RIGHTS RESERVED + * + * This entire notice must be reproduced on all copies of this file + * and copies of this file may only be made by a person if such person is + * permitted to do so under the terms of a subsisting license agreement + * from Arm Limited or its affiliates. + * + * SVN Information + * + * Checked In : $Date: 2017-10-10 15:55:38 +0100 (Tue, 10 Oct 2017) $ + * + * Revision : $Revision: 371321 $ + * + * Release Information : Cortex-M System Design Kit-r1p1-00rel0 + *----------------------------------------------------------------------------- + */ + +//============================================================================== +// +// CORTEX-M System Design Kit ROM Table Test +// +//============================================================================== +// +// This test checks that is it possible to locate the CORTEX-M0+ architected +// ROM table by following the CoreSight Component pointer from the DAP. +// The ID values found in any intermediate ROM tables are displayed. +// +// The test passes if it finds the CORTEX-M0+ ROM Table (and the CoreSight MTB-M0+ +// ROM Table if MTB is included) +// +// If DBG is not included, this test skips. +// + +#ifdef CORTEX_M0 +#include "CMSDK_CM0.h" +#include "core_cm0.h" + +#else +#ifdef CORTEX_M0PLUS +#include "CMSDK_CM0plus.h" +#include "core_cm0plus.h" + +#else +#ifdef CORTEX_M3 +#include "CMSDK_CM3.h" +#include "core_cm3.h" + +#else +#ifdef CORTEX_M4 +#include "CMSDK_CM4.h" +#include "core_cm4.h" + +#endif +#endif +#endif +#endif + +#include <stdio.h> +#include "uart_stdout.h" // for stdout +#include "mcu_debugtester_interface.h" // For definition of interface to the debug tester +#include "CMSDK_driver.h" // For GPIO functions in debug tester communication + +#include "config_id.h" // Needed for ID and configuration values + +#include "debugtester_functions.h" // For communication between processor under test and the debug tester + +#include "romtable_tests.h" // Defines known CS parts + + +//===================================================================== +// Global Variables +//===================================================================== + +// Structure to store Component Address, CID, PID, reference count +typedef struct +{ + uint32_t address; // Component Base Address + uint32_t cid; // CoreSight Component ID CID3:0 + uint32_t pid1; // CoreSight Peripheral ID PID3:0 + uint32_t pid2; // CoreSight Peripheral ID PID7:4 + uint8_t jepid; // Decoded PID: JEP Identity + uint8_t jepcont; // Decoded PID: JEP Continuation code count + uint16_t partnum; // Decoded PID: Part Number + uint8_t revision; // Decoded PID: Part Revision + uint8_t revand; // Decoded PID: Revision ECO + uint8_t custmod; // Decoded PID: Customer Modification + uint8_t isarm; // Part has ARM JEPID + uint8_t ciderror; // Error in the CID fields + uint8_t piderror; // Error in the PID fields + uint32_t refcount; // Number of times referenced + uint32_t romcount; // ROM Table Number +} CS_Type; + +// Maximum number of components +#define COMPMAX 10 + +// Array to store all discovered CoreSight components +CS_Type Components[COMPMAX]; + +// Number of unique ROM tables found +uint32_t NumRomTables = 0; + +// error count +uint32_t Errors = 0; + +//===================================================================== +// Function Prototypes +//===================================================================== +// Function to check CID, PID, part number of a component. +// If it is a ROM table, also scan through ROM table entries +void FollowCoreSightPointer (uint32_t cs_pointer); + +// Simple compare function and output error message if needed +uint32_t CheckVal(char *name, uint32_t actual, uint32_t expected); +void CheckHex(char *name, uint32_t actual, uint32_t expected); +void CheckPresence(char *name, uint32_t actual, uint32_t expected); +void InitComponentsList(void); +void ReportResults(void); +CS_Type * FindComponent(uint32_t base_address); + +// Compare the CID and PID based on Part Number +void GetCoreSightIDs(CS_Type * comp_ptr); +void CheckDisplayCID (CS_Type * comp_ptr); +void CheckDisplayPID (CS_Type * comp_ptr); +void DisplayDecodedPID (CS_Type * comp_ptr); +uint32_t LookupARMCSPart(uint32_t); + +//===================================================================== +// Main code +//===================================================================== + +int main (void) +{ + // UART init + UartStdOutInit(); + + InitComponentsList(); + + // Banner + printf("%s - ROM Table Test\n\n", MCU_CPU_NAME); + + if(EXPECTED_DBG != 1) + { + puts("** TEST SKIPPED ** Core does not include DBG, skipping test\n"); + return 1; + } + else + { + EnableDebugTester(); + + puts("\tROM Test is now ready\n"); + + // + // Initialise Debug Driver to correct protocol + // + if(EXPECTED_JTAGnSW) + { + CallDebugTester(FnSetInterfaceJTAG); + } + else + { + if(CallDebugTester(FnSetInterfaceSW) != TEST_PASS) + { + puts("FAIL: Serial Wire Mode not set correctly\n"); + Errors++; + } + } + + // Turn on the DAP + if(CallDebugTester(FnDAPPowerUp) != TEST_PASS) + { + puts("Failed to power up the DAP\n"); + Errors++; + } + else + { + // Find BASE + DEBUGTESTERDATA[0] = 0xf8; // BASE + + CallDebugTester(FnGetAPReg); + printf("----------\nDAP BASE entry is : 0x%08x", DEBUGTESTERDATA[0]); + +#ifdef CORTEX_M3 + // Enable Trace to make DWT, ITM and TPIU visible + CoreDebug->DEMCR |= CoreDebug_DEMCR_TRCENA_Msk; +#endif +#ifdef CORTEX_M4 + // Enable Trace to make DWT, ITM and TPIU visible + CoreDebug->DEMCR |= CoreDebug_DEMCR_TRCENA_Msk; +#endif + + // Start decoding + FollowCoreSightPointer(DEBUGTESTERDATA[0]); + + puts("----------\n\n"); + } + + // Turn off DAP + CallDebugTester(FnDAPPowerDown); + + // Report results + ReportResults(); + } + DisableDebugTester(); +} + + +void FollowCoreSightPointer (uint32_t cs_pointer) +{ + // + // Enter with a pointer to a CoreSight component + // + + uint32_t base_addr = cs_pointer & 0xFFFFF000; + uint32_t entry; + uint32_t i; + CS_Type * comp_ptr = NULL; + + + // Check if pointer points to anything + + switch(cs_pointer & 0x3) + { + case 0x0: + puts(" - Non Zero Entry not present, not in 32bit format\n"); + Errors++; + break; + + case 0x1: + puts(" - Entry marked as present but not in 32 bit format\n"); + Errors++; + break; + + case 0x2: + puts(" - Component not present\n"); + break; + + case 0x3: + // + // Component is present + // + printf(" - Component present at 0x%08x\n\nCoreSight ID of component at 0x%08x :\n\n",base_addr, base_addr); + + // Find or allocate space for this component in the Components array + comp_ptr = FindComponent(base_addr); + + // Get CID and PID for the component + GetCoreSightIDs(comp_ptr); + + // Detect duplicate entries here + if(comp_ptr->refcount > 1) + { + puts("** FAIL: This component is referenced more than once **\n"); + } + + // Check and Display CID + CheckDisplayCID(comp_ptr); + + // Check and Display PID + CheckDisplayPID(comp_ptr); + + // + // If component is a ROM Table, iterate over its entries + // + if(comp_ptr->romcount) + { + entry = 1; // Non zero initialisation value for loop + for(i = 0; entry > 0 ; i++) + { + // Get ROM Table Entry + DEBUGTESTERDATA[0] = base_addr + (i*4); + CallDebugTester(FnGetAPMem); + entry = DEBUGTESTERDATA[0]; + + printf("----------\nROM Table (%d) Entry %d at 0x%08x is : 0x%08x", comp_ptr->romcount, i, (base_addr + (i*4)), entry); + + if(entry != 0) + { + FollowCoreSightPointer(base_addr + entry); + } + else + { + puts(" - End of Table\n"); + } + } + } + } +} + + +void CheckDisplayCID (CS_Type * comp_ptr) +{ + // Display as raw byte values + + printf(" CID0: 0x%02x CID1: 0x%02x CID2: 0x%02x CID3: 0x%02x", + ( comp_ptr->cid & 0xFF), + ((comp_ptr->cid >> 8) & 0xFF), + ((comp_ptr->cid >> 16) & 0xFF), + ((comp_ptr->cid >> 24) & 0xFF)); + + comp_ptr->ciderror = 0; + + switch(comp_ptr->cid) + { + case 0xB105100D: + printf(" - ROM Table (%d)\n", comp_ptr->romcount); + break; + + case 0xB105900D: + puts(" - CoreSight Debug Component\n"); + break; + + case 0xB105E00D: + puts(" - ARM Core Memory Component\n"); + break; + + case 0xB105F00D: + puts(" - ARM Primecell\n"); + break; + + default: + puts(" - Unknown\n** FAIL: Unknown Component ID **\n"); + comp_ptr->ciderror = 1; + } +} + + +void CheckDisplayPID (CS_Type * comp_ptr) +{ + // Display as raw byte values + + printf(" PID0: 0x%02x PID1: 0x%02x PID2: 0x%02x PID3: 0x%02x\n", + ( comp_ptr->pid1 & 0xFF), + ((comp_ptr->pid1 >> 8) & 0xFF), + ((comp_ptr->pid1 >> 16) & 0xFF), + ((comp_ptr->pid1 >> 24) & 0xFF)); + + printf(" PID4: 0x%02x PID5: 0x%02x PID6: 0x%02x PID7: 0x%02x", + ( comp_ptr->pid2 & 0xFF), + ((comp_ptr->pid2 >> 8) & 0xFF), + ((comp_ptr->pid2 >> 16) & 0xFF), + ((comp_ptr->pid2 >> 24) & 0xFF)); + + comp_ptr->piderror = 0; + + // + // Display description for known components + // + if(comp_ptr->isarm) + { + // ARM JEP ID + LookupARMCSPart(comp_ptr->partnum); + } + else if((comp_ptr->jepid == EXPECTED_CUST_JEP_ID) && + (comp_ptr->jepcont == EXPECTED_CUST_JEP_CONT)) + { + // Customer JEP ID + puts(" - Customer Part\n"); + DisplayDecodedPID(comp_ptr); + if (comp_ptr->jepid == 0) + { + puts("** FAIL: Customer JEP ID shouldn't be zeroes or ARM's JEP ID! Please modify **\n"); + comp_ptr->piderror = 1; + } + } + else + { + // Unknown JEP ID + puts(" - Unknown JEP ID code\n"); + DisplayDecodedPID(comp_ptr); + puts("** FAIL: Unknown JEP ID code **\n"); + comp_ptr->piderror = 1; + } +} + + +void DisplayDecodedPID (CS_Type * comp_ptr) +{ + printf("\n JEP106 ID [6:0] = 0x%02x\n", comp_ptr->jepid); + printf( " JEP106 continuation = 0x%x\n", comp_ptr->jepcont); + printf( " part number [11:0] = 0x%03x\n", comp_ptr->partnum); + printf( " revision [3:0] = 0x%x\n", comp_ptr->revision); + printf( " revand [3:0] = 0x%x\n", comp_ptr->revand); + printf( " customer modified [3:0] = 0x%x\n\n", comp_ptr->custmod); +} + + +//=========================================================================== +// Generate error message if compare result does not match, +// also update error counter +//=========================================================================== +uint32_t CheckVal(char *name, uint32_t actual, uint32_t expected) +{ + // Quiet check - Only call CheckHex if there is a mismatch + if(actual != expected) + { + CheckHex(name, actual, expected); + return 1; // Error + } + return 0; +} + + +void InitComponentsList(void) +{ + uint32_t index; + for(index=0 ; index < COMPMAX ; index++) + { + Components[index].address = 0; + } +} + + +void ReportResults(void) +{ + // Iterate through the list + // Show errors where the same component is referenced by multiple paths + // Show error if we don't find the expected components - Core, MTB, CTI + + uint32_t CIDErrors = 0; + uint32_t PIDErrors = 0; + uint32_t REFErrors = 0; + + uint32_t index; + + for(index=0 ; index < COMPMAX; index++) + { + if(Components[index].address) + { + // Accumulate errors + CIDErrors += Components[index].ciderror; + PIDErrors += Components[index].piderror; + REFErrors += (Components[index].refcount > 1) ? 1 : 0; + } + } + + + if(CIDErrors) + { + printf("** FAIL: There were %d errors found with Component ID values **\n", CIDErrors); + } + + if(PIDErrors) + { + printf("** FAIL: There were %d errors found with Peripheral ID values **\n", PIDErrors); + } + + if(REFErrors) + { + printf("** FAIL: %d components were referenced more than once **\n", REFErrors); + } + + + // Update global Errors count + Errors += CIDErrors + PIDErrors + REFErrors; + + // Print final test result + if (Errors == 0) { + puts("** TEST PASSED **\n"); + } else { + printf("** TEST FAILED ** with %d errors\n", Errors); + } +} + + +void CheckPresence (char *name, uint32_t expected, uint32_t actual) +{ + if(expected && !actual) + { + printf("** FAIL: Did not find %s **\n", name); + Errors++; + } + + if(!expected && actual) + { + printf("** FAIL: Found unexpected %s **\n", name); + Errors++; + } +} + + +CS_Type * FindComponent (uint32_t base_address) +{ + uint32_t index = 0; + CS_Type * comp_ptr = NULL; + + while((index < COMPMAX) && (comp_ptr == NULL)) + { + if(Components[index].address == base_address) + { + Components[index].refcount++; + comp_ptr = &Components[index]; + index = COMPMAX; + } + else if(Components[index].address == 0) + { + // New component + Components[index].address = base_address; + Components[index].refcount = 1; + comp_ptr = &Components[index]; + index = COMPMAX; + } + else + { + index++; + } + } + + if(comp_ptr == NULL) + { + puts("** ERROR - Found too many components, increase COMPMAX and try again **\n"); + Errors++; + } + + return comp_ptr; +} + + +void GetCoreSightIDs(CS_Type * comp_ptr) +{ + // Only update the IDs if this is a new component + if(comp_ptr->refcount == 1) + { + // Use DebugDriver to get CID and PID + DEBUGTESTERDATA[0] = comp_ptr->address; + CallDebugTester(FnGetAPMemCSIDs); + comp_ptr->cid = DEBUGTESTERDATA[0]; + comp_ptr->pid1 = DEBUGTESTERDATA[1]; + comp_ptr->pid2 = DEBUGTESTERDATA[2]; + + + // Decode PID information + comp_ptr->jepid = (comp_ptr->pid1 >> 12) & 0x7F; + comp_ptr->jepcont = comp_ptr->pid2 & 0xF; + comp_ptr->partnum = comp_ptr->pid1 & 0xFFF; + comp_ptr->revision = (comp_ptr->pid1 >> 20) & 0xF; + comp_ptr->revand = (comp_ptr->pid1 >> 28) & 0xF; + comp_ptr->custmod = (comp_ptr->pid1 >> 24) & 0xF; + + // Check if the component is an ARM component + comp_ptr->isarm = ((comp_ptr->jepid == ARM_JEP_ID) && + (comp_ptr->jepcont == ARM_JEP_CONT) ) ? 1 : 0; + + // If this is a ROM Table, update counter + if(comp_ptr->cid == 0xB105100D) + { + comp_ptr->romcount = ++NumRomTables; + } + else + { + comp_ptr->romcount = 0; + } + } +} + +void CheckHex(char *name, uint32_t actual, uint32_t expected) +{ + if(actual == expected) + { + printf("%s: 0x%x\t-\tPASS\n", + name, + actual); + } + else + { + printf("%s: Actual 0x%x\t(Expected 0x%x)\t-\tFAIL\n", + name, + actual, + expected); + Errors++; + } +} + + +uint32_t LookupARMCSPart(uint32_t partnum) +{ + + // Iterate over known parts, print string if found. + // Return error if not found. + + uint32_t error, i; + + error = 1; + + for(i=0; i < NumARMCSParts; i++) + { + if(ARMCSParts[i].partnumber == partnum) + { + error = 0; + printf(" - ARM %s\n", ARMCSParts[i].partname); + break; + } + } + + if(error) + { + puts(" - ARM, Unknown Partnumber\n"); + } + return error; +} diff --git a/Cortex-M0/nanosoc/software/common/romtable_tests/romtable_tests.h b/Cortex-M0/nanosoc/software/common/romtable_tests/romtable_tests.h new file mode 100644 index 0000000..d45f41b --- /dev/null +++ b/Cortex-M0/nanosoc/software/common/romtable_tests/romtable_tests.h @@ -0,0 +1,83 @@ +/* + *----------------------------------------------------------------------------- + * The confidential and proprietary information contained in this file may + * only be used by a person authorised under and to the extent permitted + * by a subsisting licensing agreement from Arm Limited or its affiliates. + * + * (C) COPYRIGHT 2013 Arm Limited or its affiliates. + * ALL RIGHTS RESERVED + * + * This entire notice must be reproduced on all copies of this file + * and copies of this file may only be made by a person if such person is + * permitted to do so under the terms of a subsisting license agreement + * from Arm Limited or its affiliates. + * + * SVN Information + * + * Checked In : $Date: 2012-05-31 12:12:02 +0100 (Thu, 31 May 2012) $ + * + * Revision : $Revision: 210765 $ + * + * Release Information : Cortex-M System Design Kit-r1p1-00rel0 + *----------------------------------------------------------------------------- + */ + +//////////////////////////////////////////////////////////////////////////////// +// +// CMSDK romtable tests header file +// +//////////////////////////////////////////////////////////////////////////////// + +// Partnumber is {PID1[3:0], PID0[7:0]} + + +struct CoreSightPart { + uint32_t partnumber; + char * partname; +}; + +struct CoreSightPart ARMCSParts[] = { + + // v6M Architected Parts + {0x008, "v6M System Control Space (SCS)"}, + {0x00A, "v6M Data Watchpoint and Trace (DWT)"}, + {0x00B, "v6M Breakpoint Unit (BPU)"}, + + // Cortex-M0 + {0x471, "Cortex-M0 Processor"}, + {0x4C2, "Cortex-M0 CoreSight Integration Level"}, + + // Cortex-M0+ + {0x4C0, "Cortex-M0+ Processor"}, + {0x4C1, "Cortex-M0+ CoreSight Integration Level"}, + {0x9A6, "Cortex-M0+ Cross Trigger Interface (CTI)"}, + {0x932, "CoreSight MTB-M0+"}, + + // Cortex-M1 + {0x470, "Cortex-M1 Processor"}, + + // v7M Architected Parts + {0x000, "v7M System Control Space (SCS)"}, + {0x00C, "v7MF System Control Space (SCS)"}, + {0x001, "v7M Instrumentation Trace Macrocell (ITM)"}, + {0x002, "v7M Data Watchpoint and Trace (DWT)"}, + {0x003, "v7M FlashPatch and Breakpoint (FPB)"}, + + // Cortex-M3 + {0x4C3, "Cortex-M3 Processor"}, + {0x4C5, "Cortex-M3 CoreSight Integration Level"}, + {0x923, "Cortex-M3 TPIU"}, + {0x924, "Cortex-M3 ETM"}, + + // Cortex-M4 + {0x4C4, "Cortex-M4 Processor"}, + {0x4C6, "Cortex-M4 CoreSight Integration Level"}, + {0x925, "Cortex-M4 ETM"}, + {0x9A1, "Cortex-M4 TPIU"}, + + // Generic CoreSight Parts + {0x906, "CoreSight Cross Trigger Interface (CTI)"}, + +}; + +#define NumARMCSParts (sizeof ARMCSParts / sizeof ARMCSParts[0]) diff --git a/Cortex-M0/nanosoc/software/common/scripts/cmsdk_bootloader.ld b/Cortex-M0/nanosoc/software/common/scripts/cmsdk_bootloader.ld new file mode 100644 index 0000000..bc1fd29 --- /dev/null +++ b/Cortex-M0/nanosoc/software/common/scripts/cmsdk_bootloader.ld @@ -0,0 +1,40 @@ +/* + *----------------------------------------------------------------------------- + * The confidential and proprietary information contained in this file may + * only be used by a person authorised under and to the extent permitted + * by a subsisting licensing agreement from Arm Limited or its affiliates. + * + * (C) COPYRIGHT 2010-2013 Arm Limited or its affiliates. + * ALL RIGHTS RESERVED + * + * This entire notice must be reproduced on all copies of this file + * and copies of this file may only be made by a person if such person is + * permitted to do so under the terms of a subsisting license agreement + * from Arm Limited or its affiliates. + * + * SVN Information + * + * Checked In : $Date: $ + * + * Revision : $Revision: $ + * + * Release Information : Cortex-M System Design Kit-r1p1-00rel0 + *----------------------------------------------------------------------------- + */ +/* Linker script to configure memory regions. + * Need modifying for a specific board. + * FLASH.ORIGIN: starting address of boot loader + * FLASH.LENGTH: length of flash + * RAM.ORIGIN: starting address of RAM bank 0 + * RAM.LENGTH: length of RAM bank 0 + */ + +INCLUDE "lib-nosys.ld" + +MEMORY +{ + FLASH (rx) : ORIGIN = 0x01000000, LENGTH = 0x1000 /* 4K */ + RAM (rwx) : ORIGIN = 0x20000000, LENGTH = 0x10000 /* 64K */ +} + +INCLUDE "sections.ld" diff --git a/Cortex-M0/nanosoc/software/common/scripts/cmsdk_cm0.ld b/Cortex-M0/nanosoc/software/common/scripts/cmsdk_cm0.ld new file mode 100644 index 0000000..2ac111b --- /dev/null +++ b/Cortex-M0/nanosoc/software/common/scripts/cmsdk_cm0.ld @@ -0,0 +1,43 @@ +/* + *----------------------------------------------------------------------------- + * The confidential and proprietary information contained in this file may + * only be used by a person authorised under and to the extent permitted + * by a subsisting licensing agreement from Arm Limited or its affiliates. + * + * (C) COPYRIGHT 2010-2013 Arm Limited or its affiliates. + * ALL RIGHTS RESERVED + * + * This entire notice must be reproduced on all copies of this file + * and copies of this file may only be made by a person if such person is + * permitted to do so under the terms of a subsisting license agreement + * from Arm Limited or its affiliates. + * + * SVN Information + * + * Checked In : $Date: $ + * + * Revision : $Revision: $ + * + * Release Information : Cortex-M System Design Kit-r1p1-00rel0 + *----------------------------------------------------------------------------- + */ +/* Linker script to configure memory regions. + * Need modifying for a specific board. + * FLASH.ORIGIN: starting address of flash + * FLASH.LENGTH: length of flash + * RAM.ORIGIN: starting address of RAM bank 0 + * RAM.LENGTH: length of RAM bank 0 + */ + +INCLUDE "lib-nosys.ld" + +MEMORY +{ + FLASH (rx) : ORIGIN = 0x0, LENGTH = 0x10000 /* 64K */ + RAM (rwx) : ORIGIN = 0x20000000, LENGTH = 0xFC00 /* 63K */ + /* 64K is available, but reserve some space for */ + /* 1) debug tester communication for debug tests */ + /* 2) DMA data structure for DMA tests */ +} + +INCLUDE "sections.ld" diff --git a/Cortex-M0/nanosoc/software/common/scripts/debugtester.ld b/Cortex-M0/nanosoc/software/common/scripts/debugtester.ld new file mode 100644 index 0000000..0c7b958 --- /dev/null +++ b/Cortex-M0/nanosoc/software/common/scripts/debugtester.ld @@ -0,0 +1,40 @@ +/* + *----------------------------------------------------------------------------- + * The confidential and proprietary information contained in this file may + * only be used by a person authorised under and to the extent permitted + * by a subsisting licensing agreement from Arm Limited or its affiliates. + * + * (C) COPYRIGHT 2010-2013 Arm Limited or its affiliates. + * ALL RIGHTS RESERVED + * + * This entire notice must be reproduced on all copies of this file + * and copies of this file may only be made by a person if such person is + * permitted to do so under the terms of a subsisting license agreement + * from Arm Limited or its affiliates. + * + * SVN Information + * + * Checked In : $Date: $ + * + * Revision : $Revision: $ + * + * Release Information : Cortex-M System Design Kit-r1p1-00rel0 + *----------------------------------------------------------------------------- + */ +/* Linker script to configure memory regions. + * Need modifying for a specific board. + * FLASH.ORIGIN: starting address of flash + * FLASH.LENGTH: length of flash + * RAM.ORIGIN: starting address of RAM bank 0 + * RAM.LENGTH: length of RAM bank 0 + */ + +INCLUDE "lib-nosys.ld" + +MEMORY +{ + FLASH (rx) : ORIGIN = 0x0, LENGTH = 0x20000 /* 64K */ + RAM (rwx) : ORIGIN = 0x20000000, LENGTH = 0x4000 /* 16K */ +} + +INCLUDE "sections.ld" diff --git a/Cortex-M0/nanosoc/software/common/scripts/lib-nosys.ld b/Cortex-M0/nanosoc/software/common/scripts/lib-nosys.ld new file mode 100644 index 0000000..64e5874 --- /dev/null +++ b/Cortex-M0/nanosoc/software/common/scripts/lib-nosys.ld @@ -0,0 +1,2 @@ +/* Library configurations */ +GROUP(libgcc.a libc.a libm.a libnosys.a) diff --git a/Cortex-M0/nanosoc/software/common/scripts/lib-rdimon.ld b/Cortex-M0/nanosoc/software/common/scripts/lib-rdimon.ld new file mode 100644 index 0000000..93bd10c --- /dev/null +++ b/Cortex-M0/nanosoc/software/common/scripts/lib-rdimon.ld @@ -0,0 +1,2 @@ +/* Library configurations */ +GROUP(libgcc.a libc.a libm.a librdimon.a) diff --git a/Cortex-M0/nanosoc/software/common/scripts/sections-nokeep.ld b/Cortex-M0/nanosoc/software/common/scripts/sections-nokeep.ld new file mode 100644 index 0000000..f21022e --- /dev/null +++ b/Cortex-M0/nanosoc/software/common/scripts/sections-nokeep.ld @@ -0,0 +1,162 @@ +/* + *----------------------------------------------------------------------------- + * The confidential and proprietary information contained in this file may + * only be used by a person authorised under and to the extent permitted + * by a subsisting licensing agreement from Arm Limited or its affiliates. + * + * (C) COPYRIGHT 2010-2013 Arm Limited or its affiliates. + * ALL RIGHTS RESERVED + * + * This entire notice must be reproduced on all copies of this file + * and copies of this file may only be made by a person if such person is + * permitted to do so under the terms of a subsisting license agreement + * from Arm Limited or its affiliates. + * + * SVN Information + * + * Checked In : $Date: $ + * + * Revision : $Revision: $ + * + * Release Information : Cortex-M System Design Kit-r1p1-00rel0 + *----------------------------------------------------------------------------- + */ +/* Linker script to place sections and symbol values. Should be used together + * with other linker script that defines memory regions FLASH and RAM. + * It references following symbols, which must be defined in code: + * Reset_Handler : Entry of reset handler + * + * It defines following symbols, which code can use without definition: + * __exidx_start + * __exidx_end + * __etext + * __data_start__ + * __preinit_array_start + * __preinit_array_end + * __init_array_start + * __init_array_end + * __fini_array_start + * __fini_array_end + * __data_end__ + * __bss_start__ + * __bss_end__ + * __end__ + * end + * __HeapLimit + * __StackLimit + * __StackTop + * __stack + */ +ENTRY(Reset_Handler) + +SECTIONS +{ + .text : + { + KEEP(*(.isr_vector)) + *(.text*) + + *(.init) + *(.fini) + + /* .ctors */ + *crtbegin.o(.ctors) + *crtbegin?.o(.ctors) + *(EXCLUDE_FILE(*crtend?.o *crtend.o) .ctors) + *(SORT(.ctors.*)) + *(.ctors) + + /* .dtors */ + *crtbegin.o(.dtors) + *crtbegin?.o(.dtors) + *(EXCLUDE_FILE(*crtend?.o *crtend.o) .dtors) + *(SORT(.dtors.*)) + *(.dtors) + + *(.rodata*) + + *(.eh_frame*) + } > FLASH + + .ARM.extab : + { + *(.ARM.extab* .gnu.linkonce.armextab.*) + } > FLASH + + __exidx_start = .; + .ARM.exidx : + { + *(.ARM.exidx* .gnu.linkonce.armexidx.*) + } > FLASH + __exidx_end = .; + + __etext = .; + + .data : AT (__etext) + { + __data_start__ = .; + *(vtable) + *(.data*) + + . = ALIGN(4); + /* preinit data */ + PROVIDE_HIDDEN (__preinit_array_start = .); + *(.preinit_array) + PROVIDE_HIDDEN (__preinit_array_end = .); + + . = ALIGN(4); + /* init data */ + PROVIDE_HIDDEN (__init_array_start = .); + *(SORT(.init_array.*)) + *(.init_array) + PROVIDE_HIDDEN (__init_array_end = .); + + + . = ALIGN(4); + /* finit data */ + PROVIDE_HIDDEN (__fini_array_start = .); + *(SORT(.fini_array.*)) + *(.fini_array) + PROVIDE_HIDDEN (__fini_array_end = .); + + . = ALIGN(4); + /* All data end */ + __data_end__ = .; + + } > RAM + + .bss : + { + . = ALIGN(4); + __bss_start__ = .; + *(.bss*) + *(COMMON) + . = ALIGN(4); + __bss_end__ = .; + } > RAM + + .heap (COPY): + { + __end__ = .; + end = __end__; + *(.heap*) + __HeapLimit = .; + } > RAM + + /* .stack_dummy section doesn't contains any symbols. It is only + * used for linker to calculate size of stack sections, and assign + * values to stack symbols later */ + .stack_dummy (COPY): + { + *(.stack*) + } > RAM + + /* Set stack top to end of RAM, and stack limit move down by + * size of stack_dummy section */ + __StackTop = ORIGIN(RAM) + LENGTH(RAM); + __StackLimit = __StackTop - SIZEOF(.stack_dummy); + PROVIDE(__stack = __StackTop); + + /* Check if data + heap + stack exceeds RAM limit */ + ASSERT(__StackLimit >= __HeapLimit, "region RAM overflowed with stack") +} diff --git a/Cortex-M0/nanosoc/software/common/scripts/sections.ld b/Cortex-M0/nanosoc/software/common/scripts/sections.ld new file mode 100644 index 0000000..e1e7308 --- /dev/null +++ b/Cortex-M0/nanosoc/software/common/scripts/sections.ld @@ -0,0 +1,163 @@ +/* + *----------------------------------------------------------------------------- + * The confidential and proprietary information contained in this file may + * only be used by a person authorised under and to the extent permitted + * by a subsisting licensing agreement from Arm Limited or its affiliates. + * + * (C) COPYRIGHT 2010-2013 Arm Limited or its affiliates. + * ALL RIGHTS RESERVED + * + * This entire notice must be reproduced on all copies of this file + * and copies of this file may only be made by a person if such person is + * permitted to do so under the terms of a subsisting license agreement + * from Arm Limited or its affiliates. + * + * SVN Information + * + * Checked In : $Date: $ + * + * Revision : $Revision: $ + * + * Release Information : Cortex-M System Design Kit-r1p1-00rel0 + *----------------------------------------------------------------------------- + */ +/* Linker script to place sections and symbol values. Should be used together + * with other linker script that defines memory regions FLASH and RAM. + * It references following symbols, which must be defined in code: + * Reset_Handler : Entry of reset handler + * + * It defines following symbols, which code can use without definition: + * __exidx_start + * __exidx_end + * __etext + * __data_start__ + * __preinit_array_start + * __preinit_array_end + * __init_array_start + * __init_array_end + * __fini_array_start + * __fini_array_end + * __data_end__ + * __bss_start__ + * __bss_end__ + * __end__ + * end + * __HeapLimit + * __StackLimit + * __StackTop + * __stack + */ +ENTRY(Reset_Handler) + +SECTIONS +{ + .text : + { + KEEP(*(.isr_vector)) + *(.text*) + + KEEP(*(.init)) + KEEP(*(.fini)) + + /* .ctors */ + *crtbegin.o(.ctors) + *crtbegin?.o(.ctors) + *(EXCLUDE_FILE(*crtend?.o *crtend.o) .ctors) + *(SORT(.ctors.*)) + *(.ctors) + + /* .dtors */ + *crtbegin.o(.dtors) + *crtbegin?.o(.dtors) + *(EXCLUDE_FILE(*crtend?.o *crtend.o) .dtors) + *(SORT(.dtors.*)) + *(.dtors) + + *(.rodata*) + + KEEP(*(.eh_frame*)) + } > FLASH + + .ARM.extab : + { + *(.ARM.extab* .gnu.linkonce.armextab.*) + } > FLASH + + __exidx_start = .; + .ARM.exidx : + { + *(.ARM.exidx* .gnu.linkonce.armexidx.*) + } > FLASH + __exidx_end = .; + + __etext = .; + + .data : AT (__etext) + { + __data_start__ = .; + *(vtable) + *(.data*) + + . = ALIGN(4); + /* preinit data */ + PROVIDE_HIDDEN (__preinit_array_start = .); + KEEP(*(.preinit_array)) + PROVIDE_HIDDEN (__preinit_array_end = .); + + . = ALIGN(4); + /* init data */ + PROVIDE_HIDDEN (__init_array_start = .); + KEEP(*(SORT(.init_array.*))) + KEEP(*(.init_array)) + PROVIDE_HIDDEN (__init_array_end = .); + + + . = ALIGN(4); + /* finit data */ + PROVIDE_HIDDEN (__fini_array_start = .); + KEEP(*(SORT(.fini_array.*))) + KEEP(*(.fini_array)) + PROVIDE_HIDDEN (__fini_array_end = .); + + KEEP(*(.jcr*)) + . = ALIGN(4); + /* All data end */ + __data_end__ = .; + + } > RAM + + .bss : + { + . = ALIGN(4); + __bss_start__ = .; + *(.bss*) + *(COMMON) + . = ALIGN(4); + __bss_end__ = .; + } > RAM + + .heap (COPY): + { + __end__ = .; + end = __end__; + *(.heap*) + __HeapLimit = .; + } > RAM + + /* .stack_dummy section doesn't contains any symbols. It is only + * used for linker to calculate size of stack sections, and assign + * values to stack symbols later */ + .stack_dummy (COPY): + { + *(.stack*) + } > RAM + + /* Set stack top to end of RAM, and stack limit move down by + * size of stack_dummy section */ + __StackTop = ORIGIN(RAM) + LENGTH(RAM); + __StackLimit = __StackTop - SIZEOF(.stack_dummy); + PROVIDE(__stack = __StackTop); + + /* Check if data + heap + stack exceeds RAM limit */ + ASSERT(__StackLimit >= __HeapLimit, "region RAM overflowed with stack") +} diff --git a/Cortex-M0/nanosoc/software/common/validation/apb_mux_tests.c b/Cortex-M0/nanosoc/software/common/validation/apb_mux_tests.c new file mode 100644 index 0000000..d8ae41d --- /dev/null +++ b/Cortex-M0/nanosoc/software/common/validation/apb_mux_tests.c @@ -0,0 +1,367 @@ +/* + *----------------------------------------------------------------------------- + * The confidential and proprietary information contained in this file may + * only be used by a person authorised under and to the extent permitted + * by a subsisting licensing agreement from Arm Limited or its affiliates. + * + * (C) COPYRIGHT 2010-2013 Arm Limited or its affiliates. + * ALL RIGHTS RESERVED + * + * This entire notice must be reproduced on all copies of this file + * and copies of this file may only be made by a person if such person is + * permitted to do so under the terms of a subsisting license agreement + * from Arm Limited or its affiliates. + * + * SVN Information + * + * Checked In : $Date: 2017-10-10 15:55:38 +0100 (Tue, 10 Oct 2017) $ + * + * Revision : $Revision: 371321 $ + * + * Release Information : Cortex-M System Design Kit-r1p1-00rel0 + *----------------------------------------------------------------------------- + */ + +/* + A simple test to check the operation of APB slave multiplexer +*/ + + +#ifdef CORTEX_M0 +#include "CMSDK_CM0.h" +#endif + +#ifdef CORTEX_M0PLUS +#include "CMSDK_CM0plus.h" +#endif + +#ifdef CORTEX_M3 +#include "CMSDK_CM3.h" +#endif + +#ifdef CORTEX_M4 +#include "CMSDK_CM4.h" +#endif + +#include <stdio.h> +#include "uart_stdout.h" + +#define HW32_REG(ADDRESS) (*((volatile unsigned long *)(ADDRESS))) +#define HW16_REG(ADDRESS) (*((volatile unsigned short *)(ADDRESS))) +#define HW8_REG(ADDRESS) (*((volatile unsigned char *)(ADDRESS))) + + +#if defined ( __CC_ARM ) +__asm void address_test_write(unsigned int addr, unsigned int wdata); +__asm unsigned int address_test_read(unsigned int addr); +#else + void address_test_write(unsigned int addr, unsigned int wdata); + unsigned int address_test_read(unsigned int addr); +#endif +void HardFault_Handler_c(unsigned int * hardfault_args, unsigned lr_value); +int ID_Check(const unsigned char id_array[], unsigned int offset); +int APB_test_slave_Check(unsigned int offset); + +/* Global variables */ +volatile int hardfault_occurred; +volatile int hardfault_expected; +volatile int temp_data; + int hardfault_verbose=0; // 0:Not displaying anything in hardfault handler + +/* Predefined ID values for APB peripherals */ +const unsigned char ahb_gpio_id[16] = {0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, + 0x20, 0xB8, 0x0B, 0x00, 0x0D, 0xF0, 0x05, 0xB1}; +const unsigned char apb_uart_id[16] = {0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, + 0x21, 0xB8, 0x0B, 0x00, 0x0D, 0xF0, 0x05, 0xB1}; +const unsigned char apb_timer_id[16] = {0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, + 0x22, 0xB8, 0x0B, 0x00, 0x0D, 0xF0, 0x05, 0xB1}; +const unsigned char apb_dualtimer_id[16]= {0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, + 0x23, 0xB8, 0x0B, 0x00, 0x0D, 0xF0, 0x05, 0xB1}; +const unsigned char apb_watchdog_id[16] = {0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, + 0x24, 0xB8, 0x0B, 0x00, 0x0D, 0xF0, 0x05, 0xB1}; +const unsigned char pl230_udma_id[16] = {0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, + 0x30, 0xB2, 0x0B, 0x00, 0x0D, 0xF0, 0x05, 0xB1}; +const unsigned char blank_id[16] = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; + +int main (void) +{ + + int err_code = 0; + + // UART init + UartStdOutInit(); + + // Test banner message and revision number + puts("\nCortex Microcontroller System Design Kit"); + puts(" - APB slave mux test - revision $Revision: 371321 $\n"); + + puts(" - Detecting if default peripherals are present ...\n"); + temp_data=0; + hardfault_occurred = 0; + hardfault_expected = 0; + puts ("0: timer 0"); + if ( ID_Check(&apb_timer_id[0], CMSDK_TIMER0_BASE ) == 1 ) err_code |= 1<<0; + puts ("1: timer 1"); + if ( ID_Check(&apb_timer_id[0], CMSDK_TIMER1_BASE ) == 1 ) err_code |= 1<<1; + puts ("2: dual timer"); + if ( ID_Check(&apb_dualtimer_id[0], CMSDK_DUALTIMER_BASE) == 1 ) err_code |= 1<<2; + puts ("3: blank"); + if ( ID_Check(&blank_id[0], 0x40003000 ) == 1 ) err_code |= 1<<3; + puts ("4: UART 0"); + if ( ID_Check(&apb_uart_id[0], CMSDK_UART0_BASE ) == 1 ) err_code |= 1<<4; + puts ("5: UART 1"); + if ( ID_Check(&apb_uart_id[0], CMSDK_UART1_BASE ) == 1 ) err_code |= 1<<5; + puts ("6: UART 2"); + if ( ID_Check(&apb_uart_id[0], CMSDK_UART2_BASE ) == 1 ) err_code |= 1<<6; + puts ("7: blank"); + if ( ID_Check(&blank_id[0], 0x40007000 ) == 1 ) err_code |= 1<<7; + puts ("8: Watchdog"); + if ( ID_Check(&apb_watchdog_id[0], CMSDK_WATCHDOG_BASE ) == 1 ) err_code |= 1<<8; + puts ("9: blank"); + if ( ID_Check(&blank_id[0], 0x40009000 ) == 1 ) err_code |= 1<<9; + puts ("10: blank"); + if ( ID_Check(&blank_id[0], 0x4000A000 ) == 1 ) err_code |= 1<<10; + puts ("11: APB test slave"); + if ( APB_test_slave_Check( 0x4000B000 ) == 1 ) err_code |= 1<<11; + puts ("12: APB expansion port 12"); + if ( ID_Check(&blank_id[0], 0x4000C000 ) == 1 ) err_code |= 1<<12; + puts ("13: APB expansion port 13"); + if ( ID_Check(&blank_id[0], 0x4000D000 ) == 1 ) err_code |= 1<<13; + puts ("14: APB expansion port 14"); + if ( ID_Check(&blank_id[0], 0x4000E000 ) == 1 ) err_code |= 1<<14; + puts ("15: APB expansion port 15 (optional DMA controller)"); + if ( ID_Check(&pl230_udma_id[0], CMSDK_PL230_BASE ) == 1 ) err_code |= 1<<15; + + + /* Report error code */ + + if (err_code==0) { + printf ("\n** TEST PASSED **\n"); + } else { + printf ("\n** TEST FAILED **, Error code = (0x%x)\n", err_code); + } + UartEndSimulation(); + return 0; +} + +/* Check the ID register value in offset 0xFC0 to 0xFFC (last 16 words, last 12 are IDs) */ +int ID_Check(const unsigned char id_array[], unsigned int offset) +{ + int i; /* loop counter */ + unsigned long expected_val, actual_val; + unsigned long compare_mask; + int mismatch = 0; + int id_is_zero = 0; + unsigned long test_addr; + + /* Check the peripheral ID and component ID */ + for (i=0;i<16;i++) { + test_addr = offset + 4*i + 0xFC0; + expected_val = (int) id_array[i]; + actual_val = HW32_REG(test_addr); + + if (actual_val == 0) id_is_zero++; // Check if all ID are zero at the end + + /* create mask to ignore version numbers */ + if (i==10) { compare_mask = 0xF0;} // mask out version field + else if (i==11) { compare_mask = 0xFF;} // mask out ECO field and patch field + else { compare_mask = 0x00;} // compare whole value + + if ((expected_val & (~compare_mask)) != (actual_val & (~compare_mask))) { + printf ("Difference found: %x, expected %x, actual %x\n", test_addr, expected_val, actual_val); + mismatch++; + } + } // end_for + + if (id_is_zero == 16) { + puts (" All ID values are 0 : device not present\n"); + return 2; } + else if (mismatch> 0) { + puts (" ID value mismatch(es) : device unknown\n"); + return 1; } + else { + puts (" All ID values matched : device present\n"); + return 0; + } + +} + +/* Simple test for APB test slave */ +int APB_test_slave_Check(unsigned int offset) +{ + /* + The APB test slave has got only one 32-bit register in + the first four addresses. For each word, the wait state + increase based on PADDR[3:2]. + + The test slave is also able to generate error responses + at offset 0x0F0 to 0xFC. + */ + int mismatch = 0; + int fault_err = 0; + int i; + + // Read/Write test to data_register + HW32_REG(offset) = 0xFFFFFFFF; + if ((HW32_REG(offset)) !=0xFFFFFFFF) mismatch ++; + HW32_REG(offset) = 0x00000000; + if ((HW32_REG(offset)) !=0x00000000) mismatch ++; + HW32_REG(offset) = 0x12345678; + if ((HW32_REG(offset)) !=0x12345678) mismatch ++; + HW16_REG(offset) = 0x5678; /* Use consistent access size. + This is required to allow the test to run in big endian */ + if ((HW16_REG(offset)) !=0x5678) mismatch ++; + HW16_REG(offset+2) = 0x1234; /* Use consistent access size.*/ + if ((HW16_REG(offset+2)) !=0x1234) mismatch ++; + HW8_REG(offset) = 0x78; /* Use consistent access size between read and write.*/ + HW8_REG(offset+1) = 0x56; + HW8_REG(offset+2) = 0x34; + HW8_REG(offset+3) = 0x12; + if ((HW8_REG(offset)) !=0x78) mismatch ++; + if ((HW8_REG(offset+1)) !=0x56) mismatch ++; + if ((HW8_REG(offset+2)) !=0x34) mismatch ++; + if ((HW8_REG(offset+3)) !=0x12) mismatch ++; + HW16_REG(offset+4) = 0xFFFF; // Value = 0x1234FFFF + if ((HW16_REG(offset+8)) !=0xFFFF) mismatch ++; + HW16_REG(offset+6) = 0x0000; // Value = 0x0000FFFF + if ((HW16_REG(offset+4)) !=0xFFFF) mismatch ++; + if ((HW16_REG(offset+6)) !=0x0000) mismatch ++; + HW8_REG(offset+8) = 0xA5; // Value = 0x0000FFA5 + if ((HW8_REG(offset+8)) !=0xA5) mismatch ++; + HW8_REG(offset+0xD) = 0xC3; // Value = 0x0000C3A5 + if ((HW8_REG(offset+0xD)) !=0xC3) mismatch ++; + HW16_REG(offset+0xE)= 0xC53A;// Value = 0xC53AC3A5 + if ((HW16_REG(offset+0xE)) !=0xC53A) mismatch ++; + + /* Testing of error response from APB test slave */ + for (i=0; i<4; i++) { + temp_data=0; + hardfault_expected = 1; + hardfault_occurred = 0; + address_test_write((offset + 0xF0 + (i<<2)), 0x0); + if (hardfault_occurred==0) fault_err++; + hardfault_occurred = 0; + temp_data=address_test_read(offset + 0xF0 + (i<<2)); + if (hardfault_occurred==0) fault_err++; + } + + hardfault_expected = 0; + hardfault_occurred = 0; + + if (mismatch>0) { puts (" Data mismatch in APB test slave\n"); + return 1;} + if (fault_err>0){ puts (" Fault mismatch in APB test slave\n"); + return 1;} + else puts (" APB test slave test passed\n"); + + return 0; +} + +#if defined ( __CC_ARM ) +/* Test function for write - for ARM / Keil */ +__asm void address_test_write(unsigned int addr, unsigned int wdata) +{ + STR R1,[R0] + DSB ; Ensure bus fault occurred before leaving this subroutine + BX LR +} + +#else +/* Test function for write - for gcc */ +void address_test_write(unsigned int addr, unsigned int wdata) __attribute__((naked)); +void address_test_write(unsigned int addr, unsigned int wdata) +{ + __asm(" str r1,[r0]\n" + " dsb \n" + " bx lr \n" + ); +} +#endif + +/* Test function for read */ +#if defined ( __CC_ARM ) +/* Test function for read - for ARM / Keil */ +__asm unsigned int address_test_read(unsigned int addr) +{ + LDR R1,[R0] + DSB ; Ensure bus fault occurred before leaving this subroutine + MOVS R0, R1 + BX LR +} +#else +/* Test function for read - for gcc */ +unsigned int address_test_read(unsigned int addr) __attribute__((naked)); +unsigned int address_test_read(unsigned int addr) +{ + __asm(" ldr r1,[r0]\n" + " dsb \n" + " movs r0, r1 \n" + " bx lr \n" + ); +} +#endif + + +#if defined ( __CC_ARM ) +/* ARM or Keil toolchain */ +__asm void HardFault_Handler(void) +{ + MOVS r0, #4 + MOV r1, LR + TST r0, r1 + BEQ stacking_used_MSP + MRS R0, PSP ; // first parameter - stacking was using PSP + B get_LR_and_branch +stacking_used_MSP + MRS R0, MSP ; // first parameter - stacking was using MSP +get_LR_and_branch + MOV R1, LR ; // second parameter is LR current value + LDR R2,=__cpp(HardFault_Handler_c) + BX R2 + ALIGN +} +#else +/* gcc toolchain */ +void HardFault_Handler(void) __attribute__((naked)); +void HardFault_Handler(void) +{ + __asm(" movs r0,#4\n" + " mov r1,lr\n" + " tst r0,r1\n" + " beq stacking_used_MSP\n" + " mrs r0,psp\n" /* first parameter - stacking was using PSP */ + " ldr r1,=HardFault_Handler_c \n" + " bx r1\n" + "stacking_used_MSP:\n" + " mrs r0,msp\n" /* first parameter - stacking was using PSP */ + " ldr r1,=HardFault_Handler_c \n" + " bx r1\n" + ".pool\n" ); +} + +#endif +/* C part of the fault handler - common between ARM / Keil /gcc */ +void HardFault_Handler_c(unsigned int * hardfault_args, unsigned lr_value) +{ + unsigned int stacked_pc; + unsigned int stacked_r0; + hardfault_occurred++; + if (hardfault_verbose) puts ("[Hard Fault Handler]"); + if (hardfault_expected==0) { + puts ("ERROR : Unexpected HardFault interrupt occurred.\n"); + UartEndSimulation(); + while (1); + } + stacked_r0 = ((unsigned long) hardfault_args[0]); + stacked_pc = ((unsigned long) hardfault_args[6]); + if (hardfault_verbose) printf(" - Stacked R0 : 0x%x\n", stacked_r0); + if (hardfault_verbose) printf(" - Stacked PC : 0x%x\n", stacked_pc); + /* Modify R0 to a valid address */ + hardfault_args[0] = (unsigned long) &temp_data; + + return; +} + + + diff --git a/Cortex-M0/nanosoc/software/common/validation/bitband_tests.c b/Cortex-M0/nanosoc/software/common/validation/bitband_tests.c new file mode 100644 index 0000000..1d10209 --- /dev/null +++ b/Cortex-M0/nanosoc/software/common/validation/bitband_tests.c @@ -0,0 +1,602 @@ +/* + *----------------------------------------------------------------------------- + * The confidential and proprietary information contained in this file may + * only be used by a person authorised under and to the extent permitted + * by a subsisting licensing agreement from Arm Limited or its affiliates. + * + * (C) COPYRIGHT 2010-2013 Arm Limited or its affiliates. + * ALL RIGHTS RESERVED + * + * This entire notice must be reproduced on all copies of this file + * and copies of this file may only be made by a person if such person is + * permitted to do so under the terms of a subsisting license agreement + * from Arm Limited or its affiliates. + * + * SVN Information + * + * Checked In : $Date: 2017-10-10 15:55:38 +0100 (Tue, 10 Oct 2017) $ + * + * Revision : $Revision: 371321 $ + * + * Release Information : Cortex-M System Design Kit-r1p1-00rel0 + *----------------------------------------------------------------------------- + */ +/* A simple program to test the bitband wrapper for Cortex-M0 and + Cortex-M0+ */ + +#ifdef CORTEX_M0 +#include "CMSDK_CM0.h" +#endif + +#ifdef CORTEX_M0PLUS +#include "CMSDK_CM0plus.h" +#endif + +#include <stdio.h> + +#include "uart_stdout.h" + +/* Macros for word, half word and byte */ +#define HW32_REG(ADDRESS) (*((volatile unsigned long *)(ADDRESS))) +#define HW16_REG(ADDRESS) (*((volatile unsigned short *)(ADDRESS))) +#define HW8_REG(ADDRESS) (*((volatile unsigned char *)(ADDRESS))) + +#define SRAM_BITBAND_ADDR 0x20000000 +#define SRAM_BITBAND_ALIAS 0x22000000 +#define PERIPH_BITBAND_ADDR 0x40000000 +#define PERIPH_BITBAND_ALIAS 0x42000000 + +volatile unsigned int sram_array[20]; + +/* Tick to make sure variables are placed after test ram area */ +#define probing_state sram_array[16] +#define hf_expected sram_array[17] +#define hf_occurred sram_array[18] + +void ProbeBitBandAddr(void); +int SRamBitBandTest(void); +int PeripheralBitBandTest(void); +int EndianCheck(void); +int error_test(void); + +int main (void) +{ + int result=0; + + probing_state = 0; + hf_expected = 0; + hf_occurred = 0; + + // UART init + UartStdOutInit(); + + // Test banner message and revision number + puts("\nCortex Microcontroller System Design Kit - Bitband Test - revision $Revision: 371321 $\n"); + + /* Probe Bit band alias address to see if bitband has been implemented */ + ProbeBitBandAddr(); + + /* Test bitband access to SRAM */ + if (SRamBitBandTest()) result |= 1; + + /* Test bitband access to peripheral */ + if (PeripheralBitBandTest()) result |= 1; + + if (error_test()) result |= 1; + + if (result==0) { + printf ("\n** TEST PASSED **\n"); + } else { + printf ("\n** TEST FAILED **, Error code = (0x%x)\n", result); + } + UartEndSimulation(); + return 0; +} + +void ProbeBitBandAddr(void) +{ + probing_state = 1; + /* Access first address in bit-band alias. If bus fault occurred + it means bitband feature is not available. */ + HW32_REG(SRAM_BITBAND_ALIAS) = 0; + puts ("- no error in SRAM bitband alias access\n"); + puts (" continue test...\n"); + probing_state = 0; + sram_array[0] = 0; /* Dummy access to make sure sram_array won't get optimized away */ + return; +} + + +int SRamBitBandTest(void) +{ +const unsigned int testdata[4] = { 0x55AA33CC, 0xBADF00D, 0xC0FFEE, 0x12345678}; + unsigned int readdata; /* read back value - packed */ + unsigned int i,j; /* loop counters */ + unsigned int t1, t2; /* temp value */ + unsigned int err_code; /* error code */ + unsigned int verbose_level = 0; + + err_code = 0; + + /* Store data in SRAM */ + HW32_REG(SRAM_BITBAND_ADDR ) = testdata[0]; + HW32_REG(SRAM_BITBAND_ADDR+0x4) = testdata[1]; + HW32_REG(SRAM_BITBAND_ADDR+0x8) = testdata[2]; + HW32_REG(SRAM_BITBAND_ADDR+0xC) = testdata[3]; + + puts ("SRAM bitband"); + puts (" - Read bitband alias,"); + for (i=0;i<4;i++) { + readdata=0; + + /* Read each bit in the word via bit band alias and reconstruct the 32-bit value */ + j=32; + while(j>0) { + j--; + readdata = readdata << 1; /* Shift */ + t1 = HW32_REG(SRAM_BITBAND_ALIAS + 4*j + 0x80*i); + /* Check bit band read data should be 0 or 1 */ + if ((t1|0x1)!=1) { + puts("ERROR: bitband read should only return 0 or 1"); + printf ("Got %x, i=%d, j=%d\n", t1, i, j); + err_code |= 1<<1; + } + /* merge 32-bit word with previous read data */ + if (t1!=0) readdata += 1; /* Set LSB */ + } /* end while */ + + if (verbose_level!=0) printf (" readdata %d = %x\n", i, readdata); + if (readdata!=testdata[i]){ + puts("ERROR: Value mismatch"); + printf ("Expect %x, actual = %x\n",testdata[i],readdata ); + err_code |= 1<<2; + } + } /* end for */ + + puts (" - toggle each bit by write to bit band alias"); + for (i=0;i<4;i++) { + readdata=0; + + /* Toggle each bit in the words via bit band alias and read the 32-bit value afterwards*/ + j=32; + while(j>0) { + j--; + t1 = HW32_REG(SRAM_BITBAND_ALIAS + 4*j + 0x80*i); + /* Toggle bit and check bit band read data should be 0 or 1 */ + if (t1==1) HW32_REG(SRAM_BITBAND_ALIAS + 4*j + 0x80*i) = 0; + else if (t1==0) HW32_REG(SRAM_BITBAND_ALIAS + 4*j + 0x80*i) = 1; + else { + puts("ERROR: bitband read should only return 0 or 1"); + printf ("Got %x, i=%d, j=%d\n", t1, i, j); + err_code |= 1<<3; + } + } /* end while */ + /* read whole word */ + readdata = HW32_REG(SRAM_BITBAND_ADDR + 4*i); + if (verbose_level!=0) printf (" readdata %d = %x\n", i, readdata); + if (readdata!=(~testdata[i])){ + puts("ERROR: Value mismatch"); + printf ("Expect %x, actual = %x\n",(~testdata[i]),readdata ); + err_code |= 1<<4; + } + } /* end for */ + + + puts (" - Read bitband alias by halfword size,"); + for (i=0;i<8;i++) { + readdata=0; + + /* Read each bit in the word via bit band alias and reconstruct the 32-bit value */ + j=16; + while(j>0) { + j--; + readdata = readdata << 1; /* Shift */ + t1 = HW16_REG(SRAM_BITBAND_ALIAS + 4*j + 0x40*i); + /* Check bit band read data should be 0 or 1 */ + if ((t1|0x1)!=1) { + puts("ERROR: bitband read should only return 0 or 1"); + printf ("Got %x, i=%d, j=%d\n", t1, i, j); + err_code |= 1<<5; + } + /* merge 32-bit word with previous read data */ + if (t1!=0) readdata += 1; /* Set LSB */ + } /* end while */ + + if (verbose_level!=0) printf (" readdata %d = %x\n", i, readdata); + + if (readdata!=(HW16_REG(SRAM_BITBAND_ADDR+2*i))){ /* Note : data has been inverted */ + puts("ERROR: Value mismatch"); + printf ("Expect %x, actual = %x\n",(~testdata[i]),readdata ); + err_code |= 1<<6; + } + } /* end for */ + + + puts (" - toggle each bit by write to bit band alias, halfword size"); + for (i=0;i<8;i++) { + readdata=0; + + /* Toggle each bit in the words via bit band alias and read the 32-bit value afterwards*/ + t2 = HW16_REG(SRAM_BITBAND_ADDR+2*i); /* Current value */ + j=16; + while(j>0) { + j--; + t1 = HW16_REG(SRAM_BITBAND_ALIAS + 4*j + 0x40*i); + /* Toggle bit and check bit band read data should be 0 or 1 */ + if (t1==1) HW16_REG(SRAM_BITBAND_ALIAS + 4*j + 0x40*i) = 0; + else if (t1==0) HW16_REG(SRAM_BITBAND_ALIAS + 4*j + 0x40*i) = 1; + else { + puts("ERROR: bitband read should only return 0 or 1"); + printf ("Got %x, i=%d, j=%d\n", t1, i, j); + err_code |= 1<<7; + } + } /* end while */ + + /* read halfword */ + readdata = HW16_REG(SRAM_BITBAND_ADDR + 2*i); + if (verbose_level!=0) printf (" readdata %d = %x\n", i, readdata); + + if (readdata!=((~t2) & 0xFFFF)){ /* Check data has been inverted */ + puts("ERROR: Value mismatch"); + printf ("Expect %x, actual = %x\n",((~t2) & 0xFFFF),readdata ); + err_code |= 1<<8; + } + } /* end for */ + + + puts (" - Read bitband alias by byte size,"); + for (i=0;i<16;i++) { + readdata=0; + + /* Read each bit in the word via bit band alias and reconstruct the 32-bit value */ + j=8; + while(j>0) { + j--; + readdata = readdata << 1; /* Shift */ + t1 = HW8_REG(SRAM_BITBAND_ALIAS + 4*j + 0x20*i); + /* Check bit band read data should be 0 or 1 */ + if ((t1|0x1)!=1) { + puts("ERROR: bitband read should only return 0 or 1"); + printf ("Got %x, i=%d, j=%d\n", t1, i, j); + err_code |= 1<<5; + } + /* merge 32-bit word with previous read data */ + if (t1!=0) readdata += 1; /* Set LSB */ + } /* end while */ + + if (verbose_level!=0) printf (" readdata %d = %x\n", i, readdata); + + if (readdata!=(HW8_REG(SRAM_BITBAND_ADDR + i))){ + puts("ERROR: Value mismatch"); + printf ("Expect %x, actual = %x\n",(HW8_REG(SRAM_BITBAND_ADDR + i)),readdata ); + err_code |= 1<<6; + } + } /* end for */ + + + puts (" - toggle each bit by write to bit band alias, byte size"); + for (i=0;i<16;i++) { + readdata=0; + + /* Toggle each bit in the words via bit band alias and read the 32-bit value afterwards*/ + t2 = HW8_REG(SRAM_BITBAND_ADDR+i); /* Current value */ + j=8; + while(j>0) { + j--; + t1 = HW8_REG(SRAM_BITBAND_ALIAS + 4*j + 0x20*i); + /* Toggle bit and check bit band read data should be 0 or 1 */ + if (t1==1) HW8_REG(SRAM_BITBAND_ALIAS + 4*j + 0x20*i) = 0; + else if (t1==0) HW8_REG(SRAM_BITBAND_ALIAS + 4*j + 0x20*i) = 1; + else { + puts("ERROR: bitband read should only return 0 or 1"); + printf ("Got %x, i=%d, j=%d\n", t1, i, j); + err_code |= 1<<7; + } + } /* end while */ + /* read whole word */ + readdata = HW8_REG(SRAM_BITBAND_ADDR + i); + if (verbose_level!=0) printf (" readdata %d = %x\n", i, readdata); + if (readdata!=((~t2) & 0xFF)){ + puts("ERROR: Value mismatch"); + printf ("Expect %x, actual = %x\n",((~t2) & 0xFF),readdata ); + err_code |= 1<<8; + } + } /* end for */ + + + puts (" Test done\n"); + return err_code; +} + +int PeripheralBitBandTest(void) +{ + +const unsigned int testdata[2] = { 0x31241456, 0x92745722}; + unsigned int readdata; /* read back value - packed */ + unsigned int i,j; /* loop counters */ + unsigned int t1; /* temp value */ + unsigned int err_code; /* error code */ + unsigned int verbose_level = 0; + + /* Note : + Timer 0 is located in 0x40000000, with ctrl, value, reload and ID registers + CTRL : 0x40000000 (not used here) + VALUE : 0x40000004 (use for bit toggle later) + RELOAD : 0x40000008 (use for bit toggle later) + ... + PID 4 to 7 : 0x40000FE0 to 0x40000FEC (not used here). + PID 0 to 3 : 0x40000FE0 to 0x40000FEC (not used here). + CID 0 to 3 : 0x40000FF0 to 0x40000FFC (use for read test). + */ + err_code = 0; + puts ("Peripheral bitband"); + puts (" - Read bitband alias, word"); + + /* Read timer 0 CID registers with bit band alias */ + for (i=0;i<4;i++) { + readdata=0; + + /* Read each bit in the word via bit band alias and reconstruct the 32-bit value */ + j=32; + while(j>0) { + j--; + readdata = readdata << 1; /* Shift */ + t1 = HW32_REG(PERIPH_BITBAND_ALIAS + (0xFF0*0x20) + 4*j + 0x80*i); + /* Check bit band read data should be 0 or 1 */ + if ((t1|0x1)!=1) { + puts("ERROR: bitband read should only return 0 or 1"); + printf ("Got %x, i=%d, j=%d\n", t1, i, j); + err_code |= 1<<1; + } + /* merge 32-bit word with previous read data */ + if (t1!=0) readdata += 1; /* Set LSB */ + } /* end while */ + + if (verbose_level!=0) printf (" readdata %d = %x\n", i, readdata); + if (readdata!=(HW32_REG(PERIPH_BITBAND_ADDR +0xFF0 + 4 * i))){ + puts("ERROR: Value mismatch"); + printf ("Expect %x, actual = %x\n",(HW32_REG(PERIPH_BITBAND_ADDR + 0xFF0 + 4 * i)),readdata ); + err_code |= 1<<2; + } + } /* end for */ + + puts (" - Read bitband alias, half word"); + /* Read timer 0 CID registers with bit band alias, half word */ + for (i=0;i<8;i++) { + readdata=0; + + /* Read each bit in the halfword via bit band alias and reconstruct the 16-bit value */ + j=16; + while(j>0) { + j--; + readdata = readdata << 1; /* Shift */ + t1 = HW16_REG(PERIPH_BITBAND_ALIAS + (0xFF0*0x20) + 4*j + 0x40*i); + /* Check bit band read data should be 0 or 1 */ + if ((t1|0x1)!=1) { + puts("ERROR: bitband read should only return 0 or 1"); + printf ("Got %x, i=%d, j=%d\n", t1, i, j); + err_code |= 1<<3; + } + /* merge 32-bit word with previous read data */ + if (t1!=0) readdata += 1; /* Set LSB */ + } /* end while */ + + if (verbose_level!=0) printf (" readdata %d = %x\n", i, readdata); + if (readdata!=(HW16_REG(PERIPH_BITBAND_ADDR + 0xFF0 + 2 * i))){ + puts("ERROR: Value mismatch"); + printf ("Expect %x, actual = %x\n",(HW16_REG(PERIPH_BITBAND_ADDR + 0xFF0 + 2 * i)),readdata ); + err_code |= 1<<4; + } + } /* end for */ + + puts (" - Read bitband alias, byte"); + /* Read timer 0 CID registers with bit band alias, half word */ + for (i=0;i<16;i++) { + readdata=0; + + /* Read each bit in the word via bit band alias and reconstruct the 8-bit value */ + j=8; + while(j>0) { + j--; + readdata = readdata << 1; /* Shift */ + t1 = HW8_REG(PERIPH_BITBAND_ALIAS + (0xFF0*0x20) + 4*j + 0x20*i); + /* Check bit band read data should be 0 or 1 */ + if ((t1|0x1)!=1) { + puts("ERROR: bitband read should only return 0 or 1"); + printf ("Got %x, i=%d, j=%d\n", t1, i, j); + err_code |= 1<<5; + } + /* merge 32-bit word with previous read data */ + if (t1!=0) readdata += 1; /* Set LSB */ + } /* end while */ + + if (verbose_level!=0) printf (" readdata %d = %x\n", i, readdata); + if (readdata!=(HW8_REG(PERIPH_BITBAND_ADDR+0xFF0 + i))){ + puts("ERROR: Value mismatch"); + printf ("Expect %x, actual = %x\n",(HW8_REG(PERIPH_BITBAND_ADDR+0xFF0 + i)),readdata ); + err_code |= 1<<6; + } + } /* end for */ + + /* CMSDK_TIMER0->VALUE (0x40000004) and CMSDK_TIMER0->RELOAD (0x40000008) + registers are 32-bit read/write registers which we can use them + for bit-band tests */ + + CMSDK_TIMER0->VALUE = testdata[0]; + CMSDK_TIMER0->RELOAD = testdata[1]; + + puts (" - toggle each bit by write to bit band alias, word size"); + for (i=0;i<2;i++) { + readdata=0; + + /* Toggle each bit in the words via bit band alias and read the 32-bit value afterwards*/ + j=32; + while(j>0) { + j--; + t1 = HW32_REG(PERIPH_BITBAND_ALIAS + (0x004*0x20)+ 4*j + 0x80*i); + /* Toggle bit and check bit band read data should be 0 or 1 */ + if (t1==1) HW32_REG(PERIPH_BITBAND_ALIAS + (0x004*0x20) + 4*j + 0x80*i) = 0; + else if (t1==0) HW32_REG(PERIPH_BITBAND_ALIAS + (0x004*0x20) + 4*j + 0x80*i) = 1; + else { + puts("ERROR: bitband read should only return 0 or 1"); + printf ("Got %x, i=%d, j=%d\n", t1, i, j); + err_code |= 1<<7; + } + } /* end while */ + /* read whole word */ + readdata = HW32_REG(PERIPH_BITBAND_ADDR + 0x4 + 4*i); + if (verbose_level!=0) printf (" readdata %d = %x\n", i, readdata); + if (readdata!=(~testdata[i])){ + puts("ERROR: Value mismatch"); + printf ("Expect %x, actual = %x\n",(~testdata[i]),readdata ); + err_code |= 1<<8; + } + } /* end for */ + + + puts (" Test done\n"); + return err_code; +} + +int EndianCheck(void) +{ + unsigned int err_code = 0; /* error code */ + unsigned int t1; /* temp value */ +const unsigned int testdata[2] = { 0x31241456, 0x92745722}; + int i; /* loop counter */ + + puts ("Checking endian characteristic"); + for (i = 0;i<2; i++){ + HW32_REG(SRAM_BITBAND_ADDR) = testdata[i]; + t1 = HW16_REG(SRAM_BITBAND_ADDR) | (HW16_REG(SRAM_BITBAND_ADDR + 0x2) << 16); + if (t1 != testdata[i]) { + err_code = 1; + printf ("Write 32-bit word %x, read 2x 16-bit halfword %x.\n",testdata[i], t1 ); + } + } + for (i = 0;i<2; i++){ + HW32_REG(SRAM_BITBAND_ADDR) = testdata[i]; + t1 = HW8_REG(SRAM_BITBAND_ADDR ) | (HW8_REG(SRAM_BITBAND_ADDR + 0x1) << 8) | + (HW8_REG(SRAM_BITBAND_ADDR+0x2) << 16) | (HW8_REG(SRAM_BITBAND_ADDR + 0x3) << 24); + if (t1 != testdata[i]) { + err_code = 1; + printf ("Write 32-bit word %x, read 4x 8-bit byte %x.\n", testdata[i], t1); + } + } + if (err_code != 0) { + puts ("The memory system does not fully compliant to endianess,"); + puts ("some tests procedures will be skipped.\n"); + } + return err_code; +} + +int error_test(void) +{ + + unsigned int err_code; /* error code */ + unsigned int t1; /* temp value for bus fault test */ + unsigned int testaddr; /* temp value */ + + err_code = 0; + puts ("Bus fault test"); + puts (" - read error"); + hf_expected = 1; + hf_occurred = 0; + testaddr = SRAM_BITBAND_ALIAS + (0x100000 - 1)*32; // Address to be tested + printf (" test address = %x\n", testaddr); + t1 = HW32_REG(testaddr); + + /* Bus fault should be triggered */ + __ISB(); /* delay */ + __ISB(); /* delay */ + __ISB(); /* delay */ + + if (hf_occurred!=1) { + printf ("Expect 1 fault, actual %d\n", hf_occurred); + err_code = 1; + } + + puts (" - write error"); + hf_expected = 1; + hf_occurred = 0; + + HW32_REG(testaddr)=0; + + /* Bus fault should be triggered */ + __ISB(); /* delay */ + __ISB(); /* delay */ + __ISB(); /* delay */ + + if (hf_occurred!=1) { + printf ("Expect 1 fault, actual %d\n", hf_occurred); + err_code = 1; + } + + /* End of test, clear hf_expected */ + hf_expected = 0; + + puts (" Test done\n"); + return err_code; + +} + +/* Hard fault handler - would be triggered in probing state if + bitband feature is not implemented */ + +void HF_Handler_main(unsigned int * hf_args) +{ + if (probing_state==1) { + /* Bus fault while probing */ + puts ("Bus fault while probing bitband alias\n"); + puts ("** TEST SKIPPED ** Bitband feature not available\n"); + UartEndSimulation(); + } + if (hf_expected==1) { + puts ("Expected Bus fault\n"); + hf_occurred ++; + /* Increment stacked PC */ + hf_args[6] = hf_args[6] + 2; + } + else { + puts ("Unexpected Bus fault\n"); + UartEndSimulation(); + } + return; +} + +#if defined ( __CC_ARM ) +/* ARM or Keil toolchain */ +__asm void HardFault_Handler(void) +{ + MOVS r0, #4 + MOV r1, LR + TST r0, r1 + BEQ stacking_used_MSP + MRS R0, PSP ; first parameter - stacking was using PSP + LDR R1,=__cpp(HF_Handler_main) + BX R1 +stacking_used_MSP + MRS R0, MSP ; first parameter - stacking was using MSP + LDR R1,=__cpp(HF_Handler_main) + BX R1 +} +#else +/* gcc toolchain */ +void HardFault_Handler(void) __attribute__((naked)); +void HardFault_Handler(void) +{ + __asm(" movs r0,#4\n" + " mov r1,lr\n" + " tst r0,r1\n" + " beq stacking_used_MSP\n" + " mrs r0,psp\n" /* first parameter - stacking was using PSP */ + " ldr r1,=HF_Handler_main \n" + " bx r1\n" + "stacking_used_MSP:\n" + " mrs r0,msp\n" /* first parameter - stacking was using PSP */ + " ldr r1,=HF_Handler_main \n" + " bx r1\n" + ".pool\n" ); +} +#endif + diff --git a/Cortex-M0/nanosoc/software/common/validation/default_slaves_tests.c b/Cortex-M0/nanosoc/software/common/validation/default_slaves_tests.c new file mode 100644 index 0000000..065dab9 --- /dev/null +++ b/Cortex-M0/nanosoc/software/common/validation/default_slaves_tests.c @@ -0,0 +1,240 @@ +/*----------------------------------------------------------------------------- +// customised Cortex-M0 'nanosoc' controller +// A joint work commissioned on behalf of SoC Labs, under Arm Academic Access license. +// +// Contributors +// +// David Flynn (d.w.flynn@soton.ac.uk) +// +// Copyright � 2021-3, SoC Labs (www.soclabs.org) +//----------------------------------------------------------------------------- +*/ + +/* + *----------------------------------------------------------------------------- + * The confidential and proprietary information contained in this file may + * only be used by a person authorised under and to the extent permitted + * by a subsisting licensing agreement from Arm Limited or its affiliates. + * + * (C) COPYRIGHT 2010-2013 Arm Limited or its affiliates. + * ALL RIGHTS RESERVED + * + * This entire notice must be reproduced on all copies of this file + * and copies of this file may only be made by a person if such person is + * permitted to do so under the terms of a subsisting license agreement + * from Arm Limited or its affiliates. + * + * SVN Information + * + * Checked In : $Date: 2017-10-10 15:55:38 +0100 (Tue, 10 Oct 2017) $ + * + * Revision : $Revision: 371321 $ + * + * Release Information : Cortex-M System Design Kit-r1p1-00rel0 + *----------------------------------------------------------------------------- + */ + +/* + A simple test to check the operation of default slave and the handling of + error response in the AHB interconnection. +*/ +#ifdef CORTEX_M0 +#include "CMSDK_CM0.h" +#endif + +#ifdef CORTEX_M0PLUS +#include "CMSDK_CM0plus.h" +#endif + +#ifdef CORTEX_M3 +#include "CMSDK_CM3.h" +#endif + +#ifdef CORTEX_M4 +#include "CMSDK_CM4.h" +#endif + +#include <stdio.h> +#include "uart_stdout.h" + +#if defined ( __CC_ARM ) +__asm void address_test_write(unsigned int addr, unsigned int wdata); +__asm unsigned int address_test_read(unsigned int addr); +#else + void address_test_write(unsigned int addr, unsigned int wdata); + unsigned int address_test_read(unsigned int addr); +#endif +void HardFault_Handler_c(unsigned int * hardfault_args, unsigned lr_value); + +/* Global variables */ +volatile int hardfault_occurred; +volatile int hardfault_expected; +volatile int temp_data; + +int main (void) +{ + int err_code = 0; + int rdata; /* dummy variable for read data in bus fault testing */ + + // UART init + UartStdOutInit(); + + // Test banner message and revision number + puts("\nCortex Microcontroller System Design Kit - Default Slave Test - revision $Revision: 371321 $\n"); + + + puts("Default slave tests - hard faults expected\n"); + temp_data=0; + hardfault_occurred = 0; + hardfault_expected = 1; + address_test_write(0x40020000, 0x3456789A); + if (hardfault_occurred==0) {err_code |= (1<<0);} + hardfault_occurred = 0; + + rdata = address_test_read(0x40020000); + if (hardfault_occurred==0) {err_code |= (1<<1);} + hardfault_occurred = 0; + + address_test_write(0x50000000, 0x3456789A); + if (hardfault_occurred==0) {err_code |= (1<<2);} + hardfault_occurred = 0; + + rdata = address_test_read(0x50000000); + if (hardfault_occurred==0) {err_code |= (1<<3);} + hardfault_occurred = 0; + + puts("\nAPB test slave - hard faults expected\n"); + rdata = address_test_read(0x40003000); + if (hardfault_occurred==0) {err_code |= (1<<4);} + hardfault_occurred = 0; + + rdata = address_test_read(0x40007000); + if (hardfault_occurred==0) {err_code |= (1<<5);} + hardfault_occurred = 0; + + rdata = address_test_read(0x40009000); + if (hardfault_occurred==0) {err_code |= (1<<6);} + hardfault_occurred = 0; + + rdata = address_test_read(0x4000A000); + if (hardfault_occurred==0) {err_code |= (1<<7);} + hardfault_occurred = 0; + + /* clean up */ + hardfault_expected = 0; + + /* Generate test pass/fail and return value */ + if (err_code==0) { + printf ("\n** TEST PASSED **\n"); + } else { + printf ("\n** TEST FAILED **, Error code = (0x%x)\n", err_code); + } + UartEndSimulation(); + return 0; +} + +#if defined ( __CC_ARM ) +/* Test function for write - for ARM / Keil */ +__asm void address_test_write(unsigned int addr, unsigned int wdata) +{ + STR R1,[R0] + DSB ; Ensure bus fault occurred before leaving this subroutine + BX LR +} + +#else +/* Test function for write - for gcc */ +void address_test_write(unsigned int addr, unsigned int wdata) __attribute__((naked)); +void address_test_write(unsigned int addr, unsigned int wdata) +{ + __asm(" str r1,[r0]\n" + " dsb \n" + " bx lr \n" + ); +} +#endif + +/* Test function for read */ +#if defined ( __CC_ARM ) +/* Test function for read - for ARM / Keil */ +__asm unsigned int address_test_read(unsigned int addr) +{ + LDR R1,[R0] + DSB ; Ensure bus fault occurred before leaving this subroutine + MOVS R0, R1 + BX LR +} +#else +/* Test function for read - for gcc */ +unsigned int address_test_read(unsigned int addr) __attribute__((naked)); +unsigned int address_test_read(unsigned int addr) +{ + __asm(" ldr r1,[r0]\n" + " dsb \n" + " movs r0, r1 \n" + " bx lr \n" + ); +} +#endif + + +#if defined ( __CC_ARM ) +/* ARM or Keil toolchain */ +__asm void HardFault_Handler(void) +{ + MOVS r0, #4 + MOV r1, LR + TST r0, r1 + BEQ stacking_used_MSP + MRS R0, PSP ; // first parameter - stacking was using PSP + B get_LR_and_branch +stacking_used_MSP + MRS R0, MSP ; // first parameter - stacking was using MSP +get_LR_and_branch + MOV R1, LR ; // second parameter is LR current value + LDR R2,=__cpp(HardFault_Handler_c) + BX R2 + ALIGN +} +#else +/* gcc toolchain */ +void HardFault_Handler(void) __attribute__((naked)); +void HardFault_Handler(void) +{ + __asm(" movs r0,#4\n" + " mov r1,lr\n" + " tst r0,r1\n" + " beq stacking_used_MSP\n" + " mrs r0,psp\n" /* first parameter - stacking was using PSP */ + " ldr r1,=HardFault_Handler_c \n" + " bx r1\n" + "stacking_used_MSP:\n" + " mrs r0,msp\n" /* first parameter - stacking was using PSP */ + " ldr r1,=HardFault_Handler_c \n" + " bx r1\n" + ".pool\n" ); +} + +#endif +/* C part of the fault handler - common between ARM / Keil /gcc */ +void HardFault_Handler_c(unsigned int * hardfault_args, unsigned lr_value) +{ + unsigned int stacked_pc; + unsigned int stacked_r0; + hardfault_occurred++; + puts ("[Hard Fault Handler]"); + if (hardfault_expected==0) { + puts ("ERROR : Unexpected HardFault interrupt occurred.\n"); + UartEndSimulation(); + while (1); + } + stacked_r0 = ((unsigned long) hardfault_args[0]); + stacked_pc = ((unsigned long) hardfault_args[6]); + printf(" - Stacked R0 : 0x%x\n", stacked_r0); + printf(" - Stacked PC : 0x%x\n", stacked_pc); + /* Modify R0 to a valid address */ + hardfault_args[0] = (unsigned long) &temp_data; + + return; +} + diff --git a/Cortex-M0/nanosoc/software/common/validation/dma_tests.c b/Cortex-M0/nanosoc/software/common/validation/dma_tests.c new file mode 100644 index 0000000..5c06eb9 --- /dev/null +++ b/Cortex-M0/nanosoc/software/common/validation/dma_tests.c @@ -0,0 +1,543 @@ +/* + *----------------------------------------------------------------------------- + * The confidential and proprietary information contained in this file may + * only be used by a person authorised under and to the extent permitted + * by a subsisting licensing agreement from Arm Limited or its affiliates. + * + * (C) COPYRIGHT 2010-2013 Arm Limited or its affiliates. + * ALL RIGHTS RESERVED + * + * This entire notice must be reproduced on all copies of this file + * and copies of this file may only be made by a person if such person is + * permitted to do so under the terms of a subsisting license agreement + * from Arm Limited or its affiliates. + * + * SVN Information + * + * Checked In : $Date: 2017-10-10 15:55:38 +0100 (Tue, 10 Oct 2017) $ + * + * Revision : $Revision: 371321 $ + * + * Release Information : Cortex-M System Design Kit-r1p1-00rel0 + *----------------------------------------------------------------------------- + */ + +/* + A simple test to check the connectivity of the DMA-230 including + interrupt and done signals +*/ + +#ifdef CORTEX_M0 +#include "CMSDK_CM0.h" +#endif + +#ifdef CORTEX_M0PLUS +#include "CMSDK_CM0plus.h" +#endif + +#ifdef CORTEX_M3 +#include "CMSDK_CM3.h" +#endif + +#ifdef CORTEX_M4 +#include "CMSDK_CM4.h" +#endif + +#include <stdio.h> +#include "uart_stdout.h" + +#include "config_id.h" + +#define HW32_REG(ADDRESS) (*((volatile unsigned long *)(ADDRESS))) +volatile int dma_done_irq_occurred; +volatile int dma_done_irq_expected; +volatile int dma_error_irq_occurred; +volatile int dma_error_irq_expected; + +int pl230_dma_detect(void); +int ID_Check(const unsigned int id_array[], unsigned int offset); +void dma_memory_copy (unsigned int src, unsigned int dest, unsigned int size, unsigned int num); +void dma_data_struct_init(void); +void dma_pl230_init(void); +int dma_simple_test(void); +int dma_interrupt_test(void); +int dma_event_test(void); +void delay(void); + + /* Maximum to 32 DMA channel */ +#define MAX_NUM_OF_DMA_CHANNELS 32 + /* SRAM in example system is 64K bytes */ +#define RAM_ADDRESS_MAX 0x3000FFFF + +typedef struct /* 4 words */ +{ + volatile unsigned long SrcEndPointer; + volatile unsigned long DestEndPointer; + volatile unsigned long Control; + volatile unsigned long unused; +} pl230_dma_channel_data; + + +typedef struct /* 8 words per channel */ +{ /* only one channel in the example uDMA setup */ + volatile pl230_dma_channel_data Primary[MAX_NUM_OF_DMA_CHANNELS]; + volatile pl230_dma_channel_data Alternate[MAX_NUM_OF_DMA_CHANNELS]; +} pl230_dma_data_structure; + +pl230_dma_data_structure *dma_data; + +volatile unsigned int source_data_array[4]; /* Data array for memory DMA test */ +volatile unsigned int dest_data_array[4]; /* Data array for memory DMA test */ + +int main (void) +{ + int result=0; + + // UART init + UartStdOutInit(); + + // Test banner message and revision number + puts("\nCortex Microcontroller System Design Kit - DMA Test - revision $Revision: 371321 $\n"); + + + if (pl230_dma_detect()!=0) { + return 0; /* Quit test if DMA is not present */ + } + + dma_done_irq_expected = 0; + dma_done_irq_occurred = 0; + dma_error_irq_expected = 0; + dma_error_irq_occurred = 0; + dma_data_struct_init(); + dma_pl230_init(); + + result += dma_simple_test(); + result += dma_interrupt_test(); + result += dma_event_test(); + if (result==0) { + printf ("\n** TEST PASSED **\n"); + } else { + printf ("\n** TEST FAILED **, Error code = (0x%x)\n", result); + } + UartEndSimulation(); + return 0; +} + +/* --------------------------------------------------------------- */ +/* Detect if DMA controller is present or not */ +/* --------------------------------------------------------------- */ + +int pl230_dma_detect(void) +{ + int result; + + unsigned const int pl230_id[12] = { + 0x30, 0xB2, 0x0B, 0x00, + 0x0D, 0xF0, 0x05, 0xB1}; + puts("Detect if DMA controller is present..."); + result = ID_Check(&pl230_id[0] , CMSDK_PL230_BASE); + if (result!=0) { + puts("** TEST SKIPPED ** DMA controller is not present.\n"); + UartEndSimulation(); + } + return(result); +} + +int ID_Check(const unsigned int id_array[], unsigned int offset) +{ +int i; +unsigned long expected_val, actual_val; +unsigned long compare_mask; +int mismatch = 0; +unsigned long test_addr; + + /* Check the peripheral ID and component ID */ + for (i=0;i<8;i++) { + test_addr = offset + 4*i + 0xFE0; + expected_val = id_array[i]; + actual_val = HW32_REG(test_addr); + + /* create mask to ignore version numbers */ + if (i==2) { compare_mask = 0xF0;} // mask out version field + else { compare_mask = 0x00;} // compare whole value + + if ((expected_val & (~compare_mask)) != (actual_val & (~compare_mask))) { + printf ("Difference found: %x, expected %x, actual %x\n", test_addr, expected_val, actual_val); + mismatch++; + } + + } // end_for +return (mismatch); +} + +/* --------------------------------------------------------------- */ +/* Initialize DMA data structure */ +/* --------------------------------------------------------------- */ +void dma_data_struct_init(void) +{ + int i; /* loop counter */ + unsigned int ptr; + + int ch_num; /* number of channels */ + unsigned int blksize; /* Size of DMA data structure in bytes */ + unsigned int blkmask; /* address mask */ + + + ch_num = (((CMSDK_DMA->DMA_STATUS) >> 16) & 0x1F)+1; + blksize = ch_num * 32; + if (ch_num > 16) blkmask = 0x3FF; /* 17 to 32 */ + else if (ch_num > 8) blkmask = 0x1FF; /* 9 to 16 */ + else if (ch_num > 4) blkmask = 0x0FF; /* 5 to 8 */ + else if (ch_num > 2) blkmask = 0x07F; /* 3 to 4 */ + else if (ch_num > 1) blkmask = 0x07F; /* 2 */ + else blkmask = 0x03F; /* 1 */ + + /* Create DMA data structure in RAM after stack + In the linker script, a 1KB memory stack above stack is reserved + so we can use this space for putting the DMA data structure. + */ + + ptr = HW32_REG(0); /* Read Top of Stack */ + + /* the DMA data structure must be aligned to the size of the data structure */ + if ((ptr & blkmask) != 0x0) + ptr = (ptr + blksize) & ~blkmask; + + if ((ptr + blksize) > (RAM_ADDRESS_MAX + 1)) { + puts ("ERROR : Not enough RAM space for DMA data structure."); + UartEndSimulation(); + } + + /* Set pointer to the reserved space */ + dma_data = (pl230_dma_data_structure *) ptr; + ptr = (unsigned int) &dma_data->Primary->SrcEndPointer; + + printf ("dma structure block address = %x\n", ptr); + + for (i=0; i<1; i++) { + dma_data->Primary->SrcEndPointer = 0; + dma_data->Primary->DestEndPointer = 0; + dma_data->Primary->Control = 0; + dma_data->Alternate->SrcEndPointer = 0; + dma_data->Alternate->DestEndPointer = 0; + dma_data->Alternate->Control = 0; + } + + return; +} + +/* --------------------------------------------------------------- */ +/* Initialize DMA PL230 */ +/* --------------------------------------------------------------- */ +void dma_pl230_init(void) +{ + unsigned int current_state; + puts ("Initialize PL230"); + current_state = CMSDK_DMA->DMA_STATUS; + printf ("- # of channels allowed : %d\n",(((current_state) >> 16) & 0x1F)+1); + /* Debugging printfs: */ + /*printf ("- Current status : %x\n",(((current_state) >> 4) & 0xF));*/ + /*printf ("- Current master enable : %x\n",(((current_state) >> 0) & 0x1));*/ + + /* Wait until current DMA complete */ + current_state = (CMSDK_DMA->DMA_STATUS >> 4) & 0xF; + if (!((current_state==0) || (current_state==0x8) || (current_state==0x9))) { + puts ("- wait for DMA IDLE/STALLED/DONE"); + current_state = (CMSDK_DMA->DMA_STATUS >> 4) & 0xF; + printf ("- Current status : %x\n",(((current_state) >> 4) & 0xF)); + + } + while (!((current_state==0) || (current_state==0x8) || (current_state==0x9))){ + /* Wait if not IDLE/STALLED/DONE */ + current_state = (CMSDK_DMA->DMA_STATUS >> 4) & 0xF; + printf ("- Current status : %x\n",(((current_state) >> 4) & 0xF)); + } + CMSDK_DMA->DMA_CFG = 0; /* Disable DMA controller for initialization */ + CMSDK_DMA->CTRL_BASE_PTR = (unsigned int) &dma_data->Primary->SrcEndPointer; + /* Set DMA data structure address */ + CMSDK_DMA->CHNL_ENABLE_CLR = 0xFFFFFFFF; /* Disable all channels */ + CMSDK_DMA->CHNL_ENABLE_SET = (1<<0); /* Enable channel 0 */ + CMSDK_DMA->DMA_CFG = 1; /* Enable DMA controller */ + + return; +} + +/* --------------------------------------------------------------- */ +/* DMA memory copy */ +/* --------------------------------------------------------------- */ +void dma_memory_copy (unsigned int src, unsigned int dest, unsigned int size, unsigned int num) +{ + unsigned long src_end_pointer = src + ((1<<size)*(num-1)); + unsigned long dst_end_pointer = dest + ((1<<size)*(num-1)); + unsigned long control = (size << 30) | /* dst_inc */ + (size << 28) | /* dst_size */ + (size << 26) | /* src_inc */ + (size << 24) | /* src_size */ + (size << 21) | /* dst_prot_ctrl - HPROT[3:1] */ + (size << 18) | /* src_prot_ctrl - HPROT[3:1] */ + (0 << 14) | /* R_power */ + ((num-1)<< 4) | /* n_minus_1 */ + (0 << 3) | /* next_useburst */ + (2 << 0) ; /* cycle_ctrl - auto */ + + /* By default the PL230 is little-endian; if the processor is configured + * big-endian then the configuration data that is written to memory must be + * byte-swapped before being written. This is also true if the processor is + * little-endian and the PL230 is big-endian. + * Remove the __REV usage if the processor and PL230 are configured with the + * same endianness + * */ + dma_data->Primary->SrcEndPointer = (EXPECTED_BE) ? __REV(src_end_pointer) : (src_end_pointer); + dma_data->Primary->DestEndPointer = (EXPECTED_BE) ? __REV(dst_end_pointer) : (dst_end_pointer); + dma_data->Primary->Control = (EXPECTED_BE) ? __REV(control ) : (control ); + /* Debugging printfs: */ + /*printf ("SrcEndPointer = %x\n", dma_data->Primary->SrcEndPointer);*/ + /*printf ("DestEndPointer = %x\n", dma_data->Primary->DestEndPointer);*/ + + CMSDK_DMA->CHNL_ENABLE_SET = (1<<0); /* Enable channel 0 */ + CMSDK_DMA->CHNL_SW_REQUEST = (1<<0); /* request channel 0 DMA */ + + return; +} + +/* --------------------------------------------------------------- */ +/* Simple software DMA test */ +/* --------------------------------------------------------------- */ +int dma_simple_test(void) +{ + int return_val=0; + int err_code=0; + int i; + unsigned int current_state; + + + puts("uDMA simple test"); + CMSDK_DMA->CHNL_ENABLE_SET = (1<<0); /* Enable channel 0 */ + + /* setup data for DMA */ + for (i=0;i<4;i++) { + source_data_array[i] = i; + dest_data_array[i] = 0; + } + + dma_memory_copy ((unsigned int) &source_data_array[0],(unsigned int) &dest_data_array[0], 2, 4); + do { /* Wait until PL230 DMA controller return to idle state */ + current_state = (CMSDK_DMA->DMA_STATUS >> 4) & 0xF; + } while (current_state!=0); + + for (i=0;i<4;i++) { + /* Debugging printf: */ + /*printf (" - dest[i] = %x\n", dest_data_array[i]);*/ + if (dest_data_array[i]!= i){ + printf ("ERROR:dest_data_array[%d], expected %x, actual %x\n", i, i, dest_data_array[i]); + err_code |= (1<<i); + } + } + + /* Generate return value */ + if (err_code != 0) { + printf ("ERROR : simple DMA failed (0x%x)\n", err_code); + return_val=1; + } else { + puts ("-Passed"); + } + + return(return_val); +} +/* --------------------------------------------------------------- */ +/* Simple DMA interrupt test */ +/* --------------------------------------------------------------- */ +int dma_interrupt_test(void) +{ + int return_val=0; + int err_code=0; + int i; + unsigned int current_state; + + + puts("DMA interrupt test"); + puts("- DMA done"); + + CMSDK_DMA->CHNL_ENABLE_SET = (1<<0); /* Enable channel 0 */ + + /* setup data for DMA */ + for (i=0;i<4;i++) { + source_data_array[i] = i; + dest_data_array[i] = 0; + } + + dma_done_irq_expected = 1; + dma_done_irq_occurred = 0; + NVIC_ClearPendingIRQ(DMA_IRQn); + NVIC_EnableIRQ(DMA_IRQn); + + dma_memory_copy ((unsigned int) &source_data_array[0],(unsigned int) &dest_data_array[0], 2, 4); + delay(); + /* Can't guarantee that there is sleep support, so use a polling loop */ + do { /* Wait until PL230 DMA controller return to idle state */ + current_state = (CMSDK_DMA->DMA_STATUS >> 4) & 0xF; + } while (current_state!=0); + + for (i=0;i<4;i++) { + /* Debugging printf: */ + /*printf (" - dest[i] = %x\n", dest_data_array[i]);*/ + if (dest_data_array[i]!= i){ + printf ("ERROR:dest_data_array[%d], expected %x, actual %x\n", i, i, dest_data_array[i]); + err_code |= (1<<i); + } + } + + if (dma_done_irq_occurred==0){ + puts ("ERROR: DMA done IRQ missing"); + err_code |= (1<<4); + } + + puts("- DMA err"); + CMSDK_DMA->CHNL_ENABLE_SET = (1<<0); /* Enable channel 0 */ + + /* setup data for DMA */ + for (i=0;i<4;i++) { + source_data_array[i] = i; + dest_data_array[i] = 0; + } + + dma_error_irq_expected = 1; + dma_error_irq_occurred = 0; + NVIC_ClearPendingIRQ(DMA_IRQn); + NVIC_EnableIRQ(DMA_IRQn); + + /* Generate DMA transfer to invalid memory location */ + dma_memory_copy ((unsigned int) &source_data_array[0],0x1F000000, 2, 4); + delay(); + /* Can't guarantee that there is sleep support, so use a polling loop */ + do { /* Wait until PL230 DMA controller return to idle state */ + current_state = (CMSDK_DMA->DMA_STATUS >> 4) & 0xF; + } while (current_state!=0); + + if (dma_error_irq_occurred==0){ + puts ("ERROR: DMA err IRQ missing"); + err_code |= (1<<5); + } + + + /* Clear up */ + dma_done_irq_expected = 0; + dma_done_irq_occurred = 0; + dma_error_irq_expected = 0; + dma_error_irq_occurred = 0; + NVIC_DisableIRQ(DMA_IRQn); + + /* Generate return value */ + if (err_code != 0) { + printf ("ERROR : DMA done interrupt failed (0x%x)\n", err_code); + return_val=1; + } else { + puts ("-Passed"); + } + + return(return_val); +} + +/* --------------------------------------------------------------- */ +/* DMA event test */ +/* --------------------------------------------------------------- */ +int dma_event_test(void) +{ + int return_val=0; + int err_code=0; + int i; + unsigned int current_state; + + + puts("DMA event test"); + puts("- DMA done event to RXEV"); + + CMSDK_DMA->CHNL_ENABLE_SET = (1<<0); /* Enable channel 0 */ + + /* setup data for DMA */ + for (i=0;i<4;i++) { + source_data_array[i] = i; + dest_data_array[i] = 0; + } + + dma_done_irq_expected = 1; + dma_done_irq_occurred = 0; + NVIC_ClearPendingIRQ(DMA_IRQn); + NVIC_DisableIRQ(DMA_IRQn); + + /* Clear event register - by setting event with SEV and then clear it with WFE */ + __SEV(); + __WFE(); /* First WFE will not enter sleep because of previous event */ + + dma_memory_copy ((unsigned int) &source_data_array[0],(unsigned int) &dest_data_array[0], 2, 4); + __WFE(); /* This will cause the processor to enter sleep */ + + /* Processor woken up */ + current_state = (CMSDK_DMA->DMA_STATUS >> 4) & 0xF; + if (current_state!=0) { + puts ("ERROR: DMA status should be IDLE after wake up"); + err_code |= (1<<5); + } + + for (i=0;i<4;i++) { + /*printf (" - dest[i] = %x\n", dest_data_array[i]);*/ + if (dest_data_array[i]!= i){ + printf ("ERROR:dest_data_array[%d], expected %x, actual %x\n", i, i, dest_data_array[i]); + err_code |= (1<<i); + } + } + + /* Generate return value */ + if (err_code != 0) { + printf ("ERROR : DMA event failed (0x%x)\n", err_code); + return_val=1; + } else { + puts ("-Passed"); + } + + return(return_val); +} + +/* --------------------------------------------------------------- */ +/* DMA interrupt handlers */ +/* --------------------------------------------------------------- */ + +void DMA_Handler(void) +{ +if ((CMSDK_DMA->ERR_CLR & 1) != 0) { + /* DMA interrupt is caused by DMA error */ + dma_error_irq_occurred ++; + CMSDK_DMA->ERR_CLR = 1; /* Clear dma_err */ + if (dma_error_irq_expected==0) { + puts ("ERROR : Unexpected DMA error interrupt occurred.\n"); + UartEndSimulation(); + while (1); + } + } +else { + // DMA interrupt is caused by DMA done + dma_done_irq_occurred ++; + if (dma_done_irq_expected==0) { + puts ("ERROR : Unexpected DMA done interrupt occurred.\n"); + UartEndSimulation(); + while (1); + } + } +} + +void HardFault_Handler(void) +{ + puts ("[Hard fault]\n"); + UartEndSimulation(); + while (1); +} + +void delay(void) +{ + int i; + for (i=0;i<5;i++){ + __ISB(); + } + return; +} + diff --git a/Cortex-M0/nanosoc/software/common/validation/ext_sys_tests.c b/Cortex-M0/nanosoc/software/common/validation/ext_sys_tests.c new file mode 100644 index 0000000..f0ffe1f --- /dev/null +++ b/Cortex-M0/nanosoc/software/common/validation/ext_sys_tests.c @@ -0,0 +1,677 @@ +/* + *----------------------------------------------------------------------------- + * The confidential and proprietary information contained in this file may + * only be used by a person authorised under and to the extent permitted + * by a subsisting licensing agreement from Arm Limited or its affiliates. + * + * (C) COPYRIGHT 2010-2013 Arm Limited or its affiliates. + * ALL RIGHTS RESERVED + * + * This entire notice must be reproduced on all copies of this file + * and copies of this file may only be made by a person if such person is + * permitted to do so under the terms of a subsisting license agreement + * from Arm Limited or its affiliates. + * + * SVN Information + * + * Checked In : $Date: 2017-10-10 15:55:38 +0100 (Tue, 10 Oct 2017) $ + * + * Revision : $Revision: 371321 $ + * + * Release Information : Cortex-M System Design Kit-r1p1-00rel0 + *----------------------------------------------------------------------------- + */ + +/* + A simple test to check the operation of components instantiated in the + extended example subsystem. +*/ + +#ifdef CORTEX_M0 +#include "CMSDK_CM0.h" +#endif + +#ifdef CORTEX_M0PLUS +#include "CMSDK_CM0plus.h" +#endif + +#ifdef CORTEX_M3 +#include "CMSDK_CM3.h" +#endif + +#ifdef CORTEX_M4 +#include "CMSDK_CM4.h" +#endif + +#include <stdio.h> +#include "uart_stdout.h" + +#if defined ( __CC_ARM ) +__asm void address_test_write(unsigned int addr, unsigned int wdata); +__asm unsigned int address_test_read(unsigned int addr); +#else + void address_test_write(unsigned int addr, unsigned int wdata); + unsigned int address_test_read(unsigned int addr); +#endif +void HardFault_Handler_c(unsigned int * hardfault_args, unsigned lr_value); + +/* Macros for word, half word and byte */ +#define HW32_REG(ADDRESS) (*((volatile unsigned long *)(ADDRESS))) +#define HW16_REG(ADDRESS) (*((volatile unsigned short *)(ADDRESS))) +#define HW8_REG(ADDRESS) (*((volatile unsigned char *)(ADDRESS))) + +#define ADDR_BASE_APB4_EG_SLAVE_1 0x50000000 +#define ADDR_BASE_APB4_EG_SLAVE_2 0x52000000 +#define ADDR_BASE_APB3_EG_SLAVE 0x50001000 +#define ADDR_BASE_AHB_EG_SLAVE 0x50020000 +#define ADDR_BASE_AHB_TB_SLAVE_1 0x50002000 +#define ADDR_BASE_AHB_TB_SLAVE_2 0x51010000 +#define ADDR_BASE_AHB_TB_SLAVE_3 0x52002000 + +/* Function definition */ +int check_apb4_eg_slave(unsigned long base_addr); +int check_apb3_eg_slave(unsigned long base_addr); +int check_ahb_eg_slave(unsigned long base_addr); +int check_ahb_tb_slave(unsigned long base_addr); +int check_default_slave(unsigned long base_addr); + +/* Global variables */ +volatile int hardfault_occurred; +volatile int hardfault_expected; +volatile int temp_data; +volatile int probe_ext_eg_sys=0; /* Set to 1 for memory map probing */ + +// ----------------------------------------------------------- +// Start of main program +// ----------------------------------------------------------- + +int main (void) +{ + int result=0; + unsigned int dummy; /* dummy variable for memory probing */ + + // UART init + UartStdOutInit(); + + // Test banner message and revision number + puts("\nCortex Microcontroller System Design Kit - Extended Subsystem Test - revision $Revision: 371321 $\n"); + + probe_ext_eg_sys = 1; /* Probe to see if extended subsystem is included */ + /* If extended subsystem is included, the following read will be carried out, + otherwise an error response will be received and enter hard fault */ + dummy = HW32_REG(ADDR_BASE_APB4_EG_SLAVE_1 + 0xFE0); + + probe_ext_eg_sys = 0; /* Example system exist, continue operation */ + + temp_data=0; + + // Test access to APB4 Example Slave + result |= check_apb4_eg_slave(ADDR_BASE_APB4_EG_SLAVE_1); + result |= check_apb4_eg_slave(ADDR_BASE_APB4_EG_SLAVE_2); + + // Test access to APB3 Example Slave + result |= check_apb3_eg_slave(ADDR_BASE_APB3_EG_SLAVE); + + // Test access to AHB Example Slave + result |= check_ahb_eg_slave(ADDR_BASE_AHB_EG_SLAVE); + + // Test access to AHB Trickbox Slave + result |= check_ahb_tb_slave(ADDR_BASE_AHB_TB_SLAVE_1); + result |= check_ahb_tb_slave(ADDR_BASE_AHB_TB_SLAVE_3); + + // Test access to Default slave + puts ("Checking AHB Default slave"); + result |= check_default_slave(0x52020000); + result |= check_default_slave(0x68000000); + + /* clean up */ + hardfault_expected = 0; + + if (result==0) { + printf ("\n** TEST PASSED **\n"); + } else { + printf ("\n** TEST FAILED **, Error code = (0x%x)\n", result); + } + UartEndSimulation(); + return 0; +} +// ----------------------------------------------------------- +// Check the access to APB4 example slave +// ----------------------------------------------------------- +int check_apb4_eg_slave(unsigned long base_addr) +{ + const char apb4_id[12] = {0x04, 0x00, 0x00, 0x00, + 0x19, 0xB8, 0x1B, 0x00, + 0x0D, 0xF0, 0x05, 0xB1}; + int return_val=0; + int err_code=0; + int i; + + puts ("Checking APB4 Example slave"); + // ------------------------- + puts ("- check ID values"); + for (i=0; i<12; i++) { + if (HW32_REG(base_addr + 0xFD0 + 4*i) != apb4_id[i]) { + printf (" ID [%d] ERROR : expected %x, actual %x\n", i, apb4_id[i], HW32_REG(base_addr + 0xFD0 + 4*i)); + err_code = err_code | 0x1; + } + } + // ------------------------- + puts ("- initial data values"); + for (i=0; i<4; i++) { + printf (" Data[%d] = %x\n", i, HW32_REG(base_addr + 4*i)); + } + + puts ("- check R/W in word size"); + + HW32_REG(base_addr ) = 0x12345678; + HW32_REG(base_addr +0x04) = 0x55CC33AA; + HW32_REG(base_addr +0x08) = 0xFF008765; + HW32_REG(base_addr +0x0C) = 0x99AABCDE; + + if (HW32_REG(base_addr ) != 0x12345678) {err_code |= (1<<2); puts(" ERROR @ Data0");} + if (HW32_REG(base_addr +0x04) != 0x55CC33AA) {err_code |= (1<<2); puts(" ERROR @ Data1");} + if (HW32_REG(base_addr +0x08) != 0xFF008765) {err_code |= (1<<2); puts(" ERROR @ Data2");} + if (HW32_REG(base_addr +0x0C) != 0x99AABCDE) {err_code |= (1<<2); puts(" ERROR @ Data3");} + + + puts ("- check R/W in halfword size"); + + HW16_REG(base_addr ) = 0xA987; + HW16_REG(base_addr +0x02) = 0xEDCB; + HW16_REG(base_addr +0x04) = 0xCC55; + HW16_REG(base_addr +0x06) = 0xAA33; + HW16_REG(base_addr +0x08) = 0x789A; + HW16_REG(base_addr +0x0A) = 0x00FF; + HW16_REG(base_addr +0x0C) = 0x4321; + HW16_REG(base_addr +0x0E) = 0x6655; + + if (HW16_REG(base_addr ) != 0xA987) {err_code |= (1<<3); puts(" ERROR @ Data0");} + if (HW16_REG(base_addr +0x02) != 0xEDCB) {err_code |= (1<<3); puts(" ERROR @ Data1");} + if (HW16_REG(base_addr +0x04) != 0xCC55) {err_code |= (1<<3); puts(" ERROR @ Data2");} + if (HW16_REG(base_addr +0x06) != 0xAA33) {err_code |= (1<<3); puts(" ERROR @ Data3");} + if (HW16_REG(base_addr +0x08) != 0x789A) {err_code |= (1<<3); puts(" ERROR @ Data4");} + if (HW16_REG(base_addr +0x0A) != 0x00FF) {err_code |= (1<<3); puts(" ERROR @ Data5");} + if (HW16_REG(base_addr +0x0C) != 0x4321) {err_code |= (1<<3); puts(" ERROR @ Data6");} + if (HW16_REG(base_addr +0x0E) != 0x6655) {err_code |= (1<<3); puts(" ERROR @ Data7");} + + puts ("- check R/W in byte size"); + + HW8_REG(base_addr ) = 0xA9; // swap upper and lower byte + HW8_REG(base_addr +0x01) = 0x87; + HW8_REG(base_addr +0x02) = 0xED; + HW8_REG(base_addr +0x03) = 0xCB; + HW8_REG(base_addr +0x04) = 0xCC; + HW8_REG(base_addr +0x05) = 0x55; + HW8_REG(base_addr +0x06) = 0xAA; + HW8_REG(base_addr +0x07) = 0x33; + HW8_REG(base_addr +0x08) = 0x78; + HW8_REG(base_addr +0x09) = 0x9A; + HW8_REG(base_addr +0x0A) = 0x00; + HW8_REG(base_addr +0x0B) = 0xFF; + HW8_REG(base_addr +0x0C) = 0x43; + HW8_REG(base_addr +0x0D) = 0x21; + HW8_REG(base_addr +0x0E) = 0x66; + HW8_REG(base_addr +0x0F) = 0x55; + + if (HW8_REG(base_addr ) != 0xA9) {err_code |= (1<<4); puts(" ERROR @ Data0");} + if (HW8_REG(base_addr +0x01) != 0x87) {err_code |= (1<<4); puts(" ERROR @ Data1");} + if (HW8_REG(base_addr +0x02) != 0xED) {err_code |= (1<<4); puts(" ERROR @ Data2");} + if (HW8_REG(base_addr +0x03) != 0xCB) {err_code |= (1<<4); puts(" ERROR @ Data3");} + if (HW8_REG(base_addr +0x04) != 0xCC) {err_code |= (1<<4); puts(" ERROR @ Data4");} + if (HW8_REG(base_addr +0x05) != 0x55) {err_code |= (1<<4); puts(" ERROR @ Data5");} + if (HW8_REG(base_addr +0x06) != 0xAA) {err_code |= (1<<4); puts(" ERROR @ Data6");} + if (HW8_REG(base_addr +0x07) != 0x33) {err_code |= (1<<4); puts(" ERROR @ Data7");} + if (HW8_REG(base_addr +0x08) != 0x78) {err_code |= (1<<4); puts(" ERROR @ Data8");} + if (HW8_REG(base_addr +0x09) != 0x9A) {err_code |= (1<<4); puts(" ERROR @ Data9");} + if (HW8_REG(base_addr +0x0A) != 0x00) {err_code |= (1<<4); puts(" ERROR @ DataA");} + if (HW8_REG(base_addr +0x0B) != 0xFF) {err_code |= (1<<4); puts(" ERROR @ DataB");} + if (HW8_REG(base_addr +0x0C) != 0x43) {err_code |= (1<<4); puts(" ERROR @ DataC");} + if (HW8_REG(base_addr +0x0D) != 0x21) {err_code |= (1<<4); puts(" ERROR @ DataD");} + if (HW8_REG(base_addr +0x0E) != 0x66) {err_code |= (1<<4); puts(" ERROR @ DataE");} + if (HW8_REG(base_addr +0x0F) != 0x55) {err_code |= (1<<4); puts(" ERROR @ DataF");} + + if (err_code != 0) { + printf ("ERROR : APB4 eg slave access failed (0x%x)\n", err_code); + return_val=1; + + err_code = 0; + } + return(return_val); + +} +// ----------------------------------------------------------- +// Check the access to APB3 example slave +// ----------------------------------------------------------- +int check_apb3_eg_slave(unsigned long base_addr) +{ + const char apb3_id[12] = {0x04, 0x00, 0x00, 0x00, + 0x18, 0xB8, 0x1B, 0x00, + 0x0D, 0xF0, 0x05, 0xB1}; + int return_val=0; + int err_code=0; + int i; + + puts ("Checking APB3 Example slave"); + // ------------------------- + puts ("- check ID values"); + for (i=0; i<12; i++) { + if (HW32_REG(base_addr + 0xFD0 + 4*i) != apb3_id[i]) { + printf (" ID [%d] ERROR : expected %x, actual %x\n", i, apb3_id[i], HW32_REG(base_addr + 0xFD0 + 4*i)); + err_code = err_code | 0x1; + } + } + // ------------------------- + puts ("- initial data values"); + for (i=0; i<4; i++) { + printf (" Data[%d] = %x\n", i, HW32_REG(ADDR_BASE_APB3_EG_SLAVE + 4*i)); + } + + puts ("- check R/W in word size"); + + HW32_REG(base_addr ) = 0x12345678; + HW32_REG(base_addr +0x04) = 0x55CC33AA; + HW32_REG(base_addr +0x08) = 0xFF008765; + HW32_REG(base_addr +0x0C) = 0x99AABCDE; + + if (HW32_REG(base_addr ) != 0x12345678) {err_code |= (1<<2); puts(" ERROR @ Data0");} + if (HW32_REG(base_addr +0x04) != 0x55CC33AA) {err_code |= (1<<2); puts(" ERROR @ Data1");} + if (HW32_REG(base_addr +0x08) != 0xFF008765) {err_code |= (1<<2); puts(" ERROR @ Data2");} + if (HW32_REG(base_addr +0x0C) != 0x99AABCDE) {err_code |= (1<<2); puts(" ERROR @ Data3");} + + + + if (err_code != 0) { + printf ("ERROR : APB3 eg slave access failed (0x%x)\n", err_code); + return_val=1; + err_code = 0; + } + return(return_val); + +} +// ----------------------------------------------------------- +// Check the access to AHB example slave +// ----------------------------------------------------------- +int check_ahb_eg_slave(unsigned long base_addr) +{ + const char ahb_id[12] = {0x04, 0x00, 0x00, 0x00, + 0x17, 0xB8, 0x1B, 0x00, + 0x0D, 0xF0, 0x05, 0xB1}; + int return_val=0; + int err_code=0; + int i; + + puts ("Checking AHB Example slave"); + // ------------------------- + puts ("- check ID values"); + for (i=0; i<12; i++) { + if (HW32_REG(base_addr + 0xFD0 + 4*i) != ahb_id[i]) { + printf (" ID [%d] ERROR : expected %x, actual %x\n", i, ahb_id[i], HW32_REG(base_addr + 0xFD0 + 4*i)); + err_code = err_code | 0x1; + } + } + // ------------------------- + puts ("- initial data values"); + for (i=0; i<4; i++) { + printf (" Data[%d] = %x\n", i, HW32_REG(ADDR_BASE_AHB_EG_SLAVE + 4*i)); + } + + puts ("- check R/W in word size"); + + HW32_REG(base_addr ) = 0x12345678; + HW32_REG(base_addr +0x04) = 0x55CC33AA; + HW32_REG(base_addr +0x08) = 0xFF008765; + HW32_REG(base_addr +0x0C) = 0x99AABCDE; + + if (HW32_REG(base_addr ) != 0x12345678) {err_code |= (1<<2); puts(" ERROR @ Data0");} + if (HW32_REG(base_addr +0x04) != 0x55CC33AA) {err_code |= (1<<2); puts(" ERROR @ Data1");} + if (HW32_REG(base_addr +0x08) != 0xFF008765) {err_code |= (1<<2); puts(" ERROR @ Data2");} + if (HW32_REG(base_addr +0x0C) != 0x99AABCDE) {err_code |= (1<<2); puts(" ERROR @ Data3");} + + + puts ("- check R/W in halfword size"); + + HW16_REG(base_addr ) = 0xA987; + HW16_REG(base_addr +0x02) = 0xEDCB; + HW16_REG(base_addr +0x04) = 0xCC55; + HW16_REG(base_addr +0x06) = 0xAA33; + HW16_REG(base_addr +0x08) = 0x789A; + HW16_REG(base_addr +0x0A) = 0x00FF; + HW16_REG(base_addr +0x0C) = 0x4321; + HW16_REG(base_addr +0x0E) = 0x6655; + + if (HW16_REG(base_addr ) != 0xA987) {err_code |= (1<<3); puts(" ERROR @ Data0");} + if (HW16_REG(base_addr +0x02) != 0xEDCB) {err_code |= (1<<3); puts(" ERROR @ Data1");} + if (HW16_REG(base_addr +0x04) != 0xCC55) {err_code |= (1<<3); puts(" ERROR @ Data2");} + if (HW16_REG(base_addr +0x06) != 0xAA33) {err_code |= (1<<3); puts(" ERROR @ Data3");} + if (HW16_REG(base_addr +0x08) != 0x789A) {err_code |= (1<<3); puts(" ERROR @ Data4");} + if (HW16_REG(base_addr +0x0A) != 0x00FF) {err_code |= (1<<3); puts(" ERROR @ Data5");} + if (HW16_REG(base_addr +0x0C) != 0x4321) {err_code |= (1<<3); puts(" ERROR @ Data6");} + if (HW16_REG(base_addr +0x0E) != 0x6655) {err_code |= (1<<3); puts(" ERROR @ Data7");} + + puts ("- check R/W in byte size"); + + HW8_REG(base_addr ) = 0xA9; // swap upper and lower byte + HW8_REG(base_addr +0x01) = 0x87; + HW8_REG(base_addr +0x02) = 0xED; + HW8_REG(base_addr +0x03) = 0xCB; + HW8_REG(base_addr +0x04) = 0xCC; + HW8_REG(base_addr +0x05) = 0x55; + HW8_REG(base_addr +0x06) = 0xAA; + HW8_REG(base_addr +0x07) = 0x33; + HW8_REG(base_addr +0x08) = 0x78; + HW8_REG(base_addr +0x09) = 0x9A; + HW8_REG(base_addr +0x0A) = 0x00; + HW8_REG(base_addr +0x0B) = 0xFF; + HW8_REG(base_addr +0x0C) = 0x43; + HW8_REG(base_addr +0x0D) = 0x21; + HW8_REG(base_addr +0x0E) = 0x66; + HW8_REG(base_addr +0x0F) = 0x55; + + if (HW8_REG(base_addr ) != 0xA9) {err_code |= (1<<4); puts(" ERROR @ Data0");} + if (HW8_REG(base_addr +0x01) != 0x87) {err_code |= (1<<4); puts(" ERROR @ Data1");} + if (HW8_REG(base_addr +0x02) != 0xED) {err_code |= (1<<4); puts(" ERROR @ Data2");} + if (HW8_REG(base_addr +0x03) != 0xCB) {err_code |= (1<<4); puts(" ERROR @ Data3");} + if (HW8_REG(base_addr +0x04) != 0xCC) {err_code |= (1<<4); puts(" ERROR @ Data4");} + if (HW8_REG(base_addr +0x05) != 0x55) {err_code |= (1<<4); puts(" ERROR @ Data5");} + if (HW8_REG(base_addr +0x06) != 0xAA) {err_code |= (1<<4); puts(" ERROR @ Data6");} + if (HW8_REG(base_addr +0x07) != 0x33) {err_code |= (1<<4); puts(" ERROR @ Data7");} + if (HW8_REG(base_addr +0x08) != 0x78) {err_code |= (1<<4); puts(" ERROR @ Data8");} + if (HW8_REG(base_addr +0x09) != 0x9A) {err_code |= (1<<4); puts(" ERROR @ Data9");} + if (HW8_REG(base_addr +0x0A) != 0x00) {err_code |= (1<<4); puts(" ERROR @ DataA");} + if (HW8_REG(base_addr +0x0B) != 0xFF) {err_code |= (1<<4); puts(" ERROR @ DataB");} + if (HW8_REG(base_addr +0x0C) != 0x43) {err_code |= (1<<4); puts(" ERROR @ DataC");} + if (HW8_REG(base_addr +0x0D) != 0x21) {err_code |= (1<<4); puts(" ERROR @ DataD");} + if (HW8_REG(base_addr +0x0E) != 0x66) {err_code |= (1<<4); puts(" ERROR @ DataE");} + if (HW8_REG(base_addr +0x0F) != 0x55) {err_code |= (1<<4); puts(" ERROR @ DataF");} + + if (err_code != 0) { + printf ("ERROR : AHB eg slave access failed (0x%x)\n", err_code); + return_val=1; + err_code = 0; + } + return(return_val); + +} + +// ----------------------------------------------------------- +// Check the access to AHB trickbox slave +// ----------------------------------------------------------- +int check_ahb_tb_slave(unsigned long base_addr) +{ + int return_val=0; + int err_code=0; + int i; + + puts ("Checking AHB Trickbox slave"); + + // First four words are the same data registers with different wait states + puts ("- check R/W in word size"); + HW32_REG(base_addr ) = 0x12345678; + if (HW32_REG(base_addr ) != 0x12345678) {err_code |= (1<<0); puts(" ERROR @ Data0");} + HW32_REG(base_addr +0x04) = 0x55CC33AA; + if (HW32_REG(base_addr +0x04) != 0x55CC33AA) {err_code |= (1<<0); puts(" ERROR @ Data1");} + HW32_REG(base_addr +0x08) = 0xFF008765; + if (HW32_REG(base_addr +0x08) != 0xFF008765) {err_code |= (1<<0); puts(" ERROR @ Data2");} + HW32_REG(base_addr +0x0C) = 0x99AABCDE; + if (HW32_REG(base_addr +0x0C) != 0x99AABCDE) {err_code |= (1<<0); puts(" ERROR @ Data3");} + + puts ("- check R/W in half word size"); + HW16_REG(base_addr ) = 0xA987; + if (HW16_REG(base_addr ) != 0xA987) {err_code |= (1<<1); puts(" ERROR @ Data0");} + HW16_REG(base_addr +0x02) = 0xEDCB; + if (HW16_REG(base_addr +0x02) != 0xEDCB) {err_code |= (1<<1); puts(" ERROR @ Data1");} + HW16_REG(base_addr +0x04) = 0xCC55; + if (HW16_REG(base_addr +0x04) != 0xCC55) {err_code |= (1<<1); puts(" ERROR @ Data2");} + HW16_REG(base_addr +0x06) = 0xAA33; + if (HW16_REG(base_addr +0x06) != 0xAA33) {err_code |= (1<<1); puts(" ERROR @ Data3");} + HW16_REG(base_addr +0x08) = 0x789A; + if (HW16_REG(base_addr +0x08) != 0x789A) {err_code |= (1<<1); puts(" ERROR @ Data4");} + HW16_REG(base_addr +0x0A) = 0x00FF; + if (HW16_REG(base_addr +0x0A) != 0x00FF) {err_code |= (1<<1); puts(" ERROR @ Data5");} + HW16_REG(base_addr +0x0C) = 0x4321; + if (HW16_REG(base_addr +0x0C) != 0x4321) {err_code |= (1<<1); puts(" ERROR @ Data6");} + HW16_REG(base_addr +0x0E) = 0x6655; + if (HW16_REG(base_addr +0x0E) != 0x6655) {err_code |= (1<<1); puts(" ERROR @ Data7");} + + puts ("- check R/W in byte size"); + HW8_REG(base_addr ) = 0xA9; // swap upper and lower byte + if (HW8_REG(base_addr ) != 0xA9) {err_code |= (1<<2); puts(" ERROR @ Data0");} + HW8_REG(base_addr +0x01) = 0x87; + if (HW8_REG(base_addr +0x01) != 0x87) {err_code |= (1<<2); puts(" ERROR @ Data1");} + HW8_REG(base_addr +0x02) = 0xED; + if (HW8_REG(base_addr +0x02) != 0xED) {err_code |= (1<<2); puts(" ERROR @ Data2");} + HW8_REG(base_addr +0x03) = 0xCB; + if (HW8_REG(base_addr +0x03) != 0xCB) {err_code |= (1<<2); puts(" ERROR @ Data3");} + HW8_REG(base_addr +0x04) = 0xCC; + if (HW8_REG(base_addr +0x04) != 0xCC) {err_code |= (1<<2); puts(" ERROR @ Data4");} + HW8_REG(base_addr +0x05) = 0x55; + if (HW8_REG(base_addr +0x05) != 0x55) {err_code |= (1<<2); puts(" ERROR @ Data5");} + HW8_REG(base_addr +0x06) = 0xAA; + if (HW8_REG(base_addr +0x06) != 0xAA) {err_code |= (1<<2); puts(" ERROR @ Data6");} + HW8_REG(base_addr +0x07) = 0x33; + if (HW8_REG(base_addr +0x07) != 0x33) {err_code |= (1<<2); puts(" ERROR @ Data7");} + HW8_REG(base_addr +0x08) = 0x78; + if (HW8_REG(base_addr +0x08) != 0x78) {err_code |= (1<<2); puts(" ERROR @ Data8");} + HW8_REG(base_addr +0x09) = 0x9A; + if (HW8_REG(base_addr +0x09) != 0x9A) {err_code |= (1<<2); puts(" ERROR @ Data9");} + HW8_REG(base_addr +0x0A) = 0x00; + if (HW8_REG(base_addr +0x0A) != 0x00) {err_code |= (1<<2); puts(" ERROR @ DataA");} + HW8_REG(base_addr +0x0B) = 0xFF; + if (HW8_REG(base_addr +0x0B) != 0xFF) {err_code |= (1<<2); puts(" ERROR @ DataB");} + HW8_REG(base_addr +0x0C) = 0x43; + if (HW8_REG(base_addr +0x0C) != 0x43) {err_code |= (1<<2); puts(" ERROR @ DataC");} + HW8_REG(base_addr +0x0D) = 0x21; + if (HW8_REG(base_addr +0x0D) != 0x21) {err_code |= (1<<2); puts(" ERROR @ DataD");} + HW8_REG(base_addr +0x0E) = 0x66; + if (HW8_REG(base_addr +0x0E) != 0x66) {err_code |= (1<<2); puts(" ERROR @ DataE");} + HW8_REG(base_addr +0x0F) = 0x55; + if (HW8_REG(base_addr +0x0F) != 0x55) {err_code |= (1<<2); puts(" ERROR @ DataF");} + + + puts ("- check read to 0x010 to 0x0FF"); + // address 0x010 to 0x0FF returns HADDR[7:0] + // + for (i=0x10;i<0x40;i=i+4){ // Higher address values will result in time out + if (HW32_REG(base_addr + i) != i) { + err_code |= (1<<3); + printf (" ERROR: %x, return %x\n", i, HW32_REG(base_addr + i)); + } + } + + // address 0x040 and above results in timeout + // Note:to reduce simulation time not all addresses are tested + puts ("- offset 0x040 and above results in timeout"); + for (i=0x40;i<0xFF;i=i+28){ // Higher address values will result in time out + hardfault_occurred = 0; + hardfault_expected = 1; + temp_data = address_test_read(base_addr + i); + + if (hardfault_occurred ==0) { + err_code |= (1<<4); + puts ("ERROR: Expected timeout did not take place"); + } + } + + puts ("- offset 0x100 and above results in error response/timeout"); + + // address 0x104 to 0x1FF results in error response + // Note:to reduce simulation time not all addresses are tested + for (i=0x104;i<0x180;i=i+20){ // Higher address values will result in time out + hardfault_occurred = 0; + hardfault_expected = 1; + temp_data = address_test_read(base_addr + i); + + if (hardfault_occurred ==0) { + err_code |= (1<<5); + puts ("ERROR: Expected timeout did not take place"); + } + } + + hardfault_occurred = 0; // reset variables + hardfault_expected = 0; + + + if (err_code != 0) { + printf ("ERROR : AHB trickbox slave access failed (0x%x)\n", err_code); + return_val=1; + err_code = 0; + } + return(return_val); + +} +// ----------------------------------------------------------- +// Check the access to AHB default slave +// ----------------------------------------------------------- +int check_default_slave(unsigned long base_addr) +{ + int return_val=0; + int err_code=0; + + temp_data=0; + hardfault_occurred = 0; + hardfault_expected = 1; + + printf ("- test R/W to %x\n",base_addr); + address_test_write(base_addr, 0x3456789A); + if (hardfault_occurred==0) {err_code |= (1<<2);} + hardfault_occurred = 0; + + temp_data = address_test_read(base_addr); + if (hardfault_occurred==0) {err_code |= (1<<3);} + hardfault_occurred = 0; + + hardfault_occurred = 0; // reset variables + hardfault_expected = 0; + + + if (err_code != 0) { + puts ("ERROR : AHB default slave access failed"); + return_val=1; + err_code = 0; + } + return(return_val); + +} + +// ----------------------------------------------------------- +// Functions to handle read/write test with 16-bit memory +// access instruction for bus fault testing. +// ----------------------------------------------------------- + +#if defined ( __CC_ARM ) +/* Test function for write - for ARM / Keil */ +__asm void address_test_write(unsigned int addr, unsigned int wdata) +{ + STR R1,[R0] + DSB ; Ensure bus fault occurred before leaving this subroutine + BX LR +} + +#else +/* Test function for write - for gcc */ +void address_test_write(unsigned int addr, unsigned int wdata) __attribute__((naked)); +void address_test_write(unsigned int addr, unsigned int wdata) +{ + __asm(" str r1,[r0]\n" + " dsb \n" + " bx lr \n" + ); +} +#endif + +/* Test function for read */ +#if defined ( __CC_ARM ) +/* Test function for read - for ARM / Keil */ +__asm unsigned int address_test_read(unsigned int addr) +{ + LDR R1,[R0] + DSB ; Ensure bus fault occurred before leaving this subroutine + MOVS R0, R1 + BX LR +} +#else +/* Test function for read - for gcc */ +unsigned int address_test_read(unsigned int addr) __attribute__((naked)); +unsigned int address_test_read(unsigned int addr) +{ + __asm(" ldr r1,[r0]\n" + " dsb \n" + " movs r0, r1 \n" + " bx lr \n" + ); +} +#endif + +// ----------------------------------------------------------- +// Hard fault handler +// Divided into two halves: +// - assembly part to extract stack frame starting location +// - C handler part to carry out processing and checks +// ----------------------------------------------------------- + +#if defined ( __CC_ARM ) +/* ARM or Keil toolchain */ +__asm void HardFault_Handler(void) +{ + MOVS r0, #4 + MOV r1, LR + TST r0, r1 + BEQ stacking_used_MSP + MRS R0, PSP ; // first parameter - stacking was using PSP + B get_LR_and_branch +stacking_used_MSP + MRS R0, MSP ; // first parameter - stacking was using MSP +get_LR_and_branch + MOV R1, LR ; // second parameter is LR current value + LDR R2,=__cpp(HardFault_Handler_c) + BX R2 +} +#else +/* gcc toolchain */ +void HardFault_Handler(void) __attribute__((naked)); +void HardFault_Handler(void) +{ + __asm(" movs r0,#4\n" + " mov r1,lr\n" + " tst r0,r1\n" + " beq stacking_used_MSP\n" + " mrs r0,psp\n" /* first parameter - stacking was using PSP */ + " ldr r1,=HardFault_Handler_c \n" + " bx r1\n" + "stacking_used_MSP:\n" + " mrs r0,msp\n" /* first parameter - stacking was using PSP */ + " ldr r1,=HardFault_Handler_c \n" + " bx r1\n" + ".pool\n" ); +} + +#endif +/* C part of the fault handler - common between ARM / Keil /gcc */ +void HardFault_Handler_c(unsigned int * hardfault_args, unsigned lr_value) +{ + unsigned int stacked_pc; + unsigned int stacked_r0; + hardfault_occurred++; + if (probe_ext_eg_sys==1) { + puts (" - Extended Example System not available.\n - INCLUDE_EXT_SUBSYSTEM variable in rtl_sim/makefile is set to 0\nTest skipped."); + UartEndSimulation(); + return; + } + puts ("[Hard Fault Handler]"); + if (hardfault_expected==0) { + puts ("ERROR : Unexpected HardFault interrupt occurred.\n"); + UartEndSimulation(); + return; + } + stacked_r0 = ((unsigned long) hardfault_args[0]); + stacked_pc = ((unsigned long) hardfault_args[6]); + printf(" - Stacked R0 : 0x%x\n", stacked_r0); + printf(" - Stacked PC : 0x%x\n", stacked_pc); + /* Modify R0 to a valid address */ + hardfault_args[0] = (unsigned long) &temp_data; + + return; +} + + diff --git a/Cortex-M0/nanosoc/software/common/validation/gpio_driver_tests.c b/Cortex-M0/nanosoc/software/common/validation/gpio_driver_tests.c new file mode 100644 index 0000000..6374c0c --- /dev/null +++ b/Cortex-M0/nanosoc/software/common/validation/gpio_driver_tests.c @@ -0,0 +1,705 @@ +/* + *----------------------------------------------------------------------------- + * The confidential and proprietary information contained in this file may + * only be used by a person authorised under and to the extent permitted + * by a subsisting licensing agreement from Arm Limited or its affiliates. + * + * (C) COPYRIGHT 2010-2013 Arm Limited or its affiliates. + * ALL RIGHTS RESERVED + * + * This entire notice must be reproduced on all copies of this file + * and copies of this file may only be made by a person if such person is + * permitted to do so under the terms of a subsisting license agreement + * from Arm Limited or its affiliates. + * + * SVN Information + * + * Checked In : $Date: 2017-10-10 15:55:38 +0100 (Tue, 10 Oct 2017) $ + * + * Revision : $Revision: 371321 $ + * + * Release Information : Cortex-M System Design Kit-r1p1-00rel0 + *----------------------------------------------------------------------------- + */ + +/* + A simple test to check the functionalities of gpio functions in the example device driver. +*/ + +#ifdef CORTEX_M0 +#include "CMSDK_CM0.h" +#define ALTMASK 0x2A +#endif + +#ifdef CORTEX_M0PLUS +#include "CMSDK_CM0plus.h" +#define ALTMASK 0x2A +#endif + +#ifdef CORTEX_M3 +#include "CMSDK_CM3.h" +#define ALTMASK 0xF82A +#endif + +#ifdef CORTEX_M4 +#include "CMSDK_CM4.h" +#define ALTMASK 0xF82A +#endif + +#include <stdio.h> +#include <stdlib.h> +#include "uart_stdout.h" +#include "CMSDK_driver.h" + +/* Random seed used by GPIO_Mask_OP function */ +#define RANDOM_NUMBER 47563745 + +/* Using ISB instruction to create a three cycles delay */ +#define small_delay __ISB + +volatile int intstatus[16] = { 0 }; /* Detected interrupt operation from GPIO IRQ handler */ +volatile int N = 0; /* Bit number being test - Data shared between GPIO_IRQ and PORT0_COMB_Handler */ +volatile uint32_t data = 0; /* Previous data in GPIO - Data shared between GPIO_IRQ and PORT0_COMB_Handler */ + +/* Declare test functions */ +int GPIO_OPEN(void); /* tests the CMSDK GPIO output enable driver functions */ +int GPIO_AltFuncEN(void); /* tests the CMSDK GPIO Alternate Function driver functions */ +int GPIO_IRQ(void); /* tests the CMSDK GPIO IRQ driver functions */ +int GPIO_Mask_OP(void); /* tests the CMSDK GPIO Masked Accesses driver functions */ + +int gpio0_id_check(void); +int gpio1_id_check(void); + +int main (void) +{ + int result = 0; + + // UART init + UartStdOutInit(); + + // Test banner message and revision number + puts("Cortex Microcontroller System Design Kit - GPIO Driver Test - revision $Revision: 371321 $\n"); + + if (gpio0_id_check()!=0) { + puts ("GPIO 0 not present. Test skipped."); + UartEndSimulation(); + return 0;} + if (gpio1_id_check()!=0) { + puts ("GPIO 1 not present. Test skipped."); + UartEndSimulation(); + return 0;} + + result |= GPIO_OPEN(); + result |= GPIO_AltFuncEN(); + result |= GPIO_IRQ(); + result |= GPIO_Mask_OP(); + + if(result == 0) { + puts("** TEST PASSED **\n"); + } else { + printf("** TEST FAILED **, Error code: (0x%x)\n", result); + } + + UartEndSimulation(); + return result; +} + +/* GPIO ID check functions - detect if part number match expected value. + If not, the GPIO might not be available and therefore the test should be skipped. +*/ +#define HW32_REG(ADDRESS) (*((volatile unsigned long *)(ADDRESS))) +#define HW8_REG(ADDRESS) (*((volatile unsigned char *)(ADDRESS))) +int gpio0_id_check(void) +{ +unsigned char gpio_id; + + gpio_id = HW8_REG(CMSDK_GPIO0_BASE + 0xFE8) & 0x07; + + if ((HW32_REG(CMSDK_GPIO0_BASE + 0xFE0) != 0x20) || + (HW32_REG(CMSDK_GPIO0_BASE + 0xFE4) != 0xB8) || + (gpio_id != 0x03)) + return 1; /* part ID & ARM ID does not match */ + else + return 0; +} +int gpio1_id_check(void) +{ +unsigned char gpio_id; + + gpio_id = HW8_REG(CMSDK_GPIO1_BASE + 0xFE8) & 0x07; + + if ((HW32_REG(CMSDK_GPIO1_BASE + 0xFE0) != 0x20) || + (HW32_REG(CMSDK_GPIO1_BASE + 0xFE4) != 0xB8) || + (gpio_id != 0x03)) + return 1; /* part ID & ARM ID does not match */ + else + return 0; +} + +/* GPIO_OPEN - This function tests the CMSDK GPIO output enable driver functions + - Set Output enable (OUTENABLESET) + - set Dataout to 0x0, due to the simulation pull up resistors, + read back value is 0xFFFF when all the Output Enable control bits + are not set. + - for each pin on the port set the OUTENABLE, each in turn and check the status of the register + - if the OUTENABLE for the specified pin is incorrect then change err_code + - this will set the value of the specified pin to 0, keep 0 value for subsequent pin tests + - if the Data-in for the port is incorrect then change err_code + - else test passed for specified pin + - if all pins pass, test passes + + - Clear Alternate Function (OUTENABLECLR) + - using the current value of the Outen register all Outens will be cleared + - for each pin on the port clear the OUTENABLE, each in turn and check the status of the register + - if the OUTENABLE for the specified pin is incorrect then change err_code + - if the Data-in for the port is incorrect then change err_code i.e != pins enabled and 0xFFFF + - else test passed for specified pin + - if the OUTENABLE register is cleared then the test is classed as passed + */ + +int GPIO_OPEN(void) /*output enable function*/ +{ + int err_code = 0; + uint32_t i = 0; + uint32_t mask = 0; + + puts("Stage 1 - GPIO Output Enable Test\n"); + + puts("- Stage 1a - Set GPIO Output Enable\n"); + + /* Test sequence : + Data output is set to 0x0000. Since output enable is 0x0000 by default, + the actual I/O port status is determined by external pull up so it is + 0xFFFF at starting. By enabling output enable bit by bit, + the read back value of I/O port data become 0xFFFE, 0xFFFC, 0xFFF8, etc. + */ + + CMSDK_GPIO0->DATAOUT = 0x0000; /* set data on all pins to logic 0 for the pull up resistor*/ + + for(i = 1; i < 65536; i <<= 1){ + + /* enable every pin starting at pin0 to pin15 while keeping the previous ones enabled */ + /* so that the transition of the output enable register is as follows: 0000 -> 0001 -> 0011 -> 0111 -> 1111 */ + + mask |= i; /* mask is the expected value of OUTENABLE */ + CMSDK_gpio_SetOutEnable(CMSDK_GPIO0, i); /* set specified bit in out enable register */ + + if(CMSDK_gpio_GetOutEnable(CMSDK_GPIO0) != mask) err_code += 1; /*check if the output enable register is not the*/ + if(CMSDK_GPIO0->DATA != (0xFFFF & (~mask))) err_code += 1; /*same as the mask i.e. set up to and including*/ + } /*the bit being set then increment error code */ + + /* OUTENABLE should be 0xFFFF */ + printf("Output Enable Status: 0x%x\n\n", CMSDK_gpio_GetOutEnable(CMSDK_GPIO0)); + mask = 0; + + if(err_code) printf("Set Enable Test Failed, Error code: (0x%x\n)", err_code); + else puts("Set Enable Test Passed\n"); + + puts("- Stage 1b - Clear GPIO Output Enable\n"); + + for(i = 1; i < 65536; i <<= 1){ + + /* disable every pin starting at pin0 to pin15 while keeping the previously disabled ones disabled */ + /* and previously enabled ones enabled starting at all enabled so that the transition of the output*/ + /* enable register is as follows: 1111 -> 1110 -> 1100 -> 1000 -> 0000 */ + + mask |= i; + CMSDK_gpio_ClrOutEnable(CMSDK_GPIO0, i); /*clear specified bit in out enable register*/ + + if(~(CMSDK_gpio_GetOutEnable(CMSDK_GPIO0) | 0xFFFF0000) != mask) /*check if the output enable register is not the*/ + err_code += 1; /*same as the mask i.e. clear up to and including*/ + if(CMSDK_GPIO0->DATA != (0xFFFF & mask)) /*the bit being set then increment error code */ + err_code += 1; + } + + printf("Output Enable Status: 0x%x\n\n", CMSDK_gpio_GetOutEnable(CMSDK_GPIO0)); + + if(err_code) printf("Clear Output Enable Test Failed, Error code: (0x%x)\n", err_code); + else puts("Clear Output Enable Test Passed\n"); + + if(!err_code) return 0; + else return 1; +} + +/* GPIO_AltFuncEN - This function tests the CMSDK GPIO Alternate Function driver functions + GPIO Port 1 is used for this test because GPIO pins in port 0 are not shared (AltFunc not implemented). + - Set Alternate Function (AltFunc) + - clear the alternate function register for all pins including TX2 (TUBE for puts) + - for each pin on the port set the AltFunc, each in turn and check the status of the register + - if the AltFunc for the specified pin is incorrect then change err_code + - else test passed for specified pin + - if the AltFunc register is set to 0x2A (M0) or 0xF82A (M3) then the test is classed as passed + - NOTE: it is these exact combinations as only AltFunc outputs can be set in the AltFunc register + as inputs have no effect as they are just routed to two places and pins without an AltFunc + the value is not affected so is zero constantly + - Clear Alternate Function (AltFunc) + - using the current vale of the AltFunc register all AltFuncs will be cleared apart for vital ones + - for each pin on the port clear the AltFunc, each in turn and check the status of the register + - if the AltFunc for the specified pin is incorrect then change err_code unless it is TX2 as this + is used for stdout so must remain set + - else test passed for specified pin + - if the AltFunc register is set to 0x20 (TX2 - pin 5) then the test is classed as passed + */ + +int GPIO_AltFuncEN(void) +{ + int err_code = 0; + uint32_t i = 0; + uint32_t mask = 0; + + puts("Stage 2 - GPIO Alternative Function Enable Test\n"); + + puts("- Stage 2a - Set GPIO Alternative Function Enable\n"); + + CMSDK_gpio_ClrAltFunc(CMSDK_GPIO1, 0xFFFF); /* Clear alternate function on all GPIO Port 1 pins to zero */ + + for(i = 1; i < 65536; i <<= 1){ + + //Set alternate function on all GPIO Port 1 pins which have an alternate function output port + //will not affect those with either no alternate function or those which the pin is an input for + //the alternate function so when read back the value with all alternate function is 0x2A for M0 + //and 0xf82A for M3, because the only pins that the alternate function affects is the UART + //TX0 (pin 1), TX1 (pin 3), TX2 (pin 5) + + mask |= i; + CMSDK_gpio_SetAltFunc(CMSDK_GPIO1, i); //set alternate function register for the specified bit + if(CMSDK_gpio_GetAltFunc(CMSDK_GPIO1) != (ALTMASK & mask)) /*check if the AltFunc register is not the same as the*/ + err_code += i; /*AltFunc mask i.e. all pins which have one, up to and including*/ + } /*the bit being set then if not increment error code */ + + printf("\nAlternate Function Enable Status: 0x%x\n\n", CMSDK_gpio_GetAltFunc(CMSDK_GPIO1)); + + if(err_code) printf("Set Enable Test Failed, Error code: (0x%x\n)", err_code); + else puts("Set Enable Test Passed\n"); //if the port did not set the AltFunc as expected display error*/ + + puts("- Stage 2b - Clear GPIO Alternative Function Enable\n"); + + mask = 0; + + for(i = 1; i < 65536; i <<= 1){ + + /* Clear AltFunc bit by bit apart from bit 5 for stdout */ + + //Clear alternate function on all GPIO Port 1 pins which have an alternate function output port + //will not affect those with either no alternate function or those which the pin is an input for + //the alternate function so when read back the value with all alternate function is 0x20 for M0 + //and M3 because must leave the TX2 enabled for the TUBE + + mask |= i; + + /*clear alternate function register for the specified bit except for UART2 TX for tube*/ + + CMSDK_gpio_ClrAltFunc(CMSDK_GPIO1, i & (~0x20)); + + if(CMSDK_gpio_GetAltFunc(CMSDK_GPIO1) != ((ALTMASK & (~mask )) | 0x20)) /*check if the AltFunc register is not the same as the*/ + err_code += i; /*AltFunc mask i.e. all pins which have one, up to and including*/ + /*the bit being set then if not increment error code */ + } + + printf("Alternate Function Enable Status: 0x%x\n\n", CMSDK_gpio_GetAltFunc(CMSDK_GPIO1)); /*display Port's AltFunc Setting*/ + + if(err_code) printf("Clear Enable Test Failed, Error code: (0x%x)\n", err_code); + else puts("Clear Enable Test Passed\n"); /*if the port did not clear the AltFunc as expected display error*/ + + if(!err_code) return 0; + else return 2; +} + +/* GPIO_IRQ - This function tests the CMSDK GPIO IRQ driver functions + + - Test High level IRQ + - Set DataOut to 0x0000 ready for high level test + - Enable all pins as output + - Set all pins as a high level interrupt and clear all pending IRQs + - Global enable (NVIC) the interrupts on the port + - for each pin on the port enable the CMSDK GPIO interrupt for that pin then set the Dataout on the specified pin high + - Check the inten register for the specified pin to check that it's set + - in ISR, record what type of interrupt it's meant to be according to the intpol and inttype registers + - if either the inten, intpol or inttype are incorrect then change err_code + - else test passed for specified pin + - if test on each pin passes the test as a whole passes and return 0 to main + - else return an error + + - Test Rising Edge IRQ + - Set DataOut to 0x0000 ready for rising edge test + - Set all pins as a Rising Edge interrupt and clear all pending IRQs + - for each pin on the port enable the CMSDK GPIO interrupt for that pin + - set the Dataout on the specified pin high and keep high for subsequent pin tests (so can move on to falling edge tests) + - Check the inten register for the specified pin to check that it's set + - in ISR, record what type of interrupt it's meant to be according to the intpol and inttype registers + - if either the inten, intpol or inttype are incorrect then change err_code + - else test passed for specified pin + - if test on each pin passes the test as a whole passes and return 0 to main + - else return an error + + - Test Falling Edge IRQ + - DataOut is already set to 0xFFFF from rising edge test + - Set all pins as a Falling Edge interrupt and clear all pending IRQs + - for each pin on the port enable the CMSDK GPIO interrupt for that pin + - set the Dataout on the specified pin low and keep low for subsequent pin tests + - Check the inten register for the specified pin to check that it's set + - in ISR, record what type of interrupt it's meant to be according to the intpol and inttype registers + - if either the inten, intpol or inttype are incorrect then change err_code + - else test passed for specified pin + - if test on each pin passes the test as a whole passes and return 0 to main + - else return an error + + - Test Low level IRQ + - Set DataOut to 0xFFFF ready for low level test + - Enable all pins as output + - Set all pins as a low level interrupt and clear all pending IRQs + - for each pin, in turn, on the port enable the CMSDK GPIO interrupt for that pin + - set the Dataout on the specified pin low whilst the interrupts are enabled then back high before clearing it + - Check the inten register for the specified pin to check that it's set + - in ISR, record what type of interrupt it's meant to be according to the intpol and inttype registers + - if either the inten, intpol or inttype are incorrect then change err_code + - else test passed for specified pin + - if test on each pin passes the test as a whole passes and return 0 to main + - else return an error + */ + +int GPIO_IRQ(void) +{ + uint32_t err_code = 0, return_val = 0; + int i = 0; + int irq_counter = 0; + + puts("Stage 3 - GPIO Pin IRQ Test\n"); + + puts("- Stage 3a - GPIO High Level IRQ Test\n"); + + CMSDK_GPIO0->DATAOUT = 0x0000; //set data out to 0 to test high level IRQ + CMSDK_gpio_SetOutEnable(CMSDK_GPIO0, 0xFFFF); //set output enable to output on all ports of GPIO 0 + + for(i = 0; i < 16; i++) + { + CMSDK_gpio_SetIntHighLevel(CMSDK_GPIO0, i); //set all pins to high level interrupt and clear any + CMSDK_gpio_IntClear(CMSDK_GPIO0, i); //outstanding set interrupts + } + + NVIC_ClearPendingIRQ(PORT0_ALL_IRQn); //clear all global NVIC PORT0 pending interrupts + + NVIC_EnableIRQ(PORT0_ALL_IRQn); //enable NVIC interrupts on PORT0 + + for(i = 0; i < 16; i++){ + + CMSDK_gpio_SetIntEnable(CMSDK_GPIO0, i); //enable interrupt for the pin to be tested + + if(!((CMSDK_GPIO0->INTENSET) & (1 << i))) err_code = (1 << (2*i));//check to see if the interrupt enable register is + //set for the pin which it should have just been + N = i; + + CMSDK_GPIO0->DATAOUT = (0x0001 << i); //set data out on pin0 high to cause a high level interrupt + //repeat for all other pins 0001 -> 0010 -> 0100 -> 1000 + CMSDK_gpio_ClrIntEnable(CMSDK_GPIO0, i ); /*clear interrupt enable*/ + + if((CMSDK_GPIO0->INTENSET) & ~(1 << i)) err_code = (1 << (2*i +1));//check to see if the interrupt enable register is + //clear for the pin which it should have just been + + /* check to see whether intstatus, for the specified pin, is 2, which corresponds to a high level interrupt */ + + if(intstatus[i] == 2) irq_counter++; + else err_code |= (1 << i); + } + + if((irq_counter == 16) && (err_code == 0)) puts("High Level IRQ Tests Passed Successfully\n"); + else{ + printf("\nHigh Level IRQ Tests Failed, Error Code: (0x%x)\n", err_code); + err_code = 0; /*if the port did not have 1 HL IRQ for each pin as expected then display error*/ + return_val = 8; + } + + puts("- Stage 3b - GPIO Rising Edge IRQ Test\n"); + + irq_counter = 0; + + CMSDK_GPIO0->DATAOUT = 0x0000; //set data out to 0 to test rising edge IRQ + + for(i = 0; i < 16; i++) CMSDK_gpio_SetIntRisingEdge(CMSDK_GPIO0, i); //set all pins to rising edge interrupts + + for(i = 0; i < 16; i++){ + + CMSDK_gpio_SetIntEnable(CMSDK_GPIO0, i); //enable interrupts on specified pin then set data out to 1 + //for pin 0 then repeat for all subsequent pins whilst still + + if(!((CMSDK_GPIO0->INTENSET) & (1 << i))) err_code = (1 <<(2*i));//check to see if the interrupt enable register is + //set for the pin which it should have just been + N = i; + + CMSDK_GPIO0->DATAOUT = (0x0001 << i) | CMSDK_GPIO0->DATA; //keeping all other pins high 0000->0001->0011->0111->1111 + + CMSDK_gpio_ClrIntEnable(CMSDK_GPIO0, i); //clear interrupt enable for specified pin + + if((CMSDK_GPIO0->INTENSET) & ~(1 << i)) err_code = (1 <<(2*i + 1));//check to see if the interrupt enable register is + //clear for the pin which it should have just been + + /* check to see whether intstatus, for the specified pin, is 1, which corresponds to a rising edge interrupt */ + + if(intstatus[i] == 1) irq_counter++; + else err_code |= (1 << i); + } + + if((irq_counter == 16) && (err_code == 0)) puts("Rising Edge IRQ Tests Passed Successfully\n"); + else{ + printf("\nRising Edge IRQ Tests Failed, Error Code: (0x%x\n", err_code); + err_code = 0; /*if the port did not have 1 RE IRQ for each pin as expected then display error*/ + return_val = 16; + } + + puts("- Stage 3c - GPIO Falling Edge IRQ Test\n"); + + irq_counter = 0; + + CMSDK_GPIO0->DATAOUT = 0xFFFF; + + for(i = 0; i < 16; i++) CMSDK_gpio_SetIntFallingEdge(CMSDK_GPIO0, i); //set all pins to falling edge interrupts + + for(i = 0; i < 16; i++){ + + /* Counter change from 0->1->2 ...15 */ + + CMSDK_gpio_SetIntEnable(CMSDK_GPIO0, i); //enable interrupts on specified pin then set data out to + //0xFFFF and shiftright to cause a falling edge on + //pin 15 and then shift each time to cause a falling + // edge on pins 14 -> 0 1111 >> 0111 >> 0011 >> 0001 >> 0000 + + if(!((CMSDK_GPIO0->INTENSET) & (1 << i))) //check to see if the interrupt enable register is + err_code = (1 << 2*i); //set for the pin which it should have just been + + N = i; + + CMSDK_GPIO0->DATAOUT = (CMSDK_GPIO0->DATA & ~(1 << i)); + + CMSDK_gpio_ClrIntEnable(CMSDK_GPIO0, i); //disable interrupts on specified pin + + if((CMSDK_GPIO0->INTENSET) & ~(1 << i)) //check to see if the interrupt enable register is + err_code = (1 << (2*i + 1)); //clear for the pin which it should have just been + + /* check to see whether intstatus, for the specified pin, is 3, which corresponds to a falling edge interrupt */ + + if(intstatus[i] == 3) irq_counter++; + else err_code |= (1 << i); + } + + if((irq_counter == 16) && (err_code == 0)) puts("Falling Edge IRQ Tests Passed Successfully\n"); + else{ + printf("\nFalling Edge IRQ Tests Failed, Error Code: (0x%x)\n", err_code); + err_code = 0; /*if the port did not have 1 FE IRQ for each pin as expected then display error*/ + return_val = 32; + } + + puts("- Stage 3d - GPIO Low Level IRQ Test\n"); + + irq_counter = 0; + data = 0xFFFE; + + CMSDK_GPIO0->DATAOUT = 0xFFFF; //set dataout to all ones ready to test low level interrupts + + for(i = 0; i < 16; i++) CMSDK_gpio_SetIntLowLevel(CMSDK_GPIO0, i); //set all pins to low level interrupts + + for(i = 0; i < 16; i++){ + + CMSDK_gpio_SetIntEnable(CMSDK_GPIO0, i); //enable interrupts on specified pin and set the + //data output to 0xFFFF XOR with 1 shifted to the + if(!((CMSDK_GPIO0->INTENSET) & (1 << i))) err_code = (1 << (2*i)); //pins position so that just the desired pin is + //set to 0 1111 -> 1110 -> 1101 -> 1011 -> 1111 + N = i; + + CMSDK_GPIO0->DATAOUT = (0x0001 << i) ^ 0xFFFF; + + CMSDK_gpio_ClrIntEnable(CMSDK_GPIO0, i); //disable interrupts on specified pin + + if((CMSDK_GPIO0->INTENSET) & ~(1 << i)) //check to see if the interrupt enable register is + err_code = (1 << (2*i + 1)); //clear for the pin which it should have just been + + /* check to see whether intstatus, for the specified pin, is 4, which corresponds to a low level interrupt */ + + if(intstatus[i] == 4) irq_counter++; + else err_code |= (1 << i); + } + + if((irq_counter == 16) && (err_code == 0)) puts("Low Level IRQ Tests Passed Successfully\n"); + else{ + printf("\nLow Level IRQ Tests Failed, Error Code: (0x%x)\n\n", err_code); + /*if the port did not have 1 LL IRQ for each pin as expected then display error*/ + return_val = 64; + } + + irq_counter = 0; + + NVIC_DisableIRQ(PORT0_ALL_IRQn); //disable all GPIO interrupts on PORT 0 + + NVIC_ClearPendingIRQ(PORT0_ALL_IRQn); //clear any outstanding GPIO interrupts + + for(i = 0; i < 16; i++) CMSDK_gpio_IntClear(CMSDK_GPIO0, i); //clear any outstanding GPIO interrupts + + return return_val; +} + +/* GPIO_Mask_OP - This function tests the CMSDK GPIO Masked Accesses driver functions + - Normal test of all 16 pins + - Firstly the data output is set to 0x0000 so as to ensure all comparisons are evaluated correctly + - write 0xFFFF using masked access with the mask transitioning through the combinations + 0001->0010->0100->1000 + - evaluate whether the data outputted are correct i.e. is same as 0xFFFF and mask + - if not amend err_code else test passed + - clear the current array element corresponding to the mask else the data on the output port will accumulate + i.e. mask of 0x0001 and mask of 0x0002 will give a mask of 0x0003. + + - Test of 16 random combinations + - seed the random function with the #define RANDOM_NUMBER + - use rand to get a number between 0 and 65535 + - perform masked access using the value 0xFFFF and the random number as the mask + - evaluate whether the data outputted is correct i.e. is same as 0xFFFF and random mask + - if not amend err_code else test passed + - clear the current array element corresponding to the mask else the data on the output port will accumulate + i.e. mask of 0x0001 and mask of 0x0002 will give a mask of 0x0003. + + - Test accumulation of masks + - write 0xFFFF using masked access with the mask transitioning through the combinations + 0001->0010->0100->1000 but do not clear after evaluating so that the masked values accumulate + - evaluate whether the data outputted is correct i.e. is same as 0xFFFF and the accumulated mask + - if not amend err_code else test passed + + - Test accumulation of random masks and random values + - gather both a random value and random mask using the rand function + - store the random mask so that it can be cleared later + - write value using masked access + - amend expected value to be seen when the GPIO is read back condition gained from verilog RTL + ((DATA[15:8] & mask[9:2])|(existing_data[15:8] & ~mask[9:2])); + - repeat with a second random value and mask after the test has been evaluated + clear the output port for the previous masks and reset both the previous masks and the expected value + - repeat process again until it has occurred 8 times +*/ + +int GPIO_Mask_OP(void) +{ + int err_code = 0, err_code_all = 0; + uint32_t i = 0, random_mask = 0, exp_value = 0, random_value, prev_masks[2] = { 0 }, mask = 0; + + + CMSDK_gpio_SetOutEnable(CMSDK_GPIO0, 0xFFFF); + + CMSDK_GPIO0->DATAOUT = 0x0000; + + puts("Stage 4 - GPIO Masked Output Test\n"); + + puts("- Stage 4a - GPIO Masked Output - Deterministic Test\n"); + + for(i = 0; i < 16; i++){ + + CMSDK_gpio_MaskedWrite(CMSDK_GPIO0, 0xFFFF, (1 << i)); //test each pin on the GPIO to check that masked + small_delay(); //access works for each pin individually + if(CMSDK_GPIO0->DATA != (0xFFFF & (1 << i))) + err_code |= (1 << i); + CMSDK_gpio_MaskedWrite(CMSDK_GPIO0, 0x0000, (1 << i)); //clear value back to zero + small_delay(); + } + + CMSDK_GPIO0->DATAOUT = 0; + + for(i = 0; i < 16; i++){ + CMSDK_gpio_MaskedWrite(CMSDK_GPIO0, 0xFFFF, (1 << i)); //test each pin on the GPIO to check that masked + small_delay(); //access works for each pin individually + mask |= (1 << i); + if(CMSDK_GPIO0->DATA != (0xFFFF & mask)) //test do not reset to ensure that the masked output + err_code |= (1 << (i + 16)); //goes through the transition 0001->0011->0111->1111 + small_delay(); + } + + if(!err_code) puts("Stage 4a Deterministic Masked Output Tests Passed Successfully\n"); + else { + printf("\nStage 4a Deterministic Masked Output Tests Failed, Error Code: (0x%x)\n", err_code); + err_code_all |= 1; + } + + puts("- Stage 4b - GPIO Masked Output - Random Test\n"); + + err_code = 0; + + CMSDK_GPIO0->DATAOUT = 0; + + srand(RANDOM_NUMBER); + + for(i = 0; i < 16; i++){ //repeat same process but with 16 random mask + random_mask = (rand() % 65536); //values, the random function is seeded with a + CMSDK_gpio_MaskedWrite(CMSDK_GPIO0, 0xFFFF, random_mask); //#define at the top of the program called RANDOM_NUMBER + if(CMSDK_GPIO0->DATA != (0xFFFF & random_mask)) //can be easily changed to perform tests on 16 + err_code |= (1 << i); // more different random numbers + CMSDK_gpio_MaskedWrite(CMSDK_GPIO0, 0x0000, random_mask); + } + + CMSDK_GPIO0->DATAOUT = 0; + + mask = 0; + + for(i = 0; i < 16; i++){ + //repeat same process but with 16 random mask values, + random_mask = (rand() % 65536); //which are only cleared every other iteration so that + random_value = (rand() % 65536); //they accumulate, the first value is outputted using + //masked access and then not cleared then a second value + if(prev_masks[0] == 0) prev_masks[0] = random_mask; //is outputted using another mask and then the resulting + else prev_masks[1] = random_mask; //output is then checked against the expected output + + exp_value = ((random_mask & random_value) | (exp_value & ~random_mask)); + + CMSDK_gpio_MaskedWrite(CMSDK_GPIO0, random_value, random_mask); + + if(CMSDK_GPIO0->DATA != exp_value) + err_code |= (1 << (i + 16)); + + /* For every two non-zero mask writes taken place, + reset the data using the stored mask value and + clear the exp_value back to 0 */ + if((prev_masks[0] != 0) && (prev_masks[1] != 0)){ + CMSDK_gpio_MaskedWrite(CMSDK_GPIO0, 0x0000, prev_masks[0]); + CMSDK_gpio_MaskedWrite(CMSDK_GPIO0, 0x0000, prev_masks[1]); + prev_masks[0] = 0; + prev_masks[1] = 0; + exp_value = 0; + } + } + + if(!err_code) puts("Stage 4b Random Masked Output Tests Passed Successfully\n"); + else { + printf("\nStage 4b Random Masked Output Tests Failed, Error Code: (0x%x)\n", err_code); + err_code_all |= 2; + } + + + if(!err_code_all) puts("\nAll Masked Output Tests Passed Successfully\n"); + + if(!err_code_all) return 0; + else return 4; +} + +//PORT 0 ISR - sets what type of interrupt it is according to the int polarity and type and +//if the result when checked is the one expected then function will pass the test or fail it, if it's not +//0 = undefined, 1 = rising edge, 2 = high level, 3 = falling edge, 4 = low level + +void PORT0_COMB_Handler(void) +{ + + if((CMSDK_GPIO0->INTPOLSET)){ + if((CMSDK_GPIO0->INTTYPESET)){ + if(CMSDK_GPIO0->DATA == ( data |= (1 << N) )) + intstatus[N] = 1; /*rising edge*/ + }else{ + if(CMSDK_GPIO0->DATA == (1 << N)){ + intstatus[N] = 2; /*high level*/ + CMSDK_GPIO0->DATAOUT = 0x0000; + } + } + }else{ + if((CMSDK_GPIO0->INTTYPESET)){ + if(CMSDK_GPIO0->DATA == (data &= ~(1 << N))) intstatus[N] = 3; /*falling edge*/ + }else{ + if(CMSDK_GPIO0->DATA == 0xFFFF ^ (1 << N)){ + intstatus[N] = 4; /*low level*/ + CMSDK_GPIO0->DATAOUT = 0xFFFF; + } + } + } + CMSDK_gpio_IntClear(CMSDK_GPIO0, N); +} + diff --git a/Cortex-M0/nanosoc/software/common/validation/gpio_tests.c b/Cortex-M0/nanosoc/software/common/validation/gpio_tests.c new file mode 100644 index 0000000..ef3c48a --- /dev/null +++ b/Cortex-M0/nanosoc/software/common/validation/gpio_tests.c @@ -0,0 +1,2004 @@ +/* + *----------------------------------------------------------------------------- + * The confidential and proprietary information contained in this file may + * only be used by a person authorised under and to the extent permitted + * by a subsisting licensing agreement from Arm Limited or its affiliates. + * + * (C) COPYRIGHT 2010-2013 Arm Limited or its affiliates. + * ALL RIGHTS RESERVED + * + * This entire notice must be reproduced on all copies of this file + * and copies of this file may only be made by a person if such person is + * permitted to do so under the terms of a subsisting license agreement + * from Arm Limited or its affiliates. + * + * SVN Information + * + * Checked In : $Date: 2017-10-10 15:55:38 +0100 (Tue, 10 Oct 2017) $ + * + * Revision : $Revision: 371321 $ + * + * Release Information : Cortex-M System Design Kit-r1p1-00rel0 + *----------------------------------------------------------------------------- + */ + +/* + A test to check the functionality of the AHB GPIO. +*/ + +#ifdef CORTEX_M0 +#include "CMSDK_CM0.h" +#define GPIO1_ALTERNATE_FUNC_MASK 0x002A /* Implemented bits */ +#endif + +#ifdef CORTEX_M0PLUS +#include "CMSDK_CM0plus.h" +#define GPIO1_ALTERNATE_FUNC_MASK 0x002A /* Implemented bits */ +#endif + +#ifdef CORTEX_M3 +#include "CMSDK_CM3.h" +#define GPIO1_ALTERNATE_FUNC_MASK 0xF82A /* Implemented bits */ +#endif + +#ifdef CORTEX_M4 +#include "CMSDK_CM4.h" +#define GPIO1_ALTERNATE_FUNC_MASK 0xF82A /* Implemented bits */ +#endif + +#include <stdio.h> +#include "uart_stdout.h" + +/* Alternate function control register mask */ + /* Implemented bits */ +#define GPIO0_ALTERNATE_FUNC_MASK 0x0000 + /* Default value */ +#define GPIO0_ALTERNATE_FUNC_DEFAULT 0x0000 + + /* Default value */ +#define GPIO1_ALTERNATE_FUNC_DEFAULT 0x0000 + +/* Macros for word, half word and byte */ +#define HW32_REG(ADDRESS) (*((volatile unsigned long *)(ADDRESS))) +#define HW16_REG(ADDRESS) (*((volatile unsigned short *)(ADDRESS))) +#define HW8_REG(ADDRESS) (*((volatile unsigned char *)(ADDRESS))) + +/* A trick to add a small delay in program */ +/* small_delay() is the same as __ISB() */ +#define small_delay __ISB + +/* peripheral and component ID values */ +#define AHB_GPIO_PID4 0x04 +#define AHB_GPIO_PID5 0x00 +#define AHB_GPIO_PID6 0x00 +#define AHB_GPIO_PID7 0x00 +#define AHB_GPIO_PID0 0x20 +#define AHB_GPIO_PID1 0xB8 +#define AHB_GPIO_PID2 0x1B +#define AHB_GPIO_PID3 0x00 +#define AHB_GPIO_CID0 0x0D +#define AHB_GPIO_CID1 0xF0 +#define AHB_GPIO_CID2 0x05 +#define AHB_GPIO_CID3 0xB1 + + +/* Declare test functions */ +int gpio_register_rw_test(CMSDK_GPIO_TypeDef *CMSDK_GPIO); +int gpio_interrupt_test(CMSDK_GPIO_TypeDef *CMSDK_GPIO); +int gpio_masked_access_test(CMSDK_GPIO_TypeDef *CMSDK_GPIO); +int gpio_unused_addresses_test(CMSDK_GPIO_TypeDef *CMSDK_GPIO); +void medium_delay(void); +int gpio0_id_check(void); +int gpio1_id_check(void); + +/* Global variables */ +volatile int gpio0_irq_occurred; +volatile int gpio1_irq_occurred; +volatile int gpio0_irq_expected; +volatile int gpio1_irq_expected; +volatile int gpio0_irq_level_irq; // indicate it is a level IRQ test + // Need to toggle interrupt source +volatile int gpio1_irq_level_irq; // indicate it is a level IRQ test + // Need to toggle interrupt source +volatile int multi_irq_test; // indicate continuous level trigger IRQ test + +volatile int counter; +volatile char gpio0_irq_flags[16]; + +int main (void) +{ + int result=0; + + // UART init + UartStdOutInit(); + + // Test banner message and revision number + puts("Cortex Microcontroller System Design Kit - GPIO Test - revision $Revision: 371321 $\n"); + + gpio0_irq_occurred = 0; + gpio1_irq_occurred = 0; + gpio0_irq_expected = 0; + gpio1_irq_expected = 0; + + puts("1) GPIO 0"); + + if (gpio0_id_check()==0) { + /* GPIO 0 present */ + result += gpio_register_rw_test(CMSDK_GPIO0); + result += gpio_interrupt_test(CMSDK_GPIO0); + result += gpio_masked_access_test(CMSDK_GPIO0); + result += gpio_unused_addresses_test(CMSDK_GPIO0); + } else { + puts ("- GPIO #0 not present. Tests skipped."); + } + + puts("\n2) GPIO 1"); + + if (gpio1_id_check()==0) { + /* GPIO 1 present */ + result += gpio_register_rw_test(CMSDK_GPIO1); + result += gpio_interrupt_test(CMSDK_GPIO1); + result += gpio_masked_access_test(CMSDK_GPIO1); + result += gpio_unused_addresses_test(CMSDK_GPIO1); + } else { + puts ("- GPIO #1 not present. Tests skipped."); + } + + if (result==0) { + printf ("\n** TEST PASSED **\n"); + } else { + printf ("\n** TEST FAILED **, Error code = (0x%x)\n", result); + } + UartEndSimulation(); + return 0; +} + +int gpio0_id_check(void) +{ +unsigned char gpio_id; + + gpio_id = HW8_REG(CMSDK_GPIO0_BASE + 0xFE8) & 0x07; + + if ((HW32_REG(CMSDK_GPIO0_BASE + 0xFE0) != 0x20) || + (HW32_REG(CMSDK_GPIO0_BASE + 0xFE4) != 0xB8) || + (gpio_id != 0x03)) + return 1; /* part ID & ARM ID does not match */ + else + return 0; +} +int gpio1_id_check(void) +{ +unsigned char gpio_id; + + gpio_id = HW8_REG(CMSDK_GPIO1_BASE + 0xFE8) & 0x07; + + if ((HW32_REG(CMSDK_GPIO1_BASE + 0xFE0) != 0x20) || + (HW32_REG(CMSDK_GPIO1_BASE + 0xFE4) != 0xB8) || + (gpio_id != 0x03)) + return 1; /* part ID & ARM ID does not match */ + else + return 0; +} + +void medium_delay(void) +{ + int i; + for (i=0;i<3;i++){ + small_delay(); + } + return; +} +/* --------------------------------------------------------------- */ +/* GPIO masked access tests */ +/* --------------------------------------------------------------- */ +int gpio_masked_access_test(CMSDK_GPIO_TypeDef *CMSDK_GPIO){ + int return_val=0; + unsigned int err_code=0; + int i; + + unsigned int gpio_datamask; /* Data compare mask */ + unsigned int gpio_byte_base; /* Base address of GPIO masked access*/ + unsigned int current_value; /* */ + unsigned int read_value; /* */ + unsigned int expected_value; /* */ + unsigned int write_value; + int test_counter = 0; + int ul_err = 0; + + + puts("GPIO mask access test"); + puts("- lower byte"); + + if (CMSDK_GPIO==CMSDK_GPIO0) { + gpio_datamask = 0xFFFFFFFF; + gpio_byte_base = CMSDK_GPIO0_BASE + 0x400; + } + else if (CMSDK_GPIO==CMSDK_GPIO1) { + gpio_datamask = ~((1<<5)|(1<<4)|(1<<2)|(1<<0)); /* Bits that cannot be tested */ + gpio_byte_base = CMSDK_GPIO1_BASE + 0x400; + } + else { + puts ("ERROR: Input parameter invalid in function 'gpio_masked_access_test'."); + return 1; + } + + CMSDK_GPIO->INTENCLR = 0xFFFF; + CMSDK_GPIO->OUTENABLESET = gpio_datamask; + CMSDK_GPIO->DATAOUT = 0; + small_delay(); /* DATA read back take time to get updated due to synchronisation registers*/ + current_value = CMSDK_GPIO->DATA; + + for (i=0;i<256;i++){ + /* Use masked access to read current value */ + read_value = CMSDK_GPIO->LB_MASKED[i]; + expected_value = current_value & i; + if ((read_value & gpio_datamask) != (expected_value & gpio_datamask)) { err_code |= (1<<0);} + + /* Use half word read access to carry out mask access */ + read_value = HW16_REG(gpio_byte_base + 4 * i); + expected_value = current_value & i; + if ((read_value & gpio_datamask) != (expected_value & gpio_datamask)) { err_code |= (1<<1);} + + read_value = HW16_REG(gpio_byte_base + 4 * i + 2); + expected_value = 0; + if ((read_value ) != (expected_value )) { err_code |= (1<<2);} + + /* Use byte read access to carry out mask access */ + read_value = HW8_REG(gpio_byte_base + 4 * i); + expected_value = current_value & i; + if ((read_value & gpio_datamask) != (expected_value & gpio_datamask)) { err_code |= (1<<3);} + + read_value = HW8_REG(gpio_byte_base + 4 * i + 1); + expected_value = 0; + if ((read_value ) != (expected_value )) { err_code |= (1<<4);} + + read_value = HW8_REG(gpio_byte_base + 4 * i + 2); + expected_value = 0; + if ((read_value ) != (expected_value )) { err_code |= (1<<5);} + + read_value = HW8_REG(gpio_byte_base + 4 * i + 3); + expected_value = 0; + if ((read_value ) != (expected_value )) { err_code |= (1<<6);} + + /* Use masked access to toggle current value, check it with word access */ + write_value = ~CMSDK_GPIO->LB_MASKED[i]; + CMSDK_GPIO->LB_MASKED[i] = write_value; + current_value = (current_value & (~i)) | (write_value & i); + small_delay(); /* DATA read back take time to get updated due to synchronisation registers*/ + + /* Use masked access to read current value */ + read_value = CMSDK_GPIO->LB_MASKED[i]; + expected_value = current_value & i; + if ((read_value & gpio_datamask) != (expected_value & gpio_datamask)) { err_code |= (1<<7);} + + /* Use normal access to read current value */ + read_value = CMSDK_GPIO->DATA; + expected_value = current_value; + if ((read_value & gpio_datamask) != (expected_value & gpio_datamask)) { err_code |= (1<<8);} + + /* Use half word read access to carry out mask access */ + read_value = HW16_REG(gpio_byte_base + 4 * i); + expected_value = current_value & i; + if ((read_value & gpio_datamask) != (expected_value & gpio_datamask)) { err_code |= (1<<9);} + + read_value = HW16_REG(gpio_byte_base + 4 * i + 2); + expected_value = 0; + if ((read_value ) != (expected_value )) { err_code |= (1<<10);} + + /* Use byte read access to carry out mask access */ + read_value = HW8_REG(gpio_byte_base + 4 * i); + expected_value = current_value & i; + if ((read_value & gpio_datamask) != (expected_value & gpio_datamask)) { err_code |= (1<<11);} + + read_value = HW8_REG(gpio_byte_base + 4 * i + 1); + expected_value = 0; + if ((read_value ) != (expected_value )) { err_code |= (1<<12);} + + read_value = HW8_REG(gpio_byte_base + 4 * i + 2); + expected_value = 0; + if ((read_value ) != (expected_value )) { err_code |= (1<<13);} + + read_value = HW8_REG(gpio_byte_base + 4 * i + 3); + expected_value = 0; + if ((read_value ) != (expected_value )) { err_code |= (1<<14);} + + /* Use half word masked access to toggle current value, check it with word access */ + write_value = ~CMSDK_GPIO->LB_MASKED[i]; + HW16_REG(gpio_byte_base + 4 * i) = write_value; + current_value = (current_value & (~i)) | (write_value & i); + small_delay(); /* DATA read back take time to get updated due to synchronisation registers*/ + + /* Use masked access to read current value */ + read_value = CMSDK_GPIO->LB_MASKED[i]; + expected_value = current_value & i; + if ((read_value & gpio_datamask) != (expected_value & gpio_datamask)) { err_code |= (1<<15);} + + /* Use normal access to read current value */ + read_value = CMSDK_GPIO->DATA; + expected_value = current_value; + if ((read_value & gpio_datamask) != (expected_value & gpio_datamask)) { err_code |= (1<<16);} + + /* Use half word access to write to upper 16-bit, should have no change in result */ + write_value = ~CMSDK_GPIO->LB_MASKED[i]; + HW16_REG(gpio_byte_base + 4 * i + 2) = write_value; + small_delay(); /* DATA read back take time to get updated due to synchronisation registers*/ + read_value = CMSDK_GPIO->DATA; + expected_value = current_value; + if ((read_value & gpio_datamask) != (expected_value & gpio_datamask)) { err_code |= (1<<17);} + + /* Use half word read access to carry out mask access */ + read_value = HW16_REG(gpio_byte_base + 4 * i); + expected_value = current_value & i; + if ((read_value & gpio_datamask) != (expected_value & gpio_datamask)) { err_code |= (1<<18);} + + read_value = HW16_REG(gpio_byte_base + 4 * i + 2); + expected_value = 0; + if ((read_value ) != (expected_value )) { err_code |= (1<<19);} + + /* Use byte read access to carry out mask access */ + read_value = HW8_REG(gpio_byte_base + 4 * i); + expected_value = current_value & i; + if ((read_value & gpio_datamask) != (expected_value & gpio_datamask)) { err_code |= (1<<20);} + + read_value = HW8_REG(gpio_byte_base + 4 * i + 1); + expected_value = 0; + if ((read_value ) != (expected_value )) { err_code |= (1<<21);} + + read_value = HW8_REG(gpio_byte_base + 4 * i + 2); + expected_value = 0; + if ((read_value ) != (expected_value )) { err_code |= (1<<22);} + + read_value = HW8_REG(gpio_byte_base + 4 * i + 3); + expected_value = 0; + if ((read_value ) != (expected_value )) { err_code |= (1<<23);} + + /* Use byte masked access to toggle current value, check it with word access */ + write_value = ~CMSDK_GPIO->LB_MASKED[i]; + HW8_REG(gpio_byte_base + 4 * i) = write_value; + current_value = (current_value & (~i)) | (write_value & i); + small_delay(); /* DATA read back take time to get updated due to synchronisation registers*/ + + /* Use normal access to read current value */ + read_value = CMSDK_GPIO->DATA; + expected_value = current_value; + if ((read_value & gpio_datamask) != (expected_value & gpio_datamask)) { err_code |= (1<<24);} + + /* Write to second byte, should have no effect */ + write_value = ~CMSDK_GPIO->LB_MASKED[i]; + HW8_REG(gpio_byte_base + 4 * i + 1) = write_value; + small_delay(); /* DATA read back take time to get updated due to synchronisation registers*/ + + /* Use normal access to read current value */ + read_value = CMSDK_GPIO->DATA; + expected_value = current_value; + if ((read_value & gpio_datamask) != (expected_value & gpio_datamask)) { err_code |= (1<<25);} + + /* Use masked access to read current value */ + read_value = CMSDK_GPIO->LB_MASKED[i]; + expected_value = current_value & i; + if ((read_value & gpio_datamask) != (expected_value & gpio_datamask)) { err_code |= (1<<26);} + + /* Use half word read access to carry out mask access */ + read_value = HW16_REG(gpio_byte_base + 4 * i); + expected_value = current_value & i; + if ((read_value & gpio_datamask) != (expected_value & gpio_datamask)) { err_code |= (1<<27);} + + read_value = HW16_REG(gpio_byte_base + 4 * i + 2); + expected_value = 0; + if ((read_value ) != (expected_value )) { err_code |= (1<<28);} + + /* Use byte read access to carry out mask access */ + read_value = HW8_REG(gpio_byte_base + 4 * i); + expected_value = current_value & i; + if ((read_value & gpio_datamask) != (expected_value & gpio_datamask)) { err_code |= (1<<29);} + + read_value = HW8_REG(gpio_byte_base + 4 * i + 1); + expected_value = 0; + if ((read_value ) != (expected_value )) { err_code |= (1<<30);} + + read_value = HW8_REG(gpio_byte_base + 4 * i + 2); + expected_value = 0; + if ((read_value ) != (expected_value )) { err_code |= 0x80000000UL;} + + if (err_code != 0) { + printf ("ERROR : LB masked access failed (0x%x) at mask = %d\n", err_code, i); + return_val =1; + err_code = 0; + }else test_counter++; + } + + if(test_counter == 256){ + puts("Lower Byte Mask Access Tests Passed\n"); + } + else{ + puts("Lower Byte Mask Access Tests Failed\n"); + ul_err = 1; + } + + test_counter = 0; + + puts("- upper byte"); + gpio_byte_base = gpio_byte_base + 0x400; + + for (i=0;i<256;i++){ + /* Use masked access to read current value */ + read_value = CMSDK_GPIO->UB_MASKED[i]; + expected_value = current_value & (i<<8); + if ((read_value & gpio_datamask) != (expected_value & gpio_datamask)) { err_code |= (1<<0);} + + /* Use half word read access to carry out mask access */ + read_value = HW16_REG(gpio_byte_base + 4 * i); + expected_value = current_value & (i<<8); + if ((read_value & gpio_datamask) != (expected_value & gpio_datamask)) { err_code |= (1<<1);} + + read_value = HW16_REG(gpio_byte_base + 4 * i + 2); + expected_value = 0; + if ((read_value ) != (expected_value )) { err_code |= (1<<2);} + + /* Use byte read access to carry out mask access */ + read_value = HW8_REG(gpio_byte_base + 4 * i); + expected_value = 0; + if ((read_value ) != (expected_value )) { err_code |= (1<<4);} + + read_value = HW8_REG(gpio_byte_base + 4 * i + 1); + expected_value = (current_value>>8) & i; + if ((read_value & gpio_datamask) != (expected_value & gpio_datamask)) { err_code |= (1<<3);} + + read_value = HW8_REG(gpio_byte_base + 4 * i + 2); + expected_value = 0; + if ((read_value ) != (expected_value )) { err_code |= (1<<5);} + + read_value = HW8_REG(gpio_byte_base + 4 * i + 3); + expected_value = 0; + if ((read_value ) != (expected_value )) { err_code |= (1<<6);} + + /* Use masked access to toggle current value, check it with word access */ + write_value = ~CMSDK_GPIO->UB_MASKED[i]; + CMSDK_GPIO->UB_MASKED[i] = write_value; + current_value = (current_value & (~(i<<8))) | (write_value & (i<<8)); + small_delay(); /* DATA read back take time to get updated due to synchronisation registers*/ + + /* Use masked access to read current value */ + read_value = CMSDK_GPIO->UB_MASKED[i]; + expected_value = current_value & (i<<8); + if ((read_value & gpio_datamask) != (expected_value & gpio_datamask)) { err_code |= (1<<7);} + + /* Use normal access to read current value */ + read_value = CMSDK_GPIO->DATA; + expected_value = current_value; + if ((read_value & gpio_datamask) != (expected_value & gpio_datamask)) { err_code |= (1<<8);} + + /* Use half word read access to carry out mask access */ + read_value = HW16_REG(gpio_byte_base + 4 * i); + expected_value = current_value & (i<<8); + if ((read_value & gpio_datamask) != (expected_value & gpio_datamask)) { err_code |= (1<<9);} + + read_value = HW16_REG(gpio_byte_base + 4 * i + 2); + expected_value = 0; + if ((read_value ) != (expected_value )) { err_code |= (1<<10);} + + /* Use byte read access to carry out mask access */ + read_value = HW8_REG(gpio_byte_base + 4 * i); + expected_value = 0; + if ((read_value ) != (expected_value )) { err_code |= (1<<11);} + + read_value = HW8_REG(gpio_byte_base + 4 * i + 1); + expected_value = (current_value>>8) & i; + if ((read_value & gpio_datamask) != (expected_value & gpio_datamask)) { err_code |= (1<<12);} + + read_value = HW8_REG(gpio_byte_base + 4 * i + 2); + expected_value = 0; + if ((read_value ) != (expected_value )) { err_code |= (1<<13);} + + read_value = HW8_REG(gpio_byte_base + 4 * i + 3); + expected_value = 0; + if ((read_value ) != (expected_value )) { err_code |= (1<<14);} + + /* Use half word masked access to toggle current value, check it with word access */ + write_value = ~CMSDK_GPIO->UB_MASKED[i]; + HW16_REG(gpio_byte_base + 4 * i) = write_value; + current_value = (current_value & (~(i<<8))) | (write_value & (i<<8)); + small_delay(); /* DATA read back take time to get updated due to synchronisation registers*/ + + /* Use masked access to read current value */ + read_value = CMSDK_GPIO->UB_MASKED[i]; + expected_value = current_value & (i<<8); + if ((read_value & gpio_datamask) != (expected_value & gpio_datamask)) { err_code |= (1<<15);} + + /* Use normal access to read current value */ + read_value = CMSDK_GPIO->DATA; + expected_value = current_value; + if ((read_value & gpio_datamask) != (expected_value & gpio_datamask)) { err_code |= (1<<16);} + + /* Use half word access to write to upper 16-bit, should have no change in result */ + write_value = ~HW16_REG(gpio_byte_base + 4 * i + 2); + HW16_REG(gpio_byte_base + 4 * i + 2) = write_value; + small_delay(); /* DATA read back take time to get updated due to synchronisation registers*/ + read_value = CMSDK_GPIO->DATA; + expected_value = current_value; + if ((read_value & gpio_datamask) != (expected_value & gpio_datamask)) { err_code |= (1<<17);} + + /* Use half word read access to carry out mask access */ + read_value = HW16_REG(gpio_byte_base + 4 * i); + expected_value = current_value & (i<<8); + if ((read_value & gpio_datamask) != (expected_value & gpio_datamask)) { err_code |= (1<<18);} + + read_value = HW16_REG(gpio_byte_base + 4 * i + 2); + expected_value = 0; + if ((read_value ) != (expected_value )) { err_code |= (1<<19);} + + /* Use byte read access to carry out mask access */ + read_value = HW8_REG(gpio_byte_base + 4 * i); + expected_value = 0; + if ((read_value ) != (expected_value )) { err_code |= (1<<20);} + + read_value = HW8_REG(gpio_byte_base + 4 * i + 1); + expected_value = (current_value>>8) & i; + if ((read_value & gpio_datamask) != (expected_value & gpio_datamask)) { err_code |= (1<<21);} + + read_value = HW8_REG(gpio_byte_base + 4 * i + 2); + expected_value = 0; + if ((read_value ) != (expected_value )) { err_code |= (1<<22);} + + read_value = HW8_REG(gpio_byte_base + 4 * i + 3); + expected_value = 0; + if ((read_value ) != (expected_value )) { err_code |= (1<<23);} + + /* Use byte masked access to toggle current value, check it with word access */ + write_value = ~CMSDK_GPIO->UB_MASKED[i]; + HW8_REG(gpio_byte_base + 4 * i + 1) = (write_value>>8) & 0xFF; + current_value = (current_value & (~(i<<8))) | (write_value & (i<<8)); + small_delay(); /* DATA read back take time to get updated due to synchronisation registers*/ + + /* Use normal access to read current value */ + read_value = CMSDK_GPIO->DATA; + expected_value = current_value; + if ((read_value & gpio_datamask) != (expected_value & gpio_datamask)) { err_code |= (1<<24);} + + /* Write to lower byte, should have no effect */ + write_value = ~CMSDK_GPIO->UB_MASKED[i]; + HW8_REG(gpio_byte_base + 4 * i ) = (write_value) & 0xFF; + small_delay(); /* DATA read back take time to get updated due to synchronisation registers*/ + + /* Use normal access to read current value */ + read_value = CMSDK_GPIO->DATA; + expected_value = current_value; + if ((read_value & gpio_datamask) != (expected_value & gpio_datamask)) { err_code |= (1<<25);} + + /* Use masked access to read current value */ + read_value = CMSDK_GPIO->UB_MASKED[i]; + expected_value = current_value & (i<<8); + if ((read_value & gpio_datamask) != (expected_value & gpio_datamask)) { err_code |= (1<<26);} + + /* Use half word read access to carry out mask access */ + read_value = HW16_REG(gpio_byte_base + 4 * i); + expected_value = current_value & (i<<8); + if ((read_value & gpio_datamask) != (expected_value & gpio_datamask)) { err_code |= (1<<27);} + + read_value = HW16_REG(gpio_byte_base + 4 * i + 2); + expected_value = 0; + if ((read_value ) != (expected_value )) { err_code |= (1<<28);} + + /* Use byte read access to carry out mask access */ + read_value = HW8_REG(gpio_byte_base + 4 * i); + expected_value = 0; + if ((read_value ) != (expected_value )) { err_code |= (1<<29);} + + read_value = HW8_REG(gpio_byte_base + 4 * i + 1); + expected_value = (current_value>>8) & i; + if ((read_value & gpio_datamask) != (expected_value & gpio_datamask)) { err_code |= (1<<30);} + + read_value = HW8_REG(gpio_byte_base + 4 * i + 2); + expected_value = 0; + if ((read_value ) != (expected_value )) { err_code |= (0x80000000UL);} + + + + if (err_code != 0) { + printf ("ERROR : UB masked access failed (0x%x) at mask = %d\n", err_code, i); + return_val =1; + err_code = 0; + UartEndSimulation(); + } + else test_counter++; + } + + if(test_counter == 256){ + puts("Upper Byte Mask Access Tests Passed\n"); + } + else{ + puts("Upper Byte Mask Access Tests Failed\n"); + ul_err |= 2; + } + + if(ul_err) printf("Mask Access Tests Failed, Error Code: (0x%x)\n", ul_err); + else puts("Mask Access Tests Passed\n"); + + /* Clean up */ + CMSDK_GPIO->OUTENABLECLR = 0xFFFFFFFF; + CMSDK_GPIO->DATAOUT = 0; + + return(return_val); +} + + + +/* --------------------------------------------------------------- */ +/* GPIO register read/write tests */ +/* --------------------------------------------------------------- */ + +int gpio_register_rw_test(CMSDK_GPIO_TypeDef *CMSDK_GPIO){ + int return_val=0; + unsigned int err_code=0; + int i; + int test_individual_irq = 1; /* Test individual IRQ in GPIO #0 by default */ + + unsigned int gpio_datamask; /* Data compare mask */ + unsigned int gpio_outen_mask; /* Output enable mask */ + unsigned int gpio_altfunc_initval; + unsigned int gpio_altfunc_mask; + unsigned int gpio_altfunc_usedmask; + unsigned int gpio_base; + unsigned int saved_altfunc; + + + if (CMSDK_GPIO==CMSDK_GPIO0) { + saved_altfunc = CMSDK_GPIO0->ALTFUNCSET; /* Keep a copy of current ALTFUNC */ + /* GPIO #0 is not shared in example system */ + gpio_datamask = 0xFFFFFFFF; + gpio_outen_mask = 0xFFFFFFFF; + gpio_altfunc_mask = GPIO0_ALTERNATE_FUNC_MASK; /* Mask bits that are not implemented */ + gpio_altfunc_initval = GPIO0_ALTERNATE_FUNC_DEFAULT; + gpio_altfunc_usedmask = 0xFFFFFFFF; + gpio_base = CMSDK_GPIO0_BASE; + } + else if (CMSDK_GPIO==CMSDK_GPIO1) { + saved_altfunc = CMSDK_GPIO1->ALTFUNCSET; /* Keep a copy of current ALTFUNC */ + /* GPIO #1 is shared with peripherals in example system */ + /* bit 5 is used by stdout */ + gpio_datamask = ~((1<<5)|(1<<2)|(1<<0)); /* Ignore return values for these bits */ + gpio_outen_mask = ~((1<<2)|(1<<0)); /* Do not set output enable for these bits */ + gpio_altfunc_mask = GPIO1_ALTERNATE_FUNC_MASK; /* Mask bits that are not implemented */ + gpio_altfunc_initval = GPIO1_ALTERNATE_FUNC_DEFAULT; + gpio_altfunc_usedmask = ~(1<<5); /* This bit is use by stdout */ + gpio_base = CMSDK_GPIO1_BASE; + } + else { + puts ("ERROR: Input parameter invalid in function 'gpio_register_rw_test'."); + return 1; + } + + puts("GPIO R/W test"); + puts("- initial values"); + + NVIC_DisableIRQ(PORT0_ALL_IRQn); + NVIC_DisableIRQ(PORT1_ALL_IRQn); + for (i=0;i<16;i++){ + NVIC_DisableIRQ(((IRQn_Type)(((int)PORT0_0_IRQn) + i))); + } + + /* Test initial values. */ + /* Current data value could be affected by external signal */ + if (CMSDK_GPIO==CMSDK_GPIO0) { + /* By default GPIO #0 signals are pulled up */ + if (CMSDK_GPIO->DATA != 0x0000FFFF) {err_code |= (1<<0); } + } + + if (CMSDK_GPIO->DATAOUT != 0x00000000) {err_code |= (1<<1); } + if (CMSDK_GPIO->OUTENABLESET != 0x00000000) {err_code |= (1<<2); } + + /* Alternate function initial value can be affected by + 1) Verilog parameter + 2) Retargeting initialization code */ + /* GPIO #1 is shared with peripherals in example system */ + /* bit 5 is used by stdout */ + if ((CMSDK_GPIO->ALTFUNCSET & gpio_altfunc_usedmask) != (gpio_altfunc_initval & gpio_altfunc_usedmask)) + {err_code |= (1<<3); } + + if (CMSDK_GPIO->INTENSET != 0x00000000) {err_code |= (1<<4); } + if (CMSDK_GPIO->INTTYPESET != 0x00000000) {err_code |= (1<<5); } + if (CMSDK_GPIO->INTPOLSET != 0x00000000) {err_code |= (1<<6); } + if (CMSDK_GPIO->INTSTATUS != 0x00000000) {err_code |= (1<<7); } + puts ("- check ID values (WORD accesses)"); + if (HW32_REG(gpio_base + 0xFD0) != AHB_GPIO_PID4) {err_code |= (1<<8); } + if (HW32_REG(gpio_base + 0xFD4) != AHB_GPIO_PID5) {err_code |= (1<<9); } + if (HW32_REG(gpio_base + 0xFD8) != AHB_GPIO_PID6) {err_code |= (1<<10); } + if (HW32_REG(gpio_base + 0xFDC) != AHB_GPIO_PID7) {err_code |= (1<<11); } + if (HW32_REG(gpio_base + 0xFE0) != AHB_GPIO_PID0) {err_code |= (1<<12); } + if (HW32_REG(gpio_base + 0xFE4) != AHB_GPIO_PID1) {err_code |= (1<<13); } + if (HW32_REG(gpio_base + 0xFE8) != AHB_GPIO_PID2) {err_code |= (1<<14); } + if (HW32_REG(gpio_base + 0xFEC) != AHB_GPIO_PID3) {err_code |= (1<<15); } + if (HW32_REG(gpio_base + 0xFF0) != AHB_GPIO_CID0) {err_code |= (1<<16); } + if (HW32_REG(gpio_base + 0xFF4) != AHB_GPIO_CID1) {err_code |= (1<<17); } + if (HW32_REG(gpio_base + 0xFF8) != AHB_GPIO_CID2) {err_code |= (1<<18); } + if (HW32_REG(gpio_base + 0xFFC) != AHB_GPIO_CID3) {err_code |= (1<<19); } + + /* test write to PIDs and CIDs - should be ignored */ + for (i=0; i <12; i++) { + HW8_REG(gpio_base + 0xFD0 + (i<<2)) = ~HW32_REG(gpio_base + 0xFD0 + (i<<2)); + } + + /* Check read back values again, should not be changed */ + if (HW16_REG(gpio_base + 0xFD0) != AHB_GPIO_PID4) {err_code |= (1<<8); } + if (HW16_REG(gpio_base + 0xFD4) != AHB_GPIO_PID5) {err_code |= (1<<9); } + if (HW16_REG(gpio_base + 0xFD8) != AHB_GPIO_PID6) {err_code |= (1<<10); } + if (HW16_REG(gpio_base + 0xFDC) != AHB_GPIO_PID7) {err_code |= (1<<11); } + if (HW16_REG(gpio_base + 0xFE0) != AHB_GPIO_PID0) {err_code |= (1<<12); } + if (HW16_REG(gpio_base + 0xFE4) != AHB_GPIO_PID1) {err_code |= (1<<13); } + if (HW16_REG(gpio_base + 0xFE8) != AHB_GPIO_PID2) {err_code |= (1<<14); } + if (HW16_REG(gpio_base + 0xFEC) != AHB_GPIO_PID3) {err_code |= (1<<15); } + if (HW16_REG(gpio_base + 0xFF0) != AHB_GPIO_CID0) {err_code |= (1<<16); } + if (HW16_REG(gpio_base + 0xFF4) != AHB_GPIO_CID1) {err_code |= (1<<17); } + if (HW16_REG(gpio_base + 0xFF8) != AHB_GPIO_CID2) {err_code |= (1<<18); } + if (HW16_REG(gpio_base + 0xFFC) != AHB_GPIO_CID3) {err_code |= (1<<19); } + + if (err_code != 0) { + printf ("ERROR : initial value failed (0x%x)\n", err_code); + return_val=1; + err_code = 0; + } + + + puts ("- write ID values (HALF WORD accesses, lower) - should have no effect"); + HW16_REG(gpio_base + 0xFD0) = 0xFFFF; + HW16_REG(gpio_base + 0xFD4) = 0xFFFF; + HW16_REG(gpio_base + 0xFD8) = 0xFFFF; + HW16_REG(gpio_base + 0xFDC) = 0xFFFF; + HW16_REG(gpio_base + 0xFE0) = 0xFFFF; + HW16_REG(gpio_base + 0xFE4) = 0xFFFF; + HW16_REG(gpio_base + 0xFE8) = 0xFFFF; + HW16_REG(gpio_base + 0xFEC) = 0xFFFF; + HW16_REG(gpio_base + 0xFF0) = 0xFFFF; + HW16_REG(gpio_base + 0xFF4) = 0xFFFF; + HW16_REG(gpio_base + 0xFF8) = 0xFFFF; + HW16_REG(gpio_base + 0xFFC) = 0xFFFF; + + + puts ("- check ID values (HALF WORD accesses, lower)"); + if (HW16_REG(gpio_base + 0xFD0) != AHB_GPIO_PID4) {err_code |= (1<<0); } + if (HW16_REG(gpio_base + 0xFD4) != AHB_GPIO_PID5) {err_code |= (1<<1); } + if (HW16_REG(gpio_base + 0xFD8) != AHB_GPIO_PID6) {err_code |= (1<<2); } + if (HW16_REG(gpio_base + 0xFDC) != AHB_GPIO_PID7) {err_code |= (1<<3); } + if (HW16_REG(gpio_base + 0xFE0) != AHB_GPIO_PID0) {err_code |= (1<<4); } + if (HW16_REG(gpio_base + 0xFE4) != AHB_GPIO_PID1) {err_code |= (1<<5); } + if (HW16_REG(gpio_base + 0xFE8) != AHB_GPIO_PID2) {err_code |= (1<<6); } + if (HW16_REG(gpio_base + 0xFEC) != AHB_GPIO_PID3) {err_code |= (1<<7); } + if (HW16_REG(gpio_base + 0xFF0) != AHB_GPIO_CID0) {err_code |= (1<<8); } + if (HW16_REG(gpio_base + 0xFF4) != AHB_GPIO_CID1) {err_code |= (1<<9); } + if (HW16_REG(gpio_base + 0xFF8) != AHB_GPIO_CID2) {err_code |= (1<<10); } + if (HW16_REG(gpio_base + 0xFFC) != AHB_GPIO_CID3) {err_code |= (1<<11); } + + + puts ("- write ID values (HALF WORD accesses, upper) - should have no effect"); + HW16_REG(gpio_base + 0xFD2) = 0xFFFF; + HW16_REG(gpio_base + 0xFD6) = 0xFFFF; + HW16_REG(gpio_base + 0xFDA) = 0xFFFF; + HW16_REG(gpio_base + 0xFDE) = 0xFFFF; + HW16_REG(gpio_base + 0xFE2) = 0xFFFF; + HW16_REG(gpio_base + 0xFE6) = 0xFFFF; + HW16_REG(gpio_base + 0xFEA) = 0xFFFF; + HW16_REG(gpio_base + 0xFEE) = 0xFFFF; + HW16_REG(gpio_base + 0xFF2) = 0xFFFF; + HW16_REG(gpio_base + 0xFF6) = 0xFFFF; + HW16_REG(gpio_base + 0xFFA) = 0xFFFF; + HW16_REG(gpio_base + 0xFFE) = 0xFFFF; + + puts ("- check ID values (HALF WORD accesses, upper)"); + if (HW16_REG(gpio_base + 0xFD2) != 0x00) {err_code |= (1<<12); } + if (HW16_REG(gpio_base + 0xFD6) != 0x00) {err_code |= (1<<13); } + if (HW16_REG(gpio_base + 0xFDA) != 0x00) {err_code |= (1<<14); } + if (HW16_REG(gpio_base + 0xFDE) != 0x00) {err_code |= (1<<15); } + if (HW16_REG(gpio_base + 0xFE2) != 0x00) {err_code |= (1<<16); } + if (HW16_REG(gpio_base + 0xFE6) != 0x00) {err_code |= (1<<17); } + if (HW16_REG(gpio_base + 0xFEA) != 0x00) {err_code |= (1<<18); } + if (HW16_REG(gpio_base + 0xFEE) != 0x00) {err_code |= (1<<19); } + if (HW16_REG(gpio_base + 0xFF2) != 0x00) {err_code |= (1<<20); } + if (HW16_REG(gpio_base + 0xFF6) != 0x00) {err_code |= (1<<21); } + if (HW16_REG(gpio_base + 0xFFA) != 0x00) {err_code |= (1<<22); } + if (HW16_REG(gpio_base + 0xFFE) != 0x00) {err_code |= (1<<23); } + + if (err_code != 0) { + printf ("ERROR : initial value failed (0x%x)\n", err_code); + return_val=1; + err_code = 0; + } + + puts ("- write ID values (BYTE accesses, byte 0) - should have no effect"); + HW8_REG(gpio_base + 0xFD0) = 0xFF; + HW8_REG(gpio_base + 0xFD4) = 0xFF; + HW8_REG(gpio_base + 0xFD8) = 0xFF; + HW8_REG(gpio_base + 0xFDC) = 0xFF; + HW8_REG(gpio_base + 0xFE0) = 0xFF; + HW8_REG(gpio_base + 0xFE4) = 0xFF; + HW8_REG(gpio_base + 0xFE8) = 0xFF; + HW8_REG(gpio_base + 0xFEC) = 0xFF; + HW8_REG(gpio_base + 0xFF0) = 0xFF; + HW8_REG(gpio_base + 0xFF4) = 0xFF; + HW8_REG(gpio_base + 0xFF8) = 0xFF; + HW8_REG(gpio_base + 0xFFC) = 0xFF; + + puts ("- check ID values (BYTE accesses, byte 0)"); + if (HW8_REG(gpio_base + 0xFD0) != AHB_GPIO_PID4) {err_code |= (1<<0); } + if (HW8_REG(gpio_base + 0xFD4) != AHB_GPIO_PID5) {err_code |= (1<<1); } + if (HW8_REG(gpio_base + 0xFD8) != AHB_GPIO_PID6) {err_code |= (1<<2); } + if (HW8_REG(gpio_base + 0xFDC) != AHB_GPIO_PID7) {err_code |= (1<<3); } + if (HW8_REG(gpio_base + 0xFE0) != AHB_GPIO_PID0) {err_code |= (1<<4); } + if (HW8_REG(gpio_base + 0xFE4) != AHB_GPIO_PID1) {err_code |= (1<<5); } + if (HW8_REG(gpio_base + 0xFE8) != AHB_GPIO_PID2) {err_code |= (1<<6); } + if (HW8_REG(gpio_base + 0xFEC) != AHB_GPIO_PID3) {err_code |= (1<<7); } + if (HW8_REG(gpio_base + 0xFF0) != AHB_GPIO_CID0) {err_code |= (1<<8); } + if (HW8_REG(gpio_base + 0xFF4) != AHB_GPIO_CID1) {err_code |= (1<<9); } + if (HW8_REG(gpio_base + 0xFF8) != AHB_GPIO_CID2) {err_code |= (1<<10); } + if (HW8_REG(gpio_base + 0xFFC) != AHB_GPIO_CID3) {err_code |= (1<<11); } + + puts ("- write ID values (BYTE accesses, byte 1) - should have no effect"); + HW8_REG(gpio_base + 0xFD1) = 0xFF; + HW8_REG(gpio_base + 0xFD5) = 0xFF; + HW8_REG(gpio_base + 0xFD9) = 0xFF; + HW8_REG(gpio_base + 0xFDD) = 0xFF; + HW8_REG(gpio_base + 0xFE1) = 0xFF; + HW8_REG(gpio_base + 0xFE5) = 0xFF; + HW8_REG(gpio_base + 0xFE9) = 0xFF; + HW8_REG(gpio_base + 0xFED) = 0xFF; + HW8_REG(gpio_base + 0xFF1) = 0xFF; + HW8_REG(gpio_base + 0xFF5) = 0xFF; + HW8_REG(gpio_base + 0xFF9) = 0xFF; + HW8_REG(gpio_base + 0xFFD) = 0xFF; + + puts ("- check ID values (BYTE accesses, byte 1)"); + if (HW8_REG(gpio_base + 0xFD1) != 0x00) {err_code |= (1<<12); } + if (HW8_REG(gpio_base + 0xFD5) != 0x00) {err_code |= (1<<13); } + if (HW8_REG(gpio_base + 0xFD9) != 0x00) {err_code |= (1<<14); } + if (HW8_REG(gpio_base + 0xFDD) != 0x00) {err_code |= (1<<15); } + if (HW8_REG(gpio_base + 0xFE1) != 0x00) {err_code |= (1<<16); } + if (HW8_REG(gpio_base + 0xFE5) != 0x00) {err_code |= (1<<17); } + if (HW8_REG(gpio_base + 0xFE9) != 0x00) {err_code |= (1<<18); } + if (HW8_REG(gpio_base + 0xFED) != 0x00) {err_code |= (1<<19); } + if (HW8_REG(gpio_base + 0xFF1) != 0x00) {err_code |= (1<<20); } + if (HW8_REG(gpio_base + 0xFF5) != 0x00) {err_code |= (1<<21); } + if (HW8_REG(gpio_base + 0xFF9) != 0x00) {err_code |= (1<<22); } + if (HW8_REG(gpio_base + 0xFFD) != 0x00) {err_code |= (1<<23); } + + if (err_code != 0) { + printf ("ERROR : initial value failed on byte 0 and 1 accesses (0x%x)\n", err_code); + return_val=1; + err_code = 0; + } + + puts ("- write ID values (BYTE accesses, byte 2) - should have no effect"); + HW8_REG(gpio_base + 0xFD2) = 0xFF; + HW8_REG(gpio_base + 0xFD6) = 0xFF; + HW8_REG(gpio_base + 0xFDA) = 0xFF; + HW8_REG(gpio_base + 0xFDE) = 0xFF; + HW8_REG(gpio_base + 0xFE2) = 0xFF; + HW8_REG(gpio_base + 0xFE6) = 0xFF; + HW8_REG(gpio_base + 0xFEA) = 0xFF; + HW8_REG(gpio_base + 0xFEE) = 0xFF; + HW8_REG(gpio_base + 0xFF2) = 0xFF; + HW8_REG(gpio_base + 0xFF6) = 0xFF; + HW8_REG(gpio_base + 0xFFA) = 0xFF; + HW8_REG(gpio_base + 0xFFE) = 0xFF; + + puts ("- check ID values (BYTE accesses, byte 2)"); + if (HW8_REG(gpio_base + 0xFD2) != 0x00) {err_code |= (1<<0); } + if (HW8_REG(gpio_base + 0xFD6) != 0x00) {err_code |= (1<<1); } + if (HW8_REG(gpio_base + 0xFDA) != 0x00) {err_code |= (1<<2); } + if (HW8_REG(gpio_base + 0xFDE) != 0x00) {err_code |= (1<<3); } + if (HW8_REG(gpio_base + 0xFE2) != 0x00) {err_code |= (1<<4); } + if (HW8_REG(gpio_base + 0xFE6) != 0x00) {err_code |= (1<<5); } + if (HW8_REG(gpio_base + 0xFEA) != 0x00) {err_code |= (1<<6); } + if (HW8_REG(gpio_base + 0xFEE) != 0x00) {err_code |= (1<<7); } + if (HW8_REG(gpio_base + 0xFF2) != 0x00) {err_code |= (1<<8); } + if (HW8_REG(gpio_base + 0xFF6) != 0x00) {err_code |= (1<<9); } + if (HW8_REG(gpio_base + 0xFFA) != 0x00) {err_code |= (1<<10); } + if (HW8_REG(gpio_base + 0xFFE) != 0x00) {err_code |= (1<<11); } + + puts ("- write ID values (BYTE accesses, byte 3) - should have no effect"); + /* test write to PIDs and CIDs - should be ignored */ + HW8_REG(gpio_base + 0xFD3) = 0xFF; + HW8_REG(gpio_base + 0xFD7) = 0xFF; + HW8_REG(gpio_base + 0xFDB) = 0xFF; + HW8_REG(gpio_base + 0xFDF) = 0xFF; + HW8_REG(gpio_base + 0xFE3) = 0xFF; + HW8_REG(gpio_base + 0xFE7) = 0xFF; + HW8_REG(gpio_base + 0xFEB) = 0xFF; + HW8_REG(gpio_base + 0xFEF) = 0xFF; + HW8_REG(gpio_base + 0xFF3) = 0xFF; + HW8_REG(gpio_base + 0xFF7) = 0xFF; + HW8_REG(gpio_base + 0xFFB) = 0xFF; + HW8_REG(gpio_base + 0xFFF) = 0xFF; + + puts ("- check ID values (BYTE accesses, byte 3)"); + if (HW8_REG(gpio_base + 0xFD3) != 0x00) {err_code |= (1<<12); } + if (HW8_REG(gpio_base + 0xFD7) != 0x00) {err_code |= (1<<13); } + if (HW8_REG(gpio_base + 0xFDB) != 0x00) {err_code |= (1<<14); } + if (HW8_REG(gpio_base + 0xFDF) != 0x00) {err_code |= (1<<15); } + if (HW8_REG(gpio_base + 0xFE3) != 0x00) {err_code |= (1<<16); } + if (HW8_REG(gpio_base + 0xFE7) != 0x00) {err_code |= (1<<17); } + if (HW8_REG(gpio_base + 0xFEB) != 0x00) {err_code |= (1<<18); } + if (HW8_REG(gpio_base + 0xFEF) != 0x00) {err_code |= (1<<19); } + if (HW8_REG(gpio_base + 0xFF3) != 0x00) {err_code |= (1<<20); } + if (HW8_REG(gpio_base + 0xFF7) != 0x00) {err_code |= (1<<21); } + if (HW8_REG(gpio_base + 0xFFB) != 0x00) {err_code |= (1<<22); } + if (HW8_REG(gpio_base + 0xFFF) != 0x00) {err_code |= (1<<23); } + + if (err_code != 0) { + printf ("ERROR : initial value failed on byte 2 and 3 accesses (0x%x)\n", err_code); + return_val=1; + err_code = 0; + } + + puts("- read/write"); + + /* Test output enable read/write */ + /* word size */ + CMSDK_GPIO->OUTENABLESET = 0xFFFFFFFF & gpio_outen_mask; + if (CMSDK_GPIO->OUTENABLESET != (0x0000FFFF & gpio_outen_mask)) { err_code |= (1<<0); } + CMSDK_GPIO->OUTENABLECLR = 0xCCAA5500 & gpio_outen_mask; + if (CMSDK_GPIO->OUTENABLESET != (0x0000AAFF & gpio_outen_mask)) { err_code |= (1<<1); } + CMSDK_GPIO->OUTENABLECLR = 0xFFFFFFFF & gpio_outen_mask; + if (CMSDK_GPIO->OUTENABLESET != (0x00000000 & gpio_outen_mask)) { err_code |= (1<<2); } + + /* half word size and byte size */ + HW16_REG(gpio_base + 0x14) = 0xFFFF & gpio_outen_mask; + HW16_REG(gpio_base + 0x10) = 0x3366 & gpio_outen_mask; + if (CMSDK_GPIO->OUTENABLESET != (0x00003366 & gpio_outen_mask)) { err_code |= (1<<3); } + + HW16_REG(gpio_base + 0x12) = 0x9988 & gpio_outen_mask; /* This transfer is ignored */ + if (CMSDK_GPIO->OUTENABLESET != (0x00003366 & gpio_outen_mask)) { err_code |= (1<<4); } + HW16_REG(gpio_base + 0x14) = 0xFFFF & gpio_outen_mask; + HW8_REG( gpio_base + 0x10) = 0x44 & gpio_outen_mask; + HW8_REG( gpio_base + 0x11) = 0x33; + if (HW16_REG(gpio_base + 0x10) != (0x00003344 & gpio_outen_mask)) { err_code |= (1<<5); } + HW16_REG(gpio_base + 0x10) = 0x77EE & gpio_outen_mask; + if (HW8_REG( gpio_base + 0x10) != (0x000000EE & gpio_outen_mask)) { err_code |= (1<<6); } + if (HW8_REG( gpio_base + 0x11) != (0x00000077 & (gpio_outen_mask>>8))) { err_code |= (1<<7); } + + CMSDK_GPIO->OUTENABLESET = 0x0000FFFF & gpio_outen_mask; /* Set all output enabled */ + if (CMSDK_GPIO->OUTENABLESET != (0x0000FFFF & gpio_outen_mask)) { err_code |= (1<<8); } + + /* Now we can test read back data */ + small_delay(); /* required because the DATA readback is delay by double-flop-flop synchronisation */ + if ((CMSDK_GPIO->DATA & gpio_datamask) != (0x0000 & gpio_datamask)) {err_code |= (1<<9); } + if ((HW16_REG( gpio_base + 0x0) & gpio_datamask) != (0x0000 & gpio_datamask)) {err_code |= (1<<10); } + + /* Test byte size write to data register, which in effect change dataout register */ + HW8_REG( gpio_base + 0x0) = 0xFF; + if (CMSDK_GPIO->DATAOUT != 0x00FF) {err_code |= (1<<11); } + small_delay(); /* required because the DATA readback is delay by double-flop-flop synchronisation */ + if ((CMSDK_GPIO->DATA & gpio_datamask) != (0x00FF & gpio_datamask)) {err_code |= (1<<12); } + HW8_REG( gpio_base + 0x1) = 0xFF; + if (CMSDK_GPIO->DATAOUT != 0xFFFF) {err_code |= (1<<13); } + small_delay(); /* required because the DATA readback is delay by double-flop-flop synchronisation */ + if ((CMSDK_GPIO->DATA & gpio_datamask) != (0xFFFF & gpio_datamask)) {err_code |= (1<<14); } + HW8_REG( gpio_base + 0x2) = 0xFF; + if (CMSDK_GPIO->DATAOUT != 0xFFFF) {err_code |= (1<<13); } + small_delay(); /* required because the DATA readback is delay by double-flop-flop synchronisation */ + if ((CMSDK_GPIO->DATA & gpio_datamask) != (0xFFFF & gpio_datamask)) {err_code |= (1<<15); } + HW8_REG( gpio_base + 0x3) = 0xFF; + if (CMSDK_GPIO->DATAOUT != 0xFFFF) {err_code |= (1<<14); } + small_delay(); /* required because the DATA readback is delay by double-flop-flop synchronisation */ + if ((CMSDK_GPIO->DATA & gpio_datamask) != (0xFFFF & gpio_datamask)) {err_code |= (1<<16); } + + CMSDK_GPIO->DATAOUT = 0x1234; + if (CMSDK_GPIO->DATAOUT != 0x1234) {err_code |= (1<<17); } + if (HW8_REG( gpio_base + 0x4) != 0x34) {err_code |= (1<<18); } + if (HW8_REG( gpio_base + 0x5) != 0x12) {err_code |= (1<<19); } + if (HW16_REG(gpio_base + 0x4) != 0x1234) {err_code |= (1<<20); } + if ((CMSDK_GPIO->DATA & gpio_datamask) != (0x1234 & gpio_datamask)) {err_code |= (1<<21); } + if ((HW8_REG( gpio_base + 0x0) & gpio_datamask) != (0x34 & gpio_datamask)) {err_code |= (1<<22); } + if ((HW8_REG( gpio_base + 0x1) & (gpio_datamask>>8)) != (0x12 & (gpio_datamask>>8))) {err_code |= (1<<23); } + if ( HW8_REG( gpio_base + 0x2) != 0x00) {err_code |= (1<<24); } + if ( HW8_REG( gpio_base + 0x3) != 0x00) {err_code |= (1<<25); } + if (HW16_REG( gpio_base + 0x6) != 0x0000) {err_code |= (1<<26); } + + HW16_REG( gpio_base + 0x0) = 0xFFFF; + if (CMSDK_GPIO->DATAOUT != 0xFFFF) {err_code |= (1<<27); } + small_delay(); /* required because the DATA readback is delay by double-flop-flop synchronisation */ + if ((CMSDK_GPIO->DATA & gpio_datamask) != (0xFFFF & gpio_datamask)) {err_code |= (1<<28); } + + HW16_REG( gpio_base + 0x4) = 0x0000; + if (CMSDK_GPIO->DATAOUT != 0x0000) {err_code |= (1<<29); } + small_delay(); /* required because the DATA readback is delay by double-flop-flop synchronisation */ + if ((CMSDK_GPIO->DATA & gpio_datamask) != (0x0000 & gpio_datamask)) {err_code |= (1<<30); } + + CMSDK_GPIO->OUTENABLECLR = 0xFFFFFFFF; /* Disable output */ + + /* Generate return value */ + if (err_code != 0) { + printf ("ERROR : Read/write #1 failed(0x%x)\n", err_code); + return_val=1; + err_code = 0; + } + + small_delay(); + + /* Test ALTFUNC register */ + CMSDK_GPIO->ALTFUNCCLR = 0xFFFF; + if ((CMSDK_GPIO->ALTFUNCSET & gpio_altfunc_mask) != (0x0000 & gpio_altfunc_mask)) {err_code |= (1<<0); } + if ((HW16_REG(gpio_base + 0x18) & gpio_altfunc_mask) != (0x0000 & gpio_altfunc_mask)) {err_code |= (1<<1); } + if ((HW16_REG(gpio_base + 0x1A) ) != (0x0000 )) {err_code |= (1<<2); } + + CMSDK_GPIO->ALTFUNCSET = 0xFFFF; + if ((CMSDK_GPIO->ALTFUNCSET & gpio_altfunc_mask) != (0xFFFF & gpio_altfunc_mask)) {err_code |= (1<<3); } + if ((HW16_REG(gpio_base + 0x18) & gpio_altfunc_mask) != (0xFFFF & gpio_altfunc_mask)) {err_code |= (1<<4); } + if ((HW16_REG(gpio_base + 0x1A) ) != (0x0000 )) {err_code |= (1<<5); } + if ((HW8_REG( gpio_base + 0x18) & gpio_altfunc_mask) != (0xFF & gpio_altfunc_mask)) {err_code |= (1<<6); } + if ((HW8_REG( gpio_base + 0x19) & (gpio_altfunc_mask>>8)) != (0xFF & (gpio_altfunc_mask>>8))) {err_code |= (1<<7); } + + HW16_REG(gpio_base + 0x1C) = 0x996E; + if ((CMSDK_GPIO->ALTFUNCSET & gpio_altfunc_mask) != (0x6691 & gpio_altfunc_mask)) {err_code |= (1<<8); } + HW16_REG(gpio_base + 0x1A) = 0xFFFF; /* ignored */ + if ((HW16_REG(gpio_base + 0x18) & gpio_altfunc_mask) != (0x6691 & gpio_altfunc_mask)) {err_code |= (1<<9); } + if ((HW16_REG(gpio_base + 0x1A) ) != (0x0000 )) {err_code |= (1<<10); } + if ((HW8_REG( gpio_base + 0x18) & gpio_altfunc_mask) != (0x91 & gpio_altfunc_mask)) {err_code |= (1<<11); } + if ((HW8_REG( gpio_base + 0x19) & (gpio_altfunc_mask>>8)) != (0x66 & (gpio_altfunc_mask>>8))) {err_code |= (1<<12); } + HW16_REG(gpio_base + 0x1C) = 0xFFFF; + HW8_REG(gpio_base + 0x18) = 0x45; + HW8_REG(gpio_base + 0x19) = 0x23; + HW8_REG(gpio_base + 0x1A) = 0x77; + HW8_REG(gpio_base + 0x1B) = 0x77; + if ((CMSDK_GPIO->ALTFUNCSET & gpio_altfunc_mask) != (0x2345 & gpio_altfunc_mask)) {err_code |= (1<<13); } + if ((HW8_REG( gpio_base + 0x18) & gpio_altfunc_mask) != (0x45 & gpio_altfunc_mask)) {err_code |= (1<<14); } + if ((HW8_REG( gpio_base + 0x19) & (gpio_altfunc_mask>>8)) != (0x23 & (gpio_altfunc_mask>>8))) {err_code |= (1<<15); } + + CMSDK_GPIO->ALTFUNCSET = 0x5488; + CMSDK_GPIO->ALTFUNCCLR = 0x2201; + if ((CMSDK_GPIO->ALTFUNCSET & gpio_altfunc_mask) != (0x55CC & gpio_altfunc_mask)) {err_code |= (1<<16); } + CMSDK_GPIO->ALTFUNCCLR = 0x00CC; + CMSDK_GPIO->ALTFUNCSET = 0xAA33; + if ((CMSDK_GPIO->ALTFUNCSET & gpio_altfunc_mask) != (0xFF33 & gpio_altfunc_mask)) {err_code |= (1<<17); } + CMSDK_GPIO->ALTFUNCCLR = 0xFFFF; + CMSDK_GPIO->ALTFUNCSET = saved_altfunc; /* Restore ALTFUNC */ + + if (err_code != 0) { + printf ("ERROR : Read/write #2 failed(0x%x)\n", err_code); + return_val=1; + err_code = 0; + } + + // Write to every location + + /* Test INTEN register read/write - offset 0x20 */ + CMSDK_GPIO->INTENSET = 0x00FF; + if ((CMSDK_GPIO->INTENSET) != 0x00FF){err_code |= (1<<0); } + if ( HW8_REG(gpio_base + 0x20)!= 0xFF ){err_code |= (1<<1); } + if ( HW8_REG(gpio_base + 0x21)!= 0x00 ){err_code |= (1<<2); } + if (HW16_REG(gpio_base + 0x22)!= 0x0000){err_code |= (1<<3); } + CMSDK_GPIO->INTENSET = 0xFF00; + CMSDK_GPIO->INTENCLR = 0x00FF; + if ((CMSDK_GPIO->INTENSET) != 0xFF00){err_code |= (1<<4); } + if (HW16_REG(gpio_base + 0x20)!= 0xFF00){err_code |= (1<<5); } + if ( HW8_REG(gpio_base + 0x20)!= 0x00 ){err_code |= (1<<6); } + if ( HW8_REG(gpio_base + 0x21)!= 0xFF ){err_code |= (1<<7); } + + CMSDK_GPIO->INTENCLR = 0x5500; + CMSDK_GPIO->INTENSET = 0x0055; + if ((CMSDK_GPIO->INTENSET) != 0xAA55) {err_code |= (1<<8); } + CMSDK_GPIO->INTENCLR = 0xFFFF; + CMSDK_GPIO->INTENSET = 0x33BB; + if ((CMSDK_GPIO->INTENSET) != 0x33BB) {err_code |= (1<<9); } + HW8_REG(gpio_base + 0x20) = 0x44; + HW8_REG(gpio_base + 0x24) = 0xBA; + HW8_REG(gpio_base + 0x25) = 0x10; + HW8_REG(gpio_base + 0x26) = 0x99; + HW8_REG(gpio_base + 0x27) = 0x99; + if ((CMSDK_GPIO->INTENSET) != 0x2345) {err_code |= (1<<10); } + HW16_REG(gpio_base + 0x20) = 0x5892; + HW16_REG(gpio_base + 0x22) = 0x1111; + HW16_REG(gpio_base + 0x24) = 0x0240; + if ((CMSDK_GPIO->INTENSET) != 0x7997) {err_code |= (1<<11); } + + CMSDK_GPIO->INTENCLR = 0xFFFF; + if ((CMSDK_GPIO->INTENSET) != 0x0000) {err_code |= (1<<12); } + + /* Test INTTYPE register read/write - offset 0x14 */ + CMSDK_GPIO->INTTYPESET = 0x3A6B; + if ((CMSDK_GPIO->INTTYPESET) != 0x3A6B) {err_code |= (1<<19); } + if ( HW8_REG(gpio_base + 0x28)!= 0x6B ){err_code |= (1<<20); } + if ( HW8_REG(gpio_base + 0x29)!= 0x3A ){err_code |= (1<<21); } + if ( HW8_REG(gpio_base + 0x2A)!= 0x00 ){err_code |= (1<<22); } + if ( HW8_REG(gpio_base + 0x2B)!= 0x00 ){err_code |= (1<<23); } + + HW16_REG(gpio_base + 0x2C) = 0xFFFF; + HW8_REG(gpio_base + 0x28) = 0x7C; + HW8_REG(gpio_base + 0x29) = 0x4B; + if ((CMSDK_GPIO->INTTYPESET) != 0x4B7C) {err_code |= (1<<24); } + if (HW16_REG(gpio_base + 0x28)!= 0x4B7C ){err_code |= (1<<25); } + + HW16_REG(gpio_base + 0x2C) = 0x4964; + HW16_REG(gpio_base + 0x28) = 0x8001; + HW16_REG(gpio_base + 0x2A) = 0xFFFF; + if ((CMSDK_GPIO->INTTYPESET) != 0x8219) {err_code |= (1<<26); } + CMSDK_GPIO->INTTYPESET = 0xFFFF; + if ((CMSDK_GPIO->INTTYPESET) != 0xFFFF) {err_code |= (1<<27); } + CMSDK_GPIO->INTTYPECLR = 0xFFFF; + if ((CMSDK_GPIO->INTTYPESET) != 0x0000) {err_code |= (1<<28); } + + /* Generate return value */ + if (err_code != 0) { + printf ("ERROR : Read/write #3 failed(0x%x)\n", err_code); + return_val=1; + err_code = 0; + } + + + /* Test INTPOL register read/write - offset 0x18 */ + CMSDK_GPIO->INTPOLSET = 0x3B6A; + if ((CMSDK_GPIO->INTPOLSET) != 0x3B6A) {err_code |= (1<<0); } + if ( HW8_REG(gpio_base + 0x30)!= 0x6A ){err_code |= (1<<1); } + if ( HW8_REG(gpio_base + 0x31)!= 0x3B ){err_code |= (1<<2); } + if ( HW8_REG(gpio_base + 0x32)!= 0x00 ){err_code |= (1<<3); } + if ( HW8_REG(gpio_base + 0x33)!= 0x00 ){err_code |= (1<<4); } + if (HW16_REG(gpio_base + 0x30)!= 0x3B6A){err_code |= (1<<5); } + HW16_REG(gpio_base + 0x34) = 0xFFFF; + HW16_REG(gpio_base + 0x30) = 0x4B7C; + if ((CMSDK_GPIO->INTPOLSET) != 0x4B7C) {err_code |= (1<<6); } + HW16_REG(gpio_base + 0x32)= 0x3333; + if ((CMSDK_GPIO->INTPOLSET) != 0x4B7C) {err_code |= (1<<7); } + HW8_REG( gpio_base + 0x34) = 0xFF; + HW8_REG( gpio_base + 0x30) = 0x95; + if ((CMSDK_GPIO->INTPOLSET) != 0x4B95) {err_code |= (1<<8); } + HW8_REG( gpio_base + 0x35) = 0xFF; + HW8_REG( gpio_base + 0x31) = 0x32; + if ((CMSDK_GPIO->INTPOLSET) != 0x3295) {err_code |= (1<<9); } + HW16_REG(gpio_base + 0x36)= 0xFFFF; + HW8_REG( gpio_base + 0x32) = 0x66; + HW8_REG( gpio_base + 0x33) = 0x66; + if ((CMSDK_GPIO->INTPOLSET) != 0x3295) {err_code |= (1<<10); } + HW16_REG(gpio_base + 0x34)= 0xFFFF; + CMSDK_GPIO->INTPOLSET = 0x8219; + if (HW16_REG(gpio_base + 0x30) != 0x8219) {err_code |= (1<<11); } + CMSDK_GPIO->INTPOLSET = 0xFFFF; + if ((CMSDK_GPIO->INTPOLSET) != 0xFFFF) {err_code |= (1<<12); } + CMSDK_GPIO->INTPOLCLR = 0xFFFF; + if ((CMSDK_GPIO->INTPOLSET) != 0x0000) {err_code |= (1<<13); } + + /* Generate return value */ + if (err_code != 0) { + printf ("ERROR : Read/write #4 failed(0x%x)\n", err_code); + return_val=1; + err_code = 0; + } + puts("- INTSTATUS/INTCLEAR r/w"); + + /* Test INTSTATUS/INTCLEAR register read/write - offset 0x1C */ + /* It was not set because when INTEN was high, input was high, but INTPOL was low (low level trigger) */ + if ((CMSDK_GPIO->INTSTATUS) != 0x0000) {err_code |= (1<<0); } + if ( HW8_REG(gpio_base + 0x38)!= 0x00 ){err_code |= (1<<1); } + if ( HW8_REG(gpio_base + 0x39)!= 0x00 ){err_code |= (1<<2); } + if ( HW8_REG(gpio_base + 0x3A)!= 0x00 ){err_code |= (1<<3); } + if ( HW8_REG(gpio_base + 0x3B)!= 0x00 ){err_code |= (1<<4); } + if (HW16_REG(gpio_base + 0x38)!= 0x0000){err_code |= (1<<5); } + + /* Now we need to force INTSTATUS to 0xFFFF */ + CMSDK_GPIO->INTENSET = 0xFFFF; + CMSDK_GPIO->INTPOLSET= 0xFFFF; + /* It set INTSTATUS to 0xFFFF because INTEN was set, DATA input was pulled up and INTPOL was 0xFFFF */ + + /* Disable interrupt from generating continuously */ + CMSDK_GPIO->INTENCLR = 0xFFFF; + CMSDK_GPIO->INTPOLCLR= 0xFFFF; + + /* Test clearing of INTSTATUS */ + if ((CMSDK_GPIO->INTSTATUS & gpio_datamask) != (0xFFFF & gpio_datamask)) {err_code |= (1<<6); } + if (( HW8_REG(gpio_base + 0x38) & gpio_datamask )!= (0xFF & gpio_datamask) ) {err_code |= (1<<7); } + if (( HW8_REG(gpio_base + 0x39) & gpio_datamask )!= (0xFF & gpio_datamask) ) {err_code |= (1<<8); } + if (( HW8_REG(gpio_base + 0x3A) & gpio_datamask )!= (0x00 & gpio_datamask) ) {err_code |= (1<<9); } + if (( HW8_REG(gpio_base + 0x3B) & gpio_datamask )!= (0x00 & gpio_datamask) ) {err_code |= (1<<10); } + if ((HW16_REG(gpio_base + 0x38) & gpio_datamask )!= (0xFFFF & gpio_datamask) ) {err_code |= (1<<11); } + if ((HW16_REG(gpio_base + 0x3A) & gpio_datamask )!= (0x0000 & gpio_datamask) ) {err_code |= (1<<12); } + + CMSDK_GPIO->INTCLEAR = 0x0000; + if ((CMSDK_GPIO->INTSTATUS & gpio_datamask) != (0xFFFF & gpio_datamask)) {err_code |= (1<<13); } + + CMSDK_GPIO->INTCLEAR = 0x0001; + if ((CMSDK_GPIO->INTSTATUS & gpio_datamask) != (0xFFFE & gpio_datamask)) {err_code |= (1<<14); } + if (( HW8_REG(gpio_base + 0x38) & gpio_datamask )!= (0xFE & gpio_datamask) ) {err_code |= (1<<15); } + if (( HW8_REG(gpio_base + 0x39) & gpio_datamask )!= (0xFF & gpio_datamask) ) {err_code |= (1<<16); } + + HW16_REG(gpio_base + 0x38) = 0x0002; + if ((CMSDK_GPIO->INTSTATUS & gpio_datamask) != (0xFFFC & gpio_datamask)) {err_code |= (1<<17); } + HW16_REG(gpio_base + 0x38) = 0x0004; + if ((CMSDK_GPIO->INTSTATUS & gpio_datamask) != (0xFFF8 & gpio_datamask)) {err_code |= (1<<18); } + HW8_REG(gpio_base + 0x38) = 0x0008; + if ((CMSDK_GPIO->INTSTATUS & gpio_datamask) != (0xFFF0 & gpio_datamask)) {err_code |= (1<<19); } + HW8_REG(gpio_base + 0x39) = 0x0001; + if ((CMSDK_GPIO->INTSTATUS & gpio_datamask) != (0xFEF0 & gpio_datamask)) {err_code |= (1<<20); } + if ((HW16_REG(gpio_base + 0x38) & gpio_datamask )!= (0xFEF0 & gpio_datamask) ) {err_code |= (1<<21); } + CMSDK_GPIO->INTCLEAR = 0x000E; /* Clear a bit that is already cleared has no effect */ + if ((HW16_REG(gpio_base + 0x38) & gpio_datamask )!= (0xFEF0 & gpio_datamask) ) {err_code |= (1<<22); } + HW8_REG(gpio_base + 0x3A) = 0x000F; /* ignored */ + if ((CMSDK_GPIO->INTSTATUS & gpio_datamask) != (0xFEF0 & gpio_datamask)) {err_code |= (1<<23); } + HW16_REG(gpio_base + 0x3A) = 0xFFFF; /* ignored */ + if ((CMSDK_GPIO->INTSTATUS & gpio_datamask) != (0xFEF0 & gpio_datamask)) {err_code |= (1<<24); } + CMSDK_GPIO->INTCLEAR = 0x3330; + if ((CMSDK_GPIO->INTSTATUS & gpio_datamask) != (0xCCC0 & gpio_datamask)) {err_code |= (1<<25); } + CMSDK_GPIO->INTCLEAR = 0xCCC0; + if ((CMSDK_GPIO->INTSTATUS & gpio_datamask) != (0x0000 & gpio_datamask)) {err_code |= (1<<26); } + + /* Generate return value */ + if (err_code != 0) { + printf ("ERROR : INTSTATUS/INTCLEAR r/w failed (0x%x)\n", err_code); + return_val=1; + err_code = 0; + } + + /* Clean up */ + CMSDK_GPIO->OUTENABLECLR = 0xFFFFFFFF; + CMSDK_GPIO->INTENCLR = 0xFFFFFFFF; + CMSDK_GPIO->INTPOLCLR = 0xFFFFFFFF; + CMSDK_GPIO->INTCLEAR = 0x0000FFFF; + gpio0_irq_occurred = 0; + gpio1_irq_occurred = 0; + gpio0_irq_expected = 0; + gpio1_irq_expected = 0; + + /* Test whether the PORT0_0_IRQn is available */ + /* Note : GPIO Interrupt is pended in previous test stage */ + __disable_irq(); /* Use setting of Interrupt enable to detect if + we have 32 interrupts, but we don't want the exact interrupt to + take place, so we disable interrupt using PRIMASK during this checking */ + NVIC_EnableIRQ(PORT0_15_IRQn); + if ((NVIC->ISER[0] & 0x80000000U)==0) { + /* Number of IRQ less than 32, skip individual IRQ test */ + puts("Less then 32 IRQ in design\n"); + test_individual_irq = 0; + } + NVIC_DisableIRQ(PORT0_15_IRQn); + __enable_irq(); + + + /* Check and Clear interrupt pending status in NVIC */ + if (CMSDK_GPIO==CMSDK_GPIO0) { + + if (test_individual_irq == 1) { + for (i=0;i<16;i++){ + if (NVIC_GetPendingIRQ(((IRQn_Type)(((int)PORT0_0_IRQn) + i))) == 0) { /* Should have been set */ + err_code = err_code | (1<<i); + } + NVIC_ClearPendingIRQ(((IRQn_Type)(((int)PORT0_0_IRQn) + i))); + } + } + if (NVIC_GetPendingIRQ(PORT0_ALL_IRQn) == 0) {/* Should have been set */ + err_code = err_code | (1<<16); + } + } + + if (CMSDK_GPIO==CMSDK_GPIO1) { + if (NVIC_GetPendingIRQ(PORT1_ALL_IRQn) == 0) {/* Should have been set */ + err_code = err_code | (1<<17); + } + } + + NVIC_ClearPendingIRQ(PORT0_ALL_IRQn); + NVIC_ClearPendingIRQ(PORT1_ALL_IRQn); + + /* Generate return value */ + if (err_code != 0) { + printf ("ERROR : IRQ pending failed (0x%x)\n", err_code); + return_val =1; + err_code = 0; + } + else puts("Register Read/Write Test Passed"); + + return(return_val); +} + +/* --------------------------------------------------------------- */ +/* GPIO Unused Addresses access tests */ +/* --------------------------------------------------------------- */ +/* Test just one address - should read 0, write should be ignored */ +int gpio_unused_addresses_test_single(unsigned int address) +{ + if (HW32_REG(address) != 0) return (1); + HW32_REG(address) = 0xFFFFFFFF; + if (HW32_REG(address) != 0) return (1); + else return (0); +} + +/* Test unused address in GPIO */ +int gpio_unused_addresses_test(CMSDK_GPIO_TypeDef *CMSDK_GPIO){ + int return_val=0; + unsigned int err_code=0; + + unsigned int gpio_base; + + puts("GPIO Unused address test"); + + if (CMSDK_GPIO==CMSDK_GPIO0) { + gpio_base = CMSDK_GPIO0_BASE; + } + else if (CMSDK_GPIO==CMSDK_GPIO1) { + gpio_base = CMSDK_GPIO1_BASE; + } + else { + puts ("ERROR: Input parameter invalid in function 'gpio_unused_addresses_test'."); + return 1; + } + + if (gpio_unused_addresses_test_single(gpio_base + 0x008)) err_code |= 1 << 0; + if (gpio_unused_addresses_test_single(gpio_base + 0x00C)) err_code |= 1 << 1; + if (gpio_unused_addresses_test_single(gpio_base + 0x03C)) err_code |= 1 << 2; + if (gpio_unused_addresses_test_single(gpio_base + 0x040)) err_code |= 1 << 3; + if (gpio_unused_addresses_test_single(gpio_base + 0x3FC)) err_code |= 1 << 4; + if (gpio_unused_addresses_test_single(gpio_base + 0xC00)) err_code |= 1 << 5; + if (gpio_unused_addresses_test_single(gpio_base + 0xD00)) err_code |= 1 << 6; + if (gpio_unused_addresses_test_single(gpio_base + 0xE00)) err_code |= 1 << 7; + if (gpio_unused_addresses_test_single(gpio_base + 0xF00)) err_code |= 1 << 8; + if (gpio_unused_addresses_test_single(gpio_base + 0xFC0)) err_code |= 1 << 9; + if (gpio_unused_addresses_test_single(gpio_base + 0xFC4)) err_code |= 1 << 10; + if (gpio_unused_addresses_test_single(gpio_base + 0xFC8)) err_code |= 1 << 11; + if (gpio_unused_addresses_test_single(gpio_base + 0xFCC)) err_code |= 1 << 12; + + + /* Generate return value */ + if (err_code != 0) { + printf ("ERROR : Unused addresses failed (0x%x)\n", err_code); + return_val =1; + err_code = 0; + } + else puts("- Unused addresses Test Passed"); + + return(return_val); +} + +/* --------------------------------------------------------------- */ +/* GPIO interrupt tests */ +/* --------------------------------------------------------------- */ + +int gpio_interrupt_test(CMSDK_GPIO_TypeDef *CMSDK_GPIO){ + int return_val=0; + int err_code=0; + int i; /* loop variable */ + int irq_num; /* loop variable */ + unsigned int irq_mask; /* one hot bit mask for IRQ being tested in the loop */ + + unsigned int gpio_datamask; /* Data bit mask */ + int test_individual_irq = 1; /* Test individual IRQ in GPIO #0 by default */ + + if (CMSDK_GPIO==CMSDK_GPIO0) { + /* GPIO #0 is not shared in example system */ + gpio_datamask = 0xFFFFFFFF; /* All bit can be tested */ + } + else if (CMSDK_GPIO==CMSDK_GPIO1) { + /* GPIO #1 is shared with peripherals in example system */ + /* bit 5 is used by stdout */ + gpio_datamask = ~((1<<5)|(1<<4)|(1<<2)|(1<<0)); /* skip testing for these bits */ + } + else { + puts ("ERROR: Input parameter invalid in function 'gpio_interrupt_test'."); + return 1; + } + + for (i=0;i<16;i++){ + gpio0_irq_flags[i]=0; + } + puts("GPIO interrupt test"); + + /* Check interrupt configurations */ + if (CMSDK_GPIO==CMSDK_GPIO0) { + NVIC_EnableIRQ(PORT0_ALL_IRQn); + if ((NVIC->ISER[0] & (1<<(PORT0_ALL_IRQn)))==0) { + puts("Interrupt PORT0_ALL_IRQn not available."); + return_val =1; + } + NVIC_DisableIRQ(PORT0_ALL_IRQn); + } + if (CMSDK_GPIO==CMSDK_GPIO1) { + NVIC_EnableIRQ(PORT1_ALL_IRQn); + if ((NVIC->ISER[0] & (1<<(PORT1_ALL_IRQn)))==0) { + puts("Interrupt PORT1_ALL_IRQn not available."); + return_val =1; + } + NVIC_DisableIRQ(PORT1_ALL_IRQn); + } + NVIC_EnableIRQ(PORT0_15_IRQn); + if ((NVIC->ISER[0] & 0x80000000U)==0) { + /* Number of IRQ less than 32, skip individual IRQ test */ + puts("Less then 32 IRQ in design\n"); + test_individual_irq = 0; + } + NVIC_DisableIRQ(PORT0_15_IRQn); + + /* Start test loop */ + for (irq_num = 0 ; irq_num <16; irq_num ++) { + if (((gpio_datamask>>irq_num) & 0x1)!=0) { + /* test required */ + + CMSDK_GPIO->INTENCLR = 0xFFFFFFFF; + CMSDK_GPIO->INTPOLCLR = 0xFFFFFFFF; + CMSDK_GPIO->INTTYPECLR = 0xFFFFFFFF; + CMSDK_GPIO->INTCLEAR = 0x0000FFFF; + CMSDK_GPIO->OUTENABLECLR = 0xFFFFFFFF; + gpio0_irq_occurred = 0; + gpio1_irq_occurred = 0; + gpio0_irq_expected = 0; + gpio1_irq_expected = 0; + gpio0_irq_level_irq = 1; + gpio1_irq_level_irq = 1; + multi_irq_test = 0; + /* ------------------------------ */ + /* Active low interrupt */ + /* ------------------------------ */ + CMSDK_GPIO->DATAOUT = 0xFFFFFFFF; /* Inactive */ + CMSDK_GPIO->INTTYPECLR = 0xFFFFFFFF; /* Low level */ + CMSDK_GPIO->INTPOLCLR = 0xFFFFFFFF; /* Low level */ + irq_mask = 1<<irq_num; + CMSDK_GPIO->OUTENABLESET = irq_mask; + if (CMSDK_GPIO==CMSDK_GPIO0) { + gpio0_irq_expected = irq_mask; + NVIC_EnableIRQ(PORT0_ALL_IRQn); + } + if (CMSDK_GPIO==CMSDK_GPIO1) { + gpio1_irq_expected = irq_mask; + NVIC_EnableIRQ(PORT1_ALL_IRQn); + } + /* -- interrupt enable -- */ + gpio0_irq_level_irq = 1; + CMSDK_GPIO->INTENSET = irq_mask; + //medium_delay(); + if (CMSDK_GPIO==CMSDK_GPIO0) { + /* Should not trigger IRQ yet because signal is high */ + if (gpio0_irq_occurred!=0) { err_code |= (1<<0);} + /* Trigger combined IRQ now */ + CMSDK_GPIO->DATAOUT = ~irq_mask; /* active */ + medium_delay(); + if (gpio0_irq_occurred==0) { err_code |= (1<<1);} + } + if (CMSDK_GPIO==CMSDK_GPIO1) { + /* Should not trigger IRQ yet because signal is high */ + if (gpio1_irq_occurred!=0) { err_code |= (1<<0);} + /* Trigger combined IRQ now */ + CMSDK_GPIO->DATAOUT = ~irq_mask; /* active */ + medium_delay(); + if (gpio1_irq_occurred==0) { err_code |= (1<<1);} + } + /* -- interrupt disable -- */ + CMSDK_GPIO->INTENCLR = 0xFFFFFFFF; + gpio0_irq_expected = 0; + gpio1_irq_expected = 0; + gpio0_irq_occurred = 0; + gpio1_irq_occurred = 0; + if (CMSDK_GPIO==CMSDK_GPIO0) { + CMSDK_GPIO->DATAOUT = ~irq_mask; /* active */ + medium_delay(); + if (gpio0_irq_occurred!=0) { err_code |= (1<<2);} + CMSDK_GPIO->DATAOUT = 0xFFFFFFFF; /* Inactive */ + medium_delay(); + if (CMSDK_GPIO->INTSTATUS!=0){ err_code |= (1<<3);} + } + if (CMSDK_GPIO==CMSDK_GPIO1) { + CMSDK_GPIO->DATAOUT = ~irq_mask; /* active */ + medium_delay(); + if (gpio1_irq_occurred!=0) { err_code |= (1<<2);} + CMSDK_GPIO->DATAOUT = 0xFFFFFFFF; /* Inactive */ + medium_delay(); + if (CMSDK_GPIO->INTSTATUS!=0){ err_code |= (1<<3);} + } + + /* -- separated irq -- */ + if ((CMSDK_GPIO==CMSDK_GPIO0) && (test_individual_irq!=0)) { + gpio0_irq_flags[irq_num]=0; + NVIC_DisableIRQ(PORT0_ALL_IRQn); + NVIC_ClearPendingIRQ(((IRQn_Type)(((int)PORT0_0_IRQn) + irq_num))); + NVIC_EnableIRQ(((IRQn_Type)(((int)PORT0_0_IRQn) + irq_num))); + gpio0_irq_expected = irq_mask; + gpio0_irq_level_irq = 1; + CMSDK_GPIO->INTENSET = irq_mask; + CMSDK_GPIO->DATAOUT = ~irq_mask; /* active */ + medium_delay(); + if (gpio0_irq_occurred==0) { err_code |= (1<<4);} + if (gpio0_irq_flags[irq_num]==0) { err_code |= (1<<5);} + CMSDK_GPIO->DATAOUT = 0xFFFFFFFF; /* Inactive */ + + /* Clean up */ + NVIC_ClearPendingIRQ(PORT0_ALL_IRQn); + + NVIC_DisableIRQ(((IRQn_Type)(((int)PORT0_0_IRQn) + irq_num))); + gpio0_irq_flags[irq_num]= 0; + gpio0_irq_expected = 0; + gpio0_irq_occurred = 0; + } + + /* -- multiple irq -- */ + if (CMSDK_GPIO==CMSDK_GPIO0) { + gpio0_irq_expected = irq_mask; + gpio0_irq_occurred = 0; + NVIC_EnableIRQ(PORT0_ALL_IRQn); + } + if (CMSDK_GPIO==CMSDK_GPIO1) { + gpio1_irq_expected = irq_mask; + gpio1_irq_occurred = 0; + NVIC_EnableIRQ(PORT1_ALL_IRQn); + } + multi_irq_test = 3; /* IRQ trigger 3 times */ + CMSDK_GPIO->INTENSET = irq_mask; + CMSDK_GPIO->DATAOUT = ~irq_mask; /* active */ + medium_delay(); + if (CMSDK_GPIO==CMSDK_GPIO0) { + if (gpio0_irq_occurred!=3) { err_code |= (1<<6);} + } + if (CMSDK_GPIO==CMSDK_GPIO1) { + if (gpio1_irq_occurred!=3) { err_code |= (1<<6);} + } + CMSDK_GPIO->DATAOUT = 0xFFFFFFFF; /* Inactive */ + CMSDK_GPIO->INTENCLR = 0xFFFFFFFF; /* Disable */ + multi_irq_test = 0; /* Disable multiple IRQ test */ + /* ------------------------------ */ + /* Active high interrupt */ + /* ------------------------------ */ + CMSDK_GPIO->INTPOLSET = irq_mask; /* High level */ + CMSDK_GPIO->DATAOUT = 0x00000000; /* Inactive */ + if (CMSDK_GPIO==CMSDK_GPIO0) { + gpio0_irq_expected = irq_mask; + gpio0_irq_occurred = 0; + } + + if (CMSDK_GPIO==CMSDK_GPIO1) { + gpio1_irq_expected = irq_mask; + gpio1_irq_occurred = 0; + } + /* -- interrupt enable -- */ + CMSDK_GPIO->INTENSET = irq_mask; /* Enable */ + if (CMSDK_GPIO==CMSDK_GPIO0) { + /* Should not trigger IRQ yet because signal is low */ + if (gpio0_irq_occurred!=0) { err_code |= (1<<7);} + /* Trigger combined IRQ now */ + CMSDK_GPIO->DATAOUT = irq_mask; /* active */ + medium_delay(); + if (gpio0_irq_occurred==0) { err_code |= (1<<8);} + } + if (CMSDK_GPIO==CMSDK_GPIO1) { + /* Should not trigger IRQ yet because signal is low */ + if (gpio1_irq_occurred!=0) { err_code |= (1<<7);} + /* Trigger combined IRQ now */ + CMSDK_GPIO->DATAOUT = irq_mask; /* active */ + medium_delay(); + if (gpio1_irq_occurred==0) { err_code |= (1<<8);} + } + + /* -- interrupt disable -- */ + CMSDK_GPIO->INTENCLR = 0xFFFFFFFF; + gpio0_irq_expected = 0; + gpio1_irq_expected = 0; + gpio0_irq_occurred = 0; + gpio1_irq_occurred = 0; + if (CMSDK_GPIO==CMSDK_GPIO0) { + CMSDK_GPIO->DATAOUT = irq_mask; /* active */ + medium_delay(); + if (gpio0_irq_occurred!=0) { err_code |= (1<<9);} + CMSDK_GPIO->DATAOUT = 0x00000000; /* Inactive */ + medium_delay(); + if (CMSDK_GPIO->INTSTATUS!=0){ err_code |= (1<<10);} + } + + if (CMSDK_GPIO==CMSDK_GPIO1) { + CMSDK_GPIO->DATAOUT = irq_mask; /* active */ + medium_delay(); + if (gpio1_irq_occurred!=0) { err_code |= (1<<9);} + CMSDK_GPIO->DATAOUT = 0x00000000; /* Inactive */ + medium_delay(); + if (CMSDK_GPIO->INTSTATUS!=0){ err_code |= (1<<10);} + } + + /* -- separated irq -- */ + if ((CMSDK_GPIO==CMSDK_GPIO0) && (test_individual_irq!=0)) { + gpio0_irq_flags[irq_num]=0; + NVIC_DisableIRQ(PORT0_ALL_IRQn); + NVIC_ClearPendingIRQ(((IRQn_Type)(((int)PORT0_0_IRQn) + irq_num))); + NVIC_EnableIRQ(((IRQn_Type)(((int)PORT0_0_IRQn) + irq_num))); + gpio0_irq_expected = irq_mask; + gpio0_irq_level_irq = 1; + CMSDK_GPIO->INTENSET = irq_mask; + CMSDK_GPIO->DATAOUT = irq_mask; /* active */ + medium_delay(); + if (gpio0_irq_occurred==0) { err_code |= (1<<11);} + if (gpio0_irq_flags[irq_num]==0) { err_code |= (1<<12);} + CMSDK_GPIO->DATAOUT = 0x0; /* Inactive */ + /* Clean up */ + NVIC_ClearPendingIRQ(PORT0_ALL_IRQn); + NVIC_DisableIRQ(((IRQn_Type)(((int)PORT0_0_IRQn) + irq_num))); + gpio0_irq_flags[irq_num]= 0; + gpio0_irq_expected = 0; + gpio0_irq_occurred = 0; + } + /* -- multiple irq -- */ + if (CMSDK_GPIO==CMSDK_GPIO0) { + gpio0_irq_expected = irq_mask; + gpio0_irq_occurred = 0; + NVIC_EnableIRQ(PORT0_ALL_IRQn); + } + if (CMSDK_GPIO==CMSDK_GPIO1) { + gpio1_irq_expected = irq_mask; + gpio1_irq_occurred = 0; + NVIC_EnableIRQ(PORT1_ALL_IRQn); + } + multi_irq_test = 3; /* IRQ trigger 3 times */ + CMSDK_GPIO->INTENSET = irq_mask; + CMSDK_GPIO->DATAOUT = irq_mask; /* active */ + medium_delay(); + if (CMSDK_GPIO==CMSDK_GPIO0) { + if (gpio0_irq_occurred!=3) { err_code |= (1<<13);} + } + if (CMSDK_GPIO==CMSDK_GPIO1) { + if (gpio1_irq_occurred!=3) { err_code |= (1<<13);} + } + CMSDK_GPIO->DATAOUT = 0x00000000; /* Inactive */ + CMSDK_GPIO->INTENCLR = 0xFFFFFFFF; /* Disable */ + multi_irq_test = 0; /* Disable multiple IRQ test */ + /* ------------------------------ */ + /* Active rising edge interrupt */ + /* ------------------------------ */ + + CMSDK_GPIO->INTPOLSET = irq_mask; /* Rising edge */ + CMSDK_GPIO->INTTYPESET = irq_mask; /* Rising edge */ + CMSDK_GPIO->DATAOUT = 0x00000000; /* Inactive */ + if (CMSDK_GPIO==CMSDK_GPIO0) { + gpio0_irq_expected = irq_mask; + gpio0_irq_occurred = 0; + gpio0_irq_level_irq = 0; + } + if (CMSDK_GPIO==CMSDK_GPIO1) { + gpio1_irq_expected = irq_mask; + gpio1_irq_occurred = 0; + gpio1_irq_level_irq = 0; + } + /* -- interrupt enable -- */ + CMSDK_GPIO->INTENSET = irq_mask; /* Enable */ + if (CMSDK_GPIO==CMSDK_GPIO0) { + /* Should not trigger IRQ yet because signal is low */ + if (gpio0_irq_occurred!=0) { err_code |= (1<<14);} + /* Trigger combined IRQ now */ + CMSDK_GPIO->DATAOUT = irq_mask; /* active */ + medium_delay(); + if (gpio0_irq_occurred==0) { err_code |= (1<<15);} + gpio0_irq_occurred = 0; + CMSDK_GPIO->DATAOUT = 0x00000000; /* falling edge, should not trigger */ + medium_delay(); + if (gpio0_irq_occurred!=0) { err_code |= (1<<16);} + + } + if (CMSDK_GPIO==CMSDK_GPIO1) { + /* Should not trigger IRQ yet because signal is low */ + if (gpio1_irq_occurred!=0) { err_code |= (1<<14);} + /* Trigger combined IRQ now */ + CMSDK_GPIO->DATAOUT = irq_mask; /* active */ + medium_delay(); + if (gpio1_irq_occurred==0) { err_code |= (1<<15);} + gpio1_irq_occurred = 0; + CMSDK_GPIO->DATAOUT = 0x00000000; /* falling edge, should not trigger */ + medium_delay(); + if (gpio1_irq_occurred!=0) { err_code |= (1<<16);} + } + /* -- interrupt disable -- */ + CMSDK_GPIO->INTENCLR = 0xFFFFFFFF; /* Disable */ + if (CMSDK_GPIO==CMSDK_GPIO0) { + gpio0_irq_occurred = 0; + /* Should not trigger IRQ yet because signal is low */ + if (gpio0_irq_occurred!=0) { err_code |= (1<<17);} + /* Rising edge - but IRQ is disabled */ + CMSDK_GPIO->DATAOUT = irq_mask; /* active */ + medium_delay(); + if (gpio0_irq_occurred!=0) { err_code |= (1<<18);} + gpio0_irq_occurred = 0; + CMSDK_GPIO->DATAOUT = 0x00000000; /* falling edge, should not trigger */ + medium_delay(); + if (gpio0_irq_occurred!=0) { err_code |= (1<<19);} + + } + if (CMSDK_GPIO==CMSDK_GPIO1) { + gpio1_irq_occurred = 0; + /* Should not trigger IRQ yet because signal is low */ + if (gpio1_irq_occurred!=0) { err_code |= (1<<17);} + /* Rising edge - but IRQ is disabled */ + CMSDK_GPIO->DATAOUT = irq_mask; /* active */ + medium_delay(); + if (gpio1_irq_occurred!=0) { err_code |= (1<<18);} + gpio1_irq_occurred = 0; + CMSDK_GPIO->DATAOUT = 0x00000000; /* falling edge, should not trigger */ + medium_delay(); + if (gpio1_irq_occurred!=0) { err_code |= (1<<19);} + } + /* -- separated irq -- */ + if ((CMSDK_GPIO==CMSDK_GPIO0) && (test_individual_irq!=0)) { + gpio0_irq_flags[irq_num]=0; + NVIC_DisableIRQ(PORT0_ALL_IRQn); + NVIC_ClearPendingIRQ(((IRQn_Type)(((int)PORT0_0_IRQn) + irq_num))); + NVIC_EnableIRQ(((IRQn_Type)(((int)PORT0_0_IRQn) + irq_num))); + gpio0_irq_expected = irq_mask; + CMSDK_GPIO->INTENSET = irq_mask; + CMSDK_GPIO->DATAOUT = irq_mask; /* active */ + medium_delay(); + if (gpio0_irq_occurred==0) { err_code |= (1<<20);} + if (gpio0_irq_flags[irq_num]==0) { err_code |= (1<<21);} + gpio0_irq_occurred = 0; + CMSDK_GPIO->DATAOUT = 0x0; /* Inactive */ + medium_delay(); + if (gpio0_irq_occurred!=0) { err_code |= (1<<22);} + + /* Clean up */ + NVIC_ClearPendingIRQ(PORT0_ALL_IRQn); + NVIC_DisableIRQ(((IRQn_Type)(((int)PORT0_0_IRQn) + irq_num))); + gpio0_irq_flags[irq_num]= 0; + gpio0_irq_expected = 0; + gpio0_irq_occurred = 0; + } + /* ------------------------------ */ + /* Active falling edge interrupt */ + /* ------------------------------ */ + CMSDK_GPIO->INTENCLR = 0xFFFFFFFF; + CMSDK_GPIO->INTPOLCLR = 0xFFFFFFFF; /* Falling edge */ + CMSDK_GPIO->INTTYPESET = irq_mask; /* Falling edge */ + CMSDK_GPIO->DATAOUT = irq_mask; /* Inactive */ + if (CMSDK_GPIO==CMSDK_GPIO0) { + gpio0_irq_expected = irq_mask; + gpio0_irq_occurred = 0; + gpio0_irq_level_irq = 0; + NVIC_EnableIRQ(PORT0_ALL_IRQn); + } + if (CMSDK_GPIO==CMSDK_GPIO1) { + gpio1_irq_expected = irq_mask; + gpio1_irq_occurred = 0; + gpio1_irq_level_irq = 0; + NVIC_EnableIRQ(PORT1_ALL_IRQn); + } + /* -- interrupt enable -- */ + CMSDK_GPIO->INTENSET = irq_mask; /* Enable */ + if (CMSDK_GPIO==CMSDK_GPIO0) { + /* Should not trigger IRQ yet because signal is high */ + if (gpio0_irq_occurred!=0) { err_code |= (1<<23);} + /* Trigger combined IRQ now */ + CMSDK_GPIO->DATAOUT = 0x00000000; /* active */ + medium_delay(); + if (gpio0_irq_occurred==0) { err_code |= (1<<24);} + gpio0_irq_occurred = 0; + CMSDK_GPIO->DATAOUT = irq_mask; /* rising edge, should not trigger */ + medium_delay(); + if (gpio0_irq_occurred!=0) { err_code |= (1<<25);} + + } + if (CMSDK_GPIO==CMSDK_GPIO1) { + /* Should not trigger IRQ yet because signal is low */ + if (gpio1_irq_occurred!=0) { err_code |= (1<<23);} + /* Trigger combined IRQ now */ + CMSDK_GPIO->DATAOUT = 0x00000000; /* active */ + medium_delay(); + if (gpio1_irq_occurred==0) { err_code |= (1<<24);} + gpio1_irq_occurred = 0; + CMSDK_GPIO->DATAOUT = irq_mask; /* rising edge, should not trigger */ + medium_delay(); + if (gpio1_irq_occurred!=0) { err_code |= (1<<25);} + } + /* -- interrupt disable -- */ + CMSDK_GPIO->INTENCLR = 0xFFFFFFFF; /* Disable */ + if (CMSDK_GPIO==CMSDK_GPIO0) { + gpio0_irq_occurred = 0; + /* Should not trigger IRQ yet because signal is low */ + if (gpio0_irq_occurred!=0) { err_code |= (1<<26);} + /* falling edge - but IRQ is disabled */ + CMSDK_GPIO->DATAOUT = 0x00000000; /* active */ + medium_delay(); + if (gpio0_irq_occurred!=0) { err_code |= (1<<27);} + gpio0_irq_occurred = 0; + CMSDK_GPIO->DATAOUT = irq_mask; /* rising edge, should not trigger */ + medium_delay(); + if (gpio0_irq_occurred!=0) { err_code |= (1<<28);} + + } + if (CMSDK_GPIO==CMSDK_GPIO1) { + gpio1_irq_occurred = 0; + /* Should not trigger IRQ yet because signal is low */ + if (gpio1_irq_occurred!=0) { err_code |= (1<<26);} + /* falling edge - but IRQ is disabled */ + CMSDK_GPIO->DATAOUT = 0x00000000; /* active */ + medium_delay(); + if (gpio1_irq_occurred!=0) { err_code |= (1<<27);} + gpio1_irq_occurred = 0; + CMSDK_GPIO->DATAOUT = irq_mask; /* rising edge, should not trigger */ + medium_delay(); + if (gpio1_irq_occurred!=0) { err_code |= (1<<28);} + } + /* -- separated irq -- */ + if ((CMSDK_GPIO==CMSDK_GPIO0) && (test_individual_irq!=0)) { + gpio0_irq_flags[irq_num]=0; + NVIC_DisableIRQ(PORT0_ALL_IRQn); + NVIC_ClearPendingIRQ(((IRQn_Type)(((int)PORT0_0_IRQn) + irq_num))); + NVIC_EnableIRQ(((IRQn_Type)(((int)PORT0_0_IRQn) + irq_num))); + gpio0_irq_expected = irq_mask; + CMSDK_GPIO->INTENSET = irq_mask; + CMSDK_GPIO->DATAOUT = 0x00000000; /* active */ + medium_delay(); + if (gpio0_irq_occurred==0) { err_code |= (1<<29);} + if (gpio0_irq_flags[irq_num]==0) { err_code |= (1<<30);} + gpio0_irq_occurred = 0; + CMSDK_GPIO->DATAOUT = irq_mask; /* Inactive */ + medium_delay(); + if (gpio0_irq_occurred!=0) { err_code |= 0x80000000UL;} + CMSDK_GPIO->INTENCLR = 0xFFFFFFFF; + /* Clean up */ + NVIC_ClearPendingIRQ(PORT0_ALL_IRQn); + NVIC_DisableIRQ(((IRQn_Type)(((int)PORT0_0_IRQn) + irq_num))); + gpio0_irq_flags[irq_num]= 0; + gpio0_irq_expected = 0; + gpio0_irq_occurred = 0; + } + + if (err_code != 0) { + printf ("ERROR : Interrupt failed (0x%x)\n", err_code); + return_val =1; + err_code = 0; + } + + /* Cleaning up */ + CMSDK_GPIO->INTENCLR = 0xFFFFFFFF; + CMSDK_GPIO->INTTYPECLR = 0xFFFFFFFF; + CMSDK_GPIO->INTPOLCLR = 0xFFFFFFFF; + CMSDK_GPIO->OUTENABLECLR = 0xFFFFFFFF; + CMSDK_GPIO->DATAOUT = 0x00000000; + CMSDK_GPIO->INTCLEAR = 0x0000FFFF; + + } /* end if test required */ + } /* end for irq_num */ + + + /* Clean up */ + gpio0_irq_occurred = 0; + gpio1_irq_occurred = 0; + gpio0_irq_expected = 0; + gpio1_irq_expected = 0; + + NVIC_DisableIRQ(PORT0_ALL_IRQn); + NVIC_DisableIRQ(PORT1_ALL_IRQn); + if (CMSDK_GPIO==CMSDK_GPIO0) { + NVIC_ClearPendingIRQ(PORT0_ALL_IRQn); + for (i=0;i<16;i++){ + NVIC_DisableIRQ(((IRQn_Type)(((int)PORT0_0_IRQn) + i))); + NVIC_ClearPendingIRQ(PORT0_ALL_IRQn); + } + } else { + NVIC_ClearPendingIRQ(PORT1_ALL_IRQn); + } + + /* Generate return value */ + if (err_code != 0) { + printf ("ERROR : Interrupt failed (0x%x)\n", err_code); + return_val =1; + err_code = 0; + } + else puts("Interrupt Test Passed"); + + return(return_val); +} +/* --------------------------------------- */ +/* Combined interrupt handler for GPIO #0 */ +/* */ +void PORT0_COMB_Handler(void) +{ + if (gpio0_irq_expected==0) { + puts ("ERROR : Unexpected GPIO 0 interrupt occurred.\n"); + UartEndSimulation(); + while (1); + } + else if (gpio0_irq_level_irq!=0) { + if (multi_irq_test > 1) { + multi_irq_test--; /* twice here : 3->2, 2->1 */ + } else { /* once here */ + /* Deassert interrupt source */ + CMSDK_GPIO0->DATAOUT = CMSDK_GPIO0->DATAOUT ^ gpio0_irq_expected; + medium_delay(); + } + } + CMSDK_GPIO0->INTCLEAR = gpio0_irq_expected; + gpio0_irq_occurred++; + return; +} + +/* --------------------------------------- */ +/* Combined interrupt handler for GPIO #1 */ +/* */ +void PORT1_COMB_Handler(void) +{ + if (gpio1_irq_expected==0) { + puts ("ERROR : Unexpected GPIO 1 interrupt occurred.\n"); + UartEndSimulation(); + while (1); + } + else if (gpio1_irq_level_irq!=0) { + if (multi_irq_test > 1) { + multi_irq_test--; /* twice here : 3->2, 2->1 */ + } else { /* once here */ + /* Deassert interrupt source */ + CMSDK_GPIO1->DATAOUT = CMSDK_GPIO1->DATAOUT ^ gpio1_irq_expected; + medium_delay(); + } + } + CMSDK_GPIO1->INTCLEAR = gpio1_irq_expected; + gpio1_irq_occurred++; + return; +} + +/* ----------------------------------------- */ +/* Individual interrupt handler for GPIO #0 */ +/* */ +void PORT0_0_Handler(void){ + PORT0_COMB_Handler(); + gpio0_irq_flags[0]++; + return; +} +void PORT0_1_Handler(void){ + PORT0_COMB_Handler(); + gpio0_irq_flags[1]++; + return; +} +void PORT0_2_Handler(void){ + PORT0_COMB_Handler(); + gpio0_irq_flags[2]++; + return; +} +void PORT0_3_Handler(void){ + PORT0_COMB_Handler(); + gpio0_irq_flags[3]++; + return; +} +void PORT0_4_Handler(void){ + PORT0_COMB_Handler(); + gpio0_irq_flags[4]++; + return; +} +void PORT0_5_Handler(void){ + PORT0_COMB_Handler(); + gpio0_irq_flags[5]++; + return; +} +void PORT0_6_Handler(void){ + PORT0_COMB_Handler(); + gpio0_irq_flags[6]++; + return; +} +void PORT0_7_Handler(void){ + PORT0_COMB_Handler(); + gpio0_irq_flags[7]++; + return; +} +void PORT0_8_Handler(void){ + PORT0_COMB_Handler(); + gpio0_irq_flags[8]++; + return; +} +void PORT0_9_Handler(void){ + PORT0_COMB_Handler(); + gpio0_irq_flags[9]++; + return; +} +void PORT0_10_Handler(void){ + PORT0_COMB_Handler(); + gpio0_irq_flags[10]++; + return; +} +void PORT0_11_Handler(void){ + PORT0_COMB_Handler(); + gpio0_irq_flags[11]++; + return; +} +void PORT0_12_Handler(void){ + PORT0_COMB_Handler(); + gpio0_irq_flags[12]++; + return; +} +void PORT0_13_Handler(void){ + PORT0_COMB_Handler(); + gpio0_irq_flags[13]++; + return; +} +void PORT0_14_Handler(void){ + PORT0_COMB_Handler(); + gpio0_irq_flags[14]++; + return; +} +void PORT0_15_Handler(void){ + PORT0_COMB_Handler(); + gpio0_irq_flags[15]++; + return; +} + diff --git a/Cortex-M0/nanosoc/software/common/validation/memory_tests.c b/Cortex-M0/nanosoc/software/common/validation/memory_tests.c new file mode 100644 index 0000000..392854a --- /dev/null +++ b/Cortex-M0/nanosoc/software/common/validation/memory_tests.c @@ -0,0 +1,645 @@ +/* + *----------------------------------------------------------------------------- + * The confidential and proprietary information contained in this file may + * only be used by a person authorised under and to the extent permitted + * by a subsisting licensing agreement from Arm Limited or its affiliates. + * + * (C) COPYRIGHT 2010-2013 Arm Limited or its affiliates. + * ALL RIGHTS RESERVED + * + * This entire notice must be reproduced on all copies of this file + * and copies of this file may only be made by a person if such person is + * permitted to do so under the terms of a subsisting license agreement + * from Arm Limited or its affiliates. + * + * SVN Information + * + * Checked In : $Date: 2017-10-10 15:55:38 +0100 (Tue, 10 Oct 2017) $ + * + * Revision : $Revision: 371321 $ + * + * Release Information : Cortex-M System Design Kit-r1p1-00rel0 + *----------------------------------------------------------------------------- + */ + +/* + A simple test to check accesses to different memory locations +*/ + + +#ifdef CORTEX_M0 +#include "CMSDK_CM0.h" +#endif + +#ifdef CORTEX_M0PLUS +#include "CMSDK_CM0plus.h" +#endif + +#ifdef CORTEX_M3 +#include "CMSDK_CM3.h" +#endif + +#ifdef CORTEX_M4 +#include "CMSDK_CM4.h" +#endif + +#define SRAM_BASE_ADDR 0x20000000 +#define SRAM_SIZE 0x10000 + +#define ROM_BASE_ADDR 0x00000000 +#define ROM_SIZE 0x10000 + +#define BOOT_BASE_ADDR 0x01000000 +#define BOOT_SIZE 0x4000 +#define BOOT_ALIAS_SIZE 0x10000 + +#define APB_IO_BASE_ADDR 0x40000000 +#define APB_IO_SIZE 0x10000 + +#include <stdio.h> +#include "uart_stdout.h" + +#define HW32_REG(ADDRESS) (*((volatile unsigned long *)(ADDRESS))) +#define HW16_REG(ADDRESS) (*((volatile unsigned short *)(ADDRESS))) +#define HW8_REG(ADDRESS) (*((volatile unsigned char *)(ADDRESS))) + +#if defined ( __CC_ARM ) +__asm void address_test_write(unsigned int addr, unsigned int wdata); +__asm unsigned int address_test_read(unsigned int addr); +#else + void address_test_write(unsigned int addr, unsigned int wdata); + unsigned int address_test_read(unsigned int addr); +#endif +void HardFault_Handler_c(unsigned int * hardfault_args, unsigned lr_value); +int sram_test(void); +int sram_test_word(unsigned int test_addr); +int rom_test(void); +int boot_rom_test(void); +int apb_io_test(void); +int ahb_io_test(void); +int ID_Check(const unsigned char id_array[], unsigned int offset); +int SysCtrl_ID_Check(const unsigned char id_array[], unsigned int offset); +int SysCtrl_unused_addr_test(void); + +/* Global variables */ +volatile int hardfault_occurred; +volatile int hardfault_expected; +volatile int temp_data; + int hardfault_verbose=0; // 0:Not displaying anything in hardfault handler + +const unsigned char ahb_gpio_id[16] = {0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, + 0x20, 0xB8, 0x0B, 0x00, 0x0D, 0xF0, 0x05, 0xB1}; +const unsigned char sysctrl_id[16] = {0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, + 0x26, 0xB8, 0x0B, 0x00, 0x0D, 0xF0, 0x05, 0xB1}; + +int main (void) +{ + int err_code = 0; + + // UART init + UartStdOutInit(); + + // Test banner message and revision number + puts("\nCortex Microcontroller System Design Kit"); + puts(" - Simple memory test - revision $Revision: 371321 $\n"); + + temp_data=0; + hardfault_occurred = 0; + hardfault_expected = 0; + + if (sram_test() !=0) err_code |= 1<< 0; + if (rom_test() !=0) err_code |= 1<< 1; + if (boot_rom_test() !=0) err_code |= 1<< 2; + if (apb_io_test() !=0) err_code |= 1<< 3; + if (ahb_io_test() !=0) err_code |= 1<< 4; + + + /* Generate test pass/fail and return value */ + if (err_code==0) { + printf ("\n** TEST PASSED **\n"); + } else { + printf ("\n** TEST FAILED **, Error code = (0x%x)\n", err_code); + } + UartEndSimulation(); + return 0; +} + +/* -------------------------------------------------------------------- */ +/* ROM test */ +/* -------------------------------------------------------------------- */ +int rom_test(void) +{ + int err_code = 0; + + puts ("Checking ROM"); + + /* Test max and min addresses in ROM boundary */ + hardfault_occurred = 0; + hardfault_expected = 0; + temp_data = address_test_read(ROM_BASE_ADDR); + if (hardfault_occurred!=0) err_code |= 1<<0; + address_test_write(ROM_BASE_ADDR+ROM_SIZE-4, 0); + temp_data = address_test_read(ROM_BASE_ADDR+ROM_SIZE-4); + if (hardfault_occurred!=0) err_code |= 1<<1; + + /* Test addresses beyond ROM boundary */ + hardfault_occurred = 0; + hardfault_expected = 1; + temp_data = address_test_read(((unsigned)(ROM_BASE_ADDR-4))); + if (hardfault_occurred==0) err_code |= 1<<2; + hardfault_occurred = 0; + hardfault_expected = 1; + temp_data = address_test_read(ROM_BASE_ADDR+ROM_SIZE); + if (hardfault_occurred==0) err_code |= 1<<3; + + if (err_code> 0) { + puts (" Failed\n"); + printf ("Error code : %x\n", err_code); + return 1; + } else { + puts (" Passed\n"); + return 0; + } +} +/* -------------------------------------------------------------------- */ +/* Boot loader ROM test */ +/* -------------------------------------------------------------------- */ +int boot_rom_test(void) +{ + int err_code = 0; + + puts ("Checking Boot loader ROM"); + + /* Detect if boot loader present */ + hardfault_occurred = 0; + hardfault_expected = 1; + temp_data = address_test_read(BOOT_BASE_ADDR); + if (hardfault_occurred!=0) { + puts (" Boot loader not present"); + return 0; + } + + /* Test max addresses in Boot loader ROM boundary */ + hardfault_expected = 0; + hardfault_occurred = 0; + address_test_write(BOOT_BASE_ADDR+BOOT_SIZE-4, 0); + temp_data = address_test_read(BOOT_BASE_ADDR+BOOT_SIZE-4); + if (hardfault_occurred!=0) err_code |= 1<<0; + + /* Test addresses beyond Boot loader ROM boundary */ + hardfault_occurred = 0; + hardfault_expected = 1; + temp_data = address_test_read(BOOT_BASE_ADDR-4); + if (hardfault_occurred==0) err_code |= 1<<1; + + hardfault_occurred = 0; + hardfault_expected = 0; /* 64KB range is allocated for boot ROM, + but only 4K is used. Access over 4KB range wraps round */ + temp_data = address_test_read(BOOT_BASE_ADDR+BOOT_SIZE); + if (hardfault_occurred!=0) err_code |= 1<<2; + + hardfault_occurred = 0; + hardfault_expected = 1; /* Check beyond alias range */ + temp_data = address_test_read(BOOT_BASE_ADDR+BOOT_ALIAS_SIZE); + if (hardfault_occurred==0) err_code |= 1<<3; + + if (err_code> 0) { + puts (" Failed\n"); + printf ("Error code : %x\n", err_code); + return 1; + } else { + puts (" Passed\n"); + return 0; + } +} +/* -------------------------------------------------------------------- */ +/* SRAM test */ +/* -------------------------------------------------------------------- */ +int sram_test(void) +{ + int err_code = 0; + + puts ("Checking SRAM"); + + /* Test max and min addresses in SRAM boundary */ + + // Starting location + if (sram_test_word(SRAM_BASE_ADDR )!=0) err_code |= 1<<0; + // Ending location + if (sram_test_word(SRAM_BASE_ADDR+SRAM_SIZE-4)!=0) err_code |= 1<<1; + + /* Test addresses beyond SRAM boundary */ + + hardfault_occurred = 0; + hardfault_expected = 1; + temp_data = address_test_read(SRAM_BASE_ADDR-4); + if (hardfault_occurred==0) err_code |= 1<<2; + + hardfault_occurred = 0; + hardfault_expected = 1; + temp_data = address_test_read(SRAM_BASE_ADDR+SRAM_SIZE); + if (hardfault_occurred==0) err_code |= 1<<3; + + hardfault_occurred = 0; + hardfault_expected = 0; + + if (err_code> 0) { + puts (" Failed\n"); + printf ("Error code : %x\n", err_code); + return 1; + } else { + puts (" Passed\n"); + return 0; + } +} + +int sram_test_word(unsigned int test_addr) +{ + int result=0; // This will only work if result and temp are not store in address being tested + int temp; + + __disable_irq(); // Make sure interrupt will not affect the result of the test + + temp = HW32_REG(test_addr); // save data + + /* Use consistence memory access size in checking so that it work with + both little endian and big endian configs */ + HW32_REG(test_addr)=0x00000000; + if (HW32_REG(test_addr)!=0x00000000) result++; + HW16_REG(test_addr)=0xFFFF; + if (HW16_REG(test_addr)!=0xFFFF) result++; + HW8_REG(test_addr+3)=0x12; + HW8_REG(test_addr+2)=0xFF; + if (HW8_REG(test_addr+3)!=0x12) result++; + if (HW8_REG(test_addr+2)!=0xFF) result++; + HW8_REG(test_addr )=0x00; + HW8_REG(test_addr+1)=0x00; + if (HW8_REG(test_addr )!=0x00) result++; + if (HW8_REG(test_addr+1)!=0x00) result++; + HW16_REG(test_addr+2)=0xFE00; + if (HW16_REG(test_addr+2)!=0xFE00) result++; + HW32_REG(test_addr)=0x00000000; + if (HW32_REG(test_addr)!=0x00000000) result++; + + HW32_REG(test_addr) = temp; // restore data + __enable_irq(); // re-enable IRQ + if (result !=0) printf ("ERROR: Memory location test failed at %x\n", test_addr); + return result; +} + + +/* -------------------------------------------------------------------- */ +/* APB test */ +/* -------------------------------------------------------------------- */ +int apb_io_test(void) +{ + int err_code = 0; + + puts ("Checking APB space"); + + /* Test max and min addresses in IO boundary */ + hardfault_occurred = 0; + hardfault_expected = 0; + temp_data = address_test_read(APB_IO_BASE_ADDR); + if (hardfault_occurred!=0) err_code |= 1<<0; + temp_data = address_test_read(APB_IO_BASE_ADDR+APB_IO_SIZE-4); + if (hardfault_occurred!=0) err_code |= 1<<1; + + /* Test addresses beyond IO boundary */ + hardfault_occurred = 0; + hardfault_expected = 1; + temp_data = address_test_read(APB_IO_BASE_ADDR-4); + if (hardfault_occurred==0) err_code |= 1<<2; + + /* Address above APB IO space is AHB GPIO, not test here */ + + if (err_code> 0) { + puts (" Failed\n"); + printf ("Error code : %x\n", err_code); + return 1; + } else { + puts (" Passed\n"); + return 0; + } +} +/* -------------------------------------------------------------------- */ +/* AHB test */ +/* -------------------------------------------------------------------- */ +int ahb_io_test(void) +{ + int err_code = 0; + unsigned int test_addr; + int i; /* loop counter */ + + puts ("Checking AHB I/O space"); + + /* Check ID for AHB peripheral */ + puts (" - GPIO #0 ID values"); + if (ID_Check(&ahb_gpio_id[0], CMSDK_GPIO0_BASE ) == 1 ) err_code |= 1<<0; + puts (" - GPIO #1 ID values"); + if (ID_Check(&ahb_gpio_id[0], CMSDK_GPIO1_BASE ) == 1 ) err_code |= 1<<1; + puts (" - System Controller ID values"); + if (SysCtrl_ID_Check(&sysctrl_id[0], CMSDK_SYSCTRL_BASE ) == 1 ) err_code |= 1<<2; + puts (" - System Controller unused addresses"); + if (SysCtrl_unused_addr_test() == 1) err_code |= 1<<3; + + /* Check limits of memory maps */ + puts (" - Address range check"); + hardfault_occurred = 0; + hardfault_expected = 0; + temp_data = address_test_read(CMSDK_GPIO0_BASE); /* Should have no hard fault */ + if (hardfault_occurred!=0) err_code |= 1<<4; + hardfault_occurred = 0; + hardfault_expected = 0; + temp_data = address_test_read(CMSDK_GPIO1_BASE); /* Should have no hard fault */ + if (hardfault_occurred!=0) err_code |= 1<<5; + hardfault_occurred = 0; + hardfault_expected = 0; + temp_data = address_test_read(CMSDK_SYSCTRL_BASE); /* Should have no hard fault */ + if (hardfault_occurred!=0) err_code |= 1<<6; + + /* Unused AHB I/O space - should have hard fault */ + for (i=0;i<13;i++) { // From 0x40010000 to 0x4001FFFF are AHB I/O space + hardfault_occurred = 0; // 0x40012000 to 0x4001EFFF are unused (13 slots) + hardfault_expected = 1; + test_addr = CMSDK_AHB_BASE+0x2000UL+(i*0x1000UL); + temp_data = address_test_read(test_addr); // Starting address of each slot + if (hardfault_occurred==0) { + err_code |= 1<<7; + printf("ERROR:Expected bus fault at %x did not take place\n", test_addr); + } + hardfault_occurred = 0; + hardfault_expected = 1; + test_addr = test_addr + 0xFFC; + temp_data = address_test_read(test_addr); // Ending address of each slot + if (hardfault_occurred==0) { + err_code |= 1<<8; + printf("ERROR:Expected bus fault at %x did not take place\n", test_addr); + } + } // end_for + + /* Test end of AHB I/O address range */ + hardfault_occurred = 0; + hardfault_expected = 1; + temp_data = address_test_read(0x40020000); // address beyond AHB I/O space + if (hardfault_occurred==0) { + err_code |= 1<<9; + puts("ERROR:Expected bus fault at 0x40020000 did not take place"); + } + + if (err_code> 0) { + puts (" Failed\n"); + printf ("Error code : %x\n", err_code); + return 1; + } else { + puts (" Passed\n"); + return 0; + } +} + +/* -------------------------------------------------------------------- */ +/* ID value check */ +/* -------------------------------------------------------------------- */ + +/* Check the ID register value in offset 0xFC0 to 0xFFC (last 16 words, last 12 are IDs) */ +int ID_Check(const unsigned char id_array[], unsigned int offset) +{ + int i; /* loop counter */ + unsigned long expected_val, actual_val; + unsigned long compare_mask; + int mismatch = 0; + int id_is_zero = 0; + unsigned long test_addr; + + /* Check the peripheral ID and component ID */ + for (i=0;i<16;i++) { + test_addr = offset + 4*i + 0xFC0; + expected_val = (int) id_array[i]; + actual_val = HW32_REG(test_addr); + + if (actual_val == 0) id_is_zero++; // Check if all ID are zero at the end + + /* create mask to ignore version numbers */ + if (i==10) { compare_mask = 0xF0;} // mask out version field + else if (i==11) { compare_mask = 0xFF;} // mask out ECO field and patch field + else { compare_mask = 0x00;} // compare whole value + + if ((expected_val & (~compare_mask)) != (actual_val & (~compare_mask))) { + printf ("Difference found: %x, expected %x, actual %x\n", test_addr, expected_val, actual_val); + mismatch++; + } + } // end_for + + if (id_is_zero == 16) { + puts (" All ID values are 0 : device not present\n"); + return 2; + } else if (mismatch> 0) { + puts (" ID value mismatch(es) : device unknown\n"); + return 1; + } else { + puts (" All ID values matched : device present\n"); + return 0; + } +} +/* Check the ID register value in offset 0xFC0 to 0xFFC (last 16 words, last 12 are IDs) */ +int SysCtrl_ID_Check(const unsigned char id_array[], unsigned int offset) +{ + int i; /* loop counter */ + unsigned long expected_val, actual_val; + unsigned long compare_mask; + int mismatch = 0; + int id_is_zero = 0; + unsigned long test_addr; + + /* Check the peripheral ID and component ID */ + for (i=0;i<16;i++) { + test_addr = offset + 4*i + 0xFC0; + expected_val = (int) id_array[i]; + actual_val = HW32_REG(test_addr); + + if (actual_val == 0) id_is_zero++; // Check if all ID are zero at the end + + /* create mask to ignore version numbers */ + if (i==10) { compare_mask = 0xF0;} // mask out version field + else if (i==11) { compare_mask = 0xFF;} // mask out ECO field and patch field + else { compare_mask = 0x00;} // compare whole value + + if (i==8) { + /* The part number of the example system controller in CMSDK can be + 26 to 29 */ + if ((actual_val<0x26)||(actual_val>0x29)) { + printf ("Difference found: %x, expected 0x26 to 0x29, actual %x\n", test_addr, actual_val); + mismatch++; + } + } + else { + if ((expected_val & (~compare_mask)) != (actual_val & (~compare_mask))) { + printf ("Difference found: %x, expected %x, actual %x\n", test_addr, expected_val, actual_val); + mismatch++; + } + } // end_if_i_eq_8 + } // end_for + + if (id_is_zero == 16) { + puts (" All ID values are 0 : device not present\n"); + return 2; + } else if (mismatch> 0) { + puts (" ID value mismatch(es) : device unknown\n"); + return 1; + } else { + puts (" All ID values matched : device present\n"); + return 0; + } +} +/* --------------------------------------------------------------- */ +/* SysCtrl Unused Addresses access tests */ +/* --------------------------------------------------------------- */ + +int unused_addresses_test_single(unsigned int address) +{ + if (HW32_REG(address) != 0) return (1); + HW32_REG(address) = 0xFFFFFFFF; + if (HW32_REG(address) != 0) return (1); + else return (0); +} + +/* Test unused address in SysCtrl */ +int SysCtrl_unused_addr_test(void) +{ + int return_val=0; + unsigned int err_code=0; + + if (unused_addresses_test_single(CMSDK_SYSCTRL_BASE + 0x00C)) err_code |= 1 << 0; + if (unused_addresses_test_single(CMSDK_SYSCTRL_BASE + 0x014)) err_code |= 1 << 1; + if (unused_addresses_test_single(CMSDK_SYSCTRL_BASE + 0x018)) err_code |= 1 << 2; + if (unused_addresses_test_single(CMSDK_SYSCTRL_BASE + 0x01C)) err_code |= 1 << 3; + if (unused_addresses_test_single(CMSDK_SYSCTRL_BASE + 0x020)) err_code |= 1 << 4; + if (unused_addresses_test_single(CMSDK_SYSCTRL_BASE + 0xC00)) err_code |= 1 << 5; + if (unused_addresses_test_single(CMSDK_SYSCTRL_BASE + 0xD00)) err_code |= 1 << 6; + if (unused_addresses_test_single(CMSDK_SYSCTRL_BASE + 0xE00)) err_code |= 1 << 7; + if (unused_addresses_test_single(CMSDK_SYSCTRL_BASE + 0xF00)) err_code |= 1 << 8; + if (unused_addresses_test_single(CMSDK_SYSCTRL_BASE + 0xFC0)) err_code |= 1 << 9; + if (unused_addresses_test_single(CMSDK_SYSCTRL_BASE + 0xFC4)) err_code |= 1 << 10; + if (unused_addresses_test_single(CMSDK_SYSCTRL_BASE + 0xFC8)) err_code |= 1 << 11; + if (unused_addresses_test_single(CMSDK_SYSCTRL_BASE + 0xFCC)) err_code |= 1 << 12; + + + /* Generate return value */ + if (err_code != 0) { + printf ("Error : Unused addresses failed (0x%x)\n", err_code); + return_val =1; + } + else puts(" Unused addresses Test Passed\n"); + + return(return_val); +} +/* -------------------------------------------------------------------- */ +/* Helper functions for testing bus fault */ +/* -------------------------------------------------------------------- */ + +#if defined ( __CC_ARM ) +/* Test function for write - for ARM / Keil */ +__asm void address_test_write(unsigned int addr, unsigned int wdata) +{ + STR R1,[R0] + DSB ; Ensure bus fault occurred before leaving this subroutine + BX LR +} + +#else +/* Test function for write - for gcc */ +void address_test_write(unsigned int addr, unsigned int wdata) __attribute__((naked)); +void address_test_write(unsigned int addr, unsigned int wdata) +{ + __asm(" str r1,[r0]\n" + " dsb \n" + " bx lr \n" + ); +} +#endif + +/* Test function for read */ +#if defined ( __CC_ARM ) +/* Test function for read - for ARM / Keil */ +__asm unsigned int address_test_read(unsigned int addr) +{ + LDR R1,[R0] + DSB ; Ensure bus fault occurred before leaving this subroutine + MOVS R0, R1 + BX LR +} +#else +/* Test function for read - for gcc */ +unsigned int address_test_read(unsigned int addr) __attribute__((naked)); +unsigned int address_test_read(unsigned int addr) +{ + __asm(" ldr r1,[r0]\n" + " dsb \n" + " movs r0, r1 \n" + " bx lr \n" + ); +} +#endif + + +#if defined ( __CC_ARM ) +/* ARM or Keil toolchain */ +__asm void HardFault_Handler(void) +{ + MOVS r0, #4 + MOV r1, LR + TST r0, r1 + BEQ stacking_used_MSP + MRS R0, PSP ; // first parameter - stacking was using PSP + B get_LR_and_branch +stacking_used_MSP + MRS R0, MSP ; // first parameter - stacking was using MSP +get_LR_and_branch + MOV R1, LR ; // second parameter is LR current value + LDR R2,=__cpp(HardFault_Handler_c) + BX R2 + ALIGN +} +#else +/* gcc toolchain */ +void HardFault_Handler(void) __attribute__((naked)); +void HardFault_Handler(void) +{ + __asm(" movs r0,#4\n" + " mov r1,lr\n" + " tst r0,r1\n" + " beq stacking_used_MSP\n" + " mrs r0,psp\n" /* first parameter - stacking was using PSP */ + " ldr r1,=HardFault_Handler_c \n" + " bx r1\n" + "stacking_used_MSP:\n" + " mrs r0,msp\n" /* first parameter - stacking was using PSP */ + " ldr r1,=HardFault_Handler_c \n" + " bx r1\n" + ".pool\n" ); +} + +#endif +/* C part of the fault handler - common between ARM / Keil /gcc */ +void HardFault_Handler_c(unsigned int * hardfault_args, unsigned lr_value) +{ + unsigned int stacked_pc; + unsigned int stacked_r0; + hardfault_occurred++; + if (hardfault_verbose) puts ("[Hard Fault Handler]"); + if (hardfault_expected==0) { + puts ("ERROR : Unexpected HardFault interrupt occurred.\n"); + UartEndSimulation(); + while (1); + } + stacked_r0 = ((unsigned long) hardfault_args[0]); + stacked_pc = ((unsigned long) hardfault_args[6]); + if (hardfault_verbose) printf(" - Stacked R0 : 0x%x\n", stacked_r0); + if (hardfault_verbose) printf(" - Stacked PC : 0x%x\n", stacked_pc); + /* Modify R0 to a valid address */ + hardfault_args[0] = (unsigned long) &temp_data; + + return; +} + + diff --git a/Cortex-M0/nanosoc/software/common/validation/timer_driver_tests.c b/Cortex-M0/nanosoc/software/common/validation/timer_driver_tests.c new file mode 100644 index 0000000..db888a9 --- /dev/null +++ b/Cortex-M0/nanosoc/software/common/validation/timer_driver_tests.c @@ -0,0 +1,548 @@ +/* + *----------------------------------------------------------------------------- + * The confidential and proprietary information contained in this file may + * only be used by a person authorised under and to the extent permitted + * by a subsisting licensing agreement from Arm Limited or its affiliates. + * + * (C) COPYRIGHT 2010-2013 Arm Limited or its affiliates. + * ALL RIGHTS RESERVED + * + * This entire notice must be reproduced on all copies of this file + * and copies of this file may only be made by a person if such person is + * permitted to do so under the terms of a subsisting license agreement + * from Arm Limited or its affiliates. + * + * SVN Information + * + * Checked In : $Date: 2017-10-10 15:55:38 +0100 (Tue, 10 Oct 2017) $ + * + * Revision : $Revision: 371321 $ + * + * Release Information : Cortex-M System Design Kit-r1p1-00rel0 + *----------------------------------------------------------------------------- + */ + +/* + A simple test to check the functionalities of timer functions in the example device driver. +*/ + +#ifdef CORTEX_M0 +#include "CMSDK_CM0.h" +#endif + +#ifdef CORTEX_M0PLUS +#include "CMSDK_CM0plus.h" +#endif + +#ifdef CORTEX_M3 +#include "CMSDK_CM3.h" +#endif + +#ifdef CORTEX_M4 +#include "CMSDK_CM4.h" +#endif + +#include <stdio.h> +#include "uart_stdout.h" +#include "CMSDK_driver.h" + +int volatile timer_irq_counter; +int volatile timer_irq_executed; +uint32_t temp_test; + +/* Declare test functions */ +int Timer_Init(void); +int Timer_IRQ(void); +int Timer_Poll(void); +int Timer_Ext(void); + +int timer0_id_check(void); // Detect Timer 0 present +int gpio1_id_check(void); // Detect GPIO 1 present + +int main (void) +{ + int result = 0; + + // UART init + UartStdOutInit(); + + // Test banner message and revision number + puts("\nCortex Microcontroller System Design Kit - Timer Driver Test - revision $Revision: 371321 $\n"); + + if (timer0_id_check()!=0) { + puts ("** TEST SKIPPED ** Timer 0 not present."); + UartEndSimulation(); + return 0;} + + /* Run tests */ + result |= Timer_Init(); + result |= Timer_IRQ(); + result |= Timer_Poll(); + + if (gpio1_id_check()==0) { + /* GPIO #1 is require for creating test input */ + result |= Timer_Ext(); /* Run external input test */ + } + else { + if(result != 0) { + printf("** TEST FAILED **, Error code: (0x%x)\n\n", result); + } + puts ("** TEST SKIPPED ** GPIO 1 not present."); + UartEndSimulation(); + return 0; + } + + if(result == 0) { + puts("** TEST PASSED **\n"); + } else { + printf("** TEST FAILED **, Error code: (0x%x)\n\n", result); + } + + UartEndSimulation(); + + return result; +} + + + +/* Initialisation test - set timer reload to 0xF00 with interrupt enabled */ +/* The test also check read back values of the control register and reload register */ +int Timer_Init(void) +{ + int err_code = 0; + uint32_t CTRL = 0; + + puts("\nStage 1 - Timer Initialisation\n"); + + /* Stage 1 Test sequence + After CMSDK_timer_Init_IntClock is executed, + - read back timer #0 control register and save it to a variable + - stop timer (to stop interrupt for the moment to improve speed of the checking) + - check timer control register is set with correct value + - check timer reload register is set with correct value + - write back the previous control register value to resume timer operations + */ + + CMSDK_timer_Init_IntClock(CMSDK_TIMER0, 0xF00, 1); /*test timer interrupt using internal clock*/ + CTRL = CMSDK_TIMER0->CTRL; + CMSDK_timer_DisableIRQ(CMSDK_TIMER0); + + if((CTRL & CMSDK_TIMER_CTRL_EN_Msk) != 0) { + puts("Timer Enabled"); + } + else{ + err_code |= (1 << 0); + printf("** TEST FAILED **, Error code: (0x%x)\n", err_code); + } + if((CTRL & CMSDK_TIMER_CTRL_SELEXTEN_Msk) == 0){ + puts("Ext Enable Not Selected"); + } + else{ + err_code |= (1 << 1); + printf("** TEST FAILED **, Error code: (0x%x)\n", err_code); + } + if((CTRL & CMSDK_TIMER_CTRL_SELEXTCLK_Msk) == 0){ + puts("Ext Clock Not Selected"); + } + else{ + err_code |= (1 << 2); + printf("** TEST FAILED **, Error code: (0x%x)\n", err_code); + } + if((CTRL & CMSDK_TIMER_CTRL_IRQEN_Msk) != 0) { + puts("Timer IRQ Enabled"); + } + else{ + err_code |= (1 << 3); + printf("** TEST FAILED **, Error code: (0x%x)\n", err_code); + } + if((CMSDK_TIMER0->RELOAD == 0xF00) != 0){ + puts("Reload Value of 0xF00"); + } + else{ + err_code |= (1 << 4); + printf("** TEST FAILED **, Error code: (0x%x)\n", err_code); + } + if((CTRL & 0x9)){ + CMSDK_TIMER0->CTRL = CTRL; + puts("\nTimer Initialisation Successful\n"); + } + else{ + printf("\n** TEST FAILED ** Timer Initialisation Failed Program Will Now Quit, Error code: (0x%x)\n", err_code); + return err_code; + } + + if(!err_code) return 0; + else return 1; +} +/* Interrupt test */ +int Timer_IRQ(void) +{ + int counter = 0; /* Loop counter */ + int err_code = 0; /* Variable to record errors */ + uint32_t CTRL = 0; /* Variable to hold read back CTRL value */ + uint32_t RELOAD = 0; /* Variable to hold updated RELOAD value */ + + timer_irq_counter = 0; /* Set timer interrupt variables to 0 */ + timer_irq_executed = 0; + + puts("Stage 2 - interrupt\n"); + + // For robustness, disable the timer, clear the IRQ in case it's set, then + // clear the current value to zero, and then enable again; this should ensure + // that operation of this test part starts from a stable point + // + // Also set the reload value to 0x1f00 to allow the test more time to execute + // the test loop, and increment the loop counter sufficiently quickly in + // relation to the timer to allow all aspects of this test part to be + // executed + CMSDK_timer_StopTimer (CMSDK_TIMER0); + CMSDK_timer_ClearIRQ (CMSDK_TIMER0); + CMSDK_timer_SetValue (CMSDK_TIMER0, 0x0); + CMSDK_timer_SetReload (CMSDK_TIMER0, 0x1f00); + // Now start the timer before the test sequence + CMSDK_timer_StartTimer(CMSDK_TIMER0); + + /* Stage 2 Test sequence + - timer enabled by CMSDK_timer_Init_IntClock, with interrupt enabled + - first interrupt triggered + - after first IRQ, timer interrupt is disabled + - after loop executed 5 times, reload value is reprogrammed to double the value + - after a while, second interrupt taken place + - after second IRQ, timer interrupt is disabled + - the loop is executed to 10th time (or multiple of 10), timer interrupt is re-enabled + (multiple of 10 is used to prevent the test from getting stuck. + Due to timing dependency nature of this test, the test sequence could be different + from expected when there are wait states in the memory system.) + - after a while, third interrupt taken place + - the timer is stopped inside the timer interrupt handler + - the loop is exited + */ + + NVIC_ClearPendingIRQ(TIMER0_IRQn); + NVIC_EnableIRQ(TIMER0_IRQn); + while (timer_irq_counter < 3) /* Wait until IRQ take place 3 times*/ + { + if (timer_irq_executed!=0) /* This part is executed each time a timer interrupt is detected */ + { + puts ("Timer IRQ\n"); + printf("Timer Status: %u\n", timer_irq_executed); + CMSDK_timer_DisableIRQ(CMSDK_TIMER0); + puts("Timer IRQ Disabled"); + timer_irq_executed=0; /* clear variable so that this part is not executed until next timer interrupt */ + } + + printf("Timer Status: %u\n", CMSDK_timer_StatusIRQ(CMSDK_TIMER0)); + + counter++; /* loop counter increment */ + + if (counter == 5) /* after loop executed 5 times, reload value is reprogrammed to double the value */ + { + printf("Timer Value: %u\n", CMSDK_timer_GetValue(CMSDK_TIMER0)); + printf("Timer Reload Value: %u\n",CMSDK_timer_GetReload(CMSDK_TIMER0)); + CMSDK_timer_SetReload(CMSDK_TIMER0, (RELOAD = 2*CMSDK_timer_GetReload(CMSDK_TIMER0))); + /*test other timer functions including set reload and set value*/ + printf("Timer Reload Value now set to: %u\n",CMSDK_timer_GetReload(CMSDK_TIMER0)); + + if(RELOAD == CMSDK_timer_GetReload(CMSDK_TIMER0)) { + puts("Timer Reload Value Is Correct"); /*check for reload value */ + } + else{ + err_code = (1 << 0); + printf("** TEST FAILED **, Error code: (0x%x)\n", err_code); + break; + } + + CMSDK_timer_StopTimer(CMSDK_TIMER0); + CMSDK_timer_SetValue(CMSDK_TIMER0, 0x12C); /*set to 300 to test instant underflow*/ + + if(0x12C == CMSDK_timer_GetValue(CMSDK_TIMER0)) { + puts("Timer Value Set to 300"); /*check for reload value */ + } + else{ + err_code = (1 << 1); + printf("** TEST FAILED **, Error code: (0x%x)\n", err_code); + break; + } + CMSDK_timer_StartTimer(CMSDK_TIMER0); + CMSDK_timer_EnableIRQ(CMSDK_TIMER0); + } + if ((counter % 10) == 0) /* the loop is executed to 10th time (or multiple of 10), timer interrupt is re-enabled */ + { + CMSDK_timer_StopTimer(CMSDK_TIMER0); + CMSDK_timer_EnableIRQ(CMSDK_TIMER0); + CTRL = CMSDK_TIMER0->CTRL; /* Check timer interrupt is enabled */ + if((CTRL & CMSDK_TIMER_CTRL_IRQEN_Msk) != 0) { + puts("Timer IRQ enabled"); + } + else{ + err_code |= (1 << 2); + printf("** TEST FAILED **, Error code: (0x%x)\n", err_code); + break; + } + CMSDK_timer_StartTimer(CMSDK_TIMER0); + } + } + + CMSDK_timer_StopTimer(CMSDK_TIMER0); + /*read back of control register to make sure value is expected */ + + if((CMSDK_TIMER0->CTRL & CMSDK_TIMER_CTRL_EN_Msk) == 0) { + puts("\nTimer Stopped"); + } + else{ + err_code = (1 << 3); + printf("** TEST FAILED **, Error code: (0x%x)\n", err_code); + } + + if(!err_code) { + puts("** Timer IRQ Test Passed **\n"); + } + else printf("** TEST FAILED **, Error code: (0x%x)\n", err_code); + + if(!err_code) return 0; + else return 2; +} +/* Timer polling test */ +int Timer_Poll(void) +{ + int err_code = 0; /* Variable to record errors */ + int Reload = 0; /* Read back value of reload */ + + /* Stage 3 Test sequence + - timer interrupt is disabled at NVIC + - timer is started + - each time the timer interrupt status register is set (timer overflow), + the counter variable (timer_irq_counter) increments and the interrupt status is cleared. + - the loop is executed three times + */ + printf ("\nStage 3 - Polling\n\n"); + + NVIC_DisableIRQ(TIMER0_IRQn); /*disable IRQ ready to test polling*/ + // Also enable the Timer IRQ since the test relies on reading the IRQ status + // as non-zero to progress - should be enabled by the previous part, but the + // behaviour of that part could be different if there are wait-states in the + // memory system, and hence it could leave the Timer IRQ disabled + CMSDK_timer_EnableIRQ(CMSDK_TIMER0); + CMSDK_timer_SetReload(CMSDK_TIMER0,0xF00); /*reload timer and start it*/ + + Reload = CMSDK_timer_GetReload(CMSDK_TIMER0); + + if(Reload == 0xF00) { + puts("Timer Reload Initialised as 0xF00"); /*check for reload value */ + } + else{ + err_code = (1 << 0); + printf("** TEST FAILED **, Error code: (0x%x)\n", err_code); + } + + CMSDK_timer_StartTimer(CMSDK_TIMER0); + + timer_irq_counter = 0; /* irq counter is re-used for this test although polling is used */ + + do { + printf("Timer Status: %u\n", CMSDK_timer_StatusIRQ(CMSDK_TIMER0)); + + while (CMSDK_timer_StatusIRQ(CMSDK_TIMER0) == 0); /*wait until timer underflow*/ + printf("Timer Status: %u\n", CMSDK_timer_StatusIRQ(CMSDK_TIMER0)); + + CMSDK_timer_ClearIRQ(CMSDK_TIMER0); /*Test Timer status function 3 times by polling for interrupt*/ + timer_irq_counter ++; /*status then clearing the IRQ and repeating until 3 + interrupt requests have occurred*/ + + } while (timer_irq_counter<3); + + CMSDK_timer_StopTimer(CMSDK_TIMER0); /*read back of control register to make sure value is expected */ + + if((CMSDK_TIMER0->CTRL & CMSDK_TIMER_CTRL_EN_Msk) == 0) { + puts("\nTimer Stopped"); + } + else{ + err_code = (1 << 1); + printf("** TEST FAILED **, Error code: (0x%x)\n", err_code); + } + + if(!err_code) puts("** Timer Polling Test Passed\n"); + else printf("** TEST FAILED **, Error code: (0x%x)\n", err_code); + + if(!err_code) return 0; + else return 4; +} + +int Timer_Ext(void){ + + int test_disabled = 0; /* variable for stage 4b:to count tests carried out when timer is disabled by external input*/ + int test_enabled = 0; /* variable for stage 4b:to count tests carried out when timer is enabled by external input*/ + int test_error = 0; /* variable for stage 4b:to check the test error result */ + int enabled = 0; /* variable for stage 4b:to handle test_disabled and test_enabled variable */ + int counter = 0; /* loop counter */ + + puts ("\nStage 4 - Ext Stimuli\n"); + + /* Stage 4a Test sequence + - timer is configured to running with external clock + - timer is started + - each time the timer interrupt status register is set (timer overflow), + the counter variable (timer_irq_counter) increments and the interrupt status is cleared. + - the loop is executed to toggle the external clock input until timer interrupt triggers three times + */ + + puts ("\n -Stage 4a - Ext Clock\n"); + + timer_irq_counter = 0; + + NVIC_ClearPendingIRQ(TIMER0_IRQn); /*Clear pending IRQs before test started*/ + NVIC_EnableIRQ(TIMER0_IRQn); /*enable IRQs*/ + CMSDK_GPIO1->DATAOUT = 0x000; /*Set external clock input to 0 at start of test*/ + CMSDK_gpio_SetOutEnable(CMSDK_GPIO1, 0x100); /*set pin 8 as output so that it can be used as an external clock*/ + CMSDK_timer_Init_ExtClock(CMSDK_TIMER0, 0x100, 1);/*setup timer to use external clock*/ + + + while(timer_irq_counter < 3) + { + CMSDK_GPIO1->DATAOUT = 0x100; /*creates square wave on pin 8 to be used as the external clock*/ + __ISB(); + CMSDK_GPIO1->DATAOUT = 0x000; + if (timer_irq_executed != 0) + { + puts ("Timer IRQ"); + timer_irq_executed = 0; + } + } + + puts ("\n -Stage 4b - Ext Enable\n"); + + /* Stage 4b Test sequence + - Timer is configured to running with external enable + - Timer is enabled using ext input + - The external enable input is toggled for every iteration of the loop + to disable/enable the timer for the next iterations + - if the timer is enabled and the value of the timer is not the same as the previous value, + enable timer test is classed as passed. + - if the timer is disabled and the value of the timer is the same as the previous value + then the disable timer test is classed as passed. + - this process is repeated within one timer overflow and if neither any of the enable timer or disable timer + tests ever fail then the test as a whole (Stage 4b) passes. + */ + + timer_irq_executed = 0; + timer_irq_counter = 0; + counter = 0; /*counter used to count the external enable input toggle times*/ + + enabled = 1; /* used to indicate whether the timer is enabled or disabled (if enabled is even, + timer disabled, if enabled is odd, timer enabled) */ + + CMSDK_timer_Init_ExtEnable(CMSDK_TIMER0, 0xF00, 1); /*setup timer so that it uses an external enable*/ + CMSDK_GPIO1->DATAOUT = 0x100; /*set pin 8 (external enable) high so as to enable the timer*/ + + puts ("Timer 0 Enabled\n"); + + while(timer_irq_counter < 1) /* this test only execute within one timer overflow so that when timer is enabled + the sampled timer values are always different*/ + { + CMSDK_GPIO1->DATAOUT ^= 0x100; + /* XOR output port with 0x100 so as to invert the external enable signal*/ + enabled++; + temp_test = CMSDK_timer_GetValue(CMSDK_TIMER0); + /*record the timer value so that it can be tested whether or not the timer has actually been disabled or not*/ + + if((enabled % 2) == 0) //if timer is disabled i.e. enabled is even, increment the test_disabled counter + { + test_disabled = 1; + } + else // + { + test_enabled = 1; + } + + if((test_disabled == 1) && (test_enabled == 0)) + /*Disable pass condition - only pass if value doesn't change*/ + { + test_disabled = 0; + if(temp_test == CMSDK_timer_GetValue(CMSDK_TIMER0)) + /*if the value of the sampled value is the same as the current timer value, + then it can be inferred that the timer is disabled*/ + { + puts("Disable Test Passed"); + } + else + { + puts("** TEST FAILED ** Disable Test"); + test_error++; + } + } + else if((test_enabled ==1) && (test_disabled == 0)) + /*Enable pass condition - only pass if value is different*/ + { + test_enabled = 0; + if (temp_test != CMSDK_timer_GetValue(CMSDK_TIMER0)) + /*if the value of the sampled value is different from the current then + it can be inferred that the timer is enabled*/ + { + puts("Enable Test Passed"); + } + else + { + puts("** TEST FAILED ** Enable Test"); + test_error++; + } + } + + counter++; //Enable Toggle counter + + } + + printf("\nTimer enable/disable toggled %d times\n", counter); + if(test_error == 0) + { + puts("\nExt Stimuli Tests Completed Successfully\n"); + return 0; + } + else + { + printf("\n** TEST FAILED **, Error code: (0x%x)", test_error); + return 8; + } +} + +void TIMER0_Handler(void) /*Timer ISR*/ +{ + timer_irq_counter++; + timer_irq_executed=1; + if (timer_irq_counter>=3) { + CMSDK_timer_StopTimer(CMSDK_TIMER0); + } + CMSDK_timer_ClearIRQ(CMSDK_TIMER0); + return; +} + +// ---------------------------------------------------------- +// Peripheral detection +// ---------------------------------------------------------- +/* Detect the ARM ID and the part number to see if device is present */ +#define HW32_REG(ADDRESS) (*((volatile unsigned long *)(ADDRESS))) +#define HW8_REG(ADDRESS) (*((volatile unsigned char *)(ADDRESS))) +int timer0_id_check(void) +{ +unsigned char timer_id; + timer_id = HW8_REG(CMSDK_TIMER0_BASE + 0xFE8) & 0x07; + + if ((HW32_REG(CMSDK_TIMER0_BASE + 0xFE0) != 0x22) || + (HW32_REG(CMSDK_TIMER0_BASE + 0xFE4) != 0xB8) || + (timer_id != 0x03)) + return 1; /* part ID & ARM ID does not match */ + else + return 0; +} + +int gpio1_id_check(void) +{ +unsigned char gpio_id; + gpio_id = HW8_REG(CMSDK_GPIO1_BASE + 0xFE8) & 0x07; + + if ((HW32_REG(CMSDK_GPIO1_BASE + 0xFE0) != 0x20) || + (HW32_REG(CMSDK_GPIO1_BASE + 0xFE4) != 0xB8) || + (gpio_id != 0x03)) + return 1; /* part ID & ARM ID does not match */ + else + return 0; +} diff --git a/Cortex-M0/nanosoc/software/common/validation/timer_tests.c b/Cortex-M0/nanosoc/software/common/validation/timer_tests.c new file mode 100644 index 0000000..d0aa902 --- /dev/null +++ b/Cortex-M0/nanosoc/software/common/validation/timer_tests.c @@ -0,0 +1,824 @@ +/* + *----------------------------------------------------------------------------- + * The confidential and proprietary information contained in this file may + * only be used by a person authorised under and to the extent permitted + * by a subsisting licensing agreement from Arm Limited or its affiliates. + * + * (C) COPYRIGHT 2010-2013 Arm Limited or its affiliates. + * ALL RIGHTS RESERVED + * + * This entire notice must be reproduced on all copies of this file + * and copies of this file may only be made by a person if such person is + * permitted to do so under the terms of a subsisting license agreement + * from Arm Limited or its affiliates. + * + * SVN Information + * + * Checked In : $Date: 2017-10-10 15:55:38 +0100 (Tue, 10 Oct 2017) $ + * + * Revision : $Revision: 371321 $ + * + * Release Information : Cortex-M System Design Kit-r1p1-00rel0 + *----------------------------------------------------------------------------- + */ + +/* + A simple test to check the functionalities of APB timer +*/ + +#ifdef CORTEX_M0 +#include "CMSDK_CM0.h" +#endif + +#ifdef CORTEX_M0PLUS +#include "CMSDK_CM0plus.h" +#endif + +#ifdef CORTEX_M3 +#include "CMSDK_CM3.h" +#endif + +#ifdef CORTEX_M4 +#include "CMSDK_CM4.h" +#endif + +#include <stdio.h> +#include "uart_stdout.h" + +int timer_register_rw_test(CMSDK_TIMER_TypeDef *CMSDK_TIMER); +int timer_start_stop_test(CMSDK_TIMER_TypeDef *CMSDK_TIMER); +int timer_interrupt_test_1(CMSDK_TIMER_TypeDef *CMSDK_TIMER); +int timer_external_input(CMSDK_TIMER_TypeDef *CMSDK_TIMER); +int timer0_id_check(void); // Detect Timer 0 present +int timer1_id_check(void); // Detect Timer 1 present +int gpio1_id_check(void); // Detect GPIO 1 present + +/* Global variables */ +volatile int timer0_irq_occurred; +volatile int timer1_irq_occurred; +volatile int timer0_irq_expected; +volatile int timer1_irq_expected; +volatile int counter; + +/* peripheral and component ID values */ +#define APB_TIMER_PID4 0x04 +#define APB_TIMER_PID5 0x00 +#define APB_TIMER_PID6 0x00 +#define APB_TIMER_PID7 0x00 +#define APB_TIMER_PID0 0x22 +#define APB_TIMER_PID1 0xB8 +#define APB_TIMER_PID2 0x1B +#define APB_TIMER_PID3 0x00 +#define APB_TIMER_CID0 0x0D +#define APB_TIMER_CID1 0xF0 +#define APB_TIMER_CID2 0x05 +#define APB_TIMER_CID3 0xB1 +#define HW32_REG(ADDRESS) (*((volatile unsigned long *)(ADDRESS))) +#define HW8_REG(ADDRESS) (*((volatile unsigned char *)(ADDRESS))) + +int main (void) +{ + int result=0; + + // UART init + UartStdOutInit(); + + // Test banner message and revision number + puts("\nCortex Microcontroller System Design Kit - Timer Test - revision $Revision: 371321 $\n"); + + timer0_irq_occurred = 0; + timer1_irq_occurred = 0; + timer0_irq_expected = 0; + timer1_irq_expected = 0; + + puts("1) Timer 0"); + + if (timer0_id_check()==0) { /* Detect if timer is available */ + /* Timer 0 present */ + result += timer_register_rw_test(CMSDK_TIMER0); + result += timer_start_stop_test(CMSDK_TIMER0); + result += timer_interrupt_test_1(CMSDK_TIMER0); + + if (gpio1_id_check()==0) { + /* External input test need GPIO 1 to generate input */ + result += timer_external_input(CMSDK_TIMER0); + } else { + puts ("- GPIO #1 not present. Test skipped."); + } + + } else { + puts ("- Timer #0 not present. Tests skipped."); + } + + + puts("\n2) Timer 1"); + + if (timer1_id_check()==0) { /* Detect if timer is available */ + /* Timer 1 present */ + result += timer_register_rw_test(CMSDK_TIMER1); + result += timer_start_stop_test(CMSDK_TIMER1); + result += timer_interrupt_test_1(CMSDK_TIMER1); + if (gpio1_id_check()==0) { + /* External input test need GPIO 1 to generate input */ + result += timer_external_input(CMSDK_TIMER1); + } else { + puts ("- GPIO #1 not present. Test skipped."); + } + } else { + puts ("- Timer #1 not present. Tests skipped."); + } + + if (result==0) { + printf ("\n** TEST PASSED **\n"); + } else { + printf ("\n** TEST FAILED **\n, Error code = (0x%x)", result); + } + UartEndSimulation(); + return 0; +} +/* --------------------------------------------------------------- */ +/* Timer register read/write tests */ +/* --------------------------------------------------------------- */ + +int timer_register_rw_test(CMSDK_TIMER_TypeDef *CMSDK_TIMER){ + int return_val=0; + int err_code=0; + unsigned int timer_base; + puts("Timer R/W test"); + puts("- initial values"); + + NVIC_DisableIRQ(TIMER0_IRQn); + NVIC_DisableIRQ(TIMER1_IRQn); + + if (CMSDK_TIMER->CTRL != 0) { err_code += (1<<0); } + if (CMSDK_TIMER->VALUE != 0) { err_code += (1<<1); } + if (CMSDK_TIMER->RELOAD != 0) { err_code += (1<<2); } + if (CMSDK_TIMER->INTSTATUS != 0) { err_code += (1<<3); } + + timer_base = CMSDK_TIMER0_BASE; + if (CMSDK_TIMER==CMSDK_TIMER1) {timer_base = CMSDK_TIMER1_BASE;} + + // Perform a write access to all PIDs + HW32_REG(timer_base + 0xFD0) = 0xFFFFFFFF; + HW32_REG(timer_base + 0xFD4) = 0xFFFFFFFF; + HW32_REG(timer_base + 0xFD8) = 0xFFFFFFFF; + HW32_REG(timer_base + 0xFDC) = 0xFFFFFFFF; + HW32_REG(timer_base + 0xFE0) = 0xFFFFFFFF; + HW32_REG(timer_base + 0xFE4) = 0xFFFFFFFF; + HW32_REG(timer_base + 0xFE8) = 0xFFFFFFFF; + HW32_REG(timer_base + 0xFEC) = 0xFFFFFFFF; + HW32_REG(timer_base + 0xFF0) = 0xFFFFFFFF; + HW32_REG(timer_base + 0xFF4) = 0xFFFFFFFF; + HW32_REG(timer_base + 0xFF8) = 0xFFFFFFFF; + HW32_REG(timer_base + 0xFFC) = 0xFFFFFFFF; + + if (HW32_REG(timer_base + 0xFD0) != APB_TIMER_PID4) {err_code += (1<<4); } + if (HW32_REG(timer_base + 0xFD4) != APB_TIMER_PID5) {err_code += (1<<5); } + if (HW32_REG(timer_base + 0xFD8) != APB_TIMER_PID6) {err_code += (1<<6); } + if (HW32_REG(timer_base + 0xFDC) != APB_TIMER_PID7) {err_code += (1<<7); } + if (HW32_REG(timer_base + 0xFE0) != APB_TIMER_PID0) {err_code += (1<<8); } + if (HW32_REG(timer_base + 0xFE4) != APB_TIMER_PID1) {err_code += (1<<9); } + if (HW32_REG(timer_base + 0xFE8) != APB_TIMER_PID2) {err_code += (1<<10); } + if (HW32_REG(timer_base + 0xFEC) != APB_TIMER_PID3) {err_code += (1<<11); } + if (HW32_REG(timer_base + 0xFF0) != APB_TIMER_CID0) {err_code += (1<<12); } + if (HW32_REG(timer_base + 0xFF4) != APB_TIMER_CID1) {err_code += (1<<13); } + if (HW32_REG(timer_base + 0xFF8) != APB_TIMER_CID2) {err_code += (1<<14); } + if (HW32_REG(timer_base + 0xFFC) != APB_TIMER_CID3) {err_code += (1<<15); } + + + if (err_code != 0) { + printf ("ERROR : initial value failed (0x%x)\n", err_code); + return_val=1; + err_code = 0; + } + puts("- read/write"); + + CMSDK_TIMER->VALUE = 0x3355AAFF; + if (CMSDK_TIMER->VALUE != 0x3355AAFF) { err_code += (1<<0); } + CMSDK_TIMER->VALUE = 0xCCAA5500; + if (CMSDK_TIMER->VALUE != 0xCCAA5500) { err_code += (1<<1); } + CMSDK_TIMER->VALUE = 0x00000000; + if (CMSDK_TIMER->VALUE != 0x00000000) { err_code += (1<<2); } + + CMSDK_TIMER->RELOAD = 0x3355AAFF; + if (CMSDK_TIMER->RELOAD != 0x3355AAFF) { err_code += (1<<3); } + CMSDK_TIMER->RELOAD = 0xCCAA5500; + if (CMSDK_TIMER->RELOAD != 0xCCAA5500) { err_code += (1<<4); } + CMSDK_TIMER->RELOAD = 0x00000000; + if (CMSDK_TIMER->RELOAD != 0x00000000) { err_code += (1<<5); } + + CMSDK_TIMER->CTRL = 0x01; /* Set enable */ + if (CMSDK_TIMER->CTRL != 0x01) { err_code += (1<<6); } + CMSDK_TIMER->CTRL = 0x02; /* external select */ + if (CMSDK_TIMER->CTRL != 0x02) { err_code += (1<<7); } + CMSDK_TIMER->CTRL = 0x04; /* external clock select */ + if (CMSDK_TIMER->CTRL != 0x04) { err_code += (1<<8); } + CMSDK_TIMER->CTRL = 0x08; /* external clock select */ + if (CMSDK_TIMER->CTRL != 0x08) { err_code += (1<<9); } + CMSDK_TIMER->CTRL = 0x00; /* all clear */ + if (CMSDK_TIMER->CTRL != 0x00) { err_code += (1<<10); } + + /* Trigger timer interrupt status */ + CMSDK_TIMER->RELOAD = 0x3; + CMSDK_TIMER->VALUE = 0x3; + CMSDK_TIMER->CTRL = 0x9; /* enable with internal clock as source */ + while ( CMSDK_TIMER->INTSTATUS == 0); + CMSDK_TIMER->CTRL = 0x0; /* disable timer */ + if (CMSDK_TIMER->INTSTATUS != 0x01) { err_code += (1<<11); } + CMSDK_TIMER->INTCLEAR = 0x1; /* clear timer interrupt */ + if (CMSDK_TIMER->INTSTATUS != 0x00) { err_code += (1<<12); } + + /* Generate return value */ + if (err_code != 0) { + printf ("ERROR : Read/write failed (0x%x)\n", err_code); + return_val=1; + err_code = 0; + } + + NVIC_ClearPendingIRQ(TIMER0_IRQn); + NVIC_ClearPendingIRQ(TIMER1_IRQn); + + return(return_val); +} + +/* --------------------------------------------------------------- */ +/* Timer start/stop tests */ +/* --------------------------------------------------------------- */ +/* + Timer value set to 0x1000, and enabled. + A polling loop is then use to check that timer had decremented to 0x900 + within a certain period of time. A software variable called counter to + used to detect timeout, which make sure that the test report fail + if the timer does not decrement. + + The timer is then stopped, and the value is sampled twice and checked + that the timer is really stopped. + + The timer value is then set to 0x10, and then enabled, with interrupt feature + enabled (Note : NVIC is not enabled for this test so interrupt doesn't get + triggered). + A polling loop is then use to wait until timer reach zero and reloaded + (by checking interrupt status register). The current value of the timer + is then checked to make sure it is in the expected value range. + +*/ +int timer_start_stop_test(CMSDK_TIMER_TypeDef *CMSDK_TIMER){ + int return_val=0; + int err_code=0; + unsigned long tvalue; + puts("Timer start/stop test"); + puts("- timer enable"); + + NVIC_DisableIRQ(TIMER0_IRQn); + NVIC_DisableIRQ(TIMER1_IRQn); + + CMSDK_TIMER->RELOAD = 0x1000; + CMSDK_TIMER->VALUE = 0x1000; + CMSDK_TIMER->CTRL = 0x01; /* Set enable */ + counter = 0x100; /* Time out counter */ + while ((CMSDK_TIMER->VALUE > 0x900) && (counter>= 0)){ + counter --; + } + CMSDK_TIMER->CTRL = 0x00; /* stop timer for now */ + if (CMSDK_TIMER->VALUE > 0x900) { + puts("ERROR : Timer not decrementing."); + err_code += (1<<0); + } + + tvalue = CMSDK_TIMER->VALUE; + puts("- timer disable"); + __NOP(); + __NOP(); + if (CMSDK_TIMER->VALUE != tvalue) { + puts("ERROR : Timer not stopping."); + err_code += (1<<1); + } + + /* Check reload operation */ + puts("- timer reload"); + CMSDK_TIMER->VALUE = 0x10; + CMSDK_TIMER->CTRL = 0x09; /* Set enable, and interrupt generation */ + while ( CMSDK_TIMER->INTSTATUS == 0); + CMSDK_TIMER->CTRL = 0x00; /* Stop timer */ + if (CMSDK_TIMER->VALUE > CMSDK_TIMER->RELOAD) { + puts("ERROR : Timer reload fail 1."); + err_code += (1<<2); + } + if ( (CMSDK_TIMER->RELOAD - CMSDK_TIMER->VALUE) > 0x100 ) { + puts("ERROR : Timer reload fail 2."); + err_code += (1<<3); + } + + // Need to lower the interrupt in the timer before clearing in the NVIC + CMSDK_TIMER->INTCLEAR = 1; + // Clear the NVIC interrupts related to both timers to save working out which + // timer is currently being tested + NVIC_ClearPendingIRQ(TIMER0_IRQn); + NVIC_ClearPendingIRQ(TIMER1_IRQn); + + /* Generate return value */ + if (err_code != 0) { + printf ("ERROR : start/stop failed (0x%x)\n", err_code); + return_val=1; + err_code = 0; + } + + return(return_val); +} +/* --------------------------------------------------------------- */ +/* Timer interrupt test 1 */ +/* --------------------------------------------------------------- */ +/* + Interrupt enable: + Timer is enabled, with reload value set to 0x7F (128 cycles), + and timer interrupt is enabled. + check that timer interrupt has take place as least twice + when counter (software variable) is increased from 0 to 0x300. + If counter is > 0x300 but less than two timer interrupt is received + (timerx_irq_occurred < 2), then flag it as time out error. + + Interrupt disable: + Timer is enabled, with reload value set to 0x1F (32 cycles), + and timer interrupt is disabled. + The counter (software variable) is increased from 0 to 0x100. + Check that timer interrupt did not take place. + (timer0_irq_occurred and timer1_irq_occurred are 0). + +*/ +int timer_interrupt_test_1(CMSDK_TIMER_TypeDef *CMSDK_TIMER){ + int return_val=0; + int err_code=0; + + puts ("Timer interrupt test"); + puts ("- Test interrupt generation enabled."); + CMSDK_TIMER->VALUE = 0; /* Disable timer */ + + NVIC_DisableIRQ(TIMER0_IRQn); + NVIC_DisableIRQ(TIMER1_IRQn); + NVIC_ClearPendingIRQ(TIMER0_IRQn); + NVIC_ClearPendingIRQ(TIMER1_IRQn); + + /* Check which timer is being tested and setup software flags */ + if (CMSDK_TIMER==CMSDK_TIMER0) { + timer0_irq_expected = 1; + timer1_irq_expected = 0; + timer0_irq_occurred = 0; + timer1_irq_occurred = 0; + + NVIC_EnableIRQ(TIMER0_IRQn); /* Enable Timer Interrupt */ + + } + + if (CMSDK_TIMER==CMSDK_TIMER1) { + timer0_irq_expected = 0; + timer1_irq_expected = 1; + timer0_irq_occurred = 0; + timer1_irq_occurred = 0; + + NVIC_EnableIRQ(TIMER1_IRQn); /* Enable Timer Interrupt */ + + } + + + CMSDK_TIMER->RELOAD = 0x01FF; + CMSDK_TIMER->VALUE = 0x01FF; + CMSDK_TIMER->CTRL = 0x0009; /* Timer enabled */ + counter = 0; + if (CMSDK_TIMER==CMSDK_TIMER0) { + while (( timer0_irq_occurred < 2) && (counter < 0x300)){ + counter ++; + }; + CMSDK_TIMER->CTRL = 0x0000; /* Stop Timer */ + } + + if (CMSDK_TIMER==CMSDK_TIMER1) { + while (( timer1_irq_occurred < 2) && (counter < 0x300)){ + counter ++; + }; + CMSDK_TIMER->CTRL = 0x0000; /* Stop Timer */ + } + /* Check timeout has not occurred */ + if (counter >= 0x300) { + puts("ERROR : Timer interrupt enable fail."); + err_code += (1<<0); + } + counter = 0; + + puts ("- Test interrupt generation disabled."); + timer0_irq_expected = 0; + timer1_irq_expected = 0; + timer0_irq_occurred = 0; + timer1_irq_occurred = 0; + + CMSDK_TIMER->RELOAD = 0x001F; + CMSDK_TIMER->VALUE = 0x001F; + CMSDK_TIMER->CTRL = 0x0001; /* Timer enabled, with interrupt generation disabled */ + counter = 0; + while ((counter<0x100) && (timer0_irq_occurred==0) && (timer1_irq_occurred==0)) { + counter++; + } + CMSDK_TIMER->CTRL = 0x0000; /* Stop Timer */ + if ((timer0_irq_occurred!=0) || (timer1_irq_occurred!=0)) { + puts("ERROR : Timer interrupt disable fail."); + err_code += (1<<1); + } + counter = 0; + + NVIC_DisableIRQ(TIMER0_IRQn); + NVIC_DisableIRQ(TIMER1_IRQn); + + /* Generate return value */ + if (err_code != 0) { + printf ("ERROR : Interrupt test failed (0x%x)\n", err_code); + return_val=1; + err_code = 0; + } + + return(return_val); +} + +/* --------------------------------------------------------------- */ +/* Timer extin test 1 */ +/* --------------------------------------------------------------- */ +/* External input : + TIMER 0 - GPIO #1 [bit 8] + TIMER 1 - GPIO #1 [bit 9] + + Checking of external input as enable: + Timer is programmed so that it use external input as enable. + The external input is set to 0 (disabled), and the timer value is sample twice + to make sure it is not decrementing. + + The program then set the timer current value to 99, and then use the + SysTick timer to generate a pulse of 100 cycles on the timer + external input. This is done by + - setting up the SysTick to be triggered at every 100 cycles, + - the first timer SysTick interrupt is triggered, set ext input to 1 + - the second timer SysTick interrupt is triggered, set ext input to 0, and disable SysTick + After the SysTick exception is entered twice, it then check if the timer has underflowed. + (check current value range between 0xFF to 0xA0). + + Since the timer could be running at a divided APB clock speed which is half of the AHB, + the value check might fail in such configuration. If the current counter value is between + 30 and 60, generate another pulse of 100 clocks cycle to the external input and do the + check again. + + It then check the timer interrupt status, and the clearing of the interrupt status. + + ------------------------------------ + Checking of external input as clock: + The test then program the timer to use external input as "clock" (rising edge detection). + Timer starting value is set to 0xC0. + It first keep the external input as 0, and check that the timer current value hasn't been + changed. + + It then change the external input to 1, and check if the timer has decrement. (value = 0xBF) + + It then wait for a short period (counter variable decrement from 10 to 0), + then check that the timer has not been decremented further.(value = 0xBF) + + It then set external input to 0, again, wait for short period of time, + and check that the timer has not been decremented further.(value = 0xBF) + + It then generate 15 pulses on the external input, and check the timer has decrement + 15 times. (value = 0xB0) It also check that at this stage the timer interrupt status + should still be 0. + + It then set the timer value to 2, with interrupt generation enabled, use external input + as clock. The external input is then switched from 0 to 1, (value changed from 2 to 1) + and the timer interrupt shouldn't be triggered. (it should only trigger at 1 to 0 value + change). + + It then generate another pulse at the external input, and wait for a short period. + This time the timer interrupt should be triggered. + + it then clear up the interrupt settings and report test status. + +*/ +int timer_external_input(CMSDK_TIMER_TypeDef *CMSDK_TIMER){ + int return_val=0; + int err_code=0; + unsigned long tvalue; + uint32_t timer_value; + + puts ("Timer external input test"); + /* Set external inputs low */ + CMSDK_GPIO1->OUTENABLESET = (1<<8) | (1<<9); + CMSDK_GPIO1->UB_MASKED[3] = 0x0000; + + CMSDK_TIMER->RELOAD = 0x00FF; + CMSDK_TIMER->VALUE = 0x00FF; + CMSDK_TIMER->CTRL = 0x000B; /* Timer enabled, use external input, interrupt enabled */ + + tvalue = CMSDK_TIMER->VALUE; + puts("- timer use ext. input"); + __NOP(); /* Some delay is needed due to double flip-flop synchronization logic */ + __NOP(); + if (CMSDK_TIMER->VALUE != tvalue) { + puts("ERROR : Timer not stopping when external input is low."); + err_code += (1<<0); + } + + puts("- use SysTick to generate ext. input pulse"); + CMSDK_TIMER->VALUE = 0xFE; /* Use 0xFE so that it count to 0 */ + counter = 0; + NVIC_DisableIRQ(TIMER0_IRQn); + NVIC_DisableIRQ(TIMER1_IRQn); + NVIC_ClearPendingIRQ(TIMER0_IRQn); + NVIC_ClearPendingIRQ(TIMER1_IRQn); + + /* Create a pulse of approximately four times the length of the expected + * duration that the system timer will be counting down. + * APB is possibly running at half speed, but this should be allowed for by + * the fact that the SysTick reload value is set to a larger value than the + * system timer start value. This therefore should allow the system timer to + * count round multiple times, and should have the expected outcome + * regardless of whether APB is running at full speed or half speed + */ + SysTick->LOAD = (0x100<<2)-1; + SysTick->VAL = 0; + SysTick->CTRL = 0x7; /* Enable, use internal clock, interrupt enable */ + + while (counter < 2); /* SysTick handler trigger twice */ + + /* Timer should be reloaded, expected value between 0xA0 to 0xFF (reload value) */ + timer_value = CMSDK_TIMER->VALUE; + if ((timer_value > 0xFF) || (timer_value < 0xA0)) { + printf("ERROR : Timer not running when external input is high (0x%x).\n", timer_value); + err_code += (1<<1); + } + + /* Timer interrupt should be pending */ + if (((NVIC_GetPendingIRQ(TIMER0_IRQn)==0)&&(CMSDK_TIMER==CMSDK_TIMER0))|| + ((NVIC_GetPendingIRQ(TIMER1_IRQn)==0)&&(CMSDK_TIMER==CMSDK_TIMER1))) + { + puts("ERROR : Timer not trigger #1."); + err_code += (1<<2); + } + + if (CMSDK_TIMER->INTSTATUS==0) { + puts("ERROR : Timer not trigger #2."); + err_code += (1<<3); + } + else { + CMSDK_TIMER->INTCLEAR=1; /* Clear interrupt status */ + if (CMSDK_TIMER->INTSTATUS!=0) { + puts("ERROR : Timer not clear."); + err_code += (1<<4); + } + } + + NVIC_ClearPendingIRQ(TIMER0_IRQn); + NVIC_ClearPendingIRQ(TIMER1_IRQn); + + + puts("- use EXTIN as clock"); + CMSDK_TIMER->VALUE = 0xC0; + CMSDK_TIMER->CTRL = 0x0007; /* Timer enabled, use external input as clock, interrupt disabled */ + CMSDK_GPIO1->UB_MASKED[3] = 0x0000; + counter = 10; /* delay */ + while (counter > 0) { + counter --; + } + if (CMSDK_TIMER->VALUE != 0xC0) { + puts("ERROR : Timer change unexpectedly 1."); + err_code += (1<<5); + } + CMSDK_GPIO1->UB_MASKED[3] = 0x0300; /* Timer should decrement */ + __ISB(); + __ISB(); + + if (CMSDK_TIMER->VALUE != 0xBF) { + puts("ERROR : Timer decrement failed."); + err_code += (1<<6); + } + counter = 10; /* delay */ + while (counter > 0) { + counter --; + } + if (CMSDK_TIMER->VALUE != 0xBF) { + puts("ERROR : Timer change unexpectedly 2."); + err_code += (1<<7); + } + CMSDK_GPIO1->UB_MASKED[3] = 0x0000; /* Timer should NOT decrement */ + counter = 10; /* delay */ + while (counter > 0) { + counter --; + } + if (CMSDK_TIMER->VALUE != 0xBF) { + puts("ERROR : Timer change unexpectedly 3."); + err_code += (1<<8); + } + counter = 15; + while (counter > 0) { + CMSDK_GPIO1->UB_MASKED[3] = 0x0300; /* Timer should decrement */ + __ISB(); + CMSDK_GPIO1->UB_MASKED[3] = 0x0000; /* Timer should not decrement */ + counter --; + } + if (CMSDK_TIMER->VALUE != 0xB0) { + puts("ERROR : Timer counting failed"); + err_code += (1<<9); + } + + /* Check interrupt should not be trigger */ + if ((NVIC_GetPendingIRQ(TIMER0_IRQn)!=0)||(NVIC_GetPendingIRQ(TIMER1_IRQn)!=0)|| + (CMSDK_TIMER->INTSTATUS!=0)) + { + puts("ERROR : Timer IRQ set unexpectedly."); + err_code += (1<<10); + } + + puts("- IRQ at 1->0 transition"); + CMSDK_TIMER->VALUE = 0x02; + CMSDK_TIMER->CTRL = 0x000F; /* Timer enabled, use external input as clock, interrupt enabled */ + CMSDK_GPIO1->UB_MASKED[3] = 0x0000; + + timer0_irq_expected = 0; + timer1_irq_expected = 0; + timer0_irq_occurred = 0; + timer1_irq_occurred = 0; + + if (CMSDK_TIMER==CMSDK_TIMER0) { + NVIC_EnableIRQ(TIMER0_IRQn); + } + + if (CMSDK_TIMER==CMSDK_TIMER1) { + NVIC_EnableIRQ(TIMER1_IRQn); + } + + /* Test no IRQ generation for 2 to 1 transition */ + CMSDK_GPIO1->UB_MASKED[3] = 0x0300; /* Timer should decrement */ + __ISB(); + CMSDK_GPIO1->UB_MASKED[3] = 0x0000; /* Timer should not decrement */ + + counter = 10; /* delay */ + while (counter > 0) { + counter --; + } + + if (CMSDK_TIMER==CMSDK_TIMER0) { + timer0_irq_expected=1; + } + + if (CMSDK_TIMER==CMSDK_TIMER1) { + timer1_irq_expected=1; + } + + /* Test IRQ generation for 1 to 0 transition */ + CMSDK_GPIO1->UB_MASKED[3] = 0x0300; /* Timer should decrement */ + __ISB(); + CMSDK_GPIO1->UB_MASKED[3] = 0x0000; /* Timer should not decrement */ + + counter = 10; /* delay */ + while (counter > 0) { + counter --; + } + if (((CMSDK_TIMER==CMSDK_TIMER0)&&(timer0_irq_occurred==0))|| + ((CMSDK_TIMER==CMSDK_TIMER1)&&(timer1_irq_occurred==0))) { + puts("ERROR : Timer not trigger."); + err_code += (1<<11); + } + + timer0_irq_expected = 0; + timer1_irq_expected = 0; + timer0_irq_occurred = 0; + timer1_irq_occurred = 0; + + /* Test IRQ generation for 0 to RELOAD transition */ + CMSDK_GPIO1->UB_MASKED[3] = 0x0300; /* Timer should decrement */ + __ISB(); + CMSDK_GPIO1->UB_MASKED[3] = 0x0000; /* Timer should not decrement */ + + counter = 10; /* delay */ + while (counter > 0) { + counter --; + } + if ((timer0_irq_occurred!=0)||(timer1_irq_occurred!=0)) { + puts("ERROR : Timer triggered unexpectedly."); + err_code += (1<<12); + } + + NVIC_DisableIRQ(TIMER0_IRQn); + NVIC_DisableIRQ(TIMER1_IRQn); + NVIC_ClearPendingIRQ(TIMER0_IRQn); + NVIC_ClearPendingIRQ(TIMER1_IRQn); + + /* Clearing up */ + SysTick->CTRL = 0x0; + CMSDK_TIMER->CTRL = 0x00;/* Disable, use internal clock, interrupt enable */ + CMSDK_TIMER->RELOAD = 0x0000; + CMSDK_TIMER->VALUE = 0x0000; + CMSDK_GPIO1->OUTENABLECLR = 0xFFFF; + CMSDK_GPIO1->UB_MASKED[3] = 0x0000; + + timer0_irq_expected = 0; + timer1_irq_expected = 0; + timer0_irq_occurred = 0; + timer1_irq_occurred = 0; + + /* Generate return value */ + if (err_code != 0) { + printf ("ERROR : Interrupt test failed (0x%x)\n", err_code); + return_val=1; + err_code = 0; + } + + return(return_val); +} + +/* --------------------------------------------------------------- */ +/* Peripheral detection */ +/* --------------------------------------------------------------- */ +/* Detect the part number to see if device is present */ +int timer0_id_check(void) +{ +unsigned char timer_id; + timer_id = HW8_REG(CMSDK_TIMER0_BASE + 0xFE8) & 0x07; + + if ((HW32_REG(CMSDK_TIMER0_BASE + 0xFE0) != 0x22) || + (HW32_REG(CMSDK_TIMER0_BASE + 0xFE4) != 0xB8) || + (timer_id != 0x03)) + return 1; /* part ID & ARM ID does not match */ + else + return 0; +} + +int timer1_id_check(void) +{ +unsigned char timer_id; + timer_id = HW8_REG(CMSDK_TIMER1_BASE + 0xFE8) & 0x07; + + if ((HW32_REG(CMSDK_TIMER1_BASE + 0xFE0) != 0x22) || + (HW32_REG(CMSDK_TIMER1_BASE + 0xFE4) != 0xB8) || + (timer_id != 0x03)) + return 1; /* part ID & ARM ID does not match */ + else + return 0; +} + +int gpio1_id_check(void) +{ +unsigned char gpio_id; + gpio_id = HW8_REG(CMSDK_GPIO1_BASE + 0xFE8) & 0x07; + + if ((HW32_REG(CMSDK_GPIO1_BASE + 0xFE0) != 0x20) || + (HW32_REG(CMSDK_GPIO1_BASE + 0xFE4) != 0xB8) || + (gpio_id != 0x03)) + return 1; /* part ID & ARM ID does not match */ + else + return 0; +} + +/* --------------------------------------------------------------- */ +/* Timer exception handlers */ +/* --------------------------------------------------------------- */ + +void TIMER0_Handler(void) +{ + timer0_irq_occurred ++; + CMSDK_TIMER0->INTCLEAR = 1; + if (timer0_irq_expected ==0) { + puts ("ERROR : Unexpected Timer 0 interrupt occurred.\n"); + UartEndSimulation(); + while (1); + } + return; +} + +void TIMER1_Handler(void) +{ + timer1_irq_occurred ++; + CMSDK_TIMER1->INTCLEAR = 1; + if (timer1_irq_expected ==0) { + puts ("ERROR : Unexpected Timer 1 interrupt occurred.\n"); + UartEndSimulation(); + while (1); + } + return; +} +/* --------------------------------------------------------------- */ +/* SysTick exception handlers */ +/* --------------------------------------------------------------- */ +void SysTick_Handler(void) +{ + switch (counter) { + case 0 : + /* Assert the EXTIN to the system timer */ + CMSDK_GPIO1->UB_MASKED[3] = 0x0300; + counter ++; + break; + case 1 : + CMSDK_GPIO1->UB_MASKED[3] = 0x0000; + SysTick->CTRL = 0; + SCB->ICSR = SCB->ICSR & 0xFDFFFFFF; /* Clear SysTick pending bit */ + counter ++; + break; + default: + SysTick->CTRL = 0; + SCB->ICSR = SCB->ICSR & 0xFDFFFFFF; /* Clear SysTick pending bit */ + break; + } + return; +} + diff --git a/Cortex-M0/nanosoc/software/common/validation/uart_driver_tests.c b/Cortex-M0/nanosoc/software/common/validation/uart_driver_tests.c new file mode 100644 index 0000000..544f45c --- /dev/null +++ b/Cortex-M0/nanosoc/software/common/validation/uart_driver_tests.c @@ -0,0 +1,408 @@ +/* + *----------------------------------------------------------------------------- + * The confidential and proprietary information contained in this file may + * only be used by a person authorised under and to the extent permitted + * by a subsisting licensing agreement from Arm Limited or its affiliates. + * + * (C) COPYRIGHT 2010-2013 Arm Limited or its affiliates. + * ALL RIGHTS RESERVED + * + * This entire notice must be reproduced on all copies of this file + * and copies of this file may only be made by a person if such person is + * permitted to do so under the terms of a subsisting license agreement + * from Arm Limited or its affiliates. + * + * SVN Information + * + * Checked In : $Date: 2017-10-10 15:55:38 +0100 (Tue, 10 Oct 2017) $ + * + * Revision : $Revision: 371321 $ + * + * Release Information : Cortex-M System Design Kit-r1p1-00rel0 + *----------------------------------------------------------------------------- + */ + +/* + A simple test to check the functionalities of UART functions in the example device driver. +*/ + +#ifdef CORTEX_M0 +#include "CMSDK_CM0.h" +#endif + +#ifdef CORTEX_M0PLUS +#include "CMSDK_CM0plus.h" +#endif + +#ifdef CORTEX_M3 +#include "CMSDK_CM3.h" +#endif + +#ifdef CORTEX_M4 +#include "CMSDK_CM4.h" +#endif + +#include <stdio.h> +#include "string.h" +#include "uart_stdout.h" +#include "CMSDK_driver.h" + +/* variables shared between interrupt handlers and test program code */ +int volatile uart_txorirq_executed = 0; /* set to 1 if UARTOVF0_Handler (tx overflow) executed */ +int volatile uart_txorirq_counter = 0; /* number of time UARTOVF0_Handler executed */ +int volatile uart_data_received = 0; /* set to 1 if UARTRX1_Handler executed */ +int volatile uart_data_sent = 0; /* set to 1 if UARTTX0_Handler executed */ +int volatile uart_rxorirq_executed = 0; /* set to 1 if UARTOVF1_Handler (rx overflow) executed */ +int volatile uart_rxorirq_counter = 0; /* number of time UARTOVF1_Handler executed */ + +/* Test Functions declarations */ +int Uart_Init(void); /* Function to test UART initialization */ +int Uart_Buffull(void); /* Function to test UART buffer full */ +int Uart_OR(void); /* Function to test UART overrun */ +int Uart_IRQ(void); /* Function to test UART interrupt */ +int uart0_id_check(void); /* Detect UART 0 present */ +int uart1_id_check(void); /* Detect UART 1 present */ +int gpio1_id_check(void); /* Detect GPIO 1 present */ + +int main (void) +{ + int result = 0; + + // UART init + UartStdOutInit(); + + // Test banner message and revision number + puts("\nCortex Microcontroller System Design Kit - UART Driver Test - revision $Revision: 371321 $\n"); + + if ((uart0_id_check()!=0)||(uart1_id_check()!=0)||(gpio1_id_check()!=0)) { + puts("** TEST SKIPPED ** UART 0 / UART 1 / GPIO 1 not available"); + UartEndSimulation(); + return 0;} + + + result |= Uart_Init(); + result |= Uart_Buffull(); + result |= Uart_OR(); + result |= Uart_IRQ(); + + if (result == 0) { + puts("** TEST PASSED **\n"); + } else { + printf("** TEST FAILED **, Error code: (0x%x)\n", result); + } + + UartEndSimulation(); + return 0; +} + + +void UARTOVF0_Handler(void) /*UART0 Overrun ISR*/ +{ +if(CMSDK_uart_GetOverrunStatus(CMSDK_UART0) == 1){ + uart_txorirq_executed = 1; /*set TX Overrun flag*/ + uart_txorirq_counter++; /*increment TX Overrun counter*/ + CMSDK_uart_ClearOverrunStatus(CMSDK_UART0); /*clear UART0 Overrun IRQ*/ + } +} + +void UARTOVF1_Handler(void) /*UART1 Overrun ISR*/ +{ +if(CMSDK_uart_GetOverrunStatus(CMSDK_UART1) == 2){ + uart_rxorirq_executed = 1; /*set RX Overrun flag*/ + uart_rxorirq_counter++; /*increment RX Overrun counter*/ + CMSDK_uart_ClearOverrunStatus(CMSDK_UART1); /*clear UART1 Overrun IRQ*/ + } +} + +void UARTTX0_Handler(void) /*UART0 TX ISR*/ +{ + uart_data_sent = 1; /*set data sent flag*/ + CMSDK_uart_ClearTxIRQ(CMSDK_UART0); /*clear UART0 TX IRQ*/ +} + +void UARTRX1_Handler(void) /*UART1 RX ISR*/ +{ + uart_data_received = 1; /*set data received flag*/ + CMSDK_uart_ClearRxIRQ(CMSDK_UART1); /*clear UART1 RX IRQ*/ +} + +/* Initialize UART and check return status */ +int Uart_Init(void) +{ + int err_code = 0; + + puts("\nStage 1 UART Initialization\n"); //initialise UART0 and UART1 with Baud divider of 32 + //and all interrupts enabled and also tx and rx enabled + CMSDK_gpio_SetAltFunc(CMSDK_GPIO1, 0x000F); + if(CMSDK_uart_init(CMSDK_UART0, 0x20, 1, 1, 1, 1, 1, 1) == 0) + printf("UART0 Initialised Successfully (Baud Divider of: %d)\n", CMSDK_uart_GetBaudDivider(CMSDK_UART0)); + /* CMSDK_uart_init() returns 1 if the overflow status is non-zero */ + else + { + puts("UART0 Initialization Failed\n"); + err_code = 1; + } + if(CMSDK_uart_init(CMSDK_UART1, 0x20, 1, 1, 1, 1, 1, 1) == 0) + printf("UART1 Initialised Successfully (Baud Divider of: %d)\n", CMSDK_uart_GetBaudDivider(CMSDK_UART1)); + /* CMSDK_uart_init() returns 1 if the overflow status is non-zero */ + else + { + puts("UART1 Initialization Failed\n"); + err_code |= 2; + } + + if(!err_code) return 0; + else return 1; + } + + +int Uart_Buffull(void) //function for testing the Buffer full functions and simple transmission +{ + int err_code = 0; + int i, k; + char received[12] = {0,0,0,0, 0,0,0,0, 0,0,0,0}; + char transmit[12] = "hello world"; + + puts("\nStage 2 Simple Transmission - TX and RX Test\n"); + + i = 0; /* transmit character counter */ + k = 0; /* receive character counter */ + + while((CMSDK_uart_GetTxBufferFull(CMSDK_UART0) == 0)){ //while the TX buffer is not full send it data to transmit + CMSDK_UART0->DATA = (uint32_t)transmit[i]; + i++; + } + + if(CMSDK_uart_GetTxBufferFull(CMSDK_UART0)) puts("TX Buffer Full ...restarting transmission"); + else{ + err_code = (1 << 0); + printf("** TEST FAILED **, Error Code: (0x%x)", err_code); + } + + /*receive data from transmission and dispose of it*/ + + if(CMSDK_uart_GetRxBufferFull(CMSDK_UART1) == 1) CMSDK_uart_ReceiveChar(CMSDK_UART1); + else{ + err_code = (1 << 1); + printf("** TEST FAILED **, Error Code: (0x%x)", err_code); + } + + i = 0; + + while(k < 12){ //while received string is not the length of the original string + + if(CMSDK_uart_GetRxBufferFull(CMSDK_UART1) == 1){ //receive data from RX buffer when full + received[k] = CMSDK_uart_ReceiveChar(CMSDK_UART1); + printf("RX Buffer Full ...receiving data... %c\n", received[k]); + k++; + } + + /*Send data to TX buffer if the TX buffer is not + full and the RX buffer of UART1 is also not full. + The receive buffer status is checked because the + printf statement in the receive polling takes + long time so this code cannot handle maximum + throughput */ + + if((CMSDK_uart_GetTxBufferFull(CMSDK_UART0) == 0) && (CMSDK_uart_GetRxBufferFull(CMSDK_UART1) != 1)){ + if(i < 12){ + CMSDK_UART0->DATA = (uint32_t)transmit[i]; + i++; + } + } + } + printf("\nCharacters received: %s\n", received); //when all characters received print the received string + + if(strcmp(received, transmit)){ + err_code = 4; + puts("** TEST FAILED **, Error : Strings DO Not Match!"); + } + + if(!err_code) return 0; + else return 2; +} + +int Uart_OR(void) /*function to test driver Overrun functions*/ +{ + int i = 0, TX = 0, RX = 0, err_code = 0; + char transmit[12] = "hello world"; + + puts("\nStage 3 Polling"); + + puts("\n- Stage 3a Overrun Polling\n"); + + while(1) + { + if(i < 4) CMSDK_UART0->DATA = (uint32_t)'a'; //if the loop iteration, the value of i, is less + //that 4 then send the TX buffer data to cause a + while(i > 10){ //TX overrun if the loop iteration, i, is greater + CMSDK_UART0->DATA = (uint32_t)'a'; //than 10 then send the TX buffer to cause another + if(CMSDK_uart_GetOverrunStatus(CMSDK_UART0) == 1) break; //TX buffer overrun + } + + if(CMSDK_uart_GetOverrunStatus(CMSDK_UART0) == 1){ + puts("TX Buffer Overrun Occurred"); + CMSDK_uart_ClearOverrunStatus(CMSDK_UART0); + TX = 1; + }else if(CMSDK_uart_GetOverrunStatus(CMSDK_UART1) == 2){ + puts("RX Buffer Overrun Occurred"); //RX buffer overrun will occur as the data + CMSDK_uart_ClearOverrunStatus(CMSDK_UART1); //is never read from the RX buffer + RX = 1; + } + + i++; + if(RX & TX) break; + } + + puts("\n- Stage 3b TX & RX IRQ Polling\n"); + + //clear the TX IRQ status and then print the new status + CMSDK_uart_ClearTxIRQ(CMSDK_UART0); + printf("TX IRQ Status: %d\n", CMSDK_uart_GetTxIRQStatus(CMSDK_UART0)); + + if(CMSDK_uart_GetTxIRQStatus(CMSDK_UART0)) err_code = (1 << 0); + + //clear the RX IRQ status and then print the new status + CMSDK_uart_ClearRxIRQ(CMSDK_UART1); + printf("RX IRQ Status: %d\n", CMSDK_uart_GetRxIRQStatus(CMSDK_UART1)); + + if(CMSDK_uart_GetRxIRQStatus(CMSDK_UART1)) err_code = (1 << 1); + + CMSDK_uart_SendChar(CMSDK_UART0, transmit[1]); + + while(!CMSDK_uart_GetTxIRQStatus(CMSDK_UART0)); + printf("TX IRQ Status: %d\n", CMSDK_uart_GetTxIRQStatus(CMSDK_UART0)); //send data and wait until the TX IRQ status + if(!CMSDK_uart_GetTxIRQStatus(CMSDK_UART0)) err_code = (1 << 2); //is set and then print the new status + else CMSDK_uart_ClearTxIRQ(CMSDK_UART0); + + + while(!CMSDK_uart_GetRxIRQStatus(CMSDK_UART1)); + printf("RX IRQ Status: %d\n", CMSDK_uart_GetRxIRQStatus(CMSDK_UART1)); //send data and wait until the RX IRQ status + if(!CMSDK_uart_GetRxIRQStatus(CMSDK_UART1)) err_code = (1 << 3); //is set and then print the new status + else CMSDK_uart_ClearRxIRQ(CMSDK_UART1); + + + + if(err_code){ + printf("** TEST FAILED **, Polling Test Error Code: (0x%x)", err_code); + } + else puts("Polling Test Passed"); + + if(!err_code) return 0; + else return 4; +} + +int Uart_IRQ(void){ + +/*function to test the TX & RX overrun IRQ functions and the TX and RX IRQ driver + functions using a simple interrupt orientated send and receive*/ + + int i = 0, j = 0; /* i=transmit character counter, j = receive character counter */ + int err_code = 0; + char received[12] = {0,0,0,0, 0,0,0,0, 0,0,0,0}; + char transmit[12] = "hello world"; + + puts("\nStage 4 IRQ\n"); + puts("- Stage 4a Overrun IRQ\n"); + + NVIC_EnableIRQ(UARTOVF0_IRQn); //enable both UART0 and UART1 overflow IRQs + NVIC_EnableIRQ(UARTOVF1_IRQn); + + while(uart_txorirq_counter <= 3) //repeat until 3 TX OR IRQs have occurred + { + if(uart_txorirq_executed){ + puts("UART TX Overrun IRQ"); //if an TX OR IRQ is performed then this variable is set, + uart_txorirq_executed = 0; //uart_txorirq_executed, and this statement will be printed + } + CMSDK_UART0->DATA = (uint32_t)'a'; //always send data to the TX buffer to cause TX OR and do not + if(uart_rxorirq_executed){ //receive data to cause RX OR + puts("UART RX Overrun IRQ"); + uart_rxorirq_executed = 0; + } + } + + if(uart_rxorirq_counter < 3){ + err_code = (1 << 0); + printf("** TEST FAILED ** UART RX Overrun Error, Error Code: (0x%x)", err_code); + } + else puts("UART RX Overrun Passed"); + + j = 0; + uart_data_received = 1; //set uart_data_received to one so that the first character is sent + + puts("\n- Stage 4b TX/RX IRQ\n"); + + /*- Send a character from the transmit variable + - When its received by UART1 transfer it from RX buffer to the received variable + - set flag to say it's been received + - when received flag has been set send the next character from transmit variable + - repeat until all characters have been received*/ + + NVIC_EnableIRQ(UARTTX0_IRQn); //enable both UART0 TX and UART1 RX IRQs + NVIC_EnableIRQ(UARTRX1_IRQn); + + while(j < 11) /*while j, the received character counter, is less than 11, the number of characters to be sent*/ + { /* uart_data_received and uart_data_sent are updated by TX and RX handlers */ + if(uart_data_received){ + puts("UART TX IRQ ....data sent"); //if the data has been received (which is set in the + CMSDK_uart_SendChar(CMSDK_UART0, transmit[i]); //RX IRQ) then send the character corresponding to + i++; //the character counter, i, increment character counter + uart_data_received = 0; + } + if(uart_data_sent){ //if the data has been set (which is set in the + printf("UART RX IRQ ....data received.... "); //TX IRQ) then receive the character corresponding to + received[j] = CMSDK_uart_ReceiveChar(CMSDK_UART1); //the character counter, j, increment character counter + printf("%c\n", received[j]); + j++; + uart_data_sent = 0; + } + } + + printf("\nString received: %s\n\n", received); + + if(strcmp(received, transmit)){ + err_code = 1; + puts("** TEST FAILED ** Strings Do Not Match!"); + } + + NVIC_DisableIRQ(UARTOVF0_IRQn); + NVIC_DisableIRQ(UARTOVF1_IRQn); //disable all the enabled IRQs + NVIC_DisableIRQ(UARTTX0_IRQn); + NVIC_DisableIRQ(UARTRX1_IRQn); + + if(!err_code) return 0; + else return 8; +} + +// ---------------------------------------------------------- +// Peripheral detection +// ---------------------------------------------------------- +/* Detect the part number to see if device is present */ +#define HW32_REG(ADDRESS) (*((volatile unsigned long *)(ADDRESS))) + +int uart0_id_check(void) +{ +if ((HW32_REG(CMSDK_UART0_BASE + 0xFE0) != 0x21) || + (HW32_REG(CMSDK_UART0_BASE + 0xFE4) != 0xB8)) + return 1; /* part ID does not match */ +else + return 0; +} + +int uart1_id_check(void) +{ +if ((HW32_REG(CMSDK_UART1_BASE + 0xFE0) != 0x21) || + (HW32_REG(CMSDK_UART1_BASE + 0xFE4) != 0xB8)) + return 1; /* part ID does not match */ +else + return 0; +} + +int gpio1_id_check(void) +{ +if ((HW32_REG(CMSDK_GPIO1_BASE + 0xFE0) != 0x20) || + (HW32_REG(CMSDK_GPIO1_BASE + 0xFE4) != 0xB8)) + return 1; /* part ID does not match */ +else + return 0; +} diff --git a/Cortex-M0/nanosoc/software/common/validation/uart_tests.c b/Cortex-M0/nanosoc/software/common/validation/uart_tests.c new file mode 100644 index 0000000..cf3b331 --- /dev/null +++ b/Cortex-M0/nanosoc/software/common/validation/uart_tests.c @@ -0,0 +1,1241 @@ +// +//----------------------------------------------------------------------------- +// The confidential and proprietary information contained in this file may +// only be used by a person authorised under and to the extent permitted +// by a subsisting licensing agreement from Arm Limited or its affiliates. +// +// (C) COPYRIGHT 2010-2013 Arm Limited or its affiliates. +// ALL RIGHTS RESERVED +// +// This entire notice must be reproduced on all copies of this file +// and copies of this file may only be made by a person if such person is +// permitted to do so under the terms of a subsisting license agreement +// from Arm Limited or its affiliates. +// +// SVN Information +// +// Checked In : $Date: 2017-10-10 15:55:38 +0100 (Tue, 10 Oct 2017) $ +// +// Revision : $Revision: 371321 $ +// +// Release Information : Cortex-M System Design Kit-r1p1-00rel0 +//----------------------------------------------------------------------------- +// + +// A simple test to check the functionalities of the APB UART + + +#ifdef CORTEX_M0 +#include "CMSDK_CM0.h" +#endif + +#ifdef CORTEX_M0PLUS +#include "CMSDK_CM0plus.h" +#endif + +#ifdef CORTEX_M3 +#include "CMSDK_CM3.h" +#endif + +#ifdef CORTEX_M4 +#include "CMSDK_CM4.h" +#endif + +#include <stdio.h> +#include <string.h> +#include "uart_stdout.h" + +#define UART_STATE_TXFULL CMSDK_UART_STATE_TXBF_Msk +#define UART_STATE_RXFULL CMSDK_UART_STATE_RXBF_Msk +#define UART_STATE_TXOVR CMSDK_UART_STATE_TXOR_Msk +#define UART_STATE_RXOVR CMSDK_UART_STATE_RXOR_Msk + +#define UART_CTRL_TXEN CMSDK_UART_CTRL_TXEN_Msk +#define UART_CTRL_RXEN CMSDK_UART_CTRL_RXEN_Msk +#define UART_CTRL_TXIRQEN CMSDK_UART_CTRL_TXIRQEN_Msk +#define UART_CTRL_RXIRQEN CMSDK_UART_CTRL_RXIRQEN_Msk +#define UART_CTRL_TXOVRIRQEN CMSDK_UART_CTRL_TXORIRQEN_Msk +#define UART_CTRL_RXOVRIRQEN CMSDK_UART_CTRL_RXORIRQEN_Msk +#define UART_CTRL_HIGHSPEEDTX CMSDK_UART_CTRL_HSTM_Msk + +#define UART_INTSTATE_TX 1 +#define UART_INTSTATE_RX 2 +#define UART_INTSTATE_TXOVR 4 +#define UART_INTSTATE_RXOVR 8 + +#define BAUDDIV_MASK 0x000FFFFF + +#define DISPLAY 1 +#define NO_DISPLAY 0 + +/* peripheral and component ID values */ +#define APB_UART_PID4 0x04 +#define APB_UART_PID5 0x00 +#define APB_UART_PID6 0x00 +#define APB_UART_PID7 0x00 +#define APB_UART_PID0 0x21 +#define APB_UART_PID1 0xB8 +#define APB_UART_PID2 0x1B +#define APB_UART_PID3 0x00 +#define APB_UART_CID0 0x0D +#define APB_UART_CID1 0xF0 +#define APB_UART_CID2 0x05 +#define APB_UART_CID3 0xB1 +#define HW32_REG(ADDRESS) (*((volatile unsigned long *)(ADDRESS))) + +/* Global variables */ +volatile int uart0_irq_occurred; +volatile int uart1_irq_occurred; +volatile int uart2_irq_occurred; +volatile int uart0_irq_expected; +volatile int uart1_irq_expected; +volatile int uart2_irq_expected; + +/* Function definitions */ +void UartIOConfig(void); +int uart_initial_value_check(CMSDK_UART_TypeDef *CMSDK_UART); +int simple_uart_test(CMSDK_UART_TypeDef *CMSDK_UART, unsigned int bauddiv, int verbose); +int simple_uart_baud_test(void); +int simple_uart_baud_test_single(CMSDK_UART_TypeDef *CMSDK_UART, + unsigned int tx_bauddiv,unsigned int rx_bauddiv,int verbose); +int uart_enable_ctrl_test(CMSDK_UART_TypeDef *CMSDK_UART); +int uart_tx_rx_irq_test(CMSDK_UART_TypeDef *CMSDK_UART); +int uart_tx_rx_overflow_test(CMSDK_UART_TypeDef *CMSDK_UART); +void delay_for_character(void); +int uart2_interrupt_test(void); +int uart0_id_check(void); /* Detect UART 0 present */ +int uart1_id_check(void); /* Detect UART 1 present */ +int gpio1_id_check(void); /* Detect GPIO 1 present */ + +int main (void) +{ + int result=0; + + // UART init + UartStdOutInit(); + + // Test banner message and revision number + puts("\nCortex Microcontroller System Design Kit - UART Test - revision $Revision: 371321 $\n"); + + if ((uart0_id_check()!=0)||(uart1_id_check()!=0)||(gpio1_id_check()!=0)) { + puts("** TEST SKIPPED ** UART 0 / UART 1 / GPIO 1 not available"); + UartEndSimulation(); + return 0;} + + uart0_irq_occurred = 0; + uart1_irq_occurred = 0; + uart0_irq_expected = 0; + uart1_irq_expected = 0; + + uart2_irq_occurred = 0; + uart2_irq_expected = 0; + + UartIOConfig(); + + result += uart_initial_value_check(CMSDK_UART0); + result += uart_initial_value_check(CMSDK_UART1); + + puts("\nUART 0 for transmit, UART 1 for receive\n"); + + result += simple_uart_test(CMSDK_UART0, 32, DISPLAY); + result += simple_uart_baud_test(); + result += uart_enable_ctrl_test(CMSDK_UART0); + result += uart_tx_rx_irq_test(CMSDK_UART0); + result += uart_tx_rx_overflow_test(CMSDK_UART0); + + puts("\nUART 1 for transmit, UART 0 for receive\n"); + + result += simple_uart_test(CMSDK_UART1, 16, DISPLAY); + result += uart_enable_ctrl_test(CMSDK_UART1); + result += uart_tx_rx_irq_test(CMSDK_UART1); + result += uart_tx_rx_overflow_test(CMSDK_UART1); + + puts("\nUART 2 interrupt connectivity test\n"); + result += uart2_interrupt_test(); + + if (result==0) { + printf ("\n** TEST PASSED **\n"); + } else { + printf ("\n** TEST FAILED ** , Error code = (0x%x)\n", result); + } + UartEndSimulation(); + return 0; +} + +void UartIOConfig(void) +{ /* UART0 and UART1 are arranged in cross over configuration. */ + /* Enable UART TXD functions for these pins */ + CMSDK_GPIO1->ALTFUNCSET = (1<<1) | (1<<3); + return; +} + +/* --------------------------------------------------------------- */ +/* UART initial value tests */ +/* --------------------------------------------------------------- */ +int uart_initial_value_check(CMSDK_UART_TypeDef *CMSDK_UART){ + int return_val=0; + int err_code=0; + unsigned int uart_base; + unsigned int i; + + puts("- check initial values"); + if (CMSDK_UART->DATA !=0) {err_code += (1<<0);} + if (CMSDK_UART->STATE !=0) {err_code += (1<<1);} + if (CMSDK_UART->CTRL !=0) {err_code += (1<<2);} + if (CMSDK_UART->INTSTATUS!=0) {err_code += (1<<3);} + if (CMSDK_UART->BAUDDIV !=0) {err_code += (1<<4);} + + uart_base = CMSDK_UART0_BASE; + if (CMSDK_UART==CMSDK_UART1) {uart_base = CMSDK_UART1_BASE;} + if (CMSDK_UART==CMSDK_UART2) {uart_base = CMSDK_UART2_BASE;} + + if (HW32_REG(uart_base + 0xFD0) != APB_UART_PID4) {err_code += (1<<5); } + if (HW32_REG(uart_base + 0xFD4) != APB_UART_PID5) {err_code += (1<<6); } + if (HW32_REG(uart_base + 0xFD8) != APB_UART_PID6) {err_code += (1<<7); } + if (HW32_REG(uart_base + 0xFDC) != APB_UART_PID7) {err_code += (1<<8); } + if (HW32_REG(uart_base + 0xFE0) != APB_UART_PID0) {err_code += (1<<9); } + if (HW32_REG(uart_base + 0xFE4) != APB_UART_PID1) {err_code += (1<<10); } + if (HW32_REG(uart_base + 0xFE8) != APB_UART_PID2) {err_code += (1<<11); } + if (HW32_REG(uart_base + 0xFEC) != APB_UART_PID3) {err_code += (1<<12); } + if (HW32_REG(uart_base + 0xFF0) != APB_UART_CID0) {err_code += (1<<13); } + if (HW32_REG(uart_base + 0xFF4) != APB_UART_CID1) {err_code += (1<<14); } + if (HW32_REG(uart_base + 0xFF8) != APB_UART_CID2) {err_code += (1<<15); } + if (HW32_REG(uart_base + 0xFFC) != APB_UART_CID3) {err_code += (1<<16); } + + /* test write to PIDs and CIDs - should be ignored */ + for (i=0; i <12; i++) { + HW32_REG(uart_base + 0xFD0 + (i<<2)) = ~HW32_REG(uart_base + 0xFD0 + (i<<2)); + } + + /* Check read back values again, should not be changed */ + if (HW32_REG(uart_base + 0xFD0) != APB_UART_PID4) {err_code |= (1<<5); } + if (HW32_REG(uart_base + 0xFD4) != APB_UART_PID5) {err_code |= (1<<6); } + if (HW32_REG(uart_base + 0xFD8) != APB_UART_PID6) {err_code |= (1<<7); } + if (HW32_REG(uart_base + 0xFDC) != APB_UART_PID7) {err_code |= (1<<8); } + if (HW32_REG(uart_base + 0xFE0) != APB_UART_PID0) {err_code |= (1<<9); } + if (HW32_REG(uart_base + 0xFE4) != APB_UART_PID1) {err_code |= (1<<10); } + if (HW32_REG(uart_base + 0xFE8) != APB_UART_PID2) {err_code |= (1<<11); } + if (HW32_REG(uart_base + 0xFEC) != APB_UART_PID3) {err_code |= (1<<12); } + if (HW32_REG(uart_base + 0xFF0) != APB_UART_CID0) {err_code |= (1<<13); } + if (HW32_REG(uart_base + 0xFF4) != APB_UART_CID1) {err_code |= (1<<14); } + if (HW32_REG(uart_base + 0xFF8) != APB_UART_CID2) {err_code |= (1<<15); } + if (HW32_REG(uart_base + 0xFFC) != APB_UART_CID3) {err_code |= (1<<16); } + + if (err_code != 0) { + printf ("ERROR : initial value failed (0x%x)\n", err_code); + return_val =1; + err_code = 0; + } + + return(return_val); +} + +/* --------------------------------------------------------------- */ +/* UART simple operation test */ +/* --------------------------------------------------------------- */ +int simple_uart_test(CMSDK_UART_TypeDef *CMSDK_UART, unsigned int bauddiv, int verbose) +{ + int return_val=0; + int err_code=0; + CMSDK_UART_TypeDef *TX_UART; + CMSDK_UART_TypeDef *RX_UART; + char received_text[20]; + const char transmit_text[20] = "Hello world\n"; + unsigned int tx_count; + unsigned int rx_count; + unsigned int str_size; + + puts("Simple test"); + UartPutc('-'); + UartPutc(' '); + + /* Determine which UART is the sender, and which UART is receiver */ + if (CMSDK_UART==CMSDK_UART0){ + TX_UART = CMSDK_UART0; + RX_UART = CMSDK_UART1; + } + else if (CMSDK_UART==CMSDK_UART1){ + TX_UART = CMSDK_UART1; + RX_UART = CMSDK_UART0; + } + else { + puts ("ERROR: Input parameter invalid in function 'simple_uart_test'."); + return 1; + } + + /* Both UART are programmed with the same baud rate */ + TX_UART->BAUDDIV = bauddiv; + if (TX_UART->BAUDDIV != bauddiv) { err_code += (1<<0);} + RX_UART->BAUDDIV = bauddiv; + if (RX_UART->BAUDDIV != bauddiv) { err_code += (1<<1);} + + TX_UART->CTRL = TX_UART->CTRL | UART_CTRL_TXEN; /* Set TX enable */ + if ((TX_UART->CTRL & UART_CTRL_TXEN)==0) { err_code += (1<<2);} + RX_UART->CTRL = RX_UART->CTRL | UART_CTRL_RXEN; /* Set RX enable */ + if ((RX_UART->CTRL & UART_CTRL_RXEN)==0) { err_code += (1<<3);} + + tx_count = 0; + rx_count = 0; + str_size = strlen(transmit_text); + do { /* test loop for both tx and rx process */ + /* tx process */ + if (((TX_UART->STATE & UART_STATE_TXFULL)==0)&&(tx_count<str_size)) { + TX_UART->DATA = transmit_text[tx_count]; + tx_count++; + } + /* rx process */ + if ((RX_UART->STATE & UART_STATE_RXFULL)!=0) { + received_text[rx_count] = RX_UART->DATA; + if (verbose) UartPutc((char) received_text[rx_count]); + rx_count++; + } + } while ( rx_count <str_size); + received_text[rx_count]=0; /* add NULL termination */ + + /* Added 3 additional null chars to overcome X-termination in test + when reads back X's beyond null char since a load 32-bit word + happens rather than a byte access. */ + received_text[rx_count+1]=0; /* add NULL termination */ + received_text[rx_count+2]=0; /* add NULL termination */ + received_text[rx_count+3]=0; /* add NULL termination */ + if (strcmp(transmit_text, received_text)!=0){ err_code += (1<<4);} + + TX_UART->CTRL = 0; /* Clear TX enable */ + RX_UART->CTRL = 0; /* Clear RX enable */ + + if (err_code != 0) { + printf ("ERROR : simple test failed (0x%x)\n", err_code); + return_val =1; + err_code = 0; + } + + return(return_val); +} +/* --------------------------------------------------------------- */ +/* UART baud rate operation test */ +/* --------------------------------------------------------------- */ +int simple_uart_baud_test(void) +{ + int return_val=0; + int err_code=0; + int i; + short int tx_bauddiv[10] = { + 63, 64, 35, 38, 40, 46, 85, 49, 51, 37}; + short int rx_bauddiv[10] = { + 63, 64, 35, 38, 40, 46, 85, 49, 51, 37}; + + puts("Data transfer test\n"); + + for (i=0; i<10; i++) { + /* Test TX and RX at same speed */ + if (simple_uart_baud_test_single(CMSDK_UART0, + tx_bauddiv[i], rx_bauddiv[i] , NO_DISPLAY)!=0) {err_code |= 0x1;}; + /* Test RX slower than TX */ + if (simple_uart_baud_test_single(CMSDK_UART0, + tx_bauddiv[i], (rx_bauddiv[i]+1), NO_DISPLAY)!=0) {err_code |= 0x2;}; + /* Test RX faster than TX */ + if (simple_uart_baud_test_single(CMSDK_UART0, + tx_bauddiv[i], (rx_bauddiv[i]-1), NO_DISPLAY)!=0) {err_code |= 0x4;}; + if (err_code != 0) { + printf ("ERROR : Baud rate test failed (0x%x) at loop %d\n", err_code, i); + return_val = 1; + err_code = 0; + } + else { + printf ("- bauddiv = %d done\n", tx_bauddiv[i]); + } + } + CMSDK_UART0->CTRL = 0; + CMSDK_UART1->CTRL = 0; + CMSDK_UART0->BAUDDIV = 0xFFFFFFFF; + if (CMSDK_UART0->BAUDDIV != (0xFFFFFFFF & BAUDDIV_MASK)) {err_code |= (1<<0);}; + CMSDK_UART0->BAUDDIV = 0xFF55AAC3; + if (CMSDK_UART0->BAUDDIV != (0xFF55AAC3 & BAUDDIV_MASK)) {err_code |= (1<<1);}; + CMSDK_UART0->BAUDDIV = 0x00000000; + if (CMSDK_UART0->BAUDDIV != (0x00000000 & BAUDDIV_MASK)) {err_code |= (1<<2);}; + CMSDK_UART1->BAUDDIV = 0xFFFFFFFF; + if (CMSDK_UART1->BAUDDIV != (0xFFFFFFFF & BAUDDIV_MASK)) {err_code |= (1<<3);}; + CMSDK_UART1->BAUDDIV = 0xAAFF6699; + if (CMSDK_UART1->BAUDDIV != (0xAAFF6699 & BAUDDIV_MASK)) {err_code |= (1<<4);}; + CMSDK_UART1->BAUDDIV = 0x00000000; + if (CMSDK_UART1->BAUDDIV != (0x00000000 & BAUDDIV_MASK)) {err_code |= (1<<5);}; + if (err_code != 0) { + printf ("ERROR : Baud rate r/w failed (0x%x)\n", err_code); + return_val = 1; + err_code = 0; + } + + + return(return_val); + +} +/* --------------------- */ +int simple_uart_baud_test_single(CMSDK_UART_TypeDef *CMSDK_UART, + unsigned int tx_bauddiv, + unsigned int rx_bauddiv, + int verbose) +{ + int return_val=0; + int err_code=0; + CMSDK_UART_TypeDef *TX_UART; + CMSDK_UART_TypeDef *RX_UART; + char received_text[20]; + const char transmit_text[20] = "Hello world\n"; + unsigned int tx_count; + unsigned int rx_count; + unsigned int str_size; + + /* Determine which UART is the sender, and which UART is receiver */ + if (CMSDK_UART==CMSDK_UART0){ + TX_UART = CMSDK_UART0; + RX_UART = CMSDK_UART1; + } + else if (CMSDK_UART==CMSDK_UART1){ + TX_UART = CMSDK_UART1; + RX_UART = CMSDK_UART0; + } + else { + puts ("ERROR: Input parameter invalid in function 'simple_uart_baud_test_single'."); + return 1; + } + + /* UART can be programmed with different baud rate */ + TX_UART->BAUDDIV = tx_bauddiv; + if (TX_UART->BAUDDIV != tx_bauddiv) { err_code += (1<<0);} + RX_UART->BAUDDIV = rx_bauddiv; + if (RX_UART->BAUDDIV != rx_bauddiv) { err_code += (1<<1);} + + TX_UART->CTRL = TX_UART->CTRL | UART_CTRL_TXEN; /* Set TX enable */ + if ((TX_UART->CTRL & UART_CTRL_TXEN)==0) { err_code += (1<<2);} + RX_UART->CTRL = RX_UART->CTRL | UART_CTRL_RXEN; /* Set RX enable */ + if ((RX_UART->CTRL & UART_CTRL_RXEN)==0) { err_code += (1<<3);} + + tx_count = 0; + rx_count = 0; + str_size = strlen(transmit_text); + do { /* test loop for both tx and rx process */ + /* tx process */ + if (((TX_UART->STATE & UART_STATE_TXFULL)==0)&&(tx_count<str_size)) { + TX_UART->DATA = transmit_text[tx_count]; + tx_count++; + } + /* rx process */ + if ((RX_UART->STATE & UART_STATE_RXFULL)!=0) { + received_text[rx_count] = RX_UART->DATA; + if (verbose) UartPutc((char) received_text[rx_count]); + rx_count++; + } + } while ( rx_count <str_size); + received_text[rx_count]=0; /* add NULL termination */ + + /* Added 3 additional null chars to overcome X-termination in test + when reads back X's beyond null char since a load 32-bit word + happens rather than a byte access. */ + received_text[rx_count+1]=0; /* add NULL termination */ + received_text[rx_count+2]=0; /* add NULL termination */ + received_text[rx_count+3]=0; /* add NULL termination */ + if (strcmp(transmit_text, received_text)!=0){ err_code += (1<<4);} + + TX_UART->CTRL = 0; /* Clear TX enable */ + RX_UART->CTRL = 0; /* Clear RX enable */ + + if (err_code != 0) { + printf ("ERROR : baud test failed (0x%x)\n", err_code); + return_val =1; + err_code = 0; + } + + return(return_val); +} +/* --------------------------------------------------------------- */ +/* UART enable control test */ +/* --------------------------------------------------------------- */ +int uart_enable_ctrl_test(CMSDK_UART_TypeDef *CMSDK_UART) +{ + int return_val=0; + int err_code=0; + CMSDK_UART_TypeDef *TX_UART; + CMSDK_UART_TypeDef *RX_UART; + char ctmp; + + /* Determine which UART is the sender, and which UART is receiver */ + if (CMSDK_UART==CMSDK_UART0){ + TX_UART = CMSDK_UART0; + RX_UART = CMSDK_UART1; + } + else if (CMSDK_UART==CMSDK_UART1){ + TX_UART = CMSDK_UART1; + RX_UART = CMSDK_UART0; + } + else { + puts ("ERROR: Input parameter invalid in function 'uart_enable_ctrl_test'."); + return 1; + } + + puts ("UART enable test"); + /* UART programmed with same baud rate */ + TX_UART->BAUDDIV = 32; + if (TX_UART->BAUDDIV != 32) { err_code += (1<<0);} + RX_UART->BAUDDIV = 32; + if (RX_UART->BAUDDIV != 32) { err_code += (1<<1);} + + puts ("- both TX and RX are enabled"); + TX_UART->CTRL = TX_UART->CTRL | UART_CTRL_TXEN; /* Set TX enable */ + if ((TX_UART->CTRL & UART_CTRL_TXEN)==0) { err_code += (1<<2);} + RX_UART->CTRL = RX_UART->CTRL | UART_CTRL_RXEN; /* Set RX enable */ + if ((RX_UART->CTRL & UART_CTRL_RXEN)==0) { err_code += (1<<3);} + + if (((TX_UART->STATE & UART_STATE_TXFULL)!=0) || + ((RX_UART->STATE & UART_STATE_RXFULL)!=0)) { + /* Starting state incorrect */ + err_code += (1<<4);} + TX_UART->DATA = 'A'; /* transmit a character */ + delay_for_character(); + if (((TX_UART->STATE & UART_STATE_TXFULL)!=0) || + ((RX_UART->STATE & UART_STATE_RXFULL)==0)) { + /* complete state incorrect */ + err_code += (1<<5);} + ctmp = RX_UART->DATA; /* Read received data */ + if ((RX_UART->STATE & UART_STATE_RXFULL)!=0) { + /* receive buffer should be empty now */ + err_code += (1<<6);} + if ( ctmp != 'A') { /* received data incorrect */ + err_code += (1<<7);} + + puts ("- TX disabled"); + TX_UART->CTRL = TX_UART->CTRL & ~UART_CTRL_TXEN; /* Clear TX enable */ + if ((TX_UART->CTRL & UART_CTRL_TXEN)!=0) { err_code += (1<<8);} + + if (((TX_UART->STATE & UART_STATE_TXFULL)!=0) || + ((RX_UART->STATE & UART_STATE_RXFULL)!=0)) { + /* Starting state incorrect */ + err_code += (1<<9);} + TX_UART->DATA = 'B'; /* transmit a character */ + + /* When TX enable is low and a data is written to transmit buffer, the + data would be lost */ + delay_for_character(); + if ((RX_UART->STATE & UART_STATE_RXFULL)!=0) { + /* RX buffer should still be empty*/ + err_code += (1<<10);} + TX_UART->CTRL = TX_UART->CTRL | UART_CTRL_TXEN; /* Set TX enable */ + delay_for_character(); + + if (((TX_UART->STATE & UART_STATE_TXFULL)!=0) || + ((RX_UART->STATE & UART_STATE_RXFULL)!=0)) { + /* complete state incorrect */ + err_code += (1<<11);} + + puts ("- RX disabled"); + RX_UART->CTRL = RX_UART->CTRL & ~UART_CTRL_RXEN; /* Clear RX enable */ + if ((RX_UART->CTRL & UART_CTRL_RXEN)!=0) { err_code += (1<<12);} + + TX_UART->DATA = 'C'; /* transmit a character */ + delay_for_character(); + if (((TX_UART->STATE & UART_STATE_TXFULL)!=0) || + ((RX_UART->STATE & UART_STATE_RXFULL)!=0)) { + /* No data should be received. complete state incorrect */ + err_code += (1<<13);} + RX_UART->CTRL = RX_UART->CTRL | UART_CTRL_RXEN; /* Set RX enable */ + delay_for_character(); + if (((TX_UART->STATE & UART_STATE_TXFULL)!=0) || + ((RX_UART->STATE & UART_STATE_RXFULL)!=0)) { + /* No data should be received. complete state incorrect */ + err_code += (1<<14);} + + TX_UART->CTRL = 0; + RX_UART->CTRL = 0; + while ((RX_UART->STATE & UART_STATE_RXFULL)!=0) { + ctmp=RX_UART->DATA; + } + + if (err_code != 0) { + printf ("ERROR : uart enable failed (0x%x)\n", err_code); + return_val =1; + err_code = 0; + } + + return(return_val); +} +/* --------------------------------------------------------------- */ +/* UART tx & rx interrupt test */ +/* --------------------------------------------------------------- */ + +int uart_tx_rx_irq_test(CMSDK_UART_TypeDef *CMSDK_UART) +{ + int return_val=0; + unsigned int err_code=0; + CMSDK_UART_TypeDef *TX_UART; + CMSDK_UART_TypeDef *RX_UART; + char ctmp; + + /* Determine which UART is the sender, and which UART is receiver */ + if (CMSDK_UART==CMSDK_UART0){ + TX_UART = CMSDK_UART0; + RX_UART = CMSDK_UART1; + } + else if (CMSDK_UART==CMSDK_UART1){ + TX_UART = CMSDK_UART1; + RX_UART = CMSDK_UART0; + } + else { + puts ("ERROR: Input parameter invalid in function 'uart_tx_rx_irq_test'."); + return 1; + } + + puts ("UART TX & RX IRQ test"); + /* UART programmed with same baud rate */ + TX_UART->BAUDDIV = 33; + if (TX_UART->BAUDDIV != 33) { err_code += (1<<0);} + RX_UART->BAUDDIV = 33; + if (RX_UART->BAUDDIV != 33) { err_code += (1<<1);} + + puts ("- TX irq enable"); + if (CMSDK_UART==CMSDK_UART0){ + uart0_irq_expected=1; + uart1_irq_expected=0; + uart0_irq_occurred=0; + uart1_irq_occurred=0; + NVIC_EnableIRQ(UARTTX0_IRQn); + } + if (CMSDK_UART==CMSDK_UART1){ + uart0_irq_expected=0; + uart1_irq_expected=1; + uart0_irq_occurred=0; + uart1_irq_occurred=0; + NVIC_EnableIRQ(UARTTX1_IRQn); + } + + TX_UART->CTRL = UART_CTRL_TXEN | UART_CTRL_TXIRQEN; + RX_UART->CTRL = UART_CTRL_RXEN; + + if (((TX_UART->STATE & UART_STATE_TXFULL)!=0) | + ((RX_UART->STATE & UART_STATE_RXFULL)!=0)) { + /* Starting state incorrect */ + err_code += (1<<2);} + TX_UART->DATA = 'A'; /* transmit a character */ + delay_for_character(); + + if (CMSDK_UART==CMSDK_UART0){ + if (uart0_irq_occurred==0){ err_code += (1<<3);} + if (uart1_irq_occurred!=0){ err_code += (1<<4);} + } + if (CMSDK_UART==CMSDK_UART1){ + if (uart1_irq_occurred==0){ err_code += (1<<3);} + if (uart0_irq_occurred!=0){ err_code += (1<<4);} + } + /* Interrupt status should have been cleared */ + if (TX_UART->INTSTATUS != 0) { err_code += (1<<5);} + if (RX_UART->INTSTATUS != 0) { err_code += (1<<6);} + + /* Receive buffer should have been full */ + if ((RX_UART->STATE & UART_STATE_RXFULL) == 0) { err_code += (1<<7);} + ctmp = RX_UART->DATA; + if (ctmp!='A') { err_code += (1<<8);} + if ((RX_UART->STATE & UART_STATE_RXFULL) != 0) { err_code += (1<<9);} + + puts ("- TX irq disable"); + if (CMSDK_UART==CMSDK_UART0){ + uart0_irq_expected=0; + uart1_irq_expected=0; + uart0_irq_occurred=0; + uart1_irq_occurred=0; + NVIC_EnableIRQ(UARTTX0_IRQn); + } + if (CMSDK_UART==CMSDK_UART1){ + uart0_irq_expected=0; + uart1_irq_expected=0; + uart0_irq_occurred=0; + uart1_irq_occurred=0; + NVIC_EnableIRQ(UARTTX1_IRQn); + } + + TX_UART->CTRL = UART_CTRL_TXEN; /* No interrupt generation */ + RX_UART->CTRL = UART_CTRL_RXEN; /* No interrupt generation */ + + if (((TX_UART->STATE & UART_STATE_TXFULL)!=0) || + ((RX_UART->STATE & UART_STATE_RXFULL)!=0)) { + /* Starting state incorrect */ + err_code += (1<<10);} + TX_UART->DATA = 'B'; /* transmit a character */ + delay_for_character(); + + if (uart0_irq_occurred!=0){ err_code += (1<<11);} + if (uart1_irq_occurred!=0){ err_code += (1<<12);} + + /* Receive buffer should have been full */ + if ((RX_UART->STATE & UART_STATE_RXFULL) == 0) { err_code += (1<<13);} + ctmp = RX_UART->DATA; + if (ctmp!='B') { err_code += (1<<14);} + if ((RX_UART->STATE & UART_STATE_RXFULL) != 0) { err_code += (1<<15);} + + /* Interrupt status should have been cleared */ + if (TX_UART->INTSTATUS != 0) { err_code += (1<<16);} + if (RX_UART->INTSTATUS != 0) { err_code += (1<<17);} + + puts ("- RX irq enable"); + if (CMSDK_UART==CMSDK_UART0){ + uart0_irq_expected=0; + uart1_irq_expected=1; + uart0_irq_occurred=0; + uart1_irq_occurred=0; + NVIC_EnableIRQ(UARTRX1_IRQn); + } + if (CMSDK_UART==CMSDK_UART1){ + uart0_irq_expected=1; + uart1_irq_expected=0; + uart0_irq_occurred=0; + uart1_irq_occurred=0; + NVIC_EnableIRQ(UARTRX0_IRQn); + } + + TX_UART->CTRL = UART_CTRL_TXEN ; /* No interrupt generation */ + RX_UART->CTRL = UART_CTRL_RXEN | UART_CTRL_RXIRQEN; + + TX_UART->DATA = 'C'; /* transmit a character */ + delay_for_character(); + + if (CMSDK_UART==CMSDK_UART0){ + if (uart0_irq_occurred!=0){ err_code += (1<<18);} + if (uart1_irq_occurred==0){ err_code += (1<<19);} + } + if (CMSDK_UART==CMSDK_UART1){ + if (uart1_irq_occurred!=0){ err_code += (1<<18);} + if (uart0_irq_occurred==0){ err_code += (1<<19);} + } + /* Interrupt status should have been cleared */ + if (TX_UART->INTSTATUS != 0) { err_code += (1<<20);} + if (RX_UART->INTSTATUS != 0) { err_code += (1<<21);} + + /* Receive buffer should have been full */ + if ((RX_UART->STATE & UART_STATE_RXFULL) == 0) { err_code += (1<<22);} + ctmp = RX_UART->DATA; + if (ctmp!='C') { err_code += (1<<23);} + if ((RX_UART->STATE & UART_STATE_RXFULL) != 0) { err_code += (1<<24);} + + puts ("- RX irq disable"); + uart0_irq_expected=0; + uart1_irq_expected=0; + uart0_irq_occurred=0; + uart1_irq_occurred=0; + + TX_UART->CTRL = UART_CTRL_TXEN; /* No interrupt generation */ + RX_UART->CTRL = UART_CTRL_RXEN; /* No interrupt generation */ + + if (((TX_UART->STATE & UART_STATE_TXFULL)!=0) || + ((RX_UART->STATE & UART_STATE_RXFULL)!=0)) { + /* Starting state incorrect */ + err_code += (1<<25);} + TX_UART->DATA = 'D'; /* transmit a character */ + delay_for_character(); + + if (uart0_irq_occurred!=0){ err_code += (1<<26);} + if (uart1_irq_occurred!=0){ err_code += (1<<27);} + + /* Receive buffer should have been full */ + if ((RX_UART->STATE & UART_STATE_RXFULL) == 0) { err_code += (1<<28);} + ctmp = RX_UART->DATA; + if (ctmp!='D') { err_code += (1<<29);} + if ((RX_UART->STATE & UART_STATE_RXFULL) != 0) { err_code += (1<<30);} + + /* Interrupt status should have been cleared */ + if ((TX_UART->INTSTATUS != 0)||(RX_UART->INTSTATUS != 0)) { err_code |= 0x80000000UL;} + + /* clean up */ + + TX_UART->CTRL = 0; + RX_UART->CTRL = 0; + while ((RX_UART->STATE & UART_STATE_RXFULL)!=0) { + ctmp=RX_UART->DATA; + } + NVIC_DisableIRQ(UARTRX0_IRQn); + NVIC_DisableIRQ(UARTRX1_IRQn); + NVIC_DisableIRQ(UARTTX0_IRQn); + NVIC_DisableIRQ(UARTTX1_IRQn); + + if (err_code != 0) { + printf ("ERROR : uart interrupt enable failed (0x%x)\n", err_code); + return_val =1; + err_code = 0; + } + + return(return_val); +} + +/* --------------------------------------------------------------- */ +/* UART tx & rx overflow test */ +/* --------------------------------------------------------------- */ + +int uart_tx_rx_overflow_test(CMSDK_UART_TypeDef *CMSDK_UART) +{ + int return_val=0; + int err_code=0; + CMSDK_UART_TypeDef *TX_UART; + CMSDK_UART_TypeDef *RX_UART; + char ctmp; + int i; + + /* Determine which UART is the sender, and which UART is receiver */ + if (CMSDK_UART==CMSDK_UART0){ + TX_UART = CMSDK_UART0; + RX_UART = CMSDK_UART1; + } + else if (CMSDK_UART==CMSDK_UART1){ + TX_UART = CMSDK_UART1; + RX_UART = CMSDK_UART0; + } + else { + puts ("ERROR: Input parameter invalid in function 'uart_tx_rx_overflow_test'."); + return 1; + } + + puts ("UART TX & RX overflow test"); + /* UART programmed with same baud rate */ + TX_UART->BAUDDIV = 34; + if (TX_UART->BAUDDIV != 34) { err_code += (1<<0);} + RX_UART->BAUDDIV = 34; + if (RX_UART->BAUDDIV != 34) { err_code += (1<<1);} + + puts ("- TX without overflow"); + uart0_irq_expected=0; + uart1_irq_expected=0; + uart0_irq_occurred=0; + uart1_irq_occurred=0; + + TX_UART->CTRL = UART_CTRL_TXEN ; /* No interrupt generation */ + RX_UART->CTRL = UART_CTRL_RXEN ; /* No interrupt generation */ + + TX_UART->DATA = 'A'; + TX_UART->DATA = 'B'; + if ((TX_UART->STATE & UART_STATE_TXOVR)!=0) { err_code += (1<<2);} + for (i=0; i<2;i++) { + while ((RX_UART->STATE & UART_STATE_RXFULL)==0); /* wait for data */ + ctmp= RX_UART->DATA; + if (i==0) { + if (ctmp!='A') { err_code += (1<<3);} + } + if (i==1) { + if (ctmp!='B') { err_code += (1<<4);} + } + } + if ((RX_UART->STATE != 0)||(TX_UART->STATE != 0)) { err_code += (1<<5);} + + puts ("- TX with overflow"); + TX_UART->DATA = 'A'; + TX_UART->DATA = 'B'; + TX_UART->DATA = 'C'; + if ((TX_UART->STATE & UART_STATE_TXOVR)==0) { err_code += (1<<6);} + for (i=0; i<2;i++) { + while ((RX_UART->STATE & UART_STATE_RXFULL)==0); /* wait for data */ + ctmp= RX_UART->DATA; + if (i==0) { + if (ctmp!='A') { err_code += (1<<7);} + } + /* if i=1, data unpredictable */ + } + /* Overrun state should stay high */ + if ((TX_UART->STATE & UART_STATE_TXOVR)==0) { err_code += (1<<8);} + /* Overrun interrupt status should be low because TX overrun interrupt is not set */ + if ((TX_UART->INTSTATUS & UART_INTSTATE_TXOVR)!=0) { err_code += (1<<9);} + + TX_UART->CTRL = UART_CTRL_TXEN | UART_CTRL_TXOVRIRQEN; /* Enable overflow interrupt generation */ + /* Overrun interrupt status should be high now */ + if ((TX_UART->INTSTATUS & UART_INTSTATE_TXOVR)==0) { err_code += (1<<10);} + + /* enable the overflow interrupt in NVIC to trigger the overflow interrupt */ + if (CMSDK_UART==CMSDK_UART0){ + uart0_irq_expected=1; + uart1_irq_expected=0; + uart0_irq_occurred=0; + uart1_irq_occurred=0; + NVIC_EnableIRQ(UARTOVF0_IRQn); + } + if (CMSDK_UART==CMSDK_UART1){ + uart0_irq_expected=0; + uart1_irq_expected=1; + uart0_irq_occurred=0; + uart1_irq_occurred=0; + NVIC_EnableIRQ(UARTOVF1_IRQn); + } + + __DSB(); + __ISB(); + /* The interrupt should be taken */ + + /* Overrun state should be cleared by interrupt handler */ + if ((TX_UART->STATE & UART_STATE_TXOVR)!=0) { err_code += (1<<11);} + /* interrupt handler should be executed once */ + if ((CMSDK_UART==CMSDK_UART0)&&(uart0_irq_occurred==0)) { err_code += (1<<12);} + if ((CMSDK_UART==CMSDK_UART1)&&(uart1_irq_occurred==0)) { err_code += (1<<12);} + + TX_UART->CTRL = UART_CTRL_TXEN ; /* No interrupt generation */ + RX_UART->CTRL = UART_CTRL_RXEN ; /* No interrupt generation */ + + NVIC_DisableIRQ(UARTOVF0_IRQn); + NVIC_DisableIRQ(UARTOVF1_IRQn); + uart0_irq_expected = 0; + uart1_irq_expected = 0; + + puts ("- RX overflow"); + TX_UART->DATA = 'A'; + TX_UART->DATA = 'B'; + /* TX overflow should not occur */ + if ((TX_UART->STATE & UART_STATE_TXOVR)!=0) { err_code += (1<<13);} + /* wait until RX buffer full */ + while ((RX_UART->STATE & UART_STATE_RXFULL)==0); + /* Should not overflow yet */ + if ((RX_UART->STATE & UART_STATE_RXOVR)!=0) { err_code += (1<<14);} + /* wait until RX overflow */ + while ((RX_UART->STATE & UART_STATE_RXOVR)==0); + /* RX overflow interrupt should be low because RX overflow interrupt enable is not set */ + if ((RX_UART->INTSTATUS & UART_INTSTATE_RXOVR)!=0) { err_code += (1<<15);} + + RX_UART->CTRL = UART_CTRL_RXEN | UART_CTRL_RXOVRIRQEN; /* Enable overflow interrupt generation */ + /* Overrun interrupt status should be high now */ + if ((RX_UART->INTSTATUS & UART_INTSTATE_RXOVR)==0) { err_code += (1<<16);} + + /* enable the overflow interrupt in NVIC to trigger the overflow interrupt */ + if (CMSDK_UART==CMSDK_UART0){ + uart0_irq_expected=0; + uart1_irq_expected=1; + uart0_irq_occurred=0; + uart1_irq_occurred=0; + NVIC_EnableIRQ(UARTOVF1_IRQn); + } + if (CMSDK_UART==CMSDK_UART1){ + uart0_irq_expected=1; + uart1_irq_expected=0; + uart0_irq_occurred=0; + uart1_irq_occurred=0; + NVIC_EnableIRQ(UARTOVF0_IRQn); + } + + __DSB(); + __ISB(); + /* The interrupt should be taken */ + + /* Overrun state should be cleared by interrupt handler */ + if ((RX_UART->STATE & UART_STATE_RXOVR)!=0) { err_code += (1<<17);} + /* interrupt handler should be executed once */ + if ((CMSDK_UART==CMSDK_UART0)&&(uart1_irq_occurred==0)) { err_code += (1<<18);} + if ((CMSDK_UART==CMSDK_UART1)&&(uart0_irq_occurred==0)) { err_code += (1<<18);} + + + /* clean up */ + uart0_irq_expected=0; + uart1_irq_expected=0; + uart0_irq_occurred=0; + uart1_irq_occurred=0; + + TX_UART->CTRL = 0; + RX_UART->CTRL = 0; + while ((RX_UART->STATE & UART_STATE_RXFULL)!=0) { + ctmp=RX_UART->DATA; + } + + NVIC_DisableIRQ(UARTOVF0_IRQn); + NVIC_DisableIRQ(UARTOVF1_IRQn); + + if (err_code != 0) { + printf ("ERROR : uart overflow test failed (0x%x)\n", err_code); + return_val =1; + err_code = 0; + } + + return(return_val); +} + +/* --------------------------------------------------------------- */ +/* UART 2 interrupt connectivity test */ +/* --------------------------------------------------------------- */ +int uart2_interrupt_test(void){ + int return_val=0; + int err_code=0; + int i; + char ctmp; /* dummy variable for overflow test (data can be corrupted so it is not checked) */ + + + puts ("UART 2 interrupt connectivity test"); + + puts ("- UART 2 TX IRQ"); + CMSDK_UART2->CTRL = UART_CTRL_TXEN | UART_CTRL_TXIRQEN | UART_CTRL_HIGHSPEEDTX; + NVIC_EnableIRQ(UARTTX2_IRQn); + uart2_irq_expected = 1; + UartPutc('.'); + for (i=0; i<3;i++){ __ISB(); } /* small delay */ + CMSDK_UART2->CTRL = UART_CTRL_TXEN | UART_CTRL_HIGHSPEEDTX; + if (uart2_irq_occurred==0) { err_code += (1<<0);} + uart2_irq_occurred = 0; + NVIC_DisableIRQ(UARTTX2_IRQn); + + puts ("\n- UART 2 TX overflow IRQ"); + NVIC_EnableIRQ(UARTOVF2_IRQn); + CMSDK_UART2->CTRL = UART_CTRL_TXEN | UART_CTRL_TXOVRIRQEN | UART_CTRL_HIGHSPEEDTX; + CMSDK_UART2->DATA = '.'; + CMSDK_UART2->DATA = '.'; + CMSDK_UART2->DATA = '.'; + for (i=0; i<3;i++){ __ISB(); } /* small delay */ + if (uart2_irq_occurred==0) { err_code += (1<<1);} + uart2_irq_occurred = 0; + NVIC_DisableIRQ(UARTOVF2_IRQn); + + puts ("\n- UART 2 RX IRQ"); + /* UART 2 RXD is shared with GPIO1[4] */ + CMSDK_GPIO1->OUTENABLESET = (1<<4); + CMSDK_GPIO1->DATAOUT = CMSDK_GPIO1->DATAOUT | (1<<4); + NVIC_EnableIRQ(UARTRX2_IRQn); + CMSDK_UART2->CTRL = UART_CTRL_TXEN | UART_CTRL_RXEN | UART_CTRL_RXIRQEN | UART_CTRL_HIGHSPEEDTX; + CMSDK_GPIO1->DATAOUT = CMSDK_GPIO1->DATAOUT & ~(1<<4); + for (i=0; i<2;i++){ __ISB(); } /* small delay to create start bit */ + CMSDK_GPIO1->DATAOUT = CMSDK_GPIO1->DATAOUT | (1<<4); + delay_for_character(); + if (uart2_irq_occurred==0) { err_code += (1<<2);} + if ((CMSDK_UART2->STATE & UART_STATE_RXFULL)==0) { err_code += (1<<3);} + ctmp=CMSDK_UART2->DATA; + /*printf ("Receive data = 0x%x\n", ctmp);*/ + uart2_irq_occurred = 0; + NVIC_DisableIRQ(UARTRX2_IRQn); + + puts ("\n- UART 2 RX overflow IRQ"); + NVIC_EnableIRQ(UARTOVF2_IRQn); + CMSDK_UART2->CTRL = UART_CTRL_TXEN | UART_CTRL_RXEN | UART_CTRL_RXOVRIRQEN | UART_CTRL_HIGHSPEEDTX; + /* First character */ + CMSDK_GPIO1->DATAOUT = CMSDK_GPIO1->DATAOUT & ~(1<<4); + for (i=0; i<2;i++){ __ISB(); } /* small delay to create start bit */ + CMSDK_GPIO1->DATAOUT = CMSDK_GPIO1->DATAOUT | (1<<4); + delay_for_character(); + /* Second character */ + CMSDK_GPIO1->DATAOUT = CMSDK_GPIO1->DATAOUT & ~(1<<4); + for (i=0; i<2;i++){ __ISB(); } /* small delay to create start bit */ + CMSDK_GPIO1->DATAOUT = CMSDK_GPIO1->DATAOUT | (1<<4); + delay_for_character(); + if (uart2_irq_occurred==0) { err_code += (1<<4);} + + /* Remove receive data in buffer */ + while ((CMSDK_UART2->STATE & UART_STATE_RXFULL)!=0) { + ctmp=CMSDK_UART2->DATA; + } + /* clear up */ + uart2_irq_occurred = 0; + NVIC_DisableIRQ(UARTOVF2_IRQn); + CMSDK_UART2->CTRL = UART_CTRL_TXEN | UART_CTRL_HIGHSPEEDTX; + + CMSDK_GPIO1->OUTENABLECLR = (1<<4); + CMSDK_GPIO1->DATAOUT = CMSDK_GPIO1->DATAOUT & ~(1<<4); + uart2_irq_expected = 0; + + + + if (err_code != 0) { + printf ("ERROR : uart overflow test failed (0x%x)\n", err_code); + return_val =1; + err_code = 0; + } + + return(return_val); +} +/* --------------------------------------------------------------- */ +/* delay function to provide delay for one character */ +/* --------------------------------------------------------------- */ + +void delay_for_character(void) +{ + int i; + for (i=0; i<120;i++){ + __ISB(); + } + return; +} +/* --------------------------------------------------------------- */ +/* Peripheral ID detection to check if device is present */ +/* --------------------------------------------------------------- */ +int uart0_id_check(void) +{ +if ((HW32_REG(CMSDK_UART0_BASE + 0xFE0) != 0x21) || + (HW32_REG(CMSDK_UART0_BASE + 0xFE4) != 0xB8)) + return 1; /* part ID does not match */ +else + return 0; +} + +int uart1_id_check(void) +{ +if ((HW32_REG(CMSDK_UART1_BASE + 0xFE0) != 0x21) || + (HW32_REG(CMSDK_UART1_BASE + 0xFE4) != 0xB8)) + return 1; /* part ID does not match */ +else + return 0; +} + +int gpio1_id_check(void) +{ +if ((HW32_REG(CMSDK_GPIO1_BASE + 0xFE0) != 0x20) || + (HW32_REG(CMSDK_GPIO1_BASE + 0xFE4) != 0xB8)) + return 1; /* part ID does not match */ +else + return 0; +} +/* --------------------------------------------------------------- */ +/* UART interrupt handlers */ +/* --------------------------------------------------------------- */ +void UARTRX0_Handler(void) +{ + int err_code = 0; + if (uart0_irq_expected==0) {err_code += (1<<0);} + if ((CMSDK_UART0->INTSTATUS & UART_INTSTATE_RX)==0) {err_code += (1<<1);} + CMSDK_UART0->INTCLEAR = UART_INTSTATE_RX; /* Clear interrupt status */ + if ((CMSDK_UART0->INTSTATUS & UART_INTSTATE_RX)!=0) {err_code += (1<<2);} + uart0_irq_occurred++; + if (err_code != 0) { + printf ("ERROR : UART 0 RX handler failed (0x%x)\n", err_code); + UartEndSimulation(); + while(1); + } + return; +} + +void UARTTX0_Handler(void) +{ + int err_code = 0; + if (uart0_irq_expected==0) {err_code += (1<<0);} + if ((CMSDK_UART0->INTSTATUS & UART_INTSTATE_TX)==0) {err_code += (1<<1);} + CMSDK_UART0->INTCLEAR = UART_INTSTATE_TX; /* Clear interrupt status */ + if ((CMSDK_UART0->INTSTATUS & UART_INTSTATE_TX)!=0) {err_code += (1<<2);} + uart0_irq_occurred++; + if (err_code != 0) { + printf ("ERROR : UART 0 TX handler failed (0x%x)\n", err_code); + UartEndSimulation(); + while(1); + } + return; +} +void UARTRX1_Handler(void) +{ + int err_code = 0; + if (uart1_irq_expected==0) {err_code += (1<<0);} + if ((CMSDK_UART1->INTSTATUS & UART_INTSTATE_RX)==0) {err_code += (1<<1);} + CMSDK_UART1->INTCLEAR = UART_INTSTATE_RX; /* Clear interrupt status */ + if ((CMSDK_UART1->INTSTATUS & UART_INTSTATE_RX)!=0) {err_code += (1<<2);} + uart1_irq_occurred++; + if (err_code != 0) { + printf ("ERROR : UART 1 RX handler failed (0x%x)\n", err_code); + UartEndSimulation(); + while(1); + } + return; +} + +void UARTTX1_Handler(void) +{ + int err_code = 0; + if (uart1_irq_expected==0) {err_code += (1<<0);} + if ((CMSDK_UART1->INTSTATUS & UART_INTSTATE_TX)==0) {err_code += (1<<1);} + CMSDK_UART1->INTCLEAR = UART_INTSTATE_TX; /* Clear interrupt status */ + if ((CMSDK_UART1->INTSTATUS & UART_INTSTATE_TX)!=0) {err_code += (1<<2);} + uart1_irq_occurred++; + if (err_code != 0) { + printf ("ERROR : UART 1 TX handler failed (0x%x)\n", err_code); + UartEndSimulation(); + while(1); + } + return; +} +void UARTOVF0_Handler(void) +{ + int err_code = 0; + if (uart0_irq_expected==0) {err_code += (1<<0);} + if (((CMSDK_UART0->INTSTATUS & UART_INTSTATE_TXOVR)==0) & + ((CMSDK_UART0->INTSTATUS & UART_INTSTATE_RXOVR)==0)) {err_code += (1<<1);} + if ((CMSDK_UART0->INTSTATUS & UART_INTSTATE_TXOVR)!=0){ + CMSDK_UART0->STATE = UART_STATE_TXOVR; /* Clear TX overrun status */ + } + if ((CMSDK_UART0->INTSTATUS & UART_INTSTATE_RXOVR)!=0){ + CMSDK_UART0->STATE = UART_STATE_RXOVR; /* Clear RX overrun status */ + } + if ((CMSDK_UART0->INTSTATUS & UART_INTSTATE_TXOVR)!=0) {err_code += (1<<2);} + if ((CMSDK_UART0->INTSTATUS & UART_INTSTATE_RXOVR)!=0) {err_code += (1<<3);} + uart0_irq_occurred++; + if (err_code != 0) { + printf ("ERROR : UART 0 overrun handler failed (0x%x)\n", err_code); + UartEndSimulation(); + while(1); + } return; +} + +void UARTOVF1_Handler(void) +{ + int err_code = 0; + if (uart1_irq_expected==0) {err_code += (1<<0);} + if (((CMSDK_UART1->INTSTATUS & UART_INTSTATE_TXOVR)==0) & + ((CMSDK_UART1->INTSTATUS & UART_INTSTATE_RXOVR)==0)) {err_code += (1<<1);} + if ((CMSDK_UART1->INTSTATUS & UART_INTSTATE_TXOVR)!=0){ + CMSDK_UART1->STATE = UART_STATE_TXOVR; /* Clear TX overrun status */ + } + if ((CMSDK_UART1->INTSTATUS & UART_INTSTATE_RXOVR)!=0){ + CMSDK_UART1->STATE = UART_STATE_RXOVR; /* Clear RX overrun status */ + } + if ((CMSDK_UART1->INTSTATUS & UART_INTSTATE_TXOVR)!=0) {err_code += (1<<2);} + if ((CMSDK_UART1->INTSTATUS & UART_INTSTATE_RXOVR)!=0) {err_code += (1<<3);} + uart1_irq_occurred++; + if (err_code != 0) { + printf ("ERROR : UART 1 overrun handler failed (0x%x)\n", err_code); + UartEndSimulation(); + while(1); + } + return; +} +void UARTRX2_Handler(void) +{ + int err_code = 0; + if (uart2_irq_expected==0) {err_code += (1<<0);} + if ((CMSDK_UART2->INTSTATUS & UART_INTSTATE_RX)==0) {err_code += (1<<1);} + CMSDK_UART2->INTCLEAR = UART_INTSTATE_RX; /* Clear interrupt status */ + if ((CMSDK_UART2->INTSTATUS & UART_INTSTATE_RX)!=0) {err_code += (1<<2);} + uart2_irq_occurred++; + if (err_code != 0) { + printf ("ERROR : UART 2 RX handler failed (0x%x)\n", err_code); + UartEndSimulation(); + while(1); + } + return; +} + +void UARTTX2_Handler(void) +{ + int err_code = 0; + if (uart2_irq_expected==0) {err_code += (1<<0);} + if ((CMSDK_UART2->INTSTATUS & UART_INTSTATE_TX)==0) {err_code += (1<<1);} + CMSDK_UART2->INTCLEAR = UART_INTSTATE_TX; /* Clear interrupt status */ + if ((CMSDK_UART2->INTSTATUS & UART_INTSTATE_TX)!=0) {err_code += (1<<2);} + uart2_irq_occurred++; + if (err_code != 0) { + printf ("ERROR : UART 2 TX handler failed (0x%x)\n", err_code); + UartEndSimulation(); + while(1); + } + return; +} + +void UARTOVF2_Handler(void) +{ + int err_code = 0; + if (uart2_irq_expected==0) {err_code += (1<<0);} + if (((CMSDK_UART2->INTSTATUS & UART_INTSTATE_TXOVR)==0) & + ((CMSDK_UART2->INTSTATUS & UART_INTSTATE_RXOVR)==0)) {err_code += (1<<1);} + if ((CMSDK_UART2->INTSTATUS & UART_INTSTATE_TXOVR)!=0){ + CMSDK_UART2->STATE = UART_STATE_TXOVR; /* Clear TX overrun status */ + } + if ((CMSDK_UART2->INTSTATUS & UART_INTSTATE_RXOVR)!=0){ + CMSDK_UART2->STATE = UART_STATE_RXOVR; /* Clear RX overrun status */ + } + if ((CMSDK_UART2->INTSTATUS & UART_INTSTATE_TXOVR)!=0) {err_code += (1<<2);} + if ((CMSDK_UART2->INTSTATUS & UART_INTSTATE_RXOVR)!=0) {err_code += (1<<3);} + uart2_irq_occurred++; + if (err_code != 0) { + printf ("ERROR : UART 2 overrun handler failed (0x%x)\n", err_code); + UartEndSimulation(); + while(1); + } + return; +} + diff --git a/Cortex-M0/nanosoc/software/debug_tester/Makefile b/Cortex-M0/nanosoc/software/debug_tester/Makefile new file mode 100644 index 0000000..05ce772 --- /dev/null +++ b/Cortex-M0/nanosoc/software/debug_tester/Makefile @@ -0,0 +1,264 @@ +#----------------------------------------------------------------------------- +# The confidential and proprietary information contained in this file may +# only be used by a person authorised under and to the extent permitted +# by a subsisting licensing agreement from Arm Limited or its affiliates. +# +# (C) COPYRIGHT 2010-2013 Arm Limited or its affiliates. +# ALL RIGHTS RESERVED +# +# This entire notice must be reproduced on all copies of this file +# and copies of this file may only be made by a person if such person is +# permitted to do so under the terms of a subsisting license agreement +# from Arm Limited or its affiliates. +# +# SVN Information +# +# Checked In : $Date: 2017-10-10 15:55:38 +0100 (Tue, 10 Oct 2017) $ +# +# Revision : $Revision: 371321 $ +# +# Release Information : Cortex-M System Design Kit-r1p1-00rel0 +#----------------------------------------------------------------------------- +# +# CMSDK Debug Tester Makefile +# +#----------------------------------------------------------------------------- +# Remove any current implicit rules +.IMPLICIT = + +# Choose the core instantiated, can be +# - CORTEX_M0 +# - CORTEX_M0PLUS +# - CORTEX_M3 +# - CORTEX_M4 +# - CORTEX_M4F +# Note: if CORTEX_M4F is used, make sure: +# 1. RTL is configured to enable FPU option (cmsdk_mcu_defs.v) and recompiled +# 2. __FPU_PRESENT variable in header file (e.g. CMSDK_CM4.h) is set to 1 +CPU_PRODUCT = CORTEX_M0 + +# Shared software directory +SOFTWARE_DIR = ../ +CMSIS_DIR = $(SOFTWARE_DIR)/cmsis +CORE_DIR = $(CMSIS_DIR)/CMSIS/Include + +GCC_LINKER_SCRIPT_PATH = $(SOFTWARE_DIR)/common/scripts + +ifeq ($(CPU_PRODUCT),CORTEX_M0_DS) + DEVICE_DIR = $(CMSIS_DIR)/Device/ARM/CMSDK_CM0 + STARTUP_FILE = startup_CMSDK_CM0 + USER_DEFINE = -DCORTEX_M0 + ARM_CPU_TYPE = --cpu=Cortex-M0 + GCC_CPU_TYPE = -mcpu=cortex-m0 + GCC_LINKER_SCRIPT = $(GCC_LINKER_SCRIPT_PATH)/debugtester.ld +endif +ifeq ($(CPU_PRODUCT),CORTEX_M0) + DEVICE_DIR = $(CMSIS_DIR)/Device/ARM/CMSDK_CM0 + STARTUP_FILE = startup_CMSDK_CM0 + USER_DEFINE = -DCORTEX_M0 + ARM_CPU_TYPE = --cpu=Cortex-M0 + GCC_CPU_TYPE = -mcpu=cortex-m0 + GCC_LINKER_SCRIPT = $(GCC_LINKER_SCRIPT_PATH)/debugtester.ld +endif +ifeq ($(CPU_PRODUCT),CORTEX_M0PLUS) + DEVICE_DIR = $(CMSIS_DIR)/Device/ARM/CMSDK_CM0plus + STARTUP_FILE = startup_CMSDK_CM0plus + USER_DEFINE = -DCORTEX_M0PLUS + ARM_CPU_TYPE = --cpu=Cortex-M0plus + GCC_CPU_TYPE = -mcpu=cortex-m0plus + GCC_LINKER_SCRIPT = $(GCC_LINKER_SCRIPT_PATH)/debugtester.ld +endif +ifeq ($(CPU_PRODUCT),CORTEX_M3) + DEVICE_DIR = $(CMSIS_DIR)/Device/ARM/CMSDK_CM3 + STARTUP_FILE = startup_CMSDK_CM3 + USER_DEFINE = -DCORTEX_M3 + ARM_CPU_TYPE = --cpu=Cortex-M3 + GCC_CPU_TYPE = -mcpu=cortex-m3 + GCC_LINKER_SCRIPT = $(GCC_LINKER_SCRIPT_PATH)/debugtester.ld +endif +ifeq ($(CPU_PRODUCT),CORTEX_M4) + DEVICE_DIR = $(CMSIS_DIR)/Device/ARM/CMSDK_CM4 + STARTUP_FILE = startup_CMSDK_CM4 + USER_DEFINE = -DCORTEX_M4 + ARM_CPU_TYPE = --cpu=Cortex-M4 + GCC_CPU_TYPE = -mcpu=cortex-m4 + GCC_LINKER_SCRIPT = $(GCC_LINKER_SCRIPT_PATH)/debugtester.ld +endif +ifeq ($(CPU_PRODUCT),CORTEX_M4F) + DEVICE_DIR = $(CMSIS_DIR)/Device/ARM/CMSDK_CM4 + STARTUP_FILE = startup_CMSDK_CM4 + USER_DEFINE = -DCORTEX_M4 + # The debug tester processor for M4F as the target is an M4, so the processor + # for compiling the debug tester code must be M4 + ARM_CPU_TYPE = --cpu=Cortex-M4 + GCC_CPU_TYPE = -mcpu=cortex-m4 + GCC_LINKER_SCRIPT = $(GCC_LINKER_SCRIPT_PATH)/debugtester.ld +endif + +# Program file +DEBUGTESTER = debugtester + +# Endian Option +COMPILE_BIGEND = 0 + +DEPS_LIST = Makefile debugtester.h cmsdk_debugtester.h + +# Tool chain : ds5 / gcc / keil +TOOL_CHAIN = ds5 + +# --------------------------------------------------------------------------------------- +# DS-5 options + +# MicroLIB option (DS-5) +COMPILE_MICROLIB = 0 + +ARM_CC_OPTIONS = -c -O3 -g -Otime -I $(CORE_DIR) -I $(DEVICE_DIR)/Include \ + -I $(SOFTWARE_DIR)/common/retarget $(USER_DEFINE) +ARM_ASM_OPTIONS = -g + +ARM_LINK_OPTIONS = "--keep=$(STARTUP_FILE).o(RESET)" "--first=$(STARTUP_FILE).o(RESET)" \ + --rw_base 0x20000000 --ro_base 0x00000000 --map + +# Big Endian +ARM_CC_OPTIONS_BE = $(ARM_CC_OPTIONS) -DDEBUGTESTER_BE + +ifeq ($(COMPILE_MICROLIB),1) + # MicroLib + ARM_CC_OPTIONS += --library_type=microlib + ARM_ASM_OPTIONS += --library_type=microlib --pd "__MICROLIB SETA 1" + ARM_LINK_OPTIONS += --library_type=microlib +endif + +# --------------------------------------------------------------------------------------- +# gcc options + +GNG_CC = arm-none-eabi-gcc +GNU_OBJDUMP = arm-none-eabi-objdump +GNU_OBJCOPY = arm-none-eabi-objcopy + +# The optimisation level for the GCC compiler should be fixed at -01 or the results can +# cause unpredictable results for the debugtester behaviour. +GNU_CC_FLAGS = -g -O1 -mthumb $(GCC_CPU_TYPE) + +# --------------------------------------------------------------------------------------- +all: all_$(TOOL_CHAIN) + +# --------------------------------------------------------------------------------------- +# DS-5 +all_ds5 : $(DEBUGTESTER)_le.hex $(DEBUGTESTER)_be.hex $(DEBUGTESTER)_le.lst $(DEBUGTESTER)_be.lst + +debugtester_le.o : debugtester.c $(DEPS_LIST) + armcc $(ARM_CC_OPTIONS) $(ARM_CPU_TYPE) $< -o $@ + +system_cmsdk_debugtester_le.o : system_cmsdk_debugtester.c $(DEPS_LIST) + armcc $(ARM_CC_OPTIONS) $(ARM_CPU_TYPE) $< -o $@ + +retarget_cmsdk_debugtester_le.o : retarget_cmsdk_debugtester.c $(DEPS_LIST) + armcc $(ARM_CC_OPTIONS) $(ARM_CPU_TYPE) $< -o $@ + +$(STARTUP_FILE).o : $(DEVICE_DIR)/Source/ARM/$(STARTUP_FILE).s $(DEPS_LIST) + armasm $(ARM_ASM_OPTIONS) $(ARM_CPU_TYPE) $< -o $@ + +$(DEBUGTESTER)_le.elf : $(DEBUGTESTER)_le.o $(STARTUP_FILE).o system_cmsdk_debugtester_le.o retarget_cmsdk_debugtester_le.o + armlink $(ARM_LINK_OPTIONS) $(DEBUGTESTER)_le.o $(STARTUP_FILE).o system_cmsdk_debugtester_le.o retarget_cmsdk_debugtester_le.o -o $@ + +$(DEBUGTESTER)_le.hex : $(DEBUGTESTER)_le.elf + fromelf --vhx --8x1 $< --output $@ + +$(DEBUGTESTER)_le.lst : $(DEBUGTESTER)_le.elf + fromelf -c -d -e -s $< --output $@ + +debugtester_be.o : debugtester.c $(DEPS_LIST) + armcc $(ARM_CC_OPTIONS_BE) $(ARM_CPU_TYPE) $< -o $@ + +system_cmsdk_debugtester_be.o : system_cmsdk_debugtester.c $(DEPS_LIST) + armcc $(ARM_CC_OPTIONS_BE) $(ARM_CPU_TYPE) $< -o $@ + +retarget_cmsdk_debugtester_be.o : retarget_cmsdk_debugtester.c $(DEPS_LIST) + armcc $(ARM_CC_OPTIONS_BE) $(ARM_CPU_TYPE) $< -o $@ + +$(DEBUGTESTER)_be.elf : $(DEBUGTESTER)_be.o $(STARTUP_FILE).o system_cmsdk_debugtester_be.o retarget_cmsdk_debugtester_be.o + armlink $(ARM_LINK_OPTIONS) $(DEBUGTESTER)_be.o $(STARTUP_FILE).o system_cmsdk_debugtester_be.o retarget_cmsdk_debugtester_be.o -o $@ + +$(DEBUGTESTER)_be.hex : $(DEBUGTESTER)_be.elf + fromelf --vhx --8x1 $< --output $@ + +$(DEBUGTESTER)_be.lst : $(DEBUGTESTER)_be.elf + fromelf -c -d -e -s $< --output $@ + +# --------------------------------------------------------------------------------------- +# GCC +all_gcc : $(DEBUGTESTER)_le $(DEBUGTESTER)_be + +$(DEBUGTESTER)_le : + $(GNG_CC) $(GNU_CC_FLAGS) $(DEVICE_DIR)/Source/GCC/$(STARTUP_FILE).s \ + $(DEBUGTESTER).c \ + system_cmsdk_debugtester.c \ + retarget_cmsdk_debugtester.c \ + -I $(DEVICE_DIR)/Include -I $(CORE_DIR) \ + -L $(GCC_LINKER_SCRIPT_PATH) \ + -D__STACK_SIZE=0x200 \ + -D__HEAP_SIZE=0x1000 \ + $(USER_DEFINE) -T $(GCC_LINKER_SCRIPT) -o $(DEBUGTESTER)_le.o + # Generate disassembly code + $(GNU_OBJDUMP) -S $(DEBUGTESTER)_le.o > $(DEBUGTESTER)_le.lst + # Generate binary file + $(GNU_OBJCOPY) -S $(DEBUGTESTER)_le.o -O binary $(DEBUGTESTER)_le.bin + # Generate hex file + $(GNU_OBJCOPY) -S $(DEBUGTESTER)_le.o -O verilog $(DEBUGTESTER)_le.hex + +$(DEBUGTESTER)_be : + $(GNG_CC) $(GNU_CC_FLAGS) $(DEVICE_DIR)/Source/GCC/$(STARTUP_FILE).s \ + $(DEBUGTESTER).c \ + system_cmsdk_debugtester.c \ + retarget_cmsdk_debugtester.c \ + -I $(DEVICE_DIR)/Include -I $(CORE_DIR) \ + -L $(GCC_LINKER_SCRIPT_PATH) \ + -D__STACK_SIZE=0x200 \ + -D__HEAP_SIZE=0x1000 \ + $(USER_DEFINE) -DDEBUGTESTER_BE -T $(GCC_LINKER_SCRIPT) -o $(DEBUGTESTER)_be.o + # Generate disassembly code + $(GNU_OBJDUMP) -S $(DEBUGTESTER)_be.o > $(DEBUGTESTER)_be.lst + # Generate binary file + $(GNU_OBJCOPY) -S $(DEBUGTESTER)_be.o -O binary $(DEBUGTESTER)_be.bin + # Generate hex file + $(GNU_OBJCOPY) -S $(DEBUGTESTER)_be.o -O verilog $(DEBUGTESTER)_be.hex + +# Note: +# If the version of object copy you are using does not support verilog hex file output, +# you can generate the hex file from binary file using the following command +# od -v -A n -t x1 --width=1 $(DEBUGTESTER)_le.bin > $(DEBUGTESTER)_le.hex + +# --------------------------------------------------------------------------------------- +# Keil MDK + +all_keil: + @echo "Please compile your project code and press ENTER when ready" + @read dummy + +# --------------------------------------------------------------------------------------- +# Binary + +all_bin: $(DEBUGTESTER)_le.bin + # Generate hex file from binary + od -v -A n -t x1 --width=1 $(DEBUGTESTER)_le.bin > $(DEBUGTESTER)_le.hex + + + +# --------------------------------------------------------------------------------------- +# Clean +clean: + @rm -f *.hex *.bin *.elf *.o *.lst + @rm -rf *.crf + @rm -rf *.plg + @rm -rf *.tra + @rm -rf *.htm + @rm -rf *.map + @rm -rf *.dep + @rm -rf *.d + @rm -rf *.lnp + @rm -rf *.bak + @rm -rf *.lst + @rm -rf *.axf + @rm -rf *.__i + @rm -rf *._ia diff --git a/Cortex-M0/nanosoc/software/debug_tester/cmsdk_debugtester.h b/Cortex-M0/nanosoc/software/debug_tester/cmsdk_debugtester.h new file mode 100644 index 0000000..8e3b9eb --- /dev/null +++ b/Cortex-M0/nanosoc/software/debug_tester/cmsdk_debugtester.h @@ -0,0 +1,336 @@ +// +//----------------------------------------------------------------------------- +// The confidential and proprietary information contained in this file may +// only be used by a person authorised under and to the extent permitted +// by a subsisting licensing agreement from Arm Limited or its affiliates. +// +// (C) COPYRIGHT 2010-2013 Arm Limited or its affiliates. +// ALL RIGHTS RESERVED +// +// This entire notice must be reproduced on all copies of this file +// and copies of this file may only be made by a person if such person is +// permitted to do so under the terms of a subsisting license agreement +// from Arm Limited or its affiliates. +// +// SVN Information +// +// Checked In : $Date: 2017-10-10 15:55:38 +0100 (Tue, 10 Oct 2017) $ +// +// Revision : $Revision: 371321 $ +// +// Release Information : Cortex-M System Design Kit-r1p1-00rel0 +//----------------------------------------------------------------------------- +// + +#ifndef __CMSDK_DEBUGTESTER_H__ +#define __CMSDK_DEBUGTESTER_H__ + +////////////////////////////////////////////////////////////////////////////////// +//// +//// CMSDK Debug Tester CMSIS Configuration File +//// +//// This file corresponds to the device.h file in the CMSIS standard, +//// and defines the peripherals for the Debug Tester device: +//// IRQ number +//// IO address mapping and data structures +//// core configuration etc +//// +////////////////////////////////////////////////////////////////////////////////// + + //============================================================================ + //---------- Interrupt Number Definition ------------------------------------- + //============================================================================ + +typedef enum IRQn +{ +/////// Cortex-M Processor Exceptions Numbers ///////////////////////////////////////////////////// + NonMaskableInt_IRQn = -14, //!< 2 Non Maskable Interrupt // + HardFault_IRQn = -13, //!< 3 Cortex-M Hard Fault Interrupt // + SVCall_IRQn = -5, //!< 11 Cortex-M SV Call Interrupt // + PendSV_IRQn = -2, //!< 14 Cortex-M Pend SV Interrupt // + SysTick_IRQn = -1, //!< 15 Cortex-M System Tick Interrupt // + +/////// Example MCU Cortex-M specific Interrupt Numbers /////////////////////////////////////////// + GPIO_IRQn = 0 //!< GPIO Interrupt // +} IRQn_Type; + + +// +// ========================================================================== +// ----------- Processor and Core Peripheral Section ------------------------ +// ========================================================================== +// + +// Include the appropriate CMSIS core header file + +#ifdef CORTEX_M0 +#define __CM0_REV 0x0000 /*!< Core revision r0p0 */ +#define __MPU_PRESENT 0 /*!< MPU present or not */ +#define __NVIC_PRIO_BITS 2 /*!< Number of Bits used for Priority Levels */ +#define __Vendor_SysTickConfig 0 /*!< Set to 1 if different SysTick Config is used */ +#include "core_cm0.h" // Cortex-M0 processor and core peripherals + +#else + +#ifdef CORTEX_M0PLUS +#define __CM0_REV 0x0001 /*!< Core revision r0p1 */ +#define __MPU_PRESENT 0 /*!< MPU present or not */ +#define __NVIC_PRIO_BITS 2 /*!< Number of Bits used for Priority Levels */ +#define __Vendor_SysTickConfig 0 /*!< Set to 1 if different SysTick Config is used */ +#include "core_cm0plus.h" // Cortex-M0+ processor and core peripherals + +#else + +#ifdef CORTEX_M3 +#define __CM3_REV 0x0201 /*!< Core revision r2p1 */ +#define __MPU_PRESENT 1 /*!< MPU present or not */ +#define __NVIC_PRIO_BITS 3 /*!< Number of Bits used for Priority Levels */ +#define __Vendor_SysTickConfig 0 /*!< Set to 1 if different SysTick Config is used */ +#include "core_cm3.h" // Cortex-M3 processor and core peripherals + +#else + +#ifdef CORTEX_M4 +#define __CM4_REV 0x0001 /*!< Core revision r0p1 */ +#define __MPU_PRESENT 1 /*!< MPU present or not */ +#define __NVIC_PRIO_BITS 3 /*!< Number of Bits used for Priority Levels */ +#define __Vendor_SysTickConfig 0 /*!< Set to 1 if different SysTick Config is used */ +#define __FPU_PRESENT 1 /*!< FPU present or not */ +#include "core_cm4.h" // Cortex-M4 processor and core peripherals + +#endif +#endif +#endif +#endif + +#include "system_cmsdk_debugtester.h" + + +// ============================================================================= +// Device Specific Peripheral registers structures // +// ============================================================================= + +/* ------------------- Start of section using anonymous unions ------------------ */ +#if defined(__CC_ARM) + #pragma push + #pragma anon_unions +#elif defined(__ICCARM__) + #pragma language=extended +#elif defined(__GNUC__) + /* anonymous unions are enabled by default */ +#elif defined(__TMS470__) +/* anonymous unions are enabled by default */ +#elif defined(__TASKING__) + #pragma warning 586 +#else + #warning Not supported compiler type +#endif + + +/*-------------------- General Purpose Input Output (GPIO) -------------------*/ + +/** @addtogroup CMSDK_GPIO CMSDK GPIO + @{ +*/ +typedef struct +{ + __IO uint32_t DATA; /*!< Offset: 0x000 DATA Register (R/W) */ + __IO uint32_t DATAOUT; /*!< Offset: 0x004 Data Output Latch Register (R/W) */ + uint32_t RESERVED0[2]; + __IO uint32_t OUTENABLESET; /*!< Offset: 0x010 Output Enable Set Register (R/W) */ + __IO uint32_t OUTENABLECLR; /*!< Offset: 0x014 Output Enable Clear Register (R/W) */ + __IO uint32_t ALTFUNCSET; /*!< Offset: 0x018 Alternate Function Set Register (R/W) */ + __IO uint32_t ALTFUNCCLR; /*!< Offset: 0x01C Alternate Function Clear Register (R/W) */ + __IO uint32_t INTENSET; /*!< Offset: 0x020 Interrupt Enable Set Register (R/W) */ + __IO uint32_t INTENCLR; /*!< Offset: 0x024 Interrupt Enable Clear Register (R/W) */ + __IO uint32_t INTTYPESET; /*!< Offset: 0x028 Interrupt Type Set Register (R/W) */ + __IO uint32_t INTTYPECLR; /*!< Offset: 0x02C Interrupt Type Clear Register (R/W) */ + __IO uint32_t INTPOLSET; /*!< Offset: 0x030 Interrupt Polarity Set Register (R/W) */ + __IO uint32_t INTPOLCLR; /*!< Offset: 0x034 Interrupt Polarity Clear Register (R/W) */ + union { + __I uint32_t INTSTATUS; /*!< Offset: 0x038 Interrupt Status Register (R/ ) */ + __O uint32_t INTCLEAR; /*!< Offset: 0x038 Interrupt Clear Register ( /W) */ + }; + uint32_t RESERVED1[241]; + __IO uint32_t LB_MASKED[256]; /*!< Offset: 0x400 - 0x7FC Lower byte Masked Access Register (R/W) */ + __IO uint32_t UB_MASKED[256]; /*!< Offset: 0x800 - 0xBFC Upper byte Masked Access Register (R/W) */ +} CMSDK_GPIO_TypeDef; + +#define CMSDK_GPIO_DATA_Pos 0 /*!< CMSDK_GPIO DATA: DATA Position */ +#define CMSDK_GPIO_DATA_Msk (0xFFFFul << CMSDK_GPIO_DATA_Pos) /*!< CMSDK_GPIO DATA: DATA Mask */ + +#define CMSDK_GPIO_DATAOUT_Pos 0 /*!< CMSDK_GPIO DATAOUT: DATAOUT Position */ +#define CMSDK_GPIO_DATAOUT_Msk (0xFFFFul << CMSDK_GPIO_DATAOUT_Pos) /*!< CMSDK_GPIO DATAOUT: DATAOUT Mask */ + +#define CMSDK_GPIO_OUTENSET_Pos 0 /*!< CMSDK_GPIO OUTEN: OUTEN Position */ +#define CMSDK_GPIO_OUTENSET_Msk (0xFFFFul << CMSDK_GPIO_OUTEN_Pos) /*!< CMSDK_GPIO OUTEN: OUTEN Mask */ + +#define CMSDK_GPIO_OUTENCLR_Pos 0 /*!< CMSDK_GPIO OUTEN: OUTEN Position */ +#define CMSDK_GPIO_OUTENCLR_Msk (0xFFFFul << CMSDK_GPIO_OUTEN_Pos) /*!< CMSDK_GPIO OUTEN: OUTEN Mask */ + +#define CMSDK_GPIO_ALTFUNCSET_Pos 0 /*!< CMSDK_GPIO ALTFUNC: ALTFUNC Position */ +#define CMSDK_GPIO_ALTFUNCSET_Msk (0xFFFFul << CMSDK_GPIO_ALTFUNC_Pos) /*!< CMSDK_GPIO ALTFUNC: ALTFUNC Mask */ + +#define CMSDK_GPIO_ALTFUNCCLR_Pos 0 /*!< CMSDK_GPIO ALTFUNC: ALTFUNC Position */ +#define CMSDK_GPIO_ALTFUNCCLR_Msk (0xFFFFul << CMSDK_GPIO_ALTFUNC_Pos) /*!< CMSDK_GPIO ALTFUNC: ALTFUNC Mask */ + +#define CMSDK_GPIO_INTENSET_Pos 0 /*!< CMSDK_GPIO INTEN: INTEN Position */ +#define CMSDK_GPIO_INTENSET_Msk (0xFFFFul << CMSDK_GPIO_INTEN_Pos) /*!< CMSDK_GPIO INTEN: INTEN Mask */ + +#define CMSDK_GPIO_INTENCLR_Pos 0 /*!< CMSDK_GPIO INTEN: INTEN Position */ +#define CMSDK_GPIO_INTENCLR_Msk (0xFFFFul << CMSDK_GPIO_INTEN_Pos) /*!< CMSDK_GPIO INTEN: INTEN Mask */ + +#define CMSDK_GPIO_INTTYPESET_Pos 0 /*!< CMSDK_GPIO INTTYPE: INTTYPE Position */ +#define CMSDK_GPIO_INTTYPESET_Msk (0xFFFFul << CMSDK_GPIO_INTTYPE_Pos) /*!< CMSDK_GPIO INTTYPE: INTTYPE Mask */ + +#define CMSDK_GPIO_INTTYPECLR_Pos 0 /*!< CMSDK_GPIO INTTYPE: INTTYPE Position */ +#define CMSDK_GPIO_INTTYPECLR_Msk (0xFFFFul << CMSDK_GPIO_INTTYPE_Pos) /*!< CMSDK_GPIO INTTYPE: INTTYPE Mask */ + +#define CMSDK_GPIO_INTPOLSET_Pos 0 /*!< CMSDK_GPIO INTPOL: INTPOL Position */ +#define CMSDK_GPIO_INTPOLSET_Msk (0xFFFFul << CMSDK_GPIO_INTPOL_Pos) /*!< CMSDK_GPIO INTPOL: INTPOL Mask */ + +#define CMSDK_GPIO_INTPOLCLR_Pos 0 /*!< CMSDK_GPIO INTPOL: INTPOL Position */ +#define CMSDK_GPIO_INTPOLCLR_Msk (0xFFFFul << CMSDK_GPIO_INTPOL_Pos) /*!< CMSDK_GPIO INTPOL: INTPOL Mask */ + +#define CMSDK_GPIO_INTSTATUS_Pos 0 /*!< CMSDK_GPIO INTSTATUS: INTSTATUS Position */ +#define CMSDK_GPIO_INTSTATUS_Msk (0xFFul << CMSDK_GPIO_INTSTATUS_Pos) /*!< CMSDK_GPIO INTSTATUS: INTSTATUS Mask */ + +#define CMSDK_GPIO_INTCLEAR_Pos 0 /*!< CMSDK_GPIO INTCLEAR: INTCLEAR Position */ +#define CMSDK_GPIO_INTCLEAR_Msk (0xFFul << CMSDK_GPIO_INTCLEAR_Pos) /*!< CMSDK_GPIO INTCLEAR: INTCLEAR Mask */ + +#define CMSDK_GPIO_MASKLOWBYTE_Pos 0 /*!< CMSDK_GPIO MASKLOWBYTE: MASKLOWBYTE Position */ +#define CMSDK_GPIO_MASKLOWBYTE_Msk (0x00FFul << CMSDK_GPIO_MASKLOWBYTE_Pos) /*!< CMSDK_GPIO MASKLOWBYTE: MASKLOWBYTE Mask */ + +#define CMSDK_GPIO_MASKHIGHBYTE_Pos 0 /*!< CMSDK_GPIO MASKHIGHBYTE: MASKHIGHBYTE Position */ +#define CMSDK_GPIO_MASKHIGHBYTE_Msk (0xFF00ul << CMSDK_GPIO_MASKHIGHBYTE_Pos) /*!< CMSDK_GPIO MASKHIGHBYTE: MASKHIGHBYTE Mask */ + +/*@}*/ /* end of group CMSDK_GPIO */ + + +/*-------------------- Trace Capture Buffer (TCB) -------------------*/ + +typedef struct +{ + __IO uint32_t CONFIG; + __I uint32_t DATA; + __I uint32_t DEPTH; + __I uint32_t SYNCS; + __I uint32_t HSYNCS; + __I uint32_t STATUS; + +} TRACE_TypeDef; + + +/* -------------------- End of section using anonymous unions ------------------- */ +#if defined(__CC_ARM) + #pragma pop +#elif defined(__ICCARM__) + /* leave anonymous unions enabled */ +#elif defined(__GNUC__) + /* anonymous unions are enabled by default */ +#elif defined(__TMS470__) + /* anonymous unions are enabled by default */ +#elif defined(__TASKING__) + #pragma warning restore +#else + #warning Not supported compiler type +#endif + + +// ============================================================================= +// Peripheral memory map // +// ============================================================================= +// Peripheral and SRAM base address // +#define SRAM_BASE ((uint32_t)0x20000000) + +// Peripheral memory map // +#define GPIO0_BASE ((uint32_t)0x40000000) +#define GPIO1_BASE ((uint32_t)0x40001000) +#define TRACE_BASE ((uint32_t)0x40002000) + +// ============================================================================= +// Peripheral declaration // +// ============================================================================= +#define GPIO0 ((CMSDK_GPIO_TypeDef *) GPIO0_BASE) +#define GPIO1 ((CMSDK_GPIO_TypeDef *) GPIO1_BASE) +#define TRACE ((TRACE_TypeDef *) TRACE_BASE) + +// ============================================================================= +// GPIO 0 Pin Assignments +// ============================================================================= + +// +// Debug tester Hardware Interface to the MCU +// +// Debug tester --------------------------------------- Example MCU +// +// GPIO[15] 7 >----------------------------------------> Running +// GPIO[14] 6 >----------------------------------------> Error +// GPIO[13] 5 <----------------------------------------< Function Strobe +// GPIO[12] 4 <----------------------------------------< Function Select bit 4 +// GPIO[11] 3 <----------------------------------------< Function Select bit 3 +// GPIO[10] 2 <----------------------------------------< Function Select bit 2 +// GPIO[ 9] 1 <----------------------------------------< Function Select bit 1 +// GPIO[ 8] 0 <----------------------------------------< Function Select bit 0 +// +// + +#define DD_IO_RUNNING (1 << 7) +#define DD_IO_ERROR (1 << 6) +#define DD_IO_STROBE (1 << 5) +#define DD_IO_FUNCSEL 0x1f + + +// +// JTAG / SerialWire Connectivity +// +// Debug tester --------------------------------------- Example MCU +// +// +// GPIO[ 6] 6 >----------------------+ +// |\| +// GPIO[ 5] 5 >--------------------| >--------+-------<> SWDIOTMS +// |/ | +// GPIO[ 4] 4 <-------------------------------+ +// GPIO[ 3] 3 <----------------------------------------< TDO +// GPIO[ 2] 2 >----------------------------------------> TDI +// GPIO[ 1] 1 >----------------------------------------> SWCLKTCK +// GPIO[ 0] 0 >----------------------------------------> nTRST +// +// + +#define DD_DBG_TMSEN (1 << 6) +#define DD_DBG_TMS (1 << 5) +#define DD_DBG_TMSIN (1 << 4) +#define DD_DBG_TDO (1 << 3) +#define DD_DBG_TDI (1 << 2) +#define DD_DBG_SWCLKTCK (1 << 1) +#define DD_DBG_nTRST (1 << 0) + + +// ============================================================================= +// GPIO 1 Pin Assignments +// ============================================================================= + +// +// Character device for printf and miscellaneous signals +// +// +// GPIO[ 7] 7 >----------------------------------------> Character Strobe +// GPIO[ 6] 6 >----------------------------------------> \ +// GPIO[ 5] 5 >----------------------------------------> \ +// GPIO[ 4] 4 >----------------------------------------> \ Character +// GPIO[ 3] 3 >----------------------------------------> > Value +// GPIO[ 2] 2 >----------------------------------------> / +// GPIO[ 1] 1 >----------------------------------------> / +// GPIO[ 0] 0 >----------------------------------------> / +// +// + +#define DD_PRINT_STROBE (1 << 7) +#define DD_PRINT_CHAR 0x7F + + +#endif + + diff --git a/Cortex-M0/nanosoc/software/debug_tester/debugtester.c b/Cortex-M0/nanosoc/software/debug_tester/debugtester.c new file mode 100644 index 0000000..a778043 --- /dev/null +++ b/Cortex-M0/nanosoc/software/debug_tester/debugtester.c @@ -0,0 +1,2775 @@ +// +//----------------------------------------------------------------------------- +// The confidential and proprietary information contained in this file may +// only be used by a person authorised under and to the extent permitted +// by a subsisting licensing agreement from Arm Limited or its affiliates. +// +// (C) COPYRIGHT 2010-2013 Arm Limited or its affiliates. +// ALL RIGHTS RESERVED +// +// This entire notice must be reproduced on all copies of this file +// and copies of this file may only be made by a person if such person is +// permitted to do so under the terms of a subsisting license agreement +// from Arm Limited or its affiliates. +// +// SVN Information +// +// Checked In : $Date: 2017-10-10 15:55:38 +0100 (Tue, 10 Oct 2017) $ +// +// Revision : $Revision: 371321 $ +// +// Release Information : Cortex-M System Design Kit-r1p1-00rel0 +//----------------------------------------------------------------------------- +// + +////////////////////////////////////////////////////////////////////////////// +// +// CMSDK Debug Tester Code +// +////////////////////////////////////////////////////////////////////////////// + + +// This code always runs on the Cortex-M processor within the +// cmsdk_debug_tester.v module in the example testbench. +// +// The Debug Tester uses the example components supplied with the CMSDK. +// You must copy and rename the example components if you wish to +// modify their behavior, otherwise the Debug Tester may break. +// +// This code provides access to various test routines that can use +// either a SerialWire or JTAG interface to connect to the +// example MCU. +// +// The functions available to the example MCU are enumerated in +// debugtester_functions.h by the variable "Function". These correspond to +// actual functions within this file beneath the comment "Functions Available +// to MCU Core". +// +// Communication between the example MCU and the Debug Tester takes place +// in two ways: +// +// [1] +// +// Function Calling, Function completion and Error status use a simple +// handshake using GPIO0. Refer to the main() function in this file, +// and the functions EnableDebugTester(), DisableDebugTester(), +// CallDebugtester(), StartDebugtester() and CheckDebugtester() in +// generic/mcu_debugtester_interface.c for details. +// +// +// [2] +// +// Some tests and functions need to pass more complex data between the +// example MCU and the Debug Tester. For these cases, an area of memory +// in the example MCU SRAM is predefined as an area for passing values +// between the Debug Tester and example MCU. +// +// The region used is the last 4 words above the stack pointer of the +// example MCU. The debugtester code reads the example MCU vector table +// to determine its SP, and therefore the location of these four words. +// +// The Debug Tester accesses this region using +// Cortex_MCU.stacktop and suitable offsets, using the +// ReadCommRegion() and WriteCommRegion() functions which also handle +// changing the endianness of the data when required. +// The example MCU accesses this region using the array +// DEBUGTESTERDATA, defined in generic/mcu_debugtester_interface.h +// +// + +#include "cmsdk_debugtester.h" // CMSIS Support for the debugtester +#include "system_cmsdk_debugtester.h" // CMSIS Support for the debugtester +#include "debugtester.h" // Local header file +#include <stdio.h> // Access to printf + +// EXPECTED_BE: Expected Endianness <0=> Little Endian <1=> Big Endian +#ifdef DEBUGTESTER_BE +#define EXPECTED_BE 1 +#else +#define EXPECTED_BE 0 +#endif + + +////////////////////////////////////////////////////////////////////////////// +// Global Variables +////////////////////////////////////////////////////////////////////////////// + +// Track information about the target + +struct { + uint32_t stacktop; + uint32_t traceconfigured; +} Cortex_MCU; + + +// Track state of the DAP + +struct { + uint32_t jtagnsw; + uint32_t jtagapndp; + uint32_t on; + uint32_t banksel; + uint32_t csw; + uint32_t error; + uint8_t ack; + uint8_t stkerrclr; +} DAPSTATUS; + +// Trace decompression globals +uint32_t trace_id = 0x71; // Init to reserved +uint32_t trace_errors = 0; +uint8_t etm_packet[6]; +uint32_t etm_bytes=0; +uint32_t etm_current=0; +uint32_t itm_current=0; +uint8_t itm_header; +uint32_t itm_payload=0; +uint32_t itm_ts1=0; +uint32_t itm_ts2=0; +uint32_t itm_ts1_last=0; +uint32_t itm_bytes=0; +uint32_t itm_size=0; +uint32_t itm_ts=0; +uint32_t itm_sync=0; +uint32_t itm_overflow=0; +uint32_t itm_sw=0; +uint32_t itm_event=0; +uint32_t itm_periodic=0; +uint32_t itm_exception=0; +uint32_t itm_comp=0; +uint32_t itm_glb1=0; +uint32_t itm_glb2=0; + +uint32_t current_address = 0; +uint32_t etm_ts1 = 0; +uint32_t etm_ts1_last = 0; +uint32_t etm_ts2 = 0; +uint32_t etm_p_headers =0; +uint32_t etm_i_sync =0; +uint32_t etm_branches =0; +uint32_t etm_exceptions =0; +uint32_t etm_rfe =0; +uint32_t etm_timestamps =0; +uint32_t etm_triggers =0; +uint32_t etm_ignore =0; // Expect 0 +uint32_t fmt_triggers =0; +uint32_t fmt_frames =0; +uint32_t fmt_etm =0; +uint32_t fmt_itm =0; + + +////////////////////////////////////////////////////////////////////////////// +// Function Prototypes +////////////////////////////////////////////////////////////////////////////// + +// SerialWire + +uint32_t SWConnect(void); +uint32_t SWHeader(uint8_t); +uint32_t SWDataRead(void); +void SWDataWrite(uint32_t); +void SerialWireClockOut (uint32_t, uint32_t); +uint32_t SerialWireClockIn (uint32_t); +void SWLineReset(uint8_t); +void SWExitDormantState(void); + + +// JTAG + +void JTAGTransition(uint32_t, uint8_t); +uint64_t JTAGShift(uint64_t, uint8_t); +uint64_t JTAGScanIDCODE(void); +void JTAGScanIR(uint32_t); +uint64_t JTAGScanDR(uint64_t); + + +// Trace + +uint32_t ParseTrace(uint8_t); + + +// Wire Protocol Agnostic functions + +void pulse_clock(uint8_t); +void InitDAPSTATUS(void); +void InitCommRegion(void); +uint32_t SwapEndian(uint32_t); +uint32_t ReadCommRegion(uint32_t); +void WriteCommRegion(uint32_t, uint32_t); +uint32_t ReadMem(uint32_t); +uint32_t ReadMemH(uint32_t); +uint32_t ReadMemB(uint32_t); +void ReadMemBlock(uint32_t, uint32_t, uint32_t *); +uint32_t ReadMemSpecial(uint32_t, uint8_t, uint32_t); +void WriteMem(uint32_t, uint32_t); +void WriteMemBlock(uint32_t, uint32_t, uint32_t *); +void WriteMemH(uint32_t, uint32_t); +void WriteMemB(uint32_t, uint32_t); +void JtagAPnDP(uint32_t); +void DPWriteBANKSEL(uint32_t); +void DPWriteCTRLSTAT(uint32_t); +uint32_t DPReadCTRLSTAT(void); +uint32_t APReadCSW(void); +void APWriteCSW(uint32_t); +void APWriteTAR(uint32_t); +uint32_t APReadDRW(void); +void APWriteDRW(uint32_t); +uint32_t DPReadRDBUFF(void); +uint32_t DPReadIDR(void); +uint32_t APReadIDR(void); +uint32_t APReadBASE(void); +uint32_t DPReadHALTEV(void); +void DPClearSTICKYERR(void); +uint32_t CheckDAPSTATUS(void); + + +// Prototypes for MCU exposed functions +uint32_t SetInterfaceJTAG(void); +uint32_t SetInterfaceSW(void); +uint32_t DAPPowerUp(void); +uint32_t DAPPowerDown(void); +uint32_t GetTAPID(void); +uint32_t GetDPReg(void); +uint32_t GetAPReg(void); +uint32_t GetAPMem(void); +uint32_t SetAPMem(void); +uint32_t GetAPMemCSIDs(void); +uint32_t GetAPMemPID(void); +uint32_t ConnectWakeUnhalt(void); +uint32_t ConnectCheckUnlockup(void); +uint32_t EnableHaltingDebug(void); +uint32_t DAPAccess(void); +uint32_t ConfigTrace(void); +uint32_t CheckTrace(void); +uint32_t EmptyFunction(void); + + + +////////////////////////////////////////////////////////////////////////////// +// Func points to the functions that will be used by the MCU +////////////////////////////////////////////////////////////////////////////// + +uint32_t (*Func[]) (void) = { SetInterfaceJTAG, + SetInterfaceSW, + DAPPowerUp, + DAPPowerDown, + GetTAPID, + GetDPReg, + GetAPReg, + GetAPMem, + SetAPMem, + GetAPMemCSIDs, + ConnectWakeUnhalt, + ConnectCheckUnlockup, + EnableHaltingDebug, + DAPAccess, + ConfigTrace, + CheckTrace, + EmptyFunction, + EmptyFunction, + EmptyFunction, + EmptyFunction, + EmptyFunction, + EmptyFunction, + EmptyFunction, + EmptyFunction, + EmptyFunction, + EmptyFunction, + EmptyFunction, + EmptyFunction, + EmptyFunction, + EmptyFunction, + EmptyFunction, + EmptyFunction +}; + + +////////////////////////////////////////////////////////////////////////////// +// Main code +////////////////////////////////////////////////////////////////////////////// + +int main (void) +{ + uint32_t SelectedFunction; + + // + // Initialisation + // + // GPIO0 + GPIO0->DATAOUT = 0; + GPIO0->OUTENABLESET = ( ((DD_IO_RUNNING | DD_IO_ERROR) << 8) | + (DD_DBG_TMSEN | DD_DBG_TMS | DD_DBG_TDI | DD_DBG_SWCLKTCK | DD_DBG_nTRST) ); + // GPIO1 + GPIO1->DATAOUT = 0; + GPIO1->OUTENABLESET = ( DD_PRINT_STROBE | DD_PRINT_CHAR ); + + // Raise nTRST to bring JTAG DAP out of reset + GPIO0->DATAOUT = DD_DBG_nTRST; + + // Initialise DAPSTATUS struct + InitDAPSTATUS(); + + // Initialise example MCU information + Cortex_MCU.stacktop = 0; + Cortex_MCU.traceconfigured = 0; + + // + // Sit in loop waiting to service requests from the MCU cpu core + // + while(1) + { + if(GPIO0->UB_MASKED[DD_IO_STROBE]) + { + // Clear any error flag + GPIO0->UB_MASKED[DD_IO_ERROR] = 0; + + // Work out which routine to execute + SelectedFunction = (GPIO0->UB_MASKED[DD_IO_FUNCSEL]) >> 8; + + // Indicate that we are running + GPIO0->UB_MASKED[DD_IO_RUNNING] = DD_IO_RUNNING << 8; + + // Wait for deassertion of strobe + while(GPIO0->UB_MASKED[DD_IO_STROBE]); + + // Run it + if( (*Func[SelectedFunction])() != 0 ) + { + // Flag an error + GPIO0->UB_MASKED[DD_IO_ERROR] = DD_IO_ERROR << 8; + }; + + // Indicate that we are finished + GPIO0->UB_MASKED[DD_IO_RUNNING] = 0; + DBG_MSG(("Selected function run finished, wait for new function\n")); + } + } +} + + +//============================================================================ +// +// Functions Available to MCU Core +// +//============================================================================ + +uint32_t SetInterfaceJTAG() +{ + // Switch to JTAG mode + DBG_MSG(("SetInterfaceJTAG()\n")); + if(DAPSTATUS.on) + { + DBG_MSG(("SetInterfaceJTAG() TEST FAILED: DAP power on\n")); + return TEST_FAIL; + } + else + { + // Update struct + DAPSTATUS.jtagnsw = 1; + + // JTAG - We'll always be driving TMS + GPIO0->LB_MASKED[DD_DBG_TMSEN] = DD_DBG_TMSEN; + + // Ensure we are in TLR by clocking in 5 TMS high cycles + JTAGTransition(0xff, 5); + + // Get into RTI as our default initial state + JTAGTransition(0, 1); + + return TEST_PASS; + } +} + + +uint32_t SetInterfaceSW() +{ + // Switch to SerialWire mode + DBG_MSG(("SetInterfaceSW()\n")); + if(DAPSTATUS.on) + { + DBG_MSG(("SetInterfaceSW() TEST FAIL: DAP power on\n")); + return TEST_FAIL; + } + else + { + // Initialise + DAPSTATUS.jtagnsw = 0; + return SWConnect(); + } +} + + +uint32_t DAPPowerUp() +{ + DBG_MSG(("DAPPowerUp()\n")); + if(DAPSTATUS.on == 0) + { + DPWriteCTRLSTAT( 0x50000000 ); + + // Wait for the effect of write + while((DPReadCTRLSTAT() & 0xF0000000UL) != 0xF0000000UL); + + DAPSTATUS.on=1; + return CheckDAPSTATUS(); + } + DBG_MSG(("DAPPowerUp() FAIL\n")); + return TEST_FAIL; +} + + +uint32_t DAPPowerDown() +{ + uint32_t jtagnsw; + uint32_t error; + + DBG_MSG(("DAPPowerDown()\n")); + if(DAPSTATUS.on == 1) + { + DPWriteCTRLSTAT( 0x0 ); + + // Wait for the effect of write + while((DPReadCTRLSTAT() & 0xF0000000UL) != 0 ); + + // Re-Initialise DAPSTATUS, but preserve jtagnsw and error + jtagnsw = DAPSTATUS.jtagnsw; + error = DAPSTATUS.error; + InitDAPSTATUS(); + DAPSTATUS.jtagnsw = jtagnsw; + DAPSTATUS.error = error; + return CheckDAPSTATUS(); + } + DBG_MSG(("DAPPowerDown(): FAIL\n")); + return TEST_FAIL; +} + + +// Following functions all use the Comms Region + +uint32_t GetTAPID() +{ + DBG_MSG(("GetTAPID()\n")); + InitCommRegion(); + if(DAPSTATUS.jtagnsw == 1) + { + WriteCommRegion(0, (JTAGScanIDCODE() & 0xFFFFFFFFUL) ); + return CheckDAPSTATUS(); + } + return TEST_FAIL; +} + + +uint32_t GetDPReg() +{ + uint32_t dpreg; + uint32_t value; + + DBG_MSG(("GetDPReg()\n")); + + if(DAPSTATUS.on) + { + InitCommRegion(); + + dpreg = ReadCommRegion(0); + + if(DAPSTATUS.jtagnsw) + { + JtagAPnDP(DP); + JTAGScanDR(JTAG_SCAN(dpreg,READ)); + value = DPReadRDBUFF(); + } + else + { + SWHeader(SW_HEADER(DP, READ, dpreg)); + value = SWDataRead(); + } + + WriteCommRegion(0, value); + return CheckDAPSTATUS(); + } + return TEST_FAIL; +} + + +uint32_t GetAPReg() +{ + uint32_t apreg; + uint32_t value; + + DBG_MSG(("GetAPReg()\n")); + + if(DAPSTATUS.on) + { + InitCommRegion(); + apreg = ReadCommRegion(0); + + DPWriteBANKSEL( (apreg >> 4) & 0xF ); + + if(DAPSTATUS.jtagnsw) + { + JtagAPnDP(AP); + JTAGScanDR(JTAG_SCAN(apreg,READ)); + value = DPReadRDBUFF(); + } + else + { + SWHeader( SW_HEADER(AP, READ, apreg) ); + SWDataRead(); + value = DPReadRDBUFF(); + } + WriteCommRegion(0, value); + return CheckDAPSTATUS(); + } + return TEST_FAIL; +} + + +uint32_t GetAPMem() +{ + uint32_t addr; + uint32_t value; + + DBG_MSG(("GetAPMem()\n")); + + if(DAPSTATUS.on) + { + InitCommRegion(); + addr = ReadCommRegion(0); + DBG_MSG(("GetAPMem(%x)\n",addr)); + + value = ReadMem(addr); + DBG_MSG(("GetAPMem(%x) returned %x\n", addr, value)); + + WriteCommRegion(0, value); + return CheckDAPSTATUS(); + } + return TEST_FAIL; +} + + +uint32_t SetAPMem() +{ + uint32_t addr; + uint32_t value; + + DBG_MSG(("SetAPMem()\n")); + + if(DAPSTATUS.on) + { + InitCommRegion(); + addr = ReadCommRegion(0); + value = ReadCommRegion(1); + + if(addr&0x3 == 0) + { + WriteMem(addr, value); + return CheckDAPSTATUS(); + } + + DBG_MSG(("Only WORD writes are supported\n")); + } + return TEST_FAIL; +} + + +uint32_t GetAPMemCSIDs() +{ + // + // Use the Comm Region to return the CoreSight PID and CID values + // + // Pack the four byte values CID0-CID3 into one word + // Pack the four byte values PID0-PID3 into one word + // Pack the four byte values PID4-PID7 into one word + // + + uint32_t component_base; + + uint32_t csids[12]; + + uint32_t cid; + uint32_t pid_lo; + uint32_t pid_hi; + + DBG_MSG(("GetAPMemCSIDs()\n")); + + if(DAPSTATUS.on) + { + InitCommRegion(); + component_base = ReadCommRegion(0); + + // Read all 12 ID locations in one operation + ReadMemBlock((component_base + PID4_OFFSET), 12, csids); + + // Pack CID and PID information into 3 words + + // PID4 (0xFD0) + pid_hi = (csids[0] & 0xFF); + + // PID5 (0xFD4) + pid_hi |= ((csids[1] & 0xFF) << 8); + + // PID6 (0xFD8) + pid_hi |= ((csids[2] & 0xFF) << 16); + + // PID7 (0xFDC) + pid_hi |= ((csids[3] & 0xFF) << 24); + + // PID0 (0xFE0) + pid_lo = (csids[4] & 0xFF); + + // PID1 (0xFE4) + pid_lo |= ((csids[5] & 0xFF) << 8); + + // PID2 (0xFE8) + pid_lo |= ((csids[6] & 0xFF) << 16); + + // PID3 (0xFEC) + pid_lo |= ((csids[7] & 0xFF) << 24); + + // CID0 (0xFF0) + cid = (csids[8] & 0xFF); + + // CID1 (0xFF4) + cid |= ((csids[9] & 0xFF) << 8); + + // CID2 (0xFF8) + cid |= ((csids[10] & 0xFF) << 16); + + // CID3 (0xFFC) + cid |= ((csids[11] & 0xFF) << 24); + + WriteCommRegion(0, cid); + WriteCommRegion(1, pid_lo); + WriteCommRegion(2, pid_hi); + + return CheckDAPSTATUS(); + } + + return TEST_FAIL; +} + + +uint32_t ConnectWakeUnhalt() +{ + // + // Used to wake core up when sleeping + // + + uint32_t data; + + // Connect - Done by SetMode* + DBG_MSG(("ConnectWakeUnhalt()\n")); + + if(DAPSTATUS.on) + { + InitCommRegion(); + + // Check S_SLEEP + data=ReadMem(DHCSR_ADDR); + + if(data & S_SLEEP) + { + DBG_MSG(("Seen S_SLEEP\n")); + + // Core is sleeping, so set halting debug enable + WriteMem(DHCSR_ADDR, (DBGKEY | C_HALT | C_DEBUGEN) ); + DBG_MSG(("Written C_HALT\n")); + + // Wait for core to be halted + while((ReadMem(DHCSR_ADDR) & S_HALT) == 0); + DBG_MSG(("Seen S_HALT\n")); + + // Write flag into DATA[0] to allow example MCU code to escape its loop + WriteCommRegion(0, 1); + DBG_MSG(("Written flag\n")); + + // Clear Halt and debug enables + WriteMem(DHCSR_ADDR, DBGKEY); + DBG_MSG(("Cleared halt\n")); + + return CheckDAPSTATUS(); + } + + DBG_MSG(("Core not sleeping\n")); + return TEST_FAIL; + } + return TEST_FAIL; +} + + +uint32_t EnableHaltingDebug() +{ + DBG_MSG(("EnableHaltingDebug()\n")); + + if(DAPSTATUS.on) + { + // Set C_DEBUGEN bit + DBG_MSG(("EnableHaltingDebug()\n")); + + // Set Debug enable + WriteMem(DHCSR_ADDR, (DBGKEY | C_DEBUGEN) ); + DBG_MSG(("Written C_DEBUGEN\n")); + + return CheckDAPSTATUS(); + } + return TEST_FAIL; +} + + +uint32_t ConnectCheckUnlockup() +{ + uint32_t value; + + DBG_MSG(("ConnectCheckUnlockup()\n")); + + if(DAPSTATUS.on) + { + InitCommRegion(); + + // Check for S_LOCKUP + if(ReadMem(DHCSR_ADDR) & S_LOCKUP) + { + DBG_MSG(("Seen S_LOCKUP\n")); + + // Halt the core + WriteMem(DHCSR_ADDR, (DBGKEY | C_HALT | C_DEBUGEN) ); + DBG_MSG(("Written C_HALT\n")); + + // Wait for core to be halted + while((ReadMem(DHCSR_ADDR) & S_HALT) == 0); + DBG_MSG(("Seen S_HALT\n")); + + + // Replace faulting code sequence with a non-faulting + // sequence at the same address, to allow the core to + // exit HardFault and continue the main() code. + + // Get non-faulting value + value = ReadCommRegion(2); // Reads from (Cortex_MCU.stacktop + 0x8) + + // Write to execution location + WriteCommRegion(3, value); // Writes to (Cortex_MCU.stacktop + 0xC) + + //Get the RETURN register value + WriteMem(DCRSR_ADDR, (DebugReturnAddress)); + while( (ReadMem(DHCSR_ADDR) & S_REGRDY) == 0 ); + value = ReadMem(DCRDR_ADDR); + DBG_MSG(("Current DebugReturnAddress= %x\n", value)); + + + // Write address of the (now non-faulting) function + // as the DebugReturnAddress + value = (Cortex_MCU.stacktop + 0xC); + WriteMem(DCRDR_ADDR, value); + WriteMem(DCRSR_ADDR, (REGWnR | DebugReturnAddress)); + while( (ReadMem(DHCSR_ADDR) & S_REGRDY) == 0 ); + DBG_MSG(("Wrote return address= %x\n", value)); + + // Unhalt + WriteMem(DHCSR_ADDR, DBGKEY); + DBG_MSG(("Cleared C_HALT\n")); + + return CheckDAPSTATUS(); + } + DBG_MSG(("Core not in lockup\n")); + return TEST_FAIL; + } + return TEST_FAIL; +} + + +uint32_t DAPAccess() +{ + // + // Perform WORD, HALFWORD, and BYTE accesses + // + + uint32_t retval = 0; + + DBG_MSG(("DAPAccess()\n")); + + if(DAPSTATUS.on) + { + InitCommRegion(); + + // Zero a WORD + WriteMem(Cortex_MCU.stacktop, 0); + + // Check WORD reads as zero + if(ReadMem(Cortex_MCU.stacktop) == 0) + { + retval |= 0x1; + DBG_MSG(("Word was clear\n")); + } + + // Write a HALFWORD + WriteMemH((Cortex_MCU.stacktop + 2), 0x3456); + + // Read a WORD, check for expected value + if(ReadMem(Cortex_MCU.stacktop) == 0x34560000) + { + retval |= 0x2; + DBG_MSG(("Read back correct value\n")); + } + else + { + DBG_MSG(("Incorrect value - FAIL\n")); + } + + // Write a BYTE + WriteMemB((Cortex_MCU.stacktop + 1), 0x12); + + // Read a WORD, check for expected value + if(ReadMem(Cortex_MCU.stacktop) == 0x34561200) + { + retval |= 0x4; + DBG_MSG(("Read back correct value\n")); + } + else + { + DBG_MSG(("Incorrect value - FAIL\n")); + } + + WriteCommRegion(0, retval); + DBG_MSG(("Written retval: %x\n", retval)); + + return CheckDAPSTATUS(); + } + return TEST_FAIL; +} + + +uint32_t ConfigTrace(void) +{ + // + // Function to provide support for trace testing. + // Initialise the trace capture, and should be after + // trace port has been set-up. + // + + DBG_MSG(("ConfigTrace()\n")); + + if(DAPSTATUS.on) + { + InitCommRegion(); + // Get config to use from test core. + TRACE->CONFIG = ReadCommRegion(0); // Reads from (Cortex_MCU.stacktop); + DBG_MSG(("TRACE->CONFIG= %x\n",TRACE->CONFIG)); + Cortex_MCU.traceconfigured = 1; + return CheckDAPSTATUS(); + } + return TEST_FAIL; +} + + +uint32_t CheckTrace(void) +{ + // + // Function to provide support for trace testing. + // Read formatted data from buffer and + // decompress individual streams + // + // Trace is printed, and also counted to allow tests to check + // the relevant packets were generated + // + + uint32_t i = 7; + uint32_t frame_buffer[4]; + uint32_t lsb_bits; + + DBG_MSG(("CheckTrace()\n")); + + if(DAPSTATUS.on) + { + if(Cortex_MCU.traceconfigured == 0) + { + DBG_MSG(("ERROR : ConfigTrace has not been ran before CheckTrace, or CheckTrace executed again without rerunning ConfigTrace\n")); + return TEST_FAIL; + } + else + { + InitCommRegion(); + + // Set Cortex_MCU.traceconfigured = 0 again to reconfigure trace next time when + // it is called. This make it possible for testing ITM/ITMSW/DTM/DTMSW + // in one main file. + Cortex_MCU.traceconfigured = 0; + + DBG_MSG(("Trace Decompress\n")); + DBG_MSG(("initial i= %x, trace_errors=%x\n", i, trace_errors)); + DBG_MSG(("initial TRACE->DEPTH = %x\n", TRACE->DEPTH)); + DBG_MSG(("initial TRACE->STATUS = %x\n", TRACE->STATUS)); + if ((TRACE->DEPTH ==0) &((TRACE->STATUS & 0x8)==0)) { //Trace depth is zero and no overflow + DBG_MSG(("No trace captured\n")); + + return TEST_FAIL; + } + + if ((TRACE->STATUS & 0x8)==0x8) { //Trace capture buffer overflow + DBG_MSG(("Trace capture buffer overflow\n")); + return TEST_FAIL; + } + DBG_MSG(("initial i= %x, trace_errors=%x\n", i, trace_errors)); + // Grab frame of data + while((i==7) && (trace_errors == 0)) + { + DBG_MSG((".")); + for(i=0;i<4;i++) + { + frame_buffer[i] = TRACE->DATA; + if (frame_buffer[i] == 0x7FFFFFFFUL) + { + if (i==0) + { + DBG_MSG(("No more Frames\n")); + i=5; + } + else + { + DBG_MSG(("Incomplete Frame. At %d, %08x:%08x:%08x:%08x:\n",i, + frame_buffer[0],frame_buffer[1],frame_buffer[2],frame_buffer[3])); + i=5; + trace_errors++; + } + } + } + // Decompress frame + if(i==4) + { + fmt_frames++;; + lsb_bits = frame_buffer[3] >> 24; + for(i=0;i<7;i++) + { + if((frame_buffer[i/2] & 0x1) == 0x1) + { + if ((lsb_bits & 1) == 1) + { + ParseTrace(((frame_buffer[i/2]) >> 8) & 0xFF); + trace_id = (((frame_buffer[i/2]) >> 1) & 0x7F); + } + else + { + trace_id = (((frame_buffer[i/2]) >> 1) & 0x7F); + ParseTrace(((frame_buffer[i/2]) >> 8) & 0xFF); + } + } + else + { + ParseTrace((frame_buffer[i/2] & 0xFE) | + (lsb_bits & 1)); + ParseTrace(((frame_buffer[i/2]) >> 8) & 0xFF); + } + frame_buffer[i/2] = ((frame_buffer[i/2]) >> 16); + lsb_bits = lsb_bits >> 1; + } + // Byte 14 handled outside of loop Should not be early ID + if((frame_buffer[3] & 0x1) == 1) + { + if(lsb_bits != 0 ) + { + trace_errors ++; + DBG_MSG(("\nByte 14 is ID with LSB set, should be data\n")); + } + else + { + trace_id = ((frame_buffer[3] >> 1) & 0x7F); + } + } + else + { + ParseTrace((frame_buffer[3] & 0xFE) | lsb_bits); + } + } + } + DBG_MSG(("\nTrace extraction done, %d\n",trace_errors)); + // Write trace statistics into MCU memmory. May be some corruption if counts are too large + // Maximum of 256 frames, 3840 ETM bytes + // [0] fmt_trig[2], fmt_itm[10], fmt_etm[12], fmt_frames[8] + // [1] exceptions[4], branches[8], Isync[6], p_headers [14] + // [2] itm_sync[2] itm_overflow[2], itm_glb2[4], itm_glb1[8], triggers[2], ignore [2], timestamps[8], rfe[4] + // [3] itm_ts[5], itm_sw[5], itm_event[6], itm_periodic[5], itm_exception[5], itm_comp[6] + WriteCommRegion(0, ((fmt_triggers << 30) | (fmt_itm << 20) | (fmt_etm <<8) | fmt_frames) ); + WriteCommRegion(1, (etm_p_headers | etm_i_sync <<14 | etm_branches<<20| etm_exceptions<<28)); + WriteCommRegion(2, (etm_rfe | etm_timestamps<<4 | etm_ignore<<12 | etm_triggers <<14 | + itm_glb1 << 16 | itm_glb2 << 24 | itm_overflow <<28 | itm_sync << 2)); + WriteCommRegion(3, (itm_ts<<27 | itm_sw<<22 | itm_event <<16 | itm_periodic <<11 | itm_exception <<6 | itm_comp)); + + return trace_errors; + } + } + return TEST_FAIL; +} + + +uint32_t ParseTrace(uint8_t new_byte) +{ + // ID 0 is null, used for padding. Although not architected, expect to only see data=0 + // + switch (trace_id) + { + case 0: + if(new_byte != 0) + { + DBG_MSG(("NULL ID (0) with non-zero data byte:%02x\n",new_byte)); + trace_errors++; + } + break; + + case MCU_ETM_ID: + + fmt_etm++; + TRC_MSG(("%02x ",new_byte)); + switch (etm_current) + { + case 00: + if(new_byte==0) // Sync Packet + { + etm_current = 1; + etm_bytes++; + } + else if((new_byte & 1) ==1) // Branch Packet + { + current_address = (current_address & 0xFFFFFF80UL) | + (new_byte & 0x7E); + if((new_byte & 0x80)==0x80) + { + etm_current = 2; + etm_packet[0] = new_byte; + etm_bytes++; + } + else + { + TRC_MSG(("Branch to %08x\n",current_address)); + etm_branches++; + } + } + else if(new_byte ==0x08) // I-Sync packet + { + etm_current = 4; + } + else if(new_byte ==0x0C) // Trigger, single byte + { + TRC_MSG(("ETM Trigger\n")); + etm_triggers++; + } + else if(new_byte ==0x66) // Ignore, single byte + { + TRC_MSG(("ETM Ignore byte\n")); + etm_ignore++; + } + else if(new_byte ==0x76) // RFE, single byte + { + TRC_MSG(("ETM Exception Return\n")); + etm_rfe++; + } + else if((new_byte & 0x80 )== 0x80) // P-header, single byte + { + etm_p_headers++; + TRC_MSG(("P-header, ")); + if((new_byte & 0x3) == 0) { + if((new_byte & 0x3C) !=0) { + TRC_MSG(("%d CC pass ",(new_byte & 0x3C)>>2)); + } + if((new_byte & 0x40) !=0) { + TRC_MSG(("1 CC Fail ")); + } + TRC_MSG(("\n")); + } + else + { + if((new_byte & 0xF0) != 0x80) + { + DBG_MSG(("Bad P-Header\n")); + trace_errors++; + } + etm_p_headers++; + if((new_byte & 0x8) == 0x0) + { + TRC_MSG(("CC-Pass,")); + } + else + { + TRC_MSG(("CC-Fail,")); + } + if((new_byte & 0x4) == 0x0) + { + TRC_MSG(("CC-Pass\n")); + } + else + { + TRC_MSG(("CC-Fail\n")); + } + } + } + else if((new_byte | 0x04 )== 0x46) // Timestamp + { + etm_current = 8; + etm_bytes=0; + TRC_MSG(("ETM Timestamp, R-bit%d\n",(new_byte>>2) & 1)); + etm_timestamps++; + } + else + { + trace_errors++; + DBG_MSG(("Bad ETM Byte\n")); + TRC_MSG(("Header %02x Unknown\n",new_byte)); + } + break; + case 0x01: // Sync packet. 0x00 or 0x80 + if(new_byte==0) + { + etm_bytes++; + } + else if(new_byte==0x80) + { + etm_bytes=0; + etm_current = 0; + TRC_MSG(("Sync Packet\n")); + } + break; + case 0x02: // Branch Packet. Uses continuation bits + etm_packet[etm_bytes] = new_byte; + etm_bytes++; + if((new_byte >>7) == 0) + { + switch (etm_bytes) + { + case 2: // bits[12:7] + current_address = (current_address & 0xFFFFD07F) | ((new_byte & 0x3E) << 6); + break; + case 3: // bits[19:14] + current_address = (current_address & 0xFFF03FFF) | ((new_byte & 0x3E) << 13); + break; + case 4: // bits[26:21] + current_address = (current_address & 0xF81FFFFF) | ((new_byte & 0x3E) << 20); + break; + case 5: // bits[31:28] + trace_errors++; + DBG_MSG(("Branch Packet Too long\n")); + break; + } + TRC_MSG(("Branch Packet - Address %08x\n",current_address)); + etm_branches++; + etm_bytes = 0; + // Check for exception bytes + if((new_byte >>6) == 0) + { + etm_current = 0; + } + else + { + etm_current = 0x10; + } + } + else + { + if(etm_bytes > 6) { + DBG_MSG(("Branch Packet too long\n")); + trace_errors++; + switch (etm_bytes) + { + case 2: // bits[13:7] + current_address = (current_address & 0xFFFFC07F) | ((new_byte & 0x7E) << 6); + break; + case 3: // bits[20:14] + current_address = (current_address & 0xFFE03FFF) | ((new_byte & 0x7E) << 13); + break; + case 4: // bits[27:21] + current_address = (current_address & 0xF01FFFFF) | ((new_byte & 0x7E) << 20); + break; + case 5: // bits[31:28] + current_address = (current_address & 0x0FFFFFFF) | ((new_byte & 0x7E) << 27); + break; + } + } + } + break; + case 0x04: // I-sync packet. Fixed length for CM3-ETM / CM4-ETM + etm_packet[etm_bytes] = new_byte; + etm_bytes++; + if(etm_bytes == 5) + { + current_address = (etm_packet[1] & 0xFE) | + (etm_packet[2] << 8) | (etm_packet[3] << 16) | (etm_packet[4] << 24) ; + if((etm_packet[0] & 0x9F) != 0x01) + { + trace_errors++; + DBG_MSG(("Bad Isync information byte %02x\n",etm_packet[0])); + } + TRC_MSG(("I-Sync Packet ")); + switch(etm_packet[0]>>5 & 3) + { + case 0: TRC_MSG(("Periodic")); + break; + case 1: TRC_MSG(("Trc On")); + break; + case 2: TRC_MSG(("Overflow")); + break; + case 3: TRC_MSG(("Debug")); + } + TRC_MSG((", Address %08x\n",current_address)); + etm_i_sync++; + etm_bytes = 0; + etm_current = 0; + } + break; + case 0x08: // Timestamp Packet + etm_bytes++; + switch (etm_bytes) + { + case 1: + etm_ts1 = (etm_ts1 & 0xFFFFFF80UL) | (new_byte & 0x7F); + break; + case 2: + etm_ts1 = (etm_ts1 & 0xFFFFC07FUL) | (new_byte & 0x7F)<<7; + break; + case 3: + etm_ts1 = (etm_ts1 & 0xFFE03FFFUL) | (new_byte & 0x7F)<<14; + break; + case 4: + etm_ts1 = (etm_ts1 & 0xF01FFFFFUL) | (new_byte & 0x7F)<<21; + break; + case 5: + etm_ts1 = (etm_ts1 & 0x0FFFFFFFUL) | (new_byte & 0x0F)<<28; + etm_ts2 = (etm_ts2 & 0xFFFFFFF8UL) | (new_byte & 0x70)>>4; + break; + case 6: + etm_ts2 = (etm_ts2 & 0xFFFFFC07UL) | (new_byte & 0x7F)<<3; + break; + case 7: + etm_ts2 = (etm_ts2 & 0xFFFF03FFUL) | (new_byte & 0x3F)<<10; + if(new_byte & 0xC0 !=0) + { + DBG_MSG(("Last timestamp byte should have [7:6]=00\n")); + trace_errors++; + etm_current = 0; + } + break; + } + if((new_byte >> 7) ==0) + { + if ((etm_ts1 < etm_ts1_last) & etm_bytes <5) + { + DBG_MSG(("Timestamp must increase\n")); + trace_errors++; + } + TRC_MSG(("ETM Timestamp %04x%08x\n",etm_ts2,etm_ts1)); + etm_current = 0; + etm_bytes=0; + } + break; + case 0x10: // Exception packet + etm_bytes++; + if((new_byte>>7) == 0) + { + etm_bytes=0; + etm_current = 0; + TRC_MSG(("Exception Taken\n")); + etm_exceptions++; + } + else + { + if(etm_bytes > 2) + { + trace_errors++; + DBG_MSG(("Exception packet too long\n")); + } + } + break; + default: + DBG_MSG(("Trace parser crashed\n")); + trace_errors++; + break; + } + break; + + case MCU_ITM_ID: + + DBG_MSG(("ITM:%02x\n",new_byte)); + fmt_itm++; + switch (itm_current) + { + case 0x00: + if(new_byte == 00) + { + itm_current = 1; // Sync + itm_bytes=1; + } + else if(new_byte == 0x70) // Overflow + { + itm_overflow++; + TRC_MSG(("ITM Overflow\n")); + } + else if((new_byte & 0x0F) == 0) // local timestamp + { + if ((new_byte & 0x80) == 0) // single byte TS + { + TRC_MSG(("ITM TS :%d\n",(new_byte & 0x70) >> 4)); + itm_ts++; + } + else + { + itm_current = 2; + itm_header = new_byte; + itm_payload = 0; + itm_bytes=1; + } + } + else if(new_byte == 0x94) // ts1 + { + itm_current = 4; + itm_header = new_byte; + itm_payload = 0; + itm_bytes=1; + } + else if(new_byte == 0xB4) // ts2 + { + itm_current = 8; + itm_header = new_byte; + itm_payload = 0; + itm_bytes=1; + } + else if((new_byte & 0x3) != 0) // Stimulus packet + { + itm_current = 16; + itm_header = new_byte; + itm_payload = 0; + itm_bytes=0; + switch (new_byte & 0x3) + { + case 1: itm_size = 1; + break; + case 2: itm_size = 2; + break; + case 3: itm_size = 4; + break; + } + } + else + { + trace_errors++; + DBG_MSG(("Un-recognised ITM\n")); + TRC_MSG((" BAD Header %02x\n",new_byte)); + } + break; + case 0x01: + itm_bytes ++; + if(new_byte == 0x80) + { + TRC_MSG(("ITM Sync\n")); + itm_sync++; + itm_current = 0; + itm_bytes = 0; + } + if((new_byte & 0x7F) != 0) + { + trace_errors++; + itm_current = 0; + itm_bytes = 0; + DBG_MSG(("ITM Bad sync byte %02x\n",new_byte)); + } + break; + case 0x02: + itm_payload = (itm_payload <<7) | (new_byte & 0x7F); + if ((new_byte & 0x80) == 0) + { + switch (itm_header>>4 & 3) + { + case 0: TRC_MSG(("ITM TS delta:%d\n",itm_payload)); + break; + case 1: TRC_MSG(("ITM Late TS :%d\n",itm_payload)); + break; + case 2: TRC_MSG(("ITM TS for delayed packet :%d\n",itm_payload)); + break; + case 3: TRC_MSG(("ITM late TS for delayed packet:%d\n",itm_payload)); + break; + } + itm_ts++; + itm_current = 0; + itm_bytes =0; + } + else + { + itm_bytes++; + if (itm_bytes > 5) + { + trace_errors++; + DBG_MSG(("ITM timestamp packet too long\n")); + itm_current = 0; + itm_bytes =0; + } + } + break; + case 0x04: + switch (itm_bytes) + { + case 1: + itm_ts1 = (itm_ts1 & 0xFFFFFF10) | (new_byte & 0x7f); + break; + case 2: + itm_ts1 = (itm_ts1 & 0xFFFFC07F) | ((new_byte & 0x7f) <<7); + break; + case 3: + itm_ts1 = (itm_ts1 & 0xFFF03FFF) | ((new_byte & 0x7f) <<14); + break; + case 4: + itm_ts1 = (itm_ts1 & 0xFF10FFFF) | ((new_byte & 0x7f) <<21); + break; + } + itm_bytes++; + if((new_byte & 0x80) == 0x00) + { + TRC_MSG(("ITM Global TS1 :%d\n",itm_ts1 & 0x03FFFFFFUL)); + itm_glb1 ++; + if(itm_ts1 > 0) + { + if((itm_ts1 < itm_ts1_last) & (new_byte & 0x40 == 0x00)) + { + DBG_MSG(("Timestamp should increase")); + trace_errors++; + } + itm_ts1_last = itm_ts1; + } + if (itm_bytes == 5) + { + if((new_byte & 0x20) == 0x20) + { + TRC_MSG(("ITM Global Clock Change\n")); + } + if((new_byte & 0x40) == 0x40) + { + TRC_MSG(("ITM Global low count bits wrapped\n")); + } + } + itm_current = 0; + } + else + { + if (itm_bytes == 5) + { + DBG_MSG(("ITM TS1 too long\n")); + trace_errors++; + itm_current = 0; + itm_bytes =0; + } + } + break; + case 0x08: + switch (itm_bytes) + { + case 1: + itm_ts2 = (itm_ts2 & 0xFFFFFF10) | (new_byte & 0x7f); + break; + case 2: + itm_ts2 = (itm_ts2 & 0xFFFFC07F) | ((new_byte & 0x7f) <<7); + break; + case 3: + itm_ts2 = (itm_ts2 & 0xFFF03FFF) | ((new_byte & 0x7f) <<14); + break; + case 4: + itm_ts2 = (itm_ts2 & 0xFF10FFFF) | ((new_byte & 0x7f) <<21); + break; + } + itm_bytes++; + if((new_byte & 0x80) == 0x00) + { + TRC_MSG(("ITM Global TS2 :%d\n",itm_ts2 & 0x007FFFFFUL)); + itm_glb2 ++; + if (itm_bytes == 5) + { + if(new_byte & 0xFE != 0x00) + { + DBG_MSG(("ITM TS2 byte 5 can only have bit[0] set\n")); + trace_errors++; + } + } + itm_current = 0; + } + else + { + if (itm_bytes == 5) + { + DBG_MSG(("ITM TS2 too long\n")); + trace_errors++; + itm_current = 0; + itm_bytes =0; + } + } + break; + case 0x10: + itm_payload = itm_payload | (new_byte << (itm_bytes * 8)); + itm_bytes ++; + if(itm_bytes == itm_size) + { + if ((itm_header & 4) == 0) + { + TRC_MSG(("ITM s/w channel %d, %08x\n",itm_header>>3,itm_payload)); + itm_sw++; + } + else + { + switch(itm_header>>3) + { + case 0://Event packet + TRC_MSG(("ITM #")); + if((itm_payload & 1) == 1) { + TRC_MSG((" CPI")); + itm_event++; + } + if((itm_payload & 2) == 2) { + TRC_MSG((" Exc")); + itm_event++; + } + if((itm_payload & 4) == 4) { + TRC_MSG((" Sleep")); + itm_event++; + } + if((itm_payload & 8) == 8) { + TRC_MSG((" LSU")); + itm_event++; + } + if((itm_payload & 16) == 16) { + TRC_MSG((" FOLD")); + itm_event++; + } + if((itm_payload & 32) == 32) { + TRC_MSG((" Cyc")); + itm_event++; + } + TRC_MSG((" Event\n")); + break; + case 1://Exception Packet + switch (itm_payload >> 12) + { + case 1: + TRC_MSG(("ITM Exception Entry %d\n",itm_payload & 0x1ff)); + break; + case 2: + TRC_MSG(("ITM Exception Exit %d\n",itm_payload & 0x1ff)); + break; + case 3: + TRC_MSG(("ITM Exception Return %d\n",itm_payload & 0x1ff)); + break; + } + itm_exception++; + break; + case 2: + if(itm_size == 4) { + TRC_MSG(("ITM PC periodic %08x\n",itm_payload)); + } else { + TRC_MSG(("ITM PC periodic, sleeping\n")); + } + itm_periodic++; + break; + default: // Other sources + if((itm_header & 0xC4) == 0x84){ + TRC_MSG(("ITM Data Value %d:",(itm_header>> 4) & 3)); + if ((itm_header & 8) == 0){ + TRC_MSG(("Read ")); + } else { + TRC_MSG(("Write ")); + } + TRC_MSG((" %08x\n",itm_payload)); + } + if((itm_header & 0xCF) == 0x47) { + TRC_MSG(("ITM Data PC %d:%08x\n",(itm_header>> 4) & 3,itm_payload)); + } + if((itm_header & 0xCF) == 0x4E) { + TRC_MSG(("ITM Data Address offset %d:%08x\n",(itm_header>> 4) & 3,itm_payload)); + } + if((itm_header >> 5) == 3) { + TRC_MSG(("ITM Unspecified HW source %d:%08x\n",(itm_header>> 3),itm_payload)); + trace_errors++; + } + itm_comp++; + } + } + itm_current = 0; + itm_bytes =0; + } + break; + } + break; + case 0x7D: + if(new_byte != 0) + { + DBG_MSG(("Trigger with non-zero data byte:%02x\n",new_byte)); + } + TRC_MSG(("Formatter Trigger\n")); + fmt_triggers++; + break; + default: + trace_errors ++; + DBG_MSG(("Unexpected ID:%02x\n",trace_id)); + break; + } + return 0; +} + + +uint32_t EmptyFunction() +{ + DBG_MSG(("EmptyFunction()\n")); + + return TEST_FAIL; +} + + +//////////////////////////////////////////////////////////////////////////////// +// +// Internal Functions - Wire Protocol agnostic +// +//////////////////////////////////////////////////////////////////////////////// + +void InitDAPSTATUS() +{ + // + // Initialise DAPSTATUS struct - use from reset, or if DAP powered down + // + DAPSTATUS.jtagnsw = 0; // Serial Wire + DAPSTATUS.jtagapndp = 2; // Invalid value + DAPSTATUS.on = 0; // DAP powered off + DAPSTATUS.banksel = 0xff; // Invalid banksel value + DAPSTATUS.csw = 0xffffffff;// Invalid CSW value - we haven't set up CSW + DAPSTATUS.error = 0; // No errors + DAPSTATUS.ack = 0; // Invalid value for ack + DAPSTATUS.stkerrclr = 0; // Not cleared +} + + +void InitCommRegion() +{ + // + // Get value for Cortex_MCU.stacktop by reading example MCU vector table + // + if(Cortex_MCU.stacktop == 0) + { + DBG_MSG(("InitCommRegion()\n")); + Cortex_MCU.stacktop = ReadMem(0); + Cortex_MCU.stacktop = SwapEndian(Cortex_MCU.stacktop); + DBG_MSG(("InitCommRegion() StackPointer = %x\n",Cortex_MCU.stacktop )); + } +} + + +uint32_t SwapEndian(uint32_t data) +{ + // + // Swap endianness of data values if CPUs are BigEndian, since + // the DAP routines are inherently LE + // + + if(EXPECTED_BE) + { + // CPU under test is in BigEndian, so swap data endianness + return __REV(data); + } + else + { + return data; + } +} + + +uint32_t ReadCommRegion(uint32_t index) +{ + return SwapEndian( ReadMem( Cortex_MCU.stacktop + (4 * index))); +} + + +void WriteCommRegion(uint32_t index, uint32_t data) +{ + WriteMem( (Cortex_MCU.stacktop + (4 * index)), SwapEndian(data) ); +} + + +uint32_t ReadMem(uint32_t address) +{ + // + // return the WORD value found at address + // + + uint32_t value; + + // Ensure CSW is set up + APWriteCSW(CSW_PROT_MASTER_DBG | CSW_PROT_PRIV | CSW_INCR_OFF | CSW_SIZE_WORD); + + // Write TAR + APWriteTAR(address); + + // Read DRW + APReadDRW(); + + // Read RdBuff + value = DPReadRDBUFF(); + + DBG_MSG(("ReadMem(%x), returned: %x\n", address,value)); + + return value; +} + + +uint32_t ReadMemH(uint32_t address) +{ + // + // return the HALFWORD value found at address + // + + uint32_t value; + + // Ensure CSW is set up + APWriteCSW(CSW_PROT_MASTER_DBG | CSW_PROT_PRIV | CSW_INCR_OFF | CSW_SIZE_HALFWORD); + + // Write TAR + APWriteTAR(address); + + // Read DRW + APReadDRW(); + + // Read RdBuff + value = DPReadRDBUFF(); + + DBG_MSG(("ReadMemH(%x), returned: %x\n", address,value)); + + return value; +} + + +uint32_t ReadMemB(uint32_t address) +{ + // + // return the BYTE value found at address + // + + uint32_t value; + + // Ensure CSW is set up + APWriteCSW(CSW_PROT_MASTER_DBG | CSW_PROT_PRIV | CSW_INCR_OFF | CSW_SIZE_BYTE); + + // Write TAR + APWriteTAR(address); + + // Read DRW + APReadDRW(); + + // Read RdBuff + value = DPReadRDBUFF(); + + DBG_MSG(("ReadMemB(%x), returned: %x\n", address,value)); + + return value; +} + + +void ReadMemBlock(uint32_t address, uint32_t numwords, uint32_t * data) +{ + // + // Return numword WORDS from address into the data array + // + + uint32_t tar; + uint32_t wordsread; + + DBG_MSG(("ReadMemBlock(%x, %x)\n",address, numwords)); + + // Ensure CSW is set up + APWriteCSW(CSW_PROT_MASTER_DBG | CSW_PROT_PRIV | CSW_INCR_SINGLE | CSW_SIZE_WORD); + + // Keep local copy of TAR + tar = address; + + // Write TAR + APWriteTAR(tar); + + for(wordsread = 0; wordsread < numwords; wordsread++) + { + // If the local copy of the TAR value increments beyond the bottom 10 bits, + // reload the DAP TAR. (ADIv5 Arch states that autoincrement beyond the + // bottom 10 bits is implementation defined.) + if(!(tar & 0x3FF)) + { + APWriteTAR(tar); + } + + if(wordsread) + { + data[wordsread-1] = APReadDRW(); + } + else + { + // Discard data from initial Read + APReadDRW(); + } + tar += 4; + } + + // Read final word from the Read Buffer + data[wordsread-1] = DPReadRDBUFF(); +} + + +uint32_t ReadMemSpecial(uint32_t address, uint8_t size, uint32_t user) +{ + // + // return the value found at address. if the DAPSTATUS error + // is set as a result of this read (assuming no prior errors), + // the CTRL/STAT register is read to check sticky ERR bit and + // then ABORT register written to clear the sticky ERR bit + // + uint32_t value; + uint32_t ctrlstat; + + // Ensure CSW is set up + APWriteCSW(CSW_PROT_MASTER_DBG | CSW_INCR_OFF | size | user); + + // Write TAR + APWriteTAR(address); + + // Read DRW + APReadDRW(); + + // Read RdBuff + value = DPReadRDBUFF(); + + // For JTAG, CTRLSTAT needs to be read + // for faults. Ack doesn't indicate fault + if(DAPSTATUS.jtagnsw) + { + ctrlstat = DPReadCTRLSTAT(); + if((ctrlstat >> 5) & 1UL) + DAPSTATUS.error++; + } + + // Read CTRLSTAT to check STICKYERR + // if STICKYERR is set, clear it + if(DAPSTATUS.error == 1) + { + if(DAPSTATUS.jtagnsw) + { + // Already read earlier + DBG_MSG(("DAP access faulted, clearing sticky error bit\n")); + DPClearSTICKYERR(); + DAPSTATUS.stkerrclr = 1; + } + else + { + ctrlstat = DPReadCTRLSTAT(); + + if((ctrlstat >> 5) & 1UL) + { + DBG_MSG(("DAP access faulted, clearing sticky error bit\n")); + DPClearSTICKYERR(); + DAPSTATUS.stkerrclr = 1; + } + } + + DAPSTATUS.error = 0; + } + else if(DAPSTATUS.error > 1) + DBG_MSG(("More than one DAP error seen! Unexpected so not clearing sticky error bit\n")); + + DBG_MSG(("ReadMemSpecial(%x), returned: %x\n", address,value)); + + return value; +} + +void WriteMem(uint32_t address, uint32_t data) +{ + // + // Write WORD value back to target memory + // + + DBG_MSG(("WriteMem(%x, %x)\n",address, data)); + + // Ensure CSW is set up + APWriteCSW(CSW_PROT_MASTER_DBG | CSW_PROT_PRIV | CSW_INCR_OFF | CSW_SIZE_WORD); + + // Write TAR + APWriteTAR(address); + + // Write DRW + APWriteDRW(data); + + // Read RdBuff to flush the write + DPReadRDBUFF(); +} + + +void WriteMemBlock(uint32_t address, uint32_t numwords, uint32_t * data) +{ + // + // Write numwords WORD values to target memory + // + + uint32_t tar; + uint32_t wordswritten; + + DBG_MSG(("WriteMemBlock(%x, %x, %x)\n",address, numwords, data)); + + // Write CSW : Word, incrementing address + APWriteCSW(CSW_PROT_MASTER_DBG | CSW_PROT_PRIV | CSW_INCR_SINGLE | CSW_SIZE_WORD); + + // Keep local copy of TAR + tar = address; + + // Write TAR + APWriteTAR(tar); + DBG_MSG(("Written 0x%x to TAR\n",tar)); + + for(wordswritten = 0; wordswritten < numwords; wordswritten++) + { + // If the local copy of the TAR value increments beyond the bottom 10 bits, + // reload the DAP TAR. (ADIv5 Arch states that autoincrement beyond the + // bottom 10 bits is implementation defined.) + if(!(tar & 0x3FF)) + { + APWriteTAR(tar); + DBG_MSG(("Written 0x%x to TAR\n",tar)); + } + + // Write DRW + APWriteDRW(data[wordswritten]); + tar += 4; + } + + // Read RdBuff to flush the last write + DPReadRDBUFF(); +} + + +void WriteMemH(uint32_t address, uint32_t data) +{ + // + // Write HALFWORD value back to target memory + // + + uint32_t ldata; + + ldata = data | (data << 16); + + DBG_MSG(("WriteMemH(%x, %x)\n",address, ldata)); + + // Ensure CSW is set up + APWriteCSW(CSW_PROT_MASTER_DBG | CSW_PROT_PRIV | CSW_INCR_OFF | CSW_SIZE_HALFWORD); + + // Write TAR + APWriteTAR(address); + + // Write DRW + APWriteDRW(ldata); + + // Read RdBuff to flush the write + DPReadRDBUFF(); +} + + +void WriteMemB(uint32_t address, uint32_t data) +{ + // + // Write BYTE value back to target memory + // + + uint32_t ldata; + + ldata = data | (data << 8); + ldata = ldata | (ldata << 16); + + DBG_MSG(("WriteMemB(%x, %x)\n",address, ldata)); + + // Ensure CSW is set up + APWriteCSW(CSW_PROT_MASTER_DBG | CSW_PROT_PRIV | CSW_INCR_OFF | CSW_SIZE_BYTE); + + // Write TAR + APWriteTAR(address); + + // Write DRW + APWriteDRW(ldata); + + // Read RdBuff to flush the write + DPReadRDBUFF(); +} + + +void JtagAPnDP(uint32_t apndp) +{ + // + // JTAG switch scanchains + // + if(DAPSTATUS.jtagapndp != apndp) + { + if(apndp) + { + // AP + JTAGScanIR(JTAG_APACC); + } + else + { + // DP + JTAGScanIR(JTAG_DPACC); + } + DAPSTATUS.jtagapndp = apndp; + } +} + + +void DPWriteBANKSEL(uint32_t banksel) +{ + // + // Set DP register BANKSEL + // + + if(DAPSTATUS.banksel != banksel) + { + if(DAPSTATUS.jtagnsw) + { + JtagAPnDP(0); + JTAGScanDR( (banksel << 7) | JTAG_SCAN(SELECT,WRITE) ); + } + else + { + SWHeader( SW_HEADER(DP, WRITE, SELECT) ); + SWDataWrite( banksel << 4 ); + } + DAPSTATUS.banksel = banksel; + } +} + + +void DPWriteCTRLSTAT(uint32_t ctrlstat) +{ + if(DAPSTATUS.jtagnsw) + { + JtagAPnDP(0); + JTAGScanDR( (((uint64_t) ctrlstat) << 3) | JTAG_SCAN(CTRLSTAT,WRITE) ); + } + else + { + SWHeader( SW_HEADER(DP, WRITE, CTRLSTAT) ); + SWDataWrite( ctrlstat ); + } +} + + +uint32_t DPReadCTRLSTAT() +{ + uint32_t data; + + if(DAPSTATUS.jtagnsw) + { + JtagAPnDP(0); + JTAGScanDR( JTAG_SCAN(CTRLSTAT,READ) ); + data = DPReadRDBUFF(); + } + else + { + SWHeader( SW_HEADER(DP, READ, CTRLSTAT) ); + data = SWDataRead(); + } + return data; +} + +uint32_t APReadCSW() +{ + uint32_t data; + + // CSW is in bank 0 (APBANKSEL=0) + DPWriteBANKSEL(0UL << 4); + + if(DAPSTATUS.jtagnsw) + { + JtagAPnDP(1); + JTAGScanDR( JTAG_SCAN(CSW, READ) ); + data = DPReadRDBUFF(); + } + else + { + SWHeader( SW_HEADER(AP, READ, CSW) ); + SWDataRead(); + data =DPReadRDBUFF(); + } + return data; +} + +void APWriteCSW(uint32_t csw) +{ + // Set up CSW + if(DAPSTATUS.csw != csw) + { + // CSW is in bank 0 + DPWriteBANKSEL(0UL << 4); + + if(DAPSTATUS.jtagnsw) + { + JtagAPnDP(1); + JTAGScanDR( (((uint64_t) csw) << 3) | JTAG_SCAN(CSW,WRITE) ); + } + else + { + SWHeader( SW_HEADER(AP, WRITE, CSW) ); + SWDataWrite( csw ); + } + DAPSTATUS.csw = csw; + } +} + + +void APWriteTAR(uint32_t address) +{ + // TAR is in bank 0 + DPWriteBANKSEL(0UL << 4); + + if(DAPSTATUS.jtagnsw) + { + JtagAPnDP(1); + JTAGScanDR( (((uint64_t) address) << 3) | JTAG_SCAN(TAR,WRITE) ); + } + else + { + SWHeader( SW_HEADER(AP, WRITE, TAR) ); + SWDataWrite( address ); + } +} + + +uint32_t APReadDRW() +{ + uint32_t data; + // DRW is in bank 0 + DPWriteBANKSEL(0UL << 4); + + if(DAPSTATUS.jtagnsw) + { + JtagAPnDP(1); + data = (JTAGScanDR(JTAG_SCAN(DRW,READ)) >> 3); + } + else + { + SWHeader( SW_HEADER(AP, READ, DRW) ); + data = SWDataRead(); + } + return data; +} + + +void APWriteDRW(uint32_t data) +{ + // DRW is in bank 0 + DPWriteBANKSEL(0UL << 4); + + if(DAPSTATUS.jtagnsw) + { + JtagAPnDP(1); + JTAGScanDR( (((uint64_t) data) << 3) | JTAG_SCAN(DRW,WRITE) ); + } + else + { + SWHeader( SW_HEADER(AP, WRITE, DRW) ); + SWDataWrite(data); + } +} + + +uint32_t DPReadRDBUFF() +{ + uint32_t data; + + if(DAPSTATUS.jtagnsw) + { + JtagAPnDP(0); + data = ( JTAGScanDR(JTAG_SCAN(RDBUFF,READ)) >> 3); + } + else + { + SWHeader( SW_HEADER(DP, READ, RDBUFF) ); + data = SWDataRead(); + } + return data; +} + + +uint32_t DPReadIDR() +{ + uint32_t data; + + if(DAPSTATUS.jtagnsw) + { + JtagAPnDP(0); + + JTAGScanDR(JTAG_SCAN(DPIDR,READ)); + data = DPReadRDBUFF(); + } + else + { + SWHeader( SW_HEADER(DP, READ, DPIDR) ); + data = SWDataRead(); + } + return data; +} + + +uint32_t APReadIDR() +{ + uint32_t data; + + // IDR is in bank F + DPWriteBANKSEL(0xF); + + if(DAPSTATUS.jtagnsw) + { + JtagAPnDP(1); + JTAGScanDR(JTAG_SCAN(IDR,READ)); + data = DPReadRDBUFF(); + } + else + { + SWHeader( SW_HEADER(AP, READ, IDR) ); + SWDataRead(); + data = DPReadRDBUFF(); + } + return data; +} + + +uint32_t APReadBASE() +{ + uint32_t data; + + // BASE is in bank F + DPWriteBANKSEL(0xF); + + if(DAPSTATUS.jtagnsw) + { + JtagAPnDP(1); + JTAGScanDR(JTAG_SCAN(BASE,READ)); + data = DPReadRDBUFF(); + } + else + { + SWHeader( SW_HEADER(AP, READ, BASE) ); + SWDataRead(); + data =DPReadRDBUFF(); + } + return data; +} + + +uint32_t DPReadHALTEV() +{ + uint32_t data; + + // HALTEV is in bank 4 (DPBANKSEL=4) + DPWriteBANKSEL(0x4UL); + + if(DAPSTATUS.jtagnsw) + { + JtagAPnDP(0); + JTAGScanDR(JTAG_SCAN(HALTEV,READ)); + data = DPReadRDBUFF(); + } + else + { + SWHeader( SW_HEADER(DP, READ, HALTEV)); + data = SWDataRead(); + } + + // Switch DPBANKSEL back to 0 + DPWriteBANKSEL(0x0UL); + + return data; +} + + +void DPClearSTICKYERR() +{ + // + // Clear STICKYERR bit + // + uint32_t ctrlstat; + + if(DAPSTATUS.jtagnsw) + { + // write 1 to STICKYERR to clear it, also keep power-up requests high +#ifdef CORTEX_M0PLUS + ctrlstat = (1UL << 5) | (5UL << 28); +#else + ctrlstat = (1UL << 5); +#endif + JtagAPnDP(0); + JTAGScanDR( (((uint64_t) ctrlstat) << 3) | JTAG_SCAN(CTRLSTAT,WRITE) ); + } + else + { + SWHeader( SW_HEADER(DP, WRITE, ABORT) ); +#ifdef CORTEX_M0PLUS + SWDataWrite( 1UL << 2 ); +#else + SWDataWrite( 1UL << 5 ); +#endif + } +} + + +uint32_t CheckDAPSTATUS() +{ + // + // Check for any debugger errors and return FAIL if any + // + + // For JTAG, check CTRLSTAT for faults + if(DAPSTATUS.jtagnsw) + { + if((DPReadCTRLSTAT() >> 5) & 1UL) + DAPSTATUS.error++; + } + + if(DAPSTATUS.error != 0) + { + DBG_MSG(("Errors found in Debugger accesses -\tFAIL\n")); + return TEST_FAIL; + } + + return TEST_PASS; +} + + +void pulse_clock(uint8_t number_of_clock_ticks) +{ + uint8_t count; + + for(count = number_of_clock_ticks; count > 0; count--) + { + // Pulse clock pin + GPIO0->LB_MASKED[DD_DBG_SWCLKTCK] = DD_DBG_SWCLKTCK; + GPIO0->LB_MASKED[DD_DBG_SWCLKTCK] = 0; + } +} + +//////////////////////////////////////////////////////////////////////////////// +// +// JTAG Routines +// +//////////////////////////////////////////////////////////////////////////////// + +uint64_t JTAGScanIDCODE() +{ + // Read the TAP ID code + + uint64_t tmp; + + JTAGScanIR(JTAG_IDCODE); + + // RTI->SDR + // 001 + JTAGTransition(0x1, 3); + + // Shift + tmp = JTAGShift(0, 32); + + // E1DR->RTI + // 01 + JTAGTransition(0x1, 2); + + return tmp; +} + + +void JTAGScanIR(uint32_t instruction) +{ + // + // Scan in the passed Instruction + // + + // RTI->SIR + // 0011 + JTAGTransition(0x3, 4); + + // Shift Instruction + JTAGShift(instruction, 4); + + // E1IR->RTI + // 01 + JTAGTransition(0x1, 2); +} + + +uint64_t JTAGScanDR(uint64_t data) +{ + // + // Scan in/out values for the APACC/DPACC/ABORT Scan Chains + // + // Repeat scan chain for ack=WAIT + uint64_t tmp; + uint8_t ack; + + do + { + // RTI->SDR + // 001 + JTAGTransition(0x1, 3); + + // Shift + tmp = JTAGShift(data, 35); + + // E1DR->RTI + // 01 + JTAGTransition(0x1, 2); + + ack = (uint8_t)tmp & 7UL; + + DAPSTATUS.ack = ack; + + } while (ack == JTAG_DP_ACK_WAIT); + + return tmp; +} + + +void JTAGTransition(uint32_t tms, uint8_t numbits) +{ + // + // JTAGTransition causes us to ENTER a new TAP state + // + + uint8_t i; + + for(i = numbits; i > 0; i--) + { + // Drive TMS + if(tms & 0x1) + { + GPIO0->LB_MASKED[DD_DBG_TMS] = DD_DBG_TMS; + } + else + { + GPIO0->LB_MASKED[DD_DBG_TMS] = 0; + } + tms = (tms >> 1); + + pulse_clock(1); + } +} + + +uint64_t JTAGShift(uint64_t data, uint8_t numbits) +{ + // + // JTAGShift handles shifts into and out of the the SR + // + + // Most of the shift state has TMS Low, however the final cycle + // which exits from the Shift to Exit1 also clocks out the final bit + + // When we enter this function, JTAGTransition has already created the negedge, + // so here we want to drive the output and sample the input. + + // On the final cycle, we'll drive TMS high to escape the SHIFT state + + + uint8_t i; + uint64_t captured_data = 0; + + // Shifts require TMS == 0 + GPIO0->LB_MASKED[DD_DBG_TMS] = 0; + + for(i = numbits; i > 0; i--) + { + // Posedge of clock enters the state + // GPIO0->DATA[DD_SWCLKTCK].BYTE[DD_DBG_BYTE] = DD_SWCLKTCK; + + // Drive signals to the DAP on negedge of clock + // Also sample signals from the DAP after negedge of clock + + // Drive output + if(data & 0x1) + { + // Set + GPIO0->LB_MASKED[DD_DBG_TDI] = DD_DBG_TDI; + } + else + { + // Clear + GPIO0->LB_MASKED[DD_DBG_TDI] = 0; + } + data = (data >> 1); + + + // Capture Input + captured_data = captured_data >> 1; + + if(GPIO0->LB_MASKED[DD_DBG_TDO]) + { + // Set + captured_data |= (0x1ull << 63); + } + + + // Final cycle - drive TMS high to escape to Exit1 + if(i == 1) + { + GPIO0->LB_MASKED[DD_DBG_TMS] = DD_DBG_TMS; + } + + pulse_clock(1); + + } + + // fix up alignment of captured data before returning it + captured_data = captured_data >> (64-numbits); + + return captured_data; + +} + + +//////////////////////////////////////////////////////////////////////////////// +// +// SerialWire routines +// +//////////////////////////////////////////////////////////////////////////////// + +uint32_t SWConnect() +{ + uint32_t tmp; + +#ifdef SWJ_DEPRECATED_SWITCHING_SEQUENCE + + // Note: This sequence is deprecated if dormant mode is supported. + // Switch from Jtag to SW (no effect if just SW present) + + SWLineReset(0); + + // : start + // Switching sequence (lsb first) = 0xE79E; + SerialWireClockOut(0xE79E,16); + // Should now be waiting in sw state + +#endif + +#ifdef SWMD_TARGET_SELECTION + // SWMD starts in dormant state so first exit dormant state + SWExitDormantState(); + + SWHeader( SW_HEADER(DP, WRITE, TARGETSEL)); + + // Ack for TARGETSEL access is not driven, so set it explicitly + DAPSTATUS.ack = SW_DP_ACK_OK; + + SWDataWrite( MCU_TARGETSEL_VALUE ); + +#endif + + // Attempt a SerialWire connection sequence + SWLineReset(8); + + // Attempt an ID code read + SWHeader( SW_HEADER(DP,READ,DPIDR) ); + tmp = SWDataRead(); + + DBG_MSG(("SWConnect returned DPIDR: %x\n", tmp)); + + return CheckDAPSTATUS(); +} + + +void SWDataWrite(uint32_t data) +{ + // + // Enter from SW header+Ack, we are not currently driving the line + // + + uint32_t mask; + uint32_t parity; + + // Send one turnaround cycle + pulse_clock(1); + + // Only clock out bits if ACK was OK + if(DAPSTATUS.ack == SW_DP_ACK_OK) + { + // Clock data out + SerialWireClockOut(data,32); + + // Calculate data parity + for(parity=0, mask=0x1; mask != 0; mask = mask << 1) + { + parity += (data & mask) ? 1 : 0; + } + + // Clock parity out + SerialWireClockOut(parity,1); + } +} + + +uint32_t SWDataRead(void) +{ + uint32_t rdata; + + // Only clock in bits if ACK was OK + if(DAPSTATUS.ack == SW_DP_ACK_OK) + { + // Reads do not need to flip the line at all. + // Clock out 32 data bits, + parity, + turnaround + + // Clock in 32 bits of read data + rdata = SerialWireClockIn(32); + + // Clock in (and ignore!) parity bit and turnround bit + SerialWireClockIn(2); + } + else + { + // Clock in 1 cycle to put SW state in correct state + pulse_clock(1); + + // return bogus value + rdata = 0xDEADBEEFUL; + } + + DBG_MSG(("SWDataRead() returned %x\n", rdata)); + + return rdata; +} + + +uint32_t SWHeader(uint8_t header) +{ + // Clock out the (precalculated) SW header + // + // Always clock out 8 bits. + // Drive ALL bits, including park (DE 618567) + // + + uint32_t ack; + + do { + // Clock out the header + SerialWireClockOut(header, 8); + + // Clock in the first turnround bit and 3 ack bits + ack = SerialWireClockIn(4); + + // LSB adjust Ack value and lose turnround bit + ack = (ack >> (32 - 3)) & 0x7; + + if (ack == SW_DP_ACK_FAULT) + DAPSTATUS.error++; + + // Insert turnaround bit if for WAITed ACK + if (ack == SW_DP_ACK_WAIT) + SerialWireClockOut(0UL,1); + + DAPSTATUS.ack = ack; + + } while (ack == SW_DP_ACK_WAIT); + + + if (ack != SW_DP_ACK_OK) + { + DBG_MSG(("ERROR - Maybe unhandled SW-DP response ")); + switch(ack) + { + case SW_DP_ACK_WAIT: + DBG_MSG(("WAIT\n")); + break; + case SW_DP_ACK_FAULT: + DBG_MSG(("ERROR\n")); + break; + default: + DBG_MSG(("Unknown, %x\n",ack)); + break; + } + } + + return ack; +} + + +void SerialWireClockOut (uint32_t data, uint32_t numbits) +{ + // Ensure we are going to drive the line + GPIO0->LB_MASKED[DD_DBG_TMSEN] = DD_DBG_TMSEN; + + for(; numbits > 0; numbits--) + { + if(data & 0x1) + { + // Bit set + GPIO0->LB_MASKED[DD_DBG_TMS] = DD_DBG_TMS; + } + else + { + // Bit clear + GPIO0->LB_MASKED[DD_DBG_TMS] = 0; + } + + pulse_clock(1); + + data = (data >> 1); + } +} + + +uint32_t SerialWireClockIn (uint32_t numbits) +{ + uint32_t data = 0; + + // Don't drive the line while clocking data in + GPIO0->LB_MASKED[DD_DBG_TMSEN] = 0; + + for(; numbits > 0; numbits--) + { + data = (data >> 1); + + if(GPIO0->LB_MASKED[DD_DBG_TMSIN]) + { + data |= (0x1UL << 31); + } + + pulse_clock(1); + } + + return data; +} + + +void SWLineReset(uint8_t num_of_idle_cycles) +{ + // Ensure Clock is low + GPIO0->LB_MASKED[DD_DBG_SWCLKTCK] = 0; + + // Set SWDO and SWDOEN + GPIO0->LB_MASKED[(DD_DBG_TMS | DD_DBG_TMSEN)] = (DD_DBG_TMS | DD_DBG_TMSEN); + + pulse_clock(50); + + // Insert requested idle cycles + GPIO0->LB_MASKED[DD_DBG_TMS] = 0; + + pulse_clock(num_of_idle_cycles); +} + + +void SWExitDormantState(void) +{ + // Leave Dormant state + DBG_MSG(("Leaving Dormant State\n")); + + // 1. At least 8 SWCLKTCK cycles with SWDIOTMS high + SerialWireClockOut(0xFFUL,8); + + // 2. 128-bit Selection Alert + SerialWireClockOut(DS_to_SWD_0,32); + SerialWireClockOut(DS_to_SWD_1,32); + SerialWireClockOut(DS_to_SWD_2,32); + SerialWireClockOut(DS_to_SWD_3,32); + + // 3. 4 SWCLKTCK cycles with SWDIOTMS low + SerialWireClockOut(0UL,4); + + // 4. Activation Sequence + SerialWireClockOut(SW_ACTV_CODE,8); + + // 5. Line Reset + SWLineReset(2); +} + diff --git a/Cortex-M0/nanosoc/software/debug_tester/debugtester.h b/Cortex-M0/nanosoc/software/debug_tester/debugtester.h new file mode 100644 index 0000000..fcaacd0 --- /dev/null +++ b/Cortex-M0/nanosoc/software/debug_tester/debugtester.h @@ -0,0 +1,237 @@ +// +//----------------------------------------------------------------------------- +// The confidential and proprietary information contained in this file may +// only be used by a person authorised under and to the extent permitted +// by a subsisting licensing agreement from Arm Limited or its affiliates. +// +// (C) COPYRIGHT 2010-2013 Arm Limited or its affiliates. +// ALL RIGHTS RESERVED +// +// This entire notice must be reproduced on all copies of this file +// and copies of this file may only be made by a person if such person is +// permitted to do so under the terms of a subsisting license agreement +// from Arm Limited or its affiliates. +// +// SVN Information +// +// Checked In : $Date: 2017-10-10 15:55:38 +0100 (Tue, 10 Oct 2017) $ +// +// Revision : $Revision: 371321 $ +// +// Release Information : Cortex-M System Design Kit-r1p1-00rel0 +//----------------------------------------------------------------------------- +// + +//============================================================================ +// Debug tester header file, contain debug related definition +//============================================================================ + +//============================================================================ +// Define pass/fail value +//============================================================================ +#define TEST_PASS 0 +#define TEST_FAIL 1 + +// Define whether the DebugTester code should display messages +// using the character output device in the debugtester. +//#define DEBUGTESTER_PRINTF +//#define DEBUGTRACE_PRINTF + + +//============================================================================ +// Print macro to allow conditional printing of messages +// +// Invoke like printf, but use double braces: DBG_MSG(("format %x", var)); +//============================================================================ + +#ifdef DEBUGTESTER_PRINTF +#define DBG_MSG(arg) { printf arg ; } +#else +#define DBG_MSG(arg) { (void) 0; } +#endif + +#ifdef DEBUGTRACE_PRINTF +#define TRC_MSG(arg) { printf arg ; } +#else +#define TRC_MSG(arg) { (void) 0; } +#endif + +//============================================================================ +// SW responses +//============================================================================ +#define SW_DP_ACK_OK 1 +#define SW_DP_ACK_WAIT 2 +#define SW_DP_ACK_FAULT 4 + +// SW to Dormant state sequence +#define SWD_to_DS 0xE3BCUL + +// Dormant state to SW sequence +#define DS_to_SWD_0 0x6209F392UL +#define DS_to_SWD_1 0x86852D95UL +#define DS_to_SWD_2 0xE3DDAFE9UL +#define DS_to_SWD_3 0x19BC0EA2UL + +#define SW_ACTV_CODE 0x1AUL + +//============================================================================ +// JTAG Definitions +//============================================================================ +#define JTAG_ABORT 0x8 +#define JTAG_DPACC 0xa +#define JTAG_APACC 0xb +#define JTAG_IDCODE 0xe +#define JTAG_BYPASS 0xf + +#define JTAG_SCAN(Address,RnW) (((Address & 0xC) >> 1) | RnW) + +#define JTAG_DP_ACK_OKFAULT 2 +#define JTAG_DP_ACK_WAIT 1 + + +//============================================================================ +// Macro definitions to generate SerialWire packet headers at compilation time +//============================================================================ + +// Header Bits + +#define AP 1 +#define DP 0 + +#define READ 1 +#define WRITE 0 + +// DP Register Addresses + +#define DPIDR 0x0 +#define ABORT 0x0 +#define CTRLSTAT 0x4 +#define DLCR 0x4 +#define TARGETID 0x4 +#define HALTEV 0x4 +#define RESEND 0x8 +#define SELECT 0x8 +#define RDBUFF 0xc +#define TARGETSEL 0xc + +// DP control and state register bit definition + +#define CTRL_CSYSPWRUPACK (1UL << 31) //System power up ack, RO +#define CTRL_CSYSPWRUPREQ (1UL << 30) //System power up req, RW +#define CTRL_CDBGPWRUPACK (1UL << 29) //Debug power up ack, RO +#define CTRL_CDBGPWRUPREQ (1UL << 28) //Debug power up req, RW +#define CTRL_CDBGRSTACK (1UL << 27) //Debug reset ack, RO +#define CTRL_CDBGRSTREQ (1UL << 26) //Debug reset req, RW + +// AP Register Addresses + +#define CSW 0x00 +#define TAR 0x04 +#define DRW 0x0c +#define BD0 0x10 +#define BD1 0x14 +#define BD2 0x18 +#define BD3 0x1c +#define CFG 0xf4 +#define BASE 0xf8 +#define IDR 0xfc + +// CSW Register Fields +#define CSW_PROT_USER (0UL << 25) +#define CSW_PROT_PRIV (1UL << 25) +#define CSW_PROT_BUFF (1UL << 26) +#define CSW_PROT_CACH (1UL << 27) +#define CSW_PROT_MASTER_CORE (0UL << 29) +#define CSW_PROT_MASTER_DBG (1UL << 29) + +#define CSW_INCR_OFF (0UL << 4) +#define CSW_INCR_SINGLE (1UL << 4) + +#define CSW_SIZE_BYTE 0 +#define CSW_SIZE_HALFWORD 1 +#define CSW_SIZE_WORD 2 + +// Serial Wire Header Macros + +#define SW_HEADER_PARITY(APnDP,RnW,Address) ( (APnDP & 0x1) ^ (RnW & 0x1) ^ ((Address & 0x4) >> 2) ^ ((Address & 0x8) >> 3) ) + +// Start, APnDP, RnW, A[3:2], Parity, Stop, Park +#define SW_HEADER(APnDP,RnW,Address) (1 | ((APnDP & 0x1) << 1) | ((RnW & 0x1) << 2) | ((Address & 0xC) << 1) | SW_HEADER_PARITY(APnDP,RnW,Address) << 5 | 0 << 6 | 1 << 7) + + +//============================================================================ +// CoreSight ID Register Offset values +//============================================================================ + +// CID OFFSET define +#define CID0_OFFSET 0xFF0 +#define CID1_OFFSET 0xFF4 +#define CID2_OFFSET 0xFF8 +#define CID3_OFFSET 0xFFC + + +// PID OFFSET define +#define PID0_OFFSET 0xFE0 +#define PID1_OFFSET 0xFE4 +#define PID2_OFFSET 0xFE8 +#define PID3_OFFSET 0xFEC +#define PID4_OFFSET 0xFD0 +#define PID5_OFFSET 0xFD4 +#define PID6_OFFSET 0xFD8 +#define PID7_OFFSET 0xFDC + + +//============================================================================ +// ARMv6M and ARMv7M Architectural Debug Register Definitions +//============================================================================ + +// DHCSR +#define DHCSR_ADDR 0xE000EDF0 + +#define DBGKEY 0xA05F0000 +#define S_LOCKUP (1UL << 19) +#define S_SLEEP (1UL << 18) +#define S_HALT (1UL << 17) +#define S_REGRDY (1UL << 16) +#define C_MASKINTS (1UL << 3) +#define C_STEP (1UL << 2) +#define C_HALT (1UL << 1) +#define C_DEBUGEN (1UL << 0) + + +// DCRSR +#define DCRSR_ADDR 0xE000EDF4 + +#define REGWnR (1UL << 16) +#define R0 0x00 +#define R1 0x01 +#define R2 0x02 +#define R3 0x03 +#define R4 0x04 +#define R5 0x05 +#define R6 0x06 +#define R7 0x07 +#define R8 0x08 +#define R9 0x09 +#define R10 0x0A +#define R11 0x0B +#define R12 0x0C +#define SP 0x0D +#define LR 0x0E +#define DebugReturnAddress 0x0F +#define xPSR 0x10 +#define MSP 0x11 +#define PSP 0x12 +#define CONTROL 0x14 + + +// DCRDR +#define DCRDR_ADDR 0xE000EDF8 + + +//============================================================================ +// Trace related defines +//============================================================================ + +#define MCU_ETM_ID 0x23 // CM_MCU_ETM_ID in trace_tests.h +#define MCU_ITM_ID 0x59 // CM_MCU_ITM_ID in trace_tests.h diff --git a/Cortex-M0/nanosoc/software/debug_tester/debugtester_cm0.sct b/Cortex-M0/nanosoc/software/debug_tester/debugtester_cm0.sct new file mode 100644 index 0000000..948eaf9 --- /dev/null +++ b/Cortex-M0/nanosoc/software/debug_tester/debugtester_cm0.sct @@ -0,0 +1,38 @@ +;----------------------------------------------------------------------------- +; The confidential and proprietary information contained in this file may +; only be used by a person authorised under and to the extent permitted +; by a subsisting licensing agreement from Arm Limited or its affiliates. +; +; (C) COPYRIGHT 2010-2013 Arm Limited or its affiliates. +; ALL RIGHTS RESERVED +; +; This entire notice must be reproduced on all copies of this file +; and copies of this file may only be made by a person if such person is +; permitted to do so under the terms of a subsisting license agreement +; from Arm Limited or its affiliates. +; +; SVN Information +; +; Checked In : $Date: 2011-02-22 16:53:27 +0000 (Tue, 22 Feb 2011) $ +; +; Revision : $Revision: 162307 $ +; +; Release Information : Cortex-M System Design Kit-r1p1-00rel0 +; +;----------------------------------------------------------------------------- + +; ************************************************************* +; *** Scatter-Loading Description File generated by uVision *** +; ************************************************************* + +LR_ROM1 0x00000000 0x00020000 { ; load region size_region + ER_ROM1 0x00000000 0x00020000 { ; load address = execution address + startup_CMSDK_CM0.o (RESET, +FIRST) + *(InRoot$$Sections) + .ANY (+RO) + } + RW_RAM1 0x20000000 0x00004000 { ; RW data + .ANY (+RW +ZI) + } +} + diff --git a/Cortex-M0/nanosoc/software/debug_tester/debugtester_cm0_be.uvopt b/Cortex-M0/nanosoc/software/debug_tester/debugtester_cm0_be.uvopt new file mode 100644 index 0000000..647d030 --- /dev/null +++ b/Cortex-M0/nanosoc/software/debug_tester/debugtester_cm0_be.uvopt @@ -0,0 +1,245 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no" ?> +<ProjectOpt xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="project_opt.xsd"> + + <SchemaVersion>1.0</SchemaVersion> + + <Header>### uVision Project, (C) Keil Software</Header> + + <Extensions> + <cExt>*.c</cExt> + <aExt>*.s*; *.src; *.a*</aExt> + <oExt>*.obj</oExt> + <lExt>*.lib</lExt> + <tExt>*.txt; *.h; *.inc</tExt> + <pExt>*.plm</pExt> + <CppX>*.cpp</CppX> + </Extensions> + + <DaveTm> + <dwLowDateTime>0</dwLowDateTime> + <dwHighDateTime>0</dwHighDateTime> + </DaveTm> + + <Target> + <TargetName>Debug</TargetName> + <ToolsetNumber>0x4</ToolsetNumber> + <ToolsetName>ARM-ADS</ToolsetName> + <TargetOption> + <CLKADS>50000000</CLKADS> + <OPTTT> + <gFlags>1</gFlags> + <BeepAtEnd>1</BeepAtEnd> + <RunSim>1</RunSim> + <RunTarget>0</RunTarget> + </OPTTT> + <OPTHX> + <HexSelection>1</HexSelection> + <FlashByte>65535</FlashByte> + <HexRangeLowAddress>0</HexRangeLowAddress> + <HexRangeHighAddress>0</HexRangeHighAddress> + <HexOffset>0</HexOffset> + </OPTHX> + <OPTLEX> + <PageWidth>79</PageWidth> + <PageLength>66</PageLength> + <TabStop>8</TabStop> + <ListingPath>.\</ListingPath> + </OPTLEX> + <ListingPage> + <CreateCListing>1</CreateCListing> + <CreateAListing>1</CreateAListing> + <CreateLListing>1</CreateLListing> + <CreateIListing>0</CreateIListing> + <AsmCond>1</AsmCond> + <AsmSymb>1</AsmSymb> + <AsmXref>0</AsmXref> + <CCond>1</CCond> + <CCode>0</CCode> + <CListInc>0</CListInc> + <CSymb>0</CSymb> + <LinkerCodeListing>0</LinkerCodeListing> + </ListingPage> + <OPTXL> + <LMap>1</LMap> + <LComments>1</LComments> + <LGenerateSymbols>1</LGenerateSymbols> + <LLibSym>1</LLibSym> + <LLines>1</LLines> + <LLocSym>1</LLocSym> + <LPubSym>1</LPubSym> + <LXref>0</LXref> + <LExpSel>0</LExpSel> + </OPTXL> + <OPTFL> + <tvExp>1</tvExp> + <tvExpOptDlg>0</tvExpOptDlg> + <IsCurrentTarget>1</IsCurrentTarget> + </OPTFL> + <CpuCode>255</CpuCode> + <DllOpt> + <SimDllName>SARMCM3.DLL</SimDllName> + <SimDllArguments></SimDllArguments> + <SimDlgDllName>DARMCM1.DLL</SimDlgDllName> + <SimDlgDllArguments></SimDlgDllArguments> + <TargetDllName>SARMCM3.DLL</TargetDllName> + <TargetDllArguments></TargetDllArguments> + <TargetDlgDllName>TARMCM1.DLL</TargetDlgDllName> + <TargetDlgDllArguments></TargetDlgDllArguments> + </DllOpt> + <DebugOpt> + <uSim>1</uSim> + <uTrg>0</uTrg> + <sLdApp>1</sLdApp> + <sGomain>1</sGomain> + <sRbreak>1</sRbreak> + <sRwatch>1</sRwatch> + <sRmem>1</sRmem> + <sRfunc>1</sRfunc> + <sRbox>1</sRbox> + <tLdApp>1</tLdApp> + <tGomain>0</tGomain> + <tRbreak>1</tRbreak> + <tRwatch>1</tRwatch> + <tRmem>1</tRmem> + <tRfunc>0</tRfunc> + <tRbox>1</tRbox> + <tRtrace>0</tRtrace> + <sRunDeb>0</sRunDeb> + <sLrtime>0</sLrtime> + <nTsel>-1</nTsel> + <sDll></sDll> + <sDllPa></sDllPa> + <sDlgDll></sDlgDll> + <sDlgPa></sDlgPa> + <sIfile></sIfile> + <tDll></tDll> + <tDllPa></tDllPa> + <tDlgDll></tDlgDll> + <tDlgPa></tDlgPa> + <tIfile></tIfile> + <pMon></pMon> + </DebugOpt> + <Breakpoint/> + <DebugFlag> + <trace>0</trace> + <periodic>1</periodic> + <aLwin>0</aLwin> + <aCover>0</aCover> + <aSer1>0</aSer1> + <aSer2>0</aSer2> + <aPa>0</aPa> + <viewmode>0</viewmode> + <vrSel>0</vrSel> + <aSym>0</aSym> + <aTbox>0</aTbox> + <AscS1>0</AscS1> + <AscS2>0</AscS2> + <AscS3>0</AscS3> + <aSer3>0</aSer3> + <eProf>0</eProf> + <aLa>0</aLa> + <aPa1>0</aPa1> + <AscS4>0</AscS4> + <aSer4>0</aSer4> + <StkLoc>0</StkLoc> + <TrcWin>0</TrcWin> + <newCpu>0</newCpu> + <uProt>0</uProt> + </DebugFlag> + <Tracepoint> + <THDelay>0</THDelay> + </Tracepoint> + <LintExecutable></LintExecutable> + <LintConfigFile></LintConfigFile> + </TargetOption> + </Target> + + <Group> + <GroupName>Startup</GroupName> + <tvExp>1</tvExp> + <tvExpOptDlg>0</tvExpOptDlg> + <cbSel>0</cbSel> + <RteFlg>0</RteFlg> + <File> + <GroupNumber>1</GroupNumber> + <FileNumber>1</FileNumber> + <FileType>2</FileType> + <tvExp>0</tvExp> + <Focus>0</Focus> + <ColumnNumber>0</ColumnNumber> + <tvExpOptDlg>0</tvExpOptDlg> + <TopLine>1</TopLine> + <CurrentLine>1</CurrentLine> + <bDave2>0</bDave2> + <PathWithFileName>..\cmsis\Device\ARM\CMSDK_CM0\Source\ARM\startup_CMSDK_CM0.s</PathWithFileName> + <FilenameWithoutPath>startup_CMSDK_CM0.s</FilenameWithoutPath> + <RteFlg>0</RteFlg> + <bShared>0</bShared> + </File> + </Group> + + <Group> + <GroupName>Application</GroupName> + <tvExp>1</tvExp> + <tvExpOptDlg>0</tvExpOptDlg> + <cbSel>0</cbSel> + <RteFlg>0</RteFlg> + <File> + <GroupNumber>2</GroupNumber> + <FileNumber>2</FileNumber> + <FileType>1</FileType> + <tvExp>0</tvExp> + <Focus>0</Focus> + <ColumnNumber>0</ColumnNumber> + <tvExpOptDlg>0</tvExpOptDlg> + <TopLine>1</TopLine> + <CurrentLine>1</CurrentLine> + <bDave2>0</bDave2> + <PathWithFileName>.\debugtester.c</PathWithFileName> + <FilenameWithoutPath>cmsdk_debugtester.c</FilenameWithoutPath> + <RteFlg>0</RteFlg> + <bShared>0</bShared> + </File> + </Group> + + <Group> + <GroupName>System</GroupName> + <tvExp>1</tvExp> + <tvExpOptDlg>0</tvExpOptDlg> + <cbSel>0</cbSel> + <RteFlg>0</RteFlg> + <File> + <GroupNumber>3</GroupNumber> + <FileNumber>3</FileNumber> + <FileType>1</FileType> + <tvExp>0</tvExp> + <Focus>0</Focus> + <ColumnNumber>0</ColumnNumber> + <tvExpOptDlg>0</tvExpOptDlg> + <TopLine>0</TopLine> + <CurrentLine>0</CurrentLine> + <bDave2>0</bDave2> + <PathWithFileName>.\system_cmsdk_debugtester.c</PathWithFileName> + <FilenameWithoutPath>system_cmsdk_debugtester.c</FilenameWithoutPath> + <RteFlg>0</RteFlg> + <bShared>0</bShared> + </File> + <File> + <GroupNumber>3</GroupNumber> + <FileNumber>4</FileNumber> + <FileType>1</FileType> + <tvExp>0</tvExp> + <Focus>0</Focus> + <ColumnNumber>0</ColumnNumber> + <tvExpOptDlg>0</tvExpOptDlg> + <TopLine>0</TopLine> + <CurrentLine>0</CurrentLine> + <bDave2>0</bDave2> + <PathWithFileName>.\retarget_cmsdk_debugtester.c</PathWithFileName> + <FilenameWithoutPath>retarget_cmsdk_debugtester.c</FilenameWithoutPath> + <RteFlg>0</RteFlg> + <bShared>0</bShared> + </File> + </Group> + +</ProjectOpt> diff --git a/Cortex-M0/nanosoc/software/debug_tester/debugtester_cm0_be.uvproj b/Cortex-M0/nanosoc/software/debug_tester/debugtester_cm0_be.uvproj new file mode 100644 index 0000000..b20c84b --- /dev/null +++ b/Cortex-M0/nanosoc/software/debug_tester/debugtester_cm0_be.uvproj @@ -0,0 +1,430 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no" ?> +<Project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="project_proj.xsd"> + + <SchemaVersion>1.1</SchemaVersion> + + <Header>### uVision Project, (C) Keil Software</Header> + + <Targets> + <Target> + <TargetName>Debug</TargetName> + <ToolsetNumber>0x4</ToolsetNumber> + <ToolsetName>ARM-ADS</ToolsetName> + <TargetOption> + <TargetCommonOption> + <Device>Cortex-M0</Device> + <Vendor>ARM</Vendor> + <Cpu>CLOCK(12000000) CPUTYPE("Cortex-M0") ESEL ELITTLE</Cpu> + <FlashUtilSpec></FlashUtilSpec> + <StartupFile></StartupFile> + <FlashDriverDll></FlashDriverDll> + <DeviceId>4803</DeviceId> + <RegisterFile></RegisterFile> + <MemoryEnv></MemoryEnv> + <Cmp></Cmp> + <Asm></Asm> + <Linker></Linker> + <OHString></OHString> + <InfinionOptionDll></InfinionOptionDll> + <SLE66CMisc></SLE66CMisc> + <SLE66AMisc></SLE66AMisc> + <SLE66LinkerMisc></SLE66LinkerMisc> + <SFDFile></SFDFile> + <UseEnv>0</UseEnv> + <BinPath></BinPath> + <IncludePath></IncludePath> + <LibPath></LibPath> + <RegisterFilePath></RegisterFilePath> + <DBRegisterFilePath></DBRegisterFilePath> + <TargetStatus> + <Error>0</Error> + <ExitCodeStop>0</ExitCodeStop> + <ButtonStop>0</ButtonStop> + <NotGenerated>0</NotGenerated> + <InvalidFlash>1</InvalidFlash> + </TargetStatus> + <OutputDirectory>.\</OutputDirectory> + <OutputName>debugtester_be</OutputName> + <CreateExecutable>1</CreateExecutable> + <CreateLib>0</CreateLib> + <CreateHexFile>0</CreateHexFile> + <DebugInformation>1</DebugInformation> + <BrowseInformation>1</BrowseInformation> + <ListingPath>.\</ListingPath> + <HexFormatSelection>1</HexFormatSelection> + <Merge32K>0</Merge32K> + <CreateBatchFile>0</CreateBatchFile> + <BeforeCompile> + <RunUserProg1>0</RunUserProg1> + <RunUserProg2>0</RunUserProg2> + <UserProg1Name></UserProg1Name> + <UserProg2Name></UserProg2Name> + <UserProg1Dos16Mode>0</UserProg1Dos16Mode> + <UserProg2Dos16Mode>0</UserProg2Dos16Mode> + <nStopU1X>0</nStopU1X> + <nStopU2X>0</nStopU2X> + </BeforeCompile> + <BeforeMake> + <RunUserProg1>0</RunUserProg1> + <RunUserProg2>0</RunUserProg2> + <UserProg1Name></UserProg1Name> + <UserProg2Name></UserProg2Name> + <UserProg1Dos16Mode>0</UserProg1Dos16Mode> + <UserProg2Dos16Mode>0</UserProg2Dos16Mode> + </BeforeMake> + <AfterMake> + <RunUserProg1>1</RunUserProg1> + <RunUserProg2>0</RunUserProg2> + <UserProg1Name>$K\ARM\ARMCC\BIN\fromelf.exe #L --vhx --8x1 --output debugtester_be.hex</UserProg1Name> + <UserProg2Name></UserProg2Name> + <UserProg1Dos16Mode>0</UserProg1Dos16Mode> + <UserProg2Dos16Mode>0</UserProg2Dos16Mode> + </AfterMake> + <SelectedForBatchBuild>0</SelectedForBatchBuild> + <SVCSIdString></SVCSIdString> + </TargetCommonOption> + <CommonProperty> + <UseCPPCompiler>0</UseCPPCompiler> + <RVCTCodeConst>0</RVCTCodeConst> + <RVCTZI>0</RVCTZI> + <RVCTOtherData>0</RVCTOtherData> + <ModuleSelection>0</ModuleSelection> + <IncludeInBuild>1</IncludeInBuild> + <AlwaysBuild>0</AlwaysBuild> + <GenerateAssemblyFile>0</GenerateAssemblyFile> + <AssembleAssemblyFile>0</AssembleAssemblyFile> + <PublicsOnly>0</PublicsOnly> + <StopOnExitCode>3</StopOnExitCode> + <CustomArgument></CustomArgument> + <IncludeLibraryModules></IncludeLibraryModules> + </CommonProperty> + <DllOption> + <SimDllName>SARMCM3.DLL</SimDllName> + <SimDllArguments></SimDllArguments> + <SimDlgDll>DARMCM1.DLL</SimDlgDll> + <SimDlgDllArguments></SimDlgDllArguments> + <TargetDllName>SARMCM3.DLL</TargetDllName> + <TargetDllArguments></TargetDllArguments> + <TargetDlgDll>TARMCM1.DLL</TargetDlgDll> + <TargetDlgDllArguments></TargetDlgDllArguments> + </DllOption> + <DebugOption> + <OPTHX> + <HexSelection>1</HexSelection> + <HexRangeLowAddress>0</HexRangeLowAddress> + <HexRangeHighAddress>0</HexRangeHighAddress> + <HexOffset>0</HexOffset> + <Oh166RecLen>16</Oh166RecLen> + </OPTHX> + <Simulator> + <UseSimulator>1</UseSimulator> + <LoadApplicationAtStartup>1</LoadApplicationAtStartup> + <RunToMain>1</RunToMain> + <RestoreBreakpoints>1</RestoreBreakpoints> + <RestoreWatchpoints>1</RestoreWatchpoints> + <RestoreMemoryDisplay>1</RestoreMemoryDisplay> + <RestoreFunctions>1</RestoreFunctions> + <RestoreToolbox>1</RestoreToolbox> + <LimitSpeedToRealTime>0</LimitSpeedToRealTime> + </Simulator> + <Target> + <UseTarget>0</UseTarget> + <LoadApplicationAtStartup>1</LoadApplicationAtStartup> + <RunToMain>0</RunToMain> + <RestoreBreakpoints>1</RestoreBreakpoints> + <RestoreWatchpoints>1</RestoreWatchpoints> + <RestoreMemoryDisplay>1</RestoreMemoryDisplay> + <RestoreFunctions>0</RestoreFunctions> + <RestoreToolbox>1</RestoreToolbox> + <RestoreTracepoints>0</RestoreTracepoints> + </Target> + <RunDebugAfterBuild>0</RunDebugAfterBuild> + <TargetSelection>-1</TargetSelection> + <SimDlls> + <CpuDll></CpuDll> + <CpuDllArguments></CpuDllArguments> + <PeripheralDll></PeripheralDll> + <PeripheralDllArguments></PeripheralDllArguments> + <InitializationFile></InitializationFile> + </SimDlls> + <TargetDlls> + <CpuDll></CpuDll> + <CpuDllArguments></CpuDllArguments> + <PeripheralDll></PeripheralDll> + <PeripheralDllArguments></PeripheralDllArguments> + <InitializationFile></InitializationFile> + <Driver></Driver> + </TargetDlls> + </DebugOption> + <Utilities> + <Flash1> + <UseTargetDll>0</UseTargetDll> + <UseExternalTool>0</UseExternalTool> + <RunIndependent>0</RunIndependent> + <UpdateFlashBeforeDebugging>0</UpdateFlashBeforeDebugging> + <Capability>0</Capability> + <DriverSelection>-1</DriverSelection> + </Flash1> + <Flash2></Flash2> + <Flash3>"" ()</Flash3> + <Flash4></Flash4> + </Utilities> + <TargetArmAds> + <ArmAdsMisc> + <GenerateListings>0</GenerateListings> + <asHll>1</asHll> + <asAsm>1</asAsm> + <asMacX>1</asMacX> + <asSyms>1</asSyms> + <asFals>1</asFals> + <asDbgD>1</asDbgD> + <asForm>1</asForm> + <ldLst>0</ldLst> + <ldmm>1</ldmm> + <ldXref>1</ldXref> + <BigEnd>0</BigEnd> + <AdsALst>1</AdsALst> + <AdsACrf>1</AdsACrf> + <AdsANop>0</AdsANop> + <AdsANot>0</AdsANot> + <AdsLLst>1</AdsLLst> + <AdsLmap>1</AdsLmap> + <AdsLcgr>1</AdsLcgr> + <AdsLsym>1</AdsLsym> + <AdsLszi>1</AdsLszi> + <AdsLtoi>1</AdsLtoi> + <AdsLsun>1</AdsLsun> + <AdsLven>1</AdsLven> + <AdsLsxf>1</AdsLsxf> + <RvctClst>0</RvctClst> + <GenPPlst>0</GenPPlst> + <AdsCpuType>"Cortex-M0"</AdsCpuType> + <RvctDeviceName></RvctDeviceName> + <mOS>0</mOS> + <uocRom>0</uocRom> + <uocRam>0</uocRam> + <hadIROM>0</hadIROM> + <hadIRAM>0</hadIRAM> + <hadXRAM>0</hadXRAM> + <uocXRam>0</uocXRam> + <RvdsVP>0</RvdsVP> + <hadIRAM2>0</hadIRAM2> + <hadIROM2>0</hadIROM2> + <StupSel>1</StupSel> + <useUlib>0</useUlib> + <EndSel>1</EndSel> + <uLtcg>0</uLtcg> + <RoSelD>0</RoSelD> + <RwSelD>5</RwSelD> + <CodeSel>0</CodeSel> + <OptFeed>0</OptFeed> + <NoZi1>0</NoZi1> + <NoZi2>0</NoZi2> + <NoZi3>0</NoZi3> + <NoZi4>0</NoZi4> + <NoZi5>0</NoZi5> + <Ro1Chk>1</Ro1Chk> + <Ro2Chk>0</Ro2Chk> + <Ro3Chk>0</Ro3Chk> + <Ir1Chk>0</Ir1Chk> + <Ir2Chk>0</Ir2Chk> + <Ra1Chk>1</Ra1Chk> + <Ra2Chk>0</Ra2Chk> + <Ra3Chk>0</Ra3Chk> + <Im1Chk>0</Im1Chk> + <Im2Chk>0</Im2Chk> + <OnChipMemories> + <Ocm1> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </Ocm1> + <Ocm2> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </Ocm2> + <Ocm3> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </Ocm3> + <Ocm4> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </Ocm4> + <Ocm5> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </Ocm5> + <Ocm6> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </Ocm6> + <IRAM> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </IRAM> + <IROM> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </IROM> + <XRAM> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </XRAM> + <OCR_RVCT1> + <Type>1</Type> + <StartAddress>0x0</StartAddress> + <Size>0x10000</Size> + </OCR_RVCT1> + <OCR_RVCT2> + <Type>1</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </OCR_RVCT2> + <OCR_RVCT3> + <Type>1</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </OCR_RVCT3> + <OCR_RVCT4> + <Type>1</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </OCR_RVCT4> + <OCR_RVCT5> + <Type>1</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </OCR_RVCT5> + <OCR_RVCT6> + <Type>0</Type> + <StartAddress>0x20000000</StartAddress> + <Size>0x4000</Size> + </OCR_RVCT6> + <OCR_RVCT7> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </OCR_RVCT7> + <OCR_RVCT8> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </OCR_RVCT8> + <OCR_RVCT9> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </OCR_RVCT9> + <OCR_RVCT10> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </OCR_RVCT10> + </OnChipMemories> + <RvctStartVector></RvctStartVector> + </ArmAdsMisc> + <Cads> + <interw>1</interw> + <Optim>3</Optim> + <oTime>0</oTime> + <SplitLS>0</SplitLS> + <OneElfS>0</OneElfS> + <Strict>0</Strict> + <EnumInt>0</EnumInt> + <PlainCh>0</PlainCh> + <Ropi>0</Ropi> + <Rwpi>0</Rwpi> + <wLevel>0</wLevel> + <uThumb>0</uThumb> + <uSurpInc>0</uSurpInc> + <VariousControls> + <MiscControls></MiscControls> + <Define>CORTEX_M0 DEBUGTESTER_BE</Define> + <Undefine></Undefine> + <IncludePath>..\cmsis\CMSIS\Include; ..\cmsis\Device\ARM\CMSDK_CM0\Include</IncludePath> + </VariousControls> + </Cads> + <Aads> + <interw>1</interw> + <Ropi>0</Ropi> + <Rwpi>0</Rwpi> + <thumb>0</thumb> + <SplitLS>0</SplitLS> + <SwStkChk>0</SwStkChk> + <NoWarn>0</NoWarn> + <uSurpInc>0</uSurpInc> + <VariousControls> + <MiscControls></MiscControls> + <Define></Define> + <Undefine></Undefine> + <IncludePath></IncludePath> + </VariousControls> + </Aads> + <LDads> + <umfTarg>0</umfTarg> + <Ropi>0</Ropi> + <Rwpi>0</Rwpi> + <noStLib>0</noStLib> + <RepFail>1</RepFail> + <useFile>0</useFile> + <TextAddressRange>0x00000000</TextAddressRange> + <DataAddressRange>0x00000000</DataAddressRange> + <ScatterFile>debugtester_cm0.sct</ScatterFile> + <IncludeLibs></IncludeLibs> + <IncludeLibsPath></IncludeLibsPath> + <Misc></Misc> + <LinkerInputFile></LinkerInputFile> + <DisabledWarnings></DisabledWarnings> + </LDads> + </TargetArmAds> + </TargetOption> + <Groups> + <Group> + <GroupName>Startup</GroupName> + <Files> + <File> + <FileName>startup_CMSDK_CM0.s</FileName> + <FileType>2</FileType> + <FilePath>..\cmsis\Device\ARM\CMSDK_CM0\Source\ARM\startup_CMSDK_CM0.s</FilePath> + </File> + </Files> + </Group> + <Group> + <GroupName>Application</GroupName> + <Files> + <File> + <FileName>cmsdk_debugtester.c</FileName> + <FileType>1</FileType> + <FilePath>.\debugtester.c</FilePath> + </File> + </Files> + </Group> + <Group> + <GroupName>System</GroupName> + <Files> + <File> + <FileName>system_cmsdk_debugtester.c</FileName> + <FileType>1</FileType> + <FilePath>.\system_cmsdk_debugtester.c</FilePath> + </File> + <File> + <FileName>retarget_cmsdk_debugtester.c</FileName> + <FileType>1</FileType> + <FilePath>.\retarget_cmsdk_debugtester.c</FilePath> + </File> + </Files> + </Group> + </Groups> + </Target> + </Targets> + +</Project> diff --git a/Cortex-M0/nanosoc/software/debug_tester/debugtester_cm0_le.uvopt b/Cortex-M0/nanosoc/software/debug_tester/debugtester_cm0_le.uvopt new file mode 100644 index 0000000..647d030 --- /dev/null +++ b/Cortex-M0/nanosoc/software/debug_tester/debugtester_cm0_le.uvopt @@ -0,0 +1,245 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no" ?> +<ProjectOpt xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="project_opt.xsd"> + + <SchemaVersion>1.0</SchemaVersion> + + <Header>### uVision Project, (C) Keil Software</Header> + + <Extensions> + <cExt>*.c</cExt> + <aExt>*.s*; *.src; *.a*</aExt> + <oExt>*.obj</oExt> + <lExt>*.lib</lExt> + <tExt>*.txt; *.h; *.inc</tExt> + <pExt>*.plm</pExt> + <CppX>*.cpp</CppX> + </Extensions> + + <DaveTm> + <dwLowDateTime>0</dwLowDateTime> + <dwHighDateTime>0</dwHighDateTime> + </DaveTm> + + <Target> + <TargetName>Debug</TargetName> + <ToolsetNumber>0x4</ToolsetNumber> + <ToolsetName>ARM-ADS</ToolsetName> + <TargetOption> + <CLKADS>50000000</CLKADS> + <OPTTT> + <gFlags>1</gFlags> + <BeepAtEnd>1</BeepAtEnd> + <RunSim>1</RunSim> + <RunTarget>0</RunTarget> + </OPTTT> + <OPTHX> + <HexSelection>1</HexSelection> + <FlashByte>65535</FlashByte> + <HexRangeLowAddress>0</HexRangeLowAddress> + <HexRangeHighAddress>0</HexRangeHighAddress> + <HexOffset>0</HexOffset> + </OPTHX> + <OPTLEX> + <PageWidth>79</PageWidth> + <PageLength>66</PageLength> + <TabStop>8</TabStop> + <ListingPath>.\</ListingPath> + </OPTLEX> + <ListingPage> + <CreateCListing>1</CreateCListing> + <CreateAListing>1</CreateAListing> + <CreateLListing>1</CreateLListing> + <CreateIListing>0</CreateIListing> + <AsmCond>1</AsmCond> + <AsmSymb>1</AsmSymb> + <AsmXref>0</AsmXref> + <CCond>1</CCond> + <CCode>0</CCode> + <CListInc>0</CListInc> + <CSymb>0</CSymb> + <LinkerCodeListing>0</LinkerCodeListing> + </ListingPage> + <OPTXL> + <LMap>1</LMap> + <LComments>1</LComments> + <LGenerateSymbols>1</LGenerateSymbols> + <LLibSym>1</LLibSym> + <LLines>1</LLines> + <LLocSym>1</LLocSym> + <LPubSym>1</LPubSym> + <LXref>0</LXref> + <LExpSel>0</LExpSel> + </OPTXL> + <OPTFL> + <tvExp>1</tvExp> + <tvExpOptDlg>0</tvExpOptDlg> + <IsCurrentTarget>1</IsCurrentTarget> + </OPTFL> + <CpuCode>255</CpuCode> + <DllOpt> + <SimDllName>SARMCM3.DLL</SimDllName> + <SimDllArguments></SimDllArguments> + <SimDlgDllName>DARMCM1.DLL</SimDlgDllName> + <SimDlgDllArguments></SimDlgDllArguments> + <TargetDllName>SARMCM3.DLL</TargetDllName> + <TargetDllArguments></TargetDllArguments> + <TargetDlgDllName>TARMCM1.DLL</TargetDlgDllName> + <TargetDlgDllArguments></TargetDlgDllArguments> + </DllOpt> + <DebugOpt> + <uSim>1</uSim> + <uTrg>0</uTrg> + <sLdApp>1</sLdApp> + <sGomain>1</sGomain> + <sRbreak>1</sRbreak> + <sRwatch>1</sRwatch> + <sRmem>1</sRmem> + <sRfunc>1</sRfunc> + <sRbox>1</sRbox> + <tLdApp>1</tLdApp> + <tGomain>0</tGomain> + <tRbreak>1</tRbreak> + <tRwatch>1</tRwatch> + <tRmem>1</tRmem> + <tRfunc>0</tRfunc> + <tRbox>1</tRbox> + <tRtrace>0</tRtrace> + <sRunDeb>0</sRunDeb> + <sLrtime>0</sLrtime> + <nTsel>-1</nTsel> + <sDll></sDll> + <sDllPa></sDllPa> + <sDlgDll></sDlgDll> + <sDlgPa></sDlgPa> + <sIfile></sIfile> + <tDll></tDll> + <tDllPa></tDllPa> + <tDlgDll></tDlgDll> + <tDlgPa></tDlgPa> + <tIfile></tIfile> + <pMon></pMon> + </DebugOpt> + <Breakpoint/> + <DebugFlag> + <trace>0</trace> + <periodic>1</periodic> + <aLwin>0</aLwin> + <aCover>0</aCover> + <aSer1>0</aSer1> + <aSer2>0</aSer2> + <aPa>0</aPa> + <viewmode>0</viewmode> + <vrSel>0</vrSel> + <aSym>0</aSym> + <aTbox>0</aTbox> + <AscS1>0</AscS1> + <AscS2>0</AscS2> + <AscS3>0</AscS3> + <aSer3>0</aSer3> + <eProf>0</eProf> + <aLa>0</aLa> + <aPa1>0</aPa1> + <AscS4>0</AscS4> + <aSer4>0</aSer4> + <StkLoc>0</StkLoc> + <TrcWin>0</TrcWin> + <newCpu>0</newCpu> + <uProt>0</uProt> + </DebugFlag> + <Tracepoint> + <THDelay>0</THDelay> + </Tracepoint> + <LintExecutable></LintExecutable> + <LintConfigFile></LintConfigFile> + </TargetOption> + </Target> + + <Group> + <GroupName>Startup</GroupName> + <tvExp>1</tvExp> + <tvExpOptDlg>0</tvExpOptDlg> + <cbSel>0</cbSel> + <RteFlg>0</RteFlg> + <File> + <GroupNumber>1</GroupNumber> + <FileNumber>1</FileNumber> + <FileType>2</FileType> + <tvExp>0</tvExp> + <Focus>0</Focus> + <ColumnNumber>0</ColumnNumber> + <tvExpOptDlg>0</tvExpOptDlg> + <TopLine>1</TopLine> + <CurrentLine>1</CurrentLine> + <bDave2>0</bDave2> + <PathWithFileName>..\cmsis\Device\ARM\CMSDK_CM0\Source\ARM\startup_CMSDK_CM0.s</PathWithFileName> + <FilenameWithoutPath>startup_CMSDK_CM0.s</FilenameWithoutPath> + <RteFlg>0</RteFlg> + <bShared>0</bShared> + </File> + </Group> + + <Group> + <GroupName>Application</GroupName> + <tvExp>1</tvExp> + <tvExpOptDlg>0</tvExpOptDlg> + <cbSel>0</cbSel> + <RteFlg>0</RteFlg> + <File> + <GroupNumber>2</GroupNumber> + <FileNumber>2</FileNumber> + <FileType>1</FileType> + <tvExp>0</tvExp> + <Focus>0</Focus> + <ColumnNumber>0</ColumnNumber> + <tvExpOptDlg>0</tvExpOptDlg> + <TopLine>1</TopLine> + <CurrentLine>1</CurrentLine> + <bDave2>0</bDave2> + <PathWithFileName>.\debugtester.c</PathWithFileName> + <FilenameWithoutPath>cmsdk_debugtester.c</FilenameWithoutPath> + <RteFlg>0</RteFlg> + <bShared>0</bShared> + </File> + </Group> + + <Group> + <GroupName>System</GroupName> + <tvExp>1</tvExp> + <tvExpOptDlg>0</tvExpOptDlg> + <cbSel>0</cbSel> + <RteFlg>0</RteFlg> + <File> + <GroupNumber>3</GroupNumber> + <FileNumber>3</FileNumber> + <FileType>1</FileType> + <tvExp>0</tvExp> + <Focus>0</Focus> + <ColumnNumber>0</ColumnNumber> + <tvExpOptDlg>0</tvExpOptDlg> + <TopLine>0</TopLine> + <CurrentLine>0</CurrentLine> + <bDave2>0</bDave2> + <PathWithFileName>.\system_cmsdk_debugtester.c</PathWithFileName> + <FilenameWithoutPath>system_cmsdk_debugtester.c</FilenameWithoutPath> + <RteFlg>0</RteFlg> + <bShared>0</bShared> + </File> + <File> + <GroupNumber>3</GroupNumber> + <FileNumber>4</FileNumber> + <FileType>1</FileType> + <tvExp>0</tvExp> + <Focus>0</Focus> + <ColumnNumber>0</ColumnNumber> + <tvExpOptDlg>0</tvExpOptDlg> + <TopLine>0</TopLine> + <CurrentLine>0</CurrentLine> + <bDave2>0</bDave2> + <PathWithFileName>.\retarget_cmsdk_debugtester.c</PathWithFileName> + <FilenameWithoutPath>retarget_cmsdk_debugtester.c</FilenameWithoutPath> + <RteFlg>0</RteFlg> + <bShared>0</bShared> + </File> + </Group> + +</ProjectOpt> diff --git a/Cortex-M0/nanosoc/software/debug_tester/debugtester_cm0_le.uvproj b/Cortex-M0/nanosoc/software/debug_tester/debugtester_cm0_le.uvproj new file mode 100644 index 0000000..7973ddc --- /dev/null +++ b/Cortex-M0/nanosoc/software/debug_tester/debugtester_cm0_le.uvproj @@ -0,0 +1,430 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no" ?> +<Project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="project_proj.xsd"> + + <SchemaVersion>1.1</SchemaVersion> + + <Header>### uVision Project, (C) Keil Software</Header> + + <Targets> + <Target> + <TargetName>Debug</TargetName> + <ToolsetNumber>0x4</ToolsetNumber> + <ToolsetName>ARM-ADS</ToolsetName> + <TargetOption> + <TargetCommonOption> + <Device>Cortex-M0</Device> + <Vendor>ARM</Vendor> + <Cpu>CLOCK(12000000) CPUTYPE("Cortex-M0") ESEL ELITTLE</Cpu> + <FlashUtilSpec></FlashUtilSpec> + <StartupFile></StartupFile> + <FlashDriverDll></FlashDriverDll> + <DeviceId>4803</DeviceId> + <RegisterFile></RegisterFile> + <MemoryEnv></MemoryEnv> + <Cmp></Cmp> + <Asm></Asm> + <Linker></Linker> + <OHString></OHString> + <InfinionOptionDll></InfinionOptionDll> + <SLE66CMisc></SLE66CMisc> + <SLE66AMisc></SLE66AMisc> + <SLE66LinkerMisc></SLE66LinkerMisc> + <SFDFile></SFDFile> + <UseEnv>0</UseEnv> + <BinPath></BinPath> + <IncludePath></IncludePath> + <LibPath></LibPath> + <RegisterFilePath></RegisterFilePath> + <DBRegisterFilePath></DBRegisterFilePath> + <TargetStatus> + <Error>0</Error> + <ExitCodeStop>0</ExitCodeStop> + <ButtonStop>0</ButtonStop> + <NotGenerated>0</NotGenerated> + <InvalidFlash>1</InvalidFlash> + </TargetStatus> + <OutputDirectory>.\</OutputDirectory> + <OutputName>debugtester_le</OutputName> + <CreateExecutable>1</CreateExecutable> + <CreateLib>0</CreateLib> + <CreateHexFile>0</CreateHexFile> + <DebugInformation>1</DebugInformation> + <BrowseInformation>1</BrowseInformation> + <ListingPath>.\</ListingPath> + <HexFormatSelection>1</HexFormatSelection> + <Merge32K>0</Merge32K> + <CreateBatchFile>0</CreateBatchFile> + <BeforeCompile> + <RunUserProg1>0</RunUserProg1> + <RunUserProg2>0</RunUserProg2> + <UserProg1Name></UserProg1Name> + <UserProg2Name></UserProg2Name> + <UserProg1Dos16Mode>0</UserProg1Dos16Mode> + <UserProg2Dos16Mode>0</UserProg2Dos16Mode> + <nStopU1X>0</nStopU1X> + <nStopU2X>0</nStopU2X> + </BeforeCompile> + <BeforeMake> + <RunUserProg1>0</RunUserProg1> + <RunUserProg2>0</RunUserProg2> + <UserProg1Name></UserProg1Name> + <UserProg2Name></UserProg2Name> + <UserProg1Dos16Mode>0</UserProg1Dos16Mode> + <UserProg2Dos16Mode>0</UserProg2Dos16Mode> + </BeforeMake> + <AfterMake> + <RunUserProg1>1</RunUserProg1> + <RunUserProg2>0</RunUserProg2> + <UserProg1Name>$K\ARM\ARMCC\BIN\fromelf.exe #L --vhx --8x1 --output debugtester_le.hex</UserProg1Name> + <UserProg2Name></UserProg2Name> + <UserProg1Dos16Mode>0</UserProg1Dos16Mode> + <UserProg2Dos16Mode>0</UserProg2Dos16Mode> + </AfterMake> + <SelectedForBatchBuild>0</SelectedForBatchBuild> + <SVCSIdString></SVCSIdString> + </TargetCommonOption> + <CommonProperty> + <UseCPPCompiler>0</UseCPPCompiler> + <RVCTCodeConst>0</RVCTCodeConst> + <RVCTZI>0</RVCTZI> + <RVCTOtherData>0</RVCTOtherData> + <ModuleSelection>0</ModuleSelection> + <IncludeInBuild>1</IncludeInBuild> + <AlwaysBuild>0</AlwaysBuild> + <GenerateAssemblyFile>0</GenerateAssemblyFile> + <AssembleAssemblyFile>0</AssembleAssemblyFile> + <PublicsOnly>0</PublicsOnly> + <StopOnExitCode>3</StopOnExitCode> + <CustomArgument></CustomArgument> + <IncludeLibraryModules></IncludeLibraryModules> + </CommonProperty> + <DllOption> + <SimDllName>SARMCM3.DLL</SimDllName> + <SimDllArguments></SimDllArguments> + <SimDlgDll>DARMCM1.DLL</SimDlgDll> + <SimDlgDllArguments></SimDlgDllArguments> + <TargetDllName>SARMCM3.DLL</TargetDllName> + <TargetDllArguments></TargetDllArguments> + <TargetDlgDll>TARMCM1.DLL</TargetDlgDll> + <TargetDlgDllArguments></TargetDlgDllArguments> + </DllOption> + <DebugOption> + <OPTHX> + <HexSelection>1</HexSelection> + <HexRangeLowAddress>0</HexRangeLowAddress> + <HexRangeHighAddress>0</HexRangeHighAddress> + <HexOffset>0</HexOffset> + <Oh166RecLen>16</Oh166RecLen> + </OPTHX> + <Simulator> + <UseSimulator>1</UseSimulator> + <LoadApplicationAtStartup>1</LoadApplicationAtStartup> + <RunToMain>1</RunToMain> + <RestoreBreakpoints>1</RestoreBreakpoints> + <RestoreWatchpoints>1</RestoreWatchpoints> + <RestoreMemoryDisplay>1</RestoreMemoryDisplay> + <RestoreFunctions>1</RestoreFunctions> + <RestoreToolbox>1</RestoreToolbox> + <LimitSpeedToRealTime>0</LimitSpeedToRealTime> + </Simulator> + <Target> + <UseTarget>0</UseTarget> + <LoadApplicationAtStartup>1</LoadApplicationAtStartup> + <RunToMain>0</RunToMain> + <RestoreBreakpoints>1</RestoreBreakpoints> + <RestoreWatchpoints>1</RestoreWatchpoints> + <RestoreMemoryDisplay>1</RestoreMemoryDisplay> + <RestoreFunctions>0</RestoreFunctions> + <RestoreToolbox>1</RestoreToolbox> + <RestoreTracepoints>0</RestoreTracepoints> + </Target> + <RunDebugAfterBuild>0</RunDebugAfterBuild> + <TargetSelection>-1</TargetSelection> + <SimDlls> + <CpuDll></CpuDll> + <CpuDllArguments></CpuDllArguments> + <PeripheralDll></PeripheralDll> + <PeripheralDllArguments></PeripheralDllArguments> + <InitializationFile></InitializationFile> + </SimDlls> + <TargetDlls> + <CpuDll></CpuDll> + <CpuDllArguments></CpuDllArguments> + <PeripheralDll></PeripheralDll> + <PeripheralDllArguments></PeripheralDllArguments> + <InitializationFile></InitializationFile> + <Driver></Driver> + </TargetDlls> + </DebugOption> + <Utilities> + <Flash1> + <UseTargetDll>0</UseTargetDll> + <UseExternalTool>0</UseExternalTool> + <RunIndependent>0</RunIndependent> + <UpdateFlashBeforeDebugging>0</UpdateFlashBeforeDebugging> + <Capability>0</Capability> + <DriverSelection>-1</DriverSelection> + </Flash1> + <Flash2></Flash2> + <Flash3>"" ()</Flash3> + <Flash4></Flash4> + </Utilities> + <TargetArmAds> + <ArmAdsMisc> + <GenerateListings>0</GenerateListings> + <asHll>1</asHll> + <asAsm>1</asAsm> + <asMacX>1</asMacX> + <asSyms>1</asSyms> + <asFals>1</asFals> + <asDbgD>1</asDbgD> + <asForm>1</asForm> + <ldLst>0</ldLst> + <ldmm>1</ldmm> + <ldXref>1</ldXref> + <BigEnd>0</BigEnd> + <AdsALst>1</AdsALst> + <AdsACrf>1</AdsACrf> + <AdsANop>0</AdsANop> + <AdsANot>0</AdsANot> + <AdsLLst>1</AdsLLst> + <AdsLmap>1</AdsLmap> + <AdsLcgr>1</AdsLcgr> + <AdsLsym>1</AdsLsym> + <AdsLszi>1</AdsLszi> + <AdsLtoi>1</AdsLtoi> + <AdsLsun>1</AdsLsun> + <AdsLven>1</AdsLven> + <AdsLsxf>1</AdsLsxf> + <RvctClst>0</RvctClst> + <GenPPlst>0</GenPPlst> + <AdsCpuType>"Cortex-M0"</AdsCpuType> + <RvctDeviceName></RvctDeviceName> + <mOS>0</mOS> + <uocRom>0</uocRom> + <uocRam>0</uocRam> + <hadIROM>0</hadIROM> + <hadIRAM>0</hadIRAM> + <hadXRAM>0</hadXRAM> + <uocXRam>0</uocXRam> + <RvdsVP>0</RvdsVP> + <hadIRAM2>0</hadIRAM2> + <hadIROM2>0</hadIROM2> + <StupSel>1</StupSel> + <useUlib>0</useUlib> + <EndSel>1</EndSel> + <uLtcg>0</uLtcg> + <RoSelD>0</RoSelD> + <RwSelD>5</RwSelD> + <CodeSel>0</CodeSel> + <OptFeed>0</OptFeed> + <NoZi1>0</NoZi1> + <NoZi2>0</NoZi2> + <NoZi3>0</NoZi3> + <NoZi4>0</NoZi4> + <NoZi5>0</NoZi5> + <Ro1Chk>1</Ro1Chk> + <Ro2Chk>0</Ro2Chk> + <Ro3Chk>0</Ro3Chk> + <Ir1Chk>0</Ir1Chk> + <Ir2Chk>0</Ir2Chk> + <Ra1Chk>1</Ra1Chk> + <Ra2Chk>0</Ra2Chk> + <Ra3Chk>0</Ra3Chk> + <Im1Chk>0</Im1Chk> + <Im2Chk>0</Im2Chk> + <OnChipMemories> + <Ocm1> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </Ocm1> + <Ocm2> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </Ocm2> + <Ocm3> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </Ocm3> + <Ocm4> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </Ocm4> + <Ocm5> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </Ocm5> + <Ocm6> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </Ocm6> + <IRAM> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </IRAM> + <IROM> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </IROM> + <XRAM> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </XRAM> + <OCR_RVCT1> + <Type>1</Type> + <StartAddress>0x0</StartAddress> + <Size>0x10000</Size> + </OCR_RVCT1> + <OCR_RVCT2> + <Type>1</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </OCR_RVCT2> + <OCR_RVCT3> + <Type>1</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </OCR_RVCT3> + <OCR_RVCT4> + <Type>1</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </OCR_RVCT4> + <OCR_RVCT5> + <Type>1</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </OCR_RVCT5> + <OCR_RVCT6> + <Type>0</Type> + <StartAddress>0x20000000</StartAddress> + <Size>0x4000</Size> + </OCR_RVCT6> + <OCR_RVCT7> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </OCR_RVCT7> + <OCR_RVCT8> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </OCR_RVCT8> + <OCR_RVCT9> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </OCR_RVCT9> + <OCR_RVCT10> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </OCR_RVCT10> + </OnChipMemories> + <RvctStartVector></RvctStartVector> + </ArmAdsMisc> + <Cads> + <interw>1</interw> + <Optim>3</Optim> + <oTime>0</oTime> + <SplitLS>0</SplitLS> + <OneElfS>0</OneElfS> + <Strict>0</Strict> + <EnumInt>0</EnumInt> + <PlainCh>0</PlainCh> + <Ropi>0</Ropi> + <Rwpi>0</Rwpi> + <wLevel>0</wLevel> + <uThumb>0</uThumb> + <uSurpInc>0</uSurpInc> + <VariousControls> + <MiscControls></MiscControls> + <Define>CORTEX_M0</Define> + <Undefine></Undefine> + <IncludePath>..\cmsis\CMSIS\Include; ..\cmsis\Device\ARM\CMSDK_CM0\Include</IncludePath> + </VariousControls> + </Cads> + <Aads> + <interw>1</interw> + <Ropi>0</Ropi> + <Rwpi>0</Rwpi> + <thumb>0</thumb> + <SplitLS>0</SplitLS> + <SwStkChk>0</SwStkChk> + <NoWarn>0</NoWarn> + <uSurpInc>0</uSurpInc> + <VariousControls> + <MiscControls></MiscControls> + <Define></Define> + <Undefine></Undefine> + <IncludePath></IncludePath> + </VariousControls> + </Aads> + <LDads> + <umfTarg>0</umfTarg> + <Ropi>0</Ropi> + <Rwpi>0</Rwpi> + <noStLib>0</noStLib> + <RepFail>1</RepFail> + <useFile>0</useFile> + <TextAddressRange>0x00000000</TextAddressRange> + <DataAddressRange>0x00000000</DataAddressRange> + <ScatterFile>debugtester_cm0.sct</ScatterFile> + <IncludeLibs></IncludeLibs> + <IncludeLibsPath></IncludeLibsPath> + <Misc></Misc> + <LinkerInputFile></LinkerInputFile> + <DisabledWarnings></DisabledWarnings> + </LDads> + </TargetArmAds> + </TargetOption> + <Groups> + <Group> + <GroupName>Startup</GroupName> + <Files> + <File> + <FileName>startup_CMSDK_CM0.s</FileName> + <FileType>2</FileType> + <FilePath>..\cmsis\Device\ARM\CMSDK_CM0\Source\ARM\startup_CMSDK_CM0.s</FilePath> + </File> + </Files> + </Group> + <Group> + <GroupName>Application</GroupName> + <Files> + <File> + <FileName>cmsdk_debugtester.c</FileName> + <FileType>1</FileType> + <FilePath>.\debugtester.c</FilePath> + </File> + </Files> + </Group> + <Group> + <GroupName>System</GroupName> + <Files> + <File> + <FileName>system_cmsdk_debugtester.c</FileName> + <FileType>1</FileType> + <FilePath>.\system_cmsdk_debugtester.c</FilePath> + </File> + <File> + <FileName>retarget_cmsdk_debugtester.c</FileName> + <FileType>1</FileType> + <FilePath>.\retarget_cmsdk_debugtester.c</FilePath> + </File> + </Files> + </Group> + </Groups> + </Target> + </Targets> + +</Project> diff --git a/Cortex-M0/nanosoc/software/debug_tester/debugtester_cm0plus.sct b/Cortex-M0/nanosoc/software/debug_tester/debugtester_cm0plus.sct new file mode 100644 index 0000000..8068dfb --- /dev/null +++ b/Cortex-M0/nanosoc/software/debug_tester/debugtester_cm0plus.sct @@ -0,0 +1,38 @@ +;----------------------------------------------------------------------------- +; The confidential and proprietary information contained in this file may +; only be used by a person authorised under and to the extent permitted +; by a subsisting licensing agreement from Arm Limited or its affiliates. +; +; (C) COPYRIGHT 2013 Arm Limited or its affiliates. +; ALL RIGHTS RESERVED +; +; This entire notice must be reproduced on all copies of this file +; and copies of this file may only be made by a person if such person is +; permitted to do so under the terms of a subsisting license agreement +; from Arm Limited or its affiliates. +; +; SVN Information +; +; Checked In : $Date: 2011-02-22 16:53:27 +0000 (Tue, 22 Feb 2011) $ +; +; Revision : $Revision: 162307 $ +; +; Release Information : Cortex-M System Design Kit-r1p1-00rel0 +; +;----------------------------------------------------------------------------- + +; ************************************************************* +; *** Scatter-Loading Description File generated by uVision *** +; ************************************************************* + +LR_ROM1 0x00000000 0x00020000 { ; load region size_region + ER_ROM1 0x00000000 0x00020000 { ; load address = execution address + startup_CMSDK_CM0PLUS.o (RESET, +FIRST) + *(InRoot$$Sections) + .ANY (+RO) + } + RW_RAM1 0x20000000 0x00004000 { ; RW data + .ANY (+RW +ZI) + } +} + diff --git a/Cortex-M0/nanosoc/software/debug_tester/debugtester_cm0plus_be.uvopt b/Cortex-M0/nanosoc/software/debug_tester/debugtester_cm0plus_be.uvopt new file mode 100644 index 0000000..253e152 --- /dev/null +++ b/Cortex-M0/nanosoc/software/debug_tester/debugtester_cm0plus_be.uvopt @@ -0,0 +1,230 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no" ?> +<ProjectOpt xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="project_opt.xsd"> + + <SchemaVersion>1.0</SchemaVersion> + + <Header>### uVision Project, (C) Keil Software</Header> + + <Extensions> + <cExt>*.c</cExt> + <aExt>*.s*; *.src; *.a*</aExt> + <oExt>*.obj</oExt> + <lExt>*.lib</lExt> + <tExt>*.txt; *.h; *.inc</tExt> + <pExt>*.plm</pExt> + <CppX>*.cpp</CppX> + </Extensions> + + <DaveTm> + <dwLowDateTime>0</dwLowDateTime> + <dwHighDateTime>0</dwHighDateTime> + </DaveTm> + + <Target> + <TargetName>Debug</TargetName> + <ToolsetNumber>0x4</ToolsetNumber> + <ToolsetName>ARM-ADS</ToolsetName> + <TargetOption> + <CLKADS>50000000</CLKADS> + <OPTTT> + <gFlags>1</gFlags> + <BeepAtEnd>1</BeepAtEnd> + <RunSim>1</RunSim> + <RunTarget>0</RunTarget> + </OPTTT> + <OPTHX> + <HexSelection>1</HexSelection> + <FlashByte>65535</FlashByte> + <HexRangeLowAddress>0</HexRangeLowAddress> + <HexRangeHighAddress>0</HexRangeHighAddress> + <HexOffset>0</HexOffset> + </OPTHX> + <OPTLEX> + <PageWidth>79</PageWidth> + <PageLength>66</PageLength> + <TabStop>8</TabStop> + <ListingPath>.\</ListingPath> + </OPTLEX> + <ListingPage> + <CreateCListing>1</CreateCListing> + <CreateAListing>1</CreateAListing> + <CreateLListing>1</CreateLListing> + <CreateIListing>0</CreateIListing> + <AsmCond>1</AsmCond> + <AsmSymb>1</AsmSymb> + <AsmXref>0</AsmXref> + <CCond>1</CCond> + <CCode>0</CCode> + <CListInc>0</CListInc> + <CSymb>0</CSymb> + <LinkerCodeListing>0</LinkerCodeListing> + </ListingPage> + <OPTXL> + <LMap>1</LMap> + <LComments>1</LComments> + <LGenerateSymbols>1</LGenerateSymbols> + <LLibSym>1</LLibSym> + <LLines>1</LLines> + <LLocSym>1</LLocSym> + <LPubSym>1</LPubSym> + <LXref>0</LXref> + <LExpSel>0</LExpSel> + </OPTXL> + <OPTFL> + <tvExp>1</tvExp> + <tvExpOptDlg>0</tvExpOptDlg> + <IsCurrentTarget>1</IsCurrentTarget> + </OPTFL> + <CpuCode>255</CpuCode> + <DllOpt> + <SimDllName>SARMCM3.DLL</SimDllName> + <SimDllArguments></SimDllArguments> + <SimDlgDllName>DARMCM1.DLL</SimDlgDllName> + <SimDlgDllArguments></SimDlgDllArguments> + <TargetDllName>SARMCM3.DLL</TargetDllName> + <TargetDllArguments></TargetDllArguments> + <TargetDlgDllName>TARMCM1.DLL</TargetDlgDllName> + <TargetDlgDllArguments></TargetDlgDllArguments> + </DllOpt> + <DebugOpt> + <uSim>1</uSim> + <uTrg>0</uTrg> + <sLdApp>1</sLdApp> + <sGomain>1</sGomain> + <sRbreak>1</sRbreak> + <sRwatch>1</sRwatch> + <sRmem>1</sRmem> + <sRfunc>1</sRfunc> + <sRbox>1</sRbox> + <tLdApp>1</tLdApp> + <tGomain>0</tGomain> + <tRbreak>1</tRbreak> + <tRwatch>1</tRwatch> + <tRmem>1</tRmem> + <tRfunc>0</tRfunc> + <tRbox>1</tRbox> + <sRunDeb>0</sRunDeb> + <sLrtime>0</sLrtime> + <nTsel>-1</nTsel> + <sDll></sDll> + <sDllPa></sDllPa> + <sDlgDll></sDlgDll> + <sDlgPa></sDlgPa> + <sIfile></sIfile> + <tDll></tDll> + <tDllPa></tDllPa> + <tDlgDll></tDlgDll> + <tDlgPa></tDlgPa> + <tIfile></tIfile> + <pMon></pMon> + </DebugOpt> + <Breakpoint/> + <DebugFlag> + <trace>0</trace> + <periodic>1</periodic> + <aLwin>0</aLwin> + <aCover>0</aCover> + <aSer1>0</aSer1> + <aSer2>0</aSer2> + <aPa>0</aPa> + <viewmode>0</viewmode> + <vrSel>0</vrSel> + <aSym>0</aSym> + <aTbox>0</aTbox> + <AscS1>0</AscS1> + <AscS2>0</AscS2> + <AscS3>0</AscS3> + <aSer3>0</aSer3> + <eProf>0</eProf> + <aLa>0</aLa> + <aPa1>0</aPa1> + <AscS4>0</AscS4> + <aSer4>0</aSer4> + <StkLoc>0</StkLoc> + <TrcWin>0</TrcWin> + <newCpu>0</newCpu> + <uProt>0</uProt> + </DebugFlag> + <LintExecutable></LintExecutable> + <LintConfigFile></LintConfigFile> + </TargetOption> + </Target> + + <Group> + <GroupName>Startup</GroupName> + <tvExp>1</tvExp> + <tvExpOptDlg>0</tvExpOptDlg> + <cbSel>0</cbSel> + <File> + <GroupNumber>1</GroupNumber> + <FileNumber>1</FileNumber> + <FileType>2</FileType> + <tvExp>0</tvExp> + <Focus>0</Focus> + <ColumnNumber>0</ColumnNumber> + <tvExpOptDlg>0</tvExpOptDlg> + <TopLine>0</TopLine> + <CurrentLine>0</CurrentLine> + <bDave2>0</bDave2> + <PathWithFileName>..\cmsis\Device\ARM\CMSDK_CM0PLUS\Source\ARM\startup_CMSDK_CM0PLUS.s</PathWithFileName> + <FilenameWithoutPath>startup_CMSDK_CM0PLUS.s</FilenameWithoutPath> + </File> + </Group> + + <Group> + <GroupName>Application</GroupName> + <tvExp>0</tvExp> + <tvExpOptDlg>0</tvExpOptDlg> + <cbSel>0</cbSel> + <File> + <GroupNumber>2</GroupNumber> + <FileNumber>2</FileNumber> + <FileType>1</FileType> + <tvExp>1</tvExp> + <Focus>0</Focus> + <ColumnNumber>24</ColumnNumber> + <tvExpOptDlg>0</tvExpOptDlg> + <TopLine>24</TopLine> + <CurrentLine>25</CurrentLine> + <bDave2>0</bDave2> + <PathWithFileName>.\debugtester.c</PathWithFileName> + <FilenameWithoutPath>debugtester.c</FilenameWithoutPath> + </File> + </Group> + + <Group> + <GroupName>System</GroupName> + <tvExp>1</tvExp> + <tvExpOptDlg>0</tvExpOptDlg> + <cbSel>0</cbSel> + <File> + <GroupNumber>3</GroupNumber> + <FileNumber>3</FileNumber> + <FileType>1</FileType> + <tvExp>0</tvExp> + <Focus>0</Focus> + <ColumnNumber>0</ColumnNumber> + <tvExpOptDlg>0</tvExpOptDlg> + <TopLine>0</TopLine> + <CurrentLine>0</CurrentLine> + <bDave2>0</bDave2> + <PathWithFileName>.\system_cmsdk_debugtester.c</PathWithFileName> + <FilenameWithoutPath>system_cmsdk_debugtester.c</FilenameWithoutPath> + </File> + <File> + <GroupNumber>3</GroupNumber> + <FileNumber>4</FileNumber> + <FileType>1</FileType> + <tvExp>0</tvExp> + <Focus>0</Focus> + <ColumnNumber>0</ColumnNumber> + <tvExpOptDlg>0</tvExpOptDlg> + <TopLine>0</TopLine> + <CurrentLine>0</CurrentLine> + <bDave2>0</bDave2> + <PathWithFileName>.\retarget_cmsdk_debugtester.c</PathWithFileName> + <FilenameWithoutPath>retarget_cmsdk_debugtester.c</FilenameWithoutPath> + </File> + </Group> + +</ProjectOpt> diff --git a/Cortex-M0/nanosoc/software/debug_tester/debugtester_cm0plus_be.uvproj b/Cortex-M0/nanosoc/software/debug_tester/debugtester_cm0plus_be.uvproj new file mode 100644 index 0000000..7d4eeb1 --- /dev/null +++ b/Cortex-M0/nanosoc/software/debug_tester/debugtester_cm0plus_be.uvproj @@ -0,0 +1,427 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no" ?> +<Project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="project_proj.xsd"> + + <SchemaVersion>1.1</SchemaVersion> + + <Header>### uVision Project, (C) Keil Software</Header> + + <Targets> + <Target> + <TargetName>Debug</TargetName> + <ToolsetNumber>0x4</ToolsetNumber> + <ToolsetName>ARM-ADS</ToolsetName> + <TargetOption> + <TargetCommonOption> + <Device>Cortex-M0+</Device> + <Vendor>ARM</Vendor> + <Cpu>CLOCK(12000000) CPUTYPE("Cortex-M0+") ESEL ELITTLE</Cpu> + <FlashUtilSpec></FlashUtilSpec> + <StartupFile></StartupFile> + <FlashDriverDll></FlashDriverDll> + <DeviceId>6268</DeviceId> + <RegisterFile></RegisterFile> + <MemoryEnv></MemoryEnv> + <Cmp></Cmp> + <Asm></Asm> + <Linker></Linker> + <OHString></OHString> + <InfinionOptionDll></InfinionOptionDll> + <SLE66CMisc></SLE66CMisc> + <SLE66AMisc></SLE66AMisc> + <SLE66LinkerMisc></SLE66LinkerMisc> + <SFDFile></SFDFile> + <UseEnv>0</UseEnv> + <BinPath></BinPath> + <IncludePath></IncludePath> + <LibPath></LibPath> + <RegisterFilePath></RegisterFilePath> + <DBRegisterFilePath></DBRegisterFilePath> + <TargetStatus> + <Error>0</Error> + <ExitCodeStop>0</ExitCodeStop> + <ButtonStop>0</ButtonStop> + <NotGenerated>0</NotGenerated> + <InvalidFlash>1</InvalidFlash> + </TargetStatus> + <OutputDirectory>.\</OutputDirectory> + <OutputName>debugtester_be</OutputName> + <CreateExecutable>1</CreateExecutable> + <CreateLib>0</CreateLib> + <CreateHexFile>0</CreateHexFile> + <DebugInformation>1</DebugInformation> + <BrowseInformation>1</BrowseInformation> + <ListingPath>.\</ListingPath> + <HexFormatSelection>1</HexFormatSelection> + <Merge32K>0</Merge32K> + <CreateBatchFile>0</CreateBatchFile> + <BeforeCompile> + <RunUserProg1>0</RunUserProg1> + <RunUserProg2>0</RunUserProg2> + <UserProg1Name></UserProg1Name> + <UserProg2Name></UserProg2Name> + <UserProg1Dos16Mode>0</UserProg1Dos16Mode> + <UserProg2Dos16Mode>0</UserProg2Dos16Mode> + <nStopU1X>0</nStopU1X> + <nStopU2X>0</nStopU2X> + </BeforeCompile> + <BeforeMake> + <RunUserProg1>0</RunUserProg1> + <RunUserProg2>0</RunUserProg2> + <UserProg1Name></UserProg1Name> + <UserProg2Name></UserProg2Name> + <UserProg1Dos16Mode>0</UserProg1Dos16Mode> + <UserProg2Dos16Mode>0</UserProg2Dos16Mode> + </BeforeMake> + <AfterMake> + <RunUserProg1>1</RunUserProg1> + <RunUserProg2>0</RunUserProg2> + <UserProg1Name>$K\ARM\ARMCC\BIN\fromelf.exe #L --vhx --8x1 --output debugtester_be.hex</UserProg1Name> + <UserProg2Name></UserProg2Name> + <UserProg1Dos16Mode>0</UserProg1Dos16Mode> + <UserProg2Dos16Mode>0</UserProg2Dos16Mode> + </AfterMake> + <SelectedForBatchBuild>0</SelectedForBatchBuild> + <SVCSIdString></SVCSIdString> + </TargetCommonOption> + <CommonProperty> + <UseCPPCompiler>0</UseCPPCompiler> + <RVCTCodeConst>0</RVCTCodeConst> + <RVCTZI>0</RVCTZI> + <RVCTOtherData>0</RVCTOtherData> + <ModuleSelection>0</ModuleSelection> + <IncludeInBuild>1</IncludeInBuild> + <AlwaysBuild>0</AlwaysBuild> + <GenerateAssemblyFile>0</GenerateAssemblyFile> + <AssembleAssemblyFile>0</AssembleAssemblyFile> + <PublicsOnly>0</PublicsOnly> + <StopOnExitCode>3</StopOnExitCode> + <CustomArgument></CustomArgument> + <IncludeLibraryModules></IncludeLibraryModules> + </CommonProperty> + <DllOption> + <SimDllName>SARMCM3.DLL</SimDllName> + <SimDllArguments></SimDllArguments> + <SimDlgDll>DARMCM1.DLL</SimDlgDll> + <SimDlgDllArguments></SimDlgDllArguments> + <TargetDllName>SARMCM3.DLL</TargetDllName> + <TargetDllArguments></TargetDllArguments> + <TargetDlgDll>TARMCM1.DLL</TargetDlgDll> + <TargetDlgDllArguments></TargetDlgDllArguments> + </DllOption> + <DebugOption> + <OPTHX> + <HexSelection>1</HexSelection> + <HexRangeLowAddress>0</HexRangeLowAddress> + <HexRangeHighAddress>0</HexRangeHighAddress> + <HexOffset>0</HexOffset> + <Oh166RecLen>16</Oh166RecLen> + </OPTHX> + <Simulator> + <UseSimulator>1</UseSimulator> + <LoadApplicationAtStartup>1</LoadApplicationAtStartup> + <RunToMain>1</RunToMain> + <RestoreBreakpoints>1</RestoreBreakpoints> + <RestoreWatchpoints>1</RestoreWatchpoints> + <RestoreMemoryDisplay>1</RestoreMemoryDisplay> + <RestoreFunctions>1</RestoreFunctions> + <RestoreToolbox>1</RestoreToolbox> + <LimitSpeedToRealTime>0</LimitSpeedToRealTime> + </Simulator> + <Target> + <UseTarget>0</UseTarget> + <LoadApplicationAtStartup>1</LoadApplicationAtStartup> + <RunToMain>0</RunToMain> + <RestoreBreakpoints>1</RestoreBreakpoints> + <RestoreWatchpoints>1</RestoreWatchpoints> + <RestoreMemoryDisplay>1</RestoreMemoryDisplay> + <RestoreFunctions>0</RestoreFunctions> + <RestoreToolbox>1</RestoreToolbox> + </Target> + <RunDebugAfterBuild>0</RunDebugAfterBuild> + <TargetSelection>-1</TargetSelection> + <SimDlls> + <CpuDll></CpuDll> + <CpuDllArguments></CpuDllArguments> + <PeripheralDll></PeripheralDll> + <PeripheralDllArguments></PeripheralDllArguments> + <InitializationFile></InitializationFile> + </SimDlls> + <TargetDlls> + <CpuDll></CpuDll> + <CpuDllArguments></CpuDllArguments> + <PeripheralDll></PeripheralDll> + <PeripheralDllArguments></PeripheralDllArguments> + <InitializationFile></InitializationFile> + <Driver></Driver> + </TargetDlls> + </DebugOption> + <Utilities> + <Flash1> + <UseTargetDll>0</UseTargetDll> + <UseExternalTool>0</UseExternalTool> + <RunIndependent>0</RunIndependent> + <UpdateFlashBeforeDebugging>0</UpdateFlashBeforeDebugging> + <Capability>0</Capability> + <DriverSelection>-1</DriverSelection> + </Flash1> + <Flash2></Flash2> + <Flash3></Flash3> + <Flash4></Flash4> + </Utilities> + <TargetArmAds> + <ArmAdsMisc> + <GenerateListings>0</GenerateListings> + <asHll>1</asHll> + <asAsm>1</asAsm> + <asMacX>1</asMacX> + <asSyms>1</asSyms> + <asFals>1</asFals> + <asDbgD>1</asDbgD> + <asForm>1</asForm> + <ldLst>0</ldLst> + <ldmm>1</ldmm> + <ldXref>1</ldXref> + <BigEnd>0</BigEnd> + <AdsALst>1</AdsALst> + <AdsACrf>1</AdsACrf> + <AdsANop>0</AdsANop> + <AdsANot>0</AdsANot> + <AdsLLst>1</AdsLLst> + <AdsLmap>1</AdsLmap> + <AdsLcgr>1</AdsLcgr> + <AdsLsym>1</AdsLsym> + <AdsLszi>1</AdsLszi> + <AdsLtoi>1</AdsLtoi> + <AdsLsun>1</AdsLsun> + <AdsLven>1</AdsLven> + <AdsLsxf>1</AdsLsxf> + <RvctClst>0</RvctClst> + <GenPPlst>0</GenPPlst> + <AdsCpuType>"Cortex-M0+"</AdsCpuType> + <RvctDeviceName></RvctDeviceName> + <mOS>0</mOS> + <uocRom>0</uocRom> + <uocRam>0</uocRam> + <hadIROM>0</hadIROM> + <hadIRAM>0</hadIRAM> + <hadXRAM>0</hadXRAM> + <uocXRam>0</uocXRam> + <RvdsVP>0</RvdsVP> + <hadIRAM2>0</hadIRAM2> + <hadIROM2>0</hadIROM2> + <StupSel>1</StupSel> + <useUlib>0</useUlib> + <EndSel>1</EndSel> + <uLtcg>0</uLtcg> + <RoSelD>0</RoSelD> + <RwSelD>5</RwSelD> + <CodeSel>0</CodeSel> + <OptFeed>0</OptFeed> + <NoZi1>0</NoZi1> + <NoZi2>0</NoZi2> + <NoZi3>0</NoZi3> + <NoZi4>0</NoZi4> + <NoZi5>0</NoZi5> + <Ro1Chk>1</Ro1Chk> + <Ro2Chk>0</Ro2Chk> + <Ro3Chk>0</Ro3Chk> + <Ir1Chk>0</Ir1Chk> + <Ir2Chk>0</Ir2Chk> + <Ra1Chk>1</Ra1Chk> + <Ra2Chk>0</Ra2Chk> + <Ra3Chk>0</Ra3Chk> + <Im1Chk>0</Im1Chk> + <Im2Chk>0</Im2Chk> + <OnChipMemories> + <Ocm1> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </Ocm1> + <Ocm2> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </Ocm2> + <Ocm3> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </Ocm3> + <Ocm4> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </Ocm4> + <Ocm5> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </Ocm5> + <Ocm6> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </Ocm6> + <IRAM> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </IRAM> + <IROM> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </IROM> + <XRAM> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </XRAM> + <OCR_RVCT1> + <Type>1</Type> + <StartAddress>0x0</StartAddress> + <Size>0x10000</Size> + </OCR_RVCT1> + <OCR_RVCT2> + <Type>1</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </OCR_RVCT2> + <OCR_RVCT3> + <Type>1</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </OCR_RVCT3> + <OCR_RVCT4> + <Type>1</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </OCR_RVCT4> + <OCR_RVCT5> + <Type>1</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </OCR_RVCT5> + <OCR_RVCT6> + <Type>0</Type> + <StartAddress>0x20000000</StartAddress> + <Size>0x4000</Size> + </OCR_RVCT6> + <OCR_RVCT7> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </OCR_RVCT7> + <OCR_RVCT8> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </OCR_RVCT8> + <OCR_RVCT9> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </OCR_RVCT9> + <OCR_RVCT10> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </OCR_RVCT10> + </OnChipMemories> + <RvctStartVector></RvctStartVector> + </ArmAdsMisc> + <Cads> + <interw>1</interw> + <Optim>3</Optim> + <oTime>0</oTime> + <SplitLS>0</SplitLS> + <OneElfS>0</OneElfS> + <Strict>0</Strict> + <EnumInt>0</EnumInt> + <PlainCh>0</PlainCh> + <Ropi>0</Ropi> + <Rwpi>0</Rwpi> + <wLevel>0</wLevel> + <uThumb>0</uThumb> + <VariousControls> + <MiscControls></MiscControls> + <Define>CORTEX_M0PLUS DEBUGTESTER_BE</Define> + <Undefine></Undefine> + <IncludePath>..\cmsis\CMSIS\Include; ..\cmsis\Device\ARM\CMSDK_CM0\Include</IncludePath> + </VariousControls> + </Cads> + <Aads> + <interw>1</interw> + <Ropi>0</Ropi> + <Rwpi>0</Rwpi> + <thumb>0</thumb> + <SplitLS>0</SplitLS> + <SwStkChk>0</SwStkChk> + <NoWarn>0</NoWarn> + <VariousControls> + <MiscControls></MiscControls> + <Define></Define> + <Undefine></Undefine> + <IncludePath></IncludePath> + </VariousControls> + </Aads> + <LDads> + <umfTarg>0</umfTarg> + <Ropi>0</Ropi> + <Rwpi>0</Rwpi> + <noStLib>0</noStLib> + <RepFail>1</RepFail> + <useFile>0</useFile> + <TextAddressRange>0x00000000</TextAddressRange> + <DataAddressRange>0x00000000</DataAddressRange> + <ScatterFile>debugtester_cm0plus.sct</ScatterFile> + <IncludeLibs></IncludeLibs> + <IncludeLibsPath></IncludeLibsPath> + <Misc></Misc> + <LinkerInputFile></LinkerInputFile> + <DisabledWarnings></DisabledWarnings> + </LDads> + </TargetArmAds> + </TargetOption> + <Groups> + <Group> + <GroupName>Startup</GroupName> + <Files> + <File> + <FileName>startup_CMSDK_CM0PLUS.s</FileName> + <FileType>2</FileType> + <FilePath>..\cmsis\Device\ARM\CMSDK_CM0PLUS\Source\ARM\startup_CMSDK_CM0PLUS.s</FilePath> + </File> + </Files> + </Group> + <Group> + <GroupName>Application</GroupName> + <Files> + <File> + <FileName>debugtester.c</FileName> + <FileType>1</FileType> + <FilePath>.\debugtester.c</FilePath> + </File> + </Files> + </Group> + <Group> + <GroupName>System</GroupName> + <Files> + <File> + <FileName>system_cmsdk_debugtester.c</FileName> + <FileType>1</FileType> + <FilePath>.\system_cmsdk_debugtester.c</FilePath> + </File> + <File> + <FileName>retarget_cmsdk_debugtester.c</FileName> + <FileType>1</FileType> + <FilePath>.\retarget_cmsdk_debugtester.c</FilePath> + </File> + </Files> + </Group> + </Groups> + </Target> + </Targets> + +</Project> diff --git a/Cortex-M0/nanosoc/software/debug_tester/debugtester_cm0plus_le.uvopt b/Cortex-M0/nanosoc/software/debug_tester/debugtester_cm0plus_le.uvopt new file mode 100644 index 0000000..253e152 --- /dev/null +++ b/Cortex-M0/nanosoc/software/debug_tester/debugtester_cm0plus_le.uvopt @@ -0,0 +1,230 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no" ?> +<ProjectOpt xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="project_opt.xsd"> + + <SchemaVersion>1.0</SchemaVersion> + + <Header>### uVision Project, (C) Keil Software</Header> + + <Extensions> + <cExt>*.c</cExt> + <aExt>*.s*; *.src; *.a*</aExt> + <oExt>*.obj</oExt> + <lExt>*.lib</lExt> + <tExt>*.txt; *.h; *.inc</tExt> + <pExt>*.plm</pExt> + <CppX>*.cpp</CppX> + </Extensions> + + <DaveTm> + <dwLowDateTime>0</dwLowDateTime> + <dwHighDateTime>0</dwHighDateTime> + </DaveTm> + + <Target> + <TargetName>Debug</TargetName> + <ToolsetNumber>0x4</ToolsetNumber> + <ToolsetName>ARM-ADS</ToolsetName> + <TargetOption> + <CLKADS>50000000</CLKADS> + <OPTTT> + <gFlags>1</gFlags> + <BeepAtEnd>1</BeepAtEnd> + <RunSim>1</RunSim> + <RunTarget>0</RunTarget> + </OPTTT> + <OPTHX> + <HexSelection>1</HexSelection> + <FlashByte>65535</FlashByte> + <HexRangeLowAddress>0</HexRangeLowAddress> + <HexRangeHighAddress>0</HexRangeHighAddress> + <HexOffset>0</HexOffset> + </OPTHX> + <OPTLEX> + <PageWidth>79</PageWidth> + <PageLength>66</PageLength> + <TabStop>8</TabStop> + <ListingPath>.\</ListingPath> + </OPTLEX> + <ListingPage> + <CreateCListing>1</CreateCListing> + <CreateAListing>1</CreateAListing> + <CreateLListing>1</CreateLListing> + <CreateIListing>0</CreateIListing> + <AsmCond>1</AsmCond> + <AsmSymb>1</AsmSymb> + <AsmXref>0</AsmXref> + <CCond>1</CCond> + <CCode>0</CCode> + <CListInc>0</CListInc> + <CSymb>0</CSymb> + <LinkerCodeListing>0</LinkerCodeListing> + </ListingPage> + <OPTXL> + <LMap>1</LMap> + <LComments>1</LComments> + <LGenerateSymbols>1</LGenerateSymbols> + <LLibSym>1</LLibSym> + <LLines>1</LLines> + <LLocSym>1</LLocSym> + <LPubSym>1</LPubSym> + <LXref>0</LXref> + <LExpSel>0</LExpSel> + </OPTXL> + <OPTFL> + <tvExp>1</tvExp> + <tvExpOptDlg>0</tvExpOptDlg> + <IsCurrentTarget>1</IsCurrentTarget> + </OPTFL> + <CpuCode>255</CpuCode> + <DllOpt> + <SimDllName>SARMCM3.DLL</SimDllName> + <SimDllArguments></SimDllArguments> + <SimDlgDllName>DARMCM1.DLL</SimDlgDllName> + <SimDlgDllArguments></SimDlgDllArguments> + <TargetDllName>SARMCM3.DLL</TargetDllName> + <TargetDllArguments></TargetDllArguments> + <TargetDlgDllName>TARMCM1.DLL</TargetDlgDllName> + <TargetDlgDllArguments></TargetDlgDllArguments> + </DllOpt> + <DebugOpt> + <uSim>1</uSim> + <uTrg>0</uTrg> + <sLdApp>1</sLdApp> + <sGomain>1</sGomain> + <sRbreak>1</sRbreak> + <sRwatch>1</sRwatch> + <sRmem>1</sRmem> + <sRfunc>1</sRfunc> + <sRbox>1</sRbox> + <tLdApp>1</tLdApp> + <tGomain>0</tGomain> + <tRbreak>1</tRbreak> + <tRwatch>1</tRwatch> + <tRmem>1</tRmem> + <tRfunc>0</tRfunc> + <tRbox>1</tRbox> + <sRunDeb>0</sRunDeb> + <sLrtime>0</sLrtime> + <nTsel>-1</nTsel> + <sDll></sDll> + <sDllPa></sDllPa> + <sDlgDll></sDlgDll> + <sDlgPa></sDlgPa> + <sIfile></sIfile> + <tDll></tDll> + <tDllPa></tDllPa> + <tDlgDll></tDlgDll> + <tDlgPa></tDlgPa> + <tIfile></tIfile> + <pMon></pMon> + </DebugOpt> + <Breakpoint/> + <DebugFlag> + <trace>0</trace> + <periodic>1</periodic> + <aLwin>0</aLwin> + <aCover>0</aCover> + <aSer1>0</aSer1> + <aSer2>0</aSer2> + <aPa>0</aPa> + <viewmode>0</viewmode> + <vrSel>0</vrSel> + <aSym>0</aSym> + <aTbox>0</aTbox> + <AscS1>0</AscS1> + <AscS2>0</AscS2> + <AscS3>0</AscS3> + <aSer3>0</aSer3> + <eProf>0</eProf> + <aLa>0</aLa> + <aPa1>0</aPa1> + <AscS4>0</AscS4> + <aSer4>0</aSer4> + <StkLoc>0</StkLoc> + <TrcWin>0</TrcWin> + <newCpu>0</newCpu> + <uProt>0</uProt> + </DebugFlag> + <LintExecutable></LintExecutable> + <LintConfigFile></LintConfigFile> + </TargetOption> + </Target> + + <Group> + <GroupName>Startup</GroupName> + <tvExp>1</tvExp> + <tvExpOptDlg>0</tvExpOptDlg> + <cbSel>0</cbSel> + <File> + <GroupNumber>1</GroupNumber> + <FileNumber>1</FileNumber> + <FileType>2</FileType> + <tvExp>0</tvExp> + <Focus>0</Focus> + <ColumnNumber>0</ColumnNumber> + <tvExpOptDlg>0</tvExpOptDlg> + <TopLine>0</TopLine> + <CurrentLine>0</CurrentLine> + <bDave2>0</bDave2> + <PathWithFileName>..\cmsis\Device\ARM\CMSDK_CM0PLUS\Source\ARM\startup_CMSDK_CM0PLUS.s</PathWithFileName> + <FilenameWithoutPath>startup_CMSDK_CM0PLUS.s</FilenameWithoutPath> + </File> + </Group> + + <Group> + <GroupName>Application</GroupName> + <tvExp>0</tvExp> + <tvExpOptDlg>0</tvExpOptDlg> + <cbSel>0</cbSel> + <File> + <GroupNumber>2</GroupNumber> + <FileNumber>2</FileNumber> + <FileType>1</FileType> + <tvExp>1</tvExp> + <Focus>0</Focus> + <ColumnNumber>24</ColumnNumber> + <tvExpOptDlg>0</tvExpOptDlg> + <TopLine>24</TopLine> + <CurrentLine>25</CurrentLine> + <bDave2>0</bDave2> + <PathWithFileName>.\debugtester.c</PathWithFileName> + <FilenameWithoutPath>debugtester.c</FilenameWithoutPath> + </File> + </Group> + + <Group> + <GroupName>System</GroupName> + <tvExp>1</tvExp> + <tvExpOptDlg>0</tvExpOptDlg> + <cbSel>0</cbSel> + <File> + <GroupNumber>3</GroupNumber> + <FileNumber>3</FileNumber> + <FileType>1</FileType> + <tvExp>0</tvExp> + <Focus>0</Focus> + <ColumnNumber>0</ColumnNumber> + <tvExpOptDlg>0</tvExpOptDlg> + <TopLine>0</TopLine> + <CurrentLine>0</CurrentLine> + <bDave2>0</bDave2> + <PathWithFileName>.\system_cmsdk_debugtester.c</PathWithFileName> + <FilenameWithoutPath>system_cmsdk_debugtester.c</FilenameWithoutPath> + </File> + <File> + <GroupNumber>3</GroupNumber> + <FileNumber>4</FileNumber> + <FileType>1</FileType> + <tvExp>0</tvExp> + <Focus>0</Focus> + <ColumnNumber>0</ColumnNumber> + <tvExpOptDlg>0</tvExpOptDlg> + <TopLine>0</TopLine> + <CurrentLine>0</CurrentLine> + <bDave2>0</bDave2> + <PathWithFileName>.\retarget_cmsdk_debugtester.c</PathWithFileName> + <FilenameWithoutPath>retarget_cmsdk_debugtester.c</FilenameWithoutPath> + </File> + </Group> + +</ProjectOpt> diff --git a/Cortex-M0/nanosoc/software/debug_tester/debugtester_cm0plus_le.uvproj b/Cortex-M0/nanosoc/software/debug_tester/debugtester_cm0plus_le.uvproj new file mode 100644 index 0000000..0fe273b --- /dev/null +++ b/Cortex-M0/nanosoc/software/debug_tester/debugtester_cm0plus_le.uvproj @@ -0,0 +1,427 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no" ?> +<Project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="project_proj.xsd"> + + <SchemaVersion>1.1</SchemaVersion> + + <Header>### uVision Project, (C) Keil Software</Header> + + <Targets> + <Target> + <TargetName>Debug</TargetName> + <ToolsetNumber>0x4</ToolsetNumber> + <ToolsetName>ARM-ADS</ToolsetName> + <TargetOption> + <TargetCommonOption> + <Device>Cortex-M0+</Device> + <Vendor>ARM</Vendor> + <Cpu>CLOCK(12000000) CPUTYPE("Cortex-M0+") ESEL ELITTLE</Cpu> + <FlashUtilSpec></FlashUtilSpec> + <StartupFile></StartupFile> + <FlashDriverDll></FlashDriverDll> + <DeviceId>6268</DeviceId> + <RegisterFile></RegisterFile> + <MemoryEnv></MemoryEnv> + <Cmp></Cmp> + <Asm></Asm> + <Linker></Linker> + <OHString></OHString> + <InfinionOptionDll></InfinionOptionDll> + <SLE66CMisc></SLE66CMisc> + <SLE66AMisc></SLE66AMisc> + <SLE66LinkerMisc></SLE66LinkerMisc> + <SFDFile></SFDFile> + <UseEnv>0</UseEnv> + <BinPath></BinPath> + <IncludePath></IncludePath> + <LibPath></LibPath> + <RegisterFilePath></RegisterFilePath> + <DBRegisterFilePath></DBRegisterFilePath> + <TargetStatus> + <Error>0</Error> + <ExitCodeStop>0</ExitCodeStop> + <ButtonStop>0</ButtonStop> + <NotGenerated>0</NotGenerated> + <InvalidFlash>1</InvalidFlash> + </TargetStatus> + <OutputDirectory>.\</OutputDirectory> + <OutputName>debugtester_le</OutputName> + <CreateExecutable>1</CreateExecutable> + <CreateLib>0</CreateLib> + <CreateHexFile>0</CreateHexFile> + <DebugInformation>1</DebugInformation> + <BrowseInformation>1</BrowseInformation> + <ListingPath>.\</ListingPath> + <HexFormatSelection>1</HexFormatSelection> + <Merge32K>0</Merge32K> + <CreateBatchFile>0</CreateBatchFile> + <BeforeCompile> + <RunUserProg1>0</RunUserProg1> + <RunUserProg2>0</RunUserProg2> + <UserProg1Name></UserProg1Name> + <UserProg2Name></UserProg2Name> + <UserProg1Dos16Mode>0</UserProg1Dos16Mode> + <UserProg2Dos16Mode>0</UserProg2Dos16Mode> + <nStopU1X>0</nStopU1X> + <nStopU2X>0</nStopU2X> + </BeforeCompile> + <BeforeMake> + <RunUserProg1>0</RunUserProg1> + <RunUserProg2>0</RunUserProg2> + <UserProg1Name></UserProg1Name> + <UserProg2Name></UserProg2Name> + <UserProg1Dos16Mode>0</UserProg1Dos16Mode> + <UserProg2Dos16Mode>0</UserProg2Dos16Mode> + </BeforeMake> + <AfterMake> + <RunUserProg1>1</RunUserProg1> + <RunUserProg2>0</RunUserProg2> + <UserProg1Name>$K\ARM\ARMCC\BIN\fromelf.exe #L --vhx --8x1 --output debugtester_le.hex</UserProg1Name> + <UserProg2Name></UserProg2Name> + <UserProg1Dos16Mode>0</UserProg1Dos16Mode> + <UserProg2Dos16Mode>0</UserProg2Dos16Mode> + </AfterMake> + <SelectedForBatchBuild>0</SelectedForBatchBuild> + <SVCSIdString></SVCSIdString> + </TargetCommonOption> + <CommonProperty> + <UseCPPCompiler>0</UseCPPCompiler> + <RVCTCodeConst>0</RVCTCodeConst> + <RVCTZI>0</RVCTZI> + <RVCTOtherData>0</RVCTOtherData> + <ModuleSelection>0</ModuleSelection> + <IncludeInBuild>1</IncludeInBuild> + <AlwaysBuild>0</AlwaysBuild> + <GenerateAssemblyFile>0</GenerateAssemblyFile> + <AssembleAssemblyFile>0</AssembleAssemblyFile> + <PublicsOnly>0</PublicsOnly> + <StopOnExitCode>3</StopOnExitCode> + <CustomArgument></CustomArgument> + <IncludeLibraryModules></IncludeLibraryModules> + </CommonProperty> + <DllOption> + <SimDllName>SARMCM3.DLL</SimDllName> + <SimDllArguments></SimDllArguments> + <SimDlgDll>DARMCM1.DLL</SimDlgDll> + <SimDlgDllArguments></SimDlgDllArguments> + <TargetDllName>SARMCM3.DLL</TargetDllName> + <TargetDllArguments></TargetDllArguments> + <TargetDlgDll>TARMCM1.DLL</TargetDlgDll> + <TargetDlgDllArguments></TargetDlgDllArguments> + </DllOption> + <DebugOption> + <OPTHX> + <HexSelection>1</HexSelection> + <HexRangeLowAddress>0</HexRangeLowAddress> + <HexRangeHighAddress>0</HexRangeHighAddress> + <HexOffset>0</HexOffset> + <Oh166RecLen>16</Oh166RecLen> + </OPTHX> + <Simulator> + <UseSimulator>1</UseSimulator> + <LoadApplicationAtStartup>1</LoadApplicationAtStartup> + <RunToMain>1</RunToMain> + <RestoreBreakpoints>1</RestoreBreakpoints> + <RestoreWatchpoints>1</RestoreWatchpoints> + <RestoreMemoryDisplay>1</RestoreMemoryDisplay> + <RestoreFunctions>1</RestoreFunctions> + <RestoreToolbox>1</RestoreToolbox> + <LimitSpeedToRealTime>0</LimitSpeedToRealTime> + </Simulator> + <Target> + <UseTarget>0</UseTarget> + <LoadApplicationAtStartup>1</LoadApplicationAtStartup> + <RunToMain>0</RunToMain> + <RestoreBreakpoints>1</RestoreBreakpoints> + <RestoreWatchpoints>1</RestoreWatchpoints> + <RestoreMemoryDisplay>1</RestoreMemoryDisplay> + <RestoreFunctions>0</RestoreFunctions> + <RestoreToolbox>1</RestoreToolbox> + </Target> + <RunDebugAfterBuild>0</RunDebugAfterBuild> + <TargetSelection>-1</TargetSelection> + <SimDlls> + <CpuDll></CpuDll> + <CpuDllArguments></CpuDllArguments> + <PeripheralDll></PeripheralDll> + <PeripheralDllArguments></PeripheralDllArguments> + <InitializationFile></InitializationFile> + </SimDlls> + <TargetDlls> + <CpuDll></CpuDll> + <CpuDllArguments></CpuDllArguments> + <PeripheralDll></PeripheralDll> + <PeripheralDllArguments></PeripheralDllArguments> + <InitializationFile></InitializationFile> + <Driver></Driver> + </TargetDlls> + </DebugOption> + <Utilities> + <Flash1> + <UseTargetDll>0</UseTargetDll> + <UseExternalTool>0</UseExternalTool> + <RunIndependent>0</RunIndependent> + <UpdateFlashBeforeDebugging>0</UpdateFlashBeforeDebugging> + <Capability>0</Capability> + <DriverSelection>-1</DriverSelection> + </Flash1> + <Flash2></Flash2> + <Flash3></Flash3> + <Flash4></Flash4> + </Utilities> + <TargetArmAds> + <ArmAdsMisc> + <GenerateListings>0</GenerateListings> + <asHll>1</asHll> + <asAsm>1</asAsm> + <asMacX>1</asMacX> + <asSyms>1</asSyms> + <asFals>1</asFals> + <asDbgD>1</asDbgD> + <asForm>1</asForm> + <ldLst>0</ldLst> + <ldmm>1</ldmm> + <ldXref>1</ldXref> + <BigEnd>0</BigEnd> + <AdsALst>1</AdsALst> + <AdsACrf>1</AdsACrf> + <AdsANop>0</AdsANop> + <AdsANot>0</AdsANot> + <AdsLLst>1</AdsLLst> + <AdsLmap>1</AdsLmap> + <AdsLcgr>1</AdsLcgr> + <AdsLsym>1</AdsLsym> + <AdsLszi>1</AdsLszi> + <AdsLtoi>1</AdsLtoi> + <AdsLsun>1</AdsLsun> + <AdsLven>1</AdsLven> + <AdsLsxf>1</AdsLsxf> + <RvctClst>0</RvctClst> + <GenPPlst>0</GenPPlst> + <AdsCpuType>"Cortex-M0+"</AdsCpuType> + <RvctDeviceName></RvctDeviceName> + <mOS>0</mOS> + <uocRom>0</uocRom> + <uocRam>0</uocRam> + <hadIROM>0</hadIROM> + <hadIRAM>0</hadIRAM> + <hadXRAM>0</hadXRAM> + <uocXRam>0</uocXRam> + <RvdsVP>0</RvdsVP> + <hadIRAM2>0</hadIRAM2> + <hadIROM2>0</hadIROM2> + <StupSel>1</StupSel> + <useUlib>0</useUlib> + <EndSel>1</EndSel> + <uLtcg>0</uLtcg> + <RoSelD>0</RoSelD> + <RwSelD>5</RwSelD> + <CodeSel>0</CodeSel> + <OptFeed>0</OptFeed> + <NoZi1>0</NoZi1> + <NoZi2>0</NoZi2> + <NoZi3>0</NoZi3> + <NoZi4>0</NoZi4> + <NoZi5>0</NoZi5> + <Ro1Chk>1</Ro1Chk> + <Ro2Chk>0</Ro2Chk> + <Ro3Chk>0</Ro3Chk> + <Ir1Chk>0</Ir1Chk> + <Ir2Chk>0</Ir2Chk> + <Ra1Chk>1</Ra1Chk> + <Ra2Chk>0</Ra2Chk> + <Ra3Chk>0</Ra3Chk> + <Im1Chk>0</Im1Chk> + <Im2Chk>0</Im2Chk> + <OnChipMemories> + <Ocm1> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </Ocm1> + <Ocm2> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </Ocm2> + <Ocm3> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </Ocm3> + <Ocm4> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </Ocm4> + <Ocm5> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </Ocm5> + <Ocm6> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </Ocm6> + <IRAM> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </IRAM> + <IROM> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </IROM> + <XRAM> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </XRAM> + <OCR_RVCT1> + <Type>1</Type> + <StartAddress>0x0</StartAddress> + <Size>0x10000</Size> + </OCR_RVCT1> + <OCR_RVCT2> + <Type>1</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </OCR_RVCT2> + <OCR_RVCT3> + <Type>1</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </OCR_RVCT3> + <OCR_RVCT4> + <Type>1</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </OCR_RVCT4> + <OCR_RVCT5> + <Type>1</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </OCR_RVCT5> + <OCR_RVCT6> + <Type>0</Type> + <StartAddress>0x20000000</StartAddress> + <Size>0x4000</Size> + </OCR_RVCT6> + <OCR_RVCT7> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </OCR_RVCT7> + <OCR_RVCT8> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </OCR_RVCT8> + <OCR_RVCT9> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </OCR_RVCT9> + <OCR_RVCT10> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </OCR_RVCT10> + </OnChipMemories> + <RvctStartVector></RvctStartVector> + </ArmAdsMisc> + <Cads> + <interw>1</interw> + <Optim>3</Optim> + <oTime>0</oTime> + <SplitLS>0</SplitLS> + <OneElfS>0</OneElfS> + <Strict>0</Strict> + <EnumInt>0</EnumInt> + <PlainCh>0</PlainCh> + <Ropi>0</Ropi> + <Rwpi>0</Rwpi> + <wLevel>0</wLevel> + <uThumb>0</uThumb> + <VariousControls> + <MiscControls></MiscControls> + <Define>CORTEX_M0PLUS</Define> + <Undefine></Undefine> + <IncludePath>..\cmsis\CMSIS\Include; ..\cmsis\Device\ARM\CMSDK_CM0\Include</IncludePath> + </VariousControls> + </Cads> + <Aads> + <interw>1</interw> + <Ropi>0</Ropi> + <Rwpi>0</Rwpi> + <thumb>0</thumb> + <SplitLS>0</SplitLS> + <SwStkChk>0</SwStkChk> + <NoWarn>0</NoWarn> + <VariousControls> + <MiscControls></MiscControls> + <Define></Define> + <Undefine></Undefine> + <IncludePath></IncludePath> + </VariousControls> + </Aads> + <LDads> + <umfTarg>0</umfTarg> + <Ropi>0</Ropi> + <Rwpi>0</Rwpi> + <noStLib>0</noStLib> + <RepFail>1</RepFail> + <useFile>0</useFile> + <TextAddressRange>0x00000000</TextAddressRange> + <DataAddressRange>0x00000000</DataAddressRange> + <ScatterFile>debugtester_cm0plus.sct</ScatterFile> + <IncludeLibs></IncludeLibs> + <IncludeLibsPath></IncludeLibsPath> + <Misc></Misc> + <LinkerInputFile></LinkerInputFile> + <DisabledWarnings></DisabledWarnings> + </LDads> + </TargetArmAds> + </TargetOption> + <Groups> + <Group> + <GroupName>Startup</GroupName> + <Files> + <File> + <FileName>startup_CMSDK_CM0PLUS.s</FileName> + <FileType>2</FileType> + <FilePath>..\cmsis\Device\ARM\CMSDK_CM0PLUS\Source\ARM\startup_CMSDK_CM0PLUS.s</FilePath> + </File> + </Files> + </Group> + <Group> + <GroupName>Application</GroupName> + <Files> + <File> + <FileName>debugtester.c</FileName> + <FileType>1</FileType> + <FilePath>.\debugtester.c</FilePath> + </File> + </Files> + </Group> + <Group> + <GroupName>System</GroupName> + <Files> + <File> + <FileName>system_cmsdk_debugtester.c</FileName> + <FileType>1</FileType> + <FilePath>.\system_cmsdk_debugtester.c</FilePath> + </File> + <File> + <FileName>retarget_cmsdk_debugtester.c</FileName> + <FileType>1</FileType> + <FilePath>.\retarget_cmsdk_debugtester.c</FilePath> + </File> + </Files> + </Group> + </Groups> + </Target> + </Targets> + +</Project> diff --git a/Cortex-M0/nanosoc/software/debug_tester/debugtester_functions.h b/Cortex-M0/nanosoc/software/debug_tester/debugtester_functions.h new file mode 100644 index 0000000..3aa1dfd --- /dev/null +++ b/Cortex-M0/nanosoc/software/debug_tester/debugtester_functions.h @@ -0,0 +1,52 @@ +/* + *----------------------------------------------------------------------------- + * The confidential and proprietary information contained in this file may + * only be used by a person authorised under and to the extent permitted + * by a subsisting licensing agreement from Arm Limited or its affiliates. + * + * (C) COPYRIGHT 2010-2013 Arm Limited or its affiliates. + * ALL RIGHTS RESERVED + * + * This entire notice must be reproduced on all copies of this file + * and copies of this file may only be made by a person if such person is + * permitted to do so under the terms of a subsisting license agreement + * from Arm Limited or its affiliates. + * + * SVN Information + * + * Checked In : $Date: 2012-05-31 12:12:02 +0100 (Thu, 31 May 2012) $ + * + * Revision : $Revision: 210765 $ + * + * Release Information : Cortex-M System Design Kit-r1p1-00rel0 + *----------------------------------------------------------------------------- + */ + +//////////////////////////////////////////////////////////////////////////////// +// +// CMSDK Debug Tester Functions header file +// +//////////////////////////////////////////////////////////////////////////////// + +//////////////////////////////////////////////////////////////////////////////// +// +// Function enumeration to allow access to debug tester functions +// + +enum Function { FnSetInterfaceJTAG, + FnSetInterfaceSW, + FnDAPPowerUp, + FnDAPPowerDown, + FnGetTAPID, + FnGetDPReg, + FnGetAPReg, + FnGetAPMem, + FnSetAPMem, + FnGetAPMemCSIDs, + FnConnectWakeUnhalt, + FnConnectCheckUnlockup, + FnEnableHaltingDebug, + FnDAPAccess, + FnConfigTrace, + FnCheckTrace +}; diff --git a/Cortex-M0/nanosoc/software/debug_tester/retarget_cmsdk_debugtester.c b/Cortex-M0/nanosoc/software/debug_tester/retarget_cmsdk_debugtester.c new file mode 100644 index 0000000..b2d677d --- /dev/null +++ b/Cortex-M0/nanosoc/software/debug_tester/retarget_cmsdk_debugtester.c @@ -0,0 +1,97 @@ +/* + *----------------------------------------------------------------------------- + * The confidential and proprietary information contained in this file may + * only be used by a person authorised under and to the extent permitted + * by a subsisting licensing agreement from Arm Limited or its affiliates. + * + * (C) COPYRIGHT 2010-2013 Arm Limited or its affiliates. + * ALL RIGHTS RESERVED + * + * This entire notice must be reproduced on all copies of this file + * and copies of this file may only be made by a person if such person is + * permitted to do so under the terms of a subsisting license agreement + * from Arm Limited or its affiliates. + * + * SVN Information + * + * Checked In : $Date: 2017-10-10 15:55:38 +0100 (Tue, 10 Oct 2017) $ + * + * Revision : $Revision: 371321 $ + * + * Release Information : Cortex-M System Design Kit-r1p1-00rel0 + *----------------------------------------------------------------------------- + */ + +// +// printf retargetting functions for Debug Tester +// + +#include "cmsdk_debugtester.h" + +// Routine to write a char - specific to Cortex-M Core debug tester +void debugtester_char_write(int ch) +{ + GPIO1->LB_MASKED[DD_PRINT_CHAR] = ch; // Write whole char to 2nd byte + GPIO1->LB_MASKED[DD_PRINT_STROBE] = DD_PRINT_STROBE; // Write strobe + GPIO1->LB_MASKED[DD_PRINT_STROBE] = 0; // Clear Strobe +} + + +#if defined ( __CC_ARM ) +/******************************************************************************/ +/* Retarget functions for ARM DS-5 Professional / Keil MDK */ +/******************************************************************************/ + +#include <stdio.h> +#include <time.h> +#include <rt_misc.h> +#pragma import(__use_no_semihosting_swi) + +struct __FILE { int handle; /* Add whatever you need here */ }; +FILE __stdout; +FILE __stdin; + + +int fputc(int ch, FILE *f) { + debugtester_char_write(ch); + return 0; +} + +int fgetc(FILE *f) { + return 0; +} + +int ferror(FILE *f) { + /* Your implementation of ferror */ + return EOF; +} + + +void _ttywrch(int ch) { + debugtester_char_write(ch); +} + + +void _sys_exit(int return_code) { +label: goto label; /* endless loop */ +} + +#else + +/******************************************************************************/ +/* Retarget functions for GNU Tools for ARM Embedded Processors */ +/******************************************************************************/ +#include <stdio.h> +#include <sys/stat.h> + +__attribute__ ((used)) int _write (int fd, char *ptr, int len) +{ + size_t i; + for (i=0; i<len;i++) { + debugtester_char_write(ptr[i]); // call character output function + } + return len; +} + + +#endif diff --git a/Cortex-M0/nanosoc/software/debug_tester/system_cmsdk_debugtester.c b/Cortex-M0/nanosoc/software/debug_tester/system_cmsdk_debugtester.c new file mode 100644 index 0000000..5a33bfa --- /dev/null +++ b/Cortex-M0/nanosoc/software/debug_tester/system_cmsdk_debugtester.c @@ -0,0 +1,61 @@ +/* + *----------------------------------------------------------------------------- + * The confidential and proprietary information contained in this file may + * only be used by a person authorised under and to the extent permitted + * by a subsisting licensing agreement from Arm Limited or its affiliates. + * + * (C) COPYRIGHT 2010-2012 Arm Limited or its affiliates. + * ALL RIGHTS RESERVED + * + * This entire notice must be reproduced on all copies of this file + * and copies of this file may only be made by a person if such person is + * permitted to do so under the terms of a subsisting license agreement + * from Arm Limited or its affiliates. + * + * SVN Information + * + * Checked In : $Date: 2017-10-10 15:55:38 +0100 (Tue, 10 Oct 2017) $ + * + * Revision : $Revision: 371321 $ + * + * Release Information : Cortex-M System Design Kit-r1p1-00rel0 + *----------------------------------------------------------------------------- + */ + + //Correspond to the system_device.c file in the CMSIS standard + //provide a minimum requirement for the SystemInit function + + +#include <stdint.h> +#include "system_cmsdk_debugtester.h" + +/*---------------------------------------------------------------------------- + Define SYSCLK + *----------------------------------------------------------------------------*/ +#define __HSI (5000000UL) + +/*---------------------------------------------------------------------------- + Clock Definitions + *----------------------------------------------------------------------------*/ +uint32_t SystemFrequency = 50000000UL; /*!< System Clock Frequency (Core Clock) */ + + +/** + * Initialize the system + * + * @param none + * @return none + * + * @brief Setup the microcontroller system + * + */ +void SystemInit (void) +{ + // + // SystemInit + // + + // Empty function for example MCU, since there are no PLLs etc. + +} + diff --git a/Cortex-M0/nanosoc/software/debug_tester/system_cmsdk_debugtester.h b/Cortex-M0/nanosoc/software/debug_tester/system_cmsdk_debugtester.h new file mode 100644 index 0000000..ce0beb1 --- /dev/null +++ b/Cortex-M0/nanosoc/software/debug_tester/system_cmsdk_debugtester.h @@ -0,0 +1,41 @@ +/* + *----------------------------------------------------------------------------- + * The confidential and proprietary information contained in this file may + * only be used by a person authorised under and to the extent permitted + * by a subsisting licensing agreement from Arm Limited or its affiliates. + * + * (C) COPYRIGHT 2010-2013 Arm Limited or its affiliates. + * ALL RIGHTS RESERVED + * + * This entire notice must be reproduced on all copies of this file + * and copies of this file may only be made by a person if such person is + * permitted to do so under the terms of a subsisting license agreement + * from Arm Limited or its affiliates. + * + * SVN Information + * + * Checked In : $Date: 2017-10-10 15:55:38 +0100 (Tue, 10 Oct 2017) $ + * + * Revision : $Revision: 371321 $ + * + * Release Information : Cortex-M System Design Kit-r1p1-00rel0 + *----------------------------------------------------------------------------- + */ + +#ifndef __SYSTEM_CMSDK_DEBUGTESTER_H +#define __SYSTEM_CMSDK_DEBUGTESTER_H + +extern uint32_t SystemFrequency; /*!< System Clock Frequency (Core Clock) */ + + +/** + * Initialize the system + * + * @param none + * @return none + * + * @brief Setup the microcontroller system + * Initialise GPIO directions and values + */ +extern void SystemInit (void); +#endif diff --git a/Cortex-M0/nanosoc/systems/mcu/fpga_imp/build_fpga_pynq_z2.scr b/Cortex-M0/nanosoc/systems/mcu/fpga_imp/build_fpga_pynq_z2.scr new file mode 100755 index 0000000..781e2c3 --- /dev/null +++ b/Cortex-M0/nanosoc/systems/mcu/fpga_imp/build_fpga_pynq_z2.scr @@ -0,0 +1 @@ +vivado -mode tcl -source scripts/build_mcu_fpga_pynq_z2.tcl diff --git a/Cortex-M0/nanosoc/systems/mcu/fpga_imp/build_fpga_pynq_zcu104.scr b/Cortex-M0/nanosoc/systems/mcu/fpga_imp/build_fpga_pynq_zcu104.scr new file mode 100755 index 0000000..8d883a1 --- /dev/null +++ b/Cortex-M0/nanosoc/systems/mcu/fpga_imp/build_fpga_pynq_zcu104.scr @@ -0,0 +1 @@ +vivado -mode batch -source scripts/build_mcu_fpga_pynq_zcu104.tcl diff --git a/Cortex-M0/nanosoc/systems/mcu/fpga_imp/clean_fpga.scr b/Cortex-M0/nanosoc/systems/mcu/fpga_imp/clean_fpga.scr new file mode 100755 index 0000000..cf4b0fa --- /dev/null +++ b/Cortex-M0/nanosoc/systems/mcu/fpga_imp/clean_fpga.scr @@ -0,0 +1,8 @@ +rm -f ./pynq_export/pz2/pynq/overlays/soclabs/* +rm -f ./pynq_export/pz104/pynq/overlays/soclabs/* +rm -Rf ./project_pynq_z2 +rm -Rf ./project_pynq_zcu104 +rm -Rf ./vivado* +rm -Rf ./.gen +rm -Rf ./.srcs +rm -Rf ./.Xil diff --git a/Cortex-M0/nanosoc/systems/mcu/fpga_imp/ip_repo/axi_stream_io_1.0/bd/bd.tcl b/Cortex-M0/nanosoc/systems/mcu/fpga_imp/ip_repo/axi_stream_io_1.0/bd/bd.tcl new file mode 100755 index 0000000..690e4e1 --- /dev/null +++ b/Cortex-M0/nanosoc/systems/mcu/fpga_imp/ip_repo/axi_stream_io_1.0/bd/bd.tcl @@ -0,0 +1,86 @@ + +proc init { cellpath otherInfo } { + + set cell_handle [get_bd_cells $cellpath] + set all_busif [get_bd_intf_pins $cellpath/*] + set axi_standard_param_list [list ID_WIDTH AWUSER_WIDTH ARUSER_WIDTH WUSER_WIDTH RUSER_WIDTH BUSER_WIDTH] + set full_sbusif_list [list ] + + foreach busif $all_busif { + if { [string equal -nocase [get_property MODE $busif] "slave"] == 1 } { + set busif_param_list [list] + set busif_name [get_property NAME $busif] + if { [lsearch -exact -nocase $full_sbusif_list $busif_name ] == -1 } { + continue + } + foreach tparam $axi_standard_param_list { + lappend busif_param_list "C_${busif_name}_${tparam}" + } + bd::mark_propagate_only $cell_handle $busif_param_list + } + } +} + + +proc pre_propagate {cellpath otherInfo } { + + set cell_handle [get_bd_cells $cellpath] + set all_busif [get_bd_intf_pins $cellpath/*] + set axi_standard_param_list [list ID_WIDTH AWUSER_WIDTH ARUSER_WIDTH WUSER_WIDTH RUSER_WIDTH BUSER_WIDTH] + + foreach busif $all_busif { + if { [string equal -nocase [get_property CONFIG.PROTOCOL $busif] "AXI4"] != 1 } { + continue + } + if { [string equal -nocase [get_property MODE $busif] "master"] != 1 } { + continue + } + + set busif_name [get_property NAME $busif] + foreach tparam $axi_standard_param_list { + set busif_param_name "C_${busif_name}_${tparam}" + + set val_on_cell_intf_pin [get_property CONFIG.${tparam} $busif] + set val_on_cell [get_property CONFIG.${busif_param_name} $cell_handle] + + if { [string equal -nocase $val_on_cell_intf_pin $val_on_cell] != 1 } { + if { $val_on_cell != "" } { + set_property CONFIG.${tparam} $val_on_cell $busif + } + } + } + } +} + + +proc propagate {cellpath otherInfo } { + + set cell_handle [get_bd_cells $cellpath] + set all_busif [get_bd_intf_pins $cellpath/*] + set axi_standard_param_list [list ID_WIDTH AWUSER_WIDTH ARUSER_WIDTH WUSER_WIDTH RUSER_WIDTH BUSER_WIDTH] + + foreach busif $all_busif { + if { [string equal -nocase [get_property CONFIG.PROTOCOL $busif] "AXI4"] != 1 } { + continue + } + if { [string equal -nocase [get_property MODE $busif] "slave"] != 1 } { + continue + } + + set busif_name [get_property NAME $busif] + foreach tparam $axi_standard_param_list { + set busif_param_name "C_${busif_name}_${tparam}" + + set val_on_cell_intf_pin [get_property CONFIG.${tparam} $busif] + set val_on_cell [get_property CONFIG.${busif_param_name} $cell_handle] + + if { [string equal -nocase $val_on_cell_intf_pin $val_on_cell] != 1 } { + #override property of bd_interface_net to bd_cell -- only for slaves. May check for supported values.. + if { $val_on_cell_intf_pin != "" } { + set_property CONFIG.${busif_param_name} $val_on_cell_intf_pin $cell_handle + } + } + } + } +} + diff --git a/Cortex-M0/nanosoc/systems/mcu/fpga_imp/ip_repo/axi_stream_io_1.0/component.xml b/Cortex-M0/nanosoc/systems/mcu/fpga_imp/ip_repo/axi_stream_io_1.0/component.xml new file mode 100755 index 0000000..afd116f --- /dev/null +++ b/Cortex-M0/nanosoc/systems/mcu/fpga_imp/ip_repo/axi_stream_io_1.0/component.xml @@ -0,0 +1,1456 @@ +<?xml version="1.0" encoding="UTF-8"?> +<spirit:component xmlns:xilinx="http://www.xilinx.com" xmlns:spirit="http://www.spiritconsortium.org/XMLSchema/SPIRIT/1685-2009" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> + <spirit:vendor>soclabs.org</spirit:vendor> + <spirit:library>user</spirit:library> + <spirit:name>axi_stream_io</spirit:name> + <spirit:version>1.0</spirit:version> + <spirit:busInterfaces> + <spirit:busInterface> + <spirit:name>S_AXI</spirit:name> + <spirit:busType spirit:vendor="xilinx.com" spirit:library="interface" spirit:name="aximm" spirit:version="1.0"/> + <spirit:abstractionType spirit:vendor="xilinx.com" spirit:library="interface" spirit:name="aximm_rtl" spirit:version="1.0"/> + <spirit:slave> + <spirit:memoryMapRef spirit:memoryMapRef="S_AXI"/> + </spirit:slave> + <spirit:portMaps> + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>BVALID</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>S_AXI_BVALID</spirit:name> + </spirit:physicalPort> + </spirit:portMap> + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>RREADY</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>S_AXI_RREADY</spirit:name> + </spirit:physicalPort> + </spirit:portMap> + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>BREADY</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>S_AXI_BREADY</spirit:name> + </spirit:physicalPort> + </spirit:portMap> + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>AWVALID</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>S_AXI_AWVALID</spirit:name> + </spirit:physicalPort> + </spirit:portMap> + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>AWREADY</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>S_AXI_AWREADY</spirit:name> + </spirit:physicalPort> + </spirit:portMap> + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>AWPROT</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>S_AXI_AWPROT</spirit:name> + </spirit:physicalPort> + </spirit:portMap> + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>WDATA</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>S_AXI_WDATA</spirit:name> + </spirit:physicalPort> + </spirit:portMap> + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>RRESP</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>S_AXI_RRESP</spirit:name> + </spirit:physicalPort> + </spirit:portMap> + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>ARPROT</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>S_AXI_ARPROT</spirit:name> + </spirit:physicalPort> + </spirit:portMap> + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>RVALID</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>S_AXI_RVALID</spirit:name> + </spirit:physicalPort> + </spirit:portMap> + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>ARADDR</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>S_AXI_ARADDR</spirit:name> + </spirit:physicalPort> + </spirit:portMap> + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>AWADDR</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>S_AXI_AWADDR</spirit:name> + </spirit:physicalPort> + </spirit:portMap> + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>ARREADY</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>S_AXI_ARREADY</spirit:name> + </spirit:physicalPort> + </spirit:portMap> + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>WVALID</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>S_AXI_WVALID</spirit:name> + </spirit:physicalPort> + </spirit:portMap> + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>WREADY</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>S_AXI_WREADY</spirit:name> + </spirit:physicalPort> + </spirit:portMap> + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>ARVALID</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>S_AXI_ARVALID</spirit:name> + </spirit:physicalPort> + </spirit:portMap> + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>WSTRB</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>S_AXI_WSTRB</spirit:name> + </spirit:physicalPort> + </spirit:portMap> + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>BRESP</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>S_AXI_BRESP</spirit:name> + </spirit:physicalPort> + </spirit:portMap> + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>RDATA</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>S_AXI_RDATA</spirit:name> + </spirit:physicalPort> + </spirit:portMap> + </spirit:portMaps> + <spirit:parameters> + <spirit:parameter> + <spirit:name>WIZ_DATA_WIDTH</spirit:name> + <spirit:value spirit:format="long" spirit:id="BUSIFPARAM_VALUE.S_AXI.WIZ_DATA_WIDTH" spirit:choiceRef="choice_list_6fc15197">32</spirit:value> + </spirit:parameter> + <spirit:parameter> + <spirit:name>WIZ_NUM_REG</spirit:name> + <spirit:value spirit:format="long" spirit:id="BUSIFPARAM_VALUE.S_AXI.WIZ_NUM_REG" spirit:minimum="4" spirit:maximum="512" spirit:rangeType="long">4</spirit:value> + </spirit:parameter> + <spirit:parameter> + <spirit:name>SUPPORTS_NARROW_BURST</spirit:name> + <spirit:value spirit:format="long" spirit:id="BUSIFPARAM_VALUE.S_AXI.SUPPORTS_NARROW_BURST" spirit:choiceRef="choice_pairs_ce1226b1">0</spirit:value> + </spirit:parameter> + </spirit:parameters> + </spirit:busInterface> + <spirit:busInterface> + <spirit:name>rx</spirit:name> + <spirit:busType spirit:vendor="xilinx.com" spirit:library="interface" spirit:name="axis" spirit:version="1.0"/> + <spirit:abstractionType spirit:vendor="xilinx.com" spirit:library="interface" spirit:name="axis_rtl" spirit:version="1.0"/> + <spirit:slave/> + <spirit:portMaps> + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>TDATA</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>rx_tdata</spirit:name> + </spirit:physicalPort> + </spirit:portMap> + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>TVALID</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>rx_tvalid</spirit:name> + </spirit:physicalPort> + </spirit:portMap> + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>TREADY</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>rx_tready</spirit:name> + </spirit:physicalPort> + </spirit:portMap> + </spirit:portMaps> + <spirit:parameters> + <spirit:parameter> + <spirit:name>WIZ_DATA_WIDTH</spirit:name> + <spirit:value spirit:format="long" spirit:id="BUSIFPARAM_VALUE.RX.WIZ_DATA_WIDTH" spirit:choiceRef="choice_list_6fc15197">32</spirit:value> + </spirit:parameter> + </spirit:parameters> + </spirit:busInterface> + <spirit:busInterface> + <spirit:name>tx</spirit:name> + <spirit:busType spirit:vendor="xilinx.com" spirit:library="interface" spirit:name="axis" spirit:version="1.0"/> + <spirit:abstractionType spirit:vendor="xilinx.com" spirit:library="interface" spirit:name="axis_rtl" spirit:version="1.0"/> + <spirit:master/> + <spirit:portMaps> + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>TVALID</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>tx_tvalid</spirit:name> + </spirit:physicalPort> + </spirit:portMap> + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>TDATA</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>tx_tdata</spirit:name> + </spirit:physicalPort> + </spirit:portMap> + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>TREADY</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>tx_tready</spirit:name> + </spirit:physicalPort> + </spirit:portMap> + </spirit:portMaps> + <spirit:parameters> + <spirit:parameter> + <spirit:name>WIZ_DATA_WIDTH</spirit:name> + <spirit:value spirit:format="long" spirit:id="BUSIFPARAM_VALUE.TX.WIZ_DATA_WIDTH" spirit:choiceRef="choice_list_6fc15197">32</spirit:value> + </spirit:parameter> + </spirit:parameters> + </spirit:busInterface> + <spirit:busInterface> + <spirit:name>interrupt</spirit:name> + <spirit:busType spirit:vendor="xilinx.com" spirit:library="signal" spirit:name="interrupt" spirit:version="1.0"/> + <spirit:abstractionType spirit:vendor="xilinx.com" spirit:library="signal" spirit:name="interrupt_rtl" spirit:version="1.0"/> + <spirit:master/> + <spirit:portMaps> + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>INTERRUPT</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>interrupt</spirit:name> + </spirit:physicalPort> + </spirit:portMap> + </spirit:portMaps> + <spirit:parameters> + <spirit:parameter> + <spirit:name>SENSITIVITY</spirit:name> + <spirit:value spirit:id="BUSIFPARAM_VALUE.INTERRUPT.SENSITIVITY" spirit:choiceRef="choice_list_99a1d2b9">LEVEL_HIGH</spirit:value> + </spirit:parameter> + </spirit:parameters> + </spirit:busInterface> + <spirit:busInterface> + <spirit:name>S_AXI_ACLK</spirit:name> + <spirit:busType spirit:vendor="xilinx.com" spirit:library="signal" spirit:name="clock" spirit:version="1.0"/> + <spirit:abstractionType spirit:vendor="xilinx.com" spirit:library="signal" spirit:name="clock_rtl" spirit:version="1.0"/> + <spirit:slave/> + <spirit:portMaps> + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>CLK</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>S_AXI_ACLK</spirit:name> + </spirit:physicalPort> + </spirit:portMap> + </spirit:portMaps> + <spirit:parameters> + <spirit:parameter> + <spirit:name>ASSOCIATED_RESET</spirit:name> + <spirit:value spirit:id="BUSIFPARAM_VALUE.S_AXI_ACLK.ASSOCIATED_RESET">S_AXI_ARESETN</spirit:value> + </spirit:parameter> + <spirit:parameter> + <spirit:name>ASSOCIATED_BUSIF</spirit:name> + <spirit:value spirit:id="BUSIFPARAM_VALUE.S_AXI_ACLK.ASSOCIATED_BUSIF">rx:tx:S_AXI</spirit:value> + </spirit:parameter> + </spirit:parameters> + </spirit:busInterface> + <spirit:busInterface> + <spirit:name>S_AXI_ARESETN</spirit:name> + <spirit:busType spirit:vendor="xilinx.com" spirit:library="signal" spirit:name="reset" spirit:version="1.0"/> + <spirit:abstractionType spirit:vendor="xilinx.com" spirit:library="signal" spirit:name="reset_rtl" spirit:version="1.0"/> + <spirit:slave/> + <spirit:portMaps> + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>RST</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>S_AXI_ARESETN</spirit:name> + </spirit:physicalPort> + </spirit:portMap> + </spirit:portMaps> + <spirit:parameters> + <spirit:parameter> + <spirit:name>POLARITY</spirit:name> + <spirit:value spirit:id="BUSIFPARAM_VALUE.S_AXI_ARESETN.POLARITY" spirit:choiceRef="choice_list_9d8b0d81">ACTIVE_LOW</spirit:value> + </spirit:parameter> + </spirit:parameters> + </spirit:busInterface> + </spirit:busInterfaces> + <spirit:memoryMaps> + <spirit:memoryMap> + <spirit:name>S_AXI</spirit:name> + <spirit:addressBlock> + <spirit:name>Reg</spirit:name> + <spirit:baseAddress spirit:format="long">0</spirit:baseAddress> + <spirit:range spirit:format="long">4096</spirit:range> + <spirit:width spirit:format="long">0</spirit:width> + <spirit:register> + <spirit:name>RX_FIFO</spirit:name> + <spirit:displayName>RX FIFO</spirit:displayName> + <spirit:description>Data RX FIFO</spirit:description> + <spirit:addressOffset>0x00</spirit:addressOffset> + <spirit:size spirit:format="long">1</spirit:size> + </spirit:register> + <spirit:register> + <spirit:name>TX_FIFO</spirit:name> + <spirit:displayName>TX_FIFO</spirit:displayName> + <spirit:description>Data TX FIFO</spirit:description> + <spirit:addressOffset>0x04</spirit:addressOffset> + <spirit:size spirit:format="long">1</spirit:size> + </spirit:register> + <spirit:register> + <spirit:name>STAT_REG</spirit:name> + <spirit:displayName>STAT_REG</spirit:displayName> + <spirit:description>Status register</spirit:description> + <spirit:addressOffset>0x08</spirit:addressOffset> + <spirit:size spirit:format="long">1</spirit:size> + </spirit:register> + <spirit:register> + <spirit:name>CTRL_REG</spirit:name> + <spirit:displayName>CTRL_REG</spirit:displayName> + <spirit:description>Control register</spirit:description> + <spirit:addressOffset>0x0c</spirit:addressOffset> + <spirit:size spirit:format="long">1</spirit:size> + </spirit:register> + </spirit:addressBlock> + </spirit:memoryMap> + </spirit:memoryMaps> + <spirit:model> + <spirit:views> + <spirit:view> + <spirit:name>xilinx_verilogsynthesis</spirit:name> + <spirit:displayName>Verilog Synthesis</spirit:displayName> + <spirit:envIdentifier>verilogSource:vivado.xilinx.com:synthesis</spirit:envIdentifier> + <spirit:language>verilog</spirit:language> + <spirit:modelName>iostream_v1_0_axi</spirit:modelName> + <spirit:fileSetRef> + <spirit:localName>xilinx_verilogsynthesis_view_fileset</spirit:localName> + </spirit:fileSetRef> + <spirit:parameters> + <spirit:parameter> + <spirit:name>viewChecksum</spirit:name> + <spirit:value>fc7589fa</spirit:value> + </spirit:parameter> + </spirit:parameters> + </spirit:view> + <spirit:view> + <spirit:name>xilinx_verilogbehavioralsimulation</spirit:name> + <spirit:displayName>Verilog Simulation</spirit:displayName> + <spirit:envIdentifier>verilogSource:vivado.xilinx.com:simulation</spirit:envIdentifier> + <spirit:language>verilog</spirit:language> + <spirit:modelName>iostream_v1_0_axi</spirit:modelName> + <spirit:fileSetRef> + <spirit:localName>xilinx_verilogbehavioralsimulation_view_fileset</spirit:localName> + </spirit:fileSetRef> + <spirit:parameters> + <spirit:parameter> + <spirit:name>viewChecksum</spirit:name> + <spirit:value>fc7589fa</spirit:value> + </spirit:parameter> + </spirit:parameters> + </spirit:view> + <spirit:view> + <spirit:name>xilinx_softwaredriver</spirit:name> + <spirit:displayName>Software Driver</spirit:displayName> + <spirit:envIdentifier>:vivado.xilinx.com:sw.driver</spirit:envIdentifier> + <spirit:fileSetRef> + <spirit:localName>xilinx_softwaredriver_view_fileset</spirit:localName> + </spirit:fileSetRef> + <spirit:parameters> + <spirit:parameter> + <spirit:name>viewChecksum</spirit:name> + <spirit:value>ec44730d</spirit:value> + </spirit:parameter> + </spirit:parameters> + </spirit:view> + <spirit:view> + <spirit:name>xilinx_xpgui</spirit:name> + <spirit:displayName>UI Layout</spirit:displayName> + <spirit:envIdentifier>:vivado.xilinx.com:xgui.ui</spirit:envIdentifier> + <spirit:fileSetRef> + <spirit:localName>xilinx_xpgui_view_fileset</spirit:localName> + </spirit:fileSetRef> + <spirit:parameters> + <spirit:parameter> + <spirit:name>viewChecksum</spirit:name> + <spirit:value>1b3a39eb</spirit:value> + </spirit:parameter> + </spirit:parameters> + </spirit:view> + <spirit:view> + <spirit:name>bd_tcl</spirit:name> + <spirit:displayName>Block Diagram</spirit:displayName> + <spirit:envIdentifier>:vivado.xilinx.com:block.diagram</spirit:envIdentifier> + <spirit:fileSetRef> + <spirit:localName>bd_tcl_view_fileset</spirit:localName> + </spirit:fileSetRef> + <spirit:parameters> + <spirit:parameter> + <spirit:name>viewChecksum</spirit:name> + <spirit:value>16328387</spirit:value> + </spirit:parameter> + </spirit:parameters> + </spirit:view> + </spirit:views> + <spirit:ports> + <spirit:port> + <spirit:name>interrupt</spirit:name> + <spirit:wire> + <spirit:direction>out</spirit:direction> + <spirit:wireTypeDefs> + <spirit:wireTypeDef> + <spirit:typeName>wire</spirit:typeName> + <spirit:viewNameRef>xilinx_verilogsynthesis</spirit:viewNameRef> + <spirit:viewNameRef>xilinx_verilogbehavioralsimulation</spirit:viewNameRef> + </spirit:wireTypeDef> + </spirit:wireTypeDefs> + </spirit:wire> + </spirit:port> + <spirit:port> + <spirit:name>tx_tvalid</spirit:name> + <spirit:wire> + <spirit:direction>out</spirit:direction> + <spirit:wireTypeDefs> + <spirit:wireTypeDef> + <spirit:typeName>wire</spirit:typeName> + <spirit:viewNameRef>xilinx_verilogsynthesis</spirit:viewNameRef> + <spirit:viewNameRef>xilinx_verilogbehavioralsimulation</spirit:viewNameRef> + </spirit:wireTypeDef> + </spirit:wireTypeDefs> + </spirit:wire> + </spirit:port> + <spirit:port> + <spirit:name>tx_tdata</spirit:name> + <spirit:wire> + <spirit:direction>out</spirit:direction> + <spirit:vector> + <spirit:left spirit:format="long">7</spirit:left> + <spirit:right spirit:format="long">0</spirit:right> + </spirit:vector> + <spirit:wireTypeDefs> + <spirit:wireTypeDef> + <spirit:typeName>wire</spirit:typeName> + <spirit:viewNameRef>xilinx_verilogsynthesis</spirit:viewNameRef> + <spirit:viewNameRef>xilinx_verilogbehavioralsimulation</spirit:viewNameRef> + </spirit:wireTypeDef> + </spirit:wireTypeDefs> + </spirit:wire> + </spirit:port> + <spirit:port> + <spirit:name>tx_tready</spirit:name> + <spirit:wire> + <spirit:direction>in</spirit:direction> + <spirit:wireTypeDefs> + <spirit:wireTypeDef> + <spirit:typeName>wire</spirit:typeName> + <spirit:viewNameRef>xilinx_verilogsynthesis</spirit:viewNameRef> + <spirit:viewNameRef>xilinx_verilogbehavioralsimulation</spirit:viewNameRef> + </spirit:wireTypeDef> + </spirit:wireTypeDefs> + </spirit:wire> + </spirit:port> + <spirit:port> + <spirit:name>rx_tready</spirit:name> + <spirit:wire> + <spirit:direction>out</spirit:direction> + <spirit:wireTypeDefs> + <spirit:wireTypeDef> + <spirit:typeName>wire</spirit:typeName> + <spirit:viewNameRef>xilinx_verilogsynthesis</spirit:viewNameRef> + <spirit:viewNameRef>xilinx_verilogbehavioralsimulation</spirit:viewNameRef> + </spirit:wireTypeDef> + </spirit:wireTypeDefs> + </spirit:wire> + </spirit:port> + <spirit:port> + <spirit:name>rx_tdata</spirit:name> + <spirit:wire> + <spirit:direction>in</spirit:direction> + <spirit:vector> + <spirit:left spirit:format="long">7</spirit:left> + <spirit:right spirit:format="long">0</spirit:right> + </spirit:vector> + <spirit:wireTypeDefs> + <spirit:wireTypeDef> + <spirit:typeName>wire</spirit:typeName> + <spirit:viewNameRef>xilinx_verilogsynthesis</spirit:viewNameRef> + <spirit:viewNameRef>xilinx_verilogbehavioralsimulation</spirit:viewNameRef> + </spirit:wireTypeDef> + </spirit:wireTypeDefs> + </spirit:wire> + </spirit:port> + <spirit:port> + <spirit:name>rx_tvalid</spirit:name> + <spirit:wire> + <spirit:direction>in</spirit:direction> + <spirit:wireTypeDefs> + <spirit:wireTypeDef> + <spirit:typeName>wire</spirit:typeName> + <spirit:viewNameRef>xilinx_verilogsynthesis</spirit:viewNameRef> + <spirit:viewNameRef>xilinx_verilogbehavioralsimulation</spirit:viewNameRef> + </spirit:wireTypeDef> + </spirit:wireTypeDefs> + </spirit:wire> + </spirit:port> + <spirit:port> + <spirit:name>S_AXI_ACLK</spirit:name> + <spirit:wire> + <spirit:direction>in</spirit:direction> + <spirit:wireTypeDefs> + <spirit:wireTypeDef> + <spirit:typeName>wire</spirit:typeName> + <spirit:viewNameRef>xilinx_verilogsynthesis</spirit:viewNameRef> + <spirit:viewNameRef>xilinx_verilogbehavioralsimulation</spirit:viewNameRef> + </spirit:wireTypeDef> + </spirit:wireTypeDefs> + </spirit:wire> + </spirit:port> + <spirit:port> + <spirit:name>S_AXI_ARESETN</spirit:name> + <spirit:wire> + <spirit:direction>in</spirit:direction> + <spirit:wireTypeDefs> + <spirit:wireTypeDef> + <spirit:typeName>wire</spirit:typeName> + <spirit:viewNameRef>xilinx_verilogsynthesis</spirit:viewNameRef> + <spirit:viewNameRef>xilinx_verilogbehavioralsimulation</spirit:viewNameRef> + </spirit:wireTypeDef> + </spirit:wireTypeDefs> + </spirit:wire> + </spirit:port> + <spirit:port> + <spirit:name>S_AXI_AWADDR</spirit:name> + <spirit:wire> + <spirit:direction>in</spirit:direction> + <spirit:vector> + <spirit:left spirit:format="long" spirit:resolve="dependent" spirit:dependency="(spirit:decode(id('MODELPARAM_VALUE.C_S_AXI_ADDR_WIDTH')) - 1)">3</spirit:left> + <spirit:right spirit:format="long">0</spirit:right> + </spirit:vector> + <spirit:wireTypeDefs> + <spirit:wireTypeDef> + <spirit:typeName>wire</spirit:typeName> + <spirit:viewNameRef>xilinx_verilogsynthesis</spirit:viewNameRef> + <spirit:viewNameRef>xilinx_verilogbehavioralsimulation</spirit:viewNameRef> + </spirit:wireTypeDef> + </spirit:wireTypeDefs> + </spirit:wire> + </spirit:port> + <spirit:port> + <spirit:name>S_AXI_AWPROT</spirit:name> + <spirit:wire> + <spirit:direction>in</spirit:direction> + <spirit:vector> + <spirit:left spirit:format="long">2</spirit:left> + <spirit:right spirit:format="long">0</spirit:right> + </spirit:vector> + <spirit:wireTypeDefs> + <spirit:wireTypeDef> + <spirit:typeName>wire</spirit:typeName> + <spirit:viewNameRef>xilinx_verilogsynthesis</spirit:viewNameRef> + <spirit:viewNameRef>xilinx_verilogbehavioralsimulation</spirit:viewNameRef> + </spirit:wireTypeDef> + </spirit:wireTypeDefs> + </spirit:wire> + </spirit:port> + <spirit:port> + <spirit:name>S_AXI_AWVALID</spirit:name> + <spirit:wire> + <spirit:direction>in</spirit:direction> + <spirit:wireTypeDefs> + <spirit:wireTypeDef> + <spirit:typeName>wire</spirit:typeName> + <spirit:viewNameRef>xilinx_verilogsynthesis</spirit:viewNameRef> + <spirit:viewNameRef>xilinx_verilogbehavioralsimulation</spirit:viewNameRef> + </spirit:wireTypeDef> + </spirit:wireTypeDefs> + </spirit:wire> + </spirit:port> + <spirit:port> + <spirit:name>S_AXI_AWREADY</spirit:name> + <spirit:wire> + <spirit:direction>out</spirit:direction> + <spirit:wireTypeDefs> + <spirit:wireTypeDef> + <spirit:typeName>wire</spirit:typeName> + <spirit:viewNameRef>xilinx_verilogsynthesis</spirit:viewNameRef> + <spirit:viewNameRef>xilinx_verilogbehavioralsimulation</spirit:viewNameRef> + </spirit:wireTypeDef> + </spirit:wireTypeDefs> + </spirit:wire> + </spirit:port> + <spirit:port> + <spirit:name>S_AXI_WDATA</spirit:name> + <spirit:wire> + <spirit:direction>in</spirit:direction> + <spirit:vector> + <spirit:left spirit:format="long" spirit:resolve="dependent" spirit:dependency="(spirit:decode(id('MODELPARAM_VALUE.C_S_AXI_DATA_WIDTH')) - 1)">31</spirit:left> + <spirit:right spirit:format="long">0</spirit:right> + </spirit:vector> + <spirit:wireTypeDefs> + <spirit:wireTypeDef> + <spirit:typeName>wire</spirit:typeName> + <spirit:viewNameRef>xilinx_verilogsynthesis</spirit:viewNameRef> + <spirit:viewNameRef>xilinx_verilogbehavioralsimulation</spirit:viewNameRef> + </spirit:wireTypeDef> + </spirit:wireTypeDefs> + </spirit:wire> + </spirit:port> + <spirit:port> + <spirit:name>S_AXI_WSTRB</spirit:name> + <spirit:wire> + <spirit:direction>in</spirit:direction> + <spirit:vector> + <spirit:left spirit:format="long" spirit:resolve="dependent" spirit:dependency="((spirit:decode(id('MODELPARAM_VALUE.C_S_AXI_DATA_WIDTH')) / 8) - 1)">3</spirit:left> + <spirit:right spirit:format="long">0</spirit:right> + </spirit:vector> + <spirit:wireTypeDefs> + <spirit:wireTypeDef> + <spirit:typeName>wire</spirit:typeName> + <spirit:viewNameRef>xilinx_verilogsynthesis</spirit:viewNameRef> + <spirit:viewNameRef>xilinx_verilogbehavioralsimulation</spirit:viewNameRef> + </spirit:wireTypeDef> + </spirit:wireTypeDefs> + </spirit:wire> + </spirit:port> + <spirit:port> + <spirit:name>S_AXI_WVALID</spirit:name> + <spirit:wire> + <spirit:direction>in</spirit:direction> + <spirit:wireTypeDefs> + <spirit:wireTypeDef> + <spirit:typeName>wire</spirit:typeName> + <spirit:viewNameRef>xilinx_verilogsynthesis</spirit:viewNameRef> + <spirit:viewNameRef>xilinx_verilogbehavioralsimulation</spirit:viewNameRef> + </spirit:wireTypeDef> + </spirit:wireTypeDefs> + </spirit:wire> + </spirit:port> + <spirit:port> + <spirit:name>S_AXI_WREADY</spirit:name> + <spirit:wire> + <spirit:direction>out</spirit:direction> + <spirit:wireTypeDefs> + <spirit:wireTypeDef> + <spirit:typeName>wire</spirit:typeName> + <spirit:viewNameRef>xilinx_verilogsynthesis</spirit:viewNameRef> + <spirit:viewNameRef>xilinx_verilogbehavioralsimulation</spirit:viewNameRef> + </spirit:wireTypeDef> + </spirit:wireTypeDefs> + </spirit:wire> + </spirit:port> + <spirit:port> + <spirit:name>S_AXI_BRESP</spirit:name> + <spirit:wire> + <spirit:direction>out</spirit:direction> + <spirit:vector> + <spirit:left spirit:format="long">1</spirit:left> + <spirit:right spirit:format="long">0</spirit:right> + </spirit:vector> + <spirit:wireTypeDefs> + <spirit:wireTypeDef> + <spirit:typeName>wire</spirit:typeName> + <spirit:viewNameRef>xilinx_verilogsynthesis</spirit:viewNameRef> + <spirit:viewNameRef>xilinx_verilogbehavioralsimulation</spirit:viewNameRef> + </spirit:wireTypeDef> + </spirit:wireTypeDefs> + </spirit:wire> + </spirit:port> + <spirit:port> + <spirit:name>S_AXI_BVALID</spirit:name> + <spirit:wire> + <spirit:direction>out</spirit:direction> + <spirit:wireTypeDefs> + <spirit:wireTypeDef> + <spirit:typeName>wire</spirit:typeName> + <spirit:viewNameRef>xilinx_verilogsynthesis</spirit:viewNameRef> + <spirit:viewNameRef>xilinx_verilogbehavioralsimulation</spirit:viewNameRef> + </spirit:wireTypeDef> + </spirit:wireTypeDefs> + </spirit:wire> + </spirit:port> + <spirit:port> + <spirit:name>S_AXI_BREADY</spirit:name> + <spirit:wire> + <spirit:direction>in</spirit:direction> + <spirit:wireTypeDefs> + <spirit:wireTypeDef> + <spirit:typeName>wire</spirit:typeName> + <spirit:viewNameRef>xilinx_verilogsynthesis</spirit:viewNameRef> + <spirit:viewNameRef>xilinx_verilogbehavioralsimulation</spirit:viewNameRef> + </spirit:wireTypeDef> + </spirit:wireTypeDefs> + </spirit:wire> + </spirit:port> + <spirit:port> + <spirit:name>S_AXI_ARADDR</spirit:name> + <spirit:wire> + <spirit:direction>in</spirit:direction> + <spirit:vector> + <spirit:left spirit:format="long" spirit:resolve="dependent" spirit:dependency="(spirit:decode(id('MODELPARAM_VALUE.C_S_AXI_ADDR_WIDTH')) - 1)">3</spirit:left> + <spirit:right spirit:format="long">0</spirit:right> + </spirit:vector> + <spirit:wireTypeDefs> + <spirit:wireTypeDef> + <spirit:typeName>wire</spirit:typeName> + <spirit:viewNameRef>xilinx_verilogsynthesis</spirit:viewNameRef> + <spirit:viewNameRef>xilinx_verilogbehavioralsimulation</spirit:viewNameRef> + </spirit:wireTypeDef> + </spirit:wireTypeDefs> + </spirit:wire> + </spirit:port> + <spirit:port> + <spirit:name>S_AXI_ARPROT</spirit:name> + <spirit:wire> + <spirit:direction>in</spirit:direction> + <spirit:vector> + <spirit:left spirit:format="long">2</spirit:left> + <spirit:right spirit:format="long">0</spirit:right> + </spirit:vector> + <spirit:wireTypeDefs> + <spirit:wireTypeDef> + <spirit:typeName>wire</spirit:typeName> + <spirit:viewNameRef>xilinx_verilogsynthesis</spirit:viewNameRef> + <spirit:viewNameRef>xilinx_verilogbehavioralsimulation</spirit:viewNameRef> + </spirit:wireTypeDef> + </spirit:wireTypeDefs> + </spirit:wire> + </spirit:port> + <spirit:port> + <spirit:name>S_AXI_ARVALID</spirit:name> + <spirit:wire> + <spirit:direction>in</spirit:direction> + <spirit:wireTypeDefs> + <spirit:wireTypeDef> + <spirit:typeName>wire</spirit:typeName> + <spirit:viewNameRef>xilinx_verilogsynthesis</spirit:viewNameRef> + <spirit:viewNameRef>xilinx_verilogbehavioralsimulation</spirit:viewNameRef> + </spirit:wireTypeDef> + </spirit:wireTypeDefs> + </spirit:wire> + </spirit:port> + <spirit:port> + <spirit:name>S_AXI_ARREADY</spirit:name> + <spirit:wire> + <spirit:direction>out</spirit:direction> + <spirit:wireTypeDefs> + <spirit:wireTypeDef> + <spirit:typeName>wire</spirit:typeName> + <spirit:viewNameRef>xilinx_verilogsynthesis</spirit:viewNameRef> + <spirit:viewNameRef>xilinx_verilogbehavioralsimulation</spirit:viewNameRef> + </spirit:wireTypeDef> + </spirit:wireTypeDefs> + </spirit:wire> + </spirit:port> + <spirit:port> + <spirit:name>S_AXI_RDATA</spirit:name> + <spirit:wire> + <spirit:direction>out</spirit:direction> + <spirit:vector> + <spirit:left spirit:format="long" spirit:resolve="dependent" spirit:dependency="(spirit:decode(id('MODELPARAM_VALUE.C_S_AXI_DATA_WIDTH')) - 1)">31</spirit:left> + <spirit:right spirit:format="long">0</spirit:right> + </spirit:vector> + <spirit:wireTypeDefs> + <spirit:wireTypeDef> + <spirit:typeName>wire</spirit:typeName> + <spirit:viewNameRef>xilinx_verilogsynthesis</spirit:viewNameRef> + <spirit:viewNameRef>xilinx_verilogbehavioralsimulation</spirit:viewNameRef> + </spirit:wireTypeDef> + </spirit:wireTypeDefs> + </spirit:wire> + </spirit:port> + <spirit:port> + <spirit:name>S_AXI_RRESP</spirit:name> + <spirit:wire> + <spirit:direction>out</spirit:direction> + <spirit:vector> + <spirit:left spirit:format="long">1</spirit:left> + <spirit:right spirit:format="long">0</spirit:right> + </spirit:vector> + <spirit:wireTypeDefs> + <spirit:wireTypeDef> + <spirit:typeName>wire</spirit:typeName> + <spirit:viewNameRef>xilinx_verilogsynthesis</spirit:viewNameRef> + <spirit:viewNameRef>xilinx_verilogbehavioralsimulation</spirit:viewNameRef> + </spirit:wireTypeDef> + </spirit:wireTypeDefs> + </spirit:wire> + </spirit:port> + <spirit:port> + <spirit:name>S_AXI_RVALID</spirit:name> + <spirit:wire> + <spirit:direction>out</spirit:direction> + <spirit:wireTypeDefs> + <spirit:wireTypeDef> + <spirit:typeName>wire</spirit:typeName> + <spirit:viewNameRef>xilinx_verilogsynthesis</spirit:viewNameRef> + <spirit:viewNameRef>xilinx_verilogbehavioralsimulation</spirit:viewNameRef> + </spirit:wireTypeDef> + </spirit:wireTypeDefs> + </spirit:wire> + </spirit:port> + <spirit:port> + <spirit:name>S_AXI_RREADY</spirit:name> + <spirit:wire> + <spirit:direction>in</spirit:direction> + <spirit:wireTypeDefs> + <spirit:wireTypeDef> + <spirit:typeName>wire</spirit:typeName> + <spirit:viewNameRef>xilinx_verilogsynthesis</spirit:viewNameRef> + <spirit:viewNameRef>xilinx_verilogbehavioralsimulation</spirit:viewNameRef> + </spirit:wireTypeDef> + </spirit:wireTypeDefs> + </spirit:wire> + </spirit:port> + </spirit:ports> + <spirit:modelParameters> + <spirit:modelParameter xsi:type="spirit:nameValueTypeType" spirit:dataType="integer"> + <spirit:name>C_S_AXI_DATA_WIDTH</spirit:name> + <spirit:displayName>C S Axi Data Width</spirit:displayName> + <spirit:value spirit:format="long" spirit:resolve="generated" spirit:id="MODELPARAM_VALUE.C_S_AXI_DATA_WIDTH">32</spirit:value> + </spirit:modelParameter> + <spirit:modelParameter spirit:dataType="integer"> + <spirit:name>C_S_AXI_ADDR_WIDTH</spirit:name> + <spirit:displayName>C S Axi Addr Width</spirit:displayName> + <spirit:value spirit:format="long" spirit:resolve="generated" spirit:id="MODELPARAM_VALUE.C_S_AXI_ADDR_WIDTH">4</spirit:value> + </spirit:modelParameter> + </spirit:modelParameters> + </spirit:model> + <spirit:choices> + <spirit:choice> + <spirit:name>choice_list_6fc15197</spirit:name> + <spirit:enumeration>32</spirit:enumeration> + </spirit:choice> + <spirit:choice> + <spirit:name>choice_list_99a1d2b9</spirit:name> + <spirit:enumeration>LEVEL_HIGH</spirit:enumeration> + <spirit:enumeration>LEVEL_LOW</spirit:enumeration> + <spirit:enumeration>EDGE_RISING</spirit:enumeration> + <spirit:enumeration>EDGE_FALLING</spirit:enumeration> + </spirit:choice> + <spirit:choice> + <spirit:name>choice_list_9d8b0d81</spirit:name> + <spirit:enumeration>ACTIVE_HIGH</spirit:enumeration> + <spirit:enumeration>ACTIVE_LOW</spirit:enumeration> + </spirit:choice> + <spirit:choice> + <spirit:name>choice_pairs_ce1226b1</spirit:name> + <spirit:enumeration spirit:text="true">1</spirit:enumeration> + <spirit:enumeration spirit:text="false">0</spirit:enumeration> + </spirit:choice> + </spirit:choices> + <spirit:fileSets> + <spirit:fileSet> + <spirit:name>xilinx_verilogsynthesis_view_fileset</spirit:name> + <spirit:file> + <spirit:name>src/axi_stream_io_v1_0_axi_s.v</spirit:name> + <spirit:fileType>verilogSource</spirit:fileType> + <spirit:userFileType>CHECKSUM_fc7589fa</spirit:userFileType> + </spirit:file> + </spirit:fileSet> + <spirit:fileSet> + <spirit:name>xilinx_verilogbehavioralsimulation_view_fileset</spirit:name> + <spirit:file> + <spirit:name>src/axi_stream_io_v1_0_axi_s.v</spirit:name> + <spirit:fileType>verilogSource</spirit:fileType> + </spirit:file> + </spirit:fileSet> + <spirit:fileSet> + <spirit:name>xilinx_softwaredriver_view_fileset</spirit:name> + <spirit:file> + <spirit:name>drivers/axi_stream_io_v1_0/data/axi_stream_io.mdd</spirit:name> + <spirit:userFileType>mdd</spirit:userFileType> + <spirit:userFileType>driver_mdd</spirit:userFileType> + </spirit:file> + <spirit:file> + <spirit:name>drivers/axi_stream_io_v1_0/data/axi_stream_io.tcl</spirit:name> + <spirit:fileType>tclSource</spirit:fileType> + <spirit:userFileType>driver_tcl</spirit:userFileType> + </spirit:file> + <spirit:file> + <spirit:name>drivers/axi_stream_io_v1_0/src/Makefile</spirit:name> + <spirit:userFileType>driver_src</spirit:userFileType> + </spirit:file> + <spirit:file> + <spirit:name>drivers/axi_stream_io_v1_0/src/axi_stream_io.h</spirit:name> + <spirit:fileType>cSource</spirit:fileType> + <spirit:userFileType>driver_src</spirit:userFileType> + <spirit:isIncludeFile>true</spirit:isIncludeFile> + </spirit:file> + <spirit:file> + <spirit:name>drivers/axi_stream_io_v1_0/src/axi_stream_io.c</spirit:name> + <spirit:fileType>cSource</spirit:fileType> + <spirit:userFileType>driver_src</spirit:userFileType> + <spirit:isIncludeFile>true</spirit:isIncludeFile> + </spirit:file> + <spirit:file> + <spirit:name>drivers/axi_stream_io_v1_0/src/axi_stream_io_selftest.c</spirit:name> + <spirit:fileType>cSource</spirit:fileType> + <spirit:userFileType>driver_src</spirit:userFileType> + <spirit:isIncludeFile>true</spirit:isIncludeFile> + </spirit:file> + </spirit:fileSet> + <spirit:fileSet> + <spirit:name>xilinx_xpgui_view_fileset</spirit:name> + <spirit:file> + <spirit:name>xgui/axi_stream_io_v1_0.tcl</spirit:name> + <spirit:fileType>tclSource</spirit:fileType> + <spirit:userFileType>CHECKSUM_1b3a39eb</spirit:userFileType> + <spirit:userFileType>XGUI_VERSION_2</spirit:userFileType> + </spirit:file> + </spirit:fileSet> + <spirit:fileSet> + <spirit:name>bd_tcl_view_fileset</spirit:name> + <spirit:file> + <spirit:name>bd/bd.tcl</spirit:name> + <spirit:fileType>tclSource</spirit:fileType> + </spirit:file> + </spirit:fileSet> + </spirit:fileSets> + <spirit:description>AXI mapped TX and RX byte stream interface</spirit:description> + <spirit:parameters> + <spirit:parameter> + <spirit:name>C_axi_s_BASEADDR</spirit:name> + <spirit:displayName>C axi s BASEADDR</spirit:displayName> + <spirit:value spirit:format="bitString" spirit:resolve="user" spirit:id="PARAM_VALUE.C_axi_s_BASEADDR" spirit:order="5" spirit:bitStringLength="32">0xFFFFFFFF</spirit:value> + <spirit:vendorExtensions> + <xilinx:parameterInfo> + <xilinx:enablement> + <xilinx:isEnabled xilinx:id="PARAM_ENABLEMENT.C_axi_s_BASEADDR">false</xilinx:isEnabled> + </xilinx:enablement> + </xilinx:parameterInfo> + </spirit:vendorExtensions> + </spirit:parameter> + <spirit:parameter> + <spirit:name>C_axi_s_HIGHADDR</spirit:name> + <spirit:displayName>C axi s HIGHADDR</spirit:displayName> + <spirit:value spirit:format="bitString" spirit:resolve="user" spirit:id="PARAM_VALUE.C_axi_s_HIGHADDR" spirit:order="6" spirit:bitStringLength="32">0x00000000</spirit:value> + <spirit:vendorExtensions> + <xilinx:parameterInfo> + <xilinx:enablement> + <xilinx:isEnabled xilinx:id="PARAM_ENABLEMENT.C_axi_s_HIGHADDR">false</xilinx:isEnabled> + </xilinx:enablement> + </xilinx:parameterInfo> + </spirit:vendorExtensions> + </spirit:parameter> + <spirit:parameter> + <spirit:name>Component_Name</spirit:name> + <spirit:value spirit:resolve="user" spirit:id="PARAM_VALUE.Component_Name" spirit:order="1">axi_stream_io_v1_0</spirit:value> + </spirit:parameter> + <spirit:parameter> + <spirit:name>C_S_AXI_DATA_WIDTH</spirit:name> + <spirit:displayName>C S Axi Data Width</spirit:displayName> + <spirit:value spirit:format="long" spirit:resolve="user" spirit:id="PARAM_VALUE.C_S_AXI_DATA_WIDTH">32</spirit:value> + </spirit:parameter> + <spirit:parameter> + <spirit:name>C_S_AXI_ADDR_WIDTH</spirit:name> + <spirit:displayName>C S Axi Addr Width</spirit:displayName> + <spirit:value spirit:format="long" spirit:resolve="user" spirit:id="PARAM_VALUE.C_S_AXI_ADDR_WIDTH">4</spirit:value> + </spirit:parameter> + </spirit:parameters> + <spirit:vendorExtensions> + <xilinx:coreExtensions> + <xilinx:supportedFamilies> + <xilinx:family xilinx:lifeCycle="Pre-Production">zynquplus</xilinx:family> + <xilinx:family xilinx:lifeCycle="Pre-Production">zynq</xilinx:family> + <xilinx:family xilinx:lifeCycle="Pre-Production">artix7</xilinx:family> + <xilinx:family xilinx:lifeCycle="Pre-Production">artix7l</xilinx:family> + <xilinx:family xilinx:lifeCycle="Pre-Production">kintex7</xilinx:family> + <xilinx:family xilinx:lifeCycle="Pre-Production">kintex7l</xilinx:family> + <xilinx:family xilinx:lifeCycle="Pre-Production">kintexu</xilinx:family> + <xilinx:family xilinx:lifeCycle="Pre-Production">kintexuplus</xilinx:family> + <xilinx:family xilinx:lifeCycle="Pre-Production">spartan7</xilinx:family> + <xilinx:family xilinx:lifeCycle="Pre-Production">virtexuplus</xilinx:family> + <xilinx:family xilinx:lifeCycle="Pre-Production">virtexuplusHBM</xilinx:family> + <xilinx:family xilinx:lifeCycle="Pre-Production">aartix7</xilinx:family> + <xilinx:family xilinx:lifeCycle="Pre-Production">aspartan7</xilinx:family> + <xilinx:family xilinx:lifeCycle="Pre-Production">azynq</xilinx:family> + </xilinx:supportedFamilies> + <xilinx:taxonomies> + <xilinx:taxonomy>AXI_Peripheral</xilinx:taxonomy> + </xilinx:taxonomies> + <xilinx:displayName>axi_stream_io_v1.0</xilinx:displayName> + <xilinx:vendorDisplayName>SoC Labs</xilinx:vendorDisplayName> + <xilinx:vendorURL>http://www.soclabs.org</xilinx:vendorURL> + <xilinx:coreRevision>16</xilinx:coreRevision> + <xilinx:upgrades> + <xilinx:canUpgradeFrom>xilinx.com:user:axi_stream_io:1.0</xilinx:canUpgradeFrom> + </xilinx:upgrades> + <xilinx:coreCreationDateTime>2021-12-12T20:49:24Z</xilinx:coreCreationDateTime> + <xilinx:tags> + <xilinx:tag xilinx:name="ui.data.coregen.dd@16fed581_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@2ec9608d_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@793f5b3_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@7322b269_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@6e248e43_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@b4e9ef3_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@426bcb85_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@2e53d487_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@61dade0b_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@4eafa00f_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@53e3a875_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@162982df_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@75f72ee4_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@18aeac53_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@606d36b_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@38c0eb40_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@57696f2a_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@510901ec_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@60d2f4d6_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@3a2da1b3_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@cd54b6e_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@693cb83d_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@ef28d1_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@5a59314d_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@29767284_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@29f27e63_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@13dc2895_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@5e36f1df_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@709fc708_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@8bba7d9_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@21d8e4a5_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@37415f14_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@66dc3d40_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@4fba07d0_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@eb3af51_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@4c66ef79_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@45185362_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@53225cb8_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@1cf08902_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@4b15fae5_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@17a6be36_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@3301516d_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@3be10ef6_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@6a177ab9_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@20e4e579_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@f741122_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@df275a0_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@4ac8a5fd_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@5ae71cdc_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@2c59353f_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@2325ca04_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@498ea243_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@4b8c707a_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@52cdfb1d_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@2a0d6185_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@4bac3167_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@19a83bf5_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@562798bd_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@123cc7f3_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@7062c158_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@778708cf_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@3a452e27_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@ece9f0f_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@4b895821_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@3dc1927b_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@3e4d1f1c_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@22bc955c_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@4c436144_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@23f15bc2_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@2414d94e_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@63ae6b17_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@1f88dbb1_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@7517e1ec_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@668022b8_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@3177ce96_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@71f152fd_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@30ad2c46_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@5aae29a7_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@292165c8_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@334d7f4a_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@3479b8c2_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@13d09377_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@315680f2_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@5ba41a48_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@d66c81a_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@2a99c6a5_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@4530b54d_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@699d5142_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@17559350_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@18f15cc5_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@482d154b_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@9b0867a_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@2835d2db_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@3070b16_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@7616d28e_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@6f3420ae_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@59ca939e_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@3c36ad44_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@1e50ae02_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@22ebfa5c_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@465f09ec_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@1bdbdf15_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@9060620_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@65357e50_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@4e4f99_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@7b82dd23_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@7a9b0492_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@4851d668_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@6ee66680_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@18058a64_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@cfe93ee_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@53c2b650_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@11a6efc0_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@18afa642_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@12652ecf_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@e72e52b_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@2861fd1c_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@24001396_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@4454325e_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@3d14ded5_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@6a45a760_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@75c51952_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@1d040cfa_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@c27bbbf_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@7158e610_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@499392b5_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@e8df7e6_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@11aa003e_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@4273f844_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@5fadd8f7_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@6c93a7db_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@27ee561_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@4a52c607_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@11760a9c_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@4115d1f1_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@7d41ca58_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@4899dc31_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@13b9216c_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@2e05852a_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@384bceec_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@4ed8c48f_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@200621c6_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@6ac073d7_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@18632943_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@1c0d8bb2_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@50809788_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@7fdbc98a_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@3142de19_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@2b3fb5f1_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@4faf4338_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@eb7476f_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@1d508d99_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@53d85a46_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@30a744ac_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@238f4e8e_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@2081d690_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@7eee799d_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@2c95d02_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@4e1ddea2_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@21e860f8_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@3660b171_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@3ef639f7_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@16ba015e_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@3642a664_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@159c8828_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@14e878fa_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@7f0733b2_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@10cb371d_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@3553a1c7_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@3fc60b7d_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@551cc009_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@752a2e44_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@63f8237c_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@3ca7d308_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@556a2759_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@5f380808_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@651a74cf_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@1ecd1477_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@9b65a49_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@35b2d11e_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@3536a2cc_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@1cd68297_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@1692283f_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@ecc2ee6_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@747cc728_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@3ec1998a_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@6fb41197_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@2c33db6f_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@42060eaa_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@62342897_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@36eef4b6_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@19ecf3b7_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@5d580cef_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@4f729cff_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@23321c1e_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@539a0d0d_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@9a208b1_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@38bee981_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@13576b9a_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@6455b470_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@23aa217a_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@25e0ca99_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@5787a96e_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@43773246_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@4d61f0c5_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@123ec803_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@441ed6b1_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@40743552_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@575fe9d1_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@760563e4_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@d20fcca_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@4486a217_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@61023d9d_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@7ba954b1_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@35c3b2bc_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@42fe08ca_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@2c2cdfab_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@14ff32f_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@7ec2d566_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@1f0c382e_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@10ce9ce2_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@1d3487ea_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@69af9ff5_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@a3f99a9_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@5d79a274_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@2940bbec_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@3c331f_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@346dc4a8_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@6ee2a2b9_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@76248ced_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@5a67ad90_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@3f211e20_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@31809d90_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@585e4f98_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@42ec0b0a_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@85dcc7d_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@782407fa_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@4693fec4_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@206ba19e_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@65d9e06_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@4115aaf6_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@7a3e8df0_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@5a0dab9_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@16462cdd_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@25040671_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@3cc02f38_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@6b7d8e4b_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@1450c3b3_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@112dcc8a_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@570107d2_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@2a4c82ba_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@59d6fbcc_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@1b1ef5d9_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@7bd35be_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@4a26fb6f_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@7742ea34_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@100b085b_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@66ebb4d6_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@78ccb7c6_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@59569c0f_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@16028751_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@4b46cdee_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@3638e993_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@5fc9a2e7_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@7cd279dc_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@2476846e_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@789eb25_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@7ebb6bc1_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@5b807ab4_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@58bb111d_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@4dd4eede_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@2030ea86_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@262d6dbc_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@9879ce_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@544f9318_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@783ccf68_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@74b5dbd6_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@7b1a5399_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@4e59d89b_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@1ebfb7d3_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@28806a0b_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@4f1fac1_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@193f5497_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@98f5ccf_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@5ea19ca3_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@5c57bfe8_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@474ef512_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@1c3d233f_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@561f98f3_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@4156e62d_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@7fcfc34d_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@4275157_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@2004e159_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@f268144_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@c10c0e6_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@7557e11f_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@b8141f0_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@63cfb8ab_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@3d394ce0_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@50390780_ARCHIVE_LOCATION">C:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@3dbeacb1_ARCHIVE_LOCATION">C:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@4f3f661b_ARCHIVE_LOCATION">C:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@716ccc45_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@3278c6a2_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@398d4fdc_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@384c540d_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@145b9325_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@5e420b14_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@720a061a_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@7019edbc_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@32cec7a3_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@5b9ea533_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@4ba41145_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@7a1c3bc8_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@3f98c05d_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@85ece3f_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@64329cf3_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@6098b91e_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@658c8c87_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@5e029802_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@46a555e4_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@66159ec1_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@78addf86_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@3d48e636_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@45209cb7_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@3841593c_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@7fecffde_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@33c9e638_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@538ac29d_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@6c1cb496_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@6e783269_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@703c8061_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@1a7552e4_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@71a8b655_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@393dae6f_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@26792732_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@56b72513_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@50b98a45_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@75004655_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@27616936_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@3a54ec8f_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@23e0933_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@21d6563f_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@7e96eb79_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@fbb747e_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@5a959611_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@3d67b840_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@1ececc3c_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@2c3729d0_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@753686b7_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@4bc158bd_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@7553bd98_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@686c9917_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@15e3e3fc_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@17c20476_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@2890ad0d_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@2502d801_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@615193fc_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@10d0b0e1_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@1c009a65_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@77fd9a52_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@423f07dc_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@589a99d0_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@b813605_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@a38b321_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@355431d9_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@d146dd7_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@3bf71b0b_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@27b3813d_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@5ef70193_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@24d7fb4d_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@11d6e696_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@43384aaf_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@5dcbf251_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@33084c7e_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@4c5a8f4b_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@38125fe9_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@14f39b23_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@71113478_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@36296867_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@511868d0_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@6f3ba609_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@78a4bc24_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@32825895_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@6ea7679a_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@600011e1_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@766beed_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@5f381aa9_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@300820b4_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@7058d4f_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@6ec12ea5_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@2b23043_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@51253581_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@7aa26a8e_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.df@b23f618_ARCHIVE_LOCATION">/home/dwf1m12/soclabs/fpga/vivado/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.df@77b30d22_ARCHIVE_LOCATION">/home/dwf1m12/soclabs/fpga/vivado/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.df@4cde9694_ARCHIVE_LOCATION">/home/dwf1m12/soclabs/fpga/vivado/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.df@120ff5dc_ARCHIVE_LOCATION">/home/dwf1m12/soclabs/fpga/vivado/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.df@24113226_ARCHIVE_LOCATION">/home/dwf1m12/soclabs/fpga/vivado/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.df@44aea720_ARCHIVE_LOCATION">/home/dwf1m12/soclabs/fpga/vivado/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.df@2ee819b6_ARCHIVE_LOCATION">/home/dwf1m12/soclabs/fpga/vivado/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.df@4818d5b2_ARCHIVE_LOCATION">/home/dwf1m12/soclabs/fpga/vivado/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.df@38e9bfee_ARCHIVE_LOCATION">/home/dwf1m12/soclabs/fpga/vivado/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.df@1c951027_ARCHIVE_LOCATION">/home/dwf1m12/soclabs/fpga/vivado/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.df@348407d1_ARCHIVE_LOCATION">/home/dwf1m12/soclabs/fpga/vivado/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.df@111f073e_ARCHIVE_LOCATION">/home/dwf1m12/soclabs/fpga/vivado/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.df@16159ba0_ARCHIVE_LOCATION">/home/dwf1m12/soclabs/fpga/vivado/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.df@21bb058_ARCHIVE_LOCATION">/home/dwf1m12/soclabs/fpga/vivado/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.df@28bf5ef8_ARCHIVE_LOCATION">/home/dwf1m12/soclabs/fpga/vivado/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.df@a1c64f7_ARCHIVE_LOCATION">/home/dwf1m12/soclabs/fpga/vivado/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.df@74feff94_ARCHIVE_LOCATION">/home/dwf1m12/soclabs/fpga/vivado/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.df@4f3615f1_ARCHIVE_LOCATION">/home/dwf1m12/soclabs/fpga/vivado/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + </xilinx:tags> + </xilinx:coreExtensions> + <xilinx:packagingInfo> + <xilinx:xilinxVersion>2021.1</xilinx:xilinxVersion> + <xilinx:checksum xilinx:scope="busInterfaces" xilinx:value="5562313f"/> + <xilinx:checksum xilinx:scope="memoryMaps" xilinx:value="d6592117"/> + <xilinx:checksum xilinx:scope="fileGroups" xilinx:value="323cdeea"/> + <xilinx:checksum xilinx:scope="ports" xilinx:value="7c2aad6e"/> + <xilinx:checksum xilinx:scope="hdlParameters" xilinx:value="cd9ec9b5"/> + <xilinx:checksum xilinx:scope="parameters" xilinx:value="6cced3b9"/> + </xilinx:packagingInfo> + </spirit:vendorExtensions> +</spirit:component> diff --git a/Cortex-M0/nanosoc/systems/mcu/fpga_imp/ip_repo/axi_stream_io_1.0/drivers/axi_stream_io_v1_0/data/axi_stream_io.mdd b/Cortex-M0/nanosoc/systems/mcu/fpga_imp/ip_repo/axi_stream_io_1.0/drivers/axi_stream_io_v1_0/data/axi_stream_io.mdd new file mode 100755 index 0000000..d7af75e --- /dev/null +++ b/Cortex-M0/nanosoc/systems/mcu/fpga_imp/ip_repo/axi_stream_io_1.0/drivers/axi_stream_io_v1_0/data/axi_stream_io.mdd @@ -0,0 +1,10 @@ + + +OPTION psf_version = 2.1; + +BEGIN DRIVER axi_stream_io + OPTION supported_peripherals = (axi_stream_io); + OPTION copyfiles = all; + OPTION VERSION = 1.0; + OPTION NAME = axi_stream_io; +END DRIVER diff --git a/Cortex-M0/nanosoc/systems/mcu/fpga_imp/ip_repo/axi_stream_io_1.0/drivers/axi_stream_io_v1_0/data/axi_stream_io.tcl b/Cortex-M0/nanosoc/systems/mcu/fpga_imp/ip_repo/axi_stream_io_1.0/drivers/axi_stream_io_v1_0/data/axi_stream_io.tcl new file mode 100755 index 0000000..c3a9cd0 --- /dev/null +++ b/Cortex-M0/nanosoc/systems/mcu/fpga_imp/ip_repo/axi_stream_io_1.0/drivers/axi_stream_io_v1_0/data/axi_stream_io.tcl @@ -0,0 +1,5 @@ + + +proc generate {drv_handle} { + xdefine_include_file $drv_handle "xparameters.h" "axi_stream_io" "NUM_INSTANCES" "DEVICE_ID" "C_axi_s_BASEADDR" "C_axi_s_HIGHADDR" +} diff --git a/Cortex-M0/nanosoc/systems/mcu/fpga_imp/ip_repo/axi_stream_io_1.0/drivers/axi_stream_io_v1_0/src/Makefile b/Cortex-M0/nanosoc/systems/mcu/fpga_imp/ip_repo/axi_stream_io_1.0/drivers/axi_stream_io_v1_0/src/Makefile new file mode 100755 index 0000000..21453f4 --- /dev/null +++ b/Cortex-M0/nanosoc/systems/mcu/fpga_imp/ip_repo/axi_stream_io_1.0/drivers/axi_stream_io_v1_0/src/Makefile @@ -0,0 +1,26 @@ +COMPILER= +ARCHIVER= +CP=cp +COMPILER_FLAGS= +EXTRA_COMPILER_FLAGS= +LIB=libxil.a + +RELEASEDIR=../../../lib +INCLUDEDIR=../../../include +INCLUDES=-I./. -I${INCLUDEDIR} + +INCLUDEFILES=*.h +LIBSOURCES=*.c +OUTS = *.o + +libs: + echo "Compiling axi_stream_io..." + $(COMPILER) $(COMPILER_FLAGS) $(EXTRA_COMPILER_FLAGS) $(INCLUDES) $(LIBSOURCES) + $(ARCHIVER) -r ${RELEASEDIR}/${LIB} ${OUTS} + make clean + +include: + ${CP} $(INCLUDEFILES) $(INCLUDEDIR) + +clean: + rm -rf ${OUTS} diff --git a/Cortex-M0/nanosoc/systems/mcu/fpga_imp/ip_repo/axi_stream_io_1.0/drivers/axi_stream_io_v1_0/src/axi_stream_io.c b/Cortex-M0/nanosoc/systems/mcu/fpga_imp/ip_repo/axi_stream_io_1.0/drivers/axi_stream_io_v1_0/src/axi_stream_io.c new file mode 100755 index 0000000..c552cbf --- /dev/null +++ b/Cortex-M0/nanosoc/systems/mcu/fpga_imp/ip_repo/axi_stream_io_1.0/drivers/axi_stream_io_v1_0/src/axi_stream_io.c @@ -0,0 +1,6 @@ + + +/***************************** Include Files *******************************/ +#include "axi_stream_io.h" + +/************************** Function Definitions ***************************/ diff --git a/Cortex-M0/nanosoc/systems/mcu/fpga_imp/ip_repo/axi_stream_io_1.0/drivers/axi_stream_io_v1_0/src/axi_stream_io.h b/Cortex-M0/nanosoc/systems/mcu/fpga_imp/ip_repo/axi_stream_io_1.0/drivers/axi_stream_io_v1_0/src/axi_stream_io.h new file mode 100755 index 0000000..294e851 --- /dev/null +++ b/Cortex-M0/nanosoc/systems/mcu/fpga_imp/ip_repo/axi_stream_io_1.0/drivers/axi_stream_io_v1_0/src/axi_stream_io.h @@ -0,0 +1,79 @@ + +#ifndef AXI_STREAM_IO_H +#define AXI_STREAM_IO_H + + +/****************** Include Files ********************/ +#include "xil_types.h" +#include "xstatus.h" + +#define AXI_STREAM_IO_axi_s_SLV_REG0_OFFSET 0 +#define AXI_STREAM_IO_axi_s_SLV_REG1_OFFSET 4 +#define AXI_STREAM_IO_axi_s_SLV_REG2_OFFSET 8 +#define AXI_STREAM_IO_axi_s_SLV_REG3_OFFSET 12 + + +/**************************** Type Definitions *****************************/ +/** + * + * Write a value to a AXI_STREAM_IO register. A 32 bit write is performed. + * If the component is implemented in a smaller width, only the least + * significant data is written. + * + * @param BaseAddress is the base address of the AXI_STREAM_IOdevice. + * @param RegOffset is the register offset from the base to write to. + * @param Data is the data written to the register. + * + * @return None. + * + * @note + * C-style signature: + * void AXI_STREAM_IO_mWriteReg(u32 BaseAddress, unsigned RegOffset, u32 Data) + * + */ +#define AXI_STREAM_IO_mWriteReg(BaseAddress, RegOffset, Data) \ + Xil_Out32((BaseAddress) + (RegOffset), (u32)(Data)) + +/** + * + * Read a value from a AXI_STREAM_IO register. A 32 bit read is performed. + * If the component is implemented in a smaller width, only the least + * significant data is read from the register. The most significant data + * will be read as 0. + * + * @param BaseAddress is the base address of the AXI_STREAM_IO device. + * @param RegOffset is the register offset from the base to write to. + * + * @return Data is the data from the register. + * + * @note + * C-style signature: + * u32 AXI_STREAM_IO_mReadReg(u32 BaseAddress, unsigned RegOffset) + * + */ +#define AXI_STREAM_IO_mReadReg(BaseAddress, RegOffset) \ + Xil_In32((BaseAddress) + (RegOffset)) + +/************************** Function Prototypes ****************************/ +/** + * + * Run a self-test on the driver/device. Note this may be a destructive test if + * resets of the device are performed. + * + * If the hardware system is not built correctly, this function may never + * return to the caller. + * + * @param baseaddr_p is the base address of the AXI_STREAM_IO instance to be worked on. + * + * @return + * + * - XST_SUCCESS if all self-test code passed + * - XST_FAILURE if any self-test code failed + * + * @note Caching must be turned off for this function to work. + * @note Self test may fail if data memory and device are not on the same bus. + * + */ +XStatus AXI_STREAM_IO_Reg_SelfTest(void * baseaddr_p); + +#endif // AXI_STREAM_IO_H diff --git a/Cortex-M0/nanosoc/systems/mcu/fpga_imp/ip_repo/axi_stream_io_1.0/drivers/axi_stream_io_v1_0/src/axi_stream_io_selftest.c b/Cortex-M0/nanosoc/systems/mcu/fpga_imp/ip_repo/axi_stream_io_1.0/drivers/axi_stream_io_v1_0/src/axi_stream_io_selftest.c new file mode 100755 index 0000000..26bea4d --- /dev/null +++ b/Cortex-M0/nanosoc/systems/mcu/fpga_imp/ip_repo/axi_stream_io_1.0/drivers/axi_stream_io_v1_0/src/axi_stream_io_selftest.c @@ -0,0 +1,60 @@ + +/***************************** Include Files *******************************/ +#include "axi_stream_io.h" +#include "xparameters.h" +#include "stdio.h" +#include "xil_io.h" + +/************************** Constant Definitions ***************************/ +#define READ_WRITE_MUL_FACTOR 0x10 + +/************************** Function Definitions ***************************/ +/** + * + * Run a self-test on the driver/device. Note this may be a destructive test if + * resets of the device are performed. + * + * If the hardware system is not built correctly, this function may never + * return to the caller. + * + * @param baseaddr_p is the base address of the AXI_STREAM_IOinstance to be worked on. + * + * @return + * + * - XST_SUCCESS if all self-test code passed + * - XST_FAILURE if any self-test code failed + * + * @note Caching must be turned off for this function to work. + * @note Self test may fail if data memory and device are not on the same bus. + * + */ +XStatus AXI_STREAM_IO_Reg_SelfTest(void * baseaddr_p) +{ + u32 baseaddr; + int write_loop_index; + int read_loop_index; + int Index; + + baseaddr = (u32) baseaddr_p; + + xil_printf("******************************\n\r"); + xil_printf("* User Peripheral Self Test\n\r"); + xil_printf("******************************\n\n\r"); + + /* + * Write to user logic slave module register(s) and read back + */ + xil_printf("User logic slave module test...\n\r"); + + for (write_loop_index = 0 ; write_loop_index < 4; write_loop_index++) + AXI_STREAM_IO_mWriteReg (baseaddr, write_loop_index*4, (write_loop_index+1)*READ_WRITE_MUL_FACTOR); + for (read_loop_index = 0 ; read_loop_index < 4; read_loop_index++) + if ( AXI_STREAM_IO_mReadReg (baseaddr, read_loop_index*4) != (read_loop_index+1)*READ_WRITE_MUL_FACTOR){ + xil_printf ("Error reading register value at address %x\n", (int)baseaddr + read_loop_index*4); + return XST_FAILURE; + } + + xil_printf(" - slave register write/read passed\n\n\r"); + + return XST_SUCCESS; +} diff --git a/Cortex-M0/nanosoc/systems/mcu/fpga_imp/ip_repo/axi_stream_io_1.0/soclabs.org_user_axi_stream_io_1.0.zip b/Cortex-M0/nanosoc/systems/mcu/fpga_imp/ip_repo/axi_stream_io_1.0/soclabs.org_user_axi_stream_io_1.0.zip new file mode 100644 index 0000000000000000000000000000000000000000..2a22446f1995db34a975c88b9976e397a70995e4 GIT binary patch literal 15835 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 HS%G)}IfW>< literal 0 HcmV?d00001 diff --git a/Cortex-M0/nanosoc/systems/mcu/fpga_imp/ip_repo/axi_stream_io_1.0/src/axi_stream_io_v1_0_axi_s.v b/Cortex-M0/nanosoc/systems/mcu/fpga_imp/ip_repo/axi_stream_io_1.0/src/axi_stream_io_v1_0_axi_s.v new file mode 100755 index 0000000..c6560f7 --- /dev/null +++ b/Cortex-M0/nanosoc/systems/mcu/fpga_imp/ip_repo/axi_stream_io_1.0/src/axi_stream_io_v1_0_axi_s.v @@ -0,0 +1,424 @@ + +`timescale 1 ns / 1 ps + + module iostream_v1_0_axi # + ( + // Users to add parameters here + + // User parameters ends + // Do not modify the parameters beyond this line + + // Width of S_AXI data bus + parameter integer C_S_AXI_DATA_WIDTH = 32, + // Width of S_AXI address bus + parameter integer C_S_AXI_ADDR_WIDTH = 4 + ) + ( + // Users to add ports here + output wire interrupt, + + // Ports of Axi Master Bus Interface tx +// input wire tx_aclk, +// input wire tx_aresetn, + output wire tx_tvalid, + output wire [7 : 0] tx_tdata, +// output wire [0 : 0] tx_tstrb, +// output wire tx_tlast, + input wire tx_tready, + + // Ports of Axi Slave Bus Interface rx +// input wire rx_aclk, +// input wire rx_aresetn, + output wire rx_tready, + input wire [7 : 0] rx_tdata, +// input wire [0 : 0] rx_tstrb, +// input wire rx_tlast, + input wire rx_tvalid, + + // User ports ends + // Do not modify the ports beyond this line + + // Global Clock Signal + input wire S_AXI_ACLK, + // Global Reset Signal. This Signal is Active LOW + input wire S_AXI_ARESETN, + // Write address (issued by master, acceped by Slave) + input wire [C_S_AXI_ADDR_WIDTH-1 : 0] S_AXI_AWADDR, + // Write channel Protection type. This signal indicates the + // privilege and security level of the transaction, and whether + // the transaction is a data access or an instruction access. + input wire [2 : 0] S_AXI_AWPROT, + // Write address valid. This signal indicates that the master signaling + // valid write address and control information. + input wire S_AXI_AWVALID, + // Write address ready. This signal indicates that the slave is ready + // to accept an address and associated control signals. + output wire S_AXI_AWREADY, + // Write data (issued by master, acceped by Slave) + input wire [C_S_AXI_DATA_WIDTH-1 : 0] S_AXI_WDATA, + // Write strobes. This signal indicates which byte lanes hold + // valid data. There is one write strobe bit for each eight + // bits of the write data bus. + input wire [(C_S_AXI_DATA_WIDTH/8)-1 : 0] S_AXI_WSTRB, + // Write valid. This signal indicates that valid write + // data and strobes are available. + input wire S_AXI_WVALID, + // Write ready. This signal indicates that the slave + // can accept the write data. + output wire S_AXI_WREADY, + // Write response. This signal indicates the status + // of the write transaction. + output wire [1 : 0] S_AXI_BRESP, + // Write response valid. This signal indicates that the channel + // is signaling a valid write response. + output wire S_AXI_BVALID, + // Response ready. This signal indicates that the master + // can accept a write response. + input wire S_AXI_BREADY, + // Read address (issued by master, acceped by Slave) + input wire [C_S_AXI_ADDR_WIDTH-1 : 0] S_AXI_ARADDR, + // Protection type. This signal indicates the privilege + // and security level of the transaction, and whether the + // transaction is a data access or an instruction access. + input wire [2 : 0] S_AXI_ARPROT, + // Read address valid. This signal indicates that the channel + // is signaling valid read address and control information. + input wire S_AXI_ARVALID, + // Read address ready. This signal indicates that the slave is + // ready to accept an address and associated control signals. + output wire S_AXI_ARREADY, + // Read data (issued by slave) + output wire [C_S_AXI_DATA_WIDTH-1 : 0] S_AXI_RDATA, + // Read response. This signal indicates the status of the + // read transfer. + output wire [1 : 0] S_AXI_RRESP, + // Read valid. This signal indicates that the channel is + // signaling the required read data. + output wire S_AXI_RVALID, + // Read ready. This signal indicates that the master can + // accept the read data and response information. + input wire S_AXI_RREADY + ); + + // AXI4LITE signals + reg [C_S_AXI_ADDR_WIDTH-1 : 0] axi_awaddr; + reg axi_awready; + reg axi_wready; + reg [1 : 0] axi_bresp; + reg axi_bvalid; + reg [C_S_AXI_ADDR_WIDTH-1 : 0] axi_araddr; + reg axi_arready; + reg [C_S_AXI_DATA_WIDTH-1 : 0] axi_rdata; + reg [1 : 0] axi_rresp; + reg axi_rvalid; + + // Example-specific design signals + // local parameter for addressing 32 bit / 64 bit C_S_AXI_DATA_WIDTH + // ADDR_LSB is used for addressing 32/64 bit registers/memories + // ADDR_LSB = 2 for 32 bits (n downto 2) + // ADDR_LSB = 3 for 64 bits (n downto 3) + localparam integer ADDR_LSB = (C_S_AXI_DATA_WIDTH/32) + 1; + localparam integer OPT_MEM_ADDR_BITS = 1; + + //---------------------------------------------- + //-- Signals for user logic register space example + //------------------------------------------------ + //-- Number of Slave Registers 4 + reg [8:0] tx_reg; // TX data + reg [8:0] rx_reg; // RX data + reg [7:0] ctrl_reg; // ctrl + wire slv_reg_rden; + wire slv_reg_wren; + reg [7:0] reg_data_out; + integer byte_index; + reg aw_en; + + wire tx_req = tx_reg[8]; // request to transmit + wire tx_ack = tx_tready; // acknowledge when stream ready + + wire rx_req = rx_tvalid; // request to receive + wire rx_ack = !rx_reg[8]; + wire rx_val = rx_reg[8]; + + //assign rx_reg[7:0] <= rx_tdata; + + // I/O Connections assignments + + assign interrupt = ctrl_reg[4] & (!tx_req | rx_req); + + // TX stream interface + assign tx_tdata = tx_reg[7:0]; + assign tx_tvalid = tx_req; + + // RX stream interface + assign rx_tready = rx_ack; + + //AXI Slave + assign S_AXI_AWREADY = axi_awready; + assign S_AXI_WREADY = axi_wready; + assign S_AXI_BRESP = axi_bresp; + assign S_AXI_BVALID = axi_bvalid; + assign S_AXI_ARREADY = axi_arready; + assign S_AXI_RDATA = axi_rdata; + assign S_AXI_RRESP = axi_rresp; + assign S_AXI_RVALID = axi_rvalid; + // Implement axi_awready generation + // axi_awready is asserted for one S_AXI_ACLK clock cycle when both + // S_AXI_AWVALID and S_AXI_WVALID are asserted. axi_awready is + // de-asserted when reset is low. + + always @( posedge S_AXI_ACLK ) + begin + if ( S_AXI_ARESETN == 1'b0 ) + begin + axi_awready <= 1'b0; + aw_en <= 1'b1; + end + else + begin + if (~axi_awready && S_AXI_AWVALID && S_AXI_WVALID && aw_en) + begin + // slave is ready to accept write address when + // there is a valid write address and write data + // on the write address and data bus. This design + // expects no outstanding transactions. + axi_awready <= 1'b1; + aw_en <= 1'b0; + end + else if (S_AXI_BREADY && axi_bvalid) + begin + aw_en <= 1'b1; + axi_awready <= 1'b0; + end + else + begin + axi_awready <= 1'b0; + end + end + end + + // Implement axi_awaddr latching + // This process is used to latch the address when both + // S_AXI_AWVALID and S_AXI_WVALID are valid. + + always @( posedge S_AXI_ACLK ) + begin + if ( S_AXI_ARESETN == 1'b0 ) + begin + axi_awaddr <= 0; + end + else + begin + if (~axi_awready && S_AXI_AWVALID && S_AXI_WVALID && aw_en) + begin + // Write Address latching + axi_awaddr <= S_AXI_AWADDR; + end + end + end + + // Implement axi_wready generation + // axi_wready is asserted for one S_AXI_ACLK clock cycle when both + // S_AXI_AWVALID and S_AXI_WVALID are asserted. axi_wready is + // de-asserted when reset is low. + + always @( posedge S_AXI_ACLK ) + begin + if ( S_AXI_ARESETN == 1'b0 ) + begin + axi_wready <= 1'b0; + end + else + begin + if (~axi_wready && S_AXI_WVALID && S_AXI_AWVALID && aw_en ) + begin + // slave is ready to accept write data when + // there is a valid write address and write data + // on the write address and data bus. This design + // expects no outstanding transactions. + axi_wready <= 1'b1; + end + else + begin + axi_wready <= 1'b0; + end + end + end + + // Implement memory mapped register select and write logic generation + // The write data is accepted and written to memory mapped registers when + // axi_awready, S_AXI_WVALID, axi_wready and S_AXI_WVALID are asserted. Write strobes are used to + // select byte enables of slave registers while writing. + // These registers are cleared when reset (active low) is applied. + // Slave register write enable is asserted when valid address and data are available + // and the slave is ready to accept the write address and write data. + assign slv_reg_wren = axi_wready && S_AXI_WVALID && axi_awready && S_AXI_AWVALID; + + always @( posedge S_AXI_ACLK ) + begin + if ( S_AXI_ARESETN == 1'b0 ) + rx_reg <= 0; + else if ((ctrl_reg[1] == 1'b1)) + rx_reg <= 0; + else if (slv_reg_wren && (axi_awaddr[ADDR_LSB+OPT_MEM_ADDR_BITS:ADDR_LSB] == 2'h0)) + rx_reg[8:0] <= {1'b1, S_AXI_WDATA[7:0]}; + else if (slv_reg_rden && (axi_araddr[ADDR_LSB+OPT_MEM_ADDR_BITS:ADDR_LSB] == 2'h0)) + rx_reg[8] <= 1'b0; + else if (rx_req & rx_ack) // check precedence (rx_req) + rx_reg[8:0] <= {1'b1, rx_tdata[7:0]}; + end + + always @( posedge S_AXI_ACLK ) + begin + if ( S_AXI_ARESETN == 1'b0 ) + tx_reg <= 0; + else if ((ctrl_reg[0] == 1'b1)) + tx_reg <= 0; + else if (slv_reg_wren && (axi_awaddr[ADDR_LSB+OPT_MEM_ADDR_BITS:ADDR_LSB] == 2'h1)) + tx_reg[8:0] <= {1'b1, S_AXI_WDATA[7:0]}; + else if (tx_req & tx_ack) + tx_reg[8] <= 1'b0; + end + + always @( posedge S_AXI_ACLK ) + begin + if ( S_AXI_ARESETN == 1'b0 ) + ctrl_reg <= 8'b00000100; + else if (slv_reg_wren && (axi_awaddr[ADDR_LSB+OPT_MEM_ADDR_BITS:ADDR_LSB] == 2'h3)) + ctrl_reg[7:0] <= S_AXI_WDATA[7:0]; + end + + // Implement write response logic generation + // The write response and response valid signals are asserted by the slave + // when axi_wready, S_AXI_WVALID, axi_wready and S_AXI_WVALID are asserted. + // This marks the acceptance of address and indicates the status of + // write transaction. + + always @( posedge S_AXI_ACLK ) + begin + if ( S_AXI_ARESETN == 1'b0 ) + begin + axi_bvalid <= 0; + axi_bresp <= 2'b0; + end + else + begin + if (axi_awready && S_AXI_AWVALID && ~axi_bvalid && axi_wready && S_AXI_WVALID) + begin + // indicates a valid write response is available + axi_bvalid <= 1'b1; + axi_bresp <= 2'b0; // 'OKAY' response + end // work error responses in future + else + begin + if (S_AXI_BREADY && axi_bvalid) + //check if bready is asserted while bvalid is high) + //(there is a possibility that bready is always asserted high) + begin + axi_bvalid <= 1'b0; + end + end + end + end + + // Implement axi_arready generation + // axi_arready is asserted for one S_AXI_ACLK clock cycle when + // S_AXI_ARVALID is asserted. axi_awready is + // de-asserted when reset (active low) is asserted. + // The read address is also latched when S_AXI_ARVALID is + // asserted. axi_araddr is reset to zero on reset assertion. + + always @( posedge S_AXI_ACLK ) + begin + if ( S_AXI_ARESETN == 1'b0 ) + begin + axi_arready <= 1'b0; + axi_araddr <= 32'b0; + end + else + begin + if (~axi_arready && S_AXI_ARVALID) + begin + // indicates that the slave has acceped the valid read address + axi_arready <= 1'b1; + // Read address latching + axi_araddr <= S_AXI_ARADDR; + end + else + begin + axi_arready <= 1'b0; + end + end + end + + // Implement axi_arvalid generation + // axi_rvalid is asserted for one S_AXI_ACLK clock cycle when both + // S_AXI_ARVALID and axi_arready are asserted. The slave registers + // data are available on the axi_rdata bus at this instance. The + // assertion of axi_rvalid marks the validity of read data on the + // bus and axi_rresp indicates the status of read transaction.axi_rvalid + // is deasserted on reset (active low). axi_rresp and axi_rdata are + // cleared to zero on reset (active low). + always @( posedge S_AXI_ACLK ) + begin + if ( S_AXI_ARESETN == 1'b0 ) + begin + axi_rvalid <= 0; + axi_rresp <= 0; + end + else + begin + if (axi_arready && S_AXI_ARVALID && ~axi_rvalid) + begin + // Valid read data is available at the read data bus + axi_rvalid <= 1'b1; + axi_rresp <= 2'b0; // 'OKAY' response + end + else if (axi_rvalid && S_AXI_RREADY) + begin + // Read data is accepted by the master + axi_rvalid <= 1'b0; + end + end + end + + // Implement memory mapped register select and read logic generation + // Slave register read enable is asserted when valid address is available + // and the slave is ready to accept the read address. + assign slv_reg_rden = axi_arready & S_AXI_ARVALID & ~axi_rvalid; + always @(*) + begin + // Address decoding for reading registers + case ( axi_araddr[ADDR_LSB+OPT_MEM_ADDR_BITS:ADDR_LSB] ) + 2'h0 : reg_data_out <= rx_reg[7:0]; + 2'h1 : reg_data_out <= tx_reg[7:0]; + 2'h2 : reg_data_out <= {3'b000, ctrl_reg[4], tx_req, !tx_req, rx_val, rx_val}; + 2'h3 : reg_data_out <= ctrl_reg; + default : reg_data_out <= 0; + endcase + end + + // Output register or memory read data + always @( posedge S_AXI_ACLK ) + begin + if ( S_AXI_ARESETN == 1'b0 ) + begin + axi_rdata <= 0; + end + else + begin + // When there is a valid read address (S_AXI_ARVALID) with + // acceptance of read address by the slave (axi_arready), + // output the read dada + if (slv_reg_rden) + begin + axi_rdata <= {24'h000000, reg_data_out}; // register read data + end + end + end + + // Add user logic here + + // User logic ends + + endmodule diff --git a/Cortex-M0/nanosoc/systems/mcu/fpga_imp/ip_repo/axi_stream_io_1.0/xgui/axi_stream_io_v1_0.tcl b/Cortex-M0/nanosoc/systems/mcu/fpga_imp/ip_repo/axi_stream_io_1.0/xgui/axi_stream_io_v1_0.tcl new file mode 100755 index 0000000..fcf8a06 --- /dev/null +++ b/Cortex-M0/nanosoc/systems/mcu/fpga_imp/ip_repo/axi_stream_io_1.0/xgui/axi_stream_io_v1_0.tcl @@ -0,0 +1,58 @@ +# Definitional proc to organize widgets for parameters. +proc init_gui { IPINST } { + ipgui::add_param $IPINST -name "Component_Name" + #Adding Page + set Page_0 [ipgui::add_page $IPINST -name "Page 0"] + ipgui::add_param $IPINST -name "C_axi_s_BASEADDR" -parent ${Page_0} + ipgui::add_param $IPINST -name "C_axi_s_HIGHADDR" -parent ${Page_0} + + +} + +proc update_PARAM_VALUE.C_S_AXI_ADDR_WIDTH { PARAM_VALUE.C_S_AXI_ADDR_WIDTH } { + # Procedure called to update C_S_AXI_ADDR_WIDTH when any of the dependent parameters in the arguments change +} + +proc validate_PARAM_VALUE.C_S_AXI_ADDR_WIDTH { PARAM_VALUE.C_S_AXI_ADDR_WIDTH } { + # Procedure called to validate C_S_AXI_ADDR_WIDTH + return true +} + +proc update_PARAM_VALUE.C_S_AXI_DATA_WIDTH { PARAM_VALUE.C_S_AXI_DATA_WIDTH } { + # Procedure called to update C_S_AXI_DATA_WIDTH when any of the dependent parameters in the arguments change +} + +proc validate_PARAM_VALUE.C_S_AXI_DATA_WIDTH { PARAM_VALUE.C_S_AXI_DATA_WIDTH } { + # Procedure called to validate C_S_AXI_DATA_WIDTH + return true +} + +proc update_PARAM_VALUE.C_axi_s_BASEADDR { PARAM_VALUE.C_axi_s_BASEADDR } { + # Procedure called to update C_axi_s_BASEADDR when any of the dependent parameters in the arguments change +} + +proc validate_PARAM_VALUE.C_axi_s_BASEADDR { PARAM_VALUE.C_axi_s_BASEADDR } { + # Procedure called to validate C_axi_s_BASEADDR + return true +} + +proc update_PARAM_VALUE.C_axi_s_HIGHADDR { PARAM_VALUE.C_axi_s_HIGHADDR } { + # Procedure called to update C_axi_s_HIGHADDR when any of the dependent parameters in the arguments change +} + +proc validate_PARAM_VALUE.C_axi_s_HIGHADDR { PARAM_VALUE.C_axi_s_HIGHADDR } { + # Procedure called to validate C_axi_s_HIGHADDR + return true +} + + +proc update_MODELPARAM_VALUE.C_S_AXI_DATA_WIDTH { MODELPARAM_VALUE.C_S_AXI_DATA_WIDTH PARAM_VALUE.C_S_AXI_DATA_WIDTH } { + # Procedure called to set VHDL generic/Verilog parameter value(s) based on TCL parameter value + set_property value [get_property value ${PARAM_VALUE.C_S_AXI_DATA_WIDTH}] ${MODELPARAM_VALUE.C_S_AXI_DATA_WIDTH} +} + +proc update_MODELPARAM_VALUE.C_S_AXI_ADDR_WIDTH { MODELPARAM_VALUE.C_S_AXI_ADDR_WIDTH PARAM_VALUE.C_S_AXI_ADDR_WIDTH } { + # Procedure called to set VHDL generic/Verilog parameter value(s) based on TCL parameter value + set_property value [get_property value ${PARAM_VALUE.C_S_AXI_ADDR_WIDTH}] ${MODELPARAM_VALUE.C_S_AXI_ADDR_WIDTH} +} + diff --git a/Cortex-M0/nanosoc/systems/mcu/fpga_imp/ip_repo/ft1248x1_to_stream8_1.0/bd/bd.tcl b/Cortex-M0/nanosoc/systems/mcu/fpga_imp/ip_repo/ft1248x1_to_stream8_1.0/bd/bd.tcl new file mode 100644 index 0000000..4804aeb --- /dev/null +++ b/Cortex-M0/nanosoc/systems/mcu/fpga_imp/ip_repo/ft1248x1_to_stream8_1.0/bd/bd.tcl @@ -0,0 +1,86 @@ + +proc init { cellpath otherInfo } { + + set cell_handle [get_bd_cells $cellpath] + set all_busif [get_bd_intf_pins $cellpath/*] + set axi_standard_param_list [list ID_WIDTH AWUSER_WIDTH ARUSER_WIDTH WUSER_WIDTH RUSER_WIDTH BUSER_WIDTH] + set full_sbusif_list [list ] + + foreach busif $all_busif { + if { [string equal -nocase [get_property MODE $busif] "slave"] == 1 } { + set busif_param_list [list] + set busif_name [get_property NAME $busif] + if { [lsearch -exact -nocase $full_sbusif_list $busif_name ] == -1 } { + continue + } + foreach tparam $axi_standard_param_list { + lappend busif_param_list "C_${busif_name}_${tparam}" + } + bd::mark_propagate_only $cell_handle $busif_param_list + } + } +} + + +proc pre_propagate {cellpath otherInfo } { + + set cell_handle [get_bd_cells $cellpath] + set all_busif [get_bd_intf_pins $cellpath/*] + set axi_standard_param_list [list ID_WIDTH AWUSER_WIDTH ARUSER_WIDTH WUSER_WIDTH RUSER_WIDTH BUSER_WIDTH] + + foreach busif $all_busif { + if { [string equal -nocase [get_property CONFIG.PROTOCOL $busif] "AXI4"] != 1 } { + continue + } + if { [string equal -nocase [get_property MODE $busif] "master"] != 1 } { + continue + } + + set busif_name [get_property NAME $busif] + foreach tparam $axi_standard_param_list { + set busif_param_name "C_${busif_name}_${tparam}" + + set val_on_cell_intf_pin [get_property CONFIG.${tparam} $busif] + set val_on_cell [get_property CONFIG.${busif_param_name} $cell_handle] + + if { [string equal -nocase $val_on_cell_intf_pin $val_on_cell] != 1 } { + if { $val_on_cell != "" } { + set_property CONFIG.${tparam} $val_on_cell $busif + } + } + } + } +} + + +proc propagate {cellpath otherInfo } { + + set cell_handle [get_bd_cells $cellpath] + set all_busif [get_bd_intf_pins $cellpath/*] + set axi_standard_param_list [list ID_WIDTH AWUSER_WIDTH ARUSER_WIDTH WUSER_WIDTH RUSER_WIDTH BUSER_WIDTH] + + foreach busif $all_busif { + if { [string equal -nocase [get_property CONFIG.PROTOCOL $busif] "AXI4"] != 1 } { + continue + } + if { [string equal -nocase [get_property MODE $busif] "slave"] != 1 } { + continue + } + + set busif_name [get_property NAME $busif] + foreach tparam $axi_standard_param_list { + set busif_param_name "C_${busif_name}_${tparam}" + + set val_on_cell_intf_pin [get_property CONFIG.${tparam} $busif] + set val_on_cell [get_property CONFIG.${busif_param_name} $cell_handle] + + if { [string equal -nocase $val_on_cell_intf_pin $val_on_cell] != 1 } { + #override property of bd_interface_net to bd_cell -- only for slaves. May check for supported values.. + if { $val_on_cell_intf_pin != "" } { + set_property CONFIG.${busif_param_name} $val_on_cell_intf_pin $cell_handle + } + } + } + } +} + diff --git a/Cortex-M0/nanosoc/systems/mcu/fpga_imp/ip_repo/ft1248x1_to_stream8_1.0/component.xml b/Cortex-M0/nanosoc/systems/mcu/fpga_imp/ip_repo/ft1248x1_to_stream8_1.0/component.xml new file mode 100644 index 0000000..c9d8d6e --- /dev/null +++ b/Cortex-M0/nanosoc/systems/mcu/fpga_imp/ip_repo/ft1248x1_to_stream8_1.0/component.xml @@ -0,0 +1,127 @@ +<?xml version="1.0" encoding="UTF-8"?> +<spirit:component xmlns:xilinx="http://www.xilinx.com" xmlns:spirit="http://www.spiritconsortium.org/XMLSchema/SPIRIT/1685-2009" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> + <spirit:vendor>soclabs.org</spirit:vendor> + <spirit:library>ip</spirit:library> + <spirit:name>ft1248x1_to_stream8_1.0</spirit:name> + <spirit:version>1.0</spirit:version> + <spirit:model> + <spirit:views> + <spirit:view> + <spirit:name>xilinx_anylanguagesynthesis</spirit:name> + <spirit:displayName>Synthesis</spirit:displayName> + <spirit:envIdentifier>:vivado.xilinx.com:synthesis</spirit:envIdentifier> + <spirit:language>Verilog</spirit:language> + <spirit:fileSetRef> + <spirit:localName>xilinx_anylanguagesynthesis_view_fileset</spirit:localName> + </spirit:fileSetRef> + <spirit:parameters> + <spirit:parameter> + <spirit:name>viewChecksum</spirit:name> + <spirit:value>5c0c346d</spirit:value> + </spirit:parameter> + </spirit:parameters> + </spirit:view> + <spirit:view> + <spirit:name>xilinx_anylanguagebehavioralsimulation</spirit:name> + <spirit:displayName>Simulation</spirit:displayName> + <spirit:envIdentifier>:vivado.xilinx.com:simulation</spirit:envIdentifier> + <spirit:language>Verilog</spirit:language> + <spirit:fileSetRef> + <spirit:localName>xilinx_anylanguagebehavioralsimulation_view_fileset</spirit:localName> + </spirit:fileSetRef> + <spirit:parameters> + <spirit:parameter> + <spirit:name>viewChecksum</spirit:name> + <spirit:value>5c0c346d</spirit:value> + </spirit:parameter> + </spirit:parameters> + </spirit:view> + </spirit:views> + </spirit:model> + <spirit:fileSets> + <spirit:fileSet> + <spirit:name>xilinx_anylanguagesynthesis_view_fileset</spirit:name> + <spirit:file> + <spirit:name>src/synclib.v</spirit:name> + <spirit:fileType>verilogSource</spirit:fileType> + <spirit:logicalName>ft1248x1_to_stream8_1.0</spirit:logicalName> + </spirit:file> + <spirit:file> + <spirit:name>src/ft1248x1_to_stream8.v</spirit:name> + <spirit:fileType>verilogSource</spirit:fileType> + <spirit:userFileType>CHECKSUM_06e9a745</spirit:userFileType> + <spirit:logicalName>ft1248x1_to_stream8_1.0</spirit:logicalName> + </spirit:file> + </spirit:fileSet> + <spirit:fileSet> + <spirit:name>xilinx_anylanguagebehavioralsimulation_view_fileset</spirit:name> + <spirit:file> + <spirit:name>src/synclib.v</spirit:name> + <spirit:fileType>verilogSource</spirit:fileType> + <spirit:logicalName>ft1248x1_to_stream8_1.0</spirit:logicalName> + </spirit:file> + <spirit:file> + <spirit:name>src/ft1248x1_to_stream8.v</spirit:name> + <spirit:fileType>verilogSource</spirit:fileType> + <spirit:logicalName>ft1248x1_to_stream8_1.0</spirit:logicalName> + </spirit:file> + </spirit:fileSet> + </spirit:fileSets> + <spirit:description>ft1248x1_to_stream8_1.0:1.0</spirit:description> + <spirit:parameters> + <spirit:parameter> + <spirit:name>Component_Name</spirit:name> + <spirit:value spirit:resolve="user" spirit:id="PARAM_VALUE.Component_Name" spirit:order="1">ft1248x1_to_stream8_1_0_v1_0</spirit:value> + </spirit:parameter> + </spirit:parameters> + <spirit:vendorExtensions> + <xilinx:coreExtensions> + <xilinx:taxonomies> + <xilinx:taxonomy>/AXI_Infrastructure</xilinx:taxonomy> + <xilinx:taxonomy>/Debug_&_Verification/Debug</xilinx:taxonomy> + <xilinx:taxonomy>/Embedded_Processing/Debug_&_Verification/Debug</xilinx:taxonomy> + </xilinx:taxonomies> + <xilinx:displayName>ft1248x1_to_stream8_1.0_v1_0</xilinx:displayName> + <xilinx:hideInCatalogGUI>true</xilinx:hideInCatalogGUI> + <xilinx:definitionSource>package_project</xilinx:definitionSource> + <xilinx:vendorDisplayName>soclabs.org</xilinx:vendorDisplayName> + <xilinx:vendorURL>http://soclabs.org</xilinx:vendorURL> + <xilinx:coreRevision>1</xilinx:coreRevision> + <xilinx:upgrades> + <xilinx:canUpgradeFrom>xilinx.com:ip:ft1248x1_to_stream8_1.0:1.0</xilinx:canUpgradeFrom> + </xilinx:upgrades> + <xilinx:coreCreationDateTime>2022-08-18T13:41:50Z</xilinx:coreCreationDateTime> + <xilinx:tags> + <xilinx:tag xilinx:name="ui.data.coregen.df@554a8be0_ARCHIVE_LOCATION">/home/dwf1m12/soclabs_git/soclabs-cortexm0-mcu/Cortex-M0/soclabs_demo/systems/cortex_m0_mcu/fpga_imp/ip_repo/ft1248x1_to_stream8_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.df@2c2e0f51_ARCHIVE_LOCATION">/home/dwf1m12/soclabs_git/soclabs-cortexm0-mcu/Cortex-M0/soclabs_demo/systems/cortex_m0_mcu/fpga_imp/ip_repo/ft1248x1_to_stream8_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.df@4bf8650c_ARCHIVE_LOCATION">/home/dwf1m12/soclabs_git/soclabs-cortexm0-mcu/Cortex-M0/soclabs_demo/systems/cortex_m0_mcu/fpga_imp/ip_repo/ft1248x1_to_stream8_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.df@50a2d20f_ARCHIVE_LOCATION">/home/dwf1m12/soclabs_git/soclabs-cortexm0-mcu/Cortex-M0/soclabs_demo/systems/cortex_m0_mcu/fpga_imp/ip_repo/ft1248x1_to_stream8_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.df@679c5188_ARCHIVE_LOCATION">/home/dwf1m12/soclabs_git/soclabs-cortexm0-mcu/Cortex-M0/soclabs_demo/systems/cortex_m0_mcu/fpga_imp/ip_repo/ft1248x1_to_stream8_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.df@61453e2b_ARCHIVE_LOCATION">/home/dwf1m12/soclabs_git/soclabs-cortexm0-mcu/Cortex-M0/soclabs_demo/systems/cortex_m0_mcu/fpga_imp/ip_repo/ft1248x1_to_stream8_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.df@20d8eb40_ARCHIVE_LOCATION">/home/dwf1m12/soclabs_git/soclabs-cortexm0-mcu/Cortex-M0/soclabs_demo/systems/cortex_m0_mcu/fpga_imp/ip_repo/ft1248x1_to_stream8_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.df@9d02819_ARCHIVE_LOCATION">/home/dwf1m12/soclabs_git/soclabs-cortexm0-mcu/Cortex-M0/soclabs_demo/systems/cortex_m0_mcu/fpga_imp/ip_repo/ft1248x1_to_stream8_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.df@1f726801_ARCHIVE_LOCATION">/home/dwf1m12/soclabs_git/soclabs-cortexm0-mcu/Cortex-M0/soclabs_demo/systems/cortex_m0_mcu/fpga_imp/ip_repo/ft1248x1_to_stream8_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.df@7d50b16d_ARCHIVE_LOCATION">/home/dwf1m12/soclabs_git/soclabs-cortexm0-mcu/Cortex-M0/soclabs_demo/systems/cortex_m0_mcu/fpga_imp/ip_repo/ft1248x1_to_stream8_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.df@558791b8_ARCHIVE_LOCATION">/home/dwf1m12/soclabs_git/soclabs-cortexm0-mcu/Cortex-M0/soclabs_demo/systems/cortex_m0_mcu/fpga_imp/ip_repo/ft1248x1_to_stream8_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.df@dade147_ARCHIVE_LOCATION">/home/dwf1m12/soclabs_git/soclabs-cortexm0-mcu/Cortex-M0/soclabs_demo/systems/cortex_m0_mcu/fpga_imp/ip_repo/ft1248x1_to_stream8_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.df@50c7becf_ARCHIVE_LOCATION">/home/dwf1m12/soclabs_git/soclabs-cortexm0-mcu/Cortex-M0/soclabs_demo/systems/cortex_m0_mcu/fpga_imp/ip_repo/ft1248x1_to_stream8_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.df@134862eb_ARCHIVE_LOCATION">/home/dwf1m12/soclabs_git/soclabs-cortexm0-mcu/Cortex-M0/soclabs_demo/systems/cortex_m0_mcu/fpga_imp/ip_repo/ft1248x1_to_stream8_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.df@4c308b0f_ARCHIVE_LOCATION">/home/dwf1m12/soclabs_git/soclabs-cortexm0-mcu/Cortex-M0/soclabs_demo/systems/cortex_m0_mcu/fpga_imp/ip_repo/ft1248x1_to_stream8_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.df@174caa76_ARCHIVE_LOCATION">/home/dwf1m12/soclabs_git/soclabs-cortexm0-mcu/Cortex-M0/soclabs_demo/systems/cortex_m0_mcu/fpga_imp/ip_repo/ft1248x1_to_stream8_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.df@33e02927_ARCHIVE_LOCATION">/home/dwf1m12/soclabs_git/soclabs-cortexm0-mcu/Cortex-M0/soclabs_demo/systems/cortex_m0_mcu/fpga_imp/ip_repo/ft1248x1_to_stream8_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.df@1bc1eca_ARCHIVE_LOCATION">/home/dwf1m12/soclabs_git/soclabs-cortexm0-mcu/Cortex-M0/soclabs_demo/systems/cortex_m0_mcu/fpga_imp/ip_repo/ft1248x1_to_stream8_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.df@247a24c1_ARCHIVE_LOCATION">/home/dwf1m12/soclabs_git/soclabs-cortexm0-mcu/Cortex-M0/soclabs_demo/systems/cortex_m0_mcu/fpga_imp/ip_repo/ft1248x1_to_stream8_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.df@7f189307_ARCHIVE_LOCATION">/home/dwf1m12/soclabs_git/soclabs-cortexm0-mcu/Cortex-M0/soclabs_demo/systems/cortex_m0_mcu/fpga_imp/ip_repo/ft1248x1_to_stream8_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.df@4fc3a402_ARCHIVE_LOCATION">/home/dwf1m12/soclabs_git/soclabs-cortexm0-mcu/Cortex-M0/soclabs_demo/systems/cortex_m0_mcu/fpga_imp/ip_repo/ft1248x1_to_stream8_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.df@62f43e05_ARCHIVE_LOCATION">/home/dwf1m12/soclabs_git/soclabs-cortexm0-mcu/Cortex-M0/soclabs_demo/systems/cortex_m0_mcu/fpga_imp/ip_repo/ft1248x1_to_stream8_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.df@7f223669_ARCHIVE_LOCATION">/home/dwf1m12/soclabs_git/soclabs-cortexm0-mcu/Cortex-M0/soclabs_demo/systems/cortex_m0_mcu/fpga_imp/ip_repo/ft1248x1_to_stream8_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.df@77281e8f_ARCHIVE_LOCATION">/home/dwf1m12/soclabs_git/soclabs-cortexm0-mcu/Cortex-M0/soclabs_demo/systems/cortex_m0_mcu/fpga_imp/ip_repo/ft1248x1_to_stream8_1.0</xilinx:tag> + </xilinx:tags> + </xilinx:coreExtensions> + <xilinx:packagingInfo> + <xilinx:xilinxVersion>2021.1</xilinx:xilinxVersion> + <xilinx:checksum xilinx:scope="fileGroups" xilinx:value="8af10ea9"/> + <xilinx:checksum xilinx:scope="parameters" xilinx:value="f93808b1"/> + </xilinx:packagingInfo> + </spirit:vendorExtensions> +</spirit:component> diff --git a/Cortex-M0/nanosoc/systems/mcu/fpga_imp/ip_repo/ft1248x1_to_stream8_1.0/ft1248x1_to_stream8_0.xcix b/Cortex-M0/nanosoc/systems/mcu/fpga_imp/ip_repo/ft1248x1_to_stream8_1.0/ft1248x1_to_stream8_0.xcix new file mode 100644 index 0000000000000000000000000000000000000000..1b2410ad1ecde98574e898028f41ad55c1c8f3b1 GIT binary patch literal 253 zcmWIWW@gc4U}NB5XqqS(`mg`;-f9L0hK&pi3~US{49UrQ6}dT#3<3=3VDrZHC(Z_H zc<XANJ9B<>sL>VUfFO^v-sk*Jp7Guu%EeoFd27I??T<GVp40a#J$GK)^UN7<-JlP? zXHMyJHD@wqeLQ={S#ZPSpa6!~g{RMWZuQnSG%?z^!k|b0WWT<irkC%TtsUkUj%%$7 zpExITG5;psHIumywcXA+&dLzr&B!FeEP}()5Qj1{Ffc4>1hFAr2=HcQ1MwIc7#U0$ K7#KE#I1B(r*H8NZ literal 0 HcmV?d00001 diff --git a/Cortex-M0/nanosoc/systems/mcu/fpga_imp/ip_repo/ft1248x1_to_stream8_1.0/hdl/ft1248x1_to_stream8_v1_0.v b/Cortex-M0/nanosoc/systems/mcu/fpga_imp/ip_repo/ft1248x1_to_stream8_1.0/hdl/ft1248x1_to_stream8_v1_0.v new file mode 100644 index 0000000..822ab4c --- /dev/null +++ b/Cortex-M0/nanosoc/systems/mcu/fpga_imp/ip_repo/ft1248x1_to_stream8_1.0/hdl/ft1248x1_to_stream8_v1_0.v @@ -0,0 +1,75 @@ + +`timescale 1 ns / 1 ps + + module ft1248x1_to_stream8_v1_0 # + ( + // Users to add parameters here + + // User parameters ends + // Do not modify the parameters beyond this line + + + // Parameters of Axi Slave Bus Interface RXD8 + parameter integer C_RXD8_TDATA_WIDTH = 32, + + // Parameters of Axi Master Bus Interface TXD8 + parameter integer C_TXD8_TDATA_WIDTH = 32, + parameter integer C_TXD8_START_COUNT = 32 + ) + ( + // Users to add ports here + + // User ports ends + // Do not modify the ports beyond this line + + + // Ports of Axi Slave Bus Interface RXD8 + input wire rxd8_aclk, + input wire rxd8_aresetn, + output wire rxd8_tready, + input wire [C_RXD8_TDATA_WIDTH-1 : 0] rxd8_tdata, + input wire [(C_RXD8_TDATA_WIDTH/8)-1 : 0] rxd8_tstrb, + input wire rxd8_tlast, + input wire rxd8_tvalid, + + // Ports of Axi Master Bus Interface TXD8 + input wire txd8_aclk, + input wire txd8_aresetn, + output wire txd8_tvalid, + output wire [C_TXD8_TDATA_WIDTH-1 : 0] txd8_tdata, + output wire [(C_TXD8_TDATA_WIDTH/8)-1 : 0] txd8_tstrb, + output wire txd8_tlast, + input wire txd8_tready + ); +// Instantiation of Axi Bus Interface RXD8 + ft1248x1_to_stream8_v1_0_RXD8 # ( + .C_S_AXIS_TDATA_WIDTH(C_RXD8_TDATA_WIDTH) + ) ft1248x1_to_stream8_v1_0_RXD8_inst ( + .S_AXIS_ACLK(rxd8_aclk), + .S_AXIS_ARESETN(rxd8_aresetn), + .S_AXIS_TREADY(rxd8_tready), + .S_AXIS_TDATA(rxd8_tdata), + .S_AXIS_TSTRB(rxd8_tstrb), + .S_AXIS_TLAST(rxd8_tlast), + .S_AXIS_TVALID(rxd8_tvalid) + ); + +// Instantiation of Axi Bus Interface TXD8 + ft1248x1_to_stream8_v1_0_TXD8 # ( + .C_M_AXIS_TDATA_WIDTH(C_TXD8_TDATA_WIDTH), + .C_M_START_COUNT(C_TXD8_START_COUNT) + ) ft1248x1_to_stream8_v1_0_TXD8_inst ( + .M_AXIS_ACLK(txd8_aclk), + .M_AXIS_ARESETN(txd8_aresetn), + .M_AXIS_TVALID(txd8_tvalid), + .M_AXIS_TDATA(txd8_tdata), + .M_AXIS_TSTRB(txd8_tstrb), + .M_AXIS_TLAST(txd8_tlast), + .M_AXIS_TREADY(txd8_tready) + ); + + // Add user logic here + + // User logic ends + + endmodule diff --git a/Cortex-M0/nanosoc/systems/mcu/fpga_imp/ip_repo/ft1248x1_to_stream8_1.0/hdl/ft1248x1_to_stream8_v1_0_RXD8.v b/Cortex-M0/nanosoc/systems/mcu/fpga_imp/ip_repo/ft1248x1_to_stream8_1.0/hdl/ft1248x1_to_stream8_v1_0_RXD8.v new file mode 100644 index 0000000..9b39ac6 --- /dev/null +++ b/Cortex-M0/nanosoc/systems/mcu/fpga_imp/ip_repo/ft1248x1_to_stream8_1.0/hdl/ft1248x1_to_stream8_v1_0_RXD8.v @@ -0,0 +1,167 @@ + +`timescale 1 ns / 1 ps + + module ft1248x1_to_stream8_v1_0_RXD8 # + ( + // Users to add parameters here + + // User parameters ends + // Do not modify the parameters beyond this line + + // AXI4Stream sink: Data Width + parameter integer C_S_AXIS_TDATA_WIDTH = 32 + ) + ( + // Users to add ports here + + // User ports ends + // Do not modify the ports beyond this line + + // AXI4Stream sink: Clock + input wire S_AXIS_ACLK, + // AXI4Stream sink: Reset + input wire S_AXIS_ARESETN, + // Ready to accept data in + output wire S_AXIS_TREADY, + // Data in + input wire [C_S_AXIS_TDATA_WIDTH-1 : 0] S_AXIS_TDATA, + // Byte qualifier + input wire [(C_S_AXIS_TDATA_WIDTH/8)-1 : 0] S_AXIS_TSTRB, + // Indicates boundary of last packet + input wire S_AXIS_TLAST, + // Data is in valid + input wire S_AXIS_TVALID + ); + // function called clogb2 that returns an integer which has the + // value of the ceiling of the log base 2. + function integer clogb2 (input integer bit_depth); + begin + for(clogb2=0; bit_depth>0; clogb2=clogb2+1) + bit_depth = bit_depth >> 1; + end + endfunction + + // Total number of input data. + localparam NUMBER_OF_INPUT_WORDS = 8; + // bit_num gives the minimum number of bits needed to address 'NUMBER_OF_INPUT_WORDS' size of FIFO. + localparam bit_num = clogb2(NUMBER_OF_INPUT_WORDS-1); + // Define the states of state machine + // The control state machine oversees the writing of input streaming data to the FIFO, + // and outputs the streaming data from the FIFO + parameter [1:0] IDLE = 1'b0, // This is the initial/idle state + + WRITE_FIFO = 1'b1; // In this state FIFO is written with the + // input stream data S_AXIS_TDATA + wire axis_tready; + // State variable + reg mst_exec_state; + // FIFO implementation signals + genvar byte_index; + // FIFO write enable + wire fifo_wren; + // FIFO full flag + reg fifo_full_flag; + // FIFO write pointer + reg [bit_num-1:0] write_pointer; + // sink has accepted all the streaming data and stored in FIFO + reg writes_done; + // I/O Connections assignments + + assign S_AXIS_TREADY = axis_tready; + // Control state machine implementation + always @(posedge S_AXIS_ACLK) + begin + if (!S_AXIS_ARESETN) + // Synchronous reset (active low) + begin + mst_exec_state <= IDLE; + end + else + case (mst_exec_state) + IDLE: + // The sink starts accepting tdata when + // there tvalid is asserted to mark the + // presence of valid streaming data + if (S_AXIS_TVALID) + begin + mst_exec_state <= WRITE_FIFO; + end + else + begin + mst_exec_state <= IDLE; + end + WRITE_FIFO: + // When the sink has accepted all the streaming input data, + // the interface swiches functionality to a streaming master + if (writes_done) + begin + mst_exec_state <= IDLE; + end + else + begin + // The sink accepts and stores tdata + // into FIFO + mst_exec_state <= WRITE_FIFO; + end + + endcase + end + // AXI Streaming Sink + // + // The example design sink is always ready to accept the S_AXIS_TDATA until + // the FIFO is not filled with NUMBER_OF_INPUT_WORDS number of input words. + assign axis_tready = ((mst_exec_state == WRITE_FIFO) && (write_pointer <= NUMBER_OF_INPUT_WORDS-1)); + + always@(posedge S_AXIS_ACLK) + begin + if(!S_AXIS_ARESETN) + begin + write_pointer <= 0; + writes_done <= 1'b0; + end + else + if (write_pointer <= NUMBER_OF_INPUT_WORDS-1) + begin + if (fifo_wren) + begin + // write pointer is incremented after every write to the FIFO + // when FIFO write signal is enabled. + write_pointer <= write_pointer + 1; + writes_done <= 1'b0; + end + if ((write_pointer == NUMBER_OF_INPUT_WORDS-1)|| S_AXIS_TLAST) + begin + // reads_done is asserted when NUMBER_OF_INPUT_WORDS numbers of streaming data + // has been written to the FIFO which is also marked by S_AXIS_TLAST(kept for optional usage). + writes_done <= 1'b1; + end + end + end + + // FIFO write enable generation + assign fifo_wren = S_AXIS_TVALID && axis_tready; + + // FIFO Implementation + generate + for(byte_index=0; byte_index<= (C_S_AXIS_TDATA_WIDTH/8-1); byte_index=byte_index+1) + begin:FIFO_GEN + + reg [(C_S_AXIS_TDATA_WIDTH/4)-1:0] stream_data_fifo [0 : NUMBER_OF_INPUT_WORDS-1]; + + // Streaming input data is stored in FIFO + + always @( posedge S_AXIS_ACLK ) + begin + if (fifo_wren)// && S_AXIS_TSTRB[byte_index]) + begin + stream_data_fifo[write_pointer] <= S_AXIS_TDATA[(byte_index*8+7) -: 8]; + end + end + end + endgenerate + + // Add user logic here + + // User logic ends + + endmodule diff --git a/Cortex-M0/nanosoc/systems/mcu/fpga_imp/ip_repo/ft1248x1_to_stream8_1.0/hdl/ft1248x1_to_stream8_v1_0_TXD8.v b/Cortex-M0/nanosoc/systems/mcu/fpga_imp/ip_repo/ft1248x1_to_stream8_1.0/hdl/ft1248x1_to_stream8_v1_0_TXD8.v new file mode 100644 index 0000000..3abf9f8 --- /dev/null +++ b/Cortex-M0/nanosoc/systems/mcu/fpga_imp/ip_repo/ft1248x1_to_stream8_1.0/hdl/ft1248x1_to_stream8_v1_0_TXD8.v @@ -0,0 +1,228 @@ + +`timescale 1 ns / 1 ps + + module ft1248x1_to_stream8_v1_0_TXD8 # + ( + // Users to add parameters here + + // User parameters ends + // Do not modify the parameters beyond this line + + // Width of S_AXIS address bus. The slave accepts the read and write addresses of width C_M_AXIS_TDATA_WIDTH. + parameter integer C_M_AXIS_TDATA_WIDTH = 32, + // Start count is the number of clock cycles the master will wait before initiating/issuing any transaction. + parameter integer C_M_START_COUNT = 32 + ) + ( + // Users to add ports here + + // User ports ends + // Do not modify the ports beyond this line + + // Global ports + input wire M_AXIS_ACLK, + // + input wire M_AXIS_ARESETN, + // Master Stream Ports. TVALID indicates that the master is driving a valid transfer, A transfer takes place when both TVALID and TREADY are asserted. + output wire M_AXIS_TVALID, + // TDATA is the primary payload that is used to provide the data that is passing across the interface from the master. + output wire [C_M_AXIS_TDATA_WIDTH-1 : 0] M_AXIS_TDATA, + // TSTRB is the byte qualifier that indicates whether the content of the associated byte of TDATA is processed as a data byte or a position byte. + output wire [(C_M_AXIS_TDATA_WIDTH/8)-1 : 0] M_AXIS_TSTRB, + // TLAST indicates the boundary of a packet. + output wire M_AXIS_TLAST, + // TREADY indicates that the slave can accept a transfer in the current cycle. + input wire M_AXIS_TREADY + ); + // Total number of output data + localparam NUMBER_OF_OUTPUT_WORDS = 8; + + // function called clogb2 that returns an integer which has the + // value of the ceiling of the log base 2. + function integer clogb2 (input integer bit_depth); + begin + for(clogb2=0; bit_depth>0; clogb2=clogb2+1) + bit_depth = bit_depth >> 1; + end + endfunction + + // WAIT_COUNT_BITS is the width of the wait counter. + localparam integer WAIT_COUNT_BITS = clogb2(C_M_START_COUNT-1); + + // bit_num gives the minimum number of bits needed to address 'depth' size of FIFO. + localparam bit_num = clogb2(NUMBER_OF_OUTPUT_WORDS); + + // Define the states of state machine + // The control state machine oversees the writing of input streaming data to the FIFO, + // and outputs the streaming data from the FIFO + parameter [1:0] IDLE = 2'b00, // This is the initial/idle state + + INIT_COUNTER = 2'b01, // This state initializes the counter, once + // the counter reaches C_M_START_COUNT count, + // the state machine changes state to SEND_STREAM + SEND_STREAM = 2'b10; // In this state the + // stream data is output through M_AXIS_TDATA + // State variable + reg [1:0] mst_exec_state; + // Example design FIFO read pointer + reg [bit_num-1:0] read_pointer; + + // AXI Stream internal signals + //wait counter. The master waits for the user defined number of clock cycles before initiating a transfer. + reg [WAIT_COUNT_BITS-1 : 0] count; + //streaming data valid + wire axis_tvalid; + //streaming data valid delayed by one clock cycle + reg axis_tvalid_delay; + //Last of the streaming data + wire axis_tlast; + //Last of the streaming data delayed by one clock cycle + reg axis_tlast_delay; + //FIFO implementation signals + reg [C_M_AXIS_TDATA_WIDTH-1 : 0] stream_data_out; + wire tx_en; + //The master has issued all the streaming data stored in FIFO + reg tx_done; + + + // I/O Connections assignments + + assign M_AXIS_TVALID = axis_tvalid_delay; + assign M_AXIS_TDATA = stream_data_out; + assign M_AXIS_TLAST = axis_tlast_delay; + assign M_AXIS_TSTRB = {(C_M_AXIS_TDATA_WIDTH/8){1'b1}}; + + + // Control state machine implementation + always @(posedge M_AXIS_ACLK) + begin + if (!M_AXIS_ARESETN) + // Synchronous reset (active low) + begin + mst_exec_state <= IDLE; + count <= 0; + end + else + case (mst_exec_state) + IDLE: + // The slave starts accepting tdata when + // there tvalid is asserted to mark the + // presence of valid streaming data + //if ( count == 0 ) + // begin + mst_exec_state <= INIT_COUNTER; + // end + //else + // begin + // mst_exec_state <= IDLE; + // end + + INIT_COUNTER: + // The slave starts accepting tdata when + // there tvalid is asserted to mark the + // presence of valid streaming data + if ( count == C_M_START_COUNT - 1 ) + begin + mst_exec_state <= SEND_STREAM; + end + else + begin + count <= count + 1; + mst_exec_state <= INIT_COUNTER; + end + + SEND_STREAM: + // The example design streaming master functionality starts + // when the master drives output tdata from the FIFO and the slave + // has finished storing the S_AXIS_TDATA + if (tx_done) + begin + mst_exec_state <= IDLE; + end + else + begin + mst_exec_state <= SEND_STREAM; + end + endcase + end + + + //tvalid generation + //axis_tvalid is asserted when the control state machine's state is SEND_STREAM and + //number of output streaming data is less than the NUMBER_OF_OUTPUT_WORDS. + assign axis_tvalid = ((mst_exec_state == SEND_STREAM) && (read_pointer < NUMBER_OF_OUTPUT_WORDS)); + + // AXI tlast generation + // axis_tlast is asserted number of output streaming data is NUMBER_OF_OUTPUT_WORDS-1 + // (0 to NUMBER_OF_OUTPUT_WORDS-1) + assign axis_tlast = (read_pointer == NUMBER_OF_OUTPUT_WORDS-1); + + + // Delay the axis_tvalid and axis_tlast signal by one clock cycle + // to match the latency of M_AXIS_TDATA + always @(posedge M_AXIS_ACLK) + begin + if (!M_AXIS_ARESETN) + begin + axis_tvalid_delay <= 1'b0; + axis_tlast_delay <= 1'b0; + end + else + begin + axis_tvalid_delay <= axis_tvalid; + axis_tlast_delay <= axis_tlast; + end + end + + + //read_pointer pointer + + always@(posedge M_AXIS_ACLK) + begin + if(!M_AXIS_ARESETN) + begin + read_pointer <= 0; + tx_done <= 1'b0; + end + else + if (read_pointer <= NUMBER_OF_OUTPUT_WORDS-1) + begin + if (tx_en) + // read pointer is incremented after every read from the FIFO + // when FIFO read signal is enabled. + begin + read_pointer <= read_pointer + 1; + tx_done <= 1'b0; + end + end + else if (read_pointer == NUMBER_OF_OUTPUT_WORDS) + begin + // tx_done is asserted when NUMBER_OF_OUTPUT_WORDS numbers of streaming data + // has been out. + tx_done <= 1'b1; + end + end + + + //FIFO read enable generation + + assign tx_en = M_AXIS_TREADY && axis_tvalid; + + // Streaming output data is read from FIFO + always @( posedge M_AXIS_ACLK ) + begin + if(!M_AXIS_ARESETN) + begin + stream_data_out <= 1; + end + else if (tx_en)// && M_AXIS_TSTRB[byte_index] + begin + stream_data_out <= read_pointer + 32'b1; + end + end + + // Add user logic here + + // User logic ends + + endmodule diff --git a/Cortex-M0/nanosoc/systems/mcu/fpga_imp/ip_repo/ft1248x1_to_stream8_1.0/ip_project_archive.zip b/Cortex-M0/nanosoc/systems/mcu/fpga_imp/ip_repo/ft1248x1_to_stream8_1.0/ip_project_archive.zip new file mode 100755 index 0000000000000000000000000000000000000000..e67e74bbc9ca5ffffb895c6ce630825d07197fa2 GIT binary patch literal 19366 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 literal 0 HcmV?d00001 diff --git a/Cortex-M0/nanosoc/systems/mcu/fpga_imp/ip_repo/ft1248x1_to_stream8_1.0/soclabs.org_user_ft1248x1_to_stream8_1.0.zip b/Cortex-M0/nanosoc/systems/mcu/fpga_imp/ip_repo/ft1248x1_to_stream8_1.0/soclabs.org_user_ft1248x1_to_stream8_1.0.zip new file mode 100644 index 0000000000000000000000000000000000000000..bd8f20f74f0cc9c44da89578d526ab1afbd7f276 GIT binary patch literal 22475 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 a;5x}7z?+o~q=uD&l_7wUfgv>v!~+0G+E0-H literal 0 HcmV?d00001 diff --git a/Cortex-M0/nanosoc/systems/mcu/fpga_imp/ip_repo/ft1248x1_to_stream8_1.0/src/ft1248x1_to_stream8.v b/Cortex-M0/nanosoc/systems/mcu/fpga_imp/ip_repo/ft1248x1_to_stream8_1.0/src/ft1248x1_to_stream8.v new file mode 100755 index 0000000..6c55abc --- /dev/null +++ b/Cortex-M0/nanosoc/systems/mcu/fpga_imp/ip_repo/ft1248x1_to_stream8_1.0/src/ft1248x1_to_stream8.v @@ -0,0 +1,187 @@ +//----------------------------------------------------------------------------- +// FT1248 1-bit-data to 8-bit AXI-Stream IO +// A joint work commissioned on behalf of SoC Labs, under Arm Academic Access license. +// +// Contributors +// +// David Flynn (d.w.flynn@soton.ac.uk) +// +// Copyright � 2022, SoC Labs (www.soclabs.org) +//----------------------------------------------------------------------------- + +//----------------------------------------------------------------------------- +// Abstract : FT1248 1-bit data off-chip interface (emulate FT232H device) +//----------------------------------------------------------------------------- + + +module ft1248x1_to_stream8 + ( + input wire ft_clk_i, // SCLK + input wire ft_ssn_i, // SS_N + output wire ft_miso_o, // MISO +// inout wire ft_miosio_io, // MIOSIO tristate output control + input wire ft_miosio_i, + output wire ft_miosio_o, + output wire ft_miosio_z, +// assign ft_miosio_io = (ft_miosio_z) ? 1'bz : ft_miosio_o;// tri-state pad control for MIOSIO +// +// assign #1 ft_miosio_i = ft_miosio_io; //add notional delay on inout to ensure last "half-bit" on FT1248TXD is sampled before tri-stated + + input wire clk, // external primary clock + input wire resetn, // external reset (active low) + + // Ports of Axi stream Bus Interface TXD + output wire txd_tvalid_o, + output wire [7 : 0] txd_tdata8_o, + input wire txd_tready_i, + + // Ports of Axi stream Bus Interface RXD + output wire rxd_tready_o, + input wire [7 : 0] rxd_tdata8_i, + input wire rxd_tvalid_i + + ); + +//wire ft_clk; +wire ft_clk_rising; +wire ft_clk_falling; + +wire ft_ssn; +//wire ft_ssn_rising; +//wire ft_ssn_falling; + +SYNCHRONIZER_EDGES u_xync_ft_clk ( + .testmode_i(1'b0), + .clk_i(clk), + .reset_n_i(resetn), + .asyn_i(ft_clk_i), + .syn_o(), + .posedge_o(ft_clk_rising), + .negedge_o(ft_clk_falling) + ); + +SYNCHRONIZER_EDGES u_xync_ft_ssn ( + .testmode_i(1'b0), + .clk_i(clk), + .reset_n_i(resetn), + .asyn_i(ft_ssn_i), + .syn_o(ft_ssn), + .posedge_o( ), + .negedge_o( ) + ); + +//---------------------------------------------- +//-- FT1248 1-bit protocol State Machine +//---------------------------------------------- + +reg [4:0] ft_state; // 17-state for bit-serial +wire [4:0] ft_nextstate = ft_state + 5'b00001; + +// advance state count on rising edge of ft_clk +always @(posedge clk or negedge resetn) + if (!resetn) + ft_state <= 5'b11111; + else if (ft_ssn) // sync reset + ft_state <= 5'b11111; + else if (ft_clk_rising) // loop if multi-data +// ft_state <= (ft_state == 5'b01111) ? 5'b01000 : ft_nextstate; + ft_state <= ft_nextstate; + +// 16: bus turnaround (or bit[5]) +// 0 for CMD3 +// 3 for CMD2 +// 5 for CMD1 +// 6 for CMD0 +// 7 for cmd turnaround +// 8 for data bit0 +// 9 for data bit1 +// 10 for data bit2 +// 11 for data bit3 +// 12 for data bit4 +// 13 for data bit5 +// 14 for data bit6 +// 15 for data bit7 + +// capture 7-bit CMD on falling edge of clock (mid-data) +reg [7:0] ft_cmd; +// - valid sample ready after 7th edge (ready RX or TX data phase functionality) +always @(posedge clk or negedge resetn) + if (!resetn) + ft_cmd <= 8'b00000001; + else if (ft_ssn) // sync reset + ft_cmd <= 8'b00000001; + else if (ft_clk_falling & !ft_state[3] & !ft_nextstate[3]) // on shift if CMD phase) + ft_cmd <= {ft_cmd[6:0],ft_miosio_i}; + +wire ft_cmd_valid = ft_cmd[7]; +wire ft_cmd_rxd = ft_cmd[7] & !ft_cmd[6] & !ft_cmd[3] & !ft_cmd[1] & ft_cmd[0]; +wire ft_cmd_txd = ft_cmd[7] & !ft_cmd[6] & !ft_cmd[3] & !ft_cmd[1] & !ft_cmd[0]; + +// tristate enable for miosio (deselected status or serialized data for read command) +wire ft_miosio_e = ft_ssn_i | (ft_cmd_rxd & !ft_state[4] & ft_state[3]); +assign ft_miosio_z = !ft_miosio_e; + +// capture (ft_cmd_txd) serial data out on falling edge of clock +// bit [0] indicated byte valid +reg [7:0] rxd_sr; +always @(posedge clk or negedge resetn) + if (!resetn) + rxd_sr <= 8'b00000000; + else if (ft_ssn) // sync reset + rxd_sr <= 8'b00000000; + else if (ft_clk_falling & ft_cmd_txd & (ft_state[4:3] == 2'b01)) //serial shift + rxd_sr <= {ft_miosio_i, rxd_sr[7:1]}; + +// AXI STREAM handshake interfaces +// TX stream delivers valid FT1248 read data transfer +// 8-bit write port with extra top-bit used as valid qualifer +reg [8:0] txstream; +always @(posedge clk or negedge resetn) + if (!resetn) + txstream <= 9'b000000000; + else if (txstream[8] & txd_tready_i) // priority clear stream data valid when accepted + txstream[8] <= 1'b0; + else if (ft_clk_falling & ft_cmd_txd & (ft_state==5'b01111)) //load as last shift arrives + txstream[8:0] <= {1'b1, 1'b0, rxd_sr[7:1]}; + +assign txd_tvalid_o = txstream[8]; +assign txd_tdata8_o = txstream[7:0]; + + +// AXI STREAM handshake interfaces +// RX stream accepts 8-bit data to transfer over FT1248 channel +// 8-bit write port with extra top-bit used as valid qualifer +reg [8:0] rxstream; +always @(posedge clk or negedge resetn) + if (!resetn) + rxstream <= 9'b000000000; + else if (!rxstream[8] & rxd_tvalid_i) // if empty can accept valid RX stream data + rxstream[8:0] <= {1'b1,rxd_tdata8_i}; + else if (rxstream[8] & ft_clk_rising & ft_cmd_rxd & (ft_state==5'b01111)) // hold until final shift completion + rxstream[8] <= 1'b0; +assign rxd_tready_o = !rxstream[8]; // ready until loaded + +// shift TXD on rising edge of clock +reg [7:0] txd_sr; +// rewrite for clocked +always @(posedge clk or negedge resetn) + if (!resetn) + txd_sr <= 8'b00000000; + else if (ft_ssn) // sync reset + txd_sr <= 8'b00000000; + else if (ft_clk_falling & ft_cmd_rxd & (ft_state == 5'b00111)) + txd_sr <= rxstream[8] ? rxstream[7:0] : 8'b00000000; + else if (ft_clk_rising & ft_cmd_rxd & (ft_state[4:3] == 2'b01)) //serial shift + txd_sr <= {1'b0,txd_sr[7:1]}; + + +//FT1248 FIFO status signals + +// ft_miso_o reflects TXF when deselected +assign ft_miosio_o = (ft_ssn_i) ? !txstream[8] : txd_sr[0]; + +// ft_miso_o reflects RXE when deselected +assign ft_miso_o = (ft_ssn_i) ? rxstream[8] : (ft_state == 5'b00111); + + +endmodule diff --git a/Cortex-M0/nanosoc/systems/mcu/fpga_imp/ip_repo/ft1248x1_to_stream8_1.0/src/synclib.v b/Cortex-M0/nanosoc/systems/mcu/fpga_imp/ip_repo/ft1248x1_to_stream8_1.0/src/synclib.v new file mode 100755 index 0000000..1daf61f --- /dev/null +++ b/Cortex-M0/nanosoc/systems/mcu/fpga_imp/ip_repo/ft1248x1_to_stream8_1.0/src/synclib.v @@ -0,0 +1,139 @@ +// A joint work commissioned on behalf of SoC Labs, under Arm Academic Access license. +// +// Contributors +// +// David Flynn (d.w.flynn@soton.ac.uk) +// +// Copyright � 2022, SoC Labs (www.soclabs.org) +//----------------------------------------------------------------------------- + +module SYNCHRONIZER ( + input wire testmode_i + ,input wire clk_i + ,input wire reset_n_i + ,input wire asyn_i + ,output wire syn_o + ); + +reg sync_stage1; +reg sync_stage2; + + always @(posedge clk_i or negedge reset_n_i) + if(~reset_n_i) begin + sync_stage1 <= 1'b0; + sync_stage2 <= 1'b0; + end + else begin + sync_stage1 <= asyn_i; + sync_stage2 <= sync_stage1; + end + +assign syn_o = (testmode_i) ? asyn_i : sync_stage2; + +endmodule + +module SYNCHRONIZER_EDGES ( + input wire testmode_i + ,input wire clk_i + ,input wire reset_n_i + ,input wire asyn_i + ,output wire syn_o + ,output wire posedge_o + ,output wire negedge_o + ); + +reg sync_stage1; +reg sync_stage2; +reg sync_stage3; + + always @(posedge clk_i or negedge reset_n_i) + if(~reset_n_i) begin + sync_stage1 <= 1'b0; + sync_stage2 <= 1'b0; + sync_stage3 <= 1'b0; + end + else begin + sync_stage1 <= asyn_i; + sync_stage2 <= sync_stage1; + sync_stage3 <= sync_stage2; + end + +assign syn_o = (testmode_i) ? asyn_i : sync_stage2; +assign posedge_o = (testmode_i) ? asyn_i : ( sync_stage2 & !sync_stage3); +assign negedge_o = (testmode_i) ? asyn_i : (!sync_stage2 & sync_stage3); + +endmodule + +module SYNCHRONIZER_RST_LO ( + input wire reset_n_i + ,input wire testmode_i + ,input wire clk_i + ,input wire asyn_i + ,output wire syn_o + ); + +reg sync_stage1; +reg sync_stage2; + + always @(posedge clk_i or negedge reset_n_i) + if(~reset_n_i) begin + sync_stage1 <= 1'b0; + sync_stage2 <= 1'b0; + end + else begin + sync_stage1 <= asyn_i; + sync_stage2 <= sync_stage1; + end +assign syn_o = (testmode_i) ? asyn_i : sync_stage2; + +endmodule + +module SYNCHRONIZER_RST_HI ( + input wire reset_n_i + ,input wire testmode_i + ,input wire clk_i + ,input wire asyn_i + ,output wire syn_o + ); + +reg sync_stage1; +reg sync_stage2; + + always @(posedge clk_i or negedge reset_n_i) + if(~reset_n_i) begin + sync_stage1 <= 1'b1; + sync_stage2 <= 1'b1; + end + else begin + sync_stage1 <= asyn_i; + sync_stage2 <= sync_stage1; + end + +assign syn_o = (testmode_i) ? asyn_i : sync_stage2; + +endmodule + + +module NRST_SYNCHRONIZER_LO ( + input wire reset_n_i + ,input wire testmode_i + ,input wire clk_i + ,output wire synreset_n_o + ); + +reg sync_stage1; +reg sync_stage2; + + always @(posedge clk_i or negedge reset_n_i) + if(~reset_n_i) begin + sync_stage1 <= 1'b0; + sync_stage2 <= 1'b0; + end + else begin + sync_stage1 <= 1'b1; + sync_stage2 <= sync_stage1; + end + +assign synreset_n_o = (testmode_i) ? reset_n_i : sync_stage2; + +endmodule diff --git a/Cortex-M0/nanosoc/systems/mcu/fpga_imp/ip_repo/ft1248x1_to_stream8_1.0/xgui/ft1248x1_to_stream8_v1_0.tcl b/Cortex-M0/nanosoc/systems/mcu/fpga_imp/ip_repo/ft1248x1_to_stream8_1.0/xgui/ft1248x1_to_stream8_v1_0.tcl new file mode 100644 index 0000000..0db18e9 --- /dev/null +++ b/Cortex-M0/nanosoc/systems/mcu/fpga_imp/ip_repo/ft1248x1_to_stream8_1.0/xgui/ft1248x1_to_stream8_v1_0.tcl @@ -0,0 +1,10 @@ +# Definitional proc to organize widgets for parameters. +proc init_gui { IPINST } { + ipgui::add_param $IPINST -name "Component_Name" + #Adding Page + ipgui::add_page $IPINST -name "Page 0" + + +} + + diff --git a/Cortex-M0/nanosoc/systems/mcu/fpga_imp/pynq_export/pz104/jupyter_notebooks/soclabs/driver/uartlite.py b/Cortex-M0/nanosoc/systems/mcu/fpga_imp/pynq_export/pz104/jupyter_notebooks/soclabs/driver/uartlite.py new file mode 100755 index 0000000..4da3b33 --- /dev/null +++ b/Cortex-M0/nanosoc/systems/mcu/fpga_imp/pynq_export/pz104/jupyter_notebooks/soclabs/driver/uartlite.py @@ -0,0 +1,88 @@ +from time import sleep, time +from pynq import MMIO + +RX_FIFO = 0x00 +TX_FIFO = 0x04 + +#Status Reg +STAT_REG = 0x08 +RX_VALID = 0 +RX_FULL = 1 +TX_EMPTY = 2 +TX_FULL = 3 +IS_INTR = 4 +OVERRUN_ERR = 5 +FRAME_ERR = 6 +PARITY_ERR =7 + +#Ctrl Reg +CTRL_REG = 0x0C +RST_TX = 0 +RST_RX = 1 +INTR_EN = 4 + +class UartLite: + def __init__(self, address): + # Setup axi core + self.uart = MMIO(address,0x10000, debug=False) + self.address = address + + def getBit(self,num,pos): + return (num&1<<pos)>>pos + + def setupCtrlReg(self): + # Reset FIFOs, disable interrupts + self.uart.write(CTRL_REG, 1<<RST_TX | 1<<RST_RX) + sleep(0.0) + self.uart.write(CTRL_REG,0) + sleep(0.0) + + def currentStatus(self): + """Returns object that specifies current status of axi core""" + status = self.uart.read(STAT_REG) + return {'RX_VALID':self.getBit(status,RX_VALID), + 'RX_FULL':self.getBit(status, RX_FULL), + 'TX_EMPTY':self.getBit(status, TX_EMPTY), + 'TX_FULL':self.getBit(status, TX_FULL), + 'IS_INTR':self.getBit(status, IS_INTR), + 'OVERRUN_ERR':self.getBit(status, OVERRUN_ERR), + 'FRAME_ERR':self.getBit(status, FRAME_ERR), + 'PARITY_ERR':self.getBit(status, PARITY_ERR)} + + def read(self, count, timeout = 1): + buf = "" + stop_time = time() + timeout + for i in range(count): + # Wait till RX fifo has valid data, skip if timeout exceeded + while (not (self.uart.read(STAT_REG) & 1<<RX_VALID)) and (time()<stop_time): + pass + if time()>=stop_time: + break + buf += chr(self.uart.read(RX_FIFO)) + return buf + + def write(self, buf, timeout = 10): + """ + buf: iterable + + """ + stop_time = time() + timeout + wr_count = 0 + for i in buf: + #Wait while TX FIFO is Full, stop waiting if timeout passes + while (self.uart.read(STAT_REG) & 1<<TX_FULL) and (time()<stop_time): + pass + # Check timeout + if time()>stop_time: + break + self.uart.write(TX_FIFO, ord(i)) + wr_count += 1 + return wr_count + + def readLine(self): + buf = self.read(1) + if len(buf) ==0: + return "" + while '\n' not in buf: + buf += self.read(1) + return buf \ No newline at end of file diff --git a/Cortex-M0/nanosoc/systems/mcu/fpga_imp/pynq_export/pz104/jupyter_notebooks/soclabs/soclabs_cm0sdk_mcu.ipynb b/Cortex-M0/nanosoc/systems/mcu/fpga_imp/pynq_export/pz104/jupyter_notebooks/soclabs/soclabs_cm0sdk_mcu.ipynb new file mode 100755 index 0000000..cef03a2 --- /dev/null +++ b/Cortex-M0/nanosoc/systems/mcu/fpga_imp/pynq_export/pz104/jupyter_notebooks/soclabs/soclabs_cm0sdk_mcu.ipynb @@ -0,0 +1,372 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# SoCLabs cm0sdk mcu overlay\n", + "This notebook demonstrates how to download the FPGA overlay and communicate with programmable logic state. \n", + "\n", + "## 1. Instantiating an overlay\n", + "With the following overlay bundle present in the `overlays` folder, users can instantiate the overlay easily.\n", + "\n", + "* A bitstream file (\\*.bit).\n", + "* An hwh file (\\*.hwh).\n", + "* A python class (\\*.py).\n", + "\n", + "For example, a `soclabs` overlay called `design_1` can be loaded by:\n", + "```python\n", + "from pynq.overlays.base import BaseOverlay\n", + "overlay = BaseOverlay(\"soclabs/design_1.bit\")\n", + "```\n", + "A `drivers` directory is provided for device driver templates for comms channels. (uartlite example).\n", + "\n", + "Users can also use the absolute file path of the bitstream to instantiate the overlay.\n", + "\n", + "In this notebook, we get the current bitstream loaded on PL, and try to download it multiple times." + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [ + { + "data": { + "application/javascript": [ + "\n", + "try {\n", + "require(['notebook/js/codecell'], function(codecell) {\n", + " codecell.CodeCell.options_default.highlight_modes[\n", + " 'magic_text/x-csrc'] = {'reg':[/^%%microblaze/]};\n", + " Jupyter.notebook.events.one('kernel_ready.Kernel', function(){\n", + " Jupyter.notebook.get_cells().map(function(cell){\n", + " if (cell.cell_type == 'code'){ cell.auto_highlight(); } }) ;\n", + " });\n", + "});\n", + "} catch (e) {};\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "\n", + "try {\n", + "require(['notebook/js/codecell'], function(codecell) {\n", + " codecell.CodeCell.options_default.highlight_modes[\n", + " 'magic_text/x-csrc'] = {'reg':[/^%%pybind11/]};\n", + " Jupyter.notebook.events.one('kernel_ready.Kernel', function(){\n", + " Jupyter.notebook.get_cells().map(function(cell){\n", + " if (cell.cell_type == 'code'){ cell.auto_highlight(); } }) ;\n", + " });\n", + "});\n", + "} catch (e) {};\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "import os, warnings\n", + "from pynq import PL\n", + "from pynq import Overlay\n", + "\n", + "from pynq import MMIO\n", + "\n", + "import sys\n", + "sys.path.insert(1, './driver')\n", + "from uartlite import *\n", + "\n", + "ol = Overlay(\"/home/xilinx/pynq/overlays/soclabs/design_1.bit\")\n", + "\n", + "if not os.path.exists(PL.bitfile_name):\n", + " warnings.warn('There is no overlay loaded after boot.', UserWarning)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**Note**: If you see a warning message in the above cell, it means that no overlay\n", + "has been loaded after boot, hence the PL server is not aware of the \n", + "current status of the PL. In that case you won't be able to run this notebook\n", + "until you manually load an overlay at least once using:\n", + "\n", + "```python\n", + "from pynq import Overlay\n", + "ol = Overlay('your_overlay.bit')\n", + "```\n", + "\n", + "If you do not see any warning message, you can safely proceed.\n", + "\n", + "Next try relative path:" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [], + "source": [ + "from pynq import Overlay\n", + "ol = Overlay(\"soclabs/design_1.bit\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Now we can check the download timestamp for this overlay." + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "'2022/7/12 13:24:34 +609181'" + ] + }, + "execution_count": 3, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "ol.download()\n", + "ol.timestamp" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 2. Examining the PL state\n", + "\n", + "While there can be multiple overlay instances in Python, there is only one bitstream that is currently loaded onto the programmable logic (PL). \n", + "\n", + "This bitstream state is held in the singleton class, PL, and is available for user queries." + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "'/usr/local/lib/python3.6/dist-packages/pynq/overlays/soclabs/design_1.bit'" + ] + }, + "execution_count": 4, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "PL.bitfile_name" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "'2022/7/12 13:24:34 +609181'" + ] + }, + "execution_count": 5, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "PL.timestamp" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Users can verify whether an overlay instance is currently loaded using the Overlay is_loaded() method" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "True" + ] + }, + "execution_count": 6, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "ol.is_loaded()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 3. Establishing communications \n", + "Next set up a serial channel (configured for 9600 baud clocking rate).\n", + "Re-download image which also resets the MCU design in PL.\n", + "(No explicit to reinitialize the UART after HW reset, as preconfigured baud rate).\n", + "Poll for start-up banner from MCU internal boot-ROM.\n", + "\n", + "Expect a message of the form (sometimes characters are lost as uartlite has no no flow-control support)\n", + "\n", + "```python\n", + " SOCLABS: ARM Cortex-M0 SDK\n", + " - load flash\n", + "```" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "SOCLABS: ARM Cortex-M0 SDK\n", + " - load flash\n", + "\n", + "\n" + ] + } + ], + "source": [ + "# Address of the uart core\n", + "ADDRESS = 0x80030000\n", + "uart = UartLite(ADDRESS)\n", + "ol.download()\n", + "# Setup AXI UART register\n", + "#uart.setupCtrlReg()\n", + "#print(uart.readLine())\n", + "#print(uart.readLine())\n", + "#print(uart.readLine())\n", + "print(uart.read(45,1))" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "{'RX_VALID': 0, 'RX_FULL': 0, 'TX_EMPTY': 1, 'TX_FULL': 0, 'IS_INTR': 0, 'OVERRUN_ERR': 0, 'FRAME_ERR': 0, 'PARITY_ERR': 0}\n" + ] + } + ], + "source": [ + "print(uart.currentStatus())" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": {}, + "outputs": [], + "source": [ + "#ol.ip_dict" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 3. Overlay downloading overhead\n", + "\n", + "Finally, using Python, we can see the bitstream download time over 50 downloads. " + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "<matplotlib.figure.Figure at 0xaefaa6b0>" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "import time\n", + "import matplotlib.pyplot as plt\n", + "\n", + "length = 50\n", + "time_log = []\n", + "for i in range(length):\n", + " start = time.time()\n", + " ol.download()\n", + " end = time.time()\n", + " time_log.append((end-start)*1000)\n", + "\n", + "%matplotlib inline\n", + "plt.plot(range(length), time_log, 'ro')\n", + "plt.title('Bitstream loading time (ms)')\n", + "plt.axis([0, length, 0, 1000])\n", + "plt.show()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.6.5" + } + }, + "nbformat": 4, + "nbformat_minor": 1 +} diff --git a/Cortex-M0/nanosoc/systems/mcu/fpga_imp/pynq_export/pz2/jupyter_notebooks/soclabs/driver/uartlite.py b/Cortex-M0/nanosoc/systems/mcu/fpga_imp/pynq_export/pz2/jupyter_notebooks/soclabs/driver/uartlite.py new file mode 100755 index 0000000..4da3b33 --- /dev/null +++ b/Cortex-M0/nanosoc/systems/mcu/fpga_imp/pynq_export/pz2/jupyter_notebooks/soclabs/driver/uartlite.py @@ -0,0 +1,88 @@ +from time import sleep, time +from pynq import MMIO + +RX_FIFO = 0x00 +TX_FIFO = 0x04 + +#Status Reg +STAT_REG = 0x08 +RX_VALID = 0 +RX_FULL = 1 +TX_EMPTY = 2 +TX_FULL = 3 +IS_INTR = 4 +OVERRUN_ERR = 5 +FRAME_ERR = 6 +PARITY_ERR =7 + +#Ctrl Reg +CTRL_REG = 0x0C +RST_TX = 0 +RST_RX = 1 +INTR_EN = 4 + +class UartLite: + def __init__(self, address): + # Setup axi core + self.uart = MMIO(address,0x10000, debug=False) + self.address = address + + def getBit(self,num,pos): + return (num&1<<pos)>>pos + + def setupCtrlReg(self): + # Reset FIFOs, disable interrupts + self.uart.write(CTRL_REG, 1<<RST_TX | 1<<RST_RX) + sleep(0.0) + self.uart.write(CTRL_REG,0) + sleep(0.0) + + def currentStatus(self): + """Returns object that specifies current status of axi core""" + status = self.uart.read(STAT_REG) + return {'RX_VALID':self.getBit(status,RX_VALID), + 'RX_FULL':self.getBit(status, RX_FULL), + 'TX_EMPTY':self.getBit(status, TX_EMPTY), + 'TX_FULL':self.getBit(status, TX_FULL), + 'IS_INTR':self.getBit(status, IS_INTR), + 'OVERRUN_ERR':self.getBit(status, OVERRUN_ERR), + 'FRAME_ERR':self.getBit(status, FRAME_ERR), + 'PARITY_ERR':self.getBit(status, PARITY_ERR)} + + def read(self, count, timeout = 1): + buf = "" + stop_time = time() + timeout + for i in range(count): + # Wait till RX fifo has valid data, skip if timeout exceeded + while (not (self.uart.read(STAT_REG) & 1<<RX_VALID)) and (time()<stop_time): + pass + if time()>=stop_time: + break + buf += chr(self.uart.read(RX_FIFO)) + return buf + + def write(self, buf, timeout = 10): + """ + buf: iterable + + """ + stop_time = time() + timeout + wr_count = 0 + for i in buf: + #Wait while TX FIFO is Full, stop waiting if timeout passes + while (self.uart.read(STAT_REG) & 1<<TX_FULL) and (time()<stop_time): + pass + # Check timeout + if time()>stop_time: + break + self.uart.write(TX_FIFO, ord(i)) + wr_count += 1 + return wr_count + + def readLine(self): + buf = self.read(1) + if len(buf) ==0: + return "" + while '\n' not in buf: + buf += self.read(1) + return buf \ No newline at end of file diff --git a/Cortex-M0/nanosoc/systems/mcu/fpga_imp/pynq_export/pz2/jupyter_notebooks/soclabs/soclabs_cm0sdk_mcu.ipynb b/Cortex-M0/nanosoc/systems/mcu/fpga_imp/pynq_export/pz2/jupyter_notebooks/soclabs/soclabs_cm0sdk_mcu.ipynb new file mode 100755 index 0000000..4a2d262 --- /dev/null +++ b/Cortex-M0/nanosoc/systems/mcu/fpga_imp/pynq_export/pz2/jupyter_notebooks/soclabs/soclabs_cm0sdk_mcu.ipynb @@ -0,0 +1,372 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# SoCLabs cm0sdk mcu overlay\n", + "This notebook demonstrates how to download the FPGA overlay and communicate with programmable logic state. \n", + "\n", + "## 1. Instantiating an overlay\n", + "With the following overlay bundle present in the `overlays` folder, users can instantiate the overlay easily.\n", + "\n", + "* A bitstream file (\\*.bit).\n", + "* An hwh file (\\*.hwh).\n", + "* A python class (\\*.py).\n", + "\n", + "For example, a `soclabs` overlay called `design_1` can be loaded by:\n", + "```python\n", + "from pynq.overlays.base import BaseOverlay\n", + "overlay = BaseOverlay(\"soclabs/design_1.bit\")\n", + "```\n", + "A `drivers` directory is provided for device driver templates for comms channels. (uartlite example).\n", + "\n", + "Users can also use the absolute file path of the bitstream to instantiate the overlay.\n", + "\n", + "In this notebook, we get the current bitstream loaded on PL, and try to download it multiple times." + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [ + { + "data": { + "application/javascript": [ + "\n", + "try {\n", + "require(['notebook/js/codecell'], function(codecell) {\n", + " codecell.CodeCell.options_default.highlight_modes[\n", + " 'magic_text/x-csrc'] = {'reg':[/^%%microblaze/]};\n", + " Jupyter.notebook.events.one('kernel_ready.Kernel', function(){\n", + " Jupyter.notebook.get_cells().map(function(cell){\n", + " if (cell.cell_type == 'code'){ cell.auto_highlight(); } }) ;\n", + " });\n", + "});\n", + "} catch (e) {};\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "\n", + "try {\n", + "require(['notebook/js/codecell'], function(codecell) {\n", + " codecell.CodeCell.options_default.highlight_modes[\n", + " 'magic_text/x-csrc'] = {'reg':[/^%%pybind11/]};\n", + " Jupyter.notebook.events.one('kernel_ready.Kernel', function(){\n", + " Jupyter.notebook.get_cells().map(function(cell){\n", + " if (cell.cell_type == 'code'){ cell.auto_highlight(); } }) ;\n", + " });\n", + "});\n", + "} catch (e) {};\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "import os, warnings\n", + "from pynq import PL\n", + "from pynq import Overlay\n", + "\n", + "from pynq import MMIO\n", + "\n", + "import sys\n", + "sys.path.insert(1, './driver')\n", + "from uartlite import *\n", + "\n", + "ol = Overlay(\"/home/xilinx/pynq/overlays/soclabs/design_1.bit\")\n", + "\n", + "if not os.path.exists(PL.bitfile_name):\n", + " warnings.warn('There is no overlay loaded after boot.', UserWarning)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**Note**: If you see a warning message in the above cell, it means that no overlay\n", + "has been loaded after boot, hence the PL server is not aware of the \n", + "current status of the PL. In that case you won't be able to run this notebook\n", + "until you manually load an overlay at least once using:\n", + "\n", + "```python\n", + "from pynq import Overlay\n", + "ol = Overlay('your_overlay.bit')\n", + "```\n", + "\n", + "If you do not see any warning message, you can safely proceed.\n", + "\n", + "Next try relative path:" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [], + "source": [ + "from pynq import Overlay\n", + "ol = Overlay(\"soclabs/design_1.bit\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Now we can check the download timestamp for this overlay." + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "'2022/7/12 13:24:34 +609181'" + ] + }, + "execution_count": 3, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "ol.download()\n", + "ol.timestamp" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 2. Examining the PL state\n", + "\n", + "While there can be multiple overlay instances in Python, there is only one bitstream that is currently loaded onto the programmable logic (PL). \n", + "\n", + "This bitstream state is held in the singleton class, PL, and is available for user queries." + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "'/usr/local/lib/python3.6/dist-packages/pynq/overlays/soclabs/design_1.bit'" + ] + }, + "execution_count": 4, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "PL.bitfile_name" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "'2022/7/12 13:24:34 +609181'" + ] + }, + "execution_count": 5, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "PL.timestamp" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Users can verify whether an overlay instance is currently loaded using the Overlay is_loaded() method" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "True" + ] + }, + "execution_count": 6, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "ol.is_loaded()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 3. Establishing communications \n", + "Next set up a serial channel (configured for 9600 baud clocking rate).\n", + "Re-download image which also resets the MCU design in PL.\n", + "(No explicit to reinitialize the UART after HW reset, as preconfigured baud rate).\n", + "Poll for start-up banner from MCU internal boot-ROM.\n", + "\n", + "Expect a message of the form (sometimes characters are lost as uartlite has no no flow-control support)\n", + "\n", + "```python\n", + " SOCLABS: ARM Cortex-M0 SDK\n", + " - load flash\n", + "```" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "SOCLABS: ARM Cortex-M0 SDK\n", + " - load flash\n", + "\n", + "\n" + ] + } + ], + "source": [ + "# Address of the uart core\n", + "ADDRESS = 0x42C00000\n", + "uart = UartLite(ADDRESS)\n", + "ol.download()\n", + "# Setup AXI UART register\n", + "#uart.setupCtrlReg()\n", + "#print(uart.readLine())\n", + "#print(uart.readLine())\n", + "#print(uart.readLine())\n", + "print(uart.read(45,1))" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "{'RX_VALID': 0, 'RX_FULL': 0, 'TX_EMPTY': 1, 'TX_FULL': 0, 'IS_INTR': 0, 'OVERRUN_ERR': 0, 'FRAME_ERR': 0, 'PARITY_ERR': 0}\n" + ] + } + ], + "source": [ + "print(uart.currentStatus())" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": {}, + "outputs": [], + "source": [ + "#ol.ip_dict" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 3. Overlay downloading overhead\n", + "\n", + "Finally, using Python, we can see the bitstream download time over 50 downloads. " + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "<matplotlib.figure.Figure at 0xaefaa6b0>" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "import time\n", + "import matplotlib.pyplot as plt\n", + "\n", + "length = 50\n", + "time_log = []\n", + "for i in range(length):\n", + " start = time.time()\n", + " ol.download()\n", + " end = time.time()\n", + " time_log.append((end-start)*1000)\n", + "\n", + "%matplotlib inline\n", + "plt.plot(range(length), time_log, 'ro')\n", + "plt.title('Bitstream loading time (ms)')\n", + "plt.axis([0, length, 0, 1000])\n", + "plt.show()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.6.5" + } + }, + "nbformat": 4, + "nbformat_minor": 1 +} diff --git a/Cortex-M0/nanosoc/systems/mcu/fpga_imp/scripts/build_mcu_fpga_batch.tcl b/Cortex-M0/nanosoc/systems/mcu/fpga_imp/scripts/build_mcu_fpga_batch.tcl new file mode 100644 index 0000000..789b276 --- /dev/null +++ b/Cortex-M0/nanosoc/systems/mcu/fpga_imp/scripts/build_mcu_fpga_batch.tcl @@ -0,0 +1,122 @@ +# build_mcu_fpga_batch.tcl +# +# cmsdk_mcu sample design +# A Vivado script that demonstrates a very simple RTL-to-bitstream non-project batch flow +# +# NOTE: typical usage would be "vivado -mode tcl -source build_mcu_fpga_batch.tcl" +# +# STEP#0: define output directory area. +# + +##if {$argc < 1} { +#puts "target_fpga arg must be \[ac701 \| arm_mps3 \| pynz_z2 \| zcu104\]" +#} +#set target [lindex $argv 0] +#puts "target requested : $target" +#set target_dir target_fpga +#append target_dir $target +#puts "target directory : $target_dir" + +set outputDir ./vivado/built_mcu_fpga +file mkdir $outputDir +# +# STEP#1: setup design sources and constraints +# + +# local search path for configurations +set search_path ../verilog + +set cortexm0_vlog ../../../../../../arm-AAA-ip/Cortex-M0/AT510-BU-00000-r0p0-03rel3/logical +source scripts/rtl_source_cm0.tcl + +set search_path [ concat $search_path $cortexm0_vlog/cortexm0_integration/verilog ] +read_verilog [ glob $cortexm0_vlog/cortexm0_integration/verilog/*.v ] +read_verilog [ glob $cortexm0_vlog/models/cells/*.v ] + +# Arm unmodified CMSDK RTL +set cmsdk_vlog ../../../../../../arm-AAA-ip/Corstone-101_Foundation_IP/BP210-BU-00000-r1p1-00rel0 +source scripts/rtl_source_cmsdk.tcl + +set search_path [ concat $search_path $cmsdk_vlog/logical/models/memories ] +###read_verilog $cmsdk_vlog/logical/models/memories/cmsdk_ahb_memory_models_defs.v +###read_verilog $cmsdk_vlog/logical/models/memories/cmsdk_ahb_rom.v +read_verilog $cmsdk_vlog/logical/models/memories/cmsdk_fpga_rom.v +###read_verilog $cmsdk_vlog/logical/models/memories/cmsdk_ahb_ram.v +read_verilog $cmsdk_vlog/logical/models/memories/cmsdk_fpga_sram.v + +# ADP, FT1248 and streamio IP +source scripts/rtl_source_soclabs_ip.tcl + +# FPGA-specific pads +source scripts/rtl_source_fpga_ip.tcl + +# soclabs modified mcu system +set soc_vlog ../verilog +read_verilog $soc_vlog/gen_ahb_busmatrix/verilog/built/soclabs_4x7_AhbMatrix/soclabs_4x7_AhbMatrix_default_slave.v +read_verilog $soc_vlog/gen_ahb_busmatrix/verilog/built/soclabs_4x7_AhbMatrix/soclabs_4x7_AhbMatrix_lite.v +read_verilog $soc_vlog/gen_ahb_busmatrix/verilog/built/soclabs_4x7_AhbMatrix/soclabs_4x7_AhbMatrix.v +read_verilog $soc_vlog/gen_ahb_busmatrix/verilog/built/soclabs_4x7_AhbMatrix/soclabs_4x7_Arbiter.v +read_verilog $soc_vlog/gen_ahb_busmatrix/verilog/built/soclabs_4x7_AhbMatrix/soclabs_4x7_MasterInput.v +read_verilog $soc_vlog/gen_ahb_busmatrix/verilog/built/soclabs_4x7_AhbMatrix/soclabs_4x7_MatrixDecode_adp.v +read_verilog $soc_vlog/gen_ahb_busmatrix/verilog/built/soclabs_4x7_AhbMatrix/soclabs_4x7_MatrixDecode_cpu.v +read_verilog $soc_vlog/gen_ahb_busmatrix/verilog/built/soclabs_4x7_AhbMatrix/soclabs_4x7_MatrixDecode_dma2.v +read_verilog $soc_vlog/gen_ahb_busmatrix/verilog/built/soclabs_4x7_AhbMatrix/soclabs_4x7_MatrixDecode_dma.v +read_verilog $soc_vlog/gen_ahb_busmatrix/verilog/built/soclabs_4x7_AhbMatrix/soclabs_4x7_SlaveOutput.v +read_verilog $soc_vlog/ahb_bootrom.v +read_verilog $soc_vlog/bootrom.v +read_verilog $soc_vlog/cmsdk_ahb_cs_rom_table.v +read_verilog $soc_vlog/cmsdk_apb_usrt.v +read_verilog $soc_vlog/cmsdk_clkreset.v +read_verilog $soc_vlog/cmsdk_ft1248x1_adpio.v +read_verilog $soc_vlog/cmsdk_mcu_clkctrl.v +read_verilog $soc_vlog/cmsdk_mcu_pin_mux.v +read_verilog $soc_vlog/cmsdk_mcu_stclkctrl.v +read_verilog $soc_vlog/cmsdk_mcu_sysctrl.v +read_verilog $soc_vlog/cmsdk_uart_capture.v +read_verilog $soc_vlog/nanosoc_ahb_sys_decode.v +read_verilog $soc_vlog/nanosoc_chip_pads.v +read_verilog $soc_vlog/nanosoc_chip.v +read_verilog $soc_vlog/nanosoc_cpu.v +read_verilog $soc_vlog/nanosoc_sys_ahb_decode.v +read_verilog $soc_vlog/nanosoc_sysio.v + + +# FPGA specific timing constraints +read_xdc target_fpga/fpga_timing.xdc + +# FPGA board specific pin constraints +read_xdc target_fpga/fpga_pinmap.xdc + +# +# STEP#2: run synthesis, report utilization and timing estimates, write checkpoint design +# +source target_fpga/fpga_synth.tcl + +write_checkpoint -force $outputDir/post_synth +report_timing_summary -file $outputDir/post_synth_timing_summary.rpt +report_power -file $outputDir/post_synth_power.rpt +# +# STEP#3: run placement and logic optimzation, report utilization and timing estimates, write checkpoint design +# +opt_design +place_design +phys_opt_design +write_checkpoint -force $outputDir/post_place +report_timing_summary -file $outputDir/post_place_timing_summary.rpt +# +# STEP#4: run router, report actual utilization and timing, write checkpoint design, run drc, write verilog and xdc out +# +route_design +write_checkpoint -force $outputDir/post_route +report_timing_summary -file $outputDir/post_route_timing_summary.rpt +report_timing -sort_by group -max_paths 100 -path_type summary -file $outputDir/post_route_timing.rpt +report_clock_utilization -file $outputDir/clock_util.rpt +report_utilization -file $outputDir/post_route_util.rpt +report_power -file $outputDir/post_route_power.rpt +report_drc -file $outputDir/post_imp_drc.rpt +write_verilog -force $outputDir/cmsdk_mcu_impl_netlist.v +write_xdc -no_fixed_only -force $outputDir/cmsdk_mcu_impl.xdc +# +# STEP#5: generate a bitstream +# +write_bitstream -force $outputDir/cmsdk_mcu.bit diff --git a/Cortex-M0/nanosoc/systems/mcu/fpga_imp/scripts/build_mcu_fpga_ip.tcl b/Cortex-M0/nanosoc/systems/mcu/fpga_imp/scripts/build_mcu_fpga_ip.tcl new file mode 100644 index 0000000..a1a6c43 --- /dev/null +++ b/Cortex-M0/nanosoc/systems/mcu/fpga_imp/scripts/build_mcu_fpga_ip.tcl @@ -0,0 +1,127 @@ +###----------------------------------------------------------------------------- +### example: build_mcu_fpga_ip.tcl +### A joint work commissioned on behalf of SoC Labs, under Arm Academic Access license. +### +### Contributors +### +### David Flynn (d.w.flynn@soton.ac.uk) +### +### Copyright � 2022, SoC Labs (www.soclabs.org) +###----------------------------------------------------------------------------- +# +# developed & tested using vivado_version 2021.1 +# +# usage: +# vivado -mode tcl -source scripts/build_mcu_fpga_ip.tcl + +# +# STEP#0: define output directory area. +# + +set outputDir ./vivado/built_mcu_fpga +file mkdir $outputDir +# +# STEP#1: setup design sources and constraints +# + +# local search path for configurations +set search_path ../verilog + +set cortexm0_vlog ../../../../../../arm-AAA-ip/Cortex-M0/AT510-BU-00000-r0p0-03rel3/logical +source scripts/rtl_source_cm0.tcl + +set search_path [ concat $search_path $cortexm0_vlog/cortexm0_integration/verilog ] +read_verilog [ glob $cortexm0_vlog/cortexm0_integration/verilog/*.v ] +read_verilog [ glob $cortexm0_vlog/models/cells/*.v ] + +# Arm unmodified CMSDK RTL +set cmsdk_vlog ../../../../../../arm-AAA-ip/Corstone-101_Foundation_IP/BP210-BU-00000-r1p1-00rel0 +source scripts/rtl_source_cmsdk.tcl + +set search_path [ concat $search_path $cmsdk_vlog/logical/models/memories ] +read_verilog $cmsdk_vlog/logical/models/memories/cmsdk_ahb_memory_models_defs.v +read_verilog $cmsdk_vlog/logical/models/memories/cmsdk_ahb_rom.v +read_verilog $cmsdk_vlog/logical/models/memories/cmsdk_fpga_rom.v +read_verilog $cmsdk_vlog/logical/models/memories/cmsdk_ahb_ram.v +read_verilog $cmsdk_vlog/logical/models/memories/cmsdk_fpga_sram.v + +# configured Arm DMA-PL230 RTL (include ../verilog/pl230_defs.v for local configuration, not the distribution, already on search path) +set search_path [ concat $search_path ../verilog ] +set dma230_vlog ../../../../../../arm-AAA-ip/DMA-230_MicroDMA_Controller/PL230-BU-00000-r0p0-02rel2/shared/logical/pl230_udma/verilog +source scripts/rtl_source_dma230.tcl + +# ADP, FT1248 and streamio IP +source scripts/rtl_source_soclabs_ip.tcl + +## FPGA-specific pads +#source scripts/rtl_source_fpga_ip.tcl + +# soclabs modified mcu system +set soc_vlog ../verilog +read_verilog $soc_vlog/gen_ahb_busmatrix/verilog/built/soclabs_4x7_AhbMatrix/soclabs_4x7_AhbMatrix_default_slave.v +read_verilog $soc_vlog/gen_ahb_busmatrix/verilog/built/soclabs_4x7_AhbMatrix/soclabs_4x7_AhbMatrix_lite.v +read_verilog $soc_vlog/gen_ahb_busmatrix/verilog/built/soclabs_4x7_AhbMatrix/soclabs_4x7_AhbMatrix.v +read_verilog $soc_vlog/gen_ahb_busmatrix/verilog/built/soclabs_4x7_AhbMatrix/soclabs_4x7_Arbiter.v +read_verilog $soc_vlog/gen_ahb_busmatrix/verilog/built/soclabs_4x7_AhbMatrix/soclabs_4x7_MasterInput.v +read_verilog $soc_vlog/gen_ahb_busmatrix/verilog/built/soclabs_4x7_AhbMatrix/soclabs_4x7_MatrixDecode_adp.v +read_verilog $soc_vlog/gen_ahb_busmatrix/verilog/built/soclabs_4x7_AhbMatrix/soclabs_4x7_MatrixDecode_cpu.v +read_verilog $soc_vlog/gen_ahb_busmatrix/verilog/built/soclabs_4x7_AhbMatrix/soclabs_4x7_MatrixDecode_dma2.v +read_verilog $soc_vlog/gen_ahb_busmatrix/verilog/built/soclabs_4x7_AhbMatrix/soclabs_4x7_MatrixDecode_dma.v +read_verilog $soc_vlog/gen_ahb_busmatrix/verilog/built/soclabs_4x7_AhbMatrix/soclabs_4x7_SlaveOutput.v +read_verilog $soc_vlog/ahb_bootrom.v +read_verilog $soc_vlog/bootrom.v +read_verilog $soc_vlog/cmsdk_ahb_cs_rom_table.v +read_verilog $soc_vlog/cmsdk_apb_usrt.v +##read_verilog $soc_vlog/cmsdk_clkreset.v +read_verilog $soc_vlog/cmsdk_ft1248x1_adpio.v +read_verilog $soc_vlog/cmsdk_mcu_clkctrl.v +read_verilog $soc_vlog/cmsdk_mcu_pin_mux.v +read_verilog $soc_vlog/cmsdk_mcu_stclkctrl.v +read_verilog $soc_vlog/cmsdk_mcu_sysctrl.v +##read_verilog $soc_vlog/cmsdk_uart_capture.v +read_verilog $soc_vlog/nanosoc_cpu.v +read_verilog $soc_vlog/nanosoc_sys_ahb_decode.v +read_verilog $soc_vlog/nanosoc_sysio.v +read_verilog $soc_vlog/nanosoc_chip.v +read_verilog $soc_vlog/nanosoc_chip_pads.v + +set_property top nanosoc_chip [current_fileset] + +# FPGA specific timing constraints +#read_xdc target_fpga/fpga_timing.xdc + +## FPGA board specific pin constraints +#read_xdc target_fpga/fpga_pinmap.xdc + +# +# STEP#2: run synthesis, report utilization and timing estimates, write checkpoint design +# + +update_compile_order -fileset sources_1 + +set mculib_ip $outputDir/MCULIB + +ipx::package_project -root_dir $mculib_ip -vendor soclabs.org -library user -taxonomy /UserIP -import_files -set_current false -force -force_update_compile_order + +ipx::unload_core $mculib_ip/component.xml +ipx::edit_ip_in_project -upgrade true -name tmp_edit_project -directory $mculib_ip $mculib_ip/component.xml + +update_compile_order -fileset sources_1 +set_property ipi_drc {ignore_freq_hz true} [ipx::current_core] +ipx::merge_project_changes files [ipx::current_core] + +set_property core_revision 2 [ipx::current_core] +ipx::update_source_project_archive -component [ipx::current_core] +ipx::create_xgui_files [ipx::current_core] +ipx::update_checksums [ipx::current_core] +ipx::check_integrity [ipx::current_core] + +ipx::save_core [ipx::current_core] +ipx::check_integrity -quiet -xrt [ipx::current_core] +ipx::archive_core $mculib_ip/soclabs.org_user_cmsdk_mcu_chip_1.0.zip [ipx::current_core] +ipx::move_temp_component_back -component [ipx::current_core] +close_project -delete + +set_property ip_repo_paths { ip_repo $mculib_ip} [current_project] +update_ip_catalog +close_project diff --git a/Cortex-M0/nanosoc/systems/mcu/fpga_imp/scripts/build_mcu_fpga_pynq_z2.tcl b/Cortex-M0/nanosoc/systems/mcu/fpga_imp/scripts/build_mcu_fpga_pynq_z2.tcl new file mode 100644 index 0000000..28b5b35 --- /dev/null +++ b/Cortex-M0/nanosoc/systems/mcu/fpga_imp/scripts/build_mcu_fpga_pynq_z2.tcl @@ -0,0 +1,118 @@ +###----------------------------------------------------------------------------- +### example: build_mcu_fpga_pynq_z2.tcl +### A joint work commissioned on behalf of SoC Labs, under Arm Academic Access license. +### +### Contributors +### +### David Flynn (d.w.flynn@soton.ac.uk) +### +### Copyright � 2022, SoC Labs (www.soclabs.org) +###----------------------------------------------------------------------------- +# +# developed & tested using vivado_version 2021.1 +# +# usage: +# vivado -mode tcl -source scripts/build_mcu_fpga_pynq_z2.tcl +# vivado -mode gui -source scripts/build_mcu_fpga_pynq_z2.tcl + +# for TUL PYNQ-Z2 as PYNQ target +set xilinx_part xc7z020clg400-1 +set project project_pynq_z2 +set importDir target_fpga_pynq_z2 +set ipDir ./ip_repo +set mcuDir ./vivado/built_mcu_fpga/MCULIB +set pynqDir pynq_export/pz2/pynq/overlays/soclabs +set exportDir /research/soclabs/pynq_export/pz2/pynq/overlays/soclabs +#set_property BOARD_PART tul.com:pynq-z2:part0:1.1 [current_project] + +# +# STEP#0: build the cm0sdk design (without pads) as an "IP" library component for the testbench (in MCULIB) +# +source scripts/build_mcu_fpga_ip.tcl + +# +# STEP#1: setup design sources and constraints +# +set_part $xilinx_part +set_property TARGET_LANGUAGE Verilog [current_project] +set_property DEFAULT_LIB work [current_project] + +set paths [list \ + $ipDir\ + $mcuDir\ + ] + +# Set IP repository paths +set obj [get_filesets sources_1] +if { $obj != {} } { + set_property "ip_repo_paths" "[file normalize $ipDir] [file normalize $mcuDir]" $obj + # Rebuild user ip_repo's index before adding any source files + update_ip_catalog -rebuild +} + +report_ip_status + +# +# STEP#2: create Block Diagram and add specific IO wrapper (and import matching pinmap.xdc) +# +# using script written out from GUI capture + +create_bd_design design_1 + +read_verilog $importDir/design_1_wrapper.v +source $importDir/design_1.tcl +create_root_design "" + +add_files -norecurse -scan_for_includes {../../../../../../arm-AAA-ip/Corstone-101_Foundation_IP/BP210-BU-00000-r1p1-00rel0/logical/cmsdk_apb_dualtimers/verilog/cmsdk_apb_dualtimers_defs.v ../../../../../../arm-AAA-ip/Corstone-101_Foundation_IP/BP210-BU-00000-r1p1-00rel0/logical/cmsdk_apb_watchdog/verilog/cmsdk_apb_watchdog_defs.v ../verilog/pl230_defs.v} +set_property is_global_include true [get_files ../../../../../../arm-AAA-ip/Corstone-101_Foundation_IP/BP210-BU-00000-r1p1-00rel0/logical/cmsdk_apb_dualtimers/verilog/cmsdk_apb_dualtimers_defs.v] +set_property is_global_include true [get_files ../../../../../../arm-AAA-ip/Corstone-101_Foundation_IP/BP210-BU-00000-r1p1-00rel0/logical/cmsdk_apb_watchdog/verilog/cmsdk_apb_watchdog_defs.v] +set_property is_global_include true [get_files ../verilog/pl230_defs.v] + +set_property file_type {Verilog Header} [get_files ../../../../../../arm-AAA-ip/Corstone-101_Foundation_IP/BP210-BU-00000-r1p1-00rel0/logical/cmsdk_apb_dualtimers/verilog/cmsdk_apb_dualtimers_defs.v] +set_property file_type {Verilog Header} [get_files ../../../../../../arm-AAA-ip/Corstone-101_Foundation_IP/BP210-BU-00000-r1p1-00rel0/logical/cmsdk_apb_watchdog/verilog/cmsdk_apb_watchdog_defs.v] +set_property file_type {Verilog Header} [get_files ../verilog/pl230_defs.v] + +add_files $importDir/fpga_pinmap.xdc + +set_property top design_1_wrapper [current_fileset] + +# +# STEP#3: save in Project mode to complete flow +# +save_project_as $project ./$project -exclude_run_results -force + +update_compile_order -fileset sources_1 + +# +# STEP#4: synthesize project +# +set_property part $xilinx_part [get_runs synth_1] +launch_runs synth_1 -jobs 8 + +wait_on_run synth_1 + +# +# STEP#5: place and route project +# +set_property part $xilinx_part [get_runs impl_1] +launch_runs impl_1 -to_step write_bitstream -jobs 8 + +wait_on_run impl_1 + +# +# STEP#6: export design_1.bit and design_1.hwh files for PYNQ +# + +write_hw_platform -fixed -include_bit -force -file $project/design_1.xsa + +exec unzip -u -o $project/design_1.xsa -d $project/export + +exec mkdir -p $pynqDir +exec cp -p $project/export/design_1.bit $pynqDir +exec cp -p $project/export/design_1.hwh $pynqDir +#exec cp -p $project/export/design_1.bit $exportDir +#exec cp -p $project/export/design_1.hwh $exportDir + +exec rm -Rf vivado/ + +exit 1 diff --git a/Cortex-M0/nanosoc/systems/mcu/fpga_imp/scripts/build_mcu_fpga_pynq_zcu104.tcl b/Cortex-M0/nanosoc/systems/mcu/fpga_imp/scripts/build_mcu_fpga_pynq_zcu104.tcl new file mode 100644 index 0000000..87ae9c2 --- /dev/null +++ b/Cortex-M0/nanosoc/systems/mcu/fpga_imp/scripts/build_mcu_fpga_pynq_zcu104.tcl @@ -0,0 +1,115 @@ +###----------------------------------------------------------------------------- +### example: build_mcu_fpga_pynq_zcu104.tcl +### A joint work commissioned on behalf of SoC Labs, under Arm Academic Access license. +### +### Contributors +### +### David Flynn (d.w.flynn@soton.ac.uk) +### +### Copyright � 2022, SoC Labs (www.soclabs.org) +###----------------------------------------------------------------------------- +# +# developed & tested using vivado_version 2021.1 +# +# usage: +# vivado -mode tcl -source scripts/build_mcu_fpga_pynq_zcu104.tcl +# vivado -mode gui -source scripts/build_mcu_fpga_pynq_zcu104.tcl + +# for Xilinx ZCU104 as PYNQ target +set xilinx_part xczu7ev-ffvc1156-2-e +set project project_pynq_zcu104 +set importDir target_fpga_zcu104 +set ipDir ./ip_repo +set mcuDir ./vivado/built_mcu_fpga/MCULIB +set pynqDir pynq_export/pz104/pynq/overlays/soclabs +#set_property BOARD_PART xilinx.com:zcu104:part0:1.1 [current_project] + +# +# STEP#0: build the cm0sdk design (without pads) as an "IP" library component for the testbench (in MCULIB) +# +source scripts/build_mcu_fpga_ip.tcl + +# +# STEP#1: setup design sources and constraints +# +set_part $xilinx_part +set_property TARGET_LANGUAGE Verilog [current_project] +set_property DEFAULT_LIB work [current_project] + +set paths [list \ + $ipDir\ + $mcuDir\ + ] + +# Set IP repository paths +set obj [get_filesets sources_1] +if { $obj != {} } { + set_property "ip_repo_paths" "[file normalize $ipDir] [file normalize $mcuDir]" $obj + # Rebuild user ip_repo's index before adding any source files + update_ip_catalog -rebuild +} + +report_ip_status + +# +# STEP#2: create Block Diagram and add specific IO wrapper (and import matching pinmap.xdc) +# +# using script written out from GUI capture + +create_bd_design design_1 + +read_verilog $importDir/design_1_wrapper.v +source $importDir/design_1.tcl +create_root_design "" + +add_files -norecurse -scan_for_includes {../../../../../../arm-AAA-ip/Corstone-101_Foundation_IP/BP210-BU-00000-r1p1-00rel0/logical/cmsdk_apb_dualtimers/verilog/cmsdk_apb_dualtimers_defs.v ../../../../../../arm-AAA-ip/Corstone-101_Foundation_IP/BP210-BU-00000-r1p1-00rel0/logical/cmsdk_apb_watchdog/verilog/cmsdk_apb_watchdog_defs.v ../verilog/pl230_defs.v} +set_property is_global_include true [get_files ../../../../../../arm-AAA-ip/Corstone-101_Foundation_IP/BP210-BU-00000-r1p1-00rel0/logical/cmsdk_apb_dualtimers/verilog/cmsdk_apb_dualtimers_defs.v] +set_property is_global_include true [get_files ../../../../../../arm-AAA-ip/Corstone-101_Foundation_IP/BP210-BU-00000-r1p1-00rel0/logical/cmsdk_apb_watchdog/verilog/cmsdk_apb_watchdog_defs.v] +set_property is_global_include true [get_files ../verilog/pl230_defs.v] + +set_property file_type {Verilog Header} [get_files ../../../../../../arm-AAA-ip/Corstone-101_Foundation_IP/BP210-BU-00000-r1p1-00rel0/logical/cmsdk_apb_dualtimers/verilog/cmsdk_apb_dualtimers_defs.v] +set_property file_type {Verilog Header} [get_files ../../../../../../arm-AAA-ip/Corstone-101_Foundation_IP/BP210-BU-00000-r1p1-00rel0/logical/cmsdk_apb_watchdog/verilog/cmsdk_apb_watchdog_defs.v] +set_property file_type {Verilog Header} [get_files ../verilog/pl230_defs.v] + +add_files $importDir/fpga_pinmap.xdc + +set_property top design_1_wrapper [current_fileset] + +# +# STEP#3: save in Project mode to complete flow +# + +save_project_as $project ./$project -exclude_run_results -force + +update_compile_order -fileset sources_1 + +# +# STEP#4: synthesize project +# +set_property part $xilinx_part [get_runs synth_1] +launch_runs synth_1 -jobs 8 + +wait_on_run synth_1 + +# +# STEP#5: place and route project +# +set_property part $xilinx_part [get_runs impl_1] +launch_runs impl_1 -to_step write_bitstream -jobs 8 + +wait_on_run impl_1 + +# +# STEP#6: export design_1.bit and design_1.hwh files for PYNQ +# + +write_hw_platform -fixed -include_bit -force -file $project/design_1.xsa + +exec unzip -u -o $project/design_1.xsa -d $project/export +exec mkdir -p $pynqDir +exec cp -p $project/export/design_1.bit $pynqDir +exec cp -p $project/export/design_1.hwh $pynqDir + +exec rm -Rf vivado/ + +exit 1 diff --git a/Cortex-M0/nanosoc/systems/mcu/fpga_imp/scripts/rtl_source_cm0.tcl b/Cortex-M0/nanosoc/systems/mcu/fpga_imp/scripts/rtl_source_cm0.tcl new file mode 100644 index 0000000..b76287f --- /dev/null +++ b/Cortex-M0/nanosoc/systems/mcu/fpga_imp/scripts/rtl_source_cm0.tcl @@ -0,0 +1,17 @@ +### Cortex-M0 rtl source build +set search_path [ concat $search_path $cortexm0_vlog/cortexm0/verilog ] +read_verilog [ glob $cortexm0_vlog/cortexm0/verilog/*.v ] +set search_path [ concat $search_path $cortexm0_vlog/cortexm0_dap/verilog ] +##read_verilog [ glob $cortexm0_vlog/cortexm0_dap/verilog/*.v ] +read_verilog $cortexm0_vlog/cortexm0_dap/verilog/cm0_dap_ap_cdc.v +read_verilog $cortexm0_vlog/cortexm0_dap/verilog/cm0_dap_ap_mast.v +read_verilog $cortexm0_vlog/cortexm0_dap/verilog/cm0_dap_dp_cdc.v +read_verilog $cortexm0_vlog/cortexm0_dap/verilog/cm0_dap_dp_jtag.v +###read_verilog $cortexm0_vlog/cortexm0_dap/verilog/cm0_dap_dp_sw_defs.v +read_verilog $cortexm0_vlog/cortexm0_dap/verilog/cm0_dap_dp.v +###read_verilog $cortexm0_vlog/cortexm0_dap/verilog/cm0_dap_ap_mast_defs.v +read_verilog $cortexm0_vlog/cortexm0_dap/verilog/cm0_dap_ap.v +###read_verilog $cortexm0_vlog/cortexm0_dap/verilog/cm0_dap_dp_jtag_defs.v +read_verilog $cortexm0_vlog/cortexm0_dap/verilog/cm0_dap_dp_pwr.v +read_verilog $cortexm0_vlog/cortexm0_dap/verilog/cm0_dap_dp_sw.v +read_verilog $cortexm0_vlog/cortexm0_dap/verilog/CORTEXM0DAP.v diff --git a/Cortex-M0/nanosoc/systems/mcu/fpga_imp/scripts/rtl_source_cmsdk.tcl b/Cortex-M0/nanosoc/systems/mcu/fpga_imp/scripts/rtl_source_cmsdk.tcl new file mode 100644 index 0000000..cd99c87 --- /dev/null +++ b/Cortex-M0/nanosoc/systems/mcu/fpga_imp/scripts/rtl_source_cmsdk.tcl @@ -0,0 +1,17 @@ +### CMSDK rtl source build +###read_verilog [ glob $cmsdk_vlog/logical/cmsdk_ahb_gpio/verilog/*.v ] +read_verilog $cmsdk_vlog/logical/cmsdk_ahb_gpio/verilog/cmsdk_ahb_to_iop.v +read_verilog $cmsdk_vlog/logical/cmsdk_ahb_gpio/verilog/cmsdk_ahb_gpio.v +read_verilog $cmsdk_vlog/logical/cmsdk_iop_gpio/verilog/cmsdk_iop_gpio.v +read_verilog [ glob $cmsdk_vlog/logical/cmsdk_apb_timer/verilog/*.v ] +read_verilog [ glob $cmsdk_vlog/logical/cmsdk_apb_dualtimers/verilog/*.v ] +read_verilog [ glob $cmsdk_vlog/logical/cmsdk_apb_watchdog/verilog/*.v ] +read_verilog [ glob $cmsdk_vlog/logical/cmsdk_apb_uart/verilog/*.v ] +read_verilog $cmsdk_vlog/logical/cmsdk_ahb_default_slave/verilog/cmsdk_ahb_default_slave.v +read_verilog [ glob $cmsdk_vlog/logical/cmsdk_ahb_slave_mux/verilog/*.v ] +read_verilog [ glob $cmsdk_vlog/logical/cmsdk_ahb_to_apb/verilog/*.v ] +read_verilog [ glob $cmsdk_vlog/logical/cmsdk_apb_slave_mux/verilog/*.v ] +read_verilog [ glob $cmsdk_vlog/logical/cmsdk_apb_subsystem/verilog/*.v ] +read_verilog [ glob $cmsdk_vlog/logical/cmsdk_ahb_master_mux/verilog/*.v ] +read_verilog $cmsdk_vlog/logical/models/clkgate/cmsdk_clock_gate.v +read_verilog $cmsdk_vlog/logical/cmsdk_ahb_to_sram/verilog/cmsdk_ahb_to_sram.v diff --git a/Cortex-M0/nanosoc/systems/mcu/fpga_imp/scripts/rtl_source_dma230.tcl b/Cortex-M0/nanosoc/systems/mcu/fpga_imp/scripts/rtl_source_dma230.tcl new file mode 100644 index 0000000..356404e --- /dev/null +++ b/Cortex-M0/nanosoc/systems/mcu/fpga_imp/scripts/rtl_source_dma230.tcl @@ -0,0 +1,8 @@ +### DMA PL230 rtl source build +read_verilog ../verilog/pl230_defs.v +read_verilog $dma230_vlog/pl230_ahb_ctrl.v +read_verilog $dma230_vlog/pl230_apb_regs.v +read_verilog $dma230_vlog/pl230_dma_data.v +read_verilog $dma230_vlog/pl230_udma.v +read_verilog $dma230_vlog/pl230_undefs.v + diff --git a/Cortex-M0/nanosoc/systems/mcu/fpga_imp/scripts/rtl_source_fpga_ip.tcl b/Cortex-M0/nanosoc/systems/mcu/fpga_imp/scripts/rtl_source_fpga_ip.tcl new file mode 100644 index 0000000..376d757 --- /dev/null +++ b/Cortex-M0/nanosoc/systems/mcu/fpga_imp/scripts/rtl_source_fpga_ip.tcl @@ -0,0 +1,9 @@ +# rtl_source_fpga_ip.tcl +# + +set fpgalib_vlog ../../../../../FPGALIB +read_verilog $fpgalib_vlog/pads/verilog/PAD_INOUT8MA_NOE.v +read_verilog $fpgalib_vlog/pads/verilog/PAD_VDDIO.v +read_verilog $fpgalib_vlog/pads/verilog/PAD_VSSIO.v +read_verilog $fpgalib_vlog/pads/verilog/PAD_VDDSOC.v +read_verilog $fpgalib_vlog/pads/verilog/PAD_VSS.v diff --git a/Cortex-M0/nanosoc/systems/mcu/fpga_imp/scripts/rtl_source_soclabs_ip.tcl b/Cortex-M0/nanosoc/systems/mcu/fpga_imp/scripts/rtl_source_soclabs_ip.tcl new file mode 100644 index 0000000..a661717 --- /dev/null +++ b/Cortex-M0/nanosoc/systems/mcu/fpga_imp/scripts/rtl_source_soclabs_ip.tcl @@ -0,0 +1,7 @@ +# rtl_source_soclabs_ip.tcl +# + +set iplib_vlog ../../../../../IPLIB +read_verilog $iplib_vlog/FT1248_streamio_v1_0/ft1248_streamio_v1_0.v +read_verilog $iplib_vlog/ADPcontrol_v1_0/ADPcontrol_v1_0.v +read_verilog $iplib_vlog/ADPcontrol_v1_0/ADPmanager.v diff --git a/Cortex-M0/nanosoc/systems/mcu/fpga_imp/target_fpga_ac701/fpga_pinmap.xdc b/Cortex-M0/nanosoc/systems/mcu/fpga_imp/target_fpga_ac701/fpga_pinmap.xdc new file mode 100644 index 0000000..b8889af --- /dev/null +++ b/Cortex-M0/nanosoc/systems/mcu/fpga_imp/target_fpga_ac701/fpga_pinmap.xdc @@ -0,0 +1,983 @@ +################################################################################## +## ## +## AC701 Master XDC ## +## ## +################################################################################## + +set_property CFGBVS VCCO [current_design] + +set_property CONFIG_VOLTAGE 3.3 [current_design] + +##set_property PACKAGE_PIN AB22 [get_ports No] +##set_property IOSTANDARD LVCMOS25 [get_ports No] +##set_property PACKAGE_PIN AE25 [get_ports FMC1_HPC_HA02_P] +##set_property IOSTANDARD LVCMOS25 [get_ports FMC1_HPC_HA02_P] +##set_property PACKAGE_PIN AE26 [get_ports FMC1_HPC_HA02_N] +##set_property IOSTANDARD LVCMOS25 [get_ports FMC1_HPC_HA02_N] +##set_property PACKAGE_PIN AC22 [get_ports FMC1_HPC_HA03_P] +##set_property IOSTANDARD LVCMOS25 [get_ports FMC1_HPC_HA03_P] +##set_property PACKAGE_PIN AC23 [get_ports FMC1_HPC_HA03_N] +##set_property IOSTANDARD LVCMOS25 [get_ports FMC1_HPC_HA03_N] +##set_property PACKAGE_PIN AF24 [get_ports FMC1_HPC_HA04_P] +##set_property IOSTANDARD LVCMOS25 [get_ports FMC1_HPC_HA04_P] +##set_property PACKAGE_PIN AF25 [get_ports FMC1_HPC_HA04_N] +##set_property IOSTANDARD LVCMOS25 [get_ports FMC1_HPC_HA04_N] +##set_property PACKAGE_PIN AD25 [get_ports FMC1_HPC_HA05_P] +##set_property IOSTANDARD LVCMOS25 [get_ports FMC1_HPC_HA05_P] +##set_property PACKAGE_PIN AD26 [get_ports FMC1_HPC_HA05_N] +##set_property IOSTANDARD LVCMOS25 [get_ports FMC1_HPC_HA05_N] +##set_property PACKAGE_PIN AE23 [get_ports FMC1_HPC_HA06_P] +##set_property IOSTANDARD LVCMOS25 [get_ports FMC1_HPC_HA06_P] +##set_property PACKAGE_PIN AF23 [get_ports FMC1_HPC_HA06_N] +##set_property IOSTANDARD LVCMOS25 [get_ports FMC1_HPC_HA06_N] +##set_property PACKAGE_PIN AD23 [get_ports FMC1_HPC_HA07_P] +##set_property IOSTANDARD LVCMOS25 [get_ports FMC1_HPC_HA07_P] +##set_property PACKAGE_PIN AD24 [get_ports FMC1_HPC_HA07_N] +##set_property IOSTANDARD LVCMOS25 [get_ports FMC1_HPC_HA07_N] +##set_property PACKAGE_PIN AD21 [get_ports FMC1_HPC_HA08_P] +##set_property IOSTANDARD LVCMOS25 [get_ports FMC1_HPC_HA08_P] +##set_property PACKAGE_PIN AE21 [get_ports FMC1_HPC_HA08_N] +##set_property IOSTANDARD LVCMOS25 [get_ports FMC1_HPC_HA08_N] +##set_property PACKAGE_PIN AF19 [get_ports FMC1_HPC_HA09_P] +##set_property IOSTANDARD LVCMOS25 [get_ports FMC1_HPC_HA09_P] +##set_property PACKAGE_PIN AF20 [get_ports FMC1_HPC_HA09_N] +##set_property IOSTANDARD LVCMOS25 [get_ports FMC1_HPC_HA09_N] +##set_property PACKAGE_PIN AE22 [get_ports FMC1_HPC_HA10_P] +##set_property IOSTANDARD LVCMOS25 [get_ports FMC1_HPC_HA10_P] +##set_property PACKAGE_PIN AF22 [get_ports FMC1_HPC_HA10_N] +##set_property IOSTANDARD LVCMOS25 [get_ports FMC1_HPC_HA10_N] +##set_property PACKAGE_PIN AD20 [get_ports FMC1_HPC_HA11_P] +##set_property IOSTANDARD LVCMOS25 [get_ports FMC1_HPC_HA11_P] +##set_property PACKAGE_PIN AE20 [get_ports FMC1_HPC_HA11_N] +##set_property IOSTANDARD LVCMOS25 [get_ports FMC1_HPC_HA11_N] +##set_property PACKAGE_PIN AB21 [get_ports FMC1_HPC_HA01_CC_P] +##set_property IOSTANDARD LVCMOS25 [get_ports FMC1_HPC_HA01_CC_P] +##set_property PACKAGE_PIN AC21 [get_ports FMC1_HPC_HA01_CC_N] +##set_property IOSTANDARD LVCMOS25 [get_ports FMC1_HPC_HA01_CC_N] +##set_property PACKAGE_PIN AA20 [get_ports FMC1_HPC_HA17_CC_P] +##set_property IOSTANDARD LVCMOS25 [get_ports FMC1_HPC_HA17_CC_P] +##set_property PACKAGE_PIN AB20 [get_ports FMC1_HPC_HA17_CC_N] +##set_property IOSTANDARD LVCMOS25 [get_ports FMC1_HPC_HA17_CC_N] +##set_property PACKAGE_PIN AA19 [get_ports FMC1_HPC_HA00_CC_P] +##set_property IOSTANDARD LVCMOS25 [get_ports FMC1_HPC_HA00_CC_P] +##set_property PACKAGE_PIN AB19 [get_ports FMC1_HPC_HA00_CC_N] +##set_property IOSTANDARD LVCMOS25 [get_ports FMC1_HPC_HA00_CC_N] +##set_property PACKAGE_PIN AC19 [get_ports FMC1_HPC_HA12_P] +##set_property IOSTANDARD LVCMOS25 [get_ports FMC1_HPC_HA12_P] +##set_property PACKAGE_PIN AD19 [get_ports FMC1_HPC_HA12_N] +##set_property IOSTANDARD LVCMOS25 [get_ports FMC1_HPC_HA12_N] +##set_property PACKAGE_PIN AC18 [get_ports FMC1_HPC_HA13_P] +##set_property IOSTANDARD LVCMOS25 [get_ports FMC1_HPC_HA13_P] +##set_property PACKAGE_PIN AD18 [get_ports FMC1_HPC_HA13_N] +##set_property IOSTANDARD LVCMOS25 [get_ports FMC1_HPC_HA13_N] +##set_property PACKAGE_PIN AE18 [get_ports FMC1_HPC_HA14_P] +##set_property IOSTANDARD LVCMOS25 [get_ports FMC1_HPC_HA14_P] +##set_property PACKAGE_PIN AF18 [get_ports FMC1_HPC_HA14_N] +##set_property IOSTANDARD LVCMOS25 [get_ports FMC1_HPC_HA14_N] +##set_property PACKAGE_PIN Y18 [get_ports FMC1_HPC_HA15_P] +##set_property IOSTANDARD LVCMOS25 [get_ports FMC1_HPC_HA15_P] +##set_property PACKAGE_PIN AA18 [get_ports FMC1_HPC_HA15_N] +##set_property IOSTANDARD LVCMOS25 [get_ports FMC1_HPC_HA15_N] +##set_property PACKAGE_PIN AE17 [get_ports FMC1_HPC_HA16_P] +##set_property IOSTANDARD LVCMOS25 [get_ports FMC1_HPC_HA16_P] +##set_property PACKAGE_PIN AF17 [get_ports FMC1_HPC_HA16_N] +##set_property IOSTANDARD LVCMOS25 [get_ports FMC1_HPC_HA16_N] +##set_property PACKAGE_PIN AA17 [get_ports FMC1_HPC_HA18_P] +##set_property IOSTANDARD LVCMOS25 [get_ports FMC1_HPC_HA18_P] +##set_property PACKAGE_PIN AB17 [get_ports FMC1_HPC_HA18_N] +##set_property IOSTANDARD LVCMOS25 [get_ports FMC1_HPC_HA18_N] +##set_property PACKAGE_PIN AC17 [get_ports FMC1_HPC_HA19_P] +##set_property IOSTANDARD LVCMOS25 [get_ports FMC1_HPC_HA19_P] +##set_property PACKAGE_PIN AD17 [get_ports FMC1_HPC_HA19_N] +##set_property IOSTANDARD LVCMOS25 [get_ports FMC1_HPC_HA19_N] +##set_property PACKAGE_PIN Y16 [get_ports FMC1_HPC_HA20_P] +##set_property IOSTANDARD LVCMOS25 [get_ports FMC1_HPC_HA20_P] +##set_property PACKAGE_PIN Y17 [get_ports FMC1_HPC_HA20_N] +##set_property IOSTANDARD LVCMOS25 [get_ports FMC1_HPC_HA20_N] +##set_property PACKAGE_PIN AB16 [get_ports FMC1_HPC_HA21_P] +##set_property IOSTANDARD LVCMOS25 [get_ports FMC1_HPC_HA21_P] +##set_property PACKAGE_PIN AC16 [get_ports FMC1_HPC_HA21_N] +##set_property IOSTANDARD LVCMOS25 [get_ports FMC1_HPC_HA21_N] +##set_property PACKAGE_PIN Y15 [get_ports FMC1_HPC_HA22_P] +##set_property IOSTANDARD LVCMOS25 [get_ports FMC1_HPC_HA22_P] +##set_property PACKAGE_PIN AA15 [get_ports FMC1_HPC_HA22_N] +##set_property IOSTANDARD LVCMOS25 [get_ports FMC1_HPC_HA22_N] +##set_property PACKAGE_PIN W14 [get_ports FMC1_HPC_HA23_P] +##set_property IOSTANDARD LVCMOS25 [get_ports FMC1_HPC_HA23_P] +##set_property PACKAGE_PIN W15 [get_ports FMC1_HPC_HA23_N] +##set_property IOSTANDARD LVCMOS25 [get_ports FMC1_HPC_HA23_N] +##set_property PACKAGE_PIN W16 [get_ports No] +##set_property IOSTANDARD LVCMOS25 [get_ports No] +##set_property PACKAGE_PIN U24 [get_ports HDMI_R_D21] +##set_property IOSTANDARD LVCMOS18 [get_ports HDMI_R_D21] +##set_property PACKAGE_PIN U25 [get_ports HDMI_R_D16] +##set_property IOSTANDARD LVCMOS18 [get_ports HDMI_R_D16] +##set_property PACKAGE_PIN U26 [get_ports HDMI_R_D11] +##set_property IOSTANDARD LVCMOS18 [get_ports HDMI_R_D11] +##set_property PACKAGE_PIN V26 [get_ports HDMI_R_D7] +##set_property IOSTANDARD LVCMOS18 [get_ports HDMI_R_D7] +##set_property PACKAGE_PIN W26 [get_ports HDMI_R_D8] +##set_property IOSTANDARD LVCMOS18 [get_ports HDMI_R_D8] +##set_property PACKAGE_PIN AB26 [get_ports HDMI_R_DE] +##set_property IOSTANDARD LVCMOS18 [get_ports HDMI_R_DE] +##set_property PACKAGE_PIN AC26 [get_ports HDMI_R_VSYNC] +##set_property IOSTANDARD LVCMOS18 [get_ports HDMI_R_VSYNC] +##set_property PACKAGE_PIN W25 [get_ports HDMI_R_D9] +##set_property IOSTANDARD LVCMOS18 [get_ports HDMI_R_D9] +##set_property PACKAGE_PIN Y26 [get_ports HDMI_R_D6] +##set_property IOSTANDARD LVCMOS18 [get_ports HDMI_R_D6] +##set_property PACKAGE_PIN Y25 [get_ports HDMI_R_D5] +##set_property IOSTANDARD LVCMOS18 [get_ports HDMI_R_D5] +##set_property PACKAGE_PIN AA25 [get_ports HDMI_R_D29] +##set_property IOSTANDARD LVCMOS18 [get_ports HDMI_R_D29] +##set_property PACKAGE_PIN V24 [get_ports HDMI_R_D17] +##set_property IOSTANDARD LVCMOS18 [get_ports HDMI_R_D17] +##set_property PACKAGE_PIN W24 [get_ports HDMI_R_D10] +##set_property IOSTANDARD LVCMOS18 [get_ports HDMI_R_D10] +##set_property PACKAGE_PIN AA24 [get_ports HDMI_R_D4] +##set_property IOSTANDARD LVCMOS18 [get_ports HDMI_R_D4] +##set_property PACKAGE_PIN AB25 [get_ports HDMI_R_D30] +##set_property IOSTANDARD LVCMOS18 [get_ports HDMI_R_D30] +##set_property PACKAGE_PIN AA22 [get_ports HDMI_R_HSYNC] +##set_property IOSTANDARD LVCMOS18 [get_ports HDMI_R_HSYNC] +##set_property PACKAGE_PIN AA23 [get_ports HDMI_R_D28] +##set_property IOSTANDARD LVCMOS18 [get_ports HDMI_R_D28] +##set_property PACKAGE_PIN AB24 [get_ports HDMI_R_D32] +##set_property IOSTANDARD LVCMOS18 [get_ports HDMI_R_D32] +##set_property PACKAGE_PIN AC24 [get_ports HDMI_R_D31] +##set_property IOSTANDARD LVCMOS18 [get_ports HDMI_R_D31] +##set_property PACKAGE_PIN V23 [get_ports HDMI_R_D23] +##set_property IOSTANDARD LVCMOS18 [get_ports HDMI_R_D23] +##set_property PACKAGE_PIN W23 [get_ports HDMI_R_D19] +##set_property IOSTANDARD LVCMOS18 [get_ports HDMI_R_D19] +##set_property PACKAGE_PIN Y22 [get_ports HDMI_R_D33] +##set_property IOSTANDARD LVCMOS18 [get_ports HDMI_R_D33] +##set_property PACKAGE_PIN Y23 [get_ports HDMI_R_D34] +##set_property IOSTANDARD LVCMOS18 [get_ports HDMI_R_D34] +##set_property INTERNAL_VREF 0.90 [get_iobanks 13] +##set_property PACKAGE_PIN U22 [get_ports PHY_TX_CLK] +##set_property IOSTANDARD HSTL_I_18 [get_ports PHY_TX_CLK] +##set_property PACKAGE_PIN V22 [get_ports HDMI_R_D35] +##set_property IOSTANDARD LVCMOS18 [get_ports HDMI_R_D35] +##set_property PACKAGE_PIN U21 [get_ports PHY_RX_CLK] +##set_property IOSTANDARD HSTL_I_18 [get_ports PHY_RX_CLK] +##set_property PACKAGE_PIN V21 [get_ports HDMI_R_CLK] +##set_property IOSTANDARD LVCMOS18 [get_ports HDMI_R_CLK] +##set_property PACKAGE_PIN W21 [get_ports HDMI_INT] +##set_property IOSTANDARD LVCMOS18 [get_ports HDMI_INT] +##set_property PACKAGE_PIN Y21 [get_ports HDMI_R_SPDIF] +##set_property IOSTANDARD LVCMOS18 [get_ports HDMI_R_SPDIF] +##set_property PACKAGE_PIN T20 [get_ports HDMI_SPDIF_OUT_LS] +##set_property IOSTANDARD LVCMOS18 [get_ports HDMI_SPDIF_OUT_LS] +##set_property PACKAGE_PIN U20 [get_ports HDMI_R_D18] +##set_property IOSTANDARD LVCMOS18 [get_ports HDMI_R_D18] +##set_property PACKAGE_PIN W20 [get_ports HDMI_R_D20] +##set_property IOSTANDARD LVCMOS18 [get_ports HDMI_R_D20] +##set_property PACKAGE_PIN Y20 [get_ports HDMI_R_D22] +##set_property IOSTANDARD LVCMOS18 [get_ports HDMI_R_D22] +##set_property PACKAGE_PIN T19 [get_ports USB_UART_TX] +##set_property IOSTANDARD LVCMOS18 [get_ports USB_UART_TX] +##set_property PACKAGE_PIN U19 [get_ports USB_UART_RX] +##set_property IOSTANDARD LVCMOS18 [get_ports USB_UART_RX] +##set_property PACKAGE_PIN V19 [get_ports USB_UART_RTS] +##set_property IOSTANDARD LVCMOS18 [get_ports USB_UART_RTS] +##set_property PACKAGE_PIN W19 [get_ports USB_UART_CTS] +##set_property IOSTANDARD LVCMOS18 [get_ports USB_UART_CTS] +##set_property PACKAGE_PIN V18 [get_ports PHY_RESET_B] +##set_property IOSTANDARD LVCMOS18 [get_ports PHY_RESET_B] +##set_property PACKAGE_PIN W18 [get_ports PHY_MDC] +##set_property IOSTANDARD LVCMOS18 [get_ports PHY_MDC] +##set_property PACKAGE_PIN T14 [get_ports PHY_MDIO] +##set_property IOSTANDARD LVCMOS18 [get_ports PHY_MDIO] +##set_property PACKAGE_PIN T15 [get_ports PHY_TX_CTRL] +##set_property IOSTANDARD HSTL_I_18 [get_ports PHY_TX_CTRL] +##set_property PACKAGE_PIN T17 [get_ports PHY_TXD3] +##set_property IOSTANDARD HSTL_I_18 [get_ports PHY_TXD3] +##set_property PACKAGE_PIN T18 [get_ports PHY_TXD2] +##set_property IOSTANDARD HSTL_I_18 [get_ports PHY_TXD2] +##set_property PACKAGE_PIN U15 [get_ports PHY_TXD1] +##set_property IOSTANDARD HSTL_I_18 [get_ports PHY_TXD1] +##set_property PACKAGE_PIN U16 [get_ports PHY_TXD0] +##set_property IOSTANDARD HSTL_I_18 [get_ports PHY_TXD0] +##set_property PACKAGE_PIN U14 [get_ports PHY_RX_CTRL] +##set_property IOSTANDARD HSTL_I_18 [get_ports PHY_RX_CTRL] +##set_property PACKAGE_PIN V14 [get_ports PHY_RXD3] +##set_property IOSTANDARD HSTL_I_18 [get_ports PHY_RXD3] +##set_property PACKAGE_PIN V16 [get_ports PHY_RXD2] +##set_property IOSTANDARD HSTL_I_18 [get_ports PHY_RXD2] +##set_property PACKAGE_PIN V17 [get_ports PHY_RXD1] +##set_property IOSTANDARD HSTL_I_18 [get_ports PHY_RXD1] +##set_property PACKAGE_PIN U17 [get_ports PHY_RXD0] +##set_property IOSTANDARD HSTL_I_18 [get_ports PHY_RXD0] +##set_property PACKAGE_PIN M19 [get_ports SI5324_INT_ALM_B] +##set_property IOSTANDARD LVCMOS33 [get_ports SI5324_INT_ALM_B] +##set_property PACKAGE_PIN R14 [get_ports FLASH_D0] +##set_property IOSTANDARD LVCMOS33 [get_ports FLASH_D0] +##set_property PACKAGE_PIN R15 [get_ports FLASH_D1] +##set_property IOSTANDARD LVCMOS33 [get_ports FLASH_D1] +##set_property PACKAGE_PIN P14 [get_ports FLASH_D2] +##set_property IOSTANDARD LVCMOS33 [get_ports FLASH_D2] +##set_property PACKAGE_PIN N14 [get_ports FLASH_D3] +##set_property IOSTANDARD LVCMOS33 [get_ports FLASH_D3] +##set_property PACKAGE_PIN P15 [get_ports CTRL2_PWRGOOD] +##set_property IOSTANDARD LVCMOS33 [get_ports CTRL2_PWRGOOD] +##set_property PACKAGE_PIN P16 [get_ports FPGA_EMCCLK] +##set_property IOSTANDARD LVCMOS33 [get_ports FPGA_EMCCLK] +##set_property PACKAGE_PIN N16 [get_ports FMC1_HPC_PRSNT_M2C_B] +##set_property IOSTANDARD LVCMOS33 [get_ports FMC1_HPC_PRSNT_M2C_B] +##set_property PACKAGE_PIN N17 [get_ports FMC1_HPC_PG_M2C] +##set_property IOSTANDARD LVCMOS33 [get_ports FMC1_HPC_PG_M2C] +##set_property PACKAGE_PIN R16 [get_ports FMC_VADJ_ON_B] +##set_property IOSTANDARD LVCMOS33 [get_ports FMC_VADJ_ON_B] +##set_property PACKAGE_PIN R17 [get_ports IIC_MUX_RESET_B] +##set_property IOSTANDARD LVCMOS33 [get_ports IIC_MUX_RESET_B] +##set_property PACKAGE_PIN P18 [get_ports QSPI_IC_CS_B] +##set_property IOSTANDARD LVCMOS33 [get_ports QSPI_IC_CS_B] +##set_property PACKAGE_PIN N18 [get_ports IIC_SCL_MAIN] +##set_property IOSTANDARD LVCMOS33 [get_ports IIC_SCL_MAIN] +##set_property PACKAGE_PIN K25 [get_ports IIC_SDA_MAIN] +##set_property IOSTANDARD LVCMOS33 [get_ports IIC_SDA_MAIN] +##set_property PACKAGE_PIN K26 [get_ports PCIE_WAKE_B] +##set_property IOSTANDARD LVCMOS33 [get_ports PCIE_WAKE_B] +##set_property PACKAGE_PIN M20 [get_ports PCIE_PERST] +##set_property IOSTANDARD LVCMOS33 [get_ports PCIE_PERST] +##set_property PACKAGE_PIN L20 [get_ports LCD_E_LS] +##set_property IOSTANDARD LVCMOS33 [get_ports LCD_E_LS] +##set_property PACKAGE_PIN L24 [get_ports LCD_RW_LS] +##set_property IOSTANDARD LVCMOS33 [get_ports LCD_RW_LS] +##set_property PACKAGE_PIN L25 [get_ports LCD_DB4_LS] +##set_property IOSTANDARD LVCMOS33 [get_ports LCD_DB4_LS] +##set_property PACKAGE_PIN M24 [get_ports LCD_DB5_LS] +##set_property IOSTANDARD LVCMOS33 [get_ports LCD_DB5_LS] +##set_property PACKAGE_PIN M25 [get_ports LCD_DB6_LS] +##set_property IOSTANDARD LVCMOS33 [get_ports LCD_DB6_LS] +##set_property PACKAGE_PIN L22 [get_ports LCD_DB7_LS] +##set_property IOSTANDARD LVCMOS33 [get_ports LCD_DB7_LS] +##set_property PACKAGE_PIN L23 [get_ports LCD_RS_LS] +##set_property IOSTANDARD LVCMOS33 [get_ports LCD_RS_LS] +##set_property PACKAGE_PIN M21 [get_ports USER_CLOCK_P] +##set_property IOSTANDARD LVDS_25 [get_ports USER_CLOCK_P] +##set_property PACKAGE_PIN M22 [get_ports USER_CLOCK_N] +##set_property IOSTANDARD LVDS_25 [get_ports USER_CLOCK_N] +##set_property PACKAGE_PIN N21 [get_ports ROTARY_PUSH] +##set_property IOSTANDARD LVCMOS33 [get_ports ROTARY_PUSH] +##set_property PACKAGE_PIN N22 [get_ports ROTARY_INCA] +##set_property IOSTANDARD LVCMOS33 [get_ports ROTARY_INCA] +##set_property PACKAGE_PIN P20 [get_ports ROTARY_INCB] +##set_property IOSTANDARD LVCMOS33 [get_ports ROTARY_INCB] +##set_property PACKAGE_PIN P21 [get_ports SDIO_CD_DAT3] +##set_property IOSTANDARD LVCMOS33 [get_ports SDIO_CD_DAT3] +##set_property PACKAGE_PIN N23 [get_ports SDIO_CMD] +##set_property IOSTANDARD LVCMOS33 [get_ports SDIO_CMD] +##set_property PACKAGE_PIN N24 [get_ports SDIO_CLK] +##set_property IOSTANDARD LVCMOS33 [get_ports SDIO_CLK] +##set_property PACKAGE_PIN P19 [get_ports SDIO_DAT0] +##set_property IOSTANDARD LVCMOS33 [get_ports SDIO_DAT0] +##set_property PACKAGE_PIN N19 [get_ports SDIO_DAT1] +##set_property IOSTANDARD LVCMOS33 [get_ports SDIO_DAT1] +##set_property PACKAGE_PIN P23 [get_ports SDIO_DAT2] +##set_property IOSTANDARD LVCMOS33 [get_ports SDIO_DAT2] +##set_property PACKAGE_PIN P24 [get_ports SDIO_SDDET] +##set_property IOSTANDARD LVCMOS33 [get_ports SDIO_SDDET] +##set_property PACKAGE_PIN R20 [get_ports SDIO_SDWP] +##set_property IOSTANDARD LVCMOS33 [get_ports SDIO_SDWP] +##set_property PACKAGE_PIN R21 [get_ports PMBUS_CLK_LS] +##set_property IOSTANDARD LVCMOS33 [get_ports PMBUS_CLK_LS] +##set_property PACKAGE_PIN R25 [get_ports PMBUS_DATA_LS] +##set_property IOSTANDARD LVCMOS33 [get_ports PMBUS_DATA_LS] +##set_property PACKAGE_PIN P25 [get_ports PMBUS_CTRL_LS] +##set_property IOSTANDARD LVCMOS33 [get_ports PMBUS_CTRL_LS] +##set_property PACKAGE_PIN N26 [get_ports PMBUS_ALERT_LS] +##set_property IOSTANDARD LVCMOS33 [get_ports PMBUS_ALERT_LS] +##set_property PACKAGE_PIN M26 [get_ports GPIO_LED_0] +##set_property IOSTANDARD LVCMOS33 [get_ports GPIO_LED_0] +##set_property PACKAGE_PIN T24 [get_ports GPIO_LED_1] +##set_property IOSTANDARD LVCMOS33 [get_ports GPIO_LED_1] +##set_property PACKAGE_PIN T25 [get_ports GPIO_LED_2] +##set_property IOSTANDARD LVCMOS33 [get_ports GPIO_LED_2] +##set_property PACKAGE_PIN R26 [get_ports GPIO_LED_3] +##set_property IOSTANDARD LVCMOS33 [get_ports GPIO_LED_3] +##set_property PACKAGE_PIN P26 [get_ports PMOD_0] +##set_property IOSTANDARD LVCMOS33 [get_ports PMOD_0] +##set_property PACKAGE_PIN T22 [get_ports PMOD_1] +##set_property IOSTANDARD LVCMOS33 [get_ports PMOD_1] +##set_property PACKAGE_PIN R22 [get_ports PMOD_2] +##set_property IOSTANDARD LVCMOS33 [get_ports PMOD_2] +##set_property PACKAGE_PIN T23 [get_ports PMOD_3] +##set_property IOSTANDARD LVCMOS33 [get_ports PMOD_3] +##set_property PACKAGE_PIN R23 [get_ports SFP_LOS] +##set_property IOSTANDARD LVCMOS33 [get_ports SFP_LOS] +##set_property PACKAGE_PIN R18 [get_ports SFP_TX_DISABLE] +##set_property IOSTANDARD LVCMOS33 [get_ports SFP_TX_DISABLE] +##set_property PACKAGE_PIN K18 [get_ports XADC_GPIO_2] +##set_property IOSTANDARD LVCMOS25 [get_ports XADC_GPIO_2] +##set_property PACKAGE_PIN K15 [get_ports XADC_VAUX0_R_P] +##set_property IOSTANDARD LVCMOS25 [get_ports XADC_VAUX0_R_P] +##set_property PACKAGE_PIN J16 [get_ports XADC_VAUX0_R_N] +##set_property IOSTANDARD LVCMOS25 [get_ports XADC_VAUX0_R_N] +##set_property PACKAGE_PIN J14 [get_ports XADC_VAUX8_R_P] +##set_property IOSTANDARD LVCMOS25 [get_ports XADC_VAUX8_R_P] +##set_property PACKAGE_PIN J15 [get_ports XADC_VAUX8_R_N] +##set_property IOSTANDARD LVCMOS25 [get_ports XADC_VAUX8_R_N] +##set_property PACKAGE_PIN K16 [get_ports XADC_AD1_R_P] +##set_property IOSTANDARD LVCMOS25 [get_ports XADC_AD1_R_P] +##set_property PACKAGE_PIN K17 [get_ports XADC_AD1_R_N] +##set_property IOSTANDARD LVCMOS25 [get_ports XADC_AD1_R_N] +##set_property PACKAGE_PIN M14 [get_ports FMC1_HPC_LA19_P] +##set_property IOSTANDARD LVCMOS25 [get_ports FMC1_HPC_LA19_P] +##set_property PACKAGE_PIN L14 [get_ports FMC1_HPC_LA19_N] +##set_property IOSTANDARD LVCMOS25 [get_ports FMC1_HPC_LA19_N] +##set_property PACKAGE_PIN M15 [get_ports XADC_AD9_R_P] +##set_property IOSTANDARD LVCMOS25 [get_ports XADC_AD9_R_P] +##set_property PACKAGE_PIN L15 [get_ports XADC_AD9_R_N] +##set_property IOSTANDARD LVCMOS25 [get_ports XADC_AD9_R_N] +##set_property PACKAGE_PIN M16 [get_ports FMC1_HPC_LA20_P] +##set_property IOSTANDARD LVCMOS25 [get_ports FMC1_HPC_LA20_P] +##set_property PACKAGE_PIN M17 [get_ports FMC1_HPC_LA20_N] +##set_property IOSTANDARD LVCMOS25 [get_ports FMC1_HPC_LA20_N] +##set_property PACKAGE_PIN J19 [get_ports FMC1_HPC_LA21_P] +##set_property IOSTANDARD LVCMOS25 [get_ports FMC1_HPC_LA21_P] +##set_property PACKAGE_PIN H19 [get_ports FMC1_HPC_LA21_N] +##set_property IOSTANDARD LVCMOS25 [get_ports FMC1_HPC_LA21_N] +##set_property PACKAGE_PIN L17 [get_ports FMC1_HPC_LA22_P] +##set_property IOSTANDARD LVCMOS25 [get_ports FMC1_HPC_LA22_P] +##set_property PACKAGE_PIN L18 [get_ports FMC1_HPC_LA22_N] +##set_property IOSTANDARD LVCMOS25 [get_ports FMC1_HPC_LA22_N] +##set_property PACKAGE_PIN K20 [get_ports FMC1_HPC_LA23_P] +##set_property IOSTANDARD LVCMOS25 [get_ports FMC1_HPC_LA23_P] +##set_property PACKAGE_PIN J20 [get_ports FMC1_HPC_LA23_N] +##set_property IOSTANDARD LVCMOS25 [get_ports FMC1_HPC_LA23_N] +##set_property PACKAGE_PIN J18 [get_ports FMC1_HPC_LA24_P] +##set_property IOSTANDARD LVCMOS25 [get_ports FMC1_HPC_LA24_P] +##set_property PACKAGE_PIN H18 [get_ports FMC1_HPC_LA24_N] +##set_property IOSTANDARD LVCMOS25 [get_ports FMC1_HPC_LA24_N] +##set_property PACKAGE_PIN G20 [get_ports FMC1_HPC_LA18_CC_P] +##set_property IOSTANDARD LVCMOS25 [get_ports FMC1_HPC_LA18_CC_P] +##set_property PACKAGE_PIN G21 [get_ports FMC1_HPC_LA18_CC_N] +##set_property IOSTANDARD LVCMOS25 [get_ports FMC1_HPC_LA18_CC_N] +##set_property PACKAGE_PIN K21 [get_ports FMC1_HPC_LA17_CC_P] +##set_property IOSTANDARD LVCMOS25 [get_ports FMC1_HPC_LA17_CC_P] +##set_property PACKAGE_PIN J21 [get_ports FMC1_HPC_LA17_CC_N] +##set_property IOSTANDARD LVCMOS25 [get_ports FMC1_HPC_LA17_CC_N] +##set_property PACKAGE_PIN H21 [get_ports FMC1_HPC_CLK1_M2C_P] +##set_property IOSTANDARD LVDS_25 [get_ports FMC1_HPC_CLK1_M2C_P] +##set_property PACKAGE_PIN H22 [get_ports FMC1_HPC_CLK1_M2C_N] +##set_property IOSTANDARD LVDS_25 [get_ports FMC1_HPC_CLK1_M2C_N] +##set_property PACKAGE_PIN J23 [get_ports USER_SMA_CLOCK_P] +##set_property IOSTANDARD LVCMOS25 [get_ports USER_SMA_CLOCK_P] +##set_property PACKAGE_PIN H23 [get_ports USER_SMA_CLOCK_N] +##set_property IOSTANDARD LVCMOS25 [get_ports USER_SMA_CLOCK_N] +##set_property PACKAGE_PIN G22 [get_ports FMC1_HPC_LA25_P] +##set_property IOSTANDARD LVCMOS25 [get_ports FMC1_HPC_LA25_P] +##set_property PACKAGE_PIN F22 [get_ports FMC1_HPC_LA25_N] +##set_property IOSTANDARD LVCMOS25 [get_ports FMC1_HPC_LA25_N] +##set_property PACKAGE_PIN J24 [get_ports FMC1_HPC_LA26_P] +##set_property IOSTANDARD LVCMOS25 [get_ports FMC1_HPC_LA26_P] +##set_property PACKAGE_PIN H24 [get_ports FMC1_HPC_LA26_N] +##set_property IOSTANDARD LVCMOS25 [get_ports FMC1_HPC_LA26_N] +##set_property PACKAGE_PIN F23 [get_ports FMC1_HPC_LA27_P] +##set_property IOSTANDARD LVCMOS25 [get_ports FMC1_HPC_LA27_P] +##set_property PACKAGE_PIN E23 [get_ports FMC1_HPC_LA27_N] +##set_property IOSTANDARD LVCMOS25 [get_ports FMC1_HPC_LA27_N] +##set_property PACKAGE_PIN K22 [get_ports FMC1_HPC_LA28_P] +##set_property IOSTANDARD LVCMOS25 [get_ports FMC1_HPC_LA28_P] +##set_property PACKAGE_PIN K23 [get_ports FMC1_HPC_LA28_N] +##set_property IOSTANDARD LVCMOS25 [get_ports FMC1_HPC_LA28_N] +##set_property PACKAGE_PIN G24 [get_ports FMC1_HPC_LA29_P] +##set_property IOSTANDARD LVCMOS25 [get_ports FMC1_HPC_LA29_P] +##set_property PACKAGE_PIN F24 [get_ports FMC1_HPC_LA29_N] +##set_property IOSTANDARD LVCMOS25 [get_ports FMC1_HPC_LA29_N] +##set_property PACKAGE_PIN E25 [get_ports FMC1_HPC_LA30_P] +##set_property IOSTANDARD LVCMOS25 [get_ports FMC1_HPC_LA30_P] +##set_property PACKAGE_PIN D25 [get_ports FMC1_HPC_LA30_N] +##set_property IOSTANDARD LVCMOS25 [get_ports FMC1_HPC_LA30_N] +##set_property PACKAGE_PIN E26 [get_ports FMC1_HPC_LA31_P] +##set_property IOSTANDARD LVCMOS25 [get_ports FMC1_HPC_LA31_P] +##set_property PACKAGE_PIN D26 [get_ports FMC1_HPC_LA31_N] +##set_property IOSTANDARD LVCMOS25 [get_ports FMC1_HPC_LA31_N] +##set_property PACKAGE_PIN H26 [get_ports FMC1_HPC_LA32_P] +##set_property IOSTANDARD LVCMOS25 [get_ports FMC1_HPC_LA32_P] +##set_property PACKAGE_PIN G26 [get_ports FMC1_HPC_LA32_N] +##set_property IOSTANDARD LVCMOS25 [get_ports FMC1_HPC_LA32_N] +##set_property PACKAGE_PIN G25 [get_ports FMC1_HPC_LA33_P] +##set_property IOSTANDARD LVCMOS25 [get_ports FMC1_HPC_LA33_P] +##set_property PACKAGE_PIN F25 [get_ports FMC1_HPC_LA33_N] +##set_property IOSTANDARD LVCMOS25 [get_ports FMC1_HPC_LA33_N] +##set_property PACKAGE_PIN J25 [get_ports SM_FAN_TACH] +##set_property IOSTANDARD LVCMOS25 [get_ports SM_FAN_TACH] +##set_property PACKAGE_PIN J26 [get_ports SM_FAN_PWM] +##set_property IOSTANDARD LVCMOS25 [get_ports SM_FAN_PWM] +##set_property PACKAGE_PIN L19 [get_ports XADC_GPIO_3] +##set_property IOSTANDARD LVCMOS25 [get_ports XADC_GPIO_3] +##set_property PACKAGE_PIN H17 [get_ports XADC_GPIO_0] +##set_property IOSTANDARD LVCMOS25 [get_ports XADC_GPIO_0] +##set_property PACKAGE_PIN H14 [get_ports FMC1_HPC_LA02_P] +##set_property IOSTANDARD LVCMOS25 [get_ports FMC1_HPC_LA02_P] +##set_property PACKAGE_PIN H15 [get_ports FMC1_HPC_LA02_N] +##set_property IOSTANDARD LVCMOS25 [get_ports FMC1_HPC_LA02_N] +##set_property PACKAGE_PIN G17 [get_ports FMC1_HPC_LA03_P] +##set_property IOSTANDARD LVCMOS25 [get_ports FMC1_HPC_LA03_P] +##set_property PACKAGE_PIN F17 [get_ports FMC1_HPC_LA03_N] +##set_property IOSTANDARD LVCMOS25 [get_ports FMC1_HPC_LA03_N] +##set_property PACKAGE_PIN F18 [get_ports FMC1_HPC_LA04_P] +##set_property IOSTANDARD LVCMOS25 [get_ports FMC1_HPC_LA04_P] +##set_property PACKAGE_PIN F19 [get_ports FMC1_HPC_LA04_N] +##set_property IOSTANDARD LVCMOS25 [get_ports FMC1_HPC_LA04_N] +##set_property PACKAGE_PIN G15 [get_ports FMC1_HPC_LA05_P] +##set_property IOSTANDARD LVCMOS25 [get_ports FMC1_HPC_LA05_P] +##set_property PACKAGE_PIN F15 [get_ports FMC1_HPC_LA05_N] +##set_property IOSTANDARD LVCMOS25 [get_ports FMC1_HPC_LA05_N] +##set_property PACKAGE_PIN G19 [get_ports FMC1_HPC_LA06_P] +##set_property IOSTANDARD LVCMOS25 [get_ports FMC1_HPC_LA06_P] +##set_property PACKAGE_PIN F20 [get_ports FMC1_HPC_LA06_N] +##set_property IOSTANDARD LVCMOS25 [get_ports FMC1_HPC_LA06_N] +##set_property PACKAGE_PIN H16 [get_ports FMC1_HPC_LA07_P] +##set_property IOSTANDARD LVCMOS25 [get_ports FMC1_HPC_LA07_P] +##set_property PACKAGE_PIN G16 [get_ports FMC1_HPC_LA07_N] +##set_property IOSTANDARD LVCMOS25 [get_ports FMC1_HPC_LA07_N] +##set_property PACKAGE_PIN C17 [get_ports FMC1_HPC_LA08_P] +##set_property IOSTANDARD LVCMOS25 [get_ports FMC1_HPC_LA08_P] +##set_property PACKAGE_PIN B17 [get_ports FMC1_HPC_LA08_N] +##set_property IOSTANDARD LVCMOS25 [get_ports FMC1_HPC_LA08_N] +##set_property PACKAGE_PIN E16 [get_ports FMC1_HPC_LA09_P] +##set_property IOSTANDARD LVCMOS25 [get_ports FMC1_HPC_LA09_P] +##set_property PACKAGE_PIN D16 [get_ports FMC1_HPC_LA09_N] +##set_property IOSTANDARD LVCMOS25 [get_ports FMC1_HPC_LA09_N] +##set_property PACKAGE_PIN A17 [get_ports FMC1_HPC_LA10_P] +##set_property IOSTANDARD LVCMOS25 [get_ports FMC1_HPC_LA10_P] +##set_property PACKAGE_PIN A18 [get_ports FMC1_HPC_LA10_N] +##set_property IOSTANDARD LVCMOS25 [get_ports FMC1_HPC_LA10_N] +##set_property PACKAGE_PIN B19 [get_ports FMC1_HPC_LA11_P] +##set_property IOSTANDARD LVCMOS25 [get_ports FMC1_HPC_LA11_P] +##set_property PACKAGE_PIN A19 [get_ports FMC1_HPC_LA11_N] +##set_property IOSTANDARD LVCMOS25 [get_ports FMC1_HPC_LA11_N] +##set_property PACKAGE_PIN E17 [get_ports FMC1_HPC_LA01_CC_P] +##set_property IOSTANDARD LVCMOS25 [get_ports FMC1_HPC_LA01_CC_P] +##set_property PACKAGE_PIN E18 [get_ports FMC1_HPC_LA01_CC_N] +##set_property IOSTANDARD LVCMOS25 [get_ports FMC1_HPC_LA01_CC_N] +##set_property PACKAGE_PIN D18 [get_ports FMC1_HPC_LA00_CC_P] +##set_property IOSTANDARD LVCMOS25 [get_ports FMC1_HPC_LA00_CC_P] +##set_property PACKAGE_PIN C18 [get_ports FMC1_HPC_LA00_CC_N] +##set_property IOSTANDARD LVCMOS25 [get_ports FMC1_HPC_LA00_CC_N] +##set_property PACKAGE_PIN D19 [get_ports FMC1_HPC_CLK0_M2C_P] +##set_property IOSTANDARD LVDS_25 [get_ports FMC1_HPC_CLK0_M2C_P] +##set_property PACKAGE_PIN C19 [get_ports FMC1_HPC_CLK0_M2C_N] +##set_property IOSTANDARD LVDS_25 [get_ports FMC1_HPC_CLK0_M2C_N] +##set_property PACKAGE_PIN E20 [get_ports FMC1_HPC_LA12_P] +##set_property IOSTANDARD LVCMOS25 [get_ports FMC1_HPC_LA12_P] +##set_property PACKAGE_PIN D20 [get_ports FMC1_HPC_LA12_N] +##set_property IOSTANDARD LVCMOS25 [get_ports FMC1_HPC_LA12_N] +##set_property PACKAGE_PIN B20 [get_ports FMC1_HPC_LA13_P] +##set_property IOSTANDARD LVCMOS25 [get_ports FMC1_HPC_LA13_P] +##set_property PACKAGE_PIN A20 [get_ports FMC1_HPC_LA13_N] +##set_property IOSTANDARD LVCMOS25 [get_ports FMC1_HPC_LA13_N] +##set_property PACKAGE_PIN C21 [get_ports FMC1_HPC_LA14_P] +##set_property IOSTANDARD LVCMOS25 [get_ports FMC1_HPC_LA14_P] +##set_property PACKAGE_PIN B21 [get_ports FMC1_HPC_LA14_N] +##set_property IOSTANDARD LVCMOS25 [get_ports FMC1_HPC_LA14_N] +##set_property PACKAGE_PIN B22 [get_ports FMC1_HPC_LA15_P] +##set_property IOSTANDARD LVCMOS25 [get_ports FMC1_HPC_LA15_P] +##set_property PACKAGE_PIN A22 [get_ports FMC1_HPC_LA15_N] +##set_property IOSTANDARD LVCMOS25 [get_ports FMC1_HPC_LA15_N] +##set_property PACKAGE_PIN E21 [get_ports FMC1_HPC_LA16_P] +##set_property IOSTANDARD LVCMOS25 [get_ports FMC1_HPC_LA16_P] +##set_property PACKAGE_PIN D21 [get_ports FMC1_HPC_LA16_N] +##set_property IOSTANDARD LVCMOS25 [get_ports FMC1_HPC_LA16_N] +##set_property PACKAGE_PIN C22 [get_ports No] +##set_property IOSTANDARD LVCMOS25 [get_ports No] +##set_property PACKAGE_PIN C23 [get_ports No] +##set_property IOSTANDARD LVCMOS25 [get_ports No] +##set_property PACKAGE_PIN B25 [get_ports XADC_MUX_ADDR0_LS] +##set_property IOSTANDARD LVCMOS25 [get_ports XADC_MUX_ADDR0_LS] +##set_property PACKAGE_PIN A25 [get_ports XADC_MUX_ADDR1_LS] +##set_property IOSTANDARD LVCMOS25 [get_ports XADC_MUX_ADDR1_LS] +##set_property PACKAGE_PIN A23 [get_ports XADC_MUX_ADDR2_LS] +##set_property IOSTANDARD LVCMOS25 [get_ports XADC_MUX_ADDR2_LS] +##set_property PACKAGE_PIN A24 [get_ports PCIE_MGT_CLK_SEL0] +##set_property IOSTANDARD LVCMOS25 [get_ports PCIE_MGT_CLK_SEL0] +##set_property PACKAGE_PIN C26 [get_ports PCIE_MGT_CLK_SEL1] +##set_property IOSTANDARD LVCMOS25 [get_ports PCIE_MGT_CLK_SEL1] +##set_property PACKAGE_PIN B26 [get_ports SFP_MGT_CLK_SEL0] +##set_property IOSTANDARD LVCMOS25 [get_ports SFP_MGT_CLK_SEL0] +##set_property PACKAGE_PIN C24 [get_ports SFP_MGT_CLK_SEL1] +##set_property IOSTANDARD LVCMOS25 [get_ports SFP_MGT_CLK_SEL1] +##set_property PACKAGE_PIN B24 [get_ports SI5324_RST_LS_B] +##set_property IOSTANDARD LVCMOS25 [get_ports SI5324_RST_LS_B] +##set_property PACKAGE_PIN D23 [get_ports REC_CLOCK_C_P] +##set_property IOSTANDARD LVDS_25 [get_ports REC_CLOCK_C_P] +##set_property PACKAGE_PIN D24 [get_ports REC_CLOCK_C_N] +##set_property IOSTANDARD LVDS_25 [get_ports REC_CLOCK_C_N] +##set_property PACKAGE_PIN E22 [get_ports XADC_GPIO_1] +##set_property IOSTANDARD LVCMOS25 [get_ports XADC_GPIO_1] +##set_property PACKAGE_PIN V4 [get_ports No] +##set_property IOSTANDARD LVCMOS15 [get_ports No] +##set_property PACKAGE_PIN V1 [get_ports DDR3_D31] +##set_property IOSTANDARD SSTL15 [get_ports DDR3_D31] +##set_property PACKAGE_PIN W1 [get_ports DDR3_D30] +##set_property IOSTANDARD SSTL15 [get_ports DDR3_D30] +##set_property PACKAGE_PIN W5 [get_ports DDR3_D29] +##set_property IOSTANDARD SSTL15 [get_ports DDR3_D29] +##set_property PACKAGE_PIN W4 [get_ports DDR3_D28] +##set_property IOSTANDARD SSTL15 [get_ports DDR3_D28] +##set_property PACKAGE_PIN V3 [get_ports DDR3_DQS3_P] +##set_property IOSTANDARD DIFF_SSTL15 [get_ports DDR3_DQS3_P] +##set_property PACKAGE_PIN V2 [get_ports DDR3_DQS3_N] +##set_property IOSTANDARD DIFF_SSTL15 [get_ports DDR3_DQS3_N] +##set_property PACKAGE_PIN V6 [get_ports DDR3_D27] +##set_property IOSTANDARD SSTL15 [get_ports DDR3_D27] +##set_property PACKAGE_PIN W6 [get_ports DDR3_D26] +##set_property IOSTANDARD SSTL15 [get_ports DDR3_D26] +##set_property PACKAGE_PIN W3 [get_ports DDR3_D25] +##set_property IOSTANDARD SSTL15 [get_ports DDR3_D25] +##set_property PACKAGE_PIN Y3 [get_ports DDR3_D24] +##set_property IOSTANDARD SSTL15 [get_ports DDR3_D24] +##set_property PACKAGE_PIN U7 [get_ports DDR3_DM3] +##set_property IOSTANDARD SSTL15 [get_ports DDR3_DM3] +##set_property PACKAGE_PIN V7 [get_ports VTTVREF] +##set_property IOSTANDARD SSTL15 [get_ports VTTVREF] +##set_property PACKAGE_PIN AB1 [get_ports DDR3_D23] +##set_property IOSTANDARD SSTL15 [get_ports DDR3_D23] +##set_property PACKAGE_PIN AC1 [get_ports DDR3_D22] +##set_property IOSTANDARD SSTL15 [get_ports DDR3_D22] +##set_property PACKAGE_PIN Y2 [get_ports DDR3_D21] +##set_property IOSTANDARD SSTL15 [get_ports DDR3_D21] +##set_property PACKAGE_PIN Y1 [get_ports DDR3_D20] +##set_property IOSTANDARD SSTL15 [get_ports DDR3_D20] +##set_property PACKAGE_PIN AD1 [get_ports DDR3_DQS2_P] +##set_property IOSTANDARD DIFF_SSTL15 [get_ports DDR3_DQS2_P] +##set_property PACKAGE_PIN AE1 [get_ports DDR3_DQS2_N] +##set_property IOSTANDARD DIFF_SSTL15 [get_ports DDR3_DQS2_N] +##set_property PACKAGE_PIN AE2 [get_ports DDR3_D19] +##set_property IOSTANDARD SSTL15 [get_ports DDR3_D19] +##set_property PACKAGE_PIN AF2 [get_ports DDR3_D18] +##set_property IOSTANDARD SSTL15 [get_ports DDR3_D18] +##set_property PACKAGE_PIN AB2 [get_ports DDR3_D17] +##set_property IOSTANDARD SSTL15 [get_ports DDR3_D17] +##set_property PACKAGE_PIN AC2 [get_ports DDR3_D16] +##set_property IOSTANDARD SSTL15 [get_ports DDR3_D16] +##set_property PACKAGE_PIN AA3 [get_ports DDR3_DM2] +##set_property IOSTANDARD SSTL15 [get_ports DDR3_DM2] +##set_property PACKAGE_PIN AA2 [get_ports No] +##set_property IOSTANDARD SSTL15 [get_ports No] +##set_property PACKAGE_PIN AA4 [get_ports DDR3_D15] +##set_property IOSTANDARD SSTL15 [get_ports DDR3_D15] +##set_property PACKAGE_PIN AB4 [get_ports DDR3_D14] +##set_property IOSTANDARD SSTL15 [get_ports DDR3_D14] +##set_property PACKAGE_PIN AC3 [get_ports DDR3_D13] +##set_property IOSTANDARD SSTL15 [get_ports DDR3_D13] +##set_property PACKAGE_PIN AD3 [get_ports DDR3_D12] +##set_property IOSTANDARD SSTL15 [get_ports DDR3_D12] +##set_property PACKAGE_PIN AD5 [get_ports DDR3_DQS1_P] +##set_property IOSTANDARD DIFF_SSTL15 [get_ports DDR3_DQS1_P] +##set_property PACKAGE_PIN AE5 [get_ports DDR3_DQS1_N] +##set_property IOSTANDARD DIFF_SSTL15 [get_ports DDR3_DQS1_N] +##set_property PACKAGE_PIN AE3 [get_ports DDR3_D11] +##set_property IOSTANDARD SSTL15 [get_ports DDR3_D11] +##set_property PACKAGE_PIN AF3 [get_ports DDR3_D10] +##set_property IOSTANDARD SSTL15 [get_ports DDR3_D10] +##set_property PACKAGE_PIN AF5 [get_ports DDR3_D9] +##set_property IOSTANDARD SSTL15 [get_ports DDR3_D9] +##set_property PACKAGE_PIN AF4 [get_ports DDR3_D8] +##set_property IOSTANDARD SSTL15 [get_ports DDR3_D8] +##set_property PACKAGE_PIN AC4 [get_ports DDR3_DM1] +##set_property IOSTANDARD SSTL15 [get_ports DDR3_DM1] +##set_property PACKAGE_PIN AD4 [get_ports No] +##set_property IOSTANDARD SSTL15 [get_ports No] +##set_property PACKAGE_PIN Y7 [get_ports DDR3_D7] +##set_property IOSTANDARD SSTL15 [get_ports DDR3_D7] +##set_property PACKAGE_PIN AA7 [get_ports VTTVREF] +##set_property IOSTANDARD SSTL15 [get_ports VTTVREF] +##set_property PACKAGE_PIN Y6 [get_ports DDR3_D6] +##set_property IOSTANDARD SSTL15 [get_ports DDR3_D6] +##set_property PACKAGE_PIN Y5 [get_ports DDR3_D5] +##set_property IOSTANDARD SSTL15 [get_ports DDR3_D5] +##set_property PACKAGE_PIN V8 [get_ports DDR3_DQS0_P] +##set_property IOSTANDARD SSTL15 [get_ports DDR3_DQS0_P] +##set_property PACKAGE_PIN W8 [get_ports DDR3_DQS0_N] +##set_property IOSTANDARD SSTL15 [get_ports DDR3_DQS0_N] +##set_property PACKAGE_PIN AA5 [get_ports DDR3_D4] +##set_property IOSTANDARD SSTL15 [get_ports DDR3_D4] +##set_property PACKAGE_PIN AB5 [get_ports DDR3_D3] +##set_property IOSTANDARD SSTL15 [get_ports DDR3_D3] +##set_property PACKAGE_PIN Y8 [get_ports DDR3_D2] +##set_property IOSTANDARD SSTL15 [get_ports DDR3_D2] +##set_property PACKAGE_PIN AA8 [get_ports DDR3_D1] +##set_property IOSTANDARD SSTL15 [get_ports DDR3_D1] +##set_property PACKAGE_PIN AB6 [get_ports DDR3_D0] +##set_property IOSTANDARD SSTL15 [get_ports DDR3_D0] +##set_property PACKAGE_PIN AC6 [get_ports DDR3_DM0] +##set_property IOSTANDARD SSTL15 [get_ports DDR3_DM0] +##set_property PACKAGE_PIN V9 [get_ports No] +##set_property IOSTANDARD SSTL15 [get_ports No] +##set_property PACKAGE_PIN N8 [get_ports DDR3_RESET_B] +##set_property IOSTANDARD LVCMOS15 [get_ports DDR3_RESET_B] +##set_property PACKAGE_PIN K3 [get_ports DDR3_A9] +##set_property IOSTANDARD SSTL15 [get_ports DDR3_A9] +##set_property PACKAGE_PIN J3 [get_ports DDR3_A1] +##set_property IOSTANDARD SSTL15 [get_ports DDR3_A1] +##set_property PACKAGE_PIN M7 [get_ports DDR3_A5] +##set_property IOSTANDARD SSTL15 [get_ports DDR3_A5] +##set_property PACKAGE_PIN L7 [get_ports DDR3_A12] +##set_property IOSTANDARD SSTL15 [get_ports DDR3_A12] +##set_property PACKAGE_PIN M4 [get_ports DDR3_A0] +##set_property IOSTANDARD SSTL15 [get_ports DDR3_A0] +##set_property PACKAGE_PIN L4 [get_ports DDR3_A3] +##set_property IOSTANDARD SSTL15 [get_ports DDR3_A3] +##set_property PACKAGE_PIN L5 [get_ports DDR3_A11] +##set_property IOSTANDARD SSTL15 [get_ports DDR3_A11] +##set_property PACKAGE_PIN K5 [get_ports DDR3_A4] +##set_property IOSTANDARD SSTL15 [get_ports DDR3_A4] +##set_property PACKAGE_PIN N7 [get_ports DDR3_A10] +##set_property IOSTANDARD SSTL15 [get_ports DDR3_A10] +##set_property PACKAGE_PIN N6 [get_ports DDR3_A13] +##set_property IOSTANDARD SSTL15 [get_ports DDR3_A13] +##set_property PACKAGE_PIN M6 [get_ports DDR3_A7] +##set_property IOSTANDARD SSTL15 [get_ports DDR3_A7] +##set_property PACKAGE_PIN M5 [get_ports VTTVREF] +##set_property IOSTANDARD SSTL15 [get_ports VTTVREF] +##set_property PACKAGE_PIN K1 [get_ports DDR3_A6] +##set_property IOSTANDARD SSTL15 [get_ports DDR3_A6] +##set_property PACKAGE_PIN J1 [get_ports DDR3_A2] +##set_property IOSTANDARD SSTL15 [get_ports DDR3_A2] +##set_property PACKAGE_PIN L3 [get_ports DDR3_A14] +##set_property IOSTANDARD SSTL15 [get_ports DDR3_A14] +##set_property PACKAGE_PIN K2 [get_ports DDR3_A15] +##set_property IOSTANDARD SSTL15 [get_ports DDR3_A15] +##set_property PACKAGE_PIN N1 [get_ports DDR3_BA0] +##set_property IOSTANDARD SSTL15 [get_ports DDR3_BA0] +##set_property PACKAGE_PIN M1 [get_ports DDR3_BA1] +##set_property IOSTANDARD SSTL15 [get_ports DDR3_BA1] +##set_property PACKAGE_PIN H2 [get_ports DDR3_BA2] +##set_property IOSTANDARD SSTL15 [get_ports DDR3_BA2] +##set_property PACKAGE_PIN H1 [get_ports DDR3_A8] +##set_property IOSTANDARD SSTL15 [get_ports DDR3_A8] +##set_property PACKAGE_PIN M2 [get_ports DDR3_CLK0_P] +##set_property IOSTANDARD DIFF_SSTL15 [get_ports DDR3_CLK0_P] +##set_property PACKAGE_PIN L2 [get_ports DDR3_CLK0_N] +##set_property IOSTANDARD DIFF_SSTL15 [get_ports DDR3_CLK0_N] +##set_property PACKAGE_PIN N3 [get_ports DDR3_CLK1_P] +##set_property IOSTANDARD DIFF_SSTL15 [get_ports DDR3_CLK1_P] +##set_property PACKAGE_PIN N2 [get_ports DDR3_CLK1_N] +##set_property IOSTANDARD DIFF_SSTL15 [get_ports DDR3_CLK1_N] +##set_property PACKAGE_PIN R3 [get_ports SYSCLK_P] +##set_property IOSTANDARD LVDS_25 [get_ports SYSCLK_P] +##set_property PACKAGE_PIN P3 [get_ports SYSCLK_N] +##set_property IOSTANDARD LVDS_25 [get_ports SYSCLK_N] +##set_property PACKAGE_PIN P4 [get_ports DDR3_CKE0] +##set_property IOSTANDARD SSTL15 [get_ports DDR3_CKE0] +##set_property PACKAGE_PIN N4 [get_ports DDR3_CKE1] +##set_property IOSTANDARD SSTL15 [get_ports DDR3_CKE1] +##set_property PACKAGE_PIN R1 [get_ports DDR3_WE_B] +##set_property IOSTANDARD SSTL15 [get_ports DDR3_WE_B] +##set_property PACKAGE_PIN P1 [get_ports DDR3_RAS_B] +##set_property IOSTANDARD SSTL15 [get_ports DDR3_RAS_B] +##set_property PACKAGE_PIN T4 [get_ports DDR3_CAS_B] +##set_property IOSTANDARD SSTL15 [get_ports DDR3_CAS_B] +##set_property PACKAGE_PIN T3 [get_ports DDR3_S0_B] +##set_property IOSTANDARD SSTL15 [get_ports DDR3_S0_B] +##set_property PACKAGE_PIN T2 [get_ports DDR3_S1_B] +##set_property IOSTANDARD SSTL15 [get_ports DDR3_S1_B] +##set_property PACKAGE_PIN R2 [get_ports DDR3_ODT0] +##set_property IOSTANDARD SSTL15 [get_ports DDR3_ODT0] +##set_property PACKAGE_PIN U2 [get_ports DDR3_ODT1] +##set_property IOSTANDARD SSTL15 [get_ports DDR3_ODT1] +##set_property PACKAGE_PIN U1 [get_ports DDR3_TEMP_EVENT] +##set_property IOSTANDARD LVCMOS15 [get_ports DDR3_TEMP_EVENT] +##set_property PACKAGE_PIN P6 [get_ports GPIO_SW_N] +##set_property IOSTANDARD LVCMOS15 [get_ports GPIO_SW_N] +##set_property PACKAGE_PIN P5 [get_ports VTTVREF] +##set_property IOSTANDARD SSTL15 [get_ports VTTVREF] +##set_property PACKAGE_PIN T5 [get_ports GPIO_SW_S] +##set_property IOSTANDARD SSTL15 [get_ports GPIO_SW_S] +##set_property PACKAGE_PIN R5 [get_ports GPIO_SW_W] +##set_property IOSTANDARD SSTL15 [get_ports GPIO_SW_W] +##set_property PACKAGE_PIN U6 [get_ports GPIO_SW_C] +##set_property IOSTANDARD SSTL15 [get_ports GPIO_SW_C] +##set_property PACKAGE_PIN U5 [get_ports GPIO_SW_E] +##set_property IOSTANDARD SSTL15 [get_ports GPIO_SW_E] +##set_property PACKAGE_PIN R8 [get_ports GPIO_DIP_SW0] +##set_property IOSTANDARD SSTL15 [get_ports GPIO_DIP_SW0] +##set_property PACKAGE_PIN P8 [get_ports GPIO_DIP_SW1] +##set_property IOSTANDARD SSTL15 [get_ports GPIO_DIP_SW1] +##set_property PACKAGE_PIN R7 [get_ports GPIO_DIP_SW2] +##set_property IOSTANDARD SSTL15 [get_ports GPIO_DIP_SW2] +##set_property PACKAGE_PIN R6 [get_ports GPIO_DIP_SW3] +##set_property IOSTANDARD SSTL15 [get_ports GPIO_DIP_SW3] +##set_property PACKAGE_PIN T8 [get_ports USER_SMA_GPIO_P] +##set_property IOSTANDARD LVDS_25 [get_ports USER_SMA_GPIO_P] +##set_property PACKAGE_PIN T7 [get_ports USER_SMA_GPIO_N] +##set_property IOSTANDARD LVDS_25 [get_ports USER_SMA_GPIO_N] +##set_property PACKAGE_PIN U4 [get_ports CPU_RESET] +##set_property IOSTANDARD LVCMOS15 [get_ports CPU_RESET] +##set_property PACKAGE_PIN J8 [get_ports No] +##set_property IOSTANDARD SSTL15 [get_ports No] +##set_property PACKAGE_PIN E6 [get_ports DDR3_D63] +##set_property IOSTANDARD SSTL15 [get_ports DDR3_D63] +##set_property PACKAGE_PIN D6 [get_ports DDR3_D62] +##set_property IOSTANDARD SSTL15 [get_ports DDR3_D62] +##set_property PACKAGE_PIN H8 [get_ports DDR3_D61] +##set_property IOSTANDARD SSTL15 [get_ports DDR3_D61] +##set_property PACKAGE_PIN G8 [get_ports DDR3_D60] +##set_property IOSTANDARD SSTL15 [get_ports DDR3_D60] +##set_property PACKAGE_PIN H7 [get_ports DDR3_DQS7_P] +##set_property IOSTANDARD DIFF_SSTL15 [get_ports DDR3_DQS7_P] +##set_property PACKAGE_PIN G7 [get_ports DDR3_DQS7_N] +##set_property IOSTANDARD DIFF_SSTL15 [get_ports DDR3_DQS7_N] +##set_property PACKAGE_PIN F8 [get_ports DDR3_D59] +##set_property IOSTANDARD SSTL15 [get_ports DDR3_D59] +##set_property PACKAGE_PIN F7 [get_ports DDR3_D58] +##set_property IOSTANDARD SSTL15 [get_ports DDR3_D58] +##set_property PACKAGE_PIN H6 [get_ports DDR3_D57] +##set_property IOSTANDARD SSTL15 [get_ports DDR3_D57] +##set_property PACKAGE_PIN G6 [get_ports DDR3_D56] +##set_property IOSTANDARD SSTL15 [get_ports DDR3_D56] +##set_property PACKAGE_PIN H9 [get_ports DDR3_DM7] +##set_property IOSTANDARD SSTL15 [get_ports DDR3_DM7] +##set_property PACKAGE_PIN G9 [get_ports VTTVREF] +##set_property IOSTANDARD SSTL15 [get_ports VTTVREF] +##set_property PACKAGE_PIN J6 [get_ports DDR3_D55] +##set_property IOSTANDARD SSTL15 [get_ports DDR3_D55] +##set_property PACKAGE_PIN J5 [get_ports DDR3_D54] +##set_property IOSTANDARD SSTL15 [get_ports DDR3_D54] +##set_property PACKAGE_PIN L8 [get_ports DDR3_D53] +##set_property IOSTANDARD SSTL15 [get_ports DDR3_D53] +##set_property PACKAGE_PIN K8 [get_ports DDR3_D52] +##set_property IOSTANDARD SSTL15 [get_ports DDR3_D52] +##set_property PACKAGE_PIN J4 [get_ports DDR3_DQS6_P] +##set_property IOSTANDARD DIFF_SSTL15 [get_ports DDR3_DQS6_P] +##set_property PACKAGE_PIN H4 [get_ports DDR3_DQS6_N] +##set_property IOSTANDARD DIFF_SSTL15 [get_ports DDR3_DQS6_N] +##set_property PACKAGE_PIN K7 [get_ports DDR3_D51] +##set_property IOSTANDARD SSTL15 [get_ports DDR3_D51] +##set_property PACKAGE_PIN K6 [get_ports DDR3_D50] +##set_property IOSTANDARD SSTL15 [get_ports DDR3_D50] +##set_property PACKAGE_PIN G4 [get_ports DDR3_D49] +##set_property IOSTANDARD SSTL15 [get_ports DDR3_D49] +##set_property PACKAGE_PIN F4 [get_ports DDR3_D48] +##set_property IOSTANDARD SSTL15 [get_ports DDR3_D48] +##set_property PACKAGE_PIN G5 [get_ports DDR3_DM6] +##set_property IOSTANDARD SSTL15 [get_ports DDR3_DM6] +##set_property PACKAGE_PIN F5 [get_ports No] +##set_property IOSTANDARD SSTL15 [get_ports No] +##set_property PACKAGE_PIN E5 [get_ports DDR3_D47] +##set_property IOSTANDARD SSTL15 [get_ports DDR3_D47] +##set_property PACKAGE_PIN D5 [get_ports DDR3_D46] +##set_property IOSTANDARD SSTL15 [get_ports DDR3_D46] +##set_property PACKAGE_PIN D4 [get_ports DDR3_D45] +##set_property IOSTANDARD SSTL15 [get_ports DDR3_D45] +##set_property PACKAGE_PIN C4 [get_ports DDR3_D44] +##set_property IOSTANDARD SSTL15 [get_ports DDR3_D44] +##set_property PACKAGE_PIN B5 [get_ports DDR3_DQS5_P] +##set_property IOSTANDARD DIFF_SSTL15 [get_ports DDR3_DQS5_P] +##set_property PACKAGE_PIN A5 [get_ports DDR3_DQS5_N] +##set_property IOSTANDARD DIFF_SSTL15 [get_ports DDR3_DQS5_N] +##set_property PACKAGE_PIN B4 [get_ports DDR3_D43] +##set_property IOSTANDARD SSTL15 [get_ports DDR3_D43] +##set_property PACKAGE_PIN A4 [get_ports DDR3_D42] +##set_property IOSTANDARD SSTL15 [get_ports DDR3_D42] +##set_property PACKAGE_PIN D3 [get_ports DDR3_D41] +##set_property IOSTANDARD SSTL15 [get_ports DDR3_D41] +##set_property PACKAGE_PIN C3 [get_ports DDR3_D40] +##set_property IOSTANDARD SSTL15 [get_ports DDR3_D40] +##set_property PACKAGE_PIN F3 [get_ports DDR3_DM5] +##set_property IOSTANDARD SSTL15 [get_ports DDR3_DM5] +##set_property PACKAGE_PIN E3 [get_ports No] +##set_property IOSTANDARD SSTL15 [get_ports No] +##set_property PACKAGE_PIN C2 [get_ports DDR3_D39] +##set_property IOSTANDARD SSTL15 [get_ports DDR3_D39] +##set_property PACKAGE_PIN B2 [get_ports VTTVREF] +##set_property IOSTANDARD SSTL15 [get_ports VTTVREF] +##set_property PACKAGE_PIN A3 [get_ports DDR3_D38] +##set_property IOSTANDARD SSTL15 [get_ports DDR3_D38] +##set_property PACKAGE_PIN A2 [get_ports DDR3_D37] +##set_property IOSTANDARD SSTL15 [get_ports DDR3_D37] +##set_property PACKAGE_PIN C1 [get_ports DDR3_DQS4_P] +##set_property IOSTANDARD DIFF_SSTL15 [get_ports DDR3_DQS4_P] +##set_property PACKAGE_PIN B1 [get_ports DDR3_DQS4_N] +##set_property IOSTANDARD DIFF_SSTL15 [get_ports DDR3_DQS4_N] +##set_property PACKAGE_PIN F2 [get_ports DDR3_D36] +##set_property IOSTANDARD SSTL15 [get_ports DDR3_D36] +##set_property PACKAGE_PIN E2 [get_ports DDR3_D35] +##set_property IOSTANDARD SSTL15 [get_ports DDR3_D35] +##set_property PACKAGE_PIN E1 [get_ports DDR3_D34] +##set_property IOSTANDARD SSTL15 [get_ports DDR3_D34] +##set_property PACKAGE_PIN D1 [get_ports DDR3_D33] +##set_property IOSTANDARD SSTL15 [get_ports DDR3_D33] +##set_property PACKAGE_PIN G2 [get_ports DDR3_D32] +##set_property IOSTANDARD SSTL15 [get_ports DDR3_D32] +##set_property PACKAGE_PIN G1 [get_ports DDR3_DM4] +##set_property IOSTANDARD SSTL15 [get_ports DDR3_DM4] +##set_property PACKAGE_PIN H3 [get_ports No] +##set_property IOSTANDARD SSTL15 [get_ports No] +##set_property PACKAGE_PIN AB13 [get_ports SFP_MGT_CLK0_N] +##set_property IOSTANDARD LVDS_25 [get_ports SFP_MGT_CLK0_N] +##set_property PACKAGE_PIN AA13 [get_ports SFP_MGT_CLK0_P] +##set_property IOSTANDARD LVDS_25 [get_ports SFP_MGT_CLK0_P] +##set_property PACKAGE_PIN AF15 [get_ports MGTRREF_213] +##set_property IOSTANDARD LVDS_25 [get_ports MGTRREF_213] +##set_property PACKAGE_PIN AA11 [get_ports SFP_MGT_CLK1_P] +##set_property IOSTANDARD LVDS_25 [get_ports SFP_MGT_CLK1_P] +##set_property PACKAGE_PIN AB11 [get_ports SFP_MGT_CLK1_N] +##set_property IOSTANDARD LVDS_25 [get_ports SFP_MGT_CLK1_N] +##set_property PACKAGE_PIN E11 [get_ports PCIE_CLK_QO_N] +##set_property IOSTANDARD LVDS_25 [get_ports PCIE_CLK_QO_N] +##set_property PACKAGE_PIN F11 [get_ports PCIE_CLK_QO_P] +##set_property IOSTANDARD LVDS_25 [get_ports PCIE_CLK_QO_P] +##set_property PACKAGE_PIN A15 [get_ports MGTRREF_216] +##set_property IOSTANDARD LVDS_25 [get_ports MGTRREF_216] +##set_property PACKAGE_PIN F13 [get_ports No] +##set_property IOSTANDARD LVDS_25 [get_ports No] +##set_property PACKAGE_PIN E13 [get_ports No] +##set_property IOSTANDARD LVDS_25 [get_ports No] + + +set_property IOSTANDARD LVCMOS33 [get_ports {P0[0]} ] +set_property IOSTANDARD LVCMOS33 [get_ports {P0[1]} ] +set_property IOSTANDARD LVCMOS33 [get_ports {P0[2]} ] +set_property IOSTANDARD LVCMOS33 [get_ports {P0[3]} ] +set_property IOSTANDARD LVCMOS33 [get_ports {P0[4]} ] +set_property IOSTANDARD LVCMOS33 [get_ports {P0[5]} ] +set_property IOSTANDARD LVCMOS33 [get_ports {P0[6]} ] +set_property IOSTANDARD LVCMOS33 [get_ports {P0[7]} ] +set_property IOSTANDARD LVCMOS33 [get_ports {P0[8]} ] +set_property IOSTANDARD LVCMOS33 [get_ports {P0[9]} ] +set_property IOSTANDARD LVCMOS33 [get_ports {P0[10]} ] +set_property IOSTANDARD LVCMOS33 [get_ports {P0[11]} ] +set_property IOSTANDARD LVCMOS33 [get_ports {P0[12]} ] +set_property IOSTANDARD LVCMOS33 [get_ports {P0[13]} ] +set_property IOSTANDARD LVCMOS33 [get_ports {P0[14]} ] +set_property IOSTANDARD LVCMOS33 [get_ports {P0[15]} ] + +set_property PULLUP true [get_ports {P0[0]} ] +set_property PULLUP true [get_ports {P0[1]} ] +set_property PULLUP true [get_ports {P0[2]} ] +set_property PULLUP true [get_ports {P0[3]} ] +set_property PULLUP true [get_ports {P0[4]} ] +set_property PULLUP true [get_ports {P0[5]} ] +set_property PULLUP true [get_ports {P0[6]} ] +set_property PULLUP true [get_ports {P0[7]} ] +set_property PULLUP true [get_ports {P0[8]} ] +set_property PULLUP true [get_ports {P0[9]} ] +set_property PULLUP true [get_ports {P0[10]} ] +set_property PULLUP true [get_ports {P0[11]} ] +set_property PULLUP true [get_ports {P0[12]} ] +set_property PULLUP true [get_ports {P0[13]} ] +set_property PULLUP true [get_ports {P0[14]} ] +set_property PULLUP true [get_ports {P0[15]} ] + +set_property IOSTANDARD LVCMOS33 [get_ports {P1[0]} ] +set_property IOSTANDARD LVCMOS33 [get_ports {P1[1]} ] +set_property IOSTANDARD LVCMOS33 [get_ports {P1[2]} ] +set_property IOSTANDARD LVCMOS33 [get_ports {P1[3]} ] +set_property IOSTANDARD LVCMOS33 [get_ports {P1[4]} ] +set_property IOSTANDARD LVCMOS33 [get_ports {P1[5]} ] +set_property IOSTANDARD LVCMOS33 [get_ports {P1[6]} ] +set_property IOSTANDARD LVCMOS33 [get_ports {P1[7]} ] +set_property IOSTANDARD LVCMOS33 [get_ports {P1[8]} ] +set_property IOSTANDARD LVCMOS33 [get_ports {P1[9]} ] +set_property IOSTANDARD LVCMOS33 [get_ports {P1[10]} ] +set_property IOSTANDARD LVCMOS33 [get_ports {P1[11]} ] +set_property IOSTANDARD LVCMOS33 [get_ports {P1[12]} ] +set_property IOSTANDARD LVCMOS33 [get_ports {P1[13]} ] +set_property IOSTANDARD LVCMOS33 [get_ports {P1[14]} ] +set_property IOSTANDARD LVCMOS33 [get_ports {P1[15]} ] + +set_property PULLUP true [get_ports {P1[0]} ] +set_property PULLUP true [get_ports {P1[1]} ] +set_property PULLUP true [get_ports {P1[2]} ] +set_property PULLUP true [get_ports {P1[3]} ] +set_property PULLUP true [get_ports {P1[4]} ] +set_property PULLUP true [get_ports {P1[5]} ] +set_property PULLUP true [get_ports {P1[6]} ] +set_property PULLUP true [get_ports {P1[7]} ] +set_property PULLUP true [get_ports {P1[8]} ] +set_property PULLUP true [get_ports {P1[9]} ] +set_property PULLUP true [get_ports {P1[10]} ] +set_property PULLUP true [get_ports {P1[11]} ] +set_property PULLUP true [get_ports {P1[12]} ] +set_property PULLUP true [get_ports {P1[13]} ] +set_property PULLUP true [get_ports {P1[14]} ] +set_property PULLUP true [get_ports {P1[15]} ] + +set_property PULLDOWN true [get_ports {SWDIOTMS} ] +set_property PULLDOWN true [get_ports {SWCLKTCK} ] + +#PMODA pin0 to FTCLK +set_property PACKAGE_PIN T22 [get_ports {P1[1]}] + +#PMODA pin1 to FTSSN +set_property PACKAGE_PIN T23 [get_ports {P1[3]}] + +#PMODA pin2 to FTMISO +set_property PACKAGE_PIN P26 [get_ports {P1[0]}] + +#PMODA pin3 to FTMIOSIO +set_property PACKAGE_PIN R22 [get_ports {P1[2]}] + +#PMODB pin1 to SWDIOTMS +##set_property PACKAGE_PIN G6 [get_ports SWDIOTMS] + +#PMODB pin4 to SWCLKTCK +##set_property PACKAGE_PIN H7 [get_ports SWCLKTCK] +##set_property CLOCK_DEDICATED_ROUTE FALSE [get_nets uPAD_SWDCLK_I/IOBUF3V3/O] + +#PMODA pin4 : UART2RXD +#PMODA pin4 : UART2TXD + + +# LED0 to P0[0] +set_property PACKAGE_PIN M26 [get_ports {P0[0]}] +# LED1 to P0[1] +set_property PACKAGE_PIN T24 [get_ports {P0[1]}] +# LED2 to P0[2] +set_property PACKAGE_PIN T25 [get_ports {P0[2]}] +# LED3 to P0[3] +set_property PACKAGE_PIN R26 [get_ports {P0[3]}] + +# SW0 to NRST (Down for active low) +set_property PACKAGE_PIN R8 [get_ports NRST] + +# USR CLOCK P (need dvider) +##set_property IOSTANDARD LVCMOS18 [get_ports XTAL1 ] +#set_property PACKAGE_PIN M21 [get_ports XTAL1] +#set_property PACKAGE_PIN R17 [get_ports XTAL2] + +#Board ref clock - 200MHz (need dvider) +#set_property PACKAGE_PIN R3 [get_ports XTAL1] +#set_property PACKAGE_PIN P3 [get_ports XTAL2] +#Board user clock - 200MHz (need dvider) +set_property PACKAGE_PIN M21 [get_ports XTAL1] +set_property PACKAGE_PIN M22 [get_ports XTAL2] + + +## auto mapped - to remap +set_property PACKAGE_PIN R20 [get_ports {P0[10]}] +set_property PACKAGE_PIN P24 [get_ports {P0[11]}] +set_property PACKAGE_PIN P23 [get_ports {P0[12]}] +set_property PACKAGE_PIN N19 [get_ports {P0[13]}] +set_property PACKAGE_PIN P19 [get_ports {P0[14]}] +set_property PACKAGE_PIN N24 [get_ports {P0[15]}] +set_property PACKAGE_PIN R18 [get_ports {P0[4]}] +set_property PACKAGE_PIN R23 [get_ports {P0[5]}] +set_property PACKAGE_PIN N26 [get_ports {P0[6]}] +set_property PACKAGE_PIN P25 [get_ports {P0[7]}] +set_property PACKAGE_PIN R25 [get_ports {P0[8]}] +set_property PACKAGE_PIN R21 [get_ports {P0[9]}] +set_property PACKAGE_PIN M25 [get_ports {P1[10]}] +set_property PACKAGE_PIN M24 [get_ports {P1[11]}] +set_property PACKAGE_PIN L25 [get_ports {P1[12]}] +set_property PACKAGE_PIN L24 [get_ports {P1[13]}] +set_property PACKAGE_PIN L20 [get_ports {P1[14]}] +set_property PACKAGE_PIN M20 [get_ports {P1[15]}] +set_property PACKAGE_PIN N23 [get_ports {P1[4]}] +set_property PACKAGE_PIN P21 [get_ports {P1[5]}] +set_property PACKAGE_PIN P20 [get_ports {P1[6]}] +set_property PACKAGE_PIN N22 [get_ports {P1[7]}] +set_property PACKAGE_PIN N21 [get_ports {P1[8]}] +set_property PACKAGE_PIN L23 [get_ports {P1[9]}] +set_property PACKAGE_PIN L22 [get_ports SWCLKTCK] +set_property PACKAGE_PIN K26 [get_ports SWDIOTMS] +set_property PACKAGE_PIN K25 [get_ports VDD] +set_property PACKAGE_PIN N18 [get_ports VDDIO] +set_property PACKAGE_PIN P18 [get_ports VSS] +set_property PACKAGE_PIN R17 [get_ports VSSIO] diff --git a/Cortex-M0/nanosoc/systems/mcu/fpga_imp/target_fpga_ac701/fpga_synth.tcl b/Cortex-M0/nanosoc/systems/mcu/fpga_imp/target_fpga_ac701/fpga_synth.tcl new file mode 100644 index 0000000..a13e2b6 --- /dev/null +++ b/Cortex-M0/nanosoc/systems/mcu/fpga_imp/target_fpga_ac701/fpga_synth.tcl @@ -0,0 +1,40 @@ + +synth_design -top cmsdk_mcu_chip -part xc7a200tfbg676-2 + +write_verilog -force $outputDir/cmsdk_mcu_synth_netlist.v + +# # Create interface ports +# +# disconnect_net -net XTAL1 -objects {uPAD_XTAL_I/XTAL1} +# disconnect_net -net XTAL2 -objects {uPAD_XTAL_O/XTAL2} +# #disconnect_net -net xtal_clk_in] [get_pins XTAL1 uPAD_XTAL1_PAD/IOBUF3V3/I]] + +# set sys_diff_clock [ create_intf_port -mode Slave -vlnv xilinx.com:interface:diff_clock_rtl:1.0 sys_diff_clock ] +# set_property -dict [ list \ +# CONFIG.FREQ_HZ {200000000} \ +# ] $sys_diff_clock + +# set reset [ create_bd_port -dir I -type rst reset ] +# set_property -dict [ list \ +# CONFIG.POLARITY {ACTIVE_HIGH} \ +# ] $reset + +# # Create instance: clk_wiz_20M, and set properties +# set clk_wiz_20M [ create_cell -type ip -vlnv xilinx.com:ip:clk_wiz:6.0 clk_wiz_20M ] +# set_property -dict [ list \ +# CONFIG.CLKOUT1_JITTER {155.788} \ +# CONFIG.CLKOUT1_PHASE_ERROR {94.329} \ +# CONFIG.CLKOUT1_REQUESTED_OUT_FREQ {20.000} \ +# CONFIG.CLK_IN1_BOARD_INTERFACE {sys_diff_clock} \ +# CONFIG.MMCM_CLKFBOUT_MULT_F {4.250} \ +# CONFIG.MMCM_CLKOUT0_DIVIDE_F {42.500} \ +# CONFIG.RESET_BOARD_INTERFACE {reset} \ +# CONFIG.USE_BOARD_FLOW {false} \ +#] $clk_wiz_20M + +# # Create interface connections +# connect_net -intf_net sys_diff_clock_1 [get_ports sys_diff_clock] [get_pins clk_wiz_20M/CLK_IN1_D] + +# # Create port connections +# connect_net -net clk_wiz_0_clk_out1 [get_pins xtal_clk_in] [get_bd_pins clk_wiz_20M/clk_out1] +# connect_net -net reset_1 [get_bd_ports reset] [get_bd_pins clk_wiz_20M/reset] diff --git a/Cortex-M0/nanosoc/systems/mcu/fpga_imp/target_fpga_ac701/fpga_timing.xdc b/Cortex-M0/nanosoc/systems/mcu/fpga_imp/target_fpga_ac701/fpga_timing.xdc new file mode 100644 index 0000000..cb4cef4 --- /dev/null +++ b/Cortex-M0/nanosoc/systems/mcu/fpga_imp/target_fpga_ac701/fpga_timing.xdc @@ -0,0 +1,95 @@ +################################################################################## +## ## +## ZYNQ timing XDC ## +## ## +################################################################################## + +create_clock -name CLK -period 30 [get_ports XTAL1] +create_clock -name VCLK -period 30 -waveform {5 20} + +create_clock -name SWCLK -period 60 [get_ports SWCLKTCK] +create_clock -name VSWCLK -period 60 -waveform {5 35} + +set_clock_groups -name async_clk_swclock -asynchronous \ +-group [get_clocks -include_generated_clocks CLK] \ +-group [get_clocks -include_generated_clocks VSWCLK] + +#set_input_delay -clock [get_clocks clk_pl_0] -min -add_delay 20.000 [get_ports {dip_switch_4bits_tri_i[*]}] +#set_input_delay -clock [get_clocks clk_pl_0] -max -add_delay 25.000 [get_ports {dip_switch_4bits_tri_i[*]}] +#set_input_delay -clock [get_clocks clk_pl_0] -min -add_delay 20.000 [get_ports PMOD0_2] +#set_input_delay -clock [get_clocks clk_pl_0] -max -add_delay 25.000 [get_ports PMOD0_2] +#set_input_delay -clock [get_clocks clk_pl_0] -min -add_delay 20.000 [get_ports PMOD0_3] +#set_input_delay -clock [get_clocks clk_pl_0] -max -add_delay 25.000 [get_ports PMOD0_3] +#set_output_delay -clock [get_clocks clk_pl_0] -min -add_delay 5.000 [get_ports {led_4bits_tri_o[*]}] +#set_output_delay -clock [get_clocks CLK] -max -add_delay 25.000 [get_ports {led_4bits_tri_o[*]}] + +set_output_delay -clock [get_clocks CLK] -min -add_delay 5.000 [get_ports {P0[0]}] +set_output_delay -clock [get_clocks CLK] -max -add_delay 25.000 [get_ports {P0[0]}] +set_output_delay -clock [get_clocks CLK] -min -add_delay 5.000 [get_ports {P0[1]}] +set_output_delay -clock [get_clocks CLK] -max -add_delay 25.000 [get_ports {P0[1]}] +set_output_delay -clock [get_clocks CLK] -min -add_delay 5.000 [get_ports {P0[2]}] +set_output_delay -clock [get_clocks CLK] -max -add_delay 25.000 [get_ports {P0[2]}] +set_output_delay -clock [get_clocks CLK] -min -add_delay 5.000 [get_ports {P0[3]}] +set_output_delay -clock [get_clocks CLK] -max -add_delay 25.000 [get_ports {P0[3]}] +set_output_delay -clock [get_clocks CLK] -min -add_delay 5.000 [get_ports {P0[4]}] +set_output_delay -clock [get_clocks CLK] -max -add_delay 25.000 [get_ports {P0[4]}] +set_output_delay -clock [get_clocks CLK] -min -add_delay 5.000 [get_ports {P0[5]}] +set_output_delay -clock [get_clocks CLK] -max -add_delay 25.000 [get_ports {P0[5]}] +set_output_delay -clock [get_clocks CLK] -min -add_delay 5.000 [get_ports {P0[6]}] +set_output_delay -clock [get_clocks CLK] -max -add_delay 25.000 [get_ports {P0[6]}] +set_output_delay -clock [get_clocks CLK] -min -add_delay 5.000 [get_ports {P0[7]}] +set_output_delay -clock [get_clocks CLK] -max -add_delay 25.000 [get_ports {P0[7]}] +set_output_delay -clock [get_clocks CLK] -min -add_delay 5.000 [get_ports {P0[8]}] +set_output_delay -clock [get_clocks CLK] -max -add_delay 25.000 [get_ports {P0[8]}] +set_output_delay -clock [get_clocks CLK] -min -add_delay 5.000 [get_ports {P0[9]}] +set_output_delay -clock [get_clocks CLK] -max -add_delay 25.000 [get_ports {P0[9]}] +set_output_delay -clock [get_clocks CLK] -min -add_delay 5.000 [get_ports {P0[10]}] +set_output_delay -clock [get_clocks CLK] -max -add_delay 25.000 [get_ports {P0[10]}] +set_output_delay -clock [get_clocks CLK] -min -add_delay 5.000 [get_ports {P0[11]}] +set_output_delay -clock [get_clocks CLK] -max -add_delay 25.000 [get_ports {P0[11]}] +set_output_delay -clock [get_clocks CLK] -min -add_delay 5.000 [get_ports {P0[12]}] +set_output_delay -clock [get_clocks CLK] -max -add_delay 25.000 [get_ports {P0[12]}] +set_output_delay -clock [get_clocks CLK] -min -add_delay 5.000 [get_ports {P0[13]}] +set_output_delay -clock [get_clocks CLK] -max -add_delay 25.000 [get_ports {P0[13]}] +set_output_delay -clock [get_clocks CLK] -min -add_delay 5.000 [get_ports {P0[14]}] +set_output_delay -clock [get_clocks CLK] -max -add_delay 25.000 [get_ports {P0[14]}] +set_output_delay -clock [get_clocks CLK] -min -add_delay 5.000 [get_ports {P0[15]}] +set_output_delay -clock [get_clocks CLK] -max -add_delay 25.000 [get_ports {P0[15]}] + +set_output_delay -clock [get_clocks CLK] -min -add_delay 5.000 [get_ports {P1[0]}] +set_output_delay -clock [get_clocks CLK] -max -add_delay 25.000 [get_ports {P1[0]}] +set_output_delay -clock [get_clocks CLK] -min -add_delay 5.000 [get_ports {P1[1]}] +set_output_delay -clock [get_clocks CLK] -max -add_delay 25.000 [get_ports {P1[1]}] +set_output_delay -clock [get_clocks CLK] -min -add_delay 5.000 [get_ports {P1[2]}] +set_output_delay -clock [get_clocks CLK] -max -add_delay 25.000 [get_ports {P1[2]}] +set_output_delay -clock [get_clocks CLK] -min -add_delay 5.000 [get_ports {P1[3]}] +set_output_delay -clock [get_clocks CLK] -max -add_delay 25.000 [get_ports {P1[3]}] +set_output_delay -clock [get_clocks CLK] -min -add_delay 5.000 [get_ports {P1[4]}] +set_output_delay -clock [get_clocks CLK] -max -add_delay 25.000 [get_ports {P1[4]}] +set_output_delay -clock [get_clocks CLK] -min -add_delay 5.000 [get_ports {P1[5]}] +set_output_delay -clock [get_clocks CLK] -max -add_delay 25.000 [get_ports {P1[5]}] +set_output_delay -clock [get_clocks CLK] -min -add_delay 5.000 [get_ports {P1[6]}] +set_output_delay -clock [get_clocks CLK] -max -add_delay 25.000 [get_ports {P1[6]}] +set_output_delay -clock [get_clocks CLK] -min -add_delay 5.000 [get_ports {P1[7]}] +set_output_delay -clock [get_clocks CLK] -max -add_delay 25.000 [get_ports {P1[7]}] +set_output_delay -clock [get_clocks CLK] -min -add_delay 5.000 [get_ports {P1[8]}] +set_output_delay -clock [get_clocks CLK] -max -add_delay 25.000 [get_ports {P1[8]}] +set_output_delay -clock [get_clocks CLK] -min -add_delay 5.000 [get_ports {P1[9]}] +set_output_delay -clock [get_clocks CLK] -max -add_delay 25.000 [get_ports {P1[9]}] +set_output_delay -clock [get_clocks CLK] -min -add_delay 5.000 [get_ports {P1[10]}] +set_output_delay -clock [get_clocks CLK] -max -add_delay 25.000 [get_ports {P1[10]}] +set_output_delay -clock [get_clocks CLK] -min -add_delay 5.000 [get_ports {P1[11]}] +set_output_delay -clock [get_clocks CLK] -max -add_delay 25.000 [get_ports {P1[11]}] +set_output_delay -clock [get_clocks CLK] -min -add_delay 5.000 [get_ports {P1[12]}] +set_output_delay -clock [get_clocks CLK] -max -add_delay 25.000 [get_ports {P1[12]}] +set_output_delay -clock [get_clocks CLK] -min -add_delay 5.000 [get_ports {P1[13]}] +set_output_delay -clock [get_clocks CLK] -max -add_delay 25.000 [get_ports {P1[13]}] +set_output_delay -clock [get_clocks CLK] -min -add_delay 5.000 [get_ports {P1[14]}] +set_output_delay -clock [get_clocks CLK] -max -add_delay 25.000 [get_ports {P1[14]}] +set_output_delay -clock [get_clocks CLK] -min -add_delay 5.000 [get_ports {P1[15]}] +set_output_delay -clock [get_clocks CLK] -max -add_delay 25.000 [get_ports {P1[15]}] + +set_property C_CLK_INPUT_FREQ_HZ 5000000 [get_debug_cores dbg_hub] +set_property C_ENABLE_CLK_DIVIDER false [get_debug_cores dbg_hub] +set_property C_USER_SCAN_CHAIN 1 [get_debug_cores dbg_hub] +connect_debug_port dbg_hub/clk [get_nets clk] diff --git a/Cortex-M0/nanosoc/systems/mcu/fpga_imp/target_fpga_arm_mps3/fpga_pinmap.xdc b/Cortex-M0/nanosoc/systems/mcu/fpga_imp/target_fpga_arm_mps3/fpga_pinmap.xdc new file mode 100644 index 0000000..5fbe61e --- /dev/null +++ b/Cortex-M0/nanosoc/systems/mcu/fpga_imp/target_fpga_arm_mps3/fpga_pinmap.xdc @@ -0,0 +1,915 @@ +# ----------------------------------------------------------------------------- +# Purpose : Main timing constraints and pin list for MPS3 +# ----------------------------------------------------------------------------- + +#################################################################################### +# Pin Assigment +#################################################################################### + +set_property IOSTANDARD LVCMOS18 [get_ports {SMBF_* ETH_* USB_* CLCD_* USER_nLED* USER_SW* USER_nPB* HDMI_* CS_* SH_ADC* UART_*}] + +set_property IOSTANDARD LVCMOS18 [get_ports {OSCCLK[5]}] +set_property IOSTANDARD LVCMOS18 [get_ports {OSCCLK[4]}] +set_property IOSTANDARD LVCMOS18 [get_ports {OSCCLK[3]}] +set_property IOSTANDARD LVCMOS18 [get_ports {OSCCLK[2]}] +set_property IOSTANDARD LVCMOS18 [get_ports {OSCCLK[1]}] +set_property IOSTANDARD LVCMOS18 [get_ports {OSCCLK[0]}] +set_property IOSTANDARD LVCMOS18 [get_ports {MMB_DATA[23]}] +set_property IOSTANDARD LVCMOS18 [get_ports {MMB_DATA[22]}] +set_property IOSTANDARD LVCMOS18 [get_ports {MMB_DATA[21]}] +set_property IOSTANDARD LVCMOS18 [get_ports {MMB_DATA[20]}] +set_property IOSTANDARD LVCMOS18 [get_ports {MMB_DATA[19]}] +set_property IOSTANDARD LVCMOS18 [get_ports {MMB_DATA[18]}] +set_property IOSTANDARD LVCMOS18 [get_ports {MMB_DATA[17]}] +set_property IOSTANDARD LVCMOS18 [get_ports {MMB_DATA[16]}] +set_property IOSTANDARD LVCMOS18 [get_ports {MMB_DATA[15]}] +set_property IOSTANDARD LVCMOS18 [get_ports {MMB_DATA[14]}] +set_property IOSTANDARD LVCMOS18 [get_ports {MMB_DATA[13]}] +set_property IOSTANDARD LVCMOS18 [get_ports {MMB_DATA[12]}] +set_property IOSTANDARD LVCMOS18 [get_ports {MMB_DATA[11]}] +set_property IOSTANDARD LVCMOS18 [get_ports {MMB_DATA[10]}] +set_property IOSTANDARD LVCMOS18 [get_ports {MMB_DATA[9]}] +set_property IOSTANDARD LVCMOS18 [get_ports {MMB_DATA[8]}] +set_property IOSTANDARD LVCMOS18 [get_ports {MMB_DATA[7]}] +set_property IOSTANDARD LVCMOS18 [get_ports {MMB_DATA[6]}] +set_property IOSTANDARD LVCMOS18 [get_ports {MMB_DATA[5]}] +set_property IOSTANDARD LVCMOS18 [get_ports {MMB_DATA[4]}] +set_property IOSTANDARD LVCMOS18 [get_ports {MMB_DATA[3]}] +set_property IOSTANDARD LVCMOS18 [get_ports {MMB_DATA[2]}] +set_property IOSTANDARD LVCMOS18 [get_ports {MMB_DATA[1]}] +set_property IOSTANDARD LVCMOS18 [get_ports {MMB_DATA[0]}] +set_property IOSTANDARD LVCMOS18 [get_ports {MMB_SD[3]}] +set_property IOSTANDARD LVCMOS18 [get_ports {MMB_SD[2]}] +set_property IOSTANDARD LVCMOS18 [get_ports {MMB_SD[1]}] +set_property IOSTANDARD LVCMOS18 [get_ports {MMB_SD[0]}] +set_property IOSTANDARD LVCMOS18 [get_ports MMB_DE] +set_property IOSTANDARD LVCMOS18 [get_ports MMB_HS] +set_property IOSTANDARD LVCMOS18 [get_ports MMB_IDCLK] +set_property IOSTANDARD LVCMOS18 [get_ports MMB_SCK] +set_property IOSTANDARD LVCMOS18 [get_ports MMB_VS] +set_property IOSTANDARD LVCMOS18 [get_ports MMB_WS] +set_property IOSTANDARD LVCMOS18 [get_ports {EMMC_DAT[7]}] +set_property IOSTANDARD LVCMOS18 [get_ports {EMMC_DAT[6]}] +set_property IOSTANDARD LVCMOS18 [get_ports {EMMC_DAT[5]}] +set_property IOSTANDARD LVCMOS18 [get_ports {EMMC_DAT[4]}] +set_property IOSTANDARD LVCMOS18 [get_ports {EMMC_DAT[3]}] +set_property IOSTANDARD LVCMOS18 [get_ports {EMMC_DAT[2]}] +set_property IOSTANDARD LVCMOS18 [get_ports {EMMC_DAT[1]}] +set_property IOSTANDARD LVCMOS18 [get_ports {EMMC_DAT[0]}] +set_property IOSTANDARD LVCMOS18 [get_ports EMMC_CLK] +set_property IOSTANDARD LVCMOS18 [get_ports EMMC_CMD] +set_property IOSTANDARD LVCMOS18 [get_ports EMMC_DS] +set_property IOSTANDARD LVCMOS18 [get_ports EMMC_nRST] +# not used +# set_property IOSTANDARD DIFF_HSTL_I_18 [get_ports {CLK_BIDIR_P[3]}] +# set_property IOSTANDARD DIFF_HSTL_I_18 [get_ports {CLK_BIDIR_N[3]}] +# set_property IOSTANDARD DIFF_HSTL_I_18 [get_ports {CLK_BIDIR_P[2]}] +# set_property IOSTANDARD DIFF_HSTL_I_18 [get_ports {CLK_BIDIR_N[2]}] + +set_property IOSTANDARD LVCMOS18 [get_ports AUD_LRCK] +set_property PACKAGE_PIN Y30 [get_ports AUD_LRCK] +set_property IOSTANDARD LVCMOS18 [get_ports AUD_MCLK] +set_property PACKAGE_PIN AB29 [get_ports AUD_MCLK] +set_property IOSTANDARD LVCMOS18 [get_ports AUD_nRST] +set_property PACKAGE_PIN AA27 [get_ports AUD_nRST] +set_property IOSTANDARD LVCMOS18 [get_ports AUD_SCL] +set_property PACKAGE_PIN AA28 [get_ports AUD_SCL] +set_property IOSTANDARD LVCMOS18 [get_ports AUD_SCLK] +set_property PACKAGE_PIN AB30 [get_ports AUD_SCLK] +set_property IOSTANDARD LVCMOS18 [get_ports AUD_SDA] +set_property PACKAGE_PIN AA29 [get_ports AUD_SDA] +set_property IOSTANDARD LVCMOS18 [get_ports AUD_SDIN] +set_property PACKAGE_PIN AA30 [get_ports AUD_SDIN] +set_property IOSTANDARD LVCMOS18 [get_ports AUD_SDOUT] +set_property PACKAGE_PIN Y27 [get_ports AUD_SDOUT] +set_property IOSTANDARD LVCMOS33 [get_ports CB_nPOR] +set_property PACKAGE_PIN AU22 [get_ports CB_nPOR] +set_property IOSTANDARD LVCMOS33 [get_ports CB_nRST] +set_property PACKAGE_PIN AV23 [get_ports CB_nRST] +set_property IOSTANDARD LVCMOS33 [get_ports CB_RUN] +set_property PACKAGE_PIN AR25 [get_ports CB_RUN] +set_property IOSTANDARD LVCMOS33 [get_ports CFG_CLK] +set_property PACKAGE_PIN AT20 [get_ports CFG_CLK] +set_property IOSTANDARD LVCMOS33 [get_ports CFG_DATAIN] +set_property PACKAGE_PIN AT19 [get_ports CFG_DATAIN] +set_property IOSTANDARD LVCMOS33 [get_ports CFG_DATAOUT] +set_property PACKAGE_PIN AV18 [get_ports CFG_DATAOUT] +set_property IOSTANDARD LVCMOS33 [get_ports CFG_LOAD] +set_property PACKAGE_PIN AW18 [get_ports CFG_LOAD] +set_property IOSTANDARD LVCMOS33 [get_ports CFG_nRST] +set_property PACKAGE_PIN AR20 [get_ports CFG_nRST] +set_property IOSTANDARD LVCMOS33 [get_ports CFG_WnR] +set_property PACKAGE_PIN AT18 [get_ports CFG_WnR] +set_property PACKAGE_PIN AJ16 [get_ports CLCD_BL] +set_property PACKAGE_PIN AP15 [get_ports CLCD_CS] +set_property PACKAGE_PIN AN17 [get_ports {CLCD_PD[10]}] +set_property PACKAGE_PIN AP16 [get_ports {CLCD_PD[11]}] +set_property PACKAGE_PIN AP18 [get_ports {CLCD_PD[12]}] +set_property PACKAGE_PIN AR18 [get_ports {CLCD_PD[13]}] +set_property PACKAGE_PIN AM16 [get_ports {CLCD_PD[14]}] +set_property PACKAGE_PIN AN16 [get_ports {CLCD_PD[15]}] +set_property PACKAGE_PIN AR17 [get_ports {CLCD_PD[16]}] +set_property PACKAGE_PIN AR16 [get_ports {CLCD_PD[17]}] +set_property PACKAGE_PIN AM15 [get_ports CLCD_RD] +set_property PACKAGE_PIN AN14 [get_ports CLCD_RS] +set_property PACKAGE_PIN AK18 [get_ports CLCD_RST] +#set_property PACKAGE_PIN AN18 [get_ports CLCD_SDI] +#set_property PACKAGE_PIN AH16 [get_ports CLCD_SDO] +set_property PACKAGE_PIN AJ14 [get_ports CLCD_TINT] +set_property PACKAGE_PIN AL17 [get_ports CLCD_TNC] +set_property PACKAGE_PIN AL18 [get_ports CLCD_TSCL] +set_property PACKAGE_PIN AJ15 [get_ports CLCD_TSDA] +set_property PACKAGE_PIN AP14 [get_ports CLCD_WR_SCL] +# not used +# set_property PACKAGE_PIN N28 [get_ports {CLK_BIDIR_P[2]}] +# set_property PACKAGE_PIN N29 [get_ports {CLK_BIDIR_N[2]}] +# set_property PACKAGE_PIN E32 [get_ports {CLK_BIDIR_P[3]}] +# set_property PACKAGE_PIN D33 [get_ports {CLK_BIDIR_N[3]}] +# set_property PACKAGE_PIN G31 [get_ports {CLK_M2C_P[0]}] +# set_property PACKAGE_PIN F32 [get_ports {CLK_M2C_N[0]}] +# set_property PACKAGE_PIN E31 [get_ports {CLK_M2C_P[1]}] +# set_property PACKAGE_PIN D31 [get_ports {CLK_M2C_N[1]}] +set_property PACKAGE_PIN BB39 [get_ports CS_nDET] +set_property PACKAGE_PIN BB36 [get_ports CS_nSRST] +set_property PACKAGE_PIN BB37 [get_ports CS_nTRST] +set_property PACKAGE_PIN AW33 [get_ports CS_T_CLK] +set_property PACKAGE_PIN AY35 [get_ports CS_T_CTL] +set_property PACKAGE_PIN AW34 [get_ports {CS_T_D[0]}] +set_property PACKAGE_PIN AT34 [get_ports {CS_T_D[1]}] +set_property PACKAGE_PIN AU34 [get_ports {CS_T_D[2]}] +set_property PACKAGE_PIN AV36 [get_ports {CS_T_D[3]}] +set_property PACKAGE_PIN AW36 [get_ports {CS_T_D[4]}] +set_property PACKAGE_PIN AT35 [get_ports {CS_T_D[5]}] +set_property PACKAGE_PIN AU35 [get_ports {CS_T_D[6]}] +set_property PACKAGE_PIN AU36 [get_ports {CS_T_D[7]}] +set_property PACKAGE_PIN AV37 [get_ports {CS_T_D[8]}] +set_property PACKAGE_PIN AW35 [get_ports {CS_T_D[9]}] +set_property PACKAGE_PIN AY36 [get_ports {CS_T_D[10]}] +set_property PACKAGE_PIN AY37 [get_ports {CS_T_D[11]}] +set_property PACKAGE_PIN BB34 [get_ports {CS_T_D[12]}] +set_property PACKAGE_PIN BB35 [get_ports {CS_T_D[13]}] +set_property PACKAGE_PIN BA37 [get_ports {CS_T_D[14]}] +set_property PACKAGE_PIN BA38 [get_ports {CS_T_D[15]}] +set_property PACKAGE_PIN AV33 [get_ports CS_TCK] +set_property PACKAGE_PIN BA35 [get_ports CS_TDI] +set_property PACKAGE_PIN AW38 [get_ports CS_TDO] +set_property PACKAGE_PIN AY38 [get_ports CS_TMS] +# not used +#set_property IOSTANDARD POD12_DCI [get_ports {DDR_CHIPID[0]}] +#set_property PACKAGE_PIN J19 [get_ports {DDR_CHIPID[0]}] +#set_property IOSTANDARD POD12_DCI [get_ports {DDR_CHIPID[1]}] +#set_property PACKAGE_PIN G20 [get_ports {DDR_CHIPID[1]}] +#set_property IOSTANDARD POD12_DCI [get_ports DDR_nALERT] +#set_property PACKAGE_PIN P15 [get_ports DDR_nALERT] +#set_property IOSTANDARD POD12_DCI [get_ports DDR_nEVENT] +#set_property PACKAGE_PIN C17 [get_ports DDR_nEVENT] +# set_property IOSTANDARD POD12_DCI [get_ports DDR_PARITY] +# set_property PACKAGE_PIN D18 [get_ports DDR_PARITY] +# set_property IOSTANDARD POD12_DCI [get_ports DDR_SCL] +# set_property PACKAGE_PIN N21 [get_ports DDR_SCL] +# set_property IOSTANDARD POD12_DCI [get_ports DDR_SDA] +# set_property PACKAGE_PIN P21 [get_ports DDR_SDA] +# set_property PACKAGE_PIN AC42 [get_ports {DP_M2C_N[0]}] +# set_property PACKAGE_PIN AJ42 [get_ports {DP_M2C_N[1]}] +# set_property PACKAGE_PIN AE42 [get_ports {DP_M2C_N[2]}] +# set_property PACKAGE_PIN W42 [get_ports {DP_M2C_N[3]}] +# set_property PACKAGE_PIN R42 [get_ports {DP_M2C_N[4]}] +# set_property PACKAGE_PIN L42 [get_ports {DP_M2C_N[5]}] +# set_property PACKAGE_PIN N42 [get_ports {DP_M2C_N[6]}] +# set_property PACKAGE_PIN U42 [get_ports {DP_M2C_N[7]}] +# set_property PACKAGE_PIN AA42 [get_ports {DP_M2C_N[8]}] +# set_property PACKAGE_PIN AG42 [get_ports {DP_M2C_N[9]}] +# set_property PACKAGE_PIN AC41 [get_ports {DP_M2C_P[0]}] +# set_property PACKAGE_PIN AJ41 [get_ports {DP_M2C_P[1]}] +# set_property PACKAGE_PIN AE41 [get_ports {DP_M2C_P[2]}] +# set_property PACKAGE_PIN W41 [get_ports {DP_M2C_P[3]}] +# set_property PACKAGE_PIN R41 [get_ports {DP_M2C_P[4]}] +# set_property PACKAGE_PIN L41 [get_ports {DP_M2C_P[5]}] +# set_property PACKAGE_PIN N41 [get_ports {DP_M2C_P[6]}] +# set_property PACKAGE_PIN U41 [get_ports {DP_M2C_P[7]}] +# set_property PACKAGE_PIN AA41 [get_ports {DP_M2C_P[8]}] +# set_property PACKAGE_PIN AG41 [get_ports {DP_M2C_P[9]}] +set_property PACKAGE_PIN AG34 [get_ports HDMI_CSCL] +set_property PACKAGE_PIN AE33 [get_ports HDMI_CSDA] +set_property PACKAGE_PIN AF33 [get_ports HDMI_INT] +set_property PACKAGE_PIN W29 [get_ports EMMC_CLK] +set_property PACKAGE_PIN AC34 [get_ports EMMC_CMD] +set_property PACKAGE_PIN Y32 [get_ports {EMMC_DAT[0]}] +set_property PACKAGE_PIN Y33 [get_ports {EMMC_DAT[1]}] +set_property PACKAGE_PIN W33 [get_ports {EMMC_DAT[2]}] +set_property PACKAGE_PIN W34 [get_ports {EMMC_DAT[3]}] +set_property PACKAGE_PIN AA34 [get_ports {EMMC_DAT[4]}] +set_property PACKAGE_PIN AB34 [get_ports {EMMC_DAT[5]}] +set_property PACKAGE_PIN W31 [get_ports {EMMC_DAT[6]}] +set_property PACKAGE_PIN Y31 [get_ports {EMMC_DAT[7]}] +set_property PACKAGE_PIN AE32 [get_ports EMMC_DS] +set_property PACKAGE_PIN W30 [get_ports EMMC_nRST] +set_property PACKAGE_PIN AK23 [get_ports ETH_INT] +set_property PACKAGE_PIN AL24 [get_ports ETH_nCS] +set_property PACKAGE_PIN AJ23 [get_ports ETH_nOE] +# not used +# set_property PACKAGE_PIN AV38 [get_ports FMC_CLK_DIR] +# set_property PACKAGE_PIN AL42 [get_ports FMC_nPRSNT] +# set_property PACKAGE_PIN BB40 [get_ports {HA_N[2]}] +# set_property PACKAGE_PIN BA41 [get_ports {HA_N[3]}] +# set_property PACKAGE_PIN AY40 [get_ports {HA_N[4]}] +# set_property PACKAGE_PIN AU42 [get_ports {HA_N[5]}] +# set_property PACKAGE_PIN AY42 [get_ports {HA_N[6]}] +# set_property PACKAGE_PIN AW41 [get_ports {HA_N[7]}] +# set_property PACKAGE_PIN AU37 [get_ports {HA_N[8]}] +# set_property PACKAGE_PIN AT42 [get_ports {HA_N[9]}] +# set_property PACKAGE_PIN AT38 [get_ports {HA_N[10]}] +# set_property PACKAGE_PIN AV42 [get_ports {HA_N[11]}] +# set_property PACKAGE_PIN AR37 [get_ports {HA_N[12]}] +# set_property PACKAGE_PIN AN42 [get_ports {HA_N[13]}] +# set_property PACKAGE_PIN AP38 [get_ports {HA_N[14]}] +# set_property PACKAGE_PIN AN37 [get_ports {HA_N[15]}] +# set_property PACKAGE_PIN AM42 [get_ports {HA_N[16]}] +# set_property PACKAGE_PIN AR41 [get_ports {HA_N[18]}] +# set_property PACKAGE_PIN AM39 [get_ports {HA_N[19]}] +# set_property PACKAGE_PIN AR40 [get_ports {HA_N[20]}] +# set_property PACKAGE_PIN AM40 [get_ports {HA_N[21]}] +# set_property PACKAGE_PIN AK38 [get_ports {HA_N[22]}] +# set_property PACKAGE_PIN AL38 [get_ports {HA_N[23]}] +# set_property PACKAGE_PIN AT39 [get_ports {HA_P[0]}] +# set_property PACKAGE_PIN AT40 [get_ports {HA_N[0]}] +# set_property PACKAGE_PIN AU39 [get_ports {HA_P[1]}] +# set_property PACKAGE_PIN AU40 [get_ports {HA_N[1]}] +# set_property PACKAGE_PIN BA39 [get_ports {HA_P[2]}] +# set_property PACKAGE_PIN BA40 [get_ports {HA_P[3]}] +# set_property PACKAGE_PIN AW39 [get_ports {HA_P[4]}] +# set_property PACKAGE_PIN AU41 [get_ports {HA_P[5]}] +# set_property PACKAGE_PIN AY41 [get_ports {HA_P[6]}] +# set_property PACKAGE_PIN AW40 [get_ports {HA_P[7]}] +# set_property PACKAGE_PIN AT37 [get_ports {HA_P[8]}] +# set_property PACKAGE_PIN AR42 [get_ports {HA_P[9]}] +# set_property PACKAGE_PIN AR38 [get_ports {HA_P[10]}] +# set_property PACKAGE_PIN AV41 [get_ports {HA_P[11]}] +# set_property PACKAGE_PIN AR36 [get_ports {HA_P[12]}] +# set_property PACKAGE_PIN AN41 [get_ports {HA_P[13]}] +# set_property PACKAGE_PIN AN38 [get_ports {HA_P[14]}] +# set_property PACKAGE_PIN AM37 [get_ports {HA_P[15]}] +# set_property PACKAGE_PIN AM41 [get_ports {HA_P[16]}] +# set_property PACKAGE_PIN AN39 [get_ports {HA_P[17]}] +# set_property PACKAGE_PIN AP39 [get_ports {HA_N[17]}] +# set_property PACKAGE_PIN AP41 [get_ports {HA_P[18]}] +# set_property PACKAGE_PIN AL39 [get_ports {HA_P[19]}] +# set_property PACKAGE_PIN AP40 [get_ports {HA_P[20]}] +# set_property PACKAGE_PIN AL40 [get_ports {HA_P[21]}] +# set_property PACKAGE_PIN AK37 [get_ports {HA_P[22]}] +# set_property PACKAGE_PIN AL37 [get_ports {HA_P[23]}] +# set_property PACKAGE_PIN T32 [get_ports {HB_N[1]}] +# set_property PACKAGE_PIN V33 [get_ports {HB_N[2]}] +# set_property PACKAGE_PIN V29 [get_ports {HB_N[3]}] +# set_property PACKAGE_PIN T30 [get_ports {HB_N[4]}] +# set_property PACKAGE_PIN T34 [get_ports {HB_N[5]}] +# set_property PACKAGE_PIN R32 [get_ports {HB_N[7]}] +# set_property PACKAGE_PIN P29 [get_ports {HB_N[8]}] +# set_property PACKAGE_PIN P30 [get_ports {HB_N[9]}] +# set_property PACKAGE_PIN K28 [get_ports {HB_N[10]}] +# set_property PACKAGE_PIN L29 [get_ports {HB_N[11]}] +# set_property PACKAGE_PIN K31 [get_ports {HB_N[12]}] +# set_property PACKAGE_PIN L33 [get_ports {HB_N[13]}] +# set_property PACKAGE_PIN U31 [get_ports {HB_N[14]}] +# set_property PACKAGE_PIN N33 [get_ports {HB_N[15]}] +# set_property PACKAGE_PIN L34 [get_ports {HB_N[16]}] +# set_property PACKAGE_PIN R28 [get_ports {HB_N[18]}] +# set_property PACKAGE_PIN N27 [get_ports {HB_N[19]}] +# set_property PACKAGE_PIN U34 [get_ports {HB_N[20]}] +# set_property PACKAGE_PIN N34 [get_ports {HB_N[21]}] +# set_property PACKAGE_PIN N31 [get_ports {HB_P[0]}] +# set_property PACKAGE_PIN M31 [get_ports {HB_N[0]}] +# set_property PACKAGE_PIN U32 [get_ports {HB_P[1]}] +# set_property PACKAGE_PIN V32 [get_ports {HB_P[2]}] +# set_property PACKAGE_PIN V28 [get_ports {HB_P[3]}] +# set_property PACKAGE_PIN U30 [get_ports {HB_P[4]}] +# set_property PACKAGE_PIN T33 [get_ports {HB_P[5]}] +# set_property PACKAGE_PIN M30 [get_ports {HB_P[6]}] +# set_property PACKAGE_PIN L30 [get_ports {HB_N[6]}] +# set_property PACKAGE_PIN R31 [get_ports {HB_P[7]}] +# set_property PACKAGE_PIN P28 [get_ports {HB_P[8]}] +# set_property PACKAGE_PIN R30 [get_ports {HB_P[9]}] +# set_property PACKAGE_PIN L28 [get_ports {HB_P[10]}] +# set_property PACKAGE_PIN M29 [get_ports {HB_P[11]}] +# set_property PACKAGE_PIN K30 [get_ports {HB_P[12]}] +# set_property PACKAGE_PIN L32 [get_ports {HB_P[13]}] +# set_property PACKAGE_PIN V31 [get_ports {HB_P[14]}] +# set_property PACKAGE_PIN P33 [get_ports {HB_P[15]}] +# set_property PACKAGE_PIN M34 [get_ports {HB_P[16]}] +# set_property PACKAGE_PIN N32 [get_ports {HB_P[17]}] +# set_property PACKAGE_PIN M32 [get_ports {HB_N[17]}] +# set_property PACKAGE_PIN T28 [get_ports {HB_P[18]}] +# set_property PACKAGE_PIN N26 [get_ports {HB_P[19]}] +# set_property PACKAGE_PIN V34 [get_ports {HB_P[20]}] +# set_property PACKAGE_PIN P34 [get_ports {HB_P[21]}] +# set_property IOSTANDARD LVCMOS33 [get_ports {CLK_CFG}] +# set_property PACKAGE_PIN AT27 [get_ports {CLK_CFG}] +# set_property IOSTANDARD LVCMOS33 [get_ports {IOFPGA_CSIB}] +# set_property PACKAGE_PIN BA27 [get_ports {IOFPGA_CSIB}] +# set_property IOSTANDARD LVCMOS33 [get_ports {IOFPGA_D[4]}] +# set_property PACKAGE_PIN AV26 [get_ports {IOFPGA_D[4]}] +# set_property IOSTANDARD LVCMOS33 [get_ports {IOFPGA_D[5]}] +# set_property PACKAGE_PIN AV27 [get_ports {IOFPGA_D[5]}] +# set_property IOSTANDARD LVCMOS33 [get_ports {IOFPGA_D[6]}] +# set_property PACKAGE_PIN AU29 [get_ports {IOFPGA_D[6]}] +# set_property IOSTANDARD LVCMOS33 [get_ports {IOFPGA_D[7]}] +# set_property PACKAGE_PIN AV29 [get_ports {IOFPGA_D[7]}] +set_property IOSTANDARD LVCMOS18 [get_ports IOFPGA_NRST] +set_property PACKAGE_PIN AV31 [get_ports IOFPGA_NRST] +set_property IOSTANDARD LVCMOS18 [get_ports IOFPGA_NSPIR] +set_property PACKAGE_PIN AV32 [get_ports IOFPGA_NSPIR] +set_property IOSTANDARD LVCMOS33 [get_ports IOFPGA_SYSWDT] +set_property PACKAGE_PIN AU20 [get_ports IOFPGA_SYSWDT] +# not used +# set_property PACKAGE_PIN AN27 [get_ports {LA_N[2]}] +# set_property PACKAGE_PIN AP30 [get_ports {LA_N[3]}] +# set_property PACKAGE_PIN AN29 [get_ports {LA_N[4]}] +# set_property PACKAGE_PIN AR35 [get_ports {LA_N[5]}] +# set_property PACKAGE_PIN AR33 [get_ports {LA_N[6]}] +# set_property PACKAGE_PIN AN32 [get_ports {LA_N[7]}] +# set_property PACKAGE_PIN AP31 [get_ports {LA_N[8]}] +# set_property PACKAGE_PIN AN34 [get_ports {LA_N[9]}] +# set_property PACKAGE_PIN AL35 [get_ports {LA_N[10]}] +# set_property PACKAGE_PIN AM36 [get_ports {LA_N[11]}] +# set_property PACKAGE_PIN AP34 [get_ports {LA_N[12]}] +# set_property PACKAGE_PIN AL32 [get_ports {LA_N[13]}] +# set_property PACKAGE_PIN AK36 [get_ports {LA_N[14]}] +# set_property PACKAGE_PIN AJ34 [get_ports {LA_N[15]}] +# set_property PACKAGE_PIN AL33 [get_ports {LA_N[16]}] +# set_property PACKAGE_PIN AJ29 [get_ports {LA_N[19]}] +# set_property PACKAGE_PIN AJ33 [get_ports {LA_N[20]}] +# set_property PACKAGE_PIN AH29 [get_ports {LA_N[21]}] +# set_property PACKAGE_PIN AH31 [get_ports {LA_N[22]}] +# set_property PACKAGE_PIN AG30 [get_ports {LA_N[23]}] +# set_property PACKAGE_PIN G32 [get_ports {LA_N[24]}] +# set_property PACKAGE_PIN H34 [get_ports {LA_N[25]}] +# set_property PACKAGE_PIN H31 [get_ports {LA_N[26]}] +# set_property PACKAGE_PIN K33 [get_ports {LA_N[27]}] +# set_property PACKAGE_PIN H29 [get_ports {LA_N[28]}] +# set_property PACKAGE_PIN H33 [get_ports {LA_N[29]}] +# set_property PACKAGE_PIN F34 [get_ports {LA_N[30]}] +# set_property PACKAGE_PIN E33 [get_ports {LA_N[31]}] +# set_property PACKAGE_PIN C34 [get_ports {LA_N[32]}] +# set_property PACKAGE_PIN G30 [get_ports {LA_N[33]}] +# set_property PACKAGE_PIN AM29 [get_ports {LA_P[0]}] +# set_property PACKAGE_PIN AM30 [get_ports {LA_N[0]}] +# set_property PACKAGE_PIN AL29 [get_ports {LA_P[1]}] +# set_property PACKAGE_PIN AL30 [get_ports {LA_N[1]}] +# set_property PACKAGE_PIN AM27 [get_ports {LA_P[2]}] +# set_property PACKAGE_PIN AP29 [get_ports {LA_P[3]}] +# set_property PACKAGE_PIN AN28 [get_ports {LA_P[4]}] +# set_property PACKAGE_PIN AP35 [get_ports {LA_P[5]}] +# set_property PACKAGE_PIN AP33 [get_ports {LA_P[6]}] +# set_property PACKAGE_PIN AM32 [get_ports {LA_P[7]}] +# set_property PACKAGE_PIN AN31 [get_ports {LA_P[8]}] +# set_property PACKAGE_PIN AM34 [get_ports {LA_P[9]}] +# set_property PACKAGE_PIN AL34 [get_ports {LA_P[10]}] +# set_property PACKAGE_PIN AM35 [get_ports {LA_P[11]}] +# set_property PACKAGE_PIN AN33 [get_ports {LA_P[12]}] +# set_property PACKAGE_PIN AK32 [get_ports {LA_P[13]}] +# set_property PACKAGE_PIN AK35 [get_ports {LA_P[14]}] +# set_property PACKAGE_PIN AH34 [get_ports {LA_P[15]}] +# set_property PACKAGE_PIN AK33 [get_ports {LA_P[16]}] +# set_property PACKAGE_PIN AK30 [get_ports {LA_P[17]}] +# set_property PACKAGE_PIN AK31 [get_ports {LA_N[17]}] +# set_property PACKAGE_PIN AJ30 [get_ports {LA_P[18]}] +# set_property PACKAGE_PIN AJ31 [get_ports {LA_N[18]}] +# set_property PACKAGE_PIN AJ28 [get_ports {LA_P[19]}] +# set_property PACKAGE_PIN AH33 [get_ports {LA_P[20]}] +# set_property PACKAGE_PIN AH28 [get_ports {LA_P[21]}] +# set_property PACKAGE_PIN AG31 [get_ports {LA_P[22]}] +# set_property PACKAGE_PIN AG29 [get_ports {LA_P[23]}] +# set_property PACKAGE_PIN H32 [get_ports {LA_P[24]}] +# set_property PACKAGE_PIN J34 [get_ports {LA_P[25]}] +# set_property PACKAGE_PIN J30 [get_ports {LA_P[26]}] +# set_property PACKAGE_PIN K32 [get_ports {LA_P[27]}] +# set_property PACKAGE_PIN J29 [get_ports {LA_P[28]}] +# set_property PACKAGE_PIN J33 [get_ports {LA_P[29]}] +# set_property PACKAGE_PIN G34 [get_ports {LA_P[30]}] +# set_property PACKAGE_PIN F33 [get_ports {LA_P[31]}] +# set_property PACKAGE_PIN D34 [get_ports {LA_P[32]}] +# set_property PACKAGE_PIN G29 [get_ports {LA_P[33]}] +set_property PACKAGE_PIN AM17 [get_ports {MMB_DATA[0]}] +set_property PACKAGE_PIN AL14 [get_ports {MMB_DATA[1]}] +set_property PACKAGE_PIN AK15 [get_ports {MMB_DATA[2]}] +set_property PACKAGE_PIN AK17 [get_ports {MMB_DATA[3]}] +set_property PACKAGE_PIN AM14 [get_ports {MMB_DATA[4]}] +set_property PACKAGE_PIN AN13 [get_ports {MMB_DATA[5]}] +set_property PACKAGE_PIN AM11 [get_ports {MMB_DATA[6]}] +set_property PACKAGE_PIN AN11 [get_ports {MMB_DATA[7]}] +set_property PACKAGE_PIN AR13 [get_ports {MMB_DATA[8]}] +set_property PACKAGE_PIN AR12 [get_ports {MMB_DATA[9]}] +set_property PACKAGE_PIN AL10 [get_ports {MMB_DATA[10]}] +set_property PACKAGE_PIN AM10 [get_ports {MMB_DATA[11]}] +set_property PACKAGE_PIN AM12 [get_ports {MMB_DATA[12]}] +set_property PACKAGE_PIN AN12 [get_ports {MMB_DATA[13]}] +set_property PACKAGE_PIN AP13 [get_ports {MMB_DATA[14]}] +set_property PACKAGE_PIN AK13 [get_ports {MMB_DATA[15]}] +set_property PACKAGE_PIN AK12 [get_ports {MMB_DATA[16]}] +set_property PACKAGE_PIN AK11 [get_ports {MMB_DATA[17]}] +set_property PACKAGE_PIN AK10 [get_ports {MMB_DATA[18]}] +set_property PACKAGE_PIN AH13 [get_ports {MMB_DATA[19]}] +set_property PACKAGE_PIN AJ13 [get_ports {MMB_DATA[20]}] +set_property PACKAGE_PIN AJ11 [get_ports {MMB_DATA[21]}] +set_property PACKAGE_PIN AJ10 [get_ports {MMB_DATA[22]}] +set_property PACKAGE_PIN AH12 [get_ports {MMB_DATA[23]}] +set_property PACKAGE_PIN AH11 [get_ports MMB_DE] +set_property PACKAGE_PIN AG12 [get_ports MMB_HS] +set_property PACKAGE_PIN AH14 [get_ports MMB_IDCLK] +set_property PACKAGE_PIN AF29 [get_ports MMB_SCK] +set_property PACKAGE_PIN AC28 [get_ports {MMB_SD[0]}] +set_property PACKAGE_PIN AC29 [get_ports {MMB_SD[1]}] +set_property PACKAGE_PIN AE27 [get_ports {MMB_SD[2]}] +set_property PACKAGE_PIN AF34 [get_ports {MMB_SD[3]}] +set_property PACKAGE_PIN AG11 [get_ports MMB_VS] +set_property PACKAGE_PIN AF30 [get_ports MMB_WS] +set_property PACKAGE_PIN AL15 [get_ports {OSCCLK[0]}] +set_property PACKAGE_PIN AK16 [get_ports {OSCCLK[1]}] +set_property PACKAGE_PIN AY32 [get_ports {OSCCLK[2]}] +set_property PACKAGE_PIN AY30 [get_ports {OSCCLK[3]}] +set_property PACKAGE_PIN AC31 [get_ports {OSCCLK[4]}] +set_property PACKAGE_PIN AC32 [get_ports {OSCCLK[5]}] +set_property PACKAGE_PIN AT29 [get_ports PB_IRQ] + +set_property IOSTANDARD LVCMOS33 [get_ports QSPI_D0] +set_property PACKAGE_PIN AU24 [get_ports QSPI_D0] +set_property IOSTANDARD LVCMOS33 [get_ports QSPI_D1] +set_property PACKAGE_PIN AV24 [get_ports QSPI_D1] +set_property IOSTANDARD LVCMOS33 [get_ports QSPI_D2] +set_property PACKAGE_PIN AV21 [get_ports QSPI_D2] +set_property IOSTANDARD LVCMOS33 [get_ports QSPI_D3] +set_property PACKAGE_PIN AV22 [get_ports QSPI_D3] +set_property IOSTANDARD LVCMOS33 [get_ports QSPI_nCS] +set_property PACKAGE_PIN AT24 [get_ports QSPI_nCS] +set_property IOSTANDARD LVCMOS33 [get_ports QSPI_SCLK] +set_property PACKAGE_PIN AT25 [get_ports QSPI_SCLK] +# not used +# set_property PACKAGE_PIN AL13 [get_ports SATA_CLK_P] +# set_property PACKAGE_PIN AL12 [get_ports SATA_CLK_N] +set_property IOSTANDARD LVCMOS33 [get_ports {SH0_IO[0]}] +set_property PACKAGE_PIN AW14 [get_ports {SH0_IO[0]}] +set_property IOSTANDARD LVCMOS33 [get_ports {SH0_IO[1]}] +set_property PACKAGE_PIN AW13 [get_ports {SH0_IO[1]}] +set_property IOSTANDARD LVCMOS33 [get_ports {SH0_IO[2]}] +set_property PACKAGE_PIN AW15 [get_ports {SH0_IO[2]}] +set_property IOSTANDARD LVCMOS33 [get_ports {SH0_IO[3]}] +set_property PACKAGE_PIN AY15 [get_ports {SH0_IO[3]}] +set_property IOSTANDARD LVCMOS33 [get_ports {SH0_IO[4]}] +set_property PACKAGE_PIN AY13 [get_ports {SH0_IO[4]}] +set_property IOSTANDARD LVCMOS33 [get_ports {SH0_IO[5]}] +set_property PACKAGE_PIN AY12 [get_ports {SH0_IO[5]}] +set_property IOSTANDARD LVCMOS33 [get_ports {SH0_IO[6]}] +set_property PACKAGE_PIN BA15 [get_ports {SH0_IO[6]}] +set_property IOSTANDARD LVCMOS33 [get_ports {SH0_IO[7]}] +set_property PACKAGE_PIN BB14 [get_ports {SH0_IO[7]}] +set_property IOSTANDARD LVCMOS33 [get_ports {SH0_IO[8]}] +set_property PACKAGE_PIN BA12 [get_ports {SH0_IO[8]}] +set_property IOSTANDARD LVCMOS33 [get_ports {SH0_IO[9]}] +set_property PACKAGE_PIN BB12 [get_ports {SH0_IO[9]}] +set_property IOSTANDARD LVCMOS33 [get_ports {SH0_IO[10]}] +set_property PACKAGE_PIN BA14 [get_ports {SH0_IO[10]}] +set_property IOSTANDARD LVCMOS33 [get_ports {SH0_IO[11]}] +set_property PACKAGE_PIN BA13 [get_ports {SH0_IO[11]}] +set_property IOSTANDARD LVCMOS33 [get_ports {SH0_IO[12]}] +set_property PACKAGE_PIN BB15 [get_ports {SH0_IO[12]}] +set_property IOSTANDARD LVCMOS33 [get_ports {SH0_IO[13]}] +set_property PACKAGE_PIN AU12 [get_ports {SH0_IO[13]}] +set_property IOSTANDARD LVCMOS33 [get_ports {SH0_IO[14]}] +set_property PACKAGE_PIN AV12 [get_ports {SH0_IO[14]}] +set_property IOSTANDARD LVCMOS33 [get_ports {SH0_IO[15]}] +set_property PACKAGE_PIN AV17 [get_ports {SH0_IO[15]}] +set_property IOSTANDARD LVCMOS33 [get_ports {SH0_IO[16]}] +set_property PACKAGE_PIN AV16 [get_ports {SH0_IO[16]}] +set_property IOSTANDARD LVCMOS33 [get_ports {SH0_IO[17]}] +set_property PACKAGE_PIN AT14 [get_ports {SH0_IO[17]}] +set_property IOSTANDARD LVCMOS33 [get_ports {SH1_IO[0]}] +set_property PACKAGE_PIN AT17 [get_ports {SH1_IO[0]}] +set_property IOSTANDARD LVCMOS33 [get_ports {SH1_IO[1]}] +set_property PACKAGE_PIN AU17 [get_ports {SH1_IO[1]}] +set_property IOSTANDARD LVCMOS33 [get_ports {SH1_IO[2]}] +set_property PACKAGE_PIN AV19 [get_ports {SH1_IO[2]}] +set_property IOSTANDARD LVCMOS33 [get_ports {SH1_IO[3]}] +set_property PACKAGE_PIN AW19 [get_ports {SH1_IO[3]}] +set_property IOSTANDARD LVCMOS33 [get_ports {SH1_IO[4]}] +set_property PACKAGE_PIN AW20 [get_ports {SH1_IO[4]}] +set_property IOSTANDARD LVCMOS33 [get_ports {SH1_IO[5]}] +set_property PACKAGE_PIN BA19 [get_ports {SH1_IO[5]}] +set_property IOSTANDARD LVCMOS33 [get_ports {SH1_IO[6]}] +set_property PACKAGE_PIN BA18 [get_ports {SH1_IO[6]}] +set_property IOSTANDARD LVCMOS33 [get_ports {SH1_IO[7]}] +set_property PACKAGE_PIN AY20 [get_ports {SH1_IO[7]}] +set_property IOSTANDARD LVCMOS33 [get_ports {SH1_IO[8]}] +set_property PACKAGE_PIN BA20 [get_ports {SH1_IO[8]}] +set_property IOSTANDARD LVCMOS33 [get_ports {SH1_IO[9]}] +set_property PACKAGE_PIN BA17 [get_ports {SH1_IO[9]}] +set_property IOSTANDARD LVCMOS33 [get_ports {SH1_IO[10]}] +set_property PACKAGE_PIN BB17 [get_ports {SH1_IO[10]}] +set_property IOSTANDARD LVCMOS33 [get_ports {SH1_IO[11]}] +set_property PACKAGE_PIN BB20 [get_ports {SH1_IO[11]}] +set_property IOSTANDARD LVCMOS33 [get_ports {SH1_IO[12]}] +set_property PACKAGE_PIN BB19 [get_ports {SH1_IO[12]}] +set_property IOSTANDARD LVCMOS33 [get_ports {SH1_IO[13]}] +set_property PACKAGE_PIN AW16 [get_ports {SH1_IO[13]}] +set_property IOSTANDARD LVCMOS33 [get_ports {SH1_IO[14]}] +set_property PACKAGE_PIN AY16 [get_ports {SH1_IO[14]}] +set_property IOSTANDARD LVCMOS33 [get_ports {SH1_IO[15]}] +set_property PACKAGE_PIN AY18 [get_ports {SH1_IO[15]}] +set_property IOSTANDARD LVCMOS33 [get_ports {SH1_IO[16]}] +set_property PACKAGE_PIN AY17 [get_ports {SH1_IO[16]}] +set_property IOSTANDARD LVCMOS33 [get_ports {SH1_IO[17]}] +set_property PACKAGE_PIN BB16 [get_ports {SH1_IO[17]}] +set_property PACKAGE_PIN AL25 [get_ports SH_ADC_CK] +set_property PACKAGE_PIN AM25 [get_ports SH_ADC_CS] +set_property PACKAGE_PIN AP25 [get_ports SH_ADC_DI] +set_property PACKAGE_PIN AP26 [get_ports SH_ADC_DO] +set_property IOSTANDARD LVCMOS33 [get_ports SH_nRST] +set_property PACKAGE_PIN AU14 [get_ports SH_nRST] +set_property PACKAGE_PIN AK20 [get_ports {SMBF_ADDR[0]}] +set_property PACKAGE_PIN AK21 [get_ports {SMBF_ADDR[1]}] +set_property PACKAGE_PIN AJ18 [get_ports {SMBF_ADDR[2]}] +set_property PACKAGE_PIN AJ19 [get_ports {SMBF_ADDR[3]}] +set_property PACKAGE_PIN AH21 [get_ports {SMBF_ADDR[4]}] +set_property PACKAGE_PIN AJ21 [get_ports {SMBF_ADDR[5]}] +set_property PACKAGE_PIN AH19 [get_ports {SMBF_ADDR[6]}] +set_property PACKAGE_PIN AK22 [get_ports {SMBF_DATA[0]}] +set_property PACKAGE_PIN AL22 [get_ports {SMBF_DATA[1]}] +set_property PACKAGE_PIN AL19 [get_ports {SMBF_DATA[2]}] +set_property PACKAGE_PIN AL20 [get_ports {SMBF_DATA[3]}] +set_property PACKAGE_PIN AH18 [get_ports {SMBF_DATA[4]}] +set_property PACKAGE_PIN AM19 [get_ports {SMBF_DATA[5]}] +set_property PACKAGE_PIN AN19 [get_ports {SMBF_DATA[6]}] +set_property PACKAGE_PIN AP19 [get_ports {SMBF_DATA[7]}] +set_property PACKAGE_PIN AP20 [get_ports {SMBF_DATA[8]}] +set_property PACKAGE_PIN AM20 [get_ports {SMBF_DATA[9]}] +set_property PACKAGE_PIN AN21 [get_ports {SMBF_DATA[10]}] +set_property PACKAGE_PIN AP21 [get_ports {SMBF_DATA[11]}] +set_property PACKAGE_PIN AR22 [get_ports {SMBF_DATA[12]}] +set_property PACKAGE_PIN AM21 [get_ports {SMBF_DATA[13]}] +set_property PACKAGE_PIN AM22 [get_ports {SMBF_DATA[14]}] +set_property PACKAGE_PIN AN22 [get_ports {SMBF_DATA[15]}] +set_property PACKAGE_PIN AJ20 [get_ports SMBF_FIFOSEL] +set_property PACKAGE_PIN AN23 [get_ports SMBF_nOE] +set_property PACKAGE_PIN AL23 [get_ports SMBF_nRST] +set_property PACKAGE_PIN AP23 [get_ports SMBF_nWE] +set_property IOSTANDARD LVCMOS33 [get_ports {SMBM_A[16]}] +set_property PACKAGE_PIN AR26 [get_ports {SMBM_A[16]}] +set_property IOSTANDARD LVCMOS33 [get_ports {SMBM_A[17]}] +set_property PACKAGE_PIN AT22 [get_ports {SMBM_A[17]}] +set_property IOSTANDARD LVCMOS33 [get_ports {SMBM_A[18]}] +set_property PACKAGE_PIN AT23 [get_ports {SMBM_A[18]}] +set_property IOSTANDARD LVCMOS33 [get_ports {SMBM_A[19]}] +set_property PACKAGE_PIN AU21 [get_ports {SMBM_A[19]}] +set_property IOSTANDARD LVCMOS33 [get_ports {SMBM_A[20]}] +set_property PACKAGE_PIN AY22 [get_ports {SMBM_A[20]}] +set_property IOSTANDARD LVCMOS33 [get_ports {SMBM_A[21]}] +set_property PACKAGE_PIN BA22 [get_ports {SMBM_A[21]}] +set_property IOSTANDARD LVCMOS33 [get_ports {SMBM_A[22]}] +set_property PACKAGE_PIN AW21 [get_ports {SMBM_A[22]}] +set_property IOSTANDARD LVCMOS33 [get_ports {SMBM_A[23]}] +set_property PACKAGE_PIN AY21 [get_ports {SMBM_A[23]}] +set_property IOSTANDARD LVCMOS33 [get_ports {SMBM_A[24]}] +set_property PACKAGE_PIN BA23 [get_ports {SMBM_A[24]}] +set_property IOSTANDARD LVCMOS33 [get_ports {SMBM_A[25]}] +set_property PACKAGE_PIN BA24 [get_ports {SMBM_A[25]}] +set_property IOSTANDARD LVCMOS33 [get_ports SMBM_CLK] +set_property PACKAGE_PIN AY25 [get_ports SMBM_CLK] +set_property IOSTANDARD LVCMOS33 [get_ports {SMBM_D[0]}] +set_property PACKAGE_PIN BB21 [get_ports {SMBM_D[0]}] +set_property IOSTANDARD LVCMOS33 [get_ports {SMBM_D[1]}] +set_property PACKAGE_PIN BB22 [get_ports {SMBM_D[1]}] +set_property IOSTANDARD LVCMOS33 [get_ports {SMBM_D[2]}] +set_property PACKAGE_PIN AW24 [get_ports {SMBM_D[2]}] +set_property IOSTANDARD LVCMOS33 [get_ports {SMBM_D[3]}] +set_property PACKAGE_PIN AW25 [get_ports {SMBM_D[3]}] +set_property IOSTANDARD LVCMOS33 [get_ports {SMBM_D[4]}] +set_property PACKAGE_PIN AW23 [get_ports {SMBM_D[4]}] +set_property IOSTANDARD LVCMOS33 [get_ports {SMBM_D[5]}] +set_property PACKAGE_PIN AY23 [get_ports {SMBM_D[5]}] +set_property IOSTANDARD LVCMOS33 [get_ports {SMBM_D[6]}] +set_property PACKAGE_PIN BB24 [get_ports {SMBM_D[6]}] +set_property IOSTANDARD LVCMOS33 [get_ports {SMBM_D[7]}] +set_property PACKAGE_PIN AY27 [get_ports {SMBM_D[7]}] +set_property IOSTANDARD LVCMOS33 [get_ports {SMBM_D[8]}] +set_property PACKAGE_PIN AY26 [get_ports {SMBM_D[8]}] +set_property IOSTANDARD LVCMOS33 [get_ports {SMBM_D[9]}] +set_property PACKAGE_PIN AY28 [get_ports {SMBM_D[9]}] +set_property IOSTANDARD LVCMOS33 [get_ports {SMBM_D[10]}] +set_property PACKAGE_PIN BA28 [get_ports {SMBM_D[10]}] +set_property IOSTANDARD LVCMOS33 [get_ports {SMBM_D[11]}] +set_property PACKAGE_PIN BA25 [get_ports {SMBM_D[11]}] +set_property IOSTANDARD LVCMOS33 [get_ports {SMBM_D[12]}] +set_property PACKAGE_PIN BB25 [get_ports {SMBM_D[12]}] +set_property IOSTANDARD LVCMOS33 [get_ports {SMBM_D[13]}] +set_property PACKAGE_PIN AW28 [get_ports {SMBM_D[13]}] +set_property IOSTANDARD LVCMOS33 [get_ports {SMBM_D[14]}] +set_property PACKAGE_PIN AW29 [get_ports {SMBM_D[14]}] +set_property IOSTANDARD LVCMOS33 [get_ports {SMBM_D[15]}] +set_property PACKAGE_PIN BB26 [get_ports {SMBM_D[15]}] +set_property IOSTANDARD LVCMOS33 [get_ports {SMBM_nBL[0]}] +set_property PACKAGE_PIN AU26 [get_ports {SMBM_nBL[0]}] +set_property IOSTANDARD LVCMOS33 [get_ports {SMBM_nBL[1]}] +set_property PACKAGE_PIN AR28 [get_ports {SMBM_nBL[1]}] +set_property IOSTANDARD LVCMOS33 [get_ports {SMBM_nE[1]}] +set_property PACKAGE_PIN BB27 [get_ports {SMBM_nE[1]}] +set_property IOSTANDARD LVCMOS33 [get_ports {SMBM_nE[2]}] +set_property PACKAGE_PIN AU27 [get_ports {SMBM_nE[2]}] +set_property IOSTANDARD LVCMOS33 [get_ports {SMBM_nE[3]}] +set_property PACKAGE_PIN AV28 [get_ports {SMBM_nE[3]}] +set_property IOSTANDARD LVCMOS33 [get_ports {SMBM_nE[4]}] +set_property PACKAGE_PIN AU25 [get_ports {SMBM_nE[4]}] +set_property IOSTANDARD LVCMOS33 [get_ports SMBM_nOE] +set_property PACKAGE_PIN AT28 [get_ports SMBM_nOE] +set_property IOSTANDARD LVCMOS33 [get_ports SMBM_nWAIT] +set_property PACKAGE_PIN AP28 [get_ports SMBM_nWAIT] +set_property IOSTANDARD LVCMOS33 [get_ports SMBM_nWE] +set_property PACKAGE_PIN AR27 [get_ports SMBM_nWE] +set_property PACKAGE_PIN AF28 [get_ports {UART_RX_F[0]}] +set_property PACKAGE_PIN AE31 [get_ports {UART_RX_F[1]}] +set_property PACKAGE_PIN AE28 [get_ports {UART_RX_F[2]}] +set_property PACKAGE_PIN AD30 [get_ports {UART_RX_F[3]}] +set_property PACKAGE_PIN AF27 [get_ports {UART_TX_F[0]}] +set_property PACKAGE_PIN AE30 [get_ports {UART_TX_F[1]}] +set_property PACKAGE_PIN AD28 [get_ports {UART_TX_F[2]}] +set_property PACKAGE_PIN AD29 [get_ports {UART_TX_F[3]}] +set_property PACKAGE_PIN AN26 [get_ports USB_DACK] +set_property PACKAGE_PIN AN24 [get_ports USB_DREQ] +set_property PACKAGE_PIN AP24 [get_ports USB_INT] +set_property PACKAGE_PIN AM26 [get_ports USB_nCS] +set_property IOSTANDARD LVCMOS33 [get_ports USD_CLK] +set_property PACKAGE_PIN AU15 [get_ports USD_CLK] +set_property IOSTANDARD LVCMOS33 [get_ports USD_CMD] +set_property PACKAGE_PIN AU16 [get_ports USD_CMD] +set_property IOSTANDARD LVCMOS33 [get_ports {USD_DAT[0]}] +set_property PACKAGE_PIN AV14 [get_ports {USD_DAT[0]}] +set_property IOSTANDARD LVCMOS33 [get_ports {USD_DAT[1]}] +set_property PACKAGE_PIN AV13 [get_ports {USD_DAT[1]}] +set_property IOSTANDARD LVCMOS33 [get_ports {USD_DAT[2]}] +set_property PACKAGE_PIN AT13 [get_ports {USD_DAT[2]}] +set_property IOSTANDARD LVCMOS33 [get_ports {USD_DAT[3]}] +set_property PACKAGE_PIN AT12 [get_ports {USD_DAT[3]}] +set_property IOSTANDARD LVCMOS33 [get_ports USD_NCD] +set_property PACKAGE_PIN AT15 [get_ports USD_NCD] +set_property PACKAGE_PIN AU32 [get_ports {USER_nLED[0]}] +set_property PACKAGE_PIN AU30 [get_ports {USER_nLED[1]}] +set_property PACKAGE_PIN AU31 [get_ports {USER_nLED[2]}] +set_property PACKAGE_PIN AR32 [get_ports {USER_nLED[3]}] +set_property PACKAGE_PIN AT33 [get_ports {USER_nLED[4]}] +set_property PACKAGE_PIN AW30 [get_ports {USER_nLED[5]}] +set_property PACKAGE_PIN AW31 [get_ports {USER_nLED[6]}] +set_property PACKAGE_PIN AR30 [get_ports {USER_nLED[7]}] +set_property PACKAGE_PIN BB31 [get_ports {USER_nLED[8]}] +set_property PACKAGE_PIN BB32 [get_ports {USER_nLED[9]}] +set_property PACKAGE_PIN AT30 [get_ports {USER_nPB[0]}] +set_property PACKAGE_PIN AT32 [get_ports {USER_nPB[1]}] +set_property PACKAGE_PIN BA29 [get_ports {USER_SW[0]}] +set_property PACKAGE_PIN BB29 [get_ports {USER_SW[1]}] +set_property PACKAGE_PIN BA32 [get_ports {USER_SW[2]}] +set_property PACKAGE_PIN BA33 [get_ports {USER_SW[3]}] +set_property PACKAGE_PIN BA30 [get_ports {USER_SW[4]}] +set_property PACKAGE_PIN BB30 [get_ports {USER_SW[5]}] +set_property PACKAGE_PIN AY33 [get_ports {USER_SW[6]}] +set_property PACKAGE_PIN AY31 [get_ports {USER_SW[7]}] +set_property IOSTANDARD LVCMOS33 [get_ports WDOG_RREQ] +set_property PACKAGE_PIN AU19 [get_ports WDOG_RREQ] + +# native DDR pin names + +# set_property PACKAGE_PIN A17 [get_ports {c0_ddr4_dq[37]}] +# set_property PACKAGE_PIN F24 [get_ports {c0_ddr4_dq[54]}] +# set_property PACKAGE_PIN F23 [get_ports {c0_ddr4_dq[55]}] +# set_property PACKAGE_PIN B15 [get_ports {c0_ddr4_dq[28]}] +# set_property PACKAGE_PIN D23 [get_ports {c0_ddr4_dq[52]}] +# set_property PACKAGE_PIN D24 [get_ports {c0_ddr4_dq[53]}] +# set_property PACKAGE_PIN C24 [get_ports {c0_ddr4_dm_dbi_n[5]}] +# set_property PACKAGE_PIN A22 [get_ports {c0_ddr4_dq[46]}] +# set_property PACKAGE_PIN A23 [get_ports {c0_ddr4_dq[47]}] +# set_property PACKAGE_PIN C13 [get_ports {c0_ddr4_dq[29]}] +# set_property PACKAGE_PIN A14 [get_ports {c0_ddr4_dq[27]}] +# set_property PACKAGE_PIN E22 [get_ports {c0_ddr4_dqs_t[6]}] +# set_property PACKAGE_PIN E21 [get_ports {c0_ddr4_dqs_c[6]}] +# set_property PACKAGE_PIN G22 [get_ports {c0_ddr4_dq[50]}] +# set_property PACKAGE_PIN G21 [get_ports {c0_ddr4_dq[51]}] +# set_property PACKAGE_PIN H24 [get_ports {c0_ddr4_dm_dbi_n[6]}] +# set_property PACKAGE_PIN A24 [get_ports {c0_ddr4_dq[42]}] +# set_property PACKAGE_PIN B22 [get_ports {c0_ddr4_dqs_t[5]}] +# set_property PACKAGE_PIN B21 [get_ports {c0_ddr4_dqs_c[5]}] +# set_property PACKAGE_PIN B17 [get_ports {c0_ddr4_dqs_t[4]}] +# set_property PACKAGE_PIN B16 [get_ports {c0_ddr4_dqs_c[4]}] +# set_property PACKAGE_PIN A18 [get_ports {c0_ddr4_dq[38]}] +# set_property PACKAGE_PIN A12 [get_ports {c0_ddr4_dq[31]}] +# set_property PACKAGE_PIN D25 [get_ports {c0_ddr4_dq[48]}] +# set_property PACKAGE_PIN E23 [get_ports {c0_ddr4_dq[49]}] +# set_property PACKAGE_PIN C23 [get_ports {c0_ddr4_dq[40]}] +# set_property PACKAGE_PIN A25 [get_ports {c0_ddr4_dq[43]}] +# set_property PACKAGE_PIN C22 [get_ports {c0_ddr4_dq[44]}] +# set_property PACKAGE_PIN B14 [get_ports {c0_ddr4_dq[24]}] +# set_property PACKAGE_PIN K18 [get_ports {c0_ddr4_adr[4]}] +# set_property PACKAGE_PIN C21 [get_ports {c0_ddr4_dq[41]}] +# set_property PACKAGE_PIN D21 [get_ports {c0_ddr4_dq[45]}] +# set_property PACKAGE_PIN C16 [get_ports {c0_ddr4_dq[32]}] +# set_property PACKAGE_PIN E12 [get_ports {c0_ddr4_dq[16]}] +# set_property PACKAGE_PIN D13 [get_ports {c0_ddr4_dq[25]}] +# set_property PACKAGE_PIN C12 [get_ports {c0_ddr4_dqs_t[3]}] +# set_property PACKAGE_PIN B12 [get_ports {c0_ddr4_dqs_c[3]}] +# set_property PACKAGE_PIN E15 [get_ports {c0_ddr4_dq[18]}] +# #set_property PACKAGE_PIN P18 [get_ports {c0_ddr4_ck_t[1]}] +# #set_property PACKAGE_PIN N18 [get_ports {c0_ddr4_ck_c[1]}] +# set_property PACKAGE_PIN L19 [get_ports {c0_ddr4_adr[0]}] +# set_property PACKAGE_PIN J18 [get_ports {c0_ddr4_adr[5]}] +# #set_property PACKAGE_PIN E20 [get_ports {c0_ddr4_cke[0]}] +# set_property PACKAGE_PIN E20 [get_ports {c0_ddr4_cke}] +# set_property PACKAGE_PIN D19 [get_ports c0_ddr4_act_n] +# set_property PACKAGE_PIN F12 [get_ports {c0_ddr4_dq[17]}] +# set_property PACKAGE_PIN F15 [get_ports {c0_ddr4_dq[19]}] +# set_property PACKAGE_PIN L18 [get_ports {c0_ddr4_adr[2]}] +# set_property PACKAGE_PIN K16 [get_ports {c0_ddr4_adr[3]}] +# set_property PACKAGE_PIN J16 [get_ports {c0_ddr4_adr[1]}] +# #set_property PACKAGE_PIN E17 [get_ports {c0_ddr4_cke[1]}] +# set_property PACKAGE_PIN E18 [get_ports c0_ddr4_reset_n] +# set_property PACKAGE_PIN F14 [get_ports {c0_ddr4_dqs_t[2]}] +# set_property PACKAGE_PIN F13 [get_ports {c0_ddr4_dqs_c[2]}] +# #set_property PACKAGE_PIN P16 [get_ports {c0_ddr4_ck_t[0]}] +# set_property PACKAGE_PIN P16 [get_ports {c0_ddr4_ck_t}] +# #set_property PACKAGE_PIN N16 [get_ports {c0_ddr4_ck_c[0]}] +# set_property PACKAGE_PIN N16 [get_ports {c0_ddr4_ck_c}] +# set_property PACKAGE_PIN F19 [get_ports {c0_ddr4_bg[0]}] +# #set_property PACKAGE_PIN F18 [get_ports {c0_ddr4_bg[1]}] +# #set_property PACKAGE_PIN E16 [get_ports {c0_ddr4_odt[0]}] +# set_property PACKAGE_PIN E16 [get_ports {c0_ddr4_odt}] +# #set_property PACKAGE_PIN F17 [get_ports {c0_ddr4_cs_n[0]}] +# set_property PACKAGE_PIN F17 [get_ports {c0_ddr4_cs_n}] +# #set_property PACKAGE_PIN F20 [get_ports {c0_ddr4_cs_n[1]}] +# #set_property PACKAGE_PIN D20 [get_ports {c0_ddr4_odt[1]}] +# set_property PACKAGE_PIN K13 [get_ports {c0_ddr4_dq[10]}] +# set_property PACKAGE_PIN J14 [get_ports {c0_ddr4_dq[11]}] +# set_property PACKAGE_PIN H17 [get_ports {c0_ddr4_adr[16]}] +# set_property PACKAGE_PIN G17 [get_ports {c0_ddr4_ba[0]}] +# set_property PACKAGE_PIN H16 [get_ports {c0_ddr4_adr[14]}] +# set_property PACKAGE_PIN G19 [get_ports {c0_ddr4_ba[1]}] +# set_property PACKAGE_PIN N11 [get_ports {c0_ddr4_dqs_t[0]}] +# set_property PACKAGE_PIN M11 [get_ports {c0_ddr4_dqs_c[0]}] +# set_property PACKAGE_PIN J15 [get_ports {c0_ddr4_dq[8]}] +# set_property PACKAGE_PIN K15 [get_ports {c0_ddr4_dq[9]}] +# set_property PACKAGE_PIN G16 [get_ports {c0_ddr4_adr[15]}] +# set_property PACKAGE_PIN M10 [get_ports {c0_ddr4_dq[6]}] +# set_property PACKAGE_PIN L10 [get_ports {c0_ddr4_dq[7]}] +# set_property PACKAGE_PIN J11 [get_ports {c0_ddr4_dqs_t[1]}] +# set_property PACKAGE_PIN J10 [get_ports {c0_ddr4_dqs_c[1]}] +# set_property PACKAGE_PIN L17 [get_ports {c0_ddr4_adr[6]}] +# set_property PACKAGE_PIN K17 [get_ports {c0_ddr4_adr[8]}] +# set_property PACKAGE_PIN M17 [get_ports {c0_ddr4_adr[9]}] +# set_property PACKAGE_PIN M16 [get_ports {c0_ddr4_adr[7]}] +# set_property PACKAGE_PIN M19 [get_ports {c0_ddr4_adr[10]}] +# set_property PACKAGE_PIN M15 [get_ports {c0_ddr4_adr[11]}] +# set_property PACKAGE_PIN N17 [get_ports {c0_ddr4_adr[12]}] +# set_property PACKAGE_PIN N19 [get_ports {c0_ddr4_adr[13]}] +# set_property PACKAGE_PIN L22 [get_ports {c0_ddr4_dm_dbi_n[7]}] +# set_property PACKAGE_PIN P11 [get_ports {c0_ddr4_dq[0]}] +# set_property PACKAGE_PIN P10 [get_ports {c0_ddr4_dq[1]}] +# set_property PACKAGE_PIN L12 [get_ports {c0_ddr4_dq[2]}] +# set_property PACKAGE_PIN M12 [get_ports {c0_ddr4_dq[3]}] +# set_property PACKAGE_PIN N13 [get_ports {c0_ddr4_dq[4]}] +# set_property PACKAGE_PIN N12 [get_ports {c0_ddr4_dq[5]}] +# set_property PACKAGE_PIN K11 [get_ports {c0_ddr4_dq[12]}] +# set_property PACKAGE_PIN K10 [get_ports {c0_ddr4_dq[13]}] +# set_property PACKAGE_PIN J13 [get_ports {c0_ddr4_dq[14]}] +# set_property PACKAGE_PIN K12 [get_ports {c0_ddr4_dq[15]}] +# set_property PACKAGE_PIN H12 [get_ports {c0_ddr4_dq[20]}] +# set_property PACKAGE_PIN G12 [get_ports {c0_ddr4_dq[21]}] +# set_property PACKAGE_PIN G15 [get_ports {c0_ddr4_dq[22]}] +# set_property PACKAGE_PIN G14 [get_ports {c0_ddr4_dq[23]}] +# set_property PACKAGE_PIN A13 [get_ports {c0_ddr4_dq[26]}] +# set_property PACKAGE_PIN A15 [get_ports {c0_ddr4_dq[30]}] +# set_property PACKAGE_PIN C19 [get_ports {c0_ddr4_dq[33]}] +# set_property PACKAGE_PIN B19 [get_ports {c0_ddr4_dq[34]}] +# set_property PACKAGE_PIN A20 [get_ports {c0_ddr4_dq[35]}] +# set_property PACKAGE_PIN D16 [get_ports {c0_ddr4_dq[36]}] +# set_property PACKAGE_PIN A19 [get_ports {c0_ddr4_dq[39]}] +# set_property PACKAGE_PIN H22 [get_ports {c0_ddr4_dq[56]}] +# set_property PACKAGE_PIN J23 [get_ports {c0_ddr4_dq[57]}] +# set_property PACKAGE_PIN K20 [get_ports {c0_ddr4_dq[58]}] +# set_property PACKAGE_PIN L20 [get_ports {c0_ddr4_dq[59]}] +# set_property PACKAGE_PIN H21 [get_ports {c0_ddr4_dq[60]}] +# set_property PACKAGE_PIN H23 [get_ports {c0_ddr4_dq[61]}] +# set_property PACKAGE_PIN K23 [get_ports {c0_ddr4_dq[62]}] +# set_property PACKAGE_PIN J21 [get_ports {c0_ddr4_dq[63]}] +# set_property PACKAGE_PIN N14 [get_ports {c0_ddr4_dm_dbi_n[0]}] +# set_property PACKAGE_PIN L14 [get_ports {c0_ddr4_dm_dbi_n[1]}] +# set_property PACKAGE_PIN H14 [get_ports {c0_ddr4_dm_dbi_n[2]}] +# set_property PACKAGE_PIN D14 [get_ports {c0_ddr4_dm_dbi_n[3]}] +# set_property PACKAGE_PIN C18 [get_ports {c0_ddr4_dm_dbi_n[4]}] +# set_property PACKAGE_PIN K21 [get_ports {c0_ddr4_dqs_t[7]}] + +#set_property CFGBVS GND [current_design] +#set_property CONFIG_VOLTAGE 1.8 [current_design] + +# set_property PACKAGE_PIN H19 [get_ports c0_sys_clk_p] +# set_property PACKAGE_PIN H18 [get_ports c0_sys_clk_n] + +# set_property IOSTANDARD DIFF_HSTL_I_18 [get_ports SATA_CLK_N] +# set_property IOSTANDARD DIFF_HSTL_I_18 [get_ports SATA_CLK_P] +# set_property IOSTANDARD DIFF_HSTL_I_18 [get_ports GTX_CLK_N] +# set_property IOSTANDARD DIFF_HSTL_I_18 [get_ports GTX_CLK_P] +# set_property IOSTANDARD DIFF_HSTL_I_18 [get_ports {CLK_M2C_P[1]}] +# set_property IOSTANDARD DIFF_HSTL_I_18 [get_ports {CLK_M2C_P[0]}] + +# set_property PACKAGE_PIN AB31 [get_ports GTX_CLK_P] +# set_property PACKAGE_PIN AB32 [get_ports GTX_CLK_N] + +# set_property PACKAGE_PIN AH39 [get_ports {DP_C2M_N[0]}] +# set_property PACKAGE_PIN AF39 [get_ports {DP_C2M_N[1]}] +# set_property PACKAGE_PIN AD39 [get_ports {DP_C2M_N[2]}] +# set_property PACKAGE_PIN AB39 [get_ports {DP_C2M_N[3]}] +# set_property PACKAGE_PIN Y39 [get_ports {DP_C2M_N[4]}] +# set_property PACKAGE_PIN V39 [get_ports {DP_C2M_N[5]}] +# set_property PACKAGE_PIN K39 [get_ports {DP_C2M_N[6]}] +# set_property PACKAGE_PIN M39 [get_ports {DP_C2M_N[7]}] +# set_property PACKAGE_PIN P39 [get_ports {DP_C2M_N[8]}] +# set_property PACKAGE_PIN T39 [get_ports {DP_C2M_N[9]}] +# set_property PACKAGE_PIN AH38 [get_ports {DP_C2M_P[0]}] +# set_property PACKAGE_PIN AF38 [get_ports {DP_C2M_P[1]}] +# set_property PACKAGE_PIN AD38 [get_ports {DP_C2M_P[2]}] +# set_property PACKAGE_PIN AB38 [get_ports {DP_C2M_P[3]}] +# set_property PACKAGE_PIN Y38 [get_ports {DP_C2M_P[4]}] +# set_property PACKAGE_PIN V38 [get_ports {DP_C2M_P[5]}] +# set_property PACKAGE_PIN K38 [get_ports {DP_C2M_P[6]}] +# set_property PACKAGE_PIN M38 [get_ports {DP_C2M_P[7]}] +# set_property PACKAGE_PIN P38 [get_ports {DP_C2M_P[8]}] +# set_property PACKAGE_PIN T38 [get_ports {DP_C2M_P[9]}] +# set_property PACKAGE_PIN AE36 [get_ports {GBTCLK_M2C_P[0]}] +# set_property PACKAGE_PIN AE37 [get_ports {GBTCLK_M2C_N[0]}] +# set_property PACKAGE_PIN AA36 [get_ports {GBTCLK_M2C_P[1]}] +# set_property PACKAGE_PIN AA37 [get_ports {GBTCLK_M2C_N[1]}] + +# create_clock -period 15.515 -name clk_mgtrefclk0_x0y4_p [get_ports {GBTCLK_M2C_P[0]}] +# create_clock -period 15.515 -name clk_mgtrefclk0_x0y7_p [get_ports {GBTCLK_M2C_P[1]}] + +# # False path constraints +# # ---------------------------------------------------------------------------------------------------------------------- +# set_false_path -to [get_cells -hierarchical -filter {NAME =~ *bit_synchronizer*inst/i_in_meta_reg}] +# set_false_path -to [get_cells -hierarchical -filter {NAME =~ *reset_synchronizer*inst/rst_in_*_reg}] +# set_false_path -to [get_cells -hierarchical -filter {NAME =~ *gtwiz_userclk_tx_inst/*gtwiz_userclk_tx_active_*_reg}] +# set_false_path -to [get_cells -hierarchical -filter {NAME =~ *gtwiz_userclk_rx_inst/*gtwiz_userclk_rx_active_*_reg}] + +#set_property CLOCK_DEDICATED_ROUTE BACKBONE [get_nets iACLK] +#set_property CLOCK_DEDICATED_ROUTE FALSE [get_nets CFG_CLK_IBUF_inst/O] +# set_property CLOCK_DEDICATED_ROUTE BACKBONE [get_nets iGPUCLK] +# set_property CLOCK_DEDICATED_ROUTE BACKBONE [get_nets iMCLK] + +set_property PULLUP true [get_ports QSPI_D0] +set_property PULLUP true [get_ports QSPI_D1] +set_property PULLUP true [get_ports QSPI_D2] +set_property PULLUP true [get_ports QSPI_D3] + +# set_property IOSTANDARD SSTL12_DCI [get_ports "c0_ddr4_bg[0]"] +# set_property OUTPUT_IMPEDANCE RDRV_40_40 [get_ports "c0_ddr4_bg[0]"] + +set_property CONFIG_VOLTAGE 3.3 [current_design] +set_property CFGBVS VCCO [current_design] +set_property BITSTREAM.CONFIG.UNUSEDPIN Pullnone [current_design] +set_property BITSTREAM.CONFIG.PERSIST Yes [current_design] +set_property BITSTREAM.STARTUP.MATCH_CYCLE Auto [current_design] +set_property BITSTREAM.GENERAL.COMPRESS True [current_design] +set_property CONFIG_MODE S_SELECTMAP [current_design] + +set_property PACKAGE_PIN AR26 [get_ports NRST] +set_property PACKAGE_PIN AR27 [get_ports {P0[0]}] +set_property PACKAGE_PIN AW29 [get_ports {P0[10]}] +set_property PACKAGE_PIN BA25 [get_ports {P0[11]}] +set_property PACKAGE_PIN BB25 [get_ports {P0[12]}] +set_property PACKAGE_PIN AY28 [get_ports {P0[13]}] +set_property PACKAGE_PIN BA28 [get_ports {P0[14]}] +set_property PACKAGE_PIN AY26 [get_ports {P0[15]}] +set_property PACKAGE_PIN AR28 [get_ports {P0[1]}] +set_property PACKAGE_PIN AT28 [get_ports {P0[2]}] +set_property PACKAGE_PIN AU25 [get_ports {P0[3]}] +set_property PACKAGE_PIN AU26 [get_ports {P0[4]}] +set_property PACKAGE_PIN AU27 [get_ports {P0[5]}] +set_property PACKAGE_PIN AV28 [get_ports {P0[6]}] +set_property PACKAGE_PIN BB26 [get_ports {P0[7]}] +set_property PACKAGE_PIN BB27 [get_ports {P0[8]}] +set_property PACKAGE_PIN AW28 [get_ports {P0[9]}] +set_property PACKAGE_PIN AW26 [get_ports {P1[0]}] +set_property PACKAGE_PIN AY21 [get_ports {P1[10]}] +set_property PACKAGE_PIN AY22 [get_ports {P1[11]}] +set_property PACKAGE_PIN BA22 [get_ports {P1[12]}] +set_property PACKAGE_PIN AT22 [get_ports {P1[13]}] +set_property PACKAGE_PIN AT23 [get_ports {P1[14]}] +set_property PACKAGE_PIN AR25 [get_ports {P1[15]}] +set_property PACKAGE_PIN AY27 [get_ports {P1[1]}] +set_property PACKAGE_PIN AW23 [get_ports {P1[2]}] +set_property PACKAGE_PIN AY23 [get_ports {P1[3]}] +set_property PACKAGE_PIN AW25 [get_ports {P1[4]}] +set_property PACKAGE_PIN BB21 [get_ports {P1[5]}] +set_property PACKAGE_PIN BB22 [get_ports {P1[6]}] +set_property PACKAGE_PIN BA23 [get_ports {P1[7]}] +set_property PACKAGE_PIN BA24 [get_ports {P1[8]}] +set_property PACKAGE_PIN AW21 [get_ports {P1[9]}] +set_property PACKAGE_PIN AW24 [get_ports SWCLKTCK] +set_property PACKAGE_PIN AU22 [get_ports SWDIOTMS] +set_property PACKAGE_PIN AV23 [get_ports VDD] +set_property PACKAGE_PIN AT24 [get_ports VDDIO] +set_property PACKAGE_PIN AT25 [get_ports VSS] +set_property PACKAGE_PIN AV21 [get_ports VSSIO] +set_property PACKAGE_PIN AY25 [get_ports XTAL1] +set_property PACKAGE_PIN AV22 [get_ports XTAL2] diff --git a/Cortex-M0/nanosoc/systems/mcu/fpga_imp/target_fpga_arm_mps3/fpga_synth.tcl b/Cortex-M0/nanosoc/systems/mcu/fpga_imp/target_fpga_arm_mps3/fpga_synth.tcl new file mode 100644 index 0000000..4b89d74 --- /dev/null +++ b/Cortex-M0/nanosoc/systems/mcu/fpga_imp/target_fpga_arm_mps3/fpga_synth.tcl @@ -0,0 +1 @@ +synth_design -top cmsdk_mcu_chip -part xcku115-flvb1760-1-c diff --git a/Cortex-M0/nanosoc/systems/mcu/fpga_imp/target_fpga_arm_mps3/fpga_timing.xdc b/Cortex-M0/nanosoc/systems/mcu/fpga_imp/target_fpga_arm_mps3/fpga_timing.xdc new file mode 100644 index 0000000..78ac5e6 --- /dev/null +++ b/Cortex-M0/nanosoc/systems/mcu/fpga_imp/target_fpga_arm_mps3/fpga_timing.xdc @@ -0,0 +1,99 @@ +################################################################################## +## ## +## Arm MPS3 Rev-C timing XDC ## +## ## +################################################################################## + +create_clock -name CLK -period 30 [get_ports XTAL1] +create_clock -name VCLK -period 30 -waveform {5 20} + +create_clock -name SWCLK -period 60 [get_ports SWCLKTCK] +create_clock -name VSWCLK -period 60 -waveform {5 35} + +set_clock_groups -name async_clk_swclock -asynchronous \ +-group [get_clocks -include_generated_clocks CLK] \ +-group [get_clocks -include_generated_clocks SWCLK] + +set_input_delay -clock [get_clocks oscclk_0] -min -add_delay 2.800 [get_ports {USER_SW[*]}] +set_input_delay -clock [get_clocks oscclk_0] -max -add_delay 5.800 [get_ports {USER_SW[*]}] +set_input_delay -clock [get_clocks oscclk_0] -min -add_delay 2.800 [get_ports {USER_nPB[*]}] +set_input_delay -clock [get_clocks oscclk_0] -max -add_delay 5.800 [get_ports {USER_nPB[*]}] +set_input_delay -clock [get_clocks oscclk_0] -min -add_delay 2.800 [get_ports CB_nPOR] +set_input_delay -clock [get_clocks oscclk_0] -max -add_delay 5.800 [get_ports CB_nPOR] +set_output_delay -clock [get_clocks oscclk_0] -min -add_delay -1.200 [get_ports {USER_nLED[*]}] +set_output_delay -clock [get_clocks oscclk_0] -max -add_delay 5.800 [get_ports {USER_nLED[*]}] + +#set_input_delay -clock [get_clocks clk_pl_0] -min -add_delay 20.000 [get_ports {dip_switch_4bits_tri_i[*]}] +#set_input_delay -clock [get_clocks clk_pl_0] -max -add_delay 25.000 [get_ports {dip_switch_4bits_tri_i[*]}] +#set_input_delay -clock [get_clocks clk_pl_0] -min -add_delay 20.000 [get_ports PMOD0_2] +#set_input_delay -clock [get_clocks clk_pl_0] -max -add_delay 25.000 [get_ports PMOD0_2] +#set_input_delay -clock [get_clocks clk_pl_0] -min -add_delay 20.000 [get_ports PMOD0_3] +#set_input_delay -clock [get_clocks clk_pl_0] -max -add_delay 25.000 [get_ports PMOD0_3] +#set_output_delay -clock [get_clocks clk_pl_0] -min -add_delay 5.000 [get_ports {led_4bits_tri_o[*]}] +#set_output_delay -clock [get_clocks CLK] -max -add_delay 25.000 [get_ports {led_4bits_tri_o[*]}] +set_output_delay -clock [get_clocks CLK] -min -add_delay 5.000 [get_ports {P0[0]} ] +set_output_delay -clock [get_clocks CLK] -max -add_delay 25.000 [get_ports {P0[0]} ] +set_output_delay -clock [get_clocks CLK] -min -add_delay 5.000 [get_ports {P0[1]} ] +set_output_delay -clock [get_clocks CLK] -max -add_delay 25.000 [get_ports {P0[1]} ] +set_output_delay -clock [get_clocks CLK] -min -add_delay 5.000 [get_ports {P0[2]} ] +set_output_delay -clock [get_clocks CLK] -max -add_delay 25.000 [get_ports {P0[2]} ] +set_output_delay -clock [get_clocks CLK] -min -add_delay 5.000 [get_ports {P0[3]} ] +set_output_delay -clock [get_clocks CLK] -max -add_delay 25.000 [get_ports {P0[3]} ] +set_output_delay -clock [get_clocks CLK] -min -add_delay 5.000 [get_ports {P0[4]} ] +set_output_delay -clock [get_clocks CLK] -max -add_delay 25.000 [get_ports {P0[4]} ] +set_output_delay -clock [get_clocks CLK] -min -add_delay 5.000 [get_ports {P0[5]} ] +set_output_delay -clock [get_clocks CLK] -max -add_delay 25.000 [get_ports {P0[5]} ] +set_output_delay -clock [get_clocks CLK] -min -add_delay 5.000 [get_ports {P0[6]} ] +set_output_delay -clock [get_clocks CLK] -max -add_delay 25.000 [get_ports {P0[6]} ] +set_output_delay -clock [get_clocks CLK] -min -add_delay 5.000 [get_ports {P0[7]} ] +set_output_delay -clock [get_clocks CLK] -max -add_delay 25.000 [get_ports {P0[7]} ] +set_output_delay -clock [get_clocks CLK] -min -add_delay 5.000 [get_ports {P0[8]} ] +set_output_delay -clock [get_clocks CLK] -max -add_delay 25.000 [get_ports {P0[8]} ] +set_output_delay -clock [get_clocks CLK] -min -add_delay 5.000 [get_ports {P0[9]} ] +set_output_delay -clock [get_clocks CLK] -max -add_delay 25.000 [get_ports {P0[9]} ] +set_output_delay -clock [get_clocks CLK] -min -add_delay 5.000 [get_ports {P0[10]} ] +set_output_delay -clock [get_clocks CLK] -max -add_delay 25.000 [get_ports {P0[10]} ] +set_output_delay -clock [get_clocks CLK] -min -add_delay 5.000 [get_ports {P011]} ] +set_output_delay -clock [get_clocks CLK] -max -add_delay 25.000 [get_ports {P0[11]} ] +set_output_delay -clock [get_clocks CLK] -min -add_delay 5.000 [get_ports {P0[12]} ] +set_output_delay -clock [get_clocks CLK] -max -add_delay 25.000 [get_ports {P0[12]} ] +set_output_delay -clock [get_clocks CLK] -min -add_delay 5.000 [get_ports {P013]} ] +set_output_delay -clock [get_clocks CLK] -max -add_delay 25.000 [get_ports {P0[13]} ] +set_output_delay -clock [get_clocks CLK] -min -add_delay 5.000 [get_ports {P0[14]} ] +set_output_delay -clock [get_clocks CLK] -max -add_delay 25.000 [get_ports {P0[14]} ] +set_output_delay -clock [get_clocks CLK] -min -add_delay 5.000 [get_ports {P015]} ] +set_output_delay -clock [get_clocks CLK] -max -add_delay 25.000 [get_ports {P0[15]} ] + +set_output_delay -clock [get_clocks CLK] -min -add_delay 5.000 [get_ports {P1[0]} ] +set_output_delay -clock [get_clocks CLK] -max -add_delay 25.000 [get_ports {P1[0]} ] +set_output_delay -clock [get_clocks CLK] -min -add_delay 5.000 [get_ports {P1[1]} ] +set_output_delay -clock [get_clocks CLK] -max -add_delay 25.000 [get_ports {P1[1]} ] +set_output_delay -clock [get_clocks CLK] -min -add_delay 5.000 [get_ports {P1[2]} ] +set_output_delay -clock [get_clocks CLK] -max -add_delay 25.000 [get_ports {P1[2]} ] +set_output_delay -clock [get_clocks CLK] -min -add_delay 5.000 [get_ports {P1[3]} ] +set_output_delay -clock [get_clocks CLK] -max -add_delay 25.000 [get_ports {P1[3]} ] +set_output_delay -clock [get_clocks CLK] -min -add_delay 5.000 [get_ports {P1[4]} ] +set_output_delay -clock [get_clocks CLK] -max -add_delay 25.000 [get_ports {P1[4]} ] +set_output_delay -clock [get_clocks CLK] -min -add_delay 5.000 [get_ports {P1[5]} ] +set_output_delay -clock [get_clocks CLK] -max -add_delay 25.000 [get_ports {P1[5]} ] +set_output_delay -clock [get_clocks CLK] -min -add_delay 5.000 [get_ports {P1[6]} ] +set_output_delay -clock [get_clocks CLK] -max -add_delay 25.000 [get_ports {P1[6]} ] +set_output_delay -clock [get_clocks CLK] -min -add_delay 5.000 [get_ports {P1[7]} ] +set_output_delay -clock [get_clocks CLK] -max -add_delay 25.000 [get_ports {P1[7]} ] +set_output_delay -clock [get_clocks CLK] -min -add_delay 5.000 [get_ports {P1[8]} ] +set_output_delay -clock [get_clocks CLK] -max -add_delay 25.000 [get_ports {P1[8]} ] +set_output_delay -clock [get_clocks CLK] -min -add_delay 5.000 [get_ports {P1[9]} ] +set_output_delay -clock [get_clocks CLK] -max -add_delay 25.000 [get_ports {P1[9]} ] +set_output_delay -clock [get_clocks CLK] -min -add_delay 5.000 [get_ports {P1[10]} ] +set_output_delay -clock [get_clocks CLK] -max -add_delay 25.000 [get_ports {P1[10]} ] +set_output_delay -clock [get_clocks CLK] -min -add_delay 5.000 [get_ports {P111]} ] +set_output_delay -clock [get_clocks CLK] -max -add_delay 25.000 [get_ports {P1[11]} ] +set_output_delay -clock [get_clocks CLK] -min -add_delay 5.000 [get_ports {P1[12]} ] +set_output_delay -clock [get_clocks CLK] -max -add_delay 25.000 [get_ports {P1[12]} ] +set_output_delay -clock [get_clocks CLK] -min -add_delay 5.000 [get_ports {P113]} ] +set_output_delay -clock [get_clocks CLK] -max -add_delay 25.000 [get_ports {P1[13]} ] +set_output_delay -clock [get_clocks CLK] -min -add_delay 5.000 [get_ports {P1[14]} ] +set_output_delay -clock [get_clocks CLK] -max -add_delay 25.000 [get_ports {P1[14]} ] +set_output_delay -clock [get_clocks CLK] -min -add_delay 5.000 [get_ports {P115]} ] +set_output_delay -clock [get_clocks CLK] -max -add_delay 25.000 [get_ports {P1[15]} ] + diff --git a/Cortex-M0/nanosoc/systems/mcu/fpga_imp/target_fpga_pynq_z2/design_1.tcl b/Cortex-M0/nanosoc/systems/mcu/fpga_imp/target_fpga_pynq_z2/design_1.tcl new file mode 100644 index 0000000..22a84df --- /dev/null +++ b/Cortex-M0/nanosoc/systems/mcu/fpga_imp/target_fpga_pynq_z2/design_1.tcl @@ -0,0 +1,508 @@ + +################################################################ +# This is a generated script based on design: design_1 +# +# Though there are limitations about the generated script, +# the main purpose of this utility is to make learning +# IP Integrator Tcl commands easier. +################################################################ + +namespace eval _tcl { +proc get_script_folder {} { + set script_path [file normalize [info script]] + set script_folder [file dirname $script_path] + return $script_folder +} +} +variable script_folder +set script_folder [_tcl::get_script_folder] + +################################################################ +# Check if script is running in correct Vivado version. +################################################################ +set scripts_vivado_version 2021.1 +set current_vivado_version [version -short] + +if { [string first $scripts_vivado_version $current_vivado_version] == -1 } { + puts "" + catch {common::send_gid_msg -ssname BD::TCL -id 2041 -severity "ERROR" "This script was generated using Vivado <$scripts_vivado_version> and is being run in <$current_vivado_version> of Vivado. Please run the script in Vivado <$scripts_vivado_version> then open the design in Vivado <$current_vivado_version>. Upgrade the design by running \"Tools => Report => Report IP Status...\", then run write_bd_tcl to create an updated script."} + + return 1 +} + +################################################################ +# START +################################################################ + +# To test this script, run the following commands from Vivado Tcl console: +# source design_1_script.tcl + +set bCheckIPsPassed 1 +################################################################## +# CHECK IPs +################################################################## +set bCheckIPs 1 +if { $bCheckIPs == 1 } { + set list_check_ips "\ +soclabs.org:user:nanosoc_chip:1.0\ +xilinx.com:ip:processing_system7:5.5\ +xilinx.com:ip:axi_gpio:2.0\ +xilinx.com:ip:axi_uartlite:2.0\ +xilinx.com:ip:xlslice:1.0\ +xilinx.com:ip:xlconcat:2.1\ +xilinx.com:ip:proc_sys_reset:5.0\ +xilinx.com:ip:smartconnect:1.0\ +xilinx.com:ip:xlconstant:1.1\ +" + + set list_ips_missing "" + common::send_gid_msg -ssname BD::TCL -id 2011 -severity "INFO" "Checking if the following IPs exist in the project's IP catalog: $list_check_ips ." + + foreach ip_vlnv $list_check_ips { + set ip_obj [get_ipdefs -all $ip_vlnv] + if { $ip_obj eq "" } { + lappend list_ips_missing $ip_vlnv + } + } + + if { $list_ips_missing ne "" } { + catch {common::send_gid_msg -ssname BD::TCL -id 2012 -severity "ERROR" "The following IPs are not found in the IP Catalog:\n $list_ips_missing\n\nResolution: Please add the repository containing the IP(s) to the project." } + set bCheckIPsPassed 0 + } + +} + +if { $bCheckIPsPassed != 1 } { + common::send_gid_msg -ssname BD::TCL -id 2023 -severity "WARNING" "Will not continue with creation of design due to the error(s) above." + return 3 +} + +################################################################## +# DESIGN PROCs +################################################################## + + +# Hierarchical cell: cmsdk_socket +proc create_hier_cell_cmsdk_socket { parentCell nameHier } { + + variable script_folder + + if { $parentCell eq "" || $nameHier eq "" } { + catch {common::send_gid_msg -ssname BD::TCL -id 2092 -severity "ERROR" "create_hier_cell_cmsdk_socket() - Empty argument(s)!"} + return + } + + # Get object for parentCell + set parentObj [get_bd_cells $parentCell] + if { $parentObj == "" } { + catch {common::send_gid_msg -ssname BD::TCL -id 2090 -severity "ERROR" "Unable to find parent cell <$parentCell>!"} + return + } + + # Make sure parentObj is hier blk + set parentType [get_property TYPE $parentObj] + if { $parentType ne "hier" } { + catch {common::send_gid_msg -ssname BD::TCL -id 2091 -severity "ERROR" "Parent <$parentObj> has TYPE = <$parentType>. Expected to be <hier>."} + return + } + + # Save current instance; Restore later + set oldCurInst [current_bd_instance .] + + # Set parent object as current + current_bd_instance $parentObj + + # Create cell and set as current instance + set hier_obj [create_bd_cell -type hier $nameHier] + current_bd_instance $hier_obj + + # Create interface pins + create_bd_intf_pin -mode Slave -vlnv xilinx.com:interface:aximm_rtl:1.0 S00_AXI + + + # Create pins + create_bd_pin -dir I -type clk aclk + create_bd_pin -dir I -type rst ext_reset_in + create_bd_pin -dir O -from 15 -to 0 gpio2_tri_o + create_bd_pin -dir I -from 15 -to 0 gpio2_tri_z + create_bd_pin -dir O -from 15 -to 0 gpio_tri_i + create_bd_pin -dir I -from 15 -to 0 gpio_tri_o + create_bd_pin -dir O -from 0 -to 0 -type rst nrst + create_bd_pin -dir O -from 15 -to 0 p0_tri_i + create_bd_pin -dir I -from 15 -to 0 p0_tri_o + create_bd_pin -dir I -from 15 -to 0 p0_tri_z + create_bd_pin -dir O -from 15 -to 0 p1_tri_i + create_bd_pin -dir I -from 15 -to 0 p1_tri_o + create_bd_pin -dir I -from 15 -to 0 p1_tri_z + create_bd_pin -dir I -from 7 -to 0 pmoda_tri_i + create_bd_pin -dir O -from 7 -to 0 pmoda_tri_o + create_bd_pin -dir O -from 7 -to 0 pmoda_tri_z + + # Create instance: axi_gpio_0, and set properties + set axi_gpio_0 [ create_bd_cell -type ip -vlnv xilinx.com:ip:axi_gpio:2.0 axi_gpio_0 ] + set_property -dict [ list \ + CONFIG.C_GPIO2_WIDTH {16} \ + CONFIG.C_GPIO_WIDTH {16} \ + CONFIG.C_IS_DUAL {1} \ + ] $axi_gpio_0 + + # Create instance: axi_gpio_1, and set properties + set axi_gpio_1 [ create_bd_cell -type ip -vlnv xilinx.com:ip:axi_gpio:2.0 axi_gpio_1 ] + set_property -dict [ list \ + CONFIG.C_GPIO2_WIDTH {16} \ + CONFIG.C_GPIO_WIDTH {16} \ + CONFIG.C_IS_DUAL {1} \ + ] $axi_gpio_1 + + # Create instance: axi_gpio_2, and set properties + set axi_gpio_2 [ create_bd_cell -type ip -vlnv xilinx.com:ip:axi_gpio:2.0 axi_gpio_2 ] + set_property -dict [ list \ + CONFIG.C_GPIO2_WIDTH {16} \ + CONFIG.C_GPIO_WIDTH {16} \ + CONFIG.C_IS_DUAL {1} \ + ] $axi_gpio_2 + + # Create instance: axi_uartlite_0, and set properties + set axi_uartlite_0 [ create_bd_cell -type ip -vlnv xilinx.com:ip:axi_uartlite:2.0 axi_uartlite_0 ] + set_property -dict [ list \ + CONFIG.C_S_AXI_ACLK_FREQ_HZ {20000000} \ + ] $axi_uartlite_0 + + # Create instance: p1_i_bit15to6, and set properties + set p1_i_bit15to6 [ create_bd_cell -type ip -vlnv xilinx.com:ip:xlslice:1.0 p1_i_bit15to6 ] + set_property -dict [ list \ + CONFIG.DIN_FROM {15} \ + CONFIG.DIN_TO {6} \ + CONFIG.DIN_WIDTH {16} \ + CONFIG.DOUT_WIDTH {10} \ + ] $p1_i_bit15to6 + + # Create instance: p1_i_concat, and set properties + set p1_i_concat [ create_bd_cell -type ip -vlnv xilinx.com:ip:xlconcat:2.1 p1_i_concat ] + set_property -dict [ list \ + CONFIG.IN0_WIDTH {1} \ + CONFIG.IN1_WIDTH {1} \ + CONFIG.IN2_WIDTH {1} \ + CONFIG.IN3_WIDTH {1} \ + CONFIG.IN4_WIDTH {1} \ + CONFIG.IN5_WIDTH {1} \ + CONFIG.IN6_WIDTH {10} \ + CONFIG.NUM_PORTS {7} \ + ] $p1_i_concat + + # Create instance: p1_o_bit1, and set properties + set p1_o_bit1 [ create_bd_cell -type ip -vlnv xilinx.com:ip:xlslice:1.0 p1_o_bit1 ] + set_property -dict [ list \ + CONFIG.DIN_FROM {1} \ + CONFIG.DIN_TO {1} \ + CONFIG.DIN_WIDTH {16} \ + CONFIG.DOUT_WIDTH {1} \ + ] $p1_o_bit1 + + # Create instance: p1_o_bit15to6, and set properties + set p1_o_bit15to6 [ create_bd_cell -type ip -vlnv xilinx.com:ip:xlslice:1.0 p1_o_bit15to6 ] + set_property -dict [ list \ + CONFIG.DIN_FROM {15} \ + CONFIG.DIN_TO {6} \ + CONFIG.DIN_WIDTH {16} \ + CONFIG.DOUT_WIDTH {10} \ + ] $p1_o_bit15to6 + + # Create instance: p1_o_bit2, and set properties + set p1_o_bit2 [ create_bd_cell -type ip -vlnv xilinx.com:ip:xlslice:1.0 p1_o_bit2 ] + set_property -dict [ list \ + CONFIG.DIN_FROM {2} \ + CONFIG.DIN_TO {2} \ + CONFIG.DIN_WIDTH {16} \ + CONFIG.DOUT_WIDTH {1} \ + ] $p1_o_bit2 + + # Create instance: p1_o_bit3, and set properties + set p1_o_bit3 [ create_bd_cell -type ip -vlnv xilinx.com:ip:xlslice:1.0 p1_o_bit3 ] + set_property -dict [ list \ + CONFIG.DIN_FROM {3} \ + CONFIG.DIN_TO {3} \ + CONFIG.DIN_WIDTH {16} \ + CONFIG.DOUT_WIDTH {1} \ + ] $p1_o_bit3 + + # Create instance: p1_o_bit5, and set properties + set p1_o_bit5 [ create_bd_cell -type ip -vlnv xilinx.com:ip:xlslice:1.0 p1_o_bit5 ] + set_property -dict [ list \ + CONFIG.DIN_FROM {5} \ + CONFIG.DIN_TO {5} \ + CONFIG.DIN_WIDTH {16} \ + CONFIG.DOUT_WIDTH {1} \ + ] $p1_o_bit5 + + # Create instance: p1_z_bit2, and set properties + set p1_z_bit2 [ create_bd_cell -type ip -vlnv xilinx.com:ip:xlslice:1.0 p1_z_bit2 ] + set_property -dict [ list \ + CONFIG.DIN_FROM {2} \ + CONFIG.DIN_TO {2} \ + CONFIG.DIN_WIDTH {16} \ + CONFIG.DOUT_WIDTH {1} \ + ] $p1_z_bit2 + + # Create instance: pmoda_i_bit2, and set properties + set pmoda_i_bit2 [ create_bd_cell -type ip -vlnv xilinx.com:ip:xlslice:1.0 pmoda_i_bit2 ] + set_property -dict [ list \ + CONFIG.DIN_FROM {2} \ + CONFIG.DIN_TO {2} \ + CONFIG.DIN_WIDTH {8} \ + CONFIG.DOUT_WIDTH {1} \ + ] $pmoda_i_bit2 + + # Create instance: pmoda_i_bit3, and set properties + set pmoda_i_bit3 [ create_bd_cell -type ip -vlnv xilinx.com:ip:xlslice:1.0 pmoda_i_bit3 ] + set_property -dict [ list \ + CONFIG.DIN_FROM {3} \ + CONFIG.DIN_TO {3} \ + CONFIG.DIN_WIDTH {8} \ + CONFIG.DOUT_WIDTH {1} \ + ] $pmoda_i_bit3 + + # Create instance: pmoda_o_concat8, and set properties + set pmoda_o_concat8 [ create_bd_cell -type ip -vlnv xilinx.com:ip:xlconcat:2.1 pmoda_o_concat8 ] + set_property -dict [ list \ + CONFIG.NUM_PORTS {8} \ + ] $pmoda_o_concat8 + + # Create instance: pmoda_z_concat8, and set properties + set pmoda_z_concat8 [ create_bd_cell -type ip -vlnv xilinx.com:ip:xlconcat:2.1 pmoda_z_concat8 ] + set_property -dict [ list \ + CONFIG.NUM_PORTS {8} \ + ] $pmoda_z_concat8 + + # Create instance: proc_sys_reset_0, and set properties + set proc_sys_reset_0 [ create_bd_cell -type ip -vlnv xilinx.com:ip:proc_sys_reset:5.0 proc_sys_reset_0 ] + + # Create instance: smartconnect_0, and set properties + set smartconnect_0 [ create_bd_cell -type ip -vlnv xilinx.com:ip:smartconnect:1.0 smartconnect_0 ] + set_property -dict [ list \ + CONFIG.NUM_MI {4} \ + CONFIG.NUM_SI {1} \ + ] $smartconnect_0 + + # Create instance: xlconstant_0, and set properties + set xlconstant_0 [ create_bd_cell -type ip -vlnv xilinx.com:ip:xlconstant:1.1 xlconstant_0 ] + set_property -dict [ list \ + CONFIG.CONST_VAL {0} \ + ] $xlconstant_0 + + # Create instance: xlconstant_1, and set properties + set xlconstant_1 [ create_bd_cell -type ip -vlnv xilinx.com:ip:xlconstant:1.1 xlconstant_1 ] + + # Create interface connections + connect_bd_intf_net -intf_net smartconnect_0_M00_AXI [get_bd_intf_pins axi_gpio_0/S_AXI] [get_bd_intf_pins smartconnect_0/M00_AXI] + connect_bd_intf_net -intf_net smartconnect_0_M01_AXI [get_bd_intf_pins axi_gpio_1/S_AXI] [get_bd_intf_pins smartconnect_0/M01_AXI] + connect_bd_intf_net -intf_net smartconnect_0_M02_AXI [get_bd_intf_pins axi_gpio_2/S_AXI] [get_bd_intf_pins smartconnect_0/M02_AXI] + connect_bd_intf_net -intf_net smartconnect_0_M03_AXI [get_bd_intf_pins axi_uartlite_0/S_AXI] [get_bd_intf_pins smartconnect_0/M03_AXI] + connect_bd_intf_net -intf_net zynq_ultra_ps_e_0_M_AXI_HPM0_LPD [get_bd_intf_pins S00_AXI] [get_bd_intf_pins smartconnect_0/S00_AXI] + + # Create port connections + connect_bd_net -net UART2_TXD [get_bd_pins axi_uartlite_0/rx] [get_bd_pins p1_o_bit5/Dout] + connect_bd_net -net axi_gpio_0_gpio_io_o [get_bd_pins p0_tri_i] [get_bd_pins axi_gpio_0/gpio_io_o] + connect_bd_net -net axi_gpio_1_gpio_io_o [get_bd_pins axi_gpio_1/gpio_io_o] [get_bd_pins p1_i_bit15to6/Din] + connect_bd_net -net axi_gpio_2_gpio2_io_o [get_bd_pins gpio2_tri_o] [get_bd_pins axi_gpio_2/gpio2_io_o] + connect_bd_net -net axi_gpio_2_gpio_io_o [get_bd_pins gpio_tri_i] [get_bd_pins axi_gpio_2/gpio_io_o] + connect_bd_net -net axi_uartlite_0_tx [get_bd_pins axi_uartlite_0/tx] [get_bd_pins p1_i_concat/In4] + connect_bd_net -net nanosoc_chip_0_p0_o [get_bd_pins p0_tri_o] [get_bd_pins axi_gpio_0/gpio_io_i] + connect_bd_net -net nanosoc_chip_0_p0_z [get_bd_pins p0_tri_z] [get_bd_pins axi_gpio_0/gpio2_io_i] + connect_bd_net -net nanosoc_chip_0_p1_o [get_bd_pins p1_tri_o] [get_bd_pins axi_gpio_1/gpio_io_i] [get_bd_pins p1_o_bit1/Din] [get_bd_pins p1_o_bit15to6/Din] [get_bd_pins p1_o_bit2/Din] [get_bd_pins p1_o_bit3/Din] [get_bd_pins p1_o_bit5/Din] + connect_bd_net -net nanosoc_chip_0_swdio_o [get_bd_pins gpio_tri_o] [get_bd_pins axi_gpio_2/gpio_io_i] + connect_bd_net -net nanosoc_chip_0_swdio_z [get_bd_pins gpio2_tri_z] [get_bd_pins axi_gpio_2/gpio2_io_i] + connect_bd_net -net const0 [get_bd_pins p1_i_concat/In1] [get_bd_pins p1_i_concat/In3] [get_bd_pins p1_i_concat/In5] [get_bd_pins pmoda_o_concat8/In2] [get_bd_pins pmoda_o_concat8/In4] [get_bd_pins pmoda_o_concat8/In5] [get_bd_pins pmoda_o_concat8/In6] [get_bd_pins pmoda_o_concat8/In7] [get_bd_pins pmoda_z_concat8/In0] [get_bd_pins pmoda_z_concat8/In1] [get_bd_pins xlconstant_0/dout] + connect_bd_net -net const1 [get_bd_pins pmoda_z_concat8/In2] [get_bd_pins pmoda_z_concat8/In4] [get_bd_pins pmoda_z_concat8/In5] [get_bd_pins pmoda_z_concat8/In6] [get_bd_pins pmoda_z_concat8/In7] [get_bd_pins xlconstant_1/dout] + connect_bd_net -net ftclk_o [get_bd_pins p1_o_bit1/Dout] [get_bd_pins pmoda_o_concat8/In0] + connect_bd_net -net ftmiosio_o [get_bd_pins p1_o_bit2/Dout] [get_bd_pins pmoda_o_concat8/In3] + connect_bd_net -net ftmiosio_z [get_bd_pins p1_z_bit2/Dout] [get_bd_pins pmoda_z_concat8/In3] + connect_bd_net -net ftssn_n [get_bd_pins p1_o_bit3/Dout] [get_bd_pins pmoda_o_concat8/In1] + connect_bd_net -net p1_i [get_bd_pins p1_tri_i] [get_bd_pins p1_i_concat/dout] + connect_bd_net -net p1_i_bit15to6_Dout [get_bd_pins p1_i_bit15to6/Dout] [get_bd_pins p1_i_concat/In6] + connect_bd_net -net p1_z [get_bd_pins p1_tri_z] [get_bd_pins axi_gpio_1/gpio2_io_i] [get_bd_pins p1_z_bit2/Din] + connect_bd_net -net pmoda_i_1 [get_bd_pins pmoda_tri_i] [get_bd_pins pmoda_i_bit2/Din] [get_bd_pins pmoda_i_bit3/Din] + connect_bd_net -net pmoda_i_bit2_Dout [get_bd_pins p1_i_concat/In0] [get_bd_pins pmoda_i_bit2/Dout] + connect_bd_net -net pmoda_i_bit3_Dout [get_bd_pins p1_i_concat/In2] [get_bd_pins pmoda_i_bit3/Dout] + connect_bd_net -net pmoda_o_concat9_dout [get_bd_pins pmoda_tri_z] [get_bd_pins pmoda_z_concat8/dout] + connect_bd_net -net proc_sys_reset_0_interconnect_aresetn [get_bd_pins axi_gpio_0/s_axi_aresetn] [get_bd_pins axi_gpio_1/s_axi_aresetn] [get_bd_pins axi_gpio_2/s_axi_aresetn] [get_bd_pins axi_uartlite_0/s_axi_aresetn] [get_bd_pins proc_sys_reset_0/interconnect_aresetn] [get_bd_pins smartconnect_0/aresetn] + connect_bd_net -net proc_sys_reset_0_peripheral_aresetn [get_bd_pins nrst] [get_bd_pins proc_sys_reset_0/peripheral_aresetn] + connect_bd_net -net xlconcat_0_dout [get_bd_pins pmoda_tri_o] [get_bd_pins pmoda_o_concat8/dout] + connect_bd_net -net zynq_ultra_ps_e_0_pl_clk0 [get_bd_pins aclk] [get_bd_pins axi_gpio_0/s_axi_aclk] [get_bd_pins axi_gpio_1/s_axi_aclk] [get_bd_pins axi_gpio_2/s_axi_aclk] [get_bd_pins axi_uartlite_0/s_axi_aclk] [get_bd_pins proc_sys_reset_0/slowest_sync_clk] [get_bd_pins smartconnect_0/aclk] + connect_bd_net -net zynq_ultra_ps_e_0_pl_resetn0 [get_bd_pins ext_reset_in] [get_bd_pins proc_sys_reset_0/ext_reset_in] + + # Restore current instance + current_bd_instance $oldCurInst +} + + +# Procedure to create entire design; Provide argument to make +# procedure reusable. If parentCell is "", will use root. +proc create_root_design { parentCell } { + + variable script_folder + + if { $parentCell eq "" } { + set parentCell [get_bd_cells /] + } + + # Get object for parentCell + set parentObj [get_bd_cells $parentCell] + if { $parentObj == "" } { + catch {common::send_gid_msg -ssname BD::TCL -id 2090 -severity "ERROR" "Unable to find parent cell <$parentCell>!"} + return + } + + # Make sure parentObj is hier blk + set parentType [get_property TYPE $parentObj] + if { $parentType ne "hier" } { + catch {common::send_gid_msg -ssname BD::TCL -id 2091 -severity "ERROR" "Parent <$parentObj> has TYPE = <$parentType>. Expected to be <hier>."} + return + } + + # Save current instance; Restore later + set oldCurInst [current_bd_instance .] + + # Set parent object as current + current_bd_instance $parentObj + + + # Create interface ports + + # Create ports + set pmoda_tri_i [ create_bd_port -dir I -from 7 -to 0 pmoda_tri_i ] + set pmoda_tri_o [ create_bd_port -dir O -from 7 -to 0 pmoda_tri_o ] + set pmoda_tri_z [ create_bd_port -dir O -from 7 -to 0 pmoda_tri_z ] + + # Create instance: nanosoc_chip_0, and set properties + set nanosoc_chip_0 [ create_bd_cell -type ip -vlnv soclabs.org:user:nanosoc_chip:1.0 nanosoc_chip_0 ] + + # Create instance: cmsdk_socket + create_hier_cell_cmsdk_socket [current_bd_instance .] cmsdk_socket + + # Create instance: processing_system7_0, and set properties + set processing_system7_0 [ create_bd_cell -type ip -vlnv xilinx.com:ip:processing_system7:5.5 processing_system7_0 ] + set_property -dict [ list \ + CONFIG.PCW_ACT_APU_PERIPHERAL_FREQMHZ {666.666687} \ + CONFIG.PCW_ACT_CAN_PERIPHERAL_FREQMHZ {10.000000} \ + CONFIG.PCW_ACT_DCI_PERIPHERAL_FREQMHZ {10.158730} \ + CONFIG.PCW_ACT_ENET0_PERIPHERAL_FREQMHZ {10.000000} \ + CONFIG.PCW_ACT_ENET1_PERIPHERAL_FREQMHZ {10.000000} \ + CONFIG.PCW_ACT_FPGA0_PERIPHERAL_FREQMHZ {20.000000} \ + CONFIG.PCW_ACT_FPGA1_PERIPHERAL_FREQMHZ {10.000000} \ + CONFIG.PCW_ACT_FPGA2_PERIPHERAL_FREQMHZ {10.000000} \ + CONFIG.PCW_ACT_FPGA3_PERIPHERAL_FREQMHZ {10.000000} \ + CONFIG.PCW_ACT_PCAP_PERIPHERAL_FREQMHZ {200.000000} \ + CONFIG.PCW_ACT_QSPI_PERIPHERAL_FREQMHZ {10.000000} \ + CONFIG.PCW_ACT_SDIO_PERIPHERAL_FREQMHZ {10.000000} \ + CONFIG.PCW_ACT_SMC_PERIPHERAL_FREQMHZ {10.000000} \ + CONFIG.PCW_ACT_SPI_PERIPHERAL_FREQMHZ {10.000000} \ + CONFIG.PCW_ACT_TPIU_PERIPHERAL_FREQMHZ {200.000000} \ + CONFIG.PCW_ACT_TTC0_CLK0_PERIPHERAL_FREQMHZ {111.111115} \ + CONFIG.PCW_ACT_TTC0_CLK1_PERIPHERAL_FREQMHZ {111.111115} \ + CONFIG.PCW_ACT_TTC0_CLK2_PERIPHERAL_FREQMHZ {111.111115} \ + CONFIG.PCW_ACT_TTC1_CLK0_PERIPHERAL_FREQMHZ {111.111115} \ + CONFIG.PCW_ACT_TTC1_CLK1_PERIPHERAL_FREQMHZ {111.111115} \ + CONFIG.PCW_ACT_TTC1_CLK2_PERIPHERAL_FREQMHZ {111.111115} \ + CONFIG.PCW_ACT_UART_PERIPHERAL_FREQMHZ {10.000000} \ + CONFIG.PCW_ACT_WDT_PERIPHERAL_FREQMHZ {111.111115} \ + CONFIG.PCW_ARMPLL_CTRL_FBDIV {40} \ + CONFIG.PCW_CAN_PERIPHERAL_DIVISOR0 {1} \ + CONFIG.PCW_CAN_PERIPHERAL_DIVISOR1 {1} \ + CONFIG.PCW_CLK0_FREQ {20000000} \ + CONFIG.PCW_CLK1_FREQ {10000000} \ + CONFIG.PCW_CLK2_FREQ {10000000} \ + CONFIG.PCW_CLK3_FREQ {10000000} \ + CONFIG.PCW_CPU_CPU_PLL_FREQMHZ {1333.333} \ + CONFIG.PCW_CPU_PERIPHERAL_DIVISOR0 {2} \ + CONFIG.PCW_DCI_PERIPHERAL_DIVISOR0 {15} \ + CONFIG.PCW_DCI_PERIPHERAL_DIVISOR1 {7} \ + CONFIG.PCW_DDRPLL_CTRL_FBDIV {32} \ + CONFIG.PCW_DDR_DDR_PLL_FREQMHZ {1066.667} \ + CONFIG.PCW_DDR_PERIPHERAL_DIVISOR0 {2} \ + CONFIG.PCW_DDR_RAM_HIGHADDR {0x1FFFFFFF} \ + CONFIG.PCW_ENET0_PERIPHERAL_DIVISOR0 {1} \ + CONFIG.PCW_ENET0_PERIPHERAL_DIVISOR1 {1} \ + CONFIG.PCW_ENET1_PERIPHERAL_DIVISOR0 {1} \ + CONFIG.PCW_ENET1_PERIPHERAL_DIVISOR1 {1} \ + CONFIG.PCW_FCLK0_PERIPHERAL_DIVISOR0 {10} \ + CONFIG.PCW_FCLK0_PERIPHERAL_DIVISOR1 {8} \ + CONFIG.PCW_FCLK1_PERIPHERAL_DIVISOR0 {1} \ + CONFIG.PCW_FCLK1_PERIPHERAL_DIVISOR1 {1} \ + CONFIG.PCW_FCLK2_PERIPHERAL_DIVISOR0 {1} \ + CONFIG.PCW_FCLK2_PERIPHERAL_DIVISOR1 {1} \ + CONFIG.PCW_FCLK3_PERIPHERAL_DIVISOR0 {1} \ + CONFIG.PCW_FCLK3_PERIPHERAL_DIVISOR1 {1} \ + CONFIG.PCW_FPGA0_PERIPHERAL_FREQMHZ {20} \ + CONFIG.PCW_FPGA_FCLK0_ENABLE {1} \ + CONFIG.PCW_FPGA_FCLK1_ENABLE {0} \ + CONFIG.PCW_FPGA_FCLK2_ENABLE {0} \ + CONFIG.PCW_FPGA_FCLK3_ENABLE {0} \ + CONFIG.PCW_I2C_PERIPHERAL_FREQMHZ {25} \ + CONFIG.PCW_IOPLL_CTRL_FBDIV {48} \ + CONFIG.PCW_IO_IO_PLL_FREQMHZ {1600.000} \ + CONFIG.PCW_PCAP_PERIPHERAL_DIVISOR0 {8} \ + CONFIG.PCW_QSPI_PERIPHERAL_DIVISOR0 {1} \ + CONFIG.PCW_SDIO_PERIPHERAL_DIVISOR0 {1} \ + CONFIG.PCW_SMC_PERIPHERAL_DIVISOR0 {1} \ + CONFIG.PCW_SPI_PERIPHERAL_DIVISOR0 {1} \ + CONFIG.PCW_TPIU_PERIPHERAL_DIVISOR0 {1} \ + CONFIG.PCW_UART_PERIPHERAL_DIVISOR0 {1} \ + CONFIG.PCW_UIPARAM_ACT_DDR_FREQ_MHZ {533.333374} \ + ] $processing_system7_0 + + # Create interface connections + connect_bd_intf_net -intf_net S00_AXI_1 [get_bd_intf_pins cmsdk_socket/S00_AXI] [get_bd_intf_pins processing_system7_0/M_AXI_GP0] + + # Create port connections + connect_bd_net -net nanosoc_chip_0_swdio_o [get_bd_pins nanosoc_chip_0/swdio_o] [get_bd_pins cmsdk_socket/gpio_tri_o] + connect_bd_net -net nanosoc_chip_0_swdio_z [get_bd_pins nanosoc_chip_0/swdio_z] [get_bd_pins cmsdk_socket/gpio2_tri_z] + connect_bd_net -net cmsdk_socket_gpio2_tri_o [get_bd_pins nanosoc_chip_0/swdclk_i] [get_bd_pins cmsdk_socket/gpio2_tri_o] + connect_bd_net -net cmsdk_socket_gpio_tri_i [get_bd_pins nanosoc_chip_0/swdio_i] [get_bd_pins cmsdk_socket/gpio_tri_i] + connect_bd_net -net cmsdk_socket_nrst [get_bd_pins nanosoc_chip_0/nrst_i] [get_bd_pins cmsdk_socket/nrst] + connect_bd_net -net cmsdk_socket_p0_tri_i [get_bd_pins nanosoc_chip_0/p0_i] [get_bd_pins cmsdk_socket/p0_tri_i] + connect_bd_net -net cmsdk_socket_p1_tri_i [get_bd_pins nanosoc_chip_0/p1_i] [get_bd_pins cmsdk_socket/p1_tri_i] + connect_bd_net -net p0_tri_o_1 [get_bd_pins nanosoc_chip_0/p0_o] [get_bd_pins cmsdk_socket/p0_tri_o] + connect_bd_net -net p0_tri_z_1 [get_bd_pins nanosoc_chip_0/p0_z] [get_bd_pins cmsdk_socket/p0_tri_z] + connect_bd_net -net p1_tri_o_1 [get_bd_pins nanosoc_chip_0/p1_o] [get_bd_pins cmsdk_socket/p1_tri_o] + connect_bd_net -net p1_tri_z_1 [get_bd_pins nanosoc_chip_0/p1_z] [get_bd_pins cmsdk_socket/p1_tri_z] + connect_bd_net -net pmoda_i_1 [get_bd_ports pmoda_tri_i] [get_bd_pins cmsdk_socket/pmoda_tri_i] + connect_bd_net -net pmoda_o_concat9_dout [get_bd_ports pmoda_tri_z] [get_bd_pins cmsdk_socket/pmoda_tri_z] + connect_bd_net -net processing_system7_0_FCLK_CLK0 [get_bd_pins nanosoc_chip_0/xtal_clk_i] [get_bd_pins cmsdk_socket/aclk] [get_bd_pins processing_system7_0/FCLK_CLK0] [get_bd_pins processing_system7_0/M_AXI_GP0_ACLK] + connect_bd_net -net processing_system7_0_FCLK_RESET0_N [get_bd_pins cmsdk_socket/ext_reset_in] [get_bd_pins processing_system7_0/FCLK_RESET0_N] + connect_bd_net -net xlconcat_0_dout [get_bd_ports pmoda_tri_o] [get_bd_pins cmsdk_socket/pmoda_tri_o] + + # Create address segments + assign_bd_address -offset 0x41200000 -range 0x00010000 -target_address_space [get_bd_addr_spaces processing_system7_0/Data] [get_bd_addr_segs cmsdk_socket/axi_gpio_0/S_AXI/Reg] -force + assign_bd_address -offset 0x41210000 -range 0x00010000 -target_address_space [get_bd_addr_spaces processing_system7_0/Data] [get_bd_addr_segs cmsdk_socket/axi_gpio_1/S_AXI/Reg] -force + assign_bd_address -offset 0x41220000 -range 0x00010000 -target_address_space [get_bd_addr_spaces processing_system7_0/Data] [get_bd_addr_segs cmsdk_socket/axi_gpio_2/S_AXI/Reg] -force + assign_bd_address -offset 0x42C00000 -range 0x00010000 -target_address_space [get_bd_addr_spaces processing_system7_0/Data] [get_bd_addr_segs cmsdk_socket/axi_uartlite_0/S_AXI/Reg] -force + + + # Restore current instance + current_bd_instance $oldCurInst + +} +# End of create_root_design() + + + + +proc available_tcl_procs { } { + puts "##################################################################" + puts "# Available Tcl procedures to recreate hierarchical blocks:" + puts "#" + puts "# create_hier_cell_cmsdk_socket parentCell nameHier" + puts "# create_root_design" + puts "#" + puts "#" + puts "# The following procedures will create hiearchical blocks with addressing " + puts "# for IPs within those blocks and their sub-hierarchical blocks. Addressing " + puts "# will not be handled outside those blocks:" + puts "#" + puts "# create_root_design" + puts "#" + puts "##################################################################" +} + +available_tcl_procs diff --git a/Cortex-M0/nanosoc/systems/mcu/fpga_imp/target_fpga_pynq_z2/design_1_wrapper.v b/Cortex-M0/nanosoc/systems/mcu/fpga_imp/target_fpga_pynq_z2/design_1_wrapper.v new file mode 100644 index 0000000..ce586c7 --- /dev/null +++ b/Cortex-M0/nanosoc/systems/mcu/fpga_imp/target_fpga_pynq_z2/design_1_wrapper.v @@ -0,0 +1,107 @@ +//Copyright 1986-2021 Xilinx, Inc. All Rights Reserved. +//-------------------------------------------------------------------------------- +//Tool Version: Vivado v.2021.1 (lin64) Build 3247384 Thu Jun 10 19:36:07 MDT 2021 +//Date : Wed Jun 22 15:58:42 2022 +//Host : srv03335 running 64-bit Red Hat Enterprise Linux release 8.6 (Ootpa) +//Command : generate_target design_1_wrapper.bd +//Design : design_1_wrapper +//Purpose : IP block netlist +//-------------------------------------------------------------------------------- +`timescale 1 ps / 1 ps + +module design_1_wrapper + (PMOD0_0, + PMOD0_1, + PMOD0_2, + PMOD0_3, + PMOD0_4, + PMOD0_5, + PMOD0_6, + PMOD0_7 + ); +// PMOD1_0, +// PMOD1_1, +// PMOD1_2, +// PMOD1_3, +// PMOD1_4, +// PMOD1_5, +// PMOD1_6, +// PMOD1_7, +// dip_switch_4bits_tri_i, +// led_4bits_tri_o); + + inout wire PMOD0_0; + inout wire PMOD0_1; + inout wire PMOD0_2; + inout wire PMOD0_3; + inout wire PMOD0_4; + inout wire PMOD0_5; + inout wire PMOD0_6; + inout wire PMOD0_7; +// inout wire PMOD1_0; +// inout wire PMOD1_1; +// inout wire PMOD1_2; +// inout wire PMOD1_3; +// inout wire PMOD1_4; +// inout wire PMOD1_5; +// inout wire PMOD1_6; +// inout wire PMOD1_7; + +// input wire [3:0]dip_switch_4bits_tri_i; +// output wire [3:0]led_4bits_tri_o; + + wire [7:0]PMOD0_tri_i; + wire [7:0]PMOD0_tri_o; + wire [7:0]PMOD0_tri_z; + + assign PMOD0_tri_i[0] = PMOD0_0; + assign PMOD0_tri_i[1] = PMOD0_1; + assign PMOD0_tri_i[2] = PMOD0_2; + assign PMOD0_tri_i[3] = PMOD0_3; + assign PMOD0_tri_i[4] = PMOD0_4; + assign PMOD0_tri_i[5] = PMOD0_5; + assign PMOD0_tri_i[6] = PMOD0_6; + assign PMOD0_tri_i[7] = PMOD0_7; + + assign PMOD0_0 = PMOD0_tri_z[0] ? 1'bz : PMOD0_tri_o[0]; + assign PMOD0_1 = PMOD0_tri_z[1] ? 1'bz : PMOD0_tri_o[1]; + assign PMOD0_2 = PMOD0_tri_z[2] ? 1'bz : PMOD0_tri_o[2]; + assign PMOD0_3 = PMOD0_tri_z[3] ? 1'bz : PMOD0_tri_o[3]; + assign PMOD0_4 = PMOD0_tri_z[4] ? 1'bz : PMOD0_tri_o[4]; + assign PMOD0_5 = PMOD0_tri_z[5] ? 1'bz : PMOD0_tri_o[5]; + assign PMOD0_6 = PMOD0_tri_z[6] ? 1'bz : PMOD0_tri_o[6]; + assign PMOD0_7 = PMOD0_tri_z[7] ? 1'bz : PMOD0_tri_o[7]; + +// wire [7:0]PMOD1_tri_i; +// wire [7:0]PMOD1_tri_o; +// wire [7:0]PMOD1_tri_z; + +// assign PMOD1_tri_i[0] = PMOD1_0; +// assign PMOD1_tri_i[1] = PMOD1_1; +// assign PMOD1_tri_i[2] = PMOD1_2; +// assign PMOD1_tri_i[3] = PMOD1_3; +// assign PMOD1_tri_i[4] = PMOD1_4; +// assign PMOD1_tri_i[5] = PMOD1_5; +// assign PMOD1_tri_i[6] = PMOD1_6; +// assign PMOD1_tri_i[7] = PMOD1_7; + +// assign PMOD1_0 = PMOD1_tri_z[0] ? 1'bz : PMOD1_tri_o[0]; +// assign PMOD1_1 = PMOD1_tri_z[1] ? 1'bz : PMOD1_tri_o[1]; +// assign PMOD1_2 = PMOD1_tri_z[2] ? 1'bz : PMOD1_tri_o[2]; +// assign PMOD1_3 = PMOD1_tri_z[3] ? 1'bz : PMOD1_tri_o[3]; +// assign PMOD1_4 = PMOD1_tri_z[4] ? 1'bz : PMOD1_tri_o[4]; +// assign PMOD1_5 = PMOD1_tri_z[5] ? 1'bz : PMOD1_tri_o[5]; +// assign PMOD1_6 = PMOD1_tri_z[6] ? 1'bz : PMOD1_tri_o[6]; +// assign PMOD1_7 = PMOD1_tri_z[7] ? 1'bz : PMOD1_tri_o[7]; + + design_1 design_1_i + (.pmoda_tri_i(PMOD0_tri_i), + .pmoda_tri_o(PMOD0_tri_o), + .pmoda_tri_z(PMOD0_tri_z)//, +// .PMOD1_tri_i(PMOD1_tri_i), +// .PMOD1_tri_o(PMOD1_tri_o), +// .PMOD1_tri_z(PMOD1_tri_z), +// .dip_switch_4bits_tri_i(dip_switch_4bits_tri_i), +// .led_4bits_tri_o(led_4bits_tri_o) + ); +endmodule diff --git a/Cortex-M0/nanosoc/systems/mcu/fpga_imp/target_fpga_pynq_z2/fpga_pinmap.xdc b/Cortex-M0/nanosoc/systems/mcu/fpga_imp/target_fpga_pynq_z2/fpga_pinmap.xdc new file mode 100644 index 0000000..5599cd2 --- /dev/null +++ b/Cortex-M0/nanosoc/systems/mcu/fpga_imp/target_fpga_pynq_z2/fpga_pinmap.xdc @@ -0,0 +1,33 @@ +################################################################################## +## ## +## PZ2 PMODA XDC ## +## ## +################################################################################## + + +set_property IOSTANDARD LVCMOS33 [get_ports PMOD0_0] +set_property IOSTANDARD LVCMOS33 [get_ports PMOD0_1] +set_property IOSTANDARD LVCMOS33 [get_ports PMOD0_2] +set_property IOSTANDARD LVCMOS33 [get_ports PMOD0_3] +set_property IOSTANDARD LVCMOS33 [get_ports PMOD0_4] +set_property IOSTANDARD LVCMOS33 [get_ports PMOD0_5] +set_property IOSTANDARD LVCMOS33 [get_ports PMOD0_6] +set_property IOSTANDARD LVCMOS33 [get_ports PMOD0_7] + +set_property PACKAGE_PIN Y18 [get_ports PMOD0_0] +set_property PACKAGE_PIN Y19 [get_ports PMOD0_1] +set_property PACKAGE_PIN Y16 [get_ports PMOD0_2] +set_property PACKAGE_PIN Y17 [get_ports PMOD0_3] +set_property PACKAGE_PIN U18 [get_ports PMOD0_4] +set_property PACKAGE_PIN U19 [get_ports PMOD0_5] +set_property PACKAGE_PIN W18 [get_ports PMOD0_6] +set_property PACKAGE_PIN W19 [get_ports PMOD0_7] + +set_property PULLUP true [get_ports PMOD0_2] +set_property PULLDOWN true [get_ports PMOD0_3] +set_property PULLUP true [get_ports PMOD0_4] +set_property PULLUP true [get_ports PMOD0_5] +set_property PULLUP true [get_ports PMOD0_6] +set_property PULLUP true [get_ports PMOD0_7] + +set_property CLOCK_DEDICATED_ROUTE FALSE [get_nets PMOD0_7_IBUF] diff --git a/Cortex-M0/nanosoc/systems/mcu/fpga_imp/target_fpga_pynq_z2/fpga_synth.tcl b/Cortex-M0/nanosoc/systems/mcu/fpga_imp/target_fpga_pynq_z2/fpga_synth.tcl new file mode 100644 index 0000000..1a9e44e --- /dev/null +++ b/Cortex-M0/nanosoc/systems/mcu/fpga_imp/target_fpga_pynq_z2/fpga_synth.tcl @@ -0,0 +1 @@ +synth_design -top cmsdk_mcu_chip -part xc7z020clg400-1 diff --git a/Cortex-M0/nanosoc/systems/mcu/fpga_imp/target_fpga_pynq_z2/fpga_timing.xdc b/Cortex-M0/nanosoc/systems/mcu/fpga_imp/target_fpga_pynq_z2/fpga_timing.xdc new file mode 100644 index 0000000..879aaad --- /dev/null +++ b/Cortex-M0/nanosoc/systems/mcu/fpga_imp/target_fpga_pynq_z2/fpga_timing.xdc @@ -0,0 +1,95 @@ +################################################################################## +## ## +## ZYNQ timing XDC ## +## ## +################################################################################## + +create_clock -name CLK -period 30 [get_ports XTAL1] +create_clock -name VCLK -period 30 -waveform {5 20} + +create_clock -name SWCLK -period 60 [get_ports SWCLKTCK] +create_clock -name VSWCLK -period 60 -waveform {5 35} + +set_clock_groups -name async_clk_swclock -asynchronous \ +-group [get_clocks -include_generated_clocks CLK] \ +-group [get_clocks -include_generated_clocks VSWCLK] + +#set_input_delay -clock [get_clocks clk_pl_0] -min -add_delay 20.000 [get_ports {dip_switch_4bits_tri_i[*]}] +#set_input_delay -clock [get_clocks clk_pl_0] -max -add_delay 18.000 [get_ports {dip_switch_4bits_tri_i[*]}] +#set_input_delay -clock [get_clocks clk_pl_0] -min -add_delay 20.000 [get_ports PMOD0_2] +#set_input_delay -clock [get_clocks clk_pl_0] -max -add_delay 18.000 [get_ports PMOD0_2] +#set_input_delay -clock [get_clocks clk_pl_0] -min -add_delay 20.000 [get_ports PMOD0_3] +#set_input_delay -clock [get_clocks clk_pl_0] -max -add_delay 18.000 [get_ports PMOD0_3] +#set_output_delay -clock [get_clocks clk_pl_0] -min -add_delay 5.000 [get_ports {led_4bits_tri_o[*]}] +#set_output_delay -clock [get_clocks CLK] -max -add_delay 18.000 [get_ports {led_4bits_tri_o[*]}] + +set_output_delay -clock [get_clocks CLK] -min -add_delay 5.000 [get_ports {P0[0]}] +set_output_delay -clock [get_clocks CLK] -max -add_delay 18.000 [get_ports {P0[0]}] +set_output_delay -clock [get_clocks CLK] -min -add_delay 5.000 [get_ports {P0[1]}] +set_output_delay -clock [get_clocks CLK] -max -add_delay 18.000 [get_ports {P0[1]}] +set_output_delay -clock [get_clocks CLK] -min -add_delay 5.000 [get_ports {P0[2]}] +set_output_delay -clock [get_clocks CLK] -max -add_delay 18.000 [get_ports {P0[2]}] +set_output_delay -clock [get_clocks CLK] -min -add_delay 5.000 [get_ports {P0[3]}] +set_output_delay -clock [get_clocks CLK] -max -add_delay 18.000 [get_ports {P0[3]}] +set_output_delay -clock [get_clocks CLK] -min -add_delay 5.000 [get_ports {P0[4]}] +set_output_delay -clock [get_clocks CLK] -max -add_delay 18.000 [get_ports {P0[4]}] +set_output_delay -clock [get_clocks CLK] -min -add_delay 5.000 [get_ports {P0[5]}] +set_output_delay -clock [get_clocks CLK] -max -add_delay 18.000 [get_ports {P0[5]}] +set_output_delay -clock [get_clocks CLK] -min -add_delay 5.000 [get_ports {P0[6]}] +set_output_delay -clock [get_clocks CLK] -max -add_delay 18.000 [get_ports {P0[6]}] +set_output_delay -clock [get_clocks CLK] -min -add_delay 5.000 [get_ports {P0[7]}] +set_output_delay -clock [get_clocks CLK] -max -add_delay 18.000 [get_ports {P0[7]}] +set_output_delay -clock [get_clocks CLK] -min -add_delay 5.000 [get_ports {P0[8]}] +set_output_delay -clock [get_clocks CLK] -max -add_delay 18.000 [get_ports {P0[8]}] +set_output_delay -clock [get_clocks CLK] -min -add_delay 5.000 [get_ports {P0[9]}] +set_output_delay -clock [get_clocks CLK] -max -add_delay 18.000 [get_ports {P0[9]}] +set_output_delay -clock [get_clocks CLK] -min -add_delay 5.000 [get_ports {P0[10]}] +set_output_delay -clock [get_clocks CLK] -max -add_delay 18.000 [get_ports {P0[10]}] +set_output_delay -clock [get_clocks CLK] -min -add_delay 5.000 [get_ports {P0[11]}] +set_output_delay -clock [get_clocks CLK] -max -add_delay 18.000 [get_ports {P0[11]}] +set_output_delay -clock [get_clocks CLK] -min -add_delay 5.000 [get_ports {P0[12]}] +set_output_delay -clock [get_clocks CLK] -max -add_delay 18.000 [get_ports {P0[12]}] +set_output_delay -clock [get_clocks CLK] -min -add_delay 5.000 [get_ports {P0[13]}] +set_output_delay -clock [get_clocks CLK] -max -add_delay 18.000 [get_ports {P0[13]}] +set_output_delay -clock [get_clocks CLK] -min -add_delay 5.000 [get_ports {P0[14]}] +set_output_delay -clock [get_clocks CLK] -max -add_delay 18.000 [get_ports {P0[14]}] +set_output_delay -clock [get_clocks CLK] -min -add_delay 5.000 [get_ports {P0[15]}] +set_output_delay -clock [get_clocks CLK] -max -add_delay 18.000 [get_ports {P0[15]}] + +set_output_delay -clock [get_clocks CLK] -min -add_delay 5.000 [get_ports {P1[0]}] +set_output_delay -clock [get_clocks CLK] -max -add_delay 18.000 [get_ports {P1[0]}] +set_output_delay -clock [get_clocks CLK] -min -add_delay 5.000 [get_ports {P1[1]}] +set_output_delay -clock [get_clocks CLK] -max -add_delay 18.000 [get_ports {P1[1]}] +set_output_delay -clock [get_clocks CLK] -min -add_delay 5.000 [get_ports {P1[2]}] +set_output_delay -clock [get_clocks CLK] -max -add_delay 18.000 [get_ports {P1[2]}] +set_output_delay -clock [get_clocks CLK] -min -add_delay 5.000 [get_ports {P1[3]}] +set_output_delay -clock [get_clocks CLK] -max -add_delay 18.000 [get_ports {P1[3]}] +set_output_delay -clock [get_clocks CLK] -min -add_delay 5.000 [get_ports {P1[4]}] +set_output_delay -clock [get_clocks CLK] -max -add_delay 18.000 [get_ports {P1[4]}] +set_output_delay -clock [get_clocks CLK] -min -add_delay 5.000 [get_ports {P1[5]}] +set_output_delay -clock [get_clocks CLK] -max -add_delay 18.000 [get_ports {P1[5]}] +set_output_delay -clock [get_clocks CLK] -min -add_delay 5.000 [get_ports {P1[6]}] +set_output_delay -clock [get_clocks CLK] -max -add_delay 18.000 [get_ports {P1[6]}] +set_output_delay -clock [get_clocks CLK] -min -add_delay 5.000 [get_ports {P1[7]}] +set_output_delay -clock [get_clocks CLK] -max -add_delay 18.000 [get_ports {P1[7]}] +set_output_delay -clock [get_clocks CLK] -min -add_delay 5.000 [get_ports {P1[8]}] +set_output_delay -clock [get_clocks CLK] -max -add_delay 18.000 [get_ports {P1[8]}] +set_output_delay -clock [get_clocks CLK] -min -add_delay 5.000 [get_ports {P1[9]}] +set_output_delay -clock [get_clocks CLK] -max -add_delay 18.000 [get_ports {P1[9]}] +set_output_delay -clock [get_clocks CLK] -min -add_delay 5.000 [get_ports {P1[10]}] +set_output_delay -clock [get_clocks CLK] -max -add_delay 18.000 [get_ports {P1[10]}] +set_output_delay -clock [get_clocks CLK] -min -add_delay 5.000 [get_ports {P1[11]}] +set_output_delay -clock [get_clocks CLK] -max -add_delay 18.000 [get_ports {P1[11]}] +set_output_delay -clock [get_clocks CLK] -min -add_delay 5.000 [get_ports {P1[12]}] +set_output_delay -clock [get_clocks CLK] -max -add_delay 18.000 [get_ports {P1[12]}] +set_output_delay -clock [get_clocks CLK] -min -add_delay 5.000 [get_ports {P1[13]}] +set_output_delay -clock [get_clocks CLK] -max -add_delay 18.000 [get_ports {P1[13]}] +set_output_delay -clock [get_clocks CLK] -min -add_delay 5.000 [get_ports {P1[14]}] +set_output_delay -clock [get_clocks CLK] -max -add_delay 18.000 [get_ports {P1[14]}] +set_output_delay -clock [get_clocks CLK] -min -add_delay 5.000 [get_ports {P1[15]}] +set_output_delay -clock [get_clocks CLK] -max -add_delay 18.000 [get_ports {P1[15]}] + +#set_property C_CLK_INPUT_FREQ_HZ 5000000 [get_debug_cores dbg_hub] +#set_property C_ENABLE_CLK_DIVIDER false [get_debug_cores dbg_hub] +#set_property C_USER_SCAN_CHAIN 1 [get_debug_cores dbg_hub] +#connect_debug_port dbg_hub/clk [get_nets clk] diff --git a/Cortex-M0/nanosoc/systems/mcu/fpga_imp/target_fpga_zcu104/design_1.tcl b/Cortex-M0/nanosoc/systems/mcu/fpga_imp/target_fpga_zcu104/design_1.tcl new file mode 100644 index 0000000..4859c7b --- /dev/null +++ b/Cortex-M0/nanosoc/systems/mcu/fpga_imp/target_fpga_zcu104/design_1.tcl @@ -0,0 +1,1017 @@ + +################################################################ +# This is a generated script based on design: design_1 +# +# Though there are limitations about the generated script, +# the main purpose of this utility is to make learning +# IP Integrator Tcl commands easier. +################################################################ + +namespace eval _tcl { +proc get_script_folder {} { + set script_path [file normalize [info script]] + set script_folder [file dirname $script_path] + return $script_folder +} +} +variable script_folder +set script_folder [_tcl::get_script_folder] + +################################################################ +# Check if script is running in correct Vivado version. +################################################################ +set scripts_vivado_version 2021.1 +set current_vivado_version [version -short] + +if { [string first $scripts_vivado_version $current_vivado_version] == -1 } { + puts "" + catch {common::send_gid_msg -ssname BD::TCL -id 2041 -severity "ERROR" "This script was generated using Vivado <$scripts_vivado_version> and is being run in <$current_vivado_version> of Vivado. Please run the script in Vivado <$scripts_vivado_version> then open the design in Vivado <$current_vivado_version>. Upgrade the design by running \"Tools => Report => Report IP Status...\", then run write_bd_tcl to create an updated script."} + + return 1 +} + +################################################################ +# START +################################################################ + +# To test this script, run the following commands from Vivado Tcl console: +# source design_1_script.tcl + +set bCheckIPsPassed 1 +################################################################## +# CHECK IPs +################################################################## +set bCheckIPs 1 +if { $bCheckIPs == 1 } { + set list_check_ips "\ +soclabs.org:user:nanosoc_chip:1.0\ +xilinx.com:ip:zynq_ultra_ps_e:3.3\ +xilinx.com:ip:axi_gpio:2.0\ +xilinx.com:ip:axi_uartlite:2.0\ +xilinx.com:ip:xlslice:1.0\ +xilinx.com:ip:xlconcat:2.1\ +xilinx.com:ip:proc_sys_reset:5.0\ +xilinx.com:ip:smartconnect:1.0\ +xilinx.com:ip:xlconstant:1.1\ +" + + set list_ips_missing "" + common::send_gid_msg -ssname BD::TCL -id 2011 -severity "INFO" "Checking if the following IPs exist in the project's IP catalog: $list_check_ips ." + + foreach ip_vlnv $list_check_ips { + set ip_obj [get_ipdefs -all $ip_vlnv] + if { $ip_obj eq "" } { + lappend list_ips_missing $ip_vlnv + } + } + + if { $list_ips_missing ne "" } { + catch {common::send_gid_msg -ssname BD::TCL -id 2012 -severity "ERROR" "The following IPs are not found in the IP Catalog:\n $list_ips_missing\n\nResolution: Please add the repository containing the IP(s) to the project." } + set bCheckIPsPassed 0 + } + +} + +if { $bCheckIPsPassed != 1 } { + common::send_gid_msg -ssname BD::TCL -id 2023 -severity "WARNING" "Will not continue with creation of design due to the error(s) above." + return 3 +} + +################################################################## +# DESIGN PROCs +################################################################## + + +# Hierarchical cell: cmsdk_socket +proc create_hier_cell_cmsdk_socket { parentCell nameHier } { + + variable script_folder + + if { $parentCell eq "" || $nameHier eq "" } { + catch {common::send_gid_msg -ssname BD::TCL -id 2092 -severity "ERROR" "create_hier_cell_cmsdk_socket() - Empty argument(s)!"} + return + } + + # Get object for parentCell + set parentObj [get_bd_cells $parentCell] + if { $parentObj == "" } { + catch {common::send_gid_msg -ssname BD::TCL -id 2090 -severity "ERROR" "Unable to find parent cell <$parentCell>!"} + return + } + + # Make sure parentObj is hier blk + set parentType [get_property TYPE $parentObj] + if { $parentType ne "hier" } { + catch {common::send_gid_msg -ssname BD::TCL -id 2091 -severity "ERROR" "Parent <$parentObj> has TYPE = <$parentType>. Expected to be <hier>."} + return + } + + # Save current instance; Restore later + set oldCurInst [current_bd_instance .] + + # Set parent object as current + current_bd_instance $parentObj + + # Create cell and set as current instance + set hier_obj [create_bd_cell -type hier $nameHier] + current_bd_instance $hier_obj + + # Create interface pins + create_bd_intf_pin -mode Slave -vlnv xilinx.com:interface:aximm_rtl:1.0 S00_AXI + + + # Create pins + create_bd_pin -dir I -type clk aclk + create_bd_pin -dir I -type rst ext_reset_in + create_bd_pin -dir O -from 15 -to 0 gpio2_tri_o + create_bd_pin -dir I -from 15 -to 0 gpio2_tri_z + create_bd_pin -dir O -from 15 -to 0 gpio_tri_i + create_bd_pin -dir I -from 15 -to 0 gpio_tri_o + create_bd_pin -dir O -from 0 -to 0 -type rst nrst + create_bd_pin -dir O -from 15 -to 0 p0_tri_i + create_bd_pin -dir I -from 15 -to 0 p0_tri_o + create_bd_pin -dir I -from 15 -to 0 p0_tri_z + create_bd_pin -dir O -from 15 -to 0 p1_tri_i + create_bd_pin -dir I -from 15 -to 0 p1_tri_o + create_bd_pin -dir I -from 15 -to 0 p1_tri_z + create_bd_pin -dir I -from 7 -to 0 pmoda_tri_i + create_bd_pin -dir O -from 7 -to 0 pmoda_tri_o + create_bd_pin -dir O -from 7 -to 0 pmoda_tri_z + + # Create instance: axi_gpio_0, and set properties + set axi_gpio_0 [ create_bd_cell -type ip -vlnv xilinx.com:ip:axi_gpio:2.0 axi_gpio_0 ] + set_property -dict [ list \ + CONFIG.C_GPIO2_WIDTH {16} \ + CONFIG.C_GPIO_WIDTH {16} \ + CONFIG.C_IS_DUAL {1} \ + ] $axi_gpio_0 + + # Create instance: axi_gpio_1, and set properties + set axi_gpio_1 [ create_bd_cell -type ip -vlnv xilinx.com:ip:axi_gpio:2.0 axi_gpio_1 ] + set_property -dict [ list \ + CONFIG.C_GPIO2_WIDTH {16} \ + CONFIG.C_GPIO_WIDTH {16} \ + CONFIG.C_IS_DUAL {1} \ + ] $axi_gpio_1 + + # Create instance: axi_gpio_2, and set properties + set axi_gpio_2 [ create_bd_cell -type ip -vlnv xilinx.com:ip:axi_gpio:2.0 axi_gpio_2 ] + set_property -dict [ list \ + CONFIG.C_GPIO2_WIDTH {16} \ + CONFIG.C_GPIO_WIDTH {16} \ + CONFIG.C_IS_DUAL {1} \ + ] $axi_gpio_2 + + # Create instance: axi_uartlite_0, and set properties + set axi_uartlite_0 [ create_bd_cell -type ip -vlnv xilinx.com:ip:axi_uartlite:2.0 axi_uartlite_0 ] + + # Create instance: p1_i_bit15to6, and set properties + set p1_i_bit15to6 [ create_bd_cell -type ip -vlnv xilinx.com:ip:xlslice:1.0 p1_i_bit15to6 ] + set_property -dict [ list \ + CONFIG.DIN_FROM {15} \ + CONFIG.DIN_TO {6} \ + CONFIG.DIN_WIDTH {16} \ + CONFIG.DOUT_WIDTH {10} \ + ] $p1_i_bit15to6 + + # Create instance: p1_i_concat, and set properties + set p1_i_concat [ create_bd_cell -type ip -vlnv xilinx.com:ip:xlconcat:2.1 p1_i_concat ] + set_property -dict [ list \ + CONFIG.IN0_WIDTH {1} \ + CONFIG.IN1_WIDTH {1} \ + CONFIG.IN2_WIDTH {1} \ + CONFIG.IN3_WIDTH {1} \ + CONFIG.IN4_WIDTH {1} \ + CONFIG.IN5_WIDTH {1} \ + CONFIG.IN6_WIDTH {10} \ + CONFIG.NUM_PORTS {7} \ + ] $p1_i_concat + + # Create instance: p1_o_bit1, and set properties + set p1_o_bit1 [ create_bd_cell -type ip -vlnv xilinx.com:ip:xlslice:1.0 p1_o_bit1 ] + set_property -dict [ list \ + CONFIG.DIN_FROM {1} \ + CONFIG.DIN_TO {1} \ + CONFIG.DIN_WIDTH {16} \ + CONFIG.DOUT_WIDTH {1} \ + ] $p1_o_bit1 + + # Create instance: p1_o_bit15to6, and set properties + set p1_o_bit15to6 [ create_bd_cell -type ip -vlnv xilinx.com:ip:xlslice:1.0 p1_o_bit15to6 ] + set_property -dict [ list \ + CONFIG.DIN_FROM {15} \ + CONFIG.DIN_TO {6} \ + CONFIG.DIN_WIDTH {16} \ + CONFIG.DOUT_WIDTH {10} \ + ] $p1_o_bit15to6 + + # Create instance: p1_o_bit2, and set properties + set p1_o_bit2 [ create_bd_cell -type ip -vlnv xilinx.com:ip:xlslice:1.0 p1_o_bit2 ] + set_property -dict [ list \ + CONFIG.DIN_FROM {2} \ + CONFIG.DIN_TO {2} \ + CONFIG.DIN_WIDTH {16} \ + CONFIG.DOUT_WIDTH {1} \ + ] $p1_o_bit2 + + # Create instance: p1_o_bit3, and set properties + set p1_o_bit3 [ create_bd_cell -type ip -vlnv xilinx.com:ip:xlslice:1.0 p1_o_bit3 ] + set_property -dict [ list \ + CONFIG.DIN_FROM {3} \ + CONFIG.DIN_TO {3} \ + CONFIG.DIN_WIDTH {16} \ + CONFIG.DOUT_WIDTH {1} \ + ] $p1_o_bit3 + + # Create instance: p1_o_bit5, and set properties + set p1_o_bit5 [ create_bd_cell -type ip -vlnv xilinx.com:ip:xlslice:1.0 p1_o_bit5 ] + set_property -dict [ list \ + CONFIG.DIN_FROM {5} \ + CONFIG.DIN_TO {5} \ + CONFIG.DIN_WIDTH {16} \ + CONFIG.DOUT_WIDTH {1} \ + ] $p1_o_bit5 + + # Create instance: p1_z_bit2, and set properties + set p1_z_bit2 [ create_bd_cell -type ip -vlnv xilinx.com:ip:xlslice:1.0 p1_z_bit2 ] + set_property -dict [ list \ + CONFIG.DIN_FROM {2} \ + CONFIG.DIN_TO {2} \ + CONFIG.DIN_WIDTH {16} \ + CONFIG.DOUT_WIDTH {1} \ + ] $p1_z_bit2 + + # Create instance: pmoda_i_bit2, and set properties + set pmoda_i_bit2 [ create_bd_cell -type ip -vlnv xilinx.com:ip:xlslice:1.0 pmoda_i_bit2 ] + set_property -dict [ list \ + CONFIG.DIN_FROM {2} \ + CONFIG.DIN_TO {2} \ + CONFIG.DIN_WIDTH {8} \ + CONFIG.DOUT_WIDTH {1} \ + ] $pmoda_i_bit2 + + # Create instance: pmoda_i_bit3, and set properties + set pmoda_i_bit3 [ create_bd_cell -type ip -vlnv xilinx.com:ip:xlslice:1.0 pmoda_i_bit3 ] + set_property -dict [ list \ + CONFIG.DIN_FROM {3} \ + CONFIG.DIN_TO {3} \ + CONFIG.DIN_WIDTH {8} \ + CONFIG.DOUT_WIDTH {1} \ + ] $pmoda_i_bit3 + + # Create instance: pmoda_o_concat8, and set properties + set pmoda_o_concat8 [ create_bd_cell -type ip -vlnv xilinx.com:ip:xlconcat:2.1 pmoda_o_concat8 ] + set_property -dict [ list \ + CONFIG.NUM_PORTS {8} \ + ] $pmoda_o_concat8 + + # Create instance: pmoda_z_concat8, and set properties + set pmoda_z_concat8 [ create_bd_cell -type ip -vlnv xilinx.com:ip:xlconcat:2.1 pmoda_z_concat8 ] + set_property -dict [ list \ + CONFIG.NUM_PORTS {8} \ + ] $pmoda_z_concat8 + + # Create instance: proc_sys_reset_0, and set properties + set proc_sys_reset_0 [ create_bd_cell -type ip -vlnv xilinx.com:ip:proc_sys_reset:5.0 proc_sys_reset_0 ] + + # Create instance: smartconnect_0, and set properties + set smartconnect_0 [ create_bd_cell -type ip -vlnv xilinx.com:ip:smartconnect:1.0 smartconnect_0 ] + set_property -dict [ list \ + CONFIG.NUM_MI {4} \ + CONFIG.NUM_SI {1} \ + ] $smartconnect_0 + + # Create instance: xlconstant_0, and set properties + set xlconstant_0 [ create_bd_cell -type ip -vlnv xilinx.com:ip:xlconstant:1.1 xlconstant_0 ] + set_property -dict [ list \ + CONFIG.CONST_VAL {0} \ + ] $xlconstant_0 + + # Create instance: xlconstant_1, and set properties + set xlconstant_1 [ create_bd_cell -type ip -vlnv xilinx.com:ip:xlconstant:1.1 xlconstant_1 ] + + # Create interface connections + connect_bd_intf_net -intf_net smartconnect_0_M00_AXI [get_bd_intf_pins axi_gpio_0/S_AXI] [get_bd_intf_pins smartconnect_0/M00_AXI] + connect_bd_intf_net -intf_net smartconnect_0_M01_AXI [get_bd_intf_pins axi_gpio_1/S_AXI] [get_bd_intf_pins smartconnect_0/M01_AXI] + connect_bd_intf_net -intf_net smartconnect_0_M02_AXI [get_bd_intf_pins axi_gpio_2/S_AXI] [get_bd_intf_pins smartconnect_0/M02_AXI] + connect_bd_intf_net -intf_net smartconnect_0_M03_AXI [get_bd_intf_pins axi_uartlite_0/S_AXI] [get_bd_intf_pins smartconnect_0/M03_AXI] + connect_bd_intf_net -intf_net zynq_ultra_ps_e_0_M_AXI_HPM0_LPD [get_bd_intf_pins S00_AXI] [get_bd_intf_pins smartconnect_0/S00_AXI] + + # Create port connections + connect_bd_net -net UART2_TXD [get_bd_pins axi_uartlite_0/rx] [get_bd_pins p1_o_bit5/Dout] + connect_bd_net -net axi_gpio_0_gpio_io_o [get_bd_pins p0_tri_i] [get_bd_pins axi_gpio_0/gpio_io_o] + connect_bd_net -net axi_gpio_1_gpio_io_o [get_bd_pins axi_gpio_1/gpio_io_o] [get_bd_pins p1_i_bit15to6/Din] + connect_bd_net -net axi_gpio_2_gpio2_io_o [get_bd_pins gpio2_tri_o] [get_bd_pins axi_gpio_2/gpio2_io_o] + connect_bd_net -net axi_gpio_2_gpio_io_o [get_bd_pins gpio_tri_i] [get_bd_pins axi_gpio_2/gpio_io_o] + connect_bd_net -net axi_uartlite_0_tx [get_bd_pins axi_uartlite_0/tx] [get_bd_pins p1_i_concat/In4] + connect_bd_net -net nanosoc_chip_0_p0_o [get_bd_pins p0_tri_o] [get_bd_pins axi_gpio_0/gpio_io_i] + connect_bd_net -net nanosoc_chip_0_p0_z [get_bd_pins p0_tri_z] [get_bd_pins axi_gpio_0/gpio2_io_i] + connect_bd_net -net nanosoc_chip_0_p1_o [get_bd_pins p1_tri_o] [get_bd_pins axi_gpio_1/gpio_io_i] [get_bd_pins p1_o_bit1/Din] [get_bd_pins p1_o_bit15to6/Din] [get_bd_pins p1_o_bit2/Din] [get_bd_pins p1_o_bit3/Din] [get_bd_pins p1_o_bit5/Din] + connect_bd_net -net nanosoc_chip_0_swdio_o [get_bd_pins gpio_tri_o] [get_bd_pins axi_gpio_2/gpio_io_i] + connect_bd_net -net nanosoc_chip_0_swdio_z [get_bd_pins gpio2_tri_z] [get_bd_pins axi_gpio_2/gpio2_io_i] + connect_bd_net -net const0 [get_bd_pins p1_i_concat/In1] [get_bd_pins p1_i_concat/In3] [get_bd_pins p1_i_concat/In5] [get_bd_pins pmoda_o_concat8/In2] [get_bd_pins pmoda_o_concat8/In4] [get_bd_pins pmoda_o_concat8/In5] [get_bd_pins pmoda_o_concat8/In6] [get_bd_pins pmoda_o_concat8/In7] [get_bd_pins pmoda_z_concat8/In0] [get_bd_pins pmoda_z_concat8/In1] [get_bd_pins xlconstant_0/dout] + connect_bd_net -net const1 [get_bd_pins pmoda_z_concat8/In2] [get_bd_pins pmoda_z_concat8/In4] [get_bd_pins pmoda_z_concat8/In5] [get_bd_pins pmoda_z_concat8/In6] [get_bd_pins pmoda_z_concat8/In7] [get_bd_pins xlconstant_1/dout] + connect_bd_net -net ftclk_o [get_bd_pins p1_o_bit1/Dout] [get_bd_pins pmoda_o_concat8/In0] + connect_bd_net -net ftmiosio_o [get_bd_pins p1_o_bit2/Dout] [get_bd_pins pmoda_o_concat8/In3] + connect_bd_net -net ftmiosio_z [get_bd_pins p1_z_bit2/Dout] [get_bd_pins pmoda_z_concat8/In3] + connect_bd_net -net ftssn_n [get_bd_pins p1_o_bit3/Dout] [get_bd_pins pmoda_o_concat8/In1] + connect_bd_net -net p1_i [get_bd_pins p1_tri_i] [get_bd_pins p1_i_concat/dout] + connect_bd_net -net p1_i_bit15to6_Dout [get_bd_pins p1_i_bit15to6/Dout] [get_bd_pins p1_i_concat/In6] + connect_bd_net -net p1_z [get_bd_pins p1_tri_z] [get_bd_pins axi_gpio_1/gpio2_io_i] [get_bd_pins p1_z_bit2/Din] + connect_bd_net -net pmoda_i_1 [get_bd_pins pmoda_tri_i] [get_bd_pins pmoda_i_bit2/Din] [get_bd_pins pmoda_i_bit3/Din] + connect_bd_net -net pmoda_i_bit2_Dout [get_bd_pins p1_i_concat/In0] [get_bd_pins pmoda_i_bit2/Dout] + connect_bd_net -net pmoda_i_bit3_Dout [get_bd_pins p1_i_concat/In2] [get_bd_pins pmoda_i_bit3/Dout] + connect_bd_net -net pmoda_o_concat9_dout [get_bd_pins pmoda_tri_z] [get_bd_pins pmoda_z_concat8/dout] + connect_bd_net -net proc_sys_reset_0_interconnect_aresetn [get_bd_pins axi_gpio_0/s_axi_aresetn] [get_bd_pins axi_gpio_1/s_axi_aresetn] [get_bd_pins axi_gpio_2/s_axi_aresetn] [get_bd_pins axi_uartlite_0/s_axi_aresetn] [get_bd_pins proc_sys_reset_0/interconnect_aresetn] [get_bd_pins smartconnect_0/aresetn] + connect_bd_net -net proc_sys_reset_0_peripheral_aresetn [get_bd_pins nrst] [get_bd_pins proc_sys_reset_0/peripheral_aresetn] + connect_bd_net -net xlconcat_0_dout [get_bd_pins pmoda_tri_o] [get_bd_pins pmoda_o_concat8/dout] + connect_bd_net -net zynq_ultra_ps_e_0_pl_clk0 [get_bd_pins aclk] [get_bd_pins axi_gpio_0/s_axi_aclk] [get_bd_pins axi_gpio_1/s_axi_aclk] [get_bd_pins axi_gpio_2/s_axi_aclk] [get_bd_pins axi_uartlite_0/s_axi_aclk] [get_bd_pins proc_sys_reset_0/slowest_sync_clk] [get_bd_pins smartconnect_0/aclk] + connect_bd_net -net zynq_ultra_ps_e_0_pl_resetn0 [get_bd_pins ext_reset_in] [get_bd_pins proc_sys_reset_0/ext_reset_in] + + # Restore current instance + current_bd_instance $oldCurInst +} + + +# Procedure to create entire design; Provide argument to make +# procedure reusable. If parentCell is "", will use root. +proc create_root_design { parentCell } { + + variable script_folder + + if { $parentCell eq "" } { + set parentCell [get_bd_cells /] + } + + # Get object for parentCell + set parentObj [get_bd_cells $parentCell] + if { $parentObj == "" } { + catch {common::send_gid_msg -ssname BD::TCL -id 2090 -severity "ERROR" "Unable to find parent cell <$parentCell>!"} + return + } + + # Make sure parentObj is hier blk + set parentType [get_property TYPE $parentObj] + if { $parentType ne "hier" } { + catch {common::send_gid_msg -ssname BD::TCL -id 2091 -severity "ERROR" "Parent <$parentObj> has TYPE = <$parentType>. Expected to be <hier>."} + return + } + + # Save current instance; Restore later + set oldCurInst [current_bd_instance .] + + # Set parent object as current + current_bd_instance $parentObj + + + # Create interface ports + + # Create ports + set pmoda_tri_i [ create_bd_port -dir I -from 7 -to 0 pmoda_tri_i ] + set pmoda_tri_o [ create_bd_port -dir O -from 7 -to 0 pmoda_tri_o ] + set pmoda_tri_z [ create_bd_port -dir O -from 7 -to 0 pmoda_tri_z ] + + # Create instance: nanosoc_chip_0, and set properties + set nanosoc_chip_0 [ create_bd_cell -type ip -vlnv soclabs.org:user:nanosoc_chip:1.0 nanosoc_chip_0 ] + + # Create instance: cmsdk_socket + create_hier_cell_cmsdk_socket [current_bd_instance .] cmsdk_socket + + # Create instance: zynq_ultra_ps_e_0, and set properties + set zynq_ultra_ps_e_0 [ create_bd_cell -type ip -vlnv xilinx.com:ip:zynq_ultra_ps_e:3.3 zynq_ultra_ps_e_0 ] + set_property -dict [ list \ + CONFIG.PSU_BANK_0_IO_STANDARD {LVCMOS18} \ + CONFIG.PSU_BANK_1_IO_STANDARD {LVCMOS18} \ + CONFIG.PSU_BANK_2_IO_STANDARD {LVCMOS18} \ + CONFIG.PSU_DDR_RAM_HIGHADDR {0x7FFFFFFF} \ + CONFIG.PSU_DDR_RAM_HIGHADDR_OFFSET {0x00000002} \ + CONFIG.PSU_DDR_RAM_LOWADDR_OFFSET {0x80000000} \ + CONFIG.PSU_DYNAMIC_DDR_CONFIG_EN {0} \ + CONFIG.PSU_MIO_0_DIRECTION {out} \ + CONFIG.PSU_MIO_0_INPUT_TYPE {cmos} \ + CONFIG.PSU_MIO_0_POLARITY {Default} \ + CONFIG.PSU_MIO_16_DIRECTION {inout} \ + CONFIG.PSU_MIO_16_POLARITY {Default} \ + CONFIG.PSU_MIO_17_DIRECTION {inout} \ + CONFIG.PSU_MIO_17_POLARITY {Default} \ + CONFIG.PSU_MIO_18_DIRECTION {in} \ + CONFIG.PSU_MIO_18_DRIVE_STRENGTH {12} \ + CONFIG.PSU_MIO_18_POLARITY {Default} \ + CONFIG.PSU_MIO_18_SLEW {fast} \ + CONFIG.PSU_MIO_19_DIRECTION {out} \ + CONFIG.PSU_MIO_19_INPUT_TYPE {cmos} \ + CONFIG.PSU_MIO_19_POLARITY {Default} \ + CONFIG.PSU_MIO_1_DIRECTION {inout} \ + CONFIG.PSU_MIO_1_POLARITY {Default} \ + CONFIG.PSU_MIO_20_DIRECTION {out} \ + CONFIG.PSU_MIO_20_INPUT_TYPE {cmos} \ + CONFIG.PSU_MIO_20_POLARITY {Default} \ + CONFIG.PSU_MIO_21_DIRECTION {in} \ + CONFIG.PSU_MIO_21_DRIVE_STRENGTH {12} \ + CONFIG.PSU_MIO_21_POLARITY {Default} \ + CONFIG.PSU_MIO_21_SLEW {fast} \ + CONFIG.PSU_MIO_24_DIRECTION {out} \ + CONFIG.PSU_MIO_24_INPUT_TYPE {cmos} \ + CONFIG.PSU_MIO_24_POLARITY {Default} \ + CONFIG.PSU_MIO_25_DIRECTION {in} \ + CONFIG.PSU_MIO_25_DRIVE_STRENGTH {12} \ + CONFIG.PSU_MIO_25_POLARITY {Default} \ + CONFIG.PSU_MIO_25_SLEW {fast} \ + CONFIG.PSU_MIO_27_DIRECTION {out} \ + CONFIG.PSU_MIO_27_INPUT_TYPE {cmos} \ + CONFIG.PSU_MIO_27_POLARITY {Default} \ + CONFIG.PSU_MIO_28_DIRECTION {in} \ + CONFIG.PSU_MIO_28_DRIVE_STRENGTH {12} \ + CONFIG.PSU_MIO_28_POLARITY {Default} \ + CONFIG.PSU_MIO_28_SLEW {fast} \ + CONFIG.PSU_MIO_29_DIRECTION {out} \ + CONFIG.PSU_MIO_29_INPUT_TYPE {cmos} \ + CONFIG.PSU_MIO_29_POLARITY {Default} \ + CONFIG.PSU_MIO_2_DIRECTION {inout} \ + CONFIG.PSU_MIO_2_POLARITY {Default} \ + CONFIG.PSU_MIO_30_DIRECTION {in} \ + CONFIG.PSU_MIO_30_DRIVE_STRENGTH {12} \ + CONFIG.PSU_MIO_30_POLARITY {Default} \ + CONFIG.PSU_MIO_30_SLEW {fast} \ + CONFIG.PSU_MIO_3_DIRECTION {inout} \ + CONFIG.PSU_MIO_3_POLARITY {Default} \ + CONFIG.PSU_MIO_45_DIRECTION {in} \ + CONFIG.PSU_MIO_45_DRIVE_STRENGTH {12} \ + CONFIG.PSU_MIO_45_POLARITY {Default} \ + CONFIG.PSU_MIO_45_SLEW {fast} \ + CONFIG.PSU_MIO_46_DIRECTION {inout} \ + CONFIG.PSU_MIO_46_POLARITY {Default} \ + CONFIG.PSU_MIO_47_DIRECTION {inout} \ + CONFIG.PSU_MIO_47_POLARITY {Default} \ + CONFIG.PSU_MIO_48_DIRECTION {inout} \ + CONFIG.PSU_MIO_48_POLARITY {Default} \ + CONFIG.PSU_MIO_49_DIRECTION {inout} \ + CONFIG.PSU_MIO_49_POLARITY {Default} \ + CONFIG.PSU_MIO_4_DIRECTION {inout} \ + CONFIG.PSU_MIO_4_POLARITY {Default} \ + CONFIG.PSU_MIO_50_DIRECTION {inout} \ + CONFIG.PSU_MIO_50_POLARITY {Default} \ + CONFIG.PSU_MIO_51_DIRECTION {out} \ + CONFIG.PSU_MIO_51_INPUT_TYPE {cmos} \ + CONFIG.PSU_MIO_51_POLARITY {Default} \ + CONFIG.PSU_MIO_52_DIRECTION {in} \ + CONFIG.PSU_MIO_52_DRIVE_STRENGTH {12} \ + CONFIG.PSU_MIO_52_POLARITY {Default} \ + CONFIG.PSU_MIO_52_SLEW {fast} \ + CONFIG.PSU_MIO_53_DIRECTION {in} \ + CONFIG.PSU_MIO_53_DRIVE_STRENGTH {12} \ + CONFIG.PSU_MIO_53_POLARITY {Default} \ + CONFIG.PSU_MIO_53_SLEW {fast} \ + CONFIG.PSU_MIO_54_DIRECTION {inout} \ + CONFIG.PSU_MIO_54_POLARITY {Default} \ + CONFIG.PSU_MIO_55_DIRECTION {in} \ + CONFIG.PSU_MIO_55_DRIVE_STRENGTH {12} \ + CONFIG.PSU_MIO_55_POLARITY {Default} \ + CONFIG.PSU_MIO_55_SLEW {fast} \ + CONFIG.PSU_MIO_56_DIRECTION {inout} \ + CONFIG.PSU_MIO_56_POLARITY {Default} \ + CONFIG.PSU_MIO_57_DIRECTION {inout} \ + CONFIG.PSU_MIO_57_POLARITY {Default} \ + CONFIG.PSU_MIO_58_DIRECTION {out} \ + CONFIG.PSU_MIO_58_INPUT_TYPE {cmos} \ + CONFIG.PSU_MIO_58_POLARITY {Default} \ + CONFIG.PSU_MIO_59_DIRECTION {inout} \ + CONFIG.PSU_MIO_59_POLARITY {Default} \ + CONFIG.PSU_MIO_5_DIRECTION {out} \ + CONFIG.PSU_MIO_5_INPUT_TYPE {cmos} \ + CONFIG.PSU_MIO_5_POLARITY {Default} \ + CONFIG.PSU_MIO_60_DIRECTION {inout} \ + CONFIG.PSU_MIO_60_POLARITY {Default} \ + CONFIG.PSU_MIO_61_DIRECTION {inout} \ + CONFIG.PSU_MIO_61_POLARITY {Default} \ + CONFIG.PSU_MIO_62_DIRECTION {inout} \ + CONFIG.PSU_MIO_62_POLARITY {Default} \ + CONFIG.PSU_MIO_63_DIRECTION {inout} \ + CONFIG.PSU_MIO_63_POLARITY {Default} \ + CONFIG.PSU_MIO_64_DIRECTION {out} \ + CONFIG.PSU_MIO_64_INPUT_TYPE {cmos} \ + CONFIG.PSU_MIO_64_POLARITY {Default} \ + CONFIG.PSU_MIO_65_DIRECTION {out} \ + CONFIG.PSU_MIO_65_INPUT_TYPE {cmos} \ + CONFIG.PSU_MIO_65_POLARITY {Default} \ + CONFIG.PSU_MIO_66_DIRECTION {out} \ + CONFIG.PSU_MIO_66_INPUT_TYPE {cmos} \ + CONFIG.PSU_MIO_66_POLARITY {Default} \ + CONFIG.PSU_MIO_67_DIRECTION {out} \ + CONFIG.PSU_MIO_67_INPUT_TYPE {cmos} \ + CONFIG.PSU_MIO_67_POLARITY {Default} \ + CONFIG.PSU_MIO_68_DIRECTION {out} \ + CONFIG.PSU_MIO_68_INPUT_TYPE {cmos} \ + CONFIG.PSU_MIO_68_POLARITY {Default} \ + CONFIG.PSU_MIO_69_DIRECTION {out} \ + CONFIG.PSU_MIO_69_INPUT_TYPE {cmos} \ + CONFIG.PSU_MIO_69_POLARITY {Default} \ + CONFIG.PSU_MIO_6_DIRECTION {out} \ + CONFIG.PSU_MIO_6_INPUT_TYPE {cmos} \ + CONFIG.PSU_MIO_6_POLARITY {Default} \ + CONFIG.PSU_MIO_70_DIRECTION {in} \ + CONFIG.PSU_MIO_70_DRIVE_STRENGTH {12} \ + CONFIG.PSU_MIO_70_POLARITY {Default} \ + CONFIG.PSU_MIO_70_SLEW {fast} \ + CONFIG.PSU_MIO_71_DIRECTION {in} \ + CONFIG.PSU_MIO_71_DRIVE_STRENGTH {12} \ + CONFIG.PSU_MIO_71_POLARITY {Default} \ + CONFIG.PSU_MIO_71_SLEW {fast} \ + CONFIG.PSU_MIO_72_DIRECTION {in} \ + CONFIG.PSU_MIO_72_DRIVE_STRENGTH {12} \ + CONFIG.PSU_MIO_72_POLARITY {Default} \ + CONFIG.PSU_MIO_72_SLEW {fast} \ + CONFIG.PSU_MIO_73_DIRECTION {in} \ + CONFIG.PSU_MIO_73_DRIVE_STRENGTH {12} \ + CONFIG.PSU_MIO_73_POLARITY {Default} \ + CONFIG.PSU_MIO_73_SLEW {fast} \ + CONFIG.PSU_MIO_74_DIRECTION {in} \ + CONFIG.PSU_MIO_74_DRIVE_STRENGTH {12} \ + CONFIG.PSU_MIO_74_POLARITY {Default} \ + CONFIG.PSU_MIO_74_SLEW {fast} \ + CONFIG.PSU_MIO_75_DIRECTION {in} \ + CONFIG.PSU_MIO_75_DRIVE_STRENGTH {12} \ + CONFIG.PSU_MIO_75_POLARITY {Default} \ + CONFIG.PSU_MIO_75_SLEW {fast} \ + CONFIG.PSU_MIO_76_DIRECTION {out} \ + CONFIG.PSU_MIO_76_INPUT_TYPE {cmos} \ + CONFIG.PSU_MIO_76_POLARITY {Default} \ + CONFIG.PSU_MIO_77_DIRECTION {inout} \ + CONFIG.PSU_MIO_77_POLARITY {Default} \ + CONFIG.PSU_MIO_TREE_PERIPHERALS {Quad SPI Flash#Quad SPI Flash#Quad SPI Flash#Quad SPI Flash#Quad SPI Flash#Quad\ +SPI Flash#Feedback Clk##########I2C 1#I2C 1#UART 0#UART 0#UART 1#UART 1###CAN\ +1#CAN 1##DPAUX#DPAUX#DPAUX#DPAUX###############SD 1#SD 1#SD 1#SD 1#SD 1#SD 1#SD\ +1#USB 0#USB 0#USB 0#USB 0#USB 0#USB 0#USB 0#USB 0#USB 0#USB 0#USB 0#USB 0#Gem\ +3#Gem 3#Gem 3#Gem 3#Gem 3#Gem 3#Gem 3#Gem 3#Gem 3#Gem 3#Gem 3#Gem 3#MDIO 3#MDIO\ +3}\ + CONFIG.PSU_MIO_TREE_SIGNALS {sclk_out#miso_mo1#mo2#mo3#mosi_mi0#n_ss_out#clk_for_lpbk##########scl_out#sda_out#rxd#txd#txd#rxd###phy_tx#phy_rx##dp_aux_data_out#dp_hot_plug_detect#dp_aux_data_oe#dp_aux_data_in###############sdio1_cd_n#sdio1_data_out[0]#sdio1_data_out[1]#sdio1_data_out[2]#sdio1_data_out[3]#sdio1_cmd_out#sdio1_clk_out#ulpi_clk_in#ulpi_dir#ulpi_tx_data[2]#ulpi_nxt#ulpi_tx_data[0]#ulpi_tx_data[1]#ulpi_stp#ulpi_tx_data[3]#ulpi_tx_data[4]#ulpi_tx_data[5]#ulpi_tx_data[6]#ulpi_tx_data[7]#rgmii_tx_clk#rgmii_txd[0]#rgmii_txd[1]#rgmii_txd[2]#rgmii_txd[3]#rgmii_tx_ctl#rgmii_rx_clk#rgmii_rxd[0]#rgmii_rxd[1]#rgmii_rxd[2]#rgmii_rxd[3]#rgmii_rx_ctl#gem3_mdc#gem3_mdio_out}\ + CONFIG.PSU_SD1_INTERNAL_BUS_WIDTH {4} \ + CONFIG.PSU_USB3__DUAL_CLOCK_ENABLE {1} \ + CONFIG.PSU__ACT_DDR_FREQ_MHZ {1050.000000} \ + CONFIG.PSU__CAN1__GRP_CLK__ENABLE {0} \ + CONFIG.PSU__CAN1__PERIPHERAL__ENABLE {1} \ + CONFIG.PSU__CAN1__PERIPHERAL__IO {MIO 24 .. 25} \ + CONFIG.PSU__CRF_APB__ACPU_CTRL__ACT_FREQMHZ {1200.000000} \ + CONFIG.PSU__CRF_APB__ACPU_CTRL__DIVISOR0 {1} \ + CONFIG.PSU__CRF_APB__ACPU_CTRL__FREQMHZ {1200} \ + CONFIG.PSU__CRF_APB__ACPU_CTRL__SRCSEL {APLL} \ + CONFIG.PSU__CRF_APB__APLL_CTRL__DIV2 {1} \ + CONFIG.PSU__CRF_APB__APLL_CTRL__FBDIV {72} \ + CONFIG.PSU__CRF_APB__APLL_CTRL__FRACDATA {0.000000} \ + CONFIG.PSU__CRF_APB__APLL_CTRL__SRCSEL {PSS_REF_CLK} \ + CONFIG.PSU__CRF_APB__APLL_FRAC_CFG__ENABLED {0} \ + CONFIG.PSU__CRF_APB__APLL_TO_LPD_CTRL__DIVISOR0 {3} \ + CONFIG.PSU__CRF_APB__DBG_FPD_CTRL__ACT_FREQMHZ {250.000000} \ + CONFIG.PSU__CRF_APB__DBG_FPD_CTRL__DIVISOR0 {2} \ + CONFIG.PSU__CRF_APB__DBG_FPD_CTRL__FREQMHZ {250} \ + CONFIG.PSU__CRF_APB__DBG_FPD_CTRL__SRCSEL {IOPLL} \ + CONFIG.PSU__CRF_APB__DBG_TRACE_CTRL__DIVISOR0 {5} \ + CONFIG.PSU__CRF_APB__DBG_TRACE_CTRL__FREQMHZ {250} \ + CONFIG.PSU__CRF_APB__DBG_TRACE_CTRL__SRCSEL {IOPLL} \ + CONFIG.PSU__CRF_APB__DBG_TSTMP_CTRL__ACT_FREQMHZ {250.000000} \ + CONFIG.PSU__CRF_APB__DBG_TSTMP_CTRL__DIVISOR0 {2} \ + CONFIG.PSU__CRF_APB__DBG_TSTMP_CTRL__FREQMHZ {250} \ + CONFIG.PSU__CRF_APB__DBG_TSTMP_CTRL__SRCSEL {IOPLL} \ + CONFIG.PSU__CRF_APB__DDR_CTRL__ACT_FREQMHZ {525.000000} \ + CONFIG.PSU__CRF_APB__DDR_CTRL__DIVISOR0 {2} \ + CONFIG.PSU__CRF_APB__DDR_CTRL__FREQMHZ {1067} \ + CONFIG.PSU__CRF_APB__DDR_CTRL__SRCSEL {DPLL} \ + CONFIG.PSU__CRF_APB__DPDMA_REF_CTRL__ACT_FREQMHZ {600.000000} \ + CONFIG.PSU__CRF_APB__DPDMA_REF_CTRL__DIVISOR0 {2} \ + CONFIG.PSU__CRF_APB__DPDMA_REF_CTRL__FREQMHZ {600} \ + CONFIG.PSU__CRF_APB__DPDMA_REF_CTRL__SRCSEL {APLL} \ + CONFIG.PSU__CRF_APB__DPLL_CTRL__DIV2 {1} \ + CONFIG.PSU__CRF_APB__DPLL_CTRL__FBDIV {63} \ + CONFIG.PSU__CRF_APB__DPLL_CTRL__FRACDATA {0.000000} \ + CONFIG.PSU__CRF_APB__DPLL_CTRL__SRCSEL {PSS_REF_CLK} \ + CONFIG.PSU__CRF_APB__DPLL_FRAC_CFG__ENABLED {0} \ + CONFIG.PSU__CRF_APB__DPLL_TO_LPD_CTRL__DIVISOR0 {2} \ + CONFIG.PSU__CRF_APB__DP_AUDIO_REF_CTRL__ACT_FREQMHZ {25.000000} \ + CONFIG.PSU__CRF_APB__DP_AUDIO_REF_CTRL__DIVISOR0 {15} \ + CONFIG.PSU__CRF_APB__DP_AUDIO_REF_CTRL__DIVISOR1 {1} \ + CONFIG.PSU__CRF_APB__DP_AUDIO_REF_CTRL__SRCSEL {RPLL} \ + CONFIG.PSU__CRF_APB__DP_AUDIO__FRAC_ENABLED {0} \ + CONFIG.PSU__CRF_APB__DP_STC_REF_CTRL__ACT_FREQMHZ {26.785715} \ + CONFIG.PSU__CRF_APB__DP_STC_REF_CTRL__DIVISOR0 {14} \ + CONFIG.PSU__CRF_APB__DP_STC_REF_CTRL__DIVISOR1 {1} \ + CONFIG.PSU__CRF_APB__DP_STC_REF_CTRL__SRCSEL {RPLL} \ + CONFIG.PSU__CRF_APB__DP_VIDEO_REF_CTRL__ACT_FREQMHZ {300.000000} \ + CONFIG.PSU__CRF_APB__DP_VIDEO_REF_CTRL__DIVISOR0 {5} \ + CONFIG.PSU__CRF_APB__DP_VIDEO_REF_CTRL__DIVISOR1 {1} \ + CONFIG.PSU__CRF_APB__DP_VIDEO_REF_CTRL__SRCSEL {VPLL} \ + CONFIG.PSU__CRF_APB__DP_VIDEO__FRAC_ENABLED {0} \ + CONFIG.PSU__CRF_APB__GDMA_REF_CTRL__ACT_FREQMHZ {600.000000} \ + CONFIG.PSU__CRF_APB__GDMA_REF_CTRL__DIVISOR0 {2} \ + CONFIG.PSU__CRF_APB__GDMA_REF_CTRL__FREQMHZ {600} \ + CONFIG.PSU__CRF_APB__GDMA_REF_CTRL__SRCSEL {APLL} \ + CONFIG.PSU__CRF_APB__GPU_REF_CTRL__ACT_FREQMHZ {500.000000} \ + CONFIG.PSU__CRF_APB__GPU_REF_CTRL__DIVISOR0 {1} \ + CONFIG.PSU__CRF_APB__GPU_REF_CTRL__FREQMHZ {500} \ + CONFIG.PSU__CRF_APB__GPU_REF_CTRL__SRCSEL {IOPLL} \ + CONFIG.PSU__CRF_APB__PCIE_REF_CTRL__DIVISOR0 {6} \ + CONFIG.PSU__CRF_APB__PCIE_REF_CTRL__FREQMHZ {250} \ + CONFIG.PSU__CRF_APB__PCIE_REF_CTRL__SRCSEL {IOPLL} \ + CONFIG.PSU__CRF_APB__SATA_REF_CTRL__ACT_FREQMHZ {250.000000} \ + CONFIG.PSU__CRF_APB__SATA_REF_CTRL__DIVISOR0 {2} \ + CONFIG.PSU__CRF_APB__SATA_REF_CTRL__FREQMHZ {250} \ + CONFIG.PSU__CRF_APB__SATA_REF_CTRL__SRCSEL {IOPLL} \ + CONFIG.PSU__CRF_APB__TOPSW_LSBUS_CTRL__ACT_FREQMHZ {100.000000} \ + CONFIG.PSU__CRF_APB__TOPSW_LSBUS_CTRL__DIVISOR0 {5} \ + CONFIG.PSU__CRF_APB__TOPSW_LSBUS_CTRL__FREQMHZ {100} \ + CONFIG.PSU__CRF_APB__TOPSW_LSBUS_CTRL__SRCSEL {IOPLL} \ + CONFIG.PSU__CRF_APB__TOPSW_MAIN_CTRL__ACT_FREQMHZ {525.000000} \ + CONFIG.PSU__CRF_APB__TOPSW_MAIN_CTRL__DIVISOR0 {2} \ + CONFIG.PSU__CRF_APB__TOPSW_MAIN_CTRL__FREQMHZ {533.33} \ + CONFIG.PSU__CRF_APB__TOPSW_MAIN_CTRL__SRCSEL {DPLL} \ + CONFIG.PSU__CRF_APB__VPLL_CTRL__DIV2 {1} \ + CONFIG.PSU__CRF_APB__VPLL_CTRL__FBDIV {90} \ + CONFIG.PSU__CRF_APB__VPLL_CTRL__FRACDATA {0.000000} \ + CONFIG.PSU__CRF_APB__VPLL_CTRL__SRCSEL {PSS_REF_CLK} \ + CONFIG.PSU__CRF_APB__VPLL_FRAC_CFG__ENABLED {0} \ + CONFIG.PSU__CRF_APB__VPLL_TO_LPD_CTRL__DIVISOR0 {3} \ + CONFIG.PSU__CRL_APB__ADMA_REF_CTRL__ACT_FREQMHZ {500.000000} \ + CONFIG.PSU__CRL_APB__ADMA_REF_CTRL__DIVISOR0 {3} \ + CONFIG.PSU__CRL_APB__ADMA_REF_CTRL__FREQMHZ {500} \ + CONFIG.PSU__CRL_APB__ADMA_REF_CTRL__SRCSEL {IOPLL} \ + CONFIG.PSU__CRL_APB__AFI6_REF_CTRL__DIVISOR0 {3} \ + CONFIG.PSU__CRL_APB__AMS_REF_CTRL__ACT_FREQMHZ {50.000000} \ + CONFIG.PSU__CRL_APB__AMS_REF_CTRL__DIVISOR0 {30} \ + CONFIG.PSU__CRL_APB__AMS_REF_CTRL__DIVISOR1 {1} \ + CONFIG.PSU__CRL_APB__CAN0_REF_CTRL__DIVISOR0 {15} \ + CONFIG.PSU__CRL_APB__CAN0_REF_CTRL__DIVISOR1 {1} \ + CONFIG.PSU__CRL_APB__CAN1_REF_CTRL__ACT_FREQMHZ {100.000000} \ + CONFIG.PSU__CRL_APB__CAN1_REF_CTRL__DIVISOR0 {15} \ + CONFIG.PSU__CRL_APB__CAN1_REF_CTRL__DIVISOR1 {1} \ + CONFIG.PSU__CRL_APB__CAN1_REF_CTRL__FREQMHZ {100} \ + CONFIG.PSU__CRL_APB__CAN1_REF_CTRL__SRCSEL {IOPLL} \ + CONFIG.PSU__CRL_APB__CPU_R5_CTRL__ACT_FREQMHZ {500.000000} \ + CONFIG.PSU__CRL_APB__CPU_R5_CTRL__DIVISOR0 {3} \ + CONFIG.PSU__CRL_APB__CPU_R5_CTRL__FREQMHZ {500} \ + CONFIG.PSU__CRL_APB__CPU_R5_CTRL__SRCSEL {IOPLL} \ + CONFIG.PSU__CRL_APB__DBG_LPD_CTRL__ACT_FREQMHZ {250.000000} \ + CONFIG.PSU__CRL_APB__DBG_LPD_CTRL__DIVISOR0 {6} \ + CONFIG.PSU__CRL_APB__DBG_LPD_CTRL__FREQMHZ {250} \ + CONFIG.PSU__CRL_APB__DBG_LPD_CTRL__SRCSEL {IOPLL} \ + CONFIG.PSU__CRL_APB__DLL_REF_CTRL__ACT_FREQMHZ {1500.000000} \ + CONFIG.PSU__CRL_APB__GEM0_REF_CTRL__DIVISOR0 {12} \ + CONFIG.PSU__CRL_APB__GEM0_REF_CTRL__DIVISOR1 {1} \ + CONFIG.PSU__CRL_APB__GEM1_REF_CTRL__DIVISOR0 {12} \ + CONFIG.PSU__CRL_APB__GEM1_REF_CTRL__DIVISOR1 {1} \ + CONFIG.PSU__CRL_APB__GEM2_REF_CTRL__DIVISOR0 {12} \ + CONFIG.PSU__CRL_APB__GEM2_REF_CTRL__DIVISOR1 {1} \ + CONFIG.PSU__CRL_APB__GEM3_REF_CTRL__ACT_FREQMHZ {125.000000} \ + CONFIG.PSU__CRL_APB__GEM3_REF_CTRL__DIVISOR0 {12} \ + CONFIG.PSU__CRL_APB__GEM3_REF_CTRL__DIVISOR1 {1} \ + CONFIG.PSU__CRL_APB__GEM3_REF_CTRL__FREQMHZ {125} \ + CONFIG.PSU__CRL_APB__GEM3_REF_CTRL__SRCSEL {IOPLL} \ + CONFIG.PSU__CRL_APB__GEM_TSU_REF_CTRL__ACT_FREQMHZ {250.000000} \ + CONFIG.PSU__CRL_APB__GEM_TSU_REF_CTRL__DIVISOR0 {6} \ + CONFIG.PSU__CRL_APB__GEM_TSU_REF_CTRL__DIVISOR1 {1} \ + CONFIG.PSU__CRL_APB__GEM_TSU_REF_CTRL__SRCSEL {IOPLL} \ + CONFIG.PSU__CRL_APB__I2C0_REF_CTRL__DIVISOR0 {15} \ + CONFIG.PSU__CRL_APB__I2C0_REF_CTRL__DIVISOR1 {1} \ + CONFIG.PSU__CRL_APB__I2C0_REF_CTRL__FREQMHZ {100} \ + CONFIG.PSU__CRL_APB__I2C0_REF_CTRL__SRCSEL {IOPLL} \ + CONFIG.PSU__CRL_APB__I2C1_REF_CTRL__ACT_FREQMHZ {100.000000} \ + CONFIG.PSU__CRL_APB__I2C1_REF_CTRL__DIVISOR0 {15} \ + CONFIG.PSU__CRL_APB__I2C1_REF_CTRL__DIVISOR1 {1} \ + CONFIG.PSU__CRL_APB__I2C1_REF_CTRL__FREQMHZ {100} \ + CONFIG.PSU__CRL_APB__I2C1_REF_CTRL__SRCSEL {IOPLL} \ + CONFIG.PSU__CRL_APB__IOPLL_CTRL__DIV2 {1} \ + CONFIG.PSU__CRL_APB__IOPLL_CTRL__FBDIV {90} \ + CONFIG.PSU__CRL_APB__IOPLL_CTRL__FRACDATA {0.000000} \ + CONFIG.PSU__CRL_APB__IOPLL_CTRL__SRCSEL {PSS_REF_CLK} \ + CONFIG.PSU__CRL_APB__IOPLL_FRAC_CFG__ENABLED {0} \ + CONFIG.PSU__CRL_APB__IOPLL_TO_FPD_CTRL__DIVISOR0 {3} \ + CONFIG.PSU__CRL_APB__IOU_SWITCH_CTRL__ACT_FREQMHZ {250.000000} \ + CONFIG.PSU__CRL_APB__IOU_SWITCH_CTRL__DIVISOR0 {6} \ + CONFIG.PSU__CRL_APB__IOU_SWITCH_CTRL__FREQMHZ {250} \ + CONFIG.PSU__CRL_APB__IOU_SWITCH_CTRL__SRCSEL {IOPLL} \ + CONFIG.PSU__CRL_APB__LPD_LSBUS_CTRL__ACT_FREQMHZ {100.000000} \ + CONFIG.PSU__CRL_APB__LPD_LSBUS_CTRL__DIVISOR0 {15} \ + CONFIG.PSU__CRL_APB__LPD_LSBUS_CTRL__FREQMHZ {100} \ + CONFIG.PSU__CRL_APB__LPD_LSBUS_CTRL__SRCSEL {IOPLL} \ + CONFIG.PSU__CRL_APB__LPD_SWITCH_CTRL__ACT_FREQMHZ {500.000000} \ + CONFIG.PSU__CRL_APB__LPD_SWITCH_CTRL__DIVISOR0 {3} \ + CONFIG.PSU__CRL_APB__LPD_SWITCH_CTRL__FREQMHZ {500} \ + CONFIG.PSU__CRL_APB__LPD_SWITCH_CTRL__SRCSEL {IOPLL} \ + CONFIG.PSU__CRL_APB__NAND_REF_CTRL__DIVISOR0 {15} \ + CONFIG.PSU__CRL_APB__NAND_REF_CTRL__DIVISOR1 {1} \ + CONFIG.PSU__CRL_APB__PCAP_CTRL__ACT_FREQMHZ {187.500000} \ + CONFIG.PSU__CRL_APB__PCAP_CTRL__DIVISOR0 {8} \ + CONFIG.PSU__CRL_APB__PCAP_CTRL__FREQMHZ {200} \ + CONFIG.PSU__CRL_APB__PCAP_CTRL__SRCSEL {IOPLL} \ + CONFIG.PSU__CRL_APB__PL0_REF_CTRL__ACT_FREQMHZ {20.000000} \ + CONFIG.PSU__CRL_APB__PL0_REF_CTRL__DIVISOR0 {25} \ + CONFIG.PSU__CRL_APB__PL0_REF_CTRL__DIVISOR1 {3} \ + CONFIG.PSU__CRL_APB__PL0_REF_CTRL__FREQMHZ {20} \ + CONFIG.PSU__CRL_APB__PL0_REF_CTRL__SRCSEL {IOPLL} \ + CONFIG.PSU__CRL_APB__PL1_REF_CTRL__DIVISOR0 {4} \ + CONFIG.PSU__CRL_APB__PL1_REF_CTRL__DIVISOR1 {1} \ + CONFIG.PSU__CRL_APB__PL2_REF_CTRL__DIVISOR0 {4} \ + CONFIG.PSU__CRL_APB__PL2_REF_CTRL__DIVISOR1 {1} \ + CONFIG.PSU__CRL_APB__PL3_REF_CTRL__DIVISOR0 {4} \ + CONFIG.PSU__CRL_APB__PL3_REF_CTRL__DIVISOR1 {1} \ + CONFIG.PSU__CRL_APB__QSPI_REF_CTRL__ACT_FREQMHZ {125.000000} \ + CONFIG.PSU__CRL_APB__QSPI_REF_CTRL__DIVISOR0 {12} \ + CONFIG.PSU__CRL_APB__QSPI_REF_CTRL__DIVISOR1 {1} \ + CONFIG.PSU__CRL_APB__QSPI_REF_CTRL__FREQMHZ {125} \ + CONFIG.PSU__CRL_APB__QSPI_REF_CTRL__SRCSEL {IOPLL} \ + CONFIG.PSU__CRL_APB__RPLL_CTRL__DIV2 {1} \ + CONFIG.PSU__CRL_APB__RPLL_CTRL__FBDIV {45} \ + CONFIG.PSU__CRL_APB__RPLL_CTRL__FRACDATA {0.000000} \ + CONFIG.PSU__CRL_APB__RPLL_CTRL__SRCSEL {PSS_REF_CLK} \ + CONFIG.PSU__CRL_APB__RPLL_FRAC_CFG__ENABLED {0} \ + CONFIG.PSU__CRL_APB__RPLL_TO_FPD_CTRL__DIVISOR0 {2} \ + CONFIG.PSU__CRL_APB__SDIO0_REF_CTRL__DIVISOR0 {7} \ + CONFIG.PSU__CRL_APB__SDIO0_REF_CTRL__DIVISOR1 {1} \ + CONFIG.PSU__CRL_APB__SDIO1_REF_CTRL__ACT_FREQMHZ {187.500000} \ + CONFIG.PSU__CRL_APB__SDIO1_REF_CTRL__DIVISOR0 {8} \ + CONFIG.PSU__CRL_APB__SDIO1_REF_CTRL__DIVISOR1 {1} \ + CONFIG.PSU__CRL_APB__SDIO1_REF_CTRL__FREQMHZ {200} \ + CONFIG.PSU__CRL_APB__SDIO1_REF_CTRL__SRCSEL {IOPLL} \ + CONFIG.PSU__CRL_APB__SPI0_REF_CTRL__DIVISOR0 {7} \ + CONFIG.PSU__CRL_APB__SPI0_REF_CTRL__DIVISOR1 {1} \ + CONFIG.PSU__CRL_APB__SPI1_REF_CTRL__DIVISOR0 {7} \ + CONFIG.PSU__CRL_APB__SPI1_REF_CTRL__DIVISOR1 {1} \ + CONFIG.PSU__CRL_APB__TIMESTAMP_REF_CTRL__ACT_FREQMHZ {100.000000} \ + CONFIG.PSU__CRL_APB__TIMESTAMP_REF_CTRL__DIVISOR0 {15} \ + CONFIG.PSU__CRL_APB__TIMESTAMP_REF_CTRL__FREQMHZ {100} \ + CONFIG.PSU__CRL_APB__TIMESTAMP_REF_CTRL__SRCSEL {IOPLL} \ + CONFIG.PSU__CRL_APB__UART0_REF_CTRL__ACT_FREQMHZ {100.000000} \ + CONFIG.PSU__CRL_APB__UART0_REF_CTRL__DIVISOR0 {15} \ + CONFIG.PSU__CRL_APB__UART0_REF_CTRL__DIVISOR1 {1} \ + CONFIG.PSU__CRL_APB__UART0_REF_CTRL__FREQMHZ {100} \ + CONFIG.PSU__CRL_APB__UART0_REF_CTRL__SRCSEL {IOPLL} \ + CONFIG.PSU__CRL_APB__UART1_REF_CTRL__ACT_FREQMHZ {100.000000} \ + CONFIG.PSU__CRL_APB__UART1_REF_CTRL__DIVISOR0 {15} \ + CONFIG.PSU__CRL_APB__UART1_REF_CTRL__DIVISOR1 {1} \ + CONFIG.PSU__CRL_APB__UART1_REF_CTRL__FREQMHZ {100} \ + CONFIG.PSU__CRL_APB__UART1_REF_CTRL__SRCSEL {IOPLL} \ + CONFIG.PSU__CRL_APB__USB0_BUS_REF_CTRL__ACT_FREQMHZ {250.000000} \ + CONFIG.PSU__CRL_APB__USB0_BUS_REF_CTRL__DIVISOR0 {6} \ + CONFIG.PSU__CRL_APB__USB0_BUS_REF_CTRL__DIVISOR1 {1} \ + CONFIG.PSU__CRL_APB__USB0_BUS_REF_CTRL__FREQMHZ {250} \ + CONFIG.PSU__CRL_APB__USB0_BUS_REF_CTRL__SRCSEL {IOPLL} \ + CONFIG.PSU__CRL_APB__USB1_BUS_REF_CTRL__DIVISOR0 {6} \ + CONFIG.PSU__CRL_APB__USB1_BUS_REF_CTRL__DIVISOR1 {1} \ + CONFIG.PSU__CRL_APB__USB3_DUAL_REF_CTRL__ACT_FREQMHZ {20.000000} \ + CONFIG.PSU__CRL_APB__USB3_DUAL_REF_CTRL__DIVISOR0 {25} \ + CONFIG.PSU__CRL_APB__USB3_DUAL_REF_CTRL__DIVISOR1 {3} \ + CONFIG.PSU__CRL_APB__USB3_DUAL_REF_CTRL__FREQMHZ {20} \ + CONFIG.PSU__CRL_APB__USB3_DUAL_REF_CTRL__SRCSEL {IOPLL} \ + CONFIG.PSU__CRL_APB__USB3__ENABLE {1} \ + CONFIG.PSU__DDRC__ADDR_MIRROR {0} \ + CONFIG.PSU__DDRC__BANK_ADDR_COUNT {2} \ + CONFIG.PSU__DDRC__BG_ADDR_COUNT {1} \ + CONFIG.PSU__DDRC__BRC_MAPPING {ROW_BANK_COL} \ + CONFIG.PSU__DDRC__BUS_WIDTH {64 Bit} \ + CONFIG.PSU__DDRC__CL {15} \ + CONFIG.PSU__DDRC__CLOCK_STOP_EN {0} \ + CONFIG.PSU__DDRC__COL_ADDR_COUNT {10} \ + CONFIG.PSU__DDRC__COMPONENTS {Components} \ + CONFIG.PSU__DDRC__CWL {14} \ + CONFIG.PSU__DDRC__DDR3L_T_REF_RANGE {NA} \ + CONFIG.PSU__DDRC__DDR3_T_REF_RANGE {NA} \ + CONFIG.PSU__DDRC__DDR4_ADDR_MAPPING {0} \ + CONFIG.PSU__DDRC__DDR4_CAL_MODE_ENABLE {0} \ + CONFIG.PSU__DDRC__DDR4_CRC_CONTROL {0} \ + CONFIG.PSU__DDRC__DDR4_T_REF_MODE {0} \ + CONFIG.PSU__DDRC__DDR4_T_REF_RANGE {Normal (0-85)} \ + CONFIG.PSU__DDRC__DEEP_PWR_DOWN_EN {0} \ + CONFIG.PSU__DDRC__DEVICE_CAPACITY {4096 MBits} \ + CONFIG.PSU__DDRC__DIMM_ADDR_MIRROR {0} \ + CONFIG.PSU__DDRC__DM_DBI {DM_NO_DBI} \ + CONFIG.PSU__DDRC__DQMAP_0_3 {0} \ + CONFIG.PSU__DDRC__DQMAP_12_15 {0} \ + CONFIG.PSU__DDRC__DQMAP_16_19 {0} \ + CONFIG.PSU__DDRC__DQMAP_20_23 {0} \ + CONFIG.PSU__DDRC__DQMAP_24_27 {0} \ + CONFIG.PSU__DDRC__DQMAP_28_31 {0} \ + CONFIG.PSU__DDRC__DQMAP_32_35 {0} \ + CONFIG.PSU__DDRC__DQMAP_36_39 {0} \ + CONFIG.PSU__DDRC__DQMAP_40_43 {0} \ + CONFIG.PSU__DDRC__DQMAP_44_47 {0} \ + CONFIG.PSU__DDRC__DQMAP_48_51 {0} \ + CONFIG.PSU__DDRC__DQMAP_4_7 {0} \ + CONFIG.PSU__DDRC__DQMAP_52_55 {0} \ + CONFIG.PSU__DDRC__DQMAP_56_59 {0} \ + CONFIG.PSU__DDRC__DQMAP_60_63 {0} \ + CONFIG.PSU__DDRC__DQMAP_64_67 {0} \ + CONFIG.PSU__DDRC__DQMAP_68_71 {0} \ + CONFIG.PSU__DDRC__DQMAP_8_11 {0} \ + CONFIG.PSU__DDRC__DRAM_WIDTH {16 Bits} \ + CONFIG.PSU__DDRC__ECC {Disabled} \ + CONFIG.PSU__DDRC__ENABLE_LP4_HAS_ECC_COMP {0} \ + CONFIG.PSU__DDRC__ENABLE_LP4_SLOWBOOT {0} \ + CONFIG.PSU__DDRC__FGRM {1X} \ + CONFIG.PSU__DDRC__LPDDR3_T_REF_RANGE {NA} \ + CONFIG.PSU__DDRC__LPDDR4_T_REF_RANGE {NA} \ + CONFIG.PSU__DDRC__LP_ASR {manual normal} \ + CONFIG.PSU__DDRC__MEMORY_TYPE {DDR 4} \ + CONFIG.PSU__DDRC__PARITY_ENABLE {0} \ + CONFIG.PSU__DDRC__PER_BANK_REFRESH {0} \ + CONFIG.PSU__DDRC__PHY_DBI_MODE {0} \ + CONFIG.PSU__DDRC__ROW_ADDR_COUNT {15} \ + CONFIG.PSU__DDRC__SB_TARGET {15-15-15} \ + CONFIG.PSU__DDRC__SELF_REF_ABORT {0} \ + CONFIG.PSU__DDRC__SPEED_BIN {DDR4_2133P} \ + CONFIG.PSU__DDRC__STATIC_RD_MODE {0} \ + CONFIG.PSU__DDRC__TRAIN_DATA_EYE {1} \ + CONFIG.PSU__DDRC__TRAIN_READ_GATE {1} \ + CONFIG.PSU__DDRC__TRAIN_WRITE_LEVEL {1} \ + CONFIG.PSU__DDRC__T_FAW {30.0} \ + CONFIG.PSU__DDRC__T_RAS_MIN {33} \ + CONFIG.PSU__DDRC__T_RC {47.06} \ + CONFIG.PSU__DDRC__T_RCD {15} \ + CONFIG.PSU__DDRC__T_RP {15} \ + CONFIG.PSU__DDRC__VENDOR_PART {OTHERS} \ + CONFIG.PSU__DDRC__VREF {1} \ + CONFIG.PSU__DDR_HIGH_ADDRESS_GUI_ENABLE {0} \ + CONFIG.PSU__DDR__INTERFACE__FREQMHZ {533.500} \ + CONFIG.PSU__DISPLAYPORT__LANE0__ENABLE {1} \ + CONFIG.PSU__DISPLAYPORT__LANE0__IO {GT Lane1} \ + CONFIG.PSU__DISPLAYPORT__LANE1__ENABLE {1} \ + CONFIG.PSU__DISPLAYPORT__LANE1__IO {GT Lane0} \ + CONFIG.PSU__DISPLAYPORT__PERIPHERAL__ENABLE {1} \ + CONFIG.PSU__DLL__ISUSED {1} \ + CONFIG.PSU__DPAUX__PERIPHERAL__ENABLE {1} \ + CONFIG.PSU__DPAUX__PERIPHERAL__IO {MIO 27 .. 30} \ + CONFIG.PSU__DP__LANE_SEL {Dual Lower} \ + CONFIG.PSU__DP__REF_CLK_FREQ {27} \ + CONFIG.PSU__DP__REF_CLK_SEL {Ref Clk3} \ + CONFIG.PSU__ENET3__FIFO__ENABLE {0} \ + CONFIG.PSU__ENET3__GRP_MDIO__ENABLE {1} \ + CONFIG.PSU__ENET3__GRP_MDIO__IO {MIO 76 .. 77} \ + CONFIG.PSU__ENET3__PERIPHERAL__ENABLE {1} \ + CONFIG.PSU__ENET3__PERIPHERAL__IO {MIO 64 .. 75} \ + CONFIG.PSU__ENET3__PTP__ENABLE {0} \ + CONFIG.PSU__ENET3__TSU__ENABLE {0} \ + CONFIG.PSU__FPDMASTERS_COHERENCY {0} \ + CONFIG.PSU__FPD_SLCR__WDT1__ACT_FREQMHZ {100.000000} \ + CONFIG.PSU__FPD_SLCR__WDT1__FREQMHZ {100.000000} \ + CONFIG.PSU__FPD_SLCR__WDT_CLK_SEL__SELECT {APB} \ + CONFIG.PSU__FPGA_PL0_ENABLE {1} \ + CONFIG.PSU__GEM3_COHERENCY {0} \ + CONFIG.PSU__GEM3_ROUTE_THROUGH_FPD {0} \ + CONFIG.PSU__GEM__TSU__ENABLE {0} \ + CONFIG.PSU__GPIO0_MIO__PERIPHERAL__ENABLE {0} \ + CONFIG.PSU__GPIO1_MIO__PERIPHERAL__ENABLE {0} \ + CONFIG.PSU__GT__LINK_SPEED {HBR} \ + CONFIG.PSU__GT__PRE_EMPH_LVL_4 {0} \ + CONFIG.PSU__GT__VLT_SWNG_LVL_4 {0} \ + CONFIG.PSU__HIGH_ADDRESS__ENABLE {0} \ + CONFIG.PSU__I2C0__PERIPHERAL__ENABLE {0} \ + CONFIG.PSU__I2C1__PERIPHERAL__ENABLE {1} \ + CONFIG.PSU__I2C1__PERIPHERAL__IO {MIO 16 .. 17} \ + CONFIG.PSU__IOU_SLCR__IOU_TTC_APB_CLK__TTC0_SEL {APB} \ + CONFIG.PSU__IOU_SLCR__IOU_TTC_APB_CLK__TTC1_SEL {APB} \ + CONFIG.PSU__IOU_SLCR__IOU_TTC_APB_CLK__TTC2_SEL {APB} \ + CONFIG.PSU__IOU_SLCR__IOU_TTC_APB_CLK__TTC3_SEL {APB} \ + CONFIG.PSU__IOU_SLCR__TTC0__ACT_FREQMHZ {100.000000} \ + CONFIG.PSU__IOU_SLCR__TTC0__FREQMHZ {100.000000} \ + CONFIG.PSU__IOU_SLCR__TTC1__ACT_FREQMHZ {100.000000} \ + CONFIG.PSU__IOU_SLCR__TTC1__FREQMHZ {100.000000} \ + CONFIG.PSU__IOU_SLCR__TTC2__ACT_FREQMHZ {100.000000} \ + CONFIG.PSU__IOU_SLCR__TTC2__FREQMHZ {100.000000} \ + CONFIG.PSU__IOU_SLCR__TTC3__ACT_FREQMHZ {100.000000} \ + CONFIG.PSU__IOU_SLCR__TTC3__FREQMHZ {100.000000} \ + CONFIG.PSU__IOU_SLCR__WDT0__ACT_FREQMHZ {100.000000} \ + CONFIG.PSU__IOU_SLCR__WDT0__FREQMHZ {100.000000} \ + CONFIG.PSU__IOU_SLCR__WDT_CLK_SEL__SELECT {APB} \ + CONFIG.PSU__MAXIGP0__DATA_WIDTH {128} \ + CONFIG.PSU__MAXIGP1__DATA_WIDTH {128} \ + CONFIG.PSU__MAXIGP2__DATA_WIDTH {32} \ + CONFIG.PSU__OVERRIDE__BASIC_CLOCK {0} \ + CONFIG.PSU__PL_CLK0_BUF {TRUE} \ + CONFIG.PSU__PRESET_APPLIED {1} \ + CONFIG.PSU__PROTECTION__MASTERS {USB1:NonSecure;0|USB0:NonSecure;1|S_AXI_LPD:NA;0|S_AXI_HPC1_FPD:NA;0|S_AXI_HPC0_FPD:NA;0|S_AXI_HP3_FPD:NA;0|S_AXI_HP2_FPD:NA;0|S_AXI_HP1_FPD:NA;0|S_AXI_HP0_FPD:NA;0|S_AXI_ACP:NA;0|S_AXI_ACE:NA;0|SD1:NonSecure;1|SD0:NonSecure;0|SATA1:NonSecure;1|SATA0:NonSecure;1|RPU1:Secure;1|RPU0:Secure;1|QSPI:NonSecure;1|PMU:NA;1|PCIe:NonSecure;0|NAND:NonSecure;0|LDMA:NonSecure;1|GPU:NonSecure;1|GEM3:NonSecure;1|GEM2:NonSecure;0|GEM1:NonSecure;0|GEM0:NonSecure;0|FDMA:NonSecure;1|DP:NonSecure;1|DAP:NA;1|Coresight:NA;1|CSU:NA;1|APU:NA;1}\ + CONFIG.PSU__PROTECTION__SLAVES {LPD;USB3_1_XHCI;FE300000;FE3FFFFF;0|LPD;USB3_1;FF9E0000;FF9EFFFF;0|LPD;USB3_0_XHCI;FE200000;FE2FFFFF;1|LPD;USB3_0;FF9D0000;FF9DFFFF;1|LPD;UART1;FF010000;FF01FFFF;1|LPD;UART0;FF000000;FF00FFFF;1|LPD;TTC3;FF140000;FF14FFFF;1|LPD;TTC2;FF130000;FF13FFFF;1|LPD;TTC1;FF120000;FF12FFFF;1|LPD;TTC0;FF110000;FF11FFFF;1|FPD;SWDT1;FD4D0000;FD4DFFFF;1|LPD;SWDT0;FF150000;FF15FFFF;1|LPD;SPI1;FF050000;FF05FFFF;0|LPD;SPI0;FF040000;FF04FFFF;0|FPD;SMMU_REG;FD5F0000;FD5FFFFF;1|FPD;SMMU;FD800000;FDFFFFFF;1|FPD;SIOU;FD3D0000;FD3DFFFF;1|FPD;SERDES;FD400000;FD47FFFF;1|LPD;SD1;FF170000;FF17FFFF;1|LPD;SD0;FF160000;FF16FFFF;0|FPD;SATA;FD0C0000;FD0CFFFF;1|LPD;RTC;FFA60000;FFA6FFFF;1|LPD;RSA_CORE;FFCE0000;FFCEFFFF;1|LPD;RPU;FF9A0000;FF9AFFFF;1|LPD;R5_TCM_RAM_GLOBAL;FFE00000;FFE3FFFF;1|LPD;R5_1_Instruction_Cache;FFEC0000;FFECFFFF;1|LPD;R5_1_Data_Cache;FFED0000;FFEDFFFF;1|LPD;R5_1_BTCM_GLOBAL;FFEB0000;FFEBFFFF;1|LPD;R5_1_ATCM_GLOBAL;FFE90000;FFE9FFFF;1|LPD;R5_0_Instruction_Cache;FFE40000;FFE4FFFF;1|LPD;R5_0_Data_Cache;FFE50000;FFE5FFFF;1|LPD;R5_0_BTCM_GLOBAL;FFE20000;FFE2FFFF;1|LPD;R5_0_ATCM_GLOBAL;FFE00000;FFE0FFFF;1|LPD;QSPI_Linear_Address;C0000000;DFFFFFFF;1|LPD;QSPI;FF0F0000;FF0FFFFF;1|LPD;PMU_RAM;FFDC0000;FFDDFFFF;1|LPD;PMU_GLOBAL;FFD80000;FFDBFFFF;1|FPD;PCIE_MAIN;FD0E0000;FD0EFFFF;0|FPD;PCIE_LOW;E0000000;EFFFFFFF;0|FPD;PCIE_HIGH2;8000000000;BFFFFFFFFF;0|FPD;PCIE_HIGH1;600000000;7FFFFFFFF;0|FPD;PCIE_DMA;FD0F0000;FD0FFFFF;0|FPD;PCIE_ATTRIB;FD480000;FD48FFFF;0|LPD;OCM_XMPU_CFG;FFA70000;FFA7FFFF;1|LPD;OCM_SLCR;FF960000;FF96FFFF;1|OCM;OCM;FFFC0000;FFFFFFFF;1|LPD;NAND;FF100000;FF10FFFF;0|LPD;MBISTJTAG;FFCF0000;FFCFFFFF;1|LPD;LPD_XPPU_SINK;FF9C0000;FF9CFFFF;1|LPD;LPD_XPPU;FF980000;FF98FFFF;1|LPD;LPD_SLCR_SECURE;FF4B0000;FF4DFFFF;1|LPD;LPD_SLCR;FF410000;FF4AFFFF;1|LPD;LPD_GPV;FE100000;FE1FFFFF;1|LPD;LPD_DMA_7;FFAF0000;FFAFFFFF;1|LPD;LPD_DMA_6;FFAE0000;FFAEFFFF;1|LPD;LPD_DMA_5;FFAD0000;FFADFFFF;1|LPD;LPD_DMA_4;FFAC0000;FFACFFFF;1|LPD;LPD_DMA_3;FFAB0000;FFABFFFF;1|LPD;LPD_DMA_2;FFAA0000;FFAAFFFF;1|LPD;LPD_DMA_1;FFA90000;FFA9FFFF;1|LPD;LPD_DMA_0;FFA80000;FFA8FFFF;1|LPD;IPI_CTRL;FF380000;FF3FFFFF;1|LPD;IOU_SLCR;FF180000;FF23FFFF;1|LPD;IOU_SECURE_SLCR;FF240000;FF24FFFF;1|LPD;IOU_SCNTRS;FF260000;FF26FFFF;1|LPD;IOU_SCNTR;FF250000;FF25FFFF;1|LPD;IOU_GPV;FE000000;FE0FFFFF;1|LPD;I2C1;FF030000;FF03FFFF;1|LPD;I2C0;FF020000;FF02FFFF;0|FPD;GPU;FD4B0000;FD4BFFFF;1|LPD;GPIO;FF0A0000;FF0AFFFF;1|LPD;GEM3;FF0E0000;FF0EFFFF;1|LPD;GEM2;FF0D0000;FF0DFFFF;0|LPD;GEM1;FF0C0000;FF0CFFFF;0|LPD;GEM0;FF0B0000;FF0BFFFF;0|FPD;FPD_XMPU_SINK;FD4F0000;FD4FFFFF;1|FPD;FPD_XMPU_CFG;FD5D0000;FD5DFFFF;1|FPD;FPD_SLCR_SECURE;FD690000;FD6CFFFF;1|FPD;FPD_SLCR;FD610000;FD68FFFF;1|FPD;FPD_DMA_CH7;FD570000;FD57FFFF;1|FPD;FPD_DMA_CH6;FD560000;FD56FFFF;1|FPD;FPD_DMA_CH5;FD550000;FD55FFFF;1|FPD;FPD_DMA_CH4;FD540000;FD54FFFF;1|FPD;FPD_DMA_CH3;FD530000;FD53FFFF;1|FPD;FPD_DMA_CH2;FD520000;FD52FFFF;1|FPD;FPD_DMA_CH1;FD510000;FD51FFFF;1|FPD;FPD_DMA_CH0;FD500000;FD50FFFF;1|LPD;EFUSE;FFCC0000;FFCCFFFF;1|FPD;Display\ +Port;FD4A0000;FD4AFFFF;1|FPD;DPDMA;FD4C0000;FD4CFFFF;1|FPD;DDR_XMPU5_CFG;FD050000;FD05FFFF;1|FPD;DDR_XMPU4_CFG;FD040000;FD04FFFF;1|FPD;DDR_XMPU3_CFG;FD030000;FD03FFFF;1|FPD;DDR_XMPU2_CFG;FD020000;FD02FFFF;1|FPD;DDR_XMPU1_CFG;FD010000;FD01FFFF;1|FPD;DDR_XMPU0_CFG;FD000000;FD00FFFF;1|FPD;DDR_QOS_CTRL;FD090000;FD09FFFF;1|FPD;DDR_PHY;FD080000;FD08FFFF;1|DDR;DDR_LOW;0;7FFFFFFF;1|DDR;DDR_HIGH;800000000;800000000;0|FPD;DDDR_CTRL;FD070000;FD070FFF;1|LPD;Coresight;FE800000;FEFFFFFF;1|LPD;CSU_DMA;FFC80000;FFC9FFFF;1|LPD;CSU;FFCA0000;FFCAFFFF;1|LPD;CRL_APB;FF5E0000;FF85FFFF;1|FPD;CRF_APB;FD1A0000;FD2DFFFF;1|FPD;CCI_REG;FD5E0000;FD5EFFFF;1|LPD;CAN1;FF070000;FF07FFFF;1|LPD;CAN0;FF060000;FF06FFFF;0|FPD;APU;FD5C0000;FD5CFFFF;1|LPD;APM_INTC_IOU;FFA20000;FFA2FFFF;1|LPD;APM_FPD_LPD;FFA30000;FFA3FFFF;1|FPD;APM_5;FD490000;FD49FFFF;1|FPD;APM_0;FD0B0000;FD0BFFFF;1|LPD;APM2;FFA10000;FFA1FFFF;1|LPD;APM1;FFA00000;FFA0FFFF;1|LPD;AMS;FFA50000;FFA5FFFF;1|FPD;AFI_5;FD3B0000;FD3BFFFF;1|FPD;AFI_4;FD3A0000;FD3AFFFF;1|FPD;AFI_3;FD390000;FD39FFFF;1|FPD;AFI_2;FD380000;FD38FFFF;1|FPD;AFI_1;FD370000;FD37FFFF;1|FPD;AFI_0;FD360000;FD36FFFF;1|LPD;AFIFM6;FF9B0000;FF9BFFFF;1|FPD;ACPU_GIC;F9010000;F907FFFF;1}\ + CONFIG.PSU__PSS_REF_CLK__FREQMHZ {33.333333} \ + CONFIG.PSU__QSPI_COHERENCY {0} \ + CONFIG.PSU__QSPI_ROUTE_THROUGH_FPD {0} \ + CONFIG.PSU__QSPI__GRP_FBCLK__ENABLE {1} \ + CONFIG.PSU__QSPI__GRP_FBCLK__IO {MIO 6} \ + CONFIG.PSU__QSPI__PERIPHERAL__DATA_MODE {x4} \ + CONFIG.PSU__QSPI__PERIPHERAL__ENABLE {1} \ + CONFIG.PSU__QSPI__PERIPHERAL__IO {MIO 0 .. 5} \ + CONFIG.PSU__QSPI__PERIPHERAL__MODE {Single} \ + CONFIG.PSU__SATA__LANE0__ENABLE {0} \ + CONFIG.PSU__SATA__LANE1__ENABLE {1} \ + CONFIG.PSU__SATA__LANE1__IO {GT Lane3} \ + CONFIG.PSU__SATA__PERIPHERAL__ENABLE {1} \ + CONFIG.PSU__SATA__REF_CLK_FREQ {125} \ + CONFIG.PSU__SATA__REF_CLK_SEL {Ref Clk1} \ + CONFIG.PSU__SD1_COHERENCY {0} \ + CONFIG.PSU__SD1_ROUTE_THROUGH_FPD {0} \ + CONFIG.PSU__SD1__DATA_TRANSFER_MODE {4Bit} \ + CONFIG.PSU__SD1__GRP_CD__ENABLE {1} \ + CONFIG.PSU__SD1__GRP_CD__IO {MIO 45} \ + CONFIG.PSU__SD1__GRP_POW__ENABLE {0} \ + CONFIG.PSU__SD1__GRP_WP__ENABLE {0} \ + CONFIG.PSU__SD1__PERIPHERAL__ENABLE {1} \ + CONFIG.PSU__SD1__PERIPHERAL__IO {MIO 46 .. 51} \ + CONFIG.PSU__SD1__RESET__ENABLE {0} \ + CONFIG.PSU__SD1__SLOT_TYPE {SD 2.0} \ + CONFIG.PSU__SWDT0__CLOCK__ENABLE {0} \ + CONFIG.PSU__SWDT0__PERIPHERAL__ENABLE {1} \ + CONFIG.PSU__SWDT0__RESET__ENABLE {0} \ + CONFIG.PSU__SWDT1__CLOCK__ENABLE {0} \ + CONFIG.PSU__SWDT1__PERIPHERAL__ENABLE {1} \ + CONFIG.PSU__SWDT1__RESET__ENABLE {0} \ + CONFIG.PSU__TSU__BUFG_PORT_PAIR {0} \ + CONFIG.PSU__TTC0__CLOCK__ENABLE {0} \ + CONFIG.PSU__TTC0__PERIPHERAL__ENABLE {1} \ + CONFIG.PSU__TTC0__WAVEOUT__ENABLE {0} \ + CONFIG.PSU__TTC1__CLOCK__ENABLE {0} \ + CONFIG.PSU__TTC1__PERIPHERAL__ENABLE {1} \ + CONFIG.PSU__TTC1__WAVEOUT__ENABLE {0} \ + CONFIG.PSU__TTC2__CLOCK__ENABLE {0} \ + CONFIG.PSU__TTC2__PERIPHERAL__ENABLE {1} \ + CONFIG.PSU__TTC2__WAVEOUT__ENABLE {0} \ + CONFIG.PSU__TTC3__CLOCK__ENABLE {0} \ + CONFIG.PSU__TTC3__PERIPHERAL__ENABLE {1} \ + CONFIG.PSU__TTC3__WAVEOUT__ENABLE {0} \ + CONFIG.PSU__UART0__BAUD_RATE {115200} \ + CONFIG.PSU__UART0__MODEM__ENABLE {0} \ + CONFIG.PSU__UART0__PERIPHERAL__ENABLE {1} \ + CONFIG.PSU__UART0__PERIPHERAL__IO {MIO 18 .. 19} \ + CONFIG.PSU__UART1__BAUD_RATE {115200} \ + CONFIG.PSU__UART1__MODEM__ENABLE {0} \ + CONFIG.PSU__UART1__PERIPHERAL__ENABLE {1} \ + CONFIG.PSU__UART1__PERIPHERAL__IO {MIO 20 .. 21} \ + CONFIG.PSU__USB0_COHERENCY {0} \ + CONFIG.PSU__USB0__PERIPHERAL__ENABLE {1} \ + CONFIG.PSU__USB0__PERIPHERAL__IO {MIO 52 .. 63} \ + CONFIG.PSU__USB0__REF_CLK_FREQ {26} \ + CONFIG.PSU__USB0__REF_CLK_SEL {Ref Clk2} \ + CONFIG.PSU__USB0__RESET__ENABLE {0} \ + CONFIG.PSU__USB1__RESET__ENABLE {0} \ + CONFIG.PSU__USB2_0__EMIO__ENABLE {0} \ + CONFIG.PSU__USB3_0__EMIO__ENABLE {0} \ + CONFIG.PSU__USB3_0__PERIPHERAL__ENABLE {1} \ + CONFIG.PSU__USB3_0__PERIPHERAL__IO {GT Lane2} \ + CONFIG.PSU__USB__RESET__MODE {Boot Pin} \ + CONFIG.PSU__USB__RESET__POLARITY {Active Low} \ + CONFIG.PSU__USE__IRQ0 {1} \ + CONFIG.PSU__USE__M_AXI_GP0 {0} \ + CONFIG.PSU__USE__M_AXI_GP1 {0} \ + CONFIG.PSU__USE__M_AXI_GP2 {1} \ + ] $zynq_ultra_ps_e_0 + + # Create interface connections + connect_bd_intf_net -intf_net zynq_ultra_ps_e_0_M_AXI_HPM0_LPD [get_bd_intf_pins cmsdk_socket/S00_AXI] [get_bd_intf_pins zynq_ultra_ps_e_0/M_AXI_HPM0_LPD] + + # Create port connections + connect_bd_net -net nanosoc_chip_0_swdio_o [get_bd_pins nanosoc_chip_0/swdio_o] [get_bd_pins cmsdk_socket/gpio_tri_o] + connect_bd_net -net nanosoc_chip_0_swdio_z [get_bd_pins nanosoc_chip_0/swdio_z] [get_bd_pins cmsdk_socket/gpio2_tri_z] + connect_bd_net -net cmsdk_socket_gpio2_tri_o [get_bd_pins nanosoc_chip_0/swdclk_i] [get_bd_pins cmsdk_socket/gpio2_tri_o] + connect_bd_net -net cmsdk_socket_gpio_tri_i [get_bd_pins nanosoc_chip_0/swdio_i] [get_bd_pins cmsdk_socket/gpio_tri_i] + connect_bd_net -net cmsdk_socket_nrst [get_bd_pins nanosoc_chip_0/nrst_i] [get_bd_pins cmsdk_socket/nrst] + connect_bd_net -net cmsdk_socket_p0_tri_i [get_bd_pins nanosoc_chip_0/p0_i] [get_bd_pins cmsdk_socket/p0_tri_i] + connect_bd_net -net cmsdk_socket_p1_tri_i [get_bd_pins nanosoc_chip_0/p1_i] [get_bd_pins cmsdk_socket/p1_tri_i] + connect_bd_net -net p0_tri_o_1 [get_bd_pins nanosoc_chip_0/p0_o] [get_bd_pins cmsdk_socket/p0_tri_o] + connect_bd_net -net p0_tri_z_1 [get_bd_pins nanosoc_chip_0/p0_z] [get_bd_pins cmsdk_socket/p0_tri_z] + connect_bd_net -net p1_tri_o_1 [get_bd_pins nanosoc_chip_0/p1_o] [get_bd_pins cmsdk_socket/p1_tri_o] + connect_bd_net -net p1_tri_z_1 [get_bd_pins nanosoc_chip_0/p1_z] [get_bd_pins cmsdk_socket/p1_tri_z] + connect_bd_net -net pmoda_i_1 [get_bd_ports pmoda_tri_i] [get_bd_pins cmsdk_socket/pmoda_tri_i] + connect_bd_net -net pmoda_o_concat9_dout [get_bd_ports pmoda_tri_z] [get_bd_pins cmsdk_socket/pmoda_tri_z] + connect_bd_net -net xlconcat_0_dout [get_bd_ports pmoda_tri_o] [get_bd_pins cmsdk_socket/pmoda_tri_o] + connect_bd_net -net zynq_ultra_ps_e_0_pl_clk0 [get_bd_pins nanosoc_chip_0/xtal_clk_i] [get_bd_pins cmsdk_socket/aclk] [get_bd_pins zynq_ultra_ps_e_0/maxihpm0_lpd_aclk] [get_bd_pins zynq_ultra_ps_e_0/pl_clk0] + connect_bd_net -net zynq_ultra_ps_e_0_pl_resetn0 [get_bd_pins cmsdk_socket/ext_reset_in] [get_bd_pins zynq_ultra_ps_e_0/pl_resetn0] + + # Create address segments + assign_bd_address -offset 0x80000000 -range 0x00010000 -target_address_space [get_bd_addr_spaces zynq_ultra_ps_e_0/Data] [get_bd_addr_segs cmsdk_socket/axi_gpio_0/S_AXI/Reg] -force + assign_bd_address -offset 0x80010000 -range 0x00010000 -target_address_space [get_bd_addr_spaces zynq_ultra_ps_e_0/Data] [get_bd_addr_segs cmsdk_socket/axi_gpio_1/S_AXI/Reg] -force + assign_bd_address -offset 0x80020000 -range 0x00010000 -target_address_space [get_bd_addr_spaces zynq_ultra_ps_e_0/Data] [get_bd_addr_segs cmsdk_socket/axi_gpio_2/S_AXI/Reg] -force + assign_bd_address -offset 0x80030000 -range 0x00010000 -target_address_space [get_bd_addr_spaces zynq_ultra_ps_e_0/Data] [get_bd_addr_segs cmsdk_socket/axi_uartlite_0/S_AXI/Reg] -force + + + # Restore current instance + current_bd_instance $oldCurInst + +} +# End of create_root_design() + + + + +proc available_tcl_procs { } { + puts "##################################################################" + puts "# Available Tcl procedures to recreate hierarchical blocks:" + puts "#" + puts "# create_hier_cell_cmsdk_socket parentCell nameHier" + puts "# create_root_design" + puts "#" + puts "#" + puts "# The following procedures will create hiearchical blocks with addressing " + puts "# for IPs within those blocks and their sub-hierarchical blocks. Addressing " + puts "# will not be handled outside those blocks:" + puts "#" + puts "# create_root_design" + puts "#" + puts "##################################################################" +} + +available_tcl_procs diff --git a/Cortex-M0/nanosoc/systems/mcu/fpga_imp/target_fpga_zcu104/design_1_wrapper.v b/Cortex-M0/nanosoc/systems/mcu/fpga_imp/target_fpga_zcu104/design_1_wrapper.v new file mode 100644 index 0000000..ce586c7 --- /dev/null +++ b/Cortex-M0/nanosoc/systems/mcu/fpga_imp/target_fpga_zcu104/design_1_wrapper.v @@ -0,0 +1,107 @@ +//Copyright 1986-2021 Xilinx, Inc. All Rights Reserved. +//-------------------------------------------------------------------------------- +//Tool Version: Vivado v.2021.1 (lin64) Build 3247384 Thu Jun 10 19:36:07 MDT 2021 +//Date : Wed Jun 22 15:58:42 2022 +//Host : srv03335 running 64-bit Red Hat Enterprise Linux release 8.6 (Ootpa) +//Command : generate_target design_1_wrapper.bd +//Design : design_1_wrapper +//Purpose : IP block netlist +//-------------------------------------------------------------------------------- +`timescale 1 ps / 1 ps + +module design_1_wrapper + (PMOD0_0, + PMOD0_1, + PMOD0_2, + PMOD0_3, + PMOD0_4, + PMOD0_5, + PMOD0_6, + PMOD0_7 + ); +// PMOD1_0, +// PMOD1_1, +// PMOD1_2, +// PMOD1_3, +// PMOD1_4, +// PMOD1_5, +// PMOD1_6, +// PMOD1_7, +// dip_switch_4bits_tri_i, +// led_4bits_tri_o); + + inout wire PMOD0_0; + inout wire PMOD0_1; + inout wire PMOD0_2; + inout wire PMOD0_3; + inout wire PMOD0_4; + inout wire PMOD0_5; + inout wire PMOD0_6; + inout wire PMOD0_7; +// inout wire PMOD1_0; +// inout wire PMOD1_1; +// inout wire PMOD1_2; +// inout wire PMOD1_3; +// inout wire PMOD1_4; +// inout wire PMOD1_5; +// inout wire PMOD1_6; +// inout wire PMOD1_7; + +// input wire [3:0]dip_switch_4bits_tri_i; +// output wire [3:0]led_4bits_tri_o; + + wire [7:0]PMOD0_tri_i; + wire [7:0]PMOD0_tri_o; + wire [7:0]PMOD0_tri_z; + + assign PMOD0_tri_i[0] = PMOD0_0; + assign PMOD0_tri_i[1] = PMOD0_1; + assign PMOD0_tri_i[2] = PMOD0_2; + assign PMOD0_tri_i[3] = PMOD0_3; + assign PMOD0_tri_i[4] = PMOD0_4; + assign PMOD0_tri_i[5] = PMOD0_5; + assign PMOD0_tri_i[6] = PMOD0_6; + assign PMOD0_tri_i[7] = PMOD0_7; + + assign PMOD0_0 = PMOD0_tri_z[0] ? 1'bz : PMOD0_tri_o[0]; + assign PMOD0_1 = PMOD0_tri_z[1] ? 1'bz : PMOD0_tri_o[1]; + assign PMOD0_2 = PMOD0_tri_z[2] ? 1'bz : PMOD0_tri_o[2]; + assign PMOD0_3 = PMOD0_tri_z[3] ? 1'bz : PMOD0_tri_o[3]; + assign PMOD0_4 = PMOD0_tri_z[4] ? 1'bz : PMOD0_tri_o[4]; + assign PMOD0_5 = PMOD0_tri_z[5] ? 1'bz : PMOD0_tri_o[5]; + assign PMOD0_6 = PMOD0_tri_z[6] ? 1'bz : PMOD0_tri_o[6]; + assign PMOD0_7 = PMOD0_tri_z[7] ? 1'bz : PMOD0_tri_o[7]; + +// wire [7:0]PMOD1_tri_i; +// wire [7:0]PMOD1_tri_o; +// wire [7:0]PMOD1_tri_z; + +// assign PMOD1_tri_i[0] = PMOD1_0; +// assign PMOD1_tri_i[1] = PMOD1_1; +// assign PMOD1_tri_i[2] = PMOD1_2; +// assign PMOD1_tri_i[3] = PMOD1_3; +// assign PMOD1_tri_i[4] = PMOD1_4; +// assign PMOD1_tri_i[5] = PMOD1_5; +// assign PMOD1_tri_i[6] = PMOD1_6; +// assign PMOD1_tri_i[7] = PMOD1_7; + +// assign PMOD1_0 = PMOD1_tri_z[0] ? 1'bz : PMOD1_tri_o[0]; +// assign PMOD1_1 = PMOD1_tri_z[1] ? 1'bz : PMOD1_tri_o[1]; +// assign PMOD1_2 = PMOD1_tri_z[2] ? 1'bz : PMOD1_tri_o[2]; +// assign PMOD1_3 = PMOD1_tri_z[3] ? 1'bz : PMOD1_tri_o[3]; +// assign PMOD1_4 = PMOD1_tri_z[4] ? 1'bz : PMOD1_tri_o[4]; +// assign PMOD1_5 = PMOD1_tri_z[5] ? 1'bz : PMOD1_tri_o[5]; +// assign PMOD1_6 = PMOD1_tri_z[6] ? 1'bz : PMOD1_tri_o[6]; +// assign PMOD1_7 = PMOD1_tri_z[7] ? 1'bz : PMOD1_tri_o[7]; + + design_1 design_1_i + (.pmoda_tri_i(PMOD0_tri_i), + .pmoda_tri_o(PMOD0_tri_o), + .pmoda_tri_z(PMOD0_tri_z)//, +// .PMOD1_tri_i(PMOD1_tri_i), +// .PMOD1_tri_o(PMOD1_tri_o), +// .PMOD1_tri_z(PMOD1_tri_z), +// .dip_switch_4bits_tri_i(dip_switch_4bits_tri_i), +// .led_4bits_tri_o(led_4bits_tri_o) + ); +endmodule diff --git a/Cortex-M0/nanosoc/systems/mcu/fpga_imp/target_fpga_zcu104/fpga_pinmap.xdc b/Cortex-M0/nanosoc/systems/mcu/fpga_imp/target_fpga_zcu104/fpga_pinmap.xdc new file mode 100644 index 0000000..4a635dd --- /dev/null +++ b/Cortex-M0/nanosoc/systems/mcu/fpga_imp/target_fpga_zcu104/fpga_pinmap.xdc @@ -0,0 +1,1031 @@ +################################################################################## +## ## +## ZCU104 Rev1.0 Master XDC ## +## ## +################################################################################## + +#Other net PACKAGE_PIN V17 - SYSMON_DXN Bank 0 - DXN +#Other net PACKAGE_PIN V18 - SYSMON_DXP Bank 0 - DXP +#Other net PACKAGE_PIN R17 - SYSMON_AGND Bank 0 - GNDADC +#Other net PACKAGE_PIN AA12 - 3N5824 Bank 0 - POR_OVERRIDE +#Other net PACKAGE_PIN AA13 - 3N5822 Bank 0 - PUDC_B +#Other net PACKAGE_PIN R18 - FPGA_SYSMON_AVCC Bank 0 - VCCADC +#Other net PACKAGE_PIN U17 - SYSMON_VN_R Bank 0 - VN +#Other net PACKAGE_PIN T18 - SYSMON_VP_R Bank 0 - VP +#Other net PACKAGE_PIN T17 - SYSMON_AGND Bank 0 - VREFN +#Other net PACKAGE_PIN U18 - SYSMON_AGND Bank 0 - VREFP +#set_property PACKAGE_PIN B21 [get_ports "5N7582"] ;# Bank 28 VCCO - VCC1V8 - IO_L24N_T3U_N11_28 +#set_property IOSTANDARD LVCMOSxx [get_ports "5N7582"] ;# Bank 28 VCCO - VCC1V8 - IO_L24N_T3U_N11_28 +#set_property PACKAGE_PIN B20 [get_ports "5N7577"] ;# Bank 28 VCCO - VCC1V8 - IO_L24P_T3U_N10_28 +#set_property IOSTANDARD LVCMOSxx [get_ports "5N7577"] ;# Bank 28 VCCO - VCC1V8 - IO_L24P_T3U_N10_28 +#set_property PACKAGE_PIN A23 [get_ports "5N7578"] ;# Bank 28 VCCO - VCC1V8 - IO_L23N_T3U_N9_28 +#set_property IOSTANDARD LVCMOSxx [get_ports "5N7578"] ;# Bank 28 VCCO - VCC1V8 - IO_L23N_T3U_N9_28 +#set_property PACKAGE_PIN A22 [get_ports "5N7569"] ;# Bank 28 VCCO - VCC1V8 - IO_L23P_T3U_N8_28 +#set_property IOSTANDARD LVCMOSxx [get_ports "5N7569"] ;# Bank 28 VCCO - VCC1V8 - IO_L23P_T3U_N8_28 +#set_property PACKAGE_PIN B19 [get_ports "5N7570"] ;# Bank 28 VCCO - VCC1V8 - IO_L22N_T3U_N7_DBC_AD0N_28 +#set_property IOSTANDARD LVCMOSxx [get_ports "5N7570"] ;# Bank 28 VCCO - VCC1V8 - IO_L22N_T3U_N7_DBC_AD0N_28 +#set_property PACKAGE_PIN B18 [get_ports "5N7565"] ;# Bank 28 VCCO - VCC1V8 - IO_L22P_T3U_N6_DBC_AD0P_28 +#set_property IOSTANDARD LVCMOSxx [get_ports "5N7565"] ;# Bank 28 VCCO - VCC1V8 - IO_L22P_T3U_N6_DBC_AD0P_28 +#set_property PACKAGE_PIN A21 [get_ports "5N7709"] ;# Bank 28 VCCO - VCC1V8 - IO_L21N_T3L_N5_AD8N_28 +#set_property IOSTANDARD LVCMOSxx [get_ports "5N7709"] ;# Bank 28 VCCO - VCC1V8 - IO_L21N_T3L_N5_AD8N_28 +#set_property PACKAGE_PIN A18 [get_ports "5N7704"] ;# Bank 28 VCCO - VCC1V8 - IO_L19P_T3L_N0_DBC_AD9P_28 +#set_property IOSTANDARD LVCMOSxx [get_ports "5N7704"] ;# Bank 28 VCCO - VCC1V8 - IO_L19P_T3L_N0_DBC_AD9P_28 +#set_property PACKAGE_PIN B23 [get_ports "5N7581"] ;# Bank 28 VCCO - VCC1V8 - IO_T3U_N12_28 +#set_property IOSTANDARD LVCMOSxx [get_ports "5N7581"] ;# Bank 28 VCCO - VCC1V8 - IO_T3U_N12_28 +#set_property PACKAGE_PIN F25 [get_ports "5N7703"] ;# Bank 28 VCCO - VCC1V8 - IO_T2U_N12_28 +#set_property IOSTANDARD LVCMOSxx [get_ports "5N7703"] ;# Bank 28 VCCO - VCC1V8 - IO_T2U_N12_28 +#set_property PACKAGE_PIN G26 [get_ports "5N7702"] ;# Bank 28 VCCO - VCC1V8 - IO_L18N_T2U_N11_AD2N_28 +#set_property IOSTANDARD LVCMOSxx [get_ports "5N7702"] ;# Bank 28 VCCO - VCC1V8 - IO_L18N_T2U_N11_AD2N_28 +#set_property PACKAGE_PIN G25 [get_ports "5N7694"] ;# Bank 28 VCCO - VCC1V8 - IO_L18P_T2U_N10_AD2P_28 +#set_property IOSTANDARD LVCMOSxx [get_ports "5N7694"] ;# Bank 28 VCCO - VCC1V8 - IO_L18P_T2U_N10_AD2P_28 +#set_property PACKAGE_PIN C23 [get_ports "5N7693"] ;# Bank 28 VCCO - VCC1V8 - IO_L17N_T2U_N9_AD10N_28 +#set_property IOSTANDARD LVCMOSxx [get_ports "5N7693"] ;# Bank 28 VCCO - VCC1V8 - IO_L17N_T2U_N9_AD10N_28 +#set_property PACKAGE_PIN D22 [get_ports "5N7690"] ;# Bank 28 VCCO - VCC1V8 - IO_L17P_T2U_N8_AD10P_28 +#set_property IOSTANDARD LVCMOSxx [get_ports "5N7690"] ;# Bank 28 VCCO - VCC1V8 - IO_L17P_T2U_N8_AD10P_28 +#set_property PACKAGE_PIN D24 [get_ports "5N7688"] ;# Bank 28 VCCO - VCC1V8 - IO_L16N_T2U_N7_QBC_AD3N_28 +#set_property IOSTANDARD LVCMOSxx [get_ports "5N7688"] ;# Bank 28 VCCO - VCC1V8 - IO_L16N_T2U_N7_QBC_AD3N_28 +#set_property PACKAGE_PIN E24 [get_ports "5N7682"] ;# Bank 28 VCCO - VCC1V8 - IO_L16P_T2U_N6_QBC_AD3P_28 +#set_property IOSTANDARD LVCMOSxx [get_ports "5N7682"] ;# Bank 28 VCCO - VCC1V8 - IO_L16P_T2U_N6_QBC_AD3P_28 +#set_property PACKAGE_PIN C22 [get_ports "5N7681"] ;# Bank 28 VCCO - VCC1V8 - IO_L15N_T2L_N5_AD11N_28 +#set_property IOSTANDARD LVCMOSxx [get_ports "5N7681"] ;# Bank 28 VCCO - VCC1V8 - IO_L15N_T2L_N5_AD11N_28 +#set_property PACKAGE_PIN C21 [get_ports "5N7678"] ;# Bank 28 VCCO - VCC1V8 - IO_L15P_T2L_N4_AD11P_28 +#set_property IOSTANDARD LVCMOSxx [get_ports "5N7678"] ;# Bank 28 VCCO - VCC1V8 - IO_L15P_T2L_N4_AD11P_28 +#set_property PACKAGE_PIN G24 [get_ports "5N7676"] ;# Bank 28 VCCO - VCC1V8 - IO_L14N_T2L_N3_GC_28 +#set_property IOSTANDARD LVCMOSxx [get_ports "5N7676"] ;# Bank 28 VCCO - VCC1V8 - IO_L14N_T2L_N3_GC_28 +#set_property PACKAGE_PIN G23 [get_ports "5N7672"] ;# Bank 28 VCCO - VCC1V8 - IO_L14P_T2L_N2_GC_28 +#set_property IOSTANDARD LVCMOSxx [get_ports "5N7672"] ;# Bank 28 VCCO - VCC1V8 - IO_L14P_T2L_N2_GC_28 +#set_property PACKAGE_PIN F20 [get_ports "5N7532"] ;# Bank 28 VCCO - VCC1V8 - IO_L10N_T1U_N7_QBC_AD4N_28 +#set_property IOSTANDARD LVCMOSxx [get_ports "5N7532"] ;# Bank 28 VCCO - VCC1V8 - IO_L10N_T1U_N7_QBC_AD4N_28 +#set_property PACKAGE_PIN G20 [get_ports "5N7533"] ;# Bank 28 VCCO - VCC1V8 - IO_L10P_T1U_N6_QBC_AD4P_28 +#set_property IOSTANDARD LVCMOSxx [get_ports "5N7533"] ;# Bank 28 VCCO - VCC1V8 - IO_L10P_T1U_N6_QBC_AD4P_28 +#set_property PACKAGE_PIN D21 [get_ports "5N7524"] ;# Bank 28 VCCO - VCC1V8 - IO_L9N_T1L_N5_AD12N_28 +#set_property IOSTANDARD LVCMOSxx [get_ports "5N7524"] ;# Bank 28 VCCO - VCC1V8 - IO_L9N_T1L_N5_AD12N_28 +#set_property PACKAGE_PIN D20 [get_ports "5N7525"] ;# Bank 28 VCCO - VCC1V8 - IO_L9P_T1L_N4_AD12P_28 +#set_property IOSTANDARD LVCMOSxx [get_ports "5N7525"] ;# Bank 28 VCCO - VCC1V8 - IO_L9P_T1L_N4_AD12P_28 +#set_property PACKAGE_PIN H22 [get_ports "5N7520"] ;# Bank 28 VCCO - VCC1V8 - IO_L8N_T1L_N3_AD5N_28 +#set_property IOSTANDARD LVCMOSxx [get_ports "5N7520"] ;# Bank 28 VCCO - VCC1V8 - IO_L8N_T1L_N3_AD5N_28 +#set_property PACKAGE_PIN H21 [get_ports "5N7521"] ;# Bank 28 VCCO - VCC1V8 - IO_L8P_T1L_N2_AD5P_28 +#set_property IOSTANDARD LVCMOSxx [get_ports "5N7521"] ;# Bank 28 VCCO - VCC1V8 - IO_L8P_T1L_N2_AD5P_28 +#set_property PACKAGE_PIN D19 [get_ports "5N7512"] ;# Bank 28 VCCO - VCC1V8 - IO_L7N_T1L_N1_QBC_AD13N_28 +#set_property IOSTANDARD LVCMOSxx [get_ports "5N7512"] ;# Bank 28 VCCO - VCC1V8 - IO_L7N_T1L_N1_QBC_AD13N_28 +#set_property PACKAGE_PIN E19 [get_ports "5N7513"] ;# Bank 28 VCCO - VCC1V8 - IO_L7P_T1L_N0_QBC_AD13P_28 +#set_property IOSTANDARD LVCMOSxx [get_ports "5N7513"] ;# Bank 28 VCCO - VCC1V8 - IO_L7P_T1L_N0_QBC_AD13P_28 +#set_property PACKAGE_PIN E20 [get_ports "5N7726"] ;# Bank 28 VCCO - VCC1V8 - IO_T1U_N12_28 +#set_property IOSTANDARD LVCMOSxx [get_ports "5N7726"] ;# Bank 28 VCCO - VCC1V8 - IO_T1U_N12_28 +#set_property PACKAGE_PIN H23 [get_ports "5N7508"] ;# Bank 28 VCCO - VCC1V8 - IO_T0U_N12_VRP_28 +#set_property IOSTANDARD LVCMOSxx [get_ports "5N7508"] ;# Bank 28 VCCO - VCC1V8 - IO_T0U_N12_VRP_28 +#set_property PACKAGE_PIN H24 [get_ports "5N7509"] ;# Bank 28 VCCO - VCC1V8 - IO_L6N_T0U_N11_AD6N_28 +#set_property IOSTANDARD LVCMOSxx [get_ports "5N7509"] ;# Bank 28 VCCO - VCC1V8 - IO_L6N_T0U_N11_AD6N_28 +#set_property PACKAGE_PIN J24 [get_ports "5N7500"] ;# Bank 28 VCCO - VCC1V8 - IO_L6P_T0U_N10_AD6P_28 +#set_property IOSTANDARD LVCMOSxx [get_ports "5N7500"] ;# Bank 28 VCCO - VCC1V8 - IO_L6P_T0U_N10_AD6P_28 +#set_property PACKAGE_PIN H26 [get_ports "5N7501"] ;# Bank 28 VCCO - VCC1V8 - IO_L5N_T0U_N9_AD14N_28 +#set_property IOSTANDARD LVCMOSxx [get_ports "5N7501"] ;# Bank 28 VCCO - VCC1V8 - IO_L5N_T0U_N9_AD14N_28 +#set_property PACKAGE_PIN J25 [get_ports "5N7496"] ;# Bank 28 VCCO - VCC1V8 - IO_L5P_T0U_N8_AD14P_28 +#set_property IOSTANDARD LVCMOSxx [get_ports "5N7496"] ;# Bank 28 VCCO - VCC1V8 - IO_L5P_T0U_N8_AD14P_28 +#set_property PACKAGE_PIN K23 [get_ports "5N7497"] ;# Bank 28 VCCO - VCC1V8 - IO_L4N_T0U_N7_DBC_AD7N_28 +#set_property IOSTANDARD LVCMOSxx [get_ports "5N7497"] ;# Bank 28 VCCO - VCC1V8 - IO_L4N_T0U_N7_DBC_AD7N_28 +#set_property PACKAGE_PIN K22 [get_ports "5N7488"] ;# Bank 28 VCCO - VCC1V8 - IO_L4P_T0U_N6_DBC_AD7P_28 +#set_property IOSTANDARD LVCMOSxx [get_ports "5N7488"] ;# Bank 28 VCCO - VCC1V8 - IO_L4P_T0U_N6_DBC_AD7P_28 +#set_property PACKAGE_PIN J22 [get_ports "5N7489"] ;# Bank 28 VCCO - VCC1V8 - IO_L3N_T0L_N5_AD15N_28 +#set_property IOSTANDARD LVCMOSxx [get_ports "5N7489"] ;# Bank 28 VCCO - VCC1V8 - IO_L3N_T0L_N5_AD15N_28 +#set_property PACKAGE_PIN J21 [get_ports "5N7484"] ;# Bank 28 VCCO - VCC1V8 - IO_L3P_T0L_N4_AD15P_28 +#set_property IOSTANDARD LVCMOSxx [get_ports "5N7484"] ;# Bank 28 VCCO - VCC1V8 - IO_L3P_T0L_N4_AD15P_28 +#set_property PACKAGE_PIN K24 [get_ports "5N7485"] ;# Bank 28 VCCO - VCC1V8 - IO_L2N_T0L_N3_28 +#set_property IOSTANDARD LVCMOSxx [get_ports "5N7485"] ;# Bank 28 VCCO - VCC1V8 - IO_L2N_T0L_N3_28 +#set_property PACKAGE_PIN L23 [get_ports "5N7476"] ;# Bank 28 VCCO - VCC1V8 - IO_L2P_T0L_N2_28 +#set_property IOSTANDARD LVCMOSxx [get_ports "5N7476"] ;# Bank 28 VCCO - VCC1V8 - IO_L2P_T0L_N2_28 +#set_property PACKAGE_PIN L22 [get_ports "5N7477"] ;# Bank 28 VCCO - VCC1V8 - IO_L1N_T0L_N1_DBC_28 +#set_property IOSTANDARD LVCMOSxx [get_ports "5N7477"] ;# Bank 28 VCCO - VCC1V8 - IO_L1N_T0L_N1_DBC_28 +#set_property PACKAGE_PIN L21 [get_ports "5N7472"] ;# Bank 28 VCCO - VCC1V8 - IO_L1P_T0L_N0_DBC_28 +#set_property IOSTANDARD LVCMOSxx [get_ports "5N7472"] ;# Bank 28 VCCO - VCC1V8 - IO_L1P_T0L_N0_DBC_28 +#Other net PACKAGE_PIN M23 - 5N7631 Bank 28 - VREF_28 +#set_property PACKAGE_PIN A9 [get_ports "4N9784"] ;# Bank 68 VCCO - VADJ_FMC - IO_T3U_N12_68 +#set_property IOSTANDARD LVCMOSxx [get_ports "4N9784"] ;# Bank 68 VCCO - VADJ_FMC - IO_T3U_N12_68 +#set_property PACKAGE_PIN G13 [get_ports "4N9781"] ;# Bank 68 VCCO - VADJ_FMC - IO_T2U_N12_68 +#set_property IOSTANDARD LVCMOSxx [get_ports "4N9781"] ;# Bank 68 VCCO - VADJ_FMC - IO_T2U_N12_68 +#set_property PACKAGE_PIN G11 [get_ports "4N9820"] ;# Bank 68 VCCO - VADJ_FMC - IO_L13N_T2L_N1_GC_QBC_68 +#set_property IOSTANDARD LVCMOSxx [get_ports "4N9820"] ;# Bank 68 VCCO - VADJ_FMC - IO_L13N_T2L_N1_GC_QBC_68 +#set_property PACKAGE_PIN H11 [get_ports "4N9817"] ;# Bank 68 VCCO - VADJ_FMC - IO_L13P_T2L_N0_GC_QBC_68 +#set_property IOSTANDARD LVCMOSxx [get_ports "4N9817"] ;# Bank 68 VCCO - VADJ_FMC - IO_L13P_T2L_N0_GC_QBC_68 +#set_property PACKAGE_PIN G9 [get_ports "4N9823"] ;# Bank 68 VCCO - VADJ_FMC - IO_L11N_T1U_N9_GC_68 +#set_property IOSTANDARD LVCMOSxx [get_ports "4N9823"] ;# Bank 68 VCCO - VADJ_FMC - IO_L11N_T1U_N9_GC_68 +#set_property PACKAGE_PIN H9 [get_ports "4N9826"] ;# Bank 68 VCCO - VADJ_FMC - IO_L11P_T1U_N8_GC_68 +#set_property IOSTANDARD LVCMOSxx [get_ports "4N9826"] ;# Bank 68 VCCO - VADJ_FMC - IO_L11P_T1U_N8_GC_68 +#set_property PACKAGE_PIN D7 [get_ports "4N9778"] ;# Bank 68 VCCO - VADJ_FMC - IO_T1U_N12_68 +#set_property IOSTANDARD LVCMOSxx [get_ports "4N9778"] ;# Bank 68 VCCO - VADJ_FMC - IO_T1U_N12_68 +#set_property PACKAGE_PIN H14 [get_ports "VRP_68"] ;# Bank 68 VCCO - VADJ_FMC - IO_T0U_N12_VRP_68 +#set_property IOSTANDARD LVCMOSxx [get_ports "VRP_68"] ;# Bank 68 VCCO - VADJ_FMC - IO_T0U_N12_VRP_68 +#set_property PACKAGE_PIN K13 [get_ports "4N9759"] ;# Bank 68 VCCO - VADJ_FMC - IO_L6N_T0U_N11_AD6N_68 +#set_property IOSTANDARD LVCMOSxx [get_ports "4N9759"] ;# Bank 68 VCCO - VADJ_FMC - IO_L6N_T0U_N11_AD6N_68 +#set_property PACKAGE_PIN L14 [get_ports "4N9760"] ;# Bank 68 VCCO - VADJ_FMC - IO_L6P_T0U_N10_AD6P_68 +#set_property IOSTANDARD LVCMOSxx [get_ports "4N9760"] ;# Bank 68 VCCO - VADJ_FMC - IO_L6P_T0U_N10_AD6P_68 +#set_property PACKAGE_PIN J14 [get_ports "4N9755"] ;# Bank 68 VCCO - VADJ_FMC - IO_L5N_T0U_N9_AD14N_68 +#set_property IOSTANDARD LVCMOSxx [get_ports "4N9755"] ;# Bank 68 VCCO - VADJ_FMC - IO_L5N_T0U_N9_AD14N_68 +#set_property PACKAGE_PIN K14 [get_ports "4N9756"] ;# Bank 68 VCCO - VADJ_FMC - IO_L5P_T0U_N8_AD14P_68 +#set_property IOSTANDARD LVCMOSxx [get_ports "4N9756"] ;# Bank 68 VCCO - VADJ_FMC - IO_L5P_T0U_N8_AD14P_68 +#set_property PACKAGE_PIN J11 [get_ports "4N9771"] ;# Bank 68 VCCO - VADJ_FMC - IO_L4N_T0U_N7_DBC_AD7N_68 +#set_property IOSTANDARD LVCMOSxx [get_ports "4N9771"] ;# Bank 68 VCCO - VADJ_FMC - IO_L4N_T0U_N7_DBC_AD7N_68 +#set_property PACKAGE_PIN K12 [get_ports "4N9772"] ;# Bank 68 VCCO - VADJ_FMC - IO_L4P_T0U_N6_DBC_AD7P_68 +#set_property IOSTANDARD LVCMOSxx [get_ports "4N9772"] ;# Bank 68 VCCO - VADJ_FMC - IO_L4P_T0U_N6_DBC_AD7P_68 +#set_property PACKAGE_PIN L11 [get_ports "4N9767"] ;# Bank 68 VCCO - VADJ_FMC - IO_L3N_T0L_N5_AD15N_68 +#set_property IOSTANDARD LVCMOSxx [get_ports "4N9767"] ;# Bank 68 VCCO - VADJ_FMC - IO_L3N_T0L_N5_AD15N_68 +#set_property PACKAGE_PIN L12 [get_ports "4N9768"] ;# Bank 68 VCCO - VADJ_FMC - IO_L3P_T0L_N4_AD15P_68 +#set_property IOSTANDARD LVCMOSxx [get_ports "4N9768"] ;# Bank 68 VCCO - VADJ_FMC - IO_L3P_T0L_N4_AD15P_68 +#Other net PACKAGE_PIN J12 - 4N9503 Bank 68 - VREF_68 +#set_property PACKAGE_PIN J20 [get_ports "7N10213"] ;# Bank 67 VCCO - VADJ_FMC - IO_T3U_N12_67 +#set_property IOSTANDARD LVCMOSxx [get_ports "7N10213"] ;# Bank 67 VCCO - VADJ_FMC - IO_T3U_N12_67 +#set_property PACKAGE_PIN J19 [get_ports "7N10210"] ;# Bank 67 VCCO - VADJ_FMC - IO_T2U_N12_67 +#set_property IOSTANDARD LVCMOSxx [get_ports "7N10210"] ;# Bank 67 VCCO - VADJ_FMC - IO_T2U_N12_67 +#set_property PACKAGE_PIN G16 [get_ports "FMC_LPC_LA09_N"] ;# Bank 67 VCCO - VADJ_FMC - IO_L18N_T2U_N11_AD2N_67 +#set_property PACKAGE_PIN D14 [get_ports "7N10403"] ;# Bank 67 VCCO - VADJ_FMC - IO_L11N_T1U_N9_GC_67 +#set_property IOSTANDARD LVCMOSxx [get_ports "7N10403"] ;# Bank 67 VCCO - VADJ_FMC - IO_L11N_T1U_N9_GC_67 +#set_property PACKAGE_PIN D15 [get_ports "7N10406"] ;# Bank 67 VCCO - VADJ_FMC - IO_L11P_T1U_N8_GC_67 +#set_property IOSTANDARD LVCMOSxx [get_ports "7N10406"] ;# Bank 67 VCCO - VADJ_FMC - IO_L11P_T1U_N8_GC_67 +#set_property PACKAGE_PIN F13 [get_ports "7N10612"] ;# Bank 67 VCCO - VADJ_FMC - IO_L10N_T1U_N7_QBC_AD4N_67 +#set_property IOSTANDARD LVCMOSxx [get_ports "7N10612"] ;# Bank 67 VCCO - VADJ_FMC - IO_L10N_T1U_N7_QBC_AD4N_67 +#set_property PACKAGE_PIN G14 [get_ports "7N10614"] ;# Bank 67 VCCO - VADJ_FMC - IO_L10P_T1U_N6_QBC_AD4P_67 +#set_property IOSTANDARD LVCMOSxx [get_ports "7N10614"] ;# Bank 67 VCCO - VADJ_FMC - IO_L10P_T1U_N6_QBC_AD4P_67 +#set_property PACKAGE_PIN E13 [get_ports "7N10207"] ;# Bank 67 VCCO - VADJ_FMC - IO_T1U_N12_67 +#set_property IOSTANDARD LVCMOSxx [get_ports "7N10207"] ;# Bank 67 VCCO - VADJ_FMC - IO_T1U_N12_67 +#set_property PACKAGE_PIN C14 [get_ports "7N10204"] ;# Bank 67 VCCO - VADJ_FMC - IO_T0U_N12_VRP_67 +#set_property IOSTANDARD LVCMOSxx [get_ports "7N10204"] ;# Bank 67 VCCO - VADJ_FMC - IO_T0U_N12_VRP_67 +#set_property PACKAGE_PIN C12 [get_ports "FMC_LPC_LA14_N"] ;# Bank 67 VCCO - VADJ_FMC - IO_L6N_T0U_N11_AD6N_67 +#set_property PACKAGE_PIN B13 [get_ports "7N10197"] ;# Bank 67 VCCO - VADJ_FMC - IO_L4N_T0U_N7_DBC_AD7N_67 +#set_property IOSTANDARD LVCMOSxx [get_ports "7N10197"] ;# Bank 67 VCCO - VADJ_FMC - IO_L4N_T0U_N7_DBC_AD7N_67 +#set_property PACKAGE_PIN B14 [get_ports "7N10198"] ;# Bank 67 VCCO - VADJ_FMC - IO_L4P_T0U_N6_DBC_AD7P_67 +#set_property IOSTANDARD LVCMOSxx [get_ports "7N10198"] ;# Bank 67 VCCO - VADJ_FMC - IO_L4P_T0U_N6_DBC_AD7P_67 +#set_property PACKAGE_PIN A14 [get_ports "7N10193"] ;# Bank 67 VCCO - VADJ_FMC - IO_L3N_T0L_N5_AD15N_67 +#set_property IOSTANDARD LVCMOSxx [get_ports "7N10193"] ;# Bank 67 VCCO - VADJ_FMC - IO_L3N_T0L_N5_AD15N_67 +#set_property PACKAGE_PIN A15 [get_ports "7N10194"] ;# Bank 67 VCCO - VADJ_FMC - IO_L3P_T0L_N4_AD15P_67 +#set_property IOSTANDARD LVCMOSxx [get_ports "7N10194"] ;# Bank 67 VCCO - VADJ_FMC - IO_L3P_T0L_N4_AD15P_67 +#set_property PACKAGE_PIN B15 [get_ports "7N10185"] ;# Bank 67 VCCO - VADJ_FMC - IO_L2N_T0L_N3_67 +#set_property IOSTANDARD LVCMOSxx [get_ports "7N10185"] ;# Bank 67 VCCO - VADJ_FMC - IO_L2N_T0L_N3_67 +#set_property PACKAGE_PIN B16 [get_ports "7N10186"] ;# Bank 67 VCCO - VADJ_FMC - IO_L2P_T0L_N2_67 +#set_property IOSTANDARD LVCMOSxx [get_ports "7N10186"] ;# Bank 67 VCCO - VADJ_FMC - IO_L2P_T0L_N2_67 +#set_property PACKAGE_PIN A16 [get_ports "7N10181"] ;# Bank 67 VCCO - VADJ_FMC - IO_L1N_T0L_N1_DBC_67 +#set_property IOSTANDARD LVCMOSxx [get_ports "7N10181"] ;# Bank 67 VCCO - VADJ_FMC - IO_L1N_T0L_N1_DBC_67 +#set_property PACKAGE_PIN A17 [get_ports "7N10182"] ;# Bank 67 VCCO - VADJ_FMC - IO_L1P_T0L_N0_DBC_67 +#set_property IOSTANDARD LVCMOSxx [get_ports "7N10182"] ;# Bank 67 VCCO - VADJ_FMC - IO_L1P_T0L_N0_DBC_67 +#Other net PACKAGE_PIN L18 - 7N9719 Bank 67 - VREF_67 +#set_property PACKAGE_PIN AF10 [get_ports "7N10601"] ;# Bank 66 VCCO - VCC1V2 - IO_L19N_T3L_N1_DBC_AD9N_66 +#set_property IOSTANDARD LVCMOSxx [get_ports "7N10601"] ;# Bank 66 VCCO - VCC1V2 - IO_L19N_T3L_N1_DBC_AD9N_66 +#set_property PACKAGE_PIN AC14 [get_ports "7N10603"] ;# Bank 66 VCCO - VCC1V2 - IO_T3U_N12_66 +#set_property IOSTANDARD LVCMOSxx [get_ports "7N10603"] ;# Bank 66 VCCO - VCC1V2 - IO_T3U_N12_66 +#set_property PACKAGE_PIN AH8 [get_ports "7N10599"] ;# Bank 66 VCCO - VCC1V2 - IO_T2U_N12_66 +#set_property IOSTANDARD LVCMOSxx [get_ports "7N10599"] ;# Bank 66 VCCO - VCC1V2 - IO_T2U_N12_66 +#set_property PACKAGE_PIN AJ12 [get_ports "7N10597"] ;# Bank 66 VCCO - VCC1V2 - IO_L13N_T2L_N1_GC_QBC_66 +#set_property IOSTANDARD LVCMOSxx [get_ports "7N10597"] ;# Bank 66 VCCO - VCC1V2 - IO_L13N_T2L_N1_GC_QBC_66 +#set_property PACKAGE_PIN AL13 [get_ports "7N10593"] ;# Bank 66 VCCO - VCC1V2 - IO_L7N_T1L_N1_QBC_AD13N_66 +#set_property IOSTANDARD LVCMOSxx [get_ports "7N10593"] ;# Bank 66 VCCO - VCC1V2 - IO_L7N_T1L_N1_QBC_AD13N_66 +#set_property PACKAGE_PIN AM13 [get_ports "7N10595"] ;# Bank 66 VCCO - VCC1V2 - IO_T1U_N12_66 +#set_property IOSTANDARD LVCMOSxx [get_ports "7N10595"] ;# Bank 66 VCCO - VCC1V2 - IO_T1U_N12_66 +#set_property PACKAGE_PIN AP8 [get_ports "VRP_66"] ;# Bank 66 VCCO - VCC1V2 - IO_T0U_N12_VRP_66 +#set_property IOSTANDARD LVCMOSxx [get_ports "VRP_66"] ;# Bank 66 VCCO - VCC1V2 - IO_T0U_N12_VRP_66 +#set_property PACKAGE_PIN AP12 [get_ports "7N10591"] ;# Bank 66 VCCO - VCC1V2 - IO_L1N_T0L_N1_DBC_66 +#set_property IOSTANDARD LVCMOSxx [get_ports "7N10591"] ;# Bank 66 VCCO - VCC1V2 - IO_L1N_T0L_N1_DBC_66 +#Other net PACKAGE_PIN AB12 - 7N8282 Bank 66 - VREF_66 +#set_property PACKAGE_PIN AE19 [get_ports "6N12439"] ;# Bank 65 VCCO - VCC1V2 - IO_L19N_T3L_N1_DBC_AD9N_65 +#set_property IOSTANDARD LVCMOSxx [get_ports "6N12439"] ;# Bank 65 VCCO - VCC1V2 - IO_L19N_T3L_N1_DBC_AD9N_65 +#set_property PACKAGE_PIN AE22 [get_ports "6N12442"] ;# Bank 65 VCCO - VCC1V2 - IO_T3U_N12_65 +#set_property IOSTANDARD LVCMOSxx [get_ports "6N12442"] ;# Bank 65 VCCO - VCC1V2 - IO_T3U_N12_65 +#set_property PACKAGE_PIN AF20 [get_ports "6N12436"] ;# Bank 65 VCCO - VCC1V2 - IO_T2U_N12_65 +#set_property IOSTANDARD LVCMOSxx [get_ports "6N12436"] ;# Bank 65 VCCO - VCC1V2 - IO_T2U_N12_65 +#set_property PACKAGE_PIN AH23 [get_ports "6N12433"] ;# Bank 65 VCCO - VCC1V2 - IO_L13N_T2L_N1_GC_QBC_65 +#set_property IOSTANDARD LVCMOSxx [get_ports "6N12433"] ;# Bank 65 VCCO - VCC1V2 - IO_L13N_T2L_N1_GC_QBC_65 +#set_property PACKAGE_PIN AL21 [get_ports "6N12427"] ;# Bank 65 VCCO - VCC1V2 - IO_L7N_T1L_N1_QBC_AD13N_65 +#set_property IOSTANDARD LVCMOSxx [get_ports "6N12427"] ;# Bank 65 VCCO - VCC1V2 - IO_L7N_T1L_N1_QBC_AD13N_65 +#set_property PACKAGE_PIN AH19 [get_ports "6N12430"] ;# Bank 65 VCCO - VCC1V2 - IO_T1U_N12_65 +#set_property IOSTANDARD LVCMOSxx [get_ports "6N12430"] ;# Bank 65 VCCO - VCC1V2 - IO_T1U_N12_65 +#set_property PACKAGE_PIN AM20 [get_ports "VRP_65"] ;# Bank 65 VCCO - VCC1V2 - IO_T0U_N12_VRP_65 +#set_property IOSTANDARD LVCMOSxx [get_ports "VRP_65"] ;# Bank 65 VCCO - VCC1V2 - IO_T0U_N12_VRP_65 +#set_property PACKAGE_PIN AP20 [get_ports "6N12401"] ;# Bank 65 VCCO - VCC1V2 - IO_L1N_T0L_N1_DBC_65 +#set_property IOSTANDARD LVCMOSxx [get_ports "6N12401"] ;# Bank 65 VCCO - VCC1V2 - IO_L1N_T0L_N1_DBC_65 +#Other net PACKAGE_PIN AB20 - 6N11582 Bank 65 - VREF_65 +#set_property PACKAGE_PIN AA17 [get_ports "6N12707"] ;# Bank 64 VCCO - VCC1V2 - IO_T3U_N12_64 +#set_property IOSTANDARD LVCMOSxx [get_ports "6N12707"] ;# Bank 64 VCCO - VCC1V2 - IO_T3U_N12_64 +#set_property PACKAGE_PIN AE17 [get_ports "6N12705"] ;# Bank 64 VCCO - VCC1V2 - IO_L15P_T2L_N4_AD11P_64 +#set_property IOSTANDARD LVCMOSxx [get_ports "6N12705"] ;# Bank 64 VCCO - VCC1V2 - IO_L15P_T2L_N4_AD11P_64 +#set_property PACKAGE_PIN AP14 [get_ports "VRP_64"] ;# Bank 64 VCCO - VCC1V2 - IO_T0U_N12_VRP_64 +#set_property PACKAGE_PIN AP15 [get_ports "6N12788"] ;# Bank 64 VCCO - VCC1V2 - IO_L5N_T0U_N9_AD14N_64 +#set_property IOSTANDARD LVCMOSxx [get_ports "6N12788"] ;# Bank 64 VCCO - VCC1V2 - IO_L5N_T0U_N9_AD14N_64 +#set_property PACKAGE_PIN AP16 [get_ports "6N12789"] ;# Bank 64 VCCO - VCC1V2 - IO_L5P_T0U_N8_AD14P_64 +#set_property IOSTANDARD LVCMOSxx [get_ports "6N12789"] ;# Bank 64 VCCO - VCC1V2 - IO_L5P_T0U_N8_AD14P_64 +#set_property PACKAGE_PIN AN14 [get_ports "6N12782"] ;# Bank 64 VCCO - VCC1V2 - IO_L4N_T0U_N7_DBC_AD7N_64 +#set_property IOSTANDARD LVCMOSxx [get_ports "6N12782"] ;# Bank 64 VCCO - VCC1V2 - IO_L4N_T0U_N7_DBC_AD7N_64 +#set_property PACKAGE_PIN AM14 [get_ports "6N12783"] ;# Bank 64 VCCO - VCC1V2 - IO_L4P_T0U_N6_DBC_AD7P_64 +#set_property IOSTANDARD LVCMOSxx [get_ports "6N12783"] ;# Bank 64 VCCO - VCC1V2 - IO_L4P_T0U_N6_DBC_AD7P_64 +#set_property PACKAGE_PIN AN18 [get_ports "6N12780"] ;# Bank 64 VCCO - VCC1V2 - IO_L3N_T0L_N5_AD15N_64 +#set_property IOSTANDARD LVCMOSxx [get_ports "6N12780"] ;# Bank 64 VCCO - VCC1V2 - IO_L3N_T0L_N5_AD15N_64 +#set_property PACKAGE_PIN AM18 [get_ports "6N12781"] ;# Bank 64 VCCO - VCC1V2 - IO_L3P_T0L_N4_AD15P_64 +#set_property IOSTANDARD LVCMOSxx [get_ports "6N12781"] ;# Bank 64 VCCO - VCC1V2 - IO_L3P_T0L_N4_AD15P_64 +#set_property PACKAGE_PIN AP13 [get_ports "6N12774"] ;# Bank 64 VCCO - VCC1V2 - IO_L2N_T0L_N3_64 +#set_property IOSTANDARD LVCMOSxx [get_ports "6N12774"] ;# Bank 64 VCCO - VCC1V2 - IO_L2N_T0L_N3_64 +#set_property PACKAGE_PIN AN13 [get_ports "6N12775"] ;# Bank 64 VCCO - VCC1V2 - IO_L2P_T0L_N2_64 +#set_property IOSTANDARD LVCMOSxx [get_ports "6N12775"] ;# Bank 64 VCCO - VCC1V2 - IO_L2P_T0L_N2_64 +#set_property PACKAGE_PIN AP17 [get_ports "6N12772"] ;# Bank 64 VCCO - VCC1V2 - IO_L1N_T0L_N1_DBC_64 +#set_property IOSTANDARD LVCMOSxx [get_ports "6N12772"] ;# Bank 64 VCCO - VCC1V2 - IO_L1N_T0L_N1_DBC_64 +#set_property PACKAGE_PIN AP18 [get_ports "6N12773"] ;# Bank 64 VCCO - VCC1V2 - IO_L1P_T0L_N0_DBC_64 +#set_property IOSTANDARD LVCMOSxxn [get_ports "6N12773"] ;# Bank 64 VCCO - VCC1V2 - IO_L1P_T0L_N0_DBC_64 +#Other net PACKAGE_PIN AG16 - 6N11370 Bank 64 - VREF_64 +#Other net PACKAGE_PIN AD9 - MGT1V2 Bank 224 - MGTAVTTRCAL_R +#Other net PACKAGE_PIN A24 - MIO0_QSPI_LWR_CLK Bank 500 - PS_MIO0 +#Other net PACKAGE_PIN C24 - MIO1_QSPI_LWR_DQ1 Bank 500 - PS_MIO1 +#Other net PACKAGE_PIN F26 - 53N7803 Bank 500 - PS_MIO10 +#Other net PACKAGE_PIN B26 - 53N7806 Bank 500 - PS_MIO11 +#Other net PACKAGE_PIN C27 - 53N7809 Bank 500 - PS_MIO12 +#Other net PACKAGE_PIN D27 - 53N7788 Bank 500 - PS_MIO13 +#Other net PACKAGE_PIN A27 - 53N7844 Bank 500 - PS_MIO14 +#Other net PACKAGE_PIN E27 - 53N7842 Bank 500 - PS_MIO15 +#Other net PACKAGE_PIN A28 - MIO16_I2C1_SCL Bank 500 - PS_MIO16 +#Other net PACKAGE_PIN C29 - MIO17_I2C1_SDA Bank 500 - PS_MIO17 +#Other net PACKAGE_PIN F27 - UART0_TXD_MIO18_RXD Bank 500 - PS_MIO18 +#Other net PACKAGE_PIN B28 - UART0_RXD_MIO19_TXD Bank 500 - PS_MIO19 +#Other net PACKAGE_PIN B24 - MIO2_QSPI_LWR_DQ2 Bank 500 - PS_MIO2 +#Other net PACKAGE_PIN E29 - UART1_RXD_MIO20_TXD Bank 500 - PS_MIO20 +#Other net PACKAGE_PIN C28 - UART1_TXD_MIO21_RXD Bank 500 - PS_MIO21 +#Other net PACKAGE_PIN F28 - 53N7824 Bank 500 - PS_MIO22 +#Other net PACKAGE_PIN B29 - 53N7822 Bank 500 - PS_MIO23 +#Other net PACKAGE_PIN E28 - MIO24_CAN_TX Bank 500 - PS_MIO24 +#Other net PACKAGE_PIN D29 - MIO25_CAN_RX Bank 500 - PS_MIO25 +#Other net PACKAGE_PIN E25 - MIO3_QSPI_LWR_DQ3 Bank 500 - PS_MIO3 +#Other net PACKAGE_PIN A25 - MIO4_QSPI_LWR_DQ0 Bank 500 - PS_MIO4 +#Other net PACKAGE_PIN D25 - MIO5_QSPI_LWR_CS_B Bank 500 - PS_MIO5 +#Other net PACKAGE_PIN A26 - 53N6816 Bank 500 - PS_MIO6 +#Other net PACKAGE_PIN B25 - 53N7794 Bank 500 - PS_MIO7 +#Other net PACKAGE_PIN D26 - 53N7797 Bank 500 - PS_MIO8 +#Other net PACKAGE_PIN C26 - 53N7800 Bank 500 - PS_MIO9 +#Other net PACKAGE_PIN AA25 - PS_SYSMON_AVCC Bank 500 - VCC_PSADC +#Other net PACKAGE_PIN AA24 - PS_SYSMON_AGND Bank 500 - GND_PSADC +#Other net PACKAGE_PIN A29 - 53N7791 Bank 501 - PS_MIO26 +#Other net PACKAGE_PIN A30 - MIO27_DP_AUX_OUT Bank 501 - PS_MIO27 +#Other net PACKAGE_PIN A31 - MIO28_DP_HPD Bank 501 - PS_MIO28 +#Other net PACKAGE_PIN A32 - MIO29_DP_OE Bank 501 - PS_MIO29 +#Other net PACKAGE_PIN A33 - MIO30_DP_AUX_IN Bank 501 - PS_MIO30 +#Other net PACKAGE_PIN B30 - 53N7736 Bank 501 - PS_MIO31 +#Other net PACKAGE_PIN B31 - 53N7739 Bank 501 - PS_MIO32 +#Other net PACKAGE_PIN B33 - 53N7742 Bank 501 - PS_MIO33 +#Other net PACKAGE_PIN B34 - 53N7745 Bank 501 - PS_MIO34 +#Other net PACKAGE_PIN C31 - 53N7748 Bank 501 - PS_MIO35 +#Other net PACKAGE_PIN C32 - 53N7751 Bank 501 - PS_MIO36 +#Other net PACKAGE_PIN C33 - 53N7754 Bank 501 - PS_MIO37 +#Other net PACKAGE_PIN C34 - 53N7768 Bank 501 - PS_MIO38 +#Other net PACKAGE_PIN D30 - 53N7771 Bank 501 - PS_MIO39 +#Other net PACKAGE_PIN D31 - 53N7773 Bank 501 - PS_MIO40 +#Other net PACKAGE_PIN D32 - 53N7775 Bank 501 - PS_MIO41 +#Other net PACKAGE_PIN D34 - 53N7777 Bank 501 - PS_MIO42 +#Other net PACKAGE_PIN E30 - 53N6798 Bank 501 - PS_MIO43 +#Other net PACKAGE_PIN E32 - 53N7783 Bank 501 - PS_MIO44 +#Other net PACKAGE_PIN E33 - MIO45_SDIO_DETECT Bank 501 - PS_MIO45 +#Other net PACKAGE_PIN E34 - MIO46_SDIO_DAT0_R Bank 501 - PS_MIO46 +#Other net PACKAGE_PIN F30 - MIO47_SDIO_DAT1_R Bank 501 - PS_MIO47 +#Other net PACKAGE_PIN F31 - MIO48_SDIO_DAT2_R Bank 501 - PS_MIO48 +#Other net PACKAGE_PIN F32 - MIO49_SDIO_DAT3_R Bank 501 - PS_MIO49 +#Other net PACKAGE_PIN F33 - MIO50_SDIO_CMD_R Bank 501 - PS_MIO50 +#Other net PACKAGE_PIN F34 - MIO51_SDIO_CLK_R Bank 501 - PS_MIO51 +#Other net PACKAGE_PIN G29 - MIO52_USB_CLK Bank 502 - PS_MIO52 +#Other net PACKAGE_PIN G30 - MIO53_USB_DIR Bank 502 - PS_MIO53 +#Other net PACKAGE_PIN G31 - MIO54_USB_DATA2_R Bank 502 - PS_MIO54 +#Other net PACKAGE_PIN G33 - MIO55_USB_NXT Bank 502 - PS_MIO55 +#Other net PACKAGE_PIN G34 - MIO56_USB_DATA0_R Bank 502 - PS_MIO56 +#Other net PACKAGE_PIN H29 - MIO57_USB_DATA1_R Bank 502 - PS_MIO57 +#Other net PACKAGE_PIN H31 - MIO58_USB_STP_R Bank 502 - PS_MIO58 +#Other net PACKAGE_PIN H32 - MIO59_USB_DATA3_R Bank 502 - PS_MIO59 +#Other net PACKAGE_PIN H33 - MIO60_USB_DATA4_R Bank 502 - PS_MIO60 +#Other net PACKAGE_PIN H34 - MIO61_USB_DATA5_R Bank 502 - PS_MIO61 +#Other net PACKAGE_PIN J29 - MIO62_USB_DATA6_R Bank 502 - PS_MIO62 +#Other net PACKAGE_PIN J30 - MIO63_USB_DATA7_R Bank 502 - PS_MIO63 +#Other net PACKAGE_PIN J31 - MIO64_ENET_TX_CLK Bank 502 - PS_MIO64 +#Other net PACKAGE_PIN J32 - MIO65_ENET_TX_D0 Bank 502 - PS_MIO65 +#Other net PACKAGE_PIN J34 - MIO66_ENET_TX_D1 Bank 502 - PS_MIO66 +#Other net PACKAGE_PIN K28 - MIO67_ENET_TX_D2 Bank 502 - PS_MIO67 +#Other net PACKAGE_PIN K29 - MIO68_ENET_TX_D3 Bank 502 - PS_MIO68 +#Other net PACKAGE_PIN K30 - MIO69_ENET_TX_CTRL Bank 502 - PS_MIO69 +#Other net PACKAGE_PIN K31 - MIO70_ENET_RX_CLK Bank 502 - PS_MIO70 +#Other net PACKAGE_PIN K32 - MIO71_ENET_RX_D0 Bank 502 - PS_MIO71 +#Other net PACKAGE_PIN K33 - MIO72_ENET_RX_D1 Bank 502 - PS_MIO72 +#Other net PACKAGE_PIN K34 - MIO73_ENET_RX_D2 Bank 502 - PS_MIO73 +#Other net PACKAGE_PIN L29 - MIO74_ENET_RX_D3 Bank 502 - PS_MIO74 +#Other net PACKAGE_PIN L30 - MIO75_ENET_RX_CTRL Bank 502 - PS_MIO75 +#Other net PACKAGE_PIN L33 - MIO76_ENET_MDC Bank 502 - PS_MIO76 +#Other net PACKAGE_PIN L34 - MIO77_ENET_MDIO Bank 502 - PS_MIO77 +#Other net PACKAGE_PIN N24 - PS_DONE Bank 503 - PS_DONE +#Other net PACKAGE_PIN T25 - PS_ERR_OUT Bank 503 - PS_ERROR_OUT +#Other net PACKAGE_PIN R25 - PS_ERR_STATUS Bank 503 - PS_ERROR_STATUS +#Other net PACKAGE_PIN P24 - PS_INIT_B Bank 503 - PS_INIT_B +#Other net PACKAGE_PIN K27 - FPGA_TCK Bank 503 - PS_JTAG_TCK +#Other net PACKAGE_PIN J27 - FPGA_TDI Bank 503 - PS_JTAG_TDI +#Other net PACKAGE_PIN G28 - FPGA_TDO_FMC_TDI Bank 503 - PS_JTAG_TDO +#Other net PACKAGE_PIN H28 - FPGA_TMS Bank 503 - PS_JTAG_TMS +#Other net PACKAGE_PIN H27 - PS_MODE0 Bank 503 - PS_MODE0 +#Other net PACKAGE_PIN J26 - PS_MODE1 Bank 503 - PS_MODE1 +#Other net PACKAGE_PIN K26 - PS_MODE2 Bank 503 - PS_MODE2 +#Other net PACKAGE_PIN K25 - PS_MODE3 Bank 503 - PS_MODE3 +#Other net PACKAGE_PIN M25 - PS_PADI Bank 503 - PS_PADI +#Other net PACKAGE_PIN L25 - PS_PADO Bank 503 - PS_PADO +#Other net PACKAGE_PIN M24 - PS_POR_B Bank 503 - PS_POR_B +#Other net PACKAGE_PIN T24 - PS_PROG_B Bank 503 - PS_PROG_B +#Other net PACKAGE_PIN R24 - PS_REF_CLK Bank 503 - PS_REF_CLK +#Other net PACKAGE_PIN P25 - PS_SRST_B Bank 503 - PS_SRST_B +#Other net PACKAGE_PIN AN34 - DDR4_A0 Bank 504 - PS_DDR_A0 +#Other net PACKAGE_PIN AM34 - DDR4_A1 Bank 504 - PS_DDR_A1 +#Other net PACKAGE_PIN AG31 - DDR4_A10 Bank 504 - PS_DDR_A10 +#Other net PACKAGE_PIN AF31 - DDR4_A11 Bank 504 - PS_DDR_A11 +#Other net PACKAGE_PIN AG30 - DDR4_A12 Bank 504 - PS_DDR_A12 +#Other net PACKAGE_PIN AF30 - DDR4_A13 Bank 504 - PS_DDR_A13 +#Other net PACKAGE_PIN AG29 - DDR4_A14_WE_B Bank 504 - PS_DDR_A14 +#Other net PACKAGE_PIN AG28 - DDR4_A15_CAS_B Bank 504 - PS_DDR_A15 +#Other net PACKAGE_PIN AF28 - DDR4_A16_RAS_B Bank 504 - PS_DDR_A16 +#Other net PACKAGE_PIN AF26 - 68N6692 Bank 504 - PS_DDR_A17 +#Other net PACKAGE_PIN AM33 - DDR4_A2 Bank 504 - PS_DDR_A2 +#Other net PACKAGE_PIN AL34 - DDR4_A3 Bank 504 - PS_DDR_A3 +#Other net PACKAGE_PIN AL33 - DDR4_A4 Bank 504 - PS_DDR_A4 +#Other net PACKAGE_PIN AK33 - DDR4_A5 Bank 504 - PS_DDR_A5 +#Other net PACKAGE_PIN AK30 - DDR4_A6 Bank 504 - PS_DDR_A6 +#Other net PACKAGE_PIN AJ30 - DDR4_A7 Bank 504 - PS_DDR_A7 +#Other net PACKAGE_PIN AJ31 - DDR4_A8 Bank 504 - PS_DDR_A8 +#Other net PACKAGE_PIN AH31 - DDR4_A9 Bank 504 - PS_DDR_A9 +#Other net PACKAGE_PIN AE25 - DDR4_ACT_B Bank 504 - PS_DDR_ACT_N +#Other net PACKAGE_PIN AB26 - DDR4_ALERT_B Bank 504 - PS_DDR_ALERT_N +#Other net PACKAGE_PIN AE27 - DDR4_BA0 Bank 504 - PS_DDR_BA0 +#Other net PACKAGE_PIN AE28 - DDR4_BA1 Bank 504 - PS_DDR_BA1 +#Other net PACKAGE_PIN AD27 - DDR4_BG0 Bank 504 - PS_DDR_BG0 +#Other net PACKAGE_PIN AF27 - 68N7393 Bank 504 - PS_DDR_BG1 +#Other net PACKAGE_PIN AL31 - DDR4_CK_T Bank 504 - PS_DDR_CK0 +#Other net PACKAGE_PIN AL30 - 68N7399 Bank 504 - PS_DDR_CK1 +#Other net PACKAGE_PIN AN33 - DDR4_CKE Bank 504 - PS_DDR_CKE0 +#Other net PACKAGE_PIN AH32 - 68N7405 Bank 504 - PS_DDR_CKE1 +#Other net PACKAGE_PIN AN32 - DDR4_CK_C Bank 504 - PS_DDR_CK_N0 +#Other net PACKAGE_PIN AL32 - 68N7402 Bank 504 - PS_DDR_CK_N1 +#Other net PACKAGE_PIN AP33 - DDR4_CS_B Bank 504 - PS_DDR_CS_N0 +#Other net PACKAGE_PIN AK32 - 68N7396 Bank 504 - PS_DDR_CS_N1 +#Other net PACKAGE_PIN AN24 - DDR4_DM0 Bank 504 - PS_DDR_DM0 +#Other net PACKAGE_PIN AM29 - DDR4_DM1 Bank 504 - PS_DDR_DM1 +#Other net PACKAGE_PIN AH24 - DDR4_DM2 Bank 504 - PS_DDR_DM2 +#Other net PACKAGE_PIN AJ29 - DDR4_DM3 Bank 504 - PS_DDR_DM3 +#Other net PACKAGE_PIN AD29 - DDR4_DM4 Bank 504 - PS_DDR_DM4 +#Other net PACKAGE_PIN Y29 - DDR4_DM5 Bank 504 - PS_DDR_DM5 +#Other net PACKAGE_PIN AC32 - DDR4_DM6 Bank 504 - PS_DDR_DM6 +#Other net PACKAGE_PIN Y32 - DDR4_DM7 Bank 504 - PS_DDR_DM7 +#Other net PACKAGE_PIN AF34 - 68N7353 Bank 504 - PS_DDR_DM8 +#Other net PACKAGE_PIN AP27 - DDR4_DQ0 Bank 504 - PS_DDR_DQ0 +#Other net PACKAGE_PIN AP25 - DDR4_DQ1 Bank 504 - PS_DDR_DQ1 +#Other net PACKAGE_PIN AP29 - DDR4_DQ10 Bank 504 - PS_DDR_DQ10 +#Other net PACKAGE_PIN AP28 - DDR4_DQ11 Bank 504 - PS_DDR_DQ11 +#Other net PACKAGE_PIN AM31 - DDR4_DQ12 Bank 504 - PS_DDR_DQ12 +#Other net PACKAGE_PIN AP31 - DDR4_DQ13 Bank 504 - PS_DDR_DQ13 +#Other net PACKAGE_PIN AN31 - DDR4_DQ14 Bank 504 - PS_DDR_DQ14 +#Other net PACKAGE_PIN AM30 - DDR4_DQ15 Bank 504 - PS_DDR_DQ15 +#Other net PACKAGE_PIN AF25 - DDR4_DQ16 Bank 504 - PS_DDR_DQ16 +#Other net PACKAGE_PIN AG25 - DDR4_DQ17 Bank 504 - PS_DDR_DQ17 +#Other net PACKAGE_PIN AG26 - DDR4_DQ18 Bank 504 - PS_DDR_DQ18 +#Other net PACKAGE_PIN AJ25 - DDR4_DQ19 Bank 504 - PS_DDR_DQ19 +#Other net PACKAGE_PIN AP26 - DDR4_DQ2 Bank 504 - PS_DDR_DQ2 +#Other net PACKAGE_PIN AG24 - DDR4_DQ20 Bank 504 - PS_DDR_DQ20 +#Other net PACKAGE_PIN AK25 - DDR4_DQ21 Bank 504 - PS_DDR_DQ21 +#Other net PACKAGE_PIN AJ24 - DDR4_DQ22 Bank 504 - PS_DDR_DQ22 +#Other net PACKAGE_PIN AK24 - DDR4_DQ23 Bank 504 - PS_DDR_DQ23 +#Other net PACKAGE_PIN AH28 - DDR4_DQ24 Bank 504 - PS_DDR_DQ24 +#Other net PACKAGE_PIN AH27 - DDR4_DQ25 Bank 504 - PS_DDR_DQ25 +#Other net PACKAGE_PIN AJ27 - DDR4_DQ26 Bank 504 - PS_DDR_DQ26 +#Other net PACKAGE_PIN AK27 - DDR4_DQ27 Bank 504 - PS_DDR_DQ27 +#Other net PACKAGE_PIN AL26 - DDR4_DQ28 Bank 504 - PS_DDR_DQ28 +#Other net PACKAGE_PIN AL27 - DDR4_DQ29 Bank 504 - PS_DDR_DQ29 +#Other net PACKAGE_PIN AM26 - DDR4_DQ3 Bank 504 - PS_DDR_DQ3 +#Other net PACKAGE_PIN AH29 - DDR4_DQ30 Bank 504 - PS_DDR_DQ30 +#Other net PACKAGE_PIN AL28 - DDR4_DQ31 Bank 504 - PS_DDR_DQ31 +#Other net PACKAGE_PIN AB29 - DDR4_DQ32 Bank 504 - PS_DDR_DQ32 +#Other net PACKAGE_PIN AB30 - DDR4_DQ33 Bank 504 - PS_DDR_DQ33 +#Other net PACKAGE_PIN AC29 - DDR4_DQ34 Bank 504 - PS_DDR_DQ34 +#Other net PACKAGE_PIN AD32 - DDR4_DQ35 Bank 504 - PS_DDR_DQ35 +#Other net PACKAGE_PIN AC31 - DDR4_DQ36 Bank 504 - PS_DDR_DQ36 +#Other net PACKAGE_PIN AE30 - DDR4_DQ37 Bank 504 - PS_DDR_DQ37 +#Other net PACKAGE_PIN AC28 - DDR4_DQ38 Bank 504 - PS_DDR_DQ38 +#Other net PACKAGE_PIN AE29 - DDR4_DQ39 Bank 504 - PS_DDR_DQ39 +#Other net PACKAGE_PIN AP24 - DDR4_DQ4 Bank 504 - PS_DDR_DQ4 +#Other net PACKAGE_PIN AC27 - DDR4_DQ40 Bank 504 - PS_DDR_DQ40 +#Other net PACKAGE_PIN AA27 - DDR4_DQ41 Bank 504 - PS_DDR_DQ41 +#Other net PACKAGE_PIN AA28 - DDR4_DQ42 Bank 504 - PS_DDR_DQ42 +#Other net PACKAGE_PIN AB28 - DDR4_DQ43 Bank 504 - PS_DDR_DQ43 +#Other net PACKAGE_PIN W27 - DDR4_DQ44 Bank 504 - PS_DDR_DQ44 +#Other net PACKAGE_PIN W29 - DDR4_DQ45 Bank 504 - PS_DDR_DQ45 +#Other net PACKAGE_PIN W28 - DDR4_DQ46 Bank 504 - PS_DDR_DQ46 +#Other net PACKAGE_PIN V27 - DDR4_DQ47 Bank 504 - PS_DDR_DQ47 +#Other net PACKAGE_PIN AA32 - DDR4_DQ48 Bank 504 - PS_DDR_DQ48 +#Other net PACKAGE_PIN AA33 - DDR4_DQ49 Bank 504 - PS_DDR_DQ49 +#Other net PACKAGE_PIN AL25 - DDR4_DQ5 Bank 504 - PS_DDR_DQ5 +#Other net PACKAGE_PIN AA34 - DDR4_DQ50 Bank 504 - PS_DDR_DQ50 +#Other net PACKAGE_PIN AE34 - DDR4_DQ51 Bank 504 - PS_DDR_DQ51 +#Other net PACKAGE_PIN AD34 - DDR4_DQ52 Bank 504 - PS_DDR_DQ52 +#Other net PACKAGE_PIN AB31 - DDR4_DQ53 Bank 504 - PS_DDR_DQ53 +#Other net PACKAGE_PIN AC34 - DDR4_DQ54 Bank 504 - PS_DDR_DQ54 +#Other net PACKAGE_PIN AC33 - DDR4_DQ55 Bank 504 - PS_DDR_DQ55 +#Other net PACKAGE_PIN AA30 - DDR4_DQ56 Bank 504 - PS_DDR_DQ56 +#Other net PACKAGE_PIN Y30 - DDR4_DQ57 Bank 504 - PS_DDR_DQ57 +#Other net PACKAGE_PIN AA31 - DDR4_DQ58 Bank 504 - PS_DDR_DQ58 +#Other net PACKAGE_PIN W30 - DDR4_DQ59 Bank 504 - PS_DDR_DQ59 +#Other net PACKAGE_PIN AM25 - DDR4_DQ6 Bank 504 - PS_DDR_DQ6 +#Other net PACKAGE_PIN Y33 - DDR4_DQ60 Bank 504 - PS_DDR_DQ60 +#Other net PACKAGE_PIN W33 - DDR4_DQ61 Bank 504 - PS_DDR_DQ61 +#Other net PACKAGE_PIN W34 - DDR4_DQ62 Bank 504 - PS_DDR_DQ62 +#Other net PACKAGE_PIN Y34 - DDR4_DQ63 Bank 504 - PS_DDR_DQ63 +#Other net PACKAGE_PIN AF32 - 68N7356 Bank 504 - PS_DDR_DQ64 +#Other net PACKAGE_PIN AE32 - 68N7359 Bank 504 - PS_DDR_DQ65 +#Other net PACKAGE_PIN AH33 - 68N7362 Bank 504 - PS_DDR_DQ66 +#Other net PACKAGE_PIN AE33 - 68N7364 Bank 504 - PS_DDR_DQ67 +#Other net PACKAGE_PIN AF33 - 68N7368 Bank 504 - PS_DDR_DQ68 +#Other net PACKAGE_PIN AH34 - 68N7370 Bank 504 - PS_DDR_DQ69 +#Other net PACKAGE_PIN AM24 - DDR4_DQ7 Bank 504 - PS_DDR_DQ7 +#Other net PACKAGE_PIN AJ34 - 68N7374 Bank 504 - PS_DDR_DQ70 +#Other net PACKAGE_PIN AK34 - 68N7376 Bank 504 - PS_DDR_DQ71 +#Other net PACKAGE_PIN AM28 - DDR4_DQ8 Bank 504 - PS_DDR_DQ8 +#Other net PACKAGE_PIN AN28 - DDR4_DQ9 Bank 504 - PS_DDR_DQ9 +#Other net PACKAGE_PIN AN27 - DDR4_DQS0_C Bank 504 - PS_DDR_DQS_N0 +#Other net PACKAGE_PIN AP30 - DDR4_DQS1_C Bank 504 - PS_DDR_DQS_N1 +#Other net PACKAGE_PIN AJ26 - DDR4_DQS2_C Bank 504 - PS_DDR_DQS_N2 +#Other net PACKAGE_PIN AK29 - DDR4_DQS3_C Bank 504 - PS_DDR_DQS_N3 +#Other net PACKAGE_PIN AD31 - DDR4_DQS4_C Bank 504 - PS_DDR_DQS_N4 +#Other net PACKAGE_PIN Y28 - DDR4_DQS5_C Bank 504 - PS_DDR_DQS_N5 +#Other net PACKAGE_PIN AB34 - DDR4_DQS6_C Bank 504 - PS_DDR_DQS_N6 +#Other net PACKAGE_PIN W32 - DDR4_DQS7_C Bank 504 - PS_DDR_DQS_N7 +#Other net PACKAGE_PIN AG34 - 68N7350 Bank 504 - PS_DDR_DQS_N8 +#Other net PACKAGE_PIN AN26 - DDR4_DQS0_T Bank 504 - PS_DDR_DQS_P0 +#Other net PACKAGE_PIN AN29 - DDR4_DQS1_T Bank 504 - PS_DDR_DQS_P1 +#Other net PACKAGE_PIN AH26 - DDR4_DQS2_T Bank 504 - PS_DDR_DQS_P2 +#Other net PACKAGE_PIN AK28 - DDR4_DQS3_T Bank 504 - PS_DDR_DQS_P3 +#Other net PACKAGE_PIN AD30 - DDR4_DQS4_T Bank 504 - PS_DDR_DQS_P4 +#Other net PACKAGE_PIN Y27 - DDR4_DQS5_T Bank 504 - PS_DDR_DQS_P5 +#Other net PACKAGE_PIN AB33 - DDR4_DQS6_T Bank 504 - PS_DDR_DQS_P6 +#Other net PACKAGE_PIN W31 - DDR4_DQS7_T Bank 504 - PS_DDR_DQS_P7 +#Other net PACKAGE_PIN AG33 - 68N7347 Bank 504 - PS_DDR_DQS_P8 +#Other net PACKAGE_PIN AP32 - DDR4_ODT Bank 504 - PS_DDR_ODT0 +#Other net PACKAGE_PIN AJ32 - 68N7408 Bank 504 - PS_DDR_ODT1 +#Other net PACKAGE_PIN AA26 - DDR4_PAR Bank 504 - PS_DDR_PARITY +#Other net PACKAGE_PIN AD26 - DDR4_RESET_B Bank 504 - PS_DDR_RAM_RST_N +#Other net PACKAGE_PIN AC26 - SODIMM_ZQ Bank 504 - PS_DDR_ZQ +#Other net PACKAGE_PIN U34 - 69N6524 Bank 505 - PS_MGTRRXN0_505 +#Other net PACKAGE_PIN T32 - 69N6530 Bank 505 - PS_MGTRRXN1_505 +#Other net PACKAGE_PIN R34 - GT2_USB0_RX_N Bank 505 - PS_MGTRRXN2_505 +#Other net PACKAGE_PIN N34 - GT3_SATA1_RX_N Bank 505 - PS_MGTRRXN3_505 +#Other net PACKAGE_PIN U33 - 69N6521 Bank 505 - PS_MGTRRXP0_505 +#Other net PACKAGE_PIN T31 - 69N6527 Bank 505 - PS_MGTRRXP1_505 +#Other net PACKAGE_PIN R33 - GT2_USB0_RX_P Bank 505 - PS_MGTRRXP2_505 +#Other net PACKAGE_PIN N33 - GT3_SATA1_RX_P Bank 505 - PS_MGTRRXP3_505 +#Other net PACKAGE_PIN U30 - GT0_DP_TX_N Bank 505 - PS_MGTRTXN0_505 +#Other net PACKAGE_PIN R30 - GT1_DP_TX_N Bank 505 - PS_MGTRTXN1_505 +#Other net PACKAGE_PIN P32 - GT2_USB0_TX_N Bank 505 - PS_MGTRTXN2_505 +#Other net PACKAGE_PIN N30 - GT3_SATA1_TX_N Bank 505 - PS_MGTRTXN3_505 +#Other net PACKAGE_PIN U29 - GT0_DP_TX_P Bank 505 - PS_MGTRTXP0_505 +#Other net PACKAGE_PIN R29 - GT1_DP_TX_P Bank 505 - PS_MGTRTXP1_505 +#Other net PACKAGE_PIN P31 - GT2_USB0_TX_P Bank 505 - PS_MGTRTXP2_505 +#Other net PACKAGE_PIN N29 - GT3_SATA1_TX_P Bank 505 - PS_MGTRTXP3_505 +#Other net PACKAGE_PIN T28 - 69N6536 Bank 505 - PS_MGTREFCLK0N_505 +#Other net PACKAGE_PIN T27 - 69N6533 Bank 505 - PS_MGTREFCLK0P_505 +#Other net PACKAGE_PIN P28 - GTR_REF_CLK_SATA_C_N Bank 505 - PS_MGTREFCLK1N_505 +#Other net PACKAGE_PIN P27 - GTR_REF_CLK_SATA_C_P Bank 505 - PS_MGTREFCLK1P_505 +#Other net PACKAGE_PIN M28 - GTR_REF_CLK_USB3_C_N Bank 505 - PS_MGTREFCLK2N_505 +#Other net PACKAGE_PIN M27 - GTR_REF_CLK_USB3_C_P Bank 505 - PS_MGTREFCLK2P_505 +#Other net PACKAGE_PIN M32 - GTR_REF_CLK_DP_C_N Bank 505 - PS_MGTREFCLK3N_505 +#Other net PACKAGE_PIN M31 - GTR_REF_CLK_DP_C_P Bank 505 - PS_MGTREFCLK3P_505 +#Other net PACKAGE_PIN U31 - 69N5804 Bank 505 - PS_MGTRREF_505 +#Other net PACKAGE_PIN AE16 - VCC1V2 Bank 64 - VCCO_64 +#Other net PACKAGE_PIN AH15 - VCC1V2 Bank 64 - VCCO_64 +#Other net PACKAGE_PIN AJ18 - VCC1V2 Bank 64 - VCCO_64 +#Other net PACKAGE_PIN AF19 - VCC1V2 Bank 65 - VCCO_65 +#Other net PACKAGE_PIN AG22 - VCC1V2 Bank 65 - VCCO_65 +#Other net PACKAGE_PIN AK21 - VCC1V2 Bank 65 - VCCO_65 +#Other net PACKAGE_PIN AF9 - VCC1V2 Bank 66 - VCCO_66 +#Other net PACKAGE_PIN AG12 - VCC1V2 Bank 66 - VCCO_66 +#Other net PACKAGE_PIN AK11 - VCC1V2 Bank 66 - VCCO_66 +#Other net PACKAGE_PIN E21 - VCC1V8 Bank 28 - VCCO_28 +#Other net PACKAGE_PIN F24 - VCC1V8 Bank 28 - VCCO_28 +#Other net PACKAGE_PIN H20 - VCC1V8 Bank 28 - VCCO_28 +#Other net PACKAGE_PIN D13 - VADJ_FMC Bank 67 - VCCO_67 +#Other net PACKAGE_PIN E16 - VADJ_FMC Bank 67 - VCCO_67 +#Other net PACKAGE_PIN H15 - VADJ_FMC Bank 67 - VCCO_67 +#Other net PACKAGE_PIN F9 - VADJ_FMC Bank 68 - VCCO_68 +#Other net PACKAGE_PIN G12 - VADJ_FMC Bank 68 - VCCO_68 +#Other net PACKAGE_PIN K11 - VADJ_FMC Bank 68 - VCCO_68 +#Other net PACKAGE_PIN J8 - VCC3V3 Bank 87 - VCCO_87 +#Other net PACKAGE_PIN N10 - VCC3V3 Bank 87 - VCCO_87 +#Other net PACKAGE_PIN D3 - VCC3V3 Bank 88 - VCCO_88 +#Other net PACKAGE_PIN E6 - VCC3V3 Bank 88 - VCCO_88 +#Other net PACKAGE_PIN C25 - VCC1V8 Bank 500 - VCCO_PSIO0_500 +#Other net PACKAGE_PIN D28 - VCC1V8 Bank 500 - VCCO_PSIO0_500 +#Other net PACKAGE_PIN B32 - VCC1V8 Bank 501 - VCCO_PSIO1_501 +#Other net PACKAGE_PIN E31 - VCC1V8 Bank 501 - VCCO_PSIO1_501 +#Other net PACKAGE_PIN H30 - VCC1V8 Bank 502 - VCCO_PSIO2_502 +#Other net PACKAGE_PIN J33 - VCC1V8 Bank 502 - VCCO_PSIO2_502 +#Other net PACKAGE_PIN G27 - VCC1V8 Bank 503 - VCCO_PSIO3_503 +#Other net PACKAGE_PIN N25 - VCC1V8 Bank 503 - VCCO_PSIO3_503 +#Other net PACKAGE_PIN AE26 - VCC1V2 Bank 504 - VCCO_PSDDR_504 +#Other net PACKAGE_PIN AE31 - VCC1V2 Bank 504 - VCCO_PSDDR_504 +#Other net PACKAGE_PIN AG27 - VCC1V2 Bank 504 - VCCO_PSDDR_504 +#Other net PACKAGE_PIN AG32 - VCC1V2 Bank 504 - VCCO_PSDDR_504 +#Other net PACKAGE_PIN AJ28 - VCC1V2 Bank 504 - VCCO_PSDDR_504 +#Other net PACKAGE_PIN AJ33 - VCC1V2 Bank 504 - VCCO_PSDDR_504 +#Other net PACKAGE_PIN AL29 - VCC1V2 Bank 504 - VCCO_PSDDR_504 +#Other net PACKAGE_PIN A1 - GND Bank 999 - GND +#Other net PACKAGE_PIN A34 - GND Bank 999 - GND +#Other net PACKAGE_PIN A4 - GND Bank 999 - GND +#Other net PACKAGE_PIN AA11 - GND Bank 999 - GND +#Other net PACKAGE_PIN AA21 - GND Bank 999 - GND +#Other net PACKAGE_PIN AA29 - GND Bank 999 - GND +#Other net PACKAGE_PIN AA3 - GND Bank 999 - GND +#Other net PACKAGE_PIN AA4 - GND Bank 999 - GND +#Other net PACKAGE_PIN AA7 - GND Bank 999 - GND +#Other net PACKAGE_PIN AB1 - GND Bank 999 - GND +#Other net PACKAGE_PIN AB11 - GND Bank 999 - GND +#Other net PACKAGE_PIN AB17 - GND Bank 999 - GND +#Other net PACKAGE_PIN AB2 - GND Bank 999 - GND +#Other net PACKAGE_PIN AB27 - GND Bank 999 - GND +#Other net PACKAGE_PIN AB32 - GND Bank 999 - GND +#Other net PACKAGE_PIN AB5 - GND Bank 999 - GND +#Other net PACKAGE_PIN AB9 - GND Bank 999 - GND +#Other net PACKAGE_PIN AC11 - GND Bank 999 - GND +#Other net PACKAGE_PIN AC15 - GND Bank 999 - GND +#Other net PACKAGE_PIN AC20 - GND Bank 999 - GND +#Other net PACKAGE_PIN AC23 - GND Bank 999 - GND +#Other net PACKAGE_PIN AC3 - GND Bank 999 - GND +#Other net PACKAGE_PIN AC30 - GND Bank 999 - GND +#Other net PACKAGE_PIN AC4 - GND Bank 999 - GND +#Other net PACKAGE_PIN AC7 - GND Bank 999 - GND +#Other net PACKAGE_PIN AD1 - GND Bank 999 - GND +#Other net PACKAGE_PIN AD11 - GND Bank 999 - GND +#Other net PACKAGE_PIN AD13 - GND Bank 999 - GND +#Other net PACKAGE_PIN AD18 - GND Bank 999 - GND +#Other net PACKAGE_PIN AD2 - GND Bank 999 - GND +#Other net PACKAGE_PIN AD25 - GND Bank 999 - GND +#Other net PACKAGE_PIN AD28 - GND Bank 999 - GND +#Other net PACKAGE_PIN AD33 - GND Bank 999 - GND +#Other net PACKAGE_PIN AD5 - GND Bank 999 - GND +#Other net PACKAGE_PIN AE10 - GND Bank 999 - GND +#Other net PACKAGE_PIN AE11 - GND Bank 999 - GND +#Other net PACKAGE_PIN AE21 - GND Bank 999 - GND +#Other net PACKAGE_PIN AE3 - GND Bank 999 - GND +#Other net PACKAGE_PIN AE4 - GND Bank 999 - GND +#Other net PACKAGE_PIN AE7 - GND Bank 999 - GND +#Other net PACKAGE_PIN AE8 - GND Bank 999 - GND +#Other net PACKAGE_PIN AE9 - GND Bank 999 - GND +#Other net PACKAGE_PIN AF1 - GND Bank 999 - GND +#Other net PACKAGE_PIN AF14 - GND Bank 999 - GND +#Other net PACKAGE_PIN AF2 - GND Bank 999 - GND +#Other net PACKAGE_PIN AF24 - GND Bank 999 - GND +#Other net PACKAGE_PIN AF29 - GND Bank 999 - GND +#Other net PACKAGE_PIN AF5 - GND Bank 999 - GND +#Other net PACKAGE_PIN AF7 - GND Bank 999 - GND +#Other net PACKAGE_PIN AG17 - GND Bank 999 - GND +#Other net PACKAGE_PIN AG3 - GND Bank 999 - GND +#Other net PACKAGE_PIN AG4 - GND Bank 999 - GND +#Other net PACKAGE_PIN AG7 - GND Bank 999 - GND +#Other net PACKAGE_PIN AH1 - GND Bank 999 - GND +#Other net PACKAGE_PIN AH10 - GND Bank 999 - GND +#Other net PACKAGE_PIN AH2 - GND Bank 999 - GND +#Other net PACKAGE_PIN AH20 - GND Bank 999 - GND +#Other net PACKAGE_PIN AH25 - GND Bank 999 - GND +#Other net PACKAGE_PIN AH30 - GND Bank 999 - GND +#Other net PACKAGE_PIN AH5 - GND Bank 999 - GND +#Other net PACKAGE_PIN AH7 - GND Bank 999 - GND +#Other net PACKAGE_PIN AJ13 - GND Bank 999 - GND +#Other net PACKAGE_PIN AJ23 - GND Bank 999 - GND +#Other net PACKAGE_PIN AJ3 - GND Bank 999 - GND +#Other net PACKAGE_PIN AJ4 - GND Bank 999 - GND +#Other net PACKAGE_PIN AJ7 - GND Bank 999 - GND +#Other net PACKAGE_PIN AJ8 - GND Bank 999 - GND +#Other net PACKAGE_PIN AK1 - GND Bank 999 - GND +#Other net PACKAGE_PIN AK16 - GND Bank 999 - GND +#Other net PACKAGE_PIN AK2 - GND Bank 999 - GND +#Other net PACKAGE_PIN AK26 - GND Bank 999 - GND +#Other net PACKAGE_PIN AK31 - GND Bank 999 - GND +#Other net PACKAGE_PIN AK5 - GND Bank 999 - GND +#Other net PACKAGE_PIN AK7 - GND Bank 999 - GND +#Other net PACKAGE_PIN AL14 - GND Bank 999 - GND +#Other net PACKAGE_PIN AL19 - GND Bank 999 - GND +#Other net PACKAGE_PIN AL24 - GND Bank 999 - GND +#Other net PACKAGE_PIN AL3 - GND Bank 999 - GND +#Other net PACKAGE_PIN AL4 - GND Bank 999 - GND +#Other net PACKAGE_PIN AL7 - GND Bank 999 - GND +#Other net PACKAGE_PIN AL9 - GND Bank 999 - GND +#Other net PACKAGE_PIN AM1 - GND Bank 999 - GND +#Other net PACKAGE_PIN AM12 - GND Bank 999 - GND +#Other net PACKAGE_PIN AM17 - GND Bank 999 - GND +#Other net PACKAGE_PIN AM2 - GND Bank 999 - GND +#Other net PACKAGE_PIN AM22 - GND Bank 999 - GND +#Other net PACKAGE_PIN AM27 - GND Bank 999 - GND +#Other net PACKAGE_PIN AM32 - GND Bank 999 - GND +#Other net PACKAGE_PIN AM5 - GND Bank 999 - GND +#Other net PACKAGE_PIN AM7 - GND Bank 999 - GND +#Other net PACKAGE_PIN AN10 - GND Bank 999 - GND +#Other net PACKAGE_PIN AN15 - GND Bank 999 - GND +#Other net PACKAGE_PIN AN20 - GND Bank 999 - GND +#Other net PACKAGE_PIN AN25 - GND Bank 999 - GND +#Other net PACKAGE_PIN AN3 - GND Bank 999 - GND +#Other net PACKAGE_PIN AN30 - GND Bank 999 - GND +#Other net PACKAGE_PIN AN4 - GND Bank 999 - GND +#Other net PACKAGE_PIN AN7 - GND Bank 999 - GND +#Other net PACKAGE_PIN AP1 - GND Bank 999 - GND +#Other net PACKAGE_PIN AP2 - GND Bank 999 - GND +#Other net PACKAGE_PIN AP34 - GND Bank 999 - GND +#Other net PACKAGE_PIN AP5 - GND Bank 999 - GND +#Other net PACKAGE_PIN AP7 - GND Bank 999 - GND +#Other net PACKAGE_PIN B12 - GND Bank 999 - GND +#Other net PACKAGE_PIN B17 - GND Bank 999 - GND +#Other net PACKAGE_PIN B2 - GND Bank 999 - GND +#Other net PACKAGE_PIN B22 - GND Bank 999 - GND +#Other net PACKAGE_PIN B27 - GND Bank 999 - GND +#Other net PACKAGE_PIN B7 - GND Bank 999 - GND +#Other net PACKAGE_PIN C10 - GND Bank 999 - GND +#Other net PACKAGE_PIN C15 - GND Bank 999 - GND +#Other net PACKAGE_PIN C20 - GND Bank 999 - GND +#Other net PACKAGE_PIN C30 - GND Bank 999 - GND +#Other net PACKAGE_PIN C5 - GND Bank 999 - GND +#Other net PACKAGE_PIN D18 - GND Bank 999 - GND +#Other net PACKAGE_PIN D23 - GND Bank 999 - GND +#Other net PACKAGE_PIN D33 - GND Bank 999 - GND +#Other net PACKAGE_PIN D8 - GND Bank 999 - GND +#Other net PACKAGE_PIN E11 - GND Bank 999 - GND +#Other net PACKAGE_PIN E26 - GND Bank 999 - GND +#Other net PACKAGE_PIN F1 - GND Bank 999 - GND +#Other net PACKAGE_PIN F14 - GND Bank 999 - GND +#Other net PACKAGE_PIN F19 - GND Bank 999 - GND +#Other net PACKAGE_PIN F2 - GND Bank 999 - GND +#Other net PACKAGE_PIN F29 - GND Bank 999 - GND +#Other net PACKAGE_PIN F3 - GND Bank 999 - GND +#Other net PACKAGE_PIN G17 - GND Bank 999 - GND +#Other net PACKAGE_PIN G22 - GND Bank 999 - GND +#Other net PACKAGE_PIN G3 - GND Bank 999 - GND +#Other net PACKAGE_PIN G32 - GND Bank 999 - GND +#Other net PACKAGE_PIN G4 - GND Bank 999 - GND +#Other net PACKAGE_PIN G5 - GND Bank 999 - GND +#Other net PACKAGE_PIN H1 - GND Bank 999 - GND +#Other net PACKAGE_PIN H10 - GND Bank 999 - GND +#Other net PACKAGE_PIN H2 - GND Bank 999 - GND +#Other net PACKAGE_PIN H25 - GND Bank 999 - GND +#Other net PACKAGE_PIN H5 - GND Bank 999 - GND +#Other net PACKAGE_PIN J13 - GND Bank 999 - GND +#Other net PACKAGE_PIN J18 - GND Bank 999 - GND +#Other net PACKAGE_PIN J23 - GND Bank 999 - GND +#Other net PACKAGE_PIN J28 - GND Bank 999 - GND +#Other net PACKAGE_PIN J3 - GND Bank 999 - GND +#Other net PACKAGE_PIN J4 - GND Bank 999 - GND +#Other net PACKAGE_PIN J5 - GND Bank 999 - GND +#Other net PACKAGE_PIN K1 - GND Bank 999 - GND +#Other net PACKAGE_PIN K16 - GND Bank 999 - GND +#Other net PACKAGE_PIN K2 - GND Bank 999 - GND +#Other net PACKAGE_PIN K21 - GND Bank 999 - GND +#Other net PACKAGE_PIN K5 - GND Bank 999 - GND +#Other net PACKAGE_PIN K6 - GND Bank 999 - GND +#Other net PACKAGE_PIN K7 - GND Bank 999 - GND +#Other net PACKAGE_PIN L19 - GND Bank 999 - GND +#Other net PACKAGE_PIN L24 - GND Bank 999 - GND +#Other net PACKAGE_PIN L26 - GND Bank 999 - GND +#Other net PACKAGE_PIN L27 - GND Bank 999 - GND +#Other net PACKAGE_PIN L28 - GND Bank 999 - GND +#Other net PACKAGE_PIN L3 - GND Bank 999 - GND +#Other net PACKAGE_PIN L31 - GND Bank 999 - GND +#Other net PACKAGE_PIN L32 - GND Bank 999 - GND +#Other net PACKAGE_PIN L4 - GND Bank 999 - GND +#Other net PACKAGE_PIN L7 - GND Bank 999 - GND +#Other net PACKAGE_PIN L9 - GND Bank 999 - GND +#Other net PACKAGE_PIN M1 - GND Bank 999 - GND +#Other net PACKAGE_PIN M14 - GND Bank 999 - GND +#Other net PACKAGE_PIN M16 - GND Bank 999 - GND +#Other net PACKAGE_PIN M18 - GND Bank 999 - GND +#Other net PACKAGE_PIN M2 - GND Bank 999 - GND +#Other net PACKAGE_PIN M20 - GND Bank 999 - GND +#Other net PACKAGE_PIN M22 - GND Bank 999 - GND +#Other net PACKAGE_PIN M26 - GND Bank 999 - GND +#Other net PACKAGE_PIN M29 - GND Bank 999 - GND +#Other net PACKAGE_PIN M30 - GND Bank 999 - GND +#Other net PACKAGE_PIN M33 - GND Bank 999 - GND +#Other net PACKAGE_PIN M34 - GND Bank 999 - GND +#Other net PACKAGE_PIN M5 - GND Bank 999 - GND +#Other net PACKAGE_PIN M7 - GND Bank 999 - GND +#Other net PACKAGE_PIN N15 - GND Bank 999 - GND +#Other net PACKAGE_PIN N17 - GND Bank 999 - GND +#Other net PACKAGE_PIN N19 - GND Bank 999 - GND +#Other net PACKAGE_PIN N21 - GND Bank 999 - GND +#Other net PACKAGE_PIN N23 - GND Bank 999 - GND +#Other net PACKAGE_PIN N26 - GND Bank 999 - GND +#Other net PACKAGE_PIN N28 - GND Bank 999 - GND +#Other net PACKAGE_PIN N3 - GND Bank 999 - GND +#Other net PACKAGE_PIN N32 - GND Bank 999 - GND +#Other net PACKAGE_PIN N4 - GND Bank 999 - GND +#Other net PACKAGE_PIN N7 - GND Bank 999 - GND +#Other net PACKAGE_PIN P1 - GND Bank 999 - GND +#Other net PACKAGE_PIN P10 - GND Bank 999 - GND +#Other net PACKAGE_PIN P11 - GND Bank 999 - GND +#Other net PACKAGE_PIN P14 - GND Bank 999 - GND +#Other net PACKAGE_PIN P16 - GND Bank 999 - GND +#Other net PACKAGE_PIN P18 - GND Bank 999 - GND +#Other net PACKAGE_PIN P2 - GND Bank 999 - GND +#Other net PACKAGE_PIN P20 - GND Bank 999 - GND +#Other net PACKAGE_PIN P22 - GND Bank 999 - GND +#Other net PACKAGE_PIN P26 - GND Bank 999 - GND +#Other net PACKAGE_PIN P30 - GND Bank 999 - GND +#Other net PACKAGE_PIN P33 - GND Bank 999 - GND +#Other net PACKAGE_PIN P34 - GND Bank 999 - GND +#Other net PACKAGE_PIN P5 - GND Bank 999 - GND +#Other net PACKAGE_PIN P7 - GND Bank 999 - GND +#Other net PACKAGE_PIN P8 - GND Bank 999 - GND +#Other net PACKAGE_PIN P9 - GND Bank 999 - GND +#Other net PACKAGE_PIN R11 - GND Bank 999 - GND +#Other net PACKAGE_PIN R13 - GND Bank 999 - GND +#Other net PACKAGE_PIN R15 - GND Bank 999 - GND +#Other net PACKAGE_PIN R19 - GND Bank 999 - GND +#Other net PACKAGE_PIN R21 - GND Bank 999 - GND +#Other net PACKAGE_PIN R26 - GND Bank 999 - GND +#Other net PACKAGE_PIN R28 - GND Bank 999 - GND +#Other net PACKAGE_PIN R3 - GND Bank 999 - GND +#Other net PACKAGE_PIN R31 - GND Bank 999 - GND +#Other net PACKAGE_PIN R32 - GND Bank 999 - GND +#Other net PACKAGE_PIN R4 - GND Bank 999 - GND +#Other net PACKAGE_PIN R7 - GND Bank 999 - GND +#Other net PACKAGE_PIN T1 - GND Bank 999 - GND +#Other net PACKAGE_PIN T11 - GND Bank 999 - GND +#Other net PACKAGE_PIN T14 - GND Bank 999 - GND +#Other net PACKAGE_PIN T16 - GND Bank 999 - GND +#Other net PACKAGE_PIN T2 - GND Bank 999 - GND +#Other net PACKAGE_PIN T20 - GND Bank 999 - GND +#Other net PACKAGE_PIN T23 - GND Bank 999 - GND +#Other net PACKAGE_PIN T26 - GND Bank 999 - GND +#Other net PACKAGE_PIN T30 - GND Bank 999 - GND +#Other net PACKAGE_PIN T33 - GND Bank 999 - GND +#Other net PACKAGE_PIN T34 - GND Bank 999 - GND +#Other net PACKAGE_PIN T5 - GND Bank 999 - GND +#Other net PACKAGE_PIN T9 - GND Bank 999 - GND +#Other net PACKAGE_PIN U11 - GND Bank 999 - GND +#Other net PACKAGE_PIN U12 - GND Bank 999 - GND +#Other net PACKAGE_PIN U15 - GND Bank 999 - GND +#Other net PACKAGE_PIN U19 - GND Bank 999 - GND +#Other net PACKAGE_PIN U21 - GND Bank 999 - GND +#Other net PACKAGE_PIN U24 - GND Bank 999 - GND +#Other net PACKAGE_PIN U26 - GND Bank 999 - GND +#Other net PACKAGE_PIN U27 - GND Bank 999 - GND +#Other net PACKAGE_PIN U28 - GND Bank 999 - GND +#Other net PACKAGE_PIN U3 - GND Bank 999 - GND +#Other net PACKAGE_PIN U32 - GND Bank 999 - GND +#Other net PACKAGE_PIN U4 - GND Bank 999 - GND +#Other net PACKAGE_PIN U7 - GND Bank 999 - GND +#Other net PACKAGE_PIN V1 - GND Bank 999 - GND +#Other net PACKAGE_PIN V11 - GND Bank 999 - GND +#Other net PACKAGE_PIN V14 - GND Bank 999 - GND +#Other net PACKAGE_PIN V16 - GND Bank 999 - GND +#Other net PACKAGE_PIN V2 - GND Bank 999 - GND +#Other net PACKAGE_PIN V20 - GND Bank 999 - GND +#Other net PACKAGE_PIN V28 - GND Bank 999 - GND +#Other net PACKAGE_PIN V29 - GND Bank 999 - GND +#Other net PACKAGE_PIN V30 - GND Bank 999 - GND +#Other net PACKAGE_PIN V31 - GND Bank 999 - GND +#Other net PACKAGE_PIN V32 - GND Bank 999 - GND +#Other net PACKAGE_PIN V33 - GND Bank 999 - GND +#Other net PACKAGE_PIN V34 - GND Bank 999 - GND +#Other net PACKAGE_PIN V5 - GND Bank 999 - GND +#Other net PACKAGE_PIN V9 - GND Bank 999 - GND +#Other net PACKAGE_PIN W11 - GND Bank 999 - GND +#Other net PACKAGE_PIN W13 - GND Bank 999 - GND +#Other net PACKAGE_PIN W15 - GND Bank 999 - GND +#Other net PACKAGE_PIN W17 - GND Bank 999 - GND +#Other net PACKAGE_PIN W19 - GND Bank 999 - GND +#Other net PACKAGE_PIN W23 - GND Bank 999 - GND +#Other net PACKAGE_PIN W3 - GND Bank 999 - GND +#Other net PACKAGE_PIN W4 - GND Bank 999 - GND +#Other net PACKAGE_PIN W7 - GND Bank 999 - GND +#Other net PACKAGE_PIN Y1 - GND Bank 999 - GND +#Other net PACKAGE_PIN Y11 - GND Bank 999 - GND +#Other net PACKAGE_PIN Y12 - GND Bank 999 - GND +#Other net PACKAGE_PIN Y14 - GND Bank 999 - GND +#Other net PACKAGE_PIN Y16 - GND Bank 999 - GND +#Other net PACKAGE_PIN Y18 - GND Bank 999 - GND +#Other net PACKAGE_PIN Y2 - GND Bank 999 - GND +#Other net PACKAGE_PIN Y20 - GND Bank 999 - GND +#Other net PACKAGE_PIN Y26 - GND Bank 999 - GND +#Other net PACKAGE_PIN Y31 - GND Bank 999 - GND +#Other net PACKAGE_PIN Y5 - GND Bank 999 - GND +#Other net PACKAGE_PIN Y9 - GND Bank 999 - GND +#Other net PACKAGE_PIN AA8 - MGTAVCC Bank 999 - MGTAVCC_R +#Other net PACKAGE_PIN AB10 - MGTAVCC Bank 999 - MGTAVCC_R +#Other net PACKAGE_PIN AC8 - MGTAVCC Bank 999 - MGTAVCC_R +#Other net PACKAGE_PIN R8 - MGTAVCC Bank 999 - MGTAVCC_R +#Other net PACKAGE_PIN T10 - MGTAVCC Bank 999 - MGTAVCC_R +#Other net PACKAGE_PIN U8 - MGTAVCC Bank 999 - MGTAVCC_R +#Other net PACKAGE_PIN W8 - MGTAVCC Bank 999 - MGTAVCC_R +#Other net PACKAGE_PIN AB6 - MGT1V2 Bank 999 - MGTAVTT_R +#Other net PACKAGE_PIN AD6 - MGT1V2 Bank 999 - MGTAVTT_R +#Other net PACKAGE_PIN AF6 - MGT1V2 Bank 999 - MGTAVTT_R +#Other net PACKAGE_PIN AH6 - MGT1V2 Bank 999 - MGTAVTT_R +#Other net PACKAGE_PIN AK6 - MGT1V2 Bank 999 - MGTAVTT_R +#Other net PACKAGE_PIN AM6 - MGT1V2 Bank 999 - MGTAVTT_R +#Other net PACKAGE_PIN AP6 - MGT1V2 Bank 999 - MGTAVTT_R +#Other net PACKAGE_PIN M6 - MGT1V2 Bank 999 - MGTAVTT_R +#Other net PACKAGE_PIN P6 - MGT1V2 Bank 999 - MGTAVTT_R +#Other net PACKAGE_PIN T6 - MGT1V2 Bank 999 - MGTAVTT_R +#Other net PACKAGE_PIN V6 - MGT1V2 Bank 999 - MGTAVTT_R +#Other net PACKAGE_PIN Y6 - MGT1V2 Bank 999 - MGTAVTT_R +#Other net PACKAGE_PIN V10 - MGT1V8 Bank 999 - MGTVCCAUX_R +#Other net PACKAGE_PIN Y10 - MGT1V8 Bank 999 - MGTVCCAUX_R +#Other net PACKAGE_PIN N27 - MGTRAVCC Bank 999 - PS_MGTRAVCC +#Other net PACKAGE_PIN R27 - MGTRAVCC Bank 999 - PS_MGTRAVCC +#Other net PACKAGE_PIN N31 - MGT1V8 Bank 999 - PS_MGTRAVTT +#Other net PACKAGE_PIN P29 - MGT1V8 Bank 999 - PS_MGTRAVTT +#Other net PACKAGE_PIN T29 - MGT1V8 Bank 999 - PS_MGTRAVTT +#Other net PACKAGE_PIN P23 - VCC1V8 Bank 999 - VCCAUX +#Other net PACKAGE_PIN R23 - VCC1V8 Bank 999 - VCCAUX +#Other net PACKAGE_PIN U23 - VCC1V8 Bank 999 - VCCAUX +#Other net PACKAGE_PIN V23 - VCC1V8 Bank 999 - VCCAUX +#Other net PACKAGE_PIN N22 - VCC1V8 Bank 999 - VCCAUX_IO +#Other net PACKAGE_PIN R22 - VCC1V8 Bank 999 - VCCAUX_IO +#Other net PACKAGE_PIN T22 - VCC1V8 Bank 999 - VCCAUX_IO +#Other net PACKAGE_PIN U22 - VCC1V8 Bank 999 - VCCAUX_IO +#Other net PACKAGE_PIN R12 - VCCINT Bank 999 - VCCBRAM +#Other net PACKAGE_PIN T12 - VCCINT Bank 999 - VCCBRAM +#Other net PACKAGE_PIN V12 - VCCINT Bank 999 - VCCBRAM +#Other net PACKAGE_PIN W12 - VCCINT Bank 999 - VCCBRAM +#Other net PACKAGE_PIN M15 - VCCINT Bank 999 - VCCINT +#Other net PACKAGE_PIN M17 - VCCINT Bank 999 - VCCINT +#Other net PACKAGE_PIN M19 - VCCINT Bank 999 - VCCINT +#Other net PACKAGE_PIN M21 - VCCINT Bank 999 - VCCINT +#Other net PACKAGE_PIN N14 - VCCINT Bank 999 - VCCINT +#Other net PACKAGE_PIN N16 - VCCINT Bank 999 - VCCINT +#Other net PACKAGE_PIN N18 - VCCINT Bank 999 - VCCINT +#Other net PACKAGE_PIN N20 - VCCINT Bank 999 - VCCINT +#Other net PACKAGE_PIN P15 - VCCINT Bank 999 - VCCINT +#Other net PACKAGE_PIN P17 - VCCINT Bank 999 - VCCINT +#Other net PACKAGE_PIN P19 - VCCINT Bank 999 - VCCINT +#Other net PACKAGE_PIN P21 - VCCINT Bank 999 - VCCINT +#Other net PACKAGE_PIN R14 - VCCINT Bank 999 - VCCINT +#Other net PACKAGE_PIN R16 - VCCINT Bank 999 - VCCINT +#Other net PACKAGE_PIN R20 - VCCINT Bank 999 - VCCINT +#Other net PACKAGE_PIN T15 - VCCINT Bank 999 - VCCINT +#Other net PACKAGE_PIN T19 - VCCINT Bank 999 - VCCINT +#Other net PACKAGE_PIN T21 - VCCINT Bank 999 - VCCINT +#Other net PACKAGE_PIN U14 - VCCINT Bank 999 - VCCINT +#Other net PACKAGE_PIN U16 - VCCINT Bank 999 - VCCINT +#Other net PACKAGE_PIN U20 - VCCINT Bank 999 - VCCINT +#Other net PACKAGE_PIN V15 - VCCINT Bank 999 - VCCINT +#Other net PACKAGE_PIN V19 - VCCINT Bank 999 - VCCINT +#Other net PACKAGE_PIN V21 - VCCINT Bank 999 - VCCINT +#Other net PACKAGE_PIN W14 - VCCINT Bank 999 - VCCINT +#Other net PACKAGE_PIN W16 - VCCINT Bank 999 - VCCINT +#Other net PACKAGE_PIN W18 - VCCINT Bank 999 - VCCINT +#Other net PACKAGE_PIN W20 - VCCINT Bank 999 - VCCINT +#Other net PACKAGE_PIN Y15 - VCCINT Bank 999 - VCCINT +#Other net PACKAGE_PIN Y17 - VCCINT Bank 999 - VCCINT +#Other net PACKAGE_PIN Y19 - VCCINT Bank 999 - VCCINT +#Other net PACKAGE_PIN P13 - VCCINT Bank 999 - VCCINT_IO +#Other net PACKAGE_PIN T13 - VCCINT Bank 999 - VCCINT_IO +#Other net PACKAGE_PIN U13 - VCCINT Bank 999 - VCCINT_IO +#Other net PACKAGE_PIN V13 - VCCINT Bank 999 - VCCINT_IO +#Other net PACKAGE_PIN Y13 - VCCINT Bank 999 - VCCINT_IO +#Other net PACKAGE_PIN V26 - VCC1V8 Bank 999 - VCC_PSAUX +#Other net PACKAGE_PIN W25 - VCC1V8 Bank 999 - VCC_PSAUX +#Other net PACKAGE_PIN W26 - VCC1V8 Bank 999 - VCC_PSAUX +#Other net PACKAGE_PIN Y25 - VCC1V8 Bank 999 - VCC_PSAUX +#Other net PACKAGE_PIN Y23 - VCC_PSBATT Bank 999 - VCC_PSBATT +#Other net PACKAGE_PIN U25 - VCCPSDDRPLL Bank 999 - VCC_PSDDR_PLL +#Other net PACKAGE_PIN V25 - VCCPSDDRPLL Bank 999 - VCC_PSDDR_PLL +#Other net PACKAGE_PIN AA23 - VCCINT Bank 999 - VCC_PSINTFP +#Other net PACKAGE_PIN AB21 - VCCINT Bank 999 - VCC_PSINTFP +#Other net PACKAGE_PIN AB22 - VCCINT Bank 999 - VCC_PSINTFP +#Other net PACKAGE_PIN AB23 - VCCINT Bank 999 - VCC_PSINTFP +#Other net PACKAGE_PIN AB24 - VCCINT Bank 999 - VCC_PSINTFP +#Other net PACKAGE_PIN AC21 - VCCINT Bank 999 - VCC_PSINTFP +#Other net PACKAGE_PIN AC22 - VCCINT Bank 999 - VCC_PSINTFP +#Other net PACKAGE_PIN AB25 - VCCINT Bank 999 - VCC_PSINTFP_DDR +#Other net PACKAGE_PIN AC24 - VCCINT Bank 999 - VCC_PSINTFP_DDR +#Other net PACKAGE_PIN AC25 - VCCINT Bank 999 - VCC_PSINTFP_DDR +#Other net PACKAGE_PIN AA22 - VCCINT Bank 999 - VCC_PSINTLP +#Other net PACKAGE_PIN V22 - VCCINT Bank 999 - VCC_PSINTLP +#Other net PACKAGE_PIN W21 - VCCINT Bank 999 - VCC_PSINTLP +#Other net PACKAGE_PIN W22 - VCCINT Bank 999 - VCC_PSINTLP +#Other net PACKAGE_PIN Y21 - VCCINT Bank 999 - VCC_PSINTLP +#Other net PACKAGE_PIN Y22 - VCCINT Bank 999 - VCC_PSINTLP +#Other net PACKAGE_PIN V24 - MGT1V2 Bank 999 - VCC_PSPLL +#Other net PACKAGE_PIN W24 - MGT1V2 Bank 999 - VCC_PSPLL +#Other net PACKAGE_PIN Y24 - MGT1V2 Bank 999 - VCC_PSPLL +#Other net PACKAGE_PIN AD21 - VCCINT_VCU Bank 999 - VCCINT_VCU +#Other net PACKAGE_PIN AD22 - VCCINT_VCU Bank 999 - VCCINT_VCU +#Other net PACKAGE_PIN AD23 - VCCINT_VCU Bank 999 - VCCINT_VCU +#Other net PACKAGE_PIN AD24 - VCCINT_VCU Bank 999 - VCCINT_VCU + +set_property IOSTANDARD LVCMOS33 [get_ports PMOD0_0] +set_property IOSTANDARD LVCMOS33 [get_ports PMOD0_1] +set_property IOSTANDARD LVCMOS33 [get_ports PMOD0_2] +set_property IOSTANDARD LVCMOS33 [get_ports PMOD0_3] +set_property IOSTANDARD LVCMOS33 [get_ports PMOD0_4] +set_property IOSTANDARD LVCMOS33 [get_ports PMOD0_5] +set_property IOSTANDARD LVCMOS33 [get_ports PMOD0_6] +set_property IOSTANDARD LVCMOS33 [get_ports PMOD0_7] +set_property PACKAGE_PIN G8 [get_ports PMOD0_0] +set_property PACKAGE_PIN H8 [get_ports PMOD0_1] +set_property PACKAGE_PIN G7 [get_ports PMOD0_2] +set_property PACKAGE_PIN H7 [get_ports PMOD0_3] +set_property PACKAGE_PIN G6 [get_ports PMOD0_4] +set_property PACKAGE_PIN H6 [get_ports PMOD0_5] +set_property PACKAGE_PIN J6 [get_ports PMOD0_6] +set_property PACKAGE_PIN J7 [get_ports PMOD0_7] +set_property PULLUP true [get_ports PMOD0_2] +set_property PULLDOWN true [get_ports PMOD0_3] +set_property PULLUP true [get_ports PMOD0_4] +set_property PULLUP true [get_ports PMOD0_5] +set_property PULLUP true [get_ports PMOD0_6] +set_property PULLUP true [get_ports PMOD0_7] + +set_property CLOCK_DEDICATED_ROUTE FALSE [get_nets PMOD0_7_IBUF_inst/O] + +#set_property IOSTANDARD LVCMOS33 [get_ports PMOD1_0] +#set_property IOSTANDARD LVCMOS33 [get_ports PMOD1_1] +#set_property IOSTANDARD LVCMOS33 [get_ports PMOD1_2] +#set_property IOSTANDARD LVCMOS33 [get_ports PMOD1_3] +#set_property IOSTANDARD LVCMOS33 [get_ports PMOD1_4] +#set_property IOSTANDARD LVCMOS33 [get_ports PMOD1_5] +#set_property IOSTANDARD LVCMOS33 [get_ports PMOD1_6] +#set_property IOSTANDARD LVCMOS33 [get_ports PMOD1_7] +#set_property PACKAGE_PIN J9 [get_ports PMOD1_0] +#set_property PACKAGE_PIN K9 [get_ports PMOD1_1] +#set_property PACKAGE_PIN K8 [get_ports PMOD1_2] +#set_property PACKAGE_PIN L8 [get_ports PMOD1_3] +#set_property PACKAGE_PIN L10 [get_ports PMOD1_4] +#set_property PACKAGE_PIN M10 [get_ports PMOD1_5] +#set_property PACKAGE_PIN M8 [get_ports PMOD1_6] +#set_property PACKAGE_PIN M9 [get_ports PMOD1_7] + +#set_property PULLUP true [get_ports PMOD1_7] +#set_property PULLUP true [get_ports PMOD1_6] +#set_property PULLUP true [get_ports PMOD1_5] +#set_property PULLUP true [get_ports PMOD1_4] +#set_property PULLUP true [get_ports PMOD1_3] +#set_property PULLUP true [get_ports PMOD1_2] +#set_property PULLUP true [get_ports PMOD1_1] +#set_property PULLUP true [get_ports PMOD1_0] + + +#PMODA pin0 to FTCLK +#set_property PACKAGE_PIN K9 [get_ports {P1[1]}] + +#PMODA pin1 to FTSSN +#set_property PACKAGE_PIN L8 [get_ports {P1[3]}] + +#PMODA pin2 to FTMISO +#set_property PACKAGE_PIN J9 [get_ports {P1[0]}] + +#PMODA pin3 to FTMIOSIO +#set_property PACKAGE_PIN K8 [get_ports {P1[2]}] + +#PMODB pin1 to SWDIOTMS +#set_property PACKAGE_PIN G8 [get_ports SWDIOTMS] + +#PMODB pin4 to SWCLKTCK +#set_property PACKAGE_PIN H7 [get_ports SWCLKTCK] +#set_property CLOCK_DEDICATED_ROUTE FALSE [get_nets uPAD_SWDCLK_I/IOBUF3V3/O] + +#PMODA pin4 : UART2RXD +#PMODA pin4 : UART2TXD + + +# LED0 to P0[0] +#set_property PACKAGE_PIN D5 [get_ports {P0[0]}] +# LED1 to P0[1] +#set_property PACKAGE_PIN D6 [get_ports {P0[1]}] +# LED2 to P0[2] +#set_property PACKAGE_PIN A5 [get_ports {P0[2]}] +# LED3 to P0[3] +#set_property PACKAGE_PIN B5 [get_ports {P0[3]}] + +# SW0 to NRST (Down for active low) +#set_property PACKAGE_PIN B4 [get_ports NRST] + +# CLK125MHz (need dvider) +#set_property IOSTANDARD LVCMOS18 [get_ports XTAL1 ] +#set_property PACKAGE_PIN F23 [get_ports XTAL1] + + +## auto mapped - to remap +#set_property PACKAGE_PIN C4 [get_ports {P0[10]}] +#set_property PACKAGE_PIN C3 [get_ports {P0[11]}] +#set_property PACKAGE_PIN B3 [get_ports {P0[12]}] +#set_property PACKAGE_PIN D2 [get_ports {P0[13]}] +#set_property PACKAGE_PIN C2 [get_ports {P0[14]}] +#set_property PACKAGE_PIN E3 [get_ports {P0[15]}] +#set_property PACKAGE_PIN F6 [get_ports {P0[4]}] +#set_property PACKAGE_PIN E5 [get_ports {P0[5]}] +#set_property PACKAGE_PIN F5 [get_ports {P0[6]}] +#set_property PACKAGE_PIN F4 [get_ports {P0[7]}] +#set_property PACKAGE_PIN E4 [get_ports {P0[8]}] +#set_property PACKAGE_PIN D4 [get_ports {P0[9]}] +#set_property PACKAGE_PIN M10 [get_ports {P1[10]}] +#set_property PACKAGE_PIN L10 [get_ports {P1[11]}] +#set_property PACKAGE_PIN M9 [get_ports {P1[12]}] +#set_property PACKAGE_PIN M8 [get_ports {P1[13]}] +#set_property PACKAGE_PIN N11 [get_ports {P1[14]}] +#set_property PACKAGE_PIN M11 [get_ports {P1[15]}] +#set_property PACKAGE_PIN H8 [get_ports {P1[4]}] +#set_property PACKAGE_PIN G7 [get_ports {P1[5]}] +#set_property PACKAGE_PIN H6 [get_ports {P1[6]}] +#set_property PACKAGE_PIN G6 [get_ports {P1[7]}] +#set_property PACKAGE_PIN J7 [get_ports {P1[8]}] +#set_property PACKAGE_PIN J6 [get_ports {P1[9]}] +#set_property PACKAGE_PIN E2 [get_ports VDD] +#set_property PACKAGE_PIN A3 [get_ports VDDIO] +#set_property PACKAGE_PIN A2 [get_ports VSS] +#set_property PACKAGE_PIN C1 [get_ports VSSIO] +#set_property PACKAGE_PIN B1 [get_ports XTAL2] diff --git a/Cortex-M0/nanosoc/systems/mcu/fpga_imp/target_fpga_zcu104/fpga_synth.tcl b/Cortex-M0/nanosoc/systems/mcu/fpga_imp/target_fpga_zcu104/fpga_synth.tcl new file mode 100644 index 0000000..7e6b0c2 --- /dev/null +++ b/Cortex-M0/nanosoc/systems/mcu/fpga_imp/target_fpga_zcu104/fpga_synth.tcl @@ -0,0 +1 @@ +synth_design -top nanosoc_chip -part xczu7ev-ffvc1156-2-e diff --git a/Cortex-M0/nanosoc/systems/mcu/fpga_imp/target_fpga_zcu104/fpga_timing.xdc b/Cortex-M0/nanosoc/systems/mcu/fpga_imp/target_fpga_zcu104/fpga_timing.xdc new file mode 100644 index 0000000..fe6eb50 --- /dev/null +++ b/Cortex-M0/nanosoc/systems/mcu/fpga_imp/target_fpga_zcu104/fpga_timing.xdc @@ -0,0 +1,95 @@ +################################################################################## +## ## +## ZYNQ timing XDC ## +## ## +################################################################################## + +create_clock -name CLK -period 30 [get_ports xtal_clk_i] +create_clock -name VCLK -period 30 -waveform {5 20} + +create_clock -name SWCLK -period 60 [get_ports swdclk_i] +create_clock -name VSWCLK -period 60 -waveform {5 35} + +set_clock_groups -name async_clk_swclock -asynchronous \ +-group [get_clocks -include_generated_clocks CLK] \ +-group [get_clocks -include_generated_clocks VSWCLK] + +#set_input_delay -clock [get_clocks clk_pl_0] -min -add_delay 20.000 [get_ports {dip_switch_4bits_tri_i[*]}] +#set_input_delay -clock [get_clocks clk_pl_0] -max -add_delay 25.000 [get_ports {dip_switch_4bits_tri_i[*]}] +#set_input_delay -clock [get_clocks clk_pl_0] -min -add_delay 20.000 [get_ports PMOD0_2] +#set_input_delay -clock [get_clocks clk_pl_0] -max -add_delay 25.000 [get_ports PMOD0_2] +#set_input_delay -clock [get_clocks clk_pl_0] -min -add_delay 20.000 [get_ports PMOD0_3] +#set_input_delay -clock [get_clocks clk_pl_0] -max -add_delay 25.000 [get_ports PMOD0_3] +#set_output_delay -clock [get_clocks clk_pl_0] -min -add_delay 5.000 [get_ports {led_4bits_tri_o[*]}] +#set_output_delay -clock [get_clocks CLK] -max -add_delay 25.000 [get_ports {led_4bits_tri_o[*]}] + +set_output_delay -clock [get_clocks CLK] -min -add_delay 5.000 [get_ports {p0_o[0]}] +set_output_delay -clock [get_clocks CLK] -max -add_delay 18.000 [get_ports {p0_o[0]}] +set_output_delay -clock [get_clocks CLK] -min -add_delay 5.000 [get_ports {p0_o[1]}] +set_output_delay -clock [get_clocks CLK] -max -add_delay 18.000 [get_ports {p0_o[1]}] +set_output_delay -clock [get_clocks CLK] -min -add_delay 5.000 [get_ports {p0_o[2]}] +set_output_delay -clock [get_clocks CLK] -max -add_delay 18.000 [get_ports {p0_o[2]}] +set_output_delay -clock [get_clocks CLK] -min -add_delay 5.000 [get_ports {p0_o[3]}] +set_output_delay -clock [get_clocks CLK] -max -add_delay 18.000 [get_ports {p0_o[3]}] +set_output_delay -clock [get_clocks CLK] -min -add_delay 5.000 [get_ports {p0_o[4]}] +set_output_delay -clock [get_clocks CLK] -max -add_delay 18.000 [get_ports {p0_o[4]}] +set_output_delay -clock [get_clocks CLK] -min -add_delay 5.000 [get_ports {p0_o[5]}] +set_output_delay -clock [get_clocks CLK] -max -add_delay 18.000 [get_ports {p0_o[5]}] +set_output_delay -clock [get_clocks CLK] -min -add_delay 5.000 [get_ports {p0_o[6]}] +set_output_delay -clock [get_clocks CLK] -max -add_delay 18.000 [get_ports {p0_o[6]}] +set_output_delay -clock [get_clocks CLK] -min -add_delay 5.000 [get_ports {p0_o[7]}] +set_output_delay -clock [get_clocks CLK] -max -add_delay 18.000 [get_ports {p0_o[7]}] +set_output_delay -clock [get_clocks CLK] -min -add_delay 5.000 [get_ports {p0_o[8]}] +set_output_delay -clock [get_clocks CLK] -max -add_delay 18.000 [get_ports {p0_o[8]}] +set_output_delay -clock [get_clocks CLK] -min -add_delay 5.000 [get_ports {p0_o[9]}] +set_output_delay -clock [get_clocks CLK] -max -add_delay 18.000 [get_ports {p0_o[9]}] +set_output_delay -clock [get_clocks CLK] -min -add_delay 5.000 [get_ports {p0_o[10]}] +set_output_delay -clock [get_clocks CLK] -max -add_delay 18.000 [get_ports {p0_o[10]}] +set_output_delay -clock [get_clocks CLK] -min -add_delay 5.000 [get_ports {p0_o[11]}] +set_output_delay -clock [get_clocks CLK] -max -add_delay 18.000 [get_ports {p0_o[11]}] +set_output_delay -clock [get_clocks CLK] -min -add_delay 5.000 [get_ports {p0_o[12]}] +set_output_delay -clock [get_clocks CLK] -max -add_delay 18.000 [get_ports {p0_o[12]}] +set_output_delay -clock [get_clocks CLK] -min -add_delay 5.000 [get_ports {p0_o[13]}] +set_output_delay -clock [get_clocks CLK] -max -add_delay 18.000 [get_ports {p0_o[13]}] +set_output_delay -clock [get_clocks CLK] -min -add_delay 5.000 [get_ports {p0_o[14]}] +set_output_delay -clock [get_clocks CLK] -max -add_delay 18.000 [get_ports {p0_o[14]}] +set_output_delay -clock [get_clocks CLK] -min -add_delay 5.000 [get_ports {p0_o[15]}] +set_output_delay -clock [get_clocks CLK] -max -add_delay 18.000 [get_ports {p0_o[15]}] + +set_output_delay -clock [get_clocks CLK] -min -add_delay 5.000 [get_ports {p1_o[0]}] +set_output_delay -clock [get_clocks CLK] -max -add_delay 18.000 [get_ports {p1_o[0]}] +set_output_delay -clock [get_clocks CLK] -min -add_delay 5.000 [get_ports {p1_o[1]}] +set_output_delay -clock [get_clocks CLK] -max -add_delay 18.000 [get_ports {p1_o[1]}] +set_output_delay -clock [get_clocks CLK] -min -add_delay 5.000 [get_ports {p1_o[2]}] +set_output_delay -clock [get_clocks CLK] -max -add_delay 18.000 [get_ports {p1_o[2]}] +set_output_delay -clock [get_clocks CLK] -min -add_delay 5.000 [get_ports {p1_o[3]}] +set_output_delay -clock [get_clocks CLK] -max -add_delay 18.000 [get_ports {p1_o[3]}] +set_output_delay -clock [get_clocks CLK] -min -add_delay 5.000 [get_ports {p1_o[4]}] +set_output_delay -clock [get_clocks CLK] -max -add_delay 18.000 [get_ports {p1_o[4]}] +set_output_delay -clock [get_clocks CLK] -min -add_delay 5.000 [get_ports {p1_o[5]}] +set_output_delay -clock [get_clocks CLK] -max -add_delay 18.000 [get_ports {p1_o[5]}] +set_output_delay -clock [get_clocks CLK] -min -add_delay 5.000 [get_ports {p1_o[6]}] +set_output_delay -clock [get_clocks CLK] -max -add_delay 18.000 [get_ports {p1_o[6]}] +set_output_delay -clock [get_clocks CLK] -min -add_delay 5.000 [get_ports {p1_o[7]}] +set_output_delay -clock [get_clocks CLK] -max -add_delay 18.000 [get_ports {p1_o[7]}] +set_output_delay -clock [get_clocks CLK] -min -add_delay 5.000 [get_ports {p1_o[8]}] +set_output_delay -clock [get_clocks CLK] -max -add_delay 18.000 [get_ports {p1_o[8]}] +set_output_delay -clock [get_clocks CLK] -min -add_delay 5.000 [get_ports {p1_o[9]}] +set_output_delay -clock [get_clocks CLK] -max -add_delay 18.000 [get_ports {p1_o[9]}] +set_output_delay -clock [get_clocks CLK] -min -add_delay 5.000 [get_ports {p1_o[10]}] +set_output_delay -clock [get_clocks CLK] -max -add_delay 18.000 [get_ports {p1_o[10]}] +set_output_delay -clock [get_clocks CLK] -min -add_delay 5.000 [get_ports {p1_o[11]}] +set_output_delay -clock [get_clocks CLK] -max -add_delay 18.000 [get_ports {p1_o[11]}] +set_output_delay -clock [get_clocks CLK] -min -add_delay 5.000 [get_ports {p1_o[12]}] +set_output_delay -clock [get_clocks CLK] -max -add_delay 18.000 [get_ports {p1_o[12]}] +set_output_delay -clock [get_clocks CLK] -min -add_delay 5.000 [get_ports {p1_o[13]}] +set_output_delay -clock [get_clocks CLK] -max -add_delay 18.000 [get_ports {p1_o[13]}] +set_output_delay -clock [get_clocks CLK] -min -add_delay 5.000 [get_ports {p1_o[14]}] +set_output_delay -clock [get_clocks CLK] -max -add_delay 18.000 [get_ports {p1_o[14]}] +set_output_delay -clock [get_clocks CLK] -min -add_delay 5.000 [get_ports {p1_o[15]}] +set_output_delay -clock [get_clocks CLK] -max -add_delay 18.000 [get_ports {p1_o[15]}] + +#set_property C_CLK_INPUT_FREQ_HZ 5000000 [get_debug_cores dbg_hub] +#set_property C_ENABLE_CLK_DIVIDER false [get_debug_cores dbg_hub] +#set_property C_USER_SCAN_CHAIN 1 [get_debug_cores dbg_hub] +#connect_debug_port dbg_hub/clk [get_nets clk] diff --git a/Cortex-M0/nanosoc/systems/mcu/rtl_sim/adp.cmd b/Cortex-M0/nanosoc/systems/mcu/rtl_sim/adp.cmd new file mode 100644 index 0000000..d0b75b3 --- /dev/null +++ b/Cortex-M0/nanosoc/systems/mcu/rtl_sim/adp.cmd @@ -0,0 +1,29 @@ +A +A 0 +R +R +A +A +A +a 10000000 +r +r +a 20000000 +r +r +a 30000000 +r +r +a 40006000 +r +r +r +r +a 30000200 +z 400 +A +C 201 + + A +X +! diff --git a/Cortex-M0/nanosoc/systems/mcu/rtl_sim/makefile b/Cortex-M0/nanosoc/systems/mcu/rtl_sim/makefile new file mode 100644 index 0000000..9254704 --- /dev/null +++ b/Cortex-M0/nanosoc/systems/mcu/rtl_sim/makefile @@ -0,0 +1,555 @@ +#----------------------------------------------------------------------------- +# customised simulation makefile +# A joint work commissioned on behalf of SoC Labs, under Arm Academic Access license. +# +# Contributors +# +# David Flynn (d.w.flynn@soton.ac.uk) +# +# Copyright � 2021-3, SoC Labs (www.soclabs.org) +#----------------------------------------------------------------------------- + +#----------------------------------------------------------------------------- +# The confidential and proprietary information contained in this file may +# only be used by a person authorised under and to the extent permitted +# by a subsisting licensing agreement from Arm Limited or its affiliates. +# +# (C) COPYRIGHT 2010-2013 Arm Limited or its affiliates. +# ALL RIGHTS RESERVED +# +# This entire notice must be reproduced on all copies of this file +# and copies of this file may only be made by a person if such person is +# permitted to do so under the terms of a subsisting license agreement +# from Arm Limited or its affiliates. +# +# SVN Information +# +# Checked In : $Date: 2017-10-10 15:55:38 +0100 (Tue, 10 Oct 2017) $ +# +# Revision : $Revision: 371321 $ +# +# Release Information : Cortex-M System Design Kit-r1p1-00rel0 +#----------------------------------------------------------------------------- +# +# Cortex-M0/Cortex-M0+ System Design Kit simulation make file +# +#----------------------------------------------------------------------------- +# +# Configurations +# +# Name of test directory (e.g. hello, dhry) +# TESTNAME must be specified on the make command line +TESTNAME = + +# List of all tests (this is used when running 'make all/clean') +TEST_LIST = hello dhry sleep_demo interrupt_demo dualtimer_demo \ + self_reset_demo watchdog_demo rtx_demo gpio_tests timer_tests \ + uart_tests debug_tests default_slaves_tests dma_tests \ + gpio_driver_tests uart_driver_tests timer_driver_tests apb_mux_tests \ + memory_tests romtable_tests + +# Default to DS-5 tool-chain +TOOL_CHAIN = ds5 + +# Choose the core instantiated, can be either +# - CORTEX_M0PLUS (Cortex-M0+) +# - CORTEX_M0 (Cortex-M0) +# - CORTEX_M0_DS (Cortex-M0 DesignStart version) +# Note: for all processors, make sure that the __MPU_PRESENT variable in the header file agrees with the setting made in +# the processor configuration (refer to Section 4.3.3 of the Example System Guide). The header file is either: +# ../../../software/cmsis/Device/ARM/CMSDK_CM0/Include/CMSDK_CM0.h +# or +# ../../../software/cmsis/Device/ARM/CMSDK_CM0plus/Include/CMSDK_CM0plus.h +# to match the CPU_PRODUCT selected +# Note: for the M0+ processor, make sure that the __VTOR_PRESENT variable in the header file agrees with the setting made in +# the processor configuration (refer to Section 4.3.3 of the Example System Guide). The header file is: +# ../../../software/cmsis/Device/ARM/CMSDK_CM0plus/Include/CMSDK_CM0plus.h +#DF#CPU_PRODUCT = CORTEX_M0PLUS +CPU_PRODUCT = CORTEX_M0 + +# Select Verilog Command File based on CPU type +ifeq ($(CPU_PRODUCT),CORTEX_M0PLUS) + # For Cortex-M0+ product users + TBENCH_VC = ../verilog/tbench_M0P.vc +endif + +# Select Verilog Command File based on CPU type +ifeq ($(CPU_PRODUCT),CORTEX_M0) + # For Cortex-M0 product users + TBENCH_VC = ../verilog/tbench_M0.vc +endif + +ifeq ($(CPU_PRODUCT),CORTEX_M0_DS) + # For Cortex-M0 DesignStart users + TBENCH_VC = ../verilog/tbench_M0_DS.vc +endif + + + +# Simulator type (mti/vcs/nc) +SIMULATOR = mti + +# MTI option +#DF#MTI_OPTIONS = -novopt +MTI_OPTIONS = +MTI_VC_OPTIONS = -f $(TBENCH_VC) + +# VCS option +VCS_OPTIONS = +vcs+lic+wait +v2k +lint=all,noTMR,noVCDE -debug +VCS_SIM_OPTION = +vcs+lic+wait +vcs+flush+log -assert nopostproc +VCS_VC_OPTIONS = -f $(TBENCH_VC) + +# NC verilog option +NCSIM_OPTIONS = -unbuffered -status -LICQUEUE -f ncsim.args -cdslib cds.lib -hdlvar hdl.var -NBASYNC +NC_VC_OPTIONS = -f $(TBENCH_VC) + +# Boot Loader image +BOOTLOADER = bootloader +# Debug Tester image +DEBUGTESTER = debugtester + + +# Software make options +# - Pass onto the software makefile to define targetted CPU type +# You can append additional make options for testcode here +SW_MAKE_OPTIONS = CPU_PRODUCT=$(CPU_PRODUCT) TOOL_CHAIN=$(TOOL_CHAIN) + +# ------- Simulator redirect ----------- + +compile : compile_$(SIMULATOR) + + +run : run_$(SIMULATOR) + + +sim : sim_$(SIMULATOR) + + +all : all_$(SIMULATOR) + +# ------- VCS ----------- + +# Compile RTL +compile_vcs : + vcs $(VCS_OPTIONS) $(VCS_VC_OPTIONS) | tee compile_vcs.log + + +# Run simulation in batch mode +run_vcs : code + @if [ ! -d logs ] ; then \ + mkdir logs; \ + fi + @echo quit > quit.do + ./simv $(VCS_SIM_OPTION) < quit.do | tee logs/run_$(TESTNAME).log ; + +# Run simulation in interactive mode +sim_vcs : code + ./simv -gui +vcs+lic+wait +vcs+flush+log & + +# Compile RTL, and run all tests in batch mode +all_vcs : compile_vcs bootrom debugtester + @if [ ! -d logs ] ; then \ + mkdir logs; \ + fi + @echo quit > quit.do + @echo Run tests ... + for thistest in $(TEST_LIST) ; do \ + echo $$thistest ; \ + make testcode TESTNAME=$$thistest ;\ + if [ -e image.hex ] ; then \ + ./simv +vcs+lic+wait +vcs+flush+log < quit.do | tee logs/run_$$thistest.log ;\ + else \ + echo Cannot read image.hex ;\ + exit 1; \ + fi ; \ + done + +# ------- NC ----------- + +# Compile RTL +compile_nc : + ncprep +overwrite $(NC_VC_OPTIONS) +debug | tee compile_nc.log + ncvlog -work worklib -f ncvlog.args | tee -a compile_nc.log + ncelab -mess -f ncelab.args -access +r | tee -a compile_nc.log + +# Note : If coverage is required, you can add -coverage all to ncelab + +# Run simulation in batch mode +run_nc : code + @if [ ! -d logs ] ; then \ + mkdir logs; \ + fi + @echo run > run.tcl.tmp + @echo exit >> run.tcl.tmp + @mv run.tcl.tmp run.tcl + ncsim $(NCSIM_OPTIONS) -input run.tcl | tee logs/run_$(TESTNAME).log ; + +# Run simulation in interactive mode +sim_nc : code + ncsim -gui $(NCSIM_OPTIONS) + +# Compile RTL, and run all tests in batch mode +all_nc : compile_nc bootrom debugtester + @if [ ! -d logs ] ; then \ + mkdir logs; \ + fi + @echo run > run.tcl.tmp + @echo exit >> run.tcl.tmp + @mv run.tcl.tmp run.tcl + @echo Run tests ... + for thistest in $(TEST_LIST) ; do \ + echo $$thistest ; \ + make testcode TESTNAME=$$thistest ;\ + if [ -e image.hex ] ; then \ + ncsim $(NCSIM_OPTIONS) -input run.tcl | tee logs/run_$$thistest.log ;\ + else \ + echo Cannot read image.hex ;\ + exit 1; \ + fi ; \ + done + +# ------- MTI ----------- + +# Compile RTL +compile_mti : + @if [ -d work ] ; then \ + true ; \ + else \ + vlib work; \ + fi + vlog -incr -lint +v2k $(MTI_OPTIONS) $(MTI_VC_OPTIONS) | tee compile_mti.log + +# Run simulation in batch mode +run_mti : code + @if [ ! -d logs ] ; then \ + mkdir logs; \ + fi + vsim $(MTI_OPTIONS) -c tb_cmsdk_mcu -do "radix hex;run -all;quit -f" | tee logs/run_$(TESTNAME).log ; + +# Run simulation in interactive mode +sim_mti : code + vsim $(MTI_OPTIONS) -gui tb_cmsdk_mcu & + +# Create work directory +lib_mti : + vlib work + +# Compile RTL, and run all tests in batch mode +all_mti : compile_mti bootrom debugtester + @if [ ! -d logs ] ; then \ + mkdir logs; \ + fi + @echo Run tests ... + for thistest in $(TEST_LIST) ; do \ + echo $$thistest ; \ + make testcode TESTNAME=$$thistest ;\ + if [ -e image.hex ] ; then \ + vsim $(MTI_OPTIONS) -c tb_cmsdk_mcu -do "radix hex;run -all;quit -f" | tee logs/run_$$thistest.log ;\ + else \ + echo Cannot read image.hex ;\ + exit 1; \ + fi ; \ + done + +# ------- Software ----------- + +# code target is used by other simulation targets (e.g. run_mti, sim_mti) +# Before simulation, bootrom and testcode need to be compiled. +code : testcode bootrom debugtester + +# Compile bootloader +# Note : The use of ls after compile allows the computing server to sync up +bootrom: + @(cd ../testcodes/$(BOOTLOADER) ;\ + make all $(SW_MAKE_OPTIONS) ;\ + echo Compile done ;\ + ls > /dev/null ;\ + echo Copy $(BOOTLOADER).hex ;\ + if [ -e $(BOOTLOADER).hex ] ; then \ + cp $(BOOTLOADER).hex ../../rtl_sim/$(BOOTLOADER).hex ;\ + else \ + while [ ! -e $(BOOTLOADER).hex ] ; do \ + echo Wait for hex file ...; \ + ls > /dev/null; \ + sleep 5; \ + done; \ + if [ -e $(BOOTLOADER).hex ] ; then \ + cp $(BOOTLOADER).hex ../../rtl_sim/$(BOOTLOADER).hex ;\ + else \ + echo Problem reading hex file ;\ + exit 1; \ + fi ;\ + fi ;\ + cp $(BOOTLOADER).hex ../../rtl_sim/$(BOOTLOADER).hex ;\ + cd ../../rtl_sim ) + +# Compile test code +# Note : The use of ls after compile allows the computing server to sync up +testcode: +ifeq ($(TESTNAME),) + $(error Please specify TESTNAME on the make command line) +endif + @(if [ -d "../testcodes/$(TESTNAME)" ] ; then \ + cd ../testcodes/$(TESTNAME) ;\ + make all $(SW_MAKE_OPTIONS) ; \ + echo Compile done ;\ + ls > /dev/null ;\ + echo Copy $(TESTNAME).hex ;\ + if [ -e $(TESTNAME).hex ] ; then \ + cp $(TESTNAME).hex ../../rtl_sim/image.hex ; \ + else \ + while [ ! -e $(TESTNAME).hex ] ; do \ + echo Wait for $(TESTNAME).hex file ...; \ + ls > /dev/null ; \ + sleep 5 ; \ + done; \ + if [ -e $(TESTNAME).hex ] ; then \ + cp $(TESTNAME).hex ../../rtl_sim/image.hex ; \ + else \ + echo Problem reading hex file ;\ + exit 1; \ + fi ;\ + fi ;\ + cd ../../rtl_sim ;\ + else \ + echo "ERROR: invalid TESTNAME value ( $(TESTNAME) )" ;\ + exit 1 ;\ + fi ;\ + ) + + +# Compile debugtester +# Note : The use of ls after compile allows the computing server to sync up +debugtester: + @(cd ../../../software/debug_tester ;\ + make all $(SW_MAKE_OPTIONS) ;\ + echo Compile done ;\ + ls > /dev/null ;\ + echo Copy $(DEBUGTESTER)_le.hex ;\ + if [ -e $(DEBUGTESTER)_le.hex ] ; then \ + cp $(DEBUGTESTER)_le.hex ../../systems/mcu/rtl_sim/$(DEBUGTESTER)_le.hex ;\ + else \ + while [ ! -e $(DEBUGTESTER)_le.hex ] ; do \ + echo Wait for hex file ...; \ + ls > /dev/null ; \ + sleep 5 ; \ + done; \ + if [ -e $(DEBUGTESTER)_le.hex ] ; then \ + cp $(DEBUGTESTER)_le.hex ../../systems/mcu/rtl_sim/$(DEBUGTESTER)_le.hex ;\ + fi ;\ + fi ;\ + echo Copy $(DEBUGTESTER)_be.hex ;\ + if [ -e $(DEBUGTESTER)_be.hex ] ; then \ + cp $(DEBUGTESTER)_be.hex ../../systems/mcu/rtl_sim/$(DEBUGTESTER)_be.hex ;\ + else \ + while [ ! -e $(DEBUGTESTER)_be.hex ] ; do \ + echo Wait for hex file ...;\ + ls > /dev/null ;\ + sleep 5 ; \ + done; \ + if [ -e $(DEBUGTESTER)_be.hex ] ; then \ + cp $(DEBUGTESTER)_be.hex ../../systems/mcu/rtl_sim/$(DEBUGTESTER)_be.hex ;\ + fi ;\ + fi ;\ + if [ ! -e $(DEBUGTESTER)_le.hex ] && [ ! -e $(DEBUGTESTER)_be.hex ] ; then \ + echo Problem reading hex file ;\ + exit 1 ;\ + fi ;\ + cd ../../systems/mcu/rtl_sim ) + +# Compile all software including boot ROM +compile_all_code: bootrom debugtester + for thistest in $(TEST_LIST) ; do \ + echo Compiling $$thistest ; \ + echo Removing old image.hex ;\ + rm -f image.hex ;\ + make testcode TESTNAME=$$thistest;\ + if [ -e image.hex ] ; then \ + echo OK - image.hex created for test $$thistest ;\ + else \ + echo ERROR - image.hex NOT created for test $$thistest ;\ + exit 1; \ + fi ; \ + done + +# ------- document with v2html ----------- + +# +# rm -Rf * +# ../tools/v2html -f ../verilog/v2html_M0.vc -ht cmsdk_mcu_system +# cp -p tb_cmsdk_mcu.v.html hierarchy.html + +v2html: + echo building HTML tree + @if [ ! -d ../v2html_doc ] ; then \ + mkdir ../v2html_doc; \ + fi + @(cd ../v2html_doc; \ + rm *.html; rm *.gif; rm *.gz; \ + ~/tools/v2html -f ../verilog/v2html_M0.vc -ht nanosoc_chip ; \ + cp -p tb_nanosoc.v.html hierarchy.html ; \ + cd ../rtl_sim ; ) + gtar zcvf ../v2html_doc.tgz ../v2html_doc + + +# Remove all software compilation results +clean_all_code: + @(cd ../../../software/debug_tester ; make clean; cd ../../systems/mcu/rtl_sim; ) + @(cd ../testcodes/$(BOOTLOADER) ; make clean; cd ../../rtl_sim; ) + for thistest in $(TEST_LIST) ; do \ + echo Cleaning $$thistest ... ; \ + cd ../testcodes/$$thistest ; \ + make clean; \ + cd ../../rtl_sim; \ + done + +# Remove only bootloader and default selected test +clean_code: + @(cd ../testcodes/$(BOOTLOADER) ; make clean; cd ../../rtl_sim; ) + @(cd ../testcodes/$(TESTNAME) ; make clean; cd ../../rtl_sim; ) + +# ------- clean ----------- + +# Remove RTL compile files, log files, software compile files +clean : clean_all_code + @if [ -d work ] ; then \ + rm -rf work ; \ + fi + @if [ -e tarmac0.log ] ; then \ + rm tarmac0.log ; \ + fi + @if [ -e tarmac1.log ] ; then \ + rm tarmac1.log ; \ + fi + @if [ -e tarmac0track.log ] ; then \ + rm tarmac0track.log ; \ + fi + @if [ -e ft1248_ip.log ] ; then \ + rm ft1248_ip.log ; \ + fi + @if [ -e ft1248_op.log ] ; then \ + rm ft1248_op.log ; \ + fi + @if [ -e uart.log ] ; then \ + rm uart.log ; \ + fi + @if [ -e uart0.log ] ; then \ + rm uart0.log ; \ + fi + @if [ -e uart1.log ] ; then \ + rm uart1.log ; \ + fi + @if [ -e uart2.log ] ; then \ + rm uart2.log ; \ + fi + @if [ -e uart3.log ] ; then \ + rm uart3.log ; \ + fi + @if [ -e vsim.wlf ] ; then \ + rm vsim.wlf ; \ + fi + @if [ -e image.hex ] ; then \ + rm image.hex ; \ + fi + @if [ -e date_file ] ; then \ + rm date_file ; \ + fi + @if [ -e bootrom.v ] ; then \ + rm bootrom.v ; \ + fi + @if [ -e bootrom.bintxt ] ; then \ + rm bootrom.bintxt ; \ + fi + @if [ -e bootloader.hex ] ; then \ + rm bootloader.hex ; \ + fi + @if [ -e debugtester_le.hex ] ; then \ + rm debugtester_le.hex ; \ + fi + @if [ -e debugtester_be.hex ] ; then \ + rm debugtester_be.hex ; \ + fi + @if [ -e compile_mti.log ] ; then \ + rm compile_mti.log ; \ + fi + @if [ -e vish_stacktrace.vstf ] ; then \ + rm vish_stacktrace.vstf ; \ + fi + @if [ -e compile_vcs.log ] ; then \ + rm compile_vcs.log ; \ + fi + @if [ -e compile_nc.log ] ; then \ + rm compile_nc.log ; \ + fi + @if [ -e transcript ] ; then \ + rm transcript ; \ + fi + @if [ -e simv ] ; then \ + rm simv ; \ + fi + @if [ -d csrc ] ; then \ + rm -rf csrc ; \ + fi + @if [ -d simv.daidir ] ; then \ + rm -rf simv.daidir ; \ + fi + @if [ -e inter.vpd ] ; then \ + rm -rf inter.vpd ; \ + fi + @if [ -e quit.do ] ; then \ + rm -rf quit.do ; \ + fi + @if [ -e ucli.key ] ; then \ + rm -rf ucli.key ; \ + fi + @if [ -d DVEfiles ] ; then \ + rm -rf DVEfiles ; \ + fi + @if [ -d INCA_libs ] ; then \ + rm -rf INCA_libs ; \ + fi + @if [ -d cov_work ] ; then \ + rm -rf cov_work ; \ + fi + @if [ -e hdl.var ] ; then \ + rm -rf hdl.var ; \ + fi + @if [ -e ncelab.args ] ; then \ + rm -rf ncelab.args ; \ + fi + @if [ -e ncvlog.args ] ; then \ + rm -rf ncvlog.args ; \ + fi + @if [ -e ncsim.args ] ; then \ + rm -rf ncsim.args ; \ + fi + @if [ -e ncprep.log ] ; then \ + rm -rf ncprep.log ; \ + fi + @if [ -e ncelab.log ] ; then \ + rm -rf ncelab.log ; \ + fi + @if [ -e ncvlog.log ] ; then \ + rm -rf ncvlog.log ; \ + fi + @if [ -e ncsim.log ] ; then \ + rm -rf ncsim.log ; \ + fi + @if [ -e run.tcl ] ; then \ + rm -rf run.tcl ; \ + fi + @if [ -e RUN_NC ] ; then \ + rm -rf RUN_NC ; \ + fi + @if [ -e ncsim.key ] ; then \ + rm -rf ncsim.key ; \ + fi + @if [ -e cds.lib ] ; then \ + rm -rf cds.lib ; \ + fi + @if [ -e logs ] ; then \ + rm -rf logs ; \ + fi + @if [ -e ../v2html_doc ] ; then \ + rm -rf ../v2html_doc ; \ + fi diff --git a/Cortex-M0/nanosoc/systems/mcu/testcodes/apb_mux_tests/apb_mux_tests_cm0.uvopt b/Cortex-M0/nanosoc/systems/mcu/testcodes/apb_mux_tests/apb_mux_tests_cm0.uvopt new file mode 100644 index 0000000..59bbba0 --- /dev/null +++ b/Cortex-M0/nanosoc/systems/mcu/testcodes/apb_mux_tests/apb_mux_tests_cm0.uvopt @@ -0,0 +1,261 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no" ?> +<ProjectOpt xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="project_opt.xsd"> + + <SchemaVersion>1.0</SchemaVersion> + + <Header>### uVision Project, (C) Keil Software</Header> + + <Extensions> + <cExt>*.c</cExt> + <aExt>*.s*; *.src; *.a*</aExt> + <oExt>*.obj</oExt> + <lExt>*.lib</lExt> + <tExt>*.txt; *.h; *.inc</tExt> + <pExt>*.plm</pExt> + <CppX>*.cpp</CppX> + </Extensions> + + <DaveTm> + <dwLowDateTime>0</dwLowDateTime> + <dwHighDateTime>0</dwHighDateTime> + </DaveTm> + + <Target> + <TargetName>Debug</TargetName> + <ToolsetNumber>0x4</ToolsetNumber> + <ToolsetName>ARM-ADS</ToolsetName> + <TargetOption> + <CLKADS>50000000</CLKADS> + <OPTTT> + <gFlags>1</gFlags> + <BeepAtEnd>1</BeepAtEnd> + <RunSim>1</RunSim> + <RunTarget>0</RunTarget> + </OPTTT> + <OPTHX> + <HexSelection>1</HexSelection> + <FlashByte>65535</FlashByte> + <HexRangeLowAddress>0</HexRangeLowAddress> + <HexRangeHighAddress>0</HexRangeHighAddress> + <HexOffset>0</HexOffset> + </OPTHX> + <OPTLEX> + <PageWidth>79</PageWidth> + <PageLength>66</PageLength> + <TabStop>8</TabStop> + <ListingPath>.\</ListingPath> + </OPTLEX> + <ListingPage> + <CreateCListing>1</CreateCListing> + <CreateAListing>1</CreateAListing> + <CreateLListing>1</CreateLListing> + <CreateIListing>0</CreateIListing> + <AsmCond>1</AsmCond> + <AsmSymb>1</AsmSymb> + <AsmXref>0</AsmXref> + <CCond>1</CCond> + <CCode>0</CCode> + <CListInc>0</CListInc> + <CSymb>0</CSymb> + <LinkerCodeListing>0</LinkerCodeListing> + </ListingPage> + <OPTXL> + <LMap>1</LMap> + <LComments>1</LComments> + <LGenerateSymbols>1</LGenerateSymbols> + <LLibSym>1</LLibSym> + <LLines>1</LLines> + <LLocSym>1</LLocSym> + <LPubSym>1</LPubSym> + <LXref>0</LXref> + <LExpSel>0</LExpSel> + </OPTXL> + <OPTFL> + <tvExp>1</tvExp> + <tvExpOptDlg>0</tvExpOptDlg> + <IsCurrentTarget>1</IsCurrentTarget> + </OPTFL> + <CpuCode>255</CpuCode> + <DllOpt> + <SimDllName>SARMCM3.DLL</SimDllName> + <SimDllArguments></SimDllArguments> + <SimDlgDllName>DARMCM1.DLL</SimDlgDllName> + <SimDlgDllArguments></SimDlgDllArguments> + <TargetDllName>SARMCM3.DLL</TargetDllName> + <TargetDllArguments></TargetDllArguments> + <TargetDlgDllName>TARMCM1.DLL</TargetDlgDllName> + <TargetDlgDllArguments></TargetDlgDllArguments> + </DllOpt> + <DebugOpt> + <uSim>1</uSim> + <uTrg>0</uTrg> + <sLdApp>1</sLdApp> + <sGomain>1</sGomain> + <sRbreak>1</sRbreak> + <sRwatch>1</sRwatch> + <sRmem>1</sRmem> + <sRfunc>1</sRfunc> + <sRbox>1</sRbox> + <tLdApp>1</tLdApp> + <tGomain>0</tGomain> + <tRbreak>1</tRbreak> + <tRwatch>1</tRwatch> + <tRmem>1</tRmem> + <tRfunc>0</tRfunc> + <tRbox>1</tRbox> + <tRtrace>0</tRtrace> + <sRunDeb>0</sRunDeb> + <sLrtime>0</sLrtime> + <nTsel>-1</nTsel> + <sDll></sDll> + <sDllPa></sDllPa> + <sDlgDll></sDlgDll> + <sDlgPa></sDlgPa> + <sIfile></sIfile> + <tDll></tDll> + <tDllPa></tDllPa> + <tDlgDll></tDlgDll> + <tDlgPa></tDlgPa> + <tIfile></tIfile> + <pMon></pMon> + </DebugOpt> + <Breakpoint/> + <DebugFlag> + <trace>0</trace> + <periodic>1</periodic> + <aLwin>0</aLwin> + <aCover>0</aCover> + <aSer1>0</aSer1> + <aSer2>0</aSer2> + <aPa>0</aPa> + <viewmode>0</viewmode> + <vrSel>0</vrSel> + <aSym>0</aSym> + <aTbox>0</aTbox> + <AscS1>0</AscS1> + <AscS2>0</AscS2> + <AscS3>0</AscS3> + <aSer3>0</aSer3> + <eProf>0</eProf> + <aLa>0</aLa> + <aPa1>0</aPa1> + <AscS4>0</AscS4> + <aSer4>0</aSer4> + <StkLoc>0</StkLoc> + <TrcWin>0</TrcWin> + <newCpu>0</newCpu> + <uProt>0</uProt> + </DebugFlag> + <Tracepoint> + <THDelay>0</THDelay> + </Tracepoint> + <LintExecutable></LintExecutable> + <LintConfigFile></LintConfigFile> + </TargetOption> + </Target> + + <Group> + <GroupName>Startup</GroupName> + <tvExp>1</tvExp> + <tvExpOptDlg>0</tvExpOptDlg> + <cbSel>0</cbSel> + <RteFlg>0</RteFlg> + <File> + <GroupNumber>1</GroupNumber> + <FileNumber>1</FileNumber> + <FileType>2</FileType> + <tvExp>0</tvExp> + <Focus>0</Focus> + <ColumnNumber>0</ColumnNumber> + <tvExpOptDlg>0</tvExpOptDlg> + <TopLine>0</TopLine> + <CurrentLine>0</CurrentLine> + <bDave2>0</bDave2> + <PathWithFileName>..\..\..\..\software\cmsis\Device\ARM\CMSDK_CM0\Source\ARM\startup_CMSDK_CM0.s</PathWithFileName> + <FilenameWithoutPath>startup_CMSDK_CM0.s</FilenameWithoutPath> + <RteFlg>0</RteFlg> + <bShared>0</bShared> + </File> + </Group> + + <Group> + <GroupName>Application</GroupName> + <tvExp>1</tvExp> + <tvExpOptDlg>0</tvExpOptDlg> + <cbSel>0</cbSel> + <RteFlg>0</RteFlg> + <File> + <GroupNumber>2</GroupNumber> + <FileNumber>2</FileNumber> + <FileType>1</FileType> + <tvExp>0</tvExp> + <Focus>0</Focus> + <ColumnNumber>0</ColumnNumber> + <tvExpOptDlg>0</tvExpOptDlg> + <TopLine>0</TopLine> + <CurrentLine>0</CurrentLine> + <bDave2>0</bDave2> + <PathWithFileName>..\..\..\..\software\common\validation\apb_mux_tests.c</PathWithFileName> + <FilenameWithoutPath>apb_mux_tests.c</FilenameWithoutPath> + <RteFlg>0</RteFlg> + <bShared>0</bShared> + </File> + <File> + <GroupNumber>2</GroupNumber> + <FileNumber>3</FileNumber> + <FileType>1</FileType> + <tvExp>0</tvExp> + <Focus>0</Focus> + <ColumnNumber>0</ColumnNumber> + <tvExpOptDlg>0</tvExpOptDlg> + <TopLine>0</TopLine> + <CurrentLine>0</CurrentLine> + <bDave2>0</bDave2> + <PathWithFileName>..\..\..\..\software\common\retarget\uart_stdout.c</PathWithFileName> + <FilenameWithoutPath>uart_stdout.c</FilenameWithoutPath> + <RteFlg>0</RteFlg> + <bShared>0</bShared> + </File> + <File> + <GroupNumber>2</GroupNumber> + <FileNumber>4</FileNumber> + <FileType>1</FileType> + <tvExp>0</tvExp> + <Focus>0</Focus> + <ColumnNumber>0</ColumnNumber> + <tvExpOptDlg>0</tvExpOptDlg> + <TopLine>0</TopLine> + <CurrentLine>0</CurrentLine> + <bDave2>0</bDave2> + <PathWithFileName>..\..\..\..\software\common\retarget\retarget.c</PathWithFileName> + <FilenameWithoutPath>retarget.c</FilenameWithoutPath> + <RteFlg>0</RteFlg> + <bShared>0</bShared> + </File> + </Group> + + <Group> + <GroupName>System</GroupName> + <tvExp>1</tvExp> + <tvExpOptDlg>0</tvExpOptDlg> + <cbSel>0</cbSel> + <RteFlg>0</RteFlg> + <File> + <GroupNumber>3</GroupNumber> + <FileNumber>5</FileNumber> + <FileType>1</FileType> + <tvExp>0</tvExp> + <Focus>0</Focus> + <ColumnNumber>0</ColumnNumber> + <tvExpOptDlg>0</tvExpOptDlg> + <TopLine>0</TopLine> + <CurrentLine>0</CurrentLine> + <bDave2>0</bDave2> + <PathWithFileName>..\..\..\..\software\cmsis\Device\ARM\CMSDK_CM0\Source\system_CMSDK_CM0.c</PathWithFileName> + <FilenameWithoutPath>system_CMSDK_CM0.c</FilenameWithoutPath> + <RteFlg>0</RteFlg> + <bShared>0</bShared> + </File> + </Group> + +</ProjectOpt> diff --git a/Cortex-M0/nanosoc/systems/mcu/testcodes/apb_mux_tests/apb_mux_tests_cm0.uvproj b/Cortex-M0/nanosoc/systems/mcu/testcodes/apb_mux_tests/apb_mux_tests_cm0.uvproj new file mode 100644 index 0000000..9b96ead --- /dev/null +++ b/Cortex-M0/nanosoc/systems/mcu/testcodes/apb_mux_tests/apb_mux_tests_cm0.uvproj @@ -0,0 +1,435 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no" ?> +<Project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="project_proj.xsd"> + + <SchemaVersion>1.1</SchemaVersion> + + <Header>### uVision Project, (C) Keil Software</Header> + + <Targets> + <Target> + <TargetName>Debug</TargetName> + <ToolsetNumber>0x4</ToolsetNumber> + <ToolsetName>ARM-ADS</ToolsetName> + <TargetOption> + <TargetCommonOption> + <Device>Cortex-M0</Device> + <Vendor>ARM</Vendor> + <Cpu>CLOCK(12000000) CPUTYPE("Cortex-M0") ESEL ELITTLE</Cpu> + <FlashUtilSpec></FlashUtilSpec> + <StartupFile></StartupFile> + <FlashDriverDll></FlashDriverDll> + <DeviceId>4803</DeviceId> + <RegisterFile></RegisterFile> + <MemoryEnv></MemoryEnv> + <Cmp></Cmp> + <Asm></Asm> + <Linker></Linker> + <OHString></OHString> + <InfinionOptionDll></InfinionOptionDll> + <SLE66CMisc></SLE66CMisc> + <SLE66AMisc></SLE66AMisc> + <SLE66LinkerMisc></SLE66LinkerMisc> + <SFDFile></SFDFile> + <UseEnv>0</UseEnv> + <BinPath></BinPath> + <IncludePath></IncludePath> + <LibPath></LibPath> + <RegisterFilePath></RegisterFilePath> + <DBRegisterFilePath></DBRegisterFilePath> + <TargetStatus> + <Error>0</Error> + <ExitCodeStop>0</ExitCodeStop> + <ButtonStop>0</ButtonStop> + <NotGenerated>0</NotGenerated> + <InvalidFlash>1</InvalidFlash> + </TargetStatus> + <OutputDirectory>.\</OutputDirectory> + <OutputName>apb_mux_tests</OutputName> + <CreateExecutable>1</CreateExecutable> + <CreateLib>0</CreateLib> + <CreateHexFile>0</CreateHexFile> + <DebugInformation>1</DebugInformation> + <BrowseInformation>1</BrowseInformation> + <ListingPath>.\</ListingPath> + <HexFormatSelection>1</HexFormatSelection> + <Merge32K>0</Merge32K> + <CreateBatchFile>0</CreateBatchFile> + <BeforeCompile> + <RunUserProg1>0</RunUserProg1> + <RunUserProg2>0</RunUserProg2> + <UserProg1Name></UserProg1Name> + <UserProg2Name></UserProg2Name> + <UserProg1Dos16Mode>0</UserProg1Dos16Mode> + <UserProg2Dos16Mode>0</UserProg2Dos16Mode> + <nStopU1X>0</nStopU1X> + <nStopU2X>0</nStopU2X> + </BeforeCompile> + <BeforeMake> + <RunUserProg1>0</RunUserProg1> + <RunUserProg2>0</RunUserProg2> + <UserProg1Name></UserProg1Name> + <UserProg2Name></UserProg2Name> + <UserProg1Dos16Mode>0</UserProg1Dos16Mode> + <UserProg2Dos16Mode>0</UserProg2Dos16Mode> + </BeforeMake> + <AfterMake> + <RunUserProg1>1</RunUserProg1> + <RunUserProg2>0</RunUserProg2> + <UserProg1Name>$K\ARM\ARMCC\BIN\fromelf.exe #L --vhx --8x1 --output apb_mux_tests.hex</UserProg1Name> + <UserProg2Name></UserProg2Name> + <UserProg1Dos16Mode>0</UserProg1Dos16Mode> + <UserProg2Dos16Mode>0</UserProg2Dos16Mode> + </AfterMake> + <SelectedForBatchBuild>0</SelectedForBatchBuild> + <SVCSIdString></SVCSIdString> + </TargetCommonOption> + <CommonProperty> + <UseCPPCompiler>0</UseCPPCompiler> + <RVCTCodeConst>0</RVCTCodeConst> + <RVCTZI>0</RVCTZI> + <RVCTOtherData>0</RVCTOtherData> + <ModuleSelection>0</ModuleSelection> + <IncludeInBuild>1</IncludeInBuild> + <AlwaysBuild>0</AlwaysBuild> + <GenerateAssemblyFile>0</GenerateAssemblyFile> + <AssembleAssemblyFile>0</AssembleAssemblyFile> + <PublicsOnly>0</PublicsOnly> + <StopOnExitCode>3</StopOnExitCode> + <CustomArgument></CustomArgument> + <IncludeLibraryModules></IncludeLibraryModules> + </CommonProperty> + <DllOption> + <SimDllName>SARMCM3.DLL</SimDllName> + <SimDllArguments></SimDllArguments> + <SimDlgDll>DARMCM1.DLL</SimDlgDll> + <SimDlgDllArguments></SimDlgDllArguments> + <TargetDllName>SARMCM3.DLL</TargetDllName> + <TargetDllArguments></TargetDllArguments> + <TargetDlgDll>TARMCM1.DLL</TargetDlgDll> + <TargetDlgDllArguments></TargetDlgDllArguments> + </DllOption> + <DebugOption> + <OPTHX> + <HexSelection>1</HexSelection> + <HexRangeLowAddress>0</HexRangeLowAddress> + <HexRangeHighAddress>0</HexRangeHighAddress> + <HexOffset>0</HexOffset> + <Oh166RecLen>16</Oh166RecLen> + </OPTHX> + <Simulator> + <UseSimulator>1</UseSimulator> + <LoadApplicationAtStartup>1</LoadApplicationAtStartup> + <RunToMain>1</RunToMain> + <RestoreBreakpoints>1</RestoreBreakpoints> + <RestoreWatchpoints>1</RestoreWatchpoints> + <RestoreMemoryDisplay>1</RestoreMemoryDisplay> + <RestoreFunctions>1</RestoreFunctions> + <RestoreToolbox>1</RestoreToolbox> + <LimitSpeedToRealTime>0</LimitSpeedToRealTime> + </Simulator> + <Target> + <UseTarget>0</UseTarget> + <LoadApplicationAtStartup>1</LoadApplicationAtStartup> + <RunToMain>0</RunToMain> + <RestoreBreakpoints>1</RestoreBreakpoints> + <RestoreWatchpoints>1</RestoreWatchpoints> + <RestoreMemoryDisplay>1</RestoreMemoryDisplay> + <RestoreFunctions>0</RestoreFunctions> + <RestoreToolbox>1</RestoreToolbox> + <RestoreTracepoints>0</RestoreTracepoints> + </Target> + <RunDebugAfterBuild>0</RunDebugAfterBuild> + <TargetSelection>-1</TargetSelection> + <SimDlls> + <CpuDll></CpuDll> + <CpuDllArguments></CpuDllArguments> + <PeripheralDll></PeripheralDll> + <PeripheralDllArguments></PeripheralDllArguments> + <InitializationFile></InitializationFile> + </SimDlls> + <TargetDlls> + <CpuDll></CpuDll> + <CpuDllArguments></CpuDllArguments> + <PeripheralDll></PeripheralDll> + <PeripheralDllArguments></PeripheralDllArguments> + <InitializationFile></InitializationFile> + <Driver></Driver> + </TargetDlls> + </DebugOption> + <Utilities> + <Flash1> + <UseTargetDll>0</UseTargetDll> + <UseExternalTool>0</UseExternalTool> + <RunIndependent>0</RunIndependent> + <UpdateFlashBeforeDebugging>0</UpdateFlashBeforeDebugging> + <Capability>0</Capability> + <DriverSelection>-1</DriverSelection> + </Flash1> + <Flash2></Flash2> + <Flash3></Flash3> + <Flash4></Flash4> + </Utilities> + <TargetArmAds> + <ArmAdsMisc> + <GenerateListings>0</GenerateListings> + <asHll>1</asHll> + <asAsm>1</asAsm> + <asMacX>1</asMacX> + <asSyms>1</asSyms> + <asFals>1</asFals> + <asDbgD>1</asDbgD> + <asForm>1</asForm> + <ldLst>0</ldLst> + <ldmm>1</ldmm> + <ldXref>1</ldXref> + <BigEnd>0</BigEnd> + <AdsALst>1</AdsALst> + <AdsACrf>1</AdsACrf> + <AdsANop>0</AdsANop> + <AdsANot>0</AdsANot> + <AdsLLst>1</AdsLLst> + <AdsLmap>1</AdsLmap> + <AdsLcgr>1</AdsLcgr> + <AdsLsym>1</AdsLsym> + <AdsLszi>1</AdsLszi> + <AdsLtoi>1</AdsLtoi> + <AdsLsun>1</AdsLsun> + <AdsLven>1</AdsLven> + <AdsLsxf>1</AdsLsxf> + <RvctClst>0</RvctClst> + <GenPPlst>0</GenPPlst> + <AdsCpuType>"Cortex-M0"</AdsCpuType> + <RvctDeviceName></RvctDeviceName> + <mOS>0</mOS> + <uocRom>0</uocRom> + <uocRam>0</uocRam> + <hadIROM>0</hadIROM> + <hadIRAM>0</hadIRAM> + <hadXRAM>0</hadXRAM> + <uocXRam>0</uocXRam> + <RvdsVP>0</RvdsVP> + <hadIRAM2>0</hadIRAM2> + <hadIROM2>0</hadIROM2> + <StupSel>1</StupSel> + <useUlib>0</useUlib> + <EndSel>1</EndSel> + <uLtcg>0</uLtcg> + <RoSelD>0</RoSelD> + <RwSelD>5</RwSelD> + <CodeSel>0</CodeSel> + <OptFeed>0</OptFeed> + <NoZi1>0</NoZi1> + <NoZi2>0</NoZi2> + <NoZi3>0</NoZi3> + <NoZi4>0</NoZi4> + <NoZi5>0</NoZi5> + <Ro1Chk>1</Ro1Chk> + <Ro2Chk>0</Ro2Chk> + <Ro3Chk>0</Ro3Chk> + <Ir1Chk>0</Ir1Chk> + <Ir2Chk>0</Ir2Chk> + <Ra1Chk>1</Ra1Chk> + <Ra2Chk>0</Ra2Chk> + <Ra3Chk>0</Ra3Chk> + <Im1Chk>0</Im1Chk> + <Im2Chk>0</Im2Chk> + <OnChipMemories> + <Ocm1> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </Ocm1> + <Ocm2> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </Ocm2> + <Ocm3> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </Ocm3> + <Ocm4> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </Ocm4> + <Ocm5> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </Ocm5> + <Ocm6> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </Ocm6> + <IRAM> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </IRAM> + <IROM> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </IROM> + <XRAM> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </XRAM> + <OCR_RVCT1> + <Type>1</Type> + <StartAddress>0x0</StartAddress> + <Size>0x10000</Size> + </OCR_RVCT1> + <OCR_RVCT2> + <Type>1</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </OCR_RVCT2> + <OCR_RVCT3> + <Type>1</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </OCR_RVCT3> + <OCR_RVCT4> + <Type>1</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </OCR_RVCT4> + <OCR_RVCT5> + <Type>1</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </OCR_RVCT5> + <OCR_RVCT6> + <Type>0</Type> + <StartAddress>0x20000000</StartAddress> + <Size>0x10000</Size> + </OCR_RVCT6> + <OCR_RVCT7> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </OCR_RVCT7> + <OCR_RVCT8> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </OCR_RVCT8> + <OCR_RVCT9> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </OCR_RVCT9> + <OCR_RVCT10> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </OCR_RVCT10> + </OnChipMemories> + <RvctStartVector></RvctStartVector> + </ArmAdsMisc> + <Cads> + <interw>1</interw> + <Optim>4</Optim> + <oTime>0</oTime> + <SplitLS>0</SplitLS> + <OneElfS>0</OneElfS> + <Strict>0</Strict> + <EnumInt>0</EnumInt> + <PlainCh>0</PlainCh> + <Ropi>0</Ropi> + <Rwpi>0</Rwpi> + <wLevel>0</wLevel> + <uThumb>0</uThumb> + <uSurpInc>0</uSurpInc> + <VariousControls> + <MiscControls></MiscControls> + <Define>CORTEX_M0</Define> + <Undefine></Undefine> + <IncludePath>..\..\..\..\software\cmsis\CMSIS\Include; ..\..\..\..\software\cmsis\Device\ARM\CMSDK_CM0\Include; ..\..\..\..\software\common\retarget</IncludePath> + </VariousControls> + </Cads> + <Aads> + <interw>1</interw> + <Ropi>0</Ropi> + <Rwpi>0</Rwpi> + <thumb>0</thumb> + <SplitLS>0</SplitLS> + <SwStkChk>0</SwStkChk> + <NoWarn>0</NoWarn> + <uSurpInc>0</uSurpInc> + <VariousControls> + <MiscControls></MiscControls> + <Define></Define> + <Undefine></Undefine> + <IncludePath></IncludePath> + </VariousControls> + </Aads> + <LDads> + <umfTarg>1</umfTarg> + <Ropi>0</Ropi> + <Rwpi>0</Rwpi> + <noStLib>0</noStLib> + <RepFail>1</RepFail> + <useFile>0</useFile> + <TextAddressRange>0x00000000</TextAddressRange> + <DataAddressRange>0x00000000</DataAddressRange> + <ScatterFile></ScatterFile> + <IncludeLibs></IncludeLibs> + <IncludeLibsPath></IncludeLibsPath> + <Misc></Misc> + <LinkerInputFile></LinkerInputFile> + <DisabledWarnings></DisabledWarnings> + </LDads> + </TargetArmAds> + </TargetOption> + <Groups> + <Group> + <GroupName>Startup</GroupName> + <Files> + <File> + <FileName>startup_CMSDK_CM0.s</FileName> + <FileType>2</FileType> + <FilePath>..\..\..\..\software\cmsis\Device\ARM\CMSDK_CM0\Source\ARM\startup_CMSDK_CM0.s</FilePath> + </File> + </Files> + </Group> + <Group> + <GroupName>Application</GroupName> + <Files> + <File> + <FileName>apb_mux_tests.c</FileName> + <FileType>1</FileType> + <FilePath>..\..\..\..\software\common\validation\apb_mux_tests.c</FilePath> + </File> + <File> + <FileName>uart_stdout.c</FileName> + <FileType>1</FileType> + <FilePath>..\..\..\..\software\common\retarget\uart_stdout.c</FilePath> + </File> + <File> + <FileName>retarget.c</FileName> + <FileType>1</FileType> + <FilePath>..\..\..\..\software\common\retarget\retarget.c</FilePath> + </File> + </Files> + </Group> + <Group> + <GroupName>System</GroupName> + <Files> + <File> + <FileName>system_CMSDK_CM0.c</FileName> + <FileType>1</FileType> + <FilePath>..\..\..\..\software\cmsis\Device\ARM\CMSDK_CM0\Source\system_CMSDK_CM0.c</FilePath> + </File> + </Files> + </Group> + </Groups> + </Target> + </Targets> + +</Project> diff --git a/Cortex-M0/nanosoc/systems/mcu/testcodes/apb_mux_tests/apb_mux_tests_cm0p.uvopt b/Cortex-M0/nanosoc/systems/mcu/testcodes/apb_mux_tests/apb_mux_tests_cm0p.uvopt new file mode 100644 index 0000000..e735ca8 --- /dev/null +++ b/Cortex-M0/nanosoc/systems/mcu/testcodes/apb_mux_tests/apb_mux_tests_cm0p.uvopt @@ -0,0 +1,244 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no" ?> +<ProjectOpt xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="project_opt.xsd"> + + <SchemaVersion>1.0</SchemaVersion> + + <Header>### uVision Project, (C) Keil Software</Header> + + <Extensions> + <cExt>*.c</cExt> + <aExt>*.s*; *.src; *.a*</aExt> + <oExt>*.obj</oExt> + <lExt>*.lib</lExt> + <tExt>*.txt; *.h; *.inc</tExt> + <pExt>*.plm</pExt> + <CppX>*.cpp</CppX> + </Extensions> + + <DaveTm> + <dwLowDateTime>0</dwLowDateTime> + <dwHighDateTime>0</dwHighDateTime> + </DaveTm> + + <Target> + <TargetName>Debug</TargetName> + <ToolsetNumber>0x4</ToolsetNumber> + <ToolsetName>ARM-ADS</ToolsetName> + <TargetOption> + <CLKADS>50000000</CLKADS> + <OPTTT> + <gFlags>1</gFlags> + <BeepAtEnd>1</BeepAtEnd> + <RunSim>1</RunSim> + <RunTarget>0</RunTarget> + </OPTTT> + <OPTHX> + <HexSelection>1</HexSelection> + <FlashByte>65535</FlashByte> + <HexRangeLowAddress>0</HexRangeLowAddress> + <HexRangeHighAddress>0</HexRangeHighAddress> + <HexOffset>0</HexOffset> + </OPTHX> + <OPTLEX> + <PageWidth>79</PageWidth> + <PageLength>66</PageLength> + <TabStop>8</TabStop> + <ListingPath>.\</ListingPath> + </OPTLEX> + <ListingPage> + <CreateCListing>1</CreateCListing> + <CreateAListing>1</CreateAListing> + <CreateLListing>1</CreateLListing> + <CreateIListing>0</CreateIListing> + <AsmCond>1</AsmCond> + <AsmSymb>1</AsmSymb> + <AsmXref>0</AsmXref> + <CCond>1</CCond> + <CCode>0</CCode> + <CListInc>0</CListInc> + <CSymb>0</CSymb> + <LinkerCodeListing>0</LinkerCodeListing> + </ListingPage> + <OPTXL> + <LMap>1</LMap> + <LComments>1</LComments> + <LGenerateSymbols>1</LGenerateSymbols> + <LLibSym>1</LLibSym> + <LLines>1</LLines> + <LLocSym>1</LLocSym> + <LPubSym>1</LPubSym> + <LXref>0</LXref> + <LExpSel>0</LExpSel> + </OPTXL> + <OPTFL> + <tvExp>1</tvExp> + <tvExpOptDlg>0</tvExpOptDlg> + <IsCurrentTarget>1</IsCurrentTarget> + </OPTFL> + <CpuCode>255</CpuCode> + <DllOpt> + <SimDllName>SARMCM3.DLL</SimDllName> + <SimDllArguments></SimDllArguments> + <SimDlgDllName>DARMCM1.DLL</SimDlgDllName> + <SimDlgDllArguments></SimDlgDllArguments> + <TargetDllName>SARMCM3.DLL</TargetDllName> + <TargetDllArguments></TargetDllArguments> + <TargetDlgDllName>TARMCM1.DLL</TargetDlgDllName> + <TargetDlgDllArguments></TargetDlgDllArguments> + </DllOpt> + <DebugOpt> + <uSim>1</uSim> + <uTrg>0</uTrg> + <sLdApp>1</sLdApp> + <sGomain>1</sGomain> + <sRbreak>1</sRbreak> + <sRwatch>1</sRwatch> + <sRmem>1</sRmem> + <sRfunc>1</sRfunc> + <sRbox>1</sRbox> + <tLdApp>1</tLdApp> + <tGomain>0</tGomain> + <tRbreak>1</tRbreak> + <tRwatch>1</tRwatch> + <tRmem>1</tRmem> + <tRfunc>0</tRfunc> + <tRbox>1</tRbox> + <sRunDeb>0</sRunDeb> + <sLrtime>0</sLrtime> + <nTsel>-1</nTsel> + <sDll></sDll> + <sDllPa></sDllPa> + <sDlgDll></sDlgDll> + <sDlgPa></sDlgPa> + <sIfile></sIfile> + <tDll></tDll> + <tDllPa></tDllPa> + <tDlgDll></tDlgDll> + <tDlgPa></tDlgPa> + <tIfile></tIfile> + <pMon></pMon> + </DebugOpt> + <Breakpoint/> + <DebugFlag> + <trace>0</trace> + <periodic>1</periodic> + <aLwin>0</aLwin> + <aCover>0</aCover> + <aSer1>0</aSer1> + <aSer2>0</aSer2> + <aPa>0</aPa> + <viewmode>0</viewmode> + <vrSel>0</vrSel> + <aSym>0</aSym> + <aTbox>0</aTbox> + <AscS1>0</AscS1> + <AscS2>0</AscS2> + <AscS3>0</AscS3> + <aSer3>0</aSer3> + <eProf>0</eProf> + <aLa>0</aLa> + <aPa1>0</aPa1> + <AscS4>0</AscS4> + <aSer4>0</aSer4> + <StkLoc>0</StkLoc> + <TrcWin>0</TrcWin> + <newCpu>0</newCpu> + <uProt>0</uProt> + </DebugFlag> + <LintExecutable></LintExecutable> + <LintConfigFile></LintConfigFile> + </TargetOption> + </Target> + + <Group> + <GroupName>Startup</GroupName> + <tvExp>1</tvExp> + <tvExpOptDlg>0</tvExpOptDlg> + <cbSel>0</cbSel> + <File> + <GroupNumber>1</GroupNumber> + <FileNumber>1</FileNumber> + <FileType>2</FileType> + <tvExp>0</tvExp> + <Focus>0</Focus> + <ColumnNumber>0</ColumnNumber> + <tvExpOptDlg>0</tvExpOptDlg> + <TopLine>0</TopLine> + <CurrentLine>0</CurrentLine> + <bDave2>0</bDave2> + <PathWithFileName>..\..\..\..\software\cmsis\Device\ARM\CMSDK_CM0plus\Source\ARM\startup_CMSDK_CM0plus.s</PathWithFileName> + <FilenameWithoutPath>startup_CMSDK_CM0plus.s</FilenameWithoutPath> + </File> + </Group> + + <Group> + <GroupName>Application</GroupName> + <tvExp>1</tvExp> + <tvExpOptDlg>0</tvExpOptDlg> + <cbSel>0</cbSel> + <File> + <GroupNumber>2</GroupNumber> + <FileNumber>2</FileNumber> + <FileType>1</FileType> + <tvExp>0</tvExp> + <Focus>0</Focus> + <ColumnNumber>0</ColumnNumber> + <tvExpOptDlg>0</tvExpOptDlg> + <TopLine>0</TopLine> + <CurrentLine>0</CurrentLine> + <bDave2>0</bDave2> + <PathWithFileName>..\..\..\..\software\common\validation\apb_mux_tests.c</PathWithFileName> + <FilenameWithoutPath>apb_mux_tests.c</FilenameWithoutPath> + </File> + <File> + <GroupNumber>2</GroupNumber> + <FileNumber>3</FileNumber> + <FileType>1</FileType> + <tvExp>0</tvExp> + <Focus>0</Focus> + <ColumnNumber>0</ColumnNumber> + <tvExpOptDlg>0</tvExpOptDlg> + <TopLine>0</TopLine> + <CurrentLine>0</CurrentLine> + <bDave2>0</bDave2> + <PathWithFileName>..\..\..\..\software\common\retarget\uart_stdout.c</PathWithFileName> + <FilenameWithoutPath>uart_stdout.c</FilenameWithoutPath> + </File> + <File> + <GroupNumber>2</GroupNumber> + <FileNumber>4</FileNumber> + <FileType>1</FileType> + <tvExp>0</tvExp> + <Focus>0</Focus> + <ColumnNumber>0</ColumnNumber> + <tvExpOptDlg>0</tvExpOptDlg> + <TopLine>0</TopLine> + <CurrentLine>0</CurrentLine> + <bDave2>0</bDave2> + <PathWithFileName>..\..\..\..\software\common\retarget\retarget.c</PathWithFileName> + <FilenameWithoutPath>retarget.c</FilenameWithoutPath> + </File> + </Group> + + <Group> + <GroupName>System</GroupName> + <tvExp>1</tvExp> + <tvExpOptDlg>0</tvExpOptDlg> + <cbSel>0</cbSel> + <File> + <GroupNumber>3</GroupNumber> + <FileNumber>5</FileNumber> + <FileType>1</FileType> + <tvExp>0</tvExp> + <Focus>0</Focus> + <ColumnNumber>0</ColumnNumber> + <tvExpOptDlg>0</tvExpOptDlg> + <TopLine>0</TopLine> + <CurrentLine>0</CurrentLine> + <bDave2>0</bDave2> + <PathWithFileName>..\..\..\..\software\cmsis\Device\ARM\CMSDK_CM0plus\Source\system_CMSDK_CM0plus.c</PathWithFileName> + <FilenameWithoutPath>system_CMSDK_CM0plus.c</FilenameWithoutPath> + </File> + </Group> + +</ProjectOpt> diff --git a/Cortex-M0/nanosoc/systems/mcu/testcodes/apb_mux_tests/apb_mux_tests_cm0p.uvproj b/Cortex-M0/nanosoc/systems/mcu/testcodes/apb_mux_tests/apb_mux_tests_cm0p.uvproj new file mode 100644 index 0000000..f19bc04 --- /dev/null +++ b/Cortex-M0/nanosoc/systems/mcu/testcodes/apb_mux_tests/apb_mux_tests_cm0p.uvproj @@ -0,0 +1,432 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no" ?> +<Project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="project_proj.xsd"> + + <SchemaVersion>1.1</SchemaVersion> + + <Header>### uVision Project, (C) Keil Software</Header> + + <Targets> + <Target> + <TargetName>Debug</TargetName> + <ToolsetNumber>0x4</ToolsetNumber> + <ToolsetName>ARM-ADS</ToolsetName> + <TargetOption> + <TargetCommonOption> + <Device>Cortex-M0+</Device> + <Vendor>ARM</Vendor> + <Cpu>CLOCK(12000000) CPUTYPE("Cortex-M0+") ESEL ELITTLE</Cpu> + <FlashUtilSpec></FlashUtilSpec> + <StartupFile></StartupFile> + <FlashDriverDll></FlashDriverDll> + <DeviceId>6268</DeviceId> + <RegisterFile></RegisterFile> + <MemoryEnv></MemoryEnv> + <Cmp></Cmp> + <Asm></Asm> + <Linker></Linker> + <OHString></OHString> + <InfinionOptionDll></InfinionOptionDll> + <SLE66CMisc></SLE66CMisc> + <SLE66AMisc></SLE66AMisc> + <SLE66LinkerMisc></SLE66LinkerMisc> + <SFDFile></SFDFile> + <UseEnv>0</UseEnv> + <BinPath></BinPath> + <IncludePath></IncludePath> + <LibPath></LibPath> + <RegisterFilePath></RegisterFilePath> + <DBRegisterFilePath></DBRegisterFilePath> + <TargetStatus> + <Error>0</Error> + <ExitCodeStop>0</ExitCodeStop> + <ButtonStop>0</ButtonStop> + <NotGenerated>0</NotGenerated> + <InvalidFlash>1</InvalidFlash> + </TargetStatus> + <OutputDirectory>.\</OutputDirectory> + <OutputName>apb_mux_tests</OutputName> + <CreateExecutable>1</CreateExecutable> + <CreateLib>0</CreateLib> + <CreateHexFile>0</CreateHexFile> + <DebugInformation>1</DebugInformation> + <BrowseInformation>1</BrowseInformation> + <ListingPath>.\</ListingPath> + <HexFormatSelection>1</HexFormatSelection> + <Merge32K>0</Merge32K> + <CreateBatchFile>0</CreateBatchFile> + <BeforeCompile> + <RunUserProg1>0</RunUserProg1> + <RunUserProg2>0</RunUserProg2> + <UserProg1Name></UserProg1Name> + <UserProg2Name></UserProg2Name> + <UserProg1Dos16Mode>0</UserProg1Dos16Mode> + <UserProg2Dos16Mode>0</UserProg2Dos16Mode> + <nStopU1X>0</nStopU1X> + <nStopU2X>0</nStopU2X> + </BeforeCompile> + <BeforeMake> + <RunUserProg1>0</RunUserProg1> + <RunUserProg2>0</RunUserProg2> + <UserProg1Name></UserProg1Name> + <UserProg2Name></UserProg2Name> + <UserProg1Dos16Mode>0</UserProg1Dos16Mode> + <UserProg2Dos16Mode>0</UserProg2Dos16Mode> + </BeforeMake> + <AfterMake> + <RunUserProg1>1</RunUserProg1> + <RunUserProg2>0</RunUserProg2> + <UserProg1Name>$K\ARM\ARMCC\BIN\fromelf.exe #L --vhx --8x1 --output apb_mux_tests.hex</UserProg1Name> + <UserProg2Name></UserProg2Name> + <UserProg1Dos16Mode>0</UserProg1Dos16Mode> + <UserProg2Dos16Mode>0</UserProg2Dos16Mode> + </AfterMake> + <SelectedForBatchBuild>0</SelectedForBatchBuild> + <SVCSIdString></SVCSIdString> + </TargetCommonOption> + <CommonProperty> + <UseCPPCompiler>0</UseCPPCompiler> + <RVCTCodeConst>0</RVCTCodeConst> + <RVCTZI>0</RVCTZI> + <RVCTOtherData>0</RVCTOtherData> + <ModuleSelection>0</ModuleSelection> + <IncludeInBuild>1</IncludeInBuild> + <AlwaysBuild>0</AlwaysBuild> + <GenerateAssemblyFile>0</GenerateAssemblyFile> + <AssembleAssemblyFile>0</AssembleAssemblyFile> + <PublicsOnly>0</PublicsOnly> + <StopOnExitCode>3</StopOnExitCode> + <CustomArgument></CustomArgument> + <IncludeLibraryModules></IncludeLibraryModules> + </CommonProperty> + <DllOption> + <SimDllName>SARMCM3.DLL</SimDllName> + <SimDllArguments></SimDllArguments> + <SimDlgDll>DARMCM1.DLL</SimDlgDll> + <SimDlgDllArguments></SimDlgDllArguments> + <TargetDllName>SARMCM3.DLL</TargetDllName> + <TargetDllArguments></TargetDllArguments> + <TargetDlgDll>TARMCM1.DLL</TargetDlgDll> + <TargetDlgDllArguments></TargetDlgDllArguments> + </DllOption> + <DebugOption> + <OPTHX> + <HexSelection>1</HexSelection> + <HexRangeLowAddress>0</HexRangeLowAddress> + <HexRangeHighAddress>0</HexRangeHighAddress> + <HexOffset>0</HexOffset> + <Oh166RecLen>16</Oh166RecLen> + </OPTHX> + <Simulator> + <UseSimulator>1</UseSimulator> + <LoadApplicationAtStartup>1</LoadApplicationAtStartup> + <RunToMain>1</RunToMain> + <RestoreBreakpoints>1</RestoreBreakpoints> + <RestoreWatchpoints>1</RestoreWatchpoints> + <RestoreMemoryDisplay>1</RestoreMemoryDisplay> + <RestoreFunctions>1</RestoreFunctions> + <RestoreToolbox>1</RestoreToolbox> + <LimitSpeedToRealTime>0</LimitSpeedToRealTime> + </Simulator> + <Target> + <UseTarget>0</UseTarget> + <LoadApplicationAtStartup>1</LoadApplicationAtStartup> + <RunToMain>0</RunToMain> + <RestoreBreakpoints>1</RestoreBreakpoints> + <RestoreWatchpoints>1</RestoreWatchpoints> + <RestoreMemoryDisplay>1</RestoreMemoryDisplay> + <RestoreFunctions>0</RestoreFunctions> + <RestoreToolbox>1</RestoreToolbox> + </Target> + <RunDebugAfterBuild>0</RunDebugAfterBuild> + <TargetSelection>-1</TargetSelection> + <SimDlls> + <CpuDll></CpuDll> + <CpuDllArguments></CpuDllArguments> + <PeripheralDll></PeripheralDll> + <PeripheralDllArguments></PeripheralDllArguments> + <InitializationFile></InitializationFile> + </SimDlls> + <TargetDlls> + <CpuDll></CpuDll> + <CpuDllArguments></CpuDllArguments> + <PeripheralDll></PeripheralDll> + <PeripheralDllArguments></PeripheralDllArguments> + <InitializationFile></InitializationFile> + <Driver></Driver> + </TargetDlls> + </DebugOption> + <Utilities> + <Flash1> + <UseTargetDll>0</UseTargetDll> + <UseExternalTool>0</UseExternalTool> + <RunIndependent>0</RunIndependent> + <UpdateFlashBeforeDebugging>0</UpdateFlashBeforeDebugging> + <Capability>0</Capability> + <DriverSelection>-1</DriverSelection> + </Flash1> + <Flash2></Flash2> + <Flash3></Flash3> + <Flash4></Flash4> + </Utilities> + <TargetArmAds> + <ArmAdsMisc> + <GenerateListings>0</GenerateListings> + <asHll>1</asHll> + <asAsm>1</asAsm> + <asMacX>1</asMacX> + <asSyms>1</asSyms> + <asFals>1</asFals> + <asDbgD>1</asDbgD> + <asForm>1</asForm> + <ldLst>0</ldLst> + <ldmm>1</ldmm> + <ldXref>1</ldXref> + <BigEnd>0</BigEnd> + <AdsALst>1</AdsALst> + <AdsACrf>1</AdsACrf> + <AdsANop>0</AdsANop> + <AdsANot>0</AdsANot> + <AdsLLst>1</AdsLLst> + <AdsLmap>1</AdsLmap> + <AdsLcgr>1</AdsLcgr> + <AdsLsym>1</AdsLsym> + <AdsLszi>1</AdsLszi> + <AdsLtoi>1</AdsLtoi> + <AdsLsun>1</AdsLsun> + <AdsLven>1</AdsLven> + <AdsLsxf>1</AdsLsxf> + <RvctClst>0</RvctClst> + <GenPPlst>0</GenPPlst> + <AdsCpuType>"Cortex-M0+"</AdsCpuType> + <RvctDeviceName></RvctDeviceName> + <mOS>0</mOS> + <uocRom>0</uocRom> + <uocRam>0</uocRam> + <hadIROM>0</hadIROM> + <hadIRAM>0</hadIRAM> + <hadXRAM>0</hadXRAM> + <uocXRam>0</uocXRam> + <RvdsVP>0</RvdsVP> + <hadIRAM2>0</hadIRAM2> + <hadIROM2>0</hadIROM2> + <StupSel>1</StupSel> + <useUlib>0</useUlib> + <EndSel>1</EndSel> + <uLtcg>0</uLtcg> + <RoSelD>0</RoSelD> + <RwSelD>5</RwSelD> + <CodeSel>0</CodeSel> + <OptFeed>0</OptFeed> + <NoZi1>0</NoZi1> + <NoZi2>0</NoZi2> + <NoZi3>0</NoZi3> + <NoZi4>0</NoZi4> + <NoZi5>0</NoZi5> + <Ro1Chk>1</Ro1Chk> + <Ro2Chk>0</Ro2Chk> + <Ro3Chk>0</Ro3Chk> + <Ir1Chk>0</Ir1Chk> + <Ir2Chk>0</Ir2Chk> + <Ra1Chk>1</Ra1Chk> + <Ra2Chk>0</Ra2Chk> + <Ra3Chk>0</Ra3Chk> + <Im1Chk>0</Im1Chk> + <Im2Chk>0</Im2Chk> + <OnChipMemories> + <Ocm1> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </Ocm1> + <Ocm2> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </Ocm2> + <Ocm3> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </Ocm3> + <Ocm4> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </Ocm4> + <Ocm5> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </Ocm5> + <Ocm6> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </Ocm6> + <IRAM> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </IRAM> + <IROM> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </IROM> + <XRAM> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </XRAM> + <OCR_RVCT1> + <Type>1</Type> + <StartAddress>0x0</StartAddress> + <Size>0x10000</Size> + </OCR_RVCT1> + <OCR_RVCT2> + <Type>1</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </OCR_RVCT2> + <OCR_RVCT3> + <Type>1</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </OCR_RVCT3> + <OCR_RVCT4> + <Type>1</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </OCR_RVCT4> + <OCR_RVCT5> + <Type>1</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </OCR_RVCT5> + <OCR_RVCT6> + <Type>0</Type> + <StartAddress>0x20000000</StartAddress> + <Size>0x10000</Size> + </OCR_RVCT6> + <OCR_RVCT7> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </OCR_RVCT7> + <OCR_RVCT8> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </OCR_RVCT8> + <OCR_RVCT9> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </OCR_RVCT9> + <OCR_RVCT10> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </OCR_RVCT10> + </OnChipMemories> + <RvctStartVector></RvctStartVector> + </ArmAdsMisc> + <Cads> + <interw>1</interw> + <Optim>4</Optim> + <oTime>0</oTime> + <SplitLS>0</SplitLS> + <OneElfS>0</OneElfS> + <Strict>0</Strict> + <EnumInt>0</EnumInt> + <PlainCh>0</PlainCh> + <Ropi>0</Ropi> + <Rwpi>0</Rwpi> + <wLevel>0</wLevel> + <uThumb>0</uThumb> + <VariousControls> + <MiscControls></MiscControls> + <Define>CORTEX_M0PLUS</Define> + <Undefine></Undefine> + <IncludePath>..\..\..\..\software\cmsis\CMSIS\Include; ..\..\..\..\software\cmsis\Device\ARM\CMSDK_CM0plus\Include; ..\..\..\..\software\common\retarget</IncludePath> + </VariousControls> + </Cads> + <Aads> + <interw>1</interw> + <Ropi>0</Ropi> + <Rwpi>0</Rwpi> + <thumb>0</thumb> + <SplitLS>0</SplitLS> + <SwStkChk>0</SwStkChk> + <NoWarn>0</NoWarn> + <VariousControls> + <MiscControls></MiscControls> + <Define></Define> + <Undefine></Undefine> + <IncludePath></IncludePath> + </VariousControls> + </Aads> + <LDads> + <umfTarg>1</umfTarg> + <Ropi>0</Ropi> + <Rwpi>0</Rwpi> + <noStLib>0</noStLib> + <RepFail>1</RepFail> + <useFile>0</useFile> + <TextAddressRange>0x00000000</TextAddressRange> + <DataAddressRange>0x00000000</DataAddressRange> + <ScatterFile></ScatterFile> + <IncludeLibs></IncludeLibs> + <IncludeLibsPath></IncludeLibsPath> + <Misc></Misc> + <LinkerInputFile></LinkerInputFile> + <DisabledWarnings></DisabledWarnings> + </LDads> + </TargetArmAds> + </TargetOption> + <Groups> + <Group> + <GroupName>Startup</GroupName> + <Files> + <File> + <FileName>startup_CMSDK_CM0plus.s</FileName> + <FileType>2</FileType> + <FilePath>..\..\..\..\software\cmsis\Device\ARM\CMSDK_CM0plus\Source\ARM\startup_CMSDK_CM0plus.s</FilePath> + </File> + </Files> + </Group> + <Group> + <GroupName>Application</GroupName> + <Files> + <File> + <FileName>apb_mux_tests.c</FileName> + <FileType>1</FileType> + <FilePath>..\..\..\..\software\common\validation\apb_mux_tests.c</FilePath> + </File> + <File> + <FileName>uart_stdout.c</FileName> + <FileType>1</FileType> + <FilePath>..\..\..\..\software\common\retarget\uart_stdout.c</FilePath> + </File> + <File> + <FileName>retarget.c</FileName> + <FileType>1</FileType> + <FilePath>..\..\..\..\software\common\retarget\retarget.c</FilePath> + </File> + </Files> + </Group> + <Group> + <GroupName>System</GroupName> + <Files> + <File> + <FileName>system_CMSDK_CM0plus.c</FileName> + <FileType>1</FileType> + <FilePath>..\..\..\..\software\cmsis\Device\ARM\CMSDK_CM0plus\Source\system_CMSDK_CM0plus.c</FilePath> + </File> + </Files> + </Group> + </Groups> + </Target> + </Targets> + +</Project> diff --git a/Cortex-M0/nanosoc/systems/mcu/testcodes/apb_mux_tests/makefile b/Cortex-M0/nanosoc/systems/mcu/testcodes/apb_mux_tests/makefile new file mode 100644 index 0000000..3705c8b --- /dev/null +++ b/Cortex-M0/nanosoc/systems/mcu/testcodes/apb_mux_tests/makefile @@ -0,0 +1,251 @@ +#----------------------------------------------------------------------------- +# The confidential and proprietary information contained in this file may +# only be used by a person authorised under and to the extent permitted +# by a subsisting licensing agreement from Arm Limited or its affiliates. +# +# (C) COPYRIGHT 2010-2013 Arm Limited or its affiliates. +# ALL RIGHTS RESERVED +# +# This entire notice must be reproduced on all copies of this file +# and copies of this file may only be made by a person if such person is +# permitted to do so under the terms of a subsisting license agreement +# from Arm Limited or its affiliates. +# +# SVN Information +# +# Checked In : $Date: 2017-10-10 15:55:38 +0100 (Tue, 10 Oct 2017) $ +# +# Revision : $Revision: 371321 $ +# +# Release Information : Cortex-M System Design Kit-r1p1-00rel0 +#----------------------------------------------------------------------------- +# +# Cortex-M System Design Kit software compilation make file +# +#----------------------------------------------------------------------------- +# +# Configurations +# +# Choose the core instantiated, can be +# - CORTEX_M0 +# - CORTEX_M0PLUS +CPU_PRODUCT = CORTEX_M0PLUS + +# Shared software directory +SOFTWARE_DIR = ../../../../software +CMSIS_DIR = $(SOFTWARE_DIR)/cmsis +CORE_DIR = $(CMSIS_DIR)/CMSIS/Include + +ifeq ($(CPU_PRODUCT),CORTEX_M0PLUS) + DEVICE_DIR = $(CMSIS_DIR)/Device/ARM/CMSDK_CM0plus +else + DEVICE_DIR = $(CMSIS_DIR)/Device/ARM/CMSDK_CM0 +endif + +# Program file +TESTNAME = apb_mux_tests + +# Endian Option +COMPILE_BIGEND = 0 + + +# Configuration +ifeq ($(CPU_PRODUCT),CORTEX_M0PLUS) + USER_DEFINE = -DCORTEX_M0PLUS +else + USER_DEFINE = -DCORTEX_M0 +endif + +DEPS_LIST = makefile + +# Tool chain : ds5 / gcc / keil +TOOL_CHAIN = ds5 + +ifeq ($(TOOL_CHAIN),ds5) + ifeq ($(CPU_PRODUCT),CORTEX_M0PLUS) + CPU_TYPE = --cpu Cortex-M0plus + else + CPU_TYPE = --cpu Cortex-M0 + endif +endif + +ifeq ($(TOOL_CHAIN),gcc) + ifeq ($(CPU_PRODUCT),CORTEX_M0PLUS) + CPU_TYPE = -mcpu=cortex-m0plus + else + CPU_TYPE = -mcpu=cortex-m0 + endif +endif + +# Startup code directory for DS-5 +ifeq ($(TOOL_CHAIN),ds5) + STARTUP_DIR = $(DEVICE_DIR)/Source/ARM +endif + +# Startup code directory for gcc +ifeq ($(TOOL_CHAIN),gcc) + STARTUP_DIR = $(DEVICE_DIR)/Source/GCC +endif + +ifeq ($(CPU_PRODUCT),CORTEX_M0PLUS) + STARTUP_FILE = startup_CMSDK_CM0plus + SYSTEM_FILE = system_CMSDK_CM0plus +else + STARTUP_FILE = startup_CMSDK_CM0 + SYSTEM_FILE = system_CMSDK_CM0 +endif + +# --------------------------------------------------------------------------------------- +# D5-5 options + +# MicroLIB option +COMPILE_MICROLIB = 0 + +# Small Multiply (Cortex-M0/M0+ has small multiplier option) +COMPILE_SMALLMUL = 0 + +ARM_CC_OPTIONS = -c -O3 -g -Otime -I $(DEVICE_DIR)/Include -I $(CORE_DIR) \ + -I $(SOFTWARE_DIR)/common/retarget $(USER_DEFINE) +ARM_ASM_OPTIONS = -g +ARM_LINK_OPTIONS = "--keep=$(STARTUP_FILE).o(RESET)" "--first=$(STARTUP_FILE).o(RESET)" \ + --rw_base 0x20000000 --ro_base 0x00000000 --map + +ifeq ($(COMPILE_BIGEND),1) + # Big Endian + ARM_CC_OPTIONS += --bigend + ARM_ASM_OPTIONS += --bigend + ARM_LINK_OPTIONS += --be8 +endif + +ifeq ($(COMPILE_MICROLIB),1) + # MicroLIB + ARM_CC_OPTIONS += --library_type=microlib + ARM_ASM_OPTIONS += --library_type=microlib --pd "__MICROLIB SETA 1" + ARM_LINK_OPTIONS += --library_type=microlib +endif + +ifeq ($(COMPILE_SMALLMUL),1) + # In Cortex-M0, small multiply takes 32 cycles + ARM_CC_OPTIONS += --multiply_latency=32 +endif + +# --------------------------------------------------------------------------------------- +# gcc options + +GNG_CC = arm-none-eabi-gcc +GNU_OBJDUMP = arm-none-eabi-objdump +GNU_OBJCOPY = arm-none-eabi-objcopy + +LINKER_SCRIPT_PATH = $(SOFTWARE_DIR)/common/scripts +LINKER_SCRIPT = $(LINKER_SCRIPT_PATH)/cmsdk_cm0.ld + +GNU_CC_FLAGS = -g -O3 -mthumb $(CPU_TYPE) + +ifeq ($(COMPILE_BIGEND),1) + # Big Endian + GNU_CC_FLAGS += -mbig-endian +endif + +# --------------------------------------------------------------------------------------- +all: all_$(TOOL_CHAIN) + +# --------------------------------------------------------------------------------------- +# DS-5 + +all_ds5 : $(TESTNAME).hex $(TESTNAME).lst + +$(TESTNAME).o : $(SOFTWARE_DIR)/common/validation/$(TESTNAME).c $(DEPS_LIST) + armcc $(ARM_CC_OPTIONS) $(CPU_TYPE) $< -o $@ + +$(SYSTEM_FILE).o : $(DEVICE_DIR)/Source/$(SYSTEM_FILE).c $(DEPS_LIST) + armcc $(ARM_CC_OPTIONS) $(CPU_TYPE) $< -o $@ + +retarget.o : $(SOFTWARE_DIR)/common/retarget/retarget.c $(DEPS_LIST) + armcc $(ARM_CC_OPTIONS) $(CPU_TYPE) $< -o $@ + +uart_stdout.o : $(SOFTWARE_DIR)/common/retarget/uart_stdout.c $(DEPS_LIST) + armcc $(ARM_CC_OPTIONS) $(CPU_TYPE) $< -o $@ + +$(STARTUP_FILE).o : $(STARTUP_DIR)/$(STARTUP_FILE).s $(DEPS_LIST) + armasm $(ARM_ASM_OPTIONS) $(CPU_TYPE) $< -o $@ + +$(TESTNAME).ELF : $(TESTNAME).o $(SYSTEM_FILE).o $(STARTUP_FILE).o retarget.o uart_stdout.o + armlink $(ARM_LINK_OPTIONS) -o $@ $(TESTNAME).o $(SYSTEM_FILE).o $(STARTUP_FILE).o retarget.o uart_stdout.o + +$(TESTNAME).hex : $(TESTNAME).ELF + fromelf --vhx --8x1 $< --output $@ + +$(TESTNAME).lst : $(TESTNAME).ELF makefile + fromelf -c -d -e -s $< --output $@ + +# --------------------------------------------------------------------------------------- +# gcc +all_gcc: + $(GNG_CC) $(GNU_CC_FLAGS) $(STARTUP_DIR)/$(STARTUP_FILE).s \ + $(SOFTWARE_DIR)/common/validation/$(TESTNAME).c \ + $(SOFTWARE_DIR)/common/retarget/retarget.c \ + $(SOFTWARE_DIR)/common/retarget/uart_stdout.c \ + $(DEVICE_DIR)/Source/$(SYSTEM_FILE).c \ + -I $(DEVICE_DIR)/Include -I $(CORE_DIR) \ + -I $(SOFTWARE_DIR)/common/retarget \ + -L $(LINKER_SCRIPT_PATH) \ + -D__STACK_SIZE=0x200 \ + -D__HEAP_SIZE=0x1000 \ + $(USER_DEFINE) -T $(LINKER_SCRIPT) -o $(TESTNAME).o + # Generate disassembly code + $(GNU_OBJDUMP) -S $(TESTNAME).o > $(TESTNAME).lst + # Generate binary file + $(GNU_OBJCOPY) -S $(TESTNAME).o -O binary $(TESTNAME).bin + # Generate hex file + $(GNU_OBJCOPY) -S $(TESTNAME).o -O verilog $(TESTNAME).hex + +# Note: +# If the version of object copy you are using does not support verilog hex file output, +# you can generate the hex file from binary file using the following command +# od -v -A n -t x1 --width=1 $(TESTNAME).bin > $(TESTNAME).hex + +# --------------------------------------------------------------------------------------- +# Keil MDK + +all_keil: + @echo "Please compile your project code and press ENTER when ready" + @read dummy + +# --------------------------------------------------------------------------------------- +# Binary + +all_bin: $(TESTNAME).bin + # Generate hex file from binary + od -v -A n -t x1 --width=1 $(TESTNAME).bin > $(TESTNAME).hex + +# --------------------------------------------------------------------------------------- +# Clean + +clean : + @rm -rf *.o + @if [ -e $(TESTNAME).hex ] ; then \ + rm -rf $(TESTNAME).hex ; \ + fi + @if [ -e $(TESTNAME).lst ] ; then \ + rm -rf $(TESTNAME).lst ; \ + fi + @if [ -e $(TESTNAME).ELF ] ; then \ + rm -rf $(TESTNAME).ELF ; \ + fi + @if [ -e $(TESTNAME).bin ] ; then \ + rm -rf $(TESTNAME).bin ; \ + fi + @rm -rf *.crf + @rm -rf *.plg + @rm -rf *.tra + @rm -rf *.htm + @rm -rf *.map + @rm -rf *.dep + @rm -rf *.d + @rm -rf *.lnp + @rm -rf *.bak + @rm -rf *.lst + @rm -rf *.axf + @rm -rf *.sct + @rm -rf *.__i + @rm -rf *._ia diff --git a/Cortex-M0/nanosoc/systems/mcu/testcodes/bootloader/bootloader_cm0.uvopt b/Cortex-M0/nanosoc/systems/mcu/testcodes/bootloader/bootloader_cm0.uvopt new file mode 100644 index 0000000..54e406f --- /dev/null +++ b/Cortex-M0/nanosoc/systems/mcu/testcodes/bootloader/bootloader_cm0.uvopt @@ -0,0 +1,229 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no" ?> +<ProjectOpt xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="project_opt.xsd"> + + <SchemaVersion>1.0</SchemaVersion> + + <Header>### uVision Project, (C) Keil Software</Header> + + <Extensions> + <cExt>*.c</cExt> + <aExt>*.s*; *.src; *.a*</aExt> + <oExt>*.obj</oExt> + <lExt>*.lib</lExt> + <tExt>*.txt; *.h; *.inc</tExt> + <pExt>*.plm</pExt> + <CppX>*.cpp</CppX> + </Extensions> + + <DaveTm> + <dwLowDateTime>0</dwLowDateTime> + <dwHighDateTime>0</dwHighDateTime> + </DaveTm> + + <Target> + <TargetName>Debug</TargetName> + <ToolsetNumber>0x4</ToolsetNumber> + <ToolsetName>ARM-ADS</ToolsetName> + <TargetOption> + <CLKADS>50000000</CLKADS> + <OPTTT> + <gFlags>1</gFlags> + <BeepAtEnd>1</BeepAtEnd> + <RunSim>1</RunSim> + <RunTarget>0</RunTarget> + </OPTTT> + <OPTHX> + <HexSelection>1</HexSelection> + <FlashByte>65535</FlashByte> + <HexRangeLowAddress>0</HexRangeLowAddress> + <HexRangeHighAddress>0</HexRangeHighAddress> + <HexOffset>0</HexOffset> + </OPTHX> + <OPTLEX> + <PageWidth>79</PageWidth> + <PageLength>66</PageLength> + <TabStop>8</TabStop> + <ListingPath>.\</ListingPath> + </OPTLEX> + <ListingPage> + <CreateCListing>1</CreateCListing> + <CreateAListing>1</CreateAListing> + <CreateLListing>1</CreateLListing> + <CreateIListing>0</CreateIListing> + <AsmCond>1</AsmCond> + <AsmSymb>1</AsmSymb> + <AsmXref>0</AsmXref> + <CCond>1</CCond> + <CCode>0</CCode> + <CListInc>0</CListInc> + <CSymb>0</CSymb> + <LinkerCodeListing>0</LinkerCodeListing> + </ListingPage> + <OPTXL> + <LMap>1</LMap> + <LComments>1</LComments> + <LGenerateSymbols>1</LGenerateSymbols> + <LLibSym>1</LLibSym> + <LLines>1</LLines> + <LLocSym>1</LLocSym> + <LPubSym>1</LPubSym> + <LXref>0</LXref> + <LExpSel>0</LExpSel> + </OPTXL> + <OPTFL> + <tvExp>1</tvExp> + <tvExpOptDlg>0</tvExpOptDlg> + <IsCurrentTarget>1</IsCurrentTarget> + </OPTFL> + <CpuCode>255</CpuCode> + <DllOpt> + <SimDllName>SARMCM3.DLL</SimDllName> + <SimDllArguments></SimDllArguments> + <SimDlgDllName>DARMCM1.DLL</SimDlgDllName> + <SimDlgDllArguments></SimDlgDllArguments> + <TargetDllName>SARMCM3.DLL</TargetDllName> + <TargetDllArguments></TargetDllArguments> + <TargetDlgDllName>TARMCM1.DLL</TargetDlgDllName> + <TargetDlgDllArguments></TargetDlgDllArguments> + </DllOpt> + <DebugOpt> + <uSim>1</uSim> + <uTrg>0</uTrg> + <sLdApp>1</sLdApp> + <sGomain>1</sGomain> + <sRbreak>1</sRbreak> + <sRwatch>1</sRwatch> + <sRmem>1</sRmem> + <sRfunc>1</sRfunc> + <sRbox>1</sRbox> + <tLdApp>1</tLdApp> + <tGomain>0</tGomain> + <tRbreak>1</tRbreak> + <tRwatch>1</tRwatch> + <tRmem>1</tRmem> + <tRfunc>0</tRfunc> + <tRbox>1</tRbox> + <tRtrace>0</tRtrace> + <sRunDeb>0</sRunDeb> + <sLrtime>0</sLrtime> + <nTsel>-1</nTsel> + <sDll></sDll> + <sDllPa></sDllPa> + <sDlgDll></sDlgDll> + <sDlgPa></sDlgPa> + <sIfile></sIfile> + <tDll></tDll> + <tDllPa></tDllPa> + <tDlgDll></tDlgDll> + <tDlgPa></tDlgPa> + <tIfile></tIfile> + <pMon></pMon> + </DebugOpt> + <Breakpoint/> + <DebugFlag> + <trace>0</trace> + <periodic>1</periodic> + <aLwin>0</aLwin> + <aCover>0</aCover> + <aSer1>0</aSer1> + <aSer2>0</aSer2> + <aPa>0</aPa> + <viewmode>0</viewmode> + <vrSel>0</vrSel> + <aSym>0</aSym> + <aTbox>0</aTbox> + <AscS1>0</AscS1> + <AscS2>0</AscS2> + <AscS3>0</AscS3> + <aSer3>0</aSer3> + <eProf>0</eProf> + <aLa>0</aLa> + <aPa1>0</aPa1> + <AscS4>0</AscS4> + <aSer4>0</aSer4> + <StkLoc>0</StkLoc> + <TrcWin>0</TrcWin> + <newCpu>0</newCpu> + <uProt>0</uProt> + </DebugFlag> + <Tracepoint> + <THDelay>0</THDelay> + </Tracepoint> + <LintExecutable></LintExecutable> + <LintConfigFile></LintConfigFile> + </TargetOption> + </Target> + + <Group> + <GroupName>Startup</GroupName> + <tvExp>1</tvExp> + <tvExpOptDlg>0</tvExpOptDlg> + <cbSel>0</cbSel> + <RteFlg>0</RteFlg> + <File> + <GroupNumber>1</GroupNumber> + <FileNumber>1</FileNumber> + <FileType>2</FileType> + <tvExp>0</tvExp> + <Focus>0</Focus> + <ColumnNumber>0</ColumnNumber> + <tvExpOptDlg>0</tvExpOptDlg> + <TopLine>0</TopLine> + <CurrentLine>0</CurrentLine> + <bDave2>0</bDave2> + <PathWithFileName>..\..\..\..\software\cmsis\Device\ARM\CMSDK_CM0\Source\ARM\startup_CMSDK_CM0.s</PathWithFileName> + <FilenameWithoutPath>startup_CMSDK_CM0.s</FilenameWithoutPath> + <RteFlg>0</RteFlg> + <bShared>0</bShared> + </File> + </Group> + + <Group> + <GroupName>Application</GroupName> + <tvExp>1</tvExp> + <tvExpOptDlg>0</tvExpOptDlg> + <cbSel>0</cbSel> + <RteFlg>0</RteFlg> + <File> + <GroupNumber>2</GroupNumber> + <FileNumber>2</FileNumber> + <FileType>1</FileType> + <tvExp>0</tvExp> + <Focus>0</Focus> + <ColumnNumber>0</ColumnNumber> + <tvExpOptDlg>0</tvExpOptDlg> + <TopLine>0</TopLine> + <CurrentLine>0</CurrentLine> + <bDave2>0</bDave2> + <PathWithFileName>..\..\..\..\software\common\bootloader\bootloader.c</PathWithFileName> + <FilenameWithoutPath>bootloader.c</FilenameWithoutPath> + <RteFlg>0</RteFlg> + <bShared>0</bShared> + </File> + </Group> + + <Group> + <GroupName>System</GroupName> + <tvExp>1</tvExp> + <tvExpOptDlg>0</tvExpOptDlg> + <cbSel>0</cbSel> + <RteFlg>0</RteFlg> + <File> + <GroupNumber>3</GroupNumber> + <FileNumber>3</FileNumber> + <FileType>1</FileType> + <tvExp>0</tvExp> + <Focus>0</Focus> + <ColumnNumber>0</ColumnNumber> + <tvExpOptDlg>0</tvExpOptDlg> + <TopLine>0</TopLine> + <CurrentLine>0</CurrentLine> + <bDave2>0</bDave2> + <PathWithFileName>..\..\..\..\software\cmsis\Device\ARM\CMSDK_CM0\Source\system_CMSDK_CM0.c</PathWithFileName> + <FilenameWithoutPath>system_CMSDK_CM0.c</FilenameWithoutPath> + <RteFlg>0</RteFlg> + <bShared>0</bShared> + </File> + </Group> + +</ProjectOpt> diff --git a/Cortex-M0/nanosoc/systems/mcu/testcodes/bootloader/bootloader_cm0.uvproj b/Cortex-M0/nanosoc/systems/mcu/testcodes/bootloader/bootloader_cm0.uvproj new file mode 100644 index 0000000..cadb326 --- /dev/null +++ b/Cortex-M0/nanosoc/systems/mcu/testcodes/bootloader/bootloader_cm0.uvproj @@ -0,0 +1,425 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no" ?> +<Project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="project_proj.xsd"> + + <SchemaVersion>1.1</SchemaVersion> + + <Header>### uVision Project, (C) Keil Software</Header> + + <Targets> + <Target> + <TargetName>Debug</TargetName> + <ToolsetNumber>0x4</ToolsetNumber> + <ToolsetName>ARM-ADS</ToolsetName> + <TargetOption> + <TargetCommonOption> + <Device>Cortex-M0</Device> + <Vendor>ARM</Vendor> + <Cpu>CLOCK(12000000) CPUTYPE("Cortex-M0") ESEL ELITTLE</Cpu> + <FlashUtilSpec></FlashUtilSpec> + <StartupFile></StartupFile> + <FlashDriverDll></FlashDriverDll> + <DeviceId>4803</DeviceId> + <RegisterFile></RegisterFile> + <MemoryEnv></MemoryEnv> + <Cmp></Cmp> + <Asm></Asm> + <Linker></Linker> + <OHString></OHString> + <InfinionOptionDll></InfinionOptionDll> + <SLE66CMisc></SLE66CMisc> + <SLE66AMisc></SLE66AMisc> + <SLE66LinkerMisc></SLE66LinkerMisc> + <SFDFile></SFDFile> + <UseEnv>0</UseEnv> + <BinPath></BinPath> + <IncludePath></IncludePath> + <LibPath></LibPath> + <RegisterFilePath></RegisterFilePath> + <DBRegisterFilePath></DBRegisterFilePath> + <TargetStatus> + <Error>0</Error> + <ExitCodeStop>0</ExitCodeStop> + <ButtonStop>0</ButtonStop> + <NotGenerated>0</NotGenerated> + <InvalidFlash>1</InvalidFlash> + </TargetStatus> + <OutputDirectory>.\</OutputDirectory> + <OutputName>bootloader</OutputName> + <CreateExecutable>1</CreateExecutable> + <CreateLib>0</CreateLib> + <CreateHexFile>0</CreateHexFile> + <DebugInformation>1</DebugInformation> + <BrowseInformation>1</BrowseInformation> + <ListingPath>.\</ListingPath> + <HexFormatSelection>1</HexFormatSelection> + <Merge32K>0</Merge32K> + <CreateBatchFile>0</CreateBatchFile> + <BeforeCompile> + <RunUserProg1>0</RunUserProg1> + <RunUserProg2>0</RunUserProg2> + <UserProg1Name></UserProg1Name> + <UserProg2Name></UserProg2Name> + <UserProg1Dos16Mode>0</UserProg1Dos16Mode> + <UserProg2Dos16Mode>0</UserProg2Dos16Mode> + <nStopU1X>0</nStopU1X> + <nStopU2X>0</nStopU2X> + </BeforeCompile> + <BeforeMake> + <RunUserProg1>0</RunUserProg1> + <RunUserProg2>0</RunUserProg2> + <UserProg1Name></UserProg1Name> + <UserProg2Name></UserProg2Name> + <UserProg1Dos16Mode>0</UserProg1Dos16Mode> + <UserProg2Dos16Mode>0</UserProg2Dos16Mode> + </BeforeMake> + <AfterMake> + <RunUserProg1>1</RunUserProg1> + <RunUserProg2>0</RunUserProg2> + <UserProg1Name>$K\ARM\ARMCC\BIN\fromelf.exe #L --vhx --8x1 --output bootloader.hex</UserProg1Name> + <UserProg2Name></UserProg2Name> + <UserProg1Dos16Mode>0</UserProg1Dos16Mode> + <UserProg2Dos16Mode>0</UserProg2Dos16Mode> + </AfterMake> + <SelectedForBatchBuild>0</SelectedForBatchBuild> + <SVCSIdString></SVCSIdString> + </TargetCommonOption> + <CommonProperty> + <UseCPPCompiler>0</UseCPPCompiler> + <RVCTCodeConst>0</RVCTCodeConst> + <RVCTZI>0</RVCTZI> + <RVCTOtherData>0</RVCTOtherData> + <ModuleSelection>0</ModuleSelection> + <IncludeInBuild>1</IncludeInBuild> + <AlwaysBuild>0</AlwaysBuild> + <GenerateAssemblyFile>0</GenerateAssemblyFile> + <AssembleAssemblyFile>0</AssembleAssemblyFile> + <PublicsOnly>0</PublicsOnly> + <StopOnExitCode>3</StopOnExitCode> + <CustomArgument></CustomArgument> + <IncludeLibraryModules></IncludeLibraryModules> + </CommonProperty> + <DllOption> + <SimDllName>SARMCM3.DLL</SimDllName> + <SimDllArguments></SimDllArguments> + <SimDlgDll>DARMCM1.DLL</SimDlgDll> + <SimDlgDllArguments></SimDlgDllArguments> + <TargetDllName>SARMCM3.DLL</TargetDllName> + <TargetDllArguments></TargetDllArguments> + <TargetDlgDll>TARMCM1.DLL</TargetDlgDll> + <TargetDlgDllArguments></TargetDlgDllArguments> + </DllOption> + <DebugOption> + <OPTHX> + <HexSelection>1</HexSelection> + <HexRangeLowAddress>0</HexRangeLowAddress> + <HexRangeHighAddress>0</HexRangeHighAddress> + <HexOffset>0</HexOffset> + <Oh166RecLen>16</Oh166RecLen> + </OPTHX> + <Simulator> + <UseSimulator>1</UseSimulator> + <LoadApplicationAtStartup>1</LoadApplicationAtStartup> + <RunToMain>1</RunToMain> + <RestoreBreakpoints>1</RestoreBreakpoints> + <RestoreWatchpoints>1</RestoreWatchpoints> + <RestoreMemoryDisplay>1</RestoreMemoryDisplay> + <RestoreFunctions>1</RestoreFunctions> + <RestoreToolbox>1</RestoreToolbox> + <LimitSpeedToRealTime>0</LimitSpeedToRealTime> + </Simulator> + <Target> + <UseTarget>0</UseTarget> + <LoadApplicationAtStartup>1</LoadApplicationAtStartup> + <RunToMain>0</RunToMain> + <RestoreBreakpoints>1</RestoreBreakpoints> + <RestoreWatchpoints>1</RestoreWatchpoints> + <RestoreMemoryDisplay>1</RestoreMemoryDisplay> + <RestoreFunctions>0</RestoreFunctions> + <RestoreToolbox>1</RestoreToolbox> + <RestoreTracepoints>0</RestoreTracepoints> + </Target> + <RunDebugAfterBuild>0</RunDebugAfterBuild> + <TargetSelection>-1</TargetSelection> + <SimDlls> + <CpuDll></CpuDll> + <CpuDllArguments></CpuDllArguments> + <PeripheralDll></PeripheralDll> + <PeripheralDllArguments></PeripheralDllArguments> + <InitializationFile></InitializationFile> + </SimDlls> + <TargetDlls> + <CpuDll></CpuDll> + <CpuDllArguments></CpuDllArguments> + <PeripheralDll></PeripheralDll> + <PeripheralDllArguments></PeripheralDllArguments> + <InitializationFile></InitializationFile> + <Driver></Driver> + </TargetDlls> + </DebugOption> + <Utilities> + <Flash1> + <UseTargetDll>0</UseTargetDll> + <UseExternalTool>0</UseExternalTool> + <RunIndependent>0</RunIndependent> + <UpdateFlashBeforeDebugging>0</UpdateFlashBeforeDebugging> + <Capability>0</Capability> + <DriverSelection>-1</DriverSelection> + </Flash1> + <Flash2></Flash2> + <Flash3></Flash3> + <Flash4></Flash4> + </Utilities> + <TargetArmAds> + <ArmAdsMisc> + <GenerateListings>0</GenerateListings> + <asHll>1</asHll> + <asAsm>1</asAsm> + <asMacX>1</asMacX> + <asSyms>1</asSyms> + <asFals>1</asFals> + <asDbgD>1</asDbgD> + <asForm>1</asForm> + <ldLst>0</ldLst> + <ldmm>1</ldmm> + <ldXref>1</ldXref> + <BigEnd>0</BigEnd> + <AdsALst>1</AdsALst> + <AdsACrf>1</AdsACrf> + <AdsANop>0</AdsANop> + <AdsANot>0</AdsANot> + <AdsLLst>1</AdsLLst> + <AdsLmap>1</AdsLmap> + <AdsLcgr>1</AdsLcgr> + <AdsLsym>1</AdsLsym> + <AdsLszi>1</AdsLszi> + <AdsLtoi>1</AdsLtoi> + <AdsLsun>1</AdsLsun> + <AdsLven>1</AdsLven> + <AdsLsxf>1</AdsLsxf> + <RvctClst>0</RvctClst> + <GenPPlst>0</GenPPlst> + <AdsCpuType>"Cortex-M0"</AdsCpuType> + <RvctDeviceName></RvctDeviceName> + <mOS>0</mOS> + <uocRom>0</uocRom> + <uocRam>0</uocRam> + <hadIROM>0</hadIROM> + <hadIRAM>0</hadIRAM> + <hadXRAM>0</hadXRAM> + <uocXRam>0</uocXRam> + <RvdsVP>0</RvdsVP> + <hadIRAM2>0</hadIRAM2> + <hadIROM2>0</hadIROM2> + <StupSel>1</StupSel> + <useUlib>0</useUlib> + <EndSel>1</EndSel> + <uLtcg>0</uLtcg> + <RoSelD>0</RoSelD> + <RwSelD>5</RwSelD> + <CodeSel>0</CodeSel> + <OptFeed>0</OptFeed> + <NoZi1>0</NoZi1> + <NoZi2>0</NoZi2> + <NoZi3>0</NoZi3> + <NoZi4>0</NoZi4> + <NoZi5>0</NoZi5> + <Ro1Chk>1</Ro1Chk> + <Ro2Chk>0</Ro2Chk> + <Ro3Chk>0</Ro3Chk> + <Ir1Chk>0</Ir1Chk> + <Ir2Chk>0</Ir2Chk> + <Ra1Chk>1</Ra1Chk> + <Ra2Chk>0</Ra2Chk> + <Ra3Chk>0</Ra3Chk> + <Im1Chk>0</Im1Chk> + <Im2Chk>0</Im2Chk> + <OnChipMemories> + <Ocm1> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </Ocm1> + <Ocm2> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </Ocm2> + <Ocm3> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </Ocm3> + <Ocm4> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </Ocm4> + <Ocm5> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </Ocm5> + <Ocm6> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </Ocm6> + <IRAM> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </IRAM> + <IROM> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </IROM> + <XRAM> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </XRAM> + <OCR_RVCT1> + <Type>1</Type> + <StartAddress>0x1000000</StartAddress> + <Size>0x10000</Size> + </OCR_RVCT1> + <OCR_RVCT2> + <Type>1</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </OCR_RVCT2> + <OCR_RVCT3> + <Type>1</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </OCR_RVCT3> + <OCR_RVCT4> + <Type>1</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </OCR_RVCT4> + <OCR_RVCT5> + <Type>1</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </OCR_RVCT5> + <OCR_RVCT6> + <Type>0</Type> + <StartAddress>0x20000000</StartAddress> + <Size>0x10000</Size> + </OCR_RVCT6> + <OCR_RVCT7> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </OCR_RVCT7> + <OCR_RVCT8> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </OCR_RVCT8> + <OCR_RVCT9> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </OCR_RVCT9> + <OCR_RVCT10> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </OCR_RVCT10> + </OnChipMemories> + <RvctStartVector></RvctStartVector> + </ArmAdsMisc> + <Cads> + <interw>1</interw> + <Optim>4</Optim> + <oTime>0</oTime> + <SplitLS>0</SplitLS> + <OneElfS>0</OneElfS> + <Strict>0</Strict> + <EnumInt>0</EnumInt> + <PlainCh>0</PlainCh> + <Ropi>0</Ropi> + <Rwpi>0</Rwpi> + <wLevel>0</wLevel> + <uThumb>0</uThumb> + <uSurpInc>0</uSurpInc> + <VariousControls> + <MiscControls></MiscControls> + <Define>CORTEX_M0</Define> + <Undefine></Undefine> + <IncludePath>..\..\..\..\software\cmsis\CMSIS\Include; ..\..\..\..\software\cmsis\Device\ARM\CMSDK_CM0\Include; ..\..\..\..\software\common\retarget</IncludePath> + </VariousControls> + </Cads> + <Aads> + <interw>1</interw> + <Ropi>0</Ropi> + <Rwpi>0</Rwpi> + <thumb>0</thumb> + <SplitLS>0</SplitLS> + <SwStkChk>0</SwStkChk> + <NoWarn>0</NoWarn> + <uSurpInc>0</uSurpInc> + <VariousControls> + <MiscControls></MiscControls> + <Define></Define> + <Undefine></Undefine> + <IncludePath></IncludePath> + </VariousControls> + </Aads> + <LDads> + <umfTarg>1</umfTarg> + <Ropi>0</Ropi> + <Rwpi>0</Rwpi> + <noStLib>0</noStLib> + <RepFail>1</RepFail> + <useFile>0</useFile> + <TextAddressRange>0x00000000</TextAddressRange> + <DataAddressRange>0x00000000</DataAddressRange> + <ScatterFile></ScatterFile> + <IncludeLibs></IncludeLibs> + <IncludeLibsPath></IncludeLibsPath> + <Misc></Misc> + <LinkerInputFile></LinkerInputFile> + <DisabledWarnings></DisabledWarnings> + </LDads> + </TargetArmAds> + </TargetOption> + <Groups> + <Group> + <GroupName>Startup</GroupName> + <Files> + <File> + <FileName>startup_CMSDK_CM0.s</FileName> + <FileType>2</FileType> + <FilePath>..\..\..\..\software\cmsis\Device\ARM\CMSDK_CM0\Source\ARM\startup_CMSDK_CM0.s</FilePath> + </File> + </Files> + </Group> + <Group> + <GroupName>Application</GroupName> + <Files> + <File> + <FileName>bootloader.c</FileName> + <FileType>1</FileType> + <FilePath>..\..\..\..\software\common\bootloader\bootloader.c</FilePath> + </File> + </Files> + </Group> + <Group> + <GroupName>System</GroupName> + <Files> + <File> + <FileName>system_CMSDK_CM0.c</FileName> + <FileType>1</FileType> + <FilePath>..\..\..\..\software\cmsis\Device\ARM\CMSDK_CM0\Source\system_CMSDK_CM0.c</FilePath> + </File> + </Files> + </Group> + </Groups> + </Target> + </Targets> + +</Project> diff --git a/Cortex-M0/nanosoc/systems/mcu/testcodes/bootloader/bootloader_cm0p.uvopt b/Cortex-M0/nanosoc/systems/mcu/testcodes/bootloader/bootloader_cm0p.uvopt new file mode 100644 index 0000000..d7a2948 --- /dev/null +++ b/Cortex-M0/nanosoc/systems/mcu/testcodes/bootloader/bootloader_cm0p.uvopt @@ -0,0 +1,216 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no" ?> +<ProjectOpt xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="project_opt.xsd"> + + <SchemaVersion>1.0</SchemaVersion> + + <Header>### uVision Project, (C) Keil Software</Header> + + <Extensions> + <cExt>*.c</cExt> + <aExt>*.s*; *.src; *.a*</aExt> + <oExt>*.obj</oExt> + <lExt>*.lib</lExt> + <tExt>*.txt; *.h; *.inc</tExt> + <pExt>*.plm</pExt> + <CppX>*.cpp</CppX> + </Extensions> + + <DaveTm> + <dwLowDateTime>0</dwLowDateTime> + <dwHighDateTime>0</dwHighDateTime> + </DaveTm> + + <Target> + <TargetName>Debug</TargetName> + <ToolsetNumber>0x4</ToolsetNumber> + <ToolsetName>ARM-ADS</ToolsetName> + <TargetOption> + <CLKADS>50000000</CLKADS> + <OPTTT> + <gFlags>1</gFlags> + <BeepAtEnd>1</BeepAtEnd> + <RunSim>1</RunSim> + <RunTarget>0</RunTarget> + </OPTTT> + <OPTHX> + <HexSelection>1</HexSelection> + <FlashByte>65535</FlashByte> + <HexRangeLowAddress>0</HexRangeLowAddress> + <HexRangeHighAddress>0</HexRangeHighAddress> + <HexOffset>0</HexOffset> + </OPTHX> + <OPTLEX> + <PageWidth>79</PageWidth> + <PageLength>66</PageLength> + <TabStop>8</TabStop> + <ListingPath>.\</ListingPath> + </OPTLEX> + <ListingPage> + <CreateCListing>1</CreateCListing> + <CreateAListing>1</CreateAListing> + <CreateLListing>1</CreateLListing> + <CreateIListing>0</CreateIListing> + <AsmCond>1</AsmCond> + <AsmSymb>1</AsmSymb> + <AsmXref>0</AsmXref> + <CCond>1</CCond> + <CCode>0</CCode> + <CListInc>0</CListInc> + <CSymb>0</CSymb> + <LinkerCodeListing>0</LinkerCodeListing> + </ListingPage> + <OPTXL> + <LMap>1</LMap> + <LComments>1</LComments> + <LGenerateSymbols>1</LGenerateSymbols> + <LLibSym>1</LLibSym> + <LLines>1</LLines> + <LLocSym>1</LLocSym> + <LPubSym>1</LPubSym> + <LXref>0</LXref> + <LExpSel>0</LExpSel> + </OPTXL> + <OPTFL> + <tvExp>1</tvExp> + <tvExpOptDlg>0</tvExpOptDlg> + <IsCurrentTarget>1</IsCurrentTarget> + </OPTFL> + <CpuCode>255</CpuCode> + <DllOpt> + <SimDllName>SARMCM3.DLL</SimDllName> + <SimDllArguments></SimDllArguments> + <SimDlgDllName>DARMCM1.DLL</SimDlgDllName> + <SimDlgDllArguments></SimDlgDllArguments> + <TargetDllName>SARMCM3.DLL</TargetDllName> + <TargetDllArguments></TargetDllArguments> + <TargetDlgDllName>TARMCM1.DLL</TargetDlgDllName> + <TargetDlgDllArguments></TargetDlgDllArguments> + </DllOpt> + <DebugOpt> + <uSim>1</uSim> + <uTrg>0</uTrg> + <sLdApp>1</sLdApp> + <sGomain>1</sGomain> + <sRbreak>1</sRbreak> + <sRwatch>1</sRwatch> + <sRmem>1</sRmem> + <sRfunc>1</sRfunc> + <sRbox>1</sRbox> + <tLdApp>1</tLdApp> + <tGomain>0</tGomain> + <tRbreak>1</tRbreak> + <tRwatch>1</tRwatch> + <tRmem>1</tRmem> + <tRfunc>0</tRfunc> + <tRbox>1</tRbox> + <sRunDeb>0</sRunDeb> + <sLrtime>0</sLrtime> + <nTsel>-1</nTsel> + <sDll></sDll> + <sDllPa></sDllPa> + <sDlgDll></sDlgDll> + <sDlgPa></sDlgPa> + <sIfile></sIfile> + <tDll></tDll> + <tDllPa></tDllPa> + <tDlgDll></tDlgDll> + <tDlgPa></tDlgPa> + <tIfile></tIfile> + <pMon></pMon> + </DebugOpt> + <Breakpoint/> + <DebugFlag> + <trace>0</trace> + <periodic>1</periodic> + <aLwin>0</aLwin> + <aCover>0</aCover> + <aSer1>0</aSer1> + <aSer2>0</aSer2> + <aPa>0</aPa> + <viewmode>0</viewmode> + <vrSel>0</vrSel> + <aSym>0</aSym> + <aTbox>0</aTbox> + <AscS1>0</AscS1> + <AscS2>0</AscS2> + <AscS3>0</AscS3> + <aSer3>0</aSer3> + <eProf>0</eProf> + <aLa>0</aLa> + <aPa1>0</aPa1> + <AscS4>0</AscS4> + <aSer4>0</aSer4> + <StkLoc>0</StkLoc> + <TrcWin>0</TrcWin> + <newCpu>0</newCpu> + <uProt>0</uProt> + </DebugFlag> + <LintExecutable></LintExecutable> + <LintConfigFile></LintConfigFile> + </TargetOption> + </Target> + + <Group> + <GroupName>Startup</GroupName> + <tvExp>1</tvExp> + <tvExpOptDlg>0</tvExpOptDlg> + <cbSel>0</cbSel> + <File> + <GroupNumber>1</GroupNumber> + <FileNumber>1</FileNumber> + <FileType>2</FileType> + <tvExp>0</tvExp> + <Focus>0</Focus> + <ColumnNumber>0</ColumnNumber> + <tvExpOptDlg>0</tvExpOptDlg> + <TopLine>0</TopLine> + <CurrentLine>0</CurrentLine> + <bDave2>0</bDave2> + <PathWithFileName>..\..\..\..\software\cmsis\Device\ARM\CMSDK_CM0plus\Source\ARM\startup_CMSDK_CM0plus.s</PathWithFileName> + <FilenameWithoutPath>startup_CMSDK_CM0plus.s</FilenameWithoutPath> + </File> + </Group> + + <Group> + <GroupName>Application</GroupName> + <tvExp>1</tvExp> + <tvExpOptDlg>0</tvExpOptDlg> + <cbSel>0</cbSel> + <File> + <GroupNumber>2</GroupNumber> + <FileNumber>2</FileNumber> + <FileType>1</FileType> + <tvExp>0</tvExp> + <Focus>0</Focus> + <ColumnNumber>0</ColumnNumber> + <tvExpOptDlg>0</tvExpOptDlg> + <TopLine>0</TopLine> + <CurrentLine>0</CurrentLine> + <bDave2>0</bDave2> + <PathWithFileName>..\..\..\..\software\common\bootloader\bootloader.c</PathWithFileName> + <FilenameWithoutPath>bootloader.c</FilenameWithoutPath> + </File> + </Group> + + <Group> + <GroupName>System</GroupName> + <tvExp>1</tvExp> + <tvExpOptDlg>0</tvExpOptDlg> + <cbSel>0</cbSel> + <File> + <GroupNumber>3</GroupNumber> + <FileNumber>3</FileNumber> + <FileType>1</FileType> + <tvExp>0</tvExp> + <Focus>0</Focus> + <ColumnNumber>0</ColumnNumber> + <tvExpOptDlg>0</tvExpOptDlg> + <TopLine>0</TopLine> + <CurrentLine>0</CurrentLine> + <bDave2>0</bDave2> + <PathWithFileName>..\..\..\..\software\cmsis\Device\ARM\CMSDK_CM0plus\Source\system_CMSDK_CM0plus.c</PathWithFileName> + <FilenameWithoutPath>system_CMSDK_CM0plus.c</FilenameWithoutPath> + </File> + </Group> + +</ProjectOpt> diff --git a/Cortex-M0/nanosoc/systems/mcu/testcodes/bootloader/bootloader_cm0p.uvproj b/Cortex-M0/nanosoc/systems/mcu/testcodes/bootloader/bootloader_cm0p.uvproj new file mode 100644 index 0000000..ba95d12 --- /dev/null +++ b/Cortex-M0/nanosoc/systems/mcu/testcodes/bootloader/bootloader_cm0p.uvproj @@ -0,0 +1,422 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no" ?> +<Project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="project_proj.xsd"> + + <SchemaVersion>1.1</SchemaVersion> + + <Header>### uVision Project, (C) Keil Software</Header> + + <Targets> + <Target> + <TargetName>Debug</TargetName> + <ToolsetNumber>0x4</ToolsetNumber> + <ToolsetName>ARM-ADS</ToolsetName> + <TargetOption> + <TargetCommonOption> + <Device>Cortex-M0+</Device> + <Vendor>ARM</Vendor> + <Cpu>CLOCK(12000000) CPUTYPE("Cortex-M0+") ESEL ELITTLE</Cpu> + <FlashUtilSpec></FlashUtilSpec> + <StartupFile></StartupFile> + <FlashDriverDll></FlashDriverDll> + <DeviceId>6268</DeviceId> + <RegisterFile></RegisterFile> + <MemoryEnv></MemoryEnv> + <Cmp></Cmp> + <Asm></Asm> + <Linker></Linker> + <OHString></OHString> + <InfinionOptionDll></InfinionOptionDll> + <SLE66CMisc></SLE66CMisc> + <SLE66AMisc></SLE66AMisc> + <SLE66LinkerMisc></SLE66LinkerMisc> + <SFDFile></SFDFile> + <UseEnv>0</UseEnv> + <BinPath></BinPath> + <IncludePath></IncludePath> + <LibPath></LibPath> + <RegisterFilePath></RegisterFilePath> + <DBRegisterFilePath></DBRegisterFilePath> + <TargetStatus> + <Error>0</Error> + <ExitCodeStop>0</ExitCodeStop> + <ButtonStop>0</ButtonStop> + <NotGenerated>0</NotGenerated> + <InvalidFlash>1</InvalidFlash> + </TargetStatus> + <OutputDirectory>.\</OutputDirectory> + <OutputName>bootloader</OutputName> + <CreateExecutable>1</CreateExecutable> + <CreateLib>0</CreateLib> + <CreateHexFile>0</CreateHexFile> + <DebugInformation>1</DebugInformation> + <BrowseInformation>1</BrowseInformation> + <ListingPath>.\</ListingPath> + <HexFormatSelection>1</HexFormatSelection> + <Merge32K>0</Merge32K> + <CreateBatchFile>0</CreateBatchFile> + <BeforeCompile> + <RunUserProg1>0</RunUserProg1> + <RunUserProg2>0</RunUserProg2> + <UserProg1Name></UserProg1Name> + <UserProg2Name></UserProg2Name> + <UserProg1Dos16Mode>0</UserProg1Dos16Mode> + <UserProg2Dos16Mode>0</UserProg2Dos16Mode> + <nStopU1X>0</nStopU1X> + <nStopU2X>0</nStopU2X> + </BeforeCompile> + <BeforeMake> + <RunUserProg1>0</RunUserProg1> + <RunUserProg2>0</RunUserProg2> + <UserProg1Name></UserProg1Name> + <UserProg2Name></UserProg2Name> + <UserProg1Dos16Mode>0</UserProg1Dos16Mode> + <UserProg2Dos16Mode>0</UserProg2Dos16Mode> + </BeforeMake> + <AfterMake> + <RunUserProg1>1</RunUserProg1> + <RunUserProg2>0</RunUserProg2> + <UserProg1Name>$K\ARM\ARMCC\BIN\fromelf.exe #L --vhx --8x1 --output bootloader.hex</UserProg1Name> + <UserProg2Name></UserProg2Name> + <UserProg1Dos16Mode>0</UserProg1Dos16Mode> + <UserProg2Dos16Mode>0</UserProg2Dos16Mode> + </AfterMake> + <SelectedForBatchBuild>0</SelectedForBatchBuild> + <SVCSIdString></SVCSIdString> + </TargetCommonOption> + <CommonProperty> + <UseCPPCompiler>0</UseCPPCompiler> + <RVCTCodeConst>0</RVCTCodeConst> + <RVCTZI>0</RVCTZI> + <RVCTOtherData>0</RVCTOtherData> + <ModuleSelection>0</ModuleSelection> + <IncludeInBuild>1</IncludeInBuild> + <AlwaysBuild>0</AlwaysBuild> + <GenerateAssemblyFile>0</GenerateAssemblyFile> + <AssembleAssemblyFile>0</AssembleAssemblyFile> + <PublicsOnly>0</PublicsOnly> + <StopOnExitCode>3</StopOnExitCode> + <CustomArgument></CustomArgument> + <IncludeLibraryModules></IncludeLibraryModules> + </CommonProperty> + <DllOption> + <SimDllName>SARMCM3.DLL</SimDllName> + <SimDllArguments></SimDllArguments> + <SimDlgDll>DARMCM1.DLL</SimDlgDll> + <SimDlgDllArguments></SimDlgDllArguments> + <TargetDllName>SARMCM3.DLL</TargetDllName> + <TargetDllArguments></TargetDllArguments> + <TargetDlgDll>TARMCM1.DLL</TargetDlgDll> + <TargetDlgDllArguments></TargetDlgDllArguments> + </DllOption> + <DebugOption> + <OPTHX> + <HexSelection>1</HexSelection> + <HexRangeLowAddress>0</HexRangeLowAddress> + <HexRangeHighAddress>0</HexRangeHighAddress> + <HexOffset>0</HexOffset> + <Oh166RecLen>16</Oh166RecLen> + </OPTHX> + <Simulator> + <UseSimulator>1</UseSimulator> + <LoadApplicationAtStartup>1</LoadApplicationAtStartup> + <RunToMain>1</RunToMain> + <RestoreBreakpoints>1</RestoreBreakpoints> + <RestoreWatchpoints>1</RestoreWatchpoints> + <RestoreMemoryDisplay>1</RestoreMemoryDisplay> + <RestoreFunctions>1</RestoreFunctions> + <RestoreToolbox>1</RestoreToolbox> + <LimitSpeedToRealTime>0</LimitSpeedToRealTime> + </Simulator> + <Target> + <UseTarget>0</UseTarget> + <LoadApplicationAtStartup>1</LoadApplicationAtStartup> + <RunToMain>0</RunToMain> + <RestoreBreakpoints>1</RestoreBreakpoints> + <RestoreWatchpoints>1</RestoreWatchpoints> + <RestoreMemoryDisplay>1</RestoreMemoryDisplay> + <RestoreFunctions>0</RestoreFunctions> + <RestoreToolbox>1</RestoreToolbox> + </Target> + <RunDebugAfterBuild>0</RunDebugAfterBuild> + <TargetSelection>-1</TargetSelection> + <SimDlls> + <CpuDll></CpuDll> + <CpuDllArguments></CpuDllArguments> + <PeripheralDll></PeripheralDll> + <PeripheralDllArguments></PeripheralDllArguments> + <InitializationFile></InitializationFile> + </SimDlls> + <TargetDlls> + <CpuDll></CpuDll> + <CpuDllArguments></CpuDllArguments> + <PeripheralDll></PeripheralDll> + <PeripheralDllArguments></PeripheralDllArguments> + <InitializationFile></InitializationFile> + <Driver></Driver> + </TargetDlls> + </DebugOption> + <Utilities> + <Flash1> + <UseTargetDll>0</UseTargetDll> + <UseExternalTool>0</UseExternalTool> + <RunIndependent>0</RunIndependent> + <UpdateFlashBeforeDebugging>0</UpdateFlashBeforeDebugging> + <Capability>0</Capability> + <DriverSelection>-1</DriverSelection> + </Flash1> + <Flash2></Flash2> + <Flash3></Flash3> + <Flash4></Flash4> + </Utilities> + <TargetArmAds> + <ArmAdsMisc> + <GenerateListings>0</GenerateListings> + <asHll>1</asHll> + <asAsm>1</asAsm> + <asMacX>1</asMacX> + <asSyms>1</asSyms> + <asFals>1</asFals> + <asDbgD>1</asDbgD> + <asForm>1</asForm> + <ldLst>0</ldLst> + <ldmm>1</ldmm> + <ldXref>1</ldXref> + <BigEnd>0</BigEnd> + <AdsALst>1</AdsALst> + <AdsACrf>1</AdsACrf> + <AdsANop>0</AdsANop> + <AdsANot>0</AdsANot> + <AdsLLst>1</AdsLLst> + <AdsLmap>1</AdsLmap> + <AdsLcgr>1</AdsLcgr> + <AdsLsym>1</AdsLsym> + <AdsLszi>1</AdsLszi> + <AdsLtoi>1</AdsLtoi> + <AdsLsun>1</AdsLsun> + <AdsLven>1</AdsLven> + <AdsLsxf>1</AdsLsxf> + <RvctClst>0</RvctClst> + <GenPPlst>0</GenPPlst> + <AdsCpuType>"Cortex-M0+"</AdsCpuType> + <RvctDeviceName></RvctDeviceName> + <mOS>0</mOS> + <uocRom>0</uocRom> + <uocRam>0</uocRam> + <hadIROM>0</hadIROM> + <hadIRAM>0</hadIRAM> + <hadXRAM>0</hadXRAM> + <uocXRam>0</uocXRam> + <RvdsVP>0</RvdsVP> + <hadIRAM2>0</hadIRAM2> + <hadIROM2>0</hadIROM2> + <StupSel>1</StupSel> + <useUlib>0</useUlib> + <EndSel>1</EndSel> + <uLtcg>0</uLtcg> + <RoSelD>0</RoSelD> + <RwSelD>5</RwSelD> + <CodeSel>0</CodeSel> + <OptFeed>0</OptFeed> + <NoZi1>0</NoZi1> + <NoZi2>0</NoZi2> + <NoZi3>0</NoZi3> + <NoZi4>0</NoZi4> + <NoZi5>0</NoZi5> + <Ro1Chk>1</Ro1Chk> + <Ro2Chk>0</Ro2Chk> + <Ro3Chk>0</Ro3Chk> + <Ir1Chk>0</Ir1Chk> + <Ir2Chk>0</Ir2Chk> + <Ra1Chk>1</Ra1Chk> + <Ra2Chk>0</Ra2Chk> + <Ra3Chk>0</Ra3Chk> + <Im1Chk>0</Im1Chk> + <Im2Chk>0</Im2Chk> + <OnChipMemories> + <Ocm1> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </Ocm1> + <Ocm2> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </Ocm2> + <Ocm3> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </Ocm3> + <Ocm4> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </Ocm4> + <Ocm5> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </Ocm5> + <Ocm6> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </Ocm6> + <IRAM> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </IRAM> + <IROM> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </IROM> + <XRAM> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </XRAM> + <OCR_RVCT1> + <Type>1</Type> + <StartAddress>0x1000000</StartAddress> + <Size>0x10000</Size> + </OCR_RVCT1> + <OCR_RVCT2> + <Type>1</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </OCR_RVCT2> + <OCR_RVCT3> + <Type>1</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </OCR_RVCT3> + <OCR_RVCT4> + <Type>1</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </OCR_RVCT4> + <OCR_RVCT5> + <Type>1</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </OCR_RVCT5> + <OCR_RVCT6> + <Type>0</Type> + <StartAddress>0x20000000</StartAddress> + <Size>0x10000</Size> + </OCR_RVCT6> + <OCR_RVCT7> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </OCR_RVCT7> + <OCR_RVCT8> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </OCR_RVCT8> + <OCR_RVCT9> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </OCR_RVCT9> + <OCR_RVCT10> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </OCR_RVCT10> + </OnChipMemories> + <RvctStartVector></RvctStartVector> + </ArmAdsMisc> + <Cads> + <interw>1</interw> + <Optim>4</Optim> + <oTime>0</oTime> + <SplitLS>0</SplitLS> + <OneElfS>0</OneElfS> + <Strict>0</Strict> + <EnumInt>0</EnumInt> + <PlainCh>0</PlainCh> + <Ropi>0</Ropi> + <Rwpi>0</Rwpi> + <wLevel>0</wLevel> + <uThumb>0</uThumb> + <VariousControls> + <MiscControls></MiscControls> + <Define>CORTEX_M0PLUS</Define> + <Undefine></Undefine> + <IncludePath>..\..\..\..\software\cmsis\CMSIS\Include; ..\..\..\..\software\cmsis\Device\ARM\CMSDK_CM0plus\Include; ..\..\..\..\software\common\retarget</IncludePath> + </VariousControls> + </Cads> + <Aads> + <interw>1</interw> + <Ropi>0</Ropi> + <Rwpi>0</Rwpi> + <thumb>0</thumb> + <SplitLS>0</SplitLS> + <SwStkChk>0</SwStkChk> + <NoWarn>0</NoWarn> + <VariousControls> + <MiscControls></MiscControls> + <Define></Define> + <Undefine></Undefine> + <IncludePath></IncludePath> + </VariousControls> + </Aads> + <LDads> + <umfTarg>1</umfTarg> + <Ropi>0</Ropi> + <Rwpi>0</Rwpi> + <noStLib>0</noStLib> + <RepFail>1</RepFail> + <useFile>0</useFile> + <TextAddressRange>0x00000000</TextAddressRange> + <DataAddressRange>0x00000000</DataAddressRange> + <ScatterFile></ScatterFile> + <IncludeLibs></IncludeLibs> + <IncludeLibsPath></IncludeLibsPath> + <Misc></Misc> + <LinkerInputFile></LinkerInputFile> + <DisabledWarnings></DisabledWarnings> + </LDads> + </TargetArmAds> + </TargetOption> + <Groups> + <Group> + <GroupName>Startup</GroupName> + <Files> + <File> + <FileName>startup_CMSDK_CM0plus.s</FileName> + <FileType>2</FileType> + <FilePath>..\..\..\..\software\cmsis\Device\ARM\CMSDK_CM0plus\Source\ARM\startup_CMSDK_CM0plus.s</FilePath> + </File> + </Files> + </Group> + <Group> + <GroupName>Application</GroupName> + <Files> + <File> + <FileName>bootloader.c</FileName> + <FileType>1</FileType> + <FilePath>..\..\..\..\software\common\bootloader\bootloader.c</FilePath> + </File> + </Files> + </Group> + <Group> + <GroupName>System</GroupName> + <Files> + <File> + <FileName>system_CMSDK_CM0plus.c</FileName> + <FileType>1</FileType> + <FilePath>..\..\..\..\software\cmsis\Device\ARM\CMSDK_CM0plus\Source\system_CMSDK_CM0plus.c</FilePath> + </File> + </Files> + </Group> + </Groups> + </Target> + </Targets> + +</Project> diff --git a/Cortex-M0/nanosoc/systems/mcu/testcodes/bootloader/makefile b/Cortex-M0/nanosoc/systems/mcu/testcodes/bootloader/makefile new file mode 100644 index 0000000..c62e321 --- /dev/null +++ b/Cortex-M0/nanosoc/systems/mcu/testcodes/bootloader/makefile @@ -0,0 +1,254 @@ +#//----------------------------------------------------------------------------- +#// customised Cortex-M0 'nanosoc' controller +#// A joint work commissioned on behalf of SoC Labs, under Arm Academic Access license. +#// +#// Contributors +#// +#// David Flynn (d.w.flynn@soton.ac.uk) +#// +#// Copyright � 2021-3, SoC Labs (www.soclabs.org) +#//----------------------------------------------------------------------------- + +#----------------------------------------------------------------------------- +# The confidential and proprietary information contained in this file may +# only be used by a person authorised under and to the extent permitted +# by a subsisting licensing agreement from Arm Limited or its affiliates. +# +# (C) COPYRIGHT 2010-2013 Arm Limited or its affiliates. +# ALL RIGHTS RESERVED +# +# This entire notice must be reproduced on all copies of this file +# and copies of this file may only be made by a person if such person is +# permitted to do so under the terms of a subsisting license agreement +# from Arm Limited or its affiliates. +# +# SVN Information +# +# Checked In : $Date: 2017-10-10 15:55:38 +0100 (Tue, 10 Oct 2017) $ +# +# Revision : $Revision: 371321 $ +# +# Release Information : Cortex-M System Design Kit-r1p1-00rel0 +#----------------------------------------------------------------------------- +# +# Cortex-M System Design Kit software compilation make file +# +#----------------------------------------------------------------------------- +# +# Configurations +# +# Choose the core instantiated, can be +# - CORTEX_M0 +# - CORTEX_M0PLUS +CPU_PRODUCT = CORTEX_M0 + +# Shared software directory +SOFTWARE_DIR = ../../../../software +CMSIS_DIR = $(SOFTWARE_DIR)/cmsis +CORE_DIR = $(CMSIS_DIR)/CMSIS/Include + +ifeq ($(CPU_PRODUCT),CORTEX_M0PLUS) + DEVICE_DIR = $(CMSIS_DIR)/Device/ARM/CMSDK_CM0plus +else + DEVICE_DIR = $(CMSIS_DIR)/Device/ARM/CMSDK_CM0 +endif + +# Program file +BOOTLOADER = bootloader + +# Endian Option +COMPILE_BIGEND = 0 + +# Configuration +ifeq ($(CPU_PRODUCT),CORTEX_M0PLUS) + USER_DEFINE = -DCORTEX_M0PLUS +else + USER_DEFINE = -DCORTEX_M0 +endif + +DEPS_LIST = makefile + +# Tool chain : ds5 / gcc / keil +TOOL_CHAIN = ds5 + +ifeq ($(TOOL_CHAIN),ds5) + ifeq ($(CPU_PRODUCT),CORTEX_M0PLUS) + CPU_TYPE = --cpu Cortex-M0plus + else + CPU_TYPE = --cpu Cortex-M0 + endif +endif + +ifeq ($(TOOL_CHAIN),gcc) + ifeq ($(CPU_PRODUCT),CORTEX_M0PLUS) + CPU_TYPE = -mcpu=cortex-m0plus + else + CPU_TYPE = -mcpu=cortex-m0 + endif +endif + + +# Startup code directory for DS-5 +ifeq ($(TOOL_CHAIN),ds5) + STARTUP_DIR = $(DEVICE_DIR)/Source/ARM +endif + +# Startup code directory for gcc +ifeq ($(TOOL_CHAIN),gcc) + STARTUP_DIR = $(DEVICE_DIR)/Source/GCC +endif + +ifeq ($(CPU_PRODUCT),CORTEX_M0PLUS) + STARTUP_FILE = startup_CMSDK_CM0plus + SYSTEM_FILE = system_CMSDK_CM0plus +else + STARTUP_FILE = startup_CMSDK_CM0 + SYSTEM_FILE = system_CMSDK_CM0 +endif + +# --------------------------------------------------------------------------------------- +# DS-5 options + +# MicroLIB option +COMPILE_MICROLIB = 0 + +# Small Multiply (Cortex-M0/M0+ has small multiplier option) +COMPILE_SMALLMUL = 0 + +ARM_CC_OPTIONS = -c -O3 -g -Otime -I $(DEVICE_DIR)/Include -I $(CORE_DIR) $(USER_DEFINE) +ARM_ASM_OPTIONS = -g +ARM_LINK_OPTIONS = "--keep=$(STARTUP_FILE).o(RESET)" "--first=$(STARTUP_FILE).o(RESET)" \ + --rw_base 0x30000000 --ro_base 0x10000000 --map + +ifeq ($(COMPILE_BIGEND),1) + # Big Endian + ARM_CC_OPTIONS += --bigend + ARM_ASM_OPTIONS += --bigend + ARM_LINK_OPTIONS += --be8 +endif + +ifeq ($(COMPILE_MICROLIB),1) + # MicroLIB + ARM_CC_OPTIONS += --library_type=microlib + ARM_ASM_OPTIONS += --library_type=microlib --pd "__MICROLIB SETA 1" + ARM_LINK_OPTIONS += --library_type=microlib +endif + +ifeq ($(COMPILE_SMALLMUL),1) + # In Cortex-M0, small multiply takes 32 cycles + ARM_CC_OPTIONS += --multiply_latency=32 +endif + +# --------------------------------------------------------------------------------------- +# gcc options + +GNG_CC = arm-none-eabi-gcc +GNU_OBJDUMP = arm-none-eabi-objdump +GNU_OBJCOPY = arm-none-eabi-objcopy + +LINKER_SCRIPT_PATH = $(SOFTWARE_DIR)/common/scripts +LINKER_SCRIPT = $(LINKER_SCRIPT_PATH)/cmsdk_bootloader.ld + +GNU_CC_FLAGS = -g -O3 -mthumb $(CPU_TYPE) + +ifeq ($(COMPILE_BIGEND),1) + # Big Endian + GNU_CC_FLAGS += -mbig-endian +endif +# --------------------------------------------------------------------------------------- +all: all_$(TOOL_CHAIN) + +# --------------------------------------------------------------------------------------- +# DS-5 +all_ds5 : $(BOOTLOADER).hex $(BOOTLOADER).lst + +$(BOOTLOADER).o : $(SOFTWARE_DIR)/common/bootloader/$(BOOTLOADER).c $(DEPS_LIST) + armcc $(ARM_CC_OPTIONS) $(CPU_TYPE) $< -o $@ + +$(SYSTEM_FILE).o : $(DEVICE_DIR)/Source/$(SYSTEM_FILE).c $(DEPS_LIST) + armcc $(ARM_CC_OPTIONS) $(CPU_TYPE) $< -o $@ + +$(STARTUP_FILE).o : $(STARTUP_DIR)/$(STARTUP_FILE).s $(DEPS_LIST) + armasm $(ARM_ASM_OPTIONS) $(CPU_TYPE) $< -o $@ + +$(BOOTLOADER).ELF : $(BOOTLOADER).o $(SYSTEM_FILE).o $(STARTUP_FILE).o $(DEPS_LIST) + armlink $(ARM_LINK_OPTIONS) $(BOOTLOADER).o $(SYSTEM_FILE).o $(STARTUP_FILE).o -o $@ + +$(BOOTLOADER).hex : $(BOOTLOADER).ELF $(DEPS_LIST) + fromelf --vhx --8x1 $< --output $@ + +$(BOOTLOADER).lst : $(BOOTLOADER).ELF $(DEPS_LIST) + fromelf -c -d -e -s $< --output $@ + +# --------------------------------------------------------------------------------------- +# gcc + +all_gcc: + $(GNG_CC) $(GNU_CC_FLAGS) $(STARTUP_DIR)/$(STARTUP_FILE).s \ + $(SOFTWARE_DIR)/common/bootloader/$(BOOTLOADER).c \ + $(DEVICE_DIR)/Source/$(SYSTEM_FILE).c \ + -I $(DEVICE_DIR)/Include -I $(CORE_DIR) \ + -L $(LINKER_SCRIPT_PATH) \ + -D__STACK_SIZE=0x200 \ + -D__HEAP_SIZE=0x1000 \ + $(USER_DEFINE) -T $(LINKER_SCRIPT) -o $(BOOTLOADER).o + # Generate disassembly code + $(GNU_OBJDUMP) -S $(BOOTLOADER).o > $(BOOTLOADER).lst + # Generate binary file + $(GNU_OBJCOPY) -S $(BOOTLOADER).o -O binary $(BOOTLOADER).bin + # Generate hex file + $(GNU_OBJCOPY) -S $(BOOTLOADER).o --adjust-vma -0x10000000 -O verilog $(BOOTLOADER).hex + +# Note: +# Objcopy use --adjust-vma so that the Verilog hex address start at address 0 instead of actual address 0x10000000 +# +# If the version of object copy you are using does not support verilog hex file output, +# you can generate the hex file from binary file using the following command +# od -v -A n -t x1 --width=1 $(TESTNAME).bin > $(TESTNAME).hex + + +# --------------------------------------------------------------------------------------- +# Keil MDK + +all_keil: + @echo "Please compile your project code and press ENTER when ready" + @read dummy + +# --------------------------------------------------------------------------------------- +# Binary + +all_bin: $(BOOTLOADER).bin + # Generate hex file from binary + od -v -A n -t x1 --width=1 $(BOOTLOADER).bin > $(BOOTLOADER).hex + +# --------------------------------------------------------------------------------------- +# Clean +clean : + @rm -rf *.o + @if [ -e $(BOOTLOADER).hex ] ; then \ + rm -rf $(BOOTLOADER).hex ; \ + fi + @if [ -e $(BOOTLOADER).lst ] ; then \ + rm -rf $(BOOTLOADER).lst ; \ + fi + @if [ -e $(BOOTLOADER).ELF ] ; then \ + rm -rf $(BOOTLOADER).ELF ; \ + fi + @if [ -e $(BOOTLOADER).bin ] ; then \ + rm -rf $(BOOTLOADER).bin ; \ + fi + @rm -rf *.crf + @rm -rf *.plg + @rm -rf *.tra + @rm -rf *.htm + @rm -rf *.map + @rm -rf *.dep + @rm -rf *.d + @rm -rf *.lnp + @rm -rf *.bak + @rm -rf *.lst + @rm -rf *.axf + @rm -rf *.sct + @rm -rf *.__i + @rm -rf *._ia + diff --git a/Cortex-M0/nanosoc/systems/mcu/testcodes/debug_tests/debug_tests_cm0.uvopt b/Cortex-M0/nanosoc/systems/mcu/testcodes/debug_tests/debug_tests_cm0.uvopt new file mode 100644 index 0000000..c834b4c --- /dev/null +++ b/Cortex-M0/nanosoc/systems/mcu/testcodes/debug_tests/debug_tests_cm0.uvopt @@ -0,0 +1,293 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no" ?> +<ProjectOpt xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="project_opt.xsd"> + + <SchemaVersion>1.0</SchemaVersion> + + <Header>### uVision Project, (C) Keil Software</Header> + + <Extensions> + <cExt>*.c</cExt> + <aExt>*.s*; *.src; *.a*</aExt> + <oExt>*.obj</oExt> + <lExt>*.lib</lExt> + <tExt>*.txt; *.h; *.inc</tExt> + <pExt>*.plm</pExt> + <CppX>*.cpp</CppX> + </Extensions> + + <DaveTm> + <dwLowDateTime>0</dwLowDateTime> + <dwHighDateTime>0</dwHighDateTime> + </DaveTm> + + <Target> + <TargetName>Debug</TargetName> + <ToolsetNumber>0x4</ToolsetNumber> + <ToolsetName>ARM-ADS</ToolsetName> + <TargetOption> + <CLKADS>50000000</CLKADS> + <OPTTT> + <gFlags>1</gFlags> + <BeepAtEnd>1</BeepAtEnd> + <RunSim>1</RunSim> + <RunTarget>0</RunTarget> + </OPTTT> + <OPTHX> + <HexSelection>1</HexSelection> + <FlashByte>65535</FlashByte> + <HexRangeLowAddress>0</HexRangeLowAddress> + <HexRangeHighAddress>0</HexRangeHighAddress> + <HexOffset>0</HexOffset> + </OPTHX> + <OPTLEX> + <PageWidth>79</PageWidth> + <PageLength>66</PageLength> + <TabStop>8</TabStop> + <ListingPath>.\</ListingPath> + </OPTLEX> + <ListingPage> + <CreateCListing>1</CreateCListing> + <CreateAListing>1</CreateAListing> + <CreateLListing>1</CreateLListing> + <CreateIListing>0</CreateIListing> + <AsmCond>1</AsmCond> + <AsmSymb>1</AsmSymb> + <AsmXref>0</AsmXref> + <CCond>1</CCond> + <CCode>0</CCode> + <CListInc>0</CListInc> + <CSymb>0</CSymb> + <LinkerCodeListing>0</LinkerCodeListing> + </ListingPage> + <OPTXL> + <LMap>1</LMap> + <LComments>1</LComments> + <LGenerateSymbols>1</LGenerateSymbols> + <LLibSym>1</LLibSym> + <LLines>1</LLines> + <LLocSym>1</LLocSym> + <LPubSym>1</LPubSym> + <LXref>0</LXref> + <LExpSel>0</LExpSel> + </OPTXL> + <OPTFL> + <tvExp>1</tvExp> + <tvExpOptDlg>0</tvExpOptDlg> + <IsCurrentTarget>1</IsCurrentTarget> + </OPTFL> + <CpuCode>255</CpuCode> + <DllOpt> + <SimDllName>SARMCM3.DLL</SimDllName> + <SimDllArguments></SimDllArguments> + <SimDlgDllName>DARMCM1.DLL</SimDlgDllName> + <SimDlgDllArguments></SimDlgDllArguments> + <TargetDllName>SARMCM3.DLL</TargetDllName> + <TargetDllArguments></TargetDllArguments> + <TargetDlgDllName>TARMCM1.DLL</TargetDlgDllName> + <TargetDlgDllArguments></TargetDlgDllArguments> + </DllOpt> + <DebugOpt> + <uSim>1</uSim> + <uTrg>0</uTrg> + <sLdApp>1</sLdApp> + <sGomain>1</sGomain> + <sRbreak>1</sRbreak> + <sRwatch>1</sRwatch> + <sRmem>1</sRmem> + <sRfunc>1</sRfunc> + <sRbox>1</sRbox> + <tLdApp>1</tLdApp> + <tGomain>0</tGomain> + <tRbreak>1</tRbreak> + <tRwatch>1</tRwatch> + <tRmem>1</tRmem> + <tRfunc>0</tRfunc> + <tRbox>1</tRbox> + <tRtrace>0</tRtrace> + <sRunDeb>0</sRunDeb> + <sLrtime>0</sLrtime> + <nTsel>-1</nTsel> + <sDll></sDll> + <sDllPa></sDllPa> + <sDlgDll></sDlgDll> + <sDlgPa></sDlgPa> + <sIfile></sIfile> + <tDll></tDll> + <tDllPa></tDllPa> + <tDlgDll></tDlgDll> + <tDlgPa></tDlgPa> + <tIfile></tIfile> + <pMon></pMon> + </DebugOpt> + <Breakpoint/> + <DebugFlag> + <trace>0</trace> + <periodic>1</periodic> + <aLwin>0</aLwin> + <aCover>0</aCover> + <aSer1>0</aSer1> + <aSer2>0</aSer2> + <aPa>0</aPa> + <viewmode>0</viewmode> + <vrSel>0</vrSel> + <aSym>0</aSym> + <aTbox>0</aTbox> + <AscS1>0</AscS1> + <AscS2>0</AscS2> + <AscS3>0</AscS3> + <aSer3>0</aSer3> + <eProf>0</eProf> + <aLa>0</aLa> + <aPa1>0</aPa1> + <AscS4>0</AscS4> + <aSer4>0</aSer4> + <StkLoc>0</StkLoc> + <TrcWin>0</TrcWin> + <newCpu>0</newCpu> + <uProt>0</uProt> + </DebugFlag> + <Tracepoint> + <THDelay>0</THDelay> + </Tracepoint> + <LintExecutable></LintExecutable> + <LintConfigFile></LintConfigFile> + </TargetOption> + </Target> + + <Group> + <GroupName>Startup</GroupName> + <tvExp>1</tvExp> + <tvExpOptDlg>0</tvExpOptDlg> + <cbSel>0</cbSel> + <RteFlg>0</RteFlg> + <File> + <GroupNumber>1</GroupNumber> + <FileNumber>1</FileNumber> + <FileType>2</FileType> + <tvExp>0</tvExp> + <Focus>0</Focus> + <ColumnNumber>0</ColumnNumber> + <tvExpOptDlg>0</tvExpOptDlg> + <TopLine>0</TopLine> + <CurrentLine>0</CurrentLine> + <bDave2>0</bDave2> + <PathWithFileName>..\..\..\..\software\cmsis\Device\ARM\CMSDK_CM0\Source\ARM\startup_CMSDK_CM0.s</PathWithFileName> + <FilenameWithoutPath>startup_CMSDK_CM0.s</FilenameWithoutPath> + <RteFlg>0</RteFlg> + <bShared>0</bShared> + </File> + </Group> + + <Group> + <GroupName>Application</GroupName> + <tvExp>1</tvExp> + <tvExpOptDlg>0</tvExpOptDlg> + <cbSel>0</cbSel> + <RteFlg>0</RteFlg> + <File> + <GroupNumber>2</GroupNumber> + <FileNumber>2</FileNumber> + <FileType>1</FileType> + <tvExp>0</tvExp> + <Focus>0</Focus> + <ColumnNumber>0</ColumnNumber> + <tvExpOptDlg>0</tvExpOptDlg> + <TopLine>0</TopLine> + <CurrentLine>0</CurrentLine> + <bDave2>0</bDave2> + <PathWithFileName>..\..\..\..\software\common\debug_tests\debug_tests.c</PathWithFileName> + <FilenameWithoutPath>debug_tests.c</FilenameWithoutPath> + <RteFlg>0</RteFlg> + <bShared>0</bShared> + </File> + <File> + <GroupNumber>2</GroupNumber> + <FileNumber>3</FileNumber> + <FileType>1</FileType> + <tvExp>0</tvExp> + <Focus>0</Focus> + <ColumnNumber>0</ColumnNumber> + <tvExpOptDlg>0</tvExpOptDlg> + <TopLine>0</TopLine> + <CurrentLine>0</CurrentLine> + <bDave2>0</bDave2> + <PathWithFileName>..\..\..\..\software\common\retarget\uart_stdout.c</PathWithFileName> + <FilenameWithoutPath>uart_stdout.c</FilenameWithoutPath> + <RteFlg>0</RteFlg> + <bShared>0</bShared> + </File> + <File> + <GroupNumber>2</GroupNumber> + <FileNumber>4</FileNumber> + <FileType>1</FileType> + <tvExp>0</tvExp> + <Focus>0</Focus> + <ColumnNumber>0</ColumnNumber> + <tvExpOptDlg>0</tvExpOptDlg> + <TopLine>0</TopLine> + <CurrentLine>0</CurrentLine> + <bDave2>0</bDave2> + <PathWithFileName>..\..\..\..\software\common\retarget\retarget.c</PathWithFileName> + <FilenameWithoutPath>retarget.c</FilenameWithoutPath> + <RteFlg>0</RteFlg> + <bShared>0</bShared> + </File> + <File> + <GroupNumber>2</GroupNumber> + <FileNumber>5</FileNumber> + <FileType>1</FileType> + <tvExp>0</tvExp> + <Focus>0</Focus> + <ColumnNumber>0</ColumnNumber> + <tvExpOptDlg>0</tvExpOptDlg> + <TopLine>0</TopLine> + <CurrentLine>0</CurrentLine> + <bDave2>0</bDave2> + <PathWithFileName>..\generic\mcu_debugtester_interface.c</PathWithFileName> + <FilenameWithoutPath>mcu_debugtester_interface.c</FilenameWithoutPath> + <RteFlg>0</RteFlg> + <bShared>0</bShared> + </File> + </Group> + + <Group> + <GroupName>System</GroupName> + <tvExp>1</tvExp> + <tvExpOptDlg>0</tvExpOptDlg> + <cbSel>0</cbSel> + <RteFlg>0</RteFlg> + <File> + <GroupNumber>3</GroupNumber> + <FileNumber>6</FileNumber> + <FileType>1</FileType> + <tvExp>0</tvExp> + <Focus>0</Focus> + <ColumnNumber>0</ColumnNumber> + <tvExpOptDlg>0</tvExpOptDlg> + <TopLine>0</TopLine> + <CurrentLine>0</CurrentLine> + <bDave2>0</bDave2> + <PathWithFileName>..\..\..\..\software\cmsis\Device\ARM\CMSDK_CM0\Source\system_CMSDK_CM0.c</PathWithFileName> + <FilenameWithoutPath>system_CMSDK_CM0.c</FilenameWithoutPath> + <RteFlg>0</RteFlg> + <bShared>0</bShared> + </File> + <File> + <GroupNumber>3</GroupNumber> + <FileNumber>7</FileNumber> + <FileType>1</FileType> + <tvExp>0</tvExp> + <Focus>0</Focus> + <ColumnNumber>0</ColumnNumber> + <tvExpOptDlg>0</tvExpOptDlg> + <TopLine>0</TopLine> + <CurrentLine>0</CurrentLine> + <bDave2>0</bDave2> + <PathWithFileName>..\..\..\..\software\cmsis\Device\ARM\CMSDK_CM0\Source\CMSDK_driver.c</PathWithFileName> + <FilenameWithoutPath>CMSDK_driver.c</FilenameWithoutPath> + <RteFlg>0</RteFlg> + <bShared>0</bShared> + </File> + </Group> + +</ProjectOpt> diff --git a/Cortex-M0/nanosoc/systems/mcu/testcodes/debug_tests/debug_tests_cm0.uvproj b/Cortex-M0/nanosoc/systems/mcu/testcodes/debug_tests/debug_tests_cm0.uvproj new file mode 100644 index 0000000..4571bb5 --- /dev/null +++ b/Cortex-M0/nanosoc/systems/mcu/testcodes/debug_tests/debug_tests_cm0.uvproj @@ -0,0 +1,445 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no" ?> +<Project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="project_proj.xsd"> + + <SchemaVersion>1.1</SchemaVersion> + + <Header>### uVision Project, (C) Keil Software</Header> + + <Targets> + <Target> + <TargetName>Debug</TargetName> + <ToolsetNumber>0x4</ToolsetNumber> + <ToolsetName>ARM-ADS</ToolsetName> + <TargetOption> + <TargetCommonOption> + <Device>Cortex-M0</Device> + <Vendor>ARM</Vendor> + <Cpu>CLOCK(12000000) CPUTYPE("Cortex-M0") ESEL ELITTLE</Cpu> + <FlashUtilSpec></FlashUtilSpec> + <StartupFile></StartupFile> + <FlashDriverDll></FlashDriverDll> + <DeviceId>4803</DeviceId> + <RegisterFile></RegisterFile> + <MemoryEnv></MemoryEnv> + <Cmp></Cmp> + <Asm></Asm> + <Linker></Linker> + <OHString></OHString> + <InfinionOptionDll></InfinionOptionDll> + <SLE66CMisc></SLE66CMisc> + <SLE66AMisc></SLE66AMisc> + <SLE66LinkerMisc></SLE66LinkerMisc> + <SFDFile></SFDFile> + <UseEnv>0</UseEnv> + <BinPath></BinPath> + <IncludePath></IncludePath> + <LibPath></LibPath> + <RegisterFilePath></RegisterFilePath> + <DBRegisterFilePath></DBRegisterFilePath> + <TargetStatus> + <Error>0</Error> + <ExitCodeStop>0</ExitCodeStop> + <ButtonStop>0</ButtonStop> + <NotGenerated>0</NotGenerated> + <InvalidFlash>1</InvalidFlash> + </TargetStatus> + <OutputDirectory>.\</OutputDirectory> + <OutputName>debug_tests</OutputName> + <CreateExecutable>1</CreateExecutable> + <CreateLib>0</CreateLib> + <CreateHexFile>0</CreateHexFile> + <DebugInformation>1</DebugInformation> + <BrowseInformation>1</BrowseInformation> + <ListingPath>.\</ListingPath> + <HexFormatSelection>1</HexFormatSelection> + <Merge32K>0</Merge32K> + <CreateBatchFile>0</CreateBatchFile> + <BeforeCompile> + <RunUserProg1>0</RunUserProg1> + <RunUserProg2>0</RunUserProg2> + <UserProg1Name></UserProg1Name> + <UserProg2Name></UserProg2Name> + <UserProg1Dos16Mode>0</UserProg1Dos16Mode> + <UserProg2Dos16Mode>0</UserProg2Dos16Mode> + <nStopU1X>0</nStopU1X> + <nStopU2X>0</nStopU2X> + </BeforeCompile> + <BeforeMake> + <RunUserProg1>0</RunUserProg1> + <RunUserProg2>0</RunUserProg2> + <UserProg1Name></UserProg1Name> + <UserProg2Name></UserProg2Name> + <UserProg1Dos16Mode>0</UserProg1Dos16Mode> + <UserProg2Dos16Mode>0</UserProg2Dos16Mode> + </BeforeMake> + <AfterMake> + <RunUserProg1>1</RunUserProg1> + <RunUserProg2>0</RunUserProg2> + <UserProg1Name>$K\ARM\ARMCC\BIN\fromelf.exe #L --vhx --8x1 --output debug_tests.hex</UserProg1Name> + <UserProg2Name></UserProg2Name> + <UserProg1Dos16Mode>0</UserProg1Dos16Mode> + <UserProg2Dos16Mode>0</UserProg2Dos16Mode> + </AfterMake> + <SelectedForBatchBuild>0</SelectedForBatchBuild> + <SVCSIdString></SVCSIdString> + </TargetCommonOption> + <CommonProperty> + <UseCPPCompiler>0</UseCPPCompiler> + <RVCTCodeConst>0</RVCTCodeConst> + <RVCTZI>0</RVCTZI> + <RVCTOtherData>0</RVCTOtherData> + <ModuleSelection>0</ModuleSelection> + <IncludeInBuild>1</IncludeInBuild> + <AlwaysBuild>0</AlwaysBuild> + <GenerateAssemblyFile>0</GenerateAssemblyFile> + <AssembleAssemblyFile>0</AssembleAssemblyFile> + <PublicsOnly>0</PublicsOnly> + <StopOnExitCode>3</StopOnExitCode> + <CustomArgument></CustomArgument> + <IncludeLibraryModules></IncludeLibraryModules> + </CommonProperty> + <DllOption> + <SimDllName>SARMCM3.DLL</SimDllName> + <SimDllArguments></SimDllArguments> + <SimDlgDll>DARMCM1.DLL</SimDlgDll> + <SimDlgDllArguments></SimDlgDllArguments> + <TargetDllName>SARMCM3.DLL</TargetDllName> + <TargetDllArguments></TargetDllArguments> + <TargetDlgDll>TARMCM1.DLL</TargetDlgDll> + <TargetDlgDllArguments></TargetDlgDllArguments> + </DllOption> + <DebugOption> + <OPTHX> + <HexSelection>1</HexSelection> + <HexRangeLowAddress>0</HexRangeLowAddress> + <HexRangeHighAddress>0</HexRangeHighAddress> + <HexOffset>0</HexOffset> + <Oh166RecLen>16</Oh166RecLen> + </OPTHX> + <Simulator> + <UseSimulator>1</UseSimulator> + <LoadApplicationAtStartup>1</LoadApplicationAtStartup> + <RunToMain>1</RunToMain> + <RestoreBreakpoints>1</RestoreBreakpoints> + <RestoreWatchpoints>1</RestoreWatchpoints> + <RestoreMemoryDisplay>1</RestoreMemoryDisplay> + <RestoreFunctions>1</RestoreFunctions> + <RestoreToolbox>1</RestoreToolbox> + <LimitSpeedToRealTime>0</LimitSpeedToRealTime> + </Simulator> + <Target> + <UseTarget>0</UseTarget> + <LoadApplicationAtStartup>1</LoadApplicationAtStartup> + <RunToMain>0</RunToMain> + <RestoreBreakpoints>1</RestoreBreakpoints> + <RestoreWatchpoints>1</RestoreWatchpoints> + <RestoreMemoryDisplay>1</RestoreMemoryDisplay> + <RestoreFunctions>0</RestoreFunctions> + <RestoreToolbox>1</RestoreToolbox> + <RestoreTracepoints>0</RestoreTracepoints> + </Target> + <RunDebugAfterBuild>0</RunDebugAfterBuild> + <TargetSelection>-1</TargetSelection> + <SimDlls> + <CpuDll></CpuDll> + <CpuDllArguments></CpuDllArguments> + <PeripheralDll></PeripheralDll> + <PeripheralDllArguments></PeripheralDllArguments> + <InitializationFile></InitializationFile> + </SimDlls> + <TargetDlls> + <CpuDll></CpuDll> + <CpuDllArguments></CpuDllArguments> + <PeripheralDll></PeripheralDll> + <PeripheralDllArguments></PeripheralDllArguments> + <InitializationFile></InitializationFile> + <Driver></Driver> + </TargetDlls> + </DebugOption> + <Utilities> + <Flash1> + <UseTargetDll>0</UseTargetDll> + <UseExternalTool>0</UseExternalTool> + <RunIndependent>0</RunIndependent> + <UpdateFlashBeforeDebugging>0</UpdateFlashBeforeDebugging> + <Capability>0</Capability> + <DriverSelection>-1</DriverSelection> + </Flash1> + <Flash2></Flash2> + <Flash3></Flash3> + <Flash4></Flash4> + </Utilities> + <TargetArmAds> + <ArmAdsMisc> + <GenerateListings>0</GenerateListings> + <asHll>1</asHll> + <asAsm>1</asAsm> + <asMacX>1</asMacX> + <asSyms>1</asSyms> + <asFals>1</asFals> + <asDbgD>1</asDbgD> + <asForm>1</asForm> + <ldLst>0</ldLst> + <ldmm>1</ldmm> + <ldXref>1</ldXref> + <BigEnd>0</BigEnd> + <AdsALst>1</AdsALst> + <AdsACrf>1</AdsACrf> + <AdsANop>0</AdsANop> + <AdsANot>0</AdsANot> + <AdsLLst>1</AdsLLst> + <AdsLmap>1</AdsLmap> + <AdsLcgr>1</AdsLcgr> + <AdsLsym>1</AdsLsym> + <AdsLszi>1</AdsLszi> + <AdsLtoi>1</AdsLtoi> + <AdsLsun>1</AdsLsun> + <AdsLven>1</AdsLven> + <AdsLsxf>1</AdsLsxf> + <RvctClst>0</RvctClst> + <GenPPlst>0</GenPPlst> + <AdsCpuType>"Cortex-M0"</AdsCpuType> + <RvctDeviceName></RvctDeviceName> + <mOS>0</mOS> + <uocRom>0</uocRom> + <uocRam>0</uocRam> + <hadIROM>0</hadIROM> + <hadIRAM>0</hadIRAM> + <hadXRAM>0</hadXRAM> + <uocXRam>0</uocXRam> + <RvdsVP>0</RvdsVP> + <hadIRAM2>0</hadIRAM2> + <hadIROM2>0</hadIROM2> + <StupSel>1</StupSel> + <useUlib>0</useUlib> + <EndSel>1</EndSel> + <uLtcg>0</uLtcg> + <RoSelD>0</RoSelD> + <RwSelD>5</RwSelD> + <CodeSel>0</CodeSel> + <OptFeed>0</OptFeed> + <NoZi1>0</NoZi1> + <NoZi2>0</NoZi2> + <NoZi3>0</NoZi3> + <NoZi4>0</NoZi4> + <NoZi5>0</NoZi5> + <Ro1Chk>1</Ro1Chk> + <Ro2Chk>0</Ro2Chk> + <Ro3Chk>0</Ro3Chk> + <Ir1Chk>0</Ir1Chk> + <Ir2Chk>0</Ir2Chk> + <Ra1Chk>1</Ra1Chk> + <Ra2Chk>0</Ra2Chk> + <Ra3Chk>0</Ra3Chk> + <Im1Chk>0</Im1Chk> + <Im2Chk>0</Im2Chk> + <OnChipMemories> + <Ocm1> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </Ocm1> + <Ocm2> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </Ocm2> + <Ocm3> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </Ocm3> + <Ocm4> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </Ocm4> + <Ocm5> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </Ocm5> + <Ocm6> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </Ocm6> + <IRAM> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </IRAM> + <IROM> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </IROM> + <XRAM> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </XRAM> + <OCR_RVCT1> + <Type>1</Type> + <StartAddress>0x0</StartAddress> + <Size>0x10000</Size> + </OCR_RVCT1> + <OCR_RVCT2> + <Type>1</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </OCR_RVCT2> + <OCR_RVCT3> + <Type>1</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </OCR_RVCT3> + <OCR_RVCT4> + <Type>1</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </OCR_RVCT4> + <OCR_RVCT5> + <Type>1</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </OCR_RVCT5> + <OCR_RVCT6> + <Type>0</Type> + <StartAddress>0x20000000</StartAddress> + <Size>0x10000</Size> + </OCR_RVCT6> + <OCR_RVCT7> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </OCR_RVCT7> + <OCR_RVCT8> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </OCR_RVCT8> + <OCR_RVCT9> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </OCR_RVCT9> + <OCR_RVCT10> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </OCR_RVCT10> + </OnChipMemories> + <RvctStartVector></RvctStartVector> + </ArmAdsMisc> + <Cads> + <interw>1</interw> + <Optim>3</Optim> + <oTime>0</oTime> + <SplitLS>0</SplitLS> + <OneElfS>0</OneElfS> + <Strict>0</Strict> + <EnumInt>0</EnumInt> + <PlainCh>0</PlainCh> + <Ropi>0</Ropi> + <Rwpi>0</Rwpi> + <wLevel>0</wLevel> + <uThumb>0</uThumb> + <uSurpInc>0</uSurpInc> + <VariousControls> + <MiscControls></MiscControls> + <Define>CORTEX_M0</Define> + <Undefine></Undefine> + <IncludePath>..\..\..\..\software\cmsis\CMSIS\Include; ..\..\..\..\software\cmsis\Device\ARM\CMSDK_CM0\Include; ..\..\..\..\software\common\retarget; ..\..\..\..\software\debug_tester; ..\..\..\..\software\common\debug_tests; ..\generic</IncludePath> + </VariousControls> + </Cads> + <Aads> + <interw>1</interw> + <Ropi>0</Ropi> + <Rwpi>0</Rwpi> + <thumb>0</thumb> + <SplitLS>0</SplitLS> + <SwStkChk>0</SwStkChk> + <NoWarn>0</NoWarn> + <uSurpInc>0</uSurpInc> + <VariousControls> + <MiscControls></MiscControls> + <Define></Define> + <Undefine></Undefine> + <IncludePath></IncludePath> + </VariousControls> + </Aads> + <LDads> + <umfTarg>1</umfTarg> + <Ropi>0</Ropi> + <Rwpi>0</Rwpi> + <noStLib>0</noStLib> + <RepFail>1</RepFail> + <useFile>0</useFile> + <TextAddressRange>0x00000000</TextAddressRange> + <DataAddressRange>0x00000000</DataAddressRange> + <ScatterFile></ScatterFile> + <IncludeLibs></IncludeLibs> + <IncludeLibsPath></IncludeLibsPath> + <Misc></Misc> + <LinkerInputFile></LinkerInputFile> + <DisabledWarnings></DisabledWarnings> + </LDads> + </TargetArmAds> + </TargetOption> + <Groups> + <Group> + <GroupName>Startup</GroupName> + <Files> + <File> + <FileName>startup_CMSDK_CM0.s</FileName> + <FileType>2</FileType> + <FilePath>..\..\..\..\software\cmsis\Device\ARM\CMSDK_CM0\Source\ARM\startup_CMSDK_CM0.s</FilePath> + </File> + </Files> + </Group> + <Group> + <GroupName>Application</GroupName> + <Files> + <File> + <FileName>debug_tests.c</FileName> + <FileType>1</FileType> + <FilePath>..\..\..\..\software\common\debug_tests\debug_tests.c</FilePath> + </File> + <File> + <FileName>uart_stdout.c</FileName> + <FileType>1</FileType> + <FilePath>..\..\..\..\software\common\retarget\uart_stdout.c</FilePath> + </File> + <File> + <FileName>retarget.c</FileName> + <FileType>1</FileType> + <FilePath>..\..\..\..\software\common\retarget\retarget.c</FilePath> + </File> + <File> + <FileName>mcu_debugtester_interface.c</FileName> + <FileType>1</FileType> + <FilePath>..\generic\mcu_debugtester_interface.c</FilePath> + </File> + </Files> + </Group> + <Group> + <GroupName>System</GroupName> + <Files> + <File> + <FileName>system_CMSDK_CM0.c</FileName> + <FileType>1</FileType> + <FilePath>..\..\..\..\software\cmsis\Device\ARM\CMSDK_CM0\Source\system_CMSDK_CM0.c</FilePath> + </File> + <File> + <FileName>CMSDK_driver.c</FileName> + <FileType>1</FileType> + <FilePath>..\..\..\..\software\cmsis\Device\ARM\CMSDK_CM0\Source\CMSDK_driver.c</FilePath> + </File> + </Files> + </Group> + </Groups> + </Target> + </Targets> + +</Project> diff --git a/Cortex-M0/nanosoc/systems/mcu/testcodes/debug_tests/debug_tests_cm0p.uvopt b/Cortex-M0/nanosoc/systems/mcu/testcodes/debug_tests/debug_tests_cm0p.uvopt new file mode 100644 index 0000000..80d160b --- /dev/null +++ b/Cortex-M0/nanosoc/systems/mcu/testcodes/debug_tests/debug_tests_cm0p.uvopt @@ -0,0 +1,272 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no" ?> +<ProjectOpt xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="project_opt.xsd"> + + <SchemaVersion>1.0</SchemaVersion> + + <Header>### uVision Project, (C) Keil Software</Header> + + <Extensions> + <cExt>*.c</cExt> + <aExt>*.s*; *.src; *.a*</aExt> + <oExt>*.obj</oExt> + <lExt>*.lib</lExt> + <tExt>*.txt; *.h; *.inc</tExt> + <pExt>*.plm</pExt> + <CppX>*.cpp</CppX> + </Extensions> + + <DaveTm> + <dwLowDateTime>0</dwLowDateTime> + <dwHighDateTime>0</dwHighDateTime> + </DaveTm> + + <Target> + <TargetName>Debug</TargetName> + <ToolsetNumber>0x4</ToolsetNumber> + <ToolsetName>ARM-ADS</ToolsetName> + <TargetOption> + <CLKADS>50000000</CLKADS> + <OPTTT> + <gFlags>1</gFlags> + <BeepAtEnd>1</BeepAtEnd> + <RunSim>1</RunSim> + <RunTarget>0</RunTarget> + </OPTTT> + <OPTHX> + <HexSelection>1</HexSelection> + <FlashByte>65535</FlashByte> + <HexRangeLowAddress>0</HexRangeLowAddress> + <HexRangeHighAddress>0</HexRangeHighAddress> + <HexOffset>0</HexOffset> + </OPTHX> + <OPTLEX> + <PageWidth>79</PageWidth> + <PageLength>66</PageLength> + <TabStop>8</TabStop> + <ListingPath>.\</ListingPath> + </OPTLEX> + <ListingPage> + <CreateCListing>1</CreateCListing> + <CreateAListing>1</CreateAListing> + <CreateLListing>1</CreateLListing> + <CreateIListing>0</CreateIListing> + <AsmCond>1</AsmCond> + <AsmSymb>1</AsmSymb> + <AsmXref>0</AsmXref> + <CCond>1</CCond> + <CCode>0</CCode> + <CListInc>0</CListInc> + <CSymb>0</CSymb> + <LinkerCodeListing>0</LinkerCodeListing> + </ListingPage> + <OPTXL> + <LMap>1</LMap> + <LComments>1</LComments> + <LGenerateSymbols>1</LGenerateSymbols> + <LLibSym>1</LLibSym> + <LLines>1</LLines> + <LLocSym>1</LLocSym> + <LPubSym>1</LPubSym> + <LXref>0</LXref> + <LExpSel>0</LExpSel> + </OPTXL> + <OPTFL> + <tvExp>1</tvExp> + <tvExpOptDlg>0</tvExpOptDlg> + <IsCurrentTarget>1</IsCurrentTarget> + </OPTFL> + <CpuCode>255</CpuCode> + <DllOpt> + <SimDllName>SARMCM3.DLL</SimDllName> + <SimDllArguments></SimDllArguments> + <SimDlgDllName>DARMCM1.DLL</SimDlgDllName> + <SimDlgDllArguments></SimDlgDllArguments> + <TargetDllName>SARMCM3.DLL</TargetDllName> + <TargetDllArguments></TargetDllArguments> + <TargetDlgDllName>TARMCM1.DLL</TargetDlgDllName> + <TargetDlgDllArguments></TargetDlgDllArguments> + </DllOpt> + <DebugOpt> + <uSim>1</uSim> + <uTrg>0</uTrg> + <sLdApp>1</sLdApp> + <sGomain>1</sGomain> + <sRbreak>1</sRbreak> + <sRwatch>1</sRwatch> + <sRmem>1</sRmem> + <sRfunc>1</sRfunc> + <sRbox>1</sRbox> + <tLdApp>1</tLdApp> + <tGomain>0</tGomain> + <tRbreak>1</tRbreak> + <tRwatch>1</tRwatch> + <tRmem>1</tRmem> + <tRfunc>0</tRfunc> + <tRbox>1</tRbox> + <sRunDeb>0</sRunDeb> + <sLrtime>0</sLrtime> + <nTsel>-1</nTsel> + <sDll></sDll> + <sDllPa></sDllPa> + <sDlgDll></sDlgDll> + <sDlgPa></sDlgPa> + <sIfile></sIfile> + <tDll></tDll> + <tDllPa></tDllPa> + <tDlgDll></tDlgDll> + <tDlgPa></tDlgPa> + <tIfile></tIfile> + <pMon></pMon> + </DebugOpt> + <Breakpoint/> + <DebugFlag> + <trace>0</trace> + <periodic>1</periodic> + <aLwin>0</aLwin> + <aCover>0</aCover> + <aSer1>0</aSer1> + <aSer2>0</aSer2> + <aPa>0</aPa> + <viewmode>0</viewmode> + <vrSel>0</vrSel> + <aSym>0</aSym> + <aTbox>0</aTbox> + <AscS1>0</AscS1> + <AscS2>0</AscS2> + <AscS3>0</AscS3> + <aSer3>0</aSer3> + <eProf>0</eProf> + <aLa>0</aLa> + <aPa1>0</aPa1> + <AscS4>0</AscS4> + <aSer4>0</aSer4> + <StkLoc>0</StkLoc> + <TrcWin>0</TrcWin> + <newCpu>0</newCpu> + <uProt>0</uProt> + </DebugFlag> + <LintExecutable></LintExecutable> + <LintConfigFile></LintConfigFile> + </TargetOption> + </Target> + + <Group> + <GroupName>Startup</GroupName> + <tvExp>1</tvExp> + <tvExpOptDlg>0</tvExpOptDlg> + <cbSel>0</cbSel> + <File> + <GroupNumber>1</GroupNumber> + <FileNumber>1</FileNumber> + <FileType>2</FileType> + <tvExp>0</tvExp> + <Focus>0</Focus> + <ColumnNumber>0</ColumnNumber> + <tvExpOptDlg>0</tvExpOptDlg> + <TopLine>0</TopLine> + <CurrentLine>0</CurrentLine> + <bDave2>0</bDave2> + <PathWithFileName>..\..\..\..\software\cmsis\Device\ARM\CMSDK_CM0plus\Source\ARM\startup_CMSDK_CM0plus.s</PathWithFileName> + <FilenameWithoutPath>startup_CMSDK_CM0plus.s</FilenameWithoutPath> + </File> + </Group> + + <Group> + <GroupName>Application</GroupName> + <tvExp>1</tvExp> + <tvExpOptDlg>0</tvExpOptDlg> + <cbSel>0</cbSel> + <File> + <GroupNumber>2</GroupNumber> + <FileNumber>2</FileNumber> + <FileType>1</FileType> + <tvExp>0</tvExp> + <Focus>0</Focus> + <ColumnNumber>0</ColumnNumber> + <tvExpOptDlg>0</tvExpOptDlg> + <TopLine>0</TopLine> + <CurrentLine>0</CurrentLine> + <bDave2>0</bDave2> + <PathWithFileName>..\..\..\..\software\common\debug_tests\debug_tests.c</PathWithFileName> + <FilenameWithoutPath>debug_tests.c</FilenameWithoutPath> + </File> + <File> + <GroupNumber>2</GroupNumber> + <FileNumber>3</FileNumber> + <FileType>1</FileType> + <tvExp>0</tvExp> + <Focus>0</Focus> + <ColumnNumber>0</ColumnNumber> + <tvExpOptDlg>0</tvExpOptDlg> + <TopLine>0</TopLine> + <CurrentLine>0</CurrentLine> + <bDave2>0</bDave2> + <PathWithFileName>..\..\..\..\software\common\retarget\uart_stdout.c</PathWithFileName> + <FilenameWithoutPath>uart_stdout.c</FilenameWithoutPath> + </File> + <File> + <GroupNumber>2</GroupNumber> + <FileNumber>4</FileNumber> + <FileType>1</FileType> + <tvExp>0</tvExp> + <Focus>0</Focus> + <ColumnNumber>0</ColumnNumber> + <tvExpOptDlg>0</tvExpOptDlg> + <TopLine>0</TopLine> + <CurrentLine>0</CurrentLine> + <bDave2>0</bDave2> + <PathWithFileName>..\..\..\..\software\common\retarget\retarget.c</PathWithFileName> + <FilenameWithoutPath>retarget.c</FilenameWithoutPath> + </File> + <File> + <GroupNumber>2</GroupNumber> + <FileNumber>5</FileNumber> + <FileType>1</FileType> + <tvExp>0</tvExp> + <Focus>0</Focus> + <ColumnNumber>0</ColumnNumber> + <tvExpOptDlg>0</tvExpOptDlg> + <TopLine>0</TopLine> + <CurrentLine>0</CurrentLine> + <bDave2>0</bDave2> + <PathWithFileName>..\generic\mcu_debugtester_interface.c</PathWithFileName> + <FilenameWithoutPath>mcu_debugtester_interface.c</FilenameWithoutPath> + </File> + </Group> + + <Group> + <GroupName>System</GroupName> + <tvExp>1</tvExp> + <tvExpOptDlg>0</tvExpOptDlg> + <cbSel>0</cbSel> + <File> + <GroupNumber>3</GroupNumber> + <FileNumber>6</FileNumber> + <FileType>1</FileType> + <tvExp>0</tvExp> + <Focus>0</Focus> + <ColumnNumber>0</ColumnNumber> + <tvExpOptDlg>0</tvExpOptDlg> + <TopLine>0</TopLine> + <CurrentLine>0</CurrentLine> + <bDave2>0</bDave2> + <PathWithFileName>..\..\..\..\software\cmsis\Device\ARM\CMSDK_CM0plus\Source\system_CMSDK_CM0plus.c</PathWithFileName> + <FilenameWithoutPath>system_CMSDK_CM0plus.c</FilenameWithoutPath> + </File> + <File> + <GroupNumber>3</GroupNumber> + <FileNumber>7</FileNumber> + <FileType>1</FileType> + <tvExp>0</tvExp> + <Focus>0</Focus> + <ColumnNumber>0</ColumnNumber> + <tvExpOptDlg>0</tvExpOptDlg> + <TopLine>0</TopLine> + <CurrentLine>0</CurrentLine> + <bDave2>0</bDave2> + <PathWithFileName>..\..\..\..\software\cmsis\Device\ARM\CMSDK_CM0plus\Source\CMSDK_driver.c</PathWithFileName> + <FilenameWithoutPath>CMSDK_driver.c</FilenameWithoutPath> + </File> + </Group> + +</ProjectOpt> diff --git a/Cortex-M0/nanosoc/systems/mcu/testcodes/debug_tests/debug_tests_cm0p.uvproj b/Cortex-M0/nanosoc/systems/mcu/testcodes/debug_tests/debug_tests_cm0p.uvproj new file mode 100644 index 0000000..ab2bfbb --- /dev/null +++ b/Cortex-M0/nanosoc/systems/mcu/testcodes/debug_tests/debug_tests_cm0p.uvproj @@ -0,0 +1,442 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no" ?> +<Project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="project_proj.xsd"> + + <SchemaVersion>1.1</SchemaVersion> + + <Header>### uVision Project, (C) Keil Software</Header> + + <Targets> + <Target> + <TargetName>Debug</TargetName> + <ToolsetNumber>0x4</ToolsetNumber> + <ToolsetName>ARM-ADS</ToolsetName> + <TargetOption> + <TargetCommonOption> + <Device>Cortex-M0+</Device> + <Vendor>ARM</Vendor> + <Cpu>CLOCK(12000000) CPUTYPE("Cortex-M0+") ESEL ELITTLE</Cpu> + <FlashUtilSpec></FlashUtilSpec> + <StartupFile></StartupFile> + <FlashDriverDll></FlashDriverDll> + <DeviceId>6268</DeviceId> + <RegisterFile></RegisterFile> + <MemoryEnv></MemoryEnv> + <Cmp></Cmp> + <Asm></Asm> + <Linker></Linker> + <OHString></OHString> + <InfinionOptionDll></InfinionOptionDll> + <SLE66CMisc></SLE66CMisc> + <SLE66AMisc></SLE66AMisc> + <SLE66LinkerMisc></SLE66LinkerMisc> + <SFDFile></SFDFile> + <UseEnv>0</UseEnv> + <BinPath></BinPath> + <IncludePath></IncludePath> + <LibPath></LibPath> + <RegisterFilePath></RegisterFilePath> + <DBRegisterFilePath></DBRegisterFilePath> + <TargetStatus> + <Error>0</Error> + <ExitCodeStop>0</ExitCodeStop> + <ButtonStop>0</ButtonStop> + <NotGenerated>0</NotGenerated> + <InvalidFlash>1</InvalidFlash> + </TargetStatus> + <OutputDirectory>.\</OutputDirectory> + <OutputName>debug_tests</OutputName> + <CreateExecutable>1</CreateExecutable> + <CreateLib>0</CreateLib> + <CreateHexFile>0</CreateHexFile> + <DebugInformation>1</DebugInformation> + <BrowseInformation>1</BrowseInformation> + <ListingPath>.\</ListingPath> + <HexFormatSelection>1</HexFormatSelection> + <Merge32K>0</Merge32K> + <CreateBatchFile>0</CreateBatchFile> + <BeforeCompile> + <RunUserProg1>0</RunUserProg1> + <RunUserProg2>0</RunUserProg2> + <UserProg1Name></UserProg1Name> + <UserProg2Name></UserProg2Name> + <UserProg1Dos16Mode>0</UserProg1Dos16Mode> + <UserProg2Dos16Mode>0</UserProg2Dos16Mode> + <nStopU1X>0</nStopU1X> + <nStopU2X>0</nStopU2X> + </BeforeCompile> + <BeforeMake> + <RunUserProg1>0</RunUserProg1> + <RunUserProg2>0</RunUserProg2> + <UserProg1Name></UserProg1Name> + <UserProg2Name></UserProg2Name> + <UserProg1Dos16Mode>0</UserProg1Dos16Mode> + <UserProg2Dos16Mode>0</UserProg2Dos16Mode> + </BeforeMake> + <AfterMake> + <RunUserProg1>1</RunUserProg1> + <RunUserProg2>0</RunUserProg2> + <UserProg1Name>$K\ARM\ARMCC\BIN\fromelf.exe #L --vhx --8x1 --output debug_tests.hex</UserProg1Name> + <UserProg2Name></UserProg2Name> + <UserProg1Dos16Mode>0</UserProg1Dos16Mode> + <UserProg2Dos16Mode>0</UserProg2Dos16Mode> + </AfterMake> + <SelectedForBatchBuild>0</SelectedForBatchBuild> + <SVCSIdString></SVCSIdString> + </TargetCommonOption> + <CommonProperty> + <UseCPPCompiler>0</UseCPPCompiler> + <RVCTCodeConst>0</RVCTCodeConst> + <RVCTZI>0</RVCTZI> + <RVCTOtherData>0</RVCTOtherData> + <ModuleSelection>0</ModuleSelection> + <IncludeInBuild>1</IncludeInBuild> + <AlwaysBuild>0</AlwaysBuild> + <GenerateAssemblyFile>0</GenerateAssemblyFile> + <AssembleAssemblyFile>0</AssembleAssemblyFile> + <PublicsOnly>0</PublicsOnly> + <StopOnExitCode>3</StopOnExitCode> + <CustomArgument></CustomArgument> + <IncludeLibraryModules></IncludeLibraryModules> + </CommonProperty> + <DllOption> + <SimDllName>SARMCM3.DLL</SimDllName> + <SimDllArguments></SimDllArguments> + <SimDlgDll>DARMCM1.DLL</SimDlgDll> + <SimDlgDllArguments></SimDlgDllArguments> + <TargetDllName>SARMCM3.DLL</TargetDllName> + <TargetDllArguments></TargetDllArguments> + <TargetDlgDll>TARMCM1.DLL</TargetDlgDll> + <TargetDlgDllArguments></TargetDlgDllArguments> + </DllOption> + <DebugOption> + <OPTHX> + <HexSelection>1</HexSelection> + <HexRangeLowAddress>0</HexRangeLowAddress> + <HexRangeHighAddress>0</HexRangeHighAddress> + <HexOffset>0</HexOffset> + <Oh166RecLen>16</Oh166RecLen> + </OPTHX> + <Simulator> + <UseSimulator>1</UseSimulator> + <LoadApplicationAtStartup>1</LoadApplicationAtStartup> + <RunToMain>1</RunToMain> + <RestoreBreakpoints>1</RestoreBreakpoints> + <RestoreWatchpoints>1</RestoreWatchpoints> + <RestoreMemoryDisplay>1</RestoreMemoryDisplay> + <RestoreFunctions>1</RestoreFunctions> + <RestoreToolbox>1</RestoreToolbox> + <LimitSpeedToRealTime>0</LimitSpeedToRealTime> + </Simulator> + <Target> + <UseTarget>0</UseTarget> + <LoadApplicationAtStartup>1</LoadApplicationAtStartup> + <RunToMain>0</RunToMain> + <RestoreBreakpoints>1</RestoreBreakpoints> + <RestoreWatchpoints>1</RestoreWatchpoints> + <RestoreMemoryDisplay>1</RestoreMemoryDisplay> + <RestoreFunctions>0</RestoreFunctions> + <RestoreToolbox>1</RestoreToolbox> + </Target> + <RunDebugAfterBuild>0</RunDebugAfterBuild> + <TargetSelection>-1</TargetSelection> + <SimDlls> + <CpuDll></CpuDll> + <CpuDllArguments></CpuDllArguments> + <PeripheralDll></PeripheralDll> + <PeripheralDllArguments></PeripheralDllArguments> + <InitializationFile></InitializationFile> + </SimDlls> + <TargetDlls> + <CpuDll></CpuDll> + <CpuDllArguments></CpuDllArguments> + <PeripheralDll></PeripheralDll> + <PeripheralDllArguments></PeripheralDllArguments> + <InitializationFile></InitializationFile> + <Driver></Driver> + </TargetDlls> + </DebugOption> + <Utilities> + <Flash1> + <UseTargetDll>0</UseTargetDll> + <UseExternalTool>0</UseExternalTool> + <RunIndependent>0</RunIndependent> + <UpdateFlashBeforeDebugging>0</UpdateFlashBeforeDebugging> + <Capability>0</Capability> + <DriverSelection>-1</DriverSelection> + </Flash1> + <Flash2></Flash2> + <Flash3></Flash3> + <Flash4></Flash4> + </Utilities> + <TargetArmAds> + <ArmAdsMisc> + <GenerateListings>0</GenerateListings> + <asHll>1</asHll> + <asAsm>1</asAsm> + <asMacX>1</asMacX> + <asSyms>1</asSyms> + <asFals>1</asFals> + <asDbgD>1</asDbgD> + <asForm>1</asForm> + <ldLst>0</ldLst> + <ldmm>1</ldmm> + <ldXref>1</ldXref> + <BigEnd>0</BigEnd> + <AdsALst>1</AdsALst> + <AdsACrf>1</AdsACrf> + <AdsANop>0</AdsANop> + <AdsANot>0</AdsANot> + <AdsLLst>1</AdsLLst> + <AdsLmap>1</AdsLmap> + <AdsLcgr>1</AdsLcgr> + <AdsLsym>1</AdsLsym> + <AdsLszi>1</AdsLszi> + <AdsLtoi>1</AdsLtoi> + <AdsLsun>1</AdsLsun> + <AdsLven>1</AdsLven> + <AdsLsxf>1</AdsLsxf> + <RvctClst>0</RvctClst> + <GenPPlst>0</GenPPlst> + <AdsCpuType>"Cortex-M0+"</AdsCpuType> + <RvctDeviceName></RvctDeviceName> + <mOS>0</mOS> + <uocRom>0</uocRom> + <uocRam>0</uocRam> + <hadIROM>0</hadIROM> + <hadIRAM>0</hadIRAM> + <hadXRAM>0</hadXRAM> + <uocXRam>0</uocXRam> + <RvdsVP>0</RvdsVP> + <hadIRAM2>0</hadIRAM2> + <hadIROM2>0</hadIROM2> + <StupSel>1</StupSel> + <useUlib>0</useUlib> + <EndSel>1</EndSel> + <uLtcg>0</uLtcg> + <RoSelD>0</RoSelD> + <RwSelD>5</RwSelD> + <CodeSel>0</CodeSel> + <OptFeed>0</OptFeed> + <NoZi1>0</NoZi1> + <NoZi2>0</NoZi2> + <NoZi3>0</NoZi3> + <NoZi4>0</NoZi4> + <NoZi5>0</NoZi5> + <Ro1Chk>1</Ro1Chk> + <Ro2Chk>0</Ro2Chk> + <Ro3Chk>0</Ro3Chk> + <Ir1Chk>0</Ir1Chk> + <Ir2Chk>0</Ir2Chk> + <Ra1Chk>1</Ra1Chk> + <Ra2Chk>0</Ra2Chk> + <Ra3Chk>0</Ra3Chk> + <Im1Chk>0</Im1Chk> + <Im2Chk>0</Im2Chk> + <OnChipMemories> + <Ocm1> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </Ocm1> + <Ocm2> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </Ocm2> + <Ocm3> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </Ocm3> + <Ocm4> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </Ocm4> + <Ocm5> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </Ocm5> + <Ocm6> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </Ocm6> + <IRAM> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </IRAM> + <IROM> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </IROM> + <XRAM> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </XRAM> + <OCR_RVCT1> + <Type>1</Type> + <StartAddress>0x0</StartAddress> + <Size>0x10000</Size> + </OCR_RVCT1> + <OCR_RVCT2> + <Type>1</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </OCR_RVCT2> + <OCR_RVCT3> + <Type>1</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </OCR_RVCT3> + <OCR_RVCT4> + <Type>1</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </OCR_RVCT4> + <OCR_RVCT5> + <Type>1</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </OCR_RVCT5> + <OCR_RVCT6> + <Type>0</Type> + <StartAddress>0x20000000</StartAddress> + <Size>0x10000</Size> + </OCR_RVCT6> + <OCR_RVCT7> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </OCR_RVCT7> + <OCR_RVCT8> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </OCR_RVCT8> + <OCR_RVCT9> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </OCR_RVCT9> + <OCR_RVCT10> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </OCR_RVCT10> + </OnChipMemories> + <RvctStartVector></RvctStartVector> + </ArmAdsMisc> + <Cads> + <interw>1</interw> + <Optim>3</Optim> + <oTime>0</oTime> + <SplitLS>0</SplitLS> + <OneElfS>0</OneElfS> + <Strict>0</Strict> + <EnumInt>0</EnumInt> + <PlainCh>0</PlainCh> + <Ropi>0</Ropi> + <Rwpi>0</Rwpi> + <wLevel>0</wLevel> + <uThumb>0</uThumb> + <VariousControls> + <MiscControls></MiscControls> + <Define>CORTEX_M0PLUS</Define> + <Undefine></Undefine> + <IncludePath>..\..\..\..\software\cmsis\CMSIS\Include; ..\..\..\..\software\cmsis\Device\ARM\CMSDK_CM0plus\Include; ..\..\..\..\software\common\retarget; ..\..\..\..\software\debug_tester; ..\..\..\..\software\common\debug_tests; ..\generic</IncludePath> + </VariousControls> + </Cads> + <Aads> + <interw>1</interw> + <Ropi>0</Ropi> + <Rwpi>0</Rwpi> + <thumb>0</thumb> + <SplitLS>0</SplitLS> + <SwStkChk>0</SwStkChk> + <NoWarn>0</NoWarn> + <VariousControls> + <MiscControls></MiscControls> + <Define></Define> + <Undefine></Undefine> + <IncludePath></IncludePath> + </VariousControls> + </Aads> + <LDads> + <umfTarg>1</umfTarg> + <Ropi>0</Ropi> + <Rwpi>0</Rwpi> + <noStLib>0</noStLib> + <RepFail>1</RepFail> + <useFile>0</useFile> + <TextAddressRange>0x00000000</TextAddressRange> + <DataAddressRange>0x00000000</DataAddressRange> + <ScatterFile></ScatterFile> + <IncludeLibs></IncludeLibs> + <IncludeLibsPath></IncludeLibsPath> + <Misc></Misc> + <LinkerInputFile></LinkerInputFile> + <DisabledWarnings></DisabledWarnings> + </LDads> + </TargetArmAds> + </TargetOption> + <Groups> + <Group> + <GroupName>Startup</GroupName> + <Files> + <File> + <FileName>startup_CMSDK_CM0plus.s</FileName> + <FileType>2</FileType> + <FilePath>..\..\..\..\software\cmsis\Device\ARM\CMSDK_CM0plus\Source\ARM\startup_CMSDK_CM0plus.s</FilePath> + </File> + </Files> + </Group> + <Group> + <GroupName>Application</GroupName> + <Files> + <File> + <FileName>debug_tests.c</FileName> + <FileType>1</FileType> + <FilePath>..\..\..\..\software\common\debug_tests\debug_tests.c</FilePath> + </File> + <File> + <FileName>uart_stdout.c</FileName> + <FileType>1</FileType> + <FilePath>..\..\..\..\software\common\retarget\uart_stdout.c</FilePath> + </File> + <File> + <FileName>retarget.c</FileName> + <FileType>1</FileType> + <FilePath>..\..\..\..\software\common\retarget\retarget.c</FilePath> + </File> + <File> + <FileName>mcu_debugtester_interface.c</FileName> + <FileType>1</FileType> + <FilePath>..\generic\mcu_debugtester_interface.c</FilePath> + </File> + </Files> + </Group> + <Group> + <GroupName>System</GroupName> + <Files> + <File> + <FileName>system_CMSDK_CM0plus.c</FileName> + <FileType>1</FileType> + <FilePath>..\..\..\..\software\cmsis\Device\ARM\CMSDK_CM0plus\Source\system_CMSDK_CM0plus.c</FilePath> + </File> + <File> + <FileName>CMSDK_driver.c</FileName> + <FileType>1</FileType> + <FilePath>..\..\..\..\software\cmsis\Device\ARM\CMSDK_CM0plus\Source\CMSDK_driver.c</FilePath> + </File> + </Files> + </Group> + </Groups> + </Target> + </Targets> + +</Project> diff --git a/Cortex-M0/nanosoc/systems/mcu/testcodes/debug_tests/makefile b/Cortex-M0/nanosoc/systems/mcu/testcodes/debug_tests/makefile new file mode 100644 index 0000000..bb0cdf6 --- /dev/null +++ b/Cortex-M0/nanosoc/systems/mcu/testcodes/debug_tests/makefile @@ -0,0 +1,265 @@ +#----------------------------------------------------------------------------- +# The confidential and proprietary information contained in this file may +# only be used by a person authorised under and to the extent permitted +# by a subsisting licensing agreement from Arm Limited or its affiliates. +# +# (C) COPYRIGHT 2010-2013 Arm Limited or its affiliates. +# ALL RIGHTS RESERVED +# +# This entire notice must be reproduced on all copies of this file +# and copies of this file may only be made by a person if such person is +# permitted to do so under the terms of a subsisting license agreement +# from Arm Limited or its affiliates. +# +# SVN Information +# +# Checked In : $Date: 2010-08-06 12:28:21 +0100 (Fri, 06 Aug 2010) $ +# +# Revision : $Revision: 145378 $ +# +# Release Information : Cortex-M System Design Kit-r1p1-00rel0 +#----------------------------------------------------------------------------- +# +# Cortex-M System Design Kit software compilation make file +# +#----------------------------------------------------------------------------- +# +# Configurations +# +# Choose the core instantiated, can be +# - CORTEX_M0 +# - CORTEX_M0PLUS +CPU_PRODUCT = CORTEX_M0PLUS + +# Shared software directory +SOFTWARE_DIR = ../../../../software +CMSIS_DIR = $(SOFTWARE_DIR)/cmsis +CORE_DIR = $(CMSIS_DIR)/CMSIS/Include +GENERIC_DIR = ../generic + +ifeq ($(CPU_PRODUCT),CORTEX_M0PLUS) + DEVICE_DIR = $(CMSIS_DIR)/Device/ARM/CMSDK_CM0plus +else + DEVICE_DIR = $(CMSIS_DIR)/Device/ARM/CMSDK_CM0 +endif + +# Program file +TESTNAME = debug_tests + +# Endian Option +COMPILE_BIGEND = 0 + +# Configuration +ifeq ($(CPU_PRODUCT),CORTEX_M0PLUS) + USER_DEFINE = -DCORTEX_M0PLUS +else + USER_DEFINE = -DCORTEX_M0 +endif + +DEPS_LIST = makefile + +# Tool chain : ds5 / gcc / keil +TOOL_CHAIN = ds5 + +ifeq ($(TOOL_CHAIN),ds5) + ifeq ($(CPU_PRODUCT),CORTEX_M0PLUS) + CPU_TYPE = --cpu Cortex-M0plus + else + CPU_TYPE = --cpu Cortex-M0 + endif +endif + +ifeq ($(TOOL_CHAIN),gcc) + ifeq ($(CPU_PRODUCT),CORTEX_M0PLUS) + CPU_TYPE = -mcpu=cortex-m0plus + else + CPU_TYPE = -mcpu=cortex-m0 + endif +endif + +# Startup code directory for DS-5 +ifeq ($(TOOL_CHAIN),ds5) + STARTUP_DIR = $(DEVICE_DIR)/Source/ARM +endif + +# Startup code directory for gcc +ifeq ($(TOOL_CHAIN),gcc) + STARTUP_DIR = $(DEVICE_DIR)/Source/GCC +endif + +ifeq ($(CPU_PRODUCT),CORTEX_M0PLUS) + STARTUP_FILE = startup_CMSDK_CM0plus + SYSTEM_FILE = system_CMSDK_CM0plus +else + STARTUP_FILE = startup_CMSDK_CM0 + SYSTEM_FILE = system_CMSDK_CM0 +endif + +# Configuration ID values +GENERIC_FILE = $(GENERIC_DIR)/config_id.h + +# --------------------------------------------------------------------------------------- +# DS-5 options + +# MicroLIB option +COMPILE_MICROLIB = 0 + +# Small Multiply (Cortex-M0/M0+ has small multiplier option) +COMPILE_SMALLMUL = 0 + +ARM_CC_OPTIONS = -c -O3 -g -Otime $(USER_DEFINE) -I $(GENERIC_DIR) \ + -I $(DEVICE_DIR)/Include -I $(CORE_DIR) -I $(SOFTWARE_DIR)/common/retarget \ + -I $(SOFTWARE_DIR)/debug_tester +ARM_ASM_OPTIONS = -g + +ARM_LINK_OPTIONS = "--keep=$(STARTUP_FILE).o(RESET)" "--first=$(STARTUP_FILE).o(RESET)" \ + --rw_base 0x30000000 --ro_base 0x00000000 --map + +ifeq ($(COMPILE_BIGEND),1) + # Big Endian + ARM_CC_OPTIONS += --bigend + ARM_ASM_OPTIONS += --bigend + ARM_LINK_OPTIONS += --be8 +endif + +ifeq ($(COMPILE_MICROLIB),1) + # MicroLIB + ARM_CC_OPTIONS += --library_type=microlib + ARM_ASM_OPTIONS += --library_type=microlib --pd "__MICROLIB SETA 1" + ARM_LINK_OPTIONS += --library_type=microlib +endif + +ifeq ($(COMPILE_SMALLMUL),1) + # In Cortex-M0, small multiply takes 32 cycles + ARM_CC_OPTIONS += --multiply_latency=32 +endif + +# --------------------------------------------------------------------------------------- +# gcc options + +GNG_CC = arm-none-eabi-gcc +GNU_OBJDUMP = arm-none-eabi-objdump +GNU_OBJCOPY = arm-none-eabi-objcopy + +LINKER_SCRIPT_PATH = $(SOFTWARE_DIR)/common/scripts +LINKER_SCRIPT = $(LINKER_SCRIPT_PATH)/cmsdk_cm0.ld + +GNU_CC_FLAGS = -g -O3 -mthumb $(CPU_TYPE) + +ifeq ($(COMPILE_BIGEND),1) + # Big Endian + GNU_CC_FLAGS += -mbig-endian +endif + +# --------------------------------------------------------------------------------------- +all: all_$(TOOL_CHAIN) + +# --------------------------------------------------------------------------------------- +# DS-5 +all_ds5 : $(TESTNAME).hex $(TESTNAME).lst + +$(TESTNAME).o : $(SOFTWARE_DIR)/common/debug_tests/$(TESTNAME).c $(SOFTWARE_DIR)/common/debug_tests/$(TESTNAME).h $(GENERIC_FILE) $(SOFTWARE_DIR)/debug_tester/debugtester_functions.h $(DEPS_LIST) + armcc $(ARM_CC_OPTIONS) $(CPU_TYPE) $< -o $@ + +mcu_debugtester_interface.o : $(GENERIC_DIR)/mcu_debugtester_interface.c $(DEPS_LIST) + armcc $(ARM_CC_OPTIONS) $(CPU_TYPE) $< -o $@ + +$(SYSTEM_FILE).o : $(DEVICE_DIR)/Source/$(SYSTEM_FILE).c $(DEPS_LIST) + armcc $(ARM_CC_OPTIONS) $(CPU_TYPE) $< -o $@ + +retarget.o : $(SOFTWARE_DIR)/common/retarget/retarget.c $(DEPS_LIST) + armcc $(ARM_CC_OPTIONS) $(CPU_TYPE) $< -o $@ + +uart_stdout.o : $(SOFTWARE_DIR)/common/retarget/uart_stdout.c $(DEPS_LIST) + armcc $(ARM_CC_OPTIONS) $(CPU_TYPE) $< -o $@ + +CMSDK_driver.o : $(DEVICE_DIR)/Source/CMSDK_driver.c $(DEPS_LIST) + armcc $(ARM_CC_OPTIONS) $(CPU_TYPE) $< -o $@ + +$(STARTUP_FILE).o : $(STARTUP_DIR)/$(STARTUP_FILE).s $(DEPS_LIST) + armasm $(ARM_ASM_OPTIONS) $(CPU_TYPE) $< -o $@ + +$(TESTNAME).ELF: $(TESTNAME).o $(SYSTEM_FILE).o $(STARTUP_FILE).o retarget.o uart_stdout.o CMSDK_driver.o mcu_debugtester_interface.o + armlink $(ARM_LINK_OPTIONS) -o $@ $(TESTNAME).o $(SYSTEM_FILE).o $(STARTUP_FILE).o retarget.o uart_stdout.o CMSDK_driver.o mcu_debugtester_interface.o + +$(TESTNAME).hex : $(TESTNAME).ELF + fromelf --vhx --8x1 $< --output $@ + +$(TESTNAME).lst : $(TESTNAME).ELF + fromelf -c -d -e -s $< --output $@ + +# --------------------------------------------------------------------------------------- +# gcc +all_gcc: + $(GNG_CC) $(GNU_CC_FLAGS) $(STARTUP_DIR)/$(STARTUP_FILE).s \ + $(SOFTWARE_DIR)/common/debug_tests/$(TESTNAME).c \ + $(GENERIC_DIR)/mcu_debugtester_interface.c \ + $(SOFTWARE_DIR)/common/retarget/retarget.c \ + $(SOFTWARE_DIR)/common/retarget/uart_stdout.c \ + $(DEVICE_DIR)/Source/CMSDK_driver.c \ + $(DEVICE_DIR)/Source/$(SYSTEM_FILE).c \ + -I $(DEVICE_DIR)/Include -I $(CORE_DIR) \ + -I $(GENERIC_DIR) \ + -I $(SOFTWARE_DIR)/common/retarget \ + -I $(SOFTWARE_DIR)/debug_tester \ + -L $(LINKER_SCRIPT_PATH) \ + -D__STACK_SIZE=0x200 \ + -D__HEAP_SIZE=0x1000 \ + $(USER_DEFINE) -T $(LINKER_SCRIPT) -o $(TESTNAME).o + # Generate disassembly code + $(GNU_OBJDUMP) -S $(TESTNAME).o > $(TESTNAME).lst + # Generate binary file + $(GNU_OBJCOPY) -S $(TESTNAME).o -O binary $(TESTNAME).bin + # Generate hex file + $(GNU_OBJCOPY) -S $(TESTNAME).o -O verilog $(TESTNAME).hex + +# Note: +# If the version of object copy you are using does not support verilog hex file output, +# you can generate the hex file from binary file using the following command +# od -v -A n -t x1 --width=1 $(TESTNAME).bin > $(TESTNAME).hex + +# --------------------------------------------------------------------------------------- +# Keil MDK + +all_keil: + @echo "Please compile your project code and press ENTER when ready" + @read dummy + +# --------------------------------------------------------------------------------------- +# Binary + +all_bin: $(TESTNAME).bin + # Generate hex file from binary + od -v -A n -t x1 --width=1 $(TESTNAME).bin > $(TESTNAME).hex + +# --------------------------------------------------------------------------------------- +# Clean + +clean : + @rm -rf *.o + @if [ -e $(TESTNAME).hex ] ; then \ + rm -rf $(TESTNAME).hex ; \ + fi + @if [ -e $(TESTNAME).lst ] ; then \ + rm -rf $(TESTNAME).lst ; \ + fi + @if [ -e $(TESTNAME).ELF ] ; then \ + rm -rf $(TESTNAME).ELF ; \ + fi + @if [ -e $(TESTNAME).bin ] ; then \ + rm -rf $(TESTNAME).bin ; \ + fi + @rm -rf *.crf + @rm -rf *.plg + @rm -rf *.tra + @rm -rf *.htm + @rm -rf *.map + @rm -rf *.dep + @rm -rf *.d + @rm -rf *.lnp + @rm -rf *.bak + @rm -rf *.lst + @rm -rf *.axf + @rm -rf *.sct + @rm -rf *.__i + @rm -rf *._ia diff --git a/Cortex-M0/nanosoc/systems/mcu/testcodes/default_slaves_tests/default_slaves_tests_cm0.uvopt b/Cortex-M0/nanosoc/systems/mcu/testcodes/default_slaves_tests/default_slaves_tests_cm0.uvopt new file mode 100644 index 0000000..cd7bd16 --- /dev/null +++ b/Cortex-M0/nanosoc/systems/mcu/testcodes/default_slaves_tests/default_slaves_tests_cm0.uvopt @@ -0,0 +1,261 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no" ?> +<ProjectOpt xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="project_opt.xsd"> + + <SchemaVersion>1.0</SchemaVersion> + + <Header>### uVision Project, (C) Keil Software</Header> + + <Extensions> + <cExt>*.c</cExt> + <aExt>*.s*; *.src; *.a*</aExt> + <oExt>*.obj</oExt> + <lExt>*.lib</lExt> + <tExt>*.txt; *.h; *.inc</tExt> + <pExt>*.plm</pExt> + <CppX>*.cpp</CppX> + </Extensions> + + <DaveTm> + <dwLowDateTime>0</dwLowDateTime> + <dwHighDateTime>0</dwHighDateTime> + </DaveTm> + + <Target> + <TargetName>Debug</TargetName> + <ToolsetNumber>0x4</ToolsetNumber> + <ToolsetName>ARM-ADS</ToolsetName> + <TargetOption> + <CLKADS>50000000</CLKADS> + <OPTTT> + <gFlags>1</gFlags> + <BeepAtEnd>1</BeepAtEnd> + <RunSim>1</RunSim> + <RunTarget>0</RunTarget> + </OPTTT> + <OPTHX> + <HexSelection>1</HexSelection> + <FlashByte>65535</FlashByte> + <HexRangeLowAddress>0</HexRangeLowAddress> + <HexRangeHighAddress>0</HexRangeHighAddress> + <HexOffset>0</HexOffset> + </OPTHX> + <OPTLEX> + <PageWidth>79</PageWidth> + <PageLength>66</PageLength> + <TabStop>8</TabStop> + <ListingPath>.\</ListingPath> + </OPTLEX> + <ListingPage> + <CreateCListing>1</CreateCListing> + <CreateAListing>1</CreateAListing> + <CreateLListing>1</CreateLListing> + <CreateIListing>0</CreateIListing> + <AsmCond>1</AsmCond> + <AsmSymb>1</AsmSymb> + <AsmXref>0</AsmXref> + <CCond>1</CCond> + <CCode>0</CCode> + <CListInc>0</CListInc> + <CSymb>0</CSymb> + <LinkerCodeListing>0</LinkerCodeListing> + </ListingPage> + <OPTXL> + <LMap>1</LMap> + <LComments>1</LComments> + <LGenerateSymbols>1</LGenerateSymbols> + <LLibSym>1</LLibSym> + <LLines>1</LLines> + <LLocSym>1</LLocSym> + <LPubSym>1</LPubSym> + <LXref>0</LXref> + <LExpSel>0</LExpSel> + </OPTXL> + <OPTFL> + <tvExp>1</tvExp> + <tvExpOptDlg>0</tvExpOptDlg> + <IsCurrentTarget>1</IsCurrentTarget> + </OPTFL> + <CpuCode>255</CpuCode> + <DllOpt> + <SimDllName>SARMCM3.DLL</SimDllName> + <SimDllArguments></SimDllArguments> + <SimDlgDllName>DARMCM1.DLL</SimDlgDllName> + <SimDlgDllArguments></SimDlgDllArguments> + <TargetDllName>SARMCM3.DLL</TargetDllName> + <TargetDllArguments></TargetDllArguments> + <TargetDlgDllName>TARMCM1.DLL</TargetDlgDllName> + <TargetDlgDllArguments></TargetDlgDllArguments> + </DllOpt> + <DebugOpt> + <uSim>1</uSim> + <uTrg>0</uTrg> + <sLdApp>1</sLdApp> + <sGomain>1</sGomain> + <sRbreak>1</sRbreak> + <sRwatch>1</sRwatch> + <sRmem>1</sRmem> + <sRfunc>1</sRfunc> + <sRbox>1</sRbox> + <tLdApp>1</tLdApp> + <tGomain>0</tGomain> + <tRbreak>1</tRbreak> + <tRwatch>1</tRwatch> + <tRmem>1</tRmem> + <tRfunc>0</tRfunc> + <tRbox>1</tRbox> + <tRtrace>0</tRtrace> + <sRunDeb>0</sRunDeb> + <sLrtime>0</sLrtime> + <nTsel>-1</nTsel> + <sDll></sDll> + <sDllPa></sDllPa> + <sDlgDll></sDlgDll> + <sDlgPa></sDlgPa> + <sIfile></sIfile> + <tDll></tDll> + <tDllPa></tDllPa> + <tDlgDll></tDlgDll> + <tDlgPa></tDlgPa> + <tIfile></tIfile> + <pMon></pMon> + </DebugOpt> + <Breakpoint/> + <DebugFlag> + <trace>0</trace> + <periodic>1</periodic> + <aLwin>0</aLwin> + <aCover>0</aCover> + <aSer1>0</aSer1> + <aSer2>0</aSer2> + <aPa>0</aPa> + <viewmode>0</viewmode> + <vrSel>0</vrSel> + <aSym>0</aSym> + <aTbox>0</aTbox> + <AscS1>0</AscS1> + <AscS2>0</AscS2> + <AscS3>0</AscS3> + <aSer3>0</aSer3> + <eProf>0</eProf> + <aLa>0</aLa> + <aPa1>0</aPa1> + <AscS4>0</AscS4> + <aSer4>0</aSer4> + <StkLoc>0</StkLoc> + <TrcWin>0</TrcWin> + <newCpu>0</newCpu> + <uProt>0</uProt> + </DebugFlag> + <Tracepoint> + <THDelay>0</THDelay> + </Tracepoint> + <LintExecutable></LintExecutable> + <LintConfigFile></LintConfigFile> + </TargetOption> + </Target> + + <Group> + <GroupName>Startup</GroupName> + <tvExp>1</tvExp> + <tvExpOptDlg>0</tvExpOptDlg> + <cbSel>0</cbSel> + <RteFlg>0</RteFlg> + <File> + <GroupNumber>1</GroupNumber> + <FileNumber>1</FileNumber> + <FileType>2</FileType> + <tvExp>0</tvExp> + <Focus>0</Focus> + <ColumnNumber>0</ColumnNumber> + <tvExpOptDlg>0</tvExpOptDlg> + <TopLine>0</TopLine> + <CurrentLine>0</CurrentLine> + <bDave2>0</bDave2> + <PathWithFileName>..\..\..\..\software\cmsis\Device\ARM\CMSDK_CM0\Source\ARM\startup_CMSDK_CM0.s</PathWithFileName> + <FilenameWithoutPath>startup_CMSDK_CM0.s</FilenameWithoutPath> + <RteFlg>0</RteFlg> + <bShared>0</bShared> + </File> + </Group> + + <Group> + <GroupName>Application</GroupName> + <tvExp>1</tvExp> + <tvExpOptDlg>0</tvExpOptDlg> + <cbSel>0</cbSel> + <RteFlg>0</RteFlg> + <File> + <GroupNumber>2</GroupNumber> + <FileNumber>2</FileNumber> + <FileType>1</FileType> + <tvExp>0</tvExp> + <Focus>0</Focus> + <ColumnNumber>0</ColumnNumber> + <tvExpOptDlg>0</tvExpOptDlg> + <TopLine>0</TopLine> + <CurrentLine>0</CurrentLine> + <bDave2>0</bDave2> + <PathWithFileName>..\..\..\..\software\common\validation\default_slaves_tests.c</PathWithFileName> + <FilenameWithoutPath>default_slaves_tests.c</FilenameWithoutPath> + <RteFlg>0</RteFlg> + <bShared>0</bShared> + </File> + <File> + <GroupNumber>2</GroupNumber> + <FileNumber>3</FileNumber> + <FileType>1</FileType> + <tvExp>0</tvExp> + <Focus>0</Focus> + <ColumnNumber>0</ColumnNumber> + <tvExpOptDlg>0</tvExpOptDlg> + <TopLine>0</TopLine> + <CurrentLine>0</CurrentLine> + <bDave2>0</bDave2> + <PathWithFileName>..\..\..\..\software\common\retarget\uart_stdout.c</PathWithFileName> + <FilenameWithoutPath>uart_stdout.c</FilenameWithoutPath> + <RteFlg>0</RteFlg> + <bShared>0</bShared> + </File> + <File> + <GroupNumber>2</GroupNumber> + <FileNumber>4</FileNumber> + <FileType>1</FileType> + <tvExp>0</tvExp> + <Focus>0</Focus> + <ColumnNumber>0</ColumnNumber> + <tvExpOptDlg>0</tvExpOptDlg> + <TopLine>0</TopLine> + <CurrentLine>0</CurrentLine> + <bDave2>0</bDave2> + <PathWithFileName>..\..\..\..\software\common\retarget\retarget.c</PathWithFileName> + <FilenameWithoutPath>retarget.c</FilenameWithoutPath> + <RteFlg>0</RteFlg> + <bShared>0</bShared> + </File> + </Group> + + <Group> + <GroupName>System</GroupName> + <tvExp>1</tvExp> + <tvExpOptDlg>0</tvExpOptDlg> + <cbSel>0</cbSel> + <RteFlg>0</RteFlg> + <File> + <GroupNumber>3</GroupNumber> + <FileNumber>5</FileNumber> + <FileType>1</FileType> + <tvExp>0</tvExp> + <Focus>0</Focus> + <ColumnNumber>0</ColumnNumber> + <tvExpOptDlg>0</tvExpOptDlg> + <TopLine>0</TopLine> + <CurrentLine>0</CurrentLine> + <bDave2>0</bDave2> + <PathWithFileName>..\..\..\..\software\cmsis\Device\ARM\CMSDK_CM0\Source\system_CMSDK_CM0.c</PathWithFileName> + <FilenameWithoutPath>system_CMSDK_CM0.c</FilenameWithoutPath> + <RteFlg>0</RteFlg> + <bShared>0</bShared> + </File> + </Group> + +</ProjectOpt> diff --git a/Cortex-M0/nanosoc/systems/mcu/testcodes/default_slaves_tests/default_slaves_tests_cm0.uvproj b/Cortex-M0/nanosoc/systems/mcu/testcodes/default_slaves_tests/default_slaves_tests_cm0.uvproj new file mode 100644 index 0000000..dc2614c --- /dev/null +++ b/Cortex-M0/nanosoc/systems/mcu/testcodes/default_slaves_tests/default_slaves_tests_cm0.uvproj @@ -0,0 +1,435 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no" ?> +<Project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="project_proj.xsd"> + + <SchemaVersion>1.1</SchemaVersion> + + <Header>### uVision Project, (C) Keil Software</Header> + + <Targets> + <Target> + <TargetName>Debug</TargetName> + <ToolsetNumber>0x4</ToolsetNumber> + <ToolsetName>ARM-ADS</ToolsetName> + <TargetOption> + <TargetCommonOption> + <Device>Cortex-M0</Device> + <Vendor>ARM</Vendor> + <Cpu>CLOCK(12000000) CPUTYPE("Cortex-M0") ESEL ELITTLE</Cpu> + <FlashUtilSpec></FlashUtilSpec> + <StartupFile></StartupFile> + <FlashDriverDll></FlashDriverDll> + <DeviceId>4803</DeviceId> + <RegisterFile></RegisterFile> + <MemoryEnv></MemoryEnv> + <Cmp></Cmp> + <Asm></Asm> + <Linker></Linker> + <OHString></OHString> + <InfinionOptionDll></InfinionOptionDll> + <SLE66CMisc></SLE66CMisc> + <SLE66AMisc></SLE66AMisc> + <SLE66LinkerMisc></SLE66LinkerMisc> + <SFDFile></SFDFile> + <UseEnv>0</UseEnv> + <BinPath></BinPath> + <IncludePath></IncludePath> + <LibPath></LibPath> + <RegisterFilePath></RegisterFilePath> + <DBRegisterFilePath></DBRegisterFilePath> + <TargetStatus> + <Error>0</Error> + <ExitCodeStop>0</ExitCodeStop> + <ButtonStop>0</ButtonStop> + <NotGenerated>0</NotGenerated> + <InvalidFlash>1</InvalidFlash> + </TargetStatus> + <OutputDirectory>.\</OutputDirectory> + <OutputName>default_slaves_tests</OutputName> + <CreateExecutable>1</CreateExecutable> + <CreateLib>0</CreateLib> + <CreateHexFile>0</CreateHexFile> + <DebugInformation>1</DebugInformation> + <BrowseInformation>1</BrowseInformation> + <ListingPath>.\</ListingPath> + <HexFormatSelection>1</HexFormatSelection> + <Merge32K>0</Merge32K> + <CreateBatchFile>0</CreateBatchFile> + <BeforeCompile> + <RunUserProg1>0</RunUserProg1> + <RunUserProg2>0</RunUserProg2> + <UserProg1Name></UserProg1Name> + <UserProg2Name></UserProg2Name> + <UserProg1Dos16Mode>0</UserProg1Dos16Mode> + <UserProg2Dos16Mode>0</UserProg2Dos16Mode> + <nStopU1X>0</nStopU1X> + <nStopU2X>0</nStopU2X> + </BeforeCompile> + <BeforeMake> + <RunUserProg1>0</RunUserProg1> + <RunUserProg2>0</RunUserProg2> + <UserProg1Name></UserProg1Name> + <UserProg2Name></UserProg2Name> + <UserProg1Dos16Mode>0</UserProg1Dos16Mode> + <UserProg2Dos16Mode>0</UserProg2Dos16Mode> + </BeforeMake> + <AfterMake> + <RunUserProg1>1</RunUserProg1> + <RunUserProg2>0</RunUserProg2> + <UserProg1Name>$K\ARM\ARMCC\BIN\fromelf.exe #L --vhx --8x1 --output default_slaves_tests.hex</UserProg1Name> + <UserProg2Name></UserProg2Name> + <UserProg1Dos16Mode>0</UserProg1Dos16Mode> + <UserProg2Dos16Mode>0</UserProg2Dos16Mode> + </AfterMake> + <SelectedForBatchBuild>0</SelectedForBatchBuild> + <SVCSIdString></SVCSIdString> + </TargetCommonOption> + <CommonProperty> + <UseCPPCompiler>0</UseCPPCompiler> + <RVCTCodeConst>0</RVCTCodeConst> + <RVCTZI>0</RVCTZI> + <RVCTOtherData>0</RVCTOtherData> + <ModuleSelection>0</ModuleSelection> + <IncludeInBuild>1</IncludeInBuild> + <AlwaysBuild>0</AlwaysBuild> + <GenerateAssemblyFile>0</GenerateAssemblyFile> + <AssembleAssemblyFile>0</AssembleAssemblyFile> + <PublicsOnly>0</PublicsOnly> + <StopOnExitCode>3</StopOnExitCode> + <CustomArgument></CustomArgument> + <IncludeLibraryModules></IncludeLibraryModules> + </CommonProperty> + <DllOption> + <SimDllName>SARMCM3.DLL</SimDllName> + <SimDllArguments></SimDllArguments> + <SimDlgDll>DARMCM1.DLL</SimDlgDll> + <SimDlgDllArguments></SimDlgDllArguments> + <TargetDllName>SARMCM3.DLL</TargetDllName> + <TargetDllArguments></TargetDllArguments> + <TargetDlgDll>TARMCM1.DLL</TargetDlgDll> + <TargetDlgDllArguments></TargetDlgDllArguments> + </DllOption> + <DebugOption> + <OPTHX> + <HexSelection>1</HexSelection> + <HexRangeLowAddress>0</HexRangeLowAddress> + <HexRangeHighAddress>0</HexRangeHighAddress> + <HexOffset>0</HexOffset> + <Oh166RecLen>16</Oh166RecLen> + </OPTHX> + <Simulator> + <UseSimulator>1</UseSimulator> + <LoadApplicationAtStartup>1</LoadApplicationAtStartup> + <RunToMain>1</RunToMain> + <RestoreBreakpoints>1</RestoreBreakpoints> + <RestoreWatchpoints>1</RestoreWatchpoints> + <RestoreMemoryDisplay>1</RestoreMemoryDisplay> + <RestoreFunctions>1</RestoreFunctions> + <RestoreToolbox>1</RestoreToolbox> + <LimitSpeedToRealTime>0</LimitSpeedToRealTime> + </Simulator> + <Target> + <UseTarget>0</UseTarget> + <LoadApplicationAtStartup>1</LoadApplicationAtStartup> + <RunToMain>0</RunToMain> + <RestoreBreakpoints>1</RestoreBreakpoints> + <RestoreWatchpoints>1</RestoreWatchpoints> + <RestoreMemoryDisplay>1</RestoreMemoryDisplay> + <RestoreFunctions>0</RestoreFunctions> + <RestoreToolbox>1</RestoreToolbox> + <RestoreTracepoints>0</RestoreTracepoints> + </Target> + <RunDebugAfterBuild>0</RunDebugAfterBuild> + <TargetSelection>-1</TargetSelection> + <SimDlls> + <CpuDll></CpuDll> + <CpuDllArguments></CpuDllArguments> + <PeripheralDll></PeripheralDll> + <PeripheralDllArguments></PeripheralDllArguments> + <InitializationFile></InitializationFile> + </SimDlls> + <TargetDlls> + <CpuDll></CpuDll> + <CpuDllArguments></CpuDllArguments> + <PeripheralDll></PeripheralDll> + <PeripheralDllArguments></PeripheralDllArguments> + <InitializationFile></InitializationFile> + <Driver></Driver> + </TargetDlls> + </DebugOption> + <Utilities> + <Flash1> + <UseTargetDll>0</UseTargetDll> + <UseExternalTool>0</UseExternalTool> + <RunIndependent>0</RunIndependent> + <UpdateFlashBeforeDebugging>0</UpdateFlashBeforeDebugging> + <Capability>0</Capability> + <DriverSelection>-1</DriverSelection> + </Flash1> + <Flash2></Flash2> + <Flash3></Flash3> + <Flash4></Flash4> + </Utilities> + <TargetArmAds> + <ArmAdsMisc> + <GenerateListings>0</GenerateListings> + <asHll>1</asHll> + <asAsm>1</asAsm> + <asMacX>1</asMacX> + <asSyms>1</asSyms> + <asFals>1</asFals> + <asDbgD>1</asDbgD> + <asForm>1</asForm> + <ldLst>0</ldLst> + <ldmm>1</ldmm> + <ldXref>1</ldXref> + <BigEnd>0</BigEnd> + <AdsALst>1</AdsALst> + <AdsACrf>1</AdsACrf> + <AdsANop>0</AdsANop> + <AdsANot>0</AdsANot> + <AdsLLst>1</AdsLLst> + <AdsLmap>1</AdsLmap> + <AdsLcgr>1</AdsLcgr> + <AdsLsym>1</AdsLsym> + <AdsLszi>1</AdsLszi> + <AdsLtoi>1</AdsLtoi> + <AdsLsun>1</AdsLsun> + <AdsLven>1</AdsLven> + <AdsLsxf>1</AdsLsxf> + <RvctClst>0</RvctClst> + <GenPPlst>0</GenPPlst> + <AdsCpuType>"Cortex-M0"</AdsCpuType> + <RvctDeviceName></RvctDeviceName> + <mOS>0</mOS> + <uocRom>0</uocRom> + <uocRam>0</uocRam> + <hadIROM>0</hadIROM> + <hadIRAM>0</hadIRAM> + <hadXRAM>0</hadXRAM> + <uocXRam>0</uocXRam> + <RvdsVP>0</RvdsVP> + <hadIRAM2>0</hadIRAM2> + <hadIROM2>0</hadIROM2> + <StupSel>1</StupSel> + <useUlib>0</useUlib> + <EndSel>1</EndSel> + <uLtcg>0</uLtcg> + <RoSelD>0</RoSelD> + <RwSelD>5</RwSelD> + <CodeSel>0</CodeSel> + <OptFeed>0</OptFeed> + <NoZi1>0</NoZi1> + <NoZi2>0</NoZi2> + <NoZi3>0</NoZi3> + <NoZi4>0</NoZi4> + <NoZi5>0</NoZi5> + <Ro1Chk>1</Ro1Chk> + <Ro2Chk>0</Ro2Chk> + <Ro3Chk>0</Ro3Chk> + <Ir1Chk>0</Ir1Chk> + <Ir2Chk>0</Ir2Chk> + <Ra1Chk>1</Ra1Chk> + <Ra2Chk>0</Ra2Chk> + <Ra3Chk>0</Ra3Chk> + <Im1Chk>0</Im1Chk> + <Im2Chk>0</Im2Chk> + <OnChipMemories> + <Ocm1> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </Ocm1> + <Ocm2> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </Ocm2> + <Ocm3> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </Ocm3> + <Ocm4> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </Ocm4> + <Ocm5> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </Ocm5> + <Ocm6> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </Ocm6> + <IRAM> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </IRAM> + <IROM> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </IROM> + <XRAM> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </XRAM> + <OCR_RVCT1> + <Type>1</Type> + <StartAddress>0x0</StartAddress> + <Size>0x10000</Size> + </OCR_RVCT1> + <OCR_RVCT2> + <Type>1</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </OCR_RVCT2> + <OCR_RVCT3> + <Type>1</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </OCR_RVCT3> + <OCR_RVCT4> + <Type>1</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </OCR_RVCT4> + <OCR_RVCT5> + <Type>1</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </OCR_RVCT5> + <OCR_RVCT6> + <Type>0</Type> + <StartAddress>0x20000000</StartAddress> + <Size>0x10000</Size> + </OCR_RVCT6> + <OCR_RVCT7> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </OCR_RVCT7> + <OCR_RVCT8> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </OCR_RVCT8> + <OCR_RVCT9> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </OCR_RVCT9> + <OCR_RVCT10> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </OCR_RVCT10> + </OnChipMemories> + <RvctStartVector></RvctStartVector> + </ArmAdsMisc> + <Cads> + <interw>1</interw> + <Optim>3</Optim> + <oTime>0</oTime> + <SplitLS>0</SplitLS> + <OneElfS>0</OneElfS> + <Strict>0</Strict> + <EnumInt>0</EnumInt> + <PlainCh>0</PlainCh> + <Ropi>0</Ropi> + <Rwpi>0</Rwpi> + <wLevel>0</wLevel> + <uThumb>0</uThumb> + <uSurpInc>0</uSurpInc> + <VariousControls> + <MiscControls></MiscControls> + <Define>CORTEX_M0</Define> + <Undefine></Undefine> + <IncludePath>..\..\..\..\software\cmsis\CMSIS\Include; ..\..\..\..\software\cmsis\Device\ARM\CMSDK_CM0\Include; ..\..\..\..\software\common\retarget</IncludePath> + </VariousControls> + </Cads> + <Aads> + <interw>1</interw> + <Ropi>0</Ropi> + <Rwpi>0</Rwpi> + <thumb>0</thumb> + <SplitLS>0</SplitLS> + <SwStkChk>0</SwStkChk> + <NoWarn>0</NoWarn> + <uSurpInc>0</uSurpInc> + <VariousControls> + <MiscControls></MiscControls> + <Define></Define> + <Undefine></Undefine> + <IncludePath></IncludePath> + </VariousControls> + </Aads> + <LDads> + <umfTarg>1</umfTarg> + <Ropi>0</Ropi> + <Rwpi>0</Rwpi> + <noStLib>0</noStLib> + <RepFail>1</RepFail> + <useFile>0</useFile> + <TextAddressRange>0x00000000</TextAddressRange> + <DataAddressRange>0x00000000</DataAddressRange> + <ScatterFile></ScatterFile> + <IncludeLibs></IncludeLibs> + <IncludeLibsPath></IncludeLibsPath> + <Misc></Misc> + <LinkerInputFile></LinkerInputFile> + <DisabledWarnings></DisabledWarnings> + </LDads> + </TargetArmAds> + </TargetOption> + <Groups> + <Group> + <GroupName>Startup</GroupName> + <Files> + <File> + <FileName>startup_CMSDK_CM0.s</FileName> + <FileType>2</FileType> + <FilePath>..\..\..\..\software\cmsis\Device\ARM\CMSDK_CM0\Source\ARM\startup_CMSDK_CM0.s</FilePath> + </File> + </Files> + </Group> + <Group> + <GroupName>Application</GroupName> + <Files> + <File> + <FileName>default_slaves_tests.c</FileName> + <FileType>1</FileType> + <FilePath>..\..\..\..\software\common\validation\default_slaves_tests.c</FilePath> + </File> + <File> + <FileName>uart_stdout.c</FileName> + <FileType>1</FileType> + <FilePath>..\..\..\..\software\common\retarget\uart_stdout.c</FilePath> + </File> + <File> + <FileName>retarget.c</FileName> + <FileType>1</FileType> + <FilePath>..\..\..\..\software\common\retarget\retarget.c</FilePath> + </File> + </Files> + </Group> + <Group> + <GroupName>System</GroupName> + <Files> + <File> + <FileName>system_CMSDK_CM0.c</FileName> + <FileType>1</FileType> + <FilePath>..\..\..\..\software\cmsis\Device\ARM\CMSDK_CM0\Source\system_CMSDK_CM0.c</FilePath> + </File> + </Files> + </Group> + </Groups> + </Target> + </Targets> + +</Project> diff --git a/Cortex-M0/nanosoc/systems/mcu/testcodes/default_slaves_tests/default_slaves_tests_cm0p.uvopt b/Cortex-M0/nanosoc/systems/mcu/testcodes/default_slaves_tests/default_slaves_tests_cm0p.uvopt new file mode 100644 index 0000000..5b56980 --- /dev/null +++ b/Cortex-M0/nanosoc/systems/mcu/testcodes/default_slaves_tests/default_slaves_tests_cm0p.uvopt @@ -0,0 +1,244 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no" ?> +<ProjectOpt xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="project_opt.xsd"> + + <SchemaVersion>1.0</SchemaVersion> + + <Header>### uVision Project, (C) Keil Software</Header> + + <Extensions> + <cExt>*.c</cExt> + <aExt>*.s*; *.src; *.a*</aExt> + <oExt>*.obj</oExt> + <lExt>*.lib</lExt> + <tExt>*.txt; *.h; *.inc</tExt> + <pExt>*.plm</pExt> + <CppX>*.cpp</CppX> + </Extensions> + + <DaveTm> + <dwLowDateTime>0</dwLowDateTime> + <dwHighDateTime>0</dwHighDateTime> + </DaveTm> + + <Target> + <TargetName>Debug</TargetName> + <ToolsetNumber>0x4</ToolsetNumber> + <ToolsetName>ARM-ADS</ToolsetName> + <TargetOption> + <CLKADS>50000000</CLKADS> + <OPTTT> + <gFlags>1</gFlags> + <BeepAtEnd>1</BeepAtEnd> + <RunSim>1</RunSim> + <RunTarget>0</RunTarget> + </OPTTT> + <OPTHX> + <HexSelection>1</HexSelection> + <FlashByte>65535</FlashByte> + <HexRangeLowAddress>0</HexRangeLowAddress> + <HexRangeHighAddress>0</HexRangeHighAddress> + <HexOffset>0</HexOffset> + </OPTHX> + <OPTLEX> + <PageWidth>79</PageWidth> + <PageLength>66</PageLength> + <TabStop>8</TabStop> + <ListingPath>.\</ListingPath> + </OPTLEX> + <ListingPage> + <CreateCListing>1</CreateCListing> + <CreateAListing>1</CreateAListing> + <CreateLListing>1</CreateLListing> + <CreateIListing>0</CreateIListing> + <AsmCond>1</AsmCond> + <AsmSymb>1</AsmSymb> + <AsmXref>0</AsmXref> + <CCond>1</CCond> + <CCode>0</CCode> + <CListInc>0</CListInc> + <CSymb>0</CSymb> + <LinkerCodeListing>0</LinkerCodeListing> + </ListingPage> + <OPTXL> + <LMap>1</LMap> + <LComments>1</LComments> + <LGenerateSymbols>1</LGenerateSymbols> + <LLibSym>1</LLibSym> + <LLines>1</LLines> + <LLocSym>1</LLocSym> + <LPubSym>1</LPubSym> + <LXref>0</LXref> + <LExpSel>0</LExpSel> + </OPTXL> + <OPTFL> + <tvExp>1</tvExp> + <tvExpOptDlg>0</tvExpOptDlg> + <IsCurrentTarget>1</IsCurrentTarget> + </OPTFL> + <CpuCode>255</CpuCode> + <DllOpt> + <SimDllName>SARMCM3.DLL</SimDllName> + <SimDllArguments></SimDllArguments> + <SimDlgDllName>DARMCM1.DLL</SimDlgDllName> + <SimDlgDllArguments></SimDlgDllArguments> + <TargetDllName>SARMCM3.DLL</TargetDllName> + <TargetDllArguments></TargetDllArguments> + <TargetDlgDllName>TARMCM1.DLL</TargetDlgDllName> + <TargetDlgDllArguments></TargetDlgDllArguments> + </DllOpt> + <DebugOpt> + <uSim>1</uSim> + <uTrg>0</uTrg> + <sLdApp>1</sLdApp> + <sGomain>1</sGomain> + <sRbreak>1</sRbreak> + <sRwatch>1</sRwatch> + <sRmem>1</sRmem> + <sRfunc>1</sRfunc> + <sRbox>1</sRbox> + <tLdApp>1</tLdApp> + <tGomain>0</tGomain> + <tRbreak>1</tRbreak> + <tRwatch>1</tRwatch> + <tRmem>1</tRmem> + <tRfunc>0</tRfunc> + <tRbox>1</tRbox> + <sRunDeb>0</sRunDeb> + <sLrtime>0</sLrtime> + <nTsel>-1</nTsel> + <sDll></sDll> + <sDllPa></sDllPa> + <sDlgDll></sDlgDll> + <sDlgPa></sDlgPa> + <sIfile></sIfile> + <tDll></tDll> + <tDllPa></tDllPa> + <tDlgDll></tDlgDll> + <tDlgPa></tDlgPa> + <tIfile></tIfile> + <pMon></pMon> + </DebugOpt> + <Breakpoint/> + <DebugFlag> + <trace>0</trace> + <periodic>1</periodic> + <aLwin>0</aLwin> + <aCover>0</aCover> + <aSer1>0</aSer1> + <aSer2>0</aSer2> + <aPa>0</aPa> + <viewmode>0</viewmode> + <vrSel>0</vrSel> + <aSym>0</aSym> + <aTbox>0</aTbox> + <AscS1>0</AscS1> + <AscS2>0</AscS2> + <AscS3>0</AscS3> + <aSer3>0</aSer3> + <eProf>0</eProf> + <aLa>0</aLa> + <aPa1>0</aPa1> + <AscS4>0</AscS4> + <aSer4>0</aSer4> + <StkLoc>0</StkLoc> + <TrcWin>0</TrcWin> + <newCpu>0</newCpu> + <uProt>0</uProt> + </DebugFlag> + <LintExecutable></LintExecutable> + <LintConfigFile></LintConfigFile> + </TargetOption> + </Target> + + <Group> + <GroupName>Startup</GroupName> + <tvExp>1</tvExp> + <tvExpOptDlg>0</tvExpOptDlg> + <cbSel>0</cbSel> + <File> + <GroupNumber>1</GroupNumber> + <FileNumber>1</FileNumber> + <FileType>2</FileType> + <tvExp>0</tvExp> + <Focus>0</Focus> + <ColumnNumber>0</ColumnNumber> + <tvExpOptDlg>0</tvExpOptDlg> + <TopLine>0</TopLine> + <CurrentLine>0</CurrentLine> + <bDave2>0</bDave2> + <PathWithFileName>..\..\..\..\software\cmsis\Device\ARM\CMSDK_CM0plus\Source\ARM\startup_CMSDK_CM0plus.s</PathWithFileName> + <FilenameWithoutPath>startup_CMSDK_CM0plus.s</FilenameWithoutPath> + </File> + </Group> + + <Group> + <GroupName>Application</GroupName> + <tvExp>1</tvExp> + <tvExpOptDlg>0</tvExpOptDlg> + <cbSel>0</cbSel> + <File> + <GroupNumber>2</GroupNumber> + <FileNumber>2</FileNumber> + <FileType>1</FileType> + <tvExp>0</tvExp> + <Focus>0</Focus> + <ColumnNumber>0</ColumnNumber> + <tvExpOptDlg>0</tvExpOptDlg> + <TopLine>0</TopLine> + <CurrentLine>0</CurrentLine> + <bDave2>0</bDave2> + <PathWithFileName>..\..\..\..\software\common\validation\default_slaves_tests.c</PathWithFileName> + <FilenameWithoutPath>default_slaves_tests.c</FilenameWithoutPath> + </File> + <File> + <GroupNumber>2</GroupNumber> + <FileNumber>3</FileNumber> + <FileType>1</FileType> + <tvExp>0</tvExp> + <Focus>0</Focus> + <ColumnNumber>0</ColumnNumber> + <tvExpOptDlg>0</tvExpOptDlg> + <TopLine>0</TopLine> + <CurrentLine>0</CurrentLine> + <bDave2>0</bDave2> + <PathWithFileName>..\..\..\..\software\common\retarget\uart_stdout.c</PathWithFileName> + <FilenameWithoutPath>uart_stdout.c</FilenameWithoutPath> + </File> + <File> + <GroupNumber>2</GroupNumber> + <FileNumber>4</FileNumber> + <FileType>1</FileType> + <tvExp>0</tvExp> + <Focus>0</Focus> + <ColumnNumber>0</ColumnNumber> + <tvExpOptDlg>0</tvExpOptDlg> + <TopLine>0</TopLine> + <CurrentLine>0</CurrentLine> + <bDave2>0</bDave2> + <PathWithFileName>..\..\..\..\software\common\retarget\retarget.c</PathWithFileName> + <FilenameWithoutPath>retarget.c</FilenameWithoutPath> + </File> + </Group> + + <Group> + <GroupName>System</GroupName> + <tvExp>1</tvExp> + <tvExpOptDlg>0</tvExpOptDlg> + <cbSel>0</cbSel> + <File> + <GroupNumber>3</GroupNumber> + <FileNumber>5</FileNumber> + <FileType>1</FileType> + <tvExp>0</tvExp> + <Focus>0</Focus> + <ColumnNumber>0</ColumnNumber> + <tvExpOptDlg>0</tvExpOptDlg> + <TopLine>0</TopLine> + <CurrentLine>0</CurrentLine> + <bDave2>0</bDave2> + <PathWithFileName>..\..\..\..\software\cmsis\Device\ARM\CMSDK_CM0plus\Source\system_CMSDK_CM0plus.c</PathWithFileName> + <FilenameWithoutPath>system_CMSDK_CM0plus.c</FilenameWithoutPath> + </File> + </Group> + +</ProjectOpt> diff --git a/Cortex-M0/nanosoc/systems/mcu/testcodes/default_slaves_tests/default_slaves_tests_cm0p.uvproj b/Cortex-M0/nanosoc/systems/mcu/testcodes/default_slaves_tests/default_slaves_tests_cm0p.uvproj new file mode 100644 index 0000000..9b1eb99 --- /dev/null +++ b/Cortex-M0/nanosoc/systems/mcu/testcodes/default_slaves_tests/default_slaves_tests_cm0p.uvproj @@ -0,0 +1,432 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no" ?> +<Project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="project_proj.xsd"> + + <SchemaVersion>1.1</SchemaVersion> + + <Header>### uVision Project, (C) Keil Software</Header> + + <Targets> + <Target> + <TargetName>Debug</TargetName> + <ToolsetNumber>0x4</ToolsetNumber> + <ToolsetName>ARM-ADS</ToolsetName> + <TargetOption> + <TargetCommonOption> + <Device>Cortex-M0+</Device> + <Vendor>ARM</Vendor> + <Cpu>CLOCK(12000000) CPUTYPE("Cortex-M0+") ESEL ELITTLE</Cpu> + <FlashUtilSpec></FlashUtilSpec> + <StartupFile></StartupFile> + <FlashDriverDll></FlashDriverDll> + <DeviceId>6268</DeviceId> + <RegisterFile></RegisterFile> + <MemoryEnv></MemoryEnv> + <Cmp></Cmp> + <Asm></Asm> + <Linker></Linker> + <OHString></OHString> + <InfinionOptionDll></InfinionOptionDll> + <SLE66CMisc></SLE66CMisc> + <SLE66AMisc></SLE66AMisc> + <SLE66LinkerMisc></SLE66LinkerMisc> + <SFDFile></SFDFile> + <UseEnv>0</UseEnv> + <BinPath></BinPath> + <IncludePath></IncludePath> + <LibPath></LibPath> + <RegisterFilePath></RegisterFilePath> + <DBRegisterFilePath></DBRegisterFilePath> + <TargetStatus> + <Error>0</Error> + <ExitCodeStop>0</ExitCodeStop> + <ButtonStop>0</ButtonStop> + <NotGenerated>0</NotGenerated> + <InvalidFlash>1</InvalidFlash> + </TargetStatus> + <OutputDirectory>.\</OutputDirectory> + <OutputName>default_slaves_tests</OutputName> + <CreateExecutable>1</CreateExecutable> + <CreateLib>0</CreateLib> + <CreateHexFile>0</CreateHexFile> + <DebugInformation>1</DebugInformation> + <BrowseInformation>1</BrowseInformation> + <ListingPath>.\</ListingPath> + <HexFormatSelection>1</HexFormatSelection> + <Merge32K>0</Merge32K> + <CreateBatchFile>0</CreateBatchFile> + <BeforeCompile> + <RunUserProg1>0</RunUserProg1> + <RunUserProg2>0</RunUserProg2> + <UserProg1Name></UserProg1Name> + <UserProg2Name></UserProg2Name> + <UserProg1Dos16Mode>0</UserProg1Dos16Mode> + <UserProg2Dos16Mode>0</UserProg2Dos16Mode> + <nStopU1X>0</nStopU1X> + <nStopU2X>0</nStopU2X> + </BeforeCompile> + <BeforeMake> + <RunUserProg1>0</RunUserProg1> + <RunUserProg2>0</RunUserProg2> + <UserProg1Name></UserProg1Name> + <UserProg2Name></UserProg2Name> + <UserProg1Dos16Mode>0</UserProg1Dos16Mode> + <UserProg2Dos16Mode>0</UserProg2Dos16Mode> + </BeforeMake> + <AfterMake> + <RunUserProg1>1</RunUserProg1> + <RunUserProg2>0</RunUserProg2> + <UserProg1Name>$K\ARM\ARMCC\BIN\fromelf.exe #L --vhx --8x1 --output default_slaves_tests.hex</UserProg1Name> + <UserProg2Name></UserProg2Name> + <UserProg1Dos16Mode>0</UserProg1Dos16Mode> + <UserProg2Dos16Mode>0</UserProg2Dos16Mode> + </AfterMake> + <SelectedForBatchBuild>0</SelectedForBatchBuild> + <SVCSIdString></SVCSIdString> + </TargetCommonOption> + <CommonProperty> + <UseCPPCompiler>0</UseCPPCompiler> + <RVCTCodeConst>0</RVCTCodeConst> + <RVCTZI>0</RVCTZI> + <RVCTOtherData>0</RVCTOtherData> + <ModuleSelection>0</ModuleSelection> + <IncludeInBuild>1</IncludeInBuild> + <AlwaysBuild>0</AlwaysBuild> + <GenerateAssemblyFile>0</GenerateAssemblyFile> + <AssembleAssemblyFile>0</AssembleAssemblyFile> + <PublicsOnly>0</PublicsOnly> + <StopOnExitCode>3</StopOnExitCode> + <CustomArgument></CustomArgument> + <IncludeLibraryModules></IncludeLibraryModules> + </CommonProperty> + <DllOption> + <SimDllName>SARMCM3.DLL</SimDllName> + <SimDllArguments></SimDllArguments> + <SimDlgDll>DARMCM1.DLL</SimDlgDll> + <SimDlgDllArguments></SimDlgDllArguments> + <TargetDllName>SARMCM3.DLL</TargetDllName> + <TargetDllArguments></TargetDllArguments> + <TargetDlgDll>TARMCM1.DLL</TargetDlgDll> + <TargetDlgDllArguments></TargetDlgDllArguments> + </DllOption> + <DebugOption> + <OPTHX> + <HexSelection>1</HexSelection> + <HexRangeLowAddress>0</HexRangeLowAddress> + <HexRangeHighAddress>0</HexRangeHighAddress> + <HexOffset>0</HexOffset> + <Oh166RecLen>16</Oh166RecLen> + </OPTHX> + <Simulator> + <UseSimulator>1</UseSimulator> + <LoadApplicationAtStartup>1</LoadApplicationAtStartup> + <RunToMain>1</RunToMain> + <RestoreBreakpoints>1</RestoreBreakpoints> + <RestoreWatchpoints>1</RestoreWatchpoints> + <RestoreMemoryDisplay>1</RestoreMemoryDisplay> + <RestoreFunctions>1</RestoreFunctions> + <RestoreToolbox>1</RestoreToolbox> + <LimitSpeedToRealTime>0</LimitSpeedToRealTime> + </Simulator> + <Target> + <UseTarget>0</UseTarget> + <LoadApplicationAtStartup>1</LoadApplicationAtStartup> + <RunToMain>0</RunToMain> + <RestoreBreakpoints>1</RestoreBreakpoints> + <RestoreWatchpoints>1</RestoreWatchpoints> + <RestoreMemoryDisplay>1</RestoreMemoryDisplay> + <RestoreFunctions>0</RestoreFunctions> + <RestoreToolbox>1</RestoreToolbox> + </Target> + <RunDebugAfterBuild>0</RunDebugAfterBuild> + <TargetSelection>-1</TargetSelection> + <SimDlls> + <CpuDll></CpuDll> + <CpuDllArguments></CpuDllArguments> + <PeripheralDll></PeripheralDll> + <PeripheralDllArguments></PeripheralDllArguments> + <InitializationFile></InitializationFile> + </SimDlls> + <TargetDlls> + <CpuDll></CpuDll> + <CpuDllArguments></CpuDllArguments> + <PeripheralDll></PeripheralDll> + <PeripheralDllArguments></PeripheralDllArguments> + <InitializationFile></InitializationFile> + <Driver></Driver> + </TargetDlls> + </DebugOption> + <Utilities> + <Flash1> + <UseTargetDll>0</UseTargetDll> + <UseExternalTool>0</UseExternalTool> + <RunIndependent>0</RunIndependent> + <UpdateFlashBeforeDebugging>0</UpdateFlashBeforeDebugging> + <Capability>0</Capability> + <DriverSelection>-1</DriverSelection> + </Flash1> + <Flash2></Flash2> + <Flash3></Flash3> + <Flash4></Flash4> + </Utilities> + <TargetArmAds> + <ArmAdsMisc> + <GenerateListings>0</GenerateListings> + <asHll>1</asHll> + <asAsm>1</asAsm> + <asMacX>1</asMacX> + <asSyms>1</asSyms> + <asFals>1</asFals> + <asDbgD>1</asDbgD> + <asForm>1</asForm> + <ldLst>0</ldLst> + <ldmm>1</ldmm> + <ldXref>1</ldXref> + <BigEnd>0</BigEnd> + <AdsALst>1</AdsALst> + <AdsACrf>1</AdsACrf> + <AdsANop>0</AdsANop> + <AdsANot>0</AdsANot> + <AdsLLst>1</AdsLLst> + <AdsLmap>1</AdsLmap> + <AdsLcgr>1</AdsLcgr> + <AdsLsym>1</AdsLsym> + <AdsLszi>1</AdsLszi> + <AdsLtoi>1</AdsLtoi> + <AdsLsun>1</AdsLsun> + <AdsLven>1</AdsLven> + <AdsLsxf>1</AdsLsxf> + <RvctClst>0</RvctClst> + <GenPPlst>0</GenPPlst> + <AdsCpuType>"Cortex-M0+"</AdsCpuType> + <RvctDeviceName></RvctDeviceName> + <mOS>0</mOS> + <uocRom>0</uocRom> + <uocRam>0</uocRam> + <hadIROM>0</hadIROM> + <hadIRAM>0</hadIRAM> + <hadXRAM>0</hadXRAM> + <uocXRam>0</uocXRam> + <RvdsVP>0</RvdsVP> + <hadIRAM2>0</hadIRAM2> + <hadIROM2>0</hadIROM2> + <StupSel>1</StupSel> + <useUlib>0</useUlib> + <EndSel>1</EndSel> + <uLtcg>0</uLtcg> + <RoSelD>0</RoSelD> + <RwSelD>5</RwSelD> + <CodeSel>0</CodeSel> + <OptFeed>0</OptFeed> + <NoZi1>0</NoZi1> + <NoZi2>0</NoZi2> + <NoZi3>0</NoZi3> + <NoZi4>0</NoZi4> + <NoZi5>0</NoZi5> + <Ro1Chk>1</Ro1Chk> + <Ro2Chk>0</Ro2Chk> + <Ro3Chk>0</Ro3Chk> + <Ir1Chk>0</Ir1Chk> + <Ir2Chk>0</Ir2Chk> + <Ra1Chk>1</Ra1Chk> + <Ra2Chk>0</Ra2Chk> + <Ra3Chk>0</Ra3Chk> + <Im1Chk>0</Im1Chk> + <Im2Chk>0</Im2Chk> + <OnChipMemories> + <Ocm1> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </Ocm1> + <Ocm2> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </Ocm2> + <Ocm3> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </Ocm3> + <Ocm4> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </Ocm4> + <Ocm5> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </Ocm5> + <Ocm6> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </Ocm6> + <IRAM> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </IRAM> + <IROM> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </IROM> + <XRAM> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </XRAM> + <OCR_RVCT1> + <Type>1</Type> + <StartAddress>0x0</StartAddress> + <Size>0x10000</Size> + </OCR_RVCT1> + <OCR_RVCT2> + <Type>1</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </OCR_RVCT2> + <OCR_RVCT3> + <Type>1</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </OCR_RVCT3> + <OCR_RVCT4> + <Type>1</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </OCR_RVCT4> + <OCR_RVCT5> + <Type>1</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </OCR_RVCT5> + <OCR_RVCT6> + <Type>0</Type> + <StartAddress>0x20000000</StartAddress> + <Size>0x10000</Size> + </OCR_RVCT6> + <OCR_RVCT7> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </OCR_RVCT7> + <OCR_RVCT8> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </OCR_RVCT8> + <OCR_RVCT9> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </OCR_RVCT9> + <OCR_RVCT10> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </OCR_RVCT10> + </OnChipMemories> + <RvctStartVector></RvctStartVector> + </ArmAdsMisc> + <Cads> + <interw>1</interw> + <Optim>3</Optim> + <oTime>0</oTime> + <SplitLS>0</SplitLS> + <OneElfS>0</OneElfS> + <Strict>0</Strict> + <EnumInt>0</EnumInt> + <PlainCh>0</PlainCh> + <Ropi>0</Ropi> + <Rwpi>0</Rwpi> + <wLevel>0</wLevel> + <uThumb>0</uThumb> + <VariousControls> + <MiscControls></MiscControls> + <Define>CORTEX_M0PLUS</Define> + <Undefine></Undefine> + <IncludePath>..\..\..\..\software\cmsis\CMSIS\Include; ..\..\..\..\software\cmsis\Device\ARM\CMSDK_CM0plus\Include; ..\..\..\..\software\common\retarget</IncludePath> + </VariousControls> + </Cads> + <Aads> + <interw>1</interw> + <Ropi>0</Ropi> + <Rwpi>0</Rwpi> + <thumb>0</thumb> + <SplitLS>0</SplitLS> + <SwStkChk>0</SwStkChk> + <NoWarn>0</NoWarn> + <VariousControls> + <MiscControls></MiscControls> + <Define></Define> + <Undefine></Undefine> + <IncludePath></IncludePath> + </VariousControls> + </Aads> + <LDads> + <umfTarg>1</umfTarg> + <Ropi>0</Ropi> + <Rwpi>0</Rwpi> + <noStLib>0</noStLib> + <RepFail>1</RepFail> + <useFile>0</useFile> + <TextAddressRange>0x00000000</TextAddressRange> + <DataAddressRange>0x00000000</DataAddressRange> + <ScatterFile></ScatterFile> + <IncludeLibs></IncludeLibs> + <IncludeLibsPath></IncludeLibsPath> + <Misc></Misc> + <LinkerInputFile></LinkerInputFile> + <DisabledWarnings></DisabledWarnings> + </LDads> + </TargetArmAds> + </TargetOption> + <Groups> + <Group> + <GroupName>Startup</GroupName> + <Files> + <File> + <FileName>startup_CMSDK_CM0plus.s</FileName> + <FileType>2</FileType> + <FilePath>..\..\..\..\software\cmsis\Device\ARM\CMSDK_CM0plus\Source\ARM\startup_CMSDK_CM0plus.s</FilePath> + </File> + </Files> + </Group> + <Group> + <GroupName>Application</GroupName> + <Files> + <File> + <FileName>default_slaves_tests.c</FileName> + <FileType>1</FileType> + <FilePath>..\..\..\..\software\common\validation\default_slaves_tests.c</FilePath> + </File> + <File> + <FileName>uart_stdout.c</FileName> + <FileType>1</FileType> + <FilePath>..\..\..\..\software\common\retarget\uart_stdout.c</FilePath> + </File> + <File> + <FileName>retarget.c</FileName> + <FileType>1</FileType> + <FilePath>..\..\..\..\software\common\retarget\retarget.c</FilePath> + </File> + </Files> + </Group> + <Group> + <GroupName>System</GroupName> + <Files> + <File> + <FileName>system_CMSDK_CM0plus.c</FileName> + <FileType>1</FileType> + <FilePath>..\..\..\..\software\cmsis\Device\ARM\CMSDK_CM0plus\Source\system_CMSDK_CM0plus.c</FilePath> + </File> + </Files> + </Group> + </Groups> + </Target> + </Targets> + +</Project> diff --git a/Cortex-M0/nanosoc/systems/mcu/testcodes/default_slaves_tests/makefile b/Cortex-M0/nanosoc/systems/mcu/testcodes/default_slaves_tests/makefile new file mode 100644 index 0000000..2437c5c --- /dev/null +++ b/Cortex-M0/nanosoc/systems/mcu/testcodes/default_slaves_tests/makefile @@ -0,0 +1,251 @@ +#----------------------------------------------------------------------------- +# The confidential and proprietary information contained in this file may +# only be used by a person authorised under and to the extent permitted +# by a subsisting licensing agreement from Arm Limited or its affiliates. +# +# (C) COPYRIGHT 2010-2013 Arm Limited or its affiliates. +# ALL RIGHTS RESERVED +# +# This entire notice must be reproduced on all copies of this file +# and copies of this file may only be made by a person if such person is +# permitted to do so under the terms of a subsisting license agreement +# from Arm Limited or its affiliates. +# +# SVN Information +# +# Checked In : $Date: 2017-10-10 15:55:38 +0100 (Tue, 10 Oct 2017) $ +# +# Revision : $Revision: 371321 $ +# +# Release Information : Cortex-M System Design Kit-r1p1-00rel0 +#----------------------------------------------------------------------------- +# +# Cortex-M System Design Kit software compilation make file +# +#----------------------------------------------------------------------------- +# +# Configurations +# +# - CORTEX_M0 +# - CORTEX_M0PLUS +CPU_PRODUCT = CORTEX_M0PLUS + +# Shared software directory +# Shared software directory +SOFTWARE_DIR = ../../../../software +CMSIS_DIR = $(SOFTWARE_DIR)/cmsis +CORE_DIR = $(CMSIS_DIR)/CMSIS/Include + +ifeq ($(CPU_PRODUCT),CORTEX_M0PLUS) + DEVICE_DIR = $(CMSIS_DIR)/Device/ARM/CMSDK_CM0plus +else + DEVICE_DIR = $(CMSIS_DIR)/Device/ARM/CMSDK_CM0 +endif + +# Program file +TESTNAME = default_slaves_tests + +# Endian Option +COMPILE_BIGEND = 0 + + +# Configuration +ifeq ($(CPU_PRODUCT),CORTEX_M0PLUS) + USER_DEFINE = -DCORTEX_M0PLUS +else + USER_DEFINE = -DCORTEX_M0 +endif + +DEPS_LIST = makefile + +# Tool chain : ds5 / gcc / keil +TOOL_CHAIN = ds5 + +ifeq ($(TOOL_CHAIN),ds5) + ifeq ($(CPU_PRODUCT),CORTEX_M0PLUS) + CPU_TYPE = --cpu Cortex-M0plus + else + CPU_TYPE = --cpu Cortex-M0 + endif +endif + +ifeq ($(TOOL_CHAIN),gcc) + ifeq ($(CPU_PRODUCT),CORTEX_M0PLUS) + CPU_TYPE = -mcpu=cortex-m0plus + else + CPU_TYPE = -mcpu=cortex-m0 + endif +endif + +# Startup code directory for DS-5 +ifeq ($(TOOL_CHAIN),ds5) + STARTUP_DIR = $(DEVICE_DIR)/Source/ARM +endif + +# Startup code directory for gcc +ifeq ($(TOOL_CHAIN),gcc) + STARTUP_DIR = $(DEVICE_DIR)/Source/GCC +endif + +ifeq ($(CPU_PRODUCT),CORTEX_M0PLUS) + STARTUP_FILE = startup_CMSDK_CM0plus + SYSTEM_FILE = system_CMSDK_CM0plus +else + STARTUP_FILE = startup_CMSDK_CM0 + SYSTEM_FILE = system_CMSDK_CM0 +endif + +# --------------------------------------------------------------------------------------- +# DS-5 options + +# MicroLIB option +COMPILE_MICROLIB = 0 + +# Small Multiply (Cortex-M0/M0+ has small multiplier option) +COMPILE_SMALLMUL = 0 + +ARM_CC_OPTIONS = -c -O3 -g -Otime $(USER_DEFINE) \ + -I $(DEVICE_DIR)/Include -I $(CORE_DIR) -I $(SOFTWARE_DIR)/common/retarget +ARM_ASM_OPTIONS = -g +ARM_LINK_OPTIONS = "--keep=$(STARTUP_FILE).o(RESET)" "--first=$(STARTUP_FILE).o(RESET)" \ + --rw_base 0x30000000 --ro_base 0x00000000 --map + +ifeq ($(COMPILE_BIGEND),1) + # Big Endian + ARM_CC_OPTIONS += --bigend + ARM_ASM_OPTIONS += --bigend + ARM_LINK_OPTIONS += --be8 +endif + +ifeq ($(COMPILE_MICROLIB),1) + # MicroLIB + ARM_CC_OPTIONS += --library_type=microlib + ARM_ASM_OPTIONS += --library_type=microlib --pd "__MICROLIB SETA 1" + ARM_LINK_OPTIONS += --library_type=microlib +endif + +ifeq ($(COMPILE_SMALLMUL),1) + # In Cortex-M0, small multiply takes 32 cycles + ARM_CC_OPTIONS += --multiply_latency=32 +endif + +# --------------------------------------------------------------------------------------- +# gcc options + +GNG_CC = arm-none-eabi-gcc +GNU_OBJDUMP = arm-none-eabi-objdump +GNU_OBJCOPY = arm-none-eabi-objcopy + +LINKER_SCRIPT_PATH = $(SOFTWARE_DIR)/common/scripts +LINKER_SCRIPT = $(LINKER_SCRIPT_PATH)/cmsdk_cm0.ld + +GNU_CC_FLAGS = -g -O3 -mthumb $(CPU_TYPE) + +ifeq ($(COMPILE_BIGEND),1) + # Big Endian + GNU_CC_FLAGS += -mbig-endian +endif + +# --------------------------------------------------------------------------------------- +all: all_$(TOOL_CHAIN) + +# --------------------------------------------------------------------------------------- +# DS-5 + +all_ds5 : $(TESTNAME).hex $(TESTNAME).lst + +$(TESTNAME).o : $(SOFTWARE_DIR)/common/validation/$(TESTNAME).c $(DEPS_LIST) + armcc $(ARM_CC_OPTIONS) $(CPU_TYPE) $< -o $@ + +$(SYSTEM_FILE).o : $(DEVICE_DIR)/Source/$(SYSTEM_FILE).c $(DEPS_LIST) + armcc $(ARM_CC_OPTIONS) $(CPU_TYPE) $< -o $@ + +retarget.o : $(SOFTWARE_DIR)/common/retarget/retarget.c $(DEPS_LIST) + armcc $(ARM_CC_OPTIONS) $(CPU_TYPE) $< -o $@ + +uart_stdout.o : $(SOFTWARE_DIR)/common/retarget/uart_stdout.c $(DEPS_LIST) + armcc $(ARM_CC_OPTIONS) $(CPU_TYPE) $< -o $@ + +$(STARTUP_FILE).o : $(STARTUP_DIR)/$(STARTUP_FILE).s $(DEPS_LIST) + armasm $(ARM_ASM_OPTIONS) $(CPU_TYPE) $< -o $@ + +$(TESTNAME).ELF : $(TESTNAME).o $(SYSTEM_FILE).o $(STARTUP_FILE).o retarget.o uart_stdout.o + armlink $(ARM_LINK_OPTIONS) -o $@ $(TESTNAME).o $(SYSTEM_FILE).o $(STARTUP_FILE).o retarget.o uart_stdout.o + +$(TESTNAME).hex : $(TESTNAME).ELF + fromelf --vhx --8x1 $< --output $@ + +$(TESTNAME).lst : $(TESTNAME).ELF makefile + fromelf -c -d -e -s $< --output $@ + +# --------------------------------------------------------------------------------------- +# gcc +all_gcc: + $(GNG_CC) $(GNU_CC_FLAGS) $(STARTUP_DIR)/$(STARTUP_FILE).s \ + $(SOFTWARE_DIR)/common/validation/$(TESTNAME).c \ + $(SOFTWARE_DIR)/common/retarget/retarget.c \ + $(SOFTWARE_DIR)/common/retarget/uart_stdout.c \ + $(DEVICE_DIR)/Source/$(SYSTEM_FILE).c \ + -I $(DEVICE_DIR)/Include -I $(CORE_DIR) \ + -I $(SOFTWARE_DIR)/common/retarget \ + -L $(LINKER_SCRIPT_PATH) \ + -D__STACK_SIZE=0x200 \ + -D__HEAP_SIZE=0x1000 \ + $(USER_DEFINE) -T $(LINKER_SCRIPT) -o $(TESTNAME).o + # Generate disassembly code + $(GNU_OBJDUMP) -S $(TESTNAME).o > $(TESTNAME).lst + # Generate binary file + $(GNU_OBJCOPY) -S $(TESTNAME).o -O binary $(TESTNAME).bin + # Generate hex file + $(GNU_OBJCOPY) -S $(TESTNAME).o -O verilog $(TESTNAME).hex + +# Note: +# If the version of object copy you are using does not support verilog hex file output, +# you can generate the hex file from binary file using the following command +# od -v -A n -t x1 --width=1 $(TESTNAME).bin > $(TESTNAME).hex + +# --------------------------------------------------------------------------------------- +# Keil MDK + +all_keil: + @echo "Please compile your project code and press ENTER when ready" + @read dummy + +# --------------------------------------------------------------------------------------- +# Binary + +all_bin: $(TESTNAME).bin + # Generate hex file from binary + od -v -A n -t x1 --width=1 $(TESTNAME).bin > $(TESTNAME).hex + +# --------------------------------------------------------------------------------------- +# Clean + +clean : + @rm -rf *.o + @if [ -e $(TESTNAME).hex ] ; then \ + rm -rf $(TESTNAME).hex ; \ + fi + @if [ -e $(TESTNAME).lst ] ; then \ + rm -rf $(TESTNAME).lst ; \ + fi + @if [ -e $(TESTNAME).ELF ] ; then \ + rm -rf $(TESTNAME).ELF ; \ + fi + @if [ -e $(TESTNAME).bin ] ; then \ + rm -rf $(TESTNAME).bin ; \ + fi + @rm -rf *.crf + @rm -rf *.plg + @rm -rf *.tra + @rm -rf *.htm + @rm -rf *.map + @rm -rf *.dep + @rm -rf *.d + @rm -rf *.lnp + @rm -rf *.bak + @rm -rf *.lst + @rm -rf *.axf + @rm -rf *.sct + @rm -rf *.__i + @rm -rf *._ia diff --git a/Cortex-M0/nanosoc/systems/mcu/testcodes/dhry/dhry_cm0.uvopt b/Cortex-M0/nanosoc/systems/mcu/testcodes/dhry/dhry_cm0.uvopt new file mode 100644 index 0000000..41e4c6c --- /dev/null +++ b/Cortex-M0/nanosoc/systems/mcu/testcodes/dhry/dhry_cm0.uvopt @@ -0,0 +1,277 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no" ?> +<ProjectOpt xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="project_opt.xsd"> + + <SchemaVersion>1.0</SchemaVersion> + + <Header>### uVision Project, (C) Keil Software</Header> + + <Extensions> + <cExt>*.c</cExt> + <aExt>*.s*; *.src; *.a*</aExt> + <oExt>*.obj</oExt> + <lExt>*.lib</lExt> + <tExt>*.txt; *.h; *.inc</tExt> + <pExt>*.plm</pExt> + <CppX>*.cpp</CppX> + </Extensions> + + <DaveTm> + <dwLowDateTime>0</dwLowDateTime> + <dwHighDateTime>0</dwHighDateTime> + </DaveTm> + + <Target> + <TargetName>Debug</TargetName> + <ToolsetNumber>0x4</ToolsetNumber> + <ToolsetName>ARM-ADS</ToolsetName> + <TargetOption> + <CLKADS>50000000</CLKADS> + <OPTTT> + <gFlags>1</gFlags> + <BeepAtEnd>1</BeepAtEnd> + <RunSim>1</RunSim> + <RunTarget>0</RunTarget> + </OPTTT> + <OPTHX> + <HexSelection>1</HexSelection> + <FlashByte>65535</FlashByte> + <HexRangeLowAddress>0</HexRangeLowAddress> + <HexRangeHighAddress>0</HexRangeHighAddress> + <HexOffset>0</HexOffset> + </OPTHX> + <OPTLEX> + <PageWidth>79</PageWidth> + <PageLength>66</PageLength> + <TabStop>8</TabStop> + <ListingPath>.\</ListingPath> + </OPTLEX> + <ListingPage> + <CreateCListing>1</CreateCListing> + <CreateAListing>1</CreateAListing> + <CreateLListing>1</CreateLListing> + <CreateIListing>0</CreateIListing> + <AsmCond>1</AsmCond> + <AsmSymb>1</AsmSymb> + <AsmXref>0</AsmXref> + <CCond>1</CCond> + <CCode>0</CCode> + <CListInc>0</CListInc> + <CSymb>0</CSymb> + <LinkerCodeListing>0</LinkerCodeListing> + </ListingPage> + <OPTXL> + <LMap>1</LMap> + <LComments>1</LComments> + <LGenerateSymbols>1</LGenerateSymbols> + <LLibSym>1</LLibSym> + <LLines>1</LLines> + <LLocSym>1</LLocSym> + <LPubSym>1</LPubSym> + <LXref>0</LXref> + <LExpSel>0</LExpSel> + </OPTXL> + <OPTFL> + <tvExp>1</tvExp> + <tvExpOptDlg>0</tvExpOptDlg> + <IsCurrentTarget>1</IsCurrentTarget> + </OPTFL> + <CpuCode>255</CpuCode> + <DllOpt> + <SimDllName>SARMCM3.DLL</SimDllName> + <SimDllArguments></SimDllArguments> + <SimDlgDllName>DARMCM1.DLL</SimDlgDllName> + <SimDlgDllArguments></SimDlgDllArguments> + <TargetDllName>SARMCM3.DLL</TargetDllName> + <TargetDllArguments></TargetDllArguments> + <TargetDlgDllName>TARMCM1.DLL</TargetDlgDllName> + <TargetDlgDllArguments></TargetDlgDllArguments> + </DllOpt> + <DebugOpt> + <uSim>1</uSim> + <uTrg>0</uTrg> + <sLdApp>1</sLdApp> + <sGomain>1</sGomain> + <sRbreak>1</sRbreak> + <sRwatch>1</sRwatch> + <sRmem>1</sRmem> + <sRfunc>1</sRfunc> + <sRbox>1</sRbox> + <tLdApp>1</tLdApp> + <tGomain>0</tGomain> + <tRbreak>1</tRbreak> + <tRwatch>1</tRwatch> + <tRmem>1</tRmem> + <tRfunc>0</tRfunc> + <tRbox>1</tRbox> + <tRtrace>0</tRtrace> + <sRunDeb>0</sRunDeb> + <sLrtime>0</sLrtime> + <nTsel>-1</nTsel> + <sDll></sDll> + <sDllPa></sDllPa> + <sDlgDll></sDlgDll> + <sDlgPa></sDlgPa> + <sIfile></sIfile> + <tDll></tDll> + <tDllPa></tDllPa> + <tDlgDll></tDlgDll> + <tDlgPa></tDlgPa> + <tIfile></tIfile> + <pMon></pMon> + </DebugOpt> + <Breakpoint/> + <DebugFlag> + <trace>0</trace> + <periodic>1</periodic> + <aLwin>0</aLwin> + <aCover>0</aCover> + <aSer1>0</aSer1> + <aSer2>0</aSer2> + <aPa>0</aPa> + <viewmode>0</viewmode> + <vrSel>0</vrSel> + <aSym>0</aSym> + <aTbox>0</aTbox> + <AscS1>0</AscS1> + <AscS2>0</AscS2> + <AscS3>0</AscS3> + <aSer3>0</aSer3> + <eProf>0</eProf> + <aLa>0</aLa> + <aPa1>0</aPa1> + <AscS4>0</AscS4> + <aSer4>0</aSer4> + <StkLoc>0</StkLoc> + <TrcWin>0</TrcWin> + <newCpu>0</newCpu> + <uProt>0</uProt> + </DebugFlag> + <Tracepoint> + <THDelay>0</THDelay> + </Tracepoint> + <LintExecutable></LintExecutable> + <LintConfigFile></LintConfigFile> + </TargetOption> + </Target> + + <Group> + <GroupName>Startup</GroupName> + <tvExp>1</tvExp> + <tvExpOptDlg>0</tvExpOptDlg> + <cbSel>0</cbSel> + <RteFlg>0</RteFlg> + <File> + <GroupNumber>1</GroupNumber> + <FileNumber>1</FileNumber> + <FileType>2</FileType> + <tvExp>0</tvExp> + <Focus>0</Focus> + <ColumnNumber>0</ColumnNumber> + <tvExpOptDlg>0</tvExpOptDlg> + <TopLine>0</TopLine> + <CurrentLine>0</CurrentLine> + <bDave2>0</bDave2> + <PathWithFileName>..\..\..\..\software\cmsis\Device\ARM\CMSDK_CM0\Source\ARM\startup_CMSDK_CM0.s</PathWithFileName> + <FilenameWithoutPath>startup_CMSDK_CM0.s</FilenameWithoutPath> + <RteFlg>0</RteFlg> + <bShared>0</bShared> + </File> + </Group> + + <Group> + <GroupName>Application</GroupName> + <tvExp>1</tvExp> + <tvExpOptDlg>0</tvExpOptDlg> + <cbSel>0</cbSel> + <RteFlg>0</RteFlg> + <File> + <GroupNumber>2</GroupNumber> + <FileNumber>2</FileNumber> + <FileType>1</FileType> + <tvExp>0</tvExp> + <Focus>0</Focus> + <ColumnNumber>0</ColumnNumber> + <tvExpOptDlg>0</tvExpOptDlg> + <TopLine>0</TopLine> + <CurrentLine>0</CurrentLine> + <bDave2>0</bDave2> + <PathWithFileName>..\..\..\..\software\common\dhry\dhry_1.c</PathWithFileName> + <FilenameWithoutPath>dhry_1.c</FilenameWithoutPath> + <RteFlg>0</RteFlg> + <bShared>0</bShared> + </File> + <File> + <GroupNumber>2</GroupNumber> + <FileNumber>3</FileNumber> + <FileType>1</FileType> + <tvExp>0</tvExp> + <Focus>0</Focus> + <ColumnNumber>0</ColumnNumber> + <tvExpOptDlg>0</tvExpOptDlg> + <TopLine>0</TopLine> + <CurrentLine>0</CurrentLine> + <bDave2>0</bDave2> + <PathWithFileName>..\..\..\..\software\common\dhry\dhry_2.c</PathWithFileName> + <FilenameWithoutPath>dhry_2.c</FilenameWithoutPath> + <RteFlg>0</RteFlg> + <bShared>0</bShared> + </File> + <File> + <GroupNumber>2</GroupNumber> + <FileNumber>4</FileNumber> + <FileType>1</FileType> + <tvExp>0</tvExp> + <Focus>0</Focus> + <ColumnNumber>0</ColumnNumber> + <tvExpOptDlg>0</tvExpOptDlg> + <TopLine>0</TopLine> + <CurrentLine>0</CurrentLine> + <bDave2>0</bDave2> + <PathWithFileName>..\..\..\..\software\common\retarget\retarget.c</PathWithFileName> + <FilenameWithoutPath>retarget.c</FilenameWithoutPath> + <RteFlg>0</RteFlg> + <bShared>0</bShared> + </File> + <File> + <GroupNumber>2</GroupNumber> + <FileNumber>5</FileNumber> + <FileType>1</FileType> + <tvExp>0</tvExp> + <Focus>0</Focus> + <ColumnNumber>0</ColumnNumber> + <tvExpOptDlg>0</tvExpOptDlg> + <TopLine>0</TopLine> + <CurrentLine>0</CurrentLine> + <bDave2>0</bDave2> + <PathWithFileName>..\..\..\..\software\common\retarget\uart_stdout.c</PathWithFileName> + <FilenameWithoutPath>uart_stdout.c</FilenameWithoutPath> + <RteFlg>0</RteFlg> + <bShared>0</bShared> + </File> + </Group> + + <Group> + <GroupName>System</GroupName> + <tvExp>1</tvExp> + <tvExpOptDlg>0</tvExpOptDlg> + <cbSel>0</cbSel> + <RteFlg>0</RteFlg> + <File> + <GroupNumber>3</GroupNumber> + <FileNumber>6</FileNumber> + <FileType>1</FileType> + <tvExp>0</tvExp> + <Focus>0</Focus> + <ColumnNumber>0</ColumnNumber> + <tvExpOptDlg>0</tvExpOptDlg> + <TopLine>0</TopLine> + <CurrentLine>0</CurrentLine> + <bDave2>0</bDave2> + <PathWithFileName>..\..\..\..\software\cmsis\Device\ARM\CMSDK_CM0\Source\system_CMSDK_CM0.c</PathWithFileName> + <FilenameWithoutPath>system_CMSDK_CM0.c</FilenameWithoutPath> + <RteFlg>0</RteFlg> + <bShared>0</bShared> + </File> + </Group> + +</ProjectOpt> diff --git a/Cortex-M0/nanosoc/systems/mcu/testcodes/dhry/dhry_cm0.uvproj b/Cortex-M0/nanosoc/systems/mcu/testcodes/dhry/dhry_cm0.uvproj new file mode 100644 index 0000000..ecbc35d --- /dev/null +++ b/Cortex-M0/nanosoc/systems/mcu/testcodes/dhry/dhry_cm0.uvproj @@ -0,0 +1,440 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no" ?> +<Project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="project_proj.xsd"> + + <SchemaVersion>1.1</SchemaVersion> + + <Header>### uVision Project, (C) Keil Software</Header> + + <Targets> + <Target> + <TargetName>Debug</TargetName> + <ToolsetNumber>0x4</ToolsetNumber> + <ToolsetName>ARM-ADS</ToolsetName> + <TargetOption> + <TargetCommonOption> + <Device>Cortex-M0</Device> + <Vendor>ARM</Vendor> + <Cpu>CLOCK(12000000) CPUTYPE("Cortex-M0") ESEL ELITTLE</Cpu> + <FlashUtilSpec></FlashUtilSpec> + <StartupFile></StartupFile> + <FlashDriverDll></FlashDriverDll> + <DeviceId>4803</DeviceId> + <RegisterFile></RegisterFile> + <MemoryEnv></MemoryEnv> + <Cmp></Cmp> + <Asm></Asm> + <Linker></Linker> + <OHString></OHString> + <InfinionOptionDll></InfinionOptionDll> + <SLE66CMisc></SLE66CMisc> + <SLE66AMisc></SLE66AMisc> + <SLE66LinkerMisc></SLE66LinkerMisc> + <SFDFile></SFDFile> + <UseEnv>0</UseEnv> + <BinPath></BinPath> + <IncludePath></IncludePath> + <LibPath></LibPath> + <RegisterFilePath></RegisterFilePath> + <DBRegisterFilePath></DBRegisterFilePath> + <TargetStatus> + <Error>0</Error> + <ExitCodeStop>0</ExitCodeStop> + <ButtonStop>0</ButtonStop> + <NotGenerated>0</NotGenerated> + <InvalidFlash>1</InvalidFlash> + </TargetStatus> + <OutputDirectory>.\</OutputDirectory> + <OutputName>dhry</OutputName> + <CreateExecutable>1</CreateExecutable> + <CreateLib>0</CreateLib> + <CreateHexFile>0</CreateHexFile> + <DebugInformation>1</DebugInformation> + <BrowseInformation>1</BrowseInformation> + <ListingPath>.\</ListingPath> + <HexFormatSelection>1</HexFormatSelection> + <Merge32K>0</Merge32K> + <CreateBatchFile>0</CreateBatchFile> + <BeforeCompile> + <RunUserProg1>0</RunUserProg1> + <RunUserProg2>0</RunUserProg2> + <UserProg1Name></UserProg1Name> + <UserProg2Name></UserProg2Name> + <UserProg1Dos16Mode>0</UserProg1Dos16Mode> + <UserProg2Dos16Mode>0</UserProg2Dos16Mode> + <nStopU1X>0</nStopU1X> + <nStopU2X>0</nStopU2X> + </BeforeCompile> + <BeforeMake> + <RunUserProg1>0</RunUserProg1> + <RunUserProg2>0</RunUserProg2> + <UserProg1Name></UserProg1Name> + <UserProg2Name></UserProg2Name> + <UserProg1Dos16Mode>0</UserProg1Dos16Mode> + <UserProg2Dos16Mode>0</UserProg2Dos16Mode> + </BeforeMake> + <AfterMake> + <RunUserProg1>1</RunUserProg1> + <RunUserProg2>0</RunUserProg2> + <UserProg1Name>$K\ARM\ARMCC\BIN\fromelf.exe #L --vhx --8x1 --output dhry.hex</UserProg1Name> + <UserProg2Name></UserProg2Name> + <UserProg1Dos16Mode>0</UserProg1Dos16Mode> + <UserProg2Dos16Mode>0</UserProg2Dos16Mode> + </AfterMake> + <SelectedForBatchBuild>0</SelectedForBatchBuild> + <SVCSIdString></SVCSIdString> + </TargetCommonOption> + <CommonProperty> + <UseCPPCompiler>0</UseCPPCompiler> + <RVCTCodeConst>0</RVCTCodeConst> + <RVCTZI>0</RVCTZI> + <RVCTOtherData>0</RVCTOtherData> + <ModuleSelection>0</ModuleSelection> + <IncludeInBuild>1</IncludeInBuild> + <AlwaysBuild>0</AlwaysBuild> + <GenerateAssemblyFile>0</GenerateAssemblyFile> + <AssembleAssemblyFile>0</AssembleAssemblyFile> + <PublicsOnly>0</PublicsOnly> + <StopOnExitCode>3</StopOnExitCode> + <CustomArgument></CustomArgument> + <IncludeLibraryModules></IncludeLibraryModules> + </CommonProperty> + <DllOption> + <SimDllName>SARMCM3.DLL</SimDllName> + <SimDllArguments></SimDllArguments> + <SimDlgDll>DARMCM1.DLL</SimDlgDll> + <SimDlgDllArguments></SimDlgDllArguments> + <TargetDllName>SARMCM3.DLL</TargetDllName> + <TargetDllArguments></TargetDllArguments> + <TargetDlgDll>TARMCM1.DLL</TargetDlgDll> + <TargetDlgDllArguments></TargetDlgDllArguments> + </DllOption> + <DebugOption> + <OPTHX> + <HexSelection>1</HexSelection> + <HexRangeLowAddress>0</HexRangeLowAddress> + <HexRangeHighAddress>0</HexRangeHighAddress> + <HexOffset>0</HexOffset> + <Oh166RecLen>16</Oh166RecLen> + </OPTHX> + <Simulator> + <UseSimulator>1</UseSimulator> + <LoadApplicationAtStartup>1</LoadApplicationAtStartup> + <RunToMain>1</RunToMain> + <RestoreBreakpoints>1</RestoreBreakpoints> + <RestoreWatchpoints>1</RestoreWatchpoints> + <RestoreMemoryDisplay>1</RestoreMemoryDisplay> + <RestoreFunctions>1</RestoreFunctions> + <RestoreToolbox>1</RestoreToolbox> + <LimitSpeedToRealTime>0</LimitSpeedToRealTime> + </Simulator> + <Target> + <UseTarget>0</UseTarget> + <LoadApplicationAtStartup>1</LoadApplicationAtStartup> + <RunToMain>0</RunToMain> + <RestoreBreakpoints>1</RestoreBreakpoints> + <RestoreWatchpoints>1</RestoreWatchpoints> + <RestoreMemoryDisplay>1</RestoreMemoryDisplay> + <RestoreFunctions>0</RestoreFunctions> + <RestoreToolbox>1</RestoreToolbox> + <RestoreTracepoints>0</RestoreTracepoints> + </Target> + <RunDebugAfterBuild>0</RunDebugAfterBuild> + <TargetSelection>-1</TargetSelection> + <SimDlls> + <CpuDll></CpuDll> + <CpuDllArguments></CpuDllArguments> + <PeripheralDll></PeripheralDll> + <PeripheralDllArguments></PeripheralDllArguments> + <InitializationFile></InitializationFile> + </SimDlls> + <TargetDlls> + <CpuDll></CpuDll> + <CpuDllArguments></CpuDllArguments> + <PeripheralDll></PeripheralDll> + <PeripheralDllArguments></PeripheralDllArguments> + <InitializationFile></InitializationFile> + <Driver></Driver> + </TargetDlls> + </DebugOption> + <Utilities> + <Flash1> + <UseTargetDll>0</UseTargetDll> + <UseExternalTool>0</UseExternalTool> + <RunIndependent>0</RunIndependent> + <UpdateFlashBeforeDebugging>0</UpdateFlashBeforeDebugging> + <Capability>0</Capability> + <DriverSelection>-1</DriverSelection> + </Flash1> + <Flash2></Flash2> + <Flash3></Flash3> + <Flash4></Flash4> + </Utilities> + <TargetArmAds> + <ArmAdsMisc> + <GenerateListings>0</GenerateListings> + <asHll>1</asHll> + <asAsm>1</asAsm> + <asMacX>1</asMacX> + <asSyms>1</asSyms> + <asFals>1</asFals> + <asDbgD>1</asDbgD> + <asForm>1</asForm> + <ldLst>0</ldLst> + <ldmm>1</ldmm> + <ldXref>1</ldXref> + <BigEnd>0</BigEnd> + <AdsALst>1</AdsALst> + <AdsACrf>1</AdsACrf> + <AdsANop>0</AdsANop> + <AdsANot>0</AdsANot> + <AdsLLst>1</AdsLLst> + <AdsLmap>1</AdsLmap> + <AdsLcgr>1</AdsLcgr> + <AdsLsym>1</AdsLsym> + <AdsLszi>1</AdsLszi> + <AdsLtoi>1</AdsLtoi> + <AdsLsun>1</AdsLsun> + <AdsLven>1</AdsLven> + <AdsLsxf>1</AdsLsxf> + <RvctClst>0</RvctClst> + <GenPPlst>0</GenPPlst> + <AdsCpuType>"Cortex-M0"</AdsCpuType> + <RvctDeviceName></RvctDeviceName> + <mOS>0</mOS> + <uocRom>0</uocRom> + <uocRam>0</uocRam> + <hadIROM>0</hadIROM> + <hadIRAM>0</hadIRAM> + <hadXRAM>0</hadXRAM> + <uocXRam>0</uocXRam> + <RvdsVP>0</RvdsVP> + <hadIRAM2>0</hadIRAM2> + <hadIROM2>0</hadIROM2> + <StupSel>1</StupSel> + <useUlib>0</useUlib> + <EndSel>1</EndSel> + <uLtcg>0</uLtcg> + <RoSelD>0</RoSelD> + <RwSelD>5</RwSelD> + <CodeSel>0</CodeSel> + <OptFeed>0</OptFeed> + <NoZi1>0</NoZi1> + <NoZi2>0</NoZi2> + <NoZi3>0</NoZi3> + <NoZi4>0</NoZi4> + <NoZi5>0</NoZi5> + <Ro1Chk>1</Ro1Chk> + <Ro2Chk>0</Ro2Chk> + <Ro3Chk>0</Ro3Chk> + <Ir1Chk>0</Ir1Chk> + <Ir2Chk>0</Ir2Chk> + <Ra1Chk>1</Ra1Chk> + <Ra2Chk>0</Ra2Chk> + <Ra3Chk>0</Ra3Chk> + <Im1Chk>0</Im1Chk> + <Im2Chk>0</Im2Chk> + <OnChipMemories> + <Ocm1> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </Ocm1> + <Ocm2> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </Ocm2> + <Ocm3> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </Ocm3> + <Ocm4> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </Ocm4> + <Ocm5> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </Ocm5> + <Ocm6> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </Ocm6> + <IRAM> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </IRAM> + <IROM> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </IROM> + <XRAM> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </XRAM> + <OCR_RVCT1> + <Type>1</Type> + <StartAddress>0x0</StartAddress> + <Size>0x10000</Size> + </OCR_RVCT1> + <OCR_RVCT2> + <Type>1</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </OCR_RVCT2> + <OCR_RVCT3> + <Type>1</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </OCR_RVCT3> + <OCR_RVCT4> + <Type>1</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </OCR_RVCT4> + <OCR_RVCT5> + <Type>1</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </OCR_RVCT5> + <OCR_RVCT6> + <Type>0</Type> + <StartAddress>0x20000000</StartAddress> + <Size>0x10000</Size> + </OCR_RVCT6> + <OCR_RVCT7> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </OCR_RVCT7> + <OCR_RVCT8> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </OCR_RVCT8> + <OCR_RVCT9> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </OCR_RVCT9> + <OCR_RVCT10> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </OCR_RVCT10> + </OnChipMemories> + <RvctStartVector></RvctStartVector> + </ArmAdsMisc> + <Cads> + <interw>1</interw> + <Optim>4</Optim> + <oTime>1</oTime> + <SplitLS>0</SplitLS> + <OneElfS>0</OneElfS> + <Strict>0</Strict> + <EnumInt>0</EnumInt> + <PlainCh>0</PlainCh> + <Ropi>0</Ropi> + <Rwpi>0</Rwpi> + <wLevel>0</wLevel> + <uThumb>0</uThumb> + <uSurpInc>0</uSurpInc> + <VariousControls> + <MiscControls>-Ono_inline --no_inline --no_multifile -Oloopref </MiscControls> + <Define>CORTEX_M0 USE_PRINT ITERATIONS=200 MSC_CLOCK EXPECTED_SYST</Define> + <Undefine></Undefine> + <IncludePath>..\..\..\..\software\cmsis\CMSIS\Include; ..\..\..\..\software\cmsis\Device\ARM\CMSDK_CM0\Include; ..\..\..\..\software\common\retarget</IncludePath> + </VariousControls> + </Cads> + <Aads> + <interw>1</interw> + <Ropi>0</Ropi> + <Rwpi>0</Rwpi> + <thumb>0</thumb> + <SplitLS>0</SplitLS> + <SwStkChk>0</SwStkChk> + <NoWarn>0</NoWarn> + <uSurpInc>0</uSurpInc> + <VariousControls> + <MiscControls></MiscControls> + <Define></Define> + <Undefine></Undefine> + <IncludePath></IncludePath> + </VariousControls> + </Aads> + <LDads> + <umfTarg>1</umfTarg> + <Ropi>0</Ropi> + <Rwpi>0</Rwpi> + <noStLib>0</noStLib> + <RepFail>1</RepFail> + <useFile>0</useFile> + <TextAddressRange>0x00000000</TextAddressRange> + <DataAddressRange>0x00000000</DataAddressRange> + <ScatterFile></ScatterFile> + <IncludeLibs></IncludeLibs> + <IncludeLibsPath></IncludeLibsPath> + <Misc></Misc> + <LinkerInputFile></LinkerInputFile> + <DisabledWarnings></DisabledWarnings> + </LDads> + </TargetArmAds> + </TargetOption> + <Groups> + <Group> + <GroupName>Startup</GroupName> + <Files> + <File> + <FileName>startup_CMSDK_CM0.s</FileName> + <FileType>2</FileType> + <FilePath>..\..\..\..\software\cmsis\Device\ARM\CMSDK_CM0\Source\ARM\startup_CMSDK_CM0.s</FilePath> + </File> + </Files> + </Group> + <Group> + <GroupName>Application</GroupName> + <Files> + <File> + <FileName>dhry_1.c</FileName> + <FileType>1</FileType> + <FilePath>..\..\..\..\software\common\dhry\dhry_1.c</FilePath> + </File> + <File> + <FileName>dhry_2.c</FileName> + <FileType>1</FileType> + <FilePath>..\..\..\..\software\common\dhry\dhry_2.c</FilePath> + </File> + <File> + <FileName>retarget.c</FileName> + <FileType>1</FileType> + <FilePath>..\..\..\..\software\common\retarget\retarget.c</FilePath> + </File> + <File> + <FileName>uart_stdout.c</FileName> + <FileType>1</FileType> + <FilePath>..\..\..\..\software\common\retarget\uart_stdout.c</FilePath> + </File> + </Files> + </Group> + <Group> + <GroupName>System</GroupName> + <Files> + <File> + <FileName>system_CMSDK_CM0.c</FileName> + <FileType>1</FileType> + <FilePath>..\..\..\..\software\cmsis\Device\ARM\CMSDK_CM0\Source\system_CMSDK_CM0.c</FilePath> + </File> + </Files> + </Group> + </Groups> + </Target> + </Targets> + +</Project> diff --git a/Cortex-M0/nanosoc/systems/mcu/testcodes/dhry/dhry_cm0p.uvopt b/Cortex-M0/nanosoc/systems/mcu/testcodes/dhry/dhry_cm0p.uvopt new file mode 100644 index 0000000..0eea87d --- /dev/null +++ b/Cortex-M0/nanosoc/systems/mcu/testcodes/dhry/dhry_cm0p.uvopt @@ -0,0 +1,258 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no" ?> +<ProjectOpt xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="project_opt.xsd"> + + <SchemaVersion>1.0</SchemaVersion> + + <Header>### uVision Project, (C) Keil Software</Header> + + <Extensions> + <cExt>*.c</cExt> + <aExt>*.s*; *.src; *.a*</aExt> + <oExt>*.obj</oExt> + <lExt>*.lib</lExt> + <tExt>*.txt; *.h; *.inc</tExt> + <pExt>*.plm</pExt> + <CppX>*.cpp</CppX> + </Extensions> + + <DaveTm> + <dwLowDateTime>0</dwLowDateTime> + <dwHighDateTime>0</dwHighDateTime> + </DaveTm> + + <Target> + <TargetName>Debug</TargetName> + <ToolsetNumber>0x4</ToolsetNumber> + <ToolsetName>ARM-ADS</ToolsetName> + <TargetOption> + <CLKADS>50000000</CLKADS> + <OPTTT> + <gFlags>1</gFlags> + <BeepAtEnd>1</BeepAtEnd> + <RunSim>1</RunSim> + <RunTarget>0</RunTarget> + </OPTTT> + <OPTHX> + <HexSelection>1</HexSelection> + <FlashByte>65535</FlashByte> + <HexRangeLowAddress>0</HexRangeLowAddress> + <HexRangeHighAddress>0</HexRangeHighAddress> + <HexOffset>0</HexOffset> + </OPTHX> + <OPTLEX> + <PageWidth>79</PageWidth> + <PageLength>66</PageLength> + <TabStop>8</TabStop> + <ListingPath>.\</ListingPath> + </OPTLEX> + <ListingPage> + <CreateCListing>1</CreateCListing> + <CreateAListing>1</CreateAListing> + <CreateLListing>1</CreateLListing> + <CreateIListing>0</CreateIListing> + <AsmCond>1</AsmCond> + <AsmSymb>1</AsmSymb> + <AsmXref>0</AsmXref> + <CCond>1</CCond> + <CCode>0</CCode> + <CListInc>0</CListInc> + <CSymb>0</CSymb> + <LinkerCodeListing>0</LinkerCodeListing> + </ListingPage> + <OPTXL> + <LMap>1</LMap> + <LComments>1</LComments> + <LGenerateSymbols>1</LGenerateSymbols> + <LLibSym>1</LLibSym> + <LLines>1</LLines> + <LLocSym>1</LLocSym> + <LPubSym>1</LPubSym> + <LXref>0</LXref> + <LExpSel>0</LExpSel> + </OPTXL> + <OPTFL> + <tvExp>1</tvExp> + <tvExpOptDlg>0</tvExpOptDlg> + <IsCurrentTarget>1</IsCurrentTarget> + </OPTFL> + <CpuCode>255</CpuCode> + <DllOpt> + <SimDllName>SARMCM3.DLL</SimDllName> + <SimDllArguments></SimDllArguments> + <SimDlgDllName>DARMCM1.DLL</SimDlgDllName> + <SimDlgDllArguments></SimDlgDllArguments> + <TargetDllName>SARMCM3.DLL</TargetDllName> + <TargetDllArguments></TargetDllArguments> + <TargetDlgDllName>TARMCM1.DLL</TargetDlgDllName> + <TargetDlgDllArguments></TargetDlgDllArguments> + </DllOpt> + <DebugOpt> + <uSim>1</uSim> + <uTrg>0</uTrg> + <sLdApp>1</sLdApp> + <sGomain>1</sGomain> + <sRbreak>1</sRbreak> + <sRwatch>1</sRwatch> + <sRmem>1</sRmem> + <sRfunc>1</sRfunc> + <sRbox>1</sRbox> + <tLdApp>1</tLdApp> + <tGomain>0</tGomain> + <tRbreak>1</tRbreak> + <tRwatch>1</tRwatch> + <tRmem>1</tRmem> + <tRfunc>0</tRfunc> + <tRbox>1</tRbox> + <sRunDeb>0</sRunDeb> + <sLrtime>0</sLrtime> + <nTsel>-1</nTsel> + <sDll></sDll> + <sDllPa></sDllPa> + <sDlgDll></sDlgDll> + <sDlgPa></sDlgPa> + <sIfile></sIfile> + <tDll></tDll> + <tDllPa></tDllPa> + <tDlgDll></tDlgDll> + <tDlgPa></tDlgPa> + <tIfile></tIfile> + <pMon></pMon> + </DebugOpt> + <Breakpoint/> + <DebugFlag> + <trace>0</trace> + <periodic>1</periodic> + <aLwin>0</aLwin> + <aCover>0</aCover> + <aSer1>0</aSer1> + <aSer2>0</aSer2> + <aPa>0</aPa> + <viewmode>0</viewmode> + <vrSel>0</vrSel> + <aSym>0</aSym> + <aTbox>0</aTbox> + <AscS1>0</AscS1> + <AscS2>0</AscS2> + <AscS3>0</AscS3> + <aSer3>0</aSer3> + <eProf>0</eProf> + <aLa>0</aLa> + <aPa1>0</aPa1> + <AscS4>0</AscS4> + <aSer4>0</aSer4> + <StkLoc>0</StkLoc> + <TrcWin>0</TrcWin> + <newCpu>0</newCpu> + <uProt>0</uProt> + </DebugFlag> + <LintExecutable></LintExecutable> + <LintConfigFile></LintConfigFile> + </TargetOption> + </Target> + + <Group> + <GroupName>Startup</GroupName> + <tvExp>1</tvExp> + <tvExpOptDlg>0</tvExpOptDlg> + <cbSel>0</cbSel> + <File> + <GroupNumber>1</GroupNumber> + <FileNumber>1</FileNumber> + <FileType>2</FileType> + <tvExp>0</tvExp> + <Focus>0</Focus> + <ColumnNumber>0</ColumnNumber> + <tvExpOptDlg>0</tvExpOptDlg> + <TopLine>0</TopLine> + <CurrentLine>0</CurrentLine> + <bDave2>0</bDave2> + <PathWithFileName>..\..\..\..\software\cmsis\Device\ARM\CMSDK_CM0plus\Source\ARM\startup_CMSDK_CM0plus.s</PathWithFileName> + <FilenameWithoutPath>startup_CMSDK_CM0plus.s</FilenameWithoutPath> + </File> + </Group> + + <Group> + <GroupName>Application</GroupName> + <tvExp>1</tvExp> + <tvExpOptDlg>0</tvExpOptDlg> + <cbSel>0</cbSel> + <File> + <GroupNumber>2</GroupNumber> + <FileNumber>2</FileNumber> + <FileType>1</FileType> + <tvExp>0</tvExp> + <Focus>0</Focus> + <ColumnNumber>0</ColumnNumber> + <tvExpOptDlg>0</tvExpOptDlg> + <TopLine>0</TopLine> + <CurrentLine>0</CurrentLine> + <bDave2>0</bDave2> + <PathWithFileName>..\..\..\..\software\common\dhry\dhry_1.c</PathWithFileName> + <FilenameWithoutPath>dhry_1.c</FilenameWithoutPath> + </File> + <File> + <GroupNumber>2</GroupNumber> + <FileNumber>3</FileNumber> + <FileType>1</FileType> + <tvExp>0</tvExp> + <Focus>0</Focus> + <ColumnNumber>0</ColumnNumber> + <tvExpOptDlg>0</tvExpOptDlg> + <TopLine>0</TopLine> + <CurrentLine>0</CurrentLine> + <bDave2>0</bDave2> + <PathWithFileName>..\..\..\..\software\common\dhry\dhry_2.c</PathWithFileName> + <FilenameWithoutPath>dhry_2.c</FilenameWithoutPath> + </File> + <File> + <GroupNumber>2</GroupNumber> + <FileNumber>4</FileNumber> + <FileType>1</FileType> + <tvExp>0</tvExp> + <Focus>0</Focus> + <ColumnNumber>0</ColumnNumber> + <tvExpOptDlg>0</tvExpOptDlg> + <TopLine>0</TopLine> + <CurrentLine>0</CurrentLine> + <bDave2>0</bDave2> + <PathWithFileName>..\..\..\..\software\common\retarget\retarget.c</PathWithFileName> + <FilenameWithoutPath>retarget.c</FilenameWithoutPath> + </File> + <File> + <GroupNumber>2</GroupNumber> + <FileNumber>5</FileNumber> + <FileType>1</FileType> + <tvExp>0</tvExp> + <Focus>0</Focus> + <ColumnNumber>0</ColumnNumber> + <tvExpOptDlg>0</tvExpOptDlg> + <TopLine>0</TopLine> + <CurrentLine>0</CurrentLine> + <bDave2>0</bDave2> + <PathWithFileName>..\..\..\..\software\common\retarget\uart_stdout.c</PathWithFileName> + <FilenameWithoutPath>uart_stdout.c</FilenameWithoutPath> + </File> + </Group> + + <Group> + <GroupName>System</GroupName> + <tvExp>1</tvExp> + <tvExpOptDlg>0</tvExpOptDlg> + <cbSel>0</cbSel> + <File> + <GroupNumber>3</GroupNumber> + <FileNumber>6</FileNumber> + <FileType>1</FileType> + <tvExp>0</tvExp> + <Focus>0</Focus> + <ColumnNumber>0</ColumnNumber> + <tvExpOptDlg>0</tvExpOptDlg> + <TopLine>0</TopLine> + <CurrentLine>0</CurrentLine> + <bDave2>0</bDave2> + <PathWithFileName>..\..\..\..\software\cmsis\Device\ARM\CMSDK_CM0plus\Source\system_CMSDK_CM0plus.c</PathWithFileName> + <FilenameWithoutPath>system_CMSDK_CM0plus.c</FilenameWithoutPath> + </File> + </Group> + +</ProjectOpt> diff --git a/Cortex-M0/nanosoc/systems/mcu/testcodes/dhry/dhry_cm0p.uvproj b/Cortex-M0/nanosoc/systems/mcu/testcodes/dhry/dhry_cm0p.uvproj new file mode 100644 index 0000000..b5b42b1 --- /dev/null +++ b/Cortex-M0/nanosoc/systems/mcu/testcodes/dhry/dhry_cm0p.uvproj @@ -0,0 +1,437 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no" ?> +<Project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="project_proj.xsd"> + + <SchemaVersion>1.1</SchemaVersion> + + <Header>### uVision Project, (C) Keil Software</Header> + + <Targets> + <Target> + <TargetName>Debug</TargetName> + <ToolsetNumber>0x4</ToolsetNumber> + <ToolsetName>ARM-ADS</ToolsetName> + <TargetOption> + <TargetCommonOption> + <Device>Cortex-M0+</Device> + <Vendor>ARM</Vendor> + <Cpu>CLOCK(12000000) CPUTYPE("Cortex-M0+") ESEL ELITTLE</Cpu> + <FlashUtilSpec></FlashUtilSpec> + <StartupFile></StartupFile> + <FlashDriverDll></FlashDriverDll> + <DeviceId>6268</DeviceId> + <RegisterFile></RegisterFile> + <MemoryEnv></MemoryEnv> + <Cmp></Cmp> + <Asm></Asm> + <Linker></Linker> + <OHString></OHString> + <InfinionOptionDll></InfinionOptionDll> + <SLE66CMisc></SLE66CMisc> + <SLE66AMisc></SLE66AMisc> + <SLE66LinkerMisc></SLE66LinkerMisc> + <SFDFile></SFDFile> + <UseEnv>0</UseEnv> + <BinPath></BinPath> + <IncludePath></IncludePath> + <LibPath></LibPath> + <RegisterFilePath></RegisterFilePath> + <DBRegisterFilePath></DBRegisterFilePath> + <TargetStatus> + <Error>0</Error> + <ExitCodeStop>0</ExitCodeStop> + <ButtonStop>0</ButtonStop> + <NotGenerated>0</NotGenerated> + <InvalidFlash>1</InvalidFlash> + </TargetStatus> + <OutputDirectory>.\</OutputDirectory> + <OutputName>dhry</OutputName> + <CreateExecutable>1</CreateExecutable> + <CreateLib>0</CreateLib> + <CreateHexFile>0</CreateHexFile> + <DebugInformation>1</DebugInformation> + <BrowseInformation>1</BrowseInformation> + <ListingPath>.\</ListingPath> + <HexFormatSelection>1</HexFormatSelection> + <Merge32K>0</Merge32K> + <CreateBatchFile>0</CreateBatchFile> + <BeforeCompile> + <RunUserProg1>0</RunUserProg1> + <RunUserProg2>0</RunUserProg2> + <UserProg1Name></UserProg1Name> + <UserProg2Name></UserProg2Name> + <UserProg1Dos16Mode>0</UserProg1Dos16Mode> + <UserProg2Dos16Mode>0</UserProg2Dos16Mode> + <nStopU1X>0</nStopU1X> + <nStopU2X>0</nStopU2X> + </BeforeCompile> + <BeforeMake> + <RunUserProg1>0</RunUserProg1> + <RunUserProg2>0</RunUserProg2> + <UserProg1Name></UserProg1Name> + <UserProg2Name></UserProg2Name> + <UserProg1Dos16Mode>0</UserProg1Dos16Mode> + <UserProg2Dos16Mode>0</UserProg2Dos16Mode> + </BeforeMake> + <AfterMake> + <RunUserProg1>1</RunUserProg1> + <RunUserProg2>0</RunUserProg2> + <UserProg1Name>$K\ARM\ARMCC\BIN\fromelf.exe #L --vhx --8x1 --output dhry.hex</UserProg1Name> + <UserProg2Name></UserProg2Name> + <UserProg1Dos16Mode>0</UserProg1Dos16Mode> + <UserProg2Dos16Mode>0</UserProg2Dos16Mode> + </AfterMake> + <SelectedForBatchBuild>0</SelectedForBatchBuild> + <SVCSIdString></SVCSIdString> + </TargetCommonOption> + <CommonProperty> + <UseCPPCompiler>0</UseCPPCompiler> + <RVCTCodeConst>0</RVCTCodeConst> + <RVCTZI>0</RVCTZI> + <RVCTOtherData>0</RVCTOtherData> + <ModuleSelection>0</ModuleSelection> + <IncludeInBuild>1</IncludeInBuild> + <AlwaysBuild>0</AlwaysBuild> + <GenerateAssemblyFile>0</GenerateAssemblyFile> + <AssembleAssemblyFile>0</AssembleAssemblyFile> + <PublicsOnly>0</PublicsOnly> + <StopOnExitCode>3</StopOnExitCode> + <CustomArgument></CustomArgument> + <IncludeLibraryModules></IncludeLibraryModules> + </CommonProperty> + <DllOption> + <SimDllName>SARMCM3.DLL</SimDllName> + <SimDllArguments></SimDllArguments> + <SimDlgDll>DARMCM1.DLL</SimDlgDll> + <SimDlgDllArguments></SimDlgDllArguments> + <TargetDllName>SARMCM3.DLL</TargetDllName> + <TargetDllArguments></TargetDllArguments> + <TargetDlgDll>TARMCM1.DLL</TargetDlgDll> + <TargetDlgDllArguments></TargetDlgDllArguments> + </DllOption> + <DebugOption> + <OPTHX> + <HexSelection>1</HexSelection> + <HexRangeLowAddress>0</HexRangeLowAddress> + <HexRangeHighAddress>0</HexRangeHighAddress> + <HexOffset>0</HexOffset> + <Oh166RecLen>16</Oh166RecLen> + </OPTHX> + <Simulator> + <UseSimulator>1</UseSimulator> + <LoadApplicationAtStartup>1</LoadApplicationAtStartup> + <RunToMain>1</RunToMain> + <RestoreBreakpoints>1</RestoreBreakpoints> + <RestoreWatchpoints>1</RestoreWatchpoints> + <RestoreMemoryDisplay>1</RestoreMemoryDisplay> + <RestoreFunctions>1</RestoreFunctions> + <RestoreToolbox>1</RestoreToolbox> + <LimitSpeedToRealTime>0</LimitSpeedToRealTime> + </Simulator> + <Target> + <UseTarget>0</UseTarget> + <LoadApplicationAtStartup>1</LoadApplicationAtStartup> + <RunToMain>0</RunToMain> + <RestoreBreakpoints>1</RestoreBreakpoints> + <RestoreWatchpoints>1</RestoreWatchpoints> + <RestoreMemoryDisplay>1</RestoreMemoryDisplay> + <RestoreFunctions>0</RestoreFunctions> + <RestoreToolbox>1</RestoreToolbox> + </Target> + <RunDebugAfterBuild>0</RunDebugAfterBuild> + <TargetSelection>-1</TargetSelection> + <SimDlls> + <CpuDll></CpuDll> + <CpuDllArguments></CpuDllArguments> + <PeripheralDll></PeripheralDll> + <PeripheralDllArguments></PeripheralDllArguments> + <InitializationFile></InitializationFile> + </SimDlls> + <TargetDlls> + <CpuDll></CpuDll> + <CpuDllArguments></CpuDllArguments> + <PeripheralDll></PeripheralDll> + <PeripheralDllArguments></PeripheralDllArguments> + <InitializationFile></InitializationFile> + <Driver></Driver> + </TargetDlls> + </DebugOption> + <Utilities> + <Flash1> + <UseTargetDll>0</UseTargetDll> + <UseExternalTool>0</UseExternalTool> + <RunIndependent>0</RunIndependent> + <UpdateFlashBeforeDebugging>0</UpdateFlashBeforeDebugging> + <Capability>0</Capability> + <DriverSelection>-1</DriverSelection> + </Flash1> + <Flash2></Flash2> + <Flash3></Flash3> + <Flash4></Flash4> + </Utilities> + <TargetArmAds> + <ArmAdsMisc> + <GenerateListings>0</GenerateListings> + <asHll>1</asHll> + <asAsm>1</asAsm> + <asMacX>1</asMacX> + <asSyms>1</asSyms> + <asFals>1</asFals> + <asDbgD>1</asDbgD> + <asForm>1</asForm> + <ldLst>0</ldLst> + <ldmm>1</ldmm> + <ldXref>1</ldXref> + <BigEnd>0</BigEnd> + <AdsALst>1</AdsALst> + <AdsACrf>1</AdsACrf> + <AdsANop>0</AdsANop> + <AdsANot>0</AdsANot> + <AdsLLst>1</AdsLLst> + <AdsLmap>1</AdsLmap> + <AdsLcgr>1</AdsLcgr> + <AdsLsym>1</AdsLsym> + <AdsLszi>1</AdsLszi> + <AdsLtoi>1</AdsLtoi> + <AdsLsun>1</AdsLsun> + <AdsLven>1</AdsLven> + <AdsLsxf>1</AdsLsxf> + <RvctClst>0</RvctClst> + <GenPPlst>0</GenPPlst> + <AdsCpuType>"Cortex-M0+"</AdsCpuType> + <RvctDeviceName></RvctDeviceName> + <mOS>0</mOS> + <uocRom>0</uocRom> + <uocRam>0</uocRam> + <hadIROM>0</hadIROM> + <hadIRAM>0</hadIRAM> + <hadXRAM>0</hadXRAM> + <uocXRam>0</uocXRam> + <RvdsVP>0</RvdsVP> + <hadIRAM2>0</hadIRAM2> + <hadIROM2>0</hadIROM2> + <StupSel>1</StupSel> + <useUlib>0</useUlib> + <EndSel>1</EndSel> + <uLtcg>0</uLtcg> + <RoSelD>0</RoSelD> + <RwSelD>5</RwSelD> + <CodeSel>0</CodeSel> + <OptFeed>0</OptFeed> + <NoZi1>0</NoZi1> + <NoZi2>0</NoZi2> + <NoZi3>0</NoZi3> + <NoZi4>0</NoZi4> + <NoZi5>0</NoZi5> + <Ro1Chk>1</Ro1Chk> + <Ro2Chk>0</Ro2Chk> + <Ro3Chk>0</Ro3Chk> + <Ir1Chk>0</Ir1Chk> + <Ir2Chk>0</Ir2Chk> + <Ra1Chk>1</Ra1Chk> + <Ra2Chk>0</Ra2Chk> + <Ra3Chk>0</Ra3Chk> + <Im1Chk>0</Im1Chk> + <Im2Chk>0</Im2Chk> + <OnChipMemories> + <Ocm1> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </Ocm1> + <Ocm2> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </Ocm2> + <Ocm3> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </Ocm3> + <Ocm4> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </Ocm4> + <Ocm5> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </Ocm5> + <Ocm6> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </Ocm6> + <IRAM> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </IRAM> + <IROM> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </IROM> + <XRAM> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </XRAM> + <OCR_RVCT1> + <Type>1</Type> + <StartAddress>0x0</StartAddress> + <Size>0x10000</Size> + </OCR_RVCT1> + <OCR_RVCT2> + <Type>1</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </OCR_RVCT2> + <OCR_RVCT3> + <Type>1</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </OCR_RVCT3> + <OCR_RVCT4> + <Type>1</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </OCR_RVCT4> + <OCR_RVCT5> + <Type>1</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </OCR_RVCT5> + <OCR_RVCT6> + <Type>0</Type> + <StartAddress>0x20000000</StartAddress> + <Size>0x10000</Size> + </OCR_RVCT6> + <OCR_RVCT7> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </OCR_RVCT7> + <OCR_RVCT8> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </OCR_RVCT8> + <OCR_RVCT9> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </OCR_RVCT9> + <OCR_RVCT10> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </OCR_RVCT10> + </OnChipMemories> + <RvctStartVector></RvctStartVector> + </ArmAdsMisc> + <Cads> + <interw>1</interw> + <Optim>4</Optim> + <oTime>1</oTime> + <SplitLS>0</SplitLS> + <OneElfS>0</OneElfS> + <Strict>0</Strict> + <EnumInt>0</EnumInt> + <PlainCh>0</PlainCh> + <Ropi>0</Ropi> + <Rwpi>0</Rwpi> + <wLevel>0</wLevel> + <uThumb>0</uThumb> + <VariousControls> + <MiscControls>-Ono_inline --no_inline --no_multifile -Oloopref </MiscControls> + <Define>CORTEX_M0PLUS USE_PRINT ITERATIONS=200 MSC_CLOCK EXPECTED_SYST</Define> + <Undefine></Undefine> + <IncludePath>..\..\..\..\software\cmsis\CMSIS\Include; ..\..\..\..\software\cmsis\Device\ARM\CMSDK_CM0plus\Include; ..\..\..\..\software\common\retarget</IncludePath> + </VariousControls> + </Cads> + <Aads> + <interw>1</interw> + <Ropi>0</Ropi> + <Rwpi>0</Rwpi> + <thumb>0</thumb> + <SplitLS>0</SplitLS> + <SwStkChk>0</SwStkChk> + <NoWarn>0</NoWarn> + <VariousControls> + <MiscControls></MiscControls> + <Define></Define> + <Undefine></Undefine> + <IncludePath></IncludePath> + </VariousControls> + </Aads> + <LDads> + <umfTarg>1</umfTarg> + <Ropi>0</Ropi> + <Rwpi>0</Rwpi> + <noStLib>0</noStLib> + <RepFail>1</RepFail> + <useFile>0</useFile> + <TextAddressRange>0x00000000</TextAddressRange> + <DataAddressRange>0x00000000</DataAddressRange> + <ScatterFile></ScatterFile> + <IncludeLibs></IncludeLibs> + <IncludeLibsPath></IncludeLibsPath> + <Misc></Misc> + <LinkerInputFile></LinkerInputFile> + <DisabledWarnings></DisabledWarnings> + </LDads> + </TargetArmAds> + </TargetOption> + <Groups> + <Group> + <GroupName>Startup</GroupName> + <Files> + <File> + <FileName>startup_CMSDK_CM0plus.s</FileName> + <FileType>2</FileType> + <FilePath>..\..\..\..\software\cmsis\Device\ARM\CMSDK_CM0plus\Source\ARM\startup_CMSDK_CM0plus.s</FilePath> + </File> + </Files> + </Group> + <Group> + <GroupName>Application</GroupName> + <Files> + <File> + <FileName>dhry_1.c</FileName> + <FileType>1</FileType> + <FilePath>..\..\..\..\software\common\dhry\dhry_1.c</FilePath> + </File> + <File> + <FileName>dhry_2.c</FileName> + <FileType>1</FileType> + <FilePath>..\..\..\..\software\common\dhry\dhry_2.c</FilePath> + </File> + <File> + <FileName>retarget.c</FileName> + <FileType>1</FileType> + <FilePath>..\..\..\..\software\common\retarget\retarget.c</FilePath> + </File> + <File> + <FileName>uart_stdout.c</FileName> + <FileType>1</FileType> + <FilePath>..\..\..\..\software\common\retarget\uart_stdout.c</FilePath> + </File> + </Files> + </Group> + <Group> + <GroupName>System</GroupName> + <Files> + <File> + <FileName>system_CMSDK_CM0plus.c</FileName> + <FileType>1</FileType> + <FilePath>..\..\..\..\software\cmsis\Device\ARM\CMSDK_CM0plus\Source\system_CMSDK_CM0plus.c</FilePath> + </File> + </Files> + </Group> + </Groups> + </Target> + </Targets> + +</Project> diff --git a/Cortex-M0/nanosoc/systems/mcu/testcodes/dhry/makefile b/Cortex-M0/nanosoc/systems/mcu/testcodes/dhry/makefile new file mode 100644 index 0000000..70c1b5d --- /dev/null +++ b/Cortex-M0/nanosoc/systems/mcu/testcodes/dhry/makefile @@ -0,0 +1,260 @@ +#----------------------------------------------------------------------------- +# The confidential and proprietary information contained in this file may +# only be used by a person authorised under and to the extent permitted +# by a subsisting licensing agreement from Arm Limited or its affiliates. +# +# (C) COPYRIGHT 2010-2013 Arm Limited or its affiliates. +# ALL RIGHTS RESERVED +# +# This entire notice must be reproduced on all copies of this file +# and copies of this file may only be made by a person if such person is +# permitted to do so under the terms of a subsisting license agreement +# from Arm Limited or its affiliates. +# +# SVN Information +# +# Checked In : $Date: 2017-10-10 15:55:38 +0100 (Tue, 10 Oct 2017) $ +# +# Revision : $Revision: 371321 $ +# +# Release Information : Cortex-M System Design Kit-r1p1-00rel0 +#----------------------------------------------------------------------------- +# +# Cortex-M System Design Kit software compilation make file +# +#----------------------------------------------------------------------------- +# +# Configurations +# +# - CORTEX_M0 +# - CORTEX_M0PLUS +CPU_PRODUCT = CORTEX_M0PLUS + +# Shared software directory +# Shared software directory +SOFTWARE_DIR = ../../../../software +CMSIS_DIR = $(SOFTWARE_DIR)/cmsis +CORE_DIR = $(CMSIS_DIR)/CMSIS/Include + +ifeq ($(CPU_PRODUCT),CORTEX_M0PLUS) + DEVICE_DIR = $(CMSIS_DIR)/Device/ARM/CMSDK_CM0plus +else + DEVICE_DIR = $(CMSIS_DIR)/Device/ARM/CMSDK_CM0 +endif + +# Program file +TESTNAME = dhry + +# Endian Option +COMPILE_BIGEND = 0 + +# Configuration +ifeq ($(CPU_PRODUCT),CORTEX_M0PLUS) + USER_DEFINE = -DCORTEX_M0PLUS -DITERATIONS=200 +else + USER_DEFINE = -DCORTEX_M0 -DITERATIONS=200 +endif + +DEPS_LIST = makefile +DHRY_ARMCC_OPTION = -Ono_inline --no_inline --no_multifile -Oloopref + +# Tool chain : ds5 / gcc / keil +TOOL_CHAIN = ds5 + +ifeq ($(TOOL_CHAIN),ds5) + ifeq ($(CPU_PRODUCT),CORTEX_M0PLUS) + CPU_TYPE = --cpu Cortex-M0plus + else + CPU_TYPE = --cpu Cortex-M0 + endif +endif + +ifeq ($(TOOL_CHAIN),gcc) + ifeq ($(CPU_PRODUCT),CORTEX_M0PLUS) + CPU_TYPE = -mcpu=cortex-m0plus + else + CPU_TYPE = -mcpu=cortex-m0 + endif +endif + +# Startup code directory for DS-5 +ifeq ($(TOOL_CHAIN),ds5) + STARTUP_DIR = $(DEVICE_DIR)/Source/ARM +endif + +# Startup code directory for gcc +ifeq ($(TOOL_CHAIN),gcc) + STARTUP_DIR = $(DEVICE_DIR)/Source/GCC +endif + +ifeq ($(CPU_PRODUCT),CORTEX_M0PLUS) + STARTUP_FILE = startup_CMSDK_CM0plus + SYSTEM_FILE = system_CMSDK_CM0plus +else + STARTUP_FILE = startup_CMSDK_CM0 + SYSTEM_FILE = system_CMSDK_CM0 +endif + +# --------------------------------------------------------------------------------------- +# DS-5 options + +# MicroLIB option +COMPILE_MICROLIB = 0 + +# Small Multiply (Cortex-M0/M0+ has small multiplier option) +COMPILE_SMALLMUL = 0 + +ARM_CC_OPTIONS = -c -O3 -g -Otime \ + -I $(CORE_DIR) -I $(DEVICE_DIR)/Include -I $(SOFTWARE_DIR)/common/retarget \ + -I $(SOFTWARE_DIR)/common/dhry \ + $(DHRY_ARMCC_OPTION) $(USER_DEFINE) +ARM_ASM_OPTIONS = -g +ARM_LINK_OPTIONS = "--keep=$(STARTUP_FILE).o(RESET)" "--first=$(STARTUP_FILE).o(RESET)" \ + --rw_base 0x30000000 --ro_base 0x00000000 --map + + +ifeq ($(COMPILE_BIGEND),1) + # Big Endian + ARM_CC_OPTIONS += --bigend + ARM_ASM_OPTIONS += --bigend + ARM_LINK_OPTIONS += --be8 +endif + +ifeq ($(COMPILE_MICROLIB),1) + # MicroLIB + ARM_CC_OPTIONS += --library_type=microlib + ARM_ASM_OPTIONS += --library_type=microlib --pd "__MICROLIB SETA 1" + ARM_LINK_OPTIONS += --library_type=microlib +endif + +ifeq ($(COMPILE_SMALLMUL),1) + # In Cortex-M0, small multiply takes 32 cycles + ARM_CC_OPTIONS += --multiply_latency=32 +endif + +# --------------------------------------------------------------------------------------- +# gcc options + +GNG_CC = arm-none-eabi-gcc +GNU_OBJDUMP = arm-none-eabi-objdump +GNU_OBJCOPY = arm-none-eabi-objcopy + +LINKER_SCRIPT_PATH = $(SOFTWARE_DIR)/common/scripts +LINKER_SCRIPT = $(LINKER_SCRIPT_PATH)/cmsdk_cm0.ld + +GNU_CC_FLAGS = -g -O3 -mthumb $(CPU_TYPE) -fno-inline -fno-common -Wl,-Map -Wl,$(TESTNAME).map + +ifeq ($(COMPILE_BIGEND),1) + # Big Endian + GNU_CC_FLAGS += -mbig-endian +endif + +# --------------------------------------------------------------------------------------- +all: all_$(TOOL_CHAIN) + +# --------------------------------------------------------------------------------------- +# DS-5 + +all_ds5 : $(TESTNAME).hex $(TESTNAME).lst + +dhry_1.o : $(SOFTWARE_DIR)/common/dhry/dhry_1.c $(DEPS_LIST) + armcc $(ARM_CC_OPTIONS) $(CPU_TYPE) $< -o $@ + +dhry_2.o : $(SOFTWARE_DIR)/common/dhry/dhry_2.c $(DEPS_LIST) + armcc $(ARM_CC_OPTIONS) $(CPU_TYPE) $< -o $@ + +$(SYSTEM_FILE).o : $(DEVICE_DIR)/Source/$(SYSTEM_FILE).c $(DEPS_LIST) + armcc $(ARM_CC_OPTIONS) $(CPU_TYPE) $< -o $@ + +retarget.o : $(SOFTWARE_DIR)/common/retarget/retarget.c $(DEPS_LIST) + armcc $(ARM_CC_OPTIONS) $(CPU_TYPE) $< -o $@ + +uart_stdout.o : $(SOFTWARE_DIR)/common/retarget/uart_stdout.c $(DEPS_LIST) + armcc $(ARM_CC_OPTIONS) $(CPU_TYPE) $< -o $@ + +$(STARTUP_FILE).o : $(STARTUP_DIR)/$(STARTUP_FILE).s $(DEPS_LIST) + armasm $(ARM_ASM_OPTIONS) $(CPU_TYPE) $< -o $@ + + +$(TESTNAME).ELF : dhry_1.o dhry_2.o $(SYSTEM_FILE).o $(STARTUP_FILE).o retarget.o uart_stdout.o + armlink $(ARM_LINK_OPTIONS) -o $@ dhry_1.o dhry_2.o $(SYSTEM_FILE).o $(STARTUP_FILE).o retarget.o uart_stdout.o + +$(TESTNAME).hex : $(TESTNAME).ELF + fromelf --vhx --8x1 $< --output $@ + + +$(TESTNAME).lst : $(TESTNAME).ELF + fromelf -c -d -e -s $< --output $@ + +# --------------------------------------------------------------------------------------- +# gcc +all_gcc: + $(GNG_CC) $(GNU_CC_FLAGS) $(STARTUP_DIR)/$(STARTUP_FILE).s \ + $(SOFTWARE_DIR)/common/dhry/dhry_1.c \ + $(SOFTWARE_DIR)/common/dhry/dhry_2.c \ + $(SOFTWARE_DIR)/common/retarget/retarget.c \ + $(SOFTWARE_DIR)/common/retarget/uart_stdout.c \ + $(DEVICE_DIR)/Source/$(SYSTEM_FILE).c \ + -I $(DEVICE_DIR)/Include -I $(CORE_DIR) -I $(SOFTWARE_DIR)/common/retarget \ + -I $(SOFTWARE_DIR)/common/dhry \ + -L $(LINKER_SCRIPT_PATH) \ + -D__STACK_SIZE=0x200 \ + -D__HEAP_SIZE=0x1000 \ + $(USER_DEFINE) -T $(LINKER_SCRIPT) -o $(TESTNAME).o + # Generate disassembly code + $(GNU_OBJDUMP) -S $(TESTNAME).o > $(TESTNAME).lst + # Generate binary file + $(GNU_OBJCOPY) -S $(TESTNAME).o -O binary $(TESTNAME).bin + # Generate hex file + $(GNU_OBJCOPY) -S $(TESTNAME).o -O verilog $(TESTNAME).hex + +# Note: +# If the version of object copy you are using does not support verilog hex file output, +# you can generate the hex file from binary file using the following command +# od -v -A n -t x1 --width=1 $(TESTNAME).bin > $(TESTNAME).hex + +# --------------------------------------------------------------------------------------- +# Keil MDK + +all_keil: + @echo "Please compile your project code and press ENTER when ready" + @read dummy + +# --------------------------------------------------------------------------------------- +# Binary + +all_bin: $(TESTNAME).bin + # Generate hex file from binary + od -v -A n -t x1 --width=1 $(TESTNAME).bin > $(TESTNAME).hex + +# --------------------------------------------------------------------------------------- +# Clean + +clean : + @rm -rf *.o + @if [ -e $(TESTNAME).hex ] ; then \ + rm -rf $(TESTNAME).hex ; \ + fi + @if [ -e $(TESTNAME).lst ] ; then \ + rm -rf $(TESTNAME).lst ; \ + fi + @if [ -e $(TESTNAME).ELF ] ; then \ + rm -rf $(TESTNAME).ELF ; \ + fi + @if [ -e $(TESTNAME).bin ] ; then \ + rm -rf $(TESTNAME).bin ; \ + fi + @rm -rf *.crf + @rm -rf *.plg + @rm -rf *.tra + @rm -rf *.htm + @rm -rf *.map + @rm -rf *.dep + @rm -rf *.d + @rm -rf *.lnp + @rm -rf *.bak + @rm -rf *.lst + @rm -rf *.axf + @rm -rf *.sct + @rm -rf *.__i + @rm -rf *._ia diff --git a/Cortex-M0/nanosoc/systems/mcu/testcodes/dhry/transcript b/Cortex-M0/nanosoc/systems/mcu/testcodes/dhry/transcript new file mode 100644 index 0000000..58d44cd --- /dev/null +++ b/Cortex-M0/nanosoc/systems/mcu/testcodes/dhry/transcript @@ -0,0 +1,14 @@ +# // Questa Sim-64 +# // Version 10.7c linux_x86_64 Aug 17 2018 +# // +# // Copyright 1991-2018 Mentor Graphics Corporation +# // All Rights Reserved. +# // +# // QuestaSim and its associated documentation contain trade +# // secrets and commercial or financial information that are the property of +# // Mentor Graphics Corporation and are privileged, confidential, +# // and exempt from disclosure under the Freedom of Information Act, +# // 5 U.S.C. Section 552. Furthermore, this information +# // is prohibited from disclosure under the Trade Secrets Act, +# // 18 U.S.C. Section 1905. +# // diff --git a/Cortex-M0/nanosoc/systems/mcu/testcodes/dma_tests/dma_tests_cm0.uvopt b/Cortex-M0/nanosoc/systems/mcu/testcodes/dma_tests/dma_tests_cm0.uvopt new file mode 100644 index 0000000..ad90f6c --- /dev/null +++ b/Cortex-M0/nanosoc/systems/mcu/testcodes/dma_tests/dma_tests_cm0.uvopt @@ -0,0 +1,261 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no" ?> +<ProjectOpt xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="project_opt.xsd"> + + <SchemaVersion>1.0</SchemaVersion> + + <Header>### uVision Project, (C) Keil Software</Header> + + <Extensions> + <cExt>*.c</cExt> + <aExt>*.s*; *.src; *.a*</aExt> + <oExt>*.obj</oExt> + <lExt>*.lib</lExt> + <tExt>*.txt; *.h; *.inc</tExt> + <pExt>*.plm</pExt> + <CppX>*.cpp</CppX> + </Extensions> + + <DaveTm> + <dwLowDateTime>0</dwLowDateTime> + <dwHighDateTime>0</dwHighDateTime> + </DaveTm> + + <Target> + <TargetName>Debug</TargetName> + <ToolsetNumber>0x4</ToolsetNumber> + <ToolsetName>ARM-ADS</ToolsetName> + <TargetOption> + <CLKADS>50000000</CLKADS> + <OPTTT> + <gFlags>1</gFlags> + <BeepAtEnd>1</BeepAtEnd> + <RunSim>1</RunSim> + <RunTarget>0</RunTarget> + </OPTTT> + <OPTHX> + <HexSelection>1</HexSelection> + <FlashByte>65535</FlashByte> + <HexRangeLowAddress>0</HexRangeLowAddress> + <HexRangeHighAddress>0</HexRangeHighAddress> + <HexOffset>0</HexOffset> + </OPTHX> + <OPTLEX> + <PageWidth>79</PageWidth> + <PageLength>66</PageLength> + <TabStop>8</TabStop> + <ListingPath>.\</ListingPath> + </OPTLEX> + <ListingPage> + <CreateCListing>1</CreateCListing> + <CreateAListing>1</CreateAListing> + <CreateLListing>1</CreateLListing> + <CreateIListing>0</CreateIListing> + <AsmCond>1</AsmCond> + <AsmSymb>1</AsmSymb> + <AsmXref>0</AsmXref> + <CCond>1</CCond> + <CCode>0</CCode> + <CListInc>0</CListInc> + <CSymb>0</CSymb> + <LinkerCodeListing>0</LinkerCodeListing> + </ListingPage> + <OPTXL> + <LMap>1</LMap> + <LComments>1</LComments> + <LGenerateSymbols>1</LGenerateSymbols> + <LLibSym>1</LLibSym> + <LLines>1</LLines> + <LLocSym>1</LLocSym> + <LPubSym>1</LPubSym> + <LXref>0</LXref> + <LExpSel>0</LExpSel> + </OPTXL> + <OPTFL> + <tvExp>1</tvExp> + <tvExpOptDlg>0</tvExpOptDlg> + <IsCurrentTarget>1</IsCurrentTarget> + </OPTFL> + <CpuCode>255</CpuCode> + <DllOpt> + <SimDllName>SARMCM3.DLL</SimDllName> + <SimDllArguments></SimDllArguments> + <SimDlgDllName>DARMCM1.DLL</SimDlgDllName> + <SimDlgDllArguments></SimDlgDllArguments> + <TargetDllName>SARMCM3.DLL</TargetDllName> + <TargetDllArguments></TargetDllArguments> + <TargetDlgDllName>TARMCM1.DLL</TargetDlgDllName> + <TargetDlgDllArguments></TargetDlgDllArguments> + </DllOpt> + <DebugOpt> + <uSim>1</uSim> + <uTrg>0</uTrg> + <sLdApp>1</sLdApp> + <sGomain>1</sGomain> + <sRbreak>1</sRbreak> + <sRwatch>1</sRwatch> + <sRmem>1</sRmem> + <sRfunc>1</sRfunc> + <sRbox>1</sRbox> + <tLdApp>1</tLdApp> + <tGomain>0</tGomain> + <tRbreak>1</tRbreak> + <tRwatch>1</tRwatch> + <tRmem>1</tRmem> + <tRfunc>0</tRfunc> + <tRbox>1</tRbox> + <tRtrace>0</tRtrace> + <sRunDeb>0</sRunDeb> + <sLrtime>0</sLrtime> + <nTsel>-1</nTsel> + <sDll></sDll> + <sDllPa></sDllPa> + <sDlgDll></sDlgDll> + <sDlgPa></sDlgPa> + <sIfile></sIfile> + <tDll></tDll> + <tDllPa></tDllPa> + <tDlgDll></tDlgDll> + <tDlgPa></tDlgPa> + <tIfile></tIfile> + <pMon></pMon> + </DebugOpt> + <Breakpoint/> + <DebugFlag> + <trace>0</trace> + <periodic>1</periodic> + <aLwin>0</aLwin> + <aCover>0</aCover> + <aSer1>0</aSer1> + <aSer2>0</aSer2> + <aPa>0</aPa> + <viewmode>0</viewmode> + <vrSel>0</vrSel> + <aSym>0</aSym> + <aTbox>0</aTbox> + <AscS1>0</AscS1> + <AscS2>0</AscS2> + <AscS3>0</AscS3> + <aSer3>0</aSer3> + <eProf>0</eProf> + <aLa>0</aLa> + <aPa1>0</aPa1> + <AscS4>0</AscS4> + <aSer4>0</aSer4> + <StkLoc>0</StkLoc> + <TrcWin>0</TrcWin> + <newCpu>0</newCpu> + <uProt>0</uProt> + </DebugFlag> + <Tracepoint> + <THDelay>0</THDelay> + </Tracepoint> + <LintExecutable></LintExecutable> + <LintConfigFile></LintConfigFile> + </TargetOption> + </Target> + + <Group> + <GroupName>Startup</GroupName> + <tvExp>1</tvExp> + <tvExpOptDlg>0</tvExpOptDlg> + <cbSel>0</cbSel> + <RteFlg>0</RteFlg> + <File> + <GroupNumber>1</GroupNumber> + <FileNumber>1</FileNumber> + <FileType>2</FileType> + <tvExp>0</tvExp> + <Focus>0</Focus> + <ColumnNumber>0</ColumnNumber> + <tvExpOptDlg>0</tvExpOptDlg> + <TopLine>0</TopLine> + <CurrentLine>0</CurrentLine> + <bDave2>0</bDave2> + <PathWithFileName>..\..\..\..\software\cmsis\Device\ARM\CMSDK_CM0\Source\ARM\startup_CMSDK_CM0.s</PathWithFileName> + <FilenameWithoutPath>startup_CMSDK_CM0.s</FilenameWithoutPath> + <RteFlg>0</RteFlg> + <bShared>0</bShared> + </File> + </Group> + + <Group> + <GroupName>Application</GroupName> + <tvExp>1</tvExp> + <tvExpOptDlg>0</tvExpOptDlg> + <cbSel>0</cbSel> + <RteFlg>0</RteFlg> + <File> + <GroupNumber>2</GroupNumber> + <FileNumber>2</FileNumber> + <FileType>1</FileType> + <tvExp>0</tvExp> + <Focus>0</Focus> + <ColumnNumber>0</ColumnNumber> + <tvExpOptDlg>0</tvExpOptDlg> + <TopLine>0</TopLine> + <CurrentLine>0</CurrentLine> + <bDave2>0</bDave2> + <PathWithFileName>..\..\..\..\software\common\validation\dma_tests.c</PathWithFileName> + <FilenameWithoutPath>dma_tests.c</FilenameWithoutPath> + <RteFlg>0</RteFlg> + <bShared>0</bShared> + </File> + <File> + <GroupNumber>2</GroupNumber> + <FileNumber>3</FileNumber> + <FileType>1</FileType> + <tvExp>0</tvExp> + <Focus>0</Focus> + <ColumnNumber>0</ColumnNumber> + <tvExpOptDlg>0</tvExpOptDlg> + <TopLine>0</TopLine> + <CurrentLine>0</CurrentLine> + <bDave2>0</bDave2> + <PathWithFileName>..\..\..\..\software\common\retarget\retarget.c</PathWithFileName> + <FilenameWithoutPath>retarget.c</FilenameWithoutPath> + <RteFlg>0</RteFlg> + <bShared>0</bShared> + </File> + <File> + <GroupNumber>2</GroupNumber> + <FileNumber>4</FileNumber> + <FileType>1</FileType> + <tvExp>0</tvExp> + <Focus>0</Focus> + <ColumnNumber>0</ColumnNumber> + <tvExpOptDlg>0</tvExpOptDlg> + <TopLine>0</TopLine> + <CurrentLine>0</CurrentLine> + <bDave2>0</bDave2> + <PathWithFileName>..\..\..\..\software\common\retarget\uart_stdout.c</PathWithFileName> + <FilenameWithoutPath>uart_stdout.c</FilenameWithoutPath> + <RteFlg>0</RteFlg> + <bShared>0</bShared> + </File> + </Group> + + <Group> + <GroupName>System</GroupName> + <tvExp>1</tvExp> + <tvExpOptDlg>0</tvExpOptDlg> + <cbSel>0</cbSel> + <RteFlg>0</RteFlg> + <File> + <GroupNumber>3</GroupNumber> + <FileNumber>5</FileNumber> + <FileType>1</FileType> + <tvExp>0</tvExp> + <Focus>0</Focus> + <ColumnNumber>0</ColumnNumber> + <tvExpOptDlg>0</tvExpOptDlg> + <TopLine>0</TopLine> + <CurrentLine>0</CurrentLine> + <bDave2>0</bDave2> + <PathWithFileName>..\..\..\..\software\cmsis\Device\ARM\CMSDK_CM0\Source\system_CMSDK_CM0.c</PathWithFileName> + <FilenameWithoutPath>system_CMSDK_CM0.c</FilenameWithoutPath> + <RteFlg>0</RteFlg> + <bShared>0</bShared> + </File> + </Group> + +</ProjectOpt> diff --git a/Cortex-M0/nanosoc/systems/mcu/testcodes/dma_tests/dma_tests_cm0.uvproj b/Cortex-M0/nanosoc/systems/mcu/testcodes/dma_tests/dma_tests_cm0.uvproj new file mode 100644 index 0000000..7487889 --- /dev/null +++ b/Cortex-M0/nanosoc/systems/mcu/testcodes/dma_tests/dma_tests_cm0.uvproj @@ -0,0 +1,435 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no" ?> +<Project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="project_proj.xsd"> + + <SchemaVersion>1.1</SchemaVersion> + + <Header>### uVision Project, (C) Keil Software</Header> + + <Targets> + <Target> + <TargetName>Debug</TargetName> + <ToolsetNumber>0x4</ToolsetNumber> + <ToolsetName>ARM-ADS</ToolsetName> + <TargetOption> + <TargetCommonOption> + <Device>Cortex-M0</Device> + <Vendor>ARM</Vendor> + <Cpu>CLOCK(12000000) CPUTYPE("Cortex-M0") ESEL ELITTLE</Cpu> + <FlashUtilSpec></FlashUtilSpec> + <StartupFile></StartupFile> + <FlashDriverDll></FlashDriverDll> + <DeviceId>4803</DeviceId> + <RegisterFile></RegisterFile> + <MemoryEnv></MemoryEnv> + <Cmp></Cmp> + <Asm></Asm> + <Linker></Linker> + <OHString></OHString> + <InfinionOptionDll></InfinionOptionDll> + <SLE66CMisc></SLE66CMisc> + <SLE66AMisc></SLE66AMisc> + <SLE66LinkerMisc></SLE66LinkerMisc> + <SFDFile></SFDFile> + <UseEnv>0</UseEnv> + <BinPath></BinPath> + <IncludePath></IncludePath> + <LibPath></LibPath> + <RegisterFilePath></RegisterFilePath> + <DBRegisterFilePath></DBRegisterFilePath> + <TargetStatus> + <Error>0</Error> + <ExitCodeStop>0</ExitCodeStop> + <ButtonStop>0</ButtonStop> + <NotGenerated>0</NotGenerated> + <InvalidFlash>1</InvalidFlash> + </TargetStatus> + <OutputDirectory>.\</OutputDirectory> + <OutputName>dma_tests</OutputName> + <CreateExecutable>1</CreateExecutable> + <CreateLib>0</CreateLib> + <CreateHexFile>0</CreateHexFile> + <DebugInformation>1</DebugInformation> + <BrowseInformation>1</BrowseInformation> + <ListingPath>.\</ListingPath> + <HexFormatSelection>1</HexFormatSelection> + <Merge32K>0</Merge32K> + <CreateBatchFile>0</CreateBatchFile> + <BeforeCompile> + <RunUserProg1>0</RunUserProg1> + <RunUserProg2>0</RunUserProg2> + <UserProg1Name></UserProg1Name> + <UserProg2Name></UserProg2Name> + <UserProg1Dos16Mode>0</UserProg1Dos16Mode> + <UserProg2Dos16Mode>0</UserProg2Dos16Mode> + <nStopU1X>0</nStopU1X> + <nStopU2X>0</nStopU2X> + </BeforeCompile> + <BeforeMake> + <RunUserProg1>0</RunUserProg1> + <RunUserProg2>0</RunUserProg2> + <UserProg1Name></UserProg1Name> + <UserProg2Name></UserProg2Name> + <UserProg1Dos16Mode>0</UserProg1Dos16Mode> + <UserProg2Dos16Mode>0</UserProg2Dos16Mode> + </BeforeMake> + <AfterMake> + <RunUserProg1>1</RunUserProg1> + <RunUserProg2>0</RunUserProg2> + <UserProg1Name>$K\ARM\ARMCC\BIN\fromelf.exe #L --vhx --8x1 --output dma_tests.hex</UserProg1Name> + <UserProg2Name></UserProg2Name> + <UserProg1Dos16Mode>0</UserProg1Dos16Mode> + <UserProg2Dos16Mode>0</UserProg2Dos16Mode> + </AfterMake> + <SelectedForBatchBuild>0</SelectedForBatchBuild> + <SVCSIdString></SVCSIdString> + </TargetCommonOption> + <CommonProperty> + <UseCPPCompiler>0</UseCPPCompiler> + <RVCTCodeConst>0</RVCTCodeConst> + <RVCTZI>0</RVCTZI> + <RVCTOtherData>0</RVCTOtherData> + <ModuleSelection>0</ModuleSelection> + <IncludeInBuild>1</IncludeInBuild> + <AlwaysBuild>0</AlwaysBuild> + <GenerateAssemblyFile>0</GenerateAssemblyFile> + <AssembleAssemblyFile>0</AssembleAssemblyFile> + <PublicsOnly>0</PublicsOnly> + <StopOnExitCode>3</StopOnExitCode> + <CustomArgument></CustomArgument> + <IncludeLibraryModules></IncludeLibraryModules> + </CommonProperty> + <DllOption> + <SimDllName>SARMCM3.DLL</SimDllName> + <SimDllArguments></SimDllArguments> + <SimDlgDll>DARMCM1.DLL</SimDlgDll> + <SimDlgDllArguments></SimDlgDllArguments> + <TargetDllName>SARMCM3.DLL</TargetDllName> + <TargetDllArguments></TargetDllArguments> + <TargetDlgDll>TARMCM1.DLL</TargetDlgDll> + <TargetDlgDllArguments></TargetDlgDllArguments> + </DllOption> + <DebugOption> + <OPTHX> + <HexSelection>1</HexSelection> + <HexRangeLowAddress>0</HexRangeLowAddress> + <HexRangeHighAddress>0</HexRangeHighAddress> + <HexOffset>0</HexOffset> + <Oh166RecLen>16</Oh166RecLen> + </OPTHX> + <Simulator> + <UseSimulator>1</UseSimulator> + <LoadApplicationAtStartup>1</LoadApplicationAtStartup> + <RunToMain>1</RunToMain> + <RestoreBreakpoints>1</RestoreBreakpoints> + <RestoreWatchpoints>1</RestoreWatchpoints> + <RestoreMemoryDisplay>1</RestoreMemoryDisplay> + <RestoreFunctions>1</RestoreFunctions> + <RestoreToolbox>1</RestoreToolbox> + <LimitSpeedToRealTime>0</LimitSpeedToRealTime> + </Simulator> + <Target> + <UseTarget>0</UseTarget> + <LoadApplicationAtStartup>1</LoadApplicationAtStartup> + <RunToMain>0</RunToMain> + <RestoreBreakpoints>1</RestoreBreakpoints> + <RestoreWatchpoints>1</RestoreWatchpoints> + <RestoreMemoryDisplay>1</RestoreMemoryDisplay> + <RestoreFunctions>0</RestoreFunctions> + <RestoreToolbox>1</RestoreToolbox> + <RestoreTracepoints>0</RestoreTracepoints> + </Target> + <RunDebugAfterBuild>0</RunDebugAfterBuild> + <TargetSelection>-1</TargetSelection> + <SimDlls> + <CpuDll></CpuDll> + <CpuDllArguments></CpuDllArguments> + <PeripheralDll></PeripheralDll> + <PeripheralDllArguments></PeripheralDllArguments> + <InitializationFile></InitializationFile> + </SimDlls> + <TargetDlls> + <CpuDll></CpuDll> + <CpuDllArguments></CpuDllArguments> + <PeripheralDll></PeripheralDll> + <PeripheralDllArguments></PeripheralDllArguments> + <InitializationFile></InitializationFile> + <Driver></Driver> + </TargetDlls> + </DebugOption> + <Utilities> + <Flash1> + <UseTargetDll>0</UseTargetDll> + <UseExternalTool>0</UseExternalTool> + <RunIndependent>0</RunIndependent> + <UpdateFlashBeforeDebugging>0</UpdateFlashBeforeDebugging> + <Capability>0</Capability> + <DriverSelection>-1</DriverSelection> + </Flash1> + <Flash2></Flash2> + <Flash3></Flash3> + <Flash4></Flash4> + </Utilities> + <TargetArmAds> + <ArmAdsMisc> + <GenerateListings>0</GenerateListings> + <asHll>1</asHll> + <asAsm>1</asAsm> + <asMacX>1</asMacX> + <asSyms>1</asSyms> + <asFals>1</asFals> + <asDbgD>1</asDbgD> + <asForm>1</asForm> + <ldLst>0</ldLst> + <ldmm>1</ldmm> + <ldXref>1</ldXref> + <BigEnd>0</BigEnd> + <AdsALst>1</AdsALst> + <AdsACrf>1</AdsACrf> + <AdsANop>0</AdsANop> + <AdsANot>0</AdsANot> + <AdsLLst>1</AdsLLst> + <AdsLmap>1</AdsLmap> + <AdsLcgr>1</AdsLcgr> + <AdsLsym>1</AdsLsym> + <AdsLszi>1</AdsLszi> + <AdsLtoi>1</AdsLtoi> + <AdsLsun>1</AdsLsun> + <AdsLven>1</AdsLven> + <AdsLsxf>1</AdsLsxf> + <RvctClst>0</RvctClst> + <GenPPlst>0</GenPPlst> + <AdsCpuType>"Cortex-M0"</AdsCpuType> + <RvctDeviceName></RvctDeviceName> + <mOS>0</mOS> + <uocRom>0</uocRom> + <uocRam>0</uocRam> + <hadIROM>0</hadIROM> + <hadIRAM>0</hadIRAM> + <hadXRAM>0</hadXRAM> + <uocXRam>0</uocXRam> + <RvdsVP>0</RvdsVP> + <hadIRAM2>0</hadIRAM2> + <hadIROM2>0</hadIROM2> + <StupSel>1</StupSel> + <useUlib>0</useUlib> + <EndSel>1</EndSel> + <uLtcg>0</uLtcg> + <RoSelD>0</RoSelD> + <RwSelD>5</RwSelD> + <CodeSel>0</CodeSel> + <OptFeed>0</OptFeed> + <NoZi1>0</NoZi1> + <NoZi2>0</NoZi2> + <NoZi3>0</NoZi3> + <NoZi4>0</NoZi4> + <NoZi5>0</NoZi5> + <Ro1Chk>1</Ro1Chk> + <Ro2Chk>0</Ro2Chk> + <Ro3Chk>0</Ro3Chk> + <Ir1Chk>0</Ir1Chk> + <Ir2Chk>0</Ir2Chk> + <Ra1Chk>1</Ra1Chk> + <Ra2Chk>0</Ra2Chk> + <Ra3Chk>0</Ra3Chk> + <Im1Chk>0</Im1Chk> + <Im2Chk>0</Im2Chk> + <OnChipMemories> + <Ocm1> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </Ocm1> + <Ocm2> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </Ocm2> + <Ocm3> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </Ocm3> + <Ocm4> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </Ocm4> + <Ocm5> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </Ocm5> + <Ocm6> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </Ocm6> + <IRAM> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </IRAM> + <IROM> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </IROM> + <XRAM> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </XRAM> + <OCR_RVCT1> + <Type>1</Type> + <StartAddress>0x0</StartAddress> + <Size>0x10000</Size> + </OCR_RVCT1> + <OCR_RVCT2> + <Type>1</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </OCR_RVCT2> + <OCR_RVCT3> + <Type>1</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </OCR_RVCT3> + <OCR_RVCT4> + <Type>1</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </OCR_RVCT4> + <OCR_RVCT5> + <Type>1</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </OCR_RVCT5> + <OCR_RVCT6> + <Type>0</Type> + <StartAddress>0x20000000</StartAddress> + <Size>0x10000</Size> + </OCR_RVCT6> + <OCR_RVCT7> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </OCR_RVCT7> + <OCR_RVCT8> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </OCR_RVCT8> + <OCR_RVCT9> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </OCR_RVCT9> + <OCR_RVCT10> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </OCR_RVCT10> + </OnChipMemories> + <RvctStartVector></RvctStartVector> + </ArmAdsMisc> + <Cads> + <interw>1</interw> + <Optim>3</Optim> + <oTime>0</oTime> + <SplitLS>0</SplitLS> + <OneElfS>0</OneElfS> + <Strict>0</Strict> + <EnumInt>0</EnumInt> + <PlainCh>0</PlainCh> + <Ropi>0</Ropi> + <Rwpi>0</Rwpi> + <wLevel>0</wLevel> + <uThumb>0</uThumb> + <uSurpInc>0</uSurpInc> + <VariousControls> + <MiscControls></MiscControls> + <Define>CORTEX_M0</Define> + <Undefine></Undefine> + <IncludePath>..\..\..\..\software\cmsis\CMSIS\Include; ..\..\..\..\software\cmsis\Device\ARM\CMSDK_CM0\Include; ..\..\..\..\software\common\retarget; ..\generic</IncludePath> + </VariousControls> + </Cads> + <Aads> + <interw>1</interw> + <Ropi>0</Ropi> + <Rwpi>0</Rwpi> + <thumb>0</thumb> + <SplitLS>0</SplitLS> + <SwStkChk>0</SwStkChk> + <NoWarn>0</NoWarn> + <uSurpInc>0</uSurpInc> + <VariousControls> + <MiscControls></MiscControls> + <Define></Define> + <Undefine></Undefine> + <IncludePath></IncludePath> + </VariousControls> + </Aads> + <LDads> + <umfTarg>1</umfTarg> + <Ropi>0</Ropi> + <Rwpi>0</Rwpi> + <noStLib>0</noStLib> + <RepFail>1</RepFail> + <useFile>0</useFile> + <TextAddressRange>0x00000000</TextAddressRange> + <DataAddressRange>0x00000000</DataAddressRange> + <ScatterFile></ScatterFile> + <IncludeLibs></IncludeLibs> + <IncludeLibsPath></IncludeLibsPath> + <Misc></Misc> + <LinkerInputFile></LinkerInputFile> + <DisabledWarnings></DisabledWarnings> + </LDads> + </TargetArmAds> + </TargetOption> + <Groups> + <Group> + <GroupName>Startup</GroupName> + <Files> + <File> + <FileName>startup_CMSDK_CM0.s</FileName> + <FileType>2</FileType> + <FilePath>..\..\..\..\software\cmsis\Device\ARM\CMSDK_CM0\Source\ARM\startup_CMSDK_CM0.s</FilePath> + </File> + </Files> + </Group> + <Group> + <GroupName>Application</GroupName> + <Files> + <File> + <FileName>dma_tests.c</FileName> + <FileType>1</FileType> + <FilePath>..\..\..\..\software\common\validation\dma_tests.c</FilePath> + </File> + <File> + <FileName>retarget.c</FileName> + <FileType>1</FileType> + <FilePath>..\..\..\..\software\common\retarget\retarget.c</FilePath> + </File> + <File> + <FileName>uart_stdout.c</FileName> + <FileType>1</FileType> + <FilePath>..\..\..\..\software\common\retarget\uart_stdout.c</FilePath> + </File> + </Files> + </Group> + <Group> + <GroupName>System</GroupName> + <Files> + <File> + <FileName>system_CMSDK_CM0.c</FileName> + <FileType>1</FileType> + <FilePath>..\..\..\..\software\cmsis\Device\ARM\CMSDK_CM0\Source\system_CMSDK_CM0.c</FilePath> + </File> + </Files> + </Group> + </Groups> + </Target> + </Targets> + +</Project> diff --git a/Cortex-M0/nanosoc/systems/mcu/testcodes/dma_tests/dma_tests_cm0p.uvopt b/Cortex-M0/nanosoc/systems/mcu/testcodes/dma_tests/dma_tests_cm0p.uvopt new file mode 100644 index 0000000..617768f --- /dev/null +++ b/Cortex-M0/nanosoc/systems/mcu/testcodes/dma_tests/dma_tests_cm0p.uvopt @@ -0,0 +1,244 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no" ?> +<ProjectOpt xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="project_opt.xsd"> + + <SchemaVersion>1.0</SchemaVersion> + + <Header>### uVision Project, (C) Keil Software</Header> + + <Extensions> + <cExt>*.c</cExt> + <aExt>*.s*; *.src; *.a*</aExt> + <oExt>*.obj</oExt> + <lExt>*.lib</lExt> + <tExt>*.txt; *.h; *.inc</tExt> + <pExt>*.plm</pExt> + <CppX>*.cpp</CppX> + </Extensions> + + <DaveTm> + <dwLowDateTime>0</dwLowDateTime> + <dwHighDateTime>0</dwHighDateTime> + </DaveTm> + + <Target> + <TargetName>Debug</TargetName> + <ToolsetNumber>0x4</ToolsetNumber> + <ToolsetName>ARM-ADS</ToolsetName> + <TargetOption> + <CLKADS>50000000</CLKADS> + <OPTTT> + <gFlags>1</gFlags> + <BeepAtEnd>1</BeepAtEnd> + <RunSim>1</RunSim> + <RunTarget>0</RunTarget> + </OPTTT> + <OPTHX> + <HexSelection>1</HexSelection> + <FlashByte>65535</FlashByte> + <HexRangeLowAddress>0</HexRangeLowAddress> + <HexRangeHighAddress>0</HexRangeHighAddress> + <HexOffset>0</HexOffset> + </OPTHX> + <OPTLEX> + <PageWidth>79</PageWidth> + <PageLength>66</PageLength> + <TabStop>8</TabStop> + <ListingPath>.\</ListingPath> + </OPTLEX> + <ListingPage> + <CreateCListing>1</CreateCListing> + <CreateAListing>1</CreateAListing> + <CreateLListing>1</CreateLListing> + <CreateIListing>0</CreateIListing> + <AsmCond>1</AsmCond> + <AsmSymb>1</AsmSymb> + <AsmXref>0</AsmXref> + <CCond>1</CCond> + <CCode>0</CCode> + <CListInc>0</CListInc> + <CSymb>0</CSymb> + <LinkerCodeListing>0</LinkerCodeListing> + </ListingPage> + <OPTXL> + <LMap>1</LMap> + <LComments>1</LComments> + <LGenerateSymbols>1</LGenerateSymbols> + <LLibSym>1</LLibSym> + <LLines>1</LLines> + <LLocSym>1</LLocSym> + <LPubSym>1</LPubSym> + <LXref>0</LXref> + <LExpSel>0</LExpSel> + </OPTXL> + <OPTFL> + <tvExp>1</tvExp> + <tvExpOptDlg>0</tvExpOptDlg> + <IsCurrentTarget>1</IsCurrentTarget> + </OPTFL> + <CpuCode>255</CpuCode> + <DllOpt> + <SimDllName>SARMCM3.DLL</SimDllName> + <SimDllArguments></SimDllArguments> + <SimDlgDllName>DARMCM1.DLL</SimDlgDllName> + <SimDlgDllArguments></SimDlgDllArguments> + <TargetDllName>SARMCM3.DLL</TargetDllName> + <TargetDllArguments></TargetDllArguments> + <TargetDlgDllName>TARMCM1.DLL</TargetDlgDllName> + <TargetDlgDllArguments></TargetDlgDllArguments> + </DllOpt> + <DebugOpt> + <uSim>1</uSim> + <uTrg>0</uTrg> + <sLdApp>1</sLdApp> + <sGomain>1</sGomain> + <sRbreak>1</sRbreak> + <sRwatch>1</sRwatch> + <sRmem>1</sRmem> + <sRfunc>1</sRfunc> + <sRbox>1</sRbox> + <tLdApp>1</tLdApp> + <tGomain>0</tGomain> + <tRbreak>1</tRbreak> + <tRwatch>1</tRwatch> + <tRmem>1</tRmem> + <tRfunc>0</tRfunc> + <tRbox>1</tRbox> + <sRunDeb>0</sRunDeb> + <sLrtime>0</sLrtime> + <nTsel>-1</nTsel> + <sDll></sDll> + <sDllPa></sDllPa> + <sDlgDll></sDlgDll> + <sDlgPa></sDlgPa> + <sIfile></sIfile> + <tDll></tDll> + <tDllPa></tDllPa> + <tDlgDll></tDlgDll> + <tDlgPa></tDlgPa> + <tIfile></tIfile> + <pMon></pMon> + </DebugOpt> + <Breakpoint/> + <DebugFlag> + <trace>0</trace> + <periodic>1</periodic> + <aLwin>0</aLwin> + <aCover>0</aCover> + <aSer1>0</aSer1> + <aSer2>0</aSer2> + <aPa>0</aPa> + <viewmode>0</viewmode> + <vrSel>0</vrSel> + <aSym>0</aSym> + <aTbox>0</aTbox> + <AscS1>0</AscS1> + <AscS2>0</AscS2> + <AscS3>0</AscS3> + <aSer3>0</aSer3> + <eProf>0</eProf> + <aLa>0</aLa> + <aPa1>0</aPa1> + <AscS4>0</AscS4> + <aSer4>0</aSer4> + <StkLoc>0</StkLoc> + <TrcWin>0</TrcWin> + <newCpu>0</newCpu> + <uProt>0</uProt> + </DebugFlag> + <LintExecutable></LintExecutable> + <LintConfigFile></LintConfigFile> + </TargetOption> + </Target> + + <Group> + <GroupName>Startup</GroupName> + <tvExp>1</tvExp> + <tvExpOptDlg>0</tvExpOptDlg> + <cbSel>0</cbSel> + <File> + <GroupNumber>1</GroupNumber> + <FileNumber>1</FileNumber> + <FileType>2</FileType> + <tvExp>0</tvExp> + <Focus>0</Focus> + <ColumnNumber>0</ColumnNumber> + <tvExpOptDlg>0</tvExpOptDlg> + <TopLine>0</TopLine> + <CurrentLine>0</CurrentLine> + <bDave2>0</bDave2> + <PathWithFileName>..\..\..\..\software\cmsis\Device\ARM\CMSDK_CM0plus\Source\ARM\startup_CMSDK_CM0plus.s</PathWithFileName> + <FilenameWithoutPath>startup_CMSDK_CM0plus.s</FilenameWithoutPath> + </File> + </Group> + + <Group> + <GroupName>Application</GroupName> + <tvExp>1</tvExp> + <tvExpOptDlg>0</tvExpOptDlg> + <cbSel>0</cbSel> + <File> + <GroupNumber>2</GroupNumber> + <FileNumber>2</FileNumber> + <FileType>1</FileType> + <tvExp>0</tvExp> + <Focus>0</Focus> + <ColumnNumber>0</ColumnNumber> + <tvExpOptDlg>0</tvExpOptDlg> + <TopLine>0</TopLine> + <CurrentLine>0</CurrentLine> + <bDave2>0</bDave2> + <PathWithFileName>..\..\..\..\software\common\validation\dma_tests.c</PathWithFileName> + <FilenameWithoutPath>dma_tests.c</FilenameWithoutPath> + </File> + <File> + <GroupNumber>2</GroupNumber> + <FileNumber>3</FileNumber> + <FileType>1</FileType> + <tvExp>0</tvExp> + <Focus>0</Focus> + <ColumnNumber>0</ColumnNumber> + <tvExpOptDlg>0</tvExpOptDlg> + <TopLine>0</TopLine> + <CurrentLine>0</CurrentLine> + <bDave2>0</bDave2> + <PathWithFileName>..\..\..\..\software\common\retarget\retarget.c</PathWithFileName> + <FilenameWithoutPath>retarget.c</FilenameWithoutPath> + </File> + <File> + <GroupNumber>2</GroupNumber> + <FileNumber>4</FileNumber> + <FileType>1</FileType> + <tvExp>0</tvExp> + <Focus>0</Focus> + <ColumnNumber>0</ColumnNumber> + <tvExpOptDlg>0</tvExpOptDlg> + <TopLine>0</TopLine> + <CurrentLine>0</CurrentLine> + <bDave2>0</bDave2> + <PathWithFileName>..\..\..\..\software\common\retarget\uart_stdout.c</PathWithFileName> + <FilenameWithoutPath>uart_stdout.c</FilenameWithoutPath> + </File> + </Group> + + <Group> + <GroupName>System</GroupName> + <tvExp>1</tvExp> + <tvExpOptDlg>0</tvExpOptDlg> + <cbSel>0</cbSel> + <File> + <GroupNumber>3</GroupNumber> + <FileNumber>5</FileNumber> + <FileType>1</FileType> + <tvExp>0</tvExp> + <Focus>0</Focus> + <ColumnNumber>0</ColumnNumber> + <tvExpOptDlg>0</tvExpOptDlg> + <TopLine>0</TopLine> + <CurrentLine>0</CurrentLine> + <bDave2>0</bDave2> + <PathWithFileName>..\..\..\..\software\cmsis\Device\ARM\CMSDK_CM0plus\Source\system_CMSDK_CM0plus.c</PathWithFileName> + <FilenameWithoutPath>system_CMSDK_CM0plus.c</FilenameWithoutPath> + </File> + </Group> + +</ProjectOpt> diff --git a/Cortex-M0/nanosoc/systems/mcu/testcodes/dma_tests/dma_tests_cm0p.uvproj b/Cortex-M0/nanosoc/systems/mcu/testcodes/dma_tests/dma_tests_cm0p.uvproj new file mode 100644 index 0000000..b453d95 --- /dev/null +++ b/Cortex-M0/nanosoc/systems/mcu/testcodes/dma_tests/dma_tests_cm0p.uvproj @@ -0,0 +1,432 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no" ?> +<Project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="project_proj.xsd"> + + <SchemaVersion>1.1</SchemaVersion> + + <Header>### uVision Project, (C) Keil Software</Header> + + <Targets> + <Target> + <TargetName>Debug</TargetName> + <ToolsetNumber>0x4</ToolsetNumber> + <ToolsetName>ARM-ADS</ToolsetName> + <TargetOption> + <TargetCommonOption> + <Device>Cortex-M0+</Device> + <Vendor>ARM</Vendor> + <Cpu>CLOCK(12000000) CPUTYPE("Cortex-M0+") ESEL ELITTLE</Cpu> + <FlashUtilSpec></FlashUtilSpec> + <StartupFile></StartupFile> + <FlashDriverDll></FlashDriverDll> + <DeviceId>6268</DeviceId> + <RegisterFile></RegisterFile> + <MemoryEnv></MemoryEnv> + <Cmp></Cmp> + <Asm></Asm> + <Linker></Linker> + <OHString></OHString> + <InfinionOptionDll></InfinionOptionDll> + <SLE66CMisc></SLE66CMisc> + <SLE66AMisc></SLE66AMisc> + <SLE66LinkerMisc></SLE66LinkerMisc> + <SFDFile></SFDFile> + <UseEnv>0</UseEnv> + <BinPath></BinPath> + <IncludePath></IncludePath> + <LibPath></LibPath> + <RegisterFilePath></RegisterFilePath> + <DBRegisterFilePath></DBRegisterFilePath> + <TargetStatus> + <Error>0</Error> + <ExitCodeStop>0</ExitCodeStop> + <ButtonStop>0</ButtonStop> + <NotGenerated>0</NotGenerated> + <InvalidFlash>1</InvalidFlash> + </TargetStatus> + <OutputDirectory>.\</OutputDirectory> + <OutputName>dma_tests</OutputName> + <CreateExecutable>1</CreateExecutable> + <CreateLib>0</CreateLib> + <CreateHexFile>0</CreateHexFile> + <DebugInformation>1</DebugInformation> + <BrowseInformation>1</BrowseInformation> + <ListingPath>.\</ListingPath> + <HexFormatSelection>1</HexFormatSelection> + <Merge32K>0</Merge32K> + <CreateBatchFile>0</CreateBatchFile> + <BeforeCompile> + <RunUserProg1>0</RunUserProg1> + <RunUserProg2>0</RunUserProg2> + <UserProg1Name></UserProg1Name> + <UserProg2Name></UserProg2Name> + <UserProg1Dos16Mode>0</UserProg1Dos16Mode> + <UserProg2Dos16Mode>0</UserProg2Dos16Mode> + <nStopU1X>0</nStopU1X> + <nStopU2X>0</nStopU2X> + </BeforeCompile> + <BeforeMake> + <RunUserProg1>0</RunUserProg1> + <RunUserProg2>0</RunUserProg2> + <UserProg1Name></UserProg1Name> + <UserProg2Name></UserProg2Name> + <UserProg1Dos16Mode>0</UserProg1Dos16Mode> + <UserProg2Dos16Mode>0</UserProg2Dos16Mode> + </BeforeMake> + <AfterMake> + <RunUserProg1>1</RunUserProg1> + <RunUserProg2>0</RunUserProg2> + <UserProg1Name>$K\ARM\ARMCC\BIN\fromelf.exe #L --vhx --8x1 --output dma_tests.hex</UserProg1Name> + <UserProg2Name></UserProg2Name> + <UserProg1Dos16Mode>0</UserProg1Dos16Mode> + <UserProg2Dos16Mode>0</UserProg2Dos16Mode> + </AfterMake> + <SelectedForBatchBuild>0</SelectedForBatchBuild> + <SVCSIdString></SVCSIdString> + </TargetCommonOption> + <CommonProperty> + <UseCPPCompiler>0</UseCPPCompiler> + <RVCTCodeConst>0</RVCTCodeConst> + <RVCTZI>0</RVCTZI> + <RVCTOtherData>0</RVCTOtherData> + <ModuleSelection>0</ModuleSelection> + <IncludeInBuild>1</IncludeInBuild> + <AlwaysBuild>0</AlwaysBuild> + <GenerateAssemblyFile>0</GenerateAssemblyFile> + <AssembleAssemblyFile>0</AssembleAssemblyFile> + <PublicsOnly>0</PublicsOnly> + <StopOnExitCode>3</StopOnExitCode> + <CustomArgument></CustomArgument> + <IncludeLibraryModules></IncludeLibraryModules> + </CommonProperty> + <DllOption> + <SimDllName>SARMCM3.DLL</SimDllName> + <SimDllArguments></SimDllArguments> + <SimDlgDll>DARMCM1.DLL</SimDlgDll> + <SimDlgDllArguments></SimDlgDllArguments> + <TargetDllName>SARMCM3.DLL</TargetDllName> + <TargetDllArguments></TargetDllArguments> + <TargetDlgDll>TARMCM1.DLL</TargetDlgDll> + <TargetDlgDllArguments></TargetDlgDllArguments> + </DllOption> + <DebugOption> + <OPTHX> + <HexSelection>1</HexSelection> + <HexRangeLowAddress>0</HexRangeLowAddress> + <HexRangeHighAddress>0</HexRangeHighAddress> + <HexOffset>0</HexOffset> + <Oh166RecLen>16</Oh166RecLen> + </OPTHX> + <Simulator> + <UseSimulator>1</UseSimulator> + <LoadApplicationAtStartup>1</LoadApplicationAtStartup> + <RunToMain>1</RunToMain> + <RestoreBreakpoints>1</RestoreBreakpoints> + <RestoreWatchpoints>1</RestoreWatchpoints> + <RestoreMemoryDisplay>1</RestoreMemoryDisplay> + <RestoreFunctions>1</RestoreFunctions> + <RestoreToolbox>1</RestoreToolbox> + <LimitSpeedToRealTime>0</LimitSpeedToRealTime> + </Simulator> + <Target> + <UseTarget>0</UseTarget> + <LoadApplicationAtStartup>1</LoadApplicationAtStartup> + <RunToMain>0</RunToMain> + <RestoreBreakpoints>1</RestoreBreakpoints> + <RestoreWatchpoints>1</RestoreWatchpoints> + <RestoreMemoryDisplay>1</RestoreMemoryDisplay> + <RestoreFunctions>0</RestoreFunctions> + <RestoreToolbox>1</RestoreToolbox> + </Target> + <RunDebugAfterBuild>0</RunDebugAfterBuild> + <TargetSelection>-1</TargetSelection> + <SimDlls> + <CpuDll></CpuDll> + <CpuDllArguments></CpuDllArguments> + <PeripheralDll></PeripheralDll> + <PeripheralDllArguments></PeripheralDllArguments> + <InitializationFile></InitializationFile> + </SimDlls> + <TargetDlls> + <CpuDll></CpuDll> + <CpuDllArguments></CpuDllArguments> + <PeripheralDll></PeripheralDll> + <PeripheralDllArguments></PeripheralDllArguments> + <InitializationFile></InitializationFile> + <Driver></Driver> + </TargetDlls> + </DebugOption> + <Utilities> + <Flash1> + <UseTargetDll>0</UseTargetDll> + <UseExternalTool>0</UseExternalTool> + <RunIndependent>0</RunIndependent> + <UpdateFlashBeforeDebugging>0</UpdateFlashBeforeDebugging> + <Capability>0</Capability> + <DriverSelection>-1</DriverSelection> + </Flash1> + <Flash2></Flash2> + <Flash3></Flash3> + <Flash4></Flash4> + </Utilities> + <TargetArmAds> + <ArmAdsMisc> + <GenerateListings>0</GenerateListings> + <asHll>1</asHll> + <asAsm>1</asAsm> + <asMacX>1</asMacX> + <asSyms>1</asSyms> + <asFals>1</asFals> + <asDbgD>1</asDbgD> + <asForm>1</asForm> + <ldLst>0</ldLst> + <ldmm>1</ldmm> + <ldXref>1</ldXref> + <BigEnd>0</BigEnd> + <AdsALst>1</AdsALst> + <AdsACrf>1</AdsACrf> + <AdsANop>0</AdsANop> + <AdsANot>0</AdsANot> + <AdsLLst>1</AdsLLst> + <AdsLmap>1</AdsLmap> + <AdsLcgr>1</AdsLcgr> + <AdsLsym>1</AdsLsym> + <AdsLszi>1</AdsLszi> + <AdsLtoi>1</AdsLtoi> + <AdsLsun>1</AdsLsun> + <AdsLven>1</AdsLven> + <AdsLsxf>1</AdsLsxf> + <RvctClst>0</RvctClst> + <GenPPlst>0</GenPPlst> + <AdsCpuType>"Cortex-M0+"</AdsCpuType> + <RvctDeviceName></RvctDeviceName> + <mOS>0</mOS> + <uocRom>0</uocRom> + <uocRam>0</uocRam> + <hadIROM>0</hadIROM> + <hadIRAM>0</hadIRAM> + <hadXRAM>0</hadXRAM> + <uocXRam>0</uocXRam> + <RvdsVP>0</RvdsVP> + <hadIRAM2>0</hadIRAM2> + <hadIROM2>0</hadIROM2> + <StupSel>1</StupSel> + <useUlib>0</useUlib> + <EndSel>1</EndSel> + <uLtcg>0</uLtcg> + <RoSelD>0</RoSelD> + <RwSelD>5</RwSelD> + <CodeSel>0</CodeSel> + <OptFeed>0</OptFeed> + <NoZi1>0</NoZi1> + <NoZi2>0</NoZi2> + <NoZi3>0</NoZi3> + <NoZi4>0</NoZi4> + <NoZi5>0</NoZi5> + <Ro1Chk>1</Ro1Chk> + <Ro2Chk>0</Ro2Chk> + <Ro3Chk>0</Ro3Chk> + <Ir1Chk>0</Ir1Chk> + <Ir2Chk>0</Ir2Chk> + <Ra1Chk>1</Ra1Chk> + <Ra2Chk>0</Ra2Chk> + <Ra3Chk>0</Ra3Chk> + <Im1Chk>0</Im1Chk> + <Im2Chk>0</Im2Chk> + <OnChipMemories> + <Ocm1> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </Ocm1> + <Ocm2> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </Ocm2> + <Ocm3> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </Ocm3> + <Ocm4> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </Ocm4> + <Ocm5> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </Ocm5> + <Ocm6> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </Ocm6> + <IRAM> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </IRAM> + <IROM> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </IROM> + <XRAM> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </XRAM> + <OCR_RVCT1> + <Type>1</Type> + <StartAddress>0x0</StartAddress> + <Size>0x10000</Size> + </OCR_RVCT1> + <OCR_RVCT2> + <Type>1</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </OCR_RVCT2> + <OCR_RVCT3> + <Type>1</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </OCR_RVCT3> + <OCR_RVCT4> + <Type>1</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </OCR_RVCT4> + <OCR_RVCT5> + <Type>1</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </OCR_RVCT5> + <OCR_RVCT6> + <Type>0</Type> + <StartAddress>0x20000000</StartAddress> + <Size>0x10000</Size> + </OCR_RVCT6> + <OCR_RVCT7> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </OCR_RVCT7> + <OCR_RVCT8> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </OCR_RVCT8> + <OCR_RVCT9> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </OCR_RVCT9> + <OCR_RVCT10> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </OCR_RVCT10> + </OnChipMemories> + <RvctStartVector></RvctStartVector> + </ArmAdsMisc> + <Cads> + <interw>1</interw> + <Optim>3</Optim> + <oTime>0</oTime> + <SplitLS>0</SplitLS> + <OneElfS>0</OneElfS> + <Strict>0</Strict> + <EnumInt>0</EnumInt> + <PlainCh>0</PlainCh> + <Ropi>0</Ropi> + <Rwpi>0</Rwpi> + <wLevel>0</wLevel> + <uThumb>0</uThumb> + <VariousControls> + <MiscControls></MiscControls> + <Define>CORTEX_M0PLUS</Define> + <Undefine></Undefine> + <IncludePath>..\..\..\..\software\cmsis\CMSIS\Include; ..\..\..\..\software\cmsis\Device\ARM\CMSDK_CM0plus\Include; ..\..\..\..\software\common\retarget; ..\generic</IncludePath> + </VariousControls> + </Cads> + <Aads> + <interw>1</interw> + <Ropi>0</Ropi> + <Rwpi>0</Rwpi> + <thumb>0</thumb> + <SplitLS>0</SplitLS> + <SwStkChk>0</SwStkChk> + <NoWarn>0</NoWarn> + <VariousControls> + <MiscControls></MiscControls> + <Define></Define> + <Undefine></Undefine> + <IncludePath></IncludePath> + </VariousControls> + </Aads> + <LDads> + <umfTarg>1</umfTarg> + <Ropi>0</Ropi> + <Rwpi>0</Rwpi> + <noStLib>0</noStLib> + <RepFail>1</RepFail> + <useFile>0</useFile> + <TextAddressRange>0x00000000</TextAddressRange> + <DataAddressRange>0x00000000</DataAddressRange> + <ScatterFile></ScatterFile> + <IncludeLibs></IncludeLibs> + <IncludeLibsPath></IncludeLibsPath> + <Misc></Misc> + <LinkerInputFile></LinkerInputFile> + <DisabledWarnings></DisabledWarnings> + </LDads> + </TargetArmAds> + </TargetOption> + <Groups> + <Group> + <GroupName>Startup</GroupName> + <Files> + <File> + <FileName>startup_CMSDK_CM0plus.s</FileName> + <FileType>2</FileType> + <FilePath>..\..\..\..\software\cmsis\Device\ARM\CMSDK_CM0plus\Source\ARM\startup_CMSDK_CM0plus.s</FilePath> + </File> + </Files> + </Group> + <Group> + <GroupName>Application</GroupName> + <Files> + <File> + <FileName>dma_tests.c</FileName> + <FileType>1</FileType> + <FilePath>..\..\..\..\software\common\validation\dma_tests.c</FilePath> + </File> + <File> + <FileName>retarget.c</FileName> + <FileType>1</FileType> + <FilePath>..\..\..\..\software\common\retarget\retarget.c</FilePath> + </File> + <File> + <FileName>uart_stdout.c</FileName> + <FileType>1</FileType> + <FilePath>..\..\..\..\software\common\retarget\uart_stdout.c</FilePath> + </File> + </Files> + </Group> + <Group> + <GroupName>System</GroupName> + <Files> + <File> + <FileName>system_CMSDK_CM0plus.c</FileName> + <FileType>1</FileType> + <FilePath>..\..\..\..\software\cmsis\Device\ARM\CMSDK_CM0plus\Source\system_CMSDK_CM0plus.c</FilePath> + </File> + </Files> + </Group> + </Groups> + </Target> + </Targets> + +</Project> diff --git a/Cortex-M0/nanosoc/systems/mcu/testcodes/dma_tests/makefile b/Cortex-M0/nanosoc/systems/mcu/testcodes/dma_tests/makefile new file mode 100644 index 0000000..c4aff4d --- /dev/null +++ b/Cortex-M0/nanosoc/systems/mcu/testcodes/dma_tests/makefile @@ -0,0 +1,253 @@ +#----------------------------------------------------------------------------- +# The confidential and proprietary information contained in this file may +# only be used by a person authorised under and to the extent permitted +# by a subsisting licensing agreement from Arm Limited or its affiliates. +# +# (C) COPYRIGHT 2010-2013 Arm Limited or its affiliates. +# ALL RIGHTS RESERVED +# +# This entire notice must be reproduced on all copies of this file +# and copies of this file may only be made by a person if such person is +# permitted to do so under the terms of a subsisting license agreement +# from Arm Limited or its affiliates. +# +# SVN Information +# +# Checked In : $Date: 2017-10-10 15:55:38 +0100 (Tue, 10 Oct 2017) $ +# +# Revision : $Revision: 371321 $ +# +# Release Information : Cortex-M System Design Kit-r1p1-00rel0 +#----------------------------------------------------------------------------- +# +# Cortex-M System Design Kit software compilation make file +# +#----------------------------------------------------------------------------- +# +# Configurations +# +# - CORTEX_M0 +# - CORTEX_M0PLUS +CPU_PRODUCT = CORTEX_M0PLUS + +# Shared software directory +SOFTWARE_DIR = ../../../../software +CMSIS_DIR = $(SOFTWARE_DIR)/cmsis +CORE_DIR = $(CMSIS_DIR)/CMSIS/Include +GENERIC_DIR = ../generic + +ifeq ($(CPU_PRODUCT),CORTEX_M0PLUS) + DEVICE_DIR = $(CMSIS_DIR)/Device/ARM/CMSDK_CM0plus +else + DEVICE_DIR = $(CMSIS_DIR)/Device/ARM/CMSDK_CM0 +endif + +# Program file +TESTNAME = dma_tests + +# Endian Option +COMPILE_BIGEND = 0 + +# Configuration +ifeq ($(CPU_PRODUCT),CORTEX_M0PLUS) + USER_DEFINE = -DCORTEX_M0PLUS +else + USER_DEFINE = -DCORTEX_M0 +endif + +DEPS_LIST = makefile + +# Tool chain : ds5 / gcc / keil +TOOL_CHAIN = ds5 + +ifeq ($(TOOL_CHAIN),ds5) + ifeq ($(CPU_PRODUCT),CORTEX_M0PLUS) + CPU_TYPE = --cpu Cortex-M0plus + else + CPU_TYPE = --cpu Cortex-M0 + endif +endif + +ifeq ($(TOOL_CHAIN),gcc) + ifeq ($(CPU_PRODUCT),CORTEX_M0PLUS) + CPU_TYPE = -mcpu=cortex-m0plus + else + CPU_TYPE = -mcpu=cortex-m0 + endif +endif + +# Startup code directory for DS-5 +ifeq ($(TOOL_CHAIN),ds5) + STARTUP_DIR = $(DEVICE_DIR)/Source/ARM +endif + +# Startup code directory for gcc +ifeq ($(TOOL_CHAIN),gcc) + STARTUP_DIR = $(DEVICE_DIR)/Source/GCC +endif + +ifeq ($(CPU_PRODUCT),CORTEX_M0PLUS) + STARTUP_FILE = startup_CMSDK_CM0plus + SYSTEM_FILE = system_CMSDK_CM0plus +else + STARTUP_FILE = startup_CMSDK_CM0 + SYSTEM_FILE = system_CMSDK_CM0 +endif + +# Configuration ID values +GENERIC_FILE = $(GENERIC_DIR)/config_id.h + +# --------------------------------------------------------------------------------------- +# DS-5 options + +# MicroLIB option +COMPILE_MICROLIB = 0 + +# Small Multiply (Cortex-M0/M0+ has small multiplier option) +COMPILE_SMALLMUL = 0 + +ARM_CC_OPTIONS = -c -O3 -g -Otime $(USER_DEFINE) -I $(GENERIC_DIR) \ + -I $(DEVICE_DIR)/Include -I $(CORE_DIR) -I $(SOFTWARE_DIR)/common/retarget +ARM_ASM_OPTIONS = -g +ARM_LINK_OPTIONS = "--keep=$(STARTUP_FILE).o(RESET)" "--first=$(STARTUP_FILE).o(RESET)" \ + --rw_base 0x30000000 --ro_base 0x00000000 --map + +ifeq ($(COMPILE_BIGEND),1) + # Big Endian + ARM_CC_OPTIONS += --bigend + ARM_ASM_OPTIONS += --bigend + ARM_LINK_OPTIONS += --be8 +endif + +ifeq ($(COMPILE_MICROLIB),1) + # MicroLIB + ARM_CC_OPTIONS += --library_type=microlib + ARM_ASM_OPTIONS += --library_type=microlib --pd "__MICROLIB SETA 1" + ARM_LINK_OPTIONS += --library_type=microlib +endif + +ifeq ($(COMPILE_SMALLMUL),1) + # In Cortex-M0, small multiply takes 32 cycles + ARM_CC_OPTIONS += --multiply_latency=32 +endif + +# --------------------------------------------------------------------------------------- +# gcc options + +GNG_CC = arm-none-eabi-gcc +GNU_OBJDUMP = arm-none-eabi-objdump +GNU_OBJCOPY = arm-none-eabi-objcopy + +LINKER_SCRIPT_PATH = $(SOFTWARE_DIR)/common/scripts +LINKER_SCRIPT = $(LINKER_SCRIPT_PATH)/cmsdk_cm0.ld + +GNU_CC_FLAGS = -g -O3 -mthumb $(CPU_TYPE) + +ifeq ($(COMPILE_BIGEND),1) + # Big Endian + GNU_CC_FLAGS += -mbig-endian +endif + +# --------------------------------------------------------------------------------------- +all: all_$(TOOL_CHAIN) + +# --------------------------------------------------------------------------------------- +# DS-5 + +all_ds5 : $(TESTNAME).hex $(TESTNAME).lst + +$(TESTNAME).o : $(SOFTWARE_DIR)/common/validation/$(TESTNAME).c $(GENERIC_FILE) $(DEPS_LIST) + armcc $(ARM_CC_OPTIONS) $(CPU_TYPE) $< -o $@ + +$(SYSTEM_FILE).o : $(DEVICE_DIR)/Source/$(SYSTEM_FILE).c $(DEPS_LIST) + armcc $(ARM_CC_OPTIONS) $(CPU_TYPE) $< -o $@ + +retarget.o : $(SOFTWARE_DIR)/common/retarget/retarget.c $(DEPS_LIST) + armcc $(ARM_CC_OPTIONS) $(CPU_TYPE) $< -o $@ + +uart_stdout.o : $(SOFTWARE_DIR)/common/retarget/uart_stdout.c $(DEPS_LIST) + armcc $(ARM_CC_OPTIONS) $(CPU_TYPE) $< -o $@ + +$(STARTUP_FILE).o : $(STARTUP_DIR)/$(STARTUP_FILE).s $(DEPS_LIST) + armasm $(ARM_ASM_OPTIONS) $(CPU_TYPE) $< -o $@ + +$(TESTNAME).ELF : $(TESTNAME).o $(SYSTEM_FILE).o $(STARTUP_FILE).o retarget.o uart_stdout.o + armlink $(ARM_LINK_OPTIONS) -o $@ $(TESTNAME).o $(SYSTEM_FILE).o $(STARTUP_FILE).o retarget.o uart_stdout.o + +$(TESTNAME).hex : $(TESTNAME).ELF + fromelf --vhx --8x1 $< --output $@ + +$(TESTNAME).lst : $(TESTNAME).ELF makefile + fromelf -c -d -e -s $< --output $@ + +# --------------------------------------------------------------------------------------- +# gcc +all_gcc: + $(GNG_CC) $(GNU_CC_FLAGS) $(STARTUP_DIR)/$(STARTUP_FILE).s \ + $(SOFTWARE_DIR)/common/validation/$(TESTNAME).c \ + $(SOFTWARE_DIR)/common/retarget/retarget.c \ + $(SOFTWARE_DIR)/common/retarget/uart_stdout.c \ + $(DEVICE_DIR)/Source/$(SYSTEM_FILE).c \ + -I $(DEVICE_DIR)/Include -I $(CORE_DIR) -I $(GENERIC_DIR) \ + -I $(SOFTWARE_DIR)/common/retarget \ + -L $(LINKER_SCRIPT_PATH) \ + -D__STACK_SIZE=0x200 \ + -D__HEAP_SIZE=0x1000 \ + $(USER_DEFINE) -T $(LINKER_SCRIPT) -o $(TESTNAME).o + # Generate disassembly code + $(GNU_OBJDUMP) -S $(TESTNAME).o > $(TESTNAME).lst + # Generate binary file + $(GNU_OBJCOPY) -S $(TESTNAME).o -O binary $(TESTNAME).bin + # Generate hex file + $(GNU_OBJCOPY) -S $(TESTNAME).o -O verilog $(TESTNAME).hex + +# Note: +# If the version of object copy you are using does not support verilog hex file output, +# you can generate the hex file from binary file using the following command +# od -v -A n -t x1 --width=1 $(TESTNAME).bin > $(TESTNAME).hex + +# --------------------------------------------------------------------------------------- +# Keil MDK + +all_keil: + @echo "Please compile your project code and press ENTER when ready" + @read dummy + +# --------------------------------------------------------------------------------------- +# Binary + +all_bin: $(TESTNAME).bin + # Generate hex file from binary + od -v -A n -t x1 --width=1 $(TESTNAME).bin > $(TESTNAME).hex + +# --------------------------------------------------------------------------------------- +# Clean + +clean : + @rm -rf *.o + @if [ -e $(TESTNAME).hex ] ; then \ + rm -rf $(TESTNAME).hex ; \ + fi + @if [ -e $(TESTNAME).lst ] ; then \ + rm -rf $(TESTNAME).lst ; \ + fi + @if [ -e $(TESTNAME).ELF ] ; then \ + rm -rf $(TESTNAME).ELF ; \ + fi + @if [ -e $(TESTNAME).bin ] ; then \ + rm -rf $(TESTNAME).bin ; \ + fi + @rm -rf *.crf + @rm -rf *.plg + @rm -rf *.tra + @rm -rf *.htm + @rm -rf *.map + @rm -rf *.dep + @rm -rf *.d + @rm -rf *.lnp + @rm -rf *.bak + @rm -rf *.lst + @rm -rf *.axf + @rm -rf *.sct + @rm -rf *.__i + @rm -rf *._ia diff --git a/Cortex-M0/nanosoc/systems/mcu/testcodes/dualtimer_demo/dualtimer_demo_cm0.uvopt b/Cortex-M0/nanosoc/systems/mcu/testcodes/dualtimer_demo/dualtimer_demo_cm0.uvopt new file mode 100644 index 0000000..32eab05 --- /dev/null +++ b/Cortex-M0/nanosoc/systems/mcu/testcodes/dualtimer_demo/dualtimer_demo_cm0.uvopt @@ -0,0 +1,261 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no" ?> +<ProjectOpt xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="project_opt.xsd"> + + <SchemaVersion>1.0</SchemaVersion> + + <Header>### uVision Project, (C) Keil Software</Header> + + <Extensions> + <cExt>*.c</cExt> + <aExt>*.s*; *.src; *.a*</aExt> + <oExt>*.obj</oExt> + <lExt>*.lib</lExt> + <tExt>*.txt; *.h; *.inc</tExt> + <pExt>*.plm</pExt> + <CppX>*.cpp</CppX> + </Extensions> + + <DaveTm> + <dwLowDateTime>0</dwLowDateTime> + <dwHighDateTime>0</dwHighDateTime> + </DaveTm> + + <Target> + <TargetName>Debug</TargetName> + <ToolsetNumber>0x4</ToolsetNumber> + <ToolsetName>ARM-ADS</ToolsetName> + <TargetOption> + <CLKADS>50000000</CLKADS> + <OPTTT> + <gFlags>1</gFlags> + <BeepAtEnd>1</BeepAtEnd> + <RunSim>1</RunSim> + <RunTarget>0</RunTarget> + </OPTTT> + <OPTHX> + <HexSelection>1</HexSelection> + <FlashByte>65535</FlashByte> + <HexRangeLowAddress>0</HexRangeLowAddress> + <HexRangeHighAddress>0</HexRangeHighAddress> + <HexOffset>0</HexOffset> + </OPTHX> + <OPTLEX> + <PageWidth>79</PageWidth> + <PageLength>66</PageLength> + <TabStop>8</TabStop> + <ListingPath>.\</ListingPath> + </OPTLEX> + <ListingPage> + <CreateCListing>1</CreateCListing> + <CreateAListing>1</CreateAListing> + <CreateLListing>1</CreateLListing> + <CreateIListing>0</CreateIListing> + <AsmCond>1</AsmCond> + <AsmSymb>1</AsmSymb> + <AsmXref>0</AsmXref> + <CCond>1</CCond> + <CCode>0</CCode> + <CListInc>0</CListInc> + <CSymb>0</CSymb> + <LinkerCodeListing>0</LinkerCodeListing> + </ListingPage> + <OPTXL> + <LMap>1</LMap> + <LComments>1</LComments> + <LGenerateSymbols>1</LGenerateSymbols> + <LLibSym>1</LLibSym> + <LLines>1</LLines> + <LLocSym>1</LLocSym> + <LPubSym>1</LPubSym> + <LXref>0</LXref> + <LExpSel>0</LExpSel> + </OPTXL> + <OPTFL> + <tvExp>1</tvExp> + <tvExpOptDlg>0</tvExpOptDlg> + <IsCurrentTarget>1</IsCurrentTarget> + </OPTFL> + <CpuCode>255</CpuCode> + <DllOpt> + <SimDllName>SARMCM3.DLL</SimDllName> + <SimDllArguments></SimDllArguments> + <SimDlgDllName>DARMCM1.DLL</SimDlgDllName> + <SimDlgDllArguments></SimDlgDllArguments> + <TargetDllName>SARMCM3.DLL</TargetDllName> + <TargetDllArguments></TargetDllArguments> + <TargetDlgDllName>TARMCM1.DLL</TargetDlgDllName> + <TargetDlgDllArguments></TargetDlgDllArguments> + </DllOpt> + <DebugOpt> + <uSim>1</uSim> + <uTrg>0</uTrg> + <sLdApp>1</sLdApp> + <sGomain>1</sGomain> + <sRbreak>1</sRbreak> + <sRwatch>1</sRwatch> + <sRmem>1</sRmem> + <sRfunc>1</sRfunc> + <sRbox>1</sRbox> + <tLdApp>1</tLdApp> + <tGomain>0</tGomain> + <tRbreak>1</tRbreak> + <tRwatch>1</tRwatch> + <tRmem>1</tRmem> + <tRfunc>0</tRfunc> + <tRbox>1</tRbox> + <tRtrace>0</tRtrace> + <sRunDeb>0</sRunDeb> + <sLrtime>0</sLrtime> + <nTsel>-1</nTsel> + <sDll></sDll> + <sDllPa></sDllPa> + <sDlgDll></sDlgDll> + <sDlgPa></sDlgPa> + <sIfile></sIfile> + <tDll></tDll> + <tDllPa></tDllPa> + <tDlgDll></tDlgDll> + <tDlgPa></tDlgPa> + <tIfile></tIfile> + <pMon></pMon> + </DebugOpt> + <Breakpoint/> + <DebugFlag> + <trace>0</trace> + <periodic>1</periodic> + <aLwin>0</aLwin> + <aCover>0</aCover> + <aSer1>0</aSer1> + <aSer2>0</aSer2> + <aPa>0</aPa> + <viewmode>0</viewmode> + <vrSel>0</vrSel> + <aSym>0</aSym> + <aTbox>0</aTbox> + <AscS1>0</AscS1> + <AscS2>0</AscS2> + <AscS3>0</AscS3> + <aSer3>0</aSer3> + <eProf>0</eProf> + <aLa>0</aLa> + <aPa1>0</aPa1> + <AscS4>0</AscS4> + <aSer4>0</aSer4> + <StkLoc>0</StkLoc> + <TrcWin>0</TrcWin> + <newCpu>0</newCpu> + <uProt>0</uProt> + </DebugFlag> + <Tracepoint> + <THDelay>0</THDelay> + </Tracepoint> + <LintExecutable></LintExecutable> + <LintConfigFile></LintConfigFile> + </TargetOption> + </Target> + + <Group> + <GroupName>Startup</GroupName> + <tvExp>1</tvExp> + <tvExpOptDlg>0</tvExpOptDlg> + <cbSel>0</cbSel> + <RteFlg>0</RteFlg> + <File> + <GroupNumber>1</GroupNumber> + <FileNumber>1</FileNumber> + <FileType>2</FileType> + <tvExp>0</tvExp> + <Focus>0</Focus> + <ColumnNumber>0</ColumnNumber> + <tvExpOptDlg>0</tvExpOptDlg> + <TopLine>0</TopLine> + <CurrentLine>0</CurrentLine> + <bDave2>0</bDave2> + <PathWithFileName>..\..\..\..\software\cmsis\Device\ARM\CMSDK_CM0\Source\ARM\startup_CMSDK_CM0.s</PathWithFileName> + <FilenameWithoutPath>startup_CMSDK_CM0.s</FilenameWithoutPath> + <RteFlg>0</RteFlg> + <bShared>0</bShared> + </File> + </Group> + + <Group> + <GroupName>Application</GroupName> + <tvExp>1</tvExp> + <tvExpOptDlg>0</tvExpOptDlg> + <cbSel>0</cbSel> + <RteFlg>0</RteFlg> + <File> + <GroupNumber>2</GroupNumber> + <FileNumber>2</FileNumber> + <FileType>1</FileType> + <tvExp>0</tvExp> + <Focus>0</Focus> + <ColumnNumber>0</ColumnNumber> + <tvExpOptDlg>0</tvExpOptDlg> + <TopLine>0</TopLine> + <CurrentLine>0</CurrentLine> + <bDave2>0</bDave2> + <PathWithFileName>..\..\..\..\software\common\demos\dualtimer_demo.c</PathWithFileName> + <FilenameWithoutPath>dualtimer_demo.c</FilenameWithoutPath> + <RteFlg>0</RteFlg> + <bShared>0</bShared> + </File> + <File> + <GroupNumber>2</GroupNumber> + <FileNumber>3</FileNumber> + <FileType>1</FileType> + <tvExp>0</tvExp> + <Focus>0</Focus> + <ColumnNumber>0</ColumnNumber> + <tvExpOptDlg>0</tvExpOptDlg> + <TopLine>0</TopLine> + <CurrentLine>0</CurrentLine> + <bDave2>0</bDave2> + <PathWithFileName>..\..\..\..\software\common\retarget\uart_stdout.c</PathWithFileName> + <FilenameWithoutPath>uart_stdout.c</FilenameWithoutPath> + <RteFlg>0</RteFlg> + <bShared>0</bShared> + </File> + <File> + <GroupNumber>2</GroupNumber> + <FileNumber>4</FileNumber> + <FileType>1</FileType> + <tvExp>0</tvExp> + <Focus>0</Focus> + <ColumnNumber>0</ColumnNumber> + <tvExpOptDlg>0</tvExpOptDlg> + <TopLine>0</TopLine> + <CurrentLine>0</CurrentLine> + <bDave2>0</bDave2> + <PathWithFileName>..\..\..\..\software\common\retarget\retarget.c</PathWithFileName> + <FilenameWithoutPath>retarget.c</FilenameWithoutPath> + <RteFlg>0</RteFlg> + <bShared>0</bShared> + </File> + </Group> + + <Group> + <GroupName>System</GroupName> + <tvExp>1</tvExp> + <tvExpOptDlg>0</tvExpOptDlg> + <cbSel>0</cbSel> + <RteFlg>0</RteFlg> + <File> + <GroupNumber>3</GroupNumber> + <FileNumber>5</FileNumber> + <FileType>1</FileType> + <tvExp>0</tvExp> + <Focus>0</Focus> + <ColumnNumber>0</ColumnNumber> + <tvExpOptDlg>0</tvExpOptDlg> + <TopLine>0</TopLine> + <CurrentLine>0</CurrentLine> + <bDave2>0</bDave2> + <PathWithFileName>..\..\..\..\software\cmsis\Device\ARM\CMSDK_CM0\Source\system_CMSDK_CM0.c</PathWithFileName> + <FilenameWithoutPath>system_CMSDK_CM0.c</FilenameWithoutPath> + <RteFlg>0</RteFlg> + <bShared>0</bShared> + </File> + </Group> + +</ProjectOpt> diff --git a/Cortex-M0/nanosoc/systems/mcu/testcodes/dualtimer_demo/dualtimer_demo_cm0.uvproj b/Cortex-M0/nanosoc/systems/mcu/testcodes/dualtimer_demo/dualtimer_demo_cm0.uvproj new file mode 100644 index 0000000..19d2564 --- /dev/null +++ b/Cortex-M0/nanosoc/systems/mcu/testcodes/dualtimer_demo/dualtimer_demo_cm0.uvproj @@ -0,0 +1,435 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no" ?> +<Project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="project_proj.xsd"> + + <SchemaVersion>1.1</SchemaVersion> + + <Header>### uVision Project, (C) Keil Software</Header> + + <Targets> + <Target> + <TargetName>Debug</TargetName> + <ToolsetNumber>0x4</ToolsetNumber> + <ToolsetName>ARM-ADS</ToolsetName> + <TargetOption> + <TargetCommonOption> + <Device>Cortex-M0</Device> + <Vendor>ARM</Vendor> + <Cpu>CLOCK(12000000) CPUTYPE("Cortex-M0") ESEL ELITTLE</Cpu> + <FlashUtilSpec></FlashUtilSpec> + <StartupFile></StartupFile> + <FlashDriverDll></FlashDriverDll> + <DeviceId>4803</DeviceId> + <RegisterFile></RegisterFile> + <MemoryEnv></MemoryEnv> + <Cmp></Cmp> + <Asm></Asm> + <Linker></Linker> + <OHString></OHString> + <InfinionOptionDll></InfinionOptionDll> + <SLE66CMisc></SLE66CMisc> + <SLE66AMisc></SLE66AMisc> + <SLE66LinkerMisc></SLE66LinkerMisc> + <SFDFile></SFDFile> + <UseEnv>0</UseEnv> + <BinPath></BinPath> + <IncludePath></IncludePath> + <LibPath></LibPath> + <RegisterFilePath></RegisterFilePath> + <DBRegisterFilePath></DBRegisterFilePath> + <TargetStatus> + <Error>0</Error> + <ExitCodeStop>0</ExitCodeStop> + <ButtonStop>0</ButtonStop> + <NotGenerated>0</NotGenerated> + <InvalidFlash>1</InvalidFlash> + </TargetStatus> + <OutputDirectory>.\</OutputDirectory> + <OutputName>dualtimer_demo</OutputName> + <CreateExecutable>1</CreateExecutable> + <CreateLib>0</CreateLib> + <CreateHexFile>0</CreateHexFile> + <DebugInformation>1</DebugInformation> + <BrowseInformation>1</BrowseInformation> + <ListingPath>.\</ListingPath> + <HexFormatSelection>1</HexFormatSelection> + <Merge32K>0</Merge32K> + <CreateBatchFile>0</CreateBatchFile> + <BeforeCompile> + <RunUserProg1>0</RunUserProg1> + <RunUserProg2>0</RunUserProg2> + <UserProg1Name></UserProg1Name> + <UserProg2Name></UserProg2Name> + <UserProg1Dos16Mode>0</UserProg1Dos16Mode> + <UserProg2Dos16Mode>0</UserProg2Dos16Mode> + <nStopU1X>0</nStopU1X> + <nStopU2X>0</nStopU2X> + </BeforeCompile> + <BeforeMake> + <RunUserProg1>0</RunUserProg1> + <RunUserProg2>0</RunUserProg2> + <UserProg1Name></UserProg1Name> + <UserProg2Name></UserProg2Name> + <UserProg1Dos16Mode>0</UserProg1Dos16Mode> + <UserProg2Dos16Mode>0</UserProg2Dos16Mode> + </BeforeMake> + <AfterMake> + <RunUserProg1>1</RunUserProg1> + <RunUserProg2>0</RunUserProg2> + <UserProg1Name>$K\ARM\ARMCC\BIN\fromelf.exe #L --vhx --8x1 --output dualtimer_demo.hex</UserProg1Name> + <UserProg2Name></UserProg2Name> + <UserProg1Dos16Mode>0</UserProg1Dos16Mode> + <UserProg2Dos16Mode>0</UserProg2Dos16Mode> + </AfterMake> + <SelectedForBatchBuild>0</SelectedForBatchBuild> + <SVCSIdString></SVCSIdString> + </TargetCommonOption> + <CommonProperty> + <UseCPPCompiler>0</UseCPPCompiler> + <RVCTCodeConst>0</RVCTCodeConst> + <RVCTZI>0</RVCTZI> + <RVCTOtherData>0</RVCTOtherData> + <ModuleSelection>0</ModuleSelection> + <IncludeInBuild>1</IncludeInBuild> + <AlwaysBuild>0</AlwaysBuild> + <GenerateAssemblyFile>0</GenerateAssemblyFile> + <AssembleAssemblyFile>0</AssembleAssemblyFile> + <PublicsOnly>0</PublicsOnly> + <StopOnExitCode>3</StopOnExitCode> + <CustomArgument></CustomArgument> + <IncludeLibraryModules></IncludeLibraryModules> + </CommonProperty> + <DllOption> + <SimDllName>SARMCM3.DLL</SimDllName> + <SimDllArguments></SimDllArguments> + <SimDlgDll>DARMCM1.DLL</SimDlgDll> + <SimDlgDllArguments></SimDlgDllArguments> + <TargetDllName>SARMCM3.DLL</TargetDllName> + <TargetDllArguments></TargetDllArguments> + <TargetDlgDll>TARMCM1.DLL</TargetDlgDll> + <TargetDlgDllArguments></TargetDlgDllArguments> + </DllOption> + <DebugOption> + <OPTHX> + <HexSelection>1</HexSelection> + <HexRangeLowAddress>0</HexRangeLowAddress> + <HexRangeHighAddress>0</HexRangeHighAddress> + <HexOffset>0</HexOffset> + <Oh166RecLen>16</Oh166RecLen> + </OPTHX> + <Simulator> + <UseSimulator>1</UseSimulator> + <LoadApplicationAtStartup>1</LoadApplicationAtStartup> + <RunToMain>1</RunToMain> + <RestoreBreakpoints>1</RestoreBreakpoints> + <RestoreWatchpoints>1</RestoreWatchpoints> + <RestoreMemoryDisplay>1</RestoreMemoryDisplay> + <RestoreFunctions>1</RestoreFunctions> + <RestoreToolbox>1</RestoreToolbox> + <LimitSpeedToRealTime>0</LimitSpeedToRealTime> + </Simulator> + <Target> + <UseTarget>0</UseTarget> + <LoadApplicationAtStartup>1</LoadApplicationAtStartup> + <RunToMain>0</RunToMain> + <RestoreBreakpoints>1</RestoreBreakpoints> + <RestoreWatchpoints>1</RestoreWatchpoints> + <RestoreMemoryDisplay>1</RestoreMemoryDisplay> + <RestoreFunctions>0</RestoreFunctions> + <RestoreToolbox>1</RestoreToolbox> + <RestoreTracepoints>0</RestoreTracepoints> + </Target> + <RunDebugAfterBuild>0</RunDebugAfterBuild> + <TargetSelection>-1</TargetSelection> + <SimDlls> + <CpuDll></CpuDll> + <CpuDllArguments></CpuDllArguments> + <PeripheralDll></PeripheralDll> + <PeripheralDllArguments></PeripheralDllArguments> + <InitializationFile></InitializationFile> + </SimDlls> + <TargetDlls> + <CpuDll></CpuDll> + <CpuDllArguments></CpuDllArguments> + <PeripheralDll></PeripheralDll> + <PeripheralDllArguments></PeripheralDllArguments> + <InitializationFile></InitializationFile> + <Driver></Driver> + </TargetDlls> + </DebugOption> + <Utilities> + <Flash1> + <UseTargetDll>0</UseTargetDll> + <UseExternalTool>0</UseExternalTool> + <RunIndependent>0</RunIndependent> + <UpdateFlashBeforeDebugging>0</UpdateFlashBeforeDebugging> + <Capability>0</Capability> + <DriverSelection>-1</DriverSelection> + </Flash1> + <Flash2></Flash2> + <Flash3></Flash3> + <Flash4></Flash4> + </Utilities> + <TargetArmAds> + <ArmAdsMisc> + <GenerateListings>0</GenerateListings> + <asHll>1</asHll> + <asAsm>1</asAsm> + <asMacX>1</asMacX> + <asSyms>1</asSyms> + <asFals>1</asFals> + <asDbgD>1</asDbgD> + <asForm>1</asForm> + <ldLst>0</ldLst> + <ldmm>1</ldmm> + <ldXref>1</ldXref> + <BigEnd>0</BigEnd> + <AdsALst>1</AdsALst> + <AdsACrf>1</AdsACrf> + <AdsANop>0</AdsANop> + <AdsANot>0</AdsANot> + <AdsLLst>1</AdsLLst> + <AdsLmap>1</AdsLmap> + <AdsLcgr>1</AdsLcgr> + <AdsLsym>1</AdsLsym> + <AdsLszi>1</AdsLszi> + <AdsLtoi>1</AdsLtoi> + <AdsLsun>1</AdsLsun> + <AdsLven>1</AdsLven> + <AdsLsxf>1</AdsLsxf> + <RvctClst>0</RvctClst> + <GenPPlst>0</GenPPlst> + <AdsCpuType>"Cortex-M0"</AdsCpuType> + <RvctDeviceName></RvctDeviceName> + <mOS>0</mOS> + <uocRom>0</uocRom> + <uocRam>0</uocRam> + <hadIROM>0</hadIROM> + <hadIRAM>0</hadIRAM> + <hadXRAM>0</hadXRAM> + <uocXRam>0</uocXRam> + <RvdsVP>0</RvdsVP> + <hadIRAM2>0</hadIRAM2> + <hadIROM2>0</hadIROM2> + <StupSel>1</StupSel> + <useUlib>0</useUlib> + <EndSel>1</EndSel> + <uLtcg>0</uLtcg> + <RoSelD>0</RoSelD> + <RwSelD>5</RwSelD> + <CodeSel>0</CodeSel> + <OptFeed>0</OptFeed> + <NoZi1>0</NoZi1> + <NoZi2>0</NoZi2> + <NoZi3>0</NoZi3> + <NoZi4>0</NoZi4> + <NoZi5>0</NoZi5> + <Ro1Chk>1</Ro1Chk> + <Ro2Chk>0</Ro2Chk> + <Ro3Chk>0</Ro3Chk> + <Ir1Chk>0</Ir1Chk> + <Ir2Chk>0</Ir2Chk> + <Ra1Chk>1</Ra1Chk> + <Ra2Chk>0</Ra2Chk> + <Ra3Chk>0</Ra3Chk> + <Im1Chk>0</Im1Chk> + <Im2Chk>0</Im2Chk> + <OnChipMemories> + <Ocm1> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </Ocm1> + <Ocm2> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </Ocm2> + <Ocm3> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </Ocm3> + <Ocm4> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </Ocm4> + <Ocm5> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </Ocm5> + <Ocm6> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </Ocm6> + <IRAM> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </IRAM> + <IROM> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </IROM> + <XRAM> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </XRAM> + <OCR_RVCT1> + <Type>1</Type> + <StartAddress>0x0</StartAddress> + <Size>0x10000</Size> + </OCR_RVCT1> + <OCR_RVCT2> + <Type>1</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </OCR_RVCT2> + <OCR_RVCT3> + <Type>1</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </OCR_RVCT3> + <OCR_RVCT4> + <Type>1</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </OCR_RVCT4> + <OCR_RVCT5> + <Type>1</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </OCR_RVCT5> + <OCR_RVCT6> + <Type>0</Type> + <StartAddress>0x20000000</StartAddress> + <Size>0x10000</Size> + </OCR_RVCT6> + <OCR_RVCT7> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </OCR_RVCT7> + <OCR_RVCT8> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </OCR_RVCT8> + <OCR_RVCT9> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </OCR_RVCT9> + <OCR_RVCT10> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </OCR_RVCT10> + </OnChipMemories> + <RvctStartVector></RvctStartVector> + </ArmAdsMisc> + <Cads> + <interw>1</interw> + <Optim>3</Optim> + <oTime>0</oTime> + <SplitLS>0</SplitLS> + <OneElfS>0</OneElfS> + <Strict>0</Strict> + <EnumInt>0</EnumInt> + <PlainCh>0</PlainCh> + <Ropi>0</Ropi> + <Rwpi>0</Rwpi> + <wLevel>0</wLevel> + <uThumb>0</uThumb> + <uSurpInc>0</uSurpInc> + <VariousControls> + <MiscControls></MiscControls> + <Define>CORTEX_M0</Define> + <Undefine></Undefine> + <IncludePath>..\..\..\..\software\cmsis\CMSIS\Include; ..\..\..\..\software\cmsis\Device\ARM\CMSDK_CM0\Include; ..\..\..\..\software\common\retarget</IncludePath> + </VariousControls> + </Cads> + <Aads> + <interw>1</interw> + <Ropi>0</Ropi> + <Rwpi>0</Rwpi> + <thumb>0</thumb> + <SplitLS>0</SplitLS> + <SwStkChk>0</SwStkChk> + <NoWarn>0</NoWarn> + <uSurpInc>0</uSurpInc> + <VariousControls> + <MiscControls></MiscControls> + <Define></Define> + <Undefine></Undefine> + <IncludePath></IncludePath> + </VariousControls> + </Aads> + <LDads> + <umfTarg>1</umfTarg> + <Ropi>0</Ropi> + <Rwpi>0</Rwpi> + <noStLib>0</noStLib> + <RepFail>1</RepFail> + <useFile>0</useFile> + <TextAddressRange>0x00000000</TextAddressRange> + <DataAddressRange>0x00000000</DataAddressRange> + <ScatterFile></ScatterFile> + <IncludeLibs></IncludeLibs> + <IncludeLibsPath></IncludeLibsPath> + <Misc></Misc> + <LinkerInputFile></LinkerInputFile> + <DisabledWarnings></DisabledWarnings> + </LDads> + </TargetArmAds> + </TargetOption> + <Groups> + <Group> + <GroupName>Startup</GroupName> + <Files> + <File> + <FileName>startup_CMSDK_CM0.s</FileName> + <FileType>2</FileType> + <FilePath>..\..\..\..\software\cmsis\Device\ARM\CMSDK_CM0\Source\ARM\startup_CMSDK_CM0.s</FilePath> + </File> + </Files> + </Group> + <Group> + <GroupName>Application</GroupName> + <Files> + <File> + <FileName>dualtimer_demo.c</FileName> + <FileType>1</FileType> + <FilePath>..\..\..\..\software\common\demos\dualtimer_demo.c</FilePath> + </File> + <File> + <FileName>uart_stdout.c</FileName> + <FileType>1</FileType> + <FilePath>..\..\..\..\software\common\retarget\uart_stdout.c</FilePath> + </File> + <File> + <FileName>retarget.c</FileName> + <FileType>1</FileType> + <FilePath>..\..\..\..\software\common\retarget\retarget.c</FilePath> + </File> + </Files> + </Group> + <Group> + <GroupName>System</GroupName> + <Files> + <File> + <FileName>system_CMSDK_CM0.c</FileName> + <FileType>1</FileType> + <FilePath>..\..\..\..\software\cmsis\Device\ARM\CMSDK_CM0\Source\system_CMSDK_CM0.c</FilePath> + </File> + </Files> + </Group> + </Groups> + </Target> + </Targets> + +</Project> diff --git a/Cortex-M0/nanosoc/systems/mcu/testcodes/dualtimer_demo/dualtimer_demo_cm0p.uvopt b/Cortex-M0/nanosoc/systems/mcu/testcodes/dualtimer_demo/dualtimer_demo_cm0p.uvopt new file mode 100644 index 0000000..97f2811 --- /dev/null +++ b/Cortex-M0/nanosoc/systems/mcu/testcodes/dualtimer_demo/dualtimer_demo_cm0p.uvopt @@ -0,0 +1,244 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no" ?> +<ProjectOpt xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="project_opt.xsd"> + + <SchemaVersion>1.0</SchemaVersion> + + <Header>### uVision Project, (C) Keil Software</Header> + + <Extensions> + <cExt>*.c</cExt> + <aExt>*.s*; *.src; *.a*</aExt> + <oExt>*.obj</oExt> + <lExt>*.lib</lExt> + <tExt>*.txt; *.h; *.inc</tExt> + <pExt>*.plm</pExt> + <CppX>*.cpp</CppX> + </Extensions> + + <DaveTm> + <dwLowDateTime>0</dwLowDateTime> + <dwHighDateTime>0</dwHighDateTime> + </DaveTm> + + <Target> + <TargetName>Debug</TargetName> + <ToolsetNumber>0x4</ToolsetNumber> + <ToolsetName>ARM-ADS</ToolsetName> + <TargetOption> + <CLKADS>50000000</CLKADS> + <OPTTT> + <gFlags>1</gFlags> + <BeepAtEnd>1</BeepAtEnd> + <RunSim>1</RunSim> + <RunTarget>0</RunTarget> + </OPTTT> + <OPTHX> + <HexSelection>1</HexSelection> + <FlashByte>65535</FlashByte> + <HexRangeLowAddress>0</HexRangeLowAddress> + <HexRangeHighAddress>0</HexRangeHighAddress> + <HexOffset>0</HexOffset> + </OPTHX> + <OPTLEX> + <PageWidth>79</PageWidth> + <PageLength>66</PageLength> + <TabStop>8</TabStop> + <ListingPath>.\</ListingPath> + </OPTLEX> + <ListingPage> + <CreateCListing>1</CreateCListing> + <CreateAListing>1</CreateAListing> + <CreateLListing>1</CreateLListing> + <CreateIListing>0</CreateIListing> + <AsmCond>1</AsmCond> + <AsmSymb>1</AsmSymb> + <AsmXref>0</AsmXref> + <CCond>1</CCond> + <CCode>0</CCode> + <CListInc>0</CListInc> + <CSymb>0</CSymb> + <LinkerCodeListing>0</LinkerCodeListing> + </ListingPage> + <OPTXL> + <LMap>1</LMap> + <LComments>1</LComments> + <LGenerateSymbols>1</LGenerateSymbols> + <LLibSym>1</LLibSym> + <LLines>1</LLines> + <LLocSym>1</LLocSym> + <LPubSym>1</LPubSym> + <LXref>0</LXref> + <LExpSel>0</LExpSel> + </OPTXL> + <OPTFL> + <tvExp>1</tvExp> + <tvExpOptDlg>0</tvExpOptDlg> + <IsCurrentTarget>1</IsCurrentTarget> + </OPTFL> + <CpuCode>255</CpuCode> + <DllOpt> + <SimDllName>SARMCM3.DLL</SimDllName> + <SimDllArguments></SimDllArguments> + <SimDlgDllName>DARMCM1.DLL</SimDlgDllName> + <SimDlgDllArguments></SimDlgDllArguments> + <TargetDllName>SARMCM3.DLL</TargetDllName> + <TargetDllArguments></TargetDllArguments> + <TargetDlgDllName>TARMCM1.DLL</TargetDlgDllName> + <TargetDlgDllArguments></TargetDlgDllArguments> + </DllOpt> + <DebugOpt> + <uSim>1</uSim> + <uTrg>0</uTrg> + <sLdApp>1</sLdApp> + <sGomain>1</sGomain> + <sRbreak>1</sRbreak> + <sRwatch>1</sRwatch> + <sRmem>1</sRmem> + <sRfunc>1</sRfunc> + <sRbox>1</sRbox> + <tLdApp>1</tLdApp> + <tGomain>0</tGomain> + <tRbreak>1</tRbreak> + <tRwatch>1</tRwatch> + <tRmem>1</tRmem> + <tRfunc>0</tRfunc> + <tRbox>1</tRbox> + <sRunDeb>0</sRunDeb> + <sLrtime>0</sLrtime> + <nTsel>-1</nTsel> + <sDll></sDll> + <sDllPa></sDllPa> + <sDlgDll></sDlgDll> + <sDlgPa></sDlgPa> + <sIfile></sIfile> + <tDll></tDll> + <tDllPa></tDllPa> + <tDlgDll></tDlgDll> + <tDlgPa></tDlgPa> + <tIfile></tIfile> + <pMon></pMon> + </DebugOpt> + <Breakpoint/> + <DebugFlag> + <trace>0</trace> + <periodic>1</periodic> + <aLwin>0</aLwin> + <aCover>0</aCover> + <aSer1>0</aSer1> + <aSer2>0</aSer2> + <aPa>0</aPa> + <viewmode>0</viewmode> + <vrSel>0</vrSel> + <aSym>0</aSym> + <aTbox>0</aTbox> + <AscS1>0</AscS1> + <AscS2>0</AscS2> + <AscS3>0</AscS3> + <aSer3>0</aSer3> + <eProf>0</eProf> + <aLa>0</aLa> + <aPa1>0</aPa1> + <AscS4>0</AscS4> + <aSer4>0</aSer4> + <StkLoc>0</StkLoc> + <TrcWin>0</TrcWin> + <newCpu>0</newCpu> + <uProt>0</uProt> + </DebugFlag> + <LintExecutable></LintExecutable> + <LintConfigFile></LintConfigFile> + </TargetOption> + </Target> + + <Group> + <GroupName>Startup</GroupName> + <tvExp>1</tvExp> + <tvExpOptDlg>0</tvExpOptDlg> + <cbSel>0</cbSel> + <File> + <GroupNumber>1</GroupNumber> + <FileNumber>1</FileNumber> + <FileType>2</FileType> + <tvExp>0</tvExp> + <Focus>0</Focus> + <ColumnNumber>0</ColumnNumber> + <tvExpOptDlg>0</tvExpOptDlg> + <TopLine>0</TopLine> + <CurrentLine>0</CurrentLine> + <bDave2>0</bDave2> + <PathWithFileName>..\..\..\..\software\cmsis\Device\ARM\CMSDK_CM0plus\Source\ARM\startup_CMSDK_CM0plus.s</PathWithFileName> + <FilenameWithoutPath>startup_CMSDK_CM0plus.s</FilenameWithoutPath> + </File> + </Group> + + <Group> + <GroupName>Application</GroupName> + <tvExp>1</tvExp> + <tvExpOptDlg>0</tvExpOptDlg> + <cbSel>0</cbSel> + <File> + <GroupNumber>2</GroupNumber> + <FileNumber>2</FileNumber> + <FileType>1</FileType> + <tvExp>0</tvExp> + <Focus>0</Focus> + <ColumnNumber>0</ColumnNumber> + <tvExpOptDlg>0</tvExpOptDlg> + <TopLine>0</TopLine> + <CurrentLine>0</CurrentLine> + <bDave2>0</bDave2> + <PathWithFileName>..\..\..\..\software\common\demos\dualtimer_demo.c</PathWithFileName> + <FilenameWithoutPath>dualtimer_demo.c</FilenameWithoutPath> + </File> + <File> + <GroupNumber>2</GroupNumber> + <FileNumber>3</FileNumber> + <FileType>1</FileType> + <tvExp>0</tvExp> + <Focus>0</Focus> + <ColumnNumber>0</ColumnNumber> + <tvExpOptDlg>0</tvExpOptDlg> + <TopLine>0</TopLine> + <CurrentLine>0</CurrentLine> + <bDave2>0</bDave2> + <PathWithFileName>..\..\..\..\software\common\retarget\uart_stdout.c</PathWithFileName> + <FilenameWithoutPath>uart_stdout.c</FilenameWithoutPath> + </File> + <File> + <GroupNumber>2</GroupNumber> + <FileNumber>4</FileNumber> + <FileType>1</FileType> + <tvExp>0</tvExp> + <Focus>0</Focus> + <ColumnNumber>0</ColumnNumber> + <tvExpOptDlg>0</tvExpOptDlg> + <TopLine>0</TopLine> + <CurrentLine>0</CurrentLine> + <bDave2>0</bDave2> + <PathWithFileName>..\..\..\..\software\common\retarget\retarget.c</PathWithFileName> + <FilenameWithoutPath>retarget.c</FilenameWithoutPath> + </File> + </Group> + + <Group> + <GroupName>System</GroupName> + <tvExp>1</tvExp> + <tvExpOptDlg>0</tvExpOptDlg> + <cbSel>0</cbSel> + <File> + <GroupNumber>3</GroupNumber> + <FileNumber>5</FileNumber> + <FileType>1</FileType> + <tvExp>0</tvExp> + <Focus>0</Focus> + <ColumnNumber>0</ColumnNumber> + <tvExpOptDlg>0</tvExpOptDlg> + <TopLine>0</TopLine> + <CurrentLine>0</CurrentLine> + <bDave2>0</bDave2> + <PathWithFileName>..\..\..\..\software\cmsis\Device\ARM\CMSDK_CM0plus\Source\system_CMSDK_CM0plus.c</PathWithFileName> + <FilenameWithoutPath>system_CMSDK_CM0plus.c</FilenameWithoutPath> + </File> + </Group> + +</ProjectOpt> diff --git a/Cortex-M0/nanosoc/systems/mcu/testcodes/dualtimer_demo/dualtimer_demo_cm0p.uvproj b/Cortex-M0/nanosoc/systems/mcu/testcodes/dualtimer_demo/dualtimer_demo_cm0p.uvproj new file mode 100644 index 0000000..22abff1 --- /dev/null +++ b/Cortex-M0/nanosoc/systems/mcu/testcodes/dualtimer_demo/dualtimer_demo_cm0p.uvproj @@ -0,0 +1,432 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no" ?> +<Project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="project_proj.xsd"> + + <SchemaVersion>1.1</SchemaVersion> + + <Header>### uVision Project, (C) Keil Software</Header> + + <Targets> + <Target> + <TargetName>Debug</TargetName> + <ToolsetNumber>0x4</ToolsetNumber> + <ToolsetName>ARM-ADS</ToolsetName> + <TargetOption> + <TargetCommonOption> + <Device>Cortex-M0+</Device> + <Vendor>ARM</Vendor> + <Cpu>CLOCK(12000000) CPUTYPE("Cortex-M0+") ESEL ELITTLE</Cpu> + <FlashUtilSpec></FlashUtilSpec> + <StartupFile></StartupFile> + <FlashDriverDll></FlashDriverDll> + <DeviceId>6268</DeviceId> + <RegisterFile></RegisterFile> + <MemoryEnv></MemoryEnv> + <Cmp></Cmp> + <Asm></Asm> + <Linker></Linker> + <OHString></OHString> + <InfinionOptionDll></InfinionOptionDll> + <SLE66CMisc></SLE66CMisc> + <SLE66AMisc></SLE66AMisc> + <SLE66LinkerMisc></SLE66LinkerMisc> + <SFDFile></SFDFile> + <UseEnv>0</UseEnv> + <BinPath></BinPath> + <IncludePath></IncludePath> + <LibPath></LibPath> + <RegisterFilePath></RegisterFilePath> + <DBRegisterFilePath></DBRegisterFilePath> + <TargetStatus> + <Error>0</Error> + <ExitCodeStop>0</ExitCodeStop> + <ButtonStop>0</ButtonStop> + <NotGenerated>0</NotGenerated> + <InvalidFlash>1</InvalidFlash> + </TargetStatus> + <OutputDirectory>.\</OutputDirectory> + <OutputName>dualtimer_demo</OutputName> + <CreateExecutable>1</CreateExecutable> + <CreateLib>0</CreateLib> + <CreateHexFile>0</CreateHexFile> + <DebugInformation>1</DebugInformation> + <BrowseInformation>1</BrowseInformation> + <ListingPath>.\</ListingPath> + <HexFormatSelection>1</HexFormatSelection> + <Merge32K>0</Merge32K> + <CreateBatchFile>0</CreateBatchFile> + <BeforeCompile> + <RunUserProg1>0</RunUserProg1> + <RunUserProg2>0</RunUserProg2> + <UserProg1Name></UserProg1Name> + <UserProg2Name></UserProg2Name> + <UserProg1Dos16Mode>0</UserProg1Dos16Mode> + <UserProg2Dos16Mode>0</UserProg2Dos16Mode> + <nStopU1X>0</nStopU1X> + <nStopU2X>0</nStopU2X> + </BeforeCompile> + <BeforeMake> + <RunUserProg1>0</RunUserProg1> + <RunUserProg2>0</RunUserProg2> + <UserProg1Name></UserProg1Name> + <UserProg2Name></UserProg2Name> + <UserProg1Dos16Mode>0</UserProg1Dos16Mode> + <UserProg2Dos16Mode>0</UserProg2Dos16Mode> + </BeforeMake> + <AfterMake> + <RunUserProg1>1</RunUserProg1> + <RunUserProg2>0</RunUserProg2> + <UserProg1Name>$K\ARM\ARMCC\BIN\fromelf.exe #L --vhx --8x1 --output dualtimer_demo.hex</UserProg1Name> + <UserProg2Name></UserProg2Name> + <UserProg1Dos16Mode>0</UserProg1Dos16Mode> + <UserProg2Dos16Mode>0</UserProg2Dos16Mode> + </AfterMake> + <SelectedForBatchBuild>0</SelectedForBatchBuild> + <SVCSIdString></SVCSIdString> + </TargetCommonOption> + <CommonProperty> + <UseCPPCompiler>0</UseCPPCompiler> + <RVCTCodeConst>0</RVCTCodeConst> + <RVCTZI>0</RVCTZI> + <RVCTOtherData>0</RVCTOtherData> + <ModuleSelection>0</ModuleSelection> + <IncludeInBuild>1</IncludeInBuild> + <AlwaysBuild>0</AlwaysBuild> + <GenerateAssemblyFile>0</GenerateAssemblyFile> + <AssembleAssemblyFile>0</AssembleAssemblyFile> + <PublicsOnly>0</PublicsOnly> + <StopOnExitCode>3</StopOnExitCode> + <CustomArgument></CustomArgument> + <IncludeLibraryModules></IncludeLibraryModules> + </CommonProperty> + <DllOption> + <SimDllName>SARMCM3.DLL</SimDllName> + <SimDllArguments></SimDllArguments> + <SimDlgDll>DARMCM1.DLL</SimDlgDll> + <SimDlgDllArguments></SimDlgDllArguments> + <TargetDllName>SARMCM3.DLL</TargetDllName> + <TargetDllArguments></TargetDllArguments> + <TargetDlgDll>TARMCM1.DLL</TargetDlgDll> + <TargetDlgDllArguments></TargetDlgDllArguments> + </DllOption> + <DebugOption> + <OPTHX> + <HexSelection>1</HexSelection> + <HexRangeLowAddress>0</HexRangeLowAddress> + <HexRangeHighAddress>0</HexRangeHighAddress> + <HexOffset>0</HexOffset> + <Oh166RecLen>16</Oh166RecLen> + </OPTHX> + <Simulator> + <UseSimulator>1</UseSimulator> + <LoadApplicationAtStartup>1</LoadApplicationAtStartup> + <RunToMain>1</RunToMain> + <RestoreBreakpoints>1</RestoreBreakpoints> + <RestoreWatchpoints>1</RestoreWatchpoints> + <RestoreMemoryDisplay>1</RestoreMemoryDisplay> + <RestoreFunctions>1</RestoreFunctions> + <RestoreToolbox>1</RestoreToolbox> + <LimitSpeedToRealTime>0</LimitSpeedToRealTime> + </Simulator> + <Target> + <UseTarget>0</UseTarget> + <LoadApplicationAtStartup>1</LoadApplicationAtStartup> + <RunToMain>0</RunToMain> + <RestoreBreakpoints>1</RestoreBreakpoints> + <RestoreWatchpoints>1</RestoreWatchpoints> + <RestoreMemoryDisplay>1</RestoreMemoryDisplay> + <RestoreFunctions>0</RestoreFunctions> + <RestoreToolbox>1</RestoreToolbox> + </Target> + <RunDebugAfterBuild>0</RunDebugAfterBuild> + <TargetSelection>-1</TargetSelection> + <SimDlls> + <CpuDll></CpuDll> + <CpuDllArguments></CpuDllArguments> + <PeripheralDll></PeripheralDll> + <PeripheralDllArguments></PeripheralDllArguments> + <InitializationFile></InitializationFile> + </SimDlls> + <TargetDlls> + <CpuDll></CpuDll> + <CpuDllArguments></CpuDllArguments> + <PeripheralDll></PeripheralDll> + <PeripheralDllArguments></PeripheralDllArguments> + <InitializationFile></InitializationFile> + <Driver></Driver> + </TargetDlls> + </DebugOption> + <Utilities> + <Flash1> + <UseTargetDll>0</UseTargetDll> + <UseExternalTool>0</UseExternalTool> + <RunIndependent>0</RunIndependent> + <UpdateFlashBeforeDebugging>0</UpdateFlashBeforeDebugging> + <Capability>0</Capability> + <DriverSelection>-1</DriverSelection> + </Flash1> + <Flash2></Flash2> + <Flash3></Flash3> + <Flash4></Flash4> + </Utilities> + <TargetArmAds> + <ArmAdsMisc> + <GenerateListings>0</GenerateListings> + <asHll>1</asHll> + <asAsm>1</asAsm> + <asMacX>1</asMacX> + <asSyms>1</asSyms> + <asFals>1</asFals> + <asDbgD>1</asDbgD> + <asForm>1</asForm> + <ldLst>0</ldLst> + <ldmm>1</ldmm> + <ldXref>1</ldXref> + <BigEnd>0</BigEnd> + <AdsALst>1</AdsALst> + <AdsACrf>1</AdsACrf> + <AdsANop>0</AdsANop> + <AdsANot>0</AdsANot> + <AdsLLst>1</AdsLLst> + <AdsLmap>1</AdsLmap> + <AdsLcgr>1</AdsLcgr> + <AdsLsym>1</AdsLsym> + <AdsLszi>1</AdsLszi> + <AdsLtoi>1</AdsLtoi> + <AdsLsun>1</AdsLsun> + <AdsLven>1</AdsLven> + <AdsLsxf>1</AdsLsxf> + <RvctClst>0</RvctClst> + <GenPPlst>0</GenPPlst> + <AdsCpuType>"Cortex-M0+"</AdsCpuType> + <RvctDeviceName></RvctDeviceName> + <mOS>0</mOS> + <uocRom>0</uocRom> + <uocRam>0</uocRam> + <hadIROM>0</hadIROM> + <hadIRAM>0</hadIRAM> + <hadXRAM>0</hadXRAM> + <uocXRam>0</uocXRam> + <RvdsVP>0</RvdsVP> + <hadIRAM2>0</hadIRAM2> + <hadIROM2>0</hadIROM2> + <StupSel>1</StupSel> + <useUlib>0</useUlib> + <EndSel>1</EndSel> + <uLtcg>0</uLtcg> + <RoSelD>0</RoSelD> + <RwSelD>5</RwSelD> + <CodeSel>0</CodeSel> + <OptFeed>0</OptFeed> + <NoZi1>0</NoZi1> + <NoZi2>0</NoZi2> + <NoZi3>0</NoZi3> + <NoZi4>0</NoZi4> + <NoZi5>0</NoZi5> + <Ro1Chk>1</Ro1Chk> + <Ro2Chk>0</Ro2Chk> + <Ro3Chk>0</Ro3Chk> + <Ir1Chk>0</Ir1Chk> + <Ir2Chk>0</Ir2Chk> + <Ra1Chk>1</Ra1Chk> + <Ra2Chk>0</Ra2Chk> + <Ra3Chk>0</Ra3Chk> + <Im1Chk>0</Im1Chk> + <Im2Chk>0</Im2Chk> + <OnChipMemories> + <Ocm1> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </Ocm1> + <Ocm2> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </Ocm2> + <Ocm3> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </Ocm3> + <Ocm4> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </Ocm4> + <Ocm5> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </Ocm5> + <Ocm6> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </Ocm6> + <IRAM> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </IRAM> + <IROM> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </IROM> + <XRAM> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </XRAM> + <OCR_RVCT1> + <Type>1</Type> + <StartAddress>0x0</StartAddress> + <Size>0x10000</Size> + </OCR_RVCT1> + <OCR_RVCT2> + <Type>1</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </OCR_RVCT2> + <OCR_RVCT3> + <Type>1</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </OCR_RVCT3> + <OCR_RVCT4> + <Type>1</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </OCR_RVCT4> + <OCR_RVCT5> + <Type>1</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </OCR_RVCT5> + <OCR_RVCT6> + <Type>0</Type> + <StartAddress>0x20000000</StartAddress> + <Size>0x10000</Size> + </OCR_RVCT6> + <OCR_RVCT7> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </OCR_RVCT7> + <OCR_RVCT8> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </OCR_RVCT8> + <OCR_RVCT9> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </OCR_RVCT9> + <OCR_RVCT10> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </OCR_RVCT10> + </OnChipMemories> + <RvctStartVector></RvctStartVector> + </ArmAdsMisc> + <Cads> + <interw>1</interw> + <Optim>3</Optim> + <oTime>0</oTime> + <SplitLS>0</SplitLS> + <OneElfS>0</OneElfS> + <Strict>0</Strict> + <EnumInt>0</EnumInt> + <PlainCh>0</PlainCh> + <Ropi>0</Ropi> + <Rwpi>0</Rwpi> + <wLevel>0</wLevel> + <uThumb>0</uThumb> + <VariousControls> + <MiscControls></MiscControls> + <Define>CORTEX_M0PLUS</Define> + <Undefine></Undefine> + <IncludePath>..\..\..\..\software\cmsis\CMSIS\Include; ..\..\..\..\software\cmsis\Device\ARM\CMSDK_CM0plus\Include; ..\..\..\..\software\common\retarget</IncludePath> + </VariousControls> + </Cads> + <Aads> + <interw>1</interw> + <Ropi>0</Ropi> + <Rwpi>0</Rwpi> + <thumb>0</thumb> + <SplitLS>0</SplitLS> + <SwStkChk>0</SwStkChk> + <NoWarn>0</NoWarn> + <VariousControls> + <MiscControls></MiscControls> + <Define></Define> + <Undefine></Undefine> + <IncludePath></IncludePath> + </VariousControls> + </Aads> + <LDads> + <umfTarg>1</umfTarg> + <Ropi>0</Ropi> + <Rwpi>0</Rwpi> + <noStLib>0</noStLib> + <RepFail>1</RepFail> + <useFile>0</useFile> + <TextAddressRange>0x00000000</TextAddressRange> + <DataAddressRange>0x00000000</DataAddressRange> + <ScatterFile></ScatterFile> + <IncludeLibs></IncludeLibs> + <IncludeLibsPath></IncludeLibsPath> + <Misc></Misc> + <LinkerInputFile></LinkerInputFile> + <DisabledWarnings></DisabledWarnings> + </LDads> + </TargetArmAds> + </TargetOption> + <Groups> + <Group> + <GroupName>Startup</GroupName> + <Files> + <File> + <FileName>startup_CMSDK_CM0plus.s</FileName> + <FileType>2</FileType> + <FilePath>..\..\..\..\software\cmsis\Device\ARM\CMSDK_CM0plus\Source\ARM\startup_CMSDK_CM0plus.s</FilePath> + </File> + </Files> + </Group> + <Group> + <GroupName>Application</GroupName> + <Files> + <File> + <FileName>dualtimer_demo.c</FileName> + <FileType>1</FileType> + <FilePath>..\..\..\..\software\common\demos\dualtimer_demo.c</FilePath> + </File> + <File> + <FileName>uart_stdout.c</FileName> + <FileType>1</FileType> + <FilePath>..\..\..\..\software\common\retarget\uart_stdout.c</FilePath> + </File> + <File> + <FileName>retarget.c</FileName> + <FileType>1</FileType> + <FilePath>..\..\..\..\software\common\retarget\retarget.c</FilePath> + </File> + </Files> + </Group> + <Group> + <GroupName>System</GroupName> + <Files> + <File> + <FileName>system_CMSDK_CM0plus.c</FileName> + <FileType>1</FileType> + <FilePath>..\..\..\..\software\cmsis\Device\ARM\CMSDK_CM0plus\Source\system_CMSDK_CM0plus.c</FilePath> + </File> + </Files> + </Group> + </Groups> + </Target> + </Targets> + +</Project> diff --git a/Cortex-M0/nanosoc/systems/mcu/testcodes/dualtimer_demo/makefile b/Cortex-M0/nanosoc/systems/mcu/testcodes/dualtimer_demo/makefile new file mode 100644 index 0000000..6863911 --- /dev/null +++ b/Cortex-M0/nanosoc/systems/mcu/testcodes/dualtimer_demo/makefile @@ -0,0 +1,250 @@ +#----------------------------------------------------------------------------- +# The confidential and proprietary information contained in this file may +# only be used by a person authorised under and to the extent permitted +# by a subsisting licensing agreement from Arm Limited or its affiliates. +# +# (C) COPYRIGHT 2010-2013 Arm Limited or its affiliates. +# ALL RIGHTS RESERVED +# +# This entire notice must be reproduced on all copies of this file +# and copies of this file may only be made by a person if such person is +# permitted to do so under the terms of a subsisting license agreement +# from Arm Limited or its affiliates. +# +# SVN Information +# +# Checked In : $Date: 2017-10-10 15:55:38 +0100 (Tue, 10 Oct 2017) $ +# +# Revision : $Revision: 371321 $ +# +# Release Information : Cortex-M System Design Kit-r1p1-00rel0 +#----------------------------------------------------------------------------- +# +# Cortex-M System Design Kit software compilation make file +# +#----------------------------------------------------------------------------- +# +# Configurations +# +# Choose the core instantiated, can be +# - CORTEX_M0 +# - CORTEX_M0PLUS +CPU_PRODUCT = CORTEX_M0PLUS + +# Shared software directory +SOFTWARE_DIR = ../../../../software +CMSIS_DIR = $(SOFTWARE_DIR)/cmsis +CORE_DIR = $(CMSIS_DIR)/CMSIS/Include + +ifeq ($(CPU_PRODUCT),CORTEX_M0PLUS) + DEVICE_DIR = $(CMSIS_DIR)/Device/ARM/CMSDK_CM0plus +else + DEVICE_DIR = $(CMSIS_DIR)/Device/ARM/CMSDK_CM0 +endif + +# Program file +TESTNAME = dualtimer_demo + +# Endian Option +COMPILE_BIGEND = 0 + +# Configuration +ifeq ($(CPU_PRODUCT),CORTEX_M0PLUS) + USER_DEFINE = -DCORTEX_M0PLUS +else + USER_DEFINE = -DCORTEX_M0 +endif + +DEPS_LIST = makefile + +# Tool chain : ds5 / gcc / keil +TOOL_CHAIN = ds5 + +ifeq ($(TOOL_CHAIN),ds5) + ifeq ($(CPU_PRODUCT),CORTEX_M0PLUS) + CPU_TYPE = --cpu Cortex-M0plus + else + CPU_TYPE = --cpu Cortex-M0 + endif +endif + +ifeq ($(TOOL_CHAIN),gcc) + ifeq ($(CPU_PRODUCT),CORTEX_M0PLUS) + CPU_TYPE = -mcpu=cortex-m0plus + else + CPU_TYPE = -mcpu=cortex-m0 + endif +endif + +# Startup code directory for DS-5 +ifeq ($(TOOL_CHAIN),ds5) + STARTUP_DIR = $(DEVICE_DIR)/Source/ARM +endif + +# Startup code directory for gcc +ifeq ($(TOOL_CHAIN),gcc) + STARTUP_DIR = $(DEVICE_DIR)/Source/GCC +endif + +ifeq ($(CPU_PRODUCT),CORTEX_M0PLUS) + STARTUP_FILE = startup_CMSDK_CM0plus + SYSTEM_FILE = system_CMSDK_CM0plus +else + STARTUP_FILE = startup_CMSDK_CM0 + SYSTEM_FILE = system_CMSDK_CM0 +endif + +# --------------------------------------------------------------------------------------- +# DS-5 options + +# MicroLIB option (DS-5) +COMPILE_MICROLIB = 0 + +# Small Multiply (Cortex-M0/M0+ has small multiplier option) +COMPILE_SMALLMUL = 0 + +ARM_CC_OPTIONS = -c -O3 -g -Otime -I $(DEVICE_DIR)/Include -I $(CORE_DIR) \ + -I $(SOFTWARE_DIR)/common/retarget $(USER_DEFINE) +ARM_ASM_OPTIONS = -g +ARM_LINK_OPTIONS = "--keep=$(STARTUP_FILE).o(RESET)" "--first=$(STARTUP_FILE).o(RESET)" \ + --rw_base 0x30000000 --ro_base 0x00000000 --map + +ifeq ($(COMPILE_BIGEND),1) + # Big Endian + ARM_CC_OPTIONS += --bigend + ARM_ASM_OPTIONS += --bigend + ARM_LINK_OPTIONS += --be8 +endif + +ifeq ($(COMPILE_MICROLIB),1) + # MicroLIB + ARM_CC_OPTIONS += --library_type=microlib + ARM_ASM_OPTIONS += --library_type=microlib --pd "__MICROLIB SETA 1" + ARM_LINK_OPTIONS += --library_type=microlib +endif + +ifeq ($(COMPILE_SMALLMUL),1) + # In Cortex-M0, small multiply takes 32 cycles + ARM_CC_OPTIONS += --multiply_latency=32 +endif + + +# --------------------------------------------------------------------------------------- +# gcc options + +GNG_CC = arm-none-eabi-gcc +GNU_OBJDUMP = arm-none-eabi-objdump +GNU_OBJCOPY = arm-none-eabi-objcopy + +LINKER_SCRIPT_PATH = $(SOFTWARE_DIR)/common/scripts +LINKER_SCRIPT = $(LINKER_SCRIPT_PATH)/cmsdk_cm0.ld + +GNU_CC_FLAGS = -g -O3 -mthumb $(CPU_TYPE) + +ifeq ($(COMPILE_BIGEND),1) + # Big Endian + GNU_CC_FLAGS += -mbig-endian +endif + +# --------------------------------------------------------------------------------------- +all: all_$(TOOL_CHAIN) + +# --------------------------------------------------------------------------------------- +# DS-5 +all_ds5 : $(TESTNAME).hex $(TESTNAME).lst + +$(TESTNAME).o : $(SOFTWARE_DIR)/common/demos/$(TESTNAME).c $(DEPS_LIST) + armcc $(ARM_CC_OPTIONS) $(CPU_TYPE) $< -o $@ + +$(SYSTEM_FILE).o : $(DEVICE_DIR)/Source/$(SYSTEM_FILE).c $(DEPS_LIST) + armcc $(ARM_CC_OPTIONS) $(CPU_TYPE) $< -o $@ + +retarget.o : $(SOFTWARE_DIR)/common/retarget/retarget.c $(DEPS_LIST) + armcc $(ARM_CC_OPTIONS) $(CPU_TYPE) $< -o $@ + +uart_stdout.o : $(SOFTWARE_DIR)/common/retarget/uart_stdout.c $(DEPS_LIST) + armcc $(ARM_CC_OPTIONS) $(CPU_TYPE) $< -o $@ + +$(STARTUP_FILE).o : $(STARTUP_DIR)/$(STARTUP_FILE).s $(DEPS_LIST) + armasm $(ARM_ASM_OPTIONS) $(CPU_TYPE) $< -o $@ + +$(TESTNAME).ELF : $(TESTNAME).o $(SYSTEM_FILE).o $(STARTUP_FILE).o retarget.o uart_stdout.o + armlink $(ARM_LINK_OPTIONS) $(TESTNAME).o $(SYSTEM_FILE).o $(STARTUP_FILE).o retarget.o uart_stdout.o -o $@ + +$(TESTNAME).hex : $(TESTNAME).ELF + fromelf --vhx --8x1 $< --output $@ + + +$(TESTNAME).lst : $(TESTNAME).ELF + fromelf -c -d -e -s $< --output $@ + +# --------------------------------------------------------------------------------------- +# gcc +all_gcc: + $(GNG_CC) $(GNU_CC_FLAGS) $(STARTUP_DIR)/$(STARTUP_FILE).s \ + $(SOFTWARE_DIR)/common/demos/$(TESTNAME).c \ + $(SOFTWARE_DIR)/common/retarget/retarget.c \ + $(SOFTWARE_DIR)/common/retarget/uart_stdout.c \ + $(DEVICE_DIR)/Source/$(SYSTEM_FILE).c \ + -I $(DEVICE_DIR)/Include -I $(CORE_DIR) \ + -I $(SOFTWARE_DIR)/common/retarget \ + -L $(LINKER_SCRIPT_PATH) \ + -D__STACK_SIZE=0x200 \ + -D__HEAP_SIZE=0x1000 \ + $(USER_DEFINE) -T $(LINKER_SCRIPT) -o $(TESTNAME).o + # Generate disassembly code + $(GNU_OBJDUMP) -S $(TESTNAME).o > $(TESTNAME).lst + # Generate binary file + $(GNU_OBJCOPY) -S $(TESTNAME).o -O binary $(TESTNAME).bin + # Generate hex file + $(GNU_OBJCOPY) -S $(TESTNAME).o -O verilog $(TESTNAME).hex + +# Note: +# If the version of object copy you are using does not support verilog hex file output, +# you can generate the hex file from binary file using the following command +# od -v -A n -t x1 --width=1 $(TESTNAME).bin > $(TESTNAME).hex + +# --------------------------------------------------------------------------------------- +# Keil MDK + +all_keil: + @echo "Please compile your project code and press ENTER when ready" + @read dummy + +# --------------------------------------------------------------------------------------- +# Binary + +all_bin: $(TESTNAME).bin + # Generate hex file from binary + od -v -A n -t x1 --width=1 $(TESTNAME).bin > $(TESTNAME).hex + +# --------------------------------------------------------------------------------------- +# Clean +clean : + @rm -rf *.o + @if [ -e $(TESTNAME).hex ] ; then \ + rm -rf $(TESTNAME).hex ; \ + fi + @if [ -e $(TESTNAME).lst ] ; then \ + rm -rf $(TESTNAME).lst ; \ + fi + @if [ -e $(TESTNAME).ELF ] ; then \ + rm -rf $(TESTNAME).ELF ; \ + fi + @if [ -e $(TESTNAME).bin ] ; then \ + rm -rf $(TESTNAME).bin ; \ + fi + @rm -rf *.crf + @rm -rf *.plg + @rm -rf *.tra + @rm -rf *.htm + @rm -rf *.map + @rm -rf *.dep + @rm -rf *.d + @rm -rf *.lnp + @rm -rf *.bak + @rm -rf *.lst + @rm -rf *.axf + @rm -rf *.sct + @rm -rf *.__i + @rm -rf *._ia diff --git a/Cortex-M0/nanosoc/systems/mcu/testcodes/generic/config_id.h b/Cortex-M0/nanosoc/systems/mcu/testcodes/generic/config_id.h new file mode 100644 index 0000000..3a4f01b --- /dev/null +++ b/Cortex-M0/nanosoc/systems/mcu/testcodes/generic/config_id.h @@ -0,0 +1,408 @@ +//----------------------------------------------------------------------------- +// The confidential and proprietary information contained in this file may +// only be used by a person authorised under and to the extent permitted +// by a subsisting licensing agreement from Arm Limited or its affiliates. +// +// (C) COPYRIGHT 2013 Arm Limited or its affiliates. +// ALL RIGHTS RESERVED +// +// This entire notice must be reproduced on all copies of this file +// and copies of this file may only be made by a person if such person is +// permitted to do so under the terms of a subsisting license agreement +// from Arm Limited or its affiliates. +// +// SVN Information +// +// Checked In : $Date: 2017-10-10 15:55:38 +0100 (Tue, 10 Oct 2017) $ +// +// Revision : $Revision: 371321 $ +// +// Release Information : Cortex-M System Design Kit-r1p1-00rel0 +//----------------------------------------------------------------------------- +// + +#define TEST_PASS 0 +#define TEST_FAIL 1 +//============================================================================== +// Cortex-M0+ & Cortex-M0 IDs header File +//============================================================================== + +// Values used by generic tests, such as debug_tests, romtable_tests + +#ifdef CORTEX_M0PLUS +#define MCU_CPU_NAME "Cortex-M0+" +#define MCU_CPU_ID_VALUE 0x410cc601 +#define MCU_DP_IDR_VALUE 0x0BC11477 +#define MCU_AP_IDR_VALUE 0x04770031 +#define MCU_AP_BASE_VALUE 0xF0000003 +#else +#define MCU_CPU_NAME "Cortex-M0" +#define MCU_CPU_ID_VALUE 0x410cc200 +#define MCU_DP_IDR_VALUE 0x0BB11477 +#define MCU_AP_IDR_VALUE 0x04770021 +#define MCU_AP_BASE_VALUE 0xE00FF003 +#endif + +//============================================================================== +// +// GenericID values - DO NOT MODIFY +// + +// CoreSight Component Identifier for Peripheral classes +#define CORESIGHT_CID0 0x0D +#define CORESIGHT_CID1_tbl 0x10 +#define CORESIGHT_CID1_dbg 0x90 +#define CORESIGHT_CID1_mem 0xE0 +#define CORESIGHT_CID1_prm 0xF0 +#define CORESIGHT_CID2 0x05 +#define CORESIGHT_CID3 0xB1 + +// Component Part Numbers +#define ARM_JEP_ID 0x3B +#define ARM_JEP_CONT 0x4 + +//============================================================================== +// +// Cortex-M0 ID values +#define CORTEXM0_CPUID 0x410cc200 + +#define CM0_CPU_PART 0x471 +#define CM0_SCS_PART 0x008 +#define CM0_DWT_PART 0x00A +#define CM0_BPU_PART 0x00B +#define CM0_CPU_PART 0x471 +#define CM0_CSI_PART 0x4C2 +#define CS_CTI_PART 0x906 +#define CM0_DAP_DP_PART 0xBB + +// Revision Codes +#define CM0_ROM_REV 0x0 +#define CM0_SCS_REV 0x0 +#define CM0_DWT_REV 0x0 +#define CM0_BPU_REV 0x0 + +// Revand +#define CM0_ROM_ECO 0x0 +#define CM0_SCS_ECO 0x0 +#define CM0_DWT_ECO 0x0 +#define CM0_BPU_ECO 0x0 + +#define CORTEXM0DAP_JTAG_TAPID 0x0BA01477 +#define CORTEXM0DAP_JTAG_DPIDR 0x0BB11477 +#define CORTEXM0DAP_SW_DPIDR 0x0BB11477 +#define CORTEXM0DAP_AP_IDR 0x04770021 + +#define CORTEXM0_ROM_PID3 0x00 +#define CORTEXM0_SCS_PID3 0x00 +#define CORTEXM0_DWT_PID3 0x00 +#define CORTEXM0_BPU_PID3 0x00 + +//============================================================================== +// +// Cortex-M0+ ID values +#define CORTEXM0PLUS_CPUID (0x410cc601 ^ (EXPECTED_ECOREVNUM & 0x0000000F)) + +#define CM0P_CPU_PART 0x4C0 +#define CM0P_SCS_PART 0x008 +#define CM0P_DWT_PART 0x00A +#define CM0P_BPU_PART 0x00B +#define CM0P_MTB_PART 0x932 +#define CM0P_CSI_PART 0x4C1 +#define CM0P_CTI_PART 0x9A6 +#define CM0P_DAP_DP_PART 0xBC + +// Revision Codes +#define CM0P_ROM_REV 0x0 +#define CM0P_SCS_REV 0x0 +#define CM0P_DWT_REV 0x0 +#define CM0P_BPU_REV 0x0 +#define CM0P_MTB_REV 0x1 +#define CM0P_DAP_DP_REV (0x0 ^ ((EXPECTED_ECOREVNUM & 0x0F000000) >> 24)) +#define CM0P_DAP_AP_REV (0x0 ^ ((EXPECTED_ECOREVNUM & 0x00F00000) >> 20)) + +// Revand +#define CM0P_ROM_ECO ((EXPECTED_ECOREVNUM & 0x000F0000) >> 16) +#define CM0P_SCS_ECO ((EXPECTED_ECOREVNUM & 0x0000F000) >> 12) +#define CM0P_DWT_ECO ((EXPECTED_ECOREVNUM & 0x00000F00) >> 8) +#define CM0P_BPU_ECO ((EXPECTED_ECOREVNUM & 0x000000F0) >> 4) +#define CM0P_MTB_ECO ((EXPECTED_ECOREVNUM & 0xF0000000) >> 28) + +// DAP Registers +#define CM0P_DAP_JTAG_TAPID (0x0BA01477 | (CM0P_DAP_DP_REV << 28)) +#define CM0P_DAP_JTAG_DPIDR (0x0BC11477 | (CM0P_DAP_DP_REV << 28)) +#define CM0P_DAP_SW_DPIDR (0x0BC11477 | (CM0P_DAP_DP_REV << 28)) +#define CM0P_DAP_SWMD_DPIDR (0x0BC12477 | (CM0P_DAP_DP_REV << 28)) +#define CM0P_DAP_APIDR (0x04770031 | (CM0P_DAP_AP_REV << 28)) + +//============================================================================== + +//===================================================================== +// Cortex-M0 & Cortex-M0+ Configuration +//===================================================================== + +//////////////////////////////////////////////////////////////////////////////// +// +// Processor configuration options. +// These must match the expected hardware configuration of the processor. +// +// - EXPECTED_BE : Expected Endianness (0-1) +// - EXPECTED_BKPT : Expected number of Breakpoint Comparators (0-4) +// - EXPECTED_DBG : Expected Debug config (0-1) +// - EXPECTED_NUMIRQ : Expected number of IRQ lines (0-32) +// - EXPECTED_SMUL : Expected Multiplier config (0-1) +// - EXPECTED_SYST : Expected SysTick extension (0-1) +// - EXPECTED_WPT : Expected number of Watchpoint Comparators (0-2) +// +// Processor Tie-offs +// +// - EXPECTED_STCALIB : Expected value of STCALIB (0-0x3FFFFFF) +// +//////////////////////////////////////////////////////////////////////////////// +// +// System ROM Table options. +// These must match the values in the System ROM Table. +// +// - EXPECTED_CUST_JEP_ID : Expected JEDEC JEP-106 identity code (0-0x7F) +// - EXPECTED_CUST_JEP_CONT : Expected JEDEC JEP-106 continuation code (0-0xF) +// - EXPECTED_CUST_PART : Expected Part number (0-0xFFF) +// - EXPECTED_CUST_REV : Expected Revision number (0-0xF) +// - EXPECTED_CUST_REVAND : Expected Manufacturer Revision number (0-0xF) +// +//////////////////////////////////////////////////////////////////////////////// +// +// Engineering Change Order and Revision Number Tie-off. +// +// - EXPECTED_ECOREVNUM : Expected Engineering Change Order and Revision number (0-0xFFFFFFFF) +// +//////////////////////////////////////////////////////////////////////////////// + +// <h> Processor configuration options +// <o> EXPECTED_BE: Expected Endianness <0=> Little Endian <1=> Big Endian +#define EXPECTED_BE 0 + + +// <o> EXPECTED_BKPT: Expected number of Breakpoint Comparators <0-4> +#define EXPECTED_BKPT 4 + + +// <o> EXPECTED_DBG: Expected Debug config <0=> Absent <1=> Present +#define EXPECTED_DBG 1 + + +// <o> EXPECTED_NUMIRQ: Expected number of IRQ lines <0-32> +#define EXPECTED_NUMIRQ 32 + + +// <o> EXPECTED_SMUL: Expected Small Multiplier config <0=> Absent (Fast Multiplier) <1=> Present (Small Multiplier) +#define EXPECTED_SMUL 0 + + +// <o> EXPECTED_SYST: Expected SysTick extension <0=> Absent <1=> Present +#define EXPECTED_SYST 1 + + +// <o> EXPECTED_WPT: Expected number of Watchpoint Comparators <0-2> +#define EXPECTED_WPT 2 + + +// <o> EXPECTED_SIMPLE_CHECK: <1=> only run the simple CPUID check <0=> more complex check included +// like Lockup, Sleep, other ID check etc +#define EXPECTED_SIMPLE_CHECK 0 + + +// <h> Processor port Tie-Offs +// <o> EXPECTED_STCALIB: Expected value of STCALIB[25:0] at CORTEXM0INTEGRATION or CORTEXM0 <0x0-0x3FFFFFF> +#define EXPECTED_STCALIB 0x1028B0A + + +// <o> EXPECTED_BASEADDR: Expected value of BASEADDR[31:0] at CORTEXM0DAP <0x0-0xFFFFFFFF> +#ifdef CORTEX_M0 +#define EXPECTED_BASEADDR 0xE00FF003 +#else +#define EXPECTED_BASEADDR 0xF0000003 +#endif + +// <o> EXPECTED_JTAGnSW: Expected Cortex M0(+) DAP Protocol <0=> Serial Wire <1=> JTAG +#define EXPECTED_JTAGnSW 0 + +// <h> System ROM Table ID values +// <o> EXPECTED_CUST_JEP_ID: Expected JEDEC JEP-106 identity code (0-0x7F) +#define EXPECTED_CUST_JEP_ID 0x00 + + +// <o> EXPECTED_CUST_JEP_CONT: Expected JEDEC JEP-106 continuation code (0-0xF) +#define EXPECTED_CUST_JEP_CONT 0x0 + + +// <o> EXPECTED_CUST_PART: Expected Part number (0-0xFFF) +#define EXPECTED_CUST_PART 0x000 + + +// <o> EXPECTED_CUST_REV: Expected Revision number (0-0xF) +#define EXPECTED_CUST_REV 0x0 + + +// <o> EXPECTED_CUST_REVAND: Expected Manufacturer Revision number (0-0xF) +#define EXPECTED_CUST_REVAND 0x0 + +// </h> + +// <h> EXPECTED_ECOREVNUM +// <o> EXPECTED_ECOREVNUM: Expected Engineering Change Order and Revision number (0-0xFFFFFFFF) +#define EXPECTED_ECOREVNUM 0x00000000 + +// </h> + +// <h> CSI and CTI - Used by romtable test only +// <o> EXPECTED_CSI: Expected CoreSight Integration Level <0=> Absent <1=> Present +#define EXPECTED_CSI 0 + +// <o> EXPECTED_CTI: Expected Cross Trigger Interface <0=> Absent <1=> Present +#define EXPECTED_CTI 0 +// </h> + +//===================================================================== +// Cortex-M0+ Configuration +//===================================================================== + +//////////////////////////////////////////////////////////////////////////////// +// +// Processor configuration options. +// These must match the expected hardware configuration of the processor. +// +// - EXPECTED_BE : Expected Endianness (0-1) +// - EXPECTED_BKPT : Expected number of Breakpoint Comparators (0-4) +// - EXPECTED_DBG : Expected Debug config (0-1) +// - EXPECTED_IOP : Expected IOP config (0-1) +// - EXPECTED_IRQDIS : Expected IRQ disable (0-0xFFFFFFFF) +// - EXPECTED_MPU : Expected MPU config (0,8) +// - EXPECTED_NUMIRQ : Expected number of IRQ lines (0-32) +// - EXPECTED_SMUL : Expected Multiplier config (0-1) +// - EXPECTED_SYST : Expected SysTick extension (0-1) +// - EXPECTED_USER : Expected User config (0-1) +// - EXPECTED_VTOR : Expected VTOR config (0-1) +// - EXPECTED_WIC : Expected Wake-up interrupt controller support <0-1> +// - EXPECTED_WICLINES : Expected number of supported WIC lines <2-34> +// - EXPECTED_WPT : Expected number of Watchpoint Comparators (0-2) +// +// Processor Tie-offs +// +// - EXPECTED_STCALIB : Expected value of STCALIB (0-0x3FFFFFF) +// +//////////////////////////////////////////////////////////////////////////////// +// +// DAP configuration options. +// These must match the expected hardware configuration of the DAP. +// +// - EXPECTED_BASEADDR : Expected BASEADDR at Cortex M0+ DAP (0-0xFFFFFFFF) +// - EXPECTED_JTAGnSW : Expected Cortex M0+ DAP Protocol (0,1) +// - EXPECTED_SWMD : Expected SW Multi-Drop config (0-1) +// +// DAP Tie-offs +// +// - EXPECTED_INSTANCEID : Expected DAP instance number (0-0xF) +// - EXPECTED_TREVISION : Expected Revision number (0-0xF) +// - EXPECTED_TPARTNO : Expected Part number (0-0xFFFF) +// - EXPECTED_TDESIGNER : Expected Designer code (0-0x7FF) +// +//////////////////////////////////////////////////////////////////////////////// +// +// CoreSight MTB-M0+ configuration options. +// +// - EXPECTED_MTB : Expected CoreSight MTB-M0+ config (0-1) +// - EXPECTED_MTB_BASEADDR : Expected CoreSight MTB-M0+ BASEADDR (0-0xFFFFFFFF) +// - EXPECTED_MTB_AWIDTH : Expected CoreSight MTB-M0+ Address width (5-32) +// +// NOTE : When the MTB (EXPECTED_MTB = 1) is included, the RAM that is used for +// the data accesses is shared with the MTB, so if you set the address +// width to be smaller than the default (EXPECTED_MTB_AWIDTH = 16), the +// addresses that some tests are using to write data to will alias to +// lower addresses,so some tests will not work with smaller memory. +// +//////////////////////////////////////////////////////////////////////////////// +// +// System ROM Table options. +// These must match the values in the System ROM Table. +// +// - EXPECTED_CUST_JEP_ID : Expected JEDEC JEP-106 identity code (0-0x7F) +// - EXPECTED_CUST_JEP_CONT : Expected JEDEC JEP-106 continuation code (0-0xF) +// - EXPECTED_CUST_PART : Expected Part number (0-0xFFF) +// - EXPECTED_CUST_REV : Expected Revision number (0-0xF) +// - EXPECTED_CUST_REVAND : Expected Manufacturer Revision number (0-0xF) +// +//////////////////////////////////////////////////////////////////////////////// +// +// Engineering Change Order and Revision Number Tie-off. +// +// - EXPECTED_ECOREVNUM : Expected Engineering Change Order and Revision number (0-0xFFFFFFFF) +// +//////////////////////////////////////////////////////////////////////////////// + +// <h> Processor configuration options +// <o> EXPECTED_IOP: Expected IOP config <0=> Absent <1=> Present +#define EXPECTED_IOP 0 + + +// <o> EXPECTED_IRQDIS: Expected interrupt disable <0x0-0xFFFFFFFF> +#define EXPECTED_IRQDIS 0x00000000 + + +// <o> EXPECTED_MPU: Expected MPU config <0=> Absent <8=> Present (8 Regions) +#define EXPECTED_MPU 8 + + +// <o> EXPECTED_USER: Expected User config <0=> Absent (Privilege mode only) <1=> Present +#define EXPECTED_USER 1 + + +// <o> EXPECTED_VTOR: Expected VTOR config <0=> Absent <1=> Present +#define EXPECTED_VTOR 1 + + +// <o> EXPECTED_WIC: Expected Wake-up interrupt controller support <0-1> +#define EXPECTED_WIC 1 + + +// <o> EXPECTED_WICLINES : Expected number of supported WIC lines <2-34> +#define EXPECTED_WICLINES 34 + + +// <h> Processor port Tie-Offs +// <o> EXPECTED_SWMD: Expected SW Multi-Drop config <0=> Absent <1=> Present (Serial Wire Protocol 2) +#define EXPECTED_SWMD 0 + +// </h> + +// <h> DAP Tie-offs +// <o> EXPECTED_INSTANCEID: Expected DAP instance number (0-0xF) +#define EXPECTED_INSTANCEID 0x0 + + +// <o> EXPECTED_TREVISION: Expected Revision number (0-0xF) +#define EXPECTED_TREVISION 0x0 + + +// <o> EXPECTED_TPARTNO: Expected Part number (0-0xFFFF) +#define EXPECTED_TPARTNO 0x0000 + + +// <o> EXPECTED_TDESIGNER: Expected Designer code (0-0x7FF) +#define EXPECTED_TDESIGNER 0x000 + +// </h> + +// <h> CoreSight MTB-M0+ configuration options +// <o> EXPECTED_MTB: Expected CoreSight MTB-M0+ config <0=> Absent <1=> Present +#define EXPECTED_MTB 0 + + +// <o> EXPECTED_MTB_BASEADDR: Expected CoreSight MTB-M0+ BASEADDR <0x0-0xFFFFFFFF> +#define EXPECTED_MTB_BASEADDR 0xF0210000 + + +// <o> EXPECTED_MTB_AWIDTH: Expected CoreSight MTB-M0+ Address width <5-32> +#define EXPECTED_MTB_AWIDTH 16 + +// </h> + +// <<< end of configuration section >>> diff --git a/Cortex-M0/nanosoc/systems/mcu/testcodes/generic/mcu_debugtester_interface.c b/Cortex-M0/nanosoc/systems/mcu/testcodes/generic/mcu_debugtester_interface.c new file mode 100644 index 0000000..75f73a1 --- /dev/null +++ b/Cortex-M0/nanosoc/systems/mcu/testcodes/generic/mcu_debugtester_interface.c @@ -0,0 +1,131 @@ +/* + *----------------------------------------------------------------------------- + * The confidential and proprietary information contained in this file may + * only be used by a person authorised under and to the extent permitted + * by a subsisting licensing agreement from Arm Limited or its affiliates. + * + * (C) COPYRIGHT 2010-2013 Arm Limited or its affiliates. + * ALL RIGHTS RESERVED + * + * This entire notice must be reproduced on all copies of this file + * and copies of this file may only be made by a person if such person is + * permitted to do so under the terms of a subsisting license agreement + * from Arm Limited or its affiliates. + * + * SVN Information + * + * Checked In : $Date: $ + * + * Revision : $Revision: $ + * + * Release Information : Cortex-M System Design Kit-r1p1-00rel0 + *----------------------------------------------------------------------------- + */ + +#include "mcu_debugtester_interface.h" // For definition of interface to the debug tester + +void EnableDebugTester(void) +{ + uint32_t i; + + + // + // Initialise GPIO from MCU to Debug Tester + // + + //Initialize the GPIO0 higher 8 bits output value, set to 0 + CMSDK_GPIO0->DATAOUT = (0x00000000); //set GPIO output to 0 for default value, disable the function strobe + CMSDK_gpio_SetOutEnable (CMSDK_GPIO0, DEBUG_CMD); // set specified bit in out enable register + + + // + // Enable the Debug Tester in the testbench + // + + // send command to enable the connection to debug tester + UartPutc((char) DBG_ESCAPE); //send ESCAPE code + UartPutc((char) DBG_CONNECT_ENABLE); //send debug test enable command + puts("\nEnabling debug tester...\n"); + // If debug tester is not present, + if((CMSDK_GPIO0->DATA & DEBUG_ERROR) != 0) + { + puts("DBGERROR bit (debug error) asserted.\n"); + puts("Debug tester not available:\n"); + puts("1: The ARM_CMSDK_INCLUDE_DEBUG_TESTER macro is not defined, or\n"); + puts("2: Cortex-M0 DesignStart is used\n"); + puts("** TEST SKIPPED **\n"); + // End simulation + UartEndSimulation(); + } + + + // + // Initialise the Communication Region + // (Zero the 4 words above Stack Top) + // + + for(i=0; i<4 ; i++) + { + DEBUGTESTERDATA[i] = 0; + } +} + + +void DisableDebugTester(void) +{ + //send command to disable the connection to debug tester + UartPutc((char) DBG_ESCAPE); //send debug test disable command, + UartPutc((char) DBG_CONNECT_DISABLE); //send debug test disable command, + UartEndSimulation(); //stop simulation +} + + +//=========================================================================== +// Start a function running on the debug tester +//=========================================================================== +void StartDebugTester(uint32_t Function) +{ + // Write function onto function select pins + CMSDK_gpio_SetOutEnable (CMSDK_GPIO0, DEBUG_CMD); // set specified bit in out enable register + + //setup function select and function strobe + CMSDK_gpio_MaskedWrite(CMSDK_GPIO0, Function<<DEBUG_BIT_LOC | DEBUG_STROBE, DEBUG_CMD|DEBUG_STROBE); + + // Wait to see Running asserted + while((CMSDK_GPIO0->DATA & DEBUG_RUNNING) == 0); + + // Clear strobe + CMSDK_gpio_MaskedWrite(CMSDK_GPIO0, 0x0, DEBUG_STROBE); +} + + +//=========================================================================== +// Check that a debug tester function completed +// Return pass/fail accordingly +//=========================================================================== +uint32_t CheckDebugTester(void) +{ + // Wait to see Running deasserted + while((CMSDK_GPIO0->DATA & DEBUG_RUNNING)!= 0); + + // Return status, check ERROR bit + if((CMSDK_GPIO0->DATA & DEBUG_ERROR) == 0) + { + return TEST_PASS; + } + else + { + return TEST_FAIL; + } +} + + +//=========================================================================== +// Execute a debug tester function +//=========================================================================== +uint32_t CallDebugTester(uint32_t Function) +{ + StartDebugTester(Function); + return CheckDebugTester(); +} + diff --git a/Cortex-M0/nanosoc/systems/mcu/testcodes/generic/mcu_debugtester_interface.h b/Cortex-M0/nanosoc/systems/mcu/testcodes/generic/mcu_debugtester_interface.h new file mode 100644 index 0000000..162672d --- /dev/null +++ b/Cortex-M0/nanosoc/systems/mcu/testcodes/generic/mcu_debugtester_interface.h @@ -0,0 +1,102 @@ +//----------------------------------------------------------------------------- +// The confidential and proprietary information contained in this file may +// only be used by a person authorised under and to the extent permitted +// by a subsisting licensing agreement from Arm Limited or its affiliates. +// +// (C) COPYRIGHT 2010-2013 Arm Limited or its affiliates. +// ALL RIGHTS RESERVED +// +// This entire notice must be reproduced on all copies of this file +// and copies of this file may only be made by a person if such person is +// permitted to do so under the terms of a subsisting license agreement +// from Arm Limited or its affiliates. +// +// SVN Information +// +// Checked In : $Date: 2013-01-18 17:35:18 +0000 (Fri, 18 Jan 2013) $ +// +// Revision : $Revision: 234195 $ +// +// Release Information : Cortex-M System Design Kit-r1p1-00rel0 +//----------------------------------------------------------------------------- +// + +// +// Definition of CMSDK example MCU to the Debug Tester +// +#ifdef CORTEX_M0 +#include "CMSDK_CM0.h" + +#else +#ifdef CORTEX_M0PLUS +#include "CMSDK_CM0plus.h" + +#else +#ifdef CORTEX_M3 +#include "CMSDK_CM3.h" + +#else +#ifdef CORTEX_M4 +#include "CMSDK_CM4.h" + +#endif +#endif +#endif +#endif + +#include <stdio.h> +#include "uart_stdout.h" // for stdout +#include "CMSDK_driver.h" +#include "config_id.h" // general defines such as test_pass + + +// Functions used by tests that communicate with the Debug Tester +extern void EnableDebugTester(void); +extern void DisableDebugTester(void); +extern uint32_t CallDebugTester(uint32_t); +extern void StartDebugTester(uint32_t); +extern uint32_t CheckDebugTester(void); + + +//Test command sequence definition +#define DBG_ESCAPE 0x1B +#define DBG_CONNECT_ENABLE 0x11 +#define DBG_CONNECT_DISABLE 0x12 +#define DBG_SIM_STOP 0x4 + + +// GPIO0 bit allocation +// +// CM0_MCU GPIO0 -------------------------------------- Debug Tester +// +// GPIO[15] 7 <----------------------------------------< Running +// GPIO[14] 6 <----------------------------------------< Error +// GPIO[13] 5 >----------------------------------------> Function Strobe +// GPIO[12] 4 >----------------------------------------> Function Select bit 4 +// GPIO[11] 3 >----------------------------------------> Function Select bit 3 +// GPIO[10] 2 >----------------------------------------> Function Select bit 2 +// GPIO[9] 1 >----------------------------------------> Function Select bit 1 +// GPIO[8] 0 >----------------------------------------> Function Select bit 0 +// +#define DEBUG_BIT_LOC 8 //GPIO[8] is the least bit of Function Select +#define DEBUG_CMD 0x3f<<8 //GPIO [13:8] +#define DEBUG_STROBE 0x00002000 //GPIO [13] +#define DEBUG_ERROR 0x00004000 //GPIO [14] +#define DEBUG_RUNNING 0x00008000 //GPIO [15] + +// GPIO1[7] 7 +// GPIO1[6] 6 +// GPIO1[5] 5 +// GPIO1[4] 4 +// GPIO1[3] 3 +// GPIO1[2] 2 +// GPIO1[1] 1 +// GPIO1[0] 0 + + +// CMSDK example MCU's view of the memory shared with the debugtester +// (4 words above stack top) +// This macro uses the SP value from the vector table as stacktop +// The stacktop cannot be set to the top of the memory. +#define DEBUGTESTERDATA ((volatile uint32_t *) *((uint32_t *) 0x0)) + diff --git a/Cortex-M0/nanosoc/systems/mcu/testcodes/gpio_driver_tests/gpio_driver_tests_cm0.uvopt b/Cortex-M0/nanosoc/systems/mcu/testcodes/gpio_driver_tests/gpio_driver_tests_cm0.uvopt new file mode 100644 index 0000000..3b1eeed --- /dev/null +++ b/Cortex-M0/nanosoc/systems/mcu/testcodes/gpio_driver_tests/gpio_driver_tests_cm0.uvopt @@ -0,0 +1,277 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no" ?> +<ProjectOpt xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="project_opt.xsd"> + + <SchemaVersion>1.0</SchemaVersion> + + <Header>### uVision Project, (C) Keil Software</Header> + + <Extensions> + <cExt>*.c</cExt> + <aExt>*.s*; *.src; *.a*</aExt> + <oExt>*.obj</oExt> + <lExt>*.lib</lExt> + <tExt>*.txt; *.h; *.inc</tExt> + <pExt>*.plm</pExt> + <CppX>*.cpp</CppX> + </Extensions> + + <DaveTm> + <dwLowDateTime>0</dwLowDateTime> + <dwHighDateTime>0</dwHighDateTime> + </DaveTm> + + <Target> + <TargetName>Debug</TargetName> + <ToolsetNumber>0x4</ToolsetNumber> + <ToolsetName>ARM-ADS</ToolsetName> + <TargetOption> + <CLKADS>50000000</CLKADS> + <OPTTT> + <gFlags>1</gFlags> + <BeepAtEnd>1</BeepAtEnd> + <RunSim>1</RunSim> + <RunTarget>0</RunTarget> + </OPTTT> + <OPTHX> + <HexSelection>1</HexSelection> + <FlashByte>65535</FlashByte> + <HexRangeLowAddress>0</HexRangeLowAddress> + <HexRangeHighAddress>0</HexRangeHighAddress> + <HexOffset>0</HexOffset> + </OPTHX> + <OPTLEX> + <PageWidth>79</PageWidth> + <PageLength>66</PageLength> + <TabStop>8</TabStop> + <ListingPath>.\</ListingPath> + </OPTLEX> + <ListingPage> + <CreateCListing>1</CreateCListing> + <CreateAListing>1</CreateAListing> + <CreateLListing>1</CreateLListing> + <CreateIListing>0</CreateIListing> + <AsmCond>1</AsmCond> + <AsmSymb>1</AsmSymb> + <AsmXref>0</AsmXref> + <CCond>1</CCond> + <CCode>0</CCode> + <CListInc>0</CListInc> + <CSymb>0</CSymb> + <LinkerCodeListing>0</LinkerCodeListing> + </ListingPage> + <OPTXL> + <LMap>1</LMap> + <LComments>1</LComments> + <LGenerateSymbols>1</LGenerateSymbols> + <LLibSym>1</LLibSym> + <LLines>1</LLines> + <LLocSym>1</LLocSym> + <LPubSym>1</LPubSym> + <LXref>0</LXref> + <LExpSel>0</LExpSel> + </OPTXL> + <OPTFL> + <tvExp>1</tvExp> + <tvExpOptDlg>0</tvExpOptDlg> + <IsCurrentTarget>1</IsCurrentTarget> + </OPTFL> + <CpuCode>255</CpuCode> + <DllOpt> + <SimDllName>SARMCM3.DLL</SimDllName> + <SimDllArguments></SimDllArguments> + <SimDlgDllName>DARMCM1.DLL</SimDlgDllName> + <SimDlgDllArguments></SimDlgDllArguments> + <TargetDllName>SARMCM3.DLL</TargetDllName> + <TargetDllArguments></TargetDllArguments> + <TargetDlgDllName>TARMCM1.DLL</TargetDlgDllName> + <TargetDlgDllArguments></TargetDlgDllArguments> + </DllOpt> + <DebugOpt> + <uSim>1</uSim> + <uTrg>0</uTrg> + <sLdApp>1</sLdApp> + <sGomain>1</sGomain> + <sRbreak>1</sRbreak> + <sRwatch>1</sRwatch> + <sRmem>1</sRmem> + <sRfunc>1</sRfunc> + <sRbox>1</sRbox> + <tLdApp>1</tLdApp> + <tGomain>0</tGomain> + <tRbreak>1</tRbreak> + <tRwatch>1</tRwatch> + <tRmem>1</tRmem> + <tRfunc>0</tRfunc> + <tRbox>1</tRbox> + <tRtrace>0</tRtrace> + <sRunDeb>0</sRunDeb> + <sLrtime>0</sLrtime> + <nTsel>-1</nTsel> + <sDll></sDll> + <sDllPa></sDllPa> + <sDlgDll></sDlgDll> + <sDlgPa></sDlgPa> + <sIfile></sIfile> + <tDll></tDll> + <tDllPa></tDllPa> + <tDlgDll></tDlgDll> + <tDlgPa></tDlgPa> + <tIfile></tIfile> + <pMon></pMon> + </DebugOpt> + <Breakpoint/> + <DebugFlag> + <trace>0</trace> + <periodic>1</periodic> + <aLwin>0</aLwin> + <aCover>0</aCover> + <aSer1>0</aSer1> + <aSer2>0</aSer2> + <aPa>0</aPa> + <viewmode>0</viewmode> + <vrSel>0</vrSel> + <aSym>0</aSym> + <aTbox>0</aTbox> + <AscS1>0</AscS1> + <AscS2>0</AscS2> + <AscS3>0</AscS3> + <aSer3>0</aSer3> + <eProf>0</eProf> + <aLa>0</aLa> + <aPa1>0</aPa1> + <AscS4>0</AscS4> + <aSer4>0</aSer4> + <StkLoc>0</StkLoc> + <TrcWin>0</TrcWin> + <newCpu>0</newCpu> + <uProt>0</uProt> + </DebugFlag> + <Tracepoint> + <THDelay>0</THDelay> + </Tracepoint> + <LintExecutable></LintExecutable> + <LintConfigFile></LintConfigFile> + </TargetOption> + </Target> + + <Group> + <GroupName>Startup</GroupName> + <tvExp>1</tvExp> + <tvExpOptDlg>0</tvExpOptDlg> + <cbSel>0</cbSel> + <RteFlg>0</RteFlg> + <File> + <GroupNumber>1</GroupNumber> + <FileNumber>1</FileNumber> + <FileType>2</FileType> + <tvExp>0</tvExp> + <Focus>0</Focus> + <ColumnNumber>0</ColumnNumber> + <tvExpOptDlg>0</tvExpOptDlg> + <TopLine>0</TopLine> + <CurrentLine>0</CurrentLine> + <bDave2>0</bDave2> + <PathWithFileName>..\..\..\..\software\cmsis\Device\ARM\CMSDK_CM0\Source\ARM\startup_CMSDK_CM0.s</PathWithFileName> + <FilenameWithoutPath>startup_CMSDK_CM0.s</FilenameWithoutPath> + <RteFlg>0</RteFlg> + <bShared>0</bShared> + </File> + </Group> + + <Group> + <GroupName>Application</GroupName> + <tvExp>1</tvExp> + <tvExpOptDlg>0</tvExpOptDlg> + <cbSel>0</cbSel> + <RteFlg>0</RteFlg> + <File> + <GroupNumber>2</GroupNumber> + <FileNumber>2</FileNumber> + <FileType>1</FileType> + <tvExp>0</tvExp> + <Focus>0</Focus> + <ColumnNumber>0</ColumnNumber> + <tvExpOptDlg>0</tvExpOptDlg> + <TopLine>0</TopLine> + <CurrentLine>0</CurrentLine> + <bDave2>0</bDave2> + <PathWithFileName>..\..\..\..\software\common\retarget\uart_stdout.c</PathWithFileName> + <FilenameWithoutPath>uart_stdout.c</FilenameWithoutPath> + <RteFlg>0</RteFlg> + <bShared>0</bShared> + </File> + <File> + <GroupNumber>2</GroupNumber> + <FileNumber>3</FileNumber> + <FileType>1</FileType> + <tvExp>0</tvExp> + <Focus>0</Focus> + <ColumnNumber>0</ColumnNumber> + <tvExpOptDlg>0</tvExpOptDlg> + <TopLine>0</TopLine> + <CurrentLine>0</CurrentLine> + <bDave2>0</bDave2> + <PathWithFileName>..\..\..\..\software\common\retarget\retarget.c</PathWithFileName> + <FilenameWithoutPath>retarget.c</FilenameWithoutPath> + <RteFlg>0</RteFlg> + <bShared>0</bShared> + </File> + <File> + <GroupNumber>2</GroupNumber> + <FileNumber>4</FileNumber> + <FileType>1</FileType> + <tvExp>0</tvExp> + <Focus>0</Focus> + <ColumnNumber>0</ColumnNumber> + <tvExpOptDlg>0</tvExpOptDlg> + <TopLine>0</TopLine> + <CurrentLine>0</CurrentLine> + <bDave2>0</bDave2> + <PathWithFileName>..\..\..\..\software\cmsis\Device\ARM\CMSDK_CM0\Source\CMSDK_driver.c</PathWithFileName> + <FilenameWithoutPath>CMSDK_driver.c</FilenameWithoutPath> + <RteFlg>0</RteFlg> + <bShared>0</bShared> + </File> + <File> + <GroupNumber>2</GroupNumber> + <FileNumber>5</FileNumber> + <FileType>1</FileType> + <tvExp>0</tvExp> + <Focus>0</Focus> + <ColumnNumber>0</ColumnNumber> + <tvExpOptDlg>0</tvExpOptDlg> + <TopLine>0</TopLine> + <CurrentLine>0</CurrentLine> + <bDave2>0</bDave2> + <PathWithFileName>..\..\..\..\software\common\validation\gpio_driver_tests.c</PathWithFileName> + <FilenameWithoutPath>gpio_driver_tests.c</FilenameWithoutPath> + <RteFlg>0</RteFlg> + <bShared>0</bShared> + </File> + </Group> + + <Group> + <GroupName>System</GroupName> + <tvExp>1</tvExp> + <tvExpOptDlg>0</tvExpOptDlg> + <cbSel>0</cbSel> + <RteFlg>0</RteFlg> + <File> + <GroupNumber>3</GroupNumber> + <FileNumber>6</FileNumber> + <FileType>1</FileType> + <tvExp>0</tvExp> + <Focus>0</Focus> + <ColumnNumber>0</ColumnNumber> + <tvExpOptDlg>0</tvExpOptDlg> + <TopLine>0</TopLine> + <CurrentLine>0</CurrentLine> + <bDave2>0</bDave2> + <PathWithFileName>..\..\..\..\software\cmsis\Device\ARM\CMSDK_CM0\Source\system_CMSDK_CM0.c</PathWithFileName> + <FilenameWithoutPath>system_CMSDK_CM0.c</FilenameWithoutPath> + <RteFlg>0</RteFlg> + <bShared>0</bShared> + </File> + </Group> + +</ProjectOpt> diff --git a/Cortex-M0/nanosoc/systems/mcu/testcodes/gpio_driver_tests/gpio_driver_tests_cm0.uvproj b/Cortex-M0/nanosoc/systems/mcu/testcodes/gpio_driver_tests/gpio_driver_tests_cm0.uvproj new file mode 100644 index 0000000..6262fae --- /dev/null +++ b/Cortex-M0/nanosoc/systems/mcu/testcodes/gpio_driver_tests/gpio_driver_tests_cm0.uvproj @@ -0,0 +1,440 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no" ?> +<Project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="project_proj.xsd"> + + <SchemaVersion>1.1</SchemaVersion> + + <Header>### uVision Project, (C) Keil Software</Header> + + <Targets> + <Target> + <TargetName>Debug</TargetName> + <ToolsetNumber>0x4</ToolsetNumber> + <ToolsetName>ARM-ADS</ToolsetName> + <TargetOption> + <TargetCommonOption> + <Device>Cortex-M0+</Device> + <Vendor>ARM</Vendor> + <Cpu>CLOCK(12000000) CPUTYPE("Cortex-M0+") ESEL ELITTLE</Cpu> + <FlashUtilSpec></FlashUtilSpec> + <StartupFile></StartupFile> + <FlashDriverDll></FlashDriverDll> + <DeviceId>6268</DeviceId> + <RegisterFile></RegisterFile> + <MemoryEnv></MemoryEnv> + <Cmp></Cmp> + <Asm></Asm> + <Linker></Linker> + <OHString></OHString> + <InfinionOptionDll></InfinionOptionDll> + <SLE66CMisc></SLE66CMisc> + <SLE66AMisc></SLE66AMisc> + <SLE66LinkerMisc></SLE66LinkerMisc> + <SFDFile></SFDFile> + <UseEnv>0</UseEnv> + <BinPath></BinPath> + <IncludePath></IncludePath> + <LibPath></LibPath> + <RegisterFilePath></RegisterFilePath> + <DBRegisterFilePath></DBRegisterFilePath> + <TargetStatus> + <Error>0</Error> + <ExitCodeStop>0</ExitCodeStop> + <ButtonStop>0</ButtonStop> + <NotGenerated>0</NotGenerated> + <InvalidFlash>1</InvalidFlash> + </TargetStatus> + <OutputDirectory>.\</OutputDirectory> + <OutputName>gpio_driver_tests</OutputName> + <CreateExecutable>1</CreateExecutable> + <CreateLib>0</CreateLib> + <CreateHexFile>0</CreateHexFile> + <DebugInformation>1</DebugInformation> + <BrowseInformation>1</BrowseInformation> + <ListingPath>.\</ListingPath> + <HexFormatSelection>1</HexFormatSelection> + <Merge32K>0</Merge32K> + <CreateBatchFile>0</CreateBatchFile> + <BeforeCompile> + <RunUserProg1>0</RunUserProg1> + <RunUserProg2>0</RunUserProg2> + <UserProg1Name></UserProg1Name> + <UserProg2Name></UserProg2Name> + <UserProg1Dos16Mode>0</UserProg1Dos16Mode> + <UserProg2Dos16Mode>0</UserProg2Dos16Mode> + <nStopU1X>0</nStopU1X> + <nStopU2X>0</nStopU2X> + </BeforeCompile> + <BeforeMake> + <RunUserProg1>0</RunUserProg1> + <RunUserProg2>0</RunUserProg2> + <UserProg1Name></UserProg1Name> + <UserProg2Name></UserProg2Name> + <UserProg1Dos16Mode>0</UserProg1Dos16Mode> + <UserProg2Dos16Mode>0</UserProg2Dos16Mode> + </BeforeMake> + <AfterMake> + <RunUserProg1>1</RunUserProg1> + <RunUserProg2>0</RunUserProg2> + <UserProg1Name>$K\ARM\ARMCC\BIN\fromelf.exe #L --vhx --8x1 --output gpio_driver_tests.hex</UserProg1Name> + <UserProg2Name></UserProg2Name> + <UserProg1Dos16Mode>0</UserProg1Dos16Mode> + <UserProg2Dos16Mode>0</UserProg2Dos16Mode> + </AfterMake> + <SelectedForBatchBuild>0</SelectedForBatchBuild> + <SVCSIdString></SVCSIdString> + </TargetCommonOption> + <CommonProperty> + <UseCPPCompiler>0</UseCPPCompiler> + <RVCTCodeConst>0</RVCTCodeConst> + <RVCTZI>0</RVCTZI> + <RVCTOtherData>0</RVCTOtherData> + <ModuleSelection>0</ModuleSelection> + <IncludeInBuild>1</IncludeInBuild> + <AlwaysBuild>0</AlwaysBuild> + <GenerateAssemblyFile>0</GenerateAssemblyFile> + <AssembleAssemblyFile>0</AssembleAssemblyFile> + <PublicsOnly>0</PublicsOnly> + <StopOnExitCode>3</StopOnExitCode> + <CustomArgument></CustomArgument> + <IncludeLibraryModules></IncludeLibraryModules> + </CommonProperty> + <DllOption> + <SimDllName>SARMCM3.DLL</SimDllName> + <SimDllArguments></SimDllArguments> + <SimDlgDll>DARMCM1.DLL</SimDlgDll> + <SimDlgDllArguments></SimDlgDllArguments> + <TargetDllName>SARMCM3.DLL</TargetDllName> + <TargetDllArguments></TargetDllArguments> + <TargetDlgDll>TARMCM1.DLL</TargetDlgDll> + <TargetDlgDllArguments></TargetDlgDllArguments> + </DllOption> + <DebugOption> + <OPTHX> + <HexSelection>1</HexSelection> + <HexRangeLowAddress>0</HexRangeLowAddress> + <HexRangeHighAddress>0</HexRangeHighAddress> + <HexOffset>0</HexOffset> + <Oh166RecLen>16</Oh166RecLen> + </OPTHX> + <Simulator> + <UseSimulator>1</UseSimulator> + <LoadApplicationAtStartup>1</LoadApplicationAtStartup> + <RunToMain>1</RunToMain> + <RestoreBreakpoints>1</RestoreBreakpoints> + <RestoreWatchpoints>1</RestoreWatchpoints> + <RestoreMemoryDisplay>1</RestoreMemoryDisplay> + <RestoreFunctions>1</RestoreFunctions> + <RestoreToolbox>1</RestoreToolbox> + <LimitSpeedToRealTime>0</LimitSpeedToRealTime> + </Simulator> + <Target> + <UseTarget>0</UseTarget> + <LoadApplicationAtStartup>1</LoadApplicationAtStartup> + <RunToMain>0</RunToMain> + <RestoreBreakpoints>1</RestoreBreakpoints> + <RestoreWatchpoints>1</RestoreWatchpoints> + <RestoreMemoryDisplay>1</RestoreMemoryDisplay> + <RestoreFunctions>0</RestoreFunctions> + <RestoreToolbox>1</RestoreToolbox> + <RestoreTracepoints>0</RestoreTracepoints> + </Target> + <RunDebugAfterBuild>0</RunDebugAfterBuild> + <TargetSelection>-1</TargetSelection> + <SimDlls> + <CpuDll></CpuDll> + <CpuDllArguments></CpuDllArguments> + <PeripheralDll></PeripheralDll> + <PeripheralDllArguments></PeripheralDllArguments> + <InitializationFile></InitializationFile> + </SimDlls> + <TargetDlls> + <CpuDll></CpuDll> + <CpuDllArguments></CpuDllArguments> + <PeripheralDll></PeripheralDll> + <PeripheralDllArguments></PeripheralDllArguments> + <InitializationFile></InitializationFile> + <Driver></Driver> + </TargetDlls> + </DebugOption> + <Utilities> + <Flash1> + <UseTargetDll>0</UseTargetDll> + <UseExternalTool>0</UseExternalTool> + <RunIndependent>0</RunIndependent> + <UpdateFlashBeforeDebugging>0</UpdateFlashBeforeDebugging> + <Capability>0</Capability> + <DriverSelection>-1</DriverSelection> + </Flash1> + <Flash2></Flash2> + <Flash3></Flash3> + <Flash4></Flash4> + </Utilities> + <TargetArmAds> + <ArmAdsMisc> + <GenerateListings>0</GenerateListings> + <asHll>1</asHll> + <asAsm>1</asAsm> + <asMacX>1</asMacX> + <asSyms>1</asSyms> + <asFals>1</asFals> + <asDbgD>1</asDbgD> + <asForm>1</asForm> + <ldLst>0</ldLst> + <ldmm>1</ldmm> + <ldXref>1</ldXref> + <BigEnd>0</BigEnd> + <AdsALst>1</AdsALst> + <AdsACrf>1</AdsACrf> + <AdsANop>0</AdsANop> + <AdsANot>0</AdsANot> + <AdsLLst>1</AdsLLst> + <AdsLmap>1</AdsLmap> + <AdsLcgr>1</AdsLcgr> + <AdsLsym>1</AdsLsym> + <AdsLszi>1</AdsLszi> + <AdsLtoi>1</AdsLtoi> + <AdsLsun>1</AdsLsun> + <AdsLven>1</AdsLven> + <AdsLsxf>1</AdsLsxf> + <RvctClst>0</RvctClst> + <GenPPlst>0</GenPPlst> + <AdsCpuType>"Cortex-M0+"</AdsCpuType> + <RvctDeviceName></RvctDeviceName> + <mOS>0</mOS> + <uocRom>0</uocRom> + <uocRam>0</uocRam> + <hadIROM>0</hadIROM> + <hadIRAM>0</hadIRAM> + <hadXRAM>0</hadXRAM> + <uocXRam>0</uocXRam> + <RvdsVP>0</RvdsVP> + <hadIRAM2>0</hadIRAM2> + <hadIROM2>0</hadIROM2> + <StupSel>1</StupSel> + <useUlib>0</useUlib> + <EndSel>1</EndSel> + <uLtcg>0</uLtcg> + <RoSelD>0</RoSelD> + <RwSelD>5</RwSelD> + <CodeSel>0</CodeSel> + <OptFeed>0</OptFeed> + <NoZi1>0</NoZi1> + <NoZi2>0</NoZi2> + <NoZi3>0</NoZi3> + <NoZi4>0</NoZi4> + <NoZi5>0</NoZi5> + <Ro1Chk>1</Ro1Chk> + <Ro2Chk>0</Ro2Chk> + <Ro3Chk>0</Ro3Chk> + <Ir1Chk>0</Ir1Chk> + <Ir2Chk>0</Ir2Chk> + <Ra1Chk>1</Ra1Chk> + <Ra2Chk>0</Ra2Chk> + <Ra3Chk>0</Ra3Chk> + <Im1Chk>0</Im1Chk> + <Im2Chk>0</Im2Chk> + <OnChipMemories> + <Ocm1> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </Ocm1> + <Ocm2> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </Ocm2> + <Ocm3> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </Ocm3> + <Ocm4> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </Ocm4> + <Ocm5> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </Ocm5> + <Ocm6> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </Ocm6> + <IRAM> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </IRAM> + <IROM> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </IROM> + <XRAM> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </XRAM> + <OCR_RVCT1> + <Type>1</Type> + <StartAddress>0x0</StartAddress> + <Size>0x10000</Size> + </OCR_RVCT1> + <OCR_RVCT2> + <Type>1</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </OCR_RVCT2> + <OCR_RVCT3> + <Type>1</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </OCR_RVCT3> + <OCR_RVCT4> + <Type>1</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </OCR_RVCT4> + <OCR_RVCT5> + <Type>1</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </OCR_RVCT5> + <OCR_RVCT6> + <Type>0</Type> + <StartAddress>0x20000000</StartAddress> + <Size>0x10000</Size> + </OCR_RVCT6> + <OCR_RVCT7> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </OCR_RVCT7> + <OCR_RVCT8> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </OCR_RVCT8> + <OCR_RVCT9> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </OCR_RVCT9> + <OCR_RVCT10> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </OCR_RVCT10> + </OnChipMemories> + <RvctStartVector></RvctStartVector> + </ArmAdsMisc> + <Cads> + <interw>1</interw> + <Optim>3</Optim> + <oTime>0</oTime> + <SplitLS>0</SplitLS> + <OneElfS>0</OneElfS> + <Strict>0</Strict> + <EnumInt>0</EnumInt> + <PlainCh>0</PlainCh> + <Ropi>0</Ropi> + <Rwpi>0</Rwpi> + <wLevel>0</wLevel> + <uThumb>0</uThumb> + <uSurpInc>0</uSurpInc> + <VariousControls> + <MiscControls></MiscControls> + <Define>CORTEX_M0</Define> + <Undefine></Undefine> + <IncludePath>..\..\..\..\software\cmsis\CMSIS\Include; ..\..\..\..\software\cmsis\Device\ARM\CMSDK_CM0\Include; ..\..\..\..\software\common\retarget</IncludePath> + </VariousControls> + </Cads> + <Aads> + <interw>1</interw> + <Ropi>0</Ropi> + <Rwpi>0</Rwpi> + <thumb>0</thumb> + <SplitLS>0</SplitLS> + <SwStkChk>0</SwStkChk> + <NoWarn>0</NoWarn> + <uSurpInc>0</uSurpInc> + <VariousControls> + <MiscControls></MiscControls> + <Define></Define> + <Undefine></Undefine> + <IncludePath></IncludePath> + </VariousControls> + </Aads> + <LDads> + <umfTarg>1</umfTarg> + <Ropi>0</Ropi> + <Rwpi>0</Rwpi> + <noStLib>0</noStLib> + <RepFail>1</RepFail> + <useFile>0</useFile> + <TextAddressRange>0x00000000</TextAddressRange> + <DataAddressRange>0x00000000</DataAddressRange> + <ScatterFile></ScatterFile> + <IncludeLibs></IncludeLibs> + <IncludeLibsPath></IncludeLibsPath> + <Misc></Misc> + <LinkerInputFile></LinkerInputFile> + <DisabledWarnings></DisabledWarnings> + </LDads> + </TargetArmAds> + </TargetOption> + <Groups> + <Group> + <GroupName>Startup</GroupName> + <Files> + <File> + <FileName>startup_CMSDK_CM0.s</FileName> + <FileType>2</FileType> + <FilePath>..\..\..\..\software\cmsis\Device\ARM\CMSDK_CM0\Source\ARM\startup_CMSDK_CM0.s</FilePath> + </File> + </Files> + </Group> + <Group> + <GroupName>Application</GroupName> + <Files> + <File> + <FileName>uart_stdout.c</FileName> + <FileType>1</FileType> + <FilePath>..\..\..\..\software\common\retarget\uart_stdout.c</FilePath> + </File> + <File> + <FileName>retarget.c</FileName> + <FileType>1</FileType> + <FilePath>..\..\..\..\software\common\retarget\retarget.c</FilePath> + </File> + <File> + <FileName>CMSDK_driver.c</FileName> + <FileType>1</FileType> + <FilePath>..\..\..\..\software\cmsis\Device\ARM\CMSDK_CM0\Source\CMSDK_driver.c</FilePath> + </File> + <File> + <FileName>gpio_driver_tests.c</FileName> + <FileType>1</FileType> + <FilePath>..\..\..\..\software\common\validation\gpio_driver_tests.c</FilePath> + </File> + </Files> + </Group> + <Group> + <GroupName>System</GroupName> + <Files> + <File> + <FileName>system_CMSDK_CM0.c</FileName> + <FileType>1</FileType> + <FilePath>..\..\..\..\software\cmsis\Device\ARM\CMSDK_CM0\Source\system_CMSDK_CM0.c</FilePath> + </File> + </Files> + </Group> + </Groups> + </Target> + </Targets> + +</Project> diff --git a/Cortex-M0/nanosoc/systems/mcu/testcodes/gpio_driver_tests/gpio_driver_tests_cm0p.uvopt b/Cortex-M0/nanosoc/systems/mcu/testcodes/gpio_driver_tests/gpio_driver_tests_cm0p.uvopt new file mode 100644 index 0000000..c0fca7a --- /dev/null +++ b/Cortex-M0/nanosoc/systems/mcu/testcodes/gpio_driver_tests/gpio_driver_tests_cm0p.uvopt @@ -0,0 +1,258 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no" ?> +<ProjectOpt xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="project_opt.xsd"> + + <SchemaVersion>1.0</SchemaVersion> + + <Header>### uVision Project, (C) Keil Software</Header> + + <Extensions> + <cExt>*.c</cExt> + <aExt>*.s*; *.src; *.a*</aExt> + <oExt>*.obj</oExt> + <lExt>*.lib</lExt> + <tExt>*.txt; *.h; *.inc</tExt> + <pExt>*.plm</pExt> + <CppX>*.cpp</CppX> + </Extensions> + + <DaveTm> + <dwLowDateTime>0</dwLowDateTime> + <dwHighDateTime>0</dwHighDateTime> + </DaveTm> + + <Target> + <TargetName>Debug</TargetName> + <ToolsetNumber>0x4</ToolsetNumber> + <ToolsetName>ARM-ADS</ToolsetName> + <TargetOption> + <CLKADS>50000000</CLKADS> + <OPTTT> + <gFlags>1</gFlags> + <BeepAtEnd>1</BeepAtEnd> + <RunSim>1</RunSim> + <RunTarget>0</RunTarget> + </OPTTT> + <OPTHX> + <HexSelection>1</HexSelection> + <FlashByte>65535</FlashByte> + <HexRangeLowAddress>0</HexRangeLowAddress> + <HexRangeHighAddress>0</HexRangeHighAddress> + <HexOffset>0</HexOffset> + </OPTHX> + <OPTLEX> + <PageWidth>79</PageWidth> + <PageLength>66</PageLength> + <TabStop>8</TabStop> + <ListingPath>.\</ListingPath> + </OPTLEX> + <ListingPage> + <CreateCListing>1</CreateCListing> + <CreateAListing>1</CreateAListing> + <CreateLListing>1</CreateLListing> + <CreateIListing>0</CreateIListing> + <AsmCond>1</AsmCond> + <AsmSymb>1</AsmSymb> + <AsmXref>0</AsmXref> + <CCond>1</CCond> + <CCode>0</CCode> + <CListInc>0</CListInc> + <CSymb>0</CSymb> + <LinkerCodeListing>0</LinkerCodeListing> + </ListingPage> + <OPTXL> + <LMap>1</LMap> + <LComments>1</LComments> + <LGenerateSymbols>1</LGenerateSymbols> + <LLibSym>1</LLibSym> + <LLines>1</LLines> + <LLocSym>1</LLocSym> + <LPubSym>1</LPubSym> + <LXref>0</LXref> + <LExpSel>0</LExpSel> + </OPTXL> + <OPTFL> + <tvExp>1</tvExp> + <tvExpOptDlg>0</tvExpOptDlg> + <IsCurrentTarget>1</IsCurrentTarget> + </OPTFL> + <CpuCode>255</CpuCode> + <DllOpt> + <SimDllName>SARMCM3.DLL</SimDllName> + <SimDllArguments></SimDllArguments> + <SimDlgDllName>DARMCM1.DLL</SimDlgDllName> + <SimDlgDllArguments></SimDlgDllArguments> + <TargetDllName>SARMCM3.DLL</TargetDllName> + <TargetDllArguments></TargetDllArguments> + <TargetDlgDllName>TARMCM1.DLL</TargetDlgDllName> + <TargetDlgDllArguments></TargetDlgDllArguments> + </DllOpt> + <DebugOpt> + <uSim>1</uSim> + <uTrg>0</uTrg> + <sLdApp>1</sLdApp> + <sGomain>1</sGomain> + <sRbreak>1</sRbreak> + <sRwatch>1</sRwatch> + <sRmem>1</sRmem> + <sRfunc>1</sRfunc> + <sRbox>1</sRbox> + <tLdApp>1</tLdApp> + <tGomain>0</tGomain> + <tRbreak>1</tRbreak> + <tRwatch>1</tRwatch> + <tRmem>1</tRmem> + <tRfunc>0</tRfunc> + <tRbox>1</tRbox> + <sRunDeb>0</sRunDeb> + <sLrtime>0</sLrtime> + <nTsel>-1</nTsel> + <sDll></sDll> + <sDllPa></sDllPa> + <sDlgDll></sDlgDll> + <sDlgPa></sDlgPa> + <sIfile></sIfile> + <tDll></tDll> + <tDllPa></tDllPa> + <tDlgDll></tDlgDll> + <tDlgPa></tDlgPa> + <tIfile></tIfile> + <pMon></pMon> + </DebugOpt> + <Breakpoint/> + <DebugFlag> + <trace>0</trace> + <periodic>1</periodic> + <aLwin>0</aLwin> + <aCover>0</aCover> + <aSer1>0</aSer1> + <aSer2>0</aSer2> + <aPa>0</aPa> + <viewmode>0</viewmode> + <vrSel>0</vrSel> + <aSym>0</aSym> + <aTbox>0</aTbox> + <AscS1>0</AscS1> + <AscS2>0</AscS2> + <AscS3>0</AscS3> + <aSer3>0</aSer3> + <eProf>0</eProf> + <aLa>0</aLa> + <aPa1>0</aPa1> + <AscS4>0</AscS4> + <aSer4>0</aSer4> + <StkLoc>0</StkLoc> + <TrcWin>0</TrcWin> + <newCpu>0</newCpu> + <uProt>0</uProt> + </DebugFlag> + <LintExecutable></LintExecutable> + <LintConfigFile></LintConfigFile> + </TargetOption> + </Target> + + <Group> + <GroupName>Startup</GroupName> + <tvExp>1</tvExp> + <tvExpOptDlg>0</tvExpOptDlg> + <cbSel>0</cbSel> + <File> + <GroupNumber>1</GroupNumber> + <FileNumber>1</FileNumber> + <FileType>2</FileType> + <tvExp>0</tvExp> + <Focus>0</Focus> + <ColumnNumber>0</ColumnNumber> + <tvExpOptDlg>0</tvExpOptDlg> + <TopLine>0</TopLine> + <CurrentLine>0</CurrentLine> + <bDave2>0</bDave2> + <PathWithFileName>..\..\..\..\software\cmsis\Device\ARM\CMSDK_CM0plus\Source\ARM\startup_CMSDK_CM0plus.s</PathWithFileName> + <FilenameWithoutPath>startup_CMSDK_CM0plus.s</FilenameWithoutPath> + </File> + </Group> + + <Group> + <GroupName>Application</GroupName> + <tvExp>1</tvExp> + <tvExpOptDlg>0</tvExpOptDlg> + <cbSel>0</cbSel> + <File> + <GroupNumber>2</GroupNumber> + <FileNumber>2</FileNumber> + <FileType>1</FileType> + <tvExp>0</tvExp> + <Focus>0</Focus> + <ColumnNumber>0</ColumnNumber> + <tvExpOptDlg>0</tvExpOptDlg> + <TopLine>0</TopLine> + <CurrentLine>0</CurrentLine> + <bDave2>0</bDave2> + <PathWithFileName>..\..\..\..\software\common\retarget\uart_stdout.c</PathWithFileName> + <FilenameWithoutPath>uart_stdout.c</FilenameWithoutPath> + </File> + <File> + <GroupNumber>2</GroupNumber> + <FileNumber>3</FileNumber> + <FileType>1</FileType> + <tvExp>0</tvExp> + <Focus>0</Focus> + <ColumnNumber>0</ColumnNumber> + <tvExpOptDlg>0</tvExpOptDlg> + <TopLine>0</TopLine> + <CurrentLine>0</CurrentLine> + <bDave2>0</bDave2> + <PathWithFileName>..\..\..\..\software\common\retarget\retarget.c</PathWithFileName> + <FilenameWithoutPath>retarget.c</FilenameWithoutPath> + </File> + <File> + <GroupNumber>2</GroupNumber> + <FileNumber>4</FileNumber> + <FileType>1</FileType> + <tvExp>0</tvExp> + <Focus>0</Focus> + <ColumnNumber>0</ColumnNumber> + <tvExpOptDlg>0</tvExpOptDlg> + <TopLine>0</TopLine> + <CurrentLine>0</CurrentLine> + <bDave2>0</bDave2> + <PathWithFileName>..\..\..\..\software\cmsis\Device\ARM\CMSDK_CM0plus\Source\CMSDK_driver.c</PathWithFileName> + <FilenameWithoutPath>CMSDK_driver.c</FilenameWithoutPath> + </File> + <File> + <GroupNumber>2</GroupNumber> + <FileNumber>5</FileNumber> + <FileType>1</FileType> + <tvExp>0</tvExp> + <Focus>0</Focus> + <ColumnNumber>0</ColumnNumber> + <tvExpOptDlg>0</tvExpOptDlg> + <TopLine>0</TopLine> + <CurrentLine>0</CurrentLine> + <bDave2>0</bDave2> + <PathWithFileName>..\..\..\..\software\common\validation\gpio_driver_tests.c</PathWithFileName> + <FilenameWithoutPath>gpio_driver_tests.c</FilenameWithoutPath> + </File> + </Group> + + <Group> + <GroupName>System</GroupName> + <tvExp>1</tvExp> + <tvExpOptDlg>0</tvExpOptDlg> + <cbSel>0</cbSel> + <File> + <GroupNumber>3</GroupNumber> + <FileNumber>6</FileNumber> + <FileType>1</FileType> + <tvExp>0</tvExp> + <Focus>0</Focus> + <ColumnNumber>0</ColumnNumber> + <tvExpOptDlg>0</tvExpOptDlg> + <TopLine>0</TopLine> + <CurrentLine>0</CurrentLine> + <bDave2>0</bDave2> + <PathWithFileName>..\..\..\..\software\cmsis\Device\ARM\CMSDK_CM0plus\Source\system_CMSDK_CM0plus.c</PathWithFileName> + <FilenameWithoutPath>system_CMSDK_CM0plus.c</FilenameWithoutPath> + </File> + </Group> + +</ProjectOpt> diff --git a/Cortex-M0/nanosoc/systems/mcu/testcodes/gpio_driver_tests/gpio_driver_tests_cm0p.uvproj b/Cortex-M0/nanosoc/systems/mcu/testcodes/gpio_driver_tests/gpio_driver_tests_cm0p.uvproj new file mode 100644 index 0000000..bdd4ec2 --- /dev/null +++ b/Cortex-M0/nanosoc/systems/mcu/testcodes/gpio_driver_tests/gpio_driver_tests_cm0p.uvproj @@ -0,0 +1,437 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no" ?> +<Project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="project_proj.xsd"> + + <SchemaVersion>1.1</SchemaVersion> + + <Header>### uVision Project, (C) Keil Software</Header> + + <Targets> + <Target> + <TargetName>Debug</TargetName> + <ToolsetNumber>0x4</ToolsetNumber> + <ToolsetName>ARM-ADS</ToolsetName> + <TargetOption> + <TargetCommonOption> + <Device>Cortex-M0</Device> + <Vendor>ARM</Vendor> + <Cpu>CLOCK(12000000) CPUTYPE("Cortex-M0") ESEL ELITTLE</Cpu> + <FlashUtilSpec></FlashUtilSpec> + <StartupFile></StartupFile> + <FlashDriverDll></FlashDriverDll> + <DeviceId>4803</DeviceId> + <RegisterFile></RegisterFile> + <MemoryEnv></MemoryEnv> + <Cmp></Cmp> + <Asm></Asm> + <Linker></Linker> + <OHString></OHString> + <InfinionOptionDll></InfinionOptionDll> + <SLE66CMisc></SLE66CMisc> + <SLE66AMisc></SLE66AMisc> + <SLE66LinkerMisc></SLE66LinkerMisc> + <SFDFile></SFDFile> + <UseEnv>0</UseEnv> + <BinPath></BinPath> + <IncludePath></IncludePath> + <LibPath></LibPath> + <RegisterFilePath></RegisterFilePath> + <DBRegisterFilePath></DBRegisterFilePath> + <TargetStatus> + <Error>0</Error> + <ExitCodeStop>0</ExitCodeStop> + <ButtonStop>0</ButtonStop> + <NotGenerated>0</NotGenerated> + <InvalidFlash>1</InvalidFlash> + </TargetStatus> + <OutputDirectory>.\</OutputDirectory> + <OutputName>gpio_driver_tests</OutputName> + <CreateExecutable>1</CreateExecutable> + <CreateLib>0</CreateLib> + <CreateHexFile>0</CreateHexFile> + <DebugInformation>1</DebugInformation> + <BrowseInformation>1</BrowseInformation> + <ListingPath>.\</ListingPath> + <HexFormatSelection>1</HexFormatSelection> + <Merge32K>0</Merge32K> + <CreateBatchFile>0</CreateBatchFile> + <BeforeCompile> + <RunUserProg1>0</RunUserProg1> + <RunUserProg2>0</RunUserProg2> + <UserProg1Name></UserProg1Name> + <UserProg2Name></UserProg2Name> + <UserProg1Dos16Mode>0</UserProg1Dos16Mode> + <UserProg2Dos16Mode>0</UserProg2Dos16Mode> + <nStopU1X>0</nStopU1X> + <nStopU2X>0</nStopU2X> + </BeforeCompile> + <BeforeMake> + <RunUserProg1>0</RunUserProg1> + <RunUserProg2>0</RunUserProg2> + <UserProg1Name></UserProg1Name> + <UserProg2Name></UserProg2Name> + <UserProg1Dos16Mode>0</UserProg1Dos16Mode> + <UserProg2Dos16Mode>0</UserProg2Dos16Mode> + </BeforeMake> + <AfterMake> + <RunUserProg1>1</RunUserProg1> + <RunUserProg2>0</RunUserProg2> + <UserProg1Name>$K\ARM\ARMCC\BIN\fromelf.exe #L --vhx --8x1 --output gpio_driver_tests.hex</UserProg1Name> + <UserProg2Name></UserProg2Name> + <UserProg1Dos16Mode>0</UserProg1Dos16Mode> + <UserProg2Dos16Mode>0</UserProg2Dos16Mode> + </AfterMake> + <SelectedForBatchBuild>0</SelectedForBatchBuild> + <SVCSIdString></SVCSIdString> + </TargetCommonOption> + <CommonProperty> + <UseCPPCompiler>0</UseCPPCompiler> + <RVCTCodeConst>0</RVCTCodeConst> + <RVCTZI>0</RVCTZI> + <RVCTOtherData>0</RVCTOtherData> + <ModuleSelection>0</ModuleSelection> + <IncludeInBuild>1</IncludeInBuild> + <AlwaysBuild>0</AlwaysBuild> + <GenerateAssemblyFile>0</GenerateAssemblyFile> + <AssembleAssemblyFile>0</AssembleAssemblyFile> + <PublicsOnly>0</PublicsOnly> + <StopOnExitCode>3</StopOnExitCode> + <CustomArgument></CustomArgument> + <IncludeLibraryModules></IncludeLibraryModules> + </CommonProperty> + <DllOption> + <SimDllName>SARMCM3.DLL</SimDllName> + <SimDllArguments></SimDllArguments> + <SimDlgDll>DARMCM1.DLL</SimDlgDll> + <SimDlgDllArguments></SimDlgDllArguments> + <TargetDllName>SARMCM3.DLL</TargetDllName> + <TargetDllArguments></TargetDllArguments> + <TargetDlgDll>TARMCM1.DLL</TargetDlgDll> + <TargetDlgDllArguments></TargetDlgDllArguments> + </DllOption> + <DebugOption> + <OPTHX> + <HexSelection>1</HexSelection> + <HexRangeLowAddress>0</HexRangeLowAddress> + <HexRangeHighAddress>0</HexRangeHighAddress> + <HexOffset>0</HexOffset> + <Oh166RecLen>16</Oh166RecLen> + </OPTHX> + <Simulator> + <UseSimulator>1</UseSimulator> + <LoadApplicationAtStartup>1</LoadApplicationAtStartup> + <RunToMain>1</RunToMain> + <RestoreBreakpoints>1</RestoreBreakpoints> + <RestoreWatchpoints>1</RestoreWatchpoints> + <RestoreMemoryDisplay>1</RestoreMemoryDisplay> + <RestoreFunctions>1</RestoreFunctions> + <RestoreToolbox>1</RestoreToolbox> + <LimitSpeedToRealTime>0</LimitSpeedToRealTime> + </Simulator> + <Target> + <UseTarget>0</UseTarget> + <LoadApplicationAtStartup>1</LoadApplicationAtStartup> + <RunToMain>0</RunToMain> + <RestoreBreakpoints>1</RestoreBreakpoints> + <RestoreWatchpoints>1</RestoreWatchpoints> + <RestoreMemoryDisplay>1</RestoreMemoryDisplay> + <RestoreFunctions>0</RestoreFunctions> + <RestoreToolbox>1</RestoreToolbox> + </Target> + <RunDebugAfterBuild>0</RunDebugAfterBuild> + <TargetSelection>-1</TargetSelection> + <SimDlls> + <CpuDll></CpuDll> + <CpuDllArguments></CpuDllArguments> + <PeripheralDll></PeripheralDll> + <PeripheralDllArguments></PeripheralDllArguments> + <InitializationFile></InitializationFile> + </SimDlls> + <TargetDlls> + <CpuDll></CpuDll> + <CpuDllArguments></CpuDllArguments> + <PeripheralDll></PeripheralDll> + <PeripheralDllArguments></PeripheralDllArguments> + <InitializationFile></InitializationFile> + <Driver></Driver> + </TargetDlls> + </DebugOption> + <Utilities> + <Flash1> + <UseTargetDll>0</UseTargetDll> + <UseExternalTool>0</UseExternalTool> + <RunIndependent>0</RunIndependent> + <UpdateFlashBeforeDebugging>0</UpdateFlashBeforeDebugging> + <Capability>0</Capability> + <DriverSelection>-1</DriverSelection> + </Flash1> + <Flash2></Flash2> + <Flash3></Flash3> + <Flash4></Flash4> + </Utilities> + <TargetArmAds> + <ArmAdsMisc> + <GenerateListings>0</GenerateListings> + <asHll>1</asHll> + <asAsm>1</asAsm> + <asMacX>1</asMacX> + <asSyms>1</asSyms> + <asFals>1</asFals> + <asDbgD>1</asDbgD> + <asForm>1</asForm> + <ldLst>0</ldLst> + <ldmm>1</ldmm> + <ldXref>1</ldXref> + <BigEnd>0</BigEnd> + <AdsALst>1</AdsALst> + <AdsACrf>1</AdsACrf> + <AdsANop>0</AdsANop> + <AdsANot>0</AdsANot> + <AdsLLst>1</AdsLLst> + <AdsLmap>1</AdsLmap> + <AdsLcgr>1</AdsLcgr> + <AdsLsym>1</AdsLsym> + <AdsLszi>1</AdsLszi> + <AdsLtoi>1</AdsLtoi> + <AdsLsun>1</AdsLsun> + <AdsLven>1</AdsLven> + <AdsLsxf>1</AdsLsxf> + <RvctClst>0</RvctClst> + <GenPPlst>0</GenPPlst> + <AdsCpuType>"Cortex-M0"</AdsCpuType> + <RvctDeviceName></RvctDeviceName> + <mOS>0</mOS> + <uocRom>0</uocRom> + <uocRam>0</uocRam> + <hadIROM>0</hadIROM> + <hadIRAM>0</hadIRAM> + <hadXRAM>0</hadXRAM> + <uocXRam>0</uocXRam> + <RvdsVP>0</RvdsVP> + <hadIRAM2>0</hadIRAM2> + <hadIROM2>0</hadIROM2> + <StupSel>1</StupSel> + <useUlib>0</useUlib> + <EndSel>1</EndSel> + <uLtcg>0</uLtcg> + <RoSelD>0</RoSelD> + <RwSelD>5</RwSelD> + <CodeSel>0</CodeSel> + <OptFeed>0</OptFeed> + <NoZi1>0</NoZi1> + <NoZi2>0</NoZi2> + <NoZi3>0</NoZi3> + <NoZi4>0</NoZi4> + <NoZi5>0</NoZi5> + <Ro1Chk>1</Ro1Chk> + <Ro2Chk>0</Ro2Chk> + <Ro3Chk>0</Ro3Chk> + <Ir1Chk>0</Ir1Chk> + <Ir2Chk>0</Ir2Chk> + <Ra1Chk>1</Ra1Chk> + <Ra2Chk>0</Ra2Chk> + <Ra3Chk>0</Ra3Chk> + <Im1Chk>0</Im1Chk> + <Im2Chk>0</Im2Chk> + <OnChipMemories> + <Ocm1> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </Ocm1> + <Ocm2> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </Ocm2> + <Ocm3> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </Ocm3> + <Ocm4> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </Ocm4> + <Ocm5> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </Ocm5> + <Ocm6> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </Ocm6> + <IRAM> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </IRAM> + <IROM> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </IROM> + <XRAM> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </XRAM> + <OCR_RVCT1> + <Type>1</Type> + <StartAddress>0x0</StartAddress> + <Size>0x10000</Size> + </OCR_RVCT1> + <OCR_RVCT2> + <Type>1</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </OCR_RVCT2> + <OCR_RVCT3> + <Type>1</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </OCR_RVCT3> + <OCR_RVCT4> + <Type>1</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </OCR_RVCT4> + <OCR_RVCT5> + <Type>1</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </OCR_RVCT5> + <OCR_RVCT6> + <Type>0</Type> + <StartAddress>0x20000000</StartAddress> + <Size>0x10000</Size> + </OCR_RVCT6> + <OCR_RVCT7> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </OCR_RVCT7> + <OCR_RVCT8> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </OCR_RVCT8> + <OCR_RVCT9> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </OCR_RVCT9> + <OCR_RVCT10> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </OCR_RVCT10> + </OnChipMemories> + <RvctStartVector></RvctStartVector> + </ArmAdsMisc> + <Cads> + <interw>1</interw> + <Optim>3</Optim> + <oTime>0</oTime> + <SplitLS>0</SplitLS> + <OneElfS>0</OneElfS> + <Strict>0</Strict> + <EnumInt>0</EnumInt> + <PlainCh>0</PlainCh> + <Ropi>0</Ropi> + <Rwpi>0</Rwpi> + <wLevel>0</wLevel> + <uThumb>0</uThumb> + <VariousControls> + <MiscControls></MiscControls> + <Define>CORTEX_M0PLUS</Define> + <Undefine></Undefine> + <IncludePath>..\..\..\..\software\cmsis\CMSIS\Include; ..\..\..\..\software\cmsis\Device\ARM\CMSDK_CM0plus\Include; ..\..\..\..\software\common\retarget</IncludePath> + </VariousControls> + </Cads> + <Aads> + <interw>1</interw> + <Ropi>0</Ropi> + <Rwpi>0</Rwpi> + <thumb>0</thumb> + <SplitLS>0</SplitLS> + <SwStkChk>0</SwStkChk> + <NoWarn>0</NoWarn> + <VariousControls> + <MiscControls></MiscControls> + <Define></Define> + <Undefine></Undefine> + <IncludePath></IncludePath> + </VariousControls> + </Aads> + <LDads> + <umfTarg>1</umfTarg> + <Ropi>0</Ropi> + <Rwpi>0</Rwpi> + <noStLib>0</noStLib> + <RepFail>1</RepFail> + <useFile>0</useFile> + <TextAddressRange>0x00000000</TextAddressRange> + <DataAddressRange>0x00000000</DataAddressRange> + <ScatterFile></ScatterFile> + <IncludeLibs></IncludeLibs> + <IncludeLibsPath></IncludeLibsPath> + <Misc></Misc> + <LinkerInputFile></LinkerInputFile> + <DisabledWarnings></DisabledWarnings> + </LDads> + </TargetArmAds> + </TargetOption> + <Groups> + <Group> + <GroupName>Startup</GroupName> + <Files> + <File> + <FileName>startup_CMSDK_CM0plus.s</FileName> + <FileType>2</FileType> + <FilePath>..\..\..\..\software\cmsis\Device\ARM\CMSDK_CM0plus\Source\ARM\startup_CMSDK_CM0plus.s</FilePath> + </File> + </Files> + </Group> + <Group> + <GroupName>Application</GroupName> + <Files> + <File> + <FileName>uart_stdout.c</FileName> + <FileType>1</FileType> + <FilePath>..\..\..\..\software\common\retarget\uart_stdout.c</FilePath> + </File> + <File> + <FileName>retarget.c</FileName> + <FileType>1</FileType> + <FilePath>..\..\..\..\software\common\retarget\retarget.c</FilePath> + </File> + <File> + <FileName>CMSDK_driver.c</FileName> + <FileType>1</FileType> + <FilePath>..\..\..\..\software\cmsis\Device\ARM\CMSDK_CM0plus\Source\CMSDK_driver.c</FilePath> + </File> + <File> + <FileName>gpio_driver_tests.c</FileName> + <FileType>1</FileType> + <FilePath>..\..\..\..\software\common\validation\gpio_driver_tests.c</FilePath> + </File> + </Files> + </Group> + <Group> + <GroupName>System</GroupName> + <Files> + <File> + <FileName>system_CMSDK_CM0plus.c</FileName> + <FileType>1</FileType> + <FilePath>..\..\..\..\software\cmsis\Device\ARM\CMSDK_CM0plus\Source\system_CMSDK_CM0plus.c</FilePath> + </File> + </Files> + </Group> + </Groups> + </Target> + </Targets> + +</Project> diff --git a/Cortex-M0/nanosoc/systems/mcu/testcodes/gpio_driver_tests/makefile b/Cortex-M0/nanosoc/systems/mcu/testcodes/gpio_driver_tests/makefile new file mode 100644 index 0000000..d4bde33 --- /dev/null +++ b/Cortex-M0/nanosoc/systems/mcu/testcodes/gpio_driver_tests/makefile @@ -0,0 +1,255 @@ +#----------------------------------------------------------------------------- +# The confidential and proprietary information contained in this file may +# only be used by a person authorised under and to the extent permitted +# by a subsisting licensing agreement from Arm Limited or its affiliates. +# +# (C) COPYRIGHT 2010-2013 Arm Limited or its affiliates. +# ALL RIGHTS RESERVED +# +# This entire notice must be reproduced on all copies of this file +# and copies of this file may only be made by a person if such person is +# permitted to do so under the terms of a subsisting license agreement +# from Arm Limited or its affiliates. +# +# SVN Information +# +# Checked In : $Date: 2011-01-25 10:05:56 +0000 (Tue, 25 Jan 2011) $ +# +# Revision : $Revision: 159421 $ +# +# Release Information : Cortex-M System Design Kit-r1p1-00rel0 +#----------------------------------------------------------------------------- +# +# Cortex-M System Design Kit software compilation make file +# +#----------------------------------------------------------------------------- +# +# Configurations +# +# Choose the core instantiated, can be +# - CORTEX_M0 +# - CORTEX_M0PLUS +CPU_PRODUCT = CORTEX_M0PLUS + +# Shared software directory +SOFTWARE_DIR = ../../../../software +CMSIS_DIR = $(SOFTWARE_DIR)/cmsis +CORE_DIR = $(CMSIS_DIR)/CMSIS/Include + +ifeq ($(CPU_PRODUCT),CORTEX_M0PLUS) + DEVICE_DIR = $(CMSIS_DIR)/Device/ARM/CMSDK_CM0plus +else + DEVICE_DIR = $(CMSIS_DIR)/Device/ARM/CMSDK_CM0 +endif + +# Program file +TESTNAME = gpio_driver_tests + +# Endian Option +COMPILE_BIGEND = 0 + +# Configuration +ifeq ($(CPU_PRODUCT),CORTEX_M0PLUS) + USER_DEFINE = -DCORTEX_M0PLUS +else + USER_DEFINE = -DCORTEX_M0 +endif + +DEPS_LIST = makefile + +# Tool chain : ds5 / gcc / keil +TOOL_CHAIN = ds5 + +ifeq ($(TOOL_CHAIN),ds5) + ifeq ($(CPU_PRODUCT),CORTEX_M0PLUS) + CPU_TYPE = --cpu Cortex-M0plus + else + CPU_TYPE = --cpu Cortex-M0 + endif +endif + +ifeq ($(TOOL_CHAIN),gcc) + ifeq ($(CPU_PRODUCT),CORTEX_M0PLUS) + CPU_TYPE = -mcpu=cortex-m0plus + else + CPU_TYPE = -mcpu=cortex-m0 + endif +endif + +# Startup code directory for DS-5 +ifeq ($(TOOL_CHAIN),ds5) + STARTUP_DIR = $(DEVICE_DIR)/Source/ARM +endif + +# Startup code directory for gcc +ifeq ($(TOOL_CHAIN),gcc) + STARTUP_DIR = $(DEVICE_DIR)/Source/GCC +endif + +ifeq ($(CPU_PRODUCT),CORTEX_M0PLUS) + STARTUP_FILE = startup_CMSDK_CM0plus + SYSTEM_FILE = system_CMSDK_CM0plus +else + STARTUP_FILE = startup_CMSDK_CM0 + SYSTEM_FILE = system_CMSDK_CM0 +endif + +# --------------------------------------------------------------------------------------- +# DS-5 options + +# MicroLIB option +COMPILE_MICROLIB = 0 + +# Small Multiply (Cortex-M0/M0+ has small multiplier option) +COMPILE_SMALLMUL = 0 + +ARM_CC_OPTIONS = -c -O3 -g -Otime $(USER_DEFINE) \ + -I $(DEVICE_DIR)/Include -I $(CORE_DIR) -I $(SOFTWARE_DIR)/common/retarget +ARM_ASM_OPTIONS = -g +ARM_LINK_OPTIONS = "--keep=$(STARTUP_FILE).o(RESET)" "--first=$(STARTUP_FILE).o(RESET)" \ + --rw_base 0x30000000 --ro_base 0x00000000 --map + +ifeq ($(COMPILE_BIGEND),1) + # Big Endian + ARM_CC_OPTIONS += --bigend + ARM_ASM_OPTIONS += --bigend + ARM_LINK_OPTIONS += --be8 +endif + +ifeq ($(COMPILE_MICROLIB),1) + # MicroLIB + ARM_CC_OPTIONS += --library_type=microlib + ARM_ASM_OPTIONS += --library_type=microlib --pd "__MICROLIB SETA 1" + ARM_LINK_OPTIONS += --library_type=microlib +endif + +ifeq ($(COMPILE_SMALLMUL),1) + # In Cortex-M0, small multiply takes 32 cycles + ARM_CC_OPTIONS += --multiply_latency=32 +endif + +# --------------------------------------------------------------------------------------- +# gcc options + +GNG_CC = arm-none-eabi-gcc +GNU_OBJDUMP = arm-none-eabi-objdump +GNU_OBJCOPY = arm-none-eabi-objcopy + +LINKER_SCRIPT_PATH = $(SOFTWARE_DIR)/common/scripts +LINKER_SCRIPT = $(LINKER_SCRIPT_PATH)/cmsdk_cm0.ld + +GNU_CC_FLAGS = -g -O3 -mthumb $(CPU_TYPE) + +ifeq ($(COMPILE_BIGEND),1) + # Big Endian + GNU_CC_FLAGS += -mbig-endian +endif + +# --------------------------------------------------------------------------------------- +all: all_$(TOOL_CHAIN) + +# --------------------------------------------------------------------------------------- +# DS-5 + +all_ds5 : $(TESTNAME).hex $(TESTNAME).lst + +$(TESTNAME).o : $(SOFTWARE_DIR)/common/validation/$(TESTNAME).c $(DEPS_LIST) + armcc $(ARM_CC_OPTIONS) $(CPU_TYPE) $< -o $@ + +$(SYSTEM_FILE).o : $(DEVICE_DIR)/Source/$(SYSTEM_FILE).c $(DEPS_LIST) + armcc $(ARM_CC_OPTIONS) $(CPU_TYPE) $< -o $@ + +retarget.o : $(SOFTWARE_DIR)/common/retarget/retarget.c $(DEPS_LIST) + armcc $(ARM_CC_OPTIONS) $(CPU_TYPE) $< -o $@ + +uart_stdout.o : $(SOFTWARE_DIR)/common/retarget/uart_stdout.c $(DEPS_LIST) + armcc $(ARM_CC_OPTIONS) $(CPU_TYPE) $< -o $@ + +CMSDK_driver.o : $(DEVICE_DIR)/Source/CMSDK_driver.c $(DEPS_LIST) + armcc $(ARM_CC_OPTIONS) $(CPU_TYPE) $< -o $@ + +$(STARTUP_FILE).o : $(STARTUP_DIR)/$(STARTUP_FILE).s $(DEPS_LIST) + armasm $(ARM_ASM_OPTIONS) $(CPU_TYPE) $< -o $@ + +$(TESTNAME).ELF : $(TESTNAME).o $(SYSTEM_FILE).o $(STARTUP_FILE).o retarget.o uart_stdout.o CMSDK_driver.o + armlink $(ARM_LINK_OPTIONS) -o $@ $(TESTNAME).o $(SYSTEM_FILE).o $(STARTUP_FILE).o retarget.o uart_stdout.o CMSDK_driver.o + +$(TESTNAME).hex : $(TESTNAME).ELF + fromelf --vhx --8x1 $< --output $@ + +$(TESTNAME).lst : $(TESTNAME).ELF makefile + fromelf -c -d -e -s $< --output $@ + +# --------------------------------------------------------------------------------------- +# gcc +all_gcc: + $(GNG_CC) $(GNU_CC_FLAGS) $(STARTUP_DIR)/$(STARTUP_FILE).s \ + $(SOFTWARE_DIR)/common/validation/$(TESTNAME).c \ + $(SOFTWARE_DIR)/common/retarget/retarget.c \ + $(SOFTWARE_DIR)/common/retarget/uart_stdout.c \ + $(DEVICE_DIR)/Source/CMSDK_driver.c \ + $(DEVICE_DIR)/Source/$(SYSTEM_FILE).c \ + -I $(DEVICE_DIR)/Include -I $(CORE_DIR) \ + -I $(SOFTWARE_DIR)/common/retarget \ + -L $(LINKER_SCRIPT_PATH) \ + -D__STACK_SIZE=0x200 \ + -D__HEAP_SIZE=0x1000 \ + $(USER_DEFINE) -T $(LINKER_SCRIPT) -o $(TESTNAME).o + # Generate disassembly code + $(GNU_OBJDUMP) -S $(TESTNAME).o > $(TESTNAME).lst + # Generate binary file + $(GNU_OBJCOPY) -S $(TESTNAME).o -O binary $(TESTNAME).bin + # Generate hex file + $(GNU_OBJCOPY) -S $(TESTNAME).o -O verilog $(TESTNAME).hex + +# Note: +# If the version of object copy you are using does not support verilog hex file output, +# you can generate the hex file from binary file using the following command +# od -v -A n -t x1 --width=1 $(TESTNAME).bin > $(TESTNAME).hex + + +# --------------------------------------------------------------------------------------- +# Keil MDK + +all_keil: + @echo "Please compile your project code and press ENTER when ready" + @read dummy + +# --------------------------------------------------------------------------------------- +# Binary + +all_bin: $(TESTNAME).bin + # Generate hex file from binary + od -v -A n -t x1 --width=1 $(TESTNAME).bin > $(TESTNAME).hex + +# --------------------------------------------------------------------------------------- +# Clean + +clean : + @rm -rf *.o + @if [ -e $(TESTNAME).hex ] ; then \ + rm -rf $(TESTNAME).hex ; \ + fi + @if [ -e $(TESTNAME).lst ] ; then \ + rm -rf $(TESTNAME).lst ; \ + fi + @if [ -e $(TESTNAME).ELF ] ; then \ + rm -rf $(TESTNAME).ELF ; \ + fi + @if [ -e $(TESTNAME).bin ] ; then \ + rm -rf $(TESTNAME).bin ; \ + fi + @rm -rf *.crf + @rm -rf *.plg + @rm -rf *.tra + @rm -rf *.htm + @rm -rf *.map + @rm -rf *.dep + @rm -rf *.d + @rm -rf *.lnp + @rm -rf *.bak + @rm -rf *.lst + @rm -rf *.axf + @rm -rf *.sct + @rm -rf *.__i + @rm -rf *._ia diff --git a/Cortex-M0/nanosoc/systems/mcu/testcodes/gpio_tests/gpio_tests_cm0.uvopt b/Cortex-M0/nanosoc/systems/mcu/testcodes/gpio_tests/gpio_tests_cm0.uvopt new file mode 100644 index 0000000..39dfcaa --- /dev/null +++ b/Cortex-M0/nanosoc/systems/mcu/testcodes/gpio_tests/gpio_tests_cm0.uvopt @@ -0,0 +1,261 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no" ?> +<ProjectOpt xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="project_opt.xsd"> + + <SchemaVersion>1.0</SchemaVersion> + + <Header>### uVision Project, (C) Keil Software</Header> + + <Extensions> + <cExt>*.c</cExt> + <aExt>*.s*; *.src; *.a*</aExt> + <oExt>*.obj</oExt> + <lExt>*.lib</lExt> + <tExt>*.txt; *.h; *.inc</tExt> + <pExt>*.plm</pExt> + <CppX>*.cpp</CppX> + </Extensions> + + <DaveTm> + <dwLowDateTime>0</dwLowDateTime> + <dwHighDateTime>0</dwHighDateTime> + </DaveTm> + + <Target> + <TargetName>Debug</TargetName> + <ToolsetNumber>0x4</ToolsetNumber> + <ToolsetName>ARM-ADS</ToolsetName> + <TargetOption> + <CLKADS>50000000</CLKADS> + <OPTTT> + <gFlags>1</gFlags> + <BeepAtEnd>1</BeepAtEnd> + <RunSim>1</RunSim> + <RunTarget>0</RunTarget> + </OPTTT> + <OPTHX> + <HexSelection>1</HexSelection> + <FlashByte>65535</FlashByte> + <HexRangeLowAddress>0</HexRangeLowAddress> + <HexRangeHighAddress>0</HexRangeHighAddress> + <HexOffset>0</HexOffset> + </OPTHX> + <OPTLEX> + <PageWidth>79</PageWidth> + <PageLength>66</PageLength> + <TabStop>8</TabStop> + <ListingPath>.\</ListingPath> + </OPTLEX> + <ListingPage> + <CreateCListing>1</CreateCListing> + <CreateAListing>1</CreateAListing> + <CreateLListing>1</CreateLListing> + <CreateIListing>0</CreateIListing> + <AsmCond>1</AsmCond> + <AsmSymb>1</AsmSymb> + <AsmXref>0</AsmXref> + <CCond>1</CCond> + <CCode>0</CCode> + <CListInc>0</CListInc> + <CSymb>0</CSymb> + <LinkerCodeListing>0</LinkerCodeListing> + </ListingPage> + <OPTXL> + <LMap>1</LMap> + <LComments>1</LComments> + <LGenerateSymbols>1</LGenerateSymbols> + <LLibSym>1</LLibSym> + <LLines>1</LLines> + <LLocSym>1</LLocSym> + <LPubSym>1</LPubSym> + <LXref>0</LXref> + <LExpSel>0</LExpSel> + </OPTXL> + <OPTFL> + <tvExp>1</tvExp> + <tvExpOptDlg>0</tvExpOptDlg> + <IsCurrentTarget>1</IsCurrentTarget> + </OPTFL> + <CpuCode>255</CpuCode> + <DllOpt> + <SimDllName>SARMCM3.DLL</SimDllName> + <SimDllArguments></SimDllArguments> + <SimDlgDllName>DARMCM1.DLL</SimDlgDllName> + <SimDlgDllArguments></SimDlgDllArguments> + <TargetDllName>SARMCM3.DLL</TargetDllName> + <TargetDllArguments></TargetDllArguments> + <TargetDlgDllName>TARMCM1.DLL</TargetDlgDllName> + <TargetDlgDllArguments></TargetDlgDllArguments> + </DllOpt> + <DebugOpt> + <uSim>1</uSim> + <uTrg>0</uTrg> + <sLdApp>1</sLdApp> + <sGomain>1</sGomain> + <sRbreak>1</sRbreak> + <sRwatch>1</sRwatch> + <sRmem>1</sRmem> + <sRfunc>1</sRfunc> + <sRbox>1</sRbox> + <tLdApp>1</tLdApp> + <tGomain>0</tGomain> + <tRbreak>1</tRbreak> + <tRwatch>1</tRwatch> + <tRmem>1</tRmem> + <tRfunc>0</tRfunc> + <tRbox>1</tRbox> + <tRtrace>0</tRtrace> + <sRunDeb>0</sRunDeb> + <sLrtime>0</sLrtime> + <nTsel>-1</nTsel> + <sDll></sDll> + <sDllPa></sDllPa> + <sDlgDll></sDlgDll> + <sDlgPa></sDlgPa> + <sIfile></sIfile> + <tDll></tDll> + <tDllPa></tDllPa> + <tDlgDll></tDlgDll> + <tDlgPa></tDlgPa> + <tIfile></tIfile> + <pMon></pMon> + </DebugOpt> + <Breakpoint/> + <DebugFlag> + <trace>0</trace> + <periodic>1</periodic> + <aLwin>0</aLwin> + <aCover>0</aCover> + <aSer1>0</aSer1> + <aSer2>0</aSer2> + <aPa>0</aPa> + <viewmode>0</viewmode> + <vrSel>0</vrSel> + <aSym>0</aSym> + <aTbox>0</aTbox> + <AscS1>0</AscS1> + <AscS2>0</AscS2> + <AscS3>0</AscS3> + <aSer3>0</aSer3> + <eProf>0</eProf> + <aLa>0</aLa> + <aPa1>0</aPa1> + <AscS4>0</AscS4> + <aSer4>0</aSer4> + <StkLoc>0</StkLoc> + <TrcWin>0</TrcWin> + <newCpu>0</newCpu> + <uProt>0</uProt> + </DebugFlag> + <Tracepoint> + <THDelay>0</THDelay> + </Tracepoint> + <LintExecutable></LintExecutable> + <LintConfigFile></LintConfigFile> + </TargetOption> + </Target> + + <Group> + <GroupName>Startup</GroupName> + <tvExp>1</tvExp> + <tvExpOptDlg>0</tvExpOptDlg> + <cbSel>0</cbSel> + <RteFlg>0</RteFlg> + <File> + <GroupNumber>1</GroupNumber> + <FileNumber>1</FileNumber> + <FileType>2</FileType> + <tvExp>0</tvExp> + <Focus>0</Focus> + <ColumnNumber>0</ColumnNumber> + <tvExpOptDlg>0</tvExpOptDlg> + <TopLine>0</TopLine> + <CurrentLine>0</CurrentLine> + <bDave2>0</bDave2> + <PathWithFileName>..\..\..\..\software\cmsis\Device\ARM\CMSDK_CM0\Source\ARM\startup_CMSDK_CM0.s</PathWithFileName> + <FilenameWithoutPath>startup_CMSDK_CM0.s</FilenameWithoutPath> + <RteFlg>0</RteFlg> + <bShared>0</bShared> + </File> + </Group> + + <Group> + <GroupName>Application</GroupName> + <tvExp>1</tvExp> + <tvExpOptDlg>0</tvExpOptDlg> + <cbSel>0</cbSel> + <RteFlg>0</RteFlg> + <File> + <GroupNumber>2</GroupNumber> + <FileNumber>2</FileNumber> + <FileType>1</FileType> + <tvExp>0</tvExp> + <Focus>0</Focus> + <ColumnNumber>0</ColumnNumber> + <tvExpOptDlg>0</tvExpOptDlg> + <TopLine>0</TopLine> + <CurrentLine>0</CurrentLine> + <bDave2>0</bDave2> + <PathWithFileName>..\..\..\..\software\common\retarget\uart_stdout.c</PathWithFileName> + <FilenameWithoutPath>uart_stdout.c</FilenameWithoutPath> + <RteFlg>0</RteFlg> + <bShared>0</bShared> + </File> + <File> + <GroupNumber>2</GroupNumber> + <FileNumber>3</FileNumber> + <FileType>1</FileType> + <tvExp>0</tvExp> + <Focus>0</Focus> + <ColumnNumber>0</ColumnNumber> + <tvExpOptDlg>0</tvExpOptDlg> + <TopLine>0</TopLine> + <CurrentLine>0</CurrentLine> + <bDave2>0</bDave2> + <PathWithFileName>..\..\..\..\software\common\retarget\retarget.c</PathWithFileName> + <FilenameWithoutPath>retarget.c</FilenameWithoutPath> + <RteFlg>0</RteFlg> + <bShared>0</bShared> + </File> + <File> + <GroupNumber>2</GroupNumber> + <FileNumber>4</FileNumber> + <FileType>1</FileType> + <tvExp>0</tvExp> + <Focus>0</Focus> + <ColumnNumber>0</ColumnNumber> + <tvExpOptDlg>0</tvExpOptDlg> + <TopLine>0</TopLine> + <CurrentLine>0</CurrentLine> + <bDave2>0</bDave2> + <PathWithFileName>..\..\..\..\software\common\validation\gpio_tests.c</PathWithFileName> + <FilenameWithoutPath>gpio_tests.c</FilenameWithoutPath> + <RteFlg>0</RteFlg> + <bShared>0</bShared> + </File> + </Group> + + <Group> + <GroupName>System</GroupName> + <tvExp>1</tvExp> + <tvExpOptDlg>0</tvExpOptDlg> + <cbSel>0</cbSel> + <RteFlg>0</RteFlg> + <File> + <GroupNumber>3</GroupNumber> + <FileNumber>5</FileNumber> + <FileType>1</FileType> + <tvExp>0</tvExp> + <Focus>0</Focus> + <ColumnNumber>0</ColumnNumber> + <tvExpOptDlg>0</tvExpOptDlg> + <TopLine>0</TopLine> + <CurrentLine>0</CurrentLine> + <bDave2>0</bDave2> + <PathWithFileName>..\..\..\..\software\cmsis\Device\ARM\CMSDK_CM0\Source\system_CMSDK_CM0.c</PathWithFileName> + <FilenameWithoutPath>system_CMSDK_CM0.c</FilenameWithoutPath> + <RteFlg>0</RteFlg> + <bShared>0</bShared> + </File> + </Group> + +</ProjectOpt> diff --git a/Cortex-M0/nanosoc/systems/mcu/testcodes/gpio_tests/gpio_tests_cm0.uvproj b/Cortex-M0/nanosoc/systems/mcu/testcodes/gpio_tests/gpio_tests_cm0.uvproj new file mode 100644 index 0000000..284bc45 --- /dev/null +++ b/Cortex-M0/nanosoc/systems/mcu/testcodes/gpio_tests/gpio_tests_cm0.uvproj @@ -0,0 +1,435 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no" ?> +<Project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="project_proj.xsd"> + + <SchemaVersion>1.1</SchemaVersion> + + <Header>### uVision Project, (C) Keil Software</Header> + + <Targets> + <Target> + <TargetName>Debug</TargetName> + <ToolsetNumber>0x4</ToolsetNumber> + <ToolsetName>ARM-ADS</ToolsetName> + <TargetOption> + <TargetCommonOption> + <Device>Cortex-M0</Device> + <Vendor>ARM</Vendor> + <Cpu>CLOCK(12000000) CPUTYPE("Cortex-M0") ESEL ELITTLE</Cpu> + <FlashUtilSpec></FlashUtilSpec> + <StartupFile></StartupFile> + <FlashDriverDll></FlashDriverDll> + <DeviceId>4803</DeviceId> + <RegisterFile></RegisterFile> + <MemoryEnv></MemoryEnv> + <Cmp></Cmp> + <Asm></Asm> + <Linker></Linker> + <OHString></OHString> + <InfinionOptionDll></InfinionOptionDll> + <SLE66CMisc></SLE66CMisc> + <SLE66AMisc></SLE66AMisc> + <SLE66LinkerMisc></SLE66LinkerMisc> + <SFDFile></SFDFile> + <UseEnv>0</UseEnv> + <BinPath></BinPath> + <IncludePath></IncludePath> + <LibPath></LibPath> + <RegisterFilePath></RegisterFilePath> + <DBRegisterFilePath></DBRegisterFilePath> + <TargetStatus> + <Error>0</Error> + <ExitCodeStop>0</ExitCodeStop> + <ButtonStop>0</ButtonStop> + <NotGenerated>0</NotGenerated> + <InvalidFlash>1</InvalidFlash> + </TargetStatus> + <OutputDirectory>.\</OutputDirectory> + <OutputName>gpio_tests</OutputName> + <CreateExecutable>1</CreateExecutable> + <CreateLib>0</CreateLib> + <CreateHexFile>0</CreateHexFile> + <DebugInformation>1</DebugInformation> + <BrowseInformation>1</BrowseInformation> + <ListingPath>.\</ListingPath> + <HexFormatSelection>1</HexFormatSelection> + <Merge32K>0</Merge32K> + <CreateBatchFile>0</CreateBatchFile> + <BeforeCompile> + <RunUserProg1>0</RunUserProg1> + <RunUserProg2>0</RunUserProg2> + <UserProg1Name></UserProg1Name> + <UserProg2Name></UserProg2Name> + <UserProg1Dos16Mode>0</UserProg1Dos16Mode> + <UserProg2Dos16Mode>0</UserProg2Dos16Mode> + <nStopU1X>0</nStopU1X> + <nStopU2X>0</nStopU2X> + </BeforeCompile> + <BeforeMake> + <RunUserProg1>0</RunUserProg1> + <RunUserProg2>0</RunUserProg2> + <UserProg1Name></UserProg1Name> + <UserProg2Name></UserProg2Name> + <UserProg1Dos16Mode>0</UserProg1Dos16Mode> + <UserProg2Dos16Mode>0</UserProg2Dos16Mode> + </BeforeMake> + <AfterMake> + <RunUserProg1>1</RunUserProg1> + <RunUserProg2>0</RunUserProg2> + <UserProg1Name>$K\ARM\ARMCC\BIN\fromelf.exe #L --vhx --8x1 --output gpio_tests.hex</UserProg1Name> + <UserProg2Name></UserProg2Name> + <UserProg1Dos16Mode>0</UserProg1Dos16Mode> + <UserProg2Dos16Mode>0</UserProg2Dos16Mode> + </AfterMake> + <SelectedForBatchBuild>0</SelectedForBatchBuild> + <SVCSIdString></SVCSIdString> + </TargetCommonOption> + <CommonProperty> + <UseCPPCompiler>0</UseCPPCompiler> + <RVCTCodeConst>0</RVCTCodeConst> + <RVCTZI>0</RVCTZI> + <RVCTOtherData>0</RVCTOtherData> + <ModuleSelection>0</ModuleSelection> + <IncludeInBuild>1</IncludeInBuild> + <AlwaysBuild>0</AlwaysBuild> + <GenerateAssemblyFile>0</GenerateAssemblyFile> + <AssembleAssemblyFile>0</AssembleAssemblyFile> + <PublicsOnly>0</PublicsOnly> + <StopOnExitCode>3</StopOnExitCode> + <CustomArgument></CustomArgument> + <IncludeLibraryModules></IncludeLibraryModules> + </CommonProperty> + <DllOption> + <SimDllName>SARMCM3.DLL</SimDllName> + <SimDllArguments></SimDllArguments> + <SimDlgDll>DARMCM1.DLL</SimDlgDll> + <SimDlgDllArguments></SimDlgDllArguments> + <TargetDllName>SARMCM3.DLL</TargetDllName> + <TargetDllArguments></TargetDllArguments> + <TargetDlgDll>TARMCM1.DLL</TargetDlgDll> + <TargetDlgDllArguments></TargetDlgDllArguments> + </DllOption> + <DebugOption> + <OPTHX> + <HexSelection>1</HexSelection> + <HexRangeLowAddress>0</HexRangeLowAddress> + <HexRangeHighAddress>0</HexRangeHighAddress> + <HexOffset>0</HexOffset> + <Oh166RecLen>16</Oh166RecLen> + </OPTHX> + <Simulator> + <UseSimulator>1</UseSimulator> + <LoadApplicationAtStartup>1</LoadApplicationAtStartup> + <RunToMain>1</RunToMain> + <RestoreBreakpoints>1</RestoreBreakpoints> + <RestoreWatchpoints>1</RestoreWatchpoints> + <RestoreMemoryDisplay>1</RestoreMemoryDisplay> + <RestoreFunctions>1</RestoreFunctions> + <RestoreToolbox>1</RestoreToolbox> + <LimitSpeedToRealTime>0</LimitSpeedToRealTime> + </Simulator> + <Target> + <UseTarget>0</UseTarget> + <LoadApplicationAtStartup>1</LoadApplicationAtStartup> + <RunToMain>0</RunToMain> + <RestoreBreakpoints>1</RestoreBreakpoints> + <RestoreWatchpoints>1</RestoreWatchpoints> + <RestoreMemoryDisplay>1</RestoreMemoryDisplay> + <RestoreFunctions>0</RestoreFunctions> + <RestoreToolbox>1</RestoreToolbox> + <RestoreTracepoints>0</RestoreTracepoints> + </Target> + <RunDebugAfterBuild>0</RunDebugAfterBuild> + <TargetSelection>-1</TargetSelection> + <SimDlls> + <CpuDll></CpuDll> + <CpuDllArguments></CpuDllArguments> + <PeripheralDll></PeripheralDll> + <PeripheralDllArguments></PeripheralDllArguments> + <InitializationFile></InitializationFile> + </SimDlls> + <TargetDlls> + <CpuDll></CpuDll> + <CpuDllArguments></CpuDllArguments> + <PeripheralDll></PeripheralDll> + <PeripheralDllArguments></PeripheralDllArguments> + <InitializationFile></InitializationFile> + <Driver></Driver> + </TargetDlls> + </DebugOption> + <Utilities> + <Flash1> + <UseTargetDll>0</UseTargetDll> + <UseExternalTool>0</UseExternalTool> + <RunIndependent>0</RunIndependent> + <UpdateFlashBeforeDebugging>0</UpdateFlashBeforeDebugging> + <Capability>0</Capability> + <DriverSelection>-1</DriverSelection> + </Flash1> + <Flash2></Flash2> + <Flash3></Flash3> + <Flash4></Flash4> + </Utilities> + <TargetArmAds> + <ArmAdsMisc> + <GenerateListings>0</GenerateListings> + <asHll>1</asHll> + <asAsm>1</asAsm> + <asMacX>1</asMacX> + <asSyms>1</asSyms> + <asFals>1</asFals> + <asDbgD>1</asDbgD> + <asForm>1</asForm> + <ldLst>0</ldLst> + <ldmm>1</ldmm> + <ldXref>1</ldXref> + <BigEnd>0</BigEnd> + <AdsALst>1</AdsALst> + <AdsACrf>1</AdsACrf> + <AdsANop>0</AdsANop> + <AdsANot>0</AdsANot> + <AdsLLst>1</AdsLLst> + <AdsLmap>1</AdsLmap> + <AdsLcgr>1</AdsLcgr> + <AdsLsym>1</AdsLsym> + <AdsLszi>1</AdsLszi> + <AdsLtoi>1</AdsLtoi> + <AdsLsun>1</AdsLsun> + <AdsLven>1</AdsLven> + <AdsLsxf>1</AdsLsxf> + <RvctClst>0</RvctClst> + <GenPPlst>0</GenPPlst> + <AdsCpuType>"Cortex-M0"</AdsCpuType> + <RvctDeviceName></RvctDeviceName> + <mOS>0</mOS> + <uocRom>0</uocRom> + <uocRam>0</uocRam> + <hadIROM>0</hadIROM> + <hadIRAM>0</hadIRAM> + <hadXRAM>0</hadXRAM> + <uocXRam>0</uocXRam> + <RvdsVP>0</RvdsVP> + <hadIRAM2>0</hadIRAM2> + <hadIROM2>0</hadIROM2> + <StupSel>1</StupSel> + <useUlib>0</useUlib> + <EndSel>1</EndSel> + <uLtcg>0</uLtcg> + <RoSelD>0</RoSelD> + <RwSelD>5</RwSelD> + <CodeSel>0</CodeSel> + <OptFeed>0</OptFeed> + <NoZi1>0</NoZi1> + <NoZi2>0</NoZi2> + <NoZi3>0</NoZi3> + <NoZi4>0</NoZi4> + <NoZi5>0</NoZi5> + <Ro1Chk>1</Ro1Chk> + <Ro2Chk>0</Ro2Chk> + <Ro3Chk>0</Ro3Chk> + <Ir1Chk>0</Ir1Chk> + <Ir2Chk>0</Ir2Chk> + <Ra1Chk>1</Ra1Chk> + <Ra2Chk>0</Ra2Chk> + <Ra3Chk>0</Ra3Chk> + <Im1Chk>0</Im1Chk> + <Im2Chk>0</Im2Chk> + <OnChipMemories> + <Ocm1> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </Ocm1> + <Ocm2> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </Ocm2> + <Ocm3> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </Ocm3> + <Ocm4> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </Ocm4> + <Ocm5> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </Ocm5> + <Ocm6> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </Ocm6> + <IRAM> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </IRAM> + <IROM> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </IROM> + <XRAM> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </XRAM> + <OCR_RVCT1> + <Type>1</Type> + <StartAddress>0x0</StartAddress> + <Size>0x10000</Size> + </OCR_RVCT1> + <OCR_RVCT2> + <Type>1</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </OCR_RVCT2> + <OCR_RVCT3> + <Type>1</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </OCR_RVCT3> + <OCR_RVCT4> + <Type>1</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </OCR_RVCT4> + <OCR_RVCT5> + <Type>1</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </OCR_RVCT5> + <OCR_RVCT6> + <Type>0</Type> + <StartAddress>0x20000000</StartAddress> + <Size>0x10000</Size> + </OCR_RVCT6> + <OCR_RVCT7> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </OCR_RVCT7> + <OCR_RVCT8> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </OCR_RVCT8> + <OCR_RVCT9> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </OCR_RVCT9> + <OCR_RVCT10> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </OCR_RVCT10> + </OnChipMemories> + <RvctStartVector></RvctStartVector> + </ArmAdsMisc> + <Cads> + <interw>1</interw> + <Optim>4</Optim> + <oTime>0</oTime> + <SplitLS>0</SplitLS> + <OneElfS>0</OneElfS> + <Strict>0</Strict> + <EnumInt>0</EnumInt> + <PlainCh>0</PlainCh> + <Ropi>0</Ropi> + <Rwpi>0</Rwpi> + <wLevel>0</wLevel> + <uThumb>0</uThumb> + <uSurpInc>0</uSurpInc> + <VariousControls> + <MiscControls></MiscControls> + <Define>CORTEX_M0</Define> + <Undefine></Undefine> + <IncludePath>..\..\..\..\software\cmsis\CMSIS\Include; ..\..\..\..\software\cmsis\Device\ARM\CMSDK_CM0\Include; ..\..\..\..\software\common\retarget</IncludePath> + </VariousControls> + </Cads> + <Aads> + <interw>1</interw> + <Ropi>0</Ropi> + <Rwpi>0</Rwpi> + <thumb>0</thumb> + <SplitLS>0</SplitLS> + <SwStkChk>0</SwStkChk> + <NoWarn>0</NoWarn> + <uSurpInc>0</uSurpInc> + <VariousControls> + <MiscControls></MiscControls> + <Define></Define> + <Undefine></Undefine> + <IncludePath></IncludePath> + </VariousControls> + </Aads> + <LDads> + <umfTarg>1</umfTarg> + <Ropi>0</Ropi> + <Rwpi>0</Rwpi> + <noStLib>0</noStLib> + <RepFail>1</RepFail> + <useFile>0</useFile> + <TextAddressRange>0x00000000</TextAddressRange> + <DataAddressRange>0x00000000</DataAddressRange> + <ScatterFile></ScatterFile> + <IncludeLibs></IncludeLibs> + <IncludeLibsPath></IncludeLibsPath> + <Misc></Misc> + <LinkerInputFile></LinkerInputFile> + <DisabledWarnings></DisabledWarnings> + </LDads> + </TargetArmAds> + </TargetOption> + <Groups> + <Group> + <GroupName>Startup</GroupName> + <Files> + <File> + <FileName>startup_CMSDK_CM0.s</FileName> + <FileType>2</FileType> + <FilePath>..\..\..\..\software\cmsis\Device\ARM\CMSDK_CM0\Source\ARM\startup_CMSDK_CM0.s</FilePath> + </File> + </Files> + </Group> + <Group> + <GroupName>Application</GroupName> + <Files> + <File> + <FileName>uart_stdout.c</FileName> + <FileType>1</FileType> + <FilePath>..\..\..\..\software\common\retarget\uart_stdout.c</FilePath> + </File> + <File> + <FileName>retarget.c</FileName> + <FileType>1</FileType> + <FilePath>..\..\..\..\software\common\retarget\retarget.c</FilePath> + </File> + <File> + <FileName>gpio_tests.c</FileName> + <FileType>1</FileType> + <FilePath>..\..\..\..\software\common\validation\gpio_tests.c</FilePath> + </File> + </Files> + </Group> + <Group> + <GroupName>System</GroupName> + <Files> + <File> + <FileName>system_CMSDK_CM0.c</FileName> + <FileType>1</FileType> + <FilePath>..\..\..\..\software\cmsis\Device\ARM\CMSDK_CM0\Source\system_CMSDK_CM0.c</FilePath> + </File> + </Files> + </Group> + </Groups> + </Target> + </Targets> + +</Project> diff --git a/Cortex-M0/nanosoc/systems/mcu/testcodes/gpio_tests/gpio_tests_cm0p.uvopt b/Cortex-M0/nanosoc/systems/mcu/testcodes/gpio_tests/gpio_tests_cm0p.uvopt new file mode 100644 index 0000000..44d9aed --- /dev/null +++ b/Cortex-M0/nanosoc/systems/mcu/testcodes/gpio_tests/gpio_tests_cm0p.uvopt @@ -0,0 +1,244 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no" ?> +<ProjectOpt xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="project_opt.xsd"> + + <SchemaVersion>1.0</SchemaVersion> + + <Header>### uVision Project, (C) Keil Software</Header> + + <Extensions> + <cExt>*.c</cExt> + <aExt>*.s*; *.src; *.a*</aExt> + <oExt>*.obj</oExt> + <lExt>*.lib</lExt> + <tExt>*.txt; *.h; *.inc</tExt> + <pExt>*.plm</pExt> + <CppX>*.cpp</CppX> + </Extensions> + + <DaveTm> + <dwLowDateTime>0</dwLowDateTime> + <dwHighDateTime>0</dwHighDateTime> + </DaveTm> + + <Target> + <TargetName>Debug</TargetName> + <ToolsetNumber>0x4</ToolsetNumber> + <ToolsetName>ARM-ADS</ToolsetName> + <TargetOption> + <CLKADS>50000000</CLKADS> + <OPTTT> + <gFlags>1</gFlags> + <BeepAtEnd>1</BeepAtEnd> + <RunSim>1</RunSim> + <RunTarget>0</RunTarget> + </OPTTT> + <OPTHX> + <HexSelection>1</HexSelection> + <FlashByte>65535</FlashByte> + <HexRangeLowAddress>0</HexRangeLowAddress> + <HexRangeHighAddress>0</HexRangeHighAddress> + <HexOffset>0</HexOffset> + </OPTHX> + <OPTLEX> + <PageWidth>79</PageWidth> + <PageLength>66</PageLength> + <TabStop>8</TabStop> + <ListingPath>.\</ListingPath> + </OPTLEX> + <ListingPage> + <CreateCListing>1</CreateCListing> + <CreateAListing>1</CreateAListing> + <CreateLListing>1</CreateLListing> + <CreateIListing>0</CreateIListing> + <AsmCond>1</AsmCond> + <AsmSymb>1</AsmSymb> + <AsmXref>0</AsmXref> + <CCond>1</CCond> + <CCode>0</CCode> + <CListInc>0</CListInc> + <CSymb>0</CSymb> + <LinkerCodeListing>0</LinkerCodeListing> + </ListingPage> + <OPTXL> + <LMap>1</LMap> + <LComments>1</LComments> + <LGenerateSymbols>1</LGenerateSymbols> + <LLibSym>1</LLibSym> + <LLines>1</LLines> + <LLocSym>1</LLocSym> + <LPubSym>1</LPubSym> + <LXref>0</LXref> + <LExpSel>0</LExpSel> + </OPTXL> + <OPTFL> + <tvExp>1</tvExp> + <tvExpOptDlg>0</tvExpOptDlg> + <IsCurrentTarget>1</IsCurrentTarget> + </OPTFL> + <CpuCode>255</CpuCode> + <DllOpt> + <SimDllName>SARMCM3.DLL</SimDllName> + <SimDllArguments></SimDllArguments> + <SimDlgDllName>DARMCM1.DLL</SimDlgDllName> + <SimDlgDllArguments></SimDlgDllArguments> + <TargetDllName>SARMCM3.DLL</TargetDllName> + <TargetDllArguments></TargetDllArguments> + <TargetDlgDllName>TARMCM1.DLL</TargetDlgDllName> + <TargetDlgDllArguments></TargetDlgDllArguments> + </DllOpt> + <DebugOpt> + <uSim>1</uSim> + <uTrg>0</uTrg> + <sLdApp>1</sLdApp> + <sGomain>1</sGomain> + <sRbreak>1</sRbreak> + <sRwatch>1</sRwatch> + <sRmem>1</sRmem> + <sRfunc>1</sRfunc> + <sRbox>1</sRbox> + <tLdApp>1</tLdApp> + <tGomain>0</tGomain> + <tRbreak>1</tRbreak> + <tRwatch>1</tRwatch> + <tRmem>1</tRmem> + <tRfunc>0</tRfunc> + <tRbox>1</tRbox> + <sRunDeb>0</sRunDeb> + <sLrtime>0</sLrtime> + <nTsel>-1</nTsel> + <sDll></sDll> + <sDllPa></sDllPa> + <sDlgDll></sDlgDll> + <sDlgPa></sDlgPa> + <sIfile></sIfile> + <tDll></tDll> + <tDllPa></tDllPa> + <tDlgDll></tDlgDll> + <tDlgPa></tDlgPa> + <tIfile></tIfile> + <pMon></pMon> + </DebugOpt> + <Breakpoint/> + <DebugFlag> + <trace>0</trace> + <periodic>1</periodic> + <aLwin>0</aLwin> + <aCover>0</aCover> + <aSer1>0</aSer1> + <aSer2>0</aSer2> + <aPa>0</aPa> + <viewmode>0</viewmode> + <vrSel>0</vrSel> + <aSym>0</aSym> + <aTbox>0</aTbox> + <AscS1>0</AscS1> + <AscS2>0</AscS2> + <AscS3>0</AscS3> + <aSer3>0</aSer3> + <eProf>0</eProf> + <aLa>0</aLa> + <aPa1>0</aPa1> + <AscS4>0</AscS4> + <aSer4>0</aSer4> + <StkLoc>0</StkLoc> + <TrcWin>0</TrcWin> + <newCpu>0</newCpu> + <uProt>0</uProt> + </DebugFlag> + <LintExecutable></LintExecutable> + <LintConfigFile></LintConfigFile> + </TargetOption> + </Target> + + <Group> + <GroupName>Startup</GroupName> + <tvExp>1</tvExp> + <tvExpOptDlg>0</tvExpOptDlg> + <cbSel>0</cbSel> + <File> + <GroupNumber>1</GroupNumber> + <FileNumber>1</FileNumber> + <FileType>2</FileType> + <tvExp>0</tvExp> + <Focus>0</Focus> + <ColumnNumber>0</ColumnNumber> + <tvExpOptDlg>0</tvExpOptDlg> + <TopLine>0</TopLine> + <CurrentLine>0</CurrentLine> + <bDave2>0</bDave2> + <PathWithFileName>..\..\..\..\software\cmsis\Device\ARM\CMSDK_CM0plus\Source\ARM\startup_CMSDK_CM0plus.s</PathWithFileName> + <FilenameWithoutPath>startup_CMSDK_CM0plus.s</FilenameWithoutPath> + </File> + </Group> + + <Group> + <GroupName>Application</GroupName> + <tvExp>1</tvExp> + <tvExpOptDlg>0</tvExpOptDlg> + <cbSel>0</cbSel> + <File> + <GroupNumber>2</GroupNumber> + <FileNumber>2</FileNumber> + <FileType>1</FileType> + <tvExp>0</tvExp> + <Focus>0</Focus> + <ColumnNumber>0</ColumnNumber> + <tvExpOptDlg>0</tvExpOptDlg> + <TopLine>0</TopLine> + <CurrentLine>0</CurrentLine> + <bDave2>0</bDave2> + <PathWithFileName>..\..\..\..\software\common\retarget\uart_stdout.c</PathWithFileName> + <FilenameWithoutPath>uart_stdout.c</FilenameWithoutPath> + </File> + <File> + <GroupNumber>2</GroupNumber> + <FileNumber>3</FileNumber> + <FileType>1</FileType> + <tvExp>0</tvExp> + <Focus>0</Focus> + <ColumnNumber>0</ColumnNumber> + <tvExpOptDlg>0</tvExpOptDlg> + <TopLine>0</TopLine> + <CurrentLine>0</CurrentLine> + <bDave2>0</bDave2> + <PathWithFileName>..\..\..\..\software\common\retarget\retarget.c</PathWithFileName> + <FilenameWithoutPath>retarget.c</FilenameWithoutPath> + </File> + <File> + <GroupNumber>2</GroupNumber> + <FileNumber>4</FileNumber> + <FileType>1</FileType> + <tvExp>0</tvExp> + <Focus>0</Focus> + <ColumnNumber>0</ColumnNumber> + <tvExpOptDlg>0</tvExpOptDlg> + <TopLine>0</TopLine> + <CurrentLine>0</CurrentLine> + <bDave2>0</bDave2> + <PathWithFileName>..\..\..\..\software\common\validation\gpio_tests.c</PathWithFileName> + <FilenameWithoutPath>gpio_tests.c</FilenameWithoutPath> + </File> + </Group> + + <Group> + <GroupName>System</GroupName> + <tvExp>1</tvExp> + <tvExpOptDlg>0</tvExpOptDlg> + <cbSel>0</cbSel> + <File> + <GroupNumber>3</GroupNumber> + <FileNumber>5</FileNumber> + <FileType>1</FileType> + <tvExp>0</tvExp> + <Focus>0</Focus> + <ColumnNumber>0</ColumnNumber> + <tvExpOptDlg>0</tvExpOptDlg> + <TopLine>0</TopLine> + <CurrentLine>0</CurrentLine> + <bDave2>0</bDave2> + <PathWithFileName>..\..\..\..\software\cmsis\Device\ARM\CMSDK_CM0plus\Source\system_CMSDK_CM0plus.c</PathWithFileName> + <FilenameWithoutPath>system_CMSDK_CM0plus.c</FilenameWithoutPath> + </File> + </Group> + +</ProjectOpt> diff --git a/Cortex-M0/nanosoc/systems/mcu/testcodes/gpio_tests/gpio_tests_cm0p.uvproj b/Cortex-M0/nanosoc/systems/mcu/testcodes/gpio_tests/gpio_tests_cm0p.uvproj new file mode 100644 index 0000000..8e0ea89 --- /dev/null +++ b/Cortex-M0/nanosoc/systems/mcu/testcodes/gpio_tests/gpio_tests_cm0p.uvproj @@ -0,0 +1,432 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no" ?> +<Project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="project_proj.xsd"> + + <SchemaVersion>1.1</SchemaVersion> + + <Header>### uVision Project, (C) Keil Software</Header> + + <Targets> + <Target> + <TargetName>Debug</TargetName> + <ToolsetNumber>0x4</ToolsetNumber> + <ToolsetName>ARM-ADS</ToolsetName> + <TargetOption> + <TargetCommonOption> + <Device>Cortex-M0+</Device> + <Vendor>ARM</Vendor> + <Cpu>CLOCK(12000000) CPUTYPE("Cortex-M0+") ESEL ELITTLE</Cpu> + <FlashUtilSpec></FlashUtilSpec> + <StartupFile></StartupFile> + <FlashDriverDll></FlashDriverDll> + <DeviceId>6268</DeviceId> + <RegisterFile></RegisterFile> + <MemoryEnv></MemoryEnv> + <Cmp></Cmp> + <Asm></Asm> + <Linker></Linker> + <OHString></OHString> + <InfinionOptionDll></InfinionOptionDll> + <SLE66CMisc></SLE66CMisc> + <SLE66AMisc></SLE66AMisc> + <SLE66LinkerMisc></SLE66LinkerMisc> + <SFDFile></SFDFile> + <UseEnv>0</UseEnv> + <BinPath></BinPath> + <IncludePath></IncludePath> + <LibPath></LibPath> + <RegisterFilePath></RegisterFilePath> + <DBRegisterFilePath></DBRegisterFilePath> + <TargetStatus> + <Error>0</Error> + <ExitCodeStop>0</ExitCodeStop> + <ButtonStop>0</ButtonStop> + <NotGenerated>0</NotGenerated> + <InvalidFlash>1</InvalidFlash> + </TargetStatus> + <OutputDirectory>.\</OutputDirectory> + <OutputName>gpio_tests</OutputName> + <CreateExecutable>1</CreateExecutable> + <CreateLib>0</CreateLib> + <CreateHexFile>0</CreateHexFile> + <DebugInformation>1</DebugInformation> + <BrowseInformation>1</BrowseInformation> + <ListingPath>.\</ListingPath> + <HexFormatSelection>1</HexFormatSelection> + <Merge32K>0</Merge32K> + <CreateBatchFile>0</CreateBatchFile> + <BeforeCompile> + <RunUserProg1>0</RunUserProg1> + <RunUserProg2>0</RunUserProg2> + <UserProg1Name></UserProg1Name> + <UserProg2Name></UserProg2Name> + <UserProg1Dos16Mode>0</UserProg1Dos16Mode> + <UserProg2Dos16Mode>0</UserProg2Dos16Mode> + <nStopU1X>0</nStopU1X> + <nStopU2X>0</nStopU2X> + </BeforeCompile> + <BeforeMake> + <RunUserProg1>0</RunUserProg1> + <RunUserProg2>0</RunUserProg2> + <UserProg1Name></UserProg1Name> + <UserProg2Name></UserProg2Name> + <UserProg1Dos16Mode>0</UserProg1Dos16Mode> + <UserProg2Dos16Mode>0</UserProg2Dos16Mode> + </BeforeMake> + <AfterMake> + <RunUserProg1>1</RunUserProg1> + <RunUserProg2>0</RunUserProg2> + <UserProg1Name>$K\ARM\ARMCC\BIN\fromelf.exe #L --vhx --8x1 --output gpio_tests.hex</UserProg1Name> + <UserProg2Name></UserProg2Name> + <UserProg1Dos16Mode>0</UserProg1Dos16Mode> + <UserProg2Dos16Mode>0</UserProg2Dos16Mode> + </AfterMake> + <SelectedForBatchBuild>0</SelectedForBatchBuild> + <SVCSIdString></SVCSIdString> + </TargetCommonOption> + <CommonProperty> + <UseCPPCompiler>0</UseCPPCompiler> + <RVCTCodeConst>0</RVCTCodeConst> + <RVCTZI>0</RVCTZI> + <RVCTOtherData>0</RVCTOtherData> + <ModuleSelection>0</ModuleSelection> + <IncludeInBuild>1</IncludeInBuild> + <AlwaysBuild>0</AlwaysBuild> + <GenerateAssemblyFile>0</GenerateAssemblyFile> + <AssembleAssemblyFile>0</AssembleAssemblyFile> + <PublicsOnly>0</PublicsOnly> + <StopOnExitCode>3</StopOnExitCode> + <CustomArgument></CustomArgument> + <IncludeLibraryModules></IncludeLibraryModules> + </CommonProperty> + <DllOption> + <SimDllName>SARMCM3.DLL</SimDllName> + <SimDllArguments></SimDllArguments> + <SimDlgDll>DARMCM1.DLL</SimDlgDll> + <SimDlgDllArguments></SimDlgDllArguments> + <TargetDllName>SARMCM3.DLL</TargetDllName> + <TargetDllArguments></TargetDllArguments> + <TargetDlgDll>TARMCM1.DLL</TargetDlgDll> + <TargetDlgDllArguments></TargetDlgDllArguments> + </DllOption> + <DebugOption> + <OPTHX> + <HexSelection>1</HexSelection> + <HexRangeLowAddress>0</HexRangeLowAddress> + <HexRangeHighAddress>0</HexRangeHighAddress> + <HexOffset>0</HexOffset> + <Oh166RecLen>16</Oh166RecLen> + </OPTHX> + <Simulator> + <UseSimulator>1</UseSimulator> + <LoadApplicationAtStartup>1</LoadApplicationAtStartup> + <RunToMain>1</RunToMain> + <RestoreBreakpoints>1</RestoreBreakpoints> + <RestoreWatchpoints>1</RestoreWatchpoints> + <RestoreMemoryDisplay>1</RestoreMemoryDisplay> + <RestoreFunctions>1</RestoreFunctions> + <RestoreToolbox>1</RestoreToolbox> + <LimitSpeedToRealTime>0</LimitSpeedToRealTime> + </Simulator> + <Target> + <UseTarget>0</UseTarget> + <LoadApplicationAtStartup>1</LoadApplicationAtStartup> + <RunToMain>0</RunToMain> + <RestoreBreakpoints>1</RestoreBreakpoints> + <RestoreWatchpoints>1</RestoreWatchpoints> + <RestoreMemoryDisplay>1</RestoreMemoryDisplay> + <RestoreFunctions>0</RestoreFunctions> + <RestoreToolbox>1</RestoreToolbox> + </Target> + <RunDebugAfterBuild>0</RunDebugAfterBuild> + <TargetSelection>-1</TargetSelection> + <SimDlls> + <CpuDll></CpuDll> + <CpuDllArguments></CpuDllArguments> + <PeripheralDll></PeripheralDll> + <PeripheralDllArguments></PeripheralDllArguments> + <InitializationFile></InitializationFile> + </SimDlls> + <TargetDlls> + <CpuDll></CpuDll> + <CpuDllArguments></CpuDllArguments> + <PeripheralDll></PeripheralDll> + <PeripheralDllArguments></PeripheralDllArguments> + <InitializationFile></InitializationFile> + <Driver></Driver> + </TargetDlls> + </DebugOption> + <Utilities> + <Flash1> + <UseTargetDll>0</UseTargetDll> + <UseExternalTool>0</UseExternalTool> + <RunIndependent>0</RunIndependent> + <UpdateFlashBeforeDebugging>0</UpdateFlashBeforeDebugging> + <Capability>0</Capability> + <DriverSelection>-1</DriverSelection> + </Flash1> + <Flash2></Flash2> + <Flash3></Flash3> + <Flash4></Flash4> + </Utilities> + <TargetArmAds> + <ArmAdsMisc> + <GenerateListings>0</GenerateListings> + <asHll>1</asHll> + <asAsm>1</asAsm> + <asMacX>1</asMacX> + <asSyms>1</asSyms> + <asFals>1</asFals> + <asDbgD>1</asDbgD> + <asForm>1</asForm> + <ldLst>0</ldLst> + <ldmm>1</ldmm> + <ldXref>1</ldXref> + <BigEnd>0</BigEnd> + <AdsALst>1</AdsALst> + <AdsACrf>1</AdsACrf> + <AdsANop>0</AdsANop> + <AdsANot>0</AdsANot> + <AdsLLst>1</AdsLLst> + <AdsLmap>1</AdsLmap> + <AdsLcgr>1</AdsLcgr> + <AdsLsym>1</AdsLsym> + <AdsLszi>1</AdsLszi> + <AdsLtoi>1</AdsLtoi> + <AdsLsun>1</AdsLsun> + <AdsLven>1</AdsLven> + <AdsLsxf>1</AdsLsxf> + <RvctClst>0</RvctClst> + <GenPPlst>0</GenPPlst> + <AdsCpuType>"Cortex-M0+"</AdsCpuType> + <RvctDeviceName></RvctDeviceName> + <mOS>0</mOS> + <uocRom>0</uocRom> + <uocRam>0</uocRam> + <hadIROM>0</hadIROM> + <hadIRAM>0</hadIRAM> + <hadXRAM>0</hadXRAM> + <uocXRam>0</uocXRam> + <RvdsVP>0</RvdsVP> + <hadIRAM2>0</hadIRAM2> + <hadIROM2>0</hadIROM2> + <StupSel>1</StupSel> + <useUlib>0</useUlib> + <EndSel>1</EndSel> + <uLtcg>0</uLtcg> + <RoSelD>0</RoSelD> + <RwSelD>5</RwSelD> + <CodeSel>0</CodeSel> + <OptFeed>0</OptFeed> + <NoZi1>0</NoZi1> + <NoZi2>0</NoZi2> + <NoZi3>0</NoZi3> + <NoZi4>0</NoZi4> + <NoZi5>0</NoZi5> + <Ro1Chk>1</Ro1Chk> + <Ro2Chk>0</Ro2Chk> + <Ro3Chk>0</Ro3Chk> + <Ir1Chk>0</Ir1Chk> + <Ir2Chk>0</Ir2Chk> + <Ra1Chk>1</Ra1Chk> + <Ra2Chk>0</Ra2Chk> + <Ra3Chk>0</Ra3Chk> + <Im1Chk>0</Im1Chk> + <Im2Chk>0</Im2Chk> + <OnChipMemories> + <Ocm1> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </Ocm1> + <Ocm2> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </Ocm2> + <Ocm3> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </Ocm3> + <Ocm4> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </Ocm4> + <Ocm5> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </Ocm5> + <Ocm6> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </Ocm6> + <IRAM> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </IRAM> + <IROM> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </IROM> + <XRAM> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </XRAM> + <OCR_RVCT1> + <Type>1</Type> + <StartAddress>0x0</StartAddress> + <Size>0x10000</Size> + </OCR_RVCT1> + <OCR_RVCT2> + <Type>1</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </OCR_RVCT2> + <OCR_RVCT3> + <Type>1</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </OCR_RVCT3> + <OCR_RVCT4> + <Type>1</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </OCR_RVCT4> + <OCR_RVCT5> + <Type>1</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </OCR_RVCT5> + <OCR_RVCT6> + <Type>0</Type> + <StartAddress>0x20000000</StartAddress> + <Size>0x10000</Size> + </OCR_RVCT6> + <OCR_RVCT7> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </OCR_RVCT7> + <OCR_RVCT8> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </OCR_RVCT8> + <OCR_RVCT9> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </OCR_RVCT9> + <OCR_RVCT10> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </OCR_RVCT10> + </OnChipMemories> + <RvctStartVector></RvctStartVector> + </ArmAdsMisc> + <Cads> + <interw>1</interw> + <Optim>4</Optim> + <oTime>0</oTime> + <SplitLS>0</SplitLS> + <OneElfS>0</OneElfS> + <Strict>0</Strict> + <EnumInt>0</EnumInt> + <PlainCh>0</PlainCh> + <Ropi>0</Ropi> + <Rwpi>0</Rwpi> + <wLevel>0</wLevel> + <uThumb>0</uThumb> + <VariousControls> + <MiscControls></MiscControls> + <Define>CORTEX_M0PLUS</Define> + <Undefine></Undefine> + <IncludePath>..\..\..\..\software\cmsis\CMSIS\Include; ..\..\..\..\software\cmsis\Device\ARM\CMSDK_CM0plus\Include; ..\..\..\..\software\common\retarget</IncludePath> + </VariousControls> + </Cads> + <Aads> + <interw>1</interw> + <Ropi>0</Ropi> + <Rwpi>0</Rwpi> + <thumb>0</thumb> + <SplitLS>0</SplitLS> + <SwStkChk>0</SwStkChk> + <NoWarn>0</NoWarn> + <VariousControls> + <MiscControls></MiscControls> + <Define></Define> + <Undefine></Undefine> + <IncludePath></IncludePath> + </VariousControls> + </Aads> + <LDads> + <umfTarg>1</umfTarg> + <Ropi>0</Ropi> + <Rwpi>0</Rwpi> + <noStLib>0</noStLib> + <RepFail>1</RepFail> + <useFile>0</useFile> + <TextAddressRange>0x00000000</TextAddressRange> + <DataAddressRange>0x00000000</DataAddressRange> + <ScatterFile></ScatterFile> + <IncludeLibs></IncludeLibs> + <IncludeLibsPath></IncludeLibsPath> + <Misc></Misc> + <LinkerInputFile></LinkerInputFile> + <DisabledWarnings></DisabledWarnings> + </LDads> + </TargetArmAds> + </TargetOption> + <Groups> + <Group> + <GroupName>Startup</GroupName> + <Files> + <File> + <FileName>startup_CMSDK_CM0plus.s</FileName> + <FileType>2</FileType> + <FilePath>..\..\..\..\software\cmsis\Device\ARM\CMSDK_CM0plus\Source\ARM\startup_CMSDK_CM0plus.s</FilePath> + </File> + </Files> + </Group> + <Group> + <GroupName>Application</GroupName> + <Files> + <File> + <FileName>uart_stdout.c</FileName> + <FileType>1</FileType> + <FilePath>..\..\..\..\software\common\retarget\uart_stdout.c</FilePath> + </File> + <File> + <FileName>retarget.c</FileName> + <FileType>1</FileType> + <FilePath>..\..\..\..\software\common\retarget\retarget.c</FilePath> + </File> + <File> + <FileName>gpio_tests.c</FileName> + <FileType>1</FileType> + <FilePath>..\..\..\..\software\common\validation\gpio_tests.c</FilePath> + </File> + </Files> + </Group> + <Group> + <GroupName>System</GroupName> + <Files> + <File> + <FileName>system_CMSDK_CM0plus.c</FileName> + <FileType>1</FileType> + <FilePath>..\..\..\..\software\cmsis\Device\ARM\CMSDK_CM0plus\Source\system_CMSDK_CM0plus.c</FilePath> + </File> + </Files> + </Group> + </Groups> + </Target> + </Targets> + +</Project> diff --git a/Cortex-M0/nanosoc/systems/mcu/testcodes/gpio_tests/makefile b/Cortex-M0/nanosoc/systems/mcu/testcodes/gpio_tests/makefile new file mode 100644 index 0000000..74e83c0 --- /dev/null +++ b/Cortex-M0/nanosoc/systems/mcu/testcodes/gpio_tests/makefile @@ -0,0 +1,253 @@ +#----------------------------------------------------------------------------- +# The confidential and proprietary information contained in this file may +# only be used by a person authorised under and to the extent permitted +# by a subsisting licensing agreement from Arm Limited or its affiliates. +# +# (C) COPYRIGHT 2010-2013 Arm Limited or its affiliates. +# ALL RIGHTS RESERVED +# +# This entire notice must be reproduced on all copies of this file +# and copies of this file may only be made by a person if such person is +# permitted to do so under the terms of a subsisting license agreement +# from Arm Limited or its affiliates. +# +# SVN Information +# +# Checked In : $Date: 2011-01-25 10:05:56 +0000 (Tue, 25 Jan 2011) $ +# +# Revision : $Revision: 159421 $ +# +# Release Information : Cortex-M System Design Kit-r1p1-00rel0 +#----------------------------------------------------------------------------- +# +# Cortex-M System Design Kit software compilation make file +# +#----------------------------------------------------------------------------- +# +# Configurations +# +# Choose the core instantiated, can be +# - CORTEX_M0 +# - CORTEX_M0PLUS +CPU_PRODUCT = CORTEX_M0PLUS + +# Shared software directory +SOFTWARE_DIR = ../../../../software +CMSIS_DIR = $(SOFTWARE_DIR)/cmsis +CORE_DIR = $(CMSIS_DIR)/CMSIS/Include + +ifeq ($(CPU_PRODUCT),CORTEX_M0PLUS) + DEVICE_DIR = $(CMSIS_DIR)/Device/ARM/CMSDK_CM0plus +else + DEVICE_DIR = $(CMSIS_DIR)/Device/ARM/CMSDK_CM0 +endif + +# Program file +TESTNAME = gpio_tests + +# Endian Option +COMPILE_BIGEND = 0 + +# Configuration +ifeq ($(CPU_PRODUCT),CORTEX_M0PLUS) + USER_DEFINE = -DCORTEX_M0PLUS +else + USER_DEFINE = -DCORTEX_M0 +endif + + +DEPS_LIST = makefile + +# Tool chain : ds5 / gcc / keil +TOOL_CHAIN = ds5 + +ifeq ($(TOOL_CHAIN),ds5) + ifeq ($(CPU_PRODUCT),CORTEX_M0PLUS) + CPU_TYPE = --cpu Cortex-M0plus + else + CPU_TYPE = --cpu Cortex-M0 + endif +endif + +ifeq ($(TOOL_CHAIN),gcc) + ifeq ($(CPU_PRODUCT),CORTEX_M0PLUS) + CPU_TYPE = -mcpu=cortex-m0plus + else + CPU_TYPE = -mcpu=cortex-m0 + endif +endif + +# Startup code directory for DS-5 +ifeq ($(TOOL_CHAIN),ds5) + STARTUP_DIR = $(DEVICE_DIR)/Source/ARM +endif + +# Startup code directory for gcc +ifeq ($(TOOL_CHAIN),gcc) + STARTUP_DIR = $(DEVICE_DIR)/Source/GCC +endif + +ifeq ($(CPU_PRODUCT),CORTEX_M0PLUS) + STARTUP_FILE = startup_CMSDK_CM0plus + SYSTEM_FILE = system_CMSDK_CM0plus +else + STARTUP_FILE = startup_CMSDK_CM0 + SYSTEM_FILE = system_CMSDK_CM0 +endif + +# --------------------------------------------------------------------------------------- +# DS-5 options + +# MicroLIB option +COMPILE_MICROLIB = 0 + +# Small Multiply (Cortex-M0/M0+ has small multiplier option) +COMPILE_SMALLMUL = 0 + +ARM_CC_OPTIONS = -c -O3 -g -Otime $(USER_DEFINE) \ + -I $(DEVICE_DIR)/Include -I $(CORE_DIR) -I $(SOFTWARE_DIR)/common/retarget +ARM_ASM_OPTIONS = -g +ARM_LINK_OPTIONS = "--keep=$(STARTUP_FILE).o(RESET)" "--first=$(STARTUP_FILE).o(RESET)" \ + --rw_base 0x30000000 --ro_base 0x00000000 --map + +ifeq ($(COMPILE_BIGEND),1) + # Big Endian + ARM_CC_OPTIONS += --bigend + ARM_ASM_OPTIONS += --bigend + ARM_LINK_OPTIONS += --be8 +endif + +ifeq ($(COMPILE_MICROLIB),1) + # MicroLIB + ARM_CC_OPTIONS += --library_type=microlib + ARM_ASM_OPTIONS += --library_type=microlib --pd "__MICROLIB SETA 1" + ARM_LINK_OPTIONS += --library_type=microlib +endif + +ifeq ($(COMPILE_SMALLMUL),1) + # In Cortex-M0, small multiply takes 32 cycles + ARM_CC_OPTIONS += --multiply_latency=32 +endif + +# --------------------------------------------------------------------------------------- +# gcc options + +GNG_CC = arm-none-eabi-gcc +GNU_OBJDUMP = arm-none-eabi-objdump +GNU_OBJCOPY = arm-none-eabi-objcopy + +LINKER_SCRIPT_PATH = $(SOFTWARE_DIR)/common/scripts +LINKER_SCRIPT = $(LINKER_SCRIPT_PATH)/cmsdk_cm0.ld + +GNU_CC_FLAGS = -g -O3 -mthumb $(CPU_TYPE) + +ifeq ($(COMPILE_BIGEND),1) + # Big Endian + GNU_CC_FLAGS += -mbig-endian +endif + +# --------------------------------------------------------------------------------------- +all: all_$(TOOL_CHAIN) + +# --------------------------------------------------------------------------------------- +# DS-5 + +all_ds5 : $(TESTNAME).hex $(TESTNAME).lst + +$(TESTNAME).o : $(SOFTWARE_DIR)/common/validation/$(TESTNAME).c $(DEPS_LIST) + armcc $(ARM_CC_OPTIONS) $(CPU_TYPE) $< -o $@ + +$(SYSTEM_FILE).o : $(DEVICE_DIR)/Source/$(SYSTEM_FILE).c $(DEPS_LIST) + armcc $(ARM_CC_OPTIONS) $(CPU_TYPE) $< -o $@ + +retarget.o : $(SOFTWARE_DIR)/common/retarget/retarget.c $(DEPS_LIST) + armcc $(ARM_CC_OPTIONS) $(CPU_TYPE) $< -o $@ + +uart_stdout.o : $(SOFTWARE_DIR)/common/retarget/uart_stdout.c $(DEPS_LIST) + armcc $(ARM_CC_OPTIONS) $(CPU_TYPE) $< -o $@ + +$(STARTUP_FILE).o : $(STARTUP_DIR)/$(STARTUP_FILE).s $(DEPS_LIST) + armasm $(ARM_ASM_OPTIONS) $(CPU_TYPE) $< -o $@ + +$(TESTNAME).ELF : $(TESTNAME).o $(SYSTEM_FILE).o $(STARTUP_FILE).o retarget.o uart_stdout.o + armlink $(ARM_LINK_OPTIONS) -o $@ $(TESTNAME).o $(SYSTEM_FILE).o $(STARTUP_FILE).o retarget.o uart_stdout.o + +$(TESTNAME).hex : $(TESTNAME).ELF + fromelf --vhx --8x1 $< --output $@ + +$(TESTNAME).lst : $(TESTNAME).ELF makefile + fromelf -c -d -e -s $< --output $@ + +# --------------------------------------------------------------------------------------- +# gcc +all_gcc: + $(GNG_CC) $(GNU_CC_FLAGS) $(STARTUP_DIR)/$(STARTUP_FILE).s \ + $(SOFTWARE_DIR)/common/validation/$(TESTNAME).c \ + $(SOFTWARE_DIR)/common/retarget/retarget.c \ + $(SOFTWARE_DIR)/common/retarget/uart_stdout.c \ + $(DEVICE_DIR)/Source/$(SYSTEM_FILE).c \ + -I $(DEVICE_DIR)/Include -I $(CORE_DIR) \ + -I $(SOFTWARE_DIR)/common/retarget \ + -L $(LINKER_SCRIPT_PATH) \ + -D__STACK_SIZE=0x200 \ + -D__HEAP_SIZE=0x1000 \ + $(USER_DEFINE) -T $(LINKER_SCRIPT) -o $(TESTNAME).o + # Generate disassembly code + $(GNU_OBJDUMP) -S $(TESTNAME).o > $(TESTNAME).lst + # Generate binary file + $(GNU_OBJCOPY) -S $(TESTNAME).o -O binary $(TESTNAME).bin + # Generate hex file + $(GNU_OBJCOPY) -S $(TESTNAME).o -O verilog $(TESTNAME).hex + +# Note: +# If the version of object copy you are using does not support verilog hex file output, +# you can generate the hex file from binary file using the following command +# od -v -A n -t x1 --width=1 $(TESTNAME).bin > $(TESTNAME).hex + + +# --------------------------------------------------------------------------------------- +# Keil MDK + +all_keil: + @echo "Please compile your project code and press ENTER when ready" + @read dummy + + +# --------------------------------------------------------------------------------------- +# Binary + +all_bin: $(TESTNAME).bin + # Generate hex file from binary + od -v -A n -t x1 --width=1 $(TESTNAME).bin > $(TESTNAME).hex + +# --------------------------------------------------------------------------------------- +# Clean + +clean : + @rm -rf *.o + @if [ -e $(TESTNAME).hex ] ; then \ + rm -rf $(TESTNAME).hex ; \ + fi + @if [ -e $(TESTNAME).lst ] ; then \ + rm -rf $(TESTNAME).lst ; \ + fi + @if [ -e $(TESTNAME).ELF ] ; then \ + rm -rf $(TESTNAME).ELF ; \ + fi + @if [ -e $(TESTNAME).bin ] ; then \ + rm -rf $(TESTNAME).bin ; \ + fi + @rm -rf *.crf + @rm -rf *.plg + @rm -rf *.tra + @rm -rf *.htm + @rm -rf *.map + @rm -rf *.dep + @rm -rf *.d + @rm -rf *.lnp + @rm -rf *.bak + @rm -rf *.lst + @rm -rf *.axf + @rm -rf *.sct + @rm -rf *.__i + @rm -rf *._ia diff --git a/Cortex-M0/nanosoc/systems/mcu/testcodes/hello/.project b/Cortex-M0/nanosoc/systems/mcu/testcodes/hello/.project new file mode 100644 index 0000000..b4807ed --- /dev/null +++ b/Cortex-M0/nanosoc/systems/mcu/testcodes/hello/.project @@ -0,0 +1,11 @@ +<?xml version="1.0" encoding="UTF-8"?> +<projectDescription> + <name>hello</name> + <comment></comment> + <projects> + </projects> + <buildSpec> + </buildSpec> + <natures> + </natures> +</projectDescription> diff --git a/Cortex-M0/nanosoc/systems/mcu/testcodes/hello/hello.c b/Cortex-M0/nanosoc/systems/mcu/testcodes/hello/hello.c new file mode 100644 index 0000000..ab9d771 --- /dev/null +++ b/Cortex-M0/nanosoc/systems/mcu/testcodes/hello/hello.c @@ -0,0 +1,52 @@ +/* + *----------------------------------------------------------------------------- + * The confidential and proprietary information contained in this file may + * only be used by a person authorised under and to the extent permitted + * by a subsisting licensing agreement from Arm Limited or its affiliates. + * + * (C) COPYRIGHT 2010-2013 Arm Limited or its affiliates. + * ALL RIGHTS RESERVED + * + * This entire notice must be reproduced on all copies of this file + * and copies of this file may only be made by a person if such person is + * permitted to do so under the terms of a subsisting license agreement + * from Arm Limited or its affiliates. + * + * SVN Information + * + * Checked In : $Date: 2017-10-10 15:55:38 +0100 (Tue, 10 Oct 2017) $ + * + * Revision : $Revision: 371321 $ + * + * Release Information : Cortex-M System Design Kit-r1p1-00rel0 + *----------------------------------------------------------------------------- + */ + +#ifdef CORTEX_M0 +#include "CMSDK_CM0.h" +#include "core_cm0.h" +#endif + +#ifdef CORTEX_M0PLUS +#include "CMSDK_CM0plus.h" +#include "core_cm0plus.h" +#endif + +#include <stdio.h> +#include "uart_stdout.h" + +int main (void) +{ + // UART init + UartStdOutInit(); + + printf("Hello world\n"); + + printf("** TEST PASSED **\n"); + + // End simulation + UartEndSimulation(); + + return 0; +} + diff --git a/Cortex-M0/nanosoc/systems/mcu/testcodes/hello/hello_cm0.uvopt b/Cortex-M0/nanosoc/systems/mcu/testcodes/hello/hello_cm0.uvopt new file mode 100644 index 0000000..5145b64 --- /dev/null +++ b/Cortex-M0/nanosoc/systems/mcu/testcodes/hello/hello_cm0.uvopt @@ -0,0 +1,261 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no" ?> +<ProjectOpt xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="project_opt.xsd"> + + <SchemaVersion>1.0</SchemaVersion> + + <Header>### uVision Project, (C) Keil Software</Header> + + <Extensions> + <cExt>*.c</cExt> + <aExt>*.s*; *.src; *.a*</aExt> + <oExt>*.obj</oExt> + <lExt>*.lib</lExt> + <tExt>*.txt; *.h; *.inc</tExt> + <pExt>*.plm</pExt> + <CppX>*.cpp</CppX> + </Extensions> + + <DaveTm> + <dwLowDateTime>0</dwLowDateTime> + <dwHighDateTime>0</dwHighDateTime> + </DaveTm> + + <Target> + <TargetName>Debug</TargetName> + <ToolsetNumber>0x4</ToolsetNumber> + <ToolsetName>ARM-ADS</ToolsetName> + <TargetOption> + <CLKADS>50000000</CLKADS> + <OPTTT> + <gFlags>1</gFlags> + <BeepAtEnd>1</BeepAtEnd> + <RunSim>1</RunSim> + <RunTarget>0</RunTarget> + </OPTTT> + <OPTHX> + <HexSelection>1</HexSelection> + <FlashByte>65535</FlashByte> + <HexRangeLowAddress>0</HexRangeLowAddress> + <HexRangeHighAddress>0</HexRangeHighAddress> + <HexOffset>0</HexOffset> + </OPTHX> + <OPTLEX> + <PageWidth>79</PageWidth> + <PageLength>66</PageLength> + <TabStop>8</TabStop> + <ListingPath>.\</ListingPath> + </OPTLEX> + <ListingPage> + <CreateCListing>1</CreateCListing> + <CreateAListing>1</CreateAListing> + <CreateLListing>1</CreateLListing> + <CreateIListing>0</CreateIListing> + <AsmCond>1</AsmCond> + <AsmSymb>1</AsmSymb> + <AsmXref>0</AsmXref> + <CCond>1</CCond> + <CCode>0</CCode> + <CListInc>0</CListInc> + <CSymb>0</CSymb> + <LinkerCodeListing>0</LinkerCodeListing> + </ListingPage> + <OPTXL> + <LMap>1</LMap> + <LComments>1</LComments> + <LGenerateSymbols>1</LGenerateSymbols> + <LLibSym>1</LLibSym> + <LLines>1</LLines> + <LLocSym>1</LLocSym> + <LPubSym>1</LPubSym> + <LXref>0</LXref> + <LExpSel>0</LExpSel> + </OPTXL> + <OPTFL> + <tvExp>1</tvExp> + <tvExpOptDlg>0</tvExpOptDlg> + <IsCurrentTarget>1</IsCurrentTarget> + </OPTFL> + <CpuCode>255</CpuCode> + <DllOpt> + <SimDllName>SARMCM3.DLL</SimDllName> + <SimDllArguments></SimDllArguments> + <SimDlgDllName>DARMCM1.DLL</SimDlgDllName> + <SimDlgDllArguments></SimDlgDllArguments> + <TargetDllName>SARMCM3.DLL</TargetDllName> + <TargetDllArguments></TargetDllArguments> + <TargetDlgDllName>TARMCM1.DLL</TargetDlgDllName> + <TargetDlgDllArguments></TargetDlgDllArguments> + </DllOpt> + <DebugOpt> + <uSim>1</uSim> + <uTrg>0</uTrg> + <sLdApp>1</sLdApp> + <sGomain>1</sGomain> + <sRbreak>1</sRbreak> + <sRwatch>1</sRwatch> + <sRmem>1</sRmem> + <sRfunc>1</sRfunc> + <sRbox>1</sRbox> + <tLdApp>1</tLdApp> + <tGomain>0</tGomain> + <tRbreak>1</tRbreak> + <tRwatch>1</tRwatch> + <tRmem>1</tRmem> + <tRfunc>0</tRfunc> + <tRbox>1</tRbox> + <tRtrace>0</tRtrace> + <sRunDeb>0</sRunDeb> + <sLrtime>0</sLrtime> + <nTsel>-1</nTsel> + <sDll></sDll> + <sDllPa></sDllPa> + <sDlgDll></sDlgDll> + <sDlgPa></sDlgPa> + <sIfile></sIfile> + <tDll></tDll> + <tDllPa></tDllPa> + <tDlgDll></tDlgDll> + <tDlgPa></tDlgPa> + <tIfile></tIfile> + <pMon></pMon> + </DebugOpt> + <Breakpoint/> + <DebugFlag> + <trace>0</trace> + <periodic>1</periodic> + <aLwin>0</aLwin> + <aCover>0</aCover> + <aSer1>0</aSer1> + <aSer2>0</aSer2> + <aPa>0</aPa> + <viewmode>0</viewmode> + <vrSel>0</vrSel> + <aSym>0</aSym> + <aTbox>0</aTbox> + <AscS1>0</AscS1> + <AscS2>0</AscS2> + <AscS3>0</AscS3> + <aSer3>0</aSer3> + <eProf>0</eProf> + <aLa>0</aLa> + <aPa1>0</aPa1> + <AscS4>0</AscS4> + <aSer4>0</aSer4> + <StkLoc>0</StkLoc> + <TrcWin>0</TrcWin> + <newCpu>0</newCpu> + <uProt>0</uProt> + </DebugFlag> + <Tracepoint> + <THDelay>0</THDelay> + </Tracepoint> + <LintExecutable></LintExecutable> + <LintConfigFile></LintConfigFile> + </TargetOption> + </Target> + + <Group> + <GroupName>Startup</GroupName> + <tvExp>1</tvExp> + <tvExpOptDlg>0</tvExpOptDlg> + <cbSel>0</cbSel> + <RteFlg>0</RteFlg> + <File> + <GroupNumber>1</GroupNumber> + <FileNumber>1</FileNumber> + <FileType>2</FileType> + <tvExp>0</tvExp> + <Focus>0</Focus> + <ColumnNumber>0</ColumnNumber> + <tvExpOptDlg>0</tvExpOptDlg> + <TopLine>0</TopLine> + <CurrentLine>0</CurrentLine> + <bDave2>0</bDave2> + <PathWithFileName>..\..\..\..\software\cmsis\Device\ARM\CMSDK_CM0\Source\ARM\startup_CMSDK_CM0.s</PathWithFileName> + <FilenameWithoutPath>startup_CMSDK_CM0.s</FilenameWithoutPath> + <RteFlg>0</RteFlg> + <bShared>0</bShared> + </File> + </Group> + + <Group> + <GroupName>Application</GroupName> + <tvExp>1</tvExp> + <tvExpOptDlg>0</tvExpOptDlg> + <cbSel>0</cbSel> + <RteFlg>0</RteFlg> + <File> + <GroupNumber>2</GroupNumber> + <FileNumber>2</FileNumber> + <FileType>1</FileType> + <tvExp>0</tvExp> + <Focus>0</Focus> + <ColumnNumber>0</ColumnNumber> + <tvExpOptDlg>0</tvExpOptDlg> + <TopLine>0</TopLine> + <CurrentLine>0</CurrentLine> + <bDave2>0</bDave2> + <PathWithFileName>.\hello.c</PathWithFileName> + <FilenameWithoutPath>hello.c</FilenameWithoutPath> + <RteFlg>0</RteFlg> + <bShared>0</bShared> + </File> + <File> + <GroupNumber>2</GroupNumber> + <FileNumber>3</FileNumber> + <FileType>1</FileType> + <tvExp>0</tvExp> + <Focus>0</Focus> + <ColumnNumber>0</ColumnNumber> + <tvExpOptDlg>0</tvExpOptDlg> + <TopLine>0</TopLine> + <CurrentLine>0</CurrentLine> + <bDave2>0</bDave2> + <PathWithFileName>..\..\..\..\software\common\retarget\retarget.c</PathWithFileName> + <FilenameWithoutPath>retarget.c</FilenameWithoutPath> + <RteFlg>0</RteFlg> + <bShared>0</bShared> + </File> + <File> + <GroupNumber>2</GroupNumber> + <FileNumber>4</FileNumber> + <FileType>1</FileType> + <tvExp>0</tvExp> + <Focus>0</Focus> + <ColumnNumber>0</ColumnNumber> + <tvExpOptDlg>0</tvExpOptDlg> + <TopLine>0</TopLine> + <CurrentLine>0</CurrentLine> + <bDave2>0</bDave2> + <PathWithFileName>..\..\..\..\software\common\retarget\uart_stdout.c</PathWithFileName> + <FilenameWithoutPath>uart_stdout.c</FilenameWithoutPath> + <RteFlg>0</RteFlg> + <bShared>0</bShared> + </File> + </Group> + + <Group> + <GroupName>System</GroupName> + <tvExp>1</tvExp> + <tvExpOptDlg>0</tvExpOptDlg> + <cbSel>0</cbSel> + <RteFlg>0</RteFlg> + <File> + <GroupNumber>3</GroupNumber> + <FileNumber>5</FileNumber> + <FileType>1</FileType> + <tvExp>0</tvExp> + <Focus>0</Focus> + <ColumnNumber>0</ColumnNumber> + <tvExpOptDlg>0</tvExpOptDlg> + <TopLine>0</TopLine> + <CurrentLine>0</CurrentLine> + <bDave2>0</bDave2> + <PathWithFileName>..\..\..\..\software\cmsis\Device\ARM\CMSDK_CM0\Source\system_CMSDK_CM0.c</PathWithFileName> + <FilenameWithoutPath>system_CMSDK_CM0.c</FilenameWithoutPath> + <RteFlg>0</RteFlg> + <bShared>0</bShared> + </File> + </Group> + +</ProjectOpt> diff --git a/Cortex-M0/nanosoc/systems/mcu/testcodes/hello/hello_cm0.uvproj b/Cortex-M0/nanosoc/systems/mcu/testcodes/hello/hello_cm0.uvproj new file mode 100644 index 0000000..6baba57 --- /dev/null +++ b/Cortex-M0/nanosoc/systems/mcu/testcodes/hello/hello_cm0.uvproj @@ -0,0 +1,435 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no" ?> +<Project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="project_proj.xsd"> + + <SchemaVersion>1.1</SchemaVersion> + + <Header>### uVision Project, (C) Keil Software</Header> + + <Targets> + <Target> + <TargetName>Debug</TargetName> + <ToolsetNumber>0x4</ToolsetNumber> + <ToolsetName>ARM-ADS</ToolsetName> + <TargetOption> + <TargetCommonOption> + <Device>Cortex-M0</Device> + <Vendor>ARM</Vendor> + <Cpu>CLOCK(12000000) CPUTYPE("Cortex-M0") ESEL ELITTLE</Cpu> + <FlashUtilSpec></FlashUtilSpec> + <StartupFile></StartupFile> + <FlashDriverDll></FlashDriverDll> + <DeviceId>4803</DeviceId> + <RegisterFile></RegisterFile> + <MemoryEnv></MemoryEnv> + <Cmp></Cmp> + <Asm></Asm> + <Linker></Linker> + <OHString></OHString> + <InfinionOptionDll></InfinionOptionDll> + <SLE66CMisc></SLE66CMisc> + <SLE66AMisc></SLE66AMisc> + <SLE66LinkerMisc></SLE66LinkerMisc> + <SFDFile></SFDFile> + <UseEnv>0</UseEnv> + <BinPath></BinPath> + <IncludePath></IncludePath> + <LibPath></LibPath> + <RegisterFilePath></RegisterFilePath> + <DBRegisterFilePath></DBRegisterFilePath> + <TargetStatus> + <Error>0</Error> + <ExitCodeStop>0</ExitCodeStop> + <ButtonStop>0</ButtonStop> + <NotGenerated>0</NotGenerated> + <InvalidFlash>1</InvalidFlash> + </TargetStatus> + <OutputDirectory>.\</OutputDirectory> + <OutputName>hello</OutputName> + <CreateExecutable>1</CreateExecutable> + <CreateLib>0</CreateLib> + <CreateHexFile>0</CreateHexFile> + <DebugInformation>1</DebugInformation> + <BrowseInformation>1</BrowseInformation> + <ListingPath>.\</ListingPath> + <HexFormatSelection>1</HexFormatSelection> + <Merge32K>0</Merge32K> + <CreateBatchFile>0</CreateBatchFile> + <BeforeCompile> + <RunUserProg1>0</RunUserProg1> + <RunUserProg2>0</RunUserProg2> + <UserProg1Name></UserProg1Name> + <UserProg2Name></UserProg2Name> + <UserProg1Dos16Mode>0</UserProg1Dos16Mode> + <UserProg2Dos16Mode>0</UserProg2Dos16Mode> + <nStopU1X>0</nStopU1X> + <nStopU2X>0</nStopU2X> + </BeforeCompile> + <BeforeMake> + <RunUserProg1>0</RunUserProg1> + <RunUserProg2>0</RunUserProg2> + <UserProg1Name></UserProg1Name> + <UserProg2Name></UserProg2Name> + <UserProg1Dos16Mode>0</UserProg1Dos16Mode> + <UserProg2Dos16Mode>0</UserProg2Dos16Mode> + </BeforeMake> + <AfterMake> + <RunUserProg1>1</RunUserProg1> + <RunUserProg2>0</RunUserProg2> + <UserProg1Name>$K\ARM\ARMCC\BIN\fromelf.exe #L --vhx --8x1 --output hello.hex</UserProg1Name> + <UserProg2Name></UserProg2Name> + <UserProg1Dos16Mode>0</UserProg1Dos16Mode> + <UserProg2Dos16Mode>0</UserProg2Dos16Mode> + </AfterMake> + <SelectedForBatchBuild>0</SelectedForBatchBuild> + <SVCSIdString></SVCSIdString> + </TargetCommonOption> + <CommonProperty> + <UseCPPCompiler>0</UseCPPCompiler> + <RVCTCodeConst>0</RVCTCodeConst> + <RVCTZI>0</RVCTZI> + <RVCTOtherData>0</RVCTOtherData> + <ModuleSelection>0</ModuleSelection> + <IncludeInBuild>1</IncludeInBuild> + <AlwaysBuild>0</AlwaysBuild> + <GenerateAssemblyFile>0</GenerateAssemblyFile> + <AssembleAssemblyFile>0</AssembleAssemblyFile> + <PublicsOnly>0</PublicsOnly> + <StopOnExitCode>3</StopOnExitCode> + <CustomArgument></CustomArgument> + <IncludeLibraryModules></IncludeLibraryModules> + </CommonProperty> + <DllOption> + <SimDllName>SARMCM3.DLL</SimDllName> + <SimDllArguments></SimDllArguments> + <SimDlgDll>DARMCM1.DLL</SimDlgDll> + <SimDlgDllArguments></SimDlgDllArguments> + <TargetDllName>SARMCM3.DLL</TargetDllName> + <TargetDllArguments></TargetDllArguments> + <TargetDlgDll>TARMCM1.DLL</TargetDlgDll> + <TargetDlgDllArguments></TargetDlgDllArguments> + </DllOption> + <DebugOption> + <OPTHX> + <HexSelection>1</HexSelection> + <HexRangeLowAddress>0</HexRangeLowAddress> + <HexRangeHighAddress>0</HexRangeHighAddress> + <HexOffset>0</HexOffset> + <Oh166RecLen>16</Oh166RecLen> + </OPTHX> + <Simulator> + <UseSimulator>1</UseSimulator> + <LoadApplicationAtStartup>1</LoadApplicationAtStartup> + <RunToMain>1</RunToMain> + <RestoreBreakpoints>1</RestoreBreakpoints> + <RestoreWatchpoints>1</RestoreWatchpoints> + <RestoreMemoryDisplay>1</RestoreMemoryDisplay> + <RestoreFunctions>1</RestoreFunctions> + <RestoreToolbox>1</RestoreToolbox> + <LimitSpeedToRealTime>0</LimitSpeedToRealTime> + </Simulator> + <Target> + <UseTarget>0</UseTarget> + <LoadApplicationAtStartup>1</LoadApplicationAtStartup> + <RunToMain>0</RunToMain> + <RestoreBreakpoints>1</RestoreBreakpoints> + <RestoreWatchpoints>1</RestoreWatchpoints> + <RestoreMemoryDisplay>1</RestoreMemoryDisplay> + <RestoreFunctions>0</RestoreFunctions> + <RestoreToolbox>1</RestoreToolbox> + <RestoreTracepoints>0</RestoreTracepoints> + </Target> + <RunDebugAfterBuild>0</RunDebugAfterBuild> + <TargetSelection>-1</TargetSelection> + <SimDlls> + <CpuDll></CpuDll> + <CpuDllArguments></CpuDllArguments> + <PeripheralDll></PeripheralDll> + <PeripheralDllArguments></PeripheralDllArguments> + <InitializationFile></InitializationFile> + </SimDlls> + <TargetDlls> + <CpuDll></CpuDll> + <CpuDllArguments></CpuDllArguments> + <PeripheralDll></PeripheralDll> + <PeripheralDllArguments></PeripheralDllArguments> + <InitializationFile></InitializationFile> + <Driver></Driver> + </TargetDlls> + </DebugOption> + <Utilities> + <Flash1> + <UseTargetDll>1</UseTargetDll> + <UseExternalTool>0</UseExternalTool> + <RunIndependent>0</RunIndependent> + <UpdateFlashBeforeDebugging>0</UpdateFlashBeforeDebugging> + <Capability>0</Capability> + <DriverSelection>-1</DriverSelection> + </Flash1> + <Flash2></Flash2> + <Flash3>"" ()</Flash3> + <Flash4></Flash4> + </Utilities> + <TargetArmAds> + <ArmAdsMisc> + <GenerateListings>0</GenerateListings> + <asHll>1</asHll> + <asAsm>1</asAsm> + <asMacX>1</asMacX> + <asSyms>1</asSyms> + <asFals>1</asFals> + <asDbgD>1</asDbgD> + <asForm>1</asForm> + <ldLst>0</ldLst> + <ldmm>1</ldmm> + <ldXref>1</ldXref> + <BigEnd>0</BigEnd> + <AdsALst>1</AdsALst> + <AdsACrf>1</AdsACrf> + <AdsANop>0</AdsANop> + <AdsANot>0</AdsANot> + <AdsLLst>1</AdsLLst> + <AdsLmap>1</AdsLmap> + <AdsLcgr>1</AdsLcgr> + <AdsLsym>1</AdsLsym> + <AdsLszi>1</AdsLszi> + <AdsLtoi>1</AdsLtoi> + <AdsLsun>1</AdsLsun> + <AdsLven>1</AdsLven> + <AdsLsxf>1</AdsLsxf> + <RvctClst>0</RvctClst> + <GenPPlst>0</GenPPlst> + <AdsCpuType>"Cortex-M0"</AdsCpuType> + <RvctDeviceName></RvctDeviceName> + <mOS>0</mOS> + <uocRom>0</uocRom> + <uocRam>0</uocRam> + <hadIROM>0</hadIROM> + <hadIRAM>0</hadIRAM> + <hadXRAM>0</hadXRAM> + <uocXRam>0</uocXRam> + <RvdsVP>0</RvdsVP> + <hadIRAM2>0</hadIRAM2> + <hadIROM2>0</hadIROM2> + <StupSel>1</StupSel> + <useUlib>0</useUlib> + <EndSel>1</EndSel> + <uLtcg>0</uLtcg> + <RoSelD>0</RoSelD> + <RwSelD>5</RwSelD> + <CodeSel>0</CodeSel> + <OptFeed>0</OptFeed> + <NoZi1>0</NoZi1> + <NoZi2>0</NoZi2> + <NoZi3>0</NoZi3> + <NoZi4>0</NoZi4> + <NoZi5>0</NoZi5> + <Ro1Chk>1</Ro1Chk> + <Ro2Chk>0</Ro2Chk> + <Ro3Chk>0</Ro3Chk> + <Ir1Chk>0</Ir1Chk> + <Ir2Chk>0</Ir2Chk> + <Ra1Chk>1</Ra1Chk> + <Ra2Chk>0</Ra2Chk> + <Ra3Chk>0</Ra3Chk> + <Im1Chk>0</Im1Chk> + <Im2Chk>0</Im2Chk> + <OnChipMemories> + <Ocm1> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </Ocm1> + <Ocm2> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </Ocm2> + <Ocm3> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </Ocm3> + <Ocm4> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </Ocm4> + <Ocm5> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </Ocm5> + <Ocm6> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </Ocm6> + <IRAM> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </IRAM> + <IROM> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </IROM> + <XRAM> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </XRAM> + <OCR_RVCT1> + <Type>1</Type> + <StartAddress>0x0</StartAddress> + <Size>0x10000</Size> + </OCR_RVCT1> + <OCR_RVCT2> + <Type>1</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </OCR_RVCT2> + <OCR_RVCT3> + <Type>1</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </OCR_RVCT3> + <OCR_RVCT4> + <Type>1</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </OCR_RVCT4> + <OCR_RVCT5> + <Type>1</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </OCR_RVCT5> + <OCR_RVCT6> + <Type>0</Type> + <StartAddress>0x20000000</StartAddress> + <Size>0x10000</Size> + </OCR_RVCT6> + <OCR_RVCT7> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </OCR_RVCT7> + <OCR_RVCT8> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </OCR_RVCT8> + <OCR_RVCT9> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </OCR_RVCT9> + <OCR_RVCT10> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </OCR_RVCT10> + </OnChipMemories> + <RvctStartVector></RvctStartVector> + </ArmAdsMisc> + <Cads> + <interw>1</interw> + <Optim>4</Optim> + <oTime>0</oTime> + <SplitLS>0</SplitLS> + <OneElfS>0</OneElfS> + <Strict>0</Strict> + <EnumInt>0</EnumInt> + <PlainCh>0</PlainCh> + <Ropi>0</Ropi> + <Rwpi>0</Rwpi> + <wLevel>0</wLevel> + <uThumb>0</uThumb> + <uSurpInc>0</uSurpInc> + <VariousControls> + <MiscControls></MiscControls> + <Define>CORTEX_M0</Define> + <Undefine></Undefine> + <IncludePath>..\..\..\..\software\cmsis\CMSIS\Include; ..\..\..\..\software\cmsis\Device\ARM\CMSDK_CM0\Include; ..\..\..\..\software\common\retarget</IncludePath> + </VariousControls> + </Cads> + <Aads> + <interw>1</interw> + <Ropi>0</Ropi> + <Rwpi>0</Rwpi> + <thumb>0</thumb> + <SplitLS>0</SplitLS> + <SwStkChk>0</SwStkChk> + <NoWarn>0</NoWarn> + <uSurpInc>0</uSurpInc> + <VariousControls> + <MiscControls></MiscControls> + <Define></Define> + <Undefine></Undefine> + <IncludePath></IncludePath> + </VariousControls> + </Aads> + <LDads> + <umfTarg>1</umfTarg> + <Ropi>0</Ropi> + <Rwpi>0</Rwpi> + <noStLib>0</noStLib> + <RepFail>1</RepFail> + <useFile>0</useFile> + <TextAddressRange>0x00000000</TextAddressRange> + <DataAddressRange>0x00000000</DataAddressRange> + <ScatterFile></ScatterFile> + <IncludeLibs></IncludeLibs> + <IncludeLibsPath></IncludeLibsPath> + <Misc></Misc> + <LinkerInputFile></LinkerInputFile> + <DisabledWarnings></DisabledWarnings> + </LDads> + </TargetArmAds> + </TargetOption> + <Groups> + <Group> + <GroupName>Startup</GroupName> + <Files> + <File> + <FileName>startup_CMSDK_CM0.s</FileName> + <FileType>2</FileType> + <FilePath>..\..\..\..\software\cmsis\Device\ARM\CMSDK_CM0\Source\ARM\startup_CMSDK_CM0.s</FilePath> + </File> + </Files> + </Group> + <Group> + <GroupName>Application</GroupName> + <Files> + <File> + <FileName>hello.c</FileName> + <FileType>1</FileType> + <FilePath>.\hello.c</FilePath> + </File> + <File> + <FileName>retarget.c</FileName> + <FileType>1</FileType> + <FilePath>..\..\..\..\software\common\retarget\retarget.c</FilePath> + </File> + <File> + <FileName>uart_stdout.c</FileName> + <FileType>1</FileType> + <FilePath>..\..\..\..\software\common\retarget\uart_stdout.c</FilePath> + </File> + </Files> + </Group> + <Group> + <GroupName>System</GroupName> + <Files> + <File> + <FileName>system_CMSDK_CM0.c</FileName> + <FileType>1</FileType> + <FilePath>..\..\..\..\software\cmsis\Device\ARM\CMSDK_CM0\Source\system_CMSDK_CM0.c</FilePath> + </File> + </Files> + </Group> + </Groups> + </Target> + </Targets> + +</Project> diff --git a/Cortex-M0/nanosoc/systems/mcu/testcodes/hello/hello_cm0p.uvopt b/Cortex-M0/nanosoc/systems/mcu/testcodes/hello/hello_cm0p.uvopt new file mode 100644 index 0000000..c39e058 --- /dev/null +++ b/Cortex-M0/nanosoc/systems/mcu/testcodes/hello/hello_cm0p.uvopt @@ -0,0 +1,244 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no" ?> +<ProjectOpt xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="project_opt.xsd"> + + <SchemaVersion>1.0</SchemaVersion> + + <Header>### uVision Project, (C) Keil Software</Header> + + <Extensions> + <cExt>*.c</cExt> + <aExt>*.s*; *.src; *.a*</aExt> + <oExt>*.obj</oExt> + <lExt>*.lib</lExt> + <tExt>*.txt; *.h; *.inc</tExt> + <pExt>*.plm</pExt> + <CppX>*.cpp</CppX> + </Extensions> + + <DaveTm> + <dwLowDateTime>0</dwLowDateTime> + <dwHighDateTime>0</dwHighDateTime> + </DaveTm> + + <Target> + <TargetName>Debug</TargetName> + <ToolsetNumber>0x4</ToolsetNumber> + <ToolsetName>ARM-ADS</ToolsetName> + <TargetOption> + <CLKADS>50000000</CLKADS> + <OPTTT> + <gFlags>1</gFlags> + <BeepAtEnd>1</BeepAtEnd> + <RunSim>1</RunSim> + <RunTarget>0</RunTarget> + </OPTTT> + <OPTHX> + <HexSelection>1</HexSelection> + <FlashByte>65535</FlashByte> + <HexRangeLowAddress>0</HexRangeLowAddress> + <HexRangeHighAddress>0</HexRangeHighAddress> + <HexOffset>0</HexOffset> + </OPTHX> + <OPTLEX> + <PageWidth>79</PageWidth> + <PageLength>66</PageLength> + <TabStop>8</TabStop> + <ListingPath>.\</ListingPath> + </OPTLEX> + <ListingPage> + <CreateCListing>1</CreateCListing> + <CreateAListing>1</CreateAListing> + <CreateLListing>1</CreateLListing> + <CreateIListing>0</CreateIListing> + <AsmCond>1</AsmCond> + <AsmSymb>1</AsmSymb> + <AsmXref>0</AsmXref> + <CCond>1</CCond> + <CCode>0</CCode> + <CListInc>0</CListInc> + <CSymb>0</CSymb> + <LinkerCodeListing>0</LinkerCodeListing> + </ListingPage> + <OPTXL> + <LMap>1</LMap> + <LComments>1</LComments> + <LGenerateSymbols>1</LGenerateSymbols> + <LLibSym>1</LLibSym> + <LLines>1</LLines> + <LLocSym>1</LLocSym> + <LPubSym>1</LPubSym> + <LXref>0</LXref> + <LExpSel>0</LExpSel> + </OPTXL> + <OPTFL> + <tvExp>1</tvExp> + <tvExpOptDlg>0</tvExpOptDlg> + <IsCurrentTarget>1</IsCurrentTarget> + </OPTFL> + <CpuCode>255</CpuCode> + <DllOpt> + <SimDllName>SARMCM3.DLL</SimDllName> + <SimDllArguments></SimDllArguments> + <SimDlgDllName>DARMCM1.DLL</SimDlgDllName> + <SimDlgDllArguments></SimDlgDllArguments> + <TargetDllName>SARMCM3.DLL</TargetDllName> + <TargetDllArguments></TargetDllArguments> + <TargetDlgDllName>TARMCM1.DLL</TargetDlgDllName> + <TargetDlgDllArguments></TargetDlgDllArguments> + </DllOpt> + <DebugOpt> + <uSim>1</uSim> + <uTrg>0</uTrg> + <sLdApp>1</sLdApp> + <sGomain>1</sGomain> + <sRbreak>1</sRbreak> + <sRwatch>1</sRwatch> + <sRmem>1</sRmem> + <sRfunc>1</sRfunc> + <sRbox>1</sRbox> + <tLdApp>1</tLdApp> + <tGomain>0</tGomain> + <tRbreak>1</tRbreak> + <tRwatch>1</tRwatch> + <tRmem>1</tRmem> + <tRfunc>0</tRfunc> + <tRbox>1</tRbox> + <sRunDeb>0</sRunDeb> + <sLrtime>0</sLrtime> + <nTsel>-1</nTsel> + <sDll></sDll> + <sDllPa></sDllPa> + <sDlgDll></sDlgDll> + <sDlgPa></sDlgPa> + <sIfile></sIfile> + <tDll></tDll> + <tDllPa></tDllPa> + <tDlgDll></tDlgDll> + <tDlgPa></tDlgPa> + <tIfile></tIfile> + <pMon></pMon> + </DebugOpt> + <Breakpoint/> + <DebugFlag> + <trace>0</trace> + <periodic>1</periodic> + <aLwin>0</aLwin> + <aCover>0</aCover> + <aSer1>0</aSer1> + <aSer2>0</aSer2> + <aPa>0</aPa> + <viewmode>0</viewmode> + <vrSel>0</vrSel> + <aSym>0</aSym> + <aTbox>0</aTbox> + <AscS1>0</AscS1> + <AscS2>0</AscS2> + <AscS3>0</AscS3> + <aSer3>0</aSer3> + <eProf>0</eProf> + <aLa>0</aLa> + <aPa1>0</aPa1> + <AscS4>0</AscS4> + <aSer4>0</aSer4> + <StkLoc>0</StkLoc> + <TrcWin>0</TrcWin> + <newCpu>0</newCpu> + <uProt>0</uProt> + </DebugFlag> + <LintExecutable></LintExecutable> + <LintConfigFile></LintConfigFile> + </TargetOption> + </Target> + + <Group> + <GroupName>Startup</GroupName> + <tvExp>1</tvExp> + <tvExpOptDlg>0</tvExpOptDlg> + <cbSel>0</cbSel> + <File> + <GroupNumber>1</GroupNumber> + <FileNumber>1</FileNumber> + <FileType>2</FileType> + <tvExp>0</tvExp> + <Focus>0</Focus> + <ColumnNumber>0</ColumnNumber> + <tvExpOptDlg>0</tvExpOptDlg> + <TopLine>0</TopLine> + <CurrentLine>0</CurrentLine> + <bDave2>0</bDave2> + <PathWithFileName>..\..\..\..\software\cmsis\Device\ARM\CMSDK_CM0plus\Source\ARM\startup_CMSDK_CM0plus.s</PathWithFileName> + <FilenameWithoutPath>startup_CMSDK_CM0plus.s</FilenameWithoutPath> + </File> + </Group> + + <Group> + <GroupName>Application</GroupName> + <tvExp>1</tvExp> + <tvExpOptDlg>0</tvExpOptDlg> + <cbSel>0</cbSel> + <File> + <GroupNumber>2</GroupNumber> + <FileNumber>2</FileNumber> + <FileType>1</FileType> + <tvExp>0</tvExp> + <Focus>0</Focus> + <ColumnNumber>0</ColumnNumber> + <tvExpOptDlg>0</tvExpOptDlg> + <TopLine>0</TopLine> + <CurrentLine>0</CurrentLine> + <bDave2>0</bDave2> + <PathWithFileName>.\hello.c</PathWithFileName> + <FilenameWithoutPath>hello.c</FilenameWithoutPath> + </File> + <File> + <GroupNumber>2</GroupNumber> + <FileNumber>3</FileNumber> + <FileType>1</FileType> + <tvExp>0</tvExp> + <Focus>0</Focus> + <ColumnNumber>0</ColumnNumber> + <tvExpOptDlg>0</tvExpOptDlg> + <TopLine>0</TopLine> + <CurrentLine>0</CurrentLine> + <bDave2>0</bDave2> + <PathWithFileName>..\..\..\..\software\common\retarget\retarget.c</PathWithFileName> + <FilenameWithoutPath>retarget.c</FilenameWithoutPath> + </File> + <File> + <GroupNumber>2</GroupNumber> + <FileNumber>4</FileNumber> + <FileType>1</FileType> + <tvExp>0</tvExp> + <Focus>0</Focus> + <ColumnNumber>0</ColumnNumber> + <tvExpOptDlg>0</tvExpOptDlg> + <TopLine>0</TopLine> + <CurrentLine>0</CurrentLine> + <bDave2>0</bDave2> + <PathWithFileName>..\..\..\..\software\common\retarget\uart_stdout.c</PathWithFileName> + <FilenameWithoutPath>uart_stdout.c</FilenameWithoutPath> + </File> + </Group> + + <Group> + <GroupName>System</GroupName> + <tvExp>1</tvExp> + <tvExpOptDlg>0</tvExpOptDlg> + <cbSel>0</cbSel> + <File> + <GroupNumber>3</GroupNumber> + <FileNumber>5</FileNumber> + <FileType>1</FileType> + <tvExp>0</tvExp> + <Focus>0</Focus> + <ColumnNumber>0</ColumnNumber> + <tvExpOptDlg>0</tvExpOptDlg> + <TopLine>0</TopLine> + <CurrentLine>0</CurrentLine> + <bDave2>0</bDave2> + <PathWithFileName>..\..\..\..\software\cmsis\Device\ARM\CMSDK_CM0plus\Source\system_CMSDK_CM0plus.c</PathWithFileName> + <FilenameWithoutPath>system_CMSDK_CM0plus.c</FilenameWithoutPath> + </File> + </Group> + +</ProjectOpt> diff --git a/Cortex-M0/nanosoc/systems/mcu/testcodes/hello/hello_cm0p.uvproj b/Cortex-M0/nanosoc/systems/mcu/testcodes/hello/hello_cm0p.uvproj new file mode 100644 index 0000000..38048cf --- /dev/null +++ b/Cortex-M0/nanosoc/systems/mcu/testcodes/hello/hello_cm0p.uvproj @@ -0,0 +1,432 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no" ?> +<Project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="project_proj.xsd"> + + <SchemaVersion>1.1</SchemaVersion> + + <Header>### uVision Project, (C) Keil Software</Header> + + <Targets> + <Target> + <TargetName>Debug</TargetName> + <ToolsetNumber>0x4</ToolsetNumber> + <ToolsetName>ARM-ADS</ToolsetName> + <TargetOption> + <TargetCommonOption> + <Device>Cortex-M0+</Device> + <Vendor>ARM</Vendor> + <Cpu>CLOCK(12000000) CPUTYPE("Cortex-M0+") ESEL ELITTLE</Cpu> + <FlashUtilSpec></FlashUtilSpec> + <StartupFile></StartupFile> + <FlashDriverDll></FlashDriverDll> + <DeviceId>6268</DeviceId> + <RegisterFile></RegisterFile> + <MemoryEnv></MemoryEnv> + <Cmp></Cmp> + <Asm></Asm> + <Linker></Linker> + <OHString></OHString> + <InfinionOptionDll></InfinionOptionDll> + <SLE66CMisc></SLE66CMisc> + <SLE66AMisc></SLE66AMisc> + <SLE66LinkerMisc></SLE66LinkerMisc> + <SFDFile></SFDFile> + <UseEnv>0</UseEnv> + <BinPath></BinPath> + <IncludePath></IncludePath> + <LibPath></LibPath> + <RegisterFilePath></RegisterFilePath> + <DBRegisterFilePath></DBRegisterFilePath> + <TargetStatus> + <Error>0</Error> + <ExitCodeStop>0</ExitCodeStop> + <ButtonStop>0</ButtonStop> + <NotGenerated>0</NotGenerated> + <InvalidFlash>1</InvalidFlash> + </TargetStatus> + <OutputDirectory>.\</OutputDirectory> + <OutputName>hello</OutputName> + <CreateExecutable>1</CreateExecutable> + <CreateLib>0</CreateLib> + <CreateHexFile>0</CreateHexFile> + <DebugInformation>1</DebugInformation> + <BrowseInformation>1</BrowseInformation> + <ListingPath>.\</ListingPath> + <HexFormatSelection>1</HexFormatSelection> + <Merge32K>0</Merge32K> + <CreateBatchFile>0</CreateBatchFile> + <BeforeCompile> + <RunUserProg1>0</RunUserProg1> + <RunUserProg2>0</RunUserProg2> + <UserProg1Name></UserProg1Name> + <UserProg2Name></UserProg2Name> + <UserProg1Dos16Mode>0</UserProg1Dos16Mode> + <UserProg2Dos16Mode>0</UserProg2Dos16Mode> + <nStopU1X>0</nStopU1X> + <nStopU2X>0</nStopU2X> + </BeforeCompile> + <BeforeMake> + <RunUserProg1>0</RunUserProg1> + <RunUserProg2>0</RunUserProg2> + <UserProg1Name></UserProg1Name> + <UserProg2Name></UserProg2Name> + <UserProg1Dos16Mode>0</UserProg1Dos16Mode> + <UserProg2Dos16Mode>0</UserProg2Dos16Mode> + </BeforeMake> + <AfterMake> + <RunUserProg1>1</RunUserProg1> + <RunUserProg2>0</RunUserProg2> + <UserProg1Name>$K\ARM\ARMCC\BIN\fromelf.exe #L --vhx --8x1 --output hello.hex</UserProg1Name> + <UserProg2Name></UserProg2Name> + <UserProg1Dos16Mode>0</UserProg1Dos16Mode> + <UserProg2Dos16Mode>0</UserProg2Dos16Mode> + </AfterMake> + <SelectedForBatchBuild>0</SelectedForBatchBuild> + <SVCSIdString></SVCSIdString> + </TargetCommonOption> + <CommonProperty> + <UseCPPCompiler>0</UseCPPCompiler> + <RVCTCodeConst>0</RVCTCodeConst> + <RVCTZI>0</RVCTZI> + <RVCTOtherData>0</RVCTOtherData> + <ModuleSelection>0</ModuleSelection> + <IncludeInBuild>1</IncludeInBuild> + <AlwaysBuild>0</AlwaysBuild> + <GenerateAssemblyFile>0</GenerateAssemblyFile> + <AssembleAssemblyFile>0</AssembleAssemblyFile> + <PublicsOnly>0</PublicsOnly> + <StopOnExitCode>3</StopOnExitCode> + <CustomArgument></CustomArgument> + <IncludeLibraryModules></IncludeLibraryModules> + </CommonProperty> + <DllOption> + <SimDllName>SARMCM3.DLL</SimDllName> + <SimDllArguments></SimDllArguments> + <SimDlgDll>DARMCM1.DLL</SimDlgDll> + <SimDlgDllArguments></SimDlgDllArguments> + <TargetDllName>SARMCM3.DLL</TargetDllName> + <TargetDllArguments></TargetDllArguments> + <TargetDlgDll>TARMCM1.DLL</TargetDlgDll> + <TargetDlgDllArguments></TargetDlgDllArguments> + </DllOption> + <DebugOption> + <OPTHX> + <HexSelection>1</HexSelection> + <HexRangeLowAddress>0</HexRangeLowAddress> + <HexRangeHighAddress>0</HexRangeHighAddress> + <HexOffset>0</HexOffset> + <Oh166RecLen>16</Oh166RecLen> + </OPTHX> + <Simulator> + <UseSimulator>1</UseSimulator> + <LoadApplicationAtStartup>1</LoadApplicationAtStartup> + <RunToMain>1</RunToMain> + <RestoreBreakpoints>1</RestoreBreakpoints> + <RestoreWatchpoints>1</RestoreWatchpoints> + <RestoreMemoryDisplay>1</RestoreMemoryDisplay> + <RestoreFunctions>1</RestoreFunctions> + <RestoreToolbox>1</RestoreToolbox> + <LimitSpeedToRealTime>0</LimitSpeedToRealTime> + </Simulator> + <Target> + <UseTarget>0</UseTarget> + <LoadApplicationAtStartup>1</LoadApplicationAtStartup> + <RunToMain>0</RunToMain> + <RestoreBreakpoints>1</RestoreBreakpoints> + <RestoreWatchpoints>1</RestoreWatchpoints> + <RestoreMemoryDisplay>1</RestoreMemoryDisplay> + <RestoreFunctions>0</RestoreFunctions> + <RestoreToolbox>1</RestoreToolbox> + </Target> + <RunDebugAfterBuild>0</RunDebugAfterBuild> + <TargetSelection>-1</TargetSelection> + <SimDlls> + <CpuDll></CpuDll> + <CpuDllArguments></CpuDllArguments> + <PeripheralDll></PeripheralDll> + <PeripheralDllArguments></PeripheralDllArguments> + <InitializationFile></InitializationFile> + </SimDlls> + <TargetDlls> + <CpuDll></CpuDll> + <CpuDllArguments></CpuDllArguments> + <PeripheralDll></PeripheralDll> + <PeripheralDllArguments></PeripheralDllArguments> + <InitializationFile></InitializationFile> + <Driver></Driver> + </TargetDlls> + </DebugOption> + <Utilities> + <Flash1> + <UseTargetDll>1</UseTargetDll> + <UseExternalTool>0</UseExternalTool> + <RunIndependent>0</RunIndependent> + <UpdateFlashBeforeDebugging>0</UpdateFlashBeforeDebugging> + <Capability>0</Capability> + <DriverSelection>-1</DriverSelection> + </Flash1> + <Flash2></Flash2> + <Flash3>"" ()</Flash3> + <Flash4></Flash4> + </Utilities> + <TargetArmAds> + <ArmAdsMisc> + <GenerateListings>0</GenerateListings> + <asHll>1</asHll> + <asAsm>1</asAsm> + <asMacX>1</asMacX> + <asSyms>1</asSyms> + <asFals>1</asFals> + <asDbgD>1</asDbgD> + <asForm>1</asForm> + <ldLst>0</ldLst> + <ldmm>1</ldmm> + <ldXref>1</ldXref> + <BigEnd>0</BigEnd> + <AdsALst>1</AdsALst> + <AdsACrf>1</AdsACrf> + <AdsANop>0</AdsANop> + <AdsANot>0</AdsANot> + <AdsLLst>1</AdsLLst> + <AdsLmap>1</AdsLmap> + <AdsLcgr>1</AdsLcgr> + <AdsLsym>1</AdsLsym> + <AdsLszi>1</AdsLszi> + <AdsLtoi>1</AdsLtoi> + <AdsLsun>1</AdsLsun> + <AdsLven>1</AdsLven> + <AdsLsxf>1</AdsLsxf> + <RvctClst>0</RvctClst> + <GenPPlst>0</GenPPlst> + <AdsCpuType>"Cortex-M0+"</AdsCpuType> + <RvctDeviceName></RvctDeviceName> + <mOS>0</mOS> + <uocRom>0</uocRom> + <uocRam>0</uocRam> + <hadIROM>0</hadIROM> + <hadIRAM>0</hadIRAM> + <hadXRAM>0</hadXRAM> + <uocXRam>0</uocXRam> + <RvdsVP>0</RvdsVP> + <hadIRAM2>0</hadIRAM2> + <hadIROM2>0</hadIROM2> + <StupSel>1</StupSel> + <useUlib>0</useUlib> + <EndSel>1</EndSel> + <uLtcg>0</uLtcg> + <RoSelD>0</RoSelD> + <RwSelD>5</RwSelD> + <CodeSel>0</CodeSel> + <OptFeed>0</OptFeed> + <NoZi1>0</NoZi1> + <NoZi2>0</NoZi2> + <NoZi3>0</NoZi3> + <NoZi4>0</NoZi4> + <NoZi5>0</NoZi5> + <Ro1Chk>1</Ro1Chk> + <Ro2Chk>0</Ro2Chk> + <Ro3Chk>0</Ro3Chk> + <Ir1Chk>0</Ir1Chk> + <Ir2Chk>0</Ir2Chk> + <Ra1Chk>1</Ra1Chk> + <Ra2Chk>0</Ra2Chk> + <Ra3Chk>0</Ra3Chk> + <Im1Chk>0</Im1Chk> + <Im2Chk>0</Im2Chk> + <OnChipMemories> + <Ocm1> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </Ocm1> + <Ocm2> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </Ocm2> + <Ocm3> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </Ocm3> + <Ocm4> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </Ocm4> + <Ocm5> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </Ocm5> + <Ocm6> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </Ocm6> + <IRAM> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </IRAM> + <IROM> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </IROM> + <XRAM> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </XRAM> + <OCR_RVCT1> + <Type>1</Type> + <StartAddress>0x0</StartAddress> + <Size>0x10000</Size> + </OCR_RVCT1> + <OCR_RVCT2> + <Type>1</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </OCR_RVCT2> + <OCR_RVCT3> + <Type>1</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </OCR_RVCT3> + <OCR_RVCT4> + <Type>1</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </OCR_RVCT4> + <OCR_RVCT5> + <Type>1</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </OCR_RVCT5> + <OCR_RVCT6> + <Type>0</Type> + <StartAddress>0x20000000</StartAddress> + <Size>0x10000</Size> + </OCR_RVCT6> + <OCR_RVCT7> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </OCR_RVCT7> + <OCR_RVCT8> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </OCR_RVCT8> + <OCR_RVCT9> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </OCR_RVCT9> + <OCR_RVCT10> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </OCR_RVCT10> + </OnChipMemories> + <RvctStartVector></RvctStartVector> + </ArmAdsMisc> + <Cads> + <interw>1</interw> + <Optim>4</Optim> + <oTime>0</oTime> + <SplitLS>0</SplitLS> + <OneElfS>0</OneElfS> + <Strict>0</Strict> + <EnumInt>0</EnumInt> + <PlainCh>0</PlainCh> + <Ropi>0</Ropi> + <Rwpi>0</Rwpi> + <wLevel>0</wLevel> + <uThumb>0</uThumb> + <VariousControls> + <MiscControls></MiscControls> + <Define>CORTEX_M0PLUS</Define> + <Undefine></Undefine> + <IncludePath>..\..\..\..\software\cmsis\CMSIS\Include; ..\..\..\..\software\cmsis\Device\ARM\CMSDK_CM0plus\Include; ..\..\..\..\software\common\retarget</IncludePath> + </VariousControls> + </Cads> + <Aads> + <interw>1</interw> + <Ropi>0</Ropi> + <Rwpi>0</Rwpi> + <thumb>0</thumb> + <SplitLS>0</SplitLS> + <SwStkChk>0</SwStkChk> + <NoWarn>0</NoWarn> + <VariousControls> + <MiscControls></MiscControls> + <Define></Define> + <Undefine></Undefine> + <IncludePath></IncludePath> + </VariousControls> + </Aads> + <LDads> + <umfTarg>1</umfTarg> + <Ropi>0</Ropi> + <Rwpi>0</Rwpi> + <noStLib>0</noStLib> + <RepFail>1</RepFail> + <useFile>0</useFile> + <TextAddressRange>0x00000000</TextAddressRange> + <DataAddressRange>0x00000000</DataAddressRange> + <ScatterFile></ScatterFile> + <IncludeLibs></IncludeLibs> + <IncludeLibsPath></IncludeLibsPath> + <Misc></Misc> + <LinkerInputFile></LinkerInputFile> + <DisabledWarnings></DisabledWarnings> + </LDads> + </TargetArmAds> + </TargetOption> + <Groups> + <Group> + <GroupName>Startup</GroupName> + <Files> + <File> + <FileName>startup_CMSDK_CM0plus.s</FileName> + <FileType>2</FileType> + <FilePath>..\..\..\..\software\cmsis\Device\ARM\CMSDK_CM0plus\Source\ARM\startup_CMSDK_CM0plus.s</FilePath> + </File> + </Files> + </Group> + <Group> + <GroupName>Application</GroupName> + <Files> + <File> + <FileName>hello.c</FileName> + <FileType>1</FileType> + <FilePath>.\hello.c</FilePath> + </File> + <File> + <FileName>retarget.c</FileName> + <FileType>1</FileType> + <FilePath>..\..\..\..\software\common\retarget\retarget.c</FilePath> + </File> + <File> + <FileName>uart_stdout.c</FileName> + <FileType>1</FileType> + <FilePath>..\..\..\..\software\common\retarget\uart_stdout.c</FilePath> + </File> + </Files> + </Group> + <Group> + <GroupName>System</GroupName> + <Files> + <File> + <FileName>system_CMSDK_CM0plus.c</FileName> + <FileType>1</FileType> + <FilePath>..\..\..\..\software\cmsis\Device\ARM\CMSDK_CM0plus\Source\system_CMSDK_CM0plus.c</FilePath> + </File> + </Files> + </Group> + </Groups> + </Target> + </Targets> + +</Project> diff --git a/Cortex-M0/nanosoc/systems/mcu/testcodes/hello/makefile b/Cortex-M0/nanosoc/systems/mcu/testcodes/hello/makefile new file mode 100644 index 0000000..e8ac4ee --- /dev/null +++ b/Cortex-M0/nanosoc/systems/mcu/testcodes/hello/makefile @@ -0,0 +1,255 @@ +#----------------------------------------------------------------------------- +# The confidential and proprietary information contained in this file may +# only be used by a person authorised under and to the extent permitted +# by a subsisting licensing agreement from Arm Limited or its affiliates. +# +# (C) COPYRIGHT 2010-2013 Arm Limited or its affiliates. +# ALL RIGHTS RESERVED +# +# This entire notice must be reproduced on all copies of this file +# and copies of this file may only be made by a person if such person is +# permitted to do so under the terms of a subsisting license agreement +# from Arm Limited or its affiliates. +# +# SVN Information +# +# Checked In : $Date: 2017-10-10 15:55:38 +0100 (Tue, 10 Oct 2017) $ +# +# Revision : $Revision: 371321 $ +# +# Release Information : Cortex-M System Design Kit-r1p1-00rel0 +#----------------------------------------------------------------------------- +# +# Cortex-M System Design Kit software compilation make file +# +#----------------------------------------------------------------------------- +# +# Configurations +# +# Choose the core instantiated, can be +# - CORTEX_M0 +# - CORTEX_M0PLUS +CPU_PRODUCT = CORTEX_M0 + +# Shared software directory +SOFTWARE_DIR = ../../../../software +CMSIS_DIR = $(SOFTWARE_DIR)/cmsis +CORE_DIR = $(CMSIS_DIR)/CMSIS/Include + +ifeq ($(CPU_PRODUCT),CORTEX_M0PLUS) + DEVICE_DIR = $(CMSIS_DIR)/Device/ARM/CMSDK_CM0plus +else + DEVICE_DIR = $(CMSIS_DIR)/Device/ARM/CMSDK_CM0 +endif + +# Program file +TESTNAME = hello + +# Endian Option +COMPILE_BIGEND = 0 + +# Configuration +ifeq ($(CPU_PRODUCT),CORTEX_M0PLUS) + USER_DEFINE = -DCORTEX_M0PLUS +else + USER_DEFINE = -DCORTEX_M0 +endif + +DEPS_LIST = makefile + +# Tool chain : ds5 / gcc / keil +TOOL_CHAIN = ds5 + +ifeq ($(TOOL_CHAIN),ds5) + ifeq ($(CPU_PRODUCT),CORTEX_M0PLUS) + CPU_TYPE = --cpu Cortex-M0plus + else + CPU_TYPE = --cpu Cortex-M0 + endif +endif + +ifeq ($(TOOL_CHAIN),gcc) + ifeq ($(CPU_PRODUCT),CORTEX_M0PLUS) + CPU_TYPE = -mcpu=cortex-m0plus + else + CPU_TYPE = -mcpu=cortex-m0 + endif +endif + +# Startup code directory for DS-5 +ifeq ($(TOOL_CHAIN),ds5) + STARTUP_DIR = $(DEVICE_DIR)/Source/ARM +endif + +# Startup code directory for gcc +ifeq ($(TOOL_CHAIN),gcc) + STARTUP_DIR = $(DEVICE_DIR)/Source/GCC +endif + +ifeq ($(CPU_PRODUCT),CORTEX_M0PLUS) + STARTUP_FILE = startup_CMSDK_CM0plus + SYSTEM_FILE = system_CMSDK_CM0plus +else + STARTUP_FILE = startup_CMSDK_CM0 + SYSTEM_FILE = system_CMSDK_CM0 +endif + +# --------------------------------------------------------------------------------------- +# DS-5 options + +# MicroLIB option +COMPILE_MICROLIB = 0 + +# Small Multiply (Cortex-M0/M0+ has small multiplier option) +COMPILE_SMALLMUL = 0 + +#ARM_CC_OPTIONS = -c -O3 -g -Otime -I $(DEVICE_DIR)/Include -I $(CORE_DIR) \ +# -I $(SOFTWARE_DIR)/common/retarget $(USER_DEFINE) +#ARM_ASM_OPTIONS = -g +#ARM_LINK_OPTIONS = "--keep=$(STARTUP_FILE).o(RESET)" "--first=$(STARTUP_FILE).o(RESET)" \ +# --rw_base 0x30000000 --ro_base 0x00000000 --map --info sizes + +ARM_CC_OPTIONS = -c -O3 -Ospace -I $(DEVICE_DIR)/Include -I $(CORE_DIR) \ + -I $(SOFTWARE_DIR)/common/retarget $(USER_DEFINE) +ARM_ASM_OPTIONS = +ARM_LINK_OPTIONS = "--keep=$(STARTUP_FILE).o(RESET)" "--first=$(STARTUP_FILE).o(RESET)" \ + --no_debug --rw_base 0x30000000 --ro_base 0x00000000 --map --info sizes + +ifeq ($(COMPILE_BIGEND),1) + # Big Endian + ARM_CC_OPTIONS += --bigend + ARM_ASM_OPTIONS += --bigend + ARM_LINK_OPTIONS += --be8 +endif + +ifeq ($(COMPILE_MICROLIB),1) + # MicroLIB + ARM_CC_OPTIONS += --library_type=microlib + ARM_ASM_OPTIONS += --library_type=microlib --pd "__MICROLIB SETA 1" + ARM_LINK_OPTIONS += --library_type=microlib +endif + +ifeq ($(COMPILE_SMALLMUL),1) + # In Cortex-M0, small multiply takes 32 cycles + ARM_CC_OPTIONS += --multiply_latency=32 +endif + +# --------------------------------------------------------------------------------------- +# gcc options + +GNG_CC = arm-none-eabi-gcc +GNU_OBJDUMP = arm-none-eabi-objdump +GNU_OBJCOPY = arm-none-eabi-objcopy + +LINKER_SCRIPT_PATH = $(SOFTWARE_DIR)/common/scripts +LINKER_SCRIPT = $(LINKER_SCRIPT_PATH)/cmsdk_cm0.ld + +GNU_CC_FLAGS = -g -O3 -mthumb $(CPU_TYPE) + +ifeq ($(COMPILE_BIGEND),1) + # Big Endian + GNU_CC_FLAGS += -mbig-endian +endif + +# --------------------------------------------------------------------------------------- +all: all_$(TOOL_CHAIN) + +# --------------------------------------------------------------------------------------- +# DS-5 +all_ds5 : $(TESTNAME).hex $(TESTNAME).lst + +$(TESTNAME).o : $(TESTNAME).c $(DEPS_LIST) + armcc $(ARM_CC_OPTIONS) $(CPU_TYPE) $< -o $@ + +$(SYSTEM_FILE).o : $(DEVICE_DIR)/Source/$(SYSTEM_FILE).c $(DEPS_LIST) + armcc $(ARM_CC_OPTIONS) $(CPU_TYPE) $< -o $@ + +retarget.o : $(SOFTWARE_DIR)/common/retarget/retarget.c $(DEPS_LIST) + armcc $(ARM_CC_OPTIONS) $(CPU_TYPE) $< -o $@ + +uart_stdout.o : $(SOFTWARE_DIR)/common/retarget/uart_stdout.c $(DEPS_LIST) + armcc $(ARM_CC_OPTIONS) $(CPU_TYPE) $< -o $@ + +$(STARTUP_FILE).o : $(STARTUP_DIR)/$(STARTUP_FILE).s $(DEPS_LIST) + armasm $(ARM_ASM_OPTIONS) $(CPU_TYPE) $< -o $@ + +$(TESTNAME).ELF : $(TESTNAME).o $(SYSTEM_FILE).o $(STARTUP_FILE).o retarget.o uart_stdout.o + armlink $(ARM_LINK_OPTIONS) $(TESTNAME).o $(SYSTEM_FILE).o $(STARTUP_FILE).o retarget.o uart_stdout.o -o $@ + +$(TESTNAME).hex : $(TESTNAME).ELF + fromelf --vhx --8x1 $< --output $@ + +$(TESTNAME).lst : $(TESTNAME).ELF + fromelf -c -d -e -s -z -v $< --output $@ + +# --------------------------------------------------------------------------------------- +# gcc +all_gcc: + $(GNG_CC) $(GNU_CC_FLAGS) $(STARTUP_DIR)/$(STARTUP_FILE).s \ + $(TESTNAME).c \ + $(SOFTWARE_DIR)/common/retarget/retarget.c \ + $(SOFTWARE_DIR)/common/retarget/uart_stdout.c \ + $(DEVICE_DIR)/Source/$(SYSTEM_FILE).c \ + -I $(DEVICE_DIR)/Include -I $(CORE_DIR) \ + -I $(SOFTWARE_DIR)/common/retarget \ + -L $(LINKER_SCRIPT_PATH) \ + -D__STACK_SIZE=0x200 \ + -D__HEAP_SIZE=0x1000 \ + $(USER_DEFINE) -T $(LINKER_SCRIPT) -o $(TESTNAME).o + # Generate disassembly code + $(GNU_OBJDUMP) -S $(TESTNAME).o > $(TESTNAME).lst + # Generate binary file + $(GNU_OBJCOPY) -S $(TESTNAME).o -O binary $(TESTNAME).bin + # Generate hex file + $(GNU_OBJCOPY) -S $(TESTNAME).o -O verilog $(TESTNAME).hex + +# Note: +# If the version of object copy you are using does not support verilog hex file output, +# you can generate the hex file from binary file using the following command +# od -v -A n -t x1 --width=1 $(TESTNAME).bin > $(TESTNAME).hex + + +# --------------------------------------------------------------------------------------- +# Keil MDK + +all_keil: + @echo "Please compile your project code and press ENTER when ready" + @read dummy + +# --------------------------------------------------------------------------------------- +# Binary + +all_bin: $(TESTNAME).bin + # Generate hex file from binary + od -v -A n -t x1 --width=1 $(TESTNAME).bin > $(TESTNAME).hex + +# --------------------------------------------------------------------------------------- +# Clean +clean : + @rm -rf *.o + @if [ -e $(TESTNAME).hex ] ; then \ + rm -rf $(TESTNAME).hex ; \ + fi + @if [ -e $(TESTNAME).lst ] ; then \ + rm -rf $(TESTNAME).lst ; \ + fi + @if [ -e $(TESTNAME).ELF ] ; then \ + rm -rf $(TESTNAME).ELF ; \ + fi + @if [ -e $(TESTNAME).bin ] ; then \ + rm -rf $(TESTNAME).bin ; \ + fi + @rm -rf *.crf + @rm -rf *.plg + @rm -rf *.tra + @rm -rf *.htm + @rm -rf *.map + @rm -rf *.dep + @rm -rf *.d + @rm -rf *.lnp + @rm -rf *.bak + @rm -rf *.lst + @rm -rf *.axf + @rm -rf *.sct + @rm -rf *.__i + @rm -rf *._ia diff --git a/Cortex-M0/nanosoc/systems/mcu/testcodes/interrupt_demo/interrupt_demo_cm0.uvopt b/Cortex-M0/nanosoc/systems/mcu/testcodes/interrupt_demo/interrupt_demo_cm0.uvopt new file mode 100644 index 0000000..08449be --- /dev/null +++ b/Cortex-M0/nanosoc/systems/mcu/testcodes/interrupt_demo/interrupt_demo_cm0.uvopt @@ -0,0 +1,277 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no" ?> +<ProjectOpt xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="project_opt.xsd"> + + <SchemaVersion>1.0</SchemaVersion> + + <Header>### uVision Project, (C) Keil Software</Header> + + <Extensions> + <cExt>*.c</cExt> + <aExt>*.s*; *.src; *.a*</aExt> + <oExt>*.obj</oExt> + <lExt>*.lib</lExt> + <tExt>*.txt; *.h; *.inc</tExt> + <pExt>*.plm</pExt> + <CppX>*.cpp</CppX> + </Extensions> + + <DaveTm> + <dwLowDateTime>0</dwLowDateTime> + <dwHighDateTime>0</dwHighDateTime> + </DaveTm> + + <Target> + <TargetName>Debug</TargetName> + <ToolsetNumber>0x4</ToolsetNumber> + <ToolsetName>ARM-ADS</ToolsetName> + <TargetOption> + <CLKADS>50000000</CLKADS> + <OPTTT> + <gFlags>1</gFlags> + <BeepAtEnd>1</BeepAtEnd> + <RunSim>1</RunSim> + <RunTarget>0</RunTarget> + </OPTTT> + <OPTHX> + <HexSelection>1</HexSelection> + <FlashByte>65535</FlashByte> + <HexRangeLowAddress>0</HexRangeLowAddress> + <HexRangeHighAddress>0</HexRangeHighAddress> + <HexOffset>0</HexOffset> + </OPTHX> + <OPTLEX> + <PageWidth>79</PageWidth> + <PageLength>66</PageLength> + <TabStop>8</TabStop> + <ListingPath>.\</ListingPath> + </OPTLEX> + <ListingPage> + <CreateCListing>1</CreateCListing> + <CreateAListing>1</CreateAListing> + <CreateLListing>1</CreateLListing> + <CreateIListing>0</CreateIListing> + <AsmCond>1</AsmCond> + <AsmSymb>1</AsmSymb> + <AsmXref>0</AsmXref> + <CCond>1</CCond> + <CCode>0</CCode> + <CListInc>0</CListInc> + <CSymb>0</CSymb> + <LinkerCodeListing>0</LinkerCodeListing> + </ListingPage> + <OPTXL> + <LMap>1</LMap> + <LComments>1</LComments> + <LGenerateSymbols>1</LGenerateSymbols> + <LLibSym>1</LLibSym> + <LLines>1</LLines> + <LLocSym>1</LLocSym> + <LPubSym>1</LPubSym> + <LXref>0</LXref> + <LExpSel>0</LExpSel> + </OPTXL> + <OPTFL> + <tvExp>1</tvExp> + <tvExpOptDlg>0</tvExpOptDlg> + <IsCurrentTarget>1</IsCurrentTarget> + </OPTFL> + <CpuCode>255</CpuCode> + <DllOpt> + <SimDllName>SARMCM3.DLL</SimDllName> + <SimDllArguments></SimDllArguments> + <SimDlgDllName>DARMCM1.DLL</SimDlgDllName> + <SimDlgDllArguments></SimDlgDllArguments> + <TargetDllName>SARMCM3.DLL</TargetDllName> + <TargetDllArguments></TargetDllArguments> + <TargetDlgDllName>TARMCM1.DLL</TargetDlgDllName> + <TargetDlgDllArguments></TargetDlgDllArguments> + </DllOpt> + <DebugOpt> + <uSim>1</uSim> + <uTrg>0</uTrg> + <sLdApp>1</sLdApp> + <sGomain>1</sGomain> + <sRbreak>1</sRbreak> + <sRwatch>1</sRwatch> + <sRmem>1</sRmem> + <sRfunc>1</sRfunc> + <sRbox>1</sRbox> + <tLdApp>1</tLdApp> + <tGomain>0</tGomain> + <tRbreak>1</tRbreak> + <tRwatch>1</tRwatch> + <tRmem>1</tRmem> + <tRfunc>0</tRfunc> + <tRbox>1</tRbox> + <tRtrace>0</tRtrace> + <sRunDeb>0</sRunDeb> + <sLrtime>0</sLrtime> + <nTsel>-1</nTsel> + <sDll></sDll> + <sDllPa></sDllPa> + <sDlgDll></sDlgDll> + <sDlgPa></sDlgPa> + <sIfile></sIfile> + <tDll></tDll> + <tDllPa></tDllPa> + <tDlgDll></tDlgDll> + <tDlgPa></tDlgPa> + <tIfile></tIfile> + <pMon></pMon> + </DebugOpt> + <Breakpoint/> + <DebugFlag> + <trace>0</trace> + <periodic>1</periodic> + <aLwin>0</aLwin> + <aCover>0</aCover> + <aSer1>0</aSer1> + <aSer2>0</aSer2> + <aPa>0</aPa> + <viewmode>0</viewmode> + <vrSel>0</vrSel> + <aSym>0</aSym> + <aTbox>0</aTbox> + <AscS1>0</AscS1> + <AscS2>0</AscS2> + <AscS3>0</AscS3> + <aSer3>0</aSer3> + <eProf>0</eProf> + <aLa>0</aLa> + <aPa1>0</aPa1> + <AscS4>0</AscS4> + <aSer4>0</aSer4> + <StkLoc>0</StkLoc> + <TrcWin>0</TrcWin> + <newCpu>0</newCpu> + <uProt>0</uProt> + </DebugFlag> + <Tracepoint> + <THDelay>0</THDelay> + </Tracepoint> + <LintExecutable></LintExecutable> + <LintConfigFile></LintConfigFile> + </TargetOption> + </Target> + + <Group> + <GroupName>Startup</GroupName> + <tvExp>1</tvExp> + <tvExpOptDlg>0</tvExpOptDlg> + <cbSel>0</cbSel> + <RteFlg>0</RteFlg> + <File> + <GroupNumber>1</GroupNumber> + <FileNumber>1</FileNumber> + <FileType>2</FileType> + <tvExp>0</tvExp> + <Focus>0</Focus> + <ColumnNumber>0</ColumnNumber> + <tvExpOptDlg>0</tvExpOptDlg> + <TopLine>0</TopLine> + <CurrentLine>0</CurrentLine> + <bDave2>0</bDave2> + <PathWithFileName>..\..\..\..\software\cmsis\Device\ARM\CMSDK_CM0\Source\ARM\startup_CMSDK_CM0.s</PathWithFileName> + <FilenameWithoutPath>startup_CMSDK_CM0.s</FilenameWithoutPath> + <RteFlg>0</RteFlg> + <bShared>0</bShared> + </File> + </Group> + + <Group> + <GroupName>Application</GroupName> + <tvExp>1</tvExp> + <tvExpOptDlg>0</tvExpOptDlg> + <cbSel>0</cbSel> + <RteFlg>0</RteFlg> + <File> + <GroupNumber>2</GroupNumber> + <FileNumber>2</FileNumber> + <FileType>1</FileType> + <tvExp>0</tvExp> + <Focus>0</Focus> + <ColumnNumber>0</ColumnNumber> + <tvExpOptDlg>0</tvExpOptDlg> + <TopLine>0</TopLine> + <CurrentLine>0</CurrentLine> + <bDave2>0</bDave2> + <PathWithFileName>..\..\..\..\software\common\demos\interrupt_demo.c</PathWithFileName> + <FilenameWithoutPath>interrupt_demo.c</FilenameWithoutPath> + <RteFlg>0</RteFlg> + <bShared>0</bShared> + </File> + <File> + <GroupNumber>2</GroupNumber> + <FileNumber>3</FileNumber> + <FileType>1</FileType> + <tvExp>0</tvExp> + <Focus>0</Focus> + <ColumnNumber>0</ColumnNumber> + <tvExpOptDlg>0</tvExpOptDlg> + <TopLine>0</TopLine> + <CurrentLine>0</CurrentLine> + <bDave2>0</bDave2> + <PathWithFileName>..\..\..\..\software\common\retarget\retarget.c</PathWithFileName> + <FilenameWithoutPath>retarget.c</FilenameWithoutPath> + <RteFlg>0</RteFlg> + <bShared>0</bShared> + </File> + <File> + <GroupNumber>2</GroupNumber> + <FileNumber>4</FileNumber> + <FileType>1</FileType> + <tvExp>0</tvExp> + <Focus>0</Focus> + <ColumnNumber>0</ColumnNumber> + <tvExpOptDlg>0</tvExpOptDlg> + <TopLine>0</TopLine> + <CurrentLine>0</CurrentLine> + <bDave2>0</bDave2> + <PathWithFileName>..\..\..\..\software\common\retarget\uart_stdout.c</PathWithFileName> + <FilenameWithoutPath>uart_stdout.c</FilenameWithoutPath> + <RteFlg>0</RteFlg> + <bShared>0</bShared> + </File> + <File> + <GroupNumber>2</GroupNumber> + <FileNumber>5</FileNumber> + <FileType>1</FileType> + <tvExp>0</tvExp> + <Focus>0</Focus> + <ColumnNumber>0</ColumnNumber> + <tvExpOptDlg>0</tvExpOptDlg> + <TopLine>0</TopLine> + <CurrentLine>0</CurrentLine> + <bDave2>0</bDave2> + <PathWithFileName>..\..\..\..\software\cmsis\Device\ARM\CMSDK_CM0\Source\CMSDK_driver.c</PathWithFileName> + <FilenameWithoutPath>CMSDK_driver.c</FilenameWithoutPath> + <RteFlg>0</RteFlg> + <bShared>0</bShared> + </File> + </Group> + + <Group> + <GroupName>System</GroupName> + <tvExp>1</tvExp> + <tvExpOptDlg>0</tvExpOptDlg> + <cbSel>0</cbSel> + <RteFlg>0</RteFlg> + <File> + <GroupNumber>3</GroupNumber> + <FileNumber>6</FileNumber> + <FileType>1</FileType> + <tvExp>0</tvExp> + <Focus>0</Focus> + <ColumnNumber>0</ColumnNumber> + <tvExpOptDlg>0</tvExpOptDlg> + <TopLine>0</TopLine> + <CurrentLine>0</CurrentLine> + <bDave2>0</bDave2> + <PathWithFileName>..\..\..\..\software\cmsis\Device\ARM\CMSDK_CM0\Source\system_CMSDK_CM0.c</PathWithFileName> + <FilenameWithoutPath>system_CMSDK_CM0.c</FilenameWithoutPath> + <RteFlg>0</RteFlg> + <bShared>0</bShared> + </File> + </Group> + +</ProjectOpt> diff --git a/Cortex-M0/nanosoc/systems/mcu/testcodes/interrupt_demo/interrupt_demo_cm0.uvproj b/Cortex-M0/nanosoc/systems/mcu/testcodes/interrupt_demo/interrupt_demo_cm0.uvproj new file mode 100644 index 0000000..ea6f928 --- /dev/null +++ b/Cortex-M0/nanosoc/systems/mcu/testcodes/interrupt_demo/interrupt_demo_cm0.uvproj @@ -0,0 +1,440 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no" ?> +<Project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="project_proj.xsd"> + + <SchemaVersion>1.1</SchemaVersion> + + <Header>### uVision Project, (C) Keil Software</Header> + + <Targets> + <Target> + <TargetName>Debug</TargetName> + <ToolsetNumber>0x4</ToolsetNumber> + <ToolsetName>ARM-ADS</ToolsetName> + <TargetOption> + <TargetCommonOption> + <Device>Cortex-M0</Device> + <Vendor>ARM</Vendor> + <Cpu>CLOCK(12000000) CPUTYPE("Cortex-M0") ESEL ELITTLE</Cpu> + <FlashUtilSpec></FlashUtilSpec> + <StartupFile></StartupFile> + <FlashDriverDll></FlashDriverDll> + <DeviceId>4803</DeviceId> + <RegisterFile></RegisterFile> + <MemoryEnv></MemoryEnv> + <Cmp></Cmp> + <Asm></Asm> + <Linker></Linker> + <OHString></OHString> + <InfinionOptionDll></InfinionOptionDll> + <SLE66CMisc></SLE66CMisc> + <SLE66AMisc></SLE66AMisc> + <SLE66LinkerMisc></SLE66LinkerMisc> + <SFDFile></SFDFile> + <UseEnv>0</UseEnv> + <BinPath></BinPath> + <IncludePath></IncludePath> + <LibPath></LibPath> + <RegisterFilePath></RegisterFilePath> + <DBRegisterFilePath></DBRegisterFilePath> + <TargetStatus> + <Error>0</Error> + <ExitCodeStop>0</ExitCodeStop> + <ButtonStop>0</ButtonStop> + <NotGenerated>0</NotGenerated> + <InvalidFlash>1</InvalidFlash> + </TargetStatus> + <OutputDirectory>.\</OutputDirectory> + <OutputName>interrupt_demo</OutputName> + <CreateExecutable>1</CreateExecutable> + <CreateLib>0</CreateLib> + <CreateHexFile>0</CreateHexFile> + <DebugInformation>1</DebugInformation> + <BrowseInformation>1</BrowseInformation> + <ListingPath>.\</ListingPath> + <HexFormatSelection>1</HexFormatSelection> + <Merge32K>0</Merge32K> + <CreateBatchFile>0</CreateBatchFile> + <BeforeCompile> + <RunUserProg1>0</RunUserProg1> + <RunUserProg2>0</RunUserProg2> + <UserProg1Name></UserProg1Name> + <UserProg2Name></UserProg2Name> + <UserProg1Dos16Mode>0</UserProg1Dos16Mode> + <UserProg2Dos16Mode>0</UserProg2Dos16Mode> + <nStopU1X>0</nStopU1X> + <nStopU2X>0</nStopU2X> + </BeforeCompile> + <BeforeMake> + <RunUserProg1>0</RunUserProg1> + <RunUserProg2>0</RunUserProg2> + <UserProg1Name></UserProg1Name> + <UserProg2Name></UserProg2Name> + <UserProg1Dos16Mode>0</UserProg1Dos16Mode> + <UserProg2Dos16Mode>0</UserProg2Dos16Mode> + </BeforeMake> + <AfterMake> + <RunUserProg1>1</RunUserProg1> + <RunUserProg2>0</RunUserProg2> + <UserProg1Name>$K\ARM\ARMCC\BIN\fromelf.exe #L --vhx --8x1 --output interrupt_demo.hex</UserProg1Name> + <UserProg2Name></UserProg2Name> + <UserProg1Dos16Mode>0</UserProg1Dos16Mode> + <UserProg2Dos16Mode>0</UserProg2Dos16Mode> + </AfterMake> + <SelectedForBatchBuild>0</SelectedForBatchBuild> + <SVCSIdString></SVCSIdString> + </TargetCommonOption> + <CommonProperty> + <UseCPPCompiler>0</UseCPPCompiler> + <RVCTCodeConst>0</RVCTCodeConst> + <RVCTZI>0</RVCTZI> + <RVCTOtherData>0</RVCTOtherData> + <ModuleSelection>0</ModuleSelection> + <IncludeInBuild>1</IncludeInBuild> + <AlwaysBuild>0</AlwaysBuild> + <GenerateAssemblyFile>0</GenerateAssemblyFile> + <AssembleAssemblyFile>0</AssembleAssemblyFile> + <PublicsOnly>0</PublicsOnly> + <StopOnExitCode>3</StopOnExitCode> + <CustomArgument></CustomArgument> + <IncludeLibraryModules></IncludeLibraryModules> + </CommonProperty> + <DllOption> + <SimDllName>SARMCM3.DLL</SimDllName> + <SimDllArguments></SimDllArguments> + <SimDlgDll>DARMCM1.DLL</SimDlgDll> + <SimDlgDllArguments></SimDlgDllArguments> + <TargetDllName>SARMCM3.DLL</TargetDllName> + <TargetDllArguments></TargetDllArguments> + <TargetDlgDll>TARMCM1.DLL</TargetDlgDll> + <TargetDlgDllArguments></TargetDlgDllArguments> + </DllOption> + <DebugOption> + <OPTHX> + <HexSelection>1</HexSelection> + <HexRangeLowAddress>0</HexRangeLowAddress> + <HexRangeHighAddress>0</HexRangeHighAddress> + <HexOffset>0</HexOffset> + <Oh166RecLen>16</Oh166RecLen> + </OPTHX> + <Simulator> + <UseSimulator>1</UseSimulator> + <LoadApplicationAtStartup>1</LoadApplicationAtStartup> + <RunToMain>1</RunToMain> + <RestoreBreakpoints>1</RestoreBreakpoints> + <RestoreWatchpoints>1</RestoreWatchpoints> + <RestoreMemoryDisplay>1</RestoreMemoryDisplay> + <RestoreFunctions>1</RestoreFunctions> + <RestoreToolbox>1</RestoreToolbox> + <LimitSpeedToRealTime>0</LimitSpeedToRealTime> + </Simulator> + <Target> + <UseTarget>0</UseTarget> + <LoadApplicationAtStartup>1</LoadApplicationAtStartup> + <RunToMain>0</RunToMain> + <RestoreBreakpoints>1</RestoreBreakpoints> + <RestoreWatchpoints>1</RestoreWatchpoints> + <RestoreMemoryDisplay>1</RestoreMemoryDisplay> + <RestoreFunctions>0</RestoreFunctions> + <RestoreToolbox>1</RestoreToolbox> + <RestoreTracepoints>0</RestoreTracepoints> + </Target> + <RunDebugAfterBuild>0</RunDebugAfterBuild> + <TargetSelection>-1</TargetSelection> + <SimDlls> + <CpuDll></CpuDll> + <CpuDllArguments></CpuDllArguments> + <PeripheralDll></PeripheralDll> + <PeripheralDllArguments></PeripheralDllArguments> + <InitializationFile></InitializationFile> + </SimDlls> + <TargetDlls> + <CpuDll></CpuDll> + <CpuDllArguments></CpuDllArguments> + <PeripheralDll></PeripheralDll> + <PeripheralDllArguments></PeripheralDllArguments> + <InitializationFile></InitializationFile> + <Driver></Driver> + </TargetDlls> + </DebugOption> + <Utilities> + <Flash1> + <UseTargetDll>0</UseTargetDll> + <UseExternalTool>0</UseExternalTool> + <RunIndependent>0</RunIndependent> + <UpdateFlashBeforeDebugging>0</UpdateFlashBeforeDebugging> + <Capability>0</Capability> + <DriverSelection>-1</DriverSelection> + </Flash1> + <Flash2></Flash2> + <Flash3></Flash3> + <Flash4></Flash4> + </Utilities> + <TargetArmAds> + <ArmAdsMisc> + <GenerateListings>0</GenerateListings> + <asHll>1</asHll> + <asAsm>1</asAsm> + <asMacX>1</asMacX> + <asSyms>1</asSyms> + <asFals>1</asFals> + <asDbgD>1</asDbgD> + <asForm>1</asForm> + <ldLst>0</ldLst> + <ldmm>1</ldmm> + <ldXref>1</ldXref> + <BigEnd>0</BigEnd> + <AdsALst>1</AdsALst> + <AdsACrf>1</AdsACrf> + <AdsANop>0</AdsANop> + <AdsANot>0</AdsANot> + <AdsLLst>1</AdsLLst> + <AdsLmap>1</AdsLmap> + <AdsLcgr>1</AdsLcgr> + <AdsLsym>1</AdsLsym> + <AdsLszi>1</AdsLszi> + <AdsLtoi>1</AdsLtoi> + <AdsLsun>1</AdsLsun> + <AdsLven>1</AdsLven> + <AdsLsxf>1</AdsLsxf> + <RvctClst>0</RvctClst> + <GenPPlst>0</GenPPlst> + <AdsCpuType>"Cortex-M0"</AdsCpuType> + <RvctDeviceName></RvctDeviceName> + <mOS>0</mOS> + <uocRom>0</uocRom> + <uocRam>0</uocRam> + <hadIROM>0</hadIROM> + <hadIRAM>0</hadIRAM> + <hadXRAM>0</hadXRAM> + <uocXRam>0</uocXRam> + <RvdsVP>0</RvdsVP> + <hadIRAM2>0</hadIRAM2> + <hadIROM2>0</hadIROM2> + <StupSel>1</StupSel> + <useUlib>0</useUlib> + <EndSel>1</EndSel> + <uLtcg>0</uLtcg> + <RoSelD>0</RoSelD> + <RwSelD>5</RwSelD> + <CodeSel>0</CodeSel> + <OptFeed>0</OptFeed> + <NoZi1>0</NoZi1> + <NoZi2>0</NoZi2> + <NoZi3>0</NoZi3> + <NoZi4>0</NoZi4> + <NoZi5>0</NoZi5> + <Ro1Chk>1</Ro1Chk> + <Ro2Chk>0</Ro2Chk> + <Ro3Chk>0</Ro3Chk> + <Ir1Chk>0</Ir1Chk> + <Ir2Chk>0</Ir2Chk> + <Ra1Chk>1</Ra1Chk> + <Ra2Chk>0</Ra2Chk> + <Ra3Chk>0</Ra3Chk> + <Im1Chk>0</Im1Chk> + <Im2Chk>0</Im2Chk> + <OnChipMemories> + <Ocm1> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </Ocm1> + <Ocm2> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </Ocm2> + <Ocm3> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </Ocm3> + <Ocm4> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </Ocm4> + <Ocm5> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </Ocm5> + <Ocm6> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </Ocm6> + <IRAM> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </IRAM> + <IROM> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </IROM> + <XRAM> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </XRAM> + <OCR_RVCT1> + <Type>1</Type> + <StartAddress>0x0</StartAddress> + <Size>0x10000</Size> + </OCR_RVCT1> + <OCR_RVCT2> + <Type>1</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </OCR_RVCT2> + <OCR_RVCT3> + <Type>1</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </OCR_RVCT3> + <OCR_RVCT4> + <Type>1</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </OCR_RVCT4> + <OCR_RVCT5> + <Type>1</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </OCR_RVCT5> + <OCR_RVCT6> + <Type>0</Type> + <StartAddress>0x20000000</StartAddress> + <Size>0x10000</Size> + </OCR_RVCT6> + <OCR_RVCT7> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </OCR_RVCT7> + <OCR_RVCT8> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </OCR_RVCT8> + <OCR_RVCT9> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </OCR_RVCT9> + <OCR_RVCT10> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </OCR_RVCT10> + </OnChipMemories> + <RvctStartVector></RvctStartVector> + </ArmAdsMisc> + <Cads> + <interw>1</interw> + <Optim>3</Optim> + <oTime>0</oTime> + <SplitLS>0</SplitLS> + <OneElfS>0</OneElfS> + <Strict>0</Strict> + <EnumInt>0</EnumInt> + <PlainCh>0</PlainCh> + <Ropi>0</Ropi> + <Rwpi>0</Rwpi> + <wLevel>0</wLevel> + <uThumb>0</uThumb> + <uSurpInc>0</uSurpInc> + <VariousControls> + <MiscControls></MiscControls> + <Define>CORTEX_M0</Define> + <Undefine></Undefine> + <IncludePath>..\..\..\..\software\cmsis\CMSIS\Include; ..\..\..\..\software\cmsis\Device\ARM\CMSDK_CM0\Include; ..\..\..\..\software\common\retarget</IncludePath> + </VariousControls> + </Cads> + <Aads> + <interw>1</interw> + <Ropi>0</Ropi> + <Rwpi>0</Rwpi> + <thumb>0</thumb> + <SplitLS>0</SplitLS> + <SwStkChk>0</SwStkChk> + <NoWarn>0</NoWarn> + <uSurpInc>0</uSurpInc> + <VariousControls> + <MiscControls></MiscControls> + <Define></Define> + <Undefine></Undefine> + <IncludePath></IncludePath> + </VariousControls> + </Aads> + <LDads> + <umfTarg>1</umfTarg> + <Ropi>0</Ropi> + <Rwpi>0</Rwpi> + <noStLib>0</noStLib> + <RepFail>1</RepFail> + <useFile>0</useFile> + <TextAddressRange>0x00000000</TextAddressRange> + <DataAddressRange>0x00000000</DataAddressRange> + <ScatterFile></ScatterFile> + <IncludeLibs></IncludeLibs> + <IncludeLibsPath></IncludeLibsPath> + <Misc></Misc> + <LinkerInputFile></LinkerInputFile> + <DisabledWarnings></DisabledWarnings> + </LDads> + </TargetArmAds> + </TargetOption> + <Groups> + <Group> + <GroupName>Startup</GroupName> + <Files> + <File> + <FileName>startup_CMSDK_CM0.s</FileName> + <FileType>2</FileType> + <FilePath>..\..\..\..\software\cmsis\Device\ARM\CMSDK_CM0\Source\ARM\startup_CMSDK_CM0.s</FilePath> + </File> + </Files> + </Group> + <Group> + <GroupName>Application</GroupName> + <Files> + <File> + <FileName>interrupt_demo.c</FileName> + <FileType>1</FileType> + <FilePath>..\..\..\..\software\common\demos\interrupt_demo.c</FilePath> + </File> + <File> + <FileName>retarget.c</FileName> + <FileType>1</FileType> + <FilePath>..\..\..\..\software\common\retarget\retarget.c</FilePath> + </File> + <File> + <FileName>uart_stdout.c</FileName> + <FileType>1</FileType> + <FilePath>..\..\..\..\software\common\retarget\uart_stdout.c</FilePath> + </File> + <File> + <FileName>CMSDK_driver.c</FileName> + <FileType>1</FileType> + <FilePath>..\..\..\..\software\cmsis\Device\ARM\CMSDK_CM0\Source\CMSDK_driver.c</FilePath> + </File> + </Files> + </Group> + <Group> + <GroupName>System</GroupName> + <Files> + <File> + <FileName>system_CMSDK_CM0.c</FileName> + <FileType>1</FileType> + <FilePath>..\..\..\..\software\cmsis\Device\ARM\CMSDK_CM0\Source\system_CMSDK_CM0.c</FilePath> + </File> + </Files> + </Group> + </Groups> + </Target> + </Targets> + +</Project> diff --git a/Cortex-M0/nanosoc/systems/mcu/testcodes/interrupt_demo/interrupt_demo_cm0p.uvopt b/Cortex-M0/nanosoc/systems/mcu/testcodes/interrupt_demo/interrupt_demo_cm0p.uvopt new file mode 100644 index 0000000..d09b1c7 --- /dev/null +++ b/Cortex-M0/nanosoc/systems/mcu/testcodes/interrupt_demo/interrupt_demo_cm0p.uvopt @@ -0,0 +1,258 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no" ?> +<ProjectOpt xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="project_opt.xsd"> + + <SchemaVersion>1.0</SchemaVersion> + + <Header>### uVision Project, (C) Keil Software</Header> + + <Extensions> + <cExt>*.c</cExt> + <aExt>*.s*; *.src; *.a*</aExt> + <oExt>*.obj</oExt> + <lExt>*.lib</lExt> + <tExt>*.txt; *.h; *.inc</tExt> + <pExt>*.plm</pExt> + <CppX>*.cpp</CppX> + </Extensions> + + <DaveTm> + <dwLowDateTime>0</dwLowDateTime> + <dwHighDateTime>0</dwHighDateTime> + </DaveTm> + + <Target> + <TargetName>Debug</TargetName> + <ToolsetNumber>0x4</ToolsetNumber> + <ToolsetName>ARM-ADS</ToolsetName> + <TargetOption> + <CLKADS>50000000</CLKADS> + <OPTTT> + <gFlags>1</gFlags> + <BeepAtEnd>1</BeepAtEnd> + <RunSim>1</RunSim> + <RunTarget>0</RunTarget> + </OPTTT> + <OPTHX> + <HexSelection>1</HexSelection> + <FlashByte>65535</FlashByte> + <HexRangeLowAddress>0</HexRangeLowAddress> + <HexRangeHighAddress>0</HexRangeHighAddress> + <HexOffset>0</HexOffset> + </OPTHX> + <OPTLEX> + <PageWidth>79</PageWidth> + <PageLength>66</PageLength> + <TabStop>8</TabStop> + <ListingPath>.\</ListingPath> + </OPTLEX> + <ListingPage> + <CreateCListing>1</CreateCListing> + <CreateAListing>1</CreateAListing> + <CreateLListing>1</CreateLListing> + <CreateIListing>0</CreateIListing> + <AsmCond>1</AsmCond> + <AsmSymb>1</AsmSymb> + <AsmXref>0</AsmXref> + <CCond>1</CCond> + <CCode>0</CCode> + <CListInc>0</CListInc> + <CSymb>0</CSymb> + <LinkerCodeListing>0</LinkerCodeListing> + </ListingPage> + <OPTXL> + <LMap>1</LMap> + <LComments>1</LComments> + <LGenerateSymbols>1</LGenerateSymbols> + <LLibSym>1</LLibSym> + <LLines>1</LLines> + <LLocSym>1</LLocSym> + <LPubSym>1</LPubSym> + <LXref>0</LXref> + <LExpSel>0</LExpSel> + </OPTXL> + <OPTFL> + <tvExp>1</tvExp> + <tvExpOptDlg>0</tvExpOptDlg> + <IsCurrentTarget>1</IsCurrentTarget> + </OPTFL> + <CpuCode>255</CpuCode> + <DllOpt> + <SimDllName>SARMCM3.DLL</SimDllName> + <SimDllArguments></SimDllArguments> + <SimDlgDllName>DARMCM1.DLL</SimDlgDllName> + <SimDlgDllArguments></SimDlgDllArguments> + <TargetDllName>SARMCM3.DLL</TargetDllName> + <TargetDllArguments></TargetDllArguments> + <TargetDlgDllName>TARMCM1.DLL</TargetDlgDllName> + <TargetDlgDllArguments></TargetDlgDllArguments> + </DllOpt> + <DebugOpt> + <uSim>1</uSim> + <uTrg>0</uTrg> + <sLdApp>1</sLdApp> + <sGomain>1</sGomain> + <sRbreak>1</sRbreak> + <sRwatch>1</sRwatch> + <sRmem>1</sRmem> + <sRfunc>1</sRfunc> + <sRbox>1</sRbox> + <tLdApp>1</tLdApp> + <tGomain>0</tGomain> + <tRbreak>1</tRbreak> + <tRwatch>1</tRwatch> + <tRmem>1</tRmem> + <tRfunc>0</tRfunc> + <tRbox>1</tRbox> + <sRunDeb>0</sRunDeb> + <sLrtime>0</sLrtime> + <nTsel>-1</nTsel> + <sDll></sDll> + <sDllPa></sDllPa> + <sDlgDll></sDlgDll> + <sDlgPa></sDlgPa> + <sIfile></sIfile> + <tDll></tDll> + <tDllPa></tDllPa> + <tDlgDll></tDlgDll> + <tDlgPa></tDlgPa> + <tIfile></tIfile> + <pMon></pMon> + </DebugOpt> + <Breakpoint/> + <DebugFlag> + <trace>0</trace> + <periodic>1</periodic> + <aLwin>0</aLwin> + <aCover>0</aCover> + <aSer1>0</aSer1> + <aSer2>0</aSer2> + <aPa>0</aPa> + <viewmode>0</viewmode> + <vrSel>0</vrSel> + <aSym>0</aSym> + <aTbox>0</aTbox> + <AscS1>0</AscS1> + <AscS2>0</AscS2> + <AscS3>0</AscS3> + <aSer3>0</aSer3> + <eProf>0</eProf> + <aLa>0</aLa> + <aPa1>0</aPa1> + <AscS4>0</AscS4> + <aSer4>0</aSer4> + <StkLoc>0</StkLoc> + <TrcWin>0</TrcWin> + <newCpu>0</newCpu> + <uProt>0</uProt> + </DebugFlag> + <LintExecutable></LintExecutable> + <LintConfigFile></LintConfigFile> + </TargetOption> + </Target> + + <Group> + <GroupName>Startup</GroupName> + <tvExp>1</tvExp> + <tvExpOptDlg>0</tvExpOptDlg> + <cbSel>0</cbSel> + <File> + <GroupNumber>1</GroupNumber> + <FileNumber>1</FileNumber> + <FileType>2</FileType> + <tvExp>0</tvExp> + <Focus>0</Focus> + <ColumnNumber>0</ColumnNumber> + <tvExpOptDlg>0</tvExpOptDlg> + <TopLine>0</TopLine> + <CurrentLine>0</CurrentLine> + <bDave2>0</bDave2> + <PathWithFileName>..\..\..\..\software\cmsis\Device\ARM\CMSDK_CM0plus\Source\ARM\startup_CMSDK_CM0plus.s</PathWithFileName> + <FilenameWithoutPath>startup_CMSDK_CM0plus.s</FilenameWithoutPath> + </File> + </Group> + + <Group> + <GroupName>Application</GroupName> + <tvExp>1</tvExp> + <tvExpOptDlg>0</tvExpOptDlg> + <cbSel>0</cbSel> + <File> + <GroupNumber>2</GroupNumber> + <FileNumber>2</FileNumber> + <FileType>1</FileType> + <tvExp>0</tvExp> + <Focus>0</Focus> + <ColumnNumber>0</ColumnNumber> + <tvExpOptDlg>0</tvExpOptDlg> + <TopLine>0</TopLine> + <CurrentLine>0</CurrentLine> + <bDave2>0</bDave2> + <PathWithFileName>..\..\..\..\software\common\demos\interrupt_demo.c</PathWithFileName> + <FilenameWithoutPath>interrupt_demo.c</FilenameWithoutPath> + </File> + <File> + <GroupNumber>2</GroupNumber> + <FileNumber>3</FileNumber> + <FileType>1</FileType> + <tvExp>0</tvExp> + <Focus>0</Focus> + <ColumnNumber>0</ColumnNumber> + <tvExpOptDlg>0</tvExpOptDlg> + <TopLine>0</TopLine> + <CurrentLine>0</CurrentLine> + <bDave2>0</bDave2> + <PathWithFileName>..\..\..\..\software\common\retarget\retarget.c</PathWithFileName> + <FilenameWithoutPath>retarget.c</FilenameWithoutPath> + </File> + <File> + <GroupNumber>2</GroupNumber> + <FileNumber>4</FileNumber> + <FileType>1</FileType> + <tvExp>0</tvExp> + <Focus>0</Focus> + <ColumnNumber>0</ColumnNumber> + <tvExpOptDlg>0</tvExpOptDlg> + <TopLine>0</TopLine> + <CurrentLine>0</CurrentLine> + <bDave2>0</bDave2> + <PathWithFileName>..\..\..\..\software\common\retarget\uart_stdout.c</PathWithFileName> + <FilenameWithoutPath>uart_stdout.c</FilenameWithoutPath> + </File> + <File> + <GroupNumber>2</GroupNumber> + <FileNumber>5</FileNumber> + <FileType>1</FileType> + <tvExp>0</tvExp> + <Focus>0</Focus> + <ColumnNumber>0</ColumnNumber> + <tvExpOptDlg>0</tvExpOptDlg> + <TopLine>0</TopLine> + <CurrentLine>0</CurrentLine> + <bDave2>0</bDave2> + <PathWithFileName>..\..\..\..\software\cmsis\Device\ARM\CMSDK_CM0plus\Source\CMSDK_driver.c</PathWithFileName> + <FilenameWithoutPath>CMSDK_driver.c</FilenameWithoutPath> + </File> + </Group> + + <Group> + <GroupName>System</GroupName> + <tvExp>1</tvExp> + <tvExpOptDlg>0</tvExpOptDlg> + <cbSel>0</cbSel> + <File> + <GroupNumber>3</GroupNumber> + <FileNumber>6</FileNumber> + <FileType>1</FileType> + <tvExp>0</tvExp> + <Focus>0</Focus> + <ColumnNumber>0</ColumnNumber> + <tvExpOptDlg>0</tvExpOptDlg> + <TopLine>0</TopLine> + <CurrentLine>0</CurrentLine> + <bDave2>0</bDave2> + <PathWithFileName>..\..\..\..\software\cmsis\Device\ARM\CMSDK_CM0plus\Source\system_CMSDK_CM0plus.c</PathWithFileName> + <FilenameWithoutPath>system_CMSDK_CM0plus.c</FilenameWithoutPath> + </File> + </Group> + +</ProjectOpt> diff --git a/Cortex-M0/nanosoc/systems/mcu/testcodes/interrupt_demo/interrupt_demo_cm0p.uvproj b/Cortex-M0/nanosoc/systems/mcu/testcodes/interrupt_demo/interrupt_demo_cm0p.uvproj new file mode 100644 index 0000000..58b9dd6 --- /dev/null +++ b/Cortex-M0/nanosoc/systems/mcu/testcodes/interrupt_demo/interrupt_demo_cm0p.uvproj @@ -0,0 +1,437 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no" ?> +<Project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="project_proj.xsd"> + + <SchemaVersion>1.1</SchemaVersion> + + <Header>### uVision Project, (C) Keil Software</Header> + + <Targets> + <Target> + <TargetName>Debug</TargetName> + <ToolsetNumber>0x4</ToolsetNumber> + <ToolsetName>ARM-ADS</ToolsetName> + <TargetOption> + <TargetCommonOption> + <Device>Cortex-M0+</Device> + <Vendor>ARM</Vendor> + <Cpu>CLOCK(12000000) CPUTYPE("Cortex-M0+") ESEL ELITTLE</Cpu> + <FlashUtilSpec></FlashUtilSpec> + <StartupFile></StartupFile> + <FlashDriverDll></FlashDriverDll> + <DeviceId>6268</DeviceId> + <RegisterFile></RegisterFile> + <MemoryEnv></MemoryEnv> + <Cmp></Cmp> + <Asm></Asm> + <Linker></Linker> + <OHString></OHString> + <InfinionOptionDll></InfinionOptionDll> + <SLE66CMisc></SLE66CMisc> + <SLE66AMisc></SLE66AMisc> + <SLE66LinkerMisc></SLE66LinkerMisc> + <SFDFile></SFDFile> + <UseEnv>0</UseEnv> + <BinPath></BinPath> + <IncludePath></IncludePath> + <LibPath></LibPath> + <RegisterFilePath></RegisterFilePath> + <DBRegisterFilePath></DBRegisterFilePath> + <TargetStatus> + <Error>0</Error> + <ExitCodeStop>0</ExitCodeStop> + <ButtonStop>0</ButtonStop> + <NotGenerated>0</NotGenerated> + <InvalidFlash>1</InvalidFlash> + </TargetStatus> + <OutputDirectory>.\</OutputDirectory> + <OutputName>interrupt_demo</OutputName> + <CreateExecutable>1</CreateExecutable> + <CreateLib>0</CreateLib> + <CreateHexFile>0</CreateHexFile> + <DebugInformation>1</DebugInformation> + <BrowseInformation>1</BrowseInformation> + <ListingPath>.\</ListingPath> + <HexFormatSelection>1</HexFormatSelection> + <Merge32K>0</Merge32K> + <CreateBatchFile>0</CreateBatchFile> + <BeforeCompile> + <RunUserProg1>0</RunUserProg1> + <RunUserProg2>0</RunUserProg2> + <UserProg1Name></UserProg1Name> + <UserProg2Name></UserProg2Name> + <UserProg1Dos16Mode>0</UserProg1Dos16Mode> + <UserProg2Dos16Mode>0</UserProg2Dos16Mode> + <nStopU1X>0</nStopU1X> + <nStopU2X>0</nStopU2X> + </BeforeCompile> + <BeforeMake> + <RunUserProg1>0</RunUserProg1> + <RunUserProg2>0</RunUserProg2> + <UserProg1Name></UserProg1Name> + <UserProg2Name></UserProg2Name> + <UserProg1Dos16Mode>0</UserProg1Dos16Mode> + <UserProg2Dos16Mode>0</UserProg2Dos16Mode> + </BeforeMake> + <AfterMake> + <RunUserProg1>1</RunUserProg1> + <RunUserProg2>0</RunUserProg2> + <UserProg1Name>$K\ARM\ARMCC\BIN\fromelf.exe #L --vhx --8x1 --output interrupt_demo.hex</UserProg1Name> + <UserProg2Name></UserProg2Name> + <UserProg1Dos16Mode>0</UserProg1Dos16Mode> + <UserProg2Dos16Mode>0</UserProg2Dos16Mode> + </AfterMake> + <SelectedForBatchBuild>0</SelectedForBatchBuild> + <SVCSIdString></SVCSIdString> + </TargetCommonOption> + <CommonProperty> + <UseCPPCompiler>0</UseCPPCompiler> + <RVCTCodeConst>0</RVCTCodeConst> + <RVCTZI>0</RVCTZI> + <RVCTOtherData>0</RVCTOtherData> + <ModuleSelection>0</ModuleSelection> + <IncludeInBuild>1</IncludeInBuild> + <AlwaysBuild>0</AlwaysBuild> + <GenerateAssemblyFile>0</GenerateAssemblyFile> + <AssembleAssemblyFile>0</AssembleAssemblyFile> + <PublicsOnly>0</PublicsOnly> + <StopOnExitCode>3</StopOnExitCode> + <CustomArgument></CustomArgument> + <IncludeLibraryModules></IncludeLibraryModules> + </CommonProperty> + <DllOption> + <SimDllName>SARMCM3.DLL</SimDllName> + <SimDllArguments></SimDllArguments> + <SimDlgDll>DARMCM1.DLL</SimDlgDll> + <SimDlgDllArguments></SimDlgDllArguments> + <TargetDllName>SARMCM3.DLL</TargetDllName> + <TargetDllArguments></TargetDllArguments> + <TargetDlgDll>TARMCM1.DLL</TargetDlgDll> + <TargetDlgDllArguments></TargetDlgDllArguments> + </DllOption> + <DebugOption> + <OPTHX> + <HexSelection>1</HexSelection> + <HexRangeLowAddress>0</HexRangeLowAddress> + <HexRangeHighAddress>0</HexRangeHighAddress> + <HexOffset>0</HexOffset> + <Oh166RecLen>16</Oh166RecLen> + </OPTHX> + <Simulator> + <UseSimulator>1</UseSimulator> + <LoadApplicationAtStartup>1</LoadApplicationAtStartup> + <RunToMain>1</RunToMain> + <RestoreBreakpoints>1</RestoreBreakpoints> + <RestoreWatchpoints>1</RestoreWatchpoints> + <RestoreMemoryDisplay>1</RestoreMemoryDisplay> + <RestoreFunctions>1</RestoreFunctions> + <RestoreToolbox>1</RestoreToolbox> + <LimitSpeedToRealTime>0</LimitSpeedToRealTime> + </Simulator> + <Target> + <UseTarget>0</UseTarget> + <LoadApplicationAtStartup>1</LoadApplicationAtStartup> + <RunToMain>0</RunToMain> + <RestoreBreakpoints>1</RestoreBreakpoints> + <RestoreWatchpoints>1</RestoreWatchpoints> + <RestoreMemoryDisplay>1</RestoreMemoryDisplay> + <RestoreFunctions>0</RestoreFunctions> + <RestoreToolbox>1</RestoreToolbox> + </Target> + <RunDebugAfterBuild>0</RunDebugAfterBuild> + <TargetSelection>-1</TargetSelection> + <SimDlls> + <CpuDll></CpuDll> + <CpuDllArguments></CpuDllArguments> + <PeripheralDll></PeripheralDll> + <PeripheralDllArguments></PeripheralDllArguments> + <InitializationFile></InitializationFile> + </SimDlls> + <TargetDlls> + <CpuDll></CpuDll> + <CpuDllArguments></CpuDllArguments> + <PeripheralDll></PeripheralDll> + <PeripheralDllArguments></PeripheralDllArguments> + <InitializationFile></InitializationFile> + <Driver></Driver> + </TargetDlls> + </DebugOption> + <Utilities> + <Flash1> + <UseTargetDll>0</UseTargetDll> + <UseExternalTool>0</UseExternalTool> + <RunIndependent>0</RunIndependent> + <UpdateFlashBeforeDebugging>0</UpdateFlashBeforeDebugging> + <Capability>0</Capability> + <DriverSelection>-1</DriverSelection> + </Flash1> + <Flash2></Flash2> + <Flash3></Flash3> + <Flash4></Flash4> + </Utilities> + <TargetArmAds> + <ArmAdsMisc> + <GenerateListings>0</GenerateListings> + <asHll>1</asHll> + <asAsm>1</asAsm> + <asMacX>1</asMacX> + <asSyms>1</asSyms> + <asFals>1</asFals> + <asDbgD>1</asDbgD> + <asForm>1</asForm> + <ldLst>0</ldLst> + <ldmm>1</ldmm> + <ldXref>1</ldXref> + <BigEnd>0</BigEnd> + <AdsALst>1</AdsALst> + <AdsACrf>1</AdsACrf> + <AdsANop>0</AdsANop> + <AdsANot>0</AdsANot> + <AdsLLst>1</AdsLLst> + <AdsLmap>1</AdsLmap> + <AdsLcgr>1</AdsLcgr> + <AdsLsym>1</AdsLsym> + <AdsLszi>1</AdsLszi> + <AdsLtoi>1</AdsLtoi> + <AdsLsun>1</AdsLsun> + <AdsLven>1</AdsLven> + <AdsLsxf>1</AdsLsxf> + <RvctClst>0</RvctClst> + <GenPPlst>0</GenPPlst> + <AdsCpuType>"Cortex-M0+"</AdsCpuType> + <RvctDeviceName></RvctDeviceName> + <mOS>0</mOS> + <uocRom>0</uocRom> + <uocRam>0</uocRam> + <hadIROM>0</hadIROM> + <hadIRAM>0</hadIRAM> + <hadXRAM>0</hadXRAM> + <uocXRam>0</uocXRam> + <RvdsVP>0</RvdsVP> + <hadIRAM2>0</hadIRAM2> + <hadIROM2>0</hadIROM2> + <StupSel>1</StupSel> + <useUlib>0</useUlib> + <EndSel>1</EndSel> + <uLtcg>0</uLtcg> + <RoSelD>0</RoSelD> + <RwSelD>5</RwSelD> + <CodeSel>0</CodeSel> + <OptFeed>0</OptFeed> + <NoZi1>0</NoZi1> + <NoZi2>0</NoZi2> + <NoZi3>0</NoZi3> + <NoZi4>0</NoZi4> + <NoZi5>0</NoZi5> + <Ro1Chk>1</Ro1Chk> + <Ro2Chk>0</Ro2Chk> + <Ro3Chk>0</Ro3Chk> + <Ir1Chk>0</Ir1Chk> + <Ir2Chk>0</Ir2Chk> + <Ra1Chk>1</Ra1Chk> + <Ra2Chk>0</Ra2Chk> + <Ra3Chk>0</Ra3Chk> + <Im1Chk>0</Im1Chk> + <Im2Chk>0</Im2Chk> + <OnChipMemories> + <Ocm1> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </Ocm1> + <Ocm2> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </Ocm2> + <Ocm3> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </Ocm3> + <Ocm4> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </Ocm4> + <Ocm5> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </Ocm5> + <Ocm6> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </Ocm6> + <IRAM> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </IRAM> + <IROM> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </IROM> + <XRAM> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </XRAM> + <OCR_RVCT1> + <Type>1</Type> + <StartAddress>0x0</StartAddress> + <Size>0x10000</Size> + </OCR_RVCT1> + <OCR_RVCT2> + <Type>1</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </OCR_RVCT2> + <OCR_RVCT3> + <Type>1</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </OCR_RVCT3> + <OCR_RVCT4> + <Type>1</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </OCR_RVCT4> + <OCR_RVCT5> + <Type>1</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </OCR_RVCT5> + <OCR_RVCT6> + <Type>0</Type> + <StartAddress>0x20000000</StartAddress> + <Size>0x10000</Size> + </OCR_RVCT6> + <OCR_RVCT7> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </OCR_RVCT7> + <OCR_RVCT8> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </OCR_RVCT8> + <OCR_RVCT9> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </OCR_RVCT9> + <OCR_RVCT10> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </OCR_RVCT10> + </OnChipMemories> + <RvctStartVector></RvctStartVector> + </ArmAdsMisc> + <Cads> + <interw>1</interw> + <Optim>3</Optim> + <oTime>0</oTime> + <SplitLS>0</SplitLS> + <OneElfS>0</OneElfS> + <Strict>0</Strict> + <EnumInt>0</EnumInt> + <PlainCh>0</PlainCh> + <Ropi>0</Ropi> + <Rwpi>0</Rwpi> + <wLevel>0</wLevel> + <uThumb>0</uThumb> + <VariousControls> + <MiscControls></MiscControls> + <Define>CORTEX_M0PLUS</Define> + <Undefine></Undefine> + <IncludePath>..\..\..\..\software\cmsis\CMSIS\Include; ..\..\..\..\software\cmsis\Device\ARM\CMSDK_CM0plus\Include; ..\..\..\..\software\common\retarget</IncludePath> + </VariousControls> + </Cads> + <Aads> + <interw>1</interw> + <Ropi>0</Ropi> + <Rwpi>0</Rwpi> + <thumb>0</thumb> + <SplitLS>0</SplitLS> + <SwStkChk>0</SwStkChk> + <NoWarn>0</NoWarn> + <VariousControls> + <MiscControls></MiscControls> + <Define></Define> + <Undefine></Undefine> + <IncludePath></IncludePath> + </VariousControls> + </Aads> + <LDads> + <umfTarg>1</umfTarg> + <Ropi>0</Ropi> + <Rwpi>0</Rwpi> + <noStLib>0</noStLib> + <RepFail>1</RepFail> + <useFile>0</useFile> + <TextAddressRange>0x00000000</TextAddressRange> + <DataAddressRange>0x00000000</DataAddressRange> + <ScatterFile></ScatterFile> + <IncludeLibs></IncludeLibs> + <IncludeLibsPath></IncludeLibsPath> + <Misc></Misc> + <LinkerInputFile></LinkerInputFile> + <DisabledWarnings></DisabledWarnings> + </LDads> + </TargetArmAds> + </TargetOption> + <Groups> + <Group> + <GroupName>Startup</GroupName> + <Files> + <File> + <FileName>startup_CMSDK_CM0plus.s</FileName> + <FileType>2</FileType> + <FilePath>..\..\..\..\software\cmsis\Device\ARM\CMSDK_CM0plus\Source\ARM\startup_CMSDK_CM0plus.s</FilePath> + </File> + </Files> + </Group> + <Group> + <GroupName>Application</GroupName> + <Files> + <File> + <FileName>interrupt_demo.c</FileName> + <FileType>1</FileType> + <FilePath>..\..\..\..\software\common\demos\interrupt_demo.c</FilePath> + </File> + <File> + <FileName>retarget.c</FileName> + <FileType>1</FileType> + <FilePath>..\..\..\..\software\common\retarget\retarget.c</FilePath> + </File> + <File> + <FileName>uart_stdout.c</FileName> + <FileType>1</FileType> + <FilePath>..\..\..\..\software\common\retarget\uart_stdout.c</FilePath> + </File> + <File> + <FileName>CMSDK_driver.c</FileName> + <FileType>1</FileType> + <FilePath>..\..\..\..\software\cmsis\Device\ARM\CMSDK_CM0plus\Source\CMSDK_driver.c</FilePath> + </File> + </Files> + </Group> + <Group> + <GroupName>System</GroupName> + <Files> + <File> + <FileName>system_CMSDK_CM0plus.c</FileName> + <FileType>1</FileType> + <FilePath>..\..\..\..\software\cmsis\Device\ARM\CMSDK_CM0plus\Source\system_CMSDK_CM0plus.c</FilePath> + </File> + </Files> + </Group> + </Groups> + </Target> + </Targets> + +</Project> diff --git a/Cortex-M0/nanosoc/systems/mcu/testcodes/interrupt_demo/makefile b/Cortex-M0/nanosoc/systems/mcu/testcodes/interrupt_demo/makefile new file mode 100644 index 0000000..7966b80 --- /dev/null +++ b/Cortex-M0/nanosoc/systems/mcu/testcodes/interrupt_demo/makefile @@ -0,0 +1,255 @@ +#----------------------------------------------------------------------------- +# The confidential and proprietary information contained in this file may +# only be used by a person authorised under and to the extent permitted +# by a subsisting licensing agreement from Arm Limited or its affiliates. +# +# (C) COPYRIGHT 2010-2013 Arm Limited or its affiliates. +# ALL RIGHTS RESERVED +# +# This entire notice must be reproduced on all copies of this file +# and copies of this file may only be made by a person if such person is +# permitted to do so under the terms of a subsisting license agreement +# from Arm Limited or its affiliates. +# +# SVN Information +# +# Checked In : $Date: 2011-01-25 10:05:56 +0000 (Tue, 25 Jan 2011) $ +# +# Revision : $Revision: 159421 $ +# +# Release Information : Cortex-M System Design Kit-r1p1-00rel0 +#----------------------------------------------------------------------------- +# +# Cortex-M System Design Kit software compilation make file +# +#----------------------------------------------------------------------------- +# +# Configurations +# +# Choose the core instantiated, can be +# - CORTEX_M0 +# - CORTEX_M0PLUS +CPU_PRODUCT = CORTEX_M0PLUS + +# Shared software directory +SOFTWARE_DIR = ../../../../software +CMSIS_DIR = $(SOFTWARE_DIR)/cmsis +CORE_DIR = $(CMSIS_DIR)/CMSIS/Include + +ifeq ($(CPU_PRODUCT),CORTEX_M0PLUS) + DEVICE_DIR = $(CMSIS_DIR)/Device/ARM/CMSDK_CM0plus +else + DEVICE_DIR = $(CMSIS_DIR)/Device/ARM/CMSDK_CM0 +endif + +# Program file +TESTNAME = interrupt_demo + +# Endian Option +COMPILE_BIGEND = 0 + +# Configuration +ifeq ($(CPU_PRODUCT),CORTEX_M0PLUS) + USER_DEFINE = -DCORTEX_M0PLUS +else + USER_DEFINE = -DCORTEX_M0 +endif + +DEPS_LIST = makefile + +# Tool chain : ds5 / gcc / keil +TOOL_CHAIN = ds5 + +ifeq ($(TOOL_CHAIN),ds5) + ifeq ($(CPU_PRODUCT),CORTEX_M0PLUS) + CPU_TYPE = --cpu Cortex-M0plus + else + CPU_TYPE = --cpu Cortex-M0 + endif +endif + +ifeq ($(TOOL_CHAIN),gcc) + ifeq ($(CPU_PRODUCT),CORTEX_M0PLUS) + CPU_TYPE = -mcpu=cortex-m0plus + else + CPU_TYPE = -mcpu=cortex-m0 + endif +endif + +# Startup code directory for DS-5 +ifeq ($(TOOL_CHAIN),ds5) + STARTUP_DIR = $(DEVICE_DIR)/Source/ARM +endif + +# Startup code directory for gcc +ifeq ($(TOOL_CHAIN),gcc) + STARTUP_DIR = $(DEVICE_DIR)/Source/GCC +endif + +ifeq ($(CPU_PRODUCT),CORTEX_M0PLUS) + STARTUP_FILE = startup_CMSDK_CM0plus + SYSTEM_FILE = system_CMSDK_CM0plus +else + STARTUP_FILE = startup_CMSDK_CM0 + SYSTEM_FILE = system_CMSDK_CM0 +endif + +# --------------------------------------------------------------------------------------- +# DS-5 options + +# MicroLIB option +COMPILE_MICROLIB = 0 + +# Small Multiply (Cortex-M0/M0+ has small multiplier option) +COMPILE_SMALLMUL = 0 + +ARM_CC_OPTIONS = -c -O3 -g -Otime $(USER_DEFINE) \ + -I $(DEVICE_DIR)/Include -I $(CORE_DIR) -I $(SOFTWARE_DIR)/common/retarget +ARM_ASM_OPTIONS = -g +ARM_LINK_OPTIONS = "--keep=$(STARTUP_FILE).o(RESET)" "--first=$(STARTUP_FILE).o(RESET)" \ + --rw_base 0x30000000 --ro_base 0x00000000 --map + +ifeq ($(COMPILE_BIGEND),1) + # Big Endian + ARM_CC_OPTIONS += --bigend + ARM_ASM_OPTIONS += --bigend + ARM_LINK_OPTIONS += --be8 +endif + +ifeq ($(COMPILE_MICROLIB),1) + # MicroLIB + ARM_CC_OPTIONS += --library_type=microlib + ARM_ASM_OPTIONS += --library_type=microlib --pd "__MICROLIB SETA 1" + ARM_LINK_OPTIONS += --library_type=microlib +endif + +ifeq ($(COMPILE_SMALLMUL),1) + # In Cortex-M0, small multiply takes 32 cycles + ARM_CC_OPTIONS += --multiply_latency=32 +endif + +# --------------------------------------------------------------------------------------- +# gcc options + +GNG_CC = arm-none-eabi-gcc +GNU_OBJDUMP = arm-none-eabi-objdump +GNU_OBJCOPY = arm-none-eabi-objcopy + +LINKER_SCRIPT_PATH = $(SOFTWARE_DIR)/common/scripts +LINKER_SCRIPT = $(LINKER_SCRIPT_PATH)/cmsdk_cm0.ld + +GNU_CC_FLAGS = -g -O3 -mthumb $(CPU_TYPE) + +ifeq ($(COMPILE_BIGEND),1) + # Big Endian + GNU_CC_FLAGS += -mbig-endian +endif + +# --------------------------------------------------------------------------------------- +all: all_$(TOOL_CHAIN) + +# --------------------------------------------------------------------------------------- +# DS-5 + +all_ds5 : $(TESTNAME).hex $(TESTNAME).lst + +$(TESTNAME).o : $(SOFTWARE_DIR)/common/demos/$(TESTNAME).c $(DEPS_LIST) + armcc $(ARM_CC_OPTIONS) $(CPU_TYPE) $< -o $@ + +$(SYSTEM_FILE).o : $(DEVICE_DIR)/Source/$(SYSTEM_FILE).c $(DEPS_LIST) + armcc $(ARM_CC_OPTIONS) $(CPU_TYPE) $< -o $@ + +retarget.o : $(SOFTWARE_DIR)/common/retarget/retarget.c $(DEPS_LIST) + armcc $(ARM_CC_OPTIONS) $(CPU_TYPE) $< -o $@ + +uart_stdout.o : $(SOFTWARE_DIR)/common/retarget/uart_stdout.c $(DEPS_LIST) + armcc $(ARM_CC_OPTIONS) $(CPU_TYPE) $< -o $@ + +CMSDK_driver.o : $(DEVICE_DIR)/Source/CMSDK_driver.c $(DEPS_LIST) + armcc $(ARM_CC_OPTIONS) $(CPU_TYPE) $< -o $@ + +$(STARTUP_FILE).o : $(STARTUP_DIR)/$(STARTUP_FILE).s $(DEPS_LIST) + armasm $(ARM_ASM_OPTIONS) $(CPU_TYPE) $< -o $@ + +$(TESTNAME).ELF : $(TESTNAME).o $(SYSTEM_FILE).o $(STARTUP_FILE).o retarget.o uart_stdout.o CMSDK_driver.o + armlink $(ARM_LINK_OPTIONS) -o $@ $(TESTNAME).o $(SYSTEM_FILE).o $(STARTUP_FILE).o retarget.o uart_stdout.o CMSDK_driver.o + +$(TESTNAME).hex : $(TESTNAME).ELF + fromelf --vhx --8x1 $< --output $@ + +$(TESTNAME).lst : $(TESTNAME).ELF makefile + fromelf -c -d -e -s $< --output $@ + +# --------------------------------------------------------------------------------------- +# gcc +all_gcc: + $(GNG_CC) $(GNU_CC_FLAGS) $(STARTUP_DIR)/$(STARTUP_FILE).s \ + $(SOFTWARE_DIR)/common/demos/$(TESTNAME).c \ + $(SOFTWARE_DIR)/common/retarget/retarget.c \ + $(SOFTWARE_DIR)/common/retarget/uart_stdout.c \ + $(DEVICE_DIR)/Source/CMSDK_driver.c \ + $(DEVICE_DIR)/Source/$(SYSTEM_FILE).c \ + -I $(DEVICE_DIR)/Include -I $(CORE_DIR) \ + -I $(SOFTWARE_DIR)/common/retarget \ + -L $(LINKER_SCRIPT_PATH) \ + -D__STACK_SIZE=0x200 \ + -D__HEAP_SIZE=0x1000 \ + $(USER_DEFINE) -T $(LINKER_SCRIPT) -o $(TESTNAME).o + # Generate disassembly code + $(GNU_OBJDUMP) -S $(TESTNAME).o > $(TESTNAME).lst + # Generate binary file + $(GNU_OBJCOPY) -S $(TESTNAME).o -O binary $(TESTNAME).bin + # Generate hex file + $(GNU_OBJCOPY) -S $(TESTNAME).o -O verilog $(TESTNAME).hex + +# Note: +# If the version of object copy you are using does not support verilog hex file output, +# you can generate the hex file from binary file using the following command +# od -v -A n -t x1 --width=1 $(TESTNAME).bin > $(TESTNAME).hex + + +# --------------------------------------------------------------------------------------- +# Keil MDK + +all_keil: + @echo "Please compile your project code and press ENTER when ready" + @read dummy + +# --------------------------------------------------------------------------------------- +# Binary + +all_bin: $(TESTNAME).bin + # Generate hex file from binary + od -v -A n -t x1 --width=1 $(TESTNAME).bin > $(TESTNAME).hex + +# --------------------------------------------------------------------------------------- +# Clean + +clean : + @rm -rf *.o + @if [ -e $(TESTNAME).hex ] ; then \ + rm -rf $(TESTNAME).hex ; \ + fi + @if [ -e $(TESTNAME).lst ] ; then \ + rm -rf $(TESTNAME).lst ; \ + fi + @if [ -e $(TESTNAME).ELF ] ; then \ + rm -rf $(TESTNAME).ELF ; \ + fi + @if [ -e $(TESTNAME).bin ] ; then \ + rm -rf $(TESTNAME).bin ; \ + fi + @rm -rf *.crf + @rm -rf *.plg + @rm -rf *.tra + @rm -rf *.htm + @rm -rf *.map + @rm -rf *.dep + @rm -rf *.d + @rm -rf *.lnp + @rm -rf *.bak + @rm -rf *.lst + @rm -rf *.axf + @rm -rf *.sct + @rm -rf *.__i + @rm -rf *._ia diff --git a/Cortex-M0/nanosoc/systems/mcu/testcodes/memory_tests/makefile b/Cortex-M0/nanosoc/systems/mcu/testcodes/memory_tests/makefile new file mode 100644 index 0000000..0f01637 --- /dev/null +++ b/Cortex-M0/nanosoc/systems/mcu/testcodes/memory_tests/makefile @@ -0,0 +1,251 @@ +#----------------------------------------------------------------------------- +# The confidential and proprietary information contained in this file may +# only be used by a person authorised under and to the extent permitted +# by a subsisting licensing agreement from Arm Limited or its affiliates. +# +# (C) COPYRIGHT 2010-2013 Arm Limited or its affiliates. +# ALL RIGHTS RESERVED +# +# This entire notice must be reproduced on all copies of this file +# and copies of this file may only be made by a person if such person is +# permitted to do so under the terms of a subsisting license agreement +# from Arm Limited or its affiliates. +# +# SVN Information +# +# Checked In : $Date: 2017-10-10 15:55:38 +0100 (Tue, 10 Oct 2017) $ +# +# Revision : $Revision: 371321 $ +# +# Release Information : Cortex-M System Design Kit-r1p1-00rel0 +#----------------------------------------------------------------------------- +# +# Cortex-M System Design Kit software compilation make file +# +#----------------------------------------------------------------------------- +# +# Configurations +# +# Choose the core instantiated, can be +# - CORTEX_M0 +# - CORTEX_M0PLUS +CPU_PRODUCT = CORTEX_M0PLUS + +# Shared software directory +SOFTWARE_DIR = ../../../../software +CMSIS_DIR = $(SOFTWARE_DIR)/cmsis +CORE_DIR = $(CMSIS_DIR)/CMSIS/Include + +ifeq ($(CPU_PRODUCT),CORTEX_M0PLUS) + DEVICE_DIR = $(CMSIS_DIR)/Device/ARM/CMSDK_CM0plus +else + DEVICE_DIR = $(CMSIS_DIR)/Device/ARM/CMSDK_CM0 +endif + +# Program file +TESTNAME = memory_tests + +# Endian Option +COMPILE_BIGEND = 0 + + +# Configuration +ifeq ($(CPU_PRODUCT),CORTEX_M0PLUS) + USER_DEFINE = -DCORTEX_M0PLUS +else + USER_DEFINE = -DCORTEX_M0 +endif + +DEPS_LIST = makefile + +# Tool chain : ds5 / gcc / keil +TOOL_CHAIN = ds5 + +ifeq ($(TOOL_CHAIN),ds5) + ifeq ($(CPU_PRODUCT),CORTEX_M0PLUS) + CPU_TYPE = --cpu Cortex-M0plus + else + CPU_TYPE = --cpu Cortex-M0 + endif +endif + +ifeq ($(TOOL_CHAIN),gcc) + ifeq ($(CPU_PRODUCT),CORTEX_M0PLUS) + CPU_TYPE = -mcpu=cortex-m0plus + else + CPU_TYPE = -mcpu=cortex-m0 + endif +endif + +# Startup code directory for DS-5 +ifeq ($(TOOL_CHAIN),ds5) + STARTUP_DIR = $(DEVICE_DIR)/Source/ARM +endif + +# Startup code directory for gcc +ifeq ($(TOOL_CHAIN),gcc) + STARTUP_DIR = $(DEVICE_DIR)/Source/GCC +endif + +ifeq ($(CPU_PRODUCT),CORTEX_M0PLUS) + STARTUP_FILE = startup_CMSDK_CM0plus + SYSTEM_FILE = system_CMSDK_CM0plus +else + STARTUP_FILE = startup_CMSDK_CM0 + SYSTEM_FILE = system_CMSDK_CM0 +endif + +# --------------------------------------------------------------------------------------- +# DS-5 options + +# MicroLIB option +COMPILE_MICROLIB = 0 + +# Small Multiply (Cortex-M0/M0+ has small multiplier option) +COMPILE_SMALLMUL = 0 + +ARM_CC_OPTIONS = -c -O3 -g -Otime $(USER_DEFINE) \ + -I $(DEVICE_DIR)/Include -I $(CORE_DIR) -I $(SOFTWARE_DIR)/common/retarget +ARM_ASM_OPTIONS = -g +ARM_LINK_OPTIONS = "--keep=$(STARTUP_FILE).o(RESET)" "--first=$(STARTUP_FILE).o(RESET)" \ + --rw_base 0x30000000 --ro_base 0x00000000 --map + +ifeq ($(COMPILE_BIGEND),1) + # Big Endian + ARM_CC_OPTIONS += --bigend + ARM_ASM_OPTIONS += --bigend + ARM_LINK_OPTIONS += --be8 +endif + +ifeq ($(COMPILE_MICROLIB),1) + # MicroLIB + ARM_CC_OPTIONS += --library_type=microlib + ARM_ASM_OPTIONS += --library_type=microlib --pd "__MICROLIB SETA 1" + ARM_LINK_OPTIONS += --library_type=microlib +endif + +ifeq ($(COMPILE_SMALLMUL),1) + # In Cortex-M0, small multiply takes 32 cycles + ARM_CC_OPTIONS += --multiply_latency=32 +endif + +# --------------------------------------------------------------------------------------- +# gcc options + +GNG_CC = arm-none-eabi-gcc +GNU_OBJDUMP = arm-none-eabi-objdump +GNU_OBJCOPY = arm-none-eabi-objcopy + +LINKER_SCRIPT_PATH = $(SOFTWARE_DIR)/common/scripts +LINKER_SCRIPT = $(LINKER_SCRIPT_PATH)/cmsdk_cm0.ld + +GNU_CC_FLAGS = -g -O3 -mthumb $(CPU_TYPE) + +ifeq ($(COMPILE_BIGEND),1) + # Big Endian + GNU_CC_FLAGS += -mbig-endian +endif + +# --------------------------------------------------------------------------------------- +all: all_$(TOOL_CHAIN) + +# --------------------------------------------------------------------------------------- +# DS-5 + +all_ds5 : $(TESTNAME).hex $(TESTNAME).lst + +$(TESTNAME).o : $(SOFTWARE_DIR)/common/validation/$(TESTNAME).c $(DEPS_LIST) + armcc $(ARM_CC_OPTIONS) $(CPU_TYPE) $< -o $@ + +$(SYSTEM_FILE).o : $(DEVICE_DIR)/Source/$(SYSTEM_FILE).c $(DEPS_LIST) + armcc $(ARM_CC_OPTIONS) $(CPU_TYPE) $< -o $@ + +retarget.o : $(SOFTWARE_DIR)/common/retarget/retarget.c $(DEPS_LIST) + armcc $(ARM_CC_OPTIONS) $(CPU_TYPE) $< -o $@ + +uart_stdout.o : $(SOFTWARE_DIR)/common/retarget/uart_stdout.c $(DEPS_LIST) + armcc $(ARM_CC_OPTIONS) $(CPU_TYPE) $< -o $@ + +$(STARTUP_FILE).o : $(STARTUP_DIR)/$(STARTUP_FILE).s $(DEPS_LIST) + armasm $(ARM_ASM_OPTIONS) $(CPU_TYPE) $< -o $@ + +$(TESTNAME).ELF : $(TESTNAME).o $(SYSTEM_FILE).o $(STARTUP_FILE).o retarget.o uart_stdout.o + armlink $(ARM_LINK_OPTIONS) -o $@ $(TESTNAME).o $(SYSTEM_FILE).o $(STARTUP_FILE).o retarget.o uart_stdout.o + +$(TESTNAME).hex : $(TESTNAME).ELF + fromelf --vhx --8x1 $< --output $@ + +$(TESTNAME).lst : $(TESTNAME).ELF makefile + fromelf -c -d -e -s $< --output $@ + +# --------------------------------------------------------------------------------------- +# gcc +all_gcc: + $(GNG_CC) $(GNU_CC_FLAGS) $(STARTUP_DIR)/$(STARTUP_FILE).s \ + $(SOFTWARE_DIR)/common/validation/$(TESTNAME).c \ + $(SOFTWARE_DIR)/common/retarget/retarget.c \ + $(SOFTWARE_DIR)/common/retarget/uart_stdout.c \ + $(DEVICE_DIR)/Source/$(SYSTEM_FILE).c \ + -I $(DEVICE_DIR)/Include -I $(CORE_DIR) \ + -I $(SOFTWARE_DIR)/common/retarget \ + -L $(LINKER_SCRIPT_PATH) \ + -D__STACK_SIZE=0x200 \ + -D__HEAP_SIZE=0x1000 \ + $(USER_DEFINE) -T $(LINKER_SCRIPT) -o $(TESTNAME).o + # Generate disassembly code + $(GNU_OBJDUMP) -S $(TESTNAME).o > $(TESTNAME).lst + # Generate binary file + $(GNU_OBJCOPY) -S $(TESTNAME).o -O binary $(TESTNAME).bin + # Generate hex file + $(GNU_OBJCOPY) -S $(TESTNAME).o -O verilog $(TESTNAME).hex + +# Note: +# If the version of object copy you are using does not support verilog hex file output, +# you can generate the hex file from binary file using the following command +# od -v -A n -t x1 --width=1 $(TESTNAME).bin > $(TESTNAME).hex + +# --------------------------------------------------------------------------------------- +# Keil MDK + +all_keil: + @echo "Please compile your project code and press ENTER when ready" + @read dummy + +# --------------------------------------------------------------------------------------- +# Binary + +all_bin: $(TESTNAME).bin + # Generate hex file from binary + od -v -A n -t x1 --width=1 $(TESTNAME).bin > $(TESTNAME).hex + +# --------------------------------------------------------------------------------------- +# Clean + +clean : + @rm -rf *.o + @if [ -e $(TESTNAME).hex ] ; then \ + rm -rf $(TESTNAME).hex ; \ + fi + @if [ -e $(TESTNAME).lst ] ; then \ + rm -rf $(TESTNAME).lst ; \ + fi + @if [ -e $(TESTNAME).ELF ] ; then \ + rm -rf $(TESTNAME).ELF ; \ + fi + @if [ -e $(TESTNAME).bin ] ; then \ + rm -rf $(TESTNAME).bin ; \ + fi + @rm -rf *.crf + @rm -rf *.plg + @rm -rf *.tra + @rm -rf *.htm + @rm -rf *.map + @rm -rf *.dep + @rm -rf *.d + @rm -rf *.lnp + @rm -rf *.bak + @rm -rf *.lst + @rm -rf *.axf + @rm -rf *.sct + @rm -rf *.__i + @rm -rf *._ia diff --git a/Cortex-M0/nanosoc/systems/mcu/testcodes/memory_tests/memory_tests_cm0.uvopt b/Cortex-M0/nanosoc/systems/mcu/testcodes/memory_tests/memory_tests_cm0.uvopt new file mode 100644 index 0000000..e832157 --- /dev/null +++ b/Cortex-M0/nanosoc/systems/mcu/testcodes/memory_tests/memory_tests_cm0.uvopt @@ -0,0 +1,261 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no" ?> +<ProjectOpt xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="project_opt.xsd"> + + <SchemaVersion>1.0</SchemaVersion> + + <Header>### uVision Project, (C) Keil Software</Header> + + <Extensions> + <cExt>*.c</cExt> + <aExt>*.s*; *.src; *.a*</aExt> + <oExt>*.obj</oExt> + <lExt>*.lib</lExt> + <tExt>*.txt; *.h; *.inc</tExt> + <pExt>*.plm</pExt> + <CppX>*.cpp</CppX> + </Extensions> + + <DaveTm> + <dwLowDateTime>0</dwLowDateTime> + <dwHighDateTime>0</dwHighDateTime> + </DaveTm> + + <Target> + <TargetName>Debug</TargetName> + <ToolsetNumber>0x4</ToolsetNumber> + <ToolsetName>ARM-ADS</ToolsetName> + <TargetOption> + <CLKADS>50000000</CLKADS> + <OPTTT> + <gFlags>1</gFlags> + <BeepAtEnd>1</BeepAtEnd> + <RunSim>1</RunSim> + <RunTarget>0</RunTarget> + </OPTTT> + <OPTHX> + <HexSelection>1</HexSelection> + <FlashByte>65535</FlashByte> + <HexRangeLowAddress>0</HexRangeLowAddress> + <HexRangeHighAddress>0</HexRangeHighAddress> + <HexOffset>0</HexOffset> + </OPTHX> + <OPTLEX> + <PageWidth>79</PageWidth> + <PageLength>66</PageLength> + <TabStop>8</TabStop> + <ListingPath>.\</ListingPath> + </OPTLEX> + <ListingPage> + <CreateCListing>1</CreateCListing> + <CreateAListing>1</CreateAListing> + <CreateLListing>1</CreateLListing> + <CreateIListing>0</CreateIListing> + <AsmCond>1</AsmCond> + <AsmSymb>1</AsmSymb> + <AsmXref>0</AsmXref> + <CCond>1</CCond> + <CCode>0</CCode> + <CListInc>0</CListInc> + <CSymb>0</CSymb> + <LinkerCodeListing>0</LinkerCodeListing> + </ListingPage> + <OPTXL> + <LMap>1</LMap> + <LComments>1</LComments> + <LGenerateSymbols>1</LGenerateSymbols> + <LLibSym>1</LLibSym> + <LLines>1</LLines> + <LLocSym>1</LLocSym> + <LPubSym>1</LPubSym> + <LXref>0</LXref> + <LExpSel>0</LExpSel> + </OPTXL> + <OPTFL> + <tvExp>1</tvExp> + <tvExpOptDlg>0</tvExpOptDlg> + <IsCurrentTarget>1</IsCurrentTarget> + </OPTFL> + <CpuCode>255</CpuCode> + <DllOpt> + <SimDllName>SARMCM3.DLL</SimDllName> + <SimDllArguments></SimDllArguments> + <SimDlgDllName>DARMCM1.DLL</SimDlgDllName> + <SimDlgDllArguments></SimDlgDllArguments> + <TargetDllName>SARMCM3.DLL</TargetDllName> + <TargetDllArguments></TargetDllArguments> + <TargetDlgDllName>TARMCM1.DLL</TargetDlgDllName> + <TargetDlgDllArguments></TargetDlgDllArguments> + </DllOpt> + <DebugOpt> + <uSim>1</uSim> + <uTrg>0</uTrg> + <sLdApp>1</sLdApp> + <sGomain>1</sGomain> + <sRbreak>1</sRbreak> + <sRwatch>1</sRwatch> + <sRmem>1</sRmem> + <sRfunc>1</sRfunc> + <sRbox>1</sRbox> + <tLdApp>1</tLdApp> + <tGomain>0</tGomain> + <tRbreak>1</tRbreak> + <tRwatch>1</tRwatch> + <tRmem>1</tRmem> + <tRfunc>0</tRfunc> + <tRbox>1</tRbox> + <tRtrace>0</tRtrace> + <sRunDeb>0</sRunDeb> + <sLrtime>0</sLrtime> + <nTsel>-1</nTsel> + <sDll></sDll> + <sDllPa></sDllPa> + <sDlgDll></sDlgDll> + <sDlgPa></sDlgPa> + <sIfile></sIfile> + <tDll></tDll> + <tDllPa></tDllPa> + <tDlgDll></tDlgDll> + <tDlgPa></tDlgPa> + <tIfile></tIfile> + <pMon></pMon> + </DebugOpt> + <Breakpoint/> + <DebugFlag> + <trace>0</trace> + <periodic>1</periodic> + <aLwin>0</aLwin> + <aCover>0</aCover> + <aSer1>0</aSer1> + <aSer2>0</aSer2> + <aPa>0</aPa> + <viewmode>0</viewmode> + <vrSel>0</vrSel> + <aSym>0</aSym> + <aTbox>0</aTbox> + <AscS1>0</AscS1> + <AscS2>0</AscS2> + <AscS3>0</AscS3> + <aSer3>0</aSer3> + <eProf>0</eProf> + <aLa>0</aLa> + <aPa1>0</aPa1> + <AscS4>0</AscS4> + <aSer4>0</aSer4> + <StkLoc>0</StkLoc> + <TrcWin>0</TrcWin> + <newCpu>0</newCpu> + <uProt>0</uProt> + </DebugFlag> + <Tracepoint> + <THDelay>0</THDelay> + </Tracepoint> + <LintExecutable></LintExecutable> + <LintConfigFile></LintConfigFile> + </TargetOption> + </Target> + + <Group> + <GroupName>Startup</GroupName> + <tvExp>1</tvExp> + <tvExpOptDlg>0</tvExpOptDlg> + <cbSel>0</cbSel> + <RteFlg>0</RteFlg> + <File> + <GroupNumber>1</GroupNumber> + <FileNumber>1</FileNumber> + <FileType>2</FileType> + <tvExp>0</tvExp> + <Focus>0</Focus> + <ColumnNumber>0</ColumnNumber> + <tvExpOptDlg>0</tvExpOptDlg> + <TopLine>0</TopLine> + <CurrentLine>0</CurrentLine> + <bDave2>0</bDave2> + <PathWithFileName>..\..\..\..\software\cmsis\Device\ARM\CMSDK_CM0\Source\ARM\startup_CMSDK_CM0.s</PathWithFileName> + <FilenameWithoutPath>startup_CMSDK_CM0.s</FilenameWithoutPath> + <RteFlg>0</RteFlg> + <bShared>0</bShared> + </File> + </Group> + + <Group> + <GroupName>Application</GroupName> + <tvExp>1</tvExp> + <tvExpOptDlg>0</tvExpOptDlg> + <cbSel>0</cbSel> + <RteFlg>0</RteFlg> + <File> + <GroupNumber>2</GroupNumber> + <FileNumber>2</FileNumber> + <FileType>1</FileType> + <tvExp>0</tvExp> + <Focus>0</Focus> + <ColumnNumber>0</ColumnNumber> + <tvExpOptDlg>0</tvExpOptDlg> + <TopLine>0</TopLine> + <CurrentLine>0</CurrentLine> + <bDave2>0</bDave2> + <PathWithFileName>..\..\..\..\software\common\validation\memory_tests.c</PathWithFileName> + <FilenameWithoutPath>memory_tests.c</FilenameWithoutPath> + <RteFlg>0</RteFlg> + <bShared>0</bShared> + </File> + <File> + <GroupNumber>2</GroupNumber> + <FileNumber>3</FileNumber> + <FileType>1</FileType> + <tvExp>0</tvExp> + <Focus>0</Focus> + <ColumnNumber>0</ColumnNumber> + <tvExpOptDlg>0</tvExpOptDlg> + <TopLine>0</TopLine> + <CurrentLine>0</CurrentLine> + <bDave2>0</bDave2> + <PathWithFileName>..\..\..\..\software\common\retarget\uart_stdout.c</PathWithFileName> + <FilenameWithoutPath>uart_stdout.c</FilenameWithoutPath> + <RteFlg>0</RteFlg> + <bShared>0</bShared> + </File> + <File> + <GroupNumber>2</GroupNumber> + <FileNumber>4</FileNumber> + <FileType>1</FileType> + <tvExp>0</tvExp> + <Focus>0</Focus> + <ColumnNumber>0</ColumnNumber> + <tvExpOptDlg>0</tvExpOptDlg> + <TopLine>0</TopLine> + <CurrentLine>0</CurrentLine> + <bDave2>0</bDave2> + <PathWithFileName>..\..\..\..\software\common\retarget\retarget.c</PathWithFileName> + <FilenameWithoutPath>retarget.c</FilenameWithoutPath> + <RteFlg>0</RteFlg> + <bShared>0</bShared> + </File> + </Group> + + <Group> + <GroupName>System</GroupName> + <tvExp>1</tvExp> + <tvExpOptDlg>0</tvExpOptDlg> + <cbSel>0</cbSel> + <RteFlg>0</RteFlg> + <File> + <GroupNumber>3</GroupNumber> + <FileNumber>5</FileNumber> + <FileType>1</FileType> + <tvExp>0</tvExp> + <Focus>0</Focus> + <ColumnNumber>0</ColumnNumber> + <tvExpOptDlg>0</tvExpOptDlg> + <TopLine>0</TopLine> + <CurrentLine>0</CurrentLine> + <bDave2>0</bDave2> + <PathWithFileName>..\..\..\..\software\cmsis\Device\ARM\CMSDK_CM0\Source\system_CMSDK_CM0.c</PathWithFileName> + <FilenameWithoutPath>system_CMSDK_CM0.c</FilenameWithoutPath> + <RteFlg>0</RteFlg> + <bShared>0</bShared> + </File> + </Group> + +</ProjectOpt> diff --git a/Cortex-M0/nanosoc/systems/mcu/testcodes/memory_tests/memory_tests_cm0.uvproj b/Cortex-M0/nanosoc/systems/mcu/testcodes/memory_tests/memory_tests_cm0.uvproj new file mode 100644 index 0000000..f724aba --- /dev/null +++ b/Cortex-M0/nanosoc/systems/mcu/testcodes/memory_tests/memory_tests_cm0.uvproj @@ -0,0 +1,435 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no" ?> +<Project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="project_proj.xsd"> + + <SchemaVersion>1.1</SchemaVersion> + + <Header>### uVision Project, (C) Keil Software</Header> + + <Targets> + <Target> + <TargetName>Debug</TargetName> + <ToolsetNumber>0x4</ToolsetNumber> + <ToolsetName>ARM-ADS</ToolsetName> + <TargetOption> + <TargetCommonOption> + <Device>Cortex-M0</Device> + <Vendor>ARM</Vendor> + <Cpu>CLOCK(12000000) CPUTYPE("Cortex-M0") ESEL ELITTLE</Cpu> + <FlashUtilSpec></FlashUtilSpec> + <StartupFile></StartupFile> + <FlashDriverDll></FlashDriverDll> + <DeviceId>4803</DeviceId> + <RegisterFile></RegisterFile> + <MemoryEnv></MemoryEnv> + <Cmp></Cmp> + <Asm></Asm> + <Linker></Linker> + <OHString></OHString> + <InfinionOptionDll></InfinionOptionDll> + <SLE66CMisc></SLE66CMisc> + <SLE66AMisc></SLE66AMisc> + <SLE66LinkerMisc></SLE66LinkerMisc> + <SFDFile></SFDFile> + <UseEnv>0</UseEnv> + <BinPath></BinPath> + <IncludePath></IncludePath> + <LibPath></LibPath> + <RegisterFilePath></RegisterFilePath> + <DBRegisterFilePath></DBRegisterFilePath> + <TargetStatus> + <Error>0</Error> + <ExitCodeStop>0</ExitCodeStop> + <ButtonStop>0</ButtonStop> + <NotGenerated>0</NotGenerated> + <InvalidFlash>1</InvalidFlash> + </TargetStatus> + <OutputDirectory>.\</OutputDirectory> + <OutputName>memory_tests</OutputName> + <CreateExecutable>1</CreateExecutable> + <CreateLib>0</CreateLib> + <CreateHexFile>0</CreateHexFile> + <DebugInformation>1</DebugInformation> + <BrowseInformation>1</BrowseInformation> + <ListingPath>.\</ListingPath> + <HexFormatSelection>1</HexFormatSelection> + <Merge32K>0</Merge32K> + <CreateBatchFile>0</CreateBatchFile> + <BeforeCompile> + <RunUserProg1>0</RunUserProg1> + <RunUserProg2>0</RunUserProg2> + <UserProg1Name></UserProg1Name> + <UserProg2Name></UserProg2Name> + <UserProg1Dos16Mode>0</UserProg1Dos16Mode> + <UserProg2Dos16Mode>0</UserProg2Dos16Mode> + <nStopU1X>0</nStopU1X> + <nStopU2X>0</nStopU2X> + </BeforeCompile> + <BeforeMake> + <RunUserProg1>0</RunUserProg1> + <RunUserProg2>0</RunUserProg2> + <UserProg1Name></UserProg1Name> + <UserProg2Name></UserProg2Name> + <UserProg1Dos16Mode>0</UserProg1Dos16Mode> + <UserProg2Dos16Mode>0</UserProg2Dos16Mode> + </BeforeMake> + <AfterMake> + <RunUserProg1>1</RunUserProg1> + <RunUserProg2>0</RunUserProg2> + <UserProg1Name>$K\ARM\ARMCC\BIN\fromelf.exe #L --vhx --8x1 --output memory_tests.hex</UserProg1Name> + <UserProg2Name></UserProg2Name> + <UserProg1Dos16Mode>0</UserProg1Dos16Mode> + <UserProg2Dos16Mode>0</UserProg2Dos16Mode> + </AfterMake> + <SelectedForBatchBuild>0</SelectedForBatchBuild> + <SVCSIdString></SVCSIdString> + </TargetCommonOption> + <CommonProperty> + <UseCPPCompiler>0</UseCPPCompiler> + <RVCTCodeConst>0</RVCTCodeConst> + <RVCTZI>0</RVCTZI> + <RVCTOtherData>0</RVCTOtherData> + <ModuleSelection>0</ModuleSelection> + <IncludeInBuild>1</IncludeInBuild> + <AlwaysBuild>0</AlwaysBuild> + <GenerateAssemblyFile>0</GenerateAssemblyFile> + <AssembleAssemblyFile>0</AssembleAssemblyFile> + <PublicsOnly>0</PublicsOnly> + <StopOnExitCode>3</StopOnExitCode> + <CustomArgument></CustomArgument> + <IncludeLibraryModules></IncludeLibraryModules> + </CommonProperty> + <DllOption> + <SimDllName>SARMCM3.DLL</SimDllName> + <SimDllArguments></SimDllArguments> + <SimDlgDll>DARMCM1.DLL</SimDlgDll> + <SimDlgDllArguments></SimDlgDllArguments> + <TargetDllName>SARMCM3.DLL</TargetDllName> + <TargetDllArguments></TargetDllArguments> + <TargetDlgDll>TARMCM1.DLL</TargetDlgDll> + <TargetDlgDllArguments></TargetDlgDllArguments> + </DllOption> + <DebugOption> + <OPTHX> + <HexSelection>1</HexSelection> + <HexRangeLowAddress>0</HexRangeLowAddress> + <HexRangeHighAddress>0</HexRangeHighAddress> + <HexOffset>0</HexOffset> + <Oh166RecLen>16</Oh166RecLen> + </OPTHX> + <Simulator> + <UseSimulator>1</UseSimulator> + <LoadApplicationAtStartup>1</LoadApplicationAtStartup> + <RunToMain>1</RunToMain> + <RestoreBreakpoints>1</RestoreBreakpoints> + <RestoreWatchpoints>1</RestoreWatchpoints> + <RestoreMemoryDisplay>1</RestoreMemoryDisplay> + <RestoreFunctions>1</RestoreFunctions> + <RestoreToolbox>1</RestoreToolbox> + <LimitSpeedToRealTime>0</LimitSpeedToRealTime> + </Simulator> + <Target> + <UseTarget>0</UseTarget> + <LoadApplicationAtStartup>1</LoadApplicationAtStartup> + <RunToMain>0</RunToMain> + <RestoreBreakpoints>1</RestoreBreakpoints> + <RestoreWatchpoints>1</RestoreWatchpoints> + <RestoreMemoryDisplay>1</RestoreMemoryDisplay> + <RestoreFunctions>0</RestoreFunctions> + <RestoreToolbox>1</RestoreToolbox> + <RestoreTracepoints>0</RestoreTracepoints> + </Target> + <RunDebugAfterBuild>0</RunDebugAfterBuild> + <TargetSelection>-1</TargetSelection> + <SimDlls> + <CpuDll></CpuDll> + <CpuDllArguments></CpuDllArguments> + <PeripheralDll></PeripheralDll> + <PeripheralDllArguments></PeripheralDllArguments> + <InitializationFile></InitializationFile> + </SimDlls> + <TargetDlls> + <CpuDll></CpuDll> + <CpuDllArguments></CpuDllArguments> + <PeripheralDll></PeripheralDll> + <PeripheralDllArguments></PeripheralDllArguments> + <InitializationFile></InitializationFile> + <Driver></Driver> + </TargetDlls> + </DebugOption> + <Utilities> + <Flash1> + <UseTargetDll>0</UseTargetDll> + <UseExternalTool>0</UseExternalTool> + <RunIndependent>0</RunIndependent> + <UpdateFlashBeforeDebugging>0</UpdateFlashBeforeDebugging> + <Capability>0</Capability> + <DriverSelection>-1</DriverSelection> + </Flash1> + <Flash2></Flash2> + <Flash3></Flash3> + <Flash4></Flash4> + </Utilities> + <TargetArmAds> + <ArmAdsMisc> + <GenerateListings>0</GenerateListings> + <asHll>1</asHll> + <asAsm>1</asAsm> + <asMacX>1</asMacX> + <asSyms>1</asSyms> + <asFals>1</asFals> + <asDbgD>1</asDbgD> + <asForm>1</asForm> + <ldLst>0</ldLst> + <ldmm>1</ldmm> + <ldXref>1</ldXref> + <BigEnd>0</BigEnd> + <AdsALst>1</AdsALst> + <AdsACrf>1</AdsACrf> + <AdsANop>0</AdsANop> + <AdsANot>0</AdsANot> + <AdsLLst>1</AdsLLst> + <AdsLmap>1</AdsLmap> + <AdsLcgr>1</AdsLcgr> + <AdsLsym>1</AdsLsym> + <AdsLszi>1</AdsLszi> + <AdsLtoi>1</AdsLtoi> + <AdsLsun>1</AdsLsun> + <AdsLven>1</AdsLven> + <AdsLsxf>1</AdsLsxf> + <RvctClst>0</RvctClst> + <GenPPlst>0</GenPPlst> + <AdsCpuType>"Cortex-M0"</AdsCpuType> + <RvctDeviceName></RvctDeviceName> + <mOS>0</mOS> + <uocRom>0</uocRom> + <uocRam>0</uocRam> + <hadIROM>0</hadIROM> + <hadIRAM>0</hadIRAM> + <hadXRAM>0</hadXRAM> + <uocXRam>0</uocXRam> + <RvdsVP>0</RvdsVP> + <hadIRAM2>0</hadIRAM2> + <hadIROM2>0</hadIROM2> + <StupSel>1</StupSel> + <useUlib>0</useUlib> + <EndSel>1</EndSel> + <uLtcg>0</uLtcg> + <RoSelD>0</RoSelD> + <RwSelD>5</RwSelD> + <CodeSel>0</CodeSel> + <OptFeed>0</OptFeed> + <NoZi1>0</NoZi1> + <NoZi2>0</NoZi2> + <NoZi3>0</NoZi3> + <NoZi4>0</NoZi4> + <NoZi5>0</NoZi5> + <Ro1Chk>1</Ro1Chk> + <Ro2Chk>0</Ro2Chk> + <Ro3Chk>0</Ro3Chk> + <Ir1Chk>0</Ir1Chk> + <Ir2Chk>0</Ir2Chk> + <Ra1Chk>1</Ra1Chk> + <Ra2Chk>0</Ra2Chk> + <Ra3Chk>0</Ra3Chk> + <Im1Chk>0</Im1Chk> + <Im2Chk>0</Im2Chk> + <OnChipMemories> + <Ocm1> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </Ocm1> + <Ocm2> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </Ocm2> + <Ocm3> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </Ocm3> + <Ocm4> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </Ocm4> + <Ocm5> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </Ocm5> + <Ocm6> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </Ocm6> + <IRAM> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </IRAM> + <IROM> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </IROM> + <XRAM> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </XRAM> + <OCR_RVCT1> + <Type>1</Type> + <StartAddress>0x0</StartAddress> + <Size>0x10000</Size> + </OCR_RVCT1> + <OCR_RVCT2> + <Type>1</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </OCR_RVCT2> + <OCR_RVCT3> + <Type>1</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </OCR_RVCT3> + <OCR_RVCT4> + <Type>1</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </OCR_RVCT4> + <OCR_RVCT5> + <Type>1</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </OCR_RVCT5> + <OCR_RVCT6> + <Type>0</Type> + <StartAddress>0x20000000</StartAddress> + <Size>0x10000</Size> + </OCR_RVCT6> + <OCR_RVCT7> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </OCR_RVCT7> + <OCR_RVCT8> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </OCR_RVCT8> + <OCR_RVCT9> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </OCR_RVCT9> + <OCR_RVCT10> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </OCR_RVCT10> + </OnChipMemories> + <RvctStartVector></RvctStartVector> + </ArmAdsMisc> + <Cads> + <interw>1</interw> + <Optim>4</Optim> + <oTime>0</oTime> + <SplitLS>0</SplitLS> + <OneElfS>0</OneElfS> + <Strict>0</Strict> + <EnumInt>0</EnumInt> + <PlainCh>0</PlainCh> + <Ropi>0</Ropi> + <Rwpi>0</Rwpi> + <wLevel>0</wLevel> + <uThumb>0</uThumb> + <uSurpInc>0</uSurpInc> + <VariousControls> + <MiscControls></MiscControls> + <Define>CORTEX_M0</Define> + <Undefine></Undefine> + <IncludePath>..\..\..\..\software\cmsis\CMSIS\Include; ..\..\..\..\software\cmsis\Device\ARM\CMSDK_CM0\Include; ..\..\..\..\software\common\retarget</IncludePath> + </VariousControls> + </Cads> + <Aads> + <interw>1</interw> + <Ropi>0</Ropi> + <Rwpi>0</Rwpi> + <thumb>0</thumb> + <SplitLS>0</SplitLS> + <SwStkChk>0</SwStkChk> + <NoWarn>0</NoWarn> + <uSurpInc>0</uSurpInc> + <VariousControls> + <MiscControls></MiscControls> + <Define></Define> + <Undefine></Undefine> + <IncludePath></IncludePath> + </VariousControls> + </Aads> + <LDads> + <umfTarg>1</umfTarg> + <Ropi>0</Ropi> + <Rwpi>0</Rwpi> + <noStLib>0</noStLib> + <RepFail>1</RepFail> + <useFile>0</useFile> + <TextAddressRange>0x00000000</TextAddressRange> + <DataAddressRange>0x00000000</DataAddressRange> + <ScatterFile></ScatterFile> + <IncludeLibs></IncludeLibs> + <IncludeLibsPath></IncludeLibsPath> + <Misc></Misc> + <LinkerInputFile></LinkerInputFile> + <DisabledWarnings></DisabledWarnings> + </LDads> + </TargetArmAds> + </TargetOption> + <Groups> + <Group> + <GroupName>Startup</GroupName> + <Files> + <File> + <FileName>startup_CMSDK_CM0.s</FileName> + <FileType>2</FileType> + <FilePath>..\..\..\..\software\cmsis\Device\ARM\CMSDK_CM0\Source\ARM\startup_CMSDK_CM0.s</FilePath> + </File> + </Files> + </Group> + <Group> + <GroupName>Application</GroupName> + <Files> + <File> + <FileName>memory_tests.c</FileName> + <FileType>1</FileType> + <FilePath>..\..\..\..\software\common\validation\memory_tests.c</FilePath> + </File> + <File> + <FileName>uart_stdout.c</FileName> + <FileType>1</FileType> + <FilePath>..\..\..\..\software\common\retarget\uart_stdout.c</FilePath> + </File> + <File> + <FileName>retarget.c</FileName> + <FileType>1</FileType> + <FilePath>..\..\..\..\software\common\retarget\retarget.c</FilePath> + </File> + </Files> + </Group> + <Group> + <GroupName>System</GroupName> + <Files> + <File> + <FileName>system_CMSDK_CM0.c</FileName> + <FileType>1</FileType> + <FilePath>..\..\..\..\software\cmsis\Device\ARM\CMSDK_CM0\Source\system_CMSDK_CM0.c</FilePath> + </File> + </Files> + </Group> + </Groups> + </Target> + </Targets> + +</Project> diff --git a/Cortex-M0/nanosoc/systems/mcu/testcodes/memory_tests/memory_tests_cm0p.uvopt b/Cortex-M0/nanosoc/systems/mcu/testcodes/memory_tests/memory_tests_cm0p.uvopt new file mode 100644 index 0000000..9a16501 --- /dev/null +++ b/Cortex-M0/nanosoc/systems/mcu/testcodes/memory_tests/memory_tests_cm0p.uvopt @@ -0,0 +1,244 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no" ?> +<ProjectOpt xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="project_opt.xsd"> + + <SchemaVersion>1.0</SchemaVersion> + + <Header>### uVision Project, (C) Keil Software</Header> + + <Extensions> + <cExt>*.c</cExt> + <aExt>*.s*; *.src; *.a*</aExt> + <oExt>*.obj</oExt> + <lExt>*.lib</lExt> + <tExt>*.txt; *.h; *.inc</tExt> + <pExt>*.plm</pExt> + <CppX>*.cpp</CppX> + </Extensions> + + <DaveTm> + <dwLowDateTime>0</dwLowDateTime> + <dwHighDateTime>0</dwHighDateTime> + </DaveTm> + + <Target> + <TargetName>Debug</TargetName> + <ToolsetNumber>0x4</ToolsetNumber> + <ToolsetName>ARM-ADS</ToolsetName> + <TargetOption> + <CLKADS>50000000</CLKADS> + <OPTTT> + <gFlags>1</gFlags> + <BeepAtEnd>1</BeepAtEnd> + <RunSim>1</RunSim> + <RunTarget>0</RunTarget> + </OPTTT> + <OPTHX> + <HexSelection>1</HexSelection> + <FlashByte>65535</FlashByte> + <HexRangeLowAddress>0</HexRangeLowAddress> + <HexRangeHighAddress>0</HexRangeHighAddress> + <HexOffset>0</HexOffset> + </OPTHX> + <OPTLEX> + <PageWidth>79</PageWidth> + <PageLength>66</PageLength> + <TabStop>8</TabStop> + <ListingPath>.\</ListingPath> + </OPTLEX> + <ListingPage> + <CreateCListing>1</CreateCListing> + <CreateAListing>1</CreateAListing> + <CreateLListing>1</CreateLListing> + <CreateIListing>0</CreateIListing> + <AsmCond>1</AsmCond> + <AsmSymb>1</AsmSymb> + <AsmXref>0</AsmXref> + <CCond>1</CCond> + <CCode>0</CCode> + <CListInc>0</CListInc> + <CSymb>0</CSymb> + <LinkerCodeListing>0</LinkerCodeListing> + </ListingPage> + <OPTXL> + <LMap>1</LMap> + <LComments>1</LComments> + <LGenerateSymbols>1</LGenerateSymbols> + <LLibSym>1</LLibSym> + <LLines>1</LLines> + <LLocSym>1</LLocSym> + <LPubSym>1</LPubSym> + <LXref>0</LXref> + <LExpSel>0</LExpSel> + </OPTXL> + <OPTFL> + <tvExp>1</tvExp> + <tvExpOptDlg>0</tvExpOptDlg> + <IsCurrentTarget>1</IsCurrentTarget> + </OPTFL> + <CpuCode>255</CpuCode> + <DllOpt> + <SimDllName>SARMCM3.DLL</SimDllName> + <SimDllArguments></SimDllArguments> + <SimDlgDllName>DARMCM1.DLL</SimDlgDllName> + <SimDlgDllArguments></SimDlgDllArguments> + <TargetDllName>SARMCM3.DLL</TargetDllName> + <TargetDllArguments></TargetDllArguments> + <TargetDlgDllName>TARMCM1.DLL</TargetDlgDllName> + <TargetDlgDllArguments></TargetDlgDllArguments> + </DllOpt> + <DebugOpt> + <uSim>1</uSim> + <uTrg>0</uTrg> + <sLdApp>1</sLdApp> + <sGomain>1</sGomain> + <sRbreak>1</sRbreak> + <sRwatch>1</sRwatch> + <sRmem>1</sRmem> + <sRfunc>1</sRfunc> + <sRbox>1</sRbox> + <tLdApp>1</tLdApp> + <tGomain>0</tGomain> + <tRbreak>1</tRbreak> + <tRwatch>1</tRwatch> + <tRmem>1</tRmem> + <tRfunc>0</tRfunc> + <tRbox>1</tRbox> + <sRunDeb>0</sRunDeb> + <sLrtime>0</sLrtime> + <nTsel>-1</nTsel> + <sDll></sDll> + <sDllPa></sDllPa> + <sDlgDll></sDlgDll> + <sDlgPa></sDlgPa> + <sIfile></sIfile> + <tDll></tDll> + <tDllPa></tDllPa> + <tDlgDll></tDlgDll> + <tDlgPa></tDlgPa> + <tIfile></tIfile> + <pMon></pMon> + </DebugOpt> + <Breakpoint/> + <DebugFlag> + <trace>0</trace> + <periodic>1</periodic> + <aLwin>0</aLwin> + <aCover>0</aCover> + <aSer1>0</aSer1> + <aSer2>0</aSer2> + <aPa>0</aPa> + <viewmode>0</viewmode> + <vrSel>0</vrSel> + <aSym>0</aSym> + <aTbox>0</aTbox> + <AscS1>0</AscS1> + <AscS2>0</AscS2> + <AscS3>0</AscS3> + <aSer3>0</aSer3> + <eProf>0</eProf> + <aLa>0</aLa> + <aPa1>0</aPa1> + <AscS4>0</AscS4> + <aSer4>0</aSer4> + <StkLoc>0</StkLoc> + <TrcWin>0</TrcWin> + <newCpu>0</newCpu> + <uProt>0</uProt> + </DebugFlag> + <LintExecutable></LintExecutable> + <LintConfigFile></LintConfigFile> + </TargetOption> + </Target> + + <Group> + <GroupName>Startup</GroupName> + <tvExp>1</tvExp> + <tvExpOptDlg>0</tvExpOptDlg> + <cbSel>0</cbSel> + <File> + <GroupNumber>1</GroupNumber> + <FileNumber>1</FileNumber> + <FileType>2</FileType> + <tvExp>0</tvExp> + <Focus>0</Focus> + <ColumnNumber>0</ColumnNumber> + <tvExpOptDlg>0</tvExpOptDlg> + <TopLine>0</TopLine> + <CurrentLine>0</CurrentLine> + <bDave2>0</bDave2> + <PathWithFileName>..\..\..\..\software\cmsis\Device\ARM\CMSDK_CM0plus\Source\ARM\startup_CMSDK_CM0plus.s</PathWithFileName> + <FilenameWithoutPath>startup_CMSDK_CM0plus.s</FilenameWithoutPath> + </File> + </Group> + + <Group> + <GroupName>Application</GroupName> + <tvExp>1</tvExp> + <tvExpOptDlg>0</tvExpOptDlg> + <cbSel>0</cbSel> + <File> + <GroupNumber>2</GroupNumber> + <FileNumber>2</FileNumber> + <FileType>1</FileType> + <tvExp>0</tvExp> + <Focus>0</Focus> + <ColumnNumber>0</ColumnNumber> + <tvExpOptDlg>0</tvExpOptDlg> + <TopLine>0</TopLine> + <CurrentLine>0</CurrentLine> + <bDave2>0</bDave2> + <PathWithFileName>..\..\..\..\software\common\validation\memory_tests.c</PathWithFileName> + <FilenameWithoutPath>memory_tests.c</FilenameWithoutPath> + </File> + <File> + <GroupNumber>2</GroupNumber> + <FileNumber>3</FileNumber> + <FileType>1</FileType> + <tvExp>0</tvExp> + <Focus>0</Focus> + <ColumnNumber>0</ColumnNumber> + <tvExpOptDlg>0</tvExpOptDlg> + <TopLine>0</TopLine> + <CurrentLine>0</CurrentLine> + <bDave2>0</bDave2> + <PathWithFileName>..\..\..\..\software\common\retarget\uart_stdout.c</PathWithFileName> + <FilenameWithoutPath>uart_stdout.c</FilenameWithoutPath> + </File> + <File> + <GroupNumber>2</GroupNumber> + <FileNumber>4</FileNumber> + <FileType>1</FileType> + <tvExp>0</tvExp> + <Focus>0</Focus> + <ColumnNumber>0</ColumnNumber> + <tvExpOptDlg>0</tvExpOptDlg> + <TopLine>0</TopLine> + <CurrentLine>0</CurrentLine> + <bDave2>0</bDave2> + <PathWithFileName>..\..\..\..\software\common\retarget\retarget.c</PathWithFileName> + <FilenameWithoutPath>retarget.c</FilenameWithoutPath> + </File> + </Group> + + <Group> + <GroupName>System</GroupName> + <tvExp>1</tvExp> + <tvExpOptDlg>0</tvExpOptDlg> + <cbSel>0</cbSel> + <File> + <GroupNumber>3</GroupNumber> + <FileNumber>5</FileNumber> + <FileType>1</FileType> + <tvExp>0</tvExp> + <Focus>0</Focus> + <ColumnNumber>0</ColumnNumber> + <tvExpOptDlg>0</tvExpOptDlg> + <TopLine>0</TopLine> + <CurrentLine>0</CurrentLine> + <bDave2>0</bDave2> + <PathWithFileName>..\..\..\..\software\cmsis\Device\ARM\CMSDK_CM0plus\Source\system_CMSDK_CM0plus.c</PathWithFileName> + <FilenameWithoutPath>system_CMSDK_CM0plus.c</FilenameWithoutPath> + </File> + </Group> + +</ProjectOpt> diff --git a/Cortex-M0/nanosoc/systems/mcu/testcodes/memory_tests/memory_tests_cm0p.uvproj b/Cortex-M0/nanosoc/systems/mcu/testcodes/memory_tests/memory_tests_cm0p.uvproj new file mode 100644 index 0000000..a339a79 --- /dev/null +++ b/Cortex-M0/nanosoc/systems/mcu/testcodes/memory_tests/memory_tests_cm0p.uvproj @@ -0,0 +1,432 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no" ?> +<Project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="project_proj.xsd"> + + <SchemaVersion>1.1</SchemaVersion> + + <Header>### uVision Project, (C) Keil Software</Header> + + <Targets> + <Target> + <TargetName>Debug</TargetName> + <ToolsetNumber>0x4</ToolsetNumber> + <ToolsetName>ARM-ADS</ToolsetName> + <TargetOption> + <TargetCommonOption> + <Device>Cortex-M0+</Device> + <Vendor>ARM</Vendor> + <Cpu>CLOCK(12000000) CPUTYPE("Cortex-M0+") ESEL ELITTLE</Cpu> + <FlashUtilSpec></FlashUtilSpec> + <StartupFile></StartupFile> + <FlashDriverDll></FlashDriverDll> + <DeviceId>6268</DeviceId> + <RegisterFile></RegisterFile> + <MemoryEnv></MemoryEnv> + <Cmp></Cmp> + <Asm></Asm> + <Linker></Linker> + <OHString></OHString> + <InfinionOptionDll></InfinionOptionDll> + <SLE66CMisc></SLE66CMisc> + <SLE66AMisc></SLE66AMisc> + <SLE66LinkerMisc></SLE66LinkerMisc> + <SFDFile></SFDFile> + <UseEnv>0</UseEnv> + <BinPath></BinPath> + <IncludePath></IncludePath> + <LibPath></LibPath> + <RegisterFilePath></RegisterFilePath> + <DBRegisterFilePath></DBRegisterFilePath> + <TargetStatus> + <Error>0</Error> + <ExitCodeStop>0</ExitCodeStop> + <ButtonStop>0</ButtonStop> + <NotGenerated>0</NotGenerated> + <InvalidFlash>1</InvalidFlash> + </TargetStatus> + <OutputDirectory>.\</OutputDirectory> + <OutputName>memory_tests</OutputName> + <CreateExecutable>1</CreateExecutable> + <CreateLib>0</CreateLib> + <CreateHexFile>0</CreateHexFile> + <DebugInformation>1</DebugInformation> + <BrowseInformation>1</BrowseInformation> + <ListingPath>.\</ListingPath> + <HexFormatSelection>1</HexFormatSelection> + <Merge32K>0</Merge32K> + <CreateBatchFile>0</CreateBatchFile> + <BeforeCompile> + <RunUserProg1>0</RunUserProg1> + <RunUserProg2>0</RunUserProg2> + <UserProg1Name></UserProg1Name> + <UserProg2Name></UserProg2Name> + <UserProg1Dos16Mode>0</UserProg1Dos16Mode> + <UserProg2Dos16Mode>0</UserProg2Dos16Mode> + <nStopU1X>0</nStopU1X> + <nStopU2X>0</nStopU2X> + </BeforeCompile> + <BeforeMake> + <RunUserProg1>0</RunUserProg1> + <RunUserProg2>0</RunUserProg2> + <UserProg1Name></UserProg1Name> + <UserProg2Name></UserProg2Name> + <UserProg1Dos16Mode>0</UserProg1Dos16Mode> + <UserProg2Dos16Mode>0</UserProg2Dos16Mode> + </BeforeMake> + <AfterMake> + <RunUserProg1>1</RunUserProg1> + <RunUserProg2>0</RunUserProg2> + <UserProg1Name>$K\ARM\ARMCC\BIN\fromelf.exe #L --vhx --8x1 --output memory_tests.hex</UserProg1Name> + <UserProg2Name></UserProg2Name> + <UserProg1Dos16Mode>0</UserProg1Dos16Mode> + <UserProg2Dos16Mode>0</UserProg2Dos16Mode> + </AfterMake> + <SelectedForBatchBuild>0</SelectedForBatchBuild> + <SVCSIdString></SVCSIdString> + </TargetCommonOption> + <CommonProperty> + <UseCPPCompiler>0</UseCPPCompiler> + <RVCTCodeConst>0</RVCTCodeConst> + <RVCTZI>0</RVCTZI> + <RVCTOtherData>0</RVCTOtherData> + <ModuleSelection>0</ModuleSelection> + <IncludeInBuild>1</IncludeInBuild> + <AlwaysBuild>0</AlwaysBuild> + <GenerateAssemblyFile>0</GenerateAssemblyFile> + <AssembleAssemblyFile>0</AssembleAssemblyFile> + <PublicsOnly>0</PublicsOnly> + <StopOnExitCode>3</StopOnExitCode> + <CustomArgument></CustomArgument> + <IncludeLibraryModules></IncludeLibraryModules> + </CommonProperty> + <DllOption> + <SimDllName>SARMCM3.DLL</SimDllName> + <SimDllArguments></SimDllArguments> + <SimDlgDll>DARMCM1.DLL</SimDlgDll> + <SimDlgDllArguments></SimDlgDllArguments> + <TargetDllName>SARMCM3.DLL</TargetDllName> + <TargetDllArguments></TargetDllArguments> + <TargetDlgDll>TARMCM1.DLL</TargetDlgDll> + <TargetDlgDllArguments></TargetDlgDllArguments> + </DllOption> + <DebugOption> + <OPTHX> + <HexSelection>1</HexSelection> + <HexRangeLowAddress>0</HexRangeLowAddress> + <HexRangeHighAddress>0</HexRangeHighAddress> + <HexOffset>0</HexOffset> + <Oh166RecLen>16</Oh166RecLen> + </OPTHX> + <Simulator> + <UseSimulator>1</UseSimulator> + <LoadApplicationAtStartup>1</LoadApplicationAtStartup> + <RunToMain>1</RunToMain> + <RestoreBreakpoints>1</RestoreBreakpoints> + <RestoreWatchpoints>1</RestoreWatchpoints> + <RestoreMemoryDisplay>1</RestoreMemoryDisplay> + <RestoreFunctions>1</RestoreFunctions> + <RestoreToolbox>1</RestoreToolbox> + <LimitSpeedToRealTime>0</LimitSpeedToRealTime> + </Simulator> + <Target> + <UseTarget>0</UseTarget> + <LoadApplicationAtStartup>1</LoadApplicationAtStartup> + <RunToMain>0</RunToMain> + <RestoreBreakpoints>1</RestoreBreakpoints> + <RestoreWatchpoints>1</RestoreWatchpoints> + <RestoreMemoryDisplay>1</RestoreMemoryDisplay> + <RestoreFunctions>0</RestoreFunctions> + <RestoreToolbox>1</RestoreToolbox> + </Target> + <RunDebugAfterBuild>0</RunDebugAfterBuild> + <TargetSelection>-1</TargetSelection> + <SimDlls> + <CpuDll></CpuDll> + <CpuDllArguments></CpuDllArguments> + <PeripheralDll></PeripheralDll> + <PeripheralDllArguments></PeripheralDllArguments> + <InitializationFile></InitializationFile> + </SimDlls> + <TargetDlls> + <CpuDll></CpuDll> + <CpuDllArguments></CpuDllArguments> + <PeripheralDll></PeripheralDll> + <PeripheralDllArguments></PeripheralDllArguments> + <InitializationFile></InitializationFile> + <Driver></Driver> + </TargetDlls> + </DebugOption> + <Utilities> + <Flash1> + <UseTargetDll>0</UseTargetDll> + <UseExternalTool>0</UseExternalTool> + <RunIndependent>0</RunIndependent> + <UpdateFlashBeforeDebugging>0</UpdateFlashBeforeDebugging> + <Capability>0</Capability> + <DriverSelection>-1</DriverSelection> + </Flash1> + <Flash2></Flash2> + <Flash3></Flash3> + <Flash4></Flash4> + </Utilities> + <TargetArmAds> + <ArmAdsMisc> + <GenerateListings>0</GenerateListings> + <asHll>1</asHll> + <asAsm>1</asAsm> + <asMacX>1</asMacX> + <asSyms>1</asSyms> + <asFals>1</asFals> + <asDbgD>1</asDbgD> + <asForm>1</asForm> + <ldLst>0</ldLst> + <ldmm>1</ldmm> + <ldXref>1</ldXref> + <BigEnd>0</BigEnd> + <AdsALst>1</AdsALst> + <AdsACrf>1</AdsACrf> + <AdsANop>0</AdsANop> + <AdsANot>0</AdsANot> + <AdsLLst>1</AdsLLst> + <AdsLmap>1</AdsLmap> + <AdsLcgr>1</AdsLcgr> + <AdsLsym>1</AdsLsym> + <AdsLszi>1</AdsLszi> + <AdsLtoi>1</AdsLtoi> + <AdsLsun>1</AdsLsun> + <AdsLven>1</AdsLven> + <AdsLsxf>1</AdsLsxf> + <RvctClst>0</RvctClst> + <GenPPlst>0</GenPPlst> + <AdsCpuType>"Cortex-M0+"</AdsCpuType> + <RvctDeviceName></RvctDeviceName> + <mOS>0</mOS> + <uocRom>0</uocRom> + <uocRam>0</uocRam> + <hadIROM>0</hadIROM> + <hadIRAM>0</hadIRAM> + <hadXRAM>0</hadXRAM> + <uocXRam>0</uocXRam> + <RvdsVP>0</RvdsVP> + <hadIRAM2>0</hadIRAM2> + <hadIROM2>0</hadIROM2> + <StupSel>1</StupSel> + <useUlib>0</useUlib> + <EndSel>1</EndSel> + <uLtcg>0</uLtcg> + <RoSelD>0</RoSelD> + <RwSelD>5</RwSelD> + <CodeSel>0</CodeSel> + <OptFeed>0</OptFeed> + <NoZi1>0</NoZi1> + <NoZi2>0</NoZi2> + <NoZi3>0</NoZi3> + <NoZi4>0</NoZi4> + <NoZi5>0</NoZi5> + <Ro1Chk>1</Ro1Chk> + <Ro2Chk>0</Ro2Chk> + <Ro3Chk>0</Ro3Chk> + <Ir1Chk>0</Ir1Chk> + <Ir2Chk>0</Ir2Chk> + <Ra1Chk>1</Ra1Chk> + <Ra2Chk>0</Ra2Chk> + <Ra3Chk>0</Ra3Chk> + <Im1Chk>0</Im1Chk> + <Im2Chk>0</Im2Chk> + <OnChipMemories> + <Ocm1> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </Ocm1> + <Ocm2> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </Ocm2> + <Ocm3> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </Ocm3> + <Ocm4> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </Ocm4> + <Ocm5> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </Ocm5> + <Ocm6> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </Ocm6> + <IRAM> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </IRAM> + <IROM> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </IROM> + <XRAM> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </XRAM> + <OCR_RVCT1> + <Type>1</Type> + <StartAddress>0x0</StartAddress> + <Size>0x10000</Size> + </OCR_RVCT1> + <OCR_RVCT2> + <Type>1</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </OCR_RVCT2> + <OCR_RVCT3> + <Type>1</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </OCR_RVCT3> + <OCR_RVCT4> + <Type>1</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </OCR_RVCT4> + <OCR_RVCT5> + <Type>1</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </OCR_RVCT5> + <OCR_RVCT6> + <Type>0</Type> + <StartAddress>0x20000000</StartAddress> + <Size>0x10000</Size> + </OCR_RVCT6> + <OCR_RVCT7> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </OCR_RVCT7> + <OCR_RVCT8> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </OCR_RVCT8> + <OCR_RVCT9> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </OCR_RVCT9> + <OCR_RVCT10> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </OCR_RVCT10> + </OnChipMemories> + <RvctStartVector></RvctStartVector> + </ArmAdsMisc> + <Cads> + <interw>1</interw> + <Optim>4</Optim> + <oTime>0</oTime> + <SplitLS>0</SplitLS> + <OneElfS>0</OneElfS> + <Strict>0</Strict> + <EnumInt>0</EnumInt> + <PlainCh>0</PlainCh> + <Ropi>0</Ropi> + <Rwpi>0</Rwpi> + <wLevel>0</wLevel> + <uThumb>0</uThumb> + <VariousControls> + <MiscControls></MiscControls> + <Define>CORTEX_M0PLUS</Define> + <Undefine></Undefine> + <IncludePath>..\..\..\..\software\cmsis\CMSIS\Include; ..\..\..\..\software\cmsis\Device\ARM\CMSDK_CM0plus\Include; ..\..\..\..\software\common\retarget</IncludePath> + </VariousControls> + </Cads> + <Aads> + <interw>1</interw> + <Ropi>0</Ropi> + <Rwpi>0</Rwpi> + <thumb>0</thumb> + <SplitLS>0</SplitLS> + <SwStkChk>0</SwStkChk> + <NoWarn>0</NoWarn> + <VariousControls> + <MiscControls></MiscControls> + <Define></Define> + <Undefine></Undefine> + <IncludePath></IncludePath> + </VariousControls> + </Aads> + <LDads> + <umfTarg>1</umfTarg> + <Ropi>0</Ropi> + <Rwpi>0</Rwpi> + <noStLib>0</noStLib> + <RepFail>1</RepFail> + <useFile>0</useFile> + <TextAddressRange>0x00000000</TextAddressRange> + <DataAddressRange>0x00000000</DataAddressRange> + <ScatterFile></ScatterFile> + <IncludeLibs></IncludeLibs> + <IncludeLibsPath></IncludeLibsPath> + <Misc></Misc> + <LinkerInputFile></LinkerInputFile> + <DisabledWarnings></DisabledWarnings> + </LDads> + </TargetArmAds> + </TargetOption> + <Groups> + <Group> + <GroupName>Startup</GroupName> + <Files> + <File> + <FileName>startup_CMSDK_CM0plus.s</FileName> + <FileType>2</FileType> + <FilePath>..\..\..\..\software\cmsis\Device\ARM\CMSDK_CM0plus\Source\ARM\startup_CMSDK_CM0plus.s</FilePath> + </File> + </Files> + </Group> + <Group> + <GroupName>Application</GroupName> + <Files> + <File> + <FileName>memory_tests.c</FileName> + <FileType>1</FileType> + <FilePath>..\..\..\..\software\common\validation\memory_tests.c</FilePath> + </File> + <File> + <FileName>uart_stdout.c</FileName> + <FileType>1</FileType> + <FilePath>..\..\..\..\software\common\retarget\uart_stdout.c</FilePath> + </File> + <File> + <FileName>retarget.c</FileName> + <FileType>1</FileType> + <FilePath>..\..\..\..\software\common\retarget\retarget.c</FilePath> + </File> + </Files> + </Group> + <Group> + <GroupName>System</GroupName> + <Files> + <File> + <FileName>system_CMSDK_CM0plus.c</FileName> + <FileType>1</FileType> + <FilePath>..\..\..\..\software\cmsis\Device\ARM\CMSDK_CM0plus\Source\system_CMSDK_CM0plus.c</FilePath> + </File> + </Files> + </Group> + </Groups> + </Target> + </Targets> + +</Project> diff --git a/Cortex-M0/nanosoc/systems/mcu/testcodes/romtable_tests/makefile b/Cortex-M0/nanosoc/systems/mcu/testcodes/romtable_tests/makefile new file mode 100644 index 0000000..b1b195a --- /dev/null +++ b/Cortex-M0/nanosoc/systems/mcu/testcodes/romtable_tests/makefile @@ -0,0 +1,266 @@ +#----------------------------------------------------------------------------- +# The confidential and proprietary information contained in this file may +# only be used by a person authorised under and to the extent permitted +# by a subsisting licensing agreement from Arm Limited or its affiliates. +# +# (C) COPYRIGHT 2010-2013 Arm Limited or its affiliates. +# ALL RIGHTS RESERVED +# +# This entire notice must be reproduced on all copies of this file +# and copies of this file may only be made by a person if such person is +# permitted to do so under the terms of a subsisting license agreement +# from Arm Limited or its affiliates. +# +# SVN Information +# +# Checked In : $Date: 2017-10-10 15:55:38 +0100 (Tue, 10 Oct 2017) $ +# +# Revision : $Revision: 371321 $ +# +# Release Information : Cortex-M System Design Kit-r1p1-00rel0 +#----------------------------------------------------------------------------- +# +# Cortex-M System Design Kit software compilation make file +# +#----------------------------------------------------------------------------- +# +# Configurations +# +# Choose the core instantiated, can be +# - CORTEX_M0 +# - CORTEX_M0PLUS +CPU_PRODUCT = CORTEX_M0PLUS + +# Shared software directory +SOFTWARE_DIR = ../../../../software +CMSIS_DIR = $(SOFTWARE_DIR)/cmsis +CORE_DIR = $(CMSIS_DIR)/CMSIS/Include +GENERIC_DIR = ../generic + +ifeq ($(CPU_PRODUCT),CORTEX_M0PLUS) + DEVICE_DIR = $(CMSIS_DIR)/Device/ARM/CMSDK_CM0plus +else + DEVICE_DIR = $(CMSIS_DIR)/Device/ARM/CMSDK_CM0 +endif + +# Program file +TESTNAME = romtable_tests + +# Endian Option +COMPILE_BIGEND = 0 + +# Configuration +ifeq ($(CPU_PRODUCT),CORTEX_M0PLUS) + USER_DEFINE = -DCORTEX_M0PLUS +else + USER_DEFINE = -DCORTEX_M0 +endif + +DEPS_LIST = makefile + +# Tool chain : ds5 / gcc / keil +TOOL_CHAIN = ds5 + +ifeq ($(TOOL_CHAIN),ds5) + ifeq ($(CPU_PRODUCT),CORTEX_M0PLUS) + CPU_TYPE = --cpu Cortex-M0plus + else + CPU_TYPE = --cpu Cortex-M0 + endif +endif + +ifeq ($(TOOL_CHAIN),gcc) + ifeq ($(CPU_PRODUCT),CORTEX_M0PLUS) + CPU_TYPE = -mcpu=cortex-m0plus + else + CPU_TYPE = -mcpu=cortex-m0 + endif +endif + +# Startup code directory for DS-5 +ifeq ($(TOOL_CHAIN),ds5) + STARTUP_DIR = $(DEVICE_DIR)/Source/ARM +endif + +# Startup code directory for gcc +ifeq ($(TOOL_CHAIN),gcc) + STARTUP_DIR = $(DEVICE_DIR)/Source/GCC +endif + +ifeq ($(CPU_PRODUCT),CORTEX_M0PLUS) + STARTUP_FILE = startup_CMSDK_CM0plus + SYSTEM_FILE = system_CMSDK_CM0plus +else + STARTUP_FILE = startup_CMSDK_CM0 + SYSTEM_FILE = system_CMSDK_CM0 +endif + +# Configuration ID values +GENERIC_FILE = $(GENERIC_DIR)/config_id.h + +# --------------------------------------------------------------------------------------- +# DS-5 options + +# MicroLIB option +COMPILE_MICROLIB = 0 + +# Small Multiply (Cortex-M0/M0+ has small multiplier option) +COMPILE_SMALLMUL = 0 + +ARM_CC_OPTIONS = -c -O3 -g -Otime -I $(CORE_DIR) -I $(DEVICE_DIR)/Include -I $(GENERIC_DIR) \ + -I $(SOFTWARE_DIR)/common/retarget -I $(SOFTWARE_DIR)/debug_tester $(USER_DEFINE) + +ARM_ASM_OPTIONS = -g +ARM_LINK_OPTIONS = "--keep=$(STARTUP_FILE).o(RESET)" "--first=$(STARTUP_FILE).o(RESET)" \ + --rw_base 0x30000000 --ro_base 0x00000000 --map + +ifeq ($(COMPILE_BIGEND),1) + # Big Endian + ARM_CC_OPTIONS += --bigend + ARM_ASM_OPTIONS += --bigend + ARM_LINK_OPTIONS += --be8 +endif + +ifeq ($(COMPILE_MICROLIB),1) + # MicroLIB + ARM_CC_OPTIONS += --library_type=microlib + ARM_ASM_OPTIONS += --library_type=microlib --pd "__MICROLIB SETA 1" + ARM_LINK_OPTIONS += --library_type=microlib +endif + +ifeq ($(COMPILE_SMALLMUL),1) + # In Cortex-M0, small multiply take 32 cycles + ARM_CC_OPTIONS += --multiply_latency=32 +endif + + +# --------------------------------------------------------------------------------------- +# gcc options + +GNG_CC = arm-none-eabi-gcc +GNU_OBJDUMP = arm-none-eabi-objdump +GNU_OBJCOPY = arm-none-eabi-objcopy + +LINKER_SCRIPT_PATH = $(SOFTWARE_DIR)/common/scripts +LINKER_SCRIPT = $(LINKER_SCRIPT_PATH)/cmsdk_cm0.ld + +GNU_CC_FLAGS = -g -O3 -mthumb $(CPU_TYPE) + +ifeq ($(COMPILE_BIGEND),1) + # Big Endian + GNU_CC_FLAGS += -mbig-endian +endif + +# --------------------------------------------------------------------------------------- +all: all_$(TOOL_CHAIN) + +# --------------------------------------------------------------------------------------- +# DS-5 +all_ds5 : $(TESTNAME).hex $(TESTNAME).lst + +$(TESTNAME).o : $(SOFTWARE_DIR)/common/romtable_tests/$(TESTNAME).c $(SOFTWARE_DIR)/common/romtable_tests/$(TESTNAME).h $(GENERIC_FILE) $(SOFTWARE_DIR)/debug_tester/debugtester_functions.h $(DEPS_LIST) + armcc $(ARM_CC_OPTIONS) $(CPU_TYPE) $< -o $@ + +mcu_debugtester_interface.o : $(GENERIC_DIR)/mcu_debugtester_interface.c $(DEPS_LIST) + armcc $(ARM_CC_OPTIONS) $(CPU_TYPE) $< -o $@ + +$(SYSTEM_FILE).o : $(DEVICE_DIR)/Source/$(SYSTEM_FILE).c $(DEPS_LIST) + armcc $(ARM_CC_OPTIONS) $(CPU_TYPE) $< -o $@ + +retarget.o : $(SOFTWARE_DIR)/common/retarget/retarget.c $(DEPS_LIST) + armcc $(ARM_CC_OPTIONS) $(CPU_TYPE) $< -o $@ + +uart_stdout.o : $(SOFTWARE_DIR)/common/retarget/uart_stdout.c $(DEPS_LIST) + armcc $(ARM_CC_OPTIONS) $(CPU_TYPE) $< -o $@ + +CMSDK_driver.o : $(DEVICE_DIR)/Source/CMSDK_driver.c $(DEPS_LIST) + armcc $(ARM_CC_OPTIONS) $(CPU_TYPE) $< -o $@ + +$(STARTUP_FILE).o : $(STARTUP_DIR)/$(STARTUP_FILE).s $(DEPS_LIST) + armasm $(ARM_ASM_OPTIONS) $(CPU_TYPE) $< -o $@ + +$(TESTNAME).ELF: $(TESTNAME).o $(SYSTEM_FILE).o $(STARTUP_FILE).o retarget.o uart_stdout.o CMSDK_driver.o mcu_debugtester_interface.o + armlink $(ARM_LINK_OPTIONS) -o $@ $(TESTNAME).o $(SYSTEM_FILE).o $(STARTUP_FILE).o retarget.o uart_stdout.o CMSDK_driver.o mcu_debugtester_interface.o + +$(TESTNAME).hex : $(TESTNAME).ELF + fromelf --vhx --8x1 $< --output $@ + + +$(TESTNAME).lst : $(TESTNAME).ELF + fromelf -c -d -e -s $< --output $@ + +# --------------------------------------------------------------------------------------- +# gcc +all_gcc: + $(GNG_CC) $(GNU_CC_FLAGS) $(STARTUP_DIR)/$(STARTUP_FILE).s \ + $(SOFTWARE_DIR)/common/romtable_tests/$(TESTNAME).c \ + $(GENERIC_DIR)/mcu_debugtester_interface.c \ + $(SOFTWARE_DIR)/common/retarget/retarget.c \ + $(SOFTWARE_DIR)/common/retarget/uart_stdout.c \ + $(DEVICE_DIR)/Source/CMSDK_driver.c \ + $(DEVICE_DIR)/Source/$(SYSTEM_FILE).c \ + -I $(DEVICE_DIR)/Include -I $(CORE_DIR) \ + -I $(GENERIC_DIR) \ + -I $(SOFTWARE_DIR)/common/retarget \ + -I $(SOFTWARE_DIR)/debug_tester \ + -L $(LINKER_SCRIPT_PATH) \ + -D__STACK_SIZE=0x200 \ + -D__HEAP_SIZE=0x1000 \ + $(USER_DEFINE) -T $(LINKER_SCRIPT) -o $(TESTNAME).o + # Generate disassembly code + $(GNU_OBJDUMP) -S $(TESTNAME).o > $(TESTNAME).lst + # Generate binary file + $(GNU_OBJCOPY) -S $(TESTNAME).o -O binary $(TESTNAME).bin + # Generate hex file + $(GNU_OBJCOPY) -S $(TESTNAME).o -O verilog $(TESTNAME).hex + +# Note: +# If the version of object copy you are using does not support verilog hex file output, +# you can generate the hex file from binary file using the following command +# od -v -A n -t x1 --width=1 $(TESTNAME).bin > $(TESTNAME).hex + + +# --------------------------------------------------------------------------------------- +# Keil MDK + +all_keil: + @echo "Please compile your project code and press ENTER when ready" + @read dummy + +# --------------------------------------------------------------------------------------- +# Binary + +all_bin: $(TESTNAME).bin + # Generate hex file from binary + od -v -A n -t x1 --width=1 $(TESTNAME).bin > $(TESTNAME).hex + +# --------------------------------------------------------------------------------------- +# Clean +clean : + @rm -rf *.o + @if [ -e $(TESTNAME).hex ] ; then \ + rm -rf $(TESTNAME).hex ; \ + fi + @if [ -e $(TESTNAME).lst ] ; then \ + rm -rf $(TESTNAME).lst ; \ + fi + @if [ -e $(TESTNAME).ELF ] ; then \ + rm -rf $(TESTNAME).ELF ; \ + fi + @if [ -e $(TESTNAME).bin ] ; then \ + rm -rf $(TESTNAME).bin ; \ + fi + @rm -rf *.crf + @rm -rf *.plg + @rm -rf *.tra + @rm -rf *.htm + @rm -rf *.map + @rm -rf *.dep + @rm -rf *.d + @rm -rf *.lnp + @rm -rf *.bak + @rm -rf *.lst + @rm -rf *.axf + @rm -rf *.sct + @rm -rf *.__i + @rm -rf *._ia diff --git a/Cortex-M0/nanosoc/systems/mcu/testcodes/romtable_tests/romtable_tests_cm0.uvopt b/Cortex-M0/nanosoc/systems/mcu/testcodes/romtable_tests/romtable_tests_cm0.uvopt new file mode 100644 index 0000000..f5deaa3 --- /dev/null +++ b/Cortex-M0/nanosoc/systems/mcu/testcodes/romtable_tests/romtable_tests_cm0.uvopt @@ -0,0 +1,293 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no" ?> +<ProjectOpt xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="project_opt.xsd"> + + <SchemaVersion>1.0</SchemaVersion> + + <Header>### uVision Project, (C) Keil Software</Header> + + <Extensions> + <cExt>*.c</cExt> + <aExt>*.s*; *.src; *.a*</aExt> + <oExt>*.obj</oExt> + <lExt>*.lib</lExt> + <tExt>*.txt; *.h; *.inc</tExt> + <pExt>*.plm</pExt> + <CppX>*.cpp</CppX> + </Extensions> + + <DaveTm> + <dwLowDateTime>0</dwLowDateTime> + <dwHighDateTime>0</dwHighDateTime> + </DaveTm> + + <Target> + <TargetName>Debug</TargetName> + <ToolsetNumber>0x4</ToolsetNumber> + <ToolsetName>ARM-ADS</ToolsetName> + <TargetOption> + <CLKADS>50000000</CLKADS> + <OPTTT> + <gFlags>1</gFlags> + <BeepAtEnd>1</BeepAtEnd> + <RunSim>1</RunSim> + <RunTarget>0</RunTarget> + </OPTTT> + <OPTHX> + <HexSelection>1</HexSelection> + <FlashByte>65535</FlashByte> + <HexRangeLowAddress>0</HexRangeLowAddress> + <HexRangeHighAddress>0</HexRangeHighAddress> + <HexOffset>0</HexOffset> + </OPTHX> + <OPTLEX> + <PageWidth>79</PageWidth> + <PageLength>66</PageLength> + <TabStop>8</TabStop> + <ListingPath>.\</ListingPath> + </OPTLEX> + <ListingPage> + <CreateCListing>1</CreateCListing> + <CreateAListing>1</CreateAListing> + <CreateLListing>1</CreateLListing> + <CreateIListing>0</CreateIListing> + <AsmCond>1</AsmCond> + <AsmSymb>1</AsmSymb> + <AsmXref>0</AsmXref> + <CCond>1</CCond> + <CCode>0</CCode> + <CListInc>0</CListInc> + <CSymb>0</CSymb> + <LinkerCodeListing>0</LinkerCodeListing> + </ListingPage> + <OPTXL> + <LMap>1</LMap> + <LComments>1</LComments> + <LGenerateSymbols>1</LGenerateSymbols> + <LLibSym>1</LLibSym> + <LLines>1</LLines> + <LLocSym>1</LLocSym> + <LPubSym>1</LPubSym> + <LXref>0</LXref> + <LExpSel>0</LExpSel> + </OPTXL> + <OPTFL> + <tvExp>1</tvExp> + <tvExpOptDlg>0</tvExpOptDlg> + <IsCurrentTarget>1</IsCurrentTarget> + </OPTFL> + <CpuCode>255</CpuCode> + <DllOpt> + <SimDllName>SARMCM3.DLL</SimDllName> + <SimDllArguments></SimDllArguments> + <SimDlgDllName>DARMCM1.DLL</SimDlgDllName> + <SimDlgDllArguments></SimDlgDllArguments> + <TargetDllName>SARMCM3.DLL</TargetDllName> + <TargetDllArguments></TargetDllArguments> + <TargetDlgDllName>TARMCM1.DLL</TargetDlgDllName> + <TargetDlgDllArguments></TargetDlgDllArguments> + </DllOpt> + <DebugOpt> + <uSim>1</uSim> + <uTrg>0</uTrg> + <sLdApp>1</sLdApp> + <sGomain>1</sGomain> + <sRbreak>1</sRbreak> + <sRwatch>1</sRwatch> + <sRmem>1</sRmem> + <sRfunc>1</sRfunc> + <sRbox>1</sRbox> + <tLdApp>1</tLdApp> + <tGomain>0</tGomain> + <tRbreak>1</tRbreak> + <tRwatch>1</tRwatch> + <tRmem>1</tRmem> + <tRfunc>0</tRfunc> + <tRbox>1</tRbox> + <tRtrace>0</tRtrace> + <sRunDeb>0</sRunDeb> + <sLrtime>0</sLrtime> + <nTsel>-1</nTsel> + <sDll></sDll> + <sDllPa></sDllPa> + <sDlgDll></sDlgDll> + <sDlgPa></sDlgPa> + <sIfile></sIfile> + <tDll></tDll> + <tDllPa></tDllPa> + <tDlgDll></tDlgDll> + <tDlgPa></tDlgPa> + <tIfile></tIfile> + <pMon></pMon> + </DebugOpt> + <Breakpoint/> + <DebugFlag> + <trace>0</trace> + <periodic>1</periodic> + <aLwin>0</aLwin> + <aCover>0</aCover> + <aSer1>0</aSer1> + <aSer2>0</aSer2> + <aPa>0</aPa> + <viewmode>0</viewmode> + <vrSel>0</vrSel> + <aSym>0</aSym> + <aTbox>0</aTbox> + <AscS1>0</AscS1> + <AscS2>0</AscS2> + <AscS3>0</AscS3> + <aSer3>0</aSer3> + <eProf>0</eProf> + <aLa>0</aLa> + <aPa1>0</aPa1> + <AscS4>0</AscS4> + <aSer4>0</aSer4> + <StkLoc>0</StkLoc> + <TrcWin>0</TrcWin> + <newCpu>0</newCpu> + <uProt>0</uProt> + </DebugFlag> + <Tracepoint> + <THDelay>0</THDelay> + </Tracepoint> + <LintExecutable></LintExecutable> + <LintConfigFile></LintConfigFile> + </TargetOption> + </Target> + + <Group> + <GroupName>Startup</GroupName> + <tvExp>1</tvExp> + <tvExpOptDlg>0</tvExpOptDlg> + <cbSel>0</cbSel> + <RteFlg>0</RteFlg> + <File> + <GroupNumber>1</GroupNumber> + <FileNumber>1</FileNumber> + <FileType>2</FileType> + <tvExp>0</tvExp> + <Focus>0</Focus> + <ColumnNumber>0</ColumnNumber> + <tvExpOptDlg>0</tvExpOptDlg> + <TopLine>0</TopLine> + <CurrentLine>0</CurrentLine> + <bDave2>0</bDave2> + <PathWithFileName>..\..\..\..\software\cmsis\Device\ARM\CMSDK_CM0\Source\ARM\startup_CMSDK_CM0.s</PathWithFileName> + <FilenameWithoutPath>startup_CMSDK_CM0.s</FilenameWithoutPath> + <RteFlg>0</RteFlg> + <bShared>0</bShared> + </File> + </Group> + + <Group> + <GroupName>Application</GroupName> + <tvExp>1</tvExp> + <tvExpOptDlg>0</tvExpOptDlg> + <cbSel>0</cbSel> + <RteFlg>0</RteFlg> + <File> + <GroupNumber>2</GroupNumber> + <FileNumber>2</FileNumber> + <FileType>1</FileType> + <tvExp>0</tvExp> + <Focus>0</Focus> + <ColumnNumber>0</ColumnNumber> + <tvExpOptDlg>0</tvExpOptDlg> + <TopLine>0</TopLine> + <CurrentLine>0</CurrentLine> + <bDave2>0</bDave2> + <PathWithFileName>..\..\..\..\software\common\romtable_tests\romtable_tests.c</PathWithFileName> + <FilenameWithoutPath>romtable_tests.c</FilenameWithoutPath> + <RteFlg>0</RteFlg> + <bShared>0</bShared> + </File> + <File> + <GroupNumber>2</GroupNumber> + <FileNumber>3</FileNumber> + <FileType>1</FileType> + <tvExp>0</tvExp> + <Focus>0</Focus> + <ColumnNumber>0</ColumnNumber> + <tvExpOptDlg>0</tvExpOptDlg> + <TopLine>0</TopLine> + <CurrentLine>0</CurrentLine> + <bDave2>0</bDave2> + <PathWithFileName>..\..\..\..\software\common\retarget\uart_stdout.c</PathWithFileName> + <FilenameWithoutPath>uart_stdout.c</FilenameWithoutPath> + <RteFlg>0</RteFlg> + <bShared>0</bShared> + </File> + <File> + <GroupNumber>2</GroupNumber> + <FileNumber>4</FileNumber> + <FileType>1</FileType> + <tvExp>0</tvExp> + <Focus>0</Focus> + <ColumnNumber>0</ColumnNumber> + <tvExpOptDlg>0</tvExpOptDlg> + <TopLine>0</TopLine> + <CurrentLine>0</CurrentLine> + <bDave2>0</bDave2> + <PathWithFileName>..\..\..\..\software\common\retarget\retarget.c</PathWithFileName> + <FilenameWithoutPath>retarget.c</FilenameWithoutPath> + <RteFlg>0</RteFlg> + <bShared>0</bShared> + </File> + <File> + <GroupNumber>2</GroupNumber> + <FileNumber>5</FileNumber> + <FileType>1</FileType> + <tvExp>0</tvExp> + <Focus>0</Focus> + <ColumnNumber>0</ColumnNumber> + <tvExpOptDlg>0</tvExpOptDlg> + <TopLine>0</TopLine> + <CurrentLine>0</CurrentLine> + <bDave2>0</bDave2> + <PathWithFileName>..\generic\mcu_debugtester_interface.c</PathWithFileName> + <FilenameWithoutPath>mcu_debugtester_interface.c</FilenameWithoutPath> + <RteFlg>0</RteFlg> + <bShared>0</bShared> + </File> + </Group> + + <Group> + <GroupName>System</GroupName> + <tvExp>1</tvExp> + <tvExpOptDlg>0</tvExpOptDlg> + <cbSel>0</cbSel> + <RteFlg>0</RteFlg> + <File> + <GroupNumber>3</GroupNumber> + <FileNumber>6</FileNumber> + <FileType>1</FileType> + <tvExp>0</tvExp> + <Focus>0</Focus> + <ColumnNumber>0</ColumnNumber> + <tvExpOptDlg>0</tvExpOptDlg> + <TopLine>0</TopLine> + <CurrentLine>0</CurrentLine> + <bDave2>0</bDave2> + <PathWithFileName>..\..\..\..\software\cmsis\Device\ARM\CMSDK_CM0\Source\system_CMSDK_CM0.c</PathWithFileName> + <FilenameWithoutPath>system_CMSDK_CM0.c</FilenameWithoutPath> + <RteFlg>0</RteFlg> + <bShared>0</bShared> + </File> + <File> + <GroupNumber>3</GroupNumber> + <FileNumber>7</FileNumber> + <FileType>1</FileType> + <tvExp>0</tvExp> + <Focus>0</Focus> + <ColumnNumber>0</ColumnNumber> + <tvExpOptDlg>0</tvExpOptDlg> + <TopLine>0</TopLine> + <CurrentLine>0</CurrentLine> + <bDave2>0</bDave2> + <PathWithFileName>..\..\..\..\software\cmsis\Device\ARM\CMSDK_CM0\Source\CMSDK_driver.c</PathWithFileName> + <FilenameWithoutPath>CMSDK_driver.c</FilenameWithoutPath> + <RteFlg>0</RteFlg> + <bShared>0</bShared> + </File> + </Group> + +</ProjectOpt> diff --git a/Cortex-M0/nanosoc/systems/mcu/testcodes/romtable_tests/romtable_tests_cm0.uvproj b/Cortex-M0/nanosoc/systems/mcu/testcodes/romtable_tests/romtable_tests_cm0.uvproj new file mode 100644 index 0000000..94e86e6 --- /dev/null +++ b/Cortex-M0/nanosoc/systems/mcu/testcodes/romtable_tests/romtable_tests_cm0.uvproj @@ -0,0 +1,445 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no" ?> +<Project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="project_proj.xsd"> + + <SchemaVersion>1.1</SchemaVersion> + + <Header>### uVision Project, (C) Keil Software</Header> + + <Targets> + <Target> + <TargetName>Debug</TargetName> + <ToolsetNumber>0x4</ToolsetNumber> + <ToolsetName>ARM-ADS</ToolsetName> + <TargetOption> + <TargetCommonOption> + <Device>Cortex-M0</Device> + <Vendor>ARM</Vendor> + <Cpu>CLOCK(12000000) CPUTYPE("Cortex-M0") ESEL ELITTLE</Cpu> + <FlashUtilSpec></FlashUtilSpec> + <StartupFile></StartupFile> + <FlashDriverDll></FlashDriverDll> + <DeviceId>4803</DeviceId> + <RegisterFile></RegisterFile> + <MemoryEnv></MemoryEnv> + <Cmp></Cmp> + <Asm></Asm> + <Linker></Linker> + <OHString></OHString> + <InfinionOptionDll></InfinionOptionDll> + <SLE66CMisc></SLE66CMisc> + <SLE66AMisc></SLE66AMisc> + <SLE66LinkerMisc></SLE66LinkerMisc> + <SFDFile></SFDFile> + <UseEnv>0</UseEnv> + <BinPath></BinPath> + <IncludePath></IncludePath> + <LibPath></LibPath> + <RegisterFilePath></RegisterFilePath> + <DBRegisterFilePath></DBRegisterFilePath> + <TargetStatus> + <Error>0</Error> + <ExitCodeStop>0</ExitCodeStop> + <ButtonStop>0</ButtonStop> + <NotGenerated>0</NotGenerated> + <InvalidFlash>1</InvalidFlash> + </TargetStatus> + <OutputDirectory>.\</OutputDirectory> + <OutputName>romtable_tests</OutputName> + <CreateExecutable>1</CreateExecutable> + <CreateLib>0</CreateLib> + <CreateHexFile>0</CreateHexFile> + <DebugInformation>1</DebugInformation> + <BrowseInformation>1</BrowseInformation> + <ListingPath>.\</ListingPath> + <HexFormatSelection>1</HexFormatSelection> + <Merge32K>0</Merge32K> + <CreateBatchFile>0</CreateBatchFile> + <BeforeCompile> + <RunUserProg1>0</RunUserProg1> + <RunUserProg2>0</RunUserProg2> + <UserProg1Name></UserProg1Name> + <UserProg2Name></UserProg2Name> + <UserProg1Dos16Mode>0</UserProg1Dos16Mode> + <UserProg2Dos16Mode>0</UserProg2Dos16Mode> + <nStopU1X>0</nStopU1X> + <nStopU2X>0</nStopU2X> + </BeforeCompile> + <BeforeMake> + <RunUserProg1>0</RunUserProg1> + <RunUserProg2>0</RunUserProg2> + <UserProg1Name></UserProg1Name> + <UserProg2Name></UserProg2Name> + <UserProg1Dos16Mode>0</UserProg1Dos16Mode> + <UserProg2Dos16Mode>0</UserProg2Dos16Mode> + </BeforeMake> + <AfterMake> + <RunUserProg1>1</RunUserProg1> + <RunUserProg2>0</RunUserProg2> + <UserProg1Name>$K\ARM\ARMCC\BIN\fromelf.exe #L --vhx --8x1 --output romtable_tests.hex</UserProg1Name> + <UserProg2Name></UserProg2Name> + <UserProg1Dos16Mode>0</UserProg1Dos16Mode> + <UserProg2Dos16Mode>0</UserProg2Dos16Mode> + </AfterMake> + <SelectedForBatchBuild>0</SelectedForBatchBuild> + <SVCSIdString></SVCSIdString> + </TargetCommonOption> + <CommonProperty> + <UseCPPCompiler>0</UseCPPCompiler> + <RVCTCodeConst>0</RVCTCodeConst> + <RVCTZI>0</RVCTZI> + <RVCTOtherData>0</RVCTOtherData> + <ModuleSelection>0</ModuleSelection> + <IncludeInBuild>1</IncludeInBuild> + <AlwaysBuild>0</AlwaysBuild> + <GenerateAssemblyFile>0</GenerateAssemblyFile> + <AssembleAssemblyFile>0</AssembleAssemblyFile> + <PublicsOnly>0</PublicsOnly> + <StopOnExitCode>3</StopOnExitCode> + <CustomArgument></CustomArgument> + <IncludeLibraryModules></IncludeLibraryModules> + </CommonProperty> + <DllOption> + <SimDllName>SARMCM3.DLL</SimDllName> + <SimDllArguments></SimDllArguments> + <SimDlgDll>DARMCM1.DLL</SimDlgDll> + <SimDlgDllArguments></SimDlgDllArguments> + <TargetDllName>SARMCM3.DLL</TargetDllName> + <TargetDllArguments></TargetDllArguments> + <TargetDlgDll>TARMCM1.DLL</TargetDlgDll> + <TargetDlgDllArguments></TargetDlgDllArguments> + </DllOption> + <DebugOption> + <OPTHX> + <HexSelection>1</HexSelection> + <HexRangeLowAddress>0</HexRangeLowAddress> + <HexRangeHighAddress>0</HexRangeHighAddress> + <HexOffset>0</HexOffset> + <Oh166RecLen>16</Oh166RecLen> + </OPTHX> + <Simulator> + <UseSimulator>1</UseSimulator> + <LoadApplicationAtStartup>1</LoadApplicationAtStartup> + <RunToMain>1</RunToMain> + <RestoreBreakpoints>1</RestoreBreakpoints> + <RestoreWatchpoints>1</RestoreWatchpoints> + <RestoreMemoryDisplay>1</RestoreMemoryDisplay> + <RestoreFunctions>1</RestoreFunctions> + <RestoreToolbox>1</RestoreToolbox> + <LimitSpeedToRealTime>0</LimitSpeedToRealTime> + </Simulator> + <Target> + <UseTarget>0</UseTarget> + <LoadApplicationAtStartup>1</LoadApplicationAtStartup> + <RunToMain>0</RunToMain> + <RestoreBreakpoints>1</RestoreBreakpoints> + <RestoreWatchpoints>1</RestoreWatchpoints> + <RestoreMemoryDisplay>1</RestoreMemoryDisplay> + <RestoreFunctions>0</RestoreFunctions> + <RestoreToolbox>1</RestoreToolbox> + <RestoreTracepoints>0</RestoreTracepoints> + </Target> + <RunDebugAfterBuild>0</RunDebugAfterBuild> + <TargetSelection>-1</TargetSelection> + <SimDlls> + <CpuDll></CpuDll> + <CpuDllArguments></CpuDllArguments> + <PeripheralDll></PeripheralDll> + <PeripheralDllArguments></PeripheralDllArguments> + <InitializationFile></InitializationFile> + </SimDlls> + <TargetDlls> + <CpuDll></CpuDll> + <CpuDllArguments></CpuDllArguments> + <PeripheralDll></PeripheralDll> + <PeripheralDllArguments></PeripheralDllArguments> + <InitializationFile></InitializationFile> + <Driver></Driver> + </TargetDlls> + </DebugOption> + <Utilities> + <Flash1> + <UseTargetDll>0</UseTargetDll> + <UseExternalTool>0</UseExternalTool> + <RunIndependent>0</RunIndependent> + <UpdateFlashBeforeDebugging>0</UpdateFlashBeforeDebugging> + <Capability>0</Capability> + <DriverSelection>-1</DriverSelection> + </Flash1> + <Flash2></Flash2> + <Flash3></Flash3> + <Flash4></Flash4> + </Utilities> + <TargetArmAds> + <ArmAdsMisc> + <GenerateListings>0</GenerateListings> + <asHll>1</asHll> + <asAsm>1</asAsm> + <asMacX>1</asMacX> + <asSyms>1</asSyms> + <asFals>1</asFals> + <asDbgD>1</asDbgD> + <asForm>1</asForm> + <ldLst>0</ldLst> + <ldmm>1</ldmm> + <ldXref>1</ldXref> + <BigEnd>0</BigEnd> + <AdsALst>1</AdsALst> + <AdsACrf>1</AdsACrf> + <AdsANop>0</AdsANop> + <AdsANot>0</AdsANot> + <AdsLLst>1</AdsLLst> + <AdsLmap>1</AdsLmap> + <AdsLcgr>1</AdsLcgr> + <AdsLsym>1</AdsLsym> + <AdsLszi>1</AdsLszi> + <AdsLtoi>1</AdsLtoi> + <AdsLsun>1</AdsLsun> + <AdsLven>1</AdsLven> + <AdsLsxf>1</AdsLsxf> + <RvctClst>0</RvctClst> + <GenPPlst>0</GenPPlst> + <AdsCpuType>"Cortex-M0"</AdsCpuType> + <RvctDeviceName></RvctDeviceName> + <mOS>0</mOS> + <uocRom>0</uocRom> + <uocRam>0</uocRam> + <hadIROM>0</hadIROM> + <hadIRAM>0</hadIRAM> + <hadXRAM>0</hadXRAM> + <uocXRam>0</uocXRam> + <RvdsVP>0</RvdsVP> + <hadIRAM2>0</hadIRAM2> + <hadIROM2>0</hadIROM2> + <StupSel>1</StupSel> + <useUlib>0</useUlib> + <EndSel>1</EndSel> + <uLtcg>0</uLtcg> + <RoSelD>0</RoSelD> + <RwSelD>5</RwSelD> + <CodeSel>0</CodeSel> + <OptFeed>0</OptFeed> + <NoZi1>0</NoZi1> + <NoZi2>0</NoZi2> + <NoZi3>0</NoZi3> + <NoZi4>0</NoZi4> + <NoZi5>0</NoZi5> + <Ro1Chk>1</Ro1Chk> + <Ro2Chk>0</Ro2Chk> + <Ro3Chk>0</Ro3Chk> + <Ir1Chk>0</Ir1Chk> + <Ir2Chk>0</Ir2Chk> + <Ra1Chk>1</Ra1Chk> + <Ra2Chk>0</Ra2Chk> + <Ra3Chk>0</Ra3Chk> + <Im1Chk>0</Im1Chk> + <Im2Chk>0</Im2Chk> + <OnChipMemories> + <Ocm1> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </Ocm1> + <Ocm2> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </Ocm2> + <Ocm3> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </Ocm3> + <Ocm4> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </Ocm4> + <Ocm5> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </Ocm5> + <Ocm6> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </Ocm6> + <IRAM> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </IRAM> + <IROM> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </IROM> + <XRAM> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </XRAM> + <OCR_RVCT1> + <Type>1</Type> + <StartAddress>0x0</StartAddress> + <Size>0x10000</Size> + </OCR_RVCT1> + <OCR_RVCT2> + <Type>1</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </OCR_RVCT2> + <OCR_RVCT3> + <Type>1</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </OCR_RVCT3> + <OCR_RVCT4> + <Type>1</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </OCR_RVCT4> + <OCR_RVCT5> + <Type>1</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </OCR_RVCT5> + <OCR_RVCT6> + <Type>0</Type> + <StartAddress>0x20000000</StartAddress> + <Size>0x10000</Size> + </OCR_RVCT6> + <OCR_RVCT7> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </OCR_RVCT7> + <OCR_RVCT8> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </OCR_RVCT8> + <OCR_RVCT9> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </OCR_RVCT9> + <OCR_RVCT10> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </OCR_RVCT10> + </OnChipMemories> + <RvctStartVector></RvctStartVector> + </ArmAdsMisc> + <Cads> + <interw>1</interw> + <Optim>3</Optim> + <oTime>0</oTime> + <SplitLS>0</SplitLS> + <OneElfS>0</OneElfS> + <Strict>0</Strict> + <EnumInt>0</EnumInt> + <PlainCh>0</PlainCh> + <Ropi>0</Ropi> + <Rwpi>0</Rwpi> + <wLevel>0</wLevel> + <uThumb>0</uThumb> + <uSurpInc>0</uSurpInc> + <VariousControls> + <MiscControls></MiscControls> + <Define>CORTEX_M0</Define> + <Undefine></Undefine> + <IncludePath>..\..\..\..\software\cmsis\CMSIS\Include; ..\..\..\..\software\cmsis\Device\ARM\CMSDK_CM0\Include; ..\..\..\..\software\common\retarget; ..\..\..\..\software\debug_tester; ..\generic</IncludePath> + </VariousControls> + </Cads> + <Aads> + <interw>1</interw> + <Ropi>0</Ropi> + <Rwpi>0</Rwpi> + <thumb>0</thumb> + <SplitLS>0</SplitLS> + <SwStkChk>0</SwStkChk> + <NoWarn>0</NoWarn> + <uSurpInc>0</uSurpInc> + <VariousControls> + <MiscControls></MiscControls> + <Define></Define> + <Undefine></Undefine> + <IncludePath></IncludePath> + </VariousControls> + </Aads> + <LDads> + <umfTarg>1</umfTarg> + <Ropi>0</Ropi> + <Rwpi>0</Rwpi> + <noStLib>0</noStLib> + <RepFail>1</RepFail> + <useFile>0</useFile> + <TextAddressRange>0x00000000</TextAddressRange> + <DataAddressRange>0x00000000</DataAddressRange> + <ScatterFile></ScatterFile> + <IncludeLibs></IncludeLibs> + <IncludeLibsPath></IncludeLibsPath> + <Misc></Misc> + <LinkerInputFile></LinkerInputFile> + <DisabledWarnings></DisabledWarnings> + </LDads> + </TargetArmAds> + </TargetOption> + <Groups> + <Group> + <GroupName>Startup</GroupName> + <Files> + <File> + <FileName>startup_CMSDK_CM0.s</FileName> + <FileType>2</FileType> + <FilePath>..\..\..\..\software\cmsis\Device\ARM\CMSDK_CM0\Source\ARM\startup_CMSDK_CM0.s</FilePath> + </File> + </Files> + </Group> + <Group> + <GroupName>Application</GroupName> + <Files> + <File> + <FileName>romtable_tests.c</FileName> + <FileType>1</FileType> + <FilePath>..\..\..\..\software\common\romtable_tests\romtable_tests.c</FilePath> + </File> + <File> + <FileName>uart_stdout.c</FileName> + <FileType>1</FileType> + <FilePath>..\..\..\..\software\common\retarget\uart_stdout.c</FilePath> + </File> + <File> + <FileName>retarget.c</FileName> + <FileType>1</FileType> + <FilePath>..\..\..\..\software\common\retarget\retarget.c</FilePath> + </File> + <File> + <FileName>mcu_debugtester_interface.c</FileName> + <FileType>1</FileType> + <FilePath>..\generic\mcu_debugtester_interface.c</FilePath> + </File> + </Files> + </Group> + <Group> + <GroupName>System</GroupName> + <Files> + <File> + <FileName>system_CMSDK_CM0.c</FileName> + <FileType>1</FileType> + <FilePath>..\..\..\..\software\cmsis\Device\ARM\CMSDK_CM0\Source\system_CMSDK_CM0.c</FilePath> + </File> + <File> + <FileName>CMSDK_driver.c</FileName> + <FileType>1</FileType> + <FilePath>..\..\..\..\software\cmsis\Device\ARM\CMSDK_CM0\Source\CMSDK_driver.c</FilePath> + </File> + </Files> + </Group> + </Groups> + </Target> + </Targets> + +</Project> diff --git a/Cortex-M0/nanosoc/systems/mcu/testcodes/romtable_tests/romtable_tests_cm0p.uvopt b/Cortex-M0/nanosoc/systems/mcu/testcodes/romtable_tests/romtable_tests_cm0p.uvopt new file mode 100644 index 0000000..1819e74 --- /dev/null +++ b/Cortex-M0/nanosoc/systems/mcu/testcodes/romtable_tests/romtable_tests_cm0p.uvopt @@ -0,0 +1,272 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no" ?> +<ProjectOpt xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="project_opt.xsd"> + + <SchemaVersion>1.0</SchemaVersion> + + <Header>### uVision Project, (C) Keil Software</Header> + + <Extensions> + <cExt>*.c</cExt> + <aExt>*.s*; *.src; *.a*</aExt> + <oExt>*.obj</oExt> + <lExt>*.lib</lExt> + <tExt>*.txt; *.h; *.inc</tExt> + <pExt>*.plm</pExt> + <CppX>*.cpp</CppX> + </Extensions> + + <DaveTm> + <dwLowDateTime>0</dwLowDateTime> + <dwHighDateTime>0</dwHighDateTime> + </DaveTm> + + <Target> + <TargetName>Debug</TargetName> + <ToolsetNumber>0x4</ToolsetNumber> + <ToolsetName>ARM-ADS</ToolsetName> + <TargetOption> + <CLKADS>50000000</CLKADS> + <OPTTT> + <gFlags>1</gFlags> + <BeepAtEnd>1</BeepAtEnd> + <RunSim>1</RunSim> + <RunTarget>0</RunTarget> + </OPTTT> + <OPTHX> + <HexSelection>1</HexSelection> + <FlashByte>65535</FlashByte> + <HexRangeLowAddress>0</HexRangeLowAddress> + <HexRangeHighAddress>0</HexRangeHighAddress> + <HexOffset>0</HexOffset> + </OPTHX> + <OPTLEX> + <PageWidth>79</PageWidth> + <PageLength>66</PageLength> + <TabStop>8</TabStop> + <ListingPath>.\</ListingPath> + </OPTLEX> + <ListingPage> + <CreateCListing>1</CreateCListing> + <CreateAListing>1</CreateAListing> + <CreateLListing>1</CreateLListing> + <CreateIListing>0</CreateIListing> + <AsmCond>1</AsmCond> + <AsmSymb>1</AsmSymb> + <AsmXref>0</AsmXref> + <CCond>1</CCond> + <CCode>0</CCode> + <CListInc>0</CListInc> + <CSymb>0</CSymb> + <LinkerCodeListing>0</LinkerCodeListing> + </ListingPage> + <OPTXL> + <LMap>1</LMap> + <LComments>1</LComments> + <LGenerateSymbols>1</LGenerateSymbols> + <LLibSym>1</LLibSym> + <LLines>1</LLines> + <LLocSym>1</LLocSym> + <LPubSym>1</LPubSym> + <LXref>0</LXref> + <LExpSel>0</LExpSel> + </OPTXL> + <OPTFL> + <tvExp>1</tvExp> + <tvExpOptDlg>0</tvExpOptDlg> + <IsCurrentTarget>1</IsCurrentTarget> + </OPTFL> + <CpuCode>255</CpuCode> + <DllOpt> + <SimDllName>SARMCM3.DLL</SimDllName> + <SimDllArguments></SimDllArguments> + <SimDlgDllName>DARMCM1.DLL</SimDlgDllName> + <SimDlgDllArguments></SimDlgDllArguments> + <TargetDllName>SARMCM3.DLL</TargetDllName> + <TargetDllArguments></TargetDllArguments> + <TargetDlgDllName>TARMCM1.DLL</TargetDlgDllName> + <TargetDlgDllArguments></TargetDlgDllArguments> + </DllOpt> + <DebugOpt> + <uSim>1</uSim> + <uTrg>0</uTrg> + <sLdApp>1</sLdApp> + <sGomain>1</sGomain> + <sRbreak>1</sRbreak> + <sRwatch>1</sRwatch> + <sRmem>1</sRmem> + <sRfunc>1</sRfunc> + <sRbox>1</sRbox> + <tLdApp>1</tLdApp> + <tGomain>0</tGomain> + <tRbreak>1</tRbreak> + <tRwatch>1</tRwatch> + <tRmem>1</tRmem> + <tRfunc>0</tRfunc> + <tRbox>1</tRbox> + <sRunDeb>0</sRunDeb> + <sLrtime>0</sLrtime> + <nTsel>-1</nTsel> + <sDll></sDll> + <sDllPa></sDllPa> + <sDlgDll></sDlgDll> + <sDlgPa></sDlgPa> + <sIfile></sIfile> + <tDll></tDll> + <tDllPa></tDllPa> + <tDlgDll></tDlgDll> + <tDlgPa></tDlgPa> + <tIfile></tIfile> + <pMon></pMon> + </DebugOpt> + <Breakpoint/> + <DebugFlag> + <trace>0</trace> + <periodic>1</periodic> + <aLwin>0</aLwin> + <aCover>0</aCover> + <aSer1>0</aSer1> + <aSer2>0</aSer2> + <aPa>0</aPa> + <viewmode>0</viewmode> + <vrSel>0</vrSel> + <aSym>0</aSym> + <aTbox>0</aTbox> + <AscS1>0</AscS1> + <AscS2>0</AscS2> + <AscS3>0</AscS3> + <aSer3>0</aSer3> + <eProf>0</eProf> + <aLa>0</aLa> + <aPa1>0</aPa1> + <AscS4>0</AscS4> + <aSer4>0</aSer4> + <StkLoc>0</StkLoc> + <TrcWin>0</TrcWin> + <newCpu>0</newCpu> + <uProt>0</uProt> + </DebugFlag> + <LintExecutable></LintExecutable> + <LintConfigFile></LintConfigFile> + </TargetOption> + </Target> + + <Group> + <GroupName>Startup</GroupName> + <tvExp>1</tvExp> + <tvExpOptDlg>0</tvExpOptDlg> + <cbSel>0</cbSel> + <File> + <GroupNumber>1</GroupNumber> + <FileNumber>1</FileNumber> + <FileType>2</FileType> + <tvExp>0</tvExp> + <Focus>0</Focus> + <ColumnNumber>0</ColumnNumber> + <tvExpOptDlg>0</tvExpOptDlg> + <TopLine>0</TopLine> + <CurrentLine>0</CurrentLine> + <bDave2>0</bDave2> + <PathWithFileName>..\..\..\..\software\cmsis\Device\ARM\CMSDK_CM0plus\Source\ARM\startup_CMSDK_CM0plus.s</PathWithFileName> + <FilenameWithoutPath>startup_CMSDK_CM0plus.s</FilenameWithoutPath> + </File> + </Group> + + <Group> + <GroupName>Application</GroupName> + <tvExp>1</tvExp> + <tvExpOptDlg>0</tvExpOptDlg> + <cbSel>0</cbSel> + <File> + <GroupNumber>2</GroupNumber> + <FileNumber>2</FileNumber> + <FileType>1</FileType> + <tvExp>0</tvExp> + <Focus>0</Focus> + <ColumnNumber>0</ColumnNumber> + <tvExpOptDlg>0</tvExpOptDlg> + <TopLine>0</TopLine> + <CurrentLine>0</CurrentLine> + <bDave2>0</bDave2> + <PathWithFileName>..\..\..\..\software\common\romtable_tests\romtable_tests.c</PathWithFileName> + <FilenameWithoutPath>romtable_tests.c</FilenameWithoutPath> + </File> + <File> + <GroupNumber>2</GroupNumber> + <FileNumber>3</FileNumber> + <FileType>1</FileType> + <tvExp>0</tvExp> + <Focus>0</Focus> + <ColumnNumber>0</ColumnNumber> + <tvExpOptDlg>0</tvExpOptDlg> + <TopLine>0</TopLine> + <CurrentLine>0</CurrentLine> + <bDave2>0</bDave2> + <PathWithFileName>..\..\..\..\software\common\retarget\uart_stdout.c</PathWithFileName> + <FilenameWithoutPath>uart_stdout.c</FilenameWithoutPath> + </File> + <File> + <GroupNumber>2</GroupNumber> + <FileNumber>4</FileNumber> + <FileType>1</FileType> + <tvExp>0</tvExp> + <Focus>0</Focus> + <ColumnNumber>0</ColumnNumber> + <tvExpOptDlg>0</tvExpOptDlg> + <TopLine>0</TopLine> + <CurrentLine>0</CurrentLine> + <bDave2>0</bDave2> + <PathWithFileName>..\..\..\..\software\common\retarget\retarget.c</PathWithFileName> + <FilenameWithoutPath>retarget.c</FilenameWithoutPath> + </File> + <File> + <GroupNumber>2</GroupNumber> + <FileNumber>5</FileNumber> + <FileType>1</FileType> + <tvExp>0</tvExp> + <Focus>0</Focus> + <ColumnNumber>0</ColumnNumber> + <tvExpOptDlg>0</tvExpOptDlg> + <TopLine>0</TopLine> + <CurrentLine>0</CurrentLine> + <bDave2>0</bDave2> + <PathWithFileName>..\generic\mcu_debugtester_interface.c</PathWithFileName> + <FilenameWithoutPath>mcu_debugtester_interface.c</FilenameWithoutPath> + </File> + </Group> + + <Group> + <GroupName>System</GroupName> + <tvExp>1</tvExp> + <tvExpOptDlg>0</tvExpOptDlg> + <cbSel>0</cbSel> + <File> + <GroupNumber>3</GroupNumber> + <FileNumber>6</FileNumber> + <FileType>1</FileType> + <tvExp>0</tvExp> + <Focus>0</Focus> + <ColumnNumber>0</ColumnNumber> + <tvExpOptDlg>0</tvExpOptDlg> + <TopLine>0</TopLine> + <CurrentLine>0</CurrentLine> + <bDave2>0</bDave2> + <PathWithFileName>..\..\..\..\software\cmsis\Device\ARM\CMSDK_CM0plus\Source\system_CMSDK_CM0plus.c</PathWithFileName> + <FilenameWithoutPath>system_CMSDK_CM0plus.c</FilenameWithoutPath> + </File> + <File> + <GroupNumber>3</GroupNumber> + <FileNumber>7</FileNumber> + <FileType>1</FileType> + <tvExp>0</tvExp> + <Focus>0</Focus> + <ColumnNumber>0</ColumnNumber> + <tvExpOptDlg>0</tvExpOptDlg> + <TopLine>0</TopLine> + <CurrentLine>0</CurrentLine> + <bDave2>0</bDave2> + <PathWithFileName>..\..\..\..\software\cmsis\Device\ARM\CMSDK_CM0plus\Source\CMSDK_driver.c</PathWithFileName> + <FilenameWithoutPath>CMSDK_driver.c</FilenameWithoutPath> + </File> + </Group> + +</ProjectOpt> diff --git a/Cortex-M0/nanosoc/systems/mcu/testcodes/romtable_tests/romtable_tests_cm0p.uvproj b/Cortex-M0/nanosoc/systems/mcu/testcodes/romtable_tests/romtable_tests_cm0p.uvproj new file mode 100644 index 0000000..b3ed42c --- /dev/null +++ b/Cortex-M0/nanosoc/systems/mcu/testcodes/romtable_tests/romtable_tests_cm0p.uvproj @@ -0,0 +1,442 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no" ?> +<Project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="project_proj.xsd"> + + <SchemaVersion>1.1</SchemaVersion> + + <Header>### uVision Project, (C) Keil Software</Header> + + <Targets> + <Target> + <TargetName>Debug</TargetName> + <ToolsetNumber>0x4</ToolsetNumber> + <ToolsetName>ARM-ADS</ToolsetName> + <TargetOption> + <TargetCommonOption> + <Device>Cortex-M0+</Device> + <Vendor>ARM</Vendor> + <Cpu>CLOCK(12000000) CPUTYPE("Cortex-M0+") ESEL ELITTLE</Cpu> + <FlashUtilSpec></FlashUtilSpec> + <StartupFile></StartupFile> + <FlashDriverDll></FlashDriverDll> + <DeviceId>6268</DeviceId> + <RegisterFile></RegisterFile> + <MemoryEnv></MemoryEnv> + <Cmp></Cmp> + <Asm></Asm> + <Linker></Linker> + <OHString></OHString> + <InfinionOptionDll></InfinionOptionDll> + <SLE66CMisc></SLE66CMisc> + <SLE66AMisc></SLE66AMisc> + <SLE66LinkerMisc></SLE66LinkerMisc> + <SFDFile></SFDFile> + <UseEnv>0</UseEnv> + <BinPath></BinPath> + <IncludePath></IncludePath> + <LibPath></LibPath> + <RegisterFilePath></RegisterFilePath> + <DBRegisterFilePath></DBRegisterFilePath> + <TargetStatus> + <Error>0</Error> + <ExitCodeStop>0</ExitCodeStop> + <ButtonStop>0</ButtonStop> + <NotGenerated>0</NotGenerated> + <InvalidFlash>1</InvalidFlash> + </TargetStatus> + <OutputDirectory>.\</OutputDirectory> + <OutputName>romtable_tests</OutputName> + <CreateExecutable>1</CreateExecutable> + <CreateLib>0</CreateLib> + <CreateHexFile>0</CreateHexFile> + <DebugInformation>1</DebugInformation> + <BrowseInformation>1</BrowseInformation> + <ListingPath>.\</ListingPath> + <HexFormatSelection>1</HexFormatSelection> + <Merge32K>0</Merge32K> + <CreateBatchFile>0</CreateBatchFile> + <BeforeCompile> + <RunUserProg1>0</RunUserProg1> + <RunUserProg2>0</RunUserProg2> + <UserProg1Name></UserProg1Name> + <UserProg2Name></UserProg2Name> + <UserProg1Dos16Mode>0</UserProg1Dos16Mode> + <UserProg2Dos16Mode>0</UserProg2Dos16Mode> + <nStopU1X>0</nStopU1X> + <nStopU2X>0</nStopU2X> + </BeforeCompile> + <BeforeMake> + <RunUserProg1>0</RunUserProg1> + <RunUserProg2>0</RunUserProg2> + <UserProg1Name></UserProg1Name> + <UserProg2Name></UserProg2Name> + <UserProg1Dos16Mode>0</UserProg1Dos16Mode> + <UserProg2Dos16Mode>0</UserProg2Dos16Mode> + </BeforeMake> + <AfterMake> + <RunUserProg1>1</RunUserProg1> + <RunUserProg2>0</RunUserProg2> + <UserProg1Name>$K\ARM\ARMCC\BIN\fromelf.exe #L --vhx --8x1 --output romtable_tests.hex</UserProg1Name> + <UserProg2Name></UserProg2Name> + <UserProg1Dos16Mode>0</UserProg1Dos16Mode> + <UserProg2Dos16Mode>0</UserProg2Dos16Mode> + </AfterMake> + <SelectedForBatchBuild>0</SelectedForBatchBuild> + <SVCSIdString></SVCSIdString> + </TargetCommonOption> + <CommonProperty> + <UseCPPCompiler>0</UseCPPCompiler> + <RVCTCodeConst>0</RVCTCodeConst> + <RVCTZI>0</RVCTZI> + <RVCTOtherData>0</RVCTOtherData> + <ModuleSelection>0</ModuleSelection> + <IncludeInBuild>1</IncludeInBuild> + <AlwaysBuild>0</AlwaysBuild> + <GenerateAssemblyFile>0</GenerateAssemblyFile> + <AssembleAssemblyFile>0</AssembleAssemblyFile> + <PublicsOnly>0</PublicsOnly> + <StopOnExitCode>3</StopOnExitCode> + <CustomArgument></CustomArgument> + <IncludeLibraryModules></IncludeLibraryModules> + </CommonProperty> + <DllOption> + <SimDllName>SARMCM3.DLL</SimDllName> + <SimDllArguments></SimDllArguments> + <SimDlgDll>DARMCM1.DLL</SimDlgDll> + <SimDlgDllArguments></SimDlgDllArguments> + <TargetDllName>SARMCM3.DLL</TargetDllName> + <TargetDllArguments></TargetDllArguments> + <TargetDlgDll>TARMCM1.DLL</TargetDlgDll> + <TargetDlgDllArguments></TargetDlgDllArguments> + </DllOption> + <DebugOption> + <OPTHX> + <HexSelection>1</HexSelection> + <HexRangeLowAddress>0</HexRangeLowAddress> + <HexRangeHighAddress>0</HexRangeHighAddress> + <HexOffset>0</HexOffset> + <Oh166RecLen>16</Oh166RecLen> + </OPTHX> + <Simulator> + <UseSimulator>1</UseSimulator> + <LoadApplicationAtStartup>1</LoadApplicationAtStartup> + <RunToMain>1</RunToMain> + <RestoreBreakpoints>1</RestoreBreakpoints> + <RestoreWatchpoints>1</RestoreWatchpoints> + <RestoreMemoryDisplay>1</RestoreMemoryDisplay> + <RestoreFunctions>1</RestoreFunctions> + <RestoreToolbox>1</RestoreToolbox> + <LimitSpeedToRealTime>0</LimitSpeedToRealTime> + </Simulator> + <Target> + <UseTarget>0</UseTarget> + <LoadApplicationAtStartup>1</LoadApplicationAtStartup> + <RunToMain>0</RunToMain> + <RestoreBreakpoints>1</RestoreBreakpoints> + <RestoreWatchpoints>1</RestoreWatchpoints> + <RestoreMemoryDisplay>1</RestoreMemoryDisplay> + <RestoreFunctions>0</RestoreFunctions> + <RestoreToolbox>1</RestoreToolbox> + </Target> + <RunDebugAfterBuild>0</RunDebugAfterBuild> + <TargetSelection>-1</TargetSelection> + <SimDlls> + <CpuDll></CpuDll> + <CpuDllArguments></CpuDllArguments> + <PeripheralDll></PeripheralDll> + <PeripheralDllArguments></PeripheralDllArguments> + <InitializationFile></InitializationFile> + </SimDlls> + <TargetDlls> + <CpuDll></CpuDll> + <CpuDllArguments></CpuDllArguments> + <PeripheralDll></PeripheralDll> + <PeripheralDllArguments></PeripheralDllArguments> + <InitializationFile></InitializationFile> + <Driver></Driver> + </TargetDlls> + </DebugOption> + <Utilities> + <Flash1> + <UseTargetDll>0</UseTargetDll> + <UseExternalTool>0</UseExternalTool> + <RunIndependent>0</RunIndependent> + <UpdateFlashBeforeDebugging>0</UpdateFlashBeforeDebugging> + <Capability>0</Capability> + <DriverSelection>-1</DriverSelection> + </Flash1> + <Flash2></Flash2> + <Flash3></Flash3> + <Flash4></Flash4> + </Utilities> + <TargetArmAds> + <ArmAdsMisc> + <GenerateListings>0</GenerateListings> + <asHll>1</asHll> + <asAsm>1</asAsm> + <asMacX>1</asMacX> + <asSyms>1</asSyms> + <asFals>1</asFals> + <asDbgD>1</asDbgD> + <asForm>1</asForm> + <ldLst>0</ldLst> + <ldmm>1</ldmm> + <ldXref>1</ldXref> + <BigEnd>0</BigEnd> + <AdsALst>1</AdsALst> + <AdsACrf>1</AdsACrf> + <AdsANop>0</AdsANop> + <AdsANot>0</AdsANot> + <AdsLLst>1</AdsLLst> + <AdsLmap>1</AdsLmap> + <AdsLcgr>1</AdsLcgr> + <AdsLsym>1</AdsLsym> + <AdsLszi>1</AdsLszi> + <AdsLtoi>1</AdsLtoi> + <AdsLsun>1</AdsLsun> + <AdsLven>1</AdsLven> + <AdsLsxf>1</AdsLsxf> + <RvctClst>0</RvctClst> + <GenPPlst>0</GenPPlst> + <AdsCpuType>"Cortex-M0+"</AdsCpuType> + <RvctDeviceName></RvctDeviceName> + <mOS>0</mOS> + <uocRom>0</uocRom> + <uocRam>0</uocRam> + <hadIROM>0</hadIROM> + <hadIRAM>0</hadIRAM> + <hadXRAM>0</hadXRAM> + <uocXRam>0</uocXRam> + <RvdsVP>0</RvdsVP> + <hadIRAM2>0</hadIRAM2> + <hadIROM2>0</hadIROM2> + <StupSel>1</StupSel> + <useUlib>0</useUlib> + <EndSel>1</EndSel> + <uLtcg>0</uLtcg> + <RoSelD>0</RoSelD> + <RwSelD>5</RwSelD> + <CodeSel>0</CodeSel> + <OptFeed>0</OptFeed> + <NoZi1>0</NoZi1> + <NoZi2>0</NoZi2> + <NoZi3>0</NoZi3> + <NoZi4>0</NoZi4> + <NoZi5>0</NoZi5> + <Ro1Chk>1</Ro1Chk> + <Ro2Chk>0</Ro2Chk> + <Ro3Chk>0</Ro3Chk> + <Ir1Chk>0</Ir1Chk> + <Ir2Chk>0</Ir2Chk> + <Ra1Chk>1</Ra1Chk> + <Ra2Chk>0</Ra2Chk> + <Ra3Chk>0</Ra3Chk> + <Im1Chk>0</Im1Chk> + <Im2Chk>0</Im2Chk> + <OnChipMemories> + <Ocm1> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </Ocm1> + <Ocm2> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </Ocm2> + <Ocm3> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </Ocm3> + <Ocm4> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </Ocm4> + <Ocm5> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </Ocm5> + <Ocm6> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </Ocm6> + <IRAM> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </IRAM> + <IROM> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </IROM> + <XRAM> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </XRAM> + <OCR_RVCT1> + <Type>1</Type> + <StartAddress>0x0</StartAddress> + <Size>0x10000</Size> + </OCR_RVCT1> + <OCR_RVCT2> + <Type>1</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </OCR_RVCT2> + <OCR_RVCT3> + <Type>1</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </OCR_RVCT3> + <OCR_RVCT4> + <Type>1</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </OCR_RVCT4> + <OCR_RVCT5> + <Type>1</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </OCR_RVCT5> + <OCR_RVCT6> + <Type>0</Type> + <StartAddress>0x20000000</StartAddress> + <Size>0x10000</Size> + </OCR_RVCT6> + <OCR_RVCT7> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </OCR_RVCT7> + <OCR_RVCT8> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </OCR_RVCT8> + <OCR_RVCT9> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </OCR_RVCT9> + <OCR_RVCT10> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </OCR_RVCT10> + </OnChipMemories> + <RvctStartVector></RvctStartVector> + </ArmAdsMisc> + <Cads> + <interw>1</interw> + <Optim>3</Optim> + <oTime>0</oTime> + <SplitLS>0</SplitLS> + <OneElfS>0</OneElfS> + <Strict>0</Strict> + <EnumInt>0</EnumInt> + <PlainCh>0</PlainCh> + <Ropi>0</Ropi> + <Rwpi>0</Rwpi> + <wLevel>0</wLevel> + <uThumb>0</uThumb> + <VariousControls> + <MiscControls></MiscControls> + <Define>CORTEX_M0PLUS</Define> + <Undefine></Undefine> + <IncludePath>..\..\..\..\software\cmsis\CMSIS\Include; ..\..\..\..\software\cmsis\Device\ARM\CMSDK_CM0plus\Include; ..\..\..\..\software\common\retarget; ..\..\..\..\software\debug_tester; ..\generic</IncludePath> + </VariousControls> + </Cads> + <Aads> + <interw>1</interw> + <Ropi>0</Ropi> + <Rwpi>0</Rwpi> + <thumb>0</thumb> + <SplitLS>0</SplitLS> + <SwStkChk>0</SwStkChk> + <NoWarn>0</NoWarn> + <VariousControls> + <MiscControls></MiscControls> + <Define></Define> + <Undefine></Undefine> + <IncludePath></IncludePath> + </VariousControls> + </Aads> + <LDads> + <umfTarg>1</umfTarg> + <Ropi>0</Ropi> + <Rwpi>0</Rwpi> + <noStLib>0</noStLib> + <RepFail>1</RepFail> + <useFile>0</useFile> + <TextAddressRange>0x00000000</TextAddressRange> + <DataAddressRange>0x00000000</DataAddressRange> + <ScatterFile></ScatterFile> + <IncludeLibs></IncludeLibs> + <IncludeLibsPath></IncludeLibsPath> + <Misc></Misc> + <LinkerInputFile></LinkerInputFile> + <DisabledWarnings></DisabledWarnings> + </LDads> + </TargetArmAds> + </TargetOption> + <Groups> + <Group> + <GroupName>Startup</GroupName> + <Files> + <File> + <FileName>startup_CMSDK_CM0plus.s</FileName> + <FileType>2</FileType> + <FilePath>..\..\..\..\software\cmsis\Device\ARM\CMSDK_CM0plus\Source\ARM\startup_CMSDK_CM0plus.s</FilePath> + </File> + </Files> + </Group> + <Group> + <GroupName>Application</GroupName> + <Files> + <File> + <FileName>romtable_tests.c</FileName> + <FileType>1</FileType> + <FilePath>..\..\..\..\software\common\romtable_tests\romtable_tests.c</FilePath> + </File> + <File> + <FileName>uart_stdout.c</FileName> + <FileType>1</FileType> + <FilePath>..\..\..\..\software\common\retarget\uart_stdout.c</FilePath> + </File> + <File> + <FileName>retarget.c</FileName> + <FileType>1</FileType> + <FilePath>..\..\..\..\software\common\retarget\retarget.c</FilePath> + </File> + <File> + <FileName>mcu_debugtester_interface.c</FileName> + <FileType>1</FileType> + <FilePath>..\generic\mcu_debugtester_interface.c</FilePath> + </File> + </Files> + </Group> + <Group> + <GroupName>System</GroupName> + <Files> + <File> + <FileName>system_CMSDK_CM0plus.c</FileName> + <FileType>1</FileType> + <FilePath>..\..\..\..\software\cmsis\Device\ARM\CMSDK_CM0plus\Source\system_CMSDK_CM0plus.c</FilePath> + </File> + <File> + <FileName>CMSDK_driver.c</FileName> + <FileType>1</FileType> + <FilePath>..\..\..\..\software\cmsis\Device\ARM\CMSDK_CM0plus\Source\CMSDK_driver.c</FilePath> + </File> + </Files> + </Group> + </Groups> + </Target> + </Targets> + +</Project> diff --git a/Cortex-M0/nanosoc/systems/mcu/testcodes/rtx_demo/RTX_Config.c b/Cortex-M0/nanosoc/systems/mcu/testcodes/rtx_demo/RTX_Config.c new file mode 100644 index 0000000..262cc79 --- /dev/null +++ b/Cortex-M0/nanosoc/systems/mcu/testcodes/rtx_demo/RTX_Config.c @@ -0,0 +1,187 @@ +/* + *----------------------------------------------------------------------------- + * The confidential and proprietary information contained in this file may + * only be used by a person authorised under and to the extent permitted + * by a subsisting licensing agreement from Arm Limited or its affiliates. + * + * (C) COPYRIGHT 2010-2011 Arm Limited or its affiliates. + * ALL RIGHTS RESERVED + * + * This entire notice must be reproduced on all copies of this file + * and copies of this file may only be made by a person if such person is + * permitted to do so under the terms of a subsisting license agreement + * from Arm Limited or its affiliates. + * + * SVN Information + * + * Checked In : $Date: 2017-10-10 15:55:38 +0100 (Tue, 10 Oct 2017) $ + * + * Revision : $Revision: 371321 $ + * + * Release Information : Cortex-M System Design Kit-r1p1-00rel0 + *----------------------------------------------------------------------------- + */ + +/*---------------------------------------------------------------------------- + * R T L - K e r n e l + *---------------------------------------------------------------------------- + * Name: RTX_CONFIG.C + * Purpose: Configuration of RTX Kernel for Cortex-M + * Rev.: V3.40 + *---------------------------------------------------------------------------- +*/ + +#include <RTL.h> + +/*---------------------------------------------------------------------------- + * RTX User configuration part BEGIN + *---------------------------------------------------------------------------*/ + +//-------- <<< Use Configuration Wizard in Context Menu >>> ----------------- +// +// <h>Task Definitions +// =================== +// +// <o>Number of concurrent running tasks <0-250> +// <i> Define max. number of tasks that will run at the same time. +// <i> Default: 6 +#ifndef OS_TASKCNT + #define OS_TASKCNT 6 +#endif + +// <o>Number of tasks with user-provided stack <0-250> +// <i> Define the number of tasks that will use a bigger stack. +// <i> The memory space for the stack is provided by the user. +// <i> Default: 0 +#ifndef OS_PRIVCNT + #define OS_PRIVCNT 0 +#endif + +// <o>Task stack size [bytes] <20-4096:8><#/4> +// <i> Set the stack size for tasks which is assigned by the system. +// <i> Default: 200 +#ifndef OS_STKSIZE + #define OS_STKSIZE 200 +#endif + +// <q>Check for the stack overflow +// =============================== +// <i> Include the stack checking code for a stack overflow. +// <i> Note that additional code reduces the Kernel performance. +#ifndef OS_STKCHECK + #define OS_STKCHECK 1 +#endif + +// <q>Run in privileged mode +// ========================= +// <i> Run all Tasks in privileged mode. +// <i> Default: Unprivileged +#ifndef OS_RUNPRIV + #define OS_RUNPRIV 0 +#endif + +// <o>Number of user timers <0-250> +// <i> Define max. number of user timers that will run at the same time. +// <i> Default: 0 (User timers disabled) +#ifndef OS_TIMERCNT + #define OS_TIMERCNT 0 +#endif + +// </h> +// <h>SysTick Timer Configuration +// ============================= +// <o>Timer clock value [Hz] <1-1000000000> +// <i> Set the timer clock value for selected timer. +// <i> Default: 6000000 (6MHz) +#ifndef OS_CLOCK + #define OS_CLOCK 50000000 +#endif + +// <o>Timer tick value [us] <1-1000000> +// <i> Set the timer tick value for selected timer. +// <i> Default: 10000 (10ms) +#ifndef OS_TICK + #define OS_TICK 200 +#endif + +// </h> +// <e>Round-Robin Task switching +// ============================= +// <i> Enable Round-Robin Task switching. +#ifndef OS_ROBIN + #define OS_ROBIN 1 +#endif + +// <o>Round-Robin Timeout [ticks] <1-1000> +// <i> Define how long a task will execute before a task switch. +// <i> Default: 5 +#ifndef OS_ROBINTOUT + #define OS_ROBINTOUT 5 +#endif + +// </e> + +//------------- <<< end of configuration section >>> ----------------------- + +// Standard library system mutexes +// =============================== +// Define max. number system mutexes that are used to protect +// the arm standard runtime library. For microlib they are not used. +#ifndef OS_MUTEXCNT + #define OS_MUTEXCNT 8 +#endif + +/*---------------------------------------------------------------------------- + * RTX User configuration part END + *---------------------------------------------------------------------------*/ + +#define OS_TRV ((U32)(((double)OS_CLOCK*(double)OS_TICK)/1E6)-1) + +/*---------------------------------------------------------------------------- + * Global Functions + *---------------------------------------------------------------------------*/ + +/*--------------------------- os_idle_demon ---------------------------------*/ + +__task void os_idle_demon (void) { + /* The idle demon is a system task, running when no other task is ready */ + /* to run. The 'os_xxx' function calls are not allowed from this task. */ + + for (;;) { + /* HERE: include optional user code to be executed when no task runs.*/ + } +} + + +/*--------------------------- os_tmr_call -----------------------------------*/ + +void os_tmr_call (U16 info) { + /* This function is called when the user timer has expired. Parameter */ + /* 'info' holds the value, defined when the timer was created. */ + + /* HERE: include optional user code to be executed on timeout. */ +} + + +/*--------------------------- os_stk_overflow -------------------------------*/ + +void os_stk_overflow (OS_TID task_id) { + /* This function is called when a stack overflow is detected. Parameter */ + /* 'task_id' holds the id of this task. You can use 'RTX Kernel' dialog,*/ + /* page 'Active Tasks' to check, which task needs a bigger stack. */ + + /* HERE: include optional code to be executed on stack overflow. */ + for (;;); +} + + +/*---------------------------------------------------------------------------- + * RTX Configuration Functions + *---------------------------------------------------------------------------*/ + +#include <RTX_lib.c> + +/*---------------------------------------------------------------------------- + * end of file + *---------------------------------------------------------------------------*/ + diff --git a/Cortex-M0/nanosoc/systems/mcu/testcodes/rtx_demo/makefile b/Cortex-M0/nanosoc/systems/mcu/testcodes/rtx_demo/makefile new file mode 100644 index 0000000..b1edfa2 --- /dev/null +++ b/Cortex-M0/nanosoc/systems/mcu/testcodes/rtx_demo/makefile @@ -0,0 +1,101 @@ +#----------------------------------------------------------------------------- +# The confidential and proprietary information contained in this file may +# only be used by a person authorised under and to the extent permitted +# by a subsisting licensing agreement from Arm Limited or its affiliates. +# +# (C) COPYRIGHT 2010-2013 Arm Limited or its affiliates. +# ALL RIGHTS RESERVED +# +# This entire notice must be reproduced on all copies of this file +# and copies of this file may only be made by a person if such person is +# permitted to do so under the terms of a subsisting license agreement +# from Arm Limited or its affiliates. +# +# SVN Information +# +# Checked In : $Date: 2017-10-10 15:55:38 +0100 (Tue, 10 Oct 2017) $ +# +# Revision : $Revision: 371321 $ +# +# Release Information : Cortex-M System Design Kit-r1p1-00rel0 +#----------------------------------------------------------------------------- +# +# Cortex-M System Design Kit software compilation make file +# +#----------------------------------------------------------------------------- +# +# Configurations +# + +# Tool chain : ds5 / gcc / keil +TOOL_CHAIN = ds5 +TESTNAME = rtx_demo + +CPU_PRODUCT = CORTEX_M0PLUS +HEXFILE = rtx_demo_cm0.hex + +ifeq ($(CPU_PRODUCT),CORTEX_M0) + HEXFILE = rtx_demo_cm0.hex +endif + +ifeq ($(CPU_PRODUCT),CORTEX_M0PLUS) + HEXFILE = rtx_demo_cm0p.hex +endif + +# --------------------------------------------------------------------------------------- +all: all_$(TOOL_CHAIN) + +# --------------------------------------------------------------------------------------- +hexfile_select: + @if [ -e $(HEXFILE) ] ; then \ + cp $(HEXFILE) rtx_demo.hex ; \ + fi + +# --------------------------------------------------------------------------------------- +# DS-5 +all_ds5 : hexfile_select + @if [ -e $(TESTNAME).hex ] ; then \ + echo "Found rtx_demo.hex ... use existing hex file. Continue ..." ; \ + else \ + echo "RTX demo compilation not available for DS-5." ; \ + echo "Please compile RTX demo in Keil MDK and press ENTER when ready" ; \ + read dummy ; \ + fi + +# --------------------------------------------------------------------------------------- +# gcc +# +all_gcc: hexfile_select + @if [ -e $(TESTNAME).hex ] ; then \ + echo "Found rtx_demo.hex ... use existing hex file. Continue ..." ; \ + else \ + echo "RTX demo compilation not available for gcc." ;\ + echo "Please compile RTX demo in Keil MDK and press ENTER when ready" ; \ + read dummy ; \ + fi + +# --------------------------------------------------------------------------------------- +# Keil MDK + +all_keil: + @echo "Please compile your project code and press ENTER when ready" + @read dummy + cp $(HEXFILE) rtx_demo.hex + +# --------------------------------------------------------------------------------------- +# Clean +clean : + @rm -rf *.o + @rm -rf *.crf + @rm -rf *.plg + @rm -rf *.tra + @rm -rf *.htm + @rm -rf *.map + @rm -rf *.dep + @rm -rf *.d + @rm -rf *.lnp + @rm -rf *.bak + @rm -rf *.lst + @rm -rf *.axf + @rm -rf *.sct + @rm -rf *.uvgui.* diff --git a/Cortex-M0/nanosoc/systems/mcu/testcodes/rtx_demo/rtx_demo.c b/Cortex-M0/nanosoc/systems/mcu/testcodes/rtx_demo/rtx_demo.c new file mode 100644 index 0000000..9e885b7 --- /dev/null +++ b/Cortex-M0/nanosoc/systems/mcu/testcodes/rtx_demo/rtx_demo.c @@ -0,0 +1,86 @@ +/* + *----------------------------------------------------------------------------- + * The confidential and proprietary information contained in this file may + * only be used by a person authorised under and to the extent permitted + * by a subsisting licensing agreement from Arm Limited or its affiliates. + * + * (C) COPYRIGHT 2010-2013 Arm Limited or its affiliates. + * ALL RIGHTS RESERVED + * + * This entire notice must be reproduced on all copies of this file + * and copies of this file may only be made by a person if such person is + * permitted to do so under the terms of a subsisting license agreement + * from Arm Limited or its affiliates. + * + * SVN Information + * + * Checked In : $Date: 2017-10-10 15:55:38 +0100 (Tue, 10 Oct 2017) $ + * + * Revision : $Revision: 371321 $ + * + * Release Information : Cortex-M System Design Kit-r1p1-00rel0 + *----------------------------------------------------------------------------- + */ + +/* Simple demonstration of booting up an RTOS : Keil RTX */ + +#include <RTL.h> +#ifdef CORTEX_M0 +#include "CMSDK_CM0.h" +#endif +#ifdef CORTEX_M0PLUS +#include "CMSDK_CM0plus.h" +#endif +#include <stdio.h> +#include "uart_stdout.h" + +OS_TID t_task1; // Declare a task ID for task1 : Event generator +OS_TID t_task2; // Declare a task ID for task2 : Event receiver +int num = 0; // Counter + +__task void task1(void) { // Task 1 - Event generator + while (1) { + os_dly_wait(1); + puts("task 1 ->"); + os_evt_set (0x0001, t_task2); // Send a event 0x0001 to task 2 + } + } + +__task void task2(void) { // Task 2 - Event receiver + while(1) { + os_evt_wait_and (0x0001, 0xffff); // wait for an event flag 0x0001 + num ++; + printf (" task 2, %d\n", num); + if (num>=3) { /* Execute 3 times and stop simulation */ + puts("Tasks ran 3 times."); + puts("** TEST PASSED ** \n"); + UartEndSimulation(); + } + } + } + +/* Initialize tasks */ +__task void init (void) { + t_task1 = os_tsk_create (task1, 1); // Create a task "task1" with priority 1 + t_task2 = os_tsk_create (task2, 1); // Create a task "task2" with priority 1 + os_tsk_delete_self (); +} + + +int main(void) +{ + // Starting from CMSIS 1.3, + // CMSIS System Initialization function SystemInit() is called from startup code. + // So there is no need to call it in here. (This test is based on CMSIS 2.0). + + SysTick->VAL=0; /* Initialize SysTick timer value */ + + // UART init + UartStdOutInit(); + + // Test banner message and revision number + puts("\nCortex Microcontroller System Design Kit - RTX Demo - revision $Revision: 371321 $\n"); + puts("- Execute task 1 -> task 2 sequence three times\n"); + + os_sys_init(init); // Initialize OS +} // end main diff --git a/Cortex-M0/nanosoc/systems/mcu/testcodes/rtx_demo/rtx_demo_cm0.hex b/Cortex-M0/nanosoc/systems/mcu/testcodes/rtx_demo/rtx_demo_cm0.hex new file mode 100644 index 0000000..1ab6c31 --- /dev/null +++ b/Cortex-M0/nanosoc/systems/mcu/testcodes/rtx_demo/rtx_demo_cm0.hex @@ -0,0 +1,4996 @@ +60 +1E +00 +20 +01 +03 +00 +00 +09 +03 +00 +00 +0B +03 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +E9 +01 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +8D +02 +00 +00 +ED +02 +00 +00 +13 +03 +00 +00 +13 +03 +00 +00 +13 +03 +00 +00 +13 +03 +00 +00 +13 +03 +00 +00 +13 +03 +00 +00 +13 +03 +00 +00 +13 +03 +00 +00 +13 +03 +00 +00 +13 +03 +00 +00 +13 +03 +00 +00 +00 +00 +00 +00 +13 +03 +00 +00 +13 +03 +00 +00 +13 +03 +00 +00 +13 +03 +00 +00 +13 +03 +00 +00 +13 +03 +00 +00 +13 +03 +00 +00 +13 +03 +00 +00 +13 +03 +00 +00 +13 +03 +00 +00 +13 +03 +00 +00 +13 +03 +00 +00 +13 +03 +00 +00 +13 +03 +00 +00 +13 +03 +00 +00 +13 +03 +00 +00 +13 +03 +00 +00 +13 +03 +00 +00 +13 +03 +00 +00 +13 +03 +00 +00 +00 +F0 +02 +F8 +00 +F0 +48 +F8 +0C +A0 +30 +C8 +08 +38 +24 +18 +2D +18 +A2 +46 +67 +1E +AB +46 +54 +46 +5D +46 +AC +42 +01 +D1 +00 +F0 +3A +F8 +7E +46 +0F +3E +0F +CC +B6 +46 +01 +26 +33 +42 +00 +D0 +FB +1A +A2 +46 +AB +46 +33 +43 +18 +47 +28 +12 +00 +00 +48 +12 +00 +00 +10 +3A +02 +D3 +78 +C8 +78 +C1 +FA +D8 +52 +07 +01 +D3 +30 +C8 +30 +C1 +01 +D5 +04 +68 +0C +60 +70 +47 +00 +00 +00 +23 +00 +24 +00 +25 +00 +26 +10 +3A +01 +D3 +78 +C1 +FB +D8 +52 +07 +00 +D3 +30 +C1 +00 +D5 +0B +60 +70 +47 +10 +B5 +64 +29 +02 +D1 +00 +F0 +73 +FA +10 +BD +00 +20 +10 +BD +1F +B5 +C0 +46 +C0 +46 +1F +BD +10 +B5 +10 +BD +00 +F0 +50 +FB +11 +46 +FF +F7 +F5 +FF +00 +F0 +25 +F9 +00 +F0 +68 +FB +03 +B4 +FF +F7 +F2 +FF +03 +BC +00 +F0 +BA +F9 +00 +00 +80 +F3 +09 +88 +70 +47 +EF +F3 +09 +80 +70 +47 +68 +46 +80 +F3 +09 +88 +06 +48 +00 +78 +C0 +07 +03 +D1 +03 +20 +80 +F3 +14 +88 +70 +47 +02 +20 +80 +F3 +14 +88 +70 +47 +00 +00 +0C +13 +00 +00 +06 +4B +9C +46 +EF +F3 +05 +83 +1B +06 +05 +D1 +EF +F3 +14 +83 +DB +07 +01 +D0 +00 +DF +70 +47 +60 +47 +00 +00 +C3 +08 +00 +00 +06 +4B +9C +46 +EF +F3 +05 +83 +1B +06 +05 +D1 +EF +F3 +14 +83 +DB +07 +01 +D0 +00 +DF +70 +47 +60 +47 +00 +00 +09 +0B +00 +00 +EF +F3 +09 +80 +81 +69 +89 +1E +09 +78 +00 +29 +33 +D1 +A6 +46 +1F +C8 +A4 +46 +74 +46 +E0 +47 +1F +4B +06 +CB +91 +42 +24 +D0 +08 +3B +00 +29 +10 +D0 +0C +B4 +20 +31 +01 +23 +4B +70 +EF +F3 +09 +83 +20 +3B +4B +60 +F0 +C3 +44 +46 +4D +46 +56 +46 +5F +46 +F0 +C3 +00 +F0 +BB +FE +0C +BC +1A +60 +20 +32 +53 +68 +10 +33 +F0 +CB +A0 +46 +A9 +46 +B2 +46 +BB +46 +83 +F3 +09 +88 +20 +3B +F0 +CB +50 +78 +00 +28 +03 +D0 +10 +78 +EF +F3 +09 +83 +18 +60 +02 +23 +DB +43 +18 +47 +10 +B5 +08 +4A +12 +68 +91 +42 +09 +D8 +07 +48 +89 +00 +40 +58 +86 +46 +1F +C8 +A4 +46 +F0 +47 +EF +F3 +09 +84 +0F +C4 +10 +BD +00 +00 +1C +00 +00 +20 +48 +08 +00 +00 +48 +08 +00 +00 +00 +F0 +A0 +FD +15 +4B +06 +CB +91 +42 +23 +D0 +08 +3B +0C +B4 +20 +31 +00 +23 +4B +70 +EF +F3 +09 +83 +20 +3B +4B +60 +F0 +C3 +44 +46 +4D +46 +56 +46 +5F +46 +F0 +C3 +00 +F0 +75 +FE +0C +BC +1A +60 +20 +32 +53 +68 +10 +33 +F0 +CB +A0 +46 +A9 +46 +B2 +46 +BB +46 +83 +F3 +09 +88 +20 +3B +F0 +CB +50 +78 +00 +28 +01 +D0 +10 +78 +18 +61 +02 +23 +DB +43 +18 +47 +00 +00 +1C +00 +00 +20 +00 +F0 +0A +FF +CE +E7 +00 +00 +00 +F0 +E4 +FA +00 +F0 +04 +FF +C8 +E7 +00 +00 +07 +48 +80 +47 +07 +48 +00 +47 +FE +E7 +FE +E7 +FE +E7 +FE +E7 +FE +E7 +FE +E7 +04 +48 +05 +49 +05 +4A +06 +4B +70 +47 +00 +00 +85 +05 +00 +00 +C1 +00 +00 +00 +60 +1B +00 +20 +60 +1E +00 +20 +60 +1C +00 +20 +60 +1C +00 +20 +28 +4C +29 +4F +01 +20 +BC +46 +00 +DF +28 +A0 +00 +F0 +A8 +F9 +29 +4F +01 +20 +BC +46 +A1 +68 +00 +DF +F2 +E7 +27 +4D +21 +4C +27 +4F +01 +22 +29 +46 +10 +46 +BC +46 +00 +DF +21 +68 +25 +A0 +49 +1C +21 +60 +00 +F0 +18 +F9 +20 +68 +03 +28 +F0 +DB +25 +A0 +00 +F0 +8E +F9 +28 +A0 +00 +F0 +8B +F9 +00 +F0 +97 +F8 +E7 +E7 +00 +23 +2B +4F +1A +46 +01 +21 +28 +48 +BC +46 +00 +DF +11 +4C +00 +23 +60 +60 +1A +46 +01 +21 +26 +48 +BC +46 +00 +DF +26 +4F +A0 +60 +00 +20 +BC +46 +00 +DF +80 +B5 +24 +49 +00 +20 +88 +61 +00 +F0 +66 +F8 +22 +48 +00 +F0 +6B +F9 +22 +A0 +00 +F0 +68 +F9 +FF +F7 +DC +FE +2D +4F +00 +22 +11 +46 +2B +48 +BC +46 +00 +DF +00 +20 +80 +BD +00 +00 +00 +20 +15 +0A +00 +00 +74 +61 +73 +6B +20 +31 +20 +2D +3E +00 +00 +00 +6D +0A +00 +00 +FF +FF +00 +00 +C9 +0A +00 +00 +20 +20 +74 +61 +73 +6B +20 +32 +2C +20 +25 +64 +0A +00 +00 +00 +54 +61 +73 +6B +73 +20 +72 +61 +6E +20 +33 +20 +74 +69 +6D +65 +73 +2E +00 +00 +2A +2A +20 +54 +45 +53 +54 +20 +50 +41 +53 +53 +45 +44 +20 +2A +2A +20 +0A +00 +39 +03 +00 +00 +81 +11 +00 +00 +55 +03 +00 +00 +FD +11 +00 +00 +00 +E0 +00 +E0 +A8 +12 +00 +00 +2D +20 +45 +78 +65 +63 +75 +74 +65 +20 +74 +61 +73 +6B +20 +31 +20 +2D +3E +20 +74 +61 +73 +6B +20 +32 +20 +73 +65 +71 +75 +65 +6E +63 +65 +20 +74 +68 +72 +65 +65 +20 +74 +69 +6D +65 +73 +0A +00 +00 +00 +00 +89 +03 +00 +00 +DD +0F +00 +00 +0C +48 +10 +21 +01 +61 +41 +21 +81 +60 +0B +49 +20 +20 +88 +61 +70 +47 +08 +49 +4A +68 +D2 +07 +FC +D1 +08 +60 +70 +47 +05 +48 +41 +68 +89 +07 +FC +D5 +00 +68 +C0 +B2 +70 +47 +04 +20 +FF +F7 +F0 +FF +FE +E7 +00 +60 +00 +40 +00 +10 +01 +40 +10 +B5 +C0 +B2 +FF +F7 +E7 +FF +10 +BD +10 +B5 +FF +F7 +E9 +FF +FF +F7 +E1 +FF +10 +BD +00 +20 +C0 +43 +70 +47 +10 +B5 +C0 +B2 +FF +F7 +D9 +FF +10 +BD +FE +E7 +FE +E7 +70 +47 +FE +E7 +10 +B5 +00 +F0 +D0 +FE +00 +28 +05 +D0 +60 +21 +48 +43 +17 +49 +40 +18 +60 +38 +10 +BD +16 +48 +10 +BD +10 +B5 +16 +4A +11 +68 +08 +29 +00 +D3 +FE +E7 +0C +23 +4B +43 +13 +4C +49 +1C +1B +19 +03 +60 +18 +46 +11 +60 +00 +F0 +C0 +FB +01 +20 +10 +BD +B0 +B5 +04 +46 +00 +F0 +B0 +FE +00 +28 +04 +D0 +0D +4F +0C +49 +BC +46 +20 +68 +00 +DF +B0 +BD +B0 +B5 +04 +46 +00 +F0 +A4 +FE +00 +28 +03 +D0 +08 +4F +20 +68 +BC +46 +00 +DF +B0 +BD +00 +00 +FC +17 +00 +20 +FC +1A +00 +20 +14 +00 +00 +20 +3C +1A +00 +20 +FF +FF +00 +00 +65 +0D +00 +00 +BD +0C +00 +00 +04 +49 +03 +48 +08 +60 +70 +47 +02 +49 +01 +48 +08 +60 +70 +47 +00 +E1 +F5 +05 +18 +00 +00 +20 +00 +48 +70 +47 +FC +1A +00 +20 +70 +47 +00 +00 +0F +B4 +05 +49 +10 +B5 +03 +AA +02 +98 +00 +F0 +E7 +F8 +10 +BC +08 +BC +04 +B0 +18 +47 +00 +00 +0C +00 +00 +20 +F8 +B5 +04 +46 +0E +46 +00 +20 +2D +E0 +E1 +68 +20 +46 +88 +47 +00 +28 +2A +D0 +25 +28 +02 +D0 +62 +68 +A1 +68 +20 +E0 +E1 +68 +20 +46 +00 +27 +88 +47 +05 +00 +1F +D0 +28 +46 +41 +38 +19 +28 +02 +D8 +01 +27 +FF +02 +20 +35 +32 +46 +20 +46 +27 +60 +29 +46 +FF +F7 +9E +FD +00 +28 +08 +D0 +01 +28 +04 +D0 +F6 +1D +F6 +08 +F6 +00 +08 +36 +D9 +E7 +36 +1D +D7 +E7 +62 +68 +28 +46 +A1 +68 +90 +47 +20 +6A +40 +1C +20 +62 +CF +E7 +20 +6A +F8 +BD +00 +00 +F7 +B5 +00 +26 +75 +29 +10 +68 +00 +99 +14 +A5 +11 +D0 +C0 +46 +C0 +46 +00 +28 +02 +DA +40 +42 +11 +A5 +08 +E0 +00 +99 +09 +68 +8A +07 +01 +D5 +0F +A5 +02 +E0 +49 +07 +04 +D5 +0E +A5 +01 +26 +01 +E0 +C0 +46 +C0 +46 +00 +9F +00 +24 +24 +37 +04 +E0 +00 +F0 +9B +F8 +30 +31 +39 +55 +64 +1C +00 +28 +F8 +D1 +33 +46 +2A +46 +21 +46 +00 +98 +00 +F0 +23 +F8 +FE +BD +00 +00 +00 +00 +00 +00 +2D +00 +00 +00 +2B +00 +00 +00 +20 +00 +00 +00 +10 +B5 +04 +46 +03 +E0 +FF +F7 +11 +FF +40 +1C +08 +D0 +20 +78 +05 +49 +64 +1C +00 +28 +F6 +D1 +0A +20 +FF +F7 +07 +FF +10 +BD +00 +20 +C0 +43 +10 +BD +00 +00 +0C +00 +00 +20 +70 +47 +70 +47 +70 +47 +FF +B5 +04 +46 +0D +46 +81 +B0 +24 +30 +00 +90 +21 +68 +88 +06 +04 +D5 +10 +22 +E0 +69 +91 +43 +21 +60 +00 +E0 +01 +20 +A8 +42 +01 +DD +47 +1B +00 +E0 +00 +27 +04 +98 +A1 +69 +7A +19 +10 +18 +08 +1A +A0 +61 +20 +68 +C0 +06 +02 +D4 +20 +46 +C0 +46 +C0 +46 +00 +26 +08 +E0 +03 +98 +62 +68 +A1 +68 +80 +5D +90 +47 +20 +6A +40 +1C +76 +1C +20 +62 +04 +98 +86 +42 +F3 +DB +20 +68 +C0 +06 +0A +D5 +20 +46 +C0 +46 +C0 +46 +06 +E0 +62 +68 +A1 +68 +30 +20 +90 +47 +20 +6A +40 +1C +20 +62 +38 +46 +7F +1E +00 +28 +F4 +DC +07 +E0 +00 +98 +62 +68 +A1 +68 +40 +5D +90 +47 +20 +6A +40 +1C +20 +62 +28 +46 +6D +1E +00 +28 +F3 +DC +20 +46 +C0 +46 +C0 +46 +20 +68 +00 +06 +02 +D5 +02 +20 +05 +B0 +F0 +BD +01 +20 +FB +E7 +00 +00 +08 +4B +70 +B5 +0C +46 +7B +44 +00 +F0 +27 +F8 +05 +46 +20 +46 +FF +F7 +A5 +FE +00 +28 +02 +D0 +00 +20 +C0 +43 +70 +BD +28 +46 +70 +BD +00 +00 +3F +FD +FF +FF +01 +46 +80 +08 +08 +1A +02 +09 +10 +18 +02 +0A +10 +18 +02 +0C +10 +18 +C0 +08 +82 +00 +12 +18 +52 +00 +89 +1A +01 +E0 +0A +39 +40 +1C +0A +29 +FB +D2 +70 +47 +01 +69 +4A +1C +02 +61 +08 +78 +70 +47 +00 +B5 +8F +B0 +02 +91 +00 +21 +05 +91 +05 +49 +01 +93 +79 +44 +03 +91 +11 +46 +04 +90 +68 +46 +FF +F7 +E5 +FE +0F +B0 +00 +BD +00 +00 +E5 +FF +FF +FF +75 +46 +FF +F7 +C9 +FE +AE +46 +05 +00 +69 +46 +53 +46 +C0 +08 +C0 +00 +85 +46 +18 +B0 +20 +B5 +FF +F7 +7E +FD +60 +BC +00 +27 +49 +08 +B6 +46 +00 +26 +C0 +C5 +C0 +C5 +C0 +C5 +C0 +C5 +C0 +C5 +C0 +C5 +C0 +C5 +C0 +C5 +40 +3D +49 +00 +8D +46 +70 +47 +04 +46 +C0 +46 +C0 +46 +20 +46 +FF +F7 +92 +FC +00 +00 +00 +00 +00 +00 +10 +B5 +00 +2A +06 +DA +52 +00 +52 +08 +D2 +1D +D3 +08 +DB +00 +10 +22 +03 +E0 +D2 +1C +93 +08 +9B +00 +0C +22 +00 +2B +02 +D0 +9C +18 +8C +42 +01 +D9 +01 +20 +10 +BD +82 +18 +83 +60 +41 +18 +02 +60 +41 +60 +C9 +1A +D0 +18 +88 +42 +02 +D8 +10 +60 +02 +46 +F9 +E7 +00 +20 +10 +60 +10 +BD +07 +48 +01 +68 +07 +48 +41 +61 +00 +21 +81 +61 +07 +21 +01 +61 +05 +48 +01 +6A +FF +22 +12 +06 +11 +43 +01 +62 +40 +17 +70 +47 +08 +13 +00 +00 +00 +E0 +00 +E0 +00 +ED +00 +E0 +70 +47 +01 +46 +EF +F3 +10 +80 +C2 +07 +D2 +0F +72 +B6 +08 +68 +00 +28 +01 +D0 +03 +68 +0B +60 +00 +2A +00 +D1 +62 +B6 +70 +47 +70 +B5 +0D +46 +00 +28 +0F +D0 +08 +49 +09 +4C +88 +42 +04 +D2 +22 +68 +01 +46 +10 +46 +00 +F0 +A3 +FA +20 +68 +45 +70 +05 +48 +00 +F0 +15 +F9 +00 +F0 +62 +FB +70 +BD +00 +00 +FF +FF +00 +00 +1C +00 +00 +20 +CC +1A +00 +20 +10 +B5 +0E +48 +0C +49 +42 +68 +0D +48 +0B +68 +00 +68 +93 +42 +04 +D0 +0A +60 +CB +88 +42 +1E +9A +18 +8A +80 +8A +88 +80 +B2 +82 +42 +08 +D1 +00 +20 +08 +60 +04 +48 +00 +F0 +F4 +F8 +01 +46 +02 +48 +00 +F0 +A1 +FA +10 +BD +30 +00 +00 +20 +CC +1A +00 +20 +24 +00 +00 +20 +70 +B5 +1B +4D +E8 +68 +00 +28 +31 +D0 +A8 +8A +40 +1E +A8 +82 +00 +26 +26 +E0 +A0 +68 +00 +28 +08 +D0 +61 +68 +41 +60 +60 +68 +00 +28 +02 +D0 +A1 +68 +81 +60 +66 +60 +A6 +60 +10 +48 +21 +46 +18 +38 +00 +F0 +7F +FA +A0 +8A +A8 +82 +60 +78 +04 +28 +04 +D1 +0C +49 +E0 +8A +09 +68 +40 +18 +A0 +82 +01 +20 +60 +70 +20 +21 +08 +55 +E0 +68 +E8 +60 +E0 +68 +00 +28 +01 +D0 +05 +61 +E6 +60 +26 +61 +A8 +8A +00 +28 +02 +D1 +EC +68 +00 +2C +D2 +D1 +70 +BD +E4 +1A +00 +20 +24 +00 +00 +20 +70 +B5 +04 +00 +0E +D0 +0C +4D +A1 +78 +28 +68 +01 +26 +82 +78 +91 +42 +0B +D9 +00 +F0 +70 +FA +28 +68 +46 +70 +20 +46 +00 +F0 +EB +FA +70 +BD +05 +48 +00 +F0 +98 +F8 +F8 +E7 +66 +70 +21 +46 +02 +48 +00 +F0 +43 +FA +70 +BD +1C +00 +00 +20 +CC +1A +00 +20 +10 +B5 +03 +21 +FF +F7 +62 +FF +10 +BD +00 +00 +10 +B5 +04 +46 +00 +8B +08 +43 +20 +83 +62 +78 +61 +8B +06 +2A +15 +D0 +05 +2A +12 +D1 +0A +46 +10 +42 +0F +D0 +02 +40 +62 +83 +88 +43 +20 +83 +20 +46 +00 +F0 +63 +FA +01 +20 +60 +70 +02 +21 +20 +20 +01 +55 +21 +46 +04 +48 +00 +F0 +1A +FA +10 +BD +0A +46 +82 +43 +ED +D0 +10 +BD +00 +00 +CC +1A +00 +20 +02 +46 +88 +00 +70 +B5 +14 +49 +40 +18 +40 +38 +C4 +6B +00 +2C +1D +D0 +20 +8B +10 +43 +20 +83 +61 +78 +65 +8B +06 +29 +17 +D0 +05 +29 +14 +D1 +29 +46 +08 +42 +11 +D0 +01 +40 +61 +83 +A8 +43 +20 +83 +20 +46 +00 +F0 +36 +FA +20 +8B +02 +21 +A8 +43 +20 +83 +01 +20 +60 +70 +20 +20 +01 +55 +20 +46 +FF +F7 +8D +FF +70 +BD +29 +46 +81 +43 +EB +D0 +70 +BD +E4 +17 +00 +20 +70 +B5 +03 +46 +0D +48 +0D +46 +04 +68 +00 +2A +20 +8B +08 +D0 +19 +46 +81 +43 +01 +D0 +06 +20 +09 +E0 +98 +43 +20 +83 +02 +20 +70 +BD +02 +46 +1A +40 +01 +D0 +62 +83 +F6 +E7 +05 +20 +C1 +B2 +63 +83 +28 +46 +FF +F7 +F0 +FE +01 +20 +70 +BD +1C +00 +00 +20 +81 +42 +02 +D3 +42 +68 +8A +42 +01 +D8 +01 +20 +70 +47 +EF +F3 +10 +82 +D2 +07 +D2 +0F +72 +B6 +03 +68 +0B +60 +01 +60 +00 +D1 +62 +B6 +00 +20 +70 +47 +01 +46 +40 +68 +42 +68 +4A +60 +0B +78 +00 +22 +02 +2B +05 +D0 +01 +2B +03 +D0 +03 +2B +01 +D0 +42 +60 +70 +47 +43 +68 +00 +2B +01 +D0 +99 +60 +42 +60 +82 +60 +70 +47 +70 +B5 +04 +46 +15 +46 +00 +20 +20 +70 +01 +22 +62 +70 +A1 +70 +60 +60 +A0 +60 +E0 +60 +20 +61 +A0 +82 +E0 +82 +20 +83 +23 +46 +60 +83 +20 +33 +18 +70 +58 +70 +60 +8C +00 +28 +03 +D1 +04 +48 +FF +F7 +9B +FE +A0 +62 +29 +46 +20 +46 +00 +F0 +0F +F8 +70 +BD +70 +01 +00 +20 +03 +48 +00 +21 +01 +60 +03 +49 +09 +68 +C1 +80 +70 +47 +00 +00 +30 +00 +00 +20 +04 +13 +00 +00 +30 +B5 +42 +8C +92 +08 +03 +D1 +0E +4A +12 +68 +12 +04 +92 +0C +83 +6A +92 +00 +9A +18 +53 +07 +00 +D5 +12 +1F +40 +3A +01 +23 +1B +06 +D3 +63 +00 +23 +91 +63 +1C +46 +9D +00 +5B +1C +54 +51 +0E +2B +FA +D3 +C3 +69 +13 +62 +42 +62 +C1 +62 +80 +6A +02 +49 +01 +60 +30 +BD +00 +13 +00 +00 +A5 +2E +5A +E2 +F8 +B5 +04 +46 +40 +68 +00 +26 +0F +46 +00 +28 +05 +D0 +60 +78 +02 +28 +18 +D0 +A0 +89 +00 +28 +2F +D0 +A0 +89 +E1 +89 +88 +42 +3E +D2 +20 +89 +80 +00 +00 +19 +07 +61 +72 +B6 +A0 +89 +40 +1C +A0 +81 +62 +B6 +20 +89 +40 +1C +80 +B2 +20 +81 +E1 +89 +88 +42 +00 +D1 +26 +81 +F8 +BD +66 +70 +20 +46 +FF +F7 +70 +FF +05 +46 +20 +30 +06 +70 +21 +89 +E8 +69 +89 +00 +09 +19 +08 +61 +72 +B6 +A0 +89 +40 +1C +A0 +81 +62 +B6 +20 +89 +40 +1C +80 +B2 +20 +81 +E1 +89 +88 +42 +0A +D1 +26 +81 +08 +E0 +20 +46 +FF +F7 +57 +FF +05 +46 +C0 +69 +04 +21 +07 +60 +20 +20 +41 +55 +01 +20 +68 +70 +28 +46 +00 +F0 +3D +F9 +29 +46 +03 +48 +00 +F0 +F9 +F8 +F8 +BD +03 +20 +FF +F7 +25 +FC +F8 +BD +CC +1A +00 +20 +03 +21 +01 +70 +00 +21 +41 +70 +41 +80 +41 +60 +81 +60 +70 +47 +F8 +B5 +05 +46 +40 +88 +00 +28 +04 +D0 +25 +4C +A9 +68 +22 +68 +91 +42 +01 +D0 +FF +20 +F8 +BD +40 +1E +00 +04 +00 +0C +68 +80 +3B +D1 +21 +68 +68 +78 +88 +70 +6A +68 +01 +27 +00 +2A +28 +D0 +28 +46 +FF +F7 +1E +FF +06 +46 +05 +21 +20 +30 +01 +70 +30 +46 +00 +F0 +08 +F9 +6F +80 +AE +60 +B0 +78 +68 +70 +15 +48 +21 +68 +40 +68 +8A +78 +80 +78 +82 +42 +01 +D3 +30 +46 +0A +E0 +11 +48 +00 +F0 +B8 +F8 +31 +46 +0F +48 +00 +F0 +B4 +F8 +20 +68 +47 +70 +77 +70 +10 +E0 +FF +F7 +50 +FE +21 +68 +00 +20 +20 +31 +08 +70 +0B +E0 +08 +4A +52 +68 +92 +78 +82 +42 +06 +D9 +05 +48 +00 +F0 +A1 +F8 +20 +68 +47 +70 +00 +20 +EC +E7 +00 +20 +F8 +BD +00 +00 +1C +00 +00 +20 +CC +1A +00 +20 +70 +B5 +0E +46 +18 +4D +04 +46 +41 +88 +28 +68 +00 +29 +07 +D0 +A1 +68 +81 +42 +08 +D1 +60 +88 +40 +1C +60 +80 +00 +20 +70 +BD +A0 +60 +80 +78 +60 +70 +F6 +E7 +00 +2E +0F +D0 +62 +78 +80 +78 +82 +42 +03 +D2 +88 +70 +A0 +68 +00 +F0 +A0 +F8 +60 +68 +00 +28 +06 +D0 +20 +46 +29 +68 +00 +F0 +71 +F8 +07 +E0 +01 +20 +70 +BD +28 +68 +60 +60 +28 +68 +00 +21 +84 +60 +41 +60 +09 +21 +30 +46 +FF +F7 +8C +FD +F2 +E7 +00 +00 +1C +00 +00 +20 +70 +B5 +18 +48 +01 +21 +00 +68 +41 +70 +00 +F0 +77 +F8 +16 +4C +65 +78 +13 +E0 +E8 +00 +01 +19 +48 +68 +02 +78 +00 +2A +17 +D0 +01 +2A +1A +D0 +00 +F0 +BC +F8 +E0 +78 +6D +1C +85 +42 +00 +D1 +00 +25 +72 +B6 +A0 +78 +40 +1E +A0 +70 +62 +B6 +A0 +78 +00 +28 +E8 +D1 +65 +70 +09 +48 +FF +F7 +8A +FE +00 +F0 +D7 +F8 +70 +BD +89 +68 +89 +B2 +FF +F7 +FC +FD +E6 +E7 +89 +68 +FF +F7 +E8 +FE +E2 +E7 +00 +00 +1C +00 +00 +20 +60 +17 +00 +20 +CC +1A +00 +20 +10 +B5 +12 +4A +D3 +68 +00 +2B +17 +D0 +13 +46 +9B +8A +04 +E0 +00 +2C +12 +D0 +22 +46 +A4 +8A +E3 +18 +D4 +68 +8B +42 +F7 +D3 +C4 +60 +D0 +60 +02 +61 +C4 +68 +00 +2C +00 +D0 +20 +61 +59 +1A +81 +82 +90 +8A +40 +1A +90 +82 +10 +BD +00 +24 +C4 +60 +D0 +60 +C9 +1A +02 +61 +91 +82 +84 +82 +10 +BD +00 +00 +E4 +1A +00 +20 +30 +B5 +02 +78 +00 +23 +02 +2A +03 +D0 +01 +2A +01 +D0 +03 +2A +00 +D1 +01 +23 +8C +78 +00 +E0 +10 +46 +42 +68 +00 +2A +02 +D0 +95 +78 +A5 +42 +F8 +D2 +4A +60 +41 +60 +00 +2B +04 +D0 +00 +2A +00 +D0 +91 +60 +88 +60 +30 +BD +00 +20 +FB +E7 +03 +49 +4A +68 +42 +60 +00 +22 +82 +60 +48 +60 +70 +47 +00 +00 +CC +1A +00 +20 +10 +B5 +83 +68 +04 +46 +00 +2B +05 +D1 +60 +78 +01 +28 +0C +D1 +06 +4B +03 +E0 +9B +68 +18 +78 +00 +28 +FB +D0 +20 +46 +00 +F0 +1D +F8 +21 +46 +18 +46 +FF +F7 +C3 +FF +10 +BD +CC +1A +00 +20 +10 +B5 +01 +69 +00 +29 +0F +D0 +C2 +68 +CA +60 +C3 +68 +00 +22 +00 +2B +07 +D0 +8B +8A +84 +8A +1B +19 +8B +82 +C3 +68 +19 +61 +C2 +60 +00 +E0 +8A +82 +02 +61 +10 +BD +00 +00 +81 +68 +00 +29 +07 +D0 +42 +68 +4A +60 +41 +68 +00 +29 +01 +D0 +80 +68 +88 +60 +70 +47 +06 +49 +06 +E0 +4A +68 +82 +42 +02 +D1 +40 +68 +48 +60 +70 +47 +11 +46 +00 +29 +F6 +D1 +70 +47 +00 +00 +CC +1A +00 +20 +10 +B5 +41 +68 +00 +29 +0E +D0 +FF +F7 +D9 +FD +04 +46 +FF +F7 +C7 +FF +01 +20 +60 +70 +03 +21 +20 +20 +01 +55 +21 +46 +04 +48 +FF +F7 +7E +FF +10 +BD +41 +88 +49 +1C +41 +80 +10 +BD +00 +00 +CC +1A +00 +20 +10 +B5 +07 +48 +00 +68 +41 +6A +80 +6A +81 +42 +03 +D3 +00 +68 +04 +49 +88 +42 +02 +D0 +01 +20 +FF +F7 +98 +FA +10 +BD +00 +00 +1C +00 +00 +20 +A5 +2E +5A +E2 +02 +49 +48 +60 +02 +21 +41 +70 +70 +47 +00 +00 +1C +00 +00 +20 +F7 +B5 +06 +46 +00 +20 +04 +46 +33 +4A +34 +49 +02 +E0 +83 +00 +D4 +50 +40 +1C +0B +88 +98 +42 +F9 +D3 +31 +48 +30 +22 +01 +88 +30 +48 +FF +F7 +25 +FC +30 +48 +01 +21 +00 +68 +C9 +07 +80 +B2 +42 +18 +2E +48 +01 +68 +2E +48 +FF +F7 +1A +FC +2D +48 +08 +22 +01 +88 +2D +48 +00 +68 +FF +F7 +13 +FC +2C +4F +FF +25 +FD +70 +7C +84 +2B +4A +00 +21 +38 +46 +FF +F7 +90 +FD +29 +48 +04 +21 +01 +70 +44 +60 +28 +48 +01 +70 +C4 +60 +04 +61 +84 +82 +78 +6A +20 +30 +FF +F7 +93 +F8 +25 +48 +26 +49 +07 +60 +02 +20 +78 +70 +23 +48 +04 +70 +44 +70 +09 +78 +C1 +70 +FF +F7 +99 +FD +22 +48 +01 +6A +2A +04 +11 +43 +01 +62 +C1 +69 +02 +6A +52 +02 +92 +0E +92 +06 +11 +43 +C1 +61 +FF +F7 +07 +FC +1C +49 +00 +28 +08 +60 +0B +DB +1B +49 +41 +18 +0D +70 +C2 +06 +D2 +0E +01 +21 +91 +40 +40 +11 +18 +4A +80 +00 +80 +18 +01 +60 +00 +23 +30 +46 +02 +9A +01 +99 +00 +F0 +67 +F8 +FE +BD +E4 +17 +00 +20 +FE +12 +00 +00 +18 +13 +00 +00 +40 +00 +00 +20 +00 +13 +00 +00 +1C +13 +00 +00 +70 +01 +00 +20 +22 +13 +00 +00 +10 +00 +00 +20 +9C +1A +00 +20 +ED +04 +00 +00 +CC +1A +00 +20 +E4 +1A +00 +20 +1C +00 +00 +20 +60 +17 +00 +20 +20 +13 +00 +00 +00 +ED +00 +E0 +2C +00 +00 +20 +00 +E4 +00 +E0 +00 +E1 +00 +E0 +10 +B5 +0B +48 +01 +21 +00 +68 +41 +70 +FF +F7 +DD +FE +FF +F7 +01 +FC +08 +48 +01 +68 +49 +1C +01 +60 +FF +F7 +1D +FC +00 +F0 +0D +F8 +05 +48 +FF +F7 +01 +FD +FF +F7 +4E +FF +10 +BD +00 +00 +1C +00 +00 +20 +24 +00 +00 +20 +CC +1A +00 +20 +70 +B5 +0D +4C +20 +68 +00 +28 +15 +D0 +A0 +88 +0B +4E +40 +1E +A0 +80 +0A +E0 +E8 +88 +FF +F7 +CA +F9 +A8 +88 +A0 +80 +28 +68 +20 +60 +29 +46 +30 +68 +FF +F7 +CF +FC +A0 +88 +00 +28 +02 +D1 +25 +68 +00 +2D +EE +D1 +70 +BD +38 +00 +00 +20 +10 +00 +00 +20 +FF +B5 +08 +06 +81 +B0 +0C +46 +16 +46 +1F +46 +00 +0E +00 +D1 +4C +1C +16 +48 +FF +F7 +95 +FB +05 +00 +25 +D0 +20 +02 +00 +0C +AE +62 +68 +84 +EF +61 +E1 +B2 +28 +46 +01 +9A +FF +F7 +D4 +FC +01 +24 +0F +48 +0F +49 +06 +E0 +A2 +00 +12 +18 +40 +3A +D2 +6B +00 +2A +04 +D0 +64 +1C +0A +88 +94 +42 +F5 +D9 +00 +24 +A1 +00 +08 +18 +40 +38 +C5 +63 +EC +70 +28 +46 +FF +F7 +FB +FB +06 +48 +00 +68 +20 +30 +04 +70 +20 +46 +05 +B0 +F0 +BD +40 +00 +00 +20 +E4 +17 +00 +20 +FE +12 +00 +00 +1C +00 +00 +20 +70 +B5 +21 +4C +00 +25 +21 +4E +21 +68 +00 +28 +02 +D0 +CA +78 +82 +42 +1A +D1 +4D +70 +FE +F7 +B4 +FF +21 +68 +48 +62 +FF +F7 +C3 +FE +20 +68 +C1 +78 +89 +00 +89 +19 +40 +39 +CD +63 +81 +6A +17 +48 +FF +F7 +6B +FC +21 +68 +16 +48 +8D +62 +FF +F7 +66 +FC +00 +20 +25 +60 +FF +F7 +C8 +FB +19 +E0 +13 +49 +09 +88 +88 +42 +17 +D8 +80 +00 +86 +19 +40 +3E +F4 +6B +00 +2C +11 +D0 +20 +46 +FF +F7 +6E +FE +20 +46 +FF +F7 +55 +FE +F5 +63 +08 +48 +A1 +6A +FF +F7 +4C +FC +21 +46 +07 +48 +A5 +62 +FF +F7 +47 +FC +00 +20 +70 +BD +FF +20 +70 +BD +00 +00 +1C +00 +00 +20 +E4 +17 +00 +20 +70 +01 +00 +20 +40 +00 +00 +20 +FE +12 +00 +00 +02 +48 +00 +68 +00 +28 +00 +D0 +C0 +78 +70 +47 +1C +00 +00 +20 +0A +43 +6F +72 +74 +65 +78 +20 +4D +69 +63 +72 +6F +63 +6F +6E +74 +72 +6F +6C +6C +65 +72 +20 +53 +79 +73 +74 +65 +6D +20 +44 +65 +73 +69 +67 +6E +20 +4B +69 +74 +20 +2D +20 +52 +54 +58 +20 +44 +65 +6D +6F +20 +2D +20 +72 +65 +76 +69 +73 +69 +6F +6E +20 +24 +52 +65 +76 +69 +73 +69 +6F +6E +3A +20 +32 +31 +34 +35 +35 +37 +20 +24 +0A +00 +00 +06 +00 +20 +03 +00 +01 +05 +00 +01 +00 +0F +27 +00 +00 +00 +00 +00 +00 +C8 +00 +00 +00 +00 +00 +00 +00 +2C +01 +00 +00 +F0 +15 +00 +00 +10 +00 +00 +00 +44 +13 +00 +00 +00 +00 +00 +20 +40 +00 +00 +00 +04 +01 +00 +00 +84 +13 +00 +00 +40 +00 +00 +20 +20 +1E +00 +00 +20 +01 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +E1 +F5 +05 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 diff --git a/Cortex-M0/nanosoc/systems/mcu/testcodes/rtx_demo/rtx_demo_cm0.uvopt b/Cortex-M0/nanosoc/systems/mcu/testcodes/rtx_demo/rtx_demo_cm0.uvopt new file mode 100644 index 0000000..ff858fa --- /dev/null +++ b/Cortex-M0/nanosoc/systems/mcu/testcodes/rtx_demo/rtx_demo_cm0.uvopt @@ -0,0 +1,277 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no" ?> +<ProjectOpt xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="project_opt.xsd"> + + <SchemaVersion>1.0</SchemaVersion> + + <Header>### uVision Project, (C) Keil Software</Header> + + <Extensions> + <cExt>*.c</cExt> + <aExt>*.s*; *.src; *.a*</aExt> + <oExt>*.obj</oExt> + <lExt>*.lib</lExt> + <tExt>*.txt; *.h; *.inc</tExt> + <pExt>*.plm</pExt> + <CppX>*.cpp</CppX> + </Extensions> + + <DaveTm> + <dwLowDateTime>0</dwLowDateTime> + <dwHighDateTime>0</dwHighDateTime> + </DaveTm> + + <Target> + <TargetName>Debug</TargetName> + <ToolsetNumber>0x4</ToolsetNumber> + <ToolsetName>ARM-ADS</ToolsetName> + <TargetOption> + <CLKADS>50000000</CLKADS> + <OPTTT> + <gFlags>1</gFlags> + <BeepAtEnd>1</BeepAtEnd> + <RunSim>1</RunSim> + <RunTarget>0</RunTarget> + </OPTTT> + <OPTHX> + <HexSelection>1</HexSelection> + <FlashByte>65535</FlashByte> + <HexRangeLowAddress>0</HexRangeLowAddress> + <HexRangeHighAddress>0</HexRangeHighAddress> + <HexOffset>0</HexOffset> + </OPTHX> + <OPTLEX> + <PageWidth>79</PageWidth> + <PageLength>66</PageLength> + <TabStop>8</TabStop> + <ListingPath>.\</ListingPath> + </OPTLEX> + <ListingPage> + <CreateCListing>1</CreateCListing> + <CreateAListing>1</CreateAListing> + <CreateLListing>1</CreateLListing> + <CreateIListing>0</CreateIListing> + <AsmCond>1</AsmCond> + <AsmSymb>1</AsmSymb> + <AsmXref>0</AsmXref> + <CCond>1</CCond> + <CCode>0</CCode> + <CListInc>0</CListInc> + <CSymb>0</CSymb> + <LinkerCodeListing>0</LinkerCodeListing> + </ListingPage> + <OPTXL> + <LMap>1</LMap> + <LComments>1</LComments> + <LGenerateSymbols>1</LGenerateSymbols> + <LLibSym>1</LLibSym> + <LLines>1</LLines> + <LLocSym>1</LLocSym> + <LPubSym>1</LPubSym> + <LXref>0</LXref> + <LExpSel>0</LExpSel> + </OPTXL> + <OPTFL> + <tvExp>1</tvExp> + <tvExpOptDlg>0</tvExpOptDlg> + <IsCurrentTarget>1</IsCurrentTarget> + </OPTFL> + <CpuCode>255</CpuCode> + <DllOpt> + <SimDllName>SARMCM3.DLL</SimDllName> + <SimDllArguments></SimDllArguments> + <SimDlgDllName>DARMCM1.DLL</SimDlgDllName> + <SimDlgDllArguments></SimDlgDllArguments> + <TargetDllName>SARMCM3.DLL</TargetDllName> + <TargetDllArguments></TargetDllArguments> + <TargetDlgDllName>TARMCM1.DLL</TargetDlgDllName> + <TargetDlgDllArguments></TargetDlgDllArguments> + </DllOpt> + <DebugOpt> + <uSim>1</uSim> + <uTrg>0</uTrg> + <sLdApp>1</sLdApp> + <sGomain>1</sGomain> + <sRbreak>1</sRbreak> + <sRwatch>1</sRwatch> + <sRmem>1</sRmem> + <sRfunc>1</sRfunc> + <sRbox>1</sRbox> + <tLdApp>1</tLdApp> + <tGomain>0</tGomain> + <tRbreak>1</tRbreak> + <tRwatch>1</tRwatch> + <tRmem>1</tRmem> + <tRfunc>0</tRfunc> + <tRbox>1</tRbox> + <tRtrace>0</tRtrace> + <sRunDeb>0</sRunDeb> + <sLrtime>0</sLrtime> + <nTsel>-1</nTsel> + <sDll></sDll> + <sDllPa></sDllPa> + <sDlgDll></sDlgDll> + <sDlgPa></sDlgPa> + <sIfile></sIfile> + <tDll></tDll> + <tDllPa></tDllPa> + <tDlgDll></tDlgDll> + <tDlgPa></tDlgPa> + <tIfile></tIfile> + <pMon></pMon> + </DebugOpt> + <Breakpoint/> + <DebugFlag> + <trace>0</trace> + <periodic>1</periodic> + <aLwin>0</aLwin> + <aCover>0</aCover> + <aSer1>0</aSer1> + <aSer2>0</aSer2> + <aPa>0</aPa> + <viewmode>0</viewmode> + <vrSel>0</vrSel> + <aSym>0</aSym> + <aTbox>0</aTbox> + <AscS1>0</AscS1> + <AscS2>0</AscS2> + <AscS3>0</AscS3> + <aSer3>0</aSer3> + <eProf>0</eProf> + <aLa>0</aLa> + <aPa1>0</aPa1> + <AscS4>0</AscS4> + <aSer4>0</aSer4> + <StkLoc>0</StkLoc> + <TrcWin>0</TrcWin> + <newCpu>0</newCpu> + <uProt>0</uProt> + </DebugFlag> + <Tracepoint> + <THDelay>0</THDelay> + </Tracepoint> + <LintExecutable></LintExecutable> + <LintConfigFile></LintConfigFile> + </TargetOption> + </Target> + + <Group> + <GroupName>Startup</GroupName> + <tvExp>1</tvExp> + <tvExpOptDlg>0</tvExpOptDlg> + <cbSel>0</cbSel> + <RteFlg>0</RteFlg> + <File> + <GroupNumber>1</GroupNumber> + <FileNumber>1</FileNumber> + <FileType>2</FileType> + <tvExp>0</tvExp> + <Focus>0</Focus> + <ColumnNumber>0</ColumnNumber> + <tvExpOptDlg>0</tvExpOptDlg> + <TopLine>0</TopLine> + <CurrentLine>0</CurrentLine> + <bDave2>0</bDave2> + <PathWithFileName>..\..\..\..\software\cmsis\Device\ARM\CMSDK_CM0\Source\ARM\startup_CMSDK_CM0.s</PathWithFileName> + <FilenameWithoutPath>startup_CMSDK_CM0.s</FilenameWithoutPath> + <RteFlg>0</RteFlg> + <bShared>0</bShared> + </File> + </Group> + + <Group> + <GroupName>Application</GroupName> + <tvExp>1</tvExp> + <tvExpOptDlg>0</tvExpOptDlg> + <cbSel>0</cbSel> + <RteFlg>0</RteFlg> + <File> + <GroupNumber>2</GroupNumber> + <FileNumber>2</FileNumber> + <FileType>1</FileType> + <tvExp>0</tvExp> + <Focus>0</Focus> + <ColumnNumber>26</ColumnNumber> + <tvExpOptDlg>0</tvExpOptDlg> + <TopLine>30</TopLine> + <CurrentLine>51</CurrentLine> + <bDave2>0</bDave2> + <PathWithFileName>.\rtx_demo.c</PathWithFileName> + <FilenameWithoutPath>rtx_demo.c</FilenameWithoutPath> + <RteFlg>0</RteFlg> + <bShared>0</bShared> + </File> + <File> + <GroupNumber>2</GroupNumber> + <FileNumber>3</FileNumber> + <FileType>1</FileType> + <tvExp>0</tvExp> + <Focus>0</Focus> + <ColumnNumber>0</ColumnNumber> + <tvExpOptDlg>0</tvExpOptDlg> + <TopLine>0</TopLine> + <CurrentLine>0</CurrentLine> + <bDave2>0</bDave2> + <PathWithFileName>..\..\..\..\software\common\retarget\uart_stdout.c</PathWithFileName> + <FilenameWithoutPath>uart_stdout.c</FilenameWithoutPath> + <RteFlg>0</RteFlg> + <bShared>0</bShared> + </File> + <File> + <GroupNumber>2</GroupNumber> + <FileNumber>4</FileNumber> + <FileType>1</FileType> + <tvExp>0</tvExp> + <Focus>0</Focus> + <ColumnNumber>0</ColumnNumber> + <tvExpOptDlg>0</tvExpOptDlg> + <TopLine>0</TopLine> + <CurrentLine>0</CurrentLine> + <bDave2>0</bDave2> + <PathWithFileName>..\..\..\..\software\common\retarget\retarget.c</PathWithFileName> + <FilenameWithoutPath>retarget.c</FilenameWithoutPath> + <RteFlg>0</RteFlg> + <bShared>0</bShared> + </File> + </Group> + + <Group> + <GroupName>System</GroupName> + <tvExp>1</tvExp> + <tvExpOptDlg>0</tvExpOptDlg> + <cbSel>0</cbSel> + <RteFlg>0</RteFlg> + <File> + <GroupNumber>3</GroupNumber> + <FileNumber>5</FileNumber> + <FileType>1</FileType> + <tvExp>0</tvExp> + <Focus>0</Focus> + <ColumnNumber>0</ColumnNumber> + <tvExpOptDlg>0</tvExpOptDlg> + <TopLine>0</TopLine> + <CurrentLine>0</CurrentLine> + <bDave2>0</bDave2> + <PathWithFileName>.\RTX_Config.c</PathWithFileName> + <FilenameWithoutPath>RTX_Config.c</FilenameWithoutPath> + <RteFlg>0</RteFlg> + <bShared>0</bShared> + </File> + <File> + <GroupNumber>3</GroupNumber> + <FileNumber>6</FileNumber> + <FileType>1</FileType> + <tvExp>0</tvExp> + <Focus>0</Focus> + <ColumnNumber>0</ColumnNumber> + <tvExpOptDlg>0</tvExpOptDlg> + <TopLine>0</TopLine> + <CurrentLine>0</CurrentLine> + <bDave2>0</bDave2> + <PathWithFileName>..\..\..\..\software\cmsis\Device\ARM\CMSDK_CM0\Source\system_CMSDK_CM0.c</PathWithFileName> + <FilenameWithoutPath>system_CMSDK_CM0.c</FilenameWithoutPath> + <RteFlg>0</RteFlg> + <bShared>0</bShared> + </File> + </Group> + +</ProjectOpt> diff --git a/Cortex-M0/nanosoc/systems/mcu/testcodes/rtx_demo/rtx_demo_cm0.uvproj b/Cortex-M0/nanosoc/systems/mcu/testcodes/rtx_demo/rtx_demo_cm0.uvproj new file mode 100644 index 0000000..6c7674d --- /dev/null +++ b/Cortex-M0/nanosoc/systems/mcu/testcodes/rtx_demo/rtx_demo_cm0.uvproj @@ -0,0 +1,440 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no" ?> +<Project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="project_proj.xsd"> + + <SchemaVersion>1.1</SchemaVersion> + + <Header>### uVision Project, (C) Keil Software</Header> + + <Targets> + <Target> + <TargetName>Debug</TargetName> + <ToolsetNumber>0x4</ToolsetNumber> + <ToolsetName>ARM-ADS</ToolsetName> + <TargetOption> + <TargetCommonOption> + <Device>Cortex-M0</Device> + <Vendor>ARM</Vendor> + <Cpu>CLOCK(12000000) CPUTYPE("Cortex-M0") ESEL ELITTLE</Cpu> + <FlashUtilSpec></FlashUtilSpec> + <StartupFile></StartupFile> + <FlashDriverDll></FlashDriverDll> + <DeviceId>4803</DeviceId> + <RegisterFile></RegisterFile> + <MemoryEnv></MemoryEnv> + <Cmp></Cmp> + <Asm></Asm> + <Linker></Linker> + <OHString></OHString> + <InfinionOptionDll></InfinionOptionDll> + <SLE66CMisc></SLE66CMisc> + <SLE66AMisc></SLE66AMisc> + <SLE66LinkerMisc></SLE66LinkerMisc> + <SFDFile></SFDFile> + <UseEnv>0</UseEnv> + <BinPath></BinPath> + <IncludePath></IncludePath> + <LibPath></LibPath> + <RegisterFilePath></RegisterFilePath> + <DBRegisterFilePath></DBRegisterFilePath> + <TargetStatus> + <Error>0</Error> + <ExitCodeStop>0</ExitCodeStop> + <ButtonStop>0</ButtonStop> + <NotGenerated>0</NotGenerated> + <InvalidFlash>1</InvalidFlash> + </TargetStatus> + <OutputDirectory>.\</OutputDirectory> + <OutputName>rtx_demo</OutputName> + <CreateExecutable>1</CreateExecutable> + <CreateLib>0</CreateLib> + <CreateHexFile>0</CreateHexFile> + <DebugInformation>1</DebugInformation> + <BrowseInformation>1</BrowseInformation> + <ListingPath>.\</ListingPath> + <HexFormatSelection>1</HexFormatSelection> + <Merge32K>0</Merge32K> + <CreateBatchFile>0</CreateBatchFile> + <BeforeCompile> + <RunUserProg1>0</RunUserProg1> + <RunUserProg2>0</RunUserProg2> + <UserProg1Name></UserProg1Name> + <UserProg2Name></UserProg2Name> + <UserProg1Dos16Mode>0</UserProg1Dos16Mode> + <UserProg2Dos16Mode>0</UserProg2Dos16Mode> + <nStopU1X>0</nStopU1X> + <nStopU2X>0</nStopU2X> + </BeforeCompile> + <BeforeMake> + <RunUserProg1>0</RunUserProg1> + <RunUserProg2>0</RunUserProg2> + <UserProg1Name></UserProg1Name> + <UserProg2Name></UserProg2Name> + <UserProg1Dos16Mode>0</UserProg1Dos16Mode> + <UserProg2Dos16Mode>0</UserProg2Dos16Mode> + </BeforeMake> + <AfterMake> + <RunUserProg1>1</RunUserProg1> + <RunUserProg2>0</RunUserProg2> + <UserProg1Name>$K\ARM\ARMCC\BIN\fromelf.exe #L --vhx --8x1 --output rtx_demo_cm0.hex</UserProg1Name> + <UserProg2Name></UserProg2Name> + <UserProg1Dos16Mode>0</UserProg1Dos16Mode> + <UserProg2Dos16Mode>0</UserProg2Dos16Mode> + </AfterMake> + <SelectedForBatchBuild>0</SelectedForBatchBuild> + <SVCSIdString></SVCSIdString> + </TargetCommonOption> + <CommonProperty> + <UseCPPCompiler>0</UseCPPCompiler> + <RVCTCodeConst>0</RVCTCodeConst> + <RVCTZI>0</RVCTZI> + <RVCTOtherData>0</RVCTOtherData> + <ModuleSelection>0</ModuleSelection> + <IncludeInBuild>1</IncludeInBuild> + <AlwaysBuild>0</AlwaysBuild> + <GenerateAssemblyFile>0</GenerateAssemblyFile> + <AssembleAssemblyFile>0</AssembleAssemblyFile> + <PublicsOnly>0</PublicsOnly> + <StopOnExitCode>3</StopOnExitCode> + <CustomArgument></CustomArgument> + <IncludeLibraryModules></IncludeLibraryModules> + </CommonProperty> + <DllOption> + <SimDllName>SARMCM3.DLL</SimDllName> + <SimDllArguments></SimDllArguments> + <SimDlgDll>DARMCM1.DLL</SimDlgDll> + <SimDlgDllArguments></SimDlgDllArguments> + <TargetDllName>SARMCM3.DLL</TargetDllName> + <TargetDllArguments></TargetDllArguments> + <TargetDlgDll>TARMCM1.DLL</TargetDlgDll> + <TargetDlgDllArguments></TargetDlgDllArguments> + </DllOption> + <DebugOption> + <OPTHX> + <HexSelection>1</HexSelection> + <HexRangeLowAddress>0</HexRangeLowAddress> + <HexRangeHighAddress>0</HexRangeHighAddress> + <HexOffset>0</HexOffset> + <Oh166RecLen>16</Oh166RecLen> + </OPTHX> + <Simulator> + <UseSimulator>1</UseSimulator> + <LoadApplicationAtStartup>1</LoadApplicationAtStartup> + <RunToMain>1</RunToMain> + <RestoreBreakpoints>1</RestoreBreakpoints> + <RestoreWatchpoints>1</RestoreWatchpoints> + <RestoreMemoryDisplay>1</RestoreMemoryDisplay> + <RestoreFunctions>1</RestoreFunctions> + <RestoreToolbox>1</RestoreToolbox> + <LimitSpeedToRealTime>0</LimitSpeedToRealTime> + </Simulator> + <Target> + <UseTarget>0</UseTarget> + <LoadApplicationAtStartup>1</LoadApplicationAtStartup> + <RunToMain>0</RunToMain> + <RestoreBreakpoints>1</RestoreBreakpoints> + <RestoreWatchpoints>1</RestoreWatchpoints> + <RestoreMemoryDisplay>1</RestoreMemoryDisplay> + <RestoreFunctions>0</RestoreFunctions> + <RestoreToolbox>1</RestoreToolbox> + <RestoreTracepoints>0</RestoreTracepoints> + </Target> + <RunDebugAfterBuild>0</RunDebugAfterBuild> + <TargetSelection>-1</TargetSelection> + <SimDlls> + <CpuDll></CpuDll> + <CpuDllArguments></CpuDllArguments> + <PeripheralDll></PeripheralDll> + <PeripheralDllArguments></PeripheralDllArguments> + <InitializationFile></InitializationFile> + </SimDlls> + <TargetDlls> + <CpuDll></CpuDll> + <CpuDllArguments></CpuDllArguments> + <PeripheralDll></PeripheralDll> + <PeripheralDllArguments></PeripheralDllArguments> + <InitializationFile></InitializationFile> + <Driver></Driver> + </TargetDlls> + </DebugOption> + <Utilities> + <Flash1> + <UseTargetDll>0</UseTargetDll> + <UseExternalTool>0</UseExternalTool> + <RunIndependent>0</RunIndependent> + <UpdateFlashBeforeDebugging>0</UpdateFlashBeforeDebugging> + <Capability>0</Capability> + <DriverSelection>-1</DriverSelection> + </Flash1> + <Flash2></Flash2> + <Flash3></Flash3> + <Flash4></Flash4> + </Utilities> + <TargetArmAds> + <ArmAdsMisc> + <GenerateListings>0</GenerateListings> + <asHll>1</asHll> + <asAsm>1</asAsm> + <asMacX>1</asMacX> + <asSyms>1</asSyms> + <asFals>1</asFals> + <asDbgD>1</asDbgD> + <asForm>1</asForm> + <ldLst>0</ldLst> + <ldmm>1</ldmm> + <ldXref>1</ldXref> + <BigEnd>0</BigEnd> + <AdsALst>1</AdsALst> + <AdsACrf>1</AdsACrf> + <AdsANop>0</AdsANop> + <AdsANot>0</AdsANot> + <AdsLLst>1</AdsLLst> + <AdsLmap>1</AdsLmap> + <AdsLcgr>1</AdsLcgr> + <AdsLsym>1</AdsLsym> + <AdsLszi>1</AdsLszi> + <AdsLtoi>1</AdsLtoi> + <AdsLsun>1</AdsLsun> + <AdsLven>1</AdsLven> + <AdsLsxf>1</AdsLsxf> + <RvctClst>0</RvctClst> + <GenPPlst>0</GenPPlst> + <AdsCpuType>"Cortex-M0"</AdsCpuType> + <RvctDeviceName></RvctDeviceName> + <mOS>1</mOS> + <uocRom>0</uocRom> + <uocRam>0</uocRam> + <hadIROM>0</hadIROM> + <hadIRAM>0</hadIRAM> + <hadXRAM>0</hadXRAM> + <uocXRam>0</uocXRam> + <RvdsVP>0</RvdsVP> + <hadIRAM2>0</hadIRAM2> + <hadIROM2>0</hadIROM2> + <StupSel>1</StupSel> + <useUlib>0</useUlib> + <EndSel>1</EndSel> + <uLtcg>0</uLtcg> + <RoSelD>0</RoSelD> + <RwSelD>5</RwSelD> + <CodeSel>0</CodeSel> + <OptFeed>0</OptFeed> + <NoZi1>0</NoZi1> + <NoZi2>0</NoZi2> + <NoZi3>0</NoZi3> + <NoZi4>0</NoZi4> + <NoZi5>0</NoZi5> + <Ro1Chk>1</Ro1Chk> + <Ro2Chk>0</Ro2Chk> + <Ro3Chk>0</Ro3Chk> + <Ir1Chk>0</Ir1Chk> + <Ir2Chk>0</Ir2Chk> + <Ra1Chk>1</Ra1Chk> + <Ra2Chk>0</Ra2Chk> + <Ra3Chk>0</Ra3Chk> + <Im1Chk>0</Im1Chk> + <Im2Chk>0</Im2Chk> + <OnChipMemories> + <Ocm1> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </Ocm1> + <Ocm2> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </Ocm2> + <Ocm3> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </Ocm3> + <Ocm4> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </Ocm4> + <Ocm5> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </Ocm5> + <Ocm6> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </Ocm6> + <IRAM> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </IRAM> + <IROM> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </IROM> + <XRAM> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </XRAM> + <OCR_RVCT1> + <Type>1</Type> + <StartAddress>0x0</StartAddress> + <Size>0x10000</Size> + </OCR_RVCT1> + <OCR_RVCT2> + <Type>1</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </OCR_RVCT2> + <OCR_RVCT3> + <Type>1</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </OCR_RVCT3> + <OCR_RVCT4> + <Type>1</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </OCR_RVCT4> + <OCR_RVCT5> + <Type>1</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </OCR_RVCT5> + <OCR_RVCT6> + <Type>0</Type> + <StartAddress>0x20000000</StartAddress> + <Size>0x10000</Size> + </OCR_RVCT6> + <OCR_RVCT7> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </OCR_RVCT7> + <OCR_RVCT8> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </OCR_RVCT8> + <OCR_RVCT9> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </OCR_RVCT9> + <OCR_RVCT10> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </OCR_RVCT10> + </OnChipMemories> + <RvctStartVector></RvctStartVector> + </ArmAdsMisc> + <Cads> + <interw>1</interw> + <Optim>4</Optim> + <oTime>0</oTime> + <SplitLS>0</SplitLS> + <OneElfS>0</OneElfS> + <Strict>0</Strict> + <EnumInt>0</EnumInt> + <PlainCh>0</PlainCh> + <Ropi>0</Ropi> + <Rwpi>0</Rwpi> + <wLevel>0</wLevel> + <uThumb>0</uThumb> + <uSurpInc>0</uSurpInc> + <VariousControls> + <MiscControls></MiscControls> + <Define>CORTEX_M0</Define> + <Undefine></Undefine> + <IncludePath>..\..\..\..\software\cmsis\CMSIS\Include; ..\..\..\..\software\cmsis\Device\ARM\CMSDK_CM0\Include; ..\..\..\..\software\common\retarget</IncludePath> + </VariousControls> + </Cads> + <Aads> + <interw>1</interw> + <Ropi>0</Ropi> + <Rwpi>0</Rwpi> + <thumb>0</thumb> + <SplitLS>0</SplitLS> + <SwStkChk>0</SwStkChk> + <NoWarn>0</NoWarn> + <uSurpInc>0</uSurpInc> + <VariousControls> + <MiscControls></MiscControls> + <Define></Define> + <Undefine></Undefine> + <IncludePath></IncludePath> + </VariousControls> + </Aads> + <LDads> + <umfTarg>1</umfTarg> + <Ropi>0</Ropi> + <Rwpi>0</Rwpi> + <noStLib>0</noStLib> + <RepFail>1</RepFail> + <useFile>0</useFile> + <TextAddressRange>0x00000000</TextAddressRange> + <DataAddressRange>0x00000000</DataAddressRange> + <ScatterFile></ScatterFile> + <IncludeLibs></IncludeLibs> + <IncludeLibsPath></IncludeLibsPath> + <Misc></Misc> + <LinkerInputFile></LinkerInputFile> + <DisabledWarnings></DisabledWarnings> + </LDads> + </TargetArmAds> + </TargetOption> + <Groups> + <Group> + <GroupName>Startup</GroupName> + <Files> + <File> + <FileName>startup_CMSDK_CM0.s</FileName> + <FileType>2</FileType> + <FilePath>..\..\..\..\software\cmsis\Device\ARM\CMSDK_CM0\Source\ARM\startup_CMSDK_CM0.s</FilePath> + </File> + </Files> + </Group> + <Group> + <GroupName>Application</GroupName> + <Files> + <File> + <FileName>rtx_demo.c</FileName> + <FileType>1</FileType> + <FilePath>.\rtx_demo.c</FilePath> + </File> + <File> + <FileName>uart_stdout.c</FileName> + <FileType>1</FileType> + <FilePath>..\..\..\..\software\common\retarget\uart_stdout.c</FilePath> + </File> + <File> + <FileName>retarget.c</FileName> + <FileType>1</FileType> + <FilePath>..\..\..\..\software\common\retarget\retarget.c</FilePath> + </File> + </Files> + </Group> + <Group> + <GroupName>System</GroupName> + <Files> + <File> + <FileName>RTX_Config.c</FileName> + <FileType>1</FileType> + <FilePath>.\RTX_Config.c</FilePath> + </File> + <File> + <FileName>system_CMSDK_CM0.c</FileName> + <FileType>1</FileType> + <FilePath>..\..\..\..\software\cmsis\Device\ARM\CMSDK_CM0\Source\system_CMSDK_CM0.c</FilePath> + </File> + </Files> + </Group> + </Groups> + </Target> + </Targets> + +</Project> diff --git a/Cortex-M0/nanosoc/systems/mcu/testcodes/rtx_demo/rtx_demo_cm0p.hex b/Cortex-M0/nanosoc/systems/mcu/testcodes/rtx_demo/rtx_demo_cm0p.hex new file mode 100644 index 0000000..1ab6c31 --- /dev/null +++ b/Cortex-M0/nanosoc/systems/mcu/testcodes/rtx_demo/rtx_demo_cm0p.hex @@ -0,0 +1,4996 @@ +60 +1E +00 +20 +01 +03 +00 +00 +09 +03 +00 +00 +0B +03 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +E9 +01 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +8D +02 +00 +00 +ED +02 +00 +00 +13 +03 +00 +00 +13 +03 +00 +00 +13 +03 +00 +00 +13 +03 +00 +00 +13 +03 +00 +00 +13 +03 +00 +00 +13 +03 +00 +00 +13 +03 +00 +00 +13 +03 +00 +00 +13 +03 +00 +00 +13 +03 +00 +00 +00 +00 +00 +00 +13 +03 +00 +00 +13 +03 +00 +00 +13 +03 +00 +00 +13 +03 +00 +00 +13 +03 +00 +00 +13 +03 +00 +00 +13 +03 +00 +00 +13 +03 +00 +00 +13 +03 +00 +00 +13 +03 +00 +00 +13 +03 +00 +00 +13 +03 +00 +00 +13 +03 +00 +00 +13 +03 +00 +00 +13 +03 +00 +00 +13 +03 +00 +00 +13 +03 +00 +00 +13 +03 +00 +00 +13 +03 +00 +00 +13 +03 +00 +00 +00 +F0 +02 +F8 +00 +F0 +48 +F8 +0C +A0 +30 +C8 +08 +38 +24 +18 +2D +18 +A2 +46 +67 +1E +AB +46 +54 +46 +5D +46 +AC +42 +01 +D1 +00 +F0 +3A +F8 +7E +46 +0F +3E +0F +CC +B6 +46 +01 +26 +33 +42 +00 +D0 +FB +1A +A2 +46 +AB +46 +33 +43 +18 +47 +28 +12 +00 +00 +48 +12 +00 +00 +10 +3A +02 +D3 +78 +C8 +78 +C1 +FA +D8 +52 +07 +01 +D3 +30 +C8 +30 +C1 +01 +D5 +04 +68 +0C +60 +70 +47 +00 +00 +00 +23 +00 +24 +00 +25 +00 +26 +10 +3A +01 +D3 +78 +C1 +FB +D8 +52 +07 +00 +D3 +30 +C1 +00 +D5 +0B +60 +70 +47 +10 +B5 +64 +29 +02 +D1 +00 +F0 +73 +FA +10 +BD +00 +20 +10 +BD +1F +B5 +C0 +46 +C0 +46 +1F +BD +10 +B5 +10 +BD +00 +F0 +50 +FB +11 +46 +FF +F7 +F5 +FF +00 +F0 +25 +F9 +00 +F0 +68 +FB +03 +B4 +FF +F7 +F2 +FF +03 +BC +00 +F0 +BA +F9 +00 +00 +80 +F3 +09 +88 +70 +47 +EF +F3 +09 +80 +70 +47 +68 +46 +80 +F3 +09 +88 +06 +48 +00 +78 +C0 +07 +03 +D1 +03 +20 +80 +F3 +14 +88 +70 +47 +02 +20 +80 +F3 +14 +88 +70 +47 +00 +00 +0C +13 +00 +00 +06 +4B +9C +46 +EF +F3 +05 +83 +1B +06 +05 +D1 +EF +F3 +14 +83 +DB +07 +01 +D0 +00 +DF +70 +47 +60 +47 +00 +00 +C3 +08 +00 +00 +06 +4B +9C +46 +EF +F3 +05 +83 +1B +06 +05 +D1 +EF +F3 +14 +83 +DB +07 +01 +D0 +00 +DF +70 +47 +60 +47 +00 +00 +09 +0B +00 +00 +EF +F3 +09 +80 +81 +69 +89 +1E +09 +78 +00 +29 +33 +D1 +A6 +46 +1F +C8 +A4 +46 +74 +46 +E0 +47 +1F +4B +06 +CB +91 +42 +24 +D0 +08 +3B +00 +29 +10 +D0 +0C +B4 +20 +31 +01 +23 +4B +70 +EF +F3 +09 +83 +20 +3B +4B +60 +F0 +C3 +44 +46 +4D +46 +56 +46 +5F +46 +F0 +C3 +00 +F0 +BB +FE +0C +BC +1A +60 +20 +32 +53 +68 +10 +33 +F0 +CB +A0 +46 +A9 +46 +B2 +46 +BB +46 +83 +F3 +09 +88 +20 +3B +F0 +CB +50 +78 +00 +28 +03 +D0 +10 +78 +EF +F3 +09 +83 +18 +60 +02 +23 +DB +43 +18 +47 +10 +B5 +08 +4A +12 +68 +91 +42 +09 +D8 +07 +48 +89 +00 +40 +58 +86 +46 +1F +C8 +A4 +46 +F0 +47 +EF +F3 +09 +84 +0F +C4 +10 +BD +00 +00 +1C +00 +00 +20 +48 +08 +00 +00 +48 +08 +00 +00 +00 +F0 +A0 +FD +15 +4B +06 +CB +91 +42 +23 +D0 +08 +3B +0C +B4 +20 +31 +00 +23 +4B +70 +EF +F3 +09 +83 +20 +3B +4B +60 +F0 +C3 +44 +46 +4D +46 +56 +46 +5F +46 +F0 +C3 +00 +F0 +75 +FE +0C +BC +1A +60 +20 +32 +53 +68 +10 +33 +F0 +CB +A0 +46 +A9 +46 +B2 +46 +BB +46 +83 +F3 +09 +88 +20 +3B +F0 +CB +50 +78 +00 +28 +01 +D0 +10 +78 +18 +61 +02 +23 +DB +43 +18 +47 +00 +00 +1C +00 +00 +20 +00 +F0 +0A +FF +CE +E7 +00 +00 +00 +F0 +E4 +FA +00 +F0 +04 +FF +C8 +E7 +00 +00 +07 +48 +80 +47 +07 +48 +00 +47 +FE +E7 +FE +E7 +FE +E7 +FE +E7 +FE +E7 +FE +E7 +04 +48 +05 +49 +05 +4A +06 +4B +70 +47 +00 +00 +85 +05 +00 +00 +C1 +00 +00 +00 +60 +1B +00 +20 +60 +1E +00 +20 +60 +1C +00 +20 +60 +1C +00 +20 +28 +4C +29 +4F +01 +20 +BC +46 +00 +DF +28 +A0 +00 +F0 +A8 +F9 +29 +4F +01 +20 +BC +46 +A1 +68 +00 +DF +F2 +E7 +27 +4D +21 +4C +27 +4F +01 +22 +29 +46 +10 +46 +BC +46 +00 +DF +21 +68 +25 +A0 +49 +1C +21 +60 +00 +F0 +18 +F9 +20 +68 +03 +28 +F0 +DB +25 +A0 +00 +F0 +8E +F9 +28 +A0 +00 +F0 +8B +F9 +00 +F0 +97 +F8 +E7 +E7 +00 +23 +2B +4F +1A +46 +01 +21 +28 +48 +BC +46 +00 +DF +11 +4C +00 +23 +60 +60 +1A +46 +01 +21 +26 +48 +BC +46 +00 +DF +26 +4F +A0 +60 +00 +20 +BC +46 +00 +DF +80 +B5 +24 +49 +00 +20 +88 +61 +00 +F0 +66 +F8 +22 +48 +00 +F0 +6B +F9 +22 +A0 +00 +F0 +68 +F9 +FF +F7 +DC +FE +2D +4F +00 +22 +11 +46 +2B +48 +BC +46 +00 +DF +00 +20 +80 +BD +00 +00 +00 +20 +15 +0A +00 +00 +74 +61 +73 +6B +20 +31 +20 +2D +3E +00 +00 +00 +6D +0A +00 +00 +FF +FF +00 +00 +C9 +0A +00 +00 +20 +20 +74 +61 +73 +6B +20 +32 +2C +20 +25 +64 +0A +00 +00 +00 +54 +61 +73 +6B +73 +20 +72 +61 +6E +20 +33 +20 +74 +69 +6D +65 +73 +2E +00 +00 +2A +2A +20 +54 +45 +53 +54 +20 +50 +41 +53 +53 +45 +44 +20 +2A +2A +20 +0A +00 +39 +03 +00 +00 +81 +11 +00 +00 +55 +03 +00 +00 +FD +11 +00 +00 +00 +E0 +00 +E0 +A8 +12 +00 +00 +2D +20 +45 +78 +65 +63 +75 +74 +65 +20 +74 +61 +73 +6B +20 +31 +20 +2D +3E +20 +74 +61 +73 +6B +20 +32 +20 +73 +65 +71 +75 +65 +6E +63 +65 +20 +74 +68 +72 +65 +65 +20 +74 +69 +6D +65 +73 +0A +00 +00 +00 +00 +89 +03 +00 +00 +DD +0F +00 +00 +0C +48 +10 +21 +01 +61 +41 +21 +81 +60 +0B +49 +20 +20 +88 +61 +70 +47 +08 +49 +4A +68 +D2 +07 +FC +D1 +08 +60 +70 +47 +05 +48 +41 +68 +89 +07 +FC +D5 +00 +68 +C0 +B2 +70 +47 +04 +20 +FF +F7 +F0 +FF +FE +E7 +00 +60 +00 +40 +00 +10 +01 +40 +10 +B5 +C0 +B2 +FF +F7 +E7 +FF +10 +BD +10 +B5 +FF +F7 +E9 +FF +FF +F7 +E1 +FF +10 +BD +00 +20 +C0 +43 +70 +47 +10 +B5 +C0 +B2 +FF +F7 +D9 +FF +10 +BD +FE +E7 +FE +E7 +70 +47 +FE +E7 +10 +B5 +00 +F0 +D0 +FE +00 +28 +05 +D0 +60 +21 +48 +43 +17 +49 +40 +18 +60 +38 +10 +BD +16 +48 +10 +BD +10 +B5 +16 +4A +11 +68 +08 +29 +00 +D3 +FE +E7 +0C +23 +4B +43 +13 +4C +49 +1C +1B +19 +03 +60 +18 +46 +11 +60 +00 +F0 +C0 +FB +01 +20 +10 +BD +B0 +B5 +04 +46 +00 +F0 +B0 +FE +00 +28 +04 +D0 +0D +4F +0C +49 +BC +46 +20 +68 +00 +DF +B0 +BD +B0 +B5 +04 +46 +00 +F0 +A4 +FE +00 +28 +03 +D0 +08 +4F +20 +68 +BC +46 +00 +DF +B0 +BD +00 +00 +FC +17 +00 +20 +FC +1A +00 +20 +14 +00 +00 +20 +3C +1A +00 +20 +FF +FF +00 +00 +65 +0D +00 +00 +BD +0C +00 +00 +04 +49 +03 +48 +08 +60 +70 +47 +02 +49 +01 +48 +08 +60 +70 +47 +00 +E1 +F5 +05 +18 +00 +00 +20 +00 +48 +70 +47 +FC +1A +00 +20 +70 +47 +00 +00 +0F +B4 +05 +49 +10 +B5 +03 +AA +02 +98 +00 +F0 +E7 +F8 +10 +BC +08 +BC +04 +B0 +18 +47 +00 +00 +0C +00 +00 +20 +F8 +B5 +04 +46 +0E +46 +00 +20 +2D +E0 +E1 +68 +20 +46 +88 +47 +00 +28 +2A +D0 +25 +28 +02 +D0 +62 +68 +A1 +68 +20 +E0 +E1 +68 +20 +46 +00 +27 +88 +47 +05 +00 +1F +D0 +28 +46 +41 +38 +19 +28 +02 +D8 +01 +27 +FF +02 +20 +35 +32 +46 +20 +46 +27 +60 +29 +46 +FF +F7 +9E +FD +00 +28 +08 +D0 +01 +28 +04 +D0 +F6 +1D +F6 +08 +F6 +00 +08 +36 +D9 +E7 +36 +1D +D7 +E7 +62 +68 +28 +46 +A1 +68 +90 +47 +20 +6A +40 +1C +20 +62 +CF +E7 +20 +6A +F8 +BD +00 +00 +F7 +B5 +00 +26 +75 +29 +10 +68 +00 +99 +14 +A5 +11 +D0 +C0 +46 +C0 +46 +00 +28 +02 +DA +40 +42 +11 +A5 +08 +E0 +00 +99 +09 +68 +8A +07 +01 +D5 +0F +A5 +02 +E0 +49 +07 +04 +D5 +0E +A5 +01 +26 +01 +E0 +C0 +46 +C0 +46 +00 +9F +00 +24 +24 +37 +04 +E0 +00 +F0 +9B +F8 +30 +31 +39 +55 +64 +1C +00 +28 +F8 +D1 +33 +46 +2A +46 +21 +46 +00 +98 +00 +F0 +23 +F8 +FE +BD +00 +00 +00 +00 +00 +00 +2D +00 +00 +00 +2B +00 +00 +00 +20 +00 +00 +00 +10 +B5 +04 +46 +03 +E0 +FF +F7 +11 +FF +40 +1C +08 +D0 +20 +78 +05 +49 +64 +1C +00 +28 +F6 +D1 +0A +20 +FF +F7 +07 +FF +10 +BD +00 +20 +C0 +43 +10 +BD +00 +00 +0C +00 +00 +20 +70 +47 +70 +47 +70 +47 +FF +B5 +04 +46 +0D +46 +81 +B0 +24 +30 +00 +90 +21 +68 +88 +06 +04 +D5 +10 +22 +E0 +69 +91 +43 +21 +60 +00 +E0 +01 +20 +A8 +42 +01 +DD +47 +1B +00 +E0 +00 +27 +04 +98 +A1 +69 +7A +19 +10 +18 +08 +1A +A0 +61 +20 +68 +C0 +06 +02 +D4 +20 +46 +C0 +46 +C0 +46 +00 +26 +08 +E0 +03 +98 +62 +68 +A1 +68 +80 +5D +90 +47 +20 +6A +40 +1C +76 +1C +20 +62 +04 +98 +86 +42 +F3 +DB +20 +68 +C0 +06 +0A +D5 +20 +46 +C0 +46 +C0 +46 +06 +E0 +62 +68 +A1 +68 +30 +20 +90 +47 +20 +6A +40 +1C +20 +62 +38 +46 +7F +1E +00 +28 +F4 +DC +07 +E0 +00 +98 +62 +68 +A1 +68 +40 +5D +90 +47 +20 +6A +40 +1C +20 +62 +28 +46 +6D +1E +00 +28 +F3 +DC +20 +46 +C0 +46 +C0 +46 +20 +68 +00 +06 +02 +D5 +02 +20 +05 +B0 +F0 +BD +01 +20 +FB +E7 +00 +00 +08 +4B +70 +B5 +0C +46 +7B +44 +00 +F0 +27 +F8 +05 +46 +20 +46 +FF +F7 +A5 +FE +00 +28 +02 +D0 +00 +20 +C0 +43 +70 +BD +28 +46 +70 +BD +00 +00 +3F +FD +FF +FF +01 +46 +80 +08 +08 +1A +02 +09 +10 +18 +02 +0A +10 +18 +02 +0C +10 +18 +C0 +08 +82 +00 +12 +18 +52 +00 +89 +1A +01 +E0 +0A +39 +40 +1C +0A +29 +FB +D2 +70 +47 +01 +69 +4A +1C +02 +61 +08 +78 +70 +47 +00 +B5 +8F +B0 +02 +91 +00 +21 +05 +91 +05 +49 +01 +93 +79 +44 +03 +91 +11 +46 +04 +90 +68 +46 +FF +F7 +E5 +FE +0F +B0 +00 +BD +00 +00 +E5 +FF +FF +FF +75 +46 +FF +F7 +C9 +FE +AE +46 +05 +00 +69 +46 +53 +46 +C0 +08 +C0 +00 +85 +46 +18 +B0 +20 +B5 +FF +F7 +7E +FD +60 +BC +00 +27 +49 +08 +B6 +46 +00 +26 +C0 +C5 +C0 +C5 +C0 +C5 +C0 +C5 +C0 +C5 +C0 +C5 +C0 +C5 +C0 +C5 +40 +3D +49 +00 +8D +46 +70 +47 +04 +46 +C0 +46 +C0 +46 +20 +46 +FF +F7 +92 +FC +00 +00 +00 +00 +00 +00 +10 +B5 +00 +2A +06 +DA +52 +00 +52 +08 +D2 +1D +D3 +08 +DB +00 +10 +22 +03 +E0 +D2 +1C +93 +08 +9B +00 +0C +22 +00 +2B +02 +D0 +9C +18 +8C +42 +01 +D9 +01 +20 +10 +BD +82 +18 +83 +60 +41 +18 +02 +60 +41 +60 +C9 +1A +D0 +18 +88 +42 +02 +D8 +10 +60 +02 +46 +F9 +E7 +00 +20 +10 +60 +10 +BD +07 +48 +01 +68 +07 +48 +41 +61 +00 +21 +81 +61 +07 +21 +01 +61 +05 +48 +01 +6A +FF +22 +12 +06 +11 +43 +01 +62 +40 +17 +70 +47 +08 +13 +00 +00 +00 +E0 +00 +E0 +00 +ED +00 +E0 +70 +47 +01 +46 +EF +F3 +10 +80 +C2 +07 +D2 +0F +72 +B6 +08 +68 +00 +28 +01 +D0 +03 +68 +0B +60 +00 +2A +00 +D1 +62 +B6 +70 +47 +70 +B5 +0D +46 +00 +28 +0F +D0 +08 +49 +09 +4C +88 +42 +04 +D2 +22 +68 +01 +46 +10 +46 +00 +F0 +A3 +FA +20 +68 +45 +70 +05 +48 +00 +F0 +15 +F9 +00 +F0 +62 +FB +70 +BD +00 +00 +FF +FF +00 +00 +1C +00 +00 +20 +CC +1A +00 +20 +10 +B5 +0E +48 +0C +49 +42 +68 +0D +48 +0B +68 +00 +68 +93 +42 +04 +D0 +0A +60 +CB +88 +42 +1E +9A +18 +8A +80 +8A +88 +80 +B2 +82 +42 +08 +D1 +00 +20 +08 +60 +04 +48 +00 +F0 +F4 +F8 +01 +46 +02 +48 +00 +F0 +A1 +FA +10 +BD +30 +00 +00 +20 +CC +1A +00 +20 +24 +00 +00 +20 +70 +B5 +1B +4D +E8 +68 +00 +28 +31 +D0 +A8 +8A +40 +1E +A8 +82 +00 +26 +26 +E0 +A0 +68 +00 +28 +08 +D0 +61 +68 +41 +60 +60 +68 +00 +28 +02 +D0 +A1 +68 +81 +60 +66 +60 +A6 +60 +10 +48 +21 +46 +18 +38 +00 +F0 +7F +FA +A0 +8A +A8 +82 +60 +78 +04 +28 +04 +D1 +0C +49 +E0 +8A +09 +68 +40 +18 +A0 +82 +01 +20 +60 +70 +20 +21 +08 +55 +E0 +68 +E8 +60 +E0 +68 +00 +28 +01 +D0 +05 +61 +E6 +60 +26 +61 +A8 +8A +00 +28 +02 +D1 +EC +68 +00 +2C +D2 +D1 +70 +BD +E4 +1A +00 +20 +24 +00 +00 +20 +70 +B5 +04 +00 +0E +D0 +0C +4D +A1 +78 +28 +68 +01 +26 +82 +78 +91 +42 +0B +D9 +00 +F0 +70 +FA +28 +68 +46 +70 +20 +46 +00 +F0 +EB +FA +70 +BD +05 +48 +00 +F0 +98 +F8 +F8 +E7 +66 +70 +21 +46 +02 +48 +00 +F0 +43 +FA +70 +BD +1C +00 +00 +20 +CC +1A +00 +20 +10 +B5 +03 +21 +FF +F7 +62 +FF +10 +BD +00 +00 +10 +B5 +04 +46 +00 +8B +08 +43 +20 +83 +62 +78 +61 +8B +06 +2A +15 +D0 +05 +2A +12 +D1 +0A +46 +10 +42 +0F +D0 +02 +40 +62 +83 +88 +43 +20 +83 +20 +46 +00 +F0 +63 +FA +01 +20 +60 +70 +02 +21 +20 +20 +01 +55 +21 +46 +04 +48 +00 +F0 +1A +FA +10 +BD +0A +46 +82 +43 +ED +D0 +10 +BD +00 +00 +CC +1A +00 +20 +02 +46 +88 +00 +70 +B5 +14 +49 +40 +18 +40 +38 +C4 +6B +00 +2C +1D +D0 +20 +8B +10 +43 +20 +83 +61 +78 +65 +8B +06 +29 +17 +D0 +05 +29 +14 +D1 +29 +46 +08 +42 +11 +D0 +01 +40 +61 +83 +A8 +43 +20 +83 +20 +46 +00 +F0 +36 +FA +20 +8B +02 +21 +A8 +43 +20 +83 +01 +20 +60 +70 +20 +20 +01 +55 +20 +46 +FF +F7 +8D +FF +70 +BD +29 +46 +81 +43 +EB +D0 +70 +BD +E4 +17 +00 +20 +70 +B5 +03 +46 +0D +48 +0D +46 +04 +68 +00 +2A +20 +8B +08 +D0 +19 +46 +81 +43 +01 +D0 +06 +20 +09 +E0 +98 +43 +20 +83 +02 +20 +70 +BD +02 +46 +1A +40 +01 +D0 +62 +83 +F6 +E7 +05 +20 +C1 +B2 +63 +83 +28 +46 +FF +F7 +F0 +FE +01 +20 +70 +BD +1C +00 +00 +20 +81 +42 +02 +D3 +42 +68 +8A +42 +01 +D8 +01 +20 +70 +47 +EF +F3 +10 +82 +D2 +07 +D2 +0F +72 +B6 +03 +68 +0B +60 +01 +60 +00 +D1 +62 +B6 +00 +20 +70 +47 +01 +46 +40 +68 +42 +68 +4A +60 +0B +78 +00 +22 +02 +2B +05 +D0 +01 +2B +03 +D0 +03 +2B +01 +D0 +42 +60 +70 +47 +43 +68 +00 +2B +01 +D0 +99 +60 +42 +60 +82 +60 +70 +47 +70 +B5 +04 +46 +15 +46 +00 +20 +20 +70 +01 +22 +62 +70 +A1 +70 +60 +60 +A0 +60 +E0 +60 +20 +61 +A0 +82 +E0 +82 +20 +83 +23 +46 +60 +83 +20 +33 +18 +70 +58 +70 +60 +8C +00 +28 +03 +D1 +04 +48 +FF +F7 +9B +FE +A0 +62 +29 +46 +20 +46 +00 +F0 +0F +F8 +70 +BD +70 +01 +00 +20 +03 +48 +00 +21 +01 +60 +03 +49 +09 +68 +C1 +80 +70 +47 +00 +00 +30 +00 +00 +20 +04 +13 +00 +00 +30 +B5 +42 +8C +92 +08 +03 +D1 +0E +4A +12 +68 +12 +04 +92 +0C +83 +6A +92 +00 +9A +18 +53 +07 +00 +D5 +12 +1F +40 +3A +01 +23 +1B +06 +D3 +63 +00 +23 +91 +63 +1C +46 +9D +00 +5B +1C +54 +51 +0E +2B +FA +D3 +C3 +69 +13 +62 +42 +62 +C1 +62 +80 +6A +02 +49 +01 +60 +30 +BD +00 +13 +00 +00 +A5 +2E +5A +E2 +F8 +B5 +04 +46 +40 +68 +00 +26 +0F +46 +00 +28 +05 +D0 +60 +78 +02 +28 +18 +D0 +A0 +89 +00 +28 +2F +D0 +A0 +89 +E1 +89 +88 +42 +3E +D2 +20 +89 +80 +00 +00 +19 +07 +61 +72 +B6 +A0 +89 +40 +1C +A0 +81 +62 +B6 +20 +89 +40 +1C +80 +B2 +20 +81 +E1 +89 +88 +42 +00 +D1 +26 +81 +F8 +BD +66 +70 +20 +46 +FF +F7 +70 +FF +05 +46 +20 +30 +06 +70 +21 +89 +E8 +69 +89 +00 +09 +19 +08 +61 +72 +B6 +A0 +89 +40 +1C +A0 +81 +62 +B6 +20 +89 +40 +1C +80 +B2 +20 +81 +E1 +89 +88 +42 +0A +D1 +26 +81 +08 +E0 +20 +46 +FF +F7 +57 +FF +05 +46 +C0 +69 +04 +21 +07 +60 +20 +20 +41 +55 +01 +20 +68 +70 +28 +46 +00 +F0 +3D +F9 +29 +46 +03 +48 +00 +F0 +F9 +F8 +F8 +BD +03 +20 +FF +F7 +25 +FC +F8 +BD +CC +1A +00 +20 +03 +21 +01 +70 +00 +21 +41 +70 +41 +80 +41 +60 +81 +60 +70 +47 +F8 +B5 +05 +46 +40 +88 +00 +28 +04 +D0 +25 +4C +A9 +68 +22 +68 +91 +42 +01 +D0 +FF +20 +F8 +BD +40 +1E +00 +04 +00 +0C +68 +80 +3B +D1 +21 +68 +68 +78 +88 +70 +6A +68 +01 +27 +00 +2A +28 +D0 +28 +46 +FF +F7 +1E +FF +06 +46 +05 +21 +20 +30 +01 +70 +30 +46 +00 +F0 +08 +F9 +6F +80 +AE +60 +B0 +78 +68 +70 +15 +48 +21 +68 +40 +68 +8A +78 +80 +78 +82 +42 +01 +D3 +30 +46 +0A +E0 +11 +48 +00 +F0 +B8 +F8 +31 +46 +0F +48 +00 +F0 +B4 +F8 +20 +68 +47 +70 +77 +70 +10 +E0 +FF +F7 +50 +FE +21 +68 +00 +20 +20 +31 +08 +70 +0B +E0 +08 +4A +52 +68 +92 +78 +82 +42 +06 +D9 +05 +48 +00 +F0 +A1 +F8 +20 +68 +47 +70 +00 +20 +EC +E7 +00 +20 +F8 +BD +00 +00 +1C +00 +00 +20 +CC +1A +00 +20 +70 +B5 +0E +46 +18 +4D +04 +46 +41 +88 +28 +68 +00 +29 +07 +D0 +A1 +68 +81 +42 +08 +D1 +60 +88 +40 +1C +60 +80 +00 +20 +70 +BD +A0 +60 +80 +78 +60 +70 +F6 +E7 +00 +2E +0F +D0 +62 +78 +80 +78 +82 +42 +03 +D2 +88 +70 +A0 +68 +00 +F0 +A0 +F8 +60 +68 +00 +28 +06 +D0 +20 +46 +29 +68 +00 +F0 +71 +F8 +07 +E0 +01 +20 +70 +BD +28 +68 +60 +60 +28 +68 +00 +21 +84 +60 +41 +60 +09 +21 +30 +46 +FF +F7 +8C +FD +F2 +E7 +00 +00 +1C +00 +00 +20 +70 +B5 +18 +48 +01 +21 +00 +68 +41 +70 +00 +F0 +77 +F8 +16 +4C +65 +78 +13 +E0 +E8 +00 +01 +19 +48 +68 +02 +78 +00 +2A +17 +D0 +01 +2A +1A +D0 +00 +F0 +BC +F8 +E0 +78 +6D +1C +85 +42 +00 +D1 +00 +25 +72 +B6 +A0 +78 +40 +1E +A0 +70 +62 +B6 +A0 +78 +00 +28 +E8 +D1 +65 +70 +09 +48 +FF +F7 +8A +FE +00 +F0 +D7 +F8 +70 +BD +89 +68 +89 +B2 +FF +F7 +FC +FD +E6 +E7 +89 +68 +FF +F7 +E8 +FE +E2 +E7 +00 +00 +1C +00 +00 +20 +60 +17 +00 +20 +CC +1A +00 +20 +10 +B5 +12 +4A +D3 +68 +00 +2B +17 +D0 +13 +46 +9B +8A +04 +E0 +00 +2C +12 +D0 +22 +46 +A4 +8A +E3 +18 +D4 +68 +8B +42 +F7 +D3 +C4 +60 +D0 +60 +02 +61 +C4 +68 +00 +2C +00 +D0 +20 +61 +59 +1A +81 +82 +90 +8A +40 +1A +90 +82 +10 +BD +00 +24 +C4 +60 +D0 +60 +C9 +1A +02 +61 +91 +82 +84 +82 +10 +BD +00 +00 +E4 +1A +00 +20 +30 +B5 +02 +78 +00 +23 +02 +2A +03 +D0 +01 +2A +01 +D0 +03 +2A +00 +D1 +01 +23 +8C +78 +00 +E0 +10 +46 +42 +68 +00 +2A +02 +D0 +95 +78 +A5 +42 +F8 +D2 +4A +60 +41 +60 +00 +2B +04 +D0 +00 +2A +00 +D0 +91 +60 +88 +60 +30 +BD +00 +20 +FB +E7 +03 +49 +4A +68 +42 +60 +00 +22 +82 +60 +48 +60 +70 +47 +00 +00 +CC +1A +00 +20 +10 +B5 +83 +68 +04 +46 +00 +2B +05 +D1 +60 +78 +01 +28 +0C +D1 +06 +4B +03 +E0 +9B +68 +18 +78 +00 +28 +FB +D0 +20 +46 +00 +F0 +1D +F8 +21 +46 +18 +46 +FF +F7 +C3 +FF +10 +BD +CC +1A +00 +20 +10 +B5 +01 +69 +00 +29 +0F +D0 +C2 +68 +CA +60 +C3 +68 +00 +22 +00 +2B +07 +D0 +8B +8A +84 +8A +1B +19 +8B +82 +C3 +68 +19 +61 +C2 +60 +00 +E0 +8A +82 +02 +61 +10 +BD +00 +00 +81 +68 +00 +29 +07 +D0 +42 +68 +4A +60 +41 +68 +00 +29 +01 +D0 +80 +68 +88 +60 +70 +47 +06 +49 +06 +E0 +4A +68 +82 +42 +02 +D1 +40 +68 +48 +60 +70 +47 +11 +46 +00 +29 +F6 +D1 +70 +47 +00 +00 +CC +1A +00 +20 +10 +B5 +41 +68 +00 +29 +0E +D0 +FF +F7 +D9 +FD +04 +46 +FF +F7 +C7 +FF +01 +20 +60 +70 +03 +21 +20 +20 +01 +55 +21 +46 +04 +48 +FF +F7 +7E +FF +10 +BD +41 +88 +49 +1C +41 +80 +10 +BD +00 +00 +CC +1A +00 +20 +10 +B5 +07 +48 +00 +68 +41 +6A +80 +6A +81 +42 +03 +D3 +00 +68 +04 +49 +88 +42 +02 +D0 +01 +20 +FF +F7 +98 +FA +10 +BD +00 +00 +1C +00 +00 +20 +A5 +2E +5A +E2 +02 +49 +48 +60 +02 +21 +41 +70 +70 +47 +00 +00 +1C +00 +00 +20 +F7 +B5 +06 +46 +00 +20 +04 +46 +33 +4A +34 +49 +02 +E0 +83 +00 +D4 +50 +40 +1C +0B +88 +98 +42 +F9 +D3 +31 +48 +30 +22 +01 +88 +30 +48 +FF +F7 +25 +FC +30 +48 +01 +21 +00 +68 +C9 +07 +80 +B2 +42 +18 +2E +48 +01 +68 +2E +48 +FF +F7 +1A +FC +2D +48 +08 +22 +01 +88 +2D +48 +00 +68 +FF +F7 +13 +FC +2C +4F +FF +25 +FD +70 +7C +84 +2B +4A +00 +21 +38 +46 +FF +F7 +90 +FD +29 +48 +04 +21 +01 +70 +44 +60 +28 +48 +01 +70 +C4 +60 +04 +61 +84 +82 +78 +6A +20 +30 +FF +F7 +93 +F8 +25 +48 +26 +49 +07 +60 +02 +20 +78 +70 +23 +48 +04 +70 +44 +70 +09 +78 +C1 +70 +FF +F7 +99 +FD +22 +48 +01 +6A +2A +04 +11 +43 +01 +62 +C1 +69 +02 +6A +52 +02 +92 +0E +92 +06 +11 +43 +C1 +61 +FF +F7 +07 +FC +1C +49 +00 +28 +08 +60 +0B +DB +1B +49 +41 +18 +0D +70 +C2 +06 +D2 +0E +01 +21 +91 +40 +40 +11 +18 +4A +80 +00 +80 +18 +01 +60 +00 +23 +30 +46 +02 +9A +01 +99 +00 +F0 +67 +F8 +FE +BD +E4 +17 +00 +20 +FE +12 +00 +00 +18 +13 +00 +00 +40 +00 +00 +20 +00 +13 +00 +00 +1C +13 +00 +00 +70 +01 +00 +20 +22 +13 +00 +00 +10 +00 +00 +20 +9C +1A +00 +20 +ED +04 +00 +00 +CC +1A +00 +20 +E4 +1A +00 +20 +1C +00 +00 +20 +60 +17 +00 +20 +20 +13 +00 +00 +00 +ED +00 +E0 +2C +00 +00 +20 +00 +E4 +00 +E0 +00 +E1 +00 +E0 +10 +B5 +0B +48 +01 +21 +00 +68 +41 +70 +FF +F7 +DD +FE +FF +F7 +01 +FC +08 +48 +01 +68 +49 +1C +01 +60 +FF +F7 +1D +FC +00 +F0 +0D +F8 +05 +48 +FF +F7 +01 +FD +FF +F7 +4E +FF +10 +BD +00 +00 +1C +00 +00 +20 +24 +00 +00 +20 +CC +1A +00 +20 +70 +B5 +0D +4C +20 +68 +00 +28 +15 +D0 +A0 +88 +0B +4E +40 +1E +A0 +80 +0A +E0 +E8 +88 +FF +F7 +CA +F9 +A8 +88 +A0 +80 +28 +68 +20 +60 +29 +46 +30 +68 +FF +F7 +CF +FC +A0 +88 +00 +28 +02 +D1 +25 +68 +00 +2D +EE +D1 +70 +BD +38 +00 +00 +20 +10 +00 +00 +20 +FF +B5 +08 +06 +81 +B0 +0C +46 +16 +46 +1F +46 +00 +0E +00 +D1 +4C +1C +16 +48 +FF +F7 +95 +FB +05 +00 +25 +D0 +20 +02 +00 +0C +AE +62 +68 +84 +EF +61 +E1 +B2 +28 +46 +01 +9A +FF +F7 +D4 +FC +01 +24 +0F +48 +0F +49 +06 +E0 +A2 +00 +12 +18 +40 +3A +D2 +6B +00 +2A +04 +D0 +64 +1C +0A +88 +94 +42 +F5 +D9 +00 +24 +A1 +00 +08 +18 +40 +38 +C5 +63 +EC +70 +28 +46 +FF +F7 +FB +FB +06 +48 +00 +68 +20 +30 +04 +70 +20 +46 +05 +B0 +F0 +BD +40 +00 +00 +20 +E4 +17 +00 +20 +FE +12 +00 +00 +1C +00 +00 +20 +70 +B5 +21 +4C +00 +25 +21 +4E +21 +68 +00 +28 +02 +D0 +CA +78 +82 +42 +1A +D1 +4D +70 +FE +F7 +B4 +FF +21 +68 +48 +62 +FF +F7 +C3 +FE +20 +68 +C1 +78 +89 +00 +89 +19 +40 +39 +CD +63 +81 +6A +17 +48 +FF +F7 +6B +FC +21 +68 +16 +48 +8D +62 +FF +F7 +66 +FC +00 +20 +25 +60 +FF +F7 +C8 +FB +19 +E0 +13 +49 +09 +88 +88 +42 +17 +D8 +80 +00 +86 +19 +40 +3E +F4 +6B +00 +2C +11 +D0 +20 +46 +FF +F7 +6E +FE +20 +46 +FF +F7 +55 +FE +F5 +63 +08 +48 +A1 +6A +FF +F7 +4C +FC +21 +46 +07 +48 +A5 +62 +FF +F7 +47 +FC +00 +20 +70 +BD +FF +20 +70 +BD +00 +00 +1C +00 +00 +20 +E4 +17 +00 +20 +70 +01 +00 +20 +40 +00 +00 +20 +FE +12 +00 +00 +02 +48 +00 +68 +00 +28 +00 +D0 +C0 +78 +70 +47 +1C +00 +00 +20 +0A +43 +6F +72 +74 +65 +78 +20 +4D +69 +63 +72 +6F +63 +6F +6E +74 +72 +6F +6C +6C +65 +72 +20 +53 +79 +73 +74 +65 +6D +20 +44 +65 +73 +69 +67 +6E +20 +4B +69 +74 +20 +2D +20 +52 +54 +58 +20 +44 +65 +6D +6F +20 +2D +20 +72 +65 +76 +69 +73 +69 +6F +6E +20 +24 +52 +65 +76 +69 +73 +69 +6F +6E +3A +20 +32 +31 +34 +35 +35 +37 +20 +24 +0A +00 +00 +06 +00 +20 +03 +00 +01 +05 +00 +01 +00 +0F +27 +00 +00 +00 +00 +00 +00 +C8 +00 +00 +00 +00 +00 +00 +00 +2C +01 +00 +00 +F0 +15 +00 +00 +10 +00 +00 +00 +44 +13 +00 +00 +00 +00 +00 +20 +40 +00 +00 +00 +04 +01 +00 +00 +84 +13 +00 +00 +40 +00 +00 +20 +20 +1E +00 +00 +20 +01 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +E1 +F5 +05 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 diff --git a/Cortex-M0/nanosoc/systems/mcu/testcodes/rtx_demo/rtx_demo_cm0p.uvopt b/Cortex-M0/nanosoc/systems/mcu/testcodes/rtx_demo/rtx_demo_cm0p.uvopt new file mode 100644 index 0000000..a123b28 --- /dev/null +++ b/Cortex-M0/nanosoc/systems/mcu/testcodes/rtx_demo/rtx_demo_cm0p.uvopt @@ -0,0 +1,258 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no" ?> +<ProjectOpt xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="project_opt.xsd"> + + <SchemaVersion>1.0</SchemaVersion> + + <Header>### uVision Project, (C) Keil Software</Header> + + <Extensions> + <cExt>*.c</cExt> + <aExt>*.s*; *.src; *.a*</aExt> + <oExt>*.obj</oExt> + <lExt>*.lib</lExt> + <tExt>*.txt; *.h; *.inc</tExt> + <pExt>*.plm</pExt> + <CppX>*.cpp</CppX> + </Extensions> + + <DaveTm> + <dwLowDateTime>0</dwLowDateTime> + <dwHighDateTime>0</dwHighDateTime> + </DaveTm> + + <Target> + <TargetName>Debug</TargetName> + <ToolsetNumber>0x4</ToolsetNumber> + <ToolsetName>ARM-ADS</ToolsetName> + <TargetOption> + <CLKADS>50000000</CLKADS> + <OPTTT> + <gFlags>1</gFlags> + <BeepAtEnd>1</BeepAtEnd> + <RunSim>1</RunSim> + <RunTarget>0</RunTarget> + </OPTTT> + <OPTHX> + <HexSelection>1</HexSelection> + <FlashByte>65535</FlashByte> + <HexRangeLowAddress>0</HexRangeLowAddress> + <HexRangeHighAddress>0</HexRangeHighAddress> + <HexOffset>0</HexOffset> + </OPTHX> + <OPTLEX> + <PageWidth>79</PageWidth> + <PageLength>66</PageLength> + <TabStop>8</TabStop> + <ListingPath>.\</ListingPath> + </OPTLEX> + <ListingPage> + <CreateCListing>1</CreateCListing> + <CreateAListing>1</CreateAListing> + <CreateLListing>1</CreateLListing> + <CreateIListing>0</CreateIListing> + <AsmCond>1</AsmCond> + <AsmSymb>1</AsmSymb> + <AsmXref>0</AsmXref> + <CCond>1</CCond> + <CCode>0</CCode> + <CListInc>0</CListInc> + <CSymb>0</CSymb> + <LinkerCodeListing>0</LinkerCodeListing> + </ListingPage> + <OPTXL> + <LMap>1</LMap> + <LComments>1</LComments> + <LGenerateSymbols>1</LGenerateSymbols> + <LLibSym>1</LLibSym> + <LLines>1</LLines> + <LLocSym>1</LLocSym> + <LPubSym>1</LPubSym> + <LXref>0</LXref> + <LExpSel>0</LExpSel> + </OPTXL> + <OPTFL> + <tvExp>1</tvExp> + <tvExpOptDlg>0</tvExpOptDlg> + <IsCurrentTarget>1</IsCurrentTarget> + </OPTFL> + <CpuCode>255</CpuCode> + <DllOpt> + <SimDllName>SARMCM3.DLL</SimDllName> + <SimDllArguments></SimDllArguments> + <SimDlgDllName>DARMCM1.DLL</SimDlgDllName> + <SimDlgDllArguments></SimDlgDllArguments> + <TargetDllName>SARMCM3.DLL</TargetDllName> + <TargetDllArguments></TargetDllArguments> + <TargetDlgDllName>TARMCM1.DLL</TargetDlgDllName> + <TargetDlgDllArguments></TargetDlgDllArguments> + </DllOpt> + <DebugOpt> + <uSim>1</uSim> + <uTrg>0</uTrg> + <sLdApp>1</sLdApp> + <sGomain>1</sGomain> + <sRbreak>1</sRbreak> + <sRwatch>1</sRwatch> + <sRmem>1</sRmem> + <sRfunc>1</sRfunc> + <sRbox>1</sRbox> + <tLdApp>1</tLdApp> + <tGomain>0</tGomain> + <tRbreak>1</tRbreak> + <tRwatch>1</tRwatch> + <tRmem>1</tRmem> + <tRfunc>0</tRfunc> + <tRbox>1</tRbox> + <sRunDeb>0</sRunDeb> + <sLrtime>0</sLrtime> + <nTsel>-1</nTsel> + <sDll></sDll> + <sDllPa></sDllPa> + <sDlgDll></sDlgDll> + <sDlgPa></sDlgPa> + <sIfile></sIfile> + <tDll></tDll> + <tDllPa></tDllPa> + <tDlgDll></tDlgDll> + <tDlgPa></tDlgPa> + <tIfile></tIfile> + <pMon></pMon> + </DebugOpt> + <Breakpoint/> + <DebugFlag> + <trace>0</trace> + <periodic>1</periodic> + <aLwin>0</aLwin> + <aCover>0</aCover> + <aSer1>0</aSer1> + <aSer2>0</aSer2> + <aPa>0</aPa> + <viewmode>0</viewmode> + <vrSel>0</vrSel> + <aSym>0</aSym> + <aTbox>0</aTbox> + <AscS1>0</AscS1> + <AscS2>0</AscS2> + <AscS3>0</AscS3> + <aSer3>0</aSer3> + <eProf>0</eProf> + <aLa>0</aLa> + <aPa1>0</aPa1> + <AscS4>0</AscS4> + <aSer4>0</aSer4> + <StkLoc>0</StkLoc> + <TrcWin>0</TrcWin> + <newCpu>0</newCpu> + <uProt>0</uProt> + </DebugFlag> + <LintExecutable></LintExecutable> + <LintConfigFile></LintConfigFile> + </TargetOption> + </Target> + + <Group> + <GroupName>Startup</GroupName> + <tvExp>1</tvExp> + <tvExpOptDlg>0</tvExpOptDlg> + <cbSel>0</cbSel> + <File> + <GroupNumber>1</GroupNumber> + <FileNumber>1</FileNumber> + <FileType>2</FileType> + <tvExp>0</tvExp> + <Focus>0</Focus> + <ColumnNumber>0</ColumnNumber> + <tvExpOptDlg>0</tvExpOptDlg> + <TopLine>0</TopLine> + <CurrentLine>0</CurrentLine> + <bDave2>0</bDave2> + <PathWithFileName>..\..\..\..\software\cmsis\Device\ARM\CMSDK_CM0plus\Source\ARM\startup_CMSDK_CM0plus.s</PathWithFileName> + <FilenameWithoutPath>startup_CMSDK_CM0plus.s</FilenameWithoutPath> + </File> + </Group> + + <Group> + <GroupName>Application</GroupName> + <tvExp>1</tvExp> + <tvExpOptDlg>0</tvExpOptDlg> + <cbSel>0</cbSel> + <File> + <GroupNumber>2</GroupNumber> + <FileNumber>2</FileNumber> + <FileType>1</FileType> + <tvExp>0</tvExp> + <Focus>0</Focus> + <ColumnNumber>26</ColumnNumber> + <tvExpOptDlg>0</tvExpOptDlg> + <TopLine>30</TopLine> + <CurrentLine>51</CurrentLine> + <bDave2>0</bDave2> + <PathWithFileName>.\rtx_demo.c</PathWithFileName> + <FilenameWithoutPath>rtx_demo.c</FilenameWithoutPath> + </File> + <File> + <GroupNumber>2</GroupNumber> + <FileNumber>3</FileNumber> + <FileType>1</FileType> + <tvExp>0</tvExp> + <Focus>0</Focus> + <ColumnNumber>0</ColumnNumber> + <tvExpOptDlg>0</tvExpOptDlg> + <TopLine>0</TopLine> + <CurrentLine>0</CurrentLine> + <bDave2>0</bDave2> + <PathWithFileName>..\..\..\..\software\common\retarget\uart_stdout.c</PathWithFileName> + <FilenameWithoutPath>uart_stdout.c</FilenameWithoutPath> + </File> + <File> + <GroupNumber>2</GroupNumber> + <FileNumber>4</FileNumber> + <FileType>1</FileType> + <tvExp>0</tvExp> + <Focus>0</Focus> + <ColumnNumber>0</ColumnNumber> + <tvExpOptDlg>0</tvExpOptDlg> + <TopLine>0</TopLine> + <CurrentLine>0</CurrentLine> + <bDave2>0</bDave2> + <PathWithFileName>..\..\..\..\software\common\retarget\retarget.c</PathWithFileName> + <FilenameWithoutPath>retarget.c</FilenameWithoutPath> + </File> + </Group> + + <Group> + <GroupName>System</GroupName> + <tvExp>1</tvExp> + <tvExpOptDlg>0</tvExpOptDlg> + <cbSel>0</cbSel> + <File> + <GroupNumber>3</GroupNumber> + <FileNumber>5</FileNumber> + <FileType>1</FileType> + <tvExp>0</tvExp> + <Focus>0</Focus> + <ColumnNumber>0</ColumnNumber> + <tvExpOptDlg>0</tvExpOptDlg> + <TopLine>0</TopLine> + <CurrentLine>0</CurrentLine> + <bDave2>0</bDave2> + <PathWithFileName>.\RTX_Config.c</PathWithFileName> + <FilenameWithoutPath>RTX_Config.c</FilenameWithoutPath> + </File> + <File> + <GroupNumber>3</GroupNumber> + <FileNumber>6</FileNumber> + <FileType>1</FileType> + <tvExp>0</tvExp> + <Focus>0</Focus> + <ColumnNumber>0</ColumnNumber> + <tvExpOptDlg>0</tvExpOptDlg> + <TopLine>0</TopLine> + <CurrentLine>0</CurrentLine> + <bDave2>0</bDave2> + <PathWithFileName>..\..\..\..\software\cmsis\Device\ARM\CMSDK_CM0plus\Source\system_CMSDK_CM0plus.c</PathWithFileName> + <FilenameWithoutPath>system_CMSDK_CM0plus.c</FilenameWithoutPath> + </File> + </Group> + +</ProjectOpt> diff --git a/Cortex-M0/nanosoc/systems/mcu/testcodes/rtx_demo/rtx_demo_cm0p.uvproj b/Cortex-M0/nanosoc/systems/mcu/testcodes/rtx_demo/rtx_demo_cm0p.uvproj new file mode 100644 index 0000000..2093cad --- /dev/null +++ b/Cortex-M0/nanosoc/systems/mcu/testcodes/rtx_demo/rtx_demo_cm0p.uvproj @@ -0,0 +1,437 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no" ?> +<Project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="project_proj.xsd"> + + <SchemaVersion>1.1</SchemaVersion> + + <Header>### uVision Project, (C) Keil Software</Header> + + <Targets> + <Target> + <TargetName>Debug</TargetName> + <ToolsetNumber>0x4</ToolsetNumber> + <ToolsetName>ARM-ADS</ToolsetName> + <TargetOption> + <TargetCommonOption> + <Device>Cortex-M0+</Device> + <Vendor>ARM</Vendor> + <Cpu>CLOCK(12000000) CPUTYPE("Cortex-M0+") ESEL ELITTLE</Cpu> + <FlashUtilSpec></FlashUtilSpec> + <StartupFile></StartupFile> + <FlashDriverDll></FlashDriverDll> + <DeviceId>6268</DeviceId> + <RegisterFile></RegisterFile> + <MemoryEnv></MemoryEnv> + <Cmp></Cmp> + <Asm></Asm> + <Linker></Linker> + <OHString></OHString> + <InfinionOptionDll></InfinionOptionDll> + <SLE66CMisc></SLE66CMisc> + <SLE66AMisc></SLE66AMisc> + <SLE66LinkerMisc></SLE66LinkerMisc> + <SFDFile></SFDFile> + <UseEnv>0</UseEnv> + <BinPath></BinPath> + <IncludePath></IncludePath> + <LibPath></LibPath> + <RegisterFilePath></RegisterFilePath> + <DBRegisterFilePath></DBRegisterFilePath> + <TargetStatus> + <Error>0</Error> + <ExitCodeStop>0</ExitCodeStop> + <ButtonStop>0</ButtonStop> + <NotGenerated>0</NotGenerated> + <InvalidFlash>1</InvalidFlash> + </TargetStatus> + <OutputDirectory>.\</OutputDirectory> + <OutputName>rtx_demo</OutputName> + <CreateExecutable>1</CreateExecutable> + <CreateLib>0</CreateLib> + <CreateHexFile>0</CreateHexFile> + <DebugInformation>1</DebugInformation> + <BrowseInformation>1</BrowseInformation> + <ListingPath>.\</ListingPath> + <HexFormatSelection>1</HexFormatSelection> + <Merge32K>0</Merge32K> + <CreateBatchFile>0</CreateBatchFile> + <BeforeCompile> + <RunUserProg1>0</RunUserProg1> + <RunUserProg2>0</RunUserProg2> + <UserProg1Name></UserProg1Name> + <UserProg2Name></UserProg2Name> + <UserProg1Dos16Mode>0</UserProg1Dos16Mode> + <UserProg2Dos16Mode>0</UserProg2Dos16Mode> + <nStopU1X>0</nStopU1X> + <nStopU2X>0</nStopU2X> + </BeforeCompile> + <BeforeMake> + <RunUserProg1>0</RunUserProg1> + <RunUserProg2>0</RunUserProg2> + <UserProg1Name></UserProg1Name> + <UserProg2Name></UserProg2Name> + <UserProg1Dos16Mode>0</UserProg1Dos16Mode> + <UserProg2Dos16Mode>0</UserProg2Dos16Mode> + </BeforeMake> + <AfterMake> + <RunUserProg1>1</RunUserProg1> + <RunUserProg2>0</RunUserProg2> + <UserProg1Name>$K\ARM\ARMCC\BIN\fromelf.exe #L --vhx --8x1 --output rtx_demo_cm0p.hex</UserProg1Name> + <UserProg2Name></UserProg2Name> + <UserProg1Dos16Mode>0</UserProg1Dos16Mode> + <UserProg2Dos16Mode>0</UserProg2Dos16Mode> + </AfterMake> + <SelectedForBatchBuild>0</SelectedForBatchBuild> + <SVCSIdString></SVCSIdString> + </TargetCommonOption> + <CommonProperty> + <UseCPPCompiler>0</UseCPPCompiler> + <RVCTCodeConst>0</RVCTCodeConst> + <RVCTZI>0</RVCTZI> + <RVCTOtherData>0</RVCTOtherData> + <ModuleSelection>0</ModuleSelection> + <IncludeInBuild>1</IncludeInBuild> + <AlwaysBuild>0</AlwaysBuild> + <GenerateAssemblyFile>0</GenerateAssemblyFile> + <AssembleAssemblyFile>0</AssembleAssemblyFile> + <PublicsOnly>0</PublicsOnly> + <StopOnExitCode>3</StopOnExitCode> + <CustomArgument></CustomArgument> + <IncludeLibraryModules></IncludeLibraryModules> + </CommonProperty> + <DllOption> + <SimDllName>SARMCM3.DLL</SimDllName> + <SimDllArguments></SimDllArguments> + <SimDlgDll>DARMCM1.DLL</SimDlgDll> + <SimDlgDllArguments></SimDlgDllArguments> + <TargetDllName>SARMCM3.DLL</TargetDllName> + <TargetDllArguments></TargetDllArguments> + <TargetDlgDll>TARMCM1.DLL</TargetDlgDll> + <TargetDlgDllArguments></TargetDlgDllArguments> + </DllOption> + <DebugOption> + <OPTHX> + <HexSelection>1</HexSelection> + <HexRangeLowAddress>0</HexRangeLowAddress> + <HexRangeHighAddress>0</HexRangeHighAddress> + <HexOffset>0</HexOffset> + <Oh166RecLen>16</Oh166RecLen> + </OPTHX> + <Simulator> + <UseSimulator>1</UseSimulator> + <LoadApplicationAtStartup>1</LoadApplicationAtStartup> + <RunToMain>1</RunToMain> + <RestoreBreakpoints>1</RestoreBreakpoints> + <RestoreWatchpoints>1</RestoreWatchpoints> + <RestoreMemoryDisplay>1</RestoreMemoryDisplay> + <RestoreFunctions>1</RestoreFunctions> + <RestoreToolbox>1</RestoreToolbox> + <LimitSpeedToRealTime>0</LimitSpeedToRealTime> + </Simulator> + <Target> + <UseTarget>0</UseTarget> + <LoadApplicationAtStartup>1</LoadApplicationAtStartup> + <RunToMain>0</RunToMain> + <RestoreBreakpoints>1</RestoreBreakpoints> + <RestoreWatchpoints>1</RestoreWatchpoints> + <RestoreMemoryDisplay>1</RestoreMemoryDisplay> + <RestoreFunctions>0</RestoreFunctions> + <RestoreToolbox>1</RestoreToolbox> + </Target> + <RunDebugAfterBuild>0</RunDebugAfterBuild> + <TargetSelection>-1</TargetSelection> + <SimDlls> + <CpuDll></CpuDll> + <CpuDllArguments></CpuDllArguments> + <PeripheralDll></PeripheralDll> + <PeripheralDllArguments></PeripheralDllArguments> + <InitializationFile></InitializationFile> + </SimDlls> + <TargetDlls> + <CpuDll></CpuDll> + <CpuDllArguments></CpuDllArguments> + <PeripheralDll></PeripheralDll> + <PeripheralDllArguments></PeripheralDllArguments> + <InitializationFile></InitializationFile> + <Driver></Driver> + </TargetDlls> + </DebugOption> + <Utilities> + <Flash1> + <UseTargetDll>0</UseTargetDll> + <UseExternalTool>0</UseExternalTool> + <RunIndependent>0</RunIndependent> + <UpdateFlashBeforeDebugging>0</UpdateFlashBeforeDebugging> + <Capability>0</Capability> + <DriverSelection>-1</DriverSelection> + </Flash1> + <Flash2></Flash2> + <Flash3></Flash3> + <Flash4></Flash4> + </Utilities> + <TargetArmAds> + <ArmAdsMisc> + <GenerateListings>0</GenerateListings> + <asHll>1</asHll> + <asAsm>1</asAsm> + <asMacX>1</asMacX> + <asSyms>1</asSyms> + <asFals>1</asFals> + <asDbgD>1</asDbgD> + <asForm>1</asForm> + <ldLst>0</ldLst> + <ldmm>1</ldmm> + <ldXref>1</ldXref> + <BigEnd>0</BigEnd> + <AdsALst>1</AdsALst> + <AdsACrf>1</AdsACrf> + <AdsANop>0</AdsANop> + <AdsANot>0</AdsANot> + <AdsLLst>1</AdsLLst> + <AdsLmap>1</AdsLmap> + <AdsLcgr>1</AdsLcgr> + <AdsLsym>1</AdsLsym> + <AdsLszi>1</AdsLszi> + <AdsLtoi>1</AdsLtoi> + <AdsLsun>1</AdsLsun> + <AdsLven>1</AdsLven> + <AdsLsxf>1</AdsLsxf> + <RvctClst>0</RvctClst> + <GenPPlst>0</GenPPlst> + <AdsCpuType>"Cortex-M0+"</AdsCpuType> + <RvctDeviceName></RvctDeviceName> + <mOS>1</mOS> + <uocRom>0</uocRom> + <uocRam>0</uocRam> + <hadIROM>0</hadIROM> + <hadIRAM>0</hadIRAM> + <hadXRAM>0</hadXRAM> + <uocXRam>0</uocXRam> + <RvdsVP>0</RvdsVP> + <hadIRAM2>0</hadIRAM2> + <hadIROM2>0</hadIROM2> + <StupSel>1</StupSel> + <useUlib>0</useUlib> + <EndSel>1</EndSel> + <uLtcg>0</uLtcg> + <RoSelD>0</RoSelD> + <RwSelD>5</RwSelD> + <CodeSel>0</CodeSel> + <OptFeed>0</OptFeed> + <NoZi1>0</NoZi1> + <NoZi2>0</NoZi2> + <NoZi3>0</NoZi3> + <NoZi4>0</NoZi4> + <NoZi5>0</NoZi5> + <Ro1Chk>1</Ro1Chk> + <Ro2Chk>0</Ro2Chk> + <Ro3Chk>0</Ro3Chk> + <Ir1Chk>0</Ir1Chk> + <Ir2Chk>0</Ir2Chk> + <Ra1Chk>1</Ra1Chk> + <Ra2Chk>0</Ra2Chk> + <Ra3Chk>0</Ra3Chk> + <Im1Chk>0</Im1Chk> + <Im2Chk>0</Im2Chk> + <OnChipMemories> + <Ocm1> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </Ocm1> + <Ocm2> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </Ocm2> + <Ocm3> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </Ocm3> + <Ocm4> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </Ocm4> + <Ocm5> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </Ocm5> + <Ocm6> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </Ocm6> + <IRAM> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </IRAM> + <IROM> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </IROM> + <XRAM> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </XRAM> + <OCR_RVCT1> + <Type>1</Type> + <StartAddress>0x0</StartAddress> + <Size>0x10000</Size> + </OCR_RVCT1> + <OCR_RVCT2> + <Type>1</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </OCR_RVCT2> + <OCR_RVCT3> + <Type>1</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </OCR_RVCT3> + <OCR_RVCT4> + <Type>1</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </OCR_RVCT4> + <OCR_RVCT5> + <Type>1</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </OCR_RVCT5> + <OCR_RVCT6> + <Type>0</Type> + <StartAddress>0x20000000</StartAddress> + <Size>0x10000</Size> + </OCR_RVCT6> + <OCR_RVCT7> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </OCR_RVCT7> + <OCR_RVCT8> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </OCR_RVCT8> + <OCR_RVCT9> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </OCR_RVCT9> + <OCR_RVCT10> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </OCR_RVCT10> + </OnChipMemories> + <RvctStartVector></RvctStartVector> + </ArmAdsMisc> + <Cads> + <interw>1</interw> + <Optim>4</Optim> + <oTime>0</oTime> + <SplitLS>0</SplitLS> + <OneElfS>0</OneElfS> + <Strict>0</Strict> + <EnumInt>0</EnumInt> + <PlainCh>0</PlainCh> + <Ropi>0</Ropi> + <Rwpi>0</Rwpi> + <wLevel>0</wLevel> + <uThumb>0</uThumb> + <VariousControls> + <MiscControls></MiscControls> + <Define>CORTEX_M0PLUS</Define> + <Undefine></Undefine> + <IncludePath>..\..\..\..\software\cmsis\CMSIS\Include; ..\..\..\..\software\cmsis\Device\ARM\CMSDK_CM0plus\Include; ..\..\..\..\software\common\retarget</IncludePath> + </VariousControls> + </Cads> + <Aads> + <interw>1</interw> + <Ropi>0</Ropi> + <Rwpi>0</Rwpi> + <thumb>0</thumb> + <SplitLS>0</SplitLS> + <SwStkChk>0</SwStkChk> + <NoWarn>0</NoWarn> + <VariousControls> + <MiscControls></MiscControls> + <Define></Define> + <Undefine></Undefine> + <IncludePath></IncludePath> + </VariousControls> + </Aads> + <LDads> + <umfTarg>1</umfTarg> + <Ropi>0</Ropi> + <Rwpi>0</Rwpi> + <noStLib>0</noStLib> + <RepFail>1</RepFail> + <useFile>0</useFile> + <TextAddressRange>0x00000000</TextAddressRange> + <DataAddressRange>0x00000000</DataAddressRange> + <ScatterFile></ScatterFile> + <IncludeLibs></IncludeLibs> + <IncludeLibsPath></IncludeLibsPath> + <Misc></Misc> + <LinkerInputFile></LinkerInputFile> + <DisabledWarnings></DisabledWarnings> + </LDads> + </TargetArmAds> + </TargetOption> + <Groups> + <Group> + <GroupName>Startup</GroupName> + <Files> + <File> + <FileName>startup_CMSDK_CM0plus.s</FileName> + <FileType>2</FileType> + <FilePath>..\..\..\..\software\cmsis\Device\ARM\CMSDK_CM0plus\Source\ARM\startup_CMSDK_CM0plus.s</FilePath> + </File> + </Files> + </Group> + <Group> + <GroupName>Application</GroupName> + <Files> + <File> + <FileName>rtx_demo.c</FileName> + <FileType>1</FileType> + <FilePath>.\rtx_demo.c</FilePath> + </File> + <File> + <FileName>uart_stdout.c</FileName> + <FileType>1</FileType> + <FilePath>..\..\..\..\software\common\retarget\uart_stdout.c</FilePath> + </File> + <File> + <FileName>retarget.c</FileName> + <FileType>1</FileType> + <FilePath>..\..\..\..\software\common\retarget\retarget.c</FilePath> + </File> + </Files> + </Group> + <Group> + <GroupName>System</GroupName> + <Files> + <File> + <FileName>RTX_Config.c</FileName> + <FileType>1</FileType> + <FilePath>.\RTX_Config.c</FilePath> + </File> + <File> + <FileName>system_CMSDK_CM0plus.c</FileName> + <FileType>1</FileType> + <FilePath>..\..\..\..\software\cmsis\Device\ARM\CMSDK_CM0plus\Source\system_CMSDK_CM0plus.c</FilePath> + </File> + </Files> + </Group> + </Groups> + </Target> + </Targets> + +</Project> diff --git a/Cortex-M0/nanosoc/systems/mcu/testcodes/self_reset_demo/makefile b/Cortex-M0/nanosoc/systems/mcu/testcodes/self_reset_demo/makefile new file mode 100644 index 0000000..c8c4fb6 --- /dev/null +++ b/Cortex-M0/nanosoc/systems/mcu/testcodes/self_reset_demo/makefile @@ -0,0 +1,251 @@ +#----------------------------------------------------------------------------- +# The confidential and proprietary information contained in this file may +# only be used by a person authorised under and to the extent permitted +# by a subsisting licensing agreement from Arm Limited or its affiliates. +# +# (C) COPYRIGHT 2010-2013 Arm Limited or its affiliates. +# ALL RIGHTS RESERVED +# +# This entire notice must be reproduced on all copies of this file +# and copies of this file may only be made by a person if such person is +# permitted to do so under the terms of a subsisting license agreement +# from Arm Limited or its affiliates. +# +# SVN Information +# +# Checked In : $Date: 2017-10-10 15:55:38 +0100 (Tue, 10 Oct 2017) $ +# +# Revision : $Revision: 371321 $ +# +# Release Information : Cortex-M System Design Kit-r1p1-00rel0 +#----------------------------------------------------------------------------- +# +# Cortex-M System Design Kit software compilation make file +# +#----------------------------------------------------------------------------- +# +# Configurations +# +# Choose the core instantiated, can be +# - CORTEX_M0 +# - CORTEX_M0PLUS +CPU_PRODUCT = CORTEX_M0PLUS + +# Shared software directory +SOFTWARE_DIR = ../../../../software +CMSIS_DIR = $(SOFTWARE_DIR)/cmsis +CORE_DIR = $(CMSIS_DIR)/CMSIS/Include + +ifeq ($(CPU_PRODUCT),CORTEX_M0PLUS) + DEVICE_DIR = $(CMSIS_DIR)/Device/ARM/CMSDK_CM0plus +else + DEVICE_DIR = $(CMSIS_DIR)/Device/ARM/CMSDK_CM0 +endif + +# Program file +TESTNAME = self_reset_demo + +# Endian Option +COMPILE_BIGEND = 0 + +# Configuration +ifeq ($(CPU_PRODUCT),CORTEX_M0PLUS) + USER_DEFINE = -DCORTEX_M0PLUS +else + USER_DEFINE = -DCORTEX_M0 +endif + + +DEPS_LIST = makefile + +# Tool chain : ds5 / gcc / keil +TOOL_CHAIN = ds5 + +ifeq ($(TOOL_CHAIN),ds5) + ifeq ($(CPU_PRODUCT),CORTEX_M0PLUS) + CPU_TYPE = --cpu Cortex-M0plus + else + CPU_TYPE = --cpu Cortex-M0 + endif +endif + +ifeq ($(TOOL_CHAIN),gcc) + ifeq ($(CPU_PRODUCT),CORTEX_M0PLUS) + CPU_TYPE = -mcpu=cortex-m0plus + else + CPU_TYPE = -mcpu=cortex-m0 + endif +endif + +# Startup code directory for DS-5 +ifeq ($(TOOL_CHAIN),ds5) + STARTUP_DIR = $(DEVICE_DIR)/Source/ARM +endif + +# Startup code directory for gcc +ifeq ($(TOOL_CHAIN),gcc) + STARTUP_DIR = $(DEVICE_DIR)/Source/GCC +endif + +ifeq ($(CPU_PRODUCT),CORTEX_M0PLUS) + STARTUP_FILE = startup_CMSDK_CM0plus + SYSTEM_FILE = system_CMSDK_CM0plus +else + STARTUP_FILE = startup_CMSDK_CM0 + SYSTEM_FILE = system_CMSDK_CM0 +endif + +# --------------------------------------------------------------------------------------- +# DS-5 options + +# MicroLIB option (DS-5) +COMPILE_MICROLIB = 0 + +# Small Multiply (Cortex-M0/M0+ has small multiplier option) +COMPILE_SMALLMUL = 0 + +ARM_CC_OPTIONS = -c -O3 -g -Otime -I $(CORE_DIR) -I $(DEVICE_DIR)/Include \ + -I $(SOFTWARE_DIR)/common/retarget $(USER_DEFINE) +ARM_ASM_OPTIONS = -g +ARM_LINK_OPTIONS = "--keep=$(STARTUP_FILE).o(RESET)" "--first=$(STARTUP_FILE).o(RESET)" \ + --rw_base 0x30000000 --ro_base 0x00000000 --map + +ifeq ($(COMPILE_BIGEND),1) + # Big Endian + ARM_CC_OPTIONS += --bigend + ARM_ASM_OPTIONS += --bigend + ARM_LINK_OPTIONS += --be8 +endif + +ifeq ($(COMPILE_MICROLIB),1) + # MicroLIB + ARM_CC_OPTIONS += --library_type=microlib + ARM_ASM_OPTIONS += --library_type=microlib --pd "__MICROLIB SETA 1" + ARM_LINK_OPTIONS += --library_type=microlib +endif + +ifeq ($(COMPILE_SMALLMUL),1) + # In Cortex-M0, small multiply takes 32 cycles + ARM_CC_OPTIONS += --multiply_latency=32 +endif + + +# --------------------------------------------------------------------------------------- +# gcc options + +GNG_CC = arm-none-eabi-gcc +GNU_OBJDUMP = arm-none-eabi-objdump +GNU_OBJCOPY = arm-none-eabi-objcopy + +LINKER_SCRIPT_PATH = $(SOFTWARE_DIR)/common/scripts +LINKER_SCRIPT = $(LINKER_SCRIPT_PATH)/cmsdk_cm0.ld + +GNU_CC_FLAGS = -g -O3 -mthumb $(CPU_TYPE) + +ifeq ($(COMPILE_BIGEND),1) + # Big Endian + GNU_CC_FLAGS += -mbig-endian +endif + +# --------------------------------------------------------------------------------------- +all: all_$(TOOL_CHAIN) + +# --------------------------------------------------------------------------------------- +# DS-5 +all_ds5 : $(TESTNAME).hex $(TESTNAME).lst + +$(TESTNAME).o : $(SOFTWARE_DIR)/common/demos/$(TESTNAME).c $(DEPS_LIST) + armcc $(ARM_CC_OPTIONS) $(CPU_TYPE) $< -o $@ + +$(SYSTEM_FILE).o : $(DEVICE_DIR)/Source/$(SYSTEM_FILE).c $(DEPS_LIST) + armcc $(ARM_CC_OPTIONS) $(CPU_TYPE) $< -o $@ + +retarget.o : $(SOFTWARE_DIR)/common/retarget/retarget.c $(DEPS_LIST) + armcc $(ARM_CC_OPTIONS) $(CPU_TYPE) $< -o $@ + +uart_stdout.o : $(SOFTWARE_DIR)/common/retarget/uart_stdout.c $(DEPS_LIST) + armcc $(ARM_CC_OPTIONS) $(CPU_TYPE) $< -o $@ + +$(STARTUP_FILE).o : $(STARTUP_DIR)/$(STARTUP_FILE).s $(DEPS_LIST) + armasm $(ARM_ASM_OPTIONS) $(CPU_TYPE) $< -o $@ + +$(TESTNAME).ELF : $(TESTNAME).o $(SYSTEM_FILE).o $(STARTUP_FILE).o retarget.o uart_stdout.o + armlink $(ARM_LINK_OPTIONS) $(TESTNAME).o $(SYSTEM_FILE).o $(STARTUP_FILE).o retarget.o uart_stdout.o -o $@ + +$(TESTNAME).hex : $(TESTNAME).ELF + fromelf --vhx --8x1 $< --output $@ + + +$(TESTNAME).lst : $(TESTNAME).ELF + fromelf -c -d -e -s $< --output $@ + +# --------------------------------------------------------------------------------------- +# gcc +all_gcc: + $(GNG_CC) $(GNU_CC_FLAGS) $(STARTUP_DIR)/$(STARTUP_FILE).s \ + $(SOFTWARE_DIR)/common/demos/$(TESTNAME).c \ + $(SOFTWARE_DIR)/common/retarget/retarget.c \ + $(SOFTWARE_DIR)/common/retarget/uart_stdout.c \ + $(DEVICE_DIR)/Source/$(SYSTEM_FILE).c \ + -I $(DEVICE_DIR)/Include -I $(CORE_DIR) \ + -I $(SOFTWARE_DIR)/common/retarget \ + -L $(LINKER_SCRIPT_PATH) \ + -D__STACK_SIZE=0x200 \ + -D__HEAP_SIZE=0x1000 \ + $(USER_DEFINE) -T $(LINKER_SCRIPT) -o $(TESTNAME).o + # Generate disassembly code + $(GNU_OBJDUMP) -S $(TESTNAME).o > $(TESTNAME).lst + # Generate binary file + $(GNU_OBJCOPY) -S $(TESTNAME).o -O binary $(TESTNAME).bin + # Generate hex file + $(GNU_OBJCOPY) -S $(TESTNAME).o -O verilog $(TESTNAME).hex + +# Note: +# If the version of object copy you are using does not support verilog hex file output, +# you can generate the hex file from binary file using the following command +# od -v -A n -t x1 --width=1 $(TESTNAME).bin > $(TESTNAME).hex + +# --------------------------------------------------------------------------------------- +# Keil MDK + +all_keil: + @echo "Please compile your project code and press ENTER when ready" + @read dummy + +# --------------------------------------------------------------------------------------- +# Binary + +all_bin: $(TESTNAME).bin + # Generate hex file from binary + od -v -A n -t x1 --width=1 $(TESTNAME).bin > $(TESTNAME).hex + +# --------------------------------------------------------------------------------------- +# Clean +clean : + @rm -rf *.o + @if [ -e $(TESTNAME).hex ] ; then \ + rm -rf $(TESTNAME).hex ; \ + fi + @if [ -e $(TESTNAME).lst ] ; then \ + rm -rf $(TESTNAME).lst ; \ + fi + @if [ -e $(TESTNAME).ELF ] ; then \ + rm -rf $(TESTNAME).ELF ; \ + fi + @if [ -e $(TESTNAME).bin ] ; then \ + rm -rf $(TESTNAME).bin ; \ + fi + @rm -rf *.crf + @rm -rf *.plg + @rm -rf *.tra + @rm -rf *.htm + @rm -rf *.map + @rm -rf *.dep + @rm -rf *.d + @rm -rf *.lnp + @rm -rf *.bak + @rm -rf *.lst + @rm -rf *.axf + @rm -rf *.sct + @rm -rf *.__i + @rm -rf *._ia diff --git a/Cortex-M0/nanosoc/systems/mcu/testcodes/self_reset_demo/self_reset_demo_cm0.uvopt b/Cortex-M0/nanosoc/systems/mcu/testcodes/self_reset_demo/self_reset_demo_cm0.uvopt new file mode 100644 index 0000000..5b72456 --- /dev/null +++ b/Cortex-M0/nanosoc/systems/mcu/testcodes/self_reset_demo/self_reset_demo_cm0.uvopt @@ -0,0 +1,261 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no" ?> +<ProjectOpt xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="project_opt.xsd"> + + <SchemaVersion>1.0</SchemaVersion> + + <Header>### uVision Project, (C) Keil Software</Header> + + <Extensions> + <cExt>*.c</cExt> + <aExt>*.s*; *.src; *.a*</aExt> + <oExt>*.obj</oExt> + <lExt>*.lib</lExt> + <tExt>*.txt; *.h; *.inc</tExt> + <pExt>*.plm</pExt> + <CppX>*.cpp</CppX> + </Extensions> + + <DaveTm> + <dwLowDateTime>0</dwLowDateTime> + <dwHighDateTime>0</dwHighDateTime> + </DaveTm> + + <Target> + <TargetName>Debug</TargetName> + <ToolsetNumber>0x4</ToolsetNumber> + <ToolsetName>ARM-ADS</ToolsetName> + <TargetOption> + <CLKADS>50000000</CLKADS> + <OPTTT> + <gFlags>1</gFlags> + <BeepAtEnd>1</BeepAtEnd> + <RunSim>1</RunSim> + <RunTarget>0</RunTarget> + </OPTTT> + <OPTHX> + <HexSelection>1</HexSelection> + <FlashByte>65535</FlashByte> + <HexRangeLowAddress>0</HexRangeLowAddress> + <HexRangeHighAddress>0</HexRangeHighAddress> + <HexOffset>0</HexOffset> + </OPTHX> + <OPTLEX> + <PageWidth>79</PageWidth> + <PageLength>66</PageLength> + <TabStop>8</TabStop> + <ListingPath>.\</ListingPath> + </OPTLEX> + <ListingPage> + <CreateCListing>1</CreateCListing> + <CreateAListing>1</CreateAListing> + <CreateLListing>1</CreateLListing> + <CreateIListing>0</CreateIListing> + <AsmCond>1</AsmCond> + <AsmSymb>1</AsmSymb> + <AsmXref>0</AsmXref> + <CCond>1</CCond> + <CCode>0</CCode> + <CListInc>0</CListInc> + <CSymb>0</CSymb> + <LinkerCodeListing>0</LinkerCodeListing> + </ListingPage> + <OPTXL> + <LMap>1</LMap> + <LComments>1</LComments> + <LGenerateSymbols>1</LGenerateSymbols> + <LLibSym>1</LLibSym> + <LLines>1</LLines> + <LLocSym>1</LLocSym> + <LPubSym>1</LPubSym> + <LXref>0</LXref> + <LExpSel>0</LExpSel> + </OPTXL> + <OPTFL> + <tvExp>1</tvExp> + <tvExpOptDlg>0</tvExpOptDlg> + <IsCurrentTarget>1</IsCurrentTarget> + </OPTFL> + <CpuCode>255</CpuCode> + <DllOpt> + <SimDllName>SARMCM3.DLL</SimDllName> + <SimDllArguments></SimDllArguments> + <SimDlgDllName>DARMCM1.DLL</SimDlgDllName> + <SimDlgDllArguments></SimDlgDllArguments> + <TargetDllName>SARMCM3.DLL</TargetDllName> + <TargetDllArguments></TargetDllArguments> + <TargetDlgDllName>TARMCM1.DLL</TargetDlgDllName> + <TargetDlgDllArguments></TargetDlgDllArguments> + </DllOpt> + <DebugOpt> + <uSim>1</uSim> + <uTrg>0</uTrg> + <sLdApp>1</sLdApp> + <sGomain>1</sGomain> + <sRbreak>1</sRbreak> + <sRwatch>1</sRwatch> + <sRmem>1</sRmem> + <sRfunc>1</sRfunc> + <sRbox>1</sRbox> + <tLdApp>1</tLdApp> + <tGomain>0</tGomain> + <tRbreak>1</tRbreak> + <tRwatch>1</tRwatch> + <tRmem>1</tRmem> + <tRfunc>0</tRfunc> + <tRbox>1</tRbox> + <tRtrace>0</tRtrace> + <sRunDeb>0</sRunDeb> + <sLrtime>0</sLrtime> + <nTsel>-1</nTsel> + <sDll></sDll> + <sDllPa></sDllPa> + <sDlgDll></sDlgDll> + <sDlgPa></sDlgPa> + <sIfile></sIfile> + <tDll></tDll> + <tDllPa></tDllPa> + <tDlgDll></tDlgDll> + <tDlgPa></tDlgPa> + <tIfile></tIfile> + <pMon></pMon> + </DebugOpt> + <Breakpoint/> + <DebugFlag> + <trace>0</trace> + <periodic>1</periodic> + <aLwin>0</aLwin> + <aCover>0</aCover> + <aSer1>0</aSer1> + <aSer2>0</aSer2> + <aPa>0</aPa> + <viewmode>0</viewmode> + <vrSel>0</vrSel> + <aSym>0</aSym> + <aTbox>0</aTbox> + <AscS1>0</AscS1> + <AscS2>0</AscS2> + <AscS3>0</AscS3> + <aSer3>0</aSer3> + <eProf>0</eProf> + <aLa>0</aLa> + <aPa1>0</aPa1> + <AscS4>0</AscS4> + <aSer4>0</aSer4> + <StkLoc>0</StkLoc> + <TrcWin>0</TrcWin> + <newCpu>0</newCpu> + <uProt>0</uProt> + </DebugFlag> + <Tracepoint> + <THDelay>0</THDelay> + </Tracepoint> + <LintExecutable></LintExecutable> + <LintConfigFile></LintConfigFile> + </TargetOption> + </Target> + + <Group> + <GroupName>Startup</GroupName> + <tvExp>1</tvExp> + <tvExpOptDlg>0</tvExpOptDlg> + <cbSel>0</cbSel> + <RteFlg>0</RteFlg> + <File> + <GroupNumber>1</GroupNumber> + <FileNumber>1</FileNumber> + <FileType>2</FileType> + <tvExp>0</tvExp> + <Focus>0</Focus> + <ColumnNumber>0</ColumnNumber> + <tvExpOptDlg>0</tvExpOptDlg> + <TopLine>0</TopLine> + <CurrentLine>0</CurrentLine> + <bDave2>0</bDave2> + <PathWithFileName>..\..\..\..\software\cmsis\Device\ARM\CMSDK_CM0\Source\ARM\startup_CMSDK_CM0.s</PathWithFileName> + <FilenameWithoutPath>startup_CMSDK_CM0.s</FilenameWithoutPath> + <RteFlg>0</RteFlg> + <bShared>0</bShared> + </File> + </Group> + + <Group> + <GroupName>Application</GroupName> + <tvExp>1</tvExp> + <tvExpOptDlg>0</tvExpOptDlg> + <cbSel>0</cbSel> + <RteFlg>0</RteFlg> + <File> + <GroupNumber>2</GroupNumber> + <FileNumber>2</FileNumber> + <FileType>1</FileType> + <tvExp>0</tvExp> + <Focus>0</Focus> + <ColumnNumber>0</ColumnNumber> + <tvExpOptDlg>0</tvExpOptDlg> + <TopLine>0</TopLine> + <CurrentLine>0</CurrentLine> + <bDave2>0</bDave2> + <PathWithFileName>..\..\..\..\software\common\demos\self_reset_demo.c</PathWithFileName> + <FilenameWithoutPath>self_reset_demo.c</FilenameWithoutPath> + <RteFlg>0</RteFlg> + <bShared>0</bShared> + </File> + <File> + <GroupNumber>2</GroupNumber> + <FileNumber>3</FileNumber> + <FileType>1</FileType> + <tvExp>0</tvExp> + <Focus>0</Focus> + <ColumnNumber>0</ColumnNumber> + <tvExpOptDlg>0</tvExpOptDlg> + <TopLine>0</TopLine> + <CurrentLine>0</CurrentLine> + <bDave2>0</bDave2> + <PathWithFileName>..\..\..\..\software\common\retarget\retarget.c</PathWithFileName> + <FilenameWithoutPath>retarget.c</FilenameWithoutPath> + <RteFlg>0</RteFlg> + <bShared>0</bShared> + </File> + <File> + <GroupNumber>2</GroupNumber> + <FileNumber>4</FileNumber> + <FileType>1</FileType> + <tvExp>0</tvExp> + <Focus>0</Focus> + <ColumnNumber>0</ColumnNumber> + <tvExpOptDlg>0</tvExpOptDlg> + <TopLine>0</TopLine> + <CurrentLine>0</CurrentLine> + <bDave2>0</bDave2> + <PathWithFileName>..\..\..\..\software\common\retarget\uart_stdout.c</PathWithFileName> + <FilenameWithoutPath>uart_stdout.c</FilenameWithoutPath> + <RteFlg>0</RteFlg> + <bShared>0</bShared> + </File> + </Group> + + <Group> + <GroupName>System</GroupName> + <tvExp>1</tvExp> + <tvExpOptDlg>0</tvExpOptDlg> + <cbSel>0</cbSel> + <RteFlg>0</RteFlg> + <File> + <GroupNumber>3</GroupNumber> + <FileNumber>5</FileNumber> + <FileType>1</FileType> + <tvExp>0</tvExp> + <Focus>0</Focus> + <ColumnNumber>0</ColumnNumber> + <tvExpOptDlg>0</tvExpOptDlg> + <TopLine>0</TopLine> + <CurrentLine>0</CurrentLine> + <bDave2>0</bDave2> + <PathWithFileName>..\..\..\..\software\cmsis\Device\ARM\CMSDK_CM0\Source\system_CMSDK_CM0.c</PathWithFileName> + <FilenameWithoutPath>system_CMSDK_CM0.c</FilenameWithoutPath> + <RteFlg>0</RteFlg> + <bShared>0</bShared> + </File> + </Group> + +</ProjectOpt> diff --git a/Cortex-M0/nanosoc/systems/mcu/testcodes/self_reset_demo/self_reset_demo_cm0.uvproj b/Cortex-M0/nanosoc/systems/mcu/testcodes/self_reset_demo/self_reset_demo_cm0.uvproj new file mode 100644 index 0000000..c4b4745 --- /dev/null +++ b/Cortex-M0/nanosoc/systems/mcu/testcodes/self_reset_demo/self_reset_demo_cm0.uvproj @@ -0,0 +1,435 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no" ?> +<Project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="project_proj.xsd"> + + <SchemaVersion>1.1</SchemaVersion> + + <Header>### uVision Project, (C) Keil Software</Header> + + <Targets> + <Target> + <TargetName>Debug</TargetName> + <ToolsetNumber>0x4</ToolsetNumber> + <ToolsetName>ARM-ADS</ToolsetName> + <TargetOption> + <TargetCommonOption> + <Device>Cortex-M0</Device> + <Vendor>ARM</Vendor> + <Cpu>CLOCK(12000000) CPUTYPE("Cortex-M0") ESEL ELITTLE</Cpu> + <FlashUtilSpec></FlashUtilSpec> + <StartupFile></StartupFile> + <FlashDriverDll></FlashDriverDll> + <DeviceId>4803</DeviceId> + <RegisterFile></RegisterFile> + <MemoryEnv></MemoryEnv> + <Cmp></Cmp> + <Asm></Asm> + <Linker></Linker> + <OHString></OHString> + <InfinionOptionDll></InfinionOptionDll> + <SLE66CMisc></SLE66CMisc> + <SLE66AMisc></SLE66AMisc> + <SLE66LinkerMisc></SLE66LinkerMisc> + <SFDFile></SFDFile> + <UseEnv>0</UseEnv> + <BinPath></BinPath> + <IncludePath></IncludePath> + <LibPath></LibPath> + <RegisterFilePath></RegisterFilePath> + <DBRegisterFilePath></DBRegisterFilePath> + <TargetStatus> + <Error>0</Error> + <ExitCodeStop>0</ExitCodeStop> + <ButtonStop>0</ButtonStop> + <NotGenerated>0</NotGenerated> + <InvalidFlash>1</InvalidFlash> + </TargetStatus> + <OutputDirectory>.\</OutputDirectory> + <OutputName>self_reset_demo</OutputName> + <CreateExecutable>1</CreateExecutable> + <CreateLib>0</CreateLib> + <CreateHexFile>0</CreateHexFile> + <DebugInformation>1</DebugInformation> + <BrowseInformation>1</BrowseInformation> + <ListingPath>.\</ListingPath> + <HexFormatSelection>1</HexFormatSelection> + <Merge32K>0</Merge32K> + <CreateBatchFile>0</CreateBatchFile> + <BeforeCompile> + <RunUserProg1>0</RunUserProg1> + <RunUserProg2>0</RunUserProg2> + <UserProg1Name></UserProg1Name> + <UserProg2Name></UserProg2Name> + <UserProg1Dos16Mode>0</UserProg1Dos16Mode> + <UserProg2Dos16Mode>0</UserProg2Dos16Mode> + <nStopU1X>0</nStopU1X> + <nStopU2X>0</nStopU2X> + </BeforeCompile> + <BeforeMake> + <RunUserProg1>0</RunUserProg1> + <RunUserProg2>0</RunUserProg2> + <UserProg1Name></UserProg1Name> + <UserProg2Name></UserProg2Name> + <UserProg1Dos16Mode>0</UserProg1Dos16Mode> + <UserProg2Dos16Mode>0</UserProg2Dos16Mode> + </BeforeMake> + <AfterMake> + <RunUserProg1>1</RunUserProg1> + <RunUserProg2>0</RunUserProg2> + <UserProg1Name>$K\ARM\ARMCC\BIN\fromelf.exe #L --vhx --8x1 --output self_reset_demo.hex</UserProg1Name> + <UserProg2Name></UserProg2Name> + <UserProg1Dos16Mode>0</UserProg1Dos16Mode> + <UserProg2Dos16Mode>0</UserProg2Dos16Mode> + </AfterMake> + <SelectedForBatchBuild>0</SelectedForBatchBuild> + <SVCSIdString></SVCSIdString> + </TargetCommonOption> + <CommonProperty> + <UseCPPCompiler>0</UseCPPCompiler> + <RVCTCodeConst>0</RVCTCodeConst> + <RVCTZI>0</RVCTZI> + <RVCTOtherData>0</RVCTOtherData> + <ModuleSelection>0</ModuleSelection> + <IncludeInBuild>1</IncludeInBuild> + <AlwaysBuild>0</AlwaysBuild> + <GenerateAssemblyFile>0</GenerateAssemblyFile> + <AssembleAssemblyFile>0</AssembleAssemblyFile> + <PublicsOnly>0</PublicsOnly> + <StopOnExitCode>3</StopOnExitCode> + <CustomArgument></CustomArgument> + <IncludeLibraryModules></IncludeLibraryModules> + </CommonProperty> + <DllOption> + <SimDllName>SARMCM3.DLL</SimDllName> + <SimDllArguments></SimDllArguments> + <SimDlgDll>DARMCM1.DLL</SimDlgDll> + <SimDlgDllArguments></SimDlgDllArguments> + <TargetDllName>SARMCM3.DLL</TargetDllName> + <TargetDllArguments></TargetDllArguments> + <TargetDlgDll>TARMCM1.DLL</TargetDlgDll> + <TargetDlgDllArguments></TargetDlgDllArguments> + </DllOption> + <DebugOption> + <OPTHX> + <HexSelection>1</HexSelection> + <HexRangeLowAddress>0</HexRangeLowAddress> + <HexRangeHighAddress>0</HexRangeHighAddress> + <HexOffset>0</HexOffset> + <Oh166RecLen>16</Oh166RecLen> + </OPTHX> + <Simulator> + <UseSimulator>1</UseSimulator> + <LoadApplicationAtStartup>1</LoadApplicationAtStartup> + <RunToMain>1</RunToMain> + <RestoreBreakpoints>1</RestoreBreakpoints> + <RestoreWatchpoints>1</RestoreWatchpoints> + <RestoreMemoryDisplay>1</RestoreMemoryDisplay> + <RestoreFunctions>1</RestoreFunctions> + <RestoreToolbox>1</RestoreToolbox> + <LimitSpeedToRealTime>0</LimitSpeedToRealTime> + </Simulator> + <Target> + <UseTarget>0</UseTarget> + <LoadApplicationAtStartup>1</LoadApplicationAtStartup> + <RunToMain>0</RunToMain> + <RestoreBreakpoints>1</RestoreBreakpoints> + <RestoreWatchpoints>1</RestoreWatchpoints> + <RestoreMemoryDisplay>1</RestoreMemoryDisplay> + <RestoreFunctions>0</RestoreFunctions> + <RestoreToolbox>1</RestoreToolbox> + <RestoreTracepoints>0</RestoreTracepoints> + </Target> + <RunDebugAfterBuild>0</RunDebugAfterBuild> + <TargetSelection>-1</TargetSelection> + <SimDlls> + <CpuDll></CpuDll> + <CpuDllArguments></CpuDllArguments> + <PeripheralDll></PeripheralDll> + <PeripheralDllArguments></PeripheralDllArguments> + <InitializationFile></InitializationFile> + </SimDlls> + <TargetDlls> + <CpuDll></CpuDll> + <CpuDllArguments></CpuDllArguments> + <PeripheralDll></PeripheralDll> + <PeripheralDllArguments></PeripheralDllArguments> + <InitializationFile></InitializationFile> + <Driver></Driver> + </TargetDlls> + </DebugOption> + <Utilities> + <Flash1> + <UseTargetDll>0</UseTargetDll> + <UseExternalTool>0</UseExternalTool> + <RunIndependent>0</RunIndependent> + <UpdateFlashBeforeDebugging>0</UpdateFlashBeforeDebugging> + <Capability>0</Capability> + <DriverSelection>-1</DriverSelection> + </Flash1> + <Flash2></Flash2> + <Flash3></Flash3> + <Flash4></Flash4> + </Utilities> + <TargetArmAds> + <ArmAdsMisc> + <GenerateListings>0</GenerateListings> + <asHll>1</asHll> + <asAsm>1</asAsm> + <asMacX>1</asMacX> + <asSyms>1</asSyms> + <asFals>1</asFals> + <asDbgD>1</asDbgD> + <asForm>1</asForm> + <ldLst>0</ldLst> + <ldmm>1</ldmm> + <ldXref>1</ldXref> + <BigEnd>0</BigEnd> + <AdsALst>1</AdsALst> + <AdsACrf>1</AdsACrf> + <AdsANop>0</AdsANop> + <AdsANot>0</AdsANot> + <AdsLLst>1</AdsLLst> + <AdsLmap>1</AdsLmap> + <AdsLcgr>1</AdsLcgr> + <AdsLsym>1</AdsLsym> + <AdsLszi>1</AdsLszi> + <AdsLtoi>1</AdsLtoi> + <AdsLsun>1</AdsLsun> + <AdsLven>1</AdsLven> + <AdsLsxf>1</AdsLsxf> + <RvctClst>0</RvctClst> + <GenPPlst>0</GenPPlst> + <AdsCpuType>"Cortex-M0"</AdsCpuType> + <RvctDeviceName></RvctDeviceName> + <mOS>0</mOS> + <uocRom>0</uocRom> + <uocRam>0</uocRam> + <hadIROM>0</hadIROM> + <hadIRAM>0</hadIRAM> + <hadXRAM>0</hadXRAM> + <uocXRam>0</uocXRam> + <RvdsVP>0</RvdsVP> + <hadIRAM2>0</hadIRAM2> + <hadIROM2>0</hadIROM2> + <StupSel>1</StupSel> + <useUlib>0</useUlib> + <EndSel>1</EndSel> + <uLtcg>0</uLtcg> + <RoSelD>0</RoSelD> + <RwSelD>5</RwSelD> + <CodeSel>0</CodeSel> + <OptFeed>0</OptFeed> + <NoZi1>0</NoZi1> + <NoZi2>0</NoZi2> + <NoZi3>0</NoZi3> + <NoZi4>0</NoZi4> + <NoZi5>0</NoZi5> + <Ro1Chk>1</Ro1Chk> + <Ro2Chk>0</Ro2Chk> + <Ro3Chk>0</Ro3Chk> + <Ir1Chk>0</Ir1Chk> + <Ir2Chk>0</Ir2Chk> + <Ra1Chk>1</Ra1Chk> + <Ra2Chk>0</Ra2Chk> + <Ra3Chk>0</Ra3Chk> + <Im1Chk>0</Im1Chk> + <Im2Chk>0</Im2Chk> + <OnChipMemories> + <Ocm1> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </Ocm1> + <Ocm2> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </Ocm2> + <Ocm3> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </Ocm3> + <Ocm4> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </Ocm4> + <Ocm5> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </Ocm5> + <Ocm6> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </Ocm6> + <IRAM> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </IRAM> + <IROM> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </IROM> + <XRAM> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </XRAM> + <OCR_RVCT1> + <Type>1</Type> + <StartAddress>0x0</StartAddress> + <Size>0x10000</Size> + </OCR_RVCT1> + <OCR_RVCT2> + <Type>1</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </OCR_RVCT2> + <OCR_RVCT3> + <Type>1</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </OCR_RVCT3> + <OCR_RVCT4> + <Type>1</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </OCR_RVCT4> + <OCR_RVCT5> + <Type>1</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </OCR_RVCT5> + <OCR_RVCT6> + <Type>0</Type> + <StartAddress>0x20000000</StartAddress> + <Size>0x10000</Size> + </OCR_RVCT6> + <OCR_RVCT7> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </OCR_RVCT7> + <OCR_RVCT8> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </OCR_RVCT8> + <OCR_RVCT9> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </OCR_RVCT9> + <OCR_RVCT10> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </OCR_RVCT10> + </OnChipMemories> + <RvctStartVector></RvctStartVector> + </ArmAdsMisc> + <Cads> + <interw>1</interw> + <Optim>3</Optim> + <oTime>0</oTime> + <SplitLS>0</SplitLS> + <OneElfS>0</OneElfS> + <Strict>0</Strict> + <EnumInt>0</EnumInt> + <PlainCh>0</PlainCh> + <Ropi>0</Ropi> + <Rwpi>0</Rwpi> + <wLevel>0</wLevel> + <uThumb>0</uThumb> + <uSurpInc>0</uSurpInc> + <VariousControls> + <MiscControls></MiscControls> + <Define>CORTEX_M0</Define> + <Undefine></Undefine> + <IncludePath>..\..\..\..\software\cmsis\CMSIS\Include; ..\..\..\..\software\cmsis\Device\ARM\CMSDK_CM0\Include; ..\..\..\..\software\common\retarget</IncludePath> + </VariousControls> + </Cads> + <Aads> + <interw>1</interw> + <Ropi>0</Ropi> + <Rwpi>0</Rwpi> + <thumb>0</thumb> + <SplitLS>0</SplitLS> + <SwStkChk>0</SwStkChk> + <NoWarn>0</NoWarn> + <uSurpInc>0</uSurpInc> + <VariousControls> + <MiscControls></MiscControls> + <Define></Define> + <Undefine></Undefine> + <IncludePath></IncludePath> + </VariousControls> + </Aads> + <LDads> + <umfTarg>1</umfTarg> + <Ropi>0</Ropi> + <Rwpi>0</Rwpi> + <noStLib>0</noStLib> + <RepFail>1</RepFail> + <useFile>0</useFile> + <TextAddressRange>0x00000000</TextAddressRange> + <DataAddressRange>0x00000000</DataAddressRange> + <ScatterFile></ScatterFile> + <IncludeLibs></IncludeLibs> + <IncludeLibsPath></IncludeLibsPath> + <Misc></Misc> + <LinkerInputFile></LinkerInputFile> + <DisabledWarnings></DisabledWarnings> + </LDads> + </TargetArmAds> + </TargetOption> + <Groups> + <Group> + <GroupName>Startup</GroupName> + <Files> + <File> + <FileName>startup_CMSDK_CM0.s</FileName> + <FileType>2</FileType> + <FilePath>..\..\..\..\software\cmsis\Device\ARM\CMSDK_CM0\Source\ARM\startup_CMSDK_CM0.s</FilePath> + </File> + </Files> + </Group> + <Group> + <GroupName>Application</GroupName> + <Files> + <File> + <FileName>self_reset_demo.c</FileName> + <FileType>1</FileType> + <FilePath>..\..\..\..\software\common\demos\self_reset_demo.c</FilePath> + </File> + <File> + <FileName>retarget.c</FileName> + <FileType>1</FileType> + <FilePath>..\..\..\..\software\common\retarget\retarget.c</FilePath> + </File> + <File> + <FileName>uart_stdout.c</FileName> + <FileType>1</FileType> + <FilePath>..\..\..\..\software\common\retarget\uart_stdout.c</FilePath> + </File> + </Files> + </Group> + <Group> + <GroupName>System</GroupName> + <Files> + <File> + <FileName>system_CMSDK_CM0.c</FileName> + <FileType>1</FileType> + <FilePath>..\..\..\..\software\cmsis\Device\ARM\CMSDK_CM0\Source\system_CMSDK_CM0.c</FilePath> + </File> + </Files> + </Group> + </Groups> + </Target> + </Targets> + +</Project> diff --git a/Cortex-M0/nanosoc/systems/mcu/testcodes/self_reset_demo/self_reset_demo_cm0p.uvopt b/Cortex-M0/nanosoc/systems/mcu/testcodes/self_reset_demo/self_reset_demo_cm0p.uvopt new file mode 100644 index 0000000..549db58 --- /dev/null +++ b/Cortex-M0/nanosoc/systems/mcu/testcodes/self_reset_demo/self_reset_demo_cm0p.uvopt @@ -0,0 +1,244 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no" ?> +<ProjectOpt xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="project_opt.xsd"> + + <SchemaVersion>1.0</SchemaVersion> + + <Header>### uVision Project, (C) Keil Software</Header> + + <Extensions> + <cExt>*.c</cExt> + <aExt>*.s*; *.src; *.a*</aExt> + <oExt>*.obj</oExt> + <lExt>*.lib</lExt> + <tExt>*.txt; *.h; *.inc</tExt> + <pExt>*.plm</pExt> + <CppX>*.cpp</CppX> + </Extensions> + + <DaveTm> + <dwLowDateTime>0</dwLowDateTime> + <dwHighDateTime>0</dwHighDateTime> + </DaveTm> + + <Target> + <TargetName>Debug</TargetName> + <ToolsetNumber>0x4</ToolsetNumber> + <ToolsetName>ARM-ADS</ToolsetName> + <TargetOption> + <CLKADS>50000000</CLKADS> + <OPTTT> + <gFlags>1</gFlags> + <BeepAtEnd>1</BeepAtEnd> + <RunSim>1</RunSim> + <RunTarget>0</RunTarget> + </OPTTT> + <OPTHX> + <HexSelection>1</HexSelection> + <FlashByte>65535</FlashByte> + <HexRangeLowAddress>0</HexRangeLowAddress> + <HexRangeHighAddress>0</HexRangeHighAddress> + <HexOffset>0</HexOffset> + </OPTHX> + <OPTLEX> + <PageWidth>79</PageWidth> + <PageLength>66</PageLength> + <TabStop>8</TabStop> + <ListingPath>.\</ListingPath> + </OPTLEX> + <ListingPage> + <CreateCListing>1</CreateCListing> + <CreateAListing>1</CreateAListing> + <CreateLListing>1</CreateLListing> + <CreateIListing>0</CreateIListing> + <AsmCond>1</AsmCond> + <AsmSymb>1</AsmSymb> + <AsmXref>0</AsmXref> + <CCond>1</CCond> + <CCode>0</CCode> + <CListInc>0</CListInc> + <CSymb>0</CSymb> + <LinkerCodeListing>0</LinkerCodeListing> + </ListingPage> + <OPTXL> + <LMap>1</LMap> + <LComments>1</LComments> + <LGenerateSymbols>1</LGenerateSymbols> + <LLibSym>1</LLibSym> + <LLines>1</LLines> + <LLocSym>1</LLocSym> + <LPubSym>1</LPubSym> + <LXref>0</LXref> + <LExpSel>0</LExpSel> + </OPTXL> + <OPTFL> + <tvExp>1</tvExp> + <tvExpOptDlg>0</tvExpOptDlg> + <IsCurrentTarget>1</IsCurrentTarget> + </OPTFL> + <CpuCode>255</CpuCode> + <DllOpt> + <SimDllName>SARMCM3.DLL</SimDllName> + <SimDllArguments></SimDllArguments> + <SimDlgDllName>DARMCM1.DLL</SimDlgDllName> + <SimDlgDllArguments></SimDlgDllArguments> + <TargetDllName>SARMCM3.DLL</TargetDllName> + <TargetDllArguments></TargetDllArguments> + <TargetDlgDllName>TARMCM1.DLL</TargetDlgDllName> + <TargetDlgDllArguments></TargetDlgDllArguments> + </DllOpt> + <DebugOpt> + <uSim>1</uSim> + <uTrg>0</uTrg> + <sLdApp>1</sLdApp> + <sGomain>1</sGomain> + <sRbreak>1</sRbreak> + <sRwatch>1</sRwatch> + <sRmem>1</sRmem> + <sRfunc>1</sRfunc> + <sRbox>1</sRbox> + <tLdApp>1</tLdApp> + <tGomain>0</tGomain> + <tRbreak>1</tRbreak> + <tRwatch>1</tRwatch> + <tRmem>1</tRmem> + <tRfunc>0</tRfunc> + <tRbox>1</tRbox> + <sRunDeb>0</sRunDeb> + <sLrtime>0</sLrtime> + <nTsel>-1</nTsel> + <sDll></sDll> + <sDllPa></sDllPa> + <sDlgDll></sDlgDll> + <sDlgPa></sDlgPa> + <sIfile></sIfile> + <tDll></tDll> + <tDllPa></tDllPa> + <tDlgDll></tDlgDll> + <tDlgPa></tDlgPa> + <tIfile></tIfile> + <pMon></pMon> + </DebugOpt> + <Breakpoint/> + <DebugFlag> + <trace>0</trace> + <periodic>1</periodic> + <aLwin>0</aLwin> + <aCover>0</aCover> + <aSer1>0</aSer1> + <aSer2>0</aSer2> + <aPa>0</aPa> + <viewmode>0</viewmode> + <vrSel>0</vrSel> + <aSym>0</aSym> + <aTbox>0</aTbox> + <AscS1>0</AscS1> + <AscS2>0</AscS2> + <AscS3>0</AscS3> + <aSer3>0</aSer3> + <eProf>0</eProf> + <aLa>0</aLa> + <aPa1>0</aPa1> + <AscS4>0</AscS4> + <aSer4>0</aSer4> + <StkLoc>0</StkLoc> + <TrcWin>0</TrcWin> + <newCpu>0</newCpu> + <uProt>0</uProt> + </DebugFlag> + <LintExecutable></LintExecutable> + <LintConfigFile></LintConfigFile> + </TargetOption> + </Target> + + <Group> + <GroupName>Startup</GroupName> + <tvExp>1</tvExp> + <tvExpOptDlg>0</tvExpOptDlg> + <cbSel>0</cbSel> + <File> + <GroupNumber>1</GroupNumber> + <FileNumber>1</FileNumber> + <FileType>2</FileType> + <tvExp>0</tvExp> + <Focus>0</Focus> + <ColumnNumber>0</ColumnNumber> + <tvExpOptDlg>0</tvExpOptDlg> + <TopLine>0</TopLine> + <CurrentLine>0</CurrentLine> + <bDave2>0</bDave2> + <PathWithFileName>..\..\..\..\software\cmsis\Device\ARM\CMSDK_CM0plus\Source\ARM\startup_CMSDK_CM0plus.s</PathWithFileName> + <FilenameWithoutPath>startup_CMSDK_CM0plus.s</FilenameWithoutPath> + </File> + </Group> + + <Group> + <GroupName>Application</GroupName> + <tvExp>1</tvExp> + <tvExpOptDlg>0</tvExpOptDlg> + <cbSel>0</cbSel> + <File> + <GroupNumber>2</GroupNumber> + <FileNumber>2</FileNumber> + <FileType>1</FileType> + <tvExp>0</tvExp> + <Focus>0</Focus> + <ColumnNumber>0</ColumnNumber> + <tvExpOptDlg>0</tvExpOptDlg> + <TopLine>0</TopLine> + <CurrentLine>0</CurrentLine> + <bDave2>0</bDave2> + <PathWithFileName>..\..\..\..\software\common\demos\self_reset_demo.c</PathWithFileName> + <FilenameWithoutPath>self_reset_demo.c</FilenameWithoutPath> + </File> + <File> + <GroupNumber>2</GroupNumber> + <FileNumber>3</FileNumber> + <FileType>1</FileType> + <tvExp>0</tvExp> + <Focus>0</Focus> + <ColumnNumber>0</ColumnNumber> + <tvExpOptDlg>0</tvExpOptDlg> + <TopLine>0</TopLine> + <CurrentLine>0</CurrentLine> + <bDave2>0</bDave2> + <PathWithFileName>..\..\..\..\software\common\retarget\retarget.c</PathWithFileName> + <FilenameWithoutPath>retarget.c</FilenameWithoutPath> + </File> + <File> + <GroupNumber>2</GroupNumber> + <FileNumber>4</FileNumber> + <FileType>1</FileType> + <tvExp>0</tvExp> + <Focus>0</Focus> + <ColumnNumber>0</ColumnNumber> + <tvExpOptDlg>0</tvExpOptDlg> + <TopLine>0</TopLine> + <CurrentLine>0</CurrentLine> + <bDave2>0</bDave2> + <PathWithFileName>..\..\..\..\software\common\retarget\uart_stdout.c</PathWithFileName> + <FilenameWithoutPath>uart_stdout.c</FilenameWithoutPath> + </File> + </Group> + + <Group> + <GroupName>System</GroupName> + <tvExp>1</tvExp> + <tvExpOptDlg>0</tvExpOptDlg> + <cbSel>0</cbSel> + <File> + <GroupNumber>3</GroupNumber> + <FileNumber>5</FileNumber> + <FileType>1</FileType> + <tvExp>0</tvExp> + <Focus>0</Focus> + <ColumnNumber>0</ColumnNumber> + <tvExpOptDlg>0</tvExpOptDlg> + <TopLine>0</TopLine> + <CurrentLine>0</CurrentLine> + <bDave2>0</bDave2> + <PathWithFileName>..\..\..\..\software\cmsis\Device\ARM\CMSDK_CM0plus\Source\system_CMSDK_CM0plus.c</PathWithFileName> + <FilenameWithoutPath>system_CMSDK_CM0plus.c</FilenameWithoutPath> + </File> + </Group> + +</ProjectOpt> diff --git a/Cortex-M0/nanosoc/systems/mcu/testcodes/self_reset_demo/self_reset_demo_cm0p.uvproj b/Cortex-M0/nanosoc/systems/mcu/testcodes/self_reset_demo/self_reset_demo_cm0p.uvproj new file mode 100644 index 0000000..d891cfc --- /dev/null +++ b/Cortex-M0/nanosoc/systems/mcu/testcodes/self_reset_demo/self_reset_demo_cm0p.uvproj @@ -0,0 +1,432 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no" ?> +<Project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="project_proj.xsd"> + + <SchemaVersion>1.1</SchemaVersion> + + <Header>### uVision Project, (C) Keil Software</Header> + + <Targets> + <Target> + <TargetName>Debug</TargetName> + <ToolsetNumber>0x4</ToolsetNumber> + <ToolsetName>ARM-ADS</ToolsetName> + <TargetOption> + <TargetCommonOption> + <Device>Cortex-M0+</Device> + <Vendor>ARM</Vendor> + <Cpu>CLOCK(12000000) CPUTYPE("Cortex-M0+") ESEL ELITTLE</Cpu> + <FlashUtilSpec></FlashUtilSpec> + <StartupFile></StartupFile> + <FlashDriverDll></FlashDriverDll> + <DeviceId>6268</DeviceId> + <RegisterFile></RegisterFile> + <MemoryEnv></MemoryEnv> + <Cmp></Cmp> + <Asm></Asm> + <Linker></Linker> + <OHString></OHString> + <InfinionOptionDll></InfinionOptionDll> + <SLE66CMisc></SLE66CMisc> + <SLE66AMisc></SLE66AMisc> + <SLE66LinkerMisc></SLE66LinkerMisc> + <SFDFile></SFDFile> + <UseEnv>0</UseEnv> + <BinPath></BinPath> + <IncludePath></IncludePath> + <LibPath></LibPath> + <RegisterFilePath></RegisterFilePath> + <DBRegisterFilePath></DBRegisterFilePath> + <TargetStatus> + <Error>0</Error> + <ExitCodeStop>0</ExitCodeStop> + <ButtonStop>0</ButtonStop> + <NotGenerated>0</NotGenerated> + <InvalidFlash>1</InvalidFlash> + </TargetStatus> + <OutputDirectory>.\</OutputDirectory> + <OutputName>self_reset_demo</OutputName> + <CreateExecutable>1</CreateExecutable> + <CreateLib>0</CreateLib> + <CreateHexFile>0</CreateHexFile> + <DebugInformation>1</DebugInformation> + <BrowseInformation>1</BrowseInformation> + <ListingPath>.\</ListingPath> + <HexFormatSelection>1</HexFormatSelection> + <Merge32K>0</Merge32K> + <CreateBatchFile>0</CreateBatchFile> + <BeforeCompile> + <RunUserProg1>0</RunUserProg1> + <RunUserProg2>0</RunUserProg2> + <UserProg1Name></UserProg1Name> + <UserProg2Name></UserProg2Name> + <UserProg1Dos16Mode>0</UserProg1Dos16Mode> + <UserProg2Dos16Mode>0</UserProg2Dos16Mode> + <nStopU1X>0</nStopU1X> + <nStopU2X>0</nStopU2X> + </BeforeCompile> + <BeforeMake> + <RunUserProg1>0</RunUserProg1> + <RunUserProg2>0</RunUserProg2> + <UserProg1Name></UserProg1Name> + <UserProg2Name></UserProg2Name> + <UserProg1Dos16Mode>0</UserProg1Dos16Mode> + <UserProg2Dos16Mode>0</UserProg2Dos16Mode> + </BeforeMake> + <AfterMake> + <RunUserProg1>1</RunUserProg1> + <RunUserProg2>0</RunUserProg2> + <UserProg1Name>$K\ARM\ARMCC\BIN\fromelf.exe #L --vhx --8x1 --output self_reset_demo.hex</UserProg1Name> + <UserProg2Name></UserProg2Name> + <UserProg1Dos16Mode>0</UserProg1Dos16Mode> + <UserProg2Dos16Mode>0</UserProg2Dos16Mode> + </AfterMake> + <SelectedForBatchBuild>0</SelectedForBatchBuild> + <SVCSIdString></SVCSIdString> + </TargetCommonOption> + <CommonProperty> + <UseCPPCompiler>0</UseCPPCompiler> + <RVCTCodeConst>0</RVCTCodeConst> + <RVCTZI>0</RVCTZI> + <RVCTOtherData>0</RVCTOtherData> + <ModuleSelection>0</ModuleSelection> + <IncludeInBuild>1</IncludeInBuild> + <AlwaysBuild>0</AlwaysBuild> + <GenerateAssemblyFile>0</GenerateAssemblyFile> + <AssembleAssemblyFile>0</AssembleAssemblyFile> + <PublicsOnly>0</PublicsOnly> + <StopOnExitCode>3</StopOnExitCode> + <CustomArgument></CustomArgument> + <IncludeLibraryModules></IncludeLibraryModules> + </CommonProperty> + <DllOption> + <SimDllName>SARMCM3.DLL</SimDllName> + <SimDllArguments></SimDllArguments> + <SimDlgDll>DARMCM1.DLL</SimDlgDll> + <SimDlgDllArguments></SimDlgDllArguments> + <TargetDllName>SARMCM3.DLL</TargetDllName> + <TargetDllArguments></TargetDllArguments> + <TargetDlgDll>TARMCM1.DLL</TargetDlgDll> + <TargetDlgDllArguments></TargetDlgDllArguments> + </DllOption> + <DebugOption> + <OPTHX> + <HexSelection>1</HexSelection> + <HexRangeLowAddress>0</HexRangeLowAddress> + <HexRangeHighAddress>0</HexRangeHighAddress> + <HexOffset>0</HexOffset> + <Oh166RecLen>16</Oh166RecLen> + </OPTHX> + <Simulator> + <UseSimulator>1</UseSimulator> + <LoadApplicationAtStartup>1</LoadApplicationAtStartup> + <RunToMain>1</RunToMain> + <RestoreBreakpoints>1</RestoreBreakpoints> + <RestoreWatchpoints>1</RestoreWatchpoints> + <RestoreMemoryDisplay>1</RestoreMemoryDisplay> + <RestoreFunctions>1</RestoreFunctions> + <RestoreToolbox>1</RestoreToolbox> + <LimitSpeedToRealTime>0</LimitSpeedToRealTime> + </Simulator> + <Target> + <UseTarget>0</UseTarget> + <LoadApplicationAtStartup>1</LoadApplicationAtStartup> + <RunToMain>0</RunToMain> + <RestoreBreakpoints>1</RestoreBreakpoints> + <RestoreWatchpoints>1</RestoreWatchpoints> + <RestoreMemoryDisplay>1</RestoreMemoryDisplay> + <RestoreFunctions>0</RestoreFunctions> + <RestoreToolbox>1</RestoreToolbox> + </Target> + <RunDebugAfterBuild>0</RunDebugAfterBuild> + <TargetSelection>-1</TargetSelection> + <SimDlls> + <CpuDll></CpuDll> + <CpuDllArguments></CpuDllArguments> + <PeripheralDll></PeripheralDll> + <PeripheralDllArguments></PeripheralDllArguments> + <InitializationFile></InitializationFile> + </SimDlls> + <TargetDlls> + <CpuDll></CpuDll> + <CpuDllArguments></CpuDllArguments> + <PeripheralDll></PeripheralDll> + <PeripheralDllArguments></PeripheralDllArguments> + <InitializationFile></InitializationFile> + <Driver></Driver> + </TargetDlls> + </DebugOption> + <Utilities> + <Flash1> + <UseTargetDll>0</UseTargetDll> + <UseExternalTool>0</UseExternalTool> + <RunIndependent>0</RunIndependent> + <UpdateFlashBeforeDebugging>0</UpdateFlashBeforeDebugging> + <Capability>0</Capability> + <DriverSelection>-1</DriverSelection> + </Flash1> + <Flash2></Flash2> + <Flash3></Flash3> + <Flash4></Flash4> + </Utilities> + <TargetArmAds> + <ArmAdsMisc> + <GenerateListings>0</GenerateListings> + <asHll>1</asHll> + <asAsm>1</asAsm> + <asMacX>1</asMacX> + <asSyms>1</asSyms> + <asFals>1</asFals> + <asDbgD>1</asDbgD> + <asForm>1</asForm> + <ldLst>0</ldLst> + <ldmm>1</ldmm> + <ldXref>1</ldXref> + <BigEnd>0</BigEnd> + <AdsALst>1</AdsALst> + <AdsACrf>1</AdsACrf> + <AdsANop>0</AdsANop> + <AdsANot>0</AdsANot> + <AdsLLst>1</AdsLLst> + <AdsLmap>1</AdsLmap> + <AdsLcgr>1</AdsLcgr> + <AdsLsym>1</AdsLsym> + <AdsLszi>1</AdsLszi> + <AdsLtoi>1</AdsLtoi> + <AdsLsun>1</AdsLsun> + <AdsLven>1</AdsLven> + <AdsLsxf>1</AdsLsxf> + <RvctClst>0</RvctClst> + <GenPPlst>0</GenPPlst> + <AdsCpuType>"Cortex-M0+"</AdsCpuType> + <RvctDeviceName></RvctDeviceName> + <mOS>0</mOS> + <uocRom>0</uocRom> + <uocRam>0</uocRam> + <hadIROM>0</hadIROM> + <hadIRAM>0</hadIRAM> + <hadXRAM>0</hadXRAM> + <uocXRam>0</uocXRam> + <RvdsVP>0</RvdsVP> + <hadIRAM2>0</hadIRAM2> + <hadIROM2>0</hadIROM2> + <StupSel>1</StupSel> + <useUlib>0</useUlib> + <EndSel>1</EndSel> + <uLtcg>0</uLtcg> + <RoSelD>0</RoSelD> + <RwSelD>5</RwSelD> + <CodeSel>0</CodeSel> + <OptFeed>0</OptFeed> + <NoZi1>0</NoZi1> + <NoZi2>0</NoZi2> + <NoZi3>0</NoZi3> + <NoZi4>0</NoZi4> + <NoZi5>0</NoZi5> + <Ro1Chk>1</Ro1Chk> + <Ro2Chk>0</Ro2Chk> + <Ro3Chk>0</Ro3Chk> + <Ir1Chk>0</Ir1Chk> + <Ir2Chk>0</Ir2Chk> + <Ra1Chk>1</Ra1Chk> + <Ra2Chk>0</Ra2Chk> + <Ra3Chk>0</Ra3Chk> + <Im1Chk>0</Im1Chk> + <Im2Chk>0</Im2Chk> + <OnChipMemories> + <Ocm1> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </Ocm1> + <Ocm2> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </Ocm2> + <Ocm3> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </Ocm3> + <Ocm4> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </Ocm4> + <Ocm5> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </Ocm5> + <Ocm6> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </Ocm6> + <IRAM> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </IRAM> + <IROM> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </IROM> + <XRAM> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </XRAM> + <OCR_RVCT1> + <Type>1</Type> + <StartAddress>0x0</StartAddress> + <Size>0x10000</Size> + </OCR_RVCT1> + <OCR_RVCT2> + <Type>1</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </OCR_RVCT2> + <OCR_RVCT3> + <Type>1</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </OCR_RVCT3> + <OCR_RVCT4> + <Type>1</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </OCR_RVCT4> + <OCR_RVCT5> + <Type>1</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </OCR_RVCT5> + <OCR_RVCT6> + <Type>0</Type> + <StartAddress>0x20000000</StartAddress> + <Size>0x10000</Size> + </OCR_RVCT6> + <OCR_RVCT7> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </OCR_RVCT7> + <OCR_RVCT8> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </OCR_RVCT8> + <OCR_RVCT9> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </OCR_RVCT9> + <OCR_RVCT10> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </OCR_RVCT10> + </OnChipMemories> + <RvctStartVector></RvctStartVector> + </ArmAdsMisc> + <Cads> + <interw>1</interw> + <Optim>3</Optim> + <oTime>0</oTime> + <SplitLS>0</SplitLS> + <OneElfS>0</OneElfS> + <Strict>0</Strict> + <EnumInt>0</EnumInt> + <PlainCh>0</PlainCh> + <Ropi>0</Ropi> + <Rwpi>0</Rwpi> + <wLevel>0</wLevel> + <uThumb>0</uThumb> + <VariousControls> + <MiscControls></MiscControls> + <Define>CORTEX_M0PLUS</Define> + <Undefine></Undefine> + <IncludePath>..\..\..\..\software\cmsis\CMSIS\Include; ..\..\..\..\software\cmsis\Device\ARM\CMSDK_CM0plus\Include; ..\..\..\..\software\common\retarget</IncludePath> + </VariousControls> + </Cads> + <Aads> + <interw>1</interw> + <Ropi>0</Ropi> + <Rwpi>0</Rwpi> + <thumb>0</thumb> + <SplitLS>0</SplitLS> + <SwStkChk>0</SwStkChk> + <NoWarn>0</NoWarn> + <VariousControls> + <MiscControls></MiscControls> + <Define></Define> + <Undefine></Undefine> + <IncludePath></IncludePath> + </VariousControls> + </Aads> + <LDads> + <umfTarg>1</umfTarg> + <Ropi>0</Ropi> + <Rwpi>0</Rwpi> + <noStLib>0</noStLib> + <RepFail>1</RepFail> + <useFile>0</useFile> + <TextAddressRange>0x00000000</TextAddressRange> + <DataAddressRange>0x00000000</DataAddressRange> + <ScatterFile></ScatterFile> + <IncludeLibs></IncludeLibs> + <IncludeLibsPath></IncludeLibsPath> + <Misc></Misc> + <LinkerInputFile></LinkerInputFile> + <DisabledWarnings></DisabledWarnings> + </LDads> + </TargetArmAds> + </TargetOption> + <Groups> + <Group> + <GroupName>Startup</GroupName> + <Files> + <File> + <FileName>startup_CMSDK_CM0plus.s</FileName> + <FileType>2</FileType> + <FilePath>..\..\..\..\software\cmsis\Device\ARM\CMSDK_CM0plus\Source\ARM\startup_CMSDK_CM0plus.s</FilePath> + </File> + </Files> + </Group> + <Group> + <GroupName>Application</GroupName> + <Files> + <File> + <FileName>self_reset_demo.c</FileName> + <FileType>1</FileType> + <FilePath>..\..\..\..\software\common\demos\self_reset_demo.c</FilePath> + </File> + <File> + <FileName>retarget.c</FileName> + <FileType>1</FileType> + <FilePath>..\..\..\..\software\common\retarget\retarget.c</FilePath> + </File> + <File> + <FileName>uart_stdout.c</FileName> + <FileType>1</FileType> + <FilePath>..\..\..\..\software\common\retarget\uart_stdout.c</FilePath> + </File> + </Files> + </Group> + <Group> + <GroupName>System</GroupName> + <Files> + <File> + <FileName>system_CMSDK_CM0plus.c</FileName> + <FileType>1</FileType> + <FilePath>..\..\..\..\software\cmsis\Device\ARM\CMSDK_CM0plus\Source\system_CMSDK_CM0plus.c</FilePath> + </File> + </Files> + </Group> + </Groups> + </Target> + </Targets> + +</Project> diff --git a/Cortex-M0/nanosoc/systems/mcu/testcodes/setup_ds5_tools.scr b/Cortex-M0/nanosoc/systems/mcu/testcodes/setup_ds5_tools.scr new file mode 100644 index 0000000..fa703ec --- /dev/null +++ b/Cortex-M0/nanosoc/systems/mcu/testcodes/setup_ds5_tools.scr @@ -0,0 +1,6 @@ +export ARM_PRODUCT_PATH=/apps/arm/developmentstudio-2021.0/sw/mappings +export ARM_TOOL_VARIANT=gold +export PATH=$PATH:/apps/arm/developmentstudio-2021.0/sw/ARMCompiler5.06u7/bin/ + + + diff --git a/Cortex-M0/nanosoc/systems/mcu/testcodes/sleep_demo/makefile b/Cortex-M0/nanosoc/systems/mcu/testcodes/sleep_demo/makefile new file mode 100644 index 0000000..504d509 --- /dev/null +++ b/Cortex-M0/nanosoc/systems/mcu/testcodes/sleep_demo/makefile @@ -0,0 +1,256 @@ +#----------------------------------------------------------------------------- +# The confidential and proprietary information contained in this file may +# only be used by a person authorised under and to the extent permitted +# by a subsisting licensing agreement from Arm Limited or its affiliates. +# +# (C) COPYRIGHT 2010-2013 Arm Limited or its affiliates. +# ALL RIGHTS RESERVED +# +# This entire notice must be reproduced on all copies of this file +# and copies of this file may only be made by a person if such person is +# permitted to do so under the terms of a subsisting license agreement +# from Arm Limited or its affiliates. +# +# SVN Information +# +# Checked In : $Date: 2010-08-06 12:28:21 +0100 (Fri, 06 Aug 2010) $ +# +# Revision : $Revision: 145378 $ +# +# Release Information : Cortex-M System Design Kit-r1p1-00rel0 +#----------------------------------------------------------------------------- +# +# Cortex-M System Design Kit software compilation make file +# +#----------------------------------------------------------------------------- +# +# Configurations +# +# Choose the core instantiated, can be +# - CORTEX_M0 +# - CORTEX_M0PLUS +CPU_PRODUCT = CORTEX_M0PLUS + +# Shared software directory +SOFTWARE_DIR = ../../../../software +CMSIS_DIR = $(SOFTWARE_DIR)/cmsis +CORE_DIR = $(CMSIS_DIR)/CMSIS/Include + +ifeq ($(CPU_PRODUCT),CORTEX_M0PLUS) + DEVICE_DIR = $(CMSIS_DIR)/Device/ARM/CMSDK_CM0plus +else + DEVICE_DIR = $(CMSIS_DIR)/Device/ARM/CMSDK_CM0 +endif + +# Program file +TESTNAME = sleep_demo + +# Endian Option +COMPILE_BIGEND = 0 + +# Configuration +ifeq ($(CPU_PRODUCT),CORTEX_M0PLUS) + USER_DEFINE = -DCORTEX_M0PLUS +else + USER_DEFINE = -DCORTEX_M0 +endif + + +DEPS_LIST = makefile + +# Tool chain : ds5 / gcc / keil +TOOL_CHAIN = ds5 + +ifeq ($(TOOL_CHAIN),ds5) + ifeq ($(CPU_PRODUCT),CORTEX_M0PLUS) + CPU_TYPE = --cpu Cortex-M0plus + else + CPU_TYPE = --cpu Cortex-M0 + endif +endif + +ifeq ($(TOOL_CHAIN),gcc) + ifeq ($(CPU_PRODUCT),CORTEX_M0PLUS) + CPU_TYPE = -mcpu=cortex-m0plus + else + CPU_TYPE = -mcpu=cortex-m0 + endif +endif + +# Startup code directory for DS-5 +ifeq ($(TOOL_CHAIN),ds5) + STARTUP_DIR = $(DEVICE_DIR)/Source/ARM +endif + +# Startup code directory for gcc +ifeq ($(TOOL_CHAIN),gcc) + STARTUP_DIR = $(DEVICE_DIR)/Source/GCC +endif + +ifeq ($(CPU_PRODUCT),CORTEX_M0PLUS) + STARTUP_FILE = startup_CMSDK_CM0plus + SYSTEM_FILE = system_CMSDK_CM0plus +else + STARTUP_FILE = startup_CMSDK_CM0 + SYSTEM_FILE = system_CMSDK_CM0 +endif + +# --------------------------------------------------------------------------------------- +# DS-5 options + +# MicroLIB option (DS-5) +COMPILE_MICROLIB = 0 + +# Small Multiply (Cortex-M0/M0+ has small multiplier option) +COMPILE_SMALLMUL = 0 + +ARM_CC_OPTIONS = -c -O3 -g -Otime $(USER_DEFINE) \ + -I $(DEVICE_DIR)/Include -I $(CORE_DIR) -I $(SOFTWARE_DIR)/common/retarget +ARM_ASM_OPTIONS = -g +ARM_LINK_OPTIONS = "--keep=$(STARTUP_FILE).o(RESET)" "--first=$(STARTUP_FILE).o(RESET)" \ + --rw_base 0x30000000 --ro_base 0x00000000 --map + +ifeq ($(COMPILE_BIGEND),1) + # Big Endian + ARM_CC_OPTIONS += --bigend + ARM_ASM_OPTIONS += --bigend + ARM_LINK_OPTIONS += --be8 +endif + +ifeq ($(COMPILE_MICROLIB),1) + # MicroLIB + ARM_CC_OPTIONS += --library_type=microlib + ARM_ASM_OPTIONS += --library_type=microlib --pd "__MICROLIB SETA 1" + ARM_LINK_OPTIONS += --library_type=microlib +endif + +ifeq ($(COMPILE_SMALLMUL),1) + # In Cortex-M0, small multiply takes 32 cycles + ARM_CC_OPTIONS += --multiply_latency=32 +endif + +# --------------------------------------------------------------------------------------- +# gcc options + +GNG_CC = arm-none-eabi-gcc +GNU_OBJDUMP = arm-none-eabi-objdump +GNU_OBJCOPY = arm-none-eabi-objcopy + +LINKER_SCRIPT_PATH = $(SOFTWARE_DIR)/common/scripts +LINKER_SCRIPT = $(LINKER_SCRIPT_PATH)/cmsdk_cm0.ld + +GNU_CC_FLAGS = -g -O3 -mthumb $(CPU_TYPE) + +ifeq ($(COMPILE_BIGEND),1) + # Big Endian + GNU_CC_FLAGS += -mbig-endian +endif + +# --------------------------------------------------------------------------------------- +all: all_$(TOOL_CHAIN) + +# --------------------------------------------------------------------------------------- +# DS-5 + +all_ds5 : $(TESTNAME).hex $(TESTNAME).lst + +$(TESTNAME).o : $(SOFTWARE_DIR)/common/demos/$(TESTNAME).c $(DEPS_LIST) + armcc $(ARM_CC_OPTIONS) $(CPU_TYPE) $< -o $@ + +$(SYSTEM_FILE).o : $(DEVICE_DIR)/Source/$(SYSTEM_FILE).c $(DEPS_LIST) + armcc $(ARM_CC_OPTIONS) $(CPU_TYPE) $< -o $@ + +retarget.o : $(SOFTWARE_DIR)/common/retarget/retarget.c $(DEPS_LIST) + armcc $(ARM_CC_OPTIONS) $(CPU_TYPE) $< -o $@ + +uart_stdout.o : $(SOFTWARE_DIR)/common/retarget/uart_stdout.c $(DEPS_LIST) + armcc $(ARM_CC_OPTIONS) $(CPU_TYPE) $< -o $@ + +CMSDK_driver.o : $(DEVICE_DIR)/Source/CMSDK_driver.c $(DEPS_LIST) + armcc $(ARM_CC_OPTIONS) $(CPU_TYPE) $< -o $@ + +$(STARTUP_FILE).o : $(STARTUP_DIR)/$(STARTUP_FILE).s $(DEPS_LIST) + armasm $(ARM_ASM_OPTIONS) $(CPU_TYPE) $< -o $@ + +$(TESTNAME).ELF : $(TESTNAME).o $(SYSTEM_FILE).o $(STARTUP_FILE).o retarget.o uart_stdout.o CMSDK_driver.o + armlink $(ARM_LINK_OPTIONS) -o $@ $(TESTNAME).o $(SYSTEM_FILE).o $(STARTUP_FILE).o retarget.o uart_stdout.o CMSDK_driver.o + +$(TESTNAME).hex : $(TESTNAME).ELF + fromelf --vhx --8x1 $< --output $@ + +$(TESTNAME).lst : $(TESTNAME).ELF makefile + fromelf -c -d -e -s $< --output $@ + +# --------------------------------------------------------------------------------------- +# gcc +all_gcc: + $(GNG_CC) $(GNU_CC_FLAGS) $(STARTUP_DIR)/$(STARTUP_FILE).s \ + $(SOFTWARE_DIR)/common/demos/$(TESTNAME).c \ + $(SOFTWARE_DIR)/common/retarget/retarget.c \ + $(SOFTWARE_DIR)/common/retarget/uart_stdout.c \ + $(DEVICE_DIR)/Source/CMSDK_driver.c \ + $(DEVICE_DIR)/Source/$(SYSTEM_FILE).c \ + -I $(DEVICE_DIR)/Include -I $(CORE_DIR) \ + -I $(SOFTWARE_DIR)/common/retarget \ + -L $(LINKER_SCRIPT_PATH) \ + -D__STACK_SIZE=0x200 \ + -D__HEAP_SIZE=0x1000 \ + $(USER_DEFINE) -T $(LINKER_SCRIPT) -o $(TESTNAME).o + # Generate disassembly code + $(GNU_OBJDUMP) -S $(TESTNAME).o > $(TESTNAME).lst + # Generate binary file + $(GNU_OBJCOPY) -S $(TESTNAME).o -O binary $(TESTNAME).bin + # Generate hex file + $(GNU_OBJCOPY) -S $(TESTNAME).o -O verilog $(TESTNAME).hex + +# Note: +# If the version of object copy you are using does not support verilog hex file output, +# you can generate the hex file from binary file using the following command +# od -v -A n -t x1 --width=1 $(TESTNAME).bin > $(TESTNAME).hex + +# --------------------------------------------------------------------------------------- +# Keil MDK + +all_keil: + @echo "Please compile your project code and press ENTER when ready" + @read dummy + +# --------------------------------------------------------------------------------------- +# Binary + +all_bin: $(TESTNAME).bin + # Generate hex file from binary + od -v -A n -t x1 --width=1 $(TESTNAME).bin > $(TESTNAME).hex + + +# --------------------------------------------------------------------------------------- +# Clean + +clean : + @rm -rf *.o + @if [ -e $(TESTNAME).hex ] ; then \ + rm -rf $(TESTNAME).hex ; \ + fi + @if [ -e $(TESTNAME).lst ] ; then \ + rm -rf $(TESTNAME).lst ; \ + fi + @if [ -e $(TESTNAME).ELF ] ; then \ + rm -rf $(TESTNAME).ELF ; \ + fi + @if [ -e $(TESTNAME).bin ] ; then \ + rm -rf $(TESTNAME).bin ; \ + fi + @rm -rf *.crf + @rm -rf *.plg + @rm -rf *.tra + @rm -rf *.htm + @rm -rf *.map + @rm -rf *.dep + @rm -rf *.d + @rm -rf *.lnp + @rm -rf *.bak + @rm -rf *.lst + @rm -rf *.axf + @rm -rf *.sct + @rm -rf *.__i + @rm -rf *._ia diff --git a/Cortex-M0/nanosoc/systems/mcu/testcodes/sleep_demo/sleep_demo_cm0.uvopt b/Cortex-M0/nanosoc/systems/mcu/testcodes/sleep_demo/sleep_demo_cm0.uvopt new file mode 100644 index 0000000..e742bfa --- /dev/null +++ b/Cortex-M0/nanosoc/systems/mcu/testcodes/sleep_demo/sleep_demo_cm0.uvopt @@ -0,0 +1,277 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no" ?> +<ProjectOpt xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="project_opt.xsd"> + + <SchemaVersion>1.0</SchemaVersion> + + <Header>### uVision Project, (C) Keil Software</Header> + + <Extensions> + <cExt>*.c</cExt> + <aExt>*.s*; *.src; *.a*</aExt> + <oExt>*.obj</oExt> + <lExt>*.lib</lExt> + <tExt>*.txt; *.h; *.inc</tExt> + <pExt>*.plm</pExt> + <CppX>*.cpp</CppX> + </Extensions> + + <DaveTm> + <dwLowDateTime>0</dwLowDateTime> + <dwHighDateTime>0</dwHighDateTime> + </DaveTm> + + <Target> + <TargetName>Debug</TargetName> + <ToolsetNumber>0x4</ToolsetNumber> + <ToolsetName>ARM-ADS</ToolsetName> + <TargetOption> + <CLKADS>50000000</CLKADS> + <OPTTT> + <gFlags>1</gFlags> + <BeepAtEnd>1</BeepAtEnd> + <RunSim>1</RunSim> + <RunTarget>0</RunTarget> + </OPTTT> + <OPTHX> + <HexSelection>1</HexSelection> + <FlashByte>65535</FlashByte> + <HexRangeLowAddress>0</HexRangeLowAddress> + <HexRangeHighAddress>0</HexRangeHighAddress> + <HexOffset>0</HexOffset> + </OPTHX> + <OPTLEX> + <PageWidth>79</PageWidth> + <PageLength>66</PageLength> + <TabStop>8</TabStop> + <ListingPath>.\</ListingPath> + </OPTLEX> + <ListingPage> + <CreateCListing>1</CreateCListing> + <CreateAListing>1</CreateAListing> + <CreateLListing>1</CreateLListing> + <CreateIListing>0</CreateIListing> + <AsmCond>1</AsmCond> + <AsmSymb>1</AsmSymb> + <AsmXref>0</AsmXref> + <CCond>1</CCond> + <CCode>0</CCode> + <CListInc>0</CListInc> + <CSymb>0</CSymb> + <LinkerCodeListing>0</LinkerCodeListing> + </ListingPage> + <OPTXL> + <LMap>1</LMap> + <LComments>1</LComments> + <LGenerateSymbols>1</LGenerateSymbols> + <LLibSym>1</LLibSym> + <LLines>1</LLines> + <LLocSym>1</LLocSym> + <LPubSym>1</LPubSym> + <LXref>0</LXref> + <LExpSel>0</LExpSel> + </OPTXL> + <OPTFL> + <tvExp>1</tvExp> + <tvExpOptDlg>0</tvExpOptDlg> + <IsCurrentTarget>1</IsCurrentTarget> + </OPTFL> + <CpuCode>255</CpuCode> + <DllOpt> + <SimDllName>SARMCM3.DLL</SimDllName> + <SimDllArguments></SimDllArguments> + <SimDlgDllName>DARMCM1.DLL</SimDlgDllName> + <SimDlgDllArguments></SimDlgDllArguments> + <TargetDllName>SARMCM3.DLL</TargetDllName> + <TargetDllArguments></TargetDllArguments> + <TargetDlgDllName>TARMCM1.DLL</TargetDlgDllName> + <TargetDlgDllArguments></TargetDlgDllArguments> + </DllOpt> + <DebugOpt> + <uSim>1</uSim> + <uTrg>0</uTrg> + <sLdApp>1</sLdApp> + <sGomain>1</sGomain> + <sRbreak>1</sRbreak> + <sRwatch>1</sRwatch> + <sRmem>1</sRmem> + <sRfunc>1</sRfunc> + <sRbox>1</sRbox> + <tLdApp>1</tLdApp> + <tGomain>0</tGomain> + <tRbreak>1</tRbreak> + <tRwatch>1</tRwatch> + <tRmem>1</tRmem> + <tRfunc>0</tRfunc> + <tRbox>1</tRbox> + <tRtrace>0</tRtrace> + <sRunDeb>0</sRunDeb> + <sLrtime>0</sLrtime> + <nTsel>-1</nTsel> + <sDll></sDll> + <sDllPa></sDllPa> + <sDlgDll></sDlgDll> + <sDlgPa></sDlgPa> + <sIfile></sIfile> + <tDll></tDll> + <tDllPa></tDllPa> + <tDlgDll></tDlgDll> + <tDlgPa></tDlgPa> + <tIfile></tIfile> + <pMon></pMon> + </DebugOpt> + <Breakpoint/> + <DebugFlag> + <trace>0</trace> + <periodic>1</periodic> + <aLwin>0</aLwin> + <aCover>0</aCover> + <aSer1>0</aSer1> + <aSer2>0</aSer2> + <aPa>0</aPa> + <viewmode>0</viewmode> + <vrSel>0</vrSel> + <aSym>0</aSym> + <aTbox>0</aTbox> + <AscS1>0</AscS1> + <AscS2>0</AscS2> + <AscS3>0</AscS3> + <aSer3>0</aSer3> + <eProf>0</eProf> + <aLa>0</aLa> + <aPa1>0</aPa1> + <AscS4>0</AscS4> + <aSer4>0</aSer4> + <StkLoc>0</StkLoc> + <TrcWin>0</TrcWin> + <newCpu>0</newCpu> + <uProt>0</uProt> + </DebugFlag> + <Tracepoint> + <THDelay>0</THDelay> + </Tracepoint> + <LintExecutable></LintExecutable> + <LintConfigFile></LintConfigFile> + </TargetOption> + </Target> + + <Group> + <GroupName>Startup</GroupName> + <tvExp>1</tvExp> + <tvExpOptDlg>0</tvExpOptDlg> + <cbSel>0</cbSel> + <RteFlg>0</RteFlg> + <File> + <GroupNumber>1</GroupNumber> + <FileNumber>1</FileNumber> + <FileType>2</FileType> + <tvExp>0</tvExp> + <Focus>0</Focus> + <ColumnNumber>0</ColumnNumber> + <tvExpOptDlg>0</tvExpOptDlg> + <TopLine>0</TopLine> + <CurrentLine>0</CurrentLine> + <bDave2>0</bDave2> + <PathWithFileName>..\..\..\..\software\cmsis\Device\ARM\CMSDK_CM0\Source\ARM\startup_CMSDK_CM0.s</PathWithFileName> + <FilenameWithoutPath>startup_CMSDK_CM0.s</FilenameWithoutPath> + <RteFlg>0</RteFlg> + <bShared>0</bShared> + </File> + </Group> + + <Group> + <GroupName>Application</GroupName> + <tvExp>1</tvExp> + <tvExpOptDlg>0</tvExpOptDlg> + <cbSel>0</cbSel> + <RteFlg>0</RteFlg> + <File> + <GroupNumber>2</GroupNumber> + <FileNumber>2</FileNumber> + <FileType>1</FileType> + <tvExp>0</tvExp> + <Focus>0</Focus> + <ColumnNumber>0</ColumnNumber> + <tvExpOptDlg>0</tvExpOptDlg> + <TopLine>0</TopLine> + <CurrentLine>0</CurrentLine> + <bDave2>0</bDave2> + <PathWithFileName>..\..\..\..\software\common\demos\sleep_demo.c</PathWithFileName> + <FilenameWithoutPath>sleep_demo.c</FilenameWithoutPath> + <RteFlg>0</RteFlg> + <bShared>0</bShared> + </File> + <File> + <GroupNumber>2</GroupNumber> + <FileNumber>3</FileNumber> + <FileType>1</FileType> + <tvExp>0</tvExp> + <Focus>0</Focus> + <ColumnNumber>0</ColumnNumber> + <tvExpOptDlg>0</tvExpOptDlg> + <TopLine>0</TopLine> + <CurrentLine>0</CurrentLine> + <bDave2>0</bDave2> + <PathWithFileName>..\..\..\..\software\common\retarget\retarget.c</PathWithFileName> + <FilenameWithoutPath>retarget.c</FilenameWithoutPath> + <RteFlg>0</RteFlg> + <bShared>0</bShared> + </File> + <File> + <GroupNumber>2</GroupNumber> + <FileNumber>4</FileNumber> + <FileType>1</FileType> + <tvExp>0</tvExp> + <Focus>0</Focus> + <ColumnNumber>0</ColumnNumber> + <tvExpOptDlg>0</tvExpOptDlg> + <TopLine>0</TopLine> + <CurrentLine>0</CurrentLine> + <bDave2>0</bDave2> + <PathWithFileName>..\..\..\..\software\common\retarget\uart_stdout.c</PathWithFileName> + <FilenameWithoutPath>uart_stdout.c</FilenameWithoutPath> + <RteFlg>0</RteFlg> + <bShared>0</bShared> + </File> + <File> + <GroupNumber>2</GroupNumber> + <FileNumber>5</FileNumber> + <FileType>1</FileType> + <tvExp>0</tvExp> + <Focus>0</Focus> + <ColumnNumber>0</ColumnNumber> + <tvExpOptDlg>0</tvExpOptDlg> + <TopLine>0</TopLine> + <CurrentLine>0</CurrentLine> + <bDave2>0</bDave2> + <PathWithFileName>..\..\..\..\software\cmsis\Device\ARM\CMSDK_CM0\Source\CMSDK_driver.c</PathWithFileName> + <FilenameWithoutPath>CMSDK_driver.c</FilenameWithoutPath> + <RteFlg>0</RteFlg> + <bShared>0</bShared> + </File> + </Group> + + <Group> + <GroupName>System</GroupName> + <tvExp>1</tvExp> + <tvExpOptDlg>0</tvExpOptDlg> + <cbSel>0</cbSel> + <RteFlg>0</RteFlg> + <File> + <GroupNumber>3</GroupNumber> + <FileNumber>6</FileNumber> + <FileType>1</FileType> + <tvExp>0</tvExp> + <Focus>0</Focus> + <ColumnNumber>0</ColumnNumber> + <tvExpOptDlg>0</tvExpOptDlg> + <TopLine>0</TopLine> + <CurrentLine>0</CurrentLine> + <bDave2>0</bDave2> + <PathWithFileName>..\..\..\..\software\cmsis\Device\ARM\CMSDK_CM0\Source\system_CMSDK_CM0.c</PathWithFileName> + <FilenameWithoutPath>system_CMSDK_CM0.c</FilenameWithoutPath> + <RteFlg>0</RteFlg> + <bShared>0</bShared> + </File> + </Group> + +</ProjectOpt> diff --git a/Cortex-M0/nanosoc/systems/mcu/testcodes/sleep_demo/sleep_demo_cm0.uvproj b/Cortex-M0/nanosoc/systems/mcu/testcodes/sleep_demo/sleep_demo_cm0.uvproj new file mode 100644 index 0000000..e2c4d05 --- /dev/null +++ b/Cortex-M0/nanosoc/systems/mcu/testcodes/sleep_demo/sleep_demo_cm0.uvproj @@ -0,0 +1,440 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no" ?> +<Project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="project_proj.xsd"> + + <SchemaVersion>1.1</SchemaVersion> + + <Header>### uVision Project, (C) Keil Software</Header> + + <Targets> + <Target> + <TargetName>Debug</TargetName> + <ToolsetNumber>0x4</ToolsetNumber> + <ToolsetName>ARM-ADS</ToolsetName> + <TargetOption> + <TargetCommonOption> + <Device>Cortex-M0</Device> + <Vendor>ARM</Vendor> + <Cpu>CLOCK(12000000) CPUTYPE("Cortex-M0") ESEL ELITTLE</Cpu> + <FlashUtilSpec></FlashUtilSpec> + <StartupFile></StartupFile> + <FlashDriverDll></FlashDriverDll> + <DeviceId>4803</DeviceId> + <RegisterFile></RegisterFile> + <MemoryEnv></MemoryEnv> + <Cmp></Cmp> + <Asm></Asm> + <Linker></Linker> + <OHString></OHString> + <InfinionOptionDll></InfinionOptionDll> + <SLE66CMisc></SLE66CMisc> + <SLE66AMisc></SLE66AMisc> + <SLE66LinkerMisc></SLE66LinkerMisc> + <SFDFile></SFDFile> + <UseEnv>0</UseEnv> + <BinPath></BinPath> + <IncludePath></IncludePath> + <LibPath></LibPath> + <RegisterFilePath></RegisterFilePath> + <DBRegisterFilePath></DBRegisterFilePath> + <TargetStatus> + <Error>0</Error> + <ExitCodeStop>0</ExitCodeStop> + <ButtonStop>0</ButtonStop> + <NotGenerated>0</NotGenerated> + <InvalidFlash>1</InvalidFlash> + </TargetStatus> + <OutputDirectory>.\</OutputDirectory> + <OutputName>sleep_demo</OutputName> + <CreateExecutable>1</CreateExecutable> + <CreateLib>0</CreateLib> + <CreateHexFile>0</CreateHexFile> + <DebugInformation>1</DebugInformation> + <BrowseInformation>1</BrowseInformation> + <ListingPath>.\</ListingPath> + <HexFormatSelection>1</HexFormatSelection> + <Merge32K>0</Merge32K> + <CreateBatchFile>0</CreateBatchFile> + <BeforeCompile> + <RunUserProg1>0</RunUserProg1> + <RunUserProg2>0</RunUserProg2> + <UserProg1Name></UserProg1Name> + <UserProg2Name></UserProg2Name> + <UserProg1Dos16Mode>0</UserProg1Dos16Mode> + <UserProg2Dos16Mode>0</UserProg2Dos16Mode> + <nStopU1X>0</nStopU1X> + <nStopU2X>0</nStopU2X> + </BeforeCompile> + <BeforeMake> + <RunUserProg1>0</RunUserProg1> + <RunUserProg2>0</RunUserProg2> + <UserProg1Name></UserProg1Name> + <UserProg2Name></UserProg2Name> + <UserProg1Dos16Mode>0</UserProg1Dos16Mode> + <UserProg2Dos16Mode>0</UserProg2Dos16Mode> + </BeforeMake> + <AfterMake> + <RunUserProg1>1</RunUserProg1> + <RunUserProg2>0</RunUserProg2> + <UserProg1Name>$K\ARM\ARMCC\BIN\fromelf.exe #L --vhx --8x1 --output sleep_demo.hex</UserProg1Name> + <UserProg2Name></UserProg2Name> + <UserProg1Dos16Mode>0</UserProg1Dos16Mode> + <UserProg2Dos16Mode>0</UserProg2Dos16Mode> + </AfterMake> + <SelectedForBatchBuild>0</SelectedForBatchBuild> + <SVCSIdString></SVCSIdString> + </TargetCommonOption> + <CommonProperty> + <UseCPPCompiler>0</UseCPPCompiler> + <RVCTCodeConst>0</RVCTCodeConst> + <RVCTZI>0</RVCTZI> + <RVCTOtherData>0</RVCTOtherData> + <ModuleSelection>0</ModuleSelection> + <IncludeInBuild>1</IncludeInBuild> + <AlwaysBuild>0</AlwaysBuild> + <GenerateAssemblyFile>0</GenerateAssemblyFile> + <AssembleAssemblyFile>0</AssembleAssemblyFile> + <PublicsOnly>0</PublicsOnly> + <StopOnExitCode>3</StopOnExitCode> + <CustomArgument></CustomArgument> + <IncludeLibraryModules></IncludeLibraryModules> + </CommonProperty> + <DllOption> + <SimDllName>SARMCM3.DLL</SimDllName> + <SimDllArguments></SimDllArguments> + <SimDlgDll>DARMCM1.DLL</SimDlgDll> + <SimDlgDllArguments></SimDlgDllArguments> + <TargetDllName>SARMCM3.DLL</TargetDllName> + <TargetDllArguments></TargetDllArguments> + <TargetDlgDll>TARMCM1.DLL</TargetDlgDll> + <TargetDlgDllArguments></TargetDlgDllArguments> + </DllOption> + <DebugOption> + <OPTHX> + <HexSelection>1</HexSelection> + <HexRangeLowAddress>0</HexRangeLowAddress> + <HexRangeHighAddress>0</HexRangeHighAddress> + <HexOffset>0</HexOffset> + <Oh166RecLen>16</Oh166RecLen> + </OPTHX> + <Simulator> + <UseSimulator>1</UseSimulator> + <LoadApplicationAtStartup>1</LoadApplicationAtStartup> + <RunToMain>1</RunToMain> + <RestoreBreakpoints>1</RestoreBreakpoints> + <RestoreWatchpoints>1</RestoreWatchpoints> + <RestoreMemoryDisplay>1</RestoreMemoryDisplay> + <RestoreFunctions>1</RestoreFunctions> + <RestoreToolbox>1</RestoreToolbox> + <LimitSpeedToRealTime>0</LimitSpeedToRealTime> + </Simulator> + <Target> + <UseTarget>0</UseTarget> + <LoadApplicationAtStartup>1</LoadApplicationAtStartup> + <RunToMain>0</RunToMain> + <RestoreBreakpoints>1</RestoreBreakpoints> + <RestoreWatchpoints>1</RestoreWatchpoints> + <RestoreMemoryDisplay>1</RestoreMemoryDisplay> + <RestoreFunctions>0</RestoreFunctions> + <RestoreToolbox>1</RestoreToolbox> + <RestoreTracepoints>0</RestoreTracepoints> + </Target> + <RunDebugAfterBuild>0</RunDebugAfterBuild> + <TargetSelection>-1</TargetSelection> + <SimDlls> + <CpuDll></CpuDll> + <CpuDllArguments></CpuDllArguments> + <PeripheralDll></PeripheralDll> + <PeripheralDllArguments></PeripheralDllArguments> + <InitializationFile></InitializationFile> + </SimDlls> + <TargetDlls> + <CpuDll></CpuDll> + <CpuDllArguments></CpuDllArguments> + <PeripheralDll></PeripheralDll> + <PeripheralDllArguments></PeripheralDllArguments> + <InitializationFile></InitializationFile> + <Driver></Driver> + </TargetDlls> + </DebugOption> + <Utilities> + <Flash1> + <UseTargetDll>0</UseTargetDll> + <UseExternalTool>0</UseExternalTool> + <RunIndependent>0</RunIndependent> + <UpdateFlashBeforeDebugging>0</UpdateFlashBeforeDebugging> + <Capability>0</Capability> + <DriverSelection>-1</DriverSelection> + </Flash1> + <Flash2></Flash2> + <Flash3></Flash3> + <Flash4></Flash4> + </Utilities> + <TargetArmAds> + <ArmAdsMisc> + <GenerateListings>0</GenerateListings> + <asHll>1</asHll> + <asAsm>1</asAsm> + <asMacX>1</asMacX> + <asSyms>1</asSyms> + <asFals>1</asFals> + <asDbgD>1</asDbgD> + <asForm>1</asForm> + <ldLst>0</ldLst> + <ldmm>1</ldmm> + <ldXref>1</ldXref> + <BigEnd>0</BigEnd> + <AdsALst>1</AdsALst> + <AdsACrf>1</AdsACrf> + <AdsANop>0</AdsANop> + <AdsANot>0</AdsANot> + <AdsLLst>1</AdsLLst> + <AdsLmap>1</AdsLmap> + <AdsLcgr>1</AdsLcgr> + <AdsLsym>1</AdsLsym> + <AdsLszi>1</AdsLszi> + <AdsLtoi>1</AdsLtoi> + <AdsLsun>1</AdsLsun> + <AdsLven>1</AdsLven> + <AdsLsxf>1</AdsLsxf> + <RvctClst>0</RvctClst> + <GenPPlst>0</GenPPlst> + <AdsCpuType>"Cortex-M0"</AdsCpuType> + <RvctDeviceName></RvctDeviceName> + <mOS>0</mOS> + <uocRom>0</uocRom> + <uocRam>0</uocRam> + <hadIROM>0</hadIROM> + <hadIRAM>0</hadIRAM> + <hadXRAM>0</hadXRAM> + <uocXRam>0</uocXRam> + <RvdsVP>0</RvdsVP> + <hadIRAM2>0</hadIRAM2> + <hadIROM2>0</hadIROM2> + <StupSel>1</StupSel> + <useUlib>0</useUlib> + <EndSel>1</EndSel> + <uLtcg>0</uLtcg> + <RoSelD>0</RoSelD> + <RwSelD>5</RwSelD> + <CodeSel>0</CodeSel> + <OptFeed>0</OptFeed> + <NoZi1>0</NoZi1> + <NoZi2>0</NoZi2> + <NoZi3>0</NoZi3> + <NoZi4>0</NoZi4> + <NoZi5>0</NoZi5> + <Ro1Chk>1</Ro1Chk> + <Ro2Chk>0</Ro2Chk> + <Ro3Chk>0</Ro3Chk> + <Ir1Chk>0</Ir1Chk> + <Ir2Chk>0</Ir2Chk> + <Ra1Chk>1</Ra1Chk> + <Ra2Chk>0</Ra2Chk> + <Ra3Chk>0</Ra3Chk> + <Im1Chk>0</Im1Chk> + <Im2Chk>0</Im2Chk> + <OnChipMemories> + <Ocm1> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </Ocm1> + <Ocm2> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </Ocm2> + <Ocm3> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </Ocm3> + <Ocm4> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </Ocm4> + <Ocm5> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </Ocm5> + <Ocm6> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </Ocm6> + <IRAM> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </IRAM> + <IROM> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </IROM> + <XRAM> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </XRAM> + <OCR_RVCT1> + <Type>1</Type> + <StartAddress>0x0</StartAddress> + <Size>0x10000</Size> + </OCR_RVCT1> + <OCR_RVCT2> + <Type>1</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </OCR_RVCT2> + <OCR_RVCT3> + <Type>1</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </OCR_RVCT3> + <OCR_RVCT4> + <Type>1</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </OCR_RVCT4> + <OCR_RVCT5> + <Type>1</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </OCR_RVCT5> + <OCR_RVCT6> + <Type>0</Type> + <StartAddress>0x20000000</StartAddress> + <Size>0x10000</Size> + </OCR_RVCT6> + <OCR_RVCT7> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </OCR_RVCT7> + <OCR_RVCT8> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </OCR_RVCT8> + <OCR_RVCT9> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </OCR_RVCT9> + <OCR_RVCT10> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </OCR_RVCT10> + </OnChipMemories> + <RvctStartVector></RvctStartVector> + </ArmAdsMisc> + <Cads> + <interw>1</interw> + <Optim>4</Optim> + <oTime>0</oTime> + <SplitLS>0</SplitLS> + <OneElfS>0</OneElfS> + <Strict>0</Strict> + <EnumInt>0</EnumInt> + <PlainCh>0</PlainCh> + <Ropi>0</Ropi> + <Rwpi>0</Rwpi> + <wLevel>0</wLevel> + <uThumb>0</uThumb> + <uSurpInc>0</uSurpInc> + <VariousControls> + <MiscControls></MiscControls> + <Define>CORTEX_M0</Define> + <Undefine></Undefine> + <IncludePath>..\..\..\..\software\cmsis\CMSIS\Include; ..\..\..\..\software\cmsis\Device\ARM\CMSDK_CM0\Include; ..\..\..\..\software\common\retarget</IncludePath> + </VariousControls> + </Cads> + <Aads> + <interw>1</interw> + <Ropi>0</Ropi> + <Rwpi>0</Rwpi> + <thumb>0</thumb> + <SplitLS>0</SplitLS> + <SwStkChk>0</SwStkChk> + <NoWarn>0</NoWarn> + <uSurpInc>0</uSurpInc> + <VariousControls> + <MiscControls></MiscControls> + <Define></Define> + <Undefine></Undefine> + <IncludePath></IncludePath> + </VariousControls> + </Aads> + <LDads> + <umfTarg>1</umfTarg> + <Ropi>0</Ropi> + <Rwpi>0</Rwpi> + <noStLib>0</noStLib> + <RepFail>1</RepFail> + <useFile>0</useFile> + <TextAddressRange>0x00000000</TextAddressRange> + <DataAddressRange>0x00000000</DataAddressRange> + <ScatterFile></ScatterFile> + <IncludeLibs></IncludeLibs> + <IncludeLibsPath></IncludeLibsPath> + <Misc></Misc> + <LinkerInputFile></LinkerInputFile> + <DisabledWarnings></DisabledWarnings> + </LDads> + </TargetArmAds> + </TargetOption> + <Groups> + <Group> + <GroupName>Startup</GroupName> + <Files> + <File> + <FileName>startup_CMSDK_CM0.s</FileName> + <FileType>2</FileType> + <FilePath>..\..\..\..\software\cmsis\Device\ARM\CMSDK_CM0\Source\ARM\startup_CMSDK_CM0.s</FilePath> + </File> + </Files> + </Group> + <Group> + <GroupName>Application</GroupName> + <Files> + <File> + <FileName>sleep_demo.c</FileName> + <FileType>1</FileType> + <FilePath>..\..\..\..\software\common\demos\sleep_demo.c</FilePath> + </File> + <File> + <FileName>retarget.c</FileName> + <FileType>1</FileType> + <FilePath>..\..\..\..\software\common\retarget\retarget.c</FilePath> + </File> + <File> + <FileName>uart_stdout.c</FileName> + <FileType>1</FileType> + <FilePath>..\..\..\..\software\common\retarget\uart_stdout.c</FilePath> + </File> + <File> + <FileName>CMSDK_driver.c</FileName> + <FileType>1</FileType> + <FilePath>..\..\..\..\software\cmsis\Device\ARM\CMSDK_CM0\Source\CMSDK_driver.c</FilePath> + </File> + </Files> + </Group> + <Group> + <GroupName>System</GroupName> + <Files> + <File> + <FileName>system_CMSDK_CM0.c</FileName> + <FileType>1</FileType> + <FilePath>..\..\..\..\software\cmsis\Device\ARM\CMSDK_CM0\Source\system_CMSDK_CM0.c</FilePath> + </File> + </Files> + </Group> + </Groups> + </Target> + </Targets> + +</Project> diff --git a/Cortex-M0/nanosoc/systems/mcu/testcodes/sleep_demo/sleep_demo_cm0p.uvopt b/Cortex-M0/nanosoc/systems/mcu/testcodes/sleep_demo/sleep_demo_cm0p.uvopt new file mode 100644 index 0000000..f87fdd6 --- /dev/null +++ b/Cortex-M0/nanosoc/systems/mcu/testcodes/sleep_demo/sleep_demo_cm0p.uvopt @@ -0,0 +1,258 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no" ?> +<ProjectOpt xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="project_opt.xsd"> + + <SchemaVersion>1.0</SchemaVersion> + + <Header>### uVision Project, (C) Keil Software</Header> + + <Extensions> + <cExt>*.c</cExt> + <aExt>*.s*; *.src; *.a*</aExt> + <oExt>*.obj</oExt> + <lExt>*.lib</lExt> + <tExt>*.txt; *.h; *.inc</tExt> + <pExt>*.plm</pExt> + <CppX>*.cpp</CppX> + </Extensions> + + <DaveTm> + <dwLowDateTime>0</dwLowDateTime> + <dwHighDateTime>0</dwHighDateTime> + </DaveTm> + + <Target> + <TargetName>Debug</TargetName> + <ToolsetNumber>0x4</ToolsetNumber> + <ToolsetName>ARM-ADS</ToolsetName> + <TargetOption> + <CLKADS>50000000</CLKADS> + <OPTTT> + <gFlags>1</gFlags> + <BeepAtEnd>1</BeepAtEnd> + <RunSim>1</RunSim> + <RunTarget>0</RunTarget> + </OPTTT> + <OPTHX> + <HexSelection>1</HexSelection> + <FlashByte>65535</FlashByte> + <HexRangeLowAddress>0</HexRangeLowAddress> + <HexRangeHighAddress>0</HexRangeHighAddress> + <HexOffset>0</HexOffset> + </OPTHX> + <OPTLEX> + <PageWidth>79</PageWidth> + <PageLength>66</PageLength> + <TabStop>8</TabStop> + <ListingPath>.\</ListingPath> + </OPTLEX> + <ListingPage> + <CreateCListing>1</CreateCListing> + <CreateAListing>1</CreateAListing> + <CreateLListing>1</CreateLListing> + <CreateIListing>0</CreateIListing> + <AsmCond>1</AsmCond> + <AsmSymb>1</AsmSymb> + <AsmXref>0</AsmXref> + <CCond>1</CCond> + <CCode>0</CCode> + <CListInc>0</CListInc> + <CSymb>0</CSymb> + <LinkerCodeListing>0</LinkerCodeListing> + </ListingPage> + <OPTXL> + <LMap>1</LMap> + <LComments>1</LComments> + <LGenerateSymbols>1</LGenerateSymbols> + <LLibSym>1</LLibSym> + <LLines>1</LLines> + <LLocSym>1</LLocSym> + <LPubSym>1</LPubSym> + <LXref>0</LXref> + <LExpSel>0</LExpSel> + </OPTXL> + <OPTFL> + <tvExp>1</tvExp> + <tvExpOptDlg>0</tvExpOptDlg> + <IsCurrentTarget>1</IsCurrentTarget> + </OPTFL> + <CpuCode>255</CpuCode> + <DllOpt> + <SimDllName>SARMCM3.DLL</SimDllName> + <SimDllArguments></SimDllArguments> + <SimDlgDllName>DARMCM1.DLL</SimDlgDllName> + <SimDlgDllArguments></SimDlgDllArguments> + <TargetDllName>SARMCM3.DLL</TargetDllName> + <TargetDllArguments></TargetDllArguments> + <TargetDlgDllName>TARMCM1.DLL</TargetDlgDllName> + <TargetDlgDllArguments></TargetDlgDllArguments> + </DllOpt> + <DebugOpt> + <uSim>1</uSim> + <uTrg>0</uTrg> + <sLdApp>1</sLdApp> + <sGomain>1</sGomain> + <sRbreak>1</sRbreak> + <sRwatch>1</sRwatch> + <sRmem>1</sRmem> + <sRfunc>1</sRfunc> + <sRbox>1</sRbox> + <tLdApp>1</tLdApp> + <tGomain>0</tGomain> + <tRbreak>1</tRbreak> + <tRwatch>1</tRwatch> + <tRmem>1</tRmem> + <tRfunc>0</tRfunc> + <tRbox>1</tRbox> + <sRunDeb>0</sRunDeb> + <sLrtime>0</sLrtime> + <nTsel>-1</nTsel> + <sDll></sDll> + <sDllPa></sDllPa> + <sDlgDll></sDlgDll> + <sDlgPa></sDlgPa> + <sIfile></sIfile> + <tDll></tDll> + <tDllPa></tDllPa> + <tDlgDll></tDlgDll> + <tDlgPa></tDlgPa> + <tIfile></tIfile> + <pMon></pMon> + </DebugOpt> + <Breakpoint/> + <DebugFlag> + <trace>0</trace> + <periodic>1</periodic> + <aLwin>0</aLwin> + <aCover>0</aCover> + <aSer1>0</aSer1> + <aSer2>0</aSer2> + <aPa>0</aPa> + <viewmode>0</viewmode> + <vrSel>0</vrSel> + <aSym>0</aSym> + <aTbox>0</aTbox> + <AscS1>0</AscS1> + <AscS2>0</AscS2> + <AscS3>0</AscS3> + <aSer3>0</aSer3> + <eProf>0</eProf> + <aLa>0</aLa> + <aPa1>0</aPa1> + <AscS4>0</AscS4> + <aSer4>0</aSer4> + <StkLoc>0</StkLoc> + <TrcWin>0</TrcWin> + <newCpu>0</newCpu> + <uProt>0</uProt> + </DebugFlag> + <LintExecutable></LintExecutable> + <LintConfigFile></LintConfigFile> + </TargetOption> + </Target> + + <Group> + <GroupName>Startup</GroupName> + <tvExp>1</tvExp> + <tvExpOptDlg>0</tvExpOptDlg> + <cbSel>0</cbSel> + <File> + <GroupNumber>1</GroupNumber> + <FileNumber>1</FileNumber> + <FileType>2</FileType> + <tvExp>0</tvExp> + <Focus>0</Focus> + <ColumnNumber>0</ColumnNumber> + <tvExpOptDlg>0</tvExpOptDlg> + <TopLine>0</TopLine> + <CurrentLine>0</CurrentLine> + <bDave2>0</bDave2> + <PathWithFileName>..\..\..\..\software\cmsis\Device\ARM\CMSDK_CM0plus\Source\ARM\startup_CMSDK_CM0plus.s</PathWithFileName> + <FilenameWithoutPath>startup_CMSDK_CM0plus.s</FilenameWithoutPath> + </File> + </Group> + + <Group> + <GroupName>Application</GroupName> + <tvExp>1</tvExp> + <tvExpOptDlg>0</tvExpOptDlg> + <cbSel>0</cbSel> + <File> + <GroupNumber>2</GroupNumber> + <FileNumber>2</FileNumber> + <FileType>1</FileType> + <tvExp>0</tvExp> + <Focus>0</Focus> + <ColumnNumber>0</ColumnNumber> + <tvExpOptDlg>0</tvExpOptDlg> + <TopLine>0</TopLine> + <CurrentLine>0</CurrentLine> + <bDave2>0</bDave2> + <PathWithFileName>..\..\..\..\software\common\demos\sleep_demo.c</PathWithFileName> + <FilenameWithoutPath>sleep_demo.c</FilenameWithoutPath> + </File> + <File> + <GroupNumber>2</GroupNumber> + <FileNumber>3</FileNumber> + <FileType>1</FileType> + <tvExp>0</tvExp> + <Focus>0</Focus> + <ColumnNumber>0</ColumnNumber> + <tvExpOptDlg>0</tvExpOptDlg> + <TopLine>0</TopLine> + <CurrentLine>0</CurrentLine> + <bDave2>0</bDave2> + <PathWithFileName>..\..\..\..\software\common\retarget\retarget.c</PathWithFileName> + <FilenameWithoutPath>retarget.c</FilenameWithoutPath> + </File> + <File> + <GroupNumber>2</GroupNumber> + <FileNumber>4</FileNumber> + <FileType>1</FileType> + <tvExp>0</tvExp> + <Focus>0</Focus> + <ColumnNumber>0</ColumnNumber> + <tvExpOptDlg>0</tvExpOptDlg> + <TopLine>0</TopLine> + <CurrentLine>0</CurrentLine> + <bDave2>0</bDave2> + <PathWithFileName>..\..\..\..\software\common\retarget\uart_stdout.c</PathWithFileName> + <FilenameWithoutPath>uart_stdout.c</FilenameWithoutPath> + </File> + <File> + <GroupNumber>2</GroupNumber> + <FileNumber>5</FileNumber> + <FileType>1</FileType> + <tvExp>0</tvExp> + <Focus>0</Focus> + <ColumnNumber>0</ColumnNumber> + <tvExpOptDlg>0</tvExpOptDlg> + <TopLine>0</TopLine> + <CurrentLine>0</CurrentLine> + <bDave2>0</bDave2> + <PathWithFileName>..\..\..\..\software\cmsis\Device\ARM\CMSDK_CM0plus\Source\CMSDK_driver.c</PathWithFileName> + <FilenameWithoutPath>CMSDK_driver.c</FilenameWithoutPath> + </File> + </Group> + + <Group> + <GroupName>System</GroupName> + <tvExp>1</tvExp> + <tvExpOptDlg>0</tvExpOptDlg> + <cbSel>0</cbSel> + <File> + <GroupNumber>3</GroupNumber> + <FileNumber>6</FileNumber> + <FileType>1</FileType> + <tvExp>0</tvExp> + <Focus>0</Focus> + <ColumnNumber>0</ColumnNumber> + <tvExpOptDlg>0</tvExpOptDlg> + <TopLine>0</TopLine> + <CurrentLine>0</CurrentLine> + <bDave2>0</bDave2> + <PathWithFileName>..\..\..\..\software\cmsis\Device\ARM\CMSDK_CM0plus\Source\system_CMSDK_CM0plus.c</PathWithFileName> + <FilenameWithoutPath>system_CMSDK_CM0plus.c</FilenameWithoutPath> + </File> + </Group> + +</ProjectOpt> diff --git a/Cortex-M0/nanosoc/systems/mcu/testcodes/sleep_demo/sleep_demo_cm0p.uvproj b/Cortex-M0/nanosoc/systems/mcu/testcodes/sleep_demo/sleep_demo_cm0p.uvproj new file mode 100644 index 0000000..02c40bb --- /dev/null +++ b/Cortex-M0/nanosoc/systems/mcu/testcodes/sleep_demo/sleep_demo_cm0p.uvproj @@ -0,0 +1,437 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no" ?> +<Project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="project_proj.xsd"> + + <SchemaVersion>1.1</SchemaVersion> + + <Header>### uVision Project, (C) Keil Software</Header> + + <Targets> + <Target> + <TargetName>Debug</TargetName> + <ToolsetNumber>0x4</ToolsetNumber> + <ToolsetName>ARM-ADS</ToolsetName> + <TargetOption> + <TargetCommonOption> + <Device>Cortex-M0+</Device> + <Vendor>ARM</Vendor> + <Cpu>CLOCK(12000000) CPUTYPE("Cortex-M0+") ESEL ELITTLE</Cpu> + <FlashUtilSpec></FlashUtilSpec> + <StartupFile></StartupFile> + <FlashDriverDll></FlashDriverDll> + <DeviceId>6268</DeviceId> + <RegisterFile></RegisterFile> + <MemoryEnv></MemoryEnv> + <Cmp></Cmp> + <Asm></Asm> + <Linker></Linker> + <OHString></OHString> + <InfinionOptionDll></InfinionOptionDll> + <SLE66CMisc></SLE66CMisc> + <SLE66AMisc></SLE66AMisc> + <SLE66LinkerMisc></SLE66LinkerMisc> + <SFDFile></SFDFile> + <UseEnv>0</UseEnv> + <BinPath></BinPath> + <IncludePath></IncludePath> + <LibPath></LibPath> + <RegisterFilePath></RegisterFilePath> + <DBRegisterFilePath></DBRegisterFilePath> + <TargetStatus> + <Error>0</Error> + <ExitCodeStop>0</ExitCodeStop> + <ButtonStop>0</ButtonStop> + <NotGenerated>0</NotGenerated> + <InvalidFlash>1</InvalidFlash> + </TargetStatus> + <OutputDirectory>.\</OutputDirectory> + <OutputName>sleep_demo</OutputName> + <CreateExecutable>1</CreateExecutable> + <CreateLib>0</CreateLib> + <CreateHexFile>0</CreateHexFile> + <DebugInformation>1</DebugInformation> + <BrowseInformation>1</BrowseInformation> + <ListingPath>.\</ListingPath> + <HexFormatSelection>1</HexFormatSelection> + <Merge32K>0</Merge32K> + <CreateBatchFile>0</CreateBatchFile> + <BeforeCompile> + <RunUserProg1>0</RunUserProg1> + <RunUserProg2>0</RunUserProg2> + <UserProg1Name></UserProg1Name> + <UserProg2Name></UserProg2Name> + <UserProg1Dos16Mode>0</UserProg1Dos16Mode> + <UserProg2Dos16Mode>0</UserProg2Dos16Mode> + <nStopU1X>0</nStopU1X> + <nStopU2X>0</nStopU2X> + </BeforeCompile> + <BeforeMake> + <RunUserProg1>0</RunUserProg1> + <RunUserProg2>0</RunUserProg2> + <UserProg1Name></UserProg1Name> + <UserProg2Name></UserProg2Name> + <UserProg1Dos16Mode>0</UserProg1Dos16Mode> + <UserProg2Dos16Mode>0</UserProg2Dos16Mode> + </BeforeMake> + <AfterMake> + <RunUserProg1>1</RunUserProg1> + <RunUserProg2>0</RunUserProg2> + <UserProg1Name>$K\ARM\ARMCC\BIN\fromelf.exe #L --vhx --8x1 --output sleep_demo.hex</UserProg1Name> + <UserProg2Name></UserProg2Name> + <UserProg1Dos16Mode>0</UserProg1Dos16Mode> + <UserProg2Dos16Mode>0</UserProg2Dos16Mode> + </AfterMake> + <SelectedForBatchBuild>0</SelectedForBatchBuild> + <SVCSIdString></SVCSIdString> + </TargetCommonOption> + <CommonProperty> + <UseCPPCompiler>0</UseCPPCompiler> + <RVCTCodeConst>0</RVCTCodeConst> + <RVCTZI>0</RVCTZI> + <RVCTOtherData>0</RVCTOtherData> + <ModuleSelection>0</ModuleSelection> + <IncludeInBuild>1</IncludeInBuild> + <AlwaysBuild>0</AlwaysBuild> + <GenerateAssemblyFile>0</GenerateAssemblyFile> + <AssembleAssemblyFile>0</AssembleAssemblyFile> + <PublicsOnly>0</PublicsOnly> + <StopOnExitCode>3</StopOnExitCode> + <CustomArgument></CustomArgument> + <IncludeLibraryModules></IncludeLibraryModules> + </CommonProperty> + <DllOption> + <SimDllName>SARMCM3.DLL</SimDllName> + <SimDllArguments></SimDllArguments> + <SimDlgDll>DARMCM1.DLL</SimDlgDll> + <SimDlgDllArguments></SimDlgDllArguments> + <TargetDllName>SARMCM3.DLL</TargetDllName> + <TargetDllArguments></TargetDllArguments> + <TargetDlgDll>TARMCM1.DLL</TargetDlgDll> + <TargetDlgDllArguments></TargetDlgDllArguments> + </DllOption> + <DebugOption> + <OPTHX> + <HexSelection>1</HexSelection> + <HexRangeLowAddress>0</HexRangeLowAddress> + <HexRangeHighAddress>0</HexRangeHighAddress> + <HexOffset>0</HexOffset> + <Oh166RecLen>16</Oh166RecLen> + </OPTHX> + <Simulator> + <UseSimulator>1</UseSimulator> + <LoadApplicationAtStartup>1</LoadApplicationAtStartup> + <RunToMain>1</RunToMain> + <RestoreBreakpoints>1</RestoreBreakpoints> + <RestoreWatchpoints>1</RestoreWatchpoints> + <RestoreMemoryDisplay>1</RestoreMemoryDisplay> + <RestoreFunctions>1</RestoreFunctions> + <RestoreToolbox>1</RestoreToolbox> + <LimitSpeedToRealTime>0</LimitSpeedToRealTime> + </Simulator> + <Target> + <UseTarget>0</UseTarget> + <LoadApplicationAtStartup>1</LoadApplicationAtStartup> + <RunToMain>0</RunToMain> + <RestoreBreakpoints>1</RestoreBreakpoints> + <RestoreWatchpoints>1</RestoreWatchpoints> + <RestoreMemoryDisplay>1</RestoreMemoryDisplay> + <RestoreFunctions>0</RestoreFunctions> + <RestoreToolbox>1</RestoreToolbox> + </Target> + <RunDebugAfterBuild>0</RunDebugAfterBuild> + <TargetSelection>-1</TargetSelection> + <SimDlls> + <CpuDll></CpuDll> + <CpuDllArguments></CpuDllArguments> + <PeripheralDll></PeripheralDll> + <PeripheralDllArguments></PeripheralDllArguments> + <InitializationFile></InitializationFile> + </SimDlls> + <TargetDlls> + <CpuDll></CpuDll> + <CpuDllArguments></CpuDllArguments> + <PeripheralDll></PeripheralDll> + <PeripheralDllArguments></PeripheralDllArguments> + <InitializationFile></InitializationFile> + <Driver></Driver> + </TargetDlls> + </DebugOption> + <Utilities> + <Flash1> + <UseTargetDll>0</UseTargetDll> + <UseExternalTool>0</UseExternalTool> + <RunIndependent>0</RunIndependent> + <UpdateFlashBeforeDebugging>0</UpdateFlashBeforeDebugging> + <Capability>0</Capability> + <DriverSelection>-1</DriverSelection> + </Flash1> + <Flash2></Flash2> + <Flash3></Flash3> + <Flash4></Flash4> + </Utilities> + <TargetArmAds> + <ArmAdsMisc> + <GenerateListings>0</GenerateListings> + <asHll>1</asHll> + <asAsm>1</asAsm> + <asMacX>1</asMacX> + <asSyms>1</asSyms> + <asFals>1</asFals> + <asDbgD>1</asDbgD> + <asForm>1</asForm> + <ldLst>0</ldLst> + <ldmm>1</ldmm> + <ldXref>1</ldXref> + <BigEnd>0</BigEnd> + <AdsALst>1</AdsALst> + <AdsACrf>1</AdsACrf> + <AdsANop>0</AdsANop> + <AdsANot>0</AdsANot> + <AdsLLst>1</AdsLLst> + <AdsLmap>1</AdsLmap> + <AdsLcgr>1</AdsLcgr> + <AdsLsym>1</AdsLsym> + <AdsLszi>1</AdsLszi> + <AdsLtoi>1</AdsLtoi> + <AdsLsun>1</AdsLsun> + <AdsLven>1</AdsLven> + <AdsLsxf>1</AdsLsxf> + <RvctClst>0</RvctClst> + <GenPPlst>0</GenPPlst> + <AdsCpuType>"Cortex-M0+"</AdsCpuType> + <RvctDeviceName></RvctDeviceName> + <mOS>0</mOS> + <uocRom>0</uocRom> + <uocRam>0</uocRam> + <hadIROM>0</hadIROM> + <hadIRAM>0</hadIRAM> + <hadXRAM>0</hadXRAM> + <uocXRam>0</uocXRam> + <RvdsVP>0</RvdsVP> + <hadIRAM2>0</hadIRAM2> + <hadIROM2>0</hadIROM2> + <StupSel>1</StupSel> + <useUlib>0</useUlib> + <EndSel>1</EndSel> + <uLtcg>0</uLtcg> + <RoSelD>0</RoSelD> + <RwSelD>5</RwSelD> + <CodeSel>0</CodeSel> + <OptFeed>0</OptFeed> + <NoZi1>0</NoZi1> + <NoZi2>0</NoZi2> + <NoZi3>0</NoZi3> + <NoZi4>0</NoZi4> + <NoZi5>0</NoZi5> + <Ro1Chk>1</Ro1Chk> + <Ro2Chk>0</Ro2Chk> + <Ro3Chk>0</Ro3Chk> + <Ir1Chk>0</Ir1Chk> + <Ir2Chk>0</Ir2Chk> + <Ra1Chk>1</Ra1Chk> + <Ra2Chk>0</Ra2Chk> + <Ra3Chk>0</Ra3Chk> + <Im1Chk>0</Im1Chk> + <Im2Chk>0</Im2Chk> + <OnChipMemories> + <Ocm1> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </Ocm1> + <Ocm2> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </Ocm2> + <Ocm3> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </Ocm3> + <Ocm4> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </Ocm4> + <Ocm5> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </Ocm5> + <Ocm6> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </Ocm6> + <IRAM> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </IRAM> + <IROM> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </IROM> + <XRAM> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </XRAM> + <OCR_RVCT1> + <Type>1</Type> + <StartAddress>0x0</StartAddress> + <Size>0x10000</Size> + </OCR_RVCT1> + <OCR_RVCT2> + <Type>1</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </OCR_RVCT2> + <OCR_RVCT3> + <Type>1</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </OCR_RVCT3> + <OCR_RVCT4> + <Type>1</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </OCR_RVCT4> + <OCR_RVCT5> + <Type>1</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </OCR_RVCT5> + <OCR_RVCT6> + <Type>0</Type> + <StartAddress>0x20000000</StartAddress> + <Size>0x10000</Size> + </OCR_RVCT6> + <OCR_RVCT7> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </OCR_RVCT7> + <OCR_RVCT8> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </OCR_RVCT8> + <OCR_RVCT9> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </OCR_RVCT9> + <OCR_RVCT10> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </OCR_RVCT10> + </OnChipMemories> + <RvctStartVector></RvctStartVector> + </ArmAdsMisc> + <Cads> + <interw>1</interw> + <Optim>4</Optim> + <oTime>0</oTime> + <SplitLS>0</SplitLS> + <OneElfS>0</OneElfS> + <Strict>0</Strict> + <EnumInt>0</EnumInt> + <PlainCh>0</PlainCh> + <Ropi>0</Ropi> + <Rwpi>0</Rwpi> + <wLevel>0</wLevel> + <uThumb>0</uThumb> + <VariousControls> + <MiscControls></MiscControls> + <Define>CORTEX_M0PLUS</Define> + <Undefine></Undefine> + <IncludePath>..\..\..\..\software\cmsis\CMSIS\Include; ..\..\..\..\software\cmsis\Device\ARM\CMSDK_CM0plus\Include; ..\..\..\..\software\common\retarget</IncludePath> + </VariousControls> + </Cads> + <Aads> + <interw>1</interw> + <Ropi>0</Ropi> + <Rwpi>0</Rwpi> + <thumb>0</thumb> + <SplitLS>0</SplitLS> + <SwStkChk>0</SwStkChk> + <NoWarn>0</NoWarn> + <VariousControls> + <MiscControls></MiscControls> + <Define></Define> + <Undefine></Undefine> + <IncludePath></IncludePath> + </VariousControls> + </Aads> + <LDads> + <umfTarg>1</umfTarg> + <Ropi>0</Ropi> + <Rwpi>0</Rwpi> + <noStLib>0</noStLib> + <RepFail>1</RepFail> + <useFile>0</useFile> + <TextAddressRange>0x00000000</TextAddressRange> + <DataAddressRange>0x00000000</DataAddressRange> + <ScatterFile></ScatterFile> + <IncludeLibs></IncludeLibs> + <IncludeLibsPath></IncludeLibsPath> + <Misc></Misc> + <LinkerInputFile></LinkerInputFile> + <DisabledWarnings></DisabledWarnings> + </LDads> + </TargetArmAds> + </TargetOption> + <Groups> + <Group> + <GroupName>Startup</GroupName> + <Files> + <File> + <FileName>startup_CMSDK_CM0plus.s</FileName> + <FileType>2</FileType> + <FilePath>..\..\..\..\software\cmsis\Device\ARM\CMSDK_CM0plus\Source\ARM\startup_CMSDK_CM0plus.s</FilePath> + </File> + </Files> + </Group> + <Group> + <GroupName>Application</GroupName> + <Files> + <File> + <FileName>sleep_demo.c</FileName> + <FileType>1</FileType> + <FilePath>..\..\..\..\software\common\demos\sleep_demo.c</FilePath> + </File> + <File> + <FileName>retarget.c</FileName> + <FileType>1</FileType> + <FilePath>..\..\..\..\software\common\retarget\retarget.c</FilePath> + </File> + <File> + <FileName>uart_stdout.c</FileName> + <FileType>1</FileType> + <FilePath>..\..\..\..\software\common\retarget\uart_stdout.c</FilePath> + </File> + <File> + <FileName>CMSDK_driver.c</FileName> + <FileType>1</FileType> + <FilePath>..\..\..\..\software\cmsis\Device\ARM\CMSDK_CM0plus\Source\CMSDK_driver.c</FilePath> + </File> + </Files> + </Group> + <Group> + <GroupName>System</GroupName> + <Files> + <File> + <FileName>system_CMSDK_CM0plus.c</FileName> + <FileType>1</FileType> + <FilePath>..\..\..\..\software\cmsis\Device\ARM\CMSDK_CM0plus\Source\system_CMSDK_CM0plus.c</FilePath> + </File> + </Files> + </Group> + </Groups> + </Target> + </Targets> + +</Project> diff --git a/Cortex-M0/nanosoc/systems/mcu/testcodes/timer_driver_tests/makefile b/Cortex-M0/nanosoc/systems/mcu/testcodes/timer_driver_tests/makefile new file mode 100644 index 0000000..7fa0fa3 --- /dev/null +++ b/Cortex-M0/nanosoc/systems/mcu/testcodes/timer_driver_tests/makefile @@ -0,0 +1,254 @@ +#----------------------------------------------------------------------------- +# The confidential and proprietary information contained in this file may +# only be used by a person authorised under and to the extent permitted +# by a subsisting licensing agreement from Arm Limited or its affiliates. +# +# (C) COPYRIGHT 2010-2013 Arm Limited or its affiliates. +# ALL RIGHTS RESERVED +# +# This entire notice must be reproduced on all copies of this file +# and copies of this file may only be made by a person if such person is +# permitted to do so under the terms of a subsisting license agreement +# from Arm Limited or its affiliates. +# +# SVN Information +# +# Checked In : $Date: 2011-01-25 10:05:56 +0000 (Tue, 25 Jan 2011) $ +# +# Revision : $Revision: 159421 $ +# +# Release Information : Cortex-M System Design Kit-r1p1-00rel0 +#----------------------------------------------------------------------------- +# +# Cortex-M System Design Kit software compilation make file +# +#----------------------------------------------------------------------------- +# +# Configurations +# +# Choose the core instantiated, can be +# - CORTEX_M0 +# - CORTEX_M0PLUS +CPU_PRODUCT = CORTEX_M0PLUS + +# Shared software directory +SOFTWARE_DIR = ../../../../software +CMSIS_DIR = $(SOFTWARE_DIR)/cmsis +CORE_DIR = $(CMSIS_DIR)/CMSIS/Include + +ifeq ($(CPU_PRODUCT),CORTEX_M0PLUS) + DEVICE_DIR = $(CMSIS_DIR)/Device/ARM/CMSDK_CM0plus +else + DEVICE_DIR = $(CMSIS_DIR)/Device/ARM/CMSDK_CM0 +endif + +# Program file +TESTNAME = timer_driver_tests + +# Endian Option +COMPILE_BIGEND = 0 + +# Configuration +ifeq ($(CPU_PRODUCT),CORTEX_M0PLUS) + USER_DEFINE = -DCORTEX_M0PLUS +else + USER_DEFINE = -DCORTEX_M0 +endif + +DEPS_LIST = makefile + +# Tool chain : ds5 / gcc / keil +TOOL_CHAIN = ds5 + +ifeq ($(TOOL_CHAIN),ds5) + ifeq ($(CPU_PRODUCT),CORTEX_M0PLUS) + CPU_TYPE = --cpu Cortex-M0plus + else + CPU_TYPE = --cpu Cortex-M0 + endif +endif + +ifeq ($(TOOL_CHAIN),gcc) + ifeq ($(CPU_PRODUCT),CORTEX_M0PLUS) + CPU_TYPE = -mcpu=cortex-m0plus + else + CPU_TYPE = -mcpu=cortex-m0 + endif +endif + +# Startup code directory for DS-5 +ifeq ($(TOOL_CHAIN),ds5) + STARTUP_DIR = $(DEVICE_DIR)/Source/ARM +endif + +# Startup code directory for gcc +ifeq ($(TOOL_CHAIN),gcc) + STARTUP_DIR = $(DEVICE_DIR)/Source/GCC +endif + +ifeq ($(CPU_PRODUCT),CORTEX_M0PLUS) + STARTUP_FILE = startup_CMSDK_CM0plus + SYSTEM_FILE = system_CMSDK_CM0plus +else + STARTUP_FILE = startup_CMSDK_CM0 + SYSTEM_FILE = system_CMSDK_CM0 +endif + +# --------------------------------------------------------------------------------------- +# DS-5 options + +# MicroLIB option +COMPILE_MICROLIB = 0 + +# Small Multiply (Cortex-M0/M0+ has small multiplier option) +COMPILE_SMALLMUL = 0 + +ARM_CC_OPTIONS = -c -O3 -g -Otime $(USER_DEFINE) \ + -I $(DEVICE_DIR)/Include -I $(CORE_DIR) -I $(SOFTWARE_DIR)/common/retarget +ARM_ASM_OPTIONS = -g +ARM_LINK_OPTIONS = "--keep=$(STARTUP_FILE).o(RESET)" "--first=$(STARTUP_FILE).o(RESET)" \ + --rw_base 0x30000000 --ro_base 0x00000000 --map + +ifeq ($(COMPILE_BIGEND),1) + # Big Endian + ARM_CC_OPTIONS += --bigend + ARM_ASM_OPTIONS += --bigend + ARM_LINK_OPTIONS += --be8 +endif + +ifeq ($(COMPILE_MICROLIB),1) + # MicroLIB + ARM_CC_OPTIONS += --library_type=microlib + ARM_ASM_OPTIONS += --library_type=microlib --pd "__MICROLIB SETA 1" + ARM_LINK_OPTIONS += --library_type=microlib +endif + +ifeq ($(COMPILE_SMALLMUL),1) + # In Cortex-M0, small multiply takes 32 cycles + ARM_CC_OPTIONS += --multiply_latency=32 +endif + +# --------------------------------------------------------------------------------------- +# gcc options + +GNG_CC = arm-none-eabi-gcc +GNU_OBJDUMP = arm-none-eabi-objdump +GNU_OBJCOPY = arm-none-eabi-objcopy + +LINKER_SCRIPT_PATH = $(SOFTWARE_DIR)/common/scripts +LINKER_SCRIPT = $(LINKER_SCRIPT_PATH)/cmsdk_cm0.ld + +GNU_CC_FLAGS = -g -O3 -mthumb $(CPU_TYPE) + +ifeq ($(COMPILE_BIGEND),1) + # Big Endian + GNU_CC_FLAGS += -mbig-endian +endif + +# --------------------------------------------------------------------------------------- +all: all_$(TOOL_CHAIN) + +# --------------------------------------------------------------------------------------- +# DS-5 + +all_ds5 : $(TESTNAME).hex $(TESTNAME).lst + +$(TESTNAME).o : $(SOFTWARE_DIR)/common/validation/$(TESTNAME).c $(DEPS_LIST) + armcc $(ARM_CC_OPTIONS) $(CPU_TYPE) $< -o $@ + +$(SYSTEM_FILE).o : $(DEVICE_DIR)/Source/$(SYSTEM_FILE).c $(DEPS_LIST) + armcc $(ARM_CC_OPTIONS) $(CPU_TYPE) $< -o $@ + +retarget.o : $(SOFTWARE_DIR)/common/retarget/retarget.c $(DEPS_LIST) + armcc $(ARM_CC_OPTIONS) $(CPU_TYPE) $< -o $@ + +uart_stdout.o : $(SOFTWARE_DIR)/common/retarget/uart_stdout.c $(DEPS_LIST) + armcc $(ARM_CC_OPTIONS) $(CPU_TYPE) $< -o $@ + +CMSDK_driver.o : $(DEVICE_DIR)/Source/CMSDK_driver.c $(DEPS_LIST) + armcc $(ARM_CC_OPTIONS) $(CPU_TYPE) $< -o $@ + +$(STARTUP_FILE).o : $(STARTUP_DIR)/$(STARTUP_FILE).s $(DEPS_LIST) + armasm $(ARM_ASM_OPTIONS) $(CPU_TYPE) $< -o $@ + +$(TESTNAME).ELF : $(TESTNAME).o $(SYSTEM_FILE).o $(STARTUP_FILE).o retarget.o uart_stdout.o CMSDK_driver.o + armlink $(ARM_LINK_OPTIONS) -o $@ $(TESTNAME).o $(SYSTEM_FILE).o $(STARTUP_FILE).o retarget.o uart_stdout.o CMSDK_driver.o + +$(TESTNAME).hex : $(TESTNAME).ELF + fromelf --vhx --8x1 $< --output $@ + +$(TESTNAME).lst : $(TESTNAME).ELF makefile + fromelf -c -d -e -s $< --output $@ + +# --------------------------------------------------------------------------------------- +# gcc +all_gcc: + $(GNG_CC) $(GNU_CC_FLAGS) $(STARTUP_DIR)/$(STARTUP_FILE).s \ + $(SOFTWARE_DIR)/common/validation/$(TESTNAME).c \ + $(SOFTWARE_DIR)/common/retarget/retarget.c \ + $(SOFTWARE_DIR)/common/retarget/uart_stdout.c \ + $(DEVICE_DIR)/Source/CMSDK_driver.c \ + $(DEVICE_DIR)/Source/$(SYSTEM_FILE).c \ + -I $(DEVICE_DIR)/Include -I $(CORE_DIR) \ + -I $(SOFTWARE_DIR)/common/retarget \ + -L $(LINKER_SCRIPT_PATH) \ + -D__STACK_SIZE=0x200 \ + -D__HEAP_SIZE=0x1000 \ + $(USER_DEFINE) -T $(LINKER_SCRIPT) -o $(TESTNAME).o + # Generate disassembly code + $(GNU_OBJDUMP) -S $(TESTNAME).o > $(TESTNAME).lst + # Generate binary file + $(GNU_OBJCOPY) -S $(TESTNAME).o -O binary $(TESTNAME).bin + # Generate hex file + $(GNU_OBJCOPY) -S $(TESTNAME).o -O verilog $(TESTNAME).hex + +# Note: +# If the version of object copy you are using does not support verilog hex file output, +# you can generate the hex file from binary file using the following command +# od -v -A n -t x1 --width=1 $(TESTNAME).bin > $(TESTNAME).hex + +# --------------------------------------------------------------------------------------- +# Keil MDK + +all_keil: + @echo "Please compile your project code and press ENTER when ready" + @read dummy + +# --------------------------------------------------------------------------------------- +# Binary + +all_bin: $(TESTNAME).bin + # Generate hex file from binary + od -v -A n -t x1 --width=1 $(TESTNAME).bin > $(TESTNAME).hex + +# --------------------------------------------------------------------------------------- +# Clean + +clean : + @rm -rf *.o + @if [ -e $(TESTNAME).hex ] ; then \ + rm -rf $(TESTNAME).hex ; \ + fi + @if [ -e $(TESTNAME).lst ] ; then \ + rm -rf $(TESTNAME).lst ; \ + fi + @if [ -e $(TESTNAME).ELF ] ; then \ + rm -rf $(TESTNAME).ELF ; \ + fi + @if [ -e $(TESTNAME).bin ] ; then \ + rm -rf $(TESTNAME).bin ; \ + fi + @rm -rf *.crf + @rm -rf *.plg + @rm -rf *.tra + @rm -rf *.htm + @rm -rf *.map + @rm -rf *.dep + @rm -rf *.d + @rm -rf *.lnp + @rm -rf *.bak + @rm -rf *.lst + @rm -rf *.axf + @rm -rf *.sct + @rm -rf *.__i + @rm -rf *._ia diff --git a/Cortex-M0/nanosoc/systems/mcu/testcodes/timer_driver_tests/timer_driver_tests_cm0.uvopt b/Cortex-M0/nanosoc/systems/mcu/testcodes/timer_driver_tests/timer_driver_tests_cm0.uvopt new file mode 100644 index 0000000..6663e83 --- /dev/null +++ b/Cortex-M0/nanosoc/systems/mcu/testcodes/timer_driver_tests/timer_driver_tests_cm0.uvopt @@ -0,0 +1,277 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no" ?> +<ProjectOpt xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="project_opt.xsd"> + + <SchemaVersion>1.0</SchemaVersion> + + <Header>### uVision Project, (C) Keil Software</Header> + + <Extensions> + <cExt>*.c</cExt> + <aExt>*.s*; *.src; *.a*</aExt> + <oExt>*.obj</oExt> + <lExt>*.lib</lExt> + <tExt>*.txt; *.h; *.inc</tExt> + <pExt>*.plm</pExt> + <CppX>*.cpp</CppX> + </Extensions> + + <DaveTm> + <dwLowDateTime>0</dwLowDateTime> + <dwHighDateTime>0</dwHighDateTime> + </DaveTm> + + <Target> + <TargetName>Debug</TargetName> + <ToolsetNumber>0x4</ToolsetNumber> + <ToolsetName>ARM-ADS</ToolsetName> + <TargetOption> + <CLKADS>50000000</CLKADS> + <OPTTT> + <gFlags>1</gFlags> + <BeepAtEnd>1</BeepAtEnd> + <RunSim>1</RunSim> + <RunTarget>0</RunTarget> + </OPTTT> + <OPTHX> + <HexSelection>1</HexSelection> + <FlashByte>65535</FlashByte> + <HexRangeLowAddress>0</HexRangeLowAddress> + <HexRangeHighAddress>0</HexRangeHighAddress> + <HexOffset>0</HexOffset> + </OPTHX> + <OPTLEX> + <PageWidth>79</PageWidth> + <PageLength>66</PageLength> + <TabStop>8</TabStop> + <ListingPath>.\</ListingPath> + </OPTLEX> + <ListingPage> + <CreateCListing>1</CreateCListing> + <CreateAListing>1</CreateAListing> + <CreateLListing>1</CreateLListing> + <CreateIListing>0</CreateIListing> + <AsmCond>1</AsmCond> + <AsmSymb>1</AsmSymb> + <AsmXref>0</AsmXref> + <CCond>1</CCond> + <CCode>0</CCode> + <CListInc>0</CListInc> + <CSymb>0</CSymb> + <LinkerCodeListing>0</LinkerCodeListing> + </ListingPage> + <OPTXL> + <LMap>1</LMap> + <LComments>1</LComments> + <LGenerateSymbols>1</LGenerateSymbols> + <LLibSym>1</LLibSym> + <LLines>1</LLines> + <LLocSym>1</LLocSym> + <LPubSym>1</LPubSym> + <LXref>0</LXref> + <LExpSel>0</LExpSel> + </OPTXL> + <OPTFL> + <tvExp>1</tvExp> + <tvExpOptDlg>0</tvExpOptDlg> + <IsCurrentTarget>1</IsCurrentTarget> + </OPTFL> + <CpuCode>255</CpuCode> + <DllOpt> + <SimDllName>SARMCM3.DLL</SimDllName> + <SimDllArguments></SimDllArguments> + <SimDlgDllName>DARMCM1.DLL</SimDlgDllName> + <SimDlgDllArguments></SimDlgDllArguments> + <TargetDllName>SARMCM3.DLL</TargetDllName> + <TargetDllArguments></TargetDllArguments> + <TargetDlgDllName>TARMCM1.DLL</TargetDlgDllName> + <TargetDlgDllArguments></TargetDlgDllArguments> + </DllOpt> + <DebugOpt> + <uSim>1</uSim> + <uTrg>0</uTrg> + <sLdApp>1</sLdApp> + <sGomain>1</sGomain> + <sRbreak>1</sRbreak> + <sRwatch>1</sRwatch> + <sRmem>1</sRmem> + <sRfunc>1</sRfunc> + <sRbox>1</sRbox> + <tLdApp>1</tLdApp> + <tGomain>0</tGomain> + <tRbreak>1</tRbreak> + <tRwatch>1</tRwatch> + <tRmem>1</tRmem> + <tRfunc>0</tRfunc> + <tRbox>1</tRbox> + <tRtrace>0</tRtrace> + <sRunDeb>0</sRunDeb> + <sLrtime>0</sLrtime> + <nTsel>-1</nTsel> + <sDll></sDll> + <sDllPa></sDllPa> + <sDlgDll></sDlgDll> + <sDlgPa></sDlgPa> + <sIfile></sIfile> + <tDll></tDll> + <tDllPa></tDllPa> + <tDlgDll></tDlgDll> + <tDlgPa></tDlgPa> + <tIfile></tIfile> + <pMon></pMon> + </DebugOpt> + <Breakpoint/> + <DebugFlag> + <trace>0</trace> + <periodic>1</periodic> + <aLwin>0</aLwin> + <aCover>0</aCover> + <aSer1>0</aSer1> + <aSer2>0</aSer2> + <aPa>0</aPa> + <viewmode>0</viewmode> + <vrSel>0</vrSel> + <aSym>0</aSym> + <aTbox>0</aTbox> + <AscS1>0</AscS1> + <AscS2>0</AscS2> + <AscS3>0</AscS3> + <aSer3>0</aSer3> + <eProf>0</eProf> + <aLa>0</aLa> + <aPa1>0</aPa1> + <AscS4>0</AscS4> + <aSer4>0</aSer4> + <StkLoc>0</StkLoc> + <TrcWin>0</TrcWin> + <newCpu>0</newCpu> + <uProt>0</uProt> + </DebugFlag> + <Tracepoint> + <THDelay>0</THDelay> + </Tracepoint> + <LintExecutable></LintExecutable> + <LintConfigFile></LintConfigFile> + </TargetOption> + </Target> + + <Group> + <GroupName>Startup</GroupName> + <tvExp>1</tvExp> + <tvExpOptDlg>0</tvExpOptDlg> + <cbSel>0</cbSel> + <RteFlg>0</RteFlg> + <File> + <GroupNumber>1</GroupNumber> + <FileNumber>1</FileNumber> + <FileType>2</FileType> + <tvExp>0</tvExp> + <Focus>0</Focus> + <ColumnNumber>0</ColumnNumber> + <tvExpOptDlg>0</tvExpOptDlg> + <TopLine>0</TopLine> + <CurrentLine>0</CurrentLine> + <bDave2>0</bDave2> + <PathWithFileName>..\..\..\..\software\cmsis\Device\ARM\CMSDK_CM0\Source\ARM\startup_CMSDK_CM0.s</PathWithFileName> + <FilenameWithoutPath>startup_CMSDK_CM0.s</FilenameWithoutPath> + <RteFlg>0</RteFlg> + <bShared>0</bShared> + </File> + </Group> + + <Group> + <GroupName>Application</GroupName> + <tvExp>1</tvExp> + <tvExpOptDlg>0</tvExpOptDlg> + <cbSel>0</cbSel> + <RteFlg>0</RteFlg> + <File> + <GroupNumber>2</GroupNumber> + <FileNumber>2</FileNumber> + <FileType>1</FileType> + <tvExp>0</tvExp> + <Focus>0</Focus> + <ColumnNumber>0</ColumnNumber> + <tvExpOptDlg>0</tvExpOptDlg> + <TopLine>0</TopLine> + <CurrentLine>0</CurrentLine> + <bDave2>0</bDave2> + <PathWithFileName>..\..\..\..\software\common\validation\timer_driver_tests.c</PathWithFileName> + <FilenameWithoutPath>timer_driver_tests.c</FilenameWithoutPath> + <RteFlg>0</RteFlg> + <bShared>0</bShared> + </File> + <File> + <GroupNumber>2</GroupNumber> + <FileNumber>3</FileNumber> + <FileType>1</FileType> + <tvExp>0</tvExp> + <Focus>0</Focus> + <ColumnNumber>0</ColumnNumber> + <tvExpOptDlg>0</tvExpOptDlg> + <TopLine>0</TopLine> + <CurrentLine>0</CurrentLine> + <bDave2>0</bDave2> + <PathWithFileName>..\..\..\..\software\common\retarget\uart_stdout.c</PathWithFileName> + <FilenameWithoutPath>uart_stdout.c</FilenameWithoutPath> + <RteFlg>0</RteFlg> + <bShared>0</bShared> + </File> + <File> + <GroupNumber>2</GroupNumber> + <FileNumber>4</FileNumber> + <FileType>1</FileType> + <tvExp>0</tvExp> + <Focus>0</Focus> + <ColumnNumber>0</ColumnNumber> + <tvExpOptDlg>0</tvExpOptDlg> + <TopLine>0</TopLine> + <CurrentLine>0</CurrentLine> + <bDave2>0</bDave2> + <PathWithFileName>..\..\..\..\software\common\retarget\retarget.c</PathWithFileName> + <FilenameWithoutPath>retarget.c</FilenameWithoutPath> + <RteFlg>0</RteFlg> + <bShared>0</bShared> + </File> + <File> + <GroupNumber>2</GroupNumber> + <FileNumber>5</FileNumber> + <FileType>1</FileType> + <tvExp>0</tvExp> + <Focus>0</Focus> + <ColumnNumber>0</ColumnNumber> + <tvExpOptDlg>0</tvExpOptDlg> + <TopLine>0</TopLine> + <CurrentLine>0</CurrentLine> + <bDave2>0</bDave2> + <PathWithFileName>..\..\..\..\software\cmsis\Device\ARM\CMSDK_CM0\Source\CMSDK_driver.c</PathWithFileName> + <FilenameWithoutPath>CMSDK_driver.c</FilenameWithoutPath> + <RteFlg>0</RteFlg> + <bShared>0</bShared> + </File> + </Group> + + <Group> + <GroupName>System</GroupName> + <tvExp>1</tvExp> + <tvExpOptDlg>0</tvExpOptDlg> + <cbSel>0</cbSel> + <RteFlg>0</RteFlg> + <File> + <GroupNumber>3</GroupNumber> + <FileNumber>6</FileNumber> + <FileType>1</FileType> + <tvExp>0</tvExp> + <Focus>0</Focus> + <ColumnNumber>0</ColumnNumber> + <tvExpOptDlg>0</tvExpOptDlg> + <TopLine>0</TopLine> + <CurrentLine>0</CurrentLine> + <bDave2>0</bDave2> + <PathWithFileName>..\..\..\..\software\cmsis\Device\ARM\CMSDK_CM0\Source\system_CMSDK_CM0.c</PathWithFileName> + <FilenameWithoutPath>system_CMSDK_CM0.c</FilenameWithoutPath> + <RteFlg>0</RteFlg> + <bShared>0</bShared> + </File> + </Group> + +</ProjectOpt> diff --git a/Cortex-M0/nanosoc/systems/mcu/testcodes/timer_driver_tests/timer_driver_tests_cm0.uvproj b/Cortex-M0/nanosoc/systems/mcu/testcodes/timer_driver_tests/timer_driver_tests_cm0.uvproj new file mode 100644 index 0000000..8fe263e --- /dev/null +++ b/Cortex-M0/nanosoc/systems/mcu/testcodes/timer_driver_tests/timer_driver_tests_cm0.uvproj @@ -0,0 +1,440 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no" ?> +<Project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="project_proj.xsd"> + + <SchemaVersion>1.1</SchemaVersion> + + <Header>### uVision Project, (C) Keil Software</Header> + + <Targets> + <Target> + <TargetName>Debug</TargetName> + <ToolsetNumber>0x4</ToolsetNumber> + <ToolsetName>ARM-ADS</ToolsetName> + <TargetOption> + <TargetCommonOption> + <Device>Cortex-M0</Device> + <Vendor>ARM</Vendor> + <Cpu>CLOCK(12000000) CPUTYPE("Cortex-M0") ESEL ELITTLE</Cpu> + <FlashUtilSpec></FlashUtilSpec> + <StartupFile></StartupFile> + <FlashDriverDll></FlashDriverDll> + <DeviceId>4803</DeviceId> + <RegisterFile></RegisterFile> + <MemoryEnv></MemoryEnv> + <Cmp></Cmp> + <Asm></Asm> + <Linker></Linker> + <OHString></OHString> + <InfinionOptionDll></InfinionOptionDll> + <SLE66CMisc></SLE66CMisc> + <SLE66AMisc></SLE66AMisc> + <SLE66LinkerMisc></SLE66LinkerMisc> + <SFDFile></SFDFile> + <UseEnv>0</UseEnv> + <BinPath></BinPath> + <IncludePath></IncludePath> + <LibPath></LibPath> + <RegisterFilePath></RegisterFilePath> + <DBRegisterFilePath></DBRegisterFilePath> + <TargetStatus> + <Error>0</Error> + <ExitCodeStop>0</ExitCodeStop> + <ButtonStop>0</ButtonStop> + <NotGenerated>0</NotGenerated> + <InvalidFlash>1</InvalidFlash> + </TargetStatus> + <OutputDirectory>.\</OutputDirectory> + <OutputName>timer_driver_tests</OutputName> + <CreateExecutable>1</CreateExecutable> + <CreateLib>0</CreateLib> + <CreateHexFile>0</CreateHexFile> + <DebugInformation>1</DebugInformation> + <BrowseInformation>1</BrowseInformation> + <ListingPath>.\</ListingPath> + <HexFormatSelection>1</HexFormatSelection> + <Merge32K>0</Merge32K> + <CreateBatchFile>0</CreateBatchFile> + <BeforeCompile> + <RunUserProg1>0</RunUserProg1> + <RunUserProg2>0</RunUserProg2> + <UserProg1Name></UserProg1Name> + <UserProg2Name></UserProg2Name> + <UserProg1Dos16Mode>0</UserProg1Dos16Mode> + <UserProg2Dos16Mode>0</UserProg2Dos16Mode> + <nStopU1X>0</nStopU1X> + <nStopU2X>0</nStopU2X> + </BeforeCompile> + <BeforeMake> + <RunUserProg1>0</RunUserProg1> + <RunUserProg2>0</RunUserProg2> + <UserProg1Name></UserProg1Name> + <UserProg2Name></UserProg2Name> + <UserProg1Dos16Mode>0</UserProg1Dos16Mode> + <UserProg2Dos16Mode>0</UserProg2Dos16Mode> + </BeforeMake> + <AfterMake> + <RunUserProg1>1</RunUserProg1> + <RunUserProg2>0</RunUserProg2> + <UserProg1Name>$K\ARM\ARMCC\BIN\fromelf.exe #L --vhx --8x1 --output timer_driver_tests.hex</UserProg1Name> + <UserProg2Name></UserProg2Name> + <UserProg1Dos16Mode>0</UserProg1Dos16Mode> + <UserProg2Dos16Mode>0</UserProg2Dos16Mode> + </AfterMake> + <SelectedForBatchBuild>0</SelectedForBatchBuild> + <SVCSIdString></SVCSIdString> + </TargetCommonOption> + <CommonProperty> + <UseCPPCompiler>0</UseCPPCompiler> + <RVCTCodeConst>0</RVCTCodeConst> + <RVCTZI>0</RVCTZI> + <RVCTOtherData>0</RVCTOtherData> + <ModuleSelection>0</ModuleSelection> + <IncludeInBuild>1</IncludeInBuild> + <AlwaysBuild>0</AlwaysBuild> + <GenerateAssemblyFile>0</GenerateAssemblyFile> + <AssembleAssemblyFile>0</AssembleAssemblyFile> + <PublicsOnly>0</PublicsOnly> + <StopOnExitCode>3</StopOnExitCode> + <CustomArgument></CustomArgument> + <IncludeLibraryModules></IncludeLibraryModules> + </CommonProperty> + <DllOption> + <SimDllName>SARMCM3.DLL</SimDllName> + <SimDllArguments></SimDllArguments> + <SimDlgDll>DARMCM1.DLL</SimDlgDll> + <SimDlgDllArguments></SimDlgDllArguments> + <TargetDllName>SARMCM3.DLL</TargetDllName> + <TargetDllArguments></TargetDllArguments> + <TargetDlgDll>TARMCM1.DLL</TargetDlgDll> + <TargetDlgDllArguments></TargetDlgDllArguments> + </DllOption> + <DebugOption> + <OPTHX> + <HexSelection>1</HexSelection> + <HexRangeLowAddress>0</HexRangeLowAddress> + <HexRangeHighAddress>0</HexRangeHighAddress> + <HexOffset>0</HexOffset> + <Oh166RecLen>16</Oh166RecLen> + </OPTHX> + <Simulator> + <UseSimulator>1</UseSimulator> + <LoadApplicationAtStartup>1</LoadApplicationAtStartup> + <RunToMain>1</RunToMain> + <RestoreBreakpoints>1</RestoreBreakpoints> + <RestoreWatchpoints>1</RestoreWatchpoints> + <RestoreMemoryDisplay>1</RestoreMemoryDisplay> + <RestoreFunctions>1</RestoreFunctions> + <RestoreToolbox>1</RestoreToolbox> + <LimitSpeedToRealTime>0</LimitSpeedToRealTime> + </Simulator> + <Target> + <UseTarget>0</UseTarget> + <LoadApplicationAtStartup>1</LoadApplicationAtStartup> + <RunToMain>0</RunToMain> + <RestoreBreakpoints>1</RestoreBreakpoints> + <RestoreWatchpoints>1</RestoreWatchpoints> + <RestoreMemoryDisplay>1</RestoreMemoryDisplay> + <RestoreFunctions>0</RestoreFunctions> + <RestoreToolbox>1</RestoreToolbox> + <RestoreTracepoints>0</RestoreTracepoints> + </Target> + <RunDebugAfterBuild>0</RunDebugAfterBuild> + <TargetSelection>-1</TargetSelection> + <SimDlls> + <CpuDll></CpuDll> + <CpuDllArguments></CpuDllArguments> + <PeripheralDll></PeripheralDll> + <PeripheralDllArguments></PeripheralDllArguments> + <InitializationFile></InitializationFile> + </SimDlls> + <TargetDlls> + <CpuDll></CpuDll> + <CpuDllArguments></CpuDllArguments> + <PeripheralDll></PeripheralDll> + <PeripheralDllArguments></PeripheralDllArguments> + <InitializationFile></InitializationFile> + <Driver></Driver> + </TargetDlls> + </DebugOption> + <Utilities> + <Flash1> + <UseTargetDll>0</UseTargetDll> + <UseExternalTool>0</UseExternalTool> + <RunIndependent>0</RunIndependent> + <UpdateFlashBeforeDebugging>0</UpdateFlashBeforeDebugging> + <Capability>0</Capability> + <DriverSelection>-1</DriverSelection> + </Flash1> + <Flash2></Flash2> + <Flash3></Flash3> + <Flash4></Flash4> + </Utilities> + <TargetArmAds> + <ArmAdsMisc> + <GenerateListings>0</GenerateListings> + <asHll>1</asHll> + <asAsm>1</asAsm> + <asMacX>1</asMacX> + <asSyms>1</asSyms> + <asFals>1</asFals> + <asDbgD>1</asDbgD> + <asForm>1</asForm> + <ldLst>0</ldLst> + <ldmm>1</ldmm> + <ldXref>1</ldXref> + <BigEnd>0</BigEnd> + <AdsALst>1</AdsALst> + <AdsACrf>1</AdsACrf> + <AdsANop>0</AdsANop> + <AdsANot>0</AdsANot> + <AdsLLst>1</AdsLLst> + <AdsLmap>1</AdsLmap> + <AdsLcgr>1</AdsLcgr> + <AdsLsym>1</AdsLsym> + <AdsLszi>1</AdsLszi> + <AdsLtoi>1</AdsLtoi> + <AdsLsun>1</AdsLsun> + <AdsLven>1</AdsLven> + <AdsLsxf>1</AdsLsxf> + <RvctClst>0</RvctClst> + <GenPPlst>0</GenPPlst> + <AdsCpuType>"Cortex-M0"</AdsCpuType> + <RvctDeviceName></RvctDeviceName> + <mOS>0</mOS> + <uocRom>0</uocRom> + <uocRam>0</uocRam> + <hadIROM>0</hadIROM> + <hadIRAM>0</hadIRAM> + <hadXRAM>0</hadXRAM> + <uocXRam>0</uocXRam> + <RvdsVP>0</RvdsVP> + <hadIRAM2>0</hadIRAM2> + <hadIROM2>0</hadIROM2> + <StupSel>1</StupSel> + <useUlib>0</useUlib> + <EndSel>1</EndSel> + <uLtcg>0</uLtcg> + <RoSelD>0</RoSelD> + <RwSelD>5</RwSelD> + <CodeSel>0</CodeSel> + <OptFeed>0</OptFeed> + <NoZi1>0</NoZi1> + <NoZi2>0</NoZi2> + <NoZi3>0</NoZi3> + <NoZi4>0</NoZi4> + <NoZi5>0</NoZi5> + <Ro1Chk>1</Ro1Chk> + <Ro2Chk>0</Ro2Chk> + <Ro3Chk>0</Ro3Chk> + <Ir1Chk>0</Ir1Chk> + <Ir2Chk>0</Ir2Chk> + <Ra1Chk>1</Ra1Chk> + <Ra2Chk>0</Ra2Chk> + <Ra3Chk>0</Ra3Chk> + <Im1Chk>0</Im1Chk> + <Im2Chk>0</Im2Chk> + <OnChipMemories> + <Ocm1> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </Ocm1> + <Ocm2> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </Ocm2> + <Ocm3> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </Ocm3> + <Ocm4> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </Ocm4> + <Ocm5> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </Ocm5> + <Ocm6> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </Ocm6> + <IRAM> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </IRAM> + <IROM> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </IROM> + <XRAM> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </XRAM> + <OCR_RVCT1> + <Type>1</Type> + <StartAddress>0x0</StartAddress> + <Size>0x10000</Size> + </OCR_RVCT1> + <OCR_RVCT2> + <Type>1</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </OCR_RVCT2> + <OCR_RVCT3> + <Type>1</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </OCR_RVCT3> + <OCR_RVCT4> + <Type>1</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </OCR_RVCT4> + <OCR_RVCT5> + <Type>1</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </OCR_RVCT5> + <OCR_RVCT6> + <Type>0</Type> + <StartAddress>0x20000000</StartAddress> + <Size>0x10000</Size> + </OCR_RVCT6> + <OCR_RVCT7> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </OCR_RVCT7> + <OCR_RVCT8> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </OCR_RVCT8> + <OCR_RVCT9> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </OCR_RVCT9> + <OCR_RVCT10> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </OCR_RVCT10> + </OnChipMemories> + <RvctStartVector></RvctStartVector> + </ArmAdsMisc> + <Cads> + <interw>1</interw> + <Optim>4</Optim> + <oTime>0</oTime> + <SplitLS>0</SplitLS> + <OneElfS>0</OneElfS> + <Strict>0</Strict> + <EnumInt>0</EnumInt> + <PlainCh>0</PlainCh> + <Ropi>0</Ropi> + <Rwpi>0</Rwpi> + <wLevel>0</wLevel> + <uThumb>0</uThumb> + <uSurpInc>0</uSurpInc> + <VariousControls> + <MiscControls></MiscControls> + <Define>CORTEX_M0</Define> + <Undefine></Undefine> + <IncludePath>..\..\..\..\software\cmsis\CMSIS\Include; ..\..\..\..\software\cmsis\Device\ARM\CMSDK_CM0\Include; ..\..\..\..\software\common\retarget</IncludePath> + </VariousControls> + </Cads> + <Aads> + <interw>1</interw> + <Ropi>0</Ropi> + <Rwpi>0</Rwpi> + <thumb>0</thumb> + <SplitLS>0</SplitLS> + <SwStkChk>0</SwStkChk> + <NoWarn>0</NoWarn> + <uSurpInc>0</uSurpInc> + <VariousControls> + <MiscControls></MiscControls> + <Define></Define> + <Undefine></Undefine> + <IncludePath></IncludePath> + </VariousControls> + </Aads> + <LDads> + <umfTarg>1</umfTarg> + <Ropi>0</Ropi> + <Rwpi>0</Rwpi> + <noStLib>0</noStLib> + <RepFail>1</RepFail> + <useFile>0</useFile> + <TextAddressRange>0x00000000</TextAddressRange> + <DataAddressRange>0x00000000</DataAddressRange> + <ScatterFile></ScatterFile> + <IncludeLibs></IncludeLibs> + <IncludeLibsPath></IncludeLibsPath> + <Misc></Misc> + <LinkerInputFile></LinkerInputFile> + <DisabledWarnings></DisabledWarnings> + </LDads> + </TargetArmAds> + </TargetOption> + <Groups> + <Group> + <GroupName>Startup</GroupName> + <Files> + <File> + <FileName>startup_CMSDK_CM0.s</FileName> + <FileType>2</FileType> + <FilePath>..\..\..\..\software\cmsis\Device\ARM\CMSDK_CM0\Source\ARM\startup_CMSDK_CM0.s</FilePath> + </File> + </Files> + </Group> + <Group> + <GroupName>Application</GroupName> + <Files> + <File> + <FileName>timer_driver_tests.c</FileName> + <FileType>1</FileType> + <FilePath>..\..\..\..\software\common\validation\timer_driver_tests.c</FilePath> + </File> + <File> + <FileName>uart_stdout.c</FileName> + <FileType>1</FileType> + <FilePath>..\..\..\..\software\common\retarget\uart_stdout.c</FilePath> + </File> + <File> + <FileName>retarget.c</FileName> + <FileType>1</FileType> + <FilePath>..\..\..\..\software\common\retarget\retarget.c</FilePath> + </File> + <File> + <FileName>CMSDK_driver.c</FileName> + <FileType>1</FileType> + <FilePath>..\..\..\..\software\cmsis\Device\ARM\CMSDK_CM0\Source\CMSDK_driver.c</FilePath> + </File> + </Files> + </Group> + <Group> + <GroupName>System</GroupName> + <Files> + <File> + <FileName>system_CMSDK_CM0.c</FileName> + <FileType>1</FileType> + <FilePath>..\..\..\..\software\cmsis\Device\ARM\CMSDK_CM0\Source\system_CMSDK_CM0.c</FilePath> + </File> + </Files> + </Group> + </Groups> + </Target> + </Targets> + +</Project> diff --git a/Cortex-M0/nanosoc/systems/mcu/testcodes/timer_driver_tests/timer_driver_tests_cm0p.uvopt b/Cortex-M0/nanosoc/systems/mcu/testcodes/timer_driver_tests/timer_driver_tests_cm0p.uvopt new file mode 100644 index 0000000..a7ff673 --- /dev/null +++ b/Cortex-M0/nanosoc/systems/mcu/testcodes/timer_driver_tests/timer_driver_tests_cm0p.uvopt @@ -0,0 +1,258 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no" ?> +<ProjectOpt xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="project_opt.xsd"> + + <SchemaVersion>1.0</SchemaVersion> + + <Header>### uVision Project, (C) Keil Software</Header> + + <Extensions> + <cExt>*.c</cExt> + <aExt>*.s*; *.src; *.a*</aExt> + <oExt>*.obj</oExt> + <lExt>*.lib</lExt> + <tExt>*.txt; *.h; *.inc</tExt> + <pExt>*.plm</pExt> + <CppX>*.cpp</CppX> + </Extensions> + + <DaveTm> + <dwLowDateTime>0</dwLowDateTime> + <dwHighDateTime>0</dwHighDateTime> + </DaveTm> + + <Target> + <TargetName>Debug</TargetName> + <ToolsetNumber>0x4</ToolsetNumber> + <ToolsetName>ARM-ADS</ToolsetName> + <TargetOption> + <CLKADS>50000000</CLKADS> + <OPTTT> + <gFlags>1</gFlags> + <BeepAtEnd>1</BeepAtEnd> + <RunSim>1</RunSim> + <RunTarget>0</RunTarget> + </OPTTT> + <OPTHX> + <HexSelection>1</HexSelection> + <FlashByte>65535</FlashByte> + <HexRangeLowAddress>0</HexRangeLowAddress> + <HexRangeHighAddress>0</HexRangeHighAddress> + <HexOffset>0</HexOffset> + </OPTHX> + <OPTLEX> + <PageWidth>79</PageWidth> + <PageLength>66</PageLength> + <TabStop>8</TabStop> + <ListingPath>.\</ListingPath> + </OPTLEX> + <ListingPage> + <CreateCListing>1</CreateCListing> + <CreateAListing>1</CreateAListing> + <CreateLListing>1</CreateLListing> + <CreateIListing>0</CreateIListing> + <AsmCond>1</AsmCond> + <AsmSymb>1</AsmSymb> + <AsmXref>0</AsmXref> + <CCond>1</CCond> + <CCode>0</CCode> + <CListInc>0</CListInc> + <CSymb>0</CSymb> + <LinkerCodeListing>0</LinkerCodeListing> + </ListingPage> + <OPTXL> + <LMap>1</LMap> + <LComments>1</LComments> + <LGenerateSymbols>1</LGenerateSymbols> + <LLibSym>1</LLibSym> + <LLines>1</LLines> + <LLocSym>1</LLocSym> + <LPubSym>1</LPubSym> + <LXref>0</LXref> + <LExpSel>0</LExpSel> + </OPTXL> + <OPTFL> + <tvExp>1</tvExp> + <tvExpOptDlg>0</tvExpOptDlg> + <IsCurrentTarget>1</IsCurrentTarget> + </OPTFL> + <CpuCode>255</CpuCode> + <DllOpt> + <SimDllName>SARMCM3.DLL</SimDllName> + <SimDllArguments></SimDllArguments> + <SimDlgDllName>DARMCM1.DLL</SimDlgDllName> + <SimDlgDllArguments></SimDlgDllArguments> + <TargetDllName>SARMCM3.DLL</TargetDllName> + <TargetDllArguments></TargetDllArguments> + <TargetDlgDllName>TARMCM1.DLL</TargetDlgDllName> + <TargetDlgDllArguments></TargetDlgDllArguments> + </DllOpt> + <DebugOpt> + <uSim>1</uSim> + <uTrg>0</uTrg> + <sLdApp>1</sLdApp> + <sGomain>1</sGomain> + <sRbreak>1</sRbreak> + <sRwatch>1</sRwatch> + <sRmem>1</sRmem> + <sRfunc>1</sRfunc> + <sRbox>1</sRbox> + <tLdApp>1</tLdApp> + <tGomain>0</tGomain> + <tRbreak>1</tRbreak> + <tRwatch>1</tRwatch> + <tRmem>1</tRmem> + <tRfunc>0</tRfunc> + <tRbox>1</tRbox> + <sRunDeb>0</sRunDeb> + <sLrtime>0</sLrtime> + <nTsel>-1</nTsel> + <sDll></sDll> + <sDllPa></sDllPa> + <sDlgDll></sDlgDll> + <sDlgPa></sDlgPa> + <sIfile></sIfile> + <tDll></tDll> + <tDllPa></tDllPa> + <tDlgDll></tDlgDll> + <tDlgPa></tDlgPa> + <tIfile></tIfile> + <pMon></pMon> + </DebugOpt> + <Breakpoint/> + <DebugFlag> + <trace>0</trace> + <periodic>1</periodic> + <aLwin>0</aLwin> + <aCover>0</aCover> + <aSer1>0</aSer1> + <aSer2>0</aSer2> + <aPa>0</aPa> + <viewmode>0</viewmode> + <vrSel>0</vrSel> + <aSym>0</aSym> + <aTbox>0</aTbox> + <AscS1>0</AscS1> + <AscS2>0</AscS2> + <AscS3>0</AscS3> + <aSer3>0</aSer3> + <eProf>0</eProf> + <aLa>0</aLa> + <aPa1>0</aPa1> + <AscS4>0</AscS4> + <aSer4>0</aSer4> + <StkLoc>0</StkLoc> + <TrcWin>0</TrcWin> + <newCpu>0</newCpu> + <uProt>0</uProt> + </DebugFlag> + <LintExecutable></LintExecutable> + <LintConfigFile></LintConfigFile> + </TargetOption> + </Target> + + <Group> + <GroupName>Startup</GroupName> + <tvExp>1</tvExp> + <tvExpOptDlg>0</tvExpOptDlg> + <cbSel>0</cbSel> + <File> + <GroupNumber>1</GroupNumber> + <FileNumber>1</FileNumber> + <FileType>2</FileType> + <tvExp>0</tvExp> + <Focus>0</Focus> + <ColumnNumber>0</ColumnNumber> + <tvExpOptDlg>0</tvExpOptDlg> + <TopLine>0</TopLine> + <CurrentLine>0</CurrentLine> + <bDave2>0</bDave2> + <PathWithFileName>..\..\..\..\software\cmsis\Device\ARM\CMSDK_CM0plus\Source\ARM\startup_CMSDK_CM0plus.s</PathWithFileName> + <FilenameWithoutPath>startup_CMSDK_CM0plus.s</FilenameWithoutPath> + </File> + </Group> + + <Group> + <GroupName>Application</GroupName> + <tvExp>1</tvExp> + <tvExpOptDlg>0</tvExpOptDlg> + <cbSel>0</cbSel> + <File> + <GroupNumber>2</GroupNumber> + <FileNumber>2</FileNumber> + <FileType>1</FileType> + <tvExp>0</tvExp> + <Focus>0</Focus> + <ColumnNumber>0</ColumnNumber> + <tvExpOptDlg>0</tvExpOptDlg> + <TopLine>0</TopLine> + <CurrentLine>0</CurrentLine> + <bDave2>0</bDave2> + <PathWithFileName>..\..\..\..\software\common\validation\timer_driver_tests.c</PathWithFileName> + <FilenameWithoutPath>timer_driver_tests.c</FilenameWithoutPath> + </File> + <File> + <GroupNumber>2</GroupNumber> + <FileNumber>3</FileNumber> + <FileType>1</FileType> + <tvExp>0</tvExp> + <Focus>0</Focus> + <ColumnNumber>0</ColumnNumber> + <tvExpOptDlg>0</tvExpOptDlg> + <TopLine>0</TopLine> + <CurrentLine>0</CurrentLine> + <bDave2>0</bDave2> + <PathWithFileName>..\..\..\..\software\common\retarget\uart_stdout.c</PathWithFileName> + <FilenameWithoutPath>uart_stdout.c</FilenameWithoutPath> + </File> + <File> + <GroupNumber>2</GroupNumber> + <FileNumber>4</FileNumber> + <FileType>1</FileType> + <tvExp>0</tvExp> + <Focus>0</Focus> + <ColumnNumber>0</ColumnNumber> + <tvExpOptDlg>0</tvExpOptDlg> + <TopLine>0</TopLine> + <CurrentLine>0</CurrentLine> + <bDave2>0</bDave2> + <PathWithFileName>..\..\..\..\software\common\retarget\retarget.c</PathWithFileName> + <FilenameWithoutPath>retarget.c</FilenameWithoutPath> + </File> + <File> + <GroupNumber>2</GroupNumber> + <FileNumber>5</FileNumber> + <FileType>1</FileType> + <tvExp>0</tvExp> + <Focus>0</Focus> + <ColumnNumber>0</ColumnNumber> + <tvExpOptDlg>0</tvExpOptDlg> + <TopLine>0</TopLine> + <CurrentLine>0</CurrentLine> + <bDave2>0</bDave2> + <PathWithFileName>..\..\..\..\software\cmsis\Device\ARM\CMSDK_CM0plus\Source\CMSDK_driver.c</PathWithFileName> + <FilenameWithoutPath>CMSDK_driver.c</FilenameWithoutPath> + </File> + </Group> + + <Group> + <GroupName>System</GroupName> + <tvExp>1</tvExp> + <tvExpOptDlg>0</tvExpOptDlg> + <cbSel>0</cbSel> + <File> + <GroupNumber>3</GroupNumber> + <FileNumber>6</FileNumber> + <FileType>1</FileType> + <tvExp>0</tvExp> + <Focus>0</Focus> + <ColumnNumber>0</ColumnNumber> + <tvExpOptDlg>0</tvExpOptDlg> + <TopLine>0</TopLine> + <CurrentLine>0</CurrentLine> + <bDave2>0</bDave2> + <PathWithFileName>..\..\..\..\software\cmsis\Device\ARM\CMSDK_CM0plus\Source\system_CMSDK_CM0plus.c</PathWithFileName> + <FilenameWithoutPath>system_CMSDK_CM0plus.c</FilenameWithoutPath> + </File> + </Group> + +</ProjectOpt> diff --git a/Cortex-M0/nanosoc/systems/mcu/testcodes/timer_driver_tests/timer_driver_tests_cm0p.uvproj b/Cortex-M0/nanosoc/systems/mcu/testcodes/timer_driver_tests/timer_driver_tests_cm0p.uvproj new file mode 100644 index 0000000..2d1ed68 --- /dev/null +++ b/Cortex-M0/nanosoc/systems/mcu/testcodes/timer_driver_tests/timer_driver_tests_cm0p.uvproj @@ -0,0 +1,437 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no" ?> +<Project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="project_proj.xsd"> + + <SchemaVersion>1.1</SchemaVersion> + + <Header>### uVision Project, (C) Keil Software</Header> + + <Targets> + <Target> + <TargetName>Debug</TargetName> + <ToolsetNumber>0x4</ToolsetNumber> + <ToolsetName>ARM-ADS</ToolsetName> + <TargetOption> + <TargetCommonOption> + <Device>Cortex-M0+</Device> + <Vendor>ARM</Vendor> + <Cpu>CLOCK(12000000) CPUTYPE("Cortex-M0+") ESEL ELITTLE</Cpu> + <FlashUtilSpec></FlashUtilSpec> + <StartupFile></StartupFile> + <FlashDriverDll></FlashDriverDll> + <DeviceId>6268</DeviceId> + <RegisterFile></RegisterFile> + <MemoryEnv></MemoryEnv> + <Cmp></Cmp> + <Asm></Asm> + <Linker></Linker> + <OHString></OHString> + <InfinionOptionDll></InfinionOptionDll> + <SLE66CMisc></SLE66CMisc> + <SLE66AMisc></SLE66AMisc> + <SLE66LinkerMisc></SLE66LinkerMisc> + <SFDFile></SFDFile> + <UseEnv>0</UseEnv> + <BinPath></BinPath> + <IncludePath></IncludePath> + <LibPath></LibPath> + <RegisterFilePath></RegisterFilePath> + <DBRegisterFilePath></DBRegisterFilePath> + <TargetStatus> + <Error>0</Error> + <ExitCodeStop>0</ExitCodeStop> + <ButtonStop>0</ButtonStop> + <NotGenerated>0</NotGenerated> + <InvalidFlash>1</InvalidFlash> + </TargetStatus> + <OutputDirectory>.\</OutputDirectory> + <OutputName>timer_driver_tests</OutputName> + <CreateExecutable>1</CreateExecutable> + <CreateLib>0</CreateLib> + <CreateHexFile>0</CreateHexFile> + <DebugInformation>1</DebugInformation> + <BrowseInformation>1</BrowseInformation> + <ListingPath>.\</ListingPath> + <HexFormatSelection>1</HexFormatSelection> + <Merge32K>0</Merge32K> + <CreateBatchFile>0</CreateBatchFile> + <BeforeCompile> + <RunUserProg1>0</RunUserProg1> + <RunUserProg2>0</RunUserProg2> + <UserProg1Name></UserProg1Name> + <UserProg2Name></UserProg2Name> + <UserProg1Dos16Mode>0</UserProg1Dos16Mode> + <UserProg2Dos16Mode>0</UserProg2Dos16Mode> + <nStopU1X>0</nStopU1X> + <nStopU2X>0</nStopU2X> + </BeforeCompile> + <BeforeMake> + <RunUserProg1>0</RunUserProg1> + <RunUserProg2>0</RunUserProg2> + <UserProg1Name></UserProg1Name> + <UserProg2Name></UserProg2Name> + <UserProg1Dos16Mode>0</UserProg1Dos16Mode> + <UserProg2Dos16Mode>0</UserProg2Dos16Mode> + </BeforeMake> + <AfterMake> + <RunUserProg1>1</RunUserProg1> + <RunUserProg2>0</RunUserProg2> + <UserProg1Name>$K\ARM\ARMCC\BIN\fromelf.exe #L --vhx --8x1 --output timer_driver_tests.hex</UserProg1Name> + <UserProg2Name></UserProg2Name> + <UserProg1Dos16Mode>0</UserProg1Dos16Mode> + <UserProg2Dos16Mode>0</UserProg2Dos16Mode> + </AfterMake> + <SelectedForBatchBuild>0</SelectedForBatchBuild> + <SVCSIdString></SVCSIdString> + </TargetCommonOption> + <CommonProperty> + <UseCPPCompiler>0</UseCPPCompiler> + <RVCTCodeConst>0</RVCTCodeConst> + <RVCTZI>0</RVCTZI> + <RVCTOtherData>0</RVCTOtherData> + <ModuleSelection>0</ModuleSelection> + <IncludeInBuild>1</IncludeInBuild> + <AlwaysBuild>0</AlwaysBuild> + <GenerateAssemblyFile>0</GenerateAssemblyFile> + <AssembleAssemblyFile>0</AssembleAssemblyFile> + <PublicsOnly>0</PublicsOnly> + <StopOnExitCode>3</StopOnExitCode> + <CustomArgument></CustomArgument> + <IncludeLibraryModules></IncludeLibraryModules> + </CommonProperty> + <DllOption> + <SimDllName>SARMCM3.DLL</SimDllName> + <SimDllArguments></SimDllArguments> + <SimDlgDll>DARMCM1.DLL</SimDlgDll> + <SimDlgDllArguments></SimDlgDllArguments> + <TargetDllName>SARMCM3.DLL</TargetDllName> + <TargetDllArguments></TargetDllArguments> + <TargetDlgDll>TARMCM1.DLL</TargetDlgDll> + <TargetDlgDllArguments></TargetDlgDllArguments> + </DllOption> + <DebugOption> + <OPTHX> + <HexSelection>1</HexSelection> + <HexRangeLowAddress>0</HexRangeLowAddress> + <HexRangeHighAddress>0</HexRangeHighAddress> + <HexOffset>0</HexOffset> + <Oh166RecLen>16</Oh166RecLen> + </OPTHX> + <Simulator> + <UseSimulator>1</UseSimulator> + <LoadApplicationAtStartup>1</LoadApplicationAtStartup> + <RunToMain>1</RunToMain> + <RestoreBreakpoints>1</RestoreBreakpoints> + <RestoreWatchpoints>1</RestoreWatchpoints> + <RestoreMemoryDisplay>1</RestoreMemoryDisplay> + <RestoreFunctions>1</RestoreFunctions> + <RestoreToolbox>1</RestoreToolbox> + <LimitSpeedToRealTime>0</LimitSpeedToRealTime> + </Simulator> + <Target> + <UseTarget>0</UseTarget> + <LoadApplicationAtStartup>1</LoadApplicationAtStartup> + <RunToMain>0</RunToMain> + <RestoreBreakpoints>1</RestoreBreakpoints> + <RestoreWatchpoints>1</RestoreWatchpoints> + <RestoreMemoryDisplay>1</RestoreMemoryDisplay> + <RestoreFunctions>0</RestoreFunctions> + <RestoreToolbox>1</RestoreToolbox> + </Target> + <RunDebugAfterBuild>0</RunDebugAfterBuild> + <TargetSelection>-1</TargetSelection> + <SimDlls> + <CpuDll></CpuDll> + <CpuDllArguments></CpuDllArguments> + <PeripheralDll></PeripheralDll> + <PeripheralDllArguments></PeripheralDllArguments> + <InitializationFile></InitializationFile> + </SimDlls> + <TargetDlls> + <CpuDll></CpuDll> + <CpuDllArguments></CpuDllArguments> + <PeripheralDll></PeripheralDll> + <PeripheralDllArguments></PeripheralDllArguments> + <InitializationFile></InitializationFile> + <Driver></Driver> + </TargetDlls> + </DebugOption> + <Utilities> + <Flash1> + <UseTargetDll>0</UseTargetDll> + <UseExternalTool>0</UseExternalTool> + <RunIndependent>0</RunIndependent> + <UpdateFlashBeforeDebugging>0</UpdateFlashBeforeDebugging> + <Capability>0</Capability> + <DriverSelection>-1</DriverSelection> + </Flash1> + <Flash2></Flash2> + <Flash3></Flash3> + <Flash4></Flash4> + </Utilities> + <TargetArmAds> + <ArmAdsMisc> + <GenerateListings>0</GenerateListings> + <asHll>1</asHll> + <asAsm>1</asAsm> + <asMacX>1</asMacX> + <asSyms>1</asSyms> + <asFals>1</asFals> + <asDbgD>1</asDbgD> + <asForm>1</asForm> + <ldLst>0</ldLst> + <ldmm>1</ldmm> + <ldXref>1</ldXref> + <BigEnd>0</BigEnd> + <AdsALst>1</AdsALst> + <AdsACrf>1</AdsACrf> + <AdsANop>0</AdsANop> + <AdsANot>0</AdsANot> + <AdsLLst>1</AdsLLst> + <AdsLmap>1</AdsLmap> + <AdsLcgr>1</AdsLcgr> + <AdsLsym>1</AdsLsym> + <AdsLszi>1</AdsLszi> + <AdsLtoi>1</AdsLtoi> + <AdsLsun>1</AdsLsun> + <AdsLven>1</AdsLven> + <AdsLsxf>1</AdsLsxf> + <RvctClst>0</RvctClst> + <GenPPlst>0</GenPPlst> + <AdsCpuType>"Cortex-M0+"</AdsCpuType> + <RvctDeviceName></RvctDeviceName> + <mOS>0</mOS> + <uocRom>0</uocRom> + <uocRam>0</uocRam> + <hadIROM>0</hadIROM> + <hadIRAM>0</hadIRAM> + <hadXRAM>0</hadXRAM> + <uocXRam>0</uocXRam> + <RvdsVP>0</RvdsVP> + <hadIRAM2>0</hadIRAM2> + <hadIROM2>0</hadIROM2> + <StupSel>1</StupSel> + <useUlib>0</useUlib> + <EndSel>1</EndSel> + <uLtcg>0</uLtcg> + <RoSelD>0</RoSelD> + <RwSelD>5</RwSelD> + <CodeSel>0</CodeSel> + <OptFeed>0</OptFeed> + <NoZi1>0</NoZi1> + <NoZi2>0</NoZi2> + <NoZi3>0</NoZi3> + <NoZi4>0</NoZi4> + <NoZi5>0</NoZi5> + <Ro1Chk>1</Ro1Chk> + <Ro2Chk>0</Ro2Chk> + <Ro3Chk>0</Ro3Chk> + <Ir1Chk>0</Ir1Chk> + <Ir2Chk>0</Ir2Chk> + <Ra1Chk>1</Ra1Chk> + <Ra2Chk>0</Ra2Chk> + <Ra3Chk>0</Ra3Chk> + <Im1Chk>0</Im1Chk> + <Im2Chk>0</Im2Chk> + <OnChipMemories> + <Ocm1> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </Ocm1> + <Ocm2> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </Ocm2> + <Ocm3> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </Ocm3> + <Ocm4> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </Ocm4> + <Ocm5> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </Ocm5> + <Ocm6> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </Ocm6> + <IRAM> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </IRAM> + <IROM> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </IROM> + <XRAM> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </XRAM> + <OCR_RVCT1> + <Type>1</Type> + <StartAddress>0x0</StartAddress> + <Size>0x10000</Size> + </OCR_RVCT1> + <OCR_RVCT2> + <Type>1</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </OCR_RVCT2> + <OCR_RVCT3> + <Type>1</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </OCR_RVCT3> + <OCR_RVCT4> + <Type>1</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </OCR_RVCT4> + <OCR_RVCT5> + <Type>1</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </OCR_RVCT5> + <OCR_RVCT6> + <Type>0</Type> + <StartAddress>0x20000000</StartAddress> + <Size>0x10000</Size> + </OCR_RVCT6> + <OCR_RVCT7> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </OCR_RVCT7> + <OCR_RVCT8> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </OCR_RVCT8> + <OCR_RVCT9> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </OCR_RVCT9> + <OCR_RVCT10> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </OCR_RVCT10> + </OnChipMemories> + <RvctStartVector></RvctStartVector> + </ArmAdsMisc> + <Cads> + <interw>1</interw> + <Optim>4</Optim> + <oTime>0</oTime> + <SplitLS>0</SplitLS> + <OneElfS>0</OneElfS> + <Strict>0</Strict> + <EnumInt>0</EnumInt> + <PlainCh>0</PlainCh> + <Ropi>0</Ropi> + <Rwpi>0</Rwpi> + <wLevel>0</wLevel> + <uThumb>0</uThumb> + <VariousControls> + <MiscControls></MiscControls> + <Define>CORTEX_M0PLUS</Define> + <Undefine></Undefine> + <IncludePath>..\..\..\..\software\cmsis\CMSIS\Include; ..\..\..\..\software\cmsis\Device\ARM\CMSDK_CM0plus\Include; ..\..\..\..\software\common\retarget</IncludePath> + </VariousControls> + </Cads> + <Aads> + <interw>1</interw> + <Ropi>0</Ropi> + <Rwpi>0</Rwpi> + <thumb>0</thumb> + <SplitLS>0</SplitLS> + <SwStkChk>0</SwStkChk> + <NoWarn>0</NoWarn> + <VariousControls> + <MiscControls></MiscControls> + <Define></Define> + <Undefine></Undefine> + <IncludePath></IncludePath> + </VariousControls> + </Aads> + <LDads> + <umfTarg>1</umfTarg> + <Ropi>0</Ropi> + <Rwpi>0</Rwpi> + <noStLib>0</noStLib> + <RepFail>1</RepFail> + <useFile>0</useFile> + <TextAddressRange>0x00000000</TextAddressRange> + <DataAddressRange>0x00000000</DataAddressRange> + <ScatterFile></ScatterFile> + <IncludeLibs></IncludeLibs> + <IncludeLibsPath></IncludeLibsPath> + <Misc></Misc> + <LinkerInputFile></LinkerInputFile> + <DisabledWarnings></DisabledWarnings> + </LDads> + </TargetArmAds> + </TargetOption> + <Groups> + <Group> + <GroupName>Startup</GroupName> + <Files> + <File> + <FileName>startup_CMSDK_CM0plus.s</FileName> + <FileType>2</FileType> + <FilePath>..\..\..\..\software\cmsis\Device\ARM\CMSDK_CM0plus\Source\ARM\startup_CMSDK_CM0plus.s</FilePath> + </File> + </Files> + </Group> + <Group> + <GroupName>Application</GroupName> + <Files> + <File> + <FileName>timer_driver_tests.c</FileName> + <FileType>1</FileType> + <FilePath>..\..\..\..\software\common\validation\timer_driver_tests.c</FilePath> + </File> + <File> + <FileName>uart_stdout.c</FileName> + <FileType>1</FileType> + <FilePath>..\..\..\..\software\common\retarget\uart_stdout.c</FilePath> + </File> + <File> + <FileName>retarget.c</FileName> + <FileType>1</FileType> + <FilePath>..\..\..\..\software\common\retarget\retarget.c</FilePath> + </File> + <File> + <FileName>CMSDK_driver.c</FileName> + <FileType>1</FileType> + <FilePath>..\..\..\..\software\cmsis\Device\ARM\CMSDK_CM0plus\Source\CMSDK_driver.c</FilePath> + </File> + </Files> + </Group> + <Group> + <GroupName>System</GroupName> + <Files> + <File> + <FileName>system_CMSDK_CM0plus.c</FileName> + <FileType>1</FileType> + <FilePath>..\..\..\..\software\cmsis\Device\ARM\CMSDK_CM0plus\Source\system_CMSDK_CM0plus.c</FilePath> + </File> + </Files> + </Group> + </Groups> + </Target> + </Targets> + +</Project> diff --git a/Cortex-M0/nanosoc/systems/mcu/testcodes/timer_tests/makefile b/Cortex-M0/nanosoc/systems/mcu/testcodes/timer_tests/makefile new file mode 100644 index 0000000..7133f7f --- /dev/null +++ b/Cortex-M0/nanosoc/systems/mcu/testcodes/timer_tests/makefile @@ -0,0 +1,250 @@ +#----------------------------------------------------------------------------- +# The confidential and proprietary information contained in this file may +# only be used by a person authorised under and to the extent permitted +# by a subsisting licensing agreement from Arm Limited or its affiliates. +# +# (C) COPYRIGHT 2010-2013 Arm Limited or its affiliates. +# ALL RIGHTS RESERVED +# +# This entire notice must be reproduced on all copies of this file +# and copies of this file may only be made by a person if such person is +# permitted to do so under the terms of a subsisting license agreement +# from Arm Limited or its affiliates. +# +# SVN Information +# +# Checked In : $Date: 2017-10-10 15:55:38 +0100 (Tue, 10 Oct 2017) $ +# +# Revision : $Revision: 371321 $ +# +# Release Information : Cortex-M System Design Kit-r1p1-00rel0 +#----------------------------------------------------------------------------- +# +# Cortex-M System Design Kit software compilation make file +# +#----------------------------------------------------------------------------- +# +# Configurations +# +# Choose the core instantiated, can be +# - CORTEX_M0 +# - CORTEX_M0PLUS +CPU_PRODUCT = CORTEX_M0PLUS + +# Shared software directory +SOFTWARE_DIR = ../../../../software +CMSIS_DIR = $(SOFTWARE_DIR)/cmsis +CORE_DIR = $(CMSIS_DIR)/CMSIS/Include + +ifeq ($(CPU_PRODUCT),CORTEX_M0PLUS) + DEVICE_DIR = $(CMSIS_DIR)/Device/ARM/CMSDK_CM0plus +else + DEVICE_DIR = $(CMSIS_DIR)/Device/ARM/CMSDK_CM0 +endif + +# Program file +TESTNAME = timer_tests + +# Endian Option +COMPILE_BIGEND = 0 + +# Configuration +ifeq ($(CPU_PRODUCT),CORTEX_M0PLUS) + USER_DEFINE = -DCORTEX_M0PLUS +else + USER_DEFINE = -DCORTEX_M0 +endif + +DEPS_LIST = makefile + +# Tool chain : ds5 / gcc / keil +TOOL_CHAIN = ds5 + +ifeq ($(TOOL_CHAIN),ds5) + ifeq ($(CPU_PRODUCT),CORTEX_M0PLUS) + CPU_TYPE = --cpu Cortex-M0plus + else + CPU_TYPE = --cpu Cortex-M0 + endif +endif + +ifeq ($(TOOL_CHAIN),gcc) + ifeq ($(CPU_PRODUCT),CORTEX_M0PLUS) + CPU_TYPE = -mcpu=cortex-m0plus + else + CPU_TYPE = -mcpu=cortex-m0 + endif +endif + +# Startup code directory for DS-5 +ifeq ($(TOOL_CHAIN),ds5) + STARTUP_DIR = $(DEVICE_DIR)/Source/ARM +endif + +# Startup code directory for gcc +ifeq ($(TOOL_CHAIN),gcc) + STARTUP_DIR = $(DEVICE_DIR)/Source/GCC +endif + +ifeq ($(CPU_PRODUCT),CORTEX_M0PLUS) + STARTUP_FILE = startup_CMSDK_CM0plus + SYSTEM_FILE = system_CMSDK_CM0plus +else + STARTUP_FILE = startup_CMSDK_CM0 + SYSTEM_FILE = system_CMSDK_CM0 +endif + +# --------------------------------------------------------------------------------------- +# DS-5 options + +# MicroLIB option +COMPILE_MICROLIB = 0 + +# Small Multiply (Cortex-M0/M0+ has small multiplier option) +COMPILE_SMALLMUL = 0 + +ARM_CC_OPTIONS = -c -O3 -g -Otime $(USER_DEFINE) \ + -I $(DEVICE_DIR)/Include -I $(CORE_DIR) -I $(SOFTWARE_DIR)/common/retarget +ARM_ASM_OPTIONS = -g +ARM_LINK_OPTIONS = "--keep=$(STARTUP_FILE).o(RESET)" "--first=$(STARTUP_FILE).o(RESET)" \ + --rw_base 0x30000000 --ro_base 0x00000000 --map + +ifeq ($(COMPILE_BIGEND),1) + # Big Endian + ARM_CC_OPTIONS += --bigend + ARM_ASM_OPTIONS += --bigend + ARM_LINK_OPTIONS += --be8 +endif + +ifeq ($(COMPILE_MICROLIB),1) + # MicroLIB + ARM_CC_OPTIONS += --library_type=microlib + ARM_ASM_OPTIONS += --library_type=microlib --pd "__MICROLIB SETA 1" + ARM_LINK_OPTIONS += --library_type=microlib +endif + +ifeq ($(COMPILE_SMALLMUL),1) + # In Cortex-M0, small multiply takes 32 cycles + ARM_CC_OPTIONS += --multiply_latency=32 +endif + +# --------------------------------------------------------------------------------------- +# gcc options + +GNG_CC = arm-none-eabi-gcc +GNU_OBJDUMP = arm-none-eabi-objdump +GNU_OBJCOPY = arm-none-eabi-objcopy + +LINKER_SCRIPT_PATH = $(SOFTWARE_DIR)/common/scripts +LINKER_SCRIPT = $(LINKER_SCRIPT_PATH)/cmsdk_cm0.ld + +GNU_CC_FLAGS = -g -O3 -mthumb $(CPU_TYPE) + +ifeq ($(COMPILE_BIGEND),1) + # Big Endian + GNU_CC_FLAGS += -mbig-endian +endif + +# --------------------------------------------------------------------------------------- +all: all_$(TOOL_CHAIN) + +# --------------------------------------------------------------------------------------- +# DS-5 + +all_ds5 : $(TESTNAME).hex $(TESTNAME).lst + +$(TESTNAME).o : $(SOFTWARE_DIR)/common/validation/$(TESTNAME).c $(DEPS_LIST) + armcc $(ARM_CC_OPTIONS) $(CPU_TYPE) $< -o $@ + +$(SYSTEM_FILE).o : $(DEVICE_DIR)/Source/$(SYSTEM_FILE).c $(DEPS_LIST) + armcc $(ARM_CC_OPTIONS) $(CPU_TYPE) $< -o $@ + +retarget.o : $(SOFTWARE_DIR)/common/retarget/retarget.c $(DEPS_LIST) + armcc $(ARM_CC_OPTIONS) $(CPU_TYPE) $< -o $@ + +uart_stdout.o : $(SOFTWARE_DIR)/common/retarget/uart_stdout.c $(DEPS_LIST) + armcc $(ARM_CC_OPTIONS) $(CPU_TYPE) $< -o $@ + +$(STARTUP_FILE).o : $(STARTUP_DIR)/$(STARTUP_FILE).s $(DEPS_LIST) + armasm $(ARM_ASM_OPTIONS) $(CPU_TYPE) $< -o $@ + +$(TESTNAME).ELF : $(TESTNAME).o $(SYSTEM_FILE).o $(STARTUP_FILE).o retarget.o uart_stdout.o + armlink $(ARM_LINK_OPTIONS) -o $@ $(TESTNAME).o $(SYSTEM_FILE).o $(STARTUP_FILE).o retarget.o uart_stdout.o + +$(TESTNAME).hex : $(TESTNAME).ELF + fromelf --vhx --8x1 $< --output $@ + +$(TESTNAME).lst : $(TESTNAME).ELF makefile + fromelf -c -d -e -s $< --output $@ + +# --------------------------------------------------------------------------------------- +# gcc +all_gcc: + $(GNG_CC) $(GNU_CC_FLAGS) $(STARTUP_DIR)/$(STARTUP_FILE).s \ + $(SOFTWARE_DIR)/common/validation/$(TESTNAME).c \ + $(SOFTWARE_DIR)/common/retarget/retarget.c \ + $(SOFTWARE_DIR)/common/retarget/uart_stdout.c \ + $(DEVICE_DIR)/Source/$(SYSTEM_FILE).c \ + -I $(DEVICE_DIR)/Include -I $(CORE_DIR) \ + -I $(SOFTWARE_DIR)/common/retarget \ + -L $(LINKER_SCRIPT_PATH) \ + -D__STACK_SIZE=0x200 \ + -D__HEAP_SIZE=0x1000 \ + $(USER_DEFINE) -T $(LINKER_SCRIPT) -o $(TESTNAME).o + # Generate disassembly code + $(GNU_OBJDUMP) -S $(TESTNAME).o > $(TESTNAME).lst + # Generate binary file + $(GNU_OBJCOPY) -S $(TESTNAME).o -O binary $(TESTNAME).bin + # Generate hex file + $(GNU_OBJCOPY) -S $(TESTNAME).o -O verilog $(TESTNAME).hex + +# Note: +# If the version of object copy you are using does not support verilog hex file output, +# you can generate the hex file from binary file using the following command +# od -v -A n -t x1 --width=1 $(TESTNAME).bin > $(TESTNAME).hex + +# --------------------------------------------------------------------------------------- +# Keil MDK + +all_keil: + @echo "Please compile your project code and press ENTER when ready" + @read dummy + +# --------------------------------------------------------------------------------------- +# Binary + +all_bin: $(TESTNAME).bin + # Generate hex file from binary + od -v -A n -t x1 --width=1 $(TESTNAME).bin > $(TESTNAME).hex + +# --------------------------------------------------------------------------------------- +# Clean + +clean : + @rm -rf *.o + @if [ -e $(TESTNAME).hex ] ; then \ + rm -rf $(TESTNAME).hex ; \ + fi + @if [ -e $(TESTNAME).lst ] ; then \ + rm -rf $(TESTNAME).lst ; \ + fi + @if [ -e $(TESTNAME).ELF ] ; then \ + rm -rf $(TESTNAME).ELF ; \ + fi + @if [ -e $(TESTNAME).bin ] ; then \ + rm -rf $(TESTNAME).bin ; \ + fi + @rm -rf *.crf + @rm -rf *.plg + @rm -rf *.tra + @rm -rf *.htm + @rm -rf *.map + @rm -rf *.dep + @rm -rf *.d + @rm -rf *.lnp + @rm -rf *.bak + @rm -rf *.lst + @rm -rf *.axf + @rm -rf *.sct + @rm -rf *.__i + @rm -rf *._ia diff --git a/Cortex-M0/nanosoc/systems/mcu/testcodes/timer_tests/timer_tests_cm0.uvopt b/Cortex-M0/nanosoc/systems/mcu/testcodes/timer_tests/timer_tests_cm0.uvopt new file mode 100644 index 0000000..173dc40 --- /dev/null +++ b/Cortex-M0/nanosoc/systems/mcu/testcodes/timer_tests/timer_tests_cm0.uvopt @@ -0,0 +1,261 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no" ?> +<ProjectOpt xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="project_opt.xsd"> + + <SchemaVersion>1.0</SchemaVersion> + + <Header>### uVision Project, (C) Keil Software</Header> + + <Extensions> + <cExt>*.c</cExt> + <aExt>*.s*; *.src; *.a*</aExt> + <oExt>*.obj</oExt> + <lExt>*.lib</lExt> + <tExt>*.txt; *.h; *.inc</tExt> + <pExt>*.plm</pExt> + <CppX>*.cpp</CppX> + </Extensions> + + <DaveTm> + <dwLowDateTime>0</dwLowDateTime> + <dwHighDateTime>0</dwHighDateTime> + </DaveTm> + + <Target> + <TargetName>Debug</TargetName> + <ToolsetNumber>0x4</ToolsetNumber> + <ToolsetName>ARM-ADS</ToolsetName> + <TargetOption> + <CLKADS>50000000</CLKADS> + <OPTTT> + <gFlags>1</gFlags> + <BeepAtEnd>1</BeepAtEnd> + <RunSim>1</RunSim> + <RunTarget>0</RunTarget> + </OPTTT> + <OPTHX> + <HexSelection>1</HexSelection> + <FlashByte>65535</FlashByte> + <HexRangeLowAddress>0</HexRangeLowAddress> + <HexRangeHighAddress>0</HexRangeHighAddress> + <HexOffset>0</HexOffset> + </OPTHX> + <OPTLEX> + <PageWidth>79</PageWidth> + <PageLength>66</PageLength> + <TabStop>8</TabStop> + <ListingPath>.\</ListingPath> + </OPTLEX> + <ListingPage> + <CreateCListing>1</CreateCListing> + <CreateAListing>1</CreateAListing> + <CreateLListing>1</CreateLListing> + <CreateIListing>0</CreateIListing> + <AsmCond>1</AsmCond> + <AsmSymb>1</AsmSymb> + <AsmXref>0</AsmXref> + <CCond>1</CCond> + <CCode>0</CCode> + <CListInc>0</CListInc> + <CSymb>0</CSymb> + <LinkerCodeListing>0</LinkerCodeListing> + </ListingPage> + <OPTXL> + <LMap>1</LMap> + <LComments>1</LComments> + <LGenerateSymbols>1</LGenerateSymbols> + <LLibSym>1</LLibSym> + <LLines>1</LLines> + <LLocSym>1</LLocSym> + <LPubSym>1</LPubSym> + <LXref>0</LXref> + <LExpSel>0</LExpSel> + </OPTXL> + <OPTFL> + <tvExp>1</tvExp> + <tvExpOptDlg>0</tvExpOptDlg> + <IsCurrentTarget>1</IsCurrentTarget> + </OPTFL> + <CpuCode>255</CpuCode> + <DllOpt> + <SimDllName>SARMCM3.DLL</SimDllName> + <SimDllArguments></SimDllArguments> + <SimDlgDllName>DARMCM1.DLL</SimDlgDllName> + <SimDlgDllArguments></SimDlgDllArguments> + <TargetDllName>SARMCM3.DLL</TargetDllName> + <TargetDllArguments></TargetDllArguments> + <TargetDlgDllName>TARMCM1.DLL</TargetDlgDllName> + <TargetDlgDllArguments></TargetDlgDllArguments> + </DllOpt> + <DebugOpt> + <uSim>1</uSim> + <uTrg>0</uTrg> + <sLdApp>1</sLdApp> + <sGomain>1</sGomain> + <sRbreak>1</sRbreak> + <sRwatch>1</sRwatch> + <sRmem>1</sRmem> + <sRfunc>1</sRfunc> + <sRbox>1</sRbox> + <tLdApp>1</tLdApp> + <tGomain>0</tGomain> + <tRbreak>1</tRbreak> + <tRwatch>1</tRwatch> + <tRmem>1</tRmem> + <tRfunc>0</tRfunc> + <tRbox>1</tRbox> + <tRtrace>0</tRtrace> + <sRunDeb>0</sRunDeb> + <sLrtime>0</sLrtime> + <nTsel>-1</nTsel> + <sDll></sDll> + <sDllPa></sDllPa> + <sDlgDll></sDlgDll> + <sDlgPa></sDlgPa> + <sIfile></sIfile> + <tDll></tDll> + <tDllPa></tDllPa> + <tDlgDll></tDlgDll> + <tDlgPa></tDlgPa> + <tIfile></tIfile> + <pMon></pMon> + </DebugOpt> + <Breakpoint/> + <DebugFlag> + <trace>0</trace> + <periodic>1</periodic> + <aLwin>0</aLwin> + <aCover>0</aCover> + <aSer1>0</aSer1> + <aSer2>0</aSer2> + <aPa>0</aPa> + <viewmode>0</viewmode> + <vrSel>0</vrSel> + <aSym>0</aSym> + <aTbox>0</aTbox> + <AscS1>0</AscS1> + <AscS2>0</AscS2> + <AscS3>0</AscS3> + <aSer3>0</aSer3> + <eProf>0</eProf> + <aLa>0</aLa> + <aPa1>0</aPa1> + <AscS4>0</AscS4> + <aSer4>0</aSer4> + <StkLoc>0</StkLoc> + <TrcWin>0</TrcWin> + <newCpu>0</newCpu> + <uProt>0</uProt> + </DebugFlag> + <Tracepoint> + <THDelay>0</THDelay> + </Tracepoint> + <LintExecutable></LintExecutable> + <LintConfigFile></LintConfigFile> + </TargetOption> + </Target> + + <Group> + <GroupName>Startup</GroupName> + <tvExp>1</tvExp> + <tvExpOptDlg>0</tvExpOptDlg> + <cbSel>0</cbSel> + <RteFlg>0</RteFlg> + <File> + <GroupNumber>1</GroupNumber> + <FileNumber>1</FileNumber> + <FileType>2</FileType> + <tvExp>0</tvExp> + <Focus>0</Focus> + <ColumnNumber>0</ColumnNumber> + <tvExpOptDlg>0</tvExpOptDlg> + <TopLine>0</TopLine> + <CurrentLine>0</CurrentLine> + <bDave2>0</bDave2> + <PathWithFileName>..\..\..\..\software\cmsis\Device\ARM\CMSDK_CM0\Source\ARM\startup_CMSDK_CM0.s</PathWithFileName> + <FilenameWithoutPath>startup_CMSDK_CM0.s</FilenameWithoutPath> + <RteFlg>0</RteFlg> + <bShared>0</bShared> + </File> + </Group> + + <Group> + <GroupName>Application</GroupName> + <tvExp>1</tvExp> + <tvExpOptDlg>0</tvExpOptDlg> + <cbSel>0</cbSel> + <RteFlg>0</RteFlg> + <File> + <GroupNumber>2</GroupNumber> + <FileNumber>2</FileNumber> + <FileType>1</FileType> + <tvExp>0</tvExp> + <Focus>0</Focus> + <ColumnNumber>0</ColumnNumber> + <tvExpOptDlg>0</tvExpOptDlg> + <TopLine>0</TopLine> + <CurrentLine>0</CurrentLine> + <bDave2>0</bDave2> + <PathWithFileName>..\..\..\..\software\common\retarget\uart_stdout.c</PathWithFileName> + <FilenameWithoutPath>uart_stdout.c</FilenameWithoutPath> + <RteFlg>0</RteFlg> + <bShared>0</bShared> + </File> + <File> + <GroupNumber>2</GroupNumber> + <FileNumber>3</FileNumber> + <FileType>1</FileType> + <tvExp>0</tvExp> + <Focus>0</Focus> + <ColumnNumber>0</ColumnNumber> + <tvExpOptDlg>0</tvExpOptDlg> + <TopLine>0</TopLine> + <CurrentLine>0</CurrentLine> + <bDave2>0</bDave2> + <PathWithFileName>..\..\..\..\software\common\retarget\retarget.c</PathWithFileName> + <FilenameWithoutPath>retarget.c</FilenameWithoutPath> + <RteFlg>0</RteFlg> + <bShared>0</bShared> + </File> + <File> + <GroupNumber>2</GroupNumber> + <FileNumber>4</FileNumber> + <FileType>1</FileType> + <tvExp>0</tvExp> + <Focus>0</Focus> + <ColumnNumber>0</ColumnNumber> + <tvExpOptDlg>0</tvExpOptDlg> + <TopLine>0</TopLine> + <CurrentLine>0</CurrentLine> + <bDave2>0</bDave2> + <PathWithFileName>..\..\..\..\software\common\validation\timer_tests.c</PathWithFileName> + <FilenameWithoutPath>timer_tests.c</FilenameWithoutPath> + <RteFlg>0</RteFlg> + <bShared>0</bShared> + </File> + </Group> + + <Group> + <GroupName>System</GroupName> + <tvExp>1</tvExp> + <tvExpOptDlg>0</tvExpOptDlg> + <cbSel>0</cbSel> + <RteFlg>0</RteFlg> + <File> + <GroupNumber>3</GroupNumber> + <FileNumber>5</FileNumber> + <FileType>1</FileType> + <tvExp>0</tvExp> + <Focus>0</Focus> + <ColumnNumber>0</ColumnNumber> + <tvExpOptDlg>0</tvExpOptDlg> + <TopLine>0</TopLine> + <CurrentLine>0</CurrentLine> + <bDave2>0</bDave2> + <PathWithFileName>..\..\..\..\software\cmsis\Device\ARM\CMSDK_CM0\Source\system_CMSDK_CM0.c</PathWithFileName> + <FilenameWithoutPath>system_CMSDK_CM0.c</FilenameWithoutPath> + <RteFlg>0</RteFlg> + <bShared>0</bShared> + </File> + </Group> + +</ProjectOpt> diff --git a/Cortex-M0/nanosoc/systems/mcu/testcodes/timer_tests/timer_tests_cm0.uvproj b/Cortex-M0/nanosoc/systems/mcu/testcodes/timer_tests/timer_tests_cm0.uvproj new file mode 100644 index 0000000..b12e58d --- /dev/null +++ b/Cortex-M0/nanosoc/systems/mcu/testcodes/timer_tests/timer_tests_cm0.uvproj @@ -0,0 +1,435 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no" ?> +<Project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="project_proj.xsd"> + + <SchemaVersion>1.1</SchemaVersion> + + <Header>### uVision Project, (C) Keil Software</Header> + + <Targets> + <Target> + <TargetName>Debug</TargetName> + <ToolsetNumber>0x4</ToolsetNumber> + <ToolsetName>ARM-ADS</ToolsetName> + <TargetOption> + <TargetCommonOption> + <Device>Cortex-M0</Device> + <Vendor>ARM</Vendor> + <Cpu>CLOCK(12000000) CPUTYPE("Cortex-M0") ESEL ELITTLE</Cpu> + <FlashUtilSpec></FlashUtilSpec> + <StartupFile></StartupFile> + <FlashDriverDll></FlashDriverDll> + <DeviceId>4803</DeviceId> + <RegisterFile></RegisterFile> + <MemoryEnv></MemoryEnv> + <Cmp></Cmp> + <Asm></Asm> + <Linker></Linker> + <OHString></OHString> + <InfinionOptionDll></InfinionOptionDll> + <SLE66CMisc></SLE66CMisc> + <SLE66AMisc></SLE66AMisc> + <SLE66LinkerMisc></SLE66LinkerMisc> + <SFDFile></SFDFile> + <UseEnv>0</UseEnv> + <BinPath></BinPath> + <IncludePath></IncludePath> + <LibPath></LibPath> + <RegisterFilePath></RegisterFilePath> + <DBRegisterFilePath></DBRegisterFilePath> + <TargetStatus> + <Error>0</Error> + <ExitCodeStop>0</ExitCodeStop> + <ButtonStop>0</ButtonStop> + <NotGenerated>0</NotGenerated> + <InvalidFlash>1</InvalidFlash> + </TargetStatus> + <OutputDirectory>.\</OutputDirectory> + <OutputName>timer_tests</OutputName> + <CreateExecutable>1</CreateExecutable> + <CreateLib>0</CreateLib> + <CreateHexFile>0</CreateHexFile> + <DebugInformation>1</DebugInformation> + <BrowseInformation>1</BrowseInformation> + <ListingPath>.\</ListingPath> + <HexFormatSelection>1</HexFormatSelection> + <Merge32K>0</Merge32K> + <CreateBatchFile>0</CreateBatchFile> + <BeforeCompile> + <RunUserProg1>0</RunUserProg1> + <RunUserProg2>0</RunUserProg2> + <UserProg1Name></UserProg1Name> + <UserProg2Name></UserProg2Name> + <UserProg1Dos16Mode>0</UserProg1Dos16Mode> + <UserProg2Dos16Mode>0</UserProg2Dos16Mode> + <nStopU1X>0</nStopU1X> + <nStopU2X>0</nStopU2X> + </BeforeCompile> + <BeforeMake> + <RunUserProg1>0</RunUserProg1> + <RunUserProg2>0</RunUserProg2> + <UserProg1Name></UserProg1Name> + <UserProg2Name></UserProg2Name> + <UserProg1Dos16Mode>0</UserProg1Dos16Mode> + <UserProg2Dos16Mode>0</UserProg2Dos16Mode> + </BeforeMake> + <AfterMake> + <RunUserProg1>1</RunUserProg1> + <RunUserProg2>0</RunUserProg2> + <UserProg1Name>$K\ARM\ARMCC\BIN\fromelf.exe #L --vhx --8x1 --output timer_tests.hex</UserProg1Name> + <UserProg2Name></UserProg2Name> + <UserProg1Dos16Mode>0</UserProg1Dos16Mode> + <UserProg2Dos16Mode>0</UserProg2Dos16Mode> + </AfterMake> + <SelectedForBatchBuild>0</SelectedForBatchBuild> + <SVCSIdString></SVCSIdString> + </TargetCommonOption> + <CommonProperty> + <UseCPPCompiler>0</UseCPPCompiler> + <RVCTCodeConst>0</RVCTCodeConst> + <RVCTZI>0</RVCTZI> + <RVCTOtherData>0</RVCTOtherData> + <ModuleSelection>0</ModuleSelection> + <IncludeInBuild>1</IncludeInBuild> + <AlwaysBuild>0</AlwaysBuild> + <GenerateAssemblyFile>0</GenerateAssemblyFile> + <AssembleAssemblyFile>0</AssembleAssemblyFile> + <PublicsOnly>0</PublicsOnly> + <StopOnExitCode>3</StopOnExitCode> + <CustomArgument></CustomArgument> + <IncludeLibraryModules></IncludeLibraryModules> + </CommonProperty> + <DllOption> + <SimDllName>SARMCM3.DLL</SimDllName> + <SimDllArguments></SimDllArguments> + <SimDlgDll>DARMCM1.DLL</SimDlgDll> + <SimDlgDllArguments></SimDlgDllArguments> + <TargetDllName>SARMCM3.DLL</TargetDllName> + <TargetDllArguments></TargetDllArguments> + <TargetDlgDll>TARMCM1.DLL</TargetDlgDll> + <TargetDlgDllArguments></TargetDlgDllArguments> + </DllOption> + <DebugOption> + <OPTHX> + <HexSelection>1</HexSelection> + <HexRangeLowAddress>0</HexRangeLowAddress> + <HexRangeHighAddress>0</HexRangeHighAddress> + <HexOffset>0</HexOffset> + <Oh166RecLen>16</Oh166RecLen> + </OPTHX> + <Simulator> + <UseSimulator>1</UseSimulator> + <LoadApplicationAtStartup>1</LoadApplicationAtStartup> + <RunToMain>1</RunToMain> + <RestoreBreakpoints>1</RestoreBreakpoints> + <RestoreWatchpoints>1</RestoreWatchpoints> + <RestoreMemoryDisplay>1</RestoreMemoryDisplay> + <RestoreFunctions>1</RestoreFunctions> + <RestoreToolbox>1</RestoreToolbox> + <LimitSpeedToRealTime>0</LimitSpeedToRealTime> + </Simulator> + <Target> + <UseTarget>0</UseTarget> + <LoadApplicationAtStartup>1</LoadApplicationAtStartup> + <RunToMain>0</RunToMain> + <RestoreBreakpoints>1</RestoreBreakpoints> + <RestoreWatchpoints>1</RestoreWatchpoints> + <RestoreMemoryDisplay>1</RestoreMemoryDisplay> + <RestoreFunctions>0</RestoreFunctions> + <RestoreToolbox>1</RestoreToolbox> + <RestoreTracepoints>0</RestoreTracepoints> + </Target> + <RunDebugAfterBuild>0</RunDebugAfterBuild> + <TargetSelection>-1</TargetSelection> + <SimDlls> + <CpuDll></CpuDll> + <CpuDllArguments></CpuDllArguments> + <PeripheralDll></PeripheralDll> + <PeripheralDllArguments></PeripheralDllArguments> + <InitializationFile></InitializationFile> + </SimDlls> + <TargetDlls> + <CpuDll></CpuDll> + <CpuDllArguments></CpuDllArguments> + <PeripheralDll></PeripheralDll> + <PeripheralDllArguments></PeripheralDllArguments> + <InitializationFile></InitializationFile> + <Driver></Driver> + </TargetDlls> + </DebugOption> + <Utilities> + <Flash1> + <UseTargetDll>0</UseTargetDll> + <UseExternalTool>0</UseExternalTool> + <RunIndependent>0</RunIndependent> + <UpdateFlashBeforeDebugging>0</UpdateFlashBeforeDebugging> + <Capability>0</Capability> + <DriverSelection>-1</DriverSelection> + </Flash1> + <Flash2></Flash2> + <Flash3></Flash3> + <Flash4></Flash4> + </Utilities> + <TargetArmAds> + <ArmAdsMisc> + <GenerateListings>0</GenerateListings> + <asHll>1</asHll> + <asAsm>1</asAsm> + <asMacX>1</asMacX> + <asSyms>1</asSyms> + <asFals>1</asFals> + <asDbgD>1</asDbgD> + <asForm>1</asForm> + <ldLst>0</ldLst> + <ldmm>1</ldmm> + <ldXref>1</ldXref> + <BigEnd>0</BigEnd> + <AdsALst>1</AdsALst> + <AdsACrf>1</AdsACrf> + <AdsANop>0</AdsANop> + <AdsANot>0</AdsANot> + <AdsLLst>1</AdsLLst> + <AdsLmap>1</AdsLmap> + <AdsLcgr>1</AdsLcgr> + <AdsLsym>1</AdsLsym> + <AdsLszi>1</AdsLszi> + <AdsLtoi>1</AdsLtoi> + <AdsLsun>1</AdsLsun> + <AdsLven>1</AdsLven> + <AdsLsxf>1</AdsLsxf> + <RvctClst>0</RvctClst> + <GenPPlst>0</GenPPlst> + <AdsCpuType>"Cortex-M0"</AdsCpuType> + <RvctDeviceName></RvctDeviceName> + <mOS>0</mOS> + <uocRom>0</uocRom> + <uocRam>0</uocRam> + <hadIROM>0</hadIROM> + <hadIRAM>0</hadIRAM> + <hadXRAM>0</hadXRAM> + <uocXRam>0</uocXRam> + <RvdsVP>0</RvdsVP> + <hadIRAM2>0</hadIRAM2> + <hadIROM2>0</hadIROM2> + <StupSel>1</StupSel> + <useUlib>0</useUlib> + <EndSel>1</EndSel> + <uLtcg>0</uLtcg> + <RoSelD>0</RoSelD> + <RwSelD>5</RwSelD> + <CodeSel>0</CodeSel> + <OptFeed>0</OptFeed> + <NoZi1>0</NoZi1> + <NoZi2>0</NoZi2> + <NoZi3>0</NoZi3> + <NoZi4>0</NoZi4> + <NoZi5>0</NoZi5> + <Ro1Chk>1</Ro1Chk> + <Ro2Chk>0</Ro2Chk> + <Ro3Chk>0</Ro3Chk> + <Ir1Chk>0</Ir1Chk> + <Ir2Chk>0</Ir2Chk> + <Ra1Chk>1</Ra1Chk> + <Ra2Chk>0</Ra2Chk> + <Ra3Chk>0</Ra3Chk> + <Im1Chk>0</Im1Chk> + <Im2Chk>0</Im2Chk> + <OnChipMemories> + <Ocm1> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </Ocm1> + <Ocm2> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </Ocm2> + <Ocm3> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </Ocm3> + <Ocm4> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </Ocm4> + <Ocm5> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </Ocm5> + <Ocm6> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </Ocm6> + <IRAM> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </IRAM> + <IROM> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </IROM> + <XRAM> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </XRAM> + <OCR_RVCT1> + <Type>1</Type> + <StartAddress>0x0</StartAddress> + <Size>0x10000</Size> + </OCR_RVCT1> + <OCR_RVCT2> + <Type>1</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </OCR_RVCT2> + <OCR_RVCT3> + <Type>1</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </OCR_RVCT3> + <OCR_RVCT4> + <Type>1</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </OCR_RVCT4> + <OCR_RVCT5> + <Type>1</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </OCR_RVCT5> + <OCR_RVCT6> + <Type>0</Type> + <StartAddress>0x20000000</StartAddress> + <Size>0x10000</Size> + </OCR_RVCT6> + <OCR_RVCT7> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </OCR_RVCT7> + <OCR_RVCT8> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </OCR_RVCT8> + <OCR_RVCT9> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </OCR_RVCT9> + <OCR_RVCT10> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </OCR_RVCT10> + </OnChipMemories> + <RvctStartVector></RvctStartVector> + </ArmAdsMisc> + <Cads> + <interw>1</interw> + <Optim>4</Optim> + <oTime>0</oTime> + <SplitLS>0</SplitLS> + <OneElfS>0</OneElfS> + <Strict>0</Strict> + <EnumInt>0</EnumInt> + <PlainCh>0</PlainCh> + <Ropi>0</Ropi> + <Rwpi>0</Rwpi> + <wLevel>0</wLevel> + <uThumb>0</uThumb> + <uSurpInc>0</uSurpInc> + <VariousControls> + <MiscControls></MiscControls> + <Define>CORTEX_M0</Define> + <Undefine></Undefine> + <IncludePath>..\..\..\..\software\cmsis\CMSIS\Include; ..\..\..\..\software\cmsis\Device\ARM\CMSDK_CM0\Include; ..\..\..\..\software\common\retarget</IncludePath> + </VariousControls> + </Cads> + <Aads> + <interw>1</interw> + <Ropi>0</Ropi> + <Rwpi>0</Rwpi> + <thumb>0</thumb> + <SplitLS>0</SplitLS> + <SwStkChk>0</SwStkChk> + <NoWarn>0</NoWarn> + <uSurpInc>0</uSurpInc> + <VariousControls> + <MiscControls></MiscControls> + <Define></Define> + <Undefine></Undefine> + <IncludePath></IncludePath> + </VariousControls> + </Aads> + <LDads> + <umfTarg>1</umfTarg> + <Ropi>0</Ropi> + <Rwpi>0</Rwpi> + <noStLib>0</noStLib> + <RepFail>1</RepFail> + <useFile>0</useFile> + <TextAddressRange>0x00000000</TextAddressRange> + <DataAddressRange>0x00000000</DataAddressRange> + <ScatterFile></ScatterFile> + <IncludeLibs></IncludeLibs> + <IncludeLibsPath></IncludeLibsPath> + <Misc></Misc> + <LinkerInputFile></LinkerInputFile> + <DisabledWarnings></DisabledWarnings> + </LDads> + </TargetArmAds> + </TargetOption> + <Groups> + <Group> + <GroupName>Startup</GroupName> + <Files> + <File> + <FileName>startup_CMSDK_CM0.s</FileName> + <FileType>2</FileType> + <FilePath>..\..\..\..\software\cmsis\Device\ARM\CMSDK_CM0\Source\ARM\startup_CMSDK_CM0.s</FilePath> + </File> + </Files> + </Group> + <Group> + <GroupName>Application</GroupName> + <Files> + <File> + <FileName>uart_stdout.c</FileName> + <FileType>1</FileType> + <FilePath>..\..\..\..\software\common\retarget\uart_stdout.c</FilePath> + </File> + <File> + <FileName>retarget.c</FileName> + <FileType>1</FileType> + <FilePath>..\..\..\..\software\common\retarget\retarget.c</FilePath> + </File> + <File> + <FileName>timer_tests.c</FileName> + <FileType>1</FileType> + <FilePath>..\..\..\..\software\common\validation\timer_tests.c</FilePath> + </File> + </Files> + </Group> + <Group> + <GroupName>System</GroupName> + <Files> + <File> + <FileName>system_CMSDK_CM0.c</FileName> + <FileType>1</FileType> + <FilePath>..\..\..\..\software\cmsis\Device\ARM\CMSDK_CM0\Source\system_CMSDK_CM0.c</FilePath> + </File> + </Files> + </Group> + </Groups> + </Target> + </Targets> + +</Project> diff --git a/Cortex-M0/nanosoc/systems/mcu/testcodes/timer_tests/timer_tests_cm0p.uvopt b/Cortex-M0/nanosoc/systems/mcu/testcodes/timer_tests/timer_tests_cm0p.uvopt new file mode 100644 index 0000000..c4485d5 --- /dev/null +++ b/Cortex-M0/nanosoc/systems/mcu/testcodes/timer_tests/timer_tests_cm0p.uvopt @@ -0,0 +1,244 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no" ?> +<ProjectOpt xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="project_opt.xsd"> + + <SchemaVersion>1.0</SchemaVersion> + + <Header>### uVision Project, (C) Keil Software</Header> + + <Extensions> + <cExt>*.c</cExt> + <aExt>*.s*; *.src; *.a*</aExt> + <oExt>*.obj</oExt> + <lExt>*.lib</lExt> + <tExt>*.txt; *.h; *.inc</tExt> + <pExt>*.plm</pExt> + <CppX>*.cpp</CppX> + </Extensions> + + <DaveTm> + <dwLowDateTime>0</dwLowDateTime> + <dwHighDateTime>0</dwHighDateTime> + </DaveTm> + + <Target> + <TargetName>Debug</TargetName> + <ToolsetNumber>0x4</ToolsetNumber> + <ToolsetName>ARM-ADS</ToolsetName> + <TargetOption> + <CLKADS>50000000</CLKADS> + <OPTTT> + <gFlags>1</gFlags> + <BeepAtEnd>1</BeepAtEnd> + <RunSim>1</RunSim> + <RunTarget>0</RunTarget> + </OPTTT> + <OPTHX> + <HexSelection>1</HexSelection> + <FlashByte>65535</FlashByte> + <HexRangeLowAddress>0</HexRangeLowAddress> + <HexRangeHighAddress>0</HexRangeHighAddress> + <HexOffset>0</HexOffset> + </OPTHX> + <OPTLEX> + <PageWidth>79</PageWidth> + <PageLength>66</PageLength> + <TabStop>8</TabStop> + <ListingPath>.\</ListingPath> + </OPTLEX> + <ListingPage> + <CreateCListing>1</CreateCListing> + <CreateAListing>1</CreateAListing> + <CreateLListing>1</CreateLListing> + <CreateIListing>0</CreateIListing> + <AsmCond>1</AsmCond> + <AsmSymb>1</AsmSymb> + <AsmXref>0</AsmXref> + <CCond>1</CCond> + <CCode>0</CCode> + <CListInc>0</CListInc> + <CSymb>0</CSymb> + <LinkerCodeListing>0</LinkerCodeListing> + </ListingPage> + <OPTXL> + <LMap>1</LMap> + <LComments>1</LComments> + <LGenerateSymbols>1</LGenerateSymbols> + <LLibSym>1</LLibSym> + <LLines>1</LLines> + <LLocSym>1</LLocSym> + <LPubSym>1</LPubSym> + <LXref>0</LXref> + <LExpSel>0</LExpSel> + </OPTXL> + <OPTFL> + <tvExp>1</tvExp> + <tvExpOptDlg>0</tvExpOptDlg> + <IsCurrentTarget>1</IsCurrentTarget> + </OPTFL> + <CpuCode>255</CpuCode> + <DllOpt> + <SimDllName>SARMCM3.DLL</SimDllName> + <SimDllArguments></SimDllArguments> + <SimDlgDllName>DARMCM1.DLL</SimDlgDllName> + <SimDlgDllArguments></SimDlgDllArguments> + <TargetDllName>SARMCM3.DLL</TargetDllName> + <TargetDllArguments></TargetDllArguments> + <TargetDlgDllName>TARMCM1.DLL</TargetDlgDllName> + <TargetDlgDllArguments></TargetDlgDllArguments> + </DllOpt> + <DebugOpt> + <uSim>1</uSim> + <uTrg>0</uTrg> + <sLdApp>1</sLdApp> + <sGomain>1</sGomain> + <sRbreak>1</sRbreak> + <sRwatch>1</sRwatch> + <sRmem>1</sRmem> + <sRfunc>1</sRfunc> + <sRbox>1</sRbox> + <tLdApp>1</tLdApp> + <tGomain>0</tGomain> + <tRbreak>1</tRbreak> + <tRwatch>1</tRwatch> + <tRmem>1</tRmem> + <tRfunc>0</tRfunc> + <tRbox>1</tRbox> + <sRunDeb>0</sRunDeb> + <sLrtime>0</sLrtime> + <nTsel>-1</nTsel> + <sDll></sDll> + <sDllPa></sDllPa> + <sDlgDll></sDlgDll> + <sDlgPa></sDlgPa> + <sIfile></sIfile> + <tDll></tDll> + <tDllPa></tDllPa> + <tDlgDll></tDlgDll> + <tDlgPa></tDlgPa> + <tIfile></tIfile> + <pMon></pMon> + </DebugOpt> + <Breakpoint/> + <DebugFlag> + <trace>0</trace> + <periodic>1</periodic> + <aLwin>0</aLwin> + <aCover>0</aCover> + <aSer1>0</aSer1> + <aSer2>0</aSer2> + <aPa>0</aPa> + <viewmode>0</viewmode> + <vrSel>0</vrSel> + <aSym>0</aSym> + <aTbox>0</aTbox> + <AscS1>0</AscS1> + <AscS2>0</AscS2> + <AscS3>0</AscS3> + <aSer3>0</aSer3> + <eProf>0</eProf> + <aLa>0</aLa> + <aPa1>0</aPa1> + <AscS4>0</AscS4> + <aSer4>0</aSer4> + <StkLoc>0</StkLoc> + <TrcWin>0</TrcWin> + <newCpu>0</newCpu> + <uProt>0</uProt> + </DebugFlag> + <LintExecutable></LintExecutable> + <LintConfigFile></LintConfigFile> + </TargetOption> + </Target> + + <Group> + <GroupName>Startup</GroupName> + <tvExp>1</tvExp> + <tvExpOptDlg>0</tvExpOptDlg> + <cbSel>0</cbSel> + <File> + <GroupNumber>1</GroupNumber> + <FileNumber>1</FileNumber> + <FileType>2</FileType> + <tvExp>0</tvExp> + <Focus>0</Focus> + <ColumnNumber>0</ColumnNumber> + <tvExpOptDlg>0</tvExpOptDlg> + <TopLine>0</TopLine> + <CurrentLine>0</CurrentLine> + <bDave2>0</bDave2> + <PathWithFileName>..\..\..\..\software\cmsis\Device\ARM\CMSDK_CM0plus\Source\ARM\startup_CMSDK_CM0plus.s</PathWithFileName> + <FilenameWithoutPath>startup_CMSDK_CM0plus.s</FilenameWithoutPath> + </File> + </Group> + + <Group> + <GroupName>Application</GroupName> + <tvExp>1</tvExp> + <tvExpOptDlg>0</tvExpOptDlg> + <cbSel>0</cbSel> + <File> + <GroupNumber>2</GroupNumber> + <FileNumber>2</FileNumber> + <FileType>1</FileType> + <tvExp>0</tvExp> + <Focus>0</Focus> + <ColumnNumber>0</ColumnNumber> + <tvExpOptDlg>0</tvExpOptDlg> + <TopLine>0</TopLine> + <CurrentLine>0</CurrentLine> + <bDave2>0</bDave2> + <PathWithFileName>..\..\..\..\software\common\retarget\uart_stdout.c</PathWithFileName> + <FilenameWithoutPath>uart_stdout.c</FilenameWithoutPath> + </File> + <File> + <GroupNumber>2</GroupNumber> + <FileNumber>3</FileNumber> + <FileType>1</FileType> + <tvExp>0</tvExp> + <Focus>0</Focus> + <ColumnNumber>0</ColumnNumber> + <tvExpOptDlg>0</tvExpOptDlg> + <TopLine>0</TopLine> + <CurrentLine>0</CurrentLine> + <bDave2>0</bDave2> + <PathWithFileName>..\..\..\..\software\common\retarget\retarget.c</PathWithFileName> + <FilenameWithoutPath>retarget.c</FilenameWithoutPath> + </File> + <File> + <GroupNumber>2</GroupNumber> + <FileNumber>4</FileNumber> + <FileType>1</FileType> + <tvExp>0</tvExp> + <Focus>0</Focus> + <ColumnNumber>0</ColumnNumber> + <tvExpOptDlg>0</tvExpOptDlg> + <TopLine>0</TopLine> + <CurrentLine>0</CurrentLine> + <bDave2>0</bDave2> + <PathWithFileName>..\..\..\..\software\common\validation\timer_tests.c</PathWithFileName> + <FilenameWithoutPath>timer_tests.c</FilenameWithoutPath> + </File> + </Group> + + <Group> + <GroupName>System</GroupName> + <tvExp>1</tvExp> + <tvExpOptDlg>0</tvExpOptDlg> + <cbSel>0</cbSel> + <File> + <GroupNumber>3</GroupNumber> + <FileNumber>5</FileNumber> + <FileType>1</FileType> + <tvExp>0</tvExp> + <Focus>0</Focus> + <ColumnNumber>0</ColumnNumber> + <tvExpOptDlg>0</tvExpOptDlg> + <TopLine>0</TopLine> + <CurrentLine>0</CurrentLine> + <bDave2>0</bDave2> + <PathWithFileName>..\..\..\..\software\cmsis\Device\ARM\CMSDK_CM0plus\Source\system_CMSDK_CM0plus.c</PathWithFileName> + <FilenameWithoutPath>system_CMSDK_CM0plus.c</FilenameWithoutPath> + </File> + </Group> + +</ProjectOpt> diff --git a/Cortex-M0/nanosoc/systems/mcu/testcodes/timer_tests/timer_tests_cm0p.uvproj b/Cortex-M0/nanosoc/systems/mcu/testcodes/timer_tests/timer_tests_cm0p.uvproj new file mode 100644 index 0000000..ce4d631 --- /dev/null +++ b/Cortex-M0/nanosoc/systems/mcu/testcodes/timer_tests/timer_tests_cm0p.uvproj @@ -0,0 +1,432 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no" ?> +<Project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="project_proj.xsd"> + + <SchemaVersion>1.1</SchemaVersion> + + <Header>### uVision Project, (C) Keil Software</Header> + + <Targets> + <Target> + <TargetName>Debug</TargetName> + <ToolsetNumber>0x4</ToolsetNumber> + <ToolsetName>ARM-ADS</ToolsetName> + <TargetOption> + <TargetCommonOption> + <Device>Cortex-M0+</Device> + <Vendor>ARM</Vendor> + <Cpu>CLOCK(12000000) CPUTYPE("Cortex-M0+") ESEL ELITTLE</Cpu> + <FlashUtilSpec></FlashUtilSpec> + <StartupFile></StartupFile> + <FlashDriverDll></FlashDriverDll> + <DeviceId>6268</DeviceId> + <RegisterFile></RegisterFile> + <MemoryEnv></MemoryEnv> + <Cmp></Cmp> + <Asm></Asm> + <Linker></Linker> + <OHString></OHString> + <InfinionOptionDll></InfinionOptionDll> + <SLE66CMisc></SLE66CMisc> + <SLE66AMisc></SLE66AMisc> + <SLE66LinkerMisc></SLE66LinkerMisc> + <SFDFile></SFDFile> + <UseEnv>0</UseEnv> + <BinPath></BinPath> + <IncludePath></IncludePath> + <LibPath></LibPath> + <RegisterFilePath></RegisterFilePath> + <DBRegisterFilePath></DBRegisterFilePath> + <TargetStatus> + <Error>0</Error> + <ExitCodeStop>0</ExitCodeStop> + <ButtonStop>0</ButtonStop> + <NotGenerated>0</NotGenerated> + <InvalidFlash>1</InvalidFlash> + </TargetStatus> + <OutputDirectory>.\</OutputDirectory> + <OutputName>timer_tests</OutputName> + <CreateExecutable>1</CreateExecutable> + <CreateLib>0</CreateLib> + <CreateHexFile>0</CreateHexFile> + <DebugInformation>1</DebugInformation> + <BrowseInformation>1</BrowseInformation> + <ListingPath>.\</ListingPath> + <HexFormatSelection>1</HexFormatSelection> + <Merge32K>0</Merge32K> + <CreateBatchFile>0</CreateBatchFile> + <BeforeCompile> + <RunUserProg1>0</RunUserProg1> + <RunUserProg2>0</RunUserProg2> + <UserProg1Name></UserProg1Name> + <UserProg2Name></UserProg2Name> + <UserProg1Dos16Mode>0</UserProg1Dos16Mode> + <UserProg2Dos16Mode>0</UserProg2Dos16Mode> + <nStopU1X>0</nStopU1X> + <nStopU2X>0</nStopU2X> + </BeforeCompile> + <BeforeMake> + <RunUserProg1>0</RunUserProg1> + <RunUserProg2>0</RunUserProg2> + <UserProg1Name></UserProg1Name> + <UserProg2Name></UserProg2Name> + <UserProg1Dos16Mode>0</UserProg1Dos16Mode> + <UserProg2Dos16Mode>0</UserProg2Dos16Mode> + </BeforeMake> + <AfterMake> + <RunUserProg1>1</RunUserProg1> + <RunUserProg2>0</RunUserProg2> + <UserProg1Name>$K\ARM\ARMCC\BIN\fromelf.exe #L --vhx --8x1 --output timer_tests.hex</UserProg1Name> + <UserProg2Name></UserProg2Name> + <UserProg1Dos16Mode>0</UserProg1Dos16Mode> + <UserProg2Dos16Mode>0</UserProg2Dos16Mode> + </AfterMake> + <SelectedForBatchBuild>0</SelectedForBatchBuild> + <SVCSIdString></SVCSIdString> + </TargetCommonOption> + <CommonProperty> + <UseCPPCompiler>0</UseCPPCompiler> + <RVCTCodeConst>0</RVCTCodeConst> + <RVCTZI>0</RVCTZI> + <RVCTOtherData>0</RVCTOtherData> + <ModuleSelection>0</ModuleSelection> + <IncludeInBuild>1</IncludeInBuild> + <AlwaysBuild>0</AlwaysBuild> + <GenerateAssemblyFile>0</GenerateAssemblyFile> + <AssembleAssemblyFile>0</AssembleAssemblyFile> + <PublicsOnly>0</PublicsOnly> + <StopOnExitCode>3</StopOnExitCode> + <CustomArgument></CustomArgument> + <IncludeLibraryModules></IncludeLibraryModules> + </CommonProperty> + <DllOption> + <SimDllName>SARMCM3.DLL</SimDllName> + <SimDllArguments></SimDllArguments> + <SimDlgDll>DARMCM1.DLL</SimDlgDll> + <SimDlgDllArguments></SimDlgDllArguments> + <TargetDllName>SARMCM3.DLL</TargetDllName> + <TargetDllArguments></TargetDllArguments> + <TargetDlgDll>TARMCM1.DLL</TargetDlgDll> + <TargetDlgDllArguments></TargetDlgDllArguments> + </DllOption> + <DebugOption> + <OPTHX> + <HexSelection>1</HexSelection> + <HexRangeLowAddress>0</HexRangeLowAddress> + <HexRangeHighAddress>0</HexRangeHighAddress> + <HexOffset>0</HexOffset> + <Oh166RecLen>16</Oh166RecLen> + </OPTHX> + <Simulator> + <UseSimulator>1</UseSimulator> + <LoadApplicationAtStartup>1</LoadApplicationAtStartup> + <RunToMain>1</RunToMain> + <RestoreBreakpoints>1</RestoreBreakpoints> + <RestoreWatchpoints>1</RestoreWatchpoints> + <RestoreMemoryDisplay>1</RestoreMemoryDisplay> + <RestoreFunctions>1</RestoreFunctions> + <RestoreToolbox>1</RestoreToolbox> + <LimitSpeedToRealTime>0</LimitSpeedToRealTime> + </Simulator> + <Target> + <UseTarget>0</UseTarget> + <LoadApplicationAtStartup>1</LoadApplicationAtStartup> + <RunToMain>0</RunToMain> + <RestoreBreakpoints>1</RestoreBreakpoints> + <RestoreWatchpoints>1</RestoreWatchpoints> + <RestoreMemoryDisplay>1</RestoreMemoryDisplay> + <RestoreFunctions>0</RestoreFunctions> + <RestoreToolbox>1</RestoreToolbox> + </Target> + <RunDebugAfterBuild>0</RunDebugAfterBuild> + <TargetSelection>-1</TargetSelection> + <SimDlls> + <CpuDll></CpuDll> + <CpuDllArguments></CpuDllArguments> + <PeripheralDll></PeripheralDll> + <PeripheralDllArguments></PeripheralDllArguments> + <InitializationFile></InitializationFile> + </SimDlls> + <TargetDlls> + <CpuDll></CpuDll> + <CpuDllArguments></CpuDllArguments> + <PeripheralDll></PeripheralDll> + <PeripheralDllArguments></PeripheralDllArguments> + <InitializationFile></InitializationFile> + <Driver></Driver> + </TargetDlls> + </DebugOption> + <Utilities> + <Flash1> + <UseTargetDll>0</UseTargetDll> + <UseExternalTool>0</UseExternalTool> + <RunIndependent>0</RunIndependent> + <UpdateFlashBeforeDebugging>0</UpdateFlashBeforeDebugging> + <Capability>0</Capability> + <DriverSelection>-1</DriverSelection> + </Flash1> + <Flash2></Flash2> + <Flash3></Flash3> + <Flash4></Flash4> + </Utilities> + <TargetArmAds> + <ArmAdsMisc> + <GenerateListings>0</GenerateListings> + <asHll>1</asHll> + <asAsm>1</asAsm> + <asMacX>1</asMacX> + <asSyms>1</asSyms> + <asFals>1</asFals> + <asDbgD>1</asDbgD> + <asForm>1</asForm> + <ldLst>0</ldLst> + <ldmm>1</ldmm> + <ldXref>1</ldXref> + <BigEnd>0</BigEnd> + <AdsALst>1</AdsALst> + <AdsACrf>1</AdsACrf> + <AdsANop>0</AdsANop> + <AdsANot>0</AdsANot> + <AdsLLst>1</AdsLLst> + <AdsLmap>1</AdsLmap> + <AdsLcgr>1</AdsLcgr> + <AdsLsym>1</AdsLsym> + <AdsLszi>1</AdsLszi> + <AdsLtoi>1</AdsLtoi> + <AdsLsun>1</AdsLsun> + <AdsLven>1</AdsLven> + <AdsLsxf>1</AdsLsxf> + <RvctClst>0</RvctClst> + <GenPPlst>0</GenPPlst> + <AdsCpuType>"Cortex-M0+"</AdsCpuType> + <RvctDeviceName></RvctDeviceName> + <mOS>0</mOS> + <uocRom>0</uocRom> + <uocRam>0</uocRam> + <hadIROM>0</hadIROM> + <hadIRAM>0</hadIRAM> + <hadXRAM>0</hadXRAM> + <uocXRam>0</uocXRam> + <RvdsVP>0</RvdsVP> + <hadIRAM2>0</hadIRAM2> + <hadIROM2>0</hadIROM2> + <StupSel>1</StupSel> + <useUlib>0</useUlib> + <EndSel>1</EndSel> + <uLtcg>0</uLtcg> + <RoSelD>0</RoSelD> + <RwSelD>5</RwSelD> + <CodeSel>0</CodeSel> + <OptFeed>0</OptFeed> + <NoZi1>0</NoZi1> + <NoZi2>0</NoZi2> + <NoZi3>0</NoZi3> + <NoZi4>0</NoZi4> + <NoZi5>0</NoZi5> + <Ro1Chk>1</Ro1Chk> + <Ro2Chk>0</Ro2Chk> + <Ro3Chk>0</Ro3Chk> + <Ir1Chk>0</Ir1Chk> + <Ir2Chk>0</Ir2Chk> + <Ra1Chk>1</Ra1Chk> + <Ra2Chk>0</Ra2Chk> + <Ra3Chk>0</Ra3Chk> + <Im1Chk>0</Im1Chk> + <Im2Chk>0</Im2Chk> + <OnChipMemories> + <Ocm1> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </Ocm1> + <Ocm2> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </Ocm2> + <Ocm3> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </Ocm3> + <Ocm4> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </Ocm4> + <Ocm5> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </Ocm5> + <Ocm6> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </Ocm6> + <IRAM> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </IRAM> + <IROM> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </IROM> + <XRAM> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </XRAM> + <OCR_RVCT1> + <Type>1</Type> + <StartAddress>0x0</StartAddress> + <Size>0x10000</Size> + </OCR_RVCT1> + <OCR_RVCT2> + <Type>1</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </OCR_RVCT2> + <OCR_RVCT3> + <Type>1</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </OCR_RVCT3> + <OCR_RVCT4> + <Type>1</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </OCR_RVCT4> + <OCR_RVCT5> + <Type>1</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </OCR_RVCT5> + <OCR_RVCT6> + <Type>0</Type> + <StartAddress>0x20000000</StartAddress> + <Size>0x10000</Size> + </OCR_RVCT6> + <OCR_RVCT7> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </OCR_RVCT7> + <OCR_RVCT8> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </OCR_RVCT8> + <OCR_RVCT9> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </OCR_RVCT9> + <OCR_RVCT10> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </OCR_RVCT10> + </OnChipMemories> + <RvctStartVector></RvctStartVector> + </ArmAdsMisc> + <Cads> + <interw>1</interw> + <Optim>4</Optim> + <oTime>0</oTime> + <SplitLS>0</SplitLS> + <OneElfS>0</OneElfS> + <Strict>0</Strict> + <EnumInt>0</EnumInt> + <PlainCh>0</PlainCh> + <Ropi>0</Ropi> + <Rwpi>0</Rwpi> + <wLevel>0</wLevel> + <uThumb>0</uThumb> + <VariousControls> + <MiscControls></MiscControls> + <Define>CORTEX_M0PLUS</Define> + <Undefine></Undefine> + <IncludePath>..\..\..\..\software\cmsis\CMSIS\Include; ..\..\..\..\software\cmsis\Device\ARM\CMSDK_CM0plus\Include; ..\..\..\..\software\common\retarget</IncludePath> + </VariousControls> + </Cads> + <Aads> + <interw>1</interw> + <Ropi>0</Ropi> + <Rwpi>0</Rwpi> + <thumb>0</thumb> + <SplitLS>0</SplitLS> + <SwStkChk>0</SwStkChk> + <NoWarn>0</NoWarn> + <VariousControls> + <MiscControls></MiscControls> + <Define></Define> + <Undefine></Undefine> + <IncludePath></IncludePath> + </VariousControls> + </Aads> + <LDads> + <umfTarg>1</umfTarg> + <Ropi>0</Ropi> + <Rwpi>0</Rwpi> + <noStLib>0</noStLib> + <RepFail>1</RepFail> + <useFile>0</useFile> + <TextAddressRange>0x00000000</TextAddressRange> + <DataAddressRange>0x00000000</DataAddressRange> + <ScatterFile></ScatterFile> + <IncludeLibs></IncludeLibs> + <IncludeLibsPath></IncludeLibsPath> + <Misc></Misc> + <LinkerInputFile></LinkerInputFile> + <DisabledWarnings></DisabledWarnings> + </LDads> + </TargetArmAds> + </TargetOption> + <Groups> + <Group> + <GroupName>Startup</GroupName> + <Files> + <File> + <FileName>startup_CMSDK_CM0plus.s</FileName> + <FileType>2</FileType> + <FilePath>..\..\..\..\software\cmsis\Device\ARM\CMSDK_CM0plus\Source\ARM\startup_CMSDK_CM0plus.s</FilePath> + </File> + </Files> + </Group> + <Group> + <GroupName>Application</GroupName> + <Files> + <File> + <FileName>uart_stdout.c</FileName> + <FileType>1</FileType> + <FilePath>..\..\..\..\software\common\retarget\uart_stdout.c</FilePath> + </File> + <File> + <FileName>retarget.c</FileName> + <FileType>1</FileType> + <FilePath>..\..\..\..\software\common\retarget\retarget.c</FilePath> + </File> + <File> + <FileName>timer_tests.c</FileName> + <FileType>1</FileType> + <FilePath>..\..\..\..\software\common\validation\timer_tests.c</FilePath> + </File> + </Files> + </Group> + <Group> + <GroupName>System</GroupName> + <Files> + <File> + <FileName>system_CMSDK_CM0plus.c</FileName> + <FileType>1</FileType> + <FilePath>..\..\..\..\software\cmsis\Device\ARM\CMSDK_CM0plus\Source\system_CMSDK_CM0plus.c</FilePath> + </File> + </Files> + </Group> + </Groups> + </Target> + </Targets> + +</Project> diff --git a/Cortex-M0/nanosoc/systems/mcu/testcodes/uart_driver_tests/makefile b/Cortex-M0/nanosoc/systems/mcu/testcodes/uart_driver_tests/makefile new file mode 100644 index 0000000..1d02777 --- /dev/null +++ b/Cortex-M0/nanosoc/systems/mcu/testcodes/uart_driver_tests/makefile @@ -0,0 +1,255 @@ +#----------------------------------------------------------------------------- +# The confidential and proprietary information contained in this file may +# only be used by a person authorised under and to the extent permitted +# by a subsisting licensing agreement from Arm Limited or its affiliates. +# +# (C) COPYRIGHT 2010-2013 Arm Limited or its affiliates. +# ALL RIGHTS RESERVED +# +# This entire notice must be reproduced on all copies of this file +# and copies of this file may only be made by a person if such person is +# permitted to do so under the terms of a subsisting license agreement +# from Arm Limited or its affiliates. +# +# SVN Information +# +# Checked In : $Date: 2011-01-25 10:05:56 +0000 (Tue, 25 Jan 2011) $ +# +# Revision : $Revision: 159421 $ +# +# Release Information : Cortex-M System Design Kit-r1p1-00rel0 +#----------------------------------------------------------------------------- +# +# Cortex-M System Design Kit software compilation make file +# +#----------------------------------------------------------------------------- +# +# Configurations +# +# Choose the core instantiated, can be +# - CORTEX_M0 +# - CORTEX_M0PLUS +CPU_PRODUCT = CORTEX_M0PLUS + +# Shared software directory +SOFTWARE_DIR = ../../../../software +CMSIS_DIR = $(SOFTWARE_DIR)/cmsis +CORE_DIR = $(CMSIS_DIR)/CMSIS/Include + +ifeq ($(CPU_PRODUCT),CORTEX_M0PLUS) + DEVICE_DIR = $(CMSIS_DIR)/Device/ARM/CMSDK_CM0plus +else + DEVICE_DIR = $(CMSIS_DIR)/Device/ARM/CMSDK_CM0 +endif + +# Program file +TESTNAME = uart_driver_tests + +# Endian Option +COMPILE_BIGEND = 0 + +# Configuration +ifeq ($(CPU_PRODUCT),CORTEX_M0PLUS) + USER_DEFINE = -DCORTEX_M0PLUS +else + USER_DEFINE = -DCORTEX_M0 +endif + +DEPS_LIST = makefile + +# Tool chain : ds5 / gcc / keil +TOOL_CHAIN = ds5 + +ifeq ($(TOOL_CHAIN),ds5) + ifeq ($(CPU_PRODUCT),CORTEX_M0PLUS) + CPU_TYPE = --cpu Cortex-M0plus + else + CPU_TYPE = --cpu Cortex-M0 + endif +endif + +ifeq ($(TOOL_CHAIN),gcc) + ifeq ($(CPU_PRODUCT),CORTEX_M0PLUS) + CPU_TYPE = -mcpu=cortex-m0plus + else + CPU_TYPE = -mcpu=cortex-m0 + endif +endif + +# Startup code directory for DS-5 +ifeq ($(TOOL_CHAIN),ds5) + STARTUP_DIR = $(DEVICE_DIR)/Source/ARM +endif + +# Startup code directory for gcc +ifeq ($(TOOL_CHAIN),gcc) + STARTUP_DIR = $(DEVICE_DIR)/Source/GCC +endif + +ifeq ($(CPU_PRODUCT),CORTEX_M0PLUS) + STARTUP_FILE = startup_CMSDK_CM0plus + SYSTEM_FILE = system_CMSDK_CM0plus +else + STARTUP_FILE = startup_CMSDK_CM0 + SYSTEM_FILE = system_CMSDK_CM0 +endif + +# --------------------------------------------------------------------------------------- +# DS-5 options + +# MicroLIB option +COMPILE_MICROLIB = 0 + +# Small Multiply (Cortex-M0/M0+ has small multiplier option) +COMPILE_SMALLMUL = 0 + +ARM_CC_OPTIONS = -c -O3 -g -Otime $(USER_DEFINE) \ + -I $(DEVICE_DIR)/Include -I $(CORE_DIR) -I $(SOFTWARE_DIR)/common/retarget +ARM_ASM_OPTIONS = -g +ARM_LINK_OPTIONS = "--keep=$(STARTUP_FILE).o(RESET)" "--first=$(STARTUP_FILE).o(RESET)" \ + --rw_base 0x30000000 --ro_base 0x00000000 --map + +ifeq ($(COMPILE_BIGEND),1) + # Big Endian + ARM_CC_OPTIONS += --bigend + ARM_ASM_OPTIONS += --bigend + ARM_LINK_OPTIONS += --be8 +endif + +ifeq ($(COMPILE_MICROLIB),1) + # MicroLIB + ARM_CC_OPTIONS += --library_type=microlib + ARM_ASM_OPTIONS += --library_type=microlib --pd "__MICROLIB SETA 1" + ARM_LINK_OPTIONS += --library_type=microlib +endif + +ifeq ($(COMPILE_SMALLMUL),1) + # In Cortex-M0, small multiply takes 32 cycles + ARM_CC_OPTIONS += --multiply_latency=32 +endif + +# --------------------------------------------------------------------------------------- +# gcc options + +GNG_CC = arm-none-eabi-gcc +GNU_OBJDUMP = arm-none-eabi-objdump +GNU_OBJCOPY = arm-none-eabi-objcopy + +LINKER_SCRIPT_PATH = $(SOFTWARE_DIR)/common/scripts +LINKER_SCRIPT = $(LINKER_SCRIPT_PATH)/cmsdk_cm0.ld + +GNU_CC_FLAGS = -g -O3 -mthumb $(CPU_TYPE) + +ifeq ($(COMPILE_BIGEND),1) + # Big Endian + GNU_CC_FLAGS += -mbig-endian +endif + +# --------------------------------------------------------------------------------------- +all: all_$(TOOL_CHAIN) + +# --------------------------------------------------------------------------------------- +# DS-5 + +all_ds5 : $(TESTNAME).hex $(TESTNAME).lst + +$(TESTNAME).o : $(SOFTWARE_DIR)/common/validation/$(TESTNAME).c $(DEPS_LIST) + armcc $(ARM_CC_OPTIONS) $(CPU_TYPE) $< -o $@ + +$(SYSTEM_FILE).o : $(DEVICE_DIR)/Source/$(SYSTEM_FILE).c $(DEPS_LIST) + armcc $(ARM_CC_OPTIONS) $(CPU_TYPE) $< -o $@ + +retarget.o : $(SOFTWARE_DIR)/common/retarget/retarget.c $(DEPS_LIST) + armcc $(ARM_CC_OPTIONS) $(CPU_TYPE) $< -o $@ + +uart_stdout.o : $(SOFTWARE_DIR)/common/retarget/uart_stdout.c $(DEPS_LIST) + armcc $(ARM_CC_OPTIONS) $(CPU_TYPE) $< -o $@ + +CMSDK_driver.o : $(DEVICE_DIR)/Source/CMSDK_driver.c $(DEPS_LIST) + armcc $(ARM_CC_OPTIONS) $(CPU_TYPE) $< -o $@ + +$(STARTUP_FILE).o : $(STARTUP_DIR)/$(STARTUP_FILE).s $(DEPS_LIST) + armasm $(ARM_ASM_OPTIONS) $(CPU_TYPE) $< -o $@ + +$(TESTNAME).ELF : $(TESTNAME).o $(SYSTEM_FILE).o $(STARTUP_FILE).o retarget.o uart_stdout.o CMSDK_driver.o + armlink $(ARM_LINK_OPTIONS) -o $@ $(TESTNAME).o $(SYSTEM_FILE).o $(STARTUP_FILE).o retarget.o uart_stdout.o CMSDK_driver.o + +$(TESTNAME).hex : $(TESTNAME).ELF + fromelf --vhx --8x1 $< --output $@ + +$(TESTNAME).lst : $(TESTNAME).ELF makefile + fromelf -c -d -e -s $< --output $@ + +# --------------------------------------------------------------------------------------- +# gcc +all_gcc: + $(GNG_CC) $(GNU_CC_FLAGS) $(STARTUP_DIR)/$(STARTUP_FILE).s \ + $(SOFTWARE_DIR)/common/validation/$(TESTNAME).c \ + $(SOFTWARE_DIR)/common/retarget/retarget.c \ + $(SOFTWARE_DIR)/common/retarget/uart_stdout.c \ + $(DEVICE_DIR)/Source/CMSDK_driver.c \ + $(DEVICE_DIR)/Source/$(SYSTEM_FILE).c \ + -I $(DEVICE_DIR)/Include -I $(CORE_DIR) \ + -I $(SOFTWARE_DIR)/common/retarget \ + -L $(LINKER_SCRIPT_PATH) \ + -D__STACK_SIZE=0x200 \ + -D__HEAP_SIZE=0x1000 \ + $(USER_DEFINE) -T $(LINKER_SCRIPT) -o $(TESTNAME).o + # Generate disassembly code + $(GNU_OBJDUMP) -S $(TESTNAME).o > $(TESTNAME).lst + # Generate binary file + $(GNU_OBJCOPY) -S $(TESTNAME).o -O binary $(TESTNAME).bin + # Generate hex file + $(GNU_OBJCOPY) -S $(TESTNAME).o -O verilog $(TESTNAME).hex + +# Note: +# If the version of object copy you are using does not support verilog hex file output, +# you can generate the hex file from binary file using the following command +# od -v -A n -t x1 --width=1 $(TESTNAME).bin > $(TESTNAME).hex + + +# --------------------------------------------------------------------------------------- +# Keil MDK + +all_keil: + @echo "Please compile your project code and press ENTER when ready" + @read dummy + +# --------------------------------------------------------------------------------------- +# Binary + +all_bin: $(TESTNAME).bin + # Generate hex file from binary + od -v -A n -t x1 --width=1 $(TESTNAME).bin > $(TESTNAME).hex + +# --------------------------------------------------------------------------------------- +# Clean + +clean : + @rm -rf *.o + @if [ -e $(TESTNAME).hex ] ; then \ + rm -rf $(TESTNAME).hex ; \ + fi + @if [ -e $(TESTNAME).lst ] ; then \ + rm -rf $(TESTNAME).lst ; \ + fi + @if [ -e $(TESTNAME).ELF ] ; then \ + rm -rf $(TESTNAME).ELF ; \ + fi + @if [ -e $(TESTNAME).bin ] ; then \ + rm -rf $(TESTNAME).bin ; \ + fi + @rm -rf *.crf + @rm -rf *.plg + @rm -rf *.tra + @rm -rf *.htm + @rm -rf *.map + @rm -rf *.dep + @rm -rf *.d + @rm -rf *.lnp + @rm -rf *.bak + @rm -rf *.lst + @rm -rf *.axf + @rm -rf *.sct + @rm -rf *.__i + @rm -rf *._ia diff --git a/Cortex-M0/nanosoc/systems/mcu/testcodes/uart_driver_tests/uart_driver_tests_cm0.uvopt b/Cortex-M0/nanosoc/systems/mcu/testcodes/uart_driver_tests/uart_driver_tests_cm0.uvopt new file mode 100644 index 0000000..dde1fbb --- /dev/null +++ b/Cortex-M0/nanosoc/systems/mcu/testcodes/uart_driver_tests/uart_driver_tests_cm0.uvopt @@ -0,0 +1,277 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no" ?> +<ProjectOpt xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="project_opt.xsd"> + + <SchemaVersion>1.0</SchemaVersion> + + <Header>### uVision Project, (C) Keil Software</Header> + + <Extensions> + <cExt>*.c</cExt> + <aExt>*.s*; *.src; *.a*</aExt> + <oExt>*.obj</oExt> + <lExt>*.lib</lExt> + <tExt>*.txt; *.h; *.inc</tExt> + <pExt>*.plm</pExt> + <CppX>*.cpp</CppX> + </Extensions> + + <DaveTm> + <dwLowDateTime>0</dwLowDateTime> + <dwHighDateTime>0</dwHighDateTime> + </DaveTm> + + <Target> + <TargetName>Debug</TargetName> + <ToolsetNumber>0x4</ToolsetNumber> + <ToolsetName>ARM-ADS</ToolsetName> + <TargetOption> + <CLKADS>50000000</CLKADS> + <OPTTT> + <gFlags>1</gFlags> + <BeepAtEnd>1</BeepAtEnd> + <RunSim>1</RunSim> + <RunTarget>0</RunTarget> + </OPTTT> + <OPTHX> + <HexSelection>1</HexSelection> + <FlashByte>65535</FlashByte> + <HexRangeLowAddress>0</HexRangeLowAddress> + <HexRangeHighAddress>0</HexRangeHighAddress> + <HexOffset>0</HexOffset> + </OPTHX> + <OPTLEX> + <PageWidth>79</PageWidth> + <PageLength>66</PageLength> + <TabStop>8</TabStop> + <ListingPath>.\</ListingPath> + </OPTLEX> + <ListingPage> + <CreateCListing>1</CreateCListing> + <CreateAListing>1</CreateAListing> + <CreateLListing>1</CreateLListing> + <CreateIListing>0</CreateIListing> + <AsmCond>1</AsmCond> + <AsmSymb>1</AsmSymb> + <AsmXref>0</AsmXref> + <CCond>1</CCond> + <CCode>0</CCode> + <CListInc>0</CListInc> + <CSymb>0</CSymb> + <LinkerCodeListing>0</LinkerCodeListing> + </ListingPage> + <OPTXL> + <LMap>1</LMap> + <LComments>1</LComments> + <LGenerateSymbols>1</LGenerateSymbols> + <LLibSym>1</LLibSym> + <LLines>1</LLines> + <LLocSym>1</LLocSym> + <LPubSym>1</LPubSym> + <LXref>0</LXref> + <LExpSel>0</LExpSel> + </OPTXL> + <OPTFL> + <tvExp>1</tvExp> + <tvExpOptDlg>0</tvExpOptDlg> + <IsCurrentTarget>1</IsCurrentTarget> + </OPTFL> + <CpuCode>255</CpuCode> + <DllOpt> + <SimDllName>SARMCM3.DLL</SimDllName> + <SimDllArguments></SimDllArguments> + <SimDlgDllName>DARMCM1.DLL</SimDlgDllName> + <SimDlgDllArguments></SimDlgDllArguments> + <TargetDllName>SARMCM3.DLL</TargetDllName> + <TargetDllArguments></TargetDllArguments> + <TargetDlgDllName>TARMCM1.DLL</TargetDlgDllName> + <TargetDlgDllArguments></TargetDlgDllArguments> + </DllOpt> + <DebugOpt> + <uSim>1</uSim> + <uTrg>0</uTrg> + <sLdApp>1</sLdApp> + <sGomain>1</sGomain> + <sRbreak>1</sRbreak> + <sRwatch>1</sRwatch> + <sRmem>1</sRmem> + <sRfunc>1</sRfunc> + <sRbox>1</sRbox> + <tLdApp>1</tLdApp> + <tGomain>0</tGomain> + <tRbreak>1</tRbreak> + <tRwatch>1</tRwatch> + <tRmem>1</tRmem> + <tRfunc>0</tRfunc> + <tRbox>1</tRbox> + <tRtrace>0</tRtrace> + <sRunDeb>0</sRunDeb> + <sLrtime>0</sLrtime> + <nTsel>-1</nTsel> + <sDll></sDll> + <sDllPa></sDllPa> + <sDlgDll></sDlgDll> + <sDlgPa></sDlgPa> + <sIfile></sIfile> + <tDll></tDll> + <tDllPa></tDllPa> + <tDlgDll></tDlgDll> + <tDlgPa></tDlgPa> + <tIfile></tIfile> + <pMon></pMon> + </DebugOpt> + <Breakpoint/> + <DebugFlag> + <trace>0</trace> + <periodic>1</periodic> + <aLwin>0</aLwin> + <aCover>0</aCover> + <aSer1>0</aSer1> + <aSer2>0</aSer2> + <aPa>0</aPa> + <viewmode>0</viewmode> + <vrSel>0</vrSel> + <aSym>0</aSym> + <aTbox>0</aTbox> + <AscS1>0</AscS1> + <AscS2>0</AscS2> + <AscS3>0</AscS3> + <aSer3>0</aSer3> + <eProf>0</eProf> + <aLa>0</aLa> + <aPa1>0</aPa1> + <AscS4>0</AscS4> + <aSer4>0</aSer4> + <StkLoc>0</StkLoc> + <TrcWin>0</TrcWin> + <newCpu>0</newCpu> + <uProt>0</uProt> + </DebugFlag> + <Tracepoint> + <THDelay>0</THDelay> + </Tracepoint> + <LintExecutable></LintExecutable> + <LintConfigFile></LintConfigFile> + </TargetOption> + </Target> + + <Group> + <GroupName>Startup</GroupName> + <tvExp>1</tvExp> + <tvExpOptDlg>0</tvExpOptDlg> + <cbSel>0</cbSel> + <RteFlg>0</RteFlg> + <File> + <GroupNumber>1</GroupNumber> + <FileNumber>1</FileNumber> + <FileType>2</FileType> + <tvExp>0</tvExp> + <Focus>0</Focus> + <ColumnNumber>0</ColumnNumber> + <tvExpOptDlg>0</tvExpOptDlg> + <TopLine>0</TopLine> + <CurrentLine>0</CurrentLine> + <bDave2>0</bDave2> + <PathWithFileName>..\..\..\..\software\cmsis\Device\ARM\CMSDK_CM0\Source\ARM\startup_CMSDK_CM0.s</PathWithFileName> + <FilenameWithoutPath>startup_CMSDK_CM0.s</FilenameWithoutPath> + <RteFlg>0</RteFlg> + <bShared>0</bShared> + </File> + </Group> + + <Group> + <GroupName>Application</GroupName> + <tvExp>1</tvExp> + <tvExpOptDlg>0</tvExpOptDlg> + <cbSel>0</cbSel> + <RteFlg>0</RteFlg> + <File> + <GroupNumber>2</GroupNumber> + <FileNumber>2</FileNumber> + <FileType>1</FileType> + <tvExp>0</tvExp> + <Focus>0</Focus> + <ColumnNumber>0</ColumnNumber> + <tvExpOptDlg>0</tvExpOptDlg> + <TopLine>0</TopLine> + <CurrentLine>0</CurrentLine> + <bDave2>0</bDave2> + <PathWithFileName>..\..\..\..\software\common\validation\uart_driver_tests.c</PathWithFileName> + <FilenameWithoutPath>uart_driver_tests.c</FilenameWithoutPath> + <RteFlg>0</RteFlg> + <bShared>0</bShared> + </File> + <File> + <GroupNumber>2</GroupNumber> + <FileNumber>3</FileNumber> + <FileType>1</FileType> + <tvExp>0</tvExp> + <Focus>0</Focus> + <ColumnNumber>0</ColumnNumber> + <tvExpOptDlg>0</tvExpOptDlg> + <TopLine>0</TopLine> + <CurrentLine>0</CurrentLine> + <bDave2>0</bDave2> + <PathWithFileName>..\..\..\..\software\common\retarget\uart_stdout.c</PathWithFileName> + <FilenameWithoutPath>uart_stdout.c</FilenameWithoutPath> + <RteFlg>0</RteFlg> + <bShared>0</bShared> + </File> + <File> + <GroupNumber>2</GroupNumber> + <FileNumber>4</FileNumber> + <FileType>1</FileType> + <tvExp>0</tvExp> + <Focus>0</Focus> + <ColumnNumber>0</ColumnNumber> + <tvExpOptDlg>0</tvExpOptDlg> + <TopLine>0</TopLine> + <CurrentLine>0</CurrentLine> + <bDave2>0</bDave2> + <PathWithFileName>..\..\..\..\software\common\retarget\retarget.c</PathWithFileName> + <FilenameWithoutPath>retarget.c</FilenameWithoutPath> + <RteFlg>0</RteFlg> + <bShared>0</bShared> + </File> + <File> + <GroupNumber>2</GroupNumber> + <FileNumber>5</FileNumber> + <FileType>1</FileType> + <tvExp>0</tvExp> + <Focus>0</Focus> + <ColumnNumber>0</ColumnNumber> + <tvExpOptDlg>0</tvExpOptDlg> + <TopLine>0</TopLine> + <CurrentLine>0</CurrentLine> + <bDave2>0</bDave2> + <PathWithFileName>..\..\..\..\software\cmsis\Device\ARM\CMSDK_CM0\Source\CMSDK_driver.c</PathWithFileName> + <FilenameWithoutPath>CMSDK_driver.c</FilenameWithoutPath> + <RteFlg>0</RteFlg> + <bShared>0</bShared> + </File> + </Group> + + <Group> + <GroupName>System</GroupName> + <tvExp>1</tvExp> + <tvExpOptDlg>0</tvExpOptDlg> + <cbSel>0</cbSel> + <RteFlg>0</RteFlg> + <File> + <GroupNumber>3</GroupNumber> + <FileNumber>6</FileNumber> + <FileType>1</FileType> + <tvExp>0</tvExp> + <Focus>0</Focus> + <ColumnNumber>0</ColumnNumber> + <tvExpOptDlg>0</tvExpOptDlg> + <TopLine>0</TopLine> + <CurrentLine>0</CurrentLine> + <bDave2>0</bDave2> + <PathWithFileName>..\..\..\..\software\cmsis\Device\ARM\CMSDK_CM0\Source\system_CMSDK_CM0.c</PathWithFileName> + <FilenameWithoutPath>system_CMSDK_CM0.c</FilenameWithoutPath> + <RteFlg>0</RteFlg> + <bShared>0</bShared> + </File> + </Group> + +</ProjectOpt> diff --git a/Cortex-M0/nanosoc/systems/mcu/testcodes/uart_driver_tests/uart_driver_tests_cm0.uvproj b/Cortex-M0/nanosoc/systems/mcu/testcodes/uart_driver_tests/uart_driver_tests_cm0.uvproj new file mode 100644 index 0000000..3c667aa --- /dev/null +++ b/Cortex-M0/nanosoc/systems/mcu/testcodes/uart_driver_tests/uart_driver_tests_cm0.uvproj @@ -0,0 +1,440 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no" ?> +<Project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="project_proj.xsd"> + + <SchemaVersion>1.1</SchemaVersion> + + <Header>### uVision Project, (C) Keil Software</Header> + + <Targets> + <Target> + <TargetName>Debug</TargetName> + <ToolsetNumber>0x4</ToolsetNumber> + <ToolsetName>ARM-ADS</ToolsetName> + <TargetOption> + <TargetCommonOption> + <Device>Cortex-M0</Device> + <Vendor>ARM</Vendor> + <Cpu>CLOCK(12000000) CPUTYPE("Cortex-M0") ESEL ELITTLE</Cpu> + <FlashUtilSpec></FlashUtilSpec> + <StartupFile></StartupFile> + <FlashDriverDll></FlashDriverDll> + <DeviceId>4803</DeviceId> + <RegisterFile></RegisterFile> + <MemoryEnv></MemoryEnv> + <Cmp></Cmp> + <Asm></Asm> + <Linker></Linker> + <OHString></OHString> + <InfinionOptionDll></InfinionOptionDll> + <SLE66CMisc></SLE66CMisc> + <SLE66AMisc></SLE66AMisc> + <SLE66LinkerMisc></SLE66LinkerMisc> + <SFDFile></SFDFile> + <UseEnv>0</UseEnv> + <BinPath></BinPath> + <IncludePath></IncludePath> + <LibPath></LibPath> + <RegisterFilePath></RegisterFilePath> + <DBRegisterFilePath></DBRegisterFilePath> + <TargetStatus> + <Error>0</Error> + <ExitCodeStop>0</ExitCodeStop> + <ButtonStop>0</ButtonStop> + <NotGenerated>0</NotGenerated> + <InvalidFlash>1</InvalidFlash> + </TargetStatus> + <OutputDirectory>.\</OutputDirectory> + <OutputName>uart_driver_tests</OutputName> + <CreateExecutable>1</CreateExecutable> + <CreateLib>0</CreateLib> + <CreateHexFile>0</CreateHexFile> + <DebugInformation>1</DebugInformation> + <BrowseInformation>1</BrowseInformation> + <ListingPath>.\</ListingPath> + <HexFormatSelection>1</HexFormatSelection> + <Merge32K>0</Merge32K> + <CreateBatchFile>0</CreateBatchFile> + <BeforeCompile> + <RunUserProg1>0</RunUserProg1> + <RunUserProg2>0</RunUserProg2> + <UserProg1Name></UserProg1Name> + <UserProg2Name></UserProg2Name> + <UserProg1Dos16Mode>0</UserProg1Dos16Mode> + <UserProg2Dos16Mode>0</UserProg2Dos16Mode> + <nStopU1X>0</nStopU1X> + <nStopU2X>0</nStopU2X> + </BeforeCompile> + <BeforeMake> + <RunUserProg1>0</RunUserProg1> + <RunUserProg2>0</RunUserProg2> + <UserProg1Name></UserProg1Name> + <UserProg2Name></UserProg2Name> + <UserProg1Dos16Mode>0</UserProg1Dos16Mode> + <UserProg2Dos16Mode>0</UserProg2Dos16Mode> + </BeforeMake> + <AfterMake> + <RunUserProg1>1</RunUserProg1> + <RunUserProg2>0</RunUserProg2> + <UserProg1Name>$K\ARM\ARMCC\BIN\fromelf.exe #L --vhx --8x1 --output uart_driver_tests.hex</UserProg1Name> + <UserProg2Name></UserProg2Name> + <UserProg1Dos16Mode>0</UserProg1Dos16Mode> + <UserProg2Dos16Mode>0</UserProg2Dos16Mode> + </AfterMake> + <SelectedForBatchBuild>0</SelectedForBatchBuild> + <SVCSIdString></SVCSIdString> + </TargetCommonOption> + <CommonProperty> + <UseCPPCompiler>0</UseCPPCompiler> + <RVCTCodeConst>0</RVCTCodeConst> + <RVCTZI>0</RVCTZI> + <RVCTOtherData>0</RVCTOtherData> + <ModuleSelection>0</ModuleSelection> + <IncludeInBuild>1</IncludeInBuild> + <AlwaysBuild>0</AlwaysBuild> + <GenerateAssemblyFile>0</GenerateAssemblyFile> + <AssembleAssemblyFile>0</AssembleAssemblyFile> + <PublicsOnly>0</PublicsOnly> + <StopOnExitCode>3</StopOnExitCode> + <CustomArgument></CustomArgument> + <IncludeLibraryModules></IncludeLibraryModules> + </CommonProperty> + <DllOption> + <SimDllName>SARMCM3.DLL</SimDllName> + <SimDllArguments></SimDllArguments> + <SimDlgDll>DARMCM1.DLL</SimDlgDll> + <SimDlgDllArguments></SimDlgDllArguments> + <TargetDllName>SARMCM3.DLL</TargetDllName> + <TargetDllArguments></TargetDllArguments> + <TargetDlgDll>TARMCM1.DLL</TargetDlgDll> + <TargetDlgDllArguments></TargetDlgDllArguments> + </DllOption> + <DebugOption> + <OPTHX> + <HexSelection>1</HexSelection> + <HexRangeLowAddress>0</HexRangeLowAddress> + <HexRangeHighAddress>0</HexRangeHighAddress> + <HexOffset>0</HexOffset> + <Oh166RecLen>16</Oh166RecLen> + </OPTHX> + <Simulator> + <UseSimulator>1</UseSimulator> + <LoadApplicationAtStartup>1</LoadApplicationAtStartup> + <RunToMain>1</RunToMain> + <RestoreBreakpoints>1</RestoreBreakpoints> + <RestoreWatchpoints>1</RestoreWatchpoints> + <RestoreMemoryDisplay>1</RestoreMemoryDisplay> + <RestoreFunctions>1</RestoreFunctions> + <RestoreToolbox>1</RestoreToolbox> + <LimitSpeedToRealTime>0</LimitSpeedToRealTime> + </Simulator> + <Target> + <UseTarget>0</UseTarget> + <LoadApplicationAtStartup>1</LoadApplicationAtStartup> + <RunToMain>0</RunToMain> + <RestoreBreakpoints>1</RestoreBreakpoints> + <RestoreWatchpoints>1</RestoreWatchpoints> + <RestoreMemoryDisplay>1</RestoreMemoryDisplay> + <RestoreFunctions>0</RestoreFunctions> + <RestoreToolbox>1</RestoreToolbox> + <RestoreTracepoints>0</RestoreTracepoints> + </Target> + <RunDebugAfterBuild>0</RunDebugAfterBuild> + <TargetSelection>-1</TargetSelection> + <SimDlls> + <CpuDll></CpuDll> + <CpuDllArguments></CpuDllArguments> + <PeripheralDll></PeripheralDll> + <PeripheralDllArguments></PeripheralDllArguments> + <InitializationFile></InitializationFile> + </SimDlls> + <TargetDlls> + <CpuDll></CpuDll> + <CpuDllArguments></CpuDllArguments> + <PeripheralDll></PeripheralDll> + <PeripheralDllArguments></PeripheralDllArguments> + <InitializationFile></InitializationFile> + <Driver></Driver> + </TargetDlls> + </DebugOption> + <Utilities> + <Flash1> + <UseTargetDll>0</UseTargetDll> + <UseExternalTool>0</UseExternalTool> + <RunIndependent>0</RunIndependent> + <UpdateFlashBeforeDebugging>0</UpdateFlashBeforeDebugging> + <Capability>0</Capability> + <DriverSelection>-1</DriverSelection> + </Flash1> + <Flash2></Flash2> + <Flash3></Flash3> + <Flash4></Flash4> + </Utilities> + <TargetArmAds> + <ArmAdsMisc> + <GenerateListings>0</GenerateListings> + <asHll>1</asHll> + <asAsm>1</asAsm> + <asMacX>1</asMacX> + <asSyms>1</asSyms> + <asFals>1</asFals> + <asDbgD>1</asDbgD> + <asForm>1</asForm> + <ldLst>0</ldLst> + <ldmm>1</ldmm> + <ldXref>1</ldXref> + <BigEnd>0</BigEnd> + <AdsALst>1</AdsALst> + <AdsACrf>1</AdsACrf> + <AdsANop>0</AdsANop> + <AdsANot>0</AdsANot> + <AdsLLst>1</AdsLLst> + <AdsLmap>1</AdsLmap> + <AdsLcgr>1</AdsLcgr> + <AdsLsym>1</AdsLsym> + <AdsLszi>1</AdsLszi> + <AdsLtoi>1</AdsLtoi> + <AdsLsun>1</AdsLsun> + <AdsLven>1</AdsLven> + <AdsLsxf>1</AdsLsxf> + <RvctClst>0</RvctClst> + <GenPPlst>0</GenPPlst> + <AdsCpuType>"Cortex-M0"</AdsCpuType> + <RvctDeviceName></RvctDeviceName> + <mOS>0</mOS> + <uocRom>0</uocRom> + <uocRam>0</uocRam> + <hadIROM>0</hadIROM> + <hadIRAM>0</hadIRAM> + <hadXRAM>0</hadXRAM> + <uocXRam>0</uocXRam> + <RvdsVP>0</RvdsVP> + <hadIRAM2>0</hadIRAM2> + <hadIROM2>0</hadIROM2> + <StupSel>1</StupSel> + <useUlib>0</useUlib> + <EndSel>1</EndSel> + <uLtcg>0</uLtcg> + <RoSelD>0</RoSelD> + <RwSelD>5</RwSelD> + <CodeSel>0</CodeSel> + <OptFeed>0</OptFeed> + <NoZi1>0</NoZi1> + <NoZi2>0</NoZi2> + <NoZi3>0</NoZi3> + <NoZi4>0</NoZi4> + <NoZi5>0</NoZi5> + <Ro1Chk>1</Ro1Chk> + <Ro2Chk>0</Ro2Chk> + <Ro3Chk>0</Ro3Chk> + <Ir1Chk>0</Ir1Chk> + <Ir2Chk>0</Ir2Chk> + <Ra1Chk>1</Ra1Chk> + <Ra2Chk>0</Ra2Chk> + <Ra3Chk>0</Ra3Chk> + <Im1Chk>0</Im1Chk> + <Im2Chk>0</Im2Chk> + <OnChipMemories> + <Ocm1> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </Ocm1> + <Ocm2> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </Ocm2> + <Ocm3> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </Ocm3> + <Ocm4> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </Ocm4> + <Ocm5> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </Ocm5> + <Ocm6> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </Ocm6> + <IRAM> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </IRAM> + <IROM> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </IROM> + <XRAM> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </XRAM> + <OCR_RVCT1> + <Type>1</Type> + <StartAddress>0x0</StartAddress> + <Size>0x10000</Size> + </OCR_RVCT1> + <OCR_RVCT2> + <Type>1</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </OCR_RVCT2> + <OCR_RVCT3> + <Type>1</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </OCR_RVCT3> + <OCR_RVCT4> + <Type>1</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </OCR_RVCT4> + <OCR_RVCT5> + <Type>1</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </OCR_RVCT5> + <OCR_RVCT6> + <Type>0</Type> + <StartAddress>0x20000000</StartAddress> + <Size>0x10000</Size> + </OCR_RVCT6> + <OCR_RVCT7> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </OCR_RVCT7> + <OCR_RVCT8> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </OCR_RVCT8> + <OCR_RVCT9> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </OCR_RVCT9> + <OCR_RVCT10> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </OCR_RVCT10> + </OnChipMemories> + <RvctStartVector></RvctStartVector> + </ArmAdsMisc> + <Cads> + <interw>1</interw> + <Optim>4</Optim> + <oTime>0</oTime> + <SplitLS>0</SplitLS> + <OneElfS>0</OneElfS> + <Strict>0</Strict> + <EnumInt>0</EnumInt> + <PlainCh>0</PlainCh> + <Ropi>0</Ropi> + <Rwpi>0</Rwpi> + <wLevel>0</wLevel> + <uThumb>0</uThumb> + <uSurpInc>0</uSurpInc> + <VariousControls> + <MiscControls></MiscControls> + <Define>CORTEX_M0</Define> + <Undefine></Undefine> + <IncludePath>..\..\..\..\software\cmsis\CMSIS\Include; ..\..\..\..\software\cmsis\Device\ARM\CMSDK_CM0\Include; ..\..\..\..\software\common\retarget</IncludePath> + </VariousControls> + </Cads> + <Aads> + <interw>1</interw> + <Ropi>0</Ropi> + <Rwpi>0</Rwpi> + <thumb>0</thumb> + <SplitLS>0</SplitLS> + <SwStkChk>0</SwStkChk> + <NoWarn>0</NoWarn> + <uSurpInc>0</uSurpInc> + <VariousControls> + <MiscControls></MiscControls> + <Define></Define> + <Undefine></Undefine> + <IncludePath></IncludePath> + </VariousControls> + </Aads> + <LDads> + <umfTarg>1</umfTarg> + <Ropi>0</Ropi> + <Rwpi>0</Rwpi> + <noStLib>0</noStLib> + <RepFail>1</RepFail> + <useFile>0</useFile> + <TextAddressRange>0x00000000</TextAddressRange> + <DataAddressRange>0x00000000</DataAddressRange> + <ScatterFile></ScatterFile> + <IncludeLibs></IncludeLibs> + <IncludeLibsPath></IncludeLibsPath> + <Misc></Misc> + <LinkerInputFile></LinkerInputFile> + <DisabledWarnings></DisabledWarnings> + </LDads> + </TargetArmAds> + </TargetOption> + <Groups> + <Group> + <GroupName>Startup</GroupName> + <Files> + <File> + <FileName>startup_CMSDK_CM0.s</FileName> + <FileType>2</FileType> + <FilePath>..\..\..\..\software\cmsis\Device\ARM\CMSDK_CM0\Source\ARM\startup_CMSDK_CM0.s</FilePath> + </File> + </Files> + </Group> + <Group> + <GroupName>Application</GroupName> + <Files> + <File> + <FileName>uart_driver_tests.c</FileName> + <FileType>1</FileType> + <FilePath>..\..\..\..\software\common\validation\uart_driver_tests.c</FilePath> + </File> + <File> + <FileName>uart_stdout.c</FileName> + <FileType>1</FileType> + <FilePath>..\..\..\..\software\common\retarget\uart_stdout.c</FilePath> + </File> + <File> + <FileName>retarget.c</FileName> + <FileType>1</FileType> + <FilePath>..\..\..\..\software\common\retarget\retarget.c</FilePath> + </File> + <File> + <FileName>CMSDK_driver.c</FileName> + <FileType>1</FileType> + <FilePath>..\..\..\..\software\cmsis\Device\ARM\CMSDK_CM0\Source\CMSDK_driver.c</FilePath> + </File> + </Files> + </Group> + <Group> + <GroupName>System</GroupName> + <Files> + <File> + <FileName>system_CMSDK_CM0.c</FileName> + <FileType>1</FileType> + <FilePath>..\..\..\..\software\cmsis\Device\ARM\CMSDK_CM0\Source\system_CMSDK_CM0.c</FilePath> + </File> + </Files> + </Group> + </Groups> + </Target> + </Targets> + +</Project> diff --git a/Cortex-M0/nanosoc/systems/mcu/testcodes/uart_driver_tests/uart_driver_tests_cm0p.uvopt b/Cortex-M0/nanosoc/systems/mcu/testcodes/uart_driver_tests/uart_driver_tests_cm0p.uvopt new file mode 100644 index 0000000..c2f595c --- /dev/null +++ b/Cortex-M0/nanosoc/systems/mcu/testcodes/uart_driver_tests/uart_driver_tests_cm0p.uvopt @@ -0,0 +1,258 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no" ?> +<ProjectOpt xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="project_opt.xsd"> + + <SchemaVersion>1.0</SchemaVersion> + + <Header>### uVision Project, (C) Keil Software</Header> + + <Extensions> + <cExt>*.c</cExt> + <aExt>*.s*; *.src; *.a*</aExt> + <oExt>*.obj</oExt> + <lExt>*.lib</lExt> + <tExt>*.txt; *.h; *.inc</tExt> + <pExt>*.plm</pExt> + <CppX>*.cpp</CppX> + </Extensions> + + <DaveTm> + <dwLowDateTime>0</dwLowDateTime> + <dwHighDateTime>0</dwHighDateTime> + </DaveTm> + + <Target> + <TargetName>Debug</TargetName> + <ToolsetNumber>0x4</ToolsetNumber> + <ToolsetName>ARM-ADS</ToolsetName> + <TargetOption> + <CLKADS>50000000</CLKADS> + <OPTTT> + <gFlags>1</gFlags> + <BeepAtEnd>1</BeepAtEnd> + <RunSim>1</RunSim> + <RunTarget>0</RunTarget> + </OPTTT> + <OPTHX> + <HexSelection>1</HexSelection> + <FlashByte>65535</FlashByte> + <HexRangeLowAddress>0</HexRangeLowAddress> + <HexRangeHighAddress>0</HexRangeHighAddress> + <HexOffset>0</HexOffset> + </OPTHX> + <OPTLEX> + <PageWidth>79</PageWidth> + <PageLength>66</PageLength> + <TabStop>8</TabStop> + <ListingPath>.\</ListingPath> + </OPTLEX> + <ListingPage> + <CreateCListing>1</CreateCListing> + <CreateAListing>1</CreateAListing> + <CreateLListing>1</CreateLListing> + <CreateIListing>0</CreateIListing> + <AsmCond>1</AsmCond> + <AsmSymb>1</AsmSymb> + <AsmXref>0</AsmXref> + <CCond>1</CCond> + <CCode>0</CCode> + <CListInc>0</CListInc> + <CSymb>0</CSymb> + <LinkerCodeListing>0</LinkerCodeListing> + </ListingPage> + <OPTXL> + <LMap>1</LMap> + <LComments>1</LComments> + <LGenerateSymbols>1</LGenerateSymbols> + <LLibSym>1</LLibSym> + <LLines>1</LLines> + <LLocSym>1</LLocSym> + <LPubSym>1</LPubSym> + <LXref>0</LXref> + <LExpSel>0</LExpSel> + </OPTXL> + <OPTFL> + <tvExp>1</tvExp> + <tvExpOptDlg>0</tvExpOptDlg> + <IsCurrentTarget>1</IsCurrentTarget> + </OPTFL> + <CpuCode>255</CpuCode> + <DllOpt> + <SimDllName>SARMCM3.DLL</SimDllName> + <SimDllArguments></SimDllArguments> + <SimDlgDllName>DARMCM1.DLL</SimDlgDllName> + <SimDlgDllArguments></SimDlgDllArguments> + <TargetDllName>SARMCM3.DLL</TargetDllName> + <TargetDllArguments></TargetDllArguments> + <TargetDlgDllName>TARMCM1.DLL</TargetDlgDllName> + <TargetDlgDllArguments></TargetDlgDllArguments> + </DllOpt> + <DebugOpt> + <uSim>1</uSim> + <uTrg>0</uTrg> + <sLdApp>1</sLdApp> + <sGomain>1</sGomain> + <sRbreak>1</sRbreak> + <sRwatch>1</sRwatch> + <sRmem>1</sRmem> + <sRfunc>1</sRfunc> + <sRbox>1</sRbox> + <tLdApp>1</tLdApp> + <tGomain>0</tGomain> + <tRbreak>1</tRbreak> + <tRwatch>1</tRwatch> + <tRmem>1</tRmem> + <tRfunc>0</tRfunc> + <tRbox>1</tRbox> + <sRunDeb>0</sRunDeb> + <sLrtime>0</sLrtime> + <nTsel>-1</nTsel> + <sDll></sDll> + <sDllPa></sDllPa> + <sDlgDll></sDlgDll> + <sDlgPa></sDlgPa> + <sIfile></sIfile> + <tDll></tDll> + <tDllPa></tDllPa> + <tDlgDll></tDlgDll> + <tDlgPa></tDlgPa> + <tIfile></tIfile> + <pMon></pMon> + </DebugOpt> + <Breakpoint/> + <DebugFlag> + <trace>0</trace> + <periodic>1</periodic> + <aLwin>0</aLwin> + <aCover>0</aCover> + <aSer1>0</aSer1> + <aSer2>0</aSer2> + <aPa>0</aPa> + <viewmode>0</viewmode> + <vrSel>0</vrSel> + <aSym>0</aSym> + <aTbox>0</aTbox> + <AscS1>0</AscS1> + <AscS2>0</AscS2> + <AscS3>0</AscS3> + <aSer3>0</aSer3> + <eProf>0</eProf> + <aLa>0</aLa> + <aPa1>0</aPa1> + <AscS4>0</AscS4> + <aSer4>0</aSer4> + <StkLoc>0</StkLoc> + <TrcWin>0</TrcWin> + <newCpu>0</newCpu> + <uProt>0</uProt> + </DebugFlag> + <LintExecutable></LintExecutable> + <LintConfigFile></LintConfigFile> + </TargetOption> + </Target> + + <Group> + <GroupName>Startup</GroupName> + <tvExp>1</tvExp> + <tvExpOptDlg>0</tvExpOptDlg> + <cbSel>0</cbSel> + <File> + <GroupNumber>1</GroupNumber> + <FileNumber>1</FileNumber> + <FileType>2</FileType> + <tvExp>0</tvExp> + <Focus>0</Focus> + <ColumnNumber>0</ColumnNumber> + <tvExpOptDlg>0</tvExpOptDlg> + <TopLine>0</TopLine> + <CurrentLine>0</CurrentLine> + <bDave2>0</bDave2> + <PathWithFileName>..\..\..\..\software\cmsis\Device\ARM\CMSDK_CM0plus\Source\ARM\startup_CMSDK_CM0plus.s</PathWithFileName> + <FilenameWithoutPath>startup_CMSDK_CM0plus.s</FilenameWithoutPath> + </File> + </Group> + + <Group> + <GroupName>Application</GroupName> + <tvExp>1</tvExp> + <tvExpOptDlg>0</tvExpOptDlg> + <cbSel>0</cbSel> + <File> + <GroupNumber>2</GroupNumber> + <FileNumber>2</FileNumber> + <FileType>1</FileType> + <tvExp>0</tvExp> + <Focus>0</Focus> + <ColumnNumber>0</ColumnNumber> + <tvExpOptDlg>0</tvExpOptDlg> + <TopLine>0</TopLine> + <CurrentLine>0</CurrentLine> + <bDave2>0</bDave2> + <PathWithFileName>..\..\..\..\software\common\validation\uart_driver_tests.c</PathWithFileName> + <FilenameWithoutPath>uart_driver_tests.c</FilenameWithoutPath> + </File> + <File> + <GroupNumber>2</GroupNumber> + <FileNumber>3</FileNumber> + <FileType>1</FileType> + <tvExp>0</tvExp> + <Focus>0</Focus> + <ColumnNumber>0</ColumnNumber> + <tvExpOptDlg>0</tvExpOptDlg> + <TopLine>0</TopLine> + <CurrentLine>0</CurrentLine> + <bDave2>0</bDave2> + <PathWithFileName>..\..\..\..\software\common\retarget\uart_stdout.c</PathWithFileName> + <FilenameWithoutPath>uart_stdout.c</FilenameWithoutPath> + </File> + <File> + <GroupNumber>2</GroupNumber> + <FileNumber>4</FileNumber> + <FileType>1</FileType> + <tvExp>0</tvExp> + <Focus>0</Focus> + <ColumnNumber>0</ColumnNumber> + <tvExpOptDlg>0</tvExpOptDlg> + <TopLine>0</TopLine> + <CurrentLine>0</CurrentLine> + <bDave2>0</bDave2> + <PathWithFileName>..\..\..\..\software\common\retarget\retarget.c</PathWithFileName> + <FilenameWithoutPath>retarget.c</FilenameWithoutPath> + </File> + <File> + <GroupNumber>2</GroupNumber> + <FileNumber>5</FileNumber> + <FileType>1</FileType> + <tvExp>0</tvExp> + <Focus>0</Focus> + <ColumnNumber>0</ColumnNumber> + <tvExpOptDlg>0</tvExpOptDlg> + <TopLine>0</TopLine> + <CurrentLine>0</CurrentLine> + <bDave2>0</bDave2> + <PathWithFileName>..\..\..\..\software\cmsis\Device\ARM\CMSDK_CM0plus\Source\CMSDK_driver.c</PathWithFileName> + <FilenameWithoutPath>CMSDK_driver.c</FilenameWithoutPath> + </File> + </Group> + + <Group> + <GroupName>System</GroupName> + <tvExp>1</tvExp> + <tvExpOptDlg>0</tvExpOptDlg> + <cbSel>0</cbSel> + <File> + <GroupNumber>3</GroupNumber> + <FileNumber>6</FileNumber> + <FileType>1</FileType> + <tvExp>0</tvExp> + <Focus>0</Focus> + <ColumnNumber>0</ColumnNumber> + <tvExpOptDlg>0</tvExpOptDlg> + <TopLine>0</TopLine> + <CurrentLine>0</CurrentLine> + <bDave2>0</bDave2> + <PathWithFileName>..\..\..\..\software\cmsis\Device\ARM\CMSDK_CM0plus\Source\system_CMSDK_CM0plus.c</PathWithFileName> + <FilenameWithoutPath>system_CMSDK_CM0plus.c</FilenameWithoutPath> + </File> + </Group> + +</ProjectOpt> diff --git a/Cortex-M0/nanosoc/systems/mcu/testcodes/uart_driver_tests/uart_driver_tests_cm0p.uvproj b/Cortex-M0/nanosoc/systems/mcu/testcodes/uart_driver_tests/uart_driver_tests_cm0p.uvproj new file mode 100644 index 0000000..cf69fa2 --- /dev/null +++ b/Cortex-M0/nanosoc/systems/mcu/testcodes/uart_driver_tests/uart_driver_tests_cm0p.uvproj @@ -0,0 +1,437 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no" ?> +<Project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="project_proj.xsd"> + + <SchemaVersion>1.1</SchemaVersion> + + <Header>### uVision Project, (C) Keil Software</Header> + + <Targets> + <Target> + <TargetName>Debug</TargetName> + <ToolsetNumber>0x4</ToolsetNumber> + <ToolsetName>ARM-ADS</ToolsetName> + <TargetOption> + <TargetCommonOption> + <Device>Cortex-M0+</Device> + <Vendor>ARM</Vendor> + <Cpu>CLOCK(12000000) CPUTYPE("Cortex-M0+") ESEL ELITTLE</Cpu> + <FlashUtilSpec></FlashUtilSpec> + <StartupFile></StartupFile> + <FlashDriverDll></FlashDriverDll> + <DeviceId>6268</DeviceId> + <RegisterFile></RegisterFile> + <MemoryEnv></MemoryEnv> + <Cmp></Cmp> + <Asm></Asm> + <Linker></Linker> + <OHString></OHString> + <InfinionOptionDll></InfinionOptionDll> + <SLE66CMisc></SLE66CMisc> + <SLE66AMisc></SLE66AMisc> + <SLE66LinkerMisc></SLE66LinkerMisc> + <SFDFile></SFDFile> + <UseEnv>0</UseEnv> + <BinPath></BinPath> + <IncludePath></IncludePath> + <LibPath></LibPath> + <RegisterFilePath></RegisterFilePath> + <DBRegisterFilePath></DBRegisterFilePath> + <TargetStatus> + <Error>0</Error> + <ExitCodeStop>0</ExitCodeStop> + <ButtonStop>0</ButtonStop> + <NotGenerated>0</NotGenerated> + <InvalidFlash>1</InvalidFlash> + </TargetStatus> + <OutputDirectory>.\</OutputDirectory> + <OutputName>uart_driver_tests</OutputName> + <CreateExecutable>1</CreateExecutable> + <CreateLib>0</CreateLib> + <CreateHexFile>0</CreateHexFile> + <DebugInformation>1</DebugInformation> + <BrowseInformation>1</BrowseInformation> + <ListingPath>.\</ListingPath> + <HexFormatSelection>1</HexFormatSelection> + <Merge32K>0</Merge32K> + <CreateBatchFile>0</CreateBatchFile> + <BeforeCompile> + <RunUserProg1>0</RunUserProg1> + <RunUserProg2>0</RunUserProg2> + <UserProg1Name></UserProg1Name> + <UserProg2Name></UserProg2Name> + <UserProg1Dos16Mode>0</UserProg1Dos16Mode> + <UserProg2Dos16Mode>0</UserProg2Dos16Mode> + <nStopU1X>0</nStopU1X> + <nStopU2X>0</nStopU2X> + </BeforeCompile> + <BeforeMake> + <RunUserProg1>0</RunUserProg1> + <RunUserProg2>0</RunUserProg2> + <UserProg1Name></UserProg1Name> + <UserProg2Name></UserProg2Name> + <UserProg1Dos16Mode>0</UserProg1Dos16Mode> + <UserProg2Dos16Mode>0</UserProg2Dos16Mode> + </BeforeMake> + <AfterMake> + <RunUserProg1>1</RunUserProg1> + <RunUserProg2>0</RunUserProg2> + <UserProg1Name>$K\ARM\ARMCC\BIN\fromelf.exe #L --vhx --8x1 --output uart_driver_tests.hex</UserProg1Name> + <UserProg2Name></UserProg2Name> + <UserProg1Dos16Mode>0</UserProg1Dos16Mode> + <UserProg2Dos16Mode>0</UserProg2Dos16Mode> + </AfterMake> + <SelectedForBatchBuild>0</SelectedForBatchBuild> + <SVCSIdString></SVCSIdString> + </TargetCommonOption> + <CommonProperty> + <UseCPPCompiler>0</UseCPPCompiler> + <RVCTCodeConst>0</RVCTCodeConst> + <RVCTZI>0</RVCTZI> + <RVCTOtherData>0</RVCTOtherData> + <ModuleSelection>0</ModuleSelection> + <IncludeInBuild>1</IncludeInBuild> + <AlwaysBuild>0</AlwaysBuild> + <GenerateAssemblyFile>0</GenerateAssemblyFile> + <AssembleAssemblyFile>0</AssembleAssemblyFile> + <PublicsOnly>0</PublicsOnly> + <StopOnExitCode>3</StopOnExitCode> + <CustomArgument></CustomArgument> + <IncludeLibraryModules></IncludeLibraryModules> + </CommonProperty> + <DllOption> + <SimDllName>SARMCM3.DLL</SimDllName> + <SimDllArguments></SimDllArguments> + <SimDlgDll>DARMCM1.DLL</SimDlgDll> + <SimDlgDllArguments></SimDlgDllArguments> + <TargetDllName>SARMCM3.DLL</TargetDllName> + <TargetDllArguments></TargetDllArguments> + <TargetDlgDll>TARMCM1.DLL</TargetDlgDll> + <TargetDlgDllArguments></TargetDlgDllArguments> + </DllOption> + <DebugOption> + <OPTHX> + <HexSelection>1</HexSelection> + <HexRangeLowAddress>0</HexRangeLowAddress> + <HexRangeHighAddress>0</HexRangeHighAddress> + <HexOffset>0</HexOffset> + <Oh166RecLen>16</Oh166RecLen> + </OPTHX> + <Simulator> + <UseSimulator>1</UseSimulator> + <LoadApplicationAtStartup>1</LoadApplicationAtStartup> + <RunToMain>1</RunToMain> + <RestoreBreakpoints>1</RestoreBreakpoints> + <RestoreWatchpoints>1</RestoreWatchpoints> + <RestoreMemoryDisplay>1</RestoreMemoryDisplay> + <RestoreFunctions>1</RestoreFunctions> + <RestoreToolbox>1</RestoreToolbox> + <LimitSpeedToRealTime>0</LimitSpeedToRealTime> + </Simulator> + <Target> + <UseTarget>0</UseTarget> + <LoadApplicationAtStartup>1</LoadApplicationAtStartup> + <RunToMain>0</RunToMain> + <RestoreBreakpoints>1</RestoreBreakpoints> + <RestoreWatchpoints>1</RestoreWatchpoints> + <RestoreMemoryDisplay>1</RestoreMemoryDisplay> + <RestoreFunctions>0</RestoreFunctions> + <RestoreToolbox>1</RestoreToolbox> + </Target> + <RunDebugAfterBuild>0</RunDebugAfterBuild> + <TargetSelection>-1</TargetSelection> + <SimDlls> + <CpuDll></CpuDll> + <CpuDllArguments></CpuDllArguments> + <PeripheralDll></PeripheralDll> + <PeripheralDllArguments></PeripheralDllArguments> + <InitializationFile></InitializationFile> + </SimDlls> + <TargetDlls> + <CpuDll></CpuDll> + <CpuDllArguments></CpuDllArguments> + <PeripheralDll></PeripheralDll> + <PeripheralDllArguments></PeripheralDllArguments> + <InitializationFile></InitializationFile> + <Driver></Driver> + </TargetDlls> + </DebugOption> + <Utilities> + <Flash1> + <UseTargetDll>0</UseTargetDll> + <UseExternalTool>0</UseExternalTool> + <RunIndependent>0</RunIndependent> + <UpdateFlashBeforeDebugging>0</UpdateFlashBeforeDebugging> + <Capability>0</Capability> + <DriverSelection>-1</DriverSelection> + </Flash1> + <Flash2></Flash2> + <Flash3></Flash3> + <Flash4></Flash4> + </Utilities> + <TargetArmAds> + <ArmAdsMisc> + <GenerateListings>0</GenerateListings> + <asHll>1</asHll> + <asAsm>1</asAsm> + <asMacX>1</asMacX> + <asSyms>1</asSyms> + <asFals>1</asFals> + <asDbgD>1</asDbgD> + <asForm>1</asForm> + <ldLst>0</ldLst> + <ldmm>1</ldmm> + <ldXref>1</ldXref> + <BigEnd>0</BigEnd> + <AdsALst>1</AdsALst> + <AdsACrf>1</AdsACrf> + <AdsANop>0</AdsANop> + <AdsANot>0</AdsANot> + <AdsLLst>1</AdsLLst> + <AdsLmap>1</AdsLmap> + <AdsLcgr>1</AdsLcgr> + <AdsLsym>1</AdsLsym> + <AdsLszi>1</AdsLszi> + <AdsLtoi>1</AdsLtoi> + <AdsLsun>1</AdsLsun> + <AdsLven>1</AdsLven> + <AdsLsxf>1</AdsLsxf> + <RvctClst>0</RvctClst> + <GenPPlst>0</GenPPlst> + <AdsCpuType>"Cortex-M0+"</AdsCpuType> + <RvctDeviceName></RvctDeviceName> + <mOS>0</mOS> + <uocRom>0</uocRom> + <uocRam>0</uocRam> + <hadIROM>0</hadIROM> + <hadIRAM>0</hadIRAM> + <hadXRAM>0</hadXRAM> + <uocXRam>0</uocXRam> + <RvdsVP>0</RvdsVP> + <hadIRAM2>0</hadIRAM2> + <hadIROM2>0</hadIROM2> + <StupSel>1</StupSel> + <useUlib>0</useUlib> + <EndSel>1</EndSel> + <uLtcg>0</uLtcg> + <RoSelD>0</RoSelD> + <RwSelD>5</RwSelD> + <CodeSel>0</CodeSel> + <OptFeed>0</OptFeed> + <NoZi1>0</NoZi1> + <NoZi2>0</NoZi2> + <NoZi3>0</NoZi3> + <NoZi4>0</NoZi4> + <NoZi5>0</NoZi5> + <Ro1Chk>1</Ro1Chk> + <Ro2Chk>0</Ro2Chk> + <Ro3Chk>0</Ro3Chk> + <Ir1Chk>0</Ir1Chk> + <Ir2Chk>0</Ir2Chk> + <Ra1Chk>1</Ra1Chk> + <Ra2Chk>0</Ra2Chk> + <Ra3Chk>0</Ra3Chk> + <Im1Chk>0</Im1Chk> + <Im2Chk>0</Im2Chk> + <OnChipMemories> + <Ocm1> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </Ocm1> + <Ocm2> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </Ocm2> + <Ocm3> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </Ocm3> + <Ocm4> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </Ocm4> + <Ocm5> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </Ocm5> + <Ocm6> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </Ocm6> + <IRAM> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </IRAM> + <IROM> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </IROM> + <XRAM> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </XRAM> + <OCR_RVCT1> + <Type>1</Type> + <StartAddress>0x0</StartAddress> + <Size>0x10000</Size> + </OCR_RVCT1> + <OCR_RVCT2> + <Type>1</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </OCR_RVCT2> + <OCR_RVCT3> + <Type>1</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </OCR_RVCT3> + <OCR_RVCT4> + <Type>1</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </OCR_RVCT4> + <OCR_RVCT5> + <Type>1</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </OCR_RVCT5> + <OCR_RVCT6> + <Type>0</Type> + <StartAddress>0x20000000</StartAddress> + <Size>0x10000</Size> + </OCR_RVCT6> + <OCR_RVCT7> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </OCR_RVCT7> + <OCR_RVCT8> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </OCR_RVCT8> + <OCR_RVCT9> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </OCR_RVCT9> + <OCR_RVCT10> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </OCR_RVCT10> + </OnChipMemories> + <RvctStartVector></RvctStartVector> + </ArmAdsMisc> + <Cads> + <interw>1</interw> + <Optim>4</Optim> + <oTime>0</oTime> + <SplitLS>0</SplitLS> + <OneElfS>0</OneElfS> + <Strict>0</Strict> + <EnumInt>0</EnumInt> + <PlainCh>0</PlainCh> + <Ropi>0</Ropi> + <Rwpi>0</Rwpi> + <wLevel>0</wLevel> + <uThumb>0</uThumb> + <VariousControls> + <MiscControls></MiscControls> + <Define>CORTEX_M0PLUS</Define> + <Undefine></Undefine> + <IncludePath>..\..\..\..\software\cmsis\CMSIS\Include; ..\..\..\..\software\cmsis\Device\ARM\CMSDK_CM0plus\Include; ..\..\..\..\software\common\retarget</IncludePath> + </VariousControls> + </Cads> + <Aads> + <interw>1</interw> + <Ropi>0</Ropi> + <Rwpi>0</Rwpi> + <thumb>0</thumb> + <SplitLS>0</SplitLS> + <SwStkChk>0</SwStkChk> + <NoWarn>0</NoWarn> + <VariousControls> + <MiscControls></MiscControls> + <Define></Define> + <Undefine></Undefine> + <IncludePath></IncludePath> + </VariousControls> + </Aads> + <LDads> + <umfTarg>1</umfTarg> + <Ropi>0</Ropi> + <Rwpi>0</Rwpi> + <noStLib>0</noStLib> + <RepFail>1</RepFail> + <useFile>0</useFile> + <TextAddressRange>0x00000000</TextAddressRange> + <DataAddressRange>0x00000000</DataAddressRange> + <ScatterFile></ScatterFile> + <IncludeLibs></IncludeLibs> + <IncludeLibsPath></IncludeLibsPath> + <Misc></Misc> + <LinkerInputFile></LinkerInputFile> + <DisabledWarnings></DisabledWarnings> + </LDads> + </TargetArmAds> + </TargetOption> + <Groups> + <Group> + <GroupName>Startup</GroupName> + <Files> + <File> + <FileName>startup_CMSDK_CM0plus.s</FileName> + <FileType>2</FileType> + <FilePath>..\..\..\..\software\cmsis\Device\ARM\CMSDK_CM0plus\Source\ARM\startup_CMSDK_CM0plus.s</FilePath> + </File> + </Files> + </Group> + <Group> + <GroupName>Application</GroupName> + <Files> + <File> + <FileName>uart_driver_tests.c</FileName> + <FileType>1</FileType> + <FilePath>..\..\..\..\software\common\validation\uart_driver_tests.c</FilePath> + </File> + <File> + <FileName>uart_stdout.c</FileName> + <FileType>1</FileType> + <FilePath>..\..\..\..\software\common\retarget\uart_stdout.c</FilePath> + </File> + <File> + <FileName>retarget.c</FileName> + <FileType>1</FileType> + <FilePath>..\..\..\..\software\common\retarget\retarget.c</FilePath> + </File> + <File> + <FileName>CMSDK_driver.c</FileName> + <FileType>1</FileType> + <FilePath>..\..\..\..\software\cmsis\Device\ARM\CMSDK_CM0plus\Source\CMSDK_driver.c</FilePath> + </File> + </Files> + </Group> + <Group> + <GroupName>System</GroupName> + <Files> + <File> + <FileName>system_CMSDK_CM0plus.c</FileName> + <FileType>1</FileType> + <FilePath>..\..\..\..\software\cmsis\Device\ARM\CMSDK_CM0plus\Source\system_CMSDK_CM0plus.c</FilePath> + </File> + </Files> + </Group> + </Groups> + </Target> + </Targets> + +</Project> diff --git a/Cortex-M0/nanosoc/systems/mcu/testcodes/uart_tests/makefile b/Cortex-M0/nanosoc/systems/mcu/testcodes/uart_tests/makefile new file mode 100644 index 0000000..e645bc4 --- /dev/null +++ b/Cortex-M0/nanosoc/systems/mcu/testcodes/uart_tests/makefile @@ -0,0 +1,251 @@ +#----------------------------------------------------------------------------- +# The confidential and proprietary information contained in this file may +# only be used by a person authorised under and to the extent permitted +# by a subsisting licensing agreement from Arm Limited or its affiliates. +# +# (C) COPYRIGHT 2010-2013 Arm Limited or its affiliates. +# ALL RIGHTS RESERVED +# +# This entire notice must be reproduced on all copies of this file +# and copies of this file may only be made by a person if such person is +# permitted to do so under the terms of a subsisting license agreement +# from Arm Limited or its affiliates. +# +# SVN Information +# +# Checked In : $Date: 2011-01-25 10:05:56 +0000 (Tue, 25 Jan 2011) $ +# +# Revision : $Revision: 159421 $ +# +# Release Information : Cortex-M System Design Kit-r1p1-00rel0 +#----------------------------------------------------------------------------- +# +# Cortex-M System Design Kit software compilation make file +# +#----------------------------------------------------------------------------- +# +# Configurations +# +# Choose the core instantiated, can be +# - CORTEX_M0 +# - CORTEX_M0PLUS +CPU_PRODUCT = CORTEX_M0PLUS + +# Shared software directory +SOFTWARE_DIR = ../../../../software +CMSIS_DIR = $(SOFTWARE_DIR)/cmsis +CORE_DIR = $(CMSIS_DIR)/CMSIS/Include + +ifeq ($(CPU_PRODUCT),CORTEX_M0PLUS) + DEVICE_DIR = $(CMSIS_DIR)/Device/ARM/CMSDK_CM0plus +else + DEVICE_DIR = $(CMSIS_DIR)/Device/ARM/CMSDK_CM0 +endif + +# Program file +TESTNAME = uart_tests + +# Endian Option +COMPILE_BIGEND = 0 + +# Configuration +ifeq ($(CPU_PRODUCT),CORTEX_M0PLUS) + USER_DEFINE = -DCORTEX_M0PLUS +else + USER_DEFINE = -DCORTEX_M0 +endif + +DEPS_LIST = makefile + +# Tool chain : ds5 / gcc / keil +TOOL_CHAIN = ds5 + +ifeq ($(TOOL_CHAIN),ds5) + ifeq ($(CPU_PRODUCT),CORTEX_M0PLUS) + CPU_TYPE = --cpu Cortex-M0plus + else + CPU_TYPE = --cpu Cortex-M0 + endif +endif + +ifeq ($(TOOL_CHAIN),gcc) + ifeq ($(CPU_PRODUCT),CORTEX_M0PLUS) + CPU_TYPE = -mcpu=cortex-m0plus + else + CPU_TYPE = -mcpu=cortex-m0 + endif +endif + + +# Startup code directory for DS-5 +ifeq ($(TOOL_CHAIN),ds5) + STARTUP_DIR = $(DEVICE_DIR)/Source/ARM +endif + +# Startup code directory for gcc +ifeq ($(TOOL_CHAIN),gcc) + STARTUP_DIR = $(DEVICE_DIR)/Source/GCC +endif + +ifeq ($(CPU_PRODUCT),CORTEX_M0PLUS) + STARTUP_FILE = startup_CMSDK_CM0plus + SYSTEM_FILE = system_CMSDK_CM0plus +else + STARTUP_FILE = startup_CMSDK_CM0 + SYSTEM_FILE = system_CMSDK_CM0 +endif + +# --------------------------------------------------------------------------------------- +# DS-5 options + +# MicroLIB option +COMPILE_MICROLIB = 0 + +# Small Multiply (Cortex-M0/M0+ has small multiplier option) +COMPILE_SMALLMUL = 0 + +ARM_CC_OPTIONS = -c -O3 -g -Otime $(USER_DEFINE) \ + -I $(DEVICE_DIR)/Include -I $(CORE_DIR) -I $(SOFTWARE_DIR)/common/retarget +ARM_ASM_OPTIONS = -g +ARM_LINK_OPTIONS = "--keep=$(STARTUP_FILE).o(RESET)" "--first=$(STARTUP_FILE).o(RESET)" \ + --rw_base 0x30000000 --ro_base 0x00000000 --map + +ifeq ($(COMPILE_BIGEND),1) + # Big Endian + ARM_CC_OPTIONS += --bigend + ARM_ASM_OPTIONS += --bigend + ARM_LINK_OPTIONS += --be8 +endif + +ifeq ($(COMPILE_MICROLIB),1) + # MicroLIB + ARM_CC_OPTIONS += --library_type=microlib + ARM_ASM_OPTIONS += --library_type=microlib --pd "__MICROLIB SETA 1" + ARM_LINK_OPTIONS += --library_type=microlib +endif + +ifeq ($(COMPILE_SMALLMUL),1) + # In Cortex-M0, small multiply takes 32 cycles + ARM_CC_OPTIONS += --multiply_latency=32 +endif + +# --------------------------------------------------------------------------------------- +# gcc options + +GNG_CC = arm-none-eabi-gcc +GNU_OBJDUMP = arm-none-eabi-objdump +GNU_OBJCOPY = arm-none-eabi-objcopy + +LINKER_SCRIPT_PATH = $(SOFTWARE_DIR)/common/scripts +LINKER_SCRIPT = $(LINKER_SCRIPT_PATH)/cmsdk_cm0.ld + +GNU_CC_FLAGS = -g -O3 -mthumb $(CPU_TYPE) + +ifeq ($(COMPILE_BIGEND),1) + # Big Endian + GNU_CC_FLAGS += -mbig-endian +endif + +# --------------------------------------------------------------------------------------- +all: all_$(TOOL_CHAIN) + +# --------------------------------------------------------------------------------------- +# DS-5 + +all_ds5 : $(TESTNAME).hex $(TESTNAME).lst + +$(TESTNAME).o : $(SOFTWARE_DIR)/common/validation/$(TESTNAME).c $(DEPS_LIST) + armcc $(ARM_CC_OPTIONS) $(CPU_TYPE) $< -o $@ + +$(SYSTEM_FILE).o : $(DEVICE_DIR)/Source/$(SYSTEM_FILE).c $(DEPS_LIST) + armcc $(ARM_CC_OPTIONS) $(CPU_TYPE) $< -o $@ + +retarget.o : $(SOFTWARE_DIR)/common/retarget/retarget.c $(DEPS_LIST) + armcc $(ARM_CC_OPTIONS) $(CPU_TYPE) $< -o $@ + +uart_stdout.o : $(SOFTWARE_DIR)/common/retarget/uart_stdout.c $(DEPS_LIST) + armcc $(ARM_CC_OPTIONS) $(CPU_TYPE) $< -o $@ + +$(STARTUP_FILE).o : $(STARTUP_DIR)/$(STARTUP_FILE).s $(DEPS_LIST) + armasm $(ARM_ASM_OPTIONS) $(CPU_TYPE) $< -o $@ + +$(TESTNAME).ELF : $(TESTNAME).o $(SYSTEM_FILE).o $(STARTUP_FILE).o retarget.o uart_stdout.o + armlink $(ARM_LINK_OPTIONS) -o $@ $(TESTNAME).o $(SYSTEM_FILE).o $(STARTUP_FILE).o retarget.o uart_stdout.o + +$(TESTNAME).hex : $(TESTNAME).ELF + fromelf --vhx --8x1 $< --output $@ + +$(TESTNAME).lst : $(TESTNAME).ELF makefile + fromelf -c -d -e -s $< --output $@ + +# --------------------------------------------------------------------------------------- +# gcc +all_gcc: + $(GNG_CC) $(GNU_CC_FLAGS) $(STARTUP_DIR)/$(STARTUP_FILE).s \ + $(SOFTWARE_DIR)/common/validation/$(TESTNAME).c \ + $(SOFTWARE_DIR)/common/retarget/retarget.c \ + $(SOFTWARE_DIR)/common/retarget/uart_stdout.c \ + $(DEVICE_DIR)/Source/$(SYSTEM_FILE).c \ + -I $(DEVICE_DIR)/Include -I $(CORE_DIR) \ + -I $(SOFTWARE_DIR)/common/retarget \ + -L $(LINKER_SCRIPT_PATH) \ + -D__STACK_SIZE=0x200 \ + -D__HEAP_SIZE=0x1000 \ + $(USER_DEFINE) -T $(LINKER_SCRIPT) -o $(TESTNAME).o + # Generate disassembly code + $(GNU_OBJDUMP) -S $(TESTNAME).o > $(TESTNAME).lst + # Generate binary file + $(GNU_OBJCOPY) -S $(TESTNAME).o -O binary $(TESTNAME).bin + # Generate hex file + $(GNU_OBJCOPY) -S $(TESTNAME).o -O verilog $(TESTNAME).hex + +# Note: +# If the version of object copy you are using does not support verilog hex file output, +# you can generate the hex file from binary file using the following command +# od -v -A n -t x1 --width=1 $(TESTNAME).bin > $(TESTNAME).hex + +# --------------------------------------------------------------------------------------- +# Keil MDK + +all_keil: + @echo "Please compile your project code and press ENTER when ready" + @read dummy + +# --------------------------------------------------------------------------------------- +# Binary + +all_bin: $(TESTNAME).bin + # Generate hex file from binary + od -v -A n -t x1 --width=1 $(TESTNAME).bin > $(TESTNAME).hex + +# --------------------------------------------------------------------------------------- +# Clean + +clean : + @rm -rf *.o + @if [ -e $(TESTNAME).hex ] ; then \ + rm -rf $(TESTNAME).hex ; \ + fi + @if [ -e $(TESTNAME).lst ] ; then \ + rm -rf $(TESTNAME).lst ; \ + fi + @if [ -e $(TESTNAME).ELF ] ; then \ + rm -rf $(TESTNAME).ELF ; \ + fi + @if [ -e $(TESTNAME).bin ] ; then \ + rm -rf $(TESTNAME).bin ; \ + fi + @rm -rf *.crf + @rm -rf *.plg + @rm -rf *.tra + @rm -rf *.htm + @rm -rf *.map + @rm -rf *.dep + @rm -rf *.d + @rm -rf *.lnp + @rm -rf *.bak + @rm -rf *.lst + @rm -rf *.axf + @rm -rf *.sct + @rm -rf *.__i + @rm -rf *._ia diff --git a/Cortex-M0/nanosoc/systems/mcu/testcodes/uart_tests/uart_tests_cm0.uvopt b/Cortex-M0/nanosoc/systems/mcu/testcodes/uart_tests/uart_tests_cm0.uvopt new file mode 100644 index 0000000..2ae0b81 --- /dev/null +++ b/Cortex-M0/nanosoc/systems/mcu/testcodes/uart_tests/uart_tests_cm0.uvopt @@ -0,0 +1,261 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no" ?> +<ProjectOpt xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="project_opt.xsd"> + + <SchemaVersion>1.0</SchemaVersion> + + <Header>### uVision Project, (C) Keil Software</Header> + + <Extensions> + <cExt>*.c</cExt> + <aExt>*.s*; *.src; *.a*</aExt> + <oExt>*.obj</oExt> + <lExt>*.lib</lExt> + <tExt>*.txt; *.h; *.inc</tExt> + <pExt>*.plm</pExt> + <CppX>*.cpp</CppX> + </Extensions> + + <DaveTm> + <dwLowDateTime>0</dwLowDateTime> + <dwHighDateTime>0</dwHighDateTime> + </DaveTm> + + <Target> + <TargetName>Debug</TargetName> + <ToolsetNumber>0x4</ToolsetNumber> + <ToolsetName>ARM-ADS</ToolsetName> + <TargetOption> + <CLKADS>50000000</CLKADS> + <OPTTT> + <gFlags>1</gFlags> + <BeepAtEnd>1</BeepAtEnd> + <RunSim>1</RunSim> + <RunTarget>0</RunTarget> + </OPTTT> + <OPTHX> + <HexSelection>1</HexSelection> + <FlashByte>65535</FlashByte> + <HexRangeLowAddress>0</HexRangeLowAddress> + <HexRangeHighAddress>0</HexRangeHighAddress> + <HexOffset>0</HexOffset> + </OPTHX> + <OPTLEX> + <PageWidth>79</PageWidth> + <PageLength>66</PageLength> + <TabStop>8</TabStop> + <ListingPath>.\</ListingPath> + </OPTLEX> + <ListingPage> + <CreateCListing>1</CreateCListing> + <CreateAListing>1</CreateAListing> + <CreateLListing>1</CreateLListing> + <CreateIListing>0</CreateIListing> + <AsmCond>1</AsmCond> + <AsmSymb>1</AsmSymb> + <AsmXref>0</AsmXref> + <CCond>1</CCond> + <CCode>0</CCode> + <CListInc>0</CListInc> + <CSymb>0</CSymb> + <LinkerCodeListing>0</LinkerCodeListing> + </ListingPage> + <OPTXL> + <LMap>1</LMap> + <LComments>1</LComments> + <LGenerateSymbols>1</LGenerateSymbols> + <LLibSym>1</LLibSym> + <LLines>1</LLines> + <LLocSym>1</LLocSym> + <LPubSym>1</LPubSym> + <LXref>0</LXref> + <LExpSel>0</LExpSel> + </OPTXL> + <OPTFL> + <tvExp>1</tvExp> + <tvExpOptDlg>0</tvExpOptDlg> + <IsCurrentTarget>1</IsCurrentTarget> + </OPTFL> + <CpuCode>255</CpuCode> + <DllOpt> + <SimDllName>SARMCM3.DLL</SimDllName> + <SimDllArguments></SimDllArguments> + <SimDlgDllName>DARMCM1.DLL</SimDlgDllName> + <SimDlgDllArguments></SimDlgDllArguments> + <TargetDllName>SARMCM3.DLL</TargetDllName> + <TargetDllArguments></TargetDllArguments> + <TargetDlgDllName>TARMCM1.DLL</TargetDlgDllName> + <TargetDlgDllArguments></TargetDlgDllArguments> + </DllOpt> + <DebugOpt> + <uSim>1</uSim> + <uTrg>0</uTrg> + <sLdApp>1</sLdApp> + <sGomain>1</sGomain> + <sRbreak>1</sRbreak> + <sRwatch>1</sRwatch> + <sRmem>1</sRmem> + <sRfunc>1</sRfunc> + <sRbox>1</sRbox> + <tLdApp>1</tLdApp> + <tGomain>0</tGomain> + <tRbreak>1</tRbreak> + <tRwatch>1</tRwatch> + <tRmem>1</tRmem> + <tRfunc>0</tRfunc> + <tRbox>1</tRbox> + <tRtrace>0</tRtrace> + <sRunDeb>0</sRunDeb> + <sLrtime>0</sLrtime> + <nTsel>-1</nTsel> + <sDll></sDll> + <sDllPa></sDllPa> + <sDlgDll></sDlgDll> + <sDlgPa></sDlgPa> + <sIfile></sIfile> + <tDll></tDll> + <tDllPa></tDllPa> + <tDlgDll></tDlgDll> + <tDlgPa></tDlgPa> + <tIfile></tIfile> + <pMon></pMon> + </DebugOpt> + <Breakpoint/> + <DebugFlag> + <trace>0</trace> + <periodic>1</periodic> + <aLwin>0</aLwin> + <aCover>0</aCover> + <aSer1>0</aSer1> + <aSer2>0</aSer2> + <aPa>0</aPa> + <viewmode>0</viewmode> + <vrSel>0</vrSel> + <aSym>0</aSym> + <aTbox>0</aTbox> + <AscS1>0</AscS1> + <AscS2>0</AscS2> + <AscS3>0</AscS3> + <aSer3>0</aSer3> + <eProf>0</eProf> + <aLa>0</aLa> + <aPa1>0</aPa1> + <AscS4>0</AscS4> + <aSer4>0</aSer4> + <StkLoc>0</StkLoc> + <TrcWin>0</TrcWin> + <newCpu>0</newCpu> + <uProt>0</uProt> + </DebugFlag> + <Tracepoint> + <THDelay>0</THDelay> + </Tracepoint> + <LintExecutable></LintExecutable> + <LintConfigFile></LintConfigFile> + </TargetOption> + </Target> + + <Group> + <GroupName>Startup</GroupName> + <tvExp>1</tvExp> + <tvExpOptDlg>0</tvExpOptDlg> + <cbSel>0</cbSel> + <RteFlg>0</RteFlg> + <File> + <GroupNumber>1</GroupNumber> + <FileNumber>1</FileNumber> + <FileType>2</FileType> + <tvExp>0</tvExp> + <Focus>0</Focus> + <ColumnNumber>0</ColumnNumber> + <tvExpOptDlg>0</tvExpOptDlg> + <TopLine>0</TopLine> + <CurrentLine>0</CurrentLine> + <bDave2>0</bDave2> + <PathWithFileName>..\..\..\..\software\cmsis\Device\ARM\CMSDK_CM0\Source\ARM\startup_CMSDK_CM0.s</PathWithFileName> + <FilenameWithoutPath>startup_CMSDK_CM0.s</FilenameWithoutPath> + <RteFlg>0</RteFlg> + <bShared>0</bShared> + </File> + </Group> + + <Group> + <GroupName>Application</GroupName> + <tvExp>1</tvExp> + <tvExpOptDlg>0</tvExpOptDlg> + <cbSel>0</cbSel> + <RteFlg>0</RteFlg> + <File> + <GroupNumber>2</GroupNumber> + <FileNumber>2</FileNumber> + <FileType>1</FileType> + <tvExp>0</tvExp> + <Focus>0</Focus> + <ColumnNumber>0</ColumnNumber> + <tvExpOptDlg>0</tvExpOptDlg> + <TopLine>0</TopLine> + <CurrentLine>0</CurrentLine> + <bDave2>0</bDave2> + <PathWithFileName>..\..\..\..\software\common\retarget\uart_stdout.c</PathWithFileName> + <FilenameWithoutPath>uart_stdout.c</FilenameWithoutPath> + <RteFlg>0</RteFlg> + <bShared>0</bShared> + </File> + <File> + <GroupNumber>2</GroupNumber> + <FileNumber>3</FileNumber> + <FileType>1</FileType> + <tvExp>0</tvExp> + <Focus>0</Focus> + <ColumnNumber>0</ColumnNumber> + <tvExpOptDlg>0</tvExpOptDlg> + <TopLine>0</TopLine> + <CurrentLine>0</CurrentLine> + <bDave2>0</bDave2> + <PathWithFileName>..\..\..\..\software\common\retarget\retarget.c</PathWithFileName> + <FilenameWithoutPath>retarget.c</FilenameWithoutPath> + <RteFlg>0</RteFlg> + <bShared>0</bShared> + </File> + <File> + <GroupNumber>2</GroupNumber> + <FileNumber>4</FileNumber> + <FileType>1</FileType> + <tvExp>0</tvExp> + <Focus>0</Focus> + <ColumnNumber>0</ColumnNumber> + <tvExpOptDlg>0</tvExpOptDlg> + <TopLine>0</TopLine> + <CurrentLine>0</CurrentLine> + <bDave2>0</bDave2> + <PathWithFileName>..\..\..\..\software\common\validation\uart_tests.c</PathWithFileName> + <FilenameWithoutPath>uart_tests.c</FilenameWithoutPath> + <RteFlg>0</RteFlg> + <bShared>0</bShared> + </File> + </Group> + + <Group> + <GroupName>System</GroupName> + <tvExp>1</tvExp> + <tvExpOptDlg>0</tvExpOptDlg> + <cbSel>0</cbSel> + <RteFlg>0</RteFlg> + <File> + <GroupNumber>3</GroupNumber> + <FileNumber>5</FileNumber> + <FileType>1</FileType> + <tvExp>0</tvExp> + <Focus>0</Focus> + <ColumnNumber>0</ColumnNumber> + <tvExpOptDlg>0</tvExpOptDlg> + <TopLine>0</TopLine> + <CurrentLine>0</CurrentLine> + <bDave2>0</bDave2> + <PathWithFileName>..\..\..\..\software\cmsis\Device\ARM\CMSDK_CM0\Source\system_CMSDK_CM0.c</PathWithFileName> + <FilenameWithoutPath>system_CMSDK_CM0.c</FilenameWithoutPath> + <RteFlg>0</RteFlg> + <bShared>0</bShared> + </File> + </Group> + +</ProjectOpt> diff --git a/Cortex-M0/nanosoc/systems/mcu/testcodes/uart_tests/uart_tests_cm0.uvproj b/Cortex-M0/nanosoc/systems/mcu/testcodes/uart_tests/uart_tests_cm0.uvproj new file mode 100644 index 0000000..627ff29 --- /dev/null +++ b/Cortex-M0/nanosoc/systems/mcu/testcodes/uart_tests/uart_tests_cm0.uvproj @@ -0,0 +1,435 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no" ?> +<Project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="project_proj.xsd"> + + <SchemaVersion>1.1</SchemaVersion> + + <Header>### uVision Project, (C) Keil Software</Header> + + <Targets> + <Target> + <TargetName>Debug</TargetName> + <ToolsetNumber>0x4</ToolsetNumber> + <ToolsetName>ARM-ADS</ToolsetName> + <TargetOption> + <TargetCommonOption> + <Device>Cortex-M0</Device> + <Vendor>ARM</Vendor> + <Cpu>CLOCK(12000000) CPUTYPE("Cortex-M0") ESEL ELITTLE</Cpu> + <FlashUtilSpec></FlashUtilSpec> + <StartupFile></StartupFile> + <FlashDriverDll></FlashDriverDll> + <DeviceId>4803</DeviceId> + <RegisterFile></RegisterFile> + <MemoryEnv></MemoryEnv> + <Cmp></Cmp> + <Asm></Asm> + <Linker></Linker> + <OHString></OHString> + <InfinionOptionDll></InfinionOptionDll> + <SLE66CMisc></SLE66CMisc> + <SLE66AMisc></SLE66AMisc> + <SLE66LinkerMisc></SLE66LinkerMisc> + <SFDFile></SFDFile> + <UseEnv>0</UseEnv> + <BinPath></BinPath> + <IncludePath></IncludePath> + <LibPath></LibPath> + <RegisterFilePath></RegisterFilePath> + <DBRegisterFilePath></DBRegisterFilePath> + <TargetStatus> + <Error>0</Error> + <ExitCodeStop>0</ExitCodeStop> + <ButtonStop>0</ButtonStop> + <NotGenerated>0</NotGenerated> + <InvalidFlash>1</InvalidFlash> + </TargetStatus> + <OutputDirectory>.\</OutputDirectory> + <OutputName>uart_tests</OutputName> + <CreateExecutable>1</CreateExecutable> + <CreateLib>0</CreateLib> + <CreateHexFile>0</CreateHexFile> + <DebugInformation>1</DebugInformation> + <BrowseInformation>1</BrowseInformation> + <ListingPath>.\</ListingPath> + <HexFormatSelection>1</HexFormatSelection> + <Merge32K>0</Merge32K> + <CreateBatchFile>0</CreateBatchFile> + <BeforeCompile> + <RunUserProg1>0</RunUserProg1> + <RunUserProg2>0</RunUserProg2> + <UserProg1Name></UserProg1Name> + <UserProg2Name></UserProg2Name> + <UserProg1Dos16Mode>0</UserProg1Dos16Mode> + <UserProg2Dos16Mode>0</UserProg2Dos16Mode> + <nStopU1X>0</nStopU1X> + <nStopU2X>0</nStopU2X> + </BeforeCompile> + <BeforeMake> + <RunUserProg1>0</RunUserProg1> + <RunUserProg2>0</RunUserProg2> + <UserProg1Name></UserProg1Name> + <UserProg2Name></UserProg2Name> + <UserProg1Dos16Mode>0</UserProg1Dos16Mode> + <UserProg2Dos16Mode>0</UserProg2Dos16Mode> + </BeforeMake> + <AfterMake> + <RunUserProg1>1</RunUserProg1> + <RunUserProg2>0</RunUserProg2> + <UserProg1Name>$K\ARM\ARMCC\BIN\fromelf.exe #L --vhx --8x1 --output uart_tests.hex</UserProg1Name> + <UserProg2Name></UserProg2Name> + <UserProg1Dos16Mode>0</UserProg1Dos16Mode> + <UserProg2Dos16Mode>0</UserProg2Dos16Mode> + </AfterMake> + <SelectedForBatchBuild>0</SelectedForBatchBuild> + <SVCSIdString></SVCSIdString> + </TargetCommonOption> + <CommonProperty> + <UseCPPCompiler>0</UseCPPCompiler> + <RVCTCodeConst>0</RVCTCodeConst> + <RVCTZI>0</RVCTZI> + <RVCTOtherData>0</RVCTOtherData> + <ModuleSelection>0</ModuleSelection> + <IncludeInBuild>1</IncludeInBuild> + <AlwaysBuild>0</AlwaysBuild> + <GenerateAssemblyFile>0</GenerateAssemblyFile> + <AssembleAssemblyFile>0</AssembleAssemblyFile> + <PublicsOnly>0</PublicsOnly> + <StopOnExitCode>3</StopOnExitCode> + <CustomArgument></CustomArgument> + <IncludeLibraryModules></IncludeLibraryModules> + </CommonProperty> + <DllOption> + <SimDllName>SARMCM3.DLL</SimDllName> + <SimDllArguments></SimDllArguments> + <SimDlgDll>DARMCM1.DLL</SimDlgDll> + <SimDlgDllArguments></SimDlgDllArguments> + <TargetDllName>SARMCM3.DLL</TargetDllName> + <TargetDllArguments></TargetDllArguments> + <TargetDlgDll>TARMCM1.DLL</TargetDlgDll> + <TargetDlgDllArguments></TargetDlgDllArguments> + </DllOption> + <DebugOption> + <OPTHX> + <HexSelection>1</HexSelection> + <HexRangeLowAddress>0</HexRangeLowAddress> + <HexRangeHighAddress>0</HexRangeHighAddress> + <HexOffset>0</HexOffset> + <Oh166RecLen>16</Oh166RecLen> + </OPTHX> + <Simulator> + <UseSimulator>1</UseSimulator> + <LoadApplicationAtStartup>1</LoadApplicationAtStartup> + <RunToMain>1</RunToMain> + <RestoreBreakpoints>1</RestoreBreakpoints> + <RestoreWatchpoints>1</RestoreWatchpoints> + <RestoreMemoryDisplay>1</RestoreMemoryDisplay> + <RestoreFunctions>1</RestoreFunctions> + <RestoreToolbox>1</RestoreToolbox> + <LimitSpeedToRealTime>0</LimitSpeedToRealTime> + </Simulator> + <Target> + <UseTarget>0</UseTarget> + <LoadApplicationAtStartup>1</LoadApplicationAtStartup> + <RunToMain>0</RunToMain> + <RestoreBreakpoints>1</RestoreBreakpoints> + <RestoreWatchpoints>1</RestoreWatchpoints> + <RestoreMemoryDisplay>1</RestoreMemoryDisplay> + <RestoreFunctions>0</RestoreFunctions> + <RestoreToolbox>1</RestoreToolbox> + <RestoreTracepoints>0</RestoreTracepoints> + </Target> + <RunDebugAfterBuild>0</RunDebugAfterBuild> + <TargetSelection>-1</TargetSelection> + <SimDlls> + <CpuDll></CpuDll> + <CpuDllArguments></CpuDllArguments> + <PeripheralDll></PeripheralDll> + <PeripheralDllArguments></PeripheralDllArguments> + <InitializationFile></InitializationFile> + </SimDlls> + <TargetDlls> + <CpuDll></CpuDll> + <CpuDllArguments></CpuDllArguments> + <PeripheralDll></PeripheralDll> + <PeripheralDllArguments></PeripheralDllArguments> + <InitializationFile></InitializationFile> + <Driver></Driver> + </TargetDlls> + </DebugOption> + <Utilities> + <Flash1> + <UseTargetDll>0</UseTargetDll> + <UseExternalTool>0</UseExternalTool> + <RunIndependent>0</RunIndependent> + <UpdateFlashBeforeDebugging>0</UpdateFlashBeforeDebugging> + <Capability>0</Capability> + <DriverSelection>-1</DriverSelection> + </Flash1> + <Flash2></Flash2> + <Flash3></Flash3> + <Flash4></Flash4> + </Utilities> + <TargetArmAds> + <ArmAdsMisc> + <GenerateListings>0</GenerateListings> + <asHll>1</asHll> + <asAsm>1</asAsm> + <asMacX>1</asMacX> + <asSyms>1</asSyms> + <asFals>1</asFals> + <asDbgD>1</asDbgD> + <asForm>1</asForm> + <ldLst>0</ldLst> + <ldmm>1</ldmm> + <ldXref>1</ldXref> + <BigEnd>0</BigEnd> + <AdsALst>1</AdsALst> + <AdsACrf>1</AdsACrf> + <AdsANop>0</AdsANop> + <AdsANot>0</AdsANot> + <AdsLLst>1</AdsLLst> + <AdsLmap>1</AdsLmap> + <AdsLcgr>1</AdsLcgr> + <AdsLsym>1</AdsLsym> + <AdsLszi>1</AdsLszi> + <AdsLtoi>1</AdsLtoi> + <AdsLsun>1</AdsLsun> + <AdsLven>1</AdsLven> + <AdsLsxf>1</AdsLsxf> + <RvctClst>0</RvctClst> + <GenPPlst>0</GenPPlst> + <AdsCpuType>"Cortex-M0"</AdsCpuType> + <RvctDeviceName></RvctDeviceName> + <mOS>0</mOS> + <uocRom>0</uocRom> + <uocRam>0</uocRam> + <hadIROM>0</hadIROM> + <hadIRAM>0</hadIRAM> + <hadXRAM>0</hadXRAM> + <uocXRam>0</uocXRam> + <RvdsVP>0</RvdsVP> + <hadIRAM2>0</hadIRAM2> + <hadIROM2>0</hadIROM2> + <StupSel>1</StupSel> + <useUlib>0</useUlib> + <EndSel>1</EndSel> + <uLtcg>0</uLtcg> + <RoSelD>0</RoSelD> + <RwSelD>5</RwSelD> + <CodeSel>0</CodeSel> + <OptFeed>0</OptFeed> + <NoZi1>0</NoZi1> + <NoZi2>0</NoZi2> + <NoZi3>0</NoZi3> + <NoZi4>0</NoZi4> + <NoZi5>0</NoZi5> + <Ro1Chk>1</Ro1Chk> + <Ro2Chk>0</Ro2Chk> + <Ro3Chk>0</Ro3Chk> + <Ir1Chk>0</Ir1Chk> + <Ir2Chk>0</Ir2Chk> + <Ra1Chk>1</Ra1Chk> + <Ra2Chk>0</Ra2Chk> + <Ra3Chk>0</Ra3Chk> + <Im1Chk>0</Im1Chk> + <Im2Chk>0</Im2Chk> + <OnChipMemories> + <Ocm1> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </Ocm1> + <Ocm2> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </Ocm2> + <Ocm3> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </Ocm3> + <Ocm4> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </Ocm4> + <Ocm5> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </Ocm5> + <Ocm6> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </Ocm6> + <IRAM> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </IRAM> + <IROM> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </IROM> + <XRAM> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </XRAM> + <OCR_RVCT1> + <Type>1</Type> + <StartAddress>0x0</StartAddress> + <Size>0x10000</Size> + </OCR_RVCT1> + <OCR_RVCT2> + <Type>1</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </OCR_RVCT2> + <OCR_RVCT3> + <Type>1</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </OCR_RVCT3> + <OCR_RVCT4> + <Type>1</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </OCR_RVCT4> + <OCR_RVCT5> + <Type>1</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </OCR_RVCT5> + <OCR_RVCT6> + <Type>0</Type> + <StartAddress>0x20000000</StartAddress> + <Size>0x10000</Size> + </OCR_RVCT6> + <OCR_RVCT7> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </OCR_RVCT7> + <OCR_RVCT8> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </OCR_RVCT8> + <OCR_RVCT9> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </OCR_RVCT9> + <OCR_RVCT10> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </OCR_RVCT10> + </OnChipMemories> + <RvctStartVector></RvctStartVector> + </ArmAdsMisc> + <Cads> + <interw>1</interw> + <Optim>4</Optim> + <oTime>0</oTime> + <SplitLS>0</SplitLS> + <OneElfS>0</OneElfS> + <Strict>0</Strict> + <EnumInt>0</EnumInt> + <PlainCh>0</PlainCh> + <Ropi>0</Ropi> + <Rwpi>0</Rwpi> + <wLevel>0</wLevel> + <uThumb>0</uThumb> + <uSurpInc>0</uSurpInc> + <VariousControls> + <MiscControls></MiscControls> + <Define>CORTEX_M0</Define> + <Undefine></Undefine> + <IncludePath>..\..\..\..\software\cmsis\CMSIS\Include; ..\..\..\..\software\cmsis\Device\ARM\CMSDK_CM0\Include; ..\..\..\..\software\common\retarget</IncludePath> + </VariousControls> + </Cads> + <Aads> + <interw>1</interw> + <Ropi>0</Ropi> + <Rwpi>0</Rwpi> + <thumb>0</thumb> + <SplitLS>0</SplitLS> + <SwStkChk>0</SwStkChk> + <NoWarn>0</NoWarn> + <uSurpInc>0</uSurpInc> + <VariousControls> + <MiscControls></MiscControls> + <Define></Define> + <Undefine></Undefine> + <IncludePath></IncludePath> + </VariousControls> + </Aads> + <LDads> + <umfTarg>1</umfTarg> + <Ropi>0</Ropi> + <Rwpi>0</Rwpi> + <noStLib>0</noStLib> + <RepFail>1</RepFail> + <useFile>0</useFile> + <TextAddressRange>0x00000000</TextAddressRange> + <DataAddressRange>0x00000000</DataAddressRange> + <ScatterFile></ScatterFile> + <IncludeLibs></IncludeLibs> + <IncludeLibsPath></IncludeLibsPath> + <Misc></Misc> + <LinkerInputFile></LinkerInputFile> + <DisabledWarnings></DisabledWarnings> + </LDads> + </TargetArmAds> + </TargetOption> + <Groups> + <Group> + <GroupName>Startup</GroupName> + <Files> + <File> + <FileName>startup_CMSDK_CM0.s</FileName> + <FileType>2</FileType> + <FilePath>..\..\..\..\software\cmsis\Device\ARM\CMSDK_CM0\Source\ARM\startup_CMSDK_CM0.s</FilePath> + </File> + </Files> + </Group> + <Group> + <GroupName>Application</GroupName> + <Files> + <File> + <FileName>uart_stdout.c</FileName> + <FileType>1</FileType> + <FilePath>..\..\..\..\software\common\retarget\uart_stdout.c</FilePath> + </File> + <File> + <FileName>retarget.c</FileName> + <FileType>1</FileType> + <FilePath>..\..\..\..\software\common\retarget\retarget.c</FilePath> + </File> + <File> + <FileName>uart_tests.c</FileName> + <FileType>1</FileType> + <FilePath>..\..\..\..\software\common\validation\uart_tests.c</FilePath> + </File> + </Files> + </Group> + <Group> + <GroupName>System</GroupName> + <Files> + <File> + <FileName>system_CMSDK_CM0.c</FileName> + <FileType>1</FileType> + <FilePath>..\..\..\..\software\cmsis\Device\ARM\CMSDK_CM0\Source\system_CMSDK_CM0.c</FilePath> + </File> + </Files> + </Group> + </Groups> + </Target> + </Targets> + +</Project> diff --git a/Cortex-M0/nanosoc/systems/mcu/testcodes/uart_tests/uart_tests_cm0p.uvopt b/Cortex-M0/nanosoc/systems/mcu/testcodes/uart_tests/uart_tests_cm0p.uvopt new file mode 100644 index 0000000..583a77a --- /dev/null +++ b/Cortex-M0/nanosoc/systems/mcu/testcodes/uart_tests/uart_tests_cm0p.uvopt @@ -0,0 +1,244 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no" ?> +<ProjectOpt xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="project_opt.xsd"> + + <SchemaVersion>1.0</SchemaVersion> + + <Header>### uVision Project, (C) Keil Software</Header> + + <Extensions> + <cExt>*.c</cExt> + <aExt>*.s*; *.src; *.a*</aExt> + <oExt>*.obj</oExt> + <lExt>*.lib</lExt> + <tExt>*.txt; *.h; *.inc</tExt> + <pExt>*.plm</pExt> + <CppX>*.cpp</CppX> + </Extensions> + + <DaveTm> + <dwLowDateTime>0</dwLowDateTime> + <dwHighDateTime>0</dwHighDateTime> + </DaveTm> + + <Target> + <TargetName>Debug</TargetName> + <ToolsetNumber>0x4</ToolsetNumber> + <ToolsetName>ARM-ADS</ToolsetName> + <TargetOption> + <CLKADS>50000000</CLKADS> + <OPTTT> + <gFlags>1</gFlags> + <BeepAtEnd>1</BeepAtEnd> + <RunSim>1</RunSim> + <RunTarget>0</RunTarget> + </OPTTT> + <OPTHX> + <HexSelection>1</HexSelection> + <FlashByte>65535</FlashByte> + <HexRangeLowAddress>0</HexRangeLowAddress> + <HexRangeHighAddress>0</HexRangeHighAddress> + <HexOffset>0</HexOffset> + </OPTHX> + <OPTLEX> + <PageWidth>79</PageWidth> + <PageLength>66</PageLength> + <TabStop>8</TabStop> + <ListingPath>.\</ListingPath> + </OPTLEX> + <ListingPage> + <CreateCListing>1</CreateCListing> + <CreateAListing>1</CreateAListing> + <CreateLListing>1</CreateLListing> + <CreateIListing>0</CreateIListing> + <AsmCond>1</AsmCond> + <AsmSymb>1</AsmSymb> + <AsmXref>0</AsmXref> + <CCond>1</CCond> + <CCode>0</CCode> + <CListInc>0</CListInc> + <CSymb>0</CSymb> + <LinkerCodeListing>0</LinkerCodeListing> + </ListingPage> + <OPTXL> + <LMap>1</LMap> + <LComments>1</LComments> + <LGenerateSymbols>1</LGenerateSymbols> + <LLibSym>1</LLibSym> + <LLines>1</LLines> + <LLocSym>1</LLocSym> + <LPubSym>1</LPubSym> + <LXref>0</LXref> + <LExpSel>0</LExpSel> + </OPTXL> + <OPTFL> + <tvExp>1</tvExp> + <tvExpOptDlg>0</tvExpOptDlg> + <IsCurrentTarget>1</IsCurrentTarget> + </OPTFL> + <CpuCode>255</CpuCode> + <DllOpt> + <SimDllName>SARMCM3.DLL</SimDllName> + <SimDllArguments></SimDllArguments> + <SimDlgDllName>DARMCM1.DLL</SimDlgDllName> + <SimDlgDllArguments></SimDlgDllArguments> + <TargetDllName>SARMCM3.DLL</TargetDllName> + <TargetDllArguments></TargetDllArguments> + <TargetDlgDllName>TARMCM1.DLL</TargetDlgDllName> + <TargetDlgDllArguments></TargetDlgDllArguments> + </DllOpt> + <DebugOpt> + <uSim>1</uSim> + <uTrg>0</uTrg> + <sLdApp>1</sLdApp> + <sGomain>1</sGomain> + <sRbreak>1</sRbreak> + <sRwatch>1</sRwatch> + <sRmem>1</sRmem> + <sRfunc>1</sRfunc> + <sRbox>1</sRbox> + <tLdApp>1</tLdApp> + <tGomain>0</tGomain> + <tRbreak>1</tRbreak> + <tRwatch>1</tRwatch> + <tRmem>1</tRmem> + <tRfunc>0</tRfunc> + <tRbox>1</tRbox> + <sRunDeb>0</sRunDeb> + <sLrtime>0</sLrtime> + <nTsel>-1</nTsel> + <sDll></sDll> + <sDllPa></sDllPa> + <sDlgDll></sDlgDll> + <sDlgPa></sDlgPa> + <sIfile></sIfile> + <tDll></tDll> + <tDllPa></tDllPa> + <tDlgDll></tDlgDll> + <tDlgPa></tDlgPa> + <tIfile></tIfile> + <pMon></pMon> + </DebugOpt> + <Breakpoint/> + <DebugFlag> + <trace>0</trace> + <periodic>1</periodic> + <aLwin>0</aLwin> + <aCover>0</aCover> + <aSer1>0</aSer1> + <aSer2>0</aSer2> + <aPa>0</aPa> + <viewmode>0</viewmode> + <vrSel>0</vrSel> + <aSym>0</aSym> + <aTbox>0</aTbox> + <AscS1>0</AscS1> + <AscS2>0</AscS2> + <AscS3>0</AscS3> + <aSer3>0</aSer3> + <eProf>0</eProf> + <aLa>0</aLa> + <aPa1>0</aPa1> + <AscS4>0</AscS4> + <aSer4>0</aSer4> + <StkLoc>0</StkLoc> + <TrcWin>0</TrcWin> + <newCpu>0</newCpu> + <uProt>0</uProt> + </DebugFlag> + <LintExecutable></LintExecutable> + <LintConfigFile></LintConfigFile> + </TargetOption> + </Target> + + <Group> + <GroupName>Startup</GroupName> + <tvExp>1</tvExp> + <tvExpOptDlg>0</tvExpOptDlg> + <cbSel>0</cbSel> + <File> + <GroupNumber>1</GroupNumber> + <FileNumber>1</FileNumber> + <FileType>2</FileType> + <tvExp>0</tvExp> + <Focus>0</Focus> + <ColumnNumber>0</ColumnNumber> + <tvExpOptDlg>0</tvExpOptDlg> + <TopLine>0</TopLine> + <CurrentLine>0</CurrentLine> + <bDave2>0</bDave2> + <PathWithFileName>..\..\..\..\software\cmsis\Device\ARM\CMSDK_CM0plus\Source\ARM\startup_CMSDK_CM0plus.s</PathWithFileName> + <FilenameWithoutPath>startup_CMSDK_CM0plus.s</FilenameWithoutPath> + </File> + </Group> + + <Group> + <GroupName>Application</GroupName> + <tvExp>1</tvExp> + <tvExpOptDlg>0</tvExpOptDlg> + <cbSel>0</cbSel> + <File> + <GroupNumber>2</GroupNumber> + <FileNumber>2</FileNumber> + <FileType>1</FileType> + <tvExp>0</tvExp> + <Focus>0</Focus> + <ColumnNumber>0</ColumnNumber> + <tvExpOptDlg>0</tvExpOptDlg> + <TopLine>0</TopLine> + <CurrentLine>0</CurrentLine> + <bDave2>0</bDave2> + <PathWithFileName>..\..\..\..\software\common\retarget\uart_stdout.c</PathWithFileName> + <FilenameWithoutPath>uart_stdout.c</FilenameWithoutPath> + </File> + <File> + <GroupNumber>2</GroupNumber> + <FileNumber>3</FileNumber> + <FileType>1</FileType> + <tvExp>0</tvExp> + <Focus>0</Focus> + <ColumnNumber>0</ColumnNumber> + <tvExpOptDlg>0</tvExpOptDlg> + <TopLine>0</TopLine> + <CurrentLine>0</CurrentLine> + <bDave2>0</bDave2> + <PathWithFileName>..\..\..\..\software\common\retarget\retarget.c</PathWithFileName> + <FilenameWithoutPath>retarget.c</FilenameWithoutPath> + </File> + <File> + <GroupNumber>2</GroupNumber> + <FileNumber>4</FileNumber> + <FileType>1</FileType> + <tvExp>0</tvExp> + <Focus>0</Focus> + <ColumnNumber>0</ColumnNumber> + <tvExpOptDlg>0</tvExpOptDlg> + <TopLine>0</TopLine> + <CurrentLine>0</CurrentLine> + <bDave2>0</bDave2> + <PathWithFileName>..\..\..\..\software\common\validation\uart_tests.c</PathWithFileName> + <FilenameWithoutPath>uart_tests.c</FilenameWithoutPath> + </File> + </Group> + + <Group> + <GroupName>System</GroupName> + <tvExp>1</tvExp> + <tvExpOptDlg>0</tvExpOptDlg> + <cbSel>0</cbSel> + <File> + <GroupNumber>3</GroupNumber> + <FileNumber>5</FileNumber> + <FileType>1</FileType> + <tvExp>0</tvExp> + <Focus>0</Focus> + <ColumnNumber>0</ColumnNumber> + <tvExpOptDlg>0</tvExpOptDlg> + <TopLine>0</TopLine> + <CurrentLine>0</CurrentLine> + <bDave2>0</bDave2> + <PathWithFileName>..\..\..\..\software\cmsis\Device\ARM\CMSDK_CM0plus\Source\system_CMSDK_CM0plus.c</PathWithFileName> + <FilenameWithoutPath>system_CMSDK_CM0plus.c</FilenameWithoutPath> + </File> + </Group> + +</ProjectOpt> diff --git a/Cortex-M0/nanosoc/systems/mcu/testcodes/uart_tests/uart_tests_cm0p.uvproj b/Cortex-M0/nanosoc/systems/mcu/testcodes/uart_tests/uart_tests_cm0p.uvproj new file mode 100644 index 0000000..cbe308e --- /dev/null +++ b/Cortex-M0/nanosoc/systems/mcu/testcodes/uart_tests/uart_tests_cm0p.uvproj @@ -0,0 +1,432 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no" ?> +<Project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="project_proj.xsd"> + + <SchemaVersion>1.1</SchemaVersion> + + <Header>### uVision Project, (C) Keil Software</Header> + + <Targets> + <Target> + <TargetName>Debug</TargetName> + <ToolsetNumber>0x4</ToolsetNumber> + <ToolsetName>ARM-ADS</ToolsetName> + <TargetOption> + <TargetCommonOption> + <Device>Cortex-M0+</Device> + <Vendor>ARM</Vendor> + <Cpu>CLOCK(12000000) CPUTYPE("Cortex-M0+") ESEL ELITTLE</Cpu> + <FlashUtilSpec></FlashUtilSpec> + <StartupFile></StartupFile> + <FlashDriverDll></FlashDriverDll> + <DeviceId>6268</DeviceId> + <RegisterFile></RegisterFile> + <MemoryEnv></MemoryEnv> + <Cmp></Cmp> + <Asm></Asm> + <Linker></Linker> + <OHString></OHString> + <InfinionOptionDll></InfinionOptionDll> + <SLE66CMisc></SLE66CMisc> + <SLE66AMisc></SLE66AMisc> + <SLE66LinkerMisc></SLE66LinkerMisc> + <SFDFile></SFDFile> + <UseEnv>0</UseEnv> + <BinPath></BinPath> + <IncludePath></IncludePath> + <LibPath></LibPath> + <RegisterFilePath></RegisterFilePath> + <DBRegisterFilePath></DBRegisterFilePath> + <TargetStatus> + <Error>0</Error> + <ExitCodeStop>0</ExitCodeStop> + <ButtonStop>0</ButtonStop> + <NotGenerated>0</NotGenerated> + <InvalidFlash>1</InvalidFlash> + </TargetStatus> + <OutputDirectory>.\</OutputDirectory> + <OutputName>uart_tests</OutputName> + <CreateExecutable>1</CreateExecutable> + <CreateLib>0</CreateLib> + <CreateHexFile>0</CreateHexFile> + <DebugInformation>1</DebugInformation> + <BrowseInformation>1</BrowseInformation> + <ListingPath>.\</ListingPath> + <HexFormatSelection>1</HexFormatSelection> + <Merge32K>0</Merge32K> + <CreateBatchFile>0</CreateBatchFile> + <BeforeCompile> + <RunUserProg1>0</RunUserProg1> + <RunUserProg2>0</RunUserProg2> + <UserProg1Name></UserProg1Name> + <UserProg2Name></UserProg2Name> + <UserProg1Dos16Mode>0</UserProg1Dos16Mode> + <UserProg2Dos16Mode>0</UserProg2Dos16Mode> + <nStopU1X>0</nStopU1X> + <nStopU2X>0</nStopU2X> + </BeforeCompile> + <BeforeMake> + <RunUserProg1>0</RunUserProg1> + <RunUserProg2>0</RunUserProg2> + <UserProg1Name></UserProg1Name> + <UserProg2Name></UserProg2Name> + <UserProg1Dos16Mode>0</UserProg1Dos16Mode> + <UserProg2Dos16Mode>0</UserProg2Dos16Mode> + </BeforeMake> + <AfterMake> + <RunUserProg1>1</RunUserProg1> + <RunUserProg2>0</RunUserProg2> + <UserProg1Name>$K\ARM\ARMCC\BIN\fromelf.exe #L --vhx --8x1 --output uart_tests.hex</UserProg1Name> + <UserProg2Name></UserProg2Name> + <UserProg1Dos16Mode>0</UserProg1Dos16Mode> + <UserProg2Dos16Mode>0</UserProg2Dos16Mode> + </AfterMake> + <SelectedForBatchBuild>0</SelectedForBatchBuild> + <SVCSIdString></SVCSIdString> + </TargetCommonOption> + <CommonProperty> + <UseCPPCompiler>0</UseCPPCompiler> + <RVCTCodeConst>0</RVCTCodeConst> + <RVCTZI>0</RVCTZI> + <RVCTOtherData>0</RVCTOtherData> + <ModuleSelection>0</ModuleSelection> + <IncludeInBuild>1</IncludeInBuild> + <AlwaysBuild>0</AlwaysBuild> + <GenerateAssemblyFile>0</GenerateAssemblyFile> + <AssembleAssemblyFile>0</AssembleAssemblyFile> + <PublicsOnly>0</PublicsOnly> + <StopOnExitCode>3</StopOnExitCode> + <CustomArgument></CustomArgument> + <IncludeLibraryModules></IncludeLibraryModules> + </CommonProperty> + <DllOption> + <SimDllName>SARMCM3.DLL</SimDllName> + <SimDllArguments></SimDllArguments> + <SimDlgDll>DARMCM1.DLL</SimDlgDll> + <SimDlgDllArguments></SimDlgDllArguments> + <TargetDllName>SARMCM3.DLL</TargetDllName> + <TargetDllArguments></TargetDllArguments> + <TargetDlgDll>TARMCM1.DLL</TargetDlgDll> + <TargetDlgDllArguments></TargetDlgDllArguments> + </DllOption> + <DebugOption> + <OPTHX> + <HexSelection>1</HexSelection> + <HexRangeLowAddress>0</HexRangeLowAddress> + <HexRangeHighAddress>0</HexRangeHighAddress> + <HexOffset>0</HexOffset> + <Oh166RecLen>16</Oh166RecLen> + </OPTHX> + <Simulator> + <UseSimulator>1</UseSimulator> + <LoadApplicationAtStartup>1</LoadApplicationAtStartup> + <RunToMain>1</RunToMain> + <RestoreBreakpoints>1</RestoreBreakpoints> + <RestoreWatchpoints>1</RestoreWatchpoints> + <RestoreMemoryDisplay>1</RestoreMemoryDisplay> + <RestoreFunctions>1</RestoreFunctions> + <RestoreToolbox>1</RestoreToolbox> + <LimitSpeedToRealTime>0</LimitSpeedToRealTime> + </Simulator> + <Target> + <UseTarget>0</UseTarget> + <LoadApplicationAtStartup>1</LoadApplicationAtStartup> + <RunToMain>0</RunToMain> + <RestoreBreakpoints>1</RestoreBreakpoints> + <RestoreWatchpoints>1</RestoreWatchpoints> + <RestoreMemoryDisplay>1</RestoreMemoryDisplay> + <RestoreFunctions>0</RestoreFunctions> + <RestoreToolbox>1</RestoreToolbox> + </Target> + <RunDebugAfterBuild>0</RunDebugAfterBuild> + <TargetSelection>-1</TargetSelection> + <SimDlls> + <CpuDll></CpuDll> + <CpuDllArguments></CpuDllArguments> + <PeripheralDll></PeripheralDll> + <PeripheralDllArguments></PeripheralDllArguments> + <InitializationFile></InitializationFile> + </SimDlls> + <TargetDlls> + <CpuDll></CpuDll> + <CpuDllArguments></CpuDllArguments> + <PeripheralDll></PeripheralDll> + <PeripheralDllArguments></PeripheralDllArguments> + <InitializationFile></InitializationFile> + <Driver></Driver> + </TargetDlls> + </DebugOption> + <Utilities> + <Flash1> + <UseTargetDll>0</UseTargetDll> + <UseExternalTool>0</UseExternalTool> + <RunIndependent>0</RunIndependent> + <UpdateFlashBeforeDebugging>0</UpdateFlashBeforeDebugging> + <Capability>0</Capability> + <DriverSelection>-1</DriverSelection> + </Flash1> + <Flash2></Flash2> + <Flash3></Flash3> + <Flash4></Flash4> + </Utilities> + <TargetArmAds> + <ArmAdsMisc> + <GenerateListings>0</GenerateListings> + <asHll>1</asHll> + <asAsm>1</asAsm> + <asMacX>1</asMacX> + <asSyms>1</asSyms> + <asFals>1</asFals> + <asDbgD>1</asDbgD> + <asForm>1</asForm> + <ldLst>0</ldLst> + <ldmm>1</ldmm> + <ldXref>1</ldXref> + <BigEnd>0</BigEnd> + <AdsALst>1</AdsALst> + <AdsACrf>1</AdsACrf> + <AdsANop>0</AdsANop> + <AdsANot>0</AdsANot> + <AdsLLst>1</AdsLLst> + <AdsLmap>1</AdsLmap> + <AdsLcgr>1</AdsLcgr> + <AdsLsym>1</AdsLsym> + <AdsLszi>1</AdsLszi> + <AdsLtoi>1</AdsLtoi> + <AdsLsun>1</AdsLsun> + <AdsLven>1</AdsLven> + <AdsLsxf>1</AdsLsxf> + <RvctClst>0</RvctClst> + <GenPPlst>0</GenPPlst> + <AdsCpuType>"Cortex-M0+"</AdsCpuType> + <RvctDeviceName></RvctDeviceName> + <mOS>0</mOS> + <uocRom>0</uocRom> + <uocRam>0</uocRam> + <hadIROM>0</hadIROM> + <hadIRAM>0</hadIRAM> + <hadXRAM>0</hadXRAM> + <uocXRam>0</uocXRam> + <RvdsVP>0</RvdsVP> + <hadIRAM2>0</hadIRAM2> + <hadIROM2>0</hadIROM2> + <StupSel>1</StupSel> + <useUlib>0</useUlib> + <EndSel>1</EndSel> + <uLtcg>0</uLtcg> + <RoSelD>0</RoSelD> + <RwSelD>5</RwSelD> + <CodeSel>0</CodeSel> + <OptFeed>0</OptFeed> + <NoZi1>0</NoZi1> + <NoZi2>0</NoZi2> + <NoZi3>0</NoZi3> + <NoZi4>0</NoZi4> + <NoZi5>0</NoZi5> + <Ro1Chk>1</Ro1Chk> + <Ro2Chk>0</Ro2Chk> + <Ro3Chk>0</Ro3Chk> + <Ir1Chk>0</Ir1Chk> + <Ir2Chk>0</Ir2Chk> + <Ra1Chk>1</Ra1Chk> + <Ra2Chk>0</Ra2Chk> + <Ra3Chk>0</Ra3Chk> + <Im1Chk>0</Im1Chk> + <Im2Chk>0</Im2Chk> + <OnChipMemories> + <Ocm1> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </Ocm1> + <Ocm2> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </Ocm2> + <Ocm3> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </Ocm3> + <Ocm4> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </Ocm4> + <Ocm5> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </Ocm5> + <Ocm6> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </Ocm6> + <IRAM> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </IRAM> + <IROM> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </IROM> + <XRAM> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </XRAM> + <OCR_RVCT1> + <Type>1</Type> + <StartAddress>0x0</StartAddress> + <Size>0x10000</Size> + </OCR_RVCT1> + <OCR_RVCT2> + <Type>1</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </OCR_RVCT2> + <OCR_RVCT3> + <Type>1</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </OCR_RVCT3> + <OCR_RVCT4> + <Type>1</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </OCR_RVCT4> + <OCR_RVCT5> + <Type>1</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </OCR_RVCT5> + <OCR_RVCT6> + <Type>0</Type> + <StartAddress>0x20000000</StartAddress> + <Size>0x10000</Size> + </OCR_RVCT6> + <OCR_RVCT7> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </OCR_RVCT7> + <OCR_RVCT8> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </OCR_RVCT8> + <OCR_RVCT9> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </OCR_RVCT9> + <OCR_RVCT10> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </OCR_RVCT10> + </OnChipMemories> + <RvctStartVector></RvctStartVector> + </ArmAdsMisc> + <Cads> + <interw>1</interw> + <Optim>4</Optim> + <oTime>0</oTime> + <SplitLS>0</SplitLS> + <OneElfS>0</OneElfS> + <Strict>0</Strict> + <EnumInt>0</EnumInt> + <PlainCh>0</PlainCh> + <Ropi>0</Ropi> + <Rwpi>0</Rwpi> + <wLevel>0</wLevel> + <uThumb>0</uThumb> + <VariousControls> + <MiscControls></MiscControls> + <Define>CORTEX_M0PLUS</Define> + <Undefine></Undefine> + <IncludePath>..\..\..\..\software\cmsis\CMSIS\Include; ..\..\..\..\software\cmsis\Device\ARM\CMSDK_CM0plus\Include; ..\..\..\..\software\common\retarget</IncludePath> + </VariousControls> + </Cads> + <Aads> + <interw>1</interw> + <Ropi>0</Ropi> + <Rwpi>0</Rwpi> + <thumb>0</thumb> + <SplitLS>0</SplitLS> + <SwStkChk>0</SwStkChk> + <NoWarn>0</NoWarn> + <VariousControls> + <MiscControls></MiscControls> + <Define></Define> + <Undefine></Undefine> + <IncludePath></IncludePath> + </VariousControls> + </Aads> + <LDads> + <umfTarg>1</umfTarg> + <Ropi>0</Ropi> + <Rwpi>0</Rwpi> + <noStLib>0</noStLib> + <RepFail>1</RepFail> + <useFile>0</useFile> + <TextAddressRange>0x00000000</TextAddressRange> + <DataAddressRange>0x00000000</DataAddressRange> + <ScatterFile></ScatterFile> + <IncludeLibs></IncludeLibs> + <IncludeLibsPath></IncludeLibsPath> + <Misc></Misc> + <LinkerInputFile></LinkerInputFile> + <DisabledWarnings></DisabledWarnings> + </LDads> + </TargetArmAds> + </TargetOption> + <Groups> + <Group> + <GroupName>Startup</GroupName> + <Files> + <File> + <FileName>startup_CMSDK_CM0plus.s</FileName> + <FileType>2</FileType> + <FilePath>..\..\..\..\software\cmsis\Device\ARM\CMSDK_CM0plus\Source\ARM\startup_CMSDK_CM0plus.s</FilePath> + </File> + </Files> + </Group> + <Group> + <GroupName>Application</GroupName> + <Files> + <File> + <FileName>uart_stdout.c</FileName> + <FileType>1</FileType> + <FilePath>..\..\..\..\software\common\retarget\uart_stdout.c</FilePath> + </File> + <File> + <FileName>retarget.c</FileName> + <FileType>1</FileType> + <FilePath>..\..\..\..\software\common\retarget\retarget.c</FilePath> + </File> + <File> + <FileName>uart_tests.c</FileName> + <FileType>1</FileType> + <FilePath>..\..\..\..\software\common\validation\uart_tests.c</FilePath> + </File> + </Files> + </Group> + <Group> + <GroupName>System</GroupName> + <Files> + <File> + <FileName>system_CMSDK_CM0plus.c</FileName> + <FileType>1</FileType> + <FilePath>..\..\..\..\software\cmsis\Device\ARM\CMSDK_CM0plus\Source\system_CMSDK_CM0plus.c</FilePath> + </File> + </Files> + </Group> + </Groups> + </Target> + </Targets> + +</Project> diff --git a/Cortex-M0/nanosoc/systems/mcu/testcodes/watchdog_demo/makefile b/Cortex-M0/nanosoc/systems/mcu/testcodes/watchdog_demo/makefile new file mode 100644 index 0000000..d7c2ba5 --- /dev/null +++ b/Cortex-M0/nanosoc/systems/mcu/testcodes/watchdog_demo/makefile @@ -0,0 +1,250 @@ +#----------------------------------------------------------------------------- +# The confidential and proprietary information contained in this file may +# only be used by a person authorised under and to the extent permitted +# by a subsisting licensing agreement from Arm Limited or its affiliates. +# +# (C) COPYRIGHT 2010-2013 Arm Limited or its affiliates. +# ALL RIGHTS RESERVED +# +# This entire notice must be reproduced on all copies of this file +# and copies of this file may only be made by a person if such person is +# permitted to do so under the terms of a subsisting license agreement +# from Arm Limited or its affiliates. +# +# SVN Information +# +# Checked In : $Date: 2017-10-10 15:55:38 +0100 (Tue, 10 Oct 2017) $ +# +# Revision : $Revision: 371321 $ +# +# Release Information : Cortex-M System Design Kit-r1p1-00rel0 +#----------------------------------------------------------------------------- +# +# Cortex-M System Design Kit software compilation make file +# +#----------------------------------------------------------------------------- +# +# Configurations +# +# Choose the core instantiated, can be +# - CORTEX_M0 +# - CORTEX_M0PLUS +CPU_PRODUCT = CORTEX_M0PLUS + +# Shared software directory +SOFTWARE_DIR = ../../../../software +CMSIS_DIR = $(SOFTWARE_DIR)/cmsis +CORE_DIR = $(CMSIS_DIR)/CMSIS/Include + +ifeq ($(CPU_PRODUCT),CORTEX_M0PLUS) + DEVICE_DIR = $(CMSIS_DIR)/Device/ARM/CMSDK_CM0plus +else + DEVICE_DIR = $(CMSIS_DIR)/Device/ARM/CMSDK_CM0 +endif + +# Program file +TESTNAME = watchdog_demo + +# Endian Option +COMPILE_BIGEND = 0 + +# Configuration +ifeq ($(CPU_PRODUCT),CORTEX_M0PLUS) + USER_DEFINE = -DCORTEX_M0PLUS +else + USER_DEFINE = -DCORTEX_M0 +endif + +DEPS_LIST = makefile + +# Tool chain : ds5 / gcc / keil +TOOL_CHAIN = ds5 + +ifeq ($(TOOL_CHAIN),ds5) + ifeq ($(CPU_PRODUCT),CORTEX_M0PLUS) + CPU_TYPE = --cpu Cortex-M0plus + else + CPU_TYPE = --cpu Cortex-M0 + endif +endif + +ifeq ($(TOOL_CHAIN),gcc) + ifeq ($(CPU_PRODUCT),CORTEX_M0PLUS) + CPU_TYPE = -mcpu=cortex-m0plus + else + CPU_TYPE = -mcpu=cortex-m0 + endif +endif + +# Startup code directory for DS-5 +ifeq ($(TOOL_CHAIN),ds5) + STARTUP_DIR = $(DEVICE_DIR)/Source/ARM +endif + +# Startup code directory for gcc +ifeq ($(TOOL_CHAIN),gcc) + STARTUP_DIR = $(DEVICE_DIR)/Source/GCC +endif + +ifeq ($(CPU_PRODUCT),CORTEX_M0PLUS) + STARTUP_FILE = startup_CMSDK_CM0plus + SYSTEM_FILE = system_CMSDK_CM0plus +else + STARTUP_FILE = startup_CMSDK_CM0 + SYSTEM_FILE = system_CMSDK_CM0 +endif + +# --------------------------------------------------------------------------------------- +# DS-5 options + +# MicroLIB option (DS-5) +COMPILE_MICROLIB = 0 + +# Small Multiply (Cortex-M0/M0+ has small multiplier option) +COMPILE_SMALLMUL = 0 + +ARM_CC_OPTIONS = -c -O3 -g -Otime -I $(DEVICE_DIR)/Include -I $(CORE_DIR) \ + -I $(SOFTWARE_DIR)/common/retarget $(USER_DEFINE) +ARM_ASM_OPTIONS = -g +ARM_LINK_OPTIONS = "--keep=$(STARTUP_FILE).o(RESET)" "--first=$(STARTUP_FILE).o(RESET)" \ + --rw_base 0x30000000 --ro_base 0x00000000 --map + +ifeq ($(COMPILE_BIGEND),1) + # Big Endian + ARM_CC_OPTIONS += --bigend + ARM_ASM_OPTIONS += --bigend + ARM_LINK_OPTIONS += --be8 +endif + +ifeq ($(COMPILE_MICROLIB),1) + # MicroLIB + ARM_CC_OPTIONS += --library_type=microlib + ARM_ASM_OPTIONS += --library_type=microlib --pd "__MICROLIB SETA 1" + ARM_LINK_OPTIONS += --library_type=microlib +endif + +ifeq ($(COMPILE_SMALLMUL),1) + # In Cortex-M0, small multiply takes 32 cycles + ARM_CC_OPTIONS += --multiply_latency=32 +endif + +# --------------------------------------------------------------------------------------- +# gcc options + +GNG_CC = arm-none-eabi-gcc +GNU_OBJDUMP = arm-none-eabi-objdump +GNU_OBJCOPY = arm-none-eabi-objcopy + +LINKER_SCRIPT_PATH = $(SOFTWARE_DIR)/common/scripts +LINKER_SCRIPT = $(LINKER_SCRIPT_PATH)/cmsdk_cm0.ld + +GNU_CC_FLAGS = -g -O3 -mthumb $(CPU_TYPE) + +ifeq ($(COMPILE_BIGEND),1) + # Big Endian + GNU_CC_FLAGS += -mbig-endian +endif + +# --------------------------------------------------------------------------------------- +all: all_$(TOOL_CHAIN) + +# --------------------------------------------------------------------------------------- +# DS-5 +all_ds5 : $(TESTNAME).hex $(TESTNAME).lst + +$(TESTNAME).o : $(SOFTWARE_DIR)/common/demos/$(TESTNAME).c $(DEPS_LIST) + armcc $(ARM_CC_OPTIONS) $(CPU_TYPE) $< -o $@ + +$(SYSTEM_FILE).o : $(DEVICE_DIR)/Source/$(SYSTEM_FILE).c $(DEPS_LIST) + armcc $(ARM_CC_OPTIONS) $(CPU_TYPE) $< -o $@ + +retarget.o : $(SOFTWARE_DIR)/common/retarget/retarget.c $(DEPS_LIST) + armcc $(ARM_CC_OPTIONS) $(CPU_TYPE) $< -o $@ + +uart_stdout.o : $(SOFTWARE_DIR)/common/retarget/uart_stdout.c $(DEPS_LIST) + armcc $(ARM_CC_OPTIONS) $(CPU_TYPE) $< -o $@ + +$(STARTUP_FILE).o : $(STARTUP_DIR)/$(STARTUP_FILE).s $(DEPS_LIST) + armasm $(ARM_ASM_OPTIONS) $(CPU_TYPE) $< -o $@ + +$(TESTNAME).ELF : $(TESTNAME).o $(SYSTEM_FILE).o $(STARTUP_FILE).o retarget.o uart_stdout.o + armlink $(ARM_LINK_OPTIONS) $(TESTNAME).o $(SYSTEM_FILE).o $(STARTUP_FILE).o retarget.o uart_stdout.o -o $@ + +$(TESTNAME).hex : $(TESTNAME).ELF + fromelf --vhx --8x1 $< --output $@ + + +$(TESTNAME).lst : $(TESTNAME).ELF + fromelf -c -d -e -s $< --output $@ + +# --------------------------------------------------------------------------------------- +# gcc +all_gcc: + $(GNG_CC) $(GNU_CC_FLAGS) $(STARTUP_DIR)/$(STARTUP_FILE).s \ + $(SOFTWARE_DIR)/common/demos/$(TESTNAME).c \ + $(SOFTWARE_DIR)/common/retarget/retarget.c \ + $(SOFTWARE_DIR)/common/retarget/uart_stdout.c \ + $(DEVICE_DIR)/Source/$(SYSTEM_FILE).c \ + -I $(DEVICE_DIR)/Include -I $(CORE_DIR) \ + -I $(SOFTWARE_DIR)/common/retarget \ + -L $(LINKER_SCRIPT_PATH) \ + -D__STACK_SIZE=0x200 \ + -D__HEAP_SIZE=0x1000 \ + $(USER_DEFINE) -T $(LINKER_SCRIPT) -o $(TESTNAME).o + # Generate disassembly code + $(GNU_OBJDUMP) -S $(TESTNAME).o > $(TESTNAME).lst + # Generate binary file + $(GNU_OBJCOPY) -S $(TESTNAME).o -O binary $(TESTNAME).bin + # Generate hex file + $(GNU_OBJCOPY) -S $(TESTNAME).o -O verilog $(TESTNAME).hex + +# Note: +# If the version of object copy you are using does not support verilog hex file output, +# you can generate the hex file from binary file using the following command +# od -v -A n -t x1 --width=1 $(TESTNAME).bin > $(TESTNAME).hex + + +# --------------------------------------------------------------------------------------- +# Keil MDK + +all_keil: + @echo "Please compile your project code and press ENTER when ready" + @read dummy + +# --------------------------------------------------------------------------------------- +# Binary + +all_bin: $(TESTNAME).bin + # Generate hex file from binary + od -v -A n -t x1 --width=1 $(TESTNAME).bin > $(TESTNAME).hex + +# --------------------------------------------------------------------------------------- +# Clean +clean : + @rm -rf *.o + @if [ -e $(TESTNAME).hex ] ; then \ + rm -rf $(TESTNAME).hex ; \ + fi + @if [ -e $(TESTNAME).lst ] ; then \ + rm -rf $(TESTNAME).lst ; \ + fi + @if [ -e $(TESTNAME).ELF ] ; then \ + rm -rf $(TESTNAME).ELF ; \ + fi + @if [ -e $(TESTNAME).bin ] ; then \ + rm -rf $(TESTNAME).bin ; \ + fi + @rm -rf *.crf + @rm -rf *.plg + @rm -rf *.tra + @rm -rf *.htm + @rm -rf *.map + @rm -rf *.dep + @rm -rf *.d + @rm -rf *.lnp + @rm -rf *.bak + @rm -rf *.lst + @rm -rf *.axf + @rm -rf *.sct + @rm -rf *.__i + @rm -rf *._ia diff --git a/Cortex-M0/nanosoc/systems/mcu/testcodes/watchdog_demo/watchdog_demo_cm0.uvopt b/Cortex-M0/nanosoc/systems/mcu/testcodes/watchdog_demo/watchdog_demo_cm0.uvopt new file mode 100644 index 0000000..d037b58 --- /dev/null +++ b/Cortex-M0/nanosoc/systems/mcu/testcodes/watchdog_demo/watchdog_demo_cm0.uvopt @@ -0,0 +1,261 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no" ?> +<ProjectOpt xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="project_opt.xsd"> + + <SchemaVersion>1.0</SchemaVersion> + + <Header>### uVision Project, (C) Keil Software</Header> + + <Extensions> + <cExt>*.c</cExt> + <aExt>*.s*; *.src; *.a*</aExt> + <oExt>*.obj</oExt> + <lExt>*.lib</lExt> + <tExt>*.txt; *.h; *.inc</tExt> + <pExt>*.plm</pExt> + <CppX>*.cpp</CppX> + </Extensions> + + <DaveTm> + <dwLowDateTime>0</dwLowDateTime> + <dwHighDateTime>0</dwHighDateTime> + </DaveTm> + + <Target> + <TargetName>Debug</TargetName> + <ToolsetNumber>0x4</ToolsetNumber> + <ToolsetName>ARM-ADS</ToolsetName> + <TargetOption> + <CLKADS>50000000</CLKADS> + <OPTTT> + <gFlags>1</gFlags> + <BeepAtEnd>1</BeepAtEnd> + <RunSim>1</RunSim> + <RunTarget>0</RunTarget> + </OPTTT> + <OPTHX> + <HexSelection>1</HexSelection> + <FlashByte>65535</FlashByte> + <HexRangeLowAddress>0</HexRangeLowAddress> + <HexRangeHighAddress>0</HexRangeHighAddress> + <HexOffset>0</HexOffset> + </OPTHX> + <OPTLEX> + <PageWidth>79</PageWidth> + <PageLength>66</PageLength> + <TabStop>8</TabStop> + <ListingPath>.\</ListingPath> + </OPTLEX> + <ListingPage> + <CreateCListing>1</CreateCListing> + <CreateAListing>1</CreateAListing> + <CreateLListing>1</CreateLListing> + <CreateIListing>0</CreateIListing> + <AsmCond>1</AsmCond> + <AsmSymb>1</AsmSymb> + <AsmXref>0</AsmXref> + <CCond>1</CCond> + <CCode>0</CCode> + <CListInc>0</CListInc> + <CSymb>0</CSymb> + <LinkerCodeListing>0</LinkerCodeListing> + </ListingPage> + <OPTXL> + <LMap>1</LMap> + <LComments>1</LComments> + <LGenerateSymbols>1</LGenerateSymbols> + <LLibSym>1</LLibSym> + <LLines>1</LLines> + <LLocSym>1</LLocSym> + <LPubSym>1</LPubSym> + <LXref>0</LXref> + <LExpSel>0</LExpSel> + </OPTXL> + <OPTFL> + <tvExp>1</tvExp> + <tvExpOptDlg>0</tvExpOptDlg> + <IsCurrentTarget>1</IsCurrentTarget> + </OPTFL> + <CpuCode>255</CpuCode> + <DllOpt> + <SimDllName>SARMCM3.DLL</SimDllName> + <SimDllArguments></SimDllArguments> + <SimDlgDllName>DARMCM1.DLL</SimDlgDllName> + <SimDlgDllArguments></SimDlgDllArguments> + <TargetDllName>SARMCM3.DLL</TargetDllName> + <TargetDllArguments></TargetDllArguments> + <TargetDlgDllName>TARMCM1.DLL</TargetDlgDllName> + <TargetDlgDllArguments></TargetDlgDllArguments> + </DllOpt> + <DebugOpt> + <uSim>1</uSim> + <uTrg>0</uTrg> + <sLdApp>1</sLdApp> + <sGomain>1</sGomain> + <sRbreak>1</sRbreak> + <sRwatch>1</sRwatch> + <sRmem>1</sRmem> + <sRfunc>1</sRfunc> + <sRbox>1</sRbox> + <tLdApp>1</tLdApp> + <tGomain>0</tGomain> + <tRbreak>1</tRbreak> + <tRwatch>1</tRwatch> + <tRmem>1</tRmem> + <tRfunc>0</tRfunc> + <tRbox>1</tRbox> + <tRtrace>0</tRtrace> + <sRunDeb>0</sRunDeb> + <sLrtime>0</sLrtime> + <nTsel>-1</nTsel> + <sDll></sDll> + <sDllPa></sDllPa> + <sDlgDll></sDlgDll> + <sDlgPa></sDlgPa> + <sIfile></sIfile> + <tDll></tDll> + <tDllPa></tDllPa> + <tDlgDll></tDlgDll> + <tDlgPa></tDlgPa> + <tIfile></tIfile> + <pMon></pMon> + </DebugOpt> + <Breakpoint/> + <DebugFlag> + <trace>0</trace> + <periodic>1</periodic> + <aLwin>0</aLwin> + <aCover>0</aCover> + <aSer1>0</aSer1> + <aSer2>0</aSer2> + <aPa>0</aPa> + <viewmode>0</viewmode> + <vrSel>0</vrSel> + <aSym>0</aSym> + <aTbox>0</aTbox> + <AscS1>0</AscS1> + <AscS2>0</AscS2> + <AscS3>0</AscS3> + <aSer3>0</aSer3> + <eProf>0</eProf> + <aLa>0</aLa> + <aPa1>0</aPa1> + <AscS4>0</AscS4> + <aSer4>0</aSer4> + <StkLoc>0</StkLoc> + <TrcWin>0</TrcWin> + <newCpu>0</newCpu> + <uProt>0</uProt> + </DebugFlag> + <Tracepoint> + <THDelay>0</THDelay> + </Tracepoint> + <LintExecutable></LintExecutable> + <LintConfigFile></LintConfigFile> + </TargetOption> + </Target> + + <Group> + <GroupName>Startup</GroupName> + <tvExp>1</tvExp> + <tvExpOptDlg>0</tvExpOptDlg> + <cbSel>0</cbSel> + <RteFlg>0</RteFlg> + <File> + <GroupNumber>1</GroupNumber> + <FileNumber>1</FileNumber> + <FileType>2</FileType> + <tvExp>0</tvExp> + <Focus>0</Focus> + <ColumnNumber>0</ColumnNumber> + <tvExpOptDlg>0</tvExpOptDlg> + <TopLine>0</TopLine> + <CurrentLine>0</CurrentLine> + <bDave2>0</bDave2> + <PathWithFileName>..\..\..\..\software\cmsis\Device\ARM\CMSDK_CM0\Source\ARM\startup_CMSDK_CM0.s</PathWithFileName> + <FilenameWithoutPath>startup_CMSDK_CM0.s</FilenameWithoutPath> + <RteFlg>0</RteFlg> + <bShared>0</bShared> + </File> + </Group> + + <Group> + <GroupName>Application</GroupName> + <tvExp>1</tvExp> + <tvExpOptDlg>0</tvExpOptDlg> + <cbSel>0</cbSel> + <RteFlg>0</RteFlg> + <File> + <GroupNumber>2</GroupNumber> + <FileNumber>2</FileNumber> + <FileType>1</FileType> + <tvExp>0</tvExp> + <Focus>0</Focus> + <ColumnNumber>0</ColumnNumber> + <tvExpOptDlg>0</tvExpOptDlg> + <TopLine>0</TopLine> + <CurrentLine>0</CurrentLine> + <bDave2>0</bDave2> + <PathWithFileName>..\..\..\..\software\common\demos\watchdog_demo.c</PathWithFileName> + <FilenameWithoutPath>watchdog_demo.c</FilenameWithoutPath> + <RteFlg>0</RteFlg> + <bShared>0</bShared> + </File> + <File> + <GroupNumber>2</GroupNumber> + <FileNumber>3</FileNumber> + <FileType>1</FileType> + <tvExp>0</tvExp> + <Focus>0</Focus> + <ColumnNumber>0</ColumnNumber> + <tvExpOptDlg>0</tvExpOptDlg> + <TopLine>0</TopLine> + <CurrentLine>0</CurrentLine> + <bDave2>0</bDave2> + <PathWithFileName>..\..\..\..\software\common\retarget\uart_stdout.c</PathWithFileName> + <FilenameWithoutPath>uart_stdout.c</FilenameWithoutPath> + <RteFlg>0</RteFlg> + <bShared>0</bShared> + </File> + <File> + <GroupNumber>2</GroupNumber> + <FileNumber>4</FileNumber> + <FileType>1</FileType> + <tvExp>0</tvExp> + <Focus>0</Focus> + <ColumnNumber>0</ColumnNumber> + <tvExpOptDlg>0</tvExpOptDlg> + <TopLine>0</TopLine> + <CurrentLine>0</CurrentLine> + <bDave2>0</bDave2> + <PathWithFileName>..\..\..\..\software\common\retarget\retarget.c</PathWithFileName> + <FilenameWithoutPath>retarget.c</FilenameWithoutPath> + <RteFlg>0</RteFlg> + <bShared>0</bShared> + </File> + </Group> + + <Group> + <GroupName>System</GroupName> + <tvExp>1</tvExp> + <tvExpOptDlg>0</tvExpOptDlg> + <cbSel>0</cbSel> + <RteFlg>0</RteFlg> + <File> + <GroupNumber>3</GroupNumber> + <FileNumber>5</FileNumber> + <FileType>1</FileType> + <tvExp>0</tvExp> + <Focus>0</Focus> + <ColumnNumber>0</ColumnNumber> + <tvExpOptDlg>0</tvExpOptDlg> + <TopLine>0</TopLine> + <CurrentLine>0</CurrentLine> + <bDave2>0</bDave2> + <PathWithFileName>..\..\..\..\software\cmsis\Device\ARM\CMSDK_CM0\Source\system_CMSDK_CM0.c</PathWithFileName> + <FilenameWithoutPath>system_CMSDK_CM0.c</FilenameWithoutPath> + <RteFlg>0</RteFlg> + <bShared>0</bShared> + </File> + </Group> + +</ProjectOpt> diff --git a/Cortex-M0/nanosoc/systems/mcu/testcodes/watchdog_demo/watchdog_demo_cm0.uvproj b/Cortex-M0/nanosoc/systems/mcu/testcodes/watchdog_demo/watchdog_demo_cm0.uvproj new file mode 100644 index 0000000..1c90f5d --- /dev/null +++ b/Cortex-M0/nanosoc/systems/mcu/testcodes/watchdog_demo/watchdog_demo_cm0.uvproj @@ -0,0 +1,435 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no" ?> +<Project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="project_proj.xsd"> + + <SchemaVersion>1.1</SchemaVersion> + + <Header>### uVision Project, (C) Keil Software</Header> + + <Targets> + <Target> + <TargetName>Debug</TargetName> + <ToolsetNumber>0x4</ToolsetNumber> + <ToolsetName>ARM-ADS</ToolsetName> + <TargetOption> + <TargetCommonOption> + <Device>Cortex-M0</Device> + <Vendor>ARM</Vendor> + <Cpu>CLOCK(12000000) CPUTYPE("Cortex-M0") ESEL ELITTLE</Cpu> + <FlashUtilSpec></FlashUtilSpec> + <StartupFile></StartupFile> + <FlashDriverDll></FlashDriverDll> + <DeviceId>4803</DeviceId> + <RegisterFile></RegisterFile> + <MemoryEnv></MemoryEnv> + <Cmp></Cmp> + <Asm></Asm> + <Linker></Linker> + <OHString></OHString> + <InfinionOptionDll></InfinionOptionDll> + <SLE66CMisc></SLE66CMisc> + <SLE66AMisc></SLE66AMisc> + <SLE66LinkerMisc></SLE66LinkerMisc> + <SFDFile></SFDFile> + <UseEnv>0</UseEnv> + <BinPath></BinPath> + <IncludePath></IncludePath> + <LibPath></LibPath> + <RegisterFilePath></RegisterFilePath> + <DBRegisterFilePath></DBRegisterFilePath> + <TargetStatus> + <Error>0</Error> + <ExitCodeStop>0</ExitCodeStop> + <ButtonStop>0</ButtonStop> + <NotGenerated>0</NotGenerated> + <InvalidFlash>1</InvalidFlash> + </TargetStatus> + <OutputDirectory>.\</OutputDirectory> + <OutputName>watchdog_demo</OutputName> + <CreateExecutable>1</CreateExecutable> + <CreateLib>0</CreateLib> + <CreateHexFile>0</CreateHexFile> + <DebugInformation>1</DebugInformation> + <BrowseInformation>1</BrowseInformation> + <ListingPath>.\</ListingPath> + <HexFormatSelection>1</HexFormatSelection> + <Merge32K>0</Merge32K> + <CreateBatchFile>0</CreateBatchFile> + <BeforeCompile> + <RunUserProg1>0</RunUserProg1> + <RunUserProg2>0</RunUserProg2> + <UserProg1Name></UserProg1Name> + <UserProg2Name></UserProg2Name> + <UserProg1Dos16Mode>0</UserProg1Dos16Mode> + <UserProg2Dos16Mode>0</UserProg2Dos16Mode> + <nStopU1X>0</nStopU1X> + <nStopU2X>0</nStopU2X> + </BeforeCompile> + <BeforeMake> + <RunUserProg1>0</RunUserProg1> + <RunUserProg2>0</RunUserProg2> + <UserProg1Name></UserProg1Name> + <UserProg2Name></UserProg2Name> + <UserProg1Dos16Mode>0</UserProg1Dos16Mode> + <UserProg2Dos16Mode>0</UserProg2Dos16Mode> + </BeforeMake> + <AfterMake> + <RunUserProg1>1</RunUserProg1> + <RunUserProg2>0</RunUserProg2> + <UserProg1Name>$K\ARM\ARMCC\BIN\fromelf.exe #L --vhx --8x1 --output watchdog_demo.hex</UserProg1Name> + <UserProg2Name></UserProg2Name> + <UserProg1Dos16Mode>0</UserProg1Dos16Mode> + <UserProg2Dos16Mode>0</UserProg2Dos16Mode> + </AfterMake> + <SelectedForBatchBuild>0</SelectedForBatchBuild> + <SVCSIdString></SVCSIdString> + </TargetCommonOption> + <CommonProperty> + <UseCPPCompiler>0</UseCPPCompiler> + <RVCTCodeConst>0</RVCTCodeConst> + <RVCTZI>0</RVCTZI> + <RVCTOtherData>0</RVCTOtherData> + <ModuleSelection>0</ModuleSelection> + <IncludeInBuild>1</IncludeInBuild> + <AlwaysBuild>0</AlwaysBuild> + <GenerateAssemblyFile>0</GenerateAssemblyFile> + <AssembleAssemblyFile>0</AssembleAssemblyFile> + <PublicsOnly>0</PublicsOnly> + <StopOnExitCode>3</StopOnExitCode> + <CustomArgument></CustomArgument> + <IncludeLibraryModules></IncludeLibraryModules> + </CommonProperty> + <DllOption> + <SimDllName>SARMCM3.DLL</SimDllName> + <SimDllArguments></SimDllArguments> + <SimDlgDll>DARMCM1.DLL</SimDlgDll> + <SimDlgDllArguments></SimDlgDllArguments> + <TargetDllName>SARMCM3.DLL</TargetDllName> + <TargetDllArguments></TargetDllArguments> + <TargetDlgDll>TARMCM1.DLL</TargetDlgDll> + <TargetDlgDllArguments></TargetDlgDllArguments> + </DllOption> + <DebugOption> + <OPTHX> + <HexSelection>1</HexSelection> + <HexRangeLowAddress>0</HexRangeLowAddress> + <HexRangeHighAddress>0</HexRangeHighAddress> + <HexOffset>0</HexOffset> + <Oh166RecLen>16</Oh166RecLen> + </OPTHX> + <Simulator> + <UseSimulator>1</UseSimulator> + <LoadApplicationAtStartup>1</LoadApplicationAtStartup> + <RunToMain>1</RunToMain> + <RestoreBreakpoints>1</RestoreBreakpoints> + <RestoreWatchpoints>1</RestoreWatchpoints> + <RestoreMemoryDisplay>1</RestoreMemoryDisplay> + <RestoreFunctions>1</RestoreFunctions> + <RestoreToolbox>1</RestoreToolbox> + <LimitSpeedToRealTime>0</LimitSpeedToRealTime> + </Simulator> + <Target> + <UseTarget>0</UseTarget> + <LoadApplicationAtStartup>1</LoadApplicationAtStartup> + <RunToMain>0</RunToMain> + <RestoreBreakpoints>1</RestoreBreakpoints> + <RestoreWatchpoints>1</RestoreWatchpoints> + <RestoreMemoryDisplay>1</RestoreMemoryDisplay> + <RestoreFunctions>0</RestoreFunctions> + <RestoreToolbox>1</RestoreToolbox> + <RestoreTracepoints>0</RestoreTracepoints> + </Target> + <RunDebugAfterBuild>0</RunDebugAfterBuild> + <TargetSelection>-1</TargetSelection> + <SimDlls> + <CpuDll></CpuDll> + <CpuDllArguments></CpuDllArguments> + <PeripheralDll></PeripheralDll> + <PeripheralDllArguments></PeripheralDllArguments> + <InitializationFile></InitializationFile> + </SimDlls> + <TargetDlls> + <CpuDll></CpuDll> + <CpuDllArguments></CpuDllArguments> + <PeripheralDll></PeripheralDll> + <PeripheralDllArguments></PeripheralDllArguments> + <InitializationFile></InitializationFile> + <Driver></Driver> + </TargetDlls> + </DebugOption> + <Utilities> + <Flash1> + <UseTargetDll>0</UseTargetDll> + <UseExternalTool>0</UseExternalTool> + <RunIndependent>0</RunIndependent> + <UpdateFlashBeforeDebugging>0</UpdateFlashBeforeDebugging> + <Capability>0</Capability> + <DriverSelection>-1</DriverSelection> + </Flash1> + <Flash2></Flash2> + <Flash3></Flash3> + <Flash4></Flash4> + </Utilities> + <TargetArmAds> + <ArmAdsMisc> + <GenerateListings>0</GenerateListings> + <asHll>1</asHll> + <asAsm>1</asAsm> + <asMacX>1</asMacX> + <asSyms>1</asSyms> + <asFals>1</asFals> + <asDbgD>1</asDbgD> + <asForm>1</asForm> + <ldLst>0</ldLst> + <ldmm>1</ldmm> + <ldXref>1</ldXref> + <BigEnd>0</BigEnd> + <AdsALst>1</AdsALst> + <AdsACrf>1</AdsACrf> + <AdsANop>0</AdsANop> + <AdsANot>0</AdsANot> + <AdsLLst>1</AdsLLst> + <AdsLmap>1</AdsLmap> + <AdsLcgr>1</AdsLcgr> + <AdsLsym>1</AdsLsym> + <AdsLszi>1</AdsLszi> + <AdsLtoi>1</AdsLtoi> + <AdsLsun>1</AdsLsun> + <AdsLven>1</AdsLven> + <AdsLsxf>1</AdsLsxf> + <RvctClst>0</RvctClst> + <GenPPlst>0</GenPPlst> + <AdsCpuType>"Cortex-M0"</AdsCpuType> + <RvctDeviceName></RvctDeviceName> + <mOS>0</mOS> + <uocRom>0</uocRom> + <uocRam>0</uocRam> + <hadIROM>0</hadIROM> + <hadIRAM>0</hadIRAM> + <hadXRAM>0</hadXRAM> + <uocXRam>0</uocXRam> + <RvdsVP>0</RvdsVP> + <hadIRAM2>0</hadIRAM2> + <hadIROM2>0</hadIROM2> + <StupSel>1</StupSel> + <useUlib>0</useUlib> + <EndSel>1</EndSel> + <uLtcg>0</uLtcg> + <RoSelD>0</RoSelD> + <RwSelD>5</RwSelD> + <CodeSel>0</CodeSel> + <OptFeed>0</OptFeed> + <NoZi1>0</NoZi1> + <NoZi2>0</NoZi2> + <NoZi3>0</NoZi3> + <NoZi4>0</NoZi4> + <NoZi5>0</NoZi5> + <Ro1Chk>1</Ro1Chk> + <Ro2Chk>0</Ro2Chk> + <Ro3Chk>0</Ro3Chk> + <Ir1Chk>0</Ir1Chk> + <Ir2Chk>0</Ir2Chk> + <Ra1Chk>1</Ra1Chk> + <Ra2Chk>0</Ra2Chk> + <Ra3Chk>0</Ra3Chk> + <Im1Chk>0</Im1Chk> + <Im2Chk>0</Im2Chk> + <OnChipMemories> + <Ocm1> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </Ocm1> + <Ocm2> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </Ocm2> + <Ocm3> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </Ocm3> + <Ocm4> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </Ocm4> + <Ocm5> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </Ocm5> + <Ocm6> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </Ocm6> + <IRAM> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </IRAM> + <IROM> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </IROM> + <XRAM> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </XRAM> + <OCR_RVCT1> + <Type>1</Type> + <StartAddress>0x0</StartAddress> + <Size>0x10000</Size> + </OCR_RVCT1> + <OCR_RVCT2> + <Type>1</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </OCR_RVCT2> + <OCR_RVCT3> + <Type>1</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </OCR_RVCT3> + <OCR_RVCT4> + <Type>1</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </OCR_RVCT4> + <OCR_RVCT5> + <Type>1</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </OCR_RVCT5> + <OCR_RVCT6> + <Type>0</Type> + <StartAddress>0x20000000</StartAddress> + <Size>0x10000</Size> + </OCR_RVCT6> + <OCR_RVCT7> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </OCR_RVCT7> + <OCR_RVCT8> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </OCR_RVCT8> + <OCR_RVCT9> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </OCR_RVCT9> + <OCR_RVCT10> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </OCR_RVCT10> + </OnChipMemories> + <RvctStartVector></RvctStartVector> + </ArmAdsMisc> + <Cads> + <interw>1</interw> + <Optim>4</Optim> + <oTime>0</oTime> + <SplitLS>0</SplitLS> + <OneElfS>0</OneElfS> + <Strict>0</Strict> + <EnumInt>0</EnumInt> + <PlainCh>0</PlainCh> + <Ropi>0</Ropi> + <Rwpi>0</Rwpi> + <wLevel>0</wLevel> + <uThumb>0</uThumb> + <uSurpInc>0</uSurpInc> + <VariousControls> + <MiscControls></MiscControls> + <Define>CORTEX_M0</Define> + <Undefine></Undefine> + <IncludePath>..\..\..\..\software\cmsis\CMSIS\Include; ..\..\..\..\software\cmsis\Device\ARM\CMSDK_CM0\Include; ..\..\..\..\software\common\retarget</IncludePath> + </VariousControls> + </Cads> + <Aads> + <interw>1</interw> + <Ropi>0</Ropi> + <Rwpi>0</Rwpi> + <thumb>0</thumb> + <SplitLS>0</SplitLS> + <SwStkChk>0</SwStkChk> + <NoWarn>0</NoWarn> + <uSurpInc>0</uSurpInc> + <VariousControls> + <MiscControls></MiscControls> + <Define></Define> + <Undefine></Undefine> + <IncludePath></IncludePath> + </VariousControls> + </Aads> + <LDads> + <umfTarg>1</umfTarg> + <Ropi>0</Ropi> + <Rwpi>0</Rwpi> + <noStLib>0</noStLib> + <RepFail>1</RepFail> + <useFile>0</useFile> + <TextAddressRange>0x00000000</TextAddressRange> + <DataAddressRange>0x00000000</DataAddressRange> + <ScatterFile></ScatterFile> + <IncludeLibs></IncludeLibs> + <IncludeLibsPath></IncludeLibsPath> + <Misc></Misc> + <LinkerInputFile></LinkerInputFile> + <DisabledWarnings></DisabledWarnings> + </LDads> + </TargetArmAds> + </TargetOption> + <Groups> + <Group> + <GroupName>Startup</GroupName> + <Files> + <File> + <FileName>startup_CMSDK_CM0.s</FileName> + <FileType>2</FileType> + <FilePath>..\..\..\..\software\cmsis\Device\ARM\CMSDK_CM0\Source\ARM\startup_CMSDK_CM0.s</FilePath> + </File> + </Files> + </Group> + <Group> + <GroupName>Application</GroupName> + <Files> + <File> + <FileName>watchdog_demo.c</FileName> + <FileType>1</FileType> + <FilePath>..\..\..\..\software\common\demos\watchdog_demo.c</FilePath> + </File> + <File> + <FileName>uart_stdout.c</FileName> + <FileType>1</FileType> + <FilePath>..\..\..\..\software\common\retarget\uart_stdout.c</FilePath> + </File> + <File> + <FileName>retarget.c</FileName> + <FileType>1</FileType> + <FilePath>..\..\..\..\software\common\retarget\retarget.c</FilePath> + </File> + </Files> + </Group> + <Group> + <GroupName>System</GroupName> + <Files> + <File> + <FileName>system_CMSDK_CM0.c</FileName> + <FileType>1</FileType> + <FilePath>..\..\..\..\software\cmsis\Device\ARM\CMSDK_CM0\Source\system_CMSDK_CM0.c</FilePath> + </File> + </Files> + </Group> + </Groups> + </Target> + </Targets> + +</Project> diff --git a/Cortex-M0/nanosoc/systems/mcu/testcodes/watchdog_demo/watchdog_demo_cm0p.uvopt b/Cortex-M0/nanosoc/systems/mcu/testcodes/watchdog_demo/watchdog_demo_cm0p.uvopt new file mode 100644 index 0000000..5b4434b --- /dev/null +++ b/Cortex-M0/nanosoc/systems/mcu/testcodes/watchdog_demo/watchdog_demo_cm0p.uvopt @@ -0,0 +1,244 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no" ?> +<ProjectOpt xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="project_opt.xsd"> + + <SchemaVersion>1.0</SchemaVersion> + + <Header>### uVision Project, (C) Keil Software</Header> + + <Extensions> + <cExt>*.c</cExt> + <aExt>*.s*; *.src; *.a*</aExt> + <oExt>*.obj</oExt> + <lExt>*.lib</lExt> + <tExt>*.txt; *.h; *.inc</tExt> + <pExt>*.plm</pExt> + <CppX>*.cpp</CppX> + </Extensions> + + <DaveTm> + <dwLowDateTime>0</dwLowDateTime> + <dwHighDateTime>0</dwHighDateTime> + </DaveTm> + + <Target> + <TargetName>Debug</TargetName> + <ToolsetNumber>0x4</ToolsetNumber> + <ToolsetName>ARM-ADS</ToolsetName> + <TargetOption> + <CLKADS>50000000</CLKADS> + <OPTTT> + <gFlags>1</gFlags> + <BeepAtEnd>1</BeepAtEnd> + <RunSim>1</RunSim> + <RunTarget>0</RunTarget> + </OPTTT> + <OPTHX> + <HexSelection>1</HexSelection> + <FlashByte>65535</FlashByte> + <HexRangeLowAddress>0</HexRangeLowAddress> + <HexRangeHighAddress>0</HexRangeHighAddress> + <HexOffset>0</HexOffset> + </OPTHX> + <OPTLEX> + <PageWidth>79</PageWidth> + <PageLength>66</PageLength> + <TabStop>8</TabStop> + <ListingPath>.\</ListingPath> + </OPTLEX> + <ListingPage> + <CreateCListing>1</CreateCListing> + <CreateAListing>1</CreateAListing> + <CreateLListing>1</CreateLListing> + <CreateIListing>0</CreateIListing> + <AsmCond>1</AsmCond> + <AsmSymb>1</AsmSymb> + <AsmXref>0</AsmXref> + <CCond>1</CCond> + <CCode>0</CCode> + <CListInc>0</CListInc> + <CSymb>0</CSymb> + <LinkerCodeListing>0</LinkerCodeListing> + </ListingPage> + <OPTXL> + <LMap>1</LMap> + <LComments>1</LComments> + <LGenerateSymbols>1</LGenerateSymbols> + <LLibSym>1</LLibSym> + <LLines>1</LLines> + <LLocSym>1</LLocSym> + <LPubSym>1</LPubSym> + <LXref>0</LXref> + <LExpSel>0</LExpSel> + </OPTXL> + <OPTFL> + <tvExp>1</tvExp> + <tvExpOptDlg>0</tvExpOptDlg> + <IsCurrentTarget>1</IsCurrentTarget> + </OPTFL> + <CpuCode>255</CpuCode> + <DllOpt> + <SimDllName>SARMCM3.DLL</SimDllName> + <SimDllArguments></SimDllArguments> + <SimDlgDllName>DARMCM1.DLL</SimDlgDllName> + <SimDlgDllArguments></SimDlgDllArguments> + <TargetDllName>SARMCM3.DLL</TargetDllName> + <TargetDllArguments></TargetDllArguments> + <TargetDlgDllName>TARMCM1.DLL</TargetDlgDllName> + <TargetDlgDllArguments></TargetDlgDllArguments> + </DllOpt> + <DebugOpt> + <uSim>1</uSim> + <uTrg>0</uTrg> + <sLdApp>1</sLdApp> + <sGomain>1</sGomain> + <sRbreak>1</sRbreak> + <sRwatch>1</sRwatch> + <sRmem>1</sRmem> + <sRfunc>1</sRfunc> + <sRbox>1</sRbox> + <tLdApp>1</tLdApp> + <tGomain>0</tGomain> + <tRbreak>1</tRbreak> + <tRwatch>1</tRwatch> + <tRmem>1</tRmem> + <tRfunc>0</tRfunc> + <tRbox>1</tRbox> + <sRunDeb>0</sRunDeb> + <sLrtime>0</sLrtime> + <nTsel>-1</nTsel> + <sDll></sDll> + <sDllPa></sDllPa> + <sDlgDll></sDlgDll> + <sDlgPa></sDlgPa> + <sIfile></sIfile> + <tDll></tDll> + <tDllPa></tDllPa> + <tDlgDll></tDlgDll> + <tDlgPa></tDlgPa> + <tIfile></tIfile> + <pMon></pMon> + </DebugOpt> + <Breakpoint/> + <DebugFlag> + <trace>0</trace> + <periodic>1</periodic> + <aLwin>0</aLwin> + <aCover>0</aCover> + <aSer1>0</aSer1> + <aSer2>0</aSer2> + <aPa>0</aPa> + <viewmode>0</viewmode> + <vrSel>0</vrSel> + <aSym>0</aSym> + <aTbox>0</aTbox> + <AscS1>0</AscS1> + <AscS2>0</AscS2> + <AscS3>0</AscS3> + <aSer3>0</aSer3> + <eProf>0</eProf> + <aLa>0</aLa> + <aPa1>0</aPa1> + <AscS4>0</AscS4> + <aSer4>0</aSer4> + <StkLoc>0</StkLoc> + <TrcWin>0</TrcWin> + <newCpu>0</newCpu> + <uProt>0</uProt> + </DebugFlag> + <LintExecutable></LintExecutable> + <LintConfigFile></LintConfigFile> + </TargetOption> + </Target> + + <Group> + <GroupName>Startup</GroupName> + <tvExp>1</tvExp> + <tvExpOptDlg>0</tvExpOptDlg> + <cbSel>0</cbSel> + <File> + <GroupNumber>1</GroupNumber> + <FileNumber>1</FileNumber> + <FileType>2</FileType> + <tvExp>0</tvExp> + <Focus>0</Focus> + <ColumnNumber>0</ColumnNumber> + <tvExpOptDlg>0</tvExpOptDlg> + <TopLine>0</TopLine> + <CurrentLine>0</CurrentLine> + <bDave2>0</bDave2> + <PathWithFileName>..\..\..\..\software\cmsis\Device\ARM\CMSDK_CM0plus\Source\ARM\startup_CMSDK_CM0plus.s</PathWithFileName> + <FilenameWithoutPath>startup_CMSDK_CM0plus.s</FilenameWithoutPath> + </File> + </Group> + + <Group> + <GroupName>Application</GroupName> + <tvExp>1</tvExp> + <tvExpOptDlg>0</tvExpOptDlg> + <cbSel>0</cbSel> + <File> + <GroupNumber>2</GroupNumber> + <FileNumber>2</FileNumber> + <FileType>1</FileType> + <tvExp>0</tvExp> + <Focus>0</Focus> + <ColumnNumber>0</ColumnNumber> + <tvExpOptDlg>0</tvExpOptDlg> + <TopLine>0</TopLine> + <CurrentLine>0</CurrentLine> + <bDave2>0</bDave2> + <PathWithFileName>..\..\..\..\software\common\demos\watchdog_demo.c</PathWithFileName> + <FilenameWithoutPath>watchdog_demo.c</FilenameWithoutPath> + </File> + <File> + <GroupNumber>2</GroupNumber> + <FileNumber>3</FileNumber> + <FileType>1</FileType> + <tvExp>0</tvExp> + <Focus>0</Focus> + <ColumnNumber>0</ColumnNumber> + <tvExpOptDlg>0</tvExpOptDlg> + <TopLine>0</TopLine> + <CurrentLine>0</CurrentLine> + <bDave2>0</bDave2> + <PathWithFileName>..\..\..\..\software\common\retarget\uart_stdout.c</PathWithFileName> + <FilenameWithoutPath>uart_stdout.c</FilenameWithoutPath> + </File> + <File> + <GroupNumber>2</GroupNumber> + <FileNumber>4</FileNumber> + <FileType>1</FileType> + <tvExp>0</tvExp> + <Focus>0</Focus> + <ColumnNumber>0</ColumnNumber> + <tvExpOptDlg>0</tvExpOptDlg> + <TopLine>0</TopLine> + <CurrentLine>0</CurrentLine> + <bDave2>0</bDave2> + <PathWithFileName>..\..\..\..\software\common\retarget\retarget.c</PathWithFileName> + <FilenameWithoutPath>retarget.c</FilenameWithoutPath> + </File> + </Group> + + <Group> + <GroupName>System</GroupName> + <tvExp>1</tvExp> + <tvExpOptDlg>0</tvExpOptDlg> + <cbSel>0</cbSel> + <File> + <GroupNumber>3</GroupNumber> + <FileNumber>5</FileNumber> + <FileType>1</FileType> + <tvExp>0</tvExp> + <Focus>0</Focus> + <ColumnNumber>0</ColumnNumber> + <tvExpOptDlg>0</tvExpOptDlg> + <TopLine>0</TopLine> + <CurrentLine>0</CurrentLine> + <bDave2>0</bDave2> + <PathWithFileName>..\..\..\..\software\cmsis\Device\ARM\CMSDK_CM0plus\Source\system_CMSDK_CM0plus.c</PathWithFileName> + <FilenameWithoutPath>system_CMSDK_CM0plus.c</FilenameWithoutPath> + </File> + </Group> + +</ProjectOpt> diff --git a/Cortex-M0/nanosoc/systems/mcu/testcodes/watchdog_demo/watchdog_demo_cm0p.uvproj b/Cortex-M0/nanosoc/systems/mcu/testcodes/watchdog_demo/watchdog_demo_cm0p.uvproj new file mode 100644 index 0000000..82c742c --- /dev/null +++ b/Cortex-M0/nanosoc/systems/mcu/testcodes/watchdog_demo/watchdog_demo_cm0p.uvproj @@ -0,0 +1,432 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no" ?> +<Project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="project_proj.xsd"> + + <SchemaVersion>1.1</SchemaVersion> + + <Header>### uVision Project, (C) Keil Software</Header> + + <Targets> + <Target> + <TargetName>Debug</TargetName> + <ToolsetNumber>0x4</ToolsetNumber> + <ToolsetName>ARM-ADS</ToolsetName> + <TargetOption> + <TargetCommonOption> + <Device>Cortex-M0+</Device> + <Vendor>ARM</Vendor> + <Cpu>CLOCK(12000000) CPUTYPE("Cortex-M0+") ESEL ELITTLE</Cpu> + <FlashUtilSpec></FlashUtilSpec> + <StartupFile></StartupFile> + <FlashDriverDll></FlashDriverDll> + <DeviceId>6268</DeviceId> + <RegisterFile></RegisterFile> + <MemoryEnv></MemoryEnv> + <Cmp></Cmp> + <Asm></Asm> + <Linker></Linker> + <OHString></OHString> + <InfinionOptionDll></InfinionOptionDll> + <SLE66CMisc></SLE66CMisc> + <SLE66AMisc></SLE66AMisc> + <SLE66LinkerMisc></SLE66LinkerMisc> + <SFDFile></SFDFile> + <UseEnv>0</UseEnv> + <BinPath></BinPath> + <IncludePath></IncludePath> + <LibPath></LibPath> + <RegisterFilePath></RegisterFilePath> + <DBRegisterFilePath></DBRegisterFilePath> + <TargetStatus> + <Error>0</Error> + <ExitCodeStop>0</ExitCodeStop> + <ButtonStop>0</ButtonStop> + <NotGenerated>0</NotGenerated> + <InvalidFlash>1</InvalidFlash> + </TargetStatus> + <OutputDirectory>.\</OutputDirectory> + <OutputName>watchdog_demo</OutputName> + <CreateExecutable>1</CreateExecutable> + <CreateLib>0</CreateLib> + <CreateHexFile>0</CreateHexFile> + <DebugInformation>1</DebugInformation> + <BrowseInformation>1</BrowseInformation> + <ListingPath>.\</ListingPath> + <HexFormatSelection>1</HexFormatSelection> + <Merge32K>0</Merge32K> + <CreateBatchFile>0</CreateBatchFile> + <BeforeCompile> + <RunUserProg1>0</RunUserProg1> + <RunUserProg2>0</RunUserProg2> + <UserProg1Name></UserProg1Name> + <UserProg2Name></UserProg2Name> + <UserProg1Dos16Mode>0</UserProg1Dos16Mode> + <UserProg2Dos16Mode>0</UserProg2Dos16Mode> + <nStopU1X>0</nStopU1X> + <nStopU2X>0</nStopU2X> + </BeforeCompile> + <BeforeMake> + <RunUserProg1>0</RunUserProg1> + <RunUserProg2>0</RunUserProg2> + <UserProg1Name></UserProg1Name> + <UserProg2Name></UserProg2Name> + <UserProg1Dos16Mode>0</UserProg1Dos16Mode> + <UserProg2Dos16Mode>0</UserProg2Dos16Mode> + </BeforeMake> + <AfterMake> + <RunUserProg1>1</RunUserProg1> + <RunUserProg2>0</RunUserProg2> + <UserProg1Name>$K\ARM\ARMCC\BIN\fromelf.exe #L --vhx --8x1 --output watchdog_demo.hex</UserProg1Name> + <UserProg2Name></UserProg2Name> + <UserProg1Dos16Mode>0</UserProg1Dos16Mode> + <UserProg2Dos16Mode>0</UserProg2Dos16Mode> + </AfterMake> + <SelectedForBatchBuild>0</SelectedForBatchBuild> + <SVCSIdString></SVCSIdString> + </TargetCommonOption> + <CommonProperty> + <UseCPPCompiler>0</UseCPPCompiler> + <RVCTCodeConst>0</RVCTCodeConst> + <RVCTZI>0</RVCTZI> + <RVCTOtherData>0</RVCTOtherData> + <ModuleSelection>0</ModuleSelection> + <IncludeInBuild>1</IncludeInBuild> + <AlwaysBuild>0</AlwaysBuild> + <GenerateAssemblyFile>0</GenerateAssemblyFile> + <AssembleAssemblyFile>0</AssembleAssemblyFile> + <PublicsOnly>0</PublicsOnly> + <StopOnExitCode>3</StopOnExitCode> + <CustomArgument></CustomArgument> + <IncludeLibraryModules></IncludeLibraryModules> + </CommonProperty> + <DllOption> + <SimDllName>SARMCM3.DLL</SimDllName> + <SimDllArguments></SimDllArguments> + <SimDlgDll>DARMCM1.DLL</SimDlgDll> + <SimDlgDllArguments></SimDlgDllArguments> + <TargetDllName>SARMCM3.DLL</TargetDllName> + <TargetDllArguments></TargetDllArguments> + <TargetDlgDll>TARMCM1.DLL</TargetDlgDll> + <TargetDlgDllArguments></TargetDlgDllArguments> + </DllOption> + <DebugOption> + <OPTHX> + <HexSelection>1</HexSelection> + <HexRangeLowAddress>0</HexRangeLowAddress> + <HexRangeHighAddress>0</HexRangeHighAddress> + <HexOffset>0</HexOffset> + <Oh166RecLen>16</Oh166RecLen> + </OPTHX> + <Simulator> + <UseSimulator>1</UseSimulator> + <LoadApplicationAtStartup>1</LoadApplicationAtStartup> + <RunToMain>1</RunToMain> + <RestoreBreakpoints>1</RestoreBreakpoints> + <RestoreWatchpoints>1</RestoreWatchpoints> + <RestoreMemoryDisplay>1</RestoreMemoryDisplay> + <RestoreFunctions>1</RestoreFunctions> + <RestoreToolbox>1</RestoreToolbox> + <LimitSpeedToRealTime>0</LimitSpeedToRealTime> + </Simulator> + <Target> + <UseTarget>0</UseTarget> + <LoadApplicationAtStartup>1</LoadApplicationAtStartup> + <RunToMain>0</RunToMain> + <RestoreBreakpoints>1</RestoreBreakpoints> + <RestoreWatchpoints>1</RestoreWatchpoints> + <RestoreMemoryDisplay>1</RestoreMemoryDisplay> + <RestoreFunctions>0</RestoreFunctions> + <RestoreToolbox>1</RestoreToolbox> + </Target> + <RunDebugAfterBuild>0</RunDebugAfterBuild> + <TargetSelection>-1</TargetSelection> + <SimDlls> + <CpuDll></CpuDll> + <CpuDllArguments></CpuDllArguments> + <PeripheralDll></PeripheralDll> + <PeripheralDllArguments></PeripheralDllArguments> + <InitializationFile></InitializationFile> + </SimDlls> + <TargetDlls> + <CpuDll></CpuDll> + <CpuDllArguments></CpuDllArguments> + <PeripheralDll></PeripheralDll> + <PeripheralDllArguments></PeripheralDllArguments> + <InitializationFile></InitializationFile> + <Driver></Driver> + </TargetDlls> + </DebugOption> + <Utilities> + <Flash1> + <UseTargetDll>0</UseTargetDll> + <UseExternalTool>0</UseExternalTool> + <RunIndependent>0</RunIndependent> + <UpdateFlashBeforeDebugging>0</UpdateFlashBeforeDebugging> + <Capability>0</Capability> + <DriverSelection>-1</DriverSelection> + </Flash1> + <Flash2></Flash2> + <Flash3></Flash3> + <Flash4></Flash4> + </Utilities> + <TargetArmAds> + <ArmAdsMisc> + <GenerateListings>0</GenerateListings> + <asHll>1</asHll> + <asAsm>1</asAsm> + <asMacX>1</asMacX> + <asSyms>1</asSyms> + <asFals>1</asFals> + <asDbgD>1</asDbgD> + <asForm>1</asForm> + <ldLst>0</ldLst> + <ldmm>1</ldmm> + <ldXref>1</ldXref> + <BigEnd>0</BigEnd> + <AdsALst>1</AdsALst> + <AdsACrf>1</AdsACrf> + <AdsANop>0</AdsANop> + <AdsANot>0</AdsANot> + <AdsLLst>1</AdsLLst> + <AdsLmap>1</AdsLmap> + <AdsLcgr>1</AdsLcgr> + <AdsLsym>1</AdsLsym> + <AdsLszi>1</AdsLszi> + <AdsLtoi>1</AdsLtoi> + <AdsLsun>1</AdsLsun> + <AdsLven>1</AdsLven> + <AdsLsxf>1</AdsLsxf> + <RvctClst>0</RvctClst> + <GenPPlst>0</GenPPlst> + <AdsCpuType>"Cortex-M0+"</AdsCpuType> + <RvctDeviceName></RvctDeviceName> + <mOS>0</mOS> + <uocRom>0</uocRom> + <uocRam>0</uocRam> + <hadIROM>0</hadIROM> + <hadIRAM>0</hadIRAM> + <hadXRAM>0</hadXRAM> + <uocXRam>0</uocXRam> + <RvdsVP>0</RvdsVP> + <hadIRAM2>0</hadIRAM2> + <hadIROM2>0</hadIROM2> + <StupSel>1</StupSel> + <useUlib>0</useUlib> + <EndSel>1</EndSel> + <uLtcg>0</uLtcg> + <RoSelD>0</RoSelD> + <RwSelD>5</RwSelD> + <CodeSel>0</CodeSel> + <OptFeed>0</OptFeed> + <NoZi1>0</NoZi1> + <NoZi2>0</NoZi2> + <NoZi3>0</NoZi3> + <NoZi4>0</NoZi4> + <NoZi5>0</NoZi5> + <Ro1Chk>1</Ro1Chk> + <Ro2Chk>0</Ro2Chk> + <Ro3Chk>0</Ro3Chk> + <Ir1Chk>0</Ir1Chk> + <Ir2Chk>0</Ir2Chk> + <Ra1Chk>1</Ra1Chk> + <Ra2Chk>0</Ra2Chk> + <Ra3Chk>0</Ra3Chk> + <Im1Chk>0</Im1Chk> + <Im2Chk>0</Im2Chk> + <OnChipMemories> + <Ocm1> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </Ocm1> + <Ocm2> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </Ocm2> + <Ocm3> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </Ocm3> + <Ocm4> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </Ocm4> + <Ocm5> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </Ocm5> + <Ocm6> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </Ocm6> + <IRAM> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </IRAM> + <IROM> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </IROM> + <XRAM> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </XRAM> + <OCR_RVCT1> + <Type>1</Type> + <StartAddress>0x0</StartAddress> + <Size>0x10000</Size> + </OCR_RVCT1> + <OCR_RVCT2> + <Type>1</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </OCR_RVCT2> + <OCR_RVCT3> + <Type>1</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </OCR_RVCT3> + <OCR_RVCT4> + <Type>1</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </OCR_RVCT4> + <OCR_RVCT5> + <Type>1</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </OCR_RVCT5> + <OCR_RVCT6> + <Type>0</Type> + <StartAddress>0x20000000</StartAddress> + <Size>0x10000</Size> + </OCR_RVCT6> + <OCR_RVCT7> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </OCR_RVCT7> + <OCR_RVCT8> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </OCR_RVCT8> + <OCR_RVCT9> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </OCR_RVCT9> + <OCR_RVCT10> + <Type>0</Type> + <StartAddress>0x0</StartAddress> + <Size>0x0</Size> + </OCR_RVCT10> + </OnChipMemories> + <RvctStartVector></RvctStartVector> + </ArmAdsMisc> + <Cads> + <interw>1</interw> + <Optim>4</Optim> + <oTime>0</oTime> + <SplitLS>0</SplitLS> + <OneElfS>0</OneElfS> + <Strict>0</Strict> + <EnumInt>0</EnumInt> + <PlainCh>0</PlainCh> + <Ropi>0</Ropi> + <Rwpi>0</Rwpi> + <wLevel>0</wLevel> + <uThumb>0</uThumb> + <VariousControls> + <MiscControls></MiscControls> + <Define>CORTEX_M0PLUS</Define> + <Undefine></Undefine> + <IncludePath>..\..\..\..\software\cmsis\CMSIS\Include; ..\..\..\..\software\cmsis\Device\ARM\CMSDK_CM0plus\Include; ..\..\..\..\software\common\retarget</IncludePath> + </VariousControls> + </Cads> + <Aads> + <interw>1</interw> + <Ropi>0</Ropi> + <Rwpi>0</Rwpi> + <thumb>0</thumb> + <SplitLS>0</SplitLS> + <SwStkChk>0</SwStkChk> + <NoWarn>0</NoWarn> + <VariousControls> + <MiscControls></MiscControls> + <Define></Define> + <Undefine></Undefine> + <IncludePath></IncludePath> + </VariousControls> + </Aads> + <LDads> + <umfTarg>1</umfTarg> + <Ropi>0</Ropi> + <Rwpi>0</Rwpi> + <noStLib>0</noStLib> + <RepFail>1</RepFail> + <useFile>0</useFile> + <TextAddressRange>0x00000000</TextAddressRange> + <DataAddressRange>0x00000000</DataAddressRange> + <ScatterFile></ScatterFile> + <IncludeLibs></IncludeLibs> + <IncludeLibsPath></IncludeLibsPath> + <Misc></Misc> + <LinkerInputFile></LinkerInputFile> + <DisabledWarnings></DisabledWarnings> + </LDads> + </TargetArmAds> + </TargetOption> + <Groups> + <Group> + <GroupName>Startup</GroupName> + <Files> + <File> + <FileName>startup_CMSDK_CM0plus.s</FileName> + <FileType>2</FileType> + <FilePath>..\..\..\..\software\cmsis\Device\ARM\CMSDK_CM0plus\Source\ARM\startup_CMSDK_CM0plus.s</FilePath> + </File> + </Files> + </Group> + <Group> + <GroupName>Application</GroupName> + <Files> + <File> + <FileName>watchdog_demo.c</FileName> + <FileType>1</FileType> + <FilePath>..\..\..\..\software\common\demos\watchdog_demo.c</FilePath> + </File> + <File> + <FileName>uart_stdout.c</FileName> + <FileType>1</FileType> + <FilePath>..\..\..\..\software\common\retarget\uart_stdout.c</FilePath> + </File> + <File> + <FileName>retarget.c</FileName> + <FileType>1</FileType> + <FilePath>..\..\..\..\software\common\retarget\retarget.c</FilePath> + </File> + </Files> + </Group> + <Group> + <GroupName>System</GroupName> + <Files> + <File> + <FileName>system_CMSDK_CM0plus.c</FileName> + <FileType>1</FileType> + <FilePath>..\..\..\..\software\cmsis\Device\ARM\CMSDK_CM0plus\Source\system_CMSDK_CM0plus.c</FilePath> + </File> + </Files> + </Group> + </Groups> + </Target> + </Targets> + +</Project> diff --git a/Cortex-M0/nanosoc/systems/mcu/tools/setup_ds5_tools.scr b/Cortex-M0/nanosoc/systems/mcu/tools/setup_ds5_tools.scr new file mode 100644 index 0000000..477a508 --- /dev/null +++ b/Cortex-M0/nanosoc/systems/mcu/tools/setup_ds5_tools.scr @@ -0,0 +1,3 @@ +export ARM_PRODUCT_PATH=/apps/arm/developmentstudio-2021.0/sw/mappings +export ARM_TOOL_VARIANT=gold +export PATH=$PATH:/apps/arm/developmentstudio-2021.0/sw/ARMCompiler5.06u7/bin/ diff --git a/Cortex-M0/nanosoc/systems/mcu/v2html_doc.tgz b/Cortex-M0/nanosoc/systems/mcu/v2html_doc.tgz new file mode 100644 index 0000000000000000000000000000000000000000..182d8c652424d5ed3c4caf2b2d26d32de7d3df16 GIT binary patch literal 661430 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%0Av#$HX?y`SRe>OZ= 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	VJaxp;Pk*xmNR3+CsF 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%0D@(p~gYUCBZ~fl#C;vk4!;?pk-gKS%@8q)* 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	-PONcA{6Jw!YHB%HLLIZi<E2 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૗jOT2U$1{<&W@VzzrH*X2;Ej* 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 literal 0 HcmV?d00001 diff --git a/Cortex-M0/nanosoc/systems/mcu/verilog/ahb_bootrom.v b/Cortex-M0/nanosoc/systems/mcu/verilog/ahb_bootrom.v new file mode 100644 index 0000000..5031a98 --- /dev/null +++ b/Cortex-M0/nanosoc/systems/mcu/verilog/ahb_bootrom.v @@ -0,0 +1,29 @@ +module ahb_bootrom #( + // Parameters + parameter AW = 10 // Address width + ) + ( + input wire HCLK, // Clock + input wire HRESETn, // Reset + input wire HSEL, // Device select + input wire [AW-1:0] HADDR, // Address + input wire [1:0] HTRANS, // Transfer control + input wire [2:0] HSIZE, // Transfer size + input wire HWRITE, // Write control + input wire [31:0] HWDATA, // Write data - not used + input wire HREADY, // Transfer phase done + output wire HREADYOUT, // Device ready + output wire [31:0] HRDATA, // Read data output + output wire HRESP // Device response (always OKAY) +); + + bootrom u_bootrom ( + .CLK (HCLK), + .EN (HSEL & HTRANS[1] & HREADY & !HWRITE), + .ADDR (HADDR[AW-1:2]), + .RDATA (HRDATA) + ); + assign HREADYOUT = 1'b1; + assign HRESP = 1'b0; + +endmodule diff --git a/Cortex-M0/nanosoc/systems/mcu/verilog/bootrom.v b/Cortex-M0/nanosoc/systems/mcu/verilog/bootrom.v new file mode 100644 index 0000000..95919b7 --- /dev/null +++ b/Cortex-M0/nanosoc/systems/mcu/verilog/bootrom.v @@ -0,0 +1,277 @@ +//------------------------------------------------------------------------------------ +// customised auto-generated synthesizable ROM module abstraction +// A joint work commissioned on behalf of SoC Labs, under Arm Academic Access license. +// +// Contributors +// +// David Flynn (d.w.flynn@soton.ac.uk) +// Date: 2302101100 +// Copyright (c) 2021-2, SoC Labs (www.soclabs.org) +//------------------------------------------------------------------------------------ +module bootrom ( + input wire CLK, + input wire EN, + input wire [9:2] ADDR, + output reg [31:0] RDATA ); +reg [9:2] addr_r; +always @(posedge CLK) if (EN) addr_r <= ADDR; +always @(addr_r) case(addr_r[9:2]) + 8'h00 : RDATA <= 32'h30000368; // 0x0000 + 8'h01 : RDATA <= 32'h10000335; // 0x0004 + 8'h02 : RDATA <= 32'h1000033d; // 0x0008 + 8'h03 : RDATA <= 32'h1000033f; // 0x000c + 8'h04 : RDATA <= 32'h00000000; // 0x0010 + 8'h05 : RDATA <= 32'h00000000; // 0x0014 + 8'h06 : RDATA <= 32'h00000000; // 0x0018 + 8'h07 : RDATA <= 32'h00000000; // 0x001c + 8'h08 : RDATA <= 32'h00000000; // 0x0020 + 8'h09 : RDATA <= 32'h00000000; // 0x0024 + 8'h0a : RDATA <= 32'h00000000; // 0x0028 + 8'h0b : RDATA <= 32'h10000341; // 0x002c + 8'h0c : RDATA <= 32'h00000000; // 0x0030 + 8'h0d : RDATA <= 32'h00000000; // 0x0034 + 8'h0e : RDATA <= 32'h10000343; // 0x0038 + 8'h0f : RDATA <= 32'h10000345; // 0x003c + 8'h10 : RDATA <= 32'h10000347; // 0x0040 + 8'h11 : RDATA <= 32'h10000347; // 0x0044 + 8'h12 : RDATA <= 32'h10000347; // 0x0048 + 8'h13 : RDATA <= 32'h10000347; // 0x004c + 8'h14 : RDATA <= 32'h10000347; // 0x0050 + 8'h15 : RDATA <= 32'h10000347; // 0x0054 + 8'h16 : RDATA <= 32'h10000347; // 0x0058 + 8'h17 : RDATA <= 32'h10000347; // 0x005c + 8'h18 : RDATA <= 32'h10000347; // 0x0060 + 8'h19 : RDATA <= 32'h10000347; // 0x0064 + 8'h1a : RDATA <= 32'h10000347; // 0x0068 + 8'h1b : RDATA <= 32'h00000000; // 0x006c + 8'h1c : RDATA <= 32'h10000347; // 0x0070 + 8'h1d : RDATA <= 32'h10000347; // 0x0074 + 8'h1e : RDATA <= 32'h10000347; // 0x0078 + 8'h1f : RDATA <= 32'h10000347; // 0x007c + 8'h20 : RDATA <= 32'h10000347; // 0x0080 + 8'h21 : RDATA <= 32'h10000347; // 0x0084 + 8'h22 : RDATA <= 32'h10000347; // 0x0088 + 8'h23 : RDATA <= 32'h10000347; // 0x008c + 8'h24 : RDATA <= 32'h10000347; // 0x0090 + 8'h25 : RDATA <= 32'h10000347; // 0x0094 + 8'h26 : RDATA <= 32'h10000347; // 0x0098 + 8'h27 : RDATA <= 32'h10000347; // 0x009c + 8'h28 : RDATA <= 32'h10000347; // 0x00a0 + 8'h29 : RDATA <= 32'h10000347; // 0x00a4 + 8'h2a : RDATA <= 32'h10000347; // 0x00a8 + 8'h2b : RDATA <= 32'h10000347; // 0x00ac + 8'h2c : RDATA <= 32'h10000347; // 0x00b0 + 8'h2d : RDATA <= 32'h10000347; // 0x00b4 + 8'h2e : RDATA <= 32'h10000347; // 0x00b8 + 8'h2f : RDATA <= 32'h10000347; // 0x00bc + 8'h30 : RDATA <= 32'hf802f000; // 0x00c0 + 8'h31 : RDATA <= 32'hf83ef000; // 0x00c4 + 8'h32 : RDATA <= 32'hc830a00c; // 0x00c8 + 8'h33 : RDATA <= 32'h18243808; // 0x00cc + 8'h34 : RDATA <= 32'h46a2182d; // 0x00d0 + 8'h35 : RDATA <= 32'h46ab1e67; // 0x00d4 + 8'h36 : RDATA <= 32'h465d4654; // 0x00d8 + 8'h37 : RDATA <= 32'hd10142ac; // 0x00dc + 8'h38 : RDATA <= 32'hf830f000; // 0x00e0 + 8'h39 : RDATA <= 32'h3e0f467e; // 0x00e4 + 8'h3a : RDATA <= 32'h46b6cc0f; // 0x00e8 + 8'h3b : RDATA <= 32'h42332601; // 0x00ec + 8'h3c : RDATA <= 32'h1afbd000; // 0x00f0 + 8'h3d : RDATA <= 32'h46ab46a2; // 0x00f4 + 8'h3e : RDATA <= 32'h47184333; // 0x00f8 + 8'h3f : RDATA <= 32'h000002dc; // 0x00fc + 8'h40 : RDATA <= 32'h000002fc; // 0x0100 + 8'h41 : RDATA <= 32'hd3023a10; // 0x0104 + 8'h42 : RDATA <= 32'hc178c878; // 0x0108 + 8'h43 : RDATA <= 32'h0752d8fa; // 0x010c + 8'h44 : RDATA <= 32'hc830d301; // 0x0110 + 8'h45 : RDATA <= 32'hd501c130; // 0x0114 + 8'h46 : RDATA <= 32'h600c6804; // 0x0118 + 8'h47 : RDATA <= 32'h00004770; // 0x011c + 8'h48 : RDATA <= 32'h24002300; // 0x0120 + 8'h49 : RDATA <= 32'h26002500; // 0x0124 + 8'h4a : RDATA <= 32'hd3013a10; // 0x0128 + 8'h4b : RDATA <= 32'hd8fbc178; // 0x012c + 8'h4c : RDATA <= 32'hd3000752; // 0x0130 + 8'h4d : RDATA <= 32'hd500c130; // 0x0134 + 8'h4e : RDATA <= 32'h4770600b; // 0x0138 + 8'h4f : RDATA <= 32'hbd1fb51f; // 0x013c + 8'h50 : RDATA <= 32'hbd10b510; // 0x0140 + 8'h51 : RDATA <= 32'hf915f000; // 0x0144 + 8'h52 : RDATA <= 32'hf7ff4611; // 0x0148 + 8'h53 : RDATA <= 32'hf000fff7; // 0x014c + 8'h54 : RDATA <= 32'hf000f868; // 0x0150 + 8'h55 : RDATA <= 32'hb403f92d; // 0x0154 + 8'h56 : RDATA <= 32'hfff2f7ff; // 0x0158 + 8'h57 : RDATA <= 32'hf000bc03; // 0x015c + 8'h58 : RDATA <= 32'h0000f933; // 0x0160 + 8'h59 : RDATA <= 32'h68012000; // 0x0164 + 8'h5a : RDATA <= 32'h6841468d; // 0x0168 + 8'h5b : RDATA <= 32'h00004708; // 0x016c + 8'h5c : RDATA <= 32'h48532141; // 0x0170 + 8'h5d : RDATA <= 32'h61010149; // 0x0174 + 8'h5e : RDATA <= 32'h60812101; // 0x0178 + 8'h5f : RDATA <= 32'h60814851; // 0x017c + 8'h60 : RDATA <= 32'h20204951; // 0x0180 + 8'h61 : RDATA <= 32'h47706188; // 0x0184 + 8'h62 : RDATA <= 32'h684a494e; // 0x0188 + 8'h63 : RDATA <= 32'hd1fc07d2; // 0x018c + 8'h64 : RDATA <= 32'h07d2684a; // 0x0190 + 8'h65 : RDATA <= 32'h6008d100; // 0x0194 + 8'h66 : RDATA <= 32'h494a4770; // 0x0198 + 8'h67 : RDATA <= 32'h2b007803; // 0x019c + 8'h68 : RDATA <= 32'h684ad009; // 0x01a0 + 8'h69 : RDATA <= 32'hd1fc07d2; // 0x01a4 + 8'h6a : RDATA <= 32'h07d2684a; // 0x01a8 + 8'h6b : RDATA <= 32'h600bd100; // 0x01ac + 8'h6c : RDATA <= 32'h2b001c40; // 0x01b0 + 8'h6d : RDATA <= 32'h4770d1f2; // 0x01b4 + 8'h6e : RDATA <= 32'h4c44b510; // 0x01b8 + 8'h6f : RDATA <= 32'h48416821; // 0x01bc + 8'h70 : RDATA <= 32'hd00a2900; // 0x01c0 + 8'h71 : RDATA <= 32'h781aa342; // 0x01c4 + 8'h72 : RDATA <= 32'hd0212a00; // 0x01c8 + 8'h73 : RDATA <= 32'h07c96841; // 0x01cc + 8'h74 : RDATA <= 32'h6841d1fc; // 0x01d0 + 8'h75 : RDATA <= 32'hd01707c9; // 0x01d4 + 8'h76 : RDATA <= 32'ha341e017; // 0x01d8 + 8'h77 : RDATA <= 32'h2a00781a; // 0x01dc + 8'h78 : RDATA <= 32'h6841d009; // 0x01e0 + 8'h79 : RDATA <= 32'hd1fc07c9; // 0x01e4 + 8'h7a : RDATA <= 32'h07c96841; // 0x01e8 + 8'h7b : RDATA <= 32'h6002d100; // 0x01ec + 8'h7c : RDATA <= 32'h2a001c5b; // 0x01f0 + 8'h7d : RDATA <= 32'h2204d1f2; // 0x01f4 + 8'h7e : RDATA <= 32'h07c96841; // 0x01f8 + 8'h7f : RDATA <= 32'h6841d1fc; // 0x01fc + 8'h80 : RDATA <= 32'hd10007c9; // 0x0200 + 8'h81 : RDATA <= 32'he7fe6002; // 0x0204 + 8'h82 : RDATA <= 32'h1c5b6002; // 0x0208 + 8'h83 : RDATA <= 32'hd1da2a00; // 0x020c + 8'h84 : RDATA <= 32'h60202000; // 0x0210 + 8'h85 : RDATA <= 32'h8f4ff3bf; // 0x0214 + 8'h86 : RDATA <= 32'h8f6ff3bf; // 0x0218 + 8'h87 : RDATA <= 32'hffa2f7ff; // 0x021c + 8'h88 : RDATA <= 32'hb510bd10; // 0x0220 + 8'h89 : RDATA <= 32'h48262141; // 0x0224 + 8'h8a : RDATA <= 32'h61010149; // 0x0228 + 8'h8b : RDATA <= 32'h60812101; // 0x022c + 8'h8c : RDATA <= 32'h60814824; // 0x0230 + 8'h8d : RDATA <= 32'h21204a24; // 0x0234 + 8'h8e : RDATA <= 32'ha32f6191; // 0x0238 + 8'h8f : RDATA <= 32'h2a00781a; // 0x023c + 8'h90 : RDATA <= 32'h6841d009; // 0x0240 + 8'h91 : RDATA <= 32'hd1fc07c9; // 0x0244 + 8'h92 : RDATA <= 32'h07c96841; // 0x0248 + 8'h93 : RDATA <= 32'h6002d100; // 0x024c + 8'h94 : RDATA <= 32'h2a001c5b; // 0x0250 + 8'h95 : RDATA <= 32'h4c1dd1f2; // 0x0254 + 8'h96 : RDATA <= 32'h29006821; // 0x0258 + 8'h97 : RDATA <= 32'ha31cd00a; // 0x025c + 8'h98 : RDATA <= 32'h2a00781a; // 0x0260 + 8'h99 : RDATA <= 32'h6841d021; // 0x0264 + 8'h9a : RDATA <= 32'hd1fc07c9; // 0x0268 + 8'h9b : RDATA <= 32'h07c96841; // 0x026c + 8'h9c : RDATA <= 32'he017d017; // 0x0270 + 8'h9d : RDATA <= 32'h781aa31a; // 0x0274 + 8'h9e : RDATA <= 32'hd0092a00; // 0x0278 + 8'h9f : RDATA <= 32'h07c96841; // 0x027c + 8'ha0 : RDATA <= 32'h6841d1fc; // 0x0280 + 8'ha1 : RDATA <= 32'hd10007c9; // 0x0284 + 8'ha2 : RDATA <= 32'h1c5b6002; // 0x0288 + 8'ha3 : RDATA <= 32'hd1f22a00; // 0x028c + 8'ha4 : RDATA <= 32'h68412204; // 0x0290 + 8'ha5 : RDATA <= 32'hd1fc07c9; // 0x0294 + 8'ha6 : RDATA <= 32'h07c96841; // 0x0298 + 8'ha7 : RDATA <= 32'h6002d100; // 0x029c + 8'ha8 : RDATA <= 32'h6002e7fe; // 0x02a0 + 8'ha9 : RDATA <= 32'h2a001c5b; // 0x02a4 + 8'haa : RDATA <= 32'h2000d1da; // 0x02a8 + 8'hab : RDATA <= 32'hf3bf6020; // 0x02ac + 8'hac : RDATA <= 32'hf3bf8f4f; // 0x02b0 + 8'had : RDATA <= 32'hf7ff8f6f; // 0x02b4 + 8'hae : RDATA <= 32'h2000ff55; // 0x02b8 + 8'haf : RDATA <= 32'h0000bd10; // 0x02bc + 8'hb0 : RDATA <= 32'h40006000; // 0x02c0 + 8'hb1 : RDATA <= 32'h4000e000; // 0x02c4 + 8'hb2 : RDATA <= 32'h40011000; // 0x02c8 + 8'hb3 : RDATA <= 32'h4001f000; // 0x02cc + 8'hb4 : RDATA <= 32'h52202a2a; // 0x02d0 + 8'hb5 : RDATA <= 32'h70616d65; // 0x02d4 + 8'hb6 : RDATA <= 32'h41523e2d; // 0x02d8 + 8'hb7 : RDATA <= 32'h000a324d; // 0x02dc + 8'hb8 : RDATA <= 32'h72724540; // 0x02e0 + 8'hb9 : RDATA <= 32'h203a726f; // 0x02e4 + 8'hba : RDATA <= 32'h414d4552; // 0x02e8 + 8'hbb : RDATA <= 32'h6c632050; // 0x02ec + 8'hbc : RDATA <= 32'h65726165; // 0x02f0 + 8'hbd : RDATA <= 32'h00000a64; // 0x02f4 + 8'hbe : RDATA <= 32'h530a0a0a; // 0x02f8 + 8'hbf : RDATA <= 32'h414c434f; // 0x02fc + 8'hc0 : RDATA <= 32'h203a5342; // 0x0300 + 8'hc1 : RDATA <= 32'h204d5241; // 0x0304 + 8'hc2 : RDATA <= 32'h74726f43; // 0x0308 + 8'hc3 : RDATA <= 32'h4d2d7865; // 0x030c + 8'hc4 : RDATA <= 32'h616e2030; // 0x0310 + 8'hc5 : RDATA <= 32'h6f736f6e; // 0x0314 + 8'hc6 : RDATA <= 32'h00000a63; // 0x0318 + 8'hc7 : RDATA <= 32'h48034904; // 0x031c + 8'hc8 : RDATA <= 32'h47706008; // 0x0320 + 8'hc9 : RDATA <= 32'h48014902; // 0x0324 + 8'hca : RDATA <= 32'h47706008; // 0x0328 + 8'hcb : RDATA <= 32'h05f5e100; // 0x032c + 8'hcc : RDATA <= 32'h30000000; // 0x0330 + 8'hcd : RDATA <= 32'h47804807; // 0x0334 + 8'hce : RDATA <= 32'h47004807; // 0x0338 + 8'hcf : RDATA <= 32'he7fee7fe; // 0x033c + 8'hd0 : RDATA <= 32'he7fee7fe; // 0x0340 + 8'hd1 : RDATA <= 32'he7fee7fe; // 0x0344 + 8'hd2 : RDATA <= 32'h49054804; // 0x0348 + 8'hd3 : RDATA <= 32'h4b064a05; // 0x034c + 8'hd4 : RDATA <= 32'h00004770; // 0x0350 + 8'hd5 : RDATA <= 32'h10000325; // 0x0354 + 8'hd6 : RDATA <= 32'h100000c1; // 0x0358 + 8'hd7 : RDATA <= 32'h30000068; // 0x035c + 8'hd8 : RDATA <= 32'h30000368; // 0x0360 + 8'hd9 : RDATA <= 32'h30000168; // 0x0364 + 8'hda : RDATA <= 32'h30000168; // 0x0368 + 8'hdb : RDATA <= 32'h47704770; // 0x036c + 8'hdc : RDATA <= 32'h46754770; // 0x0370 + 8'hdd : RDATA <= 32'hf824f000; // 0x0374 + 8'hde : RDATA <= 32'h000546ae; // 0x0378 + 8'hdf : RDATA <= 32'h46534669; // 0x037c + 8'he0 : RDATA <= 32'h00c008c0; // 0x0380 + 8'he1 : RDATA <= 32'hb0184685; // 0x0384 + 8'he2 : RDATA <= 32'hf7ffb520; // 0x0388 + 8'he3 : RDATA <= 32'hbc60ffdd; // 0x038c + 8'he4 : RDATA <= 32'h08492700; // 0x0390 + 8'he5 : RDATA <= 32'h260046b6; // 0x0394 + 8'he6 : RDATA <= 32'hc5c0c5c0; // 0x0398 + 8'he7 : RDATA <= 32'hc5c0c5c0; // 0x039c + 8'he8 : RDATA <= 32'hc5c0c5c0; // 0x03a0 + 8'he9 : RDATA <= 32'hc5c0c5c0; // 0x03a4 + 8'hea : RDATA <= 32'h00493d40; // 0x03a8 + 8'heb : RDATA <= 32'h4770468d; // 0x03ac + 8'hec : RDATA <= 32'h4604b510; // 0x03b0 + 8'hed : RDATA <= 32'h46c046c0; // 0x03b4 + 8'hee : RDATA <= 32'hf7ff4620; // 0x03b8 + 8'hef : RDATA <= 32'hbd10fecc; // 0x03bc + 8'hf0 : RDATA <= 32'h47704800; // 0x03c0 + 8'hf1 : RDATA <= 32'h30000004; // 0x03c4 + 8'hf2 : RDATA <= 32'h20184901; // 0x03c8 + 8'hf3 : RDATA <= 32'he7febeab; // 0x03cc + 8'hf4 : RDATA <= 32'h00020026; // 0x03d0 + 8'hf5 : RDATA <= 32'h00004770; // 0x03d4 + 8'hf6 : RDATA <= 32'h100003f8; // 0x03d8 + 8'hf7 : RDATA <= 32'h30000000; // 0x03dc + 8'hf8 : RDATA <= 32'h00000004; // 0x03e0 + 8'hf9 : RDATA <= 32'h10000104; // 0x03e4 + 8'hfa : RDATA <= 32'h100003fc; // 0x03e8 + 8'hfb : RDATA <= 32'h30000004; // 0x03ec + 8'hfc : RDATA <= 32'h00000364; // 0x03f0 + 8'hfd : RDATA <= 32'h10000120; // 0x03f4 + 8'hfe : RDATA <= 32'h05f5e100; // 0x03f8 + 8'hff : RDATA <= 32'h00000000; // 0x03fc + default : RDATA <=32'h0; + endcase +endmodule diff --git a/Cortex-M0/nanosoc/systems/mcu/verilog/cmsdk_ahb_cs_rom_table.v b/Cortex-M0/nanosoc/systems/mcu/verilog/cmsdk_ahb_cs_rom_table.v new file mode 100644 index 0000000..505b097 --- /dev/null +++ b/Cortex-M0/nanosoc/systems/mcu/verilog/cmsdk_ahb_cs_rom_table.v @@ -0,0 +1,272 @@ +//----------------------------------------------------------------------------- +// The confidential and proprietary information contained in this file may +// only be used by a person authorised under and to the extent permitted +// by a subsisting licensing agreement from Arm Limited or its affiliates. +// +// (C) COPYRIGHT 2013 Arm Limited or its affiliates. +// ALL RIGHTS RESERVED +// +// This entire notice must be reproduced on all copies of this file +// and copies of this file may only be made by a person if such person is +// permitted to do so under the terms of a subsisting license agreement +// from Arm Limited or its affiliates. +// +// SVN Information +// +// Checked In : $Date: 2011-11-03 16:07:17 +0000 (Thu, 03 Nov 2011) $ +// +// Revision : $Revision: 190657 $ +// +// Release Information : Cortex-M System Design Kit-r1p1-00rel0 +// +//----------------------------------------------------------------------------- + +//----------------------------------------------------------------------------- +// This block implements a Generic 4-entry AHB CoreSight ROM Table +//----------------------------------------------------------------------------- +// +// This example block occupies an 4kB space on the AHB bus at the address +// specified by the BASE[31:0] parameter. +// +// BASE[31:0] + 0x1000 +--------------------------------------+ +// | CID: CoreSight ROM Table | +// |--------------------------------------| +// | PID: Manufacturer and Partnumber | +// |--------------------------------------| +// . . +// . . +// . . +// |--------------------------------------| +// | Fourth Entry | +// BASE[31:0] + 0xC |--------------------------------------| +// | Third Entry | +// BASE[31:0] + 0x8 |--------------------------------------| +// | Second Entry | +// BASE[31:0] + 0x4 |--------------------------------------| +// | First Entry | +// BASE[31:0] +--------------------------------------+ +// +// +// The ROM table allows debug tools to identify the CoreSight components in +// a SoC or subsystem, and to identify the manufacturer and part and revision +// information for the SoC or subsystem. +// The PID fields include the manufacturer's JEDEC JEP106 identity code and +// manufacturer-defined partnumber and revision values. +// +// Considerations: +// +// To allow debug tools to discover the ROM table, it must be pointed to by +// another ROM table in the system, or by the BASEADDR pointer in the DAP. +// +// The ROM table contents must contain correct ID values. To allow for late +// changes (e.g. metal fixes) to be identified from the ID values, the +// ECOREVNUM bus should be easily identifiable and modifiable. +//----------------------------------------------------------------------------- + +module cmsdk_ahb_cs_rom_table + #( + // ------------------------------------------------------------ + // ROM Table BASE Address + // ------------------------------------------------------------ + parameter [31:0] BASE = 32'h00000000, + + // ------------------------------------------------------------ + // ROM Table Manufacturer, Part Number and Revision + // ------------------------------------------------------------ + parameter [6:0] JEPID = 7'b0000000, // JEP106 identity code + parameter [3:0] JEPCONTINUATION = 4'h0, // number of JEP106 + // continuation codes + parameter [11:0] PARTNUMBER = 12'h000, // part number + parameter [3:0] REVISION = 4'h0, // part revision + + // ------------------------------------------------------------ + // ROM Table entries: (Base Address | Present) + // ------------------------------------------------------------ + parameter [31:0] ENTRY0BASEADDR = 32'h00000000, + parameter ENTRY0PRESENT = 1'b0, + + parameter [31:0] ENTRY1BASEADDR = 32'h00000000, + parameter ENTRY1PRESENT = 1'b0, + + parameter [31:0] ENTRY2BASEADDR = 32'h00000000, + parameter ENTRY2PRESENT = 1'b0, + + parameter [31:0] ENTRY3BASEADDR = 32'h00000000, + parameter ENTRY3PRESENT = 1'b0 + ) + ( + input wire HCLK, // AHB clock + input wire HSEL, // AHB select + input wire [31:0] HADDR, // AHB address + input wire [ 2:0] HBURST, // AHB burst + input wire HMASTLOCK, // AHB lock + input wire [ 3:0] HPROT, // AHB prot + input wire [ 2:0] HSIZE, // AHB size + input wire [ 1:0] HTRANS, // AHB transfer + input wire [31:0] HWDATA, // AHB write data + input wire HWRITE, // AHB write + input wire HREADY, // AHB ready + input wire [ 3:0] ECOREVNUM, // part minor revision (metal fix) + output wire [31:0] HRDATA, // AHB read-data + output wire HRESP, // AHB response + output wire HREADYOUT); // AHB ready out + + // ------------------------------------------------------------ + // Local wires + // ------------------------------------------------------------ + reg [ 9:0] haddr_reg; + wire [31:0] rdata; + + + // ------------------------------------------------------------ + // ROM Tables + // ------------------------------------------------------------ + + // + // ROM Table Entry Calculation: + // + // Ref: ARM IHI0029B CoreSight Architecture Specification + // + // ROM table entry format: + // [31:12] Address Offset. Base address of highest 4KB block relative to ROM + // table address. + // [11: 2] RESERVED, RAZ + // [1] Format. 1=32-bit format + // [0] Entry Present. + // + // ComponentAddress = ROMAddress + (AddressOffset SHL 12) + // + + // Calculate address offset values + localparam [19:0] ENTRY0OFFSET = ENTRY0BASEADDR[31:12] - BASE[31:12]; + localparam [19:0] ENTRY1OFFSET = ENTRY1BASEADDR[31:12] - BASE[31:12]; + localparam [19:0] ENTRY2OFFSET = ENTRY2BASEADDR[31:12] - BASE[31:12]; + localparam [19:0] ENTRY3OFFSET = ENTRY3BASEADDR[31:12] - BASE[31:12]; + + // Construct entries + localparam [31:0] ENTRY0 = { ENTRY0OFFSET, 10'b0, 1'b1, ENTRY0PRESENT!=0 }; + localparam [31:0] ENTRY1 = { ENTRY1OFFSET, 10'b0, 1'b1, ENTRY1PRESENT!=0 }; + localparam [31:0] ENTRY2 = { ENTRY2OFFSET, 10'b0, 1'b1, ENTRY2PRESENT!=0 }; + localparam [31:0] ENTRY3 = { ENTRY3OFFSET, 10'b0, 1'b1, ENTRY3PRESENT!=0 }; + + + // ------------------------------------------------------------ + // AHB Interface + // ------------------------------------------------------------ + wire trans_valid = HSEL & HTRANS[1] & HREADY; + + always @(posedge HCLK) + if (trans_valid) + haddr_reg[9:0] <= HADDR[11:2]; + + assign HREADYOUT = 1'b1; + assign HRDATA = rdata; + assign HRESP = 1'b0; + + wire [11:0] word_addr = {haddr_reg, 2'b00}; + + // Make unused AHB-Lite signals obvious for Lint purposes + wire [66:0] unused = { HADDR[31:12], HADDR[1:0], HBURST[2:0], HMASTLOCK, + HPROT[3:0], HSIZE[2:0], HTRANS[0], HWDATA[31:0], + HWRITE }; + + + // ------------------------------------------------------------ + // ROM Table Content + // ------------------------------------------------------------ + + wire cid3_en = (word_addr[11:0] == 12'hFFC); + wire cid2_en = (word_addr[11:0] == 12'hFF8); + wire cid1_en = (word_addr[11:0] == 12'hFF4); + wire cid0_en = (word_addr[11:0] == 12'hFF0); + + wire pid7_en = (word_addr[11:0] == 12'hFDC); + wire pid6_en = (word_addr[11:0] == 12'hFD8); + wire pid5_en = (word_addr[11:0] == 12'hFD4); + wire pid4_en = (word_addr[11:0] == 12'hFD0); + wire pid3_en = (word_addr[11:0] == 12'hFEC); + wire pid2_en = (word_addr[11:0] == 12'hFE8); + wire pid1_en = (word_addr[11:0] == 12'hFE4); + wire pid0_en = (word_addr[11:0] == 12'hFE0); + + wire systemaccess_en = (word_addr[11:0] == 12'hFCC); + + wire entry0_en = (word_addr[11:0] == 12'h000); + wire entry1_en = (word_addr[11:0] == 12'h004); + wire entry2_en = (word_addr[11:0] == 12'h008); + wire entry3_en = (word_addr[11:0] == 12'h00C); + + wire [7:0] ids = + ( ( {8{cid3_en}} & 8'hB1 ) | // CID3 : Rom Table + ( {8{cid2_en}} & 8'h05 ) | // CID2 : Rom Table + ( {8{cid1_en}} & 8'h10 ) | // CID1 : Rom Table + ( {8{cid0_en}} & 8'h0D ) | // CID0 : Rom Table + + ( {8{pid7_en}} & 8'h00 ) | // PID7 : RESERVED + ( {8{pid6_en}} & 8'h00 ) | // PID6 : RESERVED + ( {8{pid5_en}} & 8'h00 ) | // PID5 : RESERVED + ( {8{pid4_en}} & { {4{1'b0}}, JEPCONTINUATION[3:0] } ) | + ( {8{pid3_en}} & { ECOREVNUM[3:0], {4{1'b0}} } ) | + ( {8{pid2_en}} & { REVISION[3:0], 1'b1, JEPID[6:4] } ) | + ( {8{pid1_en}} & { JEPID[3:0], PARTNUMBER[11:8] } ) | + ( {8{pid0_en}} & PARTNUMBER[7:0] ) + ); + + // + // Assign Read Data. Default value of 32'h00000000 + // corresponds to the End Of Table marker. + // + assign rdata[31:0] = + ( ( {{24{1'b0}}, ids[7:0] } ) | + ( {32{systemaccess_en}} & 32'h00000001 ) | + // Pointers to CoreSight Components + ( {32{entry0_en}} & ENTRY0[31:0] ) | + ( {32{entry1_en}} & ENTRY1[31:0] ) | + ( {32{entry2_en}} & ENTRY2[31:0] ) | + ( {32{entry3_en}} & ENTRY3[31:0] ) + ); + + // ------------------------------------------------------------------------- + +`ifdef ARM_ASSERT_ON + + // ------------------------------------------------------------------------- + // Assertions + // ------------------------------------------------------------------------- + + `include "std_ovl_defines.h" + + + // Addresses must always be 4KB aligned + assert_never + #(`OVL_FATAL,`OVL_ASSERT,"Rom Table BASE must be 4K aligned") + u_asrt_rom_table_base_alignment + (.clk(HCLK), .reset_n(1'b1), .test_expr(|BASE[11:0])); + + // Addresses must always be 4KB aligned + assert_never + #(`OVL_FATAL,`OVL_ASSERT,"Rom Table ENTRY0BASEADDR must be 4K aligned") + u_asrt_rom_table_entry0_alignment + (.clk(HCLK), .reset_n(1'b1), .test_expr(|ENTRY0BASEADDR[11:0])); + + // Addresses must always be 4KB aligned + assert_never + #(`OVL_FATAL,`OVL_ASSERT,"Rom Table ENTRY1BASEADDR must be 4K aligned") + u_asrt_rom_table_entry1_alignment + (.clk(HCLK), .reset_n(1'b1), .test_expr(|ENTRY1BASEADDR[11:0])); + + // Addresses must always be 4KB aligned + assert_never + #(`OVL_FATAL,`OVL_ASSERT,"Rom Table ENTRY2BASEADDR must be 4K aligned") + u_asrt_rom_table_entry2_alignment + (.clk(HCLK), .reset_n(1'b1), .test_expr(|ENTRY2BASEADDR[11:0])); + + // Addresses must always be 4KB aligned + assert_never + #(`OVL_FATAL,`OVL_ASSERT,"Rom Table ENTRY3BASEADDR must be 4K aligned") + u_asrt_rom_table_entry3_alignment + (.clk(HCLK), .reset_n(1'b1), .test_expr(|ENTRY3BASEADDR[11:0])); + +`endif + +endmodule diff --git a/Cortex-M0/nanosoc/systems/mcu/verilog/cmsdk_apb_usrt.v b/Cortex-M0/nanosoc/systems/mcu/verilog/cmsdk_apb_usrt.v new file mode 100644 index 0000000..f695ecc --- /dev/null +++ b/Cortex-M0/nanosoc/systems/mcu/verilog/cmsdk_apb_usrt.v @@ -0,0 +1,1159 @@ +//----------------------------------------------------------------------------- +// customised top-level example Cortex-M0 controller +// A joint work commissioned on behalf of SoC Labs, under Arm Academic Access license. +// +// Contributors +// +// David Flynn (d.w.flynn@soton.ac.uk) +// +// Copyright � 2021-2, SoC Labs (www.soclabs.org) +//----------------------------------------------------------------------------- + +//----------------------------------------------------------------------------- +// The confidential and proprietary information contained in this file may +// only be used by a person authorised under and to the extent permitted +// by a subsisting licensing agreement from Arm Limited or its affiliates. +// +// (C) COPYRIGHT 2010-2011 Arm Limited or its affiliates. +// ALL RIGHTS RESERVED +// +// This entire notice must be reproduced on all copies of this file +// and copies of this file may only be made by a person if such person is +// permitted to do so under the terms of a subsisting license agreement +// from Arm Limited or its affiliates. +// +// SVN Information +// +// Checked In : $Date: 2017-10-10 15:55:38 +0100 (Tue, 10 Oct 2017) $ +// +// Revision : $Revision: 371321 $ +// +// Release Information : Cortex-M System Design Kit-r1p1-00rel0 +// +//----------------------------------------------------------------------------- +//----------------------------------------------------------------------------- +// Abstract : Simple APB UART +//----------------------------------------------------------------------------- +//------------------------------------- +// Programmer's model +// 0x00 R RXD[7:0] Received Data +// W TXD[7:0] Transmit data +// 0x04 RW STAT[3:0] +// [3] RX buffer overrun (write 1 to clear) +// [2] TX buffer overrun (write 1 to clear) +// [1] RX buffer full (Read only) +// [0] TX buffer full (Read only) +// 0x08 RW CTRL[3:0] TxIntEn, RxIntEn, TxEn, RxEn +// [6] High speed test mode Enable +// [5] RX overrun interrupt enable +// [4] TX overrun interrupt enable +// [3] RX Interrupt Enable +// [2] TX Interrupt Enable +// [1] RX Enable +// [0] TX Enable +// 0x0C R/Wc intr_status/INTCLEAR +// [3] RX overrun interrupt +// [2] TX overrun interrupt +// [1] RX interrupt +// [0] TX interrupt +// 0x10 RW BAUDDIV[19:0] Baud divider +// (minimum value is 16) +// 0x3E0 - 0x3FC ID registers +//------------------------------------- + +module cmsdk_apb_usrt ( +// -------------------------------------------------------------------------- +// Port Definitions +// -------------------------------------------------------------------------- + input wire PCLK, // Clock + input wire PCLKG, // Gated Clock + input wire PRESETn, // Reset + + input wire PSEL, // Device select + input wire [11:2] PADDR, // Address + input wire PENABLE, // Transfer control + input wire PWRITE, // Write control + input wire [31:0] PWDATA, // Write data + + input wire [3:0] ECOREVNUM,// Engineering-change-order revision bits + + output wire [31:0] PRDATA, // Read data + output wire PREADY, // Device ready + output wire PSLVERR, // Device error response + + output wire TX_VALID_o, + output wire [7:0] TX_DATA8_o, + input wire TX_READY_i, + + input wire RX_VALID_i, + input wire [7:0] RX_DATA8_i, + output wire RX_READY_o, + + output wire TXINT, // Transmit Interrupt + output wire RXINT, // Receive Interrupt + output wire TXOVRINT, // Transmit overrun Interrupt + output wire RXOVRINT, // Receive overrun Interrupt + output wire UARTINT); // Combined interrupt + +// Local ID parameters, APB UART part number is 0x821 +localparam ARM_CMSDK_APB_UART_PID4 = 8'h04; +localparam ARM_CMSDK_APB_UART_PID5 = 8'h00; +localparam ARM_CMSDK_APB_UART_PID6 = 8'h00; +localparam ARM_CMSDK_APB_UART_PID7 = 8'h00; +localparam ARM_CMSDK_APB_UART_PID0 = 8'h21; +localparam ARM_CMSDK_APB_UART_PID1 = 8'hB8; +localparam ARM_CMSDK_APB_UART_PID2 = 8'h1B; +localparam ARM_CMSDK_APB_UART_PID3 = 4'h0; +localparam ARM_CMSDK_APB_UART_CID0 = 8'h0D; +localparam ARM_CMSDK_APB_UART_CID1 = 8'hF0; +localparam ARM_CMSDK_APB_UART_CID2 = 8'h05; +localparam ARM_CMSDK_APB_UART_CID3 = 8'hB1; + +// original external IOs +wire RXD = 1'b1; // Serial input +wire TXD; // Transmit data output +wire TXEN; // Transmit enabled +wire BAUDTICK; // Baud rate (x16) Tick + + + // -------------------------------------------------------------------------- + // Internal wires + // -------------------------------------------------------------------------- +// Signals for read/write controls +wire read_enable; +wire write_enable; +wire write_enable00; // Write enable for data register +wire write_enable04; // Write enable for Status register +wire write_enable08; // Write enable for control register +wire write_enable0c; // Write enable for interrupt status register +wire write_enable10; // Write enable for Baud rate divider +reg [7:0] read_mux_byte0; // Read data multiplexer for lower 8-bit +reg [7:0] read_mux_byte0_reg; // Register read data for lower 8-bit +wire [31:0] read_mux_word; // Read data multiplexer for whole 32-bit +wire [3:0] pid3_value; // constant value for lower 4-bit in perpherial ID3 + +// Signals for Control registers +reg [6:0] reg_ctrl; // Control register +reg [7:0] reg_tx_buf; // Transmit data buffer +reg [7:0] reg_rx_buf; // Receive data buffer +reg [19:0] reg_baud_div; // Baud rate setting + +// Internal signals + // Baud rate divider +reg [15:0] reg_baud_cntr_i; // baud rate divider counter i (integer) +wire [15:0] nxt_baud_cntr_i; +reg [3:0] reg_baud_cntr_f; // baud rate divider counter f (fraction) +wire [3:0] nxt_baud_cntr_f; +wire [3:0] mapped_cntr_f; // remapped counter f value +reg reg_baud_tick; // Register baud rate tick (16 times of baud rate) +reg baud_updated; // baud rate value has bee updated from APB +wire reload_i; // baud rate divider counter i reload +wire reload_f; // baud rate divider counter f reload +wire baud_div_en; // enable baud rate counter + + // Status +wire [3:0] uart_status; // UART status +reg reg_rx_overrun; // Receive overrun status register +wire rx_overrun; // Receive overrun detection +reg reg_tx_overrun; // Transmit overrun status register +wire tx_overrun; // Transmit overrun detection +wire nxt_rx_overrun; // next state for reg_rx_overrun +wire nxt_tx_overrun; // next state for reg_tx_overrun + // Interrupts +reg reg_txintr; // Transmit interrupt register +reg reg_rxintr; // Receive interrupt register +wire tx_overflow_intr;// Transmit overrun/overflow interrupt +wire rx_overflow_intr;// Receive overrun/overflow interrupt +wire [3:0] intr_state; // UART interrupt status +wire [1:0] intr_stat_set; // Set TX/RX interrupt +wire [1:0] intr_stat_clear; // Clear TX/RX interrupt + + // transmit +reg [3:0] tx_state; // Transmit FSM state +reg [4:0] nxt_tx_state; +wire tx_state_update; +wire tx_state_inc; // Bit pulse +reg [3:0] tx_tick_cnt; // Transmit Tick counter +wire [4:0] nxt_tx_tick_cnt; +reg [7:0] tx_shift_buf; // Transmit shift register +wire [7:0] nxt_tx_shift_buf; // next state for tx_shift_buf +wire tx_buf_ctrl_shift; // shift control for tx_shift_buf +wire tx_buf_ctrl_load; // load control for tx_shift_buf +reg tx_buf_full; // TX Buffer full +reg reg_txd; // Tx Data +wire nxt_txd; // next state of reg_txd +wire update_reg_txd; // update reg_txd +wire tx_buf_clear; // Clear buffer full status when data is load into TX shift register + + // Receive data sync and filter +reg rxd_sync_1; // Double flip-flop syncrhoniser +reg rxd_sync_2; // Double flip-flop syncrhoniser +reg [2:0] rxd_lpf; // Averaging Low Pass Filter +wire [2:0] nxt_rxd_lpf; +wire rx_shift_in; // Shift Register Input + + // Receiver +reg [3:0] rx_state; // Receiver FSM state +reg [4:0] nxt_rx_state; +wire rx_state_update; +reg [3:0] rx_tick_cnt; // Receiver Tick counter +wire [4:0] nxt_rx_tick_cnt; +wire update_rx_tick_cnt; +wire rx_state_inc;// Bit pulse +reg [6:0] rx_shift_buf;// Receiver shift data register +wire [6:0] nxt_rx_shift_buf; +reg rx_buf_full; // Receive buffer full status +wire nxt_rx_buf_full; +wire rxbuf_sample; // Sample received data into receive data buffer +wire rx_data_read; // Receive data buffer read by APB interface +wire [7:0] nxt_rx_buf; + +// Start of main code +// Read and write control signals +assign read_enable = PSEL & (~PWRITE); // assert for whole APB read transfer +assign write_enable = PSEL & (~PENABLE) & PWRITE; // assert for 1st cycle of write transfer +assign write_enable00 = write_enable & (PADDR[11:2] == 10'h000); +assign write_enable04 = write_enable & (PADDR[11:2] == 10'h001); +assign write_enable08 = write_enable & (PADDR[11:2] == 10'h002); +assign write_enable0c = write_enable & (PADDR[11:2] == 10'h003); +assign write_enable10 = write_enable & (PADDR[11:2] == 10'h004); + +// Write operations + // Transmit data register + always @(posedge PCLKG or negedge PRESETn) + begin + if (~PRESETn) + reg_tx_buf <= {8{1'b0}}; + else if (write_enable00) + reg_tx_buf <= PWDATA[7:0]; + end + + assign TX_DATA8_o = reg_tx_buf[7:0]; + + // Status register overrun registers + assign nxt_rx_overrun = (reg_rx_overrun & (~((write_enable04|write_enable0c) & PWDATA[3]))) | rx_overrun; + assign nxt_tx_overrun = (reg_tx_overrun & (~((write_enable04|write_enable0c) & PWDATA[2]))) | tx_overrun; + + // RX OverRun status + always @(posedge PCLK or negedge PRESETn) + begin + if (~PRESETn) + reg_rx_overrun <= 1'b0; + else if (rx_overrun | write_enable04 | write_enable0c) + reg_rx_overrun <= nxt_rx_overrun; + end + + // TX OverRun status + always @(posedge PCLK or negedge PRESETn) + begin + if (~PRESETn) + reg_tx_overrun <= 1'b0; + else if (tx_overrun | write_enable04 | write_enable0c) + reg_tx_overrun <= nxt_tx_overrun; + end + + // Control register + always @(posedge PCLKG or negedge PRESETn) + begin + if (~PRESETn) + reg_ctrl <= {7{1'b0}}; + else if (write_enable08) + reg_ctrl <= PWDATA[6:0]; + end + + // Baud rate divider - integer + always @(posedge PCLKG or negedge PRESETn) + begin + if (~PRESETn) + reg_baud_div <= {20{1'b0}}; + else if (write_enable10) + reg_baud_div <= PWDATA[19:0]; + end + +// Read operation + assign uart_status = {reg_rx_overrun, reg_tx_overrun, rx_buf_full, tx_buf_full}; + + assign pid3_value = ARM_CMSDK_APB_UART_PID3; + + // First level of read mux + always @(PADDR or reg_rx_buf or uart_status or reg_ctrl or intr_state or reg_baud_div + or ECOREVNUM or pid3_value) + begin + if (PADDR[11:5] == 7'h00) begin + case (PADDR[4:2]) + 3'h0: read_mux_byte0 = reg_rx_buf; + 3'h1: read_mux_byte0 = {{4{1'b0}},uart_status}; + 3'h2: read_mux_byte0 = {{1{1'b0}},reg_ctrl}; + 3'h3: read_mux_byte0 = {{4{1'b0}},intr_state}; + 3'h4: read_mux_byte0 = reg_baud_div[7:0]; + 3'h5, 3'h6, 3'h7: read_mux_byte0 = {8{1'b0}}; //default read out value + default: read_mux_byte0 = {8{1'bx}};// x propogation + endcase + end + else if (PADDR[11:6] == 6'h3F) begin + case (PADDR[5:2]) + 4'h0, 4'h1,4'h2,4'h3: read_mux_byte0 = {8{1'b0}}; //default read out value + // ID register - constant values + 4'h4: read_mux_byte0 = ARM_CMSDK_APB_UART_PID4; // 0xFD0 : PID 4 + 4'h5: read_mux_byte0 = ARM_CMSDK_APB_UART_PID5; // 0xFD4 : PID 5 + 4'h6: read_mux_byte0 = ARM_CMSDK_APB_UART_PID6; // 0xFD8 : PID 6 + 4'h7: read_mux_byte0 = ARM_CMSDK_APB_UART_PID7; // 0xFDC : PID 7 + 4'h8: read_mux_byte0 = ARM_CMSDK_APB_UART_PID0; // 0xFE0 : PID 0 APB UART part number[7:0] + 4'h9: read_mux_byte0 = ARM_CMSDK_APB_UART_PID1; // 0xFE0 : PID 1 [7:4] jep106_id_3_0. [3:0] part number [11:8] + 4'hA: read_mux_byte0 = ARM_CMSDK_APB_UART_PID2; // 0xFE0 : PID 2 [7:4] revision, [3] jedec_used. [2:0] jep106_id_6_4 + 4'hB: read_mux_byte0 = {ECOREVNUM[3:0],pid3_value[3:0]}; + // 0xFE0 : PID 3 [7:4] ECO revision, [3:0] modification number + 4'hC: read_mux_byte0 = ARM_CMSDK_APB_UART_CID0; // 0xFF0 : CID 0 + 4'hD: read_mux_byte0 = ARM_CMSDK_APB_UART_CID1; // 0xFF4 : CID 1 PrimeCell class + 4'hE: read_mux_byte0 = ARM_CMSDK_APB_UART_CID2; // 0xFF8 : CID 2 + 4'hF: read_mux_byte0 = ARM_CMSDK_APB_UART_CID3; // 0xFFC : CID 3 + default : read_mux_byte0 = {8{1'bx}}; // x propogation + endcase + end + else begin + read_mux_byte0 = {8{1'b0}}; //default read out value + end + end + + + + // Register read data + always @(posedge PCLKG or negedge PRESETn) + begin + if (~PRESETn) + read_mux_byte0_reg <= {8{1'b0}}; + else if (read_enable) + read_mux_byte0_reg <= read_mux_byte0; + end + + // Second level of read mux + assign read_mux_word[ 7: 0] = read_mux_byte0_reg; + assign read_mux_word[19: 8] = (PADDR[11:2]==10'h004) ? reg_baud_div[19:8] : {12{1'b0}}; + assign read_mux_word[31:20] = {12{1'b0}}; + + + // Output read data to APB + assign PRDATA[31: 0] = (read_enable) ? read_mux_word : {32{1'b0}}; + assign PREADY = 1'b1; // Always ready + assign PSLVERR = 1'b0; // Always okay + +// -------------------------------------------- +// Baud rate generator + // Baud rate generator enable + assign baud_div_en = (reg_ctrl[1:0] != 2'b00); + assign mapped_cntr_f = {reg_baud_cntr_f[0],reg_baud_cntr_f[1], + reg_baud_cntr_f[2],reg_baud_cntr_f[3]}; + // Reload Integer divider + // when UART enabled and (reg_baud_cntr_f < reg_baud_div[3:0]) + // then count to 1, or + // when UART enabled then count to 0 + assign reload_i = (baud_div_en & + (((mapped_cntr_f >= reg_baud_div[3:0]) & + (reg_baud_cntr_i[15:1] == {15{1'b0}})) | + (reg_baud_cntr_i[15:0] == {16{1'b0}}))); + + // Next state for Baud rate divider + assign nxt_baud_cntr_i = (baud_updated | reload_i) ? reg_baud_div[19:4] : + (reg_baud_cntr_i - 16'h0001); + // Update at reload or decrement + always @(posedge PCLK or negedge PRESETn) + begin + if (~PRESETn) + reg_baud_cntr_i <= {16{1'b0}}; + else if (baud_updated | baud_div_en) + reg_baud_cntr_i <= nxt_baud_cntr_i; + end + + // Reload fraction divider + assign reload_f = baud_div_en & (reg_baud_cntr_f==4'h0) & + reload_i; + // Next state for fraction part of Baud rate divider + assign nxt_baud_cntr_f = + (reload_f|baud_updated) ? 4'hF : + (reg_baud_cntr_f - 4'h1); + + // Update at reload or decrement + always @(posedge PCLK or negedge PRESETn) + begin + if (~PRESETn) + reg_baud_cntr_f <= {4{1'b0}}; + else if (baud_updated | reload_f | reload_i) + reg_baud_cntr_f <= nxt_baud_cntr_f; + end + + // Generate control signal to update baud rate counters + always @(posedge PCLK or negedge PRESETn) + begin + if (~PRESETn) + baud_updated <= 1'b0; + else if (write_enable10 | baud_updated) + // Baud rate updated - to load new value to counters + baud_updated <= write_enable10; + end + + // Generate Tick signal for external logic + always @(posedge PCLK or negedge PRESETn) + begin + if (~PRESETn) + reg_baud_tick <= 1'b0; + else if (reload_i | reg_baud_tick) + reg_baud_tick <= reload_i; + end + + // Connect to external + assign BAUDTICK = reg_baud_tick; + +// -------------------------------------------- +// Transmit + + // Buffer full status + always @(posedge PCLK or negedge PRESETn) + begin + if (~PRESETn) + tx_buf_full <= 1'b0; + else if (write_enable00) // | tx_buf_clear) + tx_buf_full <= write_enable00; + else if (tx_buf_full & TX_READY_i) // AXI stream ack + tx_buf_full <= 0; + end + + assign TX_VALID_o = tx_buf_full; + + // Increment TickCounter + assign nxt_tx_tick_cnt = ((tx_state==4'h1) & reg_baud_tick) ? {5{1'b0}} : + tx_tick_cnt + {{3{1'b0}},reg_baud_tick}; + + // Registering TickCounter + always @(posedge PCLK or negedge PRESETn) + begin + if (~PRESETn) + tx_tick_cnt <= {4{1'b0}}; + else if (reg_baud_tick) + tx_tick_cnt <= nxt_tx_tick_cnt[3:0]; + end + + // Increment state (except Idle(0) and Wait for Tick(1)) + assign tx_state_inc = (((&tx_tick_cnt)|(tx_state==4'h1)) & reg_baud_tick)|reg_ctrl[6]; + // state increment every cycle of high speed test mode is enabled + // Clear buffer full status when data is load into shift register + assign tx_buf_clear = ((tx_state==4'h0) & tx_buf_full) | + ((tx_state==4'hB) & tx_buf_full & tx_state_inc); + + // tx_state machine + // 0 = Idle, 1 = Wait for Tick, + // 2 = Start bit, 3 = D0 .... 10 = D7 + // 11 = Stop bit + always @(tx_state or tx_buf_full or tx_state_inc or reg_ctrl) + begin + case (tx_state) + 0: begin + nxt_tx_state = (tx_buf_full & reg_ctrl[0]) ? 5'h01 : 5'h00; // New data is written to buffer + end + 1, // State 1 : Wait for next Tick + 2,3,4,5,6,7,8,9,10: begin // State 2-10: Start bit, D0 - D7 + nxt_tx_state = tx_state + {3'b000,tx_state_inc}; + end + 11: begin // Stop bit , goto next start bit or Idle + nxt_tx_state = (tx_state_inc) ? ( tx_buf_full ? 5'h02:5'h00) : {1'b0, tx_state}; + end + default: + nxt_tx_state = {5{1'bx}}; + endcase + end + + assign tx_state_update = tx_state_inc | ((tx_state==4'h0) & tx_buf_full & reg_ctrl[0]) | (tx_state>4'd11); + + // Registering outputs + always @(posedge PCLK or negedge PRESETn) + begin + if (~PRESETn) + tx_state <= {4{1'b0}}; + else if (tx_state_update) + tx_state <= nxt_tx_state[3:0]; + end + + // Load/shift TX register + assign tx_buf_ctrl_load = (((tx_state==4'h0) & tx_buf_full) | + ((tx_state==4'hB) & tx_buf_full & tx_state_inc)); + assign tx_buf_ctrl_shift = ((tx_state>4'h2) & tx_state_inc); + + assign nxt_tx_shift_buf = tx_buf_ctrl_load ? reg_tx_buf[7:0] : {1'b1,tx_shift_buf[7:1]}; + + // Registering TX shift register + always @(posedge PCLK or negedge PRESETn) + begin + if (~PRESETn) + tx_shift_buf <= {8{1'b0}}; + else if (tx_buf_ctrl_shift | tx_buf_ctrl_load) + tx_shift_buf <= nxt_tx_shift_buf; + end + + // Data output + assign nxt_txd = (tx_state==4'h2) ? 1'b0 : + (tx_state>4'h2) ? tx_shift_buf[0] : 1'b1; + + assign update_reg_txd = (nxt_txd != reg_txd); + + // Registering outputs + always @(posedge PCLK or negedge PRESETn) + begin + if (~PRESETn) + reg_txd <= 1'b1; + else if (update_reg_txd) + reg_txd <= nxt_txd; + end + + // Generate TX overrun error status + assign tx_overrun = tx_buf_full & (~tx_buf_clear) & write_enable00; + + // Connect to external + assign TXD = reg_txd; + assign TXEN = reg_ctrl[0]; + +// -------------------------------------------- +// Receive synchronizer and low pass filter + + // Doubling Flip-flop synxt_rx_tick_cntnchroniser + always @(posedge PCLK or negedge PRESETn) + begin + if (~PRESETn) + begin + rxd_sync_1 <= 1'b1; + rxd_sync_2 <= 1'b1; + end + else if (reg_ctrl[1]) // Turn off synchronizer if receive is not enabled + begin + rxd_sync_1 <= RXD; + rxd_sync_2 <= rxd_sync_1; + end + end + + // Averaging low pass filter + assign nxt_rxd_lpf = {rxd_lpf[1:0], rxd_sync_2}; + // Registering stage for low pass filter + always @(posedge PCLK or negedge PRESETn) + begin + if (~PRESETn) + rxd_lpf <= 3'b111; + else if (reg_baud_tick) + rxd_lpf <= nxt_rxd_lpf; + end + + // Averaging values + assign rx_shift_in = (rxd_lpf[1] & rxd_lpf[0]) | + (rxd_lpf[1] & rxd_lpf[2]) | + (rxd_lpf[0] & rxd_lpf[2]); + +// -------------------------------------------- +// Receive + + // Increment TickCounter + assign nxt_rx_tick_cnt = ((rx_state==4'h0) & (~rx_shift_in)) ? 5'h08 : + rx_tick_cnt + {{3{1'b0}},reg_baud_tick}; + + assign update_rx_tick_cnt = ((rx_state==4'h0) & (~rx_shift_in)) | reg_baud_tick; + + // Registering other register + always @(posedge PCLK or negedge PRESETn) + begin + if (~PRESETn) + rx_tick_cnt <= {4{1'b0}}; + else if (update_rx_tick_cnt) + rx_tick_cnt <= nxt_rx_tick_cnt[3:0]; + end + + // Increment state + assign rx_state_inc = ((&rx_tick_cnt) & reg_baud_tick); + // Buffer full status + assign nxt_rx_buf_full = rxbuf_sample | (rx_buf_full & (~rx_data_read)); + + // Sample shift register when D7 is sampled +/// assign rxbuf_sample = ((rx_state==4'h9) & rx_state_inc); + assign rxbuf_sample = RX_VALID_i & !rx_buf_full; + + // Reading receive buffer (Set at 1st cycle of APB transfer + // because read mux is registered before output) + assign rx_data_read = (PSEL & (~PENABLE) & (PADDR[11:2]==10'h000) & (~PWRITE)); + // Generate RX overrun error status + assign rx_overrun = rx_buf_full & rxbuf_sample & (~rx_data_read); + + // rx_state machine + // 0 = Idle, 1 = Start of Start bit detected + // 2 = Sample Start bit, 3 = D0 .... 10 = D7 + // 11 = Stop bit + // 11, 12, 13, 14, 15: illegal/unused states + always @(rx_state or rx_shift_in or rx_state_inc or reg_ctrl) + begin + case (rx_state) + 0: begin + nxt_rx_state = ((~rx_shift_in) & reg_ctrl[1]) ? 5'h01 : 5'h00; // Wait for Start bit + end + 1, // State 1 : Wait for middle of start bit + 2,3,4,5,6,7,8,9: begin // State 2-9: D0 - D7 + nxt_rx_state = rx_state + {3'b000,rx_state_inc}; + end + 10: begin // Stop bit , goto back to Idle + nxt_rx_state = (rx_state_inc) ? 5'h00 : 5'h0A; + end + default: + nxt_rx_state = {5{1'bx}}; + endcase + end + + assign rx_state_update = rx_state_inc | ((~rx_shift_in) & reg_ctrl[1]); + + // Registering rx_state + always @(posedge PCLK or negedge PRESETn) + begin + if (~PRESETn) + rx_state <= {4{1'b0}}; + else if (rx_state_update) + rx_state <= nxt_rx_state[3:0]; + end + + // Buffer full status + always @(posedge PCLK or negedge PRESETn) + begin + if (~PRESETn) + rx_buf_full <= 1'b0; + else if (rxbuf_sample | rx_data_read) + rx_buf_full <= nxt_rx_buf_full; + end + + // Sample receive buffer +/// assign nxt_rx_buf = {rx_shift_in, rx_shift_buf}; + assign nxt_rx_buf = RX_DATA8_i[7:0]; + + // Registering receive data buffer + always @(posedge PCLK or negedge PRESETn) + begin + if (~PRESETn) + reg_rx_buf <= {8{1'b0}}; + else if (rxbuf_sample) + reg_rx_buf <= nxt_rx_buf; + end + + // Shift register + assign nxt_rx_shift_buf= {rx_shift_in, rx_shift_buf[6:1]}; + // Registering shift buffer + always @(posedge PCLK or negedge PRESETn) + begin + if (~PRESETn) + rx_shift_buf <= {7{1'b0}}; + else if (rx_state_inc) + rx_shift_buf <= nxt_rx_shift_buf; + end + + + +// -------------------------------------------- +// Interrupts + // Set by event + assign intr_stat_set[1] = reg_ctrl[3] & rxbuf_sample; // A new receive data is sampled + assign intr_stat_set[0] = reg_ctrl[2] & reg_ctrl[0] & tx_buf_full & tx_buf_clear; + // Falling edge of buffer full + // Clear by write to IntClear register + assign intr_stat_clear[1:0] = {2{write_enable0c}} & PWDATA[1:0]; + + // Registering outputs + always @(posedge PCLK or negedge PRESETn) + begin + if (~PRESETn) + reg_txintr <= 1'b0; + else if (intr_stat_set[0] | intr_stat_clear[0]) + reg_txintr <= intr_stat_set[0]; + end + + always @(posedge PCLK or negedge PRESETn) + begin + if (~PRESETn) + reg_rxintr <= 1'b0; + else if (intr_stat_set[1] | intr_stat_clear[1]) + reg_rxintr <= intr_stat_set[1]; + end + + assign rx_overflow_intr = reg_rx_overrun & reg_ctrl[5]; + assign tx_overflow_intr = reg_tx_overrun & reg_ctrl[4]; + + // Interrupt status for read back + assign intr_state = {rx_overflow_intr, tx_overflow_intr, reg_rxintr, reg_txintr}; + + // Connect to external + assign TXINT = reg_txintr; + assign RXINT = reg_rxintr; + assign TXOVRINT = tx_overflow_intr; + assign RXOVRINT = rx_overflow_intr; + assign UARTINT = reg_txintr | reg_rxintr | tx_overflow_intr | rx_overflow_intr; + + +`ifdef ARM_APB_ASSERT_ON + // ------------------------------------------------------------ + // Assertions + // ------------------------------------------------------------ +`include "std_ovl_defines.h" + + // Prepare signals for OVL checking + reg [15:0] ovl_last_reg_baud_cntr_i; + reg [3:0] ovl_last_reg_baud_cntr_f; + reg ovl_last_baud_div_en; + reg ovl_last_baud_updated; + always @(posedge PCLK or negedge PRESETn) + begin + if (~PRESETn) + begin + ovl_last_reg_baud_cntr_i <= {16{1'b0}}; + ovl_last_reg_baud_cntr_f <= {4{1'b0}}; + ovl_last_baud_div_en <= 1'b0; + ovl_last_baud_updated <= 1'b0; + end + else + begin + ovl_last_reg_baud_cntr_i <= reg_baud_cntr_i; + ovl_last_reg_baud_cntr_f <= reg_baud_cntr_f; + ovl_last_baud_div_en <= baud_div_en; + ovl_last_baud_updated <= baud_updated; + end + end + + reg ovl_reg_hs_test_mode_triggered; // Indicate if HighSpeed testmode has been activated + wire ovl_nxt_hs_test_mode_triggered; + reg [7:0] ovl_reg_tx_tick_count; // For measuring width of TX state + wire [7:0] ovl_nxt_tx_tick_count; + reg [7:0] ovl_reg_rx_tick_count; // For measuring width of RX state + wire [7:0] ovl_nxt_rx_tick_count; + reg [3:0] ovl_reg_last_tx_state; // last state + reg [3:0] ovl_reg_last_rx_state; + reg [6:0] ovl_last_reg_ctrl; + + // Clear test mode indicator each time state is changed, set to 1 if high speed test mode is + // enabled + assign ovl_nxt_hs_test_mode_triggered = + (tx_state!=ovl_reg_last_tx_state) ? reg_ctrl[6]: (reg_ctrl[6] | ovl_reg_hs_test_mode_triggered); + + // Counter clear at each state change, increasement at each reg_baud_tick + assign ovl_nxt_tx_tick_count = (tx_state!=ovl_reg_last_tx_state) ? (8'h00) : + (ovl_reg_tx_tick_count + {{7{1'b0}}, reg_baud_tick}); + + // Counter clear at each state change, increasement at each reg_baud_tick + assign ovl_nxt_rx_tick_count = (rx_state!=ovl_reg_last_rx_state) ? (8'h00) : + (ovl_reg_rx_tick_count + {{7{1'b0}}, reg_baud_tick}); + + always@(posedge PCLK or negedge PRESETn) + begin + if (~PRESETn) + begin + ovl_reg_hs_test_mode_triggered <= 1'b0; + ovl_reg_last_tx_state <= 4'h0; + ovl_reg_last_rx_state <= 4'h0; + ovl_reg_tx_tick_count <= 8'h00; + ovl_reg_rx_tick_count <= 8'h00; + ovl_last_reg_ctrl <= 7'h00; + end + else + begin + ovl_reg_hs_test_mode_triggered <= ovl_nxt_hs_test_mode_triggered; + ovl_reg_last_tx_state <= tx_state; + ovl_reg_last_rx_state <= rx_state; + ovl_reg_tx_tick_count <= ovl_nxt_tx_tick_count; + ovl_reg_rx_tick_count <= ovl_nxt_rx_tick_count; + ovl_last_reg_ctrl <= reg_ctrl; + end + end + + // Signals for checking clearing of interrupts + reg ovl_last_txint; + reg ovl_last_rxint; + reg ovl_last_psel; + reg ovl_last_penable; + reg ovl_last_pwrite; + reg [31:0] ovl_last_pwdata; + reg [11:2] ovl_last_paddr; + reg ovl_last_rx_buf_full; + reg ovl_last_tx_shift_buf_0; + + + always@(posedge PCLK or negedge PRESETn) + begin + if (~PRESETn) + begin + ovl_last_txint <= 1'b0; + ovl_last_rxint <= 1'b0; + ovl_last_psel <= 1'b0; + ovl_last_penable <= 1'b0; + ovl_last_pwrite <= 1'b0; + ovl_last_paddr <= {10{1'b0}}; + ovl_last_pwdata <= {32{1'b0}}; + ovl_last_rx_buf_full <= 1'b0; + ovl_last_tx_shift_buf_0 <= 1'b0; + end + else + begin + ovl_last_txint <= TXINT; + ovl_last_rxint <= RXINT; + ovl_last_psel <= PSEL; + ovl_last_penable <= PENABLE; + ovl_last_pwrite <= PWRITE; + ovl_last_paddr <= PADDR; + ovl_last_pwdata <= PWDATA; + ovl_last_rx_buf_full <= rx_buf_full; + ovl_last_tx_shift_buf_0 <= tx_shift_buf[0]; + end + end + + // Ensure rx_state must not be 11, 12, 13, 14, 15 + assert_never + #(`OVL_ERROR,`OVL_ASSERT, + "rx_state in illegal state") + u_ovl_rx_state_illegal + (.clk(PCLK), .reset_n(PRESETn), + .test_expr((rx_state==4'hB)|(rx_state==4'hC)|(rx_state==4'hD)| + (rx_state==4'hE)|(rx_state==4'hF))); + + // Ensure tx_state must not be 12, 13, 14, 15 + assert_never + #(`OVL_ERROR,`OVL_ASSERT, + "tx_state in illegal state") + u_ovl_tx_state_illegal + (.clk(PCLK), .reset_n(PRESETn), + .test_expr((tx_state==4'hC)|(tx_state==4'hD)| + (tx_state==4'hE)|(tx_state==4'hF))); + + // Ensure reg_baud_cntr_i change only if UART is enabled + // or if write to baud rate divider + assert_implication + #(`OVL_ERROR,`OVL_ASSERT, + "Unexpected baud rate divider change") + u_ovl_reg_baud_cntr_i_change + (.clk(PCLK), .reset_n(PRESETn), + .antecedent_expr(ovl_last_reg_baud_cntr_i!=reg_baud_cntr_i), + .consequent_expr(ovl_last_baud_div_en | ovl_last_baud_updated ) + ); + + // Ensure reg_baud_div[19:4] >= reg_baud_cntr_i unless reg_baud_div just been programmed + assert_implication + #(`OVL_ERROR,`OVL_ASSERT, + "Unexpected baud rate divided change") + u_ovl_reg_baud_cntr_i_range + (.clk(PCLK), .reset_n(PRESETn), + .antecedent_expr(reg_baud_cntr_i>reg_baud_div[19:4]), + .consequent_expr(baud_updated) + ); + + // Ensure reg_baud_cntr_f change only if UART is enabled + // or if write to baud rate divider + assert_implication + #(`OVL_ERROR,`OVL_ASSERT, + "Unexpected baud rate divider change") + u_ovl_reg_baud_cntr_f_change + (.clk(PCLK), .reset_n(PRESETn), + .antecedent_expr(ovl_last_reg_baud_cntr_f!=reg_baud_cntr_f), + .consequent_expr(ovl_last_baud_div_en | ovl_last_baud_updated ) + ); + + // Ensure tx_buf_full is set to 1 after write to TX buffer (PADDR[11:2]==0) + assert_next + #(`OVL_ERROR, 1,1,0, `OVL_ASSERT, + "tx_buf_full should be asserted after write to TX buffer") + u_ovl_tx_buf_full + (.clk(PCLK), .reset_n(PRESETn), + .start_event (PSEL & (~PENABLE) & PWRITE & (PADDR[11:2] == 10'h000)), + .test_expr (tx_buf_full) + ); + + // If last tx_state=0 (idle) or 1 (wait for tick), TXD = 1. + assert_next + #(`OVL_ERROR, 1,1,0, `OVL_ASSERT, + "TXD should be 1 when idle or just before data transmission") + u_ovl_txd_state_0_1 + (.clk(PCLK), .reset_n(PRESETn), + .start_event ((tx_state==4'd0)|(tx_state==4'd1)), + .test_expr (TXD==1'b1) + ); + + // If last tx_state=2 (start bit), TXD = 0. + assert_next + #(`OVL_ERROR, 1,1,0, `OVL_ASSERT, + "TXD should be 0 when output start bit") + u_ovl_txd_state_2 + (.clk(PCLK), .reset_n(PRESETn), + .start_event (tx_state==4'd2), + .test_expr (TXD==1'b0) + ); + + // If last tx_state=3-10 (D0 to D7), TXD = anything (tx_shift_buf[0]). + assert_next + #(`OVL_ERROR, 1,1,0, `OVL_ASSERT, + "TXD should be same as first bit of shift register during transfer") + u_ovl_txd_state_3_to_10 + (.clk(PCLK), .reset_n(PRESETn), + .start_event ((tx_state>4'd2) & (tx_state<4'd11)), + .test_expr (TXD==ovl_last_tx_shift_buf_0) + ); + + // If last tx_state=11 (stop bit), TXD = 1. + assert_next + #(`OVL_ERROR, 1,1,0, `OVL_ASSERT, + "TXD should be 1 when output stop bit") + u_ovl_txd_state_11 + (.clk(PCLK), .reset_n(PRESETn), + .start_event (tx_state==4'd11), + .test_expr (TXD==1'b1) + ); + + // Duration of tx_state in 2 to 11 must have 16 reg_baud_tick + // (unless high speed test mode has been active) + assert_implication + #(`OVL_ERROR,`OVL_ASSERT, + "Duration of tx_state when in state 2 to state 11 should have 16 ticks") + u_ovl_width_of_tx_state + (.clk(PCLK), .reset_n(PRESETn), + .antecedent_expr((tx_state!=ovl_reg_last_tx_state) & // at state change + (ovl_reg_last_tx_state>4'd1)&(ovl_reg_last_tx_state<4'd12) & // from state 2 to 11 + (ovl_reg_hs_test_mode_triggered==1'b0)), // high speed test mode not triggered + .consequent_expr((ovl_reg_tx_tick_count==8'd15) | (ovl_reg_tx_tick_count==8'd16)) + // count from 0 to 15 (16 ticks) + ); + + + // In high speed test mode, tx_state must change if it is in range of 2 to 11 + assert_next + #(`OVL_ERROR, 1,1,0, `OVL_ASSERT, + "Duration of tx_state should be 1 cycle if high speed test mode is enabled") + u_ovl_width_of_tx_state_in_high_speed_test_mode + (.clk(PCLK), .reset_n(PRESETn), + .start_event((tx_state>4'd1)&(tx_state<4'd12) & reg_ctrl[6]), + .test_expr (tx_state != ovl_reg_last_tx_state) + ); + + // Duration of rx_state in 1 must have 8 reg_baud_tick + assert_implication + #(`OVL_ERROR,`OVL_ASSERT, + "Duration of rx_state when state 1 should have 8 ticks") + u_ovl_width_of_rx_state_1 + (.clk(PCLK), .reset_n(PRESETn), + .antecedent_expr((rx_state!=ovl_reg_last_rx_state) & // at state change + (ovl_reg_last_rx_state==4'd1)), // last state was state 1 + .consequent_expr((ovl_reg_rx_tick_count==8'd7)|(ovl_reg_rx_tick_count==8'd8)) + // count from 0 to 7 (8 ticks) + ); + + // Duration of rx_state in 2 to 10 must have 16 reg_baud_tick + assert_implication + #(`OVL_ERROR,`OVL_ASSERT, + "Duration of rx_state when in state 2 to state 10 should have 16 ticks") + u_ovl_width_of_rx_state_data + (.clk(PCLK), .reset_n(PRESETn), + .antecedent_expr((rx_state!=ovl_reg_last_rx_state) & // at state change + (ovl_reg_last_rx_state>4'd1)&(ovl_reg_last_rx_state<4'd11)), // from state 2 to 9 + .consequent_expr((ovl_reg_rx_tick_count==8'd15)|(ovl_reg_rx_tick_count==8'd16)) + // count from 0 to 15 (16 ticks) + ); + + // UARTINT must be 0 if TXINT, RXINT, TXOVRINT and RXOVRINT are all 0 + assert_implication + #(`OVL_ERROR,`OVL_ASSERT, + "UARTINT must be 0 if TXINT, RXINT, TXOVRINT and RXOVRINT are all 0") + u_ovl_uartint_mismatch + (.clk(PCLK), .reset_n(PRESETn), + .antecedent_expr((TXINT | RXINT | TXOVRINT | RXOVRINT) == 1'b0), // No interrupt + .consequent_expr(UARTINT==1'b0) // Combined interrupt = 0 + ); + + // TXINT should be asserted when TX interrupt enabled and transmit buffer is available + assert_next + #(`OVL_ERROR, 1,1,0, `OVL_ASSERT, + "TXINT should be triggered when enabled") + u_ovl_txint_enable + (.clk(PCLK ), .reset_n (PRESETn), + .start_event (reg_ctrl[0] & reg_ctrl[2] & tx_buf_full & tx_buf_clear), + .test_expr (TXINT == 1'b1) + ); + + // There should be no rising edge of TXINT if transmit is disabled or transmit interrupt is disabled + assert_next + #(`OVL_ERROR, 1,1,0, `OVL_ASSERT, + "TXINT should not be triggered when disabled") + u_ovl_txint_disable + (.clk(PCLK ), .reset_n (PRESETn), + .start_event (((reg_ctrl[0]==1'b0) | (reg_ctrl[2]==1'b0)) & (TXINT == 1'b0)), + .test_expr (TXINT == 1'b0) + ); + + // if TXINT falling edge, there must has been a write to INTCLEAR register with bit[0]=1 + assert_implication + #(`OVL_ERROR,`OVL_ASSERT, + "When there is a falling edge of TXINT, there must has been a write to INTCLEAR") + u_ovl_txint_clear + (.clk(PCLK), .reset_n(PRESETn), + .antecedent_expr(ovl_last_txint & (~TXINT)), // Falling edge of TXINT + .consequent_expr(ovl_last_psel & ovl_last_pwrite & + (ovl_last_paddr==10'h003) & (ovl_last_pwdata[0]) ) // There must has been a write to INTCLEAR + ); + + // RXINT should be asserted when RX interrupt enabled and a new data is received + assert_next + #(`OVL_ERROR, 1,1,0, `OVL_ASSERT, + "RXINT should be triggered when enabled") + u_ovl_rxint_enable + (.clk(PCLK ), .reset_n (PRESETn), + .start_event (reg_ctrl[3] & (rx_state==9) & (nxt_rx_state==10)), + .test_expr (RXINT == 1'b1) + ); + + // There should be no rising edge of RXINT if receive interrupt is disabled + assert_next + #(`OVL_ERROR, 1,1,0, `OVL_ASSERT, + "RXINT should not be triggered when disabled") + u_ovl_rxint_disable + (.clk(PCLK ), .reset_n (PRESETn), + .start_event ((reg_ctrl[3]==1'b0) & (RXINT == 1'b0)), + .test_expr (RXINT == 1'b0) + ); + + // if RXINT falling edge, there must has been a write to INTCLEAR register with bit[1]=1 + assert_implication + #(`OVL_ERROR,`OVL_ASSERT, + "When there is a falling edge of RXINT, there must has been a write to INTCLEAR") + u_ovl_rxint_clear + (.clk(PCLK), .reset_n(PRESETn), + .antecedent_expr(ovl_last_rxint & (~RXINT)), // Falling edge of TXINT + .consequent_expr(ovl_last_psel & ovl_last_pwrite & + (ovl_last_paddr==10'h003) & (ovl_last_pwdata[1]) ) // There must has been a write to INTCLEAR + ); + + // rx_buf_full should rise if rx_state change from 9 to 10 + assert_next + #(`OVL_ERROR, 1,1,0, `OVL_ASSERT, + "rx_buf_full should be asserted when a new character is received") + u_ovl_rx_buf_full + (.clk(PCLK ), .reset_n (PRESETn), + .start_event ((rx_state==9) & (nxt_rx_state==10)), + .test_expr (rx_buf_full == 1'b1) + ); + + // if rx_buf_full falling edge, there must has been a read to the receive buffer + assert_implication + #(`OVL_ERROR,`OVL_ASSERT, + "When there is a falling edge of RXINT, there must has been a read to receive buffer") + u_ovl_rx_buf_full_clear + (.clk(PCLK), .reset_n(PRESETn), + .antecedent_expr((~rx_buf_full) & ovl_last_rx_buf_full), // Falling edge of rx_buf_full + .consequent_expr(ovl_last_psel & (~ovl_last_pwrite) & + (ovl_last_paddr==10'h000) ) // There must has been a read to rx data + ); + + // TXOVRINT must be 0 if reg_ctrl[4]=0 + assert_implication + #(`OVL_ERROR,`OVL_ASSERT, + "When there is a falling edge of RXINT, there must has been a write to INTCLEAR") + u_ovl_txovrint_disable + (.clk(PCLK), .reset_n(PRESETn), + .antecedent_expr(~reg_ctrl[4]), + .consequent_expr(~TXOVRINT) + ); + + // RXOVRINT must be 0 if reg_ctrl[5]=0 + assert_implication + #(`OVL_ERROR,`OVL_ASSERT, + "When there is a falling edge of RXINT, there must has been a write to INTCLEAR") + u_ovl_rxovrint_disable + (.clk(PCLK), .reset_n(PRESETn), + .antecedent_expr(~reg_ctrl[5]), + .consequent_expr(~RXOVRINT) + ); + + // if a write take place to TX data buffer and tx_buf_full was 1, reg_tx_overrun will be set + assert_next + #(`OVL_ERROR, 1,1,0, `OVL_ASSERT, + "tx buffer overrun should be asserted when a new character is write to buffer and buffer is already full") + u_ovl_tx_buffer_overrun + (.clk(PCLK ), .reset_n (PRESETn), + .start_event (write_enable00 & tx_buf_full & (~tx_buf_clear)), + .test_expr (reg_tx_overrun == 1'b1) + ); + + // if rx_buf_full is high and rx_state change from 9 to 10, reg_rx_overrun will be set + assert_next + #(`OVL_ERROR, 1,1,0, `OVL_ASSERT, + "rx buffer overrun should be asserted when a new character is received and rx buffer is already full") + u_ovl_rx_buffer_overrun + (.clk(PCLK ), .reset_n (PRESETn), + .start_event (rx_buf_full & (~rx_data_read) & (rx_state==9) & (nxt_rx_state==10)), + .test_expr (reg_rx_overrun == 1'b1) + ); + + // if write to INTCLEAR with bit[2]=1, reg_tx_overrun will be cleared, + // Cannot have new overrun at the same time because the APB can only do onething at a time + assert_next + #(`OVL_ERROR, 1,1,0, `OVL_ASSERT, + "tx buffer overrun should be clear when write to INTCLEAR") + u_ovl_tx_buffer_overrun_clear_a + (.clk(PCLK ), .reset_n (PRESETn), + .start_event (write_enable0c & (PWDATA[2])), + .test_expr (reg_tx_overrun==1'b0) + ); + + // if write to STATUS with bit[2]=1, reg_tx_overrun will be cleared, + // Cannot have new overrun at the same time because the APB can only do onething at a time + assert_next + #(`OVL_ERROR, 1,1,0, `OVL_ASSERT, + "tx buffer overrun should be clear when write to INTCLEAR") + u_ovl_tx_buffer_overrun_clear_b + (.clk(PCLK ), .reset_n (PRESETn), + .start_event (write_enable04 & (PWDATA[2])), + .test_expr (reg_tx_overrun==1'b0) + ); + + // if write to INTCLEAR with bit[3]=1, reg_rx_overrun will be cleared, unless a new overrun take place + assert_next + #(`OVL_ERROR, 1,1,0, `OVL_ASSERT, + "rx buffer overrun should be clear when write to INTCLEAR, unless new overrun") + u_ovl_rx_buffer_overrun_clear_a + (.clk(PCLK ), .reset_n (PRESETn), + .start_event (write_enable0c & (PWDATA[3]) & (~(rx_buf_full & (rx_state==9) & (nxt_rx_state==10)))), + .test_expr (reg_rx_overrun==1'b0) + ); + + // If rx buffer is not full, it cannot have new overrun + assert_next + #(`OVL_ERROR, 1,1,0, `OVL_ASSERT, + "rx buffer overrun should be clear when write to INTCLEAR, unless new overrun") + u_ovl_rx_buffer_overrun_when_empty + (.clk(PCLK ), .reset_n (PRESETn), + .start_event ((~rx_buf_full) & (reg_rx_overrun==1'b0)), + .test_expr (reg_rx_overrun==1'b0) + ); + + + // Reading of reg_baud_div (worth checking due to two stage read mux) + assert_next + #(`OVL_ERROR, 1, 1, 0, `OVL_ASSERT, + "Reading of baud rate divider value") + u_ovl_read_baud_rate_divide_cfg + (.clk(PCLK ), .reset_n (PRESETn), + .start_event (PSEL & (~PENABLE) & (~PWRITE) & (PADDR[11:2]==10'h004)), + .test_expr (PRDATA=={{12{1'b0}}, reg_baud_div}) + ); + + // Recommended Baud Rate divider value is at least 16 + assert_never + #(`OVL_ERROR,`OVL_ASSERT, + "UART enabled with baud rate less than 16") + u_ovl_baud_rate_divider_illegal + (.clk(PCLK), .reset_n(PRESETn), + .test_expr(((reg_ctrl[0]) & (reg_ctrl[6]==1'b0) & (reg_baud_div[19:4]=={16{1'b0}}) ) | + ((reg_ctrl[1]) & (reg_baud_div[19:4]=={16{1'b0}}) ) ) + ); + + // Test mode never changes from hi-speed to normal speed unless TX is idle + assert_never + #(`OVL_ERROR,`OVL_ASSERT, + "High speed test mode has been changed when TX was not idle") + u_ovl_change_speed_tx_illegal + (.clk(PCLK), .reset_n(PRESETn), + .test_expr((tx_state != 4'd00) & (reg_ctrl[6] != ovl_last_reg_ctrl[6])) + ); + +`endif + +endmodule diff --git a/Cortex-M0/nanosoc/systems/mcu/verilog/cmsdk_clkreset.v b/Cortex-M0/nanosoc/systems/mcu/verilog/cmsdk_clkreset.v new file mode 100644 index 0000000..d30c3c8 --- /dev/null +++ b/Cortex-M0/nanosoc/systems/mcu/verilog/cmsdk_clkreset.v @@ -0,0 +1,62 @@ +//----------------------------------------------------------------------------- +// customised Cortex-M0 'nanosoc' controller +// A joint work commissioned on behalf of SoC Labs, under Arm Academic Access license. +// +// Contributors +// +// David Flynn (d.w.flynn@soton.ac.uk) +// +// Copyright � 2021-3, SoC Labs (www.soclabs.org) +//----------------------------------------------------------------------------- + +//----------------------------------------------------------------------------- +// The confidential and proprietary information contained in this file may +// only be used by a person authorised under and to the extent permitted +// by a subsisting licensing agreement from Arm Limited or its affiliates. +// +// (C) COPYRIGHT 2010-2013 Arm Limited or its affiliates. +// ALL RIGHTS RESERVED +// +// This entire notice must be reproduced on all copies of this file +// and copies of this file may only be made by a person if such person is +// permitted to do so under the terms of a subsisting license agreement +// from Arm Limited or its affiliates. +// +// SVN Information +// +// Checked In : $Date: 2017-10-10 15:55:38 +0100 (Tue, 10 Oct 2017) $ +// +// Revision : $Revision: 371321 $ +// +// Release Information : Cortex-M System Design Kit-r1p1-00rel0 +// +//----------------------------------------------------------------------------- +//----------------------------------------------------------------------------- +// Abstract : Simple clock and power on reset generator +//----------------------------------------------------------------------------- +`timescale 1ns/1ps + +module cmsdk_clkreset( + output wire CLK, + output wire NRST); + + reg clock_q = 1'b0; + reg reset_n_q = 1'b0; + + initial + begin + #40 clock_q <= 1'b1; + #100 reset_n_q <= 1'b1; + end + + always @(clock_q) + // #25 clock_q <= ~clock_q; // 50ns period 20MHz - 9600 baud + #5 clock_q <= ~clock_q; // 10ns period, 100MHz - 48000 baud + + assign CLK = clock_q; + assign NRST = reset_n_q; + +endmodule + + + diff --git a/Cortex-M0/nanosoc/systems/mcu/verilog/cmsdk_ft1248x1_adpio.v b/Cortex-M0/nanosoc/systems/mcu/verilog/cmsdk_ft1248x1_adpio.v new file mode 100644 index 0000000..89ecfe6 --- /dev/null +++ b/Cortex-M0/nanosoc/systems/mcu/verilog/cmsdk_ft1248x1_adpio.v @@ -0,0 +1,157 @@ +//----------------------------------------------------------------------------- +// customised example Cortex-M0 controller UART with file logging +// A joint work commissioned on behalf of SoC Labs, under Arm Academic Access license. +// +// Contributors +// +// David Flynn (d.w.flynn@soton.ac.uk) +// +// Copyright � 2022, SoC Labs (www.soclabs.org) +//----------------------------------------------------------------------------- + +//----------------------------------------------------------------------------- +// Abstract : FT1248 1-bit data off-chip interface (emulate FT232H device) +// and allows cmsdk_uart_capture testbench models to log ADP ip, op streams +//----------------------------------------------------------------------------- + + +module cmsdk_ft1248x1_adpio + #(parameter ADPFILENAME = "adp.cmd", + parameter VERBOSE = 0) + ( + input wire ft_clk_i, // SCLK + input wire ft_ssn_i, // SS_N + output wire ft_miso_o, // MISO + inout wire ft_miosio_io, // MIOSIO tristate output when enabled + + output wire FTDI_CLK2UART_o, // Clock (baud rate) + output wire FTDI_OP2UART_o, // Received data to UART capture + output wire FTDI_IP2UART_o // Transmitted data to UART capture + ); + + + //---------------------------------------------- + //-- File I/O + //---------------------------------------------- + + + integer fdcmd; // channel descriptor for cmd file input + integer ch; +`define EOF -1 + + reg ft_rxreq; + wire ft_rxack; + reg [7:0] ft_adpbyte; + + initial + begin + ft_rxreq <= 0; + $timeformat(-9, 0, " ns", 14); + fdcmd= $fopen(ADPFILENAME,"r"); + if (fdcmd == 0) + $write("** FT1248x1 : no command file **\n"); + else begin + ch = $fgetc(fdcmd); + while (ch != `EOF) begin + ft_adpbyte <= (ch & 8'hff); + ft_rxreq <= 1'b1; + while (ft_ssn_i == 1'b0) + @(posedge ft_ssn_i); + @(posedge ft_rxack); + ft_rxreq <=0; + @(negedge ft_rxack); + ch = $fgetc(fdcmd); + end + end + $fclose(fdcmd); + ft_rxreq <= 0; + end + + +//---------------------------------------------- +//-- State Machine +//---------------------------------------------- + +wire ft_miosio_i; +wire ft_miosio_o; +wire ft_miosio_z; + +// tri-state pad control for MIOSIO +assign ft_miosio_io = (ft_miosio_z) ? 1'bz : ft_miosio_o; +// add notinal delay on inout to ensure last "half-bit" on FT1248TXD is sampled before tri-stated +assign #1 ft_miosio_i = ft_miosio_io; + +reg [4:0] ft_state; // 17-state for bit-serial +wire [5:0] ft_nextstate = ft_state + 5'b00001; + +always @(posedge ft_clk_i or posedge ft_ssn_i) + if (ft_ssn_i) + ft_state <= 5'b11111; + else // loop if multi-data +// ft_state <= (ft_state == 5'b01111) ? 5'b01000 : ft_nextstate; + ft_state <= ft_nextstate; + +// 16: bus turnaround (or bit[5]) +// 0 for CMD3 +// 3 for CMD2 +// 5 for CMD1 +// 6 for CMD0 +// 7 for cmd turnaround +// 8 for data bit0 +// 9 for data bit1 +// 10 for data bit2 +// 11 for data bit3 +// 12 for data bit4 +// 13 for data bit5 +// 14 for data bit6 +// 15 for data bit7 + +// ft_miso_o reflects RXE when deselected +assign ft_miso_o = (ft_ssn_i) ? !ft_rxreq : (ft_state == 5'b00111); + +// capture CMD on falling edge of clock (mid-data) +// - valid sample ready after 7th edge (ready RX or TX data phase functionality) +reg [7:0] ft_cmd; +always @(negedge ft_clk_i or posedge ft_ssn_i) + if (ft_ssn_i) + ft_cmd <= 8'b00000001; + else // shift in data + ft_cmd <= (!ft_state[3] & !ft_nextstate[3]) ? {ft_cmd[6:0],ft_miosio_i} : ft_cmd; + +wire ft_cmd_valid = ft_cmd[7]; +wire ft_cmd_rxd = ft_cmd[7] & !ft_cmd[6] & !ft_cmd[3] & !ft_cmd[1] & ft_cmd[0]; +wire ft_cmd_txd = ft_cmd[7] & !ft_cmd[6] & !ft_cmd[3] & !ft_cmd[1] & !ft_cmd[0]; + +// tristate enable for miosio (deselected status or serialized data for read command) +wire ft_miosio_e = ft_ssn_i | (ft_cmd_rxd & !ft_state[4] & ft_state[3]); +assign ft_miosio_z = !ft_miosio_e; + +// serial data formatted with start bit for UART capture (on rising uart-clock) +assign FTDI_CLK2UART_o = !ft_clk_i; +// suitable for CMSDK UART capture IO +// inject a start bit low else mark high +assign FTDI_OP2UART_o = (ft_cmd_txd & (ft_state[4:3]) == 2'b01) ? ft_miosio_i : !(ft_cmd_txd & (ft_state == 5'b00111)); +assign FTDI_IP2UART_o = (ft_cmd_rxd & (ft_state[4:3]) == 2'b01) ? ft_miosio_io : !(ft_cmd_rxd & (ft_state == 5'b00111)); + +// capture RXD on falling edge of clock +reg [8:0] ft_rxd; +always @(negedge ft_clk_i or posedge ft_ssn_i) + if (ft_ssn_i) + ft_rxd <= 9'b111111111; + else if (ft_cmd_txd & !(ft_miosio_i & (&ft_rxd[8:0]))) //only on valid start-bit + ft_rxd <= {ft_miosio_i, ft_rxd[8:1]}; + +// shift TXD on rising edge of clock +reg [8:0] ft_txd; +always @(posedge ft_clk_i or posedge ft_ssn_i) + if (ft_ssn_i) + ft_txd <= {1'b1,ft_adpbyte}; + else if (ft_rxreq & ft_cmd_rxd & (ft_state[4:3] == 2'b01)) //valid TX shift + ft_txd <= {1'b0,ft_txd[8:1]}; + +assign ft_rxack = (ft_cmd_rxd & (ft_state==5'b01111)); + +// ft_miso_o reflects TXF when deselected (never full for simulation output) +assign ft_miosio_o = (ft_ssn_i) ? 1'b0 : ft_txd[0]; + +endmodule diff --git a/Cortex-M0/nanosoc/systems/mcu/verilog/cmsdk_mcu_clkctrl.v b/Cortex-M0/nanosoc/systems/mcu/verilog/cmsdk_mcu_clkctrl.v new file mode 100644 index 0000000..a994d01 --- /dev/null +++ b/Cortex-M0/nanosoc/systems/mcu/verilog/cmsdk_mcu_clkctrl.v @@ -0,0 +1,191 @@ +//----------------------------------------------------------------------------- +// customised Cortex-M0 'nanosoc' controller +// A joint work commissioned on behalf of SoC Labs, under Arm Academic Access license. +// +// Contributors +// +// David Flynn (d.w.flynn@soton.ac.uk) +// +// Copyright � 2021-3, SoC Labs (www.soclabs.org) +//----------------------------------------------------------------------------- + +//----------------------------------------------------------------------------- +// The confidential and proprietary information contained in this file may +// only be used by a person authorised under and to the extent permitted +// by a subsisting licensing agreement from Arm Limited or its affiliates. +// +// (C) COPYRIGHT 2010-2013 Arm Limited or its affiliates. +// ALL RIGHTS RESERVED +// +// This entire notice must be reproduced on all copies of this file +// and copies of this file may only be made by a person if such person is +// permitted to do so under the terms of a subsisting license agreement +// from Arm Limited or its affiliates. +// +// SVN Information +// +// Checked In : $Date: 2017-10-10 15:55:38 +0100 (Tue, 10 Oct 2017) $ +// +// Revision : $Revision: 371321 $ +// +// Release Information : Cortex-M System Design Kit-r1p1-00rel0 +// +//----------------------------------------------------------------------------- +//----------------------------------------------------------------------------- +// Abstract : Simple clock controller for Cortex-M0 example system +//----------------------------------------------------------------------------- +// Note : Most of the clock gating are handled by the example PMU provided +// in the Cortex-M0/Cortex-M0+ deliverable. + +module cmsdk_mcu_clkctrl #( + parameter CLKGATE_PRESENT = 0) + ( + input wire XTAL1, // Clock source + input wire NRST, // active low external reset + + input wire APBACTIVE, // APB active status + input wire SLEEPING, // Sleep status + input wire SLEEPDEEP, // Deep Sleep status + input wire SYSRESETREQ, // System reset request + input wire DBGRESETREQ, // Debug reset request + input wire LOCKUP, // LOCKUP status + input wire LOCKUPRESET, // Config - generation reset if locked up + + input wire CGBYPASS, // Clock gating bypass + input wire RSTBYPASS, // Reset by pass + + output wire XTAL2, // Feedback for Crystal oscillator + output wire FCLK, // Free running clock + output wire PCLK, // Peripheral clock + output wire PCLKG, // Gated PCLK for APB transfers + output wire PCLKEN, // Clock divide control for AHB to APB bridge +`ifdef CORTEX_M0DESIGNSTART + output wire PORESETn, // Power on reset + output wire HRESETn, // System and AHB reset +`endif + output wire PRESETn); // Peripheral reset + + wire clk; + wire reset_n; + reg [2:0] reset_sync_reg; + wire [2:0] nxt_reset_sync; +`ifdef CORTEX_M0DESIGNSTART + reg hrst_reg; + wire nxt_hrst; + reg dbgrst_reg; +`endif + reg prst_reg; + wire nxt_prst; + wire i_pclken; + wire i_pclkgen; + + // Crystal oscillator inverter + assign XTAL2 = (~(XTAL1 | SLEEPDEEP)); + + // Clock source + assign clk = XTAL1; + + // Reset synchronizer + assign nxt_reset_sync = {reset_sync_reg[1:0], 1'b1}; + + always @(posedge clk or negedge NRST) + begin + if (~NRST) + reset_sync_reg <= 3'b000; + else + reset_sync_reg <= nxt_reset_sync; + end + + assign reset_n = reset_sync_reg[2]; + +`ifdef CORTEX_M0DESIGNSTART + // AHB HRESETn + assign nxt_hrst = ~(SYSRESETREQ | (LOCKUP & LOCKUPRESET)); + + always @(posedge clk or negedge reset_n) + begin + if (~reset_n) + hrst_reg <= 1'b0; + else + hrst_reg <= nxt_hrst; + end + + // Debug Reset + always @(posedge clk or negedge reset_n) + begin + if (~reset_n) + dbgrst_reg <= 1'b0; + else + dbgrst_reg <= ~DBGRESETREQ; + end +`endif + + // APB PRESETn + assign nxt_prst = ~(SYSRESETREQ | (LOCKUP & LOCKUPRESET)); + + always @(posedge clk or negedge reset_n) + begin + if (~reset_n) + prst_reg <= 1'b0; + else + prst_reg <= nxt_prst; + end + + generate if (CLKGATE_PRESENT == 0) begin : gen_no_clock_gating + + // No clock gating for PCLK + assign i_pclken = 1'b1; // Currently PCLK = HCLK (for AHB to APB bridge) + assign i_pclkgen = 1'b1; // Not used + assign PCLK = clk; // Peripheral clock + assign PCLKG = clk; // Peripheral clock for APB interface + + end else + begin : gen_clock_gating + // Clock gate is present. + // Testing of divided PCLK is only possible when clock gating is available +`ifdef ARM_CMSDK_SLOWSPEED_PCLK + reg reg_pclk_divide; + + always @(posedge clk or negedge reset_n) + if (~reset_n) + reg_pclk_divide <= 1'b1; + else + reg_pclk_divide <= ~reg_pclk_divide; + + assign i_pclken = reg_pclk_divide; // PCLKEN toggle every cycle (PCLK at half speed) + +`else + assign i_pclken = 1'b1; // PCLK = HCLK +`endif + assign i_pclkgen = i_pclken & APBACTIVE; + + // PCLK generation + cmsdk_clock_gate + #(.CLKGATE_PRESENT(CLKGATE_PRESENT)) + u_cmsdk_clock_gate_pclk( + .CLK (clk), + .CLKENABLE (i_pclken), + .DISABLEG (CGBYPASS), + .GATEDCLK (PCLK)); + + // Gated PCLK (PCLKG) generation + cmsdk_clock_gate + #(.CLKGATE_PRESENT(CLKGATE_PRESENT)) + u_cmsdk_clock_gate_pclkg( + .CLK (clk), + .CLKENABLE (i_pclkgen), + .DISABLEG (CGBYPASS), + .GATEDCLK (PCLKG)); + + end endgenerate + + // Connect to top level +`ifdef CORTEX_M0DESIGNSTART + assign PORESETn = (RSTBYPASS) ? NRST : reset_n; + assign HRESETn = (RSTBYPASS) ? NRST : hrst_reg; +`endif + assign PRESETn = (RSTBYPASS) ? NRST : prst_reg; + assign FCLK = clk; // Free running clock + assign PCLKEN = i_pclken; + +endmodule diff --git a/Cortex-M0/nanosoc/systems/mcu/verilog/cmsdk_mcu_pin_mux.v b/Cortex-M0/nanosoc/systems/mcu/verilog/cmsdk_mcu_pin_mux.v new file mode 100644 index 0000000..82d0ae5 --- /dev/null +++ b/Cortex-M0/nanosoc/systems/mcu/verilog/cmsdk_mcu_pin_mux.v @@ -0,0 +1,233 @@ +//----------------------------------------------------------------------------- +// The confidential and proprietary information contained in this file may +// only be used by a person authorised under and to the extent permitted +// by a subsisting licensing agreement from Arm Limited or its affiliates. +// +// (C) COPYRIGHT 2010-2013 Arm Limited or its affiliates. +// ALL RIGHTS RESERVED +// +// This entire notice must be reproduced on all copies of this file +// and copies of this file may only be made by a person if such person is +// permitted to do so under the terms of a subsisting license agreement +// from Arm Limited or its affiliates. +// +// SVN Information +// +// Checked In : $Date: 2017-10-10 15:55:38 +0100 (Tue, 10 Oct 2017) $ +// +// Revision : $Revision: 371321 $ +// +// Release Information : Cortex-M System Design Kit-r1p1-00rel0 +// +//----------------------------------------------------------------------------- +//----------------------------------------------------------------------------- +// Abstract : Pin multiplexing control for example Cortex-M0/Cortex-M0+ +// microcontroller +//----------------------------------------------------------------------------- +// +module cmsdk_mcu_pin_mux ( + //------------------------------------------- + // I/O ports + //------------------------------------------- + + // UART + output wire uart0_rxd, + input wire uart0_txd, + input wire uart0_txen, + output wire uart1_rxd, + input wire uart1_txd, + input wire uart1_txen, + output wire uart2_rxd, + input wire uart2_txd, + input wire uart2_txen, + + // Timer + output wire timer0_extin, + output wire timer1_extin, + +`ifdef CORTEX_M0PLUS +`ifdef ARM_CMSDK_INCLUDE_MTB + // CoreSight MTB M0+ + output wire TSTART, + output wire TSTOP, +`endif +`endif + + // IO Ports + output wire [15:0] p0_in, + input wire [15:0] p0_out, + input wire [15:0] p0_outen, + input wire [15:0] p0_altfunc, + + output wire [15:0] p1_in, + input wire [15:0] p1_out, + input wire [15:0] p1_outen, + input wire [15:0] p1_altfunc, + + // Processor debug interface + output wire i_trst_n, + output wire i_swditms, + output wire i_swclktck, + output wire i_tdi, + input wire i_tdo, + input wire i_tdoen_n, + input wire i_swdo, + input wire i_swdoen, + + // IO pads + inout wire [15:0] P0, // legacy + inout wire [15:0] P1, // legacy + + output wire [15:0] p1_out_mux, //alt-function mux + output wire [15:0] p1_out_en_mux, //alt-function mux + + input wire nTRST, // Not needed if serial-wire debug is used + input wire TDI, // Not needed if serial-wire debug is used + inout wire SWDIOTMS, + input wire SWCLKTCK, + output wire TDO); // Not needed if serial-wire debug is used + + //------------------------------------------- + // Internal wires + //------------------------------------------- + wire [15:0] p0_out_mux; + wire [15:0] p0_out_en_mux; +// wire [15:0] p1_out_mux; // promoted to block output +// wire [15:0] p1_out_en_mux; // promoted to block output + + //------------------------------------------- + // Beginning of main code + //------------------------------------------- + // inputs + assign uart0_rxd = p1_in[0]; + assign uart1_rxd = p1_in[2]; + assign uart2_rxd = p1_in[4]; + assign timer0_extin = p1_in[8]; + assign timer1_extin = p1_in[9]; + + assign p0_in = P0; + assign p1_in = P1; + + // Output function mux + assign p0_out_mux = p0_out; // No function muxing for Port 0 + + assign p1_out_mux[0] = p1_out[0]; + assign p1_out_mux[1] = (p1_altfunc[1]) ? uart0_txd : p1_out[1]; + assign p1_out_mux[2] = p1_out[2]; + assign p1_out_mux[3] = (p1_altfunc[3]) ? uart1_txd : p1_out[3]; + assign p1_out_mux[4] = p1_out[4]; + assign p1_out_mux[5] = (p1_altfunc[5]) ? uart2_txd : p1_out[5]; + assign p1_out_mux[15:6] = p1_out[15:6]; + +`ifdef CORTEX_M0PLUS +`ifdef ARM_CMSDK_INCLUDE_MTB + // MTB control + // The TSTART/TSTOP synchronising logic is instantiated within the + // cmsdk_mcu_system module. + assign TSTART = p1_in[7]; + assign TSTOP = p1_in[6]; + // This allows TSTART and TSTOP to be controlled from external sources. +`endif +`endif + + // Output enable mux + assign p0_out_en_mux = p0_outen; // No function muxing for Port 0 + + assign p1_out_en_mux[0] = p1_outen[0]; + assign p1_out_en_mux[1] = (p1_altfunc[1]) ? uart0_txen : p1_outen[1]; + assign p1_out_en_mux[2] = p1_outen[2]; + assign p1_out_en_mux[3] = (p1_altfunc[3]) ? uart1_txen : p1_outen[3]; + assign p1_out_en_mux[4] = p1_outen[4]; + assign p1_out_en_mux[5] = (p1_altfunc[5]) ? uart2_txen : p1_outen[5]; + assign p1_out_en_mux[15:6] = p1_outen[15:6]; + + + // Output tristate + assign P0[ 0] = p0_out_en_mux[ 0] ? p0_out_mux[ 0] : 1'bz; + assign P0[ 1] = p0_out_en_mux[ 1] ? p0_out_mux[ 1] : 1'bz; + assign P0[ 2] = p0_out_en_mux[ 2] ? p0_out_mux[ 2] : 1'bz; + assign P0[ 3] = p0_out_en_mux[ 3] ? p0_out_mux[ 3] : 1'bz; + assign P0[ 4] = p0_out_en_mux[ 4] ? p0_out_mux[ 4] : 1'bz; + assign P0[ 5] = p0_out_en_mux[ 5] ? p0_out_mux[ 5] : 1'bz; + assign P0[ 6] = p0_out_en_mux[ 6] ? p0_out_mux[ 6] : 1'bz; + assign P0[ 7] = p0_out_en_mux[ 7] ? p0_out_mux[ 7] : 1'bz; + assign P0[ 8] = p0_out_en_mux[ 8] ? p0_out_mux[ 8] : 1'bz; + assign P0[ 9] = p0_out_en_mux[ 9] ? p0_out_mux[ 9] : 1'bz; + assign P0[10] = p0_out_en_mux[10] ? p0_out_mux[10] : 1'bz; + assign P0[11] = p0_out_en_mux[11] ? p0_out_mux[11] : 1'bz; + assign P0[12] = p0_out_en_mux[12] ? p0_out_mux[12] : 1'bz; + assign P0[13] = p0_out_en_mux[13] ? p0_out_mux[13] : 1'bz; + assign P0[14] = p0_out_en_mux[14] ? p0_out_mux[14] : 1'bz; + assign P0[15] = p0_out_en_mux[15] ? p0_out_mux[15] : 1'bz; + + assign P1[ 0] = p1_out_en_mux[ 0] ? p1_out_mux[ 0] : 1'bz; + assign P1[ 1] = p1_out_en_mux[ 1] ? p1_out_mux[ 1] : 1'bz; + assign P1[ 2] = p1_out_en_mux[ 2] ? p1_out_mux[ 2] : 1'bz; + assign P1[ 3] = p1_out_en_mux[ 3] ? p1_out_mux[ 3] : 1'bz; + assign P1[ 4] = p1_out_en_mux[ 4] ? p1_out_mux[ 4] : 1'bz; + assign P1[ 5] = p1_out_en_mux[ 5] ? p1_out_mux[ 5] : 1'bz; + assign P1[ 6] = p1_out_en_mux[ 6] ? p1_out_mux[ 6] : 1'bz; + assign P1[ 7] = p1_out_en_mux[ 7] ? p1_out_mux[ 7] : 1'bz; + assign P1[ 8] = p1_out_en_mux[ 8] ? p1_out_mux[ 8] : 1'bz; + assign P1[ 9] = p1_out_en_mux[ 9] ? p1_out_mux[ 9] : 1'bz; + assign P1[10] = p1_out_en_mux[10] ? p1_out_mux[10] : 1'bz; + assign P1[11] = p1_out_en_mux[11] ? p1_out_mux[11] : 1'bz; + assign P1[12] = p1_out_en_mux[12] ? p1_out_mux[12] : 1'bz; + assign P1[13] = p1_out_en_mux[13] ? p1_out_mux[13] : 1'bz; + assign P1[14] = p1_out_en_mux[14] ? p1_out_mux[14] : 1'bz; + assign P1[15] = p1_out_en_mux[15] ? p1_out_mux[15] : 1'bz; + +/* +// synopsys translate_off + + // Pullup + pullup(P0[ 0]); + pullup(P0[ 1]); + pullup(P0[ 2]); + pullup(P0[ 3]); + pullup(P0[ 4]); + pullup(P0[ 5]); + pullup(P0[ 6]); + pullup(P0[ 7]); + pullup(P0[ 8]); + pullup(P0[ 9]); + pullup(P0[10]); + pullup(P0[11]); + pullup(P0[12]); + pullup(P0[13]); + pullup(P0[14]); + pullup(P0[15]); + + pullup(P1[ 0]); + pullup(P1[ 1]); + pullup(P1[ 2]); + pullup(P1[ 3]); + pullup(P1[ 4]); + pullup(P1[ 5]); + pullup(P1[ 6]); + pullup(P1[ 7]); + pullup(P1[ 8]); + pullup(P1[ 9]); + pullup(P1[10]); + pullup(P1[11]); + pullup(P1[12]); + pullup(P1[13]); + pullup(P1[14]); + pullup(P1[15]); + +// synopsys translate_on +*/ + //------------------------------------------- + // Debug connections + //------------------------------------------- + + assign i_trst_n = nTRST; + assign i_tdi = TDI; + assign i_swclktck = SWCLKTCK; + assign i_swditms = SWDIOTMS; + + // Tristate buffers for debug output signals + bufif1 (SWDIOTMS, i_swdo, i_swdoen); + bufif0 (TDO, i_tdo, i_tdoen_n); + + endmodule diff --git a/Cortex-M0/nanosoc/systems/mcu/verilog/cmsdk_mcu_stclkctrl.v b/Cortex-M0/nanosoc/systems/mcu/verilog/cmsdk_mcu_stclkctrl.v new file mode 100644 index 0000000..30221aa --- /dev/null +++ b/Cortex-M0/nanosoc/systems/mcu/verilog/cmsdk_mcu_stclkctrl.v @@ -0,0 +1,80 @@ +//----------------------------------------------------------------------------- +// The confidential and proprietary information contained in this file may +// only be used by a person authorised under and to the extent permitted +// by a subsisting licensing agreement from Arm Limited or its affiliates. +// +// (C) COPYRIGHT 2010-2013 Arm Limited or its affiliates. +// ALL RIGHTS RESERVED +// +// This entire notice must be reproduced on all copies of this file +// and copies of this file may only be made by a person if such person is +// permitted to do so under the terms of a subsisting license agreement +// from Arm Limited or its affiliates. +// +// SVN Information +// +// Checked In : $Date: 2017-10-10 15:55:38 +0100 (Tue, 10 Oct 2017) $ +// +// Revision : $Revision: 371321 $ +// +// Release Information : Cortex-M System Design Kit-r1p1-00rel0 +// +//----------------------------------------------------------------------------- +//----------------------------------------------------------------------------- +// Abstract : Simple control for SysTick signals for Cortex-M processor +//----------------------------------------------------------------------------- + +module cmsdk_mcu_stclkctrl #( + // Ratio between FCLK and SysTck reference clock + parameter DIV_RATIO = 18'd01000, + + // Divide by half for each phase + parameter DIVIDER_RELOAD = (DIV_RATIO>>1)-1 + ) + ( + input wire FCLK, // Free running clock + input wire SYSRESETn, // System reset + + output wire STCLKEN, // SysTick clock + output wire [25:0] STCALIB // SysTick calibration + ); + + reg [17:0] reg_clk_divider; + reg reg_stclken; + + assign STCALIB[25] = 1'b0; // NoRef - reference clock provided + assign STCALIB[24] = 1'b1; // Skew - reference info not available + assign STCALIB[23:0] = {24{1'b0}}; // 10 ms value set to 0, indicate this value is not used + + // Divider + wire [17:0] reg_clk_div_min1 = reg_clk_divider -1; + always @(posedge FCLK or negedge SYSRESETn) + begin + if (~SYSRESETn) + reg_clk_divider <= {18{1'b0}}; + else + begin + if (|reg_clk_divider) + reg_clk_divider <= reg_clk_div_min1[17:0]; + else + reg_clk_divider <= DIVIDER_RELOAD[17:0]; + end + end + + // Toggle register + always @(posedge FCLK or negedge SYSRESETn) + begin + if (~SYSRESETn) + reg_stclken <= 1'b0; + else + begin + if (reg_clk_divider==18'h00000) + reg_stclken <= ~reg_stclken; + end + end + + // Connect to top level + assign STCLKEN = reg_stclken; + +endmodule + diff --git a/Cortex-M0/nanosoc/systems/mcu/verilog/cmsdk_mcu_sysctrl.v b/Cortex-M0/nanosoc/systems/mcu/verilog/cmsdk_mcu_sysctrl.v new file mode 100644 index 0000000..383b4af --- /dev/null +++ b/Cortex-M0/nanosoc/systems/mcu/verilog/cmsdk_mcu_sysctrl.v @@ -0,0 +1,351 @@ +//----------------------------------------------------------------------------- +// customised Cortex-M0 'nanosoc' controller +// A joint work commissioned on behalf of SoC Labs, under Arm Academic Access license. +// +// Contributors +// +// David Flynn (d.w.flynn@soton.ac.uk) +// +// Copyright � 2021-3, SoC Labs (www.soclabs.org) +//----------------------------------------------------------------------------- + +//----------------------------------------------------------------------------- +// The confidential and proprietary information contained in this file may +// only be used by a person authorised under and to the extent permitted +// by a subsisting licensing agreement from Arm Limited or its affiliates. +// +// (C) COPYRIGHT 2010-2013 Arm Limited or its affiliates. +// ALL RIGHTS RESERVED +// +// This entire notice must be reproduced on all copies of this file +// and copies of this file may only be made by a person if such person is +// permitted to do so under the terms of a subsisting license agreement +// from Arm Limited or its affiliates. +// +// SVN Information +// +// Checked In : $Date: 2017-10-10 15:55:38 +0100 (Tue, 10 Oct 2017) $ +// +// Revision : $Revision: 371321 $ +// +// Release Information : Cortex-M System Design Kit-r1p1-00rel0 +// +//----------------------------------------------------------------------------- +//----------------------------------------------------------------------------- +// Abstract : System controller for simple Cortex-M Microcontroller system +//----------------------------------------------------------------------------- +//------------------------------------- +// Programmer's model +// ------------------------------- +// 0x000 RW MEM_CTRL +// bit [ 0] REMAP - default value 1 +// 0x004 RW PMU_CTRL +// bit [ 0] PMUENABLE - default value 0 +// 0x008 R/W SYS_CTRL +// bit [ 0] LOCKUPRESETEN - default value 0 +// 0x00C -- Not used +// +// 0x010 R/Wc Reset Information +// bit [ 2] LOCKUPRESET +// bit [ 1] WDOGRESETREQ +// bit [ 0] SYSRESETREQ +// +//------------------------------------- + +module cmsdk_mcu_sysctrl #( + parameter BE = 0 // By default use little endian + + ) + ( + // AHB Inputs + input wire HCLK, // system bus clock + input wire HRESETn, // system bus reset + input wire FCLK, // Free running clock + input wire PORESETn, // power on reset + input wire HSEL, // AHB peripheral select + input wire HREADY, // AHB ready input + input wire [1:0] HTRANS, // AHB transfer type + input wire [2:0] HSIZE, // AHB hsize + input wire HWRITE, // AHB hwrite + input wire [11:0] HADDR, // AHB address bus + input wire [31:0] HWDATA, // AHB write data bus + + // AHB Outputs + output wire HREADYOUT, // AHB ready output to S->M mux + output wire HRESP, // AHB response + output wire [31:0] HRDATA, // AHB read data bus + + // Reset information + input wire SYSRESETREQ,// System reset request + input wire WDOGRESETREQ,// Watchdog reset request + input wire LOCKUP, // CPU locked up + + //ECO revision number + input wire [3:0] ECOREVNUM, // ECO revision number + + // System control signals + output wire REMAP, // memory remap + output wire PMUENABLE, // Power Management Unit enable, will be disabled in design + // start version + output wire LOCKUPRESET // Enable reset if lockup + ); + +// -------------------------------------------------------------------------- +// Port Definitions +// -------------------------------------------------------------------------- + +//Local parameter for IDs, +localparam ARM_CMSDK_CM0_SYSCTRL_PID4 = {32'h00000004}; // 0xFD0 : PID 4 +localparam ARM_CMSDK_CM0_SYSCTRL_PID5 = {32'h00000000}; // 0xFD4 : PID 5 +localparam ARM_CMSDK_CM0_SYSCTRL_PID6 = {32'h00000000}; // 0xFD8 : PID 6 +localparam ARM_CMSDK_CM0_SYSCTRL_PID7 = {32'h00000000}; // 0xFDC : PID 7 +localparam ARM_CMSDK_CM0_SYSCTRL_PID0 = {32'h00000026}; // 0xFE0 : PID 0 part number[7:0] +localparam ARM_CMSDK_CM0_SYSCTRL_PID1 = {32'h000000B8}; // 0xFE4 : PID 1 [7:4] jep106_id_3_0. [3:0] part number [11:8] +localparam ARM_CMSDK_CM0_SYSCTRL_PID2 = {32'h0000001B}; // 0xFE8 : PID 2 [7:4] revision, [3] jedec_used. [2:0] jep106_id_6_4 +localparam ARM_CMSDK_CM0_SYSCTRL_PID3 = {32'h00000000}; // 0xFEC : PID 3 +localparam ARM_CMSDK_CM0_SYSCTRL_CID0 = {32'h0000000D}; // 0xFF0 : CID 0 +localparam ARM_CMSDK_CM0_SYSCTRL_CID1 = {32'h000000F0}; // 0xFF4 : CID 1 PrimeCell class +localparam ARM_CMSDK_CM0_SYSCTRL_CID2 = {32'h00000005}; // 0xFF8 : CID 2 +localparam ARM_CMSDK_CM0_SYSCTRL_CID3 = {32'h000000B1}; // 0xFFC : CID 3 + // Note : Customer changing the design should modify + // - jep106 value (www.jedec.org) + // - part number (customer define) + // - Optional revision and modification number (e.g. rXpY) + + // -------------------------------------------------------------------------- + // Internal wires + // -------------------------------------------------------------------------- + + reg [31:0] read_mux; + reg [31:0] read_mux_le; // little endian of read mux + reg reg_remap; +`ifdef CORTEX_M0DESIGNSTART + wire reg_pmuenable; +`else + reg reg_pmuenable; +`endif + reg reg_lockupreset; + reg [2:0] reg_resetinfo; + + // ---------------------------------------------------------- + // Read/write control logic + // ---------------------------------------------------------- + + wire bigendian = (BE!=0) ? 1'b1 : 1'b0; + wire ahb_access = HTRANS[1] & HSEL & HREADY; + wire ahb_write = ahb_access & HWRITE; + wire ahb_read = ahb_access & (~HWRITE); + wire [3:0] nxt_byte_strobe; + reg [3:0] reg_byte_strobe; + reg reg_read_enable; + reg reg_write_enable; + reg [11:2] reg_addr; + reg [1:0] reg_hsize; + reg [31:0] HWDATALE; // Little endian version of HWDATA + + // Generate byte strobes to allow the GPIO registers to handle different transfer sizes + assign nxt_byte_strobe[0] = (HSIZE[1] | ((HADDR[1]==1'b0) & HSIZE[0]) | (HADDR[1:0]==2'b00)) & ahb_access; + assign nxt_byte_strobe[1] = (HSIZE[1] | ((HADDR[1]==1'b0) & HSIZE[0]) | (HADDR[1:0]==2'b01)) & ahb_access; + assign nxt_byte_strobe[2] = (HSIZE[1] | ((HADDR[1]==1'b1) & HSIZE[0]) | (HADDR[1:0]==2'b10)) & ahb_access; + assign nxt_byte_strobe[3] = (HSIZE[1] | ((HADDR[1]==1'b1) & HSIZE[0]) | (HADDR[1:0]==2'b11)) & ahb_access; + + // Data phase read write and byte lane strobe + always @(posedge HCLK or negedge HRESETn) + begin + if (~HRESETn) + begin + reg_byte_strobe <= 4'b0000; + reg_read_enable <= 1'b0; + reg_write_enable <= 1'b0; + end + else if (HREADY) + begin + reg_byte_strobe <= nxt_byte_strobe; + reg_read_enable <= ahb_read; + reg_write_enable <= ahb_write; + end + end + + // registered address, undate only if selected to reduce toggling + always @(posedge HCLK or negedge HRESETn) + begin + if (~HRESETn) + reg_addr <= {10{1'b0}}; + else if (ahb_access) + reg_addr <= HADDR[11:2]; + end + + // registered hsize, update only if selected to reduce toggling + always @(posedge HCLK or negedge HRESETn) + begin + if (~HRESETn) + reg_hsize <= {2{1'b0}}; + else if (ahb_access) + reg_hsize <= HSIZE[1:0]; + end + + + // Read operation + always @(reg_addr or reg_remap or reg_pmuenable or ECOREVNUM or + reg_lockupreset or reg_resetinfo or reg_read_enable) + begin + case (reg_read_enable) + 1'b1: + begin + if (reg_addr[11:5] == 7'h00) begin + case(reg_addr[4:2]) + 3'b000: read_mux_le ={{31{1'b0}}, reg_remap} ; + 3'b001: read_mux_le ={{31{1'b0}}, reg_pmuenable} ; + 3'b010: read_mux_le ={{31{1'b0}}, reg_lockupreset} ; + 3'b100: read_mux_le ={{29{1'b0}}, reg_resetinfo} ; + 3'b011,3'b101,3'b110,3'b111: read_mux_le = {32{1'b0}}; + default: read_mux_le = {32{1'bx}}; + endcase + end + else if (reg_addr[11:6] == 6'h3F)begin + case (reg_addr[5:2]) + 4'h4: read_mux_le = ARM_CMSDK_CM0_SYSCTRL_PID4; //0xFD0 Peripheral ID 4 + 4'h5: read_mux_le = ARM_CMSDK_CM0_SYSCTRL_PID5; //0xFD4 Peripheral ID 5 + 4'h6: read_mux_le = ARM_CMSDK_CM0_SYSCTRL_PID6; //0xFD8 Peripheral ID 6 + 4'h7: read_mux_le = ARM_CMSDK_CM0_SYSCTRL_PID7; //0xFDC Peripheral ID 7 + 4'h8: read_mux_le = ARM_CMSDK_CM0_SYSCTRL_PID0; //0xFE0 Peripheral ID 0 + 4'h9: read_mux_le = ARM_CMSDK_CM0_SYSCTRL_PID1; //0xFE4 Peripheral ID 1 + 4'hA: read_mux_le = ARM_CMSDK_CM0_SYSCTRL_PID2; //0xFE8 Peripheral ID 2 + 4'hB: read_mux_le = {ARM_CMSDK_CM0_SYSCTRL_PID3[31:8], ECOREVNUM[3:0], 4'h0}; //0xFEC Peripheral ID 3 + 4'hC: read_mux_le = ARM_CMSDK_CM0_SYSCTRL_CID0; //0xFF0 Component ID 0 + 4'hD: read_mux_le = ARM_CMSDK_CM0_SYSCTRL_CID1; //0xFF4 Component ID 1 + 4'hE: read_mux_le = ARM_CMSDK_CM0_SYSCTRL_CID2; //0xFF8 Component ID 2 + 4'hF: read_mux_le = ARM_CMSDK_CM0_SYSCTRL_CID3; //0xFFC Component ID 3 + 4'h0, 4'h1, 4'h2,4'h3: read_mux_le = {32{1'b0}}; + default: read_mux_le = {32{1'bx}}; + endcase + end + else begin + read_mux_le = {32{1'b0}}; + end + end + 1'b0:// read_enable is not active + begin + read_mux_le = {32{1'b0}}; + end + default: + read_mux_le = {32{1'bx}}; + endcase + end + + // endian conversion + always @(bigendian or reg_hsize or read_mux_le or HWDATA) + begin + if ((bigendian)&(reg_hsize==2'b10)) + begin + read_mux = {read_mux_le[ 7: 0],read_mux_le[15: 8], + read_mux_le[23:16],read_mux_le[31:24]}; + HWDATALE = {HWDATA[ 7: 0],HWDATA[15: 8],HWDATA[23:16],HWDATA[ 31:24]}; + end + else if ((bigendian)&(reg_hsize==2'b01)) + begin + read_mux = {read_mux_le[23:16],read_mux_le[31:24], + read_mux_le[ 7: 0],read_mux_le[15: 8]}; + HWDATALE = {HWDATA[23:16],HWDATA[ 31:24],HWDATA[ 7: 0],HWDATA[15: 8]}; + end + else + begin + read_mux = read_mux_le; + HWDATALE = HWDATA; + end + end + // ---------------------------------------------------------- + // Remap register + // ---------------------------------------------------------- + wire reg_remap_write; + assign reg_remap_write = reg_write_enable & + (reg_addr[11:2] == 10'h000) & reg_byte_strobe[0]; + + // registering stage + always @(posedge HCLK or negedge HRESETn) + begin + if (~HRESETn) + reg_remap <= 1'b1; + else if (reg_remap_write) + reg_remap <= HWDATALE[0]; + end + + // ---------------------------------------------------------- + // PMUENABLE register + // ---------------------------------------------------------- + +`ifdef CORTEX_M0DESIGNSTART + // Power management unit not available with Cortex-M0 DesignStart. + // PMU control is disabled + assign reg_pmuenable = 1'b0; +`else + // Normal Cortex-M0 can have a programmable PMU + wire reg_pmuenable_write; + assign reg_pmuenable_write = reg_write_enable & + (reg_addr[11:2] == 10'h001) & reg_byte_strobe[0]; + + // registering stage + always @(posedge HCLK or negedge HRESETn) + begin + if (~HRESETn) + reg_pmuenable <= 1'b0; + else if (reg_pmuenable_write) + reg_pmuenable <= HWDATALE[0]; + end +`endif + + // ---------------------------------------------------------- + // LOCKUPRESETEN register + // ---------------------------------------------------------- + wire reg_lockupreset_write; + assign reg_lockupreset_write = reg_write_enable & + (reg_addr[11:2] == 10'h002) & reg_byte_strobe[0]; + + // registering stage + always @(posedge HCLK or negedge HRESETn) + begin + if (~HRESETn) + reg_lockupreset <= 1'b0; + else if (reg_lockupreset_write) + reg_lockupreset <= HWDATALE[0]; + end + + // ---------------------------------------------------------- + // Reset information register + // ---------------------------------------------------------- + + wire reg_resetinfo_write; + assign reg_resetinfo_write = reg_write_enable & + (reg_addr[11:2] == 10'h004) & reg_byte_strobe[0]; + + // capture reset information + wire [2:0] nxt_resetinfo; + // Write 1 to clear + assign nxt_resetinfo[0] = ((~(reg_resetinfo_write & HWDATALE[0])) & reg_resetinfo[0]) | SYSRESETREQ; + assign nxt_resetinfo[1] = ((~(reg_resetinfo_write & HWDATALE[1])) & reg_resetinfo[1]) | WDOGRESETREQ; + assign nxt_resetinfo[2] = ((~(reg_resetinfo_write & HWDATALE[2])) & reg_resetinfo[2]) | (reg_lockupreset & LOCKUP); + + // Enable flip-flop only if it should be updated to reduce power + wire reg_resetinfo_en; + assign reg_resetinfo_en = reg_resetinfo_write | SYSRESETREQ | WDOGRESETREQ | (reg_lockupreset & LOCKUP); + + // registering stage + always @(posedge FCLK or negedge PORESETn) + begin + if (~PORESETn) + reg_resetinfo <= 3'b000; + else if (reg_resetinfo_en) + reg_resetinfo <= nxt_resetinfo; + end + + // Connect to higher level + assign REMAP = reg_remap; + assign PMUENABLE = reg_pmuenable; + assign LOCKUPRESET = reg_lockupreset; + + assign HREADYOUT = 1'b1; + assign HRDATA = read_mux; + assign HRESP = 1'b0; + +endmodule + diff --git a/Cortex-M0/nanosoc/systems/mcu/verilog/cmsdk_uart_capture.v b/Cortex-M0/nanosoc/systems/mcu/verilog/cmsdk_uart_capture.v new file mode 100644 index 0000000..cbc46f7 --- /dev/null +++ b/Cortex-M0/nanosoc/systems/mcu/verilog/cmsdk_uart_capture.v @@ -0,0 +1,251 @@ +//----------------------------------------------------------------------------- +// updated UART RXD capture with file logging +// A joint work commissioned on behalf of SoC Labs, under Arm Academic Access license. +// +// Contributors +// +// David Flynn (d.w.flynn@soton.ac.uk) +// +// Copyright � 2021, SoC Labs (www.soclabs.org) +//----------------------------------------------------------------------------- + +//----------------------------------------------------------------------------- +// The confidential and proprietary information contained in this file may +// only be used by a person authorised under and to the extent permitted +// by a subsisting licensing agreement from Arm Limited or its affiliates. +// +// (C) COPYRIGHT 2010-2013 Arm Limited or its affiliates. +// ALL RIGHTS RESERVED +// +// This entire notice must be reproduced on all copies of this file +// and copies of this file may only be made by a person if such person is +// permitted to do so under the terms of a subsisting license agreement +// from Arm Limited or its affiliates. +// +// SVN Information +// +// Checked In : $Date: 2017-10-10 15:55:38 +0100 (Tue, 10 Oct 2017) $ +// +// Revision : $Revision: 371321 $ +// +// Release Information : Cortex-M System Design Kit-r1p1-00rel0 +// +//----------------------------------------------------------------------------- +//----------------------------------------------------------------------------- +// Abstract : A device to capture serial data +//----------------------------------------------------------------------------- +// This module assume CLK is same frequency as baud rate. +// In the example UART a test mode is used to enable data output as maximum +// speed (PCLK). In such case we can connect CLK signal directly to PCLK. +// Otherwise, if the UART baud rate is reduced, the CLK rate has to be reduced +// accordingly as well. +// +// This module stop the simulation when character 0x04 is received. +// An output called SIMULATION_END is set for 1 cycle before simulation is +// terminated to allow other testbench component like profiler (if any) +// to output reports before the simulation stop. +// +// This model also support ESCAPE (0x1B, decimal 27) code sequence +// ESC - 0x10 - XY Capture XY to AUXCTRL output +// ESC - 0x11 Set DEBUG_TESTER_ENABLE to 1 +// ESC - 0x12 Clear DEBUG_TESTER_ENABLE to 0 + + +module cmsdk_uart_capture + #(parameter LOGFILENAME = "uart.log", + parameter VERBOSE = 0) + ( + input wire RESETn, // Power on reset + input wire CLK, // Clock (baud rate) + input wire RXD, // Received data + output wire SIMULATIONEND, // Simulation end indicator + output wire DEBUG_TESTER_ENABLE, // Enable debug tester + output wire [7:0] AUXCTRL); // Auxiliary control + + reg [8:0] rx_shift_reg; + wire [8:0] nxt_rx_shift; + reg [6:0] string_length; + reg [7:0] tube_string [127:0]; + reg [7:0] text_char; + integer i; + reg nxt_end_simulation; + reg reg_end_simulation; + wire char_received; + reg reg_esc_code_mode; // Escape code mode + reg reg_aux_ctrl_mode; // Auxiliary control capture mode + reg [7:0] reg_aux_ctrl; // Registered Auxiliary control + reg reg_dbgtester_enable; + + integer mcd; // channel descriptor for log file output + reg [40*8-1:0] log_file; // File name can't be > *40* characters + +`define UartSTDOUT 32'h00000001 + initial + begin + $timeformat(-9, 0, " ns", 14); + log_file = LOGFILENAME; + mcd = $fopen(log_file); + mcd = mcd | `UartSTDOUT; // always echo to console + if(mcd == 0) begin + $fwrite(mcd,"tarmac: Error, zero returned in response to $fopen\n"); + $finish(2); + end + $fwrite(mcd,"uartcapture: Generating output file %0s using MCD %x @ %m\n", + log_file, mcd); + end + + // Receive shift register + assign nxt_rx_shift = {RXD,rx_shift_reg[8:1]}; + assign char_received = (rx_shift_reg[0]==1'b0); + + always @(posedge CLK or negedge RESETn) + begin + if (~RESETn) + rx_shift_reg <= {9{1'b1}}; + else + if (rx_shift_reg[0]==1'b0) // Start bit reach bit[0] + rx_shift_reg <= {9{1'b1}}; + else + rx_shift_reg <= nxt_rx_shift; + end + + // Escape code mode register + always @(posedge CLK or negedge RESETn) + begin + if (~RESETn) + reg_esc_code_mode <= 1'b0; + else // Set to escape mode if ESC code is detected + if (char_received & (reg_esc_code_mode==1'b0) & (rx_shift_reg[8:1]==8'h1B)) + reg_esc_code_mode <= 1'b1; + else if (char_received) + reg_esc_code_mode <= 1'b0; + end + + // Aux Ctrl capture mode register + always @(posedge CLK or negedge RESETn) + begin + if (~RESETn) + reg_aux_ctrl_mode <= 1'b0; + else // Set to Aux control capture mode if ESC-0x10 sequence is detected + if (char_received & (reg_esc_code_mode==1'b1) & (rx_shift_reg[8:1]==8'h10)) + reg_aux_ctrl_mode <= 1'b1; + else if (char_received) + reg_aux_ctrl_mode <= 1'b0; + end + + // Aux Ctrl capture data register + always @(posedge CLK or negedge RESETn) + begin + if (~RESETn) + reg_aux_ctrl <= {8{1'b0}}; + else // Capture received data to Aux control output if reg_aux_ctrl_mode is set + if (char_received & (reg_aux_ctrl_mode==1'b1)) + reg_aux_ctrl <= rx_shift_reg[8:1]; + end + + assign AUXCTRL = reg_aux_ctrl; + + // Debug tester enable + always @(posedge CLK or negedge RESETn) + begin + if (~RESETn) + reg_dbgtester_enable <= 1'b0; + else // Enable debug tester if ESC-0x11 sequence is detected + if (char_received & (reg_esc_code_mode==1'b1) & (rx_shift_reg[8:1]==8'h11)) + reg_dbgtester_enable <= 1'b1; + else if (char_received & (reg_esc_code_mode==1'b1) & (rx_shift_reg[8:1]==8'h12)) + // Disable debug tester if ESC-0x12 sequence is detected + reg_dbgtester_enable <= 1'b0; + end + + assign DEBUG_TESTER_ENABLE = reg_dbgtester_enable; + + // Message display + always @ (posedge CLK or negedge RESETn) + begin: p_tube + if (~RESETn) + begin + string_length = 7'b0; + nxt_end_simulation <= 1'b0; + for (i=0; i<= 127; i=i+1) begin + tube_string [i] = 8'h00; + end + end + else + if (char_received) + begin + if ((rx_shift_reg[8:1]==8'h1B) | reg_esc_code_mode | reg_aux_ctrl_mode ) + begin + // Escape code, or in escape code mode + // Data receive can be command, aux ctrl data + // Ignore this data + end + else if (rx_shift_reg[8:1]==8'h04) // Stop simulation if 0x04 is received + nxt_end_simulation <= 1'b1; + else if ((rx_shift_reg[8:1]==8'h0d)|(rx_shift_reg[8:1]==8'h0A)) + // New line + begin + tube_string[string_length] = 8'h00; + if (VERBOSE != 0) + $fwrite(mcd,"%t UART<%m>: ",$time); + + for (i=0; i<= string_length; i=i+1) + begin + text_char = tube_string[i]; + $fwrite(mcd,"%s",text_char); + end + + $fwrite(mcd,"\n"); + string_length = 7'b0; + end + else + begin + tube_string[string_length] = rx_shift_reg[8:1]; + string_length = string_length + 1; + if (string_length >79) // line too long, display and clear buffer + begin + tube_string[string_length] = 8'h00; + if (VERBOSE != 0) + $fwrite(mcd,"%t UART<%m>: ",$time); + + for (i=0; i<= string_length; i=i+1) + begin + text_char = tube_string[i]; + $fwrite(mcd,"%s",text_char); + end + + $fwrite(mcd,"\n"); + string_length = 7'b0; + + end + + end + + end + + end // p_TUBE + + // Delay for simulation end + always @ (posedge CLK or negedge RESETn) + begin: p_sim_end + if (~RESETn) + begin + reg_end_simulation <= 1'b0; + end + else + begin + reg_end_simulation <= nxt_end_simulation; + if (reg_end_simulation==1'b1) + begin + if (VERBOSE != 0) + $fwrite(mcd,"%t UART<%m>: Test Ended\n",$time); + else + $fwrite(mcd,"Test Ended\n"); + $stop; + end + end + end + + assign SIMULATIONEND = nxt_end_simulation & (~reg_end_simulation); + +endmodule diff --git a/Cortex-M0/nanosoc/systems/mcu/verilog/gen_ahb_busmatrix/README.txt b/Cortex-M0/nanosoc/systems/mcu/verilog/gen_ahb_busmatrix/README.txt new file mode 100755 index 0000000..8155176 --- /dev/null +++ b/Cortex-M0/nanosoc/systems/mcu/verilog/gen_ahb_busmatrix/README.txt @@ -0,0 +1,66 @@ +//----------------------------------------------------------------------------- +// The confidential and proprietary information contained in this file may +// only be used by a person authorised under and to the extent permitted +// by a subsisting licensing agreement from Arm Limited or its affiliates. +// +// (C) COPYRIGHT 2001-2013 Arm Limited or its affiliates. +// ALL RIGHTS RESERVED +// +// This entire notice must be reproduced on all copies of this file +// and copies of this file may only be made by a person if such person is +// permitted to do so under the terms of a subsisting license agreement +// from Arm Limited or its affiliates. +// +// SVN Information +// +// Checked In : $Date: 2017-10-10 15:55:38 +0100 (Tue, 10 Oct 2017) $ +// +// Revision : $Revision: 371321 $ +// +// Release Information : Cortex-M System Design Kit-r1p1-00rel0 +// +//----------------------------------------------------------------------------- +// +//------------------------------------------------------------------------------ +// Abstract : AHB BusMatrix top level README file +//------------------------------------------------------------------------------ + +Introduction +------------ + +This directory contains the AHB BusMatrix component. + +cmsdk_ahb_busmatrix/bin/BuildBusMatrix.pl + The AHB BusMatrix is a configurable component. The configuration + process is handled by a Perl script, located in bin/BuildBusMatrix.pl + +cmsdk_ahb_busmatrix/verilog/src + The source code of the configurable AHB Bus matrix is located in + verilog/src directory. Do not use the Verilog files in this directory + directly. + +cmsdk_ahb_busmatrix/verilog/built + After configuration process, the Verilog files generated will be stored + in verilog/built directory. + +cmsdk_ahb_busmatrix/xml/ + During the configuration process, the configuration of the AHB BusMatrix + can be controlled by command line options or by an XML file. + Example XML files can be found in the xml directory. + +cmsdk_mtx4x2/verilog/ + A preconfigured version of AHB Bus matrix for the example Cortex-M3/M4 + system is prepared in the cmsdk_mcu_mtx4x2 directory. The configuration + of this bus matrix can be found in cmsdk_mcu_mtx4x2/xml/ + +Several example AHB Bus Matrix configuration XML files are provided. +You can generate the AHB bus matrix RTL by running the following command: + +> cd logical/cmsdk_ahb_busmatrix +> bin/BuildBusMatrix.pl -xmldir xml -cfg example2x3_full.xml -over -verbose + + +Please refer to the Cortex-M System Design Kit Technical Reference Manual for +further details on the use of this component. + +======================== End of README.txt =========================== diff --git a/Cortex-M0/nanosoc/systems/mcu/verilog/gen_ahb_busmatrix/bin/BuildBusMatrix.pl b/Cortex-M0/nanosoc/systems/mcu/verilog/gen_ahb_busmatrix/bin/BuildBusMatrix.pl new file mode 100755 index 0000000..73aa34e --- /dev/null +++ b/Cortex-M0/nanosoc/systems/mcu/verilog/gen_ahb_busmatrix/bin/BuildBusMatrix.pl @@ -0,0 +1,2975 @@ +eval "exec perl -w -S $0 $@" # -*- Perl -*- + if ($running_under_some_sh); + undef ($running_under_some_sh); + +################################################################################ +# The confidential and proprietary information contained in this file may +# only be used by a person authorised under and to the extent permitted +# by a subsisting licensing agreement from Arm Limited or its affiliates. +# +# (C) COPYRIGHT 2001-2013,2017 Arm Limited or its affiliates. +# ALL RIGHTS RESERVED +# +# This entire notice must be reproduced on all copies of this file +# and copies of this file may only be made by a person if such person is +# permitted to do so under the terms of a subsisting license agreement +# from Arm Limited or its affiliates. +# +################################################################################ +# Version and Release Control Information: +# +# File Name : $RCSfile: BuildBusMatrix.pl,v $ +# +# SVN Information +# +# Checked In : $Date: 2017-10-10 15:55:38 +0100 (Tue, 10 Oct 2017) $ +# +# Revision : $Revision: 371321 $ +# +# Release Information : Cortex-M System Design Kit-r1p1-00rel0 +# +################################################################################ + +################################################################################ +# Purpose : Builds particular configurations of the AHB BusMatrix +# +################################################################################ +# Usage: +# Builds an AHB Bus Matrix component with a given number of input ports, +# a given number of output ports, a particular arbitration scheme and ARM +# processor interface. +# +# Notes: This version of the script uses an interface information hash with +# the following structure: +# +# my %InterfaceInfo = ( +# SLAVES => { +# SI<n> => { +# NAME => '@name', +# CONNECTIONS => [ @MI<n> ... ], +# ADDRESS_MAP => { +# NORMAL => [ <address_info> ... ], +# REMAP => [ <remap_info> ... ] +# } +# } +# }, +# +# MASTERS => { +# MI<n> => { +# NAME => '@name', +# CONNECTIONS => [ @SI<n> ... ] +# } +# } +# ); +# +# Options: See the ShowHelp() function. +# +################################################################################ + +# ------------------------------------------------------------------------------ +# Load PERL libraries +# ------------------------------------------------------------------------------ + +use strict; +use warnings; +use Getopt::Long; + +use lib 'bin/lib'; # Collapse namespace 'lib::' +use xmlparser; # Load the XML parser module + +use Data::Dumper; +use Storable 'dclone'; +use File::Spec; + +# ------------------------------------------------------------------------------ +# Declare global variables +# ------------------------------------------------------------------------------ + +# General script variables +my $Debug = 0; +my $RenderDebug = 0; +my $Errors = 0; +my $HdlType = 'verilog'; +my $HdlExt = '.v'; +my $Connections = ''; +my $Sparse = 0; +my $DefaultSlave = 'cmsdk_ahb_bm_default_slave'; + +# Parameter legal ranges +my $MinSlaveIF = 1; +my $MaxSlaveIF = 16; +my $MinMasterIF = 1; +my $MaxMasterIF = 16; +my $DataWidths = '32|64'; +my $MinNameLength = 1; +my $MaxNameLength = 128; +my $MinUserWidth = 0; +my $MaxUserWidth = 32; +my $MinAddrWidth = 32; +my $MaxAddrWidth = 64; + +# Interface ID tags (updated later) +my $IdWidthMI = 4; +my $IdWidthSI = 4; + +# Interface information hash +my %InterfaceInfo = (); + +# A processed version needed for the differences in IPXact +my %InterfaceInfoIPXact = (); + +# Remap state information hash +my %RemapStates = (); + +# Address space information hash +my %AddressSpace = (); + +# Get the run date and correct offset +my ( $Sec, $Min, $Hour, $Mday, $Mon, $Year ) = localtime(time); $Year+=1900; $Mon++; + +# Filename variables +my %FileList = (); +my ($Scriptname) = $0 =~ /([\w\.]+)$/; + +# Hash for search and replacement of macros +my %Macro = (); + +# Hash for processing text sections +my %Section = (); + +# Arrays of instance names +my @MatrixDecodeNames = (); +my @OutputArbNames = (); +my @OutputStageNames = (); + +# Hash for remapping information +my %RemapInfo = (); + +# Hash array of name aliases +my %NameAliases = (); + +# IP-XACT component name - default value is set later +my $ComponentName = ''; + + +# ------------------------------------------------------------------------------ +# Check for pre-requisites +# ------------------------------------------------------------------------------ + +# Check for the supported OS platform(s) +unless ( $^O =~ /(solaris|linux)\b/ ) { + die "Error: This script does not support the '$^0' OS!\n\n"; +} + +# Check for the required version of PERL +unless ( $] >= 5.005 ) { + die "Error: This script requires PERL version >= 5.005!\n\n"; +} + +# Check system clock for inappropriate roll-back - the date is used +# in the copyright field of file headers +unless ( $Year >= 2013 ) { + warn "Warning: The system clock is incorrectly set to '$Year'!\n"; + $Year = 2013; +} + + +# ------------------------------------------------------------------------------ +# Parse the command line +# ------------------------------------------------------------------------------ + +# Default values for command-line options +my $SlaveInterfaces = 1; +my $MasterInterfaces = 1; +my $Connectivity = 'full'; +my $ArbiterType = 'fixed'; +my $ArchitectureType = 'ahb2'; +my $XmlConfigFile = ''; +my $RoutingDataWidth = 32; +my $RoutingAddressWidth = 32; +my $UserSignalWidth = 0; +my $OutputArbName = 'cmsdk_ahb_bm_output_arb'; +my $OutputStageName = 'cmsdk_ahb_bm_output_stage'; +my $MatrixDecodeName = 'cmsdk_ahb_bm_decode'; +my $InputStageName = 'cmsdk_ahb_bm_input_stage'; +my $BusMatrixName = ''; # Default value is set later +my $Help = 0; +my $Verbose = 0; +my $SourceDir = "./$HdlType/src"; +my $TargetDir = "./$HdlType/built"; +my $IPXactSourceDir = "./ipxact/src"; +my $IPXactTargetDir = "./ipxact/built"; +my $XmlDir = './xml'; +my $Overwrite = 0; +my $Timescales = 0; +my $NoTimescales = 0; +my $XmlTimescales = 0; +my $CheckMode = 0; +my $IPXact = 0; + + +# Display usage message if requested +if ( grep(/^-?-help$/, @ARGV) ) { ShowHelp(); } + +# Get command line arguments +GetOptions( 'inports=i' => \$SlaveInterfaces, + 'outports=i' => \$MasterInterfaces, + 'connectivity=s' => \$Connectivity, + 'arb=s' => \$ArbiterType, + 'arch=s' => \$ArchitectureType, + 'cfg=s' => \$XmlConfigFile, + 'datawidth=i' => \$RoutingDataWidth, + 'addrwidth=i' => \$RoutingAddressWidth, + 'userwidth=i' => \$UserSignalWidth, + 'outputarb=s' => \$OutputArbName, + 'outputstage=s' => \$OutputStageName, + 'matrixdecode=s' => \$MatrixDecodeName, + 'inputstage=s' => \$InputStageName, + 'busmatrix=s' => \$BusMatrixName, + 'verbose' => \$Verbose, + 'srcdir=s' => \$SourceDir, + 'tgtdir=s' => \$TargetDir, + 'ipxactsrcdir=s' => \$IPXactSourceDir, + 'ipxacttgtdir=s' => \$IPXactTargetDir, + 'xmldir=s' => \$XmlDir, + 'overwrite' => \$Overwrite, + 'timescales' => \$Timescales, 'notimescales' => \$NoTimescales, + 'check' => \$CheckMode, + 'ipxact' => \$IPXact, + 'debug' => \$Debug, + 'renderdebug' => \$RenderDebug, + ); + +if ( $Timescales and $NoTimescales ) { + die "Error: Can't use --timescales and --notimescales at the same time\n"; +} + +# Display script header when in verbose mode +if ( $Verbose ) { + printf "\n==============================================================\n" . + "= The confidential and proprietary information contained in this file may\n" . + "= only be used by a person authorised under and to the extent permitted\n" . + "= by a subsisting licensing agreement from Arm Limited or its affiliates.\n" . + "= \n" . + "= (C) COPYRIGHT 2001-2013,2017 Arm Limited or its affiliates.\n" . + "= ALL RIGHTS RESERVED\n" . + "= \n" . + "= This entire notice must be reproduced on all copies of this file\n" . + "= and copies of this file may only be made by a person if such person is\n" . + "= permitted to do so under the terms of a subsisting license agreement\n" . + "= from Arm Limited or its affiliates.\n" . + "=\n" . + "= $Scriptname\n" . + "=\n" . + "= Run Date : %02d/%02d/%04d %02d:%02d:%02d" . + "\n==============================================================\n\n", + $Mday, $Mon, $Year, $Hour, $Min, $Sec; +} + + +# ------------------------------------------------------------------------------ +# Parse the configuration file if specified, or initialise by elaborating +# the '-connectivity' command-line argument and calculating an address map +# ------------------------------------------------------------------------------ + +if ( $XmlConfigFile ne '' ) { + # Conditionally prepend the XML directory path to the filename + if ( $XmlConfigFile !~ /^$XmlDir/ ) { $XmlConfigFile = "$XmlDir/$XmlConfigFile"; } + $XmlConfigFile = TidyPath($XmlConfigFile); + + # Configure and run the XML parser + ProcessXmlConfigFile(); +} else { + # Translate into internal form, the design specified on the command line + InitialiseInterfaceInfo(); +} + + # Do some preprocessing for IPXact generation + if ($IPXact) { + ProcessDataForIPXact(); + } + +# Set the default top-level name if required +if ( $BusMatrixName eq '' ) { + $BusMatrixName = sprintf( "cmsdk_ahb_busmatrix%dx%d%s%dd%da%du", $SlaveInterfaces, + $MasterInterfaces, substr($ArbiterType, 0, 1), + $RoutingDataWidth, $RoutingAddressWidth, $UserSignalWidth ); +} + +# Set the default IP-XACT component name if required +if ( $ComponentName eq '' ) { $ComponentName = $BusMatrixName . "_lite"; } + + +# ------------------------------------------------------------------------------ +# Validate the parameters and abort if necessary +# ------------------------------------------------------------------------------ + +ValidateParameters(); +if ( $Errors ) { die "\nBuild not started because of parameter errors!\n\n"; } + + +# ------------------------------------------------------------------------------ +# Determine calculated parameters +# ------------------------------------------------------------------------------ + +SelectParameters(); + + +# ------------------------------------------------------------------------------ +# Display settings when in verbose mode +# ------------------------------------------------------------------------------ + +my $XmlTimescales_interpreted = ($XmlTimescales eq 'yes' || $XmlTimescales eq 'no') ? $XmlTimescales + : "no ($XmlTimescales)"; + +if ( $Verbose ) { + printf "Script accepted the following parameters:\n\n" . + "%s - Top-level name : '$BusMatrixName'\n" . + " - Slave interfaces : $SlaveInterfaces\n" . + " - Master interfaces : $MasterInterfaces\n" . + " - Architecture type : '$ArchitectureType'\n" . + " - Arbitration scheme : '$ArbiterType'\n" . + " - Address map : %s\n" . + " - Connectivity mapping : %s\n" . + " - Connectivity type : %s\n" . + " - Routing data width : $RoutingDataWidth\n" . + " - Routing address width : $RoutingAddressWidth\n" . + " - User signal width : $UserSignalWidth\n" . + " - Timescales : ". ($Timescales ? "yes" : + $NoTimescales ? "no" : + '') . + ( $XmlTimescales ? $Timescales || $NoTimescales ? " - overriding $XmlTimescales_interpreted setting from XML" + : "$XmlTimescales_interpreted (from XML)" + : '' ) . + ( ! ($XmlTimescales || $Timescales || $NoTimescales) ? 'yes (default)' : '') . "\n" . + " - Configuration directory : '$TargetDir'\n" . + " - Source directory : '$SourceDir'\n" . + ($IPXact ? + " - IPXact target directory : '$IPXactTargetDir'\n" . + " - IPXact source directory : '$IPXactSourceDir'\n" : "") . + " - Overwrite mode : %s\n\n", + ( $XmlConfigFile ne '' ) ? " - Configuration file : '$XmlConfigFile'\n" : '', + ( $XmlConfigFile ne '' ) ? 'user defined' : 'calculated', + ( $Connectivity ne 'full' ) ? $Connections : 'automatic', + ( $Sparse ) ? 'sparse' : 'full', + ( $Overwrite ) ? 'enabled' : 'disabled'; +} + + +# ------------------------------------------------------------------------------ +# Expand template macros if not in check mode +# ------------------------------------------------------------------------------ + +unless ( $CheckMode ) { CreateBusMatrix(); } + + +################################################################################ +### Subroutines and Functions ################################################## +################################################################################ + +# ------------------------------------------------------------------------------ +# SelectParameters - Selects the corresponding parameter set according to +# the fundamental specification +# ------------------------------------------------------------------------------ +sub SelectParameters { + + # Local variable(s) + my $Instance = ''; + my $Index = 0; + my $Interface = ''; + my %Arbiter = ( fixed => 'cmsdk_ahb_bm_fixed_arb', round => 'cmsdk_ahb_bm_round_arb', burst => 'cmsdk_ahb_bm_burst_arb' ); + my $ArbType = ''; + my $OutType = ''; + my $BstrbWidth = $RoutingDataWidth / 8; + my $MakefileName = 'makefile'; + my $MkfileName = 'cmsdk_ahb_busmatrix.mk'; + my $IPXactFile_AHB2 = 'cmsdk_ahb_busmatrix_ipxact.xml'; + my $IPXactFile_AHBLite = 'cmsdk_ahb_busmatrix_lite_ipxact.xml'; + my $Mappings = $Connections; + my $Packing = ' ' x 14; + my $Unmapping = ''; + my $RemapBit = 0; + my $OpenBr = ''; + my $CloseBr = ''; + my @RemapBits = (); + + # Determine the connectivity type + $Sparse = IsSparse(); + + # Determine the slave interface ID width + $IdWidthSI = NumberOfDigits($SlaveInterfaces - 1, 2); + + # Determine the master interface ID width, including an MSbit for + # selecting the default slave + $IdWidthMI = NumberOfDigits($MasterInterfaces - 1, 2) + 1; + + # Format the mappings + $Mappings =~ s/\n/\n\/\//g; + + # Determine single entity filenames + #$FileList{$MkfileName} = $MkfileName; # Note:Generation of ADK makefile is not required in BP210 + #$FileList{$MakefileName} = $MakefileName; # Note:Generation of ADK makefile is not required in BP210 + if ( $IPXact ) { $FileList{$ComponentName . '.xml'} = $IPXactFile_AHBLite; # Component already contains the -lite suffix or other name + $FileList{$BusMatrixName . '.xml'} = $IPXactFile_AHB2; } + $DefaultSlave = $BusMatrixName . '_default_slave'; + $FileList{$BusMatrixName . $HdlExt} = 'cmsdk_ahb_busmatrix' . $HdlExt; + $FileList{$ComponentName . $HdlExt} = 'cmsdk_ahb_busmatrix_lite' . $HdlExt; + $FileList{$InputStageName . $HdlExt} = 'cmsdk_ahb_bm_input_stage' . $HdlExt; + $FileList{$DefaultSlave . $HdlExt} = 'cmsdk_ahb_bm_default_slave' . $HdlExt; + + # Generate filenames and macro names for each instance of bm_decode + # and process any REMAP declarations accordingly + $Section{'remap_used'} = '0'; + $Section{'no_remap_used'} = '1'; + for ( $Index = 0; $Index < $SlaveInterfaces; $Index++ ) { + $Interface = 'SI' . $Index; + + $Instance = $MatrixDecodeName . $InterfaceInfo{SLAVES}{$Interface}{NAME}; + $FileList{$Instance . $HdlExt} = 'cmsdk_ahb_bm_decode' . $HdlExt; + push @MatrixDecodeNames, $Instance; + + $RemapInfo{$Interface}{REMAP_BITS} = []; + $RemapInfo{$Interface}{REMAP_WIDTH} = 0; + $RemapInfo{$Interface}{REMAP_MAPPING} = {}; + @RemapBits = (); + for ( $RemapBit = 0; $RemapBit < 4; $RemapBit++ ) { + if ( ( grep /:remap$RemapBit:/, + @{ $InterfaceInfo{SLAVES}{$Interface}{ADDRESS_MAP}{REMAP} } ) || + ( grep /:.*(del|_|,|\s)$RemapBit(_|,|\s|:|$)/, + @{ $InterfaceInfoIPXact{SLAVES}{$Interface}{ADDRESS_MAP}{NORMAL} } ) ) { + push @RemapBits, "REMAP[$RemapBit]"; + push @{ $RemapInfo{$Interface}{REMAP_BITS} }, $RemapBit; + $RemapInfo{$Interface}{REMAP_MAPPING}{$RemapBit} = $RemapInfo{$Interface}{REMAP_WIDTH}; + $RemapInfo{$Interface}{REMAP_WIDTH}++; + $Section{'remap_used'} = '1'; + $Section{'no_remap_used'} = '0'; + } + } + $OpenBr = ( $RemapInfo{$Interface}{REMAP_WIDTH} > 1 ) ? '{ ' : ''; + $CloseBr = ( $RemapInfo{$Interface}{REMAP_WIDTH} > 1 ) ? ' }' : ''; + $RemapInfo{$Interface}{REMAP_PORT} = $OpenBr . join( ', ', reverse @RemapBits ) . $CloseBr; + } + + print "RemapInfo:\n" if $Debug; + print Dumper(\%RemapInfo) if $Debug; + + + # Determine names for the output_arb and output_stage instances + if ( $Sparse ) { + + # Generate filenames and macro names for each instance of output_stage and + # output_arb modules + for ( $Index = 0; $Index < $MasterInterfaces; $Index++ ) { + $Interface = 'MI' . $Index; + + # If the current output stage has only one connection, then override + # the template selection for the arbiter type and output stage + $ArbType = $Arbiter{$ArbiterType}; $OutType = 'cmsdk_ahb_bm_output_stage'; + unless ( @{ $InterfaceInfo{MASTERS}{$Interface}{CONNECTIONS} } > 1 ) { + $ArbType = 'cmsdk_ahb_bm_single_arb'; $OutType = 'cmsdk_ahb_bm_single_output_stage'; + } + + $Instance = $OutputArbName . $InterfaceInfo{MASTERS}{$Interface}{NAME}; + $FileList{$Instance . $HdlExt} = $ArbType . $HdlExt; + push @OutputArbNames, $Instance; + $Instance = $OutputStageName . $InterfaceInfo{MASTERS}{$Interface}{NAME}; + $FileList{$Instance . $HdlExt} = $OutType . $HdlExt; + push @OutputStageNames, $Instance; + + } + + } else { + + # The same output_stage and output_arb modules are used in a fully connected + # bus matrix + $FileList{$OutputArbName . $HdlExt} = $Arbiter{$ArbiterType} . ${HdlExt}; + push @OutputArbNames, $OutputArbName; + $FileList{$OutputStageName . $HdlExt} = 'cmsdk_ahb_bm_output_stage' . ${HdlExt}; + push @OutputStageNames, $OutputStageName; + + # Initialise particular static instance names + $Macro{'output_arb_name'} = $OutputArbName; + $Macro{'output_stage_name'} = $OutputStageName; + $Macro{'output_stage_name_lc'} = lc($Macro{'output_stage_name'}); + + } + + # Conditionally initialise the macro and section control hashes + + # Determine architecture options + if ( $ArchitectureType =~ /^(v6|excl)$/ ){ + $Section{'excl'} = 1; + $Macro{'prot'} = 5; + $Macro{'prot_v'} = 6; + $Macro{'resp'} = 2; + $Macro{'resp_v'} = 3; + $Macro{'bin_resp_xfail'} = '100'; + } else { + $Section{'excl'} = 0; + $Macro{'prot'} = 3; + $Macro{'prot_v'} = 4; + $Macro{'resp'} = 1; + $Macro{'resp_v'} = 2; + $Macro{'bin_resp_xfail'} = 'xx'; + } + + # Determine response encoding + $Macro{'bin_resp_okay'} = substr( '000', -$Macro{'resp_v'}, $Macro{'resp_v'} ); + $Macro{'bin_resp_error'} = substr( '001', -$Macro{'resp_v'}, $Macro{'resp_v'} ); + $Macro{'bin_resp_retry'} = substr( '010', -$Macro{'resp_v'}, $Macro{'resp_v'} ); + $Macro{'bin_resp_split'} = substr( '011', -$Macro{'resp_v'}, $Macro{'resp_v'} ); + + # Determine HUNALIGN support and xUSER width + $Section{'unalign'} = ( $ArchitectureType =~ /^(v6|unalign)$/ ) ? 1 : 0; + $Section{'user'} = ( $UserSignalWidth > 0 ) ? 1 : 0; + + # Bus width fields + $Macro{'data'} = $RoutingDataWidth - 1; + $Macro{'data_v'} = $RoutingDataWidth; + $Macro{'addr'} = $RoutingAddressWidth - 1; + $Macro{'addr_v'} = $RoutingAddressWidth; + $Macro{'user'} = $UserSignalWidth - 1; + $Macro{'user_v'} = $UserSignalWidth; + $Macro{'bstrb'} = $BstrbWidth - 1; + $Macro{'bstrb_v'} = $BstrbWidth; + + $Macro{'address_space_range'} = $RoutingAddressWidth >= 40 ? (2**($RoutingAddressWidth-40) )."T" : + $RoutingAddressWidth >= 30 ? (2**($RoutingAddressWidth-30) )."G" : + $RoutingAddressWidth >= 20 ? (2**($RoutingAddressWidth-20) )."M" : + $RoutingAddressWidth >= 10 ? (2**($RoutingAddressWidth-10) )."K" : + 2**$RoutingAddressWidth ; # P and E not supported by IP-XACT standard + + $Macro{'verilog_to_ipxact_path'} = File::Spec->abs2rel("$TargetDir/$BusMatrixName","$IPXactTargetDir/$BusMatrixName"); + + # Interface ID-width fields + $Macro{'idw_si'} = $IdWidthSI - 1; + $Macro{'idw_si_v'} = $IdWidthSI; + $Macro{'idw_mi'} = $IdWidthMI - 1; + $Macro{'idw_mi_v'} = $IdWidthMI; + + # Determine default slave selection encoding (can be up to 5 bits) + $Macro{'dsid_bin'} = substr('10000', 0, $IdWidthMI); + + # Determine a list of sub-module names + $Macro{'other_module_names'} = $DefaultSlave . " \\\n$Packing" . + $InputStageName . " \\\n$Packing" . + join( " \\\n$Packing", @MatrixDecodeNames ) . + " \\\n$Packing" . + join( " \\\n$Packing", @OutputArbNames ) . + " \\\n$Packing" . + join( " \\\n$Packing", @OutputStageNames ); + + # Initialise the static instance names + $Macro{'bus_matrix_name'} = $BusMatrixName; + $Macro{'input_stage_name'} = $InputStageName; + $Macro{'output_arb_stemname'} = $OutputArbName; + $Macro{'output_stage_stemname'} = $OutputStageName; + $Macro{'matrix_decode_stemname'} = $MatrixDecodeName; + $Macro{'component_name'} = $ComponentName; + + # Miscellaneous fields + $Macro{'copyright_year'} = $Year; + $Macro{'timescale_directive'} = ( $NoTimescales || ( ($XmlTimescales eq 'no') && !$Timescales )) ? '' : "\n`timescale 1ns/1ps\n"; # On by default on CMSDK + $Macro{'arbiter_type'} = $ArbiterType; + $Macro{'architecture_type'} = $ArchitectureType; + $Macro{'total_si'} = $SlaveInterfaces; + $Macro{'total_mi'} = $MasterInterfaces; + $Macro{'connectivity'} = ( $Sparse ) ? 'sparse' : 'full'; + $Macro{'mappings'} = ( $Sparse ) ? $Mappings : + sprintf("S<0..%d> -> M<0..%d>", $SlaveInterfaces - 1, $MasterInterfaces - 1); + +} + + +# ------------------------------------------------------------------------------ +# CreateBusMatrix - Creates a version of the Bus Matrix using the currently +# selected parameter set +# ------------------------------------------------------------------------------ +sub CreateBusMatrix { + + # Local variable(s) + my $VariantDir = "$TargetDir/$BusMatrixName"; + my $IPXactVariantDir = "$IPXactTargetDir/$BusMatrixName"; + my @ExistingFiles = glob( "$VariantDir/*" ); + my @NewFiles = keys( %FileList ); + my $File = ''; + + # Determine target preparation + if ( -e $VariantDir ) { + # Delete files when in overwrite mode, otherwise display an error + if ( $Overwrite ) { + foreach $File ( @ExistingFiles ) { + print "Deleting the '$File' file...\n" if ( $Verbose ); + unlink $File or die "Error: Could not delete the file!\n\n"; + } + print "\n" if ( @ExistingFiles and $Verbose ); + } else { + die "Error: This variant of the bus matrix already exists!\n\n"; + } + } else { + # Create the output directory for this Bus Matrix variant + mkdir $VariantDir or + die "Error: Could not create the output directory '$VariantDir'!\n\n"; + } + + if ($IPXact) { + @ExistingFiles = glob( "$IPXactVariantDir/*" ); + # Determine ipxact target preparation + if ( -e $IPXactVariantDir ) { + # Delete files when in overwrite mode, otherwise display an error + if ( $Overwrite ) { + foreach $File ( @ExistingFiles ) { + print "Deleting the '$File' file...\n" if ( $Verbose ); + unlink $File or die "Error: Could not delete the file!\n\n"; + } + print "\n" if ( @ExistingFiles and $Verbose ); + } else { + die "Error: IPXact directory for this variant of the bus matrix already exists!\n\n"; + } + } else { + # Create the output directory for this Bus Matrix variant + mkdir $IPXactVariantDir or + die "Error: Could not create the output directory '$IPXactVariantDir'!\n\n"; + } + } + + # Process all required files + print "Creating the bus matrix variant...\n\n" if ( $Verbose ); + foreach $File ( @NewFiles ) { + print " - Rendering '$File'\n" if ( $Verbose ); + if ($FileList{$File} =~ /.*ipxact\.xml$/) { + RenderFile( "$IPXactSourceDir/$FileList{$File}", "$IPXactVariantDir/$File" ); + } else{ + RenderFile( "$SourceDir/$FileList{$File}", "$VariantDir/$File" ); + } + } + + print "\nDone!\n\n" if ( $Verbose ); + +} + + +# ------------------------------------------------------------------------------ +# RenderFile - Processes nested sections embedded hierarchically within the +# specified template file, and expands macros accordingly. The +# variables '$SlaveIF' and '$MasterIF' have a reserved use +# depending upon the template being rendered. The variables may +# be assigned values from 'in' or 'out' sections, or assigned +# to a value extracted from a port-specific target filename. In +# all other cases, these variables just retain their values +# ------------------------------------------------------------------------------ +sub RenderFile { + + # Passed parameter 1 is the template filename + my $TemplateFile = shift; + # Passed parameter 2 is the rendered output filename + my $RenderedFile = shift; + + # Local variable(s) + my $TextLine = ''; + my $Field = ''; + my $Type = ''; + my $Level = 0; + my $LineNum = 0; + my $StartName = ''; + my $EndName = ''; + my @Section = ( { LINE => 0, PTR => 0, NAME => '', COPIES => 0, COUNT => 0, EN => 1 } ); + my ($SourceFile) = $TemplateFile =~ /([\w\.]+)$/; + my $RefId = 0; + my $Interface = ''; + my $SlaveIF = ''; + my $MasterIF = ''; + my @MIRegions = (); + my @FoundRegions = (); + my $Decodings = 0; + my $Region = 0; + my $AddrLo = ''; + my $AddrHi = ''; + my $Remapping = ''; + my $Unmapping = ''; + my $RemapBit = 0; + my $Bit = 0; + my $RemapState = 0; + my @ActiveRemap = (); + my $GotFirst = 0; + my $Arbiters = 'cmsdk_ahb_bm_burst_arb|cmsdk_ahb_bm_fixed_arb|cmsdk_ahb_bm_round_arb|cmsdk_ahb_bm_single_arb'; + my @PortIds = (); + my $TotalIds = 0; + my @IPXactFiles = ( $ComponentName, $BusMatrixName, $DefaultSlave, $InputStageName, + @MatrixDecodeNames, @OutputArbNames, @OutputStageNames ); + my %RemapTypes = ( none => 'Static', alias => 'Alias', move => 'Unmoved' ); + my $Debug = $RenderDebug; + my @i_remapstate = (); + + + # Open the template file for reading + open( IN, "<$TemplateFile") + or die "Cannot open input file '$TemplateFile'!\n\n"; + + # Open the output file for writing the rendered text + open( OUT, ">$RenderedFile" ) + or die "Cannot open output file '$RenderedFile'!\n\n"; + + # For the bm_decode template only, initialise specific macros and variables + if ( $TemplateFile =~ /cmsdk_ahb_bm_decode$HdlExt$/ ) { + + # Set the current instance name for search and replacement, and also extract + # the slave interface number for reference use + if ( ($SlaveIF) = $RenderedFile =~ /$MatrixDecodeName(\w+)$HdlExt$/ ) { + $Macro{'matrix_decode_name'} = $MatrixDecodeName . $SlaveIF; + $Macro{'matrix_decode_name_lc'} = lc($Macro{'matrix_decode_name'}); + $SlaveIF = $NameAliases{$SlaveIF} if ( $XmlConfigFile ne '' ); + } + + # Initialise macros for search and replace, then determine if the map or + # remap section is to be processed + $Section{'remap'} = 0; + $Macro{'idw_remap'} = ''; + $Macro{'idw_remap_v'} = ''; + $Macro{'bin_remapstate'} = ''; + $Macro{'remapping_vector'} = ''; + $Macro{'region_type'} = ''; + if ( $RemapInfo{$SlaveIF}{REMAP_WIDTH} > 0 ) { + $Section{'remap'} = 1; + $Macro{'idw_remap'} = $RemapInfo{$SlaveIF}{REMAP_WIDTH} - 1; + $Macro{'address_map'} = ''; + $Macro{'mdelse'} = ''; + $Macro{'mem_lo'} = ''; + $Macro{'mem_hi'} = ''; + $Macro{'remapping_vector'} = $RemapInfo{$SlaveIF}{REMAP_PORT}; + } + $Section{'map'} = ( $Section{'remap'} ) ? 0 : 1; + + } + + $Macro{'remap_name'} = ''; + $Macro{'top_remap_bit'} = ''; + $Macro{'top_remap_bitvalue'} = ''; + + # For a sparse bus matrix only, and concerning the output_arb or output_stage + # only, set the current instance names for search and replacement. Also + # extract the master interface number for reference use + if ( $Sparse ) { + if ( $TemplateFile =~ /($Arbiters)$HdlExt$/ ) { + if ( ($MasterIF) = $RenderedFile =~ /$OutputArbName(\w+)$HdlExt$/ ) { + $Macro{'output_arb_name'} = $OutputArbName . $MasterIF; + $MasterIF = $NameAliases{$MasterIF} if ( $XmlConfigFile ne '' ); + } + } elsif ( $TemplateFile =~ /cmsdk_ahb_bm(_single)?_output_stage$HdlExt$/ ) { + if ( ($MasterIF) = $RenderedFile =~ /$OutputStageName(\w+)$HdlExt$/ ) { + $Macro{'output_stage_name'} = $OutputStageName . $MasterIF; + $Macro{'output_stage_name_lc'} = lc($Macro{'output_stage_name'}); + $MasterIF = $NameAliases{$MasterIF} if ( $XmlConfigFile ne '' ); + $MasterIF =~ /([0-9]+)$/; + $Macro{'output_arb_name'} = $OutputArbNames[$1]; + } + } + } + + # Convert default slave name + $Macro{'default_slave_name'} = $DefaultSlave; + + # Process each line of the template file + while ( $TextLine = <IN> ) { + + # Increment the source file line number + $LineNum++; + + # Display each line of the template when in debug mode + print "$LineNum:" . $TextLine if ( $Debug ); + + # Expand any macro found in the line + unless ( $TextLine !~ /<<[^<>]+>>/ ) { + + # Search for all replaceable macros within the line + while ( ($Field, $Type) = $TextLine =~ /(<<(\w+)>>)/gc ) { + if ( exists $Macro{$Type} ) { + $TextLine =~ s/$Field/$Macro{$Type}/; + # Display replacement token name when in debug mode + print "Replaced '$Field' on line $LineNum of '$SourceFile' with '$Macro{$Type}'...\n" if ( $Debug ); + } else { + warn "Warning: Unidentified field '$Field' on line $LineNum of '$SourceFile'...\n"; + } + } + + # Extract sections and store the current file pointer position + if ( ($StartName) = $TextLine =~ /<<\s+start\s+(.+)\s+>>/ ) { + + # Store the information onto the section stack + $Section[++$Level] = { + LINE => $LineNum, + PTR => tell(IN), + NAME => $StartName, + COPIES => 0, + COUNT => 0, + EN => 1 + }; + + # Display section start name when in debug mode + print "Found start section $Level '$StartName'\n" if ( $Debug ); + + # Exclude child sections if the parent section was excluded, otherwise + # conditionally process specificaly named sections of the template + if ( $Section[$Level - 1]{EN} == 0 ) { + + $Section[$Level]{EN} = 0; + + } elsif ( $StartName eq 'unalign' ) { # Optional section + + $Section[$Level]{EN} = ( $Section{'unalign'} ) ? -1 : 0; + + } elsif ( $StartName eq 'excl' ) { # Optional section + + $Section[$Level]{EN} = ( $Section{'excl'} ) ? -1 : 0; + + } elsif ( $StartName eq 'user' ) { # Optional section + + $Section[$Level]{EN} = ( $Section{'user'} ) ? -1 : 0; + + } elsif ( $StartName eq 'map' ) { # Optional section + + $Section[$Level]{EN} = ( $Section{'map'} ) ? -1 : 0; + + } elsif ( $StartName eq 'remap' ) { # Optional section + + $Section[$Level]{EN} = ( $Section{'remap'} ) ? -1 : 0; + + } elsif ( $StartName eq 'vendor_extension' ) { # Optional section + + # This is a dummy section to reset NoMoreIPXactInSections + $Section[$Level]{EN} = 0; + + } elsif ( $StartName eq 'topfile' ) { + + if ($TemplateFile =~ /.*lite_ipxact\.xml$/) { # Lite has the component/wrapper as top, the other has the AHB2 main top + $Section[$Level]{EN} = ( $Macro{'filename'} eq $ComponentName ) ? -1 : 0; + } else { + $Section[$Level]{EN} = ( $Macro{'filename'} eq $BusMatrixName ) ? -1 : 0; + } + + } elsif ( $StartName eq 'connection' ) { # Optional section + + # Determine template specific settings + if ( ($TemplateFile =~ /(cmsdk_ahb_busmatrix|$Arbiters|cmsdk_ahb_bm(_single)?_output_stage)$HdlExt$/) or + ($TemplateFile =~ /.*ipxact\.xml$/) ){ + $SlaveIF = 'SI' . $Macro{'in'}; + } + $Interface = ( $TemplateFile =~ /($Arbiters|cmsdk_ahb_bm(_single)?_output_stage)$HdlExt$/ ) ? + $MasterIF : 'MI' . $Macro{'out'}; + + # For sparse bus matrix only, check for at least one connection + $Section[$Level]{EN} = ( grep /^$Interface$/, + @{ $InterfaceInfo{SLAVES}{$SlaveIF}{CONNECTIONS} } or !$Sparse ) ? -1 : 0; + + # Indicate the first connection for the round_arb template + if ( $TemplateFile =~ /cmsdk_ahb_bm_round_arb$HdlExt$/ and $Section[$Level]{EN} ) { + $GotFirst = 1; + } + + } elsif ( $StartName eq 'in' ) { # Common macro + + # Set the number of times this section will be repeated + $Section[$Level]{COPIES} = $SlaveInterfaces - 1; + $Section[$Level]{EN} = -1; + + # Set the current slave interface number and macros + $Macro{'in'} = $Section[$Level]{COUNT}; + $Interface = 'SI' . $Section[$Level]{COUNT}; + $Macro{'si_name'} = $InterfaceInfo{SLAVES}{$Interface}{NAME}; + $SlaveIF = $Interface; + + # Determine template specific settings + if ( $TemplateFile =~ /($Arbiters|cmsdk_ahb_bm(_single)?_output_stage)$HdlExt$/ ) { + $Macro{'bin_in'} = ToBinary($Section[$Level]{COUNT}, $IdWidthSI); + $Macro{'rrelse'} = ''; # Used in round_arb only + $GotFirst = 0; + } elsif ( $TemplateFile =~ /cmsdk_ahb_busmatrix$HdlExt$/ ) { + # Determine if the remap section should be processed + $Section{'remap'} = 0; + $Macro{'remapping_vector'} = ''; + if ( $RemapInfo{$Interface}{REMAP_WIDTH} > 0 ) { + $Section{'remap'} = 1; + $Macro{'remapping_vector'} = $RemapInfo{$Interface}{REMAP_PORT}; + } + $Macro{'matrix_decode_name'} = $MatrixDecodeNames[$Section[$Level]{COUNT}]; + $Macro{'matrix_decode_name_lc'} = lc($Macro{'matrix_decode_name'}); + } + + } elsif ( $StartName eq 'out' ) { # Common macro + + # Set the number of times this section will be repeated + $Section[$Level]{COPIES} = $MasterInterfaces - 1; + $Section[$Level]{EN} = -1; + + # Set the current master interface number and macros + $Macro{'out'} = $Section[$Level]{COUNT}; + $Interface = 'MI' . $Section[$Level]{COUNT}; + $Macro{'mi_name'} = $InterfaceInfo{MASTERS}{$Interface}{NAME}; + $Macro{'mi_name_lc'} = lc($Macro{'mi_name'}); + + # Determine template specific settings + if ( $TemplateFile =~ /cmsdk_ahb_bm_decode$HdlExt$/ ) { + $Macro{'bin_out'} = ToBinary($Section[$Level]{COUNT}, $IdWidthMI - 1); + } elsif ( $TemplateFile =~ /cmsdk_ahb_busmatrix$HdlExt$/ and $Sparse ) { + $Macro{'output_stage_name'} = $OutputStageNames[$Section[$Level]{COUNT}]; + $Macro{'output_stage_name_lc'} = lc($Macro{'output_stage_name'}); + } + + } elsif ( $StartName eq 'rrin' ) { # Used in round_arb and output_stage + + # Determine the port ID enumeration and the total number + if ( $Sparse ) { + @PortIds = @{ $InterfaceInfo{MASTERS}{$MasterIF}{CONNECTIONS} }; + @PortIds = grep s/^SI//, @PortIds; # Remove all 'SI' prefixes + } else { + @PortIds = ( 0..$SlaveInterfaces-1 ); + } + $TotalIds = scalar @PortIds; + + # Set the number of times this section will be repeated, and determine + # the slave interface ID macros for the round_arb template + $Section[$Level]{COPIES} = $TotalIds - 1; + $Section[$Level]{EN} = -1; + $Macro{'rrin'} = $PortIds[$Section[$Level]{COUNT}]; + $Macro{'bin_rrin'} = ToBinary($PortIds[$Section[$Level]{COUNT}], $IdWidthSI); + + } elsif ( $StartName eq 'rridx' ) { # Used in round_arb only + + # Set the number of times this section will be repeated, and determine + # the slave interface ID macros for the round_arb template + $Section[$Level]{COPIES} = $TotalIds - 2; + $Section[$Level]{EN} = -1; + $Macro{'rrelse'} = ''; + $RefId = ($Section[$Level - 1]{COUNT} + 1) % $TotalIds; + $Macro{'rridx'} = $PortIds[$RefId]; + $Macro{'bin_rridx'} = ToBinary($PortIds[$RefId], $IdWidthSI); + + } elsif ( $StartName eq 'addr_map' ) { # Used in bm_decode only + + # For the current remapping state and master interface, determine which + # address regions are visible + @MIRegions = grep /^$Interface:/, + @{ $InterfaceInfo{SLAVES}{$SlaveIF}{ADDRESS_MAP}{NORMAL} }; + + if ( $RemapState > 0 ) { # Only when remapping is asserted non-zero + + # Translate the active remapping bits into a regexp filter + @ActiveRemap = (); + for ($Bit = 0; $Bit < $RemapInfo{$SlaveIF}{REMAP_WIDTH}; $Bit++) { + if ( ($RemapState >> $Bit) & 0x01 ) { + push @ActiveRemap, @{ $RemapInfo{$SlaveIF}{REMAP_BITS} }[$Bit]; + } + } + $RemapBit = join( '|', @ActiveRemap ); + + # Determine if there are activated remap regions, and if so, delete + # normal but movable address map regions + if ( grep /^$Interface:remap($RemapBit):/, + @{ $InterfaceInfo{SLAVES}{$SlaveIF}{ADDRESS_MAP}{REMAP} } ) { + @MIRegions = grep !/^.*:move:/, + @MIRegions; + + } + + } + $Region = 0; + + # Initialise macros in preparation for search and replace + $Macro{'mdelse'} = ''; + $Macro{'address_map'} = ''; + $Macro{'mem_lo'} = ''; + $Macro{'mem_hi'} = ''; + + # Include this section if a mapping exists + $Section[$Level]{EN} = ( @MIRegions > 0 ) ? -1 : 0; + + } elsif ( $StartName eq 'addr_map_ipxact' ) { + + # All normal (non-remap) regions + @MIRegions = @{ $InterfaceInfoIPXact{SLAVES}{$SlaveIF}{ADDRESS_MAP}{NORMAL} }; + + # Initialise macros in preparation for search and replace + $Macro{'address_map'} = ''; + $Macro{'mem_lo'} = ''; + $Macro{'mem_hi'} = ''; + + # Include this section if a mapping exists + $Section[$Level]{EN} = ( @MIRegions > 0 ) ? -1 : 0; + + } elsif ( $StartName eq 'segments' ) { + + $Section[$Level]{COPIES} = scalar @{$AddressSpace{$Interface}} - 1; + $Section[$Level]{EN} = -1; + + $Macro{'segment_name'} = '0x'.$AddressSpace{$Interface}[$Section[$Level]{COUNT}][0]."_".'0x'.$AddressSpace{$Interface}[$Section[$Level]{COUNT}][1]; + $Macro{'segment_offset'} = '0x'.$AddressSpace{$Interface}[$Section[$Level]{COUNT}][0]; + $Macro{'segment_range'} = '0x' . HexAdd( '0'. HexSubstract($AddressSpace{$Interface}[$Section[$Level]{COUNT}][1], + $AddressSpace{$Interface}[$Section[$Level]{COUNT}][0]) , 1 ); + + } elsif ( $StartName eq 'addr_remap_and_normal_all_this_remap' ) { + + @MIRegions = (); + + # All remap regions + my @allRegions = @{ $InterfaceInfoIPXact{SLAVES}{$SlaveIF}{ADDRESS_MAP}{REMAP} }; + push (@allRegions, @{ $InterfaceInfoIPXact{SLAVES}{$SlaveIF}{ADDRESS_MAP}{NORMAL} }); + foreach my $address_region ( @allRegions ) { + + ($MasterIF, $Remapping, $AddrLo, $AddrHi, $Unmapping) = split(/:/,$address_region); + + # get canonical name for remap state + my @bits = GetRemapBits ($Remapping, $Unmapping); + my $i_remap_name = join( '_' , @bits ); + # Change ! to n + $i_remap_name =~ s/!/n/g ; + + if ($Macro{'remap_name'} eq "remap_".$i_remap_name) { + push (@MIRegions,$address_region); + } + } + + # Initialise macros in preparation for search and replace + $Macro{'address_map'} = ''; + $Macro{'mem_lo'} = ''; + $Macro{'mem_hi'} = ''; + + # Include this section if a mapping exists + $Section[$Level]{EN} = ( @MIRegions > 0 ) ? -1 : 0; + + } elsif ( $StartName =~ /^(addr|remap)_region$/ ) { # Used bm_decode and Spirit file only + # Do not add an else if it is the first address/remap region + $Macro{'mdelse'} = ( $Decodings > 0 ) ? 'else ' : ''; + + # Conditionally reference the first address/remap region and extract its info + if ( @MIRegions > 0 ) { + # Set the number of copies + $Section[$Level]{COPIES} = scalar @MIRegions - 1; + + ($MasterIF, $Remapping, $AddrLo, $AddrHi) = split(/:/, $MIRegions[$Region]); + $Macro{'address_block_name'} = 'Default'; + $Macro{'address_block_remap'} = ($Remapping eq "move") ? 'TRUE' : 'FALSE'; + $Macro{'base_address'} = "0x$AddrLo"; + $Macro{'address_range'} = '0x' . HexSubstract($AddrHi, $AddrLo); + $Macro{'address_map'} = "0x$AddrLo-0x$AddrHi"; + $Macro{'mem_lo'} = ToDecodeAddr($AddrLo); + $Macro{'mem_hi'} = ToDecodeAddr($AddrHi); + + # Determine template specific settings + if ( $TemplateFile =~ /cmsdk_ahb_bm_decode$HdlExt$/ ) { + $Macro{'remapping_bit'} = ''; + if ( $StartName eq 'remap_region' ) { + $Macro{'remapping_bit'} = substr($Remapping, 5, 1); + $Macro{'out'} = substr($MasterIF, 2); + $Macro{'bin_out'} = ToBinary( substr($MasterIF, 2), $IdWidthMI - 1); + } else { + $Macro{'region_type'} = $RemapTypes{$Remapping}; + } + } + $Decodings++; + } + $Section[$Level]{EN} = -1; + + } elsif ( $StartName =~ /^(addr|remap)_region_ipxact$/ ) { # Used bm_decode and IPXACT file only + + # Conditionally reference the first address/remap region and extract its info + if ( @MIRegions > 0 ) { + + # Set the number of copies + $Section[$Level]{COPIES} = scalar @MIRegions - 1; + $Section[$Level]{EN} = -1; + + + ($MasterIF, $Remapping, $AddrLo, $AddrHi, $Unmapping) = split(/:/, $MIRegions[$Section[$Level]{COUNT}]); + $Macro{'address_block_name'} = 'Default'; + $Macro{'address_block_remap'} = ($Remapping eq "move") ? 'TRUE' : 'FALSE'; + $Macro{'base_address'} = "0x$AddrLo"; + $Macro{'end_address'} = "0x$AddrHi"; + $Macro{'address_range'} = '0x' . HexSubstract($AddrHi, HexSubstract($AddrLo,1)); + $Macro{'address_map'} = "0x$AddrLo-0x$AddrHi"; + $Macro{'mem_lo'} = ToDecodeAddr($AddrLo); + $Macro{'mem_hi'} = ToDecodeAddr($AddrHi); + $Macro{'out'} = substr($MasterIF, 2); + $Macro{'bin_out'} = ToBinary( substr($MasterIF, 2), $IdWidthMI - 1); + $Macro{'mi_name'} = $InterfaceInfo{MASTERS}{$MasterIF}{NAME}; + $Macro{'mi_name_lc'} = lc($Macro{'mi_name'}); + + my @bits = GetRemapBits ($Remapping, $Unmapping); + + my $remap_name = join( '_' , @bits ); + # Change ! to n + $remap_name =~ s/!/n/g ; + $Macro{'remap_name'} = "remap_".$remap_name; + + my $bit; + $Macro{'active_cond'} = ''; + + foreach $bit (@bits) { + if (substr($bit,0,1) eq '!') { + $Macro{'active_cond'} .= "\n" . ' 'x25 . ' & !remapping_dec['.$RemapInfo{$SlaveIF}{REMAP_MAPPING}{substr($bit,1)} .']'; + } else { + $Macro{'active_cond'} .= "\n" . ' 'x25 . ' & remapping_dec['.$RemapInfo{$SlaveIF}{REMAP_MAPPING}{$bit} .']'; + } + } + $Macro{'remapping_bit'} = $remap_name; + + $Section{'remap_static'} = @bits ? 0 : 1; + $Section{'remap_conditional'} = @bits ? 1 : 0; + + if (@bits) { + if ( substr($Remapping,0,5) eq 'remap' ) { + $Macro{'region_type'} = "Remapped region, active when REMAP bitcombination is " . $remap_name; + $Macro{'region_type_sanitized'} = "Remapped_" . $remap_name; + } else { + $Macro{'region_type'} = "Removable region, active only when REMAP bitcombination is " . $remap_name; + $Macro{'region_type_sanitized'} = "Removable_" . $remap_name; + } + } else { + $Macro{'region_type'} = "Static"; + $Macro{'region_type_sanitized'} = $Macro{'region_type'}; + } + + } + + } elsif ( $StartName eq 'ipxact_remap_region' ) { # Used in IPXact file only + + # Get the remap regions for the current master interface + @MIRegions = grep /^$MasterIF:/, + @{ $InterfaceInfo{SLAVES}{$SlaveIF}{ADDRESS_MAP}{REMAP} }; + + if ( @MIRegions > 0 ) { + $Section[$Level]{COPIES} = scalar @MIRegions - 1; + ($MasterIF, $Remapping, $AddrLo, $AddrHi) = split(/:/, $MIRegions[$Region]); + $Remapping =~ /([0-9])$/; $Remapping = $1; + $Macro{'address_block_name'} = 'Remap-Pin' . $Remapping; + $Macro{'base_address'} = "0x$AddrLo"; + $Macro{'address_range'} = '0x' . HexSubstract($AddrHi, $AddrLo); + $Macro{'mem_lo'} = ToDecodeAddr($AddrLo); + $Macro{'mem_hi'} = ToDecodeAddr($AddrHi); + } + $Section[$Level]{EN} = ( $Macro{'base_address'} eq '' ) ? 0 : -1; + + } elsif ( $StartName eq 'remap_state' ) { # Used in bm_decode only + + # Initialise macros in preparation for search and replace + $Macro{'address_map'} = ''; + $Macro{'mem_lo'} = ''; + $Macro{'mem_hi'} = ''; + $Macro{'remapping_bit'} = ''; + $Macro{'idw_remap_v'} = $RemapInfo{$SlaveIF}{REMAP_WIDTH}; + $Macro{'bin_remapstate'} = ToBinary(0, $RemapInfo{$SlaveIF}{REMAP_WIDTH}); + + # Initialise variables used in remap processing and calculate the required + # number of section copies + $RemapState = 0; + $Decodings = 0; + $Section[$Level]{COPIES} = (2 ** $RemapInfo{$SlaveIF}{REMAP_WIDTH}) - 1; + $Section[$Level]{EN} = -1; + + } elsif ( $StartName eq 'remap_state_ipxact' ) { # Used in ipxact only + + @i_remapstate = keys( %RemapStates ); + #$Macro{'remapping_bit'} = ''; + #$Macro{'idw_remap_v'} = $RemapInfo{$SlaveIF}{REMAP_WIDTH}; + + # Initialise variables used in remap processing and calculate the required + # number of section copies + + $Section[$Level]{COPIES} = scalar @i_remapstate -1; + $Section[$Level]{EN} = ($Section{'remap_used'} > 0) ? -1 : 0; + + $RemapState = $Section[$Level]{COUNT}; + + $Macro{'remap_name'} = $i_remapstate[$RemapState]; + print "Processing remap state: $Macro{'remap_name'}\n" if ( $Debug ); + + } elsif ( $StartName eq 'remap_bit' ) { # Used in bm_decode only + + # Set the number of copies + $Section[$Level]{COPIES} = $RemapInfo{$SlaveIF}{REMAP_WIDTH} - 1; + $Section[$Level]{EN} = -1; + $Bit = 0; + + } elsif ( $StartName eq 'remap_bit_ipxact' ) { # Used in bm_decode only + + # Set the number of copies + $Section[$Level]{COPIES} = scalar @{$RemapStates{$i_remapstate[$RemapState]}} -1; + $Section[$Level]{EN} = -1; + $Bit = 0; + + my $r_bit = @{$RemapStates{$i_remapstate[$RemapState]}}[$Section[$Level]{COUNT}]; + + if (substr($r_bit,0,1) eq '!') { + $Macro{'top_remap_bit'} = substr($r_bit,1); + $Macro{'top_remap_bitvalue'} = 0; + } else { + $Macro{'top_remap_bit'} = $r_bit; + $Macro{'top_remap_bitvalue'} = 1; + } + + } elsif ( $StartName eq 'addr_remap' ) { # Used in bm_decode only + + # For the current remapping state, determine which remap regions are + # active per master interface + @MIRegions = (); + $Region = 0; + if ( ($RemapState >> $Bit) & 0x01 ) { + $RemapBit = @{ $RemapInfo{$SlaveIF}{REMAP_BITS} }[$Bit]; + @MIRegions = grep /:remap$RemapBit:/, + @{ $InterfaceInfo{SLAVES}{$SlaveIF}{ADDRESS_MAP}{REMAP} }; + } + + # Initialise macros in preparation for search and replace + $Macro{'mdelse'} = ''; + $Macro{'address_map'} = ''; + $Macro{'mem_lo'} = ''; + $Macro{'mem_hi'} = ''; + + # Include this section if a mapping exists + $Section[$Level]{EN} = ( @MIRegions > 0 ) ? -1 : 0; + + } elsif ( $StartName eq 'file' ) { # Used in ipxact file only + + $Macro{'filename'} = $IPXactFiles[0]; + $Section[$Level]{COPIES} = scalar @IPXactFiles - 1; + $Section[$Level]{EN} = -1; + + if ($TemplateFile =~ /.*lite_ipxact\.xml$/) {# Remove the wrapper from non-lite + # + } else { + # Don't include the lite wrapper in the AHB2 ipxact + if ( $Macro{'filename'} eq $ComponentName ) { + $Macro{'filename'} = $IPXactFiles[1]; + ++$Section[$Level]{COUNT}; + } + } + + } elsif ( exists $Section{$StartName} ) { # Optional section + + $Section[$Level]{EN} = ( $Section{$StartName} ) ? -1 : 0; + + + } + + # Display the number of section copies when in debug mode + print "Section copies: $Section[$Level]{COPIES}\n" if ( $Debug ); + + } elsif ( ($EndName) = $TextLine =~ /<<\s+end\s+(.+)\s+>>/ ) { + + # Display section end name when in debug mode + print "Found end section $Level '$EndName'\n" if ( $Debug ); + + # Check for matching section markers + unless ( $EndName eq $Section[$Level]{NAME} ) { + die "Error: Unexpected section end on line $LineNum of '$SourceFile'...\n\n"; + } + + # Determine if the section is to be repeated + if ( $Section[$Level]{COUNT} < $Section[$Level]{COPIES} ) { + + # Adjust input file pointer and line number + seek( IN, $Section[$Level]{PTR}, 0 ); + $LineNum = $Section[$Level]{LINE}; + + # Update macro settings as necessary + if ( $EndName eq 'in' ) { + + $Macro{'in'} = ++$Section[$Level]{COUNT}; + $Interface = 'SI' . $Section[$Level]{COUNT}; + $Macro{'si_name'} = $InterfaceInfo{SLAVES}{$Interface}{NAME}; + $SlaveIF = $Interface; + + # Determine template specific settings + if ( $TemplateFile =~ /($Arbiters|cmsdk_ahb_bm(_single)?_output_stage)$HdlExt$/ ) { + $Macro{'bin_in'} = ToBinary($Section[$Level]{COUNT}, $IdWidthSI); + if ( $GotFirst ) { $Macro{'rrelse'} = 'else '; } + } elsif ( $TemplateFile =~ /cmsdk_ahb_busmatrix$HdlExt$/ ) { + # Determine if the remap section should be processed + $Section{'remap'} = 0; + $Macro{'remapping_vector'} = ''; + if ( $RemapInfo{$Interface}{REMAP_WIDTH} > 0 ) { + $Section{'remap'} = 1; + $Macro{'remapping_vector'} = $RemapInfo{$Interface}{REMAP_PORT}; + } + $Macro{'matrix_decode_name'} = $MatrixDecodeNames[$Section[$Level]{COUNT}]; + $Macro{'matrix_decode_name_lc'} = lc($Macro{'matrix_decode_name'}); + } + + } elsif ( $EndName eq 'out' ) { + + $Macro{'out'} = ++$Section[$Level]{COUNT}; + $Interface = 'MI' . $Section[$Level]{COUNT}; + $Macro{'mi_name'} = $InterfaceInfo{MASTERS}{$Interface}{NAME}; + $Macro{'mi_name_lc'} = lc($Macro{'mi_name'}); + + # Determine template specific settings + if ( $TemplateFile =~ /cmsdk_ahb_bm_decode$HdlExt$/ ) { + $Macro{'bin_out'} = ToBinary($Section[$Level]{COUNT}, $IdWidthMI - 1); + } elsif ( $TemplateFile =~ /cmsdk_ahb_busmatrix$HdlExt$/ and $Sparse ) { + $Macro{'output_stage_name'} = $OutputStageNames[$Section[$Level]{COUNT}]; + $Macro{'output_stage_name_lc'} = lc($Macro{'output_stage_name'}); + } + + } elsif ( $EndName eq 'rrin' ) { + + $Macro{'rrin'} = $PortIds[ ++$Section[$Level]{COUNT} ]; + $Macro{'bin_rrin'} = ToBinary($PortIds[$Section[$Level]{COUNT}], $IdWidthSI); + + } elsif ( $EndName eq 'rridx' ) { + + $Section[$Level]{COUNT}++; + $Macro{'rrelse'} = 'else '; + + # Determine next round robin port + $RefId = ++$RefId % $TotalIds; + $Macro{'rridx'} = $PortIds[$RefId]; + $Macro{'bin_rridx'} = ToBinary($PortIds[$RefId], $IdWidthSI); + + } elsif ( $EndName eq 'remap_state' ) { + + $Macro{'bin_remapstate'} = ToBinary(++$Section[$Level]{COUNT}, + $RemapInfo{$SlaveIF}{REMAP_WIDTH}); + $Decodings = 0; + $RemapState++; + + } elsif ( $EndName eq 'remap_state_ipxact' ) { + + $Section[$Level]{COUNT}++; + + $RemapState = $Section[$Level]{COUNT}; + + $Macro{'remap_name'} = $i_remapstate[$RemapState]; + print "Processing remap state: $Macro{'remap_name'}\n" if ( $Debug ); + + } elsif ( $EndName eq 'remap_bit' ) { + + $Section[$Level]{COUNT}++; + $Bit++; + + } elsif ( $EndName eq 'remap_bit_ipxact' ) { + + $Bit++; + + $Section[$Level]{COUNT}++; + + my $r_bit = @{$RemapStates{$i_remapstate[$RemapState]}}[$Section[$Level]{COUNT}]; + + if (substr($r_bit,0,1) eq '!') { + $Macro{'top_remap_bit'} = substr($r_bit,1); + $Macro{'top_remap_bitvalue'} = 0; + } else { + $Macro{'top_remap_bit'} = $r_bit; + $Macro{'top_remap_bitvalue'} = 1; + } + + } elsif ( $EndName eq 'segments' ) { + + $Section[$Level]{COUNT}++; + + $Macro{'segment_name'} = '0x'.$AddressSpace{$Interface}[$Section[$Level]{COUNT}][0]."_".'0x'.$AddressSpace{$Interface}[$Section[$Level]{COUNT}][1]; + $Macro{'segment_offset'} = '0x'.$AddressSpace{$Interface}[$Section[$Level]{COUNT}][0]; + $Macro{'segment_range'} = '0x' . HexAdd( '0'. HexSubstract($AddressSpace{$Interface}[$Section[$Level]{COUNT}][1], + $AddressSpace{$Interface}[$Section[$Level]{COUNT}][0]) , 1 ); + + } elsif ( $EndName eq 'addr_remap_and_normal_all_this_remap' ) { + + # Empty + + } elsif ( $EndName =~ /^(addr|remap)_region$/ ) { + + $Section[$Level]{COUNT}++; + + # Conditionally reference the subsequent address/remap region + if ( @MIRegions > 0 ) { + $Macro{'mdelse'} = ( $Decodings > 0 ) ? 'else ' : ''; + + ($MasterIF, $Remapping, $AddrLo, $AddrHi) = split(/:/, $MIRegions[++$Region]); + $Macro{'address_block_name'} = 'Default'; + $Macro{'address_block_remap'} = ($Remapping eq "move") ? 'TRUE' : 'FALSE'; + $Macro{'base_address'} = "0x$AddrLo"; + $Macro{'address_range'} = '0x' . HexSubstract($AddrHi, $AddrLo); + $Macro{'address_map'} = "0x$AddrLo-0x$AddrHi"; + $Macro{'mem_lo'} = ToDecodeAddr($AddrLo); + $Macro{'mem_hi'} = ToDecodeAddr($AddrHi); + + # Determine template specific settings + if ( $TemplateFile =~ /cmsdk_ahb_bm_decode$HdlExt$/ ) { + $Macro{'remapping_bit'} = ''; + if ( $EndName eq 'remap_region' ) { + $Macro{'remapping_bit'} = substr($Remapping, 5, 1); + $Macro{'out'} = substr($MasterIF, 2); + $Macro{'bin_out'} = ToBinary( substr($MasterIF, 2), $IdWidthMI - 1); + } else { + $Macro{'region_type'} = $RemapTypes{$Remapping}; + } + } + $Decodings++; + } + + } elsif ( $EndName =~ /^(addr|remap)_region_ipxact$/ ) { # Used bm_decode and IPXACT file only + + $Section[$Level]{COUNT}++; + + # Conditionally reference the first address/remap region and extract its info + if ( @MIRegions > 0 ) { + + ($MasterIF, $Remapping, $AddrLo, $AddrHi, $Unmapping) = split(/:/, $MIRegions[$Section[$Level]{COUNT}]); + $Macro{'address_block_name'} = 'Default'; + $Macro{'address_block_remap'} = ($Remapping eq "move") ? 'TRUE' : 'FALSE'; + $Macro{'base_address'} = "0x$AddrLo"; + $Macro{'end_address'} = "0x$AddrHi"; + $Macro{'address_range'} = '0x' . HexSubstract($AddrHi, HexSubstract($AddrLo,1)); + $Macro{'address_map'} = "0x$AddrLo-0x$AddrHi"; + $Macro{'mem_lo'} = ToDecodeAddr($AddrLo); + $Macro{'mem_hi'} = ToDecodeAddr($AddrHi); + $Macro{'out'} = substr($MasterIF, 2); + $Macro{'bin_out'} = ToBinary( substr($MasterIF, 2), $IdWidthMI - 1); + $Macro{'mi_name'} = $InterfaceInfo{MASTERS}{$MasterIF}{NAME}; + $Macro{'mi_name_lc'} = lc($Macro{'mi_name'}); + + $Section{'remapped'} = ($Remapping =~ /^(move|remap).*/) ? 1 : 0; + $Section{'not_remapped'} = !$Section{'remapped'}; + + my @bits = GetRemapBits ($Remapping, $Unmapping); + + my $remap_name = join( '_' , @bits ); + # Change ! to n + $remap_name =~ s/!/n/g ; + $Macro{'remap_name'} = "remap_".$remap_name; + + my $bit; + $Macro{'active_cond'} = ''; + + foreach $bit (@bits) { + if (substr($bit,0,1) eq '!') { + $Macro{'active_cond'} .= "\n" . ' 'x25 . ' & !remapping_dec['.$RemapInfo{$SlaveIF}{REMAP_MAPPING}{substr($bit,1)} .']'; + } else { + $Macro{'active_cond'} .= "\n" . ' 'x25 . ' & remapping_dec['.$RemapInfo{$SlaveIF}{REMAP_MAPPING}{$bit} .']'; + } + } + $Macro{'remapping_bit'} = $remap_name; + + $Section{'remap_static'} = @bits ? 0 : 1; + $Section{'remap_conditional'} = @bits ? 1 : 0; + + if (@bits) { + if ( substr($Remapping,0,5) eq 'remap' ) { + $Macro{'region_type'} = "Remapped region, active when REMAP bitcombination is " . $remap_name; + $Macro{'region_type_sanitized'} = "Remapped_" . $remap_name; + } else { + $Macro{'region_type'} = "Removable region, active only when REMAP bitcombination is " . $remap_name; + $Macro{'region_type_sanitized'} = "Removable_" . $remap_name; + } + } else { + $Macro{'region_type'} = "Static"; + $Macro{'region_type_sanitized'} = $Macro{'region_type'}; + } + + } + + } elsif ( $EndName eq 'ipxact_remap_region' ) { + + $Section[$Level]{COUNT}++; + + if ( @MIRegions > 0 ) { + ($MasterIF, $Remapping, $AddrLo, $AddrHi) = split(/:/, $MIRegions[++$Region]); + $Remapping =~ /([0-9])$/; $Remapping = $1; + $Macro{'address_block_name'} = 'Remap-Pin' . $Remapping; + $Macro{'base_address'} = "0x$AddrLo"; + $Macro{'address_range'} = '0x' . HexSubstract($AddrHi, $AddrLo); + $Macro{'mem_lo'} = ToDecodeAddr($AddrLo); + $Macro{'mem_hi'} = ToDecodeAddr($AddrHi); + } + + } elsif ( $EndName eq 'file' ) { # Used in ipxact file only + + + if ($TemplateFile =~ /.*lite_ipxact\.xml$/) { # Remove the wrapper from non-lite + # + } else { + if ( $Macro{'filename'} eq $ComponentName ) { + ++$Section[$Level]{COUNT}; + } + } + + $Macro{'filename'} = $IPXactFiles[++$Section[$Level]{COUNT}]; + + } + + # Display pointer adjustment when in debug mode + printf ("Reversing back to line %d...\n", $LineNum + 1) if ( $Debug ); + + } elsif ( $Level > 0 ) { + $Level--; + } + + # Do not include this line in the output + unless ($Section[$Level]{EN} == 0) { $Section[$Level]{EN} = -1; } + + } + + } + + # Write the line(s) to the rendered output file when (delay) enabled + if ( $Section[$Level]{EN} ) { + print OUT $TextLine if ( $Section[$Level]{EN} > 0 ); + $Section[$Level]{EN} = 1; + } + + } + + # Close the template file and rendered output file + close(IN); + close(OUT); + + # If still inside a nested section, there were too few end macros + unless ( $Level == 0 ) { + die "Error: Section '$Section[$Level]{NAME}' expected in '$SourceFile'!\n\n"; + } + +} + + +# ------------------------------------------------------------------------------ +# IsSparse - Determines the connectivity completeness +# ------------------------------------------------------------------------------ +sub IsSparse { + + # Local variable(s) + my $SlaveIF = ''; + my @SlaveIFs = keys( %{ $InterfaceInfo{SLAVES} } ); + my @MasterIFs = keys( %{ $InterfaceInfo{MASTERS} } ); + my $Mappings = ''; + my $Result = 0; + + # Check each mapping + foreach $SlaveIF ( @SlaveIFs ) { + $Mappings = join( '|', @{ $InterfaceInfo{SLAVES}{$SlaveIF}{CONNECTIONS} } ); + if ( grep $_ !~ /^($Mappings)$/, @MasterIFs ) { $Result = 1; last; } + } + + return ($Result); +} + + +# ------------------------------------------------------------------------------ +# HexSubstract - Does argument1 - argument2 substraction in hex. +# Assumes argument1 >= argument2 +# ------------------------------------------------------------------------------ +sub HexSubstract { + + # Passed parameter 1 is the LHS hexadecimal operand value + my $Value1 = shift; + # Passed parameter 2 is the RHS hexadecimal operand value + my $Value2 = shift; + + # Local variable(s) + my $Len1 = length($Value1); + my $Len2 = length($Value2); + my $Index = 0; + my $Char1 = ''; + my $Char2 = ''; + my $Borrow = 0; + my $Result = ''; + + # Append zeros to the 2nd operand + if ( $Len1 > $Len2 ) { $Value2 = '0' x ($Len1 - $Len2) . $Value2; } + + # Substract using strings instead of conversion to decimal to support 64 bit numbers + for ( $Index = 1; $Index <= $Len1; $Index++ ) { + $Char1 = hex substr($Value1, $Len1 - $Index, 1); + $Char2 = hex substr($Value2, $Len1 - $Index, 1); + if ( $Char1 < ($Char2 + $Borrow) ) { + $Char1 = $Char1 + 16; + $Result = sprintf("%1x", $Char1 - $Char2 - $Borrow) . $Result; + $Borrow = 1; + } else { + $Result = sprintf("%1x", $Char1 - $Char2 - $Borrow) . $Result; + $Borrow = 0; + } + } + + return ($Result); +} + + +# ------------------------------------------------------------------------------ +# HexAdd - Does argument1 + argument2 substraction in hex. +# ------------------------------------------------------------------------------ +sub HexAdd { + + # Passed parameter 1 is the LHS hexadecimal operand value + my $Value1 = shift; + # Passed parameter 2 is the RHS hexadecimal operand value + my $Value2 = shift; + + # Local variable(s) + my $Len1 = length($Value1); + my $Len2 = length($Value2); + my $Index = 0; + my $Char1 = ''; + my $Char2 = ''; + my $Carry = 0; + my $Result = ''; + + # Append zeros to the 2nd operand + if ( $Len1 > $Len2 ) { $Value2 = '0' x ($Len1 - $Len2) . $Value2; } + + # Substract using strings instead of conversion to decimal to support 64 bit numbers + for ( $Index = 1; $Index <= $Len1; $Index++ ) { + $Char1 = hex substr($Value1, $Len1 - $Index, 1); + $Char2 = hex substr($Value2, $Len1 - $Index, 1); + if ( $Char1 +$Char2 + $Carry > 15) { + $Result = sprintf("%1x", $Char1 + $Char2 + $Carry - 16) . $Result; + $Carry = 1; + } else { + $Result = sprintf("%1x", $Char1 + $Char2 + $Carry) . $Result; + $Carry = 0; + } + } + + return ($Result); +} + + +# ------------------------------------------------------------------------------ +# RoundPowerOfTwo - Finds the minimum binary quantum for the specified +# integer value +# ------------------------------------------------------------------------------ +sub RoundPowerOfTwo { + + # Passed parameter 1 is the integer value + my $Value = shift; + + # Local variable(s) + my $Result = 0; + my $ShiftCount = 0; + + # Determine the number of available regions + while ( $Value > $Result ) { $Result = 1 << $ShiftCount++; } + + return ($Result); +} + + +# ------------------------------------------------------------------------------ +# NumberOfDigits - Calculates the number of digits required to describe +# the specified integer value in the specified base +# ------------------------------------------------------------------------------ +sub NumberOfDigits { + + # Passed parameter 1 is the integer value + my $Value = shift; + # Passed parameter 2 is the base + my $Base = shift; + + # Local variable(s) + my $Result = 1; + my $XToTheY = 0; + + # Determine the number of digits for values greater than the radix + unless ( $Base < 2 or $Value < $Base ) { + while ( $Value > $XToTheY ) { $XToTheY = $Base ** $Result++; } + if ( $Value != $XToTheY ) { $Result--; } + } + + return ( $Result ); +} + + +# ------------------------------------------------------------------------------ +# NumberOfHexChars - Calculates the number of hexadecimal characters +# required to describe the specified number of bits +# ------------------------------------------------------------------------------ +sub NumberOfHexChars { + + # Passed parameter 1 is the integer value + my $Value = shift; + + # Local variable(s) + my $Result = $Value / 4.0; + my $Integer = int($Result); + my $Fraction = $Result - $Integer; + + # Determine the number of digits + $Result = ($Fraction > 0) ? $Integer + 1 : $Integer; + + return ( $Result ); +} + + +# ------------------------------------------------------------------------------ +# ToBinary - Converts the specified integer into an n-bit binary string +# ------------------------------------------------------------------------------ +sub ToBinary { + + # Passed parameter 1 is the integer value + my $Value = shift; + # Passed parameter 2 is the binary string length + my $Length = shift; + + # Local variable(s) + my $Format = "%0${Length}b"; + my $Result = ( $Value =~ /^\d+$/ ) ? sprintf($Format, $Value) : ''; + + return ( substr($Result, -$Length, $Length) ); +} + + +# ------------------------------------------------------------------------------ +# ToDecodeAddr - Shifts the specified n-bit address to the correct alignment +# for the Matrix Decoder because HADDR[9:0] is not decoded +# ------------------------------------------------------------------------------ +sub ToDecodeAddr { + + # Passed parameter 1 is the address value + my $FullAddr = shift; + + # Local variable(s) + my $AddrBits = $RoutingAddressWidth - 10; + my $HexChars = NumberOfHexChars($AddrBits); + my $Length = length($FullAddr); + my $BinAddr = sprintf( "%032b%032b", hex substr($FullAddr, 0, $Length - 8), + hex substr($FullAddr, $Length - 8) ); + my $Result = ''; + + # Right-shift the binary string to remove the non-decoded bits, and repack + # it into 32-bit chunks for reformatting into a hexadecimal representation + $BinAddr = '0' x 10 . substr($BinAddr, 0, -10); + $Result = sprintf( "%08lx%08lx", + unpack( 'N', pack('B32', substr($BinAddr, 0, 32)) ), + unpack( 'N', pack('B32', substr($BinAddr, 32)) ) ); + + return ( sprintf("%d'h%s", $AddrBits, substr($Result, 16 - $HexChars)) ); +} + + +# ------------------------------------------------------------------------------ +# UnsignedFloatToHex - Converts the specified float value into a hex string +# ------------------------------------------------------------------------------ +sub UnsignedFloatToHex { + + # Passed parameter 1 is the float value + my $Value = shift; + + # Local variable(s) + my $HexDigits = NumberOfDigits($Value, 16); + my $Divisor = 16 ** ($HexDigits - 1); + my $Dividend = 0; + my $Result = ''; + + # Determine number sequence + while ( length($Result) < $HexDigits ) { + $Dividend = int( $Value / $Divisor ); + if ( $Dividend > 0 ) { + $Result = $Result . substr('0123456789abcdef', $Dividend, 1); + $Value -= ($Divisor * $Dividend); + } else { + $Result = $Result . '0'; + } + $Divisor /= 16; + } + + return ($Result); +} + + +# ------------------------------------------------------------------------------ +# IsGtOrEq - Operator '>=' test for up to 64-bit hexadecimal numbers +# ------------------------------------------------------------------------------ +sub IsGtOrEq { + + # Passed parameter 1 is the LHS value + my $OperandLHS = shift; + # Passed parameter 2 is the RHS value + my $OperandRHS = shift; + + # Local variable(s) + my $LengthLHS = length($OperandLHS); + my @LHS = ( hex substr($OperandLHS, 0, $LengthLHS - 8), + hex substr($OperandLHS, $LengthLHS - 8) ); + my $LengthRHS = length($OperandRHS); + my @RHS = ( hex substr($OperandRHS, 0, $LengthRHS - 8), + hex substr($OperandRHS, $LengthRHS - 8) ); + my $Result = ( $LHS[0] > $RHS[0] or + ($LHS[0] == $RHS[0] and $LHS[1] >= $RHS[1]) ) ? 1 : 0; + + return ($Result); +} + + +# ------------------------------------------------------------------------------ +# IsLtOrEq - Operator '<=' test for up to 64-bit hexadecimal numbers +# ------------------------------------------------------------------------------ +sub IsLtOrEq { + + # Passed parameter 1 is the LHS value + my $OperandLHS = shift; + # Passed parameter 2 is the RHS value + my $OperandRHS = shift; + + # Local variable(s) + my $LengthLHS = length($OperandLHS); + my @LHS = ( hex substr($OperandLHS, 0, $LengthLHS - 8), + hex substr($OperandLHS, $LengthLHS - 8) ); + my $LengthRHS = length($OperandRHS); + my @RHS = ( hex substr($OperandRHS, 0, $LengthRHS - 8), + hex substr($OperandRHS, $LengthRHS - 8) ); + my $Result = ( $LHS[0] < $RHS[0] or + ($LHS[0] == $RHS[0] and $LHS[1] <= $RHS[1]) ) ? 1 : 0; + + return ($Result); +} + + +# ------------------------------------------------------------------------------ +# IsGt - Operator '>' test for up to 64-bit hexadecimal numbers +# ------------------------------------------------------------------------------ +sub IsGt { + + # Passed parameter 1 is the LHS value + my $OperandLHS = shift; + # Passed parameter 2 is the RHS value + my $OperandRHS = shift; + + # Local variable(s) + my $LengthLHS = length($OperandLHS); + my @LHS = ( hex substr($OperandLHS, 0, $LengthLHS - 8), + hex substr($OperandLHS, $LengthLHS - 8) ); + my $LengthRHS = length($OperandRHS); + my @RHS = ( hex substr($OperandRHS, 0, $LengthRHS - 8), + hex substr($OperandRHS, $LengthRHS - 8) ); + my $Result = ( $LHS[0] > $RHS[0] or + ($LHS[0] == $RHS[0] and $LHS[1] > $RHS[1]) ) ? 1 : 0; + + return ($Result); +} + + +# ------------------------------------------------------------------------------ +# IsLt - Operator '<' test for up to 64-bit hexadecimal numbers +# ------------------------------------------------------------------------------ +sub IsLt { + + # Passed parameter 1 is the LHS value + my $OperandLHS = shift; + # Passed parameter 2 is the RHS value + my $OperandRHS = shift; + + # Local variable(s) + my $LengthLHS = length($OperandLHS); + my @LHS = ( hex substr($OperandLHS, 0, $LengthLHS - 8), + hex substr($OperandLHS, $LengthLHS - 8) ); + my $LengthRHS = length($OperandRHS); + my @RHS = ( hex substr($OperandRHS, 0, $LengthRHS - 8), + hex substr($OperandRHS, $LengthRHS - 8) ); + my $Result = ( $LHS[0] < $RHS[0] or + ($LHS[0] == $RHS[0] and $LHS[1] < $RHS[1]) ) ? 1 : 0; + + return ($Result); +} + +# ------------------------------------------------------------------------------ +# IsEq - Operator '=' test for up to 64-bit hexadecimal numbers +# ------------------------------------------------------------------------------ +sub IsEq { + + # Passed parameter 1 is the LHS value + my $OperandLHS = shift; + # Passed parameter 2 is the RHS value + my $OperandRHS = shift; + + # Local variable(s) + my $LengthLHS = length($OperandLHS); + my @LHS = ( hex substr($OperandLHS, 0, $LengthLHS - 8), + hex substr($OperandLHS, $LengthLHS - 8) ); + my $LengthRHS = length($OperandRHS); + my @RHS = ( hex substr($OperandRHS, 0, $LengthRHS - 8), + hex substr($OperandRHS, $LengthRHS - 8) ); + my $Result = ($LHS[0] == $RHS[0] and $LHS[1] == $RHS[1]) ? 1 : 0; + + return ($Result); +} + + +# ------------------------------------------------------------------------------ +# TidyPath - Removes double and trailing slash characters from filename paths +# ------------------------------------------------------------------------------ +sub TidyPath { + + # Passed parameter 1 is the filepath string + my $Filepath = shift; + + $Filepath =~ s/(\/\/|\\)/\//g; $Filepath =~ s/\/$//; + + return ($Filepath); +} + + +# ------------------------------------------------------------------------------ +# GetRemapBits - Takes the Remapping and Unmapping (if exists) of an +# address_region or remap_region and returns a sorted list of the bits +# when the region is enabled. Returns an empty list if the region is always +# enabled. Negative bits are marked with an exclamation mark +# example: +# a remap region that is activated by bit 3 +# but is eclipsed when bit 1 is active will return: +# [ +# '!1', +# '3' +# ], +# ------------------------------------------------------------------------------ +sub GetRemapBits { + my $Remapping = shift; + my $Unmapping = shift; + my @bits = (); + my @c_bits = (); + my $r_bit; + if (substr($Remapping,0,3) eq "del") { + @c_bits = split ( /,| |_/,substr($Remapping,3)) ; + foreach $r_bit (@c_bits) { + if (!($r_bit eq '')) { # need to ignore leading empty characters generated by a leading separator + push @bits, '!'.$r_bit; + } + } + } + if (substr($Remapping,0,5) eq "remap") { + @c_bits = split ( /,| |_/,substr($Remapping,5)) ; + foreach $r_bit (@c_bits) { + if (!($r_bit eq '')) { # need to ignore leading empty characters generated by a leading separator + push @bits, $r_bit; + } + } + } + if ($Unmapping) { + @c_bits = split ( /,| |_/,substr($Unmapping,5)) ; + foreach $r_bit (@c_bits) { + if (!($r_bit eq '')) { # need to ignore leading empty characters generated by a leading separator + push @bits, '!'.$r_bit; + } + } + } + + # Sort bits in order, so they are easier to match + @bits = sort { + my $c = $a; + my $d = $b; + if ( substr($a,0,1) eq '!') { + $c = substr($a,1) + } + if ( substr($b,0,1) eq '!') { + $d = substr($b,1) + } + + $c <=> $d + } @bits; + return (@bits); +} + +# ------------------------------------------------------------------------------ +# ValidateParameters - Checks the value of user configurable script parameters +# ------------------------------------------------------------------------------ +sub ValidateParameters { + + # Local variable(s) + my %Names = ( + bus_matrix_name => \$BusMatrixName, + input_stage_name => \$InputStageName, + matrix_decode_name => \$MatrixDecodeName, + output_arbiter_name => \$OutputArbName, + output_stage_name => \$OutputStageName + ); + my @NameKeys = keys( %Names ); + my $Name = ''; + my $NameLength = 0; + my $ShowName = ''; + my @OtherNameKeys = (); + my $OtherName = ''; + my $Type = ''; + my @Interfaces = (); + my $Interface = ''; + + # Validate permitted values for the total slave interfaces + unless ( $SlaveInterfaces >= $MinSlaveIF and $SlaveInterfaces <= $MaxSlaveIF ) { + warn "Error: The number of slave ports must be in the range from $MinSlaveIF to $MaxSlaveIF \n"; + $Errors++; + } + + # Validate permitted values for the total master interfaces + unless ( $MasterInterfaces >= $MinMasterIF and $MasterInterfaces <= $MaxMasterIF ) { + warn "Error: The number of master ports must be in the range from $MinMasterIF to $MaxMasterIF \n"; + $Errors++; + } + + # Raise a warning about the '1 x n' bus matrix configuration + if ( $SlaveInterfaces == 1 ) { + warn "Warning: This configuration has one slave port and will use 'single' output\n" . + " and arbiter stage(s) only.\n"; + } + + # Validate permitted values of arbitration scheme + unless ( $ArbiterType =~ /^(fixed|round|burst)$/ ) { + warn "Error: Invalid type of arbitration-scheme '$ArbiterType'!\n"; + $Errors++; + } + + # Validate permitted values of architecture version + unless ( $ArchitectureType =~ /^(ahb2|v6|excl|unalign)$/ ) { + warn "Error: Invalid type of architecture '$ArchitectureType'!\n"; + $Errors++; + } + + # Validate permitted values of routing-data width + unless ( $RoutingDataWidth =~ /^($DataWidths)$/ ) { + warn "Error: Invalid routing-data width '$RoutingDataWidth'!\n"; + $Errors++; + } + + # Validate permitted values of user-signal width + if ( $RoutingAddressWidth =~ /[^0-9]/ ) { + warn "Error: Invalid routing-address width '$RoutingAddressWidth'!\n"; + $Errors++; + } elsif ( $RoutingAddressWidth < $MinAddrWidth or $RoutingAddressWidth > $MaxAddrWidth ) { + warn "Error: Routing-address width must be in the range $MinAddrWidth..$MaxAddrWidth!\n"; + $Errors++; + } + + # Validate permitted values of user-signal width + if ( $UserSignalWidth =~ /[^0-9]/ ) { + warn "Error: Invalid user-signal width '$UserSignalWidth'!\n"; + $Errors++; + } elsif ( $UserSignalWidth < $MinUserWidth or $UserSignalWidth > $MaxUserWidth ) { + warn "Error: User-signal width must be in the range $MinUserWidth..$MaxUserWidth!\n"; + $Errors++; + } + + # Validate permitted values of module names + foreach $Name ( @NameKeys ) { + $ShowName = $Name; $ShowName =~ s/_/ /g; + $NameLength = length( ${ $Names{$Name} } ); + + # Check for illegal characters and then check the string length + if ( ${ $Names{$Name} } =~ /[^\w]/ ) { + warn "Error: The $ShowName contains illegal characters!\n"; + $Errors++; + } elsif ( $NameLength < $MinNameLength or $NameLength > $MaxNameLength ) { + warn "Error: The $ShowName is incorrect length ($MinNameLength..$MaxNameLength characters)!\n"; + $Errors++; + } + + # Check for unique name + @OtherNameKeys = grep $_ ne $Name , @NameKeys; + foreach $OtherName ( @OtherNameKeys ) { + if ( ${ $Names{$OtherName} } eq ${ $Names{$Name} } ) { + warn "Error: The $ShowName is not assigned a unique value!\n"; + $Errors++; + } + } + } + + # Check interface information + foreach $Type ( ('SLAVES', 'MASTERS') ) { + + @Interfaces = keys( %{ $InterfaceInfo{$Type} } ); + foreach $Interface ( @Interfaces ) { + # Inspect interface names + $Name = $InterfaceInfo{$Type}{$Interface}{NAME}; + if ( $Name =~ /[^\w]/ ) { + warn "Error: Interface $Interface name '$Name' contains illegal characters!\n"; + $Errors++; + } + if ( length($Name) > $MaxNameLength ) { + warn "Error: Interface $Interface name '$Name' is too long ($MaxNameLength" . + " characters max)!\n"; + $Errors++; + } + + # Inspect connectivity for isolated nodes resulting from an + # incomplete sparse mapping + if ( @{ $InterfaceInfo{$Type}{$Interface}{CONNECTIONS} } == 0 ) { + warn "Error: Interface $Interface has no connectivity mapping and is isolated!\n"; + $Errors++; + } + + # If this is a slave, then check its address map + if ( $Type eq 'SLAVES' ) { CheckAddressMap($Interface); } + } + + } + +} + + +# ------------------------------------------------------------------------------ +# CheckAddressMap - Checks the address map of the specified slave interface +# for tags and overlapping regions +# ------------------------------------------------------------------------------ +sub CheckAddressMap { + + # Passed parameter 1 is the integer value + my $SlaveIF = shift; + + # Local variable(s) + my $Class = ''; + my $Index = 0; + my $MasterIF = ''; + my @MIRegions = (); + my $Region = ''; + my $MI = ''; + my $Tag = ''; + my $RegionHi = ''; + my $RegionLo = ''; + my $RegionHiLSW = 0; + my $RegionLoLSW = 0; + my $CheckBound = ''; + my $OtherRegion = ''; + my $OtherMI = ''; + my $OtherHi = ''; + my $OtherLo = ''; + my $OtherTag = 0; + my $Exclusions = ''; + my $HexChars = NumberOfHexChars($RoutingAddressWidth); + my %Tags = ( NORMAL => 'none|move|alias', REMAP => 'remap[0-3]' ); + my %TagMessages = ( NORMAL => 'remapping action', REMAP => 'REMAP bit' ); + my %WarnType = ( NORMAL => 'address', REMAP => 'remap' ); + + # Process each mapping type + foreach $Class ( ('REMAP', 'NORMAL') ) { + + # Check the address map for each master interface + for ( $Index = 0; $Index < $MasterInterfaces; $Index++ ) { + $MasterIF = 'MI' . $Index; + + # Find regions matching the master interface under inspection + @MIRegions = grep /^$MasterIF:/, @{ $InterfaceInfo{SLAVES}{$SlaveIF}{ADDRESS_MAP}{$Class} }; + + # Determine if this slave interface has connectivity with the master interface + if ( grep $_ eq $MasterIF, @{ $InterfaceInfo{SLAVES}{$SlaveIF}{CONNECTIONS} } ) { + + # Check for expected address regions + unless ( $Class eq 'REMAP' or @MIRegions > 0 ) { + warn "Error: Interface $SlaveIF has no address regions defined for the $MasterIF interface!\n"; + $Errors++; + } + + # Inspect each region mapped to the master interface + foreach $Region ( @MIRegions ) { + + # Split the region into its constituent parts + ($MI, $Tag, $RegionLo, $RegionHi) = split(/:/, $Region); + + # Extract and remove the expected prefix, then check its type + unless ( $Tag =~ /^($Tags{$Class})$/ ) { + warn "Error: Interface $SlaveIF address region '$MI: $RegionLo-$RegionHi'" . + " declares\n unsupported $TagMessages{$Class}!\n"; + $Errors++; + } + + # Check that each bound only consists of hexadecimal characters + # and is the expected number of hexadecimal digits + foreach $CheckBound ( $RegionLo, $RegionHi ) { + if ( length($CheckBound) != $HexChars ) { + warn "Error: Interface $SlaveIF address bound '$MI: $CheckBound' is incorrect length should be $HexChars characters!\n"; + $Errors++; + } + if ( $CheckBound =~ /[^a-f0-9]+/i ) { + warn "Error: Interface $SlaveIF address bound '$MI: $CheckBound' contains illegal characters!\n"; + $Errors++; + } + } + + # Check the region syntax + if ( IsGtOrEq($RegionLo, $RegionHi) ) { + warn "Error: Interface $SlaveIF address region '$MI: $RegionLo-$RegionHi' is invalid!\n"; + $Errors++; + } + + # Check the region size - minimum is 1kBytes + $RegionHiLSW = hex substr($RegionHi, length($RegionHi) - 8); + $RegionLoLSW = hex substr($RegionLo, length($RegionLo) - 8); + if ( abs( $RegionHiLSW - $RegionLoLSW ) < 1023 ) { + warn "Error: Interface $SlaveIF address region '$MI: $RegionLo-$RegionHi' is < 1kBytes!\n"; + $Errors++; + } + + # Check alignment of lower address bound + if ( ( hex(substr($RegionLo, -3, 3)) & 0x3ff ) != 0x000 ) { + warn "Warning: Interface $SlaveIF address bound '$MI: $RegionLo' is misaligned!\n"; + } + + # Check alignment of upper address bound + if ( ( hex(substr($RegionHi, -3, 3)) & 0x3ff ) != 0x3ff ) { + warn "Warning: Interface $SlaveIF address bound '$MI: $RegionHi' is misaligned!\n"; + } + + # Check the current region against all others for illegal overlap + foreach $OtherRegion ( @{ $InterfaceInfo{SLAVES}{$SlaveIF}{ADDRESS_MAP}{$Class} } ) { + + # Split the other region into its constituent parts + ($OtherMI, $OtherTag, $OtherLo, $OtherHi) = split(/:/, $OtherRegion); + + # Exclude remap regions with different remap bits + if ( $Class eq 'REMAP' and $Tag ne $OtherTag ) { next; } + + # Filter out the current region and any previously reported ones + unless ( $OtherRegion =~ /^($Region$Exclusions)$/ ) { + + # Check bounds for overlap + if ( (IsGtOrEq($OtherLo, $RegionLo) and IsLtOrEq($OtherLo, $RegionHi)) or + (IsGtOrEq($OtherHi, $RegionLo) and IsLtOrEq($OtherHi, $RegionHi)) ) { + + warn "Error: Interface $SlaveIF $WarnType{$Class} region '$OtherMI: $OtherLo-$OtherHi'" . + " overlaps\n with another $WarnType{$Class} region '$MI: $RegionLo-$RegionHi'!\n"; + $Errors++; + + # Suppress multiple messages that show the same error + $Exclusions = $Exclusions . "|$MI:[^:]+:$RegionLo:$RegionHi"; + } + + } + } + + } + + } elsif ( @MIRegions > 0 ) { + # This slave interface is not connected to the master interface and + # therefore should not have any address map information + warn "Error: Interface $SlaveIF has an address map for $MasterIF interface,\n" . + " while not connected!\n"; + $Errors++; + } + } + + # Clear the exclusions for checking the next class + $Exclusions = ''; + + } + +} + + +# ------------------------------------------------------------------------------ +# InitialiseInterfaceInfo - Determines the connectivity mapping and address +# map, assigning values to the global interface +# information hash +# ------------------------------------------------------------------------------ +sub InitialiseInterfaceInfo { + + # Local variable(s) + my $SlaveIF = ''; + my $MasterIF = ''; + my $Index1 = 0; + my $Index2 = 0; + my $Regions = RoundPowerOfTwo($MasterInterfaces); + my $RegionSize = (2 ** $RoutingAddressWidth) / $Regions; + my $BaseAddress = 0; + my $TopAddress = 0; + my @Mappings = split(/:\s*/, $Connectivity); + my $Mapping = ''; + my @Interfaces = (); + my $HexChars = NumberOfHexChars($RoutingAddressWidth); + my $Format = "%0${HexChars}s"; + + # Initialise master interface parameter(s) first to simplify the sequence + for ( $Index1 = 0; $Index1 < $MasterInterfaces; $Index1++ ) { + $MasterIF = 'MI' . $Index1; + $InterfaceInfo{MASTERS}{$MasterIF}{NAME} = $MasterIF; + $InterfaceInfo{MASTERS}{$MasterIF}{CONNECTIONS} = []; + } + + # Initialise slave interface parameter(s) + for ( $Index1 = 0; $Index1 < $SlaveInterfaces; $Index1++ ) { + # Initialise slave information container + $SlaveIF = 'SI' . $Index1; + $InterfaceInfo{SLAVES}{$SlaveIF}{NAME} = $SlaveIF; + $InterfaceInfo{SLAVES}{$SlaveIF}{CONNECTIONS} = []; + $InterfaceInfo{SLAVES}{$SlaveIF}{ADDRESS_MAP}{NORMAL} = []; + $InterfaceInfo{SLAVES}{$SlaveIF}{ADDRESS_MAP}{REMAP} = []; + + # Establish the connectivity + if ( $Connectivity ne 'full' ) { + + # Initialise or concatenate the connection description string + $Connectivity = 'sparse'; + $Connections = $Connections . sprintf("%s%s -> ", ($Connections eq '') ? + '' : "\n" . ' ' x 29, $InterfaceInfo{SLAVES}{$SlaveIF}{NAME}); + + # Search the connectivity string for a mapping from this slave interface + foreach $Mapping ( @Mappings ) { + if ( $Mapping =~ /^$SlaveIF=MI\{([0-9,]+)\}/) { + # Process each master interface in turn, checking for its existence + @Interfaces = split(/,\s*/, $1); + foreach $MasterIF ( @Interfaces ) { + $MasterIF = 'MI' . $MasterIF; + if ( exists( $InterfaceInfo{MASTERS}{$MasterIF} ) ) { + # Append the details of this sparse connection + push @{ $InterfaceInfo{SLAVES}{$SlaveIF}{CONNECTIONS} }, $MasterIF; + $Connections = $Connections . "$MasterIF, "; + } else { + warn "Error: Interface $SlaveIF has an unresolved sparse connection '$MasterIF'!\n"; + $Errors++; + } + } + } + } + + } else { + # Full connectivity is default + for ( $Index2 = 0; $Index2 < $MasterInterfaces; $Index2++ ) { + push @{ $InterfaceInfo{SLAVES}{$SlaveIF}{CONNECTIONS} }, 'MI' . $Index2; + } + } + + # Determine address map (assume no remap regions) + for ( $Index2 = 0; $Index2 < $MasterInterfaces; $Index2++ ) { + $MasterIF = 'MI' . $Index2; + $BaseAddress = $RegionSize * $Index2; + $TopAddress = $BaseAddress + $RegionSize - 1; + if ( grep $_ eq $MasterIF, @{ $InterfaceInfo{SLAVES}{$SlaveIF}{CONNECTIONS} } ) { + push @{ $InterfaceInfo{SLAVES}{$SlaveIF}{ADDRESS_MAP}{NORMAL} }, + sprintf("%s:none:$Format:$Format", $MasterIF, UnsignedFloatToHex($BaseAddress), + UnsignedFloatToHex($TopAddress)); + } + } + } + + # Remove leading whitespace from the connections detail + $Connections =~ s/,\s+$//; + + # Determine connectivity information from master interface perspective + for ( $Index1 = 0; $Index1 < $MasterInterfaces; $Index1++ ) { + $MasterIF = 'MI' . $Index1; + for ( $Index2 = 0; $Index2 < $SlaveInterfaces; $Index2++ ) { + $SlaveIF = 'SI' . $Index2; + if ( grep $_ eq $MasterIF, @{ $InterfaceInfo{SLAVES}{$SlaveIF}{CONNECTIONS} } ) { + push @{ $InterfaceInfo{MASTERS}{$MasterIF}{CONNECTIONS} }, $SlaveIF; + } + } + } + +} + + +# ------------------------------------------------------------------------------ +# ProcessXmlConfigFile - Reads the specified XML configuration file and +# assigns values to the global variables including +# the interface information hash +# ------------------------------------------------------------------------------ +sub ProcessXmlConfigFile { + + # Local variable(s) + my @Elements = (); + my $XmlItem = ''; + my $XmlElement = ''; + my @SlavePorts = (); + my @MasterPorts = (); + my $Index1 = 1; + my $Index2 = 0; + my $SlaveIF = ''; + my $MasterIF = ''; + my $Name = ''; + my $Region = ''; + + # Configure the XML parser + ConfigureXmlParser( show_ids => 0, verbose => 0, show_warnings => 0 ); + + # Read the specified configuration file + RunXmlParser($XmlConfigFile); + + # Display the XML structure when in debug mode + if ( $Debug ) { ListXmlHash('ROOT'); } + + # Access mandatory items of information (bus matrix dimensions) + @SlavePorts = GetXmlNodeList('//cfgfile/slave_interface'); + $SlaveInterfaces = scalar @SlavePorts; + @MasterPorts = GetXmlNodeList('//cfgfile/master_interface'); + $MasterInterfaces = scalar @MasterPorts; + + # Access optional items of information + @Elements = GetXmlNodeList('/cfgfile'); + foreach $XmlElement ( @Elements ) { + # Assign the extracted value to the appropriate parameter name + $XmlItem = GetXmlValue("/cfgfile/$XmlElement"); + if ( $XmlElement =~ /arbitration_scheme\[1\]$/ ) { + $ArbiterType = $XmlItem; + } elsif ( $XmlElement =~ /architecture_version\[1\]$/ ) { + $ArchitectureType = $XmlItem; + } elsif ( $XmlElement =~ /routing_data_width\[1\]$/ ) { + $RoutingDataWidth = $XmlItem; + } elsif ( $XmlElement =~ /routing_address_width\[1\]$/ ) { + $RoutingAddressWidth = $XmlItem; + } elsif ( $XmlElement =~ /user_signal_width\[1\]$/ ) { + $UserSignalWidth = $XmlItem; + } elsif ( $XmlElement =~ /timescales\[1\]$/ ) { + $XmlTimescales = $XmlItem; + } elsif ( $XmlElement =~ /bus_matrix_name\[1\]$/ ) { + $BusMatrixName = $XmlItem; + } elsif ( $XmlElement =~ /input_stage_name\[1\]$/ ) { + $InputStageName = $XmlItem; + } elsif ( $XmlElement =~ /matrix_decode_name\[1\]$/ ) { + $MatrixDecodeName = $XmlItem; + } elsif ( $XmlElement =~ /output_arbiter_name\[1\]$/ ) { + $OutputArbName = $XmlItem; + } elsif ( $XmlElement =~ /output_stage_name\[1\]$/ ) { + $OutputStageName = $XmlItem; + } elsif ( $XmlElement =~ /product_version_info\[1\]$/ ) { + $ComponentName = GetXmlValue("/cfgfile/$XmlElement" . '@component_name'); + } elsif ( $XmlElement !~ /(slave|master)_interface\[\d+\]/ ) { + warn "Error: Unknown XML option '$XmlElement'!\n"; + $Errors++; + } + } + + # Extract master interface parameter(s) first to simplify the sequence + foreach $XmlElement ( @MasterPorts ) { + + # Initialise information container and increment the count + $MasterIF = sprintf("MI%d", $Index2++); + $Name = GetXmlValue($XmlElement . '@name'); + $InterfaceInfo{MASTERS}{$MasterIF}{NAME} = $Name; + $InterfaceInfo{MASTERS}{$MasterIF}{CONNECTIONS} = []; + + # Add the name to the master alias lookup hash + if ( ! exists( $NameAliases{$Name} ) ) { + $NameAliases{$Name} = $MasterIF; + } else { + warn "Error: Interface $MasterIF name '$Name' is not unique!\n"; + $Errors++; + } + + } + + # Extract slave interface parameter(s) + foreach $XmlElement ( @SlavePorts ) { + + # Initialise information container + $SlaveIF = sprintf("SI%d", $Index1 - 1); + $Name = GetXmlValue($XmlElement . '@name'); + $InterfaceInfo{SLAVES}{$SlaveIF}{NAME} = $Name; + $InterfaceInfo{SLAVES}{$SlaveIF}{CONNECTIONS} = []; + $InterfaceInfo{SLAVES}{$SlaveIF}{ADDRESS_MAP}{NORMAL} = []; + $InterfaceInfo{SLAVES}{$SlaveIF}{ADDRESS_MAP}{REMAP} = []; + + # Add the name to the slave alias lookup hash + if ( ! exists( $NameAliases{$Name} ) ) { + $NameAliases{$Name} = $SlaveIF; + } else { + warn "Error: Interface $SlaveIF name '$Name' is not unique!\n"; + $Errors++; + } + + # Extract connectivity information or assign full connectivity as default + @Elements = GetXmlNodeList("//cfgfile/slave_interface[$Index1]/sparse_connect"); + if ( @Elements > 0 ) { + # Initialise or concatenate the connection description string + $Connectivity = 'sparse'; + $Connections = $Connections . sprintf("%s%s -> ", ($Connections eq '') ? + '' : "\n" . ' ' x 29, $InterfaceInfo{SLAVES}{$SlaveIF}{NAME}); + + # Convert the symbolic interface names to the MI<n> notation + foreach $XmlItem ( @Elements ) { + # Extract sparse connection attribute and check for existence of the + # named interface + $MasterIF = GetXmlValue($XmlItem . '@interface'); + if ( exists( $NameAliases{$MasterIF} ) ) { + push @{ $InterfaceInfo{SLAVES}{$SlaveIF}{CONNECTIONS} }, $NameAliases{$MasterIF}; + } else { + warn "Error: Interface '$Name' has an unresolved sparse connection '$MasterIF'!\n"; + $Errors++; + } + # Append this sparse connection detail + $Connections = $Connections . "$MasterIF, "; + } + + } else { + # Full connectivity is default + for ( $Index2 = 0; $Index2 < $MasterInterfaces; $Index2++ ) { + push @{ $InterfaceInfo{SLAVES}{$SlaveIF}{CONNECTIONS} }, 'MI' . $Index2; + } + } + + # Extract address mapping information + @Elements = GetXmlNodeList("//cfgfile/slave_interface[$Index1]/address_region"); + if ( @Elements > 0 ) { + foreach $XmlItem ( @Elements ) { + # Determine which master interface this address region is for, and + # check that it exists + $MasterIF = GetXmlValue($XmlItem . '@interface'); + if ( exists( $NameAliases{$MasterIF} ) ) { + $Region = sprintf("%s:%s:%s:%s", $NameAliases{$MasterIF}, + GetXmlValue($XmlItem . '@remapping'), + GetXmlValue($XmlItem . '@mem_lo'), + GetXmlValue($XmlItem . '@mem_hi')); + # Check for duplicated definitions + if ( grep $_ eq $Region, @{ $InterfaceInfo{SLAVES}{$SlaveIF}{ADDRESS_MAP}{NORMAL} } ) { + warn "Error: Interface '$Name' has duplicated address region for master interface '$MasterIF'\n"; + $Errors++; + } else { + push @{ $InterfaceInfo{SLAVES}{$SlaveIF}{ADDRESS_MAP}{NORMAL} }, $Region; + } + + } else { + warn "Error: Address region maps to unknown master interface '$MasterIF'\n"; + $Errors++; + } + } + } else { + warn "Error: Expecting an address region for interface '$SlaveIF'\n"; + $Errors++; + } + + # Extract the optional remapped address information + @Elements = GetXmlNodeList("//cfgfile/slave_interface[$Index1]/remap_region"); + foreach $XmlItem ( @Elements ) { + # Determine which master interface this remap region is for, and + # check that it exists + $MasterIF = GetXmlValue($XmlItem . '@interface'); + if ( exists( $NameAliases{$MasterIF} ) ) { + $Region = sprintf("%s:remap%s:%s:%s", $NameAliases{$MasterIF}, + GetXmlValue($XmlItem . '@bit'), + GetXmlValue($XmlItem . '@mem_lo'), + GetXmlValue($XmlItem . '@mem_hi')); + # Check for duplicated definitions + if ( grep $_ eq $Region, @{ $InterfaceInfo{SLAVES}{$SlaveIF}{ADDRESS_MAP}{REMAP} } ) { + warn "Error: Interface '$Name' has duplicated remap region for master interface '$MasterIF'\n"; + $Errors++; + } else { + push @{ $InterfaceInfo{SLAVES}{$SlaveIF}{ADDRESS_MAP}{REMAP} }, $Region; + } + + } else { + warn "Error: Remap region maps to unknown master interface '$MasterIF'\n"; + $Errors++; + } + } + + # Increment index + $Index1++; + } + + # Remove leading whitespace from the connections detail + $Connections =~ s/,\s+$//; + + # Determine connectivity information from master interface perspective + for ( $Index1 = 0; $Index1 < $MasterInterfaces; $Index1++ ) { + $MasterIF = 'MI' . $Index1; + for ( $Index2 = 0; $Index2 < $SlaveInterfaces; $Index2++ ) { + $SlaveIF = 'SI' . $Index2; + if ( grep $_ eq $MasterIF, @{ $InterfaceInfo{SLAVES}{$SlaveIF}{CONNECTIONS} } ) { + push @{ $InterfaceInfo{MASTERS}{$MasterIF}{CONNECTIONS} }, $SlaveIF; + } + } + } + + +} + +sub ProcessDataForIPXact { + + # Work on a copy for IPXact + %InterfaceInfoIPXact = %{ dclone \%InterfaceInfo }; + + my $SlaveIF = ''; + my $MasterIF = ''; + + my @address_regions = (); + my $address_region; + my $remap_region; + my $AddrLo = ''; + my $AddrHi = ''; + my $Remapping = ''; + my $r_MasterIF = ''; + my $r_AddrLo = ''; + my $r_AddrHi = ''; + my $r_Remapping = ''; + my $new_Remapping= ''; + my $split_done = ''; + my $r_bit = ''; + my $r2_bit = ''; + my $Unmapping = ''; + my $new_Unmapping= ''; + + # Convert move to del + foreach $SlaveIF (keys %{$InterfaceInfoIPXact{SLAVES}} ) { + @address_regions = @{ $InterfaceInfoIPXact{SLAVES}{$SlaveIF}{ADDRESS_MAP}{NORMAL} }; + foreach $address_region (@address_regions) { + ($MasterIF, $Remapping, $AddrLo, $AddrHi) = split(/:/, $address_region); + $new_Remapping = $Remapping; + if ($Remapping eq 'move') { + foreach $remap_region (@{ $InterfaceInfoIPXact{SLAVES}{$SlaveIF}{ADDRESS_MAP}{REMAP} }) { + ($r_MasterIF, $r_Remapping, $r_AddrLo, $r_AddrHi) = split(/:/, $remap_region); + $r_bit = substr($r_Remapping, 5); + if ($r_MasterIF eq $MasterIF) { + if (substr($new_Remapping,0,3) eq "del") { + # Check if it's already in the _del_ + if ($new_Remapping =~ m/.*(del|_|,|\s)$r_bit(_|,|\s|$)/ ) { + $new_Remapping = $new_Remapping; + } else { + $new_Remapping = $new_Remapping . "," . $r_bit; + } + } else { + $new_Remapping = "del" . $r_bit; + } + } + } + if ( !($new_Remapping eq $Remapping) ) { + $address_region = $MasterIF .":". $new_Remapping .":". $AddrLo .":". $AddrHi; + print "Converted " . $MasterIF .":". $Remapping .":". $AddrLo .":". $AddrHi . " to " . $new_Remapping . "\n" if $Debug; + } + } + } + @{ $InterfaceInfoIPXact{SLAVES}{$SlaveIF}{ADDRESS_MAP}{NORMAL} } = @address_regions; + } + + ############################ ADDRESS REGION ############################ + # Cut address_regions if remap_regions overlap + foreach $SlaveIF (keys %{$InterfaceInfoIPXact{SLAVES}} ) { + + # Cut address_regions + @address_regions = @{ $InterfaceInfoIPXact{SLAVES}{$SlaveIF}{ADDRESS_MAP}{NORMAL} }; + foreach $remap_region (@{ $InterfaceInfoIPXact{SLAVES}{$SlaveIF}{ADDRESS_MAP}{REMAP} }) { + ($r_MasterIF, $r_Remapping, $r_AddrLo, $r_AddrHi) = split(/:/, $remap_region); + $r_bit = substr($r_Remapping, 5); + foreach $address_region (@address_regions) { + ($MasterIF, $Remapping, $AddrLo, $AddrHi) = split(/:/, $address_region); + # Make new address region remapping type + if (substr($Remapping,0,3) eq "del") { + # Check if it's already in the _del_ + if ($Remapping =~ m/.*(del|_|,|\s)$r_bit(_|,|\s|$)/ ) { + $new_Remapping = $Remapping; + } else { + $new_Remapping = $Remapping . "," . $r_bit; + } + } else { + $new_Remapping = "del" . $r_bit; + } + # Split the address region that is covered by a remap region + if ( IsLt( $AddrLo , $r_AddrLo) && IsLt( $r_AddrHi, $AddrHi) ) { + $address_region = $MasterIF .":". $new_Remapping .":". $r_AddrLo .":". $r_AddrHi; + push (@address_regions, $MasterIF .":". $Remapping .":". $AddrLo .":". HexSubstract($r_AddrLo,1)); + push (@address_regions, $MasterIF .":". $Remapping .":". HexAdd($r_AddrHi,1) .":". $AddrHi); + + if ($Debug) { + print "Splitting for encapsulated " . $MasterIF .":". $Remapping .":". $AddrLo .":". $AddrHi . "\n"; + print " Into " . $MasterIF .":". $Remapping .":". $AddrLo .":". HexSubstract($r_AddrLo,1) . "\n"; + print " Add " . $MasterIF .":". $new_Remapping .":". $r_AddrLo .":". $r_AddrHi . "\n"; + print " And " . $MasterIF .":". $Remapping .":". HexAdd($r_AddrHi,1) .":". $AddrHi . "\n"; + if (substr($Remapping,0,3) eq "del") { + print "^ (Double Del)\n"; + } + print "---------------------------------------------------------------------\n"; + } + redo; + } elsif ( IsLt( $AddrLo , $r_AddrLo) && IsLt( $r_AddrLo , $AddrHi) ) { + $address_region = $MasterIF .":". $Remapping .":". $AddrLo .":". HexSubstract($r_AddrLo,1); + push (@address_regions, $MasterIF .":". $new_Remapping .":". $r_AddrLo .":". $AddrHi); + + if ($Debug) { + print "Splitting low region " . $MasterIF .":". $Remapping .":". $AddrLo .":". $AddrHi . "\n"; + print " Into " . $MasterIF .":". $Remapping .":". $AddrLo .":". HexSubstract($r_AddrLo,1) . "\n"; + print " And " . $MasterIF .":". $new_Remapping .":". $r_AddrLo .":". $AddrHi . "\n"; + if (substr($Remapping,0,3) eq "del") { + print "^ (Double Del)\n"; + } + print "---------------------------------------------------------------------\n"; + } + redo; + } elsif ( IsLt( $AddrLo , $r_AddrHi) && IsLt( $r_AddrHi , $AddrHi) ) { + $address_region = $MasterIF .":". $new_Remapping .":". $AddrLo .":". $r_AddrHi; + push (@address_regions, $MasterIF .":". $Remapping .":". HexAdd($r_AddrHi,1) .":". $AddrHi); + if ($Debug) { + print "Splitting high region " . $MasterIF .":". $Remapping .":". $AddrLo .":". $AddrHi . "\n"; + print " Into " . $MasterIF .":". $new_Remapping .":". $AddrLo .":". $r_AddrHi . "\n"; + print " And " . $MasterIF .":". $Remapping .":". HexAdd($r_AddrHi,1) .":". $AddrHi . "\n"; + if (substr($Remapping,0,3) eq "del") { + print "^ (Double Del)\n"; + } + print "---------------------------------------------------------------------\n"; + } + redo; + } elsif ( IsGtOrEq( $AddrLo , $r_AddrLo) && IsGtOrEq( $r_AddrHi , $AddrHi) && !($new_Remapping eq $Remapping) ) { + $address_region = $MasterIF .":". $new_Remapping .":". $AddrLo .":". $AddrHi; + if ($Debug) { + print "Changed region to deletable " . $MasterIF .":". $Remapping .":". $AddrLo .":". $AddrHi . "\n"; + print " Into " . $MasterIF .":". $new_Remapping .":". $AddrLo .":". $AddrHi . "\n"; + if (substr($Remapping,0,3) eq "del") { + print "^ (Double Del)\n"; + } + print "---------------------------------------------------------------------\n"; + } + + } + } + } + @{ $InterfaceInfoIPXact{SLAVES}{$SlaveIF}{ADDRESS_MAP}{NORMAL} } = + sort { + my @split_a = split /:/, $a; + my @split_b = split /:/, $b; + my $c; + my $d; + if ( IsLt($split_a[2],$split_b[2]) ) { + $c = 1; + $d = 2; + } else { + $c = 2; + $d = 1; + } + $c <=> $d +# (hex $split_a[2]) <=> (hex $split_b[2] ) + } @address_regions; + + ############################ REMAP ############################ + # Cut remap_regions + @address_regions = @{ $InterfaceInfoIPXact{SLAVES}{$SlaveIF}{ADDRESS_MAP}{REMAP} }; # reusing address_region for remaps + foreach $remap_region (@{ $InterfaceInfoIPXact{SLAVES}{$SlaveIF}{ADDRESS_MAP}{REMAP} }) { + ($r_MasterIF, $r_Remapping, $r_AddrLo, $r_AddrHi) = split(/:/, $remap_region); + $r_bit = substr($r_Remapping, 5); + foreach $address_region (@address_regions) { + ($MasterIF, $Remapping, $AddrLo, $AddrHi, $Unmapping) = split(/:/, $address_region); + $r2_bit = substr($Remapping, 5); + + if ($r_bit<$r2_bit) { + + # If there is already an Unmapping defined + if ($Unmapping) { + # Check if it's already in the _del_ + if ($Unmapping =~ m/.*(unmap|_|,|\s)$r_bit(_|,|\s|$)/ ) { + $new_Unmapping = $Unmapping; + } else { + $new_Unmapping = $r_bit < $r2_bit ? $Unmapping . "," . $r_bit : $Unmapping; + } + } else { + $new_Unmapping = "unmap " . $r_bit; + $Unmapping = ''; + } + # Lower remap bit has higher priority + + # Split the remap region that is covered by another remap region of higher priority + if ( IsLt( $AddrLo , $r_AddrLo) && IsLt( $r_AddrHi, $AddrHi) ) { + $address_region = $MasterIF .":". $Remapping .":". $r_AddrLo .":". $r_AddrHi.":".$new_Unmapping; + push (@address_regions, $MasterIF .":". $Remapping .":". $AddrLo .":". HexSubstract($r_AddrLo,1).":".$Unmapping); + push (@address_regions, $MasterIF .":". $Remapping .":". HexAdd($r_AddrHi,1) .":". $AddrHi.":".$Unmapping); + if ($Debug) { + print "Splitting remap for encapsulated " . $MasterIF .":". $Remapping .":". $AddrLo .":". $AddrHi .":".$Unmapping. "\n"; + print " Into " . $MasterIF .":". $Remapping .":". $AddrLo .":". HexSubstract($r_AddrLo,1) .":".$Unmapping. "\n"; + print " Add " . $MasterIF .":". $Remapping .":". $r_AddrLo .":". $r_AddrHi . ":".$new_Unmapping . "\n"; + print " And " . $MasterIF .":". $Remapping .":". HexAdd($r_AddrHi,1) .":". $AddrHi .":".$Unmapping. "\n"; + print "---------------------------------------------------------------------\n"; + } + redo; + } elsif ( IsLt( $AddrLo , $r_AddrLo) && IsLt( $r_AddrLo , $AddrHi) ) { + $address_region = $MasterIF .":". $Remapping .":". $AddrLo .":". HexSubstract($r_AddrLo,1).":".$Unmapping; + push (@address_regions, $MasterIF .":". $Remapping .":". $r_AddrLo .":". $AddrHi.":".$new_Unmapping); + if ($Debug) { + print "Splitting low remap region " . $MasterIF .":". $Remapping .":". $AddrLo .":". $AddrHi .":".$Unmapping. "\n"; + print " Into " . $MasterIF .":". $Remapping .":". $AddrLo .":". HexSubstract($r_AddrLo,1) .":".$Unmapping. "\n"; + print " And " . $MasterIF .":". $Remapping .":". $r_AddrLo .":". $AddrHi .":".$new_Unmapping. "\n"; + print "---------------------------------------------------------------------\n"; + } + redo; + } elsif ( IsLt( $AddrLo , $r_AddrHi) && IsLt( $r_AddrHi , $AddrHi) ) { + $address_region = $MasterIF .":". $Remapping .":". $AddrLo .":". $r_AddrHi.":".$new_Unmapping; + push (@address_regions, $MasterIF .":". $Remapping .":". HexAdd($r_AddrHi,1) .":". $AddrHi.":".$Unmapping); + if ($Debug) { + print "Splitting high remap region " . $MasterIF .":". $Remapping .":". $AddrLo .":". $AddrHi .":".$Unmapping. "\n"; + print " Into " . $MasterIF .":". $Remapping .":". $AddrLo .":". $r_AddrHi .":".$new_Unmapping. "\n"; + print " And " . $MasterIF .":". $Remapping .":". HexAdd($r_AddrHi,1) .":". $AddrHi .":".$Unmapping. "\n"; + print "---------------------------------------------------------------------\n"; + } + redo; + } elsif ( IsGtOrEq( $AddrLo , $r_AddrLo) && IsGtOrEq( $r_AddrHi , $AddrHi) && !($new_Unmapping eq $Unmapping) ) { + $address_region = $MasterIF .":". $Remapping .":". $AddrLo .":". $AddrHi.":".$new_Unmapping; + if ($Debug) { + print "Changed remap region to unmappable " . $MasterIF .":". $Remapping .":". $AddrLo .":". $AddrHi .":".$Unmapping. "\n"; + print " Into " . $MasterIF .":". $Remapping .":". $AddrLo .":". $AddrHi .":".$new_Unmapping. "\n"; + print "---------------------------------------------------------------------\n"; + } + + } + } + } + } + @{ $InterfaceInfoIPXact{SLAVES}{$SlaveIF}{ADDRESS_MAP}{REMAP} } = + sort { + my @split_a = split /:/, $a; + my @split_b = split /:/, $b; + my $c; + my $d; + if ( IsLt($split_a[2],$split_b[2]) ) { + $c = 1; + $d = 2; + } else { + $c = 2; + $d = 1; + } + $c <=> $d +# (hex $split_a[2]) <=> (hex $split_b[2] ) + } @address_regions; + + + + + # Sort remap in order of priority + @{ $InterfaceInfoIPXact{SLAVES}{$SlaveIF}{ADDRESS_MAP}{REMAP} } = + sort { + my @split_a = split /:/, $a; + my @split_b = split /:/, $b; + substr($split_a[1],5) <=> substr($split_b[1],5) + } @{ $InterfaceInfoIPXact{SLAVES}{$SlaveIF}{ADDRESS_MAP}{REMAP} }; + + } + + # Generate Remapstates + my @bits; + my @c_bits; + my $remap_name; + foreach $SlaveIF (keys %{$InterfaceInfoIPXact{SLAVES}} ) { + @address_regions = @{ $InterfaceInfoIPXact{SLAVES}{$SlaveIF}{ADDRESS_MAP}{NORMAL} }; + push (@address_regions, @{ $InterfaceInfoIPXact{SLAVES}{$SlaveIF}{ADDRESS_MAP}{REMAP} }); + foreach $address_region (@address_regions) { + $Unmapping = ''; + ($MasterIF, $Remapping, $AddrLo, $AddrHi,$Unmapping) = split(/:/, $address_region); + @bits = GetRemapBits ($Remapping, $Unmapping); + $remap_name = "remap_".join( '_' , @bits ); + # Change ! to n + $remap_name =~ s/!/n/g ; + + # don't put in duplicates + if ( @bits && !$RemapStates{$remap_name}) { + @{ $RemapStates{$remap_name}} = @bits; + } + } + } + + print "RemapStates:\n" if $Debug; + print Dumper(\%RemapStates) if $Debug; + + # Generate AddressSpace regions + foreach $SlaveIF (keys %{$InterfaceInfoIPXact{SLAVES}} ) { + @address_regions = @{ $InterfaceInfoIPXact{SLAVES}{$SlaveIF}{ADDRESS_MAP}{NORMAL} }; + push (@address_regions, @{ $InterfaceInfoIPXact{SLAVES}{$SlaveIF}{ADDRESS_MAP}{REMAP} }); + foreach $address_region (@address_regions) { + ($MasterIF, $Remapping, $AddrLo, $AddrHi) = split(/:/, $address_region); + if ( !( grep {(@{$_}[0] eq $AddrLo) && (@{$_}[1] eq $AddrHi)} @{ $AddressSpace{$MasterIF} } ) ) { + push @{ $AddressSpace{$MasterIF}}, [$AddrLo,$AddrHi]; + } + } + } + + # Sort the AddressSpace + foreach $MasterIF (keys %AddressSpace) { + @{ $AddressSpace{$MasterIF}} = sort { + my $c; + my $d; + if ( IsLt(@{$a}[0],@{$b}[0]) ) { + $c = 1; + $d = 2; + } else { + $c = 2; + $d = 1; + } + $c <=> $d + } @{ $AddressSpace{$MasterIF}}; + } + + print "AddressSpace:\n" if $Debug; + print Dumper(\%AddressSpace) if $Debug; + + print "InterfaceInfo:\n" if $Debug; + print Dumper(\%InterfaceInfo) if $Debug; + + print "InterfaceInfoIPXact:\n" if $Debug; + print Dumper(\%InterfaceInfoIPXact) if $Debug; + +} + + +# ------------------------------------------------------------------------------ +# ShowHelp - Displays help dialogue (developer's options are not advertised) +# ------------------------------------------------------------------------------ +sub ShowHelp { + + # Local variable(s) + my $ShowArchitectureOptions = 0; + + printf "%sPurpose:\n" . + " Builds particular configurations of the AHB BusMatrix component.\n\n" . + "Usage:\n" . + " Builds an AHB BusMatrix component with a given number of input\n" . + " ports, a given number of output ports, a particular arbitration\n" . + " scheme and ARM processor interface.\n\n" . + "Options:\n" . + " --cfg=FILENAME Name of an XML configuration file that\n" . + " defines the bus matrix specification\n" . + " in place of most command line arguments.\n" . + " Note that this is the only method to\n" . + " specify customised address maps.\n". + "\n" . + " use these if not using the config file method:\n" . + " --inports=NUM Number of input (slave) ports ($MinSlaveIF..$MaxSlaveIF).\n" . + " --outports=NUM Number of output (master) ports ($MinMasterIF..$MaxMasterIF).\n\n" . + " --connectivity='SI0=MI\\{0,1,2}:SI1=MI{3,4,5}'\n\n" . + + " Sparse interconnect declarations. The\n" . + " example above means inport 0 connects\n" . + " to outports 0, 1 and 2, and inport 1\n" . + " connects to outports 3, 4 and 5.\n\n" . + + " --arb=SCHEME Arbitration scheme:\n" . + " burst - Fixed priority; Master 0 has\n" . + " highest priority, does not\n" . + " break defined length bursts.\n" . + " fixed - Fixed priority; Master 0 has\n" . + " highest priority.\n" . + " round - Round robin priority; priority\n" . + " goes to next available master.\n\n", + ( $Verbose ) ? '' : "\n--- $Scriptname ---\n\n"; + + # Display option + if ( $ShowArchitectureOptions ) { + print " --arch=VER ARM Processor interface:\n" . + " ahb2 - AMBA2.0 interface.\n" . + " v6 - All ARM V6 extensions.\n" . + " excl - ARM V6 exclusive access\n" . + " extensions only.\n" . + " unalign - ARM V6 unaligned and byte-\n" . + " strobed access extensions\n" . + " only.\n"; + } + + print " --datawidth=WIDTH Width of data bus ($DataWidths).\n" . + " --addrwidth=WIDTH Width of address bus ($MinAddrWidth..$MaxAddrWidth).\n" . + " --userwidth=WIDTH Width of user signals ($MinUserWidth..$MaxUserWidth).\n\n" . + + " --OutputArb=NAME Name of arbitration component\n" . + " (max $MaxNameLength characters).\n" . + " --OutputStage=NAME Name of output stage component\n" . + " (max $MaxNameLength characters).\n" . + " --MatrixDecode=NAME Name of address decoder component(s)\n" . + " (max $MaxNameLength characters).\n" . + " --InputStage=NAME Name of input stage component\n" . + " (max $MaxNameLength characters).\n" . + " --BusMatrix=NAME Name of top level entity\n" . + " (max $MaxNameLength characters).\n\n" . + + " --ipxact Alos generates SPIRIT-2009 compatible IPXACT file.\n" . + " --verbose Prints run information.\n" . + " --help Prints this help.\n" . + " --srcdir=DIRNAME Directory name where source files are\n" . + " located (defaults to $SourceDir).\n" . + " --tgtdir=DIRNAME Directory name where RTL files will be\n" . + " generated (defaults to $TargetDir).\n" . + " --xmldir=DIRNAME Directory name where XML configuration\n" . + " files are located (defaults to $XmlDir).\n" . + " --ipxactsrcdir=DIRNAME Directory name where IPXact source files are\n" . + " located (defaults to $IPXactSourceDir).\n" . + " --ipxacttgtdir=DIRNAME Directory name where IPXact files will be\n" . + " generated (defaults to $IPXactTargetDir).\n" . + " --overwrite Overwrites existing bus matrix of the\n" . + " same name.\n" . + " --(no)timescales Adds or suppressed the '`timescale' directive in the rendered Verilog files.\n" . + " --check Disables file generation and just checks the\n" . + " XML configuration file.\n\n"; + + # Abort session with exit code = 0 + exit (0); +} diff --git a/Cortex-M0/nanosoc/systems/mcu/verilog/gen_ahb_busmatrix/bin/lib/xmlparser.pm b/Cortex-M0/nanosoc/systems/mcu/verilog/gen_ahb_busmatrix/bin/lib/xmlparser.pm new file mode 100755 index 0000000..c8b144c --- /dev/null +++ b/Cortex-M0/nanosoc/systems/mcu/verilog/gen_ahb_busmatrix/bin/lib/xmlparser.pm @@ -0,0 +1,1393 @@ +# ------------------------------------------------------------------------------ +# The confidential and proprietary information contained in this file may +# only be used by a person authorised under and to the extent permitted +# by a subsisting licensing agreement from Arm Limited or its affiliates. +# +# (C) COPYRIGHT 2006-2011,2017 Arm Limited or its affiliates. +# ALL RIGHTS RESERVED +# +# This entire notice must be reproduced on all copies of this file +# and copies of this file may only be made by a person if such person is +# permitted to do so under the terms of a subsisting license agreement +# from Arm Limited or its affiliates. +# +# ------------------------------------------------------------------------------ +# Version and Release Control Information: +# +# File Name : $RCSfile: xmlparser.pm,v $ +# +# SVN Information +# +# Checked In : $Date: 2011-02-21 17:53:53 +0000 (Mon, 21 Feb 2011) $ +# +# Revision : $Revision: 162121 $ +# +# Release Information : Cortex-M System Design Kit-r1p1-00rel0 +# +# ------------------------------------------------------------------------------ +# Purpose : Parse XML file input and produce equivalent structure +# hash array, which can be accessed via public methods. +# +# Requirements : Perl version 5.005 or later for thread safety +# +# Limitations : See the POD after the __END__ marker in this file. Try: +# +# pod2text xmlparser.pm | more +# +# ------------------------------------------------------------------------------ + +eval "exec perl -w -S $0 $@" # -*- Perl -*- + if ($running_under_some_sh); + undef ($running_under_some_sh); + +# Declare module name +package xmlparser; + +# Declare import modules and libraries +require Exporter; +use strict; +use vars qw( $VERSION @ISA @EXPORT @EXPORT_OK %XmlNodeTree %XmlNodeTotals ); + +# Declare public and private entities +@ISA = qw( Exporter ); + +@EXPORT = qw( ConfigureXmlParser + RunXmlParser + ListXmlHash + ChangeRelativePath + GetXmlNodeList + GetXmlValue + GetXmlName + %XmlNodeTotals + %XmlNodeTree ); + +@EXPORT_OK = qw( %XmlNodeTree ); + +$VERSION = 1.00; + +# Dummy 'lock' routine for non-threaded versions of Perl +BEGIN { + if ( $] < 5.005 ) { eval "sub lock {}"; } +} + +# ------------------------------------------------------------------------------ + +# Script variables +my $DebugMode = 0; +my $RecursionDepth = 0; +my $RecursionLimit = 25; +my $ShowIds = 0; +my $ShowWarnings = 1; +my $Verbose = 1; +my $Warnings = 0; + +# Relative access path, serviced by ChangeRelativePath() function +my $RelativePath = ''; + +# Node stack +my @PathStack = ( 'ROOT' ); +my $PathLevel = 0; + +# Exportable global data structure and node counters (note that values and +# attributes will be added dynamically when the XML file is parsed) +%XmlNodeTree = ( ROOT => { ITEMS => {ELEMENTS => [], ATTRIBUTES => []} } ); +%XmlNodeTotals = ( TOTAL => 0, ELEMENTS => 0, ATTRIBUTES => 0 ); + + +# ------------------------------------------------------------------------------ +# PUBLIC: RunXmlParser - Extracts the multi-line value and fields +# ------------------------------------------------------------------------------ +sub RunXmlParser { + + # Passed parameter 1 is the XML filename + my $XmlFilename = shift; + + # Local variable(s) + my $TextLine = ''; + my $LineCount = 0; + my $LeadingSpace = 0; + my $Delimeter = ''; + my $Before = ''; + my $After = ''; + my $Field = ''; + my $Residue = ''; + my $InContainer = 0; + my $GotHeader = 0; + my $HeaderMisaligned = 0; + my $ContainerType = ''; + my $Element = ''; + my $EmptyElement = 0; + my $InstanceId = 1; + my $Increment = 1; + my $CurrentPath = 'ROOT'; + my $ParentPath = 'ROOT'; + my $AttributeCount = 0; + my $ParseEnable = 1; + my ($JustFilename) = $XmlFilename =~ /([^\/]+)$/; + + # Open the input file + open (INPUT_FILE, "<$XmlFilename") or + ReportError('Cannot open the specified file for reading'); + + print "Parsing the '$JustFilename' file...\n" if ( $Verbose ); + + # Process each line of the file + while ( $TextLine = <INPUT_FILE> ) { + + # Increment line count + $LineCount++; + + # Parse the line(s), when enabled + while ( $ParseEnable ) { + + # Remove single line comments, leading or end-of-line whitespace, + # carriage returns, newlines and tab characters. Leading whitespace + # is tracked for checking the <?xml ...?> processing instruction + $TextLine =~ s/<!--.*-->//g; + $LeadingSpace = ( $TextLine =~ s/^\s+// ) ? 1 : 0; + $TextLine =~ s/\s*(\r|\n|\t)$//g; + + # Only process lines that are not blank + unless ( $TextLine eq '' ) { + + # Display line when in debug mode + if ( $DebugMode ) { printf "Line %-03d: '$TextLine'\n", $LineCount; } + + # Reconstruct fields of text (from multiple lines), which are delimited + # by the reserved characters '<' and '>'. Store the extracted tokens + # in the same order as they are processed. A path stack is used to + # determine the name of the current container. All nodes found within + # the scope of the current container are stored in a keyed list (the + # node structure hash array) + if ( ($Delimeter) = $TextLine =~ /([<>])/ ) { + + # Store the patterns before and after the delimeter + $Before = $`; + $After = $'; + + # Determine appropriate action for the '<' delimeter + if ( $Delimeter eq '<' ) { + + # Terminate reconstruction of a value field? + if ( ! $InContainer ) { + + # Terminate the reconstructed value by concatenating the string + # preceding the '<' delimeter and extracting any residual text + $Field = $Field . $Before; + + unless ( $Field eq '' ) { + # Display the value when in debug mode + if ( $DebugMode ) { print "Value of '$Element' = '$Field'\n"; } + + # Check and store the extracted value + CheckValue($Field, $LineCount); + $XmlNodeTree{$CurrentPath}{VALUE} = $Field; + + # Clear the field ready for a new reconstruction + $Field = ''; + } + + # Change to the 'in-container' state + $InContainer = 1; + } + + # Initiate reconstruction of a container field? + if ( $InContainer ) { + + # Initiate reconstruction of a new container by storing it and + # testing for the closing delimeter. If found, then trim the + # field accordingly and extract any residual text, else pad + # the field to support multi-line reconstruction + $Field = $After; + if ( $Field =~ s/>(.*)$// ) { + $After = $1; + $Before = ''; + $Delimeter = '>'; + } else { + $Field = $Field . ' '; + } + + # If '<?xml' is found then check the alignment of the field + unless ( $GotHeader ) { + if ( $TextLine =~ /<\?xml/ ) { + $HeaderMisaligned = ($LineCount > 1 or $LeadingSpace); + } + } + + } + } + + # Determine appropriate action for the '>' delimeter + if ( $Delimeter eq '>' ) { + + # Determine action for this delimeter + if ( ! $InContainer ) { + + # Initiate reconstruction of a new value by storing it and + # testing for the opening delimeter. If found, then trim the + # field accordingly and extract any residual text + $Field = $After; + if ( $Field =~ s/<(.*)$// ) { $Residue = '<' . $1; } + + } else { + + # Terminate the reconstructed container by concatenating the + # remaining portion and smartly formatting the field to simplify + # pattern-matching. Selectively extract and residual text + $Field = TidyXmlContainer($Field . $Before, $LineCount); + $Residue = ( $After ne '' ) ? '>' . $After : ''; + + # Display the container name when in debug mode + if ( $DebugMode ) { print "Container: '$Field'\n"; } + + # Ignore blank fields when produced by the removal of + # multi-line comments + unless ( $Field eq '' ) { + + # Check the 'wellformedness' of the reconstructed container + CheckWellformedXml($Field, $LineCount); + + # Re-initialise the node reference increment + $Increment = 1; + + # Determine container type from beginning of the field, and + # apply appropriate syntax checks + $ContainerType = substr($Field, 0, 1); + if ( $ContainerType eq '?' ) { + + # Check processing instructions + if ( $Field =~ /^\?xml/ ) { + unless ( $GotHeader ) { + CheckXmlHeader($Field, $HeaderMisaligned); + $GotHeader = 1; + } + } else { + # Anything else is not supported + ReportError("Unsupported XML processing instruction starting on line $LineCount"); + } + + } elsif ( $ContainerType eq '!' ) { + + # Check declarations + CheckDeclaration($Field, $LineCount); + + } elsif ( $ContainerType =~ /[a-z_.\-\/]/i ) { + + # Check elements + CheckElement($Field, $LineCount); + + # Determine element sub-type + if ( $ContainerType ne '/' ) { + + # Extract and remove the element name + $Field =~ s/([a-z0-9_:\.\-]+)\s?//i; + $Element = $1; + + # Check if this is an empty element + $EmptyElement = ( $Field =~ /\/$/ ) ? 1 : 0; + + # Determine the parent path and then post-increment the path stack pointer + $ParentPath = DetermineStructPath($PathLevel++); + + # For this new element, determine its unique current path. If the key is + # unique, then initialise the item lists in the current node record + $InstanceId = 1; + while ( 1 ) { + $PathStack[$PathLevel] = sprintf("%s[%d]", $Element, $InstanceId++); + $CurrentPath = DetermineStructPath($PathLevel); + unless ( exists($XmlNodeTree{$CurrentPath}) ) { + $XmlNodeTree{$CurrentPath}{ITEMS}{ELEMENTS} = []; + $XmlNodeTree{$CurrentPath}{ITEMS}{ATTRIBUTES} = []; + last; + } + } + + # Display element name and path information when in debug mode + if ( $DebugMode ) { + printf "Element (%s): '%s'\nPUSH: Appending path: '%s', Parent path: '%s'\n", + $EmptyElement ? 'empty' : 'open', $PathStack[$PathLevel], $CurrentPath, $ParentPath; + } + + # Update the item list of the parent node record + push ( @{ $XmlNodeTree{$ParentPath}{ITEMS}{ELEMENTS} }, $PathStack[$PathLevel] ); + + # Extract attributes and add the count to the node total + $AttributeCount = ExtractAttributes($Field, $CurrentPath); + $XmlNodeTotals{ATTRIBUTES} += $AttributeCount; + + # Display number of extracted attributes when in debug mode + if ( $DebugMode ) { + unless ( $AttributeCount == 0 ) { + print "Extracted $AttributeCount attribute(s) from element '$PathStack[$PathLevel]'\n"; + } + } + + # Selectively decrement the path stack pointer and determine paths + if ( $EmptyElement ) { + $CurrentPath = DetermineStructPath(--$PathLevel); + $ParentPath = DetermineStructPath($PathLevel - 1); + + # Display current and parent paths when in debug mode + if ( $DebugMode ) { + print "POP: Current path: '$CurrentPath', Parent path: '$ParentPath'\n"; + } + } + + } else { + + # Decrement the node stack pointer and determine the paths + $CurrentPath = DetermineStructPath(--$PathLevel); + $ParentPath = DetermineStructPath($PathLevel - 1); + + # Display paths when in debug mode + if ( $DebugMode ) { + print "POP: Current path: '$CurrentPath', Parent path: '$ParentPath'\n"; + } + + # Disable the node reference increment for closed elements + $Increment = 0; + + } + + } else { + # Any other type of field is not supported + ReportError("Unrecognised or illegal XML field starting on line $LineCount"); + } + + # Increment the node counts + $XmlNodeTotals{ELEMENTS} += $Increment; + $XmlNodeTotals{TOTAL}++; + + # Clear the field ready for a new reconstruction and change to + # the 'in-value' state + $Field = ''; + $InContainer = 0; + } + + } + } + + } else { + # Continue to build the field from multiple lines + $Field = $Field . $TextLine; + } + + } + + # If a second pass is required to process any residual text from the + # first attempt then remain in this loop, else exit the parsing loop + if ( $Residue ne '' ) { + # Display residual text when in debug mode + if ( $DebugMode ) { print "Residue: '$Residue'\n"; } + $TextLine = $Residue; + $Residue = ''; + } else { + $ParseEnable = 0; + } + } + + # Re-enable parsing for a fresh line of text + $ParseEnable = 1; + } + + # Check that the root node is properly terminated upon the EOF + if ( $PathLevel != 0 ) { + ReportError('Unexpected end-of-file due to a syntax error'); + } + + # Close the XML file + close (INPUT_FILE); + + # Display node totals when in verbose mode + if ( $Verbose ) { + printf "Processed %d line(s) with %d warning(s) - extracted %d XML node(s) [%d, @%d]...\n", + $LineCount, $Warnings, $XmlNodeTotals{TOTAL}, + $XmlNodeTotals{ELEMENTS}, $XmlNodeTotals{ATTRIBUTES}; + } +} + + +# ------------------------------------------------------------------------------ +# TidyXmlContainer - Apply intelligent text formatting to the container +# ------------------------------------------------------------------------------ +sub TidyXmlContainer { + + # Passed parameter 1 is the container + my $Container = shift; + # Passed parameter 2 is the line number + my $LineNumber = shift; + + # Local variable(s) + my $Field = ''; + my $Quote = ''; + my $Token = ''; + my $InQuotes = 0; + + # Check for illegal empty container + if ( $Container eq '' ) { + ReportError("Empty XML field starting on line $LineNumber"); + } + + # Remove multi-line comments and end-of-field or leading whitespace + $Container =~ s/^!--.*--$//; + $Container =~ s/^\s*//; + $Container =~ s/\s*$//g; + + # If the container is an element with attributes, then process it with + # respect for embedded whitespace within quoted strings + $Field = $Container; + while ( ($Quote) = $Field =~ /[^=]+=\s*(['"]).*['"]/ ) { + + # Selectively clear the container string for recomposition + if ( $InQuotes == 0 ) { $Container = ''; } + + # Extract portions of the container between matching quote characters + # and process whitespace on alternate iterations + while ( $Field =~ s/([^$Quote]+)($Quote*)// ) { + $Token = $1 . $2; + unless ( $InQuotes % 1 ) { + $Token =~ s/\s+/ /g; + $Token =~ s/\s?=\s?/=/g; + } + $Container = $Container . $Token; + $InQuotes++; + } + + } + + return ($Container); +} + + +# ------------------------------------------------------------------------------ +# CheckWellformedXml - Check the 'wellformedness' of the container +# ------------------------------------------------------------------------------ +sub CheckWellformedXml { + + # Passed parameter 1 is the container + my $Container = shift; + # Passed parameter 2 is the line number + my $LineNumber = shift; + + # Local variable(s) + my $BadProcInstr = ( $Container =~ /^\?/ and + $Container !~ /\?$/ ) ? 1 : 0; + my $BadDecl = ( $Container =~ /^\!/ and + $Container =~ /[\!\?\/]$/ ) ? 1 : 0; + my $BadOpenElement = ( $Container =~ /^[a-z_.\-]/i and + $Container !~ /\/?$/ ) ? 1 : 0; + my $BadCloseElement = ( $Container =~ /^\// and + $Container =~ /(=|\/$)/ ) ? 1 : 0; + + # Check and display an error if invalid + if ( $BadProcInstr or $BadDecl or $BadOpenElement or $BadCloseElement ) { + ReportError("XML field starting on line $LineNumber is not well-formed"); + } +} + + +# ------------------------------------------------------------------------------ +# CheckXmlHeader - Validate the <?xml ...?> header container +# ------------------------------------------------------------------------------ +sub CheckXmlHeader { + + # Passed parameter 1 is the header + my $Header = shift; + # Passed parameter 2 is the alignment error flag + my $Misaligned = shift; + + # Local variable(s) + my $XMLVersion = '1.0 (default)'; + my $XMLEncoding = 'iso-8859-1 (default)'; + my $XMLMode = 'yes (default)'; + + # Announce the header check + print "Validating XML header...\n" if ( $Verbose ); + + # Check the mis-alignment flag + if ( $Misaligned ) { + ReportError("The '?xml' declaration must start on line 1, column 1"); + } + + # Check syntax of supported attributes + if ( ($Header !~ /^\?xml[\s\?]/) or + ($Header !~ /((version|encoding|standalone)=("[^"]+"|'[^']+'))*/) ) { + ReportError("Invalid '<?xml ...?>' processing instruction"); + } + + # Check version, encoding and standalone (mode) attributes + if ( $Header =~ /version=("[^"]+"|'[^']+')/ ) { + $XMLVersion = $1; $XMLVersion =~ s/["']//g; + if ($XMLVersion ne '1.0') { + ReportError('Unsupported XML version'); + } + } + if ( $Header =~ /encoding=("[^"]+"|'[^']+')/ ) { + $XMLEncoding = $1; $XMLEncoding =~ s/["']//g; + if ( $XMLEncoding !~ /^(iso\-8859\-1|UTF\-8)$/ ) { + ReportError('Unsupported XML encoding'); + } + } + if ( $Header =~ /standalone=("[^"]+"|'[^']+')/ ) { + $XMLMode = $1; $XMLMode =~ s/["']//g; + if ( $XMLMode !~ /(yes|no)\b/ ) { + ReportError('Unsupported standalone declaration'); + } + } + + # Display header settings + print "XML version '$XMLVersion', encoding '$XMLEncoding', standalone" . + " '$XMLMode'...\n" if ( $Verbose ); +} + + +# ------------------------------------------------------------------------------ +# CheckDeclaration - Validate the <!... > declaration container +# NOTE: This procedure needs further work if required +# ------------------------------------------------------------------------------ +sub CheckDeclaration { + + # Passed parameter 1 is the container + my $Container = shift; + # Passed parameter 2 is the line number + my $LineNumber = shift; + + # Local variable(s) + my $DeclarationType = ''; + + # Check and display an error if invalid + if ( ($DeclarationType) = $Container !~ /^\!(DOCTYPE|ENTITY)\b/ ) { + ReportError("Unrecognised XML declaration starting on line $LineNumber"); + } +} + + +# ------------------------------------------------------------------------------ +# CheckElement - Validate the element container +# ------------------------------------------------------------------------------ +sub CheckElement { + + # Passed parameter 1 is the container + my $Container = shift; + # Passed parameter 2 is the line number + my $LineNumber = shift; + + # Local variable(s) + my $ElementName = ''; + my $AttributeName = ''; + my $AttributeValue = ''; + my $StartQuote = ''; + my $EndQuote = ''; + my $ForbiddenQuote = ''; + my %Names = (); + + # Extract and remove the element name, then check it for illegal + # chacters + $Container =~ s/^\/?([^\s]+)\s?//; + $ElementName = $1; + if ( $ElementName =~ /[^a-z0-9_:\.\-]/i ) { + ReportError("XML element starting on line $LineNumber has an illegal name"); + } + + # If defined, check attributes of element fields. Extract, remove + # and test the LHS and RHS fields of '=' assignments in turn + while ( $Container =~ s/([^=]+)=(['"])// ) { + + $AttributeName = $1; $StartQuote = $2; + $ForbiddenQuote = ($StartQuote eq '"') ? '"' : "'"; + + # Check the attribute name for illegal characters + if ( $AttributeName =~ /[^a-z0-9_:\.\-]/i ) { + ReportError("XML element starting on line $LineNumber has an illegal attribute name"); + } + # Check the attribute name for duplicates and note unique ones + if ( exists($Names{$AttributeName}) ) { + ReportError("XML element starting on line $LineNumber has a duplicate attribute name"); + } + $Names{$AttributeName} = ''; # Value unimportant for purpose + + # Extract and remove the attribute value, restoring the container + # field appropriately for the next iteration + if ( $Container =~ s/([^=]+)// ) { + $AttributeValue = $1; + $AttributeValue =~ s/(['"])\s?([^'"]*)$//; + $EndQuote = $1; $Container = $2 . $Container; + + # Check the attribute value for illegal characters + if ( $AttributeValue =~ /[<>$ForbiddenQuote]/ or + ($AttributeValue =~ /&/ and + $AttributeValue !~ /&(amp|lt|gt|apos|quot|\#[0-9]{3}|\#x[A-Fa-f0-9]{2});/) ) { + ReportError("XML element starting on line $LineNumber has an illegal attribute value"); + } + # Check for misquoted attribute value + unless ( $StartQuote eq $EndQuote ) { + ReportError("XML element starting on line $LineNumber has a misquoted attribute value"); + } + } + + } +} + + +# ------------------------------------------------------------------------------ +# CheckValue - Check the XML value field for illegal characters +# ------------------------------------------------------------------------------ +sub CheckValue { + + # Passed parameter 1 is the value + my $Field = shift; + # Passed parameter 2 is the line number + my $LineNumber = shift; + + # Local variable(s) + my $BadLTGT = ( $Field =~ /[<>]/ ) ? 1 : 0; + my $BadAmpersand = ( $Field =~ /&/ and + $Field !~ /&(amp|lt|gt|apos|quot|\#[0-9]{3}|\#x[A-Fa-f0-9]{2});/ ) ? 1 : 0; + + # Check and display an error if invalid + if ( $BadLTGT or $BadAmpersand ) { + ReportError("XML value field starting on line $LineNumber contains illegal characters"); + } +} + + +# ------------------------------------------------------------------------------ +# ExtractAttributes - Inspect and extract the attributes from elements +# ------------------------------------------------------------------------------ +sub ExtractAttributes { + + # Passed parameter 1 is the container + my $Container = shift; + # Passed parameter 2 is the current path + my $Path = shift; + + # Local variable(s) + my $Attributes = 0; + my $AttributeName = ''; + my $AttributeValue = ''; + + # If defined, check attributes of element fields. Extract, remove + # and test the LHS and RHS fields of '=' assignments in turn + while ( $Container =~ s/([^=]+)=['"]// ) { + # Store the attribute name + $AttributeName = $1; + + # Extract and remove the attribute value, restoring the container + # field appropriately for the next iteration + if ( $Container =~ s/([^=]+)// ) { + $AttributeValue = $1; + $AttributeValue =~ s/['"]\s?([^'"]*)$//; + $Container = $1 . $Container; + + # Update the item list in the current node record and then save + # both the attribute name and its value + push ( @{ $XmlNodeTree{$Path}{ITEMS}{ATTRIBUTES} }, $AttributeName ); + $XmlNodeTree{$Path}{ATTRIBUTES}{$AttributeName} = $AttributeValue; + $Attributes++; + } + } + + return ($Attributes); +} + + +# ------------------------------------------------------------------------------ +# PUBLIC: ListXmlHash - List contents of the structure, using safe recursion +# ------------------------------------------------------------------------------ +sub ListXmlHash { + + # Passed parameter 1 is the requested node start point + my $NodeKey = shift; + + # Local variable(s) + my ($NodeName) = $NodeKey =~ /([^{]+)$/;; + my @NodeKeys = @{ $XmlNodeTree{$NodeKey}{ITEMS}{ELEMENTS} }; + my $NodeValue = $XmlNodeTree{$NodeKey}{VALUE}; + my $NodeItem = ''; + my @Markup = ('', '@'); + + # Initially display the 'listing structure' message + if ( $RecursionDepth == 0 ) { print "Listing the data structure:\n\n"; } + + # Remove the reference number from the node name + unless ( $ShowIds ) { $NodeName = GetXmlName($NodeName); } + + # Display the element name and optional value + if ( not defined $NodeValue ) { + printf " %s- $NodeName\n", ' ' x ($RecursionDepth * 2); + } else { + printf " %s- $NodeName = '$NodeValue'\n", ' ' x ($RecursionDepth * 2); + } + + # Selectively display attributes + foreach $NodeItem ( @{ $XmlNodeTree{$NodeKey}{ITEMS}{ATTRIBUTES} } ) { + printf " %s%s$NodeItem %s= '$XmlNodeTree{$NodeKey}{ATTRIBUTES}{$NodeItem}'\n", + ' ' x ($RecursionDepth * 2), $Markup[1 - $ShowIds], $Markup[$ShowIds]; + } + + # List content of the current node by recursion within limits + foreach $NodeItem ( @NodeKeys ) { + if ( ++$RecursionDepth > $RecursionLimit ) { + ReportError("Recursion depth of $RecursionLimit exceeded"); + } else { + # Interrogate the next level of the hierarchy + ListXmlHash("$NodeKey}{$NodeItem"); + } + $RecursionDepth--; + } +} + + +# ------------------------------------------------------------------------------ +# DetermineStructPath - Determine the structure path key +# ------------------------------------------------------------------------------ +sub DetermineStructPath { + + # Passed parameter 1 is the level + my $RequestedLevel = shift; + + # Local variable(s) + my $LevelPointer = 0; + my $Result = 'ROOT'; + + # Build the path and remove the outermost pair of braces, else return + # the root node + if ( $RequestedLevel > 0 ) { + $Result = ''; + while ( $LevelPointer <= $RequestedLevel ) { + $Result = $Result . '{' . $PathStack[$LevelPointer++] . '}'; + } + $Result =~ s/(^{|}$)//g; + } + + return ($Result); +} + + +# ------------------------------------------------------------------------------ +# 'TranslateXPath' - Translates the specified XPath into the nearest match +# access key +# ------------------------------------------------------------------------------ +sub TranslateXPath { + + # Passed parameter 1 is the specified XPath + my $Path = shift; + + # Local variable(s) + my @XPathTokens = []; + my $Token = ''; + my $Key = ''; + my $ResolvedPath = 'ROOT'; + + if ( $Path =~ s/^\/// ) { + # Determine the key lookup for absolute paths + @XPathTokens = split('/', $Path); + foreach $Token ( @XPathTokens ) { + foreach $Key ( @{ $XmlNodeTree{$ResolvedPath}{ITEMS}{ELEMENTS} } ) { + if ( $Key eq $Token or $Key =~ /$Token/ ) { + $ResolvedPath = $ResolvedPath . '}{' . $Key; + last; + } + } + } + $Path = $ResolvedPath; + } else { + ReportError('Unsupported or badly formed XPath'); + } + + # Display the translated access key when in debug mode + if ( $DebugMode ) { print "Key: '$Path'\n"; } + + return ($Path); +} + + +# ------------------------------------------------------------------------------ +# PUBLIC: 'GetXmlName' - Returns the XML node name without uniquifier(s) +# ------------------------------------------------------------------------------ +sub GetXmlName { + + # Passed parameter 1 is the specified XML node + my $XmlNode = shift; + + $XmlNode =~ s/\[\d+\]//g; + + return ($XmlNode); +} + + +# ------------------------------------------------------------------------------ +# PUBLIC: 'ChangeRelativePath' - Sets and returns the relative path +# ------------------------------------------------------------------------------ +sub ChangeRelativePath { + + # Passed parameter 1 is the specified path stem + $RelativePath = shift; + + return ($RelativePath); +} + + +# ------------------------------------------------------------------------------ +# PUBLIC: 'GetXmlNodeList' - Return child node list for the specified parent +# node. Append '@' character to get attributes +# ------------------------------------------------------------------------------ +sub GetXmlNodeList { + + # Passed parameter 1 is the requested node + my $NodeKey = shift; + + # Local variable(s) + my $NodeType = ( $NodeKey =~ s/@// ) ? 'ATTRIBUTES' : 'ELEMENTS'; + my $ParentKey = ''; + my $Key = ''; + my $MatchNode = ''; + my @Nodes = (); + + # Determine nodename search or specific lookup + if ( $NodeKey =~ s/^\/\//\// ) { + + # Translate the XPath, then split it into the parent key and search element + $ParentKey = TranslateXPath($NodeKey); + if ( $ParentKey =~ s/\}\{([a-z0-9\.\-\_]+)\[1\]$// ) { $MatchNode = $1; } + + # Conditionally search for matching keys and store full paths of matches + unless ( $MatchNode eq '' or $NodeKey !~ /$MatchNode$/ ) { + foreach $Key ( @{ $XmlNodeTree{$ParentKey}{ITEMS}{$NodeType} } ) { + if ( $Key =~ /$MatchNode\[\d+\]/ ) { push @Nodes, "$ParentKey}{$Key"; } + } + } + + } else { # Specific look-up + + # Conditionally prepend the current relative path + unless ( $NodeKey =~ /^ROOT/ ) { $NodeKey = $RelativePath . $NodeKey; } + + # Translate XPaths when specified + if ( $NodeKey =~ /\// ) { $NodeKey = TranslateXPath($NodeKey); } + + # Lookup listing node if it exists + if ( exists($XmlNodeTree{$NodeKey}{ITEMS}{$NodeType}) ) { + @Nodes = @{ $XmlNodeTree{$NodeKey}{ITEMS}{$NodeType} }; + } elsif ( $ShowWarnings ) { + ReportWarning('Unable to get node list due to non-existent access path'); + } + + } + + # Display a list of nodes when in debug mode + if ( $DebugMode ) { foreach $Key ( @Nodes) { print "List node: '$Key'\n"; } } + + return ( @Nodes ); +} + + +# ------------------------------------------------------------------------------ +# PUBLIC: 'GetXmlValue' - Extract the value of the specified element. +# Prepend '@' character before name to get attributes +# ------------------------------------------------------------------------------ +sub GetXmlValue { + + # Passed parameter 1 is the requested node start point + my $NodeKey = shift; + + # Local variable(s) + my $Attribute = ( $NodeKey =~ s/@(.+)$// ) ? $1 : ''; + my $Value = ''; + my $NoValue = ''; + + # Conditionally prepend the current relative path + unless ( $NodeKey =~ /^ROOT/ ) { $NodeKey = $RelativePath . $NodeKey; } + + # Translate XPaths when specified + if ( $NodeKey =~ /\// ) { $NodeKey = TranslateXPath($NodeKey); } + + # Lookup the value or attribute node if it exists. It must be coded like this + # to avoid non-existent keys from being incorrectly added to the hash as a + # side effect of the 'exists()' function + if ( exists($XmlNodeTree{$NodeKey}) ) { + # Now check and extract the element or attribute value + if ( $Attribute ne '' ) { + if ( exists($XmlNodeTree{$NodeKey}{ATTRIBUTES}{$Attribute}) ) { + $Value = $XmlNodeTree{$NodeKey}{ATTRIBUTES}{$Attribute}; + unless ( defined($Value) ) { $Value = $NoValue; } + } elsif ( $ShowWarnings ) { + ReportWarning('Access attempted to a non-existent attribute name'); + } + } else { + $Value = exists( $XmlNodeTree{$NodeKey}{VALUE} ) ? + $XmlNodeTree{$NodeKey}{VALUE} : $NoValue; + } + } elsif ( $ShowWarnings ) { + ReportWarning("Access attempted to a non-existent element '$NodeKey'"); + } + + # Perform substitution of ampersand fields + if ( $Value =~ /&(quot|apos|lt|gt|amp|#x?[A-Fa-f0-9]+);/ ) { + $Value =~ s/"/"/g; + $Value =~ s/'/'/g; + $Value =~ s/</</g; + $Value =~ s/>/>/g; + $Value =~ s/&/&/g; + $Value =~ s/&#([A-Fa-f0-9]{3});/chr( scalar $1 )/ge; # Only UTF-8! + $Value =~ s/&#x([A-Fa-f0-9]{2});/chr( hex( scalar $1 ) )/ge; # Only UTF-8! + } + + return ( $Value ); +} + + +# ------------------------------------------------------------------------------ +# PUBLIC: 'ConfigureXmlParser' - Configure aspects of module behaviour +# ------------------------------------------------------------------------------ +sub ConfigureXmlParser { + + # Passed parameter 1 is the hash array of options + my %XmlParserOptions = @_; + + # Local variable(s) + my @Keys = keys( %XmlParserOptions ); + my $Item = ''; + my $Result = 0; + + # Extract values and execute requested actions + foreach $Item ( @Keys ) { + if ($Item eq 'debug_mode' and $XmlParserOptions{$Item} ) { + $DebugMode = 1; + } elsif ( $Item eq 'recursion_limit' and $XmlParserOptions{$Item} > 0 ) { + $RecursionLimit = $XmlParserOptions{$Item}; + } elsif ( $Item eq 'reset' and $XmlParserOptions{$Item} ) { + %XmlNodeTree = ( ROOT => { ITEMS => {ELEMENTS => [], ATTRIBUTES => []} } ); + %XmlNodeTotals = ( TOTAL => 0, ELEMENTS => 0, ATTRIBUTES => 0 ); + @PathStack = ( 'ROOT' ); + $PathLevel = 0; + $RelativePath = ''; + } elsif ( $Item eq 'show_ids' ) { + $ShowIds = ( $XmlParserOptions{$Item} ) ? 1 : 0; + } elsif ( $Item eq 'show_warnings' ) { + $ShowWarnings = ( ! $XmlParserOptions{$Item} ) ? 0 : 1; + } elsif ( $Item eq 'verbose' ) { + $Verbose = ( $XmlParserOptions{$Item} ) ? 1 : 0; + } else { + $Result = 1; # Flag a return code error + } + } + return ( $Result ); +} + + +# ------------------------------------------------------------------------------ +# ReportError - Reports an error message on STDOUT and forces exit(1) +# ------------------------------------------------------------------------------ +sub ReportError { + + # Passed parameter 1 is the error message + my $ErrorMessage = shift; + + print "ERROR (xmlparser): $ErrorMessage - aborting!\n\n"; + exit 1; +} + + +# ------------------------------------------------------------------------------ +# ReportWarning - Reports a warning message on STDOUT +# ------------------------------------------------------------------------------ +sub ReportWarning { + + # Passed parameter 1 is the warning message + my $WarningMessage = shift; + + print "WARNING (xmlparser): $WarningMessage!\n\n"; + $Warnings++; +} + +1; + +__END__ + + +# ------------------------------------------------------------------------------ +# POD section (formatting is sensitive to blankline whitespace!) +# ------------------------------------------------------------------------------ + +=pod + +=head1 NAME + +xmlparser - Standalone XML parser with hash array output + +=head1 SYNOPSIS + +Example usage: + + # Reference the module + use xmlparser; + + # Configure parser options, parse the file and list its structure + ConfigureXmlParser( verbose => 0, reset => 1 ); + RunXmlParser('my.xml'); + ListXmlHash('ROOT'); + + # Access specific groups of elements + my @MyElements = GetXmlNodeList('/myxml/mynames'); + my $Element = ''; + my $Attribute = ''; + + foreach $Element ( @MyElements ) { + ChangeRelativePath('/myxml/mynames/'); + printf "Element '%s'='%s'\n", GetXmlName($Element), GetXmlValue($Element); + + foreach $Attribute ( GetXmlNodeList("\@$Element") ) { + ChangeRelativePath("/myxml/mynames/$Element/"); + printf "Attribute '$Attribute'='%s'\n", GetXmlValue("\@$Attribute"); + } + } + +=head1 DESCRIPTION + +In the absence of complete documentation, this section contains the +best source of information. + +=head2 DOCUMENTATION + +Documentation about this module does not yet exist for developers +within ARM Limited, but this section will provide essential clues +to the usage. + +=head2 PRINCIPLES + +This multi-line parser will extract elements and value text separated +by <tagged_delimeters>. XML directives and declarations are treated as +exceptions and these values will not be added to the hash array. + +The parsing algorithm alternates between these two states: + +=over 3 + +=item 1. + + Accumulate value fields until detection of '<' character and + then change to the 'in-container' state. + +=item 2. + + Accumulate element fields until detection of '>' character and + then change to the 'in-value' state if an end of element is detected. + +=back + +Upon successfully identifying the closing brace of an element field, +a new item is added to the child element list at the current level of +hierarchy. A new hash key, bearing the element name, is added and +the new hierarchical path is pushed onto the stack. For hierarchical +reference, the current path and parent path are updated. Attributes +are extracted and placed into a separate key-value node, using the +same principles. The parser changes state to accumulate text fields. +Upon closure of the element container, i.e. the next opening brace, +the accumulated text is assigned as the value of the current element. +Also upon this event, the path stack is popped and hierarchical paths +are re-evaluated. Every extracted field is checked for legal composition. +Elements and attributes are checked for wellformedness. + +The following example will show the relationship: + +B<XML source:> + + <cfgfile> + <my_element animal="dog"/> + <my_element> + cat + </my_element> + </cfgfile> + +B<Storage structure:> + + my %XmlNodeTree = ( + ROOT => { + ITEMS => { + ELEMENTS => [ cfgfile[1] ], + ATTRIBUTES => [] + } + } + ROOT}{cfgfile[1] => { + ITEMS => { + ELEMENTS => [ my_element[1], my_element[2] ], + ATTRIBUTES => [] + } + } + ROOT}{cfgfile[1]}{my_element[1] => { + ITEMS => { + ELEMENTS => [], + ATTRIBUTES => [ animal ] + } + ATTRIBUTES => { + animal => 'dog' + } + } + ROOT}{cfgfile[1]}{my_element[2] => { + ITEMS => { + ELEMENTS => [], + ATTRIBUTES => [] + } + VALUE => 'cat' + } + ); + +B<Extracted structure:> + + - ROOT + - cfgfile + - my_element + @value = 'dog' + - my_element = 'cat' + + +Note that data is stored in the hash array using a pseudo hierarchical +method. This makes it very simple to use grep when needing to find +specifically named elements. + +To interrogate the hash array, it is recommended to use the public +access functions GetXmlNodes() and GetXmlValue(). These functions will +translate a basic XPath notation into keys for hash access and perform +substitution of escaped character sequences. + +=head1 FUNCTIONS + +Currently, there are only a few public methods available. This section +describes each one. + +=head2 ConfigureXmlParser(<key-value pairs>) + +Use this procedure to modify the behaviour of the parser, e.g. to reset +the hash array. It accepts the following key-value pairs, also shown in +the above example: + +=over 3 + +=item * + +debug_mode => <integer: 0|1> - show debugging information. + +=item * + +recursion_limit => <integer: 1..n> - for the B<ListXmlHash()> fn. + +=item * + +reset => <integer: 0|1> - resets the hash and stack. + +=item * + +verbose => <integer: 0|1> - modifies verbosity, e.g. quiet mode. + +=item * + +show_ids => <integer: 0|1> - shows actual hash keynames. + +=item * + +show_warnings => <integer: 0|1> - control reports of warnings. + +=back + +Further options may be added over time. + +=head2 RunXmlParser(<xml_filename>) + +Use this procedure to read in the specified XML file. Ensure that +you reset the hash array before attempting to read another file - see +B<ConifigureXmlParser()>. + +=head2 ListXmlHash(<starting_key>) + +Use this procedure to verify the extraction process. All data is +contained under the B<'ROOT'> node, so this is often the only key +that you should specify. + +=head2 ChangeRelativePath(<xpath or key>) + +This function sets the relative path to be prepended to the specified +argument when calling the B<GetXmlNodeList()> and B<GetXmlValue()> +public access functions. Building XPaths and keys is more managable +this way. + +=head2 GetXmlNodeList(<xpath or key>) + +Use this function to obtain the list of child elements or a list of +attributes under the specified hierarchical level. By specifying the +'@' character in the XPath or at the end of the key, you can request +attributes instead of elements. Access to a non-existent xpath or key +will return a zero-item list. + +=head2 GetXmlValue(<xpath or key>) + +Use this function to obtain the value of the element or attribute +under the specified hierarchical level. By specifying the '@' character +at the start of the attribute name (i.e. the rightmost item in the +XPath or key), you can request attributes instead of elements. Access +to a non-existent xpath or key will return a zero-length string. Access +to elements or attributes without value will return a zero-length string. + +The following 'escaped' characters will be substituted to their +true ASCII character: + +=over 3 + +=item * + +" -> " + +=item * + +' -> ' + +=item * + +< -> < + +=item * + +> -> > + +=item * + +& -> & + +=item * + +&#x<2_hex_chars>; -> equivalent hexadecimal character + +=item * + +&#<3_dec_chars>; -> equivalent decimal character + +=back + +=head2 GetXmlName(<item string>) + +Removes the uniquifying index from the hash key item and returns the +originally named item. + +=head2 Direct hash access + +Knowing the format of key structure will allow you to perform access +to the hash array directly. You always need to know something about the +information structure in order to specify an XPath or key. This is +true even when letting XSLT do the work! + +With reference to the example shown above, to access the 2nd element, +you would need to recreate this key: + + # Direct access of an element + my $Value = $XmlNodeTree{'ROOT}{cfgfile[1]}{my_element[2]'}{VALUE}; + + # Direct access of an attribute + my $Attribute = $XmlNodeTree{'ROOT}{cfgfile[1]}{my_element[1]'}{ATTRIBUTES}{animal}; + + +To access the desired positional element without hardcoding the node +keys, you could try resolving this through the appropriate ITEMS array +which records the ordering of all child items at the access level. +Examples of this are shown below: + + # Set-up + use xmlparser; # Load the XML parser module + use xmlparser qw ( %XmlNodeTree ); # Request direct hash access + + # Indirectly access the 2nd 'my_element' element + my $EI = $XmlNodeTree{'ROOT}{cfgfile[1]'}{ITEMS}{ELEMENTS}[1]; + my $Value = $XmlNodeTree{"ROOT}{cfgfile[1]}{$EI"}{VALUE}; + + # Indirectly access the 1st attribute of the 1st element + my $EI = $XmlNodeTree{'ROOT}{cfgfile[1]'}{ITEMS}{ELEMENTS}[0]; + my $AI = $XmlNodeTree{"ROOT}{cfgfile[1]}{$EI"}{ITEMS}{ATTRIBUTES}[0]; + my $Value = $XmlNodeTree{"ROOT}{cfgfile[1]}{$EI"}{ATTRIBUTES}{$AI}; + +As will be appreciated, this is quite complicated! Therefore it is +better to use the public access functions for ease of use. Your choice. + +=head1 SUPPORT + +The following support issues are noted under this section. + +=head2 Regarding XML + +This is a lightweight parser, compliant to only a subset of the +XML 1.0 standard. Namespaces are supported at a basic level, that +is, the ':' character is permitted in element names. The following +support issues are defined below: + +=over 3 + +=item 1. + +The ENTITY declaration is not fully implemented and there is no +preprocessor for expanding macros instantiated by the '&MyFile;' +notation. + +=item 2. + +The DOCTYPE declaration is not fully implemented and there is no +support for DTD or XML-Schema. Checks can be performed efficiently +by writing a customised checking procedure within the PERL domain. + +=item 4. + +Only the '<?xml ?>' processing instruction is supported as far as +basic validation. + +=item 5. + +Only character sets 'iso-8859-1' and 'UTF-8' are accepted in the +header check. + +=item 6. + +Elements embedded in the <emphasis>middle</emphasis> of value fields, +like the 'emphasis' tag you have just read, are not supported. It will +truncate the text value and prepend the remainder to the value of the +next element. + +=back + +=head2 Regarding XPath and XPointer + +The XPath facility of the public access functions is only a basic +provision. It only translates very simple XPaths into access-key +notation, and it does not support any of the XPath functions. The +XPointer notation allows indexed dereferencing of specific elements. +This is sufficient to get the values of elements and attributes. +Some examples of XPath and XPointer interpretations are shown below: + + '/myxml' = 'ROOT}{myxml[1]' # Absolute + '/myxml[1]' = 'ROOT}{myxml[1]' + + 'myxml' = 'myxml[1]' # Relative + 'myxml[2] = 'myxml[2]' + + '//myxml' = [ 'ROOT}{myxml[1]' 'ROOT}{myxml[2]' ... ] # Search + +Generally speaking, the relationship is to convert '/' characters into +'}{' brace-pairs, and to assume the first item when resolving non-indexed +references. + +=head1 STATUS + +This version (1.00) is the current initial version, dated 11th January 2007. + +=head1 SEE ALSO + +This is a customised standalone module. There are no references to other +modules from the developers community. Information for developers may be +obtained through internal ARM documentation. + +=head1 COPYRIGHT + +Copyright 2006 ARM Limited. All rights reserved <support@arm.com> + +This library is free software; you can redistribute it and/or modify it +under the same terms as Perl itself. However, because this file is supplied +to support licenced IP from ARM Limited, please carefully check the terms +and conditions defined in your legal agreement with ARM Limited. + +=cut diff --git a/Cortex-M0/nanosoc/systems/mcu/verilog/gen_ahb_busmatrix/gen_soclabs_4x7_AhbMatrix.scr b/Cortex-M0/nanosoc/systems/mcu/verilog/gen_ahb_busmatrix/gen_soclabs_4x7_AhbMatrix.scr new file mode 100644 index 0000000..3be03d7 --- /dev/null +++ b/Cortex-M0/nanosoc/systems/mcu/verilog/gen_ahb_busmatrix/gen_soclabs_4x7_AhbMatrix.scr @@ -0,0 +1,2 @@ +bin/BuildBusMatrix.pl -xmldir xml -cfg soclabs_ahb32_4x7.xml -ipxact -ipxactsrcdir=ipxact/src -ipxacttgtdir=ipxact/built -over -verbose >& soclabs_ahb32_4x7.log + diff --git a/Cortex-M0/nanosoc/systems/mcu/verilog/gen_ahb_busmatrix/ipxact/built/soclabs_4x7_AhbMatrix/soclabs_4x7_AhbMatrix.xml b/Cortex-M0/nanosoc/systems/mcu/verilog/gen_ahb_busmatrix/ipxact/built/soclabs_4x7_AhbMatrix/soclabs_4x7_AhbMatrix.xml new file mode 100644 index 0000000..ccf604e --- /dev/null +++ b/Cortex-M0/nanosoc/systems/mcu/verilog/gen_ahb_busmatrix/ipxact/built/soclabs_4x7_AhbMatrix/soclabs_4x7_AhbMatrix.xml @@ -0,0 +1,4257 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - --> +<!-- The confidential and proprietary information contained in this file may --> +<!-- only be used by a person authorised under and to the extent permitted --> +<!-- by a subsisting licensing agreement from ARM Limited or its affiliates. --> +<!-- --> +<!-- (C) COPYRIGHT 2001-2017 ARM Limited or its affiliates. --> +<!-- ALL RIGHTS RESERVED --> +<!-- --> +<!-- This entire notice must be reproduced on all copies of this file --> +<!-- and copies of this file may only be made by a person if such person is --> +<!-- permitted to do so under the terms of a subsisting license agreement --> +<!-- from ARM Limited or its affiliates. --> +<!-- --> +<!-- SVN Information --> +<!-- --> +<!-- Checked In : $Date: 2017-10-10 15:55:38 +0100 (Tue, 10 Oct 2017) $ --> +<!-- --> +<!-- Revision : $Revision: 371321 $ --> +<!-- --> +<!-- Release Information : Cortex-M System Design Kit-r1p1-00rel0 --> +<!-- --> +<!-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - --> +<!-- Purpose : IP-XACT description for the main top of soclabs_4x7_AhbMatrix --> +<!-- --> +<!-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - --> + +<spirit:component xmlns:spirit="http://www.spiritconsortium.org/XMLSchema/SPIRIT/1685-2009" + xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:schemaLocation="http://www.spiritconsortium.org/XMLSchema/SPIRIT/1685-2009 http://www.spiritconsortium.org/XMLSchema/SPIRIT/1685-2009/index.xsd"> + <spirit:vendor>arm.com</spirit:vendor> + <spirit:library>CoreLink</spirit:library> + <spirit:name>soclabs_4x7_AhbMatrix</spirit:name> + <spirit:version>r0p0_0</spirit:version> + + <spirit:busInterfaces> + + <!--Slave interfaces --> + + <spirit:busInterface> + <spirit:name>AHBLiteTarget_Slave__adp</spirit:name> + <spirit:description>Slave port _adp</spirit:description> + <spirit:busType spirit:library="AMBA3" spirit:name="AHBLiteTarget" spirit:vendor="amba.com" spirit:version="r2p0_0"/> + <spirit:abstractionType spirit:library="AMBA3" spirit:name="AHBLiteTarget_rtl" spirit:vendor="amba.com" spirit:version="r2p0_0"/> + <spirit:slave> + <spirit:memoryMapRef spirit:memoryMapRef="AHBLiteTarget_Slave__adp_MM"/> + <spirit:bridge spirit:masterRef="AHBLiteTarget_Master__rom1" spirit:opaque="true"/> + <spirit:bridge spirit:masterRef="AHBLiteTarget_Master__ram2" spirit:opaque="true"/> + <spirit:bridge spirit:masterRef="AHBLiteTarget_Master__ram3" spirit:opaque="true"/> + <spirit:bridge spirit:masterRef="AHBLiteTarget_Master__sys" spirit:opaque="true"/> + <spirit:bridge spirit:masterRef="AHBLiteTarget_Master__ram8" spirit:opaque="true"/> + <spirit:bridge spirit:masterRef="AHBLiteTarget_Master__ram9" spirit:opaque="true"/> + <spirit:bridge spirit:masterRef="AHBLiteTarget_Master__exp" spirit:opaque="true"/> + </spirit:slave> + + <spirit:portMaps> + <!-- Clock/reset --> + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>HCLK</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>HCLK</spirit:name> + </spirit:physicalPort> + </spirit:portMap> + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>HRESETn</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>HRESETn</spirit:name> + </spirit:physicalPort> + </spirit:portMap> + <!-- Inputs --> + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>HSELx</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>HSEL_adp</spirit:name> + </spirit:physicalPort> + </spirit:portMap> + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>HADDR</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>HADDR_adp</spirit:name> + </spirit:physicalPort> + </spirit:portMap> + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>HTRANS</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>HTRANS_adp</spirit:name> + </spirit:physicalPort> + </spirit:portMap> + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>HWRITE</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>HWRITE_adp</spirit:name> + </spirit:physicalPort> + </spirit:portMap> + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>HSIZE</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>HSIZE_adp</spirit:name> + </spirit:physicalPort> + </spirit:portMap> + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>HBURST</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>HBURST_adp</spirit:name> + </spirit:physicalPort> + </spirit:portMap> + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>HPROT</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>HPROT_adp</spirit:name> + </spirit:physicalPort> + </spirit:portMap> + + <!-- HMASTER_adp unmapped --> + + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>HWDATA</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>HWDATA_adp</spirit:name> + </spirit:physicalPort> + </spirit:portMap> + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>HMASTLOCK</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>HMASTLOCK_adp</spirit:name> + </spirit:physicalPort> + </spirit:portMap> + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>HREADY</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>HREADY_adp</spirit:name> + </spirit:physicalPort> + </spirit:portMap> + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>HAUSER</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>HAUSER_adp</spirit:name> + </spirit:physicalPort> + </spirit:portMap> + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>HWUSER</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>HWUSER_adp</spirit:name> + </spirit:physicalPort> + </spirit:portMap> + + <!-- Outputs --> + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>HRDATA</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>HRDATA_adp</spirit:name> + </spirit:physicalPort> + </spirit:portMap> + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>HREADYOUT</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>HREADYOUT_adp</spirit:name> + </spirit:physicalPort> + </spirit:portMap> + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>HRESP</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>HRESP_adp</spirit:name> + <spirit:vector> + <spirit:left>0</spirit:left> + <spirit:right>0</spirit:right> + </spirit:vector> + </spirit:physicalPort> + </spirit:portMap> + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>HRUSER</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>HRUSER_adp</spirit:name> + </spirit:physicalPort> + </spirit:portMap> + </spirit:portMaps> + </spirit:busInterface> + + <spirit:busInterface> + <spirit:name>AHBLiteTarget_Slave__dma</spirit:name> + <spirit:description>Slave port _dma</spirit:description> + <spirit:busType spirit:library="AMBA3" spirit:name="AHBLiteTarget" spirit:vendor="amba.com" spirit:version="r2p0_0"/> + <spirit:abstractionType spirit:library="AMBA3" spirit:name="AHBLiteTarget_rtl" spirit:vendor="amba.com" spirit:version="r2p0_0"/> + <spirit:slave> + <spirit:memoryMapRef spirit:memoryMapRef="AHBLiteTarget_Slave__dma_MM"/> + <spirit:bridge spirit:masterRef="AHBLiteTarget_Master__rom1" spirit:opaque="true"/> + <spirit:bridge spirit:masterRef="AHBLiteTarget_Master__ram2" spirit:opaque="true"/> + <spirit:bridge spirit:masterRef="AHBLiteTarget_Master__ram3" spirit:opaque="true"/> + <spirit:bridge spirit:masterRef="AHBLiteTarget_Master__sys" spirit:opaque="true"/> + <spirit:bridge spirit:masterRef="AHBLiteTarget_Master__ram8" spirit:opaque="true"/> + <spirit:bridge spirit:masterRef="AHBLiteTarget_Master__ram9" spirit:opaque="true"/> + <spirit:bridge spirit:masterRef="AHBLiteTarget_Master__exp" spirit:opaque="true"/> + </spirit:slave> + + <spirit:portMaps> + <!-- Clock/reset --> + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>HCLK</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>HCLK</spirit:name> + </spirit:physicalPort> + </spirit:portMap> + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>HRESETn</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>HRESETn</spirit:name> + </spirit:physicalPort> + </spirit:portMap> + <!-- Inputs --> + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>HSELx</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>HSEL_dma</spirit:name> + </spirit:physicalPort> + </spirit:portMap> + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>HADDR</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>HADDR_dma</spirit:name> + </spirit:physicalPort> + </spirit:portMap> + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>HTRANS</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>HTRANS_dma</spirit:name> + </spirit:physicalPort> + </spirit:portMap> + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>HWRITE</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>HWRITE_dma</spirit:name> + </spirit:physicalPort> + </spirit:portMap> + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>HSIZE</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>HSIZE_dma</spirit:name> + </spirit:physicalPort> + </spirit:portMap> + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>HBURST</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>HBURST_dma</spirit:name> + </spirit:physicalPort> + </spirit:portMap> + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>HPROT</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>HPROT_dma</spirit:name> + </spirit:physicalPort> + </spirit:portMap> + + <!-- HMASTER_dma unmapped --> + + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>HWDATA</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>HWDATA_dma</spirit:name> + </spirit:physicalPort> + </spirit:portMap> + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>HMASTLOCK</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>HMASTLOCK_dma</spirit:name> + </spirit:physicalPort> + </spirit:portMap> + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>HREADY</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>HREADY_dma</spirit:name> + </spirit:physicalPort> + </spirit:portMap> + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>HAUSER</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>HAUSER_dma</spirit:name> + </spirit:physicalPort> + </spirit:portMap> + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>HWUSER</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>HWUSER_dma</spirit:name> + </spirit:physicalPort> + </spirit:portMap> + + <!-- Outputs --> + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>HRDATA</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>HRDATA_dma</spirit:name> + </spirit:physicalPort> + </spirit:portMap> + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>HREADYOUT</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>HREADYOUT_dma</spirit:name> + </spirit:physicalPort> + </spirit:portMap> + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>HRESP</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>HRESP_dma</spirit:name> + <spirit:vector> + <spirit:left>0</spirit:left> + <spirit:right>0</spirit:right> + </spirit:vector> + </spirit:physicalPort> + </spirit:portMap> + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>HRUSER</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>HRUSER_dma</spirit:name> + </spirit:physicalPort> + </spirit:portMap> + </spirit:portMaps> + </spirit:busInterface> + + <spirit:busInterface> + <spirit:name>AHBLiteTarget_Slave__dma2</spirit:name> + <spirit:description>Slave port _dma2</spirit:description> + <spirit:busType spirit:library="AMBA3" spirit:name="AHBLiteTarget" spirit:vendor="amba.com" spirit:version="r2p0_0"/> + <spirit:abstractionType spirit:library="AMBA3" spirit:name="AHBLiteTarget_rtl" spirit:vendor="amba.com" spirit:version="r2p0_0"/> + <spirit:slave> + <spirit:memoryMapRef spirit:memoryMapRef="AHBLiteTarget_Slave__dma2_MM"/> + <spirit:bridge spirit:masterRef="AHBLiteTarget_Master__rom1" spirit:opaque="true"/> + <spirit:bridge spirit:masterRef="AHBLiteTarget_Master__ram2" spirit:opaque="true"/> + <spirit:bridge spirit:masterRef="AHBLiteTarget_Master__ram3" spirit:opaque="true"/> + <spirit:bridge spirit:masterRef="AHBLiteTarget_Master__sys" spirit:opaque="true"/> + <spirit:bridge spirit:masterRef="AHBLiteTarget_Master__ram8" spirit:opaque="true"/> + <spirit:bridge spirit:masterRef="AHBLiteTarget_Master__ram9" spirit:opaque="true"/> + <spirit:bridge spirit:masterRef="AHBLiteTarget_Master__exp" spirit:opaque="true"/> + </spirit:slave> + + <spirit:portMaps> + <!-- Clock/reset --> + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>HCLK</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>HCLK</spirit:name> + </spirit:physicalPort> + </spirit:portMap> + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>HRESETn</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>HRESETn</spirit:name> + </spirit:physicalPort> + </spirit:portMap> + <!-- Inputs --> + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>HSELx</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>HSEL_dma2</spirit:name> + </spirit:physicalPort> + </spirit:portMap> + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>HADDR</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>HADDR_dma2</spirit:name> + </spirit:physicalPort> + </spirit:portMap> + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>HTRANS</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>HTRANS_dma2</spirit:name> + </spirit:physicalPort> + </spirit:portMap> + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>HWRITE</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>HWRITE_dma2</spirit:name> + </spirit:physicalPort> + </spirit:portMap> + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>HSIZE</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>HSIZE_dma2</spirit:name> + </spirit:physicalPort> + </spirit:portMap> + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>HBURST</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>HBURST_dma2</spirit:name> + </spirit:physicalPort> + </spirit:portMap> + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>HPROT</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>HPROT_dma2</spirit:name> + </spirit:physicalPort> + </spirit:portMap> + + <!-- HMASTER_dma2 unmapped --> + + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>HWDATA</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>HWDATA_dma2</spirit:name> + </spirit:physicalPort> + </spirit:portMap> + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>HMASTLOCK</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>HMASTLOCK_dma2</spirit:name> + </spirit:physicalPort> + </spirit:portMap> + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>HREADY</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>HREADY_dma2</spirit:name> + </spirit:physicalPort> + </spirit:portMap> + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>HAUSER</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>HAUSER_dma2</spirit:name> + </spirit:physicalPort> + </spirit:portMap> + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>HWUSER</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>HWUSER_dma2</spirit:name> + </spirit:physicalPort> + </spirit:portMap> + + <!-- Outputs --> + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>HRDATA</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>HRDATA_dma2</spirit:name> + </spirit:physicalPort> + </spirit:portMap> + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>HREADYOUT</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>HREADYOUT_dma2</spirit:name> + </spirit:physicalPort> + </spirit:portMap> + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>HRESP</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>HRESP_dma2</spirit:name> + <spirit:vector> + <spirit:left>0</spirit:left> + <spirit:right>0</spirit:right> + </spirit:vector> + </spirit:physicalPort> + </spirit:portMap> + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>HRUSER</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>HRUSER_dma2</spirit:name> + </spirit:physicalPort> + </spirit:portMap> + </spirit:portMaps> + </spirit:busInterface> + + <spirit:busInterface> + <spirit:name>AHBLiteTarget_Slave__cpu</spirit:name> + <spirit:description>Slave port _cpu</spirit:description> + <spirit:busType spirit:library="AMBA3" spirit:name="AHBLiteTarget" spirit:vendor="amba.com" spirit:version="r2p0_0"/> + <spirit:abstractionType spirit:library="AMBA3" spirit:name="AHBLiteTarget_rtl" spirit:vendor="amba.com" spirit:version="r2p0_0"/> + <spirit:slave> + <spirit:memoryMapRef spirit:memoryMapRef="AHBLiteTarget_Slave__cpu_MM"/> + <spirit:bridge spirit:masterRef="AHBLiteTarget_Master__rom1" spirit:opaque="true"/> + <spirit:bridge spirit:masterRef="AHBLiteTarget_Master__ram2" spirit:opaque="true"/> + <spirit:bridge spirit:masterRef="AHBLiteTarget_Master__ram3" spirit:opaque="true"/> + <spirit:bridge spirit:masterRef="AHBLiteTarget_Master__sys" spirit:opaque="true"/> + <spirit:bridge spirit:masterRef="AHBLiteTarget_Master__ram8" spirit:opaque="true"/> + <spirit:bridge spirit:masterRef="AHBLiteTarget_Master__ram9" spirit:opaque="true"/> + <spirit:bridge spirit:masterRef="AHBLiteTarget_Master__exp" spirit:opaque="true"/> + </spirit:slave> + + <spirit:portMaps> + <!-- Clock/reset --> + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>HCLK</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>HCLK</spirit:name> + </spirit:physicalPort> + </spirit:portMap> + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>HRESETn</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>HRESETn</spirit:name> + </spirit:physicalPort> + </spirit:portMap> + <!-- Inputs --> + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>HSELx</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>HSEL_cpu</spirit:name> + </spirit:physicalPort> + </spirit:portMap> + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>HADDR</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>HADDR_cpu</spirit:name> + </spirit:physicalPort> + </spirit:portMap> + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>HTRANS</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>HTRANS_cpu</spirit:name> + </spirit:physicalPort> + </spirit:portMap> + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>HWRITE</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>HWRITE_cpu</spirit:name> + </spirit:physicalPort> + </spirit:portMap> + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>HSIZE</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>HSIZE_cpu</spirit:name> + </spirit:physicalPort> + </spirit:portMap> + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>HBURST</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>HBURST_cpu</spirit:name> + </spirit:physicalPort> + </spirit:portMap> + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>HPROT</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>HPROT_cpu</spirit:name> + </spirit:physicalPort> + </spirit:portMap> + + <!-- HMASTER_cpu unmapped --> + + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>HWDATA</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>HWDATA_cpu</spirit:name> + </spirit:physicalPort> + </spirit:portMap> + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>HMASTLOCK</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>HMASTLOCK_cpu</spirit:name> + </spirit:physicalPort> + </spirit:portMap> + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>HREADY</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>HREADY_cpu</spirit:name> + </spirit:physicalPort> + </spirit:portMap> + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>HAUSER</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>HAUSER_cpu</spirit:name> + </spirit:physicalPort> + </spirit:portMap> + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>HWUSER</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>HWUSER_cpu</spirit:name> + </spirit:physicalPort> + </spirit:portMap> + + <!-- Outputs --> + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>HRDATA</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>HRDATA_cpu</spirit:name> + </spirit:physicalPort> + </spirit:portMap> + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>HREADYOUT</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>HREADYOUT_cpu</spirit:name> + </spirit:physicalPort> + </spirit:portMap> + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>HRESP</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>HRESP_cpu</spirit:name> + <spirit:vector> + <spirit:left>0</spirit:left> + <spirit:right>0</spirit:right> + </spirit:vector> + </spirit:physicalPort> + </spirit:portMap> + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>HRUSER</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>HRUSER_cpu</spirit:name> + </spirit:physicalPort> + </spirit:portMap> + </spirit:portMaps> + </spirit:busInterface> + + <!--Master interfaces --> + + <spirit:busInterface> + <spirit:name>AHBLiteTarget_Master__rom1</spirit:name> + <spirit:description>Master port _rom1</spirit:description> + <spirit:busType spirit:library="AMBA3" spirit:name="AHBLiteTarget" spirit:vendor="amba.com" spirit:version="r2p0_0"/> + <spirit:abstractionType spirit:library="AMBA3" spirit:name="AHBLiteTarget_rtl" spirit:vendor="amba.com" spirit:version="r2p0_0"/> + <spirit:master> + <spirit:addressSpaceRef spirit:addressSpaceRef="AHBLiteTarget_Master__rom1_AS"/> + </spirit:master> + + <spirit:portMaps> + <!-- Clock/reset --> + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>HCLK</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>HCLK</spirit:name> + </spirit:physicalPort> + </spirit:portMap> + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>HRESETn</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>HRESETn</spirit:name> + </spirit:physicalPort> + </spirit:portMap> + <!-- Outputs --> + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>HSELx</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>HSEL_rom1</spirit:name> + </spirit:physicalPort> + </spirit:portMap> + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>HADDR</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>HADDR_rom1</spirit:name> + </spirit:physicalPort> + </spirit:portMap> + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>HTRANS</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>HTRANS_rom1</spirit:name> + </spirit:physicalPort> + </spirit:portMap> + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>HWRITE</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>HWRITE_rom1</spirit:name> + </spirit:physicalPort> + </spirit:portMap> + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>HSIZE</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>HSIZE_rom1</spirit:name> + </spirit:physicalPort> + </spirit:portMap> + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>HBURST</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>HBURST_rom1</spirit:name> + </spirit:physicalPort> + </spirit:portMap> + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>HPROT</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>HPROT_rom1</spirit:name> + </spirit:physicalPort> + </spirit:portMap> + + <!-- HMASTER_rom1 unmapped --> + + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>HWDATA</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>HWDATA_rom1</spirit:name> + </spirit:physicalPort> + </spirit:portMap> + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>HMASTLOCK</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>HMASTLOCK_rom1</spirit:name> + </spirit:physicalPort> + </spirit:portMap> + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>HREADY</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>HREADYMUX_rom1</spirit:name> + </spirit:physicalPort> + </spirit:portMap> + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>HAUSER</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>HAUSER_rom1</spirit:name> + </spirit:physicalPort> + </spirit:portMap> + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>HWUSER</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>HWUSER_rom1</spirit:name> + </spirit:physicalPort> + </spirit:portMap> + + <!-- Inputs --> + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>HRDATA</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>HRDATA_rom1</spirit:name> + </spirit:physicalPort> + </spirit:portMap> + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>HREADYOUT</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>HREADYOUT_rom1</spirit:name> + </spirit:physicalPort> + </spirit:portMap> + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>HRESP</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>HRESP_rom1</spirit:name> + <spirit:vector> + <spirit:left>0</spirit:left> + <spirit:right>0</spirit:right> + </spirit:vector> + </spirit:physicalPort> + </spirit:portMap> + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>HRUSER</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>HRUSER_rom1</spirit:name> + </spirit:physicalPort> + </spirit:portMap> + </spirit:portMaps> + </spirit:busInterface> + + <spirit:busInterface> + <spirit:name>AHBLiteTarget_Master__ram2</spirit:name> + <spirit:description>Master port _ram2</spirit:description> + <spirit:busType spirit:library="AMBA3" spirit:name="AHBLiteTarget" spirit:vendor="amba.com" spirit:version="r2p0_0"/> + <spirit:abstractionType spirit:library="AMBA3" spirit:name="AHBLiteTarget_rtl" spirit:vendor="amba.com" spirit:version="r2p0_0"/> + <spirit:master> + <spirit:addressSpaceRef spirit:addressSpaceRef="AHBLiteTarget_Master__ram2_AS"/> + </spirit:master> + + <spirit:portMaps> + <!-- Clock/reset --> + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>HCLK</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>HCLK</spirit:name> + </spirit:physicalPort> + </spirit:portMap> + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>HRESETn</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>HRESETn</spirit:name> + </spirit:physicalPort> + </spirit:portMap> + <!-- Outputs --> + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>HSELx</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>HSEL_ram2</spirit:name> + </spirit:physicalPort> + </spirit:portMap> + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>HADDR</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>HADDR_ram2</spirit:name> + </spirit:physicalPort> + </spirit:portMap> + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>HTRANS</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>HTRANS_ram2</spirit:name> + </spirit:physicalPort> + </spirit:portMap> + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>HWRITE</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>HWRITE_ram2</spirit:name> + </spirit:physicalPort> + </spirit:portMap> + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>HSIZE</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>HSIZE_ram2</spirit:name> + </spirit:physicalPort> + </spirit:portMap> + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>HBURST</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>HBURST_ram2</spirit:name> + </spirit:physicalPort> + </spirit:portMap> + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>HPROT</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>HPROT_ram2</spirit:name> + </spirit:physicalPort> + </spirit:portMap> + + <!-- HMASTER_ram2 unmapped --> + + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>HWDATA</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>HWDATA_ram2</spirit:name> + </spirit:physicalPort> + </spirit:portMap> + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>HMASTLOCK</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>HMASTLOCK_ram2</spirit:name> + </spirit:physicalPort> + </spirit:portMap> + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>HREADY</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>HREADYMUX_ram2</spirit:name> + </spirit:physicalPort> + </spirit:portMap> + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>HAUSER</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>HAUSER_ram2</spirit:name> + </spirit:physicalPort> + </spirit:portMap> + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>HWUSER</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>HWUSER_ram2</spirit:name> + </spirit:physicalPort> + </spirit:portMap> + + <!-- Inputs --> + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>HRDATA</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>HRDATA_ram2</spirit:name> + </spirit:physicalPort> + </spirit:portMap> + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>HREADYOUT</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>HREADYOUT_ram2</spirit:name> + </spirit:physicalPort> + </spirit:portMap> + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>HRESP</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>HRESP_ram2</spirit:name> + <spirit:vector> + <spirit:left>0</spirit:left> + <spirit:right>0</spirit:right> + </spirit:vector> + </spirit:physicalPort> + </spirit:portMap> + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>HRUSER</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>HRUSER_ram2</spirit:name> + </spirit:physicalPort> + </spirit:portMap> + </spirit:portMaps> + </spirit:busInterface> + + <spirit:busInterface> + <spirit:name>AHBLiteTarget_Master__ram3</spirit:name> + <spirit:description>Master port _ram3</spirit:description> + <spirit:busType spirit:library="AMBA3" spirit:name="AHBLiteTarget" spirit:vendor="amba.com" spirit:version="r2p0_0"/> + <spirit:abstractionType spirit:library="AMBA3" spirit:name="AHBLiteTarget_rtl" spirit:vendor="amba.com" spirit:version="r2p0_0"/> + <spirit:master> + <spirit:addressSpaceRef spirit:addressSpaceRef="AHBLiteTarget_Master__ram3_AS"/> + </spirit:master> + + <spirit:portMaps> + <!-- Clock/reset --> + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>HCLK</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>HCLK</spirit:name> + </spirit:physicalPort> + </spirit:portMap> + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>HRESETn</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>HRESETn</spirit:name> + </spirit:physicalPort> + </spirit:portMap> + <!-- Outputs --> + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>HSELx</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>HSEL_ram3</spirit:name> + </spirit:physicalPort> + </spirit:portMap> + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>HADDR</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>HADDR_ram3</spirit:name> + </spirit:physicalPort> + </spirit:portMap> + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>HTRANS</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>HTRANS_ram3</spirit:name> + </spirit:physicalPort> + </spirit:portMap> + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>HWRITE</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>HWRITE_ram3</spirit:name> + </spirit:physicalPort> + </spirit:portMap> + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>HSIZE</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>HSIZE_ram3</spirit:name> + </spirit:physicalPort> + </spirit:portMap> + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>HBURST</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>HBURST_ram3</spirit:name> + </spirit:physicalPort> + </spirit:portMap> + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>HPROT</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>HPROT_ram3</spirit:name> + </spirit:physicalPort> + </spirit:portMap> + + <!-- HMASTER_ram3 unmapped --> + + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>HWDATA</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>HWDATA_ram3</spirit:name> + </spirit:physicalPort> + </spirit:portMap> + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>HMASTLOCK</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>HMASTLOCK_ram3</spirit:name> + </spirit:physicalPort> + </spirit:portMap> + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>HREADY</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>HREADYMUX_ram3</spirit:name> + </spirit:physicalPort> + </spirit:portMap> + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>HAUSER</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>HAUSER_ram3</spirit:name> + </spirit:physicalPort> + </spirit:portMap> + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>HWUSER</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>HWUSER_ram3</spirit:name> + </spirit:physicalPort> + </spirit:portMap> + + <!-- Inputs --> + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>HRDATA</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>HRDATA_ram3</spirit:name> + </spirit:physicalPort> + </spirit:portMap> + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>HREADYOUT</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>HREADYOUT_ram3</spirit:name> + </spirit:physicalPort> + </spirit:portMap> + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>HRESP</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>HRESP_ram3</spirit:name> + <spirit:vector> + <spirit:left>0</spirit:left> + <spirit:right>0</spirit:right> + </spirit:vector> + </spirit:physicalPort> + </spirit:portMap> + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>HRUSER</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>HRUSER_ram3</spirit:name> + </spirit:physicalPort> + </spirit:portMap> + </spirit:portMaps> + </spirit:busInterface> + + <spirit:busInterface> + <spirit:name>AHBLiteTarget_Master__sys</spirit:name> + <spirit:description>Master port _sys</spirit:description> + <spirit:busType spirit:library="AMBA3" spirit:name="AHBLiteTarget" spirit:vendor="amba.com" spirit:version="r2p0_0"/> + <spirit:abstractionType spirit:library="AMBA3" spirit:name="AHBLiteTarget_rtl" spirit:vendor="amba.com" spirit:version="r2p0_0"/> + <spirit:master> + <spirit:addressSpaceRef spirit:addressSpaceRef="AHBLiteTarget_Master__sys_AS"/> + </spirit:master> + + <spirit:portMaps> + <!-- Clock/reset --> + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>HCLK</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>HCLK</spirit:name> + </spirit:physicalPort> + </spirit:portMap> + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>HRESETn</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>HRESETn</spirit:name> + </spirit:physicalPort> + </spirit:portMap> + <!-- Outputs --> + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>HSELx</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>HSEL_sys</spirit:name> + </spirit:physicalPort> + </spirit:portMap> + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>HADDR</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>HADDR_sys</spirit:name> + </spirit:physicalPort> + </spirit:portMap> + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>HTRANS</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>HTRANS_sys</spirit:name> + </spirit:physicalPort> + </spirit:portMap> + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>HWRITE</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>HWRITE_sys</spirit:name> + </spirit:physicalPort> + </spirit:portMap> + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>HSIZE</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>HSIZE_sys</spirit:name> + </spirit:physicalPort> + </spirit:portMap> + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>HBURST</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>HBURST_sys</spirit:name> + </spirit:physicalPort> + </spirit:portMap> + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>HPROT</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>HPROT_sys</spirit:name> + </spirit:physicalPort> + </spirit:portMap> + + <!-- HMASTER_sys unmapped --> + + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>HWDATA</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>HWDATA_sys</spirit:name> + </spirit:physicalPort> + </spirit:portMap> + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>HMASTLOCK</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>HMASTLOCK_sys</spirit:name> + </spirit:physicalPort> + </spirit:portMap> + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>HREADY</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>HREADYMUX_sys</spirit:name> + </spirit:physicalPort> + </spirit:portMap> + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>HAUSER</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>HAUSER_sys</spirit:name> + </spirit:physicalPort> + </spirit:portMap> + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>HWUSER</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>HWUSER_sys</spirit:name> + </spirit:physicalPort> + </spirit:portMap> + + <!-- Inputs --> + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>HRDATA</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>HRDATA_sys</spirit:name> + </spirit:physicalPort> + </spirit:portMap> + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>HREADYOUT</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>HREADYOUT_sys</spirit:name> + </spirit:physicalPort> + </spirit:portMap> + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>HRESP</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>HRESP_sys</spirit:name> + <spirit:vector> + <spirit:left>0</spirit:left> + <spirit:right>0</spirit:right> + </spirit:vector> + </spirit:physicalPort> + </spirit:portMap> + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>HRUSER</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>HRUSER_sys</spirit:name> + </spirit:physicalPort> + </spirit:portMap> + </spirit:portMaps> + </spirit:busInterface> + + <spirit:busInterface> + <spirit:name>AHBLiteTarget_Master__ram8</spirit:name> + <spirit:description>Master port _ram8</spirit:description> + <spirit:busType spirit:library="AMBA3" spirit:name="AHBLiteTarget" spirit:vendor="amba.com" spirit:version="r2p0_0"/> + <spirit:abstractionType spirit:library="AMBA3" spirit:name="AHBLiteTarget_rtl" spirit:vendor="amba.com" spirit:version="r2p0_0"/> + <spirit:master> + <spirit:addressSpaceRef spirit:addressSpaceRef="AHBLiteTarget_Master__ram8_AS"/> + </spirit:master> + + <spirit:portMaps> + <!-- Clock/reset --> + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>HCLK</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>HCLK</spirit:name> + </spirit:physicalPort> + </spirit:portMap> + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>HRESETn</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>HRESETn</spirit:name> + </spirit:physicalPort> + </spirit:portMap> + <!-- Outputs --> + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>HSELx</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>HSEL_ram8</spirit:name> + </spirit:physicalPort> + </spirit:portMap> + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>HADDR</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>HADDR_ram8</spirit:name> + </spirit:physicalPort> + </spirit:portMap> + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>HTRANS</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>HTRANS_ram8</spirit:name> + </spirit:physicalPort> + </spirit:portMap> + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>HWRITE</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>HWRITE_ram8</spirit:name> + </spirit:physicalPort> + </spirit:portMap> + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>HSIZE</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>HSIZE_ram8</spirit:name> + </spirit:physicalPort> + </spirit:portMap> + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>HBURST</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>HBURST_ram8</spirit:name> + </spirit:physicalPort> + </spirit:portMap> + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>HPROT</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>HPROT_ram8</spirit:name> + </spirit:physicalPort> + </spirit:portMap> + + <!-- HMASTER_ram8 unmapped --> + + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>HWDATA</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>HWDATA_ram8</spirit:name> + </spirit:physicalPort> + </spirit:portMap> + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>HMASTLOCK</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>HMASTLOCK_ram8</spirit:name> + </spirit:physicalPort> + </spirit:portMap> + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>HREADY</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>HREADYMUX_ram8</spirit:name> + </spirit:physicalPort> + </spirit:portMap> + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>HAUSER</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>HAUSER_ram8</spirit:name> + </spirit:physicalPort> + </spirit:portMap> + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>HWUSER</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>HWUSER_ram8</spirit:name> + </spirit:physicalPort> + </spirit:portMap> + + <!-- Inputs --> + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>HRDATA</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>HRDATA_ram8</spirit:name> + </spirit:physicalPort> + </spirit:portMap> + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>HREADYOUT</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>HREADYOUT_ram8</spirit:name> + </spirit:physicalPort> + </spirit:portMap> + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>HRESP</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>HRESP_ram8</spirit:name> + <spirit:vector> + <spirit:left>0</spirit:left> + <spirit:right>0</spirit:right> + </spirit:vector> + </spirit:physicalPort> + </spirit:portMap> + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>HRUSER</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>HRUSER_ram8</spirit:name> + </spirit:physicalPort> + </spirit:portMap> + </spirit:portMaps> + </spirit:busInterface> + + <spirit:busInterface> + <spirit:name>AHBLiteTarget_Master__ram9</spirit:name> + <spirit:description>Master port _ram9</spirit:description> + <spirit:busType spirit:library="AMBA3" spirit:name="AHBLiteTarget" spirit:vendor="amba.com" spirit:version="r2p0_0"/> + <spirit:abstractionType spirit:library="AMBA3" spirit:name="AHBLiteTarget_rtl" spirit:vendor="amba.com" spirit:version="r2p0_0"/> + <spirit:master> + <spirit:addressSpaceRef spirit:addressSpaceRef="AHBLiteTarget_Master__ram9_AS"/> + </spirit:master> + + <spirit:portMaps> + <!-- Clock/reset --> + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>HCLK</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>HCLK</spirit:name> + </spirit:physicalPort> + </spirit:portMap> + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>HRESETn</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>HRESETn</spirit:name> + </spirit:physicalPort> + </spirit:portMap> + <!-- Outputs --> + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>HSELx</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>HSEL_ram9</spirit:name> + </spirit:physicalPort> + </spirit:portMap> + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>HADDR</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>HADDR_ram9</spirit:name> + </spirit:physicalPort> + </spirit:portMap> + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>HTRANS</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>HTRANS_ram9</spirit:name> + </spirit:physicalPort> + </spirit:portMap> + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>HWRITE</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>HWRITE_ram9</spirit:name> + </spirit:physicalPort> + </spirit:portMap> + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>HSIZE</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>HSIZE_ram9</spirit:name> + </spirit:physicalPort> + </spirit:portMap> + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>HBURST</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>HBURST_ram9</spirit:name> + </spirit:physicalPort> + </spirit:portMap> + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>HPROT</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>HPROT_ram9</spirit:name> + </spirit:physicalPort> + </spirit:portMap> + + <!-- HMASTER_ram9 unmapped --> + + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>HWDATA</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>HWDATA_ram9</spirit:name> + </spirit:physicalPort> + </spirit:portMap> + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>HMASTLOCK</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>HMASTLOCK_ram9</spirit:name> + </spirit:physicalPort> + </spirit:portMap> + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>HREADY</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>HREADYMUX_ram9</spirit:name> + </spirit:physicalPort> + </spirit:portMap> + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>HAUSER</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>HAUSER_ram9</spirit:name> + </spirit:physicalPort> + </spirit:portMap> + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>HWUSER</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>HWUSER_ram9</spirit:name> + </spirit:physicalPort> + </spirit:portMap> + + <!-- Inputs --> + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>HRDATA</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>HRDATA_ram9</spirit:name> + </spirit:physicalPort> + </spirit:portMap> + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>HREADYOUT</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>HREADYOUT_ram9</spirit:name> + </spirit:physicalPort> + </spirit:portMap> + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>HRESP</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>HRESP_ram9</spirit:name> + <spirit:vector> + <spirit:left>0</spirit:left> + <spirit:right>0</spirit:right> + </spirit:vector> + </spirit:physicalPort> + </spirit:portMap> + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>HRUSER</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>HRUSER_ram9</spirit:name> + </spirit:physicalPort> + </spirit:portMap> + </spirit:portMaps> + </spirit:busInterface> + + <spirit:busInterface> + <spirit:name>AHBLiteTarget_Master__exp</spirit:name> + <spirit:description>Master port _exp</spirit:description> + <spirit:busType spirit:library="AMBA3" spirit:name="AHBLiteTarget" spirit:vendor="amba.com" spirit:version="r2p0_0"/> + <spirit:abstractionType spirit:library="AMBA3" spirit:name="AHBLiteTarget_rtl" spirit:vendor="amba.com" spirit:version="r2p0_0"/> + <spirit:master> + <spirit:addressSpaceRef spirit:addressSpaceRef="AHBLiteTarget_Master__exp_AS"/> + </spirit:master> + + <spirit:portMaps> + <!-- Clock/reset --> + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>HCLK</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>HCLK</spirit:name> + </spirit:physicalPort> + </spirit:portMap> + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>HRESETn</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>HRESETn</spirit:name> + </spirit:physicalPort> + </spirit:portMap> + <!-- Outputs --> + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>HSELx</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>HSEL_exp</spirit:name> + </spirit:physicalPort> + </spirit:portMap> + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>HADDR</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>HADDR_exp</spirit:name> + </spirit:physicalPort> + </spirit:portMap> + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>HTRANS</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>HTRANS_exp</spirit:name> + </spirit:physicalPort> + </spirit:portMap> + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>HWRITE</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>HWRITE_exp</spirit:name> + </spirit:physicalPort> + </spirit:portMap> + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>HSIZE</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>HSIZE_exp</spirit:name> + </spirit:physicalPort> + </spirit:portMap> + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>HBURST</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>HBURST_exp</spirit:name> + </spirit:physicalPort> + </spirit:portMap> + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>HPROT</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>HPROT_exp</spirit:name> + </spirit:physicalPort> + </spirit:portMap> + + <!-- HMASTER_exp unmapped --> + + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>HWDATA</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>HWDATA_exp</spirit:name> + </spirit:physicalPort> + </spirit:portMap> + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>HMASTLOCK</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>HMASTLOCK_exp</spirit:name> + </spirit:physicalPort> + </spirit:portMap> + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>HREADY</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>HREADYMUX_exp</spirit:name> + </spirit:physicalPort> + </spirit:portMap> + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>HAUSER</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>HAUSER_exp</spirit:name> + </spirit:physicalPort> + </spirit:portMap> + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>HWUSER</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>HWUSER_exp</spirit:name> + </spirit:physicalPort> + </spirit:portMap> + + <!-- Inputs --> + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>HRDATA</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>HRDATA_exp</spirit:name> + </spirit:physicalPort> + </spirit:portMap> + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>HREADYOUT</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>HREADYOUT_exp</spirit:name> + </spirit:physicalPort> + </spirit:portMap> + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>HRESP</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>HRESP_exp</spirit:name> + <spirit:vector> + <spirit:left>0</spirit:left> + <spirit:right>0</spirit:right> + </spirit:vector> + </spirit:physicalPort> + </spirit:portMap> + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>HRUSER</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>HRUSER_exp</spirit:name> + </spirit:physicalPort> + </spirit:portMap> + </spirit:portMaps> + </spirit:busInterface> + + <!--Scan test dummy signals --> + <spirit:busInterface> + <spirit:name>DFTInterface_Slave</spirit:name> + <spirit:description>Scan test dummy signals, not connected until scan insertion</spirit:description> + <spirit:busType spirit:library="generic" spirit:name="DFTInterface" spirit:vendor="arm.com" spirit:version="r0p0_1"/> + <spirit:abstractionType spirit:library="generic" spirit:name="DFTInterface_rtl" spirit:vendor="arm.com" spirit:version="r0p0_1"/> + <spirit:slave/> + <spirit:portMaps> + + <!-- Clock/reset --> + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>CLK</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>HCLK</spirit:name> + </spirit:physicalPort> + </spirit:portMap> + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>RESETn</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>HRESETn</spirit:name> + </spirit:physicalPort> + </spirit:portMap> + + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>DFTSCANMODE</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>SCANENABLE</spirit:name> + </spirit:physicalPort> + </spirit:portMap> + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>DFTSI</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>SCANINHCLK</spirit:name> + </spirit:physicalPort> + </spirit:portMap> + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>DFTSO</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>SCANOUTHCLK</spirit:name> + </spirit:physicalPort> + </spirit:portMap> + </spirit:portMaps> + </spirit:busInterface> + + </spirit:busInterfaces> + + <spirit:remapStates> + + <spirit:remapState> + <spirit:name>remap_0</spirit:name> + <spirit:description>Remap state remap_0</spirit:description> + <spirit:remapPorts> + <spirit:remapPort spirit:portNameRef="REMAP" spirit:portIndex="0">1</spirit:remapPort> + </spirit:remapPorts> + </spirit:remapState> + <spirit:remapState> + <spirit:name>remap_n0</spirit:name> + <spirit:description>Remap state remap_n0</spirit:description> + <spirit:remapPorts> + <spirit:remapPort spirit:portNameRef="REMAP" spirit:portIndex="0">0</spirit:remapPort> + </spirit:remapPorts> + </spirit:remapState> + + </spirit:remapStates> + + <spirit:addressSpaces> + + <spirit:addressSpace> + <spirit:name>AHBLiteTarget_Master__rom1_AS</spirit:name> + <spirit:description>_rom1 address space</spirit:description> + <spirit:range>4G</spirit:range> + <spirit:width>32</spirit:width> + <spirit:segments> + <spirit:segment> + <spirit:name>_rom1_0x00000000_0x0fffffff</spirit:name> + <spirit:addressOffset>0x00000000</spirit:addressOffset> + <spirit:range>0x010000000</spirit:range> + </spirit:segment> + <spirit:segment> + <spirit:name>_rom1_0x10000000_0x1fffffff</spirit:name> + <spirit:addressOffset>0x10000000</spirit:addressOffset> + <spirit:range>0x010000000</spirit:range> + </spirit:segment> + </spirit:segments> + <spirit:addressUnitBits>8</spirit:addressUnitBits> + </spirit:addressSpace> + + <spirit:addressSpace> + <spirit:name>AHBLiteTarget_Master__ram2_AS</spirit:name> + <spirit:description>_ram2 address space</spirit:description> + <spirit:range>4G</spirit:range> + <spirit:width>32</spirit:width> + <spirit:segments> + <spirit:segment> + <spirit:name>_ram2_0x00000000_0x0fffffff</spirit:name> + <spirit:addressOffset>0x00000000</spirit:addressOffset> + <spirit:range>0x010000000</spirit:range> + </spirit:segment> + <spirit:segment> + <spirit:name>_ram2_0x20000000_0x2fffffff</spirit:name> + <spirit:addressOffset>0x20000000</spirit:addressOffset> + <spirit:range>0x010000000</spirit:range> + </spirit:segment> + </spirit:segments> + <spirit:addressUnitBits>8</spirit:addressUnitBits> + </spirit:addressSpace> + + <spirit:addressSpace> + <spirit:name>AHBLiteTarget_Master__ram3_AS</spirit:name> + <spirit:description>_ram3 address space</spirit:description> + <spirit:range>4G</spirit:range> + <spirit:width>32</spirit:width> + <spirit:segments> + <spirit:segment> + <spirit:name>_ram3_0x30000000_0x3fffffff</spirit:name> + <spirit:addressOffset>0x30000000</spirit:addressOffset> + <spirit:range>0x010000000</spirit:range> + </spirit:segment> + </spirit:segments> + <spirit:addressUnitBits>8</spirit:addressUnitBits> + </spirit:addressSpace> + + <spirit:addressSpace> + <spirit:name>AHBLiteTarget_Master__sys_AS</spirit:name> + <spirit:description>_sys address space</spirit:description> + <spirit:range>4G</spirit:range> + <spirit:width>32</spirit:width> + <spirit:segments> + <spirit:segment> + <spirit:name>_sys_0x40000000_0x5fffffff</spirit:name> + <spirit:addressOffset>0x40000000</spirit:addressOffset> + <spirit:range>0x020000000</spirit:range> + </spirit:segment> + <spirit:segment> + <spirit:name>_sys_0xf0000000_0xf003ffff</spirit:name> + <spirit:addressOffset>0xf0000000</spirit:addressOffset> + <spirit:range>0x000040000</spirit:range> + </spirit:segment> + </spirit:segments> + <spirit:addressUnitBits>8</spirit:addressUnitBits> + </spirit:addressSpace> + + <spirit:addressSpace> + <spirit:name>AHBLiteTarget_Master__ram8_AS</spirit:name> + <spirit:description>_ram8 address space</spirit:description> + <spirit:range>4G</spirit:range> + <spirit:width>32</spirit:width> + <spirit:segments> + <spirit:segment> + <spirit:name>_ram8_0x80000000_0x8fffffff</spirit:name> + <spirit:addressOffset>0x80000000</spirit:addressOffset> + <spirit:range>0x010000000</spirit:range> + </spirit:segment> + </spirit:segments> + <spirit:addressUnitBits>8</spirit:addressUnitBits> + </spirit:addressSpace> + + <spirit:addressSpace> + <spirit:name>AHBLiteTarget_Master__ram9_AS</spirit:name> + <spirit:description>_ram9 address space</spirit:description> + <spirit:range>4G</spirit:range> + <spirit:width>32</spirit:width> + <spirit:segments> + <spirit:segment> + <spirit:name>_ram9_0x90000000_0x9fffffff</spirit:name> + <spirit:addressOffset>0x90000000</spirit:addressOffset> + <spirit:range>0x010000000</spirit:range> + </spirit:segment> + </spirit:segments> + <spirit:addressUnitBits>8</spirit:addressUnitBits> + </spirit:addressSpace> + + <spirit:addressSpace> + <spirit:name>AHBLiteTarget_Master__exp_AS</spirit:name> + <spirit:description>_exp address space</spirit:description> + <spirit:range>4G</spirit:range> + <spirit:width>32</spirit:width> + <spirit:segments> + <spirit:segment> + <spirit:name>_exp_0x60000000_0x7fffffff</spirit:name> + <spirit:addressOffset>0x60000000</spirit:addressOffset> + <spirit:range>0x020000000</spirit:range> + </spirit:segment> + <spirit:segment> + <spirit:name>_exp_0xa0000000_0xdfffffff</spirit:name> + <spirit:addressOffset>0xa0000000</spirit:addressOffset> + <spirit:range>0x040000000</spirit:range> + </spirit:segment> + </spirit:segments> + <spirit:addressUnitBits>8</spirit:addressUnitBits> + </spirit:addressSpace> + + </spirit:addressSpaces> + + <spirit:memoryMaps> + + <spirit:memoryMap> + <spirit:name>AHBLiteTarget_Slave__adp_MM</spirit:name> + <spirit:description>_adp memory map</spirit:description> + + <spirit:subspaceMap spirit:masterRef="AHBLiteTarget_Master__rom1" + spirit:segmentRef="_rom1_0x10000000_0x1fffffff"> + <!-- Address_region 0x10000000-0x1fffffff --> + <spirit:name>AHBLiteTarget_Master__rom1_0x10000000_0_state_always_SM</spirit:name> + <spirit:baseAddress>0x10000000</spirit:baseAddress> + </spirit:subspaceMap> + + <spirit:subspaceMap spirit:masterRef="AHBLiteTarget_Master__ram2" + spirit:segmentRef="_ram2_0x20000000_0x2fffffff"> + <!-- Address_region 0x20000000-0x2fffffff --> + <spirit:name>AHBLiteTarget_Master__ram2_0x20000000_0_state_always_SM</spirit:name> + <spirit:baseAddress>0x20000000</spirit:baseAddress> + </spirit:subspaceMap> + + <spirit:subspaceMap spirit:masterRef="AHBLiteTarget_Master__ram3" + spirit:segmentRef="_ram3_0x30000000_0x3fffffff"> + <!-- Address_region 0x30000000-0x3fffffff --> + <spirit:name>AHBLiteTarget_Master__ram3_0x30000000_0_state_always_SM</spirit:name> + <spirit:baseAddress>0x30000000</spirit:baseAddress> + </spirit:subspaceMap> + + <spirit:subspaceMap spirit:masterRef="AHBLiteTarget_Master__sys" + spirit:segmentRef="_sys_0x40000000_0x5fffffff"> + <!-- Address_region 0x40000000-0x5fffffff --> + <spirit:name>AHBLiteTarget_Master__sys_0x40000000_0_state_always_SM</spirit:name> + <spirit:baseAddress>0x40000000</spirit:baseAddress> + </spirit:subspaceMap> + + <spirit:subspaceMap spirit:masterRef="AHBLiteTarget_Master__exp" + spirit:segmentRef="_exp_0x60000000_0x7fffffff"> + <!-- Address_region 0x60000000-0x7fffffff --> + <spirit:name>AHBLiteTarget_Master__exp_0x60000000_0_state_always_SM</spirit:name> + <spirit:baseAddress>0x60000000</spirit:baseAddress> + </spirit:subspaceMap> + + <spirit:subspaceMap spirit:masterRef="AHBLiteTarget_Master__ram8" + spirit:segmentRef="_ram8_0x80000000_0x8fffffff"> + <!-- Address_region 0x80000000-0x8fffffff --> + <spirit:name>AHBLiteTarget_Master__ram8_0x80000000_0_state_always_SM</spirit:name> + <spirit:baseAddress>0x80000000</spirit:baseAddress> + </spirit:subspaceMap> + + <spirit:subspaceMap spirit:masterRef="AHBLiteTarget_Master__ram9" + spirit:segmentRef="_ram9_0x90000000_0x9fffffff"> + <!-- Address_region 0x90000000-0x9fffffff --> + <spirit:name>AHBLiteTarget_Master__ram9_0x90000000_0_state_always_SM</spirit:name> + <spirit:baseAddress>0x90000000</spirit:baseAddress> + </spirit:subspaceMap> + + <spirit:subspaceMap spirit:masterRef="AHBLiteTarget_Master__exp" + spirit:segmentRef="_exp_0xa0000000_0xdfffffff"> + <!-- Address_region 0xa0000000-0xdfffffff --> + <spirit:name>AHBLiteTarget_Master__exp_0xa0000000_0_state_always_SM</spirit:name> + <spirit:baseAddress>0xa0000000</spirit:baseAddress> + </spirit:subspaceMap> + + <spirit:subspaceMap spirit:masterRef="AHBLiteTarget_Master__sys" + spirit:segmentRef="_sys_0xf0000000_0xf003ffff"> + <!-- Address_region 0xf0000000-0xf003ffff --> + <spirit:name>AHBLiteTarget_Master__sys_0xf0000000_0_state_always_SM</spirit:name> + <spirit:baseAddress>0xf0000000</spirit:baseAddress> + </spirit:subspaceMap> + + <spirit:memoryRemap spirit:state="remap_0"> + <spirit:name>AHBLiteTarget_Slave__adp_remap_0_remap_MM</spirit:name> + <spirit:description>_adp remap_0 remap</spirit:description> + <spirit:subspaceMap spirit:masterRef="AHBLiteTarget_Master__ram2" + spirit:segmentRef="_ram2_0x00000000_0x0fffffff"> + <!-- Remapped region, active when REMAP bitcombination is 0 address_region 0x00000000-0x0fffffff --> + <spirit:name>AHBLiteTarget_Master__ram2_0x00000000_0_state_remap_0_SM</spirit:name> + <spirit:baseAddress>0x00000000</spirit:baseAddress> + </spirit:subspaceMap> + </spirit:memoryRemap> + + <spirit:memoryRemap spirit:state="remap_n0"> + <spirit:name>AHBLiteTarget_Slave__adp_remap_n0_remap_MM</spirit:name> + <spirit:description>_adp remap_n0 remap</spirit:description> + <spirit:subspaceMap spirit:masterRef="AHBLiteTarget_Master__rom1" + spirit:segmentRef="_rom1_0x00000000_0x0fffffff"> + <!-- Removable region, active only when REMAP bitcombination is n0 address_region 0x00000000-0x0fffffff --> + <spirit:name>AHBLiteTarget_Master__rom1_0x00000000_0_state_remap_n0_SM</spirit:name> + <spirit:baseAddress>0x00000000</spirit:baseAddress> + </spirit:subspaceMap> + </spirit:memoryRemap> + + </spirit:memoryMap> + + <spirit:memoryMap> + <spirit:name>AHBLiteTarget_Slave__dma_MM</spirit:name> + <spirit:description>_dma memory map</spirit:description> + + <spirit:subspaceMap spirit:masterRef="AHBLiteTarget_Master__ram2" + spirit:segmentRef="_ram2_0x00000000_0x0fffffff"> + <!-- Address_region 0x00000000-0x0fffffff --> + <spirit:name>AHBLiteTarget_Master__ram2_0x00000000_0_state_always_SM</spirit:name> + <spirit:baseAddress>0x00000000</spirit:baseAddress> + </spirit:subspaceMap> + + <spirit:subspaceMap spirit:masterRef="AHBLiteTarget_Master__rom1" + spirit:segmentRef="_rom1_0x10000000_0x1fffffff"> + <!-- Address_region 0x10000000-0x1fffffff --> + <spirit:name>AHBLiteTarget_Master__rom1_0x10000000_0_state_always_SM</spirit:name> + <spirit:baseAddress>0x10000000</spirit:baseAddress> + </spirit:subspaceMap> + + <spirit:subspaceMap spirit:masterRef="AHBLiteTarget_Master__ram2" + spirit:segmentRef="_ram2_0x20000000_0x2fffffff"> + <!-- Address_region 0x20000000-0x2fffffff --> + <spirit:name>AHBLiteTarget_Master__ram2_0x20000000_0_state_always_SM</spirit:name> + <spirit:baseAddress>0x20000000</spirit:baseAddress> + </spirit:subspaceMap> + + <spirit:subspaceMap spirit:masterRef="AHBLiteTarget_Master__ram3" + spirit:segmentRef="_ram3_0x30000000_0x3fffffff"> + <!-- Address_region 0x30000000-0x3fffffff --> + <spirit:name>AHBLiteTarget_Master__ram3_0x30000000_0_state_always_SM</spirit:name> + <spirit:baseAddress>0x30000000</spirit:baseAddress> + </spirit:subspaceMap> + + <spirit:subspaceMap spirit:masterRef="AHBLiteTarget_Master__sys" + spirit:segmentRef="_sys_0x40000000_0x5fffffff"> + <!-- Address_region 0x40000000-0x5fffffff --> + <spirit:name>AHBLiteTarget_Master__sys_0x40000000_0_state_always_SM</spirit:name> + <spirit:baseAddress>0x40000000</spirit:baseAddress> + </spirit:subspaceMap> + + <spirit:subspaceMap spirit:masterRef="AHBLiteTarget_Master__exp" + spirit:segmentRef="_exp_0x60000000_0x7fffffff"> + <!-- Address_region 0x60000000-0x7fffffff --> + <spirit:name>AHBLiteTarget_Master__exp_0x60000000_0_state_always_SM</spirit:name> + <spirit:baseAddress>0x60000000</spirit:baseAddress> + </spirit:subspaceMap> + + <spirit:subspaceMap spirit:masterRef="AHBLiteTarget_Master__ram8" + spirit:segmentRef="_ram8_0x80000000_0x8fffffff"> + <!-- Address_region 0x80000000-0x8fffffff --> + <spirit:name>AHBLiteTarget_Master__ram8_0x80000000_0_state_always_SM</spirit:name> + <spirit:baseAddress>0x80000000</spirit:baseAddress> + </spirit:subspaceMap> + + <spirit:subspaceMap spirit:masterRef="AHBLiteTarget_Master__ram9" + spirit:segmentRef="_ram9_0x90000000_0x9fffffff"> + <!-- Address_region 0x90000000-0x9fffffff --> + <spirit:name>AHBLiteTarget_Master__ram9_0x90000000_0_state_always_SM</spirit:name> + <spirit:baseAddress>0x90000000</spirit:baseAddress> + </spirit:subspaceMap> + + <spirit:subspaceMap spirit:masterRef="AHBLiteTarget_Master__exp" + spirit:segmentRef="_exp_0xa0000000_0xdfffffff"> + <!-- Address_region 0xa0000000-0xdfffffff --> + <spirit:name>AHBLiteTarget_Master__exp_0xa0000000_0_state_always_SM</spirit:name> + <spirit:baseAddress>0xa0000000</spirit:baseAddress> + </spirit:subspaceMap> + + </spirit:memoryMap> + + <spirit:memoryMap> + <spirit:name>AHBLiteTarget_Slave__dma2_MM</spirit:name> + <spirit:description>_dma2 memory map</spirit:description> + + <spirit:subspaceMap spirit:masterRef="AHBLiteTarget_Master__ram2" + spirit:segmentRef="_ram2_0x00000000_0x0fffffff"> + <!-- Address_region 0x00000000-0x0fffffff --> + <spirit:name>AHBLiteTarget_Master__ram2_0x00000000_0_state_always_SM</spirit:name> + <spirit:baseAddress>0x00000000</spirit:baseAddress> + </spirit:subspaceMap> + + <spirit:subspaceMap spirit:masterRef="AHBLiteTarget_Master__rom1" + spirit:segmentRef="_rom1_0x10000000_0x1fffffff"> + <!-- Address_region 0x10000000-0x1fffffff --> + <spirit:name>AHBLiteTarget_Master__rom1_0x10000000_0_state_always_SM</spirit:name> + <spirit:baseAddress>0x10000000</spirit:baseAddress> + </spirit:subspaceMap> + + <spirit:subspaceMap spirit:masterRef="AHBLiteTarget_Master__ram2" + spirit:segmentRef="_ram2_0x20000000_0x2fffffff"> + <!-- Address_region 0x20000000-0x2fffffff --> + <spirit:name>AHBLiteTarget_Master__ram2_0x20000000_0_state_always_SM</spirit:name> + <spirit:baseAddress>0x20000000</spirit:baseAddress> + </spirit:subspaceMap> + + <spirit:subspaceMap spirit:masterRef="AHBLiteTarget_Master__ram3" + spirit:segmentRef="_ram3_0x30000000_0x3fffffff"> + <!-- Address_region 0x30000000-0x3fffffff --> + <spirit:name>AHBLiteTarget_Master__ram3_0x30000000_0_state_always_SM</spirit:name> + <spirit:baseAddress>0x30000000</spirit:baseAddress> + </spirit:subspaceMap> + + <spirit:subspaceMap spirit:masterRef="AHBLiteTarget_Master__sys" + spirit:segmentRef="_sys_0x40000000_0x5fffffff"> + <!-- Address_region 0x40000000-0x5fffffff --> + <spirit:name>AHBLiteTarget_Master__sys_0x40000000_0_state_always_SM</spirit:name> + <spirit:baseAddress>0x40000000</spirit:baseAddress> + </spirit:subspaceMap> + + <spirit:subspaceMap spirit:masterRef="AHBLiteTarget_Master__exp" + spirit:segmentRef="_exp_0x60000000_0x7fffffff"> + <!-- Address_region 0x60000000-0x7fffffff --> + <spirit:name>AHBLiteTarget_Master__exp_0x60000000_0_state_always_SM</spirit:name> + <spirit:baseAddress>0x60000000</spirit:baseAddress> + </spirit:subspaceMap> + + <spirit:subspaceMap spirit:masterRef="AHBLiteTarget_Master__ram8" + spirit:segmentRef="_ram8_0x80000000_0x8fffffff"> + <!-- Address_region 0x80000000-0x8fffffff --> + <spirit:name>AHBLiteTarget_Master__ram8_0x80000000_0_state_always_SM</spirit:name> + <spirit:baseAddress>0x80000000</spirit:baseAddress> + </spirit:subspaceMap> + + <spirit:subspaceMap spirit:masterRef="AHBLiteTarget_Master__ram9" + spirit:segmentRef="_ram9_0x90000000_0x9fffffff"> + <!-- Address_region 0x90000000-0x9fffffff --> + <spirit:name>AHBLiteTarget_Master__ram9_0x90000000_0_state_always_SM</spirit:name> + <spirit:baseAddress>0x90000000</spirit:baseAddress> + </spirit:subspaceMap> + + <spirit:subspaceMap spirit:masterRef="AHBLiteTarget_Master__exp" + spirit:segmentRef="_exp_0xa0000000_0xdfffffff"> + <!-- Address_region 0xa0000000-0xdfffffff --> + <spirit:name>AHBLiteTarget_Master__exp_0xa0000000_0_state_always_SM</spirit:name> + <spirit:baseAddress>0xa0000000</spirit:baseAddress> + </spirit:subspaceMap> + + </spirit:memoryMap> + + <spirit:memoryMap> + <spirit:name>AHBLiteTarget_Slave__cpu_MM</spirit:name> + <spirit:description>_cpu memory map</spirit:description> + + <spirit:subspaceMap spirit:masterRef="AHBLiteTarget_Master__rom1" + spirit:segmentRef="_rom1_0x10000000_0x1fffffff"> + <!-- Address_region 0x10000000-0x1fffffff --> + <spirit:name>AHBLiteTarget_Master__rom1_0x10000000_0_state_always_SM</spirit:name> + <spirit:baseAddress>0x10000000</spirit:baseAddress> + </spirit:subspaceMap> + + <spirit:subspaceMap spirit:masterRef="AHBLiteTarget_Master__ram2" + spirit:segmentRef="_ram2_0x20000000_0x2fffffff"> + <!-- Address_region 0x20000000-0x2fffffff --> + <spirit:name>AHBLiteTarget_Master__ram2_0x20000000_0_state_always_SM</spirit:name> + <spirit:baseAddress>0x20000000</spirit:baseAddress> + </spirit:subspaceMap> + + <spirit:subspaceMap spirit:masterRef="AHBLiteTarget_Master__ram3" + spirit:segmentRef="_ram3_0x30000000_0x3fffffff"> + <!-- Address_region 0x30000000-0x3fffffff --> + <spirit:name>AHBLiteTarget_Master__ram3_0x30000000_0_state_always_SM</spirit:name> + <spirit:baseAddress>0x30000000</spirit:baseAddress> + </spirit:subspaceMap> + + <spirit:subspaceMap spirit:masterRef="AHBLiteTarget_Master__sys" + spirit:segmentRef="_sys_0x40000000_0x5fffffff"> + <!-- Address_region 0x40000000-0x5fffffff --> + <spirit:name>AHBLiteTarget_Master__sys_0x40000000_0_state_always_SM</spirit:name> + <spirit:baseAddress>0x40000000</spirit:baseAddress> + </spirit:subspaceMap> + + <spirit:subspaceMap spirit:masterRef="AHBLiteTarget_Master__exp" + spirit:segmentRef="_exp_0x60000000_0x7fffffff"> + <!-- Address_region 0x60000000-0x7fffffff --> + <spirit:name>AHBLiteTarget_Master__exp_0x60000000_0_state_always_SM</spirit:name> + <spirit:baseAddress>0x60000000</spirit:baseAddress> + </spirit:subspaceMap> + + <spirit:subspaceMap spirit:masterRef="AHBLiteTarget_Master__ram8" + spirit:segmentRef="_ram8_0x80000000_0x8fffffff"> + <!-- Address_region 0x80000000-0x8fffffff --> + <spirit:name>AHBLiteTarget_Master__ram8_0x80000000_0_state_always_SM</spirit:name> + <spirit:baseAddress>0x80000000</spirit:baseAddress> + </spirit:subspaceMap> + + <spirit:subspaceMap spirit:masterRef="AHBLiteTarget_Master__ram9" + spirit:segmentRef="_ram9_0x90000000_0x9fffffff"> + <!-- Address_region 0x90000000-0x9fffffff --> + <spirit:name>AHBLiteTarget_Master__ram9_0x90000000_0_state_always_SM</spirit:name> + <spirit:baseAddress>0x90000000</spirit:baseAddress> + </spirit:subspaceMap> + + <spirit:subspaceMap spirit:masterRef="AHBLiteTarget_Master__exp" + spirit:segmentRef="_exp_0xa0000000_0xdfffffff"> + <!-- Address_region 0xa0000000-0xdfffffff --> + <spirit:name>AHBLiteTarget_Master__exp_0xa0000000_0_state_always_SM</spirit:name> + <spirit:baseAddress>0xa0000000</spirit:baseAddress> + </spirit:subspaceMap> + + <spirit:subspaceMap spirit:masterRef="AHBLiteTarget_Master__sys" + spirit:segmentRef="_sys_0xf0000000_0xf003ffff"> + <!-- Address_region 0xf0000000-0xf003ffff --> + <spirit:name>AHBLiteTarget_Master__sys_0xf0000000_0_state_always_SM</spirit:name> + <spirit:baseAddress>0xf0000000</spirit:baseAddress> + </spirit:subspaceMap> + + <spirit:memoryRemap spirit:state="remap_0"> + <spirit:name>AHBLiteTarget_Slave__cpu_remap_0_remap_MM</spirit:name> + <spirit:description>_cpu remap_0 remap</spirit:description> + <spirit:subspaceMap spirit:masterRef="AHBLiteTarget_Master__ram2" + spirit:segmentRef="_ram2_0x00000000_0x0fffffff"> + <!-- Remapped region, active when REMAP bitcombination is 0 address_region 0x00000000-0x0fffffff --> + <spirit:name>AHBLiteTarget_Master__ram2_0x00000000_0_state_remap_0_SM</spirit:name> + <spirit:baseAddress>0x00000000</spirit:baseAddress> + </spirit:subspaceMap> + </spirit:memoryRemap> + + <spirit:memoryRemap spirit:state="remap_n0"> + <spirit:name>AHBLiteTarget_Slave__cpu_remap_n0_remap_MM</spirit:name> + <spirit:description>_cpu remap_n0 remap</spirit:description> + <spirit:subspaceMap spirit:masterRef="AHBLiteTarget_Master__rom1" + spirit:segmentRef="_rom1_0x00000000_0x0fffffff"> + <!-- Removable region, active only when REMAP bitcombination is n0 address_region 0x00000000-0x0fffffff --> + <spirit:name>AHBLiteTarget_Master__rom1_0x00000000_0_state_remap_n0_SM</spirit:name> + <spirit:baseAddress>0x00000000</spirit:baseAddress> + </spirit:subspaceMap> + </spirit:memoryRemap> + + </spirit:memoryMap> + + </spirit:memoryMaps> + + + <spirit:model> + <spirit:views> + <spirit:view> + <spirit:name>verilogsource</spirit:name> + <spirit:description>soclabs_4x7_AhbMatrix bus matrix</spirit:description> + <spirit:envIdentifier>:*Simulation:</spirit:envIdentifier> + <spirit:envIdentifier>:*Synthesis:</spirit:envIdentifier> + <spirit:language>verilog</spirit:language> + <spirit:modelName>soclabs_4x7_AhbMatrix</spirit:modelName> + <spirit:fileSetRef> + <spirit:localName>fs-verilogsource</spirit:localName> + </spirit:fileSetRef> + </spirit:view> + </spirit:views> + + <spirit:ports> + + <!-- Common clock and reset --> + + <spirit:port> + <spirit:name>HCLK</spirit:name> + <spirit:wire> + <spirit:direction>in</spirit:direction> + </spirit:wire> + </spirit:port> + <spirit:port> + <spirit:name>HRESETn</spirit:name> + <spirit:wire> + <spirit:direction>in</spirit:direction> + </spirit:wire> + </spirit:port> + + <!-- Remap port --> + <spirit:port> + <spirit:name>REMAP</spirit:name> + <spirit:wire> + <spirit:direction>in</spirit:direction> + <spirit:vector> + <spirit:left>3</spirit:left> + <spirit:right>0</spirit:right> + </spirit:vector> + <spirit:driver> + <spirit:defaultValue>0</spirit:defaultValue> + </spirit:driver> + </spirit:wire> + </spirit:port> + + <!-- Input signals of Slave interfaces --> + + <spirit:port> + <spirit:name>HSEL_adp</spirit:name> + <spirit:wire> + <spirit:direction>in</spirit:direction> + </spirit:wire> + </spirit:port> + <spirit:port> + <spirit:name>HADDR_adp</spirit:name> + <spirit:wire> + <spirit:direction>in</spirit:direction> + <spirit:vector> + <spirit:left>31</spirit:left> + <spirit:right>0</spirit:right> + </spirit:vector> + </spirit:wire> + </spirit:port> + <spirit:port> + <spirit:name>HTRANS_adp</spirit:name> + <spirit:wire> + <spirit:direction>in</spirit:direction> + <spirit:vector> + <spirit:left>1</spirit:left> + <spirit:right>0</spirit:right> + </spirit:vector> + </spirit:wire> + </spirit:port> + <spirit:port> + <spirit:name>HWRITE_adp</spirit:name> + <spirit:wire> + <spirit:direction>in</spirit:direction> + </spirit:wire> + </spirit:port> + <spirit:port> + <spirit:name>HSIZE_adp</spirit:name> + <spirit:wire> + <spirit:direction>in</spirit:direction> + <spirit:vector> + <spirit:left>2</spirit:left> + <spirit:right>0</spirit:right> + </spirit:vector> + </spirit:wire> + </spirit:port> + <spirit:port> + <spirit:name>HBURST_adp</spirit:name> + <spirit:wire> + <spirit:direction>in</spirit:direction> + <spirit:vector> + <spirit:left>2</spirit:left> + <spirit:right>0</spirit:right> + </spirit:vector> + <spirit:driver> + <spirit:defaultValue>0</spirit:defaultValue> + </spirit:driver> + </spirit:wire> + </spirit:port> + <spirit:port> + <spirit:name>HPROT_adp</spirit:name> + <spirit:wire> + <spirit:direction>in</spirit:direction> + <spirit:vector> + <spirit:left>3</spirit:left> + <spirit:right>0</spirit:right> + </spirit:vector> + </spirit:wire> + </spirit:port> + <spirit:port> + <spirit:name>HMASTER_adp</spirit:name> + <spirit:wire> + <spirit:direction>in</spirit:direction> + <spirit:vector> + <spirit:left>3</spirit:left> + <spirit:right>0</spirit:right> + </spirit:vector> + <spirit:driver> + <spirit:defaultValue>0</spirit:defaultValue> + </spirit:driver> + </spirit:wire> + </spirit:port> + <spirit:port> + <spirit:name>HWDATA_adp</spirit:name> + <spirit:wire> + <spirit:direction>in</spirit:direction> + <spirit:vector> + <spirit:left>31</spirit:left> + <spirit:right>0</spirit:right> + </spirit:vector> + </spirit:wire> + </spirit:port> + <spirit:port> + <spirit:name>HMASTLOCK_adp</spirit:name> + <spirit:wire> + <spirit:direction>in</spirit:direction> + </spirit:wire> + </spirit:port> + <spirit:port> + <spirit:name>HREADY_adp</spirit:name> + <spirit:wire> + <spirit:direction>in</spirit:direction> + </spirit:wire> + </spirit:port> + + <spirit:port> + <spirit:name>HAUSER_adp</spirit:name> + <spirit:wire> + <spirit:direction>in</spirit:direction> + <spirit:vector> + <spirit:left>1</spirit:left> + <spirit:right>0</spirit:right> + </spirit:vector> + </spirit:wire> + </spirit:port> + <spirit:port> + <spirit:name>HWUSER_adp</spirit:name> + <spirit:wire> + <spirit:direction>in</spirit:direction> + <spirit:vector> + <spirit:left>1</spirit:left> + <spirit:right>0</spirit:right> + </spirit:vector> + </spirit:wire> + </spirit:port> + <spirit:port> + <spirit:name>HSEL_dma</spirit:name> + <spirit:wire> + <spirit:direction>in</spirit:direction> + </spirit:wire> + </spirit:port> + <spirit:port> + <spirit:name>HADDR_dma</spirit:name> + <spirit:wire> + <spirit:direction>in</spirit:direction> + <spirit:vector> + <spirit:left>31</spirit:left> + <spirit:right>0</spirit:right> + </spirit:vector> + </spirit:wire> + </spirit:port> + <spirit:port> + <spirit:name>HTRANS_dma</spirit:name> + <spirit:wire> + <spirit:direction>in</spirit:direction> + <spirit:vector> + <spirit:left>1</spirit:left> + <spirit:right>0</spirit:right> + </spirit:vector> + </spirit:wire> + </spirit:port> + <spirit:port> + <spirit:name>HWRITE_dma</spirit:name> + <spirit:wire> + <spirit:direction>in</spirit:direction> + </spirit:wire> + </spirit:port> + <spirit:port> + <spirit:name>HSIZE_dma</spirit:name> + <spirit:wire> + <spirit:direction>in</spirit:direction> + <spirit:vector> + <spirit:left>2</spirit:left> + <spirit:right>0</spirit:right> + </spirit:vector> + </spirit:wire> + </spirit:port> + <spirit:port> + <spirit:name>HBURST_dma</spirit:name> + <spirit:wire> + <spirit:direction>in</spirit:direction> + <spirit:vector> + <spirit:left>2</spirit:left> + <spirit:right>0</spirit:right> + </spirit:vector> + <spirit:driver> + <spirit:defaultValue>0</spirit:defaultValue> + </spirit:driver> + </spirit:wire> + </spirit:port> + <spirit:port> + <spirit:name>HPROT_dma</spirit:name> + <spirit:wire> + <spirit:direction>in</spirit:direction> + <spirit:vector> + <spirit:left>3</spirit:left> + <spirit:right>0</spirit:right> + </spirit:vector> + </spirit:wire> + </spirit:port> + <spirit:port> + <spirit:name>HMASTER_dma</spirit:name> + <spirit:wire> + <spirit:direction>in</spirit:direction> + <spirit:vector> + <spirit:left>3</spirit:left> + <spirit:right>0</spirit:right> + </spirit:vector> + <spirit:driver> + <spirit:defaultValue>1</spirit:defaultValue> + </spirit:driver> + </spirit:wire> + </spirit:port> + <spirit:port> + <spirit:name>HWDATA_dma</spirit:name> + <spirit:wire> + <spirit:direction>in</spirit:direction> + <spirit:vector> + <spirit:left>31</spirit:left> + <spirit:right>0</spirit:right> + </spirit:vector> + </spirit:wire> + </spirit:port> + <spirit:port> + <spirit:name>HMASTLOCK_dma</spirit:name> + <spirit:wire> + <spirit:direction>in</spirit:direction> + </spirit:wire> + </spirit:port> + <spirit:port> + <spirit:name>HREADY_dma</spirit:name> + <spirit:wire> + <spirit:direction>in</spirit:direction> + </spirit:wire> + </spirit:port> + + <spirit:port> + <spirit:name>HAUSER_dma</spirit:name> + <spirit:wire> + <spirit:direction>in</spirit:direction> + <spirit:vector> + <spirit:left>1</spirit:left> + <spirit:right>0</spirit:right> + </spirit:vector> + </spirit:wire> + </spirit:port> + <spirit:port> + <spirit:name>HWUSER_dma</spirit:name> + <spirit:wire> + <spirit:direction>in</spirit:direction> + <spirit:vector> + <spirit:left>1</spirit:left> + <spirit:right>0</spirit:right> + </spirit:vector> + </spirit:wire> + </spirit:port> + <spirit:port> + <spirit:name>HSEL_dma2</spirit:name> + <spirit:wire> + <spirit:direction>in</spirit:direction> + </spirit:wire> + </spirit:port> + <spirit:port> + <spirit:name>HADDR_dma2</spirit:name> + <spirit:wire> + <spirit:direction>in</spirit:direction> + <spirit:vector> + <spirit:left>31</spirit:left> + <spirit:right>0</spirit:right> + </spirit:vector> + </spirit:wire> + </spirit:port> + <spirit:port> + <spirit:name>HTRANS_dma2</spirit:name> + <spirit:wire> + <spirit:direction>in</spirit:direction> + <spirit:vector> + <spirit:left>1</spirit:left> + <spirit:right>0</spirit:right> + </spirit:vector> + </spirit:wire> + </spirit:port> + <spirit:port> + <spirit:name>HWRITE_dma2</spirit:name> + <spirit:wire> + <spirit:direction>in</spirit:direction> + </spirit:wire> + </spirit:port> + <spirit:port> + <spirit:name>HSIZE_dma2</spirit:name> + <spirit:wire> + <spirit:direction>in</spirit:direction> + <spirit:vector> + <spirit:left>2</spirit:left> + <spirit:right>0</spirit:right> + </spirit:vector> + </spirit:wire> + </spirit:port> + <spirit:port> + <spirit:name>HBURST_dma2</spirit:name> + <spirit:wire> + <spirit:direction>in</spirit:direction> + <spirit:vector> + <spirit:left>2</spirit:left> + <spirit:right>0</spirit:right> + </spirit:vector> + <spirit:driver> + <spirit:defaultValue>0</spirit:defaultValue> + </spirit:driver> + </spirit:wire> + </spirit:port> + <spirit:port> + <spirit:name>HPROT_dma2</spirit:name> + <spirit:wire> + <spirit:direction>in</spirit:direction> + <spirit:vector> + <spirit:left>3</spirit:left> + <spirit:right>0</spirit:right> + </spirit:vector> + </spirit:wire> + </spirit:port> + <spirit:port> + <spirit:name>HMASTER_dma2</spirit:name> + <spirit:wire> + <spirit:direction>in</spirit:direction> + <spirit:vector> + <spirit:left>3</spirit:left> + <spirit:right>0</spirit:right> + </spirit:vector> + <spirit:driver> + <spirit:defaultValue>2</spirit:defaultValue> + </spirit:driver> + </spirit:wire> + </spirit:port> + <spirit:port> + <spirit:name>HWDATA_dma2</spirit:name> + <spirit:wire> + <spirit:direction>in</spirit:direction> + <spirit:vector> + <spirit:left>31</spirit:left> + <spirit:right>0</spirit:right> + </spirit:vector> + </spirit:wire> + </spirit:port> + <spirit:port> + <spirit:name>HMASTLOCK_dma2</spirit:name> + <spirit:wire> + <spirit:direction>in</spirit:direction> + </spirit:wire> + </spirit:port> + <spirit:port> + <spirit:name>HREADY_dma2</spirit:name> + <spirit:wire> + <spirit:direction>in</spirit:direction> + </spirit:wire> + </spirit:port> + + <spirit:port> + <spirit:name>HAUSER_dma2</spirit:name> + <spirit:wire> + <spirit:direction>in</spirit:direction> + <spirit:vector> + <spirit:left>1</spirit:left> + <spirit:right>0</spirit:right> + </spirit:vector> + </spirit:wire> + </spirit:port> + <spirit:port> + <spirit:name>HWUSER_dma2</spirit:name> + <spirit:wire> + <spirit:direction>in</spirit:direction> + <spirit:vector> + <spirit:left>1</spirit:left> + <spirit:right>0</spirit:right> + </spirit:vector> + </spirit:wire> + </spirit:port> + <spirit:port> + <spirit:name>HSEL_cpu</spirit:name> + <spirit:wire> + <spirit:direction>in</spirit:direction> + </spirit:wire> + </spirit:port> + <spirit:port> + <spirit:name>HADDR_cpu</spirit:name> + <spirit:wire> + <spirit:direction>in</spirit:direction> + <spirit:vector> + <spirit:left>31</spirit:left> + <spirit:right>0</spirit:right> + </spirit:vector> + </spirit:wire> + </spirit:port> + <spirit:port> + <spirit:name>HTRANS_cpu</spirit:name> + <spirit:wire> + <spirit:direction>in</spirit:direction> + <spirit:vector> + <spirit:left>1</spirit:left> + <spirit:right>0</spirit:right> + </spirit:vector> + </spirit:wire> + </spirit:port> + <spirit:port> + <spirit:name>HWRITE_cpu</spirit:name> + <spirit:wire> + <spirit:direction>in</spirit:direction> + </spirit:wire> + </spirit:port> + <spirit:port> + <spirit:name>HSIZE_cpu</spirit:name> + <spirit:wire> + <spirit:direction>in</spirit:direction> + <spirit:vector> + <spirit:left>2</spirit:left> + <spirit:right>0</spirit:right> + </spirit:vector> + </spirit:wire> + </spirit:port> + <spirit:port> + <spirit:name>HBURST_cpu</spirit:name> + <spirit:wire> + <spirit:direction>in</spirit:direction> + <spirit:vector> + <spirit:left>2</spirit:left> + <spirit:right>0</spirit:right> + </spirit:vector> + <spirit:driver> + <spirit:defaultValue>0</spirit:defaultValue> + </spirit:driver> + </spirit:wire> + </spirit:port> + <spirit:port> + <spirit:name>HPROT_cpu</spirit:name> + <spirit:wire> + <spirit:direction>in</spirit:direction> + <spirit:vector> + <spirit:left>3</spirit:left> + <spirit:right>0</spirit:right> + </spirit:vector> + </spirit:wire> + </spirit:port> + <spirit:port> + <spirit:name>HMASTER_cpu</spirit:name> + <spirit:wire> + <spirit:direction>in</spirit:direction> + <spirit:vector> + <spirit:left>3</spirit:left> + <spirit:right>0</spirit:right> + </spirit:vector> + <spirit:driver> + <spirit:defaultValue>3</spirit:defaultValue> + </spirit:driver> + </spirit:wire> + </spirit:port> + <spirit:port> + <spirit:name>HWDATA_cpu</spirit:name> + <spirit:wire> + <spirit:direction>in</spirit:direction> + <spirit:vector> + <spirit:left>31</spirit:left> + <spirit:right>0</spirit:right> + </spirit:vector> + </spirit:wire> + </spirit:port> + <spirit:port> + <spirit:name>HMASTLOCK_cpu</spirit:name> + <spirit:wire> + <spirit:direction>in</spirit:direction> + </spirit:wire> + </spirit:port> + <spirit:port> + <spirit:name>HREADY_cpu</spirit:name> + <spirit:wire> + <spirit:direction>in</spirit:direction> + </spirit:wire> + </spirit:port> + + <spirit:port> + <spirit:name>HAUSER_cpu</spirit:name> + <spirit:wire> + <spirit:direction>in</spirit:direction> + <spirit:vector> + <spirit:left>1</spirit:left> + <spirit:right>0</spirit:right> + </spirit:vector> + </spirit:wire> + </spirit:port> + <spirit:port> + <spirit:name>HWUSER_cpu</spirit:name> + <spirit:wire> + <spirit:direction>in</spirit:direction> + <spirit:vector> + <spirit:left>1</spirit:left> + <spirit:right>0</spirit:right> + </spirit:vector> + </spirit:wire> + </spirit:port> + + <!-- Input signals of Master interfaces --> + + <spirit:port> + <spirit:name>HRDATA_rom1</spirit:name> + <spirit:wire> + <spirit:direction>in</spirit:direction> + <spirit:vector> + <spirit:left>31</spirit:left> + <spirit:right>0</spirit:right> + </spirit:vector> + </spirit:wire> + </spirit:port> + <spirit:port> + <spirit:name>HREADYOUT_rom1</spirit:name> + <spirit:wire> + <spirit:direction>in</spirit:direction> + </spirit:wire> + </spirit:port> + <spirit:port> + <spirit:name>HRESP_rom1</spirit:name> + <spirit:wire> + <spirit:direction>in</spirit:direction> + <spirit:vector> + <spirit:left>1</spirit:left> + <spirit:right>0</spirit:right> + </spirit:vector> + </spirit:wire> + </spirit:port> + <spirit:port> + <spirit:name>HRUSER_rom1</spirit:name> + <spirit:wire> + <spirit:direction>in</spirit:direction> + <spirit:vector> + <spirit:left>1</spirit:left> + <spirit:right>0</spirit:right> + </spirit:vector> + </spirit:wire> + </spirit:port> + <spirit:port> + <spirit:name>HRDATA_ram2</spirit:name> + <spirit:wire> + <spirit:direction>in</spirit:direction> + <spirit:vector> + <spirit:left>31</spirit:left> + <spirit:right>0</spirit:right> + </spirit:vector> + </spirit:wire> + </spirit:port> + <spirit:port> + <spirit:name>HREADYOUT_ram2</spirit:name> + <spirit:wire> + <spirit:direction>in</spirit:direction> + </spirit:wire> + </spirit:port> + <spirit:port> + <spirit:name>HRESP_ram2</spirit:name> + <spirit:wire> + <spirit:direction>in</spirit:direction> + <spirit:vector> + <spirit:left>1</spirit:left> + <spirit:right>0</spirit:right> + </spirit:vector> + </spirit:wire> + </spirit:port> + <spirit:port> + <spirit:name>HRUSER_ram2</spirit:name> + <spirit:wire> + <spirit:direction>in</spirit:direction> + <spirit:vector> + <spirit:left>1</spirit:left> + <spirit:right>0</spirit:right> + </spirit:vector> + </spirit:wire> + </spirit:port> + <spirit:port> + <spirit:name>HRDATA_ram3</spirit:name> + <spirit:wire> + <spirit:direction>in</spirit:direction> + <spirit:vector> + <spirit:left>31</spirit:left> + <spirit:right>0</spirit:right> + </spirit:vector> + </spirit:wire> + </spirit:port> + <spirit:port> + <spirit:name>HREADYOUT_ram3</spirit:name> + <spirit:wire> + <spirit:direction>in</spirit:direction> + </spirit:wire> + </spirit:port> + <spirit:port> + <spirit:name>HRESP_ram3</spirit:name> + <spirit:wire> + <spirit:direction>in</spirit:direction> + <spirit:vector> + <spirit:left>1</spirit:left> + <spirit:right>0</spirit:right> + </spirit:vector> + </spirit:wire> + </spirit:port> + <spirit:port> + <spirit:name>HRUSER_ram3</spirit:name> + <spirit:wire> + <spirit:direction>in</spirit:direction> + <spirit:vector> + <spirit:left>1</spirit:left> + <spirit:right>0</spirit:right> + </spirit:vector> + </spirit:wire> + </spirit:port> + <spirit:port> + <spirit:name>HRDATA_sys</spirit:name> + <spirit:wire> + <spirit:direction>in</spirit:direction> + <spirit:vector> + <spirit:left>31</spirit:left> + <spirit:right>0</spirit:right> + </spirit:vector> + </spirit:wire> + </spirit:port> + <spirit:port> + <spirit:name>HREADYOUT_sys</spirit:name> + <spirit:wire> + <spirit:direction>in</spirit:direction> + </spirit:wire> + </spirit:port> + <spirit:port> + <spirit:name>HRESP_sys</spirit:name> + <spirit:wire> + <spirit:direction>in</spirit:direction> + <spirit:vector> + <spirit:left>1</spirit:left> + <spirit:right>0</spirit:right> + </spirit:vector> + </spirit:wire> + </spirit:port> + <spirit:port> + <spirit:name>HRUSER_sys</spirit:name> + <spirit:wire> + <spirit:direction>in</spirit:direction> + <spirit:vector> + <spirit:left>1</spirit:left> + <spirit:right>0</spirit:right> + </spirit:vector> + </spirit:wire> + </spirit:port> + <spirit:port> + <spirit:name>HRDATA_ram8</spirit:name> + <spirit:wire> + <spirit:direction>in</spirit:direction> + <spirit:vector> + <spirit:left>31</spirit:left> + <spirit:right>0</spirit:right> + </spirit:vector> + </spirit:wire> + </spirit:port> + <spirit:port> + <spirit:name>HREADYOUT_ram8</spirit:name> + <spirit:wire> + <spirit:direction>in</spirit:direction> + </spirit:wire> + </spirit:port> + <spirit:port> + <spirit:name>HRESP_ram8</spirit:name> + <spirit:wire> + <spirit:direction>in</spirit:direction> + <spirit:vector> + <spirit:left>1</spirit:left> + <spirit:right>0</spirit:right> + </spirit:vector> + </spirit:wire> + </spirit:port> + <spirit:port> + <spirit:name>HRUSER_ram8</spirit:name> + <spirit:wire> + <spirit:direction>in</spirit:direction> + <spirit:vector> + <spirit:left>1</spirit:left> + <spirit:right>0</spirit:right> + </spirit:vector> + </spirit:wire> + </spirit:port> + <spirit:port> + <spirit:name>HRDATA_ram9</spirit:name> + <spirit:wire> + <spirit:direction>in</spirit:direction> + <spirit:vector> + <spirit:left>31</spirit:left> + <spirit:right>0</spirit:right> + </spirit:vector> + </spirit:wire> + </spirit:port> + <spirit:port> + <spirit:name>HREADYOUT_ram9</spirit:name> + <spirit:wire> + <spirit:direction>in</spirit:direction> + </spirit:wire> + </spirit:port> + <spirit:port> + <spirit:name>HRESP_ram9</spirit:name> + <spirit:wire> + <spirit:direction>in</spirit:direction> + <spirit:vector> + <spirit:left>1</spirit:left> + <spirit:right>0</spirit:right> + </spirit:vector> + </spirit:wire> + </spirit:port> + <spirit:port> + <spirit:name>HRUSER_ram9</spirit:name> + <spirit:wire> + <spirit:direction>in</spirit:direction> + <spirit:vector> + <spirit:left>1</spirit:left> + <spirit:right>0</spirit:right> + </spirit:vector> + </spirit:wire> + </spirit:port> + <spirit:port> + <spirit:name>HRDATA_exp</spirit:name> + <spirit:wire> + <spirit:direction>in</spirit:direction> + <spirit:vector> + <spirit:left>31</spirit:left> + <spirit:right>0</spirit:right> + </spirit:vector> + </spirit:wire> + </spirit:port> + <spirit:port> + <spirit:name>HREADYOUT_exp</spirit:name> + <spirit:wire> + <spirit:direction>in</spirit:direction> + </spirit:wire> + </spirit:port> + <spirit:port> + <spirit:name>HRESP_exp</spirit:name> + <spirit:wire> + <spirit:direction>in</spirit:direction> + <spirit:vector> + <spirit:left>1</spirit:left> + <spirit:right>0</spirit:right> + </spirit:vector> + </spirit:wire> + </spirit:port> + <spirit:port> + <spirit:name>HRUSER_exp</spirit:name> + <spirit:wire> + <spirit:direction>in</spirit:direction> + <spirit:vector> + <spirit:left>1</spirit:left> + <spirit:right>0</spirit:right> + </spirit:vector> + </spirit:wire> + </spirit:port> + + <!-- Scan test dummy signals; not connected until scan insertion --> + + <spirit:port> + <spirit:name>SCANENABLE</spirit:name> + <spirit:wire> + <spirit:direction>in</spirit:direction> + </spirit:wire> + </spirit:port> + <spirit:port> + <spirit:name>SCANINHCLK</spirit:name> + <spirit:wire> + <spirit:direction>in</spirit:direction> + </spirit:wire> + </spirit:port> + + <!-- Output signals of Master interfaces --> + + <spirit:port> + <spirit:name>HSEL_rom1</spirit:name> + <spirit:wire> + <spirit:direction>out</spirit:direction> + </spirit:wire> + </spirit:port> + <spirit:port> + <spirit:name>HADDR_rom1</spirit:name> + <spirit:wire> + <spirit:direction>out</spirit:direction> + <spirit:vector> + <spirit:left>31</spirit:left> + <spirit:right>0</spirit:right> + </spirit:vector> + </spirit:wire> + </spirit:port> + <spirit:port> + <spirit:name>HTRANS_rom1</spirit:name> + <spirit:wire> + <spirit:direction>out</spirit:direction> + <spirit:vector> + <spirit:left>1</spirit:left> + <spirit:right>0</spirit:right> + </spirit:vector> + </spirit:wire> + </spirit:port> + <spirit:port> + <spirit:name>HWRITE_rom1</spirit:name> + <spirit:wire> + <spirit:direction>out</spirit:direction> + </spirit:wire> + </spirit:port> + <spirit:port> + <spirit:name>HSIZE_rom1</spirit:name> + <spirit:wire> + <spirit:direction>out</spirit:direction> + <spirit:vector> + <spirit:left>2</spirit:left> + <spirit:right>0</spirit:right> + </spirit:vector> + </spirit:wire> + </spirit:port> + <spirit:port> + <spirit:name>HBURST_rom1</spirit:name> + <spirit:wire> + <spirit:direction>out</spirit:direction> + <spirit:vector> + <spirit:left>2</spirit:left> + <spirit:right>0</spirit:right> + </spirit:vector> + </spirit:wire> + </spirit:port> + <spirit:port> + <spirit:name>HPROT_rom1</spirit:name> + <spirit:wire> + <spirit:direction>out</spirit:direction> + <spirit:vector> + <spirit:left>3</spirit:left> + <spirit:right>0</spirit:right> + </spirit:vector> + </spirit:wire> + </spirit:port> + <spirit:port> + <spirit:name>HMASTER_rom1</spirit:name> + <spirit:wire> + <spirit:direction>out</spirit:direction> + <spirit:vector> + <spirit:left>3</spirit:left> + <spirit:right>0</spirit:right> + </spirit:vector> + </spirit:wire> + </spirit:port> + <spirit:port> + <spirit:name>HWDATA_rom1</spirit:name> + <spirit:wire> + <spirit:direction>out</spirit:direction> + <spirit:vector> + <spirit:left>31</spirit:left> + <spirit:right>0</spirit:right> + </spirit:vector> + </spirit:wire> + </spirit:port> + <spirit:port> + <spirit:name>HMASTLOCK_rom1</spirit:name> + <spirit:wire> + <spirit:direction>out</spirit:direction> + </spirit:wire> + </spirit:port> + <spirit:port> + <spirit:name>HREADYMUX_rom1</spirit:name> + <spirit:wire> + <spirit:direction>out</spirit:direction> + </spirit:wire> + </spirit:port> + <spirit:port> + <spirit:name>HAUSER_rom1</spirit:name> + <spirit:wire> + <spirit:direction>out</spirit:direction> + <spirit:vector> + <spirit:left>1</spirit:left> + <spirit:right>0</spirit:right> + </spirit:vector> + </spirit:wire> + </spirit:port> + <spirit:port> + <spirit:name>HWUSER_rom1</spirit:name> + <spirit:wire> + <spirit:direction>out</spirit:direction> + <spirit:vector> + <spirit:left>1</spirit:left> + <spirit:right>0</spirit:right> + </spirit:vector> + </spirit:wire> + </spirit:port> + <spirit:port> + <spirit:name>HSEL_ram2</spirit:name> + <spirit:wire> + <spirit:direction>out</spirit:direction> + </spirit:wire> + </spirit:port> + <spirit:port> + <spirit:name>HADDR_ram2</spirit:name> + <spirit:wire> + <spirit:direction>out</spirit:direction> + <spirit:vector> + <spirit:left>31</spirit:left> + <spirit:right>0</spirit:right> + </spirit:vector> + </spirit:wire> + </spirit:port> + <spirit:port> + <spirit:name>HTRANS_ram2</spirit:name> + <spirit:wire> + <spirit:direction>out</spirit:direction> + <spirit:vector> + <spirit:left>1</spirit:left> + <spirit:right>0</spirit:right> + </spirit:vector> + </spirit:wire> + </spirit:port> + <spirit:port> + <spirit:name>HWRITE_ram2</spirit:name> + <spirit:wire> + <spirit:direction>out</spirit:direction> + </spirit:wire> + </spirit:port> + <spirit:port> + <spirit:name>HSIZE_ram2</spirit:name> + <spirit:wire> + <spirit:direction>out</spirit:direction> + <spirit:vector> + <spirit:left>2</spirit:left> + <spirit:right>0</spirit:right> + </spirit:vector> + </spirit:wire> + </spirit:port> + <spirit:port> + <spirit:name>HBURST_ram2</spirit:name> + <spirit:wire> + <spirit:direction>out</spirit:direction> + <spirit:vector> + <spirit:left>2</spirit:left> + <spirit:right>0</spirit:right> + </spirit:vector> + </spirit:wire> + </spirit:port> + <spirit:port> + <spirit:name>HPROT_ram2</spirit:name> + <spirit:wire> + <spirit:direction>out</spirit:direction> + <spirit:vector> + <spirit:left>3</spirit:left> + <spirit:right>0</spirit:right> + </spirit:vector> + </spirit:wire> + </spirit:port> + <spirit:port> + <spirit:name>HMASTER_ram2</spirit:name> + <spirit:wire> + <spirit:direction>out</spirit:direction> + <spirit:vector> + <spirit:left>3</spirit:left> + <spirit:right>0</spirit:right> + </spirit:vector> + </spirit:wire> + </spirit:port> + <spirit:port> + <spirit:name>HWDATA_ram2</spirit:name> + <spirit:wire> + <spirit:direction>out</spirit:direction> + <spirit:vector> + <spirit:left>31</spirit:left> + <spirit:right>0</spirit:right> + </spirit:vector> + </spirit:wire> + </spirit:port> + <spirit:port> + <spirit:name>HMASTLOCK_ram2</spirit:name> + <spirit:wire> + <spirit:direction>out</spirit:direction> + </spirit:wire> + </spirit:port> + <spirit:port> + <spirit:name>HREADYMUX_ram2</spirit:name> + <spirit:wire> + <spirit:direction>out</spirit:direction> + </spirit:wire> + </spirit:port> + <spirit:port> + <spirit:name>HAUSER_ram2</spirit:name> + <spirit:wire> + <spirit:direction>out</spirit:direction> + <spirit:vector> + <spirit:left>1</spirit:left> + <spirit:right>0</spirit:right> + </spirit:vector> + </spirit:wire> + </spirit:port> + <spirit:port> + <spirit:name>HWUSER_ram2</spirit:name> + <spirit:wire> + <spirit:direction>out</spirit:direction> + <spirit:vector> + <spirit:left>1</spirit:left> + <spirit:right>0</spirit:right> + </spirit:vector> + </spirit:wire> + </spirit:port> + <spirit:port> + <spirit:name>HSEL_ram3</spirit:name> + <spirit:wire> + <spirit:direction>out</spirit:direction> + </spirit:wire> + </spirit:port> + <spirit:port> + <spirit:name>HADDR_ram3</spirit:name> + <spirit:wire> + <spirit:direction>out</spirit:direction> + <spirit:vector> + <spirit:left>31</spirit:left> + <spirit:right>0</spirit:right> + </spirit:vector> + </spirit:wire> + </spirit:port> + <spirit:port> + <spirit:name>HTRANS_ram3</spirit:name> + <spirit:wire> + <spirit:direction>out</spirit:direction> + <spirit:vector> + <spirit:left>1</spirit:left> + <spirit:right>0</spirit:right> + </spirit:vector> + </spirit:wire> + </spirit:port> + <spirit:port> + <spirit:name>HWRITE_ram3</spirit:name> + <spirit:wire> + <spirit:direction>out</spirit:direction> + </spirit:wire> + </spirit:port> + <spirit:port> + <spirit:name>HSIZE_ram3</spirit:name> + <spirit:wire> + <spirit:direction>out</spirit:direction> + <spirit:vector> + <spirit:left>2</spirit:left> + <spirit:right>0</spirit:right> + </spirit:vector> + </spirit:wire> + </spirit:port> + <spirit:port> + <spirit:name>HBURST_ram3</spirit:name> + <spirit:wire> + <spirit:direction>out</spirit:direction> + <spirit:vector> + <spirit:left>2</spirit:left> + <spirit:right>0</spirit:right> + </spirit:vector> + </spirit:wire> + </spirit:port> + <spirit:port> + <spirit:name>HPROT_ram3</spirit:name> + <spirit:wire> + <spirit:direction>out</spirit:direction> + <spirit:vector> + <spirit:left>3</spirit:left> + <spirit:right>0</spirit:right> + </spirit:vector> + </spirit:wire> + </spirit:port> + <spirit:port> + <spirit:name>HMASTER_ram3</spirit:name> + <spirit:wire> + <spirit:direction>out</spirit:direction> + <spirit:vector> + <spirit:left>3</spirit:left> + <spirit:right>0</spirit:right> + </spirit:vector> + </spirit:wire> + </spirit:port> + <spirit:port> + <spirit:name>HWDATA_ram3</spirit:name> + <spirit:wire> + <spirit:direction>out</spirit:direction> + <spirit:vector> + <spirit:left>31</spirit:left> + <spirit:right>0</spirit:right> + </spirit:vector> + </spirit:wire> + </spirit:port> + <spirit:port> + <spirit:name>HMASTLOCK_ram3</spirit:name> + <spirit:wire> + <spirit:direction>out</spirit:direction> + </spirit:wire> + </spirit:port> + <spirit:port> + <spirit:name>HREADYMUX_ram3</spirit:name> + <spirit:wire> + <spirit:direction>out</spirit:direction> + </spirit:wire> + </spirit:port> + <spirit:port> + <spirit:name>HAUSER_ram3</spirit:name> + <spirit:wire> + <spirit:direction>out</spirit:direction> + <spirit:vector> + <spirit:left>1</spirit:left> + <spirit:right>0</spirit:right> + </spirit:vector> + </spirit:wire> + </spirit:port> + <spirit:port> + <spirit:name>HWUSER_ram3</spirit:name> + <spirit:wire> + <spirit:direction>out</spirit:direction> + <spirit:vector> + <spirit:left>1</spirit:left> + <spirit:right>0</spirit:right> + </spirit:vector> + </spirit:wire> + </spirit:port> + <spirit:port> + <spirit:name>HSEL_sys</spirit:name> + <spirit:wire> + <spirit:direction>out</spirit:direction> + </spirit:wire> + </spirit:port> + <spirit:port> + <spirit:name>HADDR_sys</spirit:name> + <spirit:wire> + <spirit:direction>out</spirit:direction> + <spirit:vector> + <spirit:left>31</spirit:left> + <spirit:right>0</spirit:right> + </spirit:vector> + </spirit:wire> + </spirit:port> + <spirit:port> + <spirit:name>HTRANS_sys</spirit:name> + <spirit:wire> + <spirit:direction>out</spirit:direction> + <spirit:vector> + <spirit:left>1</spirit:left> + <spirit:right>0</spirit:right> + </spirit:vector> + </spirit:wire> + </spirit:port> + <spirit:port> + <spirit:name>HWRITE_sys</spirit:name> + <spirit:wire> + <spirit:direction>out</spirit:direction> + </spirit:wire> + </spirit:port> + <spirit:port> + <spirit:name>HSIZE_sys</spirit:name> + <spirit:wire> + <spirit:direction>out</spirit:direction> + <spirit:vector> + <spirit:left>2</spirit:left> + <spirit:right>0</spirit:right> + </spirit:vector> + </spirit:wire> + </spirit:port> + <spirit:port> + <spirit:name>HBURST_sys</spirit:name> + <spirit:wire> + <spirit:direction>out</spirit:direction> + <spirit:vector> + <spirit:left>2</spirit:left> + <spirit:right>0</spirit:right> + </spirit:vector> + </spirit:wire> + </spirit:port> + <spirit:port> + <spirit:name>HPROT_sys</spirit:name> + <spirit:wire> + <spirit:direction>out</spirit:direction> + <spirit:vector> + <spirit:left>3</spirit:left> + <spirit:right>0</spirit:right> + </spirit:vector> + </spirit:wire> + </spirit:port> + <spirit:port> + <spirit:name>HMASTER_sys</spirit:name> + <spirit:wire> + <spirit:direction>out</spirit:direction> + <spirit:vector> + <spirit:left>3</spirit:left> + <spirit:right>0</spirit:right> + </spirit:vector> + </spirit:wire> + </spirit:port> + <spirit:port> + <spirit:name>HWDATA_sys</spirit:name> + <spirit:wire> + <spirit:direction>out</spirit:direction> + <spirit:vector> + <spirit:left>31</spirit:left> + <spirit:right>0</spirit:right> + </spirit:vector> + </spirit:wire> + </spirit:port> + <spirit:port> + <spirit:name>HMASTLOCK_sys</spirit:name> + <spirit:wire> + <spirit:direction>out</spirit:direction> + </spirit:wire> + </spirit:port> + <spirit:port> + <spirit:name>HREADYMUX_sys</spirit:name> + <spirit:wire> + <spirit:direction>out</spirit:direction> + </spirit:wire> + </spirit:port> + <spirit:port> + <spirit:name>HAUSER_sys</spirit:name> + <spirit:wire> + <spirit:direction>out</spirit:direction> + <spirit:vector> + <spirit:left>1</spirit:left> + <spirit:right>0</spirit:right> + </spirit:vector> + </spirit:wire> + </spirit:port> + <spirit:port> + <spirit:name>HWUSER_sys</spirit:name> + <spirit:wire> + <spirit:direction>out</spirit:direction> + <spirit:vector> + <spirit:left>1</spirit:left> + <spirit:right>0</spirit:right> + </spirit:vector> + </spirit:wire> + </spirit:port> + <spirit:port> + <spirit:name>HSEL_ram8</spirit:name> + <spirit:wire> + <spirit:direction>out</spirit:direction> + </spirit:wire> + </spirit:port> + <spirit:port> + <spirit:name>HADDR_ram8</spirit:name> + <spirit:wire> + <spirit:direction>out</spirit:direction> + <spirit:vector> + <spirit:left>31</spirit:left> + <spirit:right>0</spirit:right> + </spirit:vector> + </spirit:wire> + </spirit:port> + <spirit:port> + <spirit:name>HTRANS_ram8</spirit:name> + <spirit:wire> + <spirit:direction>out</spirit:direction> + <spirit:vector> + <spirit:left>1</spirit:left> + <spirit:right>0</spirit:right> + </spirit:vector> + </spirit:wire> + </spirit:port> + <spirit:port> + <spirit:name>HWRITE_ram8</spirit:name> + <spirit:wire> + <spirit:direction>out</spirit:direction> + </spirit:wire> + </spirit:port> + <spirit:port> + <spirit:name>HSIZE_ram8</spirit:name> + <spirit:wire> + <spirit:direction>out</spirit:direction> + <spirit:vector> + <spirit:left>2</spirit:left> + <spirit:right>0</spirit:right> + </spirit:vector> + </spirit:wire> + </spirit:port> + <spirit:port> + <spirit:name>HBURST_ram8</spirit:name> + <spirit:wire> + <spirit:direction>out</spirit:direction> + <spirit:vector> + <spirit:left>2</spirit:left> + <spirit:right>0</spirit:right> + </spirit:vector> + </spirit:wire> + </spirit:port> + <spirit:port> + <spirit:name>HPROT_ram8</spirit:name> + <spirit:wire> + <spirit:direction>out</spirit:direction> + <spirit:vector> + <spirit:left>3</spirit:left> + <spirit:right>0</spirit:right> + </spirit:vector> + </spirit:wire> + </spirit:port> + <spirit:port> + <spirit:name>HMASTER_ram8</spirit:name> + <spirit:wire> + <spirit:direction>out</spirit:direction> + <spirit:vector> + <spirit:left>3</spirit:left> + <spirit:right>0</spirit:right> + </spirit:vector> + </spirit:wire> + </spirit:port> + <spirit:port> + <spirit:name>HWDATA_ram8</spirit:name> + <spirit:wire> + <spirit:direction>out</spirit:direction> + <spirit:vector> + <spirit:left>31</spirit:left> + <spirit:right>0</spirit:right> + </spirit:vector> + </spirit:wire> + </spirit:port> + <spirit:port> + <spirit:name>HMASTLOCK_ram8</spirit:name> + <spirit:wire> + <spirit:direction>out</spirit:direction> + </spirit:wire> + </spirit:port> + <spirit:port> + <spirit:name>HREADYMUX_ram8</spirit:name> + <spirit:wire> + <spirit:direction>out</spirit:direction> + </spirit:wire> + </spirit:port> + <spirit:port> + <spirit:name>HAUSER_ram8</spirit:name> + <spirit:wire> + <spirit:direction>out</spirit:direction> + <spirit:vector> + <spirit:left>1</spirit:left> + <spirit:right>0</spirit:right> + </spirit:vector> + </spirit:wire> + </spirit:port> + <spirit:port> + <spirit:name>HWUSER_ram8</spirit:name> + <spirit:wire> + <spirit:direction>out</spirit:direction> + <spirit:vector> + <spirit:left>1</spirit:left> + <spirit:right>0</spirit:right> + </spirit:vector> + </spirit:wire> + </spirit:port> + <spirit:port> + <spirit:name>HSEL_ram9</spirit:name> + <spirit:wire> + <spirit:direction>out</spirit:direction> + </spirit:wire> + </spirit:port> + <spirit:port> + <spirit:name>HADDR_ram9</spirit:name> + <spirit:wire> + <spirit:direction>out</spirit:direction> + <spirit:vector> + <spirit:left>31</spirit:left> + <spirit:right>0</spirit:right> + </spirit:vector> + </spirit:wire> + </spirit:port> + <spirit:port> + <spirit:name>HTRANS_ram9</spirit:name> + <spirit:wire> + <spirit:direction>out</spirit:direction> + <spirit:vector> + <spirit:left>1</spirit:left> + <spirit:right>0</spirit:right> + </spirit:vector> + </spirit:wire> + </spirit:port> + <spirit:port> + <spirit:name>HWRITE_ram9</spirit:name> + <spirit:wire> + <spirit:direction>out</spirit:direction> + </spirit:wire> + </spirit:port> + <spirit:port> + <spirit:name>HSIZE_ram9</spirit:name> + <spirit:wire> + <spirit:direction>out</spirit:direction> + <spirit:vector> + <spirit:left>2</spirit:left> + <spirit:right>0</spirit:right> + </spirit:vector> + </spirit:wire> + </spirit:port> + <spirit:port> + <spirit:name>HBURST_ram9</spirit:name> + <spirit:wire> + <spirit:direction>out</spirit:direction> + <spirit:vector> + <spirit:left>2</spirit:left> + <spirit:right>0</spirit:right> + </spirit:vector> + </spirit:wire> + </spirit:port> + <spirit:port> + <spirit:name>HPROT_ram9</spirit:name> + <spirit:wire> + <spirit:direction>out</spirit:direction> + <spirit:vector> + <spirit:left>3</spirit:left> + <spirit:right>0</spirit:right> + </spirit:vector> + </spirit:wire> + </spirit:port> + <spirit:port> + <spirit:name>HMASTER_ram9</spirit:name> + <spirit:wire> + <spirit:direction>out</spirit:direction> + <spirit:vector> + <spirit:left>3</spirit:left> + <spirit:right>0</spirit:right> + </spirit:vector> + </spirit:wire> + </spirit:port> + <spirit:port> + <spirit:name>HWDATA_ram9</spirit:name> + <spirit:wire> + <spirit:direction>out</spirit:direction> + <spirit:vector> + <spirit:left>31</spirit:left> + <spirit:right>0</spirit:right> + </spirit:vector> + </spirit:wire> + </spirit:port> + <spirit:port> + <spirit:name>HMASTLOCK_ram9</spirit:name> + <spirit:wire> + <spirit:direction>out</spirit:direction> + </spirit:wire> + </spirit:port> + <spirit:port> + <spirit:name>HREADYMUX_ram9</spirit:name> + <spirit:wire> + <spirit:direction>out</spirit:direction> + </spirit:wire> + </spirit:port> + <spirit:port> + <spirit:name>HAUSER_ram9</spirit:name> + <spirit:wire> + <spirit:direction>out</spirit:direction> + <spirit:vector> + <spirit:left>1</spirit:left> + <spirit:right>0</spirit:right> + </spirit:vector> + </spirit:wire> + </spirit:port> + <spirit:port> + <spirit:name>HWUSER_ram9</spirit:name> + <spirit:wire> + <spirit:direction>out</spirit:direction> + <spirit:vector> + <spirit:left>1</spirit:left> + <spirit:right>0</spirit:right> + </spirit:vector> + </spirit:wire> + </spirit:port> + <spirit:port> + <spirit:name>HSEL_exp</spirit:name> + <spirit:wire> + <spirit:direction>out</spirit:direction> + </spirit:wire> + </spirit:port> + <spirit:port> + <spirit:name>HADDR_exp</spirit:name> + <spirit:wire> + <spirit:direction>out</spirit:direction> + <spirit:vector> + <spirit:left>31</spirit:left> + <spirit:right>0</spirit:right> + </spirit:vector> + </spirit:wire> + </spirit:port> + <spirit:port> + <spirit:name>HTRANS_exp</spirit:name> + <spirit:wire> + <spirit:direction>out</spirit:direction> + <spirit:vector> + <spirit:left>1</spirit:left> + <spirit:right>0</spirit:right> + </spirit:vector> + </spirit:wire> + </spirit:port> + <spirit:port> + <spirit:name>HWRITE_exp</spirit:name> + <spirit:wire> + <spirit:direction>out</spirit:direction> + </spirit:wire> + </spirit:port> + <spirit:port> + <spirit:name>HSIZE_exp</spirit:name> + <spirit:wire> + <spirit:direction>out</spirit:direction> + <spirit:vector> + <spirit:left>2</spirit:left> + <spirit:right>0</spirit:right> + </spirit:vector> + </spirit:wire> + </spirit:port> + <spirit:port> + <spirit:name>HBURST_exp</spirit:name> + <spirit:wire> + <spirit:direction>out</spirit:direction> + <spirit:vector> + <spirit:left>2</spirit:left> + <spirit:right>0</spirit:right> + </spirit:vector> + </spirit:wire> + </spirit:port> + <spirit:port> + <spirit:name>HPROT_exp</spirit:name> + <spirit:wire> + <spirit:direction>out</spirit:direction> + <spirit:vector> + <spirit:left>3</spirit:left> + <spirit:right>0</spirit:right> + </spirit:vector> + </spirit:wire> + </spirit:port> + <spirit:port> + <spirit:name>HMASTER_exp</spirit:name> + <spirit:wire> + <spirit:direction>out</spirit:direction> + <spirit:vector> + <spirit:left>3</spirit:left> + <spirit:right>0</spirit:right> + </spirit:vector> + </spirit:wire> + </spirit:port> + <spirit:port> + <spirit:name>HWDATA_exp</spirit:name> + <spirit:wire> + <spirit:direction>out</spirit:direction> + <spirit:vector> + <spirit:left>31</spirit:left> + <spirit:right>0</spirit:right> + </spirit:vector> + </spirit:wire> + </spirit:port> + <spirit:port> + <spirit:name>HMASTLOCK_exp</spirit:name> + <spirit:wire> + <spirit:direction>out</spirit:direction> + </spirit:wire> + </spirit:port> + <spirit:port> + <spirit:name>HREADYMUX_exp</spirit:name> + <spirit:wire> + <spirit:direction>out</spirit:direction> + </spirit:wire> + </spirit:port> + <spirit:port> + <spirit:name>HAUSER_exp</spirit:name> + <spirit:wire> + <spirit:direction>out</spirit:direction> + <spirit:vector> + <spirit:left>1</spirit:left> + <spirit:right>0</spirit:right> + </spirit:vector> + </spirit:wire> + </spirit:port> + <spirit:port> + <spirit:name>HWUSER_exp</spirit:name> + <spirit:wire> + <spirit:direction>out</spirit:direction> + <spirit:vector> + <spirit:left>1</spirit:left> + <spirit:right>0</spirit:right> + </spirit:vector> + </spirit:wire> + </spirit:port> + + <!-- Output signals of Slave interfaces --> + + <spirit:port> + <spirit:name>HRDATA_adp</spirit:name> + <spirit:wire> + <spirit:direction>out</spirit:direction> + <spirit:vector> + <spirit:left>31</spirit:left> + <spirit:right>0</spirit:right> + </spirit:vector> + </spirit:wire> + </spirit:port> + <spirit:port> + <spirit:name>HREADYOUT_adp</spirit:name> + <spirit:wire> + <spirit:direction>out</spirit:direction> + </spirit:wire> + </spirit:port> + <spirit:port> + <spirit:name>HRESP_adp</spirit:name> + <spirit:wire> + <spirit:direction>out</spirit:direction> + <spirit:vector> + <spirit:left>1</spirit:left> + <spirit:right>0</spirit:right> + </spirit:vector> + </spirit:wire> + </spirit:port> + <spirit:port> + <spirit:name>HRUSER_adp</spirit:name> + <spirit:wire> + <spirit:direction>out</spirit:direction> + <spirit:vector> + <spirit:left>1</spirit:left> + <spirit:right>0</spirit:right> + </spirit:vector> + </spirit:wire> + </spirit:port> + <spirit:port> + <spirit:name>HRDATA_dma</spirit:name> + <spirit:wire> + <spirit:direction>out</spirit:direction> + <spirit:vector> + <spirit:left>31</spirit:left> + <spirit:right>0</spirit:right> + </spirit:vector> + </spirit:wire> + </spirit:port> + <spirit:port> + <spirit:name>HREADYOUT_dma</spirit:name> + <spirit:wire> + <spirit:direction>out</spirit:direction> + </spirit:wire> + </spirit:port> + <spirit:port> + <spirit:name>HRESP_dma</spirit:name> + <spirit:wire> + <spirit:direction>out</spirit:direction> + <spirit:vector> + <spirit:left>1</spirit:left> + <spirit:right>0</spirit:right> + </spirit:vector> + </spirit:wire> + </spirit:port> + <spirit:port> + <spirit:name>HRUSER_dma</spirit:name> + <spirit:wire> + <spirit:direction>out</spirit:direction> + <spirit:vector> + <spirit:left>1</spirit:left> + <spirit:right>0</spirit:right> + </spirit:vector> + </spirit:wire> + </spirit:port> + <spirit:port> + <spirit:name>HRDATA_dma2</spirit:name> + <spirit:wire> + <spirit:direction>out</spirit:direction> + <spirit:vector> + <spirit:left>31</spirit:left> + <spirit:right>0</spirit:right> + </spirit:vector> + </spirit:wire> + </spirit:port> + <spirit:port> + <spirit:name>HREADYOUT_dma2</spirit:name> + <spirit:wire> + <spirit:direction>out</spirit:direction> + </spirit:wire> + </spirit:port> + <spirit:port> + <spirit:name>HRESP_dma2</spirit:name> + <spirit:wire> + <spirit:direction>out</spirit:direction> + <spirit:vector> + <spirit:left>1</spirit:left> + <spirit:right>0</spirit:right> + </spirit:vector> + </spirit:wire> + </spirit:port> + <spirit:port> + <spirit:name>HRUSER_dma2</spirit:name> + <spirit:wire> + <spirit:direction>out</spirit:direction> + <spirit:vector> + <spirit:left>1</spirit:left> + <spirit:right>0</spirit:right> + </spirit:vector> + </spirit:wire> + </spirit:port> + <spirit:port> + <spirit:name>HRDATA_cpu</spirit:name> + <spirit:wire> + <spirit:direction>out</spirit:direction> + <spirit:vector> + <spirit:left>31</spirit:left> + <spirit:right>0</spirit:right> + </spirit:vector> + </spirit:wire> + </spirit:port> + <spirit:port> + <spirit:name>HREADYOUT_cpu</spirit:name> + <spirit:wire> + <spirit:direction>out</spirit:direction> + </spirit:wire> + </spirit:port> + <spirit:port> + <spirit:name>HRESP_cpu</spirit:name> + <spirit:wire> + <spirit:direction>out</spirit:direction> + <spirit:vector> + <spirit:left>1</spirit:left> + <spirit:right>0</spirit:right> + </spirit:vector> + </spirit:wire> + </spirit:port> + <spirit:port> + <spirit:name>HRUSER_cpu</spirit:name> + <spirit:wire> + <spirit:direction>out</spirit:direction> + <spirit:vector> + <spirit:left>1</spirit:left> + <spirit:right>0</spirit:right> + </spirit:vector> + </spirit:wire> + </spirit:port> + + <!-- Scan test dummy signals; not connected until scan insertion --> + + <spirit:port> + <spirit:name>SCANOUTHCLK</spirit:name> + <spirit:wire> + <spirit:direction>out</spirit:direction> + </spirit:wire> + </spirit:port> + </spirit:ports> + </spirit:model> + + <spirit:fileSets> + <spirit:fileSet> + <spirit:name>fs-verilogsource</spirit:name> + <spirit:displayName/> + <spirit:description>File list for soclabs_4x7_AhbMatrix</spirit:description> + <spirit:file> + <spirit:name>../../../verilog/built/soclabs_4x7_AhbMatrix/soclabs_4x7_AhbMatrix.v</spirit:name> + <spirit:fileType>verilogSource-2001</spirit:fileType> + <spirit:isIncludeFile spirit:externalDeclarations="true">false</spirit:isIncludeFile> + </spirit:file> + <spirit:file> + <spirit:name>../../../verilog/built/soclabs_4x7_AhbMatrix/soclabs_4x7_AhbMatrix_default_slave.v</spirit:name> + <spirit:fileType>verilogSource-2001</spirit:fileType> + </spirit:file> + <spirit:file> + <spirit:name>../../../verilog/built/soclabs_4x7_AhbMatrix/soclabs_4x7_MasterInput.v</spirit:name> + <spirit:fileType>verilogSource-2001</spirit:fileType> + </spirit:file> + <spirit:file> + <spirit:name>../../../verilog/built/soclabs_4x7_AhbMatrix/soclabs_4x7_MatrixDecode_adp.v</spirit:name> + <spirit:fileType>verilogSource-2001</spirit:fileType> + </spirit:file> + <spirit:file> + <spirit:name>../../../verilog/built/soclabs_4x7_AhbMatrix/soclabs_4x7_MatrixDecode_dma.v</spirit:name> + <spirit:fileType>verilogSource-2001</spirit:fileType> + </spirit:file> + <spirit:file> + <spirit:name>../../../verilog/built/soclabs_4x7_AhbMatrix/soclabs_4x7_MatrixDecode_dma2.v</spirit:name> + <spirit:fileType>verilogSource-2001</spirit:fileType> + </spirit:file> + <spirit:file> + <spirit:name>../../../verilog/built/soclabs_4x7_AhbMatrix/soclabs_4x7_MatrixDecode_cpu.v</spirit:name> + <spirit:fileType>verilogSource-2001</spirit:fileType> + </spirit:file> + <spirit:file> + <spirit:name>../../../verilog/built/soclabs_4x7_AhbMatrix/soclabs_4x7_Arbiter.v</spirit:name> + <spirit:fileType>verilogSource-2001</spirit:fileType> + </spirit:file> + <spirit:file> + <spirit:name>../../../verilog/built/soclabs_4x7_AhbMatrix/soclabs_4x7_SlaveOutput.v</spirit:name> + <spirit:fileType>verilogSource-2001</spirit:fileType> + </spirit:file> + </spirit:fileSet> + </spirit:fileSets> + + <spirit:description>soclabs_4x7_AhbMatrix</spirit:description> + +</spirit:component> diff --git a/Cortex-M0/nanosoc/systems/mcu/verilog/gen_ahb_busmatrix/ipxact/built/soclabs_4x7_AhbMatrix/soclabs_4x7_AhbMatrix_lite.xml b/Cortex-M0/nanosoc/systems/mcu/verilog/gen_ahb_busmatrix/ipxact/built/soclabs_4x7_AhbMatrix/soclabs_4x7_AhbMatrix_lite.xml new file mode 100644 index 0000000..787baeb --- /dev/null +++ b/Cortex-M0/nanosoc/systems/mcu/verilog/gen_ahb_busmatrix/ipxact/built/soclabs_4x7_AhbMatrix/soclabs_4x7_AhbMatrix_lite.xml @@ -0,0 +1,3902 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - --> +<!-- The confidential and proprietary information contained in this file may --> +<!-- only be used by a person authorised under and to the extent permitted --> +<!-- by a subsisting licensing agreement from ARM Limited or its affiliates. --> +<!-- --> +<!-- (C) COPYRIGHT 2001-2017 ARM Limited or its affiliates. --> +<!-- ALL RIGHTS RESERVED --> +<!-- --> +<!-- This entire notice must be reproduced on all copies of this file --> +<!-- and copies of this file may only be made by a person if such person is --> +<!-- permitted to do so under the terms of a subsisting license agreement --> +<!-- from ARM Limited or its affiliates. --> +<!-- --> +<!-- SVN Information --> +<!-- --> +<!-- Checked In : $Date: 2017-10-10 15:55:38 +0100 (Tue, 10 Oct 2017) $ --> +<!-- --> +<!-- Revision : $Revision: 371321 $ --> +<!-- --> +<!-- Release Information : Cortex-M System Design Kit-r1p1-00rel0 --> +<!-- --> +<!-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - --> +<!-- Purpose : IP-XACT description for the AHB-Lite wrapper of soclabs_4x7_AhbMatrix_lite --> +<!-- --> +<!-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - --> + +<spirit:component xmlns:spirit="http://www.spiritconsortium.org/XMLSchema/SPIRIT/1685-2009" + xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:schemaLocation="http://www.spiritconsortium.org/XMLSchema/SPIRIT/1685-2009 http://www.spiritconsortium.org/XMLSchema/SPIRIT/1685-2009/index.xsd"> + <spirit:vendor>arm.com</spirit:vendor> + <spirit:library>CoreLink</spirit:library> + <spirit:name>soclabs_4x7_AhbMatrix_lite</spirit:name> + <spirit:version>r0p0_0</spirit:version> + + <spirit:busInterfaces> + + <!--Slave interfaces --> + + <spirit:busInterface> + <spirit:name>AHBLiteInitiator_Slave__adp</spirit:name> + <spirit:description>Slave port _adp</spirit:description> + <spirit:busType spirit:library="AMBA3" spirit:name="AHBLiteInitiator" spirit:vendor="amba.com" spirit:version="r2p0_0"/> + <spirit:abstractionType spirit:library="AMBA3" spirit:name="AHBLiteInitiator_rtl" spirit:vendor="amba.com" spirit:version="r2p0_0"/> + <spirit:slave> + <spirit:memoryMapRef spirit:memoryMapRef="AHBLiteInitiator_Slave__adp_MM"/> + <spirit:bridge spirit:masterRef="AHBLiteTarget_Master__rom1" spirit:opaque="true"/> + <spirit:bridge spirit:masterRef="AHBLiteTarget_Master__ram2" spirit:opaque="true"/> + <spirit:bridge spirit:masterRef="AHBLiteTarget_Master__ram3" spirit:opaque="true"/> + <spirit:bridge spirit:masterRef="AHBLiteTarget_Master__sys" spirit:opaque="true"/> + <spirit:bridge spirit:masterRef="AHBLiteTarget_Master__ram8" spirit:opaque="true"/> + <spirit:bridge spirit:masterRef="AHBLiteTarget_Master__ram9" spirit:opaque="true"/> + <spirit:bridge spirit:masterRef="AHBLiteTarget_Master__exp" spirit:opaque="true"/> + </spirit:slave> + + <spirit:portMaps> + <!-- Clock/reset --> + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>HCLK</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>HCLK</spirit:name> + </spirit:physicalPort> + </spirit:portMap> + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>HRESETn</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>HRESETn</spirit:name> + </spirit:physicalPort> + </spirit:portMap> + <!-- Inputs --> + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>HADDR</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>HADDR_adp</spirit:name> + </spirit:physicalPort> + </spirit:portMap> + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>HTRANS</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>HTRANS_adp</spirit:name> + </spirit:physicalPort> + </spirit:portMap> + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>HWRITE</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>HWRITE_adp</spirit:name> + </spirit:physicalPort> + </spirit:portMap> + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>HSIZE</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>HSIZE_adp</spirit:name> + </spirit:physicalPort> + </spirit:portMap> + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>HBURST</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>HBURST_adp</spirit:name> + </spirit:physicalPort> + </spirit:portMap> + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>HPROT</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>HPROT_adp</spirit:name> + </spirit:physicalPort> + </spirit:portMap> + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>HWDATA</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>HWDATA_adp</spirit:name> + </spirit:physicalPort> + </spirit:portMap> + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>HMASTLOCK</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>HMASTLOCK_adp</spirit:name> + </spirit:physicalPort> + </spirit:portMap> + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>HAUSER</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>HAUSER_adp</spirit:name> + </spirit:physicalPort> + </spirit:portMap> + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>HWUSER</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>HWUSER_adp</spirit:name> + </spirit:physicalPort> + </spirit:portMap> + + <!-- Outputs --> + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>HRDATA</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>HRDATA_adp</spirit:name> + </spirit:physicalPort> + </spirit:portMap> + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>HREADY</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>HREADY_adp</spirit:name> + </spirit:physicalPort> + </spirit:portMap> + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>HRESP</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>HRESP_adp</spirit:name> + </spirit:physicalPort> + </spirit:portMap> + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>HRUSER</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>HRUSER_adp</spirit:name> + </spirit:physicalPort> + </spirit:portMap> + </spirit:portMaps> + </spirit:busInterface> + + <spirit:busInterface> + <spirit:name>AHBLiteInitiator_Slave__dma</spirit:name> + <spirit:description>Slave port _dma</spirit:description> + <spirit:busType spirit:library="AMBA3" spirit:name="AHBLiteInitiator" spirit:vendor="amba.com" spirit:version="r2p0_0"/> + <spirit:abstractionType spirit:library="AMBA3" spirit:name="AHBLiteInitiator_rtl" spirit:vendor="amba.com" spirit:version="r2p0_0"/> + <spirit:slave> + <spirit:memoryMapRef spirit:memoryMapRef="AHBLiteInitiator_Slave__dma_MM"/> + <spirit:bridge spirit:masterRef="AHBLiteTarget_Master__rom1" spirit:opaque="true"/> + <spirit:bridge spirit:masterRef="AHBLiteTarget_Master__ram2" spirit:opaque="true"/> + <spirit:bridge spirit:masterRef="AHBLiteTarget_Master__ram3" spirit:opaque="true"/> + <spirit:bridge spirit:masterRef="AHBLiteTarget_Master__sys" spirit:opaque="true"/> + <spirit:bridge spirit:masterRef="AHBLiteTarget_Master__ram8" spirit:opaque="true"/> + <spirit:bridge spirit:masterRef="AHBLiteTarget_Master__ram9" spirit:opaque="true"/> + <spirit:bridge spirit:masterRef="AHBLiteTarget_Master__exp" spirit:opaque="true"/> + </spirit:slave> + + <spirit:portMaps> + <!-- Clock/reset --> + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>HCLK</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>HCLK</spirit:name> + </spirit:physicalPort> + </spirit:portMap> + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>HRESETn</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>HRESETn</spirit:name> + </spirit:physicalPort> + </spirit:portMap> + <!-- Inputs --> + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>HADDR</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>HADDR_dma</spirit:name> + </spirit:physicalPort> + </spirit:portMap> + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>HTRANS</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>HTRANS_dma</spirit:name> + </spirit:physicalPort> + </spirit:portMap> + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>HWRITE</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>HWRITE_dma</spirit:name> + </spirit:physicalPort> + </spirit:portMap> + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>HSIZE</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>HSIZE_dma</spirit:name> + </spirit:physicalPort> + </spirit:portMap> + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>HBURST</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>HBURST_dma</spirit:name> + </spirit:physicalPort> + </spirit:portMap> + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>HPROT</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>HPROT_dma</spirit:name> + </spirit:physicalPort> + </spirit:portMap> + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>HWDATA</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>HWDATA_dma</spirit:name> + </spirit:physicalPort> + </spirit:portMap> + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>HMASTLOCK</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>HMASTLOCK_dma</spirit:name> + </spirit:physicalPort> + </spirit:portMap> + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>HAUSER</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>HAUSER_dma</spirit:name> + </spirit:physicalPort> + </spirit:portMap> + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>HWUSER</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>HWUSER_dma</spirit:name> + </spirit:physicalPort> + </spirit:portMap> + + <!-- Outputs --> + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>HRDATA</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>HRDATA_dma</spirit:name> + </spirit:physicalPort> + </spirit:portMap> + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>HREADY</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>HREADY_dma</spirit:name> + </spirit:physicalPort> + </spirit:portMap> + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>HRESP</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>HRESP_dma</spirit:name> + </spirit:physicalPort> + </spirit:portMap> + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>HRUSER</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>HRUSER_dma</spirit:name> + </spirit:physicalPort> + </spirit:portMap> + </spirit:portMaps> + </spirit:busInterface> + + <spirit:busInterface> + <spirit:name>AHBLiteInitiator_Slave__dma2</spirit:name> + <spirit:description>Slave port _dma2</spirit:description> + <spirit:busType spirit:library="AMBA3" spirit:name="AHBLiteInitiator" spirit:vendor="amba.com" spirit:version="r2p0_0"/> + <spirit:abstractionType spirit:library="AMBA3" spirit:name="AHBLiteInitiator_rtl" spirit:vendor="amba.com" spirit:version="r2p0_0"/> + <spirit:slave> + <spirit:memoryMapRef spirit:memoryMapRef="AHBLiteInitiator_Slave__dma2_MM"/> + <spirit:bridge spirit:masterRef="AHBLiteTarget_Master__rom1" spirit:opaque="true"/> + <spirit:bridge spirit:masterRef="AHBLiteTarget_Master__ram2" spirit:opaque="true"/> + <spirit:bridge spirit:masterRef="AHBLiteTarget_Master__ram3" spirit:opaque="true"/> + <spirit:bridge spirit:masterRef="AHBLiteTarget_Master__sys" spirit:opaque="true"/> + <spirit:bridge spirit:masterRef="AHBLiteTarget_Master__ram8" spirit:opaque="true"/> + <spirit:bridge spirit:masterRef="AHBLiteTarget_Master__ram9" spirit:opaque="true"/> + <spirit:bridge spirit:masterRef="AHBLiteTarget_Master__exp" spirit:opaque="true"/> + </spirit:slave> + + <spirit:portMaps> + <!-- Clock/reset --> + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>HCLK</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>HCLK</spirit:name> + </spirit:physicalPort> + </spirit:portMap> + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>HRESETn</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>HRESETn</spirit:name> + </spirit:physicalPort> + </spirit:portMap> + <!-- Inputs --> + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>HADDR</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>HADDR_dma2</spirit:name> + </spirit:physicalPort> + </spirit:portMap> + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>HTRANS</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>HTRANS_dma2</spirit:name> + </spirit:physicalPort> + </spirit:portMap> + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>HWRITE</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>HWRITE_dma2</spirit:name> + </spirit:physicalPort> + </spirit:portMap> + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>HSIZE</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>HSIZE_dma2</spirit:name> + </spirit:physicalPort> + </spirit:portMap> + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>HBURST</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>HBURST_dma2</spirit:name> + </spirit:physicalPort> + </spirit:portMap> + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>HPROT</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>HPROT_dma2</spirit:name> + </spirit:physicalPort> + </spirit:portMap> + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>HWDATA</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>HWDATA_dma2</spirit:name> + </spirit:physicalPort> + </spirit:portMap> + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>HMASTLOCK</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>HMASTLOCK_dma2</spirit:name> + </spirit:physicalPort> + </spirit:portMap> + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>HAUSER</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>HAUSER_dma2</spirit:name> + </spirit:physicalPort> + </spirit:portMap> + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>HWUSER</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>HWUSER_dma2</spirit:name> + </spirit:physicalPort> + </spirit:portMap> + + <!-- Outputs --> + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>HRDATA</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>HRDATA_dma2</spirit:name> + </spirit:physicalPort> + </spirit:portMap> + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>HREADY</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>HREADY_dma2</spirit:name> + </spirit:physicalPort> + </spirit:portMap> + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>HRESP</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>HRESP_dma2</spirit:name> + </spirit:physicalPort> + </spirit:portMap> + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>HRUSER</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>HRUSER_dma2</spirit:name> + </spirit:physicalPort> + </spirit:portMap> + </spirit:portMaps> + </spirit:busInterface> + + <spirit:busInterface> + <spirit:name>AHBLiteInitiator_Slave__cpu</spirit:name> + <spirit:description>Slave port _cpu</spirit:description> + <spirit:busType spirit:library="AMBA3" spirit:name="AHBLiteInitiator" spirit:vendor="amba.com" spirit:version="r2p0_0"/> + <spirit:abstractionType spirit:library="AMBA3" spirit:name="AHBLiteInitiator_rtl" spirit:vendor="amba.com" spirit:version="r2p0_0"/> + <spirit:slave> + <spirit:memoryMapRef spirit:memoryMapRef="AHBLiteInitiator_Slave__cpu_MM"/> + <spirit:bridge spirit:masterRef="AHBLiteTarget_Master__rom1" spirit:opaque="true"/> + <spirit:bridge spirit:masterRef="AHBLiteTarget_Master__ram2" spirit:opaque="true"/> + <spirit:bridge spirit:masterRef="AHBLiteTarget_Master__ram3" spirit:opaque="true"/> + <spirit:bridge spirit:masterRef="AHBLiteTarget_Master__sys" spirit:opaque="true"/> + <spirit:bridge spirit:masterRef="AHBLiteTarget_Master__ram8" spirit:opaque="true"/> + <spirit:bridge spirit:masterRef="AHBLiteTarget_Master__ram9" spirit:opaque="true"/> + <spirit:bridge spirit:masterRef="AHBLiteTarget_Master__exp" spirit:opaque="true"/> + </spirit:slave> + + <spirit:portMaps> + <!-- Clock/reset --> + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>HCLK</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>HCLK</spirit:name> + </spirit:physicalPort> + </spirit:portMap> + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>HRESETn</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>HRESETn</spirit:name> + </spirit:physicalPort> + </spirit:portMap> + <!-- Inputs --> + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>HADDR</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>HADDR_cpu</spirit:name> + </spirit:physicalPort> + </spirit:portMap> + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>HTRANS</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>HTRANS_cpu</spirit:name> + </spirit:physicalPort> + </spirit:portMap> + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>HWRITE</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>HWRITE_cpu</spirit:name> + </spirit:physicalPort> + </spirit:portMap> + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>HSIZE</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>HSIZE_cpu</spirit:name> + </spirit:physicalPort> + </spirit:portMap> + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>HBURST</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>HBURST_cpu</spirit:name> + </spirit:physicalPort> + </spirit:portMap> + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>HPROT</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>HPROT_cpu</spirit:name> + </spirit:physicalPort> + </spirit:portMap> + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>HWDATA</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>HWDATA_cpu</spirit:name> + </spirit:physicalPort> + </spirit:portMap> + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>HMASTLOCK</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>HMASTLOCK_cpu</spirit:name> + </spirit:physicalPort> + </spirit:portMap> + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>HAUSER</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>HAUSER_cpu</spirit:name> + </spirit:physicalPort> + </spirit:portMap> + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>HWUSER</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>HWUSER_cpu</spirit:name> + </spirit:physicalPort> + </spirit:portMap> + + <!-- Outputs --> + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>HRDATA</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>HRDATA_cpu</spirit:name> + </spirit:physicalPort> + </spirit:portMap> + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>HREADY</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>HREADY_cpu</spirit:name> + </spirit:physicalPort> + </spirit:portMap> + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>HRESP</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>HRESP_cpu</spirit:name> + </spirit:physicalPort> + </spirit:portMap> + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>HRUSER</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>HRUSER_cpu</spirit:name> + </spirit:physicalPort> + </spirit:portMap> + </spirit:portMaps> + </spirit:busInterface> + + <!--Master interfaces --> + + <spirit:busInterface> + <spirit:name>AHBLiteTarget_Master__rom1</spirit:name> + <spirit:description>Master port _rom1</spirit:description> + <spirit:busType spirit:library="AMBA3" spirit:name="AHBLiteTarget" spirit:vendor="amba.com" spirit:version="r2p0_0"/> + <spirit:abstractionType spirit:library="AMBA3" spirit:name="AHBLiteTarget_rtl" spirit:vendor="amba.com" spirit:version="r2p0_0"/> + <spirit:master> + <spirit:addressSpaceRef spirit:addressSpaceRef="AHBLiteTarget_Master__rom1_AS"/> + </spirit:master> + + <spirit:portMaps> + <!-- Clock/reset --> + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>HCLK</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>HCLK</spirit:name> + </spirit:physicalPort> + </spirit:portMap> + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>HRESETn</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>HRESETn</spirit:name> + </spirit:physicalPort> + </spirit:portMap> + <!-- Outputs --> + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>HSELx</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>HSEL_rom1</spirit:name> + </spirit:physicalPort> + </spirit:portMap> + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>HADDR</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>HADDR_rom1</spirit:name> + </spirit:physicalPort> + </spirit:portMap> + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>HTRANS</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>HTRANS_rom1</spirit:name> + </spirit:physicalPort> + </spirit:portMap> + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>HWRITE</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>HWRITE_rom1</spirit:name> + </spirit:physicalPort> + </spirit:portMap> + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>HSIZE</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>HSIZE_rom1</spirit:name> + </spirit:physicalPort> + </spirit:portMap> + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>HBURST</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>HBURST_rom1</spirit:name> + </spirit:physicalPort> + </spirit:portMap> + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>HPROT</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>HPROT_rom1</spirit:name> + </spirit:physicalPort> + </spirit:portMap> + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>HWDATA</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>HWDATA_rom1</spirit:name> + </spirit:physicalPort> + </spirit:portMap> + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>HMASTLOCK</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>HMASTLOCK_rom1</spirit:name> + </spirit:physicalPort> + </spirit:portMap> + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>HREADY</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>HREADYMUX_rom1</spirit:name> + </spirit:physicalPort> + </spirit:portMap> + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>HAUSER</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>HAUSER_rom1</spirit:name> + </spirit:physicalPort> + </spirit:portMap> + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>HWUSER</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>HWUSER_rom1</spirit:name> + </spirit:physicalPort> + </spirit:portMap> + + <!-- Inputs --> + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>HRDATA</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>HRDATA_rom1</spirit:name> + </spirit:physicalPort> + </spirit:portMap> + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>HREADYOUT</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>HREADYOUT_rom1</spirit:name> + </spirit:physicalPort> + </spirit:portMap> + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>HRESP</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>HRESP_rom1</spirit:name> + </spirit:physicalPort> + </spirit:portMap> + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>HRUSER</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>HRUSER_rom1</spirit:name> + </spirit:physicalPort> + </spirit:portMap> + </spirit:portMaps> + </spirit:busInterface> + + <spirit:busInterface> + <spirit:name>AHBLiteTarget_Master__ram2</spirit:name> + <spirit:description>Master port _ram2</spirit:description> + <spirit:busType spirit:library="AMBA3" spirit:name="AHBLiteTarget" spirit:vendor="amba.com" spirit:version="r2p0_0"/> + <spirit:abstractionType spirit:library="AMBA3" spirit:name="AHBLiteTarget_rtl" spirit:vendor="amba.com" spirit:version="r2p0_0"/> + <spirit:master> + <spirit:addressSpaceRef spirit:addressSpaceRef="AHBLiteTarget_Master__ram2_AS"/> + </spirit:master> + + <spirit:portMaps> + <!-- Clock/reset --> + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>HCLK</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>HCLK</spirit:name> + </spirit:physicalPort> + </spirit:portMap> + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>HRESETn</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>HRESETn</spirit:name> + </spirit:physicalPort> + </spirit:portMap> + <!-- Outputs --> + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>HSELx</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>HSEL_ram2</spirit:name> + </spirit:physicalPort> + </spirit:portMap> + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>HADDR</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>HADDR_ram2</spirit:name> + </spirit:physicalPort> + </spirit:portMap> + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>HTRANS</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>HTRANS_ram2</spirit:name> + </spirit:physicalPort> + </spirit:portMap> + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>HWRITE</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>HWRITE_ram2</spirit:name> + </spirit:physicalPort> + </spirit:portMap> + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>HSIZE</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>HSIZE_ram2</spirit:name> + </spirit:physicalPort> + </spirit:portMap> + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>HBURST</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>HBURST_ram2</spirit:name> + </spirit:physicalPort> + </spirit:portMap> + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>HPROT</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>HPROT_ram2</spirit:name> + </spirit:physicalPort> + </spirit:portMap> + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>HWDATA</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>HWDATA_ram2</spirit:name> + </spirit:physicalPort> + </spirit:portMap> + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>HMASTLOCK</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>HMASTLOCK_ram2</spirit:name> + </spirit:physicalPort> + </spirit:portMap> + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>HREADY</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>HREADYMUX_ram2</spirit:name> + </spirit:physicalPort> + </spirit:portMap> + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>HAUSER</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>HAUSER_ram2</spirit:name> + </spirit:physicalPort> + </spirit:portMap> + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>HWUSER</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>HWUSER_ram2</spirit:name> + </spirit:physicalPort> + </spirit:portMap> + + <!-- Inputs --> + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>HRDATA</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>HRDATA_ram2</spirit:name> + </spirit:physicalPort> + </spirit:portMap> + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>HREADYOUT</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>HREADYOUT_ram2</spirit:name> + </spirit:physicalPort> + </spirit:portMap> + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>HRESP</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>HRESP_ram2</spirit:name> + </spirit:physicalPort> + </spirit:portMap> + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>HRUSER</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>HRUSER_ram2</spirit:name> + </spirit:physicalPort> + </spirit:portMap> + </spirit:portMaps> + </spirit:busInterface> + + <spirit:busInterface> + <spirit:name>AHBLiteTarget_Master__ram3</spirit:name> + <spirit:description>Master port _ram3</spirit:description> + <spirit:busType spirit:library="AMBA3" spirit:name="AHBLiteTarget" spirit:vendor="amba.com" spirit:version="r2p0_0"/> + <spirit:abstractionType spirit:library="AMBA3" spirit:name="AHBLiteTarget_rtl" spirit:vendor="amba.com" spirit:version="r2p0_0"/> + <spirit:master> + <spirit:addressSpaceRef spirit:addressSpaceRef="AHBLiteTarget_Master__ram3_AS"/> + </spirit:master> + + <spirit:portMaps> + <!-- Clock/reset --> + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>HCLK</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>HCLK</spirit:name> + </spirit:physicalPort> + </spirit:portMap> + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>HRESETn</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>HRESETn</spirit:name> + </spirit:physicalPort> + </spirit:portMap> + <!-- Outputs --> + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>HSELx</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>HSEL_ram3</spirit:name> + </spirit:physicalPort> + </spirit:portMap> + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>HADDR</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>HADDR_ram3</spirit:name> + </spirit:physicalPort> + </spirit:portMap> + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>HTRANS</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>HTRANS_ram3</spirit:name> + </spirit:physicalPort> + </spirit:portMap> + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>HWRITE</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>HWRITE_ram3</spirit:name> + </spirit:physicalPort> + </spirit:portMap> + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>HSIZE</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>HSIZE_ram3</spirit:name> + </spirit:physicalPort> + </spirit:portMap> + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>HBURST</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>HBURST_ram3</spirit:name> + </spirit:physicalPort> + </spirit:portMap> + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>HPROT</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>HPROT_ram3</spirit:name> + </spirit:physicalPort> + </spirit:portMap> + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>HWDATA</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>HWDATA_ram3</spirit:name> + </spirit:physicalPort> + </spirit:portMap> + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>HMASTLOCK</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>HMASTLOCK_ram3</spirit:name> + </spirit:physicalPort> + </spirit:portMap> + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>HREADY</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>HREADYMUX_ram3</spirit:name> + </spirit:physicalPort> + </spirit:portMap> + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>HAUSER</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>HAUSER_ram3</spirit:name> + </spirit:physicalPort> + </spirit:portMap> + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>HWUSER</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>HWUSER_ram3</spirit:name> + </spirit:physicalPort> + </spirit:portMap> + + <!-- Inputs --> + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>HRDATA</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>HRDATA_ram3</spirit:name> + </spirit:physicalPort> + </spirit:portMap> + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>HREADYOUT</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>HREADYOUT_ram3</spirit:name> + </spirit:physicalPort> + </spirit:portMap> + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>HRESP</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>HRESP_ram3</spirit:name> + </spirit:physicalPort> + </spirit:portMap> + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>HRUSER</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>HRUSER_ram3</spirit:name> + </spirit:physicalPort> + </spirit:portMap> + </spirit:portMaps> + </spirit:busInterface> + + <spirit:busInterface> + <spirit:name>AHBLiteTarget_Master__sys</spirit:name> + <spirit:description>Master port _sys</spirit:description> + <spirit:busType spirit:library="AMBA3" spirit:name="AHBLiteTarget" spirit:vendor="amba.com" spirit:version="r2p0_0"/> + <spirit:abstractionType spirit:library="AMBA3" spirit:name="AHBLiteTarget_rtl" spirit:vendor="amba.com" spirit:version="r2p0_0"/> + <spirit:master> + <spirit:addressSpaceRef spirit:addressSpaceRef="AHBLiteTarget_Master__sys_AS"/> + </spirit:master> + + <spirit:portMaps> + <!-- Clock/reset --> + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>HCLK</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>HCLK</spirit:name> + </spirit:physicalPort> + </spirit:portMap> + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>HRESETn</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>HRESETn</spirit:name> + </spirit:physicalPort> + </spirit:portMap> + <!-- Outputs --> + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>HSELx</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>HSEL_sys</spirit:name> + </spirit:physicalPort> + </spirit:portMap> + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>HADDR</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>HADDR_sys</spirit:name> + </spirit:physicalPort> + </spirit:portMap> + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>HTRANS</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>HTRANS_sys</spirit:name> + </spirit:physicalPort> + </spirit:portMap> + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>HWRITE</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>HWRITE_sys</spirit:name> + </spirit:physicalPort> + </spirit:portMap> + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>HSIZE</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>HSIZE_sys</spirit:name> + </spirit:physicalPort> + </spirit:portMap> + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>HBURST</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>HBURST_sys</spirit:name> + </spirit:physicalPort> + </spirit:portMap> + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>HPROT</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>HPROT_sys</spirit:name> + </spirit:physicalPort> + </spirit:portMap> + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>HWDATA</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>HWDATA_sys</spirit:name> + </spirit:physicalPort> + </spirit:portMap> + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>HMASTLOCK</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>HMASTLOCK_sys</spirit:name> + </spirit:physicalPort> + </spirit:portMap> + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>HREADY</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>HREADYMUX_sys</spirit:name> + </spirit:physicalPort> + </spirit:portMap> + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>HAUSER</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>HAUSER_sys</spirit:name> + </spirit:physicalPort> + </spirit:portMap> + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>HWUSER</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>HWUSER_sys</spirit:name> + </spirit:physicalPort> + </spirit:portMap> + + <!-- Inputs --> + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>HRDATA</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>HRDATA_sys</spirit:name> + </spirit:physicalPort> + </spirit:portMap> + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>HREADYOUT</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>HREADYOUT_sys</spirit:name> + </spirit:physicalPort> + </spirit:portMap> + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>HRESP</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>HRESP_sys</spirit:name> + </spirit:physicalPort> + </spirit:portMap> + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>HRUSER</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>HRUSER_sys</spirit:name> + </spirit:physicalPort> + </spirit:portMap> + </spirit:portMaps> + </spirit:busInterface> + + <spirit:busInterface> + <spirit:name>AHBLiteTarget_Master__ram8</spirit:name> + <spirit:description>Master port _ram8</spirit:description> + <spirit:busType spirit:library="AMBA3" spirit:name="AHBLiteTarget" spirit:vendor="amba.com" spirit:version="r2p0_0"/> + <spirit:abstractionType spirit:library="AMBA3" spirit:name="AHBLiteTarget_rtl" spirit:vendor="amba.com" spirit:version="r2p0_0"/> + <spirit:master> + <spirit:addressSpaceRef spirit:addressSpaceRef="AHBLiteTarget_Master__ram8_AS"/> + </spirit:master> + + <spirit:portMaps> + <!-- Clock/reset --> + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>HCLK</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>HCLK</spirit:name> + </spirit:physicalPort> + </spirit:portMap> + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>HRESETn</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>HRESETn</spirit:name> + </spirit:physicalPort> + </spirit:portMap> + <!-- Outputs --> + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>HSELx</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>HSEL_ram8</spirit:name> + </spirit:physicalPort> + </spirit:portMap> + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>HADDR</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>HADDR_ram8</spirit:name> + </spirit:physicalPort> + </spirit:portMap> + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>HTRANS</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>HTRANS_ram8</spirit:name> + </spirit:physicalPort> + </spirit:portMap> + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>HWRITE</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>HWRITE_ram8</spirit:name> + </spirit:physicalPort> + </spirit:portMap> + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>HSIZE</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>HSIZE_ram8</spirit:name> + </spirit:physicalPort> + </spirit:portMap> + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>HBURST</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>HBURST_ram8</spirit:name> + </spirit:physicalPort> + </spirit:portMap> + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>HPROT</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>HPROT_ram8</spirit:name> + </spirit:physicalPort> + </spirit:portMap> + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>HWDATA</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>HWDATA_ram8</spirit:name> + </spirit:physicalPort> + </spirit:portMap> + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>HMASTLOCK</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>HMASTLOCK_ram8</spirit:name> + </spirit:physicalPort> + </spirit:portMap> + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>HREADY</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>HREADYMUX_ram8</spirit:name> + </spirit:physicalPort> + </spirit:portMap> + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>HAUSER</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>HAUSER_ram8</spirit:name> + </spirit:physicalPort> + </spirit:portMap> + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>HWUSER</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>HWUSER_ram8</spirit:name> + </spirit:physicalPort> + </spirit:portMap> + + <!-- Inputs --> + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>HRDATA</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>HRDATA_ram8</spirit:name> + </spirit:physicalPort> + </spirit:portMap> + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>HREADYOUT</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>HREADYOUT_ram8</spirit:name> + </spirit:physicalPort> + </spirit:portMap> + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>HRESP</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>HRESP_ram8</spirit:name> + </spirit:physicalPort> + </spirit:portMap> + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>HRUSER</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>HRUSER_ram8</spirit:name> + </spirit:physicalPort> + </spirit:portMap> + </spirit:portMaps> + </spirit:busInterface> + + <spirit:busInterface> + <spirit:name>AHBLiteTarget_Master__ram9</spirit:name> + <spirit:description>Master port _ram9</spirit:description> + <spirit:busType spirit:library="AMBA3" spirit:name="AHBLiteTarget" spirit:vendor="amba.com" spirit:version="r2p0_0"/> + <spirit:abstractionType spirit:library="AMBA3" spirit:name="AHBLiteTarget_rtl" spirit:vendor="amba.com" spirit:version="r2p0_0"/> + <spirit:master> + <spirit:addressSpaceRef spirit:addressSpaceRef="AHBLiteTarget_Master__ram9_AS"/> + </spirit:master> + + <spirit:portMaps> + <!-- Clock/reset --> + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>HCLK</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>HCLK</spirit:name> + </spirit:physicalPort> + </spirit:portMap> + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>HRESETn</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>HRESETn</spirit:name> + </spirit:physicalPort> + </spirit:portMap> + <!-- Outputs --> + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>HSELx</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>HSEL_ram9</spirit:name> + </spirit:physicalPort> + </spirit:portMap> + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>HADDR</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>HADDR_ram9</spirit:name> + </spirit:physicalPort> + </spirit:portMap> + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>HTRANS</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>HTRANS_ram9</spirit:name> + </spirit:physicalPort> + </spirit:portMap> + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>HWRITE</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>HWRITE_ram9</spirit:name> + </spirit:physicalPort> + </spirit:portMap> + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>HSIZE</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>HSIZE_ram9</spirit:name> + </spirit:physicalPort> + </spirit:portMap> + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>HBURST</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>HBURST_ram9</spirit:name> + </spirit:physicalPort> + </spirit:portMap> + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>HPROT</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>HPROT_ram9</spirit:name> + </spirit:physicalPort> + </spirit:portMap> + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>HWDATA</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>HWDATA_ram9</spirit:name> + </spirit:physicalPort> + </spirit:portMap> + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>HMASTLOCK</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>HMASTLOCK_ram9</spirit:name> + </spirit:physicalPort> + </spirit:portMap> + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>HREADY</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>HREADYMUX_ram9</spirit:name> + </spirit:physicalPort> + </spirit:portMap> + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>HAUSER</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>HAUSER_ram9</spirit:name> + </spirit:physicalPort> + </spirit:portMap> + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>HWUSER</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>HWUSER_ram9</spirit:name> + </spirit:physicalPort> + </spirit:portMap> + + <!-- Inputs --> + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>HRDATA</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>HRDATA_ram9</spirit:name> + </spirit:physicalPort> + </spirit:portMap> + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>HREADYOUT</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>HREADYOUT_ram9</spirit:name> + </spirit:physicalPort> + </spirit:portMap> + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>HRESP</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>HRESP_ram9</spirit:name> + </spirit:physicalPort> + </spirit:portMap> + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>HRUSER</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>HRUSER_ram9</spirit:name> + </spirit:physicalPort> + </spirit:portMap> + </spirit:portMaps> + </spirit:busInterface> + + <spirit:busInterface> + <spirit:name>AHBLiteTarget_Master__exp</spirit:name> + <spirit:description>Master port _exp</spirit:description> + <spirit:busType spirit:library="AMBA3" spirit:name="AHBLiteTarget" spirit:vendor="amba.com" spirit:version="r2p0_0"/> + <spirit:abstractionType spirit:library="AMBA3" spirit:name="AHBLiteTarget_rtl" spirit:vendor="amba.com" spirit:version="r2p0_0"/> + <spirit:master> + <spirit:addressSpaceRef spirit:addressSpaceRef="AHBLiteTarget_Master__exp_AS"/> + </spirit:master> + + <spirit:portMaps> + <!-- Clock/reset --> + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>HCLK</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>HCLK</spirit:name> + </spirit:physicalPort> + </spirit:portMap> + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>HRESETn</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>HRESETn</spirit:name> + </spirit:physicalPort> + </spirit:portMap> + <!-- Outputs --> + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>HSELx</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>HSEL_exp</spirit:name> + </spirit:physicalPort> + </spirit:portMap> + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>HADDR</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>HADDR_exp</spirit:name> + </spirit:physicalPort> + </spirit:portMap> + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>HTRANS</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>HTRANS_exp</spirit:name> + </spirit:physicalPort> + </spirit:portMap> + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>HWRITE</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>HWRITE_exp</spirit:name> + </spirit:physicalPort> + </spirit:portMap> + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>HSIZE</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>HSIZE_exp</spirit:name> + </spirit:physicalPort> + </spirit:portMap> + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>HBURST</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>HBURST_exp</spirit:name> + </spirit:physicalPort> + </spirit:portMap> + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>HPROT</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>HPROT_exp</spirit:name> + </spirit:physicalPort> + </spirit:portMap> + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>HWDATA</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>HWDATA_exp</spirit:name> + </spirit:physicalPort> + </spirit:portMap> + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>HMASTLOCK</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>HMASTLOCK_exp</spirit:name> + </spirit:physicalPort> + </spirit:portMap> + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>HREADY</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>HREADYMUX_exp</spirit:name> + </spirit:physicalPort> + </spirit:portMap> + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>HAUSER</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>HAUSER_exp</spirit:name> + </spirit:physicalPort> + </spirit:portMap> + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>HWUSER</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>HWUSER_exp</spirit:name> + </spirit:physicalPort> + </spirit:portMap> + + <!-- Inputs --> + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>HRDATA</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>HRDATA_exp</spirit:name> + </spirit:physicalPort> + </spirit:portMap> + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>HREADYOUT</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>HREADYOUT_exp</spirit:name> + </spirit:physicalPort> + </spirit:portMap> + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>HRESP</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>HRESP_exp</spirit:name> + </spirit:physicalPort> + </spirit:portMap> + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>HRUSER</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>HRUSER_exp</spirit:name> + </spirit:physicalPort> + </spirit:portMap> + </spirit:portMaps> + </spirit:busInterface> + + <!--Scan test dummy signals --> + <spirit:busInterface> + <spirit:name>DFTInterface_Slave</spirit:name> + <spirit:description>Scan test dummy signals, not connected until scan insertion</spirit:description> + <spirit:busType spirit:library="generic" spirit:name="DFTInterface" spirit:vendor="arm.com" spirit:version="r0p0_1"/> + <spirit:abstractionType spirit:library="generic" spirit:name="DFTInterface_rtl" spirit:vendor="arm.com" spirit:version="r0p0_1"/> + <spirit:slave/> + <spirit:portMaps> + + <!-- Clock/reset --> + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>CLK</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>HCLK</spirit:name> + </spirit:physicalPort> + </spirit:portMap> + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>RESETn</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>HRESETn</spirit:name> + </spirit:physicalPort> + </spirit:portMap> + + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>DFTSCANMODE</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>SCANENABLE</spirit:name> + </spirit:physicalPort> + </spirit:portMap> + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>DFTSI</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>SCANINHCLK</spirit:name> + </spirit:physicalPort> + </spirit:portMap> + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>DFTSO</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>SCANOUTHCLK</spirit:name> + </spirit:physicalPort> + </spirit:portMap> + </spirit:portMaps> + </spirit:busInterface> + + </spirit:busInterfaces> + + <spirit:remapStates> + + <spirit:remapState> + <spirit:name>remap_0</spirit:name> + <spirit:description>Remap state remap_0</spirit:description> + <spirit:remapPorts> + <spirit:remapPort spirit:portNameRef="REMAP" spirit:portIndex="0">1</spirit:remapPort> + </spirit:remapPorts> + </spirit:remapState> + <spirit:remapState> + <spirit:name>remap_n0</spirit:name> + <spirit:description>Remap state remap_n0</spirit:description> + <spirit:remapPorts> + <spirit:remapPort spirit:portNameRef="REMAP" spirit:portIndex="0">0</spirit:remapPort> + </spirit:remapPorts> + </spirit:remapState> + + </spirit:remapStates> + + <spirit:addressSpaces> + + <spirit:addressSpace> + <spirit:name>AHBLiteTarget_Master__rom1_AS</spirit:name> + <spirit:description>_rom1 address space</spirit:description> + <spirit:range>4G</spirit:range> + <spirit:width>32</spirit:width> + <spirit:segments> + <spirit:segment> + <spirit:name>_rom1_0x00000000_0x0fffffff</spirit:name> + <spirit:addressOffset>0x00000000</spirit:addressOffset> + <spirit:range>0x010000000</spirit:range> + </spirit:segment> + <spirit:segment> + <spirit:name>_rom1_0x10000000_0x1fffffff</spirit:name> + <spirit:addressOffset>0x10000000</spirit:addressOffset> + <spirit:range>0x010000000</spirit:range> + </spirit:segment> + </spirit:segments> + <spirit:addressUnitBits>8</spirit:addressUnitBits> + </spirit:addressSpace> + + <spirit:addressSpace> + <spirit:name>AHBLiteTarget_Master__ram2_AS</spirit:name> + <spirit:description>_ram2 address space</spirit:description> + <spirit:range>4G</spirit:range> + <spirit:width>32</spirit:width> + <spirit:segments> + <spirit:segment> + <spirit:name>_ram2_0x00000000_0x0fffffff</spirit:name> + <spirit:addressOffset>0x00000000</spirit:addressOffset> + <spirit:range>0x010000000</spirit:range> + </spirit:segment> + <spirit:segment> + <spirit:name>_ram2_0x20000000_0x2fffffff</spirit:name> + <spirit:addressOffset>0x20000000</spirit:addressOffset> + <spirit:range>0x010000000</spirit:range> + </spirit:segment> + </spirit:segments> + <spirit:addressUnitBits>8</spirit:addressUnitBits> + </spirit:addressSpace> + + <spirit:addressSpace> + <spirit:name>AHBLiteTarget_Master__ram3_AS</spirit:name> + <spirit:description>_ram3 address space</spirit:description> + <spirit:range>4G</spirit:range> + <spirit:width>32</spirit:width> + <spirit:segments> + <spirit:segment> + <spirit:name>_ram3_0x30000000_0x3fffffff</spirit:name> + <spirit:addressOffset>0x30000000</spirit:addressOffset> + <spirit:range>0x010000000</spirit:range> + </spirit:segment> + </spirit:segments> + <spirit:addressUnitBits>8</spirit:addressUnitBits> + </spirit:addressSpace> + + <spirit:addressSpace> + <spirit:name>AHBLiteTarget_Master__sys_AS</spirit:name> + <spirit:description>_sys address space</spirit:description> + <spirit:range>4G</spirit:range> + <spirit:width>32</spirit:width> + <spirit:segments> + <spirit:segment> + <spirit:name>_sys_0x40000000_0x5fffffff</spirit:name> + <spirit:addressOffset>0x40000000</spirit:addressOffset> + <spirit:range>0x020000000</spirit:range> + </spirit:segment> + <spirit:segment> + <spirit:name>_sys_0xf0000000_0xf003ffff</spirit:name> + <spirit:addressOffset>0xf0000000</spirit:addressOffset> + <spirit:range>0x000040000</spirit:range> + </spirit:segment> + </spirit:segments> + <spirit:addressUnitBits>8</spirit:addressUnitBits> + </spirit:addressSpace> + + <spirit:addressSpace> + <spirit:name>AHBLiteTarget_Master__ram8_AS</spirit:name> + <spirit:description>_ram8 address space</spirit:description> + <spirit:range>4G</spirit:range> + <spirit:width>32</spirit:width> + <spirit:segments> + <spirit:segment> + <spirit:name>_ram8_0x80000000_0x8fffffff</spirit:name> + <spirit:addressOffset>0x80000000</spirit:addressOffset> + <spirit:range>0x010000000</spirit:range> + </spirit:segment> + </spirit:segments> + <spirit:addressUnitBits>8</spirit:addressUnitBits> + </spirit:addressSpace> + + <spirit:addressSpace> + <spirit:name>AHBLiteTarget_Master__ram9_AS</spirit:name> + <spirit:description>_ram9 address space</spirit:description> + <spirit:range>4G</spirit:range> + <spirit:width>32</spirit:width> + <spirit:segments> + <spirit:segment> + <spirit:name>_ram9_0x90000000_0x9fffffff</spirit:name> + <spirit:addressOffset>0x90000000</spirit:addressOffset> + <spirit:range>0x010000000</spirit:range> + </spirit:segment> + </spirit:segments> + <spirit:addressUnitBits>8</spirit:addressUnitBits> + </spirit:addressSpace> + + <spirit:addressSpace> + <spirit:name>AHBLiteTarget_Master__exp_AS</spirit:name> + <spirit:description>_exp address space</spirit:description> + <spirit:range>4G</spirit:range> + <spirit:width>32</spirit:width> + <spirit:segments> + <spirit:segment> + <spirit:name>_exp_0x60000000_0x7fffffff</spirit:name> + <spirit:addressOffset>0x60000000</spirit:addressOffset> + <spirit:range>0x020000000</spirit:range> + </spirit:segment> + <spirit:segment> + <spirit:name>_exp_0xa0000000_0xdfffffff</spirit:name> + <spirit:addressOffset>0xa0000000</spirit:addressOffset> + <spirit:range>0x040000000</spirit:range> + </spirit:segment> + </spirit:segments> + <spirit:addressUnitBits>8</spirit:addressUnitBits> + </spirit:addressSpace> + + </spirit:addressSpaces> + + <spirit:memoryMaps> + + <spirit:memoryMap> + <spirit:name>AHBLiteInitiator_Slave__adp_MM</spirit:name> + <spirit:description>_adp memory map</spirit:description> + + <spirit:subspaceMap spirit:masterRef="AHBLiteTarget_Master__rom1" + spirit:segmentRef="_rom1_0x10000000_0x1fffffff"> + <!-- Address_region 0x10000000-0x1fffffff --> + <spirit:name>AHBLiteTarget_Master__rom1_0x10000000_0_state_always_SM</spirit:name> + <spirit:baseAddress>0x10000000</spirit:baseAddress> + </spirit:subspaceMap> + + <spirit:subspaceMap spirit:masterRef="AHBLiteTarget_Master__ram2" + spirit:segmentRef="_ram2_0x20000000_0x2fffffff"> + <!-- Address_region 0x20000000-0x2fffffff --> + <spirit:name>AHBLiteTarget_Master__ram2_0x20000000_0_state_always_SM</spirit:name> + <spirit:baseAddress>0x20000000</spirit:baseAddress> + </spirit:subspaceMap> + + <spirit:subspaceMap spirit:masterRef="AHBLiteTarget_Master__ram3" + spirit:segmentRef="_ram3_0x30000000_0x3fffffff"> + <!-- Address_region 0x30000000-0x3fffffff --> + <spirit:name>AHBLiteTarget_Master__ram3_0x30000000_0_state_always_SM</spirit:name> + <spirit:baseAddress>0x30000000</spirit:baseAddress> + </spirit:subspaceMap> + + <spirit:subspaceMap spirit:masterRef="AHBLiteTarget_Master__sys" + spirit:segmentRef="_sys_0x40000000_0x5fffffff"> + <!-- Address_region 0x40000000-0x5fffffff --> + <spirit:name>AHBLiteTarget_Master__sys_0x40000000_0_state_always_SM</spirit:name> + <spirit:baseAddress>0x40000000</spirit:baseAddress> + </spirit:subspaceMap> + + <spirit:subspaceMap spirit:masterRef="AHBLiteTarget_Master__exp" + spirit:segmentRef="_exp_0x60000000_0x7fffffff"> + <!-- Address_region 0x60000000-0x7fffffff --> + <spirit:name>AHBLiteTarget_Master__exp_0x60000000_0_state_always_SM</spirit:name> + <spirit:baseAddress>0x60000000</spirit:baseAddress> + </spirit:subspaceMap> + + <spirit:subspaceMap spirit:masterRef="AHBLiteTarget_Master__ram8" + spirit:segmentRef="_ram8_0x80000000_0x8fffffff"> + <!-- Address_region 0x80000000-0x8fffffff --> + <spirit:name>AHBLiteTarget_Master__ram8_0x80000000_0_state_always_SM</spirit:name> + <spirit:baseAddress>0x80000000</spirit:baseAddress> + </spirit:subspaceMap> + + <spirit:subspaceMap spirit:masterRef="AHBLiteTarget_Master__ram9" + spirit:segmentRef="_ram9_0x90000000_0x9fffffff"> + <!-- Address_region 0x90000000-0x9fffffff --> + <spirit:name>AHBLiteTarget_Master__ram9_0x90000000_0_state_always_SM</spirit:name> + <spirit:baseAddress>0x90000000</spirit:baseAddress> + </spirit:subspaceMap> + + <spirit:subspaceMap spirit:masterRef="AHBLiteTarget_Master__exp" + spirit:segmentRef="_exp_0xa0000000_0xdfffffff"> + <!-- Address_region 0xa0000000-0xdfffffff --> + <spirit:name>AHBLiteTarget_Master__exp_0xa0000000_0_state_always_SM</spirit:name> + <spirit:baseAddress>0xa0000000</spirit:baseAddress> + </spirit:subspaceMap> + + <spirit:subspaceMap spirit:masterRef="AHBLiteTarget_Master__sys" + spirit:segmentRef="_sys_0xf0000000_0xf003ffff"> + <!-- Address_region 0xf0000000-0xf003ffff --> + <spirit:name>AHBLiteTarget_Master__sys_0xf0000000_0_state_always_SM</spirit:name> + <spirit:baseAddress>0xf0000000</spirit:baseAddress> + </spirit:subspaceMap> + + <spirit:memoryRemap spirit:state="remap_0"> + <spirit:name>AHBLiteInitiator_Slave__adp_remap_0_remap_MM</spirit:name> + <spirit:description>_adp remap_0 remap</spirit:description> + <spirit:subspaceMap spirit:masterRef="AHBLiteTarget_Master__ram2" + spirit:segmentRef="_ram2_0x00000000_0x0fffffff"> + <!-- Remapped region, active when REMAP bitcombination is 0 address_region 0x00000000-0x0fffffff --> + <spirit:name>AHBLiteTarget_Master__ram2_0x00000000_0_state_remap_0_SM</spirit:name> + <spirit:baseAddress>0x00000000</spirit:baseAddress> + </spirit:subspaceMap> + </spirit:memoryRemap> + + <spirit:memoryRemap spirit:state="remap_n0"> + <spirit:name>AHBLiteInitiator_Slave__adp_remap_n0_remap_MM</spirit:name> + <spirit:description>_adp remap_n0 remap</spirit:description> + <spirit:subspaceMap spirit:masterRef="AHBLiteTarget_Master__rom1" + spirit:segmentRef="_rom1_0x00000000_0x0fffffff"> + <!-- Removable region, active only when REMAP bitcombination is n0 address_region 0x00000000-0x0fffffff --> + <spirit:name>AHBLiteTarget_Master__rom1_0x00000000_0_state_remap_n0_SM</spirit:name> + <spirit:baseAddress>0x00000000</spirit:baseAddress> + </spirit:subspaceMap> + </spirit:memoryRemap> + + </spirit:memoryMap> + + <spirit:memoryMap> + <spirit:name>AHBLiteInitiator_Slave__dma_MM</spirit:name> + <spirit:description>_dma memory map</spirit:description> + + <spirit:subspaceMap spirit:masterRef="AHBLiteTarget_Master__ram2" + spirit:segmentRef="_ram2_0x00000000_0x0fffffff"> + <!-- Address_region 0x00000000-0x0fffffff --> + <spirit:name>AHBLiteTarget_Master__ram2_0x00000000_0_state_always_SM</spirit:name> + <spirit:baseAddress>0x00000000</spirit:baseAddress> + </spirit:subspaceMap> + + <spirit:subspaceMap spirit:masterRef="AHBLiteTarget_Master__rom1" + spirit:segmentRef="_rom1_0x10000000_0x1fffffff"> + <!-- Address_region 0x10000000-0x1fffffff --> + <spirit:name>AHBLiteTarget_Master__rom1_0x10000000_0_state_always_SM</spirit:name> + <spirit:baseAddress>0x10000000</spirit:baseAddress> + </spirit:subspaceMap> + + <spirit:subspaceMap spirit:masterRef="AHBLiteTarget_Master__ram2" + spirit:segmentRef="_ram2_0x20000000_0x2fffffff"> + <!-- Address_region 0x20000000-0x2fffffff --> + <spirit:name>AHBLiteTarget_Master__ram2_0x20000000_0_state_always_SM</spirit:name> + <spirit:baseAddress>0x20000000</spirit:baseAddress> + </spirit:subspaceMap> + + <spirit:subspaceMap spirit:masterRef="AHBLiteTarget_Master__ram3" + spirit:segmentRef="_ram3_0x30000000_0x3fffffff"> + <!-- Address_region 0x30000000-0x3fffffff --> + <spirit:name>AHBLiteTarget_Master__ram3_0x30000000_0_state_always_SM</spirit:name> + <spirit:baseAddress>0x30000000</spirit:baseAddress> + </spirit:subspaceMap> + + <spirit:subspaceMap spirit:masterRef="AHBLiteTarget_Master__sys" + spirit:segmentRef="_sys_0x40000000_0x5fffffff"> + <!-- Address_region 0x40000000-0x5fffffff --> + <spirit:name>AHBLiteTarget_Master__sys_0x40000000_0_state_always_SM</spirit:name> + <spirit:baseAddress>0x40000000</spirit:baseAddress> + </spirit:subspaceMap> + + <spirit:subspaceMap spirit:masterRef="AHBLiteTarget_Master__exp" + spirit:segmentRef="_exp_0x60000000_0x7fffffff"> + <!-- Address_region 0x60000000-0x7fffffff --> + <spirit:name>AHBLiteTarget_Master__exp_0x60000000_0_state_always_SM</spirit:name> + <spirit:baseAddress>0x60000000</spirit:baseAddress> + </spirit:subspaceMap> + + <spirit:subspaceMap spirit:masterRef="AHBLiteTarget_Master__ram8" + spirit:segmentRef="_ram8_0x80000000_0x8fffffff"> + <!-- Address_region 0x80000000-0x8fffffff --> + <spirit:name>AHBLiteTarget_Master__ram8_0x80000000_0_state_always_SM</spirit:name> + <spirit:baseAddress>0x80000000</spirit:baseAddress> + </spirit:subspaceMap> + + <spirit:subspaceMap spirit:masterRef="AHBLiteTarget_Master__ram9" + spirit:segmentRef="_ram9_0x90000000_0x9fffffff"> + <!-- Address_region 0x90000000-0x9fffffff --> + <spirit:name>AHBLiteTarget_Master__ram9_0x90000000_0_state_always_SM</spirit:name> + <spirit:baseAddress>0x90000000</spirit:baseAddress> + </spirit:subspaceMap> + + <spirit:subspaceMap spirit:masterRef="AHBLiteTarget_Master__exp" + spirit:segmentRef="_exp_0xa0000000_0xdfffffff"> + <!-- Address_region 0xa0000000-0xdfffffff --> + <spirit:name>AHBLiteTarget_Master__exp_0xa0000000_0_state_always_SM</spirit:name> + <spirit:baseAddress>0xa0000000</spirit:baseAddress> + </spirit:subspaceMap> + + </spirit:memoryMap> + + <spirit:memoryMap> + <spirit:name>AHBLiteInitiator_Slave__dma2_MM</spirit:name> + <spirit:description>_dma2 memory map</spirit:description> + + <spirit:subspaceMap spirit:masterRef="AHBLiteTarget_Master__ram2" + spirit:segmentRef="_ram2_0x00000000_0x0fffffff"> + <!-- Address_region 0x00000000-0x0fffffff --> + <spirit:name>AHBLiteTarget_Master__ram2_0x00000000_0_state_always_SM</spirit:name> + <spirit:baseAddress>0x00000000</spirit:baseAddress> + </spirit:subspaceMap> + + <spirit:subspaceMap spirit:masterRef="AHBLiteTarget_Master__rom1" + spirit:segmentRef="_rom1_0x10000000_0x1fffffff"> + <!-- Address_region 0x10000000-0x1fffffff --> + <spirit:name>AHBLiteTarget_Master__rom1_0x10000000_0_state_always_SM</spirit:name> + <spirit:baseAddress>0x10000000</spirit:baseAddress> + </spirit:subspaceMap> + + <spirit:subspaceMap spirit:masterRef="AHBLiteTarget_Master__ram2" + spirit:segmentRef="_ram2_0x20000000_0x2fffffff"> + <!-- Address_region 0x20000000-0x2fffffff --> + <spirit:name>AHBLiteTarget_Master__ram2_0x20000000_0_state_always_SM</spirit:name> + <spirit:baseAddress>0x20000000</spirit:baseAddress> + </spirit:subspaceMap> + + <spirit:subspaceMap spirit:masterRef="AHBLiteTarget_Master__ram3" + spirit:segmentRef="_ram3_0x30000000_0x3fffffff"> + <!-- Address_region 0x30000000-0x3fffffff --> + <spirit:name>AHBLiteTarget_Master__ram3_0x30000000_0_state_always_SM</spirit:name> + <spirit:baseAddress>0x30000000</spirit:baseAddress> + </spirit:subspaceMap> + + <spirit:subspaceMap spirit:masterRef="AHBLiteTarget_Master__sys" + spirit:segmentRef="_sys_0x40000000_0x5fffffff"> + <!-- Address_region 0x40000000-0x5fffffff --> + <spirit:name>AHBLiteTarget_Master__sys_0x40000000_0_state_always_SM</spirit:name> + <spirit:baseAddress>0x40000000</spirit:baseAddress> + </spirit:subspaceMap> + + <spirit:subspaceMap spirit:masterRef="AHBLiteTarget_Master__exp" + spirit:segmentRef="_exp_0x60000000_0x7fffffff"> + <!-- Address_region 0x60000000-0x7fffffff --> + <spirit:name>AHBLiteTarget_Master__exp_0x60000000_0_state_always_SM</spirit:name> + <spirit:baseAddress>0x60000000</spirit:baseAddress> + </spirit:subspaceMap> + + <spirit:subspaceMap spirit:masterRef="AHBLiteTarget_Master__ram8" + spirit:segmentRef="_ram8_0x80000000_0x8fffffff"> + <!-- Address_region 0x80000000-0x8fffffff --> + <spirit:name>AHBLiteTarget_Master__ram8_0x80000000_0_state_always_SM</spirit:name> + <spirit:baseAddress>0x80000000</spirit:baseAddress> + </spirit:subspaceMap> + + <spirit:subspaceMap spirit:masterRef="AHBLiteTarget_Master__ram9" + spirit:segmentRef="_ram9_0x90000000_0x9fffffff"> + <!-- Address_region 0x90000000-0x9fffffff --> + <spirit:name>AHBLiteTarget_Master__ram9_0x90000000_0_state_always_SM</spirit:name> + <spirit:baseAddress>0x90000000</spirit:baseAddress> + </spirit:subspaceMap> + + <spirit:subspaceMap spirit:masterRef="AHBLiteTarget_Master__exp" + spirit:segmentRef="_exp_0xa0000000_0xdfffffff"> + <!-- Address_region 0xa0000000-0xdfffffff --> + <spirit:name>AHBLiteTarget_Master__exp_0xa0000000_0_state_always_SM</spirit:name> + <spirit:baseAddress>0xa0000000</spirit:baseAddress> + </spirit:subspaceMap> + + </spirit:memoryMap> + + <spirit:memoryMap> + <spirit:name>AHBLiteInitiator_Slave__cpu_MM</spirit:name> + <spirit:description>_cpu memory map</spirit:description> + + <spirit:subspaceMap spirit:masterRef="AHBLiteTarget_Master__rom1" + spirit:segmentRef="_rom1_0x10000000_0x1fffffff"> + <!-- Address_region 0x10000000-0x1fffffff --> + <spirit:name>AHBLiteTarget_Master__rom1_0x10000000_0_state_always_SM</spirit:name> + <spirit:baseAddress>0x10000000</spirit:baseAddress> + </spirit:subspaceMap> + + <spirit:subspaceMap spirit:masterRef="AHBLiteTarget_Master__ram2" + spirit:segmentRef="_ram2_0x20000000_0x2fffffff"> + <!-- Address_region 0x20000000-0x2fffffff --> + <spirit:name>AHBLiteTarget_Master__ram2_0x20000000_0_state_always_SM</spirit:name> + <spirit:baseAddress>0x20000000</spirit:baseAddress> + </spirit:subspaceMap> + + <spirit:subspaceMap spirit:masterRef="AHBLiteTarget_Master__ram3" + spirit:segmentRef="_ram3_0x30000000_0x3fffffff"> + <!-- Address_region 0x30000000-0x3fffffff --> + <spirit:name>AHBLiteTarget_Master__ram3_0x30000000_0_state_always_SM</spirit:name> + <spirit:baseAddress>0x30000000</spirit:baseAddress> + </spirit:subspaceMap> + + <spirit:subspaceMap spirit:masterRef="AHBLiteTarget_Master__sys" + spirit:segmentRef="_sys_0x40000000_0x5fffffff"> + <!-- Address_region 0x40000000-0x5fffffff --> + <spirit:name>AHBLiteTarget_Master__sys_0x40000000_0_state_always_SM</spirit:name> + <spirit:baseAddress>0x40000000</spirit:baseAddress> + </spirit:subspaceMap> + + <spirit:subspaceMap spirit:masterRef="AHBLiteTarget_Master__exp" + spirit:segmentRef="_exp_0x60000000_0x7fffffff"> + <!-- Address_region 0x60000000-0x7fffffff --> + <spirit:name>AHBLiteTarget_Master__exp_0x60000000_0_state_always_SM</spirit:name> + <spirit:baseAddress>0x60000000</spirit:baseAddress> + </spirit:subspaceMap> + + <spirit:subspaceMap spirit:masterRef="AHBLiteTarget_Master__ram8" + spirit:segmentRef="_ram8_0x80000000_0x8fffffff"> + <!-- Address_region 0x80000000-0x8fffffff --> + <spirit:name>AHBLiteTarget_Master__ram8_0x80000000_0_state_always_SM</spirit:name> + <spirit:baseAddress>0x80000000</spirit:baseAddress> + </spirit:subspaceMap> + + <spirit:subspaceMap spirit:masterRef="AHBLiteTarget_Master__ram9" + spirit:segmentRef="_ram9_0x90000000_0x9fffffff"> + <!-- Address_region 0x90000000-0x9fffffff --> + <spirit:name>AHBLiteTarget_Master__ram9_0x90000000_0_state_always_SM</spirit:name> + <spirit:baseAddress>0x90000000</spirit:baseAddress> + </spirit:subspaceMap> + + <spirit:subspaceMap spirit:masterRef="AHBLiteTarget_Master__exp" + spirit:segmentRef="_exp_0xa0000000_0xdfffffff"> + <!-- Address_region 0xa0000000-0xdfffffff --> + <spirit:name>AHBLiteTarget_Master__exp_0xa0000000_0_state_always_SM</spirit:name> + <spirit:baseAddress>0xa0000000</spirit:baseAddress> + </spirit:subspaceMap> + + <spirit:subspaceMap spirit:masterRef="AHBLiteTarget_Master__sys" + spirit:segmentRef="_sys_0xf0000000_0xf003ffff"> + <!-- Address_region 0xf0000000-0xf003ffff --> + <spirit:name>AHBLiteTarget_Master__sys_0xf0000000_0_state_always_SM</spirit:name> + <spirit:baseAddress>0xf0000000</spirit:baseAddress> + </spirit:subspaceMap> + + <spirit:memoryRemap spirit:state="remap_0"> + <spirit:name>AHBLiteInitiator_Slave__cpu_remap_0_remap_MM</spirit:name> + <spirit:description>_cpu remap_0 remap</spirit:description> + <spirit:subspaceMap spirit:masterRef="AHBLiteTarget_Master__ram2" + spirit:segmentRef="_ram2_0x00000000_0x0fffffff"> + <!-- Remapped region, active when REMAP bitcombination is 0 address_region 0x00000000-0x0fffffff --> + <spirit:name>AHBLiteTarget_Master__ram2_0x00000000_0_state_remap_0_SM</spirit:name> + <spirit:baseAddress>0x00000000</spirit:baseAddress> + </spirit:subspaceMap> + </spirit:memoryRemap> + + <spirit:memoryRemap spirit:state="remap_n0"> + <spirit:name>AHBLiteInitiator_Slave__cpu_remap_n0_remap_MM</spirit:name> + <spirit:description>_cpu remap_n0 remap</spirit:description> + <spirit:subspaceMap spirit:masterRef="AHBLiteTarget_Master__rom1" + spirit:segmentRef="_rom1_0x00000000_0x0fffffff"> + <!-- Removable region, active only when REMAP bitcombination is n0 address_region 0x00000000-0x0fffffff --> + <spirit:name>AHBLiteTarget_Master__rom1_0x00000000_0_state_remap_n0_SM</spirit:name> + <spirit:baseAddress>0x00000000</spirit:baseAddress> + </spirit:subspaceMap> + </spirit:memoryRemap> + + </spirit:memoryMap> + + </spirit:memoryMaps> + + + <spirit:model> + <spirit:views> + <spirit:view> + <spirit:name>verilogsource</spirit:name> + <spirit:description>soclabs_4x7_AhbMatrix_lite bus matrix</spirit:description> + <spirit:envIdentifier>:*Simulation:</spirit:envIdentifier> + <spirit:envIdentifier>:*Synthesis:</spirit:envIdentifier> + <spirit:language>verilog</spirit:language> + <spirit:modelName>soclabs_4x7_AhbMatrix_lite</spirit:modelName> + <spirit:fileSetRef> + <spirit:localName>fs-verilogsource</spirit:localName> + </spirit:fileSetRef> + </spirit:view> + </spirit:views> + + <spirit:ports> + + <!-- Common clock and reset --> + + <spirit:port> + <spirit:name>HCLK</spirit:name> + <spirit:wire> + <spirit:direction>in</spirit:direction> + </spirit:wire> + </spirit:port> + <spirit:port> + <spirit:name>HRESETn</spirit:name> + <spirit:wire> + <spirit:direction>in</spirit:direction> + </spirit:wire> + </spirit:port> + + <!-- Remap port --> + <spirit:port> + <spirit:name>REMAP</spirit:name> + <spirit:wire> + <spirit:direction>in</spirit:direction> + <spirit:vector> + <spirit:left>3</spirit:left> + <spirit:right>0</spirit:right> + </spirit:vector> + <spirit:driver> + <spirit:defaultValue>0</spirit:defaultValue> + </spirit:driver> + </spirit:wire> + </spirit:port> + + <!-- Input signals of Slave interfaces --> + + <spirit:port> + <spirit:name>HADDR_adp</spirit:name> + <spirit:wire> + <spirit:direction>in</spirit:direction> + <spirit:vector> + <spirit:left>31</spirit:left> + <spirit:right>0</spirit:right> + </spirit:vector> + </spirit:wire> + </spirit:port> + <spirit:port> + <spirit:name>HTRANS_adp</spirit:name> + <spirit:wire> + <spirit:direction>in</spirit:direction> + <spirit:vector> + <spirit:left>1</spirit:left> + <spirit:right>0</spirit:right> + </spirit:vector> + </spirit:wire> + </spirit:port> + <spirit:port> + <spirit:name>HWRITE_adp</spirit:name> + <spirit:wire> + <spirit:direction>in</spirit:direction> + </spirit:wire> + </spirit:port> + <spirit:port> + <spirit:name>HSIZE_adp</spirit:name> + <spirit:wire> + <spirit:direction>in</spirit:direction> + <spirit:vector> + <spirit:left>2</spirit:left> + <spirit:right>0</spirit:right> + </spirit:vector> + </spirit:wire> + </spirit:port> + <spirit:port> + <spirit:name>HBURST_adp</spirit:name> + <spirit:wire> + <spirit:direction>in</spirit:direction> + <spirit:vector> + <spirit:left>2</spirit:left> + <spirit:right>0</spirit:right> + </spirit:vector> + <spirit:driver> + <spirit:defaultValue>0</spirit:defaultValue> + </spirit:driver> + </spirit:wire> + </spirit:port> + <spirit:port> + <spirit:name>HPROT_adp</spirit:name> + <spirit:wire> + <spirit:direction>in</spirit:direction> + <spirit:vector> + <spirit:left>3</spirit:left> + <spirit:right>0</spirit:right> + </spirit:vector> + </spirit:wire> + </spirit:port> + <spirit:port> + <spirit:name>HWDATA_adp</spirit:name> + <spirit:wire> + <spirit:direction>in</spirit:direction> + <spirit:vector> + <spirit:left>31</spirit:left> + <spirit:right>0</spirit:right> + </spirit:vector> + </spirit:wire> + </spirit:port> + <spirit:port> + <spirit:name>HMASTLOCK_adp</spirit:name> + <spirit:wire> + <spirit:direction>in</spirit:direction> + </spirit:wire> + </spirit:port> + <spirit:port> + <spirit:name>HAUSER_adp</spirit:name> + <spirit:wire> + <spirit:direction>in</spirit:direction> + <spirit:vector> + <spirit:left>1</spirit:left> + <spirit:right>0</spirit:right> + </spirit:vector> + </spirit:wire> + </spirit:port> + <spirit:port> + <spirit:name>HWUSER_adp</spirit:name> + <spirit:wire> + <spirit:direction>in</spirit:direction> + <spirit:vector> + <spirit:left>1</spirit:left> + <spirit:right>0</spirit:right> + </spirit:vector> + </spirit:wire> + </spirit:port> + <spirit:port> + <spirit:name>HADDR_dma</spirit:name> + <spirit:wire> + <spirit:direction>in</spirit:direction> + <spirit:vector> + <spirit:left>31</spirit:left> + <spirit:right>0</spirit:right> + </spirit:vector> + </spirit:wire> + </spirit:port> + <spirit:port> + <spirit:name>HTRANS_dma</spirit:name> + <spirit:wire> + <spirit:direction>in</spirit:direction> + <spirit:vector> + <spirit:left>1</spirit:left> + <spirit:right>0</spirit:right> + </spirit:vector> + </spirit:wire> + </spirit:port> + <spirit:port> + <spirit:name>HWRITE_dma</spirit:name> + <spirit:wire> + <spirit:direction>in</spirit:direction> + </spirit:wire> + </spirit:port> + <spirit:port> + <spirit:name>HSIZE_dma</spirit:name> + <spirit:wire> + <spirit:direction>in</spirit:direction> + <spirit:vector> + <spirit:left>2</spirit:left> + <spirit:right>0</spirit:right> + </spirit:vector> + </spirit:wire> + </spirit:port> + <spirit:port> + <spirit:name>HBURST_dma</spirit:name> + <spirit:wire> + <spirit:direction>in</spirit:direction> + <spirit:vector> + <spirit:left>2</spirit:left> + <spirit:right>0</spirit:right> + </spirit:vector> + <spirit:driver> + <spirit:defaultValue>0</spirit:defaultValue> + </spirit:driver> + </spirit:wire> + </spirit:port> + <spirit:port> + <spirit:name>HPROT_dma</spirit:name> + <spirit:wire> + <spirit:direction>in</spirit:direction> + <spirit:vector> + <spirit:left>3</spirit:left> + <spirit:right>0</spirit:right> + </spirit:vector> + </spirit:wire> + </spirit:port> + <spirit:port> + <spirit:name>HWDATA_dma</spirit:name> + <spirit:wire> + <spirit:direction>in</spirit:direction> + <spirit:vector> + <spirit:left>31</spirit:left> + <spirit:right>0</spirit:right> + </spirit:vector> + </spirit:wire> + </spirit:port> + <spirit:port> + <spirit:name>HMASTLOCK_dma</spirit:name> + <spirit:wire> + <spirit:direction>in</spirit:direction> + </spirit:wire> + </spirit:port> + <spirit:port> + <spirit:name>HAUSER_dma</spirit:name> + <spirit:wire> + <spirit:direction>in</spirit:direction> + <spirit:vector> + <spirit:left>1</spirit:left> + <spirit:right>0</spirit:right> + </spirit:vector> + </spirit:wire> + </spirit:port> + <spirit:port> + <spirit:name>HWUSER_dma</spirit:name> + <spirit:wire> + <spirit:direction>in</spirit:direction> + <spirit:vector> + <spirit:left>1</spirit:left> + <spirit:right>0</spirit:right> + </spirit:vector> + </spirit:wire> + </spirit:port> + <spirit:port> + <spirit:name>HADDR_dma2</spirit:name> + <spirit:wire> + <spirit:direction>in</spirit:direction> + <spirit:vector> + <spirit:left>31</spirit:left> + <spirit:right>0</spirit:right> + </spirit:vector> + </spirit:wire> + </spirit:port> + <spirit:port> + <spirit:name>HTRANS_dma2</spirit:name> + <spirit:wire> + <spirit:direction>in</spirit:direction> + <spirit:vector> + <spirit:left>1</spirit:left> + <spirit:right>0</spirit:right> + </spirit:vector> + </spirit:wire> + </spirit:port> + <spirit:port> + <spirit:name>HWRITE_dma2</spirit:name> + <spirit:wire> + <spirit:direction>in</spirit:direction> + </spirit:wire> + </spirit:port> + <spirit:port> + <spirit:name>HSIZE_dma2</spirit:name> + <spirit:wire> + <spirit:direction>in</spirit:direction> + <spirit:vector> + <spirit:left>2</spirit:left> + <spirit:right>0</spirit:right> + </spirit:vector> + </spirit:wire> + </spirit:port> + <spirit:port> + <spirit:name>HBURST_dma2</spirit:name> + <spirit:wire> + <spirit:direction>in</spirit:direction> + <spirit:vector> + <spirit:left>2</spirit:left> + <spirit:right>0</spirit:right> + </spirit:vector> + <spirit:driver> + <spirit:defaultValue>0</spirit:defaultValue> + </spirit:driver> + </spirit:wire> + </spirit:port> + <spirit:port> + <spirit:name>HPROT_dma2</spirit:name> + <spirit:wire> + <spirit:direction>in</spirit:direction> + <spirit:vector> + <spirit:left>3</spirit:left> + <spirit:right>0</spirit:right> + </spirit:vector> + </spirit:wire> + </spirit:port> + <spirit:port> + <spirit:name>HWDATA_dma2</spirit:name> + <spirit:wire> + <spirit:direction>in</spirit:direction> + <spirit:vector> + <spirit:left>31</spirit:left> + <spirit:right>0</spirit:right> + </spirit:vector> + </spirit:wire> + </spirit:port> + <spirit:port> + <spirit:name>HMASTLOCK_dma2</spirit:name> + <spirit:wire> + <spirit:direction>in</spirit:direction> + </spirit:wire> + </spirit:port> + <spirit:port> + <spirit:name>HAUSER_dma2</spirit:name> + <spirit:wire> + <spirit:direction>in</spirit:direction> + <spirit:vector> + <spirit:left>1</spirit:left> + <spirit:right>0</spirit:right> + </spirit:vector> + </spirit:wire> + </spirit:port> + <spirit:port> + <spirit:name>HWUSER_dma2</spirit:name> + <spirit:wire> + <spirit:direction>in</spirit:direction> + <spirit:vector> + <spirit:left>1</spirit:left> + <spirit:right>0</spirit:right> + </spirit:vector> + </spirit:wire> + </spirit:port> + <spirit:port> + <spirit:name>HADDR_cpu</spirit:name> + <spirit:wire> + <spirit:direction>in</spirit:direction> + <spirit:vector> + <spirit:left>31</spirit:left> + <spirit:right>0</spirit:right> + </spirit:vector> + </spirit:wire> + </spirit:port> + <spirit:port> + <spirit:name>HTRANS_cpu</spirit:name> + <spirit:wire> + <spirit:direction>in</spirit:direction> + <spirit:vector> + <spirit:left>1</spirit:left> + <spirit:right>0</spirit:right> + </spirit:vector> + </spirit:wire> + </spirit:port> + <spirit:port> + <spirit:name>HWRITE_cpu</spirit:name> + <spirit:wire> + <spirit:direction>in</spirit:direction> + </spirit:wire> + </spirit:port> + <spirit:port> + <spirit:name>HSIZE_cpu</spirit:name> + <spirit:wire> + <spirit:direction>in</spirit:direction> + <spirit:vector> + <spirit:left>2</spirit:left> + <spirit:right>0</spirit:right> + </spirit:vector> + </spirit:wire> + </spirit:port> + <spirit:port> + <spirit:name>HBURST_cpu</spirit:name> + <spirit:wire> + <spirit:direction>in</spirit:direction> + <spirit:vector> + <spirit:left>2</spirit:left> + <spirit:right>0</spirit:right> + </spirit:vector> + <spirit:driver> + <spirit:defaultValue>0</spirit:defaultValue> + </spirit:driver> + </spirit:wire> + </spirit:port> + <spirit:port> + <spirit:name>HPROT_cpu</spirit:name> + <spirit:wire> + <spirit:direction>in</spirit:direction> + <spirit:vector> + <spirit:left>3</spirit:left> + <spirit:right>0</spirit:right> + </spirit:vector> + </spirit:wire> + </spirit:port> + <spirit:port> + <spirit:name>HWDATA_cpu</spirit:name> + <spirit:wire> + <spirit:direction>in</spirit:direction> + <spirit:vector> + <spirit:left>31</spirit:left> + <spirit:right>0</spirit:right> + </spirit:vector> + </spirit:wire> + </spirit:port> + <spirit:port> + <spirit:name>HMASTLOCK_cpu</spirit:name> + <spirit:wire> + <spirit:direction>in</spirit:direction> + </spirit:wire> + </spirit:port> + <spirit:port> + <spirit:name>HAUSER_cpu</spirit:name> + <spirit:wire> + <spirit:direction>in</spirit:direction> + <spirit:vector> + <spirit:left>1</spirit:left> + <spirit:right>0</spirit:right> + </spirit:vector> + </spirit:wire> + </spirit:port> + <spirit:port> + <spirit:name>HWUSER_cpu</spirit:name> + <spirit:wire> + <spirit:direction>in</spirit:direction> + <spirit:vector> + <spirit:left>1</spirit:left> + <spirit:right>0</spirit:right> + </spirit:vector> + </spirit:wire> + </spirit:port> + + <!-- Input signals of Master interfaces --> + + <spirit:port> + <spirit:name>HRDATA_rom1</spirit:name> + <spirit:wire> + <spirit:direction>in</spirit:direction> + <spirit:vector> + <spirit:left>31</spirit:left> + <spirit:right>0</spirit:right> + </spirit:vector> + </spirit:wire> + </spirit:port> + <spirit:port> + <spirit:name>HREADYOUT_rom1</spirit:name> + <spirit:wire> + <spirit:direction>in</spirit:direction> + </spirit:wire> + </spirit:port> + <spirit:port> + <spirit:name>HRESP_rom1</spirit:name> + <spirit:wire> + <spirit:direction>in</spirit:direction> + </spirit:wire> + </spirit:port> + <spirit:port> + <spirit:name>HRUSER_rom1</spirit:name> + <spirit:wire> + <spirit:direction>in</spirit:direction> + <spirit:vector> + <spirit:left>1</spirit:left> + <spirit:right>0</spirit:right> + </spirit:vector> + </spirit:wire> + </spirit:port> + <spirit:port> + <spirit:name>HRDATA_ram2</spirit:name> + <spirit:wire> + <spirit:direction>in</spirit:direction> + <spirit:vector> + <spirit:left>31</spirit:left> + <spirit:right>0</spirit:right> + </spirit:vector> + </spirit:wire> + </spirit:port> + <spirit:port> + <spirit:name>HREADYOUT_ram2</spirit:name> + <spirit:wire> + <spirit:direction>in</spirit:direction> + </spirit:wire> + </spirit:port> + <spirit:port> + <spirit:name>HRESP_ram2</spirit:name> + <spirit:wire> + <spirit:direction>in</spirit:direction> + </spirit:wire> + </spirit:port> + <spirit:port> + <spirit:name>HRUSER_ram2</spirit:name> + <spirit:wire> + <spirit:direction>in</spirit:direction> + <spirit:vector> + <spirit:left>1</spirit:left> + <spirit:right>0</spirit:right> + </spirit:vector> + </spirit:wire> + </spirit:port> + <spirit:port> + <spirit:name>HRDATA_ram3</spirit:name> + <spirit:wire> + <spirit:direction>in</spirit:direction> + <spirit:vector> + <spirit:left>31</spirit:left> + <spirit:right>0</spirit:right> + </spirit:vector> + </spirit:wire> + </spirit:port> + <spirit:port> + <spirit:name>HREADYOUT_ram3</spirit:name> + <spirit:wire> + <spirit:direction>in</spirit:direction> + </spirit:wire> + </spirit:port> + <spirit:port> + <spirit:name>HRESP_ram3</spirit:name> + <spirit:wire> + <spirit:direction>in</spirit:direction> + </spirit:wire> + </spirit:port> + <spirit:port> + <spirit:name>HRUSER_ram3</spirit:name> + <spirit:wire> + <spirit:direction>in</spirit:direction> + <spirit:vector> + <spirit:left>1</spirit:left> + <spirit:right>0</spirit:right> + </spirit:vector> + </spirit:wire> + </spirit:port> + <spirit:port> + <spirit:name>HRDATA_sys</spirit:name> + <spirit:wire> + <spirit:direction>in</spirit:direction> + <spirit:vector> + <spirit:left>31</spirit:left> + <spirit:right>0</spirit:right> + </spirit:vector> + </spirit:wire> + </spirit:port> + <spirit:port> + <spirit:name>HREADYOUT_sys</spirit:name> + <spirit:wire> + <spirit:direction>in</spirit:direction> + </spirit:wire> + </spirit:port> + <spirit:port> + <spirit:name>HRESP_sys</spirit:name> + <spirit:wire> + <spirit:direction>in</spirit:direction> + </spirit:wire> + </spirit:port> + <spirit:port> + <spirit:name>HRUSER_sys</spirit:name> + <spirit:wire> + <spirit:direction>in</spirit:direction> + <spirit:vector> + <spirit:left>1</spirit:left> + <spirit:right>0</spirit:right> + </spirit:vector> + </spirit:wire> + </spirit:port> + <spirit:port> + <spirit:name>HRDATA_ram8</spirit:name> + <spirit:wire> + <spirit:direction>in</spirit:direction> + <spirit:vector> + <spirit:left>31</spirit:left> + <spirit:right>0</spirit:right> + </spirit:vector> + </spirit:wire> + </spirit:port> + <spirit:port> + <spirit:name>HREADYOUT_ram8</spirit:name> + <spirit:wire> + <spirit:direction>in</spirit:direction> + </spirit:wire> + </spirit:port> + <spirit:port> + <spirit:name>HRESP_ram8</spirit:name> + <spirit:wire> + <spirit:direction>in</spirit:direction> + </spirit:wire> + </spirit:port> + <spirit:port> + <spirit:name>HRUSER_ram8</spirit:name> + <spirit:wire> + <spirit:direction>in</spirit:direction> + <spirit:vector> + <spirit:left>1</spirit:left> + <spirit:right>0</spirit:right> + </spirit:vector> + </spirit:wire> + </spirit:port> + <spirit:port> + <spirit:name>HRDATA_ram9</spirit:name> + <spirit:wire> + <spirit:direction>in</spirit:direction> + <spirit:vector> + <spirit:left>31</spirit:left> + <spirit:right>0</spirit:right> + </spirit:vector> + </spirit:wire> + </spirit:port> + <spirit:port> + <spirit:name>HREADYOUT_ram9</spirit:name> + <spirit:wire> + <spirit:direction>in</spirit:direction> + </spirit:wire> + </spirit:port> + <spirit:port> + <spirit:name>HRESP_ram9</spirit:name> + <spirit:wire> + <spirit:direction>in</spirit:direction> + </spirit:wire> + </spirit:port> + <spirit:port> + <spirit:name>HRUSER_ram9</spirit:name> + <spirit:wire> + <spirit:direction>in</spirit:direction> + <spirit:vector> + <spirit:left>1</spirit:left> + <spirit:right>0</spirit:right> + </spirit:vector> + </spirit:wire> + </spirit:port> + <spirit:port> + <spirit:name>HRDATA_exp</spirit:name> + <spirit:wire> + <spirit:direction>in</spirit:direction> + <spirit:vector> + <spirit:left>31</spirit:left> + <spirit:right>0</spirit:right> + </spirit:vector> + </spirit:wire> + </spirit:port> + <spirit:port> + <spirit:name>HREADYOUT_exp</spirit:name> + <spirit:wire> + <spirit:direction>in</spirit:direction> + </spirit:wire> + </spirit:port> + <spirit:port> + <spirit:name>HRESP_exp</spirit:name> + <spirit:wire> + <spirit:direction>in</spirit:direction> + </spirit:wire> + </spirit:port> + <spirit:port> + <spirit:name>HRUSER_exp</spirit:name> + <spirit:wire> + <spirit:direction>in</spirit:direction> + <spirit:vector> + <spirit:left>1</spirit:left> + <spirit:right>0</spirit:right> + </spirit:vector> + </spirit:wire> + </spirit:port> + + <!-- Scan test dummy signals; not connected until scan insertion --> + + <spirit:port> + <spirit:name>SCANENABLE</spirit:name> + <spirit:wire> + <spirit:direction>in</spirit:direction> + </spirit:wire> + </spirit:port> + <spirit:port> + <spirit:name>SCANINHCLK</spirit:name> + <spirit:wire> + <spirit:direction>in</spirit:direction> + </spirit:wire> + </spirit:port> + + <!-- Output signals of Master interfaces --> + + <spirit:port> + <spirit:name>HSEL_rom1</spirit:name> + <spirit:wire> + <spirit:direction>out</spirit:direction> + </spirit:wire> + </spirit:port> + <spirit:port> + <spirit:name>HADDR_rom1</spirit:name> + <spirit:wire> + <spirit:direction>out</spirit:direction> + <spirit:vector> + <spirit:left>31</spirit:left> + <spirit:right>0</spirit:right> + </spirit:vector> + </spirit:wire> + </spirit:port> + <spirit:port> + <spirit:name>HTRANS_rom1</spirit:name> + <spirit:wire> + <spirit:direction>out</spirit:direction> + <spirit:vector> + <spirit:left>1</spirit:left> + <spirit:right>0</spirit:right> + </spirit:vector> + </spirit:wire> + </spirit:port> + <spirit:port> + <spirit:name>HWRITE_rom1</spirit:name> + <spirit:wire> + <spirit:direction>out</spirit:direction> + </spirit:wire> + </spirit:port> + <spirit:port> + <spirit:name>HSIZE_rom1</spirit:name> + <spirit:wire> + <spirit:direction>out</spirit:direction> + <spirit:vector> + <spirit:left>2</spirit:left> + <spirit:right>0</spirit:right> + </spirit:vector> + </spirit:wire> + </spirit:port> + <spirit:port> + <spirit:name>HBURST_rom1</spirit:name> + <spirit:wire> + <spirit:direction>out</spirit:direction> + <spirit:vector> + <spirit:left>2</spirit:left> + <spirit:right>0</spirit:right> + </spirit:vector> + </spirit:wire> + </spirit:port> + <spirit:port> + <spirit:name>HPROT_rom1</spirit:name> + <spirit:wire> + <spirit:direction>out</spirit:direction> + <spirit:vector> + <spirit:left>3</spirit:left> + <spirit:right>0</spirit:right> + </spirit:vector> + </spirit:wire> + </spirit:port> + <spirit:port> + <spirit:name>HWDATA_rom1</spirit:name> + <spirit:wire> + <spirit:direction>out</spirit:direction> + <spirit:vector> + <spirit:left>31</spirit:left> + <spirit:right>0</spirit:right> + </spirit:vector> + </spirit:wire> + </spirit:port> + <spirit:port> + <spirit:name>HMASTLOCK_rom1</spirit:name> + <spirit:wire> + <spirit:direction>out</spirit:direction> + </spirit:wire> + </spirit:port> + <spirit:port> + <spirit:name>HREADYMUX_rom1</spirit:name> + <spirit:wire> + <spirit:direction>out</spirit:direction> + </spirit:wire> + </spirit:port> + <spirit:port> + <spirit:name>HAUSER_rom1</spirit:name> + <spirit:wire> + <spirit:direction>out</spirit:direction> + <spirit:vector> + <spirit:left>1</spirit:left> + <spirit:right>0</spirit:right> + </spirit:vector> + </spirit:wire> + </spirit:port> + <spirit:port> + <spirit:name>HWUSER_rom1</spirit:name> + <spirit:wire> + <spirit:direction>out</spirit:direction> + <spirit:vector> + <spirit:left>1</spirit:left> + <spirit:right>0</spirit:right> + </spirit:vector> + </spirit:wire> + </spirit:port> + <spirit:port> + <spirit:name>HSEL_ram2</spirit:name> + <spirit:wire> + <spirit:direction>out</spirit:direction> + </spirit:wire> + </spirit:port> + <spirit:port> + <spirit:name>HADDR_ram2</spirit:name> + <spirit:wire> + <spirit:direction>out</spirit:direction> + <spirit:vector> + <spirit:left>31</spirit:left> + <spirit:right>0</spirit:right> + </spirit:vector> + </spirit:wire> + </spirit:port> + <spirit:port> + <spirit:name>HTRANS_ram2</spirit:name> + <spirit:wire> + <spirit:direction>out</spirit:direction> + <spirit:vector> + <spirit:left>1</spirit:left> + <spirit:right>0</spirit:right> + </spirit:vector> + </spirit:wire> + </spirit:port> + <spirit:port> + <spirit:name>HWRITE_ram2</spirit:name> + <spirit:wire> + <spirit:direction>out</spirit:direction> + </spirit:wire> + </spirit:port> + <spirit:port> + <spirit:name>HSIZE_ram2</spirit:name> + <spirit:wire> + <spirit:direction>out</spirit:direction> + <spirit:vector> + <spirit:left>2</spirit:left> + <spirit:right>0</spirit:right> + </spirit:vector> + </spirit:wire> + </spirit:port> + <spirit:port> + <spirit:name>HBURST_ram2</spirit:name> + <spirit:wire> + <spirit:direction>out</spirit:direction> + <spirit:vector> + <spirit:left>2</spirit:left> + <spirit:right>0</spirit:right> + </spirit:vector> + </spirit:wire> + </spirit:port> + <spirit:port> + <spirit:name>HPROT_ram2</spirit:name> + <spirit:wire> + <spirit:direction>out</spirit:direction> + <spirit:vector> + <spirit:left>3</spirit:left> + <spirit:right>0</spirit:right> + </spirit:vector> + </spirit:wire> + </spirit:port> + <spirit:port> + <spirit:name>HWDATA_ram2</spirit:name> + <spirit:wire> + <spirit:direction>out</spirit:direction> + <spirit:vector> + <spirit:left>31</spirit:left> + <spirit:right>0</spirit:right> + </spirit:vector> + </spirit:wire> + </spirit:port> + <spirit:port> + <spirit:name>HMASTLOCK_ram2</spirit:name> + <spirit:wire> + <spirit:direction>out</spirit:direction> + </spirit:wire> + </spirit:port> + <spirit:port> + <spirit:name>HREADYMUX_ram2</spirit:name> + <spirit:wire> + <spirit:direction>out</spirit:direction> + </spirit:wire> + </spirit:port> + <spirit:port> + <spirit:name>HAUSER_ram2</spirit:name> + <spirit:wire> + <spirit:direction>out</spirit:direction> + <spirit:vector> + <spirit:left>1</spirit:left> + <spirit:right>0</spirit:right> + </spirit:vector> + </spirit:wire> + </spirit:port> + <spirit:port> + <spirit:name>HWUSER_ram2</spirit:name> + <spirit:wire> + <spirit:direction>out</spirit:direction> + <spirit:vector> + <spirit:left>1</spirit:left> + <spirit:right>0</spirit:right> + </spirit:vector> + </spirit:wire> + </spirit:port> + <spirit:port> + <spirit:name>HSEL_ram3</spirit:name> + <spirit:wire> + <spirit:direction>out</spirit:direction> + </spirit:wire> + </spirit:port> + <spirit:port> + <spirit:name>HADDR_ram3</spirit:name> + <spirit:wire> + <spirit:direction>out</spirit:direction> + <spirit:vector> + <spirit:left>31</spirit:left> + <spirit:right>0</spirit:right> + </spirit:vector> + </spirit:wire> + </spirit:port> + <spirit:port> + <spirit:name>HTRANS_ram3</spirit:name> + <spirit:wire> + <spirit:direction>out</spirit:direction> + <spirit:vector> + <spirit:left>1</spirit:left> + <spirit:right>0</spirit:right> + </spirit:vector> + </spirit:wire> + </spirit:port> + <spirit:port> + <spirit:name>HWRITE_ram3</spirit:name> + <spirit:wire> + <spirit:direction>out</spirit:direction> + </spirit:wire> + </spirit:port> + <spirit:port> + <spirit:name>HSIZE_ram3</spirit:name> + <spirit:wire> + <spirit:direction>out</spirit:direction> + <spirit:vector> + <spirit:left>2</spirit:left> + <spirit:right>0</spirit:right> + </spirit:vector> + </spirit:wire> + </spirit:port> + <spirit:port> + <spirit:name>HBURST_ram3</spirit:name> + <spirit:wire> + <spirit:direction>out</spirit:direction> + <spirit:vector> + <spirit:left>2</spirit:left> + <spirit:right>0</spirit:right> + </spirit:vector> + </spirit:wire> + </spirit:port> + <spirit:port> + <spirit:name>HPROT_ram3</spirit:name> + <spirit:wire> + <spirit:direction>out</spirit:direction> + <spirit:vector> + <spirit:left>3</spirit:left> + <spirit:right>0</spirit:right> + </spirit:vector> + </spirit:wire> + </spirit:port> + <spirit:port> + <spirit:name>HWDATA_ram3</spirit:name> + <spirit:wire> + <spirit:direction>out</spirit:direction> + <spirit:vector> + <spirit:left>31</spirit:left> + <spirit:right>0</spirit:right> + </spirit:vector> + </spirit:wire> + </spirit:port> + <spirit:port> + <spirit:name>HMASTLOCK_ram3</spirit:name> + <spirit:wire> + <spirit:direction>out</spirit:direction> + </spirit:wire> + </spirit:port> + <spirit:port> + <spirit:name>HREADYMUX_ram3</spirit:name> + <spirit:wire> + <spirit:direction>out</spirit:direction> + </spirit:wire> + </spirit:port> + <spirit:port> + <spirit:name>HAUSER_ram3</spirit:name> + <spirit:wire> + <spirit:direction>out</spirit:direction> + <spirit:vector> + <spirit:left>1</spirit:left> + <spirit:right>0</spirit:right> + </spirit:vector> + </spirit:wire> + </spirit:port> + <spirit:port> + <spirit:name>HWUSER_ram3</spirit:name> + <spirit:wire> + <spirit:direction>out</spirit:direction> + <spirit:vector> + <spirit:left>1</spirit:left> + <spirit:right>0</spirit:right> + </spirit:vector> + </spirit:wire> + </spirit:port> + <spirit:port> + <spirit:name>HSEL_sys</spirit:name> + <spirit:wire> + <spirit:direction>out</spirit:direction> + </spirit:wire> + </spirit:port> + <spirit:port> + <spirit:name>HADDR_sys</spirit:name> + <spirit:wire> + <spirit:direction>out</spirit:direction> + <spirit:vector> + <spirit:left>31</spirit:left> + <spirit:right>0</spirit:right> + </spirit:vector> + </spirit:wire> + </spirit:port> + <spirit:port> + <spirit:name>HTRANS_sys</spirit:name> + <spirit:wire> + <spirit:direction>out</spirit:direction> + <spirit:vector> + <spirit:left>1</spirit:left> + <spirit:right>0</spirit:right> + </spirit:vector> + </spirit:wire> + </spirit:port> + <spirit:port> + <spirit:name>HWRITE_sys</spirit:name> + <spirit:wire> + <spirit:direction>out</spirit:direction> + </spirit:wire> + </spirit:port> + <spirit:port> + <spirit:name>HSIZE_sys</spirit:name> + <spirit:wire> + <spirit:direction>out</spirit:direction> + <spirit:vector> + <spirit:left>2</spirit:left> + <spirit:right>0</spirit:right> + </spirit:vector> + </spirit:wire> + </spirit:port> + <spirit:port> + <spirit:name>HBURST_sys</spirit:name> + <spirit:wire> + <spirit:direction>out</spirit:direction> + <spirit:vector> + <spirit:left>2</spirit:left> + <spirit:right>0</spirit:right> + </spirit:vector> + </spirit:wire> + </spirit:port> + <spirit:port> + <spirit:name>HPROT_sys</spirit:name> + <spirit:wire> + <spirit:direction>out</spirit:direction> + <spirit:vector> + <spirit:left>3</spirit:left> + <spirit:right>0</spirit:right> + </spirit:vector> + </spirit:wire> + </spirit:port> + <spirit:port> + <spirit:name>HWDATA_sys</spirit:name> + <spirit:wire> + <spirit:direction>out</spirit:direction> + <spirit:vector> + <spirit:left>31</spirit:left> + <spirit:right>0</spirit:right> + </spirit:vector> + </spirit:wire> + </spirit:port> + <spirit:port> + <spirit:name>HMASTLOCK_sys</spirit:name> + <spirit:wire> + <spirit:direction>out</spirit:direction> + </spirit:wire> + </spirit:port> + <spirit:port> + <spirit:name>HREADYMUX_sys</spirit:name> + <spirit:wire> + <spirit:direction>out</spirit:direction> + </spirit:wire> + </spirit:port> + <spirit:port> + <spirit:name>HAUSER_sys</spirit:name> + <spirit:wire> + <spirit:direction>out</spirit:direction> + <spirit:vector> + <spirit:left>1</spirit:left> + <spirit:right>0</spirit:right> + </spirit:vector> + </spirit:wire> + </spirit:port> + <spirit:port> + <spirit:name>HWUSER_sys</spirit:name> + <spirit:wire> + <spirit:direction>out</spirit:direction> + <spirit:vector> + <spirit:left>1</spirit:left> + <spirit:right>0</spirit:right> + </spirit:vector> + </spirit:wire> + </spirit:port> + <spirit:port> + <spirit:name>HSEL_ram8</spirit:name> + <spirit:wire> + <spirit:direction>out</spirit:direction> + </spirit:wire> + </spirit:port> + <spirit:port> + <spirit:name>HADDR_ram8</spirit:name> + <spirit:wire> + <spirit:direction>out</spirit:direction> + <spirit:vector> + <spirit:left>31</spirit:left> + <spirit:right>0</spirit:right> + </spirit:vector> + </spirit:wire> + </spirit:port> + <spirit:port> + <spirit:name>HTRANS_ram8</spirit:name> + <spirit:wire> + <spirit:direction>out</spirit:direction> + <spirit:vector> + <spirit:left>1</spirit:left> + <spirit:right>0</spirit:right> + </spirit:vector> + </spirit:wire> + </spirit:port> + <spirit:port> + <spirit:name>HWRITE_ram8</spirit:name> + <spirit:wire> + <spirit:direction>out</spirit:direction> + </spirit:wire> + </spirit:port> + <spirit:port> + <spirit:name>HSIZE_ram8</spirit:name> + <spirit:wire> + <spirit:direction>out</spirit:direction> + <spirit:vector> + <spirit:left>2</spirit:left> + <spirit:right>0</spirit:right> + </spirit:vector> + </spirit:wire> + </spirit:port> + <spirit:port> + <spirit:name>HBURST_ram8</spirit:name> + <spirit:wire> + <spirit:direction>out</spirit:direction> + <spirit:vector> + <spirit:left>2</spirit:left> + <spirit:right>0</spirit:right> + </spirit:vector> + </spirit:wire> + </spirit:port> + <spirit:port> + <spirit:name>HPROT_ram8</spirit:name> + <spirit:wire> + <spirit:direction>out</spirit:direction> + <spirit:vector> + <spirit:left>3</spirit:left> + <spirit:right>0</spirit:right> + </spirit:vector> + </spirit:wire> + </spirit:port> + <spirit:port> + <spirit:name>HWDATA_ram8</spirit:name> + <spirit:wire> + <spirit:direction>out</spirit:direction> + <spirit:vector> + <spirit:left>31</spirit:left> + <spirit:right>0</spirit:right> + </spirit:vector> + </spirit:wire> + </spirit:port> + <spirit:port> + <spirit:name>HMASTLOCK_ram8</spirit:name> + <spirit:wire> + <spirit:direction>out</spirit:direction> + </spirit:wire> + </spirit:port> + <spirit:port> + <spirit:name>HREADYMUX_ram8</spirit:name> + <spirit:wire> + <spirit:direction>out</spirit:direction> + </spirit:wire> + </spirit:port> + <spirit:port> + <spirit:name>HAUSER_ram8</spirit:name> + <spirit:wire> + <spirit:direction>out</spirit:direction> + <spirit:vector> + <spirit:left>1</spirit:left> + <spirit:right>0</spirit:right> + </spirit:vector> + </spirit:wire> + </spirit:port> + <spirit:port> + <spirit:name>HWUSER_ram8</spirit:name> + <spirit:wire> + <spirit:direction>out</spirit:direction> + <spirit:vector> + <spirit:left>1</spirit:left> + <spirit:right>0</spirit:right> + </spirit:vector> + </spirit:wire> + </spirit:port> + <spirit:port> + <spirit:name>HSEL_ram9</spirit:name> + <spirit:wire> + <spirit:direction>out</spirit:direction> + </spirit:wire> + </spirit:port> + <spirit:port> + <spirit:name>HADDR_ram9</spirit:name> + <spirit:wire> + <spirit:direction>out</spirit:direction> + <spirit:vector> + <spirit:left>31</spirit:left> + <spirit:right>0</spirit:right> + </spirit:vector> + </spirit:wire> + </spirit:port> + <spirit:port> + <spirit:name>HTRANS_ram9</spirit:name> + <spirit:wire> + <spirit:direction>out</spirit:direction> + <spirit:vector> + <spirit:left>1</spirit:left> + <spirit:right>0</spirit:right> + </spirit:vector> + </spirit:wire> + </spirit:port> + <spirit:port> + <spirit:name>HWRITE_ram9</spirit:name> + <spirit:wire> + <spirit:direction>out</spirit:direction> + </spirit:wire> + </spirit:port> + <spirit:port> + <spirit:name>HSIZE_ram9</spirit:name> + <spirit:wire> + <spirit:direction>out</spirit:direction> + <spirit:vector> + <spirit:left>2</spirit:left> + <spirit:right>0</spirit:right> + </spirit:vector> + </spirit:wire> + </spirit:port> + <spirit:port> + <spirit:name>HBURST_ram9</spirit:name> + <spirit:wire> + <spirit:direction>out</spirit:direction> + <spirit:vector> + <spirit:left>2</spirit:left> + <spirit:right>0</spirit:right> + </spirit:vector> + </spirit:wire> + </spirit:port> + <spirit:port> + <spirit:name>HPROT_ram9</spirit:name> + <spirit:wire> + <spirit:direction>out</spirit:direction> + <spirit:vector> + <spirit:left>3</spirit:left> + <spirit:right>0</spirit:right> + </spirit:vector> + </spirit:wire> + </spirit:port> + <spirit:port> + <spirit:name>HWDATA_ram9</spirit:name> + <spirit:wire> + <spirit:direction>out</spirit:direction> + <spirit:vector> + <spirit:left>31</spirit:left> + <spirit:right>0</spirit:right> + </spirit:vector> + </spirit:wire> + </spirit:port> + <spirit:port> + <spirit:name>HMASTLOCK_ram9</spirit:name> + <spirit:wire> + <spirit:direction>out</spirit:direction> + </spirit:wire> + </spirit:port> + <spirit:port> + <spirit:name>HREADYMUX_ram9</spirit:name> + <spirit:wire> + <spirit:direction>out</spirit:direction> + </spirit:wire> + </spirit:port> + <spirit:port> + <spirit:name>HAUSER_ram9</spirit:name> + <spirit:wire> + <spirit:direction>out</spirit:direction> + <spirit:vector> + <spirit:left>1</spirit:left> + <spirit:right>0</spirit:right> + </spirit:vector> + </spirit:wire> + </spirit:port> + <spirit:port> + <spirit:name>HWUSER_ram9</spirit:name> + <spirit:wire> + <spirit:direction>out</spirit:direction> + <spirit:vector> + <spirit:left>1</spirit:left> + <spirit:right>0</spirit:right> + </spirit:vector> + </spirit:wire> + </spirit:port> + <spirit:port> + <spirit:name>HSEL_exp</spirit:name> + <spirit:wire> + <spirit:direction>out</spirit:direction> + </spirit:wire> + </spirit:port> + <spirit:port> + <spirit:name>HADDR_exp</spirit:name> + <spirit:wire> + <spirit:direction>out</spirit:direction> + <spirit:vector> + <spirit:left>31</spirit:left> + <spirit:right>0</spirit:right> + </spirit:vector> + </spirit:wire> + </spirit:port> + <spirit:port> + <spirit:name>HTRANS_exp</spirit:name> + <spirit:wire> + <spirit:direction>out</spirit:direction> + <spirit:vector> + <spirit:left>1</spirit:left> + <spirit:right>0</spirit:right> + </spirit:vector> + </spirit:wire> + </spirit:port> + <spirit:port> + <spirit:name>HWRITE_exp</spirit:name> + <spirit:wire> + <spirit:direction>out</spirit:direction> + </spirit:wire> + </spirit:port> + <spirit:port> + <spirit:name>HSIZE_exp</spirit:name> + <spirit:wire> + <spirit:direction>out</spirit:direction> + <spirit:vector> + <spirit:left>2</spirit:left> + <spirit:right>0</spirit:right> + </spirit:vector> + </spirit:wire> + </spirit:port> + <spirit:port> + <spirit:name>HBURST_exp</spirit:name> + <spirit:wire> + <spirit:direction>out</spirit:direction> + <spirit:vector> + <spirit:left>2</spirit:left> + <spirit:right>0</spirit:right> + </spirit:vector> + </spirit:wire> + </spirit:port> + <spirit:port> + <spirit:name>HPROT_exp</spirit:name> + <spirit:wire> + <spirit:direction>out</spirit:direction> + <spirit:vector> + <spirit:left>3</spirit:left> + <spirit:right>0</spirit:right> + </spirit:vector> + </spirit:wire> + </spirit:port> + <spirit:port> + <spirit:name>HWDATA_exp</spirit:name> + <spirit:wire> + <spirit:direction>out</spirit:direction> + <spirit:vector> + <spirit:left>31</spirit:left> + <spirit:right>0</spirit:right> + </spirit:vector> + </spirit:wire> + </spirit:port> + <spirit:port> + <spirit:name>HMASTLOCK_exp</spirit:name> + <spirit:wire> + <spirit:direction>out</spirit:direction> + </spirit:wire> + </spirit:port> + <spirit:port> + <spirit:name>HREADYMUX_exp</spirit:name> + <spirit:wire> + <spirit:direction>out</spirit:direction> + </spirit:wire> + </spirit:port> + <spirit:port> + <spirit:name>HAUSER_exp</spirit:name> + <spirit:wire> + <spirit:direction>out</spirit:direction> + <spirit:vector> + <spirit:left>1</spirit:left> + <spirit:right>0</spirit:right> + </spirit:vector> + </spirit:wire> + </spirit:port> + <spirit:port> + <spirit:name>HWUSER_exp</spirit:name> + <spirit:wire> + <spirit:direction>out</spirit:direction> + <spirit:vector> + <spirit:left>1</spirit:left> + <spirit:right>0</spirit:right> + </spirit:vector> + </spirit:wire> + </spirit:port> + + <!-- Output signals of Slave interfaces --> + + <spirit:port> + <spirit:name>HRDATA_adp</spirit:name> + <spirit:wire> + <spirit:direction>out</spirit:direction> + <spirit:vector> + <spirit:left>31</spirit:left> + <spirit:right>0</spirit:right> + </spirit:vector> + </spirit:wire> + </spirit:port> + <spirit:port> + <spirit:name>HREADY_adp</spirit:name> + <spirit:wire> + <spirit:direction>out</spirit:direction> + </spirit:wire> + </spirit:port> + <spirit:port> + <spirit:name>HRESP_adp</spirit:name> + <spirit:wire> + <spirit:direction>out</spirit:direction> + </spirit:wire> + </spirit:port> + <spirit:port> + <spirit:name>HRUSER_adp</spirit:name> + <spirit:wire> + <spirit:direction>out</spirit:direction> + <spirit:vector> + <spirit:left>1</spirit:left> + <spirit:right>0</spirit:right> + </spirit:vector> + </spirit:wire> + </spirit:port> + <spirit:port> + <spirit:name>HRDATA_dma</spirit:name> + <spirit:wire> + <spirit:direction>out</spirit:direction> + <spirit:vector> + <spirit:left>31</spirit:left> + <spirit:right>0</spirit:right> + </spirit:vector> + </spirit:wire> + </spirit:port> + <spirit:port> + <spirit:name>HREADY_dma</spirit:name> + <spirit:wire> + <spirit:direction>out</spirit:direction> + </spirit:wire> + </spirit:port> + <spirit:port> + <spirit:name>HRESP_dma</spirit:name> + <spirit:wire> + <spirit:direction>out</spirit:direction> + </spirit:wire> + </spirit:port> + <spirit:port> + <spirit:name>HRUSER_dma</spirit:name> + <spirit:wire> + <spirit:direction>out</spirit:direction> + <spirit:vector> + <spirit:left>1</spirit:left> + <spirit:right>0</spirit:right> + </spirit:vector> + </spirit:wire> + </spirit:port> + <spirit:port> + <spirit:name>HRDATA_dma2</spirit:name> + <spirit:wire> + <spirit:direction>out</spirit:direction> + <spirit:vector> + <spirit:left>31</spirit:left> + <spirit:right>0</spirit:right> + </spirit:vector> + </spirit:wire> + </spirit:port> + <spirit:port> + <spirit:name>HREADY_dma2</spirit:name> + <spirit:wire> + <spirit:direction>out</spirit:direction> + </spirit:wire> + </spirit:port> + <spirit:port> + <spirit:name>HRESP_dma2</spirit:name> + <spirit:wire> + <spirit:direction>out</spirit:direction> + </spirit:wire> + </spirit:port> + <spirit:port> + <spirit:name>HRUSER_dma2</spirit:name> + <spirit:wire> + <spirit:direction>out</spirit:direction> + <spirit:vector> + <spirit:left>1</spirit:left> + <spirit:right>0</spirit:right> + </spirit:vector> + </spirit:wire> + </spirit:port> + <spirit:port> + <spirit:name>HRDATA_cpu</spirit:name> + <spirit:wire> + <spirit:direction>out</spirit:direction> + <spirit:vector> + <spirit:left>31</spirit:left> + <spirit:right>0</spirit:right> + </spirit:vector> + </spirit:wire> + </spirit:port> + <spirit:port> + <spirit:name>HREADY_cpu</spirit:name> + <spirit:wire> + <spirit:direction>out</spirit:direction> + </spirit:wire> + </spirit:port> + <spirit:port> + <spirit:name>HRESP_cpu</spirit:name> + <spirit:wire> + <spirit:direction>out</spirit:direction> + </spirit:wire> + </spirit:port> + <spirit:port> + <spirit:name>HRUSER_cpu</spirit:name> + <spirit:wire> + <spirit:direction>out</spirit:direction> + <spirit:vector> + <spirit:left>1</spirit:left> + <spirit:right>0</spirit:right> + </spirit:vector> + </spirit:wire> + </spirit:port> + + <!-- Scan test dummy signals; not connected until scan insertion --> + + <spirit:port> + <spirit:name>SCANOUTHCLK</spirit:name> + <spirit:wire> + <spirit:direction>out</spirit:direction> + </spirit:wire> + </spirit:port> + </spirit:ports> + </spirit:model> + + <spirit:fileSets> + <spirit:fileSet> + <spirit:name>fs-verilogsource</spirit:name> + <spirit:displayName/> + <spirit:description>File list for soclabs_4x7_AhbMatrix_lite</spirit:description> + <spirit:file> + <spirit:name>../../../verilog/built/soclabs_4x7_AhbMatrix/soclabs_4x7_AhbMatrix_lite.v</spirit:name> + <spirit:fileType>verilogSource-2001</spirit:fileType> + <spirit:isIncludeFile spirit:externalDeclarations="true">false</spirit:isIncludeFile> + </spirit:file> + <spirit:file> + <spirit:name>../../../verilog/built/soclabs_4x7_AhbMatrix/soclabs_4x7_AhbMatrix.v</spirit:name> + <spirit:fileType>verilogSource-2001</spirit:fileType> + </spirit:file> + <spirit:file> + <spirit:name>../../../verilog/built/soclabs_4x7_AhbMatrix/soclabs_4x7_AhbMatrix_default_slave.v</spirit:name> + <spirit:fileType>verilogSource-2001</spirit:fileType> + </spirit:file> + <spirit:file> + <spirit:name>../../../verilog/built/soclabs_4x7_AhbMatrix/soclabs_4x7_MasterInput.v</spirit:name> + <spirit:fileType>verilogSource-2001</spirit:fileType> + </spirit:file> + <spirit:file> + <spirit:name>../../../verilog/built/soclabs_4x7_AhbMatrix/soclabs_4x7_MatrixDecode_adp.v</spirit:name> + <spirit:fileType>verilogSource-2001</spirit:fileType> + </spirit:file> + <spirit:file> + <spirit:name>../../../verilog/built/soclabs_4x7_AhbMatrix/soclabs_4x7_MatrixDecode_dma.v</spirit:name> + <spirit:fileType>verilogSource-2001</spirit:fileType> + </spirit:file> + <spirit:file> + <spirit:name>../../../verilog/built/soclabs_4x7_AhbMatrix/soclabs_4x7_MatrixDecode_dma2.v</spirit:name> + <spirit:fileType>verilogSource-2001</spirit:fileType> + </spirit:file> + <spirit:file> + <spirit:name>../../../verilog/built/soclabs_4x7_AhbMatrix/soclabs_4x7_MatrixDecode_cpu.v</spirit:name> + <spirit:fileType>verilogSource-2001</spirit:fileType> + </spirit:file> + <spirit:file> + <spirit:name>../../../verilog/built/soclabs_4x7_AhbMatrix/soclabs_4x7_Arbiter.v</spirit:name> + <spirit:fileType>verilogSource-2001</spirit:fileType> + </spirit:file> + <spirit:file> + <spirit:name>../../../verilog/built/soclabs_4x7_AhbMatrix/soclabs_4x7_SlaveOutput.v</spirit:name> + <spirit:fileType>verilogSource-2001</spirit:fileType> + </spirit:file> + </spirit:fileSet> + </spirit:fileSets> + + <spirit:description>soclabs_4x7_AhbMatrix_lite</spirit:description> + +</spirit:component> diff --git a/Cortex-M0/nanosoc/systems/mcu/verilog/gen_ahb_busmatrix/ipxact/src/cmsdk_ahb_busmatrix_ipxact.xml b/Cortex-M0/nanosoc/systems/mcu/verilog/gen_ahb_busmatrix/ipxact/src/cmsdk_ahb_busmatrix_ipxact.xml new file mode 100755 index 0000000..f7280ff --- /dev/null +++ b/Cortex-M0/nanosoc/systems/mcu/verilog/gen_ahb_busmatrix/ipxact/src/cmsdk_ahb_busmatrix_ipxact.xml @@ -0,0 +1,1050 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - --> +<!-- The confidential and proprietary information contained in this file may --> +<!-- only be used by a person authorised under and to the extent permitted --> +<!-- by a subsisting licensing agreement from ARM Limited or its affiliates. --> +<!-- --> +<!-- (C) COPYRIGHT 2001-2017 ARM Limited or its affiliates. --> +<!-- ALL RIGHTS RESERVED --> +<!-- --> +<!-- This entire notice must be reproduced on all copies of this file --> +<!-- and copies of this file may only be made by a person if such person is --> +<!-- permitted to do so under the terms of a subsisting license agreement --> +<!-- from ARM Limited or its affiliates. --> +<!-- --> +<!-- SVN Information --> +<!-- --> +<!-- Checked In : $Date: 2017-10-10 15:55:38 +0100 (Tue, 10 Oct 2017) $ --> +<!-- --> +<!-- Revision : $Revision: 371321 $ --> +<!-- --> +<!-- Release Information : Cortex-M System Design Kit-r1p1-00rel0 --> +<!-- --> +<!-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - --> +<!-- Purpose : IP-XACT description for the main top of <<bus_matrix_name>> --> +<!-- --> +<!-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - --> + +<spirit:component xmlns:spirit="http://www.spiritconsortium.org/XMLSchema/SPIRIT/1685-2009" + xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:schemaLocation="http://www.spiritconsortium.org/XMLSchema/SPIRIT/1685-2009 http://www.spiritconsortium.org/XMLSchema/SPIRIT/1685-2009/index.xsd"> + <spirit:vendor>arm.com</spirit:vendor> + <spirit:library>CoreLink</spirit:library> + <spirit:name><<bus_matrix_name>></spirit:name> + <spirit:version>r0p0_0</spirit:version> + + <spirit:busInterfaces> + + <!--Slave interfaces --> +//---------------------------------------- << start in >> --------------------------------------- + + <spirit:busInterface> + <spirit:name>AHBLiteTarget_Slave_<<si_name>></spirit:name> + <spirit:description>Slave port <<si_name>></spirit:description> + <spirit:busType spirit:library="AMBA3" spirit:name="AHBLiteTarget" spirit:vendor="amba.com" spirit:version="r2p0_0"/> + <spirit:abstractionType spirit:library="AMBA3" spirit:name="AHBLiteTarget_rtl" spirit:vendor="amba.com" spirit:version="r2p0_0"/> + <spirit:slave> + <spirit:memoryMapRef spirit:memoryMapRef="AHBLiteTarget_Slave_<<si_name>>_MM"/> +//---------------------------------------- << start out >> -------------------------------------- +//------------------------------------- << start connection >> ------------------------------------ + <spirit:bridge spirit:masterRef="AHBLiteTarget_Master_<<mi_name>>" spirit:opaque="true"/> +//------------------------------------- << end connection >> -------------------------------------- +//---------------------------------------- << end out >> ---------------------------------------- + </spirit:slave> + + <spirit:portMaps> + <!-- Clock/reset --> + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>HCLK</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>HCLK</spirit:name> + </spirit:physicalPort> + </spirit:portMap> + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>HRESETn</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>HRESETn</spirit:name> + </spirit:physicalPort> + </spirit:portMap> + <!-- Inputs --> + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>HSELx</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>HSEL<<si_name>></spirit:name> + </spirit:physicalPort> + </spirit:portMap> + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>HADDR</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>HADDR<<si_name>></spirit:name> + </spirit:physicalPort> + </spirit:portMap> + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>HTRANS</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>HTRANS<<si_name>></spirit:name> + </spirit:physicalPort> + </spirit:portMap> + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>HWRITE</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>HWRITE<<si_name>></spirit:name> + </spirit:physicalPort> + </spirit:portMap> + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>HSIZE</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>HSIZE<<si_name>></spirit:name> + </spirit:physicalPort> + </spirit:portMap> + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>HBURST</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>HBURST<<si_name>></spirit:name> + </spirit:physicalPort> + </spirit:portMap> + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>HPROT</spirit:name> +//---------------------------------------- << start excl >> ------------------------------------- + <spirit:vector> + <spirit:left>3</spirit:left> + <spirit:right>0</spirit:right> + </spirit:vector> +//---------------------------------------- << end excl >> ------------------------------------- + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>HPROT<<si_name>></spirit:name> +//---------------------------------------- << start excl >> ------------------------------------- + <spirit:vector> + <spirit:left>3</spirit:left> + <spirit:right>0</spirit:right> + </spirit:vector> +//---------------------------------------- << end excl >> ------------------------------------- + </spirit:physicalPort> + </spirit:portMap> +//---------------------------- << start unalign >> ----------------------------- + + <!-- HUNALIGN<<si_name>> unmapped --> + <!-- HBSTRB<<si_name>> unmapped --> + +//----------------------------- << end unalign >> ------------------------------ + + <!-- HMASTER<<si_name>> unmapped --> + + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>HWDATA</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>HWDATA<<si_name>></spirit:name> + </spirit:physicalPort> + </spirit:portMap> + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>HMASTLOCK</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>HMASTLOCK<<si_name>></spirit:name> + </spirit:physicalPort> + </spirit:portMap> + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>HREADY</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>HREADY<<si_name>></spirit:name> + </spirit:physicalPort> + </spirit:portMap> +//---------------------------------------- << start user >> ------------------------------------- + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>HAUSER</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>HAUSER<<si_name>></spirit:name> + </spirit:physicalPort> + </spirit:portMap> + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>HWUSER</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>HWUSER<<si_name>></spirit:name> + </spirit:physicalPort> + </spirit:portMap> +//---------------------------------------- << end user >> --------------------------------------- + + <!-- Outputs --> + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>HRDATA</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>HRDATA<<si_name>></spirit:name> + </spirit:physicalPort> + </spirit:portMap> + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>HREADYOUT</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>HREADYOUT<<si_name>></spirit:name> + </spirit:physicalPort> + </spirit:portMap> + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>HRESP</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>HRESP<<si_name>></spirit:name> + <spirit:vector> + <spirit:left>0</spirit:left> + <spirit:right>0</spirit:right> + </spirit:vector> + </spirit:physicalPort> + </spirit:portMap> +//---------------------------------------- << start user >> ------------------------------------- + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>HRUSER</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>HRUSER<<si_name>></spirit:name> + </spirit:physicalPort> + </spirit:portMap> +//---------------------------------------- << end user >> --------------------------------------- + </spirit:portMaps> + </spirit:busInterface> +//----------------------------------------- << end in >> ---------------------------------------- + + <!--Master interfaces --> +//---------------------------------------- << start out >> -------------------------------------- + + <spirit:busInterface> + <spirit:name>AHBLiteTarget_Master_<<mi_name>></spirit:name> + <spirit:description>Master port <<mi_name>></spirit:description> + <spirit:busType spirit:library="AMBA3" spirit:name="AHBLiteTarget" spirit:vendor="amba.com" spirit:version="r2p0_0"/> + <spirit:abstractionType spirit:library="AMBA3" spirit:name="AHBLiteTarget_rtl" spirit:vendor="amba.com" spirit:version="r2p0_0"/> + <spirit:master> + <spirit:addressSpaceRef spirit:addressSpaceRef="AHBLiteTarget_Master_<<mi_name>>_AS"/> + </spirit:master> + + <spirit:portMaps> + <!-- Clock/reset --> + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>HCLK</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>HCLK</spirit:name> + </spirit:physicalPort> + </spirit:portMap> + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>HRESETn</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>HRESETn</spirit:name> + </spirit:physicalPort> + </spirit:portMap> + <!-- Outputs --> + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>HSELx</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>HSEL<<mi_name>></spirit:name> + </spirit:physicalPort> + </spirit:portMap> + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>HADDR</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>HADDR<<mi_name>></spirit:name> + </spirit:physicalPort> + </spirit:portMap> + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>HTRANS</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>HTRANS<<mi_name>></spirit:name> + </spirit:physicalPort> + </spirit:portMap> + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>HWRITE</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>HWRITE<<mi_name>></spirit:name> + </spirit:physicalPort> + </spirit:portMap> + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>HSIZE</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>HSIZE<<mi_name>></spirit:name> + </spirit:physicalPort> + </spirit:portMap> + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>HBURST</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>HBURST<<mi_name>></spirit:name> + </spirit:physicalPort> + </spirit:portMap> + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>HPROT</spirit:name> +//---------------------------------------- << start excl >> ------------------------------------- + <spirit:vector> + <spirit:left>3</spirit:left> + <spirit:right>0</spirit:right> + </spirit:vector> +//---------------------------------------- << end excl >> ------------------------------------- + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>HPROT<<mi_name>></spirit:name> +//---------------------------------------- << start excl >> ------------------------------------- + <spirit:vector> + <spirit:left>3</spirit:left> + <spirit:right>0</spirit:right> + </spirit:vector> +//---------------------------------------- << end excl >> ------------------------------------- + </spirit:physicalPort> + </spirit:portMap> +//---------------------------- << start unalign >> ----------------------------- + + <!-- HUNALIGN<<mi_name>> unmapped --> + + <!-- HBSTRB<<mi_name>> unmapped --> + +//----------------------------- << end unalign >> ------------------------------ + + <!-- HMASTER<<mi_name>> unmapped --> + + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>HWDATA</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>HWDATA<<mi_name>></spirit:name> + </spirit:physicalPort> + </spirit:portMap> + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>HMASTLOCK</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>HMASTLOCK<<mi_name>></spirit:name> + </spirit:physicalPort> + </spirit:portMap> + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>HREADY</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>HREADYMUX<<mi_name>></spirit:name> + </spirit:physicalPort> + </spirit:portMap> +//---------------------------------------- << start user >> ------------------------------------- + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>HAUSER</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>HAUSER<<mi_name>></spirit:name> + </spirit:physicalPort> + </spirit:portMap> + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>HWUSER</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>HWUSER<<mi_name>></spirit:name> + </spirit:physicalPort> + </spirit:portMap> +//---------------------------------------- << end user >> --------------------------------------- + + <!-- Inputs --> + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>HRDATA</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>HRDATA<<mi_name>></spirit:name> + </spirit:physicalPort> + </spirit:portMap> + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>HREADYOUT</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>HREADYOUT<<mi_name>></spirit:name> + </spirit:physicalPort> + </spirit:portMap> + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>HRESP</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>HRESP<<mi_name>></spirit:name> + <spirit:vector> + <spirit:left>0</spirit:left> + <spirit:right>0</spirit:right> + </spirit:vector> + </spirit:physicalPort> + </spirit:portMap> +//---------------------------------------- << start user >> ------------------------------------- + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>HRUSER</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>HRUSER<<mi_name>></spirit:name> + </spirit:physicalPort> + </spirit:portMap> +//---------------------------------------- << end user >> --------------------------------------- + </spirit:portMaps> + </spirit:busInterface> +//---------------------------------------- << end out >> ---------------------------------------- + + <!--Scan test dummy signals --> + <spirit:busInterface> + <spirit:name>DFTInterface_Slave</spirit:name> + <spirit:description>Scan test dummy signals, not connected until scan insertion</spirit:description> + <spirit:busType spirit:library="generic" spirit:name="DFTInterface" spirit:vendor="arm.com" spirit:version="r0p0_1"/> + <spirit:abstractionType spirit:library="generic" spirit:name="DFTInterface_rtl" spirit:vendor="arm.com" spirit:version="r0p0_1"/> + <spirit:slave/> + <spirit:portMaps> + + <!-- Clock/reset --> + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>CLK</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>HCLK</spirit:name> + </spirit:physicalPort> + </spirit:portMap> + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>RESETn</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>HRESETn</spirit:name> + </spirit:physicalPort> + </spirit:portMap> + + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>DFTSCANMODE</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>SCANENABLE</spirit:name> + </spirit:physicalPort> + </spirit:portMap> + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>DFTSI</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>SCANINHCLK</spirit:name> + </spirit:physicalPort> + </spirit:portMap> + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>DFTSO</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>SCANOUTHCLK</spirit:name> + </spirit:physicalPort> + </spirit:portMap> + </spirit:portMaps> + </spirit:busInterface> + + </spirit:busInterfaces> +//--------------------------------- << start vendor_extension >> --------------------------------- +//---------------------------------- << end vendor_extension >> ---------------------------------- + +//---------------------------- << start remap_used >> ------------------------------- + <spirit:remapStates> + +//---------------------------- << start remap_state_ipxact >> ------------------------------- + <spirit:remapState> + <spirit:name><<remap_name>></spirit:name> + <spirit:description>Remap state <<remap_name>></spirit:description> + <spirit:remapPorts> +//---------------------------- << start remap_bit_ipxact >> ------------------------------- + <spirit:remapPort spirit:portNameRef="REMAP" spirit:portIndex="<<top_remap_bit>>"><<top_remap_bitvalue>></spirit:remapPort> +//---------------------------- << end remap_bit_ipxact >> ------------------------------- + </spirit:remapPorts> + </spirit:remapState> +//------------------------------ << end remap_state_ipxact >> ------------------------- + + </spirit:remapStates> + +//----------------------------- << end remap_used >> -------------------------------- + <spirit:addressSpaces> +//---------------------------------------- << start out >> ---------------------------------------- + + <spirit:addressSpace> + <spirit:name>AHBLiteTarget_Master_<<mi_name>>_AS</spirit:name> + <spirit:description><<mi_name>> address space</spirit:description> + <spirit:range><<address_space_range>></spirit:range> + <spirit:width><<data_v>></spirit:width> + <spirit:segments> +//---------------------------------------- << start segments >> ---------------------------------------- + <spirit:segment> + <spirit:name><<mi_name>>_<<segment_name>></spirit:name> + <spirit:addressOffset><<segment_offset>></spirit:addressOffset> + <spirit:range><<segment_range>></spirit:range> + </spirit:segment> +//---------------------------------------- << end segments >> ---------------------------------------- + </spirit:segments> + <spirit:addressUnitBits>8</spirit:addressUnitBits> + </spirit:addressSpace> +//---------------------------------------- << end out >> ---------------------------------------- + + </spirit:addressSpaces> + + <spirit:memoryMaps> + +//---------------------------------------- << start in >> ---------------------------------------- + <spirit:memoryMap> + <spirit:name>AHBLiteTarget_Slave_<<si_name>>_MM</spirit:name> + <spirit:description><<si_name>> memory map</spirit:description> + +//----------------------------- << start addr_map_ipxact >> --------------------------- +//----------------------------- << start addr_region_ipxact >> ------------------------ +//----------------------------- << start remap_static >> ------------------------ + <spirit:subspaceMap spirit:masterRef="AHBLiteTarget_Master_<<mi_name>>" + spirit:segmentRef="<<mi_name>>_<<base_address>>_<<end_address>>"> + <!-- Address_region <<address_map>> --> +//---------------------------- << start remap_used >> ------------------------------- + <spirit:name>AHBLiteTarget_Master_<<mi_name>>_<<base_address>>_0_state_always_SM</spirit:name> +//---------------------------- << end remap_used >> ------------------------------- +//---------------------------- << start no_remap_used >> ------------------------------- + <spirit:name>AHBLiteTarget_Master_<<mi_name>>_<<base_address>>_0_state_default_SM</spirit:name> +//---------------------------- << end no_remap_used >> ------------------------------- + <spirit:baseAddress><<base_address>></spirit:baseAddress> + </spirit:subspaceMap> + +//----------------------------- << end remap_static >> ------------------------ +//------------------------------ << end addr_region_ipxact >> ------------------------- +//----------------------------- << end addr_map_ipxact >> ----------------------------- +//---------------------------- << start remap_used >> ------------------------------- +//----------------------------- << start remap_state_ipxact >> ------------------------- +//----------------------------- << start addr_remap_and_normal_all_this_remap >> ------------------------- + <spirit:memoryRemap spirit:state="<<remap_name>>"> + <spirit:name>AHBLiteTarget_Slave_<<si_name>>_<<remap_name>>_remap_MM</spirit:name> + <spirit:description><<si_name>> <<remap_name>> remap</spirit:description> +//----------------------------- << start remap_region_ipxact >> ----------------------- + <spirit:subspaceMap spirit:masterRef="AHBLiteTarget_Master_<<mi_name>>" + spirit:segmentRef="<<mi_name>>_<<base_address>>_<<end_address>>"> + <!-- <<region_type>> address_region <<address_map>> --> + <spirit:name>AHBLiteTarget_Master_<<mi_name>>_<<base_address>>_0_state_<<remap_name>>_SM</spirit:name> + <spirit:baseAddress><<base_address>></spirit:baseAddress> + </spirit:subspaceMap> +//------------------------------ << end remap_region_ipxact >> ------------------------- + </spirit:memoryRemap> + +//----------------------------- << end addr_remap_and_normal_all_this_remap >> --------------------------- +//----------------------------- << end remap_state_ipxact >> ------------------------- +//---------------------------- << end remap_used >> ------------------------------- + </spirit:memoryMap> + +//----------------------------------------- << end in >> ------------------------------------------ + </spirit:memoryMaps> + + + <spirit:model> + <spirit:views> + <spirit:view> + <spirit:name>verilogsource</spirit:name> + <spirit:description><<bus_matrix_name>> bus matrix</spirit:description> + <spirit:envIdentifier>:*Simulation:</spirit:envIdentifier> + <spirit:envIdentifier>:*Synthesis:</spirit:envIdentifier> + <spirit:language>verilog</spirit:language> + <spirit:modelName><<bus_matrix_name>></spirit:modelName> + <spirit:fileSetRef> + <spirit:localName>fs-verilogsource</spirit:localName> + </spirit:fileSetRef> + </spirit:view> + </spirit:views> + + <spirit:ports> + + <!-- Common clock and reset --> + + <spirit:port> + <spirit:name>HCLK</spirit:name> + <spirit:wire> + <spirit:direction>in</spirit:direction> + </spirit:wire> + </spirit:port> + <spirit:port> + <spirit:name>HRESETn</spirit:name> + <spirit:wire> + <spirit:direction>in</spirit:direction> + </spirit:wire> + </spirit:port> + + <!-- Remap port --> + <spirit:port> + <spirit:name>REMAP</spirit:name> + <spirit:wire> + <spirit:direction>in</spirit:direction> + <spirit:vector> + <spirit:left>3</spirit:left> + <spirit:right>0</spirit:right> + </spirit:vector> + <spirit:driver> + <spirit:defaultValue>0</spirit:defaultValue> + </spirit:driver> + </spirit:wire> + </spirit:port> + + <!-- Input signals of Slave interfaces --> + +//----------------------------------------- << start in >> ------------------------------------------ + <spirit:port> + <spirit:name>HSEL<<si_name>></spirit:name> + <spirit:wire> + <spirit:direction>in</spirit:direction> + </spirit:wire> + </spirit:port> + <spirit:port> + <spirit:name>HADDR<<si_name>></spirit:name> + <spirit:wire> + <spirit:direction>in</spirit:direction> + <spirit:vector> + <spirit:left><<addr>></spirit:left> + <spirit:right>0</spirit:right> + </spirit:vector> + </spirit:wire> + </spirit:port> + <spirit:port> + <spirit:name>HTRANS<<si_name>></spirit:name> + <spirit:wire> + <spirit:direction>in</spirit:direction> + <spirit:vector> + <spirit:left>1</spirit:left> + <spirit:right>0</spirit:right> + </spirit:vector> + </spirit:wire> + </spirit:port> + <spirit:port> + <spirit:name>HWRITE<<si_name>></spirit:name> + <spirit:wire> + <spirit:direction>in</spirit:direction> + </spirit:wire> + </spirit:port> + <spirit:port> + <spirit:name>HSIZE<<si_name>></spirit:name> + <spirit:wire> + <spirit:direction>in</spirit:direction> + <spirit:vector> + <spirit:left>2</spirit:left> + <spirit:right>0</spirit:right> + </spirit:vector> + </spirit:wire> + </spirit:port> + <spirit:port> + <spirit:name>HBURST<<si_name>></spirit:name> + <spirit:wire> + <spirit:direction>in</spirit:direction> + <spirit:vector> + <spirit:left>2</spirit:left> + <spirit:right>0</spirit:right> + </spirit:vector> + <spirit:driver> + <spirit:defaultValue>0</spirit:defaultValue> + </spirit:driver> + </spirit:wire> + </spirit:port> + <spirit:port> + <spirit:name>HPROT<<si_name>></spirit:name> + <spirit:wire> + <spirit:direction>in</spirit:direction> + <spirit:vector> + <spirit:left><<prot>></spirit:left> + <spirit:right>0</spirit:right> + </spirit:vector> + </spirit:wire> + </spirit:port> +//---------------------------- << start unalign >> ----------------------------- + <spirit:port> + <spirit:name>HUNALIGN<<si_name>></spirit:name> + <spirit:wire> + <spirit:direction>in</spirit:direction> + <spirit:driver> + <spirit:defaultValue>0</spirit:defaultValue> + </spirit:driver> + </spirit:wire> + </spirit:port> + <spirit:port> + <spirit:name>HBSTRB<<si_name>></spirit:name> + <spirit:wire> + <spirit:direction>in</spirit:direction> + <spirit:vector> + <spirit:left><<bstrb>></spirit:left> + <spirit:right>0</spirit:right> + </spirit:vector> + <spirit:driver> + <spirit:defaultValue>0</spirit:defaultValue> + </spirit:driver> + </spirit:wire> + </spirit:port> +//----------------------------- << end unalign >> ------------------------------ + <spirit:port> + <spirit:name>HMASTER<<si_name>></spirit:name> + <spirit:wire> + <spirit:direction>in</spirit:direction> + <spirit:vector> + <spirit:left>3</spirit:left> + <spirit:right>0</spirit:right> + </spirit:vector> + <spirit:driver> + <spirit:defaultValue><<in>></spirit:defaultValue> + </spirit:driver> + </spirit:wire> + </spirit:port> + <spirit:port> + <spirit:name>HWDATA<<si_name>></spirit:name> + <spirit:wire> + <spirit:direction>in</spirit:direction> + <spirit:vector> + <spirit:left><<data>></spirit:left> + <spirit:right>0</spirit:right> + </spirit:vector> + </spirit:wire> + </spirit:port> + <spirit:port> + <spirit:name>HMASTLOCK<<si_name>></spirit:name> + <spirit:wire> + <spirit:direction>in</spirit:direction> + </spirit:wire> + </spirit:port> + <spirit:port> + <spirit:name>HREADY<<si_name>></spirit:name> + <spirit:wire> + <spirit:direction>in</spirit:direction> + </spirit:wire> + </spirit:port> + +//---------------------------------------- << start user >> ------------------------------------- + <spirit:port> + <spirit:name>HAUSER<<si_name>></spirit:name> + <spirit:wire> + <spirit:direction>in</spirit:direction> + <spirit:vector> + <spirit:left><<user>></spirit:left> + <spirit:right>0</spirit:right> + </spirit:vector> + </spirit:wire> + </spirit:port> + <spirit:port> + <spirit:name>HWUSER<<si_name>></spirit:name> + <spirit:wire> + <spirit:direction>in</spirit:direction> + <spirit:vector> + <spirit:left><<user>></spirit:left> + <spirit:right>0</spirit:right> + </spirit:vector> + </spirit:wire> + </spirit:port> +//---------------------------------------- << end user >> --------------------------------------- +//----------------------------------------- << end in >> ---------------------------------------- + + <!-- Input signals of Master interfaces --> + +//----------------------------------------- << start out >> ---------------------------------------- + <spirit:port> + <spirit:name>HRDATA<<mi_name>></spirit:name> + <spirit:wire> + <spirit:direction>in</spirit:direction> + <spirit:vector> + <spirit:left><<data>></spirit:left> + <spirit:right>0</spirit:right> + </spirit:vector> + </spirit:wire> + </spirit:port> + <spirit:port> + <spirit:name>HREADYOUT<<mi_name>></spirit:name> + <spirit:wire> + <spirit:direction>in</spirit:direction> + </spirit:wire> + </spirit:port> + <spirit:port> + <spirit:name>HRESP<<mi_name>></spirit:name> + <spirit:wire> + <spirit:direction>in</spirit:direction> + <spirit:vector> + <spirit:left><<resp>></spirit:left> + <spirit:right>0</spirit:right> + </spirit:vector> + </spirit:wire> + </spirit:port> +//---------------------------------------- << start user >> ------------------------------------- + <spirit:port> + <spirit:name>HRUSER<<mi_name>></spirit:name> + <spirit:wire> + <spirit:direction>in</spirit:direction> + <spirit:vector> + <spirit:left><<user>></spirit:left> + <spirit:right>0</spirit:right> + </spirit:vector> + </spirit:wire> + </spirit:port> +//---------------------------------------- << end user >> --------------------------------------- +//----------------------------------------- << end out >> ---------------------------------------- + + <!-- Scan test dummy signals; not connected until scan insertion --> + + <spirit:port> + <spirit:name>SCANENABLE</spirit:name> + <spirit:wire> + <spirit:direction>in</spirit:direction> + </spirit:wire> + </spirit:port> + <spirit:port> + <spirit:name>SCANINHCLK</spirit:name> + <spirit:wire> + <spirit:direction>in</spirit:direction> + </spirit:wire> + </spirit:port> + + <!-- Output signals of Master interfaces --> + +//---------------------------------------- << start out >> -------------------------------------- + <spirit:port> + <spirit:name>HSEL<<mi_name>></spirit:name> + <spirit:wire> + <spirit:direction>out</spirit:direction> + </spirit:wire> + </spirit:port> + <spirit:port> + <spirit:name>HADDR<<mi_name>></spirit:name> + <spirit:wire> + <spirit:direction>out</spirit:direction> + <spirit:vector> + <spirit:left><<addr>></spirit:left> + <spirit:right>0</spirit:right> + </spirit:vector> + </spirit:wire> + </spirit:port> + <spirit:port> + <spirit:name>HTRANS<<mi_name>></spirit:name> + <spirit:wire> + <spirit:direction>out</spirit:direction> + <spirit:vector> + <spirit:left>1</spirit:left> + <spirit:right>0</spirit:right> + </spirit:vector> + </spirit:wire> + </spirit:port> + <spirit:port> + <spirit:name>HWRITE<<mi_name>></spirit:name> + <spirit:wire> + <spirit:direction>out</spirit:direction> + </spirit:wire> + </spirit:port> + <spirit:port> + <spirit:name>HSIZE<<mi_name>></spirit:name> + <spirit:wire> + <spirit:direction>out</spirit:direction> + <spirit:vector> + <spirit:left>2</spirit:left> + <spirit:right>0</spirit:right> + </spirit:vector> + </spirit:wire> + </spirit:port> + <spirit:port> + <spirit:name>HBURST<<mi_name>></spirit:name> + <spirit:wire> + <spirit:direction>out</spirit:direction> + <spirit:vector> + <spirit:left>2</spirit:left> + <spirit:right>0</spirit:right> + </spirit:vector> + </spirit:wire> + </spirit:port> + <spirit:port> + <spirit:name>HPROT<<mi_name>></spirit:name> + <spirit:wire> + <spirit:direction>out</spirit:direction> + <spirit:vector> + <spirit:left><<prot>></spirit:left> + <spirit:right>0</spirit:right> + </spirit:vector> + </spirit:wire> + </spirit:port> +//---------------------------- << start unalign >> ----------------------------- + <spirit:port> + <spirit:name>HUNALIGN<<mi_name>></spirit:name> + <spirit:wire> + <spirit:direction>out</spirit:direction> + </spirit:wire> + </spirit:port> + <spirit:port> + <spirit:name>HBSTRB<<mi_name>></spirit:name> + <spirit:wire> + <spirit:direction>out</spirit:direction> + <spirit:vector> + <spirit:left><<bstrb>></spirit:left> + <spirit:right>0</spirit:right> + </spirit:vector> + </spirit:wire> + </spirit:port> +//----------------------------- << end unalign >> ------------------------------ + <spirit:port> + <spirit:name>HMASTER<<mi_name>></spirit:name> + <spirit:wire> + <spirit:direction>out</spirit:direction> + <spirit:vector> + <spirit:left>3</spirit:left> + <spirit:right>0</spirit:right> + </spirit:vector> + </spirit:wire> + </spirit:port> + <spirit:port> + <spirit:name>HWDATA<<mi_name>></spirit:name> + <spirit:wire> + <spirit:direction>out</spirit:direction> + <spirit:vector> + <spirit:left><<data>></spirit:left> + <spirit:right>0</spirit:right> + </spirit:vector> + </spirit:wire> + </spirit:port> + <spirit:port> + <spirit:name>HMASTLOCK<<mi_name>></spirit:name> + <spirit:wire> + <spirit:direction>out</spirit:direction> + </spirit:wire> + </spirit:port> + <spirit:port> + <spirit:name>HREADYMUX<<mi_name>></spirit:name> + <spirit:wire> + <spirit:direction>out</spirit:direction> + </spirit:wire> + </spirit:port> +//---------------------------------------- << start user >> ------------------------------------- + <spirit:port> + <spirit:name>HAUSER<<mi_name>></spirit:name> + <spirit:wire> + <spirit:direction>out</spirit:direction> + <spirit:vector> + <spirit:left><<user>></spirit:left> + <spirit:right>0</spirit:right> + </spirit:vector> + </spirit:wire> + </spirit:port> + <spirit:port> + <spirit:name>HWUSER<<mi_name>></spirit:name> + <spirit:wire> + <spirit:direction>out</spirit:direction> + <spirit:vector> + <spirit:left><<user>></spirit:left> + <spirit:right>0</spirit:right> + </spirit:vector> + </spirit:wire> + </spirit:port> +//---------------------------------------- << end user >> --------------------------------------- +//---------------------------------------- << end out >> ---------------------------------------- + + <!-- Output signals of Slave interfaces --> + +//---------------------------------------- << start in >> ---------------------------------------- + <spirit:port> + <spirit:name>HRDATA<<si_name>></spirit:name> + <spirit:wire> + <spirit:direction>out</spirit:direction> + <spirit:vector> + <spirit:left><<data>></spirit:left> + <spirit:right>0</spirit:right> + </spirit:vector> + </spirit:wire> + </spirit:port> + <spirit:port> + <spirit:name>HREADYOUT<<si_name>></spirit:name> + <spirit:wire> + <spirit:direction>out</spirit:direction> + </spirit:wire> + </spirit:port> + <spirit:port> + <spirit:name>HRESP<<si_name>></spirit:name> + <spirit:wire> + <spirit:direction>out</spirit:direction> + <spirit:vector> + <spirit:left><<resp>></spirit:left> + <spirit:right>0</spirit:right> + </spirit:vector> + </spirit:wire> + </spirit:port> +//---------------------------------------- << start user >> ------------------------------------- + <spirit:port> + <spirit:name>HRUSER<<si_name>></spirit:name> + <spirit:wire> + <spirit:direction>out</spirit:direction> + <spirit:vector> + <spirit:left><<user>></spirit:left> + <spirit:right>0</spirit:right> + </spirit:vector> + </spirit:wire> + </spirit:port> +//---------------------------------------- << end user >> --------------------------------------- +//---------------------------------------- << end in >> ---------------------------------------- + + <!-- Scan test dummy signals; not connected until scan insertion --> + + <spirit:port> + <spirit:name>SCANOUTHCLK</spirit:name> + <spirit:wire> + <spirit:direction>out</spirit:direction> + </spirit:wire> + </spirit:port> + </spirit:ports> + </spirit:model> + + <spirit:fileSets> + <spirit:fileSet> + <spirit:name>fs-verilogsource</spirit:name> + <spirit:displayName/> + <spirit:description>File list for <<bus_matrix_name>></spirit:description> +//-------------------------------------- << start file >> --------------------------------------- + <spirit:file> + <spirit:name><<verilog_to_ipxact_path>>/<<filename>>.v</spirit:name> + <spirit:fileType>verilogSource-2001</spirit:fileType> +//-------------------------------------- << start topfile >> --------------------------------------- + <spirit:isIncludeFile spirit:externalDeclarations="true">false</spirit:isIncludeFile> +//-------------------------------------- << end topfile >> --------------------------------------- + </spirit:file> +//--------------------------------------- << end file >> ---------------------------------------- + </spirit:fileSet> + </spirit:fileSets> + + <spirit:description><<bus_matrix_name>></spirit:description> + +</spirit:component> diff --git a/Cortex-M0/nanosoc/systems/mcu/verilog/gen_ahb_busmatrix/ipxact/src/cmsdk_ahb_busmatrix_lite_ipxact.xml b/Cortex-M0/nanosoc/systems/mcu/verilog/gen_ahb_busmatrix/ipxact/src/cmsdk_ahb_busmatrix_lite_ipxact.xml new file mode 100755 index 0000000..7fe69e4 --- /dev/null +++ b/Cortex-M0/nanosoc/systems/mcu/verilog/gen_ahb_busmatrix/ipxact/src/cmsdk_ahb_busmatrix_lite_ipxact.xml @@ -0,0 +1,921 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - --> +<!-- The confidential and proprietary information contained in this file may --> +<!-- only be used by a person authorised under and to the extent permitted --> +<!-- by a subsisting licensing agreement from ARM Limited or its affiliates. --> +<!-- --> +<!-- (C) COPYRIGHT 2001-2017 ARM Limited or its affiliates. --> +<!-- ALL RIGHTS RESERVED --> +<!-- --> +<!-- This entire notice must be reproduced on all copies of this file --> +<!-- and copies of this file may only be made by a person if such person is --> +<!-- permitted to do so under the terms of a subsisting license agreement --> +<!-- from ARM Limited or its affiliates. --> +<!-- --> +<!-- SVN Information --> +<!-- --> +<!-- Checked In : $Date: 2017-10-10 15:55:38 +0100 (Tue, 10 Oct 2017) $ --> +<!-- --> +<!-- Revision : $Revision: 371321 $ --> +<!-- --> +<!-- Release Information : Cortex-M System Design Kit-r1p1-00rel0 --> +<!-- --> +<!-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - --> +<!-- Purpose : IP-XACT description for the AHB-Lite wrapper of <<component_name>> --> +<!-- --> +<!-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - --> + +<spirit:component xmlns:spirit="http://www.spiritconsortium.org/XMLSchema/SPIRIT/1685-2009" + xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:schemaLocation="http://www.spiritconsortium.org/XMLSchema/SPIRIT/1685-2009 http://www.spiritconsortium.org/XMLSchema/SPIRIT/1685-2009/index.xsd"> + <spirit:vendor>arm.com</spirit:vendor> + <spirit:library>CoreLink</spirit:library> + <spirit:name><<component_name>></spirit:name> + <spirit:version>r0p0_0</spirit:version> + + <spirit:busInterfaces> + + <!--Slave interfaces --> +//---------------------------------------- << start in >> --------------------------------------- + + <spirit:busInterface> + <spirit:name>AHBLiteInitiator_Slave_<<si_name>></spirit:name> + <spirit:description>Slave port <<si_name>></spirit:description> + <spirit:busType spirit:library="AMBA3" spirit:name="AHBLiteInitiator" spirit:vendor="amba.com" spirit:version="r2p0_0"/> + <spirit:abstractionType spirit:library="AMBA3" spirit:name="AHBLiteInitiator_rtl" spirit:vendor="amba.com" spirit:version="r2p0_0"/> + <spirit:slave> + <spirit:memoryMapRef spirit:memoryMapRef="AHBLiteInitiator_Slave_<<si_name>>_MM"/> +//---------------------------------------- << start out >> -------------------------------------- +//------------------------------------- << start connection >> ------------------------------------ + <spirit:bridge spirit:masterRef="AHBLiteTarget_Master_<<mi_name>>" spirit:opaque="true"/> +//------------------------------------- << end connection >> -------------------------------------- +//---------------------------------------- << end out >> ---------------------------------------- + </spirit:slave> + + <spirit:portMaps> + <!-- Clock/reset --> + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>HCLK</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>HCLK</spirit:name> + </spirit:physicalPort> + </spirit:portMap> + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>HRESETn</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>HRESETn</spirit:name> + </spirit:physicalPort> + </spirit:portMap> + <!-- Inputs --> + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>HADDR</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>HADDR<<si_name>></spirit:name> + </spirit:physicalPort> + </spirit:portMap> + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>HTRANS</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>HTRANS<<si_name>></spirit:name> + </spirit:physicalPort> + </spirit:portMap> + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>HWRITE</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>HWRITE<<si_name>></spirit:name> + </spirit:physicalPort> + </spirit:portMap> + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>HSIZE</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>HSIZE<<si_name>></spirit:name> + </spirit:physicalPort> + </spirit:portMap> + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>HBURST</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>HBURST<<si_name>></spirit:name> + </spirit:physicalPort> + </spirit:portMap> + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>HPROT</spirit:name> +//---------------------------------------- << start excl >> ------------------------------------- + <spirit:vector> + <spirit:left>3</spirit:left> + <spirit:right>0</spirit:right> + </spirit:vector> +//---------------------------------------- << end excl >> ------------------------------------- + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>HPROT<<si_name>></spirit:name> +//---------------------------------------- << start excl >> ------------------------------------- + <spirit:vector> + <spirit:left>3</spirit:left> + <spirit:right>0</spirit:right> + </spirit:vector> +//---------------------------------------- << end excl >> ------------------------------------- + </spirit:physicalPort> + </spirit:portMap> + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>HWDATA</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>HWDATA<<si_name>></spirit:name> + </spirit:physicalPort> + </spirit:portMap> + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>HMASTLOCK</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>HMASTLOCK<<si_name>></spirit:name> + </spirit:physicalPort> + </spirit:portMap> +//---------------------------------------- << start user >> ------------------------------------- + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>HAUSER</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>HAUSER<<si_name>></spirit:name> + </spirit:physicalPort> + </spirit:portMap> + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>HWUSER</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>HWUSER<<si_name>></spirit:name> + </spirit:physicalPort> + </spirit:portMap> +//---------------------------------------- << end user >> --------------------------------------- + + <!-- Outputs --> + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>HRDATA</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>HRDATA<<si_name>></spirit:name> + </spirit:physicalPort> + </spirit:portMap> + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>HREADY</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>HREADY<<si_name>></spirit:name> + </spirit:physicalPort> + </spirit:portMap> + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>HRESP</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>HRESP<<si_name>></spirit:name> + </spirit:physicalPort> + </spirit:portMap> +//---------------------------------------- << start user >> ------------------------------------- + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>HRUSER</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>HRUSER<<si_name>></spirit:name> + </spirit:physicalPort> + </spirit:portMap> +//---------------------------------------- << end user >> --------------------------------------- + </spirit:portMaps> + </spirit:busInterface> +//----------------------------------------- << end in >> ---------------------------------------- + + <!--Master interfaces --> +//---------------------------------------- << start out >> -------------------------------------- + + <spirit:busInterface> + <spirit:name>AHBLiteTarget_Master_<<mi_name>></spirit:name> + <spirit:description>Master port <<mi_name>></spirit:description> + <spirit:busType spirit:library="AMBA3" spirit:name="AHBLiteTarget" spirit:vendor="amba.com" spirit:version="r2p0_0"/> + <spirit:abstractionType spirit:library="AMBA3" spirit:name="AHBLiteTarget_rtl" spirit:vendor="amba.com" spirit:version="r2p0_0"/> + <spirit:master> + <spirit:addressSpaceRef spirit:addressSpaceRef="AHBLiteTarget_Master_<<mi_name>>_AS"/> + </spirit:master> + + <spirit:portMaps> + <!-- Clock/reset --> + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>HCLK</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>HCLK</spirit:name> + </spirit:physicalPort> + </spirit:portMap> + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>HRESETn</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>HRESETn</spirit:name> + </spirit:physicalPort> + </spirit:portMap> + <!-- Outputs --> + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>HSELx</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>HSEL<<mi_name>></spirit:name> + </spirit:physicalPort> + </spirit:portMap> + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>HADDR</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>HADDR<<mi_name>></spirit:name> + </spirit:physicalPort> + </spirit:portMap> + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>HTRANS</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>HTRANS<<mi_name>></spirit:name> + </spirit:physicalPort> + </spirit:portMap> + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>HWRITE</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>HWRITE<<mi_name>></spirit:name> + </spirit:physicalPort> + </spirit:portMap> + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>HSIZE</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>HSIZE<<mi_name>></spirit:name> + </spirit:physicalPort> + </spirit:portMap> + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>HBURST</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>HBURST<<mi_name>></spirit:name> + </spirit:physicalPort> + </spirit:portMap> + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>HPROT</spirit:name> +//---------------------------------------- << start excl >> ------------------------------------- + <spirit:vector> + <spirit:left>3</spirit:left> + <spirit:right>0</spirit:right> + </spirit:vector> +//---------------------------------------- << end excl >> ------------------------------------- + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>HPROT<<mi_name>></spirit:name> +//---------------------------------------- << start excl >> ------------------------------------- + <spirit:vector> + <spirit:left>3</spirit:left> + <spirit:right>0</spirit:right> + </spirit:vector> +//---------------------------------------- << end excl >> ------------------------------------- + </spirit:physicalPort> + </spirit:portMap> + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>HWDATA</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>HWDATA<<mi_name>></spirit:name> + </spirit:physicalPort> + </spirit:portMap> + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>HMASTLOCK</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>HMASTLOCK<<mi_name>></spirit:name> + </spirit:physicalPort> + </spirit:portMap> + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>HREADY</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>HREADYMUX<<mi_name>></spirit:name> + </spirit:physicalPort> + </spirit:portMap> +//---------------------------------------- << start user >> ------------------------------------- + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>HAUSER</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>HAUSER<<mi_name>></spirit:name> + </spirit:physicalPort> + </spirit:portMap> + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>HWUSER</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>HWUSER<<mi_name>></spirit:name> + </spirit:physicalPort> + </spirit:portMap> +//---------------------------------------- << end user >> --------------------------------------- + + <!-- Inputs --> + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>HRDATA</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>HRDATA<<mi_name>></spirit:name> + </spirit:physicalPort> + </spirit:portMap> + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>HREADYOUT</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>HREADYOUT<<mi_name>></spirit:name> + </spirit:physicalPort> + </spirit:portMap> + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>HRESP</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>HRESP<<mi_name>></spirit:name> + </spirit:physicalPort> + </spirit:portMap> +//---------------------------------------- << start user >> ------------------------------------- + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>HRUSER</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>HRUSER<<mi_name>></spirit:name> + </spirit:physicalPort> + </spirit:portMap> +//---------------------------------------- << end user >> --------------------------------------- + </spirit:portMaps> + </spirit:busInterface> +//---------------------------------------- << end out >> ---------------------------------------- + + <!--Scan test dummy signals --> + <spirit:busInterface> + <spirit:name>DFTInterface_Slave</spirit:name> + <spirit:description>Scan test dummy signals, not connected until scan insertion</spirit:description> + <spirit:busType spirit:library="generic" spirit:name="DFTInterface" spirit:vendor="arm.com" spirit:version="r0p0_1"/> + <spirit:abstractionType spirit:library="generic" spirit:name="DFTInterface_rtl" spirit:vendor="arm.com" spirit:version="r0p0_1"/> + <spirit:slave/> + <spirit:portMaps> + + <!-- Clock/reset --> + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>CLK</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>HCLK</spirit:name> + </spirit:physicalPort> + </spirit:portMap> + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>RESETn</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>HRESETn</spirit:name> + </spirit:physicalPort> + </spirit:portMap> + + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>DFTSCANMODE</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>SCANENABLE</spirit:name> + </spirit:physicalPort> + </spirit:portMap> + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>DFTSI</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>SCANINHCLK</spirit:name> + </spirit:physicalPort> + </spirit:portMap> + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>DFTSO</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>SCANOUTHCLK</spirit:name> + </spirit:physicalPort> + </spirit:portMap> + </spirit:portMaps> + </spirit:busInterface> + + </spirit:busInterfaces> +//--------------------------------- << start vendor_extension >> --------------------------------- +//---------------------------------- << end vendor_extension >> ---------------------------------- + +//---------------------------- << start remap_used >> ------------------------------- + <spirit:remapStates> + +//---------------------------- << start remap_state_ipxact >> ------------------------------- + <spirit:remapState> + <spirit:name><<remap_name>></spirit:name> + <spirit:description>Remap state <<remap_name>></spirit:description> + <spirit:remapPorts> +//---------------------------- << start remap_bit_ipxact >> ------------------------------- + <spirit:remapPort spirit:portNameRef="REMAP" spirit:portIndex="<<top_remap_bit>>"><<top_remap_bitvalue>></spirit:remapPort> +//---------------------------- << end remap_bit_ipxact >> ------------------------------- + </spirit:remapPorts> + </spirit:remapState> +//------------------------------ << end remap_state_ipxact >> ------------------------- + + </spirit:remapStates> + +//----------------------------- << end remap_used >> -------------------------------- + <spirit:addressSpaces> +//---------------------------------------- << start out >> ---------------------------------------- + + <spirit:addressSpace> + <spirit:name>AHBLiteTarget_Master_<<mi_name>>_AS</spirit:name> + <spirit:description><<mi_name>> address space</spirit:description> + <spirit:range><<address_space_range>></spirit:range> + <spirit:width><<data_v>></spirit:width> + <spirit:segments> +//---------------------------------------- << start segments >> ---------------------------------------- + <spirit:segment> + <spirit:name><<mi_name>>_<<segment_name>></spirit:name> + <spirit:addressOffset><<segment_offset>></spirit:addressOffset> + <spirit:range><<segment_range>></spirit:range> + </spirit:segment> +//---------------------------------------- << end segments >> ---------------------------------------- + </spirit:segments> + <spirit:addressUnitBits>8</spirit:addressUnitBits> + </spirit:addressSpace> +//---------------------------------------- << end out >> ---------------------------------------- + + </spirit:addressSpaces> + + <spirit:memoryMaps> + +//---------------------------------------- << start in >> ---------------------------------------- + <spirit:memoryMap> + <spirit:name>AHBLiteInitiator_Slave_<<si_name>>_MM</spirit:name> + <spirit:description><<si_name>> memory map</spirit:description> + +//----------------------------- << start addr_map_ipxact >> --------------------------- +//----------------------------- << start addr_region_ipxact >> ------------------------ +//----------------------------- << start remap_static >> ------------------------ + <spirit:subspaceMap spirit:masterRef="AHBLiteTarget_Master_<<mi_name>>" + spirit:segmentRef="<<mi_name>>_<<base_address>>_<<end_address>>"> + <!-- Address_region <<address_map>> --> +//---------------------------- << start remap_used >> ------------------------------- + <spirit:name>AHBLiteTarget_Master_<<mi_name>>_<<base_address>>_0_state_always_SM</spirit:name> +//---------------------------- << end remap_used >> ------------------------------- +//---------------------------- << start no_remap_used >> ------------------------------- + <spirit:name>AHBLiteTarget_Master_<<mi_name>>_<<base_address>>_0_state_default_SM</spirit:name> +//---------------------------- << end no_remap_used >> ------------------------------- + <spirit:baseAddress><<base_address>></spirit:baseAddress> + </spirit:subspaceMap> + +//----------------------------- << end remap_static >> ------------------------ +//------------------------------ << end addr_region_ipxact >> ------------------------- +//----------------------------- << end addr_map_ipxact >> ----------------------------- +//---------------------------- << start remap_used >> ------------------------------- +//----------------------------- << start remap_state_ipxact >> ------------------------- +//----------------------------- << start addr_remap_and_normal_all_this_remap >> ------------------------- + <spirit:memoryRemap spirit:state="<<remap_name>>"> + <spirit:name>AHBLiteInitiator_Slave_<<si_name>>_<<remap_name>>_remap_MM</spirit:name> + <spirit:description><<si_name>> <<remap_name>> remap</spirit:description> +//----------------------------- << start remap_region_ipxact >> ----------------------- + <spirit:subspaceMap spirit:masterRef="AHBLiteTarget_Master_<<mi_name>>" + spirit:segmentRef="<<mi_name>>_<<base_address>>_<<end_address>>"> + <!-- <<region_type>> address_region <<address_map>> --> + <spirit:name>AHBLiteTarget_Master_<<mi_name>>_<<base_address>>_0_state_<<remap_name>>_SM</spirit:name> + <spirit:baseAddress><<base_address>></spirit:baseAddress> + </spirit:subspaceMap> +//------------------------------ << end remap_region_ipxact >> ------------------------- + </spirit:memoryRemap> + +//----------------------------- << end addr_remap_and_normal_all_this_remap >> --------------------------- +//----------------------------- << end remap_state_ipxact >> ------------------------- +//---------------------------- << end remap_used >> ------------------------------- + </spirit:memoryMap> + +//----------------------------------------- << end in >> ------------------------------------------ + </spirit:memoryMaps> + + + <spirit:model> + <spirit:views> + <spirit:view> + <spirit:name>verilogsource</spirit:name> + <spirit:description><<component_name>> bus matrix</spirit:description> + <spirit:envIdentifier>:*Simulation:</spirit:envIdentifier> + <spirit:envIdentifier>:*Synthesis:</spirit:envIdentifier> + <spirit:language>verilog</spirit:language> + <spirit:modelName><<component_name>></spirit:modelName> + <spirit:fileSetRef> + <spirit:localName>fs-verilogsource</spirit:localName> + </spirit:fileSetRef> + </spirit:view> + </spirit:views> + + <spirit:ports> + + <!-- Common clock and reset --> + + <spirit:port> + <spirit:name>HCLK</spirit:name> + <spirit:wire> + <spirit:direction>in</spirit:direction> + </spirit:wire> + </spirit:port> + <spirit:port> + <spirit:name>HRESETn</spirit:name> + <spirit:wire> + <spirit:direction>in</spirit:direction> + </spirit:wire> + </spirit:port> + + <!-- Remap port --> + <spirit:port> + <spirit:name>REMAP</spirit:name> + <spirit:wire> + <spirit:direction>in</spirit:direction> + <spirit:vector> + <spirit:left>3</spirit:left> + <spirit:right>0</spirit:right> + </spirit:vector> + <spirit:driver> + <spirit:defaultValue>0</spirit:defaultValue> + </spirit:driver> + </spirit:wire> + </spirit:port> + + <!-- Input signals of Slave interfaces --> + +//----------------------------------------- << start in >> ------------------------------------------ + <spirit:port> + <spirit:name>HADDR<<si_name>></spirit:name> + <spirit:wire> + <spirit:direction>in</spirit:direction> + <spirit:vector> + <spirit:left><<addr>></spirit:left> + <spirit:right>0</spirit:right> + </spirit:vector> + </spirit:wire> + </spirit:port> + <spirit:port> + <spirit:name>HTRANS<<si_name>></spirit:name> + <spirit:wire> + <spirit:direction>in</spirit:direction> + <spirit:vector> + <spirit:left>1</spirit:left> + <spirit:right>0</spirit:right> + </spirit:vector> + </spirit:wire> + </spirit:port> + <spirit:port> + <spirit:name>HWRITE<<si_name>></spirit:name> + <spirit:wire> + <spirit:direction>in</spirit:direction> + </spirit:wire> + </spirit:port> + <spirit:port> + <spirit:name>HSIZE<<si_name>></spirit:name> + <spirit:wire> + <spirit:direction>in</spirit:direction> + <spirit:vector> + <spirit:left>2</spirit:left> + <spirit:right>0</spirit:right> + </spirit:vector> + </spirit:wire> + </spirit:port> + <spirit:port> + <spirit:name>HBURST<<si_name>></spirit:name> + <spirit:wire> + <spirit:direction>in</spirit:direction> + <spirit:vector> + <spirit:left>2</spirit:left> + <spirit:right>0</spirit:right> + </spirit:vector> + <spirit:driver> + <spirit:defaultValue>0</spirit:defaultValue> + </spirit:driver> + </spirit:wire> + </spirit:port> + <spirit:port> + <spirit:name>HPROT<<si_name>></spirit:name> + <spirit:wire> + <spirit:direction>in</spirit:direction> + <spirit:vector> + <spirit:left><<prot>></spirit:left> + <spirit:right>0</spirit:right> + </spirit:vector> + </spirit:wire> + </spirit:port> + <spirit:port> + <spirit:name>HWDATA<<si_name>></spirit:name> + <spirit:wire> + <spirit:direction>in</spirit:direction> + <spirit:vector> + <spirit:left><<data>></spirit:left> + <spirit:right>0</spirit:right> + </spirit:vector> + </spirit:wire> + </spirit:port> + <spirit:port> + <spirit:name>HMASTLOCK<<si_name>></spirit:name> + <spirit:wire> + <spirit:direction>in</spirit:direction> + </spirit:wire> + </spirit:port> +//---------------------------------------- << start user >> ------------------------------------- + <spirit:port> + <spirit:name>HAUSER<<si_name>></spirit:name> + <spirit:wire> + <spirit:direction>in</spirit:direction> + <spirit:vector> + <spirit:left><<user>></spirit:left> + <spirit:right>0</spirit:right> + </spirit:vector> + </spirit:wire> + </spirit:port> + <spirit:port> + <spirit:name>HWUSER<<si_name>></spirit:name> + <spirit:wire> + <spirit:direction>in</spirit:direction> + <spirit:vector> + <spirit:left><<user>></spirit:left> + <spirit:right>0</spirit:right> + </spirit:vector> + </spirit:wire> + </spirit:port> +//---------------------------------------- << end user >> --------------------------------------- +//----------------------------------------- << end in >> ---------------------------------------- + + <!-- Input signals of Master interfaces --> + +//----------------------------------------- << start out >> ---------------------------------------- + <spirit:port> + <spirit:name>HRDATA<<mi_name>></spirit:name> + <spirit:wire> + <spirit:direction>in</spirit:direction> + <spirit:vector> + <spirit:left><<data>></spirit:left> + <spirit:right>0</spirit:right> + </spirit:vector> + </spirit:wire> + </spirit:port> + <spirit:port> + <spirit:name>HREADYOUT<<mi_name>></spirit:name> + <spirit:wire> + <spirit:direction>in</spirit:direction> + </spirit:wire> + </spirit:port> + <spirit:port> + <spirit:name>HRESP<<mi_name>></spirit:name> + <spirit:wire> + <spirit:direction>in</spirit:direction> + </spirit:wire> + </spirit:port> +//---------------------------------------- << start user >> ------------------------------------- + <spirit:port> + <spirit:name>HRUSER<<mi_name>></spirit:name> + <spirit:wire> + <spirit:direction>in</spirit:direction> + <spirit:vector> + <spirit:left><<user>></spirit:left> + <spirit:right>0</spirit:right> + </spirit:vector> + </spirit:wire> + </spirit:port> +//---------------------------------------- << end user >> --------------------------------------- +//----------------------------------------- << end out >> ---------------------------------------- + + <!-- Scan test dummy signals; not connected until scan insertion --> + + <spirit:port> + <spirit:name>SCANENABLE</spirit:name> + <spirit:wire> + <spirit:direction>in</spirit:direction> + </spirit:wire> + </spirit:port> + <spirit:port> + <spirit:name>SCANINHCLK</spirit:name> + <spirit:wire> + <spirit:direction>in</spirit:direction> + </spirit:wire> + </spirit:port> + + <!-- Output signals of Master interfaces --> + +//---------------------------------------- << start out >> -------------------------------------- + <spirit:port> + <spirit:name>HSEL<<mi_name>></spirit:name> + <spirit:wire> + <spirit:direction>out</spirit:direction> + </spirit:wire> + </spirit:port> + <spirit:port> + <spirit:name>HADDR<<mi_name>></spirit:name> + <spirit:wire> + <spirit:direction>out</spirit:direction> + <spirit:vector> + <spirit:left><<addr>></spirit:left> + <spirit:right>0</spirit:right> + </spirit:vector> + </spirit:wire> + </spirit:port> + <spirit:port> + <spirit:name>HTRANS<<mi_name>></spirit:name> + <spirit:wire> + <spirit:direction>out</spirit:direction> + <spirit:vector> + <spirit:left>1</spirit:left> + <spirit:right>0</spirit:right> + </spirit:vector> + </spirit:wire> + </spirit:port> + <spirit:port> + <spirit:name>HWRITE<<mi_name>></spirit:name> + <spirit:wire> + <spirit:direction>out</spirit:direction> + </spirit:wire> + </spirit:port> + <spirit:port> + <spirit:name>HSIZE<<mi_name>></spirit:name> + <spirit:wire> + <spirit:direction>out</spirit:direction> + <spirit:vector> + <spirit:left>2</spirit:left> + <spirit:right>0</spirit:right> + </spirit:vector> + </spirit:wire> + </spirit:port> + <spirit:port> + <spirit:name>HBURST<<mi_name>></spirit:name> + <spirit:wire> + <spirit:direction>out</spirit:direction> + <spirit:vector> + <spirit:left>2</spirit:left> + <spirit:right>0</spirit:right> + </spirit:vector> + </spirit:wire> + </spirit:port> + <spirit:port> + <spirit:name>HPROT<<mi_name>></spirit:name> + <spirit:wire> + <spirit:direction>out</spirit:direction> + <spirit:vector> + <spirit:left><<prot>></spirit:left> + <spirit:right>0</spirit:right> + </spirit:vector> + </spirit:wire> + </spirit:port> + <spirit:port> + <spirit:name>HWDATA<<mi_name>></spirit:name> + <spirit:wire> + <spirit:direction>out</spirit:direction> + <spirit:vector> + <spirit:left><<data>></spirit:left> + <spirit:right>0</spirit:right> + </spirit:vector> + </spirit:wire> + </spirit:port> + <spirit:port> + <spirit:name>HMASTLOCK<<mi_name>></spirit:name> + <spirit:wire> + <spirit:direction>out</spirit:direction> + </spirit:wire> + </spirit:port> + <spirit:port> + <spirit:name>HREADYMUX<<mi_name>></spirit:name> + <spirit:wire> + <spirit:direction>out</spirit:direction> + </spirit:wire> + </spirit:port> +//---------------------------------------- << start user >> ------------------------------------- + <spirit:port> + <spirit:name>HAUSER<<mi_name>></spirit:name> + <spirit:wire> + <spirit:direction>out</spirit:direction> + <spirit:vector> + <spirit:left><<user>></spirit:left> + <spirit:right>0</spirit:right> + </spirit:vector> + </spirit:wire> + </spirit:port> + <spirit:port> + <spirit:name>HWUSER<<mi_name>></spirit:name> + <spirit:wire> + <spirit:direction>out</spirit:direction> + <spirit:vector> + <spirit:left><<user>></spirit:left> + <spirit:right>0</spirit:right> + </spirit:vector> + </spirit:wire> + </spirit:port> +//---------------------------------------- << end user >> --------------------------------------- +//---------------------------------------- << end out >> ---------------------------------------- + + <!-- Output signals of Slave interfaces --> + +//---------------------------------------- << start in >> ---------------------------------------- + <spirit:port> + <spirit:name>HRDATA<<si_name>></spirit:name> + <spirit:wire> + <spirit:direction>out</spirit:direction> + <spirit:vector> + <spirit:left><<data>></spirit:left> + <spirit:right>0</spirit:right> + </spirit:vector> + </spirit:wire> + </spirit:port> + <spirit:port> + <spirit:name>HREADY<<si_name>></spirit:name> + <spirit:wire> + <spirit:direction>out</spirit:direction> + </spirit:wire> + </spirit:port> + <spirit:port> + <spirit:name>HRESP<<si_name>></spirit:name> + <spirit:wire> + <spirit:direction>out</spirit:direction> + </spirit:wire> + </spirit:port> +//---------------------------------------- << start user >> ------------------------------------- + <spirit:port> + <spirit:name>HRUSER<<si_name>></spirit:name> + <spirit:wire> + <spirit:direction>out</spirit:direction> + <spirit:vector> + <spirit:left><<user>></spirit:left> + <spirit:right>0</spirit:right> + </spirit:vector> + </spirit:wire> + </spirit:port> +//---------------------------------------- << end user >> --------------------------------------- +//---------------------------------------- << end in >> ---------------------------------------- + + <!-- Scan test dummy signals; not connected until scan insertion --> + + <spirit:port> + <spirit:name>SCANOUTHCLK</spirit:name> + <spirit:wire> + <spirit:direction>out</spirit:direction> + </spirit:wire> + </spirit:port> + </spirit:ports> + </spirit:model> + + <spirit:fileSets> + <spirit:fileSet> + <spirit:name>fs-verilogsource</spirit:name> + <spirit:displayName/> + <spirit:description>File list for <<component_name>></spirit:description> +//-------------------------------------- << start file >> --------------------------------------- + <spirit:file> + <spirit:name><<verilog_to_ipxact_path>>/<<filename>>.v</spirit:name> + <spirit:fileType>verilogSource-2001</spirit:fileType> +//-------------------------------------- << start topfile >> --------------------------------------- + <spirit:isIncludeFile spirit:externalDeclarations="true">false</spirit:isIncludeFile> +//-------------------------------------- << end topfile >> --------------------------------------- + </spirit:file> +//--------------------------------------- << end file >> ---------------------------------------- + </spirit:fileSet> + </spirit:fileSets> + + <spirit:description><<component_name>></spirit:description> + +</spirit:component> diff --git a/Cortex-M0/nanosoc/systems/mcu/verilog/gen_ahb_busmatrix/soclabs_ahb32_4x7.log b/Cortex-M0/nanosoc/systems/mcu/verilog/gen_ahb_busmatrix/soclabs_ahb32_4x7.log new file mode 100644 index 0000000..234a620 --- /dev/null +++ b/Cortex-M0/nanosoc/systems/mcu/verilog/gen_ahb_busmatrix/soclabs_ahb32_4x7.log @@ -0,0 +1,74 @@ + +============================================================== += The confidential and proprietary information contained in this file may += only be used by a person authorised under and to the extent permitted += by a subsisting licensing agreement from Arm Limited or its affiliates. += += (C) COPYRIGHT 2001-2013,2017 Arm Limited or its affiliates. += ALL RIGHTS RESERVED += += This entire notice must be reproduced on all copies of this file += and copies of this file may only be made by a person if such person is += permitted to do so under the terms of a subsisting license agreement += from Arm Limited or its affiliates. += += BuildBusMatrix.pl += += Run Date : 10/02/2023 10:12:02 +============================================================== + +Script accepted the following parameters: + + - Configuration file : 'xml/soclabs_ahb32_4x7.xml' + - Top-level name : 'soclabs_4x7_AhbMatrix' + - Slave interfaces : 4 + - Master interfaces : 7 + - Architecture type : 'ahb2' + - Arbitration scheme : 'burst' + - Address map : user defined + - Connectivity mapping : _adp -> _rom1, _ram2, _ram3, _sys, _exp, _ram8, _ram9, + _dma -> _rom1, _ram2, _ram3, _sys, _exp, _ram8, _ram9, + _dma2 -> _rom1, _ram2, _ram3, _sys, _exp, _ram8, _ram9, + _cpu -> _rom1, _ram2, _ram3, _sys, _exp, _ram8, _ram9 + - Connectivity type : full + - Routing data width : 32 + - Routing address width : 32 + - User signal width : 2 + - Timescales : yes (default) + - Configuration directory : './verilog/built' + - Source directory : './verilog/src' + - IPXact target directory : 'ipxact/built' + - IPXact source directory : 'ipxact/src' + - Overwrite mode : enabled + +Deleting the './verilog/built/soclabs_4x7_AhbMatrix/soclabs_4x7_AhbMatrix.v' file... +Deleting the './verilog/built/soclabs_4x7_AhbMatrix/soclabs_4x7_AhbMatrix_default_slave.v' file... +Deleting the './verilog/built/soclabs_4x7_AhbMatrix/soclabs_4x7_AhbMatrix_lite.v' file... +Deleting the './verilog/built/soclabs_4x7_AhbMatrix/soclabs_4x7_Arbiter.v' file... +Deleting the './verilog/built/soclabs_4x7_AhbMatrix/soclabs_4x7_MasterInput.v' file... +Deleting the './verilog/built/soclabs_4x7_AhbMatrix/soclabs_4x7_MatrixDecode_adp.v' file... +Deleting the './verilog/built/soclabs_4x7_AhbMatrix/soclabs_4x7_MatrixDecode_cpu.v' file... +Deleting the './verilog/built/soclabs_4x7_AhbMatrix/soclabs_4x7_MatrixDecode_dma.v' file... +Deleting the './verilog/built/soclabs_4x7_AhbMatrix/soclabs_4x7_MatrixDecode_dma2.v' file... +Deleting the './verilog/built/soclabs_4x7_AhbMatrix/soclabs_4x7_SlaveOutput.v' file... + +Deleting the 'ipxact/built/soclabs_4x7_AhbMatrix/soclabs_4x7_AhbMatrix.xml' file... +Deleting the 'ipxact/built/soclabs_4x7_AhbMatrix/soclabs_4x7_AhbMatrix_lite.xml' file... + +Creating the bus matrix variant... + + - Rendering 'soclabs_4x7_AhbMatrix_lite.xml' + - Rendering 'soclabs_4x7_MatrixDecode_adp.v' + - Rendering 'soclabs_4x7_AhbMatrix.v' + - Rendering 'soclabs_4x7_MatrixDecode_dma2.v' + - Rendering 'soclabs_4x7_MasterInput.v' + - Rendering 'soclabs_4x7_AhbMatrix_lite.v' + - Rendering 'soclabs_4x7_MatrixDecode_dma.v' + - Rendering 'soclabs_4x7_SlaveOutput.v' + - Rendering 'soclabs_4x7_AhbMatrix_default_slave.v' + - Rendering 'soclabs_4x7_AhbMatrix.xml' + - Rendering 'soclabs_4x7_Arbiter.v' + - Rendering 'soclabs_4x7_MatrixDecode_cpu.v' + +Done! + diff --git a/Cortex-M0/nanosoc/systems/mcu/verilog/gen_ahb_busmatrix/verilog/built/soclabs_4x7_AhbMatrix/soclabs_4x7_AhbMatrix.v b/Cortex-M0/nanosoc/systems/mcu/verilog/gen_ahb_busmatrix/verilog/built/soclabs_4x7_AhbMatrix/soclabs_4x7_AhbMatrix.v new file mode 100644 index 0000000..f086832 --- /dev/null +++ b/Cortex-M0/nanosoc/systems/mcu/verilog/gen_ahb_busmatrix/verilog/built/soclabs_4x7_AhbMatrix/soclabs_4x7_AhbMatrix.v @@ -0,0 +1,2151 @@ +//----------------------------------------------------------------------------- +// The confidential and proprietary information contained in this file may +// only be used by a person authorised under and to the extent permitted +// by a subsisting licensing agreement from Arm Limited or its affiliates. +// +// (C) COPYRIGHT 2001-2023 Arm Limited or its affiliates. +// ALL RIGHTS RESERVED +// +// This entire notice must be reproduced on all copies of this file +// and copies of this file may only be made by a person if such person is +// permitted to do so under the terms of a subsisting license agreement +// from Arm Limited or its affiliates. +// +// SVN Information +// +// Checked In : $Date: 2017-10-10 15:55:38 +0100 (Tue, 10 Oct 2017) $ +// +// Revision : $Revision: 371321 $ +// +// Release Information : Cortex-M System Design Kit-r1p1-00rel0 +// +//----------------------------------------------------------------------------- +// +//------------------------------------------------------------------------------ +// Abstract : BusMatrix is the top-level which connects together +// the required Input Stages, MatrixDecodes, Output +// Stages and Output Arbitration blocks. +// +// Supports the following configured options: +// +// - Architecture type 'ahb2', +// - 4 slave ports (connecting to masters), +// - 7 master ports (connecting to slaves), +// - Routing address width of 32 bits, +// - Routing data width of 32 bits, +// - xUSER signal width of 2 bits, +// - Arbiter type 'burst', +// - Connectivity mapping: +// S<0..3> -> M<0..6>, +// - Connectivity type 'full'. +// +//------------------------------------------------------------------------------ + + +`timescale 1ns/1ps + + +module soclabs_4x7_AhbMatrix ( + + // Common AHB signals + HCLK, + HRESETn, + + // System address remapping control + REMAP, + + // Input port SI0 (inputs from master 0) + HSEL_adp, + HADDR_adp, + HTRANS_adp, + HWRITE_adp, + HSIZE_adp, + HBURST_adp, + HPROT_adp, + HMASTER_adp, + HWDATA_adp, + HMASTLOCK_adp, + HREADY_adp, + HAUSER_adp, + HWUSER_adp, + + // Input port SI1 (inputs from master 1) + HSEL_dma, + HADDR_dma, + HTRANS_dma, + HWRITE_dma, + HSIZE_dma, + HBURST_dma, + HPROT_dma, + HMASTER_dma, + HWDATA_dma, + HMASTLOCK_dma, + HREADY_dma, + HAUSER_dma, + HWUSER_dma, + + // Input port SI2 (inputs from master 2) + HSEL_dma2, + HADDR_dma2, + HTRANS_dma2, + HWRITE_dma2, + HSIZE_dma2, + HBURST_dma2, + HPROT_dma2, + HMASTER_dma2, + HWDATA_dma2, + HMASTLOCK_dma2, + HREADY_dma2, + HAUSER_dma2, + HWUSER_dma2, + + // Input port SI3 (inputs from master 3) + HSEL_cpu, + HADDR_cpu, + HTRANS_cpu, + HWRITE_cpu, + HSIZE_cpu, + HBURST_cpu, + HPROT_cpu, + HMASTER_cpu, + HWDATA_cpu, + HMASTLOCK_cpu, + HREADY_cpu, + HAUSER_cpu, + HWUSER_cpu, + + // Output port MI0 (inputs from slave 0) + HRDATA_rom1, + HREADYOUT_rom1, + HRESP_rom1, + HRUSER_rom1, + + // Output port MI1 (inputs from slave 1) + HRDATA_ram2, + HREADYOUT_ram2, + HRESP_ram2, + HRUSER_ram2, + + // Output port MI2 (inputs from slave 2) + HRDATA_ram3, + HREADYOUT_ram3, + HRESP_ram3, + HRUSER_ram3, + + // Output port MI3 (inputs from slave 3) + HRDATA_sys, + HREADYOUT_sys, + HRESP_sys, + HRUSER_sys, + + // Output port MI4 (inputs from slave 4) + HRDATA_ram8, + HREADYOUT_ram8, + HRESP_ram8, + HRUSER_ram8, + + // Output port MI5 (inputs from slave 5) + HRDATA_ram9, + HREADYOUT_ram9, + HRESP_ram9, + HRUSER_ram9, + + // Output port MI6 (inputs from slave 6) + HRDATA_exp, + HREADYOUT_exp, + HRESP_exp, + HRUSER_exp, + + // Scan test dummy signals; not connected until scan insertion + SCANENABLE, // Scan Test Mode Enable + SCANINHCLK, // Scan Chain Input + + + // Output port MI0 (outputs to slave 0) + HSEL_rom1, + HADDR_rom1, + HTRANS_rom1, + HWRITE_rom1, + HSIZE_rom1, + HBURST_rom1, + HPROT_rom1, + HMASTER_rom1, + HWDATA_rom1, + HMASTLOCK_rom1, + HREADYMUX_rom1, + HAUSER_rom1, + HWUSER_rom1, + + // Output port MI1 (outputs to slave 1) + HSEL_ram2, + HADDR_ram2, + HTRANS_ram2, + HWRITE_ram2, + HSIZE_ram2, + HBURST_ram2, + HPROT_ram2, + HMASTER_ram2, + HWDATA_ram2, + HMASTLOCK_ram2, + HREADYMUX_ram2, + HAUSER_ram2, + HWUSER_ram2, + + // Output port MI2 (outputs to slave 2) + HSEL_ram3, + HADDR_ram3, + HTRANS_ram3, + HWRITE_ram3, + HSIZE_ram3, + HBURST_ram3, + HPROT_ram3, + HMASTER_ram3, + HWDATA_ram3, + HMASTLOCK_ram3, + HREADYMUX_ram3, + HAUSER_ram3, + HWUSER_ram3, + + // Output port MI3 (outputs to slave 3) + HSEL_sys, + HADDR_sys, + HTRANS_sys, + HWRITE_sys, + HSIZE_sys, + HBURST_sys, + HPROT_sys, + HMASTER_sys, + HWDATA_sys, + HMASTLOCK_sys, + HREADYMUX_sys, + HAUSER_sys, + HWUSER_sys, + + // Output port MI4 (outputs to slave 4) + HSEL_ram8, + HADDR_ram8, + HTRANS_ram8, + HWRITE_ram8, + HSIZE_ram8, + HBURST_ram8, + HPROT_ram8, + HMASTER_ram8, + HWDATA_ram8, + HMASTLOCK_ram8, + HREADYMUX_ram8, + HAUSER_ram8, + HWUSER_ram8, + + // Output port MI5 (outputs to slave 5) + HSEL_ram9, + HADDR_ram9, + HTRANS_ram9, + HWRITE_ram9, + HSIZE_ram9, + HBURST_ram9, + HPROT_ram9, + HMASTER_ram9, + HWDATA_ram9, + HMASTLOCK_ram9, + HREADYMUX_ram9, + HAUSER_ram9, + HWUSER_ram9, + + // Output port MI6 (outputs to slave 6) + HSEL_exp, + HADDR_exp, + HTRANS_exp, + HWRITE_exp, + HSIZE_exp, + HBURST_exp, + HPROT_exp, + HMASTER_exp, + HWDATA_exp, + HMASTLOCK_exp, + HREADYMUX_exp, + HAUSER_exp, + HWUSER_exp, + + // Input port SI0 (outputs to master 0) + HRDATA_adp, + HREADYOUT_adp, + HRESP_adp, + HRUSER_adp, + + // Input port SI1 (outputs to master 1) + HRDATA_dma, + HREADYOUT_dma, + HRESP_dma, + HRUSER_dma, + + // Input port SI2 (outputs to master 2) + HRDATA_dma2, + HREADYOUT_dma2, + HRESP_dma2, + HRUSER_dma2, + + // Input port SI3 (outputs to master 3) + HRDATA_cpu, + HREADYOUT_cpu, + HRESP_cpu, + HRUSER_cpu, + + // Scan test dummy signals; not connected until scan insertion + SCANOUTHCLK // Scan Chain Output + + ); + + +// ----------------------------------------------------------------------------- +// Input and Output declarations +// ----------------------------------------------------------------------------- + + // Common AHB signals + input HCLK; // AHB System Clock + input HRESETn; // AHB System Reset + + // System address remapping control + input [3:0] REMAP; // REMAP input + + // Input port SI0 (inputs from master 0) + input HSEL_adp; // Slave Select + input [31:0] HADDR_adp; // Address bus + input [1:0] HTRANS_adp; // Transfer type + input HWRITE_adp; // Transfer direction + input [2:0] HSIZE_adp; // Transfer size + input [2:0] HBURST_adp; // Burst type + input [3:0] HPROT_adp; // Protection control + input [3:0] HMASTER_adp; // Master select + input [31:0] HWDATA_adp; // Write data + input HMASTLOCK_adp; // Locked Sequence + input HREADY_adp; // Transfer done + input [1:0] HAUSER_adp; // Address USER signals + input [1:0] HWUSER_adp; // Write-data USER signals + + // Input port SI1 (inputs from master 1) + input HSEL_dma; // Slave Select + input [31:0] HADDR_dma; // Address bus + input [1:0] HTRANS_dma; // Transfer type + input HWRITE_dma; // Transfer direction + input [2:0] HSIZE_dma; // Transfer size + input [2:0] HBURST_dma; // Burst type + input [3:0] HPROT_dma; // Protection control + input [3:0] HMASTER_dma; // Master select + input [31:0] HWDATA_dma; // Write data + input HMASTLOCK_dma; // Locked Sequence + input HREADY_dma; // Transfer done + input [1:0] HAUSER_dma; // Address USER signals + input [1:0] HWUSER_dma; // Write-data USER signals + + // Input port SI2 (inputs from master 2) + input HSEL_dma2; // Slave Select + input [31:0] HADDR_dma2; // Address bus + input [1:0] HTRANS_dma2; // Transfer type + input HWRITE_dma2; // Transfer direction + input [2:0] HSIZE_dma2; // Transfer size + input [2:0] HBURST_dma2; // Burst type + input [3:0] HPROT_dma2; // Protection control + input [3:0] HMASTER_dma2; // Master select + input [31:0] HWDATA_dma2; // Write data + input HMASTLOCK_dma2; // Locked Sequence + input HREADY_dma2; // Transfer done + input [1:0] HAUSER_dma2; // Address USER signals + input [1:0] HWUSER_dma2; // Write-data USER signals + + // Input port SI3 (inputs from master 3) + input HSEL_cpu; // Slave Select + input [31:0] HADDR_cpu; // Address bus + input [1:0] HTRANS_cpu; // Transfer type + input HWRITE_cpu; // Transfer direction + input [2:0] HSIZE_cpu; // Transfer size + input [2:0] HBURST_cpu; // Burst type + input [3:0] HPROT_cpu; // Protection control + input [3:0] HMASTER_cpu; // Master select + input [31:0] HWDATA_cpu; // Write data + input HMASTLOCK_cpu; // Locked Sequence + input HREADY_cpu; // Transfer done + input [1:0] HAUSER_cpu; // Address USER signals + input [1:0] HWUSER_cpu; // Write-data USER signals + + // Output port MI0 (inputs from slave 0) + input [31:0] HRDATA_rom1; // Read data bus + input HREADYOUT_rom1; // HREADY feedback + input [1:0] HRESP_rom1; // Transfer response + input [1:0] HRUSER_rom1; // Read-data USER signals + + // Output port MI1 (inputs from slave 1) + input [31:0] HRDATA_ram2; // Read data bus + input HREADYOUT_ram2; // HREADY feedback + input [1:0] HRESP_ram2; // Transfer response + input [1:0] HRUSER_ram2; // Read-data USER signals + + // Output port MI2 (inputs from slave 2) + input [31:0] HRDATA_ram3; // Read data bus + input HREADYOUT_ram3; // HREADY feedback + input [1:0] HRESP_ram3; // Transfer response + input [1:0] HRUSER_ram3; // Read-data USER signals + + // Output port MI3 (inputs from slave 3) + input [31:0] HRDATA_sys; // Read data bus + input HREADYOUT_sys; // HREADY feedback + input [1:0] HRESP_sys; // Transfer response + input [1:0] HRUSER_sys; // Read-data USER signals + + // Output port MI4 (inputs from slave 4) + input [31:0] HRDATA_ram8; // Read data bus + input HREADYOUT_ram8; // HREADY feedback + input [1:0] HRESP_ram8; // Transfer response + input [1:0] HRUSER_ram8; // Read-data USER signals + + // Output port MI5 (inputs from slave 5) + input [31:0] HRDATA_ram9; // Read data bus + input HREADYOUT_ram9; // HREADY feedback + input [1:0] HRESP_ram9; // Transfer response + input [1:0] HRUSER_ram9; // Read-data USER signals + + // Output port MI6 (inputs from slave 6) + input [31:0] HRDATA_exp; // Read data bus + input HREADYOUT_exp; // HREADY feedback + input [1:0] HRESP_exp; // Transfer response + input [1:0] HRUSER_exp; // Read-data USER signals + + // Scan test dummy signals; not connected until scan insertion + input SCANENABLE; // Scan enable signal + input SCANINHCLK; // HCLK scan input + + + // Output port MI0 (outputs to slave 0) + output HSEL_rom1; // Slave Select + output [31:0] HADDR_rom1; // Address bus + output [1:0] HTRANS_rom1; // Transfer type + output HWRITE_rom1; // Transfer direction + output [2:0] HSIZE_rom1; // Transfer size + output [2:0] HBURST_rom1; // Burst type + output [3:0] HPROT_rom1; // Protection control + output [3:0] HMASTER_rom1; // Master select + output [31:0] HWDATA_rom1; // Write data + output HMASTLOCK_rom1; // Locked Sequence + output HREADYMUX_rom1; // Transfer done + output [1:0] HAUSER_rom1; // Address USER signals + output [1:0] HWUSER_rom1; // Write-data USER signals + + // Output port MI1 (outputs to slave 1) + output HSEL_ram2; // Slave Select + output [31:0] HADDR_ram2; // Address bus + output [1:0] HTRANS_ram2; // Transfer type + output HWRITE_ram2; // Transfer direction + output [2:0] HSIZE_ram2; // Transfer size + output [2:0] HBURST_ram2; // Burst type + output [3:0] HPROT_ram2; // Protection control + output [3:0] HMASTER_ram2; // Master select + output [31:0] HWDATA_ram2; // Write data + output HMASTLOCK_ram2; // Locked Sequence + output HREADYMUX_ram2; // Transfer done + output [1:0] HAUSER_ram2; // Address USER signals + output [1:0] HWUSER_ram2; // Write-data USER signals + + // Output port MI2 (outputs to slave 2) + output HSEL_ram3; // Slave Select + output [31:0] HADDR_ram3; // Address bus + output [1:0] HTRANS_ram3; // Transfer type + output HWRITE_ram3; // Transfer direction + output [2:0] HSIZE_ram3; // Transfer size + output [2:0] HBURST_ram3; // Burst type + output [3:0] HPROT_ram3; // Protection control + output [3:0] HMASTER_ram3; // Master select + output [31:0] HWDATA_ram3; // Write data + output HMASTLOCK_ram3; // Locked Sequence + output HREADYMUX_ram3; // Transfer done + output [1:0] HAUSER_ram3; // Address USER signals + output [1:0] HWUSER_ram3; // Write-data USER signals + + // Output port MI3 (outputs to slave 3) + output HSEL_sys; // Slave Select + output [31:0] HADDR_sys; // Address bus + output [1:0] HTRANS_sys; // Transfer type + output HWRITE_sys; // Transfer direction + output [2:0] HSIZE_sys; // Transfer size + output [2:0] HBURST_sys; // Burst type + output [3:0] HPROT_sys; // Protection control + output [3:0] HMASTER_sys; // Master select + output [31:0] HWDATA_sys; // Write data + output HMASTLOCK_sys; // Locked Sequence + output HREADYMUX_sys; // Transfer done + output [1:0] HAUSER_sys; // Address USER signals + output [1:0] HWUSER_sys; // Write-data USER signals + + // Output port MI4 (outputs to slave 4) + output HSEL_ram8; // Slave Select + output [31:0] HADDR_ram8; // Address bus + output [1:0] HTRANS_ram8; // Transfer type + output HWRITE_ram8; // Transfer direction + output [2:0] HSIZE_ram8; // Transfer size + output [2:0] HBURST_ram8; // Burst type + output [3:0] HPROT_ram8; // Protection control + output [3:0] HMASTER_ram8; // Master select + output [31:0] HWDATA_ram8; // Write data + output HMASTLOCK_ram8; // Locked Sequence + output HREADYMUX_ram8; // Transfer done + output [1:0] HAUSER_ram8; // Address USER signals + output [1:0] HWUSER_ram8; // Write-data USER signals + + // Output port MI5 (outputs to slave 5) + output HSEL_ram9; // Slave Select + output [31:0] HADDR_ram9; // Address bus + output [1:0] HTRANS_ram9; // Transfer type + output HWRITE_ram9; // Transfer direction + output [2:0] HSIZE_ram9; // Transfer size + output [2:0] HBURST_ram9; // Burst type + output [3:0] HPROT_ram9; // Protection control + output [3:0] HMASTER_ram9; // Master select + output [31:0] HWDATA_ram9; // Write data + output HMASTLOCK_ram9; // Locked Sequence + output HREADYMUX_ram9; // Transfer done + output [1:0] HAUSER_ram9; // Address USER signals + output [1:0] HWUSER_ram9; // Write-data USER signals + + // Output port MI6 (outputs to slave 6) + output HSEL_exp; // Slave Select + output [31:0] HADDR_exp; // Address bus + output [1:0] HTRANS_exp; // Transfer type + output HWRITE_exp; // Transfer direction + output [2:0] HSIZE_exp; // Transfer size + output [2:0] HBURST_exp; // Burst type + output [3:0] HPROT_exp; // Protection control + output [3:0] HMASTER_exp; // Master select + output [31:0] HWDATA_exp; // Write data + output HMASTLOCK_exp; // Locked Sequence + output HREADYMUX_exp; // Transfer done + output [1:0] HAUSER_exp; // Address USER signals + output [1:0] HWUSER_exp; // Write-data USER signals + + // Input port SI0 (outputs to master 0) + output [31:0] HRDATA_adp; // Read data bus + output HREADYOUT_adp; // HREADY feedback + output [1:0] HRESP_adp; // Transfer response + output [1:0] HRUSER_adp; // Read-data USER signals + + // Input port SI1 (outputs to master 1) + output [31:0] HRDATA_dma; // Read data bus + output HREADYOUT_dma; // HREADY feedback + output [1:0] HRESP_dma; // Transfer response + output [1:0] HRUSER_dma; // Read-data USER signals + + // Input port SI2 (outputs to master 2) + output [31:0] HRDATA_dma2; // Read data bus + output HREADYOUT_dma2; // HREADY feedback + output [1:0] HRESP_dma2; // Transfer response + output [1:0] HRUSER_dma2; // Read-data USER signals + + // Input port SI3 (outputs to master 3) + output [31:0] HRDATA_cpu; // Read data bus + output HREADYOUT_cpu; // HREADY feedback + output [1:0] HRESP_cpu; // Transfer response + output [1:0] HRUSER_cpu; // Read-data USER signals + + // Scan test dummy signals; not connected until scan insertion + output SCANOUTHCLK; // Scan Chain Output + + +// ----------------------------------------------------------------------------- +// Wire declarations +// ----------------------------------------------------------------------------- + + // Common AHB signals + wire HCLK; // AHB System Clock + wire HRESETn; // AHB System Reset + + // System address remapping control + wire [3:0] REMAP; // REMAP signal + + // Input Port SI0 + wire HSEL_adp; // Slave Select + wire [31:0] HADDR_adp; // Address bus + wire [1:0] HTRANS_adp; // Transfer type + wire HWRITE_adp; // Transfer direction + wire [2:0] HSIZE_adp; // Transfer size + wire [2:0] HBURST_adp; // Burst type + wire [3:0] HPROT_adp; // Protection control + wire [3:0] HMASTER_adp; // Master select + wire [31:0] HWDATA_adp; // Write data + wire HMASTLOCK_adp; // Locked Sequence + wire HREADY_adp; // Transfer done + + wire [31:0] HRDATA_adp; // Read data bus + wire HREADYOUT_adp; // HREADY feedback + wire [1:0] HRESP_adp; // Transfer response + wire [1:0] HAUSER_adp; // Address USER signals + wire [1:0] HWUSER_adp; // Write-data USER signals + wire [1:0] HRUSER_adp; // Read-data USER signals + + // Input Port SI1 + wire HSEL_dma; // Slave Select + wire [31:0] HADDR_dma; // Address bus + wire [1:0] HTRANS_dma; // Transfer type + wire HWRITE_dma; // Transfer direction + wire [2:0] HSIZE_dma; // Transfer size + wire [2:0] HBURST_dma; // Burst type + wire [3:0] HPROT_dma; // Protection control + wire [3:0] HMASTER_dma; // Master select + wire [31:0] HWDATA_dma; // Write data + wire HMASTLOCK_dma; // Locked Sequence + wire HREADY_dma; // Transfer done + + wire [31:0] HRDATA_dma; // Read data bus + wire HREADYOUT_dma; // HREADY feedback + wire [1:0] HRESP_dma; // Transfer response + wire [1:0] HAUSER_dma; // Address USER signals + wire [1:0] HWUSER_dma; // Write-data USER signals + wire [1:0] HRUSER_dma; // Read-data USER signals + + // Input Port SI2 + wire HSEL_dma2; // Slave Select + wire [31:0] HADDR_dma2; // Address bus + wire [1:0] HTRANS_dma2; // Transfer type + wire HWRITE_dma2; // Transfer direction + wire [2:0] HSIZE_dma2; // Transfer size + wire [2:0] HBURST_dma2; // Burst type + wire [3:0] HPROT_dma2; // Protection control + wire [3:0] HMASTER_dma2; // Master select + wire [31:0] HWDATA_dma2; // Write data + wire HMASTLOCK_dma2; // Locked Sequence + wire HREADY_dma2; // Transfer done + + wire [31:0] HRDATA_dma2; // Read data bus + wire HREADYOUT_dma2; // HREADY feedback + wire [1:0] HRESP_dma2; // Transfer response + wire [1:0] HAUSER_dma2; // Address USER signals + wire [1:0] HWUSER_dma2; // Write-data USER signals + wire [1:0] HRUSER_dma2; // Read-data USER signals + + // Input Port SI3 + wire HSEL_cpu; // Slave Select + wire [31:0] HADDR_cpu; // Address bus + wire [1:0] HTRANS_cpu; // Transfer type + wire HWRITE_cpu; // Transfer direction + wire [2:0] HSIZE_cpu; // Transfer size + wire [2:0] HBURST_cpu; // Burst type + wire [3:0] HPROT_cpu; // Protection control + wire [3:0] HMASTER_cpu; // Master select + wire [31:0] HWDATA_cpu; // Write data + wire HMASTLOCK_cpu; // Locked Sequence + wire HREADY_cpu; // Transfer done + + wire [31:0] HRDATA_cpu; // Read data bus + wire HREADYOUT_cpu; // HREADY feedback + wire [1:0] HRESP_cpu; // Transfer response + wire [1:0] HAUSER_cpu; // Address USER signals + wire [1:0] HWUSER_cpu; // Write-data USER signals + wire [1:0] HRUSER_cpu; // Read-data USER signals + + // Output Port MI0 + wire HSEL_rom1; // Slave Select + wire [31:0] HADDR_rom1; // Address bus + wire [1:0] HTRANS_rom1; // Transfer type + wire HWRITE_rom1; // Transfer direction + wire [2:0] HSIZE_rom1; // Transfer size + wire [2:0] HBURST_rom1; // Burst type + wire [3:0] HPROT_rom1; // Protection control + wire [3:0] HMASTER_rom1; // Master select + wire [31:0] HWDATA_rom1; // Write data + wire HMASTLOCK_rom1; // Locked Sequence + wire HREADYMUX_rom1; // Transfer done + + wire [31:0] HRDATA_rom1; // Read data bus + wire HREADYOUT_rom1; // HREADY feedback + wire [1:0] HRESP_rom1; // Transfer response + wire [1:0] HAUSER_rom1; // Address USER signals + wire [1:0] HWUSER_rom1; // Write-data USER signals + wire [1:0] HRUSER_rom1; // Read-data USER signals + + // Output Port MI1 + wire HSEL_ram2; // Slave Select + wire [31:0] HADDR_ram2; // Address bus + wire [1:0] HTRANS_ram2; // Transfer type + wire HWRITE_ram2; // Transfer direction + wire [2:0] HSIZE_ram2; // Transfer size + wire [2:0] HBURST_ram2; // Burst type + wire [3:0] HPROT_ram2; // Protection control + wire [3:0] HMASTER_ram2; // Master select + wire [31:0] HWDATA_ram2; // Write data + wire HMASTLOCK_ram2; // Locked Sequence + wire HREADYMUX_ram2; // Transfer done + + wire [31:0] HRDATA_ram2; // Read data bus + wire HREADYOUT_ram2; // HREADY feedback + wire [1:0] HRESP_ram2; // Transfer response + wire [1:0] HAUSER_ram2; // Address USER signals + wire [1:0] HWUSER_ram2; // Write-data USER signals + wire [1:0] HRUSER_ram2; // Read-data USER signals + + // Output Port MI2 + wire HSEL_ram3; // Slave Select + wire [31:0] HADDR_ram3; // Address bus + wire [1:0] HTRANS_ram3; // Transfer type + wire HWRITE_ram3; // Transfer direction + wire [2:0] HSIZE_ram3; // Transfer size + wire [2:0] HBURST_ram3; // Burst type + wire [3:0] HPROT_ram3; // Protection control + wire [3:0] HMASTER_ram3; // Master select + wire [31:0] HWDATA_ram3; // Write data + wire HMASTLOCK_ram3; // Locked Sequence + wire HREADYMUX_ram3; // Transfer done + + wire [31:0] HRDATA_ram3; // Read data bus + wire HREADYOUT_ram3; // HREADY feedback + wire [1:0] HRESP_ram3; // Transfer response + wire [1:0] HAUSER_ram3; // Address USER signals + wire [1:0] HWUSER_ram3; // Write-data USER signals + wire [1:0] HRUSER_ram3; // Read-data USER signals + + // Output Port MI3 + wire HSEL_sys; // Slave Select + wire [31:0] HADDR_sys; // Address bus + wire [1:0] HTRANS_sys; // Transfer type + wire HWRITE_sys; // Transfer direction + wire [2:0] HSIZE_sys; // Transfer size + wire [2:0] HBURST_sys; // Burst type + wire [3:0] HPROT_sys; // Protection control + wire [3:0] HMASTER_sys; // Master select + wire [31:0] HWDATA_sys; // Write data + wire HMASTLOCK_sys; // Locked Sequence + wire HREADYMUX_sys; // Transfer done + + wire [31:0] HRDATA_sys; // Read data bus + wire HREADYOUT_sys; // HREADY feedback + wire [1:0] HRESP_sys; // Transfer response + wire [1:0] HAUSER_sys; // Address USER signals + wire [1:0] HWUSER_sys; // Write-data USER signals + wire [1:0] HRUSER_sys; // Read-data USER signals + + // Output Port MI4 + wire HSEL_ram8; // Slave Select + wire [31:0] HADDR_ram8; // Address bus + wire [1:0] HTRANS_ram8; // Transfer type + wire HWRITE_ram8; // Transfer direction + wire [2:0] HSIZE_ram8; // Transfer size + wire [2:0] HBURST_ram8; // Burst type + wire [3:0] HPROT_ram8; // Protection control + wire [3:0] HMASTER_ram8; // Master select + wire [31:0] HWDATA_ram8; // Write data + wire HMASTLOCK_ram8; // Locked Sequence + wire HREADYMUX_ram8; // Transfer done + + wire [31:0] HRDATA_ram8; // Read data bus + wire HREADYOUT_ram8; // HREADY feedback + wire [1:0] HRESP_ram8; // Transfer response + wire [1:0] HAUSER_ram8; // Address USER signals + wire [1:0] HWUSER_ram8; // Write-data USER signals + wire [1:0] HRUSER_ram8; // Read-data USER signals + + // Output Port MI5 + wire HSEL_ram9; // Slave Select + wire [31:0] HADDR_ram9; // Address bus + wire [1:0] HTRANS_ram9; // Transfer type + wire HWRITE_ram9; // Transfer direction + wire [2:0] HSIZE_ram9; // Transfer size + wire [2:0] HBURST_ram9; // Burst type + wire [3:0] HPROT_ram9; // Protection control + wire [3:0] HMASTER_ram9; // Master select + wire [31:0] HWDATA_ram9; // Write data + wire HMASTLOCK_ram9; // Locked Sequence + wire HREADYMUX_ram9; // Transfer done + + wire [31:0] HRDATA_ram9; // Read data bus + wire HREADYOUT_ram9; // HREADY feedback + wire [1:0] HRESP_ram9; // Transfer response + wire [1:0] HAUSER_ram9; // Address USER signals + wire [1:0] HWUSER_ram9; // Write-data USER signals + wire [1:0] HRUSER_ram9; // Read-data USER signals + + // Output Port MI6 + wire HSEL_exp; // Slave Select + wire [31:0] HADDR_exp; // Address bus + wire [1:0] HTRANS_exp; // Transfer type + wire HWRITE_exp; // Transfer direction + wire [2:0] HSIZE_exp; // Transfer size + wire [2:0] HBURST_exp; // Burst type + wire [3:0] HPROT_exp; // Protection control + wire [3:0] HMASTER_exp; // Master select + wire [31:0] HWDATA_exp; // Write data + wire HMASTLOCK_exp; // Locked Sequence + wire HREADYMUX_exp; // Transfer done + + wire [31:0] HRDATA_exp; // Read data bus + wire HREADYOUT_exp; // HREADY feedback + wire [1:0] HRESP_exp; // Transfer response + wire [1:0] HAUSER_exp; // Address USER signals + wire [1:0] HWUSER_exp; // Write-data USER signals + wire [1:0] HRUSER_exp; // Read-data USER signals + + +// ----------------------------------------------------------------------------- +// Signal declarations +// ----------------------------------------------------------------------------- + + // Bus-switch input SI0 + wire i_sel0; // HSEL signal + wire [31:0] i_addr0; // HADDR signal + wire [1:0] i_trans0; // HTRANS signal + wire i_write0; // HWRITE signal + wire [2:0] i_size0; // HSIZE signal + wire [2:0] i_burst0; // HBURST signal + wire [3:0] i_prot0; // HPROTS signal + wire [3:0] i_master0; // HMASTER signal + wire i_mastlock0; // HMASTLOCK signal + wire i_active0; // Active signal + wire i_held_tran0; // HeldTran signal + wire i_readyout0; // Readyout signal + wire [1:0] i_resp0; // Response signal + wire [1:0] i_auser0; // HAUSER signal + + // Bus-switch input SI1 + wire i_sel1; // HSEL signal + wire [31:0] i_addr1; // HADDR signal + wire [1:0] i_trans1; // HTRANS signal + wire i_write1; // HWRITE signal + wire [2:0] i_size1; // HSIZE signal + wire [2:0] i_burst1; // HBURST signal + wire [3:0] i_prot1; // HPROTS signal + wire [3:0] i_master1; // HMASTER signal + wire i_mastlock1; // HMASTLOCK signal + wire i_active1; // Active signal + wire i_held_tran1; // HeldTran signal + wire i_readyout1; // Readyout signal + wire [1:0] i_resp1; // Response signal + wire [1:0] i_auser1; // HAUSER signal + + // Bus-switch input SI2 + wire i_sel2; // HSEL signal + wire [31:0] i_addr2; // HADDR signal + wire [1:0] i_trans2; // HTRANS signal + wire i_write2; // HWRITE signal + wire [2:0] i_size2; // HSIZE signal + wire [2:0] i_burst2; // HBURST signal + wire [3:0] i_prot2; // HPROTS signal + wire [3:0] i_master2; // HMASTER signal + wire i_mastlock2; // HMASTLOCK signal + wire i_active2; // Active signal + wire i_held_tran2; // HeldTran signal + wire i_readyout2; // Readyout signal + wire [1:0] i_resp2; // Response signal + wire [1:0] i_auser2; // HAUSER signal + + // Bus-switch input SI3 + wire i_sel3; // HSEL signal + wire [31:0] i_addr3; // HADDR signal + wire [1:0] i_trans3; // HTRANS signal + wire i_write3; // HWRITE signal + wire [2:0] i_size3; // HSIZE signal + wire [2:0] i_burst3; // HBURST signal + wire [3:0] i_prot3; // HPROTS signal + wire [3:0] i_master3; // HMASTER signal + wire i_mastlock3; // HMASTLOCK signal + wire i_active3; // Active signal + wire i_held_tran3; // HeldTran signal + wire i_readyout3; // Readyout signal + wire [1:0] i_resp3; // Response signal + wire [1:0] i_auser3; // HAUSER signal + + // Bus-switch SI0 to MI0 signals + wire i_sel0to0; // Routing selection signal + wire i_active0to0; // Active signal + + // Bus-switch SI0 to MI1 signals + wire i_sel0to1; // Routing selection signal + wire i_active0to1; // Active signal + + // Bus-switch SI0 to MI2 signals + wire i_sel0to2; // Routing selection signal + wire i_active0to2; // Active signal + + // Bus-switch SI0 to MI3 signals + wire i_sel0to3; // Routing selection signal + wire i_active0to3; // Active signal + + // Bus-switch SI0 to MI4 signals + wire i_sel0to4; // Routing selection signal + wire i_active0to4; // Active signal + + // Bus-switch SI0 to MI5 signals + wire i_sel0to5; // Routing selection signal + wire i_active0to5; // Active signal + + // Bus-switch SI0 to MI6 signals + wire i_sel0to6; // Routing selection signal + wire i_active0to6; // Active signal + + // Bus-switch SI1 to MI0 signals + wire i_sel1to0; // Routing selection signal + wire i_active1to0; // Active signal + + // Bus-switch SI1 to MI1 signals + wire i_sel1to1; // Routing selection signal + wire i_active1to1; // Active signal + + // Bus-switch SI1 to MI2 signals + wire i_sel1to2; // Routing selection signal + wire i_active1to2; // Active signal + + // Bus-switch SI1 to MI3 signals + wire i_sel1to3; // Routing selection signal + wire i_active1to3; // Active signal + + // Bus-switch SI1 to MI4 signals + wire i_sel1to4; // Routing selection signal + wire i_active1to4; // Active signal + + // Bus-switch SI1 to MI5 signals + wire i_sel1to5; // Routing selection signal + wire i_active1to5; // Active signal + + // Bus-switch SI1 to MI6 signals + wire i_sel1to6; // Routing selection signal + wire i_active1to6; // Active signal + + // Bus-switch SI2 to MI0 signals + wire i_sel2to0; // Routing selection signal + wire i_active2to0; // Active signal + + // Bus-switch SI2 to MI1 signals + wire i_sel2to1; // Routing selection signal + wire i_active2to1; // Active signal + + // Bus-switch SI2 to MI2 signals + wire i_sel2to2; // Routing selection signal + wire i_active2to2; // Active signal + + // Bus-switch SI2 to MI3 signals + wire i_sel2to3; // Routing selection signal + wire i_active2to3; // Active signal + + // Bus-switch SI2 to MI4 signals + wire i_sel2to4; // Routing selection signal + wire i_active2to4; // Active signal + + // Bus-switch SI2 to MI5 signals + wire i_sel2to5; // Routing selection signal + wire i_active2to5; // Active signal + + // Bus-switch SI2 to MI6 signals + wire i_sel2to6; // Routing selection signal + wire i_active2to6; // Active signal + + // Bus-switch SI3 to MI0 signals + wire i_sel3to0; // Routing selection signal + wire i_active3to0; // Active signal + + // Bus-switch SI3 to MI1 signals + wire i_sel3to1; // Routing selection signal + wire i_active3to1; // Active signal + + // Bus-switch SI3 to MI2 signals + wire i_sel3to2; // Routing selection signal + wire i_active3to2; // Active signal + + // Bus-switch SI3 to MI3 signals + wire i_sel3to3; // Routing selection signal + wire i_active3to3; // Active signal + + // Bus-switch SI3 to MI4 signals + wire i_sel3to4; // Routing selection signal + wire i_active3to4; // Active signal + + // Bus-switch SI3 to MI5 signals + wire i_sel3to5; // Routing selection signal + wire i_active3to5; // Active signal + + // Bus-switch SI3 to MI6 signals + wire i_sel3to6; // Routing selection signal + wire i_active3to6; // Active signal + + wire i_hready_mux__rom1; // Internal HREADYMUXM for MI0 + wire i_hready_mux__ram2; // Internal HREADYMUXM for MI1 + wire i_hready_mux__ram3; // Internal HREADYMUXM for MI2 + wire i_hready_mux__sys; // Internal HREADYMUXM for MI3 + wire i_hready_mux__ram8; // Internal HREADYMUXM for MI4 + wire i_hready_mux__ram9; // Internal HREADYMUXM for MI5 + wire i_hready_mux__exp; // Internal HREADYMUXM for MI6 + + +// ----------------------------------------------------------------------------- +// Beginning of main code +// ----------------------------------------------------------------------------- + + // Input stage for SI0 + soclabs_4x7_MasterInput u_soclabs_4x7_MasterInput_0 ( + + // Common AHB signals + .HCLK (HCLK), + .HRESETn (HRESETn), + + // Input Port Address/Control Signals + .HSELS (HSEL_adp), + .HADDRS (HADDR_adp), + .HTRANSS (HTRANS_adp), + .HWRITES (HWRITE_adp), + .HSIZES (HSIZE_adp), + .HBURSTS (HBURST_adp), + .HPROTS (HPROT_adp), + .HMASTERS (HMASTER_adp), + .HMASTLOCKS (HMASTLOCK_adp), + .HREADYS (HREADY_adp), + .HAUSERS (HAUSER_adp), + + // Internal Response + .active_ip (i_active0), + .readyout_ip (i_readyout0), + .resp_ip (i_resp0), + + // Input Port Response + .HREADYOUTS (HREADYOUT_adp), + .HRESPS (HRESP_adp), + + // Internal Address/Control Signals + .sel_ip (i_sel0), + .addr_ip (i_addr0), + .auser_ip (i_auser0), + .trans_ip (i_trans0), + .write_ip (i_write0), + .size_ip (i_size0), + .burst_ip (i_burst0), + .prot_ip (i_prot0), + .master_ip (i_master0), + .mastlock_ip (i_mastlock0), + .held_tran_ip (i_held_tran0) + + ); + + + // Input stage for SI1 + soclabs_4x7_MasterInput u_soclabs_4x7_MasterInput_1 ( + + // Common AHB signals + .HCLK (HCLK), + .HRESETn (HRESETn), + + // Input Port Address/Control Signals + .HSELS (HSEL_dma), + .HADDRS (HADDR_dma), + .HTRANSS (HTRANS_dma), + .HWRITES (HWRITE_dma), + .HSIZES (HSIZE_dma), + .HBURSTS (HBURST_dma), + .HPROTS (HPROT_dma), + .HMASTERS (HMASTER_dma), + .HMASTLOCKS (HMASTLOCK_dma), + .HREADYS (HREADY_dma), + .HAUSERS (HAUSER_dma), + + // Internal Response + .active_ip (i_active1), + .readyout_ip (i_readyout1), + .resp_ip (i_resp1), + + // Input Port Response + .HREADYOUTS (HREADYOUT_dma), + .HRESPS (HRESP_dma), + + // Internal Address/Control Signals + .sel_ip (i_sel1), + .addr_ip (i_addr1), + .auser_ip (i_auser1), + .trans_ip (i_trans1), + .write_ip (i_write1), + .size_ip (i_size1), + .burst_ip (i_burst1), + .prot_ip (i_prot1), + .master_ip (i_master1), + .mastlock_ip (i_mastlock1), + .held_tran_ip (i_held_tran1) + + ); + + + // Input stage for SI2 + soclabs_4x7_MasterInput u_soclabs_4x7_MasterInput_2 ( + + // Common AHB signals + .HCLK (HCLK), + .HRESETn (HRESETn), + + // Input Port Address/Control Signals + .HSELS (HSEL_dma2), + .HADDRS (HADDR_dma2), + .HTRANSS (HTRANS_dma2), + .HWRITES (HWRITE_dma2), + .HSIZES (HSIZE_dma2), + .HBURSTS (HBURST_dma2), + .HPROTS (HPROT_dma2), + .HMASTERS (HMASTER_dma2), + .HMASTLOCKS (HMASTLOCK_dma2), + .HREADYS (HREADY_dma2), + .HAUSERS (HAUSER_dma2), + + // Internal Response + .active_ip (i_active2), + .readyout_ip (i_readyout2), + .resp_ip (i_resp2), + + // Input Port Response + .HREADYOUTS (HREADYOUT_dma2), + .HRESPS (HRESP_dma2), + + // Internal Address/Control Signals + .sel_ip (i_sel2), + .addr_ip (i_addr2), + .auser_ip (i_auser2), + .trans_ip (i_trans2), + .write_ip (i_write2), + .size_ip (i_size2), + .burst_ip (i_burst2), + .prot_ip (i_prot2), + .master_ip (i_master2), + .mastlock_ip (i_mastlock2), + .held_tran_ip (i_held_tran2) + + ); + + + // Input stage for SI3 + soclabs_4x7_MasterInput u_soclabs_4x7_MasterInput_3 ( + + // Common AHB signals + .HCLK (HCLK), + .HRESETn (HRESETn), + + // Input Port Address/Control Signals + .HSELS (HSEL_cpu), + .HADDRS (HADDR_cpu), + .HTRANSS (HTRANS_cpu), + .HWRITES (HWRITE_cpu), + .HSIZES (HSIZE_cpu), + .HBURSTS (HBURST_cpu), + .HPROTS (HPROT_cpu), + .HMASTERS (HMASTER_cpu), + .HMASTLOCKS (HMASTLOCK_cpu), + .HREADYS (HREADY_cpu), + .HAUSERS (HAUSER_cpu), + + // Internal Response + .active_ip (i_active3), + .readyout_ip (i_readyout3), + .resp_ip (i_resp3), + + // Input Port Response + .HREADYOUTS (HREADYOUT_cpu), + .HRESPS (HRESP_cpu), + + // Internal Address/Control Signals + .sel_ip (i_sel3), + .addr_ip (i_addr3), + .auser_ip (i_auser3), + .trans_ip (i_trans3), + .write_ip (i_write3), + .size_ip (i_size3), + .burst_ip (i_burst3), + .prot_ip (i_prot3), + .master_ip (i_master3), + .mastlock_ip (i_mastlock3), + .held_tran_ip (i_held_tran3) + + ); + + + // Matrix decoder for SI0 + soclabs_4x7_MatrixDecode_adp u_soclabs_4x7_matrixdecode_adp ( + + // Common AHB signals + .HCLK (HCLK), + .HRESETn (HRESETn), + + // Internal address remapping control + .remapping_dec ( REMAP[0] ), + + // Signals from Input stage SI0 + .HREADYS (HREADY_adp), + .sel_dec (i_sel0), + .decode_addr_dec (i_addr0[31:10]), // HADDR[9:0] is not decoded + .trans_dec (i_trans0), + + // Control/Response for Output Stage MI0 + .active_dec0 (i_active0to0), + .readyout_dec0 (i_hready_mux__rom1), + .resp_dec0 (HRESP_rom1), + .rdata_dec0 (HRDATA_rom1), + .ruser_dec0 (HRUSER_rom1), + + // Control/Response for Output Stage MI1 + .active_dec1 (i_active0to1), + .readyout_dec1 (i_hready_mux__ram2), + .resp_dec1 (HRESP_ram2), + .rdata_dec1 (HRDATA_ram2), + .ruser_dec1 (HRUSER_ram2), + + // Control/Response for Output Stage MI2 + .active_dec2 (i_active0to2), + .readyout_dec2 (i_hready_mux__ram3), + .resp_dec2 (HRESP_ram3), + .rdata_dec2 (HRDATA_ram3), + .ruser_dec2 (HRUSER_ram3), + + // Control/Response for Output Stage MI3 + .active_dec3 (i_active0to3), + .readyout_dec3 (i_hready_mux__sys), + .resp_dec3 (HRESP_sys), + .rdata_dec3 (HRDATA_sys), + .ruser_dec3 (HRUSER_sys), + + // Control/Response for Output Stage MI4 + .active_dec4 (i_active0to4), + .readyout_dec4 (i_hready_mux__ram8), + .resp_dec4 (HRESP_ram8), + .rdata_dec4 (HRDATA_ram8), + .ruser_dec4 (HRUSER_ram8), + + // Control/Response for Output Stage MI5 + .active_dec5 (i_active0to5), + .readyout_dec5 (i_hready_mux__ram9), + .resp_dec5 (HRESP_ram9), + .rdata_dec5 (HRDATA_ram9), + .ruser_dec5 (HRUSER_ram9), + + // Control/Response for Output Stage MI6 + .active_dec6 (i_active0to6), + .readyout_dec6 (i_hready_mux__exp), + .resp_dec6 (HRESP_exp), + .rdata_dec6 (HRDATA_exp), + .ruser_dec6 (HRUSER_exp), + + .sel_dec0 (i_sel0to0), + .sel_dec1 (i_sel0to1), + .sel_dec2 (i_sel0to2), + .sel_dec3 (i_sel0to3), + .sel_dec4 (i_sel0to4), + .sel_dec5 (i_sel0to5), + .sel_dec6 (i_sel0to6), + + .active_dec (i_active0), + .HREADYOUTS (i_readyout0), + .HRESPS (i_resp0), + .HRUSERS (HRUSER_adp), + .HRDATAS (HRDATA_adp) + + ); + + + // Matrix decoder for SI1 + soclabs_4x7_MatrixDecode_dma u_soclabs_4x7_matrixdecode_dma ( + + // Common AHB signals + .HCLK (HCLK), + .HRESETn (HRESETn), + + // Signals from Input stage SI1 + .HREADYS (HREADY_dma), + .sel_dec (i_sel1), + .decode_addr_dec (i_addr1[31:10]), // HADDR[9:0] is not decoded + .trans_dec (i_trans1), + + // Control/Response for Output Stage MI0 + .active_dec0 (i_active1to0), + .readyout_dec0 (i_hready_mux__rom1), + .resp_dec0 (HRESP_rom1), + .rdata_dec0 (HRDATA_rom1), + .ruser_dec0 (HRUSER_rom1), + + // Control/Response for Output Stage MI1 + .active_dec1 (i_active1to1), + .readyout_dec1 (i_hready_mux__ram2), + .resp_dec1 (HRESP_ram2), + .rdata_dec1 (HRDATA_ram2), + .ruser_dec1 (HRUSER_ram2), + + // Control/Response for Output Stage MI2 + .active_dec2 (i_active1to2), + .readyout_dec2 (i_hready_mux__ram3), + .resp_dec2 (HRESP_ram3), + .rdata_dec2 (HRDATA_ram3), + .ruser_dec2 (HRUSER_ram3), + + // Control/Response for Output Stage MI3 + .active_dec3 (i_active1to3), + .readyout_dec3 (i_hready_mux__sys), + .resp_dec3 (HRESP_sys), + .rdata_dec3 (HRDATA_sys), + .ruser_dec3 (HRUSER_sys), + + // Control/Response for Output Stage MI4 + .active_dec4 (i_active1to4), + .readyout_dec4 (i_hready_mux__ram8), + .resp_dec4 (HRESP_ram8), + .rdata_dec4 (HRDATA_ram8), + .ruser_dec4 (HRUSER_ram8), + + // Control/Response for Output Stage MI5 + .active_dec5 (i_active1to5), + .readyout_dec5 (i_hready_mux__ram9), + .resp_dec5 (HRESP_ram9), + .rdata_dec5 (HRDATA_ram9), + .ruser_dec5 (HRUSER_ram9), + + // Control/Response for Output Stage MI6 + .active_dec6 (i_active1to6), + .readyout_dec6 (i_hready_mux__exp), + .resp_dec6 (HRESP_exp), + .rdata_dec6 (HRDATA_exp), + .ruser_dec6 (HRUSER_exp), + + .sel_dec0 (i_sel1to0), + .sel_dec1 (i_sel1to1), + .sel_dec2 (i_sel1to2), + .sel_dec3 (i_sel1to3), + .sel_dec4 (i_sel1to4), + .sel_dec5 (i_sel1to5), + .sel_dec6 (i_sel1to6), + + .active_dec (i_active1), + .HREADYOUTS (i_readyout1), + .HRESPS (i_resp1), + .HRUSERS (HRUSER_dma), + .HRDATAS (HRDATA_dma) + + ); + + + // Matrix decoder for SI2 + soclabs_4x7_MatrixDecode_dma2 u_soclabs_4x7_matrixdecode_dma2 ( + + // Common AHB signals + .HCLK (HCLK), + .HRESETn (HRESETn), + + // Signals from Input stage SI2 + .HREADYS (HREADY_dma2), + .sel_dec (i_sel2), + .decode_addr_dec (i_addr2[31:10]), // HADDR[9:0] is not decoded + .trans_dec (i_trans2), + + // Control/Response for Output Stage MI0 + .active_dec0 (i_active2to0), + .readyout_dec0 (i_hready_mux__rom1), + .resp_dec0 (HRESP_rom1), + .rdata_dec0 (HRDATA_rom1), + .ruser_dec0 (HRUSER_rom1), + + // Control/Response for Output Stage MI1 + .active_dec1 (i_active2to1), + .readyout_dec1 (i_hready_mux__ram2), + .resp_dec1 (HRESP_ram2), + .rdata_dec1 (HRDATA_ram2), + .ruser_dec1 (HRUSER_ram2), + + // Control/Response for Output Stage MI2 + .active_dec2 (i_active2to2), + .readyout_dec2 (i_hready_mux__ram3), + .resp_dec2 (HRESP_ram3), + .rdata_dec2 (HRDATA_ram3), + .ruser_dec2 (HRUSER_ram3), + + // Control/Response for Output Stage MI3 + .active_dec3 (i_active2to3), + .readyout_dec3 (i_hready_mux__sys), + .resp_dec3 (HRESP_sys), + .rdata_dec3 (HRDATA_sys), + .ruser_dec3 (HRUSER_sys), + + // Control/Response for Output Stage MI4 + .active_dec4 (i_active2to4), + .readyout_dec4 (i_hready_mux__ram8), + .resp_dec4 (HRESP_ram8), + .rdata_dec4 (HRDATA_ram8), + .ruser_dec4 (HRUSER_ram8), + + // Control/Response for Output Stage MI5 + .active_dec5 (i_active2to5), + .readyout_dec5 (i_hready_mux__ram9), + .resp_dec5 (HRESP_ram9), + .rdata_dec5 (HRDATA_ram9), + .ruser_dec5 (HRUSER_ram9), + + // Control/Response for Output Stage MI6 + .active_dec6 (i_active2to6), + .readyout_dec6 (i_hready_mux__exp), + .resp_dec6 (HRESP_exp), + .rdata_dec6 (HRDATA_exp), + .ruser_dec6 (HRUSER_exp), + + .sel_dec0 (i_sel2to0), + .sel_dec1 (i_sel2to1), + .sel_dec2 (i_sel2to2), + .sel_dec3 (i_sel2to3), + .sel_dec4 (i_sel2to4), + .sel_dec5 (i_sel2to5), + .sel_dec6 (i_sel2to6), + + .active_dec (i_active2), + .HREADYOUTS (i_readyout2), + .HRESPS (i_resp2), + .HRUSERS (HRUSER_dma2), + .HRDATAS (HRDATA_dma2) + + ); + + + // Matrix decoder for SI3 + soclabs_4x7_MatrixDecode_cpu u_soclabs_4x7_matrixdecode_cpu ( + + // Common AHB signals + .HCLK (HCLK), + .HRESETn (HRESETn), + + // Internal address remapping control + .remapping_dec ( REMAP[0] ), + + // Signals from Input stage SI3 + .HREADYS (HREADY_cpu), + .sel_dec (i_sel3), + .decode_addr_dec (i_addr3[31:10]), // HADDR[9:0] is not decoded + .trans_dec (i_trans3), + + // Control/Response for Output Stage MI0 + .active_dec0 (i_active3to0), + .readyout_dec0 (i_hready_mux__rom1), + .resp_dec0 (HRESP_rom1), + .rdata_dec0 (HRDATA_rom1), + .ruser_dec0 (HRUSER_rom1), + + // Control/Response for Output Stage MI1 + .active_dec1 (i_active3to1), + .readyout_dec1 (i_hready_mux__ram2), + .resp_dec1 (HRESP_ram2), + .rdata_dec1 (HRDATA_ram2), + .ruser_dec1 (HRUSER_ram2), + + // Control/Response for Output Stage MI2 + .active_dec2 (i_active3to2), + .readyout_dec2 (i_hready_mux__ram3), + .resp_dec2 (HRESP_ram3), + .rdata_dec2 (HRDATA_ram3), + .ruser_dec2 (HRUSER_ram3), + + // Control/Response for Output Stage MI3 + .active_dec3 (i_active3to3), + .readyout_dec3 (i_hready_mux__sys), + .resp_dec3 (HRESP_sys), + .rdata_dec3 (HRDATA_sys), + .ruser_dec3 (HRUSER_sys), + + // Control/Response for Output Stage MI4 + .active_dec4 (i_active3to4), + .readyout_dec4 (i_hready_mux__ram8), + .resp_dec4 (HRESP_ram8), + .rdata_dec4 (HRDATA_ram8), + .ruser_dec4 (HRUSER_ram8), + + // Control/Response for Output Stage MI5 + .active_dec5 (i_active3to5), + .readyout_dec5 (i_hready_mux__ram9), + .resp_dec5 (HRESP_ram9), + .rdata_dec5 (HRDATA_ram9), + .ruser_dec5 (HRUSER_ram9), + + // Control/Response for Output Stage MI6 + .active_dec6 (i_active3to6), + .readyout_dec6 (i_hready_mux__exp), + .resp_dec6 (HRESP_exp), + .rdata_dec6 (HRDATA_exp), + .ruser_dec6 (HRUSER_exp), + + .sel_dec0 (i_sel3to0), + .sel_dec1 (i_sel3to1), + .sel_dec2 (i_sel3to2), + .sel_dec3 (i_sel3to3), + .sel_dec4 (i_sel3to4), + .sel_dec5 (i_sel3to5), + .sel_dec6 (i_sel3to6), + + .active_dec (i_active3), + .HREADYOUTS (i_readyout3), + .HRESPS (i_resp3), + .HRUSERS (HRUSER_cpu), + .HRDATAS (HRDATA_cpu) + + ); + + + // Output stage for MI0 + soclabs_4x7_SlaveOutput u_soclabs_4x7_slaveoutput_0 ( + + // Common AHB signals + .HCLK (HCLK), + .HRESETn (HRESETn), + + // Port 0 Signals + .sel_op0 (i_sel0to0), + .addr_op0 (i_addr0), + .auser_op0 (i_auser0), + .trans_op0 (i_trans0), + .write_op0 (i_write0), + .size_op0 (i_size0), + .burst_op0 (i_burst0), + .prot_op0 (i_prot0), + .master_op0 (i_master0), + .mastlock_op0 (i_mastlock0), + .wdata_op0 (HWDATA_adp), + .wuser_op0 (HWUSER_adp), + .held_tran_op0 (i_held_tran0), + + // Port 1 Signals + .sel_op1 (i_sel1to0), + .addr_op1 (i_addr1), + .auser_op1 (i_auser1), + .trans_op1 (i_trans1), + .write_op1 (i_write1), + .size_op1 (i_size1), + .burst_op1 (i_burst1), + .prot_op1 (i_prot1), + .master_op1 (i_master1), + .mastlock_op1 (i_mastlock1), + .wdata_op1 (HWDATA_dma), + .wuser_op1 (HWUSER_dma), + .held_tran_op1 (i_held_tran1), + + // Port 2 Signals + .sel_op2 (i_sel2to0), + .addr_op2 (i_addr2), + .auser_op2 (i_auser2), + .trans_op2 (i_trans2), + .write_op2 (i_write2), + .size_op2 (i_size2), + .burst_op2 (i_burst2), + .prot_op2 (i_prot2), + .master_op2 (i_master2), + .mastlock_op2 (i_mastlock2), + .wdata_op2 (HWDATA_dma2), + .wuser_op2 (HWUSER_dma2), + .held_tran_op2 (i_held_tran2), + + // Port 3 Signals + .sel_op3 (i_sel3to0), + .addr_op3 (i_addr3), + .auser_op3 (i_auser3), + .trans_op3 (i_trans3), + .write_op3 (i_write3), + .size_op3 (i_size3), + .burst_op3 (i_burst3), + .prot_op3 (i_prot3), + .master_op3 (i_master3), + .mastlock_op3 (i_mastlock3), + .wdata_op3 (HWDATA_cpu), + .wuser_op3 (HWUSER_cpu), + .held_tran_op3 (i_held_tran3), + + // Slave read data and response + .HREADYOUTM (HREADYOUT_rom1), + + .active_op0 (i_active0to0), + .active_op1 (i_active1to0), + .active_op2 (i_active2to0), + .active_op3 (i_active3to0), + + // Slave Address/Control Signals + .HSELM (HSEL_rom1), + .HADDRM (HADDR_rom1), + .HAUSERM (HAUSER_rom1), + .HTRANSM (HTRANS_rom1), + .HWRITEM (HWRITE_rom1), + .HSIZEM (HSIZE_rom1), + .HBURSTM (HBURST_rom1), + .HPROTM (HPROT_rom1), + .HMASTERM (HMASTER_rom1), + .HMASTLOCKM (HMASTLOCK_rom1), + .HREADYMUXM (i_hready_mux__rom1), + .HWUSERM (HWUSER_rom1), + .HWDATAM (HWDATA_rom1) + + ); + + // Drive output with internal version + assign HREADYMUX_rom1 = i_hready_mux__rom1; + + + // Output stage for MI1 + soclabs_4x7_SlaveOutput u_soclabs_4x7_slaveoutput_1 ( + + // Common AHB signals + .HCLK (HCLK), + .HRESETn (HRESETn), + + // Port 0 Signals + .sel_op0 (i_sel0to1), + .addr_op0 (i_addr0), + .auser_op0 (i_auser0), + .trans_op0 (i_trans0), + .write_op0 (i_write0), + .size_op0 (i_size0), + .burst_op0 (i_burst0), + .prot_op0 (i_prot0), + .master_op0 (i_master0), + .mastlock_op0 (i_mastlock0), + .wdata_op0 (HWDATA_adp), + .wuser_op0 (HWUSER_adp), + .held_tran_op0 (i_held_tran0), + + // Port 1 Signals + .sel_op1 (i_sel1to1), + .addr_op1 (i_addr1), + .auser_op1 (i_auser1), + .trans_op1 (i_trans1), + .write_op1 (i_write1), + .size_op1 (i_size1), + .burst_op1 (i_burst1), + .prot_op1 (i_prot1), + .master_op1 (i_master1), + .mastlock_op1 (i_mastlock1), + .wdata_op1 (HWDATA_dma), + .wuser_op1 (HWUSER_dma), + .held_tran_op1 (i_held_tran1), + + // Port 2 Signals + .sel_op2 (i_sel2to1), + .addr_op2 (i_addr2), + .auser_op2 (i_auser2), + .trans_op2 (i_trans2), + .write_op2 (i_write2), + .size_op2 (i_size2), + .burst_op2 (i_burst2), + .prot_op2 (i_prot2), + .master_op2 (i_master2), + .mastlock_op2 (i_mastlock2), + .wdata_op2 (HWDATA_dma2), + .wuser_op2 (HWUSER_dma2), + .held_tran_op2 (i_held_tran2), + + // Port 3 Signals + .sel_op3 (i_sel3to1), + .addr_op3 (i_addr3), + .auser_op3 (i_auser3), + .trans_op3 (i_trans3), + .write_op3 (i_write3), + .size_op3 (i_size3), + .burst_op3 (i_burst3), + .prot_op3 (i_prot3), + .master_op3 (i_master3), + .mastlock_op3 (i_mastlock3), + .wdata_op3 (HWDATA_cpu), + .wuser_op3 (HWUSER_cpu), + .held_tran_op3 (i_held_tran3), + + // Slave read data and response + .HREADYOUTM (HREADYOUT_ram2), + + .active_op0 (i_active0to1), + .active_op1 (i_active1to1), + .active_op2 (i_active2to1), + .active_op3 (i_active3to1), + + // Slave Address/Control Signals + .HSELM (HSEL_ram2), + .HADDRM (HADDR_ram2), + .HAUSERM (HAUSER_ram2), + .HTRANSM (HTRANS_ram2), + .HWRITEM (HWRITE_ram2), + .HSIZEM (HSIZE_ram2), + .HBURSTM (HBURST_ram2), + .HPROTM (HPROT_ram2), + .HMASTERM (HMASTER_ram2), + .HMASTLOCKM (HMASTLOCK_ram2), + .HREADYMUXM (i_hready_mux__ram2), + .HWUSERM (HWUSER_ram2), + .HWDATAM (HWDATA_ram2) + + ); + + // Drive output with internal version + assign HREADYMUX_ram2 = i_hready_mux__ram2; + + + // Output stage for MI2 + soclabs_4x7_SlaveOutput u_soclabs_4x7_slaveoutput_2 ( + + // Common AHB signals + .HCLK (HCLK), + .HRESETn (HRESETn), + + // Port 0 Signals + .sel_op0 (i_sel0to2), + .addr_op0 (i_addr0), + .auser_op0 (i_auser0), + .trans_op0 (i_trans0), + .write_op0 (i_write0), + .size_op0 (i_size0), + .burst_op0 (i_burst0), + .prot_op0 (i_prot0), + .master_op0 (i_master0), + .mastlock_op0 (i_mastlock0), + .wdata_op0 (HWDATA_adp), + .wuser_op0 (HWUSER_adp), + .held_tran_op0 (i_held_tran0), + + // Port 1 Signals + .sel_op1 (i_sel1to2), + .addr_op1 (i_addr1), + .auser_op1 (i_auser1), + .trans_op1 (i_trans1), + .write_op1 (i_write1), + .size_op1 (i_size1), + .burst_op1 (i_burst1), + .prot_op1 (i_prot1), + .master_op1 (i_master1), + .mastlock_op1 (i_mastlock1), + .wdata_op1 (HWDATA_dma), + .wuser_op1 (HWUSER_dma), + .held_tran_op1 (i_held_tran1), + + // Port 2 Signals + .sel_op2 (i_sel2to2), + .addr_op2 (i_addr2), + .auser_op2 (i_auser2), + .trans_op2 (i_trans2), + .write_op2 (i_write2), + .size_op2 (i_size2), + .burst_op2 (i_burst2), + .prot_op2 (i_prot2), + .master_op2 (i_master2), + .mastlock_op2 (i_mastlock2), + .wdata_op2 (HWDATA_dma2), + .wuser_op2 (HWUSER_dma2), + .held_tran_op2 (i_held_tran2), + + // Port 3 Signals + .sel_op3 (i_sel3to2), + .addr_op3 (i_addr3), + .auser_op3 (i_auser3), + .trans_op3 (i_trans3), + .write_op3 (i_write3), + .size_op3 (i_size3), + .burst_op3 (i_burst3), + .prot_op3 (i_prot3), + .master_op3 (i_master3), + .mastlock_op3 (i_mastlock3), + .wdata_op3 (HWDATA_cpu), + .wuser_op3 (HWUSER_cpu), + .held_tran_op3 (i_held_tran3), + + // Slave read data and response + .HREADYOUTM (HREADYOUT_ram3), + + .active_op0 (i_active0to2), + .active_op1 (i_active1to2), + .active_op2 (i_active2to2), + .active_op3 (i_active3to2), + + // Slave Address/Control Signals + .HSELM (HSEL_ram3), + .HADDRM (HADDR_ram3), + .HAUSERM (HAUSER_ram3), + .HTRANSM (HTRANS_ram3), + .HWRITEM (HWRITE_ram3), + .HSIZEM (HSIZE_ram3), + .HBURSTM (HBURST_ram3), + .HPROTM (HPROT_ram3), + .HMASTERM (HMASTER_ram3), + .HMASTLOCKM (HMASTLOCK_ram3), + .HREADYMUXM (i_hready_mux__ram3), + .HWUSERM (HWUSER_ram3), + .HWDATAM (HWDATA_ram3) + + ); + + // Drive output with internal version + assign HREADYMUX_ram3 = i_hready_mux__ram3; + + + // Output stage for MI3 + soclabs_4x7_SlaveOutput u_soclabs_4x7_slaveoutput_3 ( + + // Common AHB signals + .HCLK (HCLK), + .HRESETn (HRESETn), + + // Port 0 Signals + .sel_op0 (i_sel0to3), + .addr_op0 (i_addr0), + .auser_op0 (i_auser0), + .trans_op0 (i_trans0), + .write_op0 (i_write0), + .size_op0 (i_size0), + .burst_op0 (i_burst0), + .prot_op0 (i_prot0), + .master_op0 (i_master0), + .mastlock_op0 (i_mastlock0), + .wdata_op0 (HWDATA_adp), + .wuser_op0 (HWUSER_adp), + .held_tran_op0 (i_held_tran0), + + // Port 1 Signals + .sel_op1 (i_sel1to3), + .addr_op1 (i_addr1), + .auser_op1 (i_auser1), + .trans_op1 (i_trans1), + .write_op1 (i_write1), + .size_op1 (i_size1), + .burst_op1 (i_burst1), + .prot_op1 (i_prot1), + .master_op1 (i_master1), + .mastlock_op1 (i_mastlock1), + .wdata_op1 (HWDATA_dma), + .wuser_op1 (HWUSER_dma), + .held_tran_op1 (i_held_tran1), + + // Port 2 Signals + .sel_op2 (i_sel2to3), + .addr_op2 (i_addr2), + .auser_op2 (i_auser2), + .trans_op2 (i_trans2), + .write_op2 (i_write2), + .size_op2 (i_size2), + .burst_op2 (i_burst2), + .prot_op2 (i_prot2), + .master_op2 (i_master2), + .mastlock_op2 (i_mastlock2), + .wdata_op2 (HWDATA_dma2), + .wuser_op2 (HWUSER_dma2), + .held_tran_op2 (i_held_tran2), + + // Port 3 Signals + .sel_op3 (i_sel3to3), + .addr_op3 (i_addr3), + .auser_op3 (i_auser3), + .trans_op3 (i_trans3), + .write_op3 (i_write3), + .size_op3 (i_size3), + .burst_op3 (i_burst3), + .prot_op3 (i_prot3), + .master_op3 (i_master3), + .mastlock_op3 (i_mastlock3), + .wdata_op3 (HWDATA_cpu), + .wuser_op3 (HWUSER_cpu), + .held_tran_op3 (i_held_tran3), + + // Slave read data and response + .HREADYOUTM (HREADYOUT_sys), + + .active_op0 (i_active0to3), + .active_op1 (i_active1to3), + .active_op2 (i_active2to3), + .active_op3 (i_active3to3), + + // Slave Address/Control Signals + .HSELM (HSEL_sys), + .HADDRM (HADDR_sys), + .HAUSERM (HAUSER_sys), + .HTRANSM (HTRANS_sys), + .HWRITEM (HWRITE_sys), + .HSIZEM (HSIZE_sys), + .HBURSTM (HBURST_sys), + .HPROTM (HPROT_sys), + .HMASTERM (HMASTER_sys), + .HMASTLOCKM (HMASTLOCK_sys), + .HREADYMUXM (i_hready_mux__sys), + .HWUSERM (HWUSER_sys), + .HWDATAM (HWDATA_sys) + + ); + + // Drive output with internal version + assign HREADYMUX_sys = i_hready_mux__sys; + + + // Output stage for MI4 + soclabs_4x7_SlaveOutput u_soclabs_4x7_slaveoutput_4 ( + + // Common AHB signals + .HCLK (HCLK), + .HRESETn (HRESETn), + + // Port 0 Signals + .sel_op0 (i_sel0to4), + .addr_op0 (i_addr0), + .auser_op0 (i_auser0), + .trans_op0 (i_trans0), + .write_op0 (i_write0), + .size_op0 (i_size0), + .burst_op0 (i_burst0), + .prot_op0 (i_prot0), + .master_op0 (i_master0), + .mastlock_op0 (i_mastlock0), + .wdata_op0 (HWDATA_adp), + .wuser_op0 (HWUSER_adp), + .held_tran_op0 (i_held_tran0), + + // Port 1 Signals + .sel_op1 (i_sel1to4), + .addr_op1 (i_addr1), + .auser_op1 (i_auser1), + .trans_op1 (i_trans1), + .write_op1 (i_write1), + .size_op1 (i_size1), + .burst_op1 (i_burst1), + .prot_op1 (i_prot1), + .master_op1 (i_master1), + .mastlock_op1 (i_mastlock1), + .wdata_op1 (HWDATA_dma), + .wuser_op1 (HWUSER_dma), + .held_tran_op1 (i_held_tran1), + + // Port 2 Signals + .sel_op2 (i_sel2to4), + .addr_op2 (i_addr2), + .auser_op2 (i_auser2), + .trans_op2 (i_trans2), + .write_op2 (i_write2), + .size_op2 (i_size2), + .burst_op2 (i_burst2), + .prot_op2 (i_prot2), + .master_op2 (i_master2), + .mastlock_op2 (i_mastlock2), + .wdata_op2 (HWDATA_dma2), + .wuser_op2 (HWUSER_dma2), + .held_tran_op2 (i_held_tran2), + + // Port 3 Signals + .sel_op3 (i_sel3to4), + .addr_op3 (i_addr3), + .auser_op3 (i_auser3), + .trans_op3 (i_trans3), + .write_op3 (i_write3), + .size_op3 (i_size3), + .burst_op3 (i_burst3), + .prot_op3 (i_prot3), + .master_op3 (i_master3), + .mastlock_op3 (i_mastlock3), + .wdata_op3 (HWDATA_cpu), + .wuser_op3 (HWUSER_cpu), + .held_tran_op3 (i_held_tran3), + + // Slave read data and response + .HREADYOUTM (HREADYOUT_ram8), + + .active_op0 (i_active0to4), + .active_op1 (i_active1to4), + .active_op2 (i_active2to4), + .active_op3 (i_active3to4), + + // Slave Address/Control Signals + .HSELM (HSEL_ram8), + .HADDRM (HADDR_ram8), + .HAUSERM (HAUSER_ram8), + .HTRANSM (HTRANS_ram8), + .HWRITEM (HWRITE_ram8), + .HSIZEM (HSIZE_ram8), + .HBURSTM (HBURST_ram8), + .HPROTM (HPROT_ram8), + .HMASTERM (HMASTER_ram8), + .HMASTLOCKM (HMASTLOCK_ram8), + .HREADYMUXM (i_hready_mux__ram8), + .HWUSERM (HWUSER_ram8), + .HWDATAM (HWDATA_ram8) + + ); + + // Drive output with internal version + assign HREADYMUX_ram8 = i_hready_mux__ram8; + + + // Output stage for MI5 + soclabs_4x7_SlaveOutput u_soclabs_4x7_slaveoutput_5 ( + + // Common AHB signals + .HCLK (HCLK), + .HRESETn (HRESETn), + + // Port 0 Signals + .sel_op0 (i_sel0to5), + .addr_op0 (i_addr0), + .auser_op0 (i_auser0), + .trans_op0 (i_trans0), + .write_op0 (i_write0), + .size_op0 (i_size0), + .burst_op0 (i_burst0), + .prot_op0 (i_prot0), + .master_op0 (i_master0), + .mastlock_op0 (i_mastlock0), + .wdata_op0 (HWDATA_adp), + .wuser_op0 (HWUSER_adp), + .held_tran_op0 (i_held_tran0), + + // Port 1 Signals + .sel_op1 (i_sel1to5), + .addr_op1 (i_addr1), + .auser_op1 (i_auser1), + .trans_op1 (i_trans1), + .write_op1 (i_write1), + .size_op1 (i_size1), + .burst_op1 (i_burst1), + .prot_op1 (i_prot1), + .master_op1 (i_master1), + .mastlock_op1 (i_mastlock1), + .wdata_op1 (HWDATA_dma), + .wuser_op1 (HWUSER_dma), + .held_tran_op1 (i_held_tran1), + + // Port 2 Signals + .sel_op2 (i_sel2to5), + .addr_op2 (i_addr2), + .auser_op2 (i_auser2), + .trans_op2 (i_trans2), + .write_op2 (i_write2), + .size_op2 (i_size2), + .burst_op2 (i_burst2), + .prot_op2 (i_prot2), + .master_op2 (i_master2), + .mastlock_op2 (i_mastlock2), + .wdata_op2 (HWDATA_dma2), + .wuser_op2 (HWUSER_dma2), + .held_tran_op2 (i_held_tran2), + + // Port 3 Signals + .sel_op3 (i_sel3to5), + .addr_op3 (i_addr3), + .auser_op3 (i_auser3), + .trans_op3 (i_trans3), + .write_op3 (i_write3), + .size_op3 (i_size3), + .burst_op3 (i_burst3), + .prot_op3 (i_prot3), + .master_op3 (i_master3), + .mastlock_op3 (i_mastlock3), + .wdata_op3 (HWDATA_cpu), + .wuser_op3 (HWUSER_cpu), + .held_tran_op3 (i_held_tran3), + + // Slave read data and response + .HREADYOUTM (HREADYOUT_ram9), + + .active_op0 (i_active0to5), + .active_op1 (i_active1to5), + .active_op2 (i_active2to5), + .active_op3 (i_active3to5), + + // Slave Address/Control Signals + .HSELM (HSEL_ram9), + .HADDRM (HADDR_ram9), + .HAUSERM (HAUSER_ram9), + .HTRANSM (HTRANS_ram9), + .HWRITEM (HWRITE_ram9), + .HSIZEM (HSIZE_ram9), + .HBURSTM (HBURST_ram9), + .HPROTM (HPROT_ram9), + .HMASTERM (HMASTER_ram9), + .HMASTLOCKM (HMASTLOCK_ram9), + .HREADYMUXM (i_hready_mux__ram9), + .HWUSERM (HWUSER_ram9), + .HWDATAM (HWDATA_ram9) + + ); + + // Drive output with internal version + assign HREADYMUX_ram9 = i_hready_mux__ram9; + + + // Output stage for MI6 + soclabs_4x7_SlaveOutput u_soclabs_4x7_slaveoutput_6 ( + + // Common AHB signals + .HCLK (HCLK), + .HRESETn (HRESETn), + + // Port 0 Signals + .sel_op0 (i_sel0to6), + .addr_op0 (i_addr0), + .auser_op0 (i_auser0), + .trans_op0 (i_trans0), + .write_op0 (i_write0), + .size_op0 (i_size0), + .burst_op0 (i_burst0), + .prot_op0 (i_prot0), + .master_op0 (i_master0), + .mastlock_op0 (i_mastlock0), + .wdata_op0 (HWDATA_adp), + .wuser_op0 (HWUSER_adp), + .held_tran_op0 (i_held_tran0), + + // Port 1 Signals + .sel_op1 (i_sel1to6), + .addr_op1 (i_addr1), + .auser_op1 (i_auser1), + .trans_op1 (i_trans1), + .write_op1 (i_write1), + .size_op1 (i_size1), + .burst_op1 (i_burst1), + .prot_op1 (i_prot1), + .master_op1 (i_master1), + .mastlock_op1 (i_mastlock1), + .wdata_op1 (HWDATA_dma), + .wuser_op1 (HWUSER_dma), + .held_tran_op1 (i_held_tran1), + + // Port 2 Signals + .sel_op2 (i_sel2to6), + .addr_op2 (i_addr2), + .auser_op2 (i_auser2), + .trans_op2 (i_trans2), + .write_op2 (i_write2), + .size_op2 (i_size2), + .burst_op2 (i_burst2), + .prot_op2 (i_prot2), + .master_op2 (i_master2), + .mastlock_op2 (i_mastlock2), + .wdata_op2 (HWDATA_dma2), + .wuser_op2 (HWUSER_dma2), + .held_tran_op2 (i_held_tran2), + + // Port 3 Signals + .sel_op3 (i_sel3to6), + .addr_op3 (i_addr3), + .auser_op3 (i_auser3), + .trans_op3 (i_trans3), + .write_op3 (i_write3), + .size_op3 (i_size3), + .burst_op3 (i_burst3), + .prot_op3 (i_prot3), + .master_op3 (i_master3), + .mastlock_op3 (i_mastlock3), + .wdata_op3 (HWDATA_cpu), + .wuser_op3 (HWUSER_cpu), + .held_tran_op3 (i_held_tran3), + + // Slave read data and response + .HREADYOUTM (HREADYOUT_exp), + + .active_op0 (i_active0to6), + .active_op1 (i_active1to6), + .active_op2 (i_active2to6), + .active_op3 (i_active3to6), + + // Slave Address/Control Signals + .HSELM (HSEL_exp), + .HADDRM (HADDR_exp), + .HAUSERM (HAUSER_exp), + .HTRANSM (HTRANS_exp), + .HWRITEM (HWRITE_exp), + .HSIZEM (HSIZE_exp), + .HBURSTM (HBURST_exp), + .HPROTM (HPROT_exp), + .HMASTERM (HMASTER_exp), + .HMASTLOCKM (HMASTLOCK_exp), + .HREADYMUXM (i_hready_mux__exp), + .HWUSERM (HWUSER_exp), + .HWDATAM (HWDATA_exp) + + ); + + // Drive output with internal version + assign HREADYMUX_exp = i_hready_mux__exp; + + +endmodule + +// --================================= End ===================================-- diff --git a/Cortex-M0/nanosoc/systems/mcu/verilog/gen_ahb_busmatrix/verilog/built/soclabs_4x7_AhbMatrix/soclabs_4x7_AhbMatrix_default_slave.v b/Cortex-M0/nanosoc/systems/mcu/verilog/gen_ahb_busmatrix/verilog/built/soclabs_4x7_AhbMatrix/soclabs_4x7_AhbMatrix_default_slave.v new file mode 100644 index 0000000..8f24185 --- /dev/null +++ b/Cortex-M0/nanosoc/systems/mcu/verilog/gen_ahb_busmatrix/verilog/built/soclabs_4x7_AhbMatrix/soclabs_4x7_AhbMatrix_default_slave.v @@ -0,0 +1,140 @@ +//----------------------------------------------------------------------------- +// The confidential and proprietary information contained in this file may +// only be used by a person authorised under and to the extent permitted +// by a subsisting licensing agreement from Arm Limited or its affiliates. +// +// (C) COPYRIGHT 2001-2023 Arm Limited or its affiliates. +// ALL RIGHTS RESERVED +// +// This entire notice must be reproduced on all copies of this file +// and copies of this file may only be made by a person if such person is +// permitted to do so under the terms of a subsisting license agreement +// from Arm Limited or its affiliates. +// +// SVN Information +// +// Checked In : $Date: 2017-10-10 15:55:38 +0100 (Tue, 10 Oct 2017) $ +// +// Revision : $Revision: 371321 $ +// +// Release Information : Cortex-M System Design Kit-r1p1-00rel0 +// +//----------------------------------------------------------------------------- +// +// ----------------------------------------------------------------------------- +// Abstract : Default slave used to drive the slave response signals +// when there are no other slaves selected. +//----------------------------------------------------------------------------- + + +`timescale 1ns/1ps + + +module soclabs_4x7_AhbMatrix_default_slave ( + + // Common AHB signals + HCLK, + HRESETn, + + // AHB control input signals + HSEL, + HTRANS, + HREADY, + + // AHB control output signals + HREADYOUT, + HRESP + + ); + + +// ----------------------------------------------------------------------------- +// Input and Output declarations +// ----------------------------------------------------------------------------- + + // Common AHB signals + input HCLK; // AHB System Clock + input HRESETn; // AHB System Reset + + // AHB control input signals + input HSEL; // Slave Select + input [1:0] HTRANS; // Transfer type + input HREADY; // Transfer done + + // AHB control output signals + output HREADYOUT; // HREADY feedback + output [1:0] HRESP; // Transfer response + + +// ----------------------------------------------------------------------------- +// Constant declarations +// ----------------------------------------------------------------------------- + +// HRESP transfer response signal encoding +`define RSP_OKAY 2'b00 // OKAY response +`define RSP_ERROR 2'b01 // ERROR response +`define RSP_RETRY 2'b10 // RETRY response +`define RSP_SPLIT 2'b11 // SPLIT response + + +// ----------------------------------------------------------------------------- +// Input and Output declarations +// ----------------------------------------------------------------------------- + + // Common AHB signals + wire HCLK; // AHB System Clock + wire HRESETn; // AHB System Reset + + // AHB control input signals + wire HSEL; // Slave Select + wire [1:0] HTRANS; // Transfer type + wire HREADY; // Transfer done + + // AHB control output signals + wire HREADYOUT; // HREADY feedback + wire [1:0] HRESP; // Transfer response + + +// ----------------------------------------------------------------------------- +// Signal declarations +// ----------------------------------------------------------------------------- + + wire invalid; // Set during invalid transfer + wire hready_next; // Controls generation of HREADYOUT output + reg i_hreadyout; // HREADYOUT register + wire [1:0] hresp_next; // Generated response + reg [1:0] i_hresp; // HRESP register + + +// ----------------------------------------------------------------------------- +// Beginning of main code +// ----------------------------------------------------------------------------- + + assign invalid = ( HREADY & HSEL & HTRANS[1] ); + assign hready_next = i_hreadyout ? ~invalid : 1'b1 ; + assign hresp_next = invalid ? `RSP_ERROR : `RSP_OKAY; + + always @(negedge HRESETn or posedge HCLK) + begin : p_resp_seq + if (~HRESETn) + begin + i_hreadyout <= 1'b1; + i_hresp <= `RSP_OKAY; + end + else + begin + i_hreadyout <= hready_next; + + if (i_hreadyout) + i_hresp <= hresp_next; + end + end + + // Drive outputs with internal versions + assign HREADYOUT = i_hreadyout; + assign HRESP = i_hresp; + + +endmodule + +// --================================= End ===================================-- diff --git a/Cortex-M0/nanosoc/systems/mcu/verilog/gen_ahb_busmatrix/verilog/built/soclabs_4x7_AhbMatrix/soclabs_4x7_AhbMatrix_lite.v b/Cortex-M0/nanosoc/systems/mcu/verilog/gen_ahb_busmatrix/verilog/built/soclabs_4x7_AhbMatrix/soclabs_4x7_AhbMatrix_lite.v new file mode 100644 index 0000000..bd81ad5 --- /dev/null +++ b/Cortex-M0/nanosoc/systems/mcu/verilog/gen_ahb_busmatrix/verilog/built/soclabs_4x7_AhbMatrix/soclabs_4x7_AhbMatrix_lite.v @@ -0,0 +1,985 @@ +//----------------------------------------------------------------------------- +// The confidential and proprietary information contained in this file may +// only be used by a person authorised under and to the extent permitted +// by a subsisting licensing agreement from Arm Limited or its affiliates. +// +// (C) COPYRIGHT 2001-2023 Arm Limited or its affiliates. +// ALL RIGHTS RESERVED +// +// This entire notice must be reproduced on all copies of this file +// and copies of this file may only be made by a person if such person is +// permitted to do so under the terms of a subsisting license agreement +// from Arm Limited or its affiliates. +// +// SVN Information +// +// Checked In : $Date: 2017-10-10 15:55:38 +0100 (Tue, 10 Oct 2017) $ +// +// Revision : $Revision: 371321 $ +// +// Release Information : Cortex-M System Design Kit-r1p1-00rel0 +// +//----------------------------------------------------------------------------- +// +//------------------------------------------------------------------------------ +// Abstract : BusMatrixLite is a wrapper module that wraps around +// the BusMatrix module to give AHB Lite compliant +// slave and master interfaces. +// +//----------------------------------------------------------------------------- + + +`timescale 1ns/1ps + + +module soclabs_4x7_AhbMatrix_lite ( + + // Common AHB signals + HCLK, + HRESETn, + + // System Address Remap control + REMAP, + + // Input port SI0 (inputs from master 0) + HADDR_adp, + HTRANS_adp, + HWRITE_adp, + HSIZE_adp, + HBURST_adp, + HPROT_adp, + HWDATA_adp, + HMASTLOCK_adp, + HAUSER_adp, + HWUSER_adp, + + // Input port SI1 (inputs from master 1) + HADDR_dma, + HTRANS_dma, + HWRITE_dma, + HSIZE_dma, + HBURST_dma, + HPROT_dma, + HWDATA_dma, + HMASTLOCK_dma, + HAUSER_dma, + HWUSER_dma, + + // Input port SI2 (inputs from master 2) + HADDR_dma2, + HTRANS_dma2, + HWRITE_dma2, + HSIZE_dma2, + HBURST_dma2, + HPROT_dma2, + HWDATA_dma2, + HMASTLOCK_dma2, + HAUSER_dma2, + HWUSER_dma2, + + // Input port SI3 (inputs from master 3) + HADDR_cpu, + HTRANS_cpu, + HWRITE_cpu, + HSIZE_cpu, + HBURST_cpu, + HPROT_cpu, + HWDATA_cpu, + HMASTLOCK_cpu, + HAUSER_cpu, + HWUSER_cpu, + + // Output port MI0 (inputs from slave 0) + HRDATA_rom1, + HREADYOUT_rom1, + HRESP_rom1, + HRUSER_rom1, + + // Output port MI1 (inputs from slave 1) + HRDATA_ram2, + HREADYOUT_ram2, + HRESP_ram2, + HRUSER_ram2, + + // Output port MI2 (inputs from slave 2) + HRDATA_ram3, + HREADYOUT_ram3, + HRESP_ram3, + HRUSER_ram3, + + // Output port MI3 (inputs from slave 3) + HRDATA_sys, + HREADYOUT_sys, + HRESP_sys, + HRUSER_sys, + + // Output port MI4 (inputs from slave 4) + HRDATA_ram8, + HREADYOUT_ram8, + HRESP_ram8, + HRUSER_ram8, + + // Output port MI5 (inputs from slave 5) + HRDATA_ram9, + HREADYOUT_ram9, + HRESP_ram9, + HRUSER_ram9, + + // Output port MI6 (inputs from slave 6) + HRDATA_exp, + HREADYOUT_exp, + HRESP_exp, + HRUSER_exp, + + // Scan test dummy signals; not connected until scan insertion + SCANENABLE, // Scan Test Mode Enable + SCANINHCLK, // Scan Chain Input + + + // Output port MI0 (outputs to slave 0) + HSEL_rom1, + HADDR_rom1, + HTRANS_rom1, + HWRITE_rom1, + HSIZE_rom1, + HBURST_rom1, + HPROT_rom1, + HWDATA_rom1, + HMASTLOCK_rom1, + HREADYMUX_rom1, + HAUSER_rom1, + HWUSER_rom1, + + // Output port MI1 (outputs to slave 1) + HSEL_ram2, + HADDR_ram2, + HTRANS_ram2, + HWRITE_ram2, + HSIZE_ram2, + HBURST_ram2, + HPROT_ram2, + HWDATA_ram2, + HMASTLOCK_ram2, + HREADYMUX_ram2, + HAUSER_ram2, + HWUSER_ram2, + + // Output port MI2 (outputs to slave 2) + HSEL_ram3, + HADDR_ram3, + HTRANS_ram3, + HWRITE_ram3, + HSIZE_ram3, + HBURST_ram3, + HPROT_ram3, + HWDATA_ram3, + HMASTLOCK_ram3, + HREADYMUX_ram3, + HAUSER_ram3, + HWUSER_ram3, + + // Output port MI3 (outputs to slave 3) + HSEL_sys, + HADDR_sys, + HTRANS_sys, + HWRITE_sys, + HSIZE_sys, + HBURST_sys, + HPROT_sys, + HWDATA_sys, + HMASTLOCK_sys, + HREADYMUX_sys, + HAUSER_sys, + HWUSER_sys, + + // Output port MI4 (outputs to slave 4) + HSEL_ram8, + HADDR_ram8, + HTRANS_ram8, + HWRITE_ram8, + HSIZE_ram8, + HBURST_ram8, + HPROT_ram8, + HWDATA_ram8, + HMASTLOCK_ram8, + HREADYMUX_ram8, + HAUSER_ram8, + HWUSER_ram8, + + // Output port MI5 (outputs to slave 5) + HSEL_ram9, + HADDR_ram9, + HTRANS_ram9, + HWRITE_ram9, + HSIZE_ram9, + HBURST_ram9, + HPROT_ram9, + HWDATA_ram9, + HMASTLOCK_ram9, + HREADYMUX_ram9, + HAUSER_ram9, + HWUSER_ram9, + + // Output port MI6 (outputs to slave 6) + HSEL_exp, + HADDR_exp, + HTRANS_exp, + HWRITE_exp, + HSIZE_exp, + HBURST_exp, + HPROT_exp, + HWDATA_exp, + HMASTLOCK_exp, + HREADYMUX_exp, + HAUSER_exp, + HWUSER_exp, + + // Input port SI0 (outputs to master 0) + HRDATA_adp, + HREADY_adp, + HRESP_adp, + HRUSER_adp, + + // Input port SI1 (outputs to master 1) + HRDATA_dma, + HREADY_dma, + HRESP_dma, + HRUSER_dma, + + // Input port SI2 (outputs to master 2) + HRDATA_dma2, + HREADY_dma2, + HRESP_dma2, + HRUSER_dma2, + + // Input port SI3 (outputs to master 3) + HRDATA_cpu, + HREADY_cpu, + HRESP_cpu, + HRUSER_cpu, + + // Scan test dummy signals; not connected until scan insertion + SCANOUTHCLK // Scan Chain Output + + ); + +// ----------------------------------------------------------------------------- +// Input and Output declarations +// ----------------------------------------------------------------------------- + + // Common AHB signals + input HCLK; // AHB System Clock + input HRESETn; // AHB System Reset + + // System Address Remap control + input [3:0] REMAP; // System Address REMAP control + + // Input port SI0 (inputs from master 0) + input [31:0] HADDR_adp; // Address bus + input [1:0] HTRANS_adp; // Transfer type + input HWRITE_adp; // Transfer direction + input [2:0] HSIZE_adp; // Transfer size + input [2:0] HBURST_adp; // Burst type + input [3:0] HPROT_adp; // Protection control + input [31:0] HWDATA_adp; // Write data + input HMASTLOCK_adp; // Locked Sequence + input [1:0] HAUSER_adp; // Address USER signals + input [1:0] HWUSER_adp; // Write-data USER signals + + // Input port SI1 (inputs from master 1) + input [31:0] HADDR_dma; // Address bus + input [1:0] HTRANS_dma; // Transfer type + input HWRITE_dma; // Transfer direction + input [2:0] HSIZE_dma; // Transfer size + input [2:0] HBURST_dma; // Burst type + input [3:0] HPROT_dma; // Protection control + input [31:0] HWDATA_dma; // Write data + input HMASTLOCK_dma; // Locked Sequence + input [1:0] HAUSER_dma; // Address USER signals + input [1:0] HWUSER_dma; // Write-data USER signals + + // Input port SI2 (inputs from master 2) + input [31:0] HADDR_dma2; // Address bus + input [1:0] HTRANS_dma2; // Transfer type + input HWRITE_dma2; // Transfer direction + input [2:0] HSIZE_dma2; // Transfer size + input [2:0] HBURST_dma2; // Burst type + input [3:0] HPROT_dma2; // Protection control + input [31:0] HWDATA_dma2; // Write data + input HMASTLOCK_dma2; // Locked Sequence + input [1:0] HAUSER_dma2; // Address USER signals + input [1:0] HWUSER_dma2; // Write-data USER signals + + // Input port SI3 (inputs from master 3) + input [31:0] HADDR_cpu; // Address bus + input [1:0] HTRANS_cpu; // Transfer type + input HWRITE_cpu; // Transfer direction + input [2:0] HSIZE_cpu; // Transfer size + input [2:0] HBURST_cpu; // Burst type + input [3:0] HPROT_cpu; // Protection control + input [31:0] HWDATA_cpu; // Write data + input HMASTLOCK_cpu; // Locked Sequence + input [1:0] HAUSER_cpu; // Address USER signals + input [1:0] HWUSER_cpu; // Write-data USER signals + + // Output port MI0 (inputs from slave 0) + input [31:0] HRDATA_rom1; // Read data bus + input HREADYOUT_rom1; // HREADY feedback + input HRESP_rom1; // Transfer response + input [1:0] HRUSER_rom1; // Read-data USER signals + + // Output port MI1 (inputs from slave 1) + input [31:0] HRDATA_ram2; // Read data bus + input HREADYOUT_ram2; // HREADY feedback + input HRESP_ram2; // Transfer response + input [1:0] HRUSER_ram2; // Read-data USER signals + + // Output port MI2 (inputs from slave 2) + input [31:0] HRDATA_ram3; // Read data bus + input HREADYOUT_ram3; // HREADY feedback + input HRESP_ram3; // Transfer response + input [1:0] HRUSER_ram3; // Read-data USER signals + + // Output port MI3 (inputs from slave 3) + input [31:0] HRDATA_sys; // Read data bus + input HREADYOUT_sys; // HREADY feedback + input HRESP_sys; // Transfer response + input [1:0] HRUSER_sys; // Read-data USER signals + + // Output port MI4 (inputs from slave 4) + input [31:0] HRDATA_ram8; // Read data bus + input HREADYOUT_ram8; // HREADY feedback + input HRESP_ram8; // Transfer response + input [1:0] HRUSER_ram8; // Read-data USER signals + + // Output port MI5 (inputs from slave 5) + input [31:0] HRDATA_ram9; // Read data bus + input HREADYOUT_ram9; // HREADY feedback + input HRESP_ram9; // Transfer response + input [1:0] HRUSER_ram9; // Read-data USER signals + + // Output port MI6 (inputs from slave 6) + input [31:0] HRDATA_exp; // Read data bus + input HREADYOUT_exp; // HREADY feedback + input HRESP_exp; // Transfer response + input [1:0] HRUSER_exp; // Read-data USER signals + + // Scan test dummy signals; not connected until scan insertion + input SCANENABLE; // Scan enable signal + input SCANINHCLK; // HCLK scan input + + + // Output port MI0 (outputs to slave 0) + output HSEL_rom1; // Slave Select + output [31:0] HADDR_rom1; // Address bus + output [1:0] HTRANS_rom1; // Transfer type + output HWRITE_rom1; // Transfer direction + output [2:0] HSIZE_rom1; // Transfer size + output [2:0] HBURST_rom1; // Burst type + output [3:0] HPROT_rom1; // Protection control + output [31:0] HWDATA_rom1; // Write data + output HMASTLOCK_rom1; // Locked Sequence + output HREADYMUX_rom1; // Transfer done + output [1:0] HAUSER_rom1; // Address USER signals + output [1:0] HWUSER_rom1; // Write-data USER signals + + // Output port MI1 (outputs to slave 1) + output HSEL_ram2; // Slave Select + output [31:0] HADDR_ram2; // Address bus + output [1:0] HTRANS_ram2; // Transfer type + output HWRITE_ram2; // Transfer direction + output [2:0] HSIZE_ram2; // Transfer size + output [2:0] HBURST_ram2; // Burst type + output [3:0] HPROT_ram2; // Protection control + output [31:0] HWDATA_ram2; // Write data + output HMASTLOCK_ram2; // Locked Sequence + output HREADYMUX_ram2; // Transfer done + output [1:0] HAUSER_ram2; // Address USER signals + output [1:0] HWUSER_ram2; // Write-data USER signals + + // Output port MI2 (outputs to slave 2) + output HSEL_ram3; // Slave Select + output [31:0] HADDR_ram3; // Address bus + output [1:0] HTRANS_ram3; // Transfer type + output HWRITE_ram3; // Transfer direction + output [2:0] HSIZE_ram3; // Transfer size + output [2:0] HBURST_ram3; // Burst type + output [3:0] HPROT_ram3; // Protection control + output [31:0] HWDATA_ram3; // Write data + output HMASTLOCK_ram3; // Locked Sequence + output HREADYMUX_ram3; // Transfer done + output [1:0] HAUSER_ram3; // Address USER signals + output [1:0] HWUSER_ram3; // Write-data USER signals + + // Output port MI3 (outputs to slave 3) + output HSEL_sys; // Slave Select + output [31:0] HADDR_sys; // Address bus + output [1:0] HTRANS_sys; // Transfer type + output HWRITE_sys; // Transfer direction + output [2:0] HSIZE_sys; // Transfer size + output [2:0] HBURST_sys; // Burst type + output [3:0] HPROT_sys; // Protection control + output [31:0] HWDATA_sys; // Write data + output HMASTLOCK_sys; // Locked Sequence + output HREADYMUX_sys; // Transfer done + output [1:0] HAUSER_sys; // Address USER signals + output [1:0] HWUSER_sys; // Write-data USER signals + + // Output port MI4 (outputs to slave 4) + output HSEL_ram8; // Slave Select + output [31:0] HADDR_ram8; // Address bus + output [1:0] HTRANS_ram8; // Transfer type + output HWRITE_ram8; // Transfer direction + output [2:0] HSIZE_ram8; // Transfer size + output [2:0] HBURST_ram8; // Burst type + output [3:0] HPROT_ram8; // Protection control + output [31:0] HWDATA_ram8; // Write data + output HMASTLOCK_ram8; // Locked Sequence + output HREADYMUX_ram8; // Transfer done + output [1:0] HAUSER_ram8; // Address USER signals + output [1:0] HWUSER_ram8; // Write-data USER signals + + // Output port MI5 (outputs to slave 5) + output HSEL_ram9; // Slave Select + output [31:0] HADDR_ram9; // Address bus + output [1:0] HTRANS_ram9; // Transfer type + output HWRITE_ram9; // Transfer direction + output [2:0] HSIZE_ram9; // Transfer size + output [2:0] HBURST_ram9; // Burst type + output [3:0] HPROT_ram9; // Protection control + output [31:0] HWDATA_ram9; // Write data + output HMASTLOCK_ram9; // Locked Sequence + output HREADYMUX_ram9; // Transfer done + output [1:0] HAUSER_ram9; // Address USER signals + output [1:0] HWUSER_ram9; // Write-data USER signals + + // Output port MI6 (outputs to slave 6) + output HSEL_exp; // Slave Select + output [31:0] HADDR_exp; // Address bus + output [1:0] HTRANS_exp; // Transfer type + output HWRITE_exp; // Transfer direction + output [2:0] HSIZE_exp; // Transfer size + output [2:0] HBURST_exp; // Burst type + output [3:0] HPROT_exp; // Protection control + output [31:0] HWDATA_exp; // Write data + output HMASTLOCK_exp; // Locked Sequence + output HREADYMUX_exp; // Transfer done + output [1:0] HAUSER_exp; // Address USER signals + output [1:0] HWUSER_exp; // Write-data USER signals + + // Input port SI0 (outputs to master 0) + output [31:0] HRDATA_adp; // Read data bus + output HREADY_adp; // HREADY feedback + output HRESP_adp; // Transfer response + output [1:0] HRUSER_adp; // Read-data USER signals + + // Input port SI1 (outputs to master 1) + output [31:0] HRDATA_dma; // Read data bus + output HREADY_dma; // HREADY feedback + output HRESP_dma; // Transfer response + output [1:0] HRUSER_dma; // Read-data USER signals + + // Input port SI2 (outputs to master 2) + output [31:0] HRDATA_dma2; // Read data bus + output HREADY_dma2; // HREADY feedback + output HRESP_dma2; // Transfer response + output [1:0] HRUSER_dma2; // Read-data USER signals + + // Input port SI3 (outputs to master 3) + output [31:0] HRDATA_cpu; // Read data bus + output HREADY_cpu; // HREADY feedback + output HRESP_cpu; // Transfer response + output [1:0] HRUSER_cpu; // Read-data USER signals + + // Scan test dummy signals; not connected until scan insertion + output SCANOUTHCLK; // Scan Chain Output + +// ----------------------------------------------------------------------------- +// Wire declarations +// ----------------------------------------------------------------------------- + + // Common AHB signals + wire HCLK; // AHB System Clock + wire HRESETn; // AHB System Reset + + // System Address Remap control + wire [3:0] REMAP; // System REMAP signal + + // Input Port SI0 + wire [31:0] HADDR_adp; // Address bus + wire [1:0] HTRANS_adp; // Transfer type + wire HWRITE_adp; // Transfer direction + wire [2:0] HSIZE_adp; // Transfer size + wire [2:0] HBURST_adp; // Burst type + wire [3:0] HPROT_adp; // Protection control + wire [31:0] HWDATA_adp; // Write data + wire HMASTLOCK_adp; // Locked Sequence + + wire [31:0] HRDATA_adp; // Read data bus + wire HREADY_adp; // HREADY feedback + wire HRESP_adp; // Transfer response + wire [1:0] HAUSER_adp; // Address USER signals + wire [1:0] HWUSER_adp; // Write-data USER signals + wire [1:0] HRUSER_adp; // Read-data USER signals + + // Input Port SI1 + wire [31:0] HADDR_dma; // Address bus + wire [1:0] HTRANS_dma; // Transfer type + wire HWRITE_dma; // Transfer direction + wire [2:0] HSIZE_dma; // Transfer size + wire [2:0] HBURST_dma; // Burst type + wire [3:0] HPROT_dma; // Protection control + wire [31:0] HWDATA_dma; // Write data + wire HMASTLOCK_dma; // Locked Sequence + + wire [31:0] HRDATA_dma; // Read data bus + wire HREADY_dma; // HREADY feedback + wire HRESP_dma; // Transfer response + wire [1:0] HAUSER_dma; // Address USER signals + wire [1:0] HWUSER_dma; // Write-data USER signals + wire [1:0] HRUSER_dma; // Read-data USER signals + + // Input Port SI2 + wire [31:0] HADDR_dma2; // Address bus + wire [1:0] HTRANS_dma2; // Transfer type + wire HWRITE_dma2; // Transfer direction + wire [2:0] HSIZE_dma2; // Transfer size + wire [2:0] HBURST_dma2; // Burst type + wire [3:0] HPROT_dma2; // Protection control + wire [31:0] HWDATA_dma2; // Write data + wire HMASTLOCK_dma2; // Locked Sequence + + wire [31:0] HRDATA_dma2; // Read data bus + wire HREADY_dma2; // HREADY feedback + wire HRESP_dma2; // Transfer response + wire [1:0] HAUSER_dma2; // Address USER signals + wire [1:0] HWUSER_dma2; // Write-data USER signals + wire [1:0] HRUSER_dma2; // Read-data USER signals + + // Input Port SI3 + wire [31:0] HADDR_cpu; // Address bus + wire [1:0] HTRANS_cpu; // Transfer type + wire HWRITE_cpu; // Transfer direction + wire [2:0] HSIZE_cpu; // Transfer size + wire [2:0] HBURST_cpu; // Burst type + wire [3:0] HPROT_cpu; // Protection control + wire [31:0] HWDATA_cpu; // Write data + wire HMASTLOCK_cpu; // Locked Sequence + + wire [31:0] HRDATA_cpu; // Read data bus + wire HREADY_cpu; // HREADY feedback + wire HRESP_cpu; // Transfer response + wire [1:0] HAUSER_cpu; // Address USER signals + wire [1:0] HWUSER_cpu; // Write-data USER signals + wire [1:0] HRUSER_cpu; // Read-data USER signals + + // Output Port MI0 + wire HSEL_rom1; // Slave Select + wire [31:0] HADDR_rom1; // Address bus + wire [1:0] HTRANS_rom1; // Transfer type + wire HWRITE_rom1; // Transfer direction + wire [2:0] HSIZE_rom1; // Transfer size + wire [2:0] HBURST_rom1; // Burst type + wire [3:0] HPROT_rom1; // Protection control + wire [31:0] HWDATA_rom1; // Write data + wire HMASTLOCK_rom1; // Locked Sequence + wire HREADYMUX_rom1; // Transfer done + + wire [31:0] HRDATA_rom1; // Read data bus + wire HREADYOUT_rom1; // HREADY feedback + wire HRESP_rom1; // Transfer response + wire [1:0] HAUSER_rom1; // Address USER signals + wire [1:0] HWUSER_rom1; // Write-data USER signals + wire [1:0] HRUSER_rom1; // Read-data USER signals + + // Output Port MI1 + wire HSEL_ram2; // Slave Select + wire [31:0] HADDR_ram2; // Address bus + wire [1:0] HTRANS_ram2; // Transfer type + wire HWRITE_ram2; // Transfer direction + wire [2:0] HSIZE_ram2; // Transfer size + wire [2:0] HBURST_ram2; // Burst type + wire [3:0] HPROT_ram2; // Protection control + wire [31:0] HWDATA_ram2; // Write data + wire HMASTLOCK_ram2; // Locked Sequence + wire HREADYMUX_ram2; // Transfer done + + wire [31:0] HRDATA_ram2; // Read data bus + wire HREADYOUT_ram2; // HREADY feedback + wire HRESP_ram2; // Transfer response + wire [1:0] HAUSER_ram2; // Address USER signals + wire [1:0] HWUSER_ram2; // Write-data USER signals + wire [1:0] HRUSER_ram2; // Read-data USER signals + + // Output Port MI2 + wire HSEL_ram3; // Slave Select + wire [31:0] HADDR_ram3; // Address bus + wire [1:0] HTRANS_ram3; // Transfer type + wire HWRITE_ram3; // Transfer direction + wire [2:0] HSIZE_ram3; // Transfer size + wire [2:0] HBURST_ram3; // Burst type + wire [3:0] HPROT_ram3; // Protection control + wire [31:0] HWDATA_ram3; // Write data + wire HMASTLOCK_ram3; // Locked Sequence + wire HREADYMUX_ram3; // Transfer done + + wire [31:0] HRDATA_ram3; // Read data bus + wire HREADYOUT_ram3; // HREADY feedback + wire HRESP_ram3; // Transfer response + wire [1:0] HAUSER_ram3; // Address USER signals + wire [1:0] HWUSER_ram3; // Write-data USER signals + wire [1:0] HRUSER_ram3; // Read-data USER signals + + // Output Port MI3 + wire HSEL_sys; // Slave Select + wire [31:0] HADDR_sys; // Address bus + wire [1:0] HTRANS_sys; // Transfer type + wire HWRITE_sys; // Transfer direction + wire [2:0] HSIZE_sys; // Transfer size + wire [2:0] HBURST_sys; // Burst type + wire [3:0] HPROT_sys; // Protection control + wire [31:0] HWDATA_sys; // Write data + wire HMASTLOCK_sys; // Locked Sequence + wire HREADYMUX_sys; // Transfer done + + wire [31:0] HRDATA_sys; // Read data bus + wire HREADYOUT_sys; // HREADY feedback + wire HRESP_sys; // Transfer response + wire [1:0] HAUSER_sys; // Address USER signals + wire [1:0] HWUSER_sys; // Write-data USER signals + wire [1:0] HRUSER_sys; // Read-data USER signals + + // Output Port MI4 + wire HSEL_ram8; // Slave Select + wire [31:0] HADDR_ram8; // Address bus + wire [1:0] HTRANS_ram8; // Transfer type + wire HWRITE_ram8; // Transfer direction + wire [2:0] HSIZE_ram8; // Transfer size + wire [2:0] HBURST_ram8; // Burst type + wire [3:0] HPROT_ram8; // Protection control + wire [31:0] HWDATA_ram8; // Write data + wire HMASTLOCK_ram8; // Locked Sequence + wire HREADYMUX_ram8; // Transfer done + + wire [31:0] HRDATA_ram8; // Read data bus + wire HREADYOUT_ram8; // HREADY feedback + wire HRESP_ram8; // Transfer response + wire [1:0] HAUSER_ram8; // Address USER signals + wire [1:0] HWUSER_ram8; // Write-data USER signals + wire [1:0] HRUSER_ram8; // Read-data USER signals + + // Output Port MI5 + wire HSEL_ram9; // Slave Select + wire [31:0] HADDR_ram9; // Address bus + wire [1:0] HTRANS_ram9; // Transfer type + wire HWRITE_ram9; // Transfer direction + wire [2:0] HSIZE_ram9; // Transfer size + wire [2:0] HBURST_ram9; // Burst type + wire [3:0] HPROT_ram9; // Protection control + wire [31:0] HWDATA_ram9; // Write data + wire HMASTLOCK_ram9; // Locked Sequence + wire HREADYMUX_ram9; // Transfer done + + wire [31:0] HRDATA_ram9; // Read data bus + wire HREADYOUT_ram9; // HREADY feedback + wire HRESP_ram9; // Transfer response + wire [1:0] HAUSER_ram9; // Address USER signals + wire [1:0] HWUSER_ram9; // Write-data USER signals + wire [1:0] HRUSER_ram9; // Read-data USER signals + + // Output Port MI6 + wire HSEL_exp; // Slave Select + wire [31:0] HADDR_exp; // Address bus + wire [1:0] HTRANS_exp; // Transfer type + wire HWRITE_exp; // Transfer direction + wire [2:0] HSIZE_exp; // Transfer size + wire [2:0] HBURST_exp; // Burst type + wire [3:0] HPROT_exp; // Protection control + wire [31:0] HWDATA_exp; // Write data + wire HMASTLOCK_exp; // Locked Sequence + wire HREADYMUX_exp; // Transfer done + + wire [31:0] HRDATA_exp; // Read data bus + wire HREADYOUT_exp; // HREADY feedback + wire HRESP_exp; // Transfer response + wire [1:0] HAUSER_exp; // Address USER signals + wire [1:0] HWUSER_exp; // Write-data USER signals + wire [1:0] HRUSER_exp; // Read-data USER signals + + +// ----------------------------------------------------------------------------- +// Signal declarations +// ----------------------------------------------------------------------------- + wire [3:0] tie_hi_4; + wire tie_hi; + wire tie_low; + wire [1:0] i_hresp_adp; + wire [1:0] i_hresp_dma; + wire [1:0] i_hresp_dma2; + wire [1:0] i_hresp_cpu; + + wire [3:0] i_hmaster_rom1; + wire [1:0] i_hresp_rom1; + wire [3:0] i_hmaster_ram2; + wire [1:0] i_hresp_ram2; + wire [3:0] i_hmaster_ram3; + wire [1:0] i_hresp_ram3; + wire [3:0] i_hmaster_sys; + wire [1:0] i_hresp_sys; + wire [3:0] i_hmaster_ram8; + wire [1:0] i_hresp_ram8; + wire [3:0] i_hmaster_ram9; + wire [1:0] i_hresp_ram9; + wire [3:0] i_hmaster_exp; + wire [1:0] i_hresp_exp; + +// ----------------------------------------------------------------------------- +// Beginning of main code +// ----------------------------------------------------------------------------- + + assign tie_hi = 1'b1; + assign tie_hi_4 = 4'b1111; + assign tie_low = 1'b0; + + + assign HRESP_adp = i_hresp_adp[0]; + + assign HRESP_dma = i_hresp_dma[0]; + + assign HRESP_dma2 = i_hresp_dma2[0]; + + assign HRESP_cpu = i_hresp_cpu[0]; + + assign i_hresp_rom1 = {{1{tie_low}}, HRESP_rom1}; + assign i_hresp_ram2 = {{1{tie_low}}, HRESP_ram2}; + assign i_hresp_ram3 = {{1{tie_low}}, HRESP_ram3}; + assign i_hresp_sys = {{1{tie_low}}, HRESP_sys}; + assign i_hresp_ram8 = {{1{tie_low}}, HRESP_ram8}; + assign i_hresp_ram9 = {{1{tie_low}}, HRESP_ram9}; + assign i_hresp_exp = {{1{tie_low}}, HRESP_exp}; + +// BusMatrix instance + soclabs_4x7_AhbMatrix usoclabs_4x7_AhbMatrix ( + .HCLK (HCLK), + .HRESETn (HRESETn), + .REMAP (REMAP), + + // Input port SI0 signals + .HSEL_adp (tie_hi), + .HADDR_adp (HADDR_adp), + .HTRANS_adp (HTRANS_adp), + .HWRITE_adp (HWRITE_adp), + .HSIZE_adp (HSIZE_adp), + .HBURST_adp (HBURST_adp), + .HPROT_adp (HPROT_adp), + .HWDATA_adp (HWDATA_adp), + .HMASTLOCK_adp (HMASTLOCK_adp), + .HMASTER_adp (tie_hi_4), + .HREADY_adp (HREADY_adp), + .HAUSER_adp (HAUSER_adp), + .HWUSER_adp (HWUSER_adp), + .HRDATA_adp (HRDATA_adp), + .HREADYOUT_adp (HREADY_adp), + .HRESP_adp (i_hresp_adp), + .HRUSER_adp (HRUSER_adp), + + // Input port SI1 signals + .HSEL_dma (tie_hi), + .HADDR_dma (HADDR_dma), + .HTRANS_dma (HTRANS_dma), + .HWRITE_dma (HWRITE_dma), + .HSIZE_dma (HSIZE_dma), + .HBURST_dma (HBURST_dma), + .HPROT_dma (HPROT_dma), + .HWDATA_dma (HWDATA_dma), + .HMASTLOCK_dma (HMASTLOCK_dma), + .HMASTER_dma (tie_hi_4), + .HREADY_dma (HREADY_dma), + .HAUSER_dma (HAUSER_dma), + .HWUSER_dma (HWUSER_dma), + .HRDATA_dma (HRDATA_dma), + .HREADYOUT_dma (HREADY_dma), + .HRESP_dma (i_hresp_dma), + .HRUSER_dma (HRUSER_dma), + + // Input port SI2 signals + .HSEL_dma2 (tie_hi), + .HADDR_dma2 (HADDR_dma2), + .HTRANS_dma2 (HTRANS_dma2), + .HWRITE_dma2 (HWRITE_dma2), + .HSIZE_dma2 (HSIZE_dma2), + .HBURST_dma2 (HBURST_dma2), + .HPROT_dma2 (HPROT_dma2), + .HWDATA_dma2 (HWDATA_dma2), + .HMASTLOCK_dma2 (HMASTLOCK_dma2), + .HMASTER_dma2 (tie_hi_4), + .HREADY_dma2 (HREADY_dma2), + .HAUSER_dma2 (HAUSER_dma2), + .HWUSER_dma2 (HWUSER_dma2), + .HRDATA_dma2 (HRDATA_dma2), + .HREADYOUT_dma2 (HREADY_dma2), + .HRESP_dma2 (i_hresp_dma2), + .HRUSER_dma2 (HRUSER_dma2), + + // Input port SI3 signals + .HSEL_cpu (tie_hi), + .HADDR_cpu (HADDR_cpu), + .HTRANS_cpu (HTRANS_cpu), + .HWRITE_cpu (HWRITE_cpu), + .HSIZE_cpu (HSIZE_cpu), + .HBURST_cpu (HBURST_cpu), + .HPROT_cpu (HPROT_cpu), + .HWDATA_cpu (HWDATA_cpu), + .HMASTLOCK_cpu (HMASTLOCK_cpu), + .HMASTER_cpu (tie_hi_4), + .HREADY_cpu (HREADY_cpu), + .HAUSER_cpu (HAUSER_cpu), + .HWUSER_cpu (HWUSER_cpu), + .HRDATA_cpu (HRDATA_cpu), + .HREADYOUT_cpu (HREADY_cpu), + .HRESP_cpu (i_hresp_cpu), + .HRUSER_cpu (HRUSER_cpu), + + + // Output port MI0 signals + .HSEL_rom1 (HSEL_rom1), + .HADDR_rom1 (HADDR_rom1), + .HTRANS_rom1 (HTRANS_rom1), + .HWRITE_rom1 (HWRITE_rom1), + .HSIZE_rom1 (HSIZE_rom1), + .HBURST_rom1 (HBURST_rom1), + .HPROT_rom1 (HPROT_rom1), + .HWDATA_rom1 (HWDATA_rom1), + .HMASTER_rom1 (i_hmaster_rom1), + .HMASTLOCK_rom1 (HMASTLOCK_rom1), + .HREADYMUX_rom1 (HREADYMUX_rom1), + .HAUSER_rom1 (HAUSER_rom1), + .HWUSER_rom1 (HWUSER_rom1), + .HRDATA_rom1 (HRDATA_rom1), + .HREADYOUT_rom1 (HREADYOUT_rom1), + .HRESP_rom1 (i_hresp_rom1), + .HRUSER_rom1 (HRUSER_rom1), + + // Output port MI1 signals + .HSEL_ram2 (HSEL_ram2), + .HADDR_ram2 (HADDR_ram2), + .HTRANS_ram2 (HTRANS_ram2), + .HWRITE_ram2 (HWRITE_ram2), + .HSIZE_ram2 (HSIZE_ram2), + .HBURST_ram2 (HBURST_ram2), + .HPROT_ram2 (HPROT_ram2), + .HWDATA_ram2 (HWDATA_ram2), + .HMASTER_ram2 (i_hmaster_ram2), + .HMASTLOCK_ram2 (HMASTLOCK_ram2), + .HREADYMUX_ram2 (HREADYMUX_ram2), + .HAUSER_ram2 (HAUSER_ram2), + .HWUSER_ram2 (HWUSER_ram2), + .HRDATA_ram2 (HRDATA_ram2), + .HREADYOUT_ram2 (HREADYOUT_ram2), + .HRESP_ram2 (i_hresp_ram2), + .HRUSER_ram2 (HRUSER_ram2), + + // Output port MI2 signals + .HSEL_ram3 (HSEL_ram3), + .HADDR_ram3 (HADDR_ram3), + .HTRANS_ram3 (HTRANS_ram3), + .HWRITE_ram3 (HWRITE_ram3), + .HSIZE_ram3 (HSIZE_ram3), + .HBURST_ram3 (HBURST_ram3), + .HPROT_ram3 (HPROT_ram3), + .HWDATA_ram3 (HWDATA_ram3), + .HMASTER_ram3 (i_hmaster_ram3), + .HMASTLOCK_ram3 (HMASTLOCK_ram3), + .HREADYMUX_ram3 (HREADYMUX_ram3), + .HAUSER_ram3 (HAUSER_ram3), + .HWUSER_ram3 (HWUSER_ram3), + .HRDATA_ram3 (HRDATA_ram3), + .HREADYOUT_ram3 (HREADYOUT_ram3), + .HRESP_ram3 (i_hresp_ram3), + .HRUSER_ram3 (HRUSER_ram3), + + // Output port MI3 signals + .HSEL_sys (HSEL_sys), + .HADDR_sys (HADDR_sys), + .HTRANS_sys (HTRANS_sys), + .HWRITE_sys (HWRITE_sys), + .HSIZE_sys (HSIZE_sys), + .HBURST_sys (HBURST_sys), + .HPROT_sys (HPROT_sys), + .HWDATA_sys (HWDATA_sys), + .HMASTER_sys (i_hmaster_sys), + .HMASTLOCK_sys (HMASTLOCK_sys), + .HREADYMUX_sys (HREADYMUX_sys), + .HAUSER_sys (HAUSER_sys), + .HWUSER_sys (HWUSER_sys), + .HRDATA_sys (HRDATA_sys), + .HREADYOUT_sys (HREADYOUT_sys), + .HRESP_sys (i_hresp_sys), + .HRUSER_sys (HRUSER_sys), + + // Output port MI4 signals + .HSEL_ram8 (HSEL_ram8), + .HADDR_ram8 (HADDR_ram8), + .HTRANS_ram8 (HTRANS_ram8), + .HWRITE_ram8 (HWRITE_ram8), + .HSIZE_ram8 (HSIZE_ram8), + .HBURST_ram8 (HBURST_ram8), + .HPROT_ram8 (HPROT_ram8), + .HWDATA_ram8 (HWDATA_ram8), + .HMASTER_ram8 (i_hmaster_ram8), + .HMASTLOCK_ram8 (HMASTLOCK_ram8), + .HREADYMUX_ram8 (HREADYMUX_ram8), + .HAUSER_ram8 (HAUSER_ram8), + .HWUSER_ram8 (HWUSER_ram8), + .HRDATA_ram8 (HRDATA_ram8), + .HREADYOUT_ram8 (HREADYOUT_ram8), + .HRESP_ram8 (i_hresp_ram8), + .HRUSER_ram8 (HRUSER_ram8), + + // Output port MI5 signals + .HSEL_ram9 (HSEL_ram9), + .HADDR_ram9 (HADDR_ram9), + .HTRANS_ram9 (HTRANS_ram9), + .HWRITE_ram9 (HWRITE_ram9), + .HSIZE_ram9 (HSIZE_ram9), + .HBURST_ram9 (HBURST_ram9), + .HPROT_ram9 (HPROT_ram9), + .HWDATA_ram9 (HWDATA_ram9), + .HMASTER_ram9 (i_hmaster_ram9), + .HMASTLOCK_ram9 (HMASTLOCK_ram9), + .HREADYMUX_ram9 (HREADYMUX_ram9), + .HAUSER_ram9 (HAUSER_ram9), + .HWUSER_ram9 (HWUSER_ram9), + .HRDATA_ram9 (HRDATA_ram9), + .HREADYOUT_ram9 (HREADYOUT_ram9), + .HRESP_ram9 (i_hresp_ram9), + .HRUSER_ram9 (HRUSER_ram9), + + // Output port MI6 signals + .HSEL_exp (HSEL_exp), + .HADDR_exp (HADDR_exp), + .HTRANS_exp (HTRANS_exp), + .HWRITE_exp (HWRITE_exp), + .HSIZE_exp (HSIZE_exp), + .HBURST_exp (HBURST_exp), + .HPROT_exp (HPROT_exp), + .HWDATA_exp (HWDATA_exp), + .HMASTER_exp (i_hmaster_exp), + .HMASTLOCK_exp (HMASTLOCK_exp), + .HREADYMUX_exp (HREADYMUX_exp), + .HAUSER_exp (HAUSER_exp), + .HWUSER_exp (HWUSER_exp), + .HRDATA_exp (HRDATA_exp), + .HREADYOUT_exp (HREADYOUT_exp), + .HRESP_exp (i_hresp_exp), + .HRUSER_exp (HRUSER_exp), + + + // Scan test dummy signals; not connected until scan insertion + .SCANENABLE (SCANENABLE), + .SCANINHCLK (SCANINHCLK), + .SCANOUTHCLK (SCANOUTHCLK) + ); + + +endmodule diff --git a/Cortex-M0/nanosoc/systems/mcu/verilog/gen_ahb_busmatrix/verilog/built/soclabs_4x7_AhbMatrix/soclabs_4x7_Arbiter.v b/Cortex-M0/nanosoc/systems/mcu/verilog/gen_ahb_busmatrix/verilog/built/soclabs_4x7_AhbMatrix/soclabs_4x7_Arbiter.v new file mode 100644 index 0000000..f5eb286 --- /dev/null +++ b/Cortex-M0/nanosoc/systems/mcu/verilog/gen_ahb_busmatrix/verilog/built/soclabs_4x7_AhbMatrix/soclabs_4x7_Arbiter.v @@ -0,0 +1,330 @@ +//----------------------------------------------------------------------------- +// The confidential and proprietary information contained in this file may +// only be used by a person authorised under and to the extent permitted +// by a subsisting licensing agreement from Arm Limited or its affiliates. +// +// (C) COPYRIGHT 2001-2023 Arm Limited or its affiliates. +// ALL RIGHTS RESERVED +// +// This entire notice must be reproduced on all copies of this file +// and copies of this file may only be made by a person if such person is +// permitted to do so under the terms of a subsisting license agreement +// from Arm Limited or its affiliates. +// +// SVN Information +// +// Checked In : $Date: 2017-10-10 15:55:38 +0100 (Tue, 10 Oct 2017) $ +// +// Revision : $Revision: 371321 $ +// +// Release Information : Cortex-M System Design Kit-r1p1-00rel0 +// +//----------------------------------------------------------------------------- +// +//------------------------------------------------------------------------------ +// Abstract : The Output Arbitration is used to determine which +// of the input stages will be given access to the +// shared slave. +// +// Notes : The bus matrix has full connectivity. +// +//----------------------------------------------------------------------------- + + +`timescale 1ns/1ps + + +module soclabs_4x7_Arbiter ( + + // Common AHB signals + HCLK , + HRESETn, + + // Input port request signals + req_port0, + req_port1, + req_port2, + req_port3, + + HREADYM, + HSELM, + HTRANSM, + HBURSTM, + HMASTLOCKM, + + // Arbiter outputs + addr_in_port, + no_port + + ); + + +// ----------------------------------------------------------------------------- +// Input and Output declarations +// ----------------------------------------------------------------------------- + + // Common AHB signals + input HCLK; // AHB system clock + input HRESETn; // AHB system reset + input req_port0; // Port 0 request signal + input req_port1; // Port 1 request signal + input req_port2; // Port 2 request signal + input req_port3; // Port 3 request signal + input HREADYM; // Transfer done + input HSELM; // Slave select line + input [1:0] HTRANSM; // Transfer type + input [2:0] HBURSTM; // Burst type + input HMASTLOCKM; // Locked transfer + output [1:0] addr_in_port; // Port address input + output no_port; // No port selected signal + + +// ----------------------------------------------------------------------------- +// Constant declarations +// ----------------------------------------------------------------------------- + +// HTRANS transfer type signal encoding +`define TRN_IDLE 2'b00 // Idle transfer +`define TRN_BUSY 2'b01 // Busy transfer +`define TRN_NONSEQ 2'b10 // NonSequential transfer +`define TRN_SEQ 2'b11 // Sequential transfer + +// HBURST transfer type signal encoding +`define BUR_SINGLE 3'b000 // Single +`define BUR_INCR 3'b001 // Incremental +`define BUR_WRAP4 3'b010 // 4-beat wrap +`define BUR_INCR4 3'b011 // 4-beat Incr +`define BUR_WRAP8 3'b100 // 8-beat wrap +`define BUR_INCR8 3'b101 // 8-beat Incr +`define BUR_WRAP16 3'b110 // 16-beat Wrap +`define BUR_INCR16 3'b111 // 16-beat Incr + + +// ----------------------------------------------------------------------------- +// Wire declarations +// ----------------------------------------------------------------------------- + wire HCLK; // AHB system clock + wire HRESETn; // AHB system reset + wire req_port0; // Port 0 request signal + wire req_port1; // Port 1 request signal + wire req_port2; // Port 2 request signal + wire req_port3; // Port 3 request signal + wire HREADYM; // Transfer done + wire HSELM; // Slave select line + wire [1:0] HTRANSM; // Transfer type + wire [2:0] HBURSTM; // Burst type + wire HMASTLOCKM; // Locked transfer + wire [1:0] addr_in_port; // Address input port + reg no_port; // No port selected signal + +// ----------------------------------------------------------------------------- +// Signal declarations +// ----------------------------------------------------------------------------- + reg [1:0] addr_in_port_next; // D-input of addr_in_port + reg [1:0] i_addr_in_port; // Internal version of addr_in_port + reg no_port_next; // D-input of no_port + reg [3:0] next_burst_count; // D-input of reg_burst_count + reg [3:0] reg_burst_count; // Burst counter + reg next_burst_hold; // D-input of reg_burst_hold + reg reg_burst_hold; // Burst hold signal + + // Early burst termination logic + reg [1:0] reg_early_term_count; // Counts number of early terminated bursts + wire [1:0] next_early_term_count; // D-input for reg_early_term_count + +// ----------------------------------------------------------------------------- +// Beginning of main code +// ----------------------------------------------------------------------------- + +// ----------------------------------------------------------------------------- +// BURST TRANSFER COUNTER +// ----------------------------------------------------------------------------- +// +// The Burst counter is used to count down from the number of transfers the +// master should perform and when the counter reaches zero the bus may be +// passed to another master. +// +// reg_burst_count indicates the number of transfers remaining in the +// current fixed length burst. +// reg_burst_hold is actually a decode of reg_burst_count=0 but is driven from a register +// to improve timing + + always @ (HTRANSM or HSELM or HBURSTM or reg_burst_count or reg_burst_hold or reg_early_term_count) + begin : p_next_burst_count_comb + // Force the Burst logic to reset if this port is de-selected. This can + // happen for two reasons: + // 1. The master performs 2 fixed-length bursts back-to-back, but the + // second is to an alternate output port + // 2. The master is performing a fixed-length burst but is de-granted mid- + // way by a local AHB Arbiter + if (!HSELM) + begin + next_burst_count = 4'b0000; + next_burst_hold = 1'b0; + end + + // Burst logic is initialised on a NONSEQ transfer (i.e. start of burst) + // IDLE transfers cause the logic to reset + // BUSY transfers pause the decrementer + // SEQ transfers decrement the counter + else + case (HTRANSM) + + `TRN_NONSEQ : begin + case (HBURSTM) + `BUR_INCR16, `BUR_WRAP16 : begin + next_burst_count = 4'b1111; + next_burst_hold = 1'b1; + end // case: BUR_INCR16 | BUR_WRAP16 + + `BUR_INCR8, `BUR_WRAP8 : begin + next_burst_count = 4'b0111; + next_burst_hold = 1'b1; + end // case: BUR_INCR8 | BUR_WRAP8 + + `BUR_INCR4, `BUR_WRAP4 : begin + next_burst_count = 4'b0011; + next_burst_hold = 1'b1; + end // case: BUR_INCR4 | BUR_WRAP4 + + `BUR_SINGLE, `BUR_INCR : begin + next_burst_count = 4'b0000; + next_burst_hold = 1'b0; + end // case: BUR_SINGLE | BUR_INCR + + default : begin + next_burst_count = 4'bxxxx; + next_burst_hold = 1'bx; + end // case: default + endcase // case(HBURSTM) + + // Prevent early burst termination from keeping hold of the port + if (reg_early_term_count == 2'b10) + begin + next_burst_hold = 1'b0; + next_burst_count = 4'd0; + end + + + end // case: `TRN_NONSEQ + + `TRN_SEQ : begin + next_burst_count = reg_burst_count - 4'b1; + if (reg_burst_count == 4'b0001) + next_burst_hold = 1'b0; + else + next_burst_hold = reg_burst_hold; + end // case: `TRN_SEQ + + `TRN_BUSY : begin + next_burst_count = reg_burst_count; + next_burst_hold = reg_burst_hold; + end // case: `TRN_BUSY + + `TRN_IDLE : begin + next_burst_count = 4'b0000; + next_burst_hold = 1'b0; + end // case: `TRN_IDLE + + default : begin + next_burst_count = 4'bxxxx; + next_burst_hold = 1'bx; + end // case: default + + endcase // case(HTRANSM) + end // block: p_next_burst_countComb + + + assign next_early_term_count = (!next_burst_hold) ? 2'b00 : + (reg_burst_hold & (HTRANSM == `TRN_NONSEQ)) ? + reg_early_term_count + 2'b1 : + reg_early_term_count; + + // Sequential process + always @ (negedge HRESETn or posedge HCLK) + begin : p_burst_seq + if (!HRESETn) + begin + reg_burst_count <= 4'b0000; + reg_burst_hold <= 1'b0; + reg_early_term_count <= 2'b00; + end // if (HRESETn == 1'b0) + else + if (HREADYM) + begin + reg_burst_count <= next_burst_count; + reg_burst_hold <= next_burst_hold; + reg_early_term_count <= next_early_term_count; + end + end // block: p_burst_seq + + +// ----------------------------------------------------------------------------- +// Port Selection +// ----------------------------------------------------------------------------- +// The Output Arbitration function looks at all the requests to use the +// output port and determines which is the highest priority request. This +// version of the arbitration logic uses a fixed priority scheme that is +// gated by a tracking function of the burst boundary. Input port 0 is the +// highest priority, input port 1 is the second highest priority, etc. +// If none of the input ports are requesting then the current port will +// remain active if it is performing IDLE transfers to the selected slave. If +// this is not the case then the no_port signal will be asserted which +// indicates that no input port should be selected. + + always @ ( + req_port0 or + req_port1 or + req_port2 or + req_port3 or + HSELM or HTRANSM or HMASTLOCKM or next_burst_hold or i_addr_in_port + ) + begin : p_sel_port_comb + // Default values are used for addr_in_port_next and no_port_next + no_port_next = 1'b0; + addr_in_port_next = i_addr_in_port; + + if ( HMASTLOCKM | next_burst_hold ) + addr_in_port_next = i_addr_in_port; + else if ( req_port0 | ( (i_addr_in_port == 2'b00) & HSELM & + (HTRANSM != 2'b00) ) ) + addr_in_port_next = 2'b00; + else if ( req_port1 | ( (i_addr_in_port == 2'b01) & HSELM & + (HTRANSM != 2'b00) ) ) + addr_in_port_next = 2'b01; + else if ( req_port2 | ( (i_addr_in_port == 2'b10) & HSELM & + (HTRANSM != 2'b00) ) ) + addr_in_port_next = 2'b10; + else if ( req_port3 | ( (i_addr_in_port == 2'b11) & HSELM & + (HTRANSM != 2'b00) ) ) + addr_in_port_next = 2'b11; + else if (HSELM) + addr_in_port_next = i_addr_in_port; + else + no_port_next = 1'b1; + end // block: p_sel_port_comb + + + // Sequential process + always @ (negedge HRESETn or posedge HCLK) + begin : p_addr_in_port_reg + if (!HRESETn) + begin + no_port <= 1'b1; + i_addr_in_port <= {2{1'b0}}; + end + else + if (HREADYM) + begin + no_port <= no_port_next; + i_addr_in_port <= addr_in_port_next; + end + end // block: p_addr_in_port_reg + + // Drive output with internal version + assign addr_in_port = i_addr_in_port; + + +endmodule + +// --================================= End ===================================-- diff --git a/Cortex-M0/nanosoc/systems/mcu/verilog/gen_ahb_busmatrix/verilog/built/soclabs_4x7_AhbMatrix/soclabs_4x7_MasterInput.v b/Cortex-M0/nanosoc/systems/mcu/verilog/gen_ahb_busmatrix/verilog/built/soclabs_4x7_AhbMatrix/soclabs_4x7_MasterInput.v new file mode 100644 index 0000000..c7ff01a --- /dev/null +++ b/Cortex-M0/nanosoc/systems/mcu/verilog/gen_ahb_busmatrix/verilog/built/soclabs_4x7_AhbMatrix/soclabs_4x7_MasterInput.v @@ -0,0 +1,473 @@ +//----------------------------------------------------------------------------- +// The confidential and proprietary information contained in this file may +// only be used by a person authorised under and to the extent permitted +// by a subsisting licensing agreement from Arm Limited or its affiliates. +// +// (C) COPYRIGHT 2001-2023 Arm Limited or its affiliates. +// ALL RIGHTS RESERVED +// +// This entire notice must be reproduced on all copies of this file +// and copies of this file may only be made by a person if such person is +// permitted to do so under the terms of a subsisting license agreement +// from Arm Limited or its affiliates. +// +// SVN Information +// +// Checked In : $Date: 2017-10-10 15:55:38 +0100 (Tue, 10 Oct 2017) $ +// +// Revision : $Revision: 371321 $ +// +// Release Information : Cortex-M System Design Kit-r1p1-00rel0 +// +//----------------------------------------------------------------------------- +// +//------------------------------------------------------------------------------ +// Abstract : The Input Stage is used to hold a pending transfer +// when the required output stage is not available. +// +//----------------------------------------------------------------------------- + + +`timescale 1ns/1ps + + +module soclabs_4x7_MasterInput ( + + // Common AHB signals + HCLK, + HRESETn, + + // Input Port Address/Control Signals + HSELS, + HADDRS, + HAUSERS, + HTRANSS, + HWRITES, + HSIZES, + HBURSTS, + HPROTS, + HMASTERS, + HMASTLOCKS, + HREADYS, + + // Internal Response + active_ip, + readyout_ip, + resp_ip, + + // Input Port Response + HREADYOUTS, + HRESPS, + + // Internal Address/Control Signals + sel_ip, + addr_ip, + auser_ip, + trans_ip, + write_ip, + size_ip, + burst_ip, + prot_ip, + master_ip, + mastlock_ip, + held_tran_ip + + ); + + +// ----------------------------------------------------------------------------- +// Input and Output declarations +// ----------------------------------------------------------------------------- + + input HCLK; // AHB System Clock + input HRESETn; // AHB System Reset + input HSELS; // Slave Select from AHB + input [31:0] HADDRS; // Address bus from AHB + input [1:0] HAUSERS; // Additional user adress bus + input [1:0] HTRANSS; // Transfer type from AHB + input HWRITES; // Transfer direction from AHB + input [2:0] HSIZES; // Transfer size from AHB + input [2:0] HBURSTS; // Burst type from AHB + input [3:0] HPROTS; // Protection control from AHB + input [3:0] HMASTERS; // Master number from AHB + input HMASTLOCKS; // Locked Sequence from AHB + input HREADYS; // Transfer done from AHB + input active_ip; // active_ip signal + input readyout_ip; // HREADYOUT input + input [1:0] resp_ip; // HRESP input + + output HREADYOUTS; // HREADY feedback to AHB + output [1:0] HRESPS; // Transfer response to AHB + output sel_ip; // HSEL output + output [31:0] addr_ip; // HADDR output + output [1:0] auser_ip; // HAUSER output + output [1:0] trans_ip; // HTRANS output + output write_ip; // HWRITE output + output [2:0] size_ip; // HSIZE output + output [2:0] burst_ip; // HBURST output + output [3:0] prot_ip; // HPROT output + output [3:0] master_ip; // HMASTER output + output mastlock_ip; // HMASTLOCK output + output held_tran_ip; // Holding register active flag + + +// ----------------------------------------------------------------------------- +// Constant declarations +// ----------------------------------------------------------------------------- + +// HTRANS transfer type signal encoding +`define TRN_IDLE 2'b00 // Idle Transfer +`define TRN_BUSY 2'b01 // Busy Transfer +`define TRN_NONSEQ 2'b10 // Nonsequential transfer +`define TRN_SEQ 2'b11 // Sequential transfer + +// HBURST transfer type signal encoding +`define BUR_SINGLE 3'b000 // Single BURST +`define BUR_INCR 3'b001 // Incremental BURSTS +`define BUR_WRAP4 3'b010 // 4-beat wrap +`define BUR_INCR4 3'b011 // 4-beat incr +`define BUR_WRAP8 3'b100 // 8-beat wrap +`define BUR_INCR8 3'b101 // 8-beat incr +`define BUR_WRAP16 3'b110 // 16-beat wrap +`define BUR_INCR16 3'b111 // 16-beat incr + +// HRESP signal encoding +`define RSP_OKAY 2'b00 // OKAY response +`define RSP_ERROR 2'b01 // ERROR response +`define RSP_RETRY 2'b10 // RETRY response +`define RSP_SPLIT 2'b11 // SPLIT response + + +// ----------------------------------------------------------------------------- +// Wire declarations +// ----------------------------------------------------------------------------- + + wire HCLK; // AHB System Clock + wire HRESETn; // AHB System Reset + wire HSELS; // Slave Select from AHB + wire [31:0] HADDRS; // Address bus from AHB + wire [1:0] HAUSERS; // Additional user adress bus + wire [1:0] HTRANSS; // Transfer type from AHB + wire HWRITES; // Transfer direction from AHB + wire [2:0] HSIZES; // Transfer size from AHB + wire [2:0] HBURSTS; // Burst type from AHB + wire [3:0] HPROTS; // Protection control from AHB + wire [3:0] HMASTERS; // Master number from AHB + wire HMASTLOCKS; // Locked Sequence from AHB + wire HREADYS; // Transfer done from AHB + reg HREADYOUTS; // HREADY feedback to AHB + reg [1:0] HRESPS; // Transfer response to AHB + reg sel_ip; // HSEL output + reg [31:0] addr_ip; // HADDR output + reg [1:0] auser_ip; // HAUSER output + wire [1:0] trans_ip; // HTRANS output + reg write_ip; // HWRITE output + reg [2:0] size_ip; // HSIZE output + wire [2:0] burst_ip; // HBURST output + reg [3:0] prot_ip; // HPROT output + reg [3:0] master_ip; // HMASTER output + reg mastlock_ip; // HMASTLOCK output + wire held_tran_ip; // Holding register active flag + wire active_ip; // active_ip signal + wire readyout_ip; // HREADYOUT input + wire [1:0] resp_ip; // HRESP input + + +// ----------------------------------------------------------------------------- +// Signal declarations +// ----------------------------------------------------------------------------- + + wire load_reg; // Holding register load flag + wire pend_tran; // An active transfer cannot complete + reg pend_tran_reg; // Registered version of pend_tran + wire addr_valid; // Indicates address phase of + // valid transfer + reg data_valid; // Indicates data phase of + // valid transfer + reg [1:0] reg_trans; // Registered HTRANSS + reg [31:0] reg_addr; // Registered HADDRS + reg [1:0] reg_auser; + reg reg_write; // Registered HWRITES + reg [2:0] reg_size; // Registered HSIZES + reg [2:0] reg_burst; // Registered HBURSTS + reg [3:0] reg_prot; // Registered HPROTS + reg [3:0] reg_master; // Registerd HMASTERS + reg reg_mastlock; // Registered HMASTLOCKS + reg [1:0] transb; // HTRANS output used for burst information + reg [1:0] trans_int; // HTRANS output + reg [2:0] burst_int; // HBURST output + reg [3:0] offset_addr; // Address offset for boundary logic + reg [3:0] check_addr; // Address check for wrapped bursts + reg burst_override; // Registered burst_override_next + wire burst_override_next; // Indicates burst has been over-ridden + reg bound; // Registered version of bound_next + wire bound_next; // Indicates boundary wrapping + wire bound_en; // Clock-enable for bound register + + +// ----------------------------------------------------------------------------- +// Beginning of main code +// ----------------------------------------------------------------------------- + +// ----------------------------------------------------------------------------- +// Holding Registers +// ----------------------------------------------------------------------------- +// Each input port has a holding register associated with it and a mux to +// select between the register and the direct input path. The control of +// the mux is done simply by selecting the holding register when it is loaded +// with a pending transfer, otherwise the straight through path is used. + + always @ (negedge HRESETn or posedge HCLK) + begin : p_holding_reg_seq1 + if (~HRESETn) + begin + reg_trans <= 2'b00; + reg_addr <= {32{1'b0}}; + reg_auser <= {2{1'b0}}; + reg_write <= 1'b0 ; + reg_size <= 3'b000; + reg_burst <= 3'b000; + reg_prot <= {4{1'b0}}; + reg_master <= 4'b0000; + reg_mastlock <= 1'b0 ; + end + else + if (load_reg) + begin + reg_trans <= HTRANSS; + reg_addr <= HADDRS; + reg_auser <= HAUSERS; + reg_write <= HWRITES; + reg_size <= HSIZES; + reg_burst <= HBURSTS; + reg_prot <= HPROTS; + reg_master <= HMASTERS; + reg_mastlock <= HMASTLOCKS; + end + end + + // addr_valid indicates the address phase of an active (non-BUSY/IDLE) + // transfer to this slave port + assign addr_valid = ( HSELS & HTRANSS[1] ); + + // The holding register is loaded whenever there is a transfer on the input + // port which is validated by active HREADYS + assign load_reg = ( addr_valid & HREADYS ); + + // data_valid register + // addr_valid indicates the data phase of an active (non-BUSY/IDLE) + // transfer to this slave port. A valid response (HREADY, HRESP) must be + // generated + always @ (negedge HRESETn or posedge HCLK) + begin : p_data_valid + if (~HRESETn) + data_valid <= 1'b0; + else + if (HREADYS) + data_valid <= addr_valid; + end + +// ----------------------------------------------------------------------------- +// Generate HeldTran +// ----------------------------------------------------------------------------- +// The HeldTran signal is used to indicate when there is an active transfer +// being presented to the output stage, either passing straight through or from +// the holding register. + + // pend_tran indicates that an active transfer presented to this + // slave cannot complete immediately. It is always set after the + // load_reg signal has been active. When set, it is cleared when the + // transfer is being driven onto the selected slave (as indicated by + // active_ip being high) and HREADY from the selected slave is high. + assign pend_tran = (load_reg & (~active_ip)) ? 1'b1 : + (active_ip & readyout_ip) ? 1'b0 : pend_tran_reg; + + // pend_tran_reg indicates that an active transfer was accepted by the input + // stage,but not by the output stage, and so the holding registers should be + // used + always @ (negedge HRESETn or posedge HCLK) + begin : p_pend_tran_reg + if (~HRESETn) + pend_tran_reg <= 1'b0; + else + pend_tran_reg <= pend_tran; + end + + // held_tran_ip indicates an active transfer, and is held whilst that transfer is + // in the holding registers. It passes to the output stage where it acts as + // a request line to the arbitration scheme + assign held_tran_ip = (load_reg | pend_tran_reg); + + // The output from this stage is selected from the holding register when + // there is a held transfer. Otherwise the direct path is used. + + always @ ( pend_tran_reg or HSELS or HTRANSS or HADDRS or HWRITES or + HSIZES or HBURSTS or HPROTS or HMASTERS or HMASTLOCKS or + HAUSERS or reg_auser or + reg_addr or reg_write or reg_size or reg_burst or reg_prot or + reg_master or reg_mastlock + ) + begin : p_mux_comb + if (~pend_tran_reg) + begin + sel_ip = HSELS; + trans_int = HTRANSS; + addr_ip = HADDRS; + auser_ip = HAUSERS; + write_ip = HWRITES; + size_ip = HSIZES; + burst_int = HBURSTS; + prot_ip = HPROTS; + master_ip = HMASTERS; + mastlock_ip = HMASTLOCKS; + end + else + begin + sel_ip = 1'b1; + trans_int = `TRN_NONSEQ; + addr_ip = reg_addr; + auser_ip = reg_auser; + write_ip = reg_write; + size_ip = reg_size; + burst_int = reg_burst; + prot_ip = reg_prot; + master_ip = reg_master; + mastlock_ip = reg_mastlock; + end + end + + // The transb output is used to select the correct Burst value when completing + // an interrupted defined-lenght burst. + + always @ (pend_tran_reg or HTRANSS or reg_trans) + begin : p_transb_comb + if (~pend_tran_reg) + transb = HTRANSS; + else + transb = reg_trans; + end // block: p_transb_comb + + + // Convert SEQ->NONSEQ and BUSY->IDLE when an address boundary is crossed + // whilst the burst type is being over-ridden, i.e. when completing an + // interrupted wrapping burst. + assign trans_ip = (burst_override & bound) ? {trans_int[1], 1'b0} + : trans_int; + + assign burst_ip = (burst_override & (transb != `TRN_NONSEQ)) ? `BUR_INCR + : burst_int; + +// ----------------------------------------------------------------------------- +// HREADYOUT Generation +// ----------------------------------------------------------------------------- +// There are three possible sources for the HREADYOUT signal. +// - It is driven LOW when there is a held transfer. +// - It is driven HIGH when not Selected or for Idle/Busy transfers. +// - At all other times it is driven from the appropriate shared +// slave. + + always @ (data_valid or pend_tran_reg or readyout_ip or resp_ip) + begin : p_ready_comb + if (~data_valid) + begin + HREADYOUTS = 1'b1; + HRESPS = `RSP_OKAY; + end + else if (pend_tran_reg) + begin + HREADYOUTS = 1'b0; + HRESPS = `RSP_OKAY; + end + else + begin + HREADYOUTS = readyout_ip; + HRESPS = resp_ip; + end + end // block: p_ready_comb + +// ----------------------------------------------------------------------------- +// Early Burst Termination +// ----------------------------------------------------------------------------- +// There are times when the output stage will switch to another input port +// without allowing the current burst to complete. In these cases the HTRANS +// and HBURST signals need to be overriden to ensure that the transfers +// reaching the output port meet the AHB specification. + + assign burst_override_next = ( (HTRANSS == `TRN_NONSEQ) | + (HTRANSS == `TRN_IDLE) ) ? 1'b0 + : ( (HTRANSS ==`TRN_SEQ) & + load_reg & + (~active_ip) ) ? 1'b1 + : burst_override; + + // burst_override register + always @ (negedge HRESETn or posedge HCLK) + begin : p_burst_overrideseq + if (~HRESETn) + burst_override <= 1'b0; + else + if (HREADYS) + burst_override <= burst_override_next; + end // block: p_burst_overrideseq + +// ----------------------------------------------------------------------------- +// Boundary Checking Logic +// ----------------------------------------------------------------------------- + // offset_addr + always @ (HADDRS or HSIZES) + begin : p_offset_addr_comb + case (HSIZES) + 3'b000 : offset_addr = HADDRS[3:0]; + 3'b001 : offset_addr = HADDRS[4:1]; + 3'b010 : offset_addr = HADDRS[5:2]; + 3'b011 : offset_addr = HADDRS[6:3]; + + 3'b100, 3'b101, 3'b110, 3'b111 : + offset_addr = HADDRS[3:0]; // Sizes >= 128-bits are not supported + + default : offset_addr = 4'bxxxx; + endcase + end + + // check_addr + always @ (offset_addr or HBURSTS) + begin : p_check_addr_comb + case (HBURSTS) + `BUR_WRAP4 : begin + check_addr[1:0] = offset_addr[1:0]; + check_addr[3:2] = 2'b11; + end + + `BUR_WRAP8 : begin + check_addr[2:0] = offset_addr[2:0]; + check_addr[3] = 1'b1; + end + + `BUR_WRAP16 : + check_addr[3:0] = offset_addr[3:0]; + + `BUR_SINGLE, `BUR_INCR, `BUR_INCR4, `BUR_INCR8, `BUR_INCR16 : + check_addr[3:0] = 4'b0000; + + default : check_addr[3:0] = 4'bxxxx; + endcase + end + + assign bound_next = ( check_addr == 4'b1111 ); + + assign bound_en = ( HTRANSS[1] & HREADYS ); + + // bound register + always @ (negedge HRESETn or posedge HCLK) + begin : p_bound_seq + if (~HRESETn) + bound <= 1'b0; + else + if (bound_en) + bound <= bound_next; + end + + +endmodule + +// --================================= End ===================================-- diff --git a/Cortex-M0/nanosoc/systems/mcu/verilog/gen_ahb_busmatrix/verilog/built/soclabs_4x7_AhbMatrix/soclabs_4x7_MatrixDecode_adp.v b/Cortex-M0/nanosoc/systems/mcu/verilog/gen_ahb_busmatrix/verilog/built/soclabs_4x7_AhbMatrix/soclabs_4x7_MatrixDecode_adp.v new file mode 100644 index 0000000..dad3668 --- /dev/null +++ b/Cortex-M0/nanosoc/systems/mcu/verilog/gen_ahb_busmatrix/verilog/built/soclabs_4x7_AhbMatrix/soclabs_4x7_MatrixDecode_adp.v @@ -0,0 +1,630 @@ +//----------------------------------------------------------------------------- +// The confidential and proprietary information contained in this file may +// only be used by a person authorised under and to the extent permitted +// by a subsisting licensing agreement from Arm Limited or its affiliates. +// +// (C) COPYRIGHT 2001-2023 Arm Limited or its affiliates. +// ALL RIGHTS RESERVED +// +// This entire notice must be reproduced on all copies of this file +// and copies of this file may only be made by a person if such person is +// permitted to do so under the terms of a subsisting license agreement +// from Arm Limited or its affiliates. +// +// SVN Information +// +// Checked In : $Date: 2017-10-10 15:55:38 +0100 (Tue, 10 Oct 2017) $ +// +// Revision : $Revision: 371321 $ +// +// Release Information : Cortex-M System Design Kit-r1p1-00rel0 +// +//----------------------------------------------------------------------------- +// +//----------------------------------------------------------------------------- +// Abstract : The MatrixDecode is used to determine which output +// stage is required for a particular access. Addresses +// that do not map to an Output port are diverted to +// the local default slave. +// +// Notes : The bus matrix has full connectivity. +// +//----------------------------------------------------------------------------- + + +`timescale 1ns/1ps + + +module soclabs_4x7_MatrixDecode_adp ( + + // Common AHB signals + HCLK, + HRESETn, + + // Internal address remapping control + remapping_dec, + + // Signals from the Input stage + HREADYS, + sel_dec, + decode_addr_dec, + trans_dec, + + // Bus-switch output 0 + active_dec0, + readyout_dec0, + resp_dec0, + rdata_dec0, + ruser_dec0, + + // Bus-switch output 1 + active_dec1, + readyout_dec1, + resp_dec1, + rdata_dec1, + ruser_dec1, + + // Bus-switch output 2 + active_dec2, + readyout_dec2, + resp_dec2, + rdata_dec2, + ruser_dec2, + + // Bus-switch output 3 + active_dec3, + readyout_dec3, + resp_dec3, + rdata_dec3, + ruser_dec3, + + // Bus-switch output 4 + active_dec4, + readyout_dec4, + resp_dec4, + rdata_dec4, + ruser_dec4, + + // Bus-switch output 5 + active_dec5, + readyout_dec5, + resp_dec5, + rdata_dec5, + ruser_dec5, + + // Bus-switch output 6 + active_dec6, + readyout_dec6, + resp_dec6, + rdata_dec6, + ruser_dec6, + + // Output port selection signals + sel_dec0, + sel_dec1, + sel_dec2, + sel_dec3, + sel_dec4, + sel_dec5, + sel_dec6, + + // Selected Output port data and control signals + active_dec, + HREADYOUTS, + HRESPS, + HRUSERS, + HRDATAS + + ); + + +// ----------------------------------------------------------------------------- +// Input and Output declarations +// ----------------------------------------------------------------------------- + + // Common AHB signals + input HCLK; // AHB System Clock + input HRESETn; // AHB System Reset + + // Internal address remapping control + input [0:0] remapping_dec; // Internal remap signal + + // Signals from the Input stage + input HREADYS; // Transfer done + input sel_dec; // HSEL input + input [31:10] decode_addr_dec; // HADDR decoder input + input [1:0] trans_dec; // Input port HTRANS signal + + // Bus-switch output MI0 + input active_dec0; // Output stage MI0 active_dec signal + input readyout_dec0; // HREADYOUT input + input [1:0] resp_dec0; // HRESP input + input [31:0] rdata_dec0; // HRDATA input + input [1:0] ruser_dec0; // HRUSER input + + // Bus-switch output MI1 + input active_dec1; // Output stage MI1 active_dec signal + input readyout_dec1; // HREADYOUT input + input [1:0] resp_dec1; // HRESP input + input [31:0] rdata_dec1; // HRDATA input + input [1:0] ruser_dec1; // HRUSER input + + // Bus-switch output MI2 + input active_dec2; // Output stage MI2 active_dec signal + input readyout_dec2; // HREADYOUT input + input [1:0] resp_dec2; // HRESP input + input [31:0] rdata_dec2; // HRDATA input + input [1:0] ruser_dec2; // HRUSER input + + // Bus-switch output MI3 + input active_dec3; // Output stage MI3 active_dec signal + input readyout_dec3; // HREADYOUT input + input [1:0] resp_dec3; // HRESP input + input [31:0] rdata_dec3; // HRDATA input + input [1:0] ruser_dec3; // HRUSER input + + // Bus-switch output MI4 + input active_dec4; // Output stage MI4 active_dec signal + input readyout_dec4; // HREADYOUT input + input [1:0] resp_dec4; // HRESP input + input [31:0] rdata_dec4; // HRDATA input + input [1:0] ruser_dec4; // HRUSER input + + // Bus-switch output MI5 + input active_dec5; // Output stage MI5 active_dec signal + input readyout_dec5; // HREADYOUT input + input [1:0] resp_dec5; // HRESP input + input [31:0] rdata_dec5; // HRDATA input + input [1:0] ruser_dec5; // HRUSER input + + // Bus-switch output MI6 + input active_dec6; // Output stage MI6 active_dec signal + input readyout_dec6; // HREADYOUT input + input [1:0] resp_dec6; // HRESP input + input [31:0] rdata_dec6; // HRDATA input + input [1:0] ruser_dec6; // HRUSER input + + // Output port selection signals + output sel_dec0; // HSEL output + output sel_dec1; // HSEL output + output sel_dec2; // HSEL output + output sel_dec3; // HSEL output + output sel_dec4; // HSEL output + output sel_dec5; // HSEL output + output sel_dec6; // HSEL output + + // Selected Output port data and control signals + output active_dec; // Combinatorial active_dec O/P + output HREADYOUTS; // HREADY feedback output + output [1:0] HRESPS; // Transfer response + output [1:0] HRUSERS; // User read Data + output [31:0] HRDATAS; // Read Data + + +// ----------------------------------------------------------------------------- +// Wire declarations +// ----------------------------------------------------------------------------- + + // Common AHB signals + wire HCLK; // AHB System Clock + wire HRESETn; // AHB System Reset + // Internal address remapping control + wire [0:0] remapping_dec; // Internal remap signal + + // Signals from the Input stage + wire HREADYS; // Transfer done + wire sel_dec; // HSEL input + wire [31:10] decode_addr_dec; // HADDR input + wire [1:0] trans_dec; // Input port HTRANS signal + + // Bus-switch output MI0 + wire active_dec0; // active_dec signal + wire readyout_dec0; // HREADYOUT input + wire [1:0] resp_dec0; // HRESP input + wire [31:0] rdata_dec0; // HRDATA input + wire [1:0] ruser_dec0; // HRUSER input + reg sel_dec0; // HSEL output + + // Bus-switch output MI1 + wire active_dec1; // active_dec signal + wire readyout_dec1; // HREADYOUT input + wire [1:0] resp_dec1; // HRESP input + wire [31:0] rdata_dec1; // HRDATA input + wire [1:0] ruser_dec1; // HRUSER input + reg sel_dec1; // HSEL output + + // Bus-switch output MI2 + wire active_dec2; // active_dec signal + wire readyout_dec2; // HREADYOUT input + wire [1:0] resp_dec2; // HRESP input + wire [31:0] rdata_dec2; // HRDATA input + wire [1:0] ruser_dec2; // HRUSER input + reg sel_dec2; // HSEL output + + // Bus-switch output MI3 + wire active_dec3; // active_dec signal + wire readyout_dec3; // HREADYOUT input + wire [1:0] resp_dec3; // HRESP input + wire [31:0] rdata_dec3; // HRDATA input + wire [1:0] ruser_dec3; // HRUSER input + reg sel_dec3; // HSEL output + + // Bus-switch output MI4 + wire active_dec4; // active_dec signal + wire readyout_dec4; // HREADYOUT input + wire [1:0] resp_dec4; // HRESP input + wire [31:0] rdata_dec4; // HRDATA input + wire [1:0] ruser_dec4; // HRUSER input + reg sel_dec4; // HSEL output + + // Bus-switch output MI5 + wire active_dec5; // active_dec signal + wire readyout_dec5; // HREADYOUT input + wire [1:0] resp_dec5; // HRESP input + wire [31:0] rdata_dec5; // HRDATA input + wire [1:0] ruser_dec5; // HRUSER input + reg sel_dec5; // HSEL output + + // Bus-switch output MI6 + wire active_dec6; // active_dec signal + wire readyout_dec6; // HREADYOUT input + wire [1:0] resp_dec6; // HRESP input + wire [31:0] rdata_dec6; // HRDATA input + wire [1:0] ruser_dec6; // HRUSER input + reg sel_dec6; // HSEL output + + +// ----------------------------------------------------------------------------- +// Signal declarations +// ----------------------------------------------------------------------------- + + // Selected Output port data and control signals + reg active_dec; // Combinatorial active_dec O/P signal + reg HREADYOUTS; // Combinatorial HREADYOUT signal + reg [1:0] HRESPS; // Combinatorial HRESPS signal + reg [1:0] HRUSERS; + reg [31:0] HRDATAS; // Read data bus + + reg [3:0] addr_out_port; // Address output ports + reg [3:0] data_out_port; // Data output ports + + // Default slave signals + reg sel_dft_slv; // HSEL signal + wire readyout_dft_slv; // HREADYOUT signal + wire [1:0] resp_dft_slv; // Combinatorial HRESPS signal + + +// ----------------------------------------------------------------------------- +// Beginning of main code +// ----------------------------------------------------------------------------- + +//------------------------------------------------------------------------------ +// Default slave (accessed when HADDR is unmapped) +//------------------------------------------------------------------------------ + + soclabs_4x7_AhbMatrix_default_slave u_soclabs_4x7_AhbMatrix_default_slave ( + + // Common AHB signals + .HCLK (HCLK), + .HRESETn (HRESETn), + + // AHB Control signals + .HSEL (sel_dft_slv), + .HTRANS (trans_dec), + .HREADY (HREADYS), + .HREADYOUT (readyout_dft_slv), + .HRESP (resp_dft_slv) + + ); + + +//------------------------------------------------------------------------------ +// Address phase signals +//------------------------------------------------------------------------------ + +// The address decode is done in two stages. This is so that the address +// decode occurs in only one process, p_addr_out_portComb, and then the select +// signal is factored in. +// +// Note that the hexadecimal address values are reformatted to align with the +// lower bound of decode_addr_dec[31:10], which is not a hex character boundary + + always @ ( + decode_addr_dec or + remapping_dec or data_out_port or trans_dec + ) + begin : p_addr_out_port_comb + + // Only switch if there is an active transfer + if (trans_dec != 2'b00) + begin + + case (remapping_dec) // Composition: REMAP[0] + 1'b0 : begin + // Unmoved address region 0x00000000-0x0fffffff + if ((decode_addr_dec >= 22'h000000) & (decode_addr_dec <= 22'h03ffff)) + addr_out_port = 4'b0000; // Select Output port MI0 + // Static address region 0x10000000-0x1fffffff + else if ((decode_addr_dec >= 22'h040000) & (decode_addr_dec <= 22'h07ffff)) + addr_out_port = 4'b0000; // Select Output port MI0 + + // Static address region 0x20000000-0x2fffffff + else if ((decode_addr_dec >= 22'h080000) & (decode_addr_dec <= 22'h0bffff)) + addr_out_port = 4'b0001; // Select Output port MI1 + + // Static address region 0x30000000-0x3fffffff + else if ((decode_addr_dec >= 22'h0c0000) & (decode_addr_dec <= 22'h0fffff)) + addr_out_port = 4'b0010; // Select Output port MI2 + + // Static address region 0x40000000-0x5fffffff + else if ((decode_addr_dec >= 22'h100000) & (decode_addr_dec <= 22'h17ffff)) + addr_out_port = 4'b0011; // Select Output port MI3 + // Static address region 0xf0000000-0xf003ffff + else if ((decode_addr_dec >= 22'h3c0000) & (decode_addr_dec <= 22'h3c00ff)) + addr_out_port = 4'b0011; // Select Output port MI3 + + // Static address region 0x80000000-0x8fffffff + else if ((decode_addr_dec >= 22'h200000) & (decode_addr_dec <= 22'h23ffff)) + addr_out_port = 4'b0100; // Select Output port MI4 + + // Static address region 0x90000000-0x9fffffff + else if ((decode_addr_dec >= 22'h240000) & (decode_addr_dec <= 22'h27ffff)) + addr_out_port = 4'b0101; // Select Output port MI5 + + // Static address region 0x60000000-0x7fffffff + else if ((decode_addr_dec >= 22'h180000) & (decode_addr_dec <= 22'h1fffff)) + addr_out_port = 4'b0110; // Select Output port MI6 + // Static address region 0xa0000000-0xdfffffff + else if ((decode_addr_dec >= 22'h280000) & (decode_addr_dec <= 22'h37ffff)) + addr_out_port = 4'b0110; // Select Output port MI6 + + else + addr_out_port = 4'b1000; // Select the default slave + end + + 1'b1 : begin + // Remapped address region 0x00000000-0x0fffffff due to REMAP[0] + if ((decode_addr_dec >= 22'h000000) & (decode_addr_dec <= 22'h03ffff)) + addr_out_port = 4'b0001; // Select Output port MI1 + + // Unmoved address region 0x00000000-0x0fffffff + else if ((decode_addr_dec >= 22'h000000) & (decode_addr_dec <= 22'h03ffff)) + addr_out_port = 4'b0000; // Select Output port MI0 + // Static address region 0x10000000-0x1fffffff + else if ((decode_addr_dec >= 22'h040000) & (decode_addr_dec <= 22'h07ffff)) + addr_out_port = 4'b0000; // Select Output port MI0 + + // Static address region 0x20000000-0x2fffffff + else if ((decode_addr_dec >= 22'h080000) & (decode_addr_dec <= 22'h0bffff)) + addr_out_port = 4'b0001; // Select Output port MI1 + + // Static address region 0x30000000-0x3fffffff + else if ((decode_addr_dec >= 22'h0c0000) & (decode_addr_dec <= 22'h0fffff)) + addr_out_port = 4'b0010; // Select Output port MI2 + + // Static address region 0x40000000-0x5fffffff + else if ((decode_addr_dec >= 22'h100000) & (decode_addr_dec <= 22'h17ffff)) + addr_out_port = 4'b0011; // Select Output port MI3 + // Static address region 0xf0000000-0xf003ffff + else if ((decode_addr_dec >= 22'h3c0000) & (decode_addr_dec <= 22'h3c00ff)) + addr_out_port = 4'b0011; // Select Output port MI3 + + // Static address region 0x80000000-0x8fffffff + else if ((decode_addr_dec >= 22'h200000) & (decode_addr_dec <= 22'h23ffff)) + addr_out_port = 4'b0100; // Select Output port MI4 + + // Static address region 0x90000000-0x9fffffff + else if ((decode_addr_dec >= 22'h240000) & (decode_addr_dec <= 22'h27ffff)) + addr_out_port = 4'b0101; // Select Output port MI5 + + // Static address region 0x60000000-0x7fffffff + else if ((decode_addr_dec >= 22'h180000) & (decode_addr_dec <= 22'h1fffff)) + addr_out_port = 4'b0110; // Select Output port MI6 + // Static address region 0xa0000000-0xdfffffff + else if ((decode_addr_dec >= 22'h280000) & (decode_addr_dec <= 22'h37ffff)) + addr_out_port = 4'b0110; // Select Output port MI6 + + else + addr_out_port = 4'b1000; // Select the default slave + end + + default : addr_out_port = {4{1'bx}}; + endcase + + end // if (trans_dec != 2'b00) + else + addr_out_port = data_out_port; // Stay on last port if no activity + + end // block: p_addr_out_port_comb + + // Select signal decode + always @ (sel_dec or addr_out_port) + begin : p_sel_comb + sel_dec0 = 1'b0; + sel_dec1 = 1'b0; + sel_dec2 = 1'b0; + sel_dec3 = 1'b0; + sel_dec4 = 1'b0; + sel_dec5 = 1'b0; + sel_dec6 = 1'b0; + sel_dft_slv = 1'b0; + + if (sel_dec) + case (addr_out_port) + 4'b0000 : sel_dec0 = 1'b1; + 4'b0001 : sel_dec1 = 1'b1; + 4'b0010 : sel_dec2 = 1'b1; + 4'b0011 : sel_dec3 = 1'b1; + 4'b0100 : sel_dec4 = 1'b1; + 4'b0101 : sel_dec5 = 1'b1; + 4'b0110 : sel_dec6 = 1'b1; + 4'b1000 : sel_dft_slv = 1'b1; // Select the default slave + default : begin + sel_dec0 = 1'bx; + sel_dec1 = 1'bx; + sel_dec2 = 1'bx; + sel_dec3 = 1'bx; + sel_dec4 = 1'bx; + sel_dec5 = 1'bx; + sel_dec6 = 1'bx; + sel_dft_slv = 1'bx; + end + endcase // case(addr_out_port) + end // block: p_sel_comb + +// The decoder selects the appropriate active_dec signal depending on which +// output stage is required for the transfer. + always @ ( + active_dec0 or + active_dec1 or + active_dec2 or + active_dec3 or + active_dec4 or + active_dec5 or + active_dec6 or + addr_out_port + ) + begin : p_active_comb + case (addr_out_port) + 4'b0000 : active_dec = active_dec0; + 4'b0001 : active_dec = active_dec1; + 4'b0010 : active_dec = active_dec2; + 4'b0011 : active_dec = active_dec3; + 4'b0100 : active_dec = active_dec4; + 4'b0101 : active_dec = active_dec5; + 4'b0110 : active_dec = active_dec6; + 4'b1000 : active_dec = 1'b1; // Select the default slave + default : active_dec = 1'bx; + endcase // case(addr_out_port) + end // block: p_active_comb + + +//------------------------------------------------------------------------------ +// Data phase signals +//------------------------------------------------------------------------------ + +// The data_out_port needs to be updated when HREADY from the input stage is high. +// Note: HREADY must be used, not HREADYOUT, because there are occaisions +// (namely when the holding register gets loaded) when HREADYOUT may be low +// but HREADY is high, and in this case it is important that the data_out_port +// gets updated. +// When the port is inactive, the default slave is selected to prevent toggling. + + always @ (negedge HRESETn or posedge HCLK) + begin : p_data_out_port_seq + if (~HRESETn) + data_out_port <= 4'b1000; + else + if (HREADYS) + if (sel_dec & trans_dec[1]) + data_out_port <= addr_out_port; + else + data_out_port <= 4'b1000; + end // block: p_data_out_port_seq + + // HREADYOUTS output decode + always @ ( + readyout_dft_slv or + readyout_dec0 or + readyout_dec1 or + readyout_dec2 or + readyout_dec3 or + readyout_dec4 or + readyout_dec5 or + readyout_dec6 or + data_out_port + ) + begin : p_ready_comb + case (data_out_port) + 4'b0000 : HREADYOUTS = readyout_dec0; + 4'b0001 : HREADYOUTS = readyout_dec1; + 4'b0010 : HREADYOUTS = readyout_dec2; + 4'b0011 : HREADYOUTS = readyout_dec3; + 4'b0100 : HREADYOUTS = readyout_dec4; + 4'b0101 : HREADYOUTS = readyout_dec5; + 4'b0110 : HREADYOUTS = readyout_dec6; + 4'b1000 : HREADYOUTS = readyout_dft_slv; // Select the default slave + default : HREADYOUTS = 1'bx; + endcase // case(data_out_port) + end // block: p_ready_comb + + // HRESPS output decode + always @ ( + resp_dft_slv or + resp_dec0 or + resp_dec1 or + resp_dec2 or + resp_dec3 or + resp_dec4 or + resp_dec5 or + resp_dec6 or + data_out_port + ) + begin : p_resp_comb + case (data_out_port) + 4'b0000 : HRESPS = resp_dec0; + 4'b0001 : HRESPS = resp_dec1; + 4'b0010 : HRESPS = resp_dec2; + 4'b0011 : HRESPS = resp_dec3; + 4'b0100 : HRESPS = resp_dec4; + 4'b0101 : HRESPS = resp_dec5; + 4'b0110 : HRESPS = resp_dec6; + 4'b1000 : HRESPS = resp_dft_slv; // Select the default slave + default : HRESPS = {2{1'bx}}; + endcase // case (data_out_port) + end // block: p_resp_comb + + // HRDATAS output decode + always @ ( + rdata_dec0 or + rdata_dec1 or + rdata_dec2 or + rdata_dec3 or + rdata_dec4 or + rdata_dec5 or + rdata_dec6 or + data_out_port + ) + begin : p_rdata_comb + case (data_out_port) + 4'b0000 : HRDATAS = rdata_dec0; + 4'b0001 : HRDATAS = rdata_dec1; + 4'b0010 : HRDATAS = rdata_dec2; + 4'b0011 : HRDATAS = rdata_dec3; + 4'b0100 : HRDATAS = rdata_dec4; + 4'b0101 : HRDATAS = rdata_dec5; + 4'b0110 : HRDATAS = rdata_dec6; + 4'b1000 : HRDATAS = {32{1'b0}}; // Select the default slave + default : HRDATAS = {32{1'bx}}; + endcase // case (data_out_port) + end // block: p_rdata_comb + + // HRUSERS output decode + always @ ( + ruser_dec0 or + ruser_dec1 or + ruser_dec2 or + ruser_dec3 or + ruser_dec4 or + ruser_dec5 or + ruser_dec6 or + data_out_port + ) + begin : p_ruser_comb + case (data_out_port) + 4'b0000 : HRUSERS = ruser_dec0; + 4'b0001 : HRUSERS = ruser_dec1; + 4'b0010 : HRUSERS = ruser_dec2; + 4'b0011 : HRUSERS = ruser_dec3; + 4'b0100 : HRUSERS = ruser_dec4; + 4'b0101 : HRUSERS = ruser_dec5; + 4'b0110 : HRUSERS = ruser_dec6; + 4'b1000 : HRUSERS = {2{1'b0}}; // Select the default slave + default : HRUSERS = {2{1'bx}}; + endcase // case (data_out_port) + end // block: p_ruser_comb + + +endmodule + +// --================================= End ===================================-- diff --git a/Cortex-M0/nanosoc/systems/mcu/verilog/gen_ahb_busmatrix/verilog/built/soclabs_4x7_AhbMatrix/soclabs_4x7_MatrixDecode_cpu.v b/Cortex-M0/nanosoc/systems/mcu/verilog/gen_ahb_busmatrix/verilog/built/soclabs_4x7_AhbMatrix/soclabs_4x7_MatrixDecode_cpu.v new file mode 100644 index 0000000..9e2b72d --- /dev/null +++ b/Cortex-M0/nanosoc/systems/mcu/verilog/gen_ahb_busmatrix/verilog/built/soclabs_4x7_AhbMatrix/soclabs_4x7_MatrixDecode_cpu.v @@ -0,0 +1,630 @@ +//----------------------------------------------------------------------------- +// The confidential and proprietary information contained in this file may +// only be used by a person authorised under and to the extent permitted +// by a subsisting licensing agreement from Arm Limited or its affiliates. +// +// (C) COPYRIGHT 2001-2023 Arm Limited or its affiliates. +// ALL RIGHTS RESERVED +// +// This entire notice must be reproduced on all copies of this file +// and copies of this file may only be made by a person if such person is +// permitted to do so under the terms of a subsisting license agreement +// from Arm Limited or its affiliates. +// +// SVN Information +// +// Checked In : $Date: 2017-10-10 15:55:38 +0100 (Tue, 10 Oct 2017) $ +// +// Revision : $Revision: 371321 $ +// +// Release Information : Cortex-M System Design Kit-r1p1-00rel0 +// +//----------------------------------------------------------------------------- +// +//----------------------------------------------------------------------------- +// Abstract : The MatrixDecode is used to determine which output +// stage is required for a particular access. Addresses +// that do not map to an Output port are diverted to +// the local default slave. +// +// Notes : The bus matrix has full connectivity. +// +//----------------------------------------------------------------------------- + + +`timescale 1ns/1ps + + +module soclabs_4x7_MatrixDecode_cpu ( + + // Common AHB signals + HCLK, + HRESETn, + + // Internal address remapping control + remapping_dec, + + // Signals from the Input stage + HREADYS, + sel_dec, + decode_addr_dec, + trans_dec, + + // Bus-switch output 0 + active_dec0, + readyout_dec0, + resp_dec0, + rdata_dec0, + ruser_dec0, + + // Bus-switch output 1 + active_dec1, + readyout_dec1, + resp_dec1, + rdata_dec1, + ruser_dec1, + + // Bus-switch output 2 + active_dec2, + readyout_dec2, + resp_dec2, + rdata_dec2, + ruser_dec2, + + // Bus-switch output 3 + active_dec3, + readyout_dec3, + resp_dec3, + rdata_dec3, + ruser_dec3, + + // Bus-switch output 4 + active_dec4, + readyout_dec4, + resp_dec4, + rdata_dec4, + ruser_dec4, + + // Bus-switch output 5 + active_dec5, + readyout_dec5, + resp_dec5, + rdata_dec5, + ruser_dec5, + + // Bus-switch output 6 + active_dec6, + readyout_dec6, + resp_dec6, + rdata_dec6, + ruser_dec6, + + // Output port selection signals + sel_dec0, + sel_dec1, + sel_dec2, + sel_dec3, + sel_dec4, + sel_dec5, + sel_dec6, + + // Selected Output port data and control signals + active_dec, + HREADYOUTS, + HRESPS, + HRUSERS, + HRDATAS + + ); + + +// ----------------------------------------------------------------------------- +// Input and Output declarations +// ----------------------------------------------------------------------------- + + // Common AHB signals + input HCLK; // AHB System Clock + input HRESETn; // AHB System Reset + + // Internal address remapping control + input [0:0] remapping_dec; // Internal remap signal + + // Signals from the Input stage + input HREADYS; // Transfer done + input sel_dec; // HSEL input + input [31:10] decode_addr_dec; // HADDR decoder input + input [1:0] trans_dec; // Input port HTRANS signal + + // Bus-switch output MI0 + input active_dec0; // Output stage MI0 active_dec signal + input readyout_dec0; // HREADYOUT input + input [1:0] resp_dec0; // HRESP input + input [31:0] rdata_dec0; // HRDATA input + input [1:0] ruser_dec0; // HRUSER input + + // Bus-switch output MI1 + input active_dec1; // Output stage MI1 active_dec signal + input readyout_dec1; // HREADYOUT input + input [1:0] resp_dec1; // HRESP input + input [31:0] rdata_dec1; // HRDATA input + input [1:0] ruser_dec1; // HRUSER input + + // Bus-switch output MI2 + input active_dec2; // Output stage MI2 active_dec signal + input readyout_dec2; // HREADYOUT input + input [1:0] resp_dec2; // HRESP input + input [31:0] rdata_dec2; // HRDATA input + input [1:0] ruser_dec2; // HRUSER input + + // Bus-switch output MI3 + input active_dec3; // Output stage MI3 active_dec signal + input readyout_dec3; // HREADYOUT input + input [1:0] resp_dec3; // HRESP input + input [31:0] rdata_dec3; // HRDATA input + input [1:0] ruser_dec3; // HRUSER input + + // Bus-switch output MI4 + input active_dec4; // Output stage MI4 active_dec signal + input readyout_dec4; // HREADYOUT input + input [1:0] resp_dec4; // HRESP input + input [31:0] rdata_dec4; // HRDATA input + input [1:0] ruser_dec4; // HRUSER input + + // Bus-switch output MI5 + input active_dec5; // Output stage MI5 active_dec signal + input readyout_dec5; // HREADYOUT input + input [1:0] resp_dec5; // HRESP input + input [31:0] rdata_dec5; // HRDATA input + input [1:0] ruser_dec5; // HRUSER input + + // Bus-switch output MI6 + input active_dec6; // Output stage MI6 active_dec signal + input readyout_dec6; // HREADYOUT input + input [1:0] resp_dec6; // HRESP input + input [31:0] rdata_dec6; // HRDATA input + input [1:0] ruser_dec6; // HRUSER input + + // Output port selection signals + output sel_dec0; // HSEL output + output sel_dec1; // HSEL output + output sel_dec2; // HSEL output + output sel_dec3; // HSEL output + output sel_dec4; // HSEL output + output sel_dec5; // HSEL output + output sel_dec6; // HSEL output + + // Selected Output port data and control signals + output active_dec; // Combinatorial active_dec O/P + output HREADYOUTS; // HREADY feedback output + output [1:0] HRESPS; // Transfer response + output [1:0] HRUSERS; // User read Data + output [31:0] HRDATAS; // Read Data + + +// ----------------------------------------------------------------------------- +// Wire declarations +// ----------------------------------------------------------------------------- + + // Common AHB signals + wire HCLK; // AHB System Clock + wire HRESETn; // AHB System Reset + // Internal address remapping control + wire [0:0] remapping_dec; // Internal remap signal + + // Signals from the Input stage + wire HREADYS; // Transfer done + wire sel_dec; // HSEL input + wire [31:10] decode_addr_dec; // HADDR input + wire [1:0] trans_dec; // Input port HTRANS signal + + // Bus-switch output MI0 + wire active_dec0; // active_dec signal + wire readyout_dec0; // HREADYOUT input + wire [1:0] resp_dec0; // HRESP input + wire [31:0] rdata_dec0; // HRDATA input + wire [1:0] ruser_dec0; // HRUSER input + reg sel_dec0; // HSEL output + + // Bus-switch output MI1 + wire active_dec1; // active_dec signal + wire readyout_dec1; // HREADYOUT input + wire [1:0] resp_dec1; // HRESP input + wire [31:0] rdata_dec1; // HRDATA input + wire [1:0] ruser_dec1; // HRUSER input + reg sel_dec1; // HSEL output + + // Bus-switch output MI2 + wire active_dec2; // active_dec signal + wire readyout_dec2; // HREADYOUT input + wire [1:0] resp_dec2; // HRESP input + wire [31:0] rdata_dec2; // HRDATA input + wire [1:0] ruser_dec2; // HRUSER input + reg sel_dec2; // HSEL output + + // Bus-switch output MI3 + wire active_dec3; // active_dec signal + wire readyout_dec3; // HREADYOUT input + wire [1:0] resp_dec3; // HRESP input + wire [31:0] rdata_dec3; // HRDATA input + wire [1:0] ruser_dec3; // HRUSER input + reg sel_dec3; // HSEL output + + // Bus-switch output MI4 + wire active_dec4; // active_dec signal + wire readyout_dec4; // HREADYOUT input + wire [1:0] resp_dec4; // HRESP input + wire [31:0] rdata_dec4; // HRDATA input + wire [1:0] ruser_dec4; // HRUSER input + reg sel_dec4; // HSEL output + + // Bus-switch output MI5 + wire active_dec5; // active_dec signal + wire readyout_dec5; // HREADYOUT input + wire [1:0] resp_dec5; // HRESP input + wire [31:0] rdata_dec5; // HRDATA input + wire [1:0] ruser_dec5; // HRUSER input + reg sel_dec5; // HSEL output + + // Bus-switch output MI6 + wire active_dec6; // active_dec signal + wire readyout_dec6; // HREADYOUT input + wire [1:0] resp_dec6; // HRESP input + wire [31:0] rdata_dec6; // HRDATA input + wire [1:0] ruser_dec6; // HRUSER input + reg sel_dec6; // HSEL output + + +// ----------------------------------------------------------------------------- +// Signal declarations +// ----------------------------------------------------------------------------- + + // Selected Output port data and control signals + reg active_dec; // Combinatorial active_dec O/P signal + reg HREADYOUTS; // Combinatorial HREADYOUT signal + reg [1:0] HRESPS; // Combinatorial HRESPS signal + reg [1:0] HRUSERS; + reg [31:0] HRDATAS; // Read data bus + + reg [3:0] addr_out_port; // Address output ports + reg [3:0] data_out_port; // Data output ports + + // Default slave signals + reg sel_dft_slv; // HSEL signal + wire readyout_dft_slv; // HREADYOUT signal + wire [1:0] resp_dft_slv; // Combinatorial HRESPS signal + + +// ----------------------------------------------------------------------------- +// Beginning of main code +// ----------------------------------------------------------------------------- + +//------------------------------------------------------------------------------ +// Default slave (accessed when HADDR is unmapped) +//------------------------------------------------------------------------------ + + soclabs_4x7_AhbMatrix_default_slave u_soclabs_4x7_AhbMatrix_default_slave ( + + // Common AHB signals + .HCLK (HCLK), + .HRESETn (HRESETn), + + // AHB Control signals + .HSEL (sel_dft_slv), + .HTRANS (trans_dec), + .HREADY (HREADYS), + .HREADYOUT (readyout_dft_slv), + .HRESP (resp_dft_slv) + + ); + + +//------------------------------------------------------------------------------ +// Address phase signals +//------------------------------------------------------------------------------ + +// The address decode is done in two stages. This is so that the address +// decode occurs in only one process, p_addr_out_portComb, and then the select +// signal is factored in. +// +// Note that the hexadecimal address values are reformatted to align with the +// lower bound of decode_addr_dec[31:10], which is not a hex character boundary + + always @ ( + decode_addr_dec or + remapping_dec or data_out_port or trans_dec + ) + begin : p_addr_out_port_comb + + // Only switch if there is an active transfer + if (trans_dec != 2'b00) + begin + + case (remapping_dec) // Composition: REMAP[0] + 1'b0 : begin + // Unmoved address region 0x00000000-0x0fffffff + if ((decode_addr_dec >= 22'h000000) & (decode_addr_dec <= 22'h03ffff)) + addr_out_port = 4'b0000; // Select Output port MI0 + // Static address region 0x10000000-0x1fffffff + else if ((decode_addr_dec >= 22'h040000) & (decode_addr_dec <= 22'h07ffff)) + addr_out_port = 4'b0000; // Select Output port MI0 + + // Static address region 0x20000000-0x2fffffff + else if ((decode_addr_dec >= 22'h080000) & (decode_addr_dec <= 22'h0bffff)) + addr_out_port = 4'b0001; // Select Output port MI1 + + // Static address region 0x30000000-0x3fffffff + else if ((decode_addr_dec >= 22'h0c0000) & (decode_addr_dec <= 22'h0fffff)) + addr_out_port = 4'b0010; // Select Output port MI2 + + // Static address region 0x40000000-0x5fffffff + else if ((decode_addr_dec >= 22'h100000) & (decode_addr_dec <= 22'h17ffff)) + addr_out_port = 4'b0011; // Select Output port MI3 + // Static address region 0xf0000000-0xf003ffff + else if ((decode_addr_dec >= 22'h3c0000) & (decode_addr_dec <= 22'h3c00ff)) + addr_out_port = 4'b0011; // Select Output port MI3 + + // Static address region 0x80000000-0x8fffffff + else if ((decode_addr_dec >= 22'h200000) & (decode_addr_dec <= 22'h23ffff)) + addr_out_port = 4'b0100; // Select Output port MI4 + + // Static address region 0x90000000-0x9fffffff + else if ((decode_addr_dec >= 22'h240000) & (decode_addr_dec <= 22'h27ffff)) + addr_out_port = 4'b0101; // Select Output port MI5 + + // Static address region 0x60000000-0x7fffffff + else if ((decode_addr_dec >= 22'h180000) & (decode_addr_dec <= 22'h1fffff)) + addr_out_port = 4'b0110; // Select Output port MI6 + // Static address region 0xa0000000-0xdfffffff + else if ((decode_addr_dec >= 22'h280000) & (decode_addr_dec <= 22'h37ffff)) + addr_out_port = 4'b0110; // Select Output port MI6 + + else + addr_out_port = 4'b1000; // Select the default slave + end + + 1'b1 : begin + // Remapped address region 0x00000000-0x0fffffff due to REMAP[0] + if ((decode_addr_dec >= 22'h000000) & (decode_addr_dec <= 22'h03ffff)) + addr_out_port = 4'b0001; // Select Output port MI1 + + // Unmoved address region 0x00000000-0x0fffffff + else if ((decode_addr_dec >= 22'h000000) & (decode_addr_dec <= 22'h03ffff)) + addr_out_port = 4'b0000; // Select Output port MI0 + // Static address region 0x10000000-0x1fffffff + else if ((decode_addr_dec >= 22'h040000) & (decode_addr_dec <= 22'h07ffff)) + addr_out_port = 4'b0000; // Select Output port MI0 + + // Static address region 0x20000000-0x2fffffff + else if ((decode_addr_dec >= 22'h080000) & (decode_addr_dec <= 22'h0bffff)) + addr_out_port = 4'b0001; // Select Output port MI1 + + // Static address region 0x30000000-0x3fffffff + else if ((decode_addr_dec >= 22'h0c0000) & (decode_addr_dec <= 22'h0fffff)) + addr_out_port = 4'b0010; // Select Output port MI2 + + // Static address region 0x40000000-0x5fffffff + else if ((decode_addr_dec >= 22'h100000) & (decode_addr_dec <= 22'h17ffff)) + addr_out_port = 4'b0011; // Select Output port MI3 + // Static address region 0xf0000000-0xf003ffff + else if ((decode_addr_dec >= 22'h3c0000) & (decode_addr_dec <= 22'h3c00ff)) + addr_out_port = 4'b0011; // Select Output port MI3 + + // Static address region 0x80000000-0x8fffffff + else if ((decode_addr_dec >= 22'h200000) & (decode_addr_dec <= 22'h23ffff)) + addr_out_port = 4'b0100; // Select Output port MI4 + + // Static address region 0x90000000-0x9fffffff + else if ((decode_addr_dec >= 22'h240000) & (decode_addr_dec <= 22'h27ffff)) + addr_out_port = 4'b0101; // Select Output port MI5 + + // Static address region 0x60000000-0x7fffffff + else if ((decode_addr_dec >= 22'h180000) & (decode_addr_dec <= 22'h1fffff)) + addr_out_port = 4'b0110; // Select Output port MI6 + // Static address region 0xa0000000-0xdfffffff + else if ((decode_addr_dec >= 22'h280000) & (decode_addr_dec <= 22'h37ffff)) + addr_out_port = 4'b0110; // Select Output port MI6 + + else + addr_out_port = 4'b1000; // Select the default slave + end + + default : addr_out_port = {4{1'bx}}; + endcase + + end // if (trans_dec != 2'b00) + else + addr_out_port = data_out_port; // Stay on last port if no activity + + end // block: p_addr_out_port_comb + + // Select signal decode + always @ (sel_dec or addr_out_port) + begin : p_sel_comb + sel_dec0 = 1'b0; + sel_dec1 = 1'b0; + sel_dec2 = 1'b0; + sel_dec3 = 1'b0; + sel_dec4 = 1'b0; + sel_dec5 = 1'b0; + sel_dec6 = 1'b0; + sel_dft_slv = 1'b0; + + if (sel_dec) + case (addr_out_port) + 4'b0000 : sel_dec0 = 1'b1; + 4'b0001 : sel_dec1 = 1'b1; + 4'b0010 : sel_dec2 = 1'b1; + 4'b0011 : sel_dec3 = 1'b1; + 4'b0100 : sel_dec4 = 1'b1; + 4'b0101 : sel_dec5 = 1'b1; + 4'b0110 : sel_dec6 = 1'b1; + 4'b1000 : sel_dft_slv = 1'b1; // Select the default slave + default : begin + sel_dec0 = 1'bx; + sel_dec1 = 1'bx; + sel_dec2 = 1'bx; + sel_dec3 = 1'bx; + sel_dec4 = 1'bx; + sel_dec5 = 1'bx; + sel_dec6 = 1'bx; + sel_dft_slv = 1'bx; + end + endcase // case(addr_out_port) + end // block: p_sel_comb + +// The decoder selects the appropriate active_dec signal depending on which +// output stage is required for the transfer. + always @ ( + active_dec0 or + active_dec1 or + active_dec2 or + active_dec3 or + active_dec4 or + active_dec5 or + active_dec6 or + addr_out_port + ) + begin : p_active_comb + case (addr_out_port) + 4'b0000 : active_dec = active_dec0; + 4'b0001 : active_dec = active_dec1; + 4'b0010 : active_dec = active_dec2; + 4'b0011 : active_dec = active_dec3; + 4'b0100 : active_dec = active_dec4; + 4'b0101 : active_dec = active_dec5; + 4'b0110 : active_dec = active_dec6; + 4'b1000 : active_dec = 1'b1; // Select the default slave + default : active_dec = 1'bx; + endcase // case(addr_out_port) + end // block: p_active_comb + + +//------------------------------------------------------------------------------ +// Data phase signals +//------------------------------------------------------------------------------ + +// The data_out_port needs to be updated when HREADY from the input stage is high. +// Note: HREADY must be used, not HREADYOUT, because there are occaisions +// (namely when the holding register gets loaded) when HREADYOUT may be low +// but HREADY is high, and in this case it is important that the data_out_port +// gets updated. +// When the port is inactive, the default slave is selected to prevent toggling. + + always @ (negedge HRESETn or posedge HCLK) + begin : p_data_out_port_seq + if (~HRESETn) + data_out_port <= 4'b1000; + else + if (HREADYS) + if (sel_dec & trans_dec[1]) + data_out_port <= addr_out_port; + else + data_out_port <= 4'b1000; + end // block: p_data_out_port_seq + + // HREADYOUTS output decode + always @ ( + readyout_dft_slv or + readyout_dec0 or + readyout_dec1 or + readyout_dec2 or + readyout_dec3 or + readyout_dec4 or + readyout_dec5 or + readyout_dec6 or + data_out_port + ) + begin : p_ready_comb + case (data_out_port) + 4'b0000 : HREADYOUTS = readyout_dec0; + 4'b0001 : HREADYOUTS = readyout_dec1; + 4'b0010 : HREADYOUTS = readyout_dec2; + 4'b0011 : HREADYOUTS = readyout_dec3; + 4'b0100 : HREADYOUTS = readyout_dec4; + 4'b0101 : HREADYOUTS = readyout_dec5; + 4'b0110 : HREADYOUTS = readyout_dec6; + 4'b1000 : HREADYOUTS = readyout_dft_slv; // Select the default slave + default : HREADYOUTS = 1'bx; + endcase // case(data_out_port) + end // block: p_ready_comb + + // HRESPS output decode + always @ ( + resp_dft_slv or + resp_dec0 or + resp_dec1 or + resp_dec2 or + resp_dec3 or + resp_dec4 or + resp_dec5 or + resp_dec6 or + data_out_port + ) + begin : p_resp_comb + case (data_out_port) + 4'b0000 : HRESPS = resp_dec0; + 4'b0001 : HRESPS = resp_dec1; + 4'b0010 : HRESPS = resp_dec2; + 4'b0011 : HRESPS = resp_dec3; + 4'b0100 : HRESPS = resp_dec4; + 4'b0101 : HRESPS = resp_dec5; + 4'b0110 : HRESPS = resp_dec6; + 4'b1000 : HRESPS = resp_dft_slv; // Select the default slave + default : HRESPS = {2{1'bx}}; + endcase // case (data_out_port) + end // block: p_resp_comb + + // HRDATAS output decode + always @ ( + rdata_dec0 or + rdata_dec1 or + rdata_dec2 or + rdata_dec3 or + rdata_dec4 or + rdata_dec5 or + rdata_dec6 or + data_out_port + ) + begin : p_rdata_comb + case (data_out_port) + 4'b0000 : HRDATAS = rdata_dec0; + 4'b0001 : HRDATAS = rdata_dec1; + 4'b0010 : HRDATAS = rdata_dec2; + 4'b0011 : HRDATAS = rdata_dec3; + 4'b0100 : HRDATAS = rdata_dec4; + 4'b0101 : HRDATAS = rdata_dec5; + 4'b0110 : HRDATAS = rdata_dec6; + 4'b1000 : HRDATAS = {32{1'b0}}; // Select the default slave + default : HRDATAS = {32{1'bx}}; + endcase // case (data_out_port) + end // block: p_rdata_comb + + // HRUSERS output decode + always @ ( + ruser_dec0 or + ruser_dec1 or + ruser_dec2 or + ruser_dec3 or + ruser_dec4 or + ruser_dec5 or + ruser_dec6 or + data_out_port + ) + begin : p_ruser_comb + case (data_out_port) + 4'b0000 : HRUSERS = ruser_dec0; + 4'b0001 : HRUSERS = ruser_dec1; + 4'b0010 : HRUSERS = ruser_dec2; + 4'b0011 : HRUSERS = ruser_dec3; + 4'b0100 : HRUSERS = ruser_dec4; + 4'b0101 : HRUSERS = ruser_dec5; + 4'b0110 : HRUSERS = ruser_dec6; + 4'b1000 : HRUSERS = {2{1'b0}}; // Select the default slave + default : HRUSERS = {2{1'bx}}; + endcase // case (data_out_port) + end // block: p_ruser_comb + + +endmodule + +// --================================= End ===================================-- diff --git a/Cortex-M0/nanosoc/systems/mcu/verilog/gen_ahb_busmatrix/verilog/built/soclabs_4x7_AhbMatrix/soclabs_4x7_MatrixDecode_dma.v b/Cortex-M0/nanosoc/systems/mcu/verilog/gen_ahb_busmatrix/verilog/built/soclabs_4x7_AhbMatrix/soclabs_4x7_MatrixDecode_dma.v new file mode 100644 index 0000000..30b9ada --- /dev/null +++ b/Cortex-M0/nanosoc/systems/mcu/verilog/gen_ahb_busmatrix/verilog/built/soclabs_4x7_AhbMatrix/soclabs_4x7_MatrixDecode_dma.v @@ -0,0 +1,566 @@ +//----------------------------------------------------------------------------- +// The confidential and proprietary information contained in this file may +// only be used by a person authorised under and to the extent permitted +// by a subsisting licensing agreement from Arm Limited or its affiliates. +// +// (C) COPYRIGHT 2001-2023 Arm Limited or its affiliates. +// ALL RIGHTS RESERVED +// +// This entire notice must be reproduced on all copies of this file +// and copies of this file may only be made by a person if such person is +// permitted to do so under the terms of a subsisting license agreement +// from Arm Limited or its affiliates. +// +// SVN Information +// +// Checked In : $Date: 2017-10-10 15:55:38 +0100 (Tue, 10 Oct 2017) $ +// +// Revision : $Revision: 371321 $ +// +// Release Information : Cortex-M System Design Kit-r1p1-00rel0 +// +//----------------------------------------------------------------------------- +// +//----------------------------------------------------------------------------- +// Abstract : The MatrixDecode is used to determine which output +// stage is required for a particular access. Addresses +// that do not map to an Output port are diverted to +// the local default slave. +// +// Notes : The bus matrix has full connectivity. +// +//----------------------------------------------------------------------------- + + +`timescale 1ns/1ps + + +module soclabs_4x7_MatrixDecode_dma ( + + // Common AHB signals + HCLK, + HRESETn, + + // Signals from the Input stage + HREADYS, + sel_dec, + decode_addr_dec, + trans_dec, + + // Bus-switch output 0 + active_dec0, + readyout_dec0, + resp_dec0, + rdata_dec0, + ruser_dec0, + + // Bus-switch output 1 + active_dec1, + readyout_dec1, + resp_dec1, + rdata_dec1, + ruser_dec1, + + // Bus-switch output 2 + active_dec2, + readyout_dec2, + resp_dec2, + rdata_dec2, + ruser_dec2, + + // Bus-switch output 3 + active_dec3, + readyout_dec3, + resp_dec3, + rdata_dec3, + ruser_dec3, + + // Bus-switch output 4 + active_dec4, + readyout_dec4, + resp_dec4, + rdata_dec4, + ruser_dec4, + + // Bus-switch output 5 + active_dec5, + readyout_dec5, + resp_dec5, + rdata_dec5, + ruser_dec5, + + // Bus-switch output 6 + active_dec6, + readyout_dec6, + resp_dec6, + rdata_dec6, + ruser_dec6, + + // Output port selection signals + sel_dec0, + sel_dec1, + sel_dec2, + sel_dec3, + sel_dec4, + sel_dec5, + sel_dec6, + + // Selected Output port data and control signals + active_dec, + HREADYOUTS, + HRESPS, + HRUSERS, + HRDATAS + + ); + + +// ----------------------------------------------------------------------------- +// Input and Output declarations +// ----------------------------------------------------------------------------- + + // Common AHB signals + input HCLK; // AHB System Clock + input HRESETn; // AHB System Reset + + // Signals from the Input stage + input HREADYS; // Transfer done + input sel_dec; // HSEL input + input [31:10] decode_addr_dec; // HADDR decoder input + input [1:0] trans_dec; // Input port HTRANS signal + + // Bus-switch output MI0 + input active_dec0; // Output stage MI0 active_dec signal + input readyout_dec0; // HREADYOUT input + input [1:0] resp_dec0; // HRESP input + input [31:0] rdata_dec0; // HRDATA input + input [1:0] ruser_dec0; // HRUSER input + + // Bus-switch output MI1 + input active_dec1; // Output stage MI1 active_dec signal + input readyout_dec1; // HREADYOUT input + input [1:0] resp_dec1; // HRESP input + input [31:0] rdata_dec1; // HRDATA input + input [1:0] ruser_dec1; // HRUSER input + + // Bus-switch output MI2 + input active_dec2; // Output stage MI2 active_dec signal + input readyout_dec2; // HREADYOUT input + input [1:0] resp_dec2; // HRESP input + input [31:0] rdata_dec2; // HRDATA input + input [1:0] ruser_dec2; // HRUSER input + + // Bus-switch output MI3 + input active_dec3; // Output stage MI3 active_dec signal + input readyout_dec3; // HREADYOUT input + input [1:0] resp_dec3; // HRESP input + input [31:0] rdata_dec3; // HRDATA input + input [1:0] ruser_dec3; // HRUSER input + + // Bus-switch output MI4 + input active_dec4; // Output stage MI4 active_dec signal + input readyout_dec4; // HREADYOUT input + input [1:0] resp_dec4; // HRESP input + input [31:0] rdata_dec4; // HRDATA input + input [1:0] ruser_dec4; // HRUSER input + + // Bus-switch output MI5 + input active_dec5; // Output stage MI5 active_dec signal + input readyout_dec5; // HREADYOUT input + input [1:0] resp_dec5; // HRESP input + input [31:0] rdata_dec5; // HRDATA input + input [1:0] ruser_dec5; // HRUSER input + + // Bus-switch output MI6 + input active_dec6; // Output stage MI6 active_dec signal + input readyout_dec6; // HREADYOUT input + input [1:0] resp_dec6; // HRESP input + input [31:0] rdata_dec6; // HRDATA input + input [1:0] ruser_dec6; // HRUSER input + + // Output port selection signals + output sel_dec0; // HSEL output + output sel_dec1; // HSEL output + output sel_dec2; // HSEL output + output sel_dec3; // HSEL output + output sel_dec4; // HSEL output + output sel_dec5; // HSEL output + output sel_dec6; // HSEL output + + // Selected Output port data and control signals + output active_dec; // Combinatorial active_dec O/P + output HREADYOUTS; // HREADY feedback output + output [1:0] HRESPS; // Transfer response + output [1:0] HRUSERS; // User read Data + output [31:0] HRDATAS; // Read Data + + +// ----------------------------------------------------------------------------- +// Wire declarations +// ----------------------------------------------------------------------------- + + // Common AHB signals + wire HCLK; // AHB System Clock + wire HRESETn; // AHB System Reset + + // Signals from the Input stage + wire HREADYS; // Transfer done + wire sel_dec; // HSEL input + wire [31:10] decode_addr_dec; // HADDR input + wire [1:0] trans_dec; // Input port HTRANS signal + + // Bus-switch output MI0 + wire active_dec0; // active_dec signal + wire readyout_dec0; // HREADYOUT input + wire [1:0] resp_dec0; // HRESP input + wire [31:0] rdata_dec0; // HRDATA input + wire [1:0] ruser_dec0; // HRUSER input + reg sel_dec0; // HSEL output + + // Bus-switch output MI1 + wire active_dec1; // active_dec signal + wire readyout_dec1; // HREADYOUT input + wire [1:0] resp_dec1; // HRESP input + wire [31:0] rdata_dec1; // HRDATA input + wire [1:0] ruser_dec1; // HRUSER input + reg sel_dec1; // HSEL output + + // Bus-switch output MI2 + wire active_dec2; // active_dec signal + wire readyout_dec2; // HREADYOUT input + wire [1:0] resp_dec2; // HRESP input + wire [31:0] rdata_dec2; // HRDATA input + wire [1:0] ruser_dec2; // HRUSER input + reg sel_dec2; // HSEL output + + // Bus-switch output MI3 + wire active_dec3; // active_dec signal + wire readyout_dec3; // HREADYOUT input + wire [1:0] resp_dec3; // HRESP input + wire [31:0] rdata_dec3; // HRDATA input + wire [1:0] ruser_dec3; // HRUSER input + reg sel_dec3; // HSEL output + + // Bus-switch output MI4 + wire active_dec4; // active_dec signal + wire readyout_dec4; // HREADYOUT input + wire [1:0] resp_dec4; // HRESP input + wire [31:0] rdata_dec4; // HRDATA input + wire [1:0] ruser_dec4; // HRUSER input + reg sel_dec4; // HSEL output + + // Bus-switch output MI5 + wire active_dec5; // active_dec signal + wire readyout_dec5; // HREADYOUT input + wire [1:0] resp_dec5; // HRESP input + wire [31:0] rdata_dec5; // HRDATA input + wire [1:0] ruser_dec5; // HRUSER input + reg sel_dec5; // HSEL output + + // Bus-switch output MI6 + wire active_dec6; // active_dec signal + wire readyout_dec6; // HREADYOUT input + wire [1:0] resp_dec6; // HRESP input + wire [31:0] rdata_dec6; // HRDATA input + wire [1:0] ruser_dec6; // HRUSER input + reg sel_dec6; // HSEL output + + +// ----------------------------------------------------------------------------- +// Signal declarations +// ----------------------------------------------------------------------------- + + // Selected Output port data and control signals + reg active_dec; // Combinatorial active_dec O/P signal + reg HREADYOUTS; // Combinatorial HREADYOUT signal + reg [1:0] HRESPS; // Combinatorial HRESPS signal + reg [1:0] HRUSERS; + reg [31:0] HRDATAS; // Read data bus + + reg [3:0] addr_out_port; // Address output ports + reg [3:0] data_out_port; // Data output ports + + // Default slave signals + reg sel_dft_slv; // HSEL signal + wire readyout_dft_slv; // HREADYOUT signal + wire [1:0] resp_dft_slv; // Combinatorial HRESPS signal + + +// ----------------------------------------------------------------------------- +// Beginning of main code +// ----------------------------------------------------------------------------- + +//------------------------------------------------------------------------------ +// Default slave (accessed when HADDR is unmapped) +//------------------------------------------------------------------------------ + + soclabs_4x7_AhbMatrix_default_slave u_soclabs_4x7_AhbMatrix_default_slave ( + + // Common AHB signals + .HCLK (HCLK), + .HRESETn (HRESETn), + + // AHB Control signals + .HSEL (sel_dft_slv), + .HTRANS (trans_dec), + .HREADY (HREADYS), + .HREADYOUT (readyout_dft_slv), + .HRESP (resp_dft_slv) + + ); + + +//------------------------------------------------------------------------------ +// Address phase signals +//------------------------------------------------------------------------------ + +// The address decode is done in two stages. This is so that the address +// decode occurs in only one process, p_addr_out_portComb, and then the select +// signal is factored in. +// +// Note that the hexadecimal address values are reformatted to align with the +// lower bound of decode_addr_dec[31:10], which is not a hex character boundary + + always @ ( + decode_addr_dec or data_out_port or trans_dec + ) + begin : p_addr_out_port_comb + + // Only switch if there is an active transfer + if (trans_dec != 2'b00) + begin + + // Address region 0x10000000-0x1fffffff + if ((decode_addr_dec >= 22'h040000) & (decode_addr_dec <= 22'h07ffff)) + addr_out_port = 4'b0000; // Select Output port MI0 + + // Address region 0x00000000-0x0fffffff + else if ((decode_addr_dec >= 22'h000000) & (decode_addr_dec <= 22'h03ffff)) + addr_out_port = 4'b0001; // Select Output port MI1 + // Address region 0x20000000-0x2fffffff + else if ((decode_addr_dec >= 22'h080000) & (decode_addr_dec <= 22'h0bffff)) + addr_out_port = 4'b0001; // Select Output port MI1 + + // Address region 0x30000000-0x3fffffff + else if ((decode_addr_dec >= 22'h0c0000) & (decode_addr_dec <= 22'h0fffff)) + addr_out_port = 4'b0010; // Select Output port MI2 + + // Address region 0x40000000-0x5fffffff + else if ((decode_addr_dec >= 22'h100000) & (decode_addr_dec <= 22'h17ffff)) + addr_out_port = 4'b0011; // Select Output port MI3 + + // Address region 0x80000000-0x8fffffff + else if ((decode_addr_dec >= 22'h200000) & (decode_addr_dec <= 22'h23ffff)) + addr_out_port = 4'b0100; // Select Output port MI4 + + // Address region 0x90000000-0x9fffffff + else if ((decode_addr_dec >= 22'h240000) & (decode_addr_dec <= 22'h27ffff)) + addr_out_port = 4'b0101; // Select Output port MI5 + + // Address region 0x60000000-0x7fffffff + else if ((decode_addr_dec >= 22'h180000) & (decode_addr_dec <= 22'h1fffff)) + addr_out_port = 4'b0110; // Select Output port MI6 + // Address region 0xa0000000-0xdfffffff + else if ((decode_addr_dec >= 22'h280000) & (decode_addr_dec <= 22'h37ffff)) + addr_out_port = 4'b0110; // Select Output port MI6 + + else + addr_out_port = 4'b1000; // Select the default slave + + end // if (trans_dec != 2'b00) + else + addr_out_port = data_out_port; // Stay on last port if no activity + + end // block: p_addr_out_port_comb + + // Select signal decode + always @ (sel_dec or addr_out_port) + begin : p_sel_comb + sel_dec0 = 1'b0; + sel_dec1 = 1'b0; + sel_dec2 = 1'b0; + sel_dec3 = 1'b0; + sel_dec4 = 1'b0; + sel_dec5 = 1'b0; + sel_dec6 = 1'b0; + sel_dft_slv = 1'b0; + + if (sel_dec) + case (addr_out_port) + 4'b0000 : sel_dec0 = 1'b1; + 4'b0001 : sel_dec1 = 1'b1; + 4'b0010 : sel_dec2 = 1'b1; + 4'b0011 : sel_dec3 = 1'b1; + 4'b0100 : sel_dec4 = 1'b1; + 4'b0101 : sel_dec5 = 1'b1; + 4'b0110 : sel_dec6 = 1'b1; + 4'b1000 : sel_dft_slv = 1'b1; // Select the default slave + default : begin + sel_dec0 = 1'bx; + sel_dec1 = 1'bx; + sel_dec2 = 1'bx; + sel_dec3 = 1'bx; + sel_dec4 = 1'bx; + sel_dec5 = 1'bx; + sel_dec6 = 1'bx; + sel_dft_slv = 1'bx; + end + endcase // case(addr_out_port) + end // block: p_sel_comb + +// The decoder selects the appropriate active_dec signal depending on which +// output stage is required for the transfer. + always @ ( + active_dec0 or + active_dec1 or + active_dec2 or + active_dec3 or + active_dec4 or + active_dec5 or + active_dec6 or + addr_out_port + ) + begin : p_active_comb + case (addr_out_port) + 4'b0000 : active_dec = active_dec0; + 4'b0001 : active_dec = active_dec1; + 4'b0010 : active_dec = active_dec2; + 4'b0011 : active_dec = active_dec3; + 4'b0100 : active_dec = active_dec4; + 4'b0101 : active_dec = active_dec5; + 4'b0110 : active_dec = active_dec6; + 4'b1000 : active_dec = 1'b1; // Select the default slave + default : active_dec = 1'bx; + endcase // case(addr_out_port) + end // block: p_active_comb + + +//------------------------------------------------------------------------------ +// Data phase signals +//------------------------------------------------------------------------------ + +// The data_out_port needs to be updated when HREADY from the input stage is high. +// Note: HREADY must be used, not HREADYOUT, because there are occaisions +// (namely when the holding register gets loaded) when HREADYOUT may be low +// but HREADY is high, and in this case it is important that the data_out_port +// gets updated. +// When the port is inactive, the default slave is selected to prevent toggling. + + always @ (negedge HRESETn or posedge HCLK) + begin : p_data_out_port_seq + if (~HRESETn) + data_out_port <= 4'b1000; + else + if (HREADYS) + if (sel_dec & trans_dec[1]) + data_out_port <= addr_out_port; + else + data_out_port <= 4'b1000; + end // block: p_data_out_port_seq + + // HREADYOUTS output decode + always @ ( + readyout_dft_slv or + readyout_dec0 or + readyout_dec1 or + readyout_dec2 or + readyout_dec3 or + readyout_dec4 or + readyout_dec5 or + readyout_dec6 or + data_out_port + ) + begin : p_ready_comb + case (data_out_port) + 4'b0000 : HREADYOUTS = readyout_dec0; + 4'b0001 : HREADYOUTS = readyout_dec1; + 4'b0010 : HREADYOUTS = readyout_dec2; + 4'b0011 : HREADYOUTS = readyout_dec3; + 4'b0100 : HREADYOUTS = readyout_dec4; + 4'b0101 : HREADYOUTS = readyout_dec5; + 4'b0110 : HREADYOUTS = readyout_dec6; + 4'b1000 : HREADYOUTS = readyout_dft_slv; // Select the default slave + default : HREADYOUTS = 1'bx; + endcase // case(data_out_port) + end // block: p_ready_comb + + // HRESPS output decode + always @ ( + resp_dft_slv or + resp_dec0 or + resp_dec1 or + resp_dec2 or + resp_dec3 or + resp_dec4 or + resp_dec5 or + resp_dec6 or + data_out_port + ) + begin : p_resp_comb + case (data_out_port) + 4'b0000 : HRESPS = resp_dec0; + 4'b0001 : HRESPS = resp_dec1; + 4'b0010 : HRESPS = resp_dec2; + 4'b0011 : HRESPS = resp_dec3; + 4'b0100 : HRESPS = resp_dec4; + 4'b0101 : HRESPS = resp_dec5; + 4'b0110 : HRESPS = resp_dec6; + 4'b1000 : HRESPS = resp_dft_slv; // Select the default slave + default : HRESPS = {2{1'bx}}; + endcase // case (data_out_port) + end // block: p_resp_comb + + // HRDATAS output decode + always @ ( + rdata_dec0 or + rdata_dec1 or + rdata_dec2 or + rdata_dec3 or + rdata_dec4 or + rdata_dec5 or + rdata_dec6 or + data_out_port + ) + begin : p_rdata_comb + case (data_out_port) + 4'b0000 : HRDATAS = rdata_dec0; + 4'b0001 : HRDATAS = rdata_dec1; + 4'b0010 : HRDATAS = rdata_dec2; + 4'b0011 : HRDATAS = rdata_dec3; + 4'b0100 : HRDATAS = rdata_dec4; + 4'b0101 : HRDATAS = rdata_dec5; + 4'b0110 : HRDATAS = rdata_dec6; + 4'b1000 : HRDATAS = {32{1'b0}}; // Select the default slave + default : HRDATAS = {32{1'bx}}; + endcase // case (data_out_port) + end // block: p_rdata_comb + + // HRUSERS output decode + always @ ( + ruser_dec0 or + ruser_dec1 or + ruser_dec2 or + ruser_dec3 or + ruser_dec4 or + ruser_dec5 or + ruser_dec6 or + data_out_port + ) + begin : p_ruser_comb + case (data_out_port) + 4'b0000 : HRUSERS = ruser_dec0; + 4'b0001 : HRUSERS = ruser_dec1; + 4'b0010 : HRUSERS = ruser_dec2; + 4'b0011 : HRUSERS = ruser_dec3; + 4'b0100 : HRUSERS = ruser_dec4; + 4'b0101 : HRUSERS = ruser_dec5; + 4'b0110 : HRUSERS = ruser_dec6; + 4'b1000 : HRUSERS = {2{1'b0}}; // Select the default slave + default : HRUSERS = {2{1'bx}}; + endcase // case (data_out_port) + end // block: p_ruser_comb + + +endmodule + +// --================================= End ===================================-- diff --git a/Cortex-M0/nanosoc/systems/mcu/verilog/gen_ahb_busmatrix/verilog/built/soclabs_4x7_AhbMatrix/soclabs_4x7_MatrixDecode_dma2.v b/Cortex-M0/nanosoc/systems/mcu/verilog/gen_ahb_busmatrix/verilog/built/soclabs_4x7_AhbMatrix/soclabs_4x7_MatrixDecode_dma2.v new file mode 100644 index 0000000..d80c280 --- /dev/null +++ b/Cortex-M0/nanosoc/systems/mcu/verilog/gen_ahb_busmatrix/verilog/built/soclabs_4x7_AhbMatrix/soclabs_4x7_MatrixDecode_dma2.v @@ -0,0 +1,566 @@ +//----------------------------------------------------------------------------- +// The confidential and proprietary information contained in this file may +// only be used by a person authorised under and to the extent permitted +// by a subsisting licensing agreement from Arm Limited or its affiliates. +// +// (C) COPYRIGHT 2001-2023 Arm Limited or its affiliates. +// ALL RIGHTS RESERVED +// +// This entire notice must be reproduced on all copies of this file +// and copies of this file may only be made by a person if such person is +// permitted to do so under the terms of a subsisting license agreement +// from Arm Limited or its affiliates. +// +// SVN Information +// +// Checked In : $Date: 2017-10-10 15:55:38 +0100 (Tue, 10 Oct 2017) $ +// +// Revision : $Revision: 371321 $ +// +// Release Information : Cortex-M System Design Kit-r1p1-00rel0 +// +//----------------------------------------------------------------------------- +// +//----------------------------------------------------------------------------- +// Abstract : The MatrixDecode is used to determine which output +// stage is required for a particular access. Addresses +// that do not map to an Output port are diverted to +// the local default slave. +// +// Notes : The bus matrix has full connectivity. +// +//----------------------------------------------------------------------------- + + +`timescale 1ns/1ps + + +module soclabs_4x7_MatrixDecode_dma2 ( + + // Common AHB signals + HCLK, + HRESETn, + + // Signals from the Input stage + HREADYS, + sel_dec, + decode_addr_dec, + trans_dec, + + // Bus-switch output 0 + active_dec0, + readyout_dec0, + resp_dec0, + rdata_dec0, + ruser_dec0, + + // Bus-switch output 1 + active_dec1, + readyout_dec1, + resp_dec1, + rdata_dec1, + ruser_dec1, + + // Bus-switch output 2 + active_dec2, + readyout_dec2, + resp_dec2, + rdata_dec2, + ruser_dec2, + + // Bus-switch output 3 + active_dec3, + readyout_dec3, + resp_dec3, + rdata_dec3, + ruser_dec3, + + // Bus-switch output 4 + active_dec4, + readyout_dec4, + resp_dec4, + rdata_dec4, + ruser_dec4, + + // Bus-switch output 5 + active_dec5, + readyout_dec5, + resp_dec5, + rdata_dec5, + ruser_dec5, + + // Bus-switch output 6 + active_dec6, + readyout_dec6, + resp_dec6, + rdata_dec6, + ruser_dec6, + + // Output port selection signals + sel_dec0, + sel_dec1, + sel_dec2, + sel_dec3, + sel_dec4, + sel_dec5, + sel_dec6, + + // Selected Output port data and control signals + active_dec, + HREADYOUTS, + HRESPS, + HRUSERS, + HRDATAS + + ); + + +// ----------------------------------------------------------------------------- +// Input and Output declarations +// ----------------------------------------------------------------------------- + + // Common AHB signals + input HCLK; // AHB System Clock + input HRESETn; // AHB System Reset + + // Signals from the Input stage + input HREADYS; // Transfer done + input sel_dec; // HSEL input + input [31:10] decode_addr_dec; // HADDR decoder input + input [1:0] trans_dec; // Input port HTRANS signal + + // Bus-switch output MI0 + input active_dec0; // Output stage MI0 active_dec signal + input readyout_dec0; // HREADYOUT input + input [1:0] resp_dec0; // HRESP input + input [31:0] rdata_dec0; // HRDATA input + input [1:0] ruser_dec0; // HRUSER input + + // Bus-switch output MI1 + input active_dec1; // Output stage MI1 active_dec signal + input readyout_dec1; // HREADYOUT input + input [1:0] resp_dec1; // HRESP input + input [31:0] rdata_dec1; // HRDATA input + input [1:0] ruser_dec1; // HRUSER input + + // Bus-switch output MI2 + input active_dec2; // Output stage MI2 active_dec signal + input readyout_dec2; // HREADYOUT input + input [1:0] resp_dec2; // HRESP input + input [31:0] rdata_dec2; // HRDATA input + input [1:0] ruser_dec2; // HRUSER input + + // Bus-switch output MI3 + input active_dec3; // Output stage MI3 active_dec signal + input readyout_dec3; // HREADYOUT input + input [1:0] resp_dec3; // HRESP input + input [31:0] rdata_dec3; // HRDATA input + input [1:0] ruser_dec3; // HRUSER input + + // Bus-switch output MI4 + input active_dec4; // Output stage MI4 active_dec signal + input readyout_dec4; // HREADYOUT input + input [1:0] resp_dec4; // HRESP input + input [31:0] rdata_dec4; // HRDATA input + input [1:0] ruser_dec4; // HRUSER input + + // Bus-switch output MI5 + input active_dec5; // Output stage MI5 active_dec signal + input readyout_dec5; // HREADYOUT input + input [1:0] resp_dec5; // HRESP input + input [31:0] rdata_dec5; // HRDATA input + input [1:0] ruser_dec5; // HRUSER input + + // Bus-switch output MI6 + input active_dec6; // Output stage MI6 active_dec signal + input readyout_dec6; // HREADYOUT input + input [1:0] resp_dec6; // HRESP input + input [31:0] rdata_dec6; // HRDATA input + input [1:0] ruser_dec6; // HRUSER input + + // Output port selection signals + output sel_dec0; // HSEL output + output sel_dec1; // HSEL output + output sel_dec2; // HSEL output + output sel_dec3; // HSEL output + output sel_dec4; // HSEL output + output sel_dec5; // HSEL output + output sel_dec6; // HSEL output + + // Selected Output port data and control signals + output active_dec; // Combinatorial active_dec O/P + output HREADYOUTS; // HREADY feedback output + output [1:0] HRESPS; // Transfer response + output [1:0] HRUSERS; // User read Data + output [31:0] HRDATAS; // Read Data + + +// ----------------------------------------------------------------------------- +// Wire declarations +// ----------------------------------------------------------------------------- + + // Common AHB signals + wire HCLK; // AHB System Clock + wire HRESETn; // AHB System Reset + + // Signals from the Input stage + wire HREADYS; // Transfer done + wire sel_dec; // HSEL input + wire [31:10] decode_addr_dec; // HADDR input + wire [1:0] trans_dec; // Input port HTRANS signal + + // Bus-switch output MI0 + wire active_dec0; // active_dec signal + wire readyout_dec0; // HREADYOUT input + wire [1:0] resp_dec0; // HRESP input + wire [31:0] rdata_dec0; // HRDATA input + wire [1:0] ruser_dec0; // HRUSER input + reg sel_dec0; // HSEL output + + // Bus-switch output MI1 + wire active_dec1; // active_dec signal + wire readyout_dec1; // HREADYOUT input + wire [1:0] resp_dec1; // HRESP input + wire [31:0] rdata_dec1; // HRDATA input + wire [1:0] ruser_dec1; // HRUSER input + reg sel_dec1; // HSEL output + + // Bus-switch output MI2 + wire active_dec2; // active_dec signal + wire readyout_dec2; // HREADYOUT input + wire [1:0] resp_dec2; // HRESP input + wire [31:0] rdata_dec2; // HRDATA input + wire [1:0] ruser_dec2; // HRUSER input + reg sel_dec2; // HSEL output + + // Bus-switch output MI3 + wire active_dec3; // active_dec signal + wire readyout_dec3; // HREADYOUT input + wire [1:0] resp_dec3; // HRESP input + wire [31:0] rdata_dec3; // HRDATA input + wire [1:0] ruser_dec3; // HRUSER input + reg sel_dec3; // HSEL output + + // Bus-switch output MI4 + wire active_dec4; // active_dec signal + wire readyout_dec4; // HREADYOUT input + wire [1:0] resp_dec4; // HRESP input + wire [31:0] rdata_dec4; // HRDATA input + wire [1:0] ruser_dec4; // HRUSER input + reg sel_dec4; // HSEL output + + // Bus-switch output MI5 + wire active_dec5; // active_dec signal + wire readyout_dec5; // HREADYOUT input + wire [1:0] resp_dec5; // HRESP input + wire [31:0] rdata_dec5; // HRDATA input + wire [1:0] ruser_dec5; // HRUSER input + reg sel_dec5; // HSEL output + + // Bus-switch output MI6 + wire active_dec6; // active_dec signal + wire readyout_dec6; // HREADYOUT input + wire [1:0] resp_dec6; // HRESP input + wire [31:0] rdata_dec6; // HRDATA input + wire [1:0] ruser_dec6; // HRUSER input + reg sel_dec6; // HSEL output + + +// ----------------------------------------------------------------------------- +// Signal declarations +// ----------------------------------------------------------------------------- + + // Selected Output port data and control signals + reg active_dec; // Combinatorial active_dec O/P signal + reg HREADYOUTS; // Combinatorial HREADYOUT signal + reg [1:0] HRESPS; // Combinatorial HRESPS signal + reg [1:0] HRUSERS; + reg [31:0] HRDATAS; // Read data bus + + reg [3:0] addr_out_port; // Address output ports + reg [3:0] data_out_port; // Data output ports + + // Default slave signals + reg sel_dft_slv; // HSEL signal + wire readyout_dft_slv; // HREADYOUT signal + wire [1:0] resp_dft_slv; // Combinatorial HRESPS signal + + +// ----------------------------------------------------------------------------- +// Beginning of main code +// ----------------------------------------------------------------------------- + +//------------------------------------------------------------------------------ +// Default slave (accessed when HADDR is unmapped) +//------------------------------------------------------------------------------ + + soclabs_4x7_AhbMatrix_default_slave u_soclabs_4x7_AhbMatrix_default_slave ( + + // Common AHB signals + .HCLK (HCLK), + .HRESETn (HRESETn), + + // AHB Control signals + .HSEL (sel_dft_slv), + .HTRANS (trans_dec), + .HREADY (HREADYS), + .HREADYOUT (readyout_dft_slv), + .HRESP (resp_dft_slv) + + ); + + +//------------------------------------------------------------------------------ +// Address phase signals +//------------------------------------------------------------------------------ + +// The address decode is done in two stages. This is so that the address +// decode occurs in only one process, p_addr_out_portComb, and then the select +// signal is factored in. +// +// Note that the hexadecimal address values are reformatted to align with the +// lower bound of decode_addr_dec[31:10], which is not a hex character boundary + + always @ ( + decode_addr_dec or data_out_port or trans_dec + ) + begin : p_addr_out_port_comb + + // Only switch if there is an active transfer + if (trans_dec != 2'b00) + begin + + // Address region 0x10000000-0x1fffffff + if ((decode_addr_dec >= 22'h040000) & (decode_addr_dec <= 22'h07ffff)) + addr_out_port = 4'b0000; // Select Output port MI0 + + // Address region 0x00000000-0x0fffffff + else if ((decode_addr_dec >= 22'h000000) & (decode_addr_dec <= 22'h03ffff)) + addr_out_port = 4'b0001; // Select Output port MI1 + // Address region 0x20000000-0x2fffffff + else if ((decode_addr_dec >= 22'h080000) & (decode_addr_dec <= 22'h0bffff)) + addr_out_port = 4'b0001; // Select Output port MI1 + + // Address region 0x30000000-0x3fffffff + else if ((decode_addr_dec >= 22'h0c0000) & (decode_addr_dec <= 22'h0fffff)) + addr_out_port = 4'b0010; // Select Output port MI2 + + // Address region 0x40000000-0x5fffffff + else if ((decode_addr_dec >= 22'h100000) & (decode_addr_dec <= 22'h17ffff)) + addr_out_port = 4'b0011; // Select Output port MI3 + + // Address region 0x80000000-0x8fffffff + else if ((decode_addr_dec >= 22'h200000) & (decode_addr_dec <= 22'h23ffff)) + addr_out_port = 4'b0100; // Select Output port MI4 + + // Address region 0x90000000-0x9fffffff + else if ((decode_addr_dec >= 22'h240000) & (decode_addr_dec <= 22'h27ffff)) + addr_out_port = 4'b0101; // Select Output port MI5 + + // Address region 0x60000000-0x7fffffff + else if ((decode_addr_dec >= 22'h180000) & (decode_addr_dec <= 22'h1fffff)) + addr_out_port = 4'b0110; // Select Output port MI6 + // Address region 0xa0000000-0xdfffffff + else if ((decode_addr_dec >= 22'h280000) & (decode_addr_dec <= 22'h37ffff)) + addr_out_port = 4'b0110; // Select Output port MI6 + + else + addr_out_port = 4'b1000; // Select the default slave + + end // if (trans_dec != 2'b00) + else + addr_out_port = data_out_port; // Stay on last port if no activity + + end // block: p_addr_out_port_comb + + // Select signal decode + always @ (sel_dec or addr_out_port) + begin : p_sel_comb + sel_dec0 = 1'b0; + sel_dec1 = 1'b0; + sel_dec2 = 1'b0; + sel_dec3 = 1'b0; + sel_dec4 = 1'b0; + sel_dec5 = 1'b0; + sel_dec6 = 1'b0; + sel_dft_slv = 1'b0; + + if (sel_dec) + case (addr_out_port) + 4'b0000 : sel_dec0 = 1'b1; + 4'b0001 : sel_dec1 = 1'b1; + 4'b0010 : sel_dec2 = 1'b1; + 4'b0011 : sel_dec3 = 1'b1; + 4'b0100 : sel_dec4 = 1'b1; + 4'b0101 : sel_dec5 = 1'b1; + 4'b0110 : sel_dec6 = 1'b1; + 4'b1000 : sel_dft_slv = 1'b1; // Select the default slave + default : begin + sel_dec0 = 1'bx; + sel_dec1 = 1'bx; + sel_dec2 = 1'bx; + sel_dec3 = 1'bx; + sel_dec4 = 1'bx; + sel_dec5 = 1'bx; + sel_dec6 = 1'bx; + sel_dft_slv = 1'bx; + end + endcase // case(addr_out_port) + end // block: p_sel_comb + +// The decoder selects the appropriate active_dec signal depending on which +// output stage is required for the transfer. + always @ ( + active_dec0 or + active_dec1 or + active_dec2 or + active_dec3 or + active_dec4 or + active_dec5 or + active_dec6 or + addr_out_port + ) + begin : p_active_comb + case (addr_out_port) + 4'b0000 : active_dec = active_dec0; + 4'b0001 : active_dec = active_dec1; + 4'b0010 : active_dec = active_dec2; + 4'b0011 : active_dec = active_dec3; + 4'b0100 : active_dec = active_dec4; + 4'b0101 : active_dec = active_dec5; + 4'b0110 : active_dec = active_dec6; + 4'b1000 : active_dec = 1'b1; // Select the default slave + default : active_dec = 1'bx; + endcase // case(addr_out_port) + end // block: p_active_comb + + +//------------------------------------------------------------------------------ +// Data phase signals +//------------------------------------------------------------------------------ + +// The data_out_port needs to be updated when HREADY from the input stage is high. +// Note: HREADY must be used, not HREADYOUT, because there are occaisions +// (namely when the holding register gets loaded) when HREADYOUT may be low +// but HREADY is high, and in this case it is important that the data_out_port +// gets updated. +// When the port is inactive, the default slave is selected to prevent toggling. + + always @ (negedge HRESETn or posedge HCLK) + begin : p_data_out_port_seq + if (~HRESETn) + data_out_port <= 4'b1000; + else + if (HREADYS) + if (sel_dec & trans_dec[1]) + data_out_port <= addr_out_port; + else + data_out_port <= 4'b1000; + end // block: p_data_out_port_seq + + // HREADYOUTS output decode + always @ ( + readyout_dft_slv or + readyout_dec0 or + readyout_dec1 or + readyout_dec2 or + readyout_dec3 or + readyout_dec4 or + readyout_dec5 or + readyout_dec6 or + data_out_port + ) + begin : p_ready_comb + case (data_out_port) + 4'b0000 : HREADYOUTS = readyout_dec0; + 4'b0001 : HREADYOUTS = readyout_dec1; + 4'b0010 : HREADYOUTS = readyout_dec2; + 4'b0011 : HREADYOUTS = readyout_dec3; + 4'b0100 : HREADYOUTS = readyout_dec4; + 4'b0101 : HREADYOUTS = readyout_dec5; + 4'b0110 : HREADYOUTS = readyout_dec6; + 4'b1000 : HREADYOUTS = readyout_dft_slv; // Select the default slave + default : HREADYOUTS = 1'bx; + endcase // case(data_out_port) + end // block: p_ready_comb + + // HRESPS output decode + always @ ( + resp_dft_slv or + resp_dec0 or + resp_dec1 or + resp_dec2 or + resp_dec3 or + resp_dec4 or + resp_dec5 or + resp_dec6 or + data_out_port + ) + begin : p_resp_comb + case (data_out_port) + 4'b0000 : HRESPS = resp_dec0; + 4'b0001 : HRESPS = resp_dec1; + 4'b0010 : HRESPS = resp_dec2; + 4'b0011 : HRESPS = resp_dec3; + 4'b0100 : HRESPS = resp_dec4; + 4'b0101 : HRESPS = resp_dec5; + 4'b0110 : HRESPS = resp_dec6; + 4'b1000 : HRESPS = resp_dft_slv; // Select the default slave + default : HRESPS = {2{1'bx}}; + endcase // case (data_out_port) + end // block: p_resp_comb + + // HRDATAS output decode + always @ ( + rdata_dec0 or + rdata_dec1 or + rdata_dec2 or + rdata_dec3 or + rdata_dec4 or + rdata_dec5 or + rdata_dec6 or + data_out_port + ) + begin : p_rdata_comb + case (data_out_port) + 4'b0000 : HRDATAS = rdata_dec0; + 4'b0001 : HRDATAS = rdata_dec1; + 4'b0010 : HRDATAS = rdata_dec2; + 4'b0011 : HRDATAS = rdata_dec3; + 4'b0100 : HRDATAS = rdata_dec4; + 4'b0101 : HRDATAS = rdata_dec5; + 4'b0110 : HRDATAS = rdata_dec6; + 4'b1000 : HRDATAS = {32{1'b0}}; // Select the default slave + default : HRDATAS = {32{1'bx}}; + endcase // case (data_out_port) + end // block: p_rdata_comb + + // HRUSERS output decode + always @ ( + ruser_dec0 or + ruser_dec1 or + ruser_dec2 or + ruser_dec3 or + ruser_dec4 or + ruser_dec5 or + ruser_dec6 or + data_out_port + ) + begin : p_ruser_comb + case (data_out_port) + 4'b0000 : HRUSERS = ruser_dec0; + 4'b0001 : HRUSERS = ruser_dec1; + 4'b0010 : HRUSERS = ruser_dec2; + 4'b0011 : HRUSERS = ruser_dec3; + 4'b0100 : HRUSERS = ruser_dec4; + 4'b0101 : HRUSERS = ruser_dec5; + 4'b0110 : HRUSERS = ruser_dec6; + 4'b1000 : HRUSERS = {2{1'b0}}; // Select the default slave + default : HRUSERS = {2{1'bx}}; + endcase // case (data_out_port) + end // block: p_ruser_comb + + +endmodule + +// --================================= End ===================================-- diff --git a/Cortex-M0/nanosoc/systems/mcu/verilog/gen_ahb_busmatrix/verilog/built/soclabs_4x7_AhbMatrix/soclabs_4x7_SlaveOutput.v b/Cortex-M0/nanosoc/systems/mcu/verilog/gen_ahb_busmatrix/verilog/built/soclabs_4x7_AhbMatrix/soclabs_4x7_SlaveOutput.v new file mode 100644 index 0000000..98779fd --- /dev/null +++ b/Cortex-M0/nanosoc/systems/mcu/verilog/gen_ahb_busmatrix/verilog/built/soclabs_4x7_AhbMatrix/soclabs_4x7_SlaveOutput.v @@ -0,0 +1,628 @@ +//----------------------------------------------------------------------------- +// The confidential and proprietary information contained in this file may +// only be used by a person authorised under and to the extent permitted +// by a subsisting licensing agreement from Arm Limited or its affiliates. +// +// (C) COPYRIGHT 2001-2023 Arm Limited or its affiliates. +// ALL RIGHTS RESERVED +// +// This entire notice must be reproduced on all copies of this file +// and copies of this file may only be made by a person if such person is +// permitted to do so under the terms of a subsisting license agreement +// from Arm Limited or its affiliates. +// +// SVN Information +// +// Checked In : $Date: 2017-10-10 15:55:38 +0100 (Tue, 10 Oct 2017) $ +// +// Revision : $Revision: 371321 $ +// +// Release Information : Cortex-M System Design Kit-r1p1-00rel0 +// +//----------------------------------------------------------------------------- +// +//----------------------------------------------------------------------------- +// Abstract : The Output Stage is used to route the required input +// stage to the shared slave output. +// +// Notes : The bus matrix has full connectivity, +// and has a burst arbiter scheme. +// +//----------------------------------------------------------------------------- + + +`timescale 1ns/1ps + + +module soclabs_4x7_SlaveOutput ( + + // Common AHB signals + HCLK, + HRESETn, + + // Port 0 Signals + sel_op0, + addr_op0, + auser_op0, + trans_op0, + write_op0, + size_op0, + burst_op0, + prot_op0, + master_op0, + mastlock_op0, + wdata_op0, + wuser_op0, + held_tran_op0, + + // Port 1 Signals + sel_op1, + addr_op1, + auser_op1, + trans_op1, + write_op1, + size_op1, + burst_op1, + prot_op1, + master_op1, + mastlock_op1, + wdata_op1, + wuser_op1, + held_tran_op1, + + // Port 2 Signals + sel_op2, + addr_op2, + auser_op2, + trans_op2, + write_op2, + size_op2, + burst_op2, + prot_op2, + master_op2, + mastlock_op2, + wdata_op2, + wuser_op2, + held_tran_op2, + + // Port 3 Signals + sel_op3, + addr_op3, + auser_op3, + trans_op3, + write_op3, + size_op3, + burst_op3, + prot_op3, + master_op3, + mastlock_op3, + wdata_op3, + wuser_op3, + held_tran_op3, + + // Slave read data and response + HREADYOUTM, + + active_op0, + active_op1, + active_op2, + active_op3, + + // Slave Address/Control Signals + HSELM, + HADDRM, + HAUSERM, + HTRANSM, + HWRITEM, + HSIZEM, + HBURSTM, + HPROTM, + HMASTERM, + HMASTLOCKM, + HREADYMUXM, + HWUSERM, + HWDATAM + + ); + + +// ----------------------------------------------------------------------------- +// Input and Output declarations +// ----------------------------------------------------------------------------- + + // Common AHB signals + input HCLK; // AHB system clock + input HRESETn; // AHB system reset + + // Bus-switch input 0 + input sel_op0; // Port 0 HSEL signal + input [31:0] addr_op0; // Port 0 HADDR signal + input [1:0] auser_op0; // Port 0 HAUSER signal + input [1:0] trans_op0; // Port 0 HTRANS signal + input write_op0; // Port 0 HWRITE signal + input [2:0] size_op0; // Port 0 HSIZE signal + input [2:0] burst_op0; // Port 0 HBURST signal + input [3:0] prot_op0; // Port 0 HPROT signal + input [3:0] master_op0; // Port 0 HMASTER signal + input mastlock_op0; // Port 0 HMASTLOCK signal + input [31:0] wdata_op0; // Port 0 HWDATA signal + input [1:0] wuser_op0; // Port 0 HWUSER signal + input held_tran_op0; // Port 0 HeldTran signal + + // Bus-switch input 1 + input sel_op1; // Port 1 HSEL signal + input [31:0] addr_op1; // Port 1 HADDR signal + input [1:0] auser_op1; // Port 1 HAUSER signal + input [1:0] trans_op1; // Port 1 HTRANS signal + input write_op1; // Port 1 HWRITE signal + input [2:0] size_op1; // Port 1 HSIZE signal + input [2:0] burst_op1; // Port 1 HBURST signal + input [3:0] prot_op1; // Port 1 HPROT signal + input [3:0] master_op1; // Port 1 HMASTER signal + input mastlock_op1; // Port 1 HMASTLOCK signal + input [31:0] wdata_op1; // Port 1 HWDATA signal + input [1:0] wuser_op1; // Port 1 HWUSER signal + input held_tran_op1; // Port 1 HeldTran signal + + // Bus-switch input 2 + input sel_op2; // Port 2 HSEL signal + input [31:0] addr_op2; // Port 2 HADDR signal + input [1:0] auser_op2; // Port 2 HAUSER signal + input [1:0] trans_op2; // Port 2 HTRANS signal + input write_op2; // Port 2 HWRITE signal + input [2:0] size_op2; // Port 2 HSIZE signal + input [2:0] burst_op2; // Port 2 HBURST signal + input [3:0] prot_op2; // Port 2 HPROT signal + input [3:0] master_op2; // Port 2 HMASTER signal + input mastlock_op2; // Port 2 HMASTLOCK signal + input [31:0] wdata_op2; // Port 2 HWDATA signal + input [1:0] wuser_op2; // Port 2 HWUSER signal + input held_tran_op2; // Port 2 HeldTran signal + + // Bus-switch input 3 + input sel_op3; // Port 3 HSEL signal + input [31:0] addr_op3; // Port 3 HADDR signal + input [1:0] auser_op3; // Port 3 HAUSER signal + input [1:0] trans_op3; // Port 3 HTRANS signal + input write_op3; // Port 3 HWRITE signal + input [2:0] size_op3; // Port 3 HSIZE signal + input [2:0] burst_op3; // Port 3 HBURST signal + input [3:0] prot_op3; // Port 3 HPROT signal + input [3:0] master_op3; // Port 3 HMASTER signal + input mastlock_op3; // Port 3 HMASTLOCK signal + input [31:0] wdata_op3; // Port 3 HWDATA signal + input [1:0] wuser_op3; // Port 3 HWUSER signal + input held_tran_op3; // Port 3 HeldTran signal + + input HREADYOUTM; // HREADY feedback + + output active_op0; // Port 0 Active signal + output active_op1; // Port 1 Active signal + output active_op2; // Port 2 Active signal + output active_op3; // Port 3 Active signal + + // Slave Address/Control Signals + output HSELM; // Slave select line + output [31:0] HADDRM; // Address + output [1:0] HAUSERM; // User Address bus + output [1:0] HTRANSM; // Transfer type + output HWRITEM; // Transfer direction + output [2:0] HSIZEM; // Transfer size + output [2:0] HBURSTM; // Burst type + output [3:0] HPROTM; // Protection control + output [3:0] HMASTERM; // Master ID + output HMASTLOCKM; // Locked transfer + output HREADYMUXM; // Transfer done + output [1:0] HWUSERM; // User data bus + output [31:0] HWDATAM; // Write data + + +// ----------------------------------------------------------------------------- +// Wire declarations +// ----------------------------------------------------------------------------- + wire HCLK; // AHB system clock + wire HRESETn; // AHB system reset + + // Bus-switch input 0 + wire sel_op0; // Port 0 HSEL signal + wire [31:0] addr_op0; // Port 0 HADDR signal + wire [1:0] auser_op0; // Port 0 HAUSER signal + wire [1:0] trans_op0; // Port 0 HTRANS signal + wire write_op0; // Port 0 HWRITE signal + wire [2:0] size_op0; // Port 0 HSIZE signal + wire [2:0] burst_op0; // Port 0 HBURST signal + wire [3:0] prot_op0; // Port 0 HPROT signal + wire [3:0] master_op0; // Port 0 HMASTER signal + wire mastlock_op0; // Port 0 HMASTLOCK signal + wire [31:0] wdata_op0; // Port 0 HWDATA signal + wire [1:0] wuser_op0; // Port 0 HWUSER signal + wire held_tran_op0; // Port 0 HeldTran signal + reg active_op0; // Port 0 Active signal + + // Bus-switch input 1 + wire sel_op1; // Port 1 HSEL signal + wire [31:0] addr_op1; // Port 1 HADDR signal + wire [1:0] auser_op1; // Port 1 HAUSER signal + wire [1:0] trans_op1; // Port 1 HTRANS signal + wire write_op1; // Port 1 HWRITE signal + wire [2:0] size_op1; // Port 1 HSIZE signal + wire [2:0] burst_op1; // Port 1 HBURST signal + wire [3:0] prot_op1; // Port 1 HPROT signal + wire [3:0] master_op1; // Port 1 HMASTER signal + wire mastlock_op1; // Port 1 HMASTLOCK signal + wire [31:0] wdata_op1; // Port 1 HWDATA signal + wire [1:0] wuser_op1; // Port 1 HWUSER signal + wire held_tran_op1; // Port 1 HeldTran signal + reg active_op1; // Port 1 Active signal + + // Bus-switch input 2 + wire sel_op2; // Port 2 HSEL signal + wire [31:0] addr_op2; // Port 2 HADDR signal + wire [1:0] auser_op2; // Port 2 HAUSER signal + wire [1:0] trans_op2; // Port 2 HTRANS signal + wire write_op2; // Port 2 HWRITE signal + wire [2:0] size_op2; // Port 2 HSIZE signal + wire [2:0] burst_op2; // Port 2 HBURST signal + wire [3:0] prot_op2; // Port 2 HPROT signal + wire [3:0] master_op2; // Port 2 HMASTER signal + wire mastlock_op2; // Port 2 HMASTLOCK signal + wire [31:0] wdata_op2; // Port 2 HWDATA signal + wire [1:0] wuser_op2; // Port 2 HWUSER signal + wire held_tran_op2; // Port 2 HeldTran signal + reg active_op2; // Port 2 Active signal + + // Bus-switch input 3 + wire sel_op3; // Port 3 HSEL signal + wire [31:0] addr_op3; // Port 3 HADDR signal + wire [1:0] auser_op3; // Port 3 HAUSER signal + wire [1:0] trans_op3; // Port 3 HTRANS signal + wire write_op3; // Port 3 HWRITE signal + wire [2:0] size_op3; // Port 3 HSIZE signal + wire [2:0] burst_op3; // Port 3 HBURST signal + wire [3:0] prot_op3; // Port 3 HPROT signal + wire [3:0] master_op3; // Port 3 HMASTER signal + wire mastlock_op3; // Port 3 HMASTLOCK signal + wire [31:0] wdata_op3; // Port 3 HWDATA signal + wire [1:0] wuser_op3; // Port 3 HWUSER signal + wire held_tran_op3; // Port 3 HeldTran signal + reg active_op3; // Port 3 Active signal + + // Slave Address/Control Signals + wire HSELM; // Slave select line + reg [31:0] HADDRM; // Address + reg [1:0] HAUSERM; // User Address bus + wire [1:0] HTRANSM; // Transfer type + reg HWRITEM; // Transfer direction + reg [2:0] HSIZEM; // Transfer size + wire [2:0] HBURSTM; // Burst type + reg [3:0] HPROTM; // Protection control + reg [3:0] HMASTERM; // Master ID + wire HMASTLOCKM; // Locked transfer + wire HREADYMUXM; // Transfer done + reg [1:0] HWUSERM; // User data bus + reg [31:0] HWDATAM; // Write data + wire HREADYOUTM; // HREADY feedback + + +// ----------------------------------------------------------------------------- +// Signal declarations +// ----------------------------------------------------------------------------- + wire req_port0; // Port 0 request signal + wire req_port1; // Port 1 request signal + wire req_port2; // Port 2 request signal + wire req_port3; // Port 3 request signal + + wire [1:0] addr_in_port; // Address input port + reg [1:0] data_in_port; // Data input port + wire no_port; // No port selected signal + reg slave_sel; // Slave select signal + reg wdata_phase; // Used to prevent unnecesary toggling + + reg hsel_lock; // Held HSELS during locked sequence + wire next_hsel_lock; // Pre-registered hsel_lock + wire hlock_arb; // HMASTLOCK modified by HSEL for arbitration + + reg i_hselm; // Internal HSELM + reg [1:0] i_htransm; // Internal HTRANSM + reg [2:0] i_hburstm; // Internal HBURSTM + wire i_hreadymuxm; // Internal HREADYMUXM + reg i_hmastlockm; // Internal HMASTLOCKM + + +// ----------------------------------------------------------------------------- +// Beginning of main code +// ----------------------------------------------------------------------------- + +// ----------------------------------------------------------------------------- +// Port Selection +// ----------------------------------------------------------------------------- + + assign req_port0 = held_tran_op0 & sel_op0; + assign req_port1 = held_tran_op1 & sel_op1; + assign req_port2 = held_tran_op2 & sel_op2; + assign req_port3 = held_tran_op3 & sel_op3; + + // Arbiter instance for resolving requests to this output stage + soclabs_4x7_Arbiter u_output_arb ( + + .HCLK (HCLK), + .HRESETn (HRESETn), + + .req_port0 (req_port0), + .req_port1 (req_port1), + .req_port2 (req_port2), + .req_port3 (req_port3), + + .HREADYM (i_hreadymuxm), + .HSELM (i_hselm), + .HTRANSM (i_htransm), + .HBURSTM (i_hburstm), + .HMASTLOCKM (hlock_arb), + + .addr_in_port (addr_in_port), + .no_port (no_port) + + ); + + + // Active signal combinatorial decode + always @ (addr_in_port or no_port) + begin : p_active_comb + // Default value(s) + active_op0 = 1'b0; + active_op1 = 1'b0; + active_op2 = 1'b0; + active_op3 = 1'b0; + + // Decode selection when enabled + if (~no_port) + case (addr_in_port) + 2'b00 : active_op0 = 1'b1; + 2'b01 : active_op1 = 1'b1; + 2'b10 : active_op2 = 1'b1; + 2'b11 : active_op3 = 1'b1; + default : begin + active_op0 = 1'bx; + active_op1 = 1'bx; + active_op2 = 1'bx; + active_op3 = 1'bx; + end + endcase // case(addr_in_port) + end // block: p_active_comb + + + // Address/control output decode + always @ ( + sel_op0 or addr_op0 or trans_op0 or write_op0 or + size_op0 or burst_op0 or prot_op0 or + auser_op0 or + master_op0 or mastlock_op0 or + sel_op1 or addr_op1 or trans_op1 or write_op1 or + size_op1 or burst_op1 or prot_op1 or + auser_op1 or + master_op1 or mastlock_op1 or + sel_op2 or addr_op2 or trans_op2 or write_op2 or + size_op2 or burst_op2 or prot_op2 or + auser_op2 or + master_op2 or mastlock_op2 or + sel_op3 or addr_op3 or trans_op3 or write_op3 or + size_op3 or burst_op3 or prot_op3 or + auser_op3 or + master_op3 or mastlock_op3 or + addr_in_port or no_port + ) + begin : p_addr_mux + // Default values + i_hselm = 1'b0; + HADDRM = {32{1'b0}}; + HAUSERM = {2{1'b0}}; + i_htransm = 2'b00; + HWRITEM = 1'b0; + HSIZEM = 3'b000; + i_hburstm = 3'b000; + HPROTM = {4{1'b0}}; + HMASTERM = 4'b0000; + i_hmastlockm= 1'b0; + + // Decode selection when enabled + if (~no_port) + case (addr_in_port) + // Bus-switch input 0 + 2'b00 : + begin + i_hselm = sel_op0; + HADDRM = addr_op0; + HAUSERM = auser_op0; + i_htransm = trans_op0; + HWRITEM = write_op0; + HSIZEM = size_op0; + i_hburstm = burst_op0; + HPROTM = prot_op0; + HMASTERM = master_op0; + i_hmastlockm= mastlock_op0; + end // case: 4'b00 + + // Bus-switch input 1 + 2'b01 : + begin + i_hselm = sel_op1; + HADDRM = addr_op1; + HAUSERM = auser_op1; + i_htransm = trans_op1; + HWRITEM = write_op1; + HSIZEM = size_op1; + i_hburstm = burst_op1; + HPROTM = prot_op1; + HMASTERM = master_op1; + i_hmastlockm= mastlock_op1; + end // case: 4'b01 + + // Bus-switch input 2 + 2'b10 : + begin + i_hselm = sel_op2; + HADDRM = addr_op2; + HAUSERM = auser_op2; + i_htransm = trans_op2; + HWRITEM = write_op2; + HSIZEM = size_op2; + i_hburstm = burst_op2; + HPROTM = prot_op2; + HMASTERM = master_op2; + i_hmastlockm= mastlock_op2; + end // case: 4'b10 + + // Bus-switch input 3 + 2'b11 : + begin + i_hselm = sel_op3; + HADDRM = addr_op3; + HAUSERM = auser_op3; + i_htransm = trans_op3; + HWRITEM = write_op3; + HSIZEM = size_op3; + i_hburstm = burst_op3; + HPROTM = prot_op3; + HMASTERM = master_op3; + i_hmastlockm= mastlock_op3; + end // case: 4'b11 + + default : + begin + i_hselm = 1'bx; + HADDRM = {32{1'bx}}; + HAUSERM = {2{1'bx}}; + i_htransm = 2'bxx; + HWRITEM = 1'bx; + HSIZEM = 3'bxxx; + i_hburstm = 3'bxxx; + HPROTM = {4{1'bx}}; + HMASTERM = 4'bxxxx; + i_hmastlockm= 1'bx; + end // case: default + endcase // case(addr_in_port) + end // block: p_addr_mux + + // hsel_lock provides support for AHB masters that address other + // slave regions in the middle of a locked sequence (i.e. HSEL is + // de-asserted during the locked sequence). Unless HMASTLOCK is + // held during these intermediate cycles, the OutputArb scheme will + // lose track of the locked sequence and may allow another input + // port to access the output port which should be locked + assign next_hsel_lock = (i_hselm & i_htransm[1] & i_hmastlockm) ? 1'b1 : + (i_hmastlockm == 1'b0) ? 1'b0 : + hsel_lock; + + // Register hsel_lock + always @ (negedge HRESETn or posedge HCLK) + begin : p_hsel_lock + if (~HRESETn) + hsel_lock <= 1'b0; + else + if (i_hreadymuxm) + hsel_lock <= next_hsel_lock; + end + + // Version of HMASTLOCK which is masked when not selected, unless a + // locked sequence has already begun through this port + assign hlock_arb = i_hmastlockm & (hsel_lock | i_hselm); + + assign HTRANSM = i_htransm; + assign HBURSTM = i_hburstm; + assign HSELM = i_hselm; + assign HMASTLOCKM = i_hmastlockm; + + // Dataport register + always @ (negedge HRESETn or posedge HCLK) + begin : p_data_in_port_reg + if (~HRESETn) + data_in_port <= 2'b11; + else + if (i_hreadymuxm) + data_in_port <= addr_in_port; + end + + // Dataphase register + always @ (negedge HRESETn or posedge HCLK) + begin : p_wdata_phase_reg + if (~HRESETn) + wdata_phase <= 1'b0; + else + if (i_hreadymuxm) + wdata_phase <= i_hselm & i_htransm[1]; + end + + + // HWDATAM output decode + always @ ( + wdata_op0 or + wdata_op1 or + wdata_op2 or + wdata_op3 or + data_in_port or wdata_phase + ) + begin : p_data_mux + // Default value + HWDATAM = {32{1'b0}}; + + // If interface active + if (wdata_phase) + // Decode selection + case (data_in_port) + 2'b00 : HWDATAM = wdata_op0; + 2'b01 : HWDATAM = wdata_op1; + 2'b10 : HWDATAM = wdata_op2; + 2'b11 : HWDATAM = wdata_op3; + default : HWDATAM = {32{1'bx}}; + endcase // case(data_in_port) + end // block: p_data_mux + + // HWUSERM output decode + always @ ( + wuser_op0 or + wuser_op1 or + wuser_op2 or + wuser_op3 or + data_in_port or wdata_phase + ) + begin : p_wuser_mux + // Default value + HWUSERM = {2{1'b0}}; + + // If interface active + if (wdata_phase) + // Decode selection + case (data_in_port) + 2'b00 : HWUSERM = wuser_op0; + 2'b01 : HWUSERM = wuser_op1; + 2'b10 : HWUSERM = wuser_op2; + 2'b11 : HWUSERM = wuser_op3; + default : HWUSERM = {2{1'bx}}; + endcase // case(data_in_port) + end // block: p_wuser_mux + + // --------------------------------------------------------------------------- + // HREADYMUXM generation + // --------------------------------------------------------------------------- + // The HREADY signal on the shared slave is generated directly from + // the shared slave HREADYOUTS if the slave is selected, otherwise + // it mirrors the HREADY signal of the appropriate input port + always @ (negedge HRESETn or posedge HCLK) + begin : p_slave_sel_reg + if (~HRESETn) + slave_sel <= 1'b0; + else + if (i_hreadymuxm) + slave_sel <= i_hselm; + end + + // HREADYMUXM output selection + assign i_hreadymuxm = (slave_sel) ? HREADYOUTM : 1'b1; + + // Drive output with internal version of the signal + assign HREADYMUXM = i_hreadymuxm; + + +endmodule + +// --================================= End ===================================-- diff --git a/Cortex-M0/nanosoc/systems/mcu/verilog/gen_ahb_busmatrix/verilog/src/cmsdk_ahb_bm_burst_arb.v b/Cortex-M0/nanosoc/systems/mcu/verilog/gen_ahb_busmatrix/verilog/src/cmsdk_ahb_bm_burst_arb.v new file mode 100755 index 0000000..013fe59 --- /dev/null +++ b/Cortex-M0/nanosoc/systems/mcu/verilog/gen_ahb_busmatrix/verilog/src/cmsdk_ahb_bm_burst_arb.v @@ -0,0 +1,327 @@ +//----------------------------------------------------------------------------- +// The confidential and proprietary information contained in this file may +// only be used by a person authorised under and to the extent permitted +// by a subsisting licensing agreement from Arm Limited or its affiliates. +// +// (C) COPYRIGHT 2001-<<copyright_year>> Arm Limited or its affiliates. +// ALL RIGHTS RESERVED +// +// This entire notice must be reproduced on all copies of this file +// and copies of this file may only be made by a person if such person is +// permitted to do so under the terms of a subsisting license agreement +// from Arm Limited or its affiliates. +// +// SVN Information +// +// Checked In : $Date: 2017-10-10 15:55:38 +0100 (Tue, 10 Oct 2017) $ +// +// Revision : $Revision: 371321 $ +// +// Release Information : Cortex-M System Design Kit-r1p1-00rel0 +// +//----------------------------------------------------------------------------- +// +//------------------------------------------------------------------------------ +// Abstract : The Output Arbitration is used to determine which +// of the input stages will be given access to the +// shared slave. +// +// Notes : The bus matrix has <<connectivity>> connectivity. +// +//----------------------------------------------------------------------------- + +<<timescale_directive>> + +module <<output_arb_name>> ( + + // Common AHB signals + HCLK , + HRESETn, + + // Input port request signals +//------------------------------ << start in >> -------------------------------- +//----------------------------- << start connection >> ------------------------- + req_port<<in>>, +//------------------------------ << end connection >> -------------------------- +//------------------------------- << end in >> --------------------------------- + + HREADYM, + HSELM, + HTRANSM, + HBURSTM, + HMASTLOCKM, + + // Arbiter outputs + addr_in_port, + no_port + + ); + + +// ----------------------------------------------------------------------------- +// Input and Output declarations +// ----------------------------------------------------------------------------- + + // Common AHB signals + input HCLK; // AHB system clock + input HRESETn; // AHB system reset +//------------------------------ << start in >> -------------------------------- +//----------------------------- << start connection >> ------------------------- + input req_port<<in>>; // Port <<in>> request signal +//------------------------------ << end connection >> -------------------------- +//------------------------------- << end in >> --------------------------------- + input HREADYM; // Transfer done + input HSELM; // Slave select line + input [1:0] HTRANSM; // Transfer type + input [2:0] HBURSTM; // Burst type + input HMASTLOCKM; // Locked transfer + output [<<idw_si>>:0] addr_in_port; // Port address input + output no_port; // No port selected signal + + +// ----------------------------------------------------------------------------- +// Constant declarations +// ----------------------------------------------------------------------------- + +// HTRANS transfer type signal encoding +`define TRN_IDLE 2'b00 // Idle transfer +`define TRN_BUSY 2'b01 // Busy transfer +`define TRN_NONSEQ 2'b10 // NonSequential transfer +`define TRN_SEQ 2'b11 // Sequential transfer + +// HBURST transfer type signal encoding +`define BUR_SINGLE 3'b000 // Single +`define BUR_INCR 3'b001 // Incremental +`define BUR_WRAP4 3'b010 // 4-beat wrap +`define BUR_INCR4 3'b011 // 4-beat Incr +`define BUR_WRAP8 3'b100 // 8-beat wrap +`define BUR_INCR8 3'b101 // 8-beat Incr +`define BUR_WRAP16 3'b110 // 16-beat Wrap +`define BUR_INCR16 3'b111 // 16-beat Incr + + +// ----------------------------------------------------------------------------- +// Wire declarations +// ----------------------------------------------------------------------------- + wire HCLK; // AHB system clock + wire HRESETn; // AHB system reset +//------------------------------ << start in >> -------------------------------- +//----------------------------- << start connection >> ------------------------- + wire req_port<<in>>; // Port <<in>> request signal +//------------------------------ << end connection >> -------------------------- +//------------------------------- << end in >> --------------------------------- + wire HREADYM; // Transfer done + wire HSELM; // Slave select line + wire [1:0] HTRANSM; // Transfer type + wire [2:0] HBURSTM; // Burst type + wire HMASTLOCKM; // Locked transfer + wire [<<idw_si>>:0] addr_in_port; // Address input port + reg no_port; // No port selected signal + +// ----------------------------------------------------------------------------- +// Signal declarations +// ----------------------------------------------------------------------------- + reg [<<idw_si>>:0] addr_in_port_next; // D-input of addr_in_port + reg [<<idw_si>>:0] i_addr_in_port; // Internal version of addr_in_port + reg no_port_next; // D-input of no_port + reg [3:0] next_burst_count; // D-input of reg_burst_count + reg [3:0] reg_burst_count; // Burst counter + reg next_burst_hold; // D-input of reg_burst_hold + reg reg_burst_hold; // Burst hold signal + + // Early burst termination logic + reg [1:0] reg_early_term_count; // Counts number of early terminated bursts + wire [1:0] next_early_term_count; // D-input for reg_early_term_count + +// ----------------------------------------------------------------------------- +// Beginning of main code +// ----------------------------------------------------------------------------- + +// ----------------------------------------------------------------------------- +// BURST TRANSFER COUNTER +// ----------------------------------------------------------------------------- +// +// The Burst counter is used to count down from the number of transfers the +// master should perform and when the counter reaches zero the bus may be +// passed to another master. +// +// reg_burst_count indicates the number of transfers remaining in the +// current fixed length burst. +// reg_burst_hold is actually a decode of reg_burst_count=0 but is driven from a register +// to improve timing + + always @ (HTRANSM or HSELM or HBURSTM or reg_burst_count or reg_burst_hold or reg_early_term_count) + begin : p_next_burst_count_comb + // Force the Burst logic to reset if this port is de-selected. This can + // happen for two reasons: + // 1. The master performs 2 fixed-length bursts back-to-back, but the + // second is to an alternate output port + // 2. The master is performing a fixed-length burst but is de-granted mid- + // way by a local AHB Arbiter + if (!HSELM) + begin + next_burst_count = 4'b0000; + next_burst_hold = 1'b0; + end + + // Burst logic is initialised on a NONSEQ transfer (i.e. start of burst) + // IDLE transfers cause the logic to reset + // BUSY transfers pause the decrementer + // SEQ transfers decrement the counter + else + case (HTRANSM) + + `TRN_NONSEQ : begin + case (HBURSTM) + `BUR_INCR16, `BUR_WRAP16 : begin + next_burst_count = 4'b1111; + next_burst_hold = 1'b1; + end // case: BUR_INCR16 | BUR_WRAP16 + + `BUR_INCR8, `BUR_WRAP8 : begin + next_burst_count = 4'b0111; + next_burst_hold = 1'b1; + end // case: BUR_INCR8 | BUR_WRAP8 + + `BUR_INCR4, `BUR_WRAP4 : begin + next_burst_count = 4'b0011; + next_burst_hold = 1'b1; + end // case: BUR_INCR4 | BUR_WRAP4 + + `BUR_SINGLE, `BUR_INCR : begin + next_burst_count = 4'b0000; + next_burst_hold = 1'b0; + end // case: BUR_SINGLE | BUR_INCR + + default : begin + next_burst_count = 4'bxxxx; + next_burst_hold = 1'bx; + end // case: default + endcase // case(HBURSTM) + + // Prevent early burst termination from keeping hold of the port + if (reg_early_term_count == 2'b10) + begin + next_burst_hold = 1'b0; + next_burst_count = 4'd0; + end + + + end // case: `TRN_NONSEQ + + `TRN_SEQ : begin + next_burst_count = reg_burst_count - 4'b1; + if (reg_burst_count == 4'b0001) + next_burst_hold = 1'b0; + else + next_burst_hold = reg_burst_hold; + end // case: `TRN_SEQ + + `TRN_BUSY : begin + next_burst_count = reg_burst_count; + next_burst_hold = reg_burst_hold; + end // case: `TRN_BUSY + + `TRN_IDLE : begin + next_burst_count = 4'b0000; + next_burst_hold = 1'b0; + end // case: `TRN_IDLE + + default : begin + next_burst_count = 4'bxxxx; + next_burst_hold = 1'bx; + end // case: default + + endcase // case(HTRANSM) + end // block: p_next_burst_countComb + + + assign next_early_term_count = (!next_burst_hold) ? 2'b00 : + (reg_burst_hold & (HTRANSM == `TRN_NONSEQ)) ? + reg_early_term_count + 2'b1 : + reg_early_term_count; + + // Sequential process + always @ (negedge HRESETn or posedge HCLK) + begin : p_burst_seq + if (!HRESETn) + begin + reg_burst_count <= 4'b0000; + reg_burst_hold <= 1'b0; + reg_early_term_count <= 2'b00; + end // if (HRESETn == 1'b0) + else + if (HREADYM) + begin + reg_burst_count <= next_burst_count; + reg_burst_hold <= next_burst_hold; + reg_early_term_count <= next_early_term_count; + end + end // block: p_burst_seq + + +// ----------------------------------------------------------------------------- +// Port Selection +// ----------------------------------------------------------------------------- +// The Output Arbitration function looks at all the requests to use the +// output port and determines which is the highest priority request. This +// version of the arbitration logic uses a fixed priority scheme that is +// gated by a tracking function of the burst boundary. Input port 0 is the +// highest priority, input port 1 is the second highest priority, etc. +// If none of the input ports are requesting then the current port will +// remain active if it is performing IDLE transfers to the selected slave. If +// this is not the case then the no_port signal will be asserted which +// indicates that no input port should be selected. + + always @ ( +//------------------------------ << start in >> -------------------------------- +//----------------------------- << start connection >> ------------------------- + req_port<<in>> or +//------------------------------ << end connection >> -------------------------- +//------------------------------- << end in >> --------------------------------- + HSELM or HTRANSM or HMASTLOCKM or next_burst_hold or i_addr_in_port + ) + begin : p_sel_port_comb + // Default values are used for addr_in_port_next and no_port_next + no_port_next = 1'b0; + addr_in_port_next = i_addr_in_port; + + if ( HMASTLOCKM | next_burst_hold ) + addr_in_port_next = i_addr_in_port; +//------------------------------ << start in >> -------------------------------- +//----------------------------- << start connection >> ------------------------- + else if ( req_port<<in>> | ( (i_addr_in_port == <<idw_si_v>>'b<<bin_in>>) & HSELM & + (HTRANSM != 2'b00) ) ) + addr_in_port_next = <<idw_si_v>>'b<<bin_in>>; +//------------------------------ << end connection >> -------------------------- +//------------------------------- << end in >> --------------------------------- + else if (HSELM) + addr_in_port_next = i_addr_in_port; + else + no_port_next = 1'b1; + end // block: p_sel_port_comb + + + // Sequential process + always @ (negedge HRESETn or posedge HCLK) + begin : p_addr_in_port_reg + if (!HRESETn) + begin + no_port <= 1'b1; + i_addr_in_port <= {<<idw_si_v>>{1'b0}}; + end + else + if (HREADYM) + begin + no_port <= no_port_next; + i_addr_in_port <= addr_in_port_next; + end + end // block: p_addr_in_port_reg + + // Drive output with internal version + assign addr_in_port = i_addr_in_port; + + +endmodule + +// --================================= End ===================================-- diff --git a/Cortex-M0/nanosoc/systems/mcu/verilog/gen_ahb_busmatrix/verilog/src/cmsdk_ahb_bm_decode.v b/Cortex-M0/nanosoc/systems/mcu/verilog/gen_ahb_busmatrix/verilog/src/cmsdk_ahb_bm_decode.v new file mode 100755 index 0000000..bd24a8d --- /dev/null +++ b/Cortex-M0/nanosoc/systems/mcu/verilog/gen_ahb_busmatrix/verilog/src/cmsdk_ahb_bm_decode.v @@ -0,0 +1,458 @@ +//----------------------------------------------------------------------------- +// The confidential and proprietary information contained in this file may +// only be used by a person authorised under and to the extent permitted +// by a subsisting licensing agreement from Arm Limited or its affiliates. +// +// (C) COPYRIGHT 2001-<<copyright_year>> Arm Limited or its affiliates. +// ALL RIGHTS RESERVED +// +// This entire notice must be reproduced on all copies of this file +// and copies of this file may only be made by a person if such person is +// permitted to do so under the terms of a subsisting license agreement +// from Arm Limited or its affiliates. +// +// SVN Information +// +// Checked In : $Date: 2017-10-10 15:55:38 +0100 (Tue, 10 Oct 2017) $ +// +// Revision : $Revision: 371321 $ +// +// Release Information : Cortex-M System Design Kit-r1p1-00rel0 +// +//----------------------------------------------------------------------------- +// +//----------------------------------------------------------------------------- +// Abstract : The MatrixDecode is used to determine which output +// stage is required for a particular access. Addresses +// that do not map to an Output port are diverted to +// the local default slave. +// +// Notes : The bus matrix has <<connectivity>> connectivity. +// +//----------------------------------------------------------------------------- + +<<timescale_directive>> + +module <<matrix_decode_name>> ( + + // Common AHB signals + HCLK, + HRESETn, + +//---------------------------- << start remap >> ------------------------------- + // Internal address remapping control + remapping_dec, + +//----------------------------- << end remap >> -------------------------------- + // Signals from the Input stage + HREADYS, + sel_dec, + decode_addr_dec, + trans_dec, + +//----------------------------- << start out >> -------------------------------- +//----------------------------- << start connection >> ------------------------- + // Bus-switch output <<out>> + active_dec<<out>>, + readyout_dec<<out>>, + resp_dec<<out>>, + rdata_dec<<out>>, +//---------------------------- << start user >> -------------------------------- + ruser_dec<<out>>, +//----------------------------- << end user >> --------------------------------- + +//------------------------------ << end connection >> -------------------------- +//------------------------------ << end out >> --------------------------------- + // Output port selection signals +//----------------------------- << start out >> -------------------------------- +//----------------------------- << start connection >> ------------------------- + sel_dec<<out>>, +//------------------------------ << end connection >> -------------------------- +//------------------------------ << end out >> --------------------------------- + + // Selected Output port data and control signals + active_dec, + HREADYOUTS, + HRESPS, +//---------------------------- << start user >> -------------------------------- + HRUSERS, +//----------------------------- << end user >> --------------------------------- + HRDATAS + + ); + + +// ----------------------------------------------------------------------------- +// Input and Output declarations +// ----------------------------------------------------------------------------- + + // Common AHB signals + input HCLK; // AHB System Clock + input HRESETn; // AHB System Reset + +//---------------------------- << start remap >> ------------------------------- + // Internal address remapping control + input [<<idw_remap>>:0] remapping_dec; // Internal remap signal + +//----------------------------- << end remap >> -------------------------------- + // Signals from the Input stage + input HREADYS; // Transfer done + input sel_dec; // HSEL input + input [<<addr>>:10] decode_addr_dec; // HADDR decoder input + input [1:0] trans_dec; // Input port HTRANS signal + +//----------------------------- << start out >> -------------------------------- +//----------------------------- << start connection >> ------------------------- + // Bus-switch output MI<<out>> + input active_dec<<out>>; // Output stage MI<<out>> active_dec signal + input readyout_dec<<out>>; // HREADYOUT input + input [<<resp>>:0] resp_dec<<out>>; // HRESP input + input [<<data>>:0] rdata_dec<<out>>; // HRDATA input +//---------------------------- << start user >> -------------------------------- + input [<<user>>:0] ruser_dec<<out>>; // HRUSER input +//----------------------------- << end user >> --------------------------------- + +//------------------------------ << end connection >> -------------------------- +//------------------------------ << end out >> --------------------------------- + // Output port selection signals +//----------------------------- << start out >> -------------------------------- +//----------------------------- << start connection >> ------------------------- + output sel_dec<<out>>; // HSEL output +//------------------------------ << end connection >> -------------------------- +//------------------------------ << end out >> --------------------------------- + + // Selected Output port data and control signals + output active_dec; // Combinatorial active_dec O/P + output HREADYOUTS; // HREADY feedback output + output [<<resp>>:0] HRESPS; // Transfer response +//---------------------------- << start user >> -------------------------------- + output [<<user>>:0] HRUSERS; // User read Data +//----------------------------- << end user >> --------------------------------- + output [<<data>>:0] HRDATAS; // Read Data + + +// ----------------------------------------------------------------------------- +// Wire declarations +// ----------------------------------------------------------------------------- + + // Common AHB signals + wire HCLK; // AHB System Clock + wire HRESETn; // AHB System Reset +//---------------------------- << start remap >> ------------------------------- + // Internal address remapping control + wire [<<idw_remap>>:0] remapping_dec; // Internal remap signal +//----------------------------- << end remap >> -------------------------------- + + // Signals from the Input stage + wire HREADYS; // Transfer done + wire sel_dec; // HSEL input + wire [<<addr>>:10] decode_addr_dec; // HADDR input + wire [1:0] trans_dec; // Input port HTRANS signal + +//----------------------------- << start out >> -------------------------------- +//----------------------------- << start connection >> ------------------------- + // Bus-switch output MI<<out>> + wire active_dec<<out>>; // active_dec signal + wire readyout_dec<<out>>; // HREADYOUT input + wire [<<resp>>:0] resp_dec<<out>>; // HRESP input + wire [<<data>>:0] rdata_dec<<out>>; // HRDATA input +//---------------------------- << start user >> -------------------------------- + wire [<<user>>:0] ruser_dec<<out>>; // HRUSER input +//----------------------------- << end user >> --------------------------------- + reg sel_dec<<out>>; // HSEL output + +//------------------------------ << end connection >> -------------------------- +//------------------------------ << end out >> --------------------------------- + +// ----------------------------------------------------------------------------- +// Signal declarations +// ----------------------------------------------------------------------------- + + // Selected Output port data and control signals + reg active_dec; // Combinatorial active_dec O/P signal + reg HREADYOUTS; // Combinatorial HREADYOUT signal + reg [<<resp>>:0] HRESPS; // Combinatorial HRESPS signal +//---------------------------- << start user >> -------------------------------- + reg [<<user>>:0] HRUSERS; +//----------------------------- << end user >> --------------------------------- + reg [<<data>>:0] HRDATAS; // Read data bus + + reg [<<idw_mi>>:0] addr_out_port; // Address output ports + reg [<<idw_mi>>:0] data_out_port; // Data output ports + + // Default slave signals + reg sel_dft_slv; // HSEL signal + wire readyout_dft_slv; // HREADYOUT signal + wire [<<resp>>:0] resp_dft_slv; // Combinatorial HRESPS signal + + +// ----------------------------------------------------------------------------- +// Beginning of main code +// ----------------------------------------------------------------------------- + +//------------------------------------------------------------------------------ +// Default slave (accessed when HADDR is unmapped) +//------------------------------------------------------------------------------ + + <<default_slave_name>> u_<<default_slave_name>> ( + + // Common AHB signals + .HCLK (HCLK), + .HRESETn (HRESETn), + + // AHB Control signals + .HSEL (sel_dft_slv), + .HTRANS (trans_dec), + .HREADY (HREADYS), + .HREADYOUT (readyout_dft_slv), + .HRESP (resp_dft_slv) + + ); + + +//------------------------------------------------------------------------------ +// Address phase signals +//------------------------------------------------------------------------------ + +// The address decode is done in two stages. This is so that the address +// decode occurs in only one process, p_addr_out_portComb, and then the select +// signal is factored in. +// +// Note that the hexadecimal address values are reformatted to align with the +// lower bound of decode_addr_dec[<<addr>>:10], which is not a hex character boundary + + always @ ( +//----------------------------- << start map >> -------------------------------- + decode_addr_dec or data_out_port or trans_dec +//----------------------------- << end map >> ---------------------------------- +//---------------------------- << start remap >> ------------------------------- + decode_addr_dec or + remapping_dec or data_out_port or trans_dec +//----------------------------- << end remap >> -------------------------------- + ) + begin : p_addr_out_port_comb + + // Only switch if there is an active transfer + if (trans_dec != 2'b00) + begin + +//----------------------------- << start map >> -------------------------------- +//----------------------------- << start out >> -------------------------------- +//----------------------------- << start addr_map >> --------------------------- +//----------------------------- << start addr_region >> ------------------------ + // Address region <<address_map>> + <<mdelse>>if ((decode_addr_dec >= <<mem_lo>>) & (decode_addr_dec <= <<mem_hi>>)) + addr_out_port = <<idw_mi_v>>'b0<<bin_out>>; // Select Output port MI<<out>> +//------------------------------ << end addr_region >> ------------------------- + +//----------------------------- << end addr_map >> ----------------------------- +//------------------------------ << end out >> --------------------------------- + else + addr_out_port = <<idw_mi_v>>'b<<dsid_bin>>; // Select the default slave +//----------------------------- << end map >> ---------------------------------- +//---------------------------- << start remap >> ------------------------------- + case (remapping_dec) // Composition: <<remapping_vector>> +//----------------------------- << start remap_state >> ------------------------ + <<idw_remap_v>>'b<<bin_remapstate>> : begin +//----------------------------- << start remap_bit >> -------------------------- +//----------------------------- << start addr_remap >> ------------------------- +//----------------------------- << start remap_region >> ----------------------- + // Remapped address region <<address_map>> due to REMAP[<<remapping_bit>>] + <<mdelse>>if ((decode_addr_dec >= <<mem_lo>>) & (decode_addr_dec <= <<mem_hi>>)) + addr_out_port = <<idw_mi_v>>'b0<<bin_out>>; // Select Output port MI<<out>> + +//------------------------------ << end remap_region >> ------------------------- +//----------------------------- << end addr_remap >> --------------------------- +//------------------------------ << end remap_bit >> --------------------------- +//----------------------------- << start out >> -------------------------------- +//----------------------------- << start addr_map >> --------------------------- +//----------------------------- << start addr_region >> ------------------------ + // <<region_type>> address region <<address_map>> + <<mdelse>>if ((decode_addr_dec >= <<mem_lo>>) & (decode_addr_dec <= <<mem_hi>>)) + addr_out_port = <<idw_mi_v>>'b0<<bin_out>>; // Select Output port MI<<out>> +//------------------------------ << end addr_region >> ------------------------- + +//----------------------------- << end addr_map >> ----------------------------- +//------------------------------ << end out >> --------------------------------- + else + addr_out_port = <<idw_mi_v>>'b<<dsid_bin>>; // Select the default slave + end + +//------------------------------ << end remap_state >> ------------------------- + default : addr_out_port = {<<idw_mi_v>>{1'bx}}; + endcase +//----------------------------- << end remap >> -------------------------------- + + end // if (trans_dec != 2'b00) + else + addr_out_port = data_out_port; // Stay on last port if no activity + + end // block: p_addr_out_port_comb + + // Select signal decode + always @ (sel_dec or addr_out_port) + begin : p_sel_comb +//----------------------------- << start out >> -------------------------------- +//----------------------------- << start connection >> ------------------------- + sel_dec<<out>> = 1'b0; +//------------------------------ << end connection >> -------------------------- +//------------------------------ << end out >> --------------------------------- + sel_dft_slv = 1'b0; + + if (sel_dec) + case (addr_out_port) +//----------------------------- << start out >> -------------------------------- +//----------------------------- << start connection >> ------------------------- + <<idw_mi_v>>'b0<<bin_out>> : sel_dec<<out>> = 1'b1; +//------------------------------ << end connection >> -------------------------- +//------------------------------ << end out >> --------------------------------- + <<idw_mi_v>>'b<<dsid_bin>> : sel_dft_slv = 1'b1; // Select the default slave + default : begin +//----------------------------- << start out >> -------------------------------- +//----------------------------- << start connection >> ------------------------- + sel_dec<<out>> = 1'bx; +//------------------------------ << end connection >> -------------------------- +//------------------------------ << end out >> --------------------------------- + sel_dft_slv = 1'bx; + end + endcase // case(addr_out_port) + end // block: p_sel_comb + +// The decoder selects the appropriate active_dec signal depending on which +// output stage is required for the transfer. + always @ ( +//----------------------------- << start out >> -------------------------------- +//----------------------------- << start connection >> ------------------------- + active_dec<<out>> or +//------------------------------ << end connection >> -------------------------- +//------------------------------ << end out >> --------------------------------- + addr_out_port + ) + begin : p_active_comb + case (addr_out_port) +//----------------------------- << start out >> -------------------------------- +//----------------------------- << start connection >> ------------------------- + <<idw_mi_v>>'b0<<bin_out>> : active_dec = active_dec<<out>>; +//------------------------------ << end connection >> -------------------------- +//------------------------------ << end out >> --------------------------------- + <<idw_mi_v>>'b<<dsid_bin>> : active_dec = 1'b1; // Select the default slave + default : active_dec = 1'bx; + endcase // case(addr_out_port) + end // block: p_active_comb + + +//------------------------------------------------------------------------------ +// Data phase signals +//------------------------------------------------------------------------------ + +// The data_out_port needs to be updated when HREADY from the input stage is high. +// Note: HREADY must be used, not HREADYOUT, because there are occaisions +// (namely when the holding register gets loaded) when HREADYOUT may be low +// but HREADY is high, and in this case it is important that the data_out_port +// gets updated. +// When the port is inactive, the default slave is selected to prevent toggling. + + always @ (negedge HRESETn or posedge HCLK) + begin : p_data_out_port_seq + if (~HRESETn) + data_out_port <= <<idw_mi_v>>'b<<dsid_bin>>; + else + if (HREADYS) + if (sel_dec & trans_dec[1]) + data_out_port <= addr_out_port; + else + data_out_port <= <<idw_mi_v>>'b<<dsid_bin>>; + end // block: p_data_out_port_seq + + // HREADYOUTS output decode + always @ ( + readyout_dft_slv or +//----------------------------- << start out >> -------------------------------- +//----------------------------- << start connection >> ------------------------- + readyout_dec<<out>> or +//------------------------------ << end connection >> -------------------------- +//------------------------------ << end out >> --------------------------------- + data_out_port + ) + begin : p_ready_comb + case (data_out_port) +//----------------------------- << start out >> -------------------------------- +//----------------------------- << start connection >> ------------------------- + <<idw_mi_v>>'b0<<bin_out>> : HREADYOUTS = readyout_dec<<out>>; +//------------------------------ << end connection >> -------------------------- +//------------------------------ << end out >> --------------------------------- + <<idw_mi_v>>'b<<dsid_bin>> : HREADYOUTS = readyout_dft_slv; // Select the default slave + default : HREADYOUTS = 1'bx; + endcase // case(data_out_port) + end // block: p_ready_comb + + // HRESPS output decode + always @ ( + resp_dft_slv or +//----------------------------- << start out >> -------------------------------- +//----------------------------- << start connection >> ------------------------- + resp_dec<<out>> or +//------------------------------ << end connection >> -------------------------- +//------------------------------ << end out >> --------------------------------- + data_out_port + ) + begin : p_resp_comb + case (data_out_port) +//----------------------------- << start out >> -------------------------------- +//----------------------------- << start connection >> ------------------------- + <<idw_mi_v>>'b0<<bin_out>> : HRESPS = resp_dec<<out>>; +//------------------------------ << end connection >> -------------------------- +//------------------------------ << end out >> --------------------------------- + <<idw_mi_v>>'b<<dsid_bin>> : HRESPS = resp_dft_slv; // Select the default slave + default : HRESPS = {<<resp_v>>{1'bx}}; + endcase // case (data_out_port) + end // block: p_resp_comb + + // HRDATAS output decode + always @ ( +//----------------------------- << start out >> -------------------------------- +//----------------------------- << start connection >> ------------------------- + rdata_dec<<out>> or +//------------------------------ << end connection >> -------------------------- +//------------------------------ << end out >> --------------------------------- + data_out_port + ) + begin : p_rdata_comb + case (data_out_port) +//----------------------------- << start out >> -------------------------------- +//----------------------------- << start connection >> ------------------------- + <<idw_mi_v>>'b0<<bin_out>> : HRDATAS = rdata_dec<<out>>; +//------------------------------ << end connection >> -------------------------- +//------------------------------ << end out >> --------------------------------- + <<idw_mi_v>>'b<<dsid_bin>> : HRDATAS = {<<data_v>>{1'b0}}; // Select the default slave + default : HRDATAS = {<<data_v>>{1'bx}}; + endcase // case (data_out_port) + end // block: p_rdata_comb +//---------------------------- << start user >> -------------------------------- + + // HRUSERS output decode + always @ ( +//----------------------------- << start out >> -------------------------------- +//----------------------------- << start connection >> ------------------------- + ruser_dec<<out>> or +//------------------------------ << end connection >> -------------------------- +//------------------------------ << end out >> --------------------------------- + data_out_port + ) + begin : p_ruser_comb + case (data_out_port) +//----------------------------- << start out >> -------------------------------- +//----------------------------- << start connection >> ------------------------- + <<idw_mi_v>>'b0<<bin_out>> : HRUSERS = ruser_dec<<out>>; +//------------------------------ << end connection >> -------------------------- +//------------------------------ << end out >> --------------------------------- + <<idw_mi_v>>'b<<dsid_bin>> : HRUSERS = {<<user_v>>{1'b0}}; // Select the default slave + default : HRUSERS = {<<user_v>>{1'bx}}; + endcase // case (data_out_port) + end // block: p_ruser_comb +//----------------------------- << end user >> --------------------------------- + + +endmodule + +// --================================= End ===================================-- diff --git a/Cortex-M0/nanosoc/systems/mcu/verilog/gen_ahb_busmatrix/verilog/src/cmsdk_ahb_bm_default_slave.v b/Cortex-M0/nanosoc/systems/mcu/verilog/gen_ahb_busmatrix/verilog/src/cmsdk_ahb_bm_default_slave.v new file mode 100755 index 0000000..a965f5d --- /dev/null +++ b/Cortex-M0/nanosoc/systems/mcu/verilog/gen_ahb_busmatrix/verilog/src/cmsdk_ahb_bm_default_slave.v @@ -0,0 +1,141 @@ +//----------------------------------------------------------------------------- +// The confidential and proprietary information contained in this file may +// only be used by a person authorised under and to the extent permitted +// by a subsisting licensing agreement from Arm Limited or its affiliates. +// +// (C) COPYRIGHT 2001-<<copyright_year>> Arm Limited or its affiliates. +// ALL RIGHTS RESERVED +// +// This entire notice must be reproduced on all copies of this file +// and copies of this file may only be made by a person if such person is +// permitted to do so under the terms of a subsisting license agreement +// from Arm Limited or its affiliates. +// +// SVN Information +// +// Checked In : $Date: 2017-10-10 15:55:38 +0100 (Tue, 10 Oct 2017) $ +// +// Revision : $Revision: 371321 $ +// +// Release Information : Cortex-M System Design Kit-r1p1-00rel0 +// +//----------------------------------------------------------------------------- +// +// ----------------------------------------------------------------------------- +// Abstract : Default slave used to drive the slave response signals +// when there are no other slaves selected. +//----------------------------------------------------------------------------- + +<<timescale_directive>> + +module <<default_slave_name>> ( + + // Common AHB signals + HCLK, + HRESETn, + + // AHB control input signals + HSEL, + HTRANS, + HREADY, + + // AHB control output signals + HREADYOUT, + HRESP + + ); + + +// ----------------------------------------------------------------------------- +// Input and Output declarations +// ----------------------------------------------------------------------------- + + // Common AHB signals + input HCLK; // AHB System Clock + input HRESETn; // AHB System Reset + + // AHB control input signals + input HSEL; // Slave Select + input [1:0] HTRANS; // Transfer type + input HREADY; // Transfer done + + // AHB control output signals + output HREADYOUT; // HREADY feedback + output [<<resp>>:0] HRESP; // Transfer response + + +// ----------------------------------------------------------------------------- +// Constant declarations +// ----------------------------------------------------------------------------- + +// HRESP transfer response signal encoding +`define RSP_OKAY <<resp_v>>'b<<bin_resp_okay>> // OKAY response +`define RSP_ERROR <<resp_v>>'b<<bin_resp_error>> // ERROR response +`define RSP_RETRY <<resp_v>>'b<<bin_resp_retry>> // RETRY response +`define RSP_SPLIT <<resp_v>>'b<<bin_resp_split>> // SPLIT response +//----------------------------- << start excl >> ------------------------------- +`define RSP_XFAIL <<resp_v>>'b<<bin_resp_xfail>>; // XFAIL response +//------------------------------ << end excl >> -------------------------------- + + +// ----------------------------------------------------------------------------- +// Input and Output declarations +// ----------------------------------------------------------------------------- + + // Common AHB signals + wire HCLK; // AHB System Clock + wire HRESETn; // AHB System Reset + + // AHB control input signals + wire HSEL; // Slave Select + wire [1:0] HTRANS; // Transfer type + wire HREADY; // Transfer done + + // AHB control output signals + wire HREADYOUT; // HREADY feedback + wire [<<resp>>:0] HRESP; // Transfer response + + +// ----------------------------------------------------------------------------- +// Signal declarations +// ----------------------------------------------------------------------------- + + wire invalid; // Set during invalid transfer + wire hready_next; // Controls generation of HREADYOUT output + reg i_hreadyout; // HREADYOUT register + wire [<<resp>>:0] hresp_next; // Generated response + reg [<<resp>>:0] i_hresp; // HRESP register + + +// ----------------------------------------------------------------------------- +// Beginning of main code +// ----------------------------------------------------------------------------- + + assign invalid = ( HREADY & HSEL & HTRANS[1] ); + assign hready_next = i_hreadyout ? ~invalid : 1'b1 ; + assign hresp_next = invalid ? `RSP_ERROR : `RSP_OKAY; + + always @(negedge HRESETn or posedge HCLK) + begin : p_resp_seq + if (~HRESETn) + begin + i_hreadyout <= 1'b1; + i_hresp <= `RSP_OKAY; + end + else + begin + i_hreadyout <= hready_next; + + if (i_hreadyout) + i_hresp <= hresp_next; + end + end + + // Drive outputs with internal versions + assign HREADYOUT = i_hreadyout; + assign HRESP = i_hresp; + + +endmodule + +// --================================= End ===================================-- diff --git a/Cortex-M0/nanosoc/systems/mcu/verilog/gen_ahb_busmatrix/verilog/src/cmsdk_ahb_bm_fixed_arb.v b/Cortex-M0/nanosoc/systems/mcu/verilog/gen_ahb_busmatrix/verilog/src/cmsdk_ahb_bm_fixed_arb.v new file mode 100755 index 0000000..b10b090 --- /dev/null +++ b/Cortex-M0/nanosoc/systems/mcu/verilog/gen_ahb_busmatrix/verilog/src/cmsdk_ahb_bm_fixed_arb.v @@ -0,0 +1,179 @@ +//----------------------------------------------------------------------------- +// The confidential and proprietary information contained in this file may +// only be used by a person authorised under and to the extent permitted +// by a subsisting licensing agreement from Arm Limited or its affiliates. +// +// (C) COPYRIGHT 2001-<<copyright_year>> Arm Limited or its affiliates. +// ALL RIGHTS RESERVED +// +// This entire notice must be reproduced on all copies of this file +// and copies of this file may only be made by a person if such person is +// permitted to do so under the terms of a subsisting license agreement +// from Arm Limited or its affiliates. +// +// SVN Information +// +// Checked In : $Date: 2017-10-10 15:55:38 +0100 (Tue, 10 Oct 2017) $ +// +// Revision : $Revision: 371321 $ +// +// Release Information : Cortex-M System Design Kit-r1p1-00rel0 +// +//----------------------------------------------------------------------------- +// +//------------------------------------------------------------------------------ +// Abstract : The Output Arbitration is used to determine which +// of the input stages will be given access to the +// shared slave. +// +// Notes : The bus matrix has <<connectivity>> connectivity. +// +//----------------------------------------------------------------------------- + +<<timescale_directive>> + +module <<output_arb_name>> ( + + // Common AHB signals + HCLK , + HRESETn, + + // Input port request signals +//------------------------------ << start in >> -------------------------------- +//----------------------------- << start connection >> ------------------------- + req_port<<in>>, +//------------------------------ << end connection >> -------------------------- +//------------------------------- << end in >> --------------------------------- + + HREADYM, + HSELM, + HTRANSM, + HBURSTM, + HMASTLOCKM, + + // Arbiter outputs + addr_in_port, + no_port + + ); + + +// ----------------------------------------------------------------------------- +// Input and Output declarations +// ----------------------------------------------------------------------------- + + // Common AHB signals + input HCLK; // AHB system clock + input HRESETn; // AHB system reset + +//------------------------------ << start in >> -------------------------------- +//----------------------------- << start connection >> ------------------------- + input req_port<<in>>; // Port <<in>> request signal +//------------------------------ << end connection >> -------------------------- +//------------------------------- << end in >> --------------------------------- + + input HREADYM; // Transfer done + input HSELM; // Slave select line + input [1:0] HTRANSM; // Transfer type + input [2:0] HBURSTM; // Burst type + input HMASTLOCKM; // Locked transfer + + output [<<idw_si>>:0] addr_in_port; // Port address input + output no_port; // No port selected signal + + +// ----------------------------------------------------------------------------- +// Wire declarations +// ----------------------------------------------------------------------------- + wire HCLK; // AHB system clock + wire HRESETn; // AHB system reset +//------------------------------ << start in >> -------------------------------- +//----------------------------- << start connection >> ------------------------- + wire req_port<<in>>; // Port <<in>> request signal +//------------------------------ << end connection >> -------------------------- +//------------------------------- << end in >> --------------------------------- + wire HREADYM; // Transfer done + wire HSELM; // Slave select line + wire [1:0] HTRANSM; // Transfer type + wire HMASTLOCKM; // Locked transfer + wire [<<idw_si>>:0] addr_in_port; // Port address input + reg no_port; // No port selected signal + + +// ----------------------------------------------------------------------------- +// Signal declarations +// ----------------------------------------------------------------------------- + reg [<<idw_si>>:0] addr_in_port_next; // D-input of addr_in_port + reg [<<idw_si>>:0] iaddr_in_port; // Internal version of addr_in_port + reg no_port_next; // D-input of no_port + + +// ----------------------------------------------------------------------------- +// Beginning of main code +// ----------------------------------------------------------------------------- +//------------------------------------------------------------------------------ +// Port Selection +//------------------------------------------------------------------------------ +// The Output Arbitration function looks at all the requests to use the +// output port and determines which is the highest priority request. This +// version of the arbitration logic uses a fixed priority scheme where input +// port 0 is the highest priority, input port 1 is the second highest +// priority, etc. +// If none of the input ports are requesting then the current port will +// remain active if it is performing IDLE transfers to the selected slave. If +// this is not the case then the no_port signal will be asserted which +// indicates that no input port should be selected. + + always @ ( +//------------------------------ << start in >> -------------------------------- +//----------------------------- << start connection >> ------------------------- + req_port<<in>> or +//------------------------------ << end connection >> -------------------------- +//------------------------------- << end in >> --------------------------------- + HSELM or HTRANSM or HMASTLOCKM or iaddr_in_port + ) + + begin : p_sel_port_comb + // Default values are used for addr_in_port_next and no_port_next + no_port_next = 1'b0; + addr_in_port_next = iaddr_in_port; + + if (HMASTLOCKM) + addr_in_port_next = iaddr_in_port; +//------------------------------ << start in >> -------------------------------- +//----------------------------- << start connection >> ------------------------- + else if ( req_port<<in>> | ( (iaddr_in_port == <<idw_si_v>>'b<<bin_in>>) & HSELM & + (HTRANSM != 2'b00) ) ) + addr_in_port_next = <<idw_si_v>>'b<<bin_in>>; +//------------------------------ << end connection >> -------------------------- +//------------------------------- << end in >> --------------------------------- + else if (HSELM) + addr_in_port_next = iaddr_in_port; + else + no_port_next = 1'b1; + end // block: p_sel_port_comb + + + // Sequential process + always @ (negedge HRESETn or posedge HCLK) + begin : p_addr_in_port_reg + if (~HRESETn) + begin + no_port <= 1'b1; + iaddr_in_port <= {<<idw_si_v>>{1'b0}}; + end + else + if (HREADYM) + begin + no_port <= no_port_next; + iaddr_in_port <= addr_in_port_next; + end + end // block: p_addr_in_port_reg + + // Drive output with internal version + assign addr_in_port = iaddr_in_port; + + +endmodule + +// --================================= End ===================================-- diff --git a/Cortex-M0/nanosoc/systems/mcu/verilog/gen_ahb_busmatrix/verilog/src/cmsdk_ahb_bm_input_stage.v b/Cortex-M0/nanosoc/systems/mcu/verilog/gen_ahb_busmatrix/verilog/src/cmsdk_ahb_bm_input_stage.v new file mode 100755 index 0000000..747c171 --- /dev/null +++ b/Cortex-M0/nanosoc/systems/mcu/verilog/gen_ahb_busmatrix/verilog/src/cmsdk_ahb_bm_input_stage.v @@ -0,0 +1,544 @@ +//----------------------------------------------------------------------------- +// The confidential and proprietary information contained in this file may +// only be used by a person authorised under and to the extent permitted +// by a subsisting licensing agreement from Arm Limited or its affiliates. +// +// (C) COPYRIGHT 2001-<<copyright_year>> Arm Limited or its affiliates. +// ALL RIGHTS RESERVED +// +// This entire notice must be reproduced on all copies of this file +// and copies of this file may only be made by a person if such person is +// permitted to do so under the terms of a subsisting license agreement +// from Arm Limited or its affiliates. +// +// SVN Information +// +// Checked In : $Date: 2017-10-10 15:55:38 +0100 (Tue, 10 Oct 2017) $ +// +// Revision : $Revision: 371321 $ +// +// Release Information : Cortex-M System Design Kit-r1p1-00rel0 +// +//----------------------------------------------------------------------------- +// +//------------------------------------------------------------------------------ +// Abstract : The Input Stage is used to hold a pending transfer +// when the required output stage is not available. +//---------------------------- << start unalign >> ----------------------------- +// Supports ARMv6 AMBA extensions for unaligned access. +//----------------------------- << end unalign >> ------------------------------ +//----------------------------- << start excl >> ------------------------------- +// Supports ARMv6 AMBA extensions for exclusive access. +//------------------------------ << end excl >> -------------------------------- +// +//----------------------------------------------------------------------------- + +<<timescale_directive>> + +module <<input_stage_name>> ( + + // Common AHB signals + HCLK, + HRESETn, + + // Input Port Address/Control Signals + HSELS, + HADDRS, +//---------------------------- << start user >> -------------------------------- + HAUSERS, +//----------------------------- << end user >> --------------------------------- + HTRANSS, + HWRITES, + HSIZES, + HBURSTS, + HPROTS, +//---------------------------- << start unalign >> ----------------------------- + HUNALIGNS, + HBSTRBS, +//----------------------------- << end unalign >> ------------------------------ + HMASTERS, + HMASTLOCKS, + HREADYS, + + // Internal Response + active_ip, + readyout_ip, + resp_ip, + + // Input Port Response + HREADYOUTS, + HRESPS, + + // Internal Address/Control Signals + sel_ip, + addr_ip, +//---------------------------- << start user >> -------------------------------- + auser_ip, +//----------------------------- << end user >> --------------------------------- + trans_ip, + write_ip, + size_ip, + burst_ip, + prot_ip, +//---------------------------- << start unalign >> ----------------------------- + unalign_ip, + bstrb_ip, +//----------------------------- << end unalign >> ------------------------------ + master_ip, + mastlock_ip, + held_tran_ip + + ); + + +// ----------------------------------------------------------------------------- +// Input and Output declarations +// ----------------------------------------------------------------------------- + + input HCLK; // AHB System Clock + input HRESETn; // AHB System Reset + input HSELS; // Slave Select from AHB + input [<<addr>>:0] HADDRS; // Address bus from AHB +//---------------------------- << start user >> -------------------------------- + input [<<user>>:0] HAUSERS; // Additional user adress bus +//----------------------------- << end user >> --------------------------------- + input [1:0] HTRANSS; // Transfer type from AHB + input HWRITES; // Transfer direction from AHB + input [2:0] HSIZES; // Transfer size from AHB + input [2:0] HBURSTS; // Burst type from AHB + input [<<prot>>:0] HPROTS; // Protection control from AHB +//---------------------------- << start unalign >> ----------------------------- + input HUNALIGNS; // Unalign signal from AHB + input [<<bstrb>>:0] HBSTRBS; // Active Byte Lane strobes +//----------------------------- << end unalign >> ------------------------------ + input [3:0] HMASTERS; // Master number from AHB + input HMASTLOCKS; // Locked Sequence from AHB + input HREADYS; // Transfer done from AHB + input active_ip; // active_ip signal + input readyout_ip; // HREADYOUT input + input [<<resp>>:0] resp_ip; // HRESP input + + output HREADYOUTS; // HREADY feedback to AHB + output [<<resp>>:0] HRESPS; // Transfer response to AHB + output sel_ip; // HSEL output + output [<<addr>>:0] addr_ip; // HADDR output +//---------------------------- << start user >> -------------------------------- + output [<<user>>:0] auser_ip; // HAUSER output +//----------------------------- << end user >> --------------------------------- + output [1:0] trans_ip; // HTRANS output + output write_ip; // HWRITE output + output [2:0] size_ip; // HSIZE output + output [2:0] burst_ip; // HBURST output + output [<<prot>>:0] prot_ip; // HPROT output +//---------------------------- << start unalign >> ----------------------------- + output unalign_ip; // HUNALIGN output + output [<<bstrb>>:0] bstrb_ip; // HBSTRB output +//----------------------------- << end unalign >> ------------------------------ + output [3:0] master_ip; // HMASTER output + output mastlock_ip; // HMASTLOCK output + output held_tran_ip; // Holding register active flag + + +// ----------------------------------------------------------------------------- +// Constant declarations +// ----------------------------------------------------------------------------- + +// HTRANS transfer type signal encoding +`define TRN_IDLE 2'b00 // Idle Transfer +`define TRN_BUSY 2'b01 // Busy Transfer +`define TRN_NONSEQ 2'b10 // Nonsequential transfer +`define TRN_SEQ 2'b11 // Sequential transfer + +// HBURST transfer type signal encoding +`define BUR_SINGLE 3'b000 // Single BURST +`define BUR_INCR 3'b001 // Incremental BURSTS +`define BUR_WRAP4 3'b010 // 4-beat wrap +`define BUR_INCR4 3'b011 // 4-beat incr +`define BUR_WRAP8 3'b100 // 8-beat wrap +`define BUR_INCR8 3'b101 // 8-beat incr +`define BUR_WRAP16 3'b110 // 16-beat wrap +`define BUR_INCR16 3'b111 // 16-beat incr + +// HRESP signal encoding +`define RSP_OKAY <<resp_v>>'b<<bin_resp_okay>> // OKAY response +`define RSP_ERROR <<resp_v>>'b<<bin_resp_error>> // ERROR response +`define RSP_RETRY <<resp_v>>'b<<bin_resp_retry>> // RETRY response +`define RSP_SPLIT <<resp_v>>'b<<bin_resp_split>> // SPLIT response +//----------------------------- << start excl >> ------------------------------- +`define RSP_XFAIL <<resp_v>>'b<<bin_resp_xfail>>; // XFAIL response +//------------------------------ << end excl >> -------------------------------- + + +// ----------------------------------------------------------------------------- +// Wire declarations +// ----------------------------------------------------------------------------- + + wire HCLK; // AHB System Clock + wire HRESETn; // AHB System Reset + wire HSELS; // Slave Select from AHB + wire [<<addr>>:0] HADDRS; // Address bus from AHB +//---------------------------- << start user >> -------------------------------- + wire [<<user>>:0] HAUSERS; // Additional user adress bus +//----------------------------- << end user >> --------------------------------- + wire [1:0] HTRANSS; // Transfer type from AHB + wire HWRITES; // Transfer direction from AHB + wire [2:0] HSIZES; // Transfer size from AHB + wire [2:0] HBURSTS; // Burst type from AHB + wire [<<prot>>:0] HPROTS; // Protection control from AHB +//---------------------------- << start unalign >> ----------------------------- + wire HUNALIGNS; // Unalign signal from AHB + wire [<<bstrb>>:0] HBSTRBS; // Active Byte Lane strobes +//----------------------------- << end unalign >> ------------------------------ + wire [3:0] HMASTERS; // Master number from AHB + wire HMASTLOCKS; // Locked Sequence from AHB + wire HREADYS; // Transfer done from AHB + reg HREADYOUTS; // HREADY feedback to AHB + reg [<<resp>>:0] HRESPS; // Transfer response to AHB + reg sel_ip; // HSEL output + reg [<<addr>>:0] addr_ip; // HADDR output +//---------------------------- << start user >> -------------------------------- + reg [<<user>>:0] auser_ip; // HAUSER output +//----------------------------- << end user >> --------------------------------- + wire [1:0] trans_ip; // HTRANS output + reg write_ip; // HWRITE output + reg [2:0] size_ip; // HSIZE output + wire [2:0] burst_ip; // HBURST output + reg [<<prot>>:0] prot_ip; // HPROT output +//---------------------------- << start unalign >> ----------------------------- + wire unalign_ip; // HUNALIGN output + wire [<<bstrb>>:0] bstrb_ip; // HBSTRB output +//----------------------------- << end unalign >> ------------------------------ + reg [3:0] master_ip; // HMASTER output + reg mastlock_ip; // HMASTLOCK output + wire held_tran_ip; // Holding register active flag + wire active_ip; // active_ip signal + wire readyout_ip; // HREADYOUT input + wire [<<resp>>:0] resp_ip; // HRESP input + + +// ----------------------------------------------------------------------------- +// Signal declarations +// ----------------------------------------------------------------------------- + + wire load_reg; // Holding register load flag + wire pend_tran; // An active transfer cannot complete + reg pend_tran_reg; // Registered version of pend_tran + wire addr_valid; // Indicates address phase of + // valid transfer + reg data_valid; // Indicates data phase of + // valid transfer + reg [1:0] reg_trans; // Registered HTRANSS + reg [<<addr>>:0] reg_addr; // Registered HADDRS +//---------------------------- << start user >> -------------------------------- + reg [<<user>>:0] reg_auser; +//----------------------------- << end user >> --------------------------------- + reg reg_write; // Registered HWRITES + reg [2:0] reg_size; // Registered HSIZES + reg [2:0] reg_burst; // Registered HBURSTS + reg [<<prot>>:0] reg_prot; // Registered HPROTS +//---------------------------- << start unalign >> ----------------------------- + reg reg_unalign; // Registered HUNALIGNS + reg [<<bstrb>>:0] reg_bstrb; // Registered HBSTRBS +//----------------------------- << end unalign >> ------------------------------ + reg [3:0] reg_master; // Registerd HMASTERS + reg reg_mastlock; // Registered HMASTLOCKS + reg [1:0] transb; // HTRANS output used for burst information + reg [1:0] trans_int; // HTRANS output + reg [2:0] burst_int; // HBURST output + reg [3:0] offset_addr; // Address offset for boundary logic + reg [3:0] check_addr; // Address check for wrapped bursts + reg burst_override; // Registered burst_override_next + wire burst_override_next; // Indicates burst has been over-ridden + reg bound; // Registered version of bound_next + wire bound_next; // Indicates boundary wrapping + wire bound_en; // Clock-enable for bound register + + +// ----------------------------------------------------------------------------- +// Beginning of main code +// ----------------------------------------------------------------------------- + +// ----------------------------------------------------------------------------- +// Holding Registers +// ----------------------------------------------------------------------------- +// Each input port has a holding register associated with it and a mux to +// select between the register and the direct input path. The control of +// the mux is done simply by selecting the holding register when it is loaded +// with a pending transfer, otherwise the straight through path is used. + + always @ (negedge HRESETn or posedge HCLK) + begin : p_holding_reg_seq1 + if (~HRESETn) + begin + reg_trans <= 2'b00; + reg_addr <= {<<addr_v>>{1'b0}}; +//---------------------------- << start user >> -------------------------------- + reg_auser <= {<<user_v>>{1'b0}}; +//----------------------------- << end user >> --------------------------------- + reg_write <= 1'b0 ; + reg_size <= 3'b000; + reg_burst <= 3'b000; + reg_prot <= {<<prot_v>>{1'b0}}; +//---------------------------- << start unalign >> ----------------------------- + reg_unalign <= 1'b0; + reg_bstrb <= {<<bstrb_v>>{1'b0}}; +//----------------------------- << end unalign >> ------------------------------ + reg_master <= 4'b0000; + reg_mastlock <= 1'b0 ; + end + else + if (load_reg) + begin + reg_trans <= HTRANSS; + reg_addr <= HADDRS; +//---------------------------- << start user >> -------------------------------- + reg_auser <= HAUSERS; +//----------------------------- << end user >> --------------------------------- + reg_write <= HWRITES; + reg_size <= HSIZES; + reg_burst <= HBURSTS; + reg_prot <= HPROTS; +//---------------------------- << start unalign >> ----------------------------- + reg_unalign <= HUNALIGNS; + reg_bstrb <= HBSTRBS; +//----------------------------- << end unalign >> ------------------------------ + reg_master <= HMASTERS; + reg_mastlock <= HMASTLOCKS; + end + end + + // addr_valid indicates the address phase of an active (non-BUSY/IDLE) + // transfer to this slave port + assign addr_valid = ( HSELS & HTRANSS[1] ); + + // The holding register is loaded whenever there is a transfer on the input + // port which is validated by active HREADYS + assign load_reg = ( addr_valid & HREADYS ); + + // data_valid register + // addr_valid indicates the data phase of an active (non-BUSY/IDLE) + // transfer to this slave port. A valid response (HREADY, HRESP) must be + // generated + always @ (negedge HRESETn or posedge HCLK) + begin : p_data_valid + if (~HRESETn) + data_valid <= 1'b0; + else + if (HREADYS) + data_valid <= addr_valid; + end + +// ----------------------------------------------------------------------------- +// Generate HeldTran +// ----------------------------------------------------------------------------- +// The HeldTran signal is used to indicate when there is an active transfer +// being presented to the output stage, either passing straight through or from +// the holding register. + + // pend_tran indicates that an active transfer presented to this + // slave cannot complete immediately. It is always set after the + // load_reg signal has been active. When set, it is cleared when the + // transfer is being driven onto the selected slave (as indicated by + // active_ip being high) and HREADY from the selected slave is high. + assign pend_tran = (load_reg & (~active_ip)) ? 1'b1 : + (active_ip & readyout_ip) ? 1'b0 : pend_tran_reg; + + // pend_tran_reg indicates that an active transfer was accepted by the input + // stage,but not by the output stage, and so the holding registers should be + // used + always @ (negedge HRESETn or posedge HCLK) + begin : p_pend_tran_reg + if (~HRESETn) + pend_tran_reg <= 1'b0; + else + pend_tran_reg <= pend_tran; + end + + // held_tran_ip indicates an active transfer, and is held whilst that transfer is + // in the holding registers. It passes to the output stage where it acts as + // a request line to the arbitration scheme + assign held_tran_ip = (load_reg | pend_tran_reg); + + // The output from this stage is selected from the holding register when + // there is a held transfer. Otherwise the direct path is used. + + always @ ( pend_tran_reg or HSELS or HTRANSS or HADDRS or HWRITES or + HSIZES or HBURSTS or HPROTS or HMASTERS or HMASTLOCKS or +//---------------------------- << start user >> -------------------------------- + HAUSERS or reg_auser or +//----------------------------- << end user >> --------------------------------- + reg_addr or reg_write or reg_size or reg_burst or reg_prot or + reg_master or reg_mastlock + ) + begin : p_mux_comb + if (~pend_tran_reg) + begin + sel_ip = HSELS; + trans_int = HTRANSS; + addr_ip = HADDRS; +//---------------------------- << start user >> -------------------------------- + auser_ip = HAUSERS; +//----------------------------- << end user >> --------------------------------- + write_ip = HWRITES; + size_ip = HSIZES; + burst_int = HBURSTS; + prot_ip = HPROTS; + master_ip = HMASTERS; + mastlock_ip = HMASTLOCKS; + end + else + begin + sel_ip = 1'b1; + trans_int = `TRN_NONSEQ; + addr_ip = reg_addr; +//---------------------------- << start user >> -------------------------------- + auser_ip = reg_auser; +//----------------------------- << end user >> --------------------------------- + write_ip = reg_write; + size_ip = reg_size; + burst_int = reg_burst; + prot_ip = reg_prot; + master_ip = reg_master; + mastlock_ip = reg_mastlock; + end + end + + // The transb output is used to select the correct Burst value when completing + // an interrupted defined-lenght burst. + + always @ (pend_tran_reg or HTRANSS or reg_trans) + begin : p_transb_comb + if (~pend_tran_reg) + transb = HTRANSS; + else + transb = reg_trans; + end // block: p_transb_comb + +//---------------------------- << start unalign >> ----------------------------- + assign unalign_ip = (pend_tran_reg) ? reg_unalign : HUNALIGNS ; + assign bstrb_ip = (pend_tran_reg) ? reg_bstrb : HBSTRBS ; +//----------------------------- << end unalign >> ------------------------------ + + // Convert SEQ->NONSEQ and BUSY->IDLE when an address boundary is crossed + // whilst the burst type is being over-ridden, i.e. when completing an + // interrupted wrapping burst. + assign trans_ip = (burst_override & bound) ? {trans_int[1], 1'b0} + : trans_int; + + assign burst_ip = (burst_override & (transb != `TRN_NONSEQ)) ? `BUR_INCR + : burst_int; + +// ----------------------------------------------------------------------------- +// HREADYOUT Generation +// ----------------------------------------------------------------------------- +// There are three possible sources for the HREADYOUT signal. +// - It is driven LOW when there is a held transfer. +// - It is driven HIGH when not Selected or for Idle/Busy transfers. +// - At all other times it is driven from the appropriate shared +// slave. + + always @ (data_valid or pend_tran_reg or readyout_ip or resp_ip) + begin : p_ready_comb + if (~data_valid) + begin + HREADYOUTS = 1'b1; + HRESPS = `RSP_OKAY; + end + else if (pend_tran_reg) + begin + HREADYOUTS = 1'b0; + HRESPS = `RSP_OKAY; + end + else + begin + HREADYOUTS = readyout_ip; + HRESPS = resp_ip; + end + end // block: p_ready_comb + +// ----------------------------------------------------------------------------- +// Early Burst Termination +// ----------------------------------------------------------------------------- +// There are times when the output stage will switch to another input port +// without allowing the current burst to complete. In these cases the HTRANS +// and HBURST signals need to be overriden to ensure that the transfers +// reaching the output port meet the AHB specification. + + assign burst_override_next = ( (HTRANSS == `TRN_NONSEQ) | + (HTRANSS == `TRN_IDLE) ) ? 1'b0 + : ( (HTRANSS ==`TRN_SEQ) & + load_reg & + (~active_ip) ) ? 1'b1 + : burst_override; + + // burst_override register + always @ (negedge HRESETn or posedge HCLK) + begin : p_burst_overrideseq + if (~HRESETn) + burst_override <= 1'b0; + else + if (HREADYS) + burst_override <= burst_override_next; + end // block: p_burst_overrideseq + +// ----------------------------------------------------------------------------- +// Boundary Checking Logic +// ----------------------------------------------------------------------------- + // offset_addr + always @ (HADDRS or HSIZES) + begin : p_offset_addr_comb + case (HSIZES) + 3'b000 : offset_addr = HADDRS[3:0]; + 3'b001 : offset_addr = HADDRS[4:1]; + 3'b010 : offset_addr = HADDRS[5:2]; + 3'b011 : offset_addr = HADDRS[6:3]; + + 3'b100, 3'b101, 3'b110, 3'b111 : + offset_addr = HADDRS[3:0]; // Sizes >= 128-bits are not supported + + default : offset_addr = 4'bxxxx; + endcase + end + + // check_addr + always @ (offset_addr or HBURSTS) + begin : p_check_addr_comb + case (HBURSTS) + `BUR_WRAP4 : begin + check_addr[1:0] = offset_addr[1:0]; + check_addr[3:2] = 2'b11; + end + + `BUR_WRAP8 : begin + check_addr[2:0] = offset_addr[2:0]; + check_addr[3] = 1'b1; + end + + `BUR_WRAP16 : + check_addr[3:0] = offset_addr[3:0]; + + `BUR_SINGLE, `BUR_INCR, `BUR_INCR4, `BUR_INCR8, `BUR_INCR16 : + check_addr[3:0] = 4'b0000; + + default : check_addr[3:0] = 4'bxxxx; + endcase + end + + assign bound_next = ( check_addr == 4'b1111 ); + + assign bound_en = ( HTRANSS[1] & HREADYS ); + + // bound register + always @ (negedge HRESETn or posedge HCLK) + begin : p_bound_seq + if (~HRESETn) + bound <= 1'b0; + else + if (bound_en) + bound <= bound_next; + end + + +endmodule + +// --================================= End ===================================-- diff --git a/Cortex-M0/nanosoc/systems/mcu/verilog/gen_ahb_busmatrix/verilog/src/cmsdk_ahb_bm_output_stage.v b/Cortex-M0/nanosoc/systems/mcu/verilog/gen_ahb_busmatrix/verilog/src/cmsdk_ahb_bm_output_stage.v new file mode 100755 index 0000000..27920fe --- /dev/null +++ b/Cortex-M0/nanosoc/systems/mcu/verilog/gen_ahb_busmatrix/verilog/src/cmsdk_ahb_bm_output_stage.v @@ -0,0 +1,538 @@ +//----------------------------------------------------------------------------- +// The confidential and proprietary information contained in this file may +// only be used by a person authorised under and to the extent permitted +// by a subsisting licensing agreement from Arm Limited or its affiliates. +// +// (C) COPYRIGHT 2001-<<copyright_year>> Arm Limited or its affiliates. +// ALL RIGHTS RESERVED +// +// This entire notice must be reproduced on all copies of this file +// and copies of this file may only be made by a person if such person is +// permitted to do so under the terms of a subsisting license agreement +// from Arm Limited or its affiliates. +// +// SVN Information +// +// Checked In : $Date: 2017-10-10 15:55:38 +0100 (Tue, 10 Oct 2017) $ +// +// Revision : $Revision: 371321 $ +// +// Release Information : Cortex-M System Design Kit-r1p1-00rel0 +// +//----------------------------------------------------------------------------- +// +//----------------------------------------------------------------------------- +// Abstract : The Output Stage is used to route the required input +// stage to the shared slave output. +// +// Notes : The bus matrix has <<connectivity>> connectivity, +// and has a <<arbiter_type>> arbiter scheme. +// +//----------------------------------------------------------------------------- + +<<timescale_directive>> + +module <<output_stage_name>> ( + + // Common AHB signals + HCLK, + HRESETn, + +//------------------------------ << start in >> -------------------------------- +//----------------------------- << start connection >> ------------------------- + // Port <<in>> Signals + sel_op<<in>>, + addr_op<<in>>, +//---------------------------- << start user >> -------------------------------- + auser_op<<in>>, +//----------------------------- << end user >> --------------------------------- + trans_op<<in>>, + write_op<<in>>, + size_op<<in>>, + burst_op<<in>>, + prot_op<<in>>, +//---------------------------- << start unalign >> ----------------------------- + unalign_op<<in>>, + bstrb_op<<in>>, +//----------------------------- << end unalign >> ------------------------------ + master_op<<in>>, + mastlock_op<<in>>, + wdata_op<<in>>, +//---------------------------- << start user >> -------------------------------- + wuser_op<<in>>, +//----------------------------- << end user >> --------------------------------- + held_tran_op<<in>>, + +//------------------------------ << end connection >> -------------------------- +//------------------------------- << end in >> --------------------------------- + // Slave read data and response + HREADYOUTM, + +//------------------------------ << start in >> -------------------------------- +//----------------------------- << start connection >> ------------------------- + active_op<<in>>, +//------------------------------ << end connection >> -------------------------- +//------------------------------- << end in >> --------------------------------- + + // Slave Address/Control Signals + HSELM, + HADDRM, +//---------------------------- << start user >> -------------------------------- + HAUSERM, +//----------------------------- << end user >> --------------------------------- + HTRANSM, + HWRITEM, + HSIZEM, + HBURSTM, + HPROTM, +//---------------------------- << start unalign >> ----------------------------- + HUNALIGNM, + HBSTRBM, +//----------------------------- << end unalign >> ------------------------------ + HMASTERM, + HMASTLOCKM, + HREADYMUXM, +//---------------------------- << start user >> -------------------------------- + HWUSERM, +//----------------------------- << end user >> --------------------------------- + HWDATAM + + ); + + +// ----------------------------------------------------------------------------- +// Input and Output declarations +// ----------------------------------------------------------------------------- + + // Common AHB signals + input HCLK; // AHB system clock + input HRESETn; // AHB system reset + +//------------------------------ << start in >> -------------------------------- +//----------------------------- << start connection >> ------------------------- + // Bus-switch input <<in>> + input sel_op<<in>>; // Port <<in>> HSEL signal + input [<<addr>>:0] addr_op<<in>>; // Port <<in>> HADDR signal +//---------------------------- << start user >> -------------------------------- + input [<<user>>:0] auser_op<<in>>; // Port <<in>> HAUSER signal +//----------------------------- << end user >> --------------------------------- + input [1:0] trans_op<<in>>; // Port <<in>> HTRANS signal + input write_op<<in>>; // Port <<in>> HWRITE signal + input [2:0] size_op<<in>>; // Port <<in>> HSIZE signal + input [2:0] burst_op<<in>>; // Port <<in>> HBURST signal + input [<<prot>>:0] prot_op<<in>>; // Port <<in>> HPROT signal +//---------------------------- << start unalign >> ----------------------------- + input unalign_op<<in>>; // Port <<in>> HUNALIGN signal + input [<<bstrb>>:0] bstrb_op<<in>>; // Port <<in>> HBSTRB signal +//----------------------------- << end unalign >> ------------------------------ + input [3:0] master_op<<in>>; // Port <<in>> HMASTER signal + input mastlock_op<<in>>; // Port <<in>> HMASTLOCK signal + input [<<data>>:0] wdata_op<<in>>; // Port <<in>> HWDATA signal +//---------------------------- << start user >> -------------------------------- + input [<<user>>:0] wuser_op<<in>>; // Port <<in>> HWUSER signal +//----------------------------- << end user >> --------------------------------- + input held_tran_op<<in>>; // Port <<in>> HeldTran signal + +//------------------------------ << end connection >> -------------------------- +//------------------------------- << end in >> --------------------------------- + input HREADYOUTM; // HREADY feedback + +//------------------------------ << start in >> -------------------------------- +//----------------------------- << start connection >> ------------------------- + output active_op<<in>>; // Port <<in>> Active signal +//------------------------------ << end connection >> -------------------------- +//------------------------------- << end in >> --------------------------------- + + // Slave Address/Control Signals + output HSELM; // Slave select line + output [<<addr>>:0] HADDRM; // Address +//---------------------------- << start user >> -------------------------------- + output [<<user>>:0] HAUSERM; // User Address bus +//----------------------------- << end user >> --------------------------------- + output [1:0] HTRANSM; // Transfer type + output HWRITEM; // Transfer direction + output [2:0] HSIZEM; // Transfer size + output [2:0] HBURSTM; // Burst type + output [<<prot>>:0] HPROTM; // Protection control +//---------------------------- << start unalign >> ----------------------------- + output HUNALIGNM; // Unaligned transfer + output [<<bstrb>>:0] HBSTRBM; // Byte Lane strobe signal +//----------------------------- << end unalign >> ------------------------------ + output [3:0] HMASTERM; // Master ID + output HMASTLOCKM; // Locked transfer + output HREADYMUXM; // Transfer done +//---------------------------- << start user >> -------------------------------- + output [<<user>>:0] HWUSERM; // User data bus +//----------------------------- << end user >> --------------------------------- + output [<<data>>:0] HWDATAM; // Write data + + +// ----------------------------------------------------------------------------- +// Wire declarations +// ----------------------------------------------------------------------------- + wire HCLK; // AHB system clock + wire HRESETn; // AHB system reset + +//------------------------------ << start in >> -------------------------------- +//----------------------------- << start connection >> ------------------------- + // Bus-switch input <<in>> + wire sel_op<<in>>; // Port <<in>> HSEL signal + wire [<<addr>>:0] addr_op<<in>>; // Port <<in>> HADDR signal +//---------------------------- << start user >> -------------------------------- + wire [<<user>>:0] auser_op<<in>>; // Port <<in>> HAUSER signal +//----------------------------- << end user >> --------------------------------- + wire [1:0] trans_op<<in>>; // Port <<in>> HTRANS signal + wire write_op<<in>>; // Port <<in>> HWRITE signal + wire [2:0] size_op<<in>>; // Port <<in>> HSIZE signal + wire [2:0] burst_op<<in>>; // Port <<in>> HBURST signal + wire [<<prot>>:0] prot_op<<in>>; // Port <<in>> HPROT signal +//---------------------------- << start unalign >> ----------------------------- + wire unalign_op<<in>>; // Port <<in>> HUNALIGN signal + wire [<<bstrb>>:0] bstrb_op<<in>>; // Port <<in>> HBSTRB signal +//----------------------------- << end unalign >> ------------------------------ + wire [3:0] master_op<<in>>; // Port <<in>> HMASTER signal + wire mastlock_op<<in>>; // Port <<in>> HMASTLOCK signal + wire [<<data>>:0] wdata_op<<in>>; // Port <<in>> HWDATA signal +//---------------------------- << start user >> -------------------------------- + wire [<<user>>:0] wuser_op<<in>>; // Port <<in>> HWUSER signal +//----------------------------- << end user >> --------------------------------- + wire held_tran_op<<in>>; // Port <<in>> HeldTran signal + reg active_op<<in>>; // Port <<in>> Active signal + +//------------------------------ << end connection >> -------------------------- +//------------------------------- << end in >> --------------------------------- + // Slave Address/Control Signals + wire HSELM; // Slave select line + reg [<<addr>>:0] HADDRM; // Address +//---------------------------- << start user >> -------------------------------- + reg [<<user>>:0] HAUSERM; // User Address bus +//----------------------------- << end user >> --------------------------------- + wire [1:0] HTRANSM; // Transfer type + reg HWRITEM; // Transfer direction + reg [2:0] HSIZEM; // Transfer size + wire [2:0] HBURSTM; // Burst type + reg [<<prot>>:0] HPROTM; // Protection control +//---------------------------- << start unalign >> ----------------------------- + reg HUNALIGNM; // Unaligned transfer + reg [<<bstrb>>:0] HBSTRBM; // Byte Lane strobe signal +//----------------------------- << end unalign >> ------------------------------ + reg [3:0] HMASTERM; // Master ID + wire HMASTLOCKM; // Locked transfer + wire HREADYMUXM; // Transfer done +//---------------------------- << start user >> -------------------------------- + reg [<<user>>:0] HWUSERM; // User data bus +//----------------------------- << end user >> --------------------------------- + reg [<<data>>:0] HWDATAM; // Write data + wire HREADYOUTM; // HREADY feedback + + +// ----------------------------------------------------------------------------- +// Signal declarations +// ----------------------------------------------------------------------------- +//------------------------------ << start in >> -------------------------------- +//----------------------------- << start connection >> ------------------------- + wire req_port<<in>>; // Port <<in>> request signal +//------------------------------ << end connection >> -------------------------- +//------------------------------- << end in >> --------------------------------- + + wire [<<idw_si>>:0] addr_in_port; // Address input port + reg [<<idw_si>>:0] data_in_port; // Data input port + wire no_port; // No port selected signal + reg slave_sel; // Slave select signal + reg wdata_phase; // Used to prevent unnecesary toggling + + reg hsel_lock; // Held HSELS during locked sequence + wire next_hsel_lock; // Pre-registered hsel_lock + wire hlock_arb; // HMASTLOCK modified by HSEL for arbitration + + reg i_hselm; // Internal HSELM + reg [1:0] i_htransm; // Internal HTRANSM + reg [2:0] i_hburstm; // Internal HBURSTM + wire i_hreadymuxm; // Internal HREADYMUXM + reg i_hmastlockm; // Internal HMASTLOCKM + + +// ----------------------------------------------------------------------------- +// Beginning of main code +// ----------------------------------------------------------------------------- + +// ----------------------------------------------------------------------------- +// Port Selection +// ----------------------------------------------------------------------------- + +//------------------------------ << start in >> -------------------------------- +//----------------------------- << start connection >> ------------------------- + assign req_port<<in>> = held_tran_op<<in>> & sel_op<<in>>; +//------------------------------ << end connection >> -------------------------- +//------------------------------- << end in >> --------------------------------- + + // Arbiter instance for resolving requests to this output stage + <<output_arb_name>> u_output_arb ( + + .HCLK (HCLK), + .HRESETn (HRESETn), + +//------------------------------ << start in >> -------------------------------- +//----------------------------- << start connection >> ------------------------- + .req_port<<in>> (req_port<<in>>), +//------------------------------ << end connection >> -------------------------- +//------------------------------- << end in >> --------------------------------- + + .HREADYM (i_hreadymuxm), + .HSELM (i_hselm), + .HTRANSM (i_htransm), + .HBURSTM (i_hburstm), + .HMASTLOCKM (hlock_arb), + + .addr_in_port (addr_in_port), + .no_port (no_port) + + ); + + + // Active signal combinatorial decode + always @ (addr_in_port or no_port) + begin : p_active_comb + // Default value(s) +//------------------------------ << start in >> -------------------------------- +//----------------------------- << start connection >> ------------------------- + active_op<<in>> = 1'b0; +//------------------------------ << end connection >> -------------------------- +//------------------------------- << end in >> --------------------------------- + + // Decode selection when enabled + if (~no_port) + case (addr_in_port) +//------------------------------ << start in >> -------------------------------- +//----------------------------- << start connection >> ------------------------- + <<idw_si_v>>'b<<bin_in>> : active_op<<in>> = 1'b1; +//------------------------------ << end connection >> -------------------------- +//------------------------------- << end in >> --------------------------------- + default : begin +//------------------------------ << start in >> -------------------------------- +//----------------------------- << start connection >> ------------------------- + active_op<<in>> = 1'bx; +//------------------------------ << end connection >> -------------------------- +//------------------------------- << end in >> --------------------------------- + end + endcase // case(addr_in_port) + end // block: p_active_comb + + + // Address/control output decode + always @ ( +//------------------------------ << start in >> -------------------------------- +//----------------------------- << start connection >> ------------------------- + sel_op<<in>> or addr_op<<in>> or trans_op<<in>> or write_op<<in>> or + size_op<<in>> or burst_op<<in>> or prot_op<<in>> or +//---------------------------- << start unalign >> ----------------------------- + unalign_op<<in>> or bstrb_op<<in>> or +//----------------------------- << end unalign >> ------------------------------ +//---------------------------- << start user >> -------------------------------- + auser_op<<in>> or +//----------------------------- << end user >> --------------------------------- + master_op<<in>> or mastlock_op<<in>> or +//------------------------------ << end connection >> -------------------------- +//------------------------------- << end in >> --------------------------------- + addr_in_port or no_port + ) + begin : p_addr_mux + // Default values + i_hselm = 1'b0; + HADDRM = {<<addr_v>>{1'b0}}; +//---------------------------- << start user >> -------------------------------- + HAUSERM = {<<user_v>>{1'b0}}; +//----------------------------- << end user >> --------------------------------- + i_htransm = 2'b00; + HWRITEM = 1'b0; + HSIZEM = 3'b000; + i_hburstm = 3'b000; + HPROTM = {<<prot_v>>{1'b0}}; +//---------------------------- << start unalign >> ----------------------------- + HUNALIGNM = 1'b0; + HBSTRBM = {<<bstrb_v>>{1'b0}}; +//----------------------------- << end unalign >> ------------------------------ + HMASTERM = 4'b0000; + i_hmastlockm= 1'b0; + + // Decode selection when enabled + if (~no_port) + case (addr_in_port) +//------------------------------ << start in >> -------------------------------- +//----------------------------- << start connection >> ------------------------- + // Bus-switch input <<in>> + <<idw_si_v>>'b<<bin_in>> : + begin + i_hselm = sel_op<<in>>; + HADDRM = addr_op<<in>>; +//---------------------------- << start user >> -------------------------------- + HAUSERM = auser_op<<in>>; +//----------------------------- << end user >> --------------------------------- + i_htransm = trans_op<<in>>; + HWRITEM = write_op<<in>>; + HSIZEM = size_op<<in>>; + i_hburstm = burst_op<<in>>; + HPROTM = prot_op<<in>>; +//---------------------------- << start unalign >> ----------------------------- + HUNALIGNM = unalign_op<<in>>; + HBSTRBM = bstrb_op<<in>>; +//----------------------------- << end unalign >> ------------------------------ + HMASTERM = master_op<<in>>; + i_hmastlockm= mastlock_op<<in>>; + end // case: 4'b<<bin_in>> + +//------------------------------ << end connection >> -------------------------- +//------------------------------- << end in >> --------------------------------- + default : + begin + i_hselm = 1'bx; + HADDRM = {<<addr_v>>{1'bx}}; +//---------------------------- << start user >> -------------------------------- + HAUSERM = {<<user_v>>{1'bx}}; +//----------------------------- << end user >> --------------------------------- + i_htransm = 2'bxx; + HWRITEM = 1'bx; + HSIZEM = 3'bxxx; + i_hburstm = 3'bxxx; + HPROTM = {<<prot_v>>{1'bx}}; +//---------------------------- << start unalign >> ----------------------------- + HUNALIGNM = 1'bx; + HBSTRBM = {<<bstrb_v>>{1'bx}}; +//----------------------------- << end unalign >> ------------------------------ + HMASTERM = 4'bxxxx; + i_hmastlockm= 1'bx; + end // case: default + endcase // case(addr_in_port) + end // block: p_addr_mux + + // hsel_lock provides support for AHB masters that address other + // slave regions in the middle of a locked sequence (i.e. HSEL is + // de-asserted during the locked sequence). Unless HMASTLOCK is + // held during these intermediate cycles, the OutputArb scheme will + // lose track of the locked sequence and may allow another input + // port to access the output port which should be locked + assign next_hsel_lock = (i_hselm & i_htransm[1] & i_hmastlockm) ? 1'b1 : + (i_hmastlockm == 1'b0) ? 1'b0 : + hsel_lock; + + // Register hsel_lock + always @ (negedge HRESETn or posedge HCLK) + begin : p_hsel_lock + if (~HRESETn) + hsel_lock <= 1'b0; + else + if (i_hreadymuxm) + hsel_lock <= next_hsel_lock; + end + + // Version of HMASTLOCK which is masked when not selected, unless a + // locked sequence has already begun through this port + assign hlock_arb = i_hmastlockm & (hsel_lock | i_hselm); + + assign HTRANSM = i_htransm; + assign HBURSTM = i_hburstm; + assign HSELM = i_hselm; + assign HMASTLOCKM = i_hmastlockm; + + // Dataport register + always @ (negedge HRESETn or posedge HCLK) + begin : p_data_in_port_reg + if (~HRESETn) +//------------------------------ << start rrin >> ------------------------------ +//------------------------------ << end rrin >> ------------------------------ used to get a valid port number for the reset of data_port + data_in_port <= <<idw_si_v>>'b<<bin_rrin>>; + else + if (i_hreadymuxm) + data_in_port <= addr_in_port; + end + + // Dataphase register + always @ (negedge HRESETn or posedge HCLK) + begin : p_wdata_phase_reg + if (~HRESETn) + wdata_phase <= 1'b0; + else + if (i_hreadymuxm) + wdata_phase <= i_hselm & i_htransm[1]; + end + + + // HWDATAM output decode + always @ ( +//------------------------------ << start in >> -------------------------------- +//----------------------------- << start connection >> ------------------------- + wdata_op<<in>> or +//------------------------------ << end connection >> -------------------------- +//------------------------------- << end in >> --------------------------------- + data_in_port or wdata_phase + ) + begin : p_data_mux + // Default value + HWDATAM = {<<data_v>>{1'b0}}; + + // If interface active + if (wdata_phase) + // Decode selection + case (data_in_port) +//------------------------------ << start in >> -------------------------------- +//----------------------------- << start connection >> ------------------------- + <<idw_si_v>>'b<<bin_in>> : HWDATAM = wdata_op<<in>>; +//------------------------------ << end connection >> -------------------------- +//------------------------------- << end in >> --------------------------------- + default : HWDATAM = {<<data_v>>{1'bx}}; + endcase // case(data_in_port) + end // block: p_data_mux + +//---------------------------- << start user >> -------------------------------- + // HWUSERM output decode + always @ ( +//------------------------------ << start in >> -------------------------------- +//----------------------------- << start connection >> ------------------------- + wuser_op<<in>> or +//------------------------------ << end connection >> -------------------------- +//------------------------------- << end in >> --------------------------------- + data_in_port or wdata_phase + ) + begin : p_wuser_mux + // Default value + HWUSERM = {<<user_v>>{1'b0}}; + + // If interface active + if (wdata_phase) + // Decode selection + case (data_in_port) +//------------------------------ << start in >> -------------------------------- +//----------------------------- << start connection >> ------------------------- + <<idw_si_v>>'b<<bin_in>> : HWUSERM = wuser_op<<in>>; +//------------------------------ << end connection >> -------------------------- +//------------------------------- << end in >> --------------------------------- + default : HWUSERM = {<<user_v>>{1'bx}}; + endcase // case(data_in_port) + end // block: p_wuser_mux +//----------------------------- << end user >> --------------------------------- + + // --------------------------------------------------------------------------- + // HREADYMUXM generation + // --------------------------------------------------------------------------- + // The HREADY signal on the shared slave is generated directly from + // the shared slave HREADYOUTS if the slave is selected, otherwise + // it mirrors the HREADY signal of the appropriate input port + always @ (negedge HRESETn or posedge HCLK) + begin : p_slave_sel_reg + if (~HRESETn) + slave_sel <= 1'b0; + else + if (i_hreadymuxm) + slave_sel <= i_hselm; + end + + // HREADYMUXM output selection + assign i_hreadymuxm = (slave_sel) ? HREADYOUTM : 1'b1; + + // Drive output with internal version of the signal + assign HREADYMUXM = i_hreadymuxm; + + +endmodule + +// --================================= End ===================================-- diff --git a/Cortex-M0/nanosoc/systems/mcu/verilog/gen_ahb_busmatrix/verilog/src/cmsdk_ahb_bm_round_arb.v b/Cortex-M0/nanosoc/systems/mcu/verilog/gen_ahb_busmatrix/verilog/src/cmsdk_ahb_bm_round_arb.v new file mode 100755 index 0000000..5108798 --- /dev/null +++ b/Cortex-M0/nanosoc/systems/mcu/verilog/gen_ahb_busmatrix/verilog/src/cmsdk_ahb_bm_round_arb.v @@ -0,0 +1,375 @@ +//----------------------------------------------------------------------------- +// The confidential and proprietary information contained in this file may +// only be used by a person authorised under and to the extent permitted +// by a subsisting licensing agreement from Arm Limited or its affiliates. +// +// (C) COPYRIGHT 2001-<<copyright_year>> Arm Limited or its affiliates. +// ALL RIGHTS RESERVED +// +// This entire notice must be reproduced on all copies of this file +// and copies of this file may only be made by a person if such person is +// permitted to do so under the terms of a subsisting license agreement +// from Arm Limited or its affiliates. +// +// SVN Information +// +// Checked In : $Date: 2017-10-10 15:55:38 +0100 (Tue, 10 Oct 2017) $ +// +// Revision : $Revision: 371321 $ +// +// Release Information : Cortex-M System Design Kit-r1p1-00rel0 +// +//----------------------------------------------------------------------------- +// +//----------------------------------------------------------------------------- +// Abstract : The Output Arbitration is used to determine which +// of the input stages will be given access to the +// shared slave. +// +// Notes : The bus matrix has <<connectivity>> connectivity. +// +//----------------------------------------------------------------------------- + +<<timescale_directive>> + +module <<output_arb_name>> ( + + // Common AHB signals + HCLK , + HRESETn, + + // Input port request signals +//------------------------------ << start in >> -------------------------------- +//----------------------------- << start connection >> ------------------------- + req_port<<in>>, +//------------------------------ << end connection >> -------------------------- +//------------------------------- << end in >> --------------------------------- + + HREADYM, + HSELM, + HTRANSM, + HBURSTM, + HMASTLOCKM, + + // Arbiter outputs + addr_in_port, + no_port + + ); + + +// ----------------------------------------------------------------------------- +// Input and Output declarations +// ----------------------------------------------------------------------------- + + // Common AHB signals + input HCLK; // AHB system clock + input HRESETn; // AHB system reset +//------------------------------ << start in >> -------------------------------- +//----------------------------- << start connection >> ------------------------- + input req_port<<in>>; // Port <<in>> request signal +//------------------------------ << end connection >> -------------------------- +//------------------------------- << end in >> --------------------------------- + input HREADYM; // Transfer done + input HSELM; // Slave select line + input [1:0] HTRANSM; // Transfer type + input [2:0] HBURSTM; // Burst type + input HMASTLOCKM; // Locked transfer + output [<<idw_si>>:0] addr_in_port; // Port address input + output no_port; // No port selected signal + + +// ----------------------------------------------------------------------------- +// Constant declarations +// ----------------------------------------------------------------------------- +// HTRANS transfer type signal encoding +`define TRN_IDLE 2'b00 // Idle transfer +`define TRN_BUSY 2'b01 // Busy transfer +`define TRN_NONSEQ 2'b10 // NonSequential transfer +`define TRN_SEQ 2'b11 // Sequential transfer + +// HBURST transfer type signal encoding +`define BUR_SINGLE 3'b000 // Single +`define BUR_INCR 3'b001 // Incremental +`define BUR_WRAP4 3'b010 // 4-beat wrap +`define BUR_INCR4 3'b011 // 4-beat Incr +`define BUR_WRAP8 3'b100 // 8-beat wrap +`define BUR_INCR8 3'b101 // 8-beat Incr +`define BUR_WRAP16 3'b110 // 16-beat Wrap +`define BUR_INCR16 3'b111 // 16-beat Incr + + +// ----------------------------------------------------------------------------- +// Wire declarations +// ----------------------------------------------------------------------------- + wire HCLK; // AHB system clock + wire HRESETn; // AHB system reset +//------------------------------ << start in >> -------------------------------- +//----------------------------- << start connection >> ------------------------- + wire req_port<<in>>; // Port <<in>> request signal +//------------------------------ << end connection >> -------------------------- +//------------------------------- << end in >> --------------------------------- + wire HREADYM; // Transfer done + wire HSELM; // Slave select line + wire [1:0] HTRANSM; // Transfer type + wire [2:0] HBURSTM; // Burst type + wire HMASTLOCKM; // Locked transfer + wire [<<idw_si>>:0] addr_in_port; // Address input port + wire no_port; // No port selected signal + + +// ----------------------------------------------------------------------------- +// Signal declarations +// ----------------------------------------------------------------------------- + reg [<<idw_si>>:0] next_addr_in_port; // D-input of addr_in_port + reg next_no_port; // D-input of no_port + reg [<<idw_si>>:0] i_addr_in_port; // Internal version of addr_in_port + reg i_no_port; // Internal version of no_port + + // Burst counter logic + reg [3:0] next_burst_remain; // D-input of reg_burst_remain + reg [3:0] reg_burst_remain; // Burst counter + reg next_burst_hold; // D-input of reg_burst_hold + reg reg_burst_hold; // Burst hold signal + + // INCR burst logic + reg [1:0] reg_early_term_count; // Counts number of INCR bursts terminated + // earlier than 4-beats or early terminated bursts + wire [1:0] next_early_term_count; // D-input for reg_early_term_count + + +// ----------------------------------------------------------------------------- +// Beginning of main code +// ----------------------------------------------------------------------------- + +// ----------------------------------------------------------------------------- +// BURST TRANSFER COUNTER +// ----------------------------------------------------------------------------- +// +// The Burst counter is used to count down from the number of transfers the +// master should perform and when the counter reaches zero the bus may be +// passed to another master. +// +// reg_burst_remain indicates the number of transfers remaining in the +// current fixed length burst after the current transfer. +// reg_burst_hold is set when transfers remain in a burst and causes the arbitration +// to be held in the current cycle + + always @ (HTRANSM or HSELM or HBURSTM or reg_burst_remain or reg_burst_hold or reg_early_term_count) + begin : p_next_burst_remain_comb + // Force the Burst logic to reset if this port is de-selected. This would + // otherwise cause problems in several situations, e.g.: + // 1. The master performs 2 fixed-length bursts back-to-back, but the + // second is to an alternate output port + // 2. The master is performing a fixed-length burst but is de-granted mid- + // way by a local AHB Arbiter + if (~HSELM) + begin + next_burst_remain = 4'b0000; + next_burst_hold = 1'b0; + end + + // Burst logic is initialised on a NONSEQ transfer (i.e. start of burst) + // IDLE transfers cause the logic to reset + // BUSY transfers pause the decrementer + // SEQ transfers decrement the counter + else + case (HTRANSM) + + `TRN_NONSEQ : begin + case (HBURSTM) + `BUR_INCR16, `BUR_WRAP16 : begin + next_burst_remain = 4'd15; + next_burst_hold = 1'b1; + end // case: BUR_INCR16 | BUR_WRAP16 + + `BUR_INCR8, `BUR_WRAP8 : begin + next_burst_remain = 4'd7; + next_burst_hold = 1'b1; + end // case: BUR_INCR8 | BUR_WRAP8 + + `BUR_INCR4, `BUR_WRAP4 : begin + next_burst_remain = 4'd3; + next_burst_hold = 1'b1; + end // case: BUR_INCR4 | BUR_WRAP4 + + `BUR_INCR : begin + next_burst_remain = 4'd3; + next_burst_hold = 1'b1; + end // case: BUR_INCR + + `BUR_SINGLE : begin + next_burst_remain = 4'd0; + next_burst_hold = 1'b0; + end // case: BUR_SINGLE | BUR_INCR + + default : begin + next_burst_remain = 4'bxxxx; + next_burst_hold = 1'bx; + end // case: default + + endcase // case(HBURSTM) + + // Prevent early burst termination from keeping hold of the port + if (reg_early_term_count == 2'b10) + begin + next_burst_hold = 1'b0; + next_burst_remain = 4'd0; + end + + end // case: `TRN_NONSEQ + + `TRN_SEQ : begin + if (reg_burst_remain == 4'd1) // this was last one remaining + begin + next_burst_hold = 1'b0; + next_burst_remain = 4'd0; + end + else + begin + next_burst_hold = reg_burst_hold; + if (reg_burst_remain != 4'd0) + next_burst_remain = reg_burst_remain - 4'b1; + else + next_burst_remain = 4'd0; + end + end // case: `TRN_SEQ + + `TRN_BUSY : begin + next_burst_remain = reg_burst_remain; + next_burst_hold = reg_burst_hold; + end // case: `TRN_BUSY + + `TRN_IDLE : begin + next_burst_remain = 4'd0; + next_burst_hold = 1'b0; + end // case: `TRN_IDLE + + default : begin + next_burst_remain = 4'bxxxx; + next_burst_hold = 1'bx; + end // case: default + + endcase // case(HTRANSM) + end // block: p_next_burst_remain_comb + + + // reg_early_term_count counts the number of bursts which have terminated + // earlier than the defined arbitration point: this is primarily + // intended to detect back-to-back INCR bursts which are less than 4 + // beats long or early terminated bursts by another interconnect. + // If such bursts are not counted then theoretically a + // sequence of e.g. 3-beat INCR bursts from a master would lock the + // arbitration scheme indefinitely. + + assign next_early_term_count = (!next_burst_hold) ? 2'b00 : + (reg_burst_hold & (HTRANSM == `TRN_NONSEQ)) ? + reg_early_term_count + 2'b1 : + reg_early_term_count; + + // Sequential process + always @ (negedge HRESETn or posedge HCLK) + begin : p_burst_seq + if (~HRESETn) + begin + reg_burst_remain <= 4'b0000; + reg_burst_hold <= 1'b0; + reg_early_term_count <= 2'b00; + end // if (HRESETn == 1'b0) + else + if (HREADYM) + begin + reg_burst_remain <= next_burst_remain; + reg_burst_hold <= next_burst_hold; + reg_early_term_count <= next_early_term_count; + end + end // block: p_burst_seq + + +// ----------------------------------------------------------------------------- +// Port Selection +// ----------------------------------------------------------------------------- +// The Output Arbitration function looks at all the requests to use the +// output port and determines which is the highest priority request. This +// version of the arbitration logic uses a round-robin scheme. +// For example if port 1 is currently in use then the arbiter will first check +// if port 2 requires access, then it checks port 3, then port 4 etc. When +// port 2 is currently in use it will check port 3 first then port 4 and +// all remaining ports, before finally checking port 1. +// If none of the input ports are requesting then the current port will +// remain active if it is performing IDLE transfers to the selected slave. If +// this is not the case then the no_port signal will be asserted which +// indicates that no input port should be selected. + + always @ ( +//------------------------------ << start in >> -------------------------------- +//----------------------------- << start connection >> ------------------------- + req_port<<in>> or +//------------------------------ << end connection >> -------------------------- +//------------------------------- << end in >> --------------------------------- + HMASTLOCKM or next_burst_hold or HSELM or i_no_port or i_addr_in_port + ) + begin : p_sel_port_comb + // Default values are used for next_no_port and next_addr_in_port + next_no_port = 1'b0; + next_addr_in_port = i_addr_in_port; + + if ( HMASTLOCKM | next_burst_hold ) + next_addr_in_port = i_addr_in_port; + else if (i_no_port) + begin +//------------------------------ << start in >> -------------------------------- +//----------------------------- << start connection >> ------------------------- + <<rrelse>>if (req_port<<in>>) + next_addr_in_port = <<idw_si_v>>'b<<bin_in>>; +//------------------------------ << end connection >> -------------------------- +//------------------------------ << end in >> ---------------------------------- + else + next_no_port = 1'b1; + end + else + case (i_addr_in_port) +//------------------------------ << start rrin >> ------------------------------ + <<idw_si_v>>'b<<bin_rrin>> : begin +//------------------------------ << start rridx >> ----------------------------- + <<rrelse>>if (req_port<<rridx>>) + next_addr_in_port = <<idw_si_v>>'b<<bin_rridx>>; +//------------------------------ << end rridx >> ------------------------------- + else if (HSELM) + next_addr_in_port = <<idw_si_v>>'b<<bin_rrin>>; + else + next_no_port = 1'b1; + end + +//------------------------------ << end rrin >> -------------------------------- + default : begin + next_addr_in_port = {<<idw_si_v>>{1'bx}}; + next_no_port = 1'bx; + end + endcase + end + + // Sequential process + always @ (negedge HRESETn or posedge HCLK) + begin : p_addr_in_port_reg + if (~HRESETn) + begin + i_no_port <= 1'b1; + i_addr_in_port <= {<<idw_si_v>>{1'b0}}; + end + else + if (HREADYM) + begin + i_no_port <= next_no_port; + i_addr_in_port <= next_addr_in_port; + end + end + + // Drive outputs with internal versions + assign addr_in_port = i_addr_in_port; + assign no_port = i_no_port; + + +endmodule + +// --================================= End ===================================-- diff --git a/Cortex-M0/nanosoc/systems/mcu/verilog/gen_ahb_busmatrix/verilog/src/cmsdk_ahb_bm_single_arb.v b/Cortex-M0/nanosoc/systems/mcu/verilog/gen_ahb_busmatrix/verilog/src/cmsdk_ahb_bm_single_arb.v new file mode 100755 index 0000000..5719c83 --- /dev/null +++ b/Cortex-M0/nanosoc/systems/mcu/verilog/gen_ahb_busmatrix/verilog/src/cmsdk_ahb_bm_single_arb.v @@ -0,0 +1,160 @@ +//----------------------------------------------------------------------------- +// The confidential and proprietary information contained in this file may +// only be used by a person authorised under and to the extent permitted +// by a subsisting licensing agreement from Arm Limited or its affiliates. +// +// (C) COPYRIGHT 2001-<<copyright_year>> Arm Limited or its affiliates. +// ALL RIGHTS RESERVED +// +// This entire notice must be reproduced on all copies of this file +// and copies of this file may only be made by a person if such person is +// permitted to do so under the terms of a subsisting license agreement +// from Arm Limited or its affiliates. +// +// SVN Information +// +// Checked In : $Date: 2017-10-10 15:55:38 +0100 (Tue, 10 Oct 2017) $ +// +// Revision : $Revision: 371321 $ +// +// Release Information : Cortex-M System Design Kit-r1p1-00rel0 +// +//----------------------------------------------------------------------------- +// +//------------------------------------------------------------------------------ +// Abstract : The Output Arbitration is normally used to determine +// which of the input stages will be given access to +// the shared slave. However, for this output port, only +// one sparse connection is declared and arbitration +// is simplified to a 'grant when requested' function. +// +// Notes : The bus matrix has <<connectivity>> connectivity and the +// <<arbiter_type>> arbiter scheme has been overridden for this +// instance only. +// +//----------------------------------------------------------------------------- + +<<timescale_directive>> + +module <<output_arb_name>> ( + + // Common AHB signals + HCLK , + HRESETn, + + // Input port request signals +//------------------------------ << start in >> -------------------------------- +//----------------------------- << start connection >> ------------------------- + req_port<<in>>, +//------------------------------ << end connection >> -------------------------- +//------------------------------- << end in >> --------------------------------- + + HREADYM, + HSELM, + HTRANSM, + HBURSTM, + HMASTLOCKM, + + // Arbiter outputs + addr_in_port, + no_port + + ); + + +// ----------------------------------------------------------------------------- +// Input and Output declarations +// ----------------------------------------------------------------------------- + + // Common AHB signals + input HCLK; // AHB system clock + input HRESETn; // AHB system reset + +//------------------------------ << start in >> -------------------------------- +//----------------------------- << start connection >> ------------------------- + input req_port<<in>>; // Port <<in>> request signal +//------------------------------ << end connection >> -------------------------- +//------------------------------- << end in >> --------------------------------- + + input HREADYM; // Transfer done + input HSELM; // Slave select line + input [1:0] HTRANSM; // Transfer type + input [2:0] HBURSTM; // Burst type + input HMASTLOCKM; // Locked transfer + + output [<<idw_si>>:0] addr_in_port; // Port address input + output no_port; // No port selected signal + + +// ----------------------------------------------------------------------------- +// Wire declarations +// ----------------------------------------------------------------------------- + wire HCLK; // AHB system clock + wire HRESETn; // AHB system reset +//------------------------------ << start in >> -------------------------------- +//----------------------------- << start connection >> ------------------------- + wire req_port<<in>>; // Port <<in>> request signal +//------------------------------ << end connection >> -------------------------- +//------------------------------- << end in >> --------------------------------- + wire HREADYM; // Transfer done + wire HSELM; // Slave select line + wire [1:0] HTRANSM; // Transfer type + wire HMASTLOCKM; // Locked transfer + wire [<<idw_si>>:0] addr_in_port; // Port address input + reg no_port; // No port selected signal + + +// ----------------------------------------------------------------------------- +// Signal declarations +// ----------------------------------------------------------------------------- + wire [<<idw_si>>:0] addr_in_port_next; // D-input of addr_in_port + reg [<<idw_si>>:0] iaddr_in_port; // Internal version of addr_in_port + wire no_port_next; // D-input of no_port + wire request; // Slave port request + + +// ----------------------------------------------------------------------------- +// Beginning of main code +// ----------------------------------------------------------------------------- +//------------------------------------------------------------------------------ +// Port Selection +//------------------------------------------------------------------------------ +// The single output 'arbitration' function looks at the request to use the +// output port and grants it appropriately. The input port will remain granted +// if it is performing IDLE transfers to the selected slave. If this is not +// the case then the no_port signal will be asserted which indicates that the +// input port should be deselected. + +//------------------------------ << start in >> -------------------------------- +//----------------------------- << start connection >> ------------------------- + assign request = req_port<<in>> | ( (iaddr_in_port == <<idw_si_v>>'b<<bin_in>>) & HSELM & + (HTRANSM != 2'b00) ); + + assign no_port_next = ! ( HMASTLOCKM | request | HSELM ); + assign addr_in_port_next = ( request & !HMASTLOCKM ) ? <<idw_si_v>>'b<<bin_in>> : iaddr_in_port; +//------------------------------ << end connection >> -------------------------- +//------------------------------- << end in >> --------------------------------- + + // Sequential process + always @ (negedge HRESETn or posedge HCLK) + begin : p_addr_in_port_reg + if (~HRESETn) + begin + no_port <= 1'b1; + iaddr_in_port <= {<<idw_si_v>>{1'b0}}; + end + else + if (HREADYM) + begin + no_port <= no_port_next; + iaddr_in_port <= addr_in_port_next; + end + end // block: p_addr_in_port_reg + + // Drive output with internal version + assign addr_in_port = iaddr_in_port; + + +endmodule + +// --================================= End ===================================-- diff --git a/Cortex-M0/nanosoc/systems/mcu/verilog/gen_ahb_busmatrix/verilog/src/cmsdk_ahb_bm_single_output_stage.v b/Cortex-M0/nanosoc/systems/mcu/verilog/gen_ahb_busmatrix/verilog/src/cmsdk_ahb_bm_single_output_stage.v new file mode 100755 index 0000000..3aa5064 --- /dev/null +++ b/Cortex-M0/nanosoc/systems/mcu/verilog/gen_ahb_busmatrix/verilog/src/cmsdk_ahb_bm_single_output_stage.v @@ -0,0 +1,416 @@ +//----------------------------------------------------------------------------- +// The confidential and proprietary information contained in this file may +// only be used by a person authorised under and to the extent permitted +// by a subsisting licensing agreement from Arm Limited or its affiliates. +// +// (C) COPYRIGHT 2001-<<copyright_year>> Arm Limited or its affiliates. +// ALL RIGHTS RESERVED +// +// This entire notice must be reproduced on all copies of this file +// and copies of this file may only be made by a person if such person is +// permitted to do so under the terms of a subsisting license agreement +// from Arm Limited or its affiliates. +// +// SVN Information +// +// Checked In : $Date: 2017-10-10 15:55:38 +0100 (Tue, 10 Oct 2017) $ +// +// Revision : $Revision: 371321 $ +// +// Release Information : Cortex-M System Design Kit-r1p1-00rel0 +// +//----------------------------------------------------------------------------- +// +//----------------------------------------------------------------------------- +// Abstract : The Output Stage is used to route the required input +// stage to the shared slave output. However, for this +// output port, only one sparse connection is declared +// and muxing is simplified. +// +// Notes : The bus matrix has <<connectivity>> connectivity and the +// standard output stage has been overridden for this +// instance only. +// +//----------------------------------------------------------------------------- + +<<timescale_directive>> + +module <<output_stage_name>> ( + + // Common AHB signals + HCLK, + HRESETn, + +//------------------------------ << start in >> -------------------------------- +//----------------------------- << start connection >> ------------------------- + // Port <<in>> Signals + sel_op<<in>>, + addr_op<<in>>, +//---------------------------- << start user >> -------------------------------- + auser_op<<in>>, +//----------------------------- << end user >> --------------------------------- + trans_op<<in>>, + write_op<<in>>, + size_op<<in>>, + burst_op<<in>>, + prot_op<<in>>, +//---------------------------- << start unalign >> ----------------------------- + unalign_op<<in>>, + bstrb_op<<in>>, +//----------------------------- << end unalign >> ------------------------------ + master_op<<in>>, + mastlock_op<<in>>, + wdata_op<<in>>, +//---------------------------- << start user >> -------------------------------- + wuser_op<<in>>, +//----------------------------- << end user >> --------------------------------- + held_tran_op<<in>>, + +//------------------------------ << end connection >> -------------------------- +//------------------------------- << end in >> --------------------------------- + // Slave read data and response + HREADYOUTM, + +//------------------------------ << start in >> -------------------------------- +//----------------------------- << start connection >> ------------------------- + active_op<<in>>, +//------------------------------ << end connection >> -------------------------- +//------------------------------- << end in >> --------------------------------- + + // Slave addr_opess/Control Signals + HSELM, + HADDRM, +//---------------------------- << start user >> -------------------------------- + HAUSERM, +//----------------------------- << end user >> --------------------------------- + HTRANSM, + HWRITEM, + HSIZEM, + HBURSTM, + HPROTM, +//---------------------------- << start unalign >> ----------------------------- + HUNALIGNM, + HBSTRBM, +//----------------------------- << end unalign >> ------------------------------ + HMASTERM, + HMASTLOCKM, + HREADYMUXM, +//---------------------------- << start user >> -------------------------------- + HWUSERM, +//----------------------------- << end user >> --------------------------------- + HWDATAM + + ); + + +// ----------------------------------------------------------------------------- +// Input and Output declarations +// ----------------------------------------------------------------------------- + + // Common AHB signals + input HCLK; // AHB system clock + input HRESETn; // AHB system reset + +//------------------------------ << start in >> -------------------------------- +//----------------------------- << start connection >> ------------------------- + // Bus-switch input <<in>> + input sel_op<<in>>; // Port <<in>> HSEL signal + input [<<addr>>:0] addr_op<<in>>; // Port <<in>> HADDR signal +//---------------------------- << start user >> -------------------------------- + input [<<user>>:0] auser_op<<in>>; // Port <<in>> HAUSER signal +//----------------------------- << end user >> --------------------------------- + input [1:0] trans_op<<in>>; // Port <<in>> HTRANS signal + input write_op<<in>>; // Port <<in>> HWRITE signal + input [2:0] size_op<<in>>; // Port <<in>> HSIZE signal + input [2:0] burst_op<<in>>; // Port <<in>> HBURST signal + input [<<prot>>:0] prot_op<<in>>; // Port <<in>> HPROT signal +//---------------------------- << start unalign >> ----------------------------- + input unalign_op<<in>>; // Port <<in>> HUNALIGN signal + input [<<bstrb>>:0] bstrb_op<<in>>; // Port <<in>> HBSTRB signal +//----------------------------- << end unalign >> ------------------------------ + input [3:0] master_op<<in>>; // Port <<in>> HMASTER signal + input mastlock_op<<in>>; // Port <<in>> HMASTLOCK signal + input [<<data>>:0] wdata_op<<in>>; // Port <<in>> HWDATA signal +//---------------------------- << start user >> -------------------------------- + input [<<user>>:0] wuser_op<<in>>; // Port <<in>> HWUSER signal +//----------------------------- << end user >> --------------------------------- + input held_tran_op<<in>>; // Port <<in>> held_tran_op signal + +//------------------------------ << end connection >> -------------------------- +//------------------------------- << end in >> --------------------------------- + input HREADYOUTM; // HREADY feedback + +//------------------------------ << start in >> -------------------------------- +//----------------------------- << start connection >> ------------------------- + output active_op<<in>>; // Port <<in>> active_op signal +//------------------------------ << end connection >> -------------------------- +//------------------------------- << end in >> --------------------------------- + + // Slave addr_opess/Control Signals + output HSELM; // Slave select line + output [<<addr>>:0] HADDRM; // addr_opess +//---------------------------- << start user >> -------------------------------- + output [<<user>>:0] HAUSERM; // User addr_opess bus +//----------------------------- << end user >> --------------------------------- + output [1:0] HTRANSM; // trans_opfer type + output HWRITEM; // trans_opfer direction + output [2:0] HSIZEM; // trans_opfer size + output [2:0] HBURSTM; // burst_op type + output [<<prot>>:0] HPROTM; // prot_opection control +//---------------------------- << start unalign >> ----------------------------- + output HUNALIGNM; // unalign_oped transfer + output [<<bstrb>>:0] HBSTRBM; // Byte Lane strobe signal +//----------------------------- << end unalign >> ------------------------------ + output [3:0] HMASTERM; // master_op ID + output HMASTLOCKM; // Locked transfer + output HREADYMUXM; // trans_opfer done +//---------------------------- << start user >> -------------------------------- + output [<<user>>:0] HWUSERM; // User data bus +//----------------------------- << end user >> --------------------------------- + output [<<data>>:0] HWDATAM; // write_op data + + +// ----------------------------------------------------------------------------- +// Wire declarations +// ----------------------------------------------------------------------------- + wire HCLK; // AHB system clock + wire HRESETn; // AHB system reset + +//------------------------------ << start in >> -------------------------------- +//----------------------------- << start connection >> ------------------------- + // Bus-switch input <<in>> + wire sel_op<<in>>; // Port <<in>> HSEL signal + wire [<<addr>>:0] addr_op<<in>>; // Port <<in>> HADDR signal +//---------------------------- << start user >> -------------------------------- + wire [<<user>>:0] auser_op<<in>>; // Port <<in>> HAUSER signal +//----------------------------- << end user >> --------------------------------- + wire [1:0] trans_op<<in>>; // Port <<in>> HTRANS signal + wire write_op<<in>>; // Port <<in>> HWRITE signal + wire [2:0] size_op<<in>>; // Port <<in>> HSIZE signal + wire [2:0] burst_op<<in>>; // Port <<in>> HBURST signal + wire [<<prot>>:0] prot_op<<in>>; // Port <<in>> HPROT signal +//---------------------------- << start unalign >> ----------------------------- + wire unalign_op<<in>>; // Port <<in>> HUNALIGN signal + wire [<<bstrb>>:0] bstrb_op<<in>>; // Port <<in>> HBSTRB signal +//----------------------------- << end unalign >> ------------------------------ + wire [3:0] master_op<<in>>; // Port <<in>> HMASTER signal + wire mastlock_op<<in>>; // Port <<in>> HMASTLOCK signal + wire [<<data>>:0] wdata_op<<in>>; // Port <<in>> HWDATA signal +//---------------------------- << start user >> -------------------------------- + wire [<<user>>:0] wuser_op<<in>>; // Port <<in>> HWUSER signal +//----------------------------- << end user >> --------------------------------- + wire held_tran_op<<in>>; // Port <<in>> held_tran_op signal + wire active_op<<in>>; // Port <<in>> active_op signal + +//------------------------------ << end connection >> -------------------------- +//------------------------------- << end in >> --------------------------------- + // Slave addr_opess/Control Signals + wire HSELM; // Slave select line + wire [<<addr>>:0] HADDRM; // addr_opess +//---------------------------- << start user >> -------------------------------- + wire [<<user>>:0] HAUSERM; // User addr_opess bus +//----------------------------- << end user >> --------------------------------- + wire [1:0] HTRANSM; // trans_opfer type + wire HWRITEM; // trans_opfer direction + wire [2:0] HSIZEM; // trans_opfer size + wire [2:0] HBURSTM; // burst_op type + wire [<<prot>>:0] HPROTM; // prot_opection control +//---------------------------- << start unalign >> ----------------------------- + wire HUNALIGNM; // unalign_oped transfer + wire [<<bstrb>>:0] HBSTRBM; // Byte Lane strobe signal +//----------------------------- << end unalign >> ------------------------------ + wire [3:0] HMASTERM; // master_op ID + wire HMASTLOCKM; // Locked transfer + wire HREADYMUXM; // trans_opfer done +//---------------------------- << start user >> -------------------------------- + wire [<<user>>:0] HWUSERM; // User data bus +//----------------------------- << end user >> --------------------------------- + wire [<<data>>:0] HWDATAM; // write_op data + wire HREADYOUTM; // HREADY feedback + + +// ----------------------------------------------------------------------------- +// Signal declarations +// ----------------------------------------------------------------------------- +//------------------------------ << start in >> -------------------------------- +//----------------------------- << start connection >> ------------------------- + wire req_port<<in>>; // Port <<in>> request signal +//------------------------------ << end connection >> -------------------------- +//------------------------------- << end in >> --------------------------------- + + wire [<<idw_si>>:0] addr_in_port; // addr_opess input port + reg [<<idw_si>>:0] data_in_port; // Data input port + wire no_port; // No port selected signal + reg slave_sel; // Slave select signal + + reg wdata_phase; // Used to prevent unnecesary toggling + + reg hsel_lock; // Held HSELS during locked sequence + wire next_hsel_lock; // Pre-registered hsel_lock + wire hlock_arb; // HMASTLOCK modified by HSEL for arbitration + + wire i_hselm; // Internal HSELM + wire [1:0] i_htransm; // Internal HTRANSM + wire [2:0] i_hburstm; // Internal HBURSTM + wire i_hreadymuxm; // Internal HREADYMUXM + wire i_hmastlockm; // Internal HMASTLOCKM + + +// ----------------------------------------------------------------------------- +// Beginning of main code +// ----------------------------------------------------------------------------- + +// ----------------------------------------------------------------------------- +// Port sel_opection +// ----------------------------------------------------------------------------- + +//------------------------------ << start in >> -------------------------------- +//----------------------------- << start connection >> ------------------------- + assign req_port<<in>> = held_tran_op<<in>> & sel_op<<in>>; +//------------------------------ << end connection >> -------------------------- +//------------------------------- << end in >> --------------------------------- + + // Dummy arbiter instance for granting requests to this output stage + <<output_arb_name>> u_output_arb ( + + .HCLK (HCLK), + .HRESETn (HRESETn), + +//------------------------------ << start in >> -------------------------------- +//----------------------------- << start connection >> ------------------------- + .req_port<<in>> (req_port<<in>>), +//------------------------------ << end connection >> -------------------------- +//------------------------------- << end in >> --------------------------------- + + .HREADYM (i_hreadymuxm), + .HSELM (i_hselm), + .HTRANSM (i_htransm), + .HBURSTM (i_hburstm), + .HMASTLOCKM (hlock_arb), + + .addr_in_port (addr_in_port), + .no_port (no_port) + + ); + + + // active_op signal combinatorial decode +//------------------------------ << start in >> -------------------------------- +//----------------------------- << start connection >> ------------------------- + assign active_op<<in>> = (addr_in_port == <<idw_si_v>>'b<<bin_in>>) & !no_port; +//------------------------------ << end connection >> -------------------------- +//------------------------------- << end in >> --------------------------------- + + // addr_opess/control output decode +//------------------------------ << start in >> -------------------------------- +//----------------------------- << start connection >> ------------------------- + assign i_hselm = (addr_in_port == <<idw_si_v>>'b<<bin_in>>) & sel_op<<in>> & !no_port; + assign HADDRM = ( (addr_in_port == <<idw_si_v>>'b<<bin_in>>) & !no_port ) ? addr_op<<in>> : {<<addr_v>>{1'b0}}; +//---------------------------- << start user >> -------------------------------- + assign HAUSERM = ( (addr_in_port == <<idw_si_v>>'b<<bin_in>>) & !no_port ) ? auser_op<<in>> : {<<user_v>>{1'b0}}; +//----------------------------- << end user >> --------------------------------- + assign i_htransm = ( (addr_in_port == <<idw_si_v>>'b<<bin_in>>) & !no_port ) ? trans_op<<in>> : 2'b00; + assign HWRITEM = (addr_in_port == <<idw_si_v>>'b<<bin_in>>) & write_op<<in>> & !no_port; + assign HSIZEM = ( (addr_in_port == <<idw_si_v>>'b<<bin_in>>) & !no_port ) ? size_op<<in>> : 3'b000; + assign i_hburstm = ( (addr_in_port == <<idw_si_v>>'b<<bin_in>>) & !no_port ) ? burst_op<<in>> : 3'b000; + assign HPROTM = ( (addr_in_port == <<idw_si_v>>'b<<bin_in>>) & !no_port ) ? prot_op<<in>> : {<<prot_v>>{1'b0}}; +//---------------------------- << start unalign >> ----------------------------- + assign HUNALIGNM = (addr_in_port == <<idw_si_v>>'b<<bin_in>>) & unalign_op<<in>> & !no_port; + assign HBSTRBM = ( (addr_in_port == <<idw_si_v>>'b<<bin_in>>) & !no_port ) ? bstrb_op<<in>> : {<<bstrb_v>>{1'b0}}; +//----------------------------- << end unalign >> ------------------------------ + assign HMASTERM = ( (addr_in_port == <<idw_si_v>>'b<<bin_in>>) & !no_port ) ? master_op<<in>> : 4'b0000; + assign i_hmastlockm = (addr_in_port == <<idw_si_v>>'b<<bin_in>>) & mastlock_op<<in>> & !no_port; +//------------------------------ << end connection >> -------------------------- +//------------------------------- << end in >> --------------------------------- + + // hsel_lock provides support for AHB masters that address other + // slave regions in the middle of a locked sequence (i.e. HSEL is + // de-asserted during the locked sequence). Unless HMASTLOCK is + // held during these intermediate cycles, the OutputArb scheme will + // lose track of the locked sequence and may allow another input + // port to access the output port which should be locked + assign next_hsel_lock = (i_hselm & i_htransm[1] & i_hmastlockm) ? 1'b1 : + (i_hmastlockm == 1'b0) ? 1'b0 : + hsel_lock; + + // Register hsel_lock + always @ (negedge HRESETn or posedge HCLK) + begin : p_hsel_lock + if (!HRESETn) + hsel_lock <= 1'b0; + else + if (i_hreadymuxm) + hsel_lock <= next_hsel_lock; + end + + // Version of HMASTLOCK which is masked when not selected, unless a + // locked sequence has already begun through this port + assign hlock_arb = i_hmastlockm & (hsel_lock | i_hselm); + + assign HTRANSM = i_htransm; + assign HBURSTM = i_hburstm; + assign HSELM = i_hselm; + assign HMASTLOCKM = i_hmastlockm; + + // Dataport register + always @ (negedge HRESETn or posedge HCLK) + begin : p_data_in_port_reg + if (!HRESETn) + data_in_port <= {<<idw_si_v>>{1'b0}}; + else + if (i_hreadymuxm) + data_in_port <= addr_in_port; + end + + // Dataphase register + always @ (negedge HRESETn or posedge HCLK) + begin : p_wdata_phase_reg + if (~HRESETn) + wdata_phase <= 1'b0; + else + if (i_hreadymuxm) + wdata_phase <= i_hselm & i_htransm[1]; + end + + + // HWDATAM output decode +//------------------------------ << start in >> -------------------------------- +//----------------------------- << start connection >> ------------------------- + assign HWDATAM = wdata_phase ? wdata_op<<in>> : {<<data_v>>{1'b0}}; +//------------------------------ << end connection >> -------------------------- +//------------------------------- << end in >> --------------------------------- + +//---------------------------- << start user >> -------------------------------- + // HWUSERM output decode +//------------------------------ << start in >> -------------------------------- +//----------------------------- << start connection >> ------------------------- + assign HWUSERM = wdata_phase ? wuser_op<<in>> : {<<user_v>>{1'b0}}; +//------------------------------ << end connection >> -------------------------- +//------------------------------- << end in >> --------------------------------- +//----------------------------- << end user >> --------------------------------- + + // --------------------------------------------------------------------------- + // HREADYMUXM generation + // --------------------------------------------------------------------------- + // The HREADY signal on the shared slave is generated directly from + // the shared slave HREADYOUTS if the slave is selected, otherwise + // it mirrors the HREADY signal of the appropriate input port + always @ (negedge HRESETn or posedge HCLK) + begin : p_slave_sel_reg + if (!HRESETn) + slave_sel <= 1'b0; + else + if (i_hreadymuxm) + slave_sel <= i_hselm; + end + + // HREADYMUXM output selection + assign i_hreadymuxm = (slave_sel) ? HREADYOUTM : 1'b1; + + // Drive output with internal version of the signal + assign HREADYMUXM = i_hreadymuxm; + + +endmodule + +// --================================= End ===================================-- diff --git a/Cortex-M0/nanosoc/systems/mcu/verilog/gen_ahb_busmatrix/verilog/src/cmsdk_ahb_busmatrix.v b/Cortex-M0/nanosoc/systems/mcu/verilog/gen_ahb_busmatrix/verilog/src/cmsdk_ahb_busmatrix.v new file mode 100755 index 0000000..669eb9a --- /dev/null +++ b/Cortex-M0/nanosoc/systems/mcu/verilog/gen_ahb_busmatrix/verilog/src/cmsdk_ahb_busmatrix.v @@ -0,0 +1,526 @@ +//----------------------------------------------------------------------------- +// The confidential and proprietary information contained in this file may +// only be used by a person authorised under and to the extent permitted +// by a subsisting licensing agreement from Arm Limited or its affiliates. +// +// (C) COPYRIGHT 2001-<<copyright_year>> Arm Limited or its affiliates. +// ALL RIGHTS RESERVED +// +// This entire notice must be reproduced on all copies of this file +// and copies of this file may only be made by a person if such person is +// permitted to do so under the terms of a subsisting license agreement +// from Arm Limited or its affiliates. +// +// SVN Information +// +// Checked In : $Date: 2017-10-10 15:55:38 +0100 (Tue, 10 Oct 2017) $ +// +// Revision : $Revision: 371321 $ +// +// Release Information : Cortex-M System Design Kit-r1p1-00rel0 +// +//----------------------------------------------------------------------------- +// +//------------------------------------------------------------------------------ +// Abstract : BusMatrix is the top-level which connects together +// the required Input Stages, MatrixDecodes, Output +// Stages and Output Arbitration blocks. +// +// Supports the following configured options: +// +// - Architecture type '<<architecture_type>>', +// - <<total_si>> slave ports (connecting to masters), +// - <<total_mi>> master ports (connecting to slaves), +// - Routing address width of <<addr_v>> bits, +// - Routing data width of <<data_v>> bits, +//----------------------------- << start user >> ------------------------------- +// - xUSER signal width of <<user_v>> bits, +//------------------------------ << end user >> -------------------------------- +//---------------------------- << start unalign >> ----------------------------- +// - ARMv6 AMBA extensions for unaligned access, +//----------------------------- << end unalign >> ------------------------------ +//----------------------------- << start excl >> ------------------------------- +// - ARMv6 AMBA extensions for exclusive access, +//------------------------------ << end excl >> -------------------------------- +// - Arbiter type '<<arbiter_type>>', +// - Connectivity mapping: +// <<mappings>>, +// - Connectivity type '<<connectivity>>'. +// +//------------------------------------------------------------------------------ + +<<timescale_directive>> + +module <<bus_matrix_name>> ( + + // Common AHB signals + HCLK, + HRESETn, + + // System address remapping control + REMAP, + +//------------------------------ << start in >> -------------------------------- + // Input port SI<<in>> (inputs from master <<in>>) + HSEL<<si_name>>, + HADDR<<si_name>>, + HTRANS<<si_name>>, + HWRITE<<si_name>>, + HSIZE<<si_name>>, + HBURST<<si_name>>, + HPROT<<si_name>>, +//---------------------------- << start unalign >> ----------------------------- + HUNALIGN<<si_name>>, + HBSTRB<<si_name>>, +//----------------------------- << end unalign >> ------------------------------ + HMASTER<<si_name>>, + HWDATA<<si_name>>, + HMASTLOCK<<si_name>>, + HREADY<<si_name>>, +//---------------------------- << start user >> -------------------------------- + HAUSER<<si_name>>, + HWUSER<<si_name>>, +//----------------------------- << end user >> --------------------------------- + +//------------------------------- << end in >> --------------------------------- +//----------------------------- << start out >> -------------------------------- + // Output port MI<<out>> (inputs from slave <<out>>) + HRDATA<<mi_name>>, + HREADYOUT<<mi_name>>, + HRESP<<mi_name>>, +//---------------------------- << start user >> ------------------------------ + HRUSER<<mi_name>>, +//----------------------------- << end user >> ------------------------------- + +//------------------------------ << end out >> --------------------------------- + // Scan test dummy signals; not connected until scan insertion + SCANENABLE, // Scan Test Mode Enable + SCANINHCLK, // Scan Chain Input + + +//----------------------------- << start out >> -------------------------------- + // Output port MI<<out>> (outputs to slave <<out>>) + HSEL<<mi_name>>, + HADDR<<mi_name>>, + HTRANS<<mi_name>>, + HWRITE<<mi_name>>, + HSIZE<<mi_name>>, + HBURST<<mi_name>>, + HPROT<<mi_name>>, +//---------------------------- << start unalign >> ----------------------------- + HUNALIGN<<mi_name>>, + HBSTRB<<mi_name>>, +//----------------------------- << end unalign >> ------------------------------ + HMASTER<<mi_name>>, + HWDATA<<mi_name>>, + HMASTLOCK<<mi_name>>, + HREADYMUX<<mi_name>>, +//---------------------------- << start user >> -------------------------------- + HAUSER<<mi_name>>, + HWUSER<<mi_name>>, +//----------------------------- << end user >> --------------------------------- + +//------------------------------ << end out >> --------------------------------- +//------------------------------ << start in >> -------------------------------- + // Input port SI<<in>> (outputs to master <<in>>) + HRDATA<<si_name>>, + HREADYOUT<<si_name>>, + HRESP<<si_name>>, +//---------------------------- << start user >> ------------------------------ + HRUSER<<si_name>>, +//----------------------------- << end user >> ------------------------------- + +//------------------------------- << end in >> --------------------------------- + // Scan test dummy signals; not connected until scan insertion + SCANOUTHCLK // Scan Chain Output + + ); + + +// ----------------------------------------------------------------------------- +// Input and Output declarations +// ----------------------------------------------------------------------------- + + // Common AHB signals + input HCLK; // AHB System Clock + input HRESETn; // AHB System Reset + + // System address remapping control + input [3:0] REMAP; // REMAP input + +//------------------------------ << start in >> -------------------------------- + // Input port SI<<in>> (inputs from master <<in>>) + input HSEL<<si_name>>; // Slave Select + input [<<addr>>:0] HADDR<<si_name>>; // Address bus + input [1:0] HTRANS<<si_name>>; // Transfer type + input HWRITE<<si_name>>; // Transfer direction + input [2:0] HSIZE<<si_name>>; // Transfer size + input [2:0] HBURST<<si_name>>; // Burst type + input [<<prot>>:0] HPROT<<si_name>>; // Protection control +//---------------------------- << start unalign >> ----------------------------- + input HUNALIGN<<si_name>>; // Unalign signal + input [<<bstrb>>:0] HBSTRB<<si_name>>; // Byte strobes +//----------------------------- << end unalign >> ------------------------------ + input [3:0] HMASTER<<si_name>>; // Master select + input [<<data>>:0] HWDATA<<si_name>>; // Write data + input HMASTLOCK<<si_name>>; // Locked Sequence + input HREADY<<si_name>>; // Transfer done +//---------------------------- << start user >> -------------------------------- + input [<<user>>:0] HAUSER<<si_name>>; // Address USER signals + input [<<user>>:0] HWUSER<<si_name>>; // Write-data USER signals +//----------------------------- << end user >> --------------------------------- + +//------------------------------- << end in >> --------------------------------- +//----------------------------- << start out >> -------------------------------- + // Output port MI<<out>> (inputs from slave <<out>>) + input [<<data>>:0] HRDATA<<mi_name>>; // Read data bus + input HREADYOUT<<mi_name>>; // HREADY feedback + input [<<resp>>:0] HRESP<<mi_name>>; // Transfer response +//---------------------------- << start user >> -------------------------------- + input [<<user>>:0] HRUSER<<mi_name>>; // Read-data USER signals +//----------------------------- << end user >> --------------------------------- + +//------------------------------ << end out >> --------------------------------- + // Scan test dummy signals; not connected until scan insertion + input SCANENABLE; // Scan enable signal + input SCANINHCLK; // HCLK scan input + + +//----------------------------- << start out >> -------------------------------- + // Output port MI<<out>> (outputs to slave <<out>>) + output HSEL<<mi_name>>; // Slave Select + output [<<addr>>:0] HADDR<<mi_name>>; // Address bus + output [1:0] HTRANS<<mi_name>>; // Transfer type + output HWRITE<<mi_name>>; // Transfer direction + output [2:0] HSIZE<<mi_name>>; // Transfer size + output [2:0] HBURST<<mi_name>>; // Burst type + output [<<prot>>:0] HPROT<<mi_name>>; // Protection control +//---------------------------- << start unalign >> ----------------------------- + output HUNALIGN<<mi_name>>; // Unalign signal + output [<<bstrb>>:0] HBSTRB<<mi_name>>; // Byte strobes +//----------------------------- << end unalign >> ------------------------------ + output [3:0] HMASTER<<mi_name>>; // Master select + output [<<data>>:0] HWDATA<<mi_name>>; // Write data + output HMASTLOCK<<mi_name>>; // Locked Sequence + output HREADYMUX<<mi_name>>; // Transfer done +//---------------------------- << start user >> -------------------------------- + output [<<user>>:0] HAUSER<<mi_name>>; // Address USER signals + output [<<user>>:0] HWUSER<<mi_name>>; // Write-data USER signals +//----------------------------- << end user >> --------------------------------- + +//------------------------------ << end out >> --------------------------------- +//------------------------------ << start in >> -------------------------------- + // Input port SI<<in>> (outputs to master <<in>>) + output [<<data>>:0] HRDATA<<si_name>>; // Read data bus + output HREADYOUT<<si_name>>; // HREADY feedback + output [<<resp>>:0] HRESP<<si_name>>; // Transfer response +//---------------------------- << start user >> -------------------------------- + output [<<user>>:0] HRUSER<<si_name>>; // Read-data USER signals +//----------------------------- << end user >> --------------------------------- + +//------------------------------- << end in >> --------------------------------- + // Scan test dummy signals; not connected until scan insertion + output SCANOUTHCLK; // Scan Chain Output + + +// ----------------------------------------------------------------------------- +// Wire declarations +// ----------------------------------------------------------------------------- + + // Common AHB signals + wire HCLK; // AHB System Clock + wire HRESETn; // AHB System Reset + + // System address remapping control + wire [3:0] REMAP; // REMAP signal + +//------------------------------ << start in >> -------------------------------- + // Input Port SI<<in>> + wire HSEL<<si_name>>; // Slave Select + wire [<<addr>>:0] HADDR<<si_name>>; // Address bus + wire [1:0] HTRANS<<si_name>>; // Transfer type + wire HWRITE<<si_name>>; // Transfer direction + wire [2:0] HSIZE<<si_name>>; // Transfer size + wire [2:0] HBURST<<si_name>>; // Burst type + wire [<<prot>>:0] HPROT<<si_name>>; // Protection control +//---------------------------- << start unalign >> ----------------------------- + wire HUNALIGN<<si_name>>; // Unalign signal + wire [<<bstrb>>:0] HBSTRB<<si_name>>; // Byte strobes +//----------------------------- << end unalign >> ------------------------------ + wire [3:0] HMASTER<<si_name>>; // Master select + wire [<<data>>:0] HWDATA<<si_name>>; // Write data + wire HMASTLOCK<<si_name>>; // Locked Sequence + wire HREADY<<si_name>>; // Transfer done + + wire [<<data>>:0] HRDATA<<si_name>>; // Read data bus + wire HREADYOUT<<si_name>>; // HREADY feedback + wire [<<resp>>:0] HRESP<<si_name>>; // Transfer response +//---------------------------- << start user >> -------------------------------- + wire [<<user>>:0] HAUSER<<si_name>>; // Address USER signals + wire [<<user>>:0] HWUSER<<si_name>>; // Write-data USER signals + wire [<<user>>:0] HRUSER<<si_name>>; // Read-data USER signals +//----------------------------- << end user >> --------------------------------- + +//------------------------------- << end in >> --------------------------------- +//----------------------------- << start out >> -------------------------------- + // Output Port MI<<out>> + wire HSEL<<mi_name>>; // Slave Select + wire [<<addr>>:0] HADDR<<mi_name>>; // Address bus + wire [1:0] HTRANS<<mi_name>>; // Transfer type + wire HWRITE<<mi_name>>; // Transfer direction + wire [2:0] HSIZE<<mi_name>>; // Transfer size + wire [2:0] HBURST<<mi_name>>; // Burst type + wire [<<prot>>:0] HPROT<<mi_name>>; // Protection control +//---------------------------- << start unalign >> ----------------------------- + wire HUNALIGN<<mi_name>>; // Unalign signal + wire [<<bstrb>>:0] HBSTRB<<mi_name>>; // Byte strobes +//----------------------------- << end unalign >> ------------------------------ + wire [3:0] HMASTER<<mi_name>>; // Master select + wire [<<data>>:0] HWDATA<<mi_name>>; // Write data + wire HMASTLOCK<<mi_name>>; // Locked Sequence + wire HREADYMUX<<mi_name>>; // Transfer done + + wire [<<data>>:0] HRDATA<<mi_name>>; // Read data bus + wire HREADYOUT<<mi_name>>; // HREADY feedback + wire [<<resp>>:0] HRESP<<mi_name>>; // Transfer response +//---------------------------- << start user >> -------------------------------- + wire [<<user>>:0] HAUSER<<mi_name>>; // Address USER signals + wire [<<user>>:0] HWUSER<<mi_name>>; // Write-data USER signals + wire [<<user>>:0] HRUSER<<mi_name>>; // Read-data USER signals +//----------------------------- << end user >> --------------------------------- + +//------------------------------ << end out >> --------------------------------- + +// ----------------------------------------------------------------------------- +// Signal declarations +// ----------------------------------------------------------------------------- +//----------------------------- << start in >> --------------------------------- + + // Bus-switch input SI<<in>> + wire i_sel<<in>>; // HSEL signal + wire [<<addr>>:0] i_addr<<in>>; // HADDR signal + wire [1:0] i_trans<<in>>; // HTRANS signal + wire i_write<<in>>; // HWRITE signal + wire [2:0] i_size<<in>>; // HSIZE signal + wire [2:0] i_burst<<in>>; // HBURST signal + wire [<<prot>>:0] i_prot<<in>>; // HPROTS signal +//---------------------------- << start unalign >> ----------------------------- + wire i_unalign<<in>>; // HUNALIGN signal + wire [<<bstrb>>:0] i_bstrb<<in>>; // HBSTRB signal +//----------------------------- << end unalign >> ------------------------------ + wire [3:0] i_master<<in>>; // HMASTER signal + wire i_mastlock<<in>>; // HMASTLOCK signal + wire i_active<<in>>; // Active signal + wire i_held_tran<<in>>; // HeldTran signal + wire i_readyout<<in>>; // Readyout signal + wire [<<resp>>:0] i_resp<<in>>; // Response signal +//---------------------------- << start user >> -------------------------------- + wire [<<user>>:0] i_auser<<in>>; // HAUSER signal +//----------------------------- << end user >> --------------------------------- +//------------------------------ << end in >> ---------------------------------- + +//----------------------------- << start in >> --------------------------------- +//----------------------------- << start out >> -------------------------------- +//----------------------------- << start connection >> ------------------------- + // Bus-switch SI<<in>> to MI<<out>> signals + wire i_sel<<in>>to<<out>>; // Routing selection signal + wire i_active<<in>>to<<out>>; // Active signal + +//------------------------------ << end connection >> -------------------------- +//------------------------------ << end out >> --------------------------------- +//------------------------------ << end in >> ---------------------------------- +//----------------------------- << start out >> -------------------------------- + wire i_hready_mux_<<mi_name_lc>>; // Internal HREADYMUXM for MI<<out>> +//------------------------------ << end out >> --------------------------------- + + +// ----------------------------------------------------------------------------- +// Beginning of main code +// ----------------------------------------------------------------------------- + +//----------------------------- << start in >> --------------------------------- + // Input stage for SI<<in>> + <<input_stage_name>> u_<<input_stage_name>>_<<in>> ( + + // Common AHB signals + .HCLK (HCLK), + .HRESETn (HRESETn), + + // Input Port Address/Control Signals + .HSELS (HSEL<<si_name>>), + .HADDRS (HADDR<<si_name>>), + .HTRANSS (HTRANS<<si_name>>), + .HWRITES (HWRITE<<si_name>>), + .HSIZES (HSIZE<<si_name>>), + .HBURSTS (HBURST<<si_name>>), + .HPROTS (HPROT<<si_name>>), +//---------------------------- << start unalign >> ----------------------------- + .HUNALIGNS (HUNALIGN<<si_name>>), + .HBSTRBS (HBSTRB<<si_name>>), +//----------------------------- << end unalign >> ------------------------------ + .HMASTERS (HMASTER<<si_name>>), + .HMASTLOCKS (HMASTLOCK<<si_name>>), + .HREADYS (HREADY<<si_name>>), +//---------------------------- << start user >> -------------------------------- + .HAUSERS (HAUSER<<si_name>>), +//----------------------------- << end user >> --------------------------------- + + // Internal Response + .active_ip (i_active<<in>>), + .readyout_ip (i_readyout<<in>>), + .resp_ip (i_resp<<in>>), + + // Input Port Response + .HREADYOUTS (HREADYOUT<<si_name>>), + .HRESPS (HRESP<<si_name>>), + + // Internal Address/Control Signals + .sel_ip (i_sel<<in>>), + .addr_ip (i_addr<<in>>), +//---------------------------- << start user >> -------------------------------- + .auser_ip (i_auser<<in>>), +//----------------------------- << end user >> --------------------------------- + .trans_ip (i_trans<<in>>), + .write_ip (i_write<<in>>), + .size_ip (i_size<<in>>), + .burst_ip (i_burst<<in>>), + .prot_ip (i_prot<<in>>), +//---------------------------- << start unalign >> ----------------------------- + .unalign_ip (i_unalign<<in>>), + .bstrb_ip (i_bstrb<<in>>), +//----------------------------- << end unalign >> ------------------------------ + .master_ip (i_master<<in>>), + .mastlock_ip (i_mastlock<<in>>), + .held_tran_ip (i_held_tran<<in>>) + + ); + + +//------------------------------ << end in >> ---------------------------------- +//------------------------------ << start in >> -------------------------------- + // Matrix decoder for SI<<in>> + <<matrix_decode_name>> u_<<matrix_decode_name_lc>> ( + + // Common AHB signals + .HCLK (HCLK), + .HRESETn (HRESETn), + +//---------------------------- << start remap >> ------------------------------- + // Internal address remapping control + .remapping_dec ( <<remapping_vector>> ), + +//----------------------------- << end remap >> -------------------------------- + // Signals from Input stage SI<<in>> + .HREADYS (HREADY<<si_name>>), + .sel_dec (i_sel<<in>>), + .decode_addr_dec (i_addr<<in>>[<<addr>>:10]), // HADDR[9:0] is not decoded + .trans_dec (i_trans<<in>>), + +//----------------------------- << start out >> -------------------------------- +//----------------------------- << start connection >> ------------------------- + // Control/Response for Output Stage MI<<out>> + .active_dec<<out>> (i_active<<in>>to<<out>>), + .readyout_dec<<out>> (i_hready_mux_<<mi_name_lc>>), + .resp_dec<<out>> (HRESP<<mi_name>>), + .rdata_dec<<out>> (HRDATA<<mi_name>>), +//---------------------------- << start user >> -------------------------------- + .ruser_dec<<out>> (HRUSER<<mi_name>>), +//----------------------------- << end user >> --------------------------------- + +//------------------------------ << end connection >> -------------------------- +//------------------------------ << end out >> --------------------------------- +//----------------------------- << start out >> -------------------------------- +//----------------------------- << start connection >> ------------------------- + .sel_dec<<out>> (i_sel<<in>>to<<out>>), +//------------------------------ << end connection >> -------------------------- +//------------------------------ << end out >> --------------------------------- + + .active_dec (i_active<<in>>), + .HREADYOUTS (i_readyout<<in>>), + .HRESPS (i_resp<<in>>), +//---------------------------- << start user >> -------------------------------- + .HRUSERS (HRUSER<<si_name>>), +//----------------------------- << end user >> --------------------------------- + .HRDATAS (HRDATA<<si_name>>) + + ); + + +//------------------------------ << end in >> ---------------------------------- +//----------------------------- << start out >> -------------------------------- + // Output stage for MI<<out>> + <<output_stage_name>> u_<<output_stage_name_lc>>_<<out>> ( + + // Common AHB signals + .HCLK (HCLK), + .HRESETn (HRESETn), + +//------------------------------ << start in >> -------------------------------- +//----------------------------- << start connection >> ------------------------- + // Port <<in>> Signals + .sel_op<<in>> (i_sel<<in>>to<<out>>), + .addr_op<<in>> (i_addr<<in>>), +//---------------------------- << start user >> -------------------------------- + .auser_op<<in>> (i_auser<<in>>), +//----------------------------- << end user >> --------------------------------- + .trans_op<<in>> (i_trans<<in>>), + .write_op<<in>> (i_write<<in>>), + .size_op<<in>> (i_size<<in>>), + .burst_op<<in>> (i_burst<<in>>), + .prot_op<<in>> (i_prot<<in>>), +//---------------------------- << start unalign >> ----------------------------- + .unalign_op<<in>> (i_unalign<<in>>), + .bstrb_op<<in>> (i_bstrb<<in>>), +//----------------------------- << end unalign >> ------------------------------ + .master_op<<in>> (i_master<<in>>), + .mastlock_op<<in>> (i_mastlock<<in>>), + .wdata_op<<in>> (HWDATA<<si_name>>), +//---------------------------- << start user >> -------------------------------- + .wuser_op<<in>> (HWUSER<<si_name>>), +//----------------------------- << end user >> --------------------------------- + .held_tran_op<<in>> (i_held_tran<<in>>), + +//------------------------------ << end connection >> -------------------------- +//------------------------------ << end in >> ---------------------------------- + // Slave read data and response + .HREADYOUTM (HREADYOUT<<mi_name>>), + +//------------------------------ << start in >> -------------------------------- +//----------------------------- << start connection >> ------------------------- + .active_op<<in>> (i_active<<in>>to<<out>>), +//------------------------------ << end connection >> -------------------------- +//------------------------------ << end in >> ---------------------------------- + + // Slave Address/Control Signals + .HSELM (HSEL<<mi_name>>), + .HADDRM (HADDR<<mi_name>>), +//---------------------------- << start user >> -------------------------------- + .HAUSERM (HAUSER<<mi_name>>), +//----------------------------- << end user >> --------------------------------- + .HTRANSM (HTRANS<<mi_name>>), + .HWRITEM (HWRITE<<mi_name>>), + .HSIZEM (HSIZE<<mi_name>>), + .HBURSTM (HBURST<<mi_name>>), + .HPROTM (HPROT<<mi_name>>), +//---------------------------- << start unalign >> ----------------------------- + .HUNALIGNM (HUNALIGN<<mi_name>>), + .HBSTRBM (HBSTRB<<mi_name>>), +//----------------------------- << end unalign >> ------------------------------ + .HMASTERM (HMASTER<<mi_name>>), + .HMASTLOCKM (HMASTLOCK<<mi_name>>), + .HREADYMUXM (i_hready_mux_<<mi_name_lc>>), +//---------------------------- << start user >> -------------------------------- + .HWUSERM (HWUSER<<mi_name>>), +//----------------------------- << end user >> --------------------------------- + .HWDATAM (HWDATA<<mi_name>>) + + ); + + // Drive output with internal version + assign HREADYMUX<<mi_name>> = i_hready_mux_<<mi_name_lc>>; + + +//------------------------------ << end out >> --------------------------------- +endmodule + +// --================================= End ===================================-- diff --git a/Cortex-M0/nanosoc/systems/mcu/verilog/gen_ahb_busmatrix/verilog/src/cmsdk_ahb_busmatrix_lite.v b/Cortex-M0/nanosoc/systems/mcu/verilog/gen_ahb_busmatrix/verilog/src/cmsdk_ahb_busmatrix_lite.v new file mode 100755 index 0000000..44f8be4 --- /dev/null +++ b/Cortex-M0/nanosoc/systems/mcu/verilog/gen_ahb_busmatrix/verilog/src/cmsdk_ahb_busmatrix_lite.v @@ -0,0 +1,340 @@ +//----------------------------------------------------------------------------- +// The confidential and proprietary information contained in this file may +// only be used by a person authorised under and to the extent permitted +// by a subsisting licensing agreement from Arm Limited or its affiliates. +// +// (C) COPYRIGHT 2001-<<copyright_year>> Arm Limited or its affiliates. +// ALL RIGHTS RESERVED +// +// This entire notice must be reproduced on all copies of this file +// and copies of this file may only be made by a person if such person is +// permitted to do so under the terms of a subsisting license agreement +// from Arm Limited or its affiliates. +// +// SVN Information +// +// Checked In : $Date: 2017-10-10 15:55:38 +0100 (Tue, 10 Oct 2017) $ +// +// Revision : $Revision: 371321 $ +// +// Release Information : Cortex-M System Design Kit-r1p1-00rel0 +// +//----------------------------------------------------------------------------- +// +//------------------------------------------------------------------------------ +// Abstract : BusMatrixLite is a wrapper module that wraps around +// the BusMatrix module to give AHB Lite compliant +// slave and master interfaces. +// +//----------------------------------------------------------------------------- + +<<timescale_directive>> + +module <<component_name>> ( + + // Common AHB signals + HCLK, + HRESETn, + + // System Address Remap control + REMAP, + +//------------------------------ << start in >> -------------------------------- + // Input port SI<<in>> (inputs from master <<in>>) + HADDR<<si_name>>, + HTRANS<<si_name>>, + HWRITE<<si_name>>, + HSIZE<<si_name>>, + HBURST<<si_name>>, + HPROT<<si_name>>, + HWDATA<<si_name>>, + HMASTLOCK<<si_name>>, +//---------------------------- << start user >> -------------------------------- + HAUSER<<si_name>>, + HWUSER<<si_name>>, +//----------------------------- << end user >> --------------------------------- + +//------------------------------- << end in >> --------------------------------- +//----------------------------- << start out >> -------------------------------- + // Output port MI<<out>> (inputs from slave <<out>>) + HRDATA<<mi_name>>, + HREADYOUT<<mi_name>>, + HRESP<<mi_name>>, +//---------------------------- << start user >> ------------------------------ + HRUSER<<mi_name>>, +//----------------------------- << end user >> ------------------------------- + +//------------------------------ << end out >> --------------------------------- + // Scan test dummy signals; not connected until scan insertion + SCANENABLE, // Scan Test Mode Enable + SCANINHCLK, // Scan Chain Input + + +//----------------------------- << start out >> -------------------------------- + // Output port MI<<out>> (outputs to slave <<out>>) + HSEL<<mi_name>>, + HADDR<<mi_name>>, + HTRANS<<mi_name>>, + HWRITE<<mi_name>>, + HSIZE<<mi_name>>, + HBURST<<mi_name>>, + HPROT<<mi_name>>, + HWDATA<<mi_name>>, + HMASTLOCK<<mi_name>>, + HREADYMUX<<mi_name>>, +//---------------------------- << start user >> -------------------------------- + HAUSER<<mi_name>>, + HWUSER<<mi_name>>, +//----------------------------- << end user >> --------------------------------- + +//------------------------------ << end out >> --------------------------------- +//------------------------------ << start in >> -------------------------------- + // Input port SI<<in>> (outputs to master <<in>>) + HRDATA<<si_name>>, + HREADY<<si_name>>, + HRESP<<si_name>>, +//---------------------------- << start user >> ------------------------------ + HRUSER<<si_name>>, +//----------------------------- << end user >> ------------------------------- + +//------------------------------- << end in >> --------------------------------- + // Scan test dummy signals; not connected until scan insertion + SCANOUTHCLK // Scan Chain Output + + ); + +// ----------------------------------------------------------------------------- +// Input and Output declarations +// ----------------------------------------------------------------------------- + + // Common AHB signals + input HCLK; // AHB System Clock + input HRESETn; // AHB System Reset + + // System Address Remap control + input [3:0] REMAP; // System Address REMAP control + +//------------------------------ << start in >> -------------------------------- + // Input port SI<<in>> (inputs from master <<in>>) + input [<<addr>>:0] HADDR<<si_name>>; // Address bus + input [1:0] HTRANS<<si_name>>; // Transfer type + input HWRITE<<si_name>>; // Transfer direction + input [2:0] HSIZE<<si_name>>; // Transfer size + input [2:0] HBURST<<si_name>>; // Burst type + input [<<prot>>:0] HPROT<<si_name>>; // Protection control + input [<<data>>:0] HWDATA<<si_name>>; // Write data + input HMASTLOCK<<si_name>>; // Locked Sequence +//---------------------------- << start user >> -------------------------------- + input [<<user>>:0] HAUSER<<si_name>>; // Address USER signals + input [<<user>>:0] HWUSER<<si_name>>; // Write-data USER signals +//----------------------------- << end user >> --------------------------------- + +//------------------------------- << end in >> --------------------------------- +//----------------------------- << start out >> -------------------------------- + // Output port MI<<out>> (inputs from slave <<out>>) + input [<<data>>:0] HRDATA<<mi_name>>; // Read data bus + input HREADYOUT<<mi_name>>; // HREADY feedback + input HRESP<<mi_name>>; // Transfer response +//---------------------------- << start user >> -------------------------------- + input [<<user>>:0] HRUSER<<mi_name>>; // Read-data USER signals +//----------------------------- << end user >> --------------------------------- + +//------------------------------ << end out >> --------------------------------- + // Scan test dummy signals; not connected until scan insertion + input SCANENABLE; // Scan enable signal + input SCANINHCLK; // HCLK scan input + + +//----------------------------- << start out >> -------------------------------- + // Output port MI<<out>> (outputs to slave <<out>>) + output HSEL<<mi_name>>; // Slave Select + output [<<addr>>:0] HADDR<<mi_name>>; // Address bus + output [1:0] HTRANS<<mi_name>>; // Transfer type + output HWRITE<<mi_name>>; // Transfer direction + output [2:0] HSIZE<<mi_name>>; // Transfer size + output [2:0] HBURST<<mi_name>>; // Burst type + output [<<prot>>:0] HPROT<<mi_name>>; // Protection control + output [<<data>>:0] HWDATA<<mi_name>>; // Write data + output HMASTLOCK<<mi_name>>; // Locked Sequence + output HREADYMUX<<mi_name>>; // Transfer done +//---------------------------- << start user >> -------------------------------- + output [<<user>>:0] HAUSER<<mi_name>>; // Address USER signals + output [<<user>>:0] HWUSER<<mi_name>>; // Write-data USER signals +//----------------------------- << end user >> --------------------------------- + +//------------------------------ << end out >> --------------------------------- +//------------------------------ << start in >> -------------------------------- + // Input port SI<<in>> (outputs to master <<in>>) + output [<<data>>:0] HRDATA<<si_name>>; // Read data bus + output HREADY<<si_name>>; // HREADY feedback + output HRESP<<si_name>>; // Transfer response +//---------------------------- << start user >> -------------------------------- + output [<<user>>:0] HRUSER<<si_name>>; // Read-data USER signals +//----------------------------- << end user >> --------------------------------- + +//------------------------------- << end in >> --------------------------------- + // Scan test dummy signals; not connected until scan insertion + output SCANOUTHCLK; // Scan Chain Output + +// ----------------------------------------------------------------------------- +// Wire declarations +// ----------------------------------------------------------------------------- + + // Common AHB signals + wire HCLK; // AHB System Clock + wire HRESETn; // AHB System Reset + + // System Address Remap control + wire [3:0] REMAP; // System REMAP signal + +//------------------------------ << start in >> -------------------------------- + // Input Port SI<<in>> + wire [<<addr>>:0] HADDR<<si_name>>; // Address bus + wire [1:0] HTRANS<<si_name>>; // Transfer type + wire HWRITE<<si_name>>; // Transfer direction + wire [2:0] HSIZE<<si_name>>; // Transfer size + wire [2:0] HBURST<<si_name>>; // Burst type + wire [<<prot>>:0] HPROT<<si_name>>; // Protection control + wire [<<data>>:0] HWDATA<<si_name>>; // Write data + wire HMASTLOCK<<si_name>>; // Locked Sequence + + wire [<<data>>:0] HRDATA<<si_name>>; // Read data bus + wire HREADY<<si_name>>; // HREADY feedback + wire HRESP<<si_name>>; // Transfer response +//---------------------------- << start user >> -------------------------------- + wire [<<user>>:0] HAUSER<<si_name>>; // Address USER signals + wire [<<user>>:0] HWUSER<<si_name>>; // Write-data USER signals + wire [<<user>>:0] HRUSER<<si_name>>; // Read-data USER signals +//----------------------------- << end user >> --------------------------------- + +//------------------------------- << end in >> --------------------------------- +//----------------------------- << start out >> -------------------------------- + // Output Port MI<<out>> + wire HSEL<<mi_name>>; // Slave Select + wire [<<addr>>:0] HADDR<<mi_name>>; // Address bus + wire [1:0] HTRANS<<mi_name>>; // Transfer type + wire HWRITE<<mi_name>>; // Transfer direction + wire [2:0] HSIZE<<mi_name>>; // Transfer size + wire [2:0] HBURST<<mi_name>>; // Burst type + wire [<<prot>>:0] HPROT<<mi_name>>; // Protection control + wire [<<data>>:0] HWDATA<<mi_name>>; // Write data + wire HMASTLOCK<<mi_name>>; // Locked Sequence + wire HREADYMUX<<mi_name>>; // Transfer done + + wire [<<data>>:0] HRDATA<<mi_name>>; // Read data bus + wire HREADYOUT<<mi_name>>; // HREADY feedback + wire HRESP<<mi_name>>; // Transfer response +//---------------------------- << start user >> -------------------------------- + wire [<<user>>:0] HAUSER<<mi_name>>; // Address USER signals + wire [<<user>>:0] HWUSER<<mi_name>>; // Write-data USER signals + wire [<<user>>:0] HRUSER<<mi_name>>; // Read-data USER signals +//----------------------------- << end user >> --------------------------------- + +//------------------------------ << end out >> --------------------------------- + +// ----------------------------------------------------------------------------- +// Signal declarations +// ----------------------------------------------------------------------------- + wire [3:0] tie_hi_4; + wire tie_hi; + wire tie_low; +//------------------------------ << start in >> -------------------------------- + wire [<<resp>>:0] i_hresp<<si_name>>; +//------------------------------- << end in >> --------------------------------- + +//----------------------------- << start out >> -------------------------------- + wire [3:0] i_hmaster<<mi_name>>; + wire [<<resp>>:0] i_hresp<<mi_name>>; +//------------------------------ << end out >> --------------------------------- + +// ----------------------------------------------------------------------------- +// Beginning of main code +// ----------------------------------------------------------------------------- + + assign tie_hi = 1'b1; + assign tie_hi_4 = 4'b1111; + assign tie_low = 1'b0; + +//------------------------------ << start in >> -------------------------------- + + assign HRESP<<si_name>> = i_hresp<<si_name>>[0]; +//------------------------------- << end in >> --------------------------------- + +//----------------------------- << start out >> -------------------------------- + assign i_hresp<<mi_name>> = {{<<resp>>{tie_low}}, HRESP<<mi_name>>}; +//------------------------------ << end out >> --------------------------------- + +// BusMatrix instance + <<bus_matrix_name>> u<<bus_matrix_name>> ( + .HCLK (HCLK), + .HRESETn (HRESETn), + .REMAP (REMAP), + +//------------------------------ << start in >> -------------------------------- + // Input port SI<<in>> signals + .HSEL<<si_name>> (tie_hi), + .HADDR<<si_name>> (HADDR<<si_name>>), + .HTRANS<<si_name>> (HTRANS<<si_name>>), + .HWRITE<<si_name>> (HWRITE<<si_name>>), + .HSIZE<<si_name>> (HSIZE<<si_name>>), + .HBURST<<si_name>> (HBURST<<si_name>>), + .HPROT<<si_name>> (HPROT<<si_name>>), +//---------------------------- << start unalign >> ----------------------------- + .HUNALIGN<<si_name>> (tie_low), + .HBSTRB<<si_name>> ({(<<bstrb>>+1){tie_low}}), +//----------------------------- << end unalign >> ------------------------------ + .HWDATA<<si_name>> (HWDATA<<si_name>>), + .HMASTLOCK<<si_name>> (HMASTLOCK<<si_name>>), + .HMASTER<<si_name>> (tie_hi_4), + .HREADY<<si_name>> (HREADY<<si_name>>), +//---------------------------- << start user >> -------------------------------- + .HAUSER<<si_name>> (HAUSER<<si_name>>), + .HWUSER<<si_name>> (HWUSER<<si_name>>), +//----------------------------- << end user >> --------------------------------- + .HRDATA<<si_name>> (HRDATA<<si_name>>), + .HREADYOUT<<si_name>> (HREADY<<si_name>>), + .HRESP<<si_name>> (i_hresp<<si_name>>), +//---------------------------- << start user >> ------------------------------ + .HRUSER<<si_name>> (HRUSER<<si_name>>), +//----------------------------- << end user >> ------------------------------- + +//------------------------------- << end in >> --------------------------------- + +//----------------------------- << start out >> -------------------------------- + // Output port MI<<out>> signals + .HSEL<<mi_name>> (HSEL<<mi_name>>), + .HADDR<<mi_name>> (HADDR<<mi_name>>), + .HTRANS<<mi_name>> (HTRANS<<mi_name>>), + .HWRITE<<mi_name>> (HWRITE<<mi_name>>), + .HSIZE<<mi_name>> (HSIZE<<mi_name>>), + .HBURST<<mi_name>> (HBURST<<mi_name>>), + .HPROT<<mi_name>> (HPROT<<mi_name>>), +//---------------------------- << start unalign >> ----------------------------- + .HUNALIGN<<mi_name>> ( /* open */ ), + .HBSTRB<<mi_name>> ( /* open */ ), +//----------------------------- << end unalign >> ------------------------------ + .HWDATA<<mi_name>> (HWDATA<<mi_name>>), + .HMASTER<<mi_name>> (i_hmaster<<mi_name>>), + .HMASTLOCK<<mi_name>> (HMASTLOCK<<mi_name>>), + .HREADYMUX<<mi_name>> (HREADYMUX<<mi_name>>), +//---------------------------- << start user >> -------------------------------- + .HAUSER<<mi_name>> (HAUSER<<mi_name>>), + .HWUSER<<mi_name>> (HWUSER<<mi_name>>), +//----------------------------- << end user >> --------------------------------- + .HRDATA<<mi_name>> (HRDATA<<mi_name>>), + .HREADYOUT<<mi_name>> (HREADYOUT<<mi_name>>), + .HRESP<<mi_name>> (i_hresp<<mi_name>>), +//---------------------------- << start user >> ------------------------------ + .HRUSER<<mi_name>> (HRUSER<<mi_name>>), +//----------------------------- << end user >> ------------------------------- + +//------------------------------ << end out >> --------------------------------- + + // Scan test dummy signals; not connected until scan insertion + .SCANENABLE (SCANENABLE), + .SCANINHCLK (SCANINHCLK), + .SCANOUTHCLK (SCANOUTHCLK) + ); + + +endmodule diff --git a/Cortex-M0/nanosoc/systems/mcu/verilog/gen_ahb_busmatrix/xml/example2x3_full.xml b/Cortex-M0/nanosoc/systems/mcu/verilog/gen_ahb_busmatrix/xml/example2x3_full.xml new file mode 100755 index 0000000..63fec5d --- /dev/null +++ b/Cortex-M0/nanosoc/systems/mcu/verilog/gen_ahb_busmatrix/xml/example2x3_full.xml @@ -0,0 +1,85 @@ +<?xml version="1.0" encoding="iso-8859-1" ?> + +<!-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - --> +<!-- The confidential and proprietary information contained in this file --> +<!-- may only be used by a person authorised under and to the extent --> +<!-- permitted by a subsisting licensing agreement from Arm Limited or its affiliates. --> +<!-- --> +<!-- (C) COPYRIGHT 2001-2013 Arm Limited or its affiliates. --> +<!-- ALL RIGHTS RESERVED --> +<!-- --> +<!-- This entire notice must be reproduced on all copies of this file --> +<!-- and copies of this file may only be made by a person if such person --> +<!-- is permitted to do so under the terms of a subsisting license --> +<!-- agreement from Arm Limited or its affiliates. --> +<!-- --> +<!-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - --> +<!-- Version and Release Control Information: --> +<!-- --> +<!-- Checked In : $Date: 2017-10-10 15:55:38 +0100 (Tue, 10 Oct 2017) $ --> +<!-- --> +<!-- Revision : $Revision: 371321 $ --> +<!-- --> +<!-- Release Information : Cortex-M System Design Kit-r1p1-00rel0 --> +<!-- --> +<!-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - --> +<!-- Purpose : Example XML file, defining an interconnect for --> +<!-- 2 AHB Masters and 3 AHB Slaves. --> +<!-- --> +<!-- Note : This information will overwrite parameters --> +<!-- specified on the command line --> +<!-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - --> + +<cfgfile> + + <!-- - - - - *** DO NOT MODIFY ABOVE THIS LINE *** - - - - - - - - - - - --> + + <!-- Global definitions --> + + <architecture_version>ahb2</architecture_version> + <arbitration_scheme>round</arbitration_scheme> + <routing_data_width>32</routing_data_width> + <routing_address_width>32</routing_address_width> + <user_signal_width>32</user_signal_width> + <bus_matrix_name>cmsdk_MyBusMatrixName</bus_matrix_name> + <input_stage_name>cmsdk_MyInputName</input_stage_name> + <matrix_decode_name>cmsdk_MyDecoderName</matrix_decode_name> + <output_arbiter_name>cmsdk_MyArbiterName</output_arbiter_name> + <output_stage_name>cmsdk_MyOutputName</output_stage_name> + + + <!-- Slave interface definitions --> + + <slave_interface name="S0"> + <sparse_connect interface="M0"/> + <sparse_connect interface= "M1"/> + <sparse_connect interface= "M2"/> + <address_region interface="M0" mem_lo="00000000" mem_hi='1fffffff' remapping='none'/> + <address_region interface="M0" mem_lo="20000000" mem_hi="2fffffff" remapping='none'/> + <address_region interface="M1" mem_lo="30000000" mem_hi="4fffffff" remapping='none'/> + <address_region interface="M2" mem_lo="50000000" mem_hi="5fffffff" remapping='none'/> + <remap_region interface="M0" mem_lo="00000000" mem_hi="0000ffff" bit="0"/> + </slave_interface> + + + <slave_interface name="S1"> + <sparse_connect interface="M0"/> + <sparse_connect interface="M1"/> + <sparse_connect interface="M2"/> + <address_region interface="M0" mem_lo="00000000" mem_hi="2fffffff" remapping='none'/> + <address_region interface="M1" mem_lo="30000000" mem_hi="4fffffff" remapping='none'/> + <address_region interface="M1" mem_lo="50000000" mem_hi="7fffffff" remapping='none'/> + <remap_region interface="M1" mem_lo="00000000" mem_hi="0001ffff" bit="0"/> + <address_region interface="M2" mem_lo="80000000" mem_hi="9fffffff" remapping='none'/> + </slave_interface> + + + <!-- Master interface definitions --> + + <master_interface name="M0"/> + <master_interface name="M1"/> + <master_interface name="M2"/> + + <!-- - - - - *** DO NOT MODIFY BELOW THIS LINE *** - - - - - - - - - - - --> + +</cfgfile> diff --git a/Cortex-M0/nanosoc/systems/mcu/verilog/gen_ahb_busmatrix/xml/example2x3_sparse.xml b/Cortex-M0/nanosoc/systems/mcu/verilog/gen_ahb_busmatrix/xml/example2x3_sparse.xml new file mode 100755 index 0000000..ae3bf3c --- /dev/null +++ b/Cortex-M0/nanosoc/systems/mcu/verilog/gen_ahb_busmatrix/xml/example2x3_sparse.xml @@ -0,0 +1,81 @@ +<?xml version="1.0" encoding="iso-8859-1" ?> + +<!-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - --> +<!-- The confidential and proprietary information contained in this file --> +<!-- may only be used by a person authorised under and to the extent --> +<!-- permitted by a subsisting licensing agreement from Arm Limited or its affiliates. --> +<!-- --> +<!-- (C) COPYRIGHT 2001-2013,2017 Arm Limited or its affiliates. --> +<!-- ALL RIGHTS RESERVED --> +<!-- --> +<!-- This entire notice must be reproduced on all copies of this file --> +<!-- and copies of this file may only be made by a person if such person --> +<!-- is permitted to do so under the terms of a subsisting license --> +<!-- agreement from Arm Limited or its affiliates. --> +<!-- --> +<!-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - --> +<!-- Version and Release Control Information: --> +<!-- --> +<!-- Checked In : $Date: 2017-10-10 15:55:38 +0100 (Tue, 10 Oct 2017) $ --> +<!-- --> +<!-- Revision : $Revision: 371321 $ --> +<!-- --> +<!-- Release Information : Cortex-M System Design Kit-r1p1-00rel0 --> +<!-- --> +<!-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - --> +<!-- Purpose : Example XML file, defining an interconnect for --> +<!-- 2 AHB Masters and 3 AHB Slaves. --> +<!-- --> +<!-- Note : This information will overwrite parameters --> +<!-- specified on the command line --> +<!-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - --> + +<cfgfile> + + <!-- - - - - *** DO NOT MODIFY ABOVE THIS LINE *** - - - - - - - - - - - --> + + <!-- Global definitions --> + + <architecture_version>v6</architecture_version> + <arbitration_scheme>fixed</arbitration_scheme> + <routing_data_width>32</routing_data_width> + <routing_address_width>32</routing_address_width> + <user_signal_width>32</user_signal_width> + <bus_matrix_name>cmsdk_MyBusMatrixName</bus_matrix_name> + <input_stage_name>cmsdk_MyInputName</input_stage_name> + <matrix_decode_name>cmsdk_MyDecoderName</matrix_decode_name> + <output_arbiter_name>cmsdk_MyArbiterName</output_arbiter_name> + <output_stage_name>cmsdk_MyOutputName</output_stage_name> + + + <!-- Slave interface definitions --> + + <slave_interface name="S0"> + <sparse_connect interface="M0"/> + <sparse_connect interface= "M1"/> + <address_region interface="M0" mem_lo="00000000" mem_hi='1fffffff' remapping='none'/> + <address_region interface="M0" mem_lo="20000000" mem_hi="2fffffff" remapping='none'/> + <address_region interface="M1" mem_lo="30000000" mem_hi="4fffffff" remapping='none'/> + <remap_region interface="M0" mem_lo="00000000" mem_hi="0000ffff" bit="0"/> + </slave_interface> + + + <slave_interface name="S1"> + <sparse_connect interface="M1"/> + <sparse_connect interface="M2"/> + <address_region interface="M1" mem_lo="30000000" mem_hi="4fffffff" remapping='none'/> + <address_region interface="M1" mem_lo="50000000" mem_hi="7fffffff" remapping='none'/> + <remap_region interface="M1" mem_lo="00000000" mem_hi="0001ffff" bit="0"/> + <address_region interface="M2" mem_lo="80000000" mem_hi="9fffffff" remapping='none'/> + </slave_interface> + + + <!-- Master interface definitions --> + + <master_interface name="M0"/> + <master_interface name="M1"/> + <master_interface name="M2"/> + + <!-- - - - - *** DO NOT MODIFY BELOW THIS LINE *** - - - - - - - - - - - --> + +</cfgfile> diff --git a/Cortex-M0/nanosoc/systems/mcu/verilog/gen_ahb_busmatrix/xml/soclabs_ahb32_4x7.xml b/Cortex-M0/nanosoc/systems/mcu/verilog/gen_ahb_busmatrix/xml/soclabs_ahb32_4x7.xml new file mode 100644 index 0000000..b1ddc80 --- /dev/null +++ b/Cortex-M0/nanosoc/systems/mcu/verilog/gen_ahb_busmatrix/xml/soclabs_ahb32_4x7.xml @@ -0,0 +1,156 @@ +<?xml version="1.0" encoding="iso-8859-1" ?> + +<!--//----------------------------------------------------------------------------- --> +<!--// customised interconnect specification for ADP/DMA/ Cortex-M0 controller --> +<!--// --> +<!--// Contributors --> +<!--// --> +<!--// David Flynn (d.w.flynn@soton.ac.uk) --> +<!--// --> +<!--// Copyright (C) 2023, SoC Labs (www.soclabs.org) --> +<!--//----------------------------------------------------------------------------- --> + +<!-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - --> +<!-- The confidential and proprietary information contained in this file --> +<!-- may only be used by a person authorised under and to the extent --> +<!-- permitted by a subsisting licensing agreement from Arm Limited or its affiliates. --> +<!-- --> +<!-- (C) COPYRIGHT 2001-2013 Arm Limited or its affiliates. --> +<!-- ALL RIGHTS RESERVED --> +<!-- --> +<!-- This entire notice must be reproduced on all copies of this file --> +<!-- and copies of this file may only be made by a person if such person --> +<!-- is permitted to do so under the terms of a subsisting license --> +<!-- agreement from Arm Limited or its affiliates. --> +<!-- --> +<!-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - --> +<!-- Version and Release Control Information: --> +<!-- --> +<!-- Checked In : $Date: 2017-10-10 15:55:38 +0100 (Tue, 10 Oct 2017) $ --> +<!-- --> +<!-- Revision : $Revision: 371321 $ --> +<!-- --> +<!-- Release Information : Cortex-M System Design Kit-r1p1-00rel0 --> +<!-- --> +<!-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - --> +<!-- Purpose : based on Example XML file, defining an interconnect for --> +<!-- (was 2 AHB Masters and 3 AHB Slaves.) --> +<!-- 5 AHB subordinates and 3 AHB controllers --> +<!-- --> +<!-- Note : This information will overwrite parameters --> +<!-- specified on the command line --> +<!-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - --> + +<cfgfile> + + <!-- - - - - *** DO NOT MODIFY ABOVE THIS LINE *** - - - - - - - - - - - --> + + <!-- Global definitions --> + + <architecture_version>ahb2</architecture_version> + <arbitration_scheme>burst</arbitration_scheme> + <routing_data_width>32</routing_data_width> + <routing_address_width>32</routing_address_width> + <user_signal_width>2</user_signal_width> + <bus_matrix_name>soclabs_4x7_AhbMatrix</bus_matrix_name> + <input_stage_name>soclabs_4x7_MasterInput</input_stage_name> + <matrix_decode_name>soclabs_4x7_MatrixDecode</matrix_decode_name> + <output_arbiter_name>soclabs_4x7_Arbiter</output_arbiter_name> + <output_stage_name>soclabs_4x7_SlaveOutput</output_stage_name> + + + <!-- Slave interface definitions --> + + <slave_interface name="_adp"> + <sparse_connect interface="_rom1"/> + <sparse_connect interface="_ram2"/> + <sparse_connect interface="_ram3"/> + <sparse_connect interface="_sys"/> + <sparse_connect interface="_exp"/> + <sparse_connect interface="_ram8"/> + <sparse_connect interface="_ram9"/> + <address_region interface="_rom1" mem_lo='00000000' mem_hi='0fffffff' remapping='move'/> + <address_region interface="_rom1" mem_lo='10000000' mem_hi='1fffffff' remapping='none'/> + <address_region interface="_ram2" mem_lo='20000000' mem_hi='2fffffff' remapping='none'/> + <address_region interface="_ram3" mem_lo='30000000' mem_hi='3fffffff' remapping='none'/> + <address_region interface="_sys" mem_lo='40000000' mem_hi='5fffffff' remapping='none'/> + <address_region interface="_exp" mem_lo='60000000' mem_hi='7fffffff' remapping='none'/> + <address_region interface="_ram8" mem_lo='80000000' mem_hi='8fffffff' remapping='none'/> + <address_region interface="_ram9" mem_lo='90000000' mem_hi='9fffffff' remapping='none'/> + <address_region interface="_exp" mem_lo='a0000000' mem_hi='dfffffff' remapping='none'/> + <address_region interface="_sys" mem_lo='f0000000' mem_hi='f003ffff' remapping='none'/> + <remap_region interface="_ram2" mem_lo='00000000' mem_hi='0fffffff' bit='0'/> + </slave_interface> + + <slave_interface name="_dma"> + <sparse_connect interface="_rom1"/> + <sparse_connect interface="_ram2"/> + <sparse_connect interface="_ram3"/> + <sparse_connect interface="_sys"/> + <sparse_connect interface="_exp"/> + <sparse_connect interface="_ram8"/> + <sparse_connect interface="_ram9"/> + <address_region interface="_ram2" mem_lo='00000000' mem_hi='0fffffff' remapping='none'/> + <address_region interface="_rom1" mem_lo='10000000' mem_hi='1fffffff' remapping='none'/> + <address_region interface="_ram2" mem_lo='20000000' mem_hi='2fffffff' remapping='none'/> + <address_region interface="_ram3" mem_lo='30000000' mem_hi='3fffffff' remapping='none'/> + <address_region interface="_sys" mem_lo='40000000' mem_hi='5fffffff' remapping='none'/> + <address_region interface="_exp" mem_lo='60000000' mem_hi='7fffffff' remapping='none'/> + <address_region interface="_ram8" mem_lo='80000000' mem_hi='8fffffff' remapping='none'/> + <address_region interface="_ram9" mem_lo='90000000' mem_hi='9fffffff' remapping='none'/> + <address_region interface="_exp" mem_lo='a0000000' mem_hi='dfffffff' remapping='none'/> + </slave_interface> + + <slave_interface name="_dma2"> + <sparse_connect interface="_rom1"/> + <sparse_connect interface="_ram2"/> + <sparse_connect interface="_ram3"/> + <sparse_connect interface="_sys"/> + <sparse_connect interface="_exp"/> + <sparse_connect interface="_ram8"/> + <sparse_connect interface="_ram9"/> + <address_region interface="_ram2" mem_lo='00000000' mem_hi='0fffffff' remapping='none'/> + <address_region interface="_rom1" mem_lo='10000000' mem_hi='1fffffff' remapping='none'/> + <address_region interface="_ram2" mem_lo='20000000' mem_hi='2fffffff' remapping='none'/> + <address_region interface="_ram3" mem_lo='30000000' mem_hi='3fffffff' remapping='none'/> + <address_region interface="_sys" mem_lo='40000000' mem_hi='5fffffff' remapping='none'/> + <address_region interface="_exp" mem_lo='60000000' mem_hi='7fffffff' remapping='none'/> + <address_region interface="_ram8" mem_lo='80000000' mem_hi='8fffffff' remapping='none'/> + <address_region interface="_ram9" mem_lo='90000000' mem_hi='9fffffff' remapping='none'/> + <address_region interface="_exp" mem_lo='a0000000' mem_hi='dfffffff' remapping='none'/> + </slave_interface> + + <slave_interface name="_cpu"> + <sparse_connect interface="_rom1"/> + <sparse_connect interface="_ram2"/> + <sparse_connect interface="_ram3"/> + <sparse_connect interface="_sys"/> + <sparse_connect interface="_exp"/> + <sparse_connect interface="_ram8"/> + <sparse_connect interface="_ram9"/> + <address_region interface="_rom1" mem_lo='00000000' mem_hi='0fffffff' remapping='move'/> + <address_region interface="_rom1" mem_lo='10000000' mem_hi='1fffffff' remapping='none'/> + <address_region interface="_ram2" mem_lo='20000000' mem_hi='2fffffff' remapping='none'/> + <address_region interface="_ram3" mem_lo='30000000' mem_hi='3fffffff' remapping='none'/> + <address_region interface="_sys" mem_lo='40000000' mem_hi='5fffffff' remapping='none'/> + <address_region interface="_exp" mem_lo='60000000' mem_hi='7fffffff' remapping='none'/> + <address_region interface="_ram8" mem_lo='80000000' mem_hi='8fffffff' remapping='none'/> + <address_region interface="_ram9" mem_lo='90000000' mem_hi='9fffffff' remapping='none'/> + <address_region interface="_exp" mem_lo='a0000000' mem_hi='dfffffff' remapping='none'/> + <address_region interface="_sys" mem_lo='f0000000' mem_hi='f003ffff' remapping='none'/> + <remap_region interface="_ram2" mem_lo='00000000' mem_hi='0fffffff' bit='0'/> + </slave_interface> + + <!-- Master interface definitions --> + + <master_interface name="_rom1"/> + <master_interface name="_ram2"/> + <master_interface name="_ram3"/> + <master_interface name="_sys"/> + <master_interface name="_ram8"/> + <master_interface name="_ram9"/> + <master_interface name="_exp"/> + + <!-- - - - - *** DO NOT MODIFY BELOW THIS LINE *** - - - - - - - - - - - --> + +</cfgfile> diff --git a/Cortex-M0/nanosoc/systems/mcu/verilog/nanosoc_chip.v b/Cortex-M0/nanosoc/systems/mcu/verilog/nanosoc_chip.v new file mode 100644 index 0000000..fe5fd48 --- /dev/null +++ b/Cortex-M0/nanosoc/systems/mcu/verilog/nanosoc_chip.v @@ -0,0 +1,1583 @@ +//----------------------------------------------------------------------------- +// customised top-level Cortex-M0 'nanosoc' controller +// A joint work commissioned on behalf of SoC Labs, under Arm Academic Access license. +// +// Contributors +// +// David Flynn (d.w.flynn@soton.ac.uk) +// +// Copyright � 2021-3, SoC Labs (www.soclabs.org) +//----------------------------------------------------------------------------- + +//----------------------------------------------------------------------------- +// The confidential and proprietary information contained in this file may +// only be used by a person authorised under and to the extent permitted +// by a subsisting licensing agreement from Arm Limited or its affiliates. +// +// (C) COPYRIGHT 2010-2013 Arm Limited or its affiliates. +// ALL RIGHTS RESERVED +// +// This entire notice must be reproduced on all copies of this file +// and copies of this file may only be made by a person if such person is +// permitted to do so under the terms of a subsisting license agreement +// from Arm Limited or its affiliates. +// +// SVN Information +// +// Checked In : $Date: 2017-10-10 15:55:38 +0100 (Tue, 10 Oct 2017) $ +// +// Revision : $Revision: 371321 $ +// +// Release Information : Cortex-M System Design Kit-r1p1-00rel0 +// +//----------------------------------------------------------------------------- +//----------------------------------------------------------------------------- +// Abstract : Top level for example Cortex-M0/Cortex-M0+ microcontroller +//----------------------------------------------------------------------------- +// + +module nanosoc_chip + ( +`ifdef POWER_PINS + inout wire VDDIO, + inout wire VSSIO, + inout wire VDD, + inout wire VSS, +`endif + input wire xtal_clk_i, + output wire xtal_clk_o, + input wire nrst_i, + input wire [15:0] p0_i, // level-shifted input from pad + output wire [15:0] p0_o, // output port drive + output wire [15:0] p0_e, // active high output drive enable (pad tech dependent) + output wire [15:0] p0_z, // active low output drive enable (pad tech dependent) + input wire [15:0] p1_i, // level-shifted input from pad + output wire [15:0] p1_o, // output port drive + output wire [15:0] p1_e, // active high output drive enable (pad tech dependent) + output wire [15:0] p1_z, // active low output drive enable (pad tech dependent) + +`ifdef ARM_CMSDK_INCLUDE_JTAG + input wire ntrst_i, + input wire tdi_i, + output wire tdo_o, +`endif + input wire swdio_i, + output wire swdio_o, + output wire swdio_e, + output wire swdio_z, + input wire swdclk_i + ); + +localparam CLKGATE_PRESENT = 0; +localparam DMA_CHANNEL_NUM = 1; +localparam INCLUDE_DMA = 1; +localparam CORTEX_M0 = 1; + +//------------------------------------ +// CMSDK internal wire naming preserved + + wire xtal_clk_in = xtal_clk_i; + wire xtal_clk_out; + wire pll_clk; + wire CLK; + + assign xtal_clk_o = xtal_clk_out; + wire nrst_in = nrst_i; + wire [15:0] p0_in; // level-shifted input from pad + wire [15:0] p0_out; // output port drive + wire [15:0] p0_out_en; // active high output drive enable (pad tech dependent) + wire [15:0] p0_out_nen; // active low output drive enable (pad tech dependent) + + wire [15:0] p1_in; // level-shifted input from pad + wire [15:0] p1_out; // output port drive + wire [15:0] p1_out_en; // active high output drive enable (pad tech dependent) + wire [15:0] p1_out_nen; // active low output drive enable (pad tech dependent) + wire [15:0] p1_in_mux; // level-shifted input from pad + wire [15:0] p1_out_mux; // output port drive + wire [15:0] p1_out_en_mux; // active high output drive enable (pad tech dependent) + wire [15:0] p1_out_nen_mux; // active low output drive enable (pad tech dependent) + + wire swdio_in; + wire swdio_out; + wire swdio_out_en; + wire swdio_out_nen; + wire swdclk_in; + + wire ft_clk_o; + wire ft_ssn_o; + wire ft_miso_i; + wire ft_miosio_o; + wire ft_miosio_e; + wire ft_miosio_z; + wire ft_miosio_i; + + // -------------------------------------------------------------------------------- + // Port-0 IO pad driver mapping + // -------------------------------------------------------------------------------- + + assign p0_in = p0_i; // level-shifted input from pad + assign p0_o = p0_out; // output port drive + assign p0_e = p0_out_en; // active high output drive enable (pad tech dependent) + assign p0_z = p0_out_nen; // active low output drive enable (pad tech dependent) + + + // -------------------------------------------------------------------------------- + // Port-1 IO pad driver mapping + // -------------------------------------------------------------------------------- + +// modify p1_mux [3:0] for ft1248 interface +// assign p1_in_mux[3:0] = p1_i[3:0]; // IO MUX controlled bidirectionals +// assign p1_o[3:0] = p1_out_mux[3:0]; +// assign p1_e[3:0] = p1_out_en_mux[3:0]; +// assign p1_z[3:0] = p1_out_nen_mux[3:0]; + + assign ft_miso_i = p1_i[0]; // FT_MISO INPUT pad configuration + assign p1_in_mux[0] = p1_i[0]; + assign p1_o[0] = 1'b0; + assign p1_e[0] = 1'b0; + assign p1_z[0] = 1'b1; + + assign p1_in_mux[1] = p1_i[1]; // FT_CLK OUTPUT pad configuration + assign p1_o[1] = ft_clk_o; + assign p1_e[1] = 1'b1; + assign p1_z[1] = 1'b0; + + assign ft_miosio_i = p1_i[2]; // FT_MIOSIO INOUT pad configuration + assign p1_in_mux[2] = p1_i[2]; + assign p1_o[2] = ft_miosio_o; + assign p1_e[2] = ft_miosio_e; + assign p1_z[2] = ft_miosio_z; + + assign p1_in_mux[3] = p1_i[3]; // FT_SSN OUTPUT pad configuration + assign p1_o[3] = ft_ssn_o; + assign p1_e[3] = 1'b1; + assign p1_z[3] = 1'b0; + + assign p1_in_mux[15:4] = p1_i[15:4]; // IO MUX controlled bidirectionals + assign p1_o[15:4] = p1_out_mux[15:4]; + assign p1_e[15:4] = p1_out_en_mux[15:4]; + assign p1_z[15:4] = p1_out_nen_mux[15:4]; + + +//TIE_HI uTIEHI (.tiehi(tiehi)); + wire tiehi = 1'b1; +//TIE_LO uTIELO (.tielo(tielo)); + wire tielo = 1'b0; + + + +//---------------------------------------- +// SOC clock and reset management +//---------------------------------------- +// + + wire PORESETn;// Power on reset + wire HRESETn; // AHB reset + wire PRESETn; // APB and peripheral reset + wire DBGRESETn; // Debug system reset + wire FCLK; // Free running system clock + wire HCLK; // System clock from PMU + wire DCLK; + wire SCLK; + wire PCLK; // Peripheral clock + wire PCLKG; // Gated PCLK for APB + wire PCLKEN; // Clock divider for AHB to APB bridge + wire APBACTIVE; + // event signals + wire TXEV; + wire RXEV; + wire nTRST; // JTAG - Test reset (active low) + wire SWDI; // JTAG/SWD - TMS / SWD data input + wire SWCLK; // JTAG/SWD - TCK / SWCLK + wire SWDO; // SWD - SWD data output + wire SWDOEN; // SWD - SWD data output enable + wire SYSRESETREQ; // processor system reset request + wire WDOGRESETREQ; // watchdog system reset request + wire HRESETREQ; // Combined system reset request + wire cmsdk_SYSRESETREQ; // Combined system reset request + wire clk_ctrl_sys_reset_req; + wire PMUHRESETREQ; + wire PMUDBGRESETREQ; + wire LOCKUP; + wire LOCKUPRESET; + wire SLEEPING; + wire GATEHCLK; // Processor status - safe to gate HCLK + wire WAKEUP; // Wake up request from WIC + wire WICENREQ; // WIC enable request from PMU + wire WICENACK; // WIC enable ack to PMU + wire PMUENABLE; + wire CDBGPWRUPREQ; // Debug Power Up request to PMU + wire CDBGPWRUPACK; // Debug Power Up ACK from PMU + wire SLEEPHOLDREQn; // Sleep extension request from PMU + wire SLEEPHOLDACKn; // Sleep extension request to PMU wire SLEEPING; + wire SYSPWRDOWNACK; + wire DBGPWRDOWNACK; + wire SYSPWRDOWN; + wire DBGPWRDOWN; + wire SYSISOLATEn; + wire SYSRETAINn; + wire DBGISOLATEn; + wire SLEEPDEEP; + wire ADPRESETREQ; + // Scan test dummy signals; not connected until scan insertion + wire TESTMODE; // Test mode enable signal (override synchronizers etc) + wire SCANENABLE; // Scan enable signal + wire SCANINHCLK; // HCLK scan input + wire SCANOUTHCLK; // Scan Chain wire + +// not required for FPGA + assign TESTMODE = 1'b0; + assign SCANENABLE = 1'b0; + assign SCANINHCLK = 1'b0; + assign SCANOUTHCLK = 1'b0; + +// Technology-specific PLL/Frequecy synthesizer would generate +// CLK, FCLK (Free running system clock) +// from +// xtal_clk_in + + assign pll_clk = xtal_clk_in; // default to no PLL + + assign CLK = (TESTMODE) ? xtal_clk_in : pll_clk; + + +//? assign HCLKSYS = (INCLUDE_DMA!=0) ? SCLK : HCLK; + assign HCLK = FCLK; + + // System Reset request can be from processor or watchdog + // or when lockup happens and the control flag is set. + assign cmsdk_SYSRESETREQ = SYSRESETREQ | WDOGRESETREQ | + ADPRESETREQ | + (LOCKUP & LOCKUPRESET); + assign clk_ctrl_sys_reset_req = PMUHRESETREQ | HRESETREQ; + + // Clock controller to generate reset and clock signals + cmsdk_mcu_clkctrl + #(.CLKGATE_PRESENT(CLKGATE_PRESENT)) + u_cmsdk_mcu_clkctrl( + // inputs + .XTAL1 (CLK), + .NRST (nrst_in), + + .APBACTIVE (APBACTIVE), + .SLEEPING (SLEEPING), + .SLEEPDEEP (SLEEPDEEP), + .LOCKUP (LOCKUP), + .LOCKUPRESET (LOCKUPRESET), + .SYSRESETREQ (clk_ctrl_sys_reset_req), + .DBGRESETREQ (PMUDBGRESETREQ), + .CGBYPASS (TESTMODE), + .RSTBYPASS (TESTMODE), + + // outputs + .XTAL2 (xtal_clk_out), + + .FCLK (FCLK), + + .PCLK (PCLK), + .PCLKG (PCLKG), + .PCLKEN (PCLKEN), +//?`ifdef CORTEX_M0DESIGNSTART +//? .PORESETn (PORESETn), // for cm0 designstart +//? .HRESETn (HRESETn), // for cm0 designstart +//?`endif + .PRESETn (PRESETn) + ); + + wire gated_hclk; + wire gated_dclk; + wire gated_sclk; + + cortexm0_rst_ctl u_rst_ctl + (// Inputs + .GLOBALRESETn (nrst_in), + .FCLK (FCLK), + .HCLK (HCLK), //gated_hclk), + .DCLK (DCLK), //gated_dclk), + .SYSRESETREQ (cmsdk_SYSRESETREQ), + .PMUHRESETREQ (PMUHRESETREQ), + .PMUDBGRESETREQ (PMUDBGRESETREQ), + .RSTBYPASS (1'b0), + .SE (1'b0), + + // Outputs + .PORESETn (PORESETn), + .HRESETn (HRESETn), + .DBGRESETn (DBGRESETn), + .HRESETREQ (HRESETREQ)); + + + // Cortex-M0 Power management unit + cortexm0_pmu u_cortexm0_pmu + ( // Inputs + .FCLK (FCLK), + .PORESETn (PORESETn), + .HRESETREQ (cmsdk_SYSRESETREQ), // from processor / watchdog + .PMUENABLE (PMUENABLE), // from System Controller + .WICENACK (WICENACK), // from WIC in integration + + .WAKEUP (WAKEUP), // from WIC in integration + .CDBGPWRUPREQ (CDBGPWRUPREQ), + + .SLEEPDEEP (SLEEPDEEP), + .SLEEPHOLDACKn (SLEEPHOLDACKn), + .GATEHCLK (GATEHCLK), + .SYSPWRDOWNACK (SYSPWRDOWNACK), + .DBGPWRDOWNACK (DBGPWRDOWNACK), + .CGBYPASS (TESTMODE), + + // Outputs + .HCLK (gated_hclk), + .DCLK (gated_dclk), + .SCLK (gated_sclk), + .WICENREQ (WICENREQ), + .CDBGPWRUPACK (CDBGPWRUPACK), + .SYSISOLATEn (SYSISOLATEn), + .SYSRETAINn (SYSRETAINn), + .SYSPWRDOWN (SYSPWRDOWN), + .DBGISOLATEn (DBGISOLATEn), + .DBGPWRDOWN (DBGPWRDOWN), + .SLEEPHOLDREQn (SLEEPHOLDREQn), + .PMUDBGRESETREQ (PMUDBGRESETREQ), + .PMUHRESETREQ (PMUHRESETREQ) + ); + + // Bypass clock gating cell in PMU if CLKGATE_PRESENT is 0 + assign HCLK = (CLKGATE_PRESENT==0) ? FCLK : gated_hclk; + assign DCLK = (CLKGATE_PRESENT==0) ? FCLK : gated_dclk; + assign SCLK = (CLKGATE_PRESENT==0) ? FCLK : gated_sclk; + + + // In this example system, power control takes place immediately. + // In a real circuit you might need to add delays in the next two + // signal assignments for correct operation. + assign SYSPWRDOWNACK = SYSPWRDOWN; + assign DBGPWRDOWNACK = DBGPWRDOWN; + + wire exp_penable; + wire exp_pwrite; + wire [11:0] exp_paddr; + wire [31:0] exp_pwdata; + wire exp12_psel; + wire exp12_pready; + wire exp12_pslverr; + wire [31:0] exp12_prdata; + wire exp13_psel; + wire exp13_pready; + wire exp13_pslverr; + wire [31:0] exp13_prdata; + wire exp14_psel; + wire exp14_pready; + wire exp14_pslverr; + wire [31:0] exp14_prdata; + wire exp15_psel; + wire exp15_pready; + wire exp15_pslverr; + wire [31:0] exp15_prdata; + + + // internal peripheral signals + wire uart0_rxd; + wire uart0_txd; + wire uart0_txen; + wire uart1_rxd; + wire uart1_txd; + wire uart1_txen; + wire uart2_rxd; + wire uart2_txd; + wire uart2_txen; + wire timer0_extin; + wire timer1_extin; + + wire [15:0] p0_altfunc; + + wire [15:0] p1_altfunc; + + +// ----------------------------------------------------------------------------- +// AHB Interconnect declarations +// Upper-case AMBA naming convention maintained +// ----------------------------------------------------------------------------- + + // System Address Remap control + wire [3:0] REMAP; // System Address REMAP control, bit-0 set on POR + wire ROM_MAP; + + // Manager port SI0 (inputs from master 0) + wire [31:0] HADDR_adp; // Address bus + wire [1:0] HTRANS_adp; // Transfer type + wire HWRITE_adp; // Transfer direction + wire [2:0] HSIZE_adp; // Transfer size + wire [2:0] HBURST_adp; // Burst type + wire [3:0] HPROT_adp; // Protection control + wire [31:0] HWDATA_adp; // Write data + wire HMASTLOCK_adp; // Locked Sequence + wire [1:0] HAUSER_adp; // Address USER signals + wire [1:0] HWUSER_adp; // Write-data USER signals + // Manager port SI0 (outputs to master 0) + wire [31:0] HRDATA_adp; // Read data bus + wire HREADY_adp; // HREADY feedback + wire HRESP_adp; // Transfer response + wire [1:0] HRUSER_adp; // Read-data USER signals + + // Manager port SI1 (inputs from master 1) + wire [31:0] HADDR_dma; // Address bus + wire [1:0] HTRANS_dma; // Transfer type + wire HWRITE_dma; // Transfer direction + wire [2:0] HSIZE_dma; // Transfer size + wire [2:0] HBURST_dma; // Burst type + wire [3:0] HPROT_dma; // Protection control + wire [31:0] HWDATA_dma; // Write data + wire HMASTLOCK_dma; // Locked Sequence + wire [1:0] HAUSER_dma; // Address USER signals + wire [1:0] HWUSER_dma; // Write-data USER signals + // Manager port SI1 (outputs to master 1) + wire [31:0] HRDATA_dma; // Read data bus + wire HREADY_dma; // HREADY feedback + wire HRESP_dma; // Transfer response + wire [1:0] HRUSER_dma; // Read-data USER signals + + // Manager port SI2 (inputs from master 2) + wire [31:0] HADDR_dma2; // Address bus + wire [1:0] HTRANS_dma2; // Transfer type + wire HWRITE_dma2; // Transfer direction + wire [2:0] HSIZE_dma2; // Transfer size + wire [2:0] HBURST_dma2; // Burst type + wire [3:0] HPROT_dma2; // Protection control + wire [31:0] HWDATA_dma2; // Write data + wire HMASTLOCK_dma2; // Locked Sequence + wire [1:0] HAUSER_dma2; // Address USER signals + wire [1:0] HWUSER_dma2; // Write-data USER signals + // Manager port SI2 (outputs to master 2) + wire [31:0] HRDATA_dma2; // Read data bus + wire HREADY_dma2; // HREADY feedback + wire HRESP_dma2; // Transfer response + wire [1:0] HRUSER_dma2; // Read-data USER signals + + // Manager port SI3 (inputs from master 3) + wire [31:0] HADDR_cpu; // Address bus + wire [1:0] HTRANS_cpu; // Transfer type + wire HWRITE_cpu; // Transfer direction + wire [2:0] HSIZE_cpu; // Transfer size + wire [2:0] HBURST_cpu; // Burst type + wire [3:0] HPROT_cpu; // Protection control + wire [31:0] HWDATA_cpu; // Write data + wire HMASTLOCK_cpu; // Locked Sequence + wire [1:0] HAUSER_cpu; // Address USER signals + wire [1:0] HWUSER_cpu; // Write-data USER signals + // Manager port SI3 (outputs to master 3) + wire [31:0] HRDATA_cpu; // Read data bus + wire HREADY_cpu; // HREADY feedback + wire HRESP_cpu; // Transfer response + wire [1:0] HRUSER_cpu; // Read-data USER signals + + // Subordinate port MI0 (outputs to slave 0) + wire HSEL_rom1; // Slave Select + wire [31:0] HADDR_rom1; // Address bus + wire [1:0] HTRANS_rom1; // Transfer type + wire HWRITE_rom1; // Transfer direction + wire [2:0] HSIZE_rom1; // Transfer size + wire [2:0] HBURST_rom1; // Burst type + wire [3:0] HPROT_rom1; // Protection control + wire [31:0] HWDATA_rom1; // Write data + wire HMASTLOCK_rom1; // Locked Sequence + wire HREADYMUX_rom1; // Transfer done + wire [1:0] HAUSER_rom1; // Address USER signals + wire [1:0] HWUSER_rom1; // Write-data USER signals + // Subordinate port MI0 (inputs from slave 0) + wire [31:0] HRDATA_rom1; // Read data bus + wire HREADYOUT_rom1; // HREADY feedback + wire HRESP_rom1; // Transfer response + wire [1:0] HRUSER_rom1; // Read-data USER signals + + // Subordinate port MI1 (outputs to slave 1) + wire HSEL_ram2; // Slave Select + wire [31:0] HADDR_ram2; // Address bus + wire [1:0] HTRANS_ram2; // Transfer type + wire HWRITE_ram2; // Transfer direction + wire [2:0] HSIZE_ram2; // Transfer size + wire [2:0] HBURST_ram2; // Burst type + wire [3:0] HPROT_ram2; // Protection control + wire [31:0] HWDATA_ram2; // Write data + wire HMASTLOCK_ram2; // Locked Sequence + wire HREADYMUX_ram2; // Transfer done + wire [1:0] HAUSER_ram2; // Address USER signals + wire [1:0] HWUSER_ram2; // Write-data USER signals + // Subordinate port MI1 (inputs from slave 1) + wire [31:0] HRDATA_ram2; // Read data bus + wire HREADYOUT_ram2; // HREADY feedback + wire HRESP_ram2; // Transfer response + wire [1:0] HRUSER_ram2; // Read-data USER signals + + // Subordinate port MI2 (outputs to slave 2) + wire HSEL_ram3; // Slave Select + wire [31:0] HADDR_ram3; // Address bus + wire [1:0] HTRANS_ram3; // Transfer type + wire HWRITE_ram3; // Transfer direction + wire [2:0] HSIZE_ram3; // Transfer size + wire [2:0] HBURST_ram3; // Burst type + wire [3:0] HPROT_ram3; // Protection control + wire [31:0] HWDATA_ram3; // Write data + wire HMASTLOCK_ram3; // Locked Sequence + wire HREADYMUX_ram3; // Transfer done + wire [1:0] HAUSER_ram3; // Address USER signals + wire [1:0] HWUSER_ram3; // Write-data USER signals + // Subordinate port MI2 (inputs from slave 2) + wire [31:0] HRDATA_ram3; // Read data bus + wire HREADYOUT_ram3; // HREADY feedback + wire HRESP_ram3; // Transfer response + wire [1:0] HRUSER_ram3; // Read-data USER signals + + // Subordinate port MI3 (outputs to slave 3) + wire HSEL_sys; // Slave Select + wire [31:0] HADDR_sys; // Address bus + wire [1:0] HTRANS_sys; // Transfer type + wire HWRITE_sys; // Transfer direction + wire [2:0] HSIZE_sys; // Transfer size + wire [2:0] HBURST_sys; // Burst type + wire [3:0] HPROT_sys; // Protection control + wire [31:0] HWDATA_sys; // Write data + wire HMASTLOCK_sys; // Locked Sequence + wire HREADYMUX_sys; // Transfer done + wire [1:0] HAUSER_sys; // Address USER signals + wire [1:0] HWUSER_sys; // Write-data USER signals + // Subordinate port MI3 (inputs from slave 3) + wire [31:0] HRDATA_sys; // Read data bus + wire HREADYOUT_sys; // HREADY feedback + wire HRESP_sys; // Transfer response + wire [1:0] HRUSER_sys; // Read-data USER signals + + // Subordinate port MI4 (outputs to slave 4) + wire HSEL_ram8; // Slave Select + wire [31:0] HADDR_ram8; // Address bus + wire [1:0] HTRANS_ram8; // Transfer type + wire HWRITE_ram8; // Transfer direction + wire [2:0] HSIZE_ram8; // Transfer size + wire [2:0] HBURST_ram8; // Burst type + wire [3:0] HPROT_ram8; // Protection control + wire [31:0] HWDATA_ram8; // Write data + wire HMASTLOCK_ram8; // Locked Sequence + wire HREADYMUX_ram8; // Transfer done + wire [1:0] HAUSER_ram8; // Address USER signals + wire [1:0] HWUSER_ram8; // Write-data USER signals + // Subordinate port MI4 (inputs from slave 4) + wire [31:0] HRDATA_ram8; // Read data bus + wire HREADYOUT_ram8; // HREADY feedback + wire HRESP_ram8; // Transfer response + wire [1:0] HRUSER_ram8; // Read-data USER signals + + // Subordinate port MI5 (outputs to slave 5) + wire HSEL_ram9; // Slave Select + wire [31:0] HADDR_ram9; // Address bus + wire [1:0] HTRANS_ram9; // Transfer type + wire HWRITE_ram9; // Transfer direction + wire [2:0] HSIZE_ram9; // Transfer size + wire [2:0] HBURST_ram9; // Burst type + wire [3:0] HPROT_ram9; // Protection control + wire [31:0] HWDATA_ram9; // Write data + wire HMASTLOCK_ram9; // Locked Sequence + wire HREADYMUX_ram9; // Transfer done + wire [1:0] HAUSER_ram9; // Address USER signals + wire [1:0] HWUSER_ram9; // Write-data USER signals + // Subordinate port MI5 (inputs from slave 5) + wire [31:0] HRDATA_ram9; // Read data bus + wire HREADYOUT_ram9; // HREADY feedback + wire HRESP_ram9; // Transfer response + wire [1:0] HRUSER_ram9; // Read-data USER signals + + // Subordinate port MI6 (outputs to slave 6) + wire HSEL_exp; // Slave Select + wire [31:0] HADDR_exp; // Address bus + wire [1:0] HTRANS_exp; // Transfer type + wire HWRITE_exp; // Transfer direction + wire [2:0] HSIZE_exp; // Transfer size + wire [2:0] HBURST_exp; // Burst type + wire [3:0] HPROT_exp; // Protection control + wire [31:0] HWDATA_exp; // Write data + wire HMASTLOCK_exp; // Locked Sequence + wire HREADYMUX_exp; // Transfer done + wire [1:0] HAUSER_exp; // Address USER signals + wire [1:0] HWUSER_exp; // Write-data USER signals + // Subordinate port MI5 (inputs from slave 5) + wire [31:0] HRDATA_exp; // Read data bus + wire HREADYOUT_exp; // HREADY feedback + wire HRESP_exp; // Transfer response + wire [1:0] HRUSER_exp; // Read-data USER signals + + +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ +// Interconnect matrix +// 4 AHB-lite managers, 7 AHB-lite layer interfaces +//------------------------------------------------------------------------------ + +// BusMatrix instance + soclabs_4x7_AhbMatrix_lite + u_soclabs_4x7_AhbMatrix_lite ( + .HCLK (HCLK), + .HRESETn (HRESETn), + .REMAP (REMAP), + + // Input port SI0 signals + .HADDR_adp (HADDR_adp), + .HTRANS_adp (HTRANS_adp), + .HWRITE_adp (HWRITE_adp), + .HSIZE_adp (HSIZE_adp), + .HBURST_adp (HBURST_adp), + .HPROT_adp (HPROT_adp), + .HWDATA_adp (HWDATA_adp), + .HMASTLOCK_adp (HMASTLOCK_adp), + .HREADY_adp (HREADY_adp), + .HAUSER_adp (HAUSER_adp), + .HWUSER_adp (HWUSER_adp), + .HRDATA_adp (HRDATA_adp), + .HRESP_adp (HRESP_adp), + .HRUSER_adp (HRUSER_adp), + + // Input port SI1 signals + .HADDR_dma (HADDR_dma), + .HTRANS_dma (HTRANS_dma), + .HWRITE_dma (HWRITE_dma), + .HSIZE_dma (HSIZE_dma), + .HBURST_dma (HBURST_dma), + .HPROT_dma (HPROT_dma), + .HWDATA_dma (HWDATA_dma), + .HMASTLOCK_dma (HMASTLOCK_dma), + .HREADY_dma (HREADY_dma), + .HAUSER_dma (HAUSER_dma), + .HWUSER_dma (HWUSER_dma), + .HRDATA_dma (HRDATA_dma), + .HRESP_dma (HRESP_dma), + .HRUSER_dma (HRUSER_dma), + + // Input port SI2 signals + .HADDR_dma2 (HADDR_dma2), + .HTRANS_dma2 (HTRANS_dma2), + .HWRITE_dma2 (HWRITE_dma2), + .HSIZE_dma2 (HSIZE_dma2), + .HBURST_dma2 (HBURST_dma2), + .HPROT_dma2 (HPROT_dma2), + .HWDATA_dma2 (HWDATA_dma2), + .HMASTLOCK_dma2 (HMASTLOCK_dma2), + .HREADY_dma2 (HREADY_dma2), + .HAUSER_dma2 (HAUSER_dma2), + .HWUSER_dma2 (HWUSER_dma2), + .HRDATA_dma2 (HRDATA_dma2), + .HRESP_dma2 (HRESP_dma2), + .HRUSER_dma2 (HRUSER_dma2), + + // Input port SI3 signals + .HADDR_cpu (HADDR_cpu), + .HTRANS_cpu (HTRANS_cpu), + .HWRITE_cpu (HWRITE_cpu), + .HSIZE_cpu (HSIZE_cpu), + .HBURST_cpu (HBURST_cpu), + .HPROT_cpu (HPROT_cpu), + .HWDATA_cpu (HWDATA_cpu), + .HMASTLOCK_cpu (HMASTLOCK_cpu), + .HREADY_cpu (HREADY_cpu), + .HAUSER_cpu (HAUSER_cpu), + .HWUSER_cpu (HWUSER_cpu), + .HRDATA_cpu (HRDATA_cpu), + .HRESP_cpu (HRESP_cpu), + .HRUSER_cpu (HRUSER_cpu), + + // Output port MI0 signals + .HSEL_rom1 (HSEL_rom1), + .HADDR_rom1 (HADDR_rom1), + .HTRANS_rom1 (HTRANS_rom1), + .HWRITE_rom1 (HWRITE_rom1), + .HSIZE_rom1 (HSIZE_rom1), + .HBURST_rom1 (HBURST_rom1), + .HPROT_rom1 (HPROT_rom1), + .HWDATA_rom1 (HWDATA_rom1), + .HMASTLOCK_rom1 (HMASTLOCK_rom1), + .HREADYMUX_rom1 (HREADYMUX_rom1), + .HAUSER_rom1 (HAUSER_rom1), + .HWUSER_rom1 (HWUSER_rom1), + .HRDATA_rom1 (HRDATA_rom1), + .HREADYOUT_rom1 (HREADYOUT_rom1), + .HRESP_rom1 (HRESP_rom1), + .HRUSER_rom1 (HRUSER_rom1), + + // Output port MI1 signals + .HSEL_ram2 (HSEL_ram2), + .HADDR_ram2 (HADDR_ram2), + .HTRANS_ram2 (HTRANS_ram2), + .HWRITE_ram2 (HWRITE_ram2), + .HSIZE_ram2 (HSIZE_ram2), + .HBURST_ram2 (HBURST_ram2), + .HPROT_ram2 (HPROT_ram2), + .HWDATA_ram2 (HWDATA_ram2), + .HMASTLOCK_ram2 (HMASTLOCK_ram2), + .HREADYMUX_ram2 (HREADYMUX_ram2), + .HAUSER_ram2 (HAUSER_ram2), + .HWUSER_ram2 (HWUSER_ram2), + .HRDATA_ram2 (HRDATA_ram2), + .HREADYOUT_ram2 (HREADYOUT_ram2), + .HRESP_ram2 (HRESP_ram2), + .HRUSER_ram2 (HRUSER_ram2), + + // Output port MI2 signals + .HSEL_ram3 (HSEL_ram3), + .HADDR_ram3 (HADDR_ram3), + .HTRANS_ram3 (HTRANS_ram3), + .HWRITE_ram3 (HWRITE_ram3), + .HSIZE_ram3 (HSIZE_ram3), + .HBURST_ram3 (HBURST_ram3), + .HPROT_ram3 (HPROT_ram3), + .HWDATA_ram3 (HWDATA_ram3), + .HMASTLOCK_ram3 (HMASTLOCK_ram3), + .HREADYMUX_ram3 (HREADYMUX_ram3), + .HAUSER_ram3 (HAUSER_ram3), + .HWUSER_ram3 (HWUSER_ram3), + .HRDATA_ram3 (HRDATA_ram3), + .HREADYOUT_ram3 (HREADYOUT_ram3), + .HRESP_ram3 (HRESP_ram3), + .HRUSER_ram3 (HRUSER_ram3), + + // Output port MI3 signals + .HSEL_sys (HSEL_sys), + .HADDR_sys (HADDR_sys), + .HTRANS_sys (HTRANS_sys), + .HWRITE_sys (HWRITE_sys), + .HSIZE_sys (HSIZE_sys), + .HBURST_sys (HBURST_sys), + .HPROT_sys (HPROT_sys), + .HWDATA_sys (HWDATA_sys), + .HMASTLOCK_sys (HMASTLOCK_sys), + .HREADYMUX_sys (HREADYMUX_sys), + .HAUSER_sys (HAUSER_sys), + .HWUSER_sys (HWUSER_sys), + .HRDATA_sys (HRDATA_sys), + .HREADYOUT_sys (HREADYOUT_sys), + .HRESP_sys (HRESP_sys), + .HRUSER_sys (HRUSER_sys), + + // Output port MI4 signals + .HSEL_ram8 (HSEL_ram8), + .HADDR_ram8 (HADDR_ram8), + .HTRANS_ram8 (HTRANS_ram8), + .HWRITE_ram8 (HWRITE_ram8), + .HSIZE_ram8 (HSIZE_ram8), + .HBURST_ram8 (HBURST_ram8), + .HPROT_ram8 (HPROT_ram8), + .HWDATA_ram8 (HWDATA_ram8), + .HMASTLOCK_ram8 (HMASTLOCK_ram8), + .HREADYMUX_ram8 (HREADYMUX_ram8), + .HAUSER_ram8 (HAUSER_ram8), + .HWUSER_ram8 (HWUSER_ram8), + .HRDATA_ram8 (HRDATA_ram8), + .HREADYOUT_ram8 (HREADYOUT_ram8), + .HRESP_ram8 (HRESP_ram8), + .HRUSER_ram8 (HRUSER_ram8), + + // Output port MI5 signals + .HSEL_ram9 (HSEL_ram9), + .HADDR_ram9 (HADDR_ram9), + .HTRANS_ram9 (HTRANS_ram9), + .HWRITE_ram9 (HWRITE_ram9), + .HSIZE_ram9 (HSIZE_ram9), + .HBURST_ram9 (HBURST_ram9), + .HPROT_ram9 (HPROT_ram9), + .HWDATA_ram9 (HWDATA_ram9), + .HMASTLOCK_ram9 (HMASTLOCK_ram9), + .HREADYMUX_ram9 (HREADYMUX_ram9), + .HAUSER_ram9 (HAUSER_ram9), + .HWUSER_ram9 (HWUSER_ram9), + .HRDATA_ram9 (HRDATA_ram9), + .HREADYOUT_ram9 (HREADYOUT_ram9), + .HRESP_ram9 (HRESP_ram9), + .HRUSER_ram9 (HRUSER_ram9), + + // Output port MI6 signals + .HSEL_exp (HSEL_exp), + .HADDR_exp (HADDR_exp), + .HTRANS_exp (HTRANS_exp), + .HWRITE_exp (HWRITE_exp), + .HSIZE_exp (HSIZE_exp), + .HBURST_exp (HBURST_exp), + .HPROT_exp (HPROT_exp), + .HWDATA_exp (HWDATA_exp), + .HMASTLOCK_exp (HMASTLOCK_exp), + .HREADYMUX_exp (HREADYMUX_exp), + .HAUSER_exp (HAUSER_exp), + .HWUSER_exp (HWUSER_exp), + .HRDATA_exp (HRDATA_exp), + .HREADYOUT_exp (HREADYOUT_exp), + .HRESP_exp (HRESP_exp), + .HRUSER_exp (HRUSER_exp), + + // Scan test dummy signals; not connected until scan insertion + .SCANENABLE (SCANENABLE), + .SCANINHCLK (SCANINHCLK), + .SCANOUTHCLK (SCANOUTHCLK) + ); + + +//---------------------------------------- +// Boot ROM "rom1" firmware +// mapped 0x10000000-0x1fffffff +// and on REMAP[0] +// mapped 0x00000000-0x0000ffff +//---------------------------------------- + +ahb_bootrom +// #(.AW(10) ) // 1K bytes ROM + u_ahb_bootloader ( + .HCLK (HCLK), + .HRESETn (HRESETn), + .HSEL (HSEL_rom1), + .HADDR (HADDR_rom1[ 9:0]), + .HTRANS (HTRANS_rom1), + .HSIZE (HSIZE_rom1), + .HWRITE (HWRITE_rom1), + .HWDATA (HWDATA_rom1), + .HREADY (HREADYMUX_rom1), + .HREADYOUT (HREADYOUT_rom1), + .HRDATA (HRDATA_rom1), + .HRESP (HRESP_rom1) + ); + +//---------------------------------------- +// CODE/DATA "ram2" +// mapped 0x20000000-0x2fffffff +//---------------------------------------- + +//localparam AWRAM2 = 9; // 512B +//localparam AWRAM2 = 10; // 1024B +localparam AWRAM2 = 14; // 16KB +//localparam AWRAM2 = 16; // 64KB + wire [AWRAM2-3:0] addr_ram2; + wire [31:0] wdata_ram2; + wire [31:0] rdata_ram2; + wire [3:0] wen_ram2; + wire cs_ram2; + + // AHB to SRAM bridge + cmsdk_ahb_to_sram #(.AW(AWRAM2)) u_ahb_to_sram2 + ( + // AHB Inputs + .HCLK (HCLK), + .HRESETn (HRESETn), + .HSEL (HSEL_ram2), // AHB inputs + .HADDR (HADDR_ram2[AWRAM2-1:0]), + .HTRANS (HTRANS_ram2), + .HSIZE (HSIZE_ram2), + .HWRITE (HWRITE_ram2), + .HWDATA (HWDATA_ram2), + .HREADY (HREADYMUX_ram2), + + // AHB Outputs + .HREADYOUT (HREADYOUT_ram2), // Outputs + .HRDATA (HRDATA_ram2), + .HRESP (HRESP_ram2), + + // SRAM input + .SRAMRDATA (rdata_ram2), + // SRAM Outputs + .SRAMADDR (addr_ram2), + .SRAMWDATA (wdata_ram2), + .SRAMWEN (wen_ram2), + .SRAMCS (cs_ram2) + ); + + // SRAM model +// cmsdk_fpga_sram #(.AW(AWRAM2)) u_fpga_ram2 + cmsdk_fpga_rom #(.AW(AWRAM2), .filename("../rtl_sim/image.hex") ) u_fpga_ram2 + ( + // SRAM Inputs + .CLK (HCLK), + .ADDR (addr_ram2), + .WDATA (wdata_ram2), + .WREN (wen_ram2), + .CS (cs_ram2), + // SRAM Output + .RDATA (rdata_ram2) + ); + + +//---------------------------------------- +// DATA "ram3" +// mapped 0x30000000-0x3fffffff +//---------------------------------------- + +//localparam AWRAM3 = 9; // 512B +//localparam AWRAM3 = 10; // 1024B +localparam AWRAM3 = 14; // 16KB +//localparam AWRAM3 = 16; // 64KB + wire [AWRAM3-3:0] addr_ram3; + wire [31:0] wdata_ram3; + wire [31:0] rdata_ram3; + wire [3:0] wen_ram3; + wire cs_ram3; + + // AHB to SRAM bridge + cmsdk_ahb_to_sram #(.AW(AWRAM3)) u_ahb_to_sram3 + ( + // AHB Inputs + .HCLK (HCLK), + .HRESETn (HRESETn), + .HSEL (HSEL_ram3), // AHB inputs + .HADDR (HADDR_ram3[AWRAM3-1:0]), + .HTRANS (HTRANS_ram3), + .HSIZE (HSIZE_ram3), + .HWRITE (HWRITE_ram3), + .HWDATA (HWDATA_ram3), + .HREADY (HREADYMUX_ram3), + + // AHB Outputs + .HREADYOUT (HREADYOUT_ram3), // Outputs + .HRDATA (HRDATA_ram3), + .HRESP (HRESP_ram3), + + // SRAM input + .SRAMRDATA (rdata_ram3), + // SRAM Outputs + .SRAMADDR (addr_ram3), + .SRAMWDATA (wdata_ram3), + .SRAMWEN (wen_ram3), + .SRAMCS (cs_ram3) + ); + + // SRAM model + cmsdk_fpga_sram #(.AW(AWRAM3)) u_fpga_ram3 + ( + // SRAM Inputs + .CLK (HCLK), + .ADDR (addr_ram3), + .WDATA (wdata_ram3), + .WREN (wen_ram3), + .CS (cs_ram3), + // SRAM Output + .RDATA (rdata_ram3) + ); + +//---------------------------------------- +// Expansion/DMA "ram8,ram9" RAM instances +//---------------------------------------- + +//localparam AWRAM8 = 9; // 512B +//localparam AWRAM8 = 10; // 1024B +localparam AWRAM8 = 14; // 16KB +//localparam AWRAM8 = 16; // 64KB + wire [AWRAM8-3:0] addr_ram8; + wire [31:0] wdata_ram8; + wire [31:0] rdata_ram8; + wire [3:0] wen_ram8; + wire cs_ram8; + + // AHB to SRAM bridge + cmsdk_ahb_to_sram #(.AW(AWRAM8)) u_ahb_to_sram8 + ( + // AHB Inputs + .HCLK (HCLK), + .HRESETn (HRESETn), + .HSEL (HSEL_ram8), // AHB inputs + .HADDR (HADDR_ram8[AWRAM8-1:0]), + .HTRANS (HTRANS_ram8), + .HSIZE (HSIZE_ram8), + .HWRITE (HWRITE_ram8), + .HWDATA (HWDATA_ram8), + .HREADY (HREADYMUX_ram8), + + // AHB Outputs + .HREADYOUT (HREADYOUT_ram8), // Outputs + .HRDATA (HRDATA_ram8), + .HRESP (HRESP_ram8), + + // SRAM input + .SRAMRDATA (rdata_ram8), + // SRAM Outputs + .SRAMADDR (addr_ram8), + .SRAMWDATA (wdata_ram8), + .SRAMWEN (wen_ram8), + .SRAMCS (cs_ram8) + ); + + // SRAM model + cmsdk_fpga_sram #(.AW(AWRAM8)) u_fpga_ram8 + ( + // SRAM Inputs + .CLK (HCLK), + .ADDR (addr_ram8), + .WDATA (wdata_ram8), + .WREN (wen_ram8), + .CS (cs_ram8), + // SRAM Output + .RDATA (rdata_ram8) + ); + +// instandiate expansion RAM instance to appear at 0x90000000 +//localparam AWRAM9 = 9; // 512B +//localparam AWRAM9 = 10; // 1024B +localparam AWRAM9 = 14; // 16KB +//localparam AWRAM9 = 16; // 64KB + wire [AWRAM9-3:0] addr_ram9; + wire [31:0] wdata_ram9; + wire [31:0] rdata_ram9; + wire [3:0] wen_ram9; + wire cs_ram9; + + // AHB to SRAM bridge + cmsdk_ahb_to_sram #(.AW(AWRAM9)) u_ahb_to_sram9 + ( + // AHB Inputs + .HCLK (HCLK), + .HRESETn (HRESETn), + .HSEL (HSEL_ram9), // AHB inputs + .HADDR (HADDR_ram9[AWRAM9-1:0]), + .HTRANS (HTRANS_ram9), + .HSIZE (HSIZE_ram9), + .HWRITE (HWRITE_ram9), + .HWDATA (HWDATA_ram9), + .HREADY (HREADYMUX_ram9), + + // AHB Outputs + .HREADYOUT (HREADYOUT_ram9), // Outputs + .HRDATA (HRDATA_ram9), + .HRESP (HRESP_ram9), + + // SRAM input + .SRAMRDATA (rdata_ram9), + // SRAM Outputs + .SRAMADDR (addr_ram9), + .SRAMWDATA (wdata_ram9), + .SRAMWEN (wen_ram9), + .SRAMCS (cs_ram9) + ); + + // SRAM model + cmsdk_fpga_sram #(.AW(AWRAM9)) u_fpga_ram9 + ( + // SRAM Inputs + .CLK (HCLK), + .ADDR (addr_ram9), + .WDATA (wdata_ram9), + .WREN (wen_ram9), + .CS (cs_ram9), + // SRAM Output + .RDATA (rdata_ram9) + ); + +// assign [31:0] HRDATA_ram8 = 32'hdead8888; // Read data bus +// assign HREADYOUT_ram8 = 1'b1; // HREADY feedback +// assign HRESP_ram8 = 1'b0; // Transfer response +// assign [1:0] HRUSER_ram8 = 00; // Read-data USER signals +// +// assign [31:0] HRDATA_ram9 = 32'hdead9999; // Read data bus +// assign HREADYOUT_ram9 = 1'b1; // HREADY feedback +// assign HRESP_ram9 = 1'b0; // Transfer response +// assign [1:0] HRUSER_ram9 = 00; // Read-data USER signals + + +//---------------------------------------- +// ADP ASCII DEBUG PROTOCOL controller +// AHB MANAGER 0 +//---------------------------------------- + + // ------------------------------- + // ADP engine stream and control interfaces + // ------------------------------- + + wire comio_tx_ready; + wire [7:0] comio_tx_data8; + wire comio_tx_valid; + + wire comio_rx_ready; + wire [7:0] comio_rx_data8; + wire comio_rx_valid; + + wire stdio_tx_ready; + wire [7:0] stdio_tx_data8; + wire stdio_tx_valid; + + wire stdio_rx_ready; + wire [7:0] stdio_rx_data8; + wire stdio_rx_valid; + + wire [7:0] adp_gpo8; + wire [7:0] adp_gpi8; + + assign adp_gpi8 = adp_gpo8; + assign ADPRESETREQ = adp_gpo8[0]; + + // DMA controller present + ADPcontrol_v1_0 u_ADP ( + // Clock and Reset + .ahb_hclk (HCLK), + .ahb_hresetn (HRESETn), + // DMA Control + .com_rx_tready (comio_rx_ready), + .com_rx_tdata (comio_rx_data8), + .com_rx_tvalid (comio_rx_valid), + .com_tx_tready (comio_tx_ready), + .com_tx_tdata (comio_tx_data8), + .com_tx_tvalid (comio_tx_valid), + .stdio_rx_tready (stdio_rx_ready), + .stdio_rx_tdata (stdio_rx_data8), + .stdio_rx_tvalid (stdio_rx_valid), + .stdio_tx_tready (stdio_tx_ready), + .stdio_tx_tdata (stdio_tx_data8), + .stdio_tx_tvalid (stdio_tx_valid), + .gpo8 (adp_gpo8), + .gpi8 (adp_gpi8), + // AHB-Lite Master Interface + .ahb_hready (HREADY_adp), + .ahb_hresp (HRESP_adp), + .ahb_hrdata (HRDATA_adp), + .ahb_htrans (HTRANS_adp), + .ahb_hwrite (HWRITE_adp), + .ahb_haddr (HADDR_adp), + .ahb_hsize (HSIZE_adp), + .ahb_hburst (HBURST_adp), + .ahb_hmastlock (HMASTLOCK_adp), + .ahb_hprot (HPROT_adp), + .ahb_hwdata (HWDATA_adp) + ); + assign HAUSER_adp [1:0] = 2'b00; // Address USER signals + assign HWUSER_adp [1:0] = 2'b00; // Write-data USER signals + + cmsdk_apb_usrt u_apb_usrt_com ( + .PCLK (PCLK), // Peripheral clock + .PCLKG (PCLKG), // Gated PCLK for bus + .PRESETn (PRESETn), // Reset + + .PSEL (exp14_psel), // APB interface inputs + .PADDR (exp_paddr[11:2]), + .PENABLE (exp_penable), + .PWRITE (exp_pwrite), + .PWDATA (exp_pwdata), + + .PRDATA (exp14_prdata), // APB interface outputs + .PREADY (exp14_pready), + .PSLVERR (exp14_pslverr), + + .ECOREVNUM (4'h0),// Engineering-change-order revision bits + + .TX_VALID_o (stdio_rx_valid), + .TX_DATA8_o (stdio_rx_data8), + .TX_READY_i (stdio_rx_ready), + + .RX_VALID_i (stdio_tx_valid), + .RX_DATA8_i (stdio_tx_data8), + .RX_READY_o (stdio_tx_ready), + + .TXINT ( ), // Transmit Interrupt + .RXINT ( ), // Receive Interrupt + .TXOVRINT ( ), // Transmit Overrun Interrupt + .RXOVRINT ( ), // Receive Overrun Interrupt + .UARTINT ( ) // Combined Interrupt + ); + + wire [7:0] ft_clkdiv = 8'd03; + + ft1248_streamio_v1_0 # + (.FT1248_WIDTH (1), + .FT1248_CLKON(0) ) + u_ftdio_com ( + .clk (HCLK), + .resetn (HRESETn), + .ft_clkdiv (ft_clkdiv ), + .ft_clk_o (ft_clk_o ), + .ft_ssn_o (ft_ssn_o ), + .ft_miso_i (ft_miso_i ), + .ft_miosio_o (ft_miosio_o ), + .ft_miosio_e (ft_miosio_e ), + .ft_miosio_z (ft_miosio_z ), + .ft_miosio_i (ft_miosio_i ), + .rxd_tready (comio_tx_ready), + .rxd_tdata (comio_tx_data8), + .rxd_tvalid (comio_tx_valid), + .rxd_tlast (1'b0), + .txd_tready (comio_rx_ready), + .txd_tdata (comio_rx_data8), + .txd_tvalid (comio_rx_valid), + .txd_tlast ( ) + ); + + +//---------------------------------------- +// DIRECT MEMORY ACCESS controller +// AHB MANAGER 1 +//---------------------------------------- + + // DMA interface not used in this example system + wire [DMA_CHANNEL_NUM-1:0] dma230_tie0; // tie off signal. + + assign dma230_tie0 = {DMA_CHANNEL_NUM{1'b0}}; + + // DMA done per channel + wire [DMA_CHANNEL_NUM-1:0] dma230_done_ch; + wire dmac_done; + wire dmac_err; + + ///generate if (INCLUDE_DMA != 0) begin : gen_dma + // DMA controller present + pl230_udma u_pl230_udma ( + // Clock and Reset + .hclk (HCLK), + .hresetn (HRESETn), + // DMA Control + .dma_req (dma230_tie0), + .dma_sreq (dma230_tie0), + .dma_waitonreq (dma230_tie0), + .dma_stall (1'b0), + .dma_active (), + .dma_done (dma230_done_ch), + .dma_err (dmac_err), + // AHB-Lite Master Interface + .hready (HREADY_dma), + .hresp (HRESP_dma), + .hrdata (HRDATA_dma), + .htrans (HTRANS_dma), + .hwrite (HWRITE_dma), + .haddr (HADDR_dma), + .hsize (HSIZE_dma), + .hburst (HBURST_dma), + .hmastlock (HMASTLOCK_dma), + .hprot (HPROT_dma), + .hwdata (HWDATA_dma), + // APB Slave Interface + .pclken (PCLKEN), + .psel (exp15_psel), + .pen (exp_penable), + .pwrite (exp_pwrite), + .paddr (exp_paddr[11:0]), + .pwdata (exp_pwdata[31:0]), + .prdata (exp15_prdata) + ); + + assign exp15_pready = 1'b1; + assign exp15_pslverr = 1'b0; + assign dmac_done = |dma230_done_ch; // OR all the DMA done together + +/* end else begin : gen_no_pl230_udma + // DMA controller not present + assign HADDR_dma [31:0] = 32'ha2a2a2a2; // Address bus + assign HTRANS_dma [1:0] = 2'b00; // Transfer type + assign HWRITE_dma = 1'b0; // Transfer direction + assign HSIZE_dma [2:0] = 3'b010; // Transfer size + assign HBURST_dma [2:0] = 3'b001; // Burst type + assign HPROT_dma [3:0] = 4'b0010; // Protection control + assign HWDATA_dma [31:0] = 32'hd2d2d2d2; // Write data + assign HMASTLOCK_dma = 1'b0; // Locked Sequence + assign HAUSER_dma [1:0] = 2'b00; // Address USER signals + assign HWUSER_dma [1:0] = 2'b00; // Write-data USER signals + + assign dmac_done = 1'b0; + assign dmac_err = 1'b0; + assign exp15_pready = 1'b1; + assign exp15_pslverr = 1'b0; + assign exp15_prdata = 32'h00000000; + assign dma230_done_ch = {DMA_CHANNEL_NUM{1'b0}}; + + end endgenerate +*/ + +//---------------------------------------- +// DIRECT MEMORY ACCESS controller 2 +// AHB MANAGER 2 +//---------------------------------------- + + // Manager port SI2 (inputs from master 2) + assign HADDR_dma2 [31:0] = 32'ha2a2a2a2; // Address bus + assign HTRANS_dma2 [1:0] = 2'b00; // Transfer type + assign HWRITE_dma2 = 1'b0; // Transfer direction + assign HSIZE_dma2 [2:0] = 3'b010; // Transfer size + assign HBURST_dma2 [2:0] = 3'b000; // Burst type + assign HPROT_dma2 [3:0] = 4'b0010; // Protection control + assign HWDATA_dma2 [31:0] = 32'hd2d2d2d2; // Write data + assign HMASTLOCK_dma2 = 1'b0; // Locked Sequence + assign HAUSER_dma2 [1:0] = 2'b00; // Address USER signals + assign HWUSER_dma2 [1:0] = 2'b00; // Write-data USER signals + +//---------------------------------------- +// CORTEX-M0 CPU controller +// AHB MANAGER 3 +//---------------------------------------- + + wire SYS_NMI; // Watchdog nin-maskable interrupt + wire [31:0] SYS_APB_IRQ; // APB subsystem IRQs + wire [15:0] SYS_GPIO0_IRQ; // GPIO-0 IRQs + wire [15:0] SYS_GPIO1_IRQ; // GPIO-1 IRQs + + wire gpio0_combintr; + wire gpio1_combintr; + assign gpio0_combintr = |SYS_GPIO0_IRQ[15:0]; + assign gpio1_combintr = |SYS_GPIO1_IRQ[15:0]; + + wire intnmi_cm0; + wire [31:0] intisr_cm0; + +// match interrupts to CMSDK for validation code reuse + + assign intnmi_cm0 = SYS_NMI; + assign intisr_cm0[ 5: 0] = SYS_APB_IRQ[ 5: 0]; + assign intisr_cm0[ 6] = SYS_APB_IRQ[ 6] | gpio0_combintr; + assign intisr_cm0[ 7] = SYS_APB_IRQ[ 7] | gpio1_combintr; + assign intisr_cm0[14: 8] = SYS_APB_IRQ[14: 8]; + assign intisr_cm0[15] = SYS_APB_IRQ[15] | dmac_done | dmac_err; + assign intisr_cm0[31:16] = SYS_APB_IRQ[31:16]| SYS_GPIO0_IRQ[15:0]; + + assign HAUSER_cpu [1:0] = 2'b00; // Address USER signals + assign HWUSER_cpu [1:0] = 2'b00; // Write-data USER signals + + + // Cortex-M0 integration level + nanosoc_cpu + u_nanosoc_cpu ( + .HCLK (HCLK), + .FCLK (FCLK), + .DCLK (DCLK), + .SCLK (SCLK), + .HRESETn (HRESETn), + .PORESETn (PORESETn), + .DBGRESETn (DBGRESETn), + .RSTBYPASS (TESTMODE), + .DFTSE (SCANENABLE), + // AHB port + .HADDR (HADDR_cpu), + .HTRANS (HTRANS_cpu), + .HWRITE (HWRITE_cpu), + .HSIZE (HSIZE_cpu), + .HBURST (HBURST_cpu), + .HPROT (HPROT_cpu), + .HWDATA (HWDATA_cpu), + .HMASTLOCK (HMASTLOCK_cpu), + .HREADY (HREADY_cpu), +// .HAUSER (HAUSER_cpu), +// .HWUSER (HWUSER_cpu), + .HRDATA (HRDATA_cpu), + .HRESP (HRESP_cpu), +// .HRUSER (HRUSER_cpu), + // sideband signals + .NMI (intnmi_cm0), // Non-maskable interrupt input + .IRQ (intisr_cm0[31:0]), // Interrupt request inputs + .TXEV (TXEV), // Event output (SEV executed) + .RXEV (RXEV), // Event input + // MISCELLANEOUS --------------------- + .SLEEPING (SLEEPING), + .SLEEPDEEP (SLEEPDEEP), + .WAKEUP (WAKEUP ), // Wake up request from WIC + .WICENREQ (WICENREQ ), // WIC enable request from PMU + .WICENACK (WICENACK ), // WIC enable ack to PMU + .LOCKUP (LOCKUP), // Core is locked-up + .GATEHCLK (GATEHCLK), + .SYSRESETREQ (SYSRESETREQ), // System reset request + .WDOGRESETREQ (WDOGRESETREQ), // Watchdog HW reset request + .ADPRESETREQ (ADPRESETREQ), // ADP debugger reset request + + // Debug - JTAG or Serial wire + // inputs + .SWDI (SWDI), + .SWCLK (SWCLK), + // outputs + .SWDO (SWDO), + .SWDOEN (SWDOEN) + ); + + assign RXEV = dmac_done; // Generate event when a DMA operation completed. + + +//------------------------------------ +// internal wires + + assign p0_out_nen = ~p0_out_en; //active low pad drive option + assign p1_out_nen_mux = ~p1_out_en_mux; //active low pad drive option + + + // Common AHB signals + wire [31:0] HADDR; + wire [1:0] HTRANS; + wire [2:0] HSIZE; + wire HWRITE; + wire [31:0] HWDATA; + wire HREADY; + + localparam BASEADDR_GPIO0 = 32'h4001_0000; + localparam BASEADDR_GPIO1 = 32'h4001_1000; + localparam BASEADDR_SYSROMTABLE = 32'hf000_0000; + + nanosoc_sysio + u_nanosoc_sysio ( + .FCLK (FCLK ), // free-running clock + .PORESETn (PORESETn ), // Power-On-Reset (active-low) + .TESTMODE (TESTMODE ), // Test-mode override for testability + .HCLK (HCLK ), // AHB interconnect clock + .HRESETn (HRESETn ), // AHB interconnect reset (active-low) + // Common AHB signals + .HSEL (HSEL_sys ), + .HADDR (HADDR_sys ), + .HBURST (HBURST_sys ), + .HMASTLOCK (HMASTLOCK_sys), + .HPROT (HPROT_sys ), + .HSIZE (HSIZE_sys ), + .HTRANS (HTRANS_sys ), + .HWDATA (HWDATA_sys ), + .HWRITE (HWRITE_sys ), + .HREADY (HREADYMUX_sys), + .HRDATA (HRDATA_sys ), + .HRESP (HRESP_sys ), + .HREADYOUT (HREADYOUT_sys), + // APB clocking + .PCLK (PCLK ), + .PCLKG (PCLKG ), + .PRESETn (PRESETn ), + .PCLKEN (PCLKEN ), + // APB expansion select outputs + .exp12_psel (exp12_psel ), + .exp13_psel (exp13_psel ), + .exp14_psel (exp14_psel ), + .exp15_psel (exp15_psel ), + .exp_pwdata (exp_pwdata ), + .exp_paddr (exp_paddr ), + .exp_pwrite (exp_pwrite ), + .exp_penable (exp_penable ), + // APB expansion interface inputs + .exp12_prdata (exp12_prdata ), + .exp12_pready (exp12_pready ), + .exp12_pslverr (exp12_pslverr), + .exp13_prdata (exp13_prdata ), + .exp13_pready (exp13_pready ), + .exp13_pslverr (exp13_pslverr), + .exp14_prdata (exp14_prdata ), + .exp14_pready (exp14_pready ), + .exp14_pslverr (exp14_pslverr), + .exp15_prdata (exp15_prdata ), + .exp15_pready (exp15_pready ), + .exp15_pslverr (exp15_pslverr), + // CPU sideband signalling + .SYS_NMI (SYS_NMI ), + .SYS_APB_IRQ (SYS_APB_IRQ ), + // CPU specific power/reset control + .REMAP_CTRL (ROM_MAP ), + .APBACTIVE (APBACTIVE ), + .SYSRESETREQ (SYSRESETREQ ), + .WDOGRESETREQ (WDOGRESETREQ ), + .LOCKUP (LOCKUP ), + .LOCKUPRESET (LOCKUPRESET ), + .PMUENABLE (PMUENABLE ), + // chip IO + .SYS_GPIO0_IRQ (SYS_GPIO0_IRQ ), + .SYS_GPIO1_IRQ (SYS_GPIO1_IRQ ), + // IO signalling + .uart0_rxd (uart0_rxd ), + .uart0_txd (uart0_txd ), + .uart0_txen (uart0_txen ), + .uart1_rxd (uart1_rxd ), + .uart1_txd (uart1_txd ), + .uart1_txen (uart1_txen ), + .uart2_rxd (uart2_rxd ), + .uart2_txd (uart2_txd ), + .uart2_txen (uart2_txen ), + .timer0_extin (timer0_extin ), + .timer1_extin (timer1_extin ), + // GPIO port signalling + .p0_in (p0_in ), + .p0_out (p0_out ), + .p0_outen (p0_out_en ), + .p0_altfunc (p0_altfunc ), + + .p1_in (p1_in ), + .p1_out (p1_out ), + .p1_outen (p1_out_en ), + .p1_altfunc (p1_altfunc ) + ); + + assign REMAP[3] = 1'b0; + assign REMAP[2] = 1'b0; + assign REMAP[1] = 1'b0; + assign REMAP[0] =!ROM_MAP; + + assign exp12_pready = 1'b1; + assign exp13_pready = 1'b1; + + // Internal Debug signals + wire i_trst_n; + wire i_swditms; + wire i_swclktck; + wire i_tdi; + wire i_tdo; + wire i_tdoen_n; + wire i_swdo; + wire i_swdoen; + + // Serial wire debug is used. nTRST, TDI and TDO are not needed + + +//---------------------------------------- +// I/O port pin muxing and tristate +//---------------------------------------- + + + assign i_swclktck = swdclk_in; + assign i_swditms = swdio_in; + assign swdio_out = i_swdo; + assign swdio_out_en = i_swdoen; + assign swdio_out_nen = !i_swdoen; + + assign swdclk_in = swdclk_i; + assign swdio_in = swdio_i; + + assign swdio_o = swdio_out; + assign swdio_e = swdio_out_en; + assign swdio_z = swdio_out_nen; + + cmsdk_mcu_pin_mux + u_pin_mux ( + // UART + .uart0_rxd (uart0_rxd), + .uart0_txd (uart0_txd), + .uart0_txen (uart0_txen), + .uart1_rxd (uart1_rxd), + .uart1_txd (uart1_txd), + .uart1_txen (uart1_txen), + .uart2_rxd (uart2_rxd), + .uart2_txd (uart2_txd), + .uart2_txen (uart2_txen), + + // Timer + .timer0_extin (timer0_extin), + .timer1_extin (timer1_extin), + + + // IO Ports + .p0_in ( ), // was (p0_in) now from pad inputs), + .p0_out (p0_out), + .p0_outen (p0_out_en), + .p0_altfunc (p0_altfunc), + + .p1_in ( ), // was(p1_in) now from pad inputs), + .p1_out (p1_out), + .p1_outen (p1_out_en), + .p1_altfunc (p1_altfunc), + + // Debug + .i_trst_n (i_trst_n), + .i_swditms ( ), //i_swditms), + .i_swclktck ( ), //i_swclktck), + .i_tdi (i_tdi), + .i_tdo (i_tdo), + .i_tdoen_n (i_tdoen_n), + .i_swdo (i_swdo), + .i_swdoen (i_swdoen), + + // IO pads + .p1_out_mux (p1_out_mux), + .p1_out_en_mux (p1_out_en_mux), + .P0 ( ), //P0), + .P1 ( ), //P1), + + .nTRST (nTRST), // Not needed if serial-wire debug is used + .TDI (1'b0), // Not needed if serial-wire debug is used + .SWDIOTMS ( ), //SWDIOTMS), + .SWCLKTCK ( ), //SWCLKTCK), + .TDO ( ) // Not needed if serial-wire debug is used + + ); + +endmodule + + + diff --git a/Cortex-M0/nanosoc/systems/mcu/verilog/nanosoc_chip_pads.v b/Cortex-M0/nanosoc/systems/mcu/verilog/nanosoc_chip_pads.v new file mode 100644 index 0000000..e994acb --- /dev/null +++ b/Cortex-M0/nanosoc/systems/mcu/verilog/nanosoc_chip_pads.v @@ -0,0 +1,406 @@ +//----------------------------------------------------------------------------- +// customised top-level Cortex-M0 'nanosoc' controller +// A joint work commissioned on behalf of SoC Labs, under Arm Academic Access license. +// +// Contributors +// +// David Flynn (d.w.flynn@soton.ac.uk) +// +// Copyright � 2021-3, SoC Labs (www.soclabs.org) +//----------------------------------------------------------------------------- + +//----------------------------------------------------------------------------- +// The confidential and proprietary information contained in this file may +// only be used by a person authorised under and to the extent permitted +// by a subsisting licensing agreement from Arm Limited or its affiliates. +// +// (C) COPYRIGHT 2010-2013 Arm Limited or its affiliates. +// ALL RIGHTS RESERVED +// +// This entire notice must be reproduced on all copies of this file +// and copies of this file may only be made by a person if such person is +// permitted to do so under the terms of a subsisting license agreement +// from Arm Limited or its affiliates. +// +// SVN Information +// +// Checked In : $Date: 2017-10-10 15:55:38 +0100 (Tue, 10 Oct 2017) $ +// +// Revision : $Revision: 371321 $ +// +// Release Information : Cortex-M System Design Kit-r1p1-00rel0 +// +//----------------------------------------------------------------------------- +//----------------------------------------------------------------------------- +// Abstract : Top level for example Cortex-M0/Cortex-M0+ microcontroller +//----------------------------------------------------------------------------- +// + +module nanosoc_chip_pads ( +`ifdef POWER_PINS + inout wire VDDIO, + inout wire VSSIO, + inout wire VDD, + inout wire VSS, +`endif + inout wire XTAL1, // input + inout wire XTAL2, // output + inout wire NRST, // active low reset + inout wire [15:0] P0, + inout wire [15:0] P1, + inout wire SWDIOTMS, + inout wire SWCLKTCK); + + +//------------------------------------ +// internal wires + + wire xtal_clk_i; + wire xtal_clk_o; + wire nrst_i; + wire [15:0] p0_i; // level-shifted input from pad + wire [15:0] p0_o; // output port drive + wire [15:0] p0_e; // active high output drive enable (pad tech dependent) + wire [15:0] p0_z; // active low output drive enable (pad tech dependent) + wire [15:0] p1_i; // level-shifted input from pad + wire [15:0] p1_o; // output port drive + wire [15:0] p1_e; // active high output drive enable (pad tech dependent) + wire [15:0] p1_z; // active low output drive enable (pad tech dependent) + + wire swdio_i; + wire swdio_o; + wire swdio_e; + wire swdio_z; + wire swdclk_i; + + // -------------------------------------------------------------------------------- + // Cortex-M0 nanosoc Microcontroller + // -------------------------------------------------------------------------------- + + nanosoc_chip + u_nanosoc_chip ( +`ifdef POWER_PINS + .VDDIO (VDDIO), + .VSSIO (VSSIO), + .VDD (VDD), + .VSS (VSS), +`endif + .xtal_clk_i(xtal_clk_i), + .xtal_clk_o(xtal_clk_o), + .nrst_i(nrst_i), + .p0_i(p0_i), // level-shifted input from pad + .p0_o(p0_o), // output port drive + .p0_e(p0_e), // active high output drive enable (pad tech dependent) + .p0_z(p0_z), // active low output drive enable (pad tech dependent) + .p1_i(p1_i), // level-shifted input from pad + .p1_o(p1_o), // output port drive + .p1_e(p1_e), // active high output drive enable (pad tech dependent) + .p1_z(p1_z), // active low output drive enable (pad tech dependent) + .swdio_i(swdio_i), + .swdio_o(swdio_o), + .swdio_e(swdio_e), + .swdio_z(swdio_z), + .swdclk_i(swdclk_i) + ); + + +//TIE_HI uTIEHI (.tiehi(tiehi)); + wire tiehi = 1'b1; +//TIE_LO uTIELO (.tielo(tielo)); + wire tielo = 1'b0; + + // -------------------------------------------------------------------------------- + // IO pad (GLIB Generic Library napping) + // -------------------------------------------------------------------------------- + +`ifdef POWER_PINS +// Pad IO power supplies + +PAD_VDDIO uPAD_VDDIO_1( + .PAD(VDDIO) + ); + +PAD_VSSIO uPAD_VSSIO_1( + .PAD(VSSIO) + ); + +// Core power supplies + +PAD_VDDSOC uPAD_VDD_1( + .PAD(VDD) + ); + +PAD_VSS uPAD_VSS_1( + .PAD(VSS) + ); +`endif + +// Clock, Reset and Serial Wire Debug ports + +PAD_INOUT8MA_NOE uPAD_XTAL_I ( + .PAD (XTAL1), + .O (tielo), + .I (xtal_clk_i), + .NOE (tiehi) + ); + +PAD_INOUT8MA_NOE uPAD_XTAL_O ( + .PAD (XTAL2), + .O (xtal_clk_o), + .I ( ), + .NOE (tielo) + ); + +PAD_INOUT8MA_NOE uPAD_NRST_I ( + .PAD (NRST), + .O (tielo), + .I (nrst_i), + .NOE (tiehi) + ); + +PAD_INOUT8MA_NOE uPAD_SWDIO_I ( + .PAD (SWDIOTMS), + .O (swdio_o), + .I (swdio_i), + .NOE (swdio_z) + ); + +PAD_INOUT8MA_NOE uPAD_SWDCLK_I ( + .PAD (SWCLKTCK), + .O (tielo), + .I (swdclk_i), + .NOE (tiehi) + ); + +// GPI.I Port 0 x 16 + +PAD_INOUT8MA_NOE uPAD_P0_00 ( + .PAD (P0[00]), + .O (p0_o[00]), + .I (p0_i[00]), + .NOE (p0_z[00]) + ); + +PAD_INOUT8MA_NOE uPAD_P0_01 ( + .PAD (P0[01]), + .O (p0_o[01]), + .I (p0_i[01]), + .NOE (p0_z[01]) + ); + +PAD_INOUT8MA_NOE uPAD_P0_02 ( + .PAD (P0[02]), + .O (p0_o[02]), + .I (p0_i[02]), + .NOE (p0_z[02]) + ); + +PAD_INOUT8MA_NOE uPAD_P0_03 ( + .PAD (P0[03]), + .O (p0_o[03]), + .I (p0_i[03]), + .NOE (p0_z[03]) + ); + +PAD_INOUT8MA_NOE uPAD_P0_04 ( + .PAD (P0[04]), + .O (p0_o[04]), + .I (p0_i[04]), + .NOE (p0_z[04]) + ); + +PAD_INOUT8MA_NOE uPAD_P0_05 ( + .PAD (P0[05]), + .O (p0_o[05]), + .I (p0_i[05]), + .NOE (p0_z[05]) + ); + +PAD_INOUT8MA_NOE uPAD_P0_06 ( + .PAD (P0[06]), + .O (p0_o[06]), + .I (p0_i[06]), + .NOE (p0_z[06]) + ); + +PAD_INOUT8MA_NOE uPAD_P0_07 ( + .PAD (P0[07]), + .O (p0_o[07]), + .I (p0_i[07]), + .NOE (p0_z[07]) + ); + +PAD_INOUT8MA_NOE uPAD_P0_08 ( + .PAD (P0[08]), + .O (p0_o[08]), + .I (p0_i[08]), + .NOE (p0_z[08]) + ); + +PAD_INOUT8MA_NOE uPAD_P0_09 ( + .PAD (P0[09]), + .O (p0_o[09]), + .I (p0_i[09]), + .NOE (p0_z[09]) + ); + +PAD_INOUT8MA_NOE uPAD_P0_10 ( + .PAD (P0[10]), + .O (p0_o[10]), + .I (p0_i[10]), + .NOE (p0_z[10]) + ); + +PAD_INOUT8MA_NOE uPAD_P0_11 ( + .PAD (P0[11]), + .O (p0_o[11]), + .I (p0_i[11]), + .NOE (p0_z[11]) + ); + +PAD_INOUT8MA_NOE uPAD_P0_12 ( + .PAD (P0[12]), + .O (p0_o[12]), + .I (p0_i[12]), + .NOE (p0_z[12]) + ); + +PAD_INOUT8MA_NOE uPAD_P0_13 ( + .PAD (P0[13]), + .O (p0_o[13]), + .I (p0_i[13]), + .NOE (p0_z[13]) + ); + +PAD_INOUT8MA_NOE uPAD_P0_14 ( + .PAD (P0[14]), + .O (p0_o[14]), + .I (p0_i[14]), + .NOE (p0_z[14]) + ); + +PAD_INOUT8MA_NOE uPAD_P0_15 ( + .PAD (P0[15]), + .O (p0_o[15]), + .I (p0_i[15]), + .NOE (p0_z[15]) + ); + +// GPI.I Port 1 x 16 + +PAD_INOUT8MA_NOE uPAD_P1_00 ( + .PAD (P1[00]), + .O (p1_o[00]), + .I (p1_i[00]), + .NOE (p1_z[00]) + ); + +PAD_INOUT8MA_NOE uPAD_P1_01 ( + .PAD (P1[01]), + .O (p1_o[01]), + .I (p1_i[01]), + .NOE (p1_z[01]) + ); + +PAD_INOUT8MA_NOE uPAD_P1_02 ( + .PAD (P1[02]), + .O (p1_o[02]), + .I (p1_i[02]), + .NOE (p1_z[02]) + ); + +PAD_INOUT8MA_NOE uPAD_P1_03 ( + .PAD (P1[03]), + .O (p1_o[03]), + .I (p1_i[03]), + .NOE (p1_z[03]) + ); + +PAD_INOUT8MA_NOE uPAD_P1_04 ( + .PAD (P1[04]), + .O (p1_o[04]), + .I (p1_i[04]), + .NOE (p1_z[04]) + ); + +PAD_INOUT8MA_NOE uPAD_P1_05 ( + .PAD (P1[05]), + .O (p1_o[05]), + .I (p1_i[05]), + .NOE (p1_z[05]) + ); + +PAD_INOUT8MA_NOE uPAD_P1_06 ( + .PAD (P1[06]), + .O (p1_o[06]), + .I (p1_i[06]), + .NOE (p1_z[06]) + ); + +PAD_INOUT8MA_NOE uPAD_P1_07 ( + .PAD (P1[07]), + .O (p1_o[07]), + .I (p1_i[07]), + .NOE (p1_z[07]) + ); + +PAD_INOUT8MA_NOE uPAD_P1_08 ( + .PAD (P1[08]), + .O (p1_o[08]), + .I (p1_i[08]), + .NOE (p1_z[08]) + ); + +PAD_INOUT8MA_NOE uPAD_P1_09 ( + .PAD (P1[09]), + .O (p1_o[09]), + .I (p1_i[09]), + .NOE (p1_z[09]) + ); + +PAD_INOUT8MA_NOE uPAD_P1_10 ( + .PAD (P1[10]), + .O (p1_o[10]), + .I (p1_i[10]), + .NOE (p1_z[10]) + ); + +PAD_INOUT8MA_NOE uPAD_P1_11 ( + .PAD (P1[11]), + .O (p1_o[11]), + .I (p1_i[11]), + .NOE (p1_z[11]) + ); + +PAD_INOUT8MA_NOE uPAD_P1_12 ( + .PAD (P1[12]), + .O (p1_o[12]), + .I (p1_i[12]), + .NOE (p1_z[12]) + ); + +PAD_INOUT8MA_NOE uPAD_P1_13 ( + .PAD (P1[13]), + .O (p1_o[13]), + .I (p1_i[13]), + .NOE (p1_z[13]) + ); + +PAD_INOUT8MA_NOE uPAD_P1_14 ( + .PAD (P1[14]), + .O (p1_o[14]), + .I (p1_i[14]), + .NOE (p1_z[14]) + ); + +PAD_INOUT8MA_NOE uPAD_P1_15 ( + .PAD (P1[15]), + .O (p1_o[15]), + .I (p1_i[15]), + .NOE (p1_z[15]) + ); + +endmodule + + + diff --git a/Cortex-M0/nanosoc/systems/mcu/verilog/nanosoc_cpu.v b/Cortex-M0/nanosoc/systems/mcu/verilog/nanosoc_cpu.v new file mode 100644 index 0000000..c6185ea --- /dev/null +++ b/Cortex-M0/nanosoc/systems/mcu/verilog/nanosoc_cpu.v @@ -0,0 +1,250 @@ +//----------------------------------------------------------------------------- +// customised Cortex-M0 'nanosoc' controller +// A joint work commissioned on behalf of SoC Labs, under Arm Academic Access license. +// +// Contributors +// +// David Flynn (d.w.flynn@soton.ac.uk) +// +// Copyright � 2021-3, SoC Labs (www.soclabs.org) +//----------------------------------------------------------------------------- + +//----------------------------------------------------------------------------- +// The confidential and proprietary information contained in this file may +// only be used by a person authorised under and to the extent permitted +// by a subsisting licensing agreement from Arm Limited or its affiliates. +// +// (C) COPYRIGHT 2010-2013 Arm Limited or its affiliates. +// ALL RIGHTS RESERVED +// +// This entire notice must be reproduced on all copies of this file +// and copies of this file may only be made by a person if such person is +// permitted to do so under the terms of a subsisting license agreement +// from Arm Limited or its affiliates. +// +// SVN Information +// +// Checked In : $Date: 2017-10-10 15:55:38 +0100 (Tue, 10 Oct 2017) $ +// +// Revision : $Revision: 371321 $ +// +// Release Information : Cortex-M System Design Kit-r1p1-00rel0 +// +//----------------------------------------------------------------------------- +//----------------------------------------------------------------------------- +// Abstract : System level design for the example Cortex-M0 system +//----------------------------------------------------------------------------- + +module nanosoc_cpu #( + parameter CLKGATE_PRESENT = 0, + parameter BE = 0, // 1: Big endian 0: little endian + parameter BKPT = 4, // Number of breakpoint comparators + parameter DBG = 1, // Debug configuration + parameter NUMIRQ = 32, // NUM of IRQ + parameter SMUL = 0, // Multiplier configuration + parameter SYST = 1, // SysTick + parameter WIC = 1, // Wake-up interrupt controller support + parameter WICLINES = 34, // Supported WIC lines + parameter WPT = 2, // Number of DWT comparators + parameter RESET_ALL_REGS = 0, // Do not reset all registers + parameter INCLUDE_JTAG = 0 // Do not Include JTAG feature + ) + ( + input wire HCLK, // (HCLK master) + input wire FCLK, // Free running clock + input wire SCLK, // System clock + input wire HRESETn, // AHB and System reset + input wire PORESETn, // Power on reset + input wire DCLK, // Debug clock + input wire DBGRESETn, // Debug reset + input wire RSTBYPASS, // Reset by pass (for testing) + input wire DFTSE, // Reset by pass (for testing) + + // AHB Lite port + output wire [31:0] HADDR, // Address bus + output wire [1:0] HTRANS, // Transfer type + output wire HWRITE, // Transfer direction + output wire [2:0] HSIZE, // Transfer size + output wire [2:0] HBURST, // Burst type + output wire [3:0] HPROT, // Protection control + output wire [31:0] HWDATA, // Write data + output wire HMASTLOCK, // Locked Sequence +// output wire [1:0] HAUSER, // Address USER signals +// output wire [1:0] HWUSER, // Write-data USER signals + input wire [31:0] HRDATA, // Read data bus + input wire HREADY, // HREADY feedback + input wire HRESP, // Transfer response +// input wire [1:0] HRUSER, // Read-data USER signals + + // Sideband CPU signalling + input wire NMI, // Non-Maskable Interrupt request + input wire [31:0] IRQ, // Maskable Interrupt requests + output wire TXEV, // Send Event (SEV) output + input wire RXEV, // Receive Event input + output wire SLEEPING, // Processor status - sleeping + output wire SLEEPDEEP, // Processor status - deep sleep + output wire GATEHCLK, // Wake up request from WIC + output wire LOCKUP, // Wake up request from WIC + output wire WAKEUP, // Wake up request from WIC + input wire WICENREQ, // WIC enable request from PMU + output wire WICENACK, // WIC enable ack to PMU + input wire SYSRESETREQ, // System reset request + input wire WDOGRESETREQ, // Watchdog reset request + input wire ADPRESETREQ, // ADP Debug reset request + + // Serial-Wire Debug + input wire SWDI, // SWD data input + input wire SWCLK, // SWD clock + output wire SWDO, // SWD data output + output wire SWDOEN); // SWD data output enable + + + // ------------------------------- + // Internal signals + // ------------------------------- + + // clock, reset, and power control + + wire [33:0] WICSENSE; + + wire APBACTIVE; // APB bus active (for clock gating of PCLKG) + wire LOCKUPRESET; // System Controller cfg - reset if lockup + wire PMUENABLE; // System Controller cfg - Enable PMU + + wire CDBGPWRUPREQ; // Debug Power Up request to PMU + wire CDBGPWRUPACK; // Debug Power Up ACK from PMU + wire SLEEPHOLDREQn; // Sleep extension request from PMU + wire SLEEPHOLDACKn; // Sleep extension request to PMU + + + // SysTick timer signals + wire STCLKEN; + wire [25:0] STCALIB; + + // Processor debug signals + wire DBGRESTART; + wire DBGRESTARTED; + wire EDBGRQ; + + // Processor status + wire HALTED; + wire [2:0] CODEHINTDE; + wire SPECHTRANS; + wire CODENSEQ; + wire SHAREABLE; + + // Cortex-M0 integration level + CORTEXM0INTEGRATION + #(.ACG (CLKGATE_PRESENT), // Architectural clock gating + .BE (BE), // Big-endian + .BKPT (BKPT), // Number of breakpoint comparators + .DBG (DBG), // Debug configuration + .JTAGnSW (INCLUDE_JTAG), // Debug port interface: JTAGnSW + .NUMIRQ (NUMIRQ), // Number of Interrupts + .RAR (RESET_ALL_REGS), // Reset All Registers + .SMUL (SMUL), // Multiplier configuration + .SYST (SYST), // SysTick + .WIC (WIC), // Wake-up interrupt controller support + .WICLINES (WICLINES), // Supported WIC lines + .WPT (WPT)) // Number of DWT comparators + + u_cortex_m0_integration ( + // System inputs + .FCLK (FCLK), // FCLK + .SCLK (SCLK), // SCLK generated from PMU + .HCLK (HCLK), // HCLK generated from PMU + .DCLK (DCLK), // DCLK generated from PMU + .PORESETn (PORESETn), + .HRESETn (HRESETn), + .DBGRESETn (DBGRESETn), + .RSTBYPASS (RSTBYPASS), + .SE (DFTSE), + + // Power management inputs + .SLEEPHOLDREQn (SLEEPHOLDREQn), + .WICENREQ (WICENREQ), + .CDBGPWRUPACK (CDBGPWRUPACK), + + // Power management outputs + .SLEEPHOLDACKn (SLEEPHOLDACKn), + .WICENACK (WICENACK), + .CDBGPWRUPREQ (CDBGPWRUPREQ), + + .WAKEUP (WAKEUP), + .WICSENSE (WICSENSE), + .GATEHCLK (GATEHCLK), + .SYSRESETREQ (SYSRESETREQ), + + // System bus + .HADDR (HADDR ), + .HTRANS (HTRANS ), + .HSIZE (HSIZE ), + .HBURST (HBURST ), + .HPROT (HPROT ), + .HMASTLOCK (HMASTLOCK ), + .HWRITE (HWRITE ), + .HWDATA (HWDATA ), + .HRDATA (HRDATA ), + .HREADY (HREADY ), + .HRESP (HRESP ), + .HMASTER ( ), + + .CODEHINTDE (CODEHINTDE), + .SPECHTRANS (SPECHTRANS), + .CODENSEQ (CODENSEQ), + + // Interrupts + .IRQ (IRQ[31:0]), + .NMI (NMI), + .IRQLATENCY (8'h00), + + .ECOREVNUM (28'h0), + // Systick + .STCLKEN (STCLKEN), + .STCALIB (STCALIB), + + // Debug - JTAG or Serial wire + // inputs + .nTRST (1'b1), + .SWDITMS (SWDI), + .SWCLKTCK (SWCLK), + .TDI (1'b0), + // outputs + .TDO ( ), + .nTDOEN ( ), + .SWDO (SWDO), + .SWDOEN (SWDOEN), + + .DBGRESTART (DBGRESTART), + .DBGRESTARTED (DBGRESTARTED), + + // Event communication + .TXEV (TXEV), + .RXEV (RXEV), + .EDBGRQ (EDBGRQ), + // Status output + .HALTED (HALTED), + .LOCKUP (LOCKUP), + .SLEEPING (SLEEPING), + .SLEEPDEEP (SLEEPDEEP) + ); + + // Unused debug feature + assign DBGRESTART = 1'b0; // multi-core synchronous restart from halt + assign EDBGRQ = 1'b0; // multi-core synchronous halt request + + // ------------------------------- + // SysTick signals + // ------------------------------- + cmsdk_mcu_stclkctrl + #(.DIV_RATIO (18'd01000)) + u_cmsdk_mcu_stclkctrl ( + .FCLK (FCLK), + .SYSRESETn (HRESETn), + + .STCLKEN (STCLKEN), + .STCALIB (STCALIB) + ); + + +endmodule diff --git a/Cortex-M0/nanosoc/systems/mcu/verilog/nanosoc_sys_ahb_decode.v b/Cortex-M0/nanosoc/systems/mcu/verilog/nanosoc_sys_ahb_decode.v new file mode 100644 index 0000000..9bea4ac --- /dev/null +++ b/Cortex-M0/nanosoc/systems/mcu/verilog/nanosoc_sys_ahb_decode.v @@ -0,0 +1,100 @@ +//----------------------------------------------------------------------------- +// customised Cortex-M0 'nanosoc' controller +// A joint work commissioned on behalf of SoC Labs, under Arm Academic Access license. +// +// Contributors +// +// David Flynn (d.w.flynn@soton.ac.uk) +// +// Copyright � 2021-3, SoC Labs (www.soclabs.org) +//----------------------------------------------------------------------------- + +//----------------------------------------------------------------------------- +// The confidential and proprietary information contained in this file may +// only be used by a person authorised under and to the extent permitted +// by a subsisting licensing agreement from Arm Limited or its affiliates. +// +// (C) COPYRIGHT 2013 Arm Limited or its affiliates. +// ALL RIGHTS RESERVED +// +// This entire notice must be reproduced on all copies of this file +// and copies of this file may only be made by a person if such person is +// permitted to do so under the terms of a subsisting license agreement +// from Arm Limited or its affiliates. +// +// SVN Information +// +// Checked In : $Date: 2012-07-31 11:15:58 +0100 (Tue, 31 Jul 2012) $ +// +// Revision : $Revision: 217031 $ +// +// Release Information : Cortex-M System Design Kit-r1p1-00rel0 +// +//----------------------------------------------------------------------------- +//----------------------------------------------------------------------------- +// Abstract : This module performs the address decode of the HADDR from the +// CPU and generates the HSELs' for each of the target peripherals. +// Also performs address decode for MTB +//----------------------------------------------------------------------------- +// + +module nanosoc_sys_ahb_decode #( + // GPIO0 peripheral base address + parameter BASEADDR_GPIO0 = 32'h4001_0000, + // GPIO1 peripheral base address + parameter BASEADDR_GPIO1 = 32'h4001_1000, + // GPIO1 peripheral base address + parameter BASEADDR_SYSCTRL = 32'h4001_f000, + + // Location of the System ROM Table. + parameter BASEADDR_SYSROMTABLE = 32'hf000_0000 + ) + ( + // System Address + input wire hsel, + input wire [31:0] haddr, + + // Peripheral Selection + output wire apbsys_hsel, + output wire gpio0_hsel, + output wire gpio1_hsel, + output wire sysctrl_hsel, + output wire sysrom_hsel, + + // Default slave + output wire defslv_hsel + ); + + + + // AHB address decode + // 0x40000000 - 0x4000FFFF : APB subsystem + // 0x40010000 - 0x40010FFF : AHB peripherals (GPIO0) + // 0x40011000 - 0x40011FFF : AHB peripherals (GPIO1) + // 0x4001F000 - 0x4001FFFF : AHB peripherals (SYS control) + // 0xF0000000 - 0xF0000FFF : System ROM Table + + // ---------------------------------------------------------- + // Peripheral Selection decode logic + // ---------------------------------------------------------- + + assign apbsys_hsel = hsel & (haddr[31:16]==16'h4000); // 0x40000000 + assign gpio0_hsel = hsel & (haddr[31:12]== + BASEADDR_GPIO0[31:12]); // 0x40010000 + assign gpio1_hsel = hsel & (haddr[31:12]== + BASEADDR_GPIO1[31:12]); // 0x40011000 + assign sysctrl_hsel = hsel & (haddr[31:12]== + BASEADDR_SYSCTRL[31:12]); // 0x4001F000 + assign sysrom_hsel = hsel & (haddr[31:12]== + BASEADDR_SYSROMTABLE[31:12]); // 0xF0000000 + + // ---------------------------------------------------------- + // Default slave decode logic + // ---------------------------------------------------------- + + assign defslv_hsel = ~(apbsys_hsel | + gpio0_hsel | gpio1_hsel | + sysctrl_hsel | sysrom_hsel + ); + +endmodule diff --git a/Cortex-M0/nanosoc/systems/mcu/verilog/nanosoc_sysio.v b/Cortex-M0/nanosoc/systems/mcu/verilog/nanosoc_sysio.v new file mode 100644 index 0000000..456a2b6 --- /dev/null +++ b/Cortex-M0/nanosoc/systems/mcu/verilog/nanosoc_sysio.v @@ -0,0 +1,493 @@ +//----------------------------------------------------------------------------- +// customised Cortex-M0 'nanosoc' controller +// A joint work commissioned on behalf of SoC Labs, under Arm Academic Access license. +// +// Contributors +// +// David Flynn (d.w.flynn@soton.ac.uk) +// +// Copyright � 2021-3, SoC Labs (www.soclabs.org) +//----------------------------------------------------------------------------- + +//----------------------------------------------------------------------------- +// The confidential and proprietary information contained in this file may +// only be used by a person authorised under and to the extent permitted +// by a subsisting licensing agreement from Arm Limited or its affiliates. +// +// (C) COPYRIGHT 2010-2013 Arm Limited or its affiliates. +// ALL RIGHTS RESERVED +// +// This entire notice must be reproduced on all copies of this file +// and copies of this file may only be made by a person if such person is +// permitted to do so under the terms of a subsisting license agreement +// from Arm Limited or its affiliates. +// +// SVN Information +// +// Checked In : $Date: 2017-10-10 15:55:38 +0100 (Tue, 10 Oct 2017) $ +// +// Revision : $Revision: 371321 $ +// +// Release Information : Cortex-M System Design Kit-r1p1-00rel0 +// +//----------------------------------------------------------------------------- +//----------------------------------------------------------------------------- +// Abstract : System level design for the example Cortex-M0 system +//----------------------------------------------------------------------------- + +module nanosoc_sysio +( + input wire FCLK, // Free-running system clock + input wire PORESETn, // Power-On-Reset reset (active-low) + input wire TESTMODE, // Reset bypass in scan test +// AHB interface + input wire HCLK, // AHB clock + input wire HRESETn, // AHB reset (active-low) + input wire HSEL, // AHB region select + input wire [31:0] HADDR, // AHB address + input wire [ 2:0] HBURST, // AHB burst + input wire HMASTLOCK, // AHB lock + input wire [ 3:0] HPROT, // AHB prot + input wire [ 2:0] HSIZE, // AHB size + input wire [ 1:0] HTRANS, // AHB transfer + input wire [31:0] HWDATA, // AHB write data + input wire HWRITE, // AHB write + input wire HREADY, // AHB ready + output wire [31:0] HRDATA, // AHB read-data + output wire HRESP, // AHB response + output wire HREADYOUT, // AHB ready out + // APB clocking control + input wire PCLK, // Peripheral clock + input wire PCLKG, // Gated Peripheral bus clock + input wire PRESETn, // Peripheral system and APB reset + input wire PCLKEN, // Clock divide control for AHB to APB bridge + // APB external Slave Interface + output wire exp12_psel, + output wire exp13_psel, + output wire exp14_psel, + output wire exp15_psel, + output wire exp_penable, + output wire exp_pwrite, + output wire [11:0] exp_paddr, + output wire [31:0] exp_pwdata, + input wire [31:0] exp12_prdata, + input wire exp12_pready, + input wire exp12_pslverr, + input wire [31:0] exp13_prdata, + input wire exp13_pready, + input wire exp13_pslverr, + input wire [31:0] exp14_prdata, + input wire exp14_pready, + input wire exp14_pslverr, + input wire [31:0] exp15_prdata, + input wire exp15_pready, + input wire exp15_pslverr, + + // CPU sideband signalling + output wire SYS_NMI, // watchdog_interrupt; + output wire [31:0] SYS_APB_IRQ, // apbsubsys_interrupt; + output wire [15:0] SYS_GPIO0_IRQ, // GPIO 0 irqs + output wire [15:0] SYS_GPIO1_IRQ, // GPIO 0 irqs + + // CPU power/reset control + output wire REMAP_CTRL, // REMAP control bit + output wire APBACTIVE, // APB bus active (for clock gating of PCLKG) + output wire SYSRESETREQ, // Processor control - system reset request + output wire WDOGRESETREQ, // Watchdog reset request + input wire LOCKUP, // Processor status - Locked up + output wire LOCKUPRESET, // System Controller cfg - reset if lockup + output wire PMUENABLE, // System Controller cfg - Enable PMU + + // IO signalling + input wire uart0_rxd, // Uart 0 receive data + output wire uart0_txd, // Uart 0 transmit data + output wire uart0_txen, // Uart 0 transmit data enable + input wire uart1_rxd, // Uart 1 receive data + output wire uart1_txd, // Uart 1 transmit data + output wire uart1_txen, // Uart 1 transmit data enable + input wire uart2_rxd, // Uart 2 receive data + output wire uart2_txd, // Uart 2 transmit data + output wire uart2_txen, // Uart 2 transmit data enable + input wire timer0_extin, // Timer 0 external input + input wire timer1_extin, // Timer 1 external input + + // GPIO + input wire [15:0] p0_in, // GPIO 0 inputs + output wire [15:0] p0_out, // GPIO 0 outputs + output wire [15:0] p0_outen, // GPIO 0 output enables + output wire [15:0] p0_altfunc, // GPIO 0 alternate function (pin mux) + input wire [15:0] p1_in, // GPIO 1 inputs + output wire [15:0] p1_out, // GPIO 1 outputs + output wire [15:0] p1_outen, // GPIO 1 output enables + output wire [15:0] p1_altfunc // GPIO 1 alternate function (pin mux) +); + + + localparam BASEADDR_GPIO0 = 32'h4001_0000; // GPIO0 peripheral base address + localparam BASEADDR_GPIO1 = 32'h4001_1000; // GPIO1 peripheral base address + localparam BASEADDR_SYSROMTABLE = 32'hf000_0000; + localparam BE = 0; + + // ------------------------------------------------------------ + // Local wires + // ------------------------------------------------------------ + + wire defslv_hsel; // AHB default slave signals + wire defslv_hreadyout; + wire [31:0] defslv_hrdata; + wire defslv_hresp; + + wire apbsys_hsel; // APB subsystem AHB interface signals + wire apbsys_hreadyout; + wire [31:0] apbsys_hrdata; + wire apbsys_hresp; + + wire gpio0_hsel; // AHB GPIO bus interface signals + wire gpio0_hreadyout; + wire [31:0] gpio0_hrdata; + wire gpio0_hresp; + + wire gpio1_hsel; // AHB GPIO bus interface signals + wire gpio1_hreadyout; + wire [31:0] gpio1_hrdata; + wire gpio1_hresp; + + wire sysctrl_hsel; // System control bus interface signals + wire sysctrl_hreadyout; + wire [31:0] sysctrl_hrdata; + wire sysctrl_hresp; + + // System ROM Table + wire sysrom_hsel; // AHB to System ROM Table - select + wire sysrom_hreadyout; + wire [31:0] sysrom_hrdata; + wire sysrom_hresp; + + + // AHB address decode + nanosoc_sys_ahb_decode #( + .BASEADDR_GPIO0 (BASEADDR_GPIO0), + .BASEADDR_GPIO1 (BASEADDR_GPIO1), + .BASEADDR_SYSROMTABLE (BASEADDR_SYSROMTABLE) + ) + u_addr_decode ( + // System Address + .hsel (HSEL), + .haddr (HADDR), + .apbsys_hsel (apbsys_hsel), + .gpio0_hsel (gpio0_hsel), + .gpio1_hsel (gpio1_hsel), + .sysctrl_hsel (sysctrl_hsel), + .sysrom_hsel (sysrom_hsel), + .defslv_hsel (defslv_hsel) + ); + + // AHB slave multiplexer + cmsdk_ahb_slave_mux #( + .PORT0_ENABLE (1), // APB subsystem bridge + .PORT1_ENABLE (1), // GPIO Port 0 + .PORT2_ENABLE (1), // GPIO Port 1 + .PORT3_ENABLE (1), // SYS control + .PORT4_ENABLE (1), // SYS ROM table + .PORT5_ENABLE (1), // default + .PORT6_ENABLE (0), + .PORT7_ENABLE (0), + .PORT8_ENABLE (0), + .PORT9_ENABLE (0), + .DW (32) + ) + u_ahb_slave_mux_sys_bus ( + .HCLK (HCLK), + .HRESETn (HRESETn), + .HREADY (HREADY), + .HSEL0 (apbsys_hsel), // Input Port 0 + .HREADYOUT0 (apbsys_hreadyout), + .HRESP0 (apbsys_hresp), + .HRDATA0 (apbsys_hrdata), + .HSEL1 (gpio0_hsel), // Input Port 1 + .HREADYOUT1 (gpio0_hreadyout), + .HRESP1 (gpio0_hresp), + .HRDATA1 (gpio0_hrdata), + .HSEL2 (gpio1_hsel), // Input Port 2 + .HREADYOUT2 (gpio1_hreadyout), + .HRESP2 (gpio1_hresp), + .HRDATA2 (gpio1_hrdata), + .HSEL3 (sysctrl_hsel), // Input Port 3 + .HREADYOUT3 (sysctrl_hreadyout), + .HRESP3 (sysctrl_hresp), + .HRDATA3 (sysctrl_hrdata), + .HSEL4 (sysrom_hsel), // Input Port 4 + .HREADYOUT4 (sysrom_hreadyout), + .HRESP4 (sysrom_hresp), + .HRDATA4 (sysrom_hrdata), + .HSEL5 (defslv_hsel), // Input Port 5 + .HREADYOUT5 (defslv_hreadyout), + .HRESP5 (defslv_hresp), + .HRDATA5 (defslv_hrdata), + .HSEL6 (1'b0), // Input Port 6 + .HREADYOUT6 (defslv_hreadyout), + .HRESP6 (defslv_hresp), + .HRDATA6 (defslv_hrdata), + .HSEL7 (1'b0), // Input Port 7 + .HREADYOUT7 (defslv_hreadyout), + .HRESP7 (defslv_hresp), + .HRDATA7 (defslv_hrdata), + .HSEL8 (1'b0), // Input Port 8 + .HREADYOUT8 (defslv_hreadyout), + .HRESP8 (defslv_hresp), + .HRDATA8 (defslv_hrdata), + .HSEL9 (1'b0), // Input Port 9 + .HREADYOUT9 (defslv_hreadyout), + .HRESP9 (defslv_hresp), + .HRDATA9 (defslv_hrdata), + + .HREADYOUT (HREADYOUT), // Outputs + .HRESP (HRESP), + .HRDATA (HRDATA) + ); + + // Default slave + cmsdk_ahb_default_slave u_ahb_default_slave_1 ( + .HCLK (HCLK), + .HRESETn (HRESETn), + .HSEL (defslv_hsel), + .HTRANS (HTRANS), + .HREADY (HREADY), + .HREADYOUT (defslv_hreadyout), + .HRESP (defslv_hresp) + ); + + assign defslv_hrdata = 32'h00000000; // Default slave do not have read data + + // ------------------------------- + // System ROM Table + // ------------------------------- + cmsdk_ahb_cs_rom_table + #(//.JEPID (), + //.JEPCONTINUATION (), + //.PARTNUMBER (), + //.REVISION (), + .BASE (BASEADDR_SYSROMTABLE), + // Entry 0 = Cortex-M0+ Processor + .ENTRY0BASEADDR (32'hE00FF000), + .ENTRY0PRESENT (1'b1), + // Entry 1 = CoreSight MTB-M0+ + .ENTRY1BASEADDR (32'hF0200000), + .ENTRY1PRESENT (0)) + u_system_rom_table + (//Outputs + .HRDATA (sysrom_hrdata[31:0]), + .HREADYOUT (sysrom_hreadyout), + .HRESP (sysrom_hresp), + //Inputs + .HCLK (HCLK), + .HSEL (sysrom_hsel), + .HADDR (HADDR[31:0]), + .HBURST (HBURST[2:0]), + .HMASTLOCK (HMASTLOCK), + .HPROT (HPROT[3:0]), + .HSIZE (HSIZE[2:0]), + .HTRANS (HTRANS[1:0]), + .HWDATA (HWDATA[31:0]), + .HWRITE (HWRITE), + .HREADY (HREADY), + .ECOREVNUM (4'h0)); + + // ------------------------------- + // Peripherals + // ------------------------------- + + cmsdk_mcu_sysctrl #(.BE (BE)) + u_cmsdk_mcu_sysctrl + ( + // AHB Inputs + .HCLK (HCLK), + .HRESETn (HRESETn), + .FCLK (FCLK), + .PORESETn (PORESETn), + .HSEL (sysctrl_hsel), + .HREADY (HREADY), + .HTRANS (HTRANS), + .HSIZE (HSIZE), + .HWRITE (HWRITE), + .HADDR (HADDR[11:0]), + .HWDATA (HWDATA), + // AHB Outputs + .HREADYOUT (sysctrl_hreadyout), + .HRESP (sysctrl_hresp), + .HRDATA (sysctrl_hrdata), + // Reset information + .SYSRESETREQ (SYSRESETREQ), + .WDOGRESETREQ (WDOGRESETREQ), + .LOCKUP (LOCKUP), + // Engineering-change-order revision bits + .ECOREVNUM (4'h0), + // System control signals + .REMAP (REMAP_CTRL), + .PMUENABLE (PMUENABLE), + .LOCKUPRESET (LOCKUPRESET) + ); + + // GPIO is driven from the AHB + cmsdk_ahb_gpio #( + .ALTERNATE_FUNC_MASK (16'h0000), // No pin muxing for Port #0 + .ALTERNATE_FUNC_DEFAULT (16'h0000), // All pins default to GPIO + .BE (BE) + ) + u_ahb_gpio_0 ( + // AHB Inputs + .HCLK (HCLK), + .HRESETn (HRESETn), + .FCLK (FCLK), + .HSEL (gpio0_hsel), + .HREADY (HREADY), + .HTRANS (HTRANS), + .HSIZE (HSIZE), + .HWRITE (HWRITE), + .HADDR (HADDR[11:0]), + .HWDATA (HWDATA), + // AHB Outputs + .HREADYOUT (gpio0_hreadyout), + .HRESP (gpio0_hresp), + .HRDATA (gpio0_hrdata), + + .ECOREVNUM (4'h0),// Engineering-change-order revision bits + + .PORTIN (p0_in), // GPIO Interface inputs + .PORTOUT (p0_out), // GPIO Interface outputs + .PORTEN (p0_outen), + .PORTFUNC (p0_altfunc), // Alternate function control + + .GPIOINT (SYS_GPIO0_IRQ[15:0]), // Interrupt outputs + .COMBINT ( ) + ); + + + cmsdk_ahb_gpio #( + .ALTERNATE_FUNC_MASK (16'h002A), // pin muxing for Port #1 + .ALTERNATE_FUNC_DEFAULT (16'h0000), // All pins default to GPIO + .BE (BE) + ) + u_ahb_gpio_1 ( + // AHB Inputs + .HCLK (HCLK), + .HRESETn (HRESETn), + .FCLK (FCLK), + .HSEL (gpio1_hsel), + .HREADY (HREADY), + .HTRANS (HTRANS), + .HSIZE (HSIZE), + .HWRITE (HWRITE), + .HADDR (HADDR[11:0]), + .HWDATA (HWDATA), + // AHB Outputs + .HREADYOUT (gpio1_hreadyout), + .HRESP (gpio1_hresp), + .HRDATA (gpio1_hrdata), + + .ECOREVNUM (4'h0),// Engineering-change-order revision bits + + .PORTIN (p1_in), // GPIO Interface inputs + .PORTOUT (p1_out), // GPIO Interface outputs + .PORTEN (p1_outen), + .PORTFUNC (p1_altfunc), // Alternate function control + + .GPIOINT (SYS_GPIO1_IRQ[15:0]), // Interrupt outputs + .COMBINT ( ) + ); + + // APB subsystem for timers, UARTs + cmsdk_apb_subsystem #( + .APB_EXT_PORT12_ENABLE (1), + .APB_EXT_PORT13_ENABLE (1), + .APB_EXT_PORT14_ENABLE (1), + .APB_EXT_PORT15_ENABLE (1), + .INCLUDE_IRQ_SYNCHRONIZER(0), + .INCLUDE_APB_TEST_SLAVE (1), + .INCLUDE_APB_TIMER0 (1), // Include simple timer #0 + .INCLUDE_APB_TIMER1 (1), // Include simple timer #1 + .INCLUDE_APB_DUALTIMER0 (1), // Include dual timer module + .INCLUDE_APB_UART0 (1), // Include simple UART #0 + .INCLUDE_APB_UART1 (1), // Include simple UART #1 + .INCLUDE_APB_UART2 (1), // Include simple UART #2. + .INCLUDE_APB_WATCHDOG (1), // Include APB watchdog module + .BE (BE) + ) + u_apb_subsystem( + + // AHB interface for AHB to APB bridge + .HCLK (HCLK), + .HRESETn (HRESETn), + + .HSEL (apbsys_hsel), + .HADDR (HADDR[15:0]), + .HTRANS (HTRANS[1:0]), + .HWRITE (HWRITE), + .HSIZE (HSIZE), + .HPROT (HPROT), + .HREADY (HREADY), + .HWDATA (HWDATA[31:0]), + + .HREADYOUT (apbsys_hreadyout), + .HRDATA (apbsys_hrdata), + .HRESP (apbsys_hresp), + + // APB clock and reset + .PCLK (PCLK), + .PCLKG (PCLKG), + .PCLKEN (PCLKEN), + .PRESETn (PRESETn), + + // APB extension ports + .PADDR (exp_paddr[11:0]), + .PWRITE (exp_pwrite), + .PWDATA (exp_pwdata[31:0]), + .PENABLE (exp_penable), + + .ext12_psel (exp12_psel), + .ext13_psel (exp13_psel), + .ext14_psel (exp14_psel), + .ext15_psel (exp15_psel), + + // Input from APB devices on APB expansion ports + .ext12_prdata (exp12_prdata), + .ext12_pready (exp12_pready), + .ext12_pslverr (exp12_pslverr), + .ext13_prdata (exp13_prdata), + .ext13_pready (exp13_pready), + .ext13_pslverr (exp13_pslverr), + .ext14_prdata (exp14_prdata), + .ext14_pready (exp14_pready), + .ext14_pslverr (exp14_pslverr), + .ext15_prdata (exp15_prdata), + .ext15_pready (exp15_pready), + .ext15_pslverr (exp15_pslverr), + + .APBACTIVE (APBACTIVE), // Status Output for clock gating + + // Peripherals + // UART + .uart0_rxd (uart0_rxd), + .uart0_txd (uart0_txd), + .uart0_txen (uart0_txen), + + .uart1_rxd (uart1_rxd), + .uart1_txd (uart1_txd), + .uart1_txen (uart1_txen), + + .uart2_rxd (uart2_rxd), + .uart2_txd (uart2_txd), + .uart2_txen (uart2_txen), + + // Timer + .timer0_extin (timer0_extin), + .timer1_extin (timer1_extin), + + // Interrupt outputs + .apbsubsys_interrupt (SYS_APB_IRQ), + .watchdog_interrupt (SYS_NMI), + // reset output + .watchdog_reset (WDOGRESETREQ) + ); + +endmodule diff --git a/Cortex-M0/nanosoc/systems/mcu/verilog/pl230_defs.v b/Cortex-M0/nanosoc/systems/mcu/verilog/pl230_defs.v new file mode 100644 index 0000000..c061b99 --- /dev/null +++ b/Cortex-M0/nanosoc/systems/mcu/verilog/pl230_defs.v @@ -0,0 +1,189 @@ +//----------------------------------------------------------------------------- +// customised example Cortex-M0 controller DMA230 configuration +// A joint work commissioned on behalf of SoC Labs, under Arm Academic Access license. +// +// Contributors +// +// David Flynn (d.w.flynn@soton.ac.uk) +// +// Copyright � 2021, SoC Labs (www.soclabs.org) +//----------------------------------------------------------------------------- + +//----------------------------------------------------------------------------- +// The confidential and proprietary information contained in this file may +// only be used by a person authorised under and to the extent permitted +// by a subsisting licensing agreement from ARM Limited. +// +// (C) COPYRIGHT 2006-2007 ARM Limited. +// ALL RIGHTS RESERVED +// +// This entire notice must be reproduced on all copies of this file +// and copies of this file may only be made by a person if such person is +// permitted to do so under the terms of a subsisting license agreement +// from ARM Limited. +// +// File Name : pl230_defs.v +// Checked In : $Date: 2007-06-06 21:55:22 +0530 (Wed, 06 Jun 2007) $ +// Revision : $Revision: 13823 $ +// State : $state: PL230-DE-98007-r0p0-02rel0 $ +// +//----------------------------------------------------------------------------- +// Purpose : Peripheral specific macro definitions +// +//----------------------------------------------------------------------------- + + +`ifdef ARM_TIMESCALE_DEFINED + `timescale 1ns/1ps +`endif + +// Set the number of channels implemented +`define PL230_CHNLS 1 +`define PL230_CHNL_BITS 1 +//`define PL230_ONE_CHNL + +// Include Integration Test Logic +`define PL230_INCLUDE_TEST + + +// AHB Interface +`define PL230_AHB_TRANS_IDLE 2'b00 +`define PL230_AHB_TRANS_NONSEQ 2'b10 +`define PL230_AHB_READ 1'b0 +`define PL230_AHB_WRITE 1'b1 +`define PL230_AHB_SIZE_BYTE 3'b000 +`define PL230_AHB_SIZE_HWORD 3'b001 +`define PL230_AHB_SIZE_WORD 3'b010 + +// PrimeCell Configuration +`define PL230_PERIPH_ID_0 8'h30 +`define PL230_PERIPH_ID_1 8'hB2 +`define PL230_PERIPH_ID_2 8'h0B +`define PL230_PERIPH_ID_3 8'h00 +`define PL230_PERIPH_ID_4 8'h04 +`define PL230_PCELL_ID_0 8'h0D +`define PL230_PCELL_ID_1 8'hF0 +`define PL230_PCELL_ID_2 8'h05 +`define PL230_PCELL_ID_3 8'hB1 + +// Memory Mapped Registers +// Controller Configuration Registers +`define PL230_ADDR_DMA_STATUS 12'h000 +`define PL230_ADDR_DMA_CFG 12'h004 +`define PL230_ADDR_CTRL_BASE_PTR 12'h008 +`define PL230_ADDR_ALT_CTRL_BASE_PTR 12'h00C +`define PL230_ADDR_DMA_WAITONREQ_STATUS 12'h010 +`define PL230_ADDR_CHNL_SW_REQUEST 12'h014 +`define PL230_ADDR_CHNL_USEBURST_SET 12'h018 +`define PL230_ADDR_CHNL_USEBURST_CLR 12'h01C +`define PL230_ADDR_CHNL_REQ_MASK_SET 12'h020 +`define PL230_ADDR_CHNL_REQ_MASK_CLR 12'h024 +`define PL230_ADDR_CHNL_ENABLE_SET 12'h028 +`define PL230_ADDR_CHNL_ENABLE_CLR 12'h02C +`define PL230_ADDR_CHNL_PRI_ALT_SET 12'h030 +`define PL230_ADDR_CHNL_PRI_ALT_CLR 12'h034 +`define PL230_ADDR_CHNL_PRIORITY_SET 12'h038 +`define PL230_ADDR_CHNL_PRIORITY_CLR 12'h03C +// Reserved 12'h040 +// Reserved 12'h044 +// Reserved 12'h048 +`define PL230_ADDR_ERR_CLR 12'h04C +// Integration Test Registers +`define PL230_ADDR_INTEGRATION_CFG 12'hE00 +// Reserved 12'hE04 +`define PL230_ADDR_STALL_STATUS 12'hE08 +// Reserved 12'hE0C +`define PL230_ADDR_DMA_REQ_STATUS 12'hE10 +// Reserved 12'hE14 +`define PL230_ADDR_DMA_SREQ_STATUS 12'hE18 +// Reserved 12'hE1C +`define PL230_ADDR_DMA_DONE_SET 12'hE20 +`define PL230_ADDR_DMA_DONE_CLR 12'hE24 +`define PL230_ADDR_DMA_ACTIVE_SET 12'hE28 +`define PL230_ADDR_DMA_ACTIVE_CLR 12'hE2C +// Reserved 12'hE30 +// Reserved 12'hE34 +// Reserved 12'hE38 +// Reserved 12'hE3C +// Reserved 12'hE40 +// Reserved 12'hE44 +`define PL230_ADDR_ERR_SET 12'hE48 +// Reserved 12'hE4C +// PrimeCell Configuration Registers +`define PL230_ADDR_PERIPH_ID_4 12'hFD0 +// Reserved 12'hFD4 +// Reserved 12'hFD8 +// Reserved 12'hFDC +`define PL230_ADDR_PERIPH_ID_0 12'hFE0 +`define PL230_ADDR_PERIPH_ID_1 12'hFE4 +`define PL230_ADDR_PERIPH_ID_2 12'hFE8 +`define PL230_ADDR_PERIPH_ID_3 12'hFEC +`define PL230_ADDR_PCELL_ID_0 12'hFF0 +`define PL230_ADDR_PCELL_ID_1 12'hFF4 +`define PL230_ADDR_PCELL_ID_2 12'hFF8 +`define PL230_ADDR_PCELL_ID_3 12'hFFC + + +// Bit vector definitions for channel_cfg +`define PL230_CHANNEL_CFG_BITS 20 +// Destination address increment +`define PL230_CHANNEL_CFG_DST_INC channel_cfg[19:18] +`define PL230_HRDATA_DST_INC hrdata[31:30] +// Destination transfer size +// Source and destination sizes must match +// so the same bits as the src_size are used +`define PL230_CHANNEL_CFG_DST_SIZE channel_cfg[15:14] +`define PL230_HRDATA_DST_SIZE hrdata[29:28] +// Source address increment +`define PL230_CHANNEL_CFG_SRC_INC channel_cfg[17:16] +`define PL230_HRDATA_SRC_INC hrdata[27:26] +// Source transfer size +`define PL230_CHANNEL_CFG_SRC_SIZE channel_cfg[15:14] +`define PL230_HRDATA_SRC_SIZE hrdata[25:24] +// Destination AHB protection control +`define PL230_CHANNEL_CFG_DST_PROT_CTRL channel_cfg[13:11] +`define PL230_HRDATA_DST_PROT_CTRL hrdata[23:21] +// Source AHB protection control +`define PL230_CHANNEL_CFG_SRC_PROT_CTRL channel_cfg[10:8] +`define PL230_HRDATA_SRC_PROT_CTRL hrdata[20:18] +// Power of two transactions per request +`define PL230_CHANNEL_CFG_R channel_cfg[7:4] +`define PL230_HRDATA_R hrdata[17:14] +// Number of bits in the N counter - hrdata[13:4] +`define PL230_N_COUNT_BITS 10 +// Lsb bit offset for n_minus_1 +`define PL230_N_COUNT_OFFSET 4 +// Set chnl_useburst_status +`define PL230_CHANNEL_CFG_NEXT_USEBURST channel_cfg[3] +`define PL230_HRDATA_NEXT_USEBURST hrdata[3] +// DMA cycle control +`define PL230_CHANNEL_CFG_CYCLE_CTRL channel_cfg[2:0] +`define PL230_HRDATA_CYCLE_CTRL hrdata[2:0] + + +// Number of bits for the statemachine +`define PL230_STATE_BITS 4 +// Statemachine state encoding +`define PL230_ST_IDLE 4'h0 +`define PL230_ST_RD_CTRL 4'h1 +`define PL230_ST_RD_SPTR 4'h2 +`define PL230_ST_RD_DPTR 4'h3 +`define PL230_ST_RD_SDAT 4'h4 +`define PL230_ST_WR_DDAT 4'h5 +`define PL230_ST_WAIT 4'h6 +`define PL230_ST_WR_CTRL 4'h7 +`define PL230_ST_STALL 4'h8 +`define PL230_ST_DONE 4'h9 +`define PL230_ST_PSGP 4'hA +`define PL230_ST_RESVD_0 4'hB +`define PL230_ST_RESVD_1 4'hC +`define PL230_ST_RESVD_2 4'hD +`define PL230_ST_RESVD_3 4'hE +`define PL230_ST_RESVD_4 4'hF + +`define PL230_SIZE_BYTE 2'b00 +`define PL230_SIZE_HWORD 2'b01 +`define PL230_SIZE_WORD 2'b10 +`define PL230_SIZE_RESVD 2'b11 + +// pl230_defs.v end diff --git a/Cortex-M0/nanosoc/systems/mcu/verilog/tb_nanosoc.v b/Cortex-M0/nanosoc/systems/mcu/verilog/tb_nanosoc.v new file mode 100644 index 0000000..19fedd8 --- /dev/null +++ b/Cortex-M0/nanosoc/systems/mcu/verilog/tb_nanosoc.v @@ -0,0 +1,571 @@ +//----------------------------------------------------------------------------- +// customised example Cortex-M0 controller testbench with CPU trace for RTL or netlist +// A joint work commissioned on behalf of SoC Labs, under Arm Academic Access license. +// +// Contributors +// +// David Flynn (d.w.flynn@soton.ac.uk) +// +// Copyright � 2021-3, SoC Labs (www.soclabs.org) +//----------------------------------------------------------------------------- + +//----------------------------------------------------------------------------- +// The confidential and proprietary information contained in this file may +// only be used by a person authorised under and to the extent permitted +// by a subsisting licensing agreement from Arm Limited or its affiliates. +// +// (C) COPYRIGHT 2010-2013 Arm Limited or its affiliates. +// ALL RIGHTS RESERVED +// +// This entire notice must be reproduced on all copies of this file +// and copies of this file may only be made by a person if such person is +// permitted to do so under the terms of a subsisting license agreement +// from Arm Limited or its affiliates. +// +// SVN Information +// +// Checked In : $Date: 2017-10-10 15:55:38 +0100 (Tue, 10 Oct 2017) $ +// +// Revision : $Revision: 371321 $ +// +// Release Information : Cortex-M System Design Kit-r1p1-00rel0 +// +//----------------------------------------------------------------------------- +//----------------------------------------------------------------------------- +// Abstract : Testbench for the Cortex-M0 example system +//----------------------------------------------------------------------------- +// +`timescale 1ns/1ps + +module tb_cmsdk_mcu; + + wire XTAL1; // crystal pin 1 + wire XTAL2; // crystal pin 2 + wire NRST; // active low reset + + wire [15:0] P0; // Port 0 + wire [15:0] P1; // Port 1 + + wire VDDIO; + wire VSSIO; + wire VDD; + wire VSS; + + //Debug tester signals + wire nTRST; + wire TDI; + wire SWDIOTMS; + wire SWCLKTCK; + wire TDO; + + wire PCLK; // Clock for UART capture device + wire [5:0] debug_command; // used to drive debug tester + wire debug_running; // indicate debug test is running + wire debug_err; // indicate debug test has error + + wire debug_test_en1; + wire debug_test_en2; + wire debug_test_en; // To enable the debug tester connection to MCU GPIO P0 + // This signal is controlled by software, + // Use "UartPutc((char) 0x1B)" to send ESCAPE code to start + // the command, use "UartPutc((char) 0x11)" to send debug test + // enable command, use "UartPutc((char) 0x12)" to send debug test + // disable command. Refer to tb_uart_capture.v file for detail + assign debug_test_en = debug_test_en1 | debug_test_en2; // FT1248 or UART2 control + + //----------------------------------------- + // System options + +`define MEM_INIT 1; +localparam BE=0; +`define ARM_CMSDK_INCLUDE_DEBUG_TESTER 1 + +SROM_Ax32 + #(.ADDRWIDTH (8), + .filename ("bootloader.hex"), + .romgen (1) + ) + u_BOOTROM ( + .CLK(XTAL1), + .ADDR(8'h0), + .SEL(1'b0), + .RDATA( ) + ); + + // -------------------------------------------------------------------------------- + // Cortex-M0/Cortex-M0+ Microcontroller + // -------------------------------------------------------------------------------- + + nanosoc_chip_pads + u_nanosoc_chip_pads ( +`ifdef POWER_PINS + .VDDIO (VDDIO), + .VSSIO (VSSIO), + .VDD (VDD), + .VSS (VSS), +`endif + .XTAL1 (XTAL1), // input + .XTAL2 (XTAL2), // output + .NRST (NRST), // active low reset + .P0 (P0), + .P1 (P1), +`ifdef ARM_CMSDK_INCLUDE_JTAG + .nTRST (nTRST), // Not needed if serial-wire debug is used + .TDI (TDI), // Not needed if serial-wire debug is used + .TDO (TDO), // Not needed if serial-wire debug is used +`endif + .SWDIOTMS (SWDIOTMS), + .SWCLKTCK (SWCLKTCK) + ); + + // -------------------------------------------------------------------------------- + // Source for clock and reset + // -------------------------------------------------------------------------------- + cmsdk_clkreset u_cmsdk_clkreset( + .CLK (XTAL1), + .NRST (NRST) + ); + + // Pullup to suppress X-inputs + pullup(P0[ 0]); + pullup(P0[ 1]); + pullup(P0[ 2]); + pullup(P0[ 3]); + pullup(P0[ 4]); + pullup(P0[ 5]); + pullup(P0[ 6]); + pullup(P0[ 7]); + pullup(P0[ 8]); + pullup(P0[ 9]); + pullup(P0[10]); + pullup(P0[11]); + pullup(P0[12]); + pullup(P0[13]); + pullup(P0[14]); + pullup(P0[15]); + + pullup(P1[ 0]); + pullup(P1[ 1]); + pullup(P1[ 2]); + pullup(P1[ 3]); + pullup(P1[ 4]); + pullup(P1[ 5]); + pullup(P1[ 6]); + pullup(P1[ 7]); + pullup(P1[ 8]); + pullup(P1[ 9]); + pullup(P1[10]); + pullup(P1[11]); + pullup(P1[12]); + pullup(P1[13]); + pullup(P1[14]); + pullup(P1[15]); + + // -------------------------------------------------------------------------------- + // UART output capture + // -------------------------------------------------------------------------------- +`ifdef ARM_CMSDK_SLOWSPEED_PCLK + // If PCLK is running at slower speed, the UART output will also be slower + assign PCLK = u_cmsdk_mcu.u_cmsdk_mcu.PCLK; +`else + assign PCLK = XTAL1; +`endif + + // -------------------------------------------------------------------------------- + // external UART phase lock to (known) baud rate + +// seem unable to use the following (due to generate instance naming?) +// wire baudx16_clk = u_cmsdk_mcu.u_cmsdk_mcu.u_cmsdk_mcu_system.u_apb_subsystem.u_apb_uart_2.BAUDTICK; + +// 2000000/208 = 9615 baud (+0.16%) +// 208 / 16 +`define BAUDPROG 130 + + reg [7:0] bauddiv; + wire baudclken = (bauddiv == 8'b00000000); + + always @(negedge NRST or posedge PCLK) + if (!NRST) + bauddiv <=0; + else + bauddiv <= (baudclken) ? (`BAUDPROG-1) : (bauddiv -1) ; // count down of BAUDPROG + + wire baudx16_clk = bauddiv[7]; //prefer:// !baudclken; + + wire UARTXD = P1[5]; + reg UARTXD_del; + always @(negedge NRST or posedge baudx16_clk) + if (!NRST) + UARTXD_del <= 1'b0; + else + UARTXD_del <= UARTXD; // delay one BAUD_TICK-time + + wire UARTXD_edge = UARTXD_del ^ UARTXD; // edge detect + + reg [3:0] pllq; + always @(negedge NRST or posedge baudx16_clk) + if (!NRST) + pllq[3:0] <= 4'b0000; // phase lock ready for Q[3] to go high + else + if (UARTXD_edge) + pllq[3:0] <= 4'b0110; // sync to mid bit-time + else + pllq[3:0] <= pllq[3:0] - 1; // count down divide-by-16 + + wire baud_clk = pllq[3]; + +reg baud_clk_del; + always @(negedge NRST or posedge PCLK) + if (!NRST) + baud_clk_del <= 1'b1; + else + baud_clk_del <= baud_clk; + + // -------------------------------------------------------------------------------- + // set FASTMODE true if UART simulation mode is programmed + wire FASTMODE = 1'b0; + wire uart_clk = (FASTMODE) ? PCLK : baud_clk; //(baud_clk & !baud_clk_del); + + + cmsdk_uart_capture #(.LOGFILENAME("uart2.log")) + u_cmsdk_uart_capture( + .RESETn (NRST), + .CLK (uart_clk), //PCLK), + .RXD (UARTXD), // UART 2 use for StdOut + .DEBUG_TESTER_ENABLE (debug_test_en2), + .SIMULATIONEND (), // This signal set to 1 at the end of simulation. + .AUXCTRL () + ); + + // -------------------------------------------------------------------------------- + // FTDI IO capture + // -------------------------------------------------------------------------------- + + // UART connection cross over for UART test +// assign P1[0] = P1[3]; // UART 0 RXD = UART 1 TXD +// assign P1[2] = P1[1]; // UART 1 RXD = UART 0 TXD + +wire ft_clk_out = P1[1]; +wire ft_miso_in; +assign P1[0] = ft_miso_in; +wire ft_ssn_out = P1[3]; + +// bufif0 (P1[2], ft_miosio_i, ft_miosio_z); +wire ft_clk2uart; +wire ft_rxd2uart; +wire ft_txd2uart; + + cmsdk_ft1248x1_adpio // #(.ADPFILENAME("ADPFILENAME.log")) + u_ft1248_adpio( + .ft_clk_i (ft_clk_out), + .ft_ssn_i (ft_ssn_out), + .ft_miso_o (ft_miso_in), + .ft_miosio_io (P1[2]), + + .FTDI_CLK2UART_o (ft_clk2uart), + .FTDI_OP2UART_o (ft_rxd2uart), + .FTDI_IP2UART_o (ft_txd2uart) + ); + + cmsdk_uart_capture #(.LOGFILENAME("ft1248_op.log")) + u_cmsdk_uart_capture1( + .RESETn (NRST), + .CLK (ft_clk2uart), + .RXD (ft_rxd2uart), + .DEBUG_TESTER_ENABLE (debug_test_en1), + .SIMULATIONEND (), // This signal set to 1 at the end of simulation. + .AUXCTRL () + ); + + cmsdk_uart_capture #(.LOGFILENAME("ft1248_ip.log")) + u_cmsdk_uart_capture2( + .RESETn (NRST), + .CLK (ft_clk2uart), + .RXD (ft_txd2uart), + .DEBUG_TESTER_ENABLE ( ), + .SIMULATIONEND (), // This signal set to 1 at the end of simulation. + .AUXCTRL () + ); + + + + // -------------------------------------------------------------------------------- + // Tracking CPU with Tarmac trace support + // -------------------------------------------------------------------------------- + + +`ifdef CORTEX_M0 +`ifdef USE_TARMAC + +`define ARM_CM0IK_PATH u_nanosoc_chip_pads.u_nanosoc_chip.u_nanosoc_cpu.u_cortex_m0_integration.u_cortexm0 + + CORTEXM0 + #(.ACG(1), .AHBSLV(0), .BE(0), .BKPT(4), + .DBG(1), .NUMIRQ(32), .RAR(1), .SMUL(0), + .SYST(1), .WIC(1), .WICLINES(34), .WPT(2)) + u_cortexm0_track + ( + // Outputs + .HADDR ( ), + .HBURST ( ), + .HMASTLOCK ( ), + .HPROT ( ), + .HSIZE ( ), + .HTRANS ( ), + .HWDATA ( ), + .HWRITE ( ), + .HMASTER ( ), + .SLVRDATA ( ), + .SLVREADY ( ), + .SLVRESP ( ), + .DBGRESTARTED ( ), + .HALTED ( ), + .TXEV ( ), + .LOCKUP ( ), + .SYSRESETREQ ( ), + .CODENSEQ ( ), + .CODEHINTDE ( ), + .SPECHTRANS ( ), + .SLEEPING ( ), + .SLEEPDEEP ( ), + .SLEEPHOLDACKn ( ), + .WICDSACKn ( ), + .WICMASKISR ( ), + .WICMASKNMI ( ), + .WICMASKRXEV ( ), + .WICLOAD ( ), + .WICCLEAR ( ), + // Inputs + .SCLK (`ARM_CM0IK_PATH.SCLK), + .HCLK (`ARM_CM0IK_PATH.HCLK), + .DCLK (`ARM_CM0IK_PATH.DCLK), + .DBGRESETn (`ARM_CM0IK_PATH.DBGRESETn), + .HRESETn (`ARM_CM0IK_PATH.HRESETn), + .HRDATA (`ARM_CM0IK_PATH.HRDATA[31:0]), + .HREADY (`ARM_CM0IK_PATH.HREADY), + .HRESP (`ARM_CM0IK_PATH.HRESP), + .SLVADDR (`ARM_CM0IK_PATH.SLVADDR[31:0]), + .SLVSIZE (`ARM_CM0IK_PATH.SLVSIZE[1:0]), + .SLVTRANS (`ARM_CM0IK_PATH.SLVTRANS[1:0]), + .SLVWDATA (`ARM_CM0IK_PATH.SLVWDATA[31:0]), + .SLVWRITE (`ARM_CM0IK_PATH.SLVWRITE), + .DBGRESTART (`ARM_CM0IK_PATH.DBGRESTART), + .EDBGRQ (`ARM_CM0IK_PATH.EDBGRQ), + .NMI (`ARM_CM0IK_PATH.NMI), + .IRQ (`ARM_CM0IK_PATH.IRQ[31:0]), + .RXEV (`ARM_CM0IK_PATH.RXEV), + .STCALIB (`ARM_CM0IK_PATH.STCALIB[25:0]), + .STCLKEN (`ARM_CM0IK_PATH.STCLKEN), + .IRQLATENCY (`ARM_CM0IK_PATH.IRQLATENCY[7:0]), + .ECOREVNUM (`ARM_CM0IK_PATH.ECOREVNUM[19:0]), + .SLEEPHOLDREQn (`ARM_CM0IK_PATH.SLEEPHOLDREQn), + .WICDSREQn (`ARM_CM0IK_PATH.WICDSREQn), + .SE (`ARM_CM0IK_PATH.SE)); + +`define ARM_CM0IK_TRACK u_cortexm0_track + cm0_tarmac #(.LOGFILENAME("tarmac0.log")) + u_tarmac_track + (.enable_i (1'b1), + + .hclk_i (`ARM_CM0IK_TRACK.HCLK), + .hready_i (`ARM_CM0IK_TRACK.HREADY), + .haddr_i (`ARM_CM0IK_TRACK.HADDR[31:0]), + .hprot_i (`ARM_CM0IK_TRACK.HPROT[3:0]), + .hsize_i (`ARM_CM0IK_TRACK.HSIZE[2:0]), + .hwrite_i (`ARM_CM0IK_TRACK.HWRITE), + .htrans_i (`ARM_CM0IK_TRACK.HTRANS[1:0]), + .hresetn_i (`ARM_CM0IK_TRACK.HRESETn), + .hresp_i (`ARM_CM0IK_TRACK.HRESP), + .hrdata_i (`ARM_CM0IK_TRACK.HRDATA[31:0]), + .hwdata_i (`ARM_CM0IK_TRACK.HWDATA[31:0]), + .lockup_i (`ARM_CM0IK_TRACK.LOCKUP), + .halted_i (`ARM_CM0IK_TRACK.HALTED), + .codehintde_i (`ARM_CM0IK_TRACK.CODEHINTDE[2:0]), + .codenseq_i (`ARM_CM0IK_TRACK.CODENSEQ), + + .hdf_req_i (`ARM_CM0IK_TRACK.u_top.u_sys.ctl_hdf_request), + .int_taken_i (`ARM_CM0IK_TRACK.u_top.u_sys.dec_int_taken_o), + .int_return_i (`ARM_CM0IK_TRACK.u_top.u_sys.dec_int_return_o), + .int_pend_i (`ARM_CM0IK_TRACK.u_top.u_sys.nvm_int_pend), + .pend_num_i (`ARM_CM0IK_TRACK.u_top.u_sys.nvm_int_pend_num[5:0]), + .ipsr_i (`ARM_CM0IK_TRACK.u_top.u_sys.psr_ipsr[5:0]), + + .ex_last_i (`ARM_CM0IK_TRACK.u_top.u_sys.u_core.ctl_ex_last), + .iaex_en_i (`ARM_CM0IK_TRACK.u_top.u_sys.u_core.ctl_iaex_en), + .reg_waddr_i (`ARM_CM0IK_TRACK.u_top.u_sys.u_core.ctl_wr_addr[3:0]), + .reg_write_i (`ARM_CM0IK_TRACK.u_top.u_sys.u_core.ctl_wr_en), + .xpsr_en_i (`ARM_CM0IK_TRACK.u_top.u_sys.u_core.ctl_xpsr_en), + .fe_addr_i (`ARM_CM0IK_TRACK.u_top.u_sys.u_core.pfu_fe_addr[30:0]), + .int_delay_i (`ARM_CM0IK_TRACK.u_top.u_sys.u_core.pfu_int_delay), + .special_i (`ARM_CM0IK_TRACK.u_top.u_sys.u_core.pfu_op_special), + .opcode_i (`ARM_CM0IK_TRACK.u_top.u_sys.u_core.pfu_opcode[15:0]), + .reg_wdata_i (`ARM_CM0IK_TRACK.u_top.u_sys.u_core.psr_gpr_wdata[31:0]), + + .atomic_i (`ARM_CM0IK_TRACK.u_top.u_sys.u_core.u_ctl.atomic), + .atomic_nxt_i (`ARM_CM0IK_TRACK.u_top.u_sys.u_core.u_ctl.atomic_nxt), + .dabort_i (`ARM_CM0IK_TRACK.u_top.u_sys.u_core.u_ctl.data_abort), + .ex_last_nxt_i (`ARM_CM0IK_TRACK.u_top.u_sys.u_core.u_ctl.ex_last_nxt), + .int_preempt_i (`ARM_CM0IK_TRACK.u_top.u_sys.u_core.u_ctl.int_preempt), + + .psp_sel_i (`ARM_CM0IK_TRACK.u_top.u_sys.u_core.u_gpr.psp_sel), + .xpsr_i (`ARM_CM0IK_TRACK.u_top.u_sys.u_core.u_gpr.xpsr[31:0]), + + .iaex_i (`ARM_CM0IK_TRACK.u_top.u_sys.u_core.u_pfu.iaex[30:0]), + .iaex_nxt_i (`ARM_CM0IK_TRACK.u_top.u_sys.u_core.u_pfu.iaex_nxt[30:0]), + .opcode_nxt_i (`ARM_CM0IK_TRACK.u_top.u_sys.u_core.u_pfu.ibuf_de_nxt[15:0]), + .delay_count_i (`ARM_CM0IK_TRACK.u_top.u_sys.u_core.u_pfu.ibuf_lo[13:6]), + .tbit_en_i (`ARM_CM0IK_TRACK.u_top.u_sys.u_core.u_pfu.tbit_en), + + .cflag_en_i (`ARM_CM0IK_TRACK.u_top.u_sys.u_core.u_psr.cflag_ena), + .ipsr_en_i (`ARM_CM0IK_TRACK.u_top.u_sys.u_core.u_psr.ipsr_ena), + .nzflag_en_i (`ARM_CM0IK_TRACK.u_top.u_sys.u_core.u_psr.nzflag_ena), + .vflag_en_i (`ARM_CM0IK_TRACK.u_top.u_sys.u_core.u_psr.vflag_ena) + ); + +`endif // USE_TARMAC +`endif // CORTEX_M0 + + // -------------------------------------------------------------------------------- + // Debug tester connection - + // -------------------------------------------------------------------------------- + + `ifdef CORTEX_M0DESIGNSTART + // No debug connection for Cortex-M0 DesignStart + assign nTRST = NRST; + assign TDI = 1'b1; + assign SWDIOTMS = 1'b1; + assign SWCLKTCK = 1'b1; + + bufif1 (P0[31-16], debug_running, debug_test_en); + bufif1 (P0[30-16], debug_err, debug_test_en); + + pullup (debug_running); + pullup (debug_err); + + `else + `ifdef ARM_CMSDK_INCLUDE_DEBUG_TESTER + + // Add pullups and pulldowns on Debug Interface + + pullup (nTRST); + pullup (TDI); + pullup (TDO); + pullup (SWDIOTMS); + pulldown (SWCLKTCK); + + + //connect to P0 for debug command and status pin + //add pulldown to debug command and debug status signals + // to give default value 0; + pulldown(debug_command[5]); + pulldown(debug_command[4]); + pulldown(debug_command[3]); + pulldown(debug_command[2]); + pulldown(debug_command[1]); + pulldown(debug_command[0]); + + pulldown(debug_running); + pulldown(debug_err); + + //Tristate logic for GPIO connection + bufif1 (debug_command[5], P0[29-16], debug_test_en); + bufif1 (debug_command[4], P0[28-16], debug_test_en); + bufif1 (debug_command[3], P0[27-16], debug_test_en); + bufif1 (debug_command[2], P0[26-16], debug_test_en); + bufif1 (debug_command[1], P0[25-16], debug_test_en); + bufif1 (debug_command[0], P0[24-16], debug_test_en); + + bufif1 (P0[31-16], debug_running, debug_test_en); + bufif1 (P0[30-16], debug_err, debug_test_en); + + + cmsdk_debug_tester #(.ROM_MEMFILE((BE==1) ? "debugtester_be.hex" : "debugtester_le.hex")) + u_cmsdk_debug_tester + ( + // Clock and Reset + .CLK (XTAL1), + .PORESETn (NRST), + + // Command Interface + .DBGCMD (debug_command[5:0]), + .DBGRUNNING (debug_running), + .DBGERROR (debug_err), + + // Trace Interface + .TRACECLK (1'b0), + .TRACEDATA (4'h0), + .SWV (1'b0), + + // Debug Interface + .TDO (TDO), + .nTRST (nTRST), + .SWCLKTCK (SWCLKTCK), + .TDI (TDI), + .SWDIOTMS (SWDIOTMS) + ); + + + `else + assign nTRST = NRST; + assign TDI = 1'b1; + assign SWDIOTMS = 1'b1; + assign SWCLKTCK = 1'b1; + + bufif1 (P0[31-16], debug_running, debug_test_en); + bufif1 (P0[30-16], debug_err, debug_test_en); + + pullup(debug_running); + pullup(debug_err); + + `endif + `endif + + // -------------------------------------------------------------------------------- + // Misc + // -------------------------------------------------------------------------------- + + // Format for time reporting + initial $timeformat(-9, 0, " ns", 0); + + // Configuration checks + initial begin +`ifdef CORTEX_M0DESIGNSTART +`ifdef CORTEX_M0 + $display("ERROR (tb_cmsdk_mcu.v) in CPU preprocessing directive : Both CORTEX_M0DESIGNSTART and CORTEX_M0 are set. Please use only one."); + $stop; +`endif +`endif +`ifdef CORTEX_M0DESIGNSTART +`ifdef CORTEX_M0PLUS + $display("ERROR (tb_cmsdk_mcu.v) in CPU preprocessing directive : Both CORTEX_M0DESIGNSTART and CORTEX_M0PLUS are set. Please use only one."); + $stop; +`endif +`endif +`ifdef CORTEX_M0 +`ifdef CORTEX_M0PLUS + $display("ERROR (tb_cmsdk_mcu.v) in CPU preprocessing directive : Both CORTEX_M0 and CORTEX_M0PLUS are set. Please use only one."); + $stop; +`endif +`endif +`ifdef CORTEX_M0DESIGNSTART +`ifdef CORTEX_M0 +`ifdef CORTEX_M0PLUS + $display("ERROR (tb_cmsdk_mcu.v) in CPU preprocessing directive : All of CORTEX_M0DESIGNSTART, CORTEX_M0 and CORTEX_M0PLUS are set. Please use only one."); + $stop; +`endif +`endif +`endif +`ifdef CORTEX_M0 +`else +`ifdef CORTEX_M0PLUS +`else +`ifdef CORTEX_M0DESIGNSTART +`else + $display("ERROR (tb_cmsdk_mcu.v) in CPU preprocessing directive : None of CORTEX_M0DESIGNSTART, CORTEX_M0 and CORTEX_M0PLUS are set. Please select one."); + $stop; +`endif +`endif +`endif + + end +endmodule diff --git a/Cortex-M0/nanosoc/systems/mcu/verilog/tbench_M0.vc b/Cortex-M0/nanosoc/systems/mcu/verilog/tbench_M0.vc new file mode 100644 index 0000000..3e9c203 --- /dev/null +++ b/Cortex-M0/nanosoc/systems/mcu/verilog/tbench_M0.vc @@ -0,0 +1,145 @@ +//----------------------------------------------------------------------------- +// customised Cortex-M0 'nanosoc' controller +// A joint work commissioned on behalf of SoC Labs, under Arm Academic Access license. +// +// Contributors +// +// David Flynn (d.w.flynn@soton.ac.uk) +// +// Copyright � 2021-3, SoC Labs (www.soclabs.org) +//----------------------------------------------------------------------------- + +//----------------------------------------------------------------------------- +// The confidential and proprietary information contained in this file may +// only be used by a person authorised under and to the extent permitted +// by a subsisting licensing agreement from Arm Limited or its affiliates. +// +// (C) COPYRIGHT 2010-2013 Arm Limited or its affiliates. +// ALL RIGHTS RESERVED +// +// This entire notice must be reproduced on all copies of this file +// and copies of this file may only be made by a person if such person is +// permitted to do so under the terms of a subsisting license agreement +// from Arm Limited or its affiliates. +// +// SVN Information +// +// Checked In : $Date: $ +// +// Revision : $Revision: $ +// +// Release Information : Cortex-M System Design Kit-r1p1-00rel0 +// +//----------------------------------------------------------------------------- +//----------------------------------------------------------------------------- +// Abstract : Verilog Command File for Cortex-M0 example system +//----------------------------------------------------------------------------- +// +// ================= MCU System options =============== +// Option to select Cortex-M0+ processor in example system ++define+CORTEX_M0 + +// =================== Tarmac Logging ================= ++define+USE_TARMAC + +// ============= Verilog library extensions =========== ++libext+.v+.vlib + +// ================= Top level file =================== +../verilog/tb_nanosoc.v ++incdir+../verilog ++incdir+/../verilog/soclabs_4x7_AhbMatrix +-y ../verilog/gen_ahb_busmatrix/verilog/built/soclabs_4x7_AhbMatrix + +// ============= GLIB Generic Library path ============= +../../../../../GLIB/pads/verilog/PAD_INOUT8MA_NOE.v +../../../../../GLIB/pads/verilog/PAD_VDDIO.v +../../../../../GLIB/pads/verilog/PAD_VSSIO.v +../../../../../GLIB/pads/verilog/PAD_VDDSOC.v +../../../../../GLIB/pads/verilog/PAD_VSS.v +../../../../../GLIB/mem/verilog/SROM_Ax32.v + +// ================= Testbench path =================== +-y ../../../../../../arm-AAA-ip/Corstone-101_Foundation_IP/BP210-BU-00000-r1p1-00rel0/logical/cmsdk_debug_tester/verilog ++incdir+../../../../../../arm-AAA-ip/Corstone-101_Foundation_IP/BP210-BU-00000-r1p1-00rel0/logical/cmsdk_debug_tester/verilog + +// ============= MCU Module search path ============= +-y ../verilog +-y ../../../../../../arm-AAA-ip/Corstone-101_Foundation_IP/BP210-BU-00000-r1p1-00rel0/logical/cmsdk_apb_timer/verilog +-y ../../../../../../arm-AAA-ip/Corstone-101_Foundation_IP/BP210-BU-00000-r1p1-00rel0/logical/cmsdk_apb_dualtimers/verilog +-y ../../../../../../arm-AAA-ip/Corstone-101_Foundation_IP/BP210-BU-00000-r1p1-00rel0/logical/cmsdk_apb_uart/verilog +-y ../../../../../../arm-AAA-ip/Corstone-101_Foundation_IP/BP210-BU-00000-r1p1-00rel0/logical/cmsdk_apb_watchdog/verilog +-y ../../../../../../arm-AAA-ip/Corstone-101_Foundation_IP/BP210-BU-00000-r1p1-00rel0/logical/cmsdk_apb_slave_mux/verilog +-y ../../../../../../arm-AAA-ip/Corstone-101_Foundation_IP/BP210-BU-00000-r1p1-00rel0/logical/cmsdk_apb_subsystem/verilog +-y ../../../../../../arm-AAA-ip/Corstone-101_Foundation_IP/BP210-BU-00000-r1p1-00rel0/logical/cmsdk_ahb_slave_mux/verilog +//-y ../../../../../../arm-AAA-ip/Corstone-101_Foundation_IP/BP210-BU-00000-r1p1-00rel0/logical/cmsdk_ahb_master_mux/verilog +-y ../../../../../../arm-AAA-ip/Corstone-101_Foundation_IP/BP210-BU-00000-r1p1-00rel0/logical/cmsdk_ahb_default_slave/verilog +-y ../../../../../../arm-AAA-ip/Corstone-101_Foundation_IP/BP210-BU-00000-r1p1-00rel0/logical/cmsdk_ahb_gpio/verilog +-y ../../../../../../arm-AAA-ip/Corstone-101_Foundation_IP/BP210-BU-00000-r1p1-00rel0/logical/cmsdk_ahb_to_apb/verilog +//-y ../../../../../../arm-AAA-ip/Corstone-101_Foundation_IP/BP210-BU-00000-r1p1-00rel0/logical/cmsdk_ahb_bitband/verilog +-y ../../../../../../arm-AAA-ip/Corstone-101_Foundation_IP/BP210-BU-00000-r1p1-00rel0/logical/cmsdk_iop_gpio/verilog +-y ../../../../../../arm-AAA-ip/Corstone-101_Foundation_IP/BP210-BU-00000-r1p1-00rel0/logical/models/clkgate +-y ../../../../../../arm-AAA-ip/Corstone-101_Foundation_IP/BP210-BU-00000-r1p1-00rel0/logical/models/memories/ +-y ../../../../../../arm-AAA-ip/Corstone-101_Foundation_IP/BP210-BU-00000-r1p1-00rel0/logical/cmsdk_ahb_to_sram/verilog +//-y ../../../../../../arm-AAA-ip/Corstone-101_Foundation_IP/BP210-BU-00000-r1p1-00rel0/logical/cmsdk_ahb_to_flash32/verilog +//-y ../../../../../../arm-AAA-ip/Corstone-101_Foundation_IP/BP210-BU-00000-r1p1-00rel0/logical/cmsdk_ahb_to_extmem16/verilog ++incdir+../../../../../../arm-AAA-ip/Corstone-101_Foundation_IP/BP210-BU-00000-r1p1-00rel0/logical/cmsdk_apb_dualtimers/verilog ++incdir+../../../../../../arm-AAA-ip/Corstone-101_Foundation_IP/BP210-BU-00000-r1p1-00rel0/logical/cmsdk_apb_watchdog/verilog ++incdir+../../../../../../arm-AAA-ip/Corstone-101_Foundation_IP/BP210-BU-00000-r1p1-00rel0/logical/models/memories/ + + +//// Optional PL230 Micro DMA controller - configure in local ../verilog/pl230_defs.v file +/// upgrade to AAA 'rel2' version ++incdir+../../../../../../arm-AAA-ip/DMA-230_MicroDMA_Controller/PL230-BU-00000-r0p0-02rel2/shared/logical/pl230_udma/verilog +../verilog/pl230_defs.v +../../../../../../arm-AAA-ip/DMA-230_MicroDMA_Controller/PL230-BU-00000-r0p0-02rel2/shared/logical/pl230_udma/verilog/pl230_ahb_ctrl.v +../../../../../../arm-AAA-ip/DMA-230_MicroDMA_Controller/PL230-BU-00000-r0p0-02rel2/shared/logical/pl230_udma/verilog/pl230_apb_regs.v +../../../../../../arm-AAA-ip/DMA-230_MicroDMA_Controller/PL230-BU-00000-r0p0-02rel2/shared/logical/pl230_udma/verilog/pl230_dma_data.v +../../../../../../arm-AAA-ip/DMA-230_MicroDMA_Controller/PL230-BU-00000-r0p0-02rel2/shared/logical/pl230_udma/verilog/pl230_udma.v +../../../../../../arm-AAA-ip/DMA-230_MicroDMA_Controller/PL230-BU-00000-r0p0-02rel2/shared/logical/pl230_udma/verilog/pl230_undefs.v + +../../../../../IPLIB/FT1248_streamio_v1_0/ft1248_streamio_v1_0.v +../../../../../IPLIB/ADPcontrol_v1_0/ADPcontrol_v1_0.v +../../../../../IPLIB/ADPcontrol_v1_0/ADPmanager.v +../verilog/cmsdk_apb_usrt.v + +// ============= Cortex-M0 Module search path ============= + +-y ../../../../../../arm-AAA-ip/Cortex-M0/AT510-BU-00000-r0p0-03rel3/logical/cortexm0/verilog +-y ../../../../../../arm-AAA-ip/Cortex-M0/AT510-BU-00000-r0p0-03rel3/logical/cortexm0_dap/verilog +-y ../../../../../../arm-AAA-ip/Cortex-M0/AT510-BU-00000-r0p0-03rel3/logical/cortexm0_integration/verilog +-y ../../../../../../arm-AAA-ip/Cortex-M0/AT510-BU-00000-r0p0-03rel3/logical/models/cells +-y ../../../../../../arm-AAA-ip/Cortex-M0/AT510-BU-00000-r0p0-03rel3/logical/models/wrappers +-y ../../../../../../arm-AAA-ip/Cortex-M0/AT510-BU-00000-r0p0-03rel3/logical/ualdis/verilog + + +// ============= Cortex-M0 Include file search path ============= + ++incdir+../../../../../../arm-AAA-ip/Cortex-M0/AT510-BU-00000-r0p0-03rel3/logical/cortexm0/verilog ++incdir+../../../../../../arm-AAA-ip/Cortex-M0/AT510-BU-00000-r0p0-03rel3/logical/cortexm0_dap/verilog ++incdir+../../../../../../arm-AAA-ip/Cortex-M0/AT510-BU-00000-r0p0-03rel3/logical/cortexm0_integration/verilog ++incdir+../../../../../../arm-AAA-ip/Cortex-M0/AT510-BU-00000-r0p0-03rel3/logical/models/cells ++incdir+../../../../../../arm-AAA-ip/Cortex-M0/AT510-BU-00000-r0p0-03rel3/logical/models/wrappers ++incdir+../../../../../../arm-AAA-ip/Cortex-M0/AT510-BU-00000-r0p0-03rel3/logical/ualdis/verilog + + + +// =============Debug tester Include file search path ============= + + +// ============= OVL support libraries ============= +//+define+ASSERT_ON +//+define+OVL_ASSERT_ON +//+define+ARM_ASSERT_ON +//+define+ARM_AHB_ASSERT_ON +//+define+ARM_APB_ASSERT_ON +//+define+ARM_CMSDK_ASSERT_ON + +// ============= Verification components ============= +-y ../../../../../../arm-AAA-ip/Corstone-101_Foundation_IP/BP210-BU-00000-r1p1-00rel0/logical/models/protocol_checkers/AhbLitePC/verilog/ ++incdir+../../../../../../arm-AAA-ip/Corstone-101_Foundation_IP/BP210-BU-00000-r1p1-00rel0/logical/models/protocol_checkers/AhbLitePC/verilog/ +-y ../../../../../../arm-AAA-ip/Corstone-101_Foundation_IP/BP210-BU-00000-r1p1-00rel0/logical/models/protocol_checkers/ApbPC/verilog/ ++incdir+../../../../../../arm-AAA-ip/Corstone-101_Foundation_IP/BP210-BU-00000-r1p1-00rel0/logical/models/protocol_checkers/ApbPC/verilog/ + +///+incdir+/arm/tools/accellera/ovl/releases/ovl_v2p6_Oct2011/std_ovl +///-y /arm/tools/accellera/ovl/releases/ovl_v2p6_Oct2011/std_ovl diff --git a/Cortex-M0/nanosoc/systems/mcu/verilog/v2html_M0.vc b/Cortex-M0/nanosoc/systems/mcu/verilog/v2html_M0.vc new file mode 100644 index 0000000..f32853f --- /dev/null +++ b/Cortex-M0/nanosoc/systems/mcu/verilog/v2html_M0.vc @@ -0,0 +1,120 @@ +//----------------------------------------------------------------------------- +// customised Cortex-M0 'nanosoc' controller +// A joint work commissioned on behalf of SoC Labs, under Arm Academic Access license. +// +// Contributors +// +// David Flynn (d.w.flynn@soton.ac.uk) +// +// Copyright � 2021-3, SoC Labs (www.soclabs.org) +//----------------------------------------------------------------------------- + +//----------------------------------------------------------------------------- +// The confidential and proprietary information contained in this file may +// only be used by a person authorised under and to the extent permitted +// by a subsisting licensing agreement from Arm Limited or its affiliates. +// +// (C) COPYRIGHT 2010-2013 Arm Limited or its affiliates. +// ALL RIGHTS RESERVED +// +// This entire notice must be reproduced on all copies of this file +// and copies of this file may only be made by a person if such person is +// permitted to do so under the terms of a subsisting license agreement +// from Arm Limited or its affiliates. +// +// SVN Information +// +// Checked In : $Date: $ +// +// Revision : $Revision: $ +// +// Release Information : Cortex-M System Design Kit-r1p1-00rel0 +// +//----------------------------------------------------------------------------- +//----------------------------------------------------------------------------- +// Abstract : Verilog Command File for Cortex-M0 example system +//----------------------------------------------------------------------------- +// +// ================= MCU System options =============== +// Option to select Cortex-M0+ processor in example system ++define+CORTEX_M0 + +// =================== Tarmac Logging ================= ++define+USE_TARMAC + +// ============= Verilog library extensions =========== ++libext+.v+.vlib + +// ================= Top level file =================== +../verilog/tb_nanosoc.v ++incdir+../verilog ++incdir+/../verilog/soclabs_4x7_AhbMatrix +-y ../verilog/gen_ahb_busmatrix/verilog/built/soclabs_4x7_AhbMatrix + +// ================= Testbench path =================== +-y ../../../../../../arm-AAA-ip/Corstone-101_Foundation_IP/BP210-BU-00000-r1p1-00rel0/logical/cmsdk_debug_tester/verilog ++incdir+../../../../../../arm-AAA-ip/Corstone-101_Foundation_IP/BP210-BU-00000-r1p1-00rel0/logical/cmsdk_debug_tester/verilog + +// ============= GLIB Generic Library path ============= +../../../../../GLIB/pads/verilog/PAD_INOUT8MA_NOE.v +../../../../../GLIB/pads/verilog/PAD_VDDIO.v +../../../../../GLIB/pads/verilog/PAD_VSSIO.v +../../../../../GLIB/pads/verilog/PAD_VDDSOC.v +../../../../../GLIB/pads/verilog/PAD_VSS.v +../../../../../GLIB/mem/verilog/SROM_Ax32.v + +// ============= IPLIB soclabs IP Library path ============= +../../../../../IPLIB/FT1248_streamio_v1_0/ft1248_streamio_v1_0.v +../../../../../IPLIB/ADPcontrol_v1_0/ADPcontrol_v1_0.v +../../../../../IPLIB/ADPcontrol_v1_0/ADPmanager.v +../verilog/cmsdk_apb_usrt.v + +// ============= MCU Module search path ============= +-y ../verilog +-y ../../../../../../arm-AAA-ip/Corstone-101_Foundation_IP/BP210-BU-00000-r1p1-00rel0/logical/cmsdk_apb_timer/verilog +-y ../../../../../../arm-AAA-ip/Corstone-101_Foundation_IP/BP210-BU-00000-r1p1-00rel0/logical/cmsdk_apb_dualtimers/verilog +-y ../../../../../../arm-AAA-ip/Corstone-101_Foundation_IP/BP210-BU-00000-r1p1-00rel0/logical/cmsdk_apb_uart/verilog +-y ../../../../../../arm-AAA-ip/Corstone-101_Foundation_IP/BP210-BU-00000-r1p1-00rel0/logical/cmsdk_apb_watchdog/verilog +-y ../../../../../../arm-AAA-ip/Corstone-101_Foundation_IP/BP210-BU-00000-r1p1-00rel0/logical/cmsdk_apb_slave_mux/verilog +-y ../../../../../../arm-AAA-ip/Corstone-101_Foundation_IP/BP210-BU-00000-r1p1-00rel0/logical/cmsdk_apb_subsystem/verilog +-y ../../../../../../arm-AAA-ip/Corstone-101_Foundation_IP/BP210-BU-00000-r1p1-00rel0/logical/cmsdk_ahb_slave_mux/verilog +//-y ../../../../../../arm-AAA-ip/Corstone-101_Foundation_IP/BP210-BU-00000-r1p1-00rel0/logical/cmsdk_ahb_master_mux/verilog +-y ../../../../../../arm-AAA-ip/Corstone-101_Foundation_IP/BP210-BU-00000-r1p1-00rel0/logical/cmsdk_ahb_default_slave/verilog +-y ../../../../../../arm-AAA-ip/Corstone-101_Foundation_IP/BP210-BU-00000-r1p1-00rel0/logical/cmsdk_ahb_gpio/verilog +-y ../../../../../../arm-AAA-ip/Corstone-101_Foundation_IP/BP210-BU-00000-r1p1-00rel0/logical/cmsdk_ahb_to_apb/verilog +//-y ../../../../../../arm-AAA-ip/Corstone-101_Foundation_IP/BP210-BU-00000-r1p1-00rel0/logical/cmsdk_ahb_bitband/verilog +-y ../../../../../../arm-AAA-ip/Corstone-101_Foundation_IP/BP210-BU-00000-r1p1-00rel0/logical/cmsdk_iop_gpio/verilog +-y ../../../../../../arm-AAA-ip/Corstone-101_Foundation_IP/BP210-BU-00000-r1p1-00rel0/logical/models/clkgate +-y ../../../../../../arm-AAA-ip/Corstone-101_Foundation_IP/BP210-BU-00000-r1p1-00rel0/logical/models/memories/ +-y ../../../../../../arm-AAA-ip/Corstone-101_Foundation_IP/BP210-BU-00000-r1p1-00rel0/logical/cmsdk_ahb_to_sram/verilog +//-y ../../../../../../arm-AAA-ip/Corstone-101_Foundation_IP/BP210-BU-00000-r1p1-00rel0/logical/cmsdk_ahb_to_flash32/verilog +//-y ../../../../../../arm-AAA-ip/Corstone-101_Foundation_IP/BP210-BU-00000-r1p1-00rel0/logical/cmsdk_ahb_to_extmem16/verilog ++incdir+../../../../../../arm-AAA-ip/Corstone-101_Foundation_IP/BP210-BU-00000-r1p1-00rel0/logical/cmsdk_apb_dualtimers/verilog ++incdir+../../../../../../arm-AAA-ip/Corstone-101_Foundation_IP/BP210-BU-00000-r1p1-00rel0/logical/cmsdk_apb_watchdog/verilog ++incdir+../../../../../../arm-AAA-ip/Corstone-101_Foundation_IP/BP210-BU-00000-r1p1-00rel0/logical/models/memories/ + +//// Optional PL230 Micro DMA controller - configure in local ../verilog/pl230_defs.v file +/// upgrade to AAA 'rel2' version ++incdir+../../../../../../arm-AAA-ip/DMA-230_MicroDMA_Controller/PL230-BU-00000-r0p0-02rel2/shared/logical/pl230_udma/verilog +../verilog/pl230_defs.v +../../../../../../arm-AAA-ip/DMA-230_MicroDMA_Controller/PL230-BU-00000-r0p0-02rel2/shared/logical/pl230_udma/verilog/pl230_ahb_ctrl.v +../../../../../../arm-AAA-ip/DMA-230_MicroDMA_Controller/PL230-BU-00000-r0p0-02rel2/shared/logical/pl230_udma/verilog/pl230_apb_regs.v +../../../../../../arm-AAA-ip/DMA-230_MicroDMA_Controller/PL230-BU-00000-r0p0-02rel2/shared/logical/pl230_udma/verilog/pl230_dma_data.v +../../../../../../arm-AAA-ip/DMA-230_MicroDMA_Controller/PL230-BU-00000-r0p0-02rel2/shared/logical/pl230_udma/verilog/pl230_udma.v +../../../../../../arm-AAA-ip/DMA-230_MicroDMA_Controller/PL230-BU-00000-r0p0-02rel2/shared/logical/pl230_udma/verilog/pl230_undefs.v + +// ============= Cortex-M0 Module search path ============= +// guts of core not exposed, periphery only +-y ../../../../../../arm-AAA-ip/Cortex-M0/AT510-BU-00000-r0p0-03rel3/logical/cortexm0_integration/verilog +-y ../../../../../../arm-AAA-ip/Cortex-M0/AT510-BU-00000-r0p0-03rel3/logical/models/cells +-y ../../../../../../arm-AAA-ip/Cortex-M0/AT510-BU-00000-r0p0-03rel3/logical/models/wrappers +-y ../../../../../../arm-AAA-ip/Cortex-M0/AT510-BU-00000-r0p0-03rel3/logical/ualdis/verilog + +// ============= Cortex-M0 Include file search path ============= +// guts of core not exposed, periphery only + ++incdi+../../../../../../arm-AAA-ip/Cortex-M0/AT510-BU-00000-r0p0-03rel3/logical/cortexm0_integration/verilog ++incdir+../../../../../../arm-AAA-ip/Cortex-M0/AT510-BU-00000-r0p0-03rel3/logical/models/cells ++incdir+../../../../../../arm-AAA-ip/Cortex-M0/AT510-BU-00000-r0p0-03rel3/logical/models/wrappers ++incdir+../../../../../../arm-AAA-ip/Cortex-M0/AT510-BU-00000-r0p0-03rel3/logical/ualdis/verilog + diff --git a/FPGALIB/pads/verilog/PAD_INOUT8MA_NOE.v b/FPGALIB/pads/verilog/PAD_INOUT8MA_NOE.v new file mode 100644 index 0000000..fa92fec --- /dev/null +++ b/FPGALIB/pads/verilog/PAD_INOUT8MA_NOE.v @@ -0,0 +1,37 @@ +// from GLIB_PADLIB.v +//----------------------------------------------------------------------------- +// soclabs generic IO pad model +// A joint work commissioned on behalf of SoC Labs, under Arm Academic Access license. +// +// Contributors +// +// David Flynn (d.w.flynn@soton.ac.uk) +// +// Copyright � 2022, SoC Labs (www.soclabs.org) +//----------------------------------------------------------------------------- + +module PAD_INOUT8MA_NOE ( + // Inouts + PAD, + // Outputs + I, + // Inputs + O, + NOE + ); + inout PAD; + output I; + input O; + input NOE; + + IOBUF #( + .IOSTANDARD ("LVCMOS33"), + .DRIVE(8) + ) IOBUF3V3 ( + .O(I), + .IO(PAD), + .I(O), + .T(NOE) + ); + +endmodule // PAD_INOUT8MA_NOE diff --git a/FPGALIB/pads/verilog/PAD_VDDIO.v b/FPGALIB/pads/verilog/PAD_VDDIO.v new file mode 100644 index 0000000..4fd7137 --- /dev/null +++ b/FPGALIB/pads/verilog/PAD_VDDIO.v @@ -0,0 +1,29 @@ +// from GLIB_PADLIB.v +//----------------------------------------------------------------------------- +// soclabs generic IO pad model +// A joint work commissioned on behalf of SoC Labs, under Arm Academic Access license. +// +// Contributors +// +// David Flynn (d.w.flynn@soton.ac.uk) +// +// Copyright � 2022, SoC Labs (www.soclabs.org) +//----------------------------------------------------------------------------- + +module PAD_VDDIO ( + // Inouts + PAD + ); + inout PAD; + + IOBUF #( + .IOSTANDARD ("LVCMOS33"), + .DRIVE(8) + ) IOBUF3V3 ( + .O( ), + .IO(PAD), + .I(1'b1), + .T(1'b1) + ); + +endmodule // PAD_VDDIO diff --git a/FPGALIB/pads/verilog/PAD_VDDSOC.v b/FPGALIB/pads/verilog/PAD_VDDSOC.v new file mode 100644 index 0000000..80f6a72 --- /dev/null +++ b/FPGALIB/pads/verilog/PAD_VDDSOC.v @@ -0,0 +1,29 @@ +// from GLIB_PADLIB.v +//----------------------------------------------------------------------------- +// soclabs generic IO pad model +// A joint work commissioned on behalf of SoC Labs, under Arm Academic Access license. +// +// Contributors +// +// David Flynn (d.w.flynn@soton.ac.uk) +// +// Copyright � 2022, SoC Labs (www.soclabs.org) +//----------------------------------------------------------------------------- + +module PAD_VDDSOC ( + // Inouts + PAD + ); + inout PAD; + + IOBUF #( + .IOSTANDARD ("LVCMOS33"), + .DRIVE(8) + ) IOBUF3V3 ( + .O( ), + .IO(PAD), + .I(1'b1), + .T(1'b1) + ); + +endmodule // PAD_VDDSOC diff --git a/FPGALIB/pads/verilog/PAD_VSS.v b/FPGALIB/pads/verilog/PAD_VSS.v new file mode 100644 index 0000000..046a389 --- /dev/null +++ b/FPGALIB/pads/verilog/PAD_VSS.v @@ -0,0 +1,29 @@ +// from GLIB_PADLIB.v +//----------------------------------------------------------------------------- +// soclabs generic IO pad model +// A joint work commissioned on behalf of SoC Labs, under Arm Academic Access license. +// +// Contributors +// +// David Flynn (d.w.flynn@soton.ac.uk) +// +// Copyright � 2022, SoC Labs (www.soclabs.org) +//----------------------------------------------------------------------------- + +module PAD_VSS ( + // Inouts + PAD + ); + inout PAD; + + IOBUF #( + .IOSTANDARD ("LVCMOS33"), + .DRIVE(8) + ) IOBUF3V3 ( + .O( ), + .IO(PAD), + .I(1'b1), + .T(1'b1) + ); + +endmodule // PAD_VSS diff --git a/FPGALIB/pads/verilog/PAD_VSSIO.v b/FPGALIB/pads/verilog/PAD_VSSIO.v new file mode 100644 index 0000000..6bfb333 --- /dev/null +++ b/FPGALIB/pads/verilog/PAD_VSSIO.v @@ -0,0 +1,29 @@ +// from GLIB_PADLIB.v +//----------------------------------------------------------------------------- +// soclabs generic IO pad model +// A joint work commissioned on behalf of SoC Labs, under Arm Academic Access license. +// +// Contributors +// +// David Flynn (d.w.flynn@soton.ac.uk) +// +// Copyright � 2022, SoC Labs (www.soclabs.org) +//----------------------------------------------------------------------------- + +module PAD_VSSIO ( + // Inouts + PAD + ); + inout PAD; + + IOBUF #( + .IOSTANDARD ("LVCMOS33"), + .DRIVE(8) + ) IOBUF3V3 ( + .O( ), + .IO(PAD), + .I(1'b1), + .T(1'b1) + ); + +endmodule // PAD_VSSIO diff --git a/GLIB/mem/verilog/SROM_Ax32.v b/GLIB/mem/verilog/SROM_Ax32.v new file mode 100644 index 0000000..f2c3a9a --- /dev/null +++ b/GLIB/mem/verilog/SROM_Ax32.v @@ -0,0 +1,127 @@ +//----------------------------------------------------------------------------- +// +// Synthesizable byte-write addressible R/W (random-access) memory +// +// Synchronous data write, flow-though (non-pipeline registered) read data +// +// Auto-gernerates a synthesizable verilog ROM design +// and binary text file for custom ROM via programming +// +// A joint work commissioned on behalf of SoC Labs, under Arm Academic Access license. +// +// Contributors +// +// David Flynn (d.w.flynn@soton.ac.uk) +// +// Copyright � 2021-3, SoC Labs (www.soclabs.org) +//----------------------------------------------------------------------------- + +module SROM_Ax32 + #(parameter ADDRWIDTH = 10, + parameter filename = "rom32.hex", + parameter romgen = 0 + ) + (input wire CLK, + input wire [ADDRWIDTH-1:0] ADDR, //Address Input + input wire SEL, //Select (active-high) + output wire [31:0] RDATA); //Read Data + + localparam MEMDEPTH = (1 << (ADDRWIDTH)-1)-1; + localparam romgenfile = "bootrom.v"; + localparam bingenfile = "bootrom.bintxt"; + + // Reg declarations + reg [7:0] rombyte0 [0:MEMDEPTH]; + reg [7:0] rombyte1 [0:MEMDEPTH]; + reg [7:0] rombyte2 [0:MEMDEPTH]; + reg [7:0] rombyte3 [0:MEMDEPTH]; + + reg [ADDRWIDTH-1:0] addr_r; // registered Address for read access + +// optional simulation RAM_INIT option to suppress 'X' initial contents +`ifdef MEM_INIT + reg [7:0] fileimage [((4<<ADDRWIDTH)-1):0]; + function [31:0] NoX32; input [31:0] n; NoX32 = (((^n) === 1'bx) ? 32'h0 : n); endfunction + integer fd; // file descriptor for file output + integer fd2; // file descriptor for file 2 output + integer i; + reg [39:0] today [0:1]; + +initial + begin + $system("date +%y%m%d%H%M >date_file"); //format yymmdd + $readmemh("date_file", today); + $display("data_file: %x", today[0]); + + for (i=0; i<= MEMDEPTH; i=i+1) begin + rombyte0[i] <= 8'he5; + rombyte1[i] <= 8'he5; + rombyte2[i] <= 8'he5; + rombyte3[i] <= 8'he5; + end + if (filename != "") begin + $readmemh(filename, fileimage); + for (i = 0; i <= MEMDEPTH; i=i+1) begin + rombyte0[i] <= fileimage[(i<<2)+0]; + rombyte1[i] <= fileimage[(i<<2)+1]; + rombyte2[i] <= fileimage[(i<<2)+2]; + rombyte3[i] <= fileimage[(i<<2)+3]; + end + end + if (romgen != 0) + begin + fd = $fopen(romgenfile); + fd2 = $fopen(bingenfile); + if ((fd == 0) || (fd2 == 0)) begin + $display("rom32gen: Error, zero returned in response to $fopen\n"); + end + else begin + $display(fd,"rom32gen: Generating output file\n"); + $fwrite(fd,"//------------------------------------------------------------------------------------\n"); + $fwrite(fd,"// customised auto-generated synthesizable ROM module abstraction\n"); + $fwrite(fd,"// A joint work commissioned on behalf of SoC Labs, under Arm Academic Access license.\n"); + $fwrite(fd,"//\n"); + $fwrite(fd,"// Contributors\n"); + $fwrite(fd,"//\n"); + $fwrite(fd,"// David Flynn (d.w.flynn@soton.ac.uk)\n"); + $fwrite(fd,"// Date: %x\n", today[0]); + $fwrite(fd,"// Copyright (c) 2021-2, SoC Labs (www.soclabs.org)\n"); + $fwrite(fd,"//------------------------------------------------------------------------------------\n"); + $fwrite(fd,"module bootrom (\n"); + $fwrite(fd," input wire CLK,\n"); + $fwrite(fd," input wire EN,\n"); + $fwrite(fd," input wire [%0d:2] ADDR,\n", ADDRWIDTH+1); + $fwrite(fd," output reg [31:0] RDATA );\n"); + $fwrite(fd,"reg [%0d:2] addr_r;\n", ADDRWIDTH+1); + $fwrite(fd,"always @(posedge CLK) if (EN) addr_r <= ADDR;\n"); + $fwrite(fd,"always @(addr_r)"); + $fwrite(fd," case(addr_r[%0d:2]) \n", ADDRWIDTH+1); + if (ADDRWIDTH > 8) + for (i = 0; i < 4 << (ADDRWIDTH); i=i+4) begin + $fwrite(fd," %2d'h%3x : RDATA <= 32'h%8x; // 0x%04x\n", ADDRWIDTH, i>>2, NoX32({fileimage[i+3],fileimage[i+2],fileimage[i+1],fileimage[i+0]}), i ); + $fwrite(fd2,"%32b\n",NoX32({fileimage[i+3],fileimage[i+2],fileimage[i+1],fileimage[i+0]})); + end + else + for (i = 0; i < 4 << (ADDRWIDTH); i=i+4) begin + $fwrite(fd," %2d'h%2x : RDATA <= 32'h%8x; // 0x%04x\n", ADDRWIDTH, i>>2, NoX32({fileimage[i+3],fileimage[i+2],fileimage[i+1],fileimage[i+0]}), i ); + $fwrite(fd2,"%32b\n",NoX32({fileimage[i+3],fileimage[i+2],fileimage[i+1],fileimage[i+0]})); + end + $fwrite(fd," default : RDATA <=32'h0;\n"); + $fwrite(fd," endcase\n"); + $fwrite(fd,"endmodule\n"); + $fclose(fd); + $fclose(fd2); + end + end + end +`endif + +// synchonous address and control + + always @(posedge CLK) // update on any byte lane read + if (SEL) + addr_r <= ADDR[ADDRWIDTH-1:0]; + + assign RDATA = {rombyte3[addr_r],rombyte2[addr_r],rombyte1[addr_r],rombyte0[addr_r]}; + +endmodule diff --git a/GLIB/pads/verilog/GLIB_PADLIB.v b/GLIB/pads/verilog/GLIB_PADLIB.v new file mode 100755 index 0000000..bc10d2b --- /dev/null +++ b/GLIB/pads/verilog/GLIB_PADLIB.v @@ -0,0 +1,139 @@ +// GLIB_PADLIB.v +//----------------------------------------------------------------------------- +// soclabs generic IO pad model +// A joint work commissioned on behalf of SoC Labs, under Arm Academic Access license. +// +// Contributors +// +// David Flynn (d.w.flynn@soton.ac.uk) +// +// Copyright � 2022, SoC Labs (www.soclabs.org) +//----------------------------------------------------------------------------- + +module PAD_INOUT8MA_NOE ( + // Inouts + PAD, + // Outputs + O, + // Inputs + I, + NOE + ); + inout PAD; + output I; + input O; + input NOE; + +`ifdef BEHAVIORAL_PADS + assign I = PAD; + assign PAD = ~NOE ? O : 1'bz; +`else + bufif1 #2 (PAD, O, ~NOE); + buf #1 (I, PAD); + always @(PAD) + begin + if (($countdrivers(PAD) > 1) && (PAD === 1'bx)) + $display("%t ++BUS CONFLICT++ : %m", $realtime); + end +`endif // ifdef BEHAVIORAL_PADS +endmodule // PAD_INOUT8MA_NOE + +module PAD_INOUT8MA_OE ( + // Inouts + PAD, + // Outputs + O, + // Inputs + I, + OE + ); + inout PAD; + output I; + input O; + input OE; +`ifdef BEHAVIORAL_PADS + assign I = PAD; + assign PAD = OE ? O : 1'bz; +`else + bufif1 #2 (PAD, O, OE); + buf #1 (I, PAD); + + always @(PAD) + begin + if (($countdrivers(PAD) > 1) && (PAD === 1'bx)) + $display("%t ++BUS CONFLICT++ : %m", $realtime); + end +`endif // ifdef BEHAVIORAL_PADS +endmodule // PAD_INOUT8MA_OE + +module PAD_VDDIO ( + PAD + ); + inout PAD; +endmodule // PAD_VDDIO + +module PAD_VSSIO ( + PAD + ); + inout PAD; +endmodule // PAD_VSSSIO + +// core logic supply rails (1V0, 0V) +module PAD_VDDSOC ( + PAD + ); + inout PAD; +endmodule // PAD_VDDSOC + +module PAD_VSS ( + PAD + ); + inout PAD; +endmodule // PAD_VSS + +// VDDISOL +module PAD_ANALOG ( + PAD + ); + inout PAD; +endmodule // PAD_ANALOG + +`ifdef TSMC_PADS + +// VDDSOC +module PVDD1CDG ( + inout wire VDD + ); +endmodule // PVDD1CDG + +//VDDIO +module PVDD2CDG ( + inout wire VDDPST + ); +endmodule // PVDD2CDG + +module PVDD2POC ( + inout wire VDDPST + ); +endmodule // PVDD2CDG + +module PVSS3CDG ( + inout wire VSS + ); +endmodule // PVSS3CDG + +// VDDISOL +module PVDD1ANA ( + inout wire AVDD + ); +endmodule // PVDD1ANA + + +module PCORNER ( ); endmodule +module PFILLER20 ( ); endmodule +module PFILLER1 ( ); endmodule +module PFILLER0005 ( ); endmodule + +module PAD60LU ( ); endmodule + +`endif diff --git a/GLIB/pads/verilog/PAD_ANALOG.v b/GLIB/pads/verilog/PAD_ANALOG.v new file mode 100644 index 0000000..2715fb3 --- /dev/null +++ b/GLIB/pads/verilog/PAD_ANALOG.v @@ -0,0 +1,18 @@ +// from GLIB_PADLIB.v +//----------------------------------------------------------------------------- +// soclabs generic IO pad model +// A joint work commissioned on behalf of SoC Labs, under Arm Academic Access license. +// +// Contributors +// +// David Flynn (d.w.flynn@soton.ac.uk) +// +// Copyright � 2022, SoC Labs (www.soclabs.org) +//----------------------------------------------------------------------------- + +// VDDISOL +module PAD_ANALOG ( + PAD + ); + inout PAD; +endmodule // PAD_ANALOG diff --git a/GLIB/pads/verilog/PAD_INOUT8MA_NOE.v b/GLIB/pads/verilog/PAD_INOUT8MA_NOE.v new file mode 100644 index 0000000..42123e8 --- /dev/null +++ b/GLIB/pads/verilog/PAD_INOUT8MA_NOE.v @@ -0,0 +1,39 @@ +// from GLIB_PADLIB.v +//----------------------------------------------------------------------------- +// soclabs generic IO pad model +// A joint work commissioned on behalf of SoC Labs, under Arm Academic Access license. +// +// Contributors +// +// David Flynn (d.w.flynn@soton.ac.uk) +// +// Copyright � 2022, SoC Labs (www.soclabs.org) +//----------------------------------------------------------------------------- + +module PAD_INOUT8MA_NOE ( + // Inouts + PAD, + // Outputs + O, + // Inputs + I, + NOE + ); + inout PAD; + output I; + input O; + input NOE; + +`ifdef BEHAVIORAL_PADS + assign I = PAD; + assign PAD = ~NOE ? O : 1'bz; +`else + bufif1 #2 (PAD, O, ~NOE); + buf #1 (I, PAD); + always @(PAD) + begin + if (($countdrivers(PAD) > 1) && (PAD === 1'bx)) + $display("%t ++BUS CONFLICT++ : %m", $realtime); + end +`endif // ifdef BEHAVIORAL_PADS +endmodule // PAD_INOUT8MA_NOE diff --git a/GLIB/pads/verilog/PAD_INOUT8MA_OE.v b/GLIB/pads/verilog/PAD_INOUT8MA_OE.v new file mode 100644 index 0000000..12d3009 --- /dev/null +++ b/GLIB/pads/verilog/PAD_INOUT8MA_OE.v @@ -0,0 +1,39 @@ +// from GLIB_PADLIB.v +//----------------------------------------------------------------------------- +// soclabs generic IO pad model +// A joint work commissioned on behalf of SoC Labs, under Arm Academic Access license. +// +// Contributors +// +// David Flynn (d.w.flynn@soton.ac.uk) +// +// Copyright � 2022, SoC Labs (www.soclabs.org) +//----------------------------------------------------------------------------- + +module PAD_INOUT8MA_OE ( + // Inouts + PAD, + // Outputs + O, + // Inputs + I, + OE + ); + inout PAD; + output I; + input O; + input OE; +`ifdef BEHAVIORAL_PADS + assign I = PAD; + assign PAD = OE ? O : 1'bz; +`else + bufif1 #2 (PAD, O, OE); + buf #1 (I, PAD); + + always @(PAD) + begin + if (($countdrivers(PAD) > 1) && (PAD === 1'bx)) + $display("%t ++BUS CONFLICT++ : %m", $realtime); + end +`endif // ifdef BEHAVIORAL_PADS +endmodule // PAD_INOUT8MA_OE diff --git a/GLIB/pads/verilog/PAD_VDDIO.v b/GLIB/pads/verilog/PAD_VDDIO.v new file mode 100644 index 0000000..e8eda59 --- /dev/null +++ b/GLIB/pads/verilog/PAD_VDDIO.v @@ -0,0 +1,18 @@ +// from GLIB_PADLIB.v +//----------------------------------------------------------------------------- +// soclabs generic IO pad model +// A joint work commissioned on behalf of SoC Labs, under Arm Academic Access license. +// +// Contributors +// +// David Flynn (d.w.flynn@soton.ac.uk) +// +// Copyright � 2022, SoC Labs (www.soclabs.org) +//----------------------------------------------------------------------------- + +module PAD_VDDIO ( + PAD + ); + inout PAD; + assign PAD = 1'b1; + endmodule // PAD_VDDIO diff --git a/GLIB/pads/verilog/PAD_VDDSOC.v b/GLIB/pads/verilog/PAD_VDDSOC.v new file mode 100644 index 0000000..02de9e9 --- /dev/null +++ b/GLIB/pads/verilog/PAD_VDDSOC.v @@ -0,0 +1,19 @@ +// from GLIB_PADLIB.v +//----------------------------------------------------------------------------- +// soclabs generic IO pad model +// A joint work commissioned on behalf of SoC Labs, under Arm Academic Access license. +// +// Contributors +// +// David Flynn (d.w.flynn@soton.ac.uk) +// +// Copyright � 2022, SoC Labs (www.soclabs.org) +//----------------------------------------------------------------------------- + +// core logic supply rails (1V0, 0V) +module PAD_VDDSOC ( + PAD + ); + inout PAD; + assign PAD = 1'b1; +endmodule // PAD_VDDSOC diff --git a/GLIB/pads/verilog/PAD_VSS.v b/GLIB/pads/verilog/PAD_VSS.v new file mode 100644 index 0000000..ea07cca --- /dev/null +++ b/GLIB/pads/verilog/PAD_VSS.v @@ -0,0 +1,18 @@ +// from GLIB_PADLIB.v +//----------------------------------------------------------------------------- +// soclabs generic IO pad model +// A joint work commissioned on behalf of SoC Labs, under Arm Academic Access license. +// +// Contributors +// +// David Flynn (d.w.flynn@soton.ac.uk) +// +// Copyright � 2022, SoC Labs (www.soclabs.org) +//----------------------------------------------------------------------------- + +module PAD_VSS ( + PAD + ); + inout PAD; + assign PAD = 1'b0; +endmodule // PAD_VSS diff --git a/GLIB/pads/verilog/PAD_VSSIO.v b/GLIB/pads/verilog/PAD_VSSIO.v new file mode 100644 index 0000000..42d9edb --- /dev/null +++ b/GLIB/pads/verilog/PAD_VSSIO.v @@ -0,0 +1,19 @@ +// from GLIB_PADLIB.v +//----------------------------------------------------------------------------- +// soclabs generic IO pad model +// A joint work commissioned on behalf of SoC Labs, under Arm Academic Access license. +// +// Contributors +// +// David Flynn (d.w.flynn@soton.ac.uk) +// +// Copyright � 2022, SoC Labs (www.soclabs.org) +//----------------------------------------------------------------------------- + +module PAD_VSSIO ( + PAD + ); + inout PAD; + assign PAD = 1'b0; +endmodule // PAD_VSSIO + diff --git a/IPLIB/ADPcontrol_v1_0/ADPcontrol_adv__mangled.v b/IPLIB/ADPcontrol_v1_0/ADPcontrol_adv__mangled.v new file mode 100755 index 0000000..2699f10 --- /dev/null +++ b/IPLIB/ADPcontrol_v1_0/ADPcontrol_adv__mangled.v @@ -0,0 +1,7744 @@ +// +// A joint work commissioned on behalf of SoC Labs. +// +// Contributors +// +// David Flynn (d.w.flynn@soton.ac.uk) +// +// Obfuscated RTL +// +// Copyright (C) 2021-2, SoC Labs (www.soclabs.org) +// + +/* + instances: 0 + nodes: 3002 (0) + node widths: 3242 (0) + process: 281 (0) + contassign: 2769 (0) + ports: 27 (0) +*/ + +/* Source file "tokens.v", line 14 */ +module ADPcontrol(ahb_hclk, ahb_hresetn, com_rx_tready, com_rx_tdata, + com_rx_tvalid, com_tx_tvalid, com_tx_tdata, com_tx_tready, + stdio_rx_tready, stdio_rx_tdata, stdio_rx_tvalid, stdio_tx_tvalid, + stdio_tx_tdata, stdio_tx_tready, gpo8, gpi8, ahb_haddr, ahb_hburst, + ahb_hmastlock, ahb_hprot, ahb_hsize, ahb_htrans, ahb_hwdata, ahb_hwrite, + ahb_hrdata, ahb_hready, ahb_hresp); + + input [7:0] com_rx_tdata; + output [7:0] com_tx_tdata; + input [7:0] stdio_rx_tdata; + output [7:0] stdio_tx_tdata; + output [7:0] gpo8; + input [7:0] gpi8; + output [31:0] ahb_haddr; + output [2:0] ahb_hburst; + output [3:0] ahb_hprot; + output [2:0] ahb_hsize; + output [1:0] ahb_htrans; + output [31:0] ahb_hwdata; + input [31:0] ahb_hrdata; + input ahb_hclk; + input ahb_hresetn; + input com_rx_tvalid; + input com_tx_tready; + input stdio_rx_tvalid; + input stdio_tx_tready; + input ahb_hready; + input ahb_hresp; + output com_rx_tready; + output com_tx_tvalid; + output stdio_rx_tready; + output stdio_tx_tvalid; + output ahb_hmastlock; + output ahb_hwrite; + + wire Xzpfh7; + wire O0qfh7; + wire F1qfh7; + wire W1qfh7; + wire N2qfh7; + wire E3qfh7; + wire V3qfh7; + wire M4qfh7; + wire D5qfh7; + wire U5qfh7; + wire L6qfh7; + wire C7qfh7; + wire T7qfh7; + wire K8qfh7; + wire B9qfh7; + wire S9qfh7; + wire Jaqfh7; + wire Abqfh7; + wire Rbqfh7; + wire Icqfh7; + wire Zcqfh7; + wire Qdqfh7; + wire Heqfh7; + wire Yeqfh7; + wire Pfqfh7; + wire Ggqfh7; + wire Xgqfh7; + wire Ohqfh7; + wire Fiqfh7; + wire Wiqfh7; + wire Njqfh7; + wire Ekqfh7; + wire Vkqfh7; + wire Mlqfh7; + wire Dmqfh7; + wire Umqfh7; + wire Lnqfh7; + wire Coqfh7; + wire Toqfh7; + wire Kpqfh7; + wire Bqqfh7; + wire Sqqfh7; + wire Jrqfh7; + wire Asqfh7; + wire Rsqfh7; + wire Itqfh7; + wire Ztqfh7; + wire Quqfh7; + wire Hvqfh7; + wire Yvqfh7; + wire Pwqfh7; + wire Gxqfh7; + wire Xxqfh7; + wire Oyqfh7; + wire Fzqfh7; + wire Wzqfh7; + wire N0rfh7; + wire E1rfh7; + wire V1rfh7; + wire M2rfh7; + wire D3rfh7; + wire U3rfh7; + wire L4rfh7; + wire C5rfh7; + wire T5rfh7; + wire K6rfh7; + wire B7rfh7; + wire S7rfh7; + wire J8rfh7; + wire A9rfh7; + wire R9rfh7; + wire Iarfh7; + wire Zarfh7; + wire Qbrfh7; + wire Hcrfh7; + wire Ycrfh7; + wire Pdrfh7; + wire Gerfh7; + wire Xerfh7; + wire Ofrfh7; + wire Fgrfh7; + wire Wgrfh7; + wire Nhrfh7; + wire Eirfh7; + wire Virfh7; + wire Mjrfh7; + wire Dkrfh7; + wire Ukrfh7; + wire Llrfh7; + wire Cmrfh7; + wire Tmrfh7; + wire Knrfh7; + wire Borfh7; + wire Sorfh7; + wire Jprfh7; + wire Aqrfh7; + wire Rqrfh7; + wire Irrfh7; + wire Zrrfh7; + wire Qsrfh7; + wire Htrfh7; + wire Ytrfh7; + wire Purfh7; + wire Gvrfh7; + wire Xvrfh7; + wire Owrfh7; + wire Fxrfh7; + wire Wxrfh7; + wire Nyrfh7; + wire Ezrfh7; + wire Vzrfh7; + wire M0sfh7; + wire D1sfh7; + wire U1sfh7; + wire L2sfh7; + wire C3sfh7; + wire T3sfh7; + wire K4sfh7; + wire B5sfh7; + wire R5sfh7; + wire H6sfh7; + wire X6sfh7; + wire N7sfh7; + wire D8sfh7; + wire T8sfh7; + wire J9sfh7; + wire Z9sfh7; + wire Pasfh7; + wire Fbsfh7; + wire Vbsfh7; + wire Lcsfh7; + wire Bdsfh7; + wire Rdsfh7; + wire Hesfh7; + wire Xesfh7; + wire Nfsfh7; + wire Dgsfh7; + wire Tgsfh7; + wire Jhsfh7; + wire Zhsfh7; + wire Pisfh7; + wire Fjsfh7; + wire Vjsfh7; + wire Lksfh7; + wire Blsfh7; + wire Rlsfh7; + wire Hmsfh7; + wire Xmsfh7; + wire Nnsfh7; + wire Dosfh7; + wire Tosfh7; + wire Jpsfh7; + wire Zpsfh7; + wire Pqsfh7; + wire Frsfh7; + wire Vrsfh7; + wire Lssfh7; + wire Btsfh7; + wire Rtsfh7; + wire Husfh7; + wire Xusfh7; + wire Nvsfh7; + wire Dwsfh7; + wire Twsfh7; + wire Jxsfh7; + wire Zxsfh7; + wire Pysfh7; + wire Fzsfh7; + wire Vzsfh7; + wire L0tfh7; + wire B1tfh7; + wire R1tfh7; + wire H2tfh7; + wire X2tfh7; + wire N3tfh7; + wire D4tfh7; + wire T4tfh7; + wire J5tfh7; + wire Z5tfh7; + wire P6tfh7; + wire F7tfh7; + wire V7tfh7; + wire L8tfh7; + wire B9tfh7; + wire R9tfh7; + wire Patfh7; + wire Obtfh7; + wire Tbtfh7; + wire Ybtfh7; + wire Dctfh7; + wire Jctfh7; + wire Pctfh7; + wire Vctfh7; + wire Bdtfh7; + wire Hdtfh7; + wire Ndtfh7; + wire Tdtfh7; + wire Zdtfh7; + wire Fetfh7; + wire Letfh7; + wire Retfh7; + wire Xetfh7; + wire Dftfh7; + wire Jftfh7; + wire Pftfh7; + wire Vftfh7; + wire Bgtfh7; + wire Hgtfh7; + wire Ngtfh7; + wire Tgtfh7; + wire Zgtfh7; + wire Fhtfh7; + wire Lhtfh7; + wire Rhtfh7; + wire Xhtfh7; + wire Ditfh7; + wire Jitfh7; + wire Pitfh7; + wire Vitfh7; + wire Bjtfh7; + wire Hjtfh7; + wire Njtfh7; + wire Tjtfh7; + wire Zjtfh7; + wire Fktfh7; + wire Lktfh7; + wire Rktfh7; + wire Xktfh7; + wire Dltfh7; + wire Jltfh7; + wire Pltfh7; + wire Vltfh7; + wire Bmtfh7; + wire Hmtfh7; + wire Nmtfh7; + wire Tmtfh7; + wire Zmtfh7; + wire Fntfh7; + wire Lntfh7; + wire Rntfh7; + wire Xntfh7; + wire Dotfh7; + wire Jotfh7; + wire Potfh7; + wire Votfh7; + wire Bptfh7; + wire Hptfh7; + wire Nptfh7; + wire Tptfh7; + wire Zptfh7; + wire Fqtfh7; + wire Lqtfh7; + wire Rqtfh7; + wire Xqtfh7; + wire Drtfh7; + wire Jrtfh7; + wire Prtfh7; + wire Vrtfh7; + wire Bstfh7; + wire Hstfh7; + wire Nstfh7; + wire Tstfh7; + wire Zstfh7; + wire Fttfh7; + wire Lttfh7; + wire Rttfh7; + wire Xttfh7; + wire Dutfh7; + wire Jutfh7; + wire Putfh7; + wire Vutfh7; + wire Bvtfh7; + wire Hvtfh7; + wire Nvtfh7; + wire Tvtfh7; + wire Zvtfh7; + wire Fwtfh7; + wire Lwtfh7; + wire Rwtfh7; + wire Xwtfh7; + wire Dxtfh7; + wire Jxtfh7; + wire Pxtfh7; + wire Vxtfh7; + wire Bytfh7; + wire Hytfh7; + wire Nytfh7; + wire Tytfh7; + wire Zytfh7; + wire Fztfh7; + wire Lztfh7; + wire Rztfh7; + wire Xztfh7; + wire D0ufh7; + wire J0ufh7; + wire P0ufh7; + wire V0ufh7; + wire B1ufh7; + wire H1ufh7; + wire N1ufh7; + wire T1ufh7; + wire Z1ufh7; + wire F2ufh7; + wire L2ufh7; + wire R2ufh7; + wire X2ufh7; + wire D3ufh7; + wire J3ufh7; + wire P3ufh7; + wire V3ufh7; + wire B4ufh7; + wire H4ufh7; + wire N4ufh7; + wire T4ufh7; + wire Z4ufh7; + wire F5ufh7; + wire L5ufh7; + wire R5ufh7; + wire X5ufh7; + wire D6ufh7; + wire J6ufh7; + wire P6ufh7; + wire V6ufh7; + wire B7ufh7; + wire H7ufh7; + wire N7ufh7; + wire T7ufh7; + wire Z7ufh7; + wire F8ufh7; + wire L8ufh7; + wire R8ufh7; + wire X8ufh7; + wire D9ufh7; + wire J9ufh7; + wire P9ufh7; + wire V9ufh7; + wire Baufh7; + wire Haufh7; + wire Naufh7; + wire Taufh7; + wire Zaufh7; + wire Fbufh7; + wire Lbufh7; + wire Rbufh7; + wire Xbufh7; + wire Dcufh7; + wire Jcufh7; + wire Pcufh7; + wire Vcufh7; + wire Bdufh7; + wire Hdufh7; + wire Ndufh7; + wire Tdufh7; + wire Zdufh7; + wire Feufh7; + wire Leufh7; + wire Reufh7; + wire Xeufh7; + wire Dfufh7; + wire Jfufh7; + wire Pfufh7; + wire Vfufh7; + wire Bgufh7; + wire Hgufh7; + wire Ngufh7; + wire Tgufh7; + wire Zgufh7; + wire Fhufh7; + wire Lhufh7; + wire Rhufh7; + wire Xhufh7; + wire Diufh7; + wire Jiufh7; + wire Piufh7; + wire Viufh7; + wire Bjufh7; + wire Hjufh7; + wire Njufh7; + wire Tjufh7; + wire Zjufh7; + wire Fkufh7; + wire Lkufh7; + wire Rkufh7; + wire Xkufh7; + wire Dlufh7; + wire Jlufh7; + wire Plufh7; + wire Vlufh7; + wire Bmufh7; + wire Hmufh7; + wire Nmufh7; + wire Tmufh7; + wire Zmufh7; + wire Fnufh7; + wire Lnufh7; + wire Rnufh7; + wire Xnufh7; + wire Doufh7; + wire Joufh7; + wire Poufh7; + wire Voufh7; + wire Bpufh7; + wire Hpufh7; + wire Npufh7; + wire Tpufh7; + wire Zpufh7; + wire Fqufh7; + wire Lqufh7; + wire Rqufh7; + wire Xqufh7; + wire Drufh7; + wire Jrufh7; + wire Prufh7; + wire Vrufh7; + wire Bsufh7; + wire Hsufh7; + wire Nsufh7; + wire Tsufh7; + wire Zsufh7; + wire Ftufh7; + wire Ltufh7; + wire Rtufh7; + wire Xtufh7; + wire Duufh7; + wire Juufh7; + wire Puufh7; + wire Vuufh7; + wire Bvufh7; + wire Hvufh7; + wire Nvufh7; + wire Tvufh7; + wire Zvufh7; + wire Fwufh7; + wire Lwufh7; + wire Rwufh7; + wire Xwufh7; + wire Dxufh7; + wire Jxufh7; + wire Pxufh7; + wire Vxufh7; + wire Byufh7; + wire Hyufh7; + wire Nyufh7; + wire Tyufh7; + wire Zyufh7; + wire Fzufh7; + wire Lzufh7; + wire Rzufh7; + wire Xzufh7; + wire D0vfh7; + wire J0vfh7; + wire P0vfh7; + wire V0vfh7; + wire B1vfh7; + wire H1vfh7; + wire N1vfh7; + wire T1vfh7; + wire Z1vfh7; + wire F2vfh7; + wire L2vfh7; + wire R2vfh7; + wire X2vfh7; + wire D3vfh7; + wire J3vfh7; + wire P3vfh7; + wire V3vfh7; + wire B4vfh7; + wire H4vfh7; + wire N4vfh7; + wire T4vfh7; + wire Z4vfh7; + wire F5vfh7; + wire L5vfh7; + wire R5vfh7; + wire X5vfh7; + wire D6vfh7; + wire J6vfh7; + wire P6vfh7; + wire V6vfh7; + wire B7vfh7; + wire H7vfh7; + wire N7vfh7; + wire T7vfh7; + wire Z7vfh7; + wire F8vfh7; + wire L8vfh7; + wire R8vfh7; + wire X8vfh7; + wire D9vfh7; + wire J9vfh7; + wire P9vfh7; + wire V9vfh7; + wire Bavfh7; + wire Havfh7; + wire Navfh7; + wire Tavfh7; + wire Zavfh7; + wire Fbvfh7; + wire Lbvfh7; + wire Rbvfh7; + wire Xbvfh7; + wire Dcvfh7; + wire Jcvfh7; + wire Pcvfh7; + wire Vcvfh7; + wire Bdvfh7; + wire Hdvfh7; + wire Ndvfh7; + wire Tdvfh7; + wire Zdvfh7; + wire Fevfh7; + wire Levfh7; + wire Revfh7; + wire Xevfh7; + wire Dfvfh7; + wire Jfvfh7; + wire Pfvfh7; + wire Vfvfh7; + wire Bgvfh7; + wire Hgvfh7; + wire Ngvfh7; + wire Tgvfh7; + wire Zgvfh7; + wire Fhvfh7; + wire Lhvfh7; + wire Rhvfh7; + wire Xhvfh7; + wire Divfh7; + wire Jivfh7; + wire Pivfh7; + wire Vivfh7; + wire Bjvfh7; + wire Hjvfh7; + wire Njvfh7; + wire Tjvfh7; + wire Zjvfh7; + wire Fkvfh7; + wire Lkvfh7; + wire Rkvfh7; + wire Xkvfh7; + wire Dlvfh7; + wire Jlvfh7; + wire Plvfh7; + wire Vlvfh7; + wire Bmvfh7; + wire Hmvfh7; + wire Nmvfh7; + wire Tmvfh7; + wire Zmvfh7; + wire Fnvfh7; + wire Lnvfh7; + wire Rnvfh7; + wire Xnvfh7; + wire Dovfh7; + wire Jovfh7; + wire Povfh7; + wire Vovfh7; + wire Bpvfh7; + wire Hpvfh7; + wire Npvfh7; + wire Tpvfh7; + wire Zpvfh7; + wire Fqvfh7; + wire Lqvfh7; + wire Rqvfh7; + wire Xqvfh7; + wire Drvfh7; + wire Jrvfh7; + wire Prvfh7; + wire Vrvfh7; + wire Bsvfh7; + wire Hsvfh7; + wire Nsvfh7; + wire Tsvfh7; + wire Zsvfh7; + wire Ftvfh7; + wire Ltvfh7; + wire Rtvfh7; + wire Xtvfh7; + wire Duvfh7; + wire Juvfh7; + wire Puvfh7; + wire Vuvfh7; + wire Bvvfh7; + wire Hvvfh7; + wire Nvvfh7; + wire Tvvfh7; + wire Zvvfh7; + wire Fwvfh7; + wire Lwvfh7; + wire Rwvfh7; + wire Xwvfh7; + wire Dxvfh7; + wire Jxvfh7; + wire Pxvfh7; + wire Vxvfh7; + wire Byvfh7; + wire Hyvfh7; + wire Nyvfh7; + wire Tyvfh7; + wire Zyvfh7; + wire Fzvfh7; + wire Lzvfh7; + wire Rzvfh7; + wire Xzvfh7; + wire D0wfh7; + wire J0wfh7; + wire P0wfh7; + wire V0wfh7; + wire B1wfh7; + wire H1wfh7; + wire N1wfh7; + wire T1wfh7; + wire Z1wfh7; + wire F2wfh7; + wire L2wfh7; + wire R2wfh7; + wire X2wfh7; + wire D3wfh7; + wire J3wfh7; + wire P3wfh7; + wire V3wfh7; + wire B4wfh7; + wire H4wfh7; + wire N4wfh7; + wire T4wfh7; + wire Z4wfh7; + wire F5wfh7; + wire L5wfh7; + wire R5wfh7; + wire X5wfh7; + wire D6wfh7; + wire J6wfh7; + wire P6wfh7; + wire V6wfh7; + wire B7wfh7; + wire H7wfh7; + wire N7wfh7; + wire T7wfh7; + wire Z7wfh7; + wire F8wfh7; + wire L8wfh7; + wire R8wfh7; + wire X8wfh7; + wire D9wfh7; + wire J9wfh7; + wire P9wfh7; + wire V9wfh7; + wire Bawfh7; + wire Hawfh7; + wire Nawfh7; + wire Tawfh7; + wire Zawfh7; + wire Fbwfh7; + wire Lbwfh7; + wire Rbwfh7; + wire Xbwfh7; + wire Dcwfh7; + wire Jcwfh7; + wire Pcwfh7; + wire Vcwfh7; + wire Bdwfh7; + wire Hdwfh7; + wire Ndwfh7; + wire Tdwfh7; + wire Zdwfh7; + wire Fewfh7; + wire Lewfh7; + wire Rewfh7; + wire Xewfh7; + wire Dfwfh7; + wire Jfwfh7; + wire Pfwfh7; + wire Vfwfh7; + wire Bgwfh7; + wire Hgwfh7; + wire Ngwfh7; + wire Tgwfh7; + wire Zgwfh7; + wire Fhwfh7; + wire Lhwfh7; + wire Rhwfh7; + wire Xhwfh7; + wire Diwfh7; + wire Jiwfh7; + wire Piwfh7; + wire Viwfh7; + wire Bjwfh7; + wire Hjwfh7; + wire Njwfh7; + wire Tjwfh7; + wire Zjwfh7; + wire Fkwfh7; + wire Lkwfh7; + wire Rkwfh7; + wire Xkwfh7; + wire Dlwfh7; + wire Jlwfh7; + wire Plwfh7; + wire Vlwfh7; + wire Bmwfh7; + wire Hmwfh7; + wire Nmwfh7; + wire Tmwfh7; + wire Zmwfh7; + wire Fnwfh7; + wire Lnwfh7; + wire Rnwfh7; + wire Xnwfh7; + wire Dowfh7; + wire Jowfh7; + wire Powfh7; + wire Vowfh7; + wire Bpwfh7; + wire Hpwfh7; + wire Npwfh7; + wire Tpwfh7; + wire Zpwfh7; + wire Fqwfh7; + wire Lqwfh7; + wire Rqwfh7; + wire Xqwfh7; + wire Drwfh7; + wire Jrwfh7; + wire Prwfh7; + wire Vrwfh7; + wire Bswfh7; + wire Hswfh7; + wire Nswfh7; + wire Tswfh7; + wire Zswfh7; + wire Ftwfh7; + wire Ltwfh7; + wire Rtwfh7; + wire Xtwfh7; + wire Duwfh7; + wire Juwfh7; + wire Puwfh7; + wire Vuwfh7; + wire Bvwfh7; + wire Hvwfh7; + wire Nvwfh7; + wire Tvwfh7; + wire Zvwfh7; + wire Fwwfh7; + wire Lwwfh7; + wire Rwwfh7; + wire Xwwfh7; + wire Dxwfh7; + wire Jxwfh7; + wire Pxwfh7; + wire Vxwfh7; + wire Bywfh7; + wire Hywfh7; + wire Nywfh7; + wire Tywfh7; + wire Zywfh7; + wire Fzwfh7; + wire Lzwfh7; + wire Rzwfh7; + wire Xzwfh7; + wire D0xfh7; + wire J0xfh7; + wire P0xfh7; + wire V0xfh7; + wire B1xfh7; + wire H1xfh7; + wire N1xfh7; + wire T1xfh7; + wire Z1xfh7; + wire F2xfh7; + wire L2xfh7; + wire R2xfh7; + wire X2xfh7; + wire D3xfh7; + wire J3xfh7; + wire P3xfh7; + wire V3xfh7; + wire B4xfh7; + wire H4xfh7; + wire N4xfh7; + wire T4xfh7; + wire Z4xfh7; + wire F5xfh7; + wire L5xfh7; + wire R5xfh7; + wire X5xfh7; + wire D6xfh7; + wire J6xfh7; + wire P6xfh7; + wire V6xfh7; + wire B7xfh7; + wire H7xfh7; + wire N7xfh7; + wire T7xfh7; + wire Z7xfh7; + wire F8xfh7; + wire L8xfh7; + wire R8xfh7; + wire X8xfh7; + wire D9xfh7; + wire J9xfh7; + wire P9xfh7; + wire V9xfh7; + wire Baxfh7; + wire Haxfh7; + wire Naxfh7; + wire Taxfh7; + wire Zaxfh7; + wire Fbxfh7; + wire Lbxfh7; + wire Rbxfh7; + wire Xbxfh7; + wire Dcxfh7; + wire Jcxfh7; + wire Pcxfh7; + wire Vcxfh7; + wire Bdxfh7; + wire Hdxfh7; + wire Ndxfh7; + wire Tdxfh7; + wire Zdxfh7; + wire Fexfh7; + wire Lexfh7; + wire Rexfh7; + wire Xexfh7; + wire Dfxfh7; + wire Jfxfh7; + wire Pfxfh7; + wire Vfxfh7; + wire Bgxfh7; + wire Hgxfh7; + wire Ngxfh7; + wire Tgxfh7; + wire Zgxfh7; + wire Fhxfh7; + wire Lhxfh7; + wire Rhxfh7; + wire Xhxfh7; + wire Dixfh7; + wire Jixfh7; + wire Pixfh7; + wire Vixfh7; + wire Bjxfh7; + wire Hjxfh7; + wire Njxfh7; + wire Tjxfh7; + wire Zjxfh7; + wire Fkxfh7; + wire Lkxfh7; + wire Rkxfh7; + wire Xkxfh7; + wire Dlxfh7; + wire Jlxfh7; + wire Plxfh7; + wire Vlxfh7; + wire Bmxfh7; + wire Hmxfh7; + wire Nmxfh7; + wire Tmxfh7; + wire Zmxfh7; + wire Fnxfh7; + wire Lnxfh7; + wire Rnxfh7; + wire Xnxfh7; + wire Doxfh7; + wire Joxfh7; + wire Poxfh7; + wire Voxfh7; + wire Bpxfh7; + wire Hpxfh7; + wire Npxfh7; + wire Tpxfh7; + wire Zpxfh7; + wire Fqxfh7; + wire Lqxfh7; + wire Rqxfh7; + wire Xqxfh7; + wire Drxfh7; + wire Jrxfh7; + wire Prxfh7; + wire Vrxfh7; + wire Bsxfh7; + wire Hsxfh7; + wire Nsxfh7; + wire Tsxfh7; + wire Zsxfh7; + wire Ftxfh7; + wire Ltxfh7; + wire Rtxfh7; + wire Xtxfh7; + wire Duxfh7; + wire Juxfh7; + wire Puxfh7; + wire Vuxfh7; + wire Bvxfh7; + wire Hvxfh7; + wire Nvxfh7; + wire Tvxfh7; + wire Zvxfh7; + wire Fwxfh7; + wire Lwxfh7; + wire Rwxfh7; + wire Xwxfh7; + wire Dxxfh7; + wire Jxxfh7; + wire Pxxfh7; + wire Vxxfh7; + wire Byxfh7; + wire Hyxfh7; + wire Nyxfh7; + wire Tyxfh7; + wire Zyxfh7; + wire Fzxfh7; + wire Lzxfh7; + wire Rzxfh7; + wire Xzxfh7; + wire D0yfh7; + wire J0yfh7; + wire P0yfh7; + wire V0yfh7; + wire B1yfh7; + wire H1yfh7; + wire N1yfh7; + wire T1yfh7; + wire Z1yfh7; + wire F2yfh7; + wire L2yfh7; + wire R2yfh7; + wire X2yfh7; + wire D3yfh7; + wire J3yfh7; + wire P3yfh7; + wire V3yfh7; + wire B4yfh7; + wire H4yfh7; + wire N4yfh7; + wire T4yfh7; + wire Z4yfh7; + wire F5yfh7; + wire L5yfh7; + wire R5yfh7; + wire X5yfh7; + wire D6yfh7; + wire J6yfh7; + wire P6yfh7; + wire V6yfh7; + wire B7yfh7; + wire H7yfh7; + wire N7yfh7; + wire T7yfh7; + wire Z7yfh7; + wire F8yfh7; + wire L8yfh7; + wire R8yfh7; + wire X8yfh7; + wire D9yfh7; + wire J9yfh7; + wire P9yfh7; + wire V9yfh7; + wire Bayfh7; + wire Hayfh7; + wire Nayfh7; + wire Tayfh7; + wire Zayfh7; + wire Fbyfh7; + wire Lbyfh7; + wire Rbyfh7; + wire Xbyfh7; + wire Dcyfh7; + wire Jcyfh7; + wire Pcyfh7; + wire Vcyfh7; + wire Bdyfh7; + wire Hdyfh7; + wire Ndyfh7; + wire Tdyfh7; + wire Zdyfh7; + wire Feyfh7; + wire Leyfh7; + wire Reyfh7; + wire Xeyfh7; + wire Dfyfh7; + wire Jfyfh7; + wire Pfyfh7; + wire Vfyfh7; + wire Bgyfh7; + wire Hgyfh7; + wire Ngyfh7; + wire Tgyfh7; + wire Zgyfh7; + wire Fhyfh7; + wire Lhyfh7; + wire Rhyfh7; + wire Xhyfh7; + wire Diyfh7; + wire Jiyfh7; + wire Piyfh7; + wire Viyfh7; + wire Bjyfh7; + wire Hjyfh7; + wire Njyfh7; + wire Tjyfh7; + wire Zjyfh7; + wire Fkyfh7; + wire Lkyfh7; + wire Rkyfh7; + wire Xkyfh7; + wire Dlyfh7; + wire Jlyfh7; + wire Plyfh7; + wire Vlyfh7; + wire Bmyfh7; + wire Hmyfh7; + wire Nmyfh7; + wire Tmyfh7; + wire Zmyfh7; + wire Fnyfh7; + wire Lnyfh7; + wire Rnyfh7; + wire Xnyfh7; + wire Doyfh7; + wire Joyfh7; + wire Poyfh7; + wire Voyfh7; + wire Bpyfh7; + wire Hpyfh7; + wire Npyfh7; + wire Tpyfh7; + wire Zpyfh7; + wire Fqyfh7; + wire Lqyfh7; + wire Rqyfh7; + wire Xqyfh7; + wire Dryfh7; + wire Jryfh7; + wire Pryfh7; + wire Vryfh7; + wire Bsyfh7; + wire Hsyfh7; + wire Nsyfh7; + wire Tsyfh7; + wire Zsyfh7; + wire Ftyfh7; + wire Ltyfh7; + wire Rtyfh7; + wire Xtyfh7; + wire Duyfh7; + wire Juyfh7; + wire Puyfh7; + wire Vuyfh7; + wire Bvyfh7; + wire Hvyfh7; + wire Nvyfh7; + wire Tvyfh7; + wire Zvyfh7; + wire Fwyfh7; + wire Lwyfh7; + wire Rwyfh7; + wire Xwyfh7; + wire Dxyfh7; + wire Jxyfh7; + wire Pxyfh7; + wire Vxyfh7; + wire Byyfh7; + wire Hyyfh7; + wire Nyyfh7; + wire Tyyfh7; + wire Zyyfh7; + wire Fzyfh7; + wire Lzyfh7; + wire Rzyfh7; + wire Xzyfh7; + wire D0zfh7; + wire J0zfh7; + wire P0zfh7; + wire V0zfh7; + wire B1zfh7; + wire H1zfh7; + wire N1zfh7; + wire T1zfh7; + wire Z1zfh7; + wire F2zfh7; + wire L2zfh7; + wire R2zfh7; + wire X2zfh7; + wire D3zfh7; + wire J3zfh7; + wire P3zfh7; + wire V3zfh7; + wire B4zfh7; + wire H4zfh7; + wire N4zfh7; + wire T4zfh7; + wire Z4zfh7; + wire F5zfh7; + wire L5zfh7; + wire R5zfh7; + wire X5zfh7; + wire D6zfh7; + wire J6zfh7; + wire P6zfh7; + wire V6zfh7; + wire B7zfh7; + wire H7zfh7; + wire N7zfh7; + wire T7zfh7; + wire Z7zfh7; + wire F8zfh7; + wire L8zfh7; + wire R8zfh7; + wire X8zfh7; + wire D9zfh7; + wire J9zfh7; + wire P9zfh7; + wire V9zfh7; + wire Bazfh7; + wire Hazfh7; + wire Nazfh7; + wire Tazfh7; + wire Zazfh7; + wire Fbzfh7; + wire Lbzfh7; + wire Rbzfh7; + wire Xbzfh7; + wire Dczfh7; + wire Jczfh7; + wire Pczfh7; + wire Vczfh7; + wire Bdzfh7; + wire Hdzfh7; + wire Ndzfh7; + wire Tdzfh7; + wire Zdzfh7; + wire Fezfh7; + wire Lezfh7; + wire Rezfh7; + wire Xezfh7; + wire Dfzfh7; + wire Jfzfh7; + wire Pfzfh7; + wire Vfzfh7; + wire Bgzfh7; + wire Hgzfh7; + wire Ngzfh7; + wire Tgzfh7; + wire Zgzfh7; + wire Fhzfh7; + wire Lhzfh7; + wire Rhzfh7; + wire Xhzfh7; + wire Dizfh7; + wire Jizfh7; + wire Pizfh7; + wire Vizfh7; + wire Bjzfh7; + wire Hjzfh7; + wire Njzfh7; + wire Tjzfh7; + wire Zjzfh7; + wire Fkzfh7; + wire Lkzfh7; + wire Rkzfh7; + wire Xkzfh7; + wire Dlzfh7; + wire Jlzfh7; + wire Plzfh7; + wire Vlzfh7; + wire Bmzfh7; + wire Hmzfh7; + wire Nmzfh7; + wire Tmzfh7; + wire Zmzfh7; + wire Fnzfh7; + wire Lnzfh7; + wire Rnzfh7; + wire Xnzfh7; + wire Dozfh7; + wire Jozfh7; + wire Pozfh7; + wire Vozfh7; + wire Bpzfh7; + wire Hpzfh7; + wire Npzfh7; + wire Tpzfh7; + wire Zpzfh7; + wire Fqzfh7; + wire Lqzfh7; + wire Rqzfh7; + wire Xqzfh7; + wire Drzfh7; + wire Jrzfh7; + wire Przfh7; + wire Vrzfh7; + wire Bszfh7; + wire Hszfh7; + wire Nszfh7; + wire Tszfh7; + wire Zszfh7; + wire Ftzfh7; + wire Ltzfh7; + wire Rtzfh7; + wire Xtzfh7; + wire Duzfh7; + wire Juzfh7; + wire Puzfh7; + wire Vuzfh7; + wire Bvzfh7; + wire Hvzfh7; + wire Nvzfh7; + wire Tvzfh7; + wire Zvzfh7; + wire Fwzfh7; + wire Lwzfh7; + wire Rwzfh7; + wire Xwzfh7; + wire Dxzfh7; + wire Jxzfh7; + wire Pxzfh7; + wire Vxzfh7; + wire Byzfh7; + wire Hyzfh7; + wire Nyzfh7; + wire Tyzfh7; + wire Zyzfh7; + wire Fzzfh7; + wire Lzzfh7; + wire Rzzfh7; + wire Xzzfh7; + wire D00gh7; + wire J00gh7; + wire P00gh7; + wire V00gh7; + wire B10gh7; + wire H10gh7; + wire N10gh7; + wire T10gh7; + wire Z10gh7; + wire F20gh7; + wire L20gh7; + wire R20gh7; + wire X20gh7; + wire D30gh7; + wire J30gh7; + wire P30gh7; + wire V30gh7; + wire B40gh7; + wire H40gh7; + wire N40gh7; + wire T40gh7; + wire Z40gh7; + wire F50gh7; + wire L50gh7; + wire R50gh7; + wire X50gh7; + wire D60gh7; + wire J60gh7; + wire P60gh7; + wire V60gh7; + wire B70gh7; + wire H70gh7; + wire N70gh7; + wire T70gh7; + wire Z70gh7; + wire F80gh7; + wire L80gh7; + wire R80gh7; + wire X80gh7; + wire D90gh7; + wire J90gh7; + wire P90gh7; + wire V90gh7; + wire Ba0gh7; + wire Ha0gh7; + wire Na0gh7; + wire Ta0gh7; + wire Za0gh7; + wire Fb0gh7; + wire Lb0gh7; + wire Rb0gh7; + wire Xb0gh7; + wire Dc0gh7; + wire Jc0gh7; + wire Pc0gh7; + wire Vc0gh7; + wire Bd0gh7; + wire Hd0gh7; + wire Nd0gh7; + wire Td0gh7; + wire Zd0gh7; + wire Fe0gh7; + wire Le0gh7; + wire Re0gh7; + wire Xe0gh7; + wire Df0gh7; + wire Jf0gh7; + wire Pf0gh7; + wire Vf0gh7; + wire Bg0gh7; + wire Hg0gh7; + wire Ng0gh7; + wire Tg0gh7; + wire Zg0gh7; + wire Fh0gh7; + wire Lh0gh7; + wire Rh0gh7; + wire Xh0gh7; + wire Di0gh7; + wire Ji0gh7; + wire Pi0gh7; + wire Vi0gh7; + wire Bj0gh7; + wire Hj0gh7; + wire Nj0gh7; + wire Tj0gh7; + wire Zj0gh7; + wire Fk0gh7; + wire Lk0gh7; + wire Rk0gh7; + wire Xk0gh7; + wire Dl0gh7; + wire Jl0gh7; + wire Pl0gh7; + wire Vl0gh7; + wire Bm0gh7; + wire Hm0gh7; + wire Nm0gh7; + wire Tm0gh7; + wire Zm0gh7; + wire Fn0gh7; + wire Ln0gh7; + wire Rn0gh7; + wire Xn0gh7; + wire Do0gh7; + wire Jo0gh7; + wire Po0gh7; + wire Vo0gh7; + wire Bp0gh7; + wire Hp0gh7; + wire Np0gh7; + wire Tp0gh7; + wire Zp0gh7; + wire Fq0gh7; + wire Lq0gh7; + wire Rq0gh7; + wire Xq0gh7; + wire Dr0gh7; + wire Jr0gh7; + wire Pr0gh7; + wire Vr0gh7; + wire Bs0gh7; + wire Hs0gh7; + wire Ns0gh7; + wire Ts0gh7; + wire Zs0gh7; + wire Ft0gh7; + wire Lt0gh7; + wire Rt0gh7; + wire Xt0gh7; + wire Du0gh7; + wire Ju0gh7; + wire Pu0gh7; + wire Vu0gh7; + wire Bv0gh7; + wire Hv0gh7; + wire Nv0gh7; + wire Tv0gh7; + wire Zv0gh7; + wire Fw0gh7; + wire Lw0gh7; + wire Rw0gh7; + wire Xw0gh7; + wire Dx0gh7; + wire Jx0gh7; + wire Px0gh7; + wire Vx0gh7; + wire By0gh7; + wire Hy0gh7; + wire Ny0gh7; + wire Ty0gh7; + wire Zy0gh7; + wire Fz0gh7; + wire Lz0gh7; + wire Rz0gh7; + wire Xz0gh7; + wire D01gh7; + wire J01gh7; + wire P01gh7; + wire V01gh7; + wire B11gh7; + wire H11gh7; + wire N11gh7; + wire T11gh7; + wire Z11gh7; + wire F21gh7; + wire L21gh7; + wire R21gh7; + wire X21gh7; + wire D31gh7; + wire J31gh7; + wire P31gh7; + wire V31gh7; + wire B41gh7; + wire H41gh7; + wire N41gh7; + wire T41gh7; + wire Z41gh7; + wire F51gh7; + wire L51gh7; + wire R51gh7; + wire X51gh7; + wire D61gh7; + wire J61gh7; + wire P61gh7; + wire V61gh7; + wire B71gh7; + wire H71gh7; + wire N71gh7; + wire T71gh7; + wire Z71gh7; + wire F81gh7; + wire L81gh7; + wire R81gh7; + wire X81gh7; + wire D91gh7; + wire J91gh7; + wire P91gh7; + wire V91gh7; + wire Ba1gh7; + wire Ha1gh7; + wire Na1gh7; + wire Ta1gh7; + wire Za1gh7; + wire Fb1gh7; + wire Lb1gh7; + wire Rb1gh7; + wire Xb1gh7; + wire Dc1gh7; + wire Jc1gh7; + wire Pc1gh7; + wire Vc1gh7; + wire Bd1gh7; + wire Hd1gh7; + wire Nd1gh7; + wire Td1gh7; + wire Zd1gh7; + wire Fe1gh7; + wire Le1gh7; + wire Re1gh7; + wire Xe1gh7; + wire Df1gh7; + wire Jf1gh7; + wire Pf1gh7; + wire Vf1gh7; + wire Bg1gh7; + wire Hg1gh7; + wire Ng1gh7; + wire Tg1gh7; + wire Zg1gh7; + wire Fh1gh7; + wire Lh1gh7; + wire Rh1gh7; + wire Xh1gh7; + wire Di1gh7; + wire Ji1gh7; + wire Pi1gh7; + wire Vi1gh7; + wire Bj1gh7; + wire Hj1gh7; + wire Nj1gh7; + wire Tj1gh7; + wire Zj1gh7; + wire Fk1gh7; + wire Lk1gh7; + wire Rk1gh7; + wire Xk1gh7; + wire Dl1gh7; + wire Jl1gh7; + wire Pl1gh7; + wire Vl1gh7; + wire Bm1gh7; + wire Hm1gh7; + wire Nm1gh7; + wire Tm1gh7; + wire Zm1gh7; + wire Fn1gh7; + wire Ln1gh7; + wire Rn1gh7; + wire Xn1gh7; + wire Do1gh7; + wire Jo1gh7; + wire Po1gh7; + wire Vo1gh7; + wire Bp1gh7; + wire Hp1gh7; + wire Np1gh7; + wire Tp1gh7; + wire Zp1gh7; + wire Fq1gh7; + wire Lq1gh7; + wire Rq1gh7; + wire Xq1gh7; + wire Dr1gh7; + wire Jr1gh7; + wire Pr1gh7; + wire Vr1gh7; + wire Bs1gh7; + wire Hs1gh7; + wire Ns1gh7; + wire Ts1gh7; + wire Zs1gh7; + wire Ft1gh7; + wire Lt1gh7; + wire Rt1gh7; + wire Xt1gh7; + wire Du1gh7; + wire Ju1gh7; + wire Pu1gh7; + wire Vu1gh7; + wire Bv1gh7; + wire Hv1gh7; + wire Nv1gh7; + wire Tv1gh7; + wire Zv1gh7; + wire Fw1gh7; + wire Lw1gh7; + wire Rw1gh7; + wire Xw1gh7; + wire Dx1gh7; + wire Jx1gh7; + wire Px1gh7; + wire Vx1gh7; + wire By1gh7; + wire Hy1gh7; + wire Ny1gh7; + wire Ty1gh7; + wire Zy1gh7; + wire Fz1gh7; + wire Lz1gh7; + wire Rz1gh7; + wire Xz1gh7; + wire D02gh7; + wire J02gh7; + wire P02gh7; + wire V02gh7; + wire B12gh7; + wire H12gh7; + wire N12gh7; + wire T12gh7; + wire Z12gh7; + wire F22gh7; + wire L22gh7; + wire R22gh7; + wire X22gh7; + wire D32gh7; + wire J32gh7; + wire P32gh7; + wire V32gh7; + wire B42gh7; + wire H42gh7; + wire N42gh7; + wire T42gh7; + wire Z42gh7; + wire F52gh7; + wire L52gh7; + wire R52gh7; + wire X52gh7; + wire D62gh7; + wire J62gh7; + wire P62gh7; + wire V62gh7; + wire B72gh7; + wire H72gh7; + wire N72gh7; + wire T72gh7; + wire Z72gh7; + wire F82gh7; + wire L82gh7; + wire R82gh7; + wire X82gh7; + wire D92gh7; + wire J92gh7; + wire P92gh7; + wire V92gh7; + wire Ba2gh7; + wire Ha2gh7; + wire Na2gh7; + wire Ta2gh7; + wire Za2gh7; + wire Fb2gh7; + wire Lb2gh7; + wire Rb2gh7; + wire Xb2gh7; + wire Dc2gh7; + wire Jc2gh7; + wire Pc2gh7; + wire Vc2gh7; + wire Bd2gh7; + wire Hd2gh7; + wire Nd2gh7; + wire Td2gh7; + wire Zd2gh7; + wire Fe2gh7; + wire Le2gh7; + wire Re2gh7; + wire Xe2gh7; + wire Df2gh7; + wire Jf2gh7; + wire Pf2gh7; + wire Vf2gh7; + wire Bg2gh7; + wire Hg2gh7; + wire Ng2gh7; + wire Tg2gh7; + wire Zg2gh7; + wire Fh2gh7; + wire Lh2gh7; + wire Rh2gh7; + wire Xh2gh7; + wire Di2gh7; + wire Ji2gh7; + wire Pi2gh7; + wire Vi2gh7; + wire Bj2gh7; + wire Hj2gh7; + wire Nj2gh7; + wire Tj2gh7; + wire Zj2gh7; + wire Fk2gh7; + wire Lk2gh7; + wire Rk2gh7; + wire Xk2gh7; + wire Dl2gh7; + wire Jl2gh7; + wire Pl2gh7; + wire Vl2gh7; + wire Bm2gh7; + wire Hm2gh7; + wire Nm2gh7; + wire Tm2gh7; + wire Zm2gh7; + wire Fn2gh7; + wire Ln2gh7; + wire Rn2gh7; + wire Xn2gh7; + wire Do2gh7; + wire Jo2gh7; + wire Po2gh7; + wire Vo2gh7; + wire Bp2gh7; + wire Hp2gh7; + wire Np2gh7; + wire Tp2gh7; + wire Zp2gh7; + wire Fq2gh7; + wire Lq2gh7; + wire Rq2gh7; + wire Xq2gh7; + wire Dr2gh7; + wire Jr2gh7; + wire Pr2gh7; + wire Vr2gh7; + wire Bs2gh7; + wire Hs2gh7; + wire Ns2gh7; + wire Ts2gh7; + wire Zs2gh7; + wire Ft2gh7; + wire Lt2gh7; + wire Rt2gh7; + wire Xt2gh7; + wire Du2gh7; + wire Ju2gh7; + wire Pu2gh7; + wire Vu2gh7; + wire Bv2gh7; + wire Hv2gh7; + wire Nv2gh7; + wire Tv2gh7; + wire Zv2gh7; + wire Fw2gh7; + wire Lw2gh7; + wire Rw2gh7; + wire Xw2gh7; + wire Dx2gh7; + wire Jx2gh7; + wire Px2gh7; + wire Vx2gh7; + wire By2gh7; + wire Hy2gh7; + wire Ny2gh7; + wire Ty2gh7; + wire Zy2gh7; + wire Fz2gh7; + wire Lz2gh7; + wire Rz2gh7; + wire Xz2gh7; + wire D03gh7; + wire J03gh7; + wire P03gh7; + wire V03gh7; + wire B13gh7; + wire H13gh7; + wire N13gh7; + wire T13gh7; + wire Z13gh7; + wire F23gh7; + wire L23gh7; + wire R23gh7; + wire X23gh7; + wire D33gh7; + wire J33gh7; + wire P33gh7; + wire V33gh7; + wire B43gh7; + wire H43gh7; + wire N43gh7; + wire T43gh7; + wire Z43gh7; + wire F53gh7; + wire L53gh7; + wire R53gh7; + wire X53gh7; + wire D63gh7; + wire J63gh7; + wire P63gh7; + wire V63gh7; + wire B73gh7; + wire H73gh7; + wire N73gh7; + wire T73gh7; + wire Z73gh7; + wire F83gh7; + wire L83gh7; + wire R83gh7; + wire X83gh7; + wire D93gh7; + wire J93gh7; + wire P93gh7; + wire V93gh7; + wire Ba3gh7; + wire Ha3gh7; + wire Na3gh7; + wire Ta3gh7; + wire Za3gh7; + wire Fb3gh7; + wire Lb3gh7; + wire Rb3gh7; + wire Xb3gh7; + wire Dc3gh7; + wire Jc3gh7; + wire Pc3gh7; + wire Vc3gh7; + wire Bd3gh7; + wire Hd3gh7; + wire Nd3gh7; + wire Td3gh7; + wire Zd3gh7; + wire Fe3gh7; + wire Le3gh7; + wire Re3gh7; + wire Xe3gh7; + wire Df3gh7; + wire Jf3gh7; + wire Pf3gh7; + wire Vf3gh7; + wire Bg3gh7; + wire Hg3gh7; + wire Ng3gh7; + wire Tg3gh7; + wire Zg3gh7; + wire Fh3gh7; + wire Lh3gh7; + wire Rh3gh7; + wire Xh3gh7; + wire Di3gh7; + wire Ji3gh7; + wire Pi3gh7; + wire Vi3gh7; + wire Bj3gh7; + wire Hj3gh7; + wire Nj3gh7; + wire Tj3gh7; + wire Zj3gh7; + wire Fk3gh7; + wire Lk3gh7; + wire Rk3gh7; + wire Xk3gh7; + wire Dl3gh7; + wire Jl3gh7; + wire Pl3gh7; + wire Vl3gh7; + wire Bm3gh7; + wire Hm3gh7; + wire Nm3gh7; + wire Tm3gh7; + wire Zm3gh7; + wire Fn3gh7; + wire Ln3gh7; + wire Rn3gh7; + wire Xn3gh7; + wire Do3gh7; + wire Jo3gh7; + wire Po3gh7; + wire Vo3gh7; + wire Bp3gh7; + wire Hp3gh7; + wire Np3gh7; + wire Tp3gh7; + wire Zp3gh7; + wire Fq3gh7; + wire Lq3gh7; + wire Rq3gh7; + wire Xq3gh7; + wire Dr3gh7; + wire Jr3gh7; + wire Pr3gh7; + wire Vr3gh7; + wire Bs3gh7; + wire Hs3gh7; + wire Ns3gh7; + wire Ts3gh7; + wire Zs3gh7; + wire Ft3gh7; + wire Lt3gh7; + wire Rt3gh7; + wire Xt3gh7; + wire Du3gh7; + wire Ju3gh7; + wire Pu3gh7; + wire Vu3gh7; + wire Bv3gh7; + wire Hv3gh7; + wire Nv3gh7; + wire Tv3gh7; + wire Zv3gh7; + wire Fw3gh7; + wire Lw3gh7; + wire Rw3gh7; + wire Xw3gh7; + wire Dx3gh7; + wire Jx3gh7; + wire Px3gh7; + wire Vx3gh7; + wire By3gh7; + wire Hy3gh7; + wire Ny3gh7; + wire Ty3gh7; + wire Zy3gh7; + wire Fz3gh7; + wire Lz3gh7; + wire Rz3gh7; + wire Xz3gh7; + wire D04gh7; + wire J04gh7; + wire P04gh7; + wire V04gh7; + wire B14gh7; + wire H14gh7; + wire N14gh7; + wire T14gh7; + wire Z14gh7; + wire F24gh7; + wire L24gh7; + wire R24gh7; + wire X24gh7; + wire D34gh7; + wire J34gh7; + wire P34gh7; + wire V34gh7; + wire B44gh7; + wire H44gh7; + wire N44gh7; + wire T44gh7; + wire Z44gh7; + wire F54gh7; + wire L54gh7; + wire R54gh7; + wire X54gh7; + wire D64gh7; + wire J64gh7; + wire P64gh7; + wire V64gh7; + wire B74gh7; + wire H74gh7; + wire N74gh7; + wire T74gh7; + wire Z74gh7; + wire F84gh7; + wire L84gh7; + wire R84gh7; + wire X84gh7; + wire D94gh7; + wire J94gh7; + wire P94gh7; + wire V94gh7; + wire Ba4gh7; + wire Ha4gh7; + wire Na4gh7; + wire Ta4gh7; + wire Za4gh7; + wire Fb4gh7; + wire Lb4gh7; + wire Rb4gh7; + wire Xb4gh7; + wire Dc4gh7; + wire Jc4gh7; + wire Pc4gh7; + wire Vc4gh7; + wire Bd4gh7; + wire Hd4gh7; + wire Nd4gh7; + wire Td4gh7; + wire Zd4gh7; + wire Fe4gh7; + wire Le4gh7; + wire Re4gh7; + wire Xe4gh7; + wire Df4gh7; + wire Jf4gh7; + wire Pf4gh7; + wire Vf4gh7; + wire Bg4gh7; + wire Hg4gh7; + wire Ng4gh7; + wire Tg4gh7; + wire Zg4gh7; + wire Fh4gh7; + wire Lh4gh7; + wire Rh4gh7; + wire Xh4gh7; + wire Di4gh7; + wire Ji4gh7; + wire Pi4gh7; + wire Vi4gh7; + wire Bj4gh7; + wire Hj4gh7; + wire Nj4gh7; + wire Tj4gh7; + wire Zj4gh7; + wire Fk4gh7; + wire Lk4gh7; + wire Rk4gh7; + wire Xk4gh7; + wire Dl4gh7; + wire Jl4gh7; + wire Pl4gh7; + wire Vl4gh7; + wire Bm4gh7; + wire Hm4gh7; + wire Nm4gh7; + wire Tm4gh7; + wire Zm4gh7; + wire Fn4gh7; + wire Ln4gh7; + wire Rn4gh7; + wire Xn4gh7; + wire Do4gh7; + wire Jo4gh7; + wire Po4gh7; + wire Vo4gh7; + wire Bp4gh7; + wire Hp4gh7; + wire Np4gh7; + wire Tp4gh7; + wire Zp4gh7; + wire Fq4gh7; + wire Lq4gh7; + wire Rq4gh7; + wire Xq4gh7; + wire Dr4gh7; + wire Jr4gh7; + wire Pr4gh7; + wire Vr4gh7; + wire Bs4gh7; + wire Hs4gh7; + wire Ns4gh7; + wire Ts4gh7; + wire Zs4gh7; + wire Ft4gh7; + wire Lt4gh7; + wire Rt4gh7; + wire Xt4gh7; + wire Du4gh7; + wire Ju4gh7; + wire Pu4gh7; + wire Vu4gh7; + wire Bv4gh7; + wire Hv4gh7; + wire Nv4gh7; + wire Tv4gh7; + wire Zv4gh7; + wire Fw4gh7; + wire Lw4gh7; + wire Rw4gh7; + wire Xw4gh7; + wire Dx4gh7; + wire Jx4gh7; + wire Px4gh7; + wire Vx4gh7; + wire By4gh7; + wire Hy4gh7; + wire Ny4gh7; + wire Ty4gh7; + wire Zy4gh7; + wire Fz4gh7; + wire Lz4gh7; + wire Rz4gh7; + wire Xz4gh7; + wire D05gh7; + wire J05gh7; + wire P05gh7; + wire V05gh7; + wire B15gh7; + wire H15gh7; + wire N15gh7; + wire T15gh7; + wire Z15gh7; + wire F25gh7; + wire L25gh7; + wire R25gh7; + wire X25gh7; + wire D35gh7; + wire J35gh7; + wire P35gh7; + wire V35gh7; + wire B45gh7; + wire H45gh7; + wire N45gh7; + wire T45gh7; + wire Z45gh7; + wire F55gh7; + wire L55gh7; + wire R55gh7; + wire X55gh7; + wire D65gh7; + wire J65gh7; + wire P65gh7; + wire V65gh7; + wire B75gh7; + wire H75gh7; + wire N75gh7; + wire T75gh7; + wire Z75gh7; + wire F85gh7; + wire L85gh7; + wire R85gh7; + wire X85gh7; + wire D95gh7; + wire J95gh7; + wire P95gh7; + wire V95gh7; + wire Ba5gh7; + wire Ha5gh7; + wire Na5gh7; + wire Ta5gh7; + wire Za5gh7; + wire Fb5gh7; + wire Lb5gh7; + wire Rb5gh7; + wire Xb5gh7; + wire Dc5gh7; + wire Jc5gh7; + wire Pc5gh7; + wire Vc5gh7; + wire Bd5gh7; + wire Hd5gh7; + wire Nd5gh7; + wire Td5gh7; + wire Zd5gh7; + wire Fe5gh7; + wire Le5gh7; + wire Re5gh7; + wire Xe5gh7; + wire Df5gh7; + wire Jf5gh7; + wire Pf5gh7; + wire Vf5gh7; + wire Bg5gh7; + wire Hg5gh7; + wire Ng5gh7; + wire Tg5gh7; + wire Zg5gh7; + wire Fh5gh7; + wire Lh5gh7; + wire Rh5gh7; + wire Xh5gh7; + wire Di5gh7; + wire Ji5gh7; + wire Pi5gh7; + wire Vi5gh7; + wire Bj5gh7; + wire Hj5gh7; + wire Nj5gh7; + wire Tj5gh7; + wire Zj5gh7; + wire Fk5gh7; + wire Lk5gh7; + wire Rk5gh7; + wire Xk5gh7; + wire Dl5gh7; + wire Jl5gh7; + wire Pl5gh7; + wire Vl5gh7; + wire Bm5gh7; + wire Hm5gh7; + wire Nm5gh7; + wire Tm5gh7; + wire Zm5gh7; + wire Fn5gh7; + wire Ln5gh7; + wire Rn5gh7; + wire Xn5gh7; + wire Do5gh7; + wire Jo5gh7; + wire Po5gh7; + wire Vo5gh7; + wire Bp5gh7; + wire Hp5gh7; + wire Np5gh7; + wire Tp5gh7; + wire Zp5gh7; + wire Fq5gh7; + wire Lq5gh7; + wire Rq5gh7; + wire Xq5gh7; + wire Dr5gh7; + wire Jr5gh7; + wire Pr5gh7; + wire Vr5gh7; + wire Bs5gh7; + wire Hs5gh7; + wire Ns5gh7; + wire Ts5gh7; + wire Zs5gh7; + wire Ft5gh7; + wire Lt5gh7; + wire Rt5gh7; + wire Xt5gh7; + wire Du5gh7; + wire Ju5gh7; + wire Pu5gh7; + wire Vu5gh7; + wire Bv5gh7; + wire Hv5gh7; + wire Nv5gh7; + wire Tv5gh7; + wire Zv5gh7; + wire Fw5gh7; + wire Lw5gh7; + wire Rw5gh7; + wire Xw5gh7; + wire Dx5gh7; + wire Jx5gh7; + wire Px5gh7; + wire Vx5gh7; + wire By5gh7; + wire Hy5gh7; + wire Ny5gh7; + wire Ty5gh7; + wire Zy5gh7; + wire Fz5gh7; + wire Lz5gh7; + wire Rz5gh7; + wire Xz5gh7; + wire D06gh7; + wire J06gh7; + wire P06gh7; + wire V06gh7; + wire B16gh7; + wire H16gh7; + wire N16gh7; + wire T16gh7; + wire Z16gh7; + wire F26gh7; + wire L26gh7; + wire R26gh7; + wire X26gh7; + wire D36gh7; + wire J36gh7; + wire P36gh7; + wire V36gh7; + wire B46gh7; + wire H46gh7; + wire N46gh7; + wire T46gh7; + wire Z46gh7; + wire F56gh7; + wire L56gh7; + wire R56gh7; + wire X56gh7; + wire D66gh7; + wire J66gh7; + wire P66gh7; + wire V66gh7; + wire B76gh7; + wire H76gh7; + wire N76gh7; + wire T76gh7; + wire Z76gh7; + wire F86gh7; + wire L86gh7; + wire R86gh7; + wire X86gh7; + wire D96gh7; + wire J96gh7; + wire P96gh7; + wire V96gh7; + wire Ba6gh7; + wire Ha6gh7; + wire Na6gh7; + wire Ta6gh7; + wire Za6gh7; + wire Fb6gh7; + wire Lb6gh7; + wire Rb6gh7; + wire Xb6gh7; + wire Dc6gh7; + wire Jc6gh7; + wire Pc6gh7; + wire Vc6gh7; + wire Bd6gh7; + wire Hd6gh7; + wire Nd6gh7; + wire Td6gh7; + wire Zd6gh7; + wire Fe6gh7; + wire Le6gh7; + wire Re6gh7; + wire Xe6gh7; + wire Df6gh7; + wire Jf6gh7; + wire Pf6gh7; + wire Vf6gh7; + wire Bg6gh7; + wire Hg6gh7; + wire Ng6gh7; + wire Tg6gh7; + wire Zg6gh7; + wire Fh6gh7; + wire Lh6gh7; + wire Rh6gh7; + wire Xh6gh7; + wire Di6gh7; + wire Ji6gh7; + wire Pi6gh7; + wire Vi6gh7; + wire Bj6gh7; + wire Hj6gh7; + wire Nj6gh7; + wire Tj6gh7; + wire Zj6gh7; + wire Fk6gh7; + wire Lk6gh7; + wire Rk6gh7; + wire Xk6gh7; + wire Dl6gh7; + wire Jl6gh7; + wire Pl6gh7; + wire Vl6gh7; + wire Bm6gh7; + wire Hm6gh7; + wire Nm6gh7; + wire Tm6gh7; + wire Zm6gh7; + wire Fn6gh7; + wire Ln6gh7; + wire Rn6gh7; + wire Xn6gh7; + wire Do6gh7; + wire Jo6gh7; + wire Po6gh7; + wire Vo6gh7; + wire Bp6gh7; + wire Hp6gh7; + wire Np6gh7; + wire Tp6gh7; + wire Zp6gh7; + wire Fq6gh7; + wire Lq6gh7; + wire Rq6gh7; + wire Xq6gh7; + wire Dr6gh7; + wire Jr6gh7; + wire Pr6gh7; + wire Vr6gh7; + wire Bs6gh7; + wire Hs6gh7; + wire Ns6gh7; + wire Ts6gh7; + wire Zs6gh7; + wire Ft6gh7; + wire Lt6gh7; + wire Rt6gh7; + wire Xt6gh7; + wire Du6gh7; + wire Ju6gh7; + wire Pu6gh7; + wire Vu6gh7; + wire Bv6gh7; + wire Hv6gh7; + wire Nv6gh7; + wire Tv6gh7; + wire Zv6gh7; + wire Fw6gh7; + wire Lw6gh7; + wire Rw6gh7; + wire Xw6gh7; + wire Dx6gh7; + wire Jx6gh7; + wire Px6gh7; + wire Vx6gh7; + wire By6gh7; + wire Hy6gh7; + wire Ny6gh7; + wire Ty6gh7; + wire Zy6gh7; + wire Fz6gh7; + wire Lz6gh7; + wire Rz6gh7; + wire Xz6gh7; + wire D07gh7; + wire J07gh7; + wire P07gh7; + wire V07gh7; + wire B17gh7; + wire H17gh7; + wire N17gh7; + wire T17gh7; + wire Z17gh7; + wire F27gh7; + wire L27gh7; + wire R27gh7; + wire X27gh7; + wire D37gh7; + wire J37gh7; + wire P37gh7; + wire V37gh7; + wire B47gh7; + wire H47gh7; + wire N47gh7; + wire T47gh7; + wire Z47gh7; + wire F57gh7; + wire L57gh7; + wire R57gh7; + wire X57gh7; + wire D67gh7; + wire J67gh7; + wire P67gh7; + wire V67gh7; + wire B77gh7; + wire H77gh7; + wire N77gh7; + wire T77gh7; + wire Z77gh7; + wire F87gh7; + wire L87gh7; + wire R87gh7; + wire X87gh7; + wire D97gh7; + wire J97gh7; + wire P97gh7; + wire V97gh7; + wire Ba7gh7; + wire Ha7gh7; + wire Na7gh7; + wire Ta7gh7; + wire Za7gh7; + wire Fb7gh7; + wire Lb7gh7; + wire Rb7gh7; + wire Xb7gh7; + wire Dc7gh7; + wire Jc7gh7; + wire Pc7gh7; + wire Vc7gh7; + wire Bd7gh7; + wire Hd7gh7; + wire Nd7gh7; + wire Td7gh7; + wire Zd7gh7; + wire Fe7gh7; + wire Le7gh7; + wire Re7gh7; + wire Xe7gh7; + wire Df7gh7; + wire Jf7gh7; + wire Pf7gh7; + wire Vf7gh7; + wire Bg7gh7; + wire Hg7gh7; + wire Ng7gh7; + wire Tg7gh7; + wire Zg7gh7; + wire Fh7gh7; + wire Lh7gh7; + wire Rh7gh7; + wire Xh7gh7; + wire Di7gh7; + wire Ji7gh7; + wire Pi7gh7; + wire Vi7gh7; + wire Bj7gh7; + wire Hj7gh7; + wire Nj7gh7; + wire Tj7gh7; + wire Zj7gh7; + wire Fk7gh7; + wire Lk7gh7; + wire Rk7gh7; + wire Xk7gh7; + wire Dl7gh7; + wire Jl7gh7; + wire Pl7gh7; + wire Vl7gh7; + wire Bm7gh7; + wire Hm7gh7; + wire Nm7gh7; + wire Tm7gh7; + wire Zm7gh7; + wire Fn7gh7; + wire Ln7gh7; + wire Rn7gh7; + wire Xn7gh7; + wire Do7gh7; + wire Jo7gh7; + wire Po7gh7; + wire Vo7gh7; + wire Bp7gh7; + wire Hp7gh7; + wire Np7gh7; + wire Tp7gh7; + wire Zp7gh7; + wire Fq7gh7; + wire Lq7gh7; + wire Rq7gh7; + wire Xq7gh7; + wire Dr7gh7; + wire Jr7gh7; + wire Pr7gh7; + wire Vr7gh7; + wire Bs7gh7; + wire Hs7gh7; + wire Ns7gh7; + wire Ts7gh7; + wire Zs7gh7; + wire Ft7gh7; + wire Lt7gh7; + wire Rt7gh7; + wire Xt7gh7; + wire Du7gh7; + wire Ju7gh7; + wire Pu7gh7; + wire Vu7gh7; + wire Bv7gh7; + wire Hv7gh7; + wire Nv7gh7; + wire Tv7gh7; + wire Zv7gh7; + wire Fw7gh7; + wire Lw7gh7; + wire Rw7gh7; + wire Xw7gh7; + wire Dx7gh7; + wire Jx7gh7; + wire Px7gh7; + wire Vx7gh7; + wire By7gh7; + wire Hy7gh7; + wire Ny7gh7; + wire Ty7gh7; + wire Zy7gh7; + wire Fz7gh7; + wire Lz7gh7; + wire Rz7gh7; + wire Xz7gh7; + wire D08gh7; + wire J08gh7; + wire P08gh7; + wire V08gh7; + wire B18gh7; + wire H18gh7; + wire N18gh7; + wire T18gh7; + wire Z18gh7; + wire F28gh7; + wire L28gh7; + wire R28gh7; + wire X28gh7; + wire D38gh7; + wire J38gh7; + wire P38gh7; + wire V38gh7; + wire B48gh7; + wire H48gh7; + wire N48gh7; + wire T48gh7; + wire Z48gh7; + wire F58gh7; + wire L58gh7; + wire R58gh7; + wire X58gh7; + wire D68gh7; + wire J68gh7; + wire P68gh7; + wire V68gh7; + wire B78gh7; + wire H78gh7; + wire N78gh7; + wire T78gh7; + wire Z78gh7; + wire F88gh7; + wire L88gh7; + wire R88gh7; + wire X88gh7; + wire D98gh7; + wire J98gh7; + wire P98gh7; + wire V98gh7; + wire Ba8gh7; + wire Ha8gh7; + wire Na8gh7; + wire Ta8gh7; + wire Za8gh7; + wire Fb8gh7; + wire Lb8gh7; + wire Rb8gh7; + wire Xb8gh7; + wire Dc8gh7; + wire Jc8gh7; + wire Pc8gh7; + wire Vc8gh7; + wire Bd8gh7; + wire Hd8gh7; + wire Nd8gh7; + wire Td8gh7; + wire Zd8gh7; + wire Fe8gh7; + wire Le8gh7; + wire Re8gh7; + wire Xe8gh7; + wire Df8gh7; + wire Jf8gh7; + wire Pf8gh7; + wire Vf8gh7; + wire Bg8gh7; + wire Hg8gh7; + wire Ng8gh7; + wire Tg8gh7; + wire Zg8gh7; + wire Fh8gh7; + wire Lh8gh7; + wire Rh8gh7; + wire Xh8gh7; + wire Di8gh7; + wire Ji8gh7; + wire Pi8gh7; + wire Vi8gh7; + wire Bj8gh7; + wire Hj8gh7; + wire Nj8gh7; + wire Tj8gh7; + wire Zj8gh7; + wire Fk8gh7; + wire Lk8gh7; + wire Rk8gh7; + wire Xk8gh7; + wire Dl8gh7; + wire Jl8gh7; + wire Pl8gh7; + wire Vl8gh7; + wire Bm8gh7; + wire Hm8gh7; + wire Nm8gh7; + wire Tm8gh7; + wire Zm8gh7; + wire Fn8gh7; + wire Ln8gh7; + wire Rn8gh7; + wire Xn8gh7; + wire Do8gh7; + wire Jo8gh7; + wire Po8gh7; + wire Vo8gh7; + wire Bp8gh7; + wire Hp8gh7; + wire Np8gh7; + wire Tp8gh7; + wire Zp8gh7; + wire Fq8gh7; + wire Lq8gh7; + wire Rq8gh7; + wire Xq8gh7; + wire Dr8gh7; + wire Jr8gh7; + wire Pr8gh7; + wire Vr8gh7; + wire Bs8gh7; + wire Hs8gh7; + wire Ns8gh7; + wire Ts8gh7; + wire Zs8gh7; + wire Ft8gh7; + wire Lt8gh7; + wire Rt8gh7; + wire Xt8gh7; + wire Du8gh7; + wire Ju8gh7; + wire Pu8gh7; + wire Vu8gh7; + wire Bv8gh7; + wire Hv8gh7; + wire Nv8gh7; + wire Tv8gh7; + wire Zv8gh7; + wire Fw8gh7; + wire Lw8gh7; + wire Rw8gh7; + wire Xw8gh7; + wire Dx8gh7; + wire Jx8gh7; + wire Px8gh7; + wire Vx8gh7; + wire By8gh7; + wire Hy8gh7; + wire Ny8gh7; + wire Ty8gh7; + wire Zy8gh7; + wire Fz8gh7; + wire Lz8gh7; + wire Rz8gh7; + wire Xz8gh7; + wire D09gh7; + wire J09gh7; + wire P09gh7; + wire V09gh7; + wire B19gh7; + wire H19gh7; + wire N19gh7; + wire T19gh7; + wire Z19gh7; + wire F29gh7; + wire L29gh7; + wire R29gh7; + wire X29gh7; + wire D39gh7; + wire J39gh7; + wire P39gh7; + wire V39gh7; + wire B49gh7; + wire H49gh7; + wire N49gh7; + wire T49gh7; + wire Z49gh7; + wire F59gh7; + wire L59gh7; + wire R59gh7; + wire X59gh7; + wire D69gh7; + wire J69gh7; + wire P69gh7; + wire V69gh7; + wire B79gh7; + wire H79gh7; + wire N79gh7; + wire T79gh7; + wire Z79gh7; + wire F89gh7; + wire L89gh7; + wire R89gh7; + wire X89gh7; + wire D99gh7; + wire J99gh7; + wire P99gh7; + wire V99gh7; + wire Ba9gh7; + wire Ha9gh7; + wire Na9gh7; + wire Ta9gh7; + wire Za9gh7; + wire Fb9gh7; + wire Lb9gh7; + wire Rb9gh7; + wire Xb9gh7; + wire Dc9gh7; + wire Jc9gh7; + wire Pc9gh7; + wire Vc9gh7; + wire Bd9gh7; + wire Hd9gh7; + wire [31:0] Nd9gh7; + reg Ie9gh7; + reg If9gh7; + reg Ng9gh7; + reg Ph9gh7; + reg Ri9gh7; + reg Tj9gh7; + reg Wk9gh7; + reg Wl9gh7; + reg Zm9gh7; + reg Bo9gh7; + reg Dp9gh7; + reg Fq9gh7; + reg Ir9gh7; + reg Ls9gh7; + reg Lt9gh7; + reg Ou9gh7; + reg Pv9gh7; + reg Rw9gh7; + reg Tx9gh7; + reg Wy9gh7; + reg Zz9gh7; + reg C1agh7; + reg F2agh7; + reg I3agh7; + reg L4agh7; + reg O5agh7; + reg R6agh7; + reg U7agh7; + reg U8agh7; + reg X9agh7; + reg Abagh7; + reg Wbagh7; + reg Zcagh7; + reg Ceagh7; + reg Efagh7; + reg Ggagh7; + reg Jhagh7; + reg Miagh7; + reg Pjagh7; + reg Skagh7; + reg Vlagh7; + reg Ymagh7; + reg Boagh7; + reg Epagh7; + reg Eqagh7; + reg Eragh7; + reg Esagh7; + reg Etagh7; + reg Euagh7; + reg Evagh7; + reg Ewagh7; + reg Hxagh7; + reg Kyagh7; + reg Nzagh7; + reg Q0bgh7; + reg T1bgh7; + reg W2bgh7; + reg Z3bgh7; + reg C5bgh7; + reg F6bgh7; + reg H7bgh7; + reg K8bgh7; + reg N9bgh7; + reg Pabgh7; + reg Rbbgh7; + reg Ucbgh7; + reg Xdbgh7; + reg Afbgh7; + reg Dgbgh7; + reg Ghbgh7; + reg Iibgh7; + reg Kjbgh7; + reg Nkbgh7; + reg Plbgh7; + reg Rmbgh7; + reg Tnbgh7; + reg Vobgh7; + reg Wpbgh7; + reg Xqbgh7; + reg Yrbgh7; + reg Zsbgh7; + reg Bubgh7; + reg Cvbgh7; + reg Dwbgh7; + reg Dxbgh7; + reg Fybgh7; + reg Gzbgh7; + reg H0cgh7; + reg H1cgh7; + reg H2cgh7; + reg J3cgh7; + reg K4cgh7; + reg N5cgh7; + reg P6cgh7; + reg S7cgh7; + reg U8cgh7; + reg X9cgh7; + reg Zacgh7; + reg Cccgh7; + reg Edcgh7; + reg Hecgh7; + reg Jfcgh7; + reg Kgcgh7; + reg Mhcgh7; + reg Nicgh7; + reg Pjcgh7; + reg Qkcgh7; + reg Slcgh7; + reg Tmcgh7; + reg Vncgh7; + reg Wocgh7; + reg Ypcgh7; + reg Zqcgh7; + reg Zrcgh7; + reg Btcgh7; + reg Cucgh7; + reg Fvcgh7; + reg Hwcgh7; + reg Kxcgh7; + reg Mycgh7; + reg Pzcgh7; + reg R0dgh7; + reg U1dgh7; + reg W2dgh7; + reg Z3dgh7; + reg B5dgh7; + reg C6dgh7; + reg E7dgh7; + reg F8dgh7; + reg H9dgh7; + reg Iadgh7; + reg Kbdgh7; + reg Lcdgh7; + reg Nddgh7; + reg Oedgh7; + reg Qfdgh7; + reg Rgdgh7; + reg Rhdgh7; + reg Tidgh7; + reg Ujdgh7; + reg Xkdgh7; + reg Zldgh7; + reg Cndgh7; + reg Eodgh7; + reg Hpdgh7; + reg Jqdgh7; + reg Mrdgh7; + reg Osdgh7; + reg Rtdgh7; + reg Tudgh7; + reg Wvdgh7; + reg Ywdgh7; + reg Zxdgh7; + reg Bzdgh7; + reg C0egh7; + reg E1egh7; + reg F2egh7; + reg H3egh7; + reg I4egh7; + reg K5egh7; + reg L6egh7; + reg N7egh7; + reg O8egh7; + reg Q9egh7; + reg Raegh7; + reg Rbegh7; + reg Scegh7; + reg Udegh7; + reg Veegh7; + reg Xfegh7; + reg Ygegh7; + reg Aiegh7; + reg Bjegh7; + reg Dkegh7; + reg Elegh7; + reg Gmegh7; + reg Hnegh7; + reg Joegh7; + reg Jpegh7; + reg Kqegh7; + reg Kregh7; + reg Ksegh7; + reg Ktegh7; + reg Kuegh7; + reg Kvegh7; + reg Kwegh7; + reg Kxegh7; + reg Kyegh7; + reg Lzegh7; + reg O0fgh7; + reg P1fgh7; + reg S2fgh7; + reg V3fgh7; + reg X4fgh7; + reg Z5fgh7; + reg B7fgh7; + reg D8fgh7; + reg H9fgh7; + reg Hafgh7; + reg Lbfgh7; + reg Pcfgh7; + reg Tdfgh7; + reg Xefgh7; + reg Bgfgh7; + reg Fhfgh7; + reg Jifgh7; + reg Ojfgh7; + reg Tkfgh7; + reg Ylfgh7; + reg Dnfgh7; + reg Iofgh7; + reg Npfgh7; + reg Sqfgh7; + reg Yrfgh7; + reg Etfgh7; + reg Kufgh7; + reg Qvfgh7; + reg Wwfgh7; + reg Cyfgh7; + reg Izfgh7; + reg O0ggh7; + reg U1ggh7; + reg A3ggh7; + reg G4ggh7; + reg M5ggh7; + reg S6ggh7; + reg Y7ggh7; + reg E9ggh7; + reg Kaggh7; + reg Qbggh7; + reg Wcggh7; + reg Ceggh7; + reg Ifggh7; + reg Ogggh7; + reg Phggh7; + reg Uiggh7; + reg Yjggh7; + reg Ykggh7; + reg Ylggh7; + reg Enggh7; + reg Foggh7; + reg Hpggh7; + reg Jqggh7; + reg Lrggh7; + reg Nsggh7; + reg Ptggh7; + reg Ruggh7; + reg Tvggh7; + reg Vwggh7; + reg Xxggh7; + reg Azggh7; + reg D0hgh7; + reg G1hgh7; + reg J2hgh7; + reg M3hgh7; + reg P4hgh7; + reg S5hgh7; + reg V6hgh7; + reg Y7hgh7; + reg B9hgh7; + reg Eahgh7; + reg Hbhgh7; + reg Kchgh7; + reg Ndhgh7; + reg Qehgh7; + reg Tfhgh7; + reg Wghgh7; + reg Zhhgh7; + reg Cjhgh7; + reg Fkhgh7; + reg Ilhgh7; + reg Lmhgh7; + reg Mnhgh7; + reg Mohgh7; + reg Rphgh7; + reg Vqhgh7; + reg Zrhgh7; + reg Dthgh7; + reg Huhgh7; + reg Lvhgh7; + reg Pwhgh7; + wire [33:0] Txhgh7; + wire [33:0] Wyhgh7; + + assign ahb_hburst[2] = 1'b0; + assign ahb_hburst[1] = 1'b0; + assign ahb_hmastlock = 1'b0; + assign ahb_hprot[3] = 1'b0; + assign ahb_hprot[2] = 1'b0; + assign ahb_hsize[2] = 1'b0; + assign ahb_hsize[0] = 1'b0; + assign ahb_htrans[0] = 1'b0; + assign ahb_hburst[0] = 1'b1; + assign ahb_hprot[1] = 1'b1; + assign ahb_hprot[0] = 1'b1; + assign ahb_hsize[1] = 1'b1; + assign Hd9gh7 = (!Ie9gh7); + assign ahb_hwdata[0] = If9gh7; + assign Jltfh7 = (!If9gh7); + assign Bd9gh7 = (!Ng9gh7); + assign Vc9gh7 = (!Ph9gh7); + assign Nd9gh7[1] = Ri9gh7; + assign Hgtfh7 = (!Ri9gh7); + assign Nv8gh7 = (!Tj9gh7); + assign com_rx_tready = Wk9gh7; + assign Xw8gh7 = (!Wl9gh7); + assign Fz8gh7 = (!Zm9gh7); + assign Ty8gh7 = (!Bo9gh7); + assign Pc9gh7 = (!Dp9gh7); + assign By8gh7 = (!Fq9gh7); + assign Vu8gh7 = (!Ir9gh7); + assign com_tx_tvalid = Ls9gh7; + assign Lz8gh7 = (!Lt9gh7); + assign ahb_haddr[0] = Ou9gh7; + assign Jc9gh7 = (!Pv9gh7); + assign Dc9gh7 = (!Rw9gh7); + assign Bv8gh7 = (!Tx9gh7); + assign Hv8gh7 = (!Wy9gh7); + assign Ft8gh7 = (!Zz9gh7); + assign Jx8gh7 = (!C1agh7); + assign P09gh7 = (!F2agh7); + assign Xz8gh7 = (!I3agh7); + assign N19gh7 = (!L4agh7); + assign Xt8gh7 = (!O5agh7); + assign Xb9gh7 = (!R6agh7); + assign stdio_rx_tready = U7agh7; + assign Hy8gh7 = (!U8agh7); + assign Rz8gh7 = (!X9agh7); + assign Fe8gh7 = (!Abagh7); + assign V09gh7 = (!Wbagh7); + assign Lw8gh7 = (!Zcagh7); + assign Lt8gh7 = (!Ceagh7); + assign Rt8gh7 = (!Efagh7); + assign Fw8gh7 = (!Ggagh7); + assign L29gh7 = (!Jhagh7); + assign D09gh7 = (!Miagh7); + assign Zv8gh7 = (!Pjagh7); + assign Dx8gh7 = (!Skagh7); + assign Tv8gh7 = (!Vlagh7); + assign Ju8gh7 = (!Ymagh7); + assign Pu8gh7 = (!Boagh7); + assign Rb9gh7 = (!Epagh7); + assign Zd8gh7 = (!Eqagh7); + assign Lb9gh7 = (!Eragh7); + assign Fb9gh7 = (!Esagh7); + assign Za9gh7 = (!Etagh7); + assign Ta9gh7 = (!Euagh7); + assign Na9gh7 = (!Evagh7); + assign Ha9gh7 = (!Ewagh7); + assign B19gh7 = (!Hxagh7); + assign Ba9gh7 = (!Kyagh7); + assign H19gh7 = (!Nzagh7); + assign F29gh7 = (!Q0bgh7); + assign Du8gh7 = (!T1bgh7); + assign T19gh7 = (!W2bgh7); + assign V99gh7 = (!Z3bgh7); + assign Z19gh7 = (!C5bgh7); + assign R9tfh7 = F6bgh7; + assign ahb_hwrite = H7bgh7; + assign J09gh7 = (!K8bgh7); + assign P99gh7 = (!N9bgh7); + assign J99gh7 = (!Pabgh7); + assign D99gh7 = (!Rbbgh7); + assign X89gh7 = (!Ucbgh7); + assign R89gh7 = (!Xdbgh7); + assign L89gh7 = (!Afbgh7); + assign F89gh7 = (!Dgbgh7); + assign ahb_haddr[29] = Ghbgh7; + assign ahb_haddr[31] = Iibgh7; + assign Z79gh7 = (!Kjbgh7); + assign ahb_haddr[25] = Nkbgh7; + assign ahb_haddr[21] = Plbgh7; + assign ahb_haddr[17] = Rmbgh7; + assign ahb_haddr[13] = Tnbgh7; + assign ahb_haddr[9] = Vobgh7; + assign ahb_haddr[5] = Wpbgh7; + assign ahb_haddr[4] = Xqbgh7; + assign ahb_haddr[1] = Yrbgh7; + assign T79gh7 = (!Zsbgh7); + assign ahb_haddr[2] = Bubgh7; + assign Tp8gh7 = (!Cvbgh7); + assign Np8gh7 = (!Dwbgh7); + assign N79gh7 = (!Dxbgh7); + assign ahb_haddr[3] = Fybgh7; + assign Df8gh7 = (!Gzbgh7); + assign Xe8gh7 = (!H0cgh7); + assign Tm8gh7 = (!H1cgh7); + assign H79gh7 = (!H2cgh7); + assign ahb_haddr[8] = J3cgh7; + assign B79gh7 = (!K4cgh7); + assign ahb_haddr[12] = N5cgh7; + assign V69gh7 = (!P6cgh7); + assign ahb_haddr[16] = S7cgh7; + assign P69gh7 = (!U8cgh7); + assign ahb_haddr[20] = X9cgh7; + assign J69gh7 = (!Zacgh7); + assign ahb_haddr[24] = Cccgh7; + assign D69gh7 = (!Edcgh7); + assign ahb_haddr[28] = Hecgh7; + assign Rn8gh7 = (!Jfcgh7); + assign Xn8gh7 = (!Kgcgh7); + assign Do8gh7 = (!Mhcgh7); + assign Jo8gh7 = (!Nicgh7); + assign Fn8gh7 = (!Pjcgh7); + assign Ln8gh7 = (!Qkcgh7); + assign Po8gh7 = (!Slcgh7); + assign Vo8gh7 = (!Tmcgh7); + assign Hm8gh7 = (!Vncgh7); + assign Nm8gh7 = (!Wocgh7); + assign Zm8gh7 = (!Ypcgh7); + assign Vf8gh7 = (!Zqcgh7); + assign X59gh7 = (!Zrcgh7); + assign ahb_haddr[7] = Btcgh7; + assign R59gh7 = (!Cucgh7); + assign ahb_haddr[11] = Fvcgh7; + assign L59gh7 = (!Hwcgh7); + assign ahb_haddr[15] = Kxcgh7; + assign F59gh7 = (!Mycgh7); + assign ahb_haddr[19] = Pzcgh7; + assign Z49gh7 = (!R0dgh7); + assign ahb_haddr[23] = U1dgh7; + assign T49gh7 = (!W2dgh7); + assign ahb_haddr[27] = Z3dgh7; + assign Lk8gh7 = (!B5dgh7); + assign Rk8gh7 = (!C6dgh7); + assign Nj8gh7 = (!E7dgh7); + assign Tj8gh7 = (!F8dgh7); + assign Pi8gh7 = (!H9dgh7); + assign Vi8gh7 = (!Iadgh7); + assign Rh8gh7 = (!Kbdgh7); + assign Xh8gh7 = (!Lcdgh7); + assign Tg8gh7 = (!Nddgh7); + assign Zg8gh7 = (!Oedgh7); + assign Bg8gh7 = (!Qfdgh7); + assign Zp8gh7 = (!Rgdgh7); + assign N49gh7 = (!Rhdgh7); + assign ahb_haddr[6] = Tidgh7; + assign H49gh7 = (!Ujdgh7); + assign ahb_haddr[10] = Xkdgh7; + assign B49gh7 = (!Zldgh7); + assign ahb_haddr[14] = Cndgh7; + assign V39gh7 = (!Eodgh7); + assign ahb_haddr[18] = Hpdgh7; + assign P39gh7 = (!Jqdgh7); + assign ahb_haddr[22] = Mrdgh7; + assign J39gh7 = (!Osdgh7); + assign ahb_haddr[26] = Rtdgh7; + assign D39gh7 = (!Tudgh7); + assign ahb_haddr[30] = Wvdgh7; + assign Ts8gh7 = (!Ywdgh7); + assign Zs8gh7 = (!Zxdgh7); + assign Hs8gh7 = (!Bzdgh7); + assign Ns8gh7 = (!C0egh7); + assign Vr8gh7 = (!E1egh7); + assign Bs8gh7 = (!F2egh7); + assign Jr8gh7 = (!H3egh7); + assign Pr8gh7 = (!I4egh7); + assign Xq8gh7 = (!K5egh7); + assign Dr8gh7 = (!L6egh7); + assign Lq8gh7 = (!N7egh7); + assign Rq8gh7 = (!O8egh7); + assign Fq8gh7 = (!Q9egh7); + assign Vl8gh7 = (!Raegh7); + assign Jl8gh7 = (!Rbegh7); + assign Pl8gh7 = (!Scegh7); + assign Xk8gh7 = (!Udegh7); + assign Dl8gh7 = (!Veegh7); + assign Zj8gh7 = (!Xfegh7); + assign Fk8gh7 = (!Ygegh7); + assign Bj8gh7 = (!Aiegh7); + assign Hj8gh7 = (!Bjegh7); + assign Di8gh7 = (!Dkegh7); + assign Ji8gh7 = (!Elegh7); + assign Fh8gh7 = (!Gmegh7); + assign Lh8gh7 = (!Hnegh7); + assign Hg8gh7 = (!Joegh7); + assign Ng8gh7 = (!Jpegh7); + assign gpo8[7] = Kqegh7; + assign Fktfh7 = (!Kqegh7); + assign gpo8[6] = Kregh7; + assign Zjtfh7 = (!Kregh7); + assign gpo8[4] = Ksegh7; + assign Njtfh7 = (!Ksegh7); + assign gpo8[3] = Ktegh7; + assign Hjtfh7 = (!Ktegh7); + assign gpo8[2] = Kuegh7; + assign Bjtfh7 = (!Kuegh7); + assign gpo8[1] = Kvegh7; + assign Vitfh7 = (!Kvegh7); + assign Jf8gh7 = (!Kwegh7); + assign gpo8[5] = Kxegh7; + assign Tjtfh7 = (!Kxegh7); + assign Pf8gh7 = (!Kyegh7); + assign Patfh7 = Lzegh7; + assign R29gh7 = (!O0fgh7); + assign Rw8gh7 = (!P1fgh7); + assign X29gh7 = (!S2fgh7); + assign Vx8gh7 = (!V3fgh7); + assign Ny8gh7 = (!X4fgh7); + assign Px8gh7 = (!Z5fgh7); + assign Zy8gh7 = (!B7fgh7); + assign com_tx_tdata[7] = D8fgh7; + assign stdio_tx_tvalid = H9fgh7; + assign stdio_tx_tdata[7] = Hafgh7; + assign stdio_tx_tdata[6] = Lbfgh7; + assign stdio_tx_tdata[5] = Pcfgh7; + assign stdio_tx_tdata[4] = Tdfgh7; + assign stdio_tx_tdata[3] = Xefgh7; + assign stdio_tx_tdata[2] = Bgfgh7; + assign stdio_tx_tdata[1] = Fhfgh7; + assign ahb_hwdata[2] = Jifgh7; + assign Vltfh7 = (!Jifgh7); + assign ahb_hwdata[3] = Ojfgh7; + assign Bmtfh7 = (!Ojfgh7); + assign ahb_hwdata[5] = Tkfgh7; + assign Nmtfh7 = (!Tkfgh7); + assign ahb_hwdata[6] = Ylfgh7; + assign Tmtfh7 = (!Ylfgh7); + assign ahb_hwdata[7] = Dnfgh7; + assign Zmtfh7 = (!Dnfgh7); + assign ahb_hwdata[8] = Iofgh7; + assign Fntfh7 = (!Iofgh7); + assign ahb_hwdata[9] = Npfgh7; + assign Lntfh7 = (!Npfgh7); + assign ahb_hwdata[10] = Sqfgh7; + assign Rntfh7 = (!Sqfgh7); + assign ahb_hwdata[11] = Yrfgh7; + assign Xntfh7 = (!Yrfgh7); + assign ahb_hwdata[12] = Etfgh7; + assign Dotfh7 = (!Etfgh7); + assign ahb_hwdata[13] = Kufgh7; + assign Jotfh7 = (!Kufgh7); + assign ahb_hwdata[14] = Qvfgh7; + assign Potfh7 = (!Qvfgh7); + assign ahb_hwdata[15] = Wwfgh7; + assign Votfh7 = (!Wwfgh7); + assign ahb_hwdata[17] = Cyfgh7; + assign Hptfh7 = (!Cyfgh7); + assign ahb_hwdata[18] = Izfgh7; + assign Nptfh7 = (!Izfgh7); + assign ahb_hwdata[19] = O0ggh7; + assign Tptfh7 = (!O0ggh7); + assign ahb_hwdata[20] = U1ggh7; + assign Zptfh7 = (!U1ggh7); + assign ahb_hwdata[21] = A3ggh7; + assign Fqtfh7 = (!A3ggh7); + assign ahb_hwdata[22] = G4ggh7; + assign Lqtfh7 = (!G4ggh7); + assign ahb_hwdata[23] = M5ggh7; + assign Rqtfh7 = (!M5ggh7); + assign ahb_hwdata[24] = S6ggh7; + assign Xqtfh7 = (!S6ggh7); + assign ahb_hwdata[25] = Y7ggh7; + assign Drtfh7 = (!Y7ggh7); + assign ahb_hwdata[26] = E9ggh7; + assign Jrtfh7 = (!E9ggh7); + assign ahb_hwdata[27] = Kaggh7; + assign Prtfh7 = (!Kaggh7); + assign ahb_hwdata[28] = Qbggh7; + assign Vrtfh7 = (!Qbggh7); + assign ahb_hwdata[29] = Wcggh7; + assign Bstfh7 = (!Wcggh7); + assign ahb_hwdata[30] = Ceggh7; + assign Hstfh7 = (!Ceggh7); + assign ahb_hwdata[31] = Ifggh7; + assign Nstfh7 = (!Ifggh7); + assign Bm8gh7 = (!Ogggh7); + assign ahb_hwdata[4] = Phggh7; + assign Hmtfh7 = (!Phggh7); + assign stdio_tx_tdata[0] = Uiggh7; + assign Bp8gh7 = (!Yjggh7); + assign gpo8[0] = Ykggh7; + assign Pitfh7 = (!Ykggh7); + assign ahb_hwdata[16] = Ylggh7; + assign Bptfh7 = (!Ylggh7); + assign Hp8gh7 = (!Enggh7); + assign Nd9gh7[0] = Foggh7; + assign Bsufh7 = (!Foggh7); + assign Nd9gh7[2] = Hpggh7; + assign Vctfh7 = (!Hpggh7); + assign Nd9gh7[3] = Jqggh7; + assign Ndtfh7 = (!Jqggh7); + assign Nd9gh7[4] = Lrggh7; + assign Tdtfh7 = (!Lrggh7); + assign Nd9gh7[5] = Nsggh7; + assign Zdtfh7 = (!Nsggh7); + assign Nd9gh7[6] = Ptggh7; + assign Fetfh7 = (!Ptggh7); + assign Nd9gh7[7] = Ruggh7; + assign Letfh7 = (!Ruggh7); + assign Nd9gh7[8] = Tvggh7; + assign Retfh7 = (!Tvggh7); + assign Nd9gh7[9] = Vwggh7; + assign Xetfh7 = (!Vwggh7); + assign Nd9gh7[10] = Xxggh7; + assign Jitfh7 = (!Xxggh7); + assign Nd9gh7[11] = Azggh7; + assign Xhtfh7 = (!Azggh7); + assign Nd9gh7[12] = D0hgh7; + assign Ditfh7 = (!D0hgh7); + assign Nd9gh7[13] = G1hgh7; + assign Zgtfh7 = (!G1hgh7); + assign Nd9gh7[14] = J2hgh7; + assign Fhtfh7 = (!J2hgh7); + assign Nd9gh7[15] = M3hgh7; + assign Lhtfh7 = (!M3hgh7); + assign Nd9gh7[16] = P4hgh7; + assign Rhtfh7 = (!P4hgh7); + assign Nd9gh7[17] = S5hgh7; + assign Ngtfh7 = (!S5hgh7); + assign Nd9gh7[18] = V6hgh7; + assign Tgtfh7 = (!V6hgh7); + assign Nd9gh7[19] = Y7hgh7; + assign Bgtfh7 = (!Y7hgh7); + assign Nd9gh7[20] = B9hgh7; + assign Pftfh7 = (!B9hgh7); + assign Nd9gh7[21] = Eahgh7; + assign Vftfh7 = (!Eahgh7); + assign Nd9gh7[22] = Hbhgh7; + assign Dftfh7 = (!Hbhgh7); + assign Nd9gh7[23] = Kchgh7; + assign Jftfh7 = (!Kchgh7); + assign Nd9gh7[24] = Ndhgh7; + assign Obtfh7 = (!Ndhgh7); + assign Nd9gh7[25] = Qehgh7; + assign Tbtfh7 = (!Qehgh7); + assign Nd9gh7[26] = Tfhgh7; + assign Ybtfh7 = (!Tfhgh7); + assign Nd9gh7[27] = Wghgh7; + assign Dctfh7 = (!Wghgh7); + assign Nd9gh7[28] = Zhhgh7; + assign Jctfh7 = (!Zhhgh7); + assign Nd9gh7[29] = Cjhgh7; + assign Pctfh7 = (!Cjhgh7); + assign Nd9gh7[30] = Fkhgh7; + assign Bdtfh7 = (!Fkhgh7); + assign Nd9gh7[31] = Ilhgh7; + assign Hdtfh7 = (!Ilhgh7); + assign Re8gh7 = (!Lmhgh7); + assign Le8gh7 = (!Mnhgh7); + assign ahb_hwdata[1] = Mohgh7; + assign Pltfh7 = (!Mohgh7); + assign com_tx_tdata[5] = Rphgh7; + assign com_tx_tdata[4] = Vqhgh7; + assign com_tx_tdata[3] = Zrhgh7; + assign com_tx_tdata[1] = Dthgh7; + assign Lktfh7 = (!Dthgh7); + assign com_tx_tdata[6] = Huhgh7; + assign Rktfh7 = (!Huhgh7); + assign com_tx_tdata[2] = Lvhgh7; + assign com_tx_tdata[0] = Pwhgh7; + assign Txhgh7 = ({Nd9gh7, 1'b0} - {{1'b0, 1'b0, 1'b0, 1'b0, 1'b0, 1'b0, + 1'b0, 1'b0, 1'b0, 1'b0, 1'b0, 1'b0, 1'b0, 1'b0, 1'b0, 1'b0, + 1'b0, 1'b0, 1'b0, 1'b0, 1'b0, 1'b0, 1'b0, 1'b0, 1'b0, 1'b0, + 1'b0, 1'b0, 1'b0, 1'b0, 1'b0, Tosfh7}, 1'b0}); + assign {B5sfh7, R5sfh7, H6sfh7, X6sfh7, N7sfh7, D8sfh7, T8sfh7, J9sfh7, + Z9sfh7, Pasfh7, Fbsfh7, Vbsfh7, Lcsfh7, Bdsfh7, Rdsfh7, Hesfh7, + Xesfh7, Nfsfh7, Dgsfh7, Tgsfh7, Jhsfh7, Zhsfh7, Pisfh7, Fjsfh7, + Vjsfh7, Lksfh7, Blsfh7, Rlsfh7, Hmsfh7, Xmsfh7, Nnsfh7, Dosfh7} + = Txhgh7[33:1]; + assign Wyhgh7 = ({ahb_haddr, 1'b0} + {{1'b0, 1'b0, 1'b0, 1'b0, 1'b0, + 1'b0, 1'b0, 1'b0, 1'b0, 1'b0, 1'b0, 1'b0, 1'b0, 1'b0, 1'b0, + 1'b0, 1'b0, 1'b0, 1'b0, 1'b0, 1'b0, 1'b0, 1'b0, 1'b0, 1'b0, + 1'b0, 1'b0, 1'b0, 1'b0, B9tfh7, 1'b0, 1'b0}, 1'b1}); + assign {Jpsfh7, Zpsfh7, Pqsfh7, Frsfh7, Vrsfh7, Lssfh7, Btsfh7, Rtsfh7, + Husfh7, Xusfh7, Nvsfh7, Dwsfh7, Twsfh7, Jxsfh7, Zxsfh7, Pysfh7, + Fzsfh7, Vzsfh7, L0tfh7, B1tfh7, R1tfh7, H2tfh7, X2tfh7, N3tfh7, + D4tfh7, T4tfh7, J5tfh7, Z5tfh7, P6tfh7, F7tfh7, V7tfh7, L8tfh7} + = Wyhgh7[33:1]; + assign Duufh7 = (!Juufh7); + assign Juufh7 = (!ahb_hresetn); + assign Puufh7 = (!Vuufh7); + assign Vuufh7 = (!ahb_hclk); + assign Xtufh7 = (~(Bvufh7 & Hvufh7)); + assign Hvufh7 = (~(stdio_tx_tdata[7] & Nvufh7)); + assign Bvufh7 = (Tvufh7 & Zvufh7); + assign Zvufh7 = (~(com_rx_tdata[7] & Fwufh7)); + assign Tvufh7 = (~(Lwufh7 & Rwufh7)); + assign Rtufh7 = (~(Xwufh7 & Dxufh7)); + assign Dxufh7 = (~(stdio_tx_tdata[6] & Nvufh7)); + assign Xwufh7 = (Jxufh7 & Pxufh7); + assign Pxufh7 = (~(com_rx_tdata[6] & Fwufh7)); + assign Jxufh7 = (~(Lwufh7 & Vxufh7)); + assign Ltufh7 = (~(Byufh7 & Hyufh7)); + assign Hyufh7 = (~(stdio_tx_tdata[5] & Nvufh7)); + assign Byufh7 = (Nyufh7 & Tyufh7); + assign Tyufh7 = (~(com_rx_tdata[5] & Fwufh7)); + assign Nyufh7 = (~(Lwufh7 & Zyufh7)); + assign Ftufh7 = (~(Fzufh7 & Lzufh7)); + assign Lzufh7 = (~(stdio_tx_tdata[4] & Nvufh7)); + assign Fzufh7 = (Rzufh7 & Xzufh7); + assign Xzufh7 = (~(Fwufh7 & com_rx_tdata[4])); + assign Rzufh7 = (~(Lwufh7 & D0vfh7)); + assign Zsufh7 = (~(J0vfh7 & P0vfh7)); + assign P0vfh7 = (~(stdio_tx_tdata[3] & Nvufh7)); + assign J0vfh7 = (V0vfh7 & B1vfh7); + assign B1vfh7 = (~(Fwufh7 & com_rx_tdata[3])); + assign V0vfh7 = (~(Lwufh7 & H1vfh7)); + assign Tsufh7 = (~(N1vfh7 & T1vfh7)); + assign T1vfh7 = (~(stdio_tx_tdata[2] & Nvufh7)); + assign N1vfh7 = (Z1vfh7 & F2vfh7); + assign F2vfh7 = (~(com_rx_tdata[2] & Fwufh7)); + assign Z1vfh7 = (~(Lwufh7 & L2vfh7)); + assign Nsufh7 = (~(R2vfh7 & X2vfh7)); + assign X2vfh7 = (~(stdio_tx_tdata[1] & Nvufh7)); + assign R2vfh7 = (D3vfh7 & J3vfh7); + assign J3vfh7 = (~(Fwufh7 & com_rx_tdata[1])); + assign D3vfh7 = (~(Lwufh7 & P3vfh7)); + assign Hsufh7 = (~(V3vfh7 & B4vfh7)); + assign B4vfh7 = (~(stdio_tx_tdata[0] & Nvufh7)); + assign V3vfh7 = (H4vfh7 & N4vfh7); + assign N4vfh7 = (~(Fwufh7 & com_rx_tdata[0])); + assign Fwufh7 = (~(Nvufh7 | T4vfh7)); + assign H4vfh7 = (~(Lwufh7 & Z4vfh7)); + assign Lwufh7 = (~(F5vfh7 | Nvufh7)); + assign Nvufh7 = (~(L5vfh7 & stdio_tx_tready)); + assign L5vfh7 = (Duufh7 & R5vfh7); + assign R5vfh7 = (X5vfh7 | D6vfh7); + assign Prufh7 = (~(J6vfh7 & P6vfh7)); + assign J6vfh7 = (B7vfh7 ? V6vfh7 : Rb9gh7); + assign Jrufh7 = (B7vfh7 ? com_rx_tdata[7] : H7vfh7); + assign H7vfh7 = (!Zd8gh7); + assign Drufh7 = (B7vfh7 ? com_rx_tdata[6] : N7vfh7); + assign Xqufh7 = (~(T7vfh7 & P6vfh7)); + assign T7vfh7 = (B7vfh7 ? Z7vfh7 : Fb9gh7); + assign Rqufh7 = (B7vfh7 ? com_rx_tdata[3] : F8vfh7); + assign Lqufh7 = (~(L8vfh7 & P6vfh7)); + assign L8vfh7 = (B7vfh7 ? R8vfh7 : Ta9gh7); + assign Fqufh7 = (~(X8vfh7 & P6vfh7)); + assign P6vfh7 = (~(D9vfh7 & B7vfh7)); + assign X8vfh7 = (B7vfh7 ? J9vfh7 : Na9gh7); + assign B7vfh7 = (~(P9vfh7 & V9vfh7)); + assign Zpufh7 = (Havfh7 ? ahb_hwrite : Bavfh7); + assign Bavfh7 = (~(Navfh7 & Tavfh7)); + assign Navfh7 = (Zavfh7 & Fbvfh7); + assign Zavfh7 = (Lbvfh7 | Rbvfh7); + assign Tpufh7 = (~(Xbvfh7 & Dcvfh7)); + assign Dcvfh7 = (Jcvfh7 & Pcvfh7); + assign Pcvfh7 = (~(Vcvfh7 & Bdvfh7)); + assign Jcvfh7 = (Hdvfh7 & Ndvfh7); + assign Hdvfh7 = (~(Tdvfh7 & Zdvfh7)); + assign Xbvfh7 = (Fevfh7 & Levfh7); + assign Levfh7 = (~(Revfh7 & ahb_haddr[31])); + assign Fevfh7 = (Xevfh7 & Dfvfh7); + assign Dfvfh7 = (~(Jfvfh7 & Pfvfh7)); + assign Xevfh7 = (Vfvfh7 | Pl8gh7); + assign Npufh7 = (~(Bgvfh7 & Hgvfh7)); + assign Hgvfh7 = (Ngvfh7 & Tgvfh7); + assign Tgvfh7 = (~(Jfvfh7 & Zgvfh7)); + assign Ngvfh7 = (Fhvfh7 & Ndvfh7); + assign Fhvfh7 = (~(Lhvfh7 & Rhvfh7)); + assign Lhvfh7 = (com_rx_tdata[0] ? Divfh7 : Xhvfh7); + assign Divfh7 = (~(Jivfh7 & Pivfh7)); + assign Xhvfh7 = (Vivfh7 & Bjvfh7); + assign Bgvfh7 = (Hjvfh7 & Njvfh7); + assign Njvfh7 = (~(Revfh7 & ahb_haddr[0])); + assign Hjvfh7 = (Tjvfh7 & Zjvfh7); + assign Zjvfh7 = (~(Fkvfh7 & Z4vfh7)); + assign Tjvfh7 = (Vfvfh7 | Hp8gh7); + assign Hpufh7 = (~(Lkvfh7 & Rkvfh7)); + assign Rkvfh7 = (Xkvfh7 & Dlvfh7); + assign Dlvfh7 = (~(Vcvfh7 & Jlvfh7)); + assign Xkvfh7 = (Plvfh7 & Ndvfh7); + assign Plvfh7 = (~(Tdvfh7 & Vlvfh7)); + assign Lkvfh7 = (Bmvfh7 & Hmvfh7); + assign Hmvfh7 = (~(Revfh7 & ahb_haddr[30])); + assign Bmvfh7 = (Nmvfh7 & Tmvfh7); + assign Tmvfh7 = (~(Jfvfh7 & Zmvfh7)); + assign Nmvfh7 = (Vfvfh7 | Zs8gh7); + assign Bpufh7 = (~(Fnvfh7 & Lnvfh7)); + assign Lnvfh7 = (Rnvfh7 & Xnvfh7); + assign Xnvfh7 = (~(Vcvfh7 & Dovfh7)); + assign Rnvfh7 = (Jovfh7 & Ndvfh7); + assign Jovfh7 = (~(Tdvfh7 & Povfh7)); + assign Fnvfh7 = (Vovfh7 & Bpvfh7); + assign Bpvfh7 = (~(Revfh7 & ahb_haddr[29])); + assign Vovfh7 = (Hpvfh7 & Npvfh7); + assign Npvfh7 = (~(Jfvfh7 & Tpvfh7)); + assign Hpvfh7 = (Vfvfh7 | Dl8gh7); + assign Voufh7 = (~(Zpvfh7 & Fqvfh7)); + assign Fqvfh7 = (Lqvfh7 & Rqvfh7); + assign Rqvfh7 = (~(Vcvfh7 & Xqvfh7)); + assign Lqvfh7 = (Drvfh7 & Ndvfh7); + assign Drvfh7 = (~(Tdvfh7 & Jrvfh7)); + assign Zpvfh7 = (Prvfh7 & Vrvfh7); + assign Vrvfh7 = (~(Revfh7 & ahb_haddr[28])); + assign Prvfh7 = (Bsvfh7 & Hsvfh7); + assign Hsvfh7 = (~(Jfvfh7 & Nsvfh7)); + assign Bsvfh7 = (Vfvfh7 | Xn8gh7); + assign Poufh7 = (~(Tsvfh7 & Zsvfh7)); + assign Zsvfh7 = (Ftvfh7 & Ltvfh7); + assign Ltvfh7 = (~(Vcvfh7 & Zdvfh7)); + assign Ftvfh7 = (Rtvfh7 & Ndvfh7); + assign Rtvfh7 = (~(Tdvfh7 & Xtvfh7)); + assign Tsvfh7 = (Duvfh7 & Juvfh7); + assign Juvfh7 = (~(Revfh7 & ahb_haddr[27])); + assign Duvfh7 = (Puvfh7 & Vuvfh7); + assign Vuvfh7 = (~(Jfvfh7 & Bvvfh7)); + assign Puvfh7 = (Vfvfh7 | Rk8gh7); + assign Joufh7 = (~(Hvvfh7 & Nvvfh7)); + assign Nvvfh7 = (Tvvfh7 & Zvvfh7); + assign Zvvfh7 = (~(Vcvfh7 & Vlvfh7)); + assign Tvvfh7 = (Fwvfh7 & Ndvfh7); + assign Fwvfh7 = (~(Tdvfh7 & Lwvfh7)); + assign Hvvfh7 = (Rwvfh7 & Xwvfh7); + assign Xwvfh7 = (~(Revfh7 & ahb_haddr[26])); + assign Rwvfh7 = (Dxvfh7 & Jxvfh7); + assign Jxvfh7 = (~(Jfvfh7 & Pxvfh7)); + assign Dxvfh7 = (Vfvfh7 | Ns8gh7); + assign Doufh7 = (~(Vxvfh7 & Byvfh7)); + assign Byvfh7 = (Hyvfh7 & Nyvfh7); + assign Nyvfh7 = (~(Vcvfh7 & Povfh7)); + assign Hyvfh7 = (Tyvfh7 & Ndvfh7); + assign Tyvfh7 = (~(Tdvfh7 & Zyvfh7)); + assign Vxvfh7 = (Fzvfh7 & Lzvfh7); + assign Lzvfh7 = (~(Revfh7 & ahb_haddr[25])); + assign Fzvfh7 = (Rzvfh7 & Xzvfh7); + assign Xzvfh7 = (~(Jfvfh7 & D0wfh7)); + assign Rzvfh7 = (Vfvfh7 | Fk8gh7); + assign Xnufh7 = (~(J0wfh7 & P0wfh7)); + assign P0wfh7 = (V0wfh7 & B1wfh7); + assign B1wfh7 = (~(Vcvfh7 & Jrvfh7)); + assign V0wfh7 = (H1wfh7 & Ndvfh7); + assign H1wfh7 = (~(Tdvfh7 & N1wfh7)); + assign J0wfh7 = (T1wfh7 & Z1wfh7); + assign Z1wfh7 = (~(Revfh7 & ahb_haddr[24])); + assign T1wfh7 = (F2wfh7 & L2wfh7); + assign L2wfh7 = (~(Jfvfh7 & R2wfh7)); + assign F2wfh7 = (Vfvfh7 | Jo8gh7); + assign Rnufh7 = (~(X2wfh7 & D3wfh7)); + assign D3wfh7 = (J3wfh7 & P3wfh7); + assign P3wfh7 = (~(Vcvfh7 & Xtvfh7)); + assign J3wfh7 = (V3wfh7 & Ndvfh7); + assign V3wfh7 = (~(Tdvfh7 & B4wfh7)); + assign X2wfh7 = (H4wfh7 & N4wfh7); + assign N4wfh7 = (~(Revfh7 & ahb_haddr[23])); + assign H4wfh7 = (T4wfh7 & Z4wfh7); + assign Z4wfh7 = (~(Jfvfh7 & F5wfh7)); + assign T4wfh7 = (Vfvfh7 | Tj8gh7); + assign Lnufh7 = (~(L5wfh7 & R5wfh7)); + assign R5wfh7 = (X5wfh7 & D6wfh7); + assign D6wfh7 = (~(Vcvfh7 & Lwvfh7)); + assign X5wfh7 = (J6wfh7 & Ndvfh7); + assign J6wfh7 = (~(Tdvfh7 & P6wfh7)); + assign L5wfh7 = (V6wfh7 & B7wfh7); + assign B7wfh7 = (~(Revfh7 & ahb_haddr[22])); + assign V6wfh7 = (H7wfh7 & N7wfh7); + assign N7wfh7 = (~(Jfvfh7 & T7wfh7)); + assign H7wfh7 = (Vfvfh7 | Bs8gh7); + assign Fnufh7 = (~(Z7wfh7 & F8wfh7)); + assign F8wfh7 = (L8wfh7 & R8wfh7); + assign R8wfh7 = (~(Vcvfh7 & Zyvfh7)); + assign L8wfh7 = (X8wfh7 & Ndvfh7); + assign X8wfh7 = (~(Tdvfh7 & D9wfh7)); + assign Z7wfh7 = (J9wfh7 & P9wfh7); + assign P9wfh7 = (~(Revfh7 & ahb_haddr[21])); + assign J9wfh7 = (V9wfh7 & Bawfh7); + assign Bawfh7 = (~(Jfvfh7 & Hawfh7)); + assign V9wfh7 = (Vfvfh7 | Hj8gh7); + assign Zmufh7 = (~(Nawfh7 & Tawfh7)); + assign Tawfh7 = (Zawfh7 & Fbwfh7); + assign Fbwfh7 = (~(Vcvfh7 & N1wfh7)); + assign Zawfh7 = (Lbwfh7 & Ndvfh7); + assign Lbwfh7 = (~(Tdvfh7 & Rbwfh7)); + assign Nawfh7 = (Xbwfh7 & Dcwfh7); + assign Dcwfh7 = (~(Revfh7 & ahb_haddr[20])); + assign Xbwfh7 = (Jcwfh7 & Pcwfh7); + assign Pcwfh7 = (~(Jfvfh7 & Vcwfh7)); + assign Jcwfh7 = (Vfvfh7 | Ln8gh7); + assign Tmufh7 = (~(Bdwfh7 & Hdwfh7)); + assign Hdwfh7 = (Ndwfh7 & Tdwfh7); + assign Tdwfh7 = (~(Vcvfh7 & B4wfh7)); + assign Ndwfh7 = (Zdwfh7 & Ndvfh7); + assign Zdwfh7 = (~(Tdvfh7 & Fewfh7)); + assign Bdwfh7 = (Lewfh7 & Rewfh7); + assign Rewfh7 = (~(Revfh7 & ahb_haddr[19])); + assign Lewfh7 = (Xewfh7 & Dfwfh7); + assign Dfwfh7 = (~(Jfvfh7 & Jfwfh7)); + assign Xewfh7 = (Vfvfh7 | Vi8gh7); + assign Nmufh7 = (~(Pfwfh7 & Vfwfh7)); + assign Vfwfh7 = (Bgwfh7 & Hgwfh7); + assign Hgwfh7 = (~(Vcvfh7 & P6wfh7)); + assign Bgwfh7 = (Ngwfh7 & Ndvfh7); + assign Ngwfh7 = (~(Tdvfh7 & Tgwfh7)); + assign Pfwfh7 = (Zgwfh7 & Fhwfh7); + assign Fhwfh7 = (~(Revfh7 & ahb_haddr[18])); + assign Zgwfh7 = (Lhwfh7 & Rhwfh7); + assign Rhwfh7 = (~(Jfvfh7 & Xhwfh7)); + assign Lhwfh7 = (Vfvfh7 | Pr8gh7); + assign Hmufh7 = (~(Diwfh7 & Jiwfh7)); + assign Jiwfh7 = (Piwfh7 & Viwfh7); + assign Viwfh7 = (~(Vcvfh7 & D9wfh7)); + assign Piwfh7 = (Bjwfh7 & Ndvfh7); + assign Bjwfh7 = (~(Tdvfh7 & Hjwfh7)); + assign Diwfh7 = (Njwfh7 & Tjwfh7); + assign Tjwfh7 = (~(Revfh7 & ahb_haddr[17])); + assign Njwfh7 = (Zjwfh7 & Fkwfh7); + assign Fkwfh7 = (~(Jfvfh7 & Lkwfh7)); + assign Zjwfh7 = (Vfvfh7 | Ji8gh7); + assign Bmufh7 = (~(Rkwfh7 & Xkwfh7)); + assign Xkwfh7 = (Dlwfh7 & Jlwfh7); + assign Jlwfh7 = (~(Vcvfh7 & Rbwfh7)); + assign Dlwfh7 = (Plwfh7 & Ndvfh7); + assign Plwfh7 = (~(Tdvfh7 & Vlwfh7)); + assign Rkwfh7 = (Bmwfh7 & Hmwfh7); + assign Hmwfh7 = (~(Revfh7 & ahb_haddr[16])); + assign Bmwfh7 = (Nmwfh7 & Tmwfh7); + assign Tmwfh7 = (~(Jfvfh7 & Zmwfh7)); + assign Nmwfh7 = (Vfvfh7 | Vo8gh7); + assign Vlufh7 = (~(Fnwfh7 & Lnwfh7)); + assign Lnwfh7 = (Rnwfh7 & Xnwfh7); + assign Xnwfh7 = (~(Vcvfh7 & Fewfh7)); + assign Rnwfh7 = (Dowfh7 & Ndvfh7); + assign Dowfh7 = (~(Tdvfh7 & Jowfh7)); + assign Fnwfh7 = (Powfh7 & Vowfh7); + assign Vowfh7 = (~(Revfh7 & ahb_haddr[15])); + assign Powfh7 = (Bpwfh7 & Hpwfh7); + assign Hpwfh7 = (~(Jfvfh7 & Npwfh7)); + assign Bpwfh7 = (Vfvfh7 | Xh8gh7); + assign Plufh7 = (~(Tpwfh7 & Zpwfh7)); + assign Zpwfh7 = (Fqwfh7 & Lqwfh7); + assign Lqwfh7 = (~(Vcvfh7 & Tgwfh7)); + assign Fqwfh7 = (Rqwfh7 & Ndvfh7); + assign Rqwfh7 = (~(Tdvfh7 & Xqwfh7)); + assign Tpwfh7 = (Drwfh7 & Jrwfh7); + assign Jrwfh7 = (~(Revfh7 & ahb_haddr[14])); + assign Drwfh7 = (Prwfh7 & Vrwfh7); + assign Vrwfh7 = (~(Jfvfh7 & Bswfh7)); + assign Prwfh7 = (Vfvfh7 | Dr8gh7); + assign Jlufh7 = (~(Hswfh7 & Nswfh7)); + assign Nswfh7 = (Tswfh7 & Zswfh7); + assign Zswfh7 = (~(Vcvfh7 & Hjwfh7)); + assign Tswfh7 = (Ftwfh7 & Ndvfh7); + assign Ftwfh7 = (~(Tdvfh7 & Ltwfh7)); + assign Hswfh7 = (Rtwfh7 & Xtwfh7); + assign Xtwfh7 = (~(Revfh7 & ahb_haddr[13])); + assign Rtwfh7 = (Duwfh7 & Juwfh7); + assign Juwfh7 = (~(Jfvfh7 & Puwfh7)); + assign Duwfh7 = (Vfvfh7 | Lh8gh7); + assign Dlufh7 = (~(Vuwfh7 & Bvwfh7)); + assign Bvwfh7 = (Hvwfh7 & Nvwfh7); + assign Nvwfh7 = (~(Vcvfh7 & Vlwfh7)); + assign Hvwfh7 = (Tvwfh7 & Ndvfh7); + assign Tvwfh7 = (~(Tdvfh7 & Zvwfh7)); + assign Vuwfh7 = (Fwwfh7 & Lwwfh7); + assign Lwwfh7 = (~(Revfh7 & ahb_haddr[12])); + assign Fwwfh7 = (Rwwfh7 & Xwwfh7); + assign Xwwfh7 = (~(Jfvfh7 & Dxwfh7)); + assign Rwwfh7 = (Vfvfh7 | Nm8gh7); + assign Xkufh7 = (~(Jxwfh7 & Pxwfh7)); + assign Pxwfh7 = (Vxwfh7 & Bywfh7); + assign Bywfh7 = (~(Vcvfh7 & Jowfh7)); + assign Vxwfh7 = (Hywfh7 & Ndvfh7); + assign Hywfh7 = (~(Tdvfh7 & Rwufh7)); + assign Jxwfh7 = (Nywfh7 & Tywfh7); + assign Tywfh7 = (~(Revfh7 & ahb_haddr[11])); + assign Nywfh7 = (Zywfh7 & Fzwfh7); + assign Fzwfh7 = (~(Jfvfh7 & Lzwfh7)); + assign Zywfh7 = (Vfvfh7 | Zg8gh7); + assign Rkufh7 = (~(Rzwfh7 & Xzwfh7)); + assign Xzwfh7 = (D0xfh7 & J0xfh7); + assign J0xfh7 = (~(Vcvfh7 & Xqwfh7)); + assign D0xfh7 = (P0xfh7 & Ndvfh7); + assign P0xfh7 = (~(Tdvfh7 & Vxufh7)); + assign Rzwfh7 = (V0xfh7 & B1xfh7); + assign B1xfh7 = (~(Revfh7 & ahb_haddr[10])); + assign V0xfh7 = (H1xfh7 & N1xfh7); + assign N1xfh7 = (~(Jfvfh7 & T1xfh7)); + assign H1xfh7 = (Vfvfh7 | Rq8gh7); + assign Lkufh7 = (~(Z1xfh7 & F2xfh7)); + assign F2xfh7 = (L2xfh7 & R2xfh7); + assign R2xfh7 = (~(Vcvfh7 & Ltwfh7)); + assign L2xfh7 = (X2xfh7 & Ndvfh7); + assign X2xfh7 = (~(Tdvfh7 & Zyufh7)); + assign Z1xfh7 = (D3xfh7 & J3xfh7); + assign J3xfh7 = (~(Revfh7 & ahb_haddr[9])); + assign D3xfh7 = (P3xfh7 & V3xfh7); + assign V3xfh7 = (~(Jfvfh7 & B4xfh7)); + assign P3xfh7 = (Vfvfh7 | Ng8gh7); + assign Fkufh7 = (~(H4xfh7 & N4xfh7)); + assign N4xfh7 = (T4xfh7 & Z4xfh7); + assign Z4xfh7 = (~(Vcvfh7 & Zvwfh7)); + assign T4xfh7 = (F5xfh7 & Ndvfh7); + assign F5xfh7 = (~(Tdvfh7 & D0vfh7)); + assign H4xfh7 = (L5xfh7 & R5xfh7); + assign R5xfh7 = (~(Revfh7 & ahb_haddr[8])); + assign L5xfh7 = (X5xfh7 & D6xfh7); + assign D6xfh7 = (~(Jfvfh7 & J6xfh7)); + assign X5xfh7 = (Vfvfh7 | Zm8gh7); + assign Zjufh7 = (~(P6xfh7 & V6xfh7)); + assign V6xfh7 = (B7xfh7 & H7xfh7); + assign H7xfh7 = (~(Vcvfh7 & Rwufh7)); + assign B7xfh7 = (N7xfh7 & Ndvfh7); + assign N7xfh7 = (~(Tdvfh7 & H1vfh7)); + assign P6xfh7 = (T7xfh7 & Z7xfh7); + assign Z7xfh7 = (~(Revfh7 & ahb_haddr[7])); + assign T7xfh7 = (F8xfh7 & L8xfh7); + assign L8xfh7 = (~(Jfvfh7 & R8xfh7)); + assign F8xfh7 = (Vfvfh7 | Bg8gh7); + assign Tjufh7 = (~(X8xfh7 & D9xfh7)); + assign D9xfh7 = (J9xfh7 & P9xfh7); + assign P9xfh7 = (~(Vcvfh7 & Vxufh7)); + assign J9xfh7 = (V9xfh7 & Ndvfh7); + assign V9xfh7 = (~(Tdvfh7 & L2vfh7)); + assign X8xfh7 = (Baxfh7 & Haxfh7); + assign Haxfh7 = (~(Revfh7 & ahb_haddr[6])); + assign Baxfh7 = (Naxfh7 & Taxfh7); + assign Taxfh7 = (~(Jfvfh7 & Zaxfh7)); + assign Naxfh7 = (Vfvfh7 | Fq8gh7); + assign Njufh7 = (~(Fbxfh7 & Lbxfh7)); + assign Lbxfh7 = (Rbxfh7 & Xbxfh7); + assign Xbxfh7 = (~(Vcvfh7 & Zyufh7)); + assign Rbxfh7 = (Dcxfh7 & Ndvfh7); + assign Dcxfh7 = (~(Tdvfh7 & P3vfh7)); + assign Fbxfh7 = (Jcxfh7 & Pcxfh7); + assign Pcxfh7 = (~(Revfh7 & ahb_haddr[5])); + assign Jcxfh7 = (Vcxfh7 & Bdxfh7); + assign Bdxfh7 = (~(Jfvfh7 & Hdxfh7)); + assign Vcxfh7 = (Vfvfh7 | Pf8gh7); + assign Hjufh7 = (~(Ndxfh7 & Tdxfh7)); + assign Tdxfh7 = (Zdxfh7 & Fexfh7); + assign Fexfh7 = (~(Vcvfh7 & D0vfh7)); + assign Vcvfh7 = (~(Lexfh7 & Rexfh7)); + assign Rexfh7 = (~(Xexfh7 & Dfxfh7)); + assign Zdxfh7 = (Jfxfh7 & Ndvfh7); + assign Jfxfh7 = (~(Tdvfh7 & Z4vfh7)); + assign Tdvfh7 = (Rhvfh7 & Pfxfh7); + assign Pfxfh7 = (Vfxfh7 | Bgxfh7); + assign Ndxfh7 = (Hgxfh7 & Ngxfh7); + assign Ngxfh7 = (~(Revfh7 & ahb_haddr[4])); + assign Hgxfh7 = (Tgxfh7 & Zgxfh7); + assign Zgxfh7 = (~(Jfvfh7 & Fhxfh7)); + assign Tgxfh7 = (Vfvfh7 | Bm8gh7); + assign Bjufh7 = (~(Lhxfh7 & Rhxfh7)); + assign Rhxfh7 = (Xhxfh7 & Dixfh7); + assign Dixfh7 = (~(Jfvfh7 & Jixfh7)); + assign Xhxfh7 = (Pixfh7 & Ndvfh7); + assign Pixfh7 = (~(Rhvfh7 & Vfxfh7)); + assign Vfxfh7 = (~(Vixfh7 & Bjxfh7)); + assign Vixfh7 = (Hjxfh7 & Jivfh7); + assign Jivfh7 = (~(Njxfh7 & Tjxfh7)); + assign Njxfh7 = (Zjxfh7 & com_rx_tdata[3]); + assign Lhxfh7 = (Fkxfh7 & Lkxfh7); + assign Lkxfh7 = (~(Revfh7 & ahb_haddr[3])); + assign Fkxfh7 = (Rkxfh7 & Xkxfh7); + assign Xkxfh7 = (~(Fkvfh7 & H1vfh7)); + assign Rkxfh7 = (Vfvfh7 | Df8gh7); + assign Viufh7 = (~(Dlxfh7 & Jlxfh7)); + assign Jlxfh7 = (Plxfh7 & Vlxfh7); + assign Vlxfh7 = (~(Jfvfh7 & Bmxfh7)); + assign Plxfh7 = (Hmxfh7 & Ndvfh7); + assign Hmxfh7 = (~(Rhvfh7 & Nmxfh7)); + assign Nmxfh7 = (~(Bjxfh7 & Tmxfh7)); + assign Tmxfh7 = (~(com_rx_tdata[2] & Zmxfh7)); + assign Zmxfh7 = (~(Pivfh7 & Fnxfh7)); + assign Fnxfh7 = (~(Vivfh7 & J9vfh7)); + assign Pivfh7 = (!Bgxfh7); + assign Bjxfh7 = (~(Lnxfh7 & Vivfh7)); + assign Lnxfh7 = (Rnxfh7 & Bjvfh7); + assign Rnxfh7 = (R8vfh7 ^ V6vfh7); + assign Dlxfh7 = (Xnxfh7 & Doxfh7); + assign Doxfh7 = (~(Revfh7 & ahb_haddr[2])); + assign Xnxfh7 = (Joxfh7 & Poxfh7); + assign Poxfh7 = (~(Fkvfh7 & L2vfh7)); + assign Joxfh7 = (Vfvfh7 | Tp8gh7); + assign Piufh7 = (~(Voxfh7 & Bpxfh7)); + assign Bpxfh7 = (Hpxfh7 & Npxfh7); + assign Npxfh7 = (~(Jfvfh7 & Tpxfh7)); + assign Jfvfh7 = (Zpxfh7 & Fqxfh7); + assign Zpxfh7 = (Lqxfh7 & Rqxfh7); + assign Hpxfh7 = (Xqxfh7 & Ndvfh7); + assign Ndvfh7 = (Drxfh7 | Jrxfh7); + assign Xqxfh7 = (~(Rhvfh7 & Prxfh7)); + assign Prxfh7 = (~(Hjxfh7 & Vrxfh7)); + assign Vrxfh7 = (~(Bgxfh7 & com_rx_tdata[1])); + assign Bgxfh7 = (Tjxfh7 & Bsxfh7); + assign Tjxfh7 = (Hsxfh7 & com_rx_tdata[5]); + assign Hsxfh7 = (~(Z7vfh7 | com_rx_tdata[6])); + assign Hjxfh7 = (~(Nsxfh7 & Vivfh7)); + assign Vivfh7 = (Tsxfh7 & com_rx_tdata[6]); + assign Tsxfh7 = (Bsxfh7 & Z7vfh7); + assign Nsxfh7 = (~(Zsxfh7 | Ftxfh7)); + assign Zsxfh7 = (V6vfh7 & J9vfh7); + assign Voxfh7 = (Ltxfh7 & Rtxfh7); + assign Rtxfh7 = (~(Revfh7 & ahb_haddr[1])); + assign Revfh7 = (~(Xtxfh7 | Jrxfh7)); + assign Ltxfh7 = (Duxfh7 & Juxfh7); + assign Juxfh7 = (~(Fkvfh7 & P3vfh7)); + assign Fkvfh7 = (~(Lexfh7 & Puxfh7)); + assign Puxfh7 = (~(Rhvfh7 & Dfxfh7)); + assign Dfxfh7 = (~(Vuxfh7 & Bvxfh7)); + assign Bvxfh7 = (~(Hvxfh7 | Nvxfh7)); + assign Vuxfh7 = (Tvxfh7 & Zvxfh7); + assign Zvxfh7 = (~(Z7vfh7 & Fwxfh7)); + assign Fwxfh7 = (~(Lwxfh7 & Rwxfh7)); + assign Rwxfh7 = (com_rx_tdata[6] ? Dxxfh7 : Xwxfh7); + assign Dxxfh7 = (~(Zjxfh7 & V6vfh7)); + assign Xwxfh7 = (~(com_rx_tdata[0] & Bsxfh7)); + assign Lwxfh7 = (Jxxfh7 & Pxxfh7); + assign Pxxfh7 = (~(Ftxfh7 & com_rx_tdata[2])); + assign Jxxfh7 = (~(com_rx_tdata[5] & com_rx_tdata[3])); + assign Tvxfh7 = (com_rx_tdata[6] ? Byxfh7 : Vxxfh7); + assign Byxfh7 = (Bsxfh7 ? Z7vfh7 : V6vfh7); + assign Vxxfh7 = (~(Hyxfh7 | Nyxfh7)); + assign Hyxfh7 = (Z7vfh7 & Bjvfh7); + assign Rhvfh7 = (Tyxfh7 & Xexfh7); + assign Tyxfh7 = (~(Jrxfh7 | com_rx_tdata[7])); + assign Lexfh7 = (Zyxfh7 & Fzxfh7); + assign Fzxfh7 = (~(Lzxfh7 | Jrxfh7)); + assign Jrxfh7 = (Rzxfh7 & Xzxfh7); + assign Xzxfh7 = (D0yfh7 & V9vfh7); + assign Rzxfh7 = (J0yfh7 & P0yfh7); + assign P0yfh7 = (~(Xexfh7 & V0yfh7)); + assign J0yfh7 = (Xtxfh7 | B1yfh7); + assign Zyxfh7 = (H1yfh7 & N1yfh7); + assign H1yfh7 = (~(Xexfh7 & com_rx_tdata[7])); + assign Duxfh7 = (Vfvfh7 | Re8gh7); + assign Vfvfh7 = (~(T1yfh7 & Lqxfh7)); + assign T1yfh7 = (Z1yfh7 & Rqxfh7); + assign Jiufh7 = (!F2yfh7); + assign F2yfh7 = (N1yfh7 ? Hp8gh7 : Jc9gh7); + assign Diufh7 = (!L2yfh7); + assign L2yfh7 = (N1yfh7 ? Zs8gh7 : D39gh7); + assign Xhufh7 = (!R2yfh7); + assign R2yfh7 = (N1yfh7 ? Dl8gh7 : F89gh7); + assign Rhufh7 = (!X2yfh7); + assign X2yfh7 = (N1yfh7 ? Xn8gh7 : D69gh7); + assign Lhufh7 = (!D3yfh7); + assign D3yfh7 = (N1yfh7 ? Rk8gh7 : T49gh7); + assign Fhufh7 = (!J3yfh7); + assign J3yfh7 = (N1yfh7 ? Ns8gh7 : J39gh7); + assign Zgufh7 = (!P3yfh7); + assign P3yfh7 = (N1yfh7 ? Fk8gh7 : L89gh7); + assign Tgufh7 = (!V3yfh7); + assign V3yfh7 = (N1yfh7 ? Jo8gh7 : J69gh7); + assign Ngufh7 = (!B4yfh7); + assign B4yfh7 = (N1yfh7 ? Tj8gh7 : Z49gh7); + assign Hgufh7 = (!H4yfh7); + assign H4yfh7 = (N1yfh7 ? Bs8gh7 : P39gh7); + assign Bgufh7 = (!N4yfh7); + assign N4yfh7 = (N1yfh7 ? Hj8gh7 : R89gh7); + assign Vfufh7 = (!T4yfh7); + assign T4yfh7 = (N1yfh7 ? Ln8gh7 : P69gh7); + assign Pfufh7 = (!Z4yfh7); + assign Z4yfh7 = (N1yfh7 ? Vi8gh7 : F59gh7); + assign Jfufh7 = (!F5yfh7); + assign F5yfh7 = (N1yfh7 ? Pr8gh7 : V39gh7); + assign Dfufh7 = (!L5yfh7); + assign L5yfh7 = (N1yfh7 ? Ji8gh7 : X89gh7); + assign Xeufh7 = (!R5yfh7); + assign R5yfh7 = (N1yfh7 ? Vo8gh7 : V69gh7); + assign Reufh7 = (!X5yfh7); + assign X5yfh7 = (N1yfh7 ? Xh8gh7 : L59gh7); + assign Leufh7 = (!D6yfh7); + assign D6yfh7 = (N1yfh7 ? Dr8gh7 : B49gh7); + assign Feufh7 = (!J6yfh7); + assign J6yfh7 = (N1yfh7 ? Lh8gh7 : D99gh7); + assign Zdufh7 = (!P6yfh7); + assign P6yfh7 = (N1yfh7 ? Nm8gh7 : B79gh7); + assign Tdufh7 = (!V6yfh7); + assign V6yfh7 = (N1yfh7 ? Zg8gh7 : R59gh7); + assign Ndufh7 = (!B7yfh7); + assign B7yfh7 = (N1yfh7 ? Rq8gh7 : H49gh7); + assign Hdufh7 = (!H7yfh7); + assign H7yfh7 = (N1yfh7 ? Ng8gh7 : J99gh7); + assign Bdufh7 = (!N7yfh7); + assign N7yfh7 = (N1yfh7 ? Zm8gh7 : H79gh7); + assign Vcufh7 = (!T7yfh7); + assign T7yfh7 = (N1yfh7 ? Bg8gh7 : X59gh7); + assign Pcufh7 = (!Z7yfh7); + assign Z7yfh7 = (N1yfh7 ? Fq8gh7 : N49gh7); + assign Jcufh7 = (!F8yfh7); + assign F8yfh7 = (N1yfh7 ? Pf8gh7 : P99gh7); + assign Dcufh7 = (!L8yfh7); + assign L8yfh7 = (N1yfh7 ? Bm8gh7 : Dc9gh7); + assign Xbufh7 = (!R8yfh7); + assign R8yfh7 = (N1yfh7 ? Df8gh7 : N79gh7); + assign Rbufh7 = (!X8yfh7); + assign X8yfh7 = (D9yfh7 ? T79gh7 : Tp8gh7); + assign Lbufh7 = (!J9yfh7); + assign J9yfh7 = (N1yfh7 ? Re8gh7 : Vc9gh7); + assign N1yfh7 = (!D9yfh7); + assign Fbufh7 = (P9yfh7 ? Zgvfh7 : Z4vfh7); + assign Zaufh7 = (P9yfh7 ? Zmvfh7 : Jlvfh7); + assign Taufh7 = (P9yfh7 ? Tpvfh7 : Dovfh7); + assign Naufh7 = (P9yfh7 ? Nsvfh7 : Xqvfh7); + assign Haufh7 = (P9yfh7 ? Bvvfh7 : Zdvfh7); + assign Baufh7 = (P9yfh7 ? Pxvfh7 : Vlvfh7); + assign V9ufh7 = (P9yfh7 ? D0wfh7 : Povfh7); + assign P9ufh7 = (P9yfh7 ? R2wfh7 : Jrvfh7); + assign J9ufh7 = (P9yfh7 ? F5wfh7 : Xtvfh7); + assign D9ufh7 = (P9yfh7 ? T7wfh7 : Lwvfh7); + assign X8ufh7 = (P9yfh7 ? Hawfh7 : Zyvfh7); + assign R8ufh7 = (P9yfh7 ? Vcwfh7 : N1wfh7); + assign L8ufh7 = (P9yfh7 ? Jfwfh7 : B4wfh7); + assign F8ufh7 = (P9yfh7 ? Xhwfh7 : P6wfh7); + assign Z7ufh7 = (P9yfh7 ? Lkwfh7 : D9wfh7); + assign T7ufh7 = (P9yfh7 ? Zmwfh7 : Rbwfh7); + assign N7ufh7 = (P9yfh7 ? Npwfh7 : Fewfh7); + assign H7ufh7 = (P9yfh7 ? Bswfh7 : Tgwfh7); + assign B7ufh7 = (P9yfh7 ? Puwfh7 : Hjwfh7); + assign V6ufh7 = (P9yfh7 ? Dxwfh7 : Vlwfh7); + assign P6ufh7 = (P9yfh7 ? Lzwfh7 : Jowfh7); + assign J6ufh7 = (P9yfh7 ? T1xfh7 : Xqwfh7); + assign D6ufh7 = (P9yfh7 ? B4xfh7 : Ltwfh7); + assign X5ufh7 = (P9yfh7 ? J6xfh7 : Zvwfh7); + assign R5ufh7 = (P9yfh7 ? R8xfh7 : Rwufh7); + assign L5ufh7 = (P9yfh7 ? Zaxfh7 : Vxufh7); + assign F5ufh7 = (P9yfh7 ? Hdxfh7 : Zyufh7); + assign Z4ufh7 = (P9yfh7 ? Fhxfh7 : D0vfh7); + assign T4ufh7 = (P9yfh7 ? Jixfh7 : H1vfh7); + assign N4ufh7 = (P9yfh7 ? Bmxfh7 : L2vfh7); + assign P9yfh7 = (!Lzxfh7); + assign H4ufh7 = (Lzxfh7 ? P3vfh7 : Tpxfh7); + assign B4ufh7 = (~(V9yfh7 & Bayfh7)); + assign Bayfh7 = (Hayfh7 | Vitfh7); + assign Hayfh7 = (Nayfh7 & Tayfh7); + assign Tayfh7 = (~(Vc9gh7 & Zayfh7)); + assign V9yfh7 = (~(Fbyfh7 & P3vfh7)); + assign V3ufh7 = (~(Lbyfh7 & Rbyfh7)); + assign Rbyfh7 = (Xbyfh7 | Pitfh7); + assign Xbyfh7 = (Nayfh7 & Dcyfh7); + assign Dcyfh7 = (~(Jc9gh7 & Zayfh7)); + assign Lbyfh7 = (~(Fbyfh7 & Z4vfh7)); + assign P3ufh7 = (~(Jcyfh7 & Pcyfh7)); + assign Pcyfh7 = (Vcyfh7 | Bjtfh7); + assign Vcyfh7 = (Nayfh7 & Bdyfh7); + assign Bdyfh7 = (~(T79gh7 & Zayfh7)); + assign Jcyfh7 = (~(Fbyfh7 & L2vfh7)); + assign J3ufh7 = (~(Hdyfh7 & Ndyfh7)); + assign Ndyfh7 = (Tdyfh7 | Hjtfh7); + assign Tdyfh7 = (Nayfh7 & Zdyfh7); + assign Zdyfh7 = (~(N79gh7 & Zayfh7)); + assign Hdyfh7 = (~(Fbyfh7 & H1vfh7)); + assign D3ufh7 = (~(Feyfh7 & Leyfh7)); + assign Leyfh7 = (Reyfh7 | Njtfh7); + assign Reyfh7 = (Nayfh7 & Xeyfh7); + assign Xeyfh7 = (~(Dc9gh7 & Zayfh7)); + assign Feyfh7 = (~(Fbyfh7 & D0vfh7)); + assign X2ufh7 = (~(Dfyfh7 & Jfyfh7)); + assign Jfyfh7 = (Pfyfh7 | Tjtfh7); + assign Pfyfh7 = (Nayfh7 & Vfyfh7); + assign Vfyfh7 = (~(P99gh7 & Zayfh7)); + assign Dfyfh7 = (~(Fbyfh7 & Zyufh7)); + assign R2ufh7 = (~(Bgyfh7 & Hgyfh7)); + assign Hgyfh7 = (Ngyfh7 | Zjtfh7); + assign Ngyfh7 = (Nayfh7 & Tgyfh7); + assign Tgyfh7 = (~(N49gh7 & Zayfh7)); + assign Bgyfh7 = (~(Fbyfh7 & Vxufh7)); + assign L2ufh7 = (~(Zgyfh7 & Fhyfh7)); + assign Fhyfh7 = (Lhyfh7 | Fktfh7); + assign Lhyfh7 = (Nayfh7 & Rhyfh7); + assign Rhyfh7 = (~(X59gh7 & Zayfh7)); + assign Nayfh7 = (Xhyfh7 & Sorfh7); + assign Xhyfh7 = (Diyfh7 & Zvwfh7); + assign Zgyfh7 = (~(Fbyfh7 & Rwufh7)); + assign Fbyfh7 = (Jiyfh7 & Sorfh7); + assign Jiyfh7 = (Diyfh7 & Ltwfh7); + assign F2ufh7 = (!Piyfh7); + assign Piyfh7 = (D9yfh7 ? Z79gh7 : Pl8gh7); + assign D9yfh7 = (Viyfh7 & Bjyfh7); + assign Viyfh7 = (Z1yfh7 & B1yfh7); + assign Z1yfh7 = (!Hjyfh7); + assign Z1ufh7 = (Lzxfh7 ? Bdvfh7 : Pfvfh7); + assign Lzxfh7 = (Njyfh7 & Fqxfh7); + assign Njyfh7 = (Rqxfh7 & B1yfh7); + assign T1ufh7 = (!Tjyfh7); + assign Tjyfh7 = (Fkyfh7 ? Jltfh7 : Zjyfh7); + assign Zjyfh7 = (Lkyfh7 & Rkyfh7); + assign Rkyfh7 = (Xkyfh7 & Dlyfh7); + assign Dlyfh7 = (~(ahb_hrdata[0] & Jlyfh7)); + assign Xkyfh7 = (Plyfh7 | Jc9gh7); + assign Lkyfh7 = (Vlyfh7 & Bmyfh7); + assign Bmyfh7 = (~(Hmyfh7 & Zgvfh7)); + assign Vlyfh7 = (~(Nmyfh7 & com_rx_tdata[0])); + assign N1ufh7 = (!Tmyfh7); + assign Tmyfh7 = (Fkyfh7 ? Pltfh7 : Zmyfh7); + assign Zmyfh7 = (Fnyfh7 & Lnyfh7); + assign Lnyfh7 = (Rnyfh7 & Xnyfh7); + assign Xnyfh7 = (~(ahb_hrdata[1] & Jlyfh7)); + assign Rnyfh7 = (Plyfh7 | Vc9gh7); + assign Fnyfh7 = (Doyfh7 & Joyfh7); + assign Joyfh7 = (~(Hmyfh7 & Tpxfh7)); + assign Doyfh7 = (~(Nmyfh7 & com_rx_tdata[1])); + assign H1ufh7 = (!Poyfh7); + assign Poyfh7 = (Fkyfh7 ? Vltfh7 : Voyfh7); + assign Voyfh7 = (Bpyfh7 & Hpyfh7); + assign Hpyfh7 = (Npyfh7 & Tpyfh7); + assign Tpyfh7 = (~(ahb_hrdata[2] & Jlyfh7)); + assign Npyfh7 = (Plyfh7 | T79gh7); + assign Bpyfh7 = (Zpyfh7 & Fqyfh7); + assign Fqyfh7 = (~(Hmyfh7 & Bmxfh7)); + assign Bmxfh7 = (!Np8gh7); + assign Zpyfh7 = (~(Nmyfh7 & com_rx_tdata[2])); + assign B1ufh7 = (!Lqyfh7); + assign Lqyfh7 = (Fkyfh7 ? Bmtfh7 : Rqyfh7); + assign Rqyfh7 = (Xqyfh7 & Dryfh7); + assign Dryfh7 = (Jryfh7 & Pryfh7); + assign Pryfh7 = (~(ahb_hrdata[3] & Jlyfh7)); + assign Jryfh7 = (Plyfh7 | N79gh7); + assign Xqyfh7 = (Vryfh7 & Bsyfh7); + assign Bsyfh7 = (~(Hmyfh7 & Jixfh7)); + assign Vryfh7 = (~(Nmyfh7 & com_rx_tdata[3])); + assign V0ufh7 = (!Hsyfh7); + assign Hsyfh7 = (Fkyfh7 ? Hmtfh7 : Nsyfh7); + assign Nsyfh7 = (Tsyfh7 & Zsyfh7); + assign Zsyfh7 = (Ftyfh7 & Ltyfh7); + assign Ltyfh7 = (~(ahb_hrdata[4] & Jlyfh7)); + assign Ftyfh7 = (Plyfh7 | Dc9gh7); + assign Tsyfh7 = (Rtyfh7 & Xtyfh7); + assign Xtyfh7 = (~(Hmyfh7 & Fhxfh7)); + assign Rtyfh7 = (~(Nmyfh7 & com_rx_tdata[4])); + assign P0ufh7 = (!Duyfh7); + assign Duyfh7 = (Fkyfh7 ? Nmtfh7 : Juyfh7); + assign Fkyfh7 = (!Puyfh7); + assign Juyfh7 = (Vuyfh7 & Bvyfh7); + assign Bvyfh7 = (Hvyfh7 & Nvyfh7); + assign Nvyfh7 = (~(ahb_hrdata[5] & Jlyfh7)); + assign Hvyfh7 = (Plyfh7 | P99gh7); + assign Vuyfh7 = (Tvyfh7 & Zvyfh7); + assign Zvyfh7 = (~(Hmyfh7 & Hdxfh7)); + assign Tvyfh7 = (~(Nmyfh7 & com_rx_tdata[5])); + assign J0ufh7 = (!Fwyfh7); + assign Fwyfh7 = (Puyfh7 ? Lwyfh7 : Tmtfh7); + assign Lwyfh7 = (Rwyfh7 & Xwyfh7); + assign Xwyfh7 = (Dxyfh7 & Jxyfh7); + assign Jxyfh7 = (~(ahb_hrdata[6] & Jlyfh7)); + assign Dxyfh7 = (Plyfh7 | N49gh7); + assign Rwyfh7 = (Pxyfh7 & Vxyfh7); + assign Vxyfh7 = (~(Hmyfh7 & Zaxfh7)); + assign Pxyfh7 = (~(Nmyfh7 & com_rx_tdata[6])); + assign D0ufh7 = (!Byyfh7); + assign Byyfh7 = (Puyfh7 ? Hyyfh7 : Zmtfh7); + assign Puyfh7 = (~(Nyyfh7 & Tyyfh7)); + assign Hyyfh7 = (Zyyfh7 & Fzyfh7); + assign Fzyfh7 = (Lzyfh7 & Rzyfh7); + assign Rzyfh7 = (~(ahb_hrdata[7] & Jlyfh7)); + assign Lzyfh7 = (Plyfh7 | X59gh7); + assign Zyyfh7 = (Xzyfh7 & D0zfh7); + assign D0zfh7 = (~(Hmyfh7 & R8xfh7)); + assign Xzyfh7 = (~(Nmyfh7 & com_rx_tdata[7])); + assign Xztfh7 = (V0zfh7 ? P0zfh7 : J0zfh7); + assign J0zfh7 = (~(B1zfh7 & H1zfh7)); + assign H1zfh7 = (N1zfh7 & T1zfh7); + assign T1zfh7 = (~(ahb_hrdata[8] & Jlyfh7)); + assign N1zfh7 = (Z1zfh7 | H79gh7); + assign B1zfh7 = (F2zfh7 & L2zfh7); + assign L2zfh7 = (~(Hmyfh7 & J6xfh7)); + assign F2zfh7 = (~(R2zfh7 & com_rx_tdata[0])); + assign Rztfh7 = (V0zfh7 ? D3zfh7 : X2zfh7); + assign X2zfh7 = (~(J3zfh7 & P3zfh7)); + assign P3zfh7 = (V3zfh7 & B4zfh7); + assign B4zfh7 = (~(ahb_hrdata[9] & Jlyfh7)); + assign V3zfh7 = (Z1zfh7 | J99gh7); + assign J3zfh7 = (H4zfh7 & N4zfh7); + assign N4zfh7 = (~(Hmyfh7 & B4xfh7)); + assign H4zfh7 = (~(R2zfh7 & com_rx_tdata[1])); + assign Lztfh7 = (V0zfh7 ? Z4zfh7 : T4zfh7); + assign T4zfh7 = (~(F5zfh7 & L5zfh7)); + assign L5zfh7 = (R5zfh7 & X5zfh7); + assign X5zfh7 = (~(ahb_hrdata[10] & Jlyfh7)); + assign R5zfh7 = (Z1zfh7 | H49gh7); + assign F5zfh7 = (D6zfh7 & J6zfh7); + assign J6zfh7 = (~(Hmyfh7 & T1xfh7)); + assign D6zfh7 = (~(R2zfh7 & com_rx_tdata[2])); + assign Fztfh7 = (V0zfh7 ? V6zfh7 : P6zfh7); + assign P6zfh7 = (~(B7zfh7 & H7zfh7)); + assign H7zfh7 = (N7zfh7 & T7zfh7); + assign T7zfh7 = (~(ahb_hrdata[11] & Jlyfh7)); + assign N7zfh7 = (Z1zfh7 | R59gh7); + assign B7zfh7 = (Z7zfh7 & F8zfh7); + assign F8zfh7 = (~(Hmyfh7 & Lzwfh7)); + assign Z7zfh7 = (~(R2zfh7 & com_rx_tdata[3])); + assign Zytfh7 = (V0zfh7 ? R8zfh7 : L8zfh7); + assign L8zfh7 = (~(X8zfh7 & D9zfh7)); + assign D9zfh7 = (J9zfh7 & P9zfh7); + assign P9zfh7 = (~(ahb_hrdata[12] & Jlyfh7)); + assign J9zfh7 = (Z1zfh7 | B79gh7); + assign X8zfh7 = (V9zfh7 & Bazfh7); + assign Bazfh7 = (~(Hmyfh7 & Dxwfh7)); + assign V9zfh7 = (~(R2zfh7 & com_rx_tdata[4])); + assign Tytfh7 = (V0zfh7 ? Nazfh7 : Hazfh7); + assign Hazfh7 = (~(Tazfh7 & Zazfh7)); + assign Zazfh7 = (Fbzfh7 & Lbzfh7); + assign Lbzfh7 = (~(ahb_hrdata[13] & Jlyfh7)); + assign Fbzfh7 = (Z1zfh7 | D99gh7); + assign Tazfh7 = (Rbzfh7 & Xbzfh7); + assign Xbzfh7 = (~(Hmyfh7 & Puwfh7)); + assign Rbzfh7 = (~(R2zfh7 & com_rx_tdata[5])); + assign Nytfh7 = (V0zfh7 ? Jczfh7 : Dczfh7); + assign Dczfh7 = (~(Pczfh7 & Vczfh7)); + assign Vczfh7 = (Bdzfh7 & Hdzfh7); + assign Hdzfh7 = (~(ahb_hrdata[14] & Jlyfh7)); + assign Bdzfh7 = (Z1zfh7 | B49gh7); + assign Pczfh7 = (Ndzfh7 & Tdzfh7); + assign Tdzfh7 = (~(Hmyfh7 & Bswfh7)); + assign Ndzfh7 = (~(R2zfh7 & com_rx_tdata[6])); + assign Hytfh7 = (V0zfh7 ? Fezfh7 : Zdzfh7); + assign V0zfh7 = (Nyyfh7 & Lezfh7); + assign Lezfh7 = (~(R2zfh7 & Rezfh7)); + assign Zdzfh7 = (~(Xezfh7 & Dfzfh7)); + assign Dfzfh7 = (Jfzfh7 & Pfzfh7); + assign Pfzfh7 = (~(ahb_hrdata[15] & Jlyfh7)); + assign Jfzfh7 = (Z1zfh7 | L59gh7); + assign Xezfh7 = (Vfzfh7 & Bgzfh7); + assign Bgzfh7 = (~(Hmyfh7 & Npwfh7)); + assign Vfzfh7 = (~(R2zfh7 & com_rx_tdata[7])); + assign Bytfh7 = (Tgzfh7 ? Ngzfh7 : Hgzfh7); + assign Hgzfh7 = (~(Zgzfh7 & Fhzfh7)); + assign Fhzfh7 = (Lhzfh7 & Rhzfh7); + assign Rhzfh7 = (Xhzfh7 | Pitfh7); + assign Lhzfh7 = (Dizfh7 & Jizfh7); + assign Jizfh7 = (~(ahb_hrdata[16] & Jlyfh7)); + assign Dizfh7 = (~(Pizfh7 & Rbwfh7)); + assign Zgzfh7 = (Vizfh7 & Bjzfh7); + assign Bjzfh7 = (~(Hmyfh7 & Zmwfh7)); + assign Vizfh7 = (~(Hjzfh7 & com_rx_tdata[0])); + assign Vxtfh7 = (Tgzfh7 ? Tjzfh7 : Njzfh7); + assign Njzfh7 = (~(Zjzfh7 & Fkzfh7)); + assign Fkzfh7 = (Lkzfh7 & Rkzfh7); + assign Rkzfh7 = (Xhzfh7 | Vitfh7); + assign Lkzfh7 = (Xkzfh7 & Dlzfh7); + assign Dlzfh7 = (~(ahb_hrdata[17] & Jlyfh7)); + assign Xkzfh7 = (~(Pizfh7 & D9wfh7)); + assign Zjzfh7 = (Jlzfh7 & Plzfh7); + assign Plzfh7 = (~(Hmyfh7 & Lkwfh7)); + assign Jlzfh7 = (~(Hjzfh7 & com_rx_tdata[1])); + assign Pxtfh7 = (Tgzfh7 ? Bmzfh7 : Vlzfh7); + assign Vlzfh7 = (~(Hmzfh7 & Nmzfh7)); + assign Nmzfh7 = (Tmzfh7 & Zmzfh7); + assign Zmzfh7 = (Xhzfh7 | Bjtfh7); + assign Tmzfh7 = (Fnzfh7 & Lnzfh7); + assign Lnzfh7 = (~(ahb_hrdata[18] & Jlyfh7)); + assign Fnzfh7 = (~(Pizfh7 & P6wfh7)); + assign Hmzfh7 = (Rnzfh7 & Xnzfh7); + assign Xnzfh7 = (~(Hmyfh7 & Xhwfh7)); + assign Rnzfh7 = (~(Hjzfh7 & com_rx_tdata[2])); + assign Jxtfh7 = (Tgzfh7 ? Jozfh7 : Dozfh7); + assign Dozfh7 = (~(Pozfh7 & Vozfh7)); + assign Vozfh7 = (Bpzfh7 & Hpzfh7); + assign Hpzfh7 = (Xhzfh7 | Hjtfh7); + assign Bpzfh7 = (Npzfh7 & Tpzfh7); + assign Tpzfh7 = (~(ahb_hrdata[19] & Jlyfh7)); + assign Npzfh7 = (~(Pizfh7 & B4wfh7)); + assign Pozfh7 = (Zpzfh7 & Fqzfh7); + assign Fqzfh7 = (~(Hmyfh7 & Jfwfh7)); + assign Zpzfh7 = (~(Hjzfh7 & com_rx_tdata[3])); + assign Dxtfh7 = (Tgzfh7 ? Rqzfh7 : Lqzfh7); + assign Lqzfh7 = (~(Xqzfh7 & Drzfh7)); + assign Drzfh7 = (Jrzfh7 & Przfh7); + assign Przfh7 = (Xhzfh7 | Njtfh7); + assign Jrzfh7 = (Vrzfh7 & Bszfh7); + assign Bszfh7 = (~(ahb_hrdata[20] & Jlyfh7)); + assign Vrzfh7 = (~(Pizfh7 & N1wfh7)); + assign Xqzfh7 = (Hszfh7 & Nszfh7); + assign Nszfh7 = (~(Hmyfh7 & Vcwfh7)); + assign Hszfh7 = (~(Hjzfh7 & com_rx_tdata[4])); + assign Xwtfh7 = (Tgzfh7 ? Zszfh7 : Tszfh7); + assign Tszfh7 = (~(Ftzfh7 & Ltzfh7)); + assign Ltzfh7 = (Rtzfh7 & Xtzfh7); + assign Xtzfh7 = (Xhzfh7 | Tjtfh7); + assign Rtzfh7 = (Duzfh7 & Juzfh7); + assign Juzfh7 = (~(ahb_hrdata[21] & Jlyfh7)); + assign Duzfh7 = (~(Pizfh7 & Zyvfh7)); + assign Ftzfh7 = (Puzfh7 & Vuzfh7); + assign Vuzfh7 = (~(Hmyfh7 & Hawfh7)); + assign Puzfh7 = (~(Hjzfh7 & com_rx_tdata[5])); + assign Rwtfh7 = (Tgzfh7 ? Hvzfh7 : Bvzfh7); + assign Bvzfh7 = (~(Nvzfh7 & Tvzfh7)); + assign Tvzfh7 = (Zvzfh7 & Fwzfh7); + assign Fwzfh7 = (Xhzfh7 | Zjtfh7); + assign Zvzfh7 = (Lwzfh7 & Rwzfh7); + assign Rwzfh7 = (~(ahb_hrdata[22] & Jlyfh7)); + assign Lwzfh7 = (~(Pizfh7 & Lwvfh7)); + assign Nvzfh7 = (Xwzfh7 & Dxzfh7); + assign Dxzfh7 = (~(Hmyfh7 & T7wfh7)); + assign Xwzfh7 = (~(Hjzfh7 & com_rx_tdata[6])); + assign Lwtfh7 = (Tgzfh7 ? Pxzfh7 : Jxzfh7); + assign Tgzfh7 = (Nyyfh7 & Vxzfh7); + assign Vxzfh7 = (~(Hjzfh7 & Rezfh7)); + assign Jxzfh7 = (~(Byzfh7 & Hyzfh7)); + assign Hyzfh7 = (Nyzfh7 & Tyzfh7); + assign Tyzfh7 = (Xhzfh7 | Fktfh7); + assign Nyzfh7 = (Zyzfh7 & Fzzfh7); + assign Fzzfh7 = (~(ahb_hrdata[23] & Jlyfh7)); + assign Zyzfh7 = (~(Pizfh7 & Xtvfh7)); + assign Byzfh7 = (Lzzfh7 & Rzzfh7); + assign Rzzfh7 = (~(Hmyfh7 & F5wfh7)); + assign Lzzfh7 = (~(Hjzfh7 & com_rx_tdata[7])); + assign Fwtfh7 = (J00gh7 ? D00gh7 : Xzzfh7); + assign Xzzfh7 = (~(P00gh7 & V00gh7)); + assign V00gh7 = (B10gh7 & H10gh7); + assign H10gh7 = (~(gpi8[0] & N10gh7)); + assign B10gh7 = (T10gh7 & Z10gh7); + assign Z10gh7 = (~(ahb_hrdata[24] & Jlyfh7)); + assign T10gh7 = (~(Pizfh7 & Jrvfh7)); + assign P00gh7 = (F20gh7 & L20gh7); + assign L20gh7 = (~(Hmyfh7 & R2wfh7)); + assign F20gh7 = (~(R20gh7 & com_rx_tdata[0])); + assign Zvtfh7 = (J00gh7 ? D30gh7 : X20gh7); + assign X20gh7 = (~(J30gh7 & P30gh7)); + assign P30gh7 = (V30gh7 & B40gh7); + assign B40gh7 = (~(gpi8[1] & N10gh7)); + assign V30gh7 = (H40gh7 & N40gh7); + assign N40gh7 = (~(ahb_hrdata[25] & Jlyfh7)); + assign H40gh7 = (~(Pizfh7 & Povfh7)); + assign J30gh7 = (T40gh7 & Z40gh7); + assign Z40gh7 = (~(Hmyfh7 & D0wfh7)); + assign T40gh7 = (~(R20gh7 & com_rx_tdata[1])); + assign Tvtfh7 = (J00gh7 ? L50gh7 : F50gh7); + assign F50gh7 = (~(R50gh7 & X50gh7)); + assign X50gh7 = (D60gh7 & J60gh7); + assign J60gh7 = (~(gpi8[2] & N10gh7)); + assign D60gh7 = (P60gh7 & V60gh7); + assign V60gh7 = (~(ahb_hrdata[26] & Jlyfh7)); + assign P60gh7 = (~(Pizfh7 & Vlvfh7)); + assign R50gh7 = (B70gh7 & H70gh7); + assign H70gh7 = (~(Hmyfh7 & Pxvfh7)); + assign B70gh7 = (~(R20gh7 & com_rx_tdata[2])); + assign Nvtfh7 = (J00gh7 ? T70gh7 : N70gh7); + assign N70gh7 = (~(Z70gh7 & F80gh7)); + assign F80gh7 = (L80gh7 & R80gh7); + assign R80gh7 = (~(gpi8[3] & N10gh7)); + assign L80gh7 = (X80gh7 & D90gh7); + assign D90gh7 = (~(ahb_hrdata[27] & Jlyfh7)); + assign X80gh7 = (~(Pizfh7 & Zdvfh7)); + assign Z70gh7 = (J90gh7 & P90gh7); + assign P90gh7 = (~(Hmyfh7 & Bvvfh7)); + assign J90gh7 = (~(R20gh7 & com_rx_tdata[3])); + assign Hvtfh7 = (J00gh7 ? Ba0gh7 : V90gh7); + assign V90gh7 = (~(Ha0gh7 & Na0gh7)); + assign Na0gh7 = (Ta0gh7 & Za0gh7); + assign Za0gh7 = (~(gpi8[4] & N10gh7)); + assign Ta0gh7 = (Fb0gh7 & Lb0gh7); + assign Lb0gh7 = (~(ahb_hrdata[28] & Jlyfh7)); + assign Fb0gh7 = (~(Pizfh7 & Xqvfh7)); + assign Ha0gh7 = (Rb0gh7 & Xb0gh7); + assign Xb0gh7 = (~(Hmyfh7 & Nsvfh7)); + assign Rb0gh7 = (~(R20gh7 & com_rx_tdata[4])); + assign Bvtfh7 = (J00gh7 ? Jc0gh7 : Dc0gh7); + assign Dc0gh7 = (~(Pc0gh7 & Vc0gh7)); + assign Vc0gh7 = (Bd0gh7 & Hd0gh7); + assign Hd0gh7 = (~(gpi8[5] & N10gh7)); + assign Bd0gh7 = (Nd0gh7 & Td0gh7); + assign Td0gh7 = (~(ahb_hrdata[29] & Jlyfh7)); + assign Nd0gh7 = (~(Pizfh7 & Dovfh7)); + assign Pc0gh7 = (Zd0gh7 & Fe0gh7); + assign Fe0gh7 = (~(Hmyfh7 & Tpvfh7)); + assign Zd0gh7 = (~(R20gh7 & com_rx_tdata[5])); + assign Vutfh7 = (J00gh7 ? Re0gh7 : Le0gh7); + assign Le0gh7 = (~(Xe0gh7 & Df0gh7)); + assign Df0gh7 = (Jf0gh7 & Pf0gh7); + assign Pf0gh7 = (~(gpi8[6] & N10gh7)); + assign Jf0gh7 = (Vf0gh7 & Bg0gh7); + assign Bg0gh7 = (~(ahb_hrdata[30] & Jlyfh7)); + assign Vf0gh7 = (~(Pizfh7 & Jlvfh7)); + assign Xe0gh7 = (Hg0gh7 & Ng0gh7); + assign Ng0gh7 = (~(Hmyfh7 & Zmvfh7)); + assign Hg0gh7 = (~(R20gh7 & com_rx_tdata[6])); + assign Putfh7 = (J00gh7 ? Zg0gh7 : Tg0gh7); + assign J00gh7 = (Nyyfh7 & Fh0gh7); + assign Fh0gh7 = (~(R20gh7 & Rezfh7)); + assign Nyyfh7 = (Lh0gh7 & Rh0gh7); + assign Rh0gh7 = (Xh0gh7 & Di0gh7); + assign Lh0gh7 = (Ji0gh7 & Pi0gh7); + assign Pi0gh7 = (~(Vi0gh7 & Jlyfh7)); + assign Tg0gh7 = (~(Bj0gh7 & Hj0gh7)); + assign Hj0gh7 = (Nj0gh7 & Tj0gh7); + assign Tj0gh7 = (~(gpi8[7] & N10gh7)); + assign Nj0gh7 = (Zj0gh7 & Fk0gh7); + assign Fk0gh7 = (~(ahb_hrdata[31] & Jlyfh7)); + assign Jlyfh7 = (!Lk0gh7); + assign Zj0gh7 = (~(Pizfh7 & Bdvfh7)); + assign Bj0gh7 = (Rk0gh7 & Xk0gh7); + assign Xk0gh7 = (~(Hmyfh7 & Pfvfh7)); + assign Hmyfh7 = (!Xh0gh7); + assign Rk0gh7 = (~(R20gh7 & com_rx_tdata[7])); + assign R20gh7 = (!Dl0gh7); + assign Jutfh7 = (Pl0gh7 ? com_tx_tdata[0] : Jl0gh7); + assign Jl0gh7 = (~(Vl0gh7 & Bm0gh7)); + assign Bm0gh7 = (Hm0gh7 & Nm0gh7); + assign Nm0gh7 = (Tm0gh7 & Zm0gh7); + assign Zm0gh7 = (Fn0gh7 & Ln0gh7); + assign Fn0gh7 = (Rn0gh7 & Xn0gh7); + assign Tm0gh7 = (Do0gh7 & Xhzfh7); + assign Hm0gh7 = (Jo0gh7 & Po0gh7); + assign Po0gh7 = (Vo0gh7 & Bp0gh7); + assign Bp0gh7 = (~(Hp0gh7 & Np0gh7)); + assign Np0gh7 = (~(Tp0gh7 & Zp0gh7)); + assign Zp0gh7 = (~(Fq0gh7 & D3zfh7)); + assign D3zfh7 = (!Lntfh7); + assign Tp0gh7 = (~(Lq0gh7 & P0zfh7)); + assign P0zfh7 = (!Fntfh7); + assign Vo0gh7 = (Rq0gh7 & Xq0gh7); + assign Jo0gh7 = (Dr0gh7 & Jr0gh7); + assign Jr0gh7 = (~(Pr0gh7 & Vr0gh7)); + assign Vr0gh7 = (~(Bs0gh7 & Hs0gh7)); + assign Hs0gh7 = (Ns0gh7 | Hmtfh7); + assign Bs0gh7 = (Ts0gh7 | Nmtfh7); + assign Dr0gh7 = (~(Zs0gh7 & Ft0gh7)); + assign Ft0gh7 = (~(Lt0gh7 & Rt0gh7)); + assign Rt0gh7 = (Xt0gh7 | Pltfh7); + assign Xt0gh7 = (!Du0gh7); + assign Lt0gh7 = (~(Ju0gh7 & Pu0gh7)); + assign Vl0gh7 = (Vu0gh7 & Bv0gh7); + assign Bv0gh7 = (Hv0gh7 & Nv0gh7); + assign Nv0gh7 = (Tv0gh7 & Zv0gh7); + assign Zv0gh7 = (~(Fw0gh7 & Lw0gh7)); + assign Lw0gh7 = (~(Rw0gh7 & Xw0gh7)); + assign Xw0gh7 = (~(Dx0gh7 & D30gh7)); + assign D30gh7 = (!Drtfh7); + assign Rw0gh7 = (~(Jx0gh7 & D00gh7)); + assign D00gh7 = (!Xqtfh7); + assign Tv0gh7 = (Px0gh7 & Vx0gh7); + assign Vx0gh7 = (~(By0gh7 & Hy0gh7)); + assign Hy0gh7 = (~(Ny0gh7 & Ty0gh7)); + assign Ty0gh7 = (~(Zy0gh7 & Nazfh7)); + assign Nazfh7 = (!Jotfh7); + assign Ny0gh7 = (~(Fz0gh7 & R8zfh7)); + assign R8zfh7 = (!Dotfh7); + assign Px0gh7 = (~(Lz0gh7 & Rz0gh7)); + assign Rz0gh7 = (~(Xz0gh7 & D01gh7)); + assign D01gh7 = (~(J01gh7 & Tjzfh7)); + assign Tjzfh7 = (!Hptfh7); + assign Xz0gh7 = (~(P01gh7 & Ngzfh7)); + assign Ngzfh7 = (!Bptfh7); + assign Hv0gh7 = (V01gh7 & B11gh7); + assign B11gh7 = (~(H11gh7 & N11gh7)); + assign N11gh7 = (~(T11gh7 & Z11gh7)); + assign Z11gh7 = (~(F21gh7 & Zszfh7)); + assign Zszfh7 = (!Fqtfh7); + assign T11gh7 = (~(L21gh7 & Rqzfh7)); + assign Rqzfh7 = (!Zptfh7); + assign V01gh7 = (~(R21gh7 & X21gh7)); + assign X21gh7 = (~(D31gh7 & J31gh7)); + assign J31gh7 = (~(P31gh7 & Jc0gh7)); + assign Jc0gh7 = (!Bstfh7); + assign D31gh7 = (~(V31gh7 & Ba0gh7)); + assign Ba0gh7 = (!Vrtfh7); + assign Vu0gh7 = (B41gh7 & H41gh7); + assign H41gh7 = (N41gh7 & T41gh7); + assign T41gh7 = (~(stdio_rx_tdata[0] & Z41gh7)); + assign N41gh7 = (F51gh7 & L51gh7); + assign L51gh7 = (R51gh7 | Rb9gh7); + assign B41gh7 = (~(X51gh7 | D61gh7)); + assign Dutfh7 = (J61gh7 & P61gh7); + assign P61gh7 = (~(V61gh7 & B71gh7)); + assign B71gh7 = (H71gh7 & N71gh7); + assign N71gh7 = (T71gh7 & Z71gh7); + assign Z71gh7 = (F81gh7 & L81gh7); + assign F81gh7 = (~(R81gh7 & R21gh7)); + assign R81gh7 = (~(P31gh7 | Bstfh7)); + assign T71gh7 = (X81gh7 & D91gh7); + assign D91gh7 = (~(J91gh7 & By0gh7)); + assign J91gh7 = (~(Zy0gh7 | Jotfh7)); + assign X81gh7 = (~(P91gh7 & Zs0gh7)); + assign P91gh7 = (~(Du0gh7 | Pltfh7)); + assign H71gh7 = (V91gh7 & Ba1gh7); + assign Ba1gh7 = (~(Ha1gh7 & Lz0gh7)); + assign Ha1gh7 = (~(J01gh7 | Hptfh7)); + assign V91gh7 = (Na1gh7 & Ta1gh7); + assign Ta1gh7 = (~(Za1gh7 & Hp0gh7)); + assign Za1gh7 = (~(Fq0gh7 | Lntfh7)); + assign Na1gh7 = (~(Fb1gh7 & H11gh7)); + assign Fb1gh7 = (~(F21gh7 | Fqtfh7)); + assign V61gh7 = (Lb1gh7 & Rb1gh7); + assign Rb1gh7 = (Xb1gh7 & Dc1gh7); + assign Dc1gh7 = (~(Jc1gh7 & Pizfh7)); + assign Jc1gh7 = (~(Na9gh7 & Lbvfh7)); + assign Xb1gh7 = (Pc1gh7 & Vc1gh7); + assign Vc1gh7 = (~(Bd1gh7 & Fw0gh7)); + assign Bd1gh7 = (~(Dx0gh7 | Drtfh7)); + assign Pc1gh7 = (~(Hd1gh7 & Pr0gh7)); + assign Hd1gh7 = (~(Nd1gh7 | Nmtfh7)); + assign Lb1gh7 = (Td1gh7 & Zd1gh7); + assign Td1gh7 = (Fe1gh7 & Le1gh7); + assign Le1gh7 = (~(stdio_rx_tdata[1] & Z41gh7)); + assign J61gh7 = (~(Lktfh7 & Pl0gh7)); + assign Xttfh7 = (Pl0gh7 ? com_tx_tdata[2] : Re1gh7); + assign Re1gh7 = (~(Xe1gh7 & Df1gh7)); + assign Df1gh7 = (Jf1gh7 & Pf1gh7); + assign Pf1gh7 = (Vf1gh7 & Bg1gh7); + assign Bg1gh7 = (~(Hg1gh7 & Hp0gh7)); + assign Hg1gh7 = (~(Ng1gh7 | Rntfh7)); + assign Vf1gh7 = (Tg1gh7 & Xq0gh7); + assign Tg1gh7 = (~(Zg1gh7 & Zs0gh7)); + assign Zg1gh7 = (~(Fh1gh7 | Vltfh7)); + assign Jf1gh7 = (Lh1gh7 & Rh1gh7); + assign Rh1gh7 = (~(Xh1gh7 & H11gh7)); + assign Xh1gh7 = (~(Di1gh7 | Lqtfh7)); + assign Lh1gh7 = (Ji1gh7 & Pi1gh7); + assign Pi1gh7 = (~(Vi1gh7 & By0gh7)); + assign Vi1gh7 = (~(Bj1gh7 | Potfh7)); + assign Ji1gh7 = (~(Hj1gh7 & Lz0gh7)); + assign Hj1gh7 = (~(Nj1gh7 | Nptfh7)); + assign Xe1gh7 = (Tj1gh7 & Zj1gh7); + assign Zj1gh7 = (Fk1gh7 & Lk1gh7); + assign Lk1gh7 = (~(Rk1gh7 & Pr0gh7)); + assign Rk1gh7 = (~(Xk1gh7 | Tmtfh7)); + assign Fk1gh7 = (Dl1gh7 & Jl1gh7); + assign Jl1gh7 = (~(Pl1gh7 & Fw0gh7)); + assign Pl1gh7 = (~(Vl1gh7 | Jrtfh7)); + assign Dl1gh7 = (~(Bm1gh7 & R21gh7)); + assign Bm1gh7 = (~(Hm1gh7 | Hstfh7)); + assign Tj1gh7 = (Nm1gh7 & Tm1gh7); + assign Nm1gh7 = (Zm1gh7 & Fn1gh7); + assign Fn1gh7 = (R51gh7 | Ta9gh7); + assign Zm1gh7 = (~(stdio_rx_tdata[2] & Z41gh7)); + assign Rttfh7 = (Pl0gh7 ? com_tx_tdata[3] : Ln1gh7); + assign Ln1gh7 = (~(Rn1gh7 & Xn1gh7)); + assign Xn1gh7 = (Do1gh7 & Jo1gh7); + assign Jo1gh7 = (Po1gh7 & Vo1gh7); + assign Vo1gh7 = (L81gh7 & Lbvfh7); + assign Po1gh7 = (Bp1gh7 & Hp1gh7); + assign Bp1gh7 = (~(Np1gh7 & Tp1gh7)); + assign Np1gh7 = (~(Zp1gh7 | Zmtfh7)); + assign Do1gh7 = (Fq1gh7 & Lq1gh7); + assign Lq1gh7 = (~(Rq1gh7 & Xq1gh7)); + assign Rq1gh7 = (~(Dr1gh7 | Bmtfh7)); + assign Fq1gh7 = (Jr1gh7 & Pr1gh7); + assign Pr1gh7 = (~(Vr1gh7 & Bs1gh7)); + assign Vr1gh7 = (R21gh7 & Zg0gh7); + assign Jr1gh7 = (~(Hs1gh7 & Ns1gh7)); + assign Hs1gh7 = (By0gh7 & Fezfh7); + assign Rn1gh7 = (Ts1gh7 & Zs1gh7); + assign Zs1gh7 = (Ft1gh7 & Lt1gh7); + assign Lt1gh7 = (Rt1gh7 & Xt1gh7); + assign Xt1gh7 = (~(Du1gh7 & Ju1gh7)); + assign Du1gh7 = (Hp0gh7 & V6zfh7); + assign Rt1gh7 = (~(Pu1gh7 & Vu1gh7)); + assign Pu1gh7 = (H11gh7 & Pxzfh7); + assign Ft1gh7 = (Bv1gh7 & Hv1gh7); + assign Hv1gh7 = (~(Nv1gh7 & Tv1gh7)); + assign Nv1gh7 = (Lz0gh7 & Jozfh7); + assign Bv1gh7 = (~(Zv1gh7 & Fw1gh7)); + assign Zv1gh7 = (Fw0gh7 & T70gh7); + assign Ts1gh7 = (Lw1gh7 & Rw1gh7); + assign Lw1gh7 = (Xw1gh7 & Dx1gh7); + assign Dx1gh7 = (R51gh7 | Za9gh7); + assign Xw1gh7 = (~(stdio_rx_tdata[3] & Z41gh7)); + assign Lttfh7 = (Pl0gh7 ? com_tx_tdata[4] : Jx1gh7); + assign Jx1gh7 = (~(Px1gh7 & Vx1gh7)); + assign Vx1gh7 = (By1gh7 & Hy1gh7); + assign Hy1gh7 = (Ny1gh7 & Ty1gh7); + assign Ty1gh7 = (Do0gh7 & Zy1gh7); + assign Ny1gh7 = (Hp1gh7 & Fz1gh7); + assign By1gh7 = (Lz1gh7 & Rz1gh7); + assign Rz1gh7 = (Xz1gh7 & D02gh7); + assign D02gh7 = (~(R21gh7 & V31gh7)); + assign V31gh7 = (!J02gh7); + assign Xz1gh7 = (~(By0gh7 & Fz0gh7)); + assign Fz0gh7 = (!P02gh7); + assign Lz1gh7 = (V02gh7 & B12gh7); + assign B12gh7 = (Zp1gh7 | Ns0gh7); + assign V02gh7 = (~(Zs0gh7 & Ju0gh7)); + assign Px1gh7 = (H12gh7 & N12gh7); + assign N12gh7 = (T12gh7 & Z12gh7); + assign Z12gh7 = (F22gh7 & L22gh7); + assign L22gh7 = (~(Hp0gh7 & Lq0gh7)); + assign Lq0gh7 = (!R22gh7); + assign F22gh7 = (~(H11gh7 & L21gh7)); + assign L21gh7 = (!X22gh7); + assign T12gh7 = (D32gh7 & J32gh7); + assign J32gh7 = (~(Lz0gh7 & P01gh7)); + assign P01gh7 = (!P32gh7); + assign D32gh7 = (~(Fw0gh7 & Jx0gh7)); + assign Jx0gh7 = (!V32gh7); + assign H12gh7 = (B42gh7 & Tm1gh7); + assign Tm1gh7 = (H42gh7 & N42gh7); + assign H42gh7 = (L81gh7 & Xn0gh7); + assign B42gh7 = (T42gh7 & Z42gh7); + assign Z42gh7 = (R51gh7 | Fb9gh7); + assign T42gh7 = (~(stdio_rx_tdata[4] & Z41gh7)); + assign Fttfh7 = (Pl0gh7 ? com_tx_tdata[5] : F52gh7); + assign F52gh7 = (~(L52gh7 & R52gh7)); + assign R52gh7 = (X52gh7 & D62gh7); + assign D62gh7 = (~(stdio_rx_tdata[5] & Z41gh7)); + assign X52gh7 = (Rq0gh7 & J62gh7); + assign L52gh7 = (N42gh7 & P62gh7); + assign N42gh7 = (V62gh7 & F51gh7); + assign F51gh7 = (Lbvfh7 | B72gh7); + assign Zstfh7 = (H72gh7 & N72gh7); + assign N72gh7 = (~(T72gh7 & Z72gh7)); + assign Z72gh7 = (F82gh7 & L82gh7); + assign L82gh7 = (R82gh7 & X82gh7); + assign X82gh7 = (Hp1gh7 & Xn0gh7); + assign R82gh7 = (D92gh7 & J92gh7); + assign J92gh7 = (~(J02gh7 & R21gh7)); + assign J02gh7 = (~(Nstfh7 | Bs1gh7)); + assign Bs1gh7 = (Hstfh7 & Bstfh7); + assign D92gh7 = (~(P02gh7 & By0gh7)); + assign P02gh7 = (~(Votfh7 | Ns1gh7)); + assign Ns1gh7 = (Potfh7 & Jotfh7); + assign F82gh7 = (P92gh7 & V92gh7); + assign V92gh7 = (~(R22gh7 & Hp0gh7)); + assign R22gh7 = (~(Xntfh7 | Ju1gh7)); + assign Ju1gh7 = (Rntfh7 & Lntfh7); + assign P92gh7 = (Ba2gh7 & Ha2gh7); + assign Ha2gh7 = (~(Ns0gh7 & Pr0gh7)); + assign Ns0gh7 = (~(Zmtfh7 | Tp1gh7)); + assign Tp1gh7 = (Tmtfh7 & Nmtfh7); + assign Ba2gh7 = (Ju0gh7 | Dr1gh7); + assign Ju0gh7 = (Bmtfh7 | Xq1gh7); + assign Xq1gh7 = (Vltfh7 & Pltfh7); + assign T72gh7 = (Na2gh7 & Ta2gh7); + assign Ta2gh7 = (Za2gh7 & Fb2gh7); + assign Fb2gh7 = (~(V32gh7 & Fw0gh7)); + assign V32gh7 = (~(Prtfh7 | Fw1gh7)); + assign Fw1gh7 = (Jrtfh7 & Drtfh7); + assign Za2gh7 = (Lb2gh7 & Rb2gh7); + assign Rb2gh7 = (~(X22gh7 & H11gh7)); + assign X22gh7 = (~(Rqtfh7 | Vu1gh7)); + assign Vu1gh7 = (Lqtfh7 & Fqtfh7); + assign Lb2gh7 = (~(P32gh7 & Lz0gh7)); + assign P32gh7 = (~(Tptfh7 | Tv1gh7)); + assign Tv1gh7 = (Nptfh7 & Hptfh7); + assign Na2gh7 = (Xb2gh7 & Zd1gh7); + assign Zd1gh7 = (Dc2gh7 & Jc2gh7); + assign Jc2gh7 = (Pc2gh7 & Vc2gh7); + assign Vc2gh7 = (Ln0gh7 & Rn0gh7); + assign Rn0gh7 = (~(Bd2gh7 & R21gh7)); + assign R21gh7 = (!Hd2gh7); + assign Bd2gh7 = (Hm1gh7 & Re0gh7); + assign Re0gh7 = (!Hstfh7); + assign Hm1gh7 = (Bstfh7 & P31gh7); + assign P31gh7 = (Vrtfh7 & Zg0gh7); + assign Zg0gh7 = (!Nstfh7); + assign Ln0gh7 = (~(Nd2gh7 & Hp0gh7)); + assign Nd2gh7 = (Ng1gh7 & Z4zfh7); + assign Z4zfh7 = (!Rntfh7); + assign Ng1gh7 = (Lntfh7 & Fq0gh7); + assign Fq0gh7 = (Fntfh7 & V6zfh7); + assign V6zfh7 = (!Xntfh7); + assign Pc2gh7 = (Xhzfh7 & Zy1gh7); + assign Dc2gh7 = (Td2gh7 & Zd2gh7); + assign Zd2gh7 = (~(D61gh7 | Fe2gh7)); + assign D61gh7 = (~(Le2gh7 & Re2gh7)); + assign Re2gh7 = (~(Xe2gh7 & Fw0gh7)); + assign Xe2gh7 = (Vl1gh7 & L50gh7); + assign L50gh7 = (!Jrtfh7); + assign Vl1gh7 = (Drtfh7 & Dx0gh7); + assign Dx0gh7 = (Xqtfh7 & T70gh7); + assign T70gh7 = (!Prtfh7); + assign Le2gh7 = (Df2gh7 & Jf2gh7); + assign Jf2gh7 = (~(Pf2gh7 & Lz0gh7)); + assign Pf2gh7 = (Nj1gh7 & Bmzfh7); + assign Bmzfh7 = (!Nptfh7); + assign Nj1gh7 = (Hptfh7 & J01gh7); + assign J01gh7 = (Bptfh7 & Jozfh7); + assign Jozfh7 = (!Tptfh7); + assign Df2gh7 = (~(Vf2gh7 & H11gh7)); + assign H11gh7 = (!Bg2gh7); + assign Vf2gh7 = (Di1gh7 & Hvzfh7); + assign Hvzfh7 = (!Lqtfh7); + assign Di1gh7 = (Fqtfh7 & F21gh7); + assign F21gh7 = (Zptfh7 & Pxzfh7); + assign Pxzfh7 = (!Rqtfh7); + assign Td2gh7 = (~(Pl0gh7 | X51gh7)); + assign X51gh7 = (~(Hg2gh7 & Ng2gh7)); + assign Ng2gh7 = (~(Tg2gh7 & Pr0gh7)); + assign Tg2gh7 = (Xk1gh7 & Zg2gh7); + assign Zg2gh7 = (!Tmtfh7); + assign Xk1gh7 = (Nmtfh7 & Nd1gh7); + assign Nd1gh7 = (!Ts0gh7); + assign Ts0gh7 = (~(Hmtfh7 & Fh2gh7)); + assign Fh2gh7 = (!Zmtfh7); + assign Hg2gh7 = (Lh2gh7 & Rh2gh7); + assign Rh2gh7 = (~(Xh2gh7 & Zs0gh7)); + assign Xh2gh7 = (Fh1gh7 & Di2gh7); + assign Di2gh7 = (!Vltfh7); + assign Fh1gh7 = (Pltfh7 & Du0gh7); + assign Du0gh7 = (~(Pu0gh7 | Bmtfh7)); + assign Pu0gh7 = (!Jltfh7); + assign Lh2gh7 = (~(Ji2gh7 & By0gh7)); + assign Ji2gh7 = (Bj1gh7 & Jczfh7); + assign Jczfh7 = (!Potfh7); + assign Bj1gh7 = (Jotfh7 & Zy0gh7); + assign Zy0gh7 = (Dotfh7 & Fezfh7); + assign Fezfh7 = (!Votfh7); + assign Xb2gh7 = (Pi2gh7 & Vi2gh7); + assign Vi2gh7 = (R51gh7 | Lb9gh7); + assign Pi2gh7 = (~(stdio_rx_tdata[6] & Z41gh7)); + assign H72gh7 = (~(Rktfh7 & Pl0gh7)); + assign Tstfh7 = (Pl0gh7 ? com_tx_tdata[7] : Bj2gh7); + assign Pl0gh7 = (~(Duufh7 & Hj2gh7)); + assign Hj2gh7 = (~(Nj2gh7 & Tj2gh7)); + assign Tj2gh7 = (Zj2gh7 | Fk2gh7); + assign Bj2gh7 = (stdio_rx_tdata[7] & Z41gh7); + assign Dltfh7 = (ahb_hready ? ahb_htrans[1] : Lk2gh7); + assign Xktfh7 = (Rk2gh7 & Xk2gh7); + assign Rk2gh7 = (~(Dl2gh7 & Jl2gh7)); + assign ahb_htrans[1] = (~(Lk2gh7 | R29gh7)); + assign Lk2gh7 = (!Hd9gh7); + assign Xzpfh7 = (~(Pl2gh7 & Vl2gh7)); + assign Vl2gh7 = (Tyyfh7 & Bm2gh7); + assign Pl2gh7 = (Hm2gh7 & Xh0gh7); + assign O0qfh7 = (~(Nm2gh7 & Tm2gh7)); + assign Tm2gh7 = (~(Zm2gh7 & Bdvfh7)); + assign Nm2gh7 = (~(Jpsfh7 & Fn2gh7)); + assign F1qfh7 = (~(Ln2gh7 & Rn2gh7)); + assign Rn2gh7 = (~(Zm2gh7 & Jlvfh7)); + assign Ln2gh7 = (~(Zpsfh7 & Fn2gh7)); + assign W1qfh7 = (~(Xn2gh7 & Do2gh7)); + assign Do2gh7 = (~(Zm2gh7 & Dovfh7)); + assign Xn2gh7 = (~(Pqsfh7 & Fn2gh7)); + assign N2qfh7 = (~(Jo2gh7 & Po2gh7)); + assign Po2gh7 = (~(Zm2gh7 & Xqvfh7)); + assign Jo2gh7 = (~(Frsfh7 & Fn2gh7)); + assign E3qfh7 = (~(Vo2gh7 & Bp2gh7)); + assign Bp2gh7 = (~(Zm2gh7 & Zdvfh7)); + assign Vo2gh7 = (~(Vrsfh7 & Fn2gh7)); + assign V3qfh7 = (~(Hp2gh7 & Np2gh7)); + assign Np2gh7 = (~(Zm2gh7 & Vlvfh7)); + assign Hp2gh7 = (~(Lssfh7 & Fn2gh7)); + assign M4qfh7 = (~(Tp2gh7 & Zp2gh7)); + assign Zp2gh7 = (~(Zm2gh7 & Povfh7)); + assign Tp2gh7 = (~(Btsfh7 & Fn2gh7)); + assign D5qfh7 = (~(Fq2gh7 & Lq2gh7)); + assign Lq2gh7 = (~(Zm2gh7 & Jrvfh7)); + assign Fq2gh7 = (~(Rtsfh7 & Fn2gh7)); + assign U5qfh7 = (~(Rq2gh7 & Xq2gh7)); + assign Xq2gh7 = (~(Zm2gh7 & Xtvfh7)); + assign Rq2gh7 = (~(Husfh7 & Fn2gh7)); + assign L6qfh7 = (~(Dr2gh7 & Jr2gh7)); + assign Jr2gh7 = (~(Zm2gh7 & Lwvfh7)); + assign Dr2gh7 = (~(Xusfh7 & Fn2gh7)); + assign C7qfh7 = (~(Pr2gh7 & Vr2gh7)); + assign Vr2gh7 = (~(Zm2gh7 & Zyvfh7)); + assign Pr2gh7 = (~(Nvsfh7 & Fn2gh7)); + assign T7qfh7 = (~(Bs2gh7 & Hs2gh7)); + assign Hs2gh7 = (~(Zm2gh7 & N1wfh7)); + assign Bs2gh7 = (~(Dwsfh7 & Fn2gh7)); + assign K8qfh7 = (~(Ns2gh7 & Ts2gh7)); + assign Ts2gh7 = (~(Zm2gh7 & B4wfh7)); + assign Ns2gh7 = (~(Twsfh7 & Fn2gh7)); + assign B9qfh7 = (~(Zs2gh7 & Ft2gh7)); + assign Ft2gh7 = (~(Zm2gh7 & P6wfh7)); + assign Zs2gh7 = (~(Jxsfh7 & Fn2gh7)); + assign S9qfh7 = (~(Lt2gh7 & Rt2gh7)); + assign Rt2gh7 = (~(Zm2gh7 & D9wfh7)); + assign Lt2gh7 = (~(Zxsfh7 & Fn2gh7)); + assign Jaqfh7 = (~(Xt2gh7 & Du2gh7)); + assign Du2gh7 = (~(Zm2gh7 & Rbwfh7)); + assign Xt2gh7 = (~(Pysfh7 & Fn2gh7)); + assign Abqfh7 = (~(Ju2gh7 & Pu2gh7)); + assign Pu2gh7 = (~(Zm2gh7 & Fewfh7)); + assign Ju2gh7 = (~(Fzsfh7 & Fn2gh7)); + assign Rbqfh7 = (~(Vu2gh7 & Bv2gh7)); + assign Bv2gh7 = (~(Zm2gh7 & Tgwfh7)); + assign Vu2gh7 = (~(Vzsfh7 & Fn2gh7)); + assign Icqfh7 = (~(Hv2gh7 & Nv2gh7)); + assign Nv2gh7 = (~(Zm2gh7 & Hjwfh7)); + assign Hv2gh7 = (~(L0tfh7 & Fn2gh7)); + assign Zcqfh7 = (~(Tv2gh7 & Zv2gh7)); + assign Zv2gh7 = (~(Zm2gh7 & Vlwfh7)); + assign Tv2gh7 = (~(B1tfh7 & Fn2gh7)); + assign Qdqfh7 = (~(Fw2gh7 & Lw2gh7)); + assign Lw2gh7 = (~(Zm2gh7 & Jowfh7)); + assign Fw2gh7 = (~(R1tfh7 & Fn2gh7)); + assign Heqfh7 = (~(Rw2gh7 & Xw2gh7)); + assign Xw2gh7 = (~(Zm2gh7 & Xqwfh7)); + assign Rw2gh7 = (~(H2tfh7 & Fn2gh7)); + assign Yeqfh7 = (~(Dx2gh7 & Jx2gh7)); + assign Jx2gh7 = (~(Zm2gh7 & Ltwfh7)); + assign Dx2gh7 = (~(X2tfh7 & Fn2gh7)); + assign Pfqfh7 = (~(Px2gh7 & Vx2gh7)); + assign Vx2gh7 = (~(Zm2gh7 & Zvwfh7)); + assign Px2gh7 = (~(N3tfh7 & Fn2gh7)); + assign Ggqfh7 = (~(By2gh7 & Hy2gh7)); + assign Hy2gh7 = (~(Zm2gh7 & Rwufh7)); + assign By2gh7 = (~(D4tfh7 & Fn2gh7)); + assign Xgqfh7 = (~(Ny2gh7 & Ty2gh7)); + assign Ty2gh7 = (~(Zm2gh7 & Vxufh7)); + assign Ny2gh7 = (~(T4tfh7 & Fn2gh7)); + assign Ohqfh7 = (~(Zy2gh7 & Fz2gh7)); + assign Fz2gh7 = (~(Zm2gh7 & Zyufh7)); + assign Zy2gh7 = (~(J5tfh7 & Fn2gh7)); + assign Fiqfh7 = (~(Lz2gh7 & Rz2gh7)); + assign Rz2gh7 = (~(Zm2gh7 & D0vfh7)); + assign Lz2gh7 = (~(Z5tfh7 & Fn2gh7)); + assign Wiqfh7 = (~(Xz2gh7 & D03gh7)); + assign D03gh7 = (~(Zm2gh7 & H1vfh7)); + assign Xz2gh7 = (~(P6tfh7 & Fn2gh7)); + assign Njqfh7 = (~(J03gh7 & P03gh7)); + assign P03gh7 = (~(Zm2gh7 & L2vfh7)); + assign J03gh7 = (~(F7tfh7 & Fn2gh7)); + assign Ekqfh7 = (~(V03gh7 & B13gh7)); + assign B13gh7 = (~(Zm2gh7 & P3vfh7)); + assign V03gh7 = (~(V7tfh7 & Fn2gh7)); + assign Vkqfh7 = (~(H13gh7 & N13gh7)); + assign N13gh7 = (~(Zm2gh7 & Z4vfh7)); + assign Zm2gh7 = (~(Xtxfh7 | Lqxfh7)); + assign Lqxfh7 = (!B1yfh7); + assign H13gh7 = (~(L8tfh7 & Fn2gh7)); + assign Fn2gh7 = (~(T13gh7 & Z13gh7)); + assign Z13gh7 = (F23gh7 & L23gh7); + assign L23gh7 = (R23gh7 & X23gh7); + assign R23gh7 = (D33gh7 & J33gh7); + assign F23gh7 = (P33gh7 & R51gh7); + assign P33gh7 = (Xhzfh7 & B1yfh7); + assign B1yfh7 = (~(V33gh7 & B43gh7)); + assign B43gh7 = (H43gh7 & N43gh7); + assign N43gh7 = (T43gh7 & Z43gh7); + assign Z43gh7 = (F53gh7 & L53gh7); + assign L53gh7 = (Vlvfh7 & Jlvfh7); + assign Jlvfh7 = (!D39gh7); + assign Vlvfh7 = (!J39gh7); + assign F53gh7 = (P6wfh7 & Lwvfh7); + assign Lwvfh7 = (!P39gh7); + assign P6wfh7 = (!V39gh7); + assign T43gh7 = (R53gh7 & X53gh7); + assign X53gh7 = (Xqwfh7 & Tgwfh7); + assign Tgwfh7 = (!B49gh7); + assign Xqwfh7 = (!H49gh7); + assign R53gh7 = (Zdvfh7 & Vxufh7); + assign Vxufh7 = (!N49gh7); + assign Zdvfh7 = (!T49gh7); + assign H43gh7 = (D63gh7 & J63gh7); + assign J63gh7 = (P63gh7 & V63gh7); + assign V63gh7 = (B4wfh7 & Xtvfh7); + assign Xtvfh7 = (!Z49gh7); + assign B4wfh7 = (!F59gh7); + assign P63gh7 = (Jowfh7 & Fewfh7); + assign Fewfh7 = (!L59gh7); + assign Jowfh7 = (!R59gh7); + assign D63gh7 = (B73gh7 & H73gh7); + assign H73gh7 = (Xqvfh7 & Rwufh7); + assign Rwufh7 = (!X59gh7); + assign Xqvfh7 = (!D69gh7); + assign B73gh7 = (N1wfh7 & Jrvfh7); + assign Jrvfh7 = (!J69gh7); + assign N1wfh7 = (!P69gh7); + assign V33gh7 = (N73gh7 & T73gh7); + assign T73gh7 = (Z73gh7 & F83gh7); + assign F83gh7 = (L83gh7 & R83gh7); + assign R83gh7 = (Vlwfh7 & Rbwfh7); + assign Rbwfh7 = (!V69gh7); + assign Vlwfh7 = (!B79gh7); + assign L83gh7 = (H1vfh7 & Zvwfh7); + assign Zvwfh7 = (!H79gh7); + assign H1vfh7 = (!N79gh7); + assign Z73gh7 = (X83gh7 & D93gh7); + assign D93gh7 = (Bdvfh7 & L2vfh7); + assign L2vfh7 = (!T79gh7); + assign Bdvfh7 = (!Z79gh7); + assign X83gh7 = (Povfh7 & Dovfh7); + assign Dovfh7 = (!F89gh7); + assign Povfh7 = (!L89gh7); + assign N73gh7 = (J93gh7 & P93gh7); + assign P93gh7 = (V93gh7 & Ba3gh7); + assign Ba3gh7 = (D9wfh7 & Zyvfh7); + assign Zyvfh7 = (!R89gh7); + assign D9wfh7 = (!X89gh7); + assign V93gh7 = (Ltwfh7 & Hjwfh7); + assign Hjwfh7 = (!D99gh7); + assign Ltwfh7 = (!J99gh7); + assign J93gh7 = (Ha3gh7 & Na3gh7); + assign Na3gh7 = (D0vfh7 & Zyufh7); + assign Zyufh7 = (!P99gh7); + assign D0vfh7 = (!Dc9gh7); + assign Ha3gh7 = (P3vfh7 & Z4vfh7); + assign Z4vfh7 = (!Jc9gh7); + assign P3vfh7 = (!Vc9gh7); + assign T13gh7 = (Ta3gh7 & Za3gh7); + assign Za3gh7 = (Fb3gh7 & Lb3gh7); + assign Fb3gh7 = (~(Rb3gh7 | Fe2gh7)); + assign Ta3gh7 = (Xb3gh7 & Dc3gh7); + assign Xb3gh7 = (Lk0gh7 & Jc3gh7); + assign Jc3gh7 = (!Pc3gh7); + assign Lk0gh7 = (~(Vc3gh7 | Bd3gh7)); + assign Mlqfh7 = (~(Havfh7 & Hd3gh7)); + assign Havfh7 = (Nd3gh7 & Td3gh7); + assign Td3gh7 = (!Vrufh7); + assign Vrufh7 = (~(Zd3gh7 & Fe3gh7)); + assign Fe3gh7 = (Le3gh7 & Tyyfh7); + assign Le3gh7 = (Di0gh7 & Re3gh7); + assign Zd3gh7 = (Xe3gh7 & Xh0gh7); + assign Dmqfh7 = (~(Df3gh7 & Jf3gh7)); + assign Jf3gh7 = (~(B5sfh7 & Pf3gh7)); + assign Df3gh7 = (Vf3gh7 | Z79gh7); + assign Umqfh7 = (~(Bg3gh7 & Hg3gh7)); + assign Hg3gh7 = (~(R5sfh7 & Pf3gh7)); + assign Bg3gh7 = (Vf3gh7 | D39gh7); + assign Lnqfh7 = (~(Ng3gh7 & Tg3gh7)); + assign Tg3gh7 = (~(H6sfh7 & Pf3gh7)); + assign Ng3gh7 = (Vf3gh7 | F89gh7); + assign Coqfh7 = (~(Zg3gh7 & Fh3gh7)); + assign Fh3gh7 = (~(X6sfh7 & Pf3gh7)); + assign Zg3gh7 = (Vf3gh7 | D69gh7); + assign Toqfh7 = (~(Lh3gh7 & Rh3gh7)); + assign Rh3gh7 = (~(N7sfh7 & Pf3gh7)); + assign Lh3gh7 = (Vf3gh7 | T49gh7); + assign Kpqfh7 = (~(Xh3gh7 & Di3gh7)); + assign Di3gh7 = (~(D8sfh7 & Pf3gh7)); + assign Xh3gh7 = (Vf3gh7 | J39gh7); + assign Bqqfh7 = (~(Ji3gh7 & Pi3gh7)); + assign Pi3gh7 = (~(T8sfh7 & Pf3gh7)); + assign Ji3gh7 = (Vf3gh7 | L89gh7); + assign Sqqfh7 = (~(Vi3gh7 & Bj3gh7)); + assign Bj3gh7 = (~(J9sfh7 & Pf3gh7)); + assign Vi3gh7 = (Vf3gh7 | J69gh7); + assign Jrqfh7 = (~(Hj3gh7 & Nj3gh7)); + assign Nj3gh7 = (~(Z9sfh7 & Pf3gh7)); + assign Hj3gh7 = (Vf3gh7 | Z49gh7); + assign Asqfh7 = (~(Tj3gh7 & Zj3gh7)); + assign Zj3gh7 = (~(Pasfh7 & Pf3gh7)); + assign Tj3gh7 = (Vf3gh7 | P39gh7); + assign Rsqfh7 = (~(Fk3gh7 & Lk3gh7)); + assign Lk3gh7 = (~(Fbsfh7 & Pf3gh7)); + assign Fk3gh7 = (Vf3gh7 | R89gh7); + assign Itqfh7 = (~(Rk3gh7 & Xk3gh7)); + assign Xk3gh7 = (~(Vbsfh7 & Pf3gh7)); + assign Rk3gh7 = (Vf3gh7 | P69gh7); + assign Ztqfh7 = (~(Dl3gh7 & Jl3gh7)); + assign Jl3gh7 = (~(Lcsfh7 & Pf3gh7)); + assign Dl3gh7 = (Vf3gh7 | F59gh7); + assign Quqfh7 = (~(Pl3gh7 & Vl3gh7)); + assign Vl3gh7 = (~(Bdsfh7 & Pf3gh7)); + assign Pl3gh7 = (Vf3gh7 | V39gh7); + assign Hvqfh7 = (~(Bm3gh7 & Hm3gh7)); + assign Hm3gh7 = (~(Rdsfh7 & Pf3gh7)); + assign Bm3gh7 = (Vf3gh7 | X89gh7); + assign Yvqfh7 = (~(Nm3gh7 & Tm3gh7)); + assign Tm3gh7 = (~(Hesfh7 & Pf3gh7)); + assign Nm3gh7 = (Vf3gh7 | V69gh7); + assign Pwqfh7 = (~(Zm3gh7 & Fn3gh7)); + assign Fn3gh7 = (~(Xesfh7 & Pf3gh7)); + assign Zm3gh7 = (Vf3gh7 | L59gh7); + assign Gxqfh7 = (~(Ln3gh7 & Rn3gh7)); + assign Rn3gh7 = (~(Nfsfh7 & Pf3gh7)); + assign Ln3gh7 = (Vf3gh7 | B49gh7); + assign Xxqfh7 = (~(Xn3gh7 & Do3gh7)); + assign Do3gh7 = (~(Dgsfh7 & Pf3gh7)); + assign Xn3gh7 = (Vf3gh7 | D99gh7); + assign Oyqfh7 = (~(Jo3gh7 & Po3gh7)); + assign Po3gh7 = (~(Tgsfh7 & Pf3gh7)); + assign Jo3gh7 = (Vf3gh7 | B79gh7); + assign Fzqfh7 = (~(Vo3gh7 & Bp3gh7)); + assign Bp3gh7 = (~(Jhsfh7 & Pf3gh7)); + assign Vo3gh7 = (Vf3gh7 | R59gh7); + assign Wzqfh7 = (~(Hp3gh7 & Np3gh7)); + assign Np3gh7 = (~(Zhsfh7 & Pf3gh7)); + assign Hp3gh7 = (Vf3gh7 | H49gh7); + assign N0rfh7 = (~(Tp3gh7 & Zp3gh7)); + assign Zp3gh7 = (~(Pisfh7 & Pf3gh7)); + assign Tp3gh7 = (Vf3gh7 | J99gh7); + assign E1rfh7 = (~(Fq3gh7 & Lq3gh7)); + assign Lq3gh7 = (~(Fjsfh7 & Pf3gh7)); + assign Fq3gh7 = (Vf3gh7 | H79gh7); + assign V1rfh7 = (~(Rq3gh7 & Xq3gh7)); + assign Xq3gh7 = (~(Vjsfh7 & Pf3gh7)); + assign Rq3gh7 = (Vf3gh7 | X59gh7); + assign M2rfh7 = (~(Dr3gh7 & Jr3gh7)); + assign Jr3gh7 = (~(Lksfh7 & Pf3gh7)); + assign Dr3gh7 = (Vf3gh7 | N49gh7); + assign D3rfh7 = (~(Pr3gh7 & Vr3gh7)); + assign Vr3gh7 = (~(Blsfh7 & Pf3gh7)); + assign Pr3gh7 = (Vf3gh7 | P99gh7); + assign U3rfh7 = (~(Bs3gh7 & Hs3gh7)); + assign Hs3gh7 = (~(Rlsfh7 & Pf3gh7)); + assign Bs3gh7 = (Vf3gh7 | Dc9gh7); + assign L4rfh7 = (~(Ns3gh7 & Ts3gh7)); + assign Ts3gh7 = (~(Hmsfh7 & Pf3gh7)); + assign Ns3gh7 = (Vf3gh7 | N79gh7); + assign C5rfh7 = (~(Zs3gh7 & Ft3gh7)); + assign Ft3gh7 = (~(Xmsfh7 & Pf3gh7)); + assign Zs3gh7 = (Vf3gh7 | T79gh7); + assign T5rfh7 = (~(Lt3gh7 & Rt3gh7)); + assign Rt3gh7 = (~(Nnsfh7 & Pf3gh7)); + assign Lt3gh7 = (Vf3gh7 | Vc9gh7); + assign K6rfh7 = (~(Xt3gh7 & Du3gh7)); + assign Du3gh7 = (~(Dosfh7 & Pf3gh7)); + assign Pf3gh7 = (~(Ju3gh7 & Dc3gh7)); + assign Dc3gh7 = (Pu3gh7 & Vu3gh7); + assign Vu3gh7 = (Bv3gh7 & Hv3gh7); + assign Hv3gh7 = (Nv3gh7 & Tv3gh7); + assign Nv3gh7 = (Drxfh7 & Zv3gh7); + assign Bv3gh7 = (Fw3gh7 & Nd3gh7); + assign Pu3gh7 = (Lw3gh7 & Rw3gh7); + assign Rw3gh7 = (Xw3gh7 & Dx3gh7); + assign Lw3gh7 = (Tavfh7 & Jx3gh7); + assign Ju3gh7 = (~(Px3gh7 | Vx3gh7)); + assign Xt3gh7 = (Vf3gh7 | Jc9gh7); + assign B7rfh7 = (~(By3gh7 & Hy3gh7)); + assign Hy3gh7 = (~(stdio_tx_tready & Ny3gh7)); + assign Ny3gh7 = (~(F5vfh7 & Ty3gh7)); + assign S7rfh7 = (~(Zy3gh7 & Fk2gh7)); + assign Fk2gh7 = (Fz3gh7 & Lz3gh7); + assign Lz3gh7 = (Rz3gh7 & Xq0gh7); + assign Rz3gh7 = (~(Fe8gh7 & Jl2gh7)); + assign Fz3gh7 = (P62gh7 & Xz3gh7); + assign Zy3gh7 = (Nj2gh7 & D04gh7); + assign D04gh7 = (~(J04gh7 & Zj2gh7)); + assign J04gh7 = (~(P04gh7 & Lb3gh7)); + assign P04gh7 = (Xn0gh7 & Tv3gh7); + assign Nj2gh7 = (V04gh7 & B14gh7); + assign B14gh7 = (H14gh7 & N14gh7); + assign N14gh7 = (J62gh7 & T14gh7); + assign H14gh7 = (Jx3gh7 & Z14gh7); + assign V04gh7 = (F24gh7 & L24gh7); + assign L24gh7 = (R24gh7 & X24gh7); + assign R24gh7 = (~(D34gh7 & Z41gh7)); + assign Z41gh7 = (!J34gh7); + assign F24gh7 = (P34gh7 & V34gh7); + assign J8rfh7 = (~(B44gh7 & H44gh7)); + assign H44gh7 = (N44gh7 | P09gh7); + assign B44gh7 = (L81gh7 | Zj2gh7); + assign A9rfh7 = (~(T44gh7 & Z44gh7)); + assign Z44gh7 = (F54gh7 | X29gh7); + assign T44gh7 = (~(L54gh7 & D34gh7)); + assign R9rfh7 = (~(R54gh7 & X54gh7)); + assign X54gh7 = (~(D64gh7 & J64gh7)); + assign Iarfh7 = (~(T14gh7 & P64gh7)); + assign P64gh7 = (V64gh7 | Xt8gh7); + assign T14gh7 = (~(B74gh7 & H74gh7)); + assign H74gh7 = (~(V62gh7 | com_rx_tvalid)); + assign B74gh7 = (stdio_rx_tvalid & com_tx_tready); + assign Zarfh7 = (~(N74gh7 & T74gh7)); + assign T74gh7 = (V64gh7 | Vu8gh7); + assign N74gh7 = (X24gh7 & Jx3gh7); + assign Jx3gh7 = (~(Z74gh7 & F84gh7)); + assign F84gh7 = (L84gh7 & R84gh7); + assign R84gh7 = (X84gh7 & Nd3gh7); + assign X84gh7 = (Tv3gh7 & Zv3gh7); + assign L84gh7 = (Dx3gh7 & Fw3gh7); + assign Z74gh7 = (D94gh7 & J94gh7); + assign J94gh7 = (Tavfh7 & Xw3gh7); + assign Tavfh7 = (P94gh7 & V94gh7); + assign V94gh7 = (~(Ba4gh7 | Ha4gh7)); + assign P94gh7 = (Xh0gh7 & Na4gh7); + assign D94gh7 = (~(Ta4gh7 | Px3gh7)); + assign Px3gh7 = (~(Za4gh7 & Fb4gh7)); + assign Fb4gh7 = (Lb3gh7 & Hm2gh7); + assign Lb3gh7 = (Lb4gh7 & Rb4gh7); + assign Za4gh7 = (~(Pc3gh7 | Rq0gh7)); + assign Rq0gh7 = (~(Xb4gh7 & Plyfh7)); + assign Plyfh7 = (Z1zfh7 & Do0gh7); + assign Z1zfh7 = (~(Pizfh7 | N10gh7)); + assign N10gh7 = (!Xhzfh7); + assign Pizfh7 = (~(R51gh7 & Lbvfh7)); + assign Xb4gh7 = (~(Rb3gh7 | Bd3gh7)); + assign Rb3gh7 = (~(Dc4gh7 & Jc4gh7)); + assign Jc4gh7 = (Rw1gh7 & J62gh7); + assign Rw1gh7 = (Pc4gh7 & Vc4gh7); + assign Vc4gh7 = (V62gh7 & Xn0gh7); + assign Pc4gh7 = (Fe1gh7 & Xq0gh7); + assign Fe1gh7 = (Bd4gh7 & Xz3gh7); + assign Bd4gh7 = (T4vfh7 & F5vfh7); + assign Dc4gh7 = (J34gh7 & P62gh7); + assign P62gh7 = (Hd4gh7 & Nd4gh7); + assign Nd4gh7 = (Td4gh7 & Zd4gh7); + assign Zd4gh7 = (Fe4gh7 & Fz1gh7); + assign Td4gh7 = (Le4gh7 & Re4gh7); + assign Hd4gh7 = (Xe4gh7 & Df4gh7); + assign Xe4gh7 = (~(Jf4gh7 | Pf4gh7)); + assign X24gh7 = (~(Vf4gh7 & Bg4gh7)); + assign Bg4gh7 = (~(Hg4gh7 | Ng4gh7)); + assign Vf4gh7 = (Tg4gh7 & Rqxfh7); + assign Qbrfh7 = (~(V34gh7 & Zg4gh7)); + assign Zg4gh7 = (Fh4gh7 | Lw8gh7); + assign V34gh7 = (Ji0gh7 & Lh4gh7); + assign Lh4gh7 = (~(Bd3gh7 & Vi0gh7)); + assign Bd3gh7 = (!Zy1gh7); + assign Ji0gh7 = (Rh4gh7 & Xh4gh7); + assign Xh4gh7 = (Di4gh7 | Ji4gh7); + assign Di4gh7 = (~(Fe2gh7 & stdio_tx_tready)); + assign Fe2gh7 = (!Do0gh7); + assign Rh4gh7 = (R51gh7 & Xhzfh7); + assign Xhzfh7 = (~(Pi4gh7 & Vi4gh7)); + assign Vi4gh7 = (Z19gh7 & Bj4gh7); + assign R51gh7 = (~(Hj4gh7 & Nj4gh7)); + assign Nj4gh7 = (Tj4gh7 & Lw8gh7); + assign Tj4gh7 = (~(Zj4gh7 | Fw8gh7)); + assign Hj4gh7 = (Fk4gh7 & Xb9gh7); + assign Hcrfh7 = (~(Lk4gh7 & Rk4gh7)); + assign Rk4gh7 = (Xk4gh7 & Dl4gh7); + assign Dl4gh7 = (~(Jl4gh7 & Pl4gh7)); + assign Pl4gh7 = (~(Vl4gh7 & Bm4gh7)); + assign Bm4gh7 = (~(Hm4gh7 & Tg4gh7)); + assign Hm4gh7 = (Hg4gh7 & Rqxfh7); + assign Vl4gh7 = (~(Bjyfh7 & Nm4gh7)); + assign Nm4gh7 = (Tm4gh7 | Zm4gh7); + assign Jl4gh7 = (!Fn4gh7); + assign Xk4gh7 = (D0yfh7 & Xtxfh7); + assign Xtxfh7 = (Ln4gh7 | Rn4gh7); + assign Ln4gh7 = (Lbvfh7 | Xn4gh7); + assign D0yfh7 = (~(Rqxfh7 & Do4gh7)); + assign Do4gh7 = (Jo4gh7 | Fqxfh7); + assign Fqxfh7 = (Tg4gh7 & Ng4gh7); + assign Jo4gh7 = (~(Hjyfh7 | Po4gh7)); + assign Lk4gh7 = (Vo4gh7 & Bp4gh7); + assign Bp4gh7 = (~(Vi0gh7 & Hp4gh7)); + assign Hp4gh7 = (~(Na4gh7 & Np4gh7)); + assign Np4gh7 = (~(Tp4gh7 & Zp4gh7)); + assign Vo4gh7 = (~(Fq4gh7 & Tp4gh7)); + assign Ycrfh7 = (~(Xh0gh7 & Lq4gh7)); + assign Lq4gh7 = (V64gh7 | Pu8gh7); + assign Xh0gh7 = (~(Rq4gh7 & Xq4gh7)); + assign Rq4gh7 = (~(Dr4gh7 | Du8gh7)); + assign Pdrfh7 = (~(Jr4gh7 & Pr4gh7)); + assign Pr4gh7 = (~(Vr4gh7 & Bs4gh7)); + assign Bs4gh7 = (Rqxfh7 & Fn4gh7); + assign Vr4gh7 = (Tg4gh7 & Hg4gh7); + assign Tg4gh7 = (Hs4gh7 & Ns4gh7); + assign Ns4gh7 = (Hjyfh7 & Ts4gh7); + assign Hjyfh7 = (~(Zs4gh7 & Ft4gh7)); + assign Zs4gh7 = (Lt4gh7 & Rt4gh7); + assign Hs4gh7 = (~(Po4gh7 | Zm4gh7)); + assign Jr4gh7 = (~(Xt4gh7 & Ba4gh7)); + assign Gerfh7 = (Vc3gh7 & Vi0gh7); + assign Xerfh7 = (~(Nd3gh7 & Du4gh7)); + assign Du4gh7 = (V64gh7 | Ju8gh7); + assign Nd3gh7 = (~(Ju4gh7 & Pu4gh7)); + assign Pu4gh7 = (L29gh7 & Vu4gh7); + assign Vu4gh7 = (!Tv8gh7); + assign Ofrfh7 = (~(Bv4gh7 & Hv4gh7)); + assign Hv4gh7 = (~(Nv4gh7 & Zm4gh7)); + assign Zm4gh7 = (Rbvfh7 & Ft4gh7); + assign Nv4gh7 = (Bjyfh7 & Fn4gh7); + assign Bv4gh7 = (~(Tv4gh7 & Fq4gh7)); + assign Tv4gh7 = (~(Tp4gh7 | Zv4gh7)); + assign Fgrfh7 = (~(Tyyfh7 & Fw4gh7)); + assign Fw4gh7 = (Lw4gh7 | Zv8gh7); + assign Tyyfh7 = (~(Nmyfh7 & Rezfh7)); + assign Wgrfh7 = (Rw4gh7 ? Nmyfh7 : R2zfh7); + assign Nmyfh7 = (!Fbvfh7); + assign Nhrfh7 = (Rw4gh7 ? R2zfh7 : Hjzfh7); + assign R2zfh7 = (!Xw4gh7); + assign Hjzfh7 = (!Dx4gh7); + assign Eirfh7 = (!Jx4gh7); + assign Jx4gh7 = (Rezfh7 ? Dl0gh7 : Px4gh7); + assign Px4gh7 = (Vx4gh7 | D09gh7); + assign Virfh7 = (~(By4gh7 & Hy4gh7)); + assign Hy4gh7 = (V64gh7 | Nv8gh7); + assign By4gh7 = (Ny4gh7 & Fw3gh7); + assign Ny4gh7 = (~(Xt4gh7 & Ha4gh7)); + assign Xt4gh7 = (Vi0gh7 & Ty4gh7); + assign Mjrfh7 = (Zy4gh7 & Bjyfh7); + assign Bjyfh7 = (~(Po4gh7 | Lbvfh7)); + assign Po4gh7 = (~(Fz4gh7 & Lz4gh7)); + assign Fz4gh7 = (~(Rz4gh7 | B72gh7)); + assign Rz4gh7 = (Ng4gh7 & Rt4gh7); + assign Zy4gh7 = (Tm4gh7 & Fn4gh7); + assign Fn4gh7 = (~(Xz4gh7 & D05gh7)); + assign D05gh7 = (J05gh7 & P05gh7); + assign P05gh7 = (V05gh7 & T79gh7); + assign V05gh7 = (Vc9gh7 & Zayfh7); + assign Zayfh7 = (J99gh7 & Diyfh7); + assign Diyfh7 = (B15gh7 & H15gh7); + assign H15gh7 = (N15gh7 & T15gh7); + assign T15gh7 = (Z15gh7 & F25gh7); + assign F25gh7 = (L25gh7 & R89gh7); + assign L25gh7 = (X89gh7 & D99gh7); + assign Z15gh7 = (R25gh7 & Z79gh7); + assign R25gh7 = (F89gh7 & L89gh7); + assign N15gh7 = (X25gh7 & D35gh7); + assign D35gh7 = (J35gh7 & P69gh7); + assign J35gh7 = (V69gh7 & B79gh7); + assign X25gh7 = (D69gh7 & J69gh7); + assign B15gh7 = (P35gh7 & V35gh7); + assign V35gh7 = (B45gh7 & H45gh7); + assign H45gh7 = (N45gh7 & F59gh7); + assign N45gh7 = (L59gh7 & R59gh7); + assign B45gh7 = (T45gh7 & H49gh7); + assign T45gh7 = (T49gh7 & Z49gh7); + assign P35gh7 = (Z45gh7 & F55gh7); + assign F55gh7 = (L55gh7 & P39gh7); + assign L55gh7 = (V39gh7 & B49gh7); + assign Z45gh7 = (D39gh7 & J39gh7); + assign J05gh7 = (Dc9gh7 & N79gh7); + assign Xz4gh7 = (R55gh7 & X55gh7); + assign X55gh7 = (N49gh7 & P99gh7); + assign R55gh7 = (H79gh7 & X59gh7); + assign Dkrfh7 = (~(D65gh7 & J65gh7)); + assign J65gh7 = (~(P65gh7 & D34gh7)); + assign D65gh7 = (F54gh7 | J09gh7); + assign Ukrfh7 = (~(V65gh7 & B75gh7)); + assign B75gh7 = (V64gh7 | Ft8gh7); + assign Llrfh7 = (~(H75gh7 & N75gh7)); + assign N75gh7 = (~(D6vfh7 & stdio_tx_tready)); + assign H75gh7 = (V64gh7 | L29gh7); + assign Cmrfh7 = (~(T75gh7 & Z75gh7)); + assign Z75gh7 = (V64gh7 | Hv8gh7); + assign T75gh7 = (Zv3gh7 | F85gh7); + assign Tmrfh7 = (~(L85gh7 & R85gh7)); + assign R85gh7 = (X85gh7 & D95gh7); + assign D95gh7 = (~(Xn4gh7 & J95gh7)); + assign J95gh7 = (~(Lbvfh7 & P95gh7)); + assign P95gh7 = (~(Rezfh7 & Ta4gh7)); + assign Xn4gh7 = (!J33gh7); + assign X85gh7 = (~(Dl2gh7 & V95gh7)); + assign V95gh7 = (~(Tv3gh7 & Ba5gh7)); + assign Ba5gh7 = (~(Jl2gh7 & Xk2gh7)); + assign Xk2gh7 = (!Fe8gh7); + assign L85gh7 = (~(Ha5gh7 | Na5gh7)); + assign Na5gh7 = (~(Fh4gh7 | Lz8gh7)); + assign Ha5gh7 = (stdio_tx_tready ? Ta5gh7 : D6vfh7); + assign Ta5gh7 = (~(Xw3gh7 | Ji4gh7)); + assign Ji4gh7 = (!stdio_tx_tvalid); + assign D6vfh7 = (!Ty3gh7); + assign Ty3gh7 = (~(Za5gh7 & Rezfh7)); + assign Za5gh7 = (~(T4vfh7 | Fb5gh7)); + assign Knrfh7 = (~(Z14gh7 & Lb5gh7)); + assign Lb5gh7 = (V64gh7 | F29gh7); + assign Z14gh7 = (~(Rb5gh7 & B72gh7)); + assign B72gh7 = (Hg4gh7 & Na9gh7); + assign Hg4gh7 = (Xb5gh7 & Ft4gh7); + assign Xb5gh7 = (Dc5gh7 & F8vfh7); + assign Rb5gh7 = (Lz4gh7 & Rqxfh7); + assign Borfh7 = (~(Di0gh7 & Jc5gh7)); + assign Jc5gh7 = (V64gh7 | B19gh7); + assign Di0gh7 = (~(Pc5gh7 & Vc5gh7)); + assign Vc5gh7 = (Rqxfh7 & Rt4gh7); + assign Pc5gh7 = (Ng4gh7 & Lz4gh7); + assign Lz4gh7 = (Bd5gh7 & Hd5gh7); + assign Hd5gh7 = (~(Rbvfh7 & Nd5gh7)); + assign Ng4gh7 = (Td5gh7 & Zd5gh7); + assign Sorfh7 = (Fe5gh7 & Tm4gh7); + assign Fe5gh7 = (Le5gh7 & Rt4gh7); + assign Le5gh7 = (!D33gh7); + assign Jprfh7 = (~(Re5gh7 & Xe5gh7)); + assign Xe5gh7 = (V64gh7 | Z19gh7); + assign Re5gh7 = (~(X5vfh7 & stdio_tx_tready)); + assign Aqrfh7 = (Df5gh7 & Jf5gh7); + assign Jf5gh7 = (Rqxfh7 & Nd5gh7); + assign Df5gh7 = (Bd5gh7 & Rbvfh7); + assign Bd5gh7 = (Pf5gh7 & Vf5gh7); + assign Pf5gh7 = (Bg5gh7 & Hg5gh7); + assign Bg5gh7 = (~(Tm4gh7 & Rt4gh7)); + assign Tm4gh7 = (!Ts4gh7); + assign Ts4gh7 = (Ng5gh7 | Na9gh7); + assign Rqrfh7 = (~(Re3gh7 & Tg5gh7)); + assign Tg5gh7 = (V64gh7 | H19gh7); + assign Re3gh7 = (D33gh7 | Hg5gh7); + assign Hg5gh7 = (~(Rbvfh7 & Zd5gh7)); + assign Zd5gh7 = (Nd5gh7 & Zg5gh7); + assign Zg5gh7 = (~(Ta9gh7 & Rt4gh7)); + assign Rbvfh7 = (Fh5gh7 & Lt4gh7); + assign Lt4gh7 = (~(Lh5gh7 & Rh5gh7)); + assign Lh5gh7 = (Ta9gh7 ? Di5gh7 : Xh5gh7); + assign Di5gh7 = (~(Td5gh7 & Za9gh7)); + assign Td5gh7 = (~(Fb9gh7 | Na9gh7)); + assign Xh5gh7 = (~(Ji5gh7 & Fb9gh7)); + assign Ji5gh7 = (Na9gh7 & F8vfh7); + assign F8vfh7 = (!Za9gh7); + assign Fh5gh7 = (~(Na9gh7 & Rh5gh7)); + assign D33gh7 = (~(Vf5gh7 & Rqxfh7)); + assign Rqxfh7 = (!Lbvfh7); + assign Lbvfh7 = (~(Pi5gh7 & Vi5gh7)); + assign Vi5gh7 = (Bd9gh7 & Bj5gh7); + assign Vf5gh7 = (Rn4gh7 & J33gh7); + assign Rn4gh7 = (Hj5gh7 | Ng5gh7); + assign Ng5gh7 = (~(Nj5gh7 & Fb9gh7)); + assign Nj5gh7 = (Nd5gh7 & Ta9gh7); + assign Nd5gh7 = (Tj5gh7 & Za9gh7); + assign Tj5gh7 = (Ft4gh7 & Rh5gh7); + assign Rh5gh7 = (~(Na9gh7 & Dc5gh7)); + assign Dc5gh7 = (Zj5gh7 & Ta9gh7); + assign Zj5gh7 = (~(Rt4gh7 | Fb9gh7)); + assign Ft4gh7 = (Zd8gh7 & N7vfh7); + assign N7vfh7 = (!Lb9gh7); + assign Hj5gh7 = (~(Na9gh7 & Rt4gh7)); + assign Rt4gh7 = (!Rb9gh7); + assign Irrfh7 = (~(Vf3gh7 & P9vfh7)); + assign P9vfh7 = (Vx3gh7 | Drxfh7); + assign Vf3gh7 = (X23gh7 | Vx3gh7); + assign Vx3gh7 = (~(D9vfh7 & Rezfh7)); + assign D9vfh7 = (!Fk5gh7); + assign Zrrfh7 = (~(V9vfh7 & Lk5gh7)); + assign Lk5gh7 = (V64gh7 | T19gh7); + assign V9vfh7 = (~(Rk5gh7 & Xk5gh7)); + assign Rk5gh7 = (V0yfh7 & Dl5gh7); + assign Dl5gh7 = (~(Jl5gh7 & Zjxfh7)); + assign V0yfh7 = (Pl5gh7 & Rezfh7); + assign Qsrfh7 = (~(Vl5gh7 & Bm5gh7)); + assign Bm5gh7 = (V64gh7 | N19gh7); + assign Vl5gh7 = (V62gh7 | F85gh7); + assign Htrfh7 = (~(Hm5gh7 & Nm5gh7)); + assign Nm5gh7 = (Fh4gh7 | Xz8gh7); + assign Hm5gh7 = (~(Dl2gh7 & Tm5gh7)); + assign Ytrfh7 = (~(Zm5gh7 & Fn5gh7)); + assign Fn5gh7 = (~(Ln5gh7 & Dl2gh7)); + assign Ln5gh7 = (Fe8gh7 & Jl2gh7); + assign Jl2gh7 = (!Xn0gh7); + assign Zm5gh7 = (V64gh7 | V09gh7); + assign V64gh7 = (~(Rn5gh7 | Xn5gh7)); + assign Purfh7 = (~(Do5gh7 & Jo5gh7)); + assign Jo5gh7 = (Lw4gh7 | Rz8gh7); + assign Do5gh7 = (Xq0gh7 | Zj2gh7); + assign Gvrfh7 = (~(Po5gh7 & P34gh7)); + assign P34gh7 = (Vo5gh7 & Bp5gh7); + assign Bp5gh7 = (~(Hp5gh7 & Fb5gh7)); + assign Fb5gh7 = (Np5gh7 & Tp5gh7); + assign Tp5gh7 = (Zp5gh7 & R8vfh7); + assign Np5gh7 = (Fq5gh7 & com_rx_tdata[3]); + assign Fq5gh7 = (com_rx_tdata[1] & Hvxfh7); + assign Hvxfh7 = (Lq5gh7 & com_rx_tdata[4]); + assign Lq5gh7 = (~(V6vfh7 | com_rx_tdata[5])); + assign Hp5gh7 = (Rezfh7 & Rq5gh7); + assign Rq5gh7 = (!T4vfh7); + assign Vo5gh7 = (~(X5vfh7 & Xq5gh7)); + assign Xq5gh7 = (!stdio_tx_tready); + assign X5vfh7 = (!F5vfh7); + assign F5vfh7 = (~(Dr5gh7 & Jr5gh7)); + assign Dr5gh7 = (~(Pr5gh7 | Ba9gh7)); + assign Po5gh7 = (Vr5gh7 & Bs5gh7); + assign Bs5gh7 = (Fh4gh7 | Hy8gh7); + assign Fh4gh7 = (~(Rn5gh7 | Hs5gh7)); + assign Vr5gh7 = (~(Dl2gh7 & Ns5gh7)); + assign Xvrfh7 = (~(Ts5gh7 & Zs5gh7)); + assign Zs5gh7 = (~(Xn5gh7 & Ft5gh7)); + assign Ts5gh7 = (~(Zs0gh7 & Dl2gh7)); + assign Owrfh7 = (~(Lt5gh7 & Rt5gh7)); + assign Rt5gh7 = (N44gh7 | By8gh7); + assign N44gh7 = (Lw4gh7 & Xt5gh7); + assign Xt5gh7 = (~(Zs0gh7 & Zj2gh7)); + assign Lw4gh7 = (!Xn5gh7); + assign Xn5gh7 = (~(Du5gh7 & Ju5gh7)); + assign Ju5gh7 = (Pu5gh7 & Vu5gh7); + assign Vu5gh7 = (By3gh7 & Bv5gh7); + assign By3gh7 = (~(Hv5gh7 & Nv5gh7)); + assign Nv5gh7 = (~(Xw3gh7 & Do0gh7)); + assign Do0gh7 = (~(Pi4gh7 & Tv5gh7)); + assign Tv5gh7 = (~(Bj4gh7 | Z19gh7)); + assign Pi4gh7 = (Zv5gh7 & B19gh7); + assign Xw3gh7 = (~(Ju4gh7 & Fw5gh7)); + assign Fw5gh7 = (Tv8gh7 & Lw5gh7); + assign Ju4gh7 = (Rw5gh7 & Bv8gh7); + assign Hv5gh7 = (~(stdio_tx_tvalid & stdio_tx_tready)); + assign Pu5gh7 = (Xw5gh7 & Dx5gh7); + assign Dx5gh7 = (~(Jx5gh7 & Zj2gh7)); + assign Jx5gh7 = (~(Lb4gh7 & Xz3gh7)); + assign Xz3gh7 = (!Ns5gh7); + assign Ns5gh7 = (~(Px5gh7 & Vx5gh7)); + assign Vx5gh7 = (~(By5gh7 & Hy5gh7)); + assign Hy5gh7 = (By8gh7 & Ft5gh7); + assign Px5gh7 = (~(Ny5gh7 & Ty5gh7)); + assign Ny5gh7 = (~(Zy5gh7 | Vu8gh7)); + assign Lb4gh7 = (!Tm5gh7); + assign Tm5gh7 = (~(Fz5gh7 & Lz5gh7)); + assign Lz5gh7 = (~(Rz5gh7 & Xz5gh7)); + assign Xz5gh7 = (D06gh7 & J06gh7); + assign D06gh7 = (~(P06gh7 | P09gh7)); + assign P06gh7 = (!V06gh7); + assign Rz5gh7 = (B16gh7 & X29gh7); + assign Fz5gh7 = (~(H16gh7 & N16gh7)); + assign H16gh7 = (~(T16gh7 | V09gh7)); + assign Xw5gh7 = (Z16gh7 | Rezfh7); + assign Du5gh7 = (F26gh7 & L26gh7); + assign L26gh7 = (Xe3gh7 & Hd3gh7); + assign Hd3gh7 = (~(Vc3gh7 & R26gh7)); + assign Vc3gh7 = (!Hm2gh7); + assign Hm2gh7 = (~(X26gh7 & Xq4gh7)); + assign Xq4gh7 = (D36gh7 & Ty5gh7); + assign D36gh7 = (Vu8gh7 & Pu8gh7); + assign X26gh7 = (Du8gh7 & Dr4gh7); + assign Xe3gh7 = (J36gh7 & Bm2gh7); + assign Bm2gh7 = (~(R26gh7 & Zp4gh7)); + assign Zp4gh7 = (Ha4gh7 | Ba4gh7); + assign Ba4gh7 = (P36gh7 & V36gh7); + assign V36gh7 = (B46gh7 & Du8gh7); + assign B46gh7 = (~(Dr4gh7 | Pu8gh7)); + assign Dr4gh7 = (!Ju8gh7); + assign P36gh7 = (Ty5gh7 & Vu8gh7); + assign Ty5gh7 = (H46gh7 & N46gh7); + assign N46gh7 = (T46gh7 & Lt8gh7); + assign T46gh7 = (Rt8gh7 & Xt8gh7); + assign Ha4gh7 = (Z46gh7 & F56gh7); + assign Z46gh7 = (~(L56gh7 | Zv8gh7)); + assign L56gh7 = (!R56gh7); + assign J36gh7 = (~(R26gh7 & X56gh7)); + assign X56gh7 = (~(Na4gh7 & Zy1gh7)); + assign Zy1gh7 = (~(D66gh7 & Jr5gh7)); + assign Jr5gh7 = (J66gh7 & P66gh7); + assign P66gh7 = (V66gh7 & T19gh7); + assign V66gh7 = (V99gh7 & Bd9gh7); + assign J66gh7 = (B76gh7 & N16gh7); + assign B76gh7 = (~(H76gh7 | N76gh7)); + assign D66gh7 = (Ba9gh7 & Pr5gh7); + assign Pr5gh7 = (!H19gh7); + assign Na4gh7 = (~(T76gh7 & Z76gh7)); + assign Z76gh7 = (~(Bj4gh7 | B19gh7)); + assign Bj4gh7 = (!Ha9gh7); + assign T76gh7 = (Zv5gh7 & Z19gh7); + assign Zv5gh7 = (F86gh7 & L86gh7); + assign L86gh7 = (R86gh7 & F29gh7); + assign R86gh7 = (~(H76gh7 | T16gh7)); + assign H76gh7 = (!V09gh7); + assign R26gh7 = (!Vi0gh7); + assign F26gh7 = (~(X86gh7 | Hs5gh7)); + assign Hs5gh7 = (~(D96gh7 & J96gh7)); + assign J96gh7 = (~(P96gh7 & F85gh7)); + assign P96gh7 = (~(V96gh7 & Ba6gh7)); + assign Ba6gh7 = (Ha6gh7 | stdio_rx_tvalid); + assign V96gh7 = (V62gh7 | com_tx_tready); + assign D96gh7 = (~(Na6gh7 & Zj2gh7)); + assign Na6gh7 = (~(Ta6gh7 & Za6gh7)); + assign Ta6gh7 = (Fe4gh7 & Xn0gh7); + assign Xn0gh7 = (~(Fb6gh7 & Lb6gh7)); + assign Lb6gh7 = (Rb6gh7 & Lz8gh7); + assign Rb6gh7 = (~(Xb6gh7 | Rz8gh7)); + assign Lt5gh7 = (Zp1gh7 | Zj2gh7); + assign Zp1gh7 = (!Pr0gh7); + assign Fxrfh7 = (!Dc6gh7); + assign Dc6gh7 = (Dl2gh7 ? Le4gh7 : Jc6gh7); + assign Jc6gh7 = (Df4gh7 | Pc9gh7); + assign Wxrfh7 = (Zj2gh7 ? Hp0gh7 : By0gh7); + assign Hp0gh7 = (!Le4gh7); + assign Le4gh7 = (~(Pc6gh7 & Vc6gh7)); + assign Vc6gh7 = (Bd6gh7 & Fz8gh7); + assign Bd6gh7 = (~(Hd6gh7 | Ty8gh7)); + assign Pc6gh7 = (Nd6gh7 & Td6gh7); + assign By0gh7 = (!Re4gh7); + assign Nyrfh7 = (~(Zd6gh7 & Fe6gh7)); + assign Fe6gh7 = (~(D64gh7 & Le6gh7)); + assign D64gh7 = (~(F54gh7 & Bv5gh7)); + assign F54gh7 = (~(Rn5gh7 | X86gh7)); + assign X86gh7 = (~(Re6gh7 & Xe6gh7)); + assign Xe6gh7 = (Tv3gh7 | Dl2gh7); + assign Tv3gh7 = (~(Df6gh7 & Jf6gh7)); + assign Jf6gh7 = (~(Pf6gh7 & Vf6gh7)); + assign Vf6gh7 = (~(Bg6gh7 & Hg6gh7)); + assign Hg6gh7 = (~(Ng6gh7 | J09gh7)); + assign Bg6gh7 = (J06gh7 & D09gh7); + assign Pf6gh7 = (~(Tg6gh7 & V06gh7)); + assign Tg6gh7 = (~(Zg6gh7 | F29gh7)); + assign Re6gh7 = (Fh6gh7 & Lh6gh7); + assign Lh6gh7 = (~(Rh6gh7 & Jl5gh7)); + assign Jl5gh7 = (Xh6gh7 & Di6gh7); + assign Di6gh7 = (!Ji6gh7); + assign Ji6gh7 = (com_rx_tdata[5] ? Vi6gh7 : Pi6gh7); + assign Vi6gh7 = (~(V6vfh7 & Bsxfh7)); + assign Pi6gh7 = (~(com_rx_tdata[3] & com_rx_tdata[0])); + assign Rh6gh7 = (Xk5gh7 & Zjxfh7); + assign Xk5gh7 = (!Drxfh7); + assign Fh6gh7 = (~(Pl5gh7 & Xexfh7)); + assign Xexfh7 = (!X23gh7); + assign Rn5gh7 = (~(Bj6gh7 & Hj6gh7)); + assign Hj6gh7 = (~(Nj6gh7 & Zj2gh7)); + assign Nj6gh7 = (~(Tj6gh7 & Df4gh7)); + assign Df4gh7 = (Zj6gh7 & L81gh7); + assign L81gh7 = (~(Fk6gh7 & B16gh7)); + assign Fk6gh7 = (~(Lk6gh7 | X29gh7)); + assign Lk6gh7 = (!Rk6gh7); + assign Zj6gh7 = (~(Pr0gh7 | Zs0gh7)); + assign Zs0gh7 = (!Dr1gh7); + assign Dr1gh7 = (~(By5gh7 & Xk6gh7)); + assign Xk6gh7 = (~(Ft5gh7 | By8gh7)); + assign Ft5gh7 = (!Jx8gh7); + assign By5gh7 = (Dl6gh7 & Jl6gh7); + assign Pr0gh7 = (Pl6gh7 & Vl6gh7); + assign Vl6gh7 = (~(Bm6gh7 | Pc9gh7)); + assign Tj6gh7 = (Xq0gh7 & Re4gh7); + assign Re4gh7 = (~(Hm6gh7 & Nm6gh7)); + assign Hm6gh7 = (~(Hd6gh7 | Fz8gh7)); + assign Xq0gh7 = (~(Pl6gh7 & Tm6gh7)); + assign Tm6gh7 = (Pc9gh7 & Bm6gh7); + assign Bm6gh7 = (!Hy8gh7); + assign Pl6gh7 = (Dl6gh7 & Zm6gh7); + assign Dl6gh7 = (Fn6gh7 & Ln6gh7); + assign Fn6gh7 = (D09gh7 & Rn6gh7); + assign Bj6gh7 = (~(Pc3gh7 & Rw4gh7)); + assign Pc3gh7 = (~(Xn6gh7 & Vx4gh7)); + assign Xn6gh7 = (Dl0gh7 & Fbvfh7); + assign Zd6gh7 = (~(Lz0gh7 & Dl2gh7)); + assign Ezrfh7 = (!Do6gh7); + assign Do6gh7 = (Dl2gh7 ? Bg2gh7 : Jo6gh7); + assign Jo6gh7 = (~(Pf4gh7 & Po6gh7)); + assign Vzrfh7 = (!Vo6gh7); + assign Vo6gh7 = (Dl2gh7 ? Hp6gh7 : Bp6gh7); + assign Bp6gh7 = (~(Jf4gh7 & Np6gh7)); + assign M0sfh7 = (!Tp6gh7); + assign Tp6gh7 = (Dl2gh7 ? Hd2gh7 : Zp6gh7); + assign Zp6gh7 = (~(Pf4gh7 & Fq6gh7)); + assign Pf4gh7 = (Fw0gh7 | Lz0gh7); + assign Lz0gh7 = (Lq6gh7 & Rq6gh7); + assign Rq6gh7 = (Zy8gh7 & Po6gh7); + assign Po6gh7 = (!Ny8gh7); + assign Fw0gh7 = (!Hp6gh7); + assign Hp6gh7 = (~(Xq6gh7 & Dr6gh7)); + assign Dr6gh7 = (Jr6gh7 & Fq6gh7); + assign Fq6gh7 = (!Vx8gh7); + assign D1sfh7 = (!Pr6gh7); + assign Pr6gh7 = (Dl2gh7 ? Hp1gh7 : Vr6gh7); + assign Vr6gh7 = (~(Bs6gh7 & Hs6gh7)); + assign U1sfh7 = (!Ns6gh7); + assign Ns6gh7 = (Dl2gh7 ? Fz1gh7 : Ts6gh7); + assign Ts6gh7 = (~(Jf4gh7 & Zs6gh7)); + assign Jf4gh7 = (Bs6gh7 | Ft6gh7); + assign Ft6gh7 = (!Hp1gh7); + assign Hp1gh7 = (~(Lt6gh7 & Rt6gh7)); + assign Rt6gh7 = (Xt8gh7 & Zs6gh7); + assign Zs6gh7 = (!Rt8gh7); + assign Bs6gh7 = (~(Hd2gh7 & Bg2gh7)); + assign Bg2gh7 = (~(Lq6gh7 & Xt6gh7)); + assign Xt6gh7 = (Ny8gh7 & Np6gh7); + assign Np6gh7 = (!Zy8gh7); + assign Lq6gh7 = (Nm6gh7 & Fz8gh7); + assign Nm6gh7 = (Xq6gh7 & Du6gh7); + assign Du6gh7 = (Vx8gh7 & Ty8gh7); + assign Xq6gh7 = (Td6gh7 & Px8gh7); + assign Hd2gh7 = (~(Ju6gh7 & Pu6gh7)); + assign Pu6gh7 = (Jr6gh7 & Hs6gh7); + assign Hs6gh7 = (!Px8gh7); + assign Ju6gh7 = (Td6gh7 & Vx8gh7); + assign Td6gh7 = (Vu6gh7 & Bv6gh7); + assign Bv6gh7 = (Hv6gh7 & Zm6gh7); + assign Hv6gh7 = (Nv6gh7 & Tv6gh7); + assign L2sfh7 = (~(Zv6gh7 & J62gh7)); + assign J62gh7 = (~(Pi5gh7 & Fw6gh7)); + assign Fw6gh7 = (~(Bj5gh7 | Bd9gh7)); + assign Bj5gh7 = (!V99gh7); + assign Pi5gh7 = (Lw6gh7 & T19gh7); + assign Zv6gh7 = (Dl2gh7 ? Fe4gh7 : Rw6gh7); + assign Fe4gh7 = (~(Xw6gh7 & Dx6gh7)); + assign Xw6gh7 = (Rw8gh7 & Jx6gh7); + assign Jx6gh7 = (!Lw8gh7); + assign Rw6gh7 = (Za6gh7 | Lt8gh7); + assign Za6gh7 = (Rb4gh7 & Fz1gh7); + assign Fz1gh7 = (~(Px6gh7 & Vx6gh7)); + assign Vx6gh7 = (~(By6gh7 | Lt8gh7)); + assign Px6gh7 = (Hy6gh7 & Rt8gh7); + assign C3sfh7 = (Ny6gh7 & Zv4gh7); + assign Zv4gh7 = (Ty6gh7 & Zy6gh7); + assign Zy6gh7 = (Fz6gh7 & Lz6gh7); + assign Lz6gh7 = (Rz6gh7 & Xz6gh7); + assign Xz6gh7 = (D07gh7 & J07gh7); + assign J07gh7 = (P07gh7 & V07gh7); + assign V07gh7 = (~(Pxvfh7 ^ B17gh7)); + assign B17gh7 = (~(Ns8gh7 | Jrtfh7)); + assign Pxvfh7 = (!Hs8gh7); + assign P07gh7 = (~(Xhwfh7 ^ H17gh7)); + assign H17gh7 = (~(Pr8gh7 | Nptfh7)); + assign Xhwfh7 = (!Jr8gh7); + assign D07gh7 = (N17gh7 & T17gh7); + assign T17gh7 = (~(T1xfh7 ^ Z17gh7)); + assign Z17gh7 = (~(Rq8gh7 | Rntfh7)); + assign T1xfh7 = (!Lq8gh7); + assign N17gh7 = (Np8gh7 ^ F27gh7); + assign F27gh7 = (~(Tp8gh7 | Vltfh7)); + assign Rz6gh7 = (L27gh7 & R27gh7); + assign R27gh7 = (X27gh7 & D37gh7); + assign D37gh7 = (~(Zmwfh7 ^ J37gh7)); + assign J37gh7 = (~(Vo8gh7 | Bptfh7)); + assign Zmwfh7 = (!Po8gh7); + assign X27gh7 = (~(Nsvfh7 ^ P37gh7)); + assign P37gh7 = (~(Xn8gh7 | Vrtfh7)); + assign Nsvfh7 = (!Rn8gh7); + assign L27gh7 = (V37gh7 & B47gh7); + assign B47gh7 = (~(J6xfh7 ^ H47gh7)); + assign H47gh7 = (~(Zm8gh7 | Fntfh7)); + assign J6xfh7 = (!Tm8gh7); + assign V37gh7 = (~(Fhxfh7 ^ N47gh7)); + assign N47gh7 = (~(Bm8gh7 | Hmtfh7)); + assign Fhxfh7 = (!Vl8gh7); + assign Fz6gh7 = (T47gh7 & Z47gh7); + assign Z47gh7 = (F57gh7 & L57gh7); + assign L57gh7 = (R57gh7 & X57gh7); + assign X57gh7 = (~(Tpvfh7 ^ D67gh7)); + assign D67gh7 = (~(Dl8gh7 | Bstfh7)); + assign Tpvfh7 = (!Xk8gh7); + assign R57gh7 = (~(D0wfh7 ^ J67gh7)); + assign J67gh7 = (~(Fk8gh7 | Drtfh7)); + assign D0wfh7 = (!Zj8gh7); + assign F57gh7 = (P67gh7 & V67gh7); + assign V67gh7 = (~(Hawfh7 ^ B77gh7)); + assign B77gh7 = (~(Hj8gh7 | Fqtfh7)); + assign Hawfh7 = (!Bj8gh7); + assign P67gh7 = (~(Lkwfh7 ^ H77gh7)); + assign H77gh7 = (~(Ji8gh7 | Hptfh7)); + assign Lkwfh7 = (!Di8gh7); + assign T47gh7 = (N77gh7 & T77gh7); + assign T77gh7 = (Z77gh7 & F87gh7); + assign F87gh7 = (~(Puwfh7 ^ L87gh7)); + assign L87gh7 = (~(Lh8gh7 | Jotfh7)); + assign Puwfh7 = (!Fh8gh7); + assign Z77gh7 = (~(B4xfh7 ^ R87gh7)); + assign R87gh7 = (~(Ng8gh7 | Lntfh7)); + assign B4xfh7 = (!Hg8gh7); + assign N77gh7 = (X87gh7 & D97gh7); + assign D97gh7 = (~(Hdxfh7 ^ J97gh7)); + assign J97gh7 = (~(Pf8gh7 | Nmtfh7)); + assign Hdxfh7 = (!Jf8gh7); + assign X87gh7 = (~(Tpxfh7 ^ P97gh7)); + assign P97gh7 = (~(Re8gh7 | Pltfh7)); + assign Tpxfh7 = (!Le8gh7); + assign Ty6gh7 = (V97gh7 & Ba7gh7); + assign Ba7gh7 = (Ha7gh7 & Na7gh7); + assign Na7gh7 = (Ta7gh7 & Za7gh7); + assign Za7gh7 = (Fb7gh7 & Lb7gh7); + assign Lb7gh7 = (~(Bswfh7 ^ Rb7gh7)); + assign Rb7gh7 = (~(Dr8gh7 | Potfh7)); + assign Bswfh7 = (!Xq8gh7); + assign Fb7gh7 = (~(Vcwfh7 ^ Xb7gh7)); + assign Xb7gh7 = (~(Ln8gh7 | Zptfh7)); + assign Vcwfh7 = (!Fn8gh7); + assign Ta7gh7 = (Dc7gh7 & Jc7gh7); + assign Jc7gh7 = (~(Zgvfh7 ^ Pc7gh7)); + assign Pc7gh7 = (~(Hp8gh7 | Jltfh7)); + assign Zgvfh7 = (!Bp8gh7); + assign Dc7gh7 = (~(F5wfh7 ^ Vc7gh7)); + assign Vc7gh7 = (~(Tj8gh7 | Rqtfh7)); + assign F5wfh7 = (!Nj8gh7); + assign Ha7gh7 = (Bd7gh7 & Hd7gh7); + assign Hd7gh7 = (Nd7gh7 & Td7gh7); + assign Td7gh7 = (~(R8xfh7 ^ Zd7gh7)); + assign Zd7gh7 = (~(Bg8gh7 | Zmtfh7)); + assign R8xfh7 = (!Vf8gh7); + assign Nd7gh7 = (~(Npwfh7 ^ Fe7gh7)); + assign Fe7gh7 = (~(Xh8gh7 | Votfh7)); + assign Npwfh7 = (!Rh8gh7); + assign Bd7gh7 = (Le7gh7 & Re7gh7); + assign Re7gh7 = (~(Pfvfh7 ^ Xe7gh7)); + assign Xe7gh7 = (~(Pl8gh7 | Nstfh7)); + assign Pfvfh7 = (!Jl8gh7); + assign Le7gh7 = (~(Zmvfh7 ^ Df7gh7)); + assign Df7gh7 = (~(Zs8gh7 | Hstfh7)); + assign Zmvfh7 = (!Ts8gh7); + assign V97gh7 = (Jf7gh7 & Pf7gh7); + assign Pf7gh7 = (Vf7gh7 & Bg7gh7); + assign Bg7gh7 = (Hg7gh7 & Ng7gh7); + assign Ng7gh7 = (~(T7wfh7 ^ Tg7gh7)); + assign Tg7gh7 = (~(Bs8gh7 | Lqtfh7)); + assign T7wfh7 = (!Vr8gh7); + assign Hg7gh7 = (~(Zaxfh7 ^ Zg7gh7)); + assign Zg7gh7 = (~(Fq8gh7 | Tmtfh7)); + assign Zaxfh7 = (!Zp8gh7); + assign Vf7gh7 = (Fh7gh7 & Lh7gh7); + assign Lh7gh7 = (~(R2wfh7 ^ Rh7gh7)); + assign Rh7gh7 = (~(Jo8gh7 | Xqtfh7)); + assign R2wfh7 = (!Do8gh7); + assign Fh7gh7 = (~(Dxwfh7 ^ Xh7gh7)); + assign Xh7gh7 = (~(Nm8gh7 | Dotfh7)); + assign Dxwfh7 = (!Hm8gh7); + assign Jf7gh7 = (Di7gh7 & Ji7gh7); + assign Ji7gh7 = (Pi7gh7 & Vi7gh7); + assign Vi7gh7 = (~(Bvvfh7 ^ Bj7gh7)); + assign Bj7gh7 = (~(Rk8gh7 | Prtfh7)); + assign Bvvfh7 = (!Lk8gh7); + assign Pi7gh7 = (~(Jfwfh7 ^ Hj7gh7)); + assign Hj7gh7 = (~(Vi8gh7 | Tptfh7)); + assign Jfwfh7 = (!Pi8gh7); + assign Di7gh7 = (Nj7gh7 & Tj7gh7); + assign Tj7gh7 = (~(Lzwfh7 ^ Zj7gh7)); + assign Zj7gh7 = (~(Zg8gh7 | Xntfh7)); + assign Lzwfh7 = (!Tg8gh7); + assign Nj7gh7 = (~(Jixfh7 ^ Fk7gh7)); + assign Fk7gh7 = (~(Df8gh7 | Bmtfh7)); + assign Jixfh7 = (!Xe8gh7); + assign Ny6gh7 = (Fq4gh7 & Ty4gh7); + assign Fq4gh7 = (!Dx3gh7); + assign Dx3gh7 = (~(Lk7gh7 & Dx6gh7)); + assign Dx6gh7 = (Rk7gh7 & Fk4gh7); + assign Rk7gh7 = (Xb9gh7 & Fw8gh7); + assign Lk7gh7 = (Lw8gh7 & Zj4gh7); + assign Zj4gh7 = (!Rw8gh7); + assign T3sfh7 = (~(Xk7gh7 & Dl7gh7)); + assign Dl7gh7 = (Jl7gh7 & Pl7gh7); + assign Pl7gh7 = (~(Pl5gh7 & Ta4gh7)); + assign Ta4gh7 = (!Vl7gh7); + assign Pl5gh7 = (Fk5gh7 & J33gh7); + assign J33gh7 = (~(Bm7gh7 & Hm7gh7)); + assign Hm7gh7 = (J9vfh7 & Bsxfh7); + assign Bsxfh7 = (!com_rx_tdata[3]); + assign Bm7gh7 = (Xh6gh7 & Nyxfh7); + assign Nyxfh7 = (~(com_rx_tdata[5] | com_rx_tdata[0])); + assign Fk5gh7 = (~(Nm7gh7 & Tm7gh7)); + assign Tm7gh7 = (Zm7gh7 & Fn7gh7); + assign Fn7gh7 = (~(com_rx_tdata[2] & V6vfh7)); + assign V6vfh7 = (!com_rx_tdata[0]); + assign Zm7gh7 = (~(Ftxfh7 | com_rx_tdata[5])); + assign Ftxfh7 = (com_rx_tdata[1] & com_rx_tdata[0]); + assign Nm7gh7 = (Nvxfh7 & Xh6gh7); + assign Xh6gh7 = (Zp5gh7 & Z7vfh7); + assign Z7vfh7 = (!com_rx_tdata[4]); + assign Zp5gh7 = (~(com_rx_tdata[6] | com_rx_tdata[7])); + assign Nvxfh7 = (com_rx_tdata[3] & Bjvfh7); + assign Bjvfh7 = (!Zjxfh7); + assign Zjxfh7 = (J9vfh7 & R8vfh7); + assign R8vfh7 = (!com_rx_tdata[2]); + assign J9vfh7 = (!com_rx_tdata[1]); + assign Jl7gh7 = (Fw3gh7 & Dl0gh7); + assign Dl0gh7 = (~(Ln7gh7 & Hv8gh7)); + assign Ln7gh7 = (~(Rn7gh7 | Nv8gh7)); + assign Fw3gh7 = (~(Xn7gh7 & Do7gh7)); + assign Do7gh7 = (~(Lw5gh7 | Bv8gh7)); + assign Lw5gh7 = (!L29gh7); + assign Xn7gh7 = (Rw5gh7 & Tv8gh7); + assign Rw5gh7 = (Jo7gh7 & Po7gh7); + assign Po7gh7 = (Vo7gh7 & Bp7gh7); + assign Xk7gh7 = (Hp7gh7 & Vx4gh7); + assign Vx4gh7 = (Xw4gh7 & Dx4gh7); + assign Dx4gh7 = (~(Np7gh7 & Ln6gh7)); + assign Np7gh7 = (~(Ng6gh7 | D09gh7)); + assign Xw4gh7 = (~(Tp7gh7 & Zp7gh7)); + assign Zp7gh7 = (Dx8gh7 & Fq7gh7); + assign Hp7gh7 = (Lq7gh7 & Rq7gh7); + assign Rq7gh7 = (~(Xq7gh7 & Rw4gh7)); + assign Rw4gh7 = (!Rezfh7); + assign Rezfh7 = (com_rx_tvalid & com_rx_tready); + assign Xq7gh7 = (~(Z16gh7 & Fbvfh7)); + assign Fbvfh7 = (~(Tp7gh7 & Dr7gh7)); + assign Dr7gh7 = (~(Fq7gh7 | Dx8gh7)); + assign Fq7gh7 = (!Xw8gh7); + assign Tp7gh7 = (F56gh7 & Zv8gh7); + assign F56gh7 = (Jr7gh7 & Pr7gh7); + assign Pr7gh7 = (Xb9gh7 & Vr7gh7); + assign Z16gh7 = (Vl7gh7 & T4vfh7); + assign T4vfh7 = (~(Bs7gh7 & Nv8gh7)); + assign Bs7gh7 = (~(Rn7gh7 | Hv8gh7)); + assign Rn7gh7 = (~(Hs7gh7 & Ft8gh7)); + assign Hs7gh7 = (Bp7gh7 & Ns7gh7); + assign Vl7gh7 = (Drxfh7 & X23gh7); + assign X23gh7 = (~(Ts7gh7 & Zs7gh7)); + assign Zs7gh7 = (Bd9gh7 & Ft7gh7); + assign Ts7gh7 = (Lw6gh7 & V99gh7); + assign Lw6gh7 = (~(Lt7gh7 | N76gh7)); + assign Drxfh7 = (~(Rt7gh7 & Xt7gh7)); + assign Xt7gh7 = (Du7gh7 & V99gh7); + assign Du7gh7 = (Bd9gh7 & N76gh7); + assign N76gh7 = (!N19gh7); + assign Rt7gh7 = (~(Lt7gh7 | Ft7gh7)); + assign Ft7gh7 = (!T19gh7); + assign Lt7gh7 = (~(Ju7gh7 & Pu7gh7)); + assign Pu7gh7 = (H19gh7 & Ba9gh7); + assign Ju7gh7 = (N16gh7 & V09gh7); + assign N16gh7 = (F86gh7 & Vu7gh7); + assign Vu7gh7 = (~(Bv7gh7 | Hv7gh7)); + assign F86gh7 = (Df6gh7 & V06gh7); + assign Lq7gh7 = (F85gh7 | Ha6gh7); + assign Ha6gh7 = (Zv3gh7 & V62gh7); + assign V62gh7 = (~(Fb6gh7 & Nv7gh7)); + assign Nv7gh7 = (Tv7gh7 & Lz8gh7); + assign Tv7gh7 = (Rz8gh7 & Xb6gh7); + assign K4sfh7 = (~(Zv7gh7 & R54gh7)); + assign R54gh7 = (Rb4gh7 | Zj2gh7); + assign Zj2gh7 = (!Dl2gh7); + assign Dl2gh7 = (com_tx_tready & com_tx_tvalid); + assign Rb4gh7 = (~(Lt6gh7 & Fw7gh7)); + assign Fw7gh7 = (Rt8gh7 & By6gh7); + assign By6gh7 = (!Xt8gh7); + assign Lt6gh7 = (Hy6gh7 & Lt8gh7); + assign Hy6gh7 = (H46gh7 & Lw7gh7); + assign H46gh7 = (Rw7gh7 & Ft8gh7); + assign Zv7gh7 = (Bv5gh7 & V65gh7); + assign V65gh7 = (Xw7gh7 | Zv3gh7); + assign Zv3gh7 = (~(Fb6gh7 & Dx7gh7)); + assign Dx7gh7 = (Jx7gh7 & Rz8gh7); + assign Jx7gh7 = (~(Xb6gh7 | Lz8gh7)); + assign Xb6gh7 = (!Xz8gh7); + assign Fb6gh7 = (Px7gh7 & Nv6gh7); + assign Xw7gh7 = (~(stdio_rx_tvalid & F85gh7)); + assign F85gh7 = (!com_rx_tvalid); + assign Bv5gh7 = (D34gh7 | J34gh7); + assign J34gh7 = (~(P65gh7 | L54gh7)); + assign L54gh7 = (Vx7gh7 & Fk4gh7); + assign Fk4gh7 = (Jr7gh7 & By7gh7); + assign By7gh7 = (Zv8gh7 & R56gh7); + assign Jr7gh7 = (Px7gh7 & Tv6gh7); + assign Px7gh7 = (Vu6gh7 & Hy7gh7); + assign Hy7gh7 = (Ny7gh7 & Ty7gh7); + assign Ty7gh7 = (Vx8gh7 & Jr6gh7); + assign Ny7gh7 = (Zm6gh7 & Px8gh7); + assign Vu6gh7 = (Zy7gh7 & Ln6gh7); + assign Ln6gh7 = (Fz7gh7 & Df6gh7); + assign Df6gh7 = (Lz7gh7 & B16gh7); + assign B16gh7 = (Jo7gh7 & Rz7gh7); + assign Rz7gh7 = (Xz7gh7 & D08gh7); + assign D08gh7 = (Tv8gh7 & L29gh7); + assign Xz7gh7 = (Bp7gh7 & Bv8gh7); + assign Bp7gh7 = (!J08gh7); + assign Jo7gh7 = (P08gh7 & Hv8gh7); + assign P08gh7 = (Nv8gh7 & Ft8gh7); + assign Lz7gh7 = (X29gh7 & P09gh7); + assign Fz7gh7 = (J06gh7 & J09gh7); + assign Zy7gh7 = (D09gh7 & Jl6gh7); + assign Vx7gh7 = (Vr7gh7 & J64gh7); + assign J64gh7 = (!Xb9gh7); + assign P65gh7 = (V08gh7 & Rw7gh7); + assign Rw7gh7 = (B18gh7 & Hv8gh7); + assign B18gh7 = (Nv8gh7 & Ns7gh7); + assign Ns7gh7 = (H18gh7 & N18gh7); + assign N18gh7 = (Vo7gh7 & L29gh7); + assign Vo7gh7 = (X29gh7 & Rk6gh7); + assign Rk6gh7 = (T18gh7 & P09gh7); + assign T18gh7 = (J06gh7 & V06gh7); + assign V06gh7 = (Z18gh7 & D09gh7); + assign Z18gh7 = (J09gh7 & F28gh7); + assign F28gh7 = (!Ng6gh7); + assign Ng6gh7 = (~(L28gh7 & Rn6gh7)); + assign Rn6gh7 = (Nd6gh7 & R28gh7); + assign R28gh7 = (X28gh7 & Nv6gh7); + assign Nv6gh7 = (D38gh7 & J38gh7); + assign J38gh7 = (Vr7gh7 & R56gh7); + assign R56gh7 = (Xw8gh7 & Dx8gh7); + assign Vr7gh7 = (P38gh7 & Fw8gh7); + assign P38gh7 = (Lw8gh7 & Rw8gh7); + assign D38gh7 = (Zv8gh7 & Xb9gh7); + assign X28gh7 = (Tv6gh7 & Jr6gh7); + assign Jr6gh7 = (V38gh7 & Ty8gh7); + assign V38gh7 = (~(Le6gh7 | Hd6gh7)); + assign Hd6gh7 = (~(Ny8gh7 & Zy8gh7)); + assign Le6gh7 = (!Fz8gh7); + assign Tv6gh7 = (B48gh7 & Lz8gh7); + assign B48gh7 = (Rz8gh7 & Xz8gh7); + assign Nd6gh7 = (Px8gh7 & Vx8gh7); + assign L28gh7 = (Jl6gh7 & Zm6gh7); + assign Zm6gh7 = (Jx8gh7 & By8gh7); + assign Jl6gh7 = (Hy8gh7 & Pc9gh7); + assign J06gh7 = (~(Bv7gh7 | Zg6gh7)); + assign Zg6gh7 = (~(H48gh7 & V09gh7)); + assign H48gh7 = (~(T16gh7 | Hv7gh7)); + assign Hv7gh7 = (~(N48gh7 & B19gh7)); + assign N48gh7 = (Z19gh7 & Ha9gh7); + assign T16gh7 = (~(T48gh7 & Z48gh7)); + assign Z48gh7 = (F58gh7 & V99gh7); + assign F58gh7 = (Ba9gh7 & Bd9gh7); + assign T48gh7 = (L58gh7 & H19gh7); + assign L58gh7 = (N19gh7 & T19gh7); + assign Bv7gh7 = (!F29gh7); + assign H18gh7 = (Bv8gh7 & Tv8gh7); + assign V08gh7 = (~(J08gh7 | Ft8gh7)); + assign J08gh7 = (~(R58gh7 & X58gh7)); + assign X58gh7 = (Lw7gh7 & Xt8gh7); + assign Lw7gh7 = (Vu8gh7 & D68gh7); + assign D68gh7 = (!Zy5gh7); + assign Zy5gh7 = (~(J68gh7 & Du8gh7)); + assign J68gh7 = (Ju8gh7 & Pu8gh7); + assign R58gh7 = (Lt8gh7 & Rt8gh7); + assign D34gh7 = (stdio_rx_tready & stdio_rx_tvalid); + assign Tosfh7 = (P68gh7 & Vi0gh7); + assign P68gh7 = (V68gh7 & Patfh7); + assign V68gh7 = (~(Bsufh7 & Tp4gh7)); + assign Tp4gh7 = (!Ty4gh7); + assign Ty4gh7 = (~(B78gh7 & H78gh7)); + assign H78gh7 = (N78gh7 & T78gh7); + assign T78gh7 = (Z78gh7 & F88gh7); + assign F88gh7 = (L88gh7 & R88gh7); + assign R88gh7 = (Jctfh7 & Dctfh7); + assign L88gh7 = (Vctfh7 & Pctfh7); + assign Z78gh7 = (X88gh7 & D98gh7); + assign D98gh7 = (Hdtfh7 & Bdtfh7); + assign X88gh7 = (Tdtfh7 & Ndtfh7); + assign N78gh7 = (J98gh7 & P98gh7); + assign P98gh7 = (V98gh7 & Ba8gh7); + assign Ba8gh7 = (Fetfh7 & Zdtfh7); + assign V98gh7 = (Retfh7 & Letfh7); + assign J98gh7 = (Ha8gh7 & Na8gh7); + assign Na8gh7 = (Dftfh7 & Xetfh7); + assign Ha8gh7 = (Pftfh7 & Jftfh7); + assign B78gh7 = (Ta8gh7 & Za8gh7); + assign Za8gh7 = (Fb8gh7 & Lb8gh7); + assign Lb8gh7 = (Rb8gh7 & Xb8gh7); + assign Xb8gh7 = (Bgtfh7 & Vftfh7); + assign Rb8gh7 = (Ngtfh7 & Hgtfh7); + assign Fb8gh7 = (Dc8gh7 & Jc8gh7); + assign Jc8gh7 = (Zgtfh7 & Tgtfh7); + assign Dc8gh7 = (Lhtfh7 & Fhtfh7); + assign Ta8gh7 = (Pc8gh7 & Vc8gh7); + assign Vc8gh7 = (Bd8gh7 & Hd8gh7); + assign Hd8gh7 = (Xhtfh7 & Rhtfh7); + assign Bd8gh7 = (Jitfh7 & Ditfh7); + assign Pc8gh7 = (Nd8gh7 & Ybtfh7); + assign Nd8gh7 = (Tbtfh7 & Obtfh7); + assign B9tfh7 = (Vi0gh7 & R9tfh7); + assign Vi0gh7 = (Td8gh7 & ahb_hready); + assign Td8gh7 = (~(Hd9gh7 | R29gh7)); + + always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin + Ie9gh7 <= 1'b0; + end + else + begin + Ie9gh7 <= Dltfh7; + end + always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin + If9gh7 <= 1'b0; + end + else + begin + If9gh7 <= T1ufh7; + end + always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin + Ng9gh7 <= 1'b1; + end + else + begin + Ng9gh7 <= C3sfh7; + end + always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin + Ph9gh7 <= 1'b0; + end + else + begin + Ph9gh7 <= Piufh7; + end + always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin + Ri9gh7 <= 1'b0; + end + else + begin + Ri9gh7 <= T5rfh7; + end + always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin + Tj9gh7 <= 1'b0; + end + else + begin + Tj9gh7 <= Virfh7; + end + always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin + Wk9gh7 <= 1'b0; + end + else + begin + Wk9gh7 <= T3sfh7; + end + always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin + Wl9gh7 <= 1'b0; + end + else + begin + Wl9gh7 <= Nhrfh7; + end + always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin + Zm9gh7 <= 1'b0; + end + else + begin + Zm9gh7 <= Nyrfh7; + end + always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin + Bo9gh7 <= 1'b0; + end + else + begin + Bo9gh7 <= Wxrfh7; + end + always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin + Dp9gh7 <= 1'b0; + end + else + begin + Dp9gh7 <= Fxrfh7; + end + always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin + Fq9gh7 <= 1'b0; + end + else + begin + Fq9gh7 <= Owrfh7; + end + always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin + Ir9gh7 <= 1'b0; + end + else + begin + Ir9gh7 <= Zarfh7; + end + always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin + Ls9gh7 <= 1'b0; + end + else + begin + Ls9gh7 <= S7rfh7; + end + always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin + Lt9gh7 <= 1'b0; + end + else + begin + Lt9gh7 <= Tmrfh7; + end + always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin + Ou9gh7 <= 1'b0; + end + else + begin + Ou9gh7 <= Vkqfh7; + end + always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin + Pv9gh7 <= 1'b0; + end + else + begin + Pv9gh7 <= Npufh7; + end + always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin + Rw9gh7 <= 1'b0; + end + else + begin + Rw9gh7 <= Hjufh7; + end + always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin + Tx9gh7 <= 1'b0; + end + else + begin + Tx9gh7 <= Mjrfh7; + end + always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin + Wy9gh7 <= 1'b0; + end + else + begin + Wy9gh7 <= Cmrfh7; + end + always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin + Zz9gh7 <= 1'b0; + end + else + begin + Zz9gh7 <= Ukrfh7; + end + always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin + C1agh7 <= 1'b0; + end + else + begin + C1agh7 <= Xvrfh7; + end + always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin + F2agh7 <= 1'b0; + end + else + begin + F2agh7 <= J8rfh7; + end + always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin + I3agh7 <= 1'b0; + end + else + begin + I3agh7 <= Htrfh7; + end + always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin + L4agh7 <= 1'b0; + end + else + begin + L4agh7 <= Qsrfh7; + end + always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin + O5agh7 <= 1'b0; + end + else + begin + O5agh7 <= Iarfh7; + end + always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin + R6agh7 <= 1'b0; + end + else + begin + R6agh7 <= R9rfh7; + end + always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin + U7agh7 <= 1'b0; + end + else + begin + U7agh7 <= K4sfh7; + end + always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin + U8agh7 <= 1'b0; + end + else + begin + U8agh7 <= Gvrfh7; + end + always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin + X9agh7 <= 1'b0; + end + else + begin + X9agh7 <= Purfh7; + end + always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin + Abagh7 <= 1'b1; + end + else + begin + Abagh7 <= Xktfh7; + end + always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin + Wbagh7 <= 1'b0; + end + else + begin + Wbagh7 <= Ytrfh7; + end + always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin + Zcagh7 <= 1'b0; + end + else + begin + Zcagh7 <= Qbrfh7; + end + always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin + Ceagh7 <= 1'b0; + end + else + begin + Ceagh7 <= L2sfh7; + end + always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin + Efagh7 <= 1'b0; + end + else + begin + Efagh7 <= U1sfh7; + end + always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin + Ggagh7 <= 1'b0; + end + else + begin + Ggagh7 <= Hcrfh7; + end + always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin + Jhagh7 <= 1'b0; + end + else + begin + Jhagh7 <= Llrfh7; + end + always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin + Miagh7 <= 1'b0; + end + else + begin + Miagh7 <= Eirfh7; + end + always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin + Pjagh7 <= 1'b0; + end + else + begin + Pjagh7 <= Fgrfh7; + end + always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin + Skagh7 <= 1'b0; + end + else + begin + Skagh7 <= Wgrfh7; + end + always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin + Vlagh7 <= 1'b0; + end + else + begin + Vlagh7 <= Ofrfh7; + end + always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin + Ymagh7 <= 1'b0; + end + else + begin + Ymagh7 <= Xerfh7; + end + always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin + Boagh7 <= 1'b0; + end + else + begin + Boagh7 <= Ycrfh7; + end + always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin + Epagh7 <= 1'b0; + end + else + begin + Epagh7 <= Prufh7; + end + always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin + Eqagh7 <= 1'b0; + end + else + begin + Eqagh7 <= Jrufh7; + end + always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin + Eragh7 <= 1'b0; + end + else + begin + Eragh7 <= Drufh7; + end + always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin + Esagh7 <= 1'b0; + end + else + begin + Esagh7 <= Xqufh7; + end + always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin + Etagh7 <= 1'b0; + end + else + begin + Etagh7 <= Rqufh7; + end + always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin + Euagh7 <= 1'b0; + end + else + begin + Euagh7 <= Lqufh7; + end + always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin + Evagh7 <= 1'b0; + end + else + begin + Evagh7 <= Fqufh7; + end + always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin + Ewagh7 <= 1'b0; + end + else + begin + Ewagh7 <= Sorfh7; + end + always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin + Hxagh7 <= 1'b0; + end + else + begin + Hxagh7 <= Borfh7; + end + always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin + Kyagh7 <= 1'b0; + end + else + begin + Kyagh7 <= Aqrfh7; + end + always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin + Nzagh7 <= 1'b0; + end + else + begin + Nzagh7 <= Rqrfh7; + end + always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin + Q0bgh7 <= 1'b0; + end + else + begin + Q0bgh7 <= Knrfh7; + end + always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin + T1bgh7 <= 1'b0; + end + else + begin + T1bgh7 <= Pdrfh7; + end + always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin + W2bgh7 <= 1'b0; + end + else + begin + W2bgh7 <= Zrrfh7; + end + always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin + Z3bgh7 <= 1'b0; + end + else + begin + Z3bgh7 <= Irrfh7; + end + always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin + C5bgh7 <= 1'b0; + end + else + begin + C5bgh7 <= Jprfh7; + end + always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin + F6bgh7 <= 1'b0; + end + else + begin + F6bgh7 <= Vrufh7; + end + always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin + H7bgh7 <= 1'b0; + end + else + begin + H7bgh7 <= Zpufh7; + end + always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin + K8bgh7 <= 1'b0; + end + else + begin + K8bgh7 <= Dkrfh7; + end + always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin + N9bgh7 <= 1'b0; + end + else + begin + N9bgh7 <= Njufh7; + end + always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin + Pabgh7 <= 1'b0; + end + else + begin + Pabgh7 <= Lkufh7; + end + always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin + Rbbgh7 <= 1'b0; + end + else + begin + Rbbgh7 <= Jlufh7; + end + always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin + Ucbgh7 <= 1'b0; + end + else + begin + Ucbgh7 <= Hmufh7; + end + always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin + Xdbgh7 <= 1'b0; + end + else + begin + Xdbgh7 <= Fnufh7; + end + always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin + Afbgh7 <= 1'b0; + end + else + begin + Afbgh7 <= Doufh7; + end + always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin + Dgbgh7 <= 1'b0; + end + else + begin + Dgbgh7 <= Bpufh7; + end + always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin + Ghbgh7 <= 1'b0; + end + else + begin + Ghbgh7 <= W1qfh7; + end + always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin + Iibgh7 <= 1'b0; + end + else + begin + Iibgh7 <= O0qfh7; + end + always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin + Kjbgh7 <= 1'b0; + end + else + begin + Kjbgh7 <= Tpufh7; + end + always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin + Nkbgh7 <= 1'b0; + end + else + begin + Nkbgh7 <= M4qfh7; + end + always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin + Plbgh7 <= 1'b0; + end + else + begin + Plbgh7 <= C7qfh7; + end + always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin + Rmbgh7 <= 1'b0; + end + else + begin + Rmbgh7 <= S9qfh7; + end + always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin + Tnbgh7 <= 1'b0; + end + else + begin + Tnbgh7 <= Icqfh7; + end + always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin + Vobgh7 <= 1'b0; + end + else + begin + Vobgh7 <= Yeqfh7; + end + always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin + Wpbgh7 <= 1'b0; + end + else + begin + Wpbgh7 <= Ohqfh7; + end + always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin + Xqbgh7 <= 1'b0; + end + else + begin + Xqbgh7 <= Fiqfh7; + end + always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin + Yrbgh7 <= 1'b0; + end + else + begin + Yrbgh7 <= Ekqfh7; + end + always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin + Zsbgh7 <= 1'b0; + end + else + begin + Zsbgh7 <= Viufh7; + end + always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin + Bubgh7 <= 1'b0; + end + else + begin + Bubgh7 <= Njqfh7; + end + always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin + Cvbgh7 <= 1'b0; + end + else + begin + Cvbgh7 <= Rbufh7; + end + always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin + Dwbgh7 <= 1'b0; + end + else + begin + Dwbgh7 <= N4ufh7; + end + always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin + Dxbgh7 <= 1'b0; + end + else + begin + Dxbgh7 <= Bjufh7; + end + always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin + Fybgh7 <= 1'b0; + end + else + begin + Fybgh7 <= Wiqfh7; + end + always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin + Gzbgh7 <= 1'b0; + end + else + begin + Gzbgh7 <= Xbufh7; + end + always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin + H0cgh7 <= 1'b0; + end + else + begin + H0cgh7 <= T4ufh7; + end + always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin + H1cgh7 <= 1'b0; + end + else + begin + H1cgh7 <= X5ufh7; + end + always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin + H2cgh7 <= 1'b0; + end + else + begin + H2cgh7 <= Fkufh7; + end + always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin + J3cgh7 <= 1'b0; + end + else + begin + J3cgh7 <= Pfqfh7; + end + always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin + K4cgh7 <= 1'b0; + end + else + begin + K4cgh7 <= Dlufh7; + end + always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin + N5cgh7 <= 1'b0; + end + else + begin + N5cgh7 <= Zcqfh7; + end + always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin + P6cgh7 <= 1'b0; + end + else + begin + P6cgh7 <= Bmufh7; + end + always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin + S7cgh7 <= 1'b0; + end + else + begin + S7cgh7 <= Jaqfh7; + end + always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin + U8cgh7 <= 1'b0; + end + else + begin + U8cgh7 <= Zmufh7; + end + always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin + X9cgh7 <= 1'b0; + end + else + begin + X9cgh7 <= T7qfh7; + end + always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin + Zacgh7 <= 1'b0; + end + else + begin + Zacgh7 <= Xnufh7; + end + always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin + Cccgh7 <= 1'b0; + end + else + begin + Cccgh7 <= D5qfh7; + end + always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin + Edcgh7 <= 1'b0; + end + else + begin + Edcgh7 <= Voufh7; + end + always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin + Hecgh7 <= 1'b0; + end + else + begin + Hecgh7 <= N2qfh7; + end + always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin + Jfcgh7 <= 1'b0; + end + else + begin + Jfcgh7 <= Naufh7; + end + always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin + Kgcgh7 <= 1'b0; + end + else + begin + Kgcgh7 <= Rhufh7; + end + always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin + Mhcgh7 <= 1'b0; + end + else + begin + Mhcgh7 <= P9ufh7; + end + always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin + Nicgh7 <= 1'b0; + end + else + begin + Nicgh7 <= Tgufh7; + end + always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin + Pjcgh7 <= 1'b0; + end + else + begin + Pjcgh7 <= R8ufh7; + end + always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin + Qkcgh7 <= 1'b0; + end + else + begin + Qkcgh7 <= Vfufh7; + end + always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin + Slcgh7 <= 1'b0; + end + else + begin + Slcgh7 <= T7ufh7; + end + always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin + Tmcgh7 <= 1'b0; + end + else + begin + Tmcgh7 <= Xeufh7; + end + always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin + Vncgh7 <= 1'b0; + end + else + begin + Vncgh7 <= V6ufh7; + end + always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin + Wocgh7 <= 1'b0; + end + else + begin + Wocgh7 <= Zdufh7; + end + always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin + Ypcgh7 <= 1'b0; + end + else + begin + Ypcgh7 <= Bdufh7; + end + always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin + Zqcgh7 <= 1'b0; + end + else + begin + Zqcgh7 <= R5ufh7; + end + always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin + Zrcgh7 <= 1'b0; + end + else + begin + Zrcgh7 <= Zjufh7; + end + always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin + Btcgh7 <= 1'b0; + end + else + begin + Btcgh7 <= Ggqfh7; + end + always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin + Cucgh7 <= 1'b0; + end + else + begin + Cucgh7 <= Xkufh7; + end + always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin + Fvcgh7 <= 1'b0; + end + else + begin + Fvcgh7 <= Qdqfh7; + end + always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin + Hwcgh7 <= 1'b0; + end + else + begin + Hwcgh7 <= Vlufh7; + end + always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin + Kxcgh7 <= 1'b0; + end + else + begin + Kxcgh7 <= Abqfh7; + end + always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin + Mycgh7 <= 1'b0; + end + else + begin + Mycgh7 <= Tmufh7; + end + always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin + Pzcgh7 <= 1'b0; + end + else + begin + Pzcgh7 <= K8qfh7; + end + always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin + R0dgh7 <= 1'b0; + end + else + begin + R0dgh7 <= Rnufh7; + end + always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin + U1dgh7 <= 1'b0; + end + else + begin + U1dgh7 <= U5qfh7; + end + always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin + W2dgh7 <= 1'b0; + end + else + begin + W2dgh7 <= Poufh7; + end + always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin + Z3dgh7 <= 1'b0; + end + else + begin + Z3dgh7 <= E3qfh7; + end + always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin + B5dgh7 <= 1'b0; + end + else + begin + B5dgh7 <= Haufh7; + end + always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin + C6dgh7 <= 1'b0; + end + else + begin + C6dgh7 <= Lhufh7; + end + always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin + E7dgh7 <= 1'b0; + end + else + begin + E7dgh7 <= J9ufh7; + end + always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin + F8dgh7 <= 1'b0; + end + else + begin + F8dgh7 <= Ngufh7; + end + always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin + H9dgh7 <= 1'b0; + end + else + begin + H9dgh7 <= L8ufh7; + end + always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin + Iadgh7 <= 1'b0; + end + else + begin + Iadgh7 <= Pfufh7; + end + always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin + Kbdgh7 <= 1'b0; + end + else + begin + Kbdgh7 <= N7ufh7; + end + always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin + Lcdgh7 <= 1'b0; + end + else + begin + Lcdgh7 <= Reufh7; + end + always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin + Nddgh7 <= 1'b0; + end + else + begin + Nddgh7 <= P6ufh7; + end + always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin + Oedgh7 <= 1'b0; + end + else + begin + Oedgh7 <= Tdufh7; + end + always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin + Qfdgh7 <= 1'b0; + end + else + begin + Qfdgh7 <= Vcufh7; + end + always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin + Rgdgh7 <= 1'b0; + end + else + begin + Rgdgh7 <= L5ufh7; + end + always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin + Rhdgh7 <= 1'b0; + end + else + begin + Rhdgh7 <= Tjufh7; + end + always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin + Tidgh7 <= 1'b0; + end + else + begin + Tidgh7 <= Xgqfh7; + end + always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin + Ujdgh7 <= 1'b0; + end + else + begin + Ujdgh7 <= Rkufh7; + end + always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin + Xkdgh7 <= 1'b0; + end + else + begin + Xkdgh7 <= Heqfh7; + end + always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin + Zldgh7 <= 1'b0; + end + else + begin + Zldgh7 <= Plufh7; + end + always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin + Cndgh7 <= 1'b0; + end + else + begin + Cndgh7 <= Rbqfh7; + end + always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin + Eodgh7 <= 1'b0; + end + else + begin + Eodgh7 <= Nmufh7; + end + always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin + Hpdgh7 <= 1'b0; + end + else + begin + Hpdgh7 <= B9qfh7; + end + always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin + Jqdgh7 <= 1'b0; + end + else + begin + Jqdgh7 <= Lnufh7; + end + always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin + Mrdgh7 <= 1'b0; + end + else + begin + Mrdgh7 <= L6qfh7; + end + always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin + Osdgh7 <= 1'b0; + end + else + begin + Osdgh7 <= Joufh7; + end + always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin + Rtdgh7 <= 1'b0; + end + else + begin + Rtdgh7 <= V3qfh7; + end + always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin + Tudgh7 <= 1'b0; + end + else + begin + Tudgh7 <= Hpufh7; + end + always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin + Wvdgh7 <= 1'b0; + end + else + begin + Wvdgh7 <= F1qfh7; + end + always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin + Ywdgh7 <= 1'b0; + end + else + begin + Ywdgh7 <= Zaufh7; + end + always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin + Zxdgh7 <= 1'b0; + end + else + begin + Zxdgh7 <= Diufh7; + end + always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin + Bzdgh7 <= 1'b0; + end + else + begin + Bzdgh7 <= Baufh7; + end + always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin + C0egh7 <= 1'b0; + end + else + begin + C0egh7 <= Fhufh7; + end + always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin + E1egh7 <= 1'b0; + end + else + begin + E1egh7 <= D9ufh7; + end + always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin + F2egh7 <= 1'b0; + end + else + begin + F2egh7 <= Hgufh7; + end + always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin + H3egh7 <= 1'b0; + end + else + begin + H3egh7 <= F8ufh7; + end + always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin + I4egh7 <= 1'b0; + end + else + begin + I4egh7 <= Jfufh7; + end + always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin + K5egh7 <= 1'b0; + end + else + begin + K5egh7 <= H7ufh7; + end + always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin + L6egh7 <= 1'b0; + end + else + begin + L6egh7 <= Leufh7; + end + always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin + N7egh7 <= 1'b0; + end + else + begin + N7egh7 <= J6ufh7; + end + always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin + O8egh7 <= 1'b0; + end + else + begin + O8egh7 <= Ndufh7; + end + always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin + Q9egh7 <= 1'b0; + end + else + begin + Q9egh7 <= Pcufh7; + end + always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin + Raegh7 <= 1'b0; + end + else + begin + Raegh7 <= Z4ufh7; + end + always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin + Rbegh7 <= 1'b0; + end + else + begin + Rbegh7 <= Z1ufh7; + end + always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin + Scegh7 <= 1'b0; + end + else + begin + Scegh7 <= F2ufh7; + end + always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin + Udegh7 <= 1'b0; + end + else + begin + Udegh7 <= Taufh7; + end + always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin + Veegh7 <= 1'b0; + end + else + begin + Veegh7 <= Xhufh7; + end + always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin + Xfegh7 <= 1'b0; + end + else + begin + Xfegh7 <= V9ufh7; + end + always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin + Ygegh7 <= 1'b0; + end + else + begin + Ygegh7 <= Zgufh7; + end + always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin + Aiegh7 <= 1'b0; + end + else + begin + Aiegh7 <= X8ufh7; + end + always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin + Bjegh7 <= 1'b0; + end + else + begin + Bjegh7 <= Bgufh7; + end + always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin + Dkegh7 <= 1'b0; + end + else + begin + Dkegh7 <= Z7ufh7; + end + always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin + Elegh7 <= 1'b0; + end + else + begin + Elegh7 <= Dfufh7; + end + always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin + Gmegh7 <= 1'b0; + end + else + begin + Gmegh7 <= B7ufh7; + end + always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin + Hnegh7 <= 1'b0; + end + else + begin + Hnegh7 <= Feufh7; + end + always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin + Joegh7 <= 1'b0; + end + else + begin + Joegh7 <= D6ufh7; + end + always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin + Jpegh7 <= 1'b0; + end + else + begin + Jpegh7 <= Hdufh7; + end + always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin + Kqegh7 <= 1'b0; + end + else + begin + Kqegh7 <= L2ufh7; + end + always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin + Kregh7 <= 1'b0; + end + else + begin + Kregh7 <= R2ufh7; + end + always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin + Ksegh7 <= 1'b0; + end + else + begin + Ksegh7 <= D3ufh7; + end + always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin + Ktegh7 <= 1'b0; + end + else + begin + Ktegh7 <= J3ufh7; + end + always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin + Kuegh7 <= 1'b0; + end + else + begin + Kuegh7 <= P3ufh7; + end + always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin + Kvegh7 <= 1'b0; + end + else + begin + Kvegh7 <= B4ufh7; + end + always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin + Kwegh7 <= 1'b0; + end + else + begin + Kwegh7 <= F5ufh7; + end + always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin + Kxegh7 <= 1'b0; + end + else + begin + Kxegh7 <= X2ufh7; + end + always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin + Kyegh7 <= 1'b0; + end + else + begin + Kyegh7 <= Jcufh7; + end + always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin + Lzegh7 <= 1'b0; + end + else + begin + Lzegh7 <= Xzpfh7; + end + always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin + O0fgh7 <= 1'b0; + end + else + begin + O0fgh7 <= Mlqfh7; + end + always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin + P1fgh7 <= 1'b0; + end + else + begin + P1fgh7 <= Gerfh7; + end + always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin + S2fgh7 <= 1'b0; + end + else + begin + S2fgh7 <= A9rfh7; + end + always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin + V3fgh7 <= 1'b0; + end + else + begin + V3fgh7 <= M0sfh7; + end + always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin + X4fgh7 <= 1'b0; + end + else + begin + X4fgh7 <= Ezrfh7; + end + always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin + Z5fgh7 <= 1'b0; + end + else + begin + Z5fgh7 <= D1sfh7; + end + always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin + B7fgh7 <= 1'b0; + end + else + begin + B7fgh7 <= Vzrfh7; + end + always @(posedge Puufh7) D8fgh7 <= Tstfh7; + always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin + H9fgh7 <= 1'b0; + end + else + begin + H9fgh7 <= B7rfh7; + end + always @(posedge Puufh7) Hafgh7 <= Xtufh7; + always @(posedge Puufh7) Lbfgh7 <= Rtufh7; + always @(posedge Puufh7) Pcfgh7 <= Ltufh7; + always @(posedge Puufh7) Tdfgh7 <= Ftufh7; + always @(posedge Puufh7) Xefgh7 <= Zsufh7; + always @(posedge Puufh7) Bgfgh7 <= Tsufh7; + always @(posedge Puufh7) Fhfgh7 <= Nsufh7; + always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin + Jifgh7 <= 1'b0; + end + else + begin + Jifgh7 <= H1ufh7; + end + always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin + Ojfgh7 <= 1'b0; + end + else + begin + Ojfgh7 <= B1ufh7; + end + always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin + Tkfgh7 <= 1'b0; + end + else + begin + Tkfgh7 <= P0ufh7; + end + always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin + Ylfgh7 <= 1'b0; + end + else + begin + Ylfgh7 <= J0ufh7; + end + always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin + Dnfgh7 <= 1'b0; + end + else + begin + Dnfgh7 <= D0ufh7; + end + always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin + Iofgh7 <= 1'b1; + end + else + begin + Iofgh7 <= Xztfh7; + end + always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin + Npfgh7 <= 1'b1; + end + else + begin + Npfgh7 <= Rztfh7; + end + always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin + Sqfgh7 <= 1'b0; + end + else + begin + Sqfgh7 <= Lztfh7; + end + always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin + Yrfgh7 <= 1'b1; + end + else + begin + Yrfgh7 <= Fztfh7; + end + always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin + Etfgh7 <= 1'b0; + end + else + begin + Etfgh7 <= Zytfh7; + end + always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin + Kufgh7 <= 1'b1; + end + else + begin + Kufgh7 <= Tytfh7; + end + always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin + Qvfgh7 <= 1'b0; + end + else + begin + Qvfgh7 <= Nytfh7; + end + always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin + Wwfgh7 <= 1'b1; + end + else + begin + Wwfgh7 <= Hytfh7; + end + always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin + Cyfgh7 <= 1'b0; + end + else + begin + Cyfgh7 <= Vxtfh7; + end + always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin + Izfgh7 <= 1'b0; + end + else + begin + Izfgh7 <= Pxtfh7; + end + always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin + O0ggh7 <= 1'b0; + end + else + begin + O0ggh7 <= Jxtfh7; + end + always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin + U1ggh7 <= 1'b0; + end + else + begin + U1ggh7 <= Dxtfh7; + end + always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin + A3ggh7 <= 1'b0; + end + else + begin + A3ggh7 <= Xwtfh7; + end + always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin + G4ggh7 <= 1'b1; + end + else + begin + G4ggh7 <= Rwtfh7; + end + always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin + M5ggh7 <= 1'b1; + end + else + begin + M5ggh7 <= Lwtfh7; + end + always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin + S6ggh7 <= 1'b0; + end + else + begin + S6ggh7 <= Fwtfh7; + end + always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin + Y7ggh7 <= 1'b0; + end + else + begin + Y7ggh7 <= Zvtfh7; + end + always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin + E9ggh7 <= 1'b0; + end + else + begin + E9ggh7 <= Tvtfh7; + end + always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin + Kaggh7 <= 1'b0; + end + else + begin + Kaggh7 <= Nvtfh7; + end + always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin + Qbggh7 <= 1'b1; + end + else + begin + Qbggh7 <= Hvtfh7; + end + always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin + Wcggh7 <= 1'b0; + end + else + begin + Wcggh7 <= Bvtfh7; + end + always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin + Ceggh7 <= 1'b1; + end + else + begin + Ceggh7 <= Vutfh7; + end + always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin + Ifggh7 <= 1'b0; + end + else + begin + Ifggh7 <= Putfh7; + end + always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin + Ogggh7 <= 1'b0; + end + else + begin + Ogggh7 <= Dcufh7; + end + always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin + Phggh7 <= 1'b0; + end + else + begin + Phggh7 <= V0ufh7; + end + always @(posedge Puufh7) Uiggh7 <= Hsufh7; + always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin + Yjggh7 <= 1'b0; + end + else + begin + Yjggh7 <= Fbufh7; + end + always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin + Ykggh7 <= 1'b0; + end + else + begin + Ykggh7 <= V3ufh7; + end + always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin + Ylggh7 <= 1'b1; + end + else + begin + Ylggh7 <= Bytfh7; + end + always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin + Enggh7 <= 1'b0; + end + else + begin + Enggh7 <= Jiufh7; + end + always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin + Foggh7 <= 1'b0; + end + else + begin + Foggh7 <= K6rfh7; + end + always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin + Hpggh7 <= 1'b0; + end + else + begin + Hpggh7 <= C5rfh7; + end + always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin + Jqggh7 <= 1'b0; + end + else + begin + Jqggh7 <= L4rfh7; + end + always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin + Lrggh7 <= 1'b0; + end + else + begin + Lrggh7 <= U3rfh7; + end + always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin + Nsggh7 <= 1'b0; + end + else + begin + Nsggh7 <= D3rfh7; + end + always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin + Ptggh7 <= 1'b0; + end + else + begin + Ptggh7 <= M2rfh7; + end + always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin + Ruggh7 <= 1'b0; + end + else + begin + Ruggh7 <= V1rfh7; + end + always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin + Tvggh7 <= 1'b0; + end + else + begin + Tvggh7 <= E1rfh7; + end + always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin + Vwggh7 <= 1'b0; + end + else + begin + Vwggh7 <= N0rfh7; + end + always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin + Xxggh7 <= 1'b0; + end + else + begin + Xxggh7 <= Wzqfh7; + end + always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin + Azggh7 <= 1'b0; + end + else + begin + Azggh7 <= Fzqfh7; + end + always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin + D0hgh7 <= 1'b0; + end + else + begin + D0hgh7 <= Oyqfh7; + end + always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin + G1hgh7 <= 1'b0; + end + else + begin + G1hgh7 <= Xxqfh7; + end + always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin + J2hgh7 <= 1'b0; + end + else + begin + J2hgh7 <= Gxqfh7; + end + always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin + M3hgh7 <= 1'b0; + end + else + begin + M3hgh7 <= Pwqfh7; + end + always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin + P4hgh7 <= 1'b0; + end + else + begin + P4hgh7 <= Yvqfh7; + end + always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin + S5hgh7 <= 1'b0; + end + else + begin + S5hgh7 <= Hvqfh7; + end + always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin + V6hgh7 <= 1'b0; + end + else + begin + V6hgh7 <= Quqfh7; + end + always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin + Y7hgh7 <= 1'b0; + end + else + begin + Y7hgh7 <= Ztqfh7; + end + always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin + B9hgh7 <= 1'b0; + end + else + begin + B9hgh7 <= Itqfh7; + end + always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin + Eahgh7 <= 1'b0; + end + else + begin + Eahgh7 <= Rsqfh7; + end + always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin + Hbhgh7 <= 1'b0; + end + else + begin + Hbhgh7 <= Asqfh7; + end + always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin + Kchgh7 <= 1'b0; + end + else + begin + Kchgh7 <= Jrqfh7; + end + always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin + Ndhgh7 <= 1'b0; + end + else + begin + Ndhgh7 <= Sqqfh7; + end + always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin + Qehgh7 <= 1'b0; + end + else + begin + Qehgh7 <= Bqqfh7; + end + always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin + Tfhgh7 <= 1'b0; + end + else + begin + Tfhgh7 <= Kpqfh7; + end + always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin + Wghgh7 <= 1'b0; + end + else + begin + Wghgh7 <= Toqfh7; + end + always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin + Zhhgh7 <= 1'b0; + end + else + begin + Zhhgh7 <= Coqfh7; + end + always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin + Cjhgh7 <= 1'b0; + end + else + begin + Cjhgh7 <= Lnqfh7; + end + always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin + Fkhgh7 <= 1'b0; + end + else + begin + Fkhgh7 <= Umqfh7; + end + always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin + Ilhgh7 <= 1'b0; + end + else + begin + Ilhgh7 <= Dmqfh7; + end + always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin + Lmhgh7 <= 1'b0; + end + else + begin + Lmhgh7 <= Lbufh7; + end + always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin + Mnhgh7 <= 1'b0; + end + else + begin + Mnhgh7 <= H4ufh7; + end + always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin + Mohgh7 <= 1'b1; + end + else + begin + Mohgh7 <= N1ufh7; + end + always @(posedge Puufh7) Rphgh7 <= Fttfh7; + always @(posedge Puufh7) Vqhgh7 <= Lttfh7; + always @(posedge Puufh7) Zrhgh7 <= Rttfh7; + always @(posedge Puufh7) Dthgh7 <= Dutfh7; + always @(posedge Puufh7) Huhgh7 <= Zstfh7; + always @(posedge Puufh7) Lvhgh7 <= Xttfh7; + always @(posedge Puufh7) Pwhgh7 <= Jutfh7; +endmodule + +/* Design Summary + modules: 1 + udps: 0 + mod flatinsts: 0 + udp flatinsts: 0 + nodes: 3002 (0) + node widths: 3242 (0) + process: 281 (0) + gates: 0 (0) + contassigns: 2769 (0) + ports: 27 (0) + modinsts: 0 (0) + udpinsts: 0 (0) + portconnects: 0 (0) +*/ + +// END: VCS tokens +// Currnet Allocated Virtual Memory Size: 203.99 MB +// =================== +// DESIGN STATISTICS +// =================== +// +// No. of design lines (note: includes comments and blank lines) 7430 +// +// Static<!> Elaborated<@> Size(KB) +// ------ ---------- -------- +// No. of all modules (module+interface+package+program): 1 1 0 +// No. of module instances: 1 1 0 +// No. of all processes: 281 281 0 +// No. of all nodes (variable+net): 3002 3002 0 +// No. of constants 653 653 0 +// No. of scalar nets: 2705 2705 0 +// No. of vector nets: 16 16 0 +// No. of scalar regs/logics: 281 281 0 +// No. of always blocks: 281 281 0 +// No. of operators: 4486 4486 0 +// No. of concatenations: 8 8 0 +// No. of bit selects: 306 306 0 +// No. of part selects: 2 2 0 +// No. of non-blocking assignments: 546 546 0 +// No. of continuous assignments: 2769 2769 0 +// +// No. of top level modules/programs/packages/interfaces: 1 +// modules: 1 +// No. of module+udp ports: 27 +// +// Footnotes: +// --------- +// <!> No. of unique instances of a construct as it appears in the source. +// <@> No. of instances of a construct when the design is elaborated. +// K, M, B: Counted in thousands, millions and billions (if big numbers are present) +// +// <#> Multiple specify blocks in the SAME module are combined and counted +// as ONE block. diff --git a/IPLIB/ADPcontrol_v1_0/ADPcontrol_bas__mangled.v b/IPLIB/ADPcontrol_v1_0/ADPcontrol_bas__mangled.v new file mode 100755 index 0000000..20e0b88 --- /dev/null +++ b/IPLIB/ADPcontrol_v1_0/ADPcontrol_bas__mangled.v @@ -0,0 +1,4923 @@ +// +// A joint work commissioned on behalf of SoC Labs. +// +// Contributors +// +// David Flynn (d.w.flynn@soton.ac.uk) +// +// Obfuscated RTL +// +// Copyright (C) 2021-2, SoC Labs (www.soclabs.org) +// + +/* + instances: 0 + nodes: 1943 (0) + node widths: 2119 (0) + process: 173 (0) + contassign: 1818 (0) + ports: 27 (0) +*/ + +/* Source file "tokens.v", line 14 */ +module ADPcontrol(ahb_hclk, ahb_hresetn, com_rx_tready, com_rx_tdata, + com_rx_tvalid, com_tx_tvalid, com_tx_tdata, com_tx_tready, + stdio_rx_tready, stdio_rx_tdata, stdio_rx_tvalid, stdio_tx_tvalid, + stdio_tx_tdata, stdio_tx_tready, gpo8, gpi8, ahb_haddr, ahb_hburst, + ahb_hmastlock, ahb_hprot, ahb_hsize, ahb_htrans, ahb_hwdata, ahb_hwrite, + ahb_hrdata, ahb_hready, ahb_hresp); + + input [7:0] com_rx_tdata; + output [7:0] com_tx_tdata; + input [7:0] stdio_rx_tdata; + output [7:0] stdio_tx_tdata; + output [7:0] gpo8; + input [7:0] gpi8; + output [31:0] ahb_haddr; + output [2:0] ahb_hburst; + output [3:0] ahb_hprot; + output [2:0] ahb_hsize; + output [1:0] ahb_htrans; + output [31:0] ahb_hwdata; + input [31:0] ahb_hrdata; + input ahb_hclk; + input ahb_hresetn; + input com_rx_tvalid; + input com_tx_tready; + input stdio_rx_tvalid; + input stdio_tx_tready; + input ahb_hready; + input ahb_hresp; + output com_rx_tready; + output com_tx_tvalid; + output stdio_rx_tready; + output stdio_tx_tvalid; + output ahb_hmastlock; + output ahb_hwrite; + + wire Xzpfh7; + wire O0qfh7; + wire F1qfh7; + wire W1qfh7; + wire N2qfh7; + wire E3qfh7; + wire V3qfh7; + wire M4qfh7; + wire D5qfh7; + wire U5qfh7; + wire L6qfh7; + wire C7qfh7; + wire T7qfh7; + wire K8qfh7; + wire B9qfh7; + wire S9qfh7; + wire Jaqfh7; + wire Abqfh7; + wire Rbqfh7; + wire Icqfh7; + wire Zcqfh7; + wire Qdqfh7; + wire Heqfh7; + wire Yeqfh7; + wire Pfqfh7; + wire Ggqfh7; + wire Xgqfh7; + wire Ohqfh7; + wire Fiqfh7; + wire Wiqfh7; + wire Njqfh7; + wire Ekqfh7; + wire Vkqfh7; + wire Mlqfh7; + wire Dmqfh7; + wire Umqfh7; + wire Lnqfh7; + wire Coqfh7; + wire Toqfh7; + wire Kpqfh7; + wire Bqqfh7; + wire Sqqfh7; + wire Jrqfh7; + wire Asqfh7; + wire Rsqfh7; + wire Itqfh7; + wire Ztqfh7; + wire Quqfh7; + wire Hvqfh7; + wire Yvqfh7; + wire Pwqfh7; + wire Gxqfh7; + wire Xxqfh7; + wire Oyqfh7; + wire Fzqfh7; + wire Wzqfh7; + wire N0rfh7; + wire E1rfh7; + wire V1rfh7; + wire M2rfh7; + wire D3rfh7; + wire U3rfh7; + wire L4rfh7; + wire C5rfh7; + wire T5rfh7; + wire K6rfh7; + wire B7rfh7; + wire S7rfh7; + wire J8rfh7; + wire A9rfh7; + wire R9rfh7; + wire Iarfh7; + wire Zarfh7; + wire Qbrfh7; + wire Gcrfh7; + wire Wcrfh7; + wire Mdrfh7; + wire Cerfh7; + wire Serfh7; + wire Ifrfh7; + wire Yfrfh7; + wire Ogrfh7; + wire Ehrfh7; + wire Uhrfh7; + wire Kirfh7; + wire Ajrfh7; + wire Qjrfh7; + wire Gkrfh7; + wire Wkrfh7; + wire Mlrfh7; + wire Cmrfh7; + wire Smrfh7; + wire Inrfh7; + wire Ynrfh7; + wire Oorfh7; + wire Eprfh7; + wire Uprfh7; + wire Kqrfh7; + wire Arrfh7; + wire Qrrfh7; + wire Gsrfh7; + wire Wsrfh7; + wire Mtrfh7; + wire Curfh7; + wire Surfh7; + wire Ivrfh7; + wire Yvrfh7; + wire Wwrfh7; + wire Bxrfh7; + wire Gxrfh7; + wire Lxrfh7; + wire Qxrfh7; + wire Vxrfh7; + wire Ayrfh7; + wire Fyrfh7; + wire Kyrfh7; + wire Pyrfh7; + wire Uyrfh7; + wire Zyrfh7; + wire Ezrfh7; + wire Jzrfh7; + wire Ozrfh7; + wire Tzrfh7; + wire Yzrfh7; + wire D0sfh7; + wire I0sfh7; + wire N0sfh7; + wire S0sfh7; + wire X0sfh7; + wire C1sfh7; + wire H1sfh7; + wire M1sfh7; + wire R1sfh7; + wire W1sfh7; + wire B2sfh7; + wire G2sfh7; + wire L2sfh7; + wire Q2sfh7; + wire V2sfh7; + wire A3sfh7; + wire F3sfh7; + wire K3sfh7; + wire P3sfh7; + wire U3sfh7; + wire Z3sfh7; + wire E4sfh7; + wire J4sfh7; + wire O4sfh7; + wire T4sfh7; + wire Y4sfh7; + wire D5sfh7; + wire I5sfh7; + wire N5sfh7; + wire S5sfh7; + wire X5sfh7; + wire C6sfh7; + wire H6sfh7; + wire M6sfh7; + wire R6sfh7; + wire W6sfh7; + wire B7sfh7; + wire G7sfh7; + wire L7sfh7; + wire Q7sfh7; + wire V7sfh7; + wire A8sfh7; + wire F8sfh7; + wire K8sfh7; + wire P8sfh7; + wire U8sfh7; + wire Z8sfh7; + wire E9sfh7; + wire J9sfh7; + wire O9sfh7; + wire T9sfh7; + wire Y9sfh7; + wire Dasfh7; + wire Iasfh7; + wire Nasfh7; + wire Sasfh7; + wire Xasfh7; + wire Cbsfh7; + wire Hbsfh7; + wire Mbsfh7; + wire Rbsfh7; + wire Wbsfh7; + wire Bcsfh7; + wire Gcsfh7; + wire Lcsfh7; + wire Qcsfh7; + wire Vcsfh7; + wire Adsfh7; + wire Fdsfh7; + wire Kdsfh7; + wire Pdsfh7; + wire Udsfh7; + wire Zdsfh7; + wire Eesfh7; + wire Jesfh7; + wire Oesfh7; + wire Tesfh7; + wire Yesfh7; + wire Dfsfh7; + wire Ifsfh7; + wire Nfsfh7; + wire Sfsfh7; + wire Xfsfh7; + wire Cgsfh7; + wire Hgsfh7; + wire Mgsfh7; + wire Rgsfh7; + wire Wgsfh7; + wire Bhsfh7; + wire Ghsfh7; + wire Lhsfh7; + wire Qhsfh7; + wire Vhsfh7; + wire Aisfh7; + wire Fisfh7; + wire Kisfh7; + wire Pisfh7; + wire Uisfh7; + wire Zisfh7; + wire Ejsfh7; + wire Jjsfh7; + wire Ojsfh7; + wire Tjsfh7; + wire Yjsfh7; + wire Dksfh7; + wire Iksfh7; + wire Oksfh7; + wire Uksfh7; + wire Alsfh7; + wire Glsfh7; + wire Mlsfh7; + wire Slsfh7; + wire Ylsfh7; + wire Emsfh7; + wire Kmsfh7; + wire Qmsfh7; + wire Wmsfh7; + wire Cnsfh7; + wire Insfh7; + wire Onsfh7; + wire Unsfh7; + wire Aosfh7; + wire Gosfh7; + wire Mosfh7; + wire Sosfh7; + wire Yosfh7; + wire Epsfh7; + wire Kpsfh7; + wire Qpsfh7; + wire Wpsfh7; + wire Cqsfh7; + wire Iqsfh7; + wire Oqsfh7; + wire Uqsfh7; + wire Arsfh7; + wire Grsfh7; + wire Mrsfh7; + wire Srsfh7; + wire Yrsfh7; + wire Essfh7; + wire Kssfh7; + wire Qssfh7; + wire Wssfh7; + wire Ctsfh7; + wire Itsfh7; + wire Otsfh7; + wire Utsfh7; + wire Ausfh7; + wire Gusfh7; + wire Musfh7; + wire Susfh7; + wire Yusfh7; + wire Evsfh7; + wire Kvsfh7; + wire Qvsfh7; + wire Wvsfh7; + wire Cwsfh7; + wire Iwsfh7; + wire Owsfh7; + wire Uwsfh7; + wire Axsfh7; + wire Gxsfh7; + wire Mxsfh7; + wire Sxsfh7; + wire Yxsfh7; + wire Eysfh7; + wire Kysfh7; + wire Qysfh7; + wire Wysfh7; + wire Czsfh7; + wire Izsfh7; + wire Ozsfh7; + wire Uzsfh7; + wire A0tfh7; + wire G0tfh7; + wire M0tfh7; + wire S0tfh7; + wire Y0tfh7; + wire E1tfh7; + wire K1tfh7; + wire Q1tfh7; + wire W1tfh7; + wire C2tfh7; + wire I2tfh7; + wire O2tfh7; + wire U2tfh7; + wire A3tfh7; + wire G3tfh7; + wire M3tfh7; + wire S3tfh7; + wire Y3tfh7; + wire E4tfh7; + wire K4tfh7; + wire Q4tfh7; + wire W4tfh7; + wire C5tfh7; + wire I5tfh7; + wire O5tfh7; + wire U5tfh7; + wire A6tfh7; + wire G6tfh7; + wire M6tfh7; + wire S6tfh7; + wire Y6tfh7; + wire E7tfh7; + wire K7tfh7; + wire Q7tfh7; + wire W7tfh7; + wire C8tfh7; + wire I8tfh7; + wire O8tfh7; + wire U8tfh7; + wire A9tfh7; + wire G9tfh7; + wire M9tfh7; + wire S9tfh7; + wire Y9tfh7; + wire Eatfh7; + wire Katfh7; + wire Qatfh7; + wire Watfh7; + wire Cbtfh7; + wire Ibtfh7; + wire Obtfh7; + wire Ubtfh7; + wire Actfh7; + wire Gctfh7; + wire Mctfh7; + wire Sctfh7; + wire Yctfh7; + wire Edtfh7; + wire Kdtfh7; + wire Qdtfh7; + wire Wdtfh7; + wire Cetfh7; + wire Ietfh7; + wire Oetfh7; + wire Uetfh7; + wire Aftfh7; + wire Gftfh7; + wire Mftfh7; + wire Sftfh7; + wire Yftfh7; + wire Egtfh7; + wire Kgtfh7; + wire Qgtfh7; + wire Wgtfh7; + wire Chtfh7; + wire Ihtfh7; + wire Ohtfh7; + wire Uhtfh7; + wire Aitfh7; + wire Gitfh7; + wire Mitfh7; + wire Sitfh7; + wire Yitfh7; + wire Ejtfh7; + wire Kjtfh7; + wire Qjtfh7; + wire Wjtfh7; + wire Cktfh7; + wire Iktfh7; + wire Oktfh7; + wire Uktfh7; + wire Altfh7; + wire Gltfh7; + wire Mltfh7; + wire Sltfh7; + wire Yltfh7; + wire Emtfh7; + wire Kmtfh7; + wire Qmtfh7; + wire Wmtfh7; + wire Cntfh7; + wire Intfh7; + wire Ontfh7; + wire Untfh7; + wire Aotfh7; + wire Gotfh7; + wire Motfh7; + wire Sotfh7; + wire Yotfh7; + wire Eptfh7; + wire Kptfh7; + wire Qptfh7; + wire Wptfh7; + wire Cqtfh7; + wire Iqtfh7; + wire Oqtfh7; + wire Uqtfh7; + wire Artfh7; + wire Grtfh7; + wire Mrtfh7; + wire Srtfh7; + wire Yrtfh7; + wire Estfh7; + wire Kstfh7; + wire Qstfh7; + wire Wstfh7; + wire Cttfh7; + wire Ittfh7; + wire Ottfh7; + wire Uttfh7; + wire Autfh7; + wire Gutfh7; + wire Mutfh7; + wire Sutfh7; + wire Yutfh7; + wire Evtfh7; + wire Kvtfh7; + wire Qvtfh7; + wire Wvtfh7; + wire Cwtfh7; + wire Iwtfh7; + wire Owtfh7; + wire Uwtfh7; + wire Axtfh7; + wire Gxtfh7; + wire Mxtfh7; + wire Sxtfh7; + wire Yxtfh7; + wire Eytfh7; + wire Kytfh7; + wire Qytfh7; + wire Wytfh7; + wire Cztfh7; + wire Iztfh7; + wire Oztfh7; + wire Uztfh7; + wire A0ufh7; + wire G0ufh7; + wire M0ufh7; + wire S0ufh7; + wire Y0ufh7; + wire E1ufh7; + wire K1ufh7; + wire Q1ufh7; + wire W1ufh7; + wire C2ufh7; + wire I2ufh7; + wire O2ufh7; + wire U2ufh7; + wire A3ufh7; + wire G3ufh7; + wire M3ufh7; + wire S3ufh7; + wire Y3ufh7; + wire E4ufh7; + wire K4ufh7; + wire Q4ufh7; + wire W4ufh7; + wire C5ufh7; + wire I5ufh7; + wire O5ufh7; + wire U5ufh7; + wire A6ufh7; + wire G6ufh7; + wire M6ufh7; + wire S6ufh7; + wire Y6ufh7; + wire E7ufh7; + wire K7ufh7; + wire Q7ufh7; + wire W7ufh7; + wire C8ufh7; + wire I8ufh7; + wire O8ufh7; + wire U8ufh7; + wire A9ufh7; + wire G9ufh7; + wire M9ufh7; + wire S9ufh7; + wire Y9ufh7; + wire Eaufh7; + wire Kaufh7; + wire Qaufh7; + wire Waufh7; + wire Cbufh7; + wire Ibufh7; + wire Obufh7; + wire Ubufh7; + wire Acufh7; + wire Gcufh7; + wire Mcufh7; + wire Scufh7; + wire Ycufh7; + wire Edufh7; + wire Kdufh7; + wire Qdufh7; + wire Wdufh7; + wire Ceufh7; + wire Ieufh7; + wire Oeufh7; + wire Ueufh7; + wire Afufh7; + wire Gfufh7; + wire Mfufh7; + wire Sfufh7; + wire Yfufh7; + wire Egufh7; + wire Kgufh7; + wire Qgufh7; + wire Wgufh7; + wire Chufh7; + wire Ihufh7; + wire Ohufh7; + wire Uhufh7; + wire Aiufh7; + wire Giufh7; + wire Miufh7; + wire Siufh7; + wire Yiufh7; + wire Ejufh7; + wire Kjufh7; + wire Qjufh7; + wire Wjufh7; + wire Ckufh7; + wire Ikufh7; + wire Okufh7; + wire Ukufh7; + wire Alufh7; + wire Glufh7; + wire Mlufh7; + wire Slufh7; + wire Ylufh7; + wire Emufh7; + wire Kmufh7; + wire Qmufh7; + wire Wmufh7; + wire Cnufh7; + wire Inufh7; + wire Onufh7; + wire Unufh7; + wire Aoufh7; + wire Goufh7; + wire Moufh7; + wire Soufh7; + wire Youfh7; + wire Epufh7; + wire Kpufh7; + wire Qpufh7; + wire Wpufh7; + wire Cqufh7; + wire Iqufh7; + wire Oqufh7; + wire Uqufh7; + wire Arufh7; + wire Grufh7; + wire Mrufh7; + wire Srufh7; + wire Yrufh7; + wire Esufh7; + wire Ksufh7; + wire Qsufh7; + wire Wsufh7; + wire Ctufh7; + wire Itufh7; + wire Otufh7; + wire Utufh7; + wire Auufh7; + wire Guufh7; + wire Muufh7; + wire Suufh7; + wire Yuufh7; + wire Evufh7; + wire Kvufh7; + wire Qvufh7; + wire Wvufh7; + wire Cwufh7; + wire Iwufh7; + wire Owufh7; + wire Uwufh7; + wire Axufh7; + wire Gxufh7; + wire Mxufh7; + wire Sxufh7; + wire Yxufh7; + wire Eyufh7; + wire Kyufh7; + wire Qyufh7; + wire Wyufh7; + wire Czufh7; + wire Izufh7; + wire Ozufh7; + wire Uzufh7; + wire A0vfh7; + wire G0vfh7; + wire M0vfh7; + wire S0vfh7; + wire Y0vfh7; + wire E1vfh7; + wire K1vfh7; + wire Q1vfh7; + wire W1vfh7; + wire C2vfh7; + wire I2vfh7; + wire O2vfh7; + wire U2vfh7; + wire A3vfh7; + wire G3vfh7; + wire M3vfh7; + wire S3vfh7; + wire Y3vfh7; + wire E4vfh7; + wire K4vfh7; + wire Q4vfh7; + wire W4vfh7; + wire C5vfh7; + wire I5vfh7; + wire O5vfh7; + wire U5vfh7; + wire A6vfh7; + wire G6vfh7; + wire M6vfh7; + wire S6vfh7; + wire Y6vfh7; + wire E7vfh7; + wire K7vfh7; + wire Q7vfh7; + wire W7vfh7; + wire C8vfh7; + wire I8vfh7; + wire O8vfh7; + wire U8vfh7; + wire A9vfh7; + wire G9vfh7; + wire M9vfh7; + wire S9vfh7; + wire Y9vfh7; + wire Eavfh7; + wire Kavfh7; + wire Qavfh7; + wire Wavfh7; + wire Cbvfh7; + wire Ibvfh7; + wire Obvfh7; + wire Ubvfh7; + wire Acvfh7; + wire Gcvfh7; + wire Mcvfh7; + wire Scvfh7; + wire Ycvfh7; + wire Edvfh7; + wire Kdvfh7; + wire Qdvfh7; + wire Wdvfh7; + wire Cevfh7; + wire Ievfh7; + wire Oevfh7; + wire Uevfh7; + wire Afvfh7; + wire Gfvfh7; + wire Mfvfh7; + wire Sfvfh7; + wire Yfvfh7; + wire Egvfh7; + wire Kgvfh7; + wire Qgvfh7; + wire Wgvfh7; + wire Chvfh7; + wire Ihvfh7; + wire Ohvfh7; + wire Uhvfh7; + wire Aivfh7; + wire Givfh7; + wire Mivfh7; + wire Sivfh7; + wire Yivfh7; + wire Ejvfh7; + wire Kjvfh7; + wire Qjvfh7; + wire Wjvfh7; + wire Ckvfh7; + wire Ikvfh7; + wire Okvfh7; + wire Ukvfh7; + wire Alvfh7; + wire Glvfh7; + wire Mlvfh7; + wire Slvfh7; + wire Ylvfh7; + wire Emvfh7; + wire Kmvfh7; + wire Qmvfh7; + wire Wmvfh7; + wire Cnvfh7; + wire Invfh7; + wire Onvfh7; + wire Unvfh7; + wire Aovfh7; + wire Govfh7; + wire Movfh7; + wire Sovfh7; + wire Yovfh7; + wire Epvfh7; + wire Kpvfh7; + wire Qpvfh7; + wire Wpvfh7; + wire Cqvfh7; + wire Iqvfh7; + wire Oqvfh7; + wire Uqvfh7; + wire Arvfh7; + wire Grvfh7; + wire Mrvfh7; + wire Srvfh7; + wire Yrvfh7; + wire Esvfh7; + wire Ksvfh7; + wire Qsvfh7; + wire Wsvfh7; + wire Ctvfh7; + wire Itvfh7; + wire Otvfh7; + wire Utvfh7; + wire Auvfh7; + wire Guvfh7; + wire Muvfh7; + wire Suvfh7; + wire Yuvfh7; + wire Evvfh7; + wire Kvvfh7; + wire Qvvfh7; + wire Wvvfh7; + wire Cwvfh7; + wire Iwvfh7; + wire Owvfh7; + wire Uwvfh7; + wire Axvfh7; + wire Gxvfh7; + wire Mxvfh7; + wire Sxvfh7; + wire Yxvfh7; + wire Eyvfh7; + wire Kyvfh7; + wire Qyvfh7; + wire Wyvfh7; + wire Czvfh7; + wire Izvfh7; + wire Ozvfh7; + wire Uzvfh7; + wire A0wfh7; + wire G0wfh7; + wire M0wfh7; + wire S0wfh7; + wire Y0wfh7; + wire E1wfh7; + wire K1wfh7; + wire Q1wfh7; + wire W1wfh7; + wire C2wfh7; + wire I2wfh7; + wire O2wfh7; + wire U2wfh7; + wire A3wfh7; + wire G3wfh7; + wire M3wfh7; + wire S3wfh7; + wire Y3wfh7; + wire E4wfh7; + wire K4wfh7; + wire Q4wfh7; + wire W4wfh7; + wire C5wfh7; + wire I5wfh7; + wire O5wfh7; + wire U5wfh7; + wire A6wfh7; + wire G6wfh7; + wire M6wfh7; + wire S6wfh7; + wire Y6wfh7; + wire E7wfh7; + wire K7wfh7; + wire Q7wfh7; + wire W7wfh7; + wire C8wfh7; + wire I8wfh7; + wire O8wfh7; + wire U8wfh7; + wire A9wfh7; + wire G9wfh7; + wire M9wfh7; + wire S9wfh7; + wire Y9wfh7; + wire Eawfh7; + wire Kawfh7; + wire Qawfh7; + wire Wawfh7; + wire Cbwfh7; + wire Ibwfh7; + wire Obwfh7; + wire Ubwfh7; + wire Acwfh7; + wire Gcwfh7; + wire Mcwfh7; + wire Scwfh7; + wire Ycwfh7; + wire Edwfh7; + wire Kdwfh7; + wire Qdwfh7; + wire Wdwfh7; + wire Cewfh7; + wire Iewfh7; + wire Oewfh7; + wire Uewfh7; + wire Afwfh7; + wire Gfwfh7; + wire Mfwfh7; + wire Sfwfh7; + wire Yfwfh7; + wire Egwfh7; + wire Kgwfh7; + wire Qgwfh7; + wire Wgwfh7; + wire Chwfh7; + wire Ihwfh7; + wire Ohwfh7; + wire Uhwfh7; + wire Aiwfh7; + wire Giwfh7; + wire Miwfh7; + wire Siwfh7; + wire Yiwfh7; + wire Ejwfh7; + wire Kjwfh7; + wire Qjwfh7; + wire Wjwfh7; + wire Ckwfh7; + wire Ikwfh7; + wire Okwfh7; + wire Ukwfh7; + wire Alwfh7; + wire Glwfh7; + wire Mlwfh7; + wire Slwfh7; + wire Ylwfh7; + wire Emwfh7; + wire Kmwfh7; + wire Qmwfh7; + wire Wmwfh7; + wire Cnwfh7; + wire Inwfh7; + wire Onwfh7; + wire Unwfh7; + wire Aowfh7; + wire Gowfh7; + wire Mowfh7; + wire Sowfh7; + wire Yowfh7; + wire Epwfh7; + wire Kpwfh7; + wire Qpwfh7; + wire Wpwfh7; + wire Cqwfh7; + wire Iqwfh7; + wire Oqwfh7; + wire Uqwfh7; + wire Arwfh7; + wire Grwfh7; + wire Mrwfh7; + wire Srwfh7; + wire Yrwfh7; + wire Eswfh7; + wire Kswfh7; + wire Qswfh7; + wire Wswfh7; + wire Ctwfh7; + wire Itwfh7; + wire Otwfh7; + wire Utwfh7; + wire Auwfh7; + wire Guwfh7; + wire Muwfh7; + wire Suwfh7; + wire Yuwfh7; + wire Evwfh7; + wire Kvwfh7; + wire Qvwfh7; + wire Wvwfh7; + wire Cwwfh7; + wire Iwwfh7; + wire Owwfh7; + wire Uwwfh7; + wire Axwfh7; + wire Gxwfh7; + wire Mxwfh7; + wire Sxwfh7; + wire Yxwfh7; + wire Eywfh7; + wire Kywfh7; + wire Qywfh7; + wire Wywfh7; + wire Czwfh7; + wire Izwfh7; + wire Ozwfh7; + wire Uzwfh7; + wire A0xfh7; + wire G0xfh7; + wire M0xfh7; + wire S0xfh7; + wire Y0xfh7; + wire E1xfh7; + wire K1xfh7; + wire Q1xfh7; + wire W1xfh7; + wire C2xfh7; + wire I2xfh7; + wire O2xfh7; + wire U2xfh7; + wire A3xfh7; + wire G3xfh7; + wire M3xfh7; + wire S3xfh7; + wire Y3xfh7; + wire E4xfh7; + wire K4xfh7; + wire Q4xfh7; + wire W4xfh7; + wire C5xfh7; + wire I5xfh7; + wire O5xfh7; + wire U5xfh7; + wire A6xfh7; + wire G6xfh7; + wire M6xfh7; + wire S6xfh7; + wire Y6xfh7; + wire E7xfh7; + wire K7xfh7; + wire Q7xfh7; + wire W7xfh7; + wire C8xfh7; + wire I8xfh7; + wire O8xfh7; + wire U8xfh7; + wire A9xfh7; + wire G9xfh7; + wire M9xfh7; + wire S9xfh7; + wire Y9xfh7; + wire Eaxfh7; + wire Kaxfh7; + wire Qaxfh7; + wire Waxfh7; + wire Cbxfh7; + wire Ibxfh7; + wire Obxfh7; + wire Ubxfh7; + wire Acxfh7; + wire Gcxfh7; + wire Mcxfh7; + wire Scxfh7; + wire Ycxfh7; + wire Edxfh7; + wire Kdxfh7; + wire Qdxfh7; + wire Wdxfh7; + wire Cexfh7; + wire Iexfh7; + wire Oexfh7; + wire Uexfh7; + wire Afxfh7; + wire Gfxfh7; + wire Mfxfh7; + wire Sfxfh7; + wire Yfxfh7; + wire Egxfh7; + wire Kgxfh7; + wire Qgxfh7; + wire Wgxfh7; + wire Chxfh7; + wire Ihxfh7; + wire Ohxfh7; + wire Uhxfh7; + wire Aixfh7; + wire Gixfh7; + wire Mixfh7; + wire Sixfh7; + wire Yixfh7; + wire Ejxfh7; + wire Kjxfh7; + wire Qjxfh7; + wire Wjxfh7; + wire Ckxfh7; + wire Ikxfh7; + wire Okxfh7; + wire Ukxfh7; + wire Alxfh7; + wire Glxfh7; + wire Mlxfh7; + wire Slxfh7; + wire Ylxfh7; + wire Emxfh7; + wire Kmxfh7; + wire Qmxfh7; + wire Wmxfh7; + wire Cnxfh7; + wire Inxfh7; + wire Onxfh7; + wire Unxfh7; + wire Aoxfh7; + wire Goxfh7; + wire Moxfh7; + wire Soxfh7; + wire Yoxfh7; + wire Epxfh7; + wire Kpxfh7; + wire Qpxfh7; + wire Wpxfh7; + wire Cqxfh7; + wire Iqxfh7; + wire Oqxfh7; + wire Uqxfh7; + wire Arxfh7; + wire Grxfh7; + wire Mrxfh7; + wire Srxfh7; + wire Yrxfh7; + wire Esxfh7; + wire Ksxfh7; + wire Qsxfh7; + wire Wsxfh7; + wire Ctxfh7; + wire Itxfh7; + wire Otxfh7; + wire Utxfh7; + wire Auxfh7; + wire Guxfh7; + wire Muxfh7; + wire Suxfh7; + wire Yuxfh7; + wire Evxfh7; + wire Kvxfh7; + wire Qvxfh7; + wire Wvxfh7; + wire Cwxfh7; + wire Iwxfh7; + wire Owxfh7; + wire Uwxfh7; + wire Axxfh7; + wire Gxxfh7; + wire Mxxfh7; + wire Sxxfh7; + wire Yxxfh7; + wire Eyxfh7; + wire Kyxfh7; + wire Qyxfh7; + wire Wyxfh7; + wire Czxfh7; + wire Izxfh7; + wire Ozxfh7; + wire Uzxfh7; + wire A0yfh7; + wire G0yfh7; + wire M0yfh7; + wire S0yfh7; + wire Y0yfh7; + wire E1yfh7; + wire K1yfh7; + wire Q1yfh7; + wire W1yfh7; + wire C2yfh7; + wire I2yfh7; + wire O2yfh7; + wire U2yfh7; + wire A3yfh7; + wire G3yfh7; + wire M3yfh7; + wire S3yfh7; + wire Y3yfh7; + wire E4yfh7; + wire K4yfh7; + wire Q4yfh7; + wire W4yfh7; + wire C5yfh7; + wire I5yfh7; + wire O5yfh7; + wire U5yfh7; + wire A6yfh7; + wire G6yfh7; + wire M6yfh7; + wire S6yfh7; + wire Y6yfh7; + wire E7yfh7; + wire K7yfh7; + wire Q7yfh7; + wire W7yfh7; + wire C8yfh7; + wire I8yfh7; + wire O8yfh7; + wire U8yfh7; + wire A9yfh7; + wire G9yfh7; + wire M9yfh7; + wire S9yfh7; + wire Y9yfh7; + wire Eayfh7; + wire Kayfh7; + wire Qayfh7; + wire Wayfh7; + wire Cbyfh7; + wire Ibyfh7; + wire Obyfh7; + wire Ubyfh7; + wire Acyfh7; + wire Gcyfh7; + wire Mcyfh7; + wire Scyfh7; + wire Ycyfh7; + wire Edyfh7; + wire Kdyfh7; + wire Qdyfh7; + wire Wdyfh7; + wire Ceyfh7; + wire Ieyfh7; + wire Oeyfh7; + wire Ueyfh7; + wire Afyfh7; + wire Gfyfh7; + wire Mfyfh7; + wire Sfyfh7; + wire Yfyfh7; + wire Egyfh7; + wire Kgyfh7; + wire Qgyfh7; + wire Wgyfh7; + wire Chyfh7; + wire Ihyfh7; + wire Ohyfh7; + wire Uhyfh7; + wire Aiyfh7; + wire Giyfh7; + wire Miyfh7; + wire Siyfh7; + wire Yiyfh7; + wire Ejyfh7; + wire Kjyfh7; + wire Qjyfh7; + wire Wjyfh7; + wire Ckyfh7; + wire Ikyfh7; + wire Okyfh7; + wire Ukyfh7; + wire Alyfh7; + wire Glyfh7; + wire Mlyfh7; + wire Slyfh7; + wire Ylyfh7; + wire Emyfh7; + wire Kmyfh7; + wire Qmyfh7; + wire Wmyfh7; + wire Cnyfh7; + wire Inyfh7; + wire Onyfh7; + wire Unyfh7; + wire Aoyfh7; + wire Goyfh7; + wire Moyfh7; + wire Soyfh7; + wire Yoyfh7; + wire Epyfh7; + wire Kpyfh7; + wire Qpyfh7; + wire Wpyfh7; + wire Cqyfh7; + wire Iqyfh7; + wire Oqyfh7; + wire Uqyfh7; + wire Aryfh7; + wire Gryfh7; + wire Mryfh7; + wire Sryfh7; + wire Yryfh7; + wire Esyfh7; + wire Ksyfh7; + wire Qsyfh7; + wire Wsyfh7; + wire Ctyfh7; + wire Ityfh7; + wire Otyfh7; + wire Utyfh7; + wire Auyfh7; + wire Guyfh7; + wire Muyfh7; + wire Suyfh7; + wire Yuyfh7; + wire Evyfh7; + wire Kvyfh7; + wire Qvyfh7; + wire Wvyfh7; + wire Cwyfh7; + wire Iwyfh7; + wire Owyfh7; + wire Uwyfh7; + wire Axyfh7; + wire Gxyfh7; + wire Mxyfh7; + wire Sxyfh7; + wire Yxyfh7; + wire Eyyfh7; + wire Kyyfh7; + wire Qyyfh7; + wire Wyyfh7; + wire Czyfh7; + wire Izyfh7; + wire Ozyfh7; + wire Uzyfh7; + wire A0zfh7; + wire G0zfh7; + wire M0zfh7; + wire S0zfh7; + wire Y0zfh7; + wire E1zfh7; + wire K1zfh7; + wire Q1zfh7; + wire W1zfh7; + wire C2zfh7; + wire I2zfh7; + wire O2zfh7; + wire U2zfh7; + wire A3zfh7; + wire G3zfh7; + wire M3zfh7; + wire S3zfh7; + wire Y3zfh7; + wire E4zfh7; + wire K4zfh7; + wire Q4zfh7; + wire W4zfh7; + wire C5zfh7; + wire I5zfh7; + wire O5zfh7; + wire U5zfh7; + wire A6zfh7; + wire G6zfh7; + wire M6zfh7; + wire S6zfh7; + wire Y6zfh7; + wire E7zfh7; + wire K7zfh7; + wire Q7zfh7; + wire W7zfh7; + wire C8zfh7; + wire I8zfh7; + wire O8zfh7; + wire U8zfh7; + wire A9zfh7; + wire G9zfh7; + wire M9zfh7; + wire S9zfh7; + wire Y9zfh7; + wire Eazfh7; + wire Kazfh7; + wire Qazfh7; + wire Wazfh7; + wire Cbzfh7; + wire Ibzfh7; + wire Obzfh7; + wire Ubzfh7; + wire Aczfh7; + wire Gczfh7; + wire Mczfh7; + wire Sczfh7; + wire Yczfh7; + wire Edzfh7; + wire Kdzfh7; + wire Qdzfh7; + wire Wdzfh7; + wire Cezfh7; + wire Iezfh7; + wire Oezfh7; + wire Uezfh7; + wire Afzfh7; + wire Gfzfh7; + wire Mfzfh7; + wire Sfzfh7; + wire Yfzfh7; + wire Egzfh7; + wire Kgzfh7; + wire Qgzfh7; + wire Wgzfh7; + wire Chzfh7; + wire Ihzfh7; + wire Ohzfh7; + wire Uhzfh7; + wire Aizfh7; + wire Gizfh7; + wire Mizfh7; + wire Sizfh7; + wire Yizfh7; + wire Ejzfh7; + wire Kjzfh7; + wire Qjzfh7; + wire Wjzfh7; + wire Ckzfh7; + wire Ikzfh7; + wire Okzfh7; + wire Ukzfh7; + wire Alzfh7; + wire Glzfh7; + wire Mlzfh7; + wire Slzfh7; + wire Ylzfh7; + wire Emzfh7; + wire Kmzfh7; + wire Qmzfh7; + wire Wmzfh7; + wire Cnzfh7; + wire Inzfh7; + wire Onzfh7; + wire Unzfh7; + wire Aozfh7; + wire Gozfh7; + wire Mozfh7; + wire Sozfh7; + wire Yozfh7; + wire Epzfh7; + wire Kpzfh7; + wire Qpzfh7; + wire Wpzfh7; + wire Cqzfh7; + wire Iqzfh7; + wire Oqzfh7; + wire Uqzfh7; + wire Arzfh7; + wire Grzfh7; + wire Mrzfh7; + wire Srzfh7; + wire Yrzfh7; + wire Eszfh7; + wire Kszfh7; + wire Qszfh7; + wire Wszfh7; + wire Ctzfh7; + wire Itzfh7; + wire Otzfh7; + wire Utzfh7; + wire Auzfh7; + wire Guzfh7; + wire Muzfh7; + wire Suzfh7; + wire Yuzfh7; + wire Evzfh7; + wire Kvzfh7; + wire Qvzfh7; + wire Wvzfh7; + wire Cwzfh7; + wire Iwzfh7; + wire Owzfh7; + wire Uwzfh7; + wire Axzfh7; + wire Gxzfh7; + wire Mxzfh7; + wire Sxzfh7; + wire Yxzfh7; + wire Eyzfh7; + wire Kyzfh7; + wire Qyzfh7; + wire Wyzfh7; + wire Czzfh7; + wire Izzfh7; + wire Ozzfh7; + wire Uzzfh7; + wire A00gh7; + wire G00gh7; + wire M00gh7; + wire S00gh7; + wire Y00gh7; + wire E10gh7; + wire K10gh7; + wire Q10gh7; + wire W10gh7; + wire C20gh7; + wire I20gh7; + wire O20gh7; + wire U20gh7; + wire A30gh7; + wire G30gh7; + wire M30gh7; + wire S30gh7; + wire Y30gh7; + wire E40gh7; + wire K40gh7; + wire Q40gh7; + wire W40gh7; + wire C50gh7; + wire I50gh7; + wire O50gh7; + wire U50gh7; + wire A60gh7; + wire G60gh7; + wire M60gh7; + wire S60gh7; + wire Y60gh7; + wire E70gh7; + wire K70gh7; + wire Q70gh7; + wire W70gh7; + wire C80gh7; + wire I80gh7; + wire O80gh7; + wire U80gh7; + wire A90gh7; + wire G90gh7; + wire M90gh7; + wire S90gh7; + wire Y90gh7; + wire Ea0gh7; + wire Ka0gh7; + wire Qa0gh7; + wire Wa0gh7; + wire Cb0gh7; + wire Ib0gh7; + wire Ob0gh7; + wire Ub0gh7; + wire Ac0gh7; + wire Gc0gh7; + wire Mc0gh7; + wire Sc0gh7; + wire Yc0gh7; + wire Ed0gh7; + wire Kd0gh7; + wire Qd0gh7; + wire Wd0gh7; + wire Ce0gh7; + wire Ie0gh7; + wire Oe0gh7; + wire Ue0gh7; + wire Af0gh7; + wire Gf0gh7; + wire Mf0gh7; + wire Sf0gh7; + wire Yf0gh7; + wire Eg0gh7; + wire Kg0gh7; + wire Qg0gh7; + wire Wg0gh7; + wire Ch0gh7; + wire Ih0gh7; + wire Oh0gh7; + wire Uh0gh7; + wire Ai0gh7; + wire Gi0gh7; + wire Mi0gh7; + wire Si0gh7; + wire Yi0gh7; + wire Ej0gh7; + wire Kj0gh7; + wire Qj0gh7; + wire Wj0gh7; + wire Ck0gh7; + wire Ik0gh7; + wire Ok0gh7; + wire Uk0gh7; + wire Al0gh7; + wire Gl0gh7; + wire Ml0gh7; + wire Sl0gh7; + wire Yl0gh7; + wire Em0gh7; + wire Km0gh7; + wire Qm0gh7; + wire Wm0gh7; + wire Cn0gh7; + wire In0gh7; + wire On0gh7; + wire Un0gh7; + wire Ao0gh7; + wire Go0gh7; + wire Mo0gh7; + wire So0gh7; + wire Yo0gh7; + wire Ep0gh7; + wire Kp0gh7; + wire Qp0gh7; + wire Wp0gh7; + wire Cq0gh7; + wire Iq0gh7; + wire Oq0gh7; + wire Uq0gh7; + wire Ar0gh7; + wire Gr0gh7; + wire Mr0gh7; + wire Sr0gh7; + wire Yr0gh7; + wire Es0gh7; + wire Ks0gh7; + wire Qs0gh7; + wire Ws0gh7; + wire Ct0gh7; + wire It0gh7; + wire Ot0gh7; + wire Ut0gh7; + wire Au0gh7; + wire Gu0gh7; + wire Mu0gh7; + wire Su0gh7; + wire Yu0gh7; + wire Ev0gh7; + wire Kv0gh7; + wire Qv0gh7; + wire Wv0gh7; + wire Cw0gh7; + wire Iw0gh7; + wire Ow0gh7; + wire Uw0gh7; + wire Ax0gh7; + wire Gx0gh7; + wire Mx0gh7; + wire Sx0gh7; + wire Yx0gh7; + wire Ey0gh7; + wire Ky0gh7; + wire Qy0gh7; + wire Wy0gh7; + wire Cz0gh7; + wire Iz0gh7; + wire Oz0gh7; + wire Uz0gh7; + wire A01gh7; + wire G01gh7; + wire M01gh7; + wire S01gh7; + wire Y01gh7; + wire E11gh7; + wire K11gh7; + wire Q11gh7; + wire W11gh7; + wire C21gh7; + wire I21gh7; + wire O21gh7; + wire U21gh7; + wire A31gh7; + wire G31gh7; + wire M31gh7; + wire S31gh7; + wire Y31gh7; + wire E41gh7; + wire K41gh7; + wire Q41gh7; + wire W41gh7; + wire C51gh7; + wire I51gh7; + wire O51gh7; + wire U51gh7; + wire A61gh7; + wire G61gh7; + wire M61gh7; + wire S61gh7; + wire Y61gh7; + wire E71gh7; + wire K71gh7; + wire Q71gh7; + wire W71gh7; + wire C81gh7; + wire I81gh7; + wire O81gh7; + wire U81gh7; + wire A91gh7; + wire G91gh7; + wire M91gh7; + wire S91gh7; + wire Y91gh7; + wire Ea1gh7; + wire Ka1gh7; + wire Qa1gh7; + wire Wa1gh7; + wire Cb1gh7; + wire Ib1gh7; + wire Ob1gh7; + wire Ub1gh7; + wire Ac1gh7; + wire Gc1gh7; + wire Mc1gh7; + wire Sc1gh7; + wire Yc1gh7; + wire Ed1gh7; + wire Kd1gh7; + wire Qd1gh7; + wire Wd1gh7; + wire Ce1gh7; + wire Ie1gh7; + wire Oe1gh7; + wire Ue1gh7; + wire Af1gh7; + wire Gf1gh7; + wire Mf1gh7; + wire Sf1gh7; + wire Yf1gh7; + wire Eg1gh7; + wire Kg1gh7; + wire Qg1gh7; + wire Wg1gh7; + wire Ch1gh7; + wire Ih1gh7; + wire Oh1gh7; + wire Uh1gh7; + wire Ai1gh7; + wire Gi1gh7; + wire Mi1gh7; + wire Si1gh7; + wire Yi1gh7; + wire Ej1gh7; + wire Kj1gh7; + wire Qj1gh7; + wire Wj1gh7; + wire Ck1gh7; + wire Ik1gh7; + wire Ok1gh7; + wire Uk1gh7; + wire Al1gh7; + wire Gl1gh7; + wire Ml1gh7; + wire Sl1gh7; + wire Yl1gh7; + wire Em1gh7; + wire Km1gh7; + wire Qm1gh7; + wire Wm1gh7; + wire Cn1gh7; + wire In1gh7; + wire On1gh7; + wire Un1gh7; + wire Ao1gh7; + wire Go1gh7; + wire Mo1gh7; + wire So1gh7; + wire Yo1gh7; + wire Ep1gh7; + wire Kp1gh7; + wire Qp1gh7; + wire Wp1gh7; + wire Cq1gh7; + wire Iq1gh7; + wire Oq1gh7; + wire Uq1gh7; + wire Ar1gh7; + wire Gr1gh7; + wire Mr1gh7; + wire Sr1gh7; + wire Yr1gh7; + wire Es1gh7; + wire Ks1gh7; + wire Qs1gh7; + wire Ws1gh7; + wire Ct1gh7; + wire It1gh7; + wire Ot1gh7; + wire Ut1gh7; + wire Au1gh7; + wire Gu1gh7; + wire Mu1gh7; + wire Su1gh7; + wire Yu1gh7; + wire Ev1gh7; + wire Kv1gh7; + wire Qv1gh7; + wire Wv1gh7; + wire Cw1gh7; + wire Iw1gh7; + wire Ow1gh7; + wire Uw1gh7; + wire Ax1gh7; + wire Gx1gh7; + wire Mx1gh7; + wire Sx1gh7; + wire Yx1gh7; + wire Ey1gh7; + wire Ky1gh7; + wire Qy1gh7; + wire Wy1gh7; + wire Cz1gh7; + wire Iz1gh7; + wire Oz1gh7; + wire Uz1gh7; + wire A02gh7; + wire G02gh7; + wire M02gh7; + wire S02gh7; + wire Y02gh7; + wire E12gh7; + wire K12gh7; + wire Q12gh7; + wire W12gh7; + wire C22gh7; + wire I22gh7; + wire O22gh7; + wire U22gh7; + wire A32gh7; + wire G32gh7; + wire M32gh7; + wire S32gh7; + wire Y32gh7; + wire E42gh7; + wire K42gh7; + wire Q42gh7; + wire W42gh7; + wire C52gh7; + wire I52gh7; + wire O52gh7; + wire U52gh7; + wire A62gh7; + wire G62gh7; + wire M62gh7; + wire S62gh7; + wire Y62gh7; + wire E72gh7; + wire K72gh7; + wire Q72gh7; + wire W72gh7; + wire C82gh7; + wire I82gh7; + wire O82gh7; + wire U82gh7; + wire A92gh7; + wire G92gh7; + reg M92gh7; + reg Ma2gh7; + reg Pb2gh7; + reg Sc2gh7; + reg Ud2gh7; + reg Ue2gh7; + reg Xf2gh7; + reg Xg2gh7; + reg Ai2gh7; + reg Dj2gh7; + reg Fk2gh7; + reg Hl2gh7; + reg Jm2gh7; + reg Ln2gh7; + reg Oo2gh7; + reg Rp2gh7; + reg Rq2gh7; + reg Rr2gh7; + reg Rs2gh7; + reg Rt2gh7; + reg Ru2gh7; + reg Rv2gh7; + reg Rw2gh7; + reg Rx2gh7; + reg Uy2gh7; + reg Xz2gh7; + reg A13gh7; + reg D23gh7; + reg F33gh7; + reg H43gh7; + reg J53gh7; + reg L63gh7; + reg O73gh7; + reg R83gh7; + reg U93gh7; + reg Xa3gh7; + reg Ac3gh7; + reg Wc3gh7; + reg Zd3gh7; + reg Cf3gh7; + reg Fg3gh7; + reg Ih3gh7; + reg Li3gh7; + reg Oj3gh7; + reg Rk3gh7; + reg Tl3gh7; + reg Wm3gh7; + reg Zn3gh7; + reg Cp3gh7; + reg Dq3gh7; + reg Fr3gh7; + reg Is3gh7; + reg Lt3gh7; + reg Lu3gh7; + reg Pv3gh7; + reg Tw3gh7; + reg Ux3gh7; + reg Wy3gh7; + reg Yz3gh7; + reg A14gh7; + reg D24gh7; + reg G34gh7; + reg J44gh7; + reg M54gh7; + reg P64gh7; + reg R74gh7; + reg T84gh7; + reg W94gh7; + reg Ya4gh7; + reg Ac4gh7; + reg Cd4gh7; + reg Ee4gh7; + reg Ff4gh7; + reg Gg4gh7; + reg Ih4gh7; + reg Ji4gh7; + reg Nj4gh7; + reg Sk4gh7; + reg Ul4gh7; + reg Vm4gh7; + reg Xn4gh7; + reg Yo4gh7; + reg Bq4gh7; + reg Dr4gh7; + reg Gs4gh7; + reg It4gh7; + reg Lu4gh7; + reg Nv4gh7; + reg Qw4gh7; + reg Sx4gh7; + reg Vy4gh7; + reg Xz4gh7; + reg D15gh7; + reg J25gh7; + reg P35gh7; + reg U45gh7; + reg Y55gh7; + reg D75gh7; + reg F85gh7; + reg G95gh7; + reg Ia5gh7; + reg Jb5gh7; + reg Mc5gh7; + reg Od5gh7; + reg Re5gh7; + reg Tf5gh7; + reg Wg5gh7; + reg Yh5gh7; + reg Bj5gh7; + reg Dk5gh7; + reg Gl5gh7; + reg Im5gh7; + reg On5gh7; + reg Uo5gh7; + reg Aq5gh7; + reg Er5gh7; + reg Js5gh7; + reg Nt5gh7; + reg Su5gh7; + reg Uv5gh7; + reg Vw5gh7; + reg Xx5gh7; + reg Yy5gh7; + reg B06gh7; + reg D16gh7; + reg G26gh7; + reg I36gh7; + reg L46gh7; + reg N56gh7; + reg Q66gh7; + reg S76gh7; + reg V86gh7; + reg X96gh7; + reg Ab6gh7; + reg Cc6gh7; + reg Id6gh7; + reg Oe6gh7; + reg Uf6gh7; + reg Ah6gh7; + reg Ei6gh7; + reg Jj6gh7; + reg Nk6gh7; + reg Sl6gh7; + reg Ym6gh7; + reg Eo6gh7; + reg Kp6gh7; + reg Qq6gh7; + reg Vr6gh7; + reg Vs6gh7; + reg Bu6gh7; + reg Bv6gh7; + reg Hw6gh7; + reg Hx6gh7; + reg Ny6gh7; + reg Nz6gh7; + reg T07gh7; + reg T17gh7; + reg Z27gh7; + reg Z37gh7; + reg F57gh7; + reg J67gh7; + reg N77gh7; + reg N87gh7; + reg T97gh7; + reg Ya7gh7; + reg Cc7gh7; + reg Cd7gh7; + reg Ie7gh7; + reg Nf7gh7; + reg Rg7gh7; + reg Vh7gh7; + reg Zi7gh7; + reg Dk7gh7; + wire [33:0] Hl7gh7; + + assign ahb_hburst[2] = 1'b0; + assign ahb_hburst[1] = 1'b0; + assign ahb_hmastlock = 1'b0; + assign ahb_hprot[3] = 1'b0; + assign ahb_hprot[2] = 1'b0; + assign ahb_hsize[2] = 1'b0; + assign ahb_hsize[0] = 1'b0; + assign ahb_htrans[0] = 1'b0; + assign ahb_hburst[0] = 1'b1; + assign ahb_hprot[1] = 1'b1; + assign ahb_hprot[0] = 1'b1; + assign ahb_hsize[1] = 1'b1; + assign G92gh7 = (!M92gh7); + assign A92gh7 = (!Ma2gh7); + assign U82gh7 = (!Pb2gh7); + assign M62gh7 = (!Sc2gh7); + assign stdio_rx_tready = Ud2gh7; + assign O82gh7 = (!Ue2gh7); + assign com_tx_tvalid = Xf2gh7; + assign M32gh7 = (!Xg2gh7); + assign S32gh7 = (!Ai2gh7); + assign I22gh7 = (!Dj2gh7); + assign Y02gh7 = (!Fk2gh7); + assign I82gh7 = (!Hl2gh7); + assign M02gh7 = (!Jm2gh7); + assign A62gh7 = (!Ln2gh7); + assign A02gh7 = (!Oo2gh7); + assign com_rx_tready = Rp2gh7; + assign Iz1gh7 = (!Rq2gh7); + assign Uz1gh7 = (!Rr2gh7); + assign Oz1gh7 = (!Rs2gh7); + assign Cz1gh7 = (!Rt2gh7); + assign Wy1gh7 = (!Ru2gh7); + assign C82gh7 = (!Rv2gh7); + assign Qy1gh7 = (!Rw2gh7); + assign I52gh7 = (!Rx2gh7); + assign G02gh7 = (!Uy2gh7); + assign Y32gh7 = (!Xz2gh7); + assign Q42gh7 = (!A13gh7); + assign W12gh7 = (!D23gh7); + assign Q12gh7 = (!F33gh7); + assign E12gh7 = (!H43gh7); + assign U22gh7 = (!J53gh7); + assign G62gh7 = (!L63gh7); + assign C22gh7 = (!O73gh7); + assign G32gh7 = (!R83gh7); + assign A32gh7 = (!U93gh7); + assign K42gh7 = (!Xa3gh7); + assign W72gh7 = (!Ac3gh7); + assign S62gh7 = (!Wc3gh7); + assign W42gh7 = (!Zd3gh7); + assign O52gh7 = (!Cf3gh7); + assign U52gh7 = (!Fg3gh7); + assign E72gh7 = (!Ih3gh7); + assign Q72gh7 = Li3gh7; + assign S02gh7 = (!Oj3gh7); + assign K12gh7 = (!Rk3gh7); + assign C52gh7 = (!Tl3gh7); + assign Y62gh7 = (!Wm3gh7); + assign ahb_hwrite = Zn3gh7; + assign K72gh7 = (!Cp3gh7); + assign Yvrfh7 = Dq3gh7; + assign E42gh7 = (!Fr3gh7); + assign O22gh7 = (!Is3gh7); + assign stdio_tx_tvalid = Lt3gh7; + assign com_tx_tdata[7] = Lu3gh7; + assign com_tx_tdata[5] = Pv3gh7; + assign Yzrfh7 = (!Pv3gh7); + assign ahb_haddr[0] = Tw3gh7; + assign Gr1gh7 = (!Ux3gh7); + assign Es1gh7 = (!Wy3gh7); + assign Ct1gh7 = (!Yz3gh7); + assign Au1gh7 = (!A14gh7); + assign Ky1gh7 = (!D24gh7); + assign Mx1gh7 = (!G34gh7); + assign Iw1gh7 = (!J44gh7); + assign Ow1gh7 = (!M54gh7); + assign ahb_haddr[28] = P64gh7; + assign ahb_haddr[31] = R74gh7; + assign Ev1gh7 = (!T84gh7); + assign ahb_haddr[24] = W94gh7; + assign ahb_haddr[20] = Ya4gh7; + assign ahb_haddr[16] = Ac4gh7; + assign ahb_haddr[12] = Cd4gh7; + assign ahb_haddr[8] = Ee4gh7; + assign ahb_haddr[4] = Ff4gh7; + assign Mr1gh7 = (!Gg4gh7); + assign ahb_haddr[1] = Ih4gh7; + assign stdio_tx_tdata[1] = Ji4gh7; + assign ahb_hwdata[1] = Nj4gh7; + assign X0sfh7 = (!Nj4gh7); + assign Ks1gh7 = (!Sk4gh7); + assign ahb_haddr[5] = Ul4gh7; + assign It1gh7 = (!Vm4gh7); + assign ahb_haddr[9] = Xn4gh7; + assign Gu1gh7 = (!Yo4gh7); + assign ahb_haddr[13] = Bq4gh7; + assign Ey1gh7 = (!Dr4gh7); + assign ahb_haddr[17] = Gs4gh7; + assign Gx1gh7 = (!It4gh7); + assign ahb_haddr[21] = Lu4gh7; + assign Wv1gh7 = (!Nv4gh7); + assign ahb_haddr[25] = Qw4gh7; + assign Cw1gh7 = (!Sx4gh7); + assign ahb_haddr[29] = Vy4gh7; + assign ahb_hwdata[29] = Xz4gh7; + assign X5sfh7 = (!Xz4gh7); + assign ahb_hwdata[25] = D15gh7; + assign D5sfh7 = (!D15gh7); + assign ahb_hwdata[13] = J25gh7; + assign V2sfh7 = (!J25gh7); + assign ahb_hwdata[9] = P35gh7; + assign G2sfh7 = (!P35gh7); + assign stdio_tx_tdata[5] = U45gh7; + assign ahb_hwdata[5] = Y55gh7; + assign R1sfh7 = (!Y55gh7); + assign Yr1gh7 = (!D75gh7); + assign ahb_haddr[3] = F85gh7; + assign Ws1gh7 = (!G95gh7); + assign ahb_haddr[7] = Ia5gh7; + assign Ut1gh7 = (!Jb5gh7); + assign ahb_haddr[11] = Mc5gh7; + assign Su1gh7 = (!Od5gh7); + assign ahb_haddr[15] = Re5gh7; + assign Sx1gh7 = (!Tf5gh7); + assign ahb_haddr[19] = Wg5gh7; + assign Uw1gh7 = (!Yh5gh7); + assign ahb_haddr[23] = Bj5gh7; + assign Yu1gh7 = (!Dk5gh7); + assign ahb_haddr[27] = Gl5gh7; + assign ahb_hwdata[27] = Im5gh7; + assign N5sfh7 = (!Im5gh7); + assign ahb_hwdata[15] = On5gh7; + assign F3sfh7 = (!On5gh7); + assign ahb_hwdata[11] = Uo5gh7; + assign Q2sfh7 = (!Uo5gh7); + assign stdio_tx_tdata[7] = Aq5gh7; + assign ahb_hwdata[7] = Er5gh7; + assign W1sfh7 = (!Er5gh7); + assign stdio_tx_tdata[3] = Js5gh7; + assign ahb_hwdata[3] = Nt5gh7; + assign H1sfh7 = (!Nt5gh7); + assign Sr1gh7 = (!Su5gh7); + assign ahb_haddr[2] = Uv5gh7; + assign Qs1gh7 = (!Vw5gh7); + assign ahb_haddr[6] = Xx5gh7; + assign Ot1gh7 = (!Yy5gh7); + assign ahb_haddr[10] = B06gh7; + assign Mu1gh7 = (!D16gh7); + assign ahb_haddr[14] = G26gh7; + assign Yx1gh7 = (!I36gh7); + assign ahb_haddr[18] = L46gh7; + assign Ax1gh7 = (!N56gh7); + assign ahb_haddr[22] = Q66gh7; + assign Kv1gh7 = (!S76gh7); + assign ahb_haddr[26] = V86gh7; + assign Qv1gh7 = (!X96gh7); + assign ahb_haddr[30] = Ab6gh7; + assign ahb_hwdata[30] = Cc6gh7; + assign C6sfh7 = (!Cc6gh7); + assign ahb_hwdata[26] = Id6gh7; + assign I5sfh7 = (!Id6gh7); + assign ahb_hwdata[14] = Oe6gh7; + assign A3sfh7 = (!Oe6gh7); + assign ahb_hwdata[10] = Uf6gh7; + assign L2sfh7 = (!Uf6gh7); + assign stdio_tx_tdata[6] = Ah6gh7; + assign ahb_hwdata[6] = Ei6gh7; + assign Ozrfh7 = (!Ei6gh7); + assign stdio_tx_tdata[2] = Jj6gh7; + assign ahb_hwdata[2] = Nk6gh7; + assign C1sfh7 = (!Nk6gh7); + assign ahb_hwdata[31] = Sl6gh7; + assign H6sfh7 = (!Sl6gh7); + assign ahb_hwdata[28] = Ym6gh7; + assign S5sfh7 = (!Ym6gh7); + assign ahb_hwdata[24] = Eo6gh7; + assign Y4sfh7 = (!Eo6gh7); + assign ahb_hwdata[12] = Kp6gh7; + assign Kyrfh7 = (!Kp6gh7); + assign ahb_hwdata[8] = Qq6gh7; + assign B2sfh7 = (!Qq6gh7); + assign gpo8[6] = Vr6gh7; + assign Ayrfh7 = (!Vr6gh7); + assign ahb_hwdata[22] = Vs6gh7; + assign O4sfh7 = (!Vs6gh7); + assign gpo8[5] = Bu6gh7; + assign Vxrfh7 = (!Bu6gh7); + assign ahb_hwdata[21] = Bv6gh7; + assign J4sfh7 = (!Bv6gh7); + assign gpo8[3] = Hw6gh7; + assign Lxrfh7 = (!Hw6gh7); + assign ahb_hwdata[19] = Hx6gh7; + assign Z3sfh7 = (!Hx6gh7); + assign gpo8[2] = Ny6gh7; + assign Gxrfh7 = (!Ny6gh7); + assign ahb_hwdata[18] = Nz6gh7; + assign U3sfh7 = (!Nz6gh7); + assign gpo8[1] = T07gh7; + assign Bxrfh7 = (!T07gh7); + assign ahb_hwdata[17] = T17gh7; + assign P3sfh7 = (!T17gh7); + assign gpo8[7] = Z27gh7; + assign Fyrfh7 = (!Z27gh7); + assign ahb_hwdata[23] = Z37gh7; + assign T4sfh7 = (!Z37gh7); + assign com_tx_tdata[4] = F57gh7; + assign Tzrfh7 = (!F57gh7); + assign stdio_tx_tdata[4] = J67gh7; + assign gpo8[4] = N77gh7; + assign Qxrfh7 = (!N77gh7); + assign ahb_hwdata[20] = N87gh7; + assign E4sfh7 = (!N87gh7); + assign ahb_hwdata[4] = T97gh7; + assign M1sfh7 = (!T97gh7); + assign stdio_tx_tdata[0] = Ya7gh7; + assign gpo8[0] = Cc7gh7; + assign Wwrfh7 = (!Cc7gh7); + assign ahb_hwdata[16] = Cd7gh7; + assign K3sfh7 = (!Cd7gh7); + assign ahb_hwdata[0] = Ie7gh7; + assign Pyrfh7 = (!Ie7gh7); + assign com_tx_tdata[2] = Nf7gh7; + assign Ezrfh7 = (!Nf7gh7); + assign com_tx_tdata[0] = Rg7gh7; + assign Uyrfh7 = (!Rg7gh7); + assign com_tx_tdata[1] = Vh7gh7; + assign Zyrfh7 = (!Vh7gh7); + assign com_tx_tdata[3] = Zi7gh7; + assign Jzrfh7 = (!Zi7gh7); + assign com_tx_tdata[6] = Dk7gh7; + assign D0sfh7 = (!Dk7gh7); + assign Hl7gh7 = ({ahb_haddr, 1'b0} + {{1'b0, 1'b0, 1'b0, 1'b0, 1'b0, + 1'b0, 1'b0, 1'b0, 1'b0, 1'b0, 1'b0, 1'b0, 1'b0, 1'b0, 1'b0, + 1'b0, 1'b0, 1'b0, 1'b0, 1'b0, 1'b0, 1'b0, 1'b0, 1'b0, 1'b0, + 1'b0, 1'b0, 1'b0, 1'b0, Ivrfh7, 1'b0, 1'b0}, 1'b1}); + assign {Qbrfh7, Gcrfh7, Wcrfh7, Mdrfh7, Cerfh7, Serfh7, Ifrfh7, Yfrfh7, + Ogrfh7, Ehrfh7, Uhrfh7, Kirfh7, Ajrfh7, Qjrfh7, Gkrfh7, Wkrfh7, + Mlrfh7, Cmrfh7, Smrfh7, Inrfh7, Ynrfh7, Oorfh7, Eprfh7, Uprfh7, + Kqrfh7, Arrfh7, Qrrfh7, Gsrfh7, Wsrfh7, Mtrfh7, Curfh7, Surfh7} + = Hl7gh7[33:1]; + assign Wpsfh7 = (!Cqsfh7); + assign Cqsfh7 = (!ahb_hresetn); + assign Iqsfh7 = (!Oqsfh7); + assign Oqsfh7 = (!ahb_hclk); + assign Dksfh7 = (~(Uqsfh7 & Arsfh7)); + assign Uqsfh7 = (Mrsfh7 ? Iz1gh7 : Grsfh7); + assign Yjsfh7 = (!Srsfh7); + assign Srsfh7 = (Mrsfh7 ? Uz1gh7 : Yrsfh7); + assign Tjsfh7 = (Mrsfh7 ? Essfh7 : com_rx_tdata[6]); + assign Ojsfh7 = (~(Kssfh7 & Arsfh7)); + assign Kssfh7 = (Mrsfh7 ? Cz1gh7 : Qssfh7); + assign Jjsfh7 = (!Wssfh7); + assign Wssfh7 = (Mrsfh7 ? Wy1gh7 : Ctsfh7); + assign Ejsfh7 = (~(Itsfh7 & Arsfh7)); + assign Itsfh7 = (Mrsfh7 ? C82gh7 : Otsfh7); + assign Mrsfh7 = (!Utsfh7); + assign Zisfh7 = (~(Ausfh7 & Arsfh7)); + assign Arsfh7 = (~(Utsfh7 & Gusfh7)); + assign Ausfh7 = (Utsfh7 ? Musfh7 : Qy1gh7); + assign Uisfh7 = (S0sfh7 ? Susfh7 : ahb_hwrite); + assign Susfh7 = (~(Yusfh7 & Evsfh7)); + assign Evsfh7 = (~(Kvsfh7 & Qvsfh7)); + assign Pisfh7 = (~(Wvsfh7 & Cwsfh7)); + assign Cwsfh7 = (Iwsfh7 & Owsfh7); + assign Iwsfh7 = (~(Uwsfh7 & Axsfh7)); + assign Wvsfh7 = (Gxsfh7 & Mxsfh7); + assign Mxsfh7 = (~(Sxsfh7 & Yxsfh7)); + assign Gxsfh7 = (~(Eysfh7 & ahb_haddr[31])); + assign Kisfh7 = (~(Kysfh7 & Qysfh7)); + assign Qysfh7 = (Wysfh7 & Owsfh7); + assign Wysfh7 = (~(Czsfh7 & Izsfh7)); + assign Izsfh7 = (~(Ozsfh7 & Uzsfh7)); + assign Uzsfh7 = (~(A0tfh7 & G0tfh7)); + assign Ozsfh7 = (~(com_rx_tdata[0] & M0tfh7)); + assign M0tfh7 = (S0tfh7 | Y0tfh7); + assign Kysfh7 = (E1tfh7 & K1tfh7); + assign K1tfh7 = (~(Sxsfh7 & Q1tfh7)); + assign E1tfh7 = (~(Eysfh7 & ahb_haddr[0])); + assign Fisfh7 = (~(W1tfh7 & C2tfh7)); + assign C2tfh7 = (I2tfh7 & Owsfh7); + assign I2tfh7 = (~(Uwsfh7 & O2tfh7)); + assign W1tfh7 = (U2tfh7 & A3tfh7); + assign A3tfh7 = (~(Sxsfh7 & G3tfh7)); + assign U2tfh7 = (~(Eysfh7 & ahb_haddr[30])); + assign Aisfh7 = (~(M3tfh7 & S3tfh7)); + assign S3tfh7 = (Y3tfh7 & Owsfh7); + assign Y3tfh7 = (~(Uwsfh7 & E4tfh7)); + assign M3tfh7 = (K4tfh7 & Q4tfh7); + assign Q4tfh7 = (~(Sxsfh7 & W4tfh7)); + assign K4tfh7 = (~(Eysfh7 & ahb_haddr[29])); + assign Vhsfh7 = (~(C5tfh7 & I5tfh7)); + assign I5tfh7 = (O5tfh7 & Owsfh7); + assign O5tfh7 = (~(Uwsfh7 & U5tfh7)); + assign C5tfh7 = (A6tfh7 & G6tfh7); + assign G6tfh7 = (~(Sxsfh7 & M6tfh7)); + assign A6tfh7 = (~(Eysfh7 & ahb_haddr[28])); + assign Qhsfh7 = (~(S6tfh7 & Y6tfh7)); + assign Y6tfh7 = (E7tfh7 & Owsfh7); + assign E7tfh7 = (~(Uwsfh7 & K7tfh7)); + assign S6tfh7 = (Q7tfh7 & W7tfh7); + assign W7tfh7 = (~(Sxsfh7 & Axsfh7)); + assign Q7tfh7 = (~(Eysfh7 & ahb_haddr[27])); + assign Lhsfh7 = (~(C8tfh7 & I8tfh7)); + assign I8tfh7 = (O8tfh7 & Owsfh7); + assign O8tfh7 = (~(Uwsfh7 & U8tfh7)); + assign C8tfh7 = (A9tfh7 & G9tfh7); + assign G9tfh7 = (~(Sxsfh7 & O2tfh7)); + assign A9tfh7 = (~(Eysfh7 & ahb_haddr[26])); + assign Ghsfh7 = (~(M9tfh7 & S9tfh7)); + assign S9tfh7 = (Y9tfh7 & Owsfh7); + assign Y9tfh7 = (~(Uwsfh7 & Eatfh7)); + assign M9tfh7 = (Katfh7 & Qatfh7); + assign Qatfh7 = (~(Sxsfh7 & E4tfh7)); + assign Katfh7 = (~(Eysfh7 & ahb_haddr[25])); + assign Bhsfh7 = (~(Watfh7 & Cbtfh7)); + assign Cbtfh7 = (Ibtfh7 & Owsfh7); + assign Ibtfh7 = (~(Uwsfh7 & Obtfh7)); + assign Watfh7 = (Ubtfh7 & Actfh7); + assign Actfh7 = (~(Sxsfh7 & U5tfh7)); + assign Ubtfh7 = (~(Eysfh7 & ahb_haddr[24])); + assign Wgsfh7 = (~(Gctfh7 & Mctfh7)); + assign Mctfh7 = (Sctfh7 & Owsfh7); + assign Sctfh7 = (~(Uwsfh7 & Yctfh7)); + assign Gctfh7 = (Edtfh7 & Kdtfh7); + assign Kdtfh7 = (~(Sxsfh7 & K7tfh7)); + assign Edtfh7 = (~(Eysfh7 & ahb_haddr[23])); + assign Rgsfh7 = (~(Qdtfh7 & Wdtfh7)); + assign Wdtfh7 = (Cetfh7 & Owsfh7); + assign Cetfh7 = (~(Uwsfh7 & Ietfh7)); + assign Qdtfh7 = (Oetfh7 & Uetfh7); + assign Uetfh7 = (~(Sxsfh7 & U8tfh7)); + assign Oetfh7 = (~(Eysfh7 & ahb_haddr[22])); + assign Mgsfh7 = (~(Aftfh7 & Gftfh7)); + assign Gftfh7 = (Mftfh7 & Owsfh7); + assign Mftfh7 = (~(Uwsfh7 & Sftfh7)); + assign Aftfh7 = (Yftfh7 & Egtfh7); + assign Egtfh7 = (~(Sxsfh7 & Eatfh7)); + assign Yftfh7 = (~(Eysfh7 & ahb_haddr[21])); + assign Hgsfh7 = (~(Kgtfh7 & Qgtfh7)); + assign Qgtfh7 = (Wgtfh7 & Owsfh7); + assign Wgtfh7 = (~(Uwsfh7 & Chtfh7)); + assign Kgtfh7 = (Ihtfh7 & Ohtfh7); + assign Ohtfh7 = (~(Sxsfh7 & Obtfh7)); + assign Ihtfh7 = (~(Eysfh7 & ahb_haddr[20])); + assign Cgsfh7 = (~(Uhtfh7 & Aitfh7)); + assign Aitfh7 = (Gitfh7 & Owsfh7); + assign Gitfh7 = (~(Uwsfh7 & Mitfh7)); + assign Uhtfh7 = (Sitfh7 & Yitfh7); + assign Yitfh7 = (~(Sxsfh7 & Yctfh7)); + assign Sitfh7 = (~(Eysfh7 & ahb_haddr[19])); + assign Xfsfh7 = (~(Ejtfh7 & Kjtfh7)); + assign Kjtfh7 = (Qjtfh7 & Owsfh7); + assign Qjtfh7 = (~(Uwsfh7 & Wjtfh7)); + assign Ejtfh7 = (Cktfh7 & Iktfh7); + assign Iktfh7 = (~(Sxsfh7 & Ietfh7)); + assign Cktfh7 = (~(Eysfh7 & ahb_haddr[18])); + assign Sfsfh7 = (~(Oktfh7 & Uktfh7)); + assign Uktfh7 = (Altfh7 & Owsfh7); + assign Altfh7 = (~(Uwsfh7 & Gltfh7)); + assign Oktfh7 = (Mltfh7 & Sltfh7); + assign Sltfh7 = (~(Sxsfh7 & Sftfh7)); + assign Mltfh7 = (~(Eysfh7 & ahb_haddr[17])); + assign Nfsfh7 = (~(Yltfh7 & Emtfh7)); + assign Emtfh7 = (Kmtfh7 & Owsfh7); + assign Kmtfh7 = (~(Uwsfh7 & Qmtfh7)); + assign Yltfh7 = (Wmtfh7 & Cntfh7); + assign Cntfh7 = (~(Sxsfh7 & Chtfh7)); + assign Wmtfh7 = (~(Eysfh7 & ahb_haddr[16])); + assign Ifsfh7 = (~(Intfh7 & Ontfh7)); + assign Ontfh7 = (Untfh7 & Owsfh7); + assign Untfh7 = (~(Uwsfh7 & Aotfh7)); + assign Intfh7 = (Gotfh7 & Motfh7); + assign Motfh7 = (~(Sxsfh7 & Mitfh7)); + assign Gotfh7 = (~(Eysfh7 & ahb_haddr[15])); + assign Dfsfh7 = (~(Sotfh7 & Yotfh7)); + assign Yotfh7 = (Eptfh7 & Owsfh7); + assign Eptfh7 = (~(Uwsfh7 & Kptfh7)); + assign Sotfh7 = (Qptfh7 & Wptfh7); + assign Wptfh7 = (~(Sxsfh7 & Wjtfh7)); + assign Qptfh7 = (~(Eysfh7 & ahb_haddr[14])); + assign Yesfh7 = (~(Cqtfh7 & Iqtfh7)); + assign Iqtfh7 = (Oqtfh7 & Owsfh7); + assign Oqtfh7 = (~(Uwsfh7 & Uqtfh7)); + assign Cqtfh7 = (Artfh7 & Grtfh7); + assign Grtfh7 = (~(Sxsfh7 & Gltfh7)); + assign Artfh7 = (~(Eysfh7 & ahb_haddr[13])); + assign Tesfh7 = (~(Mrtfh7 & Srtfh7)); + assign Srtfh7 = (Yrtfh7 & Owsfh7); + assign Yrtfh7 = (~(Uwsfh7 & Estfh7)); + assign Mrtfh7 = (Kstfh7 & Qstfh7); + assign Qstfh7 = (~(Sxsfh7 & Qmtfh7)); + assign Kstfh7 = (~(Eysfh7 & ahb_haddr[12])); + assign Oesfh7 = (~(Wstfh7 & Cttfh7)); + assign Cttfh7 = (Ittfh7 & Owsfh7); + assign Ittfh7 = (~(Uwsfh7 & Ottfh7)); + assign Wstfh7 = (Uttfh7 & Autfh7); + assign Autfh7 = (~(Sxsfh7 & Aotfh7)); + assign Uttfh7 = (~(Eysfh7 & ahb_haddr[11])); + assign Jesfh7 = (~(Gutfh7 & Mutfh7)); + assign Mutfh7 = (Sutfh7 & Owsfh7); + assign Sutfh7 = (~(Uwsfh7 & Yutfh7)); + assign Gutfh7 = (Evtfh7 & Kvtfh7); + assign Kvtfh7 = (~(Sxsfh7 & Kptfh7)); + assign Evtfh7 = (~(Eysfh7 & ahb_haddr[10])); + assign Eesfh7 = (~(Qvtfh7 & Wvtfh7)); + assign Wvtfh7 = (Cwtfh7 & Owsfh7); + assign Cwtfh7 = (~(Uwsfh7 & Iwtfh7)); + assign Qvtfh7 = (Owtfh7 & Uwtfh7); + assign Uwtfh7 = (~(Sxsfh7 & Uqtfh7)); + assign Owtfh7 = (~(Eysfh7 & ahb_haddr[9])); + assign Zdsfh7 = (~(Axtfh7 & Gxtfh7)); + assign Gxtfh7 = (Mxtfh7 & Owsfh7); + assign Mxtfh7 = (~(Uwsfh7 & Sxtfh7)); + assign Axtfh7 = (Yxtfh7 & Eytfh7); + assign Eytfh7 = (~(Sxsfh7 & Estfh7)); + assign Yxtfh7 = (~(Eysfh7 & ahb_haddr[8])); + assign Udsfh7 = (~(Kytfh7 & Qytfh7)); + assign Qytfh7 = (Wytfh7 & Owsfh7); + assign Wytfh7 = (~(Uwsfh7 & Cztfh7)); + assign Kytfh7 = (Iztfh7 & Oztfh7); + assign Oztfh7 = (~(Sxsfh7 & Ottfh7)); + assign Iztfh7 = (~(Eysfh7 & ahb_haddr[7])); + assign Pdsfh7 = (~(Uztfh7 & A0ufh7)); + assign A0ufh7 = (G0ufh7 & Owsfh7); + assign G0ufh7 = (~(Uwsfh7 & M0ufh7)); + assign Uztfh7 = (S0ufh7 & Y0ufh7); + assign Y0ufh7 = (~(Sxsfh7 & Yutfh7)); + assign S0ufh7 = (~(Eysfh7 & ahb_haddr[6])); + assign Kdsfh7 = (~(E1ufh7 & K1ufh7)); + assign K1ufh7 = (Q1ufh7 & Owsfh7); + assign Q1ufh7 = (~(Uwsfh7 & W1ufh7)); + assign E1ufh7 = (C2ufh7 & I2ufh7); + assign I2ufh7 = (~(Sxsfh7 & Iwtfh7)); + assign C2ufh7 = (~(Eysfh7 & ahb_haddr[5])); + assign Fdsfh7 = (~(O2ufh7 & U2ufh7)); + assign U2ufh7 = (A3ufh7 & Owsfh7); + assign A3ufh7 = (~(Uwsfh7 & Q1tfh7)); + assign Uwsfh7 = (Czsfh7 & G3ufh7); + assign G3ufh7 = (M3ufh7 | S0tfh7); + assign O2ufh7 = (S3ufh7 & Y3ufh7); + assign Y3ufh7 = (~(Sxsfh7 & Sxtfh7)); + assign S3ufh7 = (~(Eysfh7 & ahb_haddr[4])); + assign Adsfh7 = (~(E4ufh7 & K4ufh7)); + assign K4ufh7 = (Q4ufh7 & Owsfh7); + assign Q4ufh7 = (~(Czsfh7 & M3ufh7)); + assign M3ufh7 = (W4ufh7 | C5ufh7); + assign C5ufh7 = (com_rx_tdata[2] ? A0tfh7 : I5ufh7); + assign I5ufh7 = (O5ufh7 & com_rx_tdata[1]); + assign W4ufh7 = (U5ufh7 | Y0tfh7); + assign Y0tfh7 = (A6ufh7 & G6ufh7); + assign A6ufh7 = (M6ufh7 & com_rx_tdata[3]); + assign E4ufh7 = (S6ufh7 & Y6ufh7); + assign Y6ufh7 = (~(Sxsfh7 & Cztfh7)); + assign S6ufh7 = (~(Eysfh7 & ahb_haddr[3])); + assign Vcsfh7 = (~(E7ufh7 & K7ufh7)); + assign K7ufh7 = (Q7ufh7 & Owsfh7); + assign Q7ufh7 = (~(Czsfh7 & W7ufh7)); + assign W7ufh7 = (~(C8ufh7 & I8ufh7)); + assign C8ufh7 = (Otsfh7 ? U8ufh7 : O8ufh7); + assign U8ufh7 = (~(A9ufh7 & O5ufh7)); + assign E7ufh7 = (G9ufh7 & M9ufh7); + assign M9ufh7 = (~(Sxsfh7 & M0ufh7)); + assign G9ufh7 = (~(Eysfh7 & ahb_haddr[2])); + assign Qcsfh7 = (~(S9ufh7 & Y9ufh7)); + assign Y9ufh7 = (Eaufh7 & Owsfh7); + assign Owsfh7 = (~(Kaufh7 & Qaufh7)); + assign Eaufh7 = (~(Czsfh7 & Waufh7)); + assign Waufh7 = (U5ufh7 | Cbufh7); + assign Cbufh7 = (~(Musfh7 | O8ufh7)); + assign O8ufh7 = (~(S0tfh7 | A0tfh7)); + assign A0tfh7 = (O5ufh7 & Grsfh7); + assign S0tfh7 = (G6ufh7 & Ctsfh7); + assign G6ufh7 = (Ibufh7 & com_rx_tdata[4]); + assign Ibufh7 = (~(Obufh7 | com_rx_tdata[6])); + assign U5ufh7 = (~(I8ufh7 & Ubufh7)); + assign Ubufh7 = (~(Acufh7 & O5ufh7)); + assign Acufh7 = (M6ufh7 & com_rx_tdata[0]); + assign I8ufh7 = (~(Gcufh7 & Mcufh7)); + assign Mcufh7 = (com_rx_tdata[0] & Musfh7); + assign Gcufh7 = (O5ufh7 & com_rx_tdata[2]); + assign O5ufh7 = (Scufh7 & com_rx_tdata[6]); + assign Scufh7 = (Ctsfh7 & Qssfh7); + assign S9ufh7 = (Ycufh7 & Edufh7); + assign Edufh7 = (~(Sxsfh7 & W1ufh7)); + assign Sxsfh7 = (~(Kdufh7 & Qdufh7)); + assign Qdufh7 = (~(Wdufh7 & com_rx_tdata[7])); + assign Kdufh7 = (Ceufh7 & Qaufh7); + assign Ceufh7 = (~(Czsfh7 & Ieufh7)); + assign Ieufh7 = (~(Oeufh7 & Ueufh7)); + assign Ueufh7 = (com_rx_tdata[6] ? Gfufh7 : Afufh7); + assign Gfufh7 = (Ctsfh7 ? Qssfh7 : Grsfh7); + assign Afufh7 = (~(Mfufh7 & Obufh7)); + assign Mfufh7 = (~(com_rx_tdata[0] & Qssfh7)); + assign Oeufh7 = (Sfufh7 & Yfufh7); + assign Yfufh7 = (~(Egufh7 & Qssfh7)); + assign Egufh7 = (~(Kgufh7 & Qgufh7)); + assign Qgufh7 = (com_rx_tdata[6] ? Chufh7 : Wgufh7); + assign Chufh7 = (~(M6ufh7 & Grsfh7)); + assign Wgufh7 = (~(G0tfh7 | Ihufh7)); + assign Kgufh7 = (Ohufh7 & Uhufh7); + assign Uhufh7 = (~(A9ufh7 & com_rx_tdata[2])); + assign Ohufh7 = (~(com_rx_tdata[5] & com_rx_tdata[3])); + assign Sfufh7 = (~(com_rx_tdata[3] & G0tfh7)); + assign G0tfh7 = (!M6ufh7); + assign Czsfh7 = (Aiufh7 & Wdufh7); + assign Aiufh7 = (Qaufh7 & Yrsfh7); + assign Yrsfh7 = (!com_rx_tdata[7]); + assign Ycufh7 = (~(Eysfh7 & ahb_haddr[1])); + assign Eysfh7 = (Kvsfh7 & Qaufh7); + assign Qaufh7 = (~(Giufh7 & Miufh7)); + assign Miufh7 = (~(Wdufh7 & Siufh7)); + assign Giufh7 = (Yiufh7 & Ejufh7); + assign Ejufh7 = (Kjufh7 | Qjufh7); + assign Lcsfh7 = (~(Wjufh7 & Ckufh7)); + assign Ckufh7 = (Ikufh7 | Fyrfh7); + assign Ikufh7 = (Okufh7 & Ukufh7); + assign Ukufh7 = (~(Ws1gh7 & It1gh7)); + assign Wjufh7 = (~(Alufh7 & Ottfh7)); + assign Gcsfh7 = (~(Glufh7 & Mlufh7)); + assign Mlufh7 = (Slufh7 | Wwrfh7); + assign Slufh7 = (Okufh7 & Ylufh7); + assign Ylufh7 = (~(Gr1gh7 & It1gh7)); + assign Glufh7 = (~(Alufh7 & Q1tfh7)); + assign Bcsfh7 = (~(Emufh7 & Kmufh7)); + assign Kmufh7 = (Qmufh7 | Bxrfh7); + assign Qmufh7 = (Okufh7 & Wmufh7); + assign Wmufh7 = (~(Mr1gh7 & It1gh7)); + assign Emufh7 = (~(Alufh7 & W1ufh7)); + assign Wbsfh7 = (~(Cnufh7 & Inufh7)); + assign Inufh7 = (Onufh7 | Gxrfh7); + assign Onufh7 = (Okufh7 & Unufh7); + assign Unufh7 = (~(Sr1gh7 & It1gh7)); + assign Cnufh7 = (~(Alufh7 & M0ufh7)); + assign Rbsfh7 = (~(Aoufh7 & Goufh7)); + assign Goufh7 = (Moufh7 | Lxrfh7); + assign Moufh7 = (Okufh7 & Soufh7); + assign Soufh7 = (~(Yr1gh7 & It1gh7)); + assign Aoufh7 = (~(Alufh7 & Cztfh7)); + assign Mbsfh7 = (~(Youfh7 & Epufh7)); + assign Epufh7 = (Kpufh7 | Qxrfh7); + assign Kpufh7 = (Okufh7 & Qpufh7); + assign Qpufh7 = (~(Es1gh7 & It1gh7)); + assign Youfh7 = (~(Alufh7 & Sxtfh7)); + assign Hbsfh7 = (~(Wpufh7 & Cqufh7)); + assign Cqufh7 = (Iqufh7 | Vxrfh7); + assign Iqufh7 = (Okufh7 & Oqufh7); + assign Oqufh7 = (~(Ks1gh7 & It1gh7)); + assign Wpufh7 = (~(Alufh7 & Iwtfh7)); + assign Cbsfh7 = (~(Uqufh7 & Arufh7)); + assign Arufh7 = (Grufh7 | Ayrfh7); + assign Grufh7 = (Okufh7 & Mrufh7); + assign Mrufh7 = (~(Qs1gh7 & It1gh7)); + assign Okufh7 = (~(Srufh7 | Ct1gh7)); + assign Uqufh7 = (~(Alufh7 & Yutfh7)); + assign Alufh7 = (~(Srufh7 | It1gh7)); + assign Srufh7 = (~(Yrufh7 & Esufh7)); + assign Esufh7 = (Ksufh7 & Qsufh7); + assign Qsufh7 = (Wsufh7 & Ctufh7); + assign Ctufh7 = (Itufh7 & Ky1gh7); + assign Itufh7 = (Wpsfh7 & Hvqfh7); + assign Wsufh7 = (Otufh7 & Sx1gh7); + assign Otufh7 = (Yx1gh7 & Ey1gh7); + assign Ksufh7 = (Utufh7 & Auufh7); + assign Auufh7 = (Guufh7 & Ax1gh7); + assign Guufh7 = (Gx1gh7 & Mx1gh7); + assign Utufh7 = (Muufh7 & Iw1gh7); + assign Muufh7 = (Ow1gh7 & Uw1gh7); + assign Yrufh7 = (Suufh7 & Yuufh7); + assign Yuufh7 = (Evufh7 & Kvufh7); + assign Kvufh7 = (Qvufh7 & Qv1gh7); + assign Qvufh7 = (Wv1gh7 & Cw1gh7); + assign Evufh7 = (Wvufh7 & Yu1gh7); + assign Wvufh7 = (Ev1gh7 & Kv1gh7); + assign Suufh7 = (Cwufh7 & Iwufh7); + assign Iwufh7 = (Owufh7 & Gu1gh7); + assign Owufh7 = (Mu1gh7 & Su1gh7); + assign Cwufh7 = (Uwufh7 & Ot1gh7); + assign Uwufh7 = (Ut1gh7 & Au1gh7); + assign Xasfh7 = (~(Axufh7 & Gxufh7)); + assign Gxufh7 = (Mxufh7 & Sxufh7); + assign Sxufh7 = (~(Yxufh7 & Chtfh7)); + assign Mxufh7 = (~(ahb_hrdata[16] & Eyufh7)); + assign Axufh7 = (Kyufh7 & Qyufh7); + assign Qyufh7 = (Wyufh7 | K3sfh7); + assign Kyufh7 = (Czufh7 | Wwrfh7); + assign Sasfh7 = (~(Izufh7 & Ozufh7)); + assign Ozufh7 = (Uzufh7 & A0vfh7); + assign A0vfh7 = (~(Yxufh7 & Sftfh7)); + assign Uzufh7 = (~(ahb_hrdata[17] & Eyufh7)); + assign Izufh7 = (G0vfh7 & M0vfh7); + assign M0vfh7 = (~(S0vfh7 & Y0vfh7)); + assign G0vfh7 = (Czufh7 | Bxrfh7); + assign Nasfh7 = (~(E1vfh7 & K1vfh7)); + assign K1vfh7 = (Q1vfh7 & W1vfh7); + assign W1vfh7 = (~(Yxufh7 & Ietfh7)); + assign Q1vfh7 = (~(ahb_hrdata[18] & Eyufh7)); + assign E1vfh7 = (C2vfh7 & I2vfh7); + assign I2vfh7 = (~(S0vfh7 & O2vfh7)); + assign C2vfh7 = (Czufh7 | Gxrfh7); + assign Iasfh7 = (~(U2vfh7 & A3vfh7)); + assign A3vfh7 = (G3vfh7 & M3vfh7); + assign M3vfh7 = (~(Yxufh7 & Yctfh7)); + assign G3vfh7 = (~(ahb_hrdata[19] & Eyufh7)); + assign U2vfh7 = (S3vfh7 & Y3vfh7); + assign Y3vfh7 = (~(S0vfh7 & E4vfh7)); + assign S3vfh7 = (Czufh7 | Lxrfh7); + assign Dasfh7 = (~(K4vfh7 & Q4vfh7)); + assign Q4vfh7 = (W4vfh7 & C5vfh7); + assign C5vfh7 = (~(Yxufh7 & Obtfh7)); + assign W4vfh7 = (~(ahb_hrdata[20] & Eyufh7)); + assign K4vfh7 = (I5vfh7 & O5vfh7); + assign O5vfh7 = (Wyufh7 | E4sfh7); + assign I5vfh7 = (Czufh7 | Qxrfh7); + assign Y9sfh7 = (~(U5vfh7 & A6vfh7)); + assign A6vfh7 = (G6vfh7 & M6vfh7); + assign M6vfh7 = (~(Yxufh7 & Eatfh7)); + assign G6vfh7 = (~(ahb_hrdata[21] & Eyufh7)); + assign U5vfh7 = (S6vfh7 & Y6vfh7); + assign Y6vfh7 = (~(S0vfh7 & E7vfh7)); + assign S6vfh7 = (Czufh7 | Vxrfh7); + assign T9sfh7 = (~(K7vfh7 & Q7vfh7)); + assign Q7vfh7 = (W7vfh7 & C8vfh7); + assign C8vfh7 = (~(Yxufh7 & U8tfh7)); + assign W7vfh7 = (~(ahb_hrdata[22] & Eyufh7)); + assign K7vfh7 = (I8vfh7 & O8vfh7); + assign O8vfh7 = (~(S0vfh7 & U8vfh7)); + assign I8vfh7 = (Czufh7 | Ayrfh7); + assign O9sfh7 = (~(A9vfh7 & G9vfh7)); + assign G9vfh7 = (M9vfh7 & S9vfh7); + assign S9vfh7 = (~(Yxufh7 & K7tfh7)); + assign M9vfh7 = (~(ahb_hrdata[23] & Eyufh7)); + assign A9vfh7 = (Y9vfh7 & Eavfh7); + assign Eavfh7 = (~(S0vfh7 & Kavfh7)); + assign Y9vfh7 = (Czufh7 | Fyrfh7); + assign J9sfh7 = (~(Qavfh7 & Wavfh7)); + assign Wavfh7 = (Cbvfh7 & Ibvfh7); + assign Ibvfh7 = (~(Yxufh7 & U5tfh7)); + assign Cbvfh7 = (~(ahb_hrdata[24] & Eyufh7)); + assign Qavfh7 = (Obvfh7 & Ubvfh7); + assign Ubvfh7 = (Wyufh7 | Y4sfh7); + assign Obvfh7 = (~(gpi8[0] & Acvfh7)); + assign E9sfh7 = (~(Gcvfh7 & Mcvfh7)); + assign Mcvfh7 = (Scvfh7 & Ycvfh7); + assign Ycvfh7 = (~(Yxufh7 & E4tfh7)); + assign Scvfh7 = (~(ahb_hrdata[25] & Eyufh7)); + assign Gcvfh7 = (Edvfh7 & Kdvfh7); + assign Kdvfh7 = (~(S0vfh7 & Qdvfh7)); + assign Edvfh7 = (~(gpi8[1] & Acvfh7)); + assign Z8sfh7 = (~(Wdvfh7 & Cevfh7)); + assign Cevfh7 = (Ievfh7 & Oevfh7); + assign Oevfh7 = (~(Yxufh7 & O2tfh7)); + assign Ievfh7 = (~(ahb_hrdata[26] & Eyufh7)); + assign Wdvfh7 = (Uevfh7 & Afvfh7); + assign Afvfh7 = (~(S0vfh7 & Gfvfh7)); + assign Uevfh7 = (~(gpi8[2] & Acvfh7)); + assign U8sfh7 = (~(Mfvfh7 & Sfvfh7)); + assign Sfvfh7 = (Yfvfh7 & Egvfh7); + assign Egvfh7 = (~(Yxufh7 & Axsfh7)); + assign Yfvfh7 = (~(ahb_hrdata[27] & Eyufh7)); + assign Mfvfh7 = (Kgvfh7 & Qgvfh7); + assign Qgvfh7 = (~(S0vfh7 & Wgvfh7)); + assign Kgvfh7 = (~(gpi8[3] & Acvfh7)); + assign P8sfh7 = (~(Chvfh7 & Ihvfh7)); + assign Ihvfh7 = (Ohvfh7 & Uhvfh7); + assign Uhvfh7 = (~(Yxufh7 & M6tfh7)); + assign Ohvfh7 = (~(ahb_hrdata[28] & Eyufh7)); + assign Chvfh7 = (Aivfh7 & Givfh7); + assign Givfh7 = (Wyufh7 | S5sfh7); + assign Aivfh7 = (~(gpi8[4] & Acvfh7)); + assign K8sfh7 = (~(Mivfh7 & Sivfh7)); + assign Sivfh7 = (Yivfh7 & Ejvfh7); + assign Ejvfh7 = (~(Yxufh7 & W4tfh7)); + assign Yivfh7 = (~(ahb_hrdata[29] & Eyufh7)); + assign Mivfh7 = (Kjvfh7 & Qjvfh7); + assign Qjvfh7 = (~(S0vfh7 & Wjvfh7)); + assign Kjvfh7 = (~(gpi8[5] & Acvfh7)); + assign F8sfh7 = (~(Ckvfh7 & Ikvfh7)); + assign Ikvfh7 = (Okvfh7 & Ukvfh7); + assign Ukvfh7 = (~(Yxufh7 & G3tfh7)); + assign Okvfh7 = (~(ahb_hrdata[30] & Eyufh7)); + assign Ckvfh7 = (Alvfh7 & Glvfh7); + assign Glvfh7 = (~(S0vfh7 & Mlvfh7)); + assign Alvfh7 = (~(gpi8[6] & Acvfh7)); + assign A8sfh7 = (~(Slvfh7 & Ylvfh7)); + assign Ylvfh7 = (Emvfh7 & Kmvfh7); + assign Kmvfh7 = (~(Yxufh7 & Yxsfh7)); + assign Yxufh7 = (!Qmvfh7); + assign Emvfh7 = (~(ahb_hrdata[31] & Eyufh7)); + assign Slvfh7 = (Wmvfh7 & Cnvfh7); + assign Cnvfh7 = (~(S0vfh7 & Invfh7)); + assign Wmvfh7 = (~(gpi8[7] & Acvfh7)); + assign Acvfh7 = (!Czufh7); + assign V7sfh7 = (Onvfh7 & Unvfh7); + assign Unvfh7 = (~(Aovfh7 & Govfh7)); + assign Govfh7 = (Movfh7 & Sovfh7); + assign Sovfh7 = (Yovfh7 & Epvfh7); + assign Epvfh7 = (Kpvfh7 & Qpvfh7); + assign Yovfh7 = (Wpvfh7 & Cqvfh7); + assign Cqvfh7 = (~(Iqvfh7 & Oqvfh7)); + assign Iqvfh7 = (~(Uqvfh7 | M1sfh7)); + assign Wpvfh7 = (~(Arvfh7 & Grvfh7)); + assign Arvfh7 = (Mrvfh7 ^ Srvfh7); + assign Movfh7 = (Yrvfh7 & Esvfh7); + assign Esvfh7 = (Ksvfh7 & Qsvfh7); + assign Qsvfh7 = (~(Wsvfh7 & Ctvfh7)); + assign Wsvfh7 = (Itvfh7 ^ Otvfh7); + assign Ksvfh7 = (~(Utvfh7 & Auvfh7)); + assign Utvfh7 = (~(Guvfh7 ^ S5sfh7)); + assign Yrvfh7 = (Muvfh7 & Suvfh7); + assign Suvfh7 = (~(Yuvfh7 & Evvfh7)); + assign Yuvfh7 = (~(Kvvfh7 ^ K3sfh7)); + assign Muvfh7 = (~(Qvvfh7 & Wvvfh7)); + assign Qvvfh7 = (~(Cwvfh7 ^ Y4sfh7)); + assign Aovfh7 = (Iwvfh7 & Owvfh7); + assign Owvfh7 = (Uwvfh7 & Axvfh7); + assign Axvfh7 = (Gxvfh7 & Mxvfh7); + assign Mxvfh7 = (~(Sxvfh7 & Yxvfh7)); + assign Sxvfh7 = (~(Eyvfh7 ^ E4sfh7)); + assign Gxvfh7 = (~(Kyvfh7 & Qyvfh7)); + assign Kyvfh7 = (Wyvfh7 ^ Czvfh7); + assign Uwvfh7 = (Izvfh7 & Ozvfh7); + assign Ozvfh7 = (~(Uzvfh7 & A0wfh7)); + assign Izvfh7 = (~(G0wfh7 & M0wfh7)); + assign Iwvfh7 = (S0wfh7 & Y0wfh7); + assign S0wfh7 = (E1wfh7 & K1wfh7); + assign K1wfh7 = (Q1wfh7 | Iz1gh7); + assign E1wfh7 = (~(stdio_rx_tdata[0] & W1wfh7)); + assign Onvfh7 = (~(Uyrfh7 & C2wfh7)); + assign Q7sfh7 = (I2wfh7 & O2wfh7); + assign O2wfh7 = (~(U2wfh7 & A3wfh7)); + assign A3wfh7 = (G3wfh7 & M3wfh7); + assign M3wfh7 = (S3wfh7 & Y3wfh7); + assign Y3wfh7 = (E4wfh7 & K4wfh7); + assign S3wfh7 = (Q4wfh7 & W4wfh7); + assign W4wfh7 = (C5wfh7 | I5wfh7); + assign C5wfh7 = (G2sfh7 ? U5wfh7 : O5wfh7); + assign U5wfh7 = (~(O5wfh7 & A6wfh7)); + assign O5wfh7 = (B2sfh7 & G6wfh7); + assign Q4wfh7 = (M6wfh7 | S6wfh7); + assign M6wfh7 = (X0sfh7 ? E7wfh7 : Y6wfh7); + assign E7wfh7 = (~(Y6wfh7 & K7wfh7)); + assign Y6wfh7 = (Pyrfh7 & Q7wfh7); + assign G3wfh7 = (W7wfh7 & C8wfh7); + assign C8wfh7 = (~(Wvvfh7 & I8wfh7)); + assign I8wfh7 = (~(O8wfh7 & U8wfh7)); + assign U8wfh7 = (~(A9wfh7 & Gfvfh7)); + assign A9wfh7 = (!G9wfh7); + assign O8wfh7 = (~(M9wfh7 & Qdvfh7)); + assign W7wfh7 = (S9wfh7 & Y9wfh7); + assign Y9wfh7 = (~(Auvfh7 & Eawfh7)); + assign Eawfh7 = (~(Kawfh7 & Qawfh7)); + assign Qawfh7 = (~(Wawfh7 & Mlvfh7)); + assign Wawfh7 = (!Cbwfh7); + assign Kawfh7 = (~(Ibwfh7 & Wjvfh7)); + assign S9wfh7 = (~(Evvfh7 & Obwfh7)); + assign Obwfh7 = (~(Ubwfh7 & Acwfh7)); + assign Acwfh7 = (~(Gcwfh7 & O2vfh7)); + assign Gcwfh7 = (!Mcwfh7); + assign Ubwfh7 = (~(Scwfh7 & Y0vfh7)); + assign U2wfh7 = (Ycwfh7 & Edwfh7); + assign Edwfh7 = (Kdwfh7 & Qdwfh7); + assign Qdwfh7 = (Wdwfh7 & Cewfh7); + assign Cewfh7 = (~(Yxvfh7 & Iewfh7)); + assign Iewfh7 = (~(Oewfh7 & Uewfh7)); + assign Uewfh7 = (~(Afwfh7 & U8vfh7)); + assign Afwfh7 = (!Gfwfh7); + assign Oewfh7 = (~(Mfwfh7 & E7vfh7)); + assign Wdwfh7 = (Sfwfh7 | Yfwfh7); + assign Sfwfh7 = (V2sfh7 ? Kgwfh7 : Egwfh7); + assign Kgwfh7 = (~(Egwfh7 & Qgwfh7)); + assign Egwfh7 = (Kyrfh7 & Wgwfh7); + assign Kdwfh7 = (Chwfh7 & Ihwfh7); + assign Ihwfh7 = (Q1wfh7 | Qy1gh7); + assign Chwfh7 = (~(stdio_rx_tdata[1] & W1wfh7)); + assign Ycwfh7 = (Ohwfh7 & Uhwfh7); + assign Uhwfh7 = (A0wfh7 ? Giwfh7 : Aiwfh7); + assign Giwfh7 = (~(R1sfh7 & Miwfh7)); + assign Aiwfh7 = (!Uzvfh7); + assign Ohwfh7 = (Siwfh7 & Yiwfh7); + assign I2wfh7 = (~(Zyrfh7 & C2wfh7)); + assign L7sfh7 = (Ejwfh7 & Kjwfh7); + assign Kjwfh7 = (~(Qjwfh7 & Wjwfh7)); + assign Wjwfh7 = (Ckwfh7 & Ikwfh7); + assign Ikwfh7 = (Okwfh7 & Ukwfh7); + assign Ukwfh7 = (Alwfh7 & Kpvfh7); + assign Alwfh7 = (~(Glwfh7 & Ctvfh7)); + assign Glwfh7 = (Mlwfh7 & K7wfh7); + assign Mlwfh7 = (~(Pyrfh7 & X0sfh7)); + assign Okwfh7 = (Slwfh7 & Ylwfh7); + assign Ylwfh7 = (~(Emwfh7 & Grvfh7)); + assign Emwfh7 = (Kmwfh7 & A6wfh7); + assign Kmwfh7 = (~(B2sfh7 & G2sfh7)); + assign Slwfh7 = (~(Qmwfh7 & Qyvfh7)); + assign Qmwfh7 = (Wmwfh7 & Qgwfh7); + assign Wmwfh7 = (~(Kyrfh7 & V2sfh7)); + assign Ckwfh7 = (Cnwfh7 & Inwfh7); + assign Inwfh7 = (Onwfh7 & Unwfh7); + assign Onwfh7 = (~(Aowfh7 & Evvfh7)); + assign Aowfh7 = (Mcwfh7 & O2vfh7); + assign O2vfh7 = (!U3sfh7); + assign Mcwfh7 = (Scwfh7 | Y0vfh7); + assign Y0vfh7 = (!P3sfh7); + assign Scwfh7 = (~(K3sfh7 & E4vfh7)); + assign Cnwfh7 = (Gowfh7 & Mowfh7); + assign Mowfh7 = (~(Sowfh7 & Yxvfh7)); + assign Sowfh7 = (Gfwfh7 & U8vfh7); + assign U8vfh7 = (!O4sfh7); + assign Gfwfh7 = (Mfwfh7 | E7vfh7); + assign E7vfh7 = (!J4sfh7); + assign Mfwfh7 = (~(E4sfh7 & Kavfh7)); + assign Gowfh7 = (~(Yowfh7 & Wvvfh7)); + assign Yowfh7 = (G9wfh7 & Gfvfh7); + assign Gfvfh7 = (!I5sfh7); + assign G9wfh7 = (M9wfh7 | Qdvfh7); + assign Qdvfh7 = (!D5sfh7); + assign M9wfh7 = (~(Y4sfh7 & Wgvfh7)); + assign Qjwfh7 = (Epwfh7 & Kpwfh7); + assign Kpwfh7 = (Qpwfh7 & Wpwfh7); + assign Wpwfh7 = (Cqwfh7 & Iqwfh7); + assign Iqwfh7 = (~(Oqwfh7 & Auvfh7)); + assign Oqwfh7 = (Cbwfh7 & Mlvfh7); + assign Mlvfh7 = (!C6sfh7); + assign Cbwfh7 = (Ibwfh7 | Wjvfh7); + assign Wjvfh7 = (!X5sfh7); + assign Ibwfh7 = (~(S5sfh7 & Invfh7)); + assign Cqwfh7 = (~(Uqwfh7 & Q2sfh7)); + assign Uqwfh7 = (Grvfh7 & A6wfh7); + assign Qpwfh7 = (Arwfh7 & Grwfh7); + assign Grwfh7 = (~(Mrwfh7 & H1sfh7)); + assign Mrwfh7 = (Ctvfh7 & K7wfh7); + assign Arwfh7 = (~(Srwfh7 & F3sfh7)); + assign Srwfh7 = (Qyvfh7 & Qgwfh7); + assign Epwfh7 = (Yrwfh7 & Eswfh7); + assign Eswfh7 = (Kswfh7 & Qswfh7); + assign Qswfh7 = (~(W1sfh7 & Miwfh7)); + assign Kswfh7 = (Q1wfh7 | C82gh7); + assign Yrwfh7 = (Wswfh7 & Ctwfh7); + assign Ctwfh7 = (~(stdio_rx_tdata[2] & W1wfh7)); + assign Ejwfh7 = (~(Ezrfh7 & C2wfh7)); + assign G7sfh7 = (Itwfh7 & Otwfh7); + assign Otwfh7 = (~(Utwfh7 & Auwfh7)); + assign Auwfh7 = (Guwfh7 & Muwfh7); + assign Muwfh7 = (Suwfh7 & Yuwfh7); + assign Yuwfh7 = (Evwfh7 & Kvwfh7); + assign Evwfh7 = (~(Qvwfh7 & Wvwfh7)); + assign Wvwfh7 = (G2sfh7 & G6wfh7); + assign Qvwfh7 = (Grvfh7 & L2sfh7); + assign Suwfh7 = (Cwwfh7 & Iwwfh7); + assign Iwwfh7 = (~(Owwfh7 & Uwwfh7)); + assign Uwwfh7 = (Oqvfh7 & Axwfh7); + assign Owwfh7 = (R1sfh7 & Ozrfh7); + assign Cwwfh7 = (~(Gxwfh7 & Mxwfh7)); + assign Mxwfh7 = (X0sfh7 & Q7wfh7); + assign Gxwfh7 = (Ctvfh7 & C1sfh7); + assign Guwfh7 = (Sxwfh7 & Yxwfh7); + assign Yxwfh7 = (~(Eywfh7 & Kywfh7)); + assign Kywfh7 = (D5sfh7 & Wgvfh7); + assign Eywfh7 = (Wvvfh7 & I5sfh7); + assign Sxwfh7 = (Qywfh7 & Wywfh7); + assign Wywfh7 = (~(Czwfh7 & Izwfh7)); + assign Izwfh7 = (X5sfh7 & Invfh7); + assign Czwfh7 = (Auvfh7 & C6sfh7); + assign Qywfh7 = (~(Ozwfh7 & Uzwfh7)); + assign Uzwfh7 = (P3sfh7 & E4vfh7); + assign Ozwfh7 = (Evvfh7 & U3sfh7); + assign Utwfh7 = (A0xfh7 & G0xfh7); + assign G0xfh7 = (M0xfh7 & S0xfh7); + assign S0xfh7 = (Q1wfh7 | Wy1gh7); + assign M0xfh7 = (Y0xfh7 & E1xfh7); + assign E1xfh7 = (~(K1xfh7 & Q1xfh7)); + assign Q1xfh7 = (J4sfh7 & Kavfh7); + assign K1xfh7 = (Yxvfh7 & O4sfh7); + assign Y0xfh7 = (~(W1xfh7 & C2xfh7)); + assign C2xfh7 = (V2sfh7 & Wgwfh7); + assign W1xfh7 = (Qyvfh7 & A3sfh7); + assign A0xfh7 = (I2xfh7 & Wswfh7); + assign Wswfh7 = (O2xfh7 & U2xfh7); + assign O2xfh7 = (A3xfh7 & Qpvfh7); + assign I2xfh7 = (Siwfh7 & G3xfh7); + assign G3xfh7 = (~(stdio_rx_tdata[3] & W1wfh7)); + assign Siwfh7 = (M3xfh7 & S3xfh7); + assign S3xfh7 = (Y3xfh7 & M0wfh7); + assign M3xfh7 = (E4xfh7 & K4xfh7); + assign Itwfh7 = (~(Jzrfh7 & C2wfh7)); + assign B7sfh7 = (Q4xfh7 & W4xfh7); + assign W4xfh7 = (~(C5xfh7 & I5xfh7)); + assign I5xfh7 = (O5xfh7 & U5xfh7); + assign U5xfh7 = (A6xfh7 & G6xfh7); + assign G6xfh7 = (M6xfh7 & Kpvfh7); + assign M6xfh7 = (S6xfh7 & K4wfh7); + assign A6xfh7 = (Kvwfh7 & Y6xfh7); + assign O5xfh7 = (E7xfh7 & K7xfh7); + assign K7xfh7 = (Q7xfh7 & A3xfh7); + assign Q7xfh7 = (W7xfh7 | Uqvfh7); + assign Uqvfh7 = (Axwfh7 & C8xfh7); + assign C8xfh7 = (~(R1sfh7 & Ozrfh7)); + assign E7xfh7 = (I8xfh7 & O8xfh7); + assign O8xfh7 = (~(Evvfh7 & U8xfh7)); + assign U8xfh7 = (!Kvvfh7); + assign I8xfh7 = (~(Yxvfh7 & A9xfh7)); + assign A9xfh7 = (!Eyvfh7); + assign C5xfh7 = (G9xfh7 & M9xfh7); + assign M9xfh7 = (S9xfh7 & Y9xfh7); + assign Y9xfh7 = (Eaxfh7 & Kaxfh7); + assign Kaxfh7 = (~(Wvvfh7 & Qaxfh7)); + assign Qaxfh7 = (!Cwvfh7); + assign Eaxfh7 = (~(Auvfh7 & Waxfh7)); + assign Waxfh7 = (!Guvfh7); + assign S9xfh7 = (Cbxfh7 & Ibxfh7); + assign Ibxfh7 = (I5wfh7 | Mrvfh7); + assign Cbxfh7 = (Yfwfh7 | Wyvfh7); + assign G9xfh7 = (Obxfh7 & Ubxfh7); + assign Ubxfh7 = (Acxfh7 & Gcxfh7); + assign Gcxfh7 = (S6wfh7 | Itvfh7); + assign Acxfh7 = (Q1wfh7 | Cz1gh7); + assign Obxfh7 = (U2xfh7 & Mcxfh7); + assign Mcxfh7 = (~(stdio_rx_tdata[4] & W1wfh7)); + assign Q4xfh7 = (~(Tzrfh7 & C2wfh7)); + assign W6sfh7 = (Scxfh7 & Ycxfh7); + assign Ycxfh7 = (~(Edxfh7 & Kdxfh7)); + assign Kdxfh7 = (Qdxfh7 & Wdxfh7); + assign Wdxfh7 = (Cexfh7 & W7xfh7); + assign Cexfh7 = (S6wfh7 & Iexfh7); + assign Qdxfh7 = (Kpvfh7 & I5wfh7); + assign Edxfh7 = (Oexfh7 & Uexfh7); + assign Uexfh7 = (Afxfh7 & Gfxfh7); + assign Gfxfh7 = (~(stdio_rx_tdata[5] & W1wfh7)); + assign Afxfh7 = (Mfxfh7 & Sfxfh7); + assign Mfxfh7 = (~(Yfxfh7 & G0wfh7)); + assign Yfxfh7 = (A3xfh7 & M0wfh7); + assign Oexfh7 = (U2xfh7 & Egxfh7); + assign U2xfh7 = (Kgxfh7 & Qgxfh7); + assign Kgxfh7 = (E4wfh7 & Wgxfh7); + assign Scxfh7 = (~(Yzrfh7 & C2wfh7)); + assign R6sfh7 = (Chxfh7 & Ihxfh7); + assign Ihxfh7 = (~(Ohxfh7 & Uhxfh7)); + assign Uhxfh7 = (Aixfh7 & Gixfh7); + assign Gixfh7 = (Mixfh7 & Sixfh7); + assign Sixfh7 = (Kvwfh7 & K4wfh7); + assign Mixfh7 = (Yixfh7 & Unwfh7); + assign Unwfh7 = (~(Ejxfh7 & Miwfh7)); + assign Ejxfh7 = (Kjxfh7 & Axwfh7); + assign Kjxfh7 = (~(R1sfh7 & M1sfh7)); + assign Yixfh7 = (~(Itvfh7 & Ctvfh7)); + assign Ctvfh7 = (!S6wfh7); + assign Itvfh7 = (Qjxfh7 & Q7wfh7); + assign Qjxfh7 = (~(C1sfh7 & X0sfh7)); + assign Aixfh7 = (Wjxfh7 & Ckxfh7); + assign Ckxfh7 = (~(Uzvfh7 & Axwfh7)); + assign Uzvfh7 = (Oqvfh7 & Ikxfh7); + assign Wjxfh7 = (Okxfh7 & Ukxfh7); + assign Ukxfh7 = (~(Mrvfh7 & Grvfh7)); + assign Grvfh7 = (!I5wfh7); + assign Mrvfh7 = (Alxfh7 & G6wfh7); + assign Alxfh7 = (~(L2sfh7 & G2sfh7)); + assign Okxfh7 = (~(Wyvfh7 & Qyvfh7)); + assign Qyvfh7 = (!Yfwfh7); + assign Wyvfh7 = (Glxfh7 & Wgwfh7); + assign Glxfh7 = (~(A3sfh7 & V2sfh7)); + assign Ohxfh7 = (Mlxfh7 & Slxfh7); + assign Slxfh7 = (Ylxfh7 & Emxfh7); + assign Emxfh7 = (Kmxfh7 & Qmxfh7); + assign Qmxfh7 = (~(Evvfh7 & Kvvfh7)); + assign Kvvfh7 = (Wmxfh7 & E4vfh7); + assign E4vfh7 = (!Z3sfh7); + assign Wmxfh7 = (~(U3sfh7 & P3sfh7)); + assign Kmxfh7 = (~(Yxvfh7 & Eyvfh7)); + assign Eyvfh7 = (Cnxfh7 & Kavfh7); + assign Kavfh7 = (!T4sfh7); + assign Cnxfh7 = (~(O4sfh7 & J4sfh7)); + assign Yxvfh7 = (!Inxfh7); + assign Ylxfh7 = (Onxfh7 & Unxfh7); + assign Unxfh7 = (~(Wvvfh7 & Cwvfh7)); + assign Cwvfh7 = (Aoxfh7 & Wgvfh7); + assign Wgvfh7 = (!N5sfh7); + assign Aoxfh7 = (~(I5sfh7 & D5sfh7)); + assign Onxfh7 = (~(Auvfh7 & Guvfh7)); + assign Guvfh7 = (Goxfh7 & Invfh7); + assign Invfh7 = (!H6sfh7); + assign Goxfh7 = (~(C6sfh7 & X5sfh7)); + assign Auvfh7 = (!Moxfh7); + assign Mlxfh7 = (Soxfh7 & Y0wfh7); + assign Y0wfh7 = (Yoxfh7 & Yiwfh7); + assign Yiwfh7 = (Epxfh7 & Qgxfh7); + assign Epxfh7 = (S6xfh7 & Czufh7); + assign Yoxfh7 = (Kpxfh7 & A3xfh7); + assign Kpxfh7 = (~(Miwfh7 & A0wfh7)); + assign A0wfh7 = (~(Qpxfh7 | W1sfh7)); + assign Miwfh7 = (~(W7xfh7 | Ozrfh7)); + assign Soxfh7 = (Wpxfh7 & Cqxfh7); + assign Cqxfh7 = (Q1wfh7 | Oz1gh7); + assign Wpxfh7 = (~(stdio_rx_tdata[6] & W1wfh7)); + assign Chxfh7 = (~(D0sfh7 & C2wfh7)); + assign M6sfh7 = (C2wfh7 ? com_tx_tdata[7] : Iqxfh7); + assign C2wfh7 = (!Qgxfh7); + assign Qgxfh7 = (Wpsfh7 & Oqxfh7); + assign Oqxfh7 = (~(Uqxfh7 & Arxfh7)); + assign Arxfh7 = (~(Grxfh7 & Mrxfh7)); + assign Mrxfh7 = (~(Srxfh7 & Yrxfh7)); + assign Iqxfh7 = (stdio_rx_tdata[7] & W1wfh7); + assign S0sfh7 = (~(Esxfh7 & Ksxfh7)); + assign Esxfh7 = (Qsxfh7 & Wsxfh7); + assign N0sfh7 = (ahb_hready ? ahb_htrans[1] : Ctxfh7); + assign I0sfh7 = (~(Itxfh7 | W72gh7)); + assign Itxfh7 = (~(Otxfh7 | A3xfh7)); + assign Qpsfh7 = (~(Utxfh7 & Auxfh7)); + assign Auxfh7 = (~(stdio_tx_tdata[7] & Guxfh7)); + assign Utxfh7 = (Muxfh7 & Suxfh7); + assign Suxfh7 = (~(Yuxfh7 & com_rx_tdata[7])); + assign Muxfh7 = (~(Evxfh7 & Ottfh7)); + assign Kpsfh7 = (~(Kvxfh7 & Qvxfh7)); + assign Qvxfh7 = (~(stdio_tx_tdata[6] & Guxfh7)); + assign Kvxfh7 = (Wvxfh7 & Cwxfh7); + assign Cwxfh7 = (~(Yuxfh7 & com_rx_tdata[6])); + assign Wvxfh7 = (~(Evxfh7 & Yutfh7)); + assign Epsfh7 = (~(Iwxfh7 & Owxfh7)); + assign Owxfh7 = (~(stdio_tx_tdata[5] & Guxfh7)); + assign Iwxfh7 = (Uwxfh7 & Axxfh7); + assign Axxfh7 = (~(Yuxfh7 & com_rx_tdata[5])); + assign Uwxfh7 = (~(Evxfh7 & Iwtfh7)); + assign Yosfh7 = (~(Gxxfh7 & Mxxfh7)); + assign Mxxfh7 = (~(stdio_tx_tdata[4] & Guxfh7)); + assign Gxxfh7 = (Sxxfh7 & Yxxfh7); + assign Yxxfh7 = (~(Yuxfh7 & com_rx_tdata[4])); + assign Sxxfh7 = (~(Evxfh7 & Sxtfh7)); + assign Sosfh7 = (~(Eyxfh7 & Kyxfh7)); + assign Kyxfh7 = (~(stdio_tx_tdata[3] & Guxfh7)); + assign Eyxfh7 = (Qyxfh7 & Wyxfh7); + assign Wyxfh7 = (~(Yuxfh7 & com_rx_tdata[3])); + assign Qyxfh7 = (~(Evxfh7 & Cztfh7)); + assign Mosfh7 = (~(Czxfh7 & Izxfh7)); + assign Izxfh7 = (~(stdio_tx_tdata[2] & Guxfh7)); + assign Czxfh7 = (Ozxfh7 & Uzxfh7); + assign Uzxfh7 = (~(Yuxfh7 & com_rx_tdata[2])); + assign Ozxfh7 = (~(Evxfh7 & M0ufh7)); + assign Gosfh7 = (~(A0yfh7 & G0yfh7)); + assign G0yfh7 = (~(stdio_tx_tdata[1] & Guxfh7)); + assign A0yfh7 = (M0yfh7 & S0yfh7); + assign S0yfh7 = (~(Yuxfh7 & com_rx_tdata[1])); + assign M0yfh7 = (~(Evxfh7 & W1ufh7)); + assign Aosfh7 = (~(Y0yfh7 & E1yfh7)); + assign E1yfh7 = (~(stdio_tx_tdata[0] & Guxfh7)); + assign Y0yfh7 = (K1yfh7 & Q1yfh7); + assign Q1yfh7 = (~(Yuxfh7 & com_rx_tdata[0])); + assign Yuxfh7 = (~(Guxfh7 | Y3xfh7)); + assign K1yfh7 = (~(Evxfh7 & Q1tfh7)); + assign Evxfh7 = (~(Guxfh7 | K4xfh7)); + assign Guxfh7 = (~(W1yfh7 & stdio_tx_tready)); + assign W1yfh7 = (Wpsfh7 & C2yfh7); + assign C2yfh7 = (~(I2yfh7 & K4xfh7)); + assign I2yfh7 = (~(O2yfh7 & U2yfh7)); + assign Unsfh7 = (~(A3yfh7 & G3yfh7)); + assign G3yfh7 = (~(S0vfh7 & Wgwfh7)); + assign Wgwfh7 = (!F3sfh7); + assign A3yfh7 = (M3yfh7 & S3yfh7); + assign S3yfh7 = (Y3yfh7 | Su1gh7); + assign M3yfh7 = (~(ahb_hrdata[15] & Eyufh7)); + assign Onsfh7 = (~(E4yfh7 & K4yfh7)); + assign K4yfh7 = (~(S0vfh7 & Qgwfh7)); + assign Qgwfh7 = (!A3sfh7); + assign E4yfh7 = (Q4yfh7 & W4yfh7); + assign W4yfh7 = (Y3yfh7 | Mu1gh7); + assign Q4yfh7 = (~(ahb_hrdata[14] & Eyufh7)); + assign Insfh7 = (~(C5yfh7 & I5yfh7)); + assign I5yfh7 = (Wyufh7 | V2sfh7); + assign C5yfh7 = (O5yfh7 & U5yfh7); + assign U5yfh7 = (Y3yfh7 | Gu1gh7); + assign O5yfh7 = (~(ahb_hrdata[13] & Eyufh7)); + assign Cnsfh7 = (~(A6yfh7 & G6yfh7)); + assign G6yfh7 = (~(S0vfh7 & Czvfh7)); + assign Czvfh7 = (!Kyrfh7); + assign A6yfh7 = (M6yfh7 & S6yfh7); + assign S6yfh7 = (Y3yfh7 | Au1gh7); + assign M6yfh7 = (~(ahb_hrdata[12] & Eyufh7)); + assign Wmsfh7 = (~(Y6yfh7 & E7yfh7)); + assign E7yfh7 = (~(S0vfh7 & G6wfh7)); + assign G6wfh7 = (!Q2sfh7); + assign Y6yfh7 = (K7yfh7 & Q7yfh7); + assign Q7yfh7 = (Y3yfh7 | Ut1gh7); + assign K7yfh7 = (~(ahb_hrdata[11] & Eyufh7)); + assign Qmsfh7 = (~(W7yfh7 & C8yfh7)); + assign C8yfh7 = (~(S0vfh7 & A6wfh7)); + assign A6wfh7 = (!L2sfh7); + assign W7yfh7 = (I8yfh7 & O8yfh7); + assign O8yfh7 = (Y3yfh7 | Ot1gh7); + assign I8yfh7 = (~(ahb_hrdata[10] & Eyufh7)); + assign Kmsfh7 = (~(U8yfh7 & A9yfh7)); + assign A9yfh7 = (Wyufh7 | G2sfh7); + assign U8yfh7 = (G9yfh7 & M9yfh7); + assign M9yfh7 = (Y3yfh7 | It1gh7); + assign G9yfh7 = (~(ahb_hrdata[9] & Eyufh7)); + assign Emsfh7 = (~(S9yfh7 & Y9yfh7)); + assign Y9yfh7 = (~(S0vfh7 & Srvfh7)); + assign Srvfh7 = (!B2sfh7); + assign S9yfh7 = (Eayfh7 & Kayfh7); + assign Kayfh7 = (Y3yfh7 | Ct1gh7); + assign Eayfh7 = (~(ahb_hrdata[8] & Eyufh7)); + assign Ylsfh7 = (~(Qayfh7 & Wayfh7)); + assign Wayfh7 = (~(S0vfh7 & Axwfh7)); + assign Axwfh7 = (!W1sfh7); + assign Qayfh7 = (Cbyfh7 & Ibyfh7); + assign Ibyfh7 = (~(Obyfh7 & Ottfh7)); + assign Cbyfh7 = (~(ahb_hrdata[7] & Eyufh7)); + assign Slsfh7 = (~(Ubyfh7 & Acyfh7)); + assign Acyfh7 = (Wyufh7 | Ozrfh7); + assign Ubyfh7 = (Gcyfh7 & Mcyfh7); + assign Mcyfh7 = (~(Obyfh7 & Yutfh7)); + assign Gcyfh7 = (~(ahb_hrdata[6] & Eyufh7)); + assign Mlsfh7 = (~(Scyfh7 & Ycyfh7)); + assign Ycyfh7 = (~(S0vfh7 & Ikxfh7)); + assign Ikxfh7 = (!R1sfh7); + assign Scyfh7 = (Edyfh7 & Kdyfh7); + assign Kdyfh7 = (~(Obyfh7 & Iwtfh7)); + assign Edyfh7 = (~(ahb_hrdata[5] & Eyufh7)); + assign Glsfh7 = (~(Qdyfh7 & Wdyfh7)); + assign Wdyfh7 = (~(S0vfh7 & Qpxfh7)); + assign Qpxfh7 = (!M1sfh7); + assign Qdyfh7 = (Ceyfh7 & Ieyfh7); + assign Ieyfh7 = (~(Obyfh7 & Sxtfh7)); + assign Ceyfh7 = (~(ahb_hrdata[4] & Eyufh7)); + assign Alsfh7 = (~(Oeyfh7 & Ueyfh7)); + assign Ueyfh7 = (~(S0vfh7 & Q7wfh7)); + assign Q7wfh7 = (!H1sfh7); + assign Oeyfh7 = (Afyfh7 & Gfyfh7); + assign Gfyfh7 = (~(Obyfh7 & Cztfh7)); + assign Afyfh7 = (~(ahb_hrdata[3] & Eyufh7)); + assign Uksfh7 = (~(Mfyfh7 & Sfyfh7)); + assign Sfyfh7 = (~(S0vfh7 & K7wfh7)); + assign K7wfh7 = (!C1sfh7); + assign Mfyfh7 = (Yfyfh7 & Egyfh7); + assign Egyfh7 = (~(Obyfh7 & M0ufh7)); + assign Yfyfh7 = (~(ahb_hrdata[2] & Eyufh7)); + assign Oksfh7 = (~(Kgyfh7 & Qgyfh7)); + assign Qgyfh7 = (Wyufh7 | X0sfh7); + assign Kgyfh7 = (Wgyfh7 & Chyfh7); + assign Chyfh7 = (~(Obyfh7 & W1ufh7)); + assign Wgyfh7 = (~(ahb_hrdata[1] & Eyufh7)); + assign Iksfh7 = (~(Ihyfh7 & Ohyfh7)); + assign Ohyfh7 = (~(S0vfh7 & Otvfh7)); + assign Otvfh7 = (!Pyrfh7); + assign Ihyfh7 = (Uhyfh7 & Aiyfh7); + assign Aiyfh7 = (~(Obyfh7 & Q1tfh7)); + assign Obyfh7 = (~(Y3yfh7 & Giyfh7)); + assign Giyfh7 = (~(Miyfh7 & Wyufh7)); + assign Y3yfh7 = (Czufh7 & Qmvfh7); + assign Qmvfh7 = (~(Siyfh7 & Wyufh7)); + assign Wyufh7 = (!S0vfh7); + assign Siyfh7 = (~(M0wfh7 & Q1wfh7)); + assign Uhyfh7 = (~(ahb_hrdata[0] & Eyufh7)); + assign Eyufh7 = (~(K4wfh7 | S0vfh7)); + assign S0vfh7 = (Yiyfh7 & Wsxfh7); + assign ahb_htrans[1] = (~(Ctxfh7 | K72gh7)); + assign Ctxfh7 = (!G92gh7); + assign Xzpfh7 = (~(Ejyfh7 & Kjyfh7)); + assign Kjyfh7 = (~(Qjyfh7 & Yxsfh7)); + assign Ejyfh7 = (~(Qbrfh7 & Wjyfh7)); + assign O0qfh7 = (~(Ckyfh7 & Ikyfh7)); + assign Ikyfh7 = (~(Qjyfh7 & G3tfh7)); + assign Ckyfh7 = (~(Gcrfh7 & Wjyfh7)); + assign F1qfh7 = (~(Okyfh7 & Ukyfh7)); + assign Ukyfh7 = (~(Qjyfh7 & W4tfh7)); + assign Okyfh7 = (~(Wcrfh7 & Wjyfh7)); + assign W1qfh7 = (~(Alyfh7 & Glyfh7)); + assign Glyfh7 = (~(Qjyfh7 & M6tfh7)); + assign Alyfh7 = (~(Mdrfh7 & Wjyfh7)); + assign N2qfh7 = (~(Mlyfh7 & Slyfh7)); + assign Slyfh7 = (~(Qjyfh7 & Axsfh7)); + assign Mlyfh7 = (~(Cerfh7 & Wjyfh7)); + assign E3qfh7 = (~(Ylyfh7 & Emyfh7)); + assign Emyfh7 = (~(Qjyfh7 & O2tfh7)); + assign Ylyfh7 = (~(Serfh7 & Wjyfh7)); + assign V3qfh7 = (~(Kmyfh7 & Qmyfh7)); + assign Qmyfh7 = (~(Qjyfh7 & E4tfh7)); + assign Kmyfh7 = (~(Ifrfh7 & Wjyfh7)); + assign M4qfh7 = (~(Wmyfh7 & Cnyfh7)); + assign Cnyfh7 = (~(Qjyfh7 & U5tfh7)); + assign Wmyfh7 = (~(Yfrfh7 & Wjyfh7)); + assign D5qfh7 = (~(Inyfh7 & Onyfh7)); + assign Onyfh7 = (~(Qjyfh7 & K7tfh7)); + assign Inyfh7 = (~(Ogrfh7 & Wjyfh7)); + assign U5qfh7 = (~(Unyfh7 & Aoyfh7)); + assign Aoyfh7 = (~(Qjyfh7 & U8tfh7)); + assign Unyfh7 = (~(Ehrfh7 & Wjyfh7)); + assign L6qfh7 = (~(Goyfh7 & Moyfh7)); + assign Moyfh7 = (~(Qjyfh7 & Eatfh7)); + assign Goyfh7 = (~(Uhrfh7 & Wjyfh7)); + assign C7qfh7 = (~(Soyfh7 & Yoyfh7)); + assign Yoyfh7 = (~(Qjyfh7 & Obtfh7)); + assign Soyfh7 = (~(Kirfh7 & Wjyfh7)); + assign T7qfh7 = (~(Epyfh7 & Kpyfh7)); + assign Kpyfh7 = (~(Qjyfh7 & Yctfh7)); + assign Epyfh7 = (~(Ajrfh7 & Wjyfh7)); + assign K8qfh7 = (~(Qpyfh7 & Wpyfh7)); + assign Wpyfh7 = (~(Qjyfh7 & Ietfh7)); + assign Qpyfh7 = (~(Qjrfh7 & Wjyfh7)); + assign B9qfh7 = (~(Cqyfh7 & Iqyfh7)); + assign Iqyfh7 = (~(Qjyfh7 & Sftfh7)); + assign Cqyfh7 = (~(Gkrfh7 & Wjyfh7)); + assign S9qfh7 = (~(Oqyfh7 & Uqyfh7)); + assign Uqyfh7 = (~(Qjyfh7 & Chtfh7)); + assign Oqyfh7 = (~(Wkrfh7 & Wjyfh7)); + assign Jaqfh7 = (~(Aryfh7 & Gryfh7)); + assign Gryfh7 = (~(Qjyfh7 & Mitfh7)); + assign Aryfh7 = (~(Mlrfh7 & Wjyfh7)); + assign Abqfh7 = (~(Mryfh7 & Sryfh7)); + assign Sryfh7 = (~(Qjyfh7 & Wjtfh7)); + assign Mryfh7 = (~(Cmrfh7 & Wjyfh7)); + assign Rbqfh7 = (~(Yryfh7 & Esyfh7)); + assign Esyfh7 = (~(Qjyfh7 & Gltfh7)); + assign Yryfh7 = (~(Smrfh7 & Wjyfh7)); + assign Icqfh7 = (~(Ksyfh7 & Qsyfh7)); + assign Qsyfh7 = (~(Qjyfh7 & Qmtfh7)); + assign Ksyfh7 = (~(Inrfh7 & Wjyfh7)); + assign Zcqfh7 = (~(Wsyfh7 & Ctyfh7)); + assign Ctyfh7 = (~(Qjyfh7 & Aotfh7)); + assign Wsyfh7 = (~(Ynrfh7 & Wjyfh7)); + assign Qdqfh7 = (~(Ityfh7 & Otyfh7)); + assign Otyfh7 = (~(Qjyfh7 & Kptfh7)); + assign Ityfh7 = (~(Oorfh7 & Wjyfh7)); + assign Heqfh7 = (~(Utyfh7 & Auyfh7)); + assign Auyfh7 = (~(Qjyfh7 & Uqtfh7)); + assign Utyfh7 = (~(Eprfh7 & Wjyfh7)); + assign Yeqfh7 = (~(Guyfh7 & Muyfh7)); + assign Muyfh7 = (~(Qjyfh7 & Estfh7)); + assign Guyfh7 = (~(Uprfh7 & Wjyfh7)); + assign Pfqfh7 = (~(Suyfh7 & Yuyfh7)); + assign Yuyfh7 = (~(Qjyfh7 & Ottfh7)); + assign Suyfh7 = (~(Kqrfh7 & Wjyfh7)); + assign Ggqfh7 = (~(Evyfh7 & Kvyfh7)); + assign Kvyfh7 = (~(Qjyfh7 & Yutfh7)); + assign Evyfh7 = (~(Arrfh7 & Wjyfh7)); + assign Xgqfh7 = (~(Qvyfh7 & Wvyfh7)); + assign Wvyfh7 = (~(Qjyfh7 & Iwtfh7)); + assign Qvyfh7 = (~(Qrrfh7 & Wjyfh7)); + assign Ohqfh7 = (~(Cwyfh7 & Iwyfh7)); + assign Iwyfh7 = (~(Qjyfh7 & Sxtfh7)); + assign Cwyfh7 = (~(Gsrfh7 & Wjyfh7)); + assign Fiqfh7 = (~(Owyfh7 & Uwyfh7)); + assign Uwyfh7 = (~(Qjyfh7 & Cztfh7)); + assign Owyfh7 = (~(Wsrfh7 & Wjyfh7)); + assign Wiqfh7 = (~(Axyfh7 & Gxyfh7)); + assign Gxyfh7 = (~(Qjyfh7 & M0ufh7)); + assign Axyfh7 = (~(Mtrfh7 & Wjyfh7)); + assign Njqfh7 = (~(Mxyfh7 & Sxyfh7)); + assign Sxyfh7 = (~(Qjyfh7 & W1ufh7)); + assign Mxyfh7 = (~(Curfh7 & Wjyfh7)); + assign Ekqfh7 = (~(Yxyfh7 & Eyyfh7)); + assign Eyyfh7 = (~(Qjyfh7 & Q1tfh7)); + assign Qjyfh7 = (Kyyfh7 & Kjufh7); + assign Yxyfh7 = (~(Surfh7 & Wjyfh7)); + assign Wjyfh7 = (~(Qyyfh7 & Wyyfh7)); + assign Wyyfh7 = (Czyfh7 & Izyfh7); + assign Czyfh7 = (Ozyfh7 & Kjufh7); + assign Kjufh7 = (~(Uzyfh7 & A0zfh7)); + assign A0zfh7 = (G0zfh7 & M0zfh7); + assign M0zfh7 = (S0zfh7 & Y0zfh7); + assign Y0zfh7 = (E1zfh7 & K1zfh7); + assign K1zfh7 = (W1ufh7 & Q1tfh7); + assign Q1tfh7 = (!Gr1gh7); + assign W1ufh7 = (!Mr1gh7); + assign E1zfh7 = (Cztfh7 & M0ufh7); + assign M0ufh7 = (!Sr1gh7); + assign Cztfh7 = (!Yr1gh7); + assign S0zfh7 = (Q1zfh7 & W1zfh7); + assign W1zfh7 = (Iwtfh7 & Sxtfh7); + assign Sxtfh7 = (!Es1gh7); + assign Iwtfh7 = (!Ks1gh7); + assign Q1zfh7 = (Ottfh7 & Yutfh7); + assign Yutfh7 = (!Qs1gh7); + assign Ottfh7 = (!Ws1gh7); + assign G0zfh7 = (C2zfh7 & I2zfh7); + assign I2zfh7 = (O2zfh7 & U2zfh7); + assign U2zfh7 = (Uqtfh7 & Estfh7); + assign Estfh7 = (!Ct1gh7); + assign Uqtfh7 = (!It1gh7); + assign O2zfh7 = (Aotfh7 & Kptfh7); + assign Kptfh7 = (!Ot1gh7); + assign Aotfh7 = (!Ut1gh7); + assign C2zfh7 = (A3zfh7 & G3zfh7); + assign G3zfh7 = (Gltfh7 & Qmtfh7); + assign Qmtfh7 = (!Au1gh7); + assign Gltfh7 = (!Gu1gh7); + assign A3zfh7 = (Mitfh7 & Wjtfh7); + assign Wjtfh7 = (!Mu1gh7); + assign Mitfh7 = (!Su1gh7); + assign Uzyfh7 = (M3zfh7 & S3zfh7); + assign S3zfh7 = (Y3zfh7 & E4zfh7); + assign E4zfh7 = (K4zfh7 & Q4zfh7); + assign Q4zfh7 = (Yxsfh7 & Axsfh7); + assign Axsfh7 = (!Yu1gh7); + assign Yxsfh7 = (!Ev1gh7); + assign K4zfh7 = (G3tfh7 & O2tfh7); + assign O2tfh7 = (!Kv1gh7); + assign G3tfh7 = (!Qv1gh7); + assign Y3zfh7 = (W4zfh7 & C5zfh7); + assign C5zfh7 = (W4tfh7 & E4tfh7); + assign E4tfh7 = (!Wv1gh7); + assign W4tfh7 = (!Cw1gh7); + assign W4zfh7 = (M6tfh7 & U5tfh7); + assign U5tfh7 = (!Iw1gh7); + assign M6tfh7 = (!Ow1gh7); + assign M3zfh7 = (I5zfh7 & O5zfh7); + assign O5zfh7 = (U5zfh7 & A6zfh7); + assign A6zfh7 = (U8tfh7 & K7tfh7); + assign K7tfh7 = (!Uw1gh7); + assign U8tfh7 = (!Ax1gh7); + assign U5zfh7 = (Obtfh7 & Eatfh7); + assign Eatfh7 = (!Gx1gh7); + assign Obtfh7 = (!Mx1gh7); + assign I5zfh7 = (G6zfh7 & M6zfh7); + assign M6zfh7 = (Ietfh7 & Yctfh7); + assign Yctfh7 = (!Sx1gh7); + assign Ietfh7 = (!Yx1gh7); + assign G6zfh7 = (Chtfh7 & Sftfh7); + assign Sftfh7 = (!Ey1gh7); + assign Chtfh7 = (!Ky1gh7); + assign Qyyfh7 = (~(S6zfh7 | Y6zfh7)); + assign Vkqfh7 = (~(E7zfh7 & K7zfh7)); + assign E7zfh7 = (Q7zfh7 & W7zfh7); + assign Mlqfh7 = (~(C8zfh7 & I8zfh7)); + assign I8zfh7 = (O8zfh7 & Yrxfh7); + assign O8zfh7 = (U8zfh7 | Grxfh7); + assign C8zfh7 = (Uqxfh7 & Srxfh7); + assign Uqxfh7 = (A9zfh7 & G9zfh7); + assign G9zfh7 = (M9zfh7 & S9zfh7); + assign S9zfh7 = (Y9zfh7 & Eazfh7); + assign Y9zfh7 = (Kazfh7 & Sfxfh7); + assign A9zfh7 = (Qazfh7 & Wazfh7); + assign Wazfh7 = (Cbzfh7 & Ibzfh7); + assign Qazfh7 = (Yiyfh7 & Obzfh7); + assign Obzfh7 = (~(Ubzfh7 & W1wfh7)); + assign W1wfh7 = (!Aczfh7); + assign Dmqfh7 = (~(Gczfh7 & Mczfh7)); + assign Mczfh7 = (Sczfh7 | S32gh7); + assign Gczfh7 = (E4wfh7 | Otxfh7); + assign Umqfh7 = (~(Yczfh7 & Edzfh7)); + assign Edzfh7 = (~(Kdzfh7 & Ubzfh7)); + assign Yczfh7 = (Qdzfh7 | M32gh7); + assign Lnqfh7 = (~(Wdzfh7 & Cezfh7)); + assign Cezfh7 = (~(Iezfh7 & Oezfh7)); + assign Coqfh7 = (~(Ibzfh7 & Uezfh7)); + assign Uezfh7 = (Afzfh7 | C22gh7); + assign Ibzfh7 = (~(Gfzfh7 & Mfzfh7)); + assign Mfzfh7 = (Sfzfh7 & Yfzfh7); + assign Gfzfh7 = (stdio_rx_tvalid & com_tx_tready); + assign Toqfh7 = (~(M9zfh7 & Egzfh7)); + assign Egzfh7 = (Afzfh7 | G02gh7); + assign M9zfh7 = (~(Y6zfh7 | Kgzfh7)); + assign Kgzfh7 = (Qgzfh7 & Wgzfh7); + assign Wgzfh7 = (Chzfh7 & Qvsfh7); + assign Chzfh7 = (Ihzfh7 & Ozyfh7); + assign Qgzfh7 = (Ohzfh7 & Uhzfh7); + assign Uhzfh7 = (~(Aizfh7 & Gizfh7)); + assign Ohzfh7 = (!Kpvfh7); + assign Kpvfh7 = (~(Kvsfh7 & Mizfh7)); + assign Mizfh7 = (~(Sizfh7 & Yizfh7)); + assign Yizfh7 = (Ejzfh7 & Kjzfh7); + assign Sizfh7 = (Iz1gh7 & Qy1gh7); + assign Y6zfh7 = (~(S6zfh7 | Kvsfh7)); + assign Kvsfh7 = (!M0wfh7); + assign S6zfh7 = (~(Qjzfh7 & Wjzfh7)); + assign Wjzfh7 = (Ckzfh7 & Ikzfh7); + assign Ckzfh7 = (Okzfh7 & Yusfh7); + assign Qjzfh7 = (Ukzfh7 & Alzfh7); + assign Ukzfh7 = (G0wfh7 & U8zfh7); + assign G0wfh7 = (Glzfh7 & Mlzfh7); + assign Mlzfh7 = (Slzfh7 & Ylzfh7); + assign Ylzfh7 = (Emzfh7 & Czufh7); + assign Emzfh7 = (K4wfh7 & Q1wfh7); + assign Slzfh7 = (Y3xfh7 & S6xfh7); + assign Glzfh7 = (Kmzfh7 & Qmzfh7); + assign Qmzfh7 = (Wmzfh7 & K4xfh7); + assign Wmzfh7 = (Sfxfh7 & Wgxfh7); + assign Kmzfh7 = (Aczfh7 & Srxfh7); + assign Kpqfh7 = (~(Yiyfh7 & Cnzfh7)); + assign Cnzfh7 = (Qdzfh7 | U82gh7); + assign Yiyfh7 = (Inzfh7 & Onzfh7); + assign Onzfh7 = (Czufh7 & Q1wfh7); + assign Q1wfh7 = (~(Unzfh7 & Aozfh7)); + assign Unzfh7 = (Gozfh7 & Mozfh7); + assign Mozfh7 = (!A92gh7); + assign Czufh7 = (~(Sozfh7 & Yozfh7)); + assign Yozfh7 = (~(Epzfh7 | E72gh7)); + assign Sozfh7 = (Kpzfh7 & Qpzfh7); + assign Inzfh7 = (Wpzfh7 & Cqzfh7); + assign Cqzfh7 = (~(Iqzfh7 & Oqzfh7)); + assign Oqzfh7 = (!K4wfh7); + assign Wpzfh7 = (~(Miyfh7 & Uqzfh7)); + assign Miyfh7 = (!S6xfh7); + assign Bqqfh7 = (~(Qjufh7 & Arzfh7)); + assign Arzfh7 = (~(Grzfh7 & Iqzfh7)); + assign Grzfh7 = (!Yusfh7); + assign Qjufh7 = (!Kyyfh7); + assign Kyyfh7 = (Mrzfh7 & Qy1gh7); + assign Mrzfh7 = (Srzfh7 & Yrzfh7); + assign Sqqfh7 = (~(Eszfh7 & Kszfh7)); + assign Kszfh7 = (~(Qszfh7 & Ubzfh7)); + assign Eszfh7 = (Qdzfh7 | G32gh7); + assign Jrqfh7 = (~(Wszfh7 & Ctzfh7)); + assign Ctzfh7 = (Afzfh7 | A02gh7); + assign Asqfh7 = (~(W7zfh7 & Itzfh7)); + assign Itzfh7 = (Afzfh7 | S02gh7); + assign W7zfh7 = (~(Otzfh7 & O2yfh7)); + assign Otzfh7 = (stdio_tx_tready & U2yfh7); + assign Rsqfh7 = (~(Utzfh7 & Auzfh7)); + assign Auzfh7 = (Afzfh7 | A62gh7); + assign Utzfh7 = (~(Guzfh7 & com_rx_tvalid)); + assign Itqfh7 = (~(Muzfh7 & Suzfh7)); + assign Suzfh7 = (Yuzfh7 & Evzfh7); + assign Evzfh7 = (~(Grxfh7 & Kvzfh7)); + assign Kvzfh7 = (~(Qvzfh7 & Wvzfh7)); + assign Wvzfh7 = (A3xfh7 | W72gh7); + assign Yuzfh7 = (Cwzfh7 & Iwzfh7); + assign Iwzfh7 = (~(Owzfh7 & O2yfh7)); + assign Owzfh7 = (U2yfh7 & Uwzfh7); + assign Cwzfh7 = (~(Axzfh7 & Gxzfh7)); + assign Gxzfh7 = (~(M0wfh7 & Mxzfh7)); + assign Mxzfh7 = (Sxzfh7 | Alzfh7); + assign Muzfh7 = (Yxzfh7 & Eyzfh7); + assign Eyzfh7 = (Ikzfh7 | Kyzfh7); + assign Kyzfh7 = (!Uqzfh7); + assign Yxzfh7 = (Qyzfh7 | A32gh7); + assign Ztqfh7 = (~(Eazfh7 & Wyzfh7)); + assign Wyzfh7 = (Afzfh7 | Y62gh7); + assign Eazfh7 = (~(Czzfh7 & Izzfh7)); + assign Izzfh7 = (Ejzfh7 & Yrzfh7); + assign Ejzfh7 = (~(Cz1gh7 | Wy1gh7)); + assign Czzfh7 = (Ozzfh7 & Iz1gh7); + assign Ozzfh7 = (Qy1gh7 & Kjzfh7); + assign Quqfh7 = (~(Wsxfh7 & Uzzfh7)); + assign Uzzfh7 = (Afzfh7 | I52gh7); + assign Wsxfh7 = (~(A00gh7 & G00gh7)); + assign G00gh7 = (~(C82gh7 | Iz1gh7)); + assign A00gh7 = (Yrzfh7 & Aizfh7); + assign Hvqfh7 = (~(Izyfh7 | Ihzfh7)); + assign Yvqfh7 = (~(M00gh7 & K7zfh7)); + assign K7zfh7 = (~(S00gh7 & stdio_tx_tready)); + assign M00gh7 = (Afzfh7 | W42gh7); + assign Pwqfh7 = (Y00gh7 & E10gh7); + assign E10gh7 = (Aizfh7 & Qvsfh7); + assign Y00gh7 = (C82gh7 & Yrzfh7); + assign Gxqfh7 = (~(K10gh7 & Ksxfh7)); + assign Ksxfh7 = (Izyfh7 | Qvsfh7); + assign Qvsfh7 = (~(Q10gh7 & Iz1gh7)); + assign Q10gh7 = (C82gh7 & Aizfh7); + assign Aizfh7 = (W10gh7 & C20gh7); + assign C20gh7 = (I20gh7 & Essfh7); + assign I20gh7 = (~(Cz1gh7 | Qy1gh7)); + assign W10gh7 = (Wy1gh7 & Uz1gh7); + assign Izyfh7 = (~(Yrzfh7 & O20gh7)); + assign O20gh7 = (~(Qy1gh7 & Srzfh7)); + assign Srzfh7 = (!Ihzfh7); + assign Ihzfh7 = (~(U20gh7 & A30gh7)); + assign A30gh7 = (Wy1gh7 & Gizfh7); + assign Gizfh7 = (!Iz1gh7); + assign U20gh7 = (Cz1gh7 & Kjzfh7); + assign Kjzfh7 = (G30gh7 & C82gh7); + assign G30gh7 = (Uz1gh7 & Essfh7); + assign Essfh7 = (!Oz1gh7); + assign Yrzfh7 = (~(M0wfh7 | Axzfh7)); + assign M0wfh7 = (~(M30gh7 & S30gh7)); + assign S30gh7 = (~(Q72gh7 | U52gh7)); + assign M30gh7 = (G62gh7 & Y30gh7); + assign K10gh7 = (E40gh7 | Afzfh7); + assign Xxqfh7 = (K40gh7 & Gusfh7); + assign Gusfh7 = (!Q40gh7); + assign K40gh7 = (~(Sxzfh7 | Alzfh7)); + assign Oyqfh7 = (~(W40gh7 & Yiufh7)); + assign Yiufh7 = (~(Utsfh7 & Q40gh7)); + assign Utsfh7 = (C50gh7 & I50gh7); + assign I50gh7 = (O50gh7 & Ozyfh7); + assign O50gh7 = (~(U50gh7 & A60gh7)); + assign U50gh7 = (M6ufh7 & G60gh7); + assign C50gh7 = (Kaufh7 & Siufh7); + assign W40gh7 = (Afzfh7 | O52gh7); + assign Fzqfh7 = (~(M60gh7 & S60gh7)); + assign S60gh7 = (Afzfh7 | G62gh7); + assign M60gh7 = (~(Sfzfh7 & com_rx_tvalid)); + assign Sfzfh7 = (!Wgxfh7); + assign Wzqfh7 = (~(Y60gh7 & E70gh7)); + assign E70gh7 = (Otxfh7 | K70gh7); + assign Y60gh7 = (~(Iezfh7 & Q70gh7)); + assign N0rfh7 = (~(W70gh7 & C80gh7)); + assign C80gh7 = (Yrxfh7 | Otxfh7); + assign Yrxfh7 = (~(W72gh7 & I80gh7)); + assign W70gh7 = (Afzfh7 | S62gh7); + assign E1rfh7 = (!O80gh7); + assign O80gh7 = (Grxfh7 ? Qpvfh7 : U80gh7); + assign U80gh7 = (A90gh7 | Q42gh7); + assign V1rfh7 = (~(G90gh7 & M90gh7)); + assign M90gh7 = (Grxfh7 ? E4xfh7 : S90gh7); + assign S90gh7 = (~(Y90gh7 & Ea0gh7)); + assign G90gh7 = (Cbzfh7 & Kazfh7); + assign Kazfh7 = (~(Ka0gh7 & O2yfh7)); + assign O2yfh7 = (~(Y3xfh7 | Sxzfh7)); + assign Sxzfh7 = (!Siufh7); + assign Ka0gh7 = (!U2yfh7); + assign U2yfh7 = (~(Qa0gh7 & Wa0gh7)); + assign Wa0gh7 = (Cb0gh7 & Ib0gh7); + assign Cb0gh7 = (Otsfh7 & Obufh7); + assign Qa0gh7 = (Ob0gh7 & A9ufh7); + assign Ob0gh7 = (com_rx_tdata[4] & com_rx_tdata[3]); + assign Cbzfh7 = (~(S00gh7 & Uwzfh7)); + assign Uwzfh7 = (!stdio_tx_tready); + assign S00gh7 = (!K4xfh7); + assign K4xfh7 = (~(Ub0gh7 & Ac0gh7)); + assign Ac0gh7 = (W42gh7 & Gc0gh7); + assign M2rfh7 = (!Mc0gh7); + assign Mc0gh7 = (Grxfh7 ? S6wfh7 : Sc0gh7); + assign Sc0gh7 = (A90gh7 | Y32gh7); + assign D3rfh7 = (!Yc0gh7); + assign Yc0gh7 = (Grxfh7 ? W7xfh7 : Ed0gh7); + assign Ed0gh7 = (~(Kd0gh7 & Qd0gh7)); + assign U3rfh7 = (!Wd0gh7); + assign Wd0gh7 = (Grxfh7 ? I5wfh7 : Ce0gh7); + assign Ce0gh7 = (Ie0gh7 | U22gh7); + assign L4rfh7 = (!Oe0gh7); + assign Oe0gh7 = (Grxfh7 ? Yfwfh7 : Ue0gh7); + assign Ue0gh7 = (~(Af0gh7 & Gf0gh7)); + assign C5rfh7 = (!Mf0gh7); + assign Mf0gh7 = (Grxfh7 ? Yf0gh7 : Sf0gh7); + assign Sf0gh7 = (~(Eg0gh7 & Kg0gh7)); + assign T5rfh7 = (!Qg0gh7); + assign Qg0gh7 = (Grxfh7 ? Inxfh7 : Wg0gh7); + assign Wg0gh7 = (~(Af0gh7 & Ch0gh7)); + assign Af0gh7 = (Y90gh7 | Evvfh7); + assign K6rfh7 = (!Ih0gh7); + assign Ih0gh7 = (Grxfh7 ? Uh0gh7 : Oh0gh7); + assign Oh0gh7 = (~(Ai0gh7 & Gi0gh7)); + assign B7rfh7 = (!Mi0gh7); + assign Mi0gh7 = (Grxfh7 ? Moxfh7 : Si0gh7); + assign Si0gh7 = (Yi0gh7 | I82gh7); + assign S7rfh7 = (!Ej0gh7); + assign Ej0gh7 = (Grxfh7 ? Kvwfh7 : Moxfh7); + assign J8rfh7 = (~(Kj0gh7 & Qj0gh7)); + assign Qj0gh7 = (Sczfh7 | Y02gh7); + assign Sczfh7 = (~(Otxfh7 & Wj0gh7)); + assign Wj0gh7 = (~(A90gh7 & Kvwfh7)); + assign A90gh7 = (U8zfh7 & E4xfh7); + assign Kj0gh7 = (Y6xfh7 | Otxfh7); + assign A9rfh7 = (~(Ck0gh7 & Sfxfh7)); + assign Sfxfh7 = (~(Ik0gh7 & Ok0gh7)); + assign Ok0gh7 = (~(Uk0gh7 | M62gh7)); + assign Ck0gh7 = (Grxfh7 ? Iexfh7 : Al0gh7); + assign Al0gh7 = (~(Gl0gh7 & Ml0gh7)); + assign R9rfh7 = (~(Afzfh7 | M62gh7)); + assign Afzfh7 = (~(Sl0gh7 | Iezfh7)); + assign Iezfh7 = (~(Yl0gh7 & Em0gh7)); + assign Em0gh7 = (Km0gh7 & Qm0gh7); + assign Qm0gh7 = (~(Wm0gh7 & Wdufh7)); + assign Wdufh7 = (!Cn0gh7); + assign Wm0gh7 = (Q40gh7 & Ozyfh7); + assign Km0gh7 = (In0gh7 & Qyzfh7); + assign Qyzfh7 = (~(On0gh7 & Un0gh7)); + assign Un0gh7 = (~(stdio_rx_tvalid & Ao0gh7)); + assign Ao0gh7 = (Wgxfh7 | com_tx_tready); + assign On0gh7 = (Go0gh7 & Yfzfh7); + assign In0gh7 = (~(Mo0gh7 & So0gh7)); + assign So0gh7 = (A60gh7 & G60gh7); + assign G60gh7 = (Yo0gh7 & Qssfh7); + assign Yo0gh7 = (Obufh7 ? com_rx_tdata[0] : Ctsfh7); + assign A60gh7 = (~(Ep0gh7 | Ihufh7)); + assign Ihufh7 = (com_rx_tdata[0] & Ctsfh7); + assign Ep0gh7 = (!Ib0gh7); + assign Mo0gh7 = (Kaufh7 & M6ufh7); + assign Kaufh7 = (!Kp0gh7); + assign Yl0gh7 = (Qp0gh7 & Wp0gh7); + assign Qp0gh7 = (Qsxfh7 & Q7zfh7); + assign Q7zfh7 = (Cq0gh7 | Uqzfh7); + assign Uqzfh7 = (stdio_tx_tvalid & stdio_tx_tready); + assign Cq0gh7 = (Ikzfh7 & S6xfh7); + assign S6xfh7 = (~(Ub0gh7 & Iq0gh7)); + assign Iq0gh7 = (~(Gc0gh7 | W42gh7)); + assign Gc0gh7 = (!C52gh7); + assign Ub0gh7 = (Oq0gh7 & Uq0gh7); + assign Ikzfh7 = (~(Ar0gh7 & Gr0gh7)); + assign Ar0gh7 = (M02gh7 & Mr0gh7); + assign Qsxfh7 = (Sr0gh7 | Iqzfh7); + assign Sr0gh7 = (K4wfh7 & Yusfh7); + assign Yusfh7 = (~(Yr0gh7 & Es0gh7)); + assign Es0gh7 = (Ks0gh7 & Qpzfh7); + assign Ks0gh7 = (~(Epzfh7 | I52gh7)); + assign Epzfh7 = (!Qs0gh7); + assign Yr0gh7 = (Ws0gh7 & Oq0gh7); + assign Ws0gh7 = (Ct0gh7 & E72gh7); + assign K4wfh7 = (~(It0gh7 & Ot0gh7)); + assign It0gh7 = (Q72gh7 & G62gh7); + assign Sl0gh7 = (~(Ut0gh7 & Qdzfh7)); + assign Qdzfh7 = (~(Au0gh7 & Otxfh7)); + assign Otxfh7 = (!Grxfh7); + assign Au0gh7 = (~(U8zfh7 & Srxfh7)); + assign Srxfh7 = (~(Gl0gh7 | Gu0gh7)); + assign Gu0gh7 = (!Iexfh7); + assign Iexfh7 = (~(Mu0gh7 & Su0gh7)); + assign Mu0gh7 = (~(Yu0gh7 | U82gh7)); + assign Gl0gh7 = (~(Ev0gh7 & Kv0gh7)); + assign Kv0gh7 = (Egxfh7 & E4wfh7); + assign E4wfh7 = (~(Qv0gh7 & Wv0gh7)); + assign Wv0gh7 = (Cw0gh7 & S32gh7); + assign Cw0gh7 = (~(Oezfh7 | M32gh7)); + assign Qv0gh7 = (Su0gh7 & U82gh7); + assign Egxfh7 = (Iw0gh7 & Ow0gh7); + assign Ow0gh7 = (Y6xfh7 & Moxfh7); + assign Moxfh7 = (~(Uw0gh7 & Gr0gh7)); + assign Gr0gh7 = (Ax0gh7 & Gx0gh7); + assign Ax0gh7 = (~(Mx0gh7 | Sx0gh7)); + assign Uw0gh7 = (S02gh7 & Yx0gh7); + assign Yx0gh7 = (!M02gh7); + assign Y6xfh7 = (~(Ey0gh7 & Ky0gh7)); + assign Ky0gh7 = (~(Qy0gh7 | I22gh7)); + assign Ey0gh7 = (~(Wy0gh7 | Mx0gh7)); + assign Mx0gh7 = (!A02gh7); + assign Iw0gh7 = (Yi0gh7 & Kvwfh7); + assign Kvwfh7 = (~(Cz0gh7 & Iz0gh7)); + assign Cz0gh7 = (~(Gf0gh7 | Y02gh7)); + assign Yi0gh7 = (~(Eg0gh7 | Evvfh7)); + assign Evvfh7 = (!Yf0gh7); + assign Yf0gh7 = (~(Oz0gh7 & Uz0gh7)); + assign Oz0gh7 = (A01gh7 & Ch0gh7); + assign Ch0gh7 = (!W12gh7); + assign Eg0gh7 = (Ai0gh7 | Wvvfh7); + assign Wvvfh7 = (!Uh0gh7); + assign Uh0gh7 = (~(G01gh7 & M01gh7)); + assign M01gh7 = (~(S01gh7 | I82gh7)); + assign Ai0gh7 = (~(Yfwfh7 & Inxfh7)); + assign Inxfh7 = (~(Y01gh7 & E11gh7)); + assign E11gh7 = (Q12gh7 & Gi0gh7); + assign Yfwfh7 = (~(Y01gh7 & K11gh7)); + assign K11gh7 = (K12gh7 & Kg0gh7); + assign Y01gh7 = (Uz0gh7 & W12gh7); + assign Uz0gh7 = (G01gh7 & Q11gh7); + assign Q11gh7 = (W11gh7 & I82gh7); + assign Ev0gh7 = (~(C21gh7 | Y90gh7)); + assign Y90gh7 = (~(Ie0gh7 & I5wfh7)); + assign I5wfh7 = (~(I21gh7 & Iz0gh7)); + assign Iz0gh7 = (G01gh7 & O21gh7); + assign O21gh7 = (U21gh7 & I82gh7); + assign G01gh7 = (A31gh7 & G02gh7); + assign I21gh7 = (Y02gh7 & Gf0gh7); + assign Gf0gh7 = (!E12gh7); + assign Ie0gh7 = (~(Kd0gh7 | Oqvfh7)); + assign Oqvfh7 = (!W7xfh7); + assign W7xfh7 = (~(G31gh7 & M31gh7)); + assign G31gh7 = (~(Qd0gh7 | U22gh7)); + assign Kd0gh7 = (~(Qpvfh7 & S6wfh7)); + assign S6wfh7 = (~(S31gh7 & M31gh7)); + assign M31gh7 = (Y31gh7 & E41gh7); + assign S31gh7 = (U22gh7 & Qd0gh7); + assign Qd0gh7 = (!O22gh7); + assign Qpvfh7 = (~(K41gh7 & Q41gh7)); + assign Q41gh7 = (Y32gh7 & Ea0gh7); + assign C21gh7 = (!E4xfh7); + assign E4xfh7 = (W41gh7 & C51gh7); + assign C51gh7 = (~(K41gh7 & I51gh7)); + assign I51gh7 = (~(Ea0gh7 | Y32gh7)); + assign Ea0gh7 = (!E42gh7); + assign K41gh7 = (O51gh7 & U51gh7); + assign W41gh7 = (~(A61gh7 & G61gh7)); + assign G61gh7 = (~(S01gh7 | G02gh7)); + assign S01gh7 = (!M61gh7); + assign A61gh7 = (A31gh7 & I82gh7); + assign A31gh7 = (S61gh7 & Y61gh7); + assign Y61gh7 = (M02gh7 & S02gh7); + assign S61gh7 = (Gx0gh7 & A02gh7); + assign U8zfh7 = (E71gh7 & K71gh7); + assign K71gh7 = (~(I80gh7 | Q71gh7)); + assign I80gh7 = (!A3xfh7); + assign A3xfh7 = (~(W71gh7 & C81gh7)); + assign C81gh7 = (K42gh7 & I81gh7); + assign E71gh7 = (Qvzfh7 & K70gh7); + assign K70gh7 = (O81gh7 & U81gh7); + assign U81gh7 = (~(Ik0gh7 & A91gh7)); + assign A91gh7 = (M62gh7 & Uk0gh7); + assign Ik0gh7 = (G91gh7 & A62gh7); + assign O81gh7 = (~(M91gh7 & S91gh7)); + assign M91gh7 = (~(Oezfh7 | S32gh7)); + assign Qvzfh7 = (Y91gh7 & Ea1gh7); + assign Ea1gh7 = (~(Ka1gh7 & Qa1gh7)); + assign Qa1gh7 = (~(Wa1gh7 | Y62gh7)); + assign Y91gh7 = (~(Cb1gh7 & Ib1gh7)); + assign Ib1gh7 = (~(Ob1gh7 | G32gh7)); + assign Iarfh7 = (~(Ub1gh7 & Ac1gh7)); + assign Ac1gh7 = (~(com_rx_tvalid & Go0gh7)); + assign Go0gh7 = (~(Okzfh7 & Wgxfh7)); + assign Wgxfh7 = (~(W71gh7 & Gc1gh7)); + assign Gc1gh7 = (Q42gh7 & Q70gh7); + assign W71gh7 = (O51gh7 & Mc1gh7); + assign O51gh7 = (Sc1gh7 & Yc1gh7); + assign Okzfh7 = (!Guzfh7); + assign Ub1gh7 = (Ut0gh7 & Ed1gh7); + assign Ed1gh7 = (~(Kd1gh7 & Q40gh7)); + assign Q40gh7 = (~(Qd1gh7 & Wd1gh7)); + assign Wd1gh7 = (Ce1gh7 & Ie1gh7); + assign Ie1gh7 = (~(com_rx_tdata[2] & Grsfh7)); + assign Grsfh7 = (!com_rx_tdata[0]); + assign Ce1gh7 = (~(A9ufh7 | M6ufh7)); + assign M6ufh7 = (Musfh7 & Otsfh7); + assign Otsfh7 = (!com_rx_tdata[2]); + assign A9ufh7 = (com_rx_tdata[1] & com_rx_tdata[0]); + assign Qd1gh7 = (~(Ctsfh7 | Oe1gh7)); + assign Kd1gh7 = (~(Axzfh7 | Alzfh7)); + assign Axzfh7 = (!Ozyfh7); + assign Ozyfh7 = (~(Ue1gh7 & Af1gh7)); + assign Af1gh7 = (Musfh7 & Ctsfh7); + assign Ctsfh7 = (!com_rx_tdata[3]); + assign Musfh7 = (!com_rx_tdata[1]); + assign Ue1gh7 = (~(Oe1gh7 | com_rx_tdata[0])); + assign Oe1gh7 = (~(Gf1gh7 & Ib0gh7)); + assign Ib0gh7 = (~(com_rx_tdata[6] | com_rx_tdata[7])); + assign Gf1gh7 = (Qssfh7 & Obufh7); + assign Obufh7 = (!com_rx_tdata[5]); + assign Qssfh7 = (!com_rx_tdata[4]); + assign Ut0gh7 = (Mf1gh7 | Siufh7); + assign Siufh7 = (com_rx_tvalid & com_rx_tready); + assign Mf1gh7 = (Alzfh7 & Y3xfh7); + assign Y3xfh7 = (~(Sf1gh7 & Yf1gh7)); + assign Yf1gh7 = (~(Uk0gh7 | A62gh7)); + assign Uk0gh7 = (!S62gh7); + assign Sf1gh7 = (G91gh7 & M62gh7); + assign G91gh7 = (Eg1gh7 & Kg1gh7); + assign Kg1gh7 = (Qg1gh7 & Uq0gh7); + assign Qg1gh7 = (~(Wg1gh7 | Q72gh7)); + assign Eg1gh7 = (Ch1gh7 & G62gh7); + assign Ch1gh7 = (U52gh7 & O52gh7); + assign Alzfh7 = (Cn0gh7 & Kp0gh7); + assign Kp0gh7 = (~(Ot0gh7 & Ih1gh7)); + assign Ih1gh7 = (~(Q72gh7 | G62gh7)); + assign Ot0gh7 = (U52gh7 & Y30gh7); + assign Y30gh7 = (Oh1gh7 & Uh1gh7); + assign Uh1gh7 = (Ai1gh7 & S62gh7); + assign Ai1gh7 = (Uq0gh7 & Ct0gh7); + assign Oh1gh7 = (Gi1gh7 & O52gh7); + assign Gi1gh7 = (A62gh7 & M62gh7); + assign Cn0gh7 = (~(Mi1gh7 & Si1gh7)); + assign Si1gh7 = (~(Wg1gh7 | O52gh7)); + assign Wg1gh7 = (!Ct0gh7); + assign Mi1gh7 = (Yi1gh7 & Uq0gh7); + assign Uq0gh7 = (Ej1gh7 & Kj1gh7); + assign Kj1gh7 = (Qpzfh7 & Qs0gh7); + assign Ej1gh7 = (I52gh7 & E72gh7); + assign Zarfh7 = (~(Qj1gh7 & Wdzfh7)); + assign Wdzfh7 = (~(Q71gh7 & Grxfh7)); + assign Grxfh7 = (com_tx_tready & com_tx_tvalid); + assign Q71gh7 = (Wj1gh7 & Ck1gh7); + assign Ck1gh7 = (Ik1gh7 & Ok1gh7); + assign Ok1gh7 = (~(Qy0gh7 | C22gh7)); + assign Ik1gh7 = (A02gh7 & I22gh7); + assign Wj1gh7 = (Uk1gh7 & Al1gh7); + assign Uk1gh7 = (Qpzfh7 & Y62gh7); + assign Qj1gh7 = (Wp0gh7 & Wszfh7); + assign Wszfh7 = (~(Gl1gh7 & Guzfh7)); + assign Guzfh7 = (Cb1gh7 & Ml1gh7); + assign Ml1gh7 = (G32gh7 & Ob1gh7); + assign Ob1gh7 = (!A32gh7); + assign Cb1gh7 = (Aozfh7 & A92gh7); + assign Aozfh7 = (Sl1gh7 & Yl1gh7); + assign Sl1gh7 = (U82gh7 & Em1gh7); + assign Gl1gh7 = (stdio_rx_tvalid & Yfzfh7); + assign Yfzfh7 = (!com_rx_tvalid); + assign Wp0gh7 = (Ubzfh7 | Aczfh7); + assign Aczfh7 = (~(Qszfh7 | Kdzfh7)); + assign Kdzfh7 = (Km1gh7 & S91gh7); + assign S91gh7 = (Qm1gh7 & Su0gh7); + assign Su0gh7 = (Wm1gh7 & Yl1gh7); + assign Yl1gh7 = (Cn1gh7 & Sc1gh7); + assign Sc1gh7 = (Y31gh7 & In1gh7); + assign Y31gh7 = (Al1gh7 & Qs0gh7); + assign Qs0gh7 = (~(On1gh7 | Wa1gh7)); + assign Wa1gh7 = (~(Un1gh7 & Ao1gh7)); + assign Ao1gh7 = (~(Ml0gh7 | Qy0gh7)); + assign Un1gh7 = (A02gh7 & C22gh7); + assign On1gh7 = (!Y62gh7); + assign Wm1gh7 = (A92gh7 & Gozfh7); + assign Qm1gh7 = (U82gh7 & M32gh7); + assign Km1gh7 = (S32gh7 & Oezfh7); + assign Oezfh7 = (!O82gh7); + assign Qszfh7 = (Go1gh7 & Gx0gh7); + assign Gx0gh7 = (~(Wy0gh7 | Ml0gh7)); + assign Ml0gh7 = (!I22gh7); + assign Wy0gh7 = (~(Ka1gh7 & Mo1gh7)); + assign Mo1gh7 = (Y62gh7 & C22gh7); + assign Ka1gh7 = (Al1gh7 & Qpzfh7); + assign Qpzfh7 = (In1gh7 & E41gh7); + assign E41gh7 = (Cn1gh7 & Yc1gh7); + assign Yc1gh7 = (So1gh7 & Yo1gh7); + assign Yo1gh7 = (Em1gh7 & Gozfh7); + assign Gozfh7 = (A32gh7 & G32gh7); + assign Em1gh7 = (!Yu0gh7); + assign Yu0gh7 = (~(Ep1gh7 & M32gh7)); + assign Ep1gh7 = (S32gh7 & O82gh7); + assign So1gh7 = (U82gh7 & A92gh7); + assign Cn1gh7 = (U51gh7 & Mc1gh7); + assign Mc1gh7 = (Y32gh7 & E42gh7); + assign U51gh7 = (~(Q70gh7 | I81gh7)); + assign I81gh7 = (!Q42gh7); + assign Q70gh7 = (!K42gh7); + assign In1gh7 = (O22gh7 & U22gh7); + assign Al1gh7 = (Kpzfh7 & E72gh7); + assign Kpzfh7 = (Kp1gh7 & Oq0gh7); + assign Oq0gh7 = (Yi1gh7 & O52gh7); + assign Yi1gh7 = (Qp1gh7 & Wp1gh7); + assign Wp1gh7 = (Cq1gh7 & M62gh7); + assign Cq1gh7 = (S62gh7 & E40gh7); + assign E40gh7 = (!Q72gh7); + assign Qp1gh7 = (Iq1gh7 & G62gh7); + assign Iq1gh7 = (U52gh7 & A62gh7); + assign Kp1gh7 = (Ct0gh7 & I52gh7); + assign Ct0gh7 = (W42gh7 & C52gh7); + assign Go1gh7 = (~(Qy0gh7 | A02gh7)); + assign Qy0gh7 = (~(Oq1gh7 & M02gh7)); + assign Oq1gh7 = (~(Mr0gh7 | Sx0gh7)); + assign Sx0gh7 = (~(Uq1gh7 & G02gh7)); + assign Uq1gh7 = (I82gh7 & M61gh7); + assign M61gh7 = (W11gh7 & U21gh7); + assign U21gh7 = (W12gh7 & A01gh7); + assign A01gh7 = (~(Gi0gh7 | Kg0gh7)); + assign Kg0gh7 = (!Q12gh7); + assign Gi0gh7 = (!K12gh7); + assign W11gh7 = (Y02gh7 & E12gh7); + assign Mr0gh7 = (!S02gh7); + assign Ubzfh7 = (stdio_rx_tready & stdio_rx_tvalid); + assign Ivrfh7 = (Iqzfh7 & Yvrfh7); + assign Iqzfh7 = (Ar1gh7 & ahb_hready); + assign Ar1gh7 = (~(G92gh7 | K72gh7)); + + always @(posedge Iqsfh7 or negedge Wpsfh7) if (~Wpsfh7) begin + M92gh7 <= 1'b0; + end + else + begin + M92gh7 <= N0sfh7; + end + always @(posedge Iqsfh7 or negedge Wpsfh7) if (~Wpsfh7) begin + Ma2gh7 <= 1'b0; + end + else + begin + Ma2gh7 <= Bqqfh7; + end + always @(posedge Iqsfh7 or negedge Wpsfh7) if (~Wpsfh7) begin + Pb2gh7 <= 1'b0; + end + else + begin + Pb2gh7 <= Kpqfh7; + end + always @(posedge Iqsfh7 or negedge Wpsfh7) if (~Wpsfh7) begin + Sc2gh7 <= 1'b1; + end + else + begin + Sc2gh7 <= R9rfh7; + end + always @(posedge Iqsfh7 or negedge Wpsfh7) if (~Wpsfh7) begin + Ud2gh7 <= 1'b0; + end + else + begin + Ud2gh7 <= Zarfh7; + end + always @(posedge Iqsfh7 or negedge Wpsfh7) if (~Wpsfh7) begin + Ue2gh7 <= 1'b0; + end + else + begin + Ue2gh7 <= Lnqfh7; + end + always @(posedge Iqsfh7 or negedge Wpsfh7) if (~Wpsfh7) begin + Xf2gh7 <= 1'b0; + end + else + begin + Xf2gh7 <= Mlqfh7; + end + always @(posedge Iqsfh7 or negedge Wpsfh7) if (~Wpsfh7) begin + Xg2gh7 <= 1'b0; + end + else + begin + Xg2gh7 <= Umqfh7; + end + always @(posedge Iqsfh7 or negedge Wpsfh7) if (~Wpsfh7) begin + Ai2gh7 <= 1'b0; + end + else + begin + Ai2gh7 <= Dmqfh7; + end + always @(posedge Iqsfh7 or negedge Wpsfh7) if (~Wpsfh7) begin + Dj2gh7 <= 1'b0; + end + else + begin + Dj2gh7 <= A9rfh7; + end + always @(posedge Iqsfh7 or negedge Wpsfh7) if (~Wpsfh7) begin + Fk2gh7 <= 1'b0; + end + else + begin + Fk2gh7 <= J8rfh7; + end + always @(posedge Iqsfh7 or negedge Wpsfh7) if (~Wpsfh7) begin + Hl2gh7 <= 1'b0; + end + else + begin + Hl2gh7 <= B7rfh7; + end + always @(posedge Iqsfh7 or negedge Wpsfh7) if (~Wpsfh7) begin + Jm2gh7 <= 1'b0; + end + else + begin + Jm2gh7 <= S7rfh7; + end + always @(posedge Iqsfh7 or negedge Wpsfh7) if (~Wpsfh7) begin + Ln2gh7 <= 1'b0; + end + else + begin + Ln2gh7 <= Rsqfh7; + end + always @(posedge Iqsfh7 or negedge Wpsfh7) if (~Wpsfh7) begin + Oo2gh7 <= 1'b0; + end + else + begin + Oo2gh7 <= Jrqfh7; + end + always @(posedge Iqsfh7 or negedge Wpsfh7) if (~Wpsfh7) begin + Rp2gh7 <= 1'b0; + end + else + begin + Rp2gh7 <= Iarfh7; + end + always @(posedge Iqsfh7 or negedge Wpsfh7) if (~Wpsfh7) begin + Rq2gh7 <= 1'b0; + end + else + begin + Rq2gh7 <= Dksfh7; + end + always @(posedge Iqsfh7 or negedge Wpsfh7) if (~Wpsfh7) begin + Rr2gh7 <= 1'b0; + end + else + begin + Rr2gh7 <= Yjsfh7; + end + always @(posedge Iqsfh7 or negedge Wpsfh7) if (~Wpsfh7) begin + Rs2gh7 <= 1'b0; + end + else + begin + Rs2gh7 <= Tjsfh7; + end + always @(posedge Iqsfh7 or negedge Wpsfh7) if (~Wpsfh7) begin + Rt2gh7 <= 1'b0; + end + else + begin + Rt2gh7 <= Ojsfh7; + end + always @(posedge Iqsfh7 or negedge Wpsfh7) if (~Wpsfh7) begin + Ru2gh7 <= 1'b0; + end + else + begin + Ru2gh7 <= Jjsfh7; + end + always @(posedge Iqsfh7 or negedge Wpsfh7) if (~Wpsfh7) begin + Rv2gh7 <= 1'b0; + end + else + begin + Rv2gh7 <= Ejsfh7; + end + always @(posedge Iqsfh7 or negedge Wpsfh7) if (~Wpsfh7) begin + Rw2gh7 <= 1'b0; + end + else + begin + Rw2gh7 <= Zisfh7; + end + always @(posedge Iqsfh7 or negedge Wpsfh7) if (~Wpsfh7) begin + Rx2gh7 <= 1'b0; + end + else + begin + Rx2gh7 <= Quqfh7; + end + always @(posedge Iqsfh7 or negedge Wpsfh7) if (~Wpsfh7) begin + Uy2gh7 <= 1'b0; + end + else + begin + Uy2gh7 <= Toqfh7; + end + always @(posedge Iqsfh7 or negedge Wpsfh7) if (~Wpsfh7) begin + Xz2gh7 <= 1'b0; + end + else + begin + Xz2gh7 <= M2rfh7; + end + always @(posedge Iqsfh7 or negedge Wpsfh7) if (~Wpsfh7) begin + A13gh7 <= 1'b0; + end + else + begin + A13gh7 <= E1rfh7; + end + always @(posedge Iqsfh7 or negedge Wpsfh7) if (~Wpsfh7) begin + D23gh7 <= 1'b0; + end + else + begin + D23gh7 <= T5rfh7; + end + always @(posedge Iqsfh7 or negedge Wpsfh7) if (~Wpsfh7) begin + F33gh7 <= 1'b0; + end + else + begin + F33gh7 <= C5rfh7; + end + always @(posedge Iqsfh7 or negedge Wpsfh7) if (~Wpsfh7) begin + H43gh7 <= 1'b0; + end + else + begin + H43gh7 <= L4rfh7; + end + always @(posedge Iqsfh7 or negedge Wpsfh7) if (~Wpsfh7) begin + J53gh7 <= 1'b0; + end + else + begin + J53gh7 <= U3rfh7; + end + always @(posedge Iqsfh7 or negedge Wpsfh7) if (~Wpsfh7) begin + L63gh7 <= 1'b0; + end + else + begin + L63gh7 <= Fzqfh7; + end + always @(posedge Iqsfh7 or negedge Wpsfh7) if (~Wpsfh7) begin + O73gh7 <= 1'b0; + end + else + begin + O73gh7 <= Coqfh7; + end + always @(posedge Iqsfh7 or negedge Wpsfh7) if (~Wpsfh7) begin + R83gh7 <= 1'b0; + end + else + begin + R83gh7 <= Sqqfh7; + end + always @(posedge Iqsfh7 or negedge Wpsfh7) if (~Wpsfh7) begin + U93gh7 <= 1'b0; + end + else + begin + U93gh7 <= Itqfh7; + end + always @(posedge Iqsfh7 or negedge Wpsfh7) if (~Wpsfh7) begin + Xa3gh7 <= 1'b0; + end + else + begin + Xa3gh7 <= Wzqfh7; + end + always @(posedge Iqsfh7 or negedge Wpsfh7) if (~Wpsfh7) begin + Ac3gh7 <= 1'b1; + end + else + begin + Ac3gh7 <= I0sfh7; + end + always @(posedge Iqsfh7 or negedge Wpsfh7) if (~Wpsfh7) begin + Wc3gh7 <= 1'b0; + end + else + begin + Wc3gh7 <= N0rfh7; + end + always @(posedge Iqsfh7 or negedge Wpsfh7) if (~Wpsfh7) begin + Zd3gh7 <= 1'b0; + end + else + begin + Zd3gh7 <= Yvqfh7; + end + always @(posedge Iqsfh7 or negedge Wpsfh7) if (~Wpsfh7) begin + Cf3gh7 <= 1'b0; + end + else + begin + Cf3gh7 <= Oyqfh7; + end + always @(posedge Iqsfh7 or negedge Wpsfh7) if (~Wpsfh7) begin + Fg3gh7 <= 1'b0; + end + else + begin + Fg3gh7 <= Xxqfh7; + end + always @(posedge Iqsfh7 or negedge Wpsfh7) if (~Wpsfh7) begin + Ih3gh7 <= 1'b0; + end + else + begin + Ih3gh7 <= Hvqfh7; + end + always @(posedge Iqsfh7 or negedge Wpsfh7) if (~Wpsfh7) begin + Li3gh7 <= 1'b0; + end + else + begin + Li3gh7 <= Gxqfh7; + end + always @(posedge Iqsfh7 or negedge Wpsfh7) if (~Wpsfh7) begin + Oj3gh7 <= 1'b0; + end + else + begin + Oj3gh7 <= Asqfh7; + end + always @(posedge Iqsfh7 or negedge Wpsfh7) if (~Wpsfh7) begin + Rk3gh7 <= 1'b0; + end + else + begin + Rk3gh7 <= K6rfh7; + end + always @(posedge Iqsfh7 or negedge Wpsfh7) if (~Wpsfh7) begin + Tl3gh7 <= 1'b0; + end + else + begin + Tl3gh7 <= Pwqfh7; + end + always @(posedge Iqsfh7 or negedge Wpsfh7) if (~Wpsfh7) begin + Wm3gh7 <= 1'b0; + end + else + begin + Wm3gh7 <= Ztqfh7; + end + always @(posedge Iqsfh7 or negedge Wpsfh7) if (~Wpsfh7) begin + Zn3gh7 <= 1'b0; + end + else + begin + Zn3gh7 <= Uisfh7; + end + always @(posedge Iqsfh7 or negedge Wpsfh7) if (~Wpsfh7) begin + Cp3gh7 <= 1'b0; + end + else + begin + Cp3gh7 <= S0sfh7; + end + always @(posedge Iqsfh7 or negedge Wpsfh7) if (~Wpsfh7) begin + Dq3gh7 <= 1'b0; + end + else + begin + Dq3gh7 <= S0sfh7; + end + always @(posedge Iqsfh7 or negedge Wpsfh7) if (~Wpsfh7) begin + Fr3gh7 <= 1'b0; + end + else + begin + Fr3gh7 <= V1rfh7; + end + always @(posedge Iqsfh7 or negedge Wpsfh7) if (~Wpsfh7) begin + Is3gh7 <= 1'b0; + end + else + begin + Is3gh7 <= D3rfh7; + end + always @(posedge Iqsfh7 or negedge Wpsfh7) if (~Wpsfh7) begin + Lt3gh7 <= 1'b0; + end + else + begin + Lt3gh7 <= Vkqfh7; + end + always @(posedge Iqsfh7) Lu3gh7 <= M6sfh7; + always @(posedge Iqsfh7) Pv3gh7 <= W6sfh7; + always @(posedge Iqsfh7 or negedge Wpsfh7) if (~Wpsfh7) begin + Tw3gh7 <= 1'b0; + end + else + begin + Tw3gh7 <= Ekqfh7; + end + always @(posedge Iqsfh7 or negedge Wpsfh7) if (~Wpsfh7) begin + Ux3gh7 <= 1'b0; + end + else + begin + Ux3gh7 <= Kisfh7; + end + always @(posedge Iqsfh7 or negedge Wpsfh7) if (~Wpsfh7) begin + Wy3gh7 <= 1'b0; + end + else + begin + Wy3gh7 <= Fdsfh7; + end + always @(posedge Iqsfh7 or negedge Wpsfh7) if (~Wpsfh7) begin + Yz3gh7 <= 1'b0; + end + else + begin + Yz3gh7 <= Zdsfh7; + end + always @(posedge Iqsfh7 or negedge Wpsfh7) if (~Wpsfh7) begin + A14gh7 <= 1'b0; + end + else + begin + A14gh7 <= Tesfh7; + end + always @(posedge Iqsfh7 or negedge Wpsfh7) if (~Wpsfh7) begin + D24gh7 <= 1'b0; + end + else + begin + D24gh7 <= Nfsfh7; + end + always @(posedge Iqsfh7 or negedge Wpsfh7) if (~Wpsfh7) begin + G34gh7 <= 1'b0; + end + else + begin + G34gh7 <= Hgsfh7; + end + always @(posedge Iqsfh7 or negedge Wpsfh7) if (~Wpsfh7) begin + J44gh7 <= 1'b0; + end + else + begin + J44gh7 <= Bhsfh7; + end + always @(posedge Iqsfh7 or negedge Wpsfh7) if (~Wpsfh7) begin + M54gh7 <= 1'b0; + end + else + begin + M54gh7 <= Vhsfh7; + end + always @(posedge Iqsfh7 or negedge Wpsfh7) if (~Wpsfh7) begin + P64gh7 <= 1'b0; + end + else + begin + P64gh7 <= W1qfh7; + end + always @(posedge Iqsfh7 or negedge Wpsfh7) if (~Wpsfh7) begin + R74gh7 <= 1'b0; + end + else + begin + R74gh7 <= Xzpfh7; + end + always @(posedge Iqsfh7 or negedge Wpsfh7) if (~Wpsfh7) begin + T84gh7 <= 1'b0; + end + else + begin + T84gh7 <= Pisfh7; + end + always @(posedge Iqsfh7 or negedge Wpsfh7) if (~Wpsfh7) begin + W94gh7 <= 1'b0; + end + else + begin + W94gh7 <= M4qfh7; + end + always @(posedge Iqsfh7 or negedge Wpsfh7) if (~Wpsfh7) begin + Ya4gh7 <= 1'b0; + end + else + begin + Ya4gh7 <= C7qfh7; + end + always @(posedge Iqsfh7 or negedge Wpsfh7) if (~Wpsfh7) begin + Ac4gh7 <= 1'b0; + end + else + begin + Ac4gh7 <= S9qfh7; + end + always @(posedge Iqsfh7 or negedge Wpsfh7) if (~Wpsfh7) begin + Cd4gh7 <= 1'b0; + end + else + begin + Cd4gh7 <= Icqfh7; + end + always @(posedge Iqsfh7 or negedge Wpsfh7) if (~Wpsfh7) begin + Ee4gh7 <= 1'b0; + end + else + begin + Ee4gh7 <= Yeqfh7; + end + always @(posedge Iqsfh7 or negedge Wpsfh7) if (~Wpsfh7) begin + Ff4gh7 <= 1'b0; + end + else + begin + Ff4gh7 <= Ohqfh7; + end + always @(posedge Iqsfh7 or negedge Wpsfh7) if (~Wpsfh7) begin + Gg4gh7 <= 1'b0; + end + else + begin + Gg4gh7 <= Qcsfh7; + end + always @(posedge Iqsfh7 or negedge Wpsfh7) if (~Wpsfh7) begin + Ih4gh7 <= 1'b0; + end + else + begin + Ih4gh7 <= Njqfh7; + end + always @(posedge Iqsfh7) Ji4gh7 <= Gosfh7; + always @(posedge Iqsfh7 or negedge Wpsfh7) if (~Wpsfh7) begin + Nj4gh7 <= 1'b0; + end + else + begin + Nj4gh7 <= Oksfh7; + end + always @(posedge Iqsfh7 or negedge Wpsfh7) if (~Wpsfh7) begin + Sk4gh7 <= 1'b0; + end + else + begin + Sk4gh7 <= Kdsfh7; + end + always @(posedge Iqsfh7 or negedge Wpsfh7) if (~Wpsfh7) begin + Ul4gh7 <= 1'b0; + end + else + begin + Ul4gh7 <= Xgqfh7; + end + always @(posedge Iqsfh7 or negedge Wpsfh7) if (~Wpsfh7) begin + Vm4gh7 <= 1'b0; + end + else + begin + Vm4gh7 <= Eesfh7; + end + always @(posedge Iqsfh7 or negedge Wpsfh7) if (~Wpsfh7) begin + Xn4gh7 <= 1'b0; + end + else + begin + Xn4gh7 <= Heqfh7; + end + always @(posedge Iqsfh7 or negedge Wpsfh7) if (~Wpsfh7) begin + Yo4gh7 <= 1'b0; + end + else + begin + Yo4gh7 <= Yesfh7; + end + always @(posedge Iqsfh7 or negedge Wpsfh7) if (~Wpsfh7) begin + Bq4gh7 <= 1'b0; + end + else + begin + Bq4gh7 <= Rbqfh7; + end + always @(posedge Iqsfh7 or negedge Wpsfh7) if (~Wpsfh7) begin + Dr4gh7 <= 1'b0; + end + else + begin + Dr4gh7 <= Sfsfh7; + end + always @(posedge Iqsfh7 or negedge Wpsfh7) if (~Wpsfh7) begin + Gs4gh7 <= 1'b0; + end + else + begin + Gs4gh7 <= B9qfh7; + end + always @(posedge Iqsfh7 or negedge Wpsfh7) if (~Wpsfh7) begin + It4gh7 <= 1'b0; + end + else + begin + It4gh7 <= Mgsfh7; + end + always @(posedge Iqsfh7 or negedge Wpsfh7) if (~Wpsfh7) begin + Lu4gh7 <= 1'b0; + end + else + begin + Lu4gh7 <= L6qfh7; + end + always @(posedge Iqsfh7 or negedge Wpsfh7) if (~Wpsfh7) begin + Nv4gh7 <= 1'b0; + end + else + begin + Nv4gh7 <= Ghsfh7; + end + always @(posedge Iqsfh7 or negedge Wpsfh7) if (~Wpsfh7) begin + Qw4gh7 <= 1'b0; + end + else + begin + Qw4gh7 <= V3qfh7; + end + always @(posedge Iqsfh7 or negedge Wpsfh7) if (~Wpsfh7) begin + Sx4gh7 <= 1'b0; + end + else + begin + Sx4gh7 <= Aisfh7; + end + always @(posedge Iqsfh7 or negedge Wpsfh7) if (~Wpsfh7) begin + Vy4gh7 <= 1'b0; + end + else + begin + Vy4gh7 <= F1qfh7; + end + always @(posedge Iqsfh7 or negedge Wpsfh7) if (~Wpsfh7) begin + Xz4gh7 <= 1'b0; + end + else + begin + Xz4gh7 <= K8sfh7; + end + always @(posedge Iqsfh7 or negedge Wpsfh7) if (~Wpsfh7) begin + D15gh7 <= 1'b0; + end + else + begin + D15gh7 <= E9sfh7; + end + always @(posedge Iqsfh7 or negedge Wpsfh7) if (~Wpsfh7) begin + J25gh7 <= 1'b1; + end + else + begin + J25gh7 <= Insfh7; + end + always @(posedge Iqsfh7 or negedge Wpsfh7) if (~Wpsfh7) begin + P35gh7 <= 1'b1; + end + else + begin + P35gh7 <= Kmsfh7; + end + always @(posedge Iqsfh7) U45gh7 <= Epsfh7; + always @(posedge Iqsfh7 or negedge Wpsfh7) if (~Wpsfh7) begin + Y55gh7 <= 1'b0; + end + else + begin + Y55gh7 <= Mlsfh7; + end + always @(posedge Iqsfh7 or negedge Wpsfh7) if (~Wpsfh7) begin + D75gh7 <= 1'b0; + end + else + begin + D75gh7 <= Adsfh7; + end + always @(posedge Iqsfh7 or negedge Wpsfh7) if (~Wpsfh7) begin + F85gh7 <= 1'b0; + end + else + begin + F85gh7 <= Fiqfh7; + end + always @(posedge Iqsfh7 or negedge Wpsfh7) if (~Wpsfh7) begin + G95gh7 <= 1'b0; + end + else + begin + G95gh7 <= Udsfh7; + end + always @(posedge Iqsfh7 or negedge Wpsfh7) if (~Wpsfh7) begin + Ia5gh7 <= 1'b0; + end + else + begin + Ia5gh7 <= Pfqfh7; + end + always @(posedge Iqsfh7 or negedge Wpsfh7) if (~Wpsfh7) begin + Jb5gh7 <= 1'b0; + end + else + begin + Jb5gh7 <= Oesfh7; + end + always @(posedge Iqsfh7 or negedge Wpsfh7) if (~Wpsfh7) begin + Mc5gh7 <= 1'b0; + end + else + begin + Mc5gh7 <= Zcqfh7; + end + always @(posedge Iqsfh7 or negedge Wpsfh7) if (~Wpsfh7) begin + Od5gh7 <= 1'b0; + end + else + begin + Od5gh7 <= Ifsfh7; + end + always @(posedge Iqsfh7 or negedge Wpsfh7) if (~Wpsfh7) begin + Re5gh7 <= 1'b0; + end + else + begin + Re5gh7 <= Jaqfh7; + end + always @(posedge Iqsfh7 or negedge Wpsfh7) if (~Wpsfh7) begin + Tf5gh7 <= 1'b0; + end + else + begin + Tf5gh7 <= Cgsfh7; + end + always @(posedge Iqsfh7 or negedge Wpsfh7) if (~Wpsfh7) begin + Wg5gh7 <= 1'b0; + end + else + begin + Wg5gh7 <= T7qfh7; + end + always @(posedge Iqsfh7 or negedge Wpsfh7) if (~Wpsfh7) begin + Yh5gh7 <= 1'b0; + end + else + begin + Yh5gh7 <= Wgsfh7; + end + always @(posedge Iqsfh7 or negedge Wpsfh7) if (~Wpsfh7) begin + Bj5gh7 <= 1'b0; + end + else + begin + Bj5gh7 <= D5qfh7; + end + always @(posedge Iqsfh7 or negedge Wpsfh7) if (~Wpsfh7) begin + Dk5gh7 <= 1'b0; + end + else + begin + Dk5gh7 <= Qhsfh7; + end + always @(posedge Iqsfh7 or negedge Wpsfh7) if (~Wpsfh7) begin + Gl5gh7 <= 1'b0; + end + else + begin + Gl5gh7 <= N2qfh7; + end + always @(posedge Iqsfh7 or negedge Wpsfh7) if (~Wpsfh7) begin + Im5gh7 <= 1'b0; + end + else + begin + Im5gh7 <= U8sfh7; + end + always @(posedge Iqsfh7 or negedge Wpsfh7) if (~Wpsfh7) begin + On5gh7 <= 1'b1; + end + else + begin + On5gh7 <= Unsfh7; + end + always @(posedge Iqsfh7 or negedge Wpsfh7) if (~Wpsfh7) begin + Uo5gh7 <= 1'b1; + end + else + begin + Uo5gh7 <= Wmsfh7; + end + always @(posedge Iqsfh7) Aq5gh7 <= Qpsfh7; + always @(posedge Iqsfh7 or negedge Wpsfh7) if (~Wpsfh7) begin + Er5gh7 <= 1'b0; + end + else + begin + Er5gh7 <= Ylsfh7; + end + always @(posedge Iqsfh7) Js5gh7 <= Sosfh7; + always @(posedge Iqsfh7 or negedge Wpsfh7) if (~Wpsfh7) begin + Nt5gh7 <= 1'b0; + end + else + begin + Nt5gh7 <= Alsfh7; + end + always @(posedge Iqsfh7 or negedge Wpsfh7) if (~Wpsfh7) begin + Su5gh7 <= 1'b0; + end + else + begin + Su5gh7 <= Vcsfh7; + end + always @(posedge Iqsfh7 or negedge Wpsfh7) if (~Wpsfh7) begin + Uv5gh7 <= 1'b0; + end + else + begin + Uv5gh7 <= Wiqfh7; + end + always @(posedge Iqsfh7 or negedge Wpsfh7) if (~Wpsfh7) begin + Vw5gh7 <= 1'b0; + end + else + begin + Vw5gh7 <= Pdsfh7; + end + always @(posedge Iqsfh7 or negedge Wpsfh7) if (~Wpsfh7) begin + Xx5gh7 <= 1'b0; + end + else + begin + Xx5gh7 <= Ggqfh7; + end + always @(posedge Iqsfh7 or negedge Wpsfh7) if (~Wpsfh7) begin + Yy5gh7 <= 1'b0; + end + else + begin + Yy5gh7 <= Jesfh7; + end + always @(posedge Iqsfh7 or negedge Wpsfh7) if (~Wpsfh7) begin + B06gh7 <= 1'b0; + end + else + begin + B06gh7 <= Qdqfh7; + end + always @(posedge Iqsfh7 or negedge Wpsfh7) if (~Wpsfh7) begin + D16gh7 <= 1'b0; + end + else + begin + D16gh7 <= Dfsfh7; + end + always @(posedge Iqsfh7 or negedge Wpsfh7) if (~Wpsfh7) begin + G26gh7 <= 1'b0; + end + else + begin + G26gh7 <= Abqfh7; + end + always @(posedge Iqsfh7 or negedge Wpsfh7) if (~Wpsfh7) begin + I36gh7 <= 1'b0; + end + else + begin + I36gh7 <= Xfsfh7; + end + always @(posedge Iqsfh7 or negedge Wpsfh7) if (~Wpsfh7) begin + L46gh7 <= 1'b0; + end + else + begin + L46gh7 <= K8qfh7; + end + always @(posedge Iqsfh7 or negedge Wpsfh7) if (~Wpsfh7) begin + N56gh7 <= 1'b0; + end + else + begin + N56gh7 <= Rgsfh7; + end + always @(posedge Iqsfh7 or negedge Wpsfh7) if (~Wpsfh7) begin + Q66gh7 <= 1'b0; + end + else + begin + Q66gh7 <= U5qfh7; + end + always @(posedge Iqsfh7 or negedge Wpsfh7) if (~Wpsfh7) begin + S76gh7 <= 1'b0; + end + else + begin + S76gh7 <= Lhsfh7; + end + always @(posedge Iqsfh7 or negedge Wpsfh7) if (~Wpsfh7) begin + V86gh7 <= 1'b0; + end + else + begin + V86gh7 <= E3qfh7; + end + always @(posedge Iqsfh7 or negedge Wpsfh7) if (~Wpsfh7) begin + X96gh7 <= 1'b0; + end + else + begin + X96gh7 <= Fisfh7; + end + always @(posedge Iqsfh7 or negedge Wpsfh7) if (~Wpsfh7) begin + Ab6gh7 <= 1'b0; + end + else + begin + Ab6gh7 <= O0qfh7; + end + always @(posedge Iqsfh7 or negedge Wpsfh7) if (~Wpsfh7) begin + Cc6gh7 <= 1'b1; + end + else + begin + Cc6gh7 <= F8sfh7; + end + always @(posedge Iqsfh7 or negedge Wpsfh7) if (~Wpsfh7) begin + Id6gh7 <= 1'b0; + end + else + begin + Id6gh7 <= Z8sfh7; + end + always @(posedge Iqsfh7 or negedge Wpsfh7) if (~Wpsfh7) begin + Oe6gh7 <= 1'b0; + end + else + begin + Oe6gh7 <= Onsfh7; + end + always @(posedge Iqsfh7 or negedge Wpsfh7) if (~Wpsfh7) begin + Uf6gh7 <= 1'b0; + end + else + begin + Uf6gh7 <= Qmsfh7; + end + always @(posedge Iqsfh7) Ah6gh7 <= Kpsfh7; + always @(posedge Iqsfh7 or negedge Wpsfh7) if (~Wpsfh7) begin + Ei6gh7 <= 1'b0; + end + else + begin + Ei6gh7 <= Slsfh7; + end + always @(posedge Iqsfh7) Jj6gh7 <= Mosfh7; + always @(posedge Iqsfh7 or negedge Wpsfh7) if (~Wpsfh7) begin + Nk6gh7 <= 1'b0; + end + else + begin + Nk6gh7 <= Uksfh7; + end + always @(posedge Iqsfh7 or negedge Wpsfh7) if (~Wpsfh7) begin + Sl6gh7 <= 1'b0; + end + else + begin + Sl6gh7 <= A8sfh7; + end + always @(posedge Iqsfh7 or negedge Wpsfh7) if (~Wpsfh7) begin + Ym6gh7 <= 1'b1; + end + else + begin + Ym6gh7 <= P8sfh7; + end + always @(posedge Iqsfh7 or negedge Wpsfh7) if (~Wpsfh7) begin + Eo6gh7 <= 1'b0; + end + else + begin + Eo6gh7 <= J9sfh7; + end + always @(posedge Iqsfh7 or negedge Wpsfh7) if (~Wpsfh7) begin + Kp6gh7 <= 1'b0; + end + else + begin + Kp6gh7 <= Cnsfh7; + end + always @(posedge Iqsfh7 or negedge Wpsfh7) if (~Wpsfh7) begin + Qq6gh7 <= 1'b1; + end + else + begin + Qq6gh7 <= Emsfh7; + end + always @(posedge Iqsfh7) Vr6gh7 <= Cbsfh7; + always @(posedge Iqsfh7 or negedge Wpsfh7) if (~Wpsfh7) begin + Vs6gh7 <= 1'b1; + end + else + begin + Vs6gh7 <= T9sfh7; + end + always @(posedge Iqsfh7) Bu6gh7 <= Hbsfh7; + always @(posedge Iqsfh7 or negedge Wpsfh7) if (~Wpsfh7) begin + Bv6gh7 <= 1'b0; + end + else + begin + Bv6gh7 <= Y9sfh7; + end + always @(posedge Iqsfh7) Hw6gh7 <= Rbsfh7; + always @(posedge Iqsfh7 or negedge Wpsfh7) if (~Wpsfh7) begin + Hx6gh7 <= 1'b0; + end + else + begin + Hx6gh7 <= Iasfh7; + end + always @(posedge Iqsfh7) Ny6gh7 <= Wbsfh7; + always @(posedge Iqsfh7 or negedge Wpsfh7) if (~Wpsfh7) begin + Nz6gh7 <= 1'b0; + end + else + begin + Nz6gh7 <= Nasfh7; + end + always @(posedge Iqsfh7) T07gh7 <= Bcsfh7; + always @(posedge Iqsfh7 or negedge Wpsfh7) if (~Wpsfh7) begin + T17gh7 <= 1'b0; + end + else + begin + T17gh7 <= Sasfh7; + end + always @(posedge Iqsfh7) Z27gh7 <= Lcsfh7; + always @(posedge Iqsfh7 or negedge Wpsfh7) if (~Wpsfh7) begin + Z37gh7 <= 1'b1; + end + else + begin + Z37gh7 <= O9sfh7; + end + always @(posedge Iqsfh7) F57gh7 <= B7sfh7; + always @(posedge Iqsfh7) J67gh7 <= Yosfh7; + always @(posedge Iqsfh7) N77gh7 <= Mbsfh7; + always @(posedge Iqsfh7 or negedge Wpsfh7) if (~Wpsfh7) begin + N87gh7 <= 1'b0; + end + else + begin + N87gh7 <= Dasfh7; + end + always @(posedge Iqsfh7 or negedge Wpsfh7) if (~Wpsfh7) begin + T97gh7 <= 1'b0; + end + else + begin + T97gh7 <= Glsfh7; + end + always @(posedge Iqsfh7) Ya7gh7 <= Aosfh7; + always @(posedge Iqsfh7) Cc7gh7 <= Gcsfh7; + always @(posedge Iqsfh7 or negedge Wpsfh7) if (~Wpsfh7) begin + Cd7gh7 <= 1'b1; + end + else + begin + Cd7gh7 <= Xasfh7; + end + always @(posedge Iqsfh7 or negedge Wpsfh7) if (~Wpsfh7) begin + Ie7gh7 <= 1'b1; + end + else + begin + Ie7gh7 <= Iksfh7; + end + always @(posedge Iqsfh7) Nf7gh7 <= L7sfh7; + always @(posedge Iqsfh7) Rg7gh7 <= V7sfh7; + always @(posedge Iqsfh7) Vh7gh7 <= Q7sfh7; + always @(posedge Iqsfh7) Zi7gh7 <= G7sfh7; + always @(posedge Iqsfh7) Dk7gh7 <= R6sfh7; +endmodule + +/* Design Summary + modules: 1 + udps: 0 + mod flatinsts: 0 + udp flatinsts: 0 + nodes: 1943 (0) + node widths: 2119 (0) + process: 173 (0) + gates: 0 (0) + contassigns: 1818 (0) + ports: 27 (0) + modinsts: 0 (0) + udpinsts: 0 (0) + portconnects: 0 (0) +*/ + +// END: VCS tokens +// Currnet Allocated Virtual Memory Size: 203.73 MB +// =================== +// DESIGN STATISTICS +// =================== +// +// No. of design lines (note: includes comments and blank lines) 4726 +// +// Static<!> Elaborated<@> Size(KB) +// ------ ---------- -------- +// No. of all modules (module+interface+package+program): 1 1 0 +// No. of module instances: 1 1 0 +// No. of all processes: 173 173 0 +// No. of all nodes (variable+net): 1943 1943 0 +// No. of constants 430 430 0 +// No. of scalar nets: 1756 1756 0 +// No. of vector nets: 14 14 0 +// No. of scalar regs/logics: 173 173 0 +// No. of always blocks: 173 173 0 +// No. of operators: 2933 2933 0 +// No. of concatenations: 4 4 0 +// No. of bit selects: 234 234 0 +// No. of part selects: 1 1 0 +// No. of non-blocking assignments: 322 322 0 +// No. of continuous assignments: 1818 1818 0 +// +// No. of top level modules/programs/packages/interfaces: 1 +// modules: 1 +// No. of module+udp ports: 27 +// +// Footnotes: +// --------- +// <!> No. of unique instances of a construct as it appears in the source. +// <@> No. of instances of a construct when the design is elaborated. +// K, M, B: Counted in thousands, millions and billions (if big numbers are present) +// +// <#> Multiple specify blocks in the SAME module are combined and counted +// as ONE block. diff --git a/IPLIB/ADPcontrol_v1_0/ADPcontrol_v1_0.v b/IPLIB/ADPcontrol_v1_0/ADPcontrol_v1_0.v new file mode 100755 index 0000000..7b8967c --- /dev/null +++ b/IPLIB/ADPcontrol_v1_0/ADPcontrol_v1_0.v @@ -0,0 +1,103 @@ +//----------------------------------------------------------------------------- +// top-level soclabs ASCII Debug Protocol controller +// A joint work commissioned on behalf of SoC Labs, under Arm Academic Access license. +// +// Contributors +// +// David Flynn (d.w.flynn@soton.ac.uk) +// +// Copyright � 2021-2, SoC Labs (www.soclabs.org) +//----------------------------------------------------------------------------- + + + module ADPcontrol_v1_0 # + ( + // Users to add parameters here + parameter PROMPT_CHAR = "]" + + // User parameters ends + // Do not modify the parameters beyond this line + + ) + ( + // Users to add ports here + + // User ports ends + // Do not modify the ports beyond this line + + // Ports of Axi Slave Bus Interface com_rx + input wire ahb_hclk, + input wire ahb_hresetn, + + output wire com_rx_tready, + input wire [7 : 0] com_rx_tdata, + input wire com_rx_tvalid, + + // Ports of Axi Master Bus Interface com_tx + output wire com_tx_tvalid, + output wire [7 : 0] com_tx_tdata, + input wire com_tx_tready, + + // Ports of Axi Slave Bus Interface stdio_rx + output wire stdio_rx_tready, + input wire [7 : 0] stdio_rx_tdata, + input wire stdio_rx_tvalid, + + // Ports of Axi Master Bus Interface stdio_tx + output wire stdio_tx_tvalid, + output wire [7 : 0] stdio_tx_tdata, + input wire stdio_tx_tready, + + output wire [7 : 0] gpo8, + input wire [7 : 0] gpi8, + + output wire [31:0] ahb_haddr , + output wire [ 2:0] ahb_hburst , + output wire ahb_hmastlock, + output wire [ 3:0] ahb_hprot , + output wire [ 2:0] ahb_hsize , + output wire [ 1:0] ahb_htrans , + output wire [31:0] ahb_hwdata , + output wire ahb_hwrite , + input wire [31:0] ahb_hrdata , + input wire ahb_hready , + input wire ahb_hresp + ); + + // Add user logic here + +ADPmanager + #(.PROMPT_CHAR (PROMPT_CHAR)) + ADPmanager( + .HCLK (ahb_hclk ), + .HRESETn (ahb_hresetn ), + .HADDR32_o (ahb_haddr ), + .HBURST3_o (ahb_hburst ), + .HMASTLOCK_o (ahb_hmastlock ), + .HPROT4_o (ahb_hprot ), + .HSIZE3_o (ahb_hsize ), + .HTRANS2_o (ahb_htrans ), + .HWDATA32_o (ahb_hwdata ), + .HWRITE_o (ahb_hwrite ), + .HRDATA32_i (ahb_hrdata ), + .HREADY_i (ahb_hready ), + .HRESP_i (ahb_hresp ), + .GPO8_o (gpo8 ), + .GPI8_i (gpi8 ), + .COMRX_TREADY_o(com_rx_tready), + .COMRX_TDATA_i(com_rx_tdata), + .COMRX_TVALID_i(com_rx_tvalid), + .STDRX_TREADY_o(stdio_rx_tready), + .STDRX_TDATA_i(stdio_rx_tdata), + .STDRX_TVALID_i(stdio_rx_tvalid), + .COMTX_TVALID_o(com_tx_tvalid), + .COMTX_TDATA_o(com_tx_tdata), + .COMTX_TREADY_i(com_tx_tready), + .STDTX_TVALID_o(stdio_tx_tvalid), + .STDTX_TDATA_o(stdio_tx_tdata), + .STDTX_TREADY_i(stdio_tx_tready) + + ); + + +endmodule diff --git a/IPLIB/ADPcontrol_v1_0/ADPmanager.v b/IPLIB/ADPcontrol_v1_0/ADPmanager.v new file mode 100755 index 0000000..f4747ae --- /dev/null +++ b/IPLIB/ADPcontrol_v1_0/ADPmanager.v @@ -0,0 +1,786 @@ +//----------------------------------------------------------------------------- +// soclabs ASCII Debug Protocol controller +// A joint work commissioned on behalf of SoC Labs, under Arm Academic Access license. +// +// Contributors +// +// David Flynn (d.w.flynn@soton.ac.uk) +// +// Copyright � 2021-2, SoC Labs (www.soclabs.org) +//----------------------------------------------------------------------------- + + +//`define ADPBASIC 1 + +module ADPmanager // AHB initiator interface + #(parameter PROMPT_CHAR = "]" + ) + ( input wire HCLK, + input wire HRESETn, + output wire [31:0] HADDR32_o, + output wire [ 2:0] HBURST3_o, + output wire HMASTLOCK_o, + output wire [ 3:0] HPROT4_o, + output wire [ 2:0] HSIZE3_o, + output wire [ 1:0] HTRANS2_o, + output wire [31:0] HWDATA32_o, + output wire HWRITE_o, + input wire [31:0] HRDATA32_i, + input wire HREADY_i, + input wire HRESP_i, +// COMIO interface + output wire [ 7:0] GPO8_o, + input wire [ 7:0] GPI8_i, +// input wire COM_RXE_i, + input wire [ 7:0] COMRX_TDATA_i, + input wire COMRX_TVALID_i, + output wire COMRX_TREADY_o, +// input wire COM_TXF_i, + output wire [ 7:0] COMTX_TDATA_o, + output wire COMTX_TVALID_o, + input wire COMTX_TREADY_i, +// STDIO interface +// input wire STDOUT_RXE_i, + input wire [ 7:0] STDRX_TDATA_i, + input wire STDRX_TVALID_i, + output wire STDRX_TREADY_o, +// input wire STDIN_TXF_i + output wire [ 7:0] STDTX_TDATA_o, + output wire STDTX_TVALID_o, + input wire STDTX_TREADY_i +); + +wire COM_RXE_i = !COMRX_TVALID_i; +wire COM_TXF_i = !COMTX_TREADY_i; + +//wire adp_rx_req = COMRX_TVALID_i & COMRX_TREADY_o; +//wire std_rx_req = STDRX_TVALID_i & STDRX_TREADY_o; + + +wire STD_TXF_i = !STDTX_TREADY_i; +wire STD_RXE_i = !STDRX_TVALID_i; + +`ifdef ADPBASIC + localparam BANNERHEX = 32'h50c1ab01; +`else + localparam BANNERHEX = 32'h50c1ab02; +`endif + +localparam CMD_bad = 4'b0000; +localparam CMD_A = 4'b0001; // set address +`ifndef ADPBASIC +localparam CMD_B = 4'b1000; // Binary upload (wordocunt) from addr++ +localparam CMD_M = 4'b1010; // set read mask +localparam CMD_P = 4'b1011; // Poll hardware (count) +localparam CMD_V = 4'b1100; // match value +localparam CMD_Z = 4'b1101; // Zero-fill (wordocunt) from addr++ +`endif +localparam CMD_C = 4'b1001; // Control +localparam CMD_R = 4'b0010; // read word, addr++ +localparam CMD_S = 4'b0011; // Status/STDIN +localparam CMD_W = 4'b0100; // write word, addr++ +localparam CMD_X = 4'b0101; // exit + + +function FNvalid_adp_entry; // Escape char +input [7:0] char8; + FNvalid_adp_entry = (char8[7:0] == 8'h1b); +endfunction + +function [3:0] FNvalid_cmd; +input [7:0] char8; +case (char8[7:0]) +"A": FNvalid_cmd = CMD_A; +"a": FNvalid_cmd = CMD_A; +"C": FNvalid_cmd = CMD_C; +"c": FNvalid_cmd = CMD_C; +"R": FNvalid_cmd = CMD_R; +"r": FNvalid_cmd = CMD_R; +"S": FNvalid_cmd = CMD_S; +"s": FNvalid_cmd = CMD_S; +"W": FNvalid_cmd = CMD_W; +"w": FNvalid_cmd = CMD_W; +"X": FNvalid_cmd = CMD_X; +"x": FNvalid_cmd = CMD_X; +`ifndef ADPBASIC +"B": FNvalid_cmd = CMD_B; +"b": FNvalid_cmd = CMD_B; +"M": FNvalid_cmd = CMD_M; +"m": FNvalid_cmd = CMD_M; +"P": FNvalid_cmd = CMD_P; +"p": FNvalid_cmd = CMD_P; +"V": FNvalid_cmd = CMD_V; +"v": FNvalid_cmd = CMD_V; +"Z": FNvalid_cmd = CMD_Z; +"z": FNvalid_cmd = CMD_Z; +`endif +default: + FNvalid_cmd = 0; +endcase +endfunction + +function FNvalid_space; // space or tab char +input [7:0] char8; + FNvalid_space = ((char8[7:0] == 8'h20) || (char8[7:0] == 8'h09)); +endfunction + +function FNnull; // space or tab char +input [7:0] char8; + FNnull = (char8[7:0] == 8'h00); +endfunction + +function FNexit; // EOF +input [7:0] char8; + FNexit = ((char8[7:0] == 8'h04) || (char8[7:0] == 8'h00)); +endfunction + +function FNvalid_EOL; // CR or LF +input [7:0] char8; + FNvalid_EOL = ((char8[7:0] == 8'h0a) || (char8[7:0] == 8'h0d)); +endfunction + +function FNuppercase; +input [7:0] char8; + FNuppercase = (char8[6]) ? (char8 & 8'h5f) : (char8); +endfunction + +function [63:0] FNBuild_param64_hexdigit; +input [63:0] param64; +input [7:0] char8; +case (char8[7:0]) +"\t":FNBuild_param64_hexdigit = 64'b0; // tab starts new (zeroed) param64 +" ": FNBuild_param64_hexdigit = 64'b0; // space starts new (zeroed) param64 +"x": FNBuild_param64_hexdigit = 64'b0; // hex prefix starts new (zeroed) param64 +"X": FNBuild_param64_hexdigit = 64'b0; // hex prefix starts new (zeroed) param64 +"0": FNBuild_param64_hexdigit = {param64[59:0],4'b0000}; +"1": FNBuild_param64_hexdigit = {param64[59:0],4'b0001}; +"2": FNBuild_param64_hexdigit = {param64[59:0],4'b0010}; +"3": FNBuild_param64_hexdigit = {param64[59:0],4'b0011}; +"4": FNBuild_param64_hexdigit = {param64[59:0],4'b0100}; +"5": FNBuild_param64_hexdigit = {param64[59:0],4'b0101}; +"6": FNBuild_param64_hexdigit = {param64[59:0],4'b0110}; +"7": FNBuild_param64_hexdigit = {param64[59:0],4'b0111}; +"8": FNBuild_param64_hexdigit = {param64[59:0],4'b1000}; +"9": FNBuild_param64_hexdigit = {param64[59:0],4'b1001}; +"A": FNBuild_param64_hexdigit = {param64[59:0],4'b1010}; +"B": FNBuild_param64_hexdigit = {param64[59:0],4'b1011}; +"C": FNBuild_param64_hexdigit = {param64[59:0],4'b1100}; +"D": FNBuild_param64_hexdigit = {param64[59:0],4'b1101}; +"E": FNBuild_param64_hexdigit = {param64[59:0],4'b1110}; +"F": FNBuild_param64_hexdigit = {param64[59:0],4'b1111}; +"a": FNBuild_param64_hexdigit = {param64[59:0],4'b1010}; +"b": FNBuild_param64_hexdigit = {param64[59:0],4'b1011}; +"c": FNBuild_param64_hexdigit = {param64[59:0],4'b1100}; +"d": FNBuild_param64_hexdigit = {param64[59:0],4'b1101}; +"e": FNBuild_param64_hexdigit = {param64[59:0],4'b1110}; +"f": FNBuild_param64_hexdigit = {param64[59:0],4'b1111}; +default: FNBuild_param64_hexdigit = param64; // EOL etc returns param64 unchanged +endcase +endfunction + +function [63:0] FNBuild_param64_byte; +input [63:0] param64; +input [7:0] byte; + FNBuild_param64_byte = {byte[7:0], param64[63:08]}; +endfunction + +function [31:0] FNBuild_param32_hexdigit; +input [31:0] param32; +input [7:0] char8; +case (char8[7:0]) +"\t":FNBuild_param32_hexdigit = 32'b0; // tab starts new (zeroed) param32 +" ": FNBuild_param32_hexdigit = 32'b0; // space starts new (zeroed) param32 +"x": FNBuild_param32_hexdigit = 32'b0; // hex prefix starts new (zeroed) param32 +"X": FNBuild_param32_hexdigit = 32'b0; // hex prefix starts new (zeroed) param32 +"0": FNBuild_param32_hexdigit = {param32[27:0],4'b0000}; +"1": FNBuild_param32_hexdigit = {param32[27:0],4'b0001}; +"2": FNBuild_param32_hexdigit = {param32[27:0],4'b0010}; +"3": FNBuild_param32_hexdigit = {param32[27:0],4'b0011}; +"4": FNBuild_param32_hexdigit = {param32[27:0],4'b0100}; +"5": FNBuild_param32_hexdigit = {param32[27:0],4'b0101}; +"6": FNBuild_param32_hexdigit = {param32[27:0],4'b0110}; +"7": FNBuild_param32_hexdigit = {param32[27:0],4'b0111}; +"8": FNBuild_param32_hexdigit = {param32[27:0],4'b1000}; +"9": FNBuild_param32_hexdigit = {param32[27:0],4'b1001}; +"A": FNBuild_param32_hexdigit = {param32[27:0],4'b1010}; +"B": FNBuild_param32_hexdigit = {param32[27:0],4'b1011}; +"C": FNBuild_param32_hexdigit = {param32[27:0],4'b1100}; +"D": FNBuild_param32_hexdigit = {param32[27:0],4'b1101}; +"E": FNBuild_param32_hexdigit = {param32[27:0],4'b1110}; +"F": FNBuild_param32_hexdigit = {param32[27:0],4'b1111}; +"a": FNBuild_param32_hexdigit = {param32[27:0],4'b1010}; +"b": FNBuild_param32_hexdigit = {param32[27:0],4'b1011}; +"c": FNBuild_param32_hexdigit = {param32[27:0],4'b1100}; +"d": FNBuild_param32_hexdigit = {param32[27:0],4'b1101}; +"e": FNBuild_param32_hexdigit = {param32[27:0],4'b1110}; +"f": FNBuild_param32_hexdigit = {param32[27:0],4'b1111}; +default: FNBuild_param32_hexdigit = param32; // EOL etc returns param32 unchanged +endcase +endfunction + +function [31:0] FNBuild_param32_byte; +input [31:0] param32; +input [7:0] byte; + FNBuild_param32_byte = {byte[7:0], param32[31:08]}; +endfunction + + + +function [7:0] FNmap_hex_digit; +input [3:0] nibble; +case (nibble[3:0]) +4'b0000: FNmap_hex_digit = "0"; +4'b0001: FNmap_hex_digit = "1"; +4'b0010: FNmap_hex_digit = "2"; +4'b0011: FNmap_hex_digit = "3"; +4'b0100: FNmap_hex_digit = "4"; +4'b0101: FNmap_hex_digit = "5"; +4'b0110: FNmap_hex_digit = "6"; +4'b0111: FNmap_hex_digit = "7"; +4'b1000: FNmap_hex_digit = "8"; +4'b1001: FNmap_hex_digit = "9"; +4'b1010: FNmap_hex_digit = "a"; +4'b1011: FNmap_hex_digit = "b"; +4'b1100: FNmap_hex_digit = "c"; +4'b1101: FNmap_hex_digit = "d"; +4'b1110: FNmap_hex_digit = "e"; +4'b1111: FNmap_hex_digit = "f"; +default: FNmap_hex_digit = "0"; +endcase +endfunction + + +// as per Vivado synthesis mapping +`ifdef ADPFSMDESIGN +localparam ADP_WRITEHEX = 6'b000000 ; +localparam ADP_WRITEHEXS = 6'b000001 ; +localparam ADP_WRITEHEX9 = 6'b000010 ; +localparam ADP_WRITEHEX8 = 6'b000011 ; +localparam ADP_WRITEHEX7 = 6'b000100 ; +localparam ADP_WRITEHEX6 = 6'b000101 ; +localparam ADP_WRITEHEX5 = 6'b000110 ; +localparam ADP_WRITEHEX4 = 6'b000111 ; +localparam ADP_WRITEHEX3 = 6'b001000 ; +localparam ADP_WRITEHEX2 = 6'b001001 ; +localparam ADP_WRITEHEX1 = 6'b001010 ; +localparam ADP_WRITEHEX0 = 6'b001011 ; +localparam ADP_LINEACK = 6'b001101 ; +localparam ADP_LINEACK2 = 6'b110010 ; +localparam ADP_PROMPT = 6'b001110 ; +localparam ADP_IOCHK = 6'b001111 ; +localparam ADP_RXCMD = 6'b010000 ; +localparam ADP_RXPARAM = 6'b010010 ; +localparam ADP_ACTION = 6'b010011 ; +localparam ADP_READ = 6'b010001 ; +localparam ADP_SYSCHK = 6'b010100 ; +localparam ADP_STDIN = 6'b010101 ; +localparam ADP_SYSCTL = 6'b010110 ; +localparam ADP_WRITE = 6'b010111 ; +localparam ADP_EXIT = 6'b011000 ; +localparam STD_IOCHK = 6'b011001 ; +localparam STD_RXD1 = 6'b011010 ; +localparam STD_RXD2 = 6'b011011 ; +localparam STD_TXD1 = 6'b011101 ; +localparam STD_TXD2 = 6'b011110 ; +localparam ADP_BCTRL = 6'b011111 ; +localparam ADP_BREADB0 = 6'b100000 ; +localparam ADP_BREADB1 = 6'b100001 ; +localparam ADP_BREADB2 = 6'b100010 ; +localparam ADP_BREADB3 = 6'b100011 ; +localparam ADP_BWRITE = 6'b100100 ; +localparam ADP_POLL = 6'b100101 ; +localparam ADP_POLL1 = 6'b100110 ; +localparam ADP_POLL2 = 6'b100111 ; +localparam ADP_ZCTRL = 6'b101110 ; +localparam ADP_ZWRITE = 6'b101111 ; +localparam ADP_ECHOCMD = 6'b110000 ; +localparam ADP_ECHOCMDSP = 6'b110001 ; +localparam ADP_UNKNOWN = 6'b101000 ; +localparam ADP_STDOUT = 6'b101010 ; +localparam ADP_STDOUT1 = 6'b101011 ; +localparam ADP_STDOUT2 = 6'b101100 ; +localparam ADP_STDOUT3 = 6'b101101 ; +reg [5:0] adp_state ; +`else +// one-hot encoded explicitly +localparam ADP_WRITEHEX = 48'b000000000000000000000000000000000000000000000001 ; // = 6'b000000 +localparam ADP_WRITEHEXS = 48'b000000000000000000000000000000000000000000000010 ; // = 6'b000001 +localparam ADP_WRITEHEX9 = 48'b000000000000000000000000000000000000000000000100 ; // = 6'b000010 +localparam ADP_WRITEHEX8 = 48'b000000000000000000000000000000000000000000001000 ; // = 6'b000011 +localparam ADP_WRITEHEX7 = 48'b000000000000000000000000000000000000000000010000 ; // = 6'b000100 +localparam ADP_WRITEHEX6 = 48'b000000000000000000000000000000000000000000100000 ; // = 6'b000101 +localparam ADP_WRITEHEX5 = 48'b000000000000000000000000000000000000000001000000 ; // = 6'b000110 +localparam ADP_WRITEHEX4 = 48'b000000000000000000000000000000000000000010000000 ; // = 6'b000111 +localparam ADP_WRITEHEX3 = 48'b000000000000000000000000000000000000000100000000 ; // = 6'b001000 +localparam ADP_WRITEHEX2 = 48'b000000000000000000000000000000000000001000000000 ; // = 6'b001001 +localparam ADP_WRITEHEX1 = 48'b000000000000000000000000000000000000010000000000 ; // = 6'b001010 +localparam ADP_WRITEHEX0 = 48'b000000000000000000000000000000000000100000000000 ; // = 6'b001011 +localparam ADP_LINEACK = 48'b000000000000000000000000000000000001000000000000 ; // = 6'b001101 +localparam ADP_LINEACK2 = 48'b000000000000000000000000000000000010000000000000 ; // = 6'b110010 +localparam ADP_PROMPT = 48'b000000000000000000000000000000000100000000000000 ; // = 6'b001110 +localparam ADP_IOCHK = 48'b000000000000000000000000000000001000000000000000 ; // = 6'b001111 +localparam ADP_RXCMD = 48'b000000000000000000000000000000010000000000000000 ; // = 6'b010000 +localparam ADP_RXPARAM = 48'b000000000000000000000000000000100000000000000000 ; // = 6'b010010 +localparam ADP_ACTION = 48'b000000000000000000000000000001000000000000000000 ; // = 6'b010011 +localparam ADP_READ = 48'b000000000000000000000000000010000000000000000000 ; // = 6'b010001 +localparam ADP_SYSCHK = 48'b000000000000000000000000000100000000000000000000 ; // = 6'b010100 +localparam ADP_STDIN = 48'b000000000000000000000000001000000000000000000000 ; // = 6'b010101 +localparam ADP_SYSCTL = 48'b000000000000000000000000010000000000000000000000 ; // = 6'b010110 +localparam ADP_WRITE = 48'b000000000000000000000000100000000000000000000000 ; // = 6'b010111 +localparam ADP_EXIT = 48'b000000000000000000000001000000000000000000000000 ; // = 6'b011000 +localparam STD_IOCHK = 48'b000000000000000000000010000000000000000000000000 ; // = 6'b011001 +localparam STD_RXD1 = 48'b000000000000000000000100000000000000000000000000 ; // = 6'b011010 +localparam STD_RXD2 = 48'b000000000000000000001000000000000000000000000000 ; // = 6'b011011 +localparam STD_TXD1 = 48'b000000000000000000010000000000000000000000000000 ; // = 6'b011101 +localparam STD_TXD2 = 48'b000000000000000000100000000000000000000000000000 ; // = 6'b011110 +localparam ADP_BCTRL = 48'b000000000000000001000000000000000000000000000000 ; // = 6'b011111 +localparam ADP_BREADB0 = 48'b000000000000000010000000000000000000000000000000 ; // = 6'b100000 +localparam ADP_BREADB1 = 48'b000000000000000100000000000000000000000000000000 ; // = 6'b100001 +localparam ADP_BREADB2 = 48'b000000000000001000000000000000000000000000000000 ; // = 6'b100010 +localparam ADP_BREADB3 = 48'b000000000000010000000000000000000000000000000000 ; // = 6'b100011 +localparam ADP_BWRITE = 48'b000000000000100000000000000000000000000000000000 ; // = 6'b100100 +localparam ADP_POLL = 48'b000000000001000000000000000000000000000000000000 ; // = 6'b100101 +localparam ADP_POLL1 = 48'b000000000010000000000000000000000000000000000000 ; // = 6'b100110 +localparam ADP_POLL2 = 48'b000000000100000000000000000000000000000000000000 ; // = 6'b100111 +localparam ADP_ZCTRL = 48'b000000001000000000000000000000000000000000000000 ; // = 6'b101110 +localparam ADP_ZWRITE = 48'b000000010000000000000000000000000000000000000000 ; // = 6'b101111 +localparam ADP_ECHOCMD = 48'b000000100000000000000000000000000000000000000000 ; // = 6'b110000 +localparam ADP_ECHOCMDSP = 48'b000001000000000000000000000000000000000000000000 ; // = 6'b110001 +localparam ADP_UNKNOWN = 48'b000010000000000000000000000000000000000000000000 ; // = 6'b101000 +localparam ADP_STDOUT = 48'b000100000000000000000000000000000000000000000000 ; // = 6'b101010 +localparam ADP_STDOUT1 = 48'b001000000000000000000000000000000000000000000000 ; // = 6'b101011 +localparam ADP_STDOUT2 = 48'b010000000000000000000000000000000000000000000000 ; // = 6'b101100 +localparam ADP_STDOUT3 = 48'b100000000000000000000000000000000000000000000000 ; // = 6'b101101 +reg [47:0] adp_state ; +`endif + +reg [31:0] adp_bus_data; +reg banner ; +reg com_tx_req ; +reg [7:0] com_tx_byte ; +reg com_rx_ack ; +reg std_tx_req ; +reg [ 7:0] std_tx_byte; +reg std_rx_ack ; +reg adp_bus_req ; +reg adp_bus_write ; +reg [7:0] adp_cmd ; +reg [31:0] adp_param ; +reg [31:0] adp_addr ; +reg adp_addr_inc; +reg [31:0] adp_sys ; + +assign GPO8_o = adp_sys[7:0]; + +// ADP RX stream +wire com_rx_req = COMRX_TVALID_i; +wire [ 7:0] com_rx_byte = COMRX_TDATA_i; +assign COMRX_TREADY_o = com_rx_ack; +// ADP TX stream +wire com_tx_ack = COMTX_TREADY_i; +assign COMTX_TDATA_o = com_tx_byte; +assign COMTX_TVALID_o = com_tx_req; +// STD RX stream (from STDOUT) +wire std_rx_req = STDRX_TVALID_i; +wire [ 7:0] std_rx_byte = STDRX_TDATA_i; +assign STDRX_TREADY_o = std_rx_ack; +// STD TX stream (to STDIN) +wire std_tx_ack = STDTX_TREADY_i; +assign STDTX_TDATA_o = std_tx_byte; +assign STDTX_TVALID_o = std_tx_req; + +//AMBA AHB master as "stream" interface +reg ahb_dphase; +wire ahb_aphase = adp_bus_req & !ahb_dphase; +wire adp_bus_ack = ahb_dphase & HREADY_i; +// control pipe +always @(posedge HCLK or negedge HRESETn) + if(!HRESETn) + ahb_dphase <= 0; + else if (HREADY_i) + ahb_dphase <= (ahb_aphase); + +assign HADDR32_o = adp_addr; +assign HBURST3_o = 3'b001; // "INCR" burst signalled whenever transfer; +assign HMASTLOCK_o = 1'b0; +assign HPROT4_o[3:0] = {1'b0, 1'b0, 1'b1, 1'b1}; +assign HSIZE3_o[2:0] = {1'b0, 2'b10}; +assign HTRANS2_o = {ahb_aphase,1'b0}; // non-seq +assign HWDATA32_o = adp_bus_data; +assign HWRITE_o = adp_bus_write; + + +`ifndef ADPBASIC +//reg [63:0] adp_bctrl64; +reg [31:0] adp_bctrl; +reg [31:0] adp_val; +reg [31:0] adp_mask; +reg [31:0] adp_poll; +reg [31:0] adp_count; +reg adp_count_dec ; +wire adp_delay_done; +wire adp_bctrl_done; +wire adp_bctrl_zero; +wire poll2_loop_next; +`endif + +// ADP_control flags in the 'C' control field +wire adp_disable; +wire adp_stdin_wait; + +// commnon interface handshake terms +wire com_rx_done = COMRX_TVALID_i & COMRX_TREADY_o; +wire com_tx_done = COMTX_TVALID_o & COMTX_TREADY_i; +wire std_rx_done = STDRX_TVALID_i & STDRX_TREADY_o; +wire std_tx_done = STDTX_TVALID_o & STDTX_TREADY_i; +wire adp_bus_done = (adp_bus_req & adp_bus_ack); + +// common task to set up for next state +task ADP_LINEACK_next; // prepare newline TX (and cancel any startup banner) +// begin com_tx_req <= 1; com_tx_byte <= 8'h0A; banner <= 0; adp_state <= ADP_LINEACK; end + begin com_tx_req <= 1; com_tx_byte <= 8'h0A; adp_state <= ADP_LINEACK; end +endtask +task ADP_PROMPT_next; // prepare prompt TX + begin com_tx_req <= 1; com_tx_byte <= PROMPT_CHAR; adp_state <= ADP_PROMPT; end +endtask +task ADP_BUSWRITEINC_next; // prepare bus write and addr++ on completion + begin adp_bus_req <=1; adp_bus_write <=1; adp_addr_inc <=1; end +endtask +task ADP_BUSREADINC_next; // prepare bus read and addr++ on completion + begin adp_bus_req <=1; adp_bus_write <=0; adp_addr_inc <=1; end +endtask + +task ADP_hexdigit_next; // output nibble +input [3:0] nibble; + begin com_tx_req <= 1; com_tx_byte <= FNmap_hex_digit(nibble[3:0]); end +endtask +task ADP_txchar_next; // output char +input [7:0] byte; + begin com_tx_req<= 1; com_tx_byte <= byte; end +endtask + +task com_rx_nxt; com_rx_ack <=1; endtask + +function FNcount_down_zero_next; // param about to be zero +input [31:0] counter; + FNcount_down_zero_next = !(|counter[31:1]); +endfunction + +always @(posedge HCLK or negedge HRESETn) + if(!HRESETn) begin + adp_state <= ADP_WRITEHEX ; + adp_bus_data <= BANNERHEX; + banner <= 1; // start-up HEX message + com_tx_req <= 0; // default no TX req + com_rx_ack <= 0; // default no RX ack + std_tx_req <= 0; // default no TX req + std_rx_ack <= 0; // default no RX ack + adp_bus_req <= 0; // default no bus transaction + adp_cmd <= 0; + adp_param <= 0; + adp_addr <= 0; + adp_addr_inc <= 0; + adp_bus_write<= 0; +`ifndef ADPBASIC + adp_count <= 0; + adp_count_dec<= 0; + adp_val <= 0; + adp_mask <= 0; + adp_sys <= 0; +`endif + end else begin // default states + adp_state <= adp_state; // default to hold current state + com_tx_req <= 0; // default no TX req + com_rx_ack <= 0; // default no RX ack + std_tx_req <= 0; // default no TX req + std_rx_ack <= 0; // default no RX ack + adp_bus_req <= 0; // default no bus transaction + adp_addr <= (adp_addr_inc & adp_bus_done) ? adp_addr + 4 : adp_addr; // address++ + adp_addr_inc <= 0; +`ifndef ADPBASIC + adp_count <= (adp_count_dec & adp_bus_done & |adp_count) ? adp_count - 1 : adp_count; // param-- + adp_count_dec<= 0; +`endif + case (adp_state) +// >>>>>>>>>>>>>>>> STDIO BYPASS >>>>>>>>>>>>>>>>>>>>>> + STD_IOCHK: // check for commsrx or STDOUT and not busy service, else loop back + if (com_rx_req) begin com_rx_ack <= 1; adp_state <= STD_RXD1; end // input char pending for STDIN +// else if (com_tx_ack & std_rx_req) begin std_rx_ack <= 1; adp_state <= STD_TXD1; end // STDOUT char pending and not busy + else if (std_rx_req) begin std_rx_ack <= 1; adp_state <= STD_TXD1; end // STDOUT char pending and not busy + STD_TXD1: // get STD out char + if (std_rx_done) + begin com_tx_byte <= std_rx_byte; com_tx_req <= 1; adp_state <= STD_TXD2; end + else std_rx_ack <= 1; // extend + STD_TXD2: // output char to ADP channel + if (com_tx_done) begin adp_state <= STD_IOCHK; end + else com_tx_req <= 1; // extend + STD_RXD1: // read rx char and check for ADP entry else STDIN ** + if (com_rx_done) begin + if (FNvalid_adp_entry(com_rx_byte)) + begin ADP_txchar_next(8'h0A); adp_state <= ADP_LINEACK; end // ADP prompt + else if (std_tx_ack) + begin std_tx_byte <= com_rx_byte; std_tx_req <= 1; adp_state <= STD_RXD2; end + else adp_state <= STD_IOCHK; // otherwise discard STDIN char and process OP data if blocked + end else com_rx_ack <= 1; // extend + STD_RXD2: // get STD in char + if (std_tx_done) begin adp_state <= STD_IOCHK; end + else std_tx_req <= 1; // extend + +// >>>>>>>>>>>>>>>> ADP Monitor >>>>>>>>>>>>>>>>>>>>>> + ADP_PROMPT: // transition after reset deassertion + if (com_tx_done) begin adp_state <= ADP_IOCHK; end + else com_tx_req <= 1; // extend + + ADP_IOCHK: // check for commsrx or STDOUT and not busy service, else loop back + if (com_rx_req) begin com_rx_ack <= 1; adp_state <= ADP_RXCMD; end + else if (com_tx_ack & std_rx_req) begin com_tx_byte <= "<"; com_tx_req <= 1; adp_state <= ADP_STDOUT; end +// else if (std_rx_req) begin com_tx_byte <= "<"; com_tx_req <= 1; adp_state <= ADP_STDOUT; end + +// >>>>>>>>>>>>>>>> ADP <STDOUT> >>>>>>>>>>>>>>>>>>>>>> + ADP_STDOUT: // output "<" + if (com_tx_done) begin std_rx_ack <= 1; adp_state <= ADP_STDOUT1; end + else com_tx_req <= 1; // extend stream request if not ready + ADP_STDOUT1: // get STD out char + if (std_rx_done) begin com_tx_byte <= std_rx_byte; com_tx_req <= 1; adp_state <= ADP_STDOUT2; end + else std_rx_ack <= 1; // else extend + ADP_STDOUT2: // output char + if (com_tx_done) begin com_tx_byte <= ">"; com_tx_req <= 1; adp_state <= ADP_STDOUT3; end + else com_tx_req <= 1; // else extend + ADP_STDOUT3: // output ">" + if (com_tx_done) begin adp_state <= ADP_IOCHK; end + else com_tx_req <= 1; // else extend + +// >>>>>>>>>>>>>>>> ADP COMMAND PARSING >>>>>>>>>>>>>>>>>>>>>> + ADP_RXCMD: // read and save ADP command + if (com_rx_done) begin + if (FNexit(com_rx_byte)) adp_state <= STD_IOCHK; // immediate exit + else if (FNvalid_space(com_rx_byte)) com_rx_ack <= 1; // retry for a command + else if (FNvalid_EOL(com_rx_byte)) begin adp_cmd <= "?"; adp_state <= ADP_ACTION; end // no command, skip param + else begin adp_cmd <= com_rx_byte; adp_param <= 32'hffffffff; com_rx_ack <= 1; adp_state <= ADP_RXPARAM; end // get optional parameter + end + else com_rx_ack <= 1; // extend stream request if not ready + ADP_RXPARAM: // read and build hex parameter + if (com_rx_done) begin // RX byte + if (FNexit(com_rx_byte)) adp_state <= STD_IOCHK; // exit + else if (FNvalid_EOL(com_rx_byte)) +`ifndef ADPBASIC + begin adp_count <= adp_param; adp_state <= ADP_ACTION; end // parameter complete on EOL +`else + begin adp_state <= ADP_ACTION; end // parameter complete on EOL +`endif + else + begin adp_param <= FNBuild_param32_hexdigit(adp_param, com_rx_byte); com_rx_ack <= 1; end // build parameter + end + else com_rx_ack <= 1; + + ADP_ACTION: // parse command and action with parameter + if (FNexit(com_rx_byte)) + adp_state <= STD_IOCHK; + else if (FNvalid_cmd(adp_cmd) == CMD_A) + begin if (adp_param == 32'hffffffff) adp_param <= adp_addr; else adp_addr <= adp_param; + adp_state <= ADP_ECHOCMD; end + else if (FNvalid_cmd(adp_cmd) == CMD_C) begin + if (adp_param[31:8] == 0) // report GPO + begin adp_state <= ADP_SYSCTL; end + else if (adp_param[31:8] == 1) // clear bits in GPO + begin adp_sys[7:0] <= adp_sys[7:0] & ~adp_param[7:0]; adp_state <= ADP_SYSCTL; end + else if (adp_param[31:8] == 2) // set bits in GPO + begin adp_sys[7:0] <= adp_sys[7:0] | adp_param[7:0]; adp_state <= ADP_SYSCTL; end + else if (adp_param[31:8] == 3) // overwrite bits in GPO + begin adp_sys[7:0] <= adp_param[7:0]; adp_state <= ADP_SYSCTL; end + else // 4 etc, report GPO + begin adp_state <= ADP_SYSCTL; end + end + else if (FNvalid_cmd(adp_cmd) == CMD_R) + begin ADP_BUSREADINC_next(); adp_state <= ADP_READ; end // no param + else if (FNvalid_cmd(adp_cmd) == CMD_S) + begin adp_state <= ADP_SYSCHK; end + else if (FNvalid_cmd(adp_cmd) == CMD_W) + begin adp_bus_data <= adp_param; ADP_BUSWRITEINC_next(); adp_state <= ADP_WRITE; end + else if (FNvalid_cmd(adp_cmd) == CMD_X) + begin com_tx_byte <= 8'h0a; com_tx_req <= 1; adp_state <= ADP_EXIT; end +`ifndef ADPBASIC + else if (FNvalid_cmd(adp_cmd) == CMD_B) + if (FNcount_down_zero_next(adp_param)) adp_state <= ADP_ECHOCMD; else adp_state <= ADP_BCTRL; // non-zero count + else if (FNvalid_cmd(adp_cmd) == CMD_M) + begin if (adp_param == 32'hffffffff) adp_param <= adp_mask; else adp_mask <= adp_param; + adp_state <= ADP_ECHOCMD; end + else if (FNvalid_cmd(adp_cmd) == CMD_P) + if (FNcount_down_zero_next(adp_param)) adp_state <= ADP_ECHOCMD; else adp_state <= ADP_POLL; // non-zero count + else if (FNvalid_cmd(adp_cmd) == CMD_V) + begin if (adp_param == 32'hffffffff) adp_param <= adp_val; else adp_val <= adp_param; + adp_state <= ADP_ECHOCMD; end + else if (FNvalid_cmd(adp_cmd) == CMD_Z) + if (FNcount_down_zero_next(adp_param)) adp_state <= ADP_ECHOCMD; else adp_state <= ADP_ZCTRL; // non-zero count +`endif + else + begin ADP_txchar_next("?"); adp_state <= ADP_UNKNOWN; end // unrecognised/invald + +// >>>>>>>>>>>>>>>> ADP BUS WRITE and READ >>>>>>>>>>>>>>>>>>>>>> + + ADP_WRITE: // perform bus write at current address pointer (and auto increment) + if (adp_bus_done) begin adp_state <= ADP_ECHOCMD; end + else begin ADP_BUSWRITEINC_next(); end // extend request + + ADP_READ: // perform bus read at current adp address (and auto increment) - and report in hex + if (adp_bus_done) begin adp_bus_data <= HRDATA32_i; ADP_txchar_next("R"); com_tx_req <= 1; adp_state <= ADP_ECHOCMDSP; end + else begin ADP_BUSREADINC_next(); end // extend request + +`ifndef ADPBASIC + +// >>>>>>>>>>>>>>>> ADP BINARY UPLOAD >>>>>>>>>>>>>>>>>>>>>> + ADP_BCTRL: // set control value + begin com_rx_ack <= 1; adp_state <= ADP_BREADB0; end // read next 4 bytes + ADP_BREADB0: // read raw binary byte + if (com_rx_done) begin com_rx_ack <= 1; adp_bus_data[31:24] <= com_rx_byte; adp_state <= ADP_BREADB1; end + else com_rx_ack <= 1; // extend stream request if not ready + ADP_BREADB1: // read raw binary byte + if (com_rx_done) begin com_rx_ack <= 1; adp_bus_data[23:16] <= com_rx_byte; adp_state <= ADP_BREADB2; end + else com_rx_ack <= 1; // extend stream request if not ready + ADP_BREADB2: // read raw binary byte 0 + if (com_rx_done) begin com_rx_ack <= 1; adp_bus_data[15: 8] <= com_rx_byte; adp_state <= ADP_BREADB3; end + else com_rx_ack <= 1; // extend stream request if not ready + ADP_BREADB3: // read raw binary byte 0 + if (com_rx_done) + begin adp_bus_data[ 7: 0] <= com_rx_byte; ADP_BUSWRITEINC_next(); adp_count_dec <= 1; adp_state <= ADP_BWRITE; end + else com_rx_ack <= 1; // extend stream request if not ready + ADP_BWRITE: // Write word to Addr++ + if (adp_bus_done) begin // auto address++, count-- + if (FNcount_down_zero_next(adp_count)) adp_state <= ADP_ECHOCMD; else begin adp_state <= ADP_BREADB0; end + end else begin ADP_BUSWRITEINC_next(); adp_count_dec <= 1; end // extend request + +// >>>>>>>>>>>>>>>> ADP BUS READ LOOP >>>>>>>>>>>>>>>>>>>>>> + ADP_POLL: // set poll value + begin adp_bus_req <= 1; adp_bus_write <= 0; adp_state <= ADP_POLL1; end + ADP_POLL1: // wait for read data, no addr++ + if (adp_bus_done) begin adp_bus_data <= HRDATA32_i; adp_count_dec <=1; adp_state <= ADP_POLL2; end + else begin adp_bus_req <= 1; adp_count_dec <=1; end + ADP_POLL2: + if (FNcount_down_zero_next(adp_count)) adp_state <= ADP_ECHOCMD; // timeout + else if (((adp_bus_data & adp_mask) ^ adp_val) == 0) adp_state <= ADP_WRITEHEX; // exact match + else adp_state <= ADP_POLL; + +// >>>>>>>>>>>>>>>> ADP ZERO MEMORY >>>>>>>>>>>>>>>>>>>>>> + ADP_ZCTRL: // set control value + begin adp_bus_data <= adp_val; ADP_BUSWRITEINC_next(); adp_count_dec <= 1; adp_state <= ADP_ZWRITE; end + ADP_ZWRITE: // Write word to Addr++ + if (adp_bus_done) begin // auto address++, count-- + if (FNcount_down_zero_next(adp_count)) adp_state <= ADP_ECHOCMD; else begin adp_state <= ADP_ZCTRL; end + end else begin ADP_BUSWRITEINC_next(); adp_count_dec <= 1; end // extend request +`endif + + // >>>>>>>>>>>>>>>> ADP MISC >>>>>>>>>>>>>>>>>>>>>> + + ADP_UNKNOWN: // output "?" + if (com_tx_done) begin ADP_LINEACK_next(); end + else com_tx_req <= 1; // extend stream request if not ready + + ADP_EXIT: // exit ADP mode + if (com_tx_done) adp_state <= STD_IOCHK; + else com_tx_req <= 1; // extend stream request if not ready + + ADP_SYSCHK: // check STDIN fifo + begin // no upper flags so STDIN char + if (std_tx_ack) begin std_tx_req <=1; std_tx_byte <= adp_param[7:0]; adp_state <= ADP_STDIN; end + else begin ADP_txchar_next(8'h0A); com_tx_req <= 1; adp_state <= ADP_LINEACK; end // newline and prompt + end + ADP_STDIN: // push char into STDIN + if (std_tx_done) begin adp_bus_data <= adp_param[7:0]; ADP_txchar_next("S"); com_tx_req <= 1; adp_state <= ADP_ECHOCMDSP; end + else std_tx_req <= 1; // extend + + ADP_SYSCTL: // read current status - and report in hex + begin adp_bus_data <= {GPI8_i[7:0],adp_sys[7:0],adp_param[15:0]}; ADP_txchar_next("C"); com_tx_req <= 1; adp_state <= ADP_ECHOCMDSP; end + + ADP_ECHOCMD: // output command and (param) data + begin adp_state <= ADP_ECHOCMDSP; ADP_txchar_next(adp_cmd & 8'h5f); adp_bus_data <= adp_param; end // output command char + ADP_ECHOCMDSP: // output command space and (bus) data + if (com_tx_done) begin adp_state <= ADP_WRITEHEXS; ADP_txchar_next(" "); end // output space char + else com_tx_req <= 1; // extend + + ADP_WRITEHEX: // output hex word with prefix + begin adp_state <= ADP_WRITEHEXS; ADP_txchar_next(" "); end // output "0" hex prefix + + ADP_WRITEHEXS: + if (com_tx_done) begin adp_state <= ADP_WRITEHEX9; ADP_txchar_next("0"); end // output "0" hex prefix + else com_tx_req <= 1; // extend + ADP_WRITEHEX9: + if (com_tx_done) begin adp_state <= ADP_WRITEHEX8; ADP_txchar_next("x"); end // output "x" hex prefix + else com_tx_req <= 1; // extend + ADP_WRITEHEX8: + if (com_tx_done) begin adp_state <= ADP_WRITEHEX7; ADP_hexdigit_next(adp_bus_data[31:28]); end // hex nibble 7 + else com_tx_req <= 1; // extend + ADP_WRITEHEX7: // output hex nibble 7 + if (com_tx_done) begin adp_state <= ADP_WRITEHEX6; ADP_hexdigit_next(adp_bus_data[27:24]); end // hex nibble 6 + else com_tx_req <= 1; // extend + ADP_WRITEHEX6: // output hex nibble 6 + if (com_tx_done) begin adp_state <= ADP_WRITEHEX5; ADP_hexdigit_next(adp_bus_data[23:20]); end // hex nibble 5 + else com_tx_req <= 1; // extend + ADP_WRITEHEX5: // output hex nibble 5 + if (com_tx_done) begin adp_state <= ADP_WRITEHEX4; ADP_hexdigit_next(adp_bus_data[19:16]); end // hex nibble 4 + else com_tx_req <= 1; // extend + ADP_WRITEHEX4: // output hex nibble 4 + if (com_tx_done) begin adp_state <= ADP_WRITEHEX3; ADP_hexdigit_next(adp_bus_data[15:12]); end // hex nibble 3 + else com_tx_req <= 1; // extend + ADP_WRITEHEX3: // output hex nibble 3 + if (com_tx_done) begin adp_state <= ADP_WRITEHEX2; ADP_hexdigit_next(adp_bus_data[11: 8]); end // hex nibble 2 + else com_tx_req <= 1; // extend + ADP_WRITEHEX2: // output hex nibble 2 + if (com_tx_done) begin adp_state <= ADP_WRITEHEX1; ADP_hexdigit_next(adp_bus_data[ 7: 4]); end // hex nibble 1 + else com_tx_req <= 1; // extend + ADP_WRITEHEX1: // output hex nibble 1 + if (com_tx_done) begin adp_state <= ADP_WRITEHEX0; ADP_hexdigit_next(adp_bus_data[ 3: 0]); end // hex nibble 0 + else com_tx_req <= 1; // extend + ADP_WRITEHEX0: // output hex nibble 0 (if not startup banner then scan to end of line before lineack + if (com_tx_done) begin + if (banner) begin ADP_LINEACK_next(); end + else begin ADP_txchar_next(8'h0A); com_tx_req <= 1; adp_state <= ADP_LINEACK; end // newline and prompt + end else com_tx_req <= 1; // extend + + ADP_LINEACK: // write EOLN + if (com_tx_done) begin + begin ADP_txchar_next(8'h0D); adp_state <= ADP_LINEACK2; end + end else com_tx_req <= 1; // extend + ADP_LINEACK2: // CR + if (com_tx_done) begin + if (banner) begin banner <= 0; adp_state <= STD_IOCHK; end + else begin ADP_txchar_next(PROMPT_CHAR); adp_state <= ADP_PROMPT; end + end else com_tx_req <= 1; // extend + default: + begin ADP_txchar_next("!"); adp_state <= ADP_UNKNOWN; end // default error + endcase + end + +endmodule + +////AHBLITE_ADPMASTER instancing +//ADPmaster +// #(.PROMPT_CHAR ("]")) +// ADPmaster( +// .HCLK (ahb_hclk ), +// .HRESETn (ahb_hrestn ), +// .HADDR32_o (ahb_haddr ), +// .HBURST3_o (ahb_hburst ), +// .HMASTLOCK_o (ahb_hmastlock ), +// .HPROT4_o (ahb_hprot ), +// .HSIZE3_o (ahb_hsize ), +// .HTRANS2_o (ahb_htrans ), +// .HWDATA32_o (ahb_hwdata ), +// .HWRITE_o (ahb_hwrite ), +// .HRDATA32_i (ahb_hrdata ), +// .HREADY_i (ahb_hready ), +// .HRESP_i (ahb_hresp ), + +// .COMRX_TREADY_o(com_rx_tready), +// .COMRX_TDATA_i(com_rx_tdata), +// .COMRX_TVALID_i(com_rx_tvalid), +// .STDRX_TREADY_o(std_rx_tready), +// .STDRX_TDATA_i(std_rx_tdata), +// .STDRX_TVALID_i(std_rx_tvalid), +// .COMTX_TVALID_o(com_tx_tvalid), +// .COMTX_TDATA_o(com_tx_tdata), +// .COMTX_TREADY_i(com_tx_tready), +// .STDTX_TVALID_o(std_tx_tvalid), +// .STDTX_TDATA_o(std_tx_tdata), +// .STDTX_TREADY_i(std_tx_tready) + +// ); diff --git a/IPLIB/FT1248_streamio_v1_0/ft1248_streamio_v1_0.v b/IPLIB/FT1248_streamio_v1_0/ft1248_streamio_v1_0.v new file mode 100755 index 0000000..b5b8d4b --- /dev/null +++ b/IPLIB/FT1248_streamio_v1_0/ft1248_streamio_v1_0.v @@ -0,0 +1,305 @@ +//----------------------------------------------------------------------------- +// soclabs on-chip AXI stream to FTDI FT1248 controller +// A joint work commissioned on behalf of SoC Labs, under Arm Academic Access license. +// +// Contributors +// +// David Flynn (d.w.flynn@soton.ac.uk) +// +// Copyright � 2022, SoC Labs (www.soclabs.org) +//----------------------------------------------------------------------------- + +module ft1248_streamio_v1_0 # + ( + // Users to add parameters here + // FTDI Interface 1,2,4 width supported + parameter integer FT1248_WIDTH = 1, + // FTDI clock always on - else quiet when no access + parameter integer FT1248_CLKON = 1 + + // User parameters ends + // Do not modify the parameters beyond this line + + // Parameters of Axi Stream Master Bus Interface TXD + // Parameters of Axi Stream Slave Bus Interface RXD + ) + ( + // IO pad interface - to FT232R configured in 1/2/4/8 mode + output wire ft_clk_o, // SCLK + output wire ft_ssn_o, // SS_N + input wire ft_miso_i, // MISO + output wire [FT1248_WIDTH-1:0] ft_miosio_o, // MIOSIO tristate output when enabled + output wire [FT1248_WIDTH-1:0] ft_miosio_e, // MIOSIO tristate output enable (active hi) + output wire [FT1248_WIDTH-1:0] ft_miosio_z, // MIOSIO tristate output enable (active lo) + input wire [FT1248_WIDTH-1:0] ft_miosio_i, // MIOSIO tristate input + + input wire [7:0] ft_clkdiv, // divider prescaler to ensure SCLK <1MHz + + // User ports ends + // Do not modify the ports beyond this line + + // initially clocked from aclk + // asynch + input wire clk, + input wire resetn, + + // Ports of Axi Master Bus Interface TXD + output wire txd_tvalid, + output wire [7 : 0] txd_tdata, + output wire txd_tlast, + input wire txd_tready, + + // Ports of Axi Slave Bus Interface RXD + output wire rxd_tready, + input wire [7 : 0] rxd_tdata, + input wire rxd_tlast, + input wire rxd_tvalid + ); + + //---------------------------------------------- + //-- State Machine encoding + //---------------------------------------------- + +// Explicit FSM state bit assignment +// bit [0] SCLK +// bit [1] MIO_OE +// bit [2] CMD/W +// bit [3] DAT/R +// bit [4] SSEL + +localparam FT_0_IDLE = 5'b00000; +localparam FT_1_IDLE = 5'b00001; +localparam FT_ZCMD_CLKLO = 5'b10100; +localparam FT_CMD_CLKHI = 5'b10111; +localparam FT_CMD_CLKLO = 5'b10110; +localparam FT_ZBT_CLKHI = 5'b10001; +localparam FT_ZBT_CLKLO = 5'b10000; +localparam FT_WD_CLKHI = 5'b11111; +localparam FT_WD_CLKLO = 5'b11110; +localparam FT_ZWD_CLKLO = 5'b11100; +localparam FT_RD_CLKHI = 5'b11001; +localparam FT_RD_CLKLO = 5'b11000; + +reg [4:0] ft_state; +// 9- bit shift register to support 8-bit data + 1 sequence control flag +// write data uses bits[7:0], with bit[8] set to flag length for serialized transfers +// read data uses bits[8:1], with bit[0] set to flag continuation for serialized transfers +reg [8:0] ft_reg; + + //---------------------------------------------- + //-- IO PAD control, parameterized on WIDTH param + //---------------------------------------------- + +wire bwid8 = (FT1248_WIDTH==8); +wire bwid4 = (FT1248_WIDTH==4); +wire bwid2 = (FT1248_WIDTH==2); +wire bwid1 = (FT1248_WIDTH==1); + +wire [7:0] ft_rdmasked; + +generate if (FT1248_WIDTH == 8) begin +assign ft_rdmasked[7:1] = ft_miosio_i[7:1]; +assign ft_miosio_o[7:1] = ft_reg[7:1]; +assign ft_miosio_e[7:1] = {7{ft_state[1]}}; +assign ft_miosio_z[7:1] = ~{7{ft_state[1]}}; +end +endgenerate + +generate if (FT1248_WIDTH == 4) begin +assign ft_rdmasked[7:1] = {4'b1111, ft_miosio_i[3:1]}; +assign ft_miosio_o[3:1] = ft_reg[3:1]; +assign ft_miosio_e[3:1] = {3{ft_state[1]}}; +assign ft_miosio_z[3:1] = ~{3{ft_state[1]}}; +end +endgenerate + +generate if (FT1248_WIDTH == 2) begin +assign ft_rdmasked[7:1] = {6'b111111, ft_miosio_i[1]}; +assign ft_miosio_o[1] = ft_reg[1]; +assign ft_miosio_e[1] = ft_state[1]; +assign ft_miosio_z[1] = ~ft_state[1]; +end +endgenerate + +generate if (FT1248_WIDTH == 1) +assign ft_rdmasked[7:1] = 7'b1111111; +endgenerate + +assign ft_rdmasked[0] = ft_miosio_i[0]; +assign ft_miosio_o[0] = ft_reg[0]; +assign ft_miosio_e[0] = ft_state[1]; +assign ft_miosio_z[0] = ~ft_state[1]; + +assign ft_clk_o = ft_state[0]; +assign ft_ssn_o = !ft_state[4]; + +// diagnostic decodes +//wire ft_cmd = !ft_state[3] & ft_state[2]; +//wire ft_dwr = ft_state[3] & ft_state[2]; +//wire ft_drd = ft_state[3] & !ft_state[2]; + + + //---------------------------------------------- + //-- Internal clock prescaler + //---------------------------------------------- + + // clock prescaler, ft_clken enables serial IO engine clocking + reg [7:0] ft_clkcnt_r; + reg ft_clken; + + always @(posedge clk or negedge resetn ) + begin + if (!resetn) begin + ft_clkcnt_r <= 0; + ft_clken <= 0; + end + else begin + ft_clken <= (ft_clkcnt_r == ft_clkdiv); + ft_clkcnt_r <= (ft_clkcnt_r == ft_clkdiv) ? 0 : (ft_clkcnt_r +1); + end + end + + //---------------------------------------------- + //-- Internal "synchronizers" (dual stage) + //---------------------------------------------- + // synchronizers for channel ready flags when idle + // (treat these signals as synchronous during transfer sequencing) + reg ft_miso_i_sync; + reg ft_miosio_i0_sync; + reg ft_miso_i_sync_1; + reg ft_miosio_i0_sync_1; + + always @(posedge clk or negedge resetn ) + begin + if (!resetn) begin + ft_miso_i_sync_1 <= 1; + ft_miosio_i0_sync_1 <= 1; + ft_miso_i_sync <= 1; + ft_miosio_i0_sync <= 1; + end + else begin + ft_miso_i_sync_1 <= ft_miso_i; + ft_miosio_i0_sync_1 <= ft_miosio_i[0]; + ft_miso_i_sync <= ft_miso_i_sync_1; + ft_miosio_i0_sync <= ft_miosio_i0_sync_1; + end + end + + //---------------------------------------------- + //-- AXI Stream interface handshakes + //---------------------------------------------- + +reg ft_txf; // FTDI Transmit channel Full +reg ft_rxe; // FTDO Receive channel Empty +reg ft_wcyc; // read access committed +reg ft_nak; // check for NAK terminate + +// TX stream delivers valid FT1248 read data transfer +// 8-bit write port with extra top-bit used as valid qualifer +reg [8:0] txdata; +assign txd_tdata = txdata[7:0]; +assign txd_tvalid = txdata[8]; + +// activate if RX channel data and the stream buffer is not full +wire ft_rxreq = !ft_rxe & !txdata[8]; + + +// RX stream handshakes on valid FT1248 write data transfer +reg rxdone; +reg rxrdy; +assign rxd_tready = rxdone; + +// activate if TX channel not full and and the stream buffer data valid +wire ft_txreq = !ft_txf & rxd_tvalid; // & !rxdone; // FTDI TX data ready and rxstream ready + +// FTDI1248 commands +wire [3:0] wcmd = 4'b0000; // write request +wire [3:0] rcmd = 4'b0001; // read request +wire [3:0] fcmd = 4'b0100; // write flush request +//wire [3:0] rcmd = 4'b1000; // read request BE bit-pattern +//wire [3:0] fcmd = 4'b0010; // write flush request BE bit-pattern +// and full FT1248 command bit patterns (using top-bits for shift sequencing) +wire [8:0] wcmdpatt = {2'b11, wcmd[0], wcmd[1], 1'b0, wcmd[2], 1'b0, 1'b0, wcmd[3]}; +wire [8:0] rcmdpatt = {2'b11, rcmd[0], rcmd[1], 1'b0, rcmd[2], 1'b0, 1'b0, rcmd[3]}; + +reg ssn_del; +always @(posedge clk or negedge resetn) + if (!resetn) + ssn_del <= 1'b1; + else if (ft_clken) + ssn_del <= ft_ssn_o; +wire ssn_start = ft_ssn_o & ssn_del; + +// FTDI1248 state machine + +always @(posedge clk or negedge resetn) + if (!resetn) begin + ft_state <= FT_0_IDLE; + ft_reg <= 0; + txdata <= 0; + rxdone <= 0; + ft_wcyc <= 0; + ft_txf <= 1; // ftdi channel TXE# ('1' full) + ft_rxe <= 1; // ftdi channel RXF# ('1' empty) + ft_nak <= 0; + end + else begin + ft_txf <= (ft_state==FT_0_IDLE) ? (ft_miosio_i[0] | ft_miosio_i0_sync) : 1'b1; //ft_txf & !( ft_wcyc &(ft_state==FT_ZBT_CLKHI) & ft_miso_i); + ft_rxe <= (ft_state==FT_0_IDLE) ? (ft_miso_i | ft_miso_i_sync) : 1'b1; //ft_rxe & !(!ft_wcyc & (ft_state==FT_ZBT_CLKHI) & ft_miso_i); + txdata[8] <= txdata[8] & !txd_tready; // tx_valid handshake + rxdone <= (ft_clken & (ft_state==FT_ZWD_CLKLO) & !ft_nak) | (rxdone & !rxd_tvalid); // hold until acknowledged + if (ft_clken) + case (ft_state) + FT_0_IDLE: begin // RX req priority + if (ssn_start & ft_rxreq) begin ft_reg <= rcmdpatt; ft_state <= FT_ZCMD_CLKLO; end + else if (ssn_start & ft_txreq) begin ft_reg <= wcmdpatt; ft_state <= FT_ZCMD_CLKLO; ft_wcyc <= 1; end + else ft_state <= (!ft_txf | !ft_rxe | (FT1248_CLKON!=0)) ? FT_1_IDLE : FT_0_IDLE; + end + FT_1_IDLE: + ft_state <= FT_0_IDLE; + FT_ZCMD_CLKLO: + ft_state <= FT_CMD_CLKHI; + FT_CMD_CLKHI: + ft_state <= FT_CMD_CLKLO; + FT_CMD_CLKLO: // 2, 4 or 7 shifts + if (bwid8) begin ft_reg <= FT_ZBT_CLKHI; end + else if (bwid4) begin ft_reg <= {4'b0000,ft_reg[8:4]}; ft_state <= (|ft_reg[8:5]) ? FT_CMD_CLKHI : FT_ZBT_CLKHI; end + else if (bwid2) begin ft_reg <= { 2'b00,ft_reg[8:2]}; ft_state <= (|ft_reg[8:3]) ? FT_CMD_CLKHI : FT_ZBT_CLKHI; end + else begin ft_reg <= { 1'b0,ft_reg[8:1]}; ft_state <= (|ft_reg[8:3]) ? FT_CMD_CLKHI : FT_ZBT_CLKHI; end + FT_ZBT_CLKHI: + ft_state <= FT_ZBT_CLKLO; + FT_ZBT_CLKLO: + if (ft_wcyc) begin ft_reg <= {1'b1,rxd_tdata}; ft_state <= FT_WD_CLKHI; end + else begin ft_reg <= 9'b011111111; ft_state <= FT_RD_CLKHI; end + FT_WD_CLKHI: + if (ft_miso_i & ft_reg[8]) begin ft_nak <= 1'b1; ft_state <= FT_ZWD_CLKLO; end // NAK terminate on first cycle + else if (bwid8) ft_state <= (ft_reg[8]) ? FT_WD_CLKLO : FT_ZWD_CLKLO; // special case repeat on write data + else if (bwid4) ft_state <= (|ft_reg[8:5]) ? FT_WD_CLKLO : FT_ZWD_CLKLO; + else if (bwid2) ft_state <= (|ft_reg[8:3]) ? FT_WD_CLKLO : FT_ZWD_CLKLO; + else ft_state <= (|ft_reg[8:2]) ? FT_WD_CLKLO : FT_ZWD_CLKLO; + FT_WD_CLKLO: + if (bwid8) begin ft_reg <= { 1'b0,ft_reg[7:0]}; ft_state <= FT_WD_CLKHI; end // clear top flag + else if (bwid4) begin ft_reg <= {4'b0000,ft_reg[8:4]}; ft_state <= FT_WD_CLKHI; end // shift 4 bits right + else if (bwid2) begin ft_reg <= { 2'b00,ft_reg[8:2]}; ft_state <= FT_WD_CLKHI; end // shift 2 bits right + else begin ft_reg <= { 1'b0,ft_reg[8:1]}; ft_state <= FT_WD_CLKHI; end // shift 1 bit right + FT_ZWD_CLKLO: + if (ft_nak) begin ft_nak<= 1'b0; ft_state <= FT_0_IDLE; ft_wcyc <= 1'b0; end // terminate without TX handshake + else begin ft_state <= FT_0_IDLE; ft_wcyc <= 1'b0; end + FT_RD_CLKHI: // capture iodata pins end of CLKHI phase + if (ft_miso_i & (&ft_reg[7:0])) begin ft_nak <= 1'b1; ft_state <= FT_RD_CLKLO; end // NAK terminate on first cycle + else if (bwid8) begin ft_reg <= (ft_reg[0]) ? {ft_rdmasked[7:0],1'b1} : {ft_reg[8:1],1'b0}; ft_state <= FT_RD_CLKLO; end // 8-bit read twice + else if (bwid4) begin ft_reg <= {ft_rdmasked[3:0],ft_reg[8:4]}; ft_state <= FT_RD_CLKLO; end + else if (bwid2) begin ft_reg <= {ft_rdmasked[1:0],ft_reg[8:2]}; ft_state <= FT_RD_CLKLO; end + else begin ft_reg <= {ft_rdmasked[ 0],ft_reg[8:1]}; ft_state <= FT_RD_CLKLO; end + FT_RD_CLKLO: + if (ft_nak) begin ft_nak<= 1'b0; ft_state <= FT_0_IDLE; txdata <= 9'b0; end // terminate without TX handshake + else if (ft_reg[0]) begin ft_state <= FT_RD_CLKHI; ft_reg[0] <= !(bwid8); end // loop until all 8 bits shifted in (or 8-bit read repeated) + else begin ft_state <= FT_0_IDLE; txdata <= {1'b1,ft_reg[8:1]}; end + default: + ft_state <= FT_0_IDLE; + endcase + end + + // User logic ends + +endmodule diff --git a/IPLIB/axi_stream_io_v1_0/axi_stream_io_v1_0.v b/IPLIB/axi_stream_io_v1_0/axi_stream_io_v1_0.v new file mode 100755 index 0000000..a229917 --- /dev/null +++ b/IPLIB/axi_stream_io_v1_0/axi_stream_io_v1_0.v @@ -0,0 +1,114 @@ + +`timescale 1 ns / 1 ps + + module iostream_v1_0 # + ( + // Users to add parameters here + + // User parameters ends + // Do not modify the parameters beyond this line + + + // Parameters of Axi Slave Bus Interface axi + parameter integer C_axi_DATA_WIDTH = 32, + parameter integer C_axi_ADDR_WIDTH = 4, + + // Parameters of Axi Master Bus Interface tx + parameter integer C_tx_TDATA_WIDTH = 8, + parameter integer C_tx_START_COUNT = 3, + + // Parameters of Axi Slave Bus Interface rx + parameter integer C_rx_TDATA_WIDTH = 8 + ) + ( + // Users to add ports here + + // User ports ends + // Do not modify the ports beyond this line + + + // Ports of Axi Slave Bus Interface axi + input wire axi_aclk, + input wire axi_aresetn, + input wire [C_axi_ADDR_WIDTH-1 : 0] axi_awaddr, + input wire [2 : 0] axi_awprot, + input wire axi_awvalid, + output wire axi_awready, + input wire [C_axi_DATA_WIDTH-1 : 0] axi_wdata, + input wire [(C_axi_DATA_WIDTH/8)-1 : 0] axi_wstrb, + input wire axi_wvalid, + output wire axi_wready, + output wire [1 : 0] axi_bresp, + output wire axi_bvalid, + input wire axi_bready, + input wire [C_axi_ADDR_WIDTH-1 : 0] axi_araddr, + input wire [2 : 0] axi_arprot, + input wire axi_arvalid, + output wire axi_arready, + output wire [C_axi_DATA_WIDTH-1 : 0] axi_rdata, + output wire [1 : 0] axi_rresp, + output wire axi_rvalid, + input wire axi_rready, + + output wire interrupt, + // Ports of Axi Master Bus Interface tx + output wire tx_tvalid, + output wire [C_tx_TDATA_WIDTH-1 : 0] tx_tdata, + output wire [(C_tx_TDATA_WIDTH/8)-1 : 0] tx_tstrb, + output wire tx_tlast, + input wire tx_tready, + + // Ports of Axi Slave Bus Interface rx + output wire rx_tready, + input wire [C_rx_TDATA_WIDTH-1 : 0] rx_tdata, + input wire [(C_rx_TDATA_WIDTH/8)-1 : 0] rx_tstrb, + input wire rx_tlast, + input wire rx_tvalid + ); +// Instantiation of Axi Bus Interface axi + iostream_v1_0_axi # ( + .C_S_AXI_DATA_WIDTH(C_axi_DATA_WIDTH), + .C_S_AXI_ADDR_WIDTH(C_axi_ADDR_WIDTH) + ) iostream_v1_0_axi_inst ( + .S_AXI_ACLK(axi_aclk), + .S_AXI_ARESETN(axi_aresetn), + .tx_tvalid(tx_tvalid), + .tx_tdata(tx_tdata), +// output wire [0 : 0] tx_tstrb, +// output wire tx_tlast, + .tx_tready(tx_tready), + .rx_tvalid(rx_tvalid), + .rx_tdata(rx_tdata), +// input wire [0 : 0] tx_tstrb, +// input wire tx_tlast, + .tx_tready(rx_tready), + .interrupt(interrupt), + .S_AXI_AWADDR(axi_awaddr), + .S_AXI_AWPROT(axi_awprot), + .S_AXI_AWVALID(axi_awvalid), + .S_AXI_AWREADY(axi_awready), + .S_AXI_WDATA(axi_wdata), + .S_AXI_WSTRB(axi_wstrb), + .S_AXI_WVALID(axi_wvalid), + .S_AXI_WREADY(axi_wready), + .S_AXI_BRESP(axi_bresp), + .S_AXI_BVALID(axi_bvalid), + .S_AXI_BREADY(axi_bready), + .S_AXI_ARADDR(axi_araddr), + .S_AXI_ARPROT(axi_arprot), + .S_AXI_ARVALID(axi_arvalid), + .S_AXI_ARREADY(axi_arready), + .S_AXI_RDATA(axi_rdata), + .S_AXI_RRESP(axi_rresp), + .S_AXI_RVALID(axi_rvalid), + .S_AXI_RREADY(axi_rready) + ); + +assign tx_tstrb[0:0] = tx_tvalid; +assign tx_tlast = 1'b0; + + // Add user logic here + + // User logic ends + + endmodule diff --git a/IPLIB/axi_stream_io_v1_0/axi_stream_io_v1_0_axi_s.v b/IPLIB/axi_stream_io_v1_0/axi_stream_io_v1_0_axi_s.v new file mode 100755 index 0000000..d8e6eea --- /dev/null +++ b/IPLIB/axi_stream_io_v1_0/axi_stream_io_v1_0_axi_s.v @@ -0,0 +1,424 @@ + +`timescale 1 ns / 1 ps + + module iostream_v1_0_axi # + ( + // Users to add parameters here + + // User parameters ends + // Do not modify the parameters beyond this line + + // Width of S_AXI data bus + parameter integer C_S_AXI_DATA_WIDTH = 32, + // Width of S_AXI address bus + parameter integer C_S_AXI_ADDR_WIDTH = 4 + ) + ( + // Users to add ports here + output wire interrupt, + + // Ports of Axi Master Bus Interface tx +// input wire tx_aclk, +// input wire tx_aresetn, + output wire tx_tvalid, + output wire [7 : 0] tx_tdata, +// output wire [0 : 0] tx_tstrb, +// output wire tx_tlast, + input wire tx_tready, + + // Ports of Axi Slave Bus Interface rx +// input wire rx_aclk, +// input wire rx_aresetn, + output wire rx_tready, + input wire [7 : 0] rx_tdata, +// input wire [0 : 0] rx_tstrb, +// input wire rx_tlast, + input wire rx_tvalid, + + // User ports ends + // Do not modify the ports beyond this line + + // Global Clock Signal + input wire S_AXI_ACLK, + // Global Reset Signal. This Signal is Active LOW + input wire S_AXI_ARESETN, + // Write address (issued by master, acceped by Slave) + input wire [C_S_AXI_ADDR_WIDTH-1 : 0] S_AXI_AWADDR, + // Write channel Protection type. This signal indicates the + // privilege and security level of the transaction, and whether + // the transaction is a data access or an instruction access. + input wire [2 : 0] S_AXI_AWPROT, + // Write address valid. This signal indicates that the master signaling + // valid write address and control information. + input wire S_AXI_AWVALID, + // Write address ready. This signal indicates that the slave is ready + // to accept an address and associated control signals. + output wire S_AXI_AWREADY, + // Write data (issued by master, acceped by Slave) + input wire [C_S_AXI_DATA_WIDTH-1 : 0] S_AXI_WDATA, + // Write strobes. This signal indicates which byte lanes hold + // valid data. There is one write strobe bit for each eight + // bits of the write data bus. + input wire [(C_S_AXI_DATA_WIDTH/8)-1 : 0] S_AXI_WSTRB, + // Write valid. This signal indicates that valid write + // data and strobes are available. + input wire S_AXI_WVALID, + // Write ready. This signal indicates that the slave + // can accept the write data. + output wire S_AXI_WREADY, + // Write response. This signal indicates the status + // of the write transaction. + output wire [1 : 0] S_AXI_BRESP, + // Write response valid. This signal indicates that the channel + // is signaling a valid write response. + output wire S_AXI_BVALID, + // Response ready. This signal indicates that the master + // can accept a write response. + input wire S_AXI_BREADY, + // Read address (issued by master, acceped by Slave) + input wire [C_S_AXI_ADDR_WIDTH-1 : 0] S_AXI_ARADDR, + // Protection type. This signal indicates the privilege + // and security level of the transaction, and whether the + // transaction is a data access or an instruction access. + input wire [2 : 0] S_AXI_ARPROT, + // Read address valid. This signal indicates that the channel + // is signaling valid read address and control information. + input wire S_AXI_ARVALID, + // Read address ready. This signal indicates that the slave is + // ready to accept an address and associated control signals. + output wire S_AXI_ARREADY, + // Read data (issued by slave) + output wire [C_S_AXI_DATA_WIDTH-1 : 0] S_AXI_RDATA, + // Read response. This signal indicates the status of the + // read transfer. + output wire [1 : 0] S_AXI_RRESP, + // Read valid. This signal indicates that the channel is + // signaling the required read data. + output wire S_AXI_RVALID, + // Read ready. This signal indicates that the master can + // accept the read data and response information. + input wire S_AXI_RREADY + ); + + // AXI4LITE signals + reg [C_S_AXI_ADDR_WIDTH-1 : 0] axi_awaddr; + reg axi_awready; + reg axi_wready; + reg [1 : 0] axi_bresp; + reg axi_bvalid; + reg [C_S_AXI_ADDR_WIDTH-1 : 0] axi_araddr; + reg axi_arready; + reg [C_S_AXI_DATA_WIDTH-1 : 0] axi_rdata; + reg [1 : 0] axi_rresp; + reg axi_rvalid; + + // Example-specific design signals + // local parameter for addressing 32 bit / 64 bit C_S_AXI_DATA_WIDTH + // ADDR_LSB is used for addressing 32/64 bit registers/memories + // ADDR_LSB = 2 for 32 bits (n downto 2) + // ADDR_LSB = 3 for 64 bits (n downto 3) + localparam integer ADDR_LSB = (C_S_AXI_DATA_WIDTH/32) + 1; + localparam integer OPT_MEM_ADDR_BITS = 1; + + //---------------------------------------------- + //-- Signals for user logic register space example + //------------------------------------------------ + //-- Number of Slave Registers 4 + reg [8:0] tx_reg; // TX data + reg [8:0] rx_reg; // RX data + reg [7:0] ctrl_reg; // ctrl + wire slv_reg_rden; + wire slv_reg_wren; + reg [7:0] reg_data_out; + integer byte_index; + reg aw_en; + + wire tx_req = tx_reg[8]; // request to transmit + wire tx_ack = tx_tready; // acknowledge when stream ready + wire tx_rdy = !tx_reg[8]; + wire rx_req = rx_tvalid; // request to receive + wire rx_ack = !rx_reg[8]; + wire rx_rdy = rx_reg[8]; + + //assign rx_reg[7:0] <= rx_tdata; + + // I/O Connections assignments + + assign interrupt = ctrl_reg[4] & (!tx_req | rx_req); + + // TX stream interface + assign tx_tdata = tx_reg[7:0]; + assign tx_tvalid = tx_req; + + // RX stream interface + assign rx_tready = rx_ack; + + //AXI Slave + assign S_AXI_AWREADY = axi_awready; + assign S_AXI_WREADY = axi_wready; + assign S_AXI_BRESP = axi_bresp; + assign S_AXI_BVALID = axi_bvalid; + assign S_AXI_ARREADY = axi_arready; + assign S_AXI_RDATA = axi_rdata; + assign S_AXI_RRESP = axi_rresp; + assign S_AXI_RVALID = axi_rvalid; + // Implement axi_awready generation + // axi_awready is asserted for one S_AXI_ACLK clock cycle when both + // S_AXI_AWVALID and S_AXI_WVALID are asserted. axi_awready is + // de-asserted when reset is low. + + always @( posedge S_AXI_ACLK ) + begin + if ( S_AXI_ARESETN == 1'b0 ) + begin + axi_awready <= 1'b0; + aw_en <= 1'b1; + end + else + begin + if (~axi_awready && S_AXI_AWVALID && S_AXI_WVALID && aw_en) + begin + // slave is ready to accept write address when + // there is a valid write address and write data + // on the write address and data bus. This design + // expects no outstanding transactions. + axi_awready <= 1'b1; + aw_en <= 1'b0; + end + else if (S_AXI_BREADY && axi_bvalid) + begin + aw_en <= 1'b1; + axi_awready <= 1'b0; + end + else + begin + axi_awready <= 1'b0; + end + end + end + + // Implement axi_awaddr latching + // This process is used to latch the address when both + // S_AXI_AWVALID and S_AXI_WVALID are valid. + + always @( posedge S_AXI_ACLK ) + begin + if ( S_AXI_ARESETN == 1'b0 ) + begin + axi_awaddr <= 0; + end + else + begin + if (~axi_awready && S_AXI_AWVALID && S_AXI_WVALID && aw_en) + begin + // Write Address latching + axi_awaddr <= S_AXI_AWADDR; + end + end + end + + // Implement axi_wready generation + // axi_wready is asserted for one S_AXI_ACLK clock cycle when both + // S_AXI_AWVALID and S_AXI_WVALID are asserted. axi_wready is + // de-asserted when reset is low. + + always @( posedge S_AXI_ACLK ) + begin + if ( S_AXI_ARESETN == 1'b0 ) + begin + axi_wready <= 1'b0; + end + else + begin + if (~axi_wready && S_AXI_WVALID && S_AXI_AWVALID && aw_en ) + begin + // slave is ready to accept write data when + // there is a valid write address and write data + // on the write address and data bus. This design + // expects no outstanding transactions. + axi_wready <= 1'b1; + end + else + begin + axi_wready <= 1'b0; + end + end + end + + // Implement memory mapped register select and write logic generation + // The write data is accepted and written to memory mapped registers when + // axi_awready, S_AXI_WVALID, axi_wready and S_AXI_WVALID are asserted. Write strobes are used to + // select byte enables of slave registers while writing. + // These registers are cleared when reset (active low) is applied. + // Slave register write enable is asserted when valid address and data are available + // and the slave is ready to accept the write address and write data. + assign slv_reg_wren = axi_wready && S_AXI_WVALID && axi_awready && S_AXI_AWVALID; + + always @( posedge S_AXI_ACLK ) + begin + if ( S_AXI_ARESETN == 1'b0 ) + rx_reg <= 0; + else if ((ctrl_reg[1] == 1'b1)) + rx_reg <= 0; + else if (slv_reg_wren && (axi_awaddr[ADDR_LSB+OPT_MEM_ADDR_BITS:ADDR_LSB] == 2'h0)) + rx_reg[8:0] <= {1'b1, S_AXI_WDATA[7:0]}; + else if (slv_reg_rden && (axi_araddr[ADDR_LSB+OPT_MEM_ADDR_BITS:ADDR_LSB] == 2'h0)) + rx_reg[8] <= 1'b0; + else if (rx_req & rx_ack) // check precedence (rx_req) + rx_reg[8:0] <= {1'b1, rx_tdata[7:0]}; + end + + always @( posedge S_AXI_ACLK ) + begin + if ( S_AXI_ARESETN == 1'b0 ) + tx_reg <= 0; + else if ((ctrl_reg[0] == 1'b1)) + tx_reg <= 0; + else if (slv_reg_wren && (axi_awaddr[ADDR_LSB+OPT_MEM_ADDR_BITS:ADDR_LSB] == 2'h1)) + tx_reg[8:0] <= {1'b1, S_AXI_WDATA[7:0]}; + else if (tx_req & tx_ack) + tx_reg[8] <= 1'b0; + end + + always @( posedge S_AXI_ACLK ) + begin + if ( S_AXI_ARESETN == 1'b0 ) + ctrl_reg <= 8'b00000100; + else if (slv_reg_wren && (axi_awaddr[ADDR_LSB+OPT_MEM_ADDR_BITS:ADDR_LSB] == 2'h3)) + ctrl_reg[7:0] <= S_AXI_WDATA[7:0]; + end + + // Implement write response logic generation + // The write response and response valid signals are asserted by the slave + // when axi_wready, S_AXI_WVALID, axi_wready and S_AXI_WVALID are asserted. + // This marks the acceptance of address and indicates the status of + // write transaction. + + always @( posedge S_AXI_ACLK ) + begin + if ( S_AXI_ARESETN == 1'b0 ) + begin + axi_bvalid <= 0; + axi_bresp <= 2'b0; + end + else + begin + if (axi_awready && S_AXI_AWVALID && ~axi_bvalid && axi_wready && S_AXI_WVALID) + begin + // indicates a valid write response is available + axi_bvalid <= 1'b1; + axi_bresp <= 2'b0; // 'OKAY' response + end // work error responses in future + else + begin + if (S_AXI_BREADY && axi_bvalid) + //check if bready is asserted while bvalid is high) + //(there is a possibility that bready is always asserted high) + begin + axi_bvalid <= 1'b0; + end + end + end + end + + // Implement axi_arready generation + // axi_arready is asserted for one S_AXI_ACLK clock cycle when + // S_AXI_ARVALID is asserted. axi_awready is + // de-asserted when reset (active low) is asserted. + // The read address is also latched when S_AXI_ARVALID is + // asserted. axi_araddr is reset to zero on reset assertion. + + always @( posedge S_AXI_ACLK ) + begin + if ( S_AXI_ARESETN == 1'b0 ) + begin + axi_arready <= 1'b0; + axi_araddr <= 32'b0; + end + else + begin + if (~axi_arready && S_AXI_ARVALID) + begin + // indicates that the slave has acceped the valid read address + axi_arready <= 1'b1; + // Read address latching + axi_araddr <= S_AXI_ARADDR; + end + else + begin + axi_arready <= 1'b0; + end + end + end + + // Implement axi_arvalid generation + // axi_rvalid is asserted for one S_AXI_ACLK clock cycle when both + // S_AXI_ARVALID and axi_arready are asserted. The slave registers + // data are available on the axi_rdata bus at this instance. The + // assertion of axi_rvalid marks the validity of read data on the + // bus and axi_rresp indicates the status of read transaction.axi_rvalid + // is deasserted on reset (active low). axi_rresp and axi_rdata are + // cleared to zero on reset (active low). + always @( posedge S_AXI_ACLK ) + begin + if ( S_AXI_ARESETN == 1'b0 ) + begin + axi_rvalid <= 0; + axi_rresp <= 0; + end + else + begin + if (axi_arready && S_AXI_ARVALID && ~axi_rvalid) + begin + // Valid read data is available at the read data bus + axi_rvalid <= 1'b1; + axi_rresp <= 2'b0; // 'OKAY' response + end + else if (axi_rvalid && S_AXI_RREADY) + begin + // Read data is accepted by the master + axi_rvalid <= 1'b0; + end + end + end + + // Implement memory mapped register select and read logic generation + // Slave register read enable is asserted when valid address is available + // and the slave is ready to accept the read address. + assign slv_reg_rden = axi_arready & S_AXI_ARVALID & ~axi_rvalid; + always @(*) + begin + // Address decoding for reading registers + case ( axi_araddr[ADDR_LSB+OPT_MEM_ADDR_BITS:ADDR_LSB] ) + 2'h0 : reg_data_out <= rx_reg[7:0]; + 2'h1 : reg_data_out <= tx_reg[7:0]; + 2'h2 : reg_data_out <= {3'b000, ctrl_reg[4], !tx_rdy, tx_rdy, rx_rdy, rx_rdy}; + 2'h3 : reg_data_out <= ctrl_reg; + default : reg_data_out <= 0; + endcase + end + + // Output register or memory read data + always @( posedge S_AXI_ACLK ) + begin + if ( S_AXI_ARESETN == 1'b0 ) + begin + axi_rdata <= 0; + end + else + begin + // When there is a valid read address (S_AXI_ARVALID) with + // acceptance of read address by the slave (axi_arready), + // output the read dada + if (slv_reg_rden) + begin + axi_rdata <= {24'h000000, reg_data_out}; // register read data + end + end + end + + // Add user logic here + + // User logic ends + + endmodule -- GitLab