Systemverilog (Libro Verde) Capítulo 3 - Bloques de proceso y métodos

Se necesita escribir mucho código para hacer la máquina de verificación de diseño, la mayoría de los cuales se utilizan en tareas y funciones. Systemverilog agrega muchas mejoras en este sentido, acercándolo al lenguaje C, lo que facilita la escritura de código, especialmente en el manejo de la transferencia de parámetros.

  • En Systemverilog, los bloques de proceso y sus métodos se dividen por dominio y se dividen en partes de hardware y software . Los contenidos específicos son los siguientes:

 Las preguntas de la prueba para el tipo de parámetro de función son las siguientes:

typedef    struct{
    bit    [1:0] cmd;
    bit    [7:0] addr;
    bit    [31:0] data;
} trans;

function    automatic void op_copy(trans t,trans s);
    
    t = s;

endfunction


initial begin
    trans s;
    trans t;
    s.cmd = 'h1;
    s.addr = 'h10;
    s.data = 'h100;
    op_copy(t,s);
    t.cmd = 'h2;
end

Pregunta: ¿Cuáles son los valores finales de las tres variables miembro {cmd, addr, data} en t?

{'h2,' h0, 'h0}

Debido a los parámetros de la función, la dirección predeterminada es la entrada, aquí la variable trans t se considera como una variable de entrada. Por lo tanto, la función de asignación se realiza llamando a la función op_copy, ya que la dirección del valor saliente no está determinada, el resultado es 0.

 

  • En systemverilog, dividimos el ciclo de vida en automático y estático.
  • Los problemas de diseño del alcance para variables estáticas y variables dinámicas son los siguientes:

  • function automatic int auto_cnt(input a);
        int cnt = 0;
        cnt +=a;
        return cnt;
    endfunction
    
    
    function static int auto_cnt(input a);
        static int cnt = 0;
        cnt +=a;
        return cnt;
    endfunction
    
    function int auto_cnt(input a);
        static int cnt = 0;
        cnt +=a;
        return cnt;
    endfunction
    
    initial begin
        $display("@1 auto_cnt = %0d",auto_cnt(1));
        $display("@2 auto_cnt = %0d",auto_cnt(1));
        $display("@1 auto_cnt = %0d",static_cnt(1));
        $display("@2 auto_cnt = %0d",static_cnt(1));
        $display("@1 def_cnt = %0d",def_cnt (1));
        $display("@2 def_cnt = %0d",def_cnt (1));
    end
    
    
    

    Solución: Para la primera función, si se define como automática, su contenido son todas variables dinámicas. Por lo tanto, después de cada llamada, el valor original se restaurará a 0;

    • Para la segunda función, si se define como estática, todos sus contenidos son variables estáticas. Por lo tanto, después de cada llamada, se incrementará;

    • Para la tercera función, todas las funciones en el módulo son funciones estáticas por defecto , y las variables en las funciones son variables estáticas . Sin embargo, en la mayoría de los casos, esperamos que las funciones en el módulo sean dinámicas, lo que está más en línea con los requisitos del software.

Publicado 14 artículos originales · ganó 10 · vistas 20,000 +

Supongo que te gusta

Origin blog.csdn.net/Jay_who/article/details/105339446
Recomendado
Clasificación