当你 "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 节“分层名称”以开始使用。
当任务输入名称与成员变量名称相同时会发生什么?假设您有以下 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 节“分层名称”以开始使用。