Performing many operations simultaneously in Verilog

720 Views Asked by At

In Verilog, is there an easy way to specify to perform a large number of operations at once? For example, the verilog module below iterates a simple function ten times on the input, in a single clock cycle.

module test (val_in,val_out);
    input [15:0] val_in;
    output [15:0] val_out;
    wire [15:0] vals[10:1];
    integer i;

    assign vals[1]=val_in*val_in+val_in;
    assign vals[2]=vals[1]*vals[1]+val_in;
    assign vals[3]=vals[2]*vals[2]+val_in;
    assign vals[4]=vals[3]*vals[3]+val_in;
    assign vals[5]=vals[4]*vals[4]+val_in;
    assign vals[6]=vals[5]*vals[5]+val_in;
    assign vals[7]=vals[6]*vals[6]+val_in;
    assign vals[8]=vals[7]*vals[7]+val_in;
    assign vals[9]=vals[8]*vals[8]+val_in;
    assign vals[10]=vals[9]*vals[9]+val_in;
    assign val_out=vals[10];
endmodule // test

Is there a way to do this without specifying each iteration individually? I know one could create a loop and store a value at each iteration, but that would be different from the above, as it would not be able to run in a single clock cycle.

Sorry if this is a naive question; I'm very new to Verilog.

2

There are 2 best solutions below

0
On

Loop can be created for variables which follows a pattern, for others keep it as it is, Here vals[1] and val_out seems to have different pattern so isolating these from the loop

module test (val_in,val_out);
    input          [15:0] val_in;
    output         [15:0] val_out;
            wire   [15:0] vals[10:1];

    assign vals[1]=val_in*val_in+val_in;

    genvar i;
    generate
      for(i=2; i<=10; i=i+1) begin : grouped_vals
       assign vals[i]=vals[i-1]*vals[i-1]+val_in;
      end
    endgenerate

    assign val_out=vals[10];
  endmodule
1
On

Even you can generalize the above solution by adding a parameter as below.

module test (val_in,val_out);
    parameter      COUNT = 16;
    input          [COUNT-1 : 0] val_in;
    output         [COUNT-1 : 0] val_out;
            wire   [COUNT-1 : 0] vals[COUNT-1 : 1];

    assign vals[1]=val_in*val_in+val_in;

    genvar i;
    generate
      for(i=2; i<COUNT; i=i+1) begin : grouped_vals
       assign vals[i]=vals[i-1]*vals[i-1]+val_in;
      end
    endgenerate
    assign val_out = vals[COUNT-1];
endmodule