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: keep
        reg 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: innerwave
            reg hold;
        join
    end
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 begin
        stim1 = 1'b0; // 编译错误,引用位置在定义位置前
        stim2 = 1'b1; // 编译错误,引用位置在定义位置前
    end
    reg stim1, stim2;
endmodule

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

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

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

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

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

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

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

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

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

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

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

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

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

module 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: top
      reg x;
      x = 1;
    end
endmodule

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

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【OpenCV】人脸识别方法

代码已上传GitHub:plumqm/OpenCV-Projects at master EigenFace、FisherFace、LBPHFace 这三种方法的代码区别不大所以就一段代码示例。 EigenFace与FisherFace 1. 将人脸图像展开为一维向量,组成训练数据集 2. PCA(EigenFace)或…

Spring MVC 原理与源码

Spring MVC 整体代码量有 5w 行,通过本专栏,可以快速的研读核心部分的代码,节省你的时间。 DispatcherServlet 的流程处理如下图: 但是随着前后端分离,后端大多提供 Restful API ,里面的 ViewResolver 和 …

word怎么清除格式,Word一键清除所有格式教程

你是否曾在编辑Word文档时遇到过复制内容时格式混乱的情况?别担心,这只需要清除一下格式就可以了,很多朋友还不知道word怎么清除格式,下面小编就来给大家讲一讲word一键清除所有格式的方法教程,操作非常简单,有需要的…

02电力电子技术简介

电力电子技术简介 第一章主要是做通识性的介绍,介绍电力电子涉及的基本概念、学习方法和关联学科。最重要的是希望大家能理解电力电子在现实生活中的广泛应用。这一章简介主要分三部分来介绍。首先是概要性的通盘介绍。然后会通过力电子技术性的内容来了解一些拓扑…

用Python将Office文档(Word、Excel、PowerPoint)批量转换为PDF

在处理不同格式的Office文档(如Word、Excel和PowerPoint)时,将其转换为PDF格式是常见的需求。这种转换不仅确保了文件在不同设备和操作系统间的一致性显示,而且有助于保护原始内容不被轻易修改,非常适合于正式报告、提…

InnoDB引擎(架构,事务原理,MVCC详细解读)

目录 架构分析 逻辑存储结构​ 内存结构​ Buffer Pool​ ChaneBuffer 自适应哈希​ LogBuffer​ 磁盘结构​ 后台线程​ 事务原理​ redolog日志 undolog日志​ MVCC​ 三个隐藏字段​ undolog版本链 readview​ RC(读已提交原理分析)​ RR(可重复读原理分析…

yolov8-ultralytics-利用TP、TN、FP、FN添加mIoU指标

在文件ultralytics/utils/metrics.py中的ConfusionMatrix类里 tp_fp 函数下方添加函数tp_fp_fn: def tp_fp_fn(self):"""Returns true positives, false positives and false negative."""tp self.matrix.diagonal()fp self.matri…

深入理解计算机系统--计算机系统漫游

对于一段最基础代码的文件hello.c&#xff0c;解释程序的运行 #include <stdio.h>int main() {printf ( "Hello, world\n") ;return 0; }1.1、信息就是位上下文 源程序是由值 0 和 1 组成的位&#xff08;比特&#xff09;序列&#xff0c;8 个位被组织成一组…

HCIA复习实验

实验要求 实验拓扑以及实验分析 第一步先划分网段 先对内网划分 192.168.1.0/24划分 192.168.1.0/26---骨干主线路 192.168.1.64/26---骨干备线路 ---192.168.1.128/25--vlan2 3汇总---便于减少路由表条目---在大型网络方便 192.168.1.128/26---vlan2 192.168.1.192/26---vla…

OpenCV视觉分析之运动分析(2)背景减除类:BackgroundSubtractorKNN的使用

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 K-最近邻&#xff08;K-nearest neighbours, KNN&#xff09;基于的背景/前景分割算法。 该类实现了如 319中所述的 K-最近邻背景减除。如果前景…

-webkit-box-orient属性丢失?

在实际项目场景当中&#xff0c;我们经常会遇到需要对超长文本溢出省略的场景&#xff1a; 我们经常会这样写—— 单行省略&#xff1a; overflow: hidden; //文本溢出隐藏text-overflow: ellipsis; //文本溢出显示省略号white-space: nowrap; //不换行 多行省略&#xff1a…

VUE3.0基础入门笔记

一、响应式基础 1.ref()&#xff1a;声明基本类型,引用类型&#xff0c;函数需接收参数&#xff0c;并将其包裹在一个带有 .value 属性的对象中&#xff0c;在模板中使用 ref 时&#xff0c;我们不需要附加 .value,当在模板中使用时&#xff0c;ref 会自动解包。 <templat…

计算机毕业设计 基于 Python的考研学习系统的设计与实现 Python毕业设计选题 前后端分离 附源码 讲解 文档

&#x1f34a;作者&#xff1a;计算机编程-吉哥 &#x1f34a;简介&#xff1a;专业从事JavaWeb程序开发&#xff0c;微信小程序开发&#xff0c;定制化项目、 源码、代码讲解、文档撰写、ppt制作。做自己喜欢的事&#xff0c;生活就是快乐的。 &#x1f34a;心愿&#xff1a;点…

CISP/NISP二级练习题-第一卷

目录 另外免费为大家准备了刷题小程序和docx文档&#xff0c;有需要的可以私信获取 1&#xff0e;不同的信息安全风险评估方法可能得到不同的风险评估结果&#xff0c;所以组织 机构应当根据各自的实际情况选择适当的风险评估方法。下面的描述中错误的是 &#xff08;&#…

【Linux】进程的挂起状态

挂起状态的前提条件 当 内存资源严重不足 时&#xff0c;操作系统会考虑将部分进程换出到磁盘上的交换空间&#xff08;swap 分区&#xff09;。这通常发生在以下几种情况下&#xff1a; 内存不足&#xff1a; 当物理内存接近耗尽时&#xff0c;操作系统会选择将一部分暂时不需…

明源云ERP报表服务GetErpConfig.aspx接口存在敏感信息泄露

一、漏洞简介 在访问 /service/Mysoft.Report.Web.Service.Base/GetErpConfig.aspx?erpKeyerp60 路径时&#xff0c;返回了包含敏感信息的响应。这些信息包括但不限于数据库连接字符串、用户名、密码、加密密钥等。这些敏感信息的暴露可能导致以下风险&#xff1a;数据库访问…

Linux 常用命令(一)

目录 ll命令&#xff1a;显示指定文件的详细属性信息 ls&#xff1a;显示目录中文件及其属性信息 mkdir命令&#xff1a;创建目录文件 touch&#xff1a;创建空文件与修改时间戳 rm命令&#xff1a;删除文件或目录 cd命令&#xff1a;切换目录 chmod命令&#xff1a;改变…

llama.cpp 去掉打印,只显示推理结果

llama.cpp 去掉打印&#xff0c;只显示推理结果 1 llama.cpp/common/log.h #define LOG_INF(...) LOG_TMPL(GGML_LOG_LEVEL_INFO, 0, __VA_ARGS__) #define LOG_WRN(...) LOG_TMPL(GGML_LOG_LEVEL_WARN, 0, __VA_ARGS__) #define LOG_ERR(…

docker部署es与kibana Mac

1. 创建网络 神一样的链接&#xff0c;不用谢&#xff1a; 1.Docker命令链接&#xff1a;黑马整理的docker速成链接 2.jdk11链接&#xff1a;jdk11 3.神资源链接&#xff1a;别点&#xff0c;要脸 注意&#xff1a;es需要先安装jdk环境&#xff0c;推荐jdk11&#xff0c;否则…

MySQL企业常见架构与调优经验分享

文章目录 一、选择 PerconaServer、MariaDB 还是 MYSQL二、常用的 MYSQL 调优策略三、MYSOL 常见的应用架构分享四、MYSOL 经典应用架构 观看学习课程的笔记&#xff0c;分享于此~ 课程&#xff1a;MySQL企业常见架构与调优经验分享 mysql官方优化文档 一、选择 PerconaServer、…