UART 的tx/rx是1 位串行信号,波形上只能看到 0/1 翻转,要显示成 ASCII 或 16 进制,需要分情况处理。
一、情况 1:已有 8 位并行数据信号(最简单)
如果设计/TB 中存在并行数据总线(如tx_data[7:0]、rx_data[7:0]),直接改显示进制即可:
操作步骤
- 在nWave中把信号拖入波形窗口
- 选中信号 → 右键 → Set Radix(设置进制)
- 选择:
- 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 显示。
操作步骤
打开 nWave,加载波形(fsdb)
菜单选择:
nWave → Tools → Protocol Analyzer(新版本路径可能是
Analyzer → Protocol Analyzer或Tools → Transaction → Protocol Analyzer)新建协议绑定:
- 点击New / Create Protocol
- 在内置协议库中选择UART
配置 UART 参数(必须与设计一致):
参数 示例 Baud Rate(波特率) 115200 Data Bits 8 Parity None Stop Bits 1 极性/起始位 标准(起始位 0) 映射信号:
- 把波形中的
tx信号绑定到协议的 TX 通道 - 把
rx绑定到 RX 通道
- 把波形中的
运行解码,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 中:
- 拖入
u_tx_mon.rx_byte - 右键 → 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。