Verilog 中的简单组合逻辑分配失败

问题描述 投票:0回答:1

我用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]
修复为零。这是为什么?

verilog vhdl hdl
1个回答
0
投票

当我运行模拟时,我看到以下输出:

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
© www.soinside.com 2019 - 2024. All rights reserved.