当你 "alias" 成员变量与成员函数 inputs/outputs 时会发生什么?

What happens when you "alias" member variables with member function inputs/outputs?

当任务输入名称与成员变量名称相同时会发生什么?假设您有以下 class:

virtual class foo;

  // This class is not intended to be instantiated nor extended.
  local function new; endfunction

  static bit [7:0] aByte;
  static bit [7:0] bByte;

  static task bar1();
    aByte = 8'h0A;
  endtask : bar1

  static task bar2(input logic [7:0] aByte);
    bByte = aByte + 2;
  endtask : bar2

endclass : foo

program automatic main;
  initial
    begin
    foo::bar1();
    foo::bar2(8'h55);
    $finish;
    end
endprogram : main

我好像在IEEE标准中找不到这种情况。我不想对真正发生的事情做出任何假设。在模拟中对此进行测试会产生 bByte == 8'h57;这是我所期望的。这里发生了什么?这是重载的例子吗?令我感到惊讶的是,它甚至可以编译,而且可以运行。

请参阅 IEEE 标准 1800-2017,第 8.11 节

aByte 的不合格引用应通过查看最内部的范围来解决,在本例中为任务参数声明。

如果您有一个 non-static 任务,要访问实例 class 属性 (aByte),它是用 this 关键字限定的:

this.aByte

此行为并非 类 所特有。您看到的是一个局部块命名空间声明,它隐藏了一个不太局部的块声明的可见性。请参阅 IEEE 1800-2017 SystemVerilog LRM

中的第 3.13 节名称空间

任务 bar2 使用参数 aByte 创建了一个局部作用域,该作用域隐藏了在 foo 中声明的静态变量。您将不得不使用 foo::aBtye 来查看静态变量。搜索规则的完成取决于您所处的范围类型。但请参阅第 23.6 节“分层名称”以开始使用。