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