尧图网络 高端网站定制 · 原创设计
免费咨询热线
400-888-6620
免费获取方案
Verilog基础:层次化标识符的使用
相关阅读Verilog基础https://blog.csdn.net/weixin_45791458/category_12263729.html?spm1001.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%257Drequest_id6813B559-9D37-4969-810B-88F9A143E446biz_id0utm_mediumdistribute.pc_search_result.none-task-blog-2~blog~first_rank_ecpm_v1~rank_v31_ecpm-1-140436528-null-null.nonecaseutm_term%E6%A0%87%E8%AF%86%E7%AC%A6spm1018.2226.3001.4450一般情况下我们只会接触到简单标识符但是有些时候如验证设计时层次化标识符也会被使用本文目的是为需要使用层次化标识符的设计人员提供一定参考。二、层次化标识符的起源模块、任务、函数、命名块和生成块的定义引入了命名空间模块命名空间、块命名空间和生成块命名空间详情见下面的博客。Verilog基础八种命名空间定义命名空间、文本宏命名空间、模块命名空间块命名空间、生成块命名空间、端口命名空间、specify块命名空间、属性命名空间详解上-CSDN博客文章浏览阅读1k次点赞44次收藏24次。Verilog有八个标识符命名空间其中两个是全局的定义命名空间和文本宏命名空间六个是局部的模块命名空间块命名空间、生成块命名空间、端口命名空间、specify块命名空间、属性命名空间。_verilog 过程块命名https://blog.csdn.net/weixin_45791458/article/details/142132358?spm1001.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%257Drequest_idF7990A6B-6C1B-4DA7-98FC-0BEFAC7FAAA8biz_id0utm_mediumdistribute.pc_search_result.none-task-blog-2~blog~first_rank_ecpm_v1~rank_v31_ecpm-1-132567389-null-null.nonecaseutm_termBNFspm1018.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 1b0; // 编译错误引用位置在定义位置前 stim2 1b1; // 编译错误引用位置在定义位置前 end reg stim1, stim2; endmodule普通标识符中的任务名和函数名则不要求引用位置在同一模块中标识符的定义位置后如例4所示且可以跨层次引用如例5所示就像后面谈到的层次化标识符那样。// 例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 module top; example ex1(); function integer add; input integer a, b; begin add a b; end endfunction endmodule module example; initial begin $display(Sum is: %d, add(2, 3)); end endmodule五、层次化标识符的引用位置如果使用层次化标识符则所有标识符对定义位置都不要求引用位置在同一模块中标识符的定义位置后如例6所示因为层次名解析是在elaboration阶段进行而不是在编译阶段进行。// 例6 module example; initial begin example.stim1 1b0; // 没有问题 example.stim2 1b1; // 没有问题 end reg stim1, stim2; endmodule六、不完整的层次化标识符使用完整的层次化标识符简单直观但当层次结构复杂起来时完整的层次化标识符便显得十分臃肿此时可以使用不完整的层次化标识符即层次化标识符不从顶层(根)模块名开始写起不完整的层次化标识符和完整的层次化标识符一样不要求引用位置在同一模块中标识符的定义位置后。不完整的层次化标识符的语法和图1所示的一样但是此时不要求最左边的普通标识符是顶层(根)模块名它可以是模块实例名、任务名、函数名、命名块名和生成块名。不完整的层次化标识符解析遵循一定的规则如下所示1、首先在层次化标识符引用位置的命名空间中尝试匹配层次化标识符匹配指的是从层次化标识符最左边的普通标识符开始依次匹配后续的所有普通标识符如果匹配失败且当前命名空间不是模块命名空间则在上层命名空间中尝试匹配层次化标识符以此类推直到匹配成功或到达模块命名空间。例7展示展示了不完整的层次化标识符的使用方式。// 例7 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 endmodule2、在规则1中在到达模块命名空间后如果匹配仍然失败则会在父模块的模块命名空间即最外层尝试匹配层次化标识符。在父模块的模块命名空间内匹配时会有一个例外那就是首先将层次化标识符最左边的普通标识符与模块名匹配如果成功则将其视为子模块实例名指直接或间接包含的子模块实例如果匹配失败再尝试匹配其他名字用于实例化的模块名可以与模块命名空间中的名字重名如例8所示。// 例8 module top; example example_1(1); // 对于实例example_1中的$display它输出1 example example_2(0); // 对于实例example_2中的$display它输出0 initial begin: example reg x; x 1bx; // 优先搜索模块名因此这个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 endmodule3、如果在父模块的模块命名空间中的匹配全部失败了则重复规则2直到顶层(根)模块如果顶层(根)模块的模块命名空间也是失败的则它会被视为一个完整的层次化标识符。没错其实完整的层次化标识符的解析也可以认为是遵守这个规则的可以视为一层一层向上匹配但全部匹配失败直到最后在假象的顶层(根)模块的父模块中匹配成功。善于思考的你可能会提出问题那岂不是会出现拦截问题比如顶层(根)模块的模块命名空间中的一个名字可能会因为在向上匹配的过程中被提前匹配而无法被引用到这是对的如例9所示。// 例9 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本文就不对此进行详述了。
RELATED

相关推荐

C#海康热成像测温:从温度矩阵到发射率标定的完整实战

C#海康热成像测温:从温度矩阵到发射率标定的完整实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

📅 2026/10/27 1:11:17
480W开关电源设计:PFC+LLC架构选型、参数计算与调试实战

480W开关电源设计:PFC+LLC架构选型、参数计算与调试实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

📅 2026/10/27 1:11:17
LLC谐振变换器实战总结:从匝比计算到炸管排查

LLC谐振变换器实战总结:从匝比计算到炸管排查

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

📅 2026/10/27 1:11:17
MORE NEWS

更多资讯

📰

别让错题本变成抄题本:我给孩子用的 AI 错题本开源了

错题本最容易完成的一步,是把题目抄进去。最容易掉链子的一步,是过几天再拿出来,确认孩子真的会做了。 题干要抄,图要画,答案要整理;好不容易收拾干净,下次复习又得翻半天。要是同一道题再次做…

📰

酒店客房WiFi覆盖方案怎么做?勘测、布点与验收判据

客房 WiFi 做得好不好,验收时不是看信号格数,而是看点位复测的数值和高峰期是否仍然可用。很多项目入住以后才发现问题,根子都在第一阶段:没做勘测就按经验布点,墙还没砌完就定了 AP 数量。 一、第一步:勘测…

📰

当 Agent 运行时跑上手机:白泽的移动端双路径设计

白泽是一个旁挂在业务旁、用 Go 写成的单进程 Agent 运行时,把大模型、工具、老系统接口和人工卡点收口成可审计的运行。服务端跑稳后,移动端没有简单做一个手机版网页,而是提供两条路径:一条用 Capacitor 壳遥控远端完整操作台&a…

📰

失控、操纵、侵私:人工智能业务的现实风险

上一篇,我们讨论了人工智能自身的技术缺陷,包括模型幻觉、提示词注入、数据投毒,以及算法、数据和运行环境等环节可能存在的安全隐患。但AI安全问题并不会止步于技术本身。当人工智能进入真实业务场景后,可能产生哪些具体危害&…

📰

PurrPurr AI项圈拆解:499元硬件+年订阅,宠物情绪价值的续费生意能跑通吗

【摘要】以PurrPurr AI宠物项圈为核心样本,覆盖27种行为识别标签、3档订阅定价、3阶段留存验证模型,拆解宠物智能硬件从功能监测转向情绪叙事的创业路径,量化分析硬件毛利与订阅续费的双轮结构,给出4条按时间轴排布的失效边界&…

📰

小白程序员必看:从0理解真正的Agent与大模型背后的工程系统

本文深入剖析了真正的Agent与大模型背后的工程系统,揭示了两者之间的核心差异。文章详细拆解了Agent从接收用户目标到最终执行结果的20步全链路,并介绍了六个关键角色(用户、智能体、技能层、大模型、模型上下文协议、工具)的分工…

TODAY

今日更新

THIS WEEK

本周精选

THIS MONTH

本月热门

读完文章,想聊聊您的网站?

告诉我们您的行业与需求,资深顾问一对一梳理方案与报价,全程免费。

📞 💬