再探究异常处理 前言阅读本案例需要有做 nemu 的经历,最低要求是是做到 PA3.1。 一个最简单的异常处理程序12345678910111213141516#include <klib.h>void handler() { uintptr_t mepc; asm volatile("csrr %0, mepc" : "=r"(mep 2024-11-19 ysyx #异常处理
总线 前言思路1、将默认信号改成握手信号2、加上随机延迟3、综合测试 状态机的角度进行思考,如何进行状态转换,这个过程中,要考虑信号延迟,因此要能将状态能够保持几个周期,因此要在信号发射端,保持这些信号。总之,谁发射,谁负责,谁接收到了,谁转换状态。 CPU 的状态完全靠寄存器来保持;MEM 的状态完全靠寄存器来保持。 2024-10-30 ysyx > npc #ysyx #总线
AXI总线协议简述 前言AXI(Advanced eXtensible Interface)是 AMBA(Advanced Microcontroller Bus Architecture)协议家族的一部分,由 ARM 公司制定。AXI 是一种高性能、可扩展的总线协议,广泛用于 SoC(System on Chip) 设计中,特别适用于高带宽、低延迟的应用。它主要用于在系统中不同组件之间传输数据和控制信号,尤其是 2024-10-28 ysyx > npc #ysyx #总线
RT-Thread in PA4.1 的思考 前言前面谈到了异常响应机制,如果在上下文恢复的时候,做点手脚,比如别让它回到原来的上下文,而是回到了另一个进程的上下文,那么这就是进程切换,也是多道程序的基础。 yield OS前言就是 yield OS 的核心思想了,实现kcontext 后,别忘了修改 trap.S,使得 a0 这个返回值传到 sp。 1234567Context* kcontext(Area kstack, void ( 2024-10-21 ysyx > nemu #ysyx #pa4.1
异常响应机制 前言在 riscv 中,当发生异常的时候,需要调用 ecall 指令来陷入异常: 12345678910111213#define ECALL(dnpc) \ { 2024-10-18 ysyx > nemu #ysyx #pa3 #异常处理
npc 中三种设备的区别 前言在把 PA2.3 做完之后,顺手把 ysyx 的 npc 中的设备模仿 nemu 也实现了一下,分别是串口、时钟、vga,本文讨论一下这三种设备的区别。事实上,这三种设备循序渐进,虽然是三种设备,但其实在 CPU 眼里,它就是同一种东西,都是读写内存。 设备在 nemu 的模型中,程序访问设备的时候,会提供统一的接口,比如 io_read、io_write,比如: 123456789101 2024-10-16 ysyx > npc #ysyx #pa2 #设备
riscv 函数调用问题 前言昨天开组会,助教在会上问了一个问题:A 函数调用 B 函数,s0 的保存是哪一个函数进行的。我觉得这个问题挺熟悉的,因为之前在看 riscv 的 xv6 操作系统时遇到过。 实验main.c: 12345678#include <add.h>#include <stdio.h>int main() { int a = 10, b = 5; in 2024-10-14 函数 #riscv32 #指令
5 级流水线 CPU 的实现 前言在 PA2 中,要求实现一个单周期的 CPU,也就是 NPC。这个工作做完了之后,我发现了一本好书,名字叫做《CPU 制作入门:基于 RISC-V 和 Chisel》,是一个日本作者写的。内容非常适合入门,我花了一天时间就看到了单周期,被作者的思路完全影响了,第二天就立即开始重构 NPC,重构好了之后,整个项目看起来很清晰,把能在 ID 阶段做的事情都做了,一共分了 5 个阶段:IF、ID 2024-10-10 PA2 > CPU #Chisel #riscv32
nemu 工作原理解析 前言本人在实现 npc 的仿真环境的基础设施的时候,发现要重新写很多东西,好消息是这些东西已经在 nemu 中实现了。但是把它重新部署到 npc 却不是一件简单的事情,要对文件组织、编译流程有一个深刻的认识。 编译 2024-09-26 PA2 > 模拟器 #nemu #仿真
DPI-C 传递参数的问题 前言DPI-C 是 Verilator 提供的一种机制,可以在 Verilog 代码中调用 C/C++ 中定义的 C 语言函数。这为 Verilog 与仿真环境(C/C++)的交互提供了方便。 DPI-C 的基本使用步骤 在 Verilog 中声明 C 函数 使用 import "DPI-C" 语句在 Verilog 中声明要调用的 C 函数。语法如下 2024-09-25 PA2 > 模拟器 #DPI-C #Verilog