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。