SV function

xiaoxiao2021-02-28  106

写了一个function,借此谈谈 对SV 子程序的理解。

//函数 function automatic void check_read32 (ref int unsigned rdata , bit [31:0] check_value [], input string check_name); if(rdata != check_value[0] ) begin $display("%s compare failed , read data %0h may not expected!", check_name, rdata); end endfunction //调用此函数的program program hello_sv; //module hello_sv; initial begin bit [31:0] check_value []; int unsigned rdata; rdata= 'h89ABCDEF ; check_value = '{'h89ABCDEF,'ha0a02020}; check_read32(rdata,check_value,"rdata32('h4000_F000, ta)"); end endprogram :hello_sv //endmodule verilog 程序块的封装,常以module封装各个模块。但是使用module 保存 测试平台常会引起驱动和采样的问题。SV引入program块,这个program会将时间片化为不同的区域,将TB的事件和设计的事件分开。数据定义,对于int byte等,默认是有符号型,注意合理定义为无符号型。(个人认为,如果用不到负数,定义为有无符号型都无所谓,最好使用无符号型吧吗,绿书P21说带符号为的变量随机化时会出现意想不到的坏结果)。这里是因为动态数据定义为无符号型。函数的调用时,这里传入的参数和定义时的变量名一样,实际上当然也可以不一样,传入的时候位置对应整齐就好。函数定义时,function automatic void check_read32(). automatic 类型表示自动存储,当这个函数在不同地方同时使用时,不会导致这些函数中的局部变量被互相篡改,调用。在一个类中默认所以方法为automatic类型。void 是无返回值,若有返回值,这这里的void要换成返回值的类型后面就是名函数名字了函数的变量,可以在括号中直接指定,也可以在后面指定。ref类型有两个优点 把数组传递给子程序(当然,不带ref也可向子程序中传递数组,当时这是不带ref,数组先会被copy到堆栈,如果数据较大,就很耗费资源了)。在task里,ref变量可被修改,并且其他对其调用的函数里,可见。
转载请注明原文地址: https://www.6miu.com/read-39690.html

最新回复(0)