合成SV接口解除引用端口

时间:2016-12-15 15:25:17

标签: interface system verilog synthesis

我想使用定义如下的接口来合成以下内容

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进行模拟可以正常工作 非常感谢

1 个答案:

答案 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

到目前为止,我在设计编译器中使用它没有任何问题。