1、过程语句
for语句、do-while语句、while语句
1 initial begin 2 string cmd; 3 int file,c; 4 $display("=========== continue break =========="); 5 //bit [127:0] cmd; 6 file=$fopen("command.txt","r"); 7 while(!$feof(file)) begin 8 c = $fscanf(file,"%s",cmd); 9 case(cmd) 10 "continue": 11 begin 12 continue; 13 end 14 15 "done": 16 begin 17 $display("done row"); 18 break; 19 end 20 21 default: 22 begin 23 $display(cmd); 24 end 25 endcase 26 end 27 $fclose(file); 28 end
2、任务、函数以及void函数
Verilog:任务可以耗时,函数不能;任务可以调用函数,函数不能调用任务;函数必须有返回值,且返回值必须被使用
SystemVerilog:允许函数调用任务,不消耗时间的SV任务应该定义成void函数
(1)使用ref和const传递数组
好处:ref声明在进行参数传递时无需复制到堆栈区,const声明则使得子程序不能修改数组的值,避免误修改。ref的第2个好处是在任务里可以修改变量而且修改结果对调用它的函数随时可见。
这为并发执行线程之间的信息传递提供了机会。
1 // ref const 2 function automatic void print_checksum(const ref bit [31:0] a[]); 3 bit [31:0] checksum; 4 for(int i=0;i<a.size();i++) begin 5 checksum^=a[i]; 6 end 7 $display("The array checksum is %b",checksum); 8 9 endfunction 10 11 bit [31:0] a[]; 12 initial begin 13 a = new[3]; 14 a[0] = 32'd0; 15 a[1] = 32'd1; 16 a[2] = 32'd3; 17 //bit [31:0] a[2] = '{'{32'd0},'{32'd1}}; 18 $display("========== automatic ref const ==========="); // # The array checksum is 00000000000000000000000000000010 19 print_checksum(a); 20 end
(2)从函数中返回一个数组
1 // 从函数中返回一个数组 2 function automatic void init(ref int f[5], input int start); 3 foreach(f[i]) 4 f[i] = i + start; 5 endfunction 6 7 int fa[5]; 8 initial begin 9 init(fa,5); 10 foreach(fa[i]) 11 $display("fa[%0d]=%0d",i,fa[i]); 12 end