【问题标题】:passing generated modports to instances of the same module将生成的 modports 传递给同一模块的实例
【发布时间】:2020-05-20 16:00:06
【问题描述】:

我很确定没有办法做我正在尝试的事情,但以防万一有一个有趣的聪明的解决方案,我想我会四处询问。我有一个参数化的 SystemVerilog 接口,我在其中生成 modports

interface some_interface #(parameter NUM_READERS=3);

    logic [`kBitsPerProgramCounter-1:0] read_addr[NUM_READERS];
    logic [`kBitsPerProgramCounter-1:0] write_addr; 

    genvar i;
    generate
        // generates Reader[n].Modport
        for (i = 0; i < NUM_READERS; ++i) begin : Reader
            modport Modport
            (
                output .read_addr(read_addr[i])
            );
        end
    endgenerate

endinterface

如果我有不同的模块类型采用不同的 modport,那么使用它很容易。但是,我想做的是拥有同一个模块的多个实例。我通过参数化类型尝试了这个

module some_block#(parameter type SOMETYPE) (
    input logic CLK200MHZ,
    SOMETYPE aarrgghh);

但是让它在语法上工作一直是一个挑战。给 SOMETYPE 一个默认值不起作用,因为 Vivado 抱怨不允许分层类型,所以马上我认为这不会起作用。实例化时,我尝试使用完整的 modport 名称、带有实例化接口的完整 modport 名称以及其他一些名称,但似乎没有任何效果。

所以我很好奇是否有一种聪明的方法可以让 some_block 的多个实例化,每个实例化一个不同的生成 modport。如果没有,我可以做一些有趣的聪明技巧来使用生成的 modports 吗?最初的想法是我有一个有一个作家和多个读者的东西。我想为每个阅读器生成一个 modport,以便它只能触摸它自己的读取地址。我想我总是可以在一个整数上参数化 some_block,传递 some_block 整个接口,然后依靠 some_block 只触摸与传入的整数对应的读取地址,但这可能容易出错。

【问题讨论】:

  • 非主流模拟器在生成块中支持 modports。你真的有一个可编译的例子吗?
  • 对我来说似乎工作正常。我可以生成modports,模拟器不报错,调试器中的所有成员都可以看到imgur.com/a/H02oBZj

标签: system-verilog fpga vivado


【解决方案1】:

假设“生成”有效,则无需担心模块。无需传递类型参数。模块端口应该是您接口的类型。

module top();
   some_interface ifc;
   for (genvar gi = 0; gi < NUM_REASDERS; gi++) begin: inst
      some_block sb(ifc.Reader[gi].Modport);
   end
endmodule

module some_block (some_interface ifc);
    always_comb myvar = ifc.read_addr;

some_block 总是引用“read_addr”,即 modport var。您可以在“顶部”模块中使用生成块。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-21
    • 1970-01-01
    • 2021-01-18
    • 1970-01-01
    相关资源
    最近更新 更多