原创 Writing testbench——防止同时调用task

2009-3-19 20:27 6377 7 7 分类: FPGA/CPLD

Writing testbench——防止同时调用task<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />


 


       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中的alwaysinitial在实际执行中都是并行工作的,也就很有可能出现上面两个initial同时进行task调用,同时需要写存储器的情况。那样会出现什么后果呢?可想而知,这是我们不希望看到的。


       那么如何解决这样的问题呢?看下面改进后的代码。


 


task write;


input [7:0] wadd;


input [7:0] wdat;


reg in_use;


begin


if (in_use === 1b1) $stop;


in_use = 1b1;


ad_dt <= wadd;


ale <= 1’b1;


rw <= 1’b1;


@ (posedge rdy);


ad_dt <= wdat;


ale <= 1’b0;


@ (negedge rdy);


in_use = 1b0;


end


endtask


 


       粗体部分就是加入了检错机制,用in_use作为task已被调用的标志信号,从而避免其它的调用。


 


 


 

PARTNER CONTENT

文章评论0条评论)

登录后参与讨论
EE直播间
更多
我要评论
0
7
关闭 站长推荐上一条 /3 下一条