Различное поведение смещения массива в симуляции

Я пытаюсь отладить очень странное поведение в моем дизайне. Я отлаживаю следующий фрагмент кода 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 раз. У меня есть простой тестовый стенд, который проверяет ожидаемое поведение, которое проходит. Проблема начинается, когда я использую этот модуль в большем дизайне. В общем, единственная разница заключается в том, что x_in читается из ОЗУ. Когда я сравниваю две осциллограммы (одна - это когда код DUT выше, а другая - когда я использую его в более крупном дизайне), я вижу, что x_in в обоих случаях ведет себя так, как ожидалось, то есть он приходит именно тогда, когда я ожидаю. Однако по какой-то причине следующая строка ведет себя по-другому:

sh_in[0] <= x_in;

В случае, когда я тестирую только ff_array, значение x_in смещается в sh_in[0] точно на том же самом положении часов, однако, когда я использую его в большем дизайне, в котором x_in читается из ОЗУ, x_in сдвигается sh_in[0] один такт после, а не на одни и те же часы. Я действительно не знаю причину. Я использую xsim v2018.2 (64-разрядная версия).

1 ответ

Решение

Ваша проблема не с ff_array но с выходом ОЗУ или в соединении. Просмотр простых сигналов не поможет вам, так как они не показывают "дельта" задержки, они показывают только их окончательное значение на шаге по времени. Вам нужно показать код, который производит вывод оперативной памяти. Если он структурирован аналогично вашему always_ff блокировать здесь, тогда можно было бы ожидать, что это произойдет через один тактовый цикл позже.

Другие вопросы по тегам