| # Copyright lowRISC contributors. |
| # Licensed under the Apache License, Version 2.0, see LICENSE for details. |
| # SPDX-License-Identifier: Apache-2.0 |
| |
| load("@rules_pkg//pkg:mappings.bzl", "pkg_filegroup", "pkg_files") |
| load("//rules:fusesoc.bzl", "fusesoc_build") |
| load("//rules:otp.bzl", "get_otp_images") |
| load("//rules:splice.bzl", "bitstream_splice") |
| |
| package(default_visibility = ["//visibility:public"]) |
| |
| # The readmem directives in the fusesoc-ized build tree will be in the subdir |
| # ${build_root}/src/lowrisc_prim_util_memload_0/rtl/prim_util_memload.svh, |
| # and ${build_root} will be a subdirectory called `build.fpga_cw310` inside of |
| # bazel-out/k8-{configname}/bin/hw/bitstream/vivado. |
| # Therefore, the relative path between prim_util_memload.svh and the project-root |
| # relative $(location ...) resolved labels is up 10 subdirectories. |
| _PREFIX = "../../../../../../../../../.." |
| |
| _FPGA_CW310_TESTROM = "//sw/device/lib/testing/test_rom:test_rom_fpga_cw310_scr_vmem" |
| |
| _FPGA_CW310_OTP_RMA = "//hw/ip/otp_ctrl/data:img_rma" |
| |
| _FPGA_CW310_TESTROM_PATH = "{}/$(location {})".format(_PREFIX, _FPGA_CW310_TESTROM) |
| |
| _FPGA_CW310_OTP_RMA_PATH = "{}/$(location {})".format(_PREFIX, _FPGA_CW310_OTP_RMA) |
| |
| # Note: all of the targets are tagged with "manual" to prevent them from being |
| # matched by bazel wildcards like "//...". In order to build the bitstream, |
| # you need to ask for it directly or by dependency via another rule, such as |
| # a functest. |
| fusesoc_build( |
| name = "fpga_cw310", |
| testonly = True, |
| srcs = [ |
| "//hw:all_files", |
| _FPGA_CW310_TESTROM, |
| _FPGA_CW310_OTP_RMA, |
| ], |
| cores = ["//:cores"], |
| data = ["//hw/ip/otbn:all_files"], |
| flags = [ |
| "--BootRomInitFile=" + _FPGA_CW310_TESTROM_PATH, |
| "--OtpCtrlMemInitFile=" + _FPGA_CW310_OTP_RMA_PATH, |
| ], |
| output_groups = { |
| "bitstream": ["synth-vivado/lowrisc_systems_chip_earlgrey_cw310_0.1.bit"], |
| "rom_mmi": ["synth-vivado/rom.mmi"], |
| "otp_mmi": ["synth-vivado/otp.mmi"], |
| }, |
| systems = ["lowrisc:systems:chip_earlgrey_cw310"], |
| tags = ["manual"], |
| target = "synth", |
| ) |
| |
| filegroup( |
| name = "fpga_cw310_test_rom", |
| testonly = True, |
| srcs = [":fpga_cw310"], |
| output_group = "bitstream", |
| tags = ["manual"], |
| ) |
| |
| filegroup( |
| name = "rom_mmi", |
| testonly = True, |
| srcs = [":fpga_cw310"], |
| output_group = "rom_mmi", |
| tags = ["manual"], |
| ) |
| |
| filegroup( |
| name = "otp_mmi", |
| testonly = True, |
| srcs = [":fpga_cw310"], |
| output_group = "otp_mmi", |
| tags = ["manual"], |
| ) |
| |
| bitstream_splice( |
| name = "fpga_cw310_rom", |
| testonly = True, |
| src = ":fpga_cw310_test_rom", |
| data = "//sw/device/silicon_creator/rom:rom_with_fake_keys_fpga_cw310_scr_vmem", |
| meminfo = ":rom_mmi", |
| tags = ["manual"], |
| ) |
| |
| # Splice OTP images into the ROM bitstream. |
| [ |
| bitstream_splice( |
| name = "fpga_cw310_rom_otp_" + otp_name, |
| testonly = True, |
| src = ":fpga_cw310_rom", |
| data = img_target, |
| meminfo = ":otp_mmi", |
| tags = ["manual"], |
| ) |
| for (otp_name, img_target) in get_otp_images() |
| ] |
| |
| # Standalone CW310 image for use with hyperdebug. |
| fusesoc_build( |
| name = "fpga_cw310_hyperdebug", |
| testonly = True, |
| srcs = [ |
| "//hw:all_files", |
| _FPGA_CW310_TESTROM, |
| _FPGA_CW310_OTP_RMA, |
| ], |
| cores = ["//:cores"], |
| data = ["//hw/ip/otbn:all_files"], |
| flags = [ |
| "--BootRomInitFile=" + _FPGA_CW310_TESTROM_PATH, |
| "--OtpCtrlMemInitFile=" + _FPGA_CW310_OTP_RMA_PATH, |
| ], |
| output_groups = { |
| "bitstream": ["synth-vivado/lowrisc_systems_chip_earlgrey_cw310_hyperdebug_0.1.bit"], |
| "rom_mmi": ["synth-vivado/rom.mmi"], |
| "otp_mmi": ["synth-vivado/otp.mmi"], |
| }, |
| systems = ["lowrisc:systems:chip_earlgrey_cw310_hyperdebug"], |
| tags = ["manual"], |
| target = "synth", |
| ) |
| |
| filegroup( |
| name = "fpga_cw310_test_rom_hyp", |
| testonly = True, |
| srcs = [":fpga_cw310_hyperdebug"], |
| output_group = "bitstream", |
| tags = ["manual"], |
| ) |
| |
| filegroup( |
| name = "rom_mmi_hyp", |
| testonly = True, |
| srcs = [":fpga_cw310_hyperdebug"], |
| output_group = "rom_mmi", |
| tags = ["manual"], |
| ) |
| |
| filegroup( |
| name = "otp_mmi_hyp", |
| testonly = True, |
| srcs = [":fpga_cw310_hyperdebug"], |
| output_group = "otp_mmi", |
| tags = ["manual"], |
| ) |
| |
| # Packaging rules for bitstreams |
| pkg_files( |
| name = "standard", |
| testonly = True, |
| srcs = [ |
| ":fpga_cw310_rom", |
| ":fpga_cw310_test_rom", |
| ":otp_mmi", |
| ":rom_mmi", |
| ] + [ |
| ":fpga_cw310_rom_otp_" + otp_name |
| for (otp_name, _) in get_otp_images() |
| ], |
| prefix = "earlgrey/fpga_cw310/standard", |
| tags = ["manual"], |
| ) |
| |
| pkg_files( |
| name = "hyperdebug", |
| testonly = True, |
| srcs = [ |
| ":fpga_cw310_test_rom_hyp", |
| ":otp_mmi_hyp", |
| ":rom_mmi_hyp", |
| ], |
| prefix = "earlgrey/fpga_cw310/hyperdebug", |
| tags = ["manual"], |
| ) |
| |
| pkg_filegroup( |
| name = "package", |
| testonly = True, |
| srcs = [ |
| ":hyperdebug", |
| ":standard", |
| ], |
| tags = ["manual"], |
| ) |