如何在RISC V中生成hex文件?

时间:2017-03-31 21:00:14

标签: instructions instruction-set hexdump riscv risc

我正在尝试使用https://github.com/ucb-bar/vscale提供的32位整数设置指令来验证RISC-V DUT 他们将输入存储在内存中作为hex文件@ vscale / src / test / inputs /(来自上面的链接)。 我想验证我的指令集,我需要它们以十六进制格式。 例如我的指令集(简要提到) 加 SW LW SUB

我想以十六进制格式转换这些指令集,以便我可以验证其功能。任何人都可以帮我解决如何...将会非常有帮助。

1 个答案:

答案 0 :(得分:0)

vscale / src / test / inputs有几个类似格式的十六进制输入:每行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
...

此类文件由verilog中的testbench模块加载$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

http://verilog.renerta.com/mobile/source/vrg00016.htm http://fullchipdesign.com/readmemh.htm

中记录了$readmemh
  

.. $readmemh读取十六进制数据。数据必须存在于文本文件中。允许使用空格来提高可读性,以及单行和块中的注释。数字必须存储为...十六进制值。内存文件的基本形式包含由新行字符分隔的数字,这些数字将被加载到内存中。

测试输入用于初始化嵌入式内存DUT.hasti_mem.mem

要使用此类文件,您应该知道此测试平台中使用的内存映射。存储器的某些部分可能不是指令,而是数据和一些初始化矢量。如果要反汇编某些文件,请将十六进制转换为二进制(有perl的解析器,或者您可以用其他语言编写转换器或使用verilog的$writememb进行转换)。然后添加您的riscv反汇编程序支持的任何二进制格式的标头,例如elf for riscv objdump,或者没有任何带有riscv支持的radare2(https://github.com/radare/radare2)标头。