Симуляция ракетного чипа показывает неожиданное количество команд

Следующие два фрагмента кода отличаются только значением, загруженным в регистр 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 и далее), вводимых в разные точки во время выполнения.

Другие вопросы по тегам