You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.16 01:34:52