jean28
jean28

Reputation: 102

Verilog: Converted Integer Not Working for For loop

I am writing a program in Verilog that accepts a binary value, converts it to Integer, and then prints "Hello, World!" that amount of times.

However, whenever I run the program, there is no display of Hello, World. Here is the code:

// Internal Variable
wire [0:4] two_times_rotate;

// Multiply the rotate_imm by two (left shift)
assign {two_times_rotate} = rotate_imm << 1;
integer i, times_rotated;

// Convert two_times_rotate into an integer
always @( two_times_rotate )
begin
  times_rotated = two_times_rotate;
end

initial 
begin

for (i = 0; i < times_rotated; i = i + 1)
begin
  $display("Hello, World");
end

end

assign {out} = in;
 endmodule

I tried using the following for loop instead:

for (i = 0; i < 7; i = i + 1)

And this one prints Hello, World seven times, like it should.

*UPDATE*

This is what I have in my code so far. I am trying to do a for that compares bits instead. It is still not working. How do I fully convert from binary to integer in a way that I can use it in the comparison in the for loop?

 module immShifter(input[0:31] in, input[0:3] rotate_imm, 
              output[0:31] out);

 // Internal Variable
 wire [0:4] two_times_rotate;
 reg [0:4] i;

 // Multiply the rotate_imm by two (left shift)
 assign {two_times_rotate} = rotate_imm << 1;
 integer times_rotated, for_var;

 // Convert two_times_rotate into an integer
 always @( two_times_rotate )
 begin
    assign{times_rotated} = two_times_rotate;
 end

 initial 
 begin

 assign{i} = 5'b00000;
 assign{for_var} = times_rotated;
 for (i = 5'b00000; i < times_rotated; i = i + 5'b00001)
 begin
   $display("Hello, World");
 end

 end

 assign {out} = in;
endmodule 

Upvotes: 0

Views: 1318

Answers (1)

Greg
Greg

Reputation: 19122

times_rotated is 32'bX at time 0 when the for-loop is being evaluated. The for-loop is checking i < 32'bX, which is false.


Based on your update, this may be what you are intending:

module immShifter( input [31:0] in, input [3:0] rotate_imm, output [31:0] out );
  integer i, times_rotated;
  always @*
  begin
    times_rotated = rotate_imm << 1;
    for (i = 0; i < times_rotated; i++)
      $display("Hello, World");
    $display(""); // empty line as separate between changes to rotate_imm
  end
  assign out = in;
endmodule

Upvotes: 1

Related Questions