索引实例和接口数组

时间:2019-06-18 21:45:03

标签: system-verilog uvm system-verilog-assertions

我有一组接口。我知道实例和接口的数组不像可以用变量索引的普通数组,这里我们必须用常量(或使用generate block)索引,这就是问题所在。

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

到这里一切都很好。

然后,对于主站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

1 个答案:

答案 0 :(得分:2)

我的猜测是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