|
许久没有更新过日志了,已然沉寂的太久。在技术的道路上漫漫求索,实属不易。消失的几个月里一直投身于仿真技术,力求能够弄清cpu的工作原理。所幸能参考大师之作《Digital Design and Computer Architecture》,收益颇丰。其书通篇讲述了数字设计的原理和方法,并且融入hdl仿真,理论与实际相结合。更难能可贵的是能结合计算机架构原理搭建cpu软核,实属上层佳品,感兴趣的朋友推荐一品。
mips在商业领域虽不是一方霸主,但也小有所成。从其出身到现在一直受学校和数字设计爱好者的亲睐。Mips出自上世纪80年代斯坦福大学教授之手,而且其设计原理被其开发者写成书籍,经过几代人努力,已经成为先进产品。现在大学教授计算机架构都是以mips作为标准,很大程度上是因为其开放性以及学术支持。另外,mips属于最简指令集类型,无论从设计还是实现上都比较简单可行。下面就我最近在这个方向的经验做下总结。
谈到题目”mips微架构”,我们首先要明白几个概念。什么叫微架构?在网上可以找到其定义和解释。我理解的是微架构可以看成计算机架构的具体实现。计算机架构包含指令集和相关的寄存器组定义。比如x86架构就会定义它包含的寄存器(如eax、cs等等)和汇编指令集(mov神马的)。架构定义出来,就构成了软件计算的基础,操作系统等系统组件都在此架构之上。对于相同的架构可以有不同的内部实现,这就是微架构。比如intel的cpu和amd的cpu都可以执行相同的x86代码和系统,因为他们虽然硬件构成不同,但是都是遵照x86统一架构实现的,所以芯片功能相同。
下面简单介绍下mips32的架构。理解mips32架构的最好方式就是尝试写一个mips32的汇编器。这样不管是指令集还是寄存器意义都会深入与心。我这次的工作也包含这个方面。具体实现就不说了。
寄存器组见下表:
Name | Number | Use | Callee must preserve? |
$zero | $0 | constant 0 | N/A |
$at | $1 | assembler temporary | No |
$v0–$v1 | $2–$3 | values for function returns and expression evaluation | No |
$a0–$a3 | $4–$7 | function arguments | No |
$t0–$t7 | $8–$15 | temporaries | No |
$s0–$s7 | $16–$23 | saved temporaries | Yes |
$t8–$t9 | $24–$25 | temporaries | No |
$k0–$k1 | $26–$27 | reserved for OS kernel | N/A |
$gp | $28 | global pointer | Yes |
$sp | $29 | Yes | |
$fp | $30 | Yes | |
$ra | $31 | N/A |
Mips指令集的二进制指令格式如下:
Type | -31- format(bits) -0- | |||||
R | opcode (6) | rs (5) | rt (5) | rd (5) | shamt (5) | funct (6) |
I | opcode (6) | rs (5) | rt (5) | immediate (16) | ||
J | opcode (6) | address (26) |
其指令是分类实现的,包括R型指令、I型指令、J型指令。他们对应的指令和指令码如下:
R型:
指令 操作码 功能码
add 0 0x20
addu 0 0x21
sub 0 0x22
subu 0 0x23
mult 0 0x18
div 0 0x1A
divu 0 0x1B
mfhi 0 0x10
mflo 0 0x12
and 0 0x24
or 0 0x25
xor 0 0x26
nor 0 0x27
slt 0 0x2A
sll 0 0
srl 0 2
sra 0 3
jr 0 8
I型:
指令 操作码
addi 8 addiu 9 ld 0x23
lw 0x23 lh 0x21 lhu 0x25 lb 0x20 lbu 0x24 sd 0x0
sw 0x2B sh 0x29 sb 0x28 lui 0x0F
andi 0x0C ori 0x0D slti 0x0A beq 4 bne 5
J型:
指令 操作码
j 2 jal 3
上述内容便是mips32的架构了,如果要了解更加详细的内容可以参考mips参考手册查询或者网上搜索相关资料。
下面我们根据《Digital Design and Computer Architecuture》书中章节进行mips微架构设计,为了简化,只设计了一个单周期的mips子集兼容cpu。对于cpu工作原理的理解是足够了。在做下面的设计前,建议大家先了解VHDL语言和计算机逻辑基础以及modelsim仿真这些基础内容。
我们的测试代码段是:
# mipstest.asm
# David_Harris@hmc.edu 9 November 2005
#
# Test the MIPS processor.
# add, sub, and, or, slt, addi, lw, sw, beq, j
# If successful, it should write the value 7 to address 84
main: addi $2, $0, 5
addi $3, $0, 12
&nbs