计组P4设计文档
P4建议:翻译P3设计即可,注意新加指令
设计要求
处理器为 32 位单周期处理器,不考虑延迟槽,应支持的指令集为:
add, sub, ori, lw, sw, beq, lui, jal, jr, nop
,其中:nop
为空指令,机器码0x00000000
,不进行任何有效行为(修改寄存器等)。add, sub
按无符号加减法处理(不考虑溢出)。
需要采用模块化和层次化设计。顶层文件为 mips.v,有效的驱动信号要求包括且仅包括同步复位信号 reset 和时钟信号 clk,接口定义如下:
1 |
|
模块规格
顶层设计
1 |
|
IFU(取指令单元)
内部包括 PC(程序计数器)、IM(指令存储器)及相关逻辑。
PC 用寄存器实现,应具有异步复位功能,复位值为起始地址。
起始地址:0x00003000。
地址范围:0x00003000 ~ 0x00006FFF。
IM 用 ROM 实现,容量为 4096 × 32bit。
IM 实际地址宽度仅为 12 位,需要使用恰当的方法将 PC 中储存的地址同 IM 联系起来。
PC(Moore型状态机)
变量 | 方向 | 位宽 | 解释 | 来源/去向 |
---|---|---|---|---|
clk | in | 1 | 时钟信号 | 顶层输入 |
rst | in | 1 | 同步复位信号 | 顶层输入 |
j_addr | in | 32 | 跳转指令地址 | pc、Instr |
addr | out | 32 | 下一条指令地址 | IM |
IM
reg [31:0] IM [0:4095]
变量 | 方向 | 位宽 | 解释 | 来源/去向 |
---|---|---|---|---|
addr | in | 32 | 指令地址 | j_addr |
Instr | out | 32 | 指令机器码 | 很多 |
GRF(通用寄存器组,也称为寄存器文件、寄存器堆)
用具有写使能的寄存器实现,寄存器总数为 32 个,应具有异步复位功能。
0 号寄存器的值始终保持为 0。其他寄存器初始值(复位后)均为 0,无需专门设置。
变量 | 方向 | 位宽 | 解释 | 来源/去向 |
---|---|---|---|---|
clk | in | 1 | 时钟信号 | 顶层输入 |
rst | in | 1 | 同步复位信号 | 顶层输入 |
WE | in | 1 | 写使能信号 | Control |
RegAddr | in | 5 | GRF 5 位写入地址 | rd/rt/$ra |
WD | in | 32 | GRF 32 位写入数据 | ALU/DM/im_of/pc |
A1 | in | 5 | 读出数据的寄存器编号 | rs_base |
A2 | in | 5 | 读出数据的寄存器编号 | rt |
RD | out | 32 | GRF 32 位读出数据 | ALU |
RD2 | out | 32 | GRF 32 位读出数据 | ALU |
ALU(算术逻辑单元)
?比较按无符号还是有符号?
提供 32 位加、减、或运算及大小比较功能。
加减法按无符号处理(不考虑溢出)。
变量 | 方向 | 位宽 | 解释 | 来源/去向 |
---|---|---|---|---|
op | in | 2 | 功能选择 | Control |
a | in | 32 | 操作数1 | RD1 |
b | in | 32 | 操作数2 | RD2/im_of |
out | out | 32 | 结果 | WD/MemAddr/con |
DM(数据存储器)
使用 RAM 实现,容量为 3072 × 32bit,应具有异步复位功能,复位值为 0x00000000。
起始地址:0x00000000。
地址范围:0x00000000 ~ 0x00002FFF。
RAM 应使用双端口模式,即设置 RAM 的 Data Interface 属性为 Separate load and store ports。
reg [31:0] DM [0:3071]
变量 | 方向 | 位宽 | 解释 | 来源/去向 |
---|---|---|---|---|
clk | in | 1 | 时钟信号 | 顶层输入 |
rst | in | 1 | 同步复位信号 | 顶层输入 |
MemWrite | in | 1 | DM 写入控制信号 | Control |
MemAddr | in | 32 | DM 32 位写入地址 | ALU |
MemData | in | 32 | DM 32 位写入数据 | RD2 |
MemData | out | 32 | DM 32 位输出数据 | WD |
EXT(扩展单元)
- 可以使用 Logisim 内置的 Bit Extender。
Controller(控制器)
使用与或门阵列构造控制信号的具体方法见后文叙述。
也可以通过其它方式构造控制信号,同学们可以自行探索。
指令解读
指令 | 31-26 | 25-21 | 20-16 | 15-11 | 10-6 | 5-0 | 解释 |
---|---|---|---|---|---|---|---|
add | 000000 | rs | rt | rd | 00000 | 100000 | rd=rs+rt |
sub | 000000 | rs | rt | rd | 00000 | 100010 | rd=rs-rt |
ori | 001101 | rs | rt | im | im | im | rt=rs|im |
lw | 100011 | base | rt | offset | offset | offset | rt=mem(base+of) |
sw | 101011 | base | rt | offset | offset | offset | mem(base+of)=rt |
beq | 000100 | rs | rt | offset | offset | offset | PC+=4+of00? |
lui | 001111 | 00000 | rt | im | im | im | rt=im(0*16) |
jal | 000011 | index | index | index | index | index | 较为复杂 |
jr | 000000 | rs | 0 | 0 | 0 | 001000 | PC=rs |
jal:$31=PC+4,PC=PC[31:28]+index00
控制器
变量 | 方向 | 位宽 | 解释 |
---|---|---|---|
Instr | in | 32 | 指令机器码 |
ALU_out | in | 32 | 比较结果 |
ctrl | out | 2 | PC,0(beq),1(jal),2(jr) |
WE | out | 1 | GRF,写使能信号 |
GRF_op1 | out | 2 | GRF,控制写入地址来源,0(rd),1(rt),2($ra) |
GRF_op2 | out | 2 | GRF,控制写入数据来源,0(ALU),1(DM),2(im_of),3(index) |
op | out | 2 | ALU,运算选择0(+),1(-),2(|),3(==) |
ALU_op | out | 2 | ALU,控制运算数来源(0,rt,1,0-im,2,sign-of) |
MemWrite | out | 1 | DM,写入控制信号 |
思考题
阅读下面给出的 DM 的输入示例中(示例 DM 容量为 4KB,即 32bit × 1024字),根据你的理解回答,这个 addr 信号又是从哪里来的?地址信号 addr 位数为什么是 [11:2] 而不是 [9:0] ?
ALU的运算结果;截取高位实现右移2位的效果(lw、sw均为字操作,地址是4的倍数)
思考上述两种控制器设计的译码方式,给出代码示例,并尝试对比各方式的优劣。
地方
指令
指令对应的控制信号:
1 |
|
控制信号每种取值对应的指令:
1 |
|
优劣:第一种比较直接,控制信号直接由指令决定,但可读性差
第二种可读性好,但指令条数增多后代码冗余
在相应的部件中,复位信号的设计都是同步复位,这与 P3 中的设计要求不同。请对比同步复位与异步复位这两种方式的 reset 信号与 clk 信号优先级的关系。
同步复位:clk>reset
异步复位:reset>clk
C 语言是一种弱类型程序设计语言。C 语言中不对计算结果溢出进行处理,这意味着 C 语言要求程序员必须很清楚计算结果是否会导致溢出。因此,如果仅仅支持 C 语言,MIPS 指令的所有计算指令均可以忽略溢出。 请说明为什么在忽略溢出的前提下,addi 与 addiu 是等价的,add 与 addu 是等价的。提示:阅读《MIPS32® Architecture For Programmers Volume II: The MIPS32® Instruction Set》中相关指令的 Operation 部分。
与addiu相比,addi将32位扩展为33位并判断是否溢出,但忽略溢出后只关注前32位,因此相当于没拓展,和addiu相同
add与addu同理
测试方案
机器码转指令的
运行C语言代码(code_instruction.c),1为从文件输入,输出到文件;2为单个指令翻译
自动生成数据点的代码
待开发,目前只有手敲代码(
1 |
|