SOC系统01:软核的获取与仿真

0.前言

一个SOC系统如下图所示。以软核为中心的soc系统搭建,需要完成软核仿真、FPGA上板验证、外设IP开发、外设挂载与驱动、软硬交互等步骤。这是一个很大的主题,准备用一系列的主题小结记录一点经验。
SOC系统01:软核的获取与仿真_第1张图片

1.开源核获取

例如ARM架构下的m系列,a系列,可以到官网申请design start版本、eval版本;
或者比较热门的RISC-V架构,如蜂鸟,无剑等软核,可以在github中直接下载

2.仿真平台的搭建

常用的仿真软件,Windows下常用modelsim,Linux下常用questasim,vcs等。
以蜂鸟e203的仿真为例,见https://blog.csdn.net/qq_40946355/article/details/105188993;
一个软核在发布前已经完成相应的验证工作,一般不需要我们额外添加testcase,在相应的EDA工具复现即可。

3.软核需要验证哪些功能

(1)指令集测试
一般会附带在软核的下载包中,用python、makefile脚本集成好,按README说明文件操作即可,例如
SOC系统01:软核的获取与仿真_第2张图片
(2)指令的写入测试
需要了解指令存储器的位置,在testbench中进行写入指令,并对应读出,完成一个读写回环

	integer i;
    reg [7:0] itcm_mem [0:31];
    initial begin
      $readmemh({
     testcase, "coremark.verilog"}, itcm_mem);

      for (i=0;i<32;i=i+1) begin
          `ITCM.mem_r[i][00+7:00] = itcm_mem[i*8+0];
          `ITCM.mem_r[i][08+7:08] = itcm_mem[i*8+1];
          `ITCM.mem_r[i][16+7:16] = itcm_mem[i*8+2];
          `ITCM.mem_r[i][24+7:24] = itcm_mem[i*8+3];
      end

        $display("ITCM 0x00: %h", `ITCM.mem_r[8'h00]);
        $display("ITCM 0x01: %h", `ITCM.mem_r[8'h01]);
        $display("ITCM 0x02: %h", `ITCM.mem_r[8'h02]);
        $display("ITCM 0x03: %h", `ITCM.mem_r[8'h03]);
    end 

(3)运算功能
查阅指令手册,向指令存储器写入算术运算、逻辑运算、移位等操作指令,输出查看结果。(这一步在软件上调试也可)
SOC系统01:软核的获取与仿真_第3张图片
(4)外设测试
较常用的spi,uart协议测试,可以有选择地测试
spi与flash的读写相关,程序可能会烧录到flash中,再上载至指令存储器运行;
uart与printf函数相关,也常用于开发板与上位机之间的数据传输。

(5)架构信息
有些寄存器会保存架构信息,版本信息,这些寄存器是可读不可写的,在regfile中查找对应寄存器并输出其预置的置即可;
也可以在程序中使用读寄存器命令,例如read_csr(a0)读取出寄存器a0的值,这类读取函数会以汇编的提前封装好,具体函数名到板级开发包中寻找。

你可能感兴趣的:(MCU设计与SOC)