|  | 
 
| 
 
本帖最后由 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;
 | 
 |