Verilog宏文本如何分词?预处理阶段宏文本歧义解析问询
IEEE 1800-2017标准下Verilog宏预处理与数字词法解析的疑问
根据IEEE 1800-2017标准,Verilog的词法分析存在上下文依赖性,尤其在数字处理上表现明显。举个例子:
// 数字后接标识符——任务`f`的延迟调用 # 1f; // 数字后接空语句 #'h 1f;
这里的f是否属于前置数字令牌的一部分,完全取决于该数字前是否带有'h这类基数标识。
但预处理阶段的上下文并不总是清晰的,比如下面这段代码的输出应该是什么?
module m; initial begin `define Y(f) 1f $display('h `Y(c)); end endmodule
宏文本里的1f到底该被解析为两个独立令牌(f作为宏参数被替换为c,最终等效于输出'h1c对应的数值),还是单个数字令牌(宏参数未被使用,最终等效于输出'h1f对应的数值)?
结论
按照IEEE 1800-2017的预处理规则,宏参数的匹配是基于令牌识别的。在宏定义\define Y(f) 1f中,由于没有基数前缀,词法分析会将1识别为数字令牌,f识别为标识符令牌——这个f正好匹配宏参数f。因此调用`Y(c)时,1f中的f会被替换为c,展开后代码变为$display('h 1c);。后续词法分析会将'h1c解析为一个十六进制数字,最终$display`会输出该数字的十进制值28。
内容的提问来源于stack exchange,提问作者avakar
相关产品推荐
相关产品推荐

