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呢? 对喽,归纳法。
这里电路结构一般都是画出来的:标好号,然后类似普通结构归纳
- 先给出(直接画出来)基本电路的定义:最小单元(e.g. 一位的 full adder)
- 通过 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 的状态表示