Skip to content

cod-lab 本地仿真环境配置

Warning

S-IDE 现在不用配环境了,直接用 make 命令仿真即可。因为最新框架下已经支持更高版本的 verilator 行为仿真,并且自带 mips 工具链。

本方法可以在 S-IDE 和 Ubuntu 22.04.4 LTS on Windows 10 x86_64 环境下成功进行软件编译和行为仿真。(其他 Linux 版本应该也可以......吧)

Note

如果是在一个新环境下从零开始配置,需要重新设置好 git 的用户名和邮箱,配置 ssh key(不然没法拉取和上传自己仓库)并添加好实验框架的远程仓库(就是那个 upstream ),以及 IDE 的插件(详情参考张思老师的文档 hello SERVE

verilator

这里 下载 4.222 版本的 verilator

verilator

找一个目录(不要放到框架里,可以选择 ~ 主目录)本地解压即可,用以下命令解压:

tar -xvf verilator-4.222.tar.gz

然后移动至解压后的目录:

cd verilator-4.222

依次执行以下命令:

首先安装必备的依赖:

sudo apt-get install git help2man perl python3 make autoconf g++ flex bison ccache libgoogle-perftools-dev numactl perl-doc zlib1g-dev

生成配置脚本:

autoconf && ./configure

编译安装:

Warning

下面这步会很漫长,如果在 S-IDE 上编译可能会花较长时间(我测试 S-IDE 的时候开了 16 G,也整了快半小时)。

make

Note

为了提高编译速度, make 可以改成

make -j `proc`
了解到 -j 参数作用是利用多个处理器核心加速优化,但是在 S-IDE 上反而会出现因内存占用过大被操作系统杀死进程的情况,所以不保证成功。稳妥起见还是用 make 吧)

最后输入下面指令,即可完成 verilator 的最终安装步骤:

sudo make install

在终端输入以下指令,检查是否安装成功:

verilator --version

Success

如果终端打印出 Verilator 4.222 2022-05-02 rev UNKNOWN.REV 字样,表示 verilator 本地配置成功。

mips 工具链

依次执行以下命令

cd && git clone https://github.com/rm-hull/barebones-toolchain.git
echo 'export PATH=$PATH:~/barebones-toolchain/cross/x86_64/bin' >> ~/.bashrc
source ~/.bashrc

在终端输入以下指令,检查是否安装成功:

mips-gcc --version

Success

如果终端打印出以下类似字样,表示 mips-gcc 本地配置成功。

mips-gcc (GCC) 6.2.0
Copyright (C) 2016 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

进行软件编译和行为仿真(以 hello 为例)

Warning

记得用 git pull upstream master 同步框架!!!

软件编译

软件编译输入:

make FPGA_PRJ=ucas-cod FPGA_BD=nf OS=phy_os ARCH=mips workload

software_test_4

Success

成功编译软件!!!

硬件行为仿真

先删掉先前仿真生成的多余文件:

Warning

记得每一次仿真前都先把 fpga/sim_out/custom_cpu 删干净!!!

sudo rm -rf ./fpga/sim_out/custom_cpu

下面输入仿真的命令(以 hello 为例):

Warning

记得 make 前要加 sudo

sudo make FPGA_PRJ=ucas-cod FPGA_BD=nf SIM_TARGET=custom_cpu SIM_DUT=mips:multi_cycle WORKLOAD=simple_test:hello:hello bhv_sim_verilator

custom_cpu_test_1

custom_cpu_test_2

Success

成功完成行为仿真并在终端显示结果!!!

补充

懒人必备(一键仿真脚本):

#!/usr/bin/sh

# 注意:仅适用于 prj3 ,其他实验项目可根据具体情况适当调整

# =====================================================================
#
#   使用方法:
#
#   1. 把本脚本放在 cod-lab 目录下,命名为 sim.sh
#   2. 命令行输入:  chmod 755 sim.sh  # 赋予脚本执行权限,只用做一次
#   3. 之后仿真时直接运行(注意加上sudo),例如:sudo ./sim.sh microbench fib
#
# =====================================================================




# =====================================================================
#
#   规则:方便查看(来自 .gitlab-ci.yml )
#
#   - SIM_SET: basic
#     BENCH: [memcpy]
#   - SIM_SET: medium
#     BENCH: [sum,mov-c,fib,add,if-else,pascal,quick-sort,select-sort,max,min3,switch,bubble-sort]
#   - SIM_SET: advanced
#     BENCH: [shuixianhua,sub-longlong,bit,recursion,fact,add-longlong,shift,wanshu,goldbach,leap-year,prime,mul-longlong,load-store,to-lower-case,movsx,matrix-mul,unalign]
#   - SIM_SET: hello
#     BENCH: [hello]
#   - SIM_SET: microbench
#     BENCH: [fib,md5,qsort,queen,sieve,ssort,15pz,bf,dinic]
#
# =====================================================================






SIM_SET=$1
BENCH=$2

TARGET_DESIGN="custom_cpu"
CPU_ISA="mips" # "mips", "riscv32"
SIM_DUT_TYPE="multi_cycle" # "single_cycle", "multi_cycle", "turbo"








# {====================================================================
# 确保参数合法
# =====================================================================

if [ $# -ne 2 ]; then
    echo "Usage: $0 [SIM_SET] [BENCH]"
    exit 1
fi


check_basic() {
    if [ $BENCH != "memcpy" ]; then
        echo "Error: [$BENCH] is not in the [$SIM_SET]"
        exit 1
    fi
}

check_medium() {
    case "$BENCH" in
    "sum"|"mov-c"|"fib"|"add"|"if-else"|"pascal"|"quick-sort"|"select-sort"|"max"|"min3"|"switch"|"bubble-sort")
        ;;
    *)
        echo "Error: [$BENCH] is not in the [$SIM_SET]"
        exit 1
        ;;
    esac
}

check_advanced() {
    case "$BENCH" in
    "shuixianhua"|"sub-longlong"|"bit"|"recursion"|"fact"|"add-longlong"|"shift"|"wanshu"|"goldbach"|"leap-year"|"prime"|"mul-longlong"|"load-store"|"to-lower-case"|"movsx"|"matrix-mul"|"unalign")
        ;;
    *)
        echo "Error: [$BENCH] is not in the [$SIM_SET]"
        exit 1
        ;;
    esac
}

check_hello() {
    if [ $BENCH != "hello" ]; then
        echo "Error: [$BENCH] is not in the [$SIM_SET]"
        exit 1
    fi
}

check_microbench() {
    case "$BENCH" in
    "fib"|"md5"|"qsort"|"queen"|"sieve"|"ssort")
        ;;
    *)
        echo "Error: [$BENCH] is not in the [$SIM_SET]"
        exit 1
        ;;
    esac
}


case "$SIM_SET" in
"basic")
    check_basic
    ;;
"medium")
    check_medium
    ;;
"advanced")
    check_advanced
    ;;
"hello")
    check_hello
    ;;
"microbench")
    check_microbench
    ;;
esac

# }====================================================================



# 删除上次仿真生成的一些可能产生冲突的文件
rm -rf ./fpga/sim_out/$TARGET_DESIGN

# 软件编译
make FPGA_PRJ=ucas-cod FPGA_BD=nf OS=phy_os ARCH=$CPU_ISA workload

# 行为仿真
make FPGA_PRJ=ucas-cod \
     FPGA_BD=nf \
     SIM_TARGET=$TARGET_DESIGN \
     SIM_DUT=$CPU_ISA:$SIM_DUT_TYPE \
     WORKLOAD=simple_test:$SIM_SET:$BENCH \
     bhv_sim_verilator