Симуляция ракетного чипа показывает неожиданное количество команд
Следующие два фрагмента кода отличаются только значением, загруженным в регистр x23, но minstret
количество команд (сообщаемое с помощью моделирования Verilator чипа Rocket) существенно отличается. Это ошибка или я что-то не так делаю?
read_csr()
функция взята из библиотеки сервера внешнего интерфейса RISC-V ( https://github.com/riscv/riscv-fesvr/blob/master/fesvr/encoding.h) и остальной части кода [syscalls.c, crt.S, test.ld] аналогичен тестам RISC-V ( https://github.com/riscv/riscv-tests/tree/master/benchmarks/common).
Я проверил, что скомпилированные двоичные файлы содержат точно такие же инструкции, за исключением различия в операндах.
Разделив 0x0fffffff на 0xff, повторив 1024 раза: 3260 инструкций.
size_t instrs = 0 - read_csr(minstret);
asm volatile (
"mv x20, zero;"
"li x21, 1024;"
"li x22, 0xfffffff;"
"li x23, 0xff;"
"loop:"
"div x24, x22, x23;"
"addi x20, x20, 1;"
"bleu x20, x21, loop;"
::: "x20", "x21", "x22", "x23", "x24", "cc"
);
instrs += read_csr(minstret);
Разделив 0x0fffffff на 0xffff, повторив 1024 раза: 3083 инструкции.
size_t instrs = 0 - read_csr(minstret);
asm volatile (
"mv x20, zero;"
"li x21, 1024;"
"li x22, 0xfffffff;"
"li x23, 0xffff;"
"loop:"
"div x24, x22, x23;"
"addi x20, x20, 1;"
"bleu x20, x21, loop;"
::: "x20", "x21", "x22", "x23", "x24", "cc"
);
instrs += read_csr(minstret);
Здесь 3083 инструкции кажутся правильными (1024 * 3 = 3072). поскольку minstret
считает удаленных инструкций, кажется странным, что в первом примере выполнено еще ~200 инструкций. Эти результаты всегда одинаковы, независимо от того, сколько раз я запускаю эти две программы.
1 ответ
Проблема была решена по адресу https://github.com/freechipsproject/rocket-chip/issues/1495.
Обслуживание прерывания отладки, которое, по-видимому, используется симуляцией для определения того, закончил ли тест, вызвало различия в количестве команд. Подробный журнал, созданный Verilator, показывает диапазон адресов отладки (0x800 и далее), вводимых в разные точки во время выполнения.