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

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

3天内不再提示

Static变量和Local变量的区别

芯片验证工程师 来源:芯片验证工程师 作者:芯片验证工程师 2022-10-12 09:35 次阅读

变量可以分为3类,即Static、Automatic、和Local。如下表所示。
ec224162-497e-11ed-a3b6-dac502259ad0.png

Static vs. Local Variables

下面的这个例子可以看出Static变量和Local变量的区别:

static int n; // Static variable – outside ‘module’ – 
// globally declared
//visible to all modules/scopes that follow.
module vars;
int n; 
//Local variable - Module level - visible to all 
scopes below
initial begin 
   n = 2;
   $display("module level ‘n’ = %0d",n);
end
initial begin : init2
   int n; //Local - Block level 
   n = 3;
   $display("block level ‘n’ = %0d",n); 
   $unit::n = 4; //Static Global
   $display("Statically declared ‘n’ = %0d",$unit::n); 
end 
initial begin //hierarchical reference to local variable
   $display("init2.n = %0d", init2.n);
end
endmodule

module next; 
//Static variable 'n' is visible in the module 'next'
initial begin
   $display("Statically declared 'n' in module 'next' = 
%0d",$unit::n); 
end
endmodule

Simulation log:

module level ‘n’ = 2
block level ‘n’ = 3
Statically declared ‘n’ = 4
init2.n = 3
Statically declared 'n' in module 'next' = 4
 V C S S i m u l a t i o n R e p o r t

首先,我们在module ' vars '外面声明一个静态变量" int n "。使得这个静态变量n对后面的所有模块都可见。

或者说这个静态变量的作用域不在某个module内,而在整个编译域$unit内。

然后,在module“vars”中声明另一个变量“int n”并赋值2,所以这个n是一个module-level的变量,仅对module vars可见。

然后在过程块init2中声明另一个变量int n
,并赋值为3,使得n只对指定的语句块init2可见。

为了给静态声明的变量“n”赋值,我们需要使用

$unit::n = 4;

block-level “init2.n”可以从其他过程块中访问。

initial begin //hierarchical reference to local variable
    $display("init2.n = %0d", init2.n);
end

Automatic变量 vs. Static 变量

Automatic变量在每次进入语句块时被重新分配内存空间和初始化。相比之下,静态变量只被分配内存空间和初始化一次。
下面是Automatic变量和Static 变量比较的一个示例:

module autovars;
 initial begin
    for (int i=0; i<2; i++) begin
        automatic int loop3 = 0; // executes every loop
        for (int j=0; j<2; j++) begin
            loop3++;
            $display("loop3=%0d",loop3);
        end
    end // loop3 = 1 2 1 2
    for (int i=0; i<2; i++) begin
        static int loop2 = 0; // executes once at time zero
        for (int j=0; j<2; j++) begin
            loop2++;
            $display("loop2=%0d",loop2);
        end
    end // loop2 = 1 2 3 4 
 end
endmodule : autovars

在本例中,有两个for循环。第一个for循环声明了一个名为“loop3”的“automatic”变量,初始值为0。

第二个for循环声明了一个名为loop2的静态变量,初始化为0。
simulation log:

loop3=1
loop3=2
loop3=1
loop3=2
loop2=1
loop2=2
loop2=3
loop2=4

在第一个for循环中,automatic变量每次循环时重新初始化。

simulation log:

loop3=1
loop3=2
loop3=1
loop3=2

相比之下,第二个for循环的静态变量只会初始化一次。
simulation log:

loop2=1
loop2=2
loop2=3
loop2=4

审核编辑:汤梓红

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

    关注

    0

    文章

    596

    浏览量

    28112
  • static
    +关注

    关注

    0

    文章

    33

    浏览量

    10245
  • locale
    +关注

    关注

    0

    文章

    10

    浏览量

    1151

原文标题:SystemVerilog中的Static变量, Automatic变量和Local变量

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

收藏 人收藏

    评论

    相关推荐

    变量的声明和定义有什么区别和联系

    变量的声明和定义是编程中的两个重要概念,它们在语法和语义上有一些区别和联系。在本文中,我将详细介绍变量的声明和定义之间的区别和联系。 首先,让我们从
    的头像 发表于 12-07 16:14 480次阅读

    static的全局变量与局部变量的使用,看完你就懂了

    不能被其它文件所用;其它文件中可以定义相同名字的变量,不会发生冲突。 (1)全局变量和全局静态变量区别 1)全局变量是不显式用
    发表于 06-27 08:54

    static作用(修饰函数、局部变量、全局变量

    详细介绍了static作用(修饰函数、局部变量、全局变量)的用法
    发表于 11-17 10:30 3次下载

    C语言register变量和extern及static等知识总结

    register变量必须是一个单个的值,并且其长度应小于或等于整型的长度。但是,有些机器的寄存器也能存放浮点数。 register变量可能不存放在内存中,所以不能用取址符运算符 。 只有局部变量和形参可以作为register
    发表于 11-21 10:20 5次下载

    C语言中static和extern的区别介绍

    一、在C中,static主要定义全局静态变量、定义局部静态变量、定义静态函数。 1、定义全局静态变量:在全局变量前面加上关键字
    发表于 11-21 10:23 6次下载

    全局变量和成员变量区别分析

    成员变量是指定维度的成员变量,用于标识某个维度成员。简介由 Analysis Services 内部使用的值,以标识某个维度成员。MemberKeyColumn 属性指定维度的成员变量。例如,1到12之间的某个数字可以是相应于年
    发表于 12-11 13:50 6735次阅读
    全局<b class='flag-5'>变量</b>和成员<b class='flag-5'>变量</b>的<b class='flag-5'>区别</b>分析

    全局变量和成员变量区别分析

    成员变量是指定维度的成员变量,用于标识某个维度成员。简介由 Analysis Services 内部使用的值,以标识某个维度成员。MemberKeyColumn 属性指定维度的成员变量。例如,1到12之间的某个数字可以是相应于年
    发表于 12-11 13:50 1147次阅读
    全局<b class='flag-5'>变量</b>和成员<b class='flag-5'>变量</b>的<b class='flag-5'>区别</b>分析

    基于static变量来实现一个模块的封装

    static变量的一个显著的作用就是可以实现一个模块的封装。 static存储类别的特性决定了static声明的全局变量只能被本源文件
    的头像 发表于 01-05 10:54 5325次阅读
    基于<b class='flag-5'>static</b><b class='flag-5'>变量</b>来实现一个模块的封装

    寄存器变量的存储类别

    对于局部变量来说,static变量和auto变量是相对而言的。在语句块执行期间,static变量
    发表于 06-03 11:07 1870次阅读
    寄存器<b class='flag-5'>变量</b>的存储类别

    什么是PLC变量

    都通过变量来操作。 为指令分配变量后,即会使用指定变量的值来执行该指令。 变量在 TIA Portal 中集中管理。 在程序编辑器中创建 PLC
    的头像 发表于 10-11 11:53 1.6w次阅读
    什么是PLC<b class='flag-5'>变量</b>

    西门子PLC变量表中定义变量

    。 程序中多数指令都通过变量来操作。  为指令分配变量后,即会使用指定变量的值来执行该指令。 变量在 TIA Portal 中集中管理。  在程序编辑器中创建 PLC  
    的头像 发表于 12-23 16:25 1.8w次阅读
    西门子PLC<b class='flag-5'>变量</b>表中定义<b class='flag-5'>变量</b>

    linux内核中percpu变量的实现

    我们在使用各种编程语言进行多线程编程时,经常会用到thread local变量。 所谓thread local变量,就是对于同一个变量,每个
    的头像 发表于 01-04 13:39 1683次阅读

    C语言中变量的作用域

    作用域局部变量--local variable全局变量--global variable修饰符--storage description局部变量l
    发表于 01-13 14:58 0次下载
    C语言中<b class='flag-5'>变量</b>的作用域

    为什么C++单例模式不能直接全部使用static变量static函数呢?

    通过getInstance()函数获取单例对象,这种模式的关键之处不是在于强迫你用函数来获取对象。关键之处是让static对象定义在函数内部,变成局部static变量。看下这种实现方式的经典demo:
    的头像 发表于 06-05 14:14 1319次阅读

    什么是变量?PLC变量哪些部分组成?

    变量在 TIA Portal 中集中管理。 在程序编辑器中创建 PLC 变量与在 PLC 变量表中创建 PLC 变量没什么区别。 如
    发表于 10-15 11:31 2039次阅读
    什么是<b class='flag-5'>变量</b>?PLC<b class='flag-5'>变量</b>哪些部分组成?