SystemVerilog垂直层次结构中的接口

时间:2017-01-09 20:24:07

标签: 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 [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

在Cadence Incisive模拟器中,代码编译,但它不起作用。查看原理图,我看到顶部接口已连接,但内部接口刚刚打开。

我做了一个小测试直接连接主块和从块,它工作正常。

我也试过了interface / modport的其他组合,就像在最里面的块中使用modport一样,但它没有用。

我读了LRM并没有找到任何关于我做错的线索。

有人可以帮忙吗?

由于 杆

1 个答案:

答案 0 :(得分:0)

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

module mod_gen_inf(interface gen_if);
endmodule
...
module top();
  m_bus_if m_bus;
  m_1 slave_actor(.gen_if(m_bus.master));
endmodule: top

其次,您可以,但不需要在模块声明中指定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的库。)