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

时间:2017-04-20 09:45:41

标签: 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

此构造正确生成随机值:

  

数据[255] == 8&#39; hAB;   (......)   数据[1] == 8&#39; hC3;   data [0] == 8&#39; hDF;

在testbench中使用data[index]后,我想修改它的值。我正在做的如下:

always @(*) begin
  if(/* some condition */)
    data[index] <= $urandom%256;
  else
    data[index] <= data[index];
end

以正确的方式替换读取值。问题是,t = 0 data[0]具有未知的逻辑值(尽管在initial块中初始化):

  

数据[255] == 8&#39; hAB;   (......)   数据[1] == 8&#39; hC3;   数据[0] == 8&#39; hXX ;

在我看来,initial阻止分配被忽略&#39;,因为data[index] <= data[index];正在将8'hXX分配给data[0]。所有其他值都已正确分配。

如何解决此问题?

MCVE:

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

我使用ModelSim-Altera 10.4D来运行这个测试平台。

2 个答案:

答案 0 :(得分:0)

我添加&#34;评论&#34;但由于代表不能,所以我会尝试回答。

在你的初始块中你有一个阻止声明,这很好。在always @ block中你有一个非阻塞语句,这可能不是你想要的吗?可能由于if / else条件(上面提到的Roman),你有一个种族导致数据[index]值以导致X的方式更新。

我建议添加一些暂停该分支的内容,直到你知道初始块完成为止。

答案 1 :(得分:0)

当我进行模拟时,我发现一切运作良好。

enter image description here

你的模拟器可能有问题吗?你使用什么模拟器?