Search code examples
programming-languagesverilogmodelsim

Bit slicing in verilog


How can I write wdata[((8*j)+7) : (8*i)] = $random; in verilog programming language? , where i and j are reg type variable. Modelsim gives error for constant range variable. How could I write it in proper manner.


Solution

  • You should think from Hardware prospective for the solution.

    Here is one solution. Hope that it will help you.

    module temp(clk);
      input clk;
      reg i, j;
      reg [23:0] register, select;
      wire [23:0] temp;
    
      initial 
      begin
          i = 'd1;
          j = 'd1;
      end
    
      generate
      for(genvar i = 0; i<24; i++)
      begin
          assign temp[i] = select[i] ? $random : register[i]; 
      end
      endgenerate
    
      always @ (posedge clk)
      begin
          register <= temp;
      end
    
      always @ *
      begin
          select = (32'hffff_ffff << ((j<<3)+8)) ^ (32'hffff_ffff << (i<<3));
      end
    endmodule