在我的一个测试平台中,我创建了一个填充了随机值的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来运行这个测试平台。