Как получить доступ к фрагменту с динамическим значением в SystemVerilog?

Я хочу получить доступ к фрагменту с динамическим значением. Я пытался сделать это разными способами. В первом случае, уменьшив логику модуля для управления значением индекса и т. д., верилятор сказал мне, что это не постоянное значение, и я согласен с этим, а затем перешел на вторую версию, но получил тот же результат.

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.

Я попробовал несколько тестов, пытаясь реализовать статическую логику, но не могу найти способ решить проблему. Как я могу реализовать эту логику аппаратно.

Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
0
73
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Если вы пытаетесь реализовать режим rne, вам, похоже, не хватает логики. Согласно спецификации RVV-v1.0, для выполнения rne вам необходимо вычислить шаг округления, используя следующую логику -> v[d-1] & (v[d-2:0]!= 0 | v[d]).

Кроме того, разве вы не вводите вектор? Вы пытаетесь проиндексировать in1, который является вашим индексом, с вашим in2, который является вашим фактическим вектором, который нужно индексировать. Вам также не нужно указывать ширину вашей логики (как в in1), ее можно описать как in1[in2[4:0]-1].

Для достижения того, что вы пытаетесь сделать, использование функций может быть весьма полезным, поэтому я бы предложил взглянуть на функции в SV.

Спасибо за вашу помощь. Я собираюсь проверить функцию SV. Проблема, с которой я борюсь, связана с (v[d-2:0]!= 0), потому что d входит в значение другого логического вектора. Поэтому мне нужно взять динамические фрагменты вектора, которые зависят от значения другого вектора. Тогда я не могу скомпилировать это оборудование, поскольку оно не является постоянным значением.

Juan_R 29.05.2024 10:23

Вы рассматривали возможность добавления reg или logic для хранения фрагмента?

Suhas 29.05.2024 13:46

@Juan_R Думаю, это должно тебе помочь -> github.com/pulp-platform/ara/blob/main/hardware/src/lane/…

Suhas 29.05.2024 13:50

Логично, но я думаю, что справлюсь со ссылкой, которой вы со мной поделились. Спасибо

Juan_R 29.05.2024 14:34
Ответ принят как подходящий

Добрый день,

Окончательное решение, которое я нашел, следующее:

prev_shift = '0;
prev_shift = in2 << (in1[range in2] - 2);
not_zero = prev_shift != 0;

Спасибо @Suhas за помощь

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