Я хочу получить доступ к фрагменту с динамическим значением. Я пытался сделать это разными способами. В первом случае, уменьшив логику модуля для управления значением индекса и т. д., верилятор сказал мне, что это не постоянное значение, и я согласен с этим, а затем перешел на вторую версию, но получил тот же результат.
1:
module m1 (
input logic [4:0] in1, // 8-bit input vector 1
input logic [4:0] in2, // 8-bit index
output logic [4:0] out // 8-bit output vector
);
logic add;
always_comb begin
add = (in2[in1[4:0]-1] & (in2[(in1[4:0]-2):0] != '0); //summary rounding
end
out = in1 + add;//summary of the final operation
endmodule
2:
module m1 (
input logic [4:0] in1, // 8-bit input vector 1
input logic [4:0] in2, // 8-bit index
output logic [4:0] out // 8-bit output vector
);
logic add;
always_comb begin
for (int i = 0; i < 4; i++) begin
if ((in1[4:0]-2) == i)begin
add = (in2[in1[4:0]-1] & (in2[(i:0] != '0); //summary rounding
end
end
out = in1 + add;//summary of the final operation
endmodule
Логика, которую я пытаюсь реализовать, — это режим округления riscv-v 1.0.
Я попробовал несколько тестов, пытаясь реализовать статическую логику, но не могу найти способ решить проблему. Как я могу реализовать эту логику аппаратно.
Если вы пытаетесь реализовать режим rne
, вам, похоже, не хватает логики. Согласно спецификации RVV-v1.0, для выполнения rne
вам необходимо вычислить шаг округления, используя следующую логику -> v[d-1] & (v[d-2:0]!= 0 | v[d])
.
Кроме того, разве вы не вводите вектор? Вы пытаетесь проиндексировать in1
, который является вашим индексом, с вашим in2
, который является вашим фактическим вектором, который нужно индексировать. Вам также не нужно указывать ширину вашей логики (как в in1
), ее можно описать как in1[in2[4:0]-1]
.
Для достижения того, что вы пытаетесь сделать, использование функций может быть весьма полезным, поэтому я бы предложил взглянуть на функции в SV.
Вы рассматривали возможность добавления reg
или logic
для хранения фрагмента?
@Juan_R Думаю, это должно тебе помочь -> github.com/pulp-platform/ara/blob/main/hardware/src/lane/…
Логично, но я думаю, что справлюсь со ссылкой, которой вы со мной поделились. Спасибо
Добрый день,
Окончательное решение, которое я нашел, следующее:
prev_shift = '0;
prev_shift = in2 << (in1[range in2] - 2);
not_zero = prev_shift != 0;
Спасибо @Suhas за помощь
Спасибо за вашу помощь. Я собираюсь проверить функцию SV. Проблема, с которой я борюсь, связана с (v[d-2:0]!= 0), потому что d входит в значение другого логического вектора. Поэтому мне нужно взять динамические фрагменты вектора, которые зависят от значения другого вектора. Тогда я не могу скомпилировать это оборудование, поскольку оно не является постоянным значением.