| # Copyright 2024 Google LLC |
| # |
| # Licensed under the Apache License, Version 2.0 (the "License"); |
| # you may not use this file except in compliance with the License. |
| # You may obtain a copy of the License at |
| # |
| # https://www.apache.org/licenses/LICENSE-2.0 |
| # |
| # Unless required by applicable law or agreed to in writing, software |
| # distributed under the License is distributed on an "AS IS" BASIS, |
| # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| # See the License for the specific language governing permissions and |
| # limitations under the License. |
| |
| SENCHA_SRC_DIR := $(ROOTDIR)/hw/matcha |
| SENCHA_OUT_DIR := $(OUT)/sencha/hw |
| SENCHA_VERILATOR_TB := $(SENCHA_OUT_DIR)/sim-verilator/Vsencha_sim_tb |
| SENCHA_TESTLOG_DIR := $(SENCHA_OUT_DIR)/test-log |
| SENCHA_FPGA_BINARY_DIR := $(SENCHA_OUT_DIR)/fpga_tests |
| SENCHA_FPGA_SENCHA_BINARY_DIR := $(SENCHA_FPGA_BINARY_DIR)/sencha |
| SENCHA_FPGA_KELVIN_BINARY_DIR := $(SENCHA_FPGA_BINARY_DIR)/kelvin |
| BOOT_ROM_ELF := boot_rom.elf |
| |
| $(SENCHA_OUT_DIR): |
| mkdir -p $(SENCHA_OUT_DIR) |
| |
| ## Regenerate Sencha HW files frop IPs and top_sencha definition. |
| # This target uses Open Titan's autogen tools as well as the HW IPs to generate |
| # the system verilog files as well as the DV register definition cores and |
| # system verilog files. The source code is from both hw/opentitan-upstream and |
| # hw/matcha/, while the output is stored at out/sencha/hw. |
| # |
| # This is a dev-only target (not for CI), as it modifies the hw/sencha source |
| # tree with generated code. |
| sencha_hw_generate_all: | $(SENCHA_OUT_DIR) |
| $(MAKE) -C "$(SENCHA_SRC_DIR)/hw" TOPS=top_sencha all |
| |
| ## Build Sencha verilator testbench. |
| # This target builds the verilator testbench binary from hw/matcha/hw/top_sencha |
| # using hw/matcha/hw/ip and hw/opentitan-upstream as the libraries. The output is |
| # stored in out/sencha/hw/. |
| # This target is compute-intensive. Make sure you have a powerful enough machine |
| # to build it. |
| sencha_hw_verilator_sim: $(SENCHA_VERILATOR_TB) |
| |
| $(SENCHA_VERILATOR_TB): $(SENCHA_OUT_DIR) verilator |
| cd $(SENCHA_SRC_DIR) && \ |
| bazel build //hw:sencha_verilator |
| cd $(SENCHA_SRC_DIR) && \ |
| cp -rf --no-preserve=mode bazel-bin/hw/build.sencha_verilator_real/* "$(SENCHA_OUT_DIR)" && \ |
| chmod +x "$(SENCHA_OUT_DIR)/sim-verilator/Vsencha_sim_tb" |
| |
| ## Build Sencha FPGA Target for Nexus Board. |
| # This target builds the FPGA bit file from hw/matcha/hw/top_sencha |
| # using hw/matcha/hw/ip and hw/opentitan-upstream as the libraries. |
| # The output is stored in out/sencha/hw/. |
| # This target is compute-intensive. Make sure you have a powerful enough machine |
| # and Vivado suporting the latest UltraScale+ device to build it. |
| sencha_hw_fpga_nexus: | $(SENCHA_OUT_DIR) |
| cd $(SENCHA_SRC_DIR) && \ |
| bazel build //hw/bitstream/vivado:sencha_fpga_nexus |
| cd $(SENCHA_SRC_DIR) && \ |
| find bazel-bin/hw/bitstream/vivado/build.sencha_fpga_nexus/ -regex '.*.\(bit\|mmi\)' \ |
| -exec cp -f '{}' "$(SENCHA_OUT_DIR)" \; |
| |
| $(SENCHA_TESTLOG_DIR): |
| mkdir -p $(SENCHA_TESTLOG_DIR) |
| |
| ## Build Sencha sw artifacts |
| # |
| # Checks the sencha sw code integrity for targets not covered by the verilator |
| # tests. |
| # |
| # TODO(hoangm): Change below target to test Sencha-specific target once CHERIoT binaries can be |
| # built. Currently the target builds matcha targets as well. |
| sencha_sw_all: | $(SENCHA_OUT_DIR) |
| cd $(SENCHA_SRC_DIR) && \ |
| bazel build --define DISABLE_VERILATOR_BUILD=true --build_tag_filters="-kelvin_fpga,-cheri" \ |
| //sw/device/... |
| cd $(SENCHA_SRC_DIR) && \ |
| find "bazel-out/" \( -type f -name "*.elf" -o -name "*.bin" -o -name "*.vmem" \) \ |
| -exec cp -f --parents "{}" "$(SENCHA_OUT_DIR)" \; |
| |
| $(SENCHA_FPGA_SENCHA_BINARY_DIR): |
| mkdir -p $(SENCHA_FPGA_SENCHA_BINARY_DIR) |
| |
| ## Build test binaries that run on FPGA |
| sencha_fpga_tests: | $(SENCHA_FPGA_SENCHA_BINARY_DIR) |
| cd $(SENCHA_SRC_DIR) && \ |
| bazel query //sw/device/tests/... \ |
| | grep 'fpga_nexus' \ |
| | egrep '_bin$$' \ |
| | grep -v '/smc:' \ |
| | grep -v 'kelvin' \ |
| | grep -v 'example_test_from_rom_rom_prog_fpga_nexus_bin' \ |
| | xargs bazel build |
| cd $(SENCHA_SRC_DIR) && \ |
| find 'bazel-out/' \ |
| -type f \ |
| \( -wholename "*ST-*/*fpga_nexus.elf" -o -wholename "*ST-*/*fpga_nexus.bin" \) \ |
| -exec cp -f '{}' "$(SENCHA_FPGA_SENCHA_BINARY_DIR)" \; |
| |
| $(SENCHA_FPGA_KELVIN_BINARY_DIR): |
| mkdir -p "$(SENCHA_FPGA_KELVIN_BINARY_DIR)" |
| |
| |
| ## Build Sencha Kelvin SW FPGA test artifacts |
| # |
| # Build kelvin artifacts and package it in a tarball and ready for use on the FPGA |
| # The output is at out/sencha/hw/fpga_tests/kelvin |
| # |
| sencha_kelvin_fpga_tarballs: kelvin_sw | $(SENCHA_FPGA_KELVIN_BINARY_DIR) |
| cd $(SENCHA_SRC_DIR) && \ |
| bazel build --define DISABLE_VERILATOR_BUILD=true \ |
| @kelvin-binary//... |
| # Copy the tarballs and sc binary to out/. |
| cd $(SENCHA_SRC_DIR) && \ |
| find "bazel-out/" -type f -wholename "*fastbuild-*/sw/device/tests/kelvin/fpga_tests/kelvin_test_sc_extflash_fpga_nexus.bin" |\ |
| xargs -I {} cp -f {} "$(SENCHA_FPGA_KELVIN_BINARY_DIR)" |
| cd $(SENCHA_SRC_DIR) && \ |
| find "bazel-bin/external/kelvin-binary" -name "*.tar" |\ |
| xargs -I {} cp -f {} "$(SENCHA_FPGA_KELVIN_BINARY_DIR)" |
| |
| |
| ## Build opentitantool for sencha FPGA tests |
| opentitantool_pkg: | $(SENCHA_OUT_DIR) |
| cd $(SENCHA_SRC_DIR) && \ |
| bazel build //sw:opentitantool_pkg |
| cd $(SENCHA_SRC_DIR) && \ |
| cp -f bazel-bin/sw/opentitantool_pkg.tar.gz $(SENCHA_OUT_DIR) |
| |
| ## Build and run sencha verilator test suite |
| # |
| # TODO(hoangm): Change below target to test Sencha-specific target once CHERIoT binaries can be |
| # built. Currently the target builds matcha targets. |
| sencha_hw_verilator_tests: verilator | $(SENCHA_TESTLOG_DIR) |
| cd $(SENCHA_SRC_DIR) && \ |
| bazel test --test_output=errors --test_timeout=180,600,1800,3600 \ |
| --local_test_jobs=HOST_CPUS*0.25 \ |
| --//hw:make_options=-j,16 \ |
| //sw/device/tests:verilator_test_suite |
| cd $(SENCHA_SRC_DIR) && cp -rf "bazel-testlogs/sw" "$(SENCHA_TESTLOG_DIR)" |
| |
| ## Build the boot ROM image |
| # |
| # This builds the HW boot rom executable for simulation. |
| # Source is in hw/matcha, while output is placed in |
| # out/sencha/hw/ |
| multihart_boot_rom: | $(SENCHA_OUT_DIR) |
| cd $(SENCHA_SRC_DIR) && \ |
| bazel build --config=riscv32 //sw/device/lib/testing/test_rom:sencha_test_rom_no_otp_fpga_nexus.elf |
| cd $(SENCHA_SRC_DIR) && \ |
| find "bazel-out/" -wholename "*test_rom/sencha_test_rom_no_otp_fpga_nexus.elf" \ |
| -exec cp -f '{}' "$(SENCHA_OUT_DIR)/$(BOOT_ROM_ELF)" \; |
| |
| ## Clean Sencha HW artifact |
| sencha_hw_clean: |
| rm -rf $(SENCHA_OUT_DIR) |
| cd $(SENCHA_SRC_DIR) && \ |
| bazel clean --expunge |
| |
| ## Build the spi_passthough binary |
| # |
| # This builds the spi_passthrough_fpga_nexus.bin binary that can be used to |
| # write flash tarballs to the nexus SPI boot flash. The binary will be copied |
| # to out/spi_passthrough_fpga_nexus.bin |
| spi_passthrough: | $(OUT) |
| cd $(SENCHA_SRC_DIR) && \ |
| bazel build --define DISABLE_VERILATOR_BUILD=true \ |
| sw/device/examples/spi_passthrough |
| find "$(SENCHA_SRC_DIR)/bazel-out/" -type f -wholename "*fastbuild-*/sw/device/examples/spi_passthrough/spi_passthrough_fpga_nexus.bin" |\ |
| xargs -I '{}' cp -f '{}' "$(OUT)" |
| |
| # TODO(hoangm): Align the public bitstream naming artifacts once the sencha bitstream has been added to CI. |
| ## Fetch latest Nexus bitstream and matching opentitantool |
| latest_bitstream: | $(OUT) |
| curl https://storage.googleapis.com/shodan-public-artifacts/nexus-bitstream_latest.tar.gz -o $(OUT)/nexus-bitstream.tar.gz |
| tar -C $(OUT) -xf $(OUT)/nexus-bitstream.tar.gz |
| tar -C $(OUT) -xf $(OUT)/results/sencha_fpga_nexus_smoketest.tar.gz |
| curl https://storage.googleapis.com/shodan-public-artifacts/opentitantool_pkg_latest.tar.gz -o $(OUT)/opentitantool_pkg.tar.gz |
| tar -C $(OUT) -xf $(OUT)/opentitantool_pkg.tar.gz |
| |
| .PHONY:: sencha_hw_verilator_sim sencha_hw_clean sencha_hw_verilator_tests |
| .PHONY:: sencha_sw_all opentitantool_pkg |
| .PHONY:: sencha_hw_fpga_nexus sencha_kelvin_fpga_tarballs |
| .PHONY:: multihart_boot_rom |
| .PHONY:: spi_passthrough |
| .PHONY:: latest_bitstream |