换行符在Verilog编译器指令中何时具有重要意义



我正在尝试解析包括Verilog编译器指令在内的Verilog代码。我的解析器目前坚持这样的指令通常以换行符结尾,例如

`ifdef foo <newline>

这是由于早期Verilog标准中没有对编译器指令进行任何讨论;指令可以出现在源";,我发现的所有例子都没有违反这个规则。考虑到编译器指令可以说是受到";C";,而C的指令必须以换行符结尾,这似乎是合理的。

我在一个开源规范中遇到了以下一行CPU,我相信它是经过彻底测试的(即有效的(代码:

`ifdef PR_ERROR if ($time > 1 && rst_l) `PR_ERROR("dmu_ilu_cib_addr_decode",`MON_ERROR,"ERROR: Instance ID for module dmu_ilu_cib_csr is bad"); `endif

注意PR_ERROR后面没有换行。这合法吗?

IEEE1800-2012 Verilog标准文档有点难以理解。

第639页显示

只有空白或注释可以出现在`include编译器指令。

因此,标准显然坚持使用换行符来表示"include"。

对于其他编译器指令,没有类似的语句。特别是,第685页讨论了`ifdef`else`elsif`endif,只说:

这些指令可能出现在源代码描述中的任何位置。

如果人们认为标准是明确定义的,不被禁止的是允许的,人们可能会认为,此类指令不需要换行符。我很高兴看到一个章节和诗句引用是明确的。

不管怎样,编译器实际接受什么?

尽管1800-2017 LRM的22.6`ifdef,`else,`elsif,`endif,`ifndef部分说";这些指令可能出现在源描述中的任何位置&";,该部分的其余部分根据";行的组";。对该部分的严格解释意味着在一行上不允许以下内容:

`ifdef A initial $display("A"); `else initial $display("not A"); `endif

然而,所有工具似乎都支持这一点。

但与其他编译器指令的交互可能会为的模糊性留下空间

`ifdef A `define X 2 `endif

如果未定义A,则是宏的`endif部分未编译,还是`ifdef的末尾?

因此,我的建议是将条件编译指令保留在单独的行中。

相关内容

  • 没有找到相关文章

最新更新