SystemVerilog Chapter24: Programs

24.1General概述

本条款描述了以下内容:
        --Programs 声明
        --Programs 调度语义
        --与时钟块结合使用的Programs 
        --匿名Programs 

24.2 Overview

        module是设计的基本构建块。module可以包含其他模块、网络、变量、子例程声明以及always过程和initial过程中的过程语句的层次结构。这种结构对于硬件的描述非常有效。然而,对于测试台来说,重点不在于硬件级别的细节,如布线、结构层次和互连,而在于对验证设计的完整环境进行建模。环境必须正确初始化和同步,避免设计和测试台之间的竞争,自动生成输入激励,并重用现有模型和其他基础设施
程序块有以下三个基本用途:
        --它为测试台的执行提供了一个入口点
        --它创建了一个范围,用于封装程序范围内的数据、任务和函数
        --它提供了一个语法上下文,用于指定reactive区域集中的调度
        program构造充当了设计和测试台之间的清晰分隔符,更重要的是,它在程序中声明的所有元素的reactive区域集中指定了专门的执行语义与clocking块一起,程序结构提供了设计和测试台之间的无竞争交互,并实现了循环和事务级别的抽象
        SystemVerilog的抽象和建模结构简化了测试台的创建和维护。实例化和单独连接每个程序实例的能力使它们能够用作通用模型。

24.3 The program construct

        一个典型的program包含类型和数据声明、子例程、到设计的连接以及一个或多个过程代码流。设计和测试台之间的连接使用用于指定端口连接(包括接口)的相同互连机制。program端口声明语法和语义与模块相同(见23.2.2)。
        程序块的语法如下:

program_nonansi_header ::=                 // from A.1.2{ attribute_instance } program [ lifetime ] program_identifier{ package_import_declaration } [ parameter_port_list ] list_of_ports ;
program_ansi_header ::={attribute_instance } program [ lifetime ] program_identifier{ package_import_declaration }[注释1] [ 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 ::=         // from A.1.7port_declaration ;| non_port_program_item
non_port_program_item ::={ attribute_instance } continuous_assign| { attribute_instance } module_or_generate_item_declaration| { attribute_instance } initial_construct| { attribute_instance } final_construct| { attribute_instance } concurrent_assertion_item| timeunits_declaration[注释3]| program_generate_item
program_generate_item[注释5] ::=loop_generate_construct| conditional_generate_construct| generate_region
lifetime ::= static | automatic             // from A.2.1.3
anonymous_program ::= program ; { anonymous_program_item } endprogram // from A.1.11
anonymous_program_item ::=
task_declaration| function_declaration| class_declaration| covergroup_declaration| class_constructor_declaration| ;

1) package_ansi_header、interface_ansi_head或program_ansi-header中的package_import_declaration后面应跟有参数port_list或list_of_port_declarations,或两者兼有。
3) 只有当时间单位声明在同一时间范围内重复并匹配以前的时间单位声明时,时间单位声明才可以作为non_port_module_item, non_port_interface_item, non_port_program_item, 或 package_item合法项。
5)  program_generate_item在program_generate_item之外的program_declaration中包含任何可能是非法的项目都是非法的。

                Syntax 24-1—Program declaration syntax (excerpt from Annex A)

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

14.8和14.9中包含了一个更完整的示例。
        program构造可以被认为是具有特殊执行语义的子叶模块一旦声明,程序块就可以在所需的分层位置(通常在顶层)实例化,并且其端口可以以与任何其他模块相同的方式连接。
      
 program块可以嵌套在模块或接口中。这允许多个协作程序共享作用域的本地变量。没有端口的嵌套 program或未显式实例化的顶层 program将隐式实例化一次隐式实例化的 program具有相同的实例和声明名称。
例如:

module test(...);
int shared; // variable shared by programs p1 and p1program p1;...endprogramprogram p2;...endprogram // p1 and p2 are implicitly instantiated once in module test
endmodule

        程序块可以包含一个或多个inital或final过程。它不应包含always过程、primitives、UDP或模块、接口或其他programs的声明或实例
        当program中的所有initial过程都已结束时,该program应立即终止该程序中initial过程的所有子线程。如果在至少一个程序块中至少有一个initial过程,则在所有程序中源自所有initial过程的所有线程及其所有派生线程结束后,整个仿真应立即通过对$finish系统任务的隐式调用终止
        program中的类型和数据声明是program范围的本地声明,并且具有静态生存期。在program范围内声明的变量,包括声明为端口的变量,称为program变量。类似地,在program范围内声明的网络被称为program网络。program变量和网络统称为program信号。
        与program信号相对的是设计信号。在模块、接口、包或$unit中声明的任何net或变量都被认为是设计信号。引用任何program块外部的program信号都是错误的。层次引用从一个program范围扩展到另一个program作用域是合法的。但是,匿名program不应包含对其他program作用域的层次引用。

24.3.1 Scheduling semantics of code in program constructs(program结构中代码的调度语义)

        program块中对设计信号的变化(例如更新事件)敏感的语句和构造被安排在Reactive区域中。考虑一个包含以下语句的program块 @(clk) S1;其中clk是设计信号。信号clk的每一个转变将导致语句S1被调度到Reactive 区域中。连续赋值赋值tclk=clk;也将安排在Reactive 区域。同样,program块中的initial程序也安排在Reactive 区域中。program块中的标准#延迟操作在Reactive 区域中的流程中恢复。
       program代码中的非阻塞赋值在Re-NBA区域中安排其更新。Re-NBA区域在Reactive和Re-Inactive区域清空事件后进行处理。参见4.2。
        program块中允许并发断言。并发断言具有不变的调度语义——无论是存在于程序代码还是设计代码中。断言总是在处理Preponded区域时对可用值进行采样,并且在处理Observed区域时总是对其进行评估。如果断言是由程序对象上的活动计时的(不推荐),则调度器将从图4-1中围绕外循环设置的反应区域,通过评估断言的观察区域进行迭代。
        一旦program进程启动一个执行线程,该线程中的所有后续阻塞语句都会在Reactive区域中进行调度。这包括线程调用的子例程代码,即使子例程代码是在模块、包或接口中声明的。实际上,在design或testbench继承调用它的线程的调度区域。由于程序代码永远不能被模块代码调用,所以program代码总是作为reactive处理的一部分执行。模块、接口或包范围中的代码可以作为Active区域集或reactive集处理的一部分执行。

24.3.2 Operation of program port connections in the absence of clocking blocks(在没有时钟块的情况下程序端口连接的操作)

        第14章节描述了clocking 块与程序端口的相互作用。clocking 块是在设计和测试台之间建立无竞争行为的重要组成部分。然而,可以构造一个不包含clocking 块的程序。这样的程序在与设计代码交互时更容易发生竞争。本小节定义了在没有时钟块的情况下程序端口与设计代码的交互。
        程序端口是程序范围对象。它们总是连接到设计对象(网络和变量),因为程序只能在设计范围内实例化。程序中声明的顺序代码总是在reactive区域集中执行。因此,程序端口连接的另一侧的变量在 reactive区域集中被更新。类似地,程序端口连接另一侧的网络的驱动和解析也发生在 reactive区域集中。这种驱动和解析在事件导致程序网络上的驱动程序改变之后立即发生。对那些跨区域变量和网络敏感的设计过程被安排在active区域集中唤醒。
        考虑以下设计示例,其中包含设计构造和程序构造:

module m;logic r;wire dw1, dw2;initial beginr = 0;#10 r = 1;end
assign dw1 = r;p p_i(dw2, dw1);always @(dw2)$display("dw2 is %b", dw2);
endmoduleprogram p(output pw2, input pw1);assign pw2 = pw1;
endprogram

        在这种设计中,数据流起源于logic r,并终止于always过程的执行。由于程序p的存在,仿真器有必要在图4-1中的整个循环中执行多次迭代。这是因为程序p中的assign语句在Reactive区域之前不得执行。当它执行并触发模块m中的always过程上的活动时,该always过程直到整个调度循环的下一次迭代中的活动区域才被执行。

24.4 Eliminating testbench races

        SystemVerilog中存在两个主要的不确定性来源。第一种是以任意顺序处理active事件。第二个问题是,行为块中没有时间控制结构的语句不会作为一个事件执行。然而,从测试台的角度来看,这些影响都是不重要的细节。测试台的主要任务是为被测设计生成有效的输入激励,并验证设备是否正确运行。此外,使用循环抽象的测试台只关心系统的稳定或稳定状态,用于检查当前输出和计算下一个循环的激励。形式工具也以这种方式工作。由于程序在reactive区集合中调度事件因此时钟块结构对于自动采样先前时间步长或时钟周期的稳态值非常有用
        仅通过时钟为设计信号的时钟块读取设计值的程序对读写竞争不敏感。重要的是要理解,简单地对输入信号进行采样(或在时钟块输入上设置非零倾斜)并不能消除竞争的可能性正确的输入采样只针对单个时钟块。对于多个时钟,处理重叠或同时时钟的任意顺序仍然是竞争的潜在来源。在处理完所有设计事件(包括由非阻塞分配驱动的时钟)后,程序结构通过在Reactive区调度其执行来解决这个问题

24.5 Blocking tasks in cycle/event mode

        从设计模块内调用程序子程序是非法的,会导致错误。这是因为设计人员不应该知道测试台。允许程序调用其他程序或设计模块中的子例程。设计模块中的函数可以从程序中调用,不需要特殊处理。当从程序调用设计模块中的任务时,它应使用为其调度活动设置的reactive区域。参见24.3.1。

module ...task T;S1: a = b; // executes in reactive region set if called from a program#5;S2: b <= 1'b1; // executes in reactive region set if called from a programendtask
endmodule

        如果从模块内调用上述任务T,则在通过非阻塞分配更新变量b之前,语句S1可以在处理活动区域时立即执行。如果从程序中调用相同的任务,则在处理Reactive区域时应执行语句S1。语句S2也应在Reactive区域中执行,变量b的更新应安排在Re-NBA区域中。

24.6 Programwide space and anonymous programs

        一组程序定义和实例定义了一个只有程序才能访问的程序范围内的数据、任务和函数空间。匿名程序可以在包(见第26条)或编译单元作用域(见3.12.1)中使用,以声明属于程序范围空间的项,而无需声明新的作用域。匿名程序中声明的项与声明它们的包或编译单元作用域共享相同的名称空间
        注意——尽管在匿名程序内声明的标识符不能在任何程序块外引用,但试图在匿名程序块外声明另一个同名标识符将产生错误。这是因为标识符在周围包或编译单元的范围内共享相同的名称空间

24.7 Program control tasks

        除了正常的仿真控制任务($stop和$finish)外,程序还可以使用$exit控制任务。程序块可以通过调用$exit系统任务来显式终止其所有initial过程的线程及其所有子线程。$exit系统任务的语法如下:

$exit();

        从程序块initial过程中产生的线程或其派生线程调用$exit将终止该程序块内的所有initial过程及其派生线程。从不是源于程序中initial过程的线程或其派生线程调用$exit将被忽略,并且可能会发出警告,表明对$exit的调用已被忽略
 


 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/55057.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

BDA初级分析——可视化基础

一、可视化的作用 数据可视化——利用各种图形方式更加直观地呈现数据的过程 可视化的作用 1、更快地理解数据&#xff0c;找出数据的规律和异常 2、讲出数据背后的故事&#xff0c;辅助做出业务决策 3、给非专业人士提供数据探索的能力 数据分析问题如何通过可视化呈现&am…

数据分析基础-数据可视化02-不同数据类型的可视化概念及原则

将数据空间映射到颜色空间。 数据空间&#xff1a;连续或分类 数据可以被划分为两个主要的数据空间&#xff1a;连续数据和分类数据。这两种数据空间有不同的特点和适用的分析方法。 连续数据&#xff08;Continuous Data&#xff09;&#xff1a; 连续数据是指可以在某个范…

Orchestrator介绍二 自身高可用性方案

目录 获得 HA 的方法 一 没有高可用性 &#xff08;No high availability&#xff09; 使用场景 架构组成 架构图 二 半高可用性&#xff08;Semi HA&#xff09; 三 基于共享数据库后端高可用&#xff08;HA via shared backend&#xff09; 四 基于Raft协议高可用 五…

webrtc交叉编译嵌入式的方法

背景是我们有嵌入式的需求&#xff0c;需要编译webrtc进入板子上。先说结论&#xff0c;最后是这样config之后就编译通过的&#xff1a; gn gen out/linux-yeshen --args‘target_os“linux” target_cpu“arm64” ffmpeg_branding“Chrome” proprietary_codecstrue is_debugt…

Tableau可视化入门实践-2

目录 折线图1.导入excel文件数据2.建立折线图并添加标签 双轴折线图 折线图 1.导入excel文件数据 2.建立折线图并添加标签 双轴折线图 行标签拖进两个度量建立上下两个折线图 在第二个折线图纵轴&#xff0c;右键选择“双轴”

【mysql】MySQL服务无法启动 NET HELPMSG 3534

MySQL服务无法启动 NET HELPMSG 3534 错误描述寻找原因解决方法 错误描述 mysql版本&#xff1a;8.1.0 mysql安装成功之后&#xff0c;使用net start mysql来启动mysql&#xff0c;然后出现了报错 MySQL服务无法启动 NET HELPMSG 3534 寻找原因 1、在cmd中&#xff0c;进入…

JWT-Token

一、JWT 需要在 HTTP 这种无状态的机制下&#xff0c;记录下&#xff08;标识&#xff09;出来是不是连续&#xff08;逻辑上的连续&#xff09;的请求。 思路&#xff1a;如果多次请求&#xff0c;携带了相同的标识型数据&#xff0c;则认为是逻辑上连续的。这个标识&#xff…

数据结构(Java实现)LinkedList与链表(下)

** ** 结论 让一个指针从链表起始位置开始遍历链表&#xff0c;同时让一个指针从判环时相遇点的位置开始绕环运行&#xff0c;两个指针都是每次均走一步&#xff0c;最终肯定会在入口点的位置相遇。 LinkedList的模拟实现 单个节点的实现 尾插 运行结果如下&#xff1a; 也…

构建 NodeJS 影院预订微服务并使用 docker 部署(04/4)

一、说明 构建一个微服务的电影网站&#xff0c;需要Docker、NodeJS、MongoDB&#xff0c;这样的案例您见过吗&#xff1f;如果对此有兴趣&#xff0c;您就继续往下看吧。 我们前几章的快速回顾 第一篇文章介绍了微服务架构模式&#xff0c;并讨论了使用微服务的优缺点。第二篇…

uniapp封装ajax请求

import /common/api/interceptor.js; // 引入拦截器文件 export default{common:{baseUrl:"http://localhost:3000/api",data:{},header:{"Access-Control-Allow-Origin":"*","Content-Type":"application/json","Cont…

MacOS软件安装包分享(附安装教程)

目录 一、软件简介 二、软件下载 一、软件简介 MacOS是一种由苹果公司开发的操作系统&#xff0c;专门用于苹果公司的计算机硬件。它被广泛用于创意和专业应用程序&#xff0c;如图像设计、音频和视频编辑等。以下是关于MacOS的详细介绍。 1、MacOS的历史和演变 MacOS最初于…

Linux 计算机网络基础概论

一、网络基本概念 1、网络 网络是由若干节点和连接这些结点的链路组成&#xff0c;网络中的结点可以是计算机、交换机、路由器等设备。通俗地说就是把不同的主机连接起来就构成了一个网络&#xff0c;构成网路的目的是为了信息交互、资源共享。 网络设备有&#xff1a;交换机…

ctfshow-web-红包题第六弹

0x00 前言 CTF 加解密合集CTF Web合集 0x01 题目 0x02 Write Up 首先跑一下字典&#xff0c;这里用的dirmap,可以看到有一个web.zip 下载下来之后发现是一个网站备份&#xff0c;备份的是check.php.bak 然后接着看&#xff0c;可以看到这里不太可能是sql注入&#xff0c;有…

centos7安装nacos

解决 Nacos 国内下载速度缓慢的问题 方案 1. 选择相应的版本源码下载 1.1 依次点击 1、2、3 选中我们的最新稳定版本 1.4.0 1.2 点击下载 ZIP、或者 clone 也行&#xff0c;这里都可以 2. 本地编译 2.1 预备环境准备 2.2 解压编译 3. 启动验证 3.1 解压 3.2 启动服务器 3…

k8s service (三)

K8s service (三) LoadBalancer类型的Service LoadBalancer和NodePort其实是同一种方式&#xff0c;目的都是向外暴露一个端口&#xff0c;区别在于LoadBalancer会在集群的外部再来做一个负载均衡设备&#xff0c;而这个设备需要外部环境支持的&#xff0c;外部服务发送到这…

excel 分组排序

excel中会遇到对不同分组数据进行排序&#xff0c;比如对于不同班级里的学生按照分数高低进行升序排序&#xff0c;可以采用如下公式 SUMPRODUCT((A$2:A$12A2)*(C$2:C$12>C2))1 如果需要 进行降序排序&#xff0c;将公式中的大于号替换为小于号即可

Cinema 4D软件安装包分享(附安装教程)

目录 一、软件简介 二、软件下载 一、软件简介 Cinema 4D&#xff08;简称C4D&#xff09;是由德国Maxon Computer公司开发的一款三维动画渲染和建模软件&#xff0c;广泛应用于影视、广告、工业设计等领域。C4D因其高效率、易用性和强大的功能而受到广大设计师和艺术家的青睐…

vue 实现word文档页面内预览docx-preview 和 vue-office

1.先下载引入 npm i docx-preview --save import { renderAsync } from docx-preview;2.使用 fetch(url) .then((response) > {let docData response.blob(); //将文件转换成bolb形式//选择要渲染的元素let childRef document.getElementsByClassName("childRef&qu…

npm下载最后会卡顿很长时间

npm下载最后会卡顿很长时间 这几天在使用npm下载东西时会出现&#xff0c;快结束了&#xff0c;但是进度条就是卡在那&#xff0c;要等好久才能下载完 解决办法 换阿里云的源 更换源&#xff1a;npm config set registry https://registry.npmmirror.com/ 查看源&#xff…

SQL Server软件安装包分享(附安装教程)

目录 一、软件简介 二、软件下载 一、软件简介 SQL Server是一种关系型数据库管理系统&#xff0c;由美国微软公司开发。它被设计用于存储、管理和查询数据&#xff0c;被广泛应用于企业级应用、数据仓库和电子商务等场景。 以下是SQL Server软件的主要特点和功能&#xff1…