0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

怎样去使用SystemVerilog中的Static方法呢

芯片验证工程师 来源:芯片验证工程师 作者:验证哥布林 2022-11-18 09:31 次阅读

在systemverilog中方法也可以声明为“static”。静态方法意味着对类的所有对象实例共享。

在内存中,静态方法的声明存储在一个同一个地方,所有对象实例都可以访问。

另外,静态方法可以在类外部访问,即使还没有实例化任何一个类对象。

静态方法只能访问静态属性。

从静态方法访问非静态属性会导致编译错误,静态方法也不能是virtual的,也不能使用“this”句柄。

module class_TOP( );
 class base;
 static logic [31:0] data ; //static property
 logic [31:0] addr; //dynamic property
 static task munge; //Static method
 data = 32'h f0f0_f0f0; //OK to access static variable
 //addr = 32'h ff_0000; //NOT OK since 'addr' is not static
 $display("data = %h", data);
 endtask
 endclass : base
 
 base base1;
 
 initial begin
 base1.munge;
 end
 initial #10 $fnish(2);
 endmodule

仿真log:

data = f0f0f0f0
$fnish at simulation time 10
 V C S S i m u l a t i o n R e p o r t

在本例中,我们在类“base”中声明了一个名为“munge”的静态方法。

我们访问“munge”可以使用尚未完成实例化的对象句柄“base1”。

需要注意的是,静态方法“munge”只能索引静态变量“data”,如果取消下面这行代码的注释,则会发生编译错误。

因为“addr”不是静态变量,需要实例化后使用对象的句柄才能访问。

//addr = 32'h ff_0000; //NOT OK since 'addr' is not static

静态函数访问非静态变量,会导致编译错误:

Error-[SV-AMC] Non-static member access
testbench.sv, 9
class_TOP, "addr" Illegal access of non-static member 'addr' from static method 'base::munge'.

还可以使用类解析操作符访问静态方法,建议使用这种方法,因为它清楚地标识了我们正在访问一个静态方法。

class setIt;
 static int k;
 static function set (int p );
 k = p + 100;
 endfunction
endclass
 
module tbTop;
 initial begin
 setIt::set(10);
 $display("k = %0d",setIt::k);
 setIt::set(20);
 $display("k = %0d",setIt::k);
 end
endmodule

仿真log:

k = 110
k = 120
 V C S S i m u l a t i o n R e p o r t

静态变量和静态方法隶属于一个类,而不是类的某个对象实例。如果在静态方法前面加上virtual,你会得到一个编译错误:

class base;
 virtual static task munge();
 endtask
 endclass

编译log:

Error-[WUCIQ] Invalid qualifer usage
testbench.sv, 32
Invalid use of class item qualifers. Cannot use virtual and static keywords
together for method declarations.





审核编辑:刘清

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • Verilog语言
    +关注

    关注

    0

    文章

    113

    浏览量

    8160

原文标题:SystemVerilog中的Static方法

文章出处:【微信号:芯片验证工程师,微信公众号:芯片验证工程师】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    SystemVerilog 的VMM验证方法学教程教材

    SystemVerilog 的VMM 验证方法学教程教材包含大量经典的VMM源代码,可以实际操作练习的例子,更是ic从业人员的绝佳学习资料。SystemVerilog 的VMM 验证方法
    发表于 01-11 11:21

    怎样设计开关电源的电感

    怎样为开关电源选择合适的电感?怎样设计开关电源的电感
    发表于 10-14 08:05

    怎样解决电路设计的电平转换问题

    怎样解决电路设计的电平转换问题?有哪几种常用的通信电平转换的方案
    发表于 10-29 07:04

    怎样使用Matlab的编程语句

    怎样使用Matlab的编程语句?Matlab中常用的编程语句有哪些
    发表于 11-18 06:12

    怎样使用STM32的DAC接口

    DAC数字/模拟转换模块是什么?有何作用?怎样使用STM32的DAC接口
    发表于 11-25 09:03

    怎样使用ARM的伪操作及指令

    怎样使用ARM的伪操作及指令?加载程序地址的方法有哪几种
    发表于 11-29 06:50

    怎样使用Cortex-M内核的精确延时方法

    为什么要学习这种Cortex-M内核的精确延时方法怎样使用Cortex-M内核的精确延
    发表于 11-30 06:00

    在STM32串口通信程序怎样使用printf发送数据

    使用printf函数需要做哪些配置?有哪几种配置方法?在STM32串口通信程序怎样使用printf发送数据
    发表于 11-30 06:42

    怎样使用STM32的串口封装printf函数

    怎样使用STM32的串口封装printf函数?有哪几种封装方式?有哪些注意事项?
    发表于 11-30 07:48

    怎样在STM32中去选用IO模式

    如何对STM32单片机的GPIO进行配置怎样在STM32中去选用IO模式
    发表于 12-10 07:53

    怎样解决编译SYSTEM程序错误的问题

    怎样解决编译SYSTEM程序错误的问题?其解决方法是什么?
    发表于 12-16 07:40

    怎样使用一种异域加密的方法

    怎样使用一种异域加密的方法
    发表于 01-20 07:01

    怎样使用ROS的launch启动文件

    怎样使用ROS的launch启动文件?ROS的launch启动文件该怎样
    发表于 02-14 07:23

    怎样设置DDR时钟的频率

    怎样设置DDR时钟的频率?有何方法
    发表于 03-03 10:53

    SystemVerilog中的操作方法

    SystemVerilog提供了几个内置方法来支持数组搜索、排序等功能。
    的头像 发表于 10-31 10:10 1835次阅读