【问题标题】:Verilog module orderVerilog 模块顺序
【发布时间】:2020-05-12 05:05:59
【问题描述】:

门级 Verilog 文件的语法是否正确,子模块是在所属模块之后定义的,还是应该在之前定义的?根据 Verilog 规则是否重要?

问候,

【问题讨论】:

    标签: verilog


    【解决方案1】:

    这可能取决于编译器,但如果您使用的工具支持 SystemVerilog(目前大多数商业工具都支持),那么以任何顺序定义模块在语法上应该是正确的,甚至可能在单独的文件中。

    有关详细信息,请参阅IEEE Std 1800-2012,第 3.12 节。

    请注意,在编译之后,还有一个称为详细说明的步骤。此时所有模块描述都应该已正确编译。来自 SystemVerilog LRM:

    编译是读入SystemVerilog源代码,解密加密代码,分析源代码语法的过程 和语义错误。实现可以在一个或一个中执行编译 更多的传球。实现可以将编译结果保存在 专有的中间格式,或者可以传递编译结果 直接进入精化阶段。不是所有的语法和语义都可以 在编译过程中检查。只能做一些检查 在阐述过程中或完成时。

    SystemVerilog 支持单文件和多文件编译 通过使用编译单元(见 3.12.1)。

    细化是 将构成设计的组件绑定在一起的过程。 这些组件可以包括模块实例、程序实例、 接口实例、检查器实例、原始实例和 设计层次结构的顶层。解析后进行细化 源代码和仿真前;它涉及扩展 实例化,计算参数值,解析层次结构 名称,建立网络连接和一般准备 模拟设计。

    【讨论】:

      【解决方案2】:

      简短的回答是您可以在 Verilog 中转发引用模块;情况一直如此,并且不依赖于工具(换句话说,您可以按 either 顺序执行此操作)。如果您使用库和配置可能会出现复杂情况,但一般来说,您可以假设您可以在定义模块之前对其进行实例化。

      在大多数 Verilog 中,您必须在引用之前声明某些内容。有一些例外,包括任务和函数调用、隐式连线、跨模块/分层引用和模块名称。在这些情况下,该工具会等到详细说明才能找到引用的对象。不幸的是,在 LRM 中没有明确的解释。这就是 Verilog-XL 的做法,从那以后其他人都这样做了。

      请注意,这与“门级”文件无关。

      【讨论】:

        【解决方案3】:

        根据 Verilog LRM 中定义的规则,模块、函数和任务是唯一可以在声明之前引用的东西。 SystemVerilog 将接口和程序添加到该列表中。 Verilog 还隐式声明了网络,这使得您似乎在声明网络之前引用了它,但我强烈建议不要通过使用编译指令``default_nettype none 来使用该功能。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2023-03-29
          • 1970-01-01
          相关资源
          最近更新 更多