System verilog 垂直层次结构中的SystemVerilog接口
我正在实现一个系统,它使用一个接口连接两个实现AXI4 lite功能的块 问题是主块和从块位于其他块内 上面的代码显示了我正在尝试做的一个示例: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
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