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