测试的时候遇到关于task 的问题
时间:10-02
整理:3721RD
点击:
在testbench中这样定义:
......
reg vdd_en,pad_en;
......
initial begin
forever begin
aa_inst(vdd_en,pad_en);
bb_inst(vdd_en,pad_en);
end
end
................
task aa_inst;
begin
vdd_en = 1'b0;
pad_en = 1'b0;
#1000;
vdd_en = 1'b1;
pad_en = 1'b1;
#2000;
vdd_en = 1'b0;
pad_en = 1'b0;
#1000;
end
endtask
task bb_inst;
begin
vdd_en = 1'b0;
pad_en = 1'b0;
#1000;
vdd_en = 1'b1;
pad_en = 1'b1;
#2000;
vdd_en = 1'b0;
pad_en = 1'b0;
#1000;
end
endtask
在被测试代码中有这样的2个计数模块:
..........
always@(posedge pad_en) begin
num <= num + 1'b1;
end
always@(posedge vdd_en) begin
num1 <= num1 + 1'b1;
end
...................
测试的软件是用vcs2009版本(用modelsim仿真完全没有问题),结果却出现意外的情况:
首先声明函数间的传递完全没有问题,在波形上看vdd_en和pad_en的波形也完全没有问题;
但是在执行完aa_inst到执行bb_inst这段时间里面(bb_inst执行完转到执行aa_inst的时候也会有这样的问题),num和num1的值都发生了变化,但是在aa_inst结束时候vdd_en和pad_en都为0,而到了bb_inst中的开始也是全为0,并没有沿的变化,但是num和num1确实发生了变化!
什么原因呢?百思不得其解啊!求教高手!
自己顶一下,高手都度假去了么
个人建议,pad_en非时钟类信号时,不要使用
always@(posedge pad_en)
来建模
还有其他方式建模,比如
always@(posedge clk)
if(pad_en)
...
lz试一试
thank you !
自己顶一下,高手请教!
三楼的方法学习了。看来还是在任何时候都避免异步