闲庭信步使用SV搭建图像测试平台:第五课——使用task

发布于:2025-06-22 ⋅ 阅读:(18) ⋅ 点赞:(0)

 (如需要该系列的工程文件请关注知识星球:成工fpga,https://t.zsxq.com/DMeqH关注即送200GB学习资料,链接已置顶!)

fpga仿真文件中的initial块其实就相当于c、c++、python等的主函数,到目前为止,图像的读写,图像RGB通道的分离,生成RAW图像等功能都是在initial块中实现的,我们来看看代码,initial块已经有100多行了,后续随着功能的增加,长度还会增加。

这就会出现一些问题,首先就是代码的可读性差,还好前面有讲解,大家可以很快的明白代码要实现的功能,如果直接给到一个没有看过讲解的朋友,把代码读明白就要很长时间;其次就是代码的可维护性差,对于成千上万行的代码,如果要修改或者删除一些功能,怎么保证修改的部分不会影响到其它的功能?还有就是定位问题效率低,如果测试发现某个功能有问题,由于代码很冗长和混乱,很难快速的定位问题。

其实对于高级编程语言的学习者,很多人存在类似的问题,喜欢把所有功能都在main函数中实现。其实高级语言都可以定义函数的,system verilog也不例外,可以定义函数function和任务task,但是function只能实现组合逻辑,而task既可以实现组合逻辑又可以实现时序逻辑。通俗的讲,组合逻辑就是不消耗仿真时间的,就像本系列全部是组合逻辑,在仿真时刻0可以完成所有的功能;而时序逻辑是要消耗仿真时间的,必须有时钟的驱动。

成工其实是做时序仿真比较多,所以倾向于使用task,function用的比较少,所以本系列的各个功能,成工基本上都是用task来实现。

到目前为止,我们主要实现了读图片,写图片,写txt文档,图像的RGB通道分离,由彩色图片生成RAW图片这五个功能,那我们就新建五个task,如下所示,新建了read_image,save_image,save_txt,save_image_rgb,save_raw这五个task。

再看initial块,清晰明了多了,可读性和维护性提高了,定位问题的效率也提高了,比如生成的RAW图像有问题,直接去查看save_raw这个task即可。

最后说明一下,task是可以访问task外定义的变量和参数的,比如img_all等变量,这些相当于是全局的变量,task块内可以直接访问全局的变量。还有就是task的接口参数可以用input和output来指明方向,也可以不指明。


网站公告

今日签到

点亮在社区的每一天
去签到