Verdi 中将 UART 的 tx/rx 波形以 ASCII / 16 进制显示的方法
2026/6/12 21:53:56 网站建设 项目流程

UART 的tx/rx1 位串行信号,波形上只能看到 0/1 翻转,要显示成 ASCII 或 16 进制,需要分情况处理。


一、情况 1:已有 8 位并行数据信号(最简单)

如果设计/TB 中存在并行数据总线(如tx_data[7:0]rx_data[7:0]),直接改显示进制即可:

操作步骤

  1. nWave中把信号拖入波形窗口
  2. 选中信号 → 右键 → Set Radix(设置进制)
  3. 选择:
    • Hexadecimal→ 16 进制显示
    • ASCII→ ASCII 字符显示
右键信号 → Set Radix → ASCII 右键信号 → Set Radix → Hexadecimal

也可以选中信号后用菜单:Waveform → Signal Value Radix → ASCII / Hex

效果

tx_data[7:0] ──┤ 'H' ├──┤ 'e' ├──┤ 'l' ├──┤ 'l' ├──┤ 'o' ├── (ASCII 模式) tx_data[7:0] ──┤ 48 ├──┤ 65 ├──┤ 6c ├──┤ 6c ├──┤ 6f ├── (Hex 模式)

二、情况 2:只有串行 tx/rx 单 bit 信号 —— 用 Protocol Analyzer(推荐)

Verdi 内置Protocol Analyzer(协议分析器),可直接对串行波形做UART 协议解码,自动还原出字节并以 Hex/ASCII 显示。

操作步骤

  1. 打开 nWave,加载波形(fsdb)

  2. 菜单选择:

    nWave → Tools → Protocol Analyzer

    (新版本路径可能是Analyzer → Protocol AnalyzerTools → Transaction → Protocol Analyzer

  3. 新建协议绑定

    • 点击New / Create Protocol
    • 在内置协议库中选择UART
  4. 配置 UART 参数(必须与设计一致):

    参数示例
    Baud Rate(波特率)115200
    Data Bits8
    ParityNone
    Stop Bits1
    极性/起始位标准(起始位 0)
  5. 映射信号

    • 把波形中的tx信号绑定到协议的 TX 通道
    • rx绑定到 RX 通道
  6. 运行解码,Verdi 会在波形窗口生成一条事务流(Transaction Stream)

    • 每个解码出的字节以色块 + 数值显示
    • 右键事务流可切换Hex / ASCII显示

效果示意

tx (串行) ─┐_┌─┐_┌──┐__┌─...(原始 0/1 波形) UART_TX 解码 ──[ 0x48 'H' ]──[ 0x65 'e' ]──[ 0x6C 'l' ]──

注意:Protocol Analyzer 需要相应的 Verdi license 特性,部分精简版可能没有。


三、情况 3:没有 Protocol Analyzer license —— TB 中加监测信号(实用替代)

在 testbench 中写一个简单的 UART 监测器,把串行数据还原成 8 位寄存器,dump 到波形里再设 ASCII radix:

module uart_mon #(parameter BAUD_CYCLE = 868) // 时钟周期数/bit ( input clk, input rx // 接 tx 或 rx 串行线 ); reg [7:0] rx_byte; // ← dump 这个信号,设为 ASCII 显示 reg byte_valid; initial forever begin byte_valid = 0; @(negedge rx); // 等起始位 repeat (BAUD_CYCLE + BAUD_CYCLE/2) @(posedge clk); // 跳过起始位+对准中心 for (int i = 0; i < 8; i++) begin rx_byte[i] = rx; // LSB first repeat (BAUD_CYCLE) @(posedge clk); end byte_valid = 1; @(posedge clk); end endmodule

绑定到 DUT:

uart_mon #(.BAUD_CYCLE(868)) u_tx_mon (.clk(clk), .rx(dut.tx)); uart_mon #(.BAUD_CYCLE(868)) u_rx_mon (.clk(clk), .rx(dut.rx));

仿真后在 nWave 中:

  1. 拖入u_tx_mon.rx_byte
  2. 右键 → Set Radix → ASCII(或 Hexadecimal)

这样波形上就能直接看到'H' 'e' 'l' 'l' 'o'48 65 6C 6C 6F


四、补充技巧

1. 让 ASCII 不可见字符也能显示

ASCII 模式下,不可打印字符(如 0x0A 换行)会显示为转义或点。建议同时拖两份信号,一份设 Hex、一份设 ASCII,对照查看。

2. 信号别名(Alias)

对解码事务/数据信号设置别名便于阅读:

右键信号 → Rename → "TX_CHAR"

3. 保存显示配置

设置好 radix 后保存信号文件(signal file),下次直接恢复:

File → Save Signal File (*.rc)

下次打开:File → Restore Signal File


五、方法对比总结

方法前提难度推荐度
直接设 Radix(ASCII/Hex)有并行 8 位数据信号✓ 首选(有总线信号时)
Protocol Analyzer 解码有相应 license★★✓ 最专业(只有串行线时)
TB 加监测器还原字节可修改 TB★★✓ 通用兜底方案

一句话总结:8 位数据信号直接右键 → Set Radix → ASCII/Hex;纯串行 tx/rx 线则用Tools → Protocol Analyzer选 UART 协议解码(配好波特率),或在 TB 里加个串转并的监测器再设 radix。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询