问题标签 [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 回答
225 浏览

embedded - RISC-V 链接描述文件中的访问权限

在编写基于 ARM 的微控制器时,我习惯于在链接脚本中看到这样的MEMORY{..}段:

访问权限很容易理解:

  • r: 读
  • w: 写
  • x: 执行

我正在基于 RISC-V 的微控制器领域迈出第一步。GigaDevice的GD32VF103CBT6微控制器在其链接脚本中有以下MEMORY{..}部分:

我应该如何解释这些访问权限?

0 投票
1 回答
111 浏览

riscv - 运行 Linux 的最低 CSR 要求

在 RISC-V 处理器上运行 Linux 所需的最低 CSR 是多少?
特权 ISA 规范似乎没有阐明这一点。

0 投票
1 回答
313 浏览

riscv32 - risc-v neg 指令是如何实现的?

neg伪指令是如何只用一个 sub 实现的?

我不明白,neg就这样R[rd] = -R[rs1]。但如果我有sub,那就是R[rs1] - something

0 投票
1 回答
448 浏览

elf - 使用“riscv32-unknown-elf-gcc”时如何设置指令和数据内存地址?

我设计了RISCV32IM处理器,我使用“riscv32-unknown-elf-gcc”生成代码进行测试。

但是,生成代码的 PC(指令存储器地址)值和数据存储器地址具有任意值。我使用了这个命令:

我能知道我是否可以设置我想要的指令和数据存储器地址吗?

谢谢。

谢谢你的答案。

我只设计了硬件,这是我第一次使用软件工具链。即使我的问题是初级的,请理解。

该图是“-v”选项的结果。 在此处输入图像描述

我无法修改脚本文件,因为我在 DOCKER 环境中使用 riscv 工具链。所以,我尝试复制脚本文件(elf32lriscv.x),修改它。我将其修改为 0x10000 ==> 0x00000。复制脚本的文件名为“test5.x”。

并执行如下。我究竟做错了什么?

在此处输入图像描述

0 投票
1 回答
295 浏览

assembly - 汇编什么是数据、.main 和 arr?

今天我学习了汇编语言和许多指令,如 J JAL BNE 等......但突然间我看到了以下内容:

有人可以举例说明这些数据、arr、n 和 .text 是什么吗?这些是汇编语言的一部分吗?为什么我们需要main?这不是 C 语言

0 投票
1 回答
178 浏览

elf - 使用“riscv32-unknown-elf-gcc”时,如何按字节单位存储或加载到内存中?

我想以 BYTE(8 位)或 HALF WORD(16 位)为单位操作内存加载或存储。

所以我制作了如下的C代码并使用“riscv32-unknown-elf-gcc”编译它。

我编译如下,函数的de-asm代码如下。

我想在上面的汇编代码中将“lw”和“sw”转换为“lb”和“sb”。

如果你知道,请回答。

0 投票
1 回答
109 浏览

c - SPI test case in C for Pulpissimo

I am trying to write C test code for SPI peripheral module for Pulpissimo.I have gone through the test case mentioned in pulp-rt examples.

[https://github.com/pulp-platform/pulp-rt-examples/tree/master/periph/spim][1]

But I understand that the above code need the support of an external board. I have no board available with me. Is there any way to write test case in C for SPI?

0 投票
1 回答
157 浏览

cpu-architecture - 在 16 位数据路径上移动 32 位数字

如何在 16 位数据路径上移动 32 位数字

这是一个计算机体系结构问题。


我的数据路径只有 16 位宽,这意味着我的 ALU 一次只能处理 16 位操作数。我的寄存器为 32 位宽,可在低 16 位和高 16 位部分寻址。

每次我读取寄存器的下半部分时,我还会额外读取一点,告诉我天气上半部分根本包含任何 1(参考 1)。


到目前为止,我实现了逻辑左移。( sll rd, rs1, rs2 )

  • 读取 rs1 寄存器的下半部分,并将其移位在下 rs2 寄存器中指定的量
  • 我从这 16 位中移出的位存储在 alu 内部的一个临时 16 位寄存器中
  • 移位后的值将被写回低 rd 寄存器并设置状态位(参见参考文献 1)

现在,如果没有数据写入更高的 rs1 寄存器(参见参考文献 1)并且 temp alu 寄存器中的位都是 0,那么我的移位操作就完成了。

否则上半部分需要第二个循环

  • 读取高位 rs1 寄存器并将其移位存储在低位 rs2 寄存器中的数量
  • 但现在用存储在 alu 临时寄存器中的值填充 rs1(不是第一个周期中的 0)
  • 移出 16 位空间的位将被丢弃
  • 结果写回较高的 rd 寄存器,并设置 rd 状态位(参见参考文献 1)

示例 1:假设 rs1 为 0x00001234,rs2 为 0x00000002(执行左移 2)

  • 首先,我读取了 rs1 和 rs2 的低 16 位,呈现 0x1234 和 0x0002。但是通过阅读我也得到了两个寄存器的状态位,在这种情况下,rs1 为 0,rs2 为 0,因为两个寄存器的高 16 位都是 0。使用给定的数据,我可以执行左移 2 . 导致0x48D0。由于没有 1 从 sll 中移出,我可以将结果存储在较低的 rd 中并将其状态位设置为 0。(这一切都在一个周期内完成)

示例 2:假设 rs1 为 0x0000D234,rs2 为 0x00000005(执行左移 5)

  • 首先我读取 rs1 和 rs2 的低 16 位,显示 0xD234 和 0x0005。但是通过阅读我也得到了两个寄存器的状态位,在这种情况下,rs1 为 0,rs2 为 0,因为两个寄存器的高 16 位都是 0。使用给定的数据,我可以执行左移 5 . 导致0x4680。但现在我将 11010 (0x1A) 移出 16 位空间。该值存储在 Alu 临时寄存器中,由于它包含 1,我必须执行另一个循环。
  • 在第二个循环中,我读取了上 rs1 和下 rs2,呈现 0x0000 和 0x0005。我再次左移 5,但现在 Alu 临时寄存器用于填充移位值。0x0000 -> 0x00__ -> 0x001A。然后将该结果写回上 rd。因此在两个 16 位周期内完成我的 32 位 sll。

示例 3:假设 rs1 为 0x01231234,rs2 为 0x00000002(执行左移 2)

  • 首先,我读取了 rs1 和 rs2 的低 16 位,呈现 0x1234 和 0x0002。但是通过阅读我也得到了两个寄存器的状态位,在这种情况下,rs1 为 1,rs2 为 0,因为 rs1 的高 16 位非零。由于 rs1 的状态位非零,即使没有 1 从低 16 位移出,我也必须执行第二个周期(参见示例 2)。从现在开始,它遵循示例 2,通过写回 rd 并为高位执行第二个周期。

我希望这些例子能提供更好的见解。



现在我想实现一个右移操作(算术和逻辑)。但是如何在最多 2 个周期内做到这一点,如果我必须先读取较低的 rs1 寄存器(包括状态位)?


谢谢阅读; 这是我在这里的第一个问题,所以请不要对我苛刻:D

0 投票
2 回答
471 浏览

assembly - Assembly-RiscV 中的“不”是什么意思?

not在 RiscV中是什么意思?我从 C 中翻译了一些代码后得到它,如下所示:

0 投票
1 回答
155 浏览

cpu - RiscV 转发,我们为什么不需要它?

有人可以帮我理解为什么在第 1 行和第 3 行之间我们不需要转发(1 和 2 之间没有绿色箭头)

我认为我们需要它,因为 sub 使用 add 确定的 t0 的值,并且两者都在同时读取和写入该值。(准确地说,添加的写入发生在时钟上升时更晚)