instrucción siempre dentro del caso en Verilog

2

Soy un principiante en Verilog. Por lo tanto, mi pregunta puede parecerle fácil, pero tengo dificultades para comprender la estructura de Verilog. Tengo un módulo que funciona en dos modos: leer y escribir. En el modo de escritura, debe asignar un valor en el borde positivo del reloj. En modo lectura, debe dar salida en cualquier momento sin reloj. ¿Puedo usar siempre una declaración en el caso?

 module EncodedRAM (input EncodingMode, input [2:0] EncodingIndex, input [7:0] EncodingNumber, 
input [7:0] EncodingMask, input CLK, output [7:0] EncodingResult);
initial begin
    EncodingNumbers[0]=8'b00000000;
    EncodingNumbers[1]=8'b00000000;
    EncodingNumbers[2]=8'b00000000;
    EncodingNumbers[3]=8'b00000000;
    EncodingNumbers[4]=8'b00000000;
    EncodingNumbers[5]=8'b00000000;
    EncodingNumbers[6]=8'b00000000;
    EncodingNumbers[7]=8'b00000000;
end

case(EncodingMode)
0:  
    always @(posedge CLK)
    EncodingNumbers[EncodingIndex]=EncodingNumber ^ Masks[EncodingIndex];


1:  
    EncodingResult=EncodingNumbers[EncodingIndex];

endcase



endmodule
    
pregunta nurgasemetey

2 respuestas

1

Primero debes declarar tu EncodingNumbers . Por la forma en que lo usaste, creo que quieres que sea un recuerdo:

reg [7:0] EncodingNumbers [7:0];

Esto convierte a EncodingNumbers en un archivo de memoria con 8 elementos, y cada uno de esos elementos tiene 8 bits de ancho. Como le asignas un bloque siempre, debes convertirlo en un reg .

Luego, si quieres que las escrituras estén sincronizadas pero las lecturas sean asíncronas, puedes hacer esto:

// write operation
always @(posedge clk) begin
    if (EncodingMode == 0) begin
        EncodingNumbers[EncodingIndex] <= EncodingNumber ^ Masks[EncodingIndex];
    end
end 

// read operation 
assign EncodingResult = EncodingMode == 1 ? EncodingNumbers[EncodingIndex] : 8'bX;

La conclusión principal es que cada señal que usted controla debe ser un cable o un registro. Debe manejar los registros en el código de procedimiento (siempre se bloquea) y los cables en el código continuo (asignar declaraciones).

También observa que no definiste qué EncodingResult debería ser cuando EncodingMode es 0, así que simplemente lo hice indefinido --- deberías poner algo más allí, como 1 o 0.

Además, tenga en cuenta, especialmente cuando use memorias, si está codificando la síntesis (si va a implementar el código en hardware real como un FPGA), debe tener cuidado de codificar las cosas de manera que el hardware pueda en realidad coincide con su código. Si las memorias en su hardware no pueden hacer una lectura asíncrona (lo cual es muy común en los FPGA), por ejemplo, obtendrá un error en la síntesis (que no es tan malo) o su comportamiento de hardware no coincidirá lo que simulaste (potencialmente mucho peor si no te das cuenta)

    
respondido por el The Photon
1

No, pero puedes poner un caso dentro de un bloque siempre:

always @(posedge CLK) begin
  case(EncodingMode)
    0 : EncodingNumbers[EncodingIndex]=EncodingNumber ^ Masks[EncodingIndex];
    1 : EncodingResult=EncodingNumbers[EncodingIndex];
  endcase
end
Los

always bloques se ejecutan en paralelo, la estructura de control va dentro de él.

Piense en los bloques Siempre como secciones de hardware, si, el caso y otros mecanismos de control son ramas de lógica dentro de ese bloque. Si está creando de forma selectiva siempre los bloques, está creando y destruyendo hardware sobre la marcha.

Si es para mejorar la reutilización del código donde controlamos la base de hardware en parámetros constantes, entonces generamos declaraciones o las técnicas de preprocesamiento pueden ayudar.

En su caso, parece querer disparar el bloque de manera diferente, escriba en posición y lea en cualquier borde. Por lo tanto, recomendaría usar 2 bloques separados que verifiquen el modo de configuración.

always @(posedge clk) begin
  if (EncodingMode == 0) begin
    EncodingNumbers[EncodingIndex]=EncodingNumber ^ Masks[EncodingIndex];
  end
end

always @(clk) begin
  if (EncodingMode == 1) begin
    EncodingResult=EncodingNumbers[EncodingIndex];
  end
end
    
respondido por el pre_randomize

Lea otras preguntas en las etiquetas