我正在实现一个使用接口连接两个实现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并没有找到任何关于我做错的线索。
有人可以帮忙吗?
由于 杆
答案 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的库。)