blob: 46af4e2e7d2788df44b4edc5e9e1d2353b31074d [file] [log] [blame]
# Copyright lowRISC contributors.
# Licensed under the Apache License, Version 2.0, see LICENSE for details.
# SPDX-License-Identifier: Apache-2.0
load("//rules:fusesoc.bzl", "fusesoc_build")
# This configuration exposes fusesoc's "verilator_options" option to the
# command line. This is intended to allow CI to specifically build a single
# -threaded Verilator model since the build environment there is more resource
# -constrained.
# By default and in all other cases, the Verilator model should be built to
# run with 4 threads.
load("@bazel_skylib//rules:common_settings.bzl", "string_list_flag")
string_list_flag(
name = "verilator_options",
build_setting_default = [
"--threads",
"4",
],
)
fusesoc_build(
name = "verilator_real",
srcs = [
":all_files",
],
cores = [
"//:cores",
],
data = ["//hw/ip/otbn:all_files"],
flags = ["--verilator_options=--threads 1"],
systems = ["lowrisc:dv:chip_verilator_sim"],
tags = ["verilator"],
target = "sim",
verilator_options = ":verilator_options",
)
# This is used in CI steps that do not want to run Verilator tests, and thus
# do not want to accidentally build the Verilator model. This causes the
# //hw:verilator target to not emit any files, which will break any tests that
# actually rely on this; builds will succeed, tests will fail.
#
# FIXME(lowRISC/opentitan#12259): This is a temporary workaround.
config_setting(
name = "disable_verilator_build",
values = {"define": "DISABLE_VERILATOR_BUILD=true"},
)
genrule(
name = "verilator_stub",
outs = ["verilator-stub"],
cmd = """
mkdir -p $@/sim-verilator
script=$@/sim-verilator/Vchip_sim_tb
echo '#!/bin/bash' > $$script
echo 'echo "ERROR: sim_verilator tests cannot be run when --define DISABLE_VERILATOR_BUILD=true is set!"' >> $$script
echo 'echo "This indicates an error in your Bazel invokation"' >> $$script
echo 'exit 1' >> $$script
chmod +x $@/sim-verilator/Vchip_sim_tb
""",
)
alias(
name = "verilator",
actual = select({
":disable_verilator_build": ":verilator-stub",
"//conditions:default": ":verilator_real",
}),
tags = ["verilator"],
visibility = ["//visibility:public"],
)
genrule(
name = "fusesoc_ignore",
outs = ["FUSESOC_IGNORE"],
cmd = """
touch $@
""",
visibility = ["//visibility:public"],
)
# TODO(lowRISC/opentitan#7972): Globbing all of the //hw/... hierarchy together
# is a bit of a hack. Longer term, we need proper rules for expressing the
# relationships between verilog components.
filegroup(
name = "all_files",
srcs = glob(["**"]) + [
"//hw/ip:all_files",
"//hw/top_earlgrey:all_files",
],
visibility = ["//visibility:public"],
)