北航计组P4

设计草稿

组成部分

  • PC:指令计数器
  • NPC:下一条指令运算模块
  • IM:指令寄存器 大小为4096*32bit
  • Spliter: 分割指令
  • DM:数据存储器 大小为3072*32bit
    • 按4096处理
  • 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)

0 1
31’b0 EXT_o

NPCoffm

0 1
0 beqmux_o

PCinm(NPC_o,PC_o,EXT_o,GRF_o1)

00 01 10
NPC_o PC[31..28],EXT_o GRF_o1

DMam(ALU_O)

0
ALU_o

DMdm(GRF_o2)

0
GRF_o2

ALUam(GRF_o1,GRF_o2)

0 1
GRF_o1 GRF_o2

ALUbm(GRF_o2,EXT_o,GRF_o1)

0 1 2
GRF_o2 EXT_o GRF_o1

GRFa1m(rs)

0
rs

GRFa2m(rt)

0
rt

GRFa3m(rd,rt,31)

0 1 2
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的结构非常简单,上述设计文档完整的描述了所有接线,故很难出错。

思考题

  1. 阅读下面给出的 DM 的输入示例中(示例 DM 容量为 4KB,即 32bit × 1024字),根据你的理解回答,这个 addr 信号又是从哪里来的?地址信号 addr 位数为什么是 [11:2] 而不是 [9:0]

    在sw、lw中,addr来源于alu对寄存器值和偏移量求和的结果,故来源于alu。因为mips的访存是按字节编址,而lw和sw的地址要与4对齐,故取前10位。

  2. 思考上述两种控制器设计的译码方式,给出代码示例,并尝试对比各方式的优劣。

    第一种

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
...
> 第一种添加指令方便,但是代码长。第二种代码短,综合快,但是容易导致逻辑混乱,不够明确。
  1. 在相应的部件中,复位信号的设计都是同步复位,这与 P3 中的设计要求不同。请对比同步复位与异步复位这两种方式的 reset 信号与 clk 信号优先级的关系。

    同步:clk优先 异步:reset优先

  2. C 语言是一种弱类型程序设计语言。C 语言中不对计算结果溢出进行处理,这意味着 C 语言要求程序员必须很清楚计算结果是否会导致溢出。因此,如果仅仅支持 C 语言,MIPS 指令的所有计算指令均可以忽略溢出。 请说明为什么在忽略溢出的前提下,addi 与 addiu 是等价的,add 与 addu 是等价的。提示:阅读《MIPS32® Architecture For Programmers Volume II: The MIPS32® Instruction Set》中相关指令的 Operation 部分。

    如果忽略溢出,既不需要判断是否溢出,那么addi和addiu都只需要将计算结果保存即可,不需要触发相关异常,所以他们是等价的。

Licensed under CC BY-NC-SA 4.0
京ICP备2021032224号-1
Built with Hugo
主题 StackJimmy 设计
vi ./themes/hugo-theme-learn/layouts/partials/footer.html