SystemVerilog之interface

interface一组信号的集合(net,wire,port),里面除了可以声明信号,还可以声明常量(constant)、变量(variable)、参数(parameter)、函数(function)、任务(task)以及过程代码块(initial和always) 和连续赋值语句(assign)。

其中interface中的函数和任务可以用来产生drive communication的进程

过程代码块和连续赋值语句可以编写protocal checker、function coverage、asserction等

interface的完整定义语法可以参考systemverilog(1800-2012).pdf Syntax25-1

interface myinterface;

...

endinterface[:myinterface]

interface 可以像module一样例化:例如

myinterface #(100)   scalar1(), vector[9:0]();


在这个例子里面,有11个类型为myinterface的接口实例被例化了并且每个接口实例的第一个参数都被修改为100,这11个接口实例分别为scalar1和一个包含10个接口实例的数组vector[9:0]。


接口可以单独声明,也可以在module里面声明和实例化,但是module不能在interface里面声明和实例化。

25.3.1 不使用interface的例子

module memMod(input  logic req,
                     logic clk,
                     logic start,
                     logic [1:0] mode,
                     logic [7:0] addr,
              inout  wire[7:0] data,
              output bit gnt,
                     bit rdy);
logic avail;
...
endmodule
module cpuMod(input logic clk,
                    logic  gnt,
                    logic rdy,
              inout wire[7:0] data,
              output logic req,
                     logic start,
                     logic [7:0] addr,
                     logic [1:0] mode);
...
endmodule
module top;
logic req,gnt,start,rdy;
logic clk=0;
logic [1:0] mode;
logic [7:0] addr;
logic [7:0] data;
memMod mem(req,clk,start,mode,addr,data,gnt,rdy);
cpuMod cpu(clk,gnt,rdy,data,req,start,addr,mode);
endmodule

25.3.2 使用interface的例子 

The simplest form of a SystemVerilog interface is a bundled collection of variables or nets. When an
interface is referenced as a port, the variables and nets in it are assumed to have ref and inout access,
respectively. The following interface example shows the basic syntax for defining, instanti
最简单的接口是线网的集合,当接口被用作模块的端口的时候,其中的线网被解读为ref和inout类型。

interface simple_bus;
     logic req,gnt;
     logic [7:0] addr,data;
     logic [1:0] mode;
     logic start,rdy;
endinterface:simple_bus
module memMod(simple_bus a,//access the simple_bus interface
              input logic clk);
    logic avail;
    //when memMode is instantiated in module top,a.req is the req signal in the sb_intf
    //instance of the 'simple_bus' interface
    always @(posedge clk) a.gnt <= a.req & avail;
endmodule
module cpuMod(simple_bus b,input logic clk);
    ...
endmodule
module top;
     logic clk=0;
     simple_bus sb_intf();//instantiate the interface
     memMod mem(sb_intf,clk);//connect the interface to the module instance
     cpuMod cpu(.b(sb_intf),.clk(clk));//either by position or by name
endmodule

下面的例子中显示,如果在memMode和cpuMod的模块头里面,使用相同的接口实例名(sb_intf)例化simple_bus的时候,那么可以在top模块中采用隐式的端口连接例化memMod和cpuMode。如下所示:

module memMod(simple_bus sb_intf,input logic clk);
    ...
endmodule
module cpuMod(simple_bus sb_intf,input logic clk);
    ...
endmodule
module top;
     logic clk=0;
     simple_bus sb_intf();//instantiate the interface
     memMod mem(.*);//implicit port connections
     cpuMod cpu(.*);//implicit port connections
endmodule

 25.3.3 通用接口

模块定义的头部声明可以使用未定义的接口作为占位符,并在模块被例化的时候选择。这里把未定义的接口称为通用接口。

通用接口引用只能使用ANSI 风格声明(参见23.2.2.2),不能使用non-ANSI风格声明(参见23.2.2.1)

在模块定义中指定通用接口引用的示例如下:

//memMod and cpuMod can use any interface
module memMod(interface a,input logic clk);
     ...
endmodule
module cpuMod(interface b,input logic clk);
    ...
endmodule
interface simple_bus;//define the interface
    logic req,gnt;
    logic [7:0] addr,data;
    logic [1:0] mode;
    logic start,rdy;
endinterface:simple_bus
module top;
    logic clk = 0;
    simple_bus sb_intf();//instantiate the interface
    //Reference the sb_intf instance of the simple_bus
    //interface from the generic interfaces of the memMod and cpuMod modules 
    memMod mem(.a(sb_intf),.clk(clk));
    cpuMod cpu(.a(sb_intf),.clk(clk));
endmodule  

通用接口只能按名称显式引用,不能使用隐式引用。如下例所示:

//memMod and cpuMod can use any interface
module memMod(interface a,input logic clk);
     ...
endmodule
module cpuMod(interface b,input logic clk);
    ...
endmodule
interface simple_bus;//define the interface
    logic req,gnt;
    logic [7:0] addr,data;
    logic [1:0] mode;
    logic start,rdy;
endinterface:simple_bus
module top;
    logic clk = 0;
    simple_bus sb_intf();//instantiate the interface
    
    memMod mem(.*,.a(sb_intf));//partial implicit port connections
    cpuMod cpu(.*,.a(sb_intf));//partial implicit port connections
endmodule  

 25.4  接口里面的端口

简单接口的一个局限在于其中的线网只被用于连接具有相同线网的端口。如果要共享外部线网或者变量,那么接口端口声明是必须的。位于端口列表里面的线网和位于接口里面的线网的区别是只有端口列表里面的线网能够通过名称或位置关联的方式与外部进行连接,接口端口声明的方式和模块一样。

interface I1 (input a,output b, inout c);
    wire d;
endinterface

这里,线网a,b和c可以单独地连接到接口上,并与其它的接口共享。

下面的例子显示如何指定一个有 input端口的接口,以及在两个接口实例之间共享同一根线网。 

interface simple_bus(input logic clk);//define the interface with input port
     logic req,gnt;
     logic [7:0] addr,data;
     logic [1:0] mode;
     logic start,rdy;
endinterface:simple_bus
module memMod (simple_bus a);//uses just the interface
    logic avail;
    always @(posedge a.clk)//the clk signal from the interface
        a.gnt <= a.req & avail;//a.req is in the 'simple_bus' interface
endmodule
module cpuMod(simple_bus b);
     ...
endmodule
module top;
    logic clk = 0;
    simple_bus sb_intf1(clk);//instantiate the interface
    simple_bus sb_intf2(clk);//instantiate the interface

    memMod mem1(.a(sb_intf1));//reference simple_bus 1 to memory 1
    cpuMod cpu1(.b(sb_intf1));

    memMod mem2(.a(sb_intf2));//reference simple_bus 2 to memory 2
    cpuMod cpu2(.b(sb_intf2));
endmodule

25.5 Modports

  • 2
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: SystemVerilog interface 是 SystemVerilog 语言中的一种特殊类型。它提供了一种在不同模块之间进行接口定义和继承的方式。它可以在不同层次和不同范围内定义接口,并可以在不同的模块之间复用。通过使用 interface,可以将复杂模块的接口和实现分离,提高代码可重用性和可读性。 ### 回答2: SystemVerilog的接口(interface)是一种用户自定义数据类型,可以看作是由多个时序和结构性信号组成的单个实体。它是SystemVerilog用于描述复杂通信协议的一种方式,通过将协议的各个部分封装到接口中实现。接口在实现电路系统级别设计中的复杂底层通信协议时,是非常有用的。它可以简化系统的设计,并提高代码的可读性和可重用性。接口可以用来描述各种类型的连接,包括模块之间的连接,子系统和电路板之间的连接,以及芯片级别的接口。 接口可以包含三种类型的成员:信号、任务和函数。信号是接口的主要成员,用于描述信号的宽度,方向和类型。任务和函数与信号类似,但它们是用于描述属于接口的操作和行为的成员。接口还可以包含其他接口和型号的实例,这使得接口更加灵活。 接口还可以用于建模并描述通信协议的时序特性,包括时序控制、同步和异步数据传输、手握握手协议等等。 在实际应用中,接口常用于组合两个或多个模块,从而实现对应的通信功能,减少代码的重复,并且使代码的结构更加模块化和易于理解。它是一种有效的方式来实现并行设计,将设计的复杂性转化为更小的组件。 ### 回答3: SystemVerilog是一种针对硬件描述语言(HDL)的扩展,它提供了许多更高级别的模拟和综合特性。它还引入了一种称为接口的语言结构来改进模块之间和系统之间的通信。 SystemVerilog中的接口是一种类似于模块的结构,它允许多个模块在接口上相互通信。接口可以在其他模块中实例化,从而允许它们在各种系统中共享和再利用。接口可以具有多个信号线或子接口,并且可以在接口内部有层次结构。 接口还可以具有时序关系,称为协议,它定义了信号如何传输,什么时间传输以及如何响应接收方。例如,一个接口可以定义一个传输协议,包括传输类型,数据位宽,同步或异步等,并用于数据传输。这使得接口可以有效地描述高层次协议,这些协议在系统级别上非常重要。 SystemVerilog中的接口通过向导向式声明和实例化在模块中使用。通过这种方式,SystemVerilog接口使设计人员能够更快地构建和调试信号传输和系统级通信,从而帮助提高设计的可重用性和维护性,以及降低总体系统开发成本。 总而言之,SystemVerilog接口是一种强大的语言工具,可用于描述和实现各种互联系统,从芯片级别接口到板级和系统级接口。通过定义协议和规定标准接口,系统设计人员可以更好地管理复杂的通信和控制,从而提高设计的效率和可靠性。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值