实例和接口的索引数组

问题描述 投票:0回答:1

我有一系列接口。我知道实例和接口数组不像普通数组可以用变量索引;这里我们必须使用常量(或使用

generate
块)进行索引,这正是问题所在。

我正在使用

generate
块来存储主机根据提供的地址向其发送数据包的目标从机 ID。这里
m_ahb
是主接口数组。我还存储了目标从属 ID,即,对于 master 0,目标 id 在 dest_slave[0] 中,对于 master 1,它在 dest_slave[1] 中,依此类推。

到这里为止,一切都很好。

然后,对于 master 0,我使用 dest_slave[0] 值来索引从接口数组 (

s_ahb
),并挑选相应的目标从接口来探测信号并在断言中使用它。但是,现在我收到错误:

实例数组中的非常量数组索引

int dest_slave[NUM_MASTERS];
generate
  for (genvar i = 0; i < NUM_MASTERS; i++) begin
    always_ff @(posedge clk, negedge resetn) begin
      if (m_ahb[i].haddr >= 'h0000_0000 && m_ahb[i].haddr <= 'h0000_ffff) dest_slave[i] = 0;
      if (m_ahb[i].haddr >= 'h1000_0000 && m_ahb[i].haddr <= 'h1000_ffff) dest_slave[i] = 1;
      if (m_ahb[i].haddr >= 'h4000_0000 && m_ahb[i].haddr <= 'h4000_ffff) dest_slave[i] = 2;
    end
  end
endgenerate
generate
  for (genvar i = 0; i < NUM_MASTERS; i++) begin
    assert property my_proprty(m_ahb[i].hburst,s_ahb[dest_slave[i]]].hburst); //this line creates error it is not liking s_ahb[dest_slave[i]]
  end
endgenerate
system-verilog system-verilog-assertions
1个回答
3
投票

我的猜测是

s_ahb
是一个模块实例或非虚拟接口实例。无法动态访问这些类型的数组路径。您可以创建逻辑来分离探测和映射。

int dest_slave[NUM_MASTERS];
int slave_hburst_val[NUM_MASTERS]; // <- change data type as needed
generate
  for (genvar i = 0; i < NUM_MASTERS; i++) begin
    always_ff @(posedge clk, negedge resetn) begin
      if (m_ahb[i].haddr >= 'h0000_0000 && m_ahb[i].haddr <= 'h0000_ffff) dest_slave[i] = 0;
      if (m_ahb[i].haddr >= 'h1000_0000 && m_ahb[i].haddr <= 'h1000_ffff) dest_slave[i] = 1;
      if (m_ahb[i].haddr >= 'h4000_0000 && m_ahb[i].haddr <= 'h4000_ffff) dest_slave[i] = 2;
    end

    assign slave_hburst_val[i] = s_ahb[i].hburst; // intermediate assignment

    assert property my_proprty( m_ahb[i].hburst, slave_hburst_val[ dest_slave[i] ] );
  end
endgenerate

仅供参考:您的原始代码有一个额外的

]
s_ahb[dest_slave[i]]].hburst

© www.soinside.com 2019 - 2024. All rights reserved.