system verilog中的跳转操作

时间:2022-09-24 11:34:51

在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中的跳转操作的更多相关文章

  1. 一段比较有意思的代码——介绍system verilog中的新增幅值语句

    system verilog中新加了很多幅值语句,虽然都只适用于阻塞幅值,但是在某些场合中非常实用. 下面是一段有意思的代码,覆盖了一些用法. package definitions; typedef ...

  2. system verilog中的类型转换(type casting)、位宽转换(size casting)和符号转换(sign casting)

    类型转换 verilog中,任何类型的任何数值都用来给任何类型赋值.verilog使用赋值语句自动将一种类型的数值转换为另一种类型. 例如,当一个wire类型赋值给一个reg类型的变量时,wire类型 ...

  3. System Verilog随笔(1)

    测试文件该怎么写? 首先看一个简单代码案例: `timescale 1ns/10ps //1 module test;   //2 intput wire[15:0] a; output reg[15 ...

  4. &sol;&sol;四舍五入&sol;&sol;得到倒序&sol;&sol;比较字符串&sol;&sol;拦截时间,实现超时锁屏&sol;&sol;判断是否越狱&sol;&sol;配置PodFile&sol;&sol;Storyboard中跳转操作&sol;&sol;处理不可逆的push界面操作

    //处理不可逆的push界面操作 VerifyRealNameViewController *verifyRealNameCtrl = [VerifyRealNameViewController vi ...

  5. C&num; MVC 用户登录状态判断 【C&num;】list 去重(转载) js 日期格式转换(转载) C&num;日期转换(转载) Nullable&lt&semi;System&period;DateTime&gt&semi;日期格式转换 (转载) Asp&period;Net MVC中Action跳转(转载)

    C# MVC 用户登录状态判断   来源:https://www.cnblogs.com/cherryzhou/p/4978342.html 在Filters文件夹下添加一个类Authenticati ...

  6. System Verilog基础(一)

    学习文本值和基本数据类型的笔记. 1.常量(Literal Value) 1.1.整型常量 例如:8‘b0 32'd0 '0 '1 'x 'z 省略位宽则意味着全位宽都被赋值. 例如: :] sig1 ...

  7. system verilog的一些总结(从其他博客复制来的)

    转载自 http://blog.sina.com.cn/s/blog_e7fec2630101f5t9.html SystemVerilog是一种硬件描述和验证语言(HDVL),它基于IEEE 136 ...

  8. 【转】《深入理解计算机系统》C程序中常见的内存操作有关的典型编程错误

    原文地址:http://blog.csdn.net/slvher/article/details/9150597 对C/C++程序员来说,内存管理是个不小的挑战,绝对值得慎之又慎,否则让由上万行代码构 ...

  9. C&num;中使用官方驱动操作MongoDB

    想要在C#中使用MongoDB,首先得要有个MongoDB支持的C#版的驱动.C#版的驱动有很多种,如官方提供的,samus. 实现思路大都类似.这里我们先用官方提供的mongo-csharp-dri ...

随机推荐

  1. Apache2&period;4:AH01630 client denied by server configuration

    问题说明:Apache服务总共有4个,是为了防止单点故障和负载均衡,负载均衡控制由局方的F5提供. 访问的内容在NAS存储上,现象是直接访问每个apache的服务内容都是没有问题,但是从负载地址过来的 ...

  2. mysql 工具箱

    创建测试数据 存储过程: delimiter // create procedure sp_generate_data() begin ; do set @created_time := date_a ...

  3. css(三)-- 常用属性

    css的常用属性包括以下几种: CSS 背景CSS 文本CSS 字体CSS 列表CSS 表格 1.CSS 背景 /*操作背景的属性 */ body{ /*background-color:#CCC; ...

  4. HTTP协议类

    本文从以下几方面介绍HTTP协议 HTTP协议的主要特点 HTTP报文的组成部分 HTTP方法 HTTP状态码 POST和GET的区别 什么是持久连接 什么是管线化 主要特点: http协议的特点: ...

  5. chrome浏览器导出文件提示病毒扫描失败

    转自https://zhidao.baidu.com/question/758059392558639324.html 1.windows+R,打开运行 2.输入regedit.exe,确定,打开注册 ...

  6. MVC开发中的常见错误-03-System&period;Data&period;Entity&period;Validation&period;DbEntityValidationException&colon; 对一个或多个实体的验证失败。有关详细信息,请参见&OpenCurlyDoubleQuote;EntityValidationErrors”属性。

    return Db.SaveChanges()>0; return CurrentDBSession.SaveChanges(); RoleInfoService.EditEntity(role ...

  7. hdu 3836 Equivalent Sets trajan缩点

    Equivalent Sets Time Limit: 12000/4000 MS (Java/Others)    Memory Limit: 104857/104857 K (Java/Other ...

  8. Vue&period;js基础&lpar;二&rpar;

    属性 可以将数据进行计算得出新的结果,也可以说是一个公式,有缓存. 应用:1,频繁使用的复杂公式. 2,需要监控的-----全局状态的管理 简写:   computed:{ result:functi ...

  9. Method not found&colon; &&num;39&semi;System&period;Data&period;Entity&period;ModelConfiguration&period;Configuration&period;XXX

    使用EF flument API  修改映射数据库字段的自增长 modelBuilder.Entity<Invoice>().Property(p => p.Id).HasDatab ...

  10. 初识MYSQL2

    mysql的配置 MySql默认的端口号是3306 默认字符集的设置 在mysql的安装目录,会看到my.ini文件! my.ini文件介绍 01.default-character-set=utf8 ...