问题标签 [riscv32]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
assembly - 可以告诉我在程序集(riscv32)中做错了什么,它错误地打印了警告。我正在使用 rars 模拟器
我的代码有问题,它只是打印“方向无效”,并且矩阵信息是正确的,我的输入是这个 .word 3 1 1 1 0 5 2 2 0 1 6 4。
以下是该程序应如何工作的说明。
敌舰被放置在一个名为“ships”的字符串中,该字符串存在于区域数据 (.data) 中,必须在游戏开始时由 insert_ships 函数读取。弦船具有以下模式。在插入的第一行中告知船舶的数量。以下每一行都有一艘船。指定船只的行有 4 个值,用空格分隔,如下所示:第一个值是船的布局,0 表示水平船,1 表示垂直船;第二个值是船的长度;第三个值是船舶的起跑线;第四个值是船的起始列。观察示例: 3 1 5 1 1 0 5 2 2 0 1 6 4
船舶的定位高于结果如下定位:
插入船只的功能必须验证船只定位的有效性,在以下情况下会生成错误消息:
- 船只的位置无效。示例:0 3 11 7
- 船舶根据矩阵的维度进行外推。示例:0 4 2 7
- 重叠发生在船上。示例 0 4 2 2 和 1 3 0 3
现在是完整的代码,它有什么问题?
floating-point - RISCV-Boom中浮点寄存器中的值是什么格式的?
我正在研究 Boomv3 中浮点指令的执行过程。我从一个简单的fadd.s
指令开始。我添加了代码来输出 Boom/src/main/scala/exu/execution-units/functional-unit.scala 中 FPUUnit 类中寄存器的值。但输出结果并不完全符合浮点数的IEEE754。
我添加的代码是:
看下面两条指令,指令005470d3中f5的值为0,f8的值为1.5。
Boom 的输出是:
为什么 rs1 和 rs2 中的值不完全对应 0 和 1.5?
谢谢!
debugging - 如何调试我在 RISC-V 程序集中编写的阶乘函数?
我正在尝试学习 RISC-V 并编写了一个阶乘函数,但它遇到了模拟器错误,暗示可能存在无限循环。我现在不确定如何调试我的代码,并且想知道人们是否可以提示我可能做错了什么。
谢谢!
gcc - 具有矢量支持的 RISC-V 工具链
我正在寻找支持官方规范定义的 RISC-V 矢量扩展 v1.0 的 C/C++ 工具链。
Spike似乎支持矢量 rvv1.0,但我很难找到一个工具链来使用它。
GCC (我只看到rvv0.9的一个分支)和 LLVM(我使用的是 LLVM/clang 13.0.0,它只升级到 rvv0.10)似乎都不支持最新的规范。
有人可以向我指出一个有效的工具链,还是我只需要再等一些工具才能赶上?
assembly - 为什么 riscv32 中的 mulh 指令给出 0?
mulh
指令应根据 RISC-Vs pec 给出结果的高 XLEN 位。但是当我mulh t0, a0, a1;
使用 multiplier ina0
和 multiplicand in运行时a1
,结果t0
为 0。有人可以解释为什么吗?我在 RV32IMAC(FE310 内核)中运行它。
汇编和 C 代码如下:
assembly - 裸机 RISC-V CPU - 处理器如何知道从哪个地址开始获取指令?
我正在设计自己的 RISC-V CPU,并且已经能够实现一些指令代码。
我已经安装了 GCC 编译器的 RV32I 版本,所以我现在可以使用汇编器了riscv32-unknown-elf-as
。
我试图用一条指令组装一个程序:
我用汇编器编译它,然后用这个命令运行 objdump:
这将打印出以下内容:
我的问题是:
- 这里发生了什么?我以为我会有一个简单的单行十六进制,但还有很多事情要做。
- 如何指示我的处理器开始读取某个内存地址的指令?看起来 objdump 也不知道指令将从哪里开始。
需要明确的是,此时我将处理器视为裸机。我想象我将在处理器中硬编码指令从内存地址 X 开始,数据在内存地址 Y 可用,堆栈在内存地址 Z 可用。这是正确的吗?或者这是错误的方法?
riscv - GCC 上的 RISC-V 程序集 - 为什么会生成冗余 mv 命令?
我有以下几行
L2 的地址在哪里0x2018
。
当我生成 ELF 文件并使用 检查它时objdump
,这就是我所看到的(仅相关部分):
1018 处的行,即mv a4 a4
转换addi a4, a4, 0
为多余的行。为什么会产生这个?如果没有这条线,它是否仍然有效?
gcc 是否需要始终为指令生成 2la
条指令?
assembly - 如何在 RISC-V 中获取数组中的下一个元素?
不是每次增加 4 个字节,我需要增加 8 个字节吗?例如,addi x9, x9, 8
而不是addi x9, x9, 4
? 或者我们是否需要考虑每个单词本身的大小?
gcc - 使用“riscv32/64-unknown-elf-gcc”时,如何将 main() 或 _start() 函数的指令代码放在指令内存中?
我设计了 RISCV32IM 处理器,并使用“riscv32/64-unknown-elf-gcc”生成测试代码。
我在没有操作系统的系统上进行测试,当我使用下面的编译选项(-O0)时,我很不情愿,因为有很多不必要的代码生成。
使用编译选项(-O1 或 -O2)时,只生成必要的代码,但根据 C 代码,main() 或 _start() 函数的指令代码位置可能不是指令记忆。
由于系统的性质,main() 或_start() 的代码位置必须位于指令内存的开头。
解决上述问题的编译器选项有哪些?