我正在尝试使用https://github.com/ucb-bar/vscale提供的32位整数设置指令来验证RISC-V DUT 他们将输入存储在内存中作为hex文件@ vscale / src / test / inputs /(来自上面的链接)。 我想验证我的指令集,我需要它们以十六进制格式。 例如我的指令集(简要提到) 加 SW LW SUB
我想以十六进制格式转换这些指令集,以便我可以验证其功能。任何人都可以帮我解决如何...将会非常有帮助。
答案 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)标头。