阵列移位器在仿真中的不同行为

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

我试图在我的设计中调试一个非常奇怪的行为。我正在调试以下Systemverilog代码:

    module ff_array
    #(
        parameter INPUT_WIDTH  = 16,
        parameter OUTPUT_WIDTH = INPUT_WIDTH*2,
        parameter ARRAY_SIZE  = 3
    )
    (
    input  logic clk,
    input  logic rst,
    input  logic signed [INPUT_WIDTH-1  : 0 ]x_in,
    output logic signed [OUTPUT_WIDTH-1 : 0 ]y_out
    );
    logic signed [INPUT_WIDTH-1 : 0 ] sh_in [ARRAY_SIZE-1:0];

    always_ff @(posedge clk) begin
        if(~rst) begin
            for (int i=0; i< ARRAY_SIZE; i++) begin
                sh_in[i] <= {OUTPUT_WIDTH{1'b0}};
            end
        end else begin
            sh_in[0] <= x_in;
            for (int i=1; i< ARRAY_SIZE; i++) begin
                sh_in[i] <= sh_in[i-1];
            end
        end
    end

    assign y_out   = sh_in[ARRAY_SIZE-1];
endmodule

上面的代码是更大设计的一部分,但由于我将错误缩小到上面的电路,我没有添加整个设计。我对上述代码的预期行为是将输入延迟ARRAY_SIZE-1次。我有一个简单的测试平台,可以验证通过的预期行为。当我在更大的设计中使用这个模块时,这个问题开始了。通常,唯一的区别是从RAM读取x_in。当我比较两个波形时(一个是当上面的代码是DUT而另一个是我在更大的设计中使用它时)我看到两个情况下的x_in都表现得如预期的那样,这意味着,它恰好在我期望的时候到达。但是由于某种原因,以下行的行为有所不同:

sh_in[0] <= x_in;

在我单独测试ff_array的情况下,x_in值恰好在时钟的相同pos边缘移入sh_in [0],但是,当我在更大的设计中使用它时,从RAM读取x_in,x_in被移位一个时钟周期后sh_in [0]而不是同一个时钟。我真的不知道原因。我使用的是xsim v2018.2(64位)。

verilog system-verilog register-transfer-level
1个回答
1
投票

问题不在于ff_array,而在于RAM的输出或互连。查看简单波形对您没有帮助,因为它们不显示“delta”延迟,它们仅在时间步骤显示它们的最终值。您需要显示生成RAM输出的代码。如果它的结构类似于你的always_ff块,那么可以预期它会在一个时钟周期后出现。

© www.soinside.com 2019 - 2024. All rights reserved.