Estoy empezando con verilog y escribí este código aquí para probar si un número es primo. Sé que podría ser mucho más eficiente, pero es solo para la práctica. La forma en que se realiza la prueba de primado es cuando se envía la señal de reinicio. Inicializo el registro div a 2. Luego lo incremento en 1 en cada ciclo de reloj mientras no es divisible por el número que estoy probando. Una vez que se vuelve divisible (en este caso es un factor donde el número no es primo o el número en el cual es primo) quiero mantener el registro en el mismo valor. Este es el problema. Estoy implicando un cierre aquí. Sé que estoy asignando un valor a div en cada rama de la declaración if, pero no estoy seguro de si debería asignárselo a sí mismo.
module prime(
input [31:0] n,
input clk,
input reset,
output done,
output is_prime);
reg [32:0] div;
assign is_prime = div == n;
assign done = n % div == 0;
always @(posedge clk) begin
if(reset) begin
div <= 2;
end
else if(n % div == 0) begin
div <= div; //does this cause a latch
end
else begin
div <= div + 1;
end
end
endmodule