verilog set bus等于struct bits数组

时间:2016-03-17 23:51:51

标签: verilog system-verilog

我正在尝试将一个总线等于一个结构的总线,用于结构数组(s.t.数组大小==总线大小)。我的结构看起来像

  BFRAME_OUTPUT             bframe_outs[`BSTACK_SIZE-1:0];
  logic [`BSTACK_SIZE-1:0]  valid;

我已经宣布了结构和总线数组

assign valid[`BSTACK_SIZE-1:0] = bframe_outs[`BSTACK_SIZE-1:0].valid;
//
// or
//
for(int i = 0; i < `BSTACK_SIZE; ++i) begin
    assign[i] = bframe_outs[i].valid;
end

我想做一些像这样的事情来简单地使有效总线等于结构数组的有效位。

Error-[XMRE] Cross-module reference resolution error
/modules/branch_stack.sv, 87
  Error found while trying to resolve cross-module reference.
  token 'bframe_outs'.  Originating module 'branch_stack'.
  Source info: assign valid[(16 - 1):0] = bframe_outs[(16 - 1):0].valid;

但是在尝试使用vcs进行模拟时出现错误:

{{1}}

1 个答案:

答案 0 :(得分:2)

更重要的是,还有一个您没有显示的错误:

  

错误 - [PSNA]部件选择不允许testbench.sv,14部件选择   不允许在类数组上。来源信息:分配有效[(5 -   1):0] = bframe_outs [(5 - 1):0] .valid; 将部分选择转换为   分别指每个元素

如错误所示,您需要将分配转换为部件选择。在这里,您可以使用以下两种方法之一。将logic用作reg并在always块中使用,或将logic用作wire并执行其他操作。

将其用作reg时,需要在某些程序块中提取值。因此,只需删除assign语句并使用alway_comb即可。由于您在此处使用了logic,因此无需更改其数据类型。

always_comb 
    begin
      for(int i = 0; i < `BSTACK_SIZE; ++i) 
        valid[i] = bframe_outs[i].valid;
    end

或者,有一个generate块可以多次执行某些操作。请注意,通过使用generate阻止,您可以提供连续分配并将logic用作wire。在这里,您需要单独向bit提供每个wire信号。在这里,使用generate如下:

  genvar i;
  generate
    for(i = 0; i < `BSTACK_SIZE; ++i) begin
      assign valid[i] = bframe_outs[i].valid;
    end
  endgenerate

有关SystemVerilog IEEE 1800-2012的结构和此链接,请参阅generate blocks第7.2节。我在EDAPlayground链接创建了一个工作示例。