|  | # Copyright 2023 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:utils.bzl", "template_rule") | 
|  |  | 
|  | cc_library( | 
|  | name = "elf", | 
|  | srcs = [ | 
|  | "elf.cc", | 
|  | ], | 
|  | hdrs = [ | 
|  | "elf.h", | 
|  | ], | 
|  | visibility = ["//visibility:public"], | 
|  | ) | 
|  |  | 
|  | cc_library( | 
|  | name = "util", | 
|  | hdrs = [ | 
|  | "util.h", | 
|  | ], | 
|  | ) | 
|  |  | 
|  | cc_library( | 
|  | name = "sim_libs", | 
|  | hdrs = [ | 
|  | "fifo.h", | 
|  | "sysc_module.h", | 
|  | "sysc_tb.h", | 
|  | ], | 
|  | includes = [ | 
|  | "systemc/include", | 
|  | ], | 
|  | deps = [ | 
|  | "@accellera_systemc//:systemc", | 
|  | ], | 
|  | ) | 
|  |  | 
|  | cc_library( | 
|  | name = "kelvin_if", | 
|  | hdrs = [ | 
|  | "kelvin/core_if.h", | 
|  | "kelvin/debug_if.h", | 
|  | "kelvin/kelvin_cfg.h", | 
|  | "kelvin/memory_if.h", | 
|  | ], | 
|  | defines = ["KELVIN_SIMD=256"], | 
|  | ) | 
|  |  | 
|  | cc_binary( | 
|  | name = "core_sim", | 
|  | srcs = [ | 
|  | "kelvin/core_tb.cc", | 
|  | "@kelvin_hw//hdl/chisel/src/kelvin:VCore_parameters.h", | 
|  | ], | 
|  | defines = [ | 
|  | "VERILATOR_MODEL=VCore", | 
|  | ], | 
|  | deps = [ | 
|  | ":kelvin_if", | 
|  | ":sim_libs", | 
|  | ":util", | 
|  | "//hdl/chisel/src/kelvin:core_cc_library", | 
|  | "@com_google_absl//absl/flags:flag", | 
|  | "@com_google_absl//absl/flags:parse", | 
|  | "@com_google_absl//absl/flags:usage", | 
|  | ], | 
|  | ) | 
|  |  | 
|  | CORE_MINI_AXI_TB_CC_LIBRARY_COMMON_SRCS = [ | 
|  | "kelvin/core_mini_axi_tb.cc", | 
|  | ] | 
|  | CORE_MINI_AXI_TB_CC_LIBRARY_COMMON_DEPS = [ | 
|  | ":elf", | 
|  | ":sim_libs", | 
|  | ":util", | 
|  | "//tests/systemc:Xbar", | 
|  | "//tests/systemc:instruction_trace", | 
|  | "@accellera_systemc//:systemc", | 
|  | "@com_google_absl//absl/log", | 
|  | "@com_google_absl//absl/log:check", | 
|  | "@com_google_absl//absl/log:initialize", | 
|  | "@com_google_absl//absl/status", | 
|  | "@libsystemctlm_soc", | 
|  | ] | 
|  | template_rule( | 
|  | cc_library, | 
|  | { | 
|  | "core_mini_axi_tb": { | 
|  | "srcs": [ | 
|  | "@kelvin_hw//hdl/chisel/src/kelvin:VCoreMiniAxi_parameters.h", | 
|  | ] + CORE_MINI_AXI_TB_CC_LIBRARY_COMMON_SRCS, | 
|  | "deps": [ | 
|  | "//hdl/chisel/src/kelvin:core_mini_axi_cc_library", | 
|  | ] + CORE_MINI_AXI_TB_CC_LIBRARY_COMMON_DEPS, | 
|  | "defines": [ | 
|  | "VERILATOR_MODEL=VCoreMiniAxi", | 
|  | ], | 
|  | }, | 
|  | "rvv_core_mini_axi_tb": { | 
|  | "srcs": [ | 
|  | "@kelvin_hw//hdl/chisel/src/kelvin:VRvvCoreMiniAxi_parameters.h", | 
|  | ] + CORE_MINI_AXI_TB_CC_LIBRARY_COMMON_SRCS, | 
|  | "deps": [ | 
|  | "//hdl/chisel/src/kelvin:rvv_core_mini_axi_cc_library", | 
|  | ] + CORE_MINI_AXI_TB_CC_LIBRARY_COMMON_DEPS, | 
|  | "defines": [ | 
|  | "VERILATOR_MODEL=VRvvCoreMiniAxi", | 
|  | ], | 
|  | }, | 
|  | "rvv_core_mini_verification_axi_tb": { | 
|  | "srcs": [ | 
|  | "@kelvin_hw//hdl/chisel/src/kelvin:VRvvCoreMiniVerificationAxi_parameters.h", | 
|  | ] + CORE_MINI_AXI_TB_CC_LIBRARY_COMMON_SRCS, | 
|  | "deps": [ | 
|  | "//hdl/chisel/src/kelvin:rvv_core_mini_verification_axi_cc_library", | 
|  | ] + CORE_MINI_AXI_TB_CC_LIBRARY_COMMON_DEPS, | 
|  | "defines": [ | 
|  | "VERILATOR_MODEL=VRvvCoreMiniVerificationAxi", | 
|  | ], | 
|  | }, | 
|  | }, | 
|  | hdrs = [ | 
|  | "kelvin/core_mini_axi_tb.h", | 
|  | ], | 
|  | ) | 
|  |  | 
|  | CORE_MINI_AXI_SIM_CC_BINARY_COMMON_DEPS = [ | 
|  | "@com_google_absl//absl/flags:flag", | 
|  | "@com_google_absl//absl/flags:parse", | 
|  | "@com_google_absl//absl/flags:usage", | 
|  | "@com_google_absl//absl/log", | 
|  | "@com_google_absl//absl/log:check", | 
|  | ] | 
|  | template_rule( | 
|  | cc_binary, | 
|  | { | 
|  | "core_mini_axi_sim": { | 
|  | "deps": [ | 
|  | ":core_mini_axi_tb", | 
|  | ] + CORE_MINI_AXI_SIM_CC_BINARY_COMMON_DEPS, | 
|  | }, | 
|  | "rvv_core_mini_axi_sim": { | 
|  | "deps": [ | 
|  | ":rvv_core_mini_axi_tb", | 
|  | ] + CORE_MINI_AXI_SIM_CC_BINARY_COMMON_DEPS, | 
|  | }, | 
|  | "rvv_core_mini_verification_axi_sim": { | 
|  | "deps": [ | 
|  | ":rvv_core_mini_verification_axi_tb", | 
|  | ] + CORE_MINI_AXI_SIM_CC_BINARY_COMMON_DEPS, | 
|  | }, | 
|  | }, | 
|  | srcs = [ | 
|  | "kelvin/core_mini_axi_sim.cc", | 
|  | ], | 
|  | ) | 
|  |  | 
|  | cc_test( | 
|  | name = "core_mini_axi_non_incr_tests", | 
|  | srcs = [ | 
|  | "kelvin/core_mini_axi_non_incr_tests.cc", | 
|  | ], | 
|  | deps = [ | 
|  | ":core_mini_axi_tb", | 
|  | ], | 
|  | ) | 
|  |  | 
|  | cc_binary( | 
|  | name = "core_scalar_sim", | 
|  | srcs = [ | 
|  | "kelvin/core_tb.cc", | 
|  | "@kelvin_hw//hdl/chisel/src/kelvin:VCoreScalar_parameters.h", | 
|  | ], | 
|  | defines = [ | 
|  | "VERILATOR_MODEL=VCoreScalar", | 
|  | ], | 
|  | deps = [ | 
|  | ":kelvin_if", | 
|  | ":sim_libs", | 
|  | ":util", | 
|  | "//hdl/chisel/src/kelvin:core_scalar_cc_library", | 
|  | "@com_google_absl//absl/flags:flag", | 
|  | "@com_google_absl//absl/flags:parse", | 
|  | "@com_google_absl//absl/flags:usage", | 
|  | ], | 
|  | ) | 
|  |  | 
|  | cc_binary( | 
|  | name = "core_mini_sim", | 
|  | srcs = [ | 
|  | "kelvin/core_tb.cc", | 
|  | "@kelvin_hw//hdl/chisel/src/kelvin:VCoreMini_parameters.h", | 
|  | ], | 
|  | defines = [ | 
|  | "VERILATOR_MODEL=VCoreMini", | 
|  | ], | 
|  | deps = [ | 
|  | ":kelvin_if", | 
|  | ":sim_libs", | 
|  | ":util", | 
|  | "//hdl/chisel/src/kelvin:core_mini_cc_library", | 
|  | "@com_google_absl//absl/flags:flag", | 
|  | "@com_google_absl//absl/flags:parse", | 
|  | "@com_google_absl//absl/flags:usage", | 
|  | ], | 
|  | ) | 
|  |  | 
|  | cc_binary( | 
|  | name = "kelvin_tb", | 
|  | srcs = [ | 
|  | "matcha/kelvin_if.h", | 
|  | "matcha/kelvin_tb.cc", | 
|  | "@kelvin_hw//hdl/chisel/src/matcha:VKelvin_parameters.h", | 
|  | ], | 
|  | defines = [ | 
|  | "VERILATOR_MODEL=VKelvin", | 
|  | ], | 
|  | deps = [ | 
|  | ":kelvin_if", | 
|  | ":sim_libs", | 
|  | "//hdl/chisel/src/matcha:kelvin_cc_library", | 
|  | "@com_google_absl//absl/flags:flag", | 
|  | "@com_google_absl//absl/flags:parse", | 
|  | "@com_google_absl//absl/flags:usage", | 
|  | ], | 
|  | ) | 
|  |  | 
|  | cc_binary( | 
|  | name = "kelvin_scalar_tb", | 
|  | srcs = [ | 
|  | "matcha/kelvin_if.h", | 
|  | "matcha/kelvin_tb.cc", | 
|  | "@kelvin_hw//hdl/chisel/src/matcha:VKelvinScalar_parameters.h", | 
|  | ], | 
|  | defines = [ | 
|  | "VERILATOR_MODEL=VKelvinScalar", | 
|  | ], | 
|  | deps = [ | 
|  | ":kelvin_if", | 
|  | ":sim_libs", | 
|  | "//hdl/chisel/src/matcha:kelvin_scalar_cc_library", | 
|  | "@com_google_absl//absl/flags:flag", | 
|  | "@com_google_absl//absl/flags:parse", | 
|  | "@com_google_absl//absl/flags:usage", | 
|  | ], | 
|  | ) | 
|  |  | 
|  | cc_binary( | 
|  | name = "kelvin_mini_tb", | 
|  | srcs = [ | 
|  | "matcha/kelvin_if.h", | 
|  | "matcha/kelvin_tb.cc", | 
|  | "@kelvin_hw//hdl/chisel/src/matcha:VKelvinMini_parameters.h", | 
|  | ], | 
|  | defines = [ | 
|  | "VERILATOR_MODEL=VKelvinMini", | 
|  | ], | 
|  | deps = [ | 
|  | "kelvin_if", | 
|  | ":sim_libs", | 
|  | "//hdl/chisel/src/matcha:kelvin_mini_cc_library", | 
|  | "@com_google_absl//absl/flags:flag", | 
|  | "@com_google_absl//absl/flags:parse", | 
|  | "@com_google_absl//absl/flags:usage", | 
|  | ], | 
|  | ) | 
|  |  | 
|  | cc_binary( | 
|  | name = "chai_sim", | 
|  | srcs = [ | 
|  | "chai/chai_if.h", | 
|  | "chai/chai_tb.cc", | 
|  | ], | 
|  | deps = [ | 
|  | ":kelvin_if", | 
|  | ":sim_libs", | 
|  | "//hdl/chisel/src/chai:chai_cc_library", | 
|  | "@com_google_absl//absl/flags:flag", | 
|  | "@com_google_absl//absl/flags:parse", | 
|  | "@com_google_absl//absl/flags:usage", | 
|  | "@com_google_absl//absl/log", | 
|  | "@com_google_absl//absl/log:check", | 
|  | ], | 
|  | ) | 
|  |  | 
|  | cc_test( | 
|  | name = "dbus2axi_tb", | 
|  | srcs = [ | 
|  | "kelvin/dbus2axi_tb.cc", | 
|  | ], | 
|  | deps = [ | 
|  | ":sim_libs", | 
|  | "//hdl/chisel/src/kelvin:dbus2axi_cc_library", | 
|  | ], | 
|  | ) | 
|  |  | 
|  | cc_test( | 
|  | name = "l1dcache_tb", | 
|  | size = "large", | 
|  | srcs = [ | 
|  | "kelvin/l1dcache_tb.cc", | 
|  | ], | 
|  | deps = [ | 
|  | ":kelvin_if", | 
|  | ":sim_libs", | 
|  | "//hdl/chisel/src/kelvin:l1dcache_cc_library", | 
|  | ], | 
|  | ) | 
|  |  | 
|  | cc_test( | 
|  | name = "l1dcachebank_tb", | 
|  | size = "large", | 
|  | srcs = [ | 
|  | "kelvin/l1dcache_tb.cc", | 
|  | ], | 
|  | defines = [ | 
|  | "L1DCACHEBANK", | 
|  | ], | 
|  | deps = [ | 
|  | ":kelvin_if", | 
|  | ":sim_libs", | 
|  | "//hdl/chisel/src/kelvin:l1dcachebank_cc_library", | 
|  | ], | 
|  | ) | 
|  |  | 
|  | cc_test( | 
|  | name = "l1icache_tb", | 
|  | srcs = [ | 
|  | "kelvin/l1icache_tb.cc", | 
|  | ], | 
|  | deps = [ | 
|  | ":kelvin_if", | 
|  | ":sim_libs", | 
|  | "//hdl/chisel/src/kelvin:l1icache_cc_library", | 
|  | ], | 
|  | ) | 
|  |  | 
|  | cc_library( | 
|  | name = "valu", | 
|  | hdrs = [ | 
|  | "kelvin/alu_ref.h", | 
|  | "kelvin/valu.h", | 
|  | ], | 
|  | deps = [ | 
|  | ":vencodeop", | 
|  | ], | 
|  | ) | 
|  |  | 
|  | cc_test( | 
|  | name = "valu_tb", | 
|  | size = "large", | 
|  | srcs = [ | 
|  | "kelvin/valu_tb.cc", | 
|  | "@kelvin_hw//hdl/chisel/src/kelvin:VCore_parameters.h", | 
|  | ], | 
|  | deps = [ | 
|  | ":kelvin_if", | 
|  | ":sim_libs", | 
|  | ":util", | 
|  | ":valu", | 
|  | "//hdl/chisel/src/kelvin:valu_cc_library", | 
|  | ], | 
|  | ) | 
|  |  | 
|  | cc_test( | 
|  | name = "valuint_tb", | 
|  | size = "large", | 
|  | srcs = [ | 
|  | "kelvin/valuint_tb.cc", | 
|  | ], | 
|  | deps = [ | 
|  | ":kelvin_if", | 
|  | ":sim_libs", | 
|  | ":valu", | 
|  | "//hdl/chisel/src/kelvin:valuint_cc_library", | 
|  | ], | 
|  | ) | 
|  |  | 
|  | cc_library( | 
|  | name = "vdecode", | 
|  | hdrs = [ | 
|  | "kelvin/vdecode.h", | 
|  | ], | 
|  | deps = [ | 
|  | ":vdecodeop", | 
|  | ":vencodeop", | 
|  | ], | 
|  | ) | 
|  |  | 
|  | cc_library( | 
|  | name = "vdecodeop", | 
|  | hdrs = [ | 
|  | "kelvin/vdecodeop.h", | 
|  | ], | 
|  | ) | 
|  |  | 
|  | cc_library( | 
|  | name = "vencodeop", | 
|  | hdrs = [ | 
|  | "kelvin/vencodeop.h", | 
|  | ], | 
|  | ) | 
|  |  | 
|  | cc_test( | 
|  | name = "vcmdq_tb", | 
|  | srcs = [ | 
|  | "kelvin/vcmdq_tb.cc", | 
|  | "@kelvin_hw//hdl/chisel/src/kelvin:VCore_parameters.h", | 
|  | ], | 
|  | deps = [ | 
|  | ":kelvin_if", | 
|  | ":sim_libs", | 
|  | ":util", | 
|  | ":vencodeop", | 
|  | "//hdl/chisel/src/kelvin:vcmdq_cc_library", | 
|  | ], | 
|  | ) | 
|  |  | 
|  | cc_test( | 
|  | name = "vconvalu_tb", | 
|  | srcs = [ | 
|  | "kelvin/vconvalu_tb.cc", | 
|  | ], | 
|  | deps = [ | 
|  | ":kelvin_if", | 
|  | ":sim_libs", | 
|  | "//hdl/chisel/src/kelvin:vconvalu_cc_library", | 
|  | ], | 
|  | ) | 
|  |  | 
|  | cc_test( | 
|  | name = "vconvctrl_tb", | 
|  | srcs = [ | 
|  | "kelvin/vconvctrl_tb.cc", | 
|  | "@kelvin_hw//hdl/chisel/src/kelvin:VCore_parameters.h", | 
|  | ], | 
|  | deps = [ | 
|  | ":kelvin_if", | 
|  | ":sim_libs", | 
|  | ":util", | 
|  | ":vencodeop", | 
|  | "//hdl/chisel/src/kelvin:vconvctrl_cc_library", | 
|  | ], | 
|  | ) | 
|  |  | 
|  | cc_test( | 
|  | name = "vdecodeinstruction_tb", | 
|  | srcs = [ | 
|  | "kelvin/vdecodeinstruction_tb.cc", | 
|  | ], | 
|  | deps = [ | 
|  | ":kelvin_if", | 
|  | ":sim_libs", | 
|  | ":vdecode", | 
|  | "//hdl/chisel/src/kelvin:vdecodeinstruction_cc_library", | 
|  | ], | 
|  | ) | 
|  |  | 
|  | cc_test( | 
|  | name = "vdecode_tb", | 
|  | srcs = [ | 
|  | "kelvin/vdecode_tb.cc", | 
|  | "@kelvin_hw//hdl/chisel/src/kelvin:VCore_parameters.h", | 
|  | ], | 
|  | deps = [ | 
|  | ":kelvin_if", | 
|  | ":sim_libs", | 
|  | ":util", | 
|  | ":vdecode", | 
|  | "//hdl/chisel/src/kelvin:vdecode_cc_library", | 
|  | ], | 
|  | ) | 
|  |  | 
|  | cc_test( | 
|  | name = "vldst_tb", | 
|  | srcs = [ | 
|  | "kelvin/vldst_tb.cc", | 
|  | "@kelvin_hw//hdl/chisel/src/kelvin:VCore_parameters.h", | 
|  | ], | 
|  | deps = [ | 
|  | ":kelvin_if", | 
|  | ":sim_libs", | 
|  | ":util", | 
|  | ":vencodeop", | 
|  | "//hdl/chisel/src/kelvin:vldst_cc_library", | 
|  | ], | 
|  | ) | 
|  |  | 
|  | cc_test( | 
|  | name = "vregfilesegment_tb", | 
|  | srcs = [ | 
|  | "kelvin/vregfilesegment_tb.cc", | 
|  | ], | 
|  | deps = [ | 
|  | ":kelvin_if", | 
|  | ":sim_libs", | 
|  | "//hdl/chisel/src/kelvin:vregfilesegment_cc_library", | 
|  | ], | 
|  | ) | 
|  |  | 
|  | cc_test( | 
|  | name = "vregfile_tb", | 
|  | srcs = [ | 
|  | "kelvin/vregfile_tb.cc", | 
|  | ], | 
|  | deps = [ | 
|  | ":kelvin_if", | 
|  | ":sim_libs", | 
|  | "//hdl/chisel/src/kelvin:vregfile_cc_library", | 
|  | ], | 
|  | ) |