Verilog基础:层次化标识符的使用

相关阅读

Verilog基础icon-default.png?t=O83Ahttps://blog.csdn.net/weixin_45791458/category_12263729.html?spm=1001.2014.3001.5482


一、前言

        Verilog HDL中的标识符(identifier)是一个为了引用而给一个Verilog对象起的名字,分为两大类:普通标识符大类和层次化标识符大类。普通标识符大类又可以分为简单标识符和转义标识符,详情见下面的博客。

Verilog基础:简单标识符和转义标识符-CSDN博客文章浏览阅读647次,点赞25次,收藏20次。标识符(identifier)是一个为了引用而给一个对象起的名字。一个标识符可以是一个简单标识符,也可以是一个转义标识符。本文将对两者进行详细阐述。_转义标识符veriloghttps://blog.csdn.net/weixin_45791458/article/details/140436528?ops_request_misc=%257B%2522request%255Fid%2522%253A%25226813B559-9D37-4969-810B-88F9A143E446%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fblog.%2522%257D&request_id=6813B559-9D37-4969-810B-88F9A143E446&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~blog~first_rank_ecpm_v1~rank_v31_ecpm-1-140436528-null-null.nonecase&utm_term=%E6%A0%87%E8%AF%86%E7%AC%A6&spm=1018.2226.3001.4450        一般情况下我们只会接触到简单标识符,但是有些时候(如验证设计时),层次化标识符也会被使用,本文目的是为需要使用层次化标识符的设计人员提供一定参考。

二、层次化标识符的起源

        模块、任务、函数、命名块和生成块的定义引入了命名空间(模块命名空间、块命名空间和生成块命名空间),详情见下面的博客。

Verilog基础:八种命名空间(定义命名空间、文本宏命名空间、模块命名空间,块命名空间、生成块命名空间、端口命名空间、specify块命名空间、属性命名空间)详解(上)-CSDN博客文章浏览阅读1k次,点赞44次,收藏24次。Verilog有八个标识符命名空间:其中两个是全局的(定义命名空间和文本宏命名空间),六个是局部的(模块命名空间,块命名空间、生成块命名空间、端口命名空间、specify块命名空间、属性命名空间)。_verilog 过程块命名https://blog.csdn.net/weixin_45791458/article/details/142132358?spm=1001.2014.3001.5501        命名空间的层次化结构可以被视为树结构,其中每个模块(实例)、任务、函数、命名块和生成块在树的特定分支中定义了新的层次,而一个普通标识符在一个层次中最多只能声明一次(需要特别注意的是,层次化标识符不能用来声明)。任何非匿名的对象都可以通过若干直接或间接包含它的模块(实例)名、任务名、函数名、命名块名和生成块名进行引用(在本文中,“**名”和“名字”这种表述指的是普通标识符)

三、层次化标识符的语法

        图1是层次化标识符的BNF范式(语法),有关BNF范式相关内容,可以参考下面的文章。

Verilog基础:巴科斯范式(BNF)-CSDN博客文章浏览阅读556次,点赞14次,收藏40次。最后一个范式定义了variable_lvalue可以是hierarchical_variable_identifier加上可选的[]包围的多个数组表达式索引,以及可选的最后的[]包围的位选或域选表达式,variable_lvalue还可以是使用拼接运算符{}连接起来的多个variable_lvalue(递归定义自己)。第三个范式定义了第一个范式中的delay_or_event_control,为delay_control或event_control或使用repeat语句的event_control。_bnf veriloghttps://blog.csdn.net/weixin_45791458/article/details/132567389?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522F7990A6B-6C1B-4DA7-98FC-0BEFAC7FAAA8%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fblog.%2522%257D&request_id=F7990A6B-6C1B-4DA7-98FC-0BEFAC7FAAA8&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~blog~first_rank_ecpm_v1~rank_v31_ecpm-1-132567389-null-null.nonecase&utm_term=BNF&spm=1018.2226.3001.4450 

图1 层次化标识符的语法

        层次化标识符由若干由句点.分隔的普通标识符组成,其中只有最左边的普通标识符可以是一个模块名,如果层次化标识符中包含实例数组名或循环生成块名,则该名后要有内含常量表达式的方括号组成,这表示选择实例数组或循环生成块的一个特定实例,一个完整的层次化标识符应该从顶层(根)模块名开始写起,因此它对于每个对象而言唯一的。

        例1给出了一个层次化设计的Verilog代码,其中包括三个模块:mod、cct和wave,图2给出了这个层次化设计的树形结构。 

// 例1
module mod(in);input in;always @(posedge in) begin: keepreg hold;hold = in;end
endmodule//***********************************module cct(stim1, stim2);input stim1, stim2;mod amod(stim1), bmod(stim2);
endmodule//***********************************module wave;reg stim1, stim2;cct a(stim1, stim2);initial begin: wave1#100 fork: innerwavereg hold;joinend
endmodule

图2 例1的树形结构

        例2给出了这个层次设计中所有对象的完整层次化标识符。

// 例2
wave                       // 模块的完整层次化标识符
wave.stim1                 // reg信号的完整层次化标识符
wave.stim2                 // reg信号的完整层次化标识符
wave.a                     // 模块实例的完整层次化标识符
wave.a.stim1               // reg信号的完整层次化标识符
wave.a.stim2               // reg信号的完整层次化标识符
wave.a.amod                // 模块实例的完整层次化标识符
wave.a.amod.in             // wire信号的完整层次化标识符
wave.a.amod.keep           // 命名块的完整层次化标识符
wave.a.amod.keep.hold      // reg信号的完整层次化标识符
wave.a.bmod                // 模块实例的完整层次化标识符
wave.a.bmod.in             // wire信号的完整层次化标识符
wave.a.bmod.keep           // 命名块的完整层次化标识符
wave.a.bmod.keep.hold      // reg信号的完整层次化标识符
wave.wave1                 // 命名块的完整层次化标识符
wave.wave1.innerwave       // 命名块的完整层次化标识符
wave.wave1.innerwave.hold  // reg信号的完整层次化标识符

四、层次化标识符的引用位置

        普通标识符(除任务、函数外)要求引用位置在定义位置后,例3给出了一个错误的引用方式。

// 例3
module example;initial beginstim1 = 1'b0; // 编译错误,引用位置在定义位置前stim2 = 1'b1; // 编译错误,引用位置在定义位置前endreg stim1, stim2;
endmodule

        任务名和函数名则没有这个要求,如例4所示。

// 例4
module example;initial begin$display("Sum is: %d", add(2, 3)); endfunction integer add;input integer a, b;beginadd = a + b;endendfunction
endmodule

        如果使用层次化标识符,则所有对象都没有这个要求,如例5所示,因为层次名解析是在elaboration阶段进行而不是在编译阶段进行。 

// 例5
module example;initial beginexample.stim1 = 1'b0; // 没有问题example.stim2 = 1'b1; // 没有问题endreg stim1, stim2;
endmodule

五、不完整的层次化标识符

        使用完整的层次化标识符简单直观,但当层次结构复杂起来时,完整的层次化标识符便显得十分臃肿,此时可以使用不完整的层次化标识符,即层次化标识符不从顶层(根)模块名开始写起。

        不完整的层次化标识符的语法和图1所示的一样,但是此时不要求最左边的普通标识符是顶层(根)模块名,它可以是模块(实例)名、任务名、函数名、命名块名和生成块名。

        不完整的层次化标识符解析遵循一定的规则,如下所示:

        1、首先在层次化标识符引用位置的命名空间中尝试匹配层次化标识符,匹配指的是从层次化标识符最左边的普通标识符开始依次匹配后续的所有普通标识符,如果匹配失败且当前命名空间不是模块命名空间,则在上层命名空间中尝试匹配层次化标识符,以此类推直到匹配成功或到达模块命名空间。例6展示展示了不完整的层次化标识符的使用方式。

// 例6
module example;initial begin: block1reg x, y;x = 1;y = 0;begin: block1reg x;x = 0;$display("x = %b", block1.x);  // 输出:x = 0$display("y = %b", block1.y);  // 输出:y = 0endend
endmodule

        2、在规则1中在到达模块命名空间后,如果匹配仍然失败,则会在父模块的模块命名空间(最外层)尝试匹配层次化标识符。

        在父模块的模块命名空间内匹配时会有一个例外,那就是首先将层次化标识符最左边的普通标识符与模块名匹配,如果成功则将其视为子模块实例名(指直接或间接包含的子模块实例);如果匹配失败再尝试匹配其他名字(用于实例化的模块名可以与模块命名空间中的名字重名),如例7所示。

// 例7
module top;example example_1(1);     // 对于实例example_1中的$display,它输出1example example_2(0);     // 对于实例example_2中的$display,它输出0initial begin: examplereg x;x = 1'bx;               // 优先搜索模块名,因此这个x没有被引用end
endmodulemodule example(input a);reg x;initial begin#1;x = a;$display("x = %b", example.x);  // 对于实例example_1中example相当于example_1;对于实例example_2中的example相当于example_2。end
endmodule

        3、如果在父模块的模块命名空间中的匹配全部失败了,则重复规则2直到顶层(根)模块,如果顶层(根)模块的模块命名空间也是失败的,则它会被视为一个完整的层次化标识符

        没错,其实完整的层次化标识符的解析也可以认为是遵守这个规则的,可以视为一层一层向上匹配但全部匹配失败,直到最后在假象的顶层(根)模块的父模块中匹配成功。

        善于思考的你可能会提出问题,那岂不是会出现拦截问题,比如顶层(根)模块的模块命名空间中的一个名字可能会因为在向上匹配的过程中被提前匹配而无法被引用到,这是对的!如例8所示。

// 例8
module top;reg x = 0;example example_0();initial begin: topreg x;x = 1;end
endmodulemodule example();initial begin#1 $display("x = %b", top.x);  // 输出:x = 1,这种情况下,此处无法引用到顶层(根)模块命名空间中的xend
endmodule

        为了克服这个问题,后面的SystemVerilog标准提出了$root,本文就不对此进行详述了。

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

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

相关文章

HarmonyOS NEXT 应用开发实战(六、组件导航Navigation使用详解)

在鸿蒙应用开发中,Navigation 组件是实现界面间导航的重要工具。本文将介绍如何使用 Navigation 组件实现页面跳转及参数传递,确保你能轻松构建具有良好用户体验的应用。 当前HarmonyOS支持两套路由机制(Navigation和Router)&…

字典学习算法

分为固定基字典和学习型字典 学习型字典 是指通过训练大量与目标数据相似的数据,学习其特征获得的字典。字典学习主要包括两个阶段,一个是字典构建阶段,一个是利用字典进行样本表示阶段。 首次提出:最优方向法(Method …

Euporie 是一款功能强大、使用便捷的终端 Jupyter 交互工具,让Jupyter Notebook在终端下运行

在现代数据科学领域,Jupyter Notebook 已成为不可或缺的工具,它以其强大的交互性、可读性和可移植性而闻名。然而,在某些场景下,例如远程服务器、容器环境或仅仅个人偏好,使用终端进行操作更便捷。 Euporie 应运而生&a…

spring day 1021

ok了家人们,这周学习spring框架,我们一起去看看吧 Spring 一.Spring概述 1.1 Spring介绍 官网: https://spring.io/ 广义的 Spring : Spring 技术栈 (全家桶) 广义上的 Spring 泛指以 Spring Framework…

STM32L010F4 最小系统设计

画一个 STM32L010F4 的测试板子...... by 矜辰所致前言 最近需要用到一个新的 MCU: STM32L010F4 ,上次测试的 VL53L0X 需要移植到这个芯片上,网上一搜 STM32L010F4,都是介绍资料,没有最小系统,使用说明等。…

在VMware上创建虚拟机以及安装Linux操作系统,使用ssh进行远程连接VMware安装注意点 (包含 v1,v8两张网卡如果没有的解决办法)

一,VMware上创建虚拟机 1.VMware下载 1)点击VMware官网进入官网 网址:VMware by Broadcom - Cloud Computing for the EnterpriseOptimize cloud infrastructure with VMware for app platforms, private cloud, edge, networking, and security.https…

NAT工作原理详解:网络地址转换的关键角色

NAT工作原理详解:网络地址转换的关键角色 在现代计算机网络中,网络地址转换(NAT)扮演着至关重要的角色。它不仅仅是简单地将私有IP地址转换为公共IP地址,而是在多个方面保证了网络的正常运行和安全性。本文将详细讲解…

从网络请求到Excel:自动化数据抓取和保存的完整指南

背景介绍 在投资和财经领域,论坛一直是投资者们讨论和分享信息的重要平台,而东方财富股吧作为中国最大的财经论坛之一,聚集了大量投资者实时交流股票信息。对于投资者来说,自动化地采集这些发帖信息,并进行分析&#…

Maven私服架构

目录 1.maven私服介绍 1.1 私服介绍 1.2 Nexus介绍 2. maven私服实战 2.1 nexus安装 2.2 nexus仓库类型 2.3 将项目发布到私服 2.4 从私服下载jar包 2.5 将第三方jar包发布到私服 1.maven私服介绍 1.1 私服介绍 正式开发时,不同的项目组开发不同的工程。m…

《深度学习》 了解YOLO基本知识

目录 一、关于YOLO 1、什么是YOLO 2、经典的检测方法 1)one-stage单阶段检测 模型指标介绍: 2)two-stage多阶段检测 二、关于mAP指标 1、概念 2、IOU 3、关于召回率和准确率 4、示例 5、计算mAP 一、关于YOLO 1、什么是YOLO YOL…

一文2500字从0到1实现压测自动化!

大家好,我是小码哥,最近工作有点忙,一直在实现压测自动化的功能,今天来分享一下实现思路 我所在的业务线现在项目比较少了,所以最近一个月我都没有做业务测试,需求开发完后RD直接走免测就上线,…

手机ip切换成全局模式怎么弄

在当今数字化时代,智能手机已成为我们日常生活中不可或缺的一部分,无论是工作、学习还是娱乐,都离不开它的陪伴。随着网络技术的不断发展,手机IP地址的切换技术也逐渐走进大众视野,中,“全局模式” 作为IP切…

windows环境下vscode编写c语言连接mysql

创建一个文件夹test02 在文件夹中创建test.c文件 用vscode打开test02文件夹 自动生成tasks.json和launch.json文件,需要安装这里通C/C Runner插件来自动生成json文件和一些文件夹。 接下来配置mysql 本地已经安装了mysql数据库,此安装过程省略。 有…

java如何部署web后端服务

java如何部署web后端服务 简单记录一下,方便后续使用。 部署流程 1.web打包 2.关掉需要升级的运行中的服务 /microservice/hedgingcustomer-0.0.1-SNAPSHOT/conf/bin/ 执行脚本 sh shutdown.sh 3.解压文件 返回到/microservice 将升级包上传到该路径&#x…

JAVA IDEA 取消掉Warning:(22, 14) Class ‘XXXController‘ is never used 提示信息

方法一:代码修改 无用的方法: 删除对应的代码。增加该类对应的应用实现。 方法二:取消掉提示 找到settings—Editor—Inspections,搜索Unused declaration 右边的勾取消掉,对应的校验属性。

座舱软件开发“道与术”

脑图 仅仅个人归纳见解,欢迎专家莅临指导。

【CHI】CHI协议自问自答

学习CHI有一段时间了,如今回过头来,再读协议,一些问题做个记录。如果有错误的地方,欢迎指正。如果有其他的问题,也欢迎留言讨论。 spec: IHI0050F_amba_chi_architecture_spec 【持续更新ing】 目录 1. …

react18中如何实现同步的setState来实现所见即所得的效果

在react项目中,实现添加列表项,最后一项自动显示在可视区域范围!! 实现效果 代码实现 import { useState, useRef } from "react"; import { flushSync } from "react-dom"; function FlushSyncRef() {con…

JVM成神之路

目录 JVM入门关: 一:JVM的内存布局是咋样的? 二:方法区,永久代,元空间有什么区别? 三:常量池和字符串常量池有什么区别? 四:什么是堆溢出,什…

结构化系统分析,结构化系统设计(正片)

结构化分析方法:是面向数据流进行需求分析的方法,是用抽象模型的概念,按软件内部数据传递、变换的关系,自顶向下逐层分解,直到找到满足功能要求的所有可实现的软件为止。 数据流图(DFD)&#xf…