我用verilog编写了一个简单的
dummy
模块。它基本上将值从输入复制到输出。
module dummy (
input clk,
input [7:0] vector1 [3:0],
output reg [7:0] vector2 [3:0]
);
always @* begin
for (integer i = 0; i < 4; i = i + 1) begin
vector2[i] = vector1[i];
end
end
endmodule
然后我有了测试台文件:
module tb0;
// Inputs
reg clk;
reg [7:0] data_in1 [3:0];
wire [7:0] result [3:0];
// Instantiate the module under test
dummy uut (
.clk(clk),
.vector1(data_in1),
.vector2(result)
);
// Clock generation
always begin
#5 clk = ~clk;
end
initial begin
clk = 0;
data_in1[0] = 8'h00;
data_in1[1] = 8'h00;
data_in1[2] = 8'h00;
data_in1[3] = 8'h00;
#10 data_in1[0] = 8'h0f;
#10 data_in1[1] = 8'h04;
#10 data_in1[2] = 8'h0e;
#10 data_in1[3] = 8'h0a;
$monitor("Time = %d: data_in1[1] = %d, data_out[1] = %d", $time, data_in1[1], result[1]);
#20 $finish;
end
endmodule
如果我理解正确的话,那么值
data_out[1]
最初应该为零,并在 20 个时间单位后更改为 8'h04
。但是当我运行我的 verilog 测试平台时,我得到 data_out[1]
修复为零。这是为什么?
当我运行模拟时,我看到以下输出:
Time = 40: data_in1[1] = 4, data_out[1] = 4
我从你那里得到了不同的输出(
data_out[1]
是4,而不是0),但这可能是由于模拟竞争条件造成的。
请注意,时间为 40,因为您在 4 次 10 个时间单位的延迟 (
$monitor
) 后调用 #10
。
更常见的是在时间 0 调用
$monitor
,如下所示:
initial begin
$monitor("Time = %d: data_in1[1] = %d, data_out[1] = %d", $time, data_in1[1], result[1]);
clk = 0;
data_in1[0] = 8'h00;
data_in1[1] = 8'h00;
data_in1[2] = 8'h00;
data_in1[3] = 8'h00;
#10 data_in1[0] = 8'h0f;
#10 data_in1[1] = 8'h04;
#10 data_in1[2] = 8'h0e;
#10 data_in1[3] = 8'h0a;
#20 $finish;
end
这是我得到的输出,这可能更符合您的预期:
Time = 0: data_in1[1] = 0, data_out[1] = 0
Time = 20: data_in1[1] = 4, data_out[1] = 4