问题标签 [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.

0 投票
1 回答
405 浏览

emulation - risc-v c 模拟器是如何工作的?

我正在运行基于 x86 的 Linux 虚拟机。我正在使用 RISC-V 编译器和仿真器进行交叉编译(目标:RISC-V)。我想知道 RISC-V 模拟器(C 文件)如何在没有真正 RISC-V cpu 的情况下模拟 RISC-V 指令。

0 投票
1 回答
124 浏览

python - RISC-V Toolchain Makefile 的分隔符和代码错误问题。我怎样才能做到正确?

我在尝试创建 Makefile 时遇到问题。我只想一个一个地创建 .elf 文件,然后是转储文件,最后是 bin 文件,然后使用 python 脚本将其转换为 .hex 文件。我的目标是仅使用 make 命令实际创建 .elf 和 .hex 文件。

尽管如此,因为我对 Makefiles 非常陌生,所以在执行 make 命令后出现错误:

先感谢您!

0 投票
1 回答
267 浏览

riscv - RISC-V:12 位立即数逻辑运算是否对整个寄存器进行操作?

我正在尝试为 RISC-V CPU 编写一个模拟器,但找不到我的问题的明确答案。

假设我想使用

rs1 包含 0xFFFFFFFF,立即值为 0xFFF。

ANDI 是否对完整寄存器进行操作,并仅用零填充立即数的剩余 20 位,因此 rd 中的结果将为 0x000000FFF?

还是忽略高 20 位,rd 中的结果仍然是 0xFFFFFFFF?

XORI 和 ORI 命令的问题相同。

0 投票
2 回答
877 浏览

riscv - RISCV32 与 RISCV64

Riscv32 和 Riscv64 有什么区别?我一直在研究 ISA 文档,但在任何地方都找不到清楚地提到它,所以现在很困惑。

不幸的是,我无法从谷歌找到任何关于此的文档。任何指针?

0 投票
1 回答
542 浏览

virtual-memory - 禁用虚拟内存时如何在 RISC-V 32 位系统中访问 34 位物理地址空间?

在 RISC-V 32 位 ISA 中,物理地址空间为 34 位,而虚拟地址空间为 32 位。当在超级用户模式下启用虚拟内存时,通过访问页表来转换 32 位虚拟地址,从而产生 34 位物理地址。然而,当虚拟内存被禁用时,32 位地址仍然必须转换为 34 位物理地址。在第 4.1.12 节的 RISC-V 特权 ISA 规范中,它指出:

当MODE=Bare时,supervisor虚拟地址等于supervisor物理地址

所以,我的问题是:这是否意味着只有低 4GB(底部 32 位)内存才能在禁用虚拟内存的主管模式下访问?如果是这样,那么当虚拟内存被禁用时,应该如何在超级用户模式下访问剩余的 16 GB(34 位)物理内存?

SV32 虚拟和物理寻址

0 投票
2 回答
1664 浏览

assembly - 处理中断和使用 WFI risc-v cpu 指令的预期/正确方法是什么?

我对裸机编程非常陌生,以前从未接触过中断,但我一直在学习 RISC-V FE310-G002 SOC 驱动的开发板。

我一直在阅读有关 RISC-V WFI(等待中断)指令和手册的信息,听起来您不能依靠它来真正使内核休眠。相反,它只是建议系统可以暂停执行,并且应该将指令视为更像 NOP。但是,这对我来说似乎毫无用处。考虑以下 ASM 程序片段:

由于不能依赖 WFI,因此必须这样做。但是,在来自中断处理程序的 MRET 之后,您仍然会被困在循环中。因此,您必须以全局变量为条件,该变量的值在中断处理程序中更新。这似乎非常混乱。

此外,如果您的实现确实遵守 WFI 指令并且在 WFI 指令执行之前触发了中断,则整个内核将停止,直到触发其他中断,因为它将在 WFI 指令之前返回。

当没有工作要做时,该指令的唯一正确用法似乎是在内核调度程序中。但即便如此,我认为您永远不会希望从中断处理程序返回到此类代码,而是从头开始重新启动调度程序算法。但这也是一个问题,因为您将不得不以某种方式回滚堆栈等......

我一直在脑子里转来转去,似乎无法找到安全的使用方法。也许,如果您以原子方式使用 CSRRS 启用中断,然后立即像这样调用 WFI:

然后确保在从中断处理程序调用 MRET 之前将 mepc 寄存器增加 8 个字节。在返回之前,还必须在中断处理程序内部的 mie 寄存器中再次禁用中断。这种解决方案只有在 WFI、J 和 NOP 都被编码为 4 字节指令时才是安全的,无论是否使用压缩指令。它还取决于程序计数器在被 CSRRSI 指令启用后,在可能触发中断之前到达 WFI 指令。然后,这将允许在代码中的安全位置触发中断,并以中断等待它的循环的方式返回。

我想我只是想了解我可以从硬件中得到什么行为,因此,如何正确调用中断并从中断返回并使用 WFI 指令?

0 投票
0 回答
275 浏览

virtualization - 在 QEMU 上扩展 risc-v 指令

我想扩展 QEMU TCG(微型代码生成器)以在我的 x86 机器上接受 risc-v 来宾的新指令。但是,我对 TCG 的工作原理没有经验,所以我想知道是否有人可以给我一些有用的指示,从哪里开始了解 TCG 在 QEMU 源代码中的工作原理?我知道有前端和后端,但我真的不明白翻译实际发生在哪里,以及指令是如何翻译的。

我还在为各种运算符(如 )定义操作码时看到了该insn32.decode文件,但我不确定该文件是如何使用的,以及它是用于 TCG 目标(即 risc-v 主机)还是 QEMU 来宾。target/riscvlui

我正在寻找类似 QEMU - 代码流 [指令缓存和 TCG] 但与当前 QEMU 版本保持同步的内容。

任何帮助表示赞赏。

0 投票
1 回答
53 浏览

assembly - 在自定义机器上运行 GCC 编译代码。在程序集中找不到 sp 初始化

我在尝试在我的自定义 rv32I 机器上运行 gcc 编译代码时正在经历 .lst。我找不到 sp 的初始值

0 投票
1 回答
3266 浏览

assembly - 使用 RISC-V (RV32I) 编译器计算第 n 个斐波那契数,无需递归

我用RISC-V汇编语言编写了一个计算第n个斐波那契数的代码。它有两个部分 -fib.sruntest.s,分别加载ninto的值a0和调用fib,计算第 n 个斐波那契数(没有递归),将结果加载到a0自身并返回。这是我的代码:

这是我的测试台(runtest.s):

每次我运行这段代码时,我只得到一个返回值 1。有人能指出其中的错误吗?另外,如果有更好的方法来实现相同的逻辑,也请告诉我。

0 投票
1 回答
2323 浏览

memory - 为什么 RISC V 中的程序计数器应该加 4 而不是加 0 或 2

为什么 RISC V 架构中的 PC 连接的是 PC+4 而不是 PC+2 或 PC+1。我认为这取决于指令存储器(IMEM)的存储单元的宽度。如果宽度是 16 位,那么我们需要加载两个相邻的地址来填充 32 位指令,或者如果宽度是 32 位,我们只需要加载一个地址来获取完整的指令。