Random 如何将非常大的内存中的内容随机化?
我需要随机分配一个大内存。所有数据都包含在锁存模块中——每位1个 如何修复以下问题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
// 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上的代码:不能动态索引实例数组。解决此问题的两种方法:
初始
块周围使用生成
块和for
循环,而不是初始
块内的for
循环。如果您需要在时间0以外的某个时间执行此操作,则可以使用事件来触发它
结束快速且肮脏的解决方案:
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