Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
94 changes: 47 additions & 47 deletions zh/basic/SoCComputerSystem.md

Large diffs are not rendered by default.

47 changes: 47 additions & 0 deletions zh/preliminary/CompletePA1.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
---
sidebar_position: 6
---
# 完成PA1

南京大学"计算机系统基础"课程实验PA是国内首个也是目前唯一一个模拟器教学实验.
我们将PA引入到"一生一芯"中, 主要有以下考虑:
* PA承担了系统能力培养的绝大部分任务:
从硬件模拟器, ISA, 运行时环境, 到自制OS, 库函数, 应用程序,
可以让你深刻认识到程序如何在计算机上运行的每一处细节
* 如果你选择直接在RTL实现的处理器上构建系统软件, 你首先需要保证你的处理器是对的:
如果你的流水线在某个极端场景下和总线交互有问题, 你的自制OS和复杂应用程序(例如仙剑)都跑不起来.
相对地, 正确实现一个模拟器, 比正确实现RTL要容易得多
* 模拟器是处理器测试验证的一个重要组件:
我们希望大家可以理解模拟器中的每一处细节, 需要的时候可以自行对它进行定制,
而不是把它当作一个和自己没有关系的外部工具


:::info["计算机系统基础"理论课课程资源]
在完成PA的过程中, 如果你需要补充一些理论课的知识,
可以参考袁春风老师在中国大学MOOC上开设的课程: [上][mooc1], [中][mooc2], [下][mooc3]
:::
[mooc1]: https://www.icourse163.org/course/NJU-1001625001
[mooc2]: https://www.icourse163.org/course/NJU-1001964032
[mooc3]: https://www.icourse163.org/course/NJU-1002532004

:::warning[阅读PA讲义中的FAQ(常见问题)]
在做PA之前, 我们强烈建议大家阅读PA讲义中的FAQ, 从而对PA有更多的了解.
:::

<!-- [PA讲义中的FAQ][PA FAQ]
[PA FAQ]: ../../ics-pa/FAQ.html -->

:::warning[完成PA1]
根据PA讲义完成相关内容(ISA选择默认的`riscv32`), 包括如下内容:
* [基础设施:简易调试器][gdb]
* [表达式求值][expr]
* [监视点][watchpoint]
* 完成PA1的必答题
直到你看到如下提示框:
#### flag::温馨提示
PA1到此结束...
:::
<!-- https://github.com/oscc-web/ysyx-docs-content/issues/32 -->
<!-- [gdb]: ../../ics-pa/1.4.md
[expr]: ../../ics-pa/1.5.html
[watchpoint]: ../../ics-pa/1.6.html -->
144 changes: 144 additions & 0 deletions zh/preliminary/DigitalCircuitBasicExperiment.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,144 @@
---
sidebar_position: 5
---
# 数字电路基础实验


数字电路是"一生一芯"的前导课程, 我们列出了一些需要大家掌握的知识点,
大家不仅需要知道它们的概念, 还需要学会使用硬件描述语言来实现其中的电路模块.
* 信息的二进制编码
* 组合逻辑设计: 多路选择器, 译码器, 优先编码器, 加法器, 比较器
* 时序逻辑设计: 时钟, D触发器, 计数器, SRAM和DRAM, 有限状态机, 时序分析

:::info[数字电路学习资料]
* [数字电路与计算机体系结构][book] 1-5章节
* [Verilog在线学习网站][hdlbits],推荐边看书边练手
* [中科大的Verilog OJ平台][ustc verilog oj](需要注册并登录),推荐边看书边练手
* Verilog高级数字系统设计技术与案例分析
:::
[book]: https://pages.hmc.edu/harris/ddca/ddcarv.html

:::info[Chisel学习资料]
建议按照如下顺序学习:
1. [Chisel Bootcamp][bootcamp]是一个很不错的chisel教程, 还支持在线运行chisel代码,
你可以一边编写chisel代码一边学习. 其中
* 第1章是scala入门
* 第2章是chisel基础
* 第3章是scala高级特性和chisel的混合使用
* 第4章是FIRRTL后端相关内容
你需要完成前两章的学习, 同时我们强烈建议你学习第3章.
第4章和本课程没有直接关系, 可以作为课外阅读材料.
1. [Chisel Users Guide][users guide]比较系统地整理了chisel的特性, 也是不错的入门教程.
1. [Chisel小抄][cheatsheet]简明地列出了chisel语言的大部分用法.
1. [Digital Design with Chisel][chisel textbook]是一本结合数字逻辑设计和Chisel的参考书.
1. [Chisel API][api]详细地列出了chisel库的所有API供参考.

然后尝试使用Chisel来完成上述数字电路实验,
你只需要把编译出的verilog代码接入verilator和NVBoard就可以了.

欢迎加入Chisel交流群(微信扫描下方二维码联系助教进群)
![Wang Rui](./wangrui.jpg)
:::
[bootcamp]: https://mybinder.org/v2/gh/freechipsproject/chisel-bootcamp/master
[users guide]: https://www.chisel-lang.org/docs
[cheatsheet]: https://github.com/freechipsproject/chisel-cheatsheet/releases/latest/download/chisel_cheatsheet.pdf
[chisel textbook]: http://www.imm.dtu.dk/~masca/chisel-book.html
[api]: https://www.chisel-lang.org/api/latest/

:::info[verilog学习资料]
我们需要培养的是硬件思维,需要头脑中先有电路再下手写代码,verilog的本质是硬件描述语言而不是硬件设计语言,大家可以看[verilog入门视频][verilog1]和[语法简介][verilog2]进行入门.
:::
[verilog1]: https://www.bilibili.com/video/BV1PS4y1s7XW
[verilog2]: https://vlab.ustc.edu.cn/guide/doc_verilog.html



:::info[vscode自动跳转插件]
* 如果选择chisel编程,推荐metals插件
* 如果选择verilog编程,推荐[digital ide](https://digital-eda.github.io/DIDE-doc-Cn/#/?id=digital-ide-version-030)插件
:::
[hdlbits]: https://hdlbits.01xz.net/wiki/Main_Page
[ustc verilog oj]: https://verilogoj.ustc.edu.cn/oj/

:::warning[借助NVBoard完成数字电路实验]
我们首先推荐南京大学的[数字电路与计算机组成实验][dlco].

南京大学开展教学改革, 将"数字电路"与"计算机组成原理"两门课程进行融合,
其实验内容贯穿从数字电路基础到简单的处理器设计,
最近尝试加入程序运行时环境的相关内容, 与"一生一芯"的主线内容非常契合.

<!-- > 你需要完成"CPU数据通路"之前的大部分实验内容, 除了以下例外
> * "在线测试"的内容需要加入相关课程才能完成, 目前可以忽略
> * 计数器和时钟: 由于仿真环境下无法提供精确的时钟,
> 时钟部分的实验难以准确进行, 因此可作为阅读材料进行了解
> * 寄存器组及存储器: 讲义中建议通过工具相关的IP核实现存储器,
> 但仿真环境下不存在这样的IP核, 无法开展实验, 因此可作为阅读材料进行了解
> * VGA接口控制器实现:对于初学verilog的同学来说项目内容偏多,如果学有余力可以做完
> * 关于"CPU数据通路"及其后续内容, "一生一芯"将会有所改动, 因此在预学习阶段无需完成 -->
以下部分是**必做题**:
* 实验一 选择器
* 实验二 译码器和编码器
* 实验三 加法器与ALU
* 实验六 移位寄存器及桶形移位器
* 实验七 状态机及键盘输入

其他内容作为了解可以选做,在预学习部分不作规定。 有了NVBoard之后, 你就可以把它当作FPGA来使用, 用它来实现需要FPGA支持的实验内容.
:::

[dlco]: https://nju-projectn.github.io/dlco-lecture-note/index.html

:::warning[评估电路综合后的时序]
我们提供了一个基于开源EDA的综合后时序评估项目.
这个项目通过[开源RTL综合器yosys][yosys]对RTL设计进行综合, 并映射到一个45nm的[开源工艺库nangate45][nangate45],
然后将综合得到的网表文件和工艺库中的标准单元信息文件输入到[开源静态时序分析工具iSTA][ista]中,
iSTA将快速评估RTL设计中的时序路径, 并给出时序余量最少的若干条路径, 供RTL设计者参考,
关于报告如何阅读, 可以参考[这个教程][ista-tutorial].
通过上述方式, RTL设计者可快速得知RTL设计的时序情况, 并对RTL设计进行快速迭代.

你可以通过以下命令克隆该项目, 具体操作方式请阅读项目中的README.
```bash
git clone [email protected]:OSCPU/yosys-sta.git
```

尝试用上述项目评估你的数字电路实验.
:::
:::danger[评估过程中遇到问题]
如果在运行时遇到bug,可到`yosys-sta`仓库的Issue中报告问题,并提供如下信息:
* 相应的RTL设计
* sdc文件
* yosys生成的网表文件
* iEDA的版本号, 可通过命令`echo exit | ./bin/iEDA -v`获取
:::
[yosys]: https://yosyshq.net/yosys
[nangate45]: https://mflowgen.readthedocs.io/en/latest/stdlib-freepdk45.html
[ista]: https://github.com/OSCC-Project/iEDA/tree/master/src/operation/iSTA
[ista-tutorial]: https://ieda.oscc.cc/tools/ieda-tools/ista.html

:::info[开源EDA工具的局限性]
当然, 上面的评估项目也不是完美的, 至少从目前来说有以下缺陷:
* 开源综合器yosys的综合质量不高, 根据开源EDA团队的评估工作,
对于某RTL设计, yosys综合出的标准单元面积是商业综合器的1.8倍,
商业综合器综合出的电路频率是153.8MHz, 而yosys综合出的电路频率只有52MHz
* nangate45是一个面向学术研究的工艺库, 其中标准单元的数量和质量也与商业工艺库有一定差距
* nangate45不能用于流片, 没有工厂将其用于产线中

不过, 在综合后时序评估这一场景中, 上述缺陷不会造成明显的影响:
即使yosys的综合质量不高, 我们也可以通过综合结果的相对提升, 来指导RTL优化的方向.
:::
<!-- -->
:::info[所以学习"一生一芯"还需要FPGA吗?]
基本上不需要了:
* 从准确度来说, yosys的综合流程是面向ASIC设计的, 相比于FPGA流程, 其原理和报告的准确度都更适合"一生一芯".
* 从时间来说, FPGA的主要作用是仿真加速, 也就是说, 如果仿真任务并不需要花费很长时间来完成, 使用FPGA的优势并不明显.
事实上, 从仿真流程来看, 当以下不等式成立时, FPGA的优势才能体现出来:
```
FPGA_syn_time + FPGA_impl_time + FPGA_run_time < verilator_compile_time + verilator_run_time
```
`FPGA_syn_time + FPGA_impl_time`通常达到小时量级, 而`verilator_compile_time`通常能在数分钟内完成,
因此, 只有当`verilator_run_time`达到小时量级, 上述不等式才有可能成立.
不过在"一生一芯"的学习中, 你很难遇到需要小时量级的时间才能完成的仿真任务.
而当你遇到这样的任务时, 我们也会对FPGA的评估过程提出更高的要求.
我们会在后续讲义中继续讨论这个问题.
* 从调试难度来说, FPGA的调试手段很有限, 只能在时间和空间均受限的条件下抓取底层的波形信息;
相反, 软件仿真则灵活很多, 我们可以借助很多软件方法来从多方面提升调试的效率.
:::
39 changes: 19 additions & 20 deletions zh/preliminary/HowToAskSmartQuestion.md
Original file line number Diff line number Diff line change
Expand Up @@ -5,26 +5,24 @@ sidebar_position: 1

[ysyx-forum]: https://ysyx.oscc.cc/forum/

:::tip[填写通识问卷]
:::warning[填写通识问卷]
在开始预学习的第一个任务之前,请大家认真阅读官网[《报名参与》](https://ysyx.oscc.cc/signup/)和[《常见问题》](https://ysyx.oscc.cc/project/faq.html)两部分内容,并填写[《“一生一芯”通识问卷》](https://www.wenjuan.pub/s/UZBZJv6ci37/#)。**注意:通识问卷可以重做很多次,只有达到100分才能申请入学答辩。**
:::

:::tip[阅读"提问的智慧"和"别像弱智一样提问", 编写读后感]
:::warning[阅读"提问的智慧"和"别像弱智一样提问", 编写读后感]
你在预学习中的第一个任务, 就是现在仔细阅读[提问的智慧][how to ask]和[别像弱智一样提问][stop ask]这两篇文章,
结合自己过去提问和被提问的经历,
写一篇不少于800字的读后感, 谈谈你对"好的提问"以及"通过STFW和RTFM独立解决问题"的看法.
>

我们设置这道题并不是为了故意浪费大家的时间, 也不是为了禁止大家提出任何问题,
而是为了让大家知道"什么是正确的". 当你愿意为这些"正确的做法"去努力,
并且尝试用专业的方式提出问题的时候, 你就已经迈出了成为"成为专业人士"的第一步.
:::

[how to ask]: https://github.com/ryanhanwu/How-To-Ask-Questions-The-Smart-Way/blob/master/README-zh_CN.md
[stop ask]: https://github.com/tangx/Stop-Ask-Questions-The-Stupid-Ways/blob/master/README.md

:::tip[大佬三连: STFW, RTFM, RTFSC]
:::warning[大佬三连: STFW, RTFM, RTFSC]
尝试在上述文章中寻找并理解这三个缩写的含义.
>

你可能会觉得字母F冒犯了你, 但事实上这个字母的含义从来都不是重点,
它只是反映出这三个缩写背后的传奇色彩而更容易被大家记住而已.
例如, RTFSC起源于Linux之父Linus Torvalds在1991年4月1日回复邮件中的第一句话,
Expand All @@ -35,18 +33,19 @@ sidebar_position: 1
:::
[minix]: https://cacm.acm.org/magazines/2016/3/198874-lessons-learned-from-30-years-of-minix/fulltext

:::warning[与其说是学会提问, 倒不如说是学会不提问]
<!-- -->
:::danger[与其说是学会提问, 倒不如说是学会不提问]
很多同学不多不少都会抱有这样的观点:
我向大佬请教, 大佬告诉我答案, 我就学习了.
>

但你是否想过, 将来你进入公司, 你的领导让你尝试一个技术方案;
或者是将来你进入学校的课题组, 你的导师让你探索一个新课题.
你可能会觉得: 到时候身边肯定有厉害的同事, 或者有师兄师姐来带我.
但实际情况是, 同事也要完成他的KPI, 师兄师姐也要做他们自己的课题,
没有人愿意被你一天到晚追着询问, 总有一天没有大佬告诉你答案, 你将要如何完成任务?
>

如果你觉得自己搞不定, 你很可能缺少<Highlight color="#c40e0e">独立解决问题的能力</Highlight>.
>

但幸运的是, 这种能力是可以训练出来的.
你身边的大佬之所以成为了大佬, 是因为他们比你更早地锻炼出独立解决问题的能力:
当你还在向他们请教一个很傻的问题的时候, 他们早就解决过无数个奇葩问题了.
Expand All @@ -57,7 +56,7 @@ sidebar_position: 1
(当然一些由于框架代码缺陷导致的问题除外).
:::
<!-- -->
:::warning[我是一个很享受帮助别人的大佬]
:::danger[我是一个很享受帮助别人的大佬]
以南京大学令人闻风丧胆的PA实验为例, 我们见过太多这样的情况了:
每年学期开始的时候, 总有那么几位上一届的热心师兄在群里无微不至地解答新手同学的各种提问,
这些新手同学也确实在残酷的PA训练中感受到热心师兄为他们遮风挡雨的温暖.
Expand All @@ -70,21 +69,21 @@ sidebar_position: 1
也许是他们突然觉得自己给新手同学提供的帮助其实帮不了他们.
但不管怎样, 那些新手同学已经无法独立完成PA的训练了,
因为他们将会面对比学期开始更困难的问题.
>

所以, 我们并不否认你在帮助同学的时候给你带来的成就感,
但我们认为, 有很多更严肃的问题需要思考:
一个同学来提问, 如果说这个问题只是表象的话, 你能摸索出更本质的问题吗?
>

当一个同学不来询问你就无法解决问题的时候, 你之前所做的真的是在帮助他吗?
>

更重要地, 你能为这些同学的将来负责吗?
>

如果要问"你希望这位同学成长为什么样子", 我想大家的目标都是一致的:
希望他将来能成为可以独当一面的专业人士.
但同时你也需要认识到学习的规律: <Highlight color="#c40e0e">这是需要长期接受专业训练的</Highlight>.
但同时你也需要认识到学习的规律: <Highlight color="#c40e0e">这是需要长期接受专业训练的</Highlight>
如果你仅仅把问题的答案告诉他, 他就可以成为专业人士,
那该如何对得起长年累月奋斗在一线的广大资深工程师们流下的汗水?
>

因此, <Highlight color="#c40e0e">你每一次直接把答案告诉他,
直接帮他们解决问题, 都是在剥夺他接受专业训练的机会.</Highlight>
相反, 如果你真的希望能帮助他, 你可以尝试在不影响他训练的情况下指出他缺少的观念和技能,
Expand All @@ -93,8 +92,8 @@ sidebar_position: 1
这对你和他来说都不容易, 但学习本身就是一件需要付出的事情:
如果你让他很方便地获得问题的答案, 那他就不能从解决这个问题的过程中收获应有的训练.
:::

:::info[提问渠道]
:::info[提问渠道
<!-- > * [一生一芯官方论坛][ysyx-forum] -->]
* 群里沟通(推荐),比较积极的同学有希望发展为助教
* 私聊助教(助教也有其他工作任务可能无法及时回复)
:::
Loading