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
另一种简单的