SystemVerilog学习1——interface

 利用verilog,有两种连接方式:按顺序连接和按名称连接。

 

verilog的连接非常繁琐!!!如果将一个信号名儿修改了,那就需要修改其他与他有关的信号名儿,麻烦且容易出错!!!

system采用接口解决这种繁琐。

接口可以用作设计,也可以用作验证,接口可以使得信号连接变得简洁并且不容易出错。 接口减少了模块之间错误连接的可能性;如果要添加新的信号,只需要在接口中声明,不需要在模块中声明。

interface集合了多个verilog类型的信号,是一个独立的端口类型,可以是一个独立的文件。

Interface和module相同点:

1.可以定义端口与双向信号

2.可以使用initial和always语句

3.可以定义function与task

Interface和module不同点:

模块可以例化接口,接口不可以例化模块

 DUT和TB之间的驱动关系可以使用interface这个插排完成。

1.interface声明

 利用interface简化模块连接,interface声明如下:

interface arb_if(
    input bit clk
);

logic [1:0] grant,request;
logic       reset_n;

endinterface 

顶层文件例化interface如下:

module top;
    bit clk;
    always #5 clk=~clk;

    arb_if arbif(clk);
    
    arbiter u_arbiter(arbif);
    test    u_test(arbif);

endmodule

可以看出,信号端口的连接就不针对内部具体的端口了,如果之后修改信号名或者信号位宽,直接去interface中修改即可。 

2.interface中信号的使用

//接口声明
interface arb_if(
    input bit clk
);

logic [1:0] request,grant;
logic       reset_n;

endinterface




module tb(
    arb_if arbif  //arbif相当于组长
);

initial begin
    @(posedge arbif.clk) //arbif.clk相当于组员
        arbif.request <= 2'b01;
        ...

    if(arbif.grant != 2'b01)
    ...
    
    $finish
end

3.接口与端口的连接

//接口声明
interface arb_if(
    input bit clk
);

logic [1:0] request,grant;
logic       reset_n;

endinterface


module top;
    
bit clk;
always #5 clk = ~clk;
arb_if arbif(clk);

//两种方式
arbiter u_arbiter(
    .grant(arbif.grant),
    .request(arbif.request),
    .reset_n(arbif.reset_n),
    .clk(arbif.clk)
);//比较麻烦


test u_test(arbif);//推荐

endmodule



4.接口信号分组:modport

为接口内部信号提供不同的视图,只是声明连接模块的信号的端口方向

也就是将大组分为多个小组

//接口声明
interface arb_if(
    input bit clk
);

logic [1:0] request,grant;
logic       reset_n;

//在interface中声明modport
modport DUV(
    input request,clk,reset_n,
    output grant
);


modport TEST(
    input grant,clk,
    output request,reset_n
);

endinterface

//设计模块中使用interface中的modport
module arbiter(
    arbif.DUV arbif_duv
);
...
endmodule

//测试案例中使用interface的modport
module tb(
    arbif.TEST arbif_test
);
...
endmodule

interface总结:

1. 功能:

一组信号/线网;

独立的文件;

在interface中定义通信协议;

在interface中定义协议检查和验证函数:task function assertion

2.modport可以定义interface的不同视图(DUV,test program)

3.interface不能有rtl

4.interface可综合

5.interface中可以包含多个modport

实例说明:接口使用四步骤

1.定义接口:

interface arb_if(
    input bit clk
);

logic [1:0] request,grant;
logic reset_n;

endinterface

2.DUT调用inetrface

module arb(arb_if arbif);//接口传入模块中
...     


always@(posedge arbif.clk or negedge arbif.reset_n)
    if(arbif.reset_n)
        arbif.grant <= 2'b00;
    else 
        arbif.grant <= next_grant;

endmodule

3.TEST调用interface

module test(arb_if arbif);

initial begin
    initial begin
    @(posedge arbif.clk) //arbif.clk相当于组员
        arbif.request <= 2'b01;
        ...
    @(posedge arbif.clk)
        if(arbif.grant != 2'b01)
        ...
    
    $finish

end

4.top层例化接口 DUT TEST

module top;

    bit clk;

    always #5 clk=~clk;


    arb_if arbif(clk);

    arb_al(arbif);

    test_al(arbif);

endmodule

  • 6
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值