SystemVerilog实现指定长度带填充字符的整数转字符串函数问询
SystemVerilog实现指定长度和填充字符的整数转字符串函数
不用折腾底层字节级操作,靠$sformatf结合动态构造格式字符串就能搞定你的需求,完全贴合你习惯的VHDL风格。
实现思路
SystemVerilog的格式化函数支持动态指定宽度,还能通过格式控制符指定填充字符:
- 若填充字符是
0,用%0*d格式:*表示宽度由后续参数传入,0指定填充0 - 若填充字符是空格,用
%*d格式:默认填充空格,同样用*动态指定宽度
我们只需要根据传入的填充字符,生成对应的格式字符串,再传给$sformatf就能得到目标结果。
完整函数代码
function string to_string(int value, int width, byte fill_char); string fmt_str; // 校验填充字符合法性 if (fill_char != " " && fill_char != "0") begin $error("填充字符只能是空格或0"); return ""; end // 构造格式字符串 if (fill_char == "0") begin fmt_str = "%0*d"; end else begin fmt_str = "%*d"; end // 调用$sformatf生成指定格式的字符串 to_string = $sformatf(fmt_str, width, value); endfunction
调用示例
initial begin string result; // 示例:12转5位0填充字符串 result = to_string(12, 5, "0"); $display(result); // 输出:00012 // 测试空格填充:12转5位空格填充字符串 result = to_string(12, 5, " "); $display("|%s|", result); // 输出:| 12| end
额外说明
- 函数默认支持负数转换,比如
to_string(-12,5,"0")会输出-0012,如果需要调整负数的显示格式,可以在构造格式串时额外处理 - 注意宽度要大于等于整数的实际位数(包含负号),否则
$sformatf会直接输出完整数字,忽略指定的宽度限制
内容的提问来源于stack exchange,提问作者gyuunyuu
相关产品推荐
相关产品推荐

