Verilog task 任务-程序员宅基地

技术标签: Function  Task  Verilog系列教程  FPGA  Verilog  任务  

语法

function可以对输入数据进行处理,并返回一个值,而task更通用,可以计算出多个值,可以使用output或inout参数类型,task可以包含仿真时间控制,例如@,posedge等。

// Style 1
task [name];
    input  [port_list];
    inout  [port_list];
    output [port_list];
    begin
        [statements]
    end
endtask

// Style 2
task [name] (input [port_list], inout [port_list], output [port_list]);
    begin
        [statements]
    end
endtask

// Empty port list
task [name] ();
    begin
        [statements]
    end
endtask

Verilog中的Function函数和C中的函数非常类似,它可以根据你的输入,返回计算的结果,函数的实现只能是组合逻辑,不能包括时间控制,例如#100,可以指定返回值的类型,应该包含至少1个输入,输入只能是input类型,不能是inout或output,只能返回一个值。

当task/function定义为automatic,其变量也是隐式automatic的。 因此,在多次调用task/function时,变量每次都会分配内存并不会覆盖。

静态task的定义

如果task是静态定义的,成员变量将会在不同调用之间共享。

task sum (input [7:0] a, b, output [7:0] c);
    begin
        c = a + b;
    end
endtask
// or
task sum;
    input  [7:0] a, b;
    output [7:0] c;
    begin
        c = a + b;
    end
endtask

initial begin
    reg [7:0] x, y , z;
    sum (x, y, z);
end
静态调用示例

仿真文件:

module tb;

  initial display();
  initial display();
  initial display();
  initial display();

  // This is a static task
  task display();
    integer i = 0;
    i = i + 1;
    $display("i=%0d", i);
  endtask
endmodule

运行结果:

xcelium> run
i=1
i=2
i=3
i=4
xmsim: *W,RNQUIE: Simulation is complete.
automatic示例

如果任务被加上了automatic关键字,那么每次调用任务时都会分配不同的空间。

仿真文件:

module tb;

  initial display();
  initial display();
  initial display();
  initial display();

  // Note that the task is now automatic
  task automatic display();
    integer i = 0;
    i = i + 1;
    $display("i=%0d", i);
  endtask
endmodule

运行结果:

xcelium> run
i=1
i=1
i=1
i=1
xmsim: *W,RNQUIE: Simulation is complete.
全局task

如果task被声明在Module的外部,它将是全局的,可以被当前文件内的所有module调用。

例如:

// This task is outside all modules
task display();
  $display("Hello World !");
endtask

module des;
  initial begin
    display();
  end
endmodule

运行结果:

xcelium> run
Hello World !
xmsim: *W,RNQUIE: Simulation is complete.

如果task被定义在某个module范围内,那么它将只能在当前module范围内使用。

例如:

module tb;
	des u0();

	initial begin
		u0.display();  // Task is not visible in the module 'tb'
	end
endmodule

module des;
	initial begin
		display(); 	// Task definition is local to the module
	end

	task display();
		$display("Hello World");
	endtask
endmodule

运行结果:

xcelium> run
Hello World
Hello World
xmsim: *W,RNQUIE: Simulation is complete.
task和function的区别
Function Task
不能包含时间控制相关的关键字 可以包含时间控制语句
不能启动另一个task 可以启动另一个task或调用function
应该包括至少1个输入 能够包括0个或多个输入
只能有1个输出

当function包含时间控制语句时,例如:

module tb;
  reg signal;

  initial wait_for_1(signal);

  function wait_for_1(reg signal);
    #10;
  endfunction
endmodule

报语法错误:

 #10; xmvlog: *E,BADFCN (testbench.sv,7|4): illegal time/event control statement within a function or final block or analog initial block [10.3.4(IEEE)].
禁止任务

task可以通过disable,以下示例中display任务将会在50ns后被结束。

module tb;

  initial display();

  initial begin
  	// After 50 time units, disable a particular named
  	// block T_DISPLAY inside the task called 'display'
    #50 disable display.T_DISPLAY;
  end

  task display();
    begin : T_DISPLAY
      $display("[%0t] T_Task started", $time);
      #100;
      $display("[%0t] T_Task ended", $time);
    end

    begin : S_DISPLAY
      #10;
      $display("[%0t] S_Task started", $time);
      #20;
      $display("[%0t] S_Task ended", $time);
    end
  endtask
endmodule

运行结果:

xcelium> run
[0] T_Task started
[60] S_Task started
[80] S_Task ended
xmsim: *W,RNQUIE: Simulation is complete.

FROM:verilog-task

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/whik1194/article/details/114704236

智能推荐

C++错误 --不允许使用抽象类类型-程序员宅基地

文章浏览阅读4.5k次,点赞2次,收藏4次。这个问题是因为你把抽象类实例化了,抽象类是类中包含一个或多个纯虚函数,这是被C++禁止的。那怎么办呢??---建议不要实例化抽象类,而是定义定该类指针,该指针可以指向子类,形成多态。..._不允许使用抽象类类型

[总结]虚拟主机独立IP与共享IP技术2_共享ip和独立ip设置a记录-程序员宅基地

文章浏览阅读1.3k次。[总结]虚拟主机独立IP与共享IP技术1_共享ip和独立ip设置a记录

ORA-06413: 连接未打开|Unable to open connection to “Oracle, Microsoft provider V1.0.5000.0“.-程序员宅基地

文章浏览阅读1.7k次。初入甲骨错难除,三天未解愧难当。绞尽脑汁无门去,谁知下页有解来。_ora-06413

关于SQLContext过期,SparkSession登场_sqlcontext 过期了-程序员宅基地

文章浏览阅读1.6k次。关于SQLContext过期问题。源码中解释道:spark2.0之后使用sparksession替代,不过仍然保留了SQLContext。那么他们两个有不同吗?这里只说一个重要的。在你使用SparkSession代替SQLContext的时候package SparkSqlimport org.apache.spark.sql.{DataFrame, SQL..._sqlcontext 过期了

使用VsCode开发Lua插件推荐(Lua)_vscode编写lua程序-程序员宅基地

文章浏览阅读3.7w次,点赞7次,收藏20次。在我看来能够跳转的Lua插件就是好插件,今天推荐的一款插件就是这么一款。通过Vscode插件搜索Lua (Lua Language Server coded by Lua),支持跳转定义、查询引用、代码检查、高亮等。下载好后即可使用。这里说一下设置代码检查配置。在settings.json配置"Lua.diagnostics.severity" : { "redefi..._vscode编写lua程序

Rospy的官方教程代码讲解(二)消息头和用户数据_rospy tutorial-程序员宅基地

文章浏览阅读2.9k次,点赞6次,收藏12次。Rospy的官方教程代码讲解(二)消息头和用户数据刚刚发现的重大事实是ROS wiki里的rospy教程和github里rospy_tutorials代码是完全不同的 Σ(っ°Д°;)っ男默女泪啊 щ(゚Д゚щ) 我整个人都方了有木有。。。 先讲rospy_tutorials的,因为这个好像没有相关教程,只有代码(´•ω•`)Rospy的官方教程代码讲解二消息头和用户数据消息头_rospy tutorial

随便推点

Java并发之Semaphore详解_java semaphore 使用详解-程序员宅基地

文章浏览阅读2.9w次,点赞4次,收藏25次。一、入题 Semaphore是一种基于计数的信号量。它可以设定一个阈值,基于此,多个线程竞争获取许可信号,做完自己的申请后归还,超过阈值后,线程申请许可信号将会被阻塞。Semaphore可以用来构建一些对象池,资源池之类的,比如数据库连接池,我们也可以创建计数为1的Semaphore,将其作为一种类似互斥锁的机制,这也叫二元信号量,表示两种互斥状态。它的用法如下: 二、_java semaphore 使用详解

Spring Boot 中文乱码解决-程序员宅基地

文章浏览阅读3.7k次。Spring Boot 中文乱码解决第一步,约定传参编码格式不管是使用httpclient,还是okhttp,都要设置传参的编码,为了统一,这里全部设置为utf-8第二步,修改application.properties文件增加如下配置:spring.http.encoding.force=truespring.http.encoding.charset=UTF-8spr..._spring boot 中文乱码

java|android加载src路径下面的图片文件_安卓开发获取图片的src-程序员宅基地

文章浏览阅读3.8k次。//我把a.jpg和MainActivity 放在同一个路径下面 @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); Context context = getApplicationContext();_安卓开发获取图片的src

如何实现界面布局根据阿拉伯语、波斯语等RTL语言而反转_preference rtl-程序员宅基地

文章浏览阅读3.3k次。如何实现界面布局根据阿拉伯语、波斯语等RTL语言而反转android4.2 新增了RTL布局镜面反射,这种镜面反射其实就是根据语言显示方向调整layout布局,但google只是对少数app进行了设置,比如setting。如果想要在其他应用中使用这特性可以按照如下进行修改:1、在AndroidManifest.xml声明文件的元素中,添加” android:supportsRtl=_preference rtl

idea2020.3.1新建javaweb项目无servlet和filter解决办法_没有servlet.filter包-程序员宅基地

文章浏览阅读4.1k次,点赞9次,收藏12次。除apache-tomcat-9.0.31之外,以下方法都可用在File->Project Structure->Modules->Dependencies中 在左下角点击“+” 3.选择已下载过的tomcat里的servlet-api.jar() 文件位置在:apache-tomcat-10.0.0-M1\lib 4.添加后点击apply即可 5.在src目录下已可以新建servlet和filter ..._没有servlet.filter包

9、XCTF get_post_请再以post方式随便提交一个名为post且值为1的变量-程序员宅基地

文章浏览阅读340次。X老师告诉小宁同学HTTP通常使用两种请求方法,你知道是哪两种吗?打开网站,看到下面请用GET方式提交一个名为a,值为1的变量。构造payload,http://111.200.241.244:50152/?a=1得到,请再以POST方式随便提交一个名为b,值为2的变量在构造一个http://111.200.241.244:50152/?a=1Poat data b=2得到flag。基础知识:HTTP协议中共定义了八种方法或者叫“动作”来表明对Request-URI指定的资源的_请再以post方式随便提交一个名为post且值为1的变量

推荐文章

热门文章

相关标签