Как сгенерировать шестнадцатеричные файлы в 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$