如何在Icarus Verilog中拼接字符串?移植Cadence兼容代码报错
Icarus Verilog编译SystemVerilog字符串打印任务报错解决
我编写了一个用于拼接输入字符串并打印错误消息的SystemVerilog任务,在Cadence工具中可正常运行,但移植到Icarus Verilog(版本12.0 stable (s20221226-238-g9e4c4d546))时出现编译错误。
原代码如下:
task Error ( input string msg, input string name = "" ); begin $timeformat(-9, 2, " ns", 12); name = (name.len() > 0) ? {_ModuleName(name), ": "} : ""; $display(" Error: at %0t: %0s%0s", $time, name, msg); end endtask
报错信息:error: Data types string and bool of ternary do not match.
问题原因
Icarus Verilog对SystemVerilog三元表达式的类型检查比Cadence更严格。原代码中三元表达式的两个分支类型不匹配:{_ModuleName(name), ": "}是字符串类型,但空字符串""被iverilog识别为布尔类型,触发类型不兼容报错。
解决方法
显式保证三元表达式两个分支的类型统一为字符串:
方法1:类型转换空字符串
task Error ( input string msg, input string name = "" ); begin $timeformat(-9, 2, " ns", 12); name = (name.len() > 0) ? {_ModuleName(name), ": "} : string'(""); $display(" Error: at %0t: %0s%0s", $time, name, msg); end endtask
方法2:用字符串拼接确保类型
task Error ( input string msg, input string name = "" ); begin $timeformat(-9, 2, " ns", 12); name = (name.len() > 0) ? {_ModuleName(name), ": "} : {"", ""}; $display(" Error: at %0t: %0s%0s", $time, name, msg); end endtask
这样修改后,两个分支都明确为字符串类型,能够通过Icarus Verilog的编译检查。
内容的提问来源于stack exchange,提问作者meteowrite
相关产品推荐
相关产品推荐

