LA 挑战赛:综合的时候 vivado 内存爆炸 vivado 内存占用过多在综合 cache 的时候,发现内存直接占用过多,导致综合失败,仔细研究了下代码发现是这个引起的: 12345678910111213141516171819reg [149:0] cache_line_0[255:0];reg [149:0] cache_line_1[255:0];reg [149:0] cache_line_2[255:0];reg [149:0] 2025-07-23 体系结构 #CPU #FPGA #vivado
一次升级内网环境的记录 前言由于原来的路由器连接的设备过多就会导致内网中所有连接这个路由器的的设备自动失去网络连接,只有通过重启设备解决,很影响效率。于是我买了一个中国移动定制的路由器,型号是 WTC181。 操作流程货收到了后,由于这个路由器是 WAN/LAN 混合,导致我从原来的路由器拉出来的 LAN 插到 WTC181 上的 WAN/LAN 混合口后,并没有自动构建一个新的内网环境。 然后我打开 2025-07-20 网络 #NetWork
LA 挑战赛:双 Cache 设计 前言cache 的设计如果能配合良好的 debug 系统,那么就不是太难。由于 icache 只是 dcache 的一个子集功能,因此只要设计好了 dcache,icache 自然就能正常运作。笔者设计好 cache 并成功启动 linux_kernel 后,认为 cache 设计可以问分为两个部分:可缓存的访问和不可缓存的访问,用信号 uncache_en 来指明,这个信号由访存单元和访问 ca 2025-07-15 体系结构 #CPU #cache
LA 挑战赛:一次调试 bug 的记录 问题在 sc.w 执行后,我发现一切都很合规,但是 REF 跳进了一个 pc = 0x00204000 的指令,然而 DUT 还在若无其事的执行 sc.w 的下一条指令。这让我意识到了,可能是 sc.w 遇到了异常,REF 给出了正确的响应,然而 DUT 无动于衷。 分析过程pc = 0x00204000 是什么异常的处理入口呢? 因为我是在启动 linux,因此必须对这个地址 2025-07-01 体系结构 #CPU #TLB
LA 挑战赛:OpenLA500 的 cache 研究 前言OpenLA500 的 dcache 是一个简单的 cache,实现了 《CPU 设计实战》中 有关cache 的所有需求,因此它值得研究和学习。 体系结构cache 是内存的一部分内容拷贝,因此 CPU 访存的时候首先访问 cache,若命中就返回,若未命中就会 refill 然后返回(数据或者 write 的 OK 信息)。 cache 的三种映射方式中,组相联是最好的,它结合了全相联和直 2025-06-13 体系结构 #CPU #cache
《沉默之塔》全文 沉默之塔第一章:真理的囚徒42号平行宇宙,地球历2847年。 晨光透过教室巨大的落地窗倾泻而入,在林默然的讲台上投下一道笔直的金色光柱。他站在光柱中央,身影被拉得修长而孤独,像一座等待审判的雕像。 “能量守恒定律告诉我们,”林默然的声音低沉而富有磁性,在空旷的阶梯教室中回荡,”在任何封闭系统中,能量既不会凭空产生,也不会凭空消失,只会从一种形式转化为另一种形式。” 他停顿了一下,目光扫过台下二十三 2025-06-01 小说 #科幻
LA 挑战赛:添加系统调用异常支持 异常和中断软硬协同在 CPU (以 riscv 为例)上运行的 OS 上的应用程序(有点绕)可以发起 syscall,也就是系统调用。 当用户程序调用系统调用的时候(比如 write调用 ),实际上,走到了这里(大致描述): 12345.global writewrite: li a7, SYS_write ecall ret 首先,将系统调用号放到 a7,接着执行 ecall 2025-04-22 CPU #LoongArch #CPU #FPGA
LA 挑战赛:BRAM 的引入 BRAM理想的效果是,IFU 在当前周期上升沿给 inst_sram 发射地址后,在当前周期内就可以拿到 inst_data,但是这是理性情况下。 异步 RAM 很方便,但是实际情况是,CPU 的频率非常快,比 RAM 快得多,因此如果为了保持异步访存,就得将 CPU 的频率降低,这很明显会损失性能(暂不考虑 inst cache)。 这里就引入了 BRAM,它在当前周期给 BRAM 发射地址,下 2025-04-16 CPU #LoongArch #CPU #FPGA
LA 挑战赛:5级流水线的实现 阻塞技术解决相关引发的冲突概述阻塞技术,以 5 级流水线为例,就是将这个 5 个模块设计成单独的模块。比如对于 IDU,IFU 就是它的上游,EXU 就是它的下游。IDU 的数据来自上游,同时它要给下游 EXU 提供数据。 阻塞技术会使得每一个模块都会相互解耦,成了一个单独的模块。 模块之间如何握手呢? 设想一下,对于 IDU 而言,假设它遇到了点事情,需要阻塞,那么就会通知 IFU 不要发数据了 2025-04-15 CPU #LoongArch #CPU #FPGA
浅谈 Rust 中的移动语义与所有权机制 移动特性C++11 会通过移动语义来消除内存拷贝成本,而 rust 将这种特性发挥到极致,推出了所有权机制。 看一段代码: 12let s1 = String::from("hello");let s2 = s1; 当 s2 绑定 s1 的资源的时候,就会将 s1 的资源转移到 s2 中,这是因为一份资源只能有一个拥有者。 换句话说,s1 资源转移到 s2 中,不仅仅发生了浅 2025-04-07 编程语言 > Rust #Rust