Verdi 中将 UART 的 tx/rx 波形以 ASCII / 16 进制显示的方法

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 Bits 8
    Parity None
    Stop Bits 1
    极性/起始位 标准(起始位 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。

相关推荐
爱漂流的易子2 年前
VCS和Verdi联合仿真使用学习记录
linux·vcs·verdi
仰天倀笑2 年前
【个人笔记】如何使用Verdi
笔记·数字ic设计·verdi