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

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

module modulename(input  xxx1, input xxx2, output  xxx);
...
endmodule

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

task taskname_xxx;
input  xxx;
output  yyy;
reg yyy;
...
endtask

另外一种:

task taskname_xxx(input xxx,output reg yyy);
...
endtask

(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

注意: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

(3)函数定义

3.force语句

4.wait和@语句

5.for语句

6.foreach语句

7.while语句

8.generate语句

9.fork_join并行语句

  • 5
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值