System verilog 垂直层次结构中的SystemVerilog接口

System verilog 垂直层次结构中的SystemVerilog接口,system-verilog,System Verilog,我正在实现一个系统,它使用一个接口连接两个实现AXI4 lite功能的块 问题是主块和从块位于其他块内 上面的代码显示了我正在尝试做的一个示例: interface bus logic [ADDR_WIDTH-1:0] wr_addr; // Write address logic [DATA_WIDTH-1:0] wr_data; // Write data logic [ADDR_WIDTH-1:0] rd_addr; // Read address logic

我正在实现一个系统,它使用一个接口连接两个实现AXI4 lite功能的块

问题是主块和从块位于其他块内

上面的代码显示了我正在尝试做的一个示例:

interface bus 
  logic [ADDR_WIDTH-1:0] wr_addr;   // Write address
  logic [DATA_WIDTH-1:0] wr_data;   // Write data
  logic [ADDR_WIDTH-1:0] rd_addr;   // Read address
  logic [DATA_WIDTH-1:0] rd_data;   // Read data

  modport master (
    output wr_addr,
    output wr_data,
    input  rd_addr,
    input  rd_data
  );

  modport slave (
    input   wr_addr,
    input   wr_data,
    output  rd_addr,
    output  rd_data
  );

endinterface


// innermost master block
module m0(bus.master bus_inst_m0);

  // write/ read data from/to master modport
  bus_inst_m0.wr_addr <= ...
  if(bus_inst_m0.rd_addr == ...

endmodule


// instance of m0 block connected
// to interface
module m1(bus.master bus_inst_m1);

  m0 m0_inst(.bus_inst_m0 (bus_inst_m1))

endmodule



// innermost slave block
module s0(bus.slave bus_inst_s0);

  // write/ read data from/to slave modport
  bus_inst_s0.rd_addr <= ...
  if(bus_inst_s0.wd_addr == ...

endmodule


// instance of ms block connected
// to interface
module s1(bus.slave bus_inst_s1);

  s0 s0_inst(.bus_inst_s0 (bus_inst_s1))

endmodule


// top module
module top();

  bus local_bus;

  m1 m1_inst (.bus_inst_m1 (local_bus));
  s1 s1_inst (.bus_inst_s1 (local_bus));

endmodule
接口总线
逻辑[ADDR_WIDTH-1:0]wr_ADDR;//写入地址
逻辑[数据宽度-1:0]wr\U数据;//写入数据
逻辑[ADDR_WIDTH-1:0]rd_ADDR;//读取地址
逻辑[数据宽度-1:0]rd\U数据;//读取数据
莫德波特船长(
输出wr_addr,
输出wr_数据,
输入rd_addr,
输入rd_数据
);
移动端口从机(
输入wr_addr,
输入wr_数据,
输出rd_地址,
输出rd_数据
);
端接口
//最里面的主块
模块m0(总线主总线仪表m0);
//从主modport写入/读取数据

bus_inst_m0.wr_addr首先,您可以使用一系列选项。 您可以使用泛型接口作为模块参数,以避免类型错误。在这种情况下,只要连接的接口具有模块使用的所有信号,您就可以了。(如果工具找到合适的接口…)例如:

其次,您可以,但不需要在模块声明中指定modport(类型)。您可以使用接口的名称,并在模块实例化时连接特定的modport。例如:

module slave_actor(m_bus m_bus_if);
endmodule
...
module top();
  m_bus_if m_bus;
  m_1 slave_actor(.m_bus_if(m_bus.slave));
endmodule: top
可以这样认为,modport是给定接口的兼容类型

因此,您的代码的更正/缩短版本:

interface m_bus;
  logic [1:0] a;
  modport master(input a);
  modport slave (output a);
endinterface

module m1(m_bus.master bus_inst_m1);
  m2 m2_inst(.bus_inst_m2(bus_inst_m1));
endmodule

module m2 (m_bus.master bus_inst_m2);
endmodule

module s1(m_bus.slave bus_inst_s1);
endmodule

module top();
  m_bus local_bus();

  m1 m1_inst (.bus_inst_m1 (local_bus.master));
  s1 s1_inst (.bus_inst_s1 (local_bus.slave));
endmodule
这在QuestaSim 10.5c中非常有效。
如果您的代码已编译但无法工作,请确保最内层的块也能看到接口。(包括IF编译到的库。)

有任何警告吗?还可以尝试使用
local_bus.master
local_bus.slave
而不是
local_bus
gvekony,谢谢您的回答。使用您的提示,代码正在运行。这是一个很好的例子。Vivado中的合成不允许传递modports,但移除它可以很好地合成。谢谢
interface m_bus;
  logic [1:0] a;
  modport master(input a);
  modport slave (output a);
endinterface

module m1(m_bus.master bus_inst_m1);
  m2 m2_inst(.bus_inst_m2(bus_inst_m1));
endmodule

module m2 (m_bus.master bus_inst_m2);
endmodule

module s1(m_bus.slave bus_inst_s1);
endmodule

module top();
  m_bus local_bus();

  m1 m1_inst (.bus_inst_m1 (local_bus.master));
  s1 s1_inst (.bus_inst_s1 (local_bus.slave));
endmodule