I'm trying to complete an assignment using Verilog, the details aren't too important, except that it must be a combinatorial design. Unfortunately I'm running into what I assume is the hardware getting stuck in an infinite loop: the following signal(s) form a combinatorial loop:
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.
Here's my code(I know its messy and can be done better, I'm working on it):
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
So I think I understand the problem, it has to do with this block:
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
The synthesizer ends up putting 'mode' into the sensitivity list for some reason, and I believe that's why it ends up in a loop. I would appreciate some more insight as to what's going on here.
Thanks!