尧图网络 高端网站定制 · 原创设计
免费咨询热线
400-888-6620
免费获取方案
Verilog基础:disable语句
相关文章Verilog基础专栏https://blog.csdn.net/weixin_45791458/category_12263729.html1.disable语句Verilog中的disable语句提供了提前终止任务或命名块执行的能力它本质上属于过程控制语句作用类似于“强制跳出某个正在执行的过程范围”。和普通的顺序执行不同disable语句一旦生效被禁用的任务或命名块中后续尚未执行的语句将不再继续执行控制流会立即回到该任务或命名块之后的位置继续向下运行。综合工具不完全支持disable语句因为最好只在仿真时使用。图1是disable语句的BNF范式语法有关BNF范式可以参考以往文章。图1 disable语句的语法disable语句能够结束任务或命名块的执行说明如下1、在disable语句执行后受影响直接或间接任务或者命名块的执行将被停止然后直接受影响的任务使能语句和命名块之后的语句继续执行。2、在disable语句执行后受影响直接或间接的任务或命名块中已调度但还未执行的语句将不再执行。例如某个任务中原本安排了一个#5之后再执行的$display系统函数如果在这延时到来之前该任务被disable语句终止那么这条延时后的$display系统函数也就不会再执行。3、如果一个任务被并发地使能多次那么disable该任务将结束该任务的所有激活实例无论其是否是自动任务。4、在disable语句执行后受影响直接或间接的任务中从output和inout参数返回给实参的值通常在任务返回时传递是未定义的。5、在disable语句执行后受影响直接或间接的任务或命名块中的过程连续赋值assign和force的行为是未定义的。6、如果一个函数中的disable语句结束了调用直接或间接该函数的任务或命名块该行为是未定义的。2.disable语句的例子下面结合几个例子来看disable语句的具体行为。例1disable语句结束命名块的执行块后语句继续执行// 一个命名块在块内终止了自己 initial begin begin: block_name rega regb; #1 disable block_name; #2 regc rega; // 不会执行 end $display(hello world); // 在1ns时执行 end这个例子最适合用来理解disable语句对命名块的基本作用。这里block_name是一个命名块进入该块之后程序先执行rega regb;语句然后经过1ns延时执行disable block_name;语句这条语句一旦执行成功意味着名为block_name的这个块到此立即终止因此位于后面的#2 regc rega;语句不会再执行。需要特别注意的是被终止的只是这个命名块本身而不是包围它的整个initial过程所以当end退出命名块后$display(hello world);语句仍然会继续执行也就是说该例中的打印语句会在1ns时刻执行。例2disable语句结束命名块的执行间接结束命名块中正在执行的任务和任务中已调度的系统函数的执行initial begin: test task1(); //task使能 end initial begin #1 disable test; //结束命名块的执行 end task task1; #5 $display(hello world); //不会在5ns时执行 endtask这个例子进一步说明了disable语句对“间接执行内容”的影响。task1()是在命名块test中被调用的而另一个initial块在1ns时执行disable test;语句于是名为test的命名块会被终止。由于task1()正是这个命名块的一部分执行内容因此它也随之被中断任务内部原本安排在5ns时刻输出的$display(hello world);语句不会再执行。例3disable语句结束多个task的激活initial fork: test task1(); //多个task使能 task1(); //多个task使能 task1(); //多个task使能 task1(); //多个task使能 join initial begin #1 disable task1; //结束四个任务的执行 end task task1; #5 $display(hello world); //不会在5ns时执行 endtask这个例子体现了disable语句更强的一面。这里通过fork...join并发启动了四个task1()按直觉很多人可能会觉得“disable task1;语句只会结束其中某一个当前激活”但实际上并不是这样。按照标准语义disable task1;语句会终止名字为task1的所有当前激活实例所以这四个并发执行的任务都会被一起结束因此到了5ns时没有任何一个$display系统函数会真正执行。例4disable语句结束任务的返回值是未定义的module example; reg [3:0] a,b; reg [3:0] result; //定义一个task task add; input [3:0] x,y; output reg [3:0] z; begin z x y; disable add; //禁用task end endtask initial begin a 4b0011; //3 b 4b0101; //5 add(a,b,result); //调用task执行加法 $display(Result: %b,result); //输出结果是未定义的 end endmodule 不同的仿真器给出的结果也不同 对于Mentor Modelsim SE输出结果为 Result: 1000 对于Aldec Riviera Pro输出结果为 Result: 1000 对于Cadence Xcelium输出结果为 Result: 1000 对于Mentor Questa输出结果为 Result: 1000 对于Synopsys VCS输出结果为 Result: xxxx 对于Icarus Verilog输出结果为 Result: 1000这个例子讨论的是一个比较微妙但很重要的问题当任务通过output参数向外返回结果时如果任务在内部被disable结束那么这个“返回值”该怎么理解。代码里任务add先执行z x y;语句紧接着执行disable add;语句从语言直观来看好像z已经被赋值成8了因此很多人会自然觉得result肯定会打印出1000。但从标准语义角度这个任务并没有走到一个“正常完成并返回”的状态而是中途被显式终止了因此output参数回传给调用者的最终结果属于未定义行为不同仿真器可能会有不同实现。有些仿真器可能仍然把当时的z值传回去于是看到1000也有些仿真器可能更严格地把结果视为未定义于是打印出xxxx。例5一个可触发单稳态的行为描述// 事件retrig的发生将重新启动单稳定时间段并给q赋值1如果在250ns内retrig重复发生那么q将保持为1否则会变成0 always begin : monostable #250 q 0; end always retrig begin disable monostable; q 1; end这个例子是disable语句在行为建模中的一个非常典型、也非常巧妙的用法。这里前一个always begin: monostable命名块可以看成一个“延时后自动清零”的单稳态过程它每次启动后都会等待250ns再把q置0而后一个always (retrig)则表示每当retrig事件到来就先执行disable monostable;语句也就是取消当前还没走完的那段250ns延时过程然后立刻把q置1。这样一来如果retrig在250ns内再次出现那么前一次尚未结束的单稳态延时就会被中断并重新开始计时从外部看就相当于“重触发单稳态”只要触发不断重复到来q就一直保持为1直到最后一次触发后的250ns才重新回到0。
RELATED

相关推荐

183 · 木材加工(二分法)

183 · 木材加工(二分法)

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

📅 2026/11/6 1:12:58
【前端】常用属性及实例

【前端】常用属性及实例

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

📅 2026/11/6 1:12:58
Verilog基础:$readmemb和$readmemh系统任务的使用与其中的初始化地址相关问题(详细细节)

Verilog基础:$readmemb和$readmemh系统任务的使用与其中的初始化地址相关问题(详细细节)

相关阅读 Verilog基础https://blog.csdn.net/weixin_45791458/category_12263729.html?spm1001.2014.3001.5482 $readmemb和$readmemh两个系统任务用于将文件中的数据加载到存储器或者被称为数组的memory中。首先给出他们的语法的BNF范式,有关BNF范式的内容可以在…

📅 2026/11/6 1:12:58
MORE NEWS

更多资讯

📰

交通银行江苏省分行试水词元贷:不押厂房给两家工厂批了6200万

交通银行江苏省分行试水词元贷:不押厂房给两家工厂批了6200万 去银行申请几千万元贷款,企业通常要带上什么?房产证、土地证、厂房设备发票,或者厚厚一叠抵押担保合同。但在2026年11月初的江苏,两家实体企业走进交通银行…

📰

18|DeepSeek Harness研究资料更新后,怎样找出还引用旧证据的笔记?

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

📰

国家发改委推AI全周期治理:上线备案不够了,算力数据也得备查

国家发改委推AI全周期治理:上线备案不够了,算力数据也得备查 如果一家大模型公司在产品上线的前一天,被要求把两年前买过哪批芯片、洗过哪些数据、改过哪次算法架构甚至员工转岗记录全都清清楚楚交出来,工程师的第一反应大概是发懵…

📰

Autoware 2.0 发布:端到端 AI 与规则模块可混搭

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

📰

连接器接上平台只是开始:内容自动发布最容易漏掉的四件事

很多人第一次做内容自动化,最兴奋的不是文章写得多好,而是看到一句指令之后,内容真的出现在了另一个平台。 但只要把这套流程连续跑几天,问题很快就会冒出来:账号明明连过,任务却突然失效;同一篇…

📰

Python列表、元组、集合 实验实训

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

TODAY

今日更新

THIS WEEK

本周精选

THIS MONTH

本月热门

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

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

📞 💬