SystemC MIPS
MIPS指令系统和MIPS体系结构

WB:_____ADDI $r6 $r0 8___________________________
画出这时的时钟周期图。
(6)这时各流水寄存器中的内容为:
IF/ID.IR:___0X10200004____________________________
(3)进一步加深对数据冲突、结构冲突的理解,理解这两类冲突对CPU性能
实验
内容
(1)启动MIPSsim。
(2)根据预备知识中关于流水线各段操作的描述,进一步理解流水线窗口中各段的功能,掌握各流水寄存器的含义。(用鼠标双击各段,就可以看到各流水寄存器的内容)
(3)选择配置菜单中的“流水方式”选项,使模拟器工作于流水方式下。
1)加载structure_hz.s(在模拟器所在文件夹下的“样例程序”文件夹中)。
2)执行该程序,找出存在结构冲突的指令对以及导致结构冲突的部件。
结构冲突的指令为连续的ADD结构冲突的部件为Fadd浮点加法器
3)记录由结构冲突引起的停顿时钟周期数,计算停顿时钟周期数占总执行周期数的百分比。
4)把浮点加法器的个数改为4个。
实验步骤
1)选择MIPSsim的“文件”—>“载入程序”选项来加载pipeline.s(在模拟器所在文件夹下的“样例程序”文件夹中)。
2)关闭定向功能。这是通过“配置”—>“定向”(使该项前面没有√号)来实现的。
3)用单步执行一个周期的方式(在“执行”菜单中)或按F7键执行该程序,观察每一个周期中,各段流水寄存器内容的变化、指令的执行情况(“代码”窗口)以及时钟周期图。
5)再次重复步骤①~③的工作。
mips指令集(24条指令)的字段和功能描述

MIPS指令集(24条指令)的字段和功能描述指令集概述M I PS(M ic ro pr oc es s or wi th ou tI nt erl o ck ed Pi pe li ne dSt a ge s)指令集是一种精简指令集(R IS C)体系结构,广泛应用于计算机体系结构的教学和实践中。
本文将介绍M IP S指令集中的24条常用指令,并对它们的字段和功能进行详细描述。
加载和存储指令1.l w指令字段描述:-指令格式:lw$r t,o f fs et($rs)-r s(源寄存器):指定存储单元的基址寄存器-r t(目标寄存器):指定目标寄存器,用于存储从存储单元中加载的数据-o ff se t:用于指定存储单元的偏移量,计算出实际地址功能描述:l w指令用于从存储单元中加载数据到目标寄存器。
它通过基址寄存器和偏移量计算出实际地址,并将存储单元中的数据加载到目标寄存器中。
2.s w指令字段描述:-指令格式:sw$r t,o f fs et($rs)-r s(源寄存器):指定存储单元的基址寄存器-r t(目标寄存器):指定源寄存器,用于存储到存储单元中的数据-o ff se t:用于指定存储单元的偏移量,计算出实际地址功能描述:s w指令用于将源寄存器中的数据存储到指定的存储单元中。
它通过基址寄存器和偏移量计算出实际地址,并将源寄存器中的数据存储到该地址对应的存储单元中。
算术和逻辑指令3.a d d指令字段描述:-指令格式:ad d$rd,$rs,$rt-r s(源寄存器1):参与运算的第一个源寄存器-r t(源寄存器2):参与运算的第二个源寄存器-r d(目标寄存器):用于存储运算结果功能描述:a d d指令用于将两个源寄存器中的数据相加,并将结果存储到目标寄存器中。
4.s u b指令字段描述:-指令格式:su b$rd,$rs,$rt-r s(源寄存器1):参与运算的第一个源寄存器-r t(源寄存器2):参与运算的第二个源寄存器-r d(目标寄存器):用于存储运算结果功能描述:s u b指令用于将源寄存器2中的数据从源寄存器1中的数据减去,并将结果存储到目标寄存器中。
SystemCMIPS

SystemCMIPS⽬录1 SystemC的背景知识 (1)2 MIPS 3种指令的流程..............................................................................................................2-63 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个锁存器,⽤于保存上个阶段的信息。
MIPS

作者点评:MIPS技术公司则是一家设计制造高性能、高档次及嵌入式32位和64位处理器的厂商。在通用方面,MIPS R系列微处理器用于构建SGI的高性能工作站、服务器和超级计算机系统。在嵌入式方面,MIPS K系列微处理器是目前仅次于ARM的用得最多的处理器之一(1999年以前MIPS是世界上用得最多的处理器),其应用领域覆盖游戏机、路由器、激光打印机、掌上电脑等各个方面。
MIPS的系统结构及设计理念比较先进,其指令系统经过通用处理器指令体系MIPS I、MIPS II、MIPS III、MIPS IV到MIPS V,嵌入式指令体系MIPS16、MIPS32到MIPS64的发展已经十分成熟。在设计理念上MIPS强调软硬件协同提高性能,同时简化硬件设计。
中国龙芯2和前代产品采用的都是64位MIPS指令架构,它与大家平常所知道的X86指令架构互不兼容,MIPS指令架构由MIPS公司所创,属于RISC体系。过去,MIPS架构的产品多见于工作站领域,索尼PS2游戏机所用的“Emotion Engine”也采用MIPS指令,这些MIPS处理器的性能都非常强劲,而龙芯2也属于这个阵营,在软件方面与上述产品完全兼容。
MIPS公司设计RISC处理器始于二十世纪八十年代初,1986年推出R2000处理器,1988年推R3000处理器,1991年推出第一款64位商用微处器R4000。之后又陆续推出R8000(于1994年)、R10000(于1996年)和R12000(于1997年)等型号。
system c 编译

system c 编译SystemC是一种C++语言的扩展库,专门用于进行硬件描述和验证的系统级建模。
SystemC可以用来建立高层次的系统级建模,甚至可以用于高层次的软件建模。
SystemC可用于建立非常复杂和高效的硬件/软件混合系统建模。
在进行SystemC编译之前,需要先安装好SystemC开发环境。
一、安装SystemC开发环境1. 下载SystemC的源码包,解压到指定文件夹中;2. 打开终端,cd到SystemC的源码包中并执行configure命令;3. 等待configure命令执行完毕,执行make命令;4. 执行sudo make install命令,安装SystemC;5. 执行echo $SYSTEMC_HOME,确认环境变量已经设置。
二、新建SystemC工程1. 在工程所在路径下,新建文件夹存放工程文件;2. 使用文本编辑器新建top.cpp文件,编写SystemC代码;3. 使用文本编辑器新建Makefile文件,编写编译脚本;4. 执行make命令,编译SystemC工程。
三、编写top.cpp文件在编写top.cpp文件之前,需要先包含SystemC库头文件。
SystemC中最基本的结构是Module,通过Module可以创建C++类建立计算机系统的抽象,包括CPU、内存等各部分。
下面是一个简单的示例代码:#include "systemc.h"SC_MODULE(Top) // 定义Module{SC_CTOR(Top){SC_REPORT_INFO("INFO", "This is a Hello World SystemC simulation.\n");}};int sc_main (int argc, char* argv[]){Top top ("top"); // 实例化Modulereturn 0; // 模拟结束}代码中首先通过包含systemc.h库头文件来引入SystemC库。
systemc 手册

systemc 手册SystemC是一个用于系统级建模和仿真的开源库,它提供了一种用于描述和模拟硬件和软件系统的方法。
以下是一些SystemC手册的内容:一、SystemC概述SystemC是一个用于系统级建模和仿真的开源库,它提供了一种用于描述和模拟硬件和软件系统的方法。
SystemC可以用于验证硬件和软件系统的功能、性能和可靠性,以及进行系统设计和优化。
二、SystemC库SystemC库包含一组模块和接口,这些模块和接口可以用于构建复杂的硬件和软件系统模型。
SystemC库包括许多基本模块,例如门级元件、触发器、寄存器、算术逻辑单元等。
此外,SystemC还提供了一些高级模块,例如总线接口、内存接口、中断接口等。
三、SystemC建模SystemC建模是指使用SystemC库中的模块和接口来构建硬件和软件系统模型的过程。
SystemC建模可以使用文本编辑器或集成开发环境进行。
在建模过程中,需要使用SystemC语言来描述系统的结构和行为。
SystemC语言是一种基于C++的语言,它提供了许多用于描述硬件和软件系统的关键字和语法。
四、SystemC仿真SystemC仿真是指使用SystemC库中的仿真引擎来模拟硬件和软件系统模型的过程。
SystemC仿真可以用于验证系统的功能、性能和可靠性,以及进行系统设计和优化。
SystemC仿真引擎可以模拟系统的行为,并生成仿真结果,以便进行分析和调试。
五、SystemC应用SystemC可以应用于许多领域,例如通信、计算机、汽车电子等。
在通信领域中,SystemC可以用于构建通信系统的模型,并进行仿真和分析。
在计算机领域中,SystemC可以用于构建计算机系统的模型,并进行仿真和分析。
在汽车电子领域中,SystemC可以用于构建汽车控制系统的模型,并进行仿真和分析。
以上是一些SystemC手册的内容,如果您需要更详细的信息,请查阅相关的文档或联系我们。
c语言 mips指令
c语言 mips指令MIPS指令集是一种32位精简指令集(RISC)体系结构,它在计算机体系结构领域具有非常广泛的应用。
在编写C语言程序时,通常需要将高级语言的代码转化为MIPS指令集的汇编代码。
以下是一些关于C语言和MIPS指令集的相关参考内容,其中不包含链接的详细解释:1. C语言的数据类型映射到MIPS指令集的寄存器:- int类型通常映射到整数寄存器($t0-$t9)- float类型通常映射到浮点寄存器($f0-$f31)- char类型通常也映射到整数寄存器,但需要使用指令来执行字节操作2. C语言的条件语句(if-else语句)在MIPS指令集中的实现: - 使用比较指令(比如"slt", "sltu")将两个操作数进行比较- 根据比较的结果,使用分支指令(比如"beq", "bne", "j")跳转到不同的代码块- 可以使用标签(label)来标记不同的代码块,以便跳转3. C语言的循环语句(for循环、while循环)在MIPS指令集中的实现:- 使用比较指令判断循环条件,如果条件满足,则执行循环体内的指令- 在循环体内执行相应的操作,包括更新循环变量的值- 使用分支指令(比如"beq", "bne", "j")跳转到循环开头或循环结束的位置4. C语言的函数调用和参数传递在MIPS指令集中的实现:- 使用特殊的寄存器(比如$ra、$fp、$sp)来保存函数的返回地址、帧指针和栈指针- 将函数参数保存在寄存器或者栈中,并在函数内部使用它们- 使用分支指令跳转到函数的入口,执行函数体内的指令- 使用jr指令返回到调用函数的位置5. C语言中的数组和指针在MIPS指令集中的实现:- 使用基址寄存器(比如$gp)和偏移量来访问数组的元素- 使用la指令加载数组的地址到寄存器,使用lw和sw指令进行读取和存储操作- 使用指针变量保存地址,进行间接寻址操作6. C语言中的结构体和联合体在MIPS指令集中的实现:- 结构体和联合体的成员通常按照顺序在内存中排列- 使用指令来访问结构体和联合体的成员,比如使用lb和sb指令加载和存储字节型成员这些参考内容可以帮助程序员理解在C语言程序中,各种语法和语义对应着MIPS指令集的实现方式。
实验三MIPS指令系统和MIPS体系结构
实验3 MIPS指令系统和MIPS体系结构一.实验目的(1)了解和熟悉指令级模拟器(2)熟悉掌握MIPSsim模拟器的操作和使用方法(3)熟悉MIPS指令系统及其特点,加深对MIPS指令操作语义的理解(4)熟悉MIPS体系结构二. 实验内容和步骤首先要阅读MIPSsim模拟器的使用方法,然后了解MIPSsim的指令系统。
(1)、启动MIPSsim。
(2)、选择“配置”->“流水方式”选项,使模拟器工作在非流水方式。
(3)、参照使用说明,熟悉MIPSsim模拟器的操作和使用方法。
(4)、选择“文件”->“载入程序”选项,加载样例程序 alltest.asm,然后查看“代码”窗口,查看程序所在的位置。
(5)、查看“寄存器”窗口PC寄存器的值:[PC]=0X00000000 。
(6)、执行load和store指令,步骤如下:1)单步执行一条指令(F7)。
2)下一条指令地址为OX00000004 ,是一条有(有,无)符号载入 (字节,半字,字)指令。
3)单步执行一条指令(F7)。
4)查看R1的值,[R1]= 0xFFFFFFFFFFFFFF80 。
5)下一条指令地址为 OX000000008 ,是一条有 (有,无)符号载入(字节,半字,字)指令。
6)单步执行1条指令。
7)查看R1的值,[R1]=0x0。
8)下一条指令地址为 0x0000000c ,是一条无(有,无)符号载入(字节,半字,字)指令。
9)单步执行1条指令。
10)查看R1的值,[R1]=0x0 。
11)单步执行1条指令。
12)下一条指令地址为0x00000014 ,是一条保存字节(字节,半字,字)指令。
13)单步执行一条指令。
14)查看内存BUFFER处字的值,值为0x00000080。
(7)、执行算术运算类指令。
步骤如下:1)双击“寄存器”窗口中的R1,将其值修改为2。
2)双击“寄存器”窗口中的R2,将其值修改为3。
3)单步执行一条指令。
MIPS指令系统和汇编语言
MIPS指令系统和汇编语言MIPS(Microprocessor without Interlocked Pipeline Stages)指令系统,是一种以RISC(Reduced Instruction Set Computer,精简指令集计算机)为基础的处理器架构。
作为一种广泛应用于嵌入式系统和计算机组成的指令集架构,MIPS指令系统以其简洁高效的特性而受到广泛关注和应用。
一、MIPS指令系统概述MIPS指令系统的设计目标之一是提高处理器的性能,并降低设计的复杂性。
它采用了统一的指令格式,包括操作码、源操作数以及目的操作数等字段,使得指令的译码和执行过程更加高效。
此外,MIPS的指令集还支持延迟槽、流水线和分支延迟等特性,以进一步提升指令执行的效率。
二、MIPS指令格式MIPS指令格式遵循统一的规则,包括三种基本类型的指令格式:R 型、I型和J型指令。
R型指令主要用于寄存器之间的操作,包括算术运算、逻辑运算等;I型指令用于立即数和寄存器之间的操作,涵盖了数据传输、分支跳转等功能;J型指令主要用于无条件跳转。
三、MIPS指令编码和寻址方式MIPS指令采用固定长度的指令编码格式,使得指令的解析和处理更加高效。
在寻址方面,MIPS支持多种寻址方式,包括立即寻址、寄存器寻址和间接寻址等。
这些灵活的寻址方式使得MIPS指令更加适用于不同的计算需求。
四、MIPS汇编语言MIPS汇编语言是一种用于编写MIPS指令的低级语言。
它是一种基于文本的表示形式,使用助记符来表示不同的指令和操作。
MIPS汇编语言具有简单易学的特性,更加接近底层硬件的工作原理,使得程序员可以更加精准地控制和优化程序的执行过程。
五、MIPS指令系统的应用由于MIPS指令系统的优越性能和灵活性,它被广泛应用于各种领域。
在嵌入式系统中,MIPS处理器可以实现高性能和低功耗的设计,广泛应用于智能手机、路由器、电视机等设备中。
在计算机组成和操作系统领域,MIPS指令系统被用于讲解和研究计算机的工作原理和底层机制。
strace mips 交叉编译
strace mips 交叉编译在进行MIPS架构的交叉编译时,通常会使用strace工具来跟踪程序的系统调用。
首先,你需要安装适用于MIPS架构的交叉编译工具链,这包括交叉编译器和相关的开发工具。
然后,你需要获取strace的源代码,并使用交叉编译器进行编译。
在进行交叉编译之前,你需要确保你的主机系统上已经安装了适用于MIPS架构的交叉编译工具链。
这通常包括交叉编译器、头文件和库文件。
你可以从MIPS架构的硬件供应商或开发社区获取这些工具链。
一旦你安装好了交叉编译工具链,接下来需要获取strace的源代码。
你可以从strace的官方网站或者代码托管平台上获取最新的源代码包。
下载源代码后,解压缩并进入源代码目录。
在进入源代码目录后,你需要设置交叉编译器的环境变量,以便让编译过程使用交叉编译器而不是本地编译器。
你可以使用类似以下的命令来设置环境变量:export CC=mips-compiler.export CXX=mips-compiler.export AR=mips-ar.export AS=mips-as.export LD=mips-ld.export RANLIB=mips-ranlib.export PATH=/path/to/mips-compiler:$PATH.接下来,你可以运行类似以下的命令来配置和编译strace:./configure --host=mips-unknown-linux-gnu.make.在运行configure命令时,你需要指定目标平台为MIPS架构,并使用交叉编译器进行编译。
编译完成后,你会得到一个交叉编译的strace可执行文件,可以将其拷贝到MIPS架构的目标系统上进行测试和使用。
需要注意的是,交叉编译过程中可能会遇到一些依赖项缺失或者不兼容的情况,你需要根据具体的错误信息进行调整和解决。
另外,交叉编译的过程可能会因为不同的交叉编译器和目标系统而有所不同,你需要根据具体的情况进行调整。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
目录1 SystemC的背景知识 (1)2 MIPS 3种指令的流程..............................................................................................................2-63 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指令类似,这里就不再重复了。
这种指令里有一种跳转指令,不能不讲,如bne $2,$0,loop,指令格式译成机器码与上面的类似,但要注意loop在译成立即数imm时用的是相对跳转(相对跳转地址间隔的指令条数,怎么理解?还是看书^_^)。
在处理这种指令时,我们要用到JUMP信号,决定是哪一种跳转形式(因为还有J-type指令),此时JUMP信号会置为0。
首先会将imm左移2位,实际上是乘4(因为imm保存的实际上不是跳转的真实地址,只是相对跳转地址间隔的指令条数,而一条指令占4个字节,所以要乘以4,算出他们间隔的真实地址,说到这里,不懂的只好再去翻书了),加上IF算出的PC+4的值一起作为跳转地址送到IF锁存器,此时BRANCH信号置1。
为什么在这里提前计算了跳转地址呢?好问题!!答案下面揭晓。
当指令执行到分支指令或者其他引起程序计算器 PC 值发生变化的指令时,这些跳转指令将和后面的若干条指令发生控制相关。
此时,并不能够简单地执行分支指令或者跳转指令后面的指令,而是只有首先判断了分支指令中的条件是否成立之后,才能够决定下面将从何处开始执行指令。
这样,就会产生流水线的断流。
流水线断流几个周期,将由分支条件在何处完成判断来决定。
如果分支条件在 MEM阶段判断,则使用判断结果来决定下一条指令时会有3个周期的延迟;如果分支条件在 EXE 阶段判断,则会有2个周期的延迟。
而放到ID阶段,则只有1个周期的延迟,而对于一般的程序而言,平均存在33%的跳转指令,这种改进的作用无疑是巨大的。
最后只剩下J-type指令了,基本上差不多,只是JUMP信号会置为1,因为此时不用计算跳转地址,imm里面保存的就是真实的跳转地址。
指令送到EXE阶段,就是执行了,根据译码阶段传过来保存在ID2EXE锁存器里的信号决定作出什么样的运算,似乎没什么讲的。
接着是Mem阶段,在这个阶段, CPU会决定是否访问内存,注意这里并不是真的去访问内存,Data mem实际上是CPU里面的cache(高速缓存,可以理解为内存数据的部分备份),对于MIPS,只有load和store指令才会访问内存。
最后是WB,写回Reg File阶段,在这个阶段CPU会决定是否更新寄存器的值。
以上各部分要做什么事,全靠在ID阶段的Control Unit的控制,它是老大,决定一切进度!SystemC设计MIPSMIPS基本知识介绍到这里,就到了我们的正题,如何用SystemC来设计一个CPU?好了,我们先来搭建SystemC的运行环境。
这里我介绍的是在Windows下的安装过程。
首先是要安装visual C++6.0,很简单,一步步按提示操作即可。
然后编译systemc的库:1、从下载systemC源码,解压后放到任何你想放的目录下,这里我放在D:\systemc目录下;2、使用visual studio打开D:\systemc\msvc60\SystemC下的工程文件SystemC.dsw,编译后debug目录下会生成systemc.lib库3、将systemc.h复制到D:\systemc\src目录下(你下载的src文件夹会包含这个文件)接下来你可以新建一个Win32 Console Application工程,添加自己的代码之前需要进行以下设置:1、打开Project ->Settings...,在C/C++目录的Preprocessor子目录下,将Addtional include directories 选项添加D:\systemc\src2. 在C/C++目录的C++ Language子目录下,将Enable Run-Time Type Information(RTTI) 选项勾上。
3、在C/C++目录下的Code generation目录下,将Runtime Library选项设置为Debug Multithreaded(/MTd)(这个不是必须的设置的,Single-threaded(MLd)开关选项也可以,具体的差异?)。
4、在Link目录的Input子目录下,将Addtional library Path选项添加D:\systemc\msvc60\SystemC\Debug5、在Link目录下的General子目录下,将Object/library modules选项添加systemc.lib设置好后,就可以添加自己的代码了。