我想使用定义如下的接口来合成以下内容
interface smb_if #(
parameter shortint ADDR_SZ = 8,
parameter shortint DATA_SZ = 8,
parameter shortint SLAVE_NUM = 8
);
logic [DATA_SZ-1:0] wrdata;
logic [DATA_SZ-1:0] rddata [SLAVE_NUM-1:0];
logic [ADDR_SZ-1:0] rdaddr;
logic [ADDR_SZ-1:0] wraddr;
logic wr; // =1 means 'write, =0 means 'read
logic wrcmd; //
logic rd; // =1 means 'write, =0 means 'read
logic rdcmd; // =1 means 'write, =0 means 'read
logic [ADDR_SZ-1:0] rdaddr_old;
logic clrcmd;
logic [SLAVE_NUM-1:0] sel ; // one-hot; =1 means 'selected'
modport master (
input rddata, output wrdata, output rdaddr, output rdaddr_old, output clrcmd, output wraddr,
output wr, output wrcmd, output rd, output rdcmd, output sel
);
modport slave (
output rddata, input wrdata, input rdaddr, input rdaddr_old, input clrcmd, input wraddr,
input wr, input wrcmd, input rd, input rdcmd, input sel
);
endinterface:smb_if
接口的一个实例在我的顶层模块中声明如下
smb_if #(.ADDR_SZ(8), .SLAVE_NUM(8)) i_smbif();
然后我将接口端口连接到我的模块
.smb_page_sel (i_smbif.master.sel ), // Page selection
.smb_addw (i_smbif.master.wraddr ), // data address for write
.smb_dataw (i_smbif.master.wrdata ), // data to be written on a write cycle
.smb_wr (i_smbif.master.wr ), // from SMB top: what diff with wr?
.smb_wrcmd (i_smbif.master.wrcmd ), // register file write command
.smb_addptr (i_smbif.master.rdaddr ), // data address for read
.smb_rd (i_smbif.master.rd),
// etc.
我在详细说明中遇到了设计编译器的错误(分析确实运行良好)
有人可以建议解决方法吗?我不想修改DUT的端口映射,这是遗留的verilog 2001代码
使用NCVLOG进行模拟可以正常工作 非常感谢
答案 0 :(得分:0)
不应在连接中指定modport信息。 您使用的modport应使用接口在模块的端口声明中声明。
如果在模块中声明要使用它的接口,则不必指定每个端口。
我认为您必须修改代码才能使其符合DC。但它是最好的,因为使用接口可以使您的代码更短更清晰。
FYI,界面利用的一个快速示例:
接口声明
interface channel(
logic request;
logic acknowledge;
modport src ( output request, input acknowledge);
modport dst ( input request, output acknowledge);
endinterface
源模块decl
module source(
Channel.src myChannel_out
);
//Do stuff
endmodule
Dest模块decl
module destination(
Channel.dst myChannel_in
);
//Do stuff
endmodule
热门模块
module top ();
Channel myChannel ();
source u_source(
.myChannel_out(myChannel)
);
destination u_destination(
.myChannel_in(myChannel)
);
endmodule
到目前为止,我在设计编译器中使用它没有任何问题。