Uno, la definición y creación de instancias de interfaz.
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
En segundo lugar, las características de la interfaz.
La interfaz es un tipo de puerto potente:
1. Puede simplificar el modelado y la verificación de diseños complejos.
2. Puede definirse por separado fuera del módulo.
3. Admite múltiples señales para formar un puerto, solo es necesario declarar una vez.
4. La interfaz puede incluir puerto, tarea, función, bloque de proceso, bloque de programa y también puede parametrizarse.
3. La diferencia y la conexión entre la interfaz y el módulo:
1) La interfaz no puede contener niveles de diseño; puede tener señales de entrada y salida.
2) La interfaz se puede utilizar como puerto del módulo (cuando se utiliza como puerto), que representa el canal de comunicación entre los módulos.
3) La interfaz puede contener modport (abreviatura del puerto del módulo), y el módulo conectado a la interfaz puede acceder a la interfaz de diferentes maneras. Es decir, se puede pasar cualquier interfaz al módulo, o solo se puede pasar al módulo el puerto específico definido por modport.
Cuatro, por ejemplo
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
Banco de pruebas
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