Asignación de bloqueo y asignación sin bloqueo en la Ayuda de Verilog.
Diseño verilog avanzado
Hora: martes 6 de mayo de 2014
Principales ganancias:
1. Asignación de bloqueo;
2. Prueba de código;
3. Circuitos lógicos combinacionales y circuitos lógicos secuenciales.
Asignación de bloqueo y asignación sin bloqueo:
1. Asignación de bloqueo "=" (circuito lógico combinacional), asignación sin bloqueo "lt;=" (circuito lógico secuencial);
p>
2. 8 principios de programación del módulo Verilog:
(1) Al modelar circuitos secuenciales, utilice asignación sin bloqueo.
(2) Al modelar el circuito de bloqueo, utilice una asignación sin bloqueo.
(3) Cuando utilice el bloque siempre para construir un modelo lógico combinacional, utilice la asignación de bloqueo.
(4) Al construir circuitos lógicos secuenciales y combinacionales en el mismo bloque siempre, utilice asignación sin bloqueo.
(5) No utilice tanto la asignación sin bloqueo como la asignación con bloqueo en el mismo bloque siempre.
(6) No asignar un valor a la misma variable en más de un bloque siempre.
(7) Utilice la tarea del sistema $strobe para mostrar valores de variables mediante una asignación sin bloqueo.
(8) No utilice el retraso #0 al asignar valores.
Tener en cuenta estos ocho puntos al escribir puede resolver los 90-100 problemas de carrera riesgosos que ocurren en las simulaciones post-síntesis para la gran mayoría de los usuarios de Verilog.
3. El llamado concepto de bloqueo significa que en el mismo bloque siempre, la declaración de asignación posterior comienza conceptualmente la asignación después de que finaliza la declaración de asignación anterior.
4. El proceso de ejecución de una declaración sin bloqueo es: primero calcular los valores de todas las expresiones de la derecha (RHS) dentro del bloque de declaración y luego completar la operación de asignación al registro izquierdo. variable.
5. La diferencia en el código:
comenzar
B=A
C=B 1;
end
El código anterior primero asigna el valor de A a B, y el valor de C es A 1;
begin
Blt;=A ;
Clt;=B 1;
end
El resultado final del código anterior es: A se asigna a B, pero el valor de C es el valor original de B 1. Porque la expresión de la derecha se evalúa primero.
Circuitos lógicos combinacionales y circuitos lógicos secuenciales:
1. Los circuitos digitales se pueden dividir en dos categorías principales según las diferentes características de las funciones lógicas. Una categoría se denomina circuitos lógicos combinacionales (denominados. conocido como circuitos combinacionales), el otro tipo se llama circuito lógico secuencial (circuito secuencial para abreviar).
2. La función lógica característica de los circuitos lógicos combinacionales es que la salida en cualquier momento sólo depende de la entrada en ese momento y no tiene nada que ver con el estado original del circuito.
3. La función lógica característica de los circuitos lógicos secuenciales es que la salida en cualquier momento no sólo depende de la señal de entrada en ese momento, sino que también depende del estado original del circuito, o dicho de otra manera. , también está relacionado con la entrada anterior.
Código Verilog:
bloqueo de módulo(clk, a, b, c
salida [3: 0] b, c
<; p>entrada [3:0] a;entrada clk;
reg [3:0] b, c
siempre@(posedge clk) comenzar
b = a;
c = b;
$display("Bloqueo: a = d, b= d, c = d.", a, b, c);
end
endmodule
Diagrama esquemático correspondiente:
modulenon_blocking(clk, a, b, c
salida [3: 0] b, c
entrada [3: 0] a
entrada clk; >reg [3:0] b, c;
siempre@(posedge clk) comenzar
b lt; = a
c lt; ;
$display("Sin bloqueo: a =d, b = d, c = d.", a, b, c);
fin
endmodule
Esquema correspondiente:
Código de prueba:
`timescale1ns/1ns
moduleblocking_test;
cable [ 3:0] b1, c1, b2, c2;
reg [3:0] a;
reg clk;
comienzo inicial
clk = 0;
para siempre #50 clk = ~clk;
fin
comienzo inicial
a = 4 ' h3;
$display("_________________________");
#100 a = 4'h7;
$display("_________________________");
p>
#100 a = 4'hf;
$display("_________________________");
#100 a = 4'ha;
$display("_________________________");
#100 a = 4'h2;
$display("_________________________");
# 100$display( "____________________");
$stop;
end
sin_bloqueo u1(clk, a, b2, c2);
bloqueando u2(clk, a, b1, c1);
endmodule