SystemC MIPS
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
目录
1 SystemC的背景知识 (1)
2 MIPS 3种指令的流程..............................................................................................................2-6
3 SystemC设计MIPS...............................................................................................................7-12 4总结 (13)
参考文献 (13)
用SystemC实现简单的MIPS SystemC的背景知识
目前的电子产品设计存在2个发展趋势,
1.电子产品的面市时间日益缩短
2.电子产品和大有前途的基于平台设计方法,其复杂度都在不断增长
这两点都要求建立高速的的可执行模型,以较高的抽象层次表达较低层次的电路结构。SystemC正是在这一背景下诞生的。业界认为,SystemC有望在1~2年内成为IEEE的标准。学习该语言有助于将来向系统设计方向扩展。
学习SystemC要求的背景知识:首先必须了解C++语言的基础知识,这是不可或缺的。其次还应该有逻辑设计的背景。如果已经了解VHDL和V erilogHDL这两种广为流传的硬件描述语言中的任何一种,那么学习SystemC将会如鱼得水,但这不是必须的。嘿嘿,可以偷懒了!
MIPS 3种指令的流程
MIPS是一种简洁的设计,指令集比较简单,因此成为大多CPU设计的入门教材。下面以李亚明网站上的5级流水简略介绍一下。这5级分别为:IF(取指),ID(译码),EXE(执行),MEM(读写内存),WB(写回)五个阶段。
借用一下网站上的图片
图1
我们可以看到图上用绿色标出的5根“棒子”,这是各个阶段的分界线,当然不只是分界的作用,他们其实是5个锁存器,用于保存上个阶段的信息。在IF阶段,我们要做的事是从IF锁存器中取出PC(程序计数器)值,根据PC从Instmem(实际上是cache)取出指令,同时PC+4,再将PC送到锁存器中。注意,PC在送到锁存器之前,会通过一个2路选择器,这个选择器决定到底是采用从ID阶段送过来的跳转指令的跳转地址还是采用在IF 阶段计算得出的下一条指令的跳转地址。
好了,IF阶段的过程大家应该比较清楚了,现在看一下复杂的ID阶段。密密麻麻的线啊,老天!!在具体介绍之前,还是要先提一下MIPS的三种指令,因为这个阶段需要对这三种指令分别译码,他们分别是:I-type,R-type,J-type。从李亚明的网站上偷点图片过来,有助于理解。
type instruction 即含有立即数的指令,R-type instruction 即含有目的寄存器rd 的指令,J-type instruction 即跳转指令。对比一下上面的图,聪明的你是否一下就洞破天机?呵呵,这里不再详细介绍,我们把译码阶段走一遍,相信各位应该会有一个清晰的认识。
我们先看一下稍微简单的R-type指令如何译码。比如拿这条指令add $1, $2, $3开刀,这条指令的意思是 $1 <- $2 + $3,$1表示1号寄存器,MIPS共有32个通用寄存器。嗯,我们首先按照上面的格式翻译成机器码:
因此rs放的是2号寄存器编号2,rt放的是3号寄存器的编号3,rd放的是1号寄存器的编号1,shamt是偏移量,这里我们没有用到,func是100000表示这是一条add指令,Opcode里放的是000000,表示这是R-type指令。好了,我们开始走一遍。首先rs和rt 的值被送到RegFile,根据里面保存的寄存器编号,可取到对应寄存器里的值,然后通过一个四路选择器送到锁存器里,这个四路选择器对应3种forwarding(0不是forwarding。如果不懂去看看资料,嘿嘿)。同时我们可以看到有func,op,rs,rt,RSRTEQU(返回两个数的对比结果,一般用在分枝指令)五个部分被输入到Control Unit中。Control Unit 通过op和func确定指令是什么指令,然后发出相应的控制信号,Control Unit确定了是add 指令,于是将WREG置1,M2REG置1,WMEM置1,ALUC置‘0000’(我们假设0000代表加法),SHIFT置0,ALUCIMM置0,SEXT置0(即不进行符号扩展),REGRT置0,FWDA和FWDB置0,JUMP默认值0。是不是不太明白各个控制信号具体的作用啊,好这里我们有先说说各个控制信号得作用。WREG(写寄存器),M2REG(从DateMem读数据到寄存器),WMEM(向DateMem 写数据),ALUC(通知运算器执行何种运算),SHITF(选择路径,这里我们用不到,可省去),ALUIMM(选择操作数为立即数),SEXT(符号扩展),REGRT(写的目标寄存器,这里置为0,表示EXE阶段算出来的值保存到rd对应的寄存器里),FWDA和FWDB(选择做哪种Forwarding),JUMP(选择跳转的地址)。很明显有些控制信号要保存到IdToEXE锁存器中,留到下个阶段起作用。
很好,如果理解了R-type指令的译码过程那么I-type指令的译码过程就好理解了,无非是输入信号和输出的控制信号不同罢了。下面看具体的例子
这条指令被译成机器码,如上图所示,为什么rs,rt里面放的是18,17呢?原来MIPS 的寄存器有2种标识方法,一种是直接写编号,如$17,$18,一种是用它的别名,比如17号寄存器又叫$s1,18号寄存器又叫$s2。好了,我们走一遍。同样的,首先rs和rt的值被送到RegFile,根据里面保存的寄存器编号,可取到对应寄存器里的值,然后通过一个四路选择器送到锁存器里,注意这种指令没有rd,所以REGRT(写的目标寄存器)置为1,告诉下个阶段的EXE,运算完了的值保存到rt标识的寄存器里,同时imm(立即数)也被送到锁存器里保存起来,可以看到imm经过了一个SE做了符号位扩展(什么意思?还是老老实实看书吧^_^)。其它的通过Control Unit送出的信号与add指令类似,这里就不再重复了。