You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Verilog代码中B、C取值差异解析:为何C持续递增?

Verilog函数局部变量行为差异解析

代码示例

class A;
    function int foo();
        int a;
        return ++a;
    endfunction
  
endclass

program tb;
    A a =new;
    int b, c;

    initial begin
        for (int i = 0; i < 10; i++) begin
            b = a.foo();
            c = foo(); // Calls a different foo() outside of the class A
            $display("B = %0d", b);
            $display("C = %0d", c);
        end
    end

    function int foo();
        int a;
        return ++a;
    endfunction
endprogram

运行输出

B = 1
C = 1
B = 1
C = 2
B = 1
C = 3
B = 1
C = 4
B = 1
C = 5
B = 1
C = 6
B = 1
C = 7
B = 1
C = 8
B = 1
C = 9
B = 1
C = 10
$finish at simulation time                    0
           V C S   S i m u l a t i o n   R e p o r t

疑问与解答

疑问:原本认为两个foo函数中的局部变量a每次被调用时都会初始化,但运行结果显示B始终为1,C却持续递增。为何C的取值会不断递增?

核心原因:两类函数的局部变量存储属性不同

  • 类成员函数(A::foo)的局部变量:每次调用函数时,局部变量a都会被重新创建并初始化为0,执行++a后返回1,所以每次调用a.foo()得到的结果都是1,对应输出里的B始终为1。
  • Program级函数(tb::foo)的局部变量:在SystemVerilog中,模块(或program)级函数的局部变量默认是**静态(static)**的。也就是说这个变量只会在第一次调用函数时初始化一次,后续调用时会保留上一次调用结束时的值。第一次调用时a初始化为0,++a后变成1;第二次调用时a的初始值是1,++a后变成2,以此类推,所以每次调用foo()得到的结果会持续递增,对应输出里的C从1到10逐步增加。

内容的提问来源于stack exchange,提问作者Zazy

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.30 23:00:12