我正在使用
riscv64-unknown-elf-objcopy -O verilog
来转换 RISCV elf 文件。我可以看到有一个相关选项--verilog-data-width
影响输出。
例如,使用
--verilog-data-width 1
(这也是默认值),输出看起来像这样...
@00040000
97 02 00 00 93 82 02 11 73 90 52 30 81 40 81 41
01 42 81 42 01 43 81 43 01 44 81 44 01 45 81 45
...
使用
--verilog-data-width 4
输出看起来像这样......
@00010000
00000297 11028293 30529073 41814081
42814201 43814301 44814401 45814501
...
显然它已将数据分组为 4 字节块。
问题1:如何检测字节序?
riscv64-unknown-elf-objcopy
是否从 elf 文件头或类似文件中知道目标的字节顺序?
问题2:为什么地址/偏移量(即
@00010000
等)会改变。明明是被4除了,但是为什么呢?地址就是地址,无论是写入字节还是字(4 字节),还是这是 verilog 内存文件格式的一些怪癖?
谢谢。
在没有更好的答案的情况下,我将尝试在这里回答我自己的问题 - 希望有人会发现它有用。不过,如果有人有更权威的答案,请继续。
答案1: 正如所怀疑的,默认情况下,字节顺序是从输入 elf 文件中获取的(它在 elf 标头中定义)。如果未定义字节序,或者您希望它与输入文件不同,那么我认为较新的版本有一个选项
--verilog-data-endianness
来设置它。不幸的是,我访问的版本不支持此功能,因此我无法发表评论。无论如何,由于输出文件是纯文本,数据采用十六进制格式,因此通过一些文本处理来更改字节顺序很容易。
答案2: 这有点猜测,但我认为这就是 mem 文件的解释方式。我认为地址只是字节地址,但如果你将其视为偏移量,那就更有意义了。例如,如果宽度为 1(即字节),则“地址”是字节偏移量;如果宽度是 4(即 32 位字),那么“地址”就是字偏移量 - 在这种情况下是字节偏移量 / 4。至少,我就是这样合理化这种行为的。