关于Verilog中task的一些理解

105 篇文章 14 订阅
module tb;
reg  clk,a,b;
reg   c;
reg d;

initial begin
clk=0;
a=1;
b=0;
  fork 
  begin
    $display("___________________",$time);
	repeat (2) @(posedge clk);
		data_a(a,b,d);
	end
	begin
	$display("********************",$time);
	repeat (2) @(posedge clk);
		data_b(a,b,c);	
		end
  join
end
always #5 clk=~clk;

task data_a(input aa,input bb,output cc );
 begin :block_1
   reg test_signal;
   begin
	@(posedge clk)
		test_signal<=0;  $display("block_1--1------%d",test_signal);  $display($time);
		d<=aa;
	@(posedge clk)
		test_signal<=1;  $display("block_1--2--------%d",test_signal); $display($time);
		d<=bb;
	@(posedge clk)
		test_signal<=0;  $display("block_1--3--------%d",test_signal); $display($time);
		d<=bb+aa;
	@(posedge clk)
		test_signal<=1;  $display("block_1--4--------%d",test_signal); $display($time);
		d<=aa-bb;
  end
 end
endtask


task data_b(input aa,input bb,output cc );
 begin :block_2
   reg test_signal;
   begin
	@(posedge clk)
		test_signal<=0;  
		cc<=aa;  $display("block_2--1--------%d",cc);  $display($time);
	@(posedge clk)
		test_signal<=1; 
		cc<=bb;  $display("block_2--2--------%d",cc);  $display($time);
	@(posedge clk)
		test_signal<=0;  
		cc<=bb+aa;  $display("block_2--3--------%d",cc);  $display($time);
	@(posedge clk)
		test_signal<=1;  
		cc<=aa-bb; $display("block_2--4--------%d",cc);  $display($time);
  end
 end
endtask

endmodule

通过对上述的task进行分析,总结如下:
(1)task声明必须以task-endtask关键字包围,任务体必须以begin-end关键字包围;
(2)task中除了声明input、output 、inout等信号,如果在内部声明wire、reg变量,任务体必须有名字,也就是在第一个begin关键字后加冒号和块名 ;如果没有内部声明wire、reg变量,可以不加块名;
(3)task中声明为output的信号,认为是reg变量,在task中可以直接使用阻塞赋值或者非阻塞赋值;而且在调用task时,与output相对应的必须是reg变量,如data_a(a,b,d)中,d是reg变量;
(4)如果在task中对全局变量赋值,那么赋值结束后,全局变量就会立即改变;但是如果在task中对端口信号或者内部的变量进行赋值,则只有在任务结束之后,才将最后一次对端口信号或者内部变量的赋值传递到外部;例如data_a任务中,变量d是reg型全局变量,在data_a中对d的赋值会立即传递给d;而在data_b中,c 是任务声明的端口信号,只有对c的最后一次赋值才会传递到外部(reg  c)。仿真波形如下:

 

参数的作用是什么?为什么要使用ref参数? 回答: 在Verilog,ref参数的作用是允许函数或任务通过引用传递参数,而不是通过复制参数的值。使用ref参数有两个主要的原因。首先,当函数需要返回多个值或任务需要返回一个以上的值时,通过引用传递参数是有意义的。因为函数只能有一个返回值,而任务没有返回值。其次,当大量的数据需要作为参数传递时,通过值传递会导致效率低下,因为每次函数调用都需要复制数据。使用ref参数可以避免数据复制,提高运行效率。然而,需要注意的是,使用ref参数会使得参数的数据容易被函数或任务的代码修改,为了解决这个问题,可以将ref参数声明为常量。\[1\]在SystemVerilog,ref参数的使用更加灵活,可以将数组传递给子程序,并且可以使用ref和const传递数组。这样可以在子程序对数组进行操作,例如计算校验和。\[2\]总的来说,ref参数是一种方便的参数传递方式,可以提高运行效率和灵活性。\[1\]\[2\] #### 引用[.reference_title] - *1* *3* [System Verilog ref参数的理解](https://blog.csdn.net/weixin_44969124/article/details/108164227)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [systemverilogref的用法](https://blog.csdn.net/Michael177/article/details/120807371)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值