Skip to content

Commit b8d9edd

Browse files
committed
feature: add hardware design
1 parent 044cce9 commit b8d9edd

File tree

3 files changed

+49
-0
lines changed

3 files changed

+49
-0
lines changed

docs/hardware/cod.md

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
# 《计算机组成原理》课程实验相关
2+
3+
首先必须要吹一波《计原》课程的大实验[实验文档](https://lab.cs.tsinghua.edu.cn/cod-lab-docs-2022/),基本涵盖了实验基础部分的所有内容,这里我就只再写一些个人感觉踩了不少坑的地方吧。
4+
5+
## 关于 uCore 的另一些提示
6+
7+
- 精确异常:异常或中断发生时考虑 mepc 或 sepc 是否设置在了正确的位置,同时是否真的将发生异常的这条指令效果**完全消除**。如 `sw a5, 0(a5)` 这里发生了异常,那么请确保你的设计不会修改 `a5` 的值。
8+
- 异常种类:和页表相关的异常是较为繁琐的,这里我推荐使用和做网原路由器实验时相同的方式,直接将对应的文档原文作为注释粘贴到代码中,然后一句话一句话实现。注意 Page Table Walker 进行虚实地址转换时也可能会遇到中间结果 Not Valid 异常。
9+
- 仿真工具:见下节。
10+
11+
## 关于仿真工具
12+
13+
私以为限制很多组工作效率的真正原因是仿真工具。跟 Hoxxxxr9 聊天时,其阐述过造机时的状态:改几行代码,开始用 Vivado 自带的仿真,然后打开一集《中二病也要谈恋爱》开始看,看完一集基本仿真波形才能跑的差不多,然后去看波形调时序(<s>把波形拟合成自己想要的样子</s>)。然后再改几行代码,再开始仿真,进入下一个循环...
14+
15+
在这里我推荐一个速度更快的仿真工具 [Verilator](https://verilator.org/guide/latest/),一般想要将 uCore 仿真到开机自检时你出错的地方,即使去改 uCore 的代码删掉一些没用的功能也要 30min ~ 1h 左右,<s>更有甚者甚至晚上把仿真打开,第二天早上起来看波形</s>,而 Verilator 可以在 1min 左右就完成这个工作。具体的安装过程我们这里不做赘述,请自行阅读其使用文档,而其使用过程大概可以概括为:写一个 Fake SRAM 与 Fake UART,然后在 testbench 里用这个器件换掉原来的器件,进而使用 Verilator 仿真。
16+
17+
所谓 Fake,是说你自己去模拟这个器件的功能,并尽可能的保持你的实现与器件原来的实现一致,同时可以输出一些调试信息,比如在 UART 收到字符时用 `$display` 直接打印到 stdout 里。
18+
19+
同时,Verilator 自带的 code linter 功能可以在某种程度上起到帮助检查代码中错误的作用,也帮助了笔者在造机过程中解决了一些问题。比如把一个 26 位宽的信号往下传时不小心输出写 `wire[25:0]`,输入写 `input wire` 而丢了位宽,Vivado 只会报 Warning,而 Verilator 对于位宽不匹配则会报 Error 并提醒你修改或忽略。
20+
21+
此外,也有 iVerilog 等更简单的仿真工具,<s>但可能也有一些坑</s>,欢迎同学们自由探索。
22+
23+
这样你就可以节省下来大量的时间不是在等仿真,而是直接去看《中二病也要谈恋爱》了。<s>笔者造机期间用三个晚上看完了两季 + 剧场版。</s>

docs/hardware/index.md

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
# 硬件设计
2+
3+
!!! note
4+
本文档以个人为视角撰写,如有偏颇之处请联系作者更正。
5+
6+
7+
计算机系的《数字逻辑电路》课程的讲授,是与其他院系完全不同的:讲最基本的组合逻辑和时序逻辑电路的分析与设计。选课的学生,背网原之余,每每花半个晚上,看十几个数电 Slides,便得到一个 B+ 或以上的成绩 —— 这是常常发生的事,现在往往要拿到一个 P,—— ,倘若算卡诺图化简算的快些,便可以拿到一个 A-,或者甚至是 A,然后沾沾自喜了。但这些学生,多是不擅长考试,大抵没有如此幸运……
8+
9+
站在《计算机组成与设计》课程(官方名《****算机组成****理》)所需要的角度,我们来回看在大二春的半个学期的数电课程中,我们应该学会什么东西。大抵来说,可以概括为以下内容:
10+
11+
- 了解组合逻辑电路的基本组成部件与时序逻辑电路的基本组成部件(只需知道其功能,不需要探究其底层实现)
12+
- 了解波形图的看法,可以根据波形图设计组合逻辑和时序逻辑电路
13+
- 了解怎么使用硬件编程语言将实现组合逻辑电路、同步时序逻辑电路
14+
- 针对数电考试,我们只需要再学会使用卡诺图进行最简与或表达式的化简,类似于小学时的“看谁算的又快又对”
15+
16+
除此之外,一旦课程讲到什么三极管的特性,讲到什么 CMOS 管的特点,如果你并不对这些感兴趣,那你大可以去思忖自己的午饭,这可能比搞懂三级管的四种工作模式对提升幸福感有帮助的多。我们接下来逐点对上述进行介绍。
17+
18+
- 组合逻辑电路与时序逻辑电路部件:上课会讲这些部件的设计方法,了解基本 idea 即可,没必要 get your hands dirty 然后去实际把电路图什么的抄下来,考试只会考怎么把这些部件组合起来实现功能
19+
- 波形图:也是只有理解难度的项目,但是是时序逻辑的基本
20+
- 硬件编程语言:推荐在《数字逻辑实验》课程中即使用 Verilog 或者 SystemVerilog 进行编写,<s>别再抄那破 VHDL 代码了</s>,这里推荐 [这篇文档](https://lab.cs.tsinghua.edu.cn/digital-design/doc/) 的“通过例子学硬件描述语言”部分
21+
22+
23+

mkdocs.yml

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -168,6 +168,9 @@ nav:
168168
- backend/index.md
169169
- ExpressJS: backend/expressjs/express-js.md
170170
- Go: backend/go/go.md
171+
- 硬件设计:
172+
- hardware/index.md
173+
- 计算机组成与设计: hardware/cod.md
171174
- 人工智能 & 机器学习:
172175
- ai-ml/index.md
173176
- PyTorch 入门: ai-ml/pytorch.md

0 commit comments

Comments
 (0)