<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>Risc-V架构 on Lumenth</title>
        <link>https://blog.lumenth.me/tags/risc-v%E6%9E%B6%E6%9E%84/</link>
        <description>Recent content in Risc-V架构 on Lumenth</description>
        <generator>Hugo -- gohugo.io</generator>
        <language>zh-cn</language>
        <copyright>Lumenth</copyright>
        <lastBuildDate>Wed, 05 Aug 2026 11:38:04 +0800</lastBuildDate><atom:link href="https://blog.lumenth.me/tags/risc-v%E6%9E%B6%E6%9E%84/index.xml" rel="self" type="application/rss+xml" /><item>
        <title>Risc-V 基本知识</title>
        <link>https://blog.lumenth.me/p/risc-v/</link>
        <pubDate>Tue, 28 Jul 2026 00:00:00 +0000</pubDate>
        
        <guid>https://blog.lumenth.me/p/risc-v/</guid>
        <description>&lt;img src="https://blog.lumenth.me/p/risc-v/Risc-V.png" alt="Featured image of post Risc-V 基本知识" /&gt;&lt;p&gt;本人数字IC小白，一直对Risc-V处理器很感兴趣，打算仔细学习一下，并将学习过程记录下来，顺便敦促自己学习。&lt;/p&gt;
&lt;p&gt;文章内容基于&lt;a class=&#34;link&#34; href=&#34;https://ecrionix.org/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;该网站教学&lt;/a&gt;。&lt;/p&gt;
&lt;h1 id=&#34;risc-v-基本知识&#34;&gt;Risc-V 基本知识
&lt;/h1&gt;&lt;p&gt;我要实现一个RV32I的CPU，因此需要了解RV32I的指令集架构以及内部结构。&lt;/p&gt;
&lt;h2 id=&#34;指令集架构&#34;&gt;指令集架构
&lt;/h2&gt;&lt;p&gt;基础整数指令集(I)提供了运算所需的全部基础指令，包含了加法、减法、逻辑运算、移位、跳转等指令。&lt;/p&gt;
&lt;p&gt;部分指令如下表所示&lt;/p&gt;
&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th&gt;类别&lt;/th&gt;
          &lt;th&gt;作用&lt;/th&gt;
          &lt;th&gt;RV32I包含指令&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td&gt;计算(Arithmetic)&lt;/td&gt;
          &lt;td&gt;整数加减法&lt;/td&gt;
          &lt;td&gt;add, sub, addi&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;逻辑(Logic)&lt;/td&gt;
          &lt;td&gt;按位与、或、异或、移位&lt;/td&gt;
          &lt;td&gt;and, or, xor, sll, srl&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;比较（Compare）&lt;/td&gt;
          &lt;td&gt;比较大小，结果1/0写入目标寄存器&lt;/td&gt;
          &lt;td&gt;slt, slti&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;加载/存储(Load/Store)&lt;/td&gt;
          &lt;td&gt;从存储器中加载 / 存储数据到寄存器&lt;/td&gt;
          &lt;td&gt;lw, sw, lb, sb&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;分支(Branch)&lt;/td&gt;
          &lt;td&gt;判断条件成立（if 判断、循环）&lt;/td&gt;
          &lt;td&gt;beq, bne, blt, bge&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;跳转(Jump)&lt;/td&gt;
          &lt;td&gt;固定跳转并保存返回地址，多用于函数调用、函数返回&lt;/td&gt;
          &lt;td&gt;jal, jalr&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id=&#34;理解指令的构成&#34;&gt;理解指令的构成
&lt;/h3&gt;&lt;p&gt;RISC-V指令由少量字段构成。掌握这七种字段，就能看懂几乎所有指令：&lt;/p&gt;
&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th&gt;字段&lt;/th&gt;
          &lt;th&gt;位数&lt;/th&gt;
          &lt;th&gt;表示了什么&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td&gt;opcode&lt;/td&gt;
          &lt;td&gt;7bit&lt;/td&gt;
          &lt;td&gt;指令类型（属于算术运算指令？读取加载指令？还是分支跳转指令？）&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;rd&lt;/td&gt;
          &lt;td&gt;5bit&lt;/td&gt;
          &lt;td&gt;目标寄存器（运算结果的存储位置）&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;rs1&lt;/td&gt;
          &lt;td&gt;5bit&lt;/td&gt;
          &lt;td&gt;源寄存器1&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;rs2&lt;/td&gt;
          &lt;td&gt;5bit&lt;/td&gt;
          &lt;td&gt;源寄存器2&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;funct3&lt;/td&gt;
          &lt;td&gt;3bit&lt;/td&gt;
          &lt;td&gt;指令的子类型（选取opcode组别内具体的运算指令）&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;funct7&lt;/td&gt;
          &lt;td&gt;7bit&lt;/td&gt;
          &lt;td&gt;指令的子类型（用于区分共用同一个 funct3 字段的运算指令）&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;imm&lt;/td&gt;
          &lt;td&gt;视情况&lt;/td&gt;
          &lt;td&gt;立即数（自己输入常量数值，如“add 1”里的数字 “1”）&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;并非每条指令都需要占用所有字段单元。加法指令（add）需要三个寄存器，无需常量；立即数加法指令（addi）需要一个寄存器搭配一个常量；跳转指令则需要一个大范围偏移量。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;六种格式一览&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://blog.lumenth.me/p/risc-v/code-formats.png&#34;
	width=&#34;1847&#34;
	height=&#34;779&#34;
	srcset=&#34;https://blog.lumenth.me/p/risc-v/code-formats_hu_a218630d7c259ab8.png 480w, https://blog.lumenth.me/p/risc-v/code-formats_hu_6cf43377887df755.png 1024w&#34;
	loading=&#34;lazy&#34;
	
		alt=&#34;指令格式&#34;
	
	
		class=&#34;gallery-image&#34; 
		data-flex-grow=&#34;237&#34;
		data-flex-basis=&#34;569px&#34;
	
&gt;&lt;/p&gt;
&lt;h3 id=&#34;每种格式的用途&#34;&gt;每种格式的用途
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;R-type (Register)：两个源寄存器 → 一个输出寄存器。仅寄存器之间的计算，例如add x7, x5, x6 sub and xor sll&lt;/li&gt;
&lt;li&gt;I-type (Immediate)：一个源寄存器、12位立即数 → 一个输出寄存器。该指令格式同样适用于加载指令等操作，例如：jalr、addi x6, x6, 1、lw x5, 0 (x10)&lt;/li&gt;
&lt;li&gt;S-type (Store)：两个源寄存器（作为基址和要写入的数据）、12位立即数作为地址偏移量 → 写入存储器（地址rs1 + imm）。例如：sw x5, 8(x10)&lt;/li&gt;
&lt;li&gt;B-type (Branch)：比较两个寄存器，若满足判定条件，则依据有符号偏移量完成跳转。该指令格式与 S 型指令相似，但其立即数用于跳转目标的地址。例如：beq x6, x7, loop&lt;/li&gt;
&lt;li&gt;U-type (Upper Immediate)：20位立即数 → 一个输出寄存器。将立即数存储到寄存器中，例如lui x7, 1000&lt;/li&gt;
&lt;li&gt;J-type (Jump)：20位立即数 → 程序计数器。将立即数存储到程序计数器中，并跳转到指定位置，例如：jal x1, 0x100  # 跳转到PC+0x100，同时x1保存PC+4&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;所有指令详解见&#34;&gt;&lt;strong&gt;所有指令详解见&lt;a class=&#34;link&#34; href=&#34;https://blog.lumenth.me/p/risc-v-instructions/&#34; &gt;本文&lt;/a&gt;&lt;/strong&gt;
&lt;/h3&gt;&lt;h2 id=&#34;寄存器&#34;&gt;寄存器
&lt;/h2&gt;&lt;p&gt;采用寄存器不直接采用数据存储器的原因：&lt;strong&gt;寄存器访问速度快&lt;/strong&gt;，内存访问速度慢&lt;/p&gt;
&lt;h3 id=&#34;32个寄存器x0x31&#34;&gt;32个寄存器：x0–x31
&lt;/h3&gt;&lt;p&gt;RV32I给出了32个通用寄存器，分别命名为x0、x1、x2、&amp;hellip;&amp;hellip;x31，每个寄存器宽度为32位。&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://blog.lumenth.me/p/risc-v/register.png&#34;
	width=&#34;2034&#34;
	height=&#34;726&#34;
	srcset=&#34;https://blog.lumenth.me/p/risc-v/register_hu_f04ff67b4bf5fa86.png 480w, https://blog.lumenth.me/p/risc-v/register_hu_e5777cb2b32c7378.png 1024w&#34;
	loading=&#34;lazy&#34;
	
		alt=&#34;寄存器&#34;
	
	
		class=&#34;gallery-image&#34; 
		data-flex-grow=&#34;280&#34;
		data-flex-basis=&#34;672px&#34;
	
&gt;&lt;/p&gt;
&lt;h3 id=&#34;寄存器x0&#34;&gt;寄存器x0
&lt;/h3&gt;&lt;p&gt;x0寄存器最特别，x0读出端恒接0电平，写入无效。对零寄存器x0的巧妙复用，这样能设计出很多高效指令写法，使RISC-V架构所需的实际指令数量更少：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;恒定的0寄存器&lt;/strong&gt;:任何需要0时，直接从x0中取。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;复制寄存器&lt;/strong&gt;:如将x6复制到x5时，可以直接add x5, x6, x0，将x6+0存入x5。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;丢弃一个结果&lt;/strong&gt;:如果只需要一个指令带来的其他效益而不需计算结果，可以将结果直接写入x0。&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id=&#34;寄存器的abi名称与作用&#34;&gt;寄存器的ABI名称与作用
&lt;/h3&gt;&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th&gt;寄存器编号&lt;/th&gt;
          &lt;th&gt;ABI 名称	功能说明&lt;/th&gt;
          &lt;th&gt;&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td&gt;x0&lt;/td&gt;
          &lt;td&gt;zero&lt;/td&gt;
          &lt;td&gt;硬件固化常量 0 寄存器&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;x1&lt;/td&gt;
          &lt;td&gt;ra&lt;/td&gt;
          &lt;td&gt;返回地址（函数执行完毕的返回跳转地址）&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;x2&lt;/td&gt;
          &lt;td&gt;sp&lt;/td&gt;
          &lt;td&gt;栈指针&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;x3&lt;/td&gt;
          &lt;td&gt;gp&lt;/td&gt;
          &lt;td&gt;全局指针&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;x4&lt;/td&gt;
          &lt;td&gt;tp&lt;/td&gt;
          &lt;td&gt;线程指针&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;x5–x7&lt;/td&gt;
          &lt;td&gt;t0 – t2&lt;/td&gt;
          &lt;td&gt;临时寄存器（暂存寄存器，调用者保存）&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;x8&lt;/td&gt;
          &lt;td&gt;s0 / fp&lt;/td&gt;
          &lt;td&gt;保存寄存器 / 栈帧指针&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;x9&lt;/td&gt;
          &lt;td&gt;s1&lt;/td&gt;
          &lt;td&gt;保存寄存器（被调用者保存）&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;x10–x11&lt;/td&gt;
          &lt;td&gt;a0 – a1&lt;/td&gt;
          &lt;td&gt;函数参数、函数返回值&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;x12–x17&lt;/td&gt;
          &lt;td&gt;a2 – a7&lt;/td&gt;
          &lt;td&gt;其余函数入参&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;x18–x27&lt;/td&gt;
          &lt;td&gt;s2 – s11&lt;/td&gt;
          &lt;td&gt;保存寄存器（被调用者保存）&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;x28–x31&lt;/td&gt;
          &lt;td&gt;t3 – t6&lt;/td&gt;
          &lt;td&gt;扩展临时寄存器（调用者保存）&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id=&#34;pc程序计数器&#34;&gt;PC程序计数器
&lt;/h3&gt;&lt;p&gt;程序计数器（PC）并不包含在32个通用寄存器之中，但至关重要。该寄存器存储着当前正在执行指令的内存地址，PC的变化也决定接下来执行什么指令。正常情况下，CPU执行完一条指令后，程序计数器数值会自增4（因为每条指令占用4字节，也就是32位），从而指向下一条待执行指令；而分支指令或跳转指令会改写程序计数器的数值，这也是循环语句与条件判断语句实现的原理。&lt;/p&gt;
&lt;h2 id=&#34;内存栈&#34;&gt;内存、栈
&lt;/h2&gt;&lt;h3 id=&#34;内存&#34;&gt;内存
&lt;/h3&gt;&lt;p&gt;寄存器运行速度快，但数量稀少，仅有32个。实际运行的程序需要存储的数据量要大得多，同时程序还会调用层层嵌套的函数。想要实现这些需求，就必须依靠内存、栈结构，以及一套被称为调用约定的通用规范。&lt;/p&gt;
&lt;p&gt;在RV32架构中，地址为32位长度，因此最多拥有4GB的字节存储单元（总数量为2的32次方个）。想要操作内存，只需提供对应地址，执行读取或是写入操作。&lt;/p&gt;
&lt;p&gt;RISC-V架构在内存中采用小端序存放数据：一个32位字数据存储时，最低有效字节存放在最低内存地址。&lt;/p&gt;
&lt;p&gt;内存对齐：32位字数据的存放地址通常必须是4的整数倍（半字数据地址需为2的整数倍）。对齐式内存访问对硬件而言处理逻辑最为简洁。&lt;/p&gt;
&lt;p&gt;映射：&lt;/p&gt;
&lt;div align=&#34;center&#34;&gt;
&lt;img src=&#34;Memory-Map.png&#34; style=&#34;width:72%;max-width:700px;height:auto;&#34; alt=&#34;RV32指令对照表&#34;&gt;
&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;Text — 程序代码&lt;/li&gt;
&lt;li&gt;Data — 全局变量&lt;/li&gt;
&lt;li&gt;Heap — 动态分配的内存（向上扩展）&lt;/li&gt;
&lt;li&gt;Stack — 函数调用栈（向上扩展）&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;栈&#34;&gt;栈
&lt;/h3&gt;&lt;p&gt;栈是一块专用内存区域，工作原理如同一摞盘子：遵循后进先出规则。内存中栈的特性：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;栈地址向低地址方向增长：执行入栈操作时，sp 寄存器数值会减小。&lt;/li&gt;
&lt;li&gt;处理器没有专用的push（入栈）指令：需要手动实现入栈流程，先减小sp的值，再完成数据存入；出栈则先读取数据，再将sp数值恢复增加。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;栈存在的意义：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;执行嵌套函数调用————jal指令调用函数时会将返回地址存入ra寄存器。但倘若该函数内部又调用了另一个函数，第二条jal指令就会覆盖ra寄存器中的原有数据，致使外层函数丢失返回地址。&lt;/li&gt;
&lt;li&gt;对应的解决办法为：每个函数在发起嵌套调用前，先将ra寄存器的值存入堆栈，调用结束后再从堆栈中恢复该数值。依托堆栈机制，函数能够实现任意深度的嵌套调用，且每一层调用都可保存自身对应的返回地址。入栈操作等价于先执行addi sp,sp,-N再执行sw存储指令，出栈操作等价于先执行lw加载指令再执行addi sp,sp,N。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;调用约定the-calling-convention&#34;&gt;调用约定（The calling convention）
&lt;/h3&gt;&lt;p&gt;不同人员（或编译器）编写的函数想要能够协同运行，所有参与方必须就参数传递方式、返回值存放位置以及需要保留的寄存器达成统一标准。这套统一标准即为&lt;code&gt;调用约定（The calling convention）&lt;/code&gt;（RISC-V 架构的调用约定与 ARM 的 AAPCS 规范相近）。沿用上一节寄存器的ABI名称与作用命名规则说明如下：&lt;/p&gt;
&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th&gt;寄存器&lt;/th&gt;
          &lt;th&gt;作用&lt;/th&gt;
          &lt;th&gt;保存责任方&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td&gt;a0 ～ a7&lt;/td&gt;
          &lt;td&gt;函数入参；a0（搭配a1可存放多字节返回值）用作函数返回值&lt;/td&gt;
          &lt;td&gt;调用方保存&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;ra&lt;/td&gt;
          &lt;td&gt;函数返回地址&lt;/td&gt;
          &lt;td&gt;调用方保存（嵌套调用前务必手动保存）&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;t0 ～ t6&lt;/td&gt;
          &lt;td&gt;临时寄存器（临时计算值，随意覆写）&lt;/td&gt;
          &lt;td&gt;调用方保存&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;s0 ～ s11&lt;/td&gt;
          &lt;td&gt;保留寄存器（存放函数局部变量）&lt;/td&gt;
          &lt;td&gt;被调用方保存&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;sp&lt;/td&gt;
          &lt;td&gt;栈指针寄存器&lt;/td&gt;
          &lt;td&gt;被调用方保存（函数返回前必须复原栈指针数值）&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;ul&gt;
&lt;li&gt;调用方保存寄存器（t、a、ra）—— 被调用函数可随意覆盖这类寄存器的值。若调用函数后续还需要使用这些寄存器的数据，必须提前自行完成数据保存。&lt;/li&gt;
&lt;li&gt;被调用方保存寄存器（s0 至 s11、栈指针 sp）—— 被调用函数执行完毕后，这类寄存器的数值&lt;code&gt;必须和调用之初保持一致&lt;/code&gt;；因此函数若要使用该类寄存器，需先将数据入栈保存，在函数返回前再将数据出栈恢复。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;cpu的本质操作&#34;&gt;CPU的本质操作
&lt;/h2&gt;&lt;h3 id=&#34;按照五级流水线来划分rv-cpu的工作可以分为以下五步&#34;&gt;按照五级流水线来划分RV-CPU的工作可以分为以下五步：
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;&lt;em&gt;Fetch(IF)&lt;/em&gt; ———— 从程序计数器（PC）指向的指令存储器（IMEM）中读取 32 位指令，计算 PC 值加 4 的结果。&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Decode(ID)&lt;/em&gt; ———— 将指令拆分为各个字段。从寄存器堆中读取源寄存器 1、源寄存器 2 的数据。对立即数进行符号扩展。&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Execute(EX)&lt;/em&gt; ———— 算术逻辑单元计算运算结果或分支目标地址。执行分支指令时，对操作数进行比对。&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Memory(MEM)&lt;/em&gt; ———— Load: 读取内存数据。Store: 数据存入内存。非存储器类指令直接跳过此步骤。&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Write-back(WB)&lt;/em&gt; ———— 结果写回目标寄存器&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;执行cpu数据通路所需的组成结构&#34;&gt;执行CPU数据通路所需的组成结构
&lt;/h3&gt;&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th&gt;结构&lt;/th&gt;
          &lt;th&gt;缩写&lt;/th&gt;
          &lt;th&gt;作用&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td&gt;程序计数器(Program Counter)&lt;/td&gt;
          &lt;td&gt;PC&lt;/td&gt;
          &lt;td&gt;用于存放待读取下一条指令地址的32位寄存器&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;指令存储器(Instruction Memory)IMEM&lt;/td&gt;
          &lt;td&gt;存储程序的只读存储器(组合逻辑电路，无需时钟信号)&lt;/td&gt;
          &lt;td&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;指令译码器(Instruction Decoder)&lt;/td&gt;
          &lt;td&gt;DECODE&lt;/td&gt;
          &lt;td&gt;用于将指令拆分为各个字段&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;寄存器堆(Register File)&lt;/td&gt;
          &lt;td&gt;REGFILE&lt;/td&gt;
          &lt;td&gt;32个32位寄存器，两组异步读取端口与一组同步写入端口&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;立即数生成器(Immediate Generator)&lt;/td&gt;
          &lt;td&gt;IMMGEN&lt;/td&gt;
          &lt;td&gt;根据指令格式对指令中的立即数字段进行符号扩展处理。&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;算数逻辑单元(ALU)&lt;/td&gt;
          &lt;td&gt;ALU&lt;/td&gt;
          &lt;td&gt;接收两个32位操作数，计算后输出32位运算结果以及用于分支判断的零标志位。&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;算术逻辑单元多路选择器(ALU MUX)&lt;/td&gt;
          &lt;td&gt;ALUMUX&lt;/td&gt;
          &lt;td&gt;选择ALU的第二个操作数取值为寄存器rs2或是立即数。&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;数据存储器(Data Memory)&lt;/td&gt;
          &lt;td&gt;DMEM&lt;/td&gt;
          &lt;td&gt;暂存数据的存储器，可控制寄存器写入或读出。&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;写回多路选择器(Write-back MUX)&lt;/td&gt;
          &lt;td&gt;WBMUX&lt;/td&gt;
          &lt;td&gt;选择写入目标寄存器rd的数据来源。&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;分支处理单元(Branch Unit)&lt;/td&gt;
          &lt;td&gt;BRANCH&lt;/td&gt;
          &lt;td&gt;判断是否执行分支跳转，随后计算分支目标地址&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;程序计数器多路选择器(PC MUX)&lt;/td&gt;
          &lt;td&gt;PCMUX&lt;/td&gt;
          &lt;td&gt;选择下一个程序计数器数值，也就是是否跳转&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;控制单元(Control Unit)&lt;/td&gt;
          &lt;td&gt;CTRL&lt;/td&gt;
          &lt;td&gt;为内部单元提供控制信号&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id=&#34;术语词表&#34;&gt;术语词表
&lt;/h2&gt;&lt;p&gt;记录在学习过程中遇到的专业名词&lt;/p&gt;
&lt;h3 id=&#34;abi&#34;&gt;ABI
&lt;/h3&gt;&lt;p&gt;ABI(Application Binary Interface)，应用二进制接口&lt;/p&gt;
&lt;h3 id=&#34;alu&#34;&gt;ALU
&lt;/h3&gt;&lt;p&gt;ALU(Arithmetic Logic Unit)，算术逻辑单元。包含加法器、减法器、移位器、逻辑运算器等功能。&lt;/p&gt;
&lt;h3 id=&#34;cisc&#34;&gt;CISC
&lt;/h3&gt;&lt;p&gt;CISC（Complex Instruction Set Computer），复杂指令集计算机。&lt;/p&gt;
&lt;h3 id=&#34;csr&#34;&gt;CSR
&lt;/h3&gt;&lt;p&gt;CSR（Control and Status Register），控制和状态寄存器。&lt;/p&gt;
&lt;h3 id=&#34;immediate&#34;&gt;Immediate
&lt;/h3&gt;&lt;p&gt;立即数,表示CPU能直接调用的常量数值。&lt;/p&gt;
&lt;h3 id=&#34;isa&#34;&gt;ISA
&lt;/h3&gt;&lt;p&gt;ISA（Instruction Set Architecture），指令集架构。&lt;/p&gt;
&lt;h3 id=&#34;pseudo-instruction&#34;&gt;Pseudo-instruction
&lt;/h3&gt;&lt;p&gt;伪指令，不是汇编指令，在编译的时候会被编译器转换为对应的汇编指令。&lt;/p&gt;
&lt;h3 id=&#34;risc&#34;&gt;RISC
&lt;/h3&gt;&lt;p&gt;RISC（Reduced Instruction Set Computer），精简指令集计算机。&lt;/p&gt;
&lt;p&gt;RISC-V就是一种基于精简指令集（RISC）原则的开源指令集架构（ISA）&lt;/p&gt;
&lt;h3 id=&#34;rv32i&#34;&gt;RV32I
&lt;/h3&gt;&lt;p&gt;RV -&amp;gt; RISC-V
32 -&amp;gt; 指令集长度32bit
I -&amp;gt; base Integer instruction set 即整数型指令集&lt;/p&gt;
&lt;h3 id=&#34;可扩展为rv32imafdc&#34;&gt;可扩展为RV32IMAFDC
&lt;/h3&gt;&lt;p&gt;RV -&amp;gt; RISC-V
32 -&amp;gt; 指令集长度32bit
I -&amp;gt; base Integer instruction set 即整数型指令集
M -&amp;gt; multiply &amp;amp; divide 即乘除指令
A -&amp;gt; atomic operations 即原子操作
F/D -&amp;gt; floating-point 即浮点型
C -&amp;gt; compressed 16-bit instructions 即压缩指令&lt;/p&gt;
</description>
        </item>
        
    </channel>
</rss>
