Chapter 3 Procedural Statements and Routines

本文详细介绍了System Verilog(Sysverilog)中的过程语句和子程序,包括任务、函数、空函数的使用,以及参数传递、返回值、局部数据存储和时间值的处理。重点讨论了C风格的参数定义、参数方向、高级参数类型,如ref和const修饰符,以及默认参数值和按名称传递参数的功能。同时,提到了局部变量的自动存储和初始化的重要性,并提醒了在处理大型数组时的性能问题。
摘要由CSDN通过智能技术生成

3 Procedural Statements and Routines

3.1 Procedural Statments

System Verilog 继承了许多C/C++ 的运算符和语句。包括在for循环内定义变量,++/–等运算符。还可以在语句的开始和结束处添加标号。

initial
begin : example
for (int i; i<10; i++) 
  array[i] = i;
end : example

若你正处于一个循环中,continue可以让你跳过本轮剩下的语句直接进入下一次循环,而break可以让你直接跳出循环。

在SV的case中,没有必要将所有的分支都写出来,仅需提供一个范围值即可,inside关键字可以做到这些。

case(Graduation_year) inside //## Note "inside" keyword
  [1950:1959]: $display("Do you like Bobby Sox?");
  [1960:1969]: $display("Did you go to Woodstock?");
  [1970:1979]: $display("Dif you dance to disco?");
endcase

3.2 Task, Functions and Void Functions

Task与Function最主要的区别在于,task可以消费时间,而function不能。task内可以包含#100这种延迟信息,或者是 @(posedge clock)。不消费时间的task最好定义成void function,即没有返回值的function。这样就可以被任何task和function调用了。

如果你希望忽略一个function的返回值,可以将此函数转换成viod类型,VCS中允许这么做,但LRM中会报一个warning。

void'($fscanf(file,"%d",i));

3.3 Task and Function Overview

一般情况下,不带参数的子程序在定义与调用时不需要带空括号。

3.3.1 Routine begin…end Removed

在子程序中,begin…end并不是必须的。task/endtask与function/endfunction用来定子程序的边界是足够的。

task multiple_lines();
  $display("first line");
  $display("Second line");
endtask

3.4 Routine Arguments

SV 中许多改进点都是为了简化申明变量与扩大子程序中传递变量值的办法。

3.4.1 C-style Routine Arguments

sv中引用了许多c语言中的参数定义风格,如下:

input logic [3:0] a;

3.4.2 Argument Direction

SV中缺省的类型是logic输入,以下两种定义方式是等价的:

task v3;
  input a,b;
  logic a,b;
  output [15:0] u,v;
  bit [15:0] u,v;
  ...
endtask

另一种简单的

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值