返回介绍

16.2 程序结构

发布于 2020-09-09 22:55:53 字数 2249 浏览 1039 评论 0 收藏 0

一个典型的程序包含类型和数据声明、子例程、设计的连接、以及一个或多个过程化的代码流。设计和测试平台间的连接使用与SystemVerilog说明端口连接(包括接口)相同的互连机制。程序块的语法如下:

program_nonansi_header ::=            // 引用自附录A.1.3
    {attribute_instance} program [lifetime] program_identifier
        [parameter_port_list] list_of_ports;

program_ansi_header ::=
    {attribute_instance} program [lifetime] program_identifier
        [parameter_port_list] [list_of_port_declarations];

program_declaration ::=
    program_nonansi_header [timeunits_declaration] {program_item}
        endprogram [: program_identifier]
  | program_ansi_header [timeunits_declaration] {non_port_program_item}
        endprogram [: program_identifier]
  | {attribute_instance} program program_identifier(.*);
        [timeunits_declaration] {program_item}
    endprogram [: program_identifier]
  | extern program_nonansi_header
  | extern program_ansi_header

program_item ::=               // 引用自附录A.1.7
    port_declaration;
  | non_port_program_item

non_port_program_item ::=
    {attribute_instance} continuous_assign
  | {attribute_instance} module_or_generate_item_declaration
  | {attribute_instance} specparam_declaration
  | {attribute_instance} initial_construct
  | {attribute_instance} concurrent_assertion_item
  | {attribute_instance} timeunits_declaration18

lifetime ::= static | automatic    // 引用自附录A.2.1.3

语法16-1 — 程序声明语法(摘录自附录A)

例如:

program test (input clk, input [16:1] addr, inout [7:0] data);
    initial ...
endprogram

或者

program test (interface device_ifc);
    initial ...
endprogram

一个更完整的例子包含在15.7节和15.8节中。

尽管程序结构是SystemVerilog的新结构,然而包含程序却是一个自然的扩展。程序结构可以被看作是一个具有特殊执行语义的叶子模块。一旦被声明,一个程序块可以在需要的层次位置(典型情况位于顶层)中被实例化,并且它的端口可以以任意其它模块相同的方式被连接。

程序块可以在模块或接口内部嵌套。这就使得多个协同操作的程序能够共享作用范围内的本地变量。没有端口的嵌套程序或者没有被显式实例化的顶层程序被隐含地实例化一次。被隐含地实例化的程序具有相同的实例和声明名字。例如:

module test(...)
    int shared; // 被程序p1和p2共享的变量

    program p1;
        ...
    endprogram

    program p2;
        ...
    endprogram // 在模块test中,p1和p2被隐含地实例化一次
endmodule

一个程序块可以包含一个或多个initial块,但不能包含always块、UDP、模块、接口或其它程序。

程序内的类型和数据声明对于程序作用范围来讲是本地的并具有静态的生命周期。非程序变量只能使用无阻塞赋值进行赋值。对程序变量使用无阻塞赋值或对设计变量(非程序变量)使用阻塞赋值都应该是一个错误。从程序块外部引用程序变量也是错误的。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文