在Ubuntu 22.04上,用ModelSim SE 2020.4搞定PULPino RISC-V的Hello World仿真(含Python2配置避坑)

在Ubuntu 22.04上搭建PULPino RISC-V仿真环境的完整指南

作为一款开源的32位RISC-V微控制器系统,PULPino因其精简的设计和丰富的外设支持,成为嵌入式开发者和学术研究的热门选择。然而,由于项目长期未更新,环境搭建过程中会遇到各种"坑"——从Python2的兼容性问题到特定版本的ModelSim需求,再到自定义工具链的编译错误。本文将带你一步步解决所有这些问题,最终在Ubuntu 22.04上成功运行Hello World仿真。

1. 环境准备与工具安装

在开始之前,请确保你使用的是Ubuntu 22.04系统(物理机或虚拟机均可)。我们将从最基本的依赖项开始,逐步构建完整的仿真环境。

1.1 Python2环境配置

由于PULPino项目多年未更新,它仍然依赖Python2环境,这与现代系统默认的Python3不兼容。以下是安全配置Python2环境的步骤:

# 安装Python2
sudo apt update
sudo apt install python2

# 设置Python2为默认版本(谨慎操作)
sudo update-alternatives --install /usr/bin/python python /usr/bin/python2 1
sudo update-alternatives --install /usr/bin/python python /usr/bin/python3 2
sudo update-alternatives --config python  # 这里选择python2

注意:修改系统默认Python版本可能会影响其他应用程序。建议在虚拟环境中操作或事后恢复默认设置。

安装pip2(Python2的包管理工具):

wget https://bootstrap.pypa.io/pip/2.7/get-pip.py
python2 get-pip.py

1.2 ModelSim SE 2020.4安装

PULPino要求ModelSim版本在10.2c以上。我们推荐使用ModelSim SE 2020.4,以下是安装步骤:

  1. 从Intel官网下载ModelSim SE 2020.4 Linux版本
  2. 解压安装包并运行安装程序
  3. 安装必要的32位兼容库:
sudo apt install libc6-i386 lib32stdc++6 lib32z1
  1. 将ModelSim添加到系统PATH:
echo 'export PATH=$PATH:/path/to/modelsim/bin' >> ~/.bashrc
source ~/.bashrc

验证安装是否成功:

vsim -version

1.3 PULP-RISCV工具链编译

标准RISC-V工具链不支持PULPino的自定义指令集,因此需要专门编译pulp-riscv-gnu-toolchain:

# 安装依赖项
sudo apt install autoconf automake autotools-dev curl libmpc-dev \
     libmpfr-dev libgmp-dev gawk build-essential bison flex texinfo \
     gperf libtool patchutils bc zlib1g-dev

# 获取源码
git clone https://github.com/pulp-platform/pulp-riscv-gnu-toolchain
cd pulp-riscv-gnu-toolchain
git submodule update --init --recursive

# 编译安装
./configure --prefix=/opt/pulp_riscv --with-arch=rv32imc --with-cmodel=medlow --enable-multilib
make -j$(nproc)

# 添加到PATH
echo 'export PATH=$PATH:/opt/pulp_riscv/bin' >> ~/.bashrc
source ~/.bashrc

验证工具链安装:

riscv32-unknown-elf-gcc --version

2. PULPino项目配置

2.1 获取PULPino源码

git clone https://github.com/pulp-platform/pulpino
cd pulpino

2.2 更新IP依赖

运行更新脚本时会遇到adv_dbg_if分支缺失的问题,这是已知问题但可以安全忽略:

./update-ips.py

提示:虽然脚本会报错adv_dbg_if的pulpinov1分支缺失,但master分支同样可用,不会影响后续仿真。

2.3 解决CMake -m32问题

现代CMake不再支持-m32选项,需要修改sw/CMakeLists.txt:

- set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -m32 -march=${GCC_MARCH} -Wa,-march=${GCC_MARCH}")
+ set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -march=${GCC_MARCH} -Wa,-march=${GCC_MARCH}")

3. 构建与仿真

3.1 准备构建环境

mkdir -p sw/build
cd sw/build
cp ../cmake_configure*.gcc.sh .

根据你的需求选择合适的配置脚本:

  • cmake_configure.riscv.gcc.sh : RISCY核心
  • cmake_configure.riscvf.gcc.sh : 带浮点的RISCY
  • cmake_configure.zeroriscy.gcc.sh : zero-riscy核心
  • cmake_configure.microriscy.gcc.sh : 精简版zero-riscy

3.2 解决riscv.ld文件问题

运行配置脚本时会出现riscv.ld文件缺失的错误。创建fix_riscv_ld.sh脚本:

#!/bin/bash
riscv32-unknown-elf-ld --verbose | head -n -1 | tail -n +7 | \
    sed '168 a \ \ _fbss = .;' | \
    sed '169 a \ \ . = .;' > CMakeFiles/CMakeTmp/riscv.ld

赋予执行权限并运行:

chmod +x fix_riscv_ld.sh
./fix_riscv_ld.sh

可能需要重复运行配置脚本和修复脚本2-3次直到成功。

3.3 编译项目

make vcompile

3.4 运行Hello World仿真

控制台模式运行:

make helloworld.vsimc

GUI模式运行:

make helloworld.vsim

在ModelSim GUI中,执行以下命令查看波形:

add wave /*
run -all

4. 常见问题与解决方案

4.1 DPI相关警告

在GUI模式中可能会看到DPI警告,可以通过修改vsim/tcl_files/config/vsim.tcl解决:

- $VSIM_FLAGS -dpicpppath gcc"
+ $VSIM_FLAGS -dpicpppath /usr/bin/gcc"

4.2 其他测试用例

成功运行Hello World后,可以尝试其他测试用例:

make test_arithmetic.vsim  # 算术测试
make test_io.vsim         # IO测试
make test_interrupt.vsim  # 中断测试

4.3 性能优化技巧

对于大型仿真项目,可以调整以下参数提升性能:

  1. vsim/tcl_files/config/vsim.tcl 中增加优化选项:
    set VSIM_FLAGS "$VSIM_FLAGS -O3"
    
  2. 使用批处理模式减少GUI开销:
    make helloworld.vsimc VSIM_FLAGS="-c -do 'run -all; quit'"
    
  3. 增加仿真内存限制:
    make helloworld.vsim VSIM_FLAGS="-sv_lib libriscv -dpicpppath /usr/bin/gcc -LDFLAGS -Wl,--no-as-needed"
    

5. 高级调试技巧

5.1 波形调试

在ModelSim中,可以通过以下命令增强调试体验:

# 添加所有信号到波形窗口
add wave -r /*

# 设置运行时间
run 100us

# 保存波形配置
do save_wave.do

5.2 代码覆盖率分析

启用代码覆盖率收集:

make helloworld.vsimc VSIM_FLAGS="-coverage"

生成覆盖率报告:

coverage save -onexit coverage.ucdb
coverage report -html -output covhtml

5.3 自定义指令跟踪

对于PULPino的自定义指令,可以添加特殊跟踪:

# 在仿真脚本中添加
when -label instr_trace "instr_valid == '1'" {
    echo "PC: [examine -hex pc] Instr: [examine -hex instr]"
}

6. 项目结构与扩展

PULPino的目录结构说明:

pulpino/
├── rtl/                  # RTL源代码
├── ips/                  # IP核
├── sim/                  # 仿真文件
├── sw/                   # 软件部分
│   ├── apps/             # 应用程序
│   ├── build/            # 构建目录
│   └── cmake/            # CMake配置
└── vsim/                 # ModelSim配置

添加自定义应用程序:

  1. sw/apps/ 下创建新目录
  2. 添加 CMakeLists.txt 和源代码
  3. 在顶层 sw/CMakeLists.txt 中添加引用
  4. 重新构建并仿真
内容概要:本文围绕可变桨叶四旋翼无人机的规范控制与点对点运动模拟展开,重点研究优化推力分配策略在翻转动作中的应用与性能比较。通过Matlab代码实现,构建了四旋翼动力学模型,并设计了多种控制算法以实现精确的姿态调整与轨迹跟踪。研究对比了不同推力分配方案在执行高机动性翻转动作时的稳定性、能耗效率与响应速度,旨在提升无人机在复杂飞行任务中的动态性能与控制精度。该仿真研究为无人机飞控系统的设计与优化提供了理论依据和技术支持。; 适合人群:具备一定自动控制理论基础和Matlab编程能力,从事无人机控制、飞行器动力学或机器人系统研究的科研人员及研究生。; 使用场景及目标:① 实现四旋翼无人机在三维空间中的精确点对点运动控制;② 对比分析不同推力分配策略在执行翻转等高难度动作时的控制效果与能耗表现,优化飞行性能;③ 为无人机自主飞行、特技飞行及复杂环境下的机动控制提供算法验证平台。; 阅读建议:此资源以Matlab仿真为核心,建议读者结合相关控制理论知识,深入理解代码实现细节,重点关注动力学建模、控制律设计与推力分配模块。在学习过程中,应动手调试参数,复现文中翻转动作的仿真结果,并尝试拓展至其他复杂飞行任务,以加深对无人机控制机理的理解。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值