Estoy tratando de completar una tarea usando Verilog, los detalles no son muy importantes, excepto que debe ser un diseño combinatorio. Desafortunadamente, me estoy topando con lo que supongo es que el hardware se atasca en un bucle infinito: las siguientes señales forman un bucle combinatorio:
the following signal(s) form a combinatorial loop: _n0112, GND_2_o_GND_2_o_mux_66_OUT<1>, mode[2]_GND_2_o_equal_75_o, mode<1>, ran0, mode[2]_GND_2_o_equal_75_o_mmx_out.
Aquí está mi código (sé que está desordenado y se puede hacer mejor, estoy trabajando en ello):
module seven_seg(
input [3:0] a,
input [3:0] b,
input [3:0] c,
input [3:0] d,
input [1:0] mux,
output [6:0] out,
output an0,
output an1,
output an2,
output an3
);
wire [6:0] x;
wire [6:0] y;
wire [6:0] i;
wire [6:0] j;
reg [2:0] mode = 3'b000;
reg ran0;
reg ran1;
reg ran2;
reg ran3;
parameter zero = 7'b1000000;
parameter one = 7'b1001111;
parameter two = 7'b0010010;
parameter three = 7'b0000110;
parameter four = 7'b1001100;
parameter five = 7'b0100100;
parameter six = 7'b0100000;
parameter seven = 7'b0011111;
parameter eight = 7'b0000000;
parameter nine = 7'b0000100;
parameter ten = 7'b0001000;
parameter eleven = 7'b0000000;
parameter twelve = 7'b0110001;
parameter thirteen= 7'b0000001;
parameter fourteen= 7'b0110000;
parameter fifteen = 7'b0111000;
assign c = 4'b0001;
assign d = 4'b0000;
assign x = (a == 4'b0000) ? zero :
(a == 4'b0001) ? one :
(a == 4'b0010) ? two :
(a == 4'b0011) ? three :
(a == 4'b0100) ? four :
(a == 4'b0101) ? five :
(a == 4'b0110) ? six :
(a == 4'b0111) ? seven :
(a == 4'b1000) ? eight :
(a == 4'b1001) ? nine :
(a == 4'b1010) ? ten :
(a == 4'b1011) ? eleven :
(a == 4'b1100) ? twelve :
(a == 4'b1101) ? thirteen :
(a == 4'b1111) ? fourteen : fifteen;
assign y = (b == 4'b0000) ? zero :
(b == 4'b0001) ? one :
(b == 4'b0010) ? two :
(b == 4'b0011) ? three :
(b == 4'b0100) ? four :
(b == 4'b0101) ? five :
(b == 4'b0110) ? six :
(b == 4'b0111) ? seven :
(b == 4'b1000) ? eight :
(b == 4'b1001) ? nine :
(b == 4'b1010) ? ten :
(b == 4'b1011) ? eleven :
(b == 4'b1100) ? twelve :
(b == 4'b1101) ? thirteen :
(b == 4'b1111) ? fourteen : fifteen;
always @(*)
begin
if(mux == 2'b00)
if(mode == 3'b000)
mode = 3'b001;
else if(mode == 3'b010)
mode = 3'b011;
else mode = 3'b000;
else if(mux == 2'b01)
mode = 3'b000;
else if(mux == 2'b10)
mode = 3'b010;
else //if(mux == 2'b11)
mode = 3'b100;
end
always @(*)
begin
if(mode == 3'b000)
begin
ran0 = 0;
ran1 = 1;
ran2 = 1;
ran3 = 1;
end
else if(mode == 3'b001)
begin
ran0 = 1;
ran1 = 0;
ran2 = 1;
ran3 = 1;
end
else if(mode == 3'b010)
begin
ran0 = 1;
ran1 = 1;
ran2 = 0;
ran3 = 1;
end
else if(mode == 3'b011)//011
begin
ran0 = 1;
ran1 = 1;
ran2 = 1;
ran3 = 0;
end
else
begin
ran0 = 0;
ran1 = 0;
ran2 = 0;
ran3 = 1;
end
end
assign an0 = ran0;
assign an1 = ran1;
assign an2 = ran2;
assign an3 = ran3;
assign out = x;
endmodule
Así que creo que entiendo el problema, tiene que ver con este bloque:
always @(mux)
begin
if(mux == 2'b00)
if(mode == 3'b000)
mode = 3'b001;
else if(mode == 3'b010)
mode = 3'b011;
else mode = 3'b000;
else if(mux == 2'b01)
mode = 3'b000;
else if(mux == 2'b10)
mode = 3'b010;
else //if(mux == 2'b11)
mode = 3'b100;
end
El sintetizador termina poniendo 'modo' en la lista de sensibilidad por alguna razón, y creo que es por eso que termina en un bucle. Agradecería más información sobre lo que está pasando aquí.
¡Gracias!