Verilog loop para múltiples bloques siempre

0

Si tengo más reg declarado, cada reg necesita tener su propio bloque always , por ejemplo:

output reg[3:0] A;
output reg[3:0] B;
output reg[3:0] C;  

always @(posedge clock) begin
    if(reset) begin
       A <= 4'b0;
    end
    .
    .
    .
end

always @(posedge clock) begin
    if(reset) begin
       B <= 4'b0;
    end
    .
    .
    .
end

always @(posedge clock) begin
    if(reset) begin
       C <= 4'b0;
    end
    .
    .
    .
end

¿Qué pasa si tengo un bucle? Digamos algo como esto:

repeat n times
    if(C<0) begin
         shift C two positions
         C <= C + 1;
    else
         shift A one position
         A <= C + 1;
end

Como se ve aquí, dentro del bloque if(C<0) , no puedo tener

C <= C << 2;
C <= C + 1;

así que necesitaré un registro separado para almacenar C cambiado, digamos que será output reg[8:0] shiftC , así que por cierto necesito un bloque separado always . Y, por supuesto, también se bloquea el bloque always para A .

Mi pregunta es, ¿cómo puedo hacer que este bucle funcione, si uso varios bloques always ? PD: aquí, el número de bits es solo informativo, y no importa.

    
pregunta Linksx

1 respuesta

2
  

Aprendí [...] cada reg necesita tener su propio bloque always ...

Creo que tienes esto al revés. Cada registro solo debe asignarse a un bloque always . Sin embargo, esto no significa que necesite un bloque always separado para cada registro. Es perfectamente seguro (y, de hecho, bastante normal) tener un solo bloque always para toda la lógica síncrona en un módulo, por ejemplo,

always @(posedge clk) begin
    if (reset) begin
        A <= 4'b0;
        B <= 4'b0;
        …etc…
    end else begin
        …etc…
    end
end
  

¿Qué pasa si tengo un bucle? Digamos algo como esto:

No puedes hacer eso en un bucle.

Los bucles Verilog son para generar copias múltiples de lógica repetida. No son un sustituto de la lógica sincronizada: si necesita realizar varias acciones, es probable que deba hacer que sucedan en relojes separados e implementarlas en una máquina de estado.

Dependiendo de lo que necesite que suceda, podría haber alguna forma de "desenrollar" el bucle y hacer que se realicen varias iteraciones en un solo reloj. Sin embargo, deberás tener mucho cuidado con la forma en que implementas esto. Hacer que se ejecuten múltiples niveles de lógica de bifurcación en un solo ciclo de reloj generalmente no es aconsejable; las dependencias de datos limitarán severamente la velocidad de reloj de tal diseño.

    
respondido por el duskwuff

Lea otras preguntas en las etiquetas