计组笔记

第一章

八大伟大思想:
面向摩尔定律的设计
使用抽象简化设计
加速大概率事件
通过并行提高性能
通过流水线提高性能
通过预测提高性能
存储器层次
通过冗余提高可靠性
一些术语:
CPI
时钟频率
时钟周期数
指令数
加速比:原执行时间/改进后执行时间

功耗墙
CMOS的功耗组成
总功耗 = 动态功耗+静态功耗

动态功耗= 短路功耗(导通功耗) + 开关功耗

短路功耗:PMOS和NMOS同时导通所消耗的瞬态功耗,CMOS电路在‘0’和‘1’的转换过程中,P、N管会同时导通,产生一个由Vdd到Vss窄脉冲电流,由此引起功耗。

开关功耗:电路在开关过程中对输出节点的负载电容充放电所消耗的功耗。有两种写法:p = 1/2CLVDDVDDTr(Tr是输入信号翻转率)和P = CLVDDVDD*f(f时钟频率,一个周期反转两次)。

静态功耗:P = Is * Vdd。
Is:漏电流。Vdd:工作电压。

在CMOS电路中,静态功耗是漏电流引起的功耗。随着工艺先进,晶体管阈值电压降低,漏电流增大,静态功耗增大。
Cmos漏电流主要有:反偏PN结电流和MOS管的亚阈值电流。

第二章

本章前言
risc-v采用字节寻码,意味着它所给出的地址均为字节数
该汇编语言使用“//”注释方式(只能单行注释)
(just in time)即时编译器。(英文更好理解)
几个寄存器的作用

1
2
3
4
5
6
7
8
9
10
x0: the constant value 0
x1: return address
x2: stack pointer
x3: global pointer
x4: thread pointer
x5 – x7, x28 – x31: temporaries
x8: frame pointer
x9, x18 – x27: saved registers
x10 – x11: function arguments/results
x12 – x17: function arguments

常用指令
如以下指令:

load
数据传输指令,负责在内存和寄存器之间传输数据。
基本格式为:
ld x9, 8(x22)
x22称之为基址寄存器,8则是偏移量(貌似单位为双字-8字节,书中p49这里的8指的是数组元素的序号,在书中后面会指出这里应该是64,应以字节数作为单位)

store
数据传输指令,负责在内存和寄存器之间传输数据。
基本格式为:
sd x9, 96(x22)
这里是指将x9寄存器中的数据存储到内存中地址为96(x22)的格子中。

sll,slli,srl,srli,sra,srai
左移指令sll;
左移逻辑立即数slli;
右移指令srl;
右移逻辑立即数srli;
算术右移sra,srai;与其上不同的是,它不会用零填充空出来的位,而是用符号位来填充。
参照格式:
slli x11,x19,4 //reg x11 = reg x19 << 4bits;

and or xor
指令格式参照:
and x9, x10, x11

ps:通常用异或111…111的方式实行取反操作
掩码:掩码是一串二进制代码对目标字段进行位与运算,屏蔽当前的输入位所引申出的术语。

beq bne blt bge bltu bgeu
分支指令
beq:相等则分支
bne:不等则分支

b:branch
e与eq:equal
l:less
g:greater
u:unsign

基本块:由分支指令所划分的区域。

jal jalr
跳转-链接指令
jal x1, ProcedureAddress //jump to ProcedureAddress and write return address to x1
jalr x0,0(x1) //处理case语句时的举例,此时调用者将参数值放入x10~x17中,并使用jal x1,X跳转到过程X。(其实我没看懂它想说什么)
jal x0,Label //实现无条件跳转

lbu sb lhu sh lwu lw sw
lbu x12, 0(x10) //取字节
sb x12, 0(x11) //将寄存器最右8位写入内存
lhu //取半字
sh //存半字
lwu //取无符号字,用0填充最左边的32位
lw //取字,用第31位的值填充最左边的32位(这里因该是从第0位开始计数),即符号扩展
sw //存储字

字符存储模式(三种选择,用于解决从哪到哪是字符串的问题):

字符串的第一个位置用作给出字符串的长度 (Java采用这种)
附带带有字符串长度(如在结构体中)的变量
字符串的最后位置用一个字符标记字符串结尾 (c采用这种)
关于指令如何实现函数、嵌套等过程
sp,栈指针,寄存器x2。
在函数实现过程中关于要不要保存和恢复寄存器旧值的问题,衍生出对寄存器用途的划分。如下:
x5 – x7, x28 – x31: temporaries
x9, x18 – x27: saved registers

叶子过程(leaf):不调用其他过程的过程 (p78感想:对于叶过程,我们可以大胆将动态变量分配给临时寄存器。不保对)
过程帧或活动记录:栈中包含所保存的寄存器和局部变量的段

细碎知识点
大端编址:
数据的高位放在低地址空间,数据的低位放在高地址空间(反的)
就例如存放二进制数1011-0100-1111-0110-1000-1100-0001-0101
前8位地址编号为0,下8位为1,下下8位为2,以此类推。
小端编址:
数据的高位放在高地址空间,数据的低位放在低地址空间(正的)
就例如存放二进制数1011-0100-1111-0110-1000-1100-0001-0101
后8位地址编号为0,后8位的前8位为1,后8位的前前8位为2,以此类推。
归根到底,大端编址与小端编址的设定是为了明确如何读出该存储位置所代表的数值。一旦我们所使用的数据超过了8位,我们就得考虑是地址大所代表的数字处在数据的前头,还是地址小所代表的数字处在数据的前头。大端编址与小端编址即是明确这一点。risc-v所采用的为小端编址。

对齐限制:risc-v无

符号扩展:如何处理类似于将32位数码扩展为64位数码的问题。对于使用补码的计算机而言,多出来的位用符号位填充即可。
这里涉及到了risc-v的两种字节载入方式,一种是无符号字节载入(lbu指令)将字节视作是无符号数,因而在扩展时是用0扩展。
另一种是字节载入(lb)使用带符号整数,在扩展时采用符号扩展。

指令表示方法
risc-v中所有指令的长度相同,对于不同用途的指令划分出不同的指令格式。一般而言,这些格式有R型(用于寄存器),I型(用于带一个常数的算术指令以及加载指令)
,S型(参考sd指令)