Writing testbench——防止同时调用task
0赞Testben使用的是硬件语言,而其 所依赖的环境却是基于PC的软件平台。这也就决定 了其独特的代码风格。有时的的确确是以一个软件式的顺序方式在给待测试硬件代码做测试,但是写出来的testbench代码中却时常布满了并行执行的陷阱。这给硬件测试者带来了不少麻烦,既然我 们选择了verilog,那么就得好好领会它在 硬件测试环境下的特殊性。或者说,我们应该掌握一些常用的技巧来避免这些问题,让我们的testbench更高效的执行。
下面就是一个task使用的常见冲突以及解 决办法。
task write;
input [7:0] wadd;
input [7:0] wdat;
begin
ad_dt <= wadd;
ale <= 1’bl;
rw <= 1’bl;
@ (posedge rdy) ;
ad_dt <= wdat;
ale <= 1’b0;
@ (negedge rdy);
end
endtask
initial write(8’h5A, 8’h00);
initial write(8’hAD, 8’h34);
上面的task实现了往存储器的指定地址写入指定数据的功能。由于verilog中的always和initial在实际执行中都是并行工作的,也就很有可能出现上面两个initial同时进行task调用,同时需要写存储 器的情况。那样会出现什么后果呢?可想而知,这是我们不希望看到的。
那么如何解决这样的问题呢?看下面改进后的代码。
task write;
input [7:0] wadd;
input [7:0] wdat;
reg in_use;
begin
if (in_use === 1’b1) $stop;
in_use = 1’b1;
ad_dt <= wadd;
ale <= 1’b1;
rw <= 1’b1;
@ (posedge rdy);
ad_dt <= wdat;
ale <= 1’b0;
@ (negedge rdy);
in_use = 1’b0;
end
endtask
粗体部分就是加入了检错机制,用in_use作为task已被调用的标志信号, 从而避免其它的调用。