gdb
很好用.
厦门回忆
国庆去了厦门。主要在思明区转了一圈,去看了双子塔、沙坡尾、中山街,在演武大桥观景台吹吹海风,坐船到海上游了一圈,在厦门大学门口溜达了一下,山海步道去上去看看风景。。。
为什么没有去鼓浪屿,因为鼓浪屿票买不到。
于我而言,厦门是一个新旧夹杂的城市。双子塔宏伟矗立,演武大桥曲折蜿蜒,然而在这些胜景的脚下,却散落着老旧的城区,环带着拥挤的街道
计算机组成设计
本文作为计组的学习记录。
绪论:#
之前学习的 数字逻辑设计 课程,简单介绍了计算机组成相关部件的设计,比如组合电路设计,时序电路设计。这些模块都很简单,比如加法器,选择器,编码器,解码器。而计算机组成这门课,就要利用这些简单的模块,设计计算机中更加复杂的元件,比如处理器,处理系统等等。最重要的是设计简单的 RISC(精简指令集)**-CPU核**。涉及到ALU、单周期流水线CPU和简单的系统。
之后我们还会学到另外一门课 计算机体系结构,那里我们会学到有关处理器的更高级的技术(比如如何优化性能)。
实验一般很难在课上做完。
教材内容:#
第一章 引言:#
这一章内容介绍什么是计算机,以及计算机中相关的内容。
计算机在二十世纪中叶开始迅速发展,从非电子,到电子管、晶体管、集成电路、大规模集成微处理器的出现,都引起了计算机发展的一个高潮。
- 早期计数方式很原始;
- 后来帕斯卡发明了机械式计数器;
- 再后来,图灵提出了图灵机模型,指出计算的过程和算法可以公式化表示;
- 第一台电子计算设备;
- 第一台计算机ENIAC(通用指令集、十进制,可编程、图灵完全);
- 冯诺依曼(计算与存储分离->编程的产生)(现在还有存算一体,因为计算性能很高,但是访存太费劲)(数据和指令放在一个存储器);
- 晶体管代替电子管,减小体积,速度加快。以前靠卡片进行编程,这段时间就出现了汇编。
- 集成电路代替晶体管,出现操作系统-时分复用。
- 微处理器替代集成电路;
- 便携电脑与平板电脑的原型设计;首台现代个人电脑。
- 1982年个人电脑开始兴起,IBM PC,内含inter芯片和微软DOS系统;1984年乔布斯发明了MACOS(with GUI),之前的操作系统是没有GUI的。
- RISC(精简指令集计算机)/CISC(复杂指令集计算机);前者指令执行使用尽量少的时钟周期、指令编码长度定长等等,这些都是为了提高cpu性能的。
计算机发展受芯片的约束,关于芯片发展的规律有一个 摩尔定律:集成电路单位面积上可容纳的晶体管,约每两年会翻一番。
计算机的类别:
- 个人电脑:通用性,性价比较高;
- 服务器电脑:基于网络的,容量大,用作若干功能的代理,比如计算。
- 超级计算机:高精度/科学计算需求。
- 嵌入式计算机:作为系统中的一部分存在,比如电瓶车中驱动的芯片(两三块钱)。
- 个人移动设备:
- 云计算。
之后的计算机会是什么样子呢?
计算机组成:
- 硬件:
- cpu:
- controler:
- datapath:
- memory:
- i/o interface:
- cpu:
- 软件
- 系统软件:操作系统/编译器/驱动(专为某些硬件设计的软件);
- 应用软件:各类app;
下面是一个框架:
如何构建一个处理器:#
构建一个处理器,实际上就是将集成电路/芯片 进一步集成的过程。
单晶硅-晶圆-带有功能的晶圆(网格化)-去掉坏的得到 裸片-封装成为芯片-测试
早期的芯片设计就是用晶体管搭 积木;后面出现了hdl;芯片上的连线是需要设计的,这就是版图(layout)设计;然后使用掩膜板来成型。
第二章 指令#
指令 是一堆声明,让机器能够做什么。
指令的意义,就是将机器内部的实现隐藏起来,而对外界暴露出了固定的、可以实现无穷多种功能的接口。这种接口就是指令。
指令集就是一堆指令的集合;
指令结构就是 指令的结构,指令由哪些部分组成。
risc-v指令集的指令特点是:
- 每条指令只对应一个操作;
- 逻辑简单,指令形状规则
比如我们在高级语言中写下:f=(a+b)-(c+d)
,那么在底层实现上,就要使用计算部件对这些内容进行处理。
寄存器#
我们先来看看寄存器,这些寄存器是供各种数字计算需要而设计的。
简单而言:
- 0寄存器;
- 四个结构寄存器(返回指针、栈顶指针、全局变量指针、进程指针)
- 中间变量寄存器(5-7,28-31)
- 保留寄存器(函数调用前后保持不变的)(8-9,18-27)一共12个
- 传参寄存器(传入和传出)(10-17)一共八个
数从哪里来?存储器:#
为了获取数,我们需要加载/存储指令,这就是lw,sw等等指令的来源;由于risc-v指令集的位宽是64位,因而所有的指令都是按doubleword来讲的。
risc-v的存储有以下特性:
- 内存是以字节编码的,只能访问整字节数据,而不能是更小的位数。
- 小(低)端存储:低位放在低地址。大端反之,大端比较符合我们的读数习惯,小端比较符合我们的访存习惯
- 不要求字节对齐,但一般都要字节对齐。
- 有很多指令集都同时支持大小端。
接下来我们就来讲内存相关的指令。其实也就是ld/sd/lw/sw,其形式为:ld rs offset(base)/sd rd offset(base)
为常数而设计的指令:immediate#
例如偏移地址的计算。所谓 立即数以我的理解就是非存储形式的、直接使用的数,而不是放在寄存器或内存中。
位操作指令实现:#
I-format下的指令,因为移位操作最多移64位,从而imm可以压缩到6位,最后留下一部分func6供判断。
主要的指令有sll/srl/slli/srli/and/or/xor
,xor
可以实现not
的功能。
或者当移位的立即数就在寄存器中时,也有srl x5 x6 x7
流程控制:#
beq rs1 rs2 L
,若相等跳转到L,因而可能需要
指令编码:#
参照下面这个图:
最基本的指令结构就是r型指令;
I型指令既可以是addi也可以是ld指令,都涉及两个寄存器和一个立即数。这个立即数是2’complement,有符号数。
但store指令没有rd,因为要往存储器中存,从而将imm的rd改为imm的低五位。
第四章 处理器#
cpu组成:
- 控制单元:阀门,控制数据流向;
- 数据通路:河床,数据流的载体;
cache#
实验课:#
实验为我们准备了一个测试平台soc,我们可以写好自己的组件,然后放到这个平台上检测是否正常运行。