返回介绍

第十六章 程序块

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

主题
主题描述
16.1 简介(一般信息)模块是基本的Verilog构造块。模块可以包含其它模块的实例、线网、任务和函数声明、以及always块和initial块中的过程语句。这种结构非常适合于硬件的描述。然而,对测试平台来讲,其重点不是硬件级的细节(例如线网、结构化层次、以及互连),而是建模设计验证的完整环境。为了获得被正确初始化和同步的环境、避免设计与测试平台间的竞争、自动化输入激励的产生、以及复用现存的模型和其它构架,我们需要耗费很大的努力。

程序块能够实现三个基本的目标:

  1. 它提供了测试平台执行的入口点。
  2. 它产生了一个封装程序级数据的范围。
  3. 它提供了一个语境来说明Reactive区域中的调度。

程序结构在设计和测试平台间建立了一个清晰的分割,并且更为重要的是,它为程序中声明的所有元素在Reactive区域中说明了特定的执行语义。与时钟控制块一起,程序为设计和测试平台间提供了无竞争的交互,并形成了周期和事务级的抽象。

SystemVerilog的抽象和建模结构简化了测试平台的产生和维护。实例化以及单独连接每一个程序实例的能力使得它们能够作为通用模块使用。

16.2 程序结构一个典型的程序包含类型和数据声明、子例程、设计的连接、以及一个或多个过程化的代码流。设计和测试平台间的连接使用与SystemVerilog说明端口连接(包括接口)相同的互连机制。程序块的语法如下:
16.3 多个程序SystemVerilog允许具有任意数目的程序定义或实例。程序可以是完全独立(没有程序间的通信)的,也可以是协同操作的。通过使用嵌套的块、包、或层次化引用来共享数据,或者在对应的程序块内部声明数据(使其成为私有的),通信的程度是可以控制的。
16.4 消除测试平台的竞争在Verilog中具有两个主要的不确定性源。第一个是激活的事件以一个任意的顺序处理。第二个是行为块中没有时间控制结构的语句不会作为一个事件执行。然而,从测试平台的角度看,这些影响都是并不重要的细节问题。测试平台的主要任务是为被测设计产生有效的输入激励,并验证被测设计是否能够正确地操作。此外,对于使用周期抽象的测试平台而言,无论是检查当前的输出还是为下一个周期计算激励,它仅与系统的稳态相关。形式工具也已这种方式工作。

在敏感于设计信号(在模块内声明而不是程序块)变化(例如更新事件)的程序块中的语句在Reactive区域被调度。考虑一个包含@(clk)语句的程序块,其中clk是某个模块中的一个设计信号。clk信号的每一个跃变都会引起语句S1被调度到Reactive区域。同样,程序块中的initial块也在Reactive区域被调度;相反,模块中的initial块则在Active区域被调度。另外,从程序内驱动的设计信号必须使用无阻塞赋值进行赋值并且在NBA区域被更新。因此,即使无延时驱动的信号也会作为一个事件被传递到设计。使用这个行为,正确的周期语义可以无竞争地被建模;因此使得基于程序的测试平台能够与周期控制的断言和形式工具相兼容。

由于程序在Reactive区域调度事件,因此时钟控制块结构对于自动地采样前一个时间步值或时钟周期的稳态值非常有用。专门通过具有#0输入时滞的时钟控制模块读取设计值的程序对于读-写竞争是不敏感的。值得注意的是:简单地采样输入信号(或者在时钟控制块输入上设置非零时滞)不会消除潜在的竞争。正确的输入采样仅仅解决了单个的时钟控制块。对于多个时钟,交叠或同时的时钟以任意顺序处理仍然是一个潜在的竞争源。通过在所有的设计事件被处理了之后(包括被无阻塞赋值驱动的时钟),在Reactive区域调度其执行,程序结构解决了这方面的问题。
16.5 阻塞周期/事件模式下的任务在设计模块内部调用程序任务或函数是非法的并且会导致一个错误。这是因为设计不必敏感于测试平台。SystemVerilog允许程序调用位于其它程序或位于设计模块内部的任务和函数。设计模块内部的函数可以从一个程序中被调用,并且不要求特殊的处理。然而,从一个程序中调用的位于设计模块内部的阻塞任务(一个没有在0仿真时间执行的任务)在从任务返回时却要求显式的同步。也就是说,当阻塞任务返回到程序代码的时候,程序块的执行被自动挂起直到Reacive区域。参数的拷贝发生在任务返回的时候。

在从程序内部调用设计模块中的阻塞任务时需要特别小心。在第一个时序控制上阻塞之前被任务计算的表达式应该使用它们已经被无阻塞赋值更新后的值。相反,如果在时间步值的起始处(在无阻塞赋值被处理之前)从一个模块中调用任务的话,那么那些相同的表达式应该使用它们被无阻塞赋值更新之前的值。
16.6 程序控制任务除了通常的仿真控制任务($stop和$finish)外,一个程序可以使用$exit控制任务。
链接 主题

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

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

发布评论

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