设计草稿
组成部分
- PC:指令计数器
- NPC:下一条指令运算模块
- IM:指令寄存器 大小为4096*32bit
- Spliter: 分割指令
- DM:数据存储器 大小为3072*32bit
- ALU:运算器
- GRF:寄存器
- MUX:数据选择器文件
- 命名为[部件名(upper)端口名(lower)m]
- extender: 扩展
- Controler: 输入ins,op,输出信号
- datapath:数据通路
- 实例化PC、NPC、IM、DM、ALU、GRF、MUX
- 输入controler信号,连接到对应的mux上
- 连接mux和数据通路
- 输出ins、op
- mips:实例化datapath、controler,连接ins、op到controler,连接controler输出信号到datapath
Controler信号-表格分析法
指令数据通路分析
指令 |
NPC_old |
NPC_off |
PC_in |
DM_a |
DM_d |
DM_we |
ALU_a |
ALU_b |
ALU_op |
nop |
~ |
~ |
~ |
/ |
/ |
/ |
/ |
/ |
/ |
add |
PC_o |
0 |
NPC_o |
/ |
/ |
0 |
GRF_o1 |
GRF_o2 |
000 |
sub |
~ |
~ |
~ |
/ |
/ |
0 |
~ |
~ |
001 |
ori |
~ |
~ |
~ |
/ |
/ |
0 |
~ |
EXT_o |
010 |
lw |
~ |
~ |
~ |
ALU_o |
/ |
0 |
~ |
~ |
000 |
sw |
~ |
~ |
~ |
~ |
GRF_o2 |
1 |
~ |
~ |
000 |
beq |
~ |
beqmux[ALU_0]{0,EXT_o} |
~ |
/ |
/ |
0 |
GRF_o1 |
GRF_o2 |
011 |
lui |
~ |
0 |
~ |
/ |
/ |
0 |
/ |
/ |
/ |
jal |
~ |
0 |
PC[31..28],EXT_o |
/ |
/ |
0 |
/ |
/ |
/ |
jr |
~ |
0 |
GRF_o1 |
/ |
/ |
0 |
/ |
/ |
/ |
|
|
|
|
|
|
|
|
|
|
指令 |
OP |
FUNC |
GRF_a1 |
GRF_a2 |
GRF_a3 |
GRF_d |
GRF_we |
EXT_op |
EXT_in |
nop |
0 |
/ |
/ |
|
/ |
/ 3 |
/ |
/ 3 |
/ |
add |
000000 |
100000 |
rs |
rt |
rd |
ALU_o |
1 |
/ |
/ |
sub |
000000 |
100010 |
~ |
~ |
~ |
~ |
1 |
/ |
/ |
ori |
001101 |
/ |
rs |
/ |
rt |
~ |
1 |
0 |
imm |
lw |
100011 |
/ |
rs |
/ |
rt |
DM_o |
1 |
1 |
imm |
sw |
101011 |
/ |
rs |
rt |
/ |
/ |
0 |
1 |
imm |
beq |
000100 |
/ |
rs |
rt |
/ |
/ |
0 |
2 |
imm |
lui |
001111 |
/ |
/ |
/ |
rt |
EXT_o |
1 |
3 |
imm |
jal |
000011 |
/ |
/ |
/ |
31 |
NPC_o |
1 |
4 |
add |
jr |
0 |
001000 |
rs |
/ |
/ |
/ |
0 |
/ |
/ |
|
|
|
|
|
|
|
|
|
|
ext功能
EXT_op[3:0] |
ope |
0 |
imm->zero_32 |
1 |
imm->sign_32 |
2 |
imm->(sign_31)«2 |
3 |
imm->{in,16{0}} |
4 |
add->{in,2{0}} |
|
|
mux
BEQm(EXT_o)
NPCoffm
PCinm(NPC_o,PC_o,EXT_o,GRF_o1)
00 |
01 |
10 |
NPC_o |
PC[31..28],EXT_o |
GRF_o1 |
DMam(ALU_O)
DMdm(GRF_o2)
ALUam(GRF_o1,GRF_o2)
ALUbm(GRF_o2,EXT_o,GRF_o1)
0 |
1 |
2 |
GRF_o2 |
EXT_o |
GRF_o1 |
GRFa1m(rs)
GRFa2m(rt)
GRFa3m(rd,rt,31)
GRFdm(ALU_o,DM_o,EXT_o,NPC_o)
0 |
1 |
2 |
3 |
ALU_o |
DM_o |
EXT_o |
NPC_o |
|
|
|
|
测试设计
与P3一致。
由于实际上P4的结构非常简单,上述设计文档完整的描述了所有接线,故很难出错。
思考题
-
阅读下面给出的 DM 的输入示例中(示例 DM 容量为 4KB,即 32bit × 1024字),根据你的理解回答,这个 addr 信号又是从哪里来的?地址信号 addr 位数为什么是 [11:2] 而不是 [9:0]
在sw、lw中,addr来源于alu对寄存器值和偏移量求和的结果,故来源于alu。因为mips的访存是按字节编址,而lw和sw的地址要与4对齐,故取前10位。
-
思考上述两种控制器设计的译码方式,给出代码示例,并尝试对比各方式的优劣。
第一种
1
2
3
4
5
6
|
if(ins == xxx)begin
sig1 = xxx;
end else if (ins==xxx2)begin
sig2 = xxx;
end
...
|
> 第二种
1
2
3
4
|
sig1 = ((ins == xxx1)
||(ins == xxx2)
||xxxxx)?1:0
...
|
> 第一种添加指令方便,但是代码长。第二种代码短,综合快,但是容易导致逻辑混乱,不够明确。
-
在相应的部件中,复位信号的设计都是同步复位,这与 P3 中的设计要求不同。请对比同步复位与异步复位这两种方式的 reset 信号与 clk 信号优先级的关系。
同步:clk优先
异步:reset优先
-
C 语言是一种弱类型程序设计语言。C 语言中不对计算结果溢出进行处理,这意味着 C 语言要求程序员必须很清楚计算结果是否会导致溢出。因此,如果仅仅支持 C 语言,MIPS 指令的所有计算指令均可以忽略溢出。 请说明为什么在忽略溢出的前提下,addi 与 addiu 是等价的,add 与 addu 是等价的。提示:阅读《MIPS32® Architecture For Programmers Volume II: The MIPS32® Instruction Set》中相关指令的 Operation 部分。
如果忽略溢出,既不需要判断是否溢出,那么addi和addiu都只需要将计算结果保存即可,不需要触发相关异常,所以他们是等价的。