Различное поведение смещения массива в симуляции - PullRequest
0 голосов
/ 06 сентября 2018

Я пытаюсь отладить очень странное поведение в моем дизайне. Я отлаживаю следующий фрагмент кода 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 Ответ

0 голосов
/ 06 сентября 2018

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

...