微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > FPGA,CPLD和ASIC > 测试的时候遇到关于task 的问题

测试的时候遇到关于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 !

自己顶一下,高手请教!

三楼的方法学习了。看来还是在任何时候都避免异步

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top