1

我想将向量转换为结构并在同一语句中提取成员。这可能吗?否则,我将不得不分配一个临时变量,这很难看。

例如:

typedef struct packed { logic a; logic b } struct_t;
struct_t my_struct;

logic [1:0] foo;
assign bar = struct_t'(foo).a;

^^^^^ 这显然是不允许的!为什么 ?

4

2 回答 2

3

我同意能够这样做会很好,但在语言中是不允许的。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
于 2012-06-01T03:00:53.953 回答
2

根据规范,这看起来不像是有效的语法。我很确定只允许对标识符进行成员访问,而不是任何任意表达式。

于 2012-05-31T22:45:33.740 回答