SysArch

本文最后更新于 2026年5月4日 晚上

布尔代数

各种 Normal Form

分为 CNF,DNF,CCNF,CDNF。

CNF 和 CCNF 选的是 truth table 为 0 的行。全 OR 了再 AND.
DNF 和 CDNF 选的是 truth table 为 1 的行,全 AND 了再 OR.

电路和 Inductive Proof

电路

Cost:基本门的数量:这门课上是 {XOR,AND,OR,NOT} 一类
Depth: Critical Path 的长度

Proof

看来这里是真的很喜欢归纳法证明啊。

因为有些电路结构都是大体相同的,可以递归定义(如加法器)。那么我们如何证明这个东西 computes 一个 specification呢? 对喽,归纳法。

这里电路结构一般都是画出来的:标好号,然后类似普通结构归纳

  1. 先给出(直接画出来)基本电路的定义:最小单元(e.g. 一位的 full adder)
  2. 通过 IH, 证明 k 位的电路(通过画一个封装好的 k-1 位电路,加一点结构,再封装成 k 位电路来表示)也是对的

然后就得证了。

Chisel

Chisel 和 Verilog 区别还是挺大的,写点东西记录一下。

Scala 语言相关

首先,Chisel 是 脱胎于 Scala 的 DSL (Domain Specific Language), 因此也会有 Scala 的一些特性。

现在遇到的有:

  • 强类型语言,所有的类型转换都需要 Explicitly 定义。
  • Chisel 内部电路有自己的 Bool 和 S/UInt 类型, Scala 自己也有数据类型。二者不能混用
  • 类似上一条。 = 是赋值,一般用在 Scala相关类型上。 := 是连线。一般在 Chisel 类型上
  • match expr {case expr=>} 在 Chisel 里是 switch expr{is expr=>}
  • JVM 运行时会 Erase 类型。所以对于 Polymorphic types, pattern matching 只会 match 第一个选项

元件定义

所有的 io 都要通过 extend Bundle 的形式定义。
所有的 module 都要通过 extend Module 定义。

数字定义

位宽通过 .W 指定,类比 reg 的有 Bool,SInt,UInt,分别是字面意思。

一个很神经的写法:29.U(6.W),数值为 29, 位宽为 6 的 无符号整数。

自动机相关

好像 Chisel 对自动机的实现有一些糖:

Reg

首先,在 Chisel 里面,2.U 被认为是一个物理节点,无法直接放到 Reg 定义里面。但是 UInt(2.W) 可以放进去,因为这是一个 model。

  • Reg:创建指定位宽的寄存器
  • RegNext(expr):🍬,相当于创建一个 Reg 并自动赋值 expr,位宽自动推导。
  • RegInit(expr)/RegInit(expr,bit wide): 创建一个寄存器, sync reset 时的值为 expr.
  • RegEnable(expr,(init expr),enabled):创建一个能被 enabled 控制的寄存器。 可选择是否有 reset 信号代表的初始值。

Enum(n)

类似 Verilog 里的 parameter, 这里用 A::B::C::Nil = Enum(3) 这样的语法来定义。可用于 FSM 的状态表示


SysArch
https://chenxizhou233.github.io/posts/646ab82a.html
作者
Xizhou Chen
发布于
2026年4月24日
许可协议