system verilog中的跳转操作
在verilog中,使用disable声明来从执行流程中的某一点跳转到另一点。特别地,disable声明使执行流程跳转到标注名字的声明组末尾,或者一个任务的末尾。
verilog中的disable命令用法有很多,下面是一个简单的例子,解释了disable的作用范围:
// find first bit set within a range of bits
always @* begin
begin: loop
integer i;
first_bit = ;
for (i=; i<=; i=i+) begin: pass
if (i < start_range)
disable pass; // continue loop
if (i > end_range)
disable loop; // break out of loop
if ( data[i] ) begin
first_bit = i;
disable loop; // break out of loop
end
end // end of one pass of loop
end // end of the loop
// process data based on first bit set
...
end
在begin块和for循环块中加入名字,然后在disable声明中使用,就可以明确指定跳出的位置。
disable声明同样可以用于在task中所有声明执行完之前提前跳出task:
task add_up_to_max (input [ :] max,
output [:] result);
integer i;
begin
result = ;
if (max == )
disable add_up_to_max; // exit task
for (i=; i<=; i=i+) begin
result = result + result;
if (i == max)
disable add_up_to_max; // exit task
end
end
endtask // add_up_to_max
disable声明同样可以用来从外部关闭一个并行的进程或者task。不过外部的disable不可综合。
system verilog增加了类似C语言的跳转声明:break,continue和return。这些跳转声明可以使代码更加intuitive和concise。system verilog不包含C语言中的goto语句。
verilog的disable声明和这些新的跳转声明的一个重要区别是:disable声明适用于所有现行的task或者block的invocation,然而break,continue和return只适用于当前的执行流程。
continue声明
类C语言的continue声明跳转到循环的末尾并执行循环的控制。使用continue声明时,不需要对代码添加命名的begin...end块,而这在使用disable声明时是必要的。
logic [:] array [:];
always_comb begin
for (int i = ; i <= ; i++) begin : loop
if (array[i] == )
continue; // skip empty elements
transform_function(array[i]);
end // end of loop
end
break声明
类C语言的break声明立即结束循环操作。循环不会重新执行,除非执行流程重新到达循环的起点。break的例子如下:
// find first bit set within a range of bits
always_comb begin
first_bit = ;
for (int i=; i<=; i=i+) begin
if (i < start_range) continue;
if (i > end_range) break; // exit loop
if ( data[i] ) begin
first_bit = i;
break; // exit loop
end
end // end of the loop
... // process data based on first bit set
end
system verilog中的break声明与C语言中的break语句用法相同。C语音也会使用break语句从switch语句中退出。而system verilog不会使用break声明从case语句中离开,因为verilog中case声明会在某个分支执行后自动退出,不需要break语句。
return声明
system verilog增加了类C语言的return声明,用于从一个非void函数中返回数值或者从一个void函数或任务返回。return声明可以在任务或函数执行流程的任意一点执行。当return声明执行后,任务或者函数立即退出而不需要执行到任务或者函数的末尾。
task add_up_to_max (input [ :] max,
output [:] result);
result = ;
if (max == ) return; // exit task
for (int i=; i<=; i=i+) begin
result = result + result;
if (i == max) return; // exit task
end
endtask
return声明可以用来从任务或函数提前退出。verilog中disable声明只能从任务中提前退出,而不能用在函数中。
function automatic int log2 (input int n);
if (n <=) return ; // exit function early
log2 = ;
while (n > ) begin
n = n/;
log2++;
end
return log2;
endfunction // log2
注意在任务或者void函数中,return关键字后不能跟随表达式;而在非void函数中,return关键字后必须跟随表达式。
综合规则
break,continue和return跳转声明是可综合的结构。综合结果与verilog中使用disable实现同样功能时综合结构相同。
system verilog中的跳转操作的更多相关文章
- 一段比较有意思的代码——介绍system verilog中的新增幅值语句
system verilog中新加了很多幅值语句,虽然都只适用于阻塞幅值,但是在某些场合中非常实用. 下面是一段有意思的代码,覆盖了一些用法. package definitions; typedef ...
- system verilog中的类型转换(type casting)、位宽转换(size casting)和符号转换(sign casting)
类型转换 verilog中,任何类型的任何数值都用来给任何类型赋值.verilog使用赋值语句自动将一种类型的数值转换为另一种类型. 例如,当一个wire类型赋值给一个reg类型的变量时,wire类型 ...
- System Verilog随笔(1)
测试文件该怎么写? 首先看一个简单代码案例: `timescale 1ns/10ps //1 module test; //2 intput wire[15:0] a; output reg[15 ...
- //四舍五入//得到倒序//比较字符串//拦截时间,实现超时锁屏//判断是否越狱//配置PodFile//Storyboard中跳转操作//处理不可逆的push界面操作
//处理不可逆的push界面操作 VerifyRealNameViewController *verifyRealNameCtrl = [VerifyRealNameViewController vi ...
- C# MVC 用户登录状态判断 【C#】list 去重(转载) js 日期格式转换(转载) C#日期转换(转载) Nullable<System.DateTime>日期格式转换 (转载) Asp.Net MVC中Action跳转(转载)
C# MVC 用户登录状态判断 来源:https://www.cnblogs.com/cherryzhou/p/4978342.html 在Filters文件夹下添加一个类Authenticati ...
- System Verilog基础(一)
学习文本值和基本数据类型的笔记. 1.常量(Literal Value) 1.1.整型常量 例如:8‘b0 32'd0 '0 '1 'x 'z 省略位宽则意味着全位宽都被赋值. 例如: :] sig1 ...
- system verilog的一些总结(从其他博客复制来的)
转载自 http://blog.sina.com.cn/s/blog_e7fec2630101f5t9.html SystemVerilog是一种硬件描述和验证语言(HDVL),它基于IEEE 136 ...
- 【转】《深入理解计算机系统》C程序中常见的内存操作有关的典型编程错误
原文地址:http://blog.csdn.net/slvher/article/details/9150597 对C/C++程序员来说,内存管理是个不小的挑战,绝对值得慎之又慎,否则让由上万行代码构 ...
- C#中使用官方驱动操作MongoDB
想要在C#中使用MongoDB,首先得要有个MongoDB支持的C#版的驱动.C#版的驱动有很多种,如官方提供的,samus. 实现思路大都类似.这里我们先用官方提供的mongo-csharp-dri ...
随机推荐
- win10 mysql 5.7.13 服务无法启动 3534
自己也百度了很多方法都不管用(我用的MySQL是免安装版,直接解压缩的那种) 基本上都是说没有设置data目录,没有 初始化,我很郁闷的是都按照那些步骤处理了,到最后还是不行. 后来把配置文件里面的 ...
- Ibator的配置和使用
1. Ibator介绍 Ibator是iBATIS的代码发生器,其原名叫abator,后来更名为Ibator,同时代码结构也做了相应的一些修改,所以两者的配置也有所不同.Ibator可以生成一 ...
- JQUERY中 .each()的用法。
.each()方法的两个简单例子 用法1. <script type="text/javascript"> $("#dianji").click(f ...
- Git远程仓库(github
一.创建远程仓库(github) 首先到https://github.com注册一个账号,创建自己的Git,点击repositories,再点new 名字自定义,比如叫fansik,选择public点 ...
- 【python】PIL 批量绘制图片矩形框工具
工具采用PIL:Python Imaging Library,图像处理标准库.PIL功能非常强大,但API却非常简单易用. 安装PIL 在Debian/Ubuntu Linux下直接通过apt安装 $ ...
- VMvare克隆复制多个操作系统
目的:完成linux的双机和集群实验 2016-12-06 在网上查找了一些资料现整理如下,以供之后查看和帮助他人. 注意事项: 1.关闭源虚拟机的电源: 操作很简单 选择完整创建 输入源克隆机的用户 ...
- 一次失败的Selenium chromedriver切换
背景 Selenium webdriver一直使用Firefox作为浏览器来跑webtest, 但是最近发现ff有时会报超时的错误,于是想到使用chromedriver来提升稳定性.本想只把.fire ...
- 3-HOP: A High-Compression Indexing Scheme for Reachability Query
title: 3-HOP: A High-Compression Indexing Scheme for Reachability Query venue: SIGMOD'09 author: Ruo ...
- 依赖注入 – ASP.NET MVC 4 系列
从 ASP.NET MVC 3.0 开始就引入了一个新概念:依赖解析器(dependence resolver).极大的增强了应用程序参与依赖注入的能力,更好的在 MVC 使用的服务和创 ...
- Arcgis 图层编辑器“粘贴”功能菜单灰色不能使用的问题与解决办法
本人由win7系统更换为win10系统,平常使用的arcgis10.2升级使用10.3版本,相应的VS2012也升级使用2013版本,但是在安装了之后发现"Editor"编辑工具中 ...