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