|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?注册
x
本帖最后由 504472832 于 2014-3-11 20:18 编辑
为了感谢版主leishangwen 和 eetop上很多前辈和同学对开源和MIPS的支持,我也来贡献一个开源处理器mips32r2p7及由其搭建的SoC系统,有空的同学可以玩玩。放在OpenMIPS这个版块下,望leishangwen不要介意。
先大概解释下这个名字的意思,mips代表选用的是mips的体系结构;32说明这是个32位的CPU;r2说明兼容的指令集是release 2;p7说明CPU采用了7级流水线。(以前在opencores上看到了Utah大学发布的mips32r1的IP核,感觉写的很不错)
mips32r2p7具有以下特点:
1. 七级流水线:取指1、取指2、读寄存器、执行、访存、异常、写回;
2. 32位数据与地址宽度;
3. 总线采用AHB和APB协议(其中AHB频率50MHz,APB频率10MHz);
4. 静态可配置的大/小端模式;
5. 精确异常,支持外部中断;
6. 分立的指令和数据Cache,可配置为1-4way,1~256KB,突发传输,不过目前只支持LRU替换策略和写回模式‘;
7. 基于分支历史的分支预测,分支历史表(BHT)大小可配置;
8. 支持返回地址预测,返回预测堆栈(RPS)大小可配置;
9. 支持绝大部分整数指令;
10. 支持C编译器(mips-sde-elf-gcc);
11. 支持ucos ii 操作系统;
12. 可综合,synplify_premier综合后报的DE2_115(Cyclone IV E)上能跑的最大频率位66MHz;
13. 性能dhrystone:1.40DMIPS/MHz,Coremark: 2.34 CoreMarks/MHz;貌似和LEON3差不多;
(配置:Cache:4ways 4KB; BHT:512; RPS:8;gcc:-O3; 用MIPS的performance counter算出来的,希望没算错)
SoC包含以下部分:
1. mips32r2p7:当然就是上述CPU;
2. ahb_matrix:AHB总线互联矩阵,支持1~16个master,1~16个slave,由Leon3上的互联器改编而来;
3. 存储器控制器:目前只包含flash和sdram,挂在ahb_matrix下,均支持突发传输。flash控制器自己写的,只支持DE2_115上的flash,但改为支持其他的flash应该也不复杂;sdram控制器用的是opencores上的sdr_ctrl项目,不过将其总线改为了AHB;
4. ahb2apb_bridge:ahb转apb的桥接器,目前只支持同源的异步时钟,支持1~16个slave;
5. 外设IP:目前只有gpio和uart的IP,挂在ahb2apb_bridge下;
(以上IP能在mips32r2p7/rtl目录下找到)
由于目前在外面实习,手头没有开发板,所以只能做到仿真这一步。不过目前已经通过了门级的仿真,修修外设的时序,跑起来应该问题不大,等4、5月份回学校再上板调试;
仿真所用到的model如下:
flash: Spansion公司出的s29gl064n01.v model,和DE2_115开发板上的一致;
sdram: 由于ISSI公司的model比较少,没有找到相应的型号model,所以采用了micron公司的mt48lc4m32b2.v;
gpio:自己写的,当IO口的值改变时,用$display打印出信息;
uart:自己写的,将输出的结果打印,同时写到仿真目录的uart.log文件里;
(以上model能在mips32r2p7/model目录下找到)
建立环境流程(很遗憾笔记本装了linux系统,给大家带来不便,不过对于IC/FPGA来说,还是linux比较好用些):
1. 安装linux(必须),支持的版本:rhel(推荐)、centos、ubuntu、fedora;
2. 安装verilog仿真工具,并xxx(必须),可供选择的有:vcs、incisiv、modelsim;
3. 安装verdi,并xxx(可选),想看波形的安装;
4. 安装mips-sde-elf-gcc,想调软件的安装;
5. 安装synplify,quartus,并xxx(可选),想重新综合的安装;
6. 将mips32r2p7.tar.bz2的包解压到linux任意有rwx权限的目录下,例如/home/yourname/
7. 设置环境变量,打开mips32r2p7/env.sh文件,根据实际情况修改一下变量:
以下一个变量必须设置,
export PROJ_HOME= (修改为工程所在的目录,例如export PROJ_HOME=/home/wzk/Projects/mips32r2p7)
以下三个变量设置一个即可,
export VCS_HOME= (修改为VCS的安装目录,例如export VCS_HOME=/home/wzk/Tools/synopsys/vcs_mx_vH-2013.06)
export INCISIV_HOME= (修改为INCISIV的安装目录,例如export INCISIV_HOME=/home/wzk/Tools/cadence/incisiv-13.20.002)
export MODELSIM_HOME=(修改为MODELSIM的安装目录,例如MODELSIM_HOME=/home/wzk/Tools/mentor/questasim- 10.2b/questasim/linux_x86_64)
以下变量可根据需求选择性设置,
export VERDI_HOME=/home/wzk/Tools/synopsys/verdi3-2012.10
export QUARTUS_HOME=/home/wzk/Tools/altera/13.1/quartus
export SYNPLIFY_HOME=/home/wzk/Tools/synopsys/fpga_vI-2013.09-SP1
export MIPS_HOME=/home/wzk/Tools/Sourcery_CodeBench_Lite_for_MIPS_ELF
8. source env.sh,使环境变量生效,每次开启新的terminal都要source下env.sh这个文件;
9. 新建一个仿真目录,例如mips32r2p7/sim
10. 输入命令sims case [-g] [-d] [-vcs/-incisiv/-modelsim] [-64]
case:case的名字,目前有的case有:gpio_test、uart_test、dhrystone、coremark、ucos_ii;
-g: 表示用synplify综合的网表文件来跑仿真,而不是默认的rtl文件,网表文件我已经综合好了;
-d: 表示将仿真时的波形dump出来,没有装verdi的就不要加这个选项;
-vcs/-incisiv/-modelsim:表示用那个工具来跑仿真,同理;如果不加这个命令,命令会自动根据env.sh寻找存在的工具;
-64: 表示采用64位的工具跑仿真;
举几个例子:
1. 比如想用modelsim跑dhrystone的rtl仿真,不用dump波形,命令是:sims dhrystone -modelsim
2. 比如想用vcs跑coremark的rtl仿真,并dump波形;命令是:sims coremark -d -vcs
3. 比如想用incisiv跑ucos ii的gate仿真,并dump波形,命令是:sims ucos_ii -g -d -incisiv
其实这个命令就是个简单的shell脚本,mips32r2p7/bin/sims
11. 如果没什么报出错误,之后喝杯水看看电影,等结果就行了;对于会执行完的程序(从main返回),仿真会自动停止;对于不会执行完的程序,例如 ucos ii的例子,需要手动停下来,Ctrl+C or Ctrl+4;
12. 跑完了查看下log和uart.log文件,看看输出结果是否正确;
13. 对于装了verdi,加了-d选项跑仿真的,可以在仿真目录下运行./verdi.cmd来启动verdi,查看波形;
14. 如果想改程序,可以到mips32r2p7/software/demos下修改;
dhrystone结果(mips32r2p7/sim_dhrystone/uart.log):
Dhrystone Benchmark, Version 2.1 (Language: C)
Program compiled without 'register' attribute
Execution starts, 10000 runs through Dhrystone
Execution ends
Final values of the variables used in the benchmark:
Int_Glob: 5
should be: 5
Bool_Glob: 1
should be: 1
Ch_1_Glob: c
should be: c
Ch_2_Glob: c
should be: c
Arr_1_Glob[8]: 7
should be: 7
Arr_2_Glob[8][7]: 10010
should be: Number_Of_Runs + 10
Ptr_Glob->
Ptr_Comp: 402652992
should be: (implementation-dependent)
Discr: 0
should be: 0
Enum_Comp: 2
should be: 2
Int_Comp: 17
should be: 17
Str_Comp: DHRYSTONE PROGRAM, SOME STRING
should be: DHRYSTONE PROGRAM, SOME STRING
Next_Ptr_Glob->
Ptr_Comp: 402652992
should be: (implementation-dependent), same as above
Discr: 0
should be: 0
Enum_Comp: 1
should be: 1
Int_Comp: 18
should be: 18
Str_Comp: DHRYSTONE PROGRAM, SOME STRING
should be: DHRYSTONE PROGRAM, SOME STRING
Int_1_Loc: 5
should be: 5
Int_2_Loc: 13
should be: 13
Int_3_Loc: 7
should be: 7
Enum_Loc: 1
should be: 1
Str_1_Loc: DHRYSTONE PROGRAM, 1'ST STRING
should be: DHRYSTONE PROGRAM, 1'ST STRING
Str_2_Loc: DHRYSTONE PROGRAM, 2'ND STRING
should be: DHRYSTONE PROGRAM, 2'ND STRING
DHRYSTONE Result:
The dhrystone program runs 4052907 clock cycles
This CPU is: 1.40 DMIPS/MHz
Coremark结果(mips32r2p7/sim_coremark/uart.log)
2K performance run parameters for coremark.
CoreMark Size : 666
Total ticks : 17037059
Total time (secs): 0
Iterations : 40
Compiler version : GCC4.8.1
Compiler flags : -O3
Memory location : STATIC
seedcrc : 0xe9f5
[0]crclist : 0xe714
[0]crcmatrix : 0x1fd7
[0]crcstate : 0x8e3a
[0]crcfinal : 0x65c5
Correct operation validated. See readme.txt for run and reporting rules.
CoreMark 1.0 : 2.34 CoreMarks/MHz
QQ: 491179885email: wang.zekun@163.com
工程文件分享:
v0.5.0: 链接: http://pan.baidu.com/s/1c0xNlg0 密码: dgfd first release
v0.5.1: 链接: http://pan.baidu.com/s/1sj4iu1R 密码: 83g8
fix some bugs in script file;
update netlist; |
|