Как сгенерировать шестнадцатеричные файлы в RISC V?

Я пытаюсь проверить RISC-V DUT с помощью инструкции 32-битного набора целых чисел, которая доступна по адресу https://github.com/ucb-bar/vscale Входные данные хранятся в памяти в виде шестнадцатеричного файла @ vscale / src / test /. входы / (по вышеуказанной ссылке). Я хотел бы проверить мой набор инструкций, для которых мне нужно, чтобы они были в шестнадцатеричном формате. Например, мой набор инструкций (только кратко) ADD SW LW SUB

Я хотел бы преобразовать этот набор инструкций в шестнадцатеричный формат, чтобы я мог проверить его функциональность. Может ли кто-нибудь помочь мне в том, что делать... было бы очень полезно.

2 ответа

vscale/src/test/input имеет несколько шестнадцатеричных входов с одинаковым форматом: 32 шестнадцатеричных символа в строке (16 байтов, 4 из 4-байтовых слов) и 8192 строки. Например: https://github.com/ucb-bar/vscale/blob/master/src/test/inputs/rv32ui-p-add.hex

000000000000000000010101464c457f
00000034000001000000000100f30002
00280001002000340001000000000d04
00000000000000000000000100020005
00000005000007500000075000000000
...

Такие файлы загружаются модулем testbench в Verilog с $readmemh функция: https://github.com/ucb-bar/vscale/blob/master/src/test/verilog/vscale_hex_tb.v

module vscale_hex_tb();

   localparam hexfile_words = 8192;
...
   initial begin
      $value$plusargs("max-cycles=%d", max_cycles);
      $value$plusargs("loadmem=%s", loadmem);
      $value$plusargs("vpdfile=%s", vpdfile);
      if (loadmem) begin
         $readmemh(loadmem, hexfile);
         for (i = 0; i < hexfile_words; i = i + 1) begin
            for (j = 0; j < 4; j = j + 1) begin
               DUT.hasti_mem.mem[4*i+j] = hexfile[i][32*j+:32];
            end
         end
      end
      $vcdplusfile(vpdfile);
      $vcdpluson();
      // $vcdplusmemon();
      #100 reset = 0;
   end // initial begin

$readmemh задокументировано в http://verilog.renerta.com/mobile/source/vrg00016.htm http://fullchipdesign.com/readmemh.htm

.. $readmemh читает шестнадцатеричные данные. Данные должны существовать в текстовом файле. Пробел позволяет улучшить читаемость, а также комментарии как в одной строке, так и в блоке. Числа должны быть сохранены как... шестнадцатеричные значения. Основная форма файла памяти содержит числа, разделенные символами новой строки, которые будут загружены в память.

Тестовые входы используются для инициализации встроенной памяти DUT.hasti_mem.mem,

Для работы с такими файлами вы должны знать карту памяти, используемую в этом тестовом стенде. Некоторые части памяти могут быть не инструкциями, а данными и некоторыми векторами инициализации. Если вы хотите разобрать некоторые из файлов, конвертируйте hex в двоичный файл (есть парсеры для perl или вы можете написать конвертер на другом языке или использовать verilog's $writememb преобразовать). Затем добавьте заголовок любого двоичного формата, поддерживаемого вашим дизассемблером riscv, например elf для riscv objdump, или никакого заголовка для radare2 ( https://github.com/radare/radare2) с поддержкой riscv.

Мне нужна та же работа и найти путь. Я делюсь тем, что, возможно, другие могут получить пользу. Во-первых, у вас должна быть riscv-gnu-toolchain для выполнения процесса компиляции и декомпиляции. Он может быть найден здесь . Инструкция, которую вы упомянули, это сборка. Итак, вы можете скомпилироватьriscv64-unknown-elf-asи разобрать поriscv64-unknown-elf-objdump. Инструкции по получению шестнадцатеричного значения приведены ниже.

      omerguzel@omerguzel-HP:~/temp$ ls
code
omerguzel@omerguzel-HP:~/temp$ cat code
addi x1,x2,123
nop
xor x3,x2,x1
omerguzel@omerguzel-HP:~/temp$ /opt/riscv/bin/riscv64-unknown-elf-as code
omerguzel@omerguzel-HP:~/temp$ /opt/riscv/bin/riscv64-unknown-elf-objdump -D --section .text a.out 

a.out:     file format elf64-littleriscv


Disassembly of section .text:

0000000000000000 <.text>:
   0:   07b10093            add ra,sp,123
   4:   00000013            nop
   8:   001141b3            xor gp,sp,ra
omerguzel@omerguzel-HP:~/temp$ 

вы можете извлечь шестнадцатеричную часть самостоятельно, используя скрипты. **

Второй метод:

** Другой способ реализуется с использованием других инструментов компилятора. Команды ниже.

      omerguzel@omerguzel-HP:~/temp$ ls
code
omerguzel@omerguzel-HP:~/temp$ cat code
addi x1,x2,123
nop
xor x3,x2,x1
nop
omerguzel@omerguzel-HP:~/temp$ /opt/riscv/bin/riscv64-unknown-elf-as code
omerguzel@omerguzel-HP:~/temp$ /opt/riscv/bin/riscv64-unknown-elf-objcopy -O binary a.out a.bin --strip-debug
omerguzel@omerguzel-HP:~/temp$ od -t x4 -An -w4 -v a.bin 
 07b10093
 00000013
 001141b3
 00000013
omerguzel@omerguzel-HP:~/temp$
Другие вопросы по тегам