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

时间:2018-09-06 15:26:14

标签: verilog system-verilog register-transfer-level

我正在尝试调试设计中的一个非常奇怪的行为。我正在调试下面的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位)。

1 个答案:

答案 0 :(得分:1)

您的问题不是ff_array,而是RAM输出或互连中的a。查看简单的波形不会帮助您,因为它们不会显示“增量”延迟,而只会在时间步长显示最终值。您需要显示产生RAM输出的代码。如果它的结构类似于此处的always_ff块,那么人们希望它在一个时钟周期后出现。