Verilog 无法用随机数据正确填充数组
在我的一个测试台上,我创建了一个充满随机值的2D数组,如下所示:Verilog 无法用随机数据正确填充数组,verilog,simulation,modelsim,Verilog,Simulation,Modelsim,在我的一个测试台上,我创建了一个充满随机值的2D数组,如下所示: reg [7:0] data [255:0]; initial begin for(i = 0; i < 256; i = i + 1) data[i] = $urandom%256; end always @(*) begin if(/* some condition */) data[index] <= $urandom%256; else data[index] <=
reg [7:0] data [255:0];
initial begin
for(i = 0; i < 256; i = i + 1)
data[i] = $urandom%256;
end
always @(*) begin
if(/* some condition */)
data[index] <= $urandom%256;
else
data[index] <= data[index];
end
它以正确的方式替换读取值。问题是,att=0
数据[0]
具有未知的逻辑值(尽管在initial
块中进行了初始化):
数据[255]==8'hAB;
(...)
数据[1]==8'hC3;
数据[0]=8'hXX
在我看来,来自initial
块的赋值被“忽略”,因为data[index]我想添加一条“注释”,但由于rep的原因无法添加,所以我将尝试回答
在初始块中有一个阻塞语句,这很好。在always@block中,您有一个非阻塞语句,这可能不是您想要的?。可能是由于if/else条件(上面罗曼提到的)的原因,您有一个导致数据[index]值以导致X的方式更新的竞争
我建议添加一些东西,在知道初始块完成之前停止该分支。当我运行模拟时,我发现一切都很好
你的模拟器可能有问题吗?你使用的模拟器是什么?如果你想分配数据[index],你不需要else
语句,当你可以看到你的初始块时,把你的测试台添加到帖子中。如果你把从“输入”到data[index]
的所有作业链都发布出来,效果会更好。我怀疑你有竞争。我们需要一个MCVE。@Roman:我知道我不需要使用else
语句,但我一直认为它应该作为更复杂构造的良好实践。ModelSim-Altera.10.4d。
module test_tb;
reg [7:0] data [255:0];
reg read = 1'b0;
reg [7:0] index = 8'h00;
reg clk = 1'b1;
integer i;
initial begin
$monitor("DATA %h @ index %d", data[index], index);
for(i = 0; i < 256; i = i + 1)
data[i] = $urandom%256;
forever begin
#($urandom%5*40) read = ~read;
end
end
always @(posedge clk) begin
if(read)
data[index] <= $urandom%256;
else
data[index] <= data[index];
end
always @(posedge clk) begin
if(read)
index <= index + 1'b1;
else
index <= index;
end
always @(*) begin
clk <= #20 ~clk;
end
endmodule