跳转至

hardware

内存模型和内存序

背景

内存模型和内存序是一个贯穿软硬件实现的概念,你可以在 CPU 微架构,总线,到汇编指令,编译器和编程语言中看到它们。本文主要来探讨这些问题。

分支预测的 2-taken 和 2-ahead

背景

随着 Zen 5 的推出,更多 Zen5 的架构设计细节被公开,可以看到 Zen 5 前端出现了令人瞩目的变化:引入了 2-taken, 2-ahead 分支预测的设计。这是什么意思?它架构上是怎么实现的?可以带来哪些性能提升?

在 Surface Laptop 7 上运行 Debian Linux

背景

最近借到一台 Surface Laptop 7 可以拿来折腾,它用的是高通 Snapdragon X Elite 处理器,跑的是 Windows on Arm 系统。但作为 Linux 用户,肯定不满足于 WSL,而要裸机上安装 Linux。由于这个机器太新,所以安装的过程遇到了很多坎坷。

VIPT 与缓存大小和页表大小的关系

VIPT(Virtual Index Physical Tag)是 L1 数据缓存常用的技术,利用了虚拟地址和物理地址的 Index 相同的特性,得以优化 L1 数据缓存的读取。但是 VIPT 的使用,与页表大小和 L1 数据缓存大小都有关系。这篇博客探讨一下,VIPT 技术背后的一些问题。

LoongArch 初尝试

背景

最近应龙芯要求把监控程序移植到了 LoongArch 32 Reduced 架构上,趁此机会体验了一下 LoongArch 相关的软件和系统。

I2C 协议

本文的内容已经整合到知识库中。

背景

最近数设课上,同学们开始购买外设,其中就涉及到 I2C 协议,因此顺带写一下 I2C 协议的教程,帮助同学们进行理解。

接口

I2C 协议涉及到两个信号:

  • SCL: 时钟信号,Master -> Slave
  • SDA:数据信号,Master <-> Slave

SPI 协议

本文的内容已经整合到知识库中。

背景

最近数设课上,同学们开始购买外设,其中就涉及到 SPI 协议,因此顺带写一下 SPI 协议的教程,帮助同学们进行理解。

接口

SPI 协议涉及到四个信号:

  • SCLK: 时钟信号,Master -> Slave
  • MOSI:数据信号,Master -> Slave
  • MISO:数据信号,Slave -> Master
  • CS:芯片使能,一般是低有效

在 LiteX 中使用 UART over JTAG

背景

在给 Alinx AX7021 适配 LiteX 的时候,遇到一个问题:PL 上没有连接串口,只有 PS 连接了串口,如果用 RISC-V 软核的话,就会面临无串口可用的情况,除非在扩展 IO 上自己定义一个串口。

因此研究了一下 LiteX 自带的 UART over JTAG 功能,在 Alinx AX7021 中调试出来了。

DRAM 的拓扑和训练

本文的内容已经整合到知识库中。

DRAM Training

DRAM 一直有一个比较麻烦的初始化过程,就是 DRAM Training,其中很重要的一步就是计算出各个数据线相对于时钟的偏移(skew)。这个偏移是怎么来的呢?

我们知道,对于 SRAM,如果想要更多的位宽,只需要把地址线和控制信号连接到多个 SRAM 上,然后把 SRAM 的数据信号并行连接到 FPGA 上就可以了,但是前提是要尽量保证等长,否则一样有偏移的问题。DRAM 也是采用类似的方法进行扩展的,但是 DRAM 通常需要并行连接很多个芯片,例如 8 个 x8 的芯片的合并成一个 64 位的 DDR SDRAM。此时数据线依然是并行连接,但是地址线和控制信号就出现了走线困难:很难在那么小的空间里,等长地把地址和控制信号分布到各个芯片上,而且还有信号完整性的问题。

RAM 读写冲突

背景

在 FPGA 或者 ASIC 中,通常都需要使用 RAM,通过读口、写口或者读写口来进行访问。常见的配置有单读写口(1RW),一读一写(1R1W)等等,读口通常有 1 个周期的延时。那么,如果在同一个周期内,读口和写口访问了同一个地址,会发生什么呢?可能会想到几种情况:

  1. 读和写都失败,读出的数据未定义,数据没写进去
  2. 数据写进去了,读出的数据未定义
  3. 数据写进去了,读出了写之前的旧数据
  4. 数据写进去了,读出了同一个周期写入的新数据

firtool 尝试

背景

Chisel 3.6 很快就要发布了(目前最新版本是 3.6.0-RC2),这个大版本的主要更新内容就是引入了 CIRCT 的 firtool 作为 FIRRTL 到 Verilog 的转换流程:

The primary change in Chisel v3.6.0 is the transition from the Scala FIRRTL
Compiler to the new MLIR FIRRTL Compiler. This will have a minimal impact on
typical Chisel user APIs but a large impact on custom compiler flows. For
more information, please see the ROADMAP.

因此提前测试一下 firtool,看看其和 Scala FIRRTL Compiler 有哪些区别,是否有更好的输出。