Отличный вопрос: есть несколько способов приблизиться к этому.
Обычный подход - взять сгенерированный Verilog от Chisel и написать собственный тестовый комплект для создания своего дизайна.Этот тестовый комплект может быть написан на C ++, Verilog, SystemVerilog или другом вашем любимом языке тестового набора / склеивания.
Этот подход используется Sodor (https://github.com/ucb-bar/riscv-sodor) и Rocket-Chip (https://github.com/freechipsproject/rocket-chip), с внешним кодом тестового набора, написанным на C ++, но способным взаимодействовать с симуляторами Verilog, такими как Verilator и VCS. Тестовая логика C ++ позволяет пользователю передавать тестовый двоичный файл через командную строку и затем загружатьдвоичное - через какую-то «магию» - в тестовую память. Это может быть внешний интерфейс отладки, последовательный интерфейс Tether или предоставленная модель внешнего ОЗУ, которая может быть загружена тестовым жгутом (или что-то простое, что вы пишете сами, или что-то более сложное, например, dramsim2).
Этот материал довольно сложный, поэтому я рекомендую начать с простого: один из вариантов - создать в Chisel память черного ящика, которая будет поддерживаться простой памятью, котораяиспользует readmemh для инициализации себя. Хорошая особенность в том, что вам не нужно перекомпилировать кодчтобы запустить новые двоичные файлы, вы просто поменяете файл, который хотите загрузить, в память тестов.
Chisel также предоставляет свои собственные автономные тестеры, так что, возможно, вы можете выполнить тестовый набор целиком в Scala, ноЯ не видел, чтобы это было сделано для чего-то столь же сложного, как ядро, которое очень зависит от внешних раздражителей и потребности общаться с внешним миром.