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
相关产品推荐
相关产品推荐

