了解系统verilog函数返回值

时间:2014-08-20 04:17:51

标签: system-verilog

我正在尝试从语言资源手册(第10.3.1节)中理解系统verilog函数返回值,但是我在掌握以下部分时遇到了困难。任何人都可以帮我解释它吗?我尝试在不同的网站查找信息并不那么深刻。

  

在SystemVerilog中,函数返回可以是结构或联合。在这种情况下,函数内部使用的以函数名称开头的层次结构名称将被解释为返回值的成员。如果在函数外部使用函数名称,则名称表示整个函数的范围。如果函数名称在分层名称中使用,则它还指示整个函数的范围。

a = b + myfunc1(c, d); //call myfunc1 (defined above) as an expression
myprint(a); //call myprint (defined below) as a statement
function void myprint (int a);
...
endfunction

谢谢

2 个答案:

答案 0 :(得分:5)

您可以使用两种不同的方法从函数返回值。例如,如下,

function int myfunc1(int c, d);
  myfunc1 = c+d;
endfunction

function int myfunc1(int c, d);
  return c+d;
endfunction

因此,当函数声明为结构或联合类型时,以函数名开头的层次结构名称也表示返回值的变量。 但旧的LRM描述现在不正确和准确,因为现在的分层名称也可以是函数范围,而不是返回值。例如,

typedef struct { int c, d, n; } ST;

function ST myfunc1(int c, d);
  static int x = 1;
  myfunc1.c = c;          // myfunc1 refers to the return structure
  myfunc1.d = d;          // myfunc1 refers to the return structure
  myfunc1.n = c + d +     // myfunc1 refers to the return structure
              myfunc1.x;  // myfunc1 refers to function scope
endfunction

使用包含函数名称的分层名称的另一个有趣示例。

typedef struct { int c, d; } ST ;

module top;
  function ST myfunc1(int c,d);
    top.myfunc1.c = c;
    myfunc1.c = 1;
    myfunc1.d = d;
  endfunction

  ST x;
  initial begin
    x = myfunc1(3,2);
    #1 $display("%d %d %d", x.c, x.d, top.myfunc1.c);
  end
endmodule

x = myfunc1(3,2)的函数调用构造myfunc1的调用框架并传递值以进行评估。 myfunc1top.myfunc1的范围不同。以myfunc1开头的层次结构名称表示函数的当前调用帧,而top.myfunc1表示在模块top内声明的函数范围。因此消息将为1 2 3

答案 1 :(得分:4)

看起来您正在引用一个非常旧版本的LRM。获取最新的正式版IEEE Std 1800-2012。您将要查看§13.4.1返回值和无效函数。引用段落和引用代码之间缺少一行:

  

函数可以声明为void类型,它没有返回值   值。函数调用可以用作表达式,除非类型为void,   这些是陈述:

示例代码未引用您的问题分层名称访问权限,它是void返回类型的示例。

下面的示例代码演示了使用struct / union返回类型的分层名称访问。阅读第7.2节和第7.3节中的结构和联合。

function struct { byte a,b; } struct_func (byte a,b);
  byte c;
  c = a ^ b;
  struct_func.a = a; // <== hierarchical name used inside the function
  struct_func.b = ~b;
endfunction

initial begin
  // function name is used within a hierarchical name ( struct member )
  $display("%h", struct_func(8'h42,8'hFE).b ); // returns 01
  // function name is used within a hierarchical name ( function member )
  $display("%h", struct_func.b ); // returns fe (last value of input b)
  // function name is used within a hierarchical name ( function member )
  $display("%h", struct_func.c ); // returns bc (last value of variable c)
end

大多数情况下,您希望重用结构/联合定义,并且应将其定义为typedef。以下函数与上述初始块的结果相同。

typedef struct { byte a,b; } my_struct;

function my_struct struct_func (byte a,b);
  byte c;
  c = a ^ b;
  struct_func.a = a; // <== hierarchical name used inside the function
  struct_func.b = ~b;
endfunction