技术标签: 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 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关键字,那么每次调用任务时都会分配不同的空间。
仿真文件:
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被声明在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.
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
文章浏览阅读4.5k次,点赞2次,收藏4次。这个问题是因为你把抽象类实例化了,抽象类是类中包含一个或多个纯虚函数,这是被C++禁止的。那怎么办呢??---建议不要实例化抽象类,而是定义定该类指针,该指针可以指向子类,形成多态。..._不允许使用抽象类类型
文章浏览阅读1.3k次。[总结]虚拟主机独立IP与共享IP技术1_共享ip和独立ip设置a记录
文章浏览阅读1.7k次。初入甲骨错难除,三天未解愧难当。绞尽脑汁无门去,谁知下页有解来。_ora-06413
文章浏览阅读1.6k次。关于SQLContext过期问题。源码中解释道:spark2.0之后使用sparksession替代,不过仍然保留了SQLContext。那么他们两个有不同吗?这里只说一个重要的。在你使用SparkSession代替SQLContext的时候package SparkSqlimport org.apache.spark.sql.{DataFrame, SQL..._sqlcontext 过期了
文章浏览阅读3.7w次,点赞7次,收藏20次。在我看来能够跳转的Lua插件就是好插件,今天推荐的一款插件就是这么一款。通过Vscode插件搜索Lua (Lua Language Server coded by Lua),支持跳转定义、查询引用、代码检查、高亮等。下载好后即可使用。这里说一下设置代码检查配置。在settings.json配置"Lua.diagnostics.severity" : { "redefi..._vscode编写lua程序
文章浏览阅读2.9k次,点赞6次,收藏12次。Rospy的官方教程代码讲解(二)消息头和用户数据刚刚发现的重大事实是ROS wiki里的rospy教程和github里rospy_tutorials代码是完全不同的 Σ(っ°Д°;)っ男默女泪啊 щ(゚Д゚щ) 我整个人都方了有木有。。。 先讲rospy_tutorials的,因为这个好像没有相关教程,只有代码(´•ω•`)Rospy的官方教程代码讲解二消息头和用户数据消息头_rospy tutorial
文章浏览阅读2.9w次,点赞4次,收藏25次。一、入题 Semaphore是一种基于计数的信号量。它可以设定一个阈值,基于此,多个线程竞争获取许可信号,做完自己的申请后归还,超过阈值后,线程申请许可信号将会被阻塞。Semaphore可以用来构建一些对象池,资源池之类的,比如数据库连接池,我们也可以创建计数为1的Semaphore,将其作为一种类似互斥锁的机制,这也叫二元信号量,表示两种互斥状态。它的用法如下: 二、_java semaphore 使用详解
文章浏览阅读3.7k次。Spring Boot 中文乱码解决第一步,约定传参编码格式不管是使用httpclient,还是okhttp,都要设置传参的编码,为了统一,这里全部设置为utf-8第二步,修改application.properties文件增加如下配置:spring.http.encoding.force=truespring.http.encoding.charset=UTF-8spr..._spring boot 中文乱码
文章浏览阅读3.8k次。//我把a.jpg和MainActivity 放在同一个路径下面 @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); Context context = getApplicationContext();_安卓开发获取图片的src
文章浏览阅读3.3k次。如何实现界面布局根据阿拉伯语、波斯语等RTL语言而反转android4.2 新增了RTL布局镜面反射,这种镜面反射其实就是根据语言显示方向调整layout布局,但google只是对少数app进行了设置,比如setting。如果想要在其他应用中使用这特性可以按照如下进行修改:1、在AndroidManifest.xml声明文件的元素中,添加” android:supportsRtl=_preference rtl
文章浏览阅读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包
文章浏览阅读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的变量