Introducción a la interfaz en SystemVerilog

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

Supongo que te gusta

Origin blog.csdn.net/qq_39507748/article/details/112002487
Recomendado
Clasificación