Especificación de escritura de código RTL

(1) Usar asignación sin bloqueo para escribir código lógico secuencial

  • Todas las variables deben esperar a que llegue el borde del disparador antes de asignarlas.
  • Al calcular la señal en el lado derecho del número de asignación, todas las variables son los valores antes del borde de disparo.
  • Las declaraciones del bloque de procedimiento se ejecutan en paralelo.

(2) Escribir código de bloque de lógica combinacional con bloque siempre para usar la asignación de bloqueo

  • La lista confidencial en el bloque siempre debe activarse por nivel

(3) No puede utilizar tanto la asignación con bloqueo como la asignación sin bloqueo en el mismo bloque siempre.

(4) Solo se puede asignar una variable en un bloque siempre

  • siempre los bloques se ejecutan en paralelo
  • La asignación a la misma variable en múltiples bloques always está estrictamente prohibida
  • No se recomienda la asignación a múltiples variables en un bloque siempre.

(5) En el programa de reinicio asíncrono, si la declaración if aparece en la declaración siempre, la señal de control sensible que no sea la señal del reloj (generalmente la señal de reinicio) debe juzgarse en la primera declaración if, y si se coloca en el siguiendo el error de compilación de la declaración else if

  • Error común: no se pueden hacer coincidir los operandos en la condición con los bordes correspondientes en el control de evento adjunto de la construcción always. El bloque de código correspondiente es:
always @(posedge sys_clk or negedge sys_rst_n) begin
    if (count == COUNT_MAX)            // 
        led_out <= ~led_out;         // 时序逻辑块中用非阻塞赋值
    else if(sys_rst_n == 1'b0)
        led_out <= 1'b0;
    else 
        led_out <= led_out;
end

Obviamente, la señal de reinicio no se juzga en la primera instrucción if, ¡así que hay un error!

  • Método de modificación: coloque señales de control sensibles que no sean la señal del reloj en la primera instrucción if
always @(posedge sys_clk or negedge sys_rst_n) begin
    if (sys_rst_n == 1'b0)            // 
        led_out <= 1'b0;
    else if(count == COUNT_MAX)
        led_out <= ~led_out;         // 时序逻辑块中用非阻塞赋值
    else 
        led_out <= led_out;
end

(6) El nombre del parámetro parámetro se escribe con mayúscula para distinguir otras variables

parameter COUNT_MAX = 25'd24_999_999

(7) Al escribir números más largos, sepárelos con _ (guion bajo) para mejorar la legibilidad

parameter MIN = 25'd10_999_999,
parameter MAX = 25'd24_999_999

Supongo que te gusta

Origin blog.csdn.net/jac_chao/article/details/124158253
Recomendado
Clasificación