门级Verilog文件的语法是否正确,其中子模块是在拥有模块之后定义的,还是应该在之前定义?根据Verilog规则是否重要?
此致
答案 0 :(得分:2)
正如工具提到的那样,这可能是编译器依赖的,但是如果你使用的是支持SystemVerilog的工具(现在大多数商业工具都会这样做),那么在任何顺序定义模块,甚至在单独的文件中,都应该在语法上正确。
有关详情,请参阅IEEE Std 1800-2012,第3.12节。
请注意,在编译之后,还有另一个名为详细说明的步骤。此时所有模块描述都应该已正确编译。来自SystemVerilog LRM:
编译是读取SystemVerilog源代码,解密加密代码以及分析源代码以获取语法的过程 和语义错误。实现可以在一个或中执行编译 更多传球。实现可以将编译结果保存在 专有中间格式,或者可以通过编译结果 直接进入精化阶段。并非所有语法和语义都可以 在编译过程中检查。有些检查只能进行 在完成细化期间或完成时。
SystemVerilog支持单文件和多文件编译 通过使用编译单元(见3.12.1)。
精化是 将构成设计的组件绑定在一起的过程。 这些组件可以包括模块实例,程序实例, 接口实例,检查器实例,原始实例和 设计层次结构的顶层。解析后进行详细说明 源代码和模拟前;它涉及扩大 实例化,计算参数值,解析分层 名称,建立网络连接和一般准备 模拟设计。
答案 1 :(得分:1)
简短的回答是你可以在Verilog中转发模块;这一直是这种情况,并且不依赖于工具(换句话说,您可以 顺序执行)。如果使用库和配置可能会有复杂性,但通常,您可以假设您可以在定义模块之前对其进行实例化。
在Verilog的大部分内容中,您必须在引用之前声明一些内容。有一些例外,包括任务和函数调用,隐式连线,跨模块/分层引用和模块名称。在这些情况下,该工具会一直等到详细说明以找到引用的对象。遗憾的是,在LRM中没有明确的解释。这就是Verilog-XL的做法,从那以后其他所有人都做到了。
请注意,这与“门级”文件无关。
答案 2 :(得分:1)
根据Verilog LRM中定义的规则,模块,函数和任务是在声明之前可以引用的唯一内容。 SystemVerilog将接口和程序添加到该列表中。 Verilog还隐式声明了网络,使得它似乎在声明之前引用了网络,但我强烈建议不要使用编译指令``default_nettype none
来使用该功能。