【问题标题】:How to slice interface in systemverilog (synthesizable)如何在 systemverilog 中对接口进行切片(可合成)
【发布时间】:2017-04-22 21:43:31
【问题描述】:

我有以下合成问题:

// 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

此代码功能齐全,但综合抱怨: “不支持构造‘接口数组切片索引’”。

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

提前致谢!

【问题讨论】:

  • 我已经为该问题创建了一个解决方法,但不是该问题的真正答案。解决方法:将接口数组传递给每个加速器块,并在加速器中选择正确的接口。
  • 然而,这项工作给了我大量的 analyze_elaborate 警告类型:“xxxxx 端口 'xxxx' 没有按照其规定的方向使用”,因为很多这些端口根本没有被驱动/在那个块中使用。除了使日志文件膨胀之外,这不是问题。

标签: arrays interface system-verilog synthesis


【解决方案1】:

您是否尝试过创建中间信号而不是切入端口?一些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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-01-13
    • 2017-08-29
    • 1970-01-01
    • 2017-01-13
    • 2021-08-15
    • 1970-01-01
    • 2010-12-11
    • 1970-01-01
    相关资源
    最近更新 更多