过程语句
条件
if
case
循环
for
while
continue
break
子程序
function和task的使用,与verilog语法不太一样。主要区别:
- function可以不带返回值
- function里可以调用task;线程章节会介绍。
- function/task不需要begin…end包含了。
- task的参数,更灵活;比module的参数设置还灵活。
基于此特点,
可以定义用于debug的function了。
function void print_state(...);
$display("@%0t,state=%s",$time,current_state.name());
endfunction
参数
function void print_checksum(const ref bit[31:0] a[]);
bit[31:0] checksum=0;
for(int i=0;i<a.size();i++)
checksum ^= a[i];
$display("The array checksum is %0d",checksum);
endfunction
其中const,是指参数变量不能改变,否则编译报错;
ref代表数组参数的传递,注意整个子程序需要是automatic属性,即自动存储。后文再讨论。
ref还有个好处,是用于线程的。后文再讨论。
return
出现错误的时候,跳出子程序。
带返回值的子程序
function void init(ref int f[5],
input int start);
foreach(f[i])
f[i]=i+start;
endfunction
int fa[5];
initial begin
int(fa,5);
foreach(fa[i])
$display("fa[%0d]=%0d",i,fa[i]);
end
自动存储automatic
多线程的时候用到。
比如某个task,被多次调用,为了不让变量互相干扰。从verilog的默认静态共享,变为自动存储类型。后文再说吧。