ZiChong Lv Asked: 2025-03-23 16:26:28 +0800 CST2025-03-23 16:26:28 +0800 CST 2025-03-23 16:26:28 +0800 CST 机器如何读取Risc-v的指令 772 问题是机器如何读取指令?例如:如果它是R类型,机器首先读取操作码以了解指令类型,然后根据类型,从右到左读取指令,了解rd,然后读取funct3,然后读取rs1和rs2以及最后的funct7。对吗? riscv 1 个回答 Voted Best Answer Erik Eidt 2025-03-23T17:16:10+08:002025-03-23T17:16:10+08:00 如果您正在为 RISC V 编写软件模拟器,则可能需要执行以下步骤: 假设字节*pc; opcode = pc[0] & 0x7F; if (opcode == 0x33) { // reg/reg instruction format rd = ((pc[0] & 0x80) >> 7) + ((pc[1] & 0x7) << 1); func3 = (pc[1] & 0x38) >> 3; rs1 = ...; rs2 = ...; s1 = reg[rs1]; s2 = reg[rs2]; switch (func3) { case ...: switch(func7) { case ...: answer = s1 + s2; break; case ...: answer = s1 & s2; break; case ...: answer = s1 | s2; break; case ...: answer = s1 - s2; break; } } reg[rd] = answer; } 在这里,您可以指定提取rd字段是有条件的,并且仅基于操作码为 reg/reg 来完成。您可能会说rd首先提取字段,然后提取func3字段。 但是,以下内容同样有效: opcode = pc[0] & 0x7F; if (opcode == 0x33) { // reg/reg instruction format rs1 = ...; rs2 = ...; func3 = (pc[1] & 0x38) >> 3; rd = ((pc[0] & 0x80) >> 7) + ((pc[1] & 0x7) << 1); ... } 因此,在软件中,我们会表达解码步骤的顺序,但顺序有点随意。最重要的是在知道指令格式为 reg/reg 的情况下提取字段。 然而,硬件将会做更多这样的事情: parallel { rs1 = ...; rs2 = ...; func3 = (pc[1] & 0x38) >> 3; rd = ((pc[0] & 0x80) >> 7) + ((pc[1] & 0x7) << 1); opcode = pc[0] & 0x7F; imm = ...; } parallel { s1 = reg[rs1]; s2 = reg[rs2]; } parallel { answer1 = s1 + s2; answer2 = s1 - s2; answer3 = s1 & s2; answer4 = s1 | s2; } if opcode == 0x33 { switch (func3) { switch (func7) { case ...: reg[rd] = answer1; break; case ...: reg[rd] = answer2; break; } } } 很难表达硬件的排序概念——它将按从头到尾逐步执行的操作。 对于硬件,最好谈谈条件和依赖关系。 例如,作为依赖项,s1如果不先获得,我们就无法获得rs1,因为s1 = reg[rs1]。 作为一个条件,answer1一旦它对opcode、func3和有了足够的了解,它就应该接受func7。 但是,如果正确值为 ,这并不会阻止处理器并行计算其他内容answer2。因此,对于处理器而言,它要做的是尽可能多地并行执行,然后在对条件和依赖关系做出全面确定后排除不相关的信息。 在软件模拟中,我们不会费心提取 reg/reg 指令格式的立即数字段。但是,一旦知道指令格式为 reg/reg,硬件就会并行提取立即数,然后忽略立即数字段数据。
如果您正在为 RISC V 编写软件模拟器,则可能需要执行以下步骤:
假设字节*pc;
在这里,您可以指定提取
rd
字段是有条件的,并且仅基于操作码为 reg/reg 来完成。您可能会说rd
首先提取字段,然后提取func3
字段。但是,以下内容同样有效:
因此,在软件中,我们会表达解码步骤的顺序,但顺序有点随意。最重要的是在知道指令格式为 reg/reg 的情况下提取字段。
然而,硬件将会做更多这样的事情:
很难表达硬件的排序概念——它将按从头到尾逐步执行的操作。
对于硬件,最好谈谈条件和依赖关系。
例如,作为依赖项,
s1
如果不先获得,我们就无法获得rs1
,因为s1 = reg[rs1]
。作为一个条件,
answer1
一旦它对opcode
、func3
和有了足够的了解,它就应该接受func7
。但是,如果正确值为 ,这并不会阻止处理器并行计算其他内容
answer2
。因此,对于处理器而言,它要做的是尽可能多地并行执行,然后在对条件和依赖关系做出全面确定后排除不相关的信息。在软件模拟中,我们不会费心提取 reg/reg 指令格式的立即数字段。但是,一旦知道指令格式为 reg/reg,硬件就会并行提取立即数,然后忽略立即数字段数据。