Antes de continuar con su pregunta principal, hay un par de problemas que veo con su código.
- Nunca inicializa "isPerfectSquare".
- Si usa "asignaciones de bloqueo" dentro de un bloque siempre secuencial, solo debe leer el resultado en el mismo bloque siempre. Leerlos desde otros bloques siempre puede llevar a un comportamiento impredecible y / o diferencias entre síntesis y simulación.
En particular, el primero de estos problemas puede significar que la herramienta de síntesis simplifica su código a algo como.
assign isPerfectSquare = 1;
Entonces, consideremos una versión fija de su código para que podamos continuar con su pregunta principal.
always@(posedge clock) begin
isPerfectSquareInternal = 0
for (i=0; i<11; i=i+1) begin
if (i*i == data)
isPerfectSquareInternal = 1;
end
isPerfectSquare <= isPerfectSquareInternal
end
Ahora juguemos a la herramienta de síntesis y veamos si podemos convertir esto en lógica combinatoria que alimente un registro final.
En general, podemos convertir una "declaración if" en un multiplexor, pero en este caso particular podemos mejorar y convertirlo en una operación lógica.
always@(posedge clock) begin
isPerfectSquareInternal = 0
for (i=0; i<11; i=i+1) begin
isPerfectSquareInternal = isPerfectSquareInternal || (i*i == data)
end
isPerfectSquare <= isPerfectSquareInternal
end
Ahora para tratar con el bucle for. Notamos que el bucle tiene un número fijo de iteraciones, por lo tanto, podemos desenrollarlo.
always@(posedge clock) begin
isPerfectSquareInternal0 = (0 == data)
isPerfectSquareInternal1 = isPerfectSquareInternal0 || (1 == data)
isPerfectSquareInternal2 = isPerfectSquareInternal1 || (4 == data)
isPerfectSquareInternal3 = isPerfectSquareInternal2 || (9 == data)
isPerfectSquareInternal4 = isPerfectSquareInternal3 || (16 == data)
isPerfectSquareInternal5 = isPerfectSquareInternal4 || (25 == data)
isPerfectSquareInternal6 = isPerfectSquareInternal5 || (36 == data)
isPerfectSquareInternal7 = isPerfectSquareInternal6 || (49 == data)
isPerfectSquareInternal8 = isPerfectSquareInternal7 || (64 == data)
isPerfectSquareInternal9 = isPerfectSquareInternal8 || (81 == data)
isPerfectSquareInternal10 = isPerfectSquareInternal9 || (100 == data)
isPerfectSquare <= isPerfectSquareInternal10
end