Verilog 无法用随机数据正确填充数组

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] <=

在我的一个测试台上,我创建了一个充满随机值的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] <= data[index];
end
它以正确的方式替换读取值。问题是,at
t=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