Как рандомизировать содержимое очень большой памяти?

Мне нужно рандомизировать большую память. Все данные содержатся внутри модулей-защелок — по 1 на бит.

Как исправить следующее?

// Quick mock up of the memory, which I can't change
`define WIDTH 64*144

module latch(
  output reg Q);
endmodule

module memory;
  wire [`WIDTH-1:0] latchData;
  latch latch[`WIDTH-1:0] (.Q(latchData[`WIDTH-1:0]));
endmodule

// My testbench, which I can change
module test;

  reg [31:0] index;

  memory memory();

  initial begin
    $display("Initial data: %0d", memory.latchData);
    injectRandomData();
    $display("Randomized data: %0d", memory.latchData);
  end

  task injectRandomData();
    // Using for loop does not work
    //for (index=0; index < `WIDTH; index = index+1) begin
    //  memory.latch[index].Q = $urandom;
    //end

    // Doing it this way seems terrible
    memory.latch[0].Q = $urandom;
    memory.latch[1].Q = $urandom;
    memory.latch[2].Q = $urandom;
    // ... a bunch more to go; don't wait up

  endtask

endmodule

Код на EDA Playground: http://www.edaplayground.com/s/4/235


person Victor Lyuboslavsky    schedule 14.10.2013    source источник


Ответы (2)


Быстрое и грязное решение:

task injectRandomData();
  ->do_InjectRandomData;
  #0; // gen always block a change to finish;
endtask

event do_InjectRandomData;
genvar index;
generate
  for(index = 0; index < `WIDTH; index = index +1) begin : gen_loop
    always @(do_InjectRandomData) begin : set_rand
      memory.latch[index].Q = $urandom;
    end
  end
endgenerate

Код на EDA Playground: http://www.edaplayground.com/s/6/236

person Greg    schedule 14.10.2013

Вы не можете динамически индексировать массив экземпляров. Два способа исправить это:

  1. Вам действительно нужно моделировать память на таком низком уровне? Измените модель памяти на описание RTL. В любом случае производительность будет лучше.
  2. Используйте блок generate с циклом for вокруг блока initial вместо цикла for внутри блока initial. Если вам нужно сделать это в какое-то время, отличное от времени 0, вы можете использовать event для его запуска.
genvar index;
event injectRandomData;
for (index=0; index < `WIDTH; index++) begin
   always @injectRandomData
      memory.latch[index].Q = $urandom; 
end
person dave_59    schedule 14.10.2013