SV_9_Task and Function

1.任务和函数

任务和函数与verilog中相同,但SV增加了在静态任务和函数中声明自动变量以及在自动任务和函数中声明静态变量的能力

1.1 task

  • 端口默认为输入,除非声明为其他类型;
  • 数据类型默认为logic,除非声明为其他类型;
  • 可以存在多个语句,而不用begin end 做开始结尾;
  • 利用return语句终止task;
  • wire类型数据不可以在端口使用;
 1 module task_intro ();
 2 
 3 initial begin
 4   #1 doInit(4,5);
 5   #1 doInit(9,6);
 6   #1 $finish;
 7 end
 8 
 9 task doInit (input bit [3:0] count, delay);
10   automatic reg [7:0] a;
11   if (count > 5) begin
12     $display ("@%g Returning from task", $time);
13     return;
14   end
15   #(delay) $display ("@%g Value passed is %d", $time, count);
16 endtask
17 
18 endmodule
19 
20 //compile result
21 
22  @6 Value passed is  4
23  @7 Returning from task
View Code

1.2 function

  • 端口默认为输入,除非声明为其他类型;
  • 数据类型默认为logic,除非声明为其他类型;
  • 可以存在多个语句,而不用begin end 做开始结尾;
  • 利用return语句终止task;
  • wire类型数据不可以在端口使用;
  • 允许将函数声明为void类型;
 1 module task_intro ();
 2 
 3 bit a ;
 4 
 5 initial begin
 6   #1 a = doInit(4,5);
 7   #1 a = doInit(9,6);
 8   #1 $finish;
 9 end
10 
11 function bit unsigned doInit (bit [3:0] count, add);
12   automatic reg [7:0] b;
13   if (count > 5) begin
14     $display ("@%g Returning from function", $time);
15     return 0;
16   end
17   b = add;
18   $display ("@%g Value passed is %d", $time, count + b);
19   doInit = 1;
20 endfunction
21 
22 endmodule
23 
24 //compile result
25 
26  @1 Value passed is   9
27  @2 Returning from function
View Code

1.3 Discarding function return values

使用以下方法可以避免为变量分配返回值

1 void'(call_function(with_params));
 1 module function_discard ();
 2 
 3 bit a ;
 4 
 5 initial begin
 6   #1 void'(doInit(4,5));
 7   #1 void'(doInit(9,6));
 8   #1 $finish;
 9 end
10 
11 function bit unsigned doInit (input bit [3:0] count, add);
12   automatic reg [7:0] b;
13   if (count > 5) begin
14     $display ("@%g Returning from function", $time);
15     return 0;
16   end
17   b = add;
18   $display ("@%g Value passed is %d", $time, count + b);
19   doInit = 1;
20 endfunction
21 
22 endmodule
23 
24 //compile result
25  @1 Value passed is   9
26  @2 Returning from function
View Code

2. 参数传递

  • Pass by value
  • Pass by reference
  • Pass by name
  • Pass by position
  • default values
  • Optional arguments.

2.1 按值传递

 1 module function_by_value ();
 2 
 3 reg [7:0] data      ;
 4 reg       parity_out;
 5 integer   i         ;
 6 
 7 function parity;
 8  input [31:0] data;
 9  integer i;
10  begin
11   parity = 0;
12   for (i= 0; i < 32; i = i + 1) begin
13     parity = parity ^ data[i];
14   end
15  end
16 endfunction
17 
18 initial begin
19   parity_out = 0;
20   data = 0;
21   for (i=250; i<256; i = i + 1) begin
22    #5 data = i;
23    parity_out = parity (data);
24    $display ("Data = %b, Parity = %b", data, parity_out);
25   end
26   #10 $finish;
27 end
28 
29 endmodule
30 
31 //compile result
32  Data = 11111010, Parity = 0
33  Data = 11111011, Parity = 1
34  Data = 11111100, Parity = 0
35  Data = 11111101, Parity = 1
36  Data = 11111110, Parity = 1
37  Data = 11111111, Parity = 0
View Code

2.2 按引用传递

按引用传递参数,参数的改变对子例程和方法都是可见的。

 1 module function_by_ref ();
 2 
 3 reg [7:0] data      ;
 4 reg       parity_out;
 5 
 6 time      ltime;
 7 
 8 function reg parity (ref reg [7:0] idata, const ref time tdata);
 9  parity = 0;
10  for (int i= 0; i < 8; i ++) begin
11     parity = parity ^ idata[i];
12  end
13  // We can modify the data passed through reference
14  idata ++ ;
15  // Something that is passed as const  ref, can  not be modified
16  // tdata ++ ; This is wrong
17 endfunction
18 
19 initial begin
20   parity_out = 0;
21   data = 0;
22   for (int i=250; i<256; i ++) begin
23    #5 data = i;
24    ltime = $time;
25    parity_out = parity (data, ltime);
26    $display ("Data = %00000000b, Parity = %b, Modified data : %b",
27       i, parity_out, data);
28   end
29   #10 $finish;
30 end
31 
32 endmodule
33 
34 //compile result
35 
36  Data = 11111010, Parity = 0, Modified data : 11111011
37  Data = 11111011, Parity = 1, Modified data : 11111100
38  Data = 11111100, Parity = 0, Modified data : 11111101
39  Data = 11111101, Parity = 1, Modified data : 11111110
40  Data = 11111110, Parity = 1, Modified data : 11111111
41  Data = 11111111, Parity = 0, Modified data : 00000000
View Code

2.3 按名字和位置传递

按名称和位置传递参数可以混合使用,值要顺序可以匹配即可;

 1 module function_by_name ();
 2 
 3 reg [7:0] data      ;
 4 reg       parity_out;
 5 
 6 time      ltime;
 7 
 8 function automatic reg parity (ref reg [7:0] idata, ref time itime);
 9  parity = 0;
10  for (int i= 0; i < 8; i ++) begin
11     parity = parity ^ idata[i];
12  end
13  // We can modify the data passed through reference
14  idata ++ ;
15  // Something that is passed as const  ref, can  not be modified
16  // tdata ++ ; This is wrong
17 endfunction
18 
19 initial begin
20   parity_out = 0;
21   data = 0;
22   for (int i=250; i<256; i ++) begin
23    #5 data = i;
24    ltime = $time;
25    // By Name
26    parity_out = parity (.idata(data), .itime(ltime));
27    // By position and name
28    parity_out = parity (data, .itime(ltime));
29    // This is wrong, by name should not be before position
30    //parity_out = parity (.idata(data), ltime);
31    $display ("Data = %00000000b, Parity = %b, Modified data : %b",
32      i, parity_out, data);
33   end
34   #10 $finish;
35 end
36 
37 endmodule
38 
39 //compile result
40 
41  Data = 11111010, Parity = 1, Modified data : 11111100
42  Data = 11111011, Parity = 0, Modified data : 11111101
43  Data = 11111100, Parity = 1, Modified data : 11111110
44  Data = 11111101, Parity = 1, Modified data : 11111111
45  Data = 11111110, Parity = 0, Modified data : 00000000
46  Data = 11111111, Parity = 0, Modified data : 00000001
View Code

2.4 默认参数值

  为了处理常见情况或允许使用未使用的参数,SV允许任务和函数声明时为参数指定默认值;括号中定义参数的使用是可选的;

 1 module function_default_value ();
 2 
 3 reg [7:0] data      ;
 4 reg       parity_out;
 5 time      ltime;
 6 
 7 function reg parity (reg [7:0] a, time b = 0, time c = 0);
 8  parity = 0;
 9  for (int i= 0; i < 8; i ++) begin
10     parity = parity ^ a[i];
11  end
12 endfunction
13 
14 initial begin
15   parity_out = 0;
16   data = 0;
17   for (int i=250; i<256; i ++) begin
18    #5 data = i;
19    ltime = $time;
20    parity_out = parity (data);
21    parity_out = parity (data,,);
22    parity_out = parity (data,,10);
23    parity_out = parity (data,ltime,);
24    $display ("Data = %00000000b, Parity = %b", i, parity_out);
25   end
26   #10 $finish;
27 end
28 
29 endmodule
30 
31 //compile result
32  Data = 11111010, Parity = 0
33  Data = 11111011, Parity = 1
34  Data = 11111100, Parity = 0
35  Data = 11111101, Parity = 1
36  Data = 11111110, Parity = 1
37  Data = 11111111, Parity = 0
View Code
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值