我想将向量转换为结构并在同一语句中提取成员。这可能吗?否则,我将不得不分配一个临时变量,这很难看。
例如:
typedef struct packed { logic a; logic b } struct_t;
struct_t my_struct;
logic [1:0] foo;
assign bar = struct_t'(foo).a;
^^^^^ 这显然是不允许的!为什么 ?
我想将向量转换为结构并在同一语句中提取成员。这可能吗?否则,我将不得不分配一个临时变量,这很难看。
例如:
typedef struct packed { logic a; logic b } struct_t;
struct_t my_struct;
logic [1:0] foo;
assign bar = struct_t'(foo).a;
^^^^^ 这显然是不允许的!为什么 ?
我同意能够这样做会很好,但在语言中是不允许的。SystemVerilog LRM (IEEE 1800-2009) 在第 23.7 节对此进行了解释。
分层名称和成员选择到结构、联合、类或覆盖组对象共享由句点分隔的名称组件序列的相同语法形式。在确定名称是分层名称还是成员选择之前,此类名称称为点名称。分层名称的区别在于名称的第一个组成部分必须与范围名称匹配,而成员 select 的第一个名称组成部分必须与变量名称匹配。使用的一般方法是尝试立即解析第一个名称组件,并使用该解析尝试的结果来确定如何处理整个名称。
由于您有struct_t'(foo)
并且没有变量名,因此它不会将其.a
视为成员选择。
同样,您不能像在 C++ 中那样访问从函数调用返回的类或结构的成员。
function struct_t getStruct();
// do something
endfunction
logic a;
a = getStruct().a; // <= Not allowed
根据规范,这看起来不像是有效的语法。我很确定只允许对标识符进行成员访问,而不是任何任意表达式。