转换为System Verilog结构并引用成员

时间:2012-05-31 21:00:10

标签: system-verilog

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

例如:

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

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

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

2 个答案:

答案 0 :(得分:3)

我同意能够做到这一点很好,但是语言中不允许这样做。 SystemVerilog LRM(IEEE 1800-2009)在第23.7节中对此进行了解释。

  

分层名称和成员选择结构,union,class或covergroup对象共享相同   由句点分隔的名称组件序列的句法形式。这些名称称为虚线名称   在确定名称是否为分层名称或成员选择之前。区别   分层名称的一个方面是名称的第一个组件必须与第一个组件名称匹配   成员select的name组件必须与变量名称匹配。使用的一般方法是尝试   立即解析名字组件并使用该解析尝试的结果来确定   如何对待整体名称。

由于您有struct_t'(foo)而不是变量名称,因此它不会将.a视为成员选择。

类似地,您不能像在C ++中那样访问从函数调用返回的类或结构的成员。

function struct_t getStruct();
  // do something
endfunction

logic a;
a = getStruct().a;   // <= Not allowed

答案 1 :(得分:2)

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