Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/asp.net-mvc-3/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Random 如何将非常大的内存中的内容随机化?_Random_Verilog_System Verilog - Fatal编程技术网

Random 如何将非常大的内存中的内容随机化?

Random 如何将非常大的内存中的内容随机化?,random,verilog,system-verilog,Random,Verilog,System Verilog,我需要随机分配一个大内存。所有数据都包含在锁存模块中——每位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[`WIDT

我需要随机分配一个大内存。所有数据都包含在锁存模块中——每位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
//内存的快速模型,我无法更改
`定义宽度64*144
模块闩锁(
输出寄存器Q);
端模
模块存储器;
导线[`WIDTH-1:0]latchData;
闩锁闩锁[`WIDTH-1:0](.Q(latchData[`WIDTH-1:0]);
端模
//我的测试台,我可以改变
模块测试;
reg[31:0]指数;
记忆();
初始开始
$display(“初始数据:%0d”,memory.latchData);
注入随机数据();
$display(“随机数据:%0d”,memory.latchData);
结束
任务数据();
//使用for循环不起作用
//对于(索引=0;索引<`WIDTH;索引=index+1)开始
//memory.latch[index].Q=$urandom;
//结束
//这样做似乎很糟糕
memory.latch[0].Q=$urandom;
memory.latch[1].Q=$urandom;
memory.latch[2].Q=$urandom;
// ... 还有一堆要走;别等了
结束任务
端模

EDA上的代码:

不能动态索引实例数组。解决此问题的两种方法:

  • 你真的需要在这么低的水平上对内存建模吗?将内存模型更改为RTL描述。无论如何,它的性能会更好
  • 初始
    块周围使用
    生成
    块和
    for
    循环,而不是
    初始
    块内的
    for
    循环。如果您需要在时间0以外的某个时间执行此操作,则可以使用
    事件来触发它
  • genvar指数; 事件数据; 对于(index=0;index<`WIDTH;index++)开始 始终@injectRandomData memory.latch[index].Q=$urandom;
    结束快速且肮脏的解决方案:

    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
    
    任务数据();
    ->不要输入任何数据;
    #0; // gen总是阻止更改完成;
    结束任务
    事件数据;
    genvar指数;
    生成
    对于(索引=0;索引<`WIDTH;索引=index+1)开始:gen_循环
    始终@(不输入随机数据)开始:设置随机
    memory.latch[index].Q=$urandom;
    结束
    结束
    最终生成
    
    游乐场守则:

    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