12.5 Hierarchical names (层次化名称)

news2024/11/19 23:19:00

        Verilog HDL描述中的每个标识符应具有唯一的分层路径名。模块的层次结构和项目的定义(如模块内的任务和命名块)应定义这些名称。名称的层次结构可以被视为树结构,其中每个模块实例、生成块实例、任务、函数或命名的begin-end 或者 fork-join块在树的特定分支中定义一个新的层次结构或范围。
        设计说明包含一个或多个顶层模块(见12.1.1)。每个这样的模块构成了名称层次结构的顶部。此根或这些并行根模块构成设计描述或描述中的一个或多个层次结构。在任何模块内,每个模块实例(包括阵列实例)、生成块实例、任务定义、函数定义以及命名的begin-end 或者 fork-join块都应定义层次结构的新分支。
        命名块内以及任务和功能内的命名块应创建新分支。未命名的生成块是例外。它们创建仅在块内以及块实例化的任何层次结构内可见的分支。未命名生成块的讨论见12.4.3。分层名称树中的每个节点应是与标识符相关的单独范围。特定标识符在任何范围内最多只能声明一次。关于范围规则的讨论,请参见12.7;关于命名空间的讨论,参见4.11。
        通过串联模块名称、模块实例名称、生成块、任务、函数或包含它的命名块,任何命Verilog对象或分层名称引用都可以以其完整形式唯一引用。应使用句点字符分隔层次结构中的每个名称,但嵌入层次结构名称引用中的转义标识符除外,转义标识符后面是由空格和句点字符组成的分隔符。任何对象的完整路径名应从顶级(根)模块开始。此路径名可以在层次结构中的任何级别或并行层次结构中使用。路径名中的第一个节点名也可以是层次结构的顶部,该层次结构从使用路径的级别开始(这允许并允许向下引用项)。自动任务和函数中声明的对象是例外,不能通过层次结构名称引用访问。在未命名的生成块中声明的对象也是例外。它们只能由块内以及块实例化的任何层次结构中的层次结构名称引用。
    
    层次路径名中引用实例数组或循环生成块的名称后面可以紧跟方括号中的常量表达式。此表达式选择数组的特定实例,因此称为实例选择。表达式的计算结果应为数组的合法索引值之一。如果数组名称不是层次结构名称中的最后一个路径元素,则需要实例选择表达式。分层路径名的语法在语法12-6中给出。

escaped_identifier ::= (From A.9.3)
    \ {Any_ASCII_character_except_white_space} white_space  
hierarchical_identifier ::= 
    { identifier [ [ constant_expression ] ] . } identifier
identifier ::=
      simple_identifier 
      | escaped_identifier
simple_identifier ::= [ a-zA-Z_ ] { [ a-zA-Z0-9_$ ] }  
white_space ::= (From A.9.4)
    space | tab | newline | eof

                                Syntax 12-6—Syntax for hierarchical path names
例如:
示例1-本示例中的代码定义了模块实例和命名块的层次结构。

module mod (in);
input in;
always @(posedge in) begin : keep 
    reg hold;
    hold = in;
  end
endmodule

module cct (stim1, stim2); 
    input stim1, stim2;
    // instantiate mod
    mod amod(stim1), bmod(stim2);
 endmodule

module wave;
reg stim1, stim2;
cct a(stim1, stim2); // instantiate cct
initial begin :wave1
    #100 fork :innerwave
        reg hold;
        join
    #150 begin
        stim1 = 0;
    end
  end
endmodule

图12-1说明了Verilog代码中隐含的层次结构。

                                        Figure 12-1—Hierarchy in a model
图12-2是代码中定义的所有对象名称的分层形式列表。
wave                                                                                         wave.a.bmod
wave.stim1                                                                                wave.a.bmod.in
wave.stim2                                                                                wave.a.bmod.keep
wave.a                                                                                       wave.a.bmod.keep.hold
wave.a.stim1                                                                             wave.wave1
wave.a.stim2                                                                             wave.wave1.innerwave
wave.a.amod                                                                            wave.wave1.innerwave.hold
wave.a.amod.in
wave.a.amod.keep wave.a.amod.keep.hold
         层次化名称引用允许从分层结构中的任何级别自由访问任何对象。如果项目的唯一分层路径名已知,则可以从描述中的任何位置对其值进行采样或更改。
示例2—下一个示例显示了一对命名块如何引用彼此内部声明的项。

begin
    fork :mod_1
        reg x;
        mod_2.x = 1;
    join
        fork :mod_2
        reg x;
        mod_1.x = 0;
    join
end

12.6 Upwards name referencing(向上名称引用)
        模块或模块实例的名称足以识别模块及其在层次结构中的位置。较低级别的模块可以引用层次结构中位于其上方的模块中的项。如果知道更高级别模块的名称或其实例名称,则可以引用变量。对于任务、函数、命名块和生成块,Verilog应在封闭模块中查找名称,直到找到名称或到达层次结构的根。它只能在更高的封闭模块中搜索名称,而不是实例。
语法12-7给出了向上引用的语法。

upward_name_reference ::= 
    module_identifier.item_name
item_name ::=
    function_identifier 
    | block_identifier
    | net_identifier
    | parameter_identifier 
    | port_identifier
    | task_identifier
    | variable_identifier

Syntax 12-7—Syntax for upward name referencing
向上的名称引用也可以使用以下形式的名称进行:

scope_name.item_name

其中scope_name是模块实例名称或生成块名称。这种形式的名称应按如下方式解析:
a) 在当前作用域中查找名为scope_name的作用域。如果找不到,并且当前作用域不是模块作用域,请在封闭作用域中查找该名称,根据需要重复,直到找到该名称或到达模块作用域。如果仍未找到,则继续执行步骤b)。否则,该名称引用应视为名称所在范围的向下引用。
b) 在父模块的最外层作用域中查找名为scope_name的作用域。如果找到,则应从该范围中解析项目名称。
c) 重复步骤b),向上进入层次结构。

对于defparam语句左侧的分层名称,这些规则有一个例外。详见12.8。
例如:在本例中,有四个模块,a、b、c和d。每个模块包含一个整数i。模型层次结构这一部分中的最高级别模块是a和d。模块b有两个副本,因为模块a和d实例化了b。有四个c.i副本,因为b的两个副本中的每一个都实例化了c两次。

module a;
integer i;
b a_b1();
endmodule

module b;
integer i;
c b_c1(), b_c2();
initial                      
    #10 b_c1.i = 2;        // a.a_b1.b_c1.i, d.d_b1.b_c1.i
endmodule

module c;
    integer i;
    initial begin
        i = 1;
        b.i = 1;
    end
endmodule

module d;
    integer i;
    b d_b1();
    initial begin       // full path name references each copy of i
        a.i = 1;        d.i = 5;
        a.a_b1.i = 2;           d.d_b1.i = 6;
        a.a_b1.b_c1.i = 3;     d.d_b1.b_c1.i = 7;
        a.a_b1.b_c2.i = 4;    d.d_b1.b_c2.i = 8;
    end
endmodule




 

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

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

相关文章

【Git】一文带你入门Git分布式版本控制系统(简介,安装,Linux命令)

Git 系列文章目录 文章目录Git 系列文章目录一、前言二、安装 Git三、基本 Linux 命令一、前言 [ 什么是Git?] Git 是一个开源的分布式版本控制系统,可以有效、高速地处理从很小到非常大的项目版本管理。【百度百科】 Git 是分布式版本控制系统&#…

Scratch、Python、C++,谁才是少儿编程的第一选择?

前言 面对市面上形形色色的编程语言类型,经常有家长犯难问我们该如何为孩子选择合适的课程: “那种拖块看起来像玩游戏,不如 Python、C 这样的代码编程语⾔⾼级。” “现在是人工智能时代,直接让孩子从Python学习,以…

【0147】当参数shared_memory_type分别为sysv和mmap时,差异为何如此大?

文章目录 1. sysv和mmap差异如此大2. 底层原理2.1 创建匿名mmap()共享内存段2.2 确定huge page大小2.3 创建ipcs看见的64字节shared memory1. sysv和mmap差异如此大 在【0145】postmaster创建System V shared memory默认值大小(2)一文中的第1节里,我有给出过当postgresql.c…

Hystrix 请求合并、请求隔离、优化

文章目录请求合并引入依赖启动类 加注解EnableHystrixservice服务测试请求隔离线程池隔离&#xff08;大部分情况下&#xff09;信号量隔离线程池隔离演示引入依赖启动类 加注解EnableHystrixservice服务测试信号量隔离演示Hystrix的其他用法请求合并 引入依赖 <dependenc…

linux文件的隐藏属性

1.查看隐藏属性 lsattr 查看文件隐藏属性 lsattr -d 查看目录隐藏属性 lsattr -a 显示隐藏文件隐藏属性 lsattr -R 连同子目录的数据也一并列出来 2.修改隐藏属性 chattr 修改隐藏属性 属性A &#xff1a;当设定了 A 这个属性时&#xff0c;若你有存取此文件(或目录)时&a…

ACM-BCB2019 | SMILES-BERT:基于大规模无监督预训练的分子属性预测模型

原文标题&#xff1a;SMILES-BERT: Large Scale Unsupervised Pre-Training for Molecular Property Prediction 链接&#xff1a;https://doi.org/10.1145/3307339.3342186 一、问题提出 分子指纹&#xff1a;可用于分子性质分类、回归或生成新分子等各种应用。传统的分子指纹…

【强化学习论文合集】IJCAI-2022 强化学习论文 | 2022年合集(五)

强化学习(Reinforcement Learning, RL),又称再励学习、评价学习或增强学习,是机器学习的范式和方法论之一,用于描述和解决智能体(agent)在与环境的交互过程中通过学习策略以达成回报最大化或实现特定目标的问题。 本专栏整理了近几年国际顶级会议中,涉及强化学习(Rein…

设计模式之美——单一职责原则和开闭原则

“看懂”和“会用”是两回事&#xff0c;而“用好”更是难上加难。 SOLID 原则&#xff1a; SRP单一职责原则&#xff08;the single responsibility principle &#xff09; OCP开闭原则&#xff08;the open closed principle&#xff09; LSP里氏替换原则&#xff08;the l…

【HMS Core】School Diary应用集成多个HMS Core服务,更好的体验华为生态系统

一、介绍 总览 通过建立本次的School Diary应用&#xff0c;您可以更好地体验华为生态系统的组成部分&#xff0c;包括认证服务、云存储和云数据库等Serverless服务。此外您还可以了解到如何使用账号服务集成应用登录功能。老师和学生两种角色的匹配过程是本应用的一大特色。…

SpringCloud微服务(九)——Ribbon负载均衡

Ribbon负载均衡服务调用 SpringCloud 已停更 github官网&#xff1a;https://github.com/netflix/ribbon Spring Cloud Ribbon是一个基于HTTP和TCP的客户端负载均衡工具&#xff0c;它基于Netflix Ribbon实现。通过Spring Cloud的封装&#xff0c;可以让我们轻松地将面向服务…

高斯分布的乘积与卷积

高斯分布是一个很重要的连续分布形式&#xff0c;频繁出现各种应用场景里也可以导出很多分布&#xff0c;如在典型的线性回归中对误差 的建模就是用的标准正态分布&#xff0c;统计学的学生分布就是从正态分布中导出。随着贝叶斯统计学的广泛应用&#xff0c;相乘的高斯分布&am…

【仿真建模】第四课:AnyLogic入门基础课程 - 轨道交通仿真入门讲解

文章目录一、轨道库的概念和特点二、轨道交通仿真三、更换车头和车身样式一、轨道库的概念和特点 二、轨道交通仿真 新建模型 搭建轨道 定义轨道上的起点和终点 拖拽出一个trainSource&#xff0c;设置其车厢数量为4&#xff08;默认为11&#xff0c;车厢太多会超出轨道&…

nginx(六十)proxy模块(一)proxy_pass指令

一 proxy模块处理请求的流程 ① 流程图 说明&#xff1a; nginx从client接收的是http协议,转发给上游的也是http协议备注&#xff1a; 后续根据处理请求的流程,来讲解相关指令 二 proxy_pass ① 基本解读 说明&#xff1a; proxy_pass是一个动作指令 ② proxy_pass的…

【题型总结】找到第n个自定义数 | 丑数系列 + 神奇数字

文章目录找到第n个自定义数丑数【LC263】丑数Ⅱ【LC264】优先队列多指针超级丑数【LC313】优先队列【超时】多指针第N个神奇数字【LC878】找规律二分查找数学丑数Ⅲ【LC1201】二分查找数学总结找到第n个自定义数 因为神奇数字做了相关的题目&#xff0c;个人建议做题顺序&…

涨知识!Python 的异常信息还能这样展现

【导语】&#xff1a;在日常开发的过程中&#xff0c;当代码报错时&#xff0c;我们通常要不断打印、阅读traceback提示信息&#xff0c;来调试代码&#xff0c;这篇文章介绍了如何实现一个Exception Hooks&#xff0c;使得traceback模块的提示信息更加精确&#xff1b;同时还介…

java项目-第159期ssm超市管理系统_ssm毕业设计_计算机毕业设计

java项目-第159期ssm超市管理系统-ssm毕业设计_计算机毕业设计 【源码请到资源专栏下载】 今天分享的项目是《ssm超市管理系统》 该项目分为2个角色&#xff0c;管理员、员工。 员工登录后台主要负责商品的出入库&#xff0c;以及个人事项办理&#xff0c;比如&#xff1a; 上…

技术分享| 快对讲视频调度功能说明

随着计算机技术的日趋成熟&#xff0c;融合调度方案已经在行业信息化中普及&#xff0c;由于近几年实时音视频能力的提升&#xff0c;融合调度中的视频调度方案也在往实时性、高清方向靠拢。快对讲视频调度正是结合了视频监控&#xff0c;以及实时通信的特性&#xff0c;在市面…

传奇GOM引擎单机架设图文教程

T:准备下载好服务端&#xff08;版本&#xff09;gom引擎架设 选择GOM引擎版本 注;版本可以去论坛有免费&#xff0c;电脑还需要下载安装好客户端。 1.首先下载好版本后会有2个压缩包&#xff0c;一个是版本&#xff0c;一个是补丁&#xff0c; 简单来说架设分三部&#xff1…

Scrum 四个会议的正确召开方式

敏捷开发有一些重要的实践方法&#xff0c;可以帮助团队更快地适应敏捷开发框架。这些方法不能简单照搬执行&#xff0c;比如&#xff0c;只在瀑布开发模式下中加入 Scrum 的四个会议&#xff0c;这无法让瀑布团队转成敏捷团队。敏捷转型需要深入理解概念和思维&#xff0c;团队…

【Linux】第十四章 多线程(生产者消费者模型+POSIX信号量)

&#x1f3c6;个人主页&#xff1a;企鹅不叫的博客 ​ &#x1f308;专栏 C语言初阶和进阶C项目Leetcode刷题初阶数据结构与算法C初阶和进阶《深入理解计算机操作系统》《高质量C/C编程》Linux ⭐️ 博主码云gitee链接&#xff1a;代码仓库地址 ⚡若有帮助可以【关注点赞收藏】…