我有一个客户,他有一个Verilog 2012文件(他隐式地声称是有效的),该文件包含一个包含非ascii字符(该文件是Unicode)的文字字符串。
原文节选:
case(field_name)
...
"afe_cmn_clkgen_reg2[cmn_sris_ena_nt]" : begin descr = "Enables SRIS generation in CMN.n0 – SRIS generation disabledn1 – SRIS generation enabled"; found = 1; end
...
"dash"后复合材料 n0"实际上是Unicode十六进制#2013 (EM Dash)。
Verilog参考手册坚持字符串文字内容为"ASCII字符"。本文摘自Verilog 2012标准文档的A.8.8节:
Strings string_literal::= "{Any_ASCII_Characters} ">
我找不到任何其他(在Web上)讨论Unicode如何与Verilog一起使用的内容。
谁能在Verilog中找到Unicode的章节文档?
是一些Verilog工具将读取Unicode源文件的情况下?他们如何处理非ascii字符?(在SO中找到的一些答案似乎暗示它们在非ascii字符上阻塞)。
来自IEEE Std 1800-2017, section 5.9字符串字量:
字符串字面值是由双引号括起来的字符序列(").
非打印字符和其他特殊字符前加a反斜杠。
你的代码包含一个非打印字符(n
)。
Std没有提到"unicode"任何地方。虽然本节提到了ASCII字符,但它并不坚持字符串字面值必须只由ASCII字符组成。
相同的部分声明:
在表达式和赋值中用作操作数的字符串字面值应被视为由序列表示的无符号整数常量8位ASCII值,一个8位ASCII值表示1性格。
如果显示该变量,则不同模拟器的输出可能不同。我在EDA Playground上运行这段代码,得到了不同的结果:
module tb;
string descr;
initial begin
descr = "Enables SRIS generation in CMN.n0 – SRIS generation disabledn1 – SRIS generation enabled";
$display(descr);
end
endmodule
Cadence产生如下输出:
Enables SRIS generation in CMN.
0 ? SRIS generation disabled
1 ? SRIS generation enabled
Aldec产生了这个:
# KERNEL: Enables SRIS generation in CMN.
# KERNEL: 0 – SRIS generation disabled
# KERNEL: 1 – SRIS generation enabled
所有的模拟器都允许字符。您看到的可能也取决于您的操作系统。这个字符是合法的(从代码编译没有错误的意义上说),但我建议避免使用它。