【发布时间】: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