在Quartus中正确使用SystemVerilog $display生成格式化消息
Quartus中SystemVerilog $display的正确使用方式
在Questa环境下,以下代码可正常格式化输出64位整数:
localparam uint64_t timeout_active = integer'(500e-6 / (g_clockPeriod * 1e-9)); $display(g_instance_name, ": Timeout to get 500us active time is %0d clock cycles", timeout_active);
输出结果:
# motor: Timeout to get 500us active time is 25000 clock cycles
但在Quartus编译时,%0d格式化规则会被忽略,uint64_t(本质为logic [63:0]向量类型)会被显示为二进制,普通整数和实数的格式化也失效。针对该问题,正确的使用方式如下:
显式转换向量为整数类型:Quartus的
$display对logic向量默认按二进制解析,需将64位向量显式转换为无符号长整型(longint unsigned),确保工具识别为整数类型。修改示例:localparam uint64_t timeout_active = integer'(500e-6 / (g_clockPeriod * 1e-9)); $display("%s: Timeout to get 500us active time is %0d clock cycles", g_instance_name, longint unsigned'(timeout_active));匹配格式化符与数据类型:对于64位无符号整数,也可使用标准格式化符
%lu,同样能让Quartus正确输出十进制数值:$display("%s: Timeout to get 500us active time is %lu clock cycles", g_instance_name, longint unsigned'(timeout_active));优先使用标准语法:
%0d是Questa的工具扩展语法,Quartus对其支持有限,建议使用SystemVerilog标准格式化符配合显式类型转换,保证跨工具兼容性。
内容的提问来源于stack exchange,提问作者David Belohrad
相关产品推荐
相关产品推荐

