仿真调试说明——摘抄龙芯杯官方文件

1.仿真调试说明

你需要具备以下知识:

  • 仿真工具的使用,比如Vivado的Xsim
  • Verilog的基本语法
    通过本文的学习,你将获得:
  • 各类仿真错误排查的方法
  • CPU逻辑出错的调试指导
  • Verilog 运算符的优先级
1.1 调试指导思想概述

全局上的调试原理是从结果推原因,难点是定位错误的源头。本文档编写采用的调试思路是时间上先定错,空间上再定错。

  • 时间上先定错:在出错的大片时间段里,定位出源头部分,源头部分是一个较小的时间段
  • 空间上再定错:在源头时间段里,查看设计电路的控制部分和数据通路,定位是哪个信号带来的错误,或者是哪几个信号的组合带来的错误,或者是设计上哪里有疏忽带来的错误。
    比如一个设计的CPU在执行测试程序出错了,这个程序是分很多指令的,这些指令是在时间上顺序执行的,我们首先需要找出第一个错误的指令(也就是时间上定位错误),随后在CPU的数据通路和控制信号里定位该指令错误的原因(也就是空间上定位错误)。
    时间上的定位更加困难。
1.2 仿真出错分类
  • 波形出错:从波形图里直接观察,而不需要分析电路设计的功能,就能判断的错,比如波形中信号为“X”。
  • 逻辑出错:波形直接观察很正常,但其电路执行结果不符合预期,属于逻辑出错,比如加法器运行结果不正确
1.3 出错分类一:波形出错
  • 发现信号为“Z”。
    “Z”表示高阻,电路短路了就是显示为高阻,往往是模块调用的信号未连接导致的信号悬空。
    在这里插入图片描述
    编码建议:
  1. 编写时注意代码规范,特别是模块调用时,按接口顺序一一对应
  2. 所有input类接口被调用时不允许悬空
  3. 一旦发现一个信号为“Z”,向前追踪产生该信号的因子信号,看是那个为“Z”,一直追踪下去指导追踪到该模块里的input接口,随后进行修正。
  4. 有可能“Z”,只出现在向量信号里的某几位上,也是一样的追踪,有可能调用时某个接口存在宽度不匹配也会带来“Z”。
  • 发现信号为“X”
    "X"表示不定值,往往是RTL里信号未赋值导致
    在这里插入图片描述
    另外 Vivado 对于多驱动(2个及2个以上电路单元驱动同一信号),仿真时也会产生“X”,先进行综合,观察下Critical warning,此时会爆出多驱动的警告。
    建议:
    针对信号为“X”情况,我们有以下几点建议:
  1. 向前追踪该信号的因子信号,看是那个为“X”,一直追踪下去指导追踪到某个信号未赋值,随后修正。
  2. 如果没有因子为“X”的,则很可能是多驱动导致的,则综合排查Error和Critical warning。
  3. 寄存器型信号如果没有复位值,在复位阶段其他值可能为“X”,这可能并不会带来错误
  4. “X”和“1”进行或运算结果为“1”,“X”和“0”进行或结果为“0”.
  • 波形停止
    波形停止是指仿真停止某一时刻,再也无法前进分毫,而仿真却显示不停地在运行。
    波形停止基本都是由于组合环路导致的,所谓组合环路就是信号A的组合逻辑表达式中某个产生因子为B,而B的组合逻辑表达式中又用到了信号A。仿真器是在每个周期内计算该周期的所有表达式,组合逻辑循环嵌套,带来的是仿真器的循环计算,导致其无法退出该计算,带来波形停止。
    建议
  1. 一旦发现波形停止,先对设计进行综合
  2. 查看综合后产生的Error和Critical warning,并尝试修正。
  • 越沿采样:上升沿采样到被采样数据在上升沿后的值
    在波形出错中,是一个隐藏较深的出错,往往可能会和逻辑出错混在一起。
    越沿采样是指一个被采样的信号在上升沿采样到了其在上升沿的值,一般情况下,认为这是一个错误。
    每一次赋值,分为两步:先计算等式左侧的表达式和赋值给右侧的信号,简记为计算和赋值。在一个上升沿到来时,所有由上升沿驱动的信号按照以下顺序进行处理:
  1. 先处理阻塞赋值,先完成计算和赋值,同一信号完成计算后立马进行赋值。同一always块里的阻塞赋值从上到下按顺序串行执行,不同always块里的阻塞赋值依赖工具实现确定顺序串行执行,一一完成计算和赋值。
  2. 再进行非阻塞赋值的计算。所有非阻塞赋值其等式左侧的值都同时计算好
  3. 上升沿结束时,所有非阻塞赋值同时完成最终的赋值动作。
    建议
  4. 所有always写的时序逻辑只允许采用非阻塞赋值
  5. 一旦发现越沿采样的情况,追踪被采样信号,指导追踪到某一阻塞赋值的信号,随后进行修正。
  • 其他,波形怪异:仿真波形图显示怪异,与设计的电路功能无关的错误
    当出现波形怪异类的错时,需要区分其是仿真工具还是RTL代码出错:
  1. 观察出错的信号,看其生成因子,如果自我判断RTL应该没有,且波形现实却是太怪异,则有可能是仿真工具出错。重启电脑或者重启工程。
  2. 如果无法从波形里区分是什么错误。可以尝试先运行综合,看出综合后的Error、Critical warning和warning。
  3. 经常有一些不符合规范的代码,Vivado也不会报出warning。比如:对input信号进行了赋值,模块调用信号连接错误,reset信号接成了clock信号等等。
1.4 逻辑出错

以数据和控制分开来看,逻辑出错可分为两类:数据通路出错和控制信号出错。其中数据通路通常属于较简单的错,比如加法器算两个加数的和,结果不对;而控制信号往往是设计时的边角问题考虑不周导致的,比如CPU的访存系统出错。

CPU逻辑出错调试

对于流水线CPU需要各流水线信号分组抓出,比如抓出每级流水线里的PC值、指令编码和执行结果。流水级间的进入和退出的控制信号也尤其重要,必须抓出,CPU初期调试往往都是流水线控制出错了。还有顶层总线接口也很重要,一旦取指出错了,或者调试访存指令出错了,就需要关注顶层总线接口上的信号了,CPU后期调试往往都是访存系统出错了。

  • 定位出错时间源头
    定位错误前,需要大家做好以下三项准备:
    首先,需要先理解测试程序的大致行为。理解过程中需要阅读测试程序的源码,CPU设计中会运行的程序有两类:功能测试程序func和性能测试程序coremark、dhrystone等。
    再者,需要对mips汇编和func编译环境有一定了解。我们在功能和性能测试程序的编译环境中会生成如下8个文件,位于编译目录的obj/下。其中test.s是我们调试过程中重点关注的,它对执行程序的每条机器指令进行了反汇编和注释,对我们调试很有帮助。
    在这里插入图片描述
    最后,需要对CPU内部逻辑比较熟悉。
    具体调试时,可以采用以下方案:
  • 在波形最后出错处,确认取回的指令和PC值是对应正确的,也就是确认取值正确,这时需要对照反汇编程序test.s
  • 如果取指不正确,则往前追溯,直到第一个取指正确的地方。追溯的方法也有讲究。追溯过程就是程序不停的压缩,指导找到第一个取值正确的地方,此时往往要用到仿真工具中加标签的方法()。
  • 找到第一个指令正确的地方后,可以先确认该指令执行结果是否正确。随后我们的测试目标是确认时间上的第一个出错的地方是在该指令前还是该指令后。
  • 以上方法是由后往前追,如果追溯过程中发现无法再追了,则可以考虑由前往后追。
定位出错空间源头

空间定错时,需要大家对CPU微架构有更深入的理解。建议大家以空间划分的视角去理解CPU,特别是流水线CPU,每一流水级都是有对应的部件的,应当理解清楚各流水级的划分。
空间定位时,有两种方法:

  • 从CPU流水前端向流水后端排查,确认指令在哪个流水级开始出错。
  • 从CPU流水后端向流水前端排查,确认指令是从哪个流水级出错的。
运算符号优先级

在这里插入图片描述

<think>好的,用户想了解如何通过串口在龙芯2K0300久久派上进行远程调试文件传输。首先,我需要确认串口连接的基本步骤。龙芯2K0300通常使用UART接口,用户需要准备USB转TTL模块,连接正确的引脚,比如TX、RX和GND。然后,在电脑上安装驱动,使用终端工具如PuTTY或Minicom,设置正确的波特率,通常是115200。 接下来是远程调试部分。可能需要使用调试工具如gdb,但串口调试可能需要配置gdbserver,或者直接通过串口进行内核调试。这里需要查证龙芯的具体文档,确认是否支持通过串口进行调试,以及具体的命令和步骤。 然后是文件传输。由于串口本身不支持直接传输文件,常用的方法可能是使用Xmodem、Ymodem或Zmodem协议。需要安装相应的工具,如lrzsz,在Linux系统下使用sz和rz命令发送和接收文件。用户需要在久久派上安装这些工具,并在终端中配置正确的传输协议。 可能还需要考虑权限问题,比如用户是否有权限访问串口设备,是否需要root权限。另外,确认串口设备的名称,比如/dev/ttyUSB0或/dev/ttyS0,以及正确的权限设置,可能需要使用chmod或者将用户加入dialout组。 用户可能会遇到的问题包括连接不稳定、波特率不匹配、文件传输中断等,需要提供一些常见故障排除方法,比如检查接线、确认波特率、重新插拔USB设备等。 还需要考虑操作系统的兼容性,用户是在Windows还是Linux下操作,不同系统下的工具可能不同。例如,Windows下使用PuTTY和Tera Term,而Linux下使用Minicom和picocom。 最后,是否需要编写自动化脚本或配置环境变量来简化流程,比如在.bashrc中添加快捷命令,或者使用脚本自动启动文件传输。 现在需要整理这些步骤,确保逻辑清晰,分点说明,并验证每个步骤的正确性,参考官方文档或可靠来源,确保信息的准确性。可能还需要提供具体的命令示例,比如如何启动minicom,如何发送文件,如何启动调试会话等。</think>### 龙芯2K0300久久派串口远程调试文件传输方法 #### 一、串口连接配置 1. **硬件准备** - 使用USB转TTL模块(如CH340/CP2102),连接久久派的UART引脚: - TX接模块的RX - RX接模块的TX - GND接模块的GND - 供电需独立,避免电流不稳导致通信失败[^1]。 2. **驱动安装与端口识别** - Windows:安装对应USB转TTL芯片驱动,设备管理器中查看端口号(如`COM3`)。 - Linux:自动识别为`/dev/ttyUSB0`,使用`ls /dev/tty*`确认。 3. **终端工具配置** - **Windows推荐工具**: - PuTTY:选择`Serial`模式,设置波特率`115200`,数据位`8`,停止位`1`,无校验。 - Tera Term:支持Zmodem协议传输文件。 - **Linux推荐工具**: ```bash sudo apt install minicom minicom -D /dev/ttyUSB0 -b 115200 ``` #### 二、远程调试方法 1. **内核调试** - 通过UART启动KGDB(需内核支持): - 修改内核启动参数,添加`kgdboc=ttyS0,115200`。 - 调试端使用GDB连接: ```bash gdb vmlinux (gdb) target remote /dev/ttyUSB0 ``` 2. **应用层调试** - 使用`gdbserver`通过串口转发调试信息(需交叉编译工具链): ```bash # 目标板执行 gdbserver /dev/ttyS0 ./your_program # 主机执行 arm-linux-gnueabi-gdb ./your_program (gdb) target remote /dev/ttyUSB0 ``` #### 三、文件传输方法 1. **Zmodem协议传输** - 目标板安装`lrzsz`: ```bash opkg update && opkg install lrzsz ``` - **发送文件到目标板**: ```bash # 主机执行 sz --zmodem filename ``` - **从目标板接收文件**: ```bash # 目标板执行 rz --zmodem ``` 2. **Python脚本传输(备用)** - 使用`pyserial`库编写简单传输脚本: ```python import serial ser = serial.Serial('/dev/ttyUSB0', 115200, timeout=1) # 发送文件 with open('file.txt', 'rb') as f: ser.write(f.read()) # 接收文件 data = ser.read(1024) with open('received.txt', 'wb') as f: f.write(data) ``` #### 四、常见问题排查 - **无响应**:检查TX/RX是否反接,波特率是否一致。 - **传输中断**:降低波特率至`57600`,缩短接线长度。 - **权限不足**:Linux下执行`sudo usermod -aG dialout $USER`并重启。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

疯狂的码泰君

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值