SystemVerilog中interface(接口)介绍

一、interface的定义与实例化

interface main_bus;
  wire [15:0]  data;
  wire [15:0]  address;
  logic[7:0]   bus_request;
endinterface

module top()
   main_bus bus(); //接口实例化
   slave slave1(
    .bus(bus));
endmodule

二、interface的特点

interface是功能强大的端口类型:

1、可以简化复杂设计的建模和验证。
2、可在module外单独定义。
3、支持多个信号组成一个端口,只需声明1次。
4、接口中可以包括端口、任务task、函数function、过程块、程序块,也可参数化。

三、接口interface与模块module的区别与联系:

1)接口不可以包含设计层次;可以有输入输出信号。
2)接口可以用作模块的端口(当端口用),表示模块间的通信通道。
3)接口可以包含modport(module port缩写),连接到接口上的模块可以不同方式访问接口。也即既可以将interface传入模块,也可以只将modport定义的特定port传入模块。

四、举例

RTL


interface ticket_if(input logic clk,rst_n,[5:0]m_in,output logic ticket_out,[5:0]m_out);
    
    logic [5:0]sum;

    task change(input logic [5:0]in_data,
                          output logic [5:0]out_data );
                          
             out_data = in_data - 6;
    endtask //automatic

    modport ticket_ports(input clk,rst_n,m_in,
            output ticket_out,m_out,sum,
            import task change(input logic [5:0]in_data,
                               output logic [5:0]out_data )
            );
endinterface //interfacename


module ticket(ticket_if.ticket_ports ports);

enum logic [1:0]{s0,s1,s2} state_c,state_n;

always_ff @(posedge ports.clk or negedge ports.rst_n) 
     
    if(!ports.rst_n)
        state_c <= s0;
    else
        state_c <= state_n;
        
always_comb       
    case(state_c)
        s0:begin
            ports.sum = ports.m_in;
            ports.ticket_out = 0;
            if(ports.sum>=6)
                state_n <= s2;
            else
                state_n <= s1;
        end
        s1:begin
            ports.sum = ports.sum + ports.m_in;
            if(ports.sum>=6)
                state_n <= s2;
            else
                state_n <= state_c;
        end
        s2:begin
            ports.change(ports.sum,ports.m_out);
            //ports.m_out = ports.sum - 6;
            ports.ticket_out = 1;
            state_n <= s0;
        end
        default:state_n <= s0;
    endcase

endmodule

testbench

module tb_ticket;

	timeunit 1ns;
	timeprecision 100ps;
	
	
	logic clk,rst_n;
	logic [5:0]m_in;
	logic ticket_out;
	logic [5:0]m_out;
	
	initial
	  begin
	      clk = 0;
	      rst_n = '1;
	      #5 rst_n = '0;
	      #5 rst_n = '1;
	  end
	  
	initial
	  begin
	      #10 m_in=2;
	      #10 m_in=3;
	      #10 m_in=4;
	      #10 m_in=5;
	      #10 m_in=6;
	      #10 m_in=7;
	      #10 m_in=8;
	  end
	
	always #5 clk = ~clk;
	
	//ticket_if ports(.*);
	ticket_if ports(clk,rst_n,m_in,ticket_out,m_out);
	ticket u_ticket(ports.ticket_ports);
endmodule
posted @ 2020-12-31 09:38  耐心的小黑  阅读(743)  评论(0编辑  收藏  举报