如何将15位CLA测试的VCD波形十六进制显示转为有符号十进制
解决VCD波形显示有符号十进制的问题
VCD文件本身只存储二进制信号数据,显示成十六进制是波形查看工具的默认设置,和你代码里用十进制赋值没关系。下面分工具设置和代码优化两部分解决:
一、直接在波形工具里修改显示格式
GTKWave操作:
- 选中要调整格式的信号(比如A、B、S这类宽位信号)
- 右键点击信号,选择「Data Format」→「Signed Decimal」
- 批量修改的话,在左侧信号树中框选多个信号,重复上述步骤即可
ModelSim/QuestaSim操作:
- 选中目标信号
- 右键点击信号,选择「Format」→「Signed Decimal」
二、代码层面优化(强化有符号语义+辅助验证)
1. 将信号声明为有符号类型
你当前的A、B、S是无符号位宽声明,改成signed类型后,Verilog会明确把它们当作补码有符号数处理,不管是打印还是工具识别都更准确:
module CLA_15bit_tb (); reg signed [14:0] A, B; // 改为signed有符号类型 reg mode; wire signed [14:0] S ; // 改为signed有符号类型 wire Ovf ; wire Cout; CLA_15bit_top dut (A,B,mode,S,Cout,Ovf); // 后续initial块代码保持不变 endmodule
2. 添加打印语句直接输出有符号结果
在仿真日志中打印有符号十进制值,方便和波形对比验证。可以在initial块的每个时间节点后添加打印,或者用always块自动监测信号变化:
比如在initial块里每个#10;后添加一行:
$display("Time=%0t | A=%d, B=%d, mode=%b | S=%d, Cout=%b, Ovf=%b", $time, A, B, mode, S, Cout, Ovf);
也可以单独添加always块实时打印:
always @(A, B, mode, S, Cout, Ovf) begin $display("Time=%0t: A=%d, B=%d, mode=%b | Result: S=%d, Cout=%b, Ovf=%b", $time, A, B, mode, S, Cout, Ovf); end
这样仿真时日志里会直接显示有符号数值,和波形工具的显示相互印证。
额外提醒
15位有符号数的范围是-16384到32767,和你测试用的最大值15'd32767匹配,修改后减法得到的负数也能正确显示为十进制。
内容的提问来源于stack exchange,提问作者Ninasa
相关产品推荐
相关产品推荐

