当前位置:   article > 正文

verilog仿真常用语法_verilog仿真语法

verilog仿真语法

1.initial

initial块可以理解为一个初始化块,在initial的起始位置的语句在0时刻即开始执行,之后如果遇到延时,则延时之后执行接下来的语句。
注意:代码可以有任意个initial块,每个initial块之间是并行的,不管在代码任何地方。

2.task and function

任务和函数最大的区别是。任务可以消耗时间,函数无延时。任务可以调用函数。函数在verilog语法中无法调用任务,但是在sv语法中可以调用无延时的任务。当然我们的环境中是支持verilog2001和systemverilog语法标准的。

(1)任务的定义

task是verilog语法中非常重要的子程序之一。task的设计语法和module类似。我们都知道设计module的时候有两种端口申明方式。
一种是传统的也是我们常用的verilog1995标准的写法:

module modulename(portlist);
input  xxx;
output xxx;
endmodule
  • 1
  • 2
  • 3
  • 4

另一种具有强烈的C语言风格verilog2001和systemverilgo均支持:

module modulename(input  xxx1, input xxx2, output  xxx);
...
endmodule
  • 1
  • 2
  • 3

所以task也有两种不通的设计风格;
一种比较传统(相较于1995标准2001标准取消的子程序之间的begin和end):

task taskname_xxx;
input  xxx;
output  yyy;
reg yyy;
...
endtask
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

另外一种:

task taskname_xxx(input xxx,output reg yyy);
...
endtask
  • 1
  • 2
  • 3

(2)任务参数的方向

关于task的输入输出时序可以看下边的例子:
task使用实例
首先我们定义一个任务;

task a_plus_b;
input      [1:0] a;
input      [1:0] b;
output reg  [1:0] c;
c = a+b;
#100;
endtask
initial
begin
a_in=0;
b_in=0;
c_out=0;
#100;
a_in=2’b01;
b_in=2’b10;
c_out= a_plus_b(.a(a_in),.b(b_in),c(c_out));
#100;
end
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18

注意:task的output会被task块阻塞,output的变量值会在整个task执行完才会跳变。
所以上述c_out会在第200ns后跳变为a_in和b_in的和。
若想实时得到output输出的而不是等到task结束的话,可以将output定义为ref参考类型:

task a_plus_b;
input      [1:0] a;
input      [1:0] b;
ref   reg  [1:0]c;
c = a+b;
#100;
endtask
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

(3)函数定义

3.force语句

4.wait和@语句

5.for语句

6.foreach语句

7.while语句

8.generate语句

9.fork_join并行语句

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/码创造者/article/detail/784442
推荐阅读
相关标签
  

闽ICP备14008679号