blob: 8489fb479585157ccd837a7b10cdf3fead0500a4 [file] [log] [blame]
# Copyright 2025 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
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
load("//rules:coco_tb.bzl", "vcs_cocotb_test", "verilator_cocotb_test", "verilator_cocotb_model")
load("//rules:kelvin_v2.bzl", "kelvin_v2_binary")
load("//rules:utils.bzl", "template_rule")
load("@kelvin_hw//third_party/python:requirements.bzl", "requirement")
package(default_visibility = ["//visibility:public"])
COCOTB_TEST_BINARY_TARGETS = glob(["**/*.elf"]) + glob(["**/*.o"]) + [
":align_test.elf",
":float_csr_interlock_test.elf",
":finish_txn_before_halt.elf",
":stress_test.elf",
":wfi_slot_0.elf",
":wfi_slot_1.elf",
":wfi_slot_2.elf",
":wfi_slot_3.elf",
]
VERILATOR_BUILD_ARGS = [
"-Wno-WIDTH",
"-Wno-CASEINCOMPLETE",
"-Wno-LATCH",
"-Wno-SIDEEFFECT",
"-Wno-MULTIDRIVEN",
"-Wno-UNOPTFLAT",
# Warnings that we disable for fpnew
"-Wno-ASCRANGE",
"-Wno-WIDTHEXPAND",
"-Wno-WIDTHTRUNC",
"-Wno-UNSIGNED",
"-DUSE_GENERIC=\"\"",
]
verilator_cocotb_model(
name = "core_mini_axi_model",
hdl_toplevel = "CoreMiniAxi",
verilog_source = "//hdl/chisel/src/kelvin:CoreMiniAxi.sv",
cflags = VERILATOR_BUILD_ARGS,
)
verilator_cocotb_model(
name = "core_mini_debug_axi_model",
hdl_toplevel = "CoreMiniDebugAxi",
verilog_source = "//hdl/chisel/src/kelvin:CoreMiniDebugAxi.sv",
cflags = VERILATOR_BUILD_ARGS,
)
verilator_cocotb_model(
name = "rvv_core_mini_axi_model",
hdl_toplevel = "RvvCoreMiniAxi",
verilog_source = "//hdl/chisel/src/kelvin:RvvCoreMiniAxi.sv",
cflags = VERILATOR_BUILD_ARGS,
)
template_rule(
verilator_cocotb_test,
{
"core_mini_axi_sim_cocotb": {
"hdl_toplevel": "CoreMiniAxi",
"model": ":core_mini_axi_model",
"size": "enormous",
},
"rvv_core_mini_axi_sim_cocotb": {
"hdl_toplevel": "RvvCoreMiniAxi",
"model": ":rvv_core_mini_axi_model",
"size": "enormous",
"tags": ["manual"], # This suite takes a really long time
},
},
waves = True,
seed = "42",
test_module = ["core_mini_axi_sim.py"],
deps = [
"//kelvin_test_utils:core_mini_axi_sim_interface",
requirement("tqdm"),
"@bazel_tools//tools/python/runfiles",
],
data = COCOTB_TEST_BINARY_TARGETS,
)
verilator_cocotb_test(
name = "core_mini_axi_debug_cocotb",
hdl_toplevel = "CoreMiniDebugAxi",
model = ":core_mini_debug_axi_model",
waves = True,
seed = "42",
test_module = ["core_mini_axi_debug.py"],
size = "enormous",
deps = [
"//kelvin_test_utils:core_mini_axi_sim_interface",
"//kelvin_test_utils:core_mini_axi_pyocd_gdbserver",
"@bazel_tools//tools/python/runfiles",
],
data = [
":fptr.elf",
":math.elf",
":noop.elf",
":registers.elf",
] + COCOTB_TEST_BINARY_TARGETS,
)
TESTCASES = [
"core_mini_axi_basic_write_read_memory",
"core_mini_axi_run_wfi_in_all_slots",
"core_mini_axi_slow_bready",
"core_mini_axi_write_read_memory_stress_test",
"core_mini_axi_master_write_alignment",
"core_mini_axi_finish_txn_before_halt_test",
"core_mini_axi_riscv_tests",
"core_mini_axi_riscv_dv",
"core_mini_axi_csr_test",
"core_mini_axi_exceptions_test",
"core_mini_axi_kelvin_isa_test",
"core_mini_axi_rand_instr_test",
"core_mini_axi_burst_types_test",
"core_mini_axi_float_csr_test",
]
template_rule(
vcs_cocotb_test,
{
"vcs_core_mini_axi_sim_cocotb": {
"hdl_toplevel": "CoreMiniAxi",
"verilog_sources": [
"//hdl/chisel/src/kelvin:core_mini_axi_cc_library_verilog"
],
},
"vcs_rvv_core_mini_axi_sim_cocotb": {
"hdl_toplevel": "RvvCoreMiniAxi",
"verilog_sources": [
"//hdl/chisel/src/kelvin:rvv_core_mini_axi_cc_library_verilog"
],
},
},
size = "large",
defines = {
"USE_GENERIC" : "",
},
waves = True,
seed = "42",
test_module = ["core_mini_axi_sim.py"],
testcases = TESTCASES,
build_args = [
"-timescale=1ns/1ps",
"-kdb",
"+vcs+fsdbon",
"-debug_access+all",
"-cm",
"line+cond+tgl+branch+assert",
"-cm_hier",
"../tests/cocotb/coverage_exclude.cfg",
],
test_args = [
"+vcs+fsdbon",
"-cm",
"line+cond+tgl+branch+assert",
],
deps = [
"//kelvin_test_utils:core_mini_axi_sim_interface",
requirement("tqdm"),
"@bazel_tools//tools/python/runfiles",
],
data = COCOTB_TEST_BINARY_TARGETS + [
":coverage_exclude.cfg",
],
)
RVV_TEST_BINARY_TARGETS = [
"//tests/cocotb/rvv:rvv_load.elf",
"//tests/cocotb/rvv:rvv_add.elf",
"//tests/cocotb/rvv:vstart_store.elf"] + [
"//tests/cocotb/rvv/arithmetics:rvv_{}_{}_m1.elf".format(TEST_OP, DTYPE)
for DTYPE in ["int8", "int16", "int32", "uint8", "uint16", "uint32"]
for TEST_OP in ["add", "sub", "mul", "div", "redsum", "redmin", "redmax"]
]
verilator_cocotb_test(
name = "rvv_assembly_cocotb_test",
hdl_toplevel = "RvvCoreMiniAxi",
model = ":rvv_core_mini_axi_model",
waves = True,
seed = "42",
test_module = ["rvv_assembly_cocotb_test.py"],
deps = [
"//kelvin_test_utils:core_mini_axi_sim_interface",
requirement("tqdm"),
"@bazel_tools//tools/python/runfiles",
],
data = RVV_TEST_BINARY_TARGETS,
size = "large",
)
kelvin_v2_binary(
name = "align_test",
srcs = [
"align_test.cc",
],
semihosting = True,
)
kelvin_v2_binary(
name = "wfi_slot_0",
srcs = [
"wfi_slot_0.c",
],
)
kelvin_v2_binary(
name = "wfi_slot_1",
srcs = [
"wfi_slot_1.c",
],
)
kelvin_v2_binary(
name = "wfi_slot_2",
srcs = [
"wfi_slot_2.c",
],
)
kelvin_v2_binary(
name = "wfi_slot_3",
srcs = [
"wfi_slot_3.c",
],
)
kelvin_v2_binary(
name = "finish_txn_before_halt",
srcs = [
"finish_txn_before_halt.cc",
],
)
kelvin_v2_binary(
name = "stress_test",
srcs = [
"stress_test.cc",
],
)
kelvin_v2_binary(
name = "float_csr_interlock_test",
srcs = [
"float_csr_interlock_test.S",
],
)
kelvin_v2_binary(
name = "fptr",
srcs = [
"fptr.cc",
],
)
kelvin_v2_binary(
name = "math",
srcs = [
"math.cc",
],
)
kelvin_v2_binary(
name = "noop",
srcs = [
"noop.cc",
],
)
kelvin_v2_binary(
name = "registers",
srcs = [
"registers.S",
],
)
verilator_cocotb_test(
name = "rvv_load_store_test",
hdl_toplevel = "RvvCoreMiniAxi",
model = ":rvv_core_mini_axi_model",
waves = True,
seed = "42",
test_module = ["rvv_load_store_test.py"],
deps = [
"//kelvin_test_utils:sim_test_fixture",
"@bazel_tools//tools/python/runfiles",
],
data = [
'//tests/cocotb/rvv/load_store:load8_indexed_m1.elf',
'//tests/cocotb/rvv/load_store:load8_segment2_unit_m1.elf',
'//tests/cocotb/rvv/load_store:load16_segment2_unit_m1.elf',
'//tests/cocotb/rvv/load_store:load32_segment2_unit_m1.elf',
'//tests/cocotb/rvv/load_store:load8_segment2_unit_m2.elf',
'//tests/cocotb/rvv/load_store:load16_segment2_unit_m2.elf',
'//tests/cocotb/rvv/load_store:load32_segment2_unit_m2.elf',
'//tests/cocotb/rvv/load_store:load8_segment2_stride6_m1.elf',
'//tests/cocotb/rvv/load_store:load16_segment2_stride6_m1.elf',
'//tests/cocotb/rvv/load_store:load8_stride2_m1.elf',
'//tests/cocotb/rvv/load_store:load8_stride2_m1_partial.elf',
'//tests/cocotb/rvv/load_store:load8_stride2_mf4.elf',
'//tests/cocotb/rvv/load_store:load_store8_unit_m2.elf',
'//tests/cocotb/rvv/load_store:load_store16_unit_m2.elf',
'//tests/cocotb/rvv/load_store:load_store32_unit_m2.elf',
'//tests/cocotb/rvv/load_store:load16_stride4_m1.elf',
'//tests/cocotb/rvv/load_store:load16_stride4_m1_partial.elf',
'//tests/cocotb/rvv/load_store:load16_stride4_mf2.elf',
'//tests/cocotb/rvv/load_store:load32_stride8_m1.elf',
'//tests/cocotb/rvv/load_store:load32_stride8_m1_partial.elf',
'//tests/cocotb/rvv/load_store:store8_indexed_m1.elf',
],
size = "large",
)
verilator_cocotb_test(
name = "rvv_arithmetic_cocotb_test",
hdl_toplevel = "RvvCoreMiniAxi",
model = ":rvv_core_mini_axi_model",
waves = True,
seed = "42",
test_module = ["rvv_arithmetic_cocotb_test.py"],
deps = [
"//kelvin_test_utils:sim_test_fixture",
"@bazel_tools//tools/python/runfiles",
requirement("tqdm"),
],
data = RVV_TEST_BINARY_TARGETS,
size = "large",
)