所以,在设计中除了那些极简单的设计(如调用厂商提供的MegaCore),推荐通过写testbench的方法来做功能验证。
有关testbench的一些问题
tasktest_task;//task的定义,以task关键字开始,紧接后面是task的id,名字
input [1:0] a;//task的输入输出定义,用来和外面的变量进行交换,是通向外面的接口
output [1:0] b;
begin
b = ~a;
end
endtask
reg [1:0] task_a;
reg [1:0] task_b; //因为task必须在过程语句中调用,所以其实参必须为reg类型的
initial
begin
task_a =2'b0;
test_task(task_a,task_b);//task的调用,直接调用,没有什么像module一样例化的东西
#10 task_a =2'b10;
end
initial
begin
#20 task_a =2'b11;
test_task(task_a,task_b);//同样可以改变task内部的值,和module不同,这是同一个task
#10 task_a =2'b10;
end
reg [1:0] task1_a;
reg [1:0] task1_b;
task test_task1;
output [1:0] b;
assign b = ~task1_a;//可以使用全局变量,不一定是task内部的变量
endtask
initial
begin
task1_a = 2'd0;
#1test_task1(task1_b);
#10 task1_a = 2'd1;
#1test_task1(task1_b);
#10 task1_a = 2'd2;
#1test_task1(task1_b);
#10 task1_a = 2'd3;
#1test_task1(task1_b);
end
task和module有点类似,都可以通过输入输出来和外面,这个时候module可以例化多次,这样就是不同的单元,和task
还是有区别的。
1,task只能定义在module内部,不能单独在一个文件中,不能定义在module外面。
2,在task调用的是必须在过程性语句内部使用,initial,begin... end
3,task可以没有参数,直接使用全局变量来实现功能。
4,可以使用延时控制,可以调用其他task和函数。
函数:可以调用函数,不能调用任务,不可有时序控制。
function [1:0]invert;//只有一个返回值,invert,寄存器类型的
//input [1:0]a;//可以有一个输入,或者多个,或者没有输入
//begin
invert = 2'd3;
//end
endfunction
reg [1:0] fun_a;
reg [1:0] fun_out;
initial
begin
fun_a =2'd2;
fun_out =invert();//(fun_a);//调用函数,函数返回一个值,必须在过程性语句中调用。
#50 fun_a =2'd1;
fun_out = invert();//(fun_a);
#50 fun_a =2'd0;
fun_out = invert();//(fun_a);
#50 fun_a =2'd3;
fun_out = invert();//(fun_a);
end
task test_task1;//任务调用函数
output [1:0] b;
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/tongxinshuyu/article-36621-3.html
别以为这是US的强大