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.
-