如何在systemverilog中切片接口(可合成)

时间:2017-04-22 21:43:31

标签: arrays interface system-verilog synthesis

我有以下综合问题:

// Variable instantiation
read_port_if #() mem_rp [N_INST*2] (); // Memory read port interface (each element in array is a single readport)

// module instantiation
memory #(
    .N_RPORT(N_INST*2)
  ) modMem (.*,
    .rPort(mem_rp)
  );

generate
  for (genvar iInst=0;iInst<N_INST;iInst++) begin
    accelerator #(
        .I_INST(iInst),
        .N_INST(N_INST)
      ) accelerator (.*,
        .mod_rp(mem_rp[(iInst*2)+:2]) // Expects an read port array of size 2
      );
  end
endgenerate

此代码功能齐全,但综合抱怨: &#34;构造&#39;接口阵列切片索引&#39;不受支持&#34;。

如何在不切片界面的情况下将此子阵列传递给模块? 我不想像this blog post那样重写我的界面以允许切片,因为这会花费很多时间。

提前致谢!

1 个答案:

答案 0 :(得分:0)

您是否尝试过创建中间信号而不在端口中切片?一些Verilog模拟器对此有问题(例如,VCS和Questa)。

// module instantiation
memory #(
    .N_RPORT(N_INST*2)
  ) modMem (.*,
    .rPort(mem_rp)
  );

generate
  for (genvar iInst=0;iInst<N_INST;iInst++) begin
    wire mem_rp_sliced = mem_rp[(iInst*2)+:2];
    accelerator #(
        .I_INST(iInst),
        .N_INST(N_INST)
      ) accelerator (.*,
        .mod_rp(mem_rp_sliced) // Expects an read port array of size 2
      );
  end
endgenerate