Перейти к содержанию
    

Разрядность операндов в контекстно-зависимом выражении

Здравствуйте, коллеги!

Предпочитаю в выражениях явно приводить размерность вектора к необходимой разрядности, однако появилась потребность разобраться с приведением разрядности по стандарту. Есть непонятный момент, нужна помощь..

Изучаю этот вариант стандарта IEEE_Std_1800-2012 SystemVerilog(для верилога написано то же самое) : IEEE_Std_1800-2012 SystemVerilog.pdf

Разрядность векторов саомоопеределённом выражении вычисляется согласно таблице 11-21 на странице 248:

Spoiler

649015669_self-determinedexpressions.thumb.png.81a01594fa23100b006fa5de682b588a.png

Однако есть и контекстно-определённые выражения. Примеры из документа:

logic [15:0] a, b; // 16-bit variables
logic [15:0] sumA; // 16-bit variable
logic [16:0] sumB; // 17-bit variable
sumA = a + b; // expression evaluates using 16 bits
sumB = a + b; // expression evaluates using 17 bits

Здесь всё понятно - учитывается разрядность вектора слева от оператора " = "

Далее они приводят пример, где суммирование с числом 0(int = 32bit) расширяет контекст всего выражения и не допускает потери информации при выполнении первого оператора " + ":

answer = (a + b + 0) >> 1; // will work correctly

Отсюда я делаю вывод, что контекстом является всё выражение, а не только то, что стоит слева от оператора " = ". Т.е. при выполнении первого оператора  " + " a и b уже будут расширены до 32 бит. Пока что тоже всё логично.

А вот далее следует непонятное..

logic [3:0] a;
logic [5:0] b;
logic [15:0] c;

c = {a**b}; // expression a**b is self-determined, 4 bits
c = a**b; // expression size is determined by c, 16 bits

Почему конкатенация не учитывает контекст, а возведение в степень - учитывает? Ведь и тот, и другой оператор присутствуют в приведенной выше таблице самооперделённых выражений.

И будет ли учитывать контекст, к примеру, оператор " << "  ?

logic [3:0] a;
logic [15:0] c;
c = a << 1; // expression size is ?

Почему разработчики не разделили таблицу на 2: операторы, учитывающие контекст, и игнорирующие его?

Благодарю за помощь!

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Приветствую!

13 minutes ago, TRILLER said:

Пока писал - разобрался! :biggrin:

Тему можно удалить.

Зачем же удалять,  раз разобрались поделитесь!  Для других будет полезно,  да и самому через какое то время может пригодится вспомнить :biggrin:

 

Удачи! Rob.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

16 минут назад, TRILLER сказал:

Пока писал - разобрался! :biggrin:

Тему можно удалить.

 

Есть предложение банить навечно тех персонажей, которые "разобрались, пока писали", или "сам дурак, тему можно удалить", но которые при этом почему-то забывают внятно изложить, так в чем же они там разобрались... Как по мне - это проявление элементарного неуважения к сообществу.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Приветствую!

Just now, Самурай said:

Есть предложение банить навечно тех персонажей, которые "разобрались, пока писали", или "сам дурак, тему можно удалить", но которые при этом почему-то забывают внятно изложить, так в чем же они там разобрались... Как по мне - это проявление элементарного неуважения к сообществу.

Эко вы грозный! :girl_devil:

Зачем же сразу банит - надо для начала разъяснительную работу проводить, воспитывать так сказать культуру общения  :yes3: 

 

Удачи! Rob.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

7 hours ago, RobFPGA said:

Приветствую!

Эко вы грозный! :girl_devil:

Зачем же сразу банит - надо для начала разъяснительную работу проводить, воспитывать так сказать культуру общения  :yes3: 

 

Удачи! Rob.

Операнды являются контекстно-определёнными. Т.е. разрядность каждого операнда расширяется до максимальной из числа операндов в пределах контекста. В большинстве случаев контекстом является всё выражение включая операнд в левой части оператора " = ". В исключительных случаях контекст сужается до области, указанной в колонке "Comments" для конкретного оператора из приведенной в первом посте таблицы.

Пример:

bit         a;
bit [1:0]   b;
bit [2:0]   c;
bit [3:0]   d, g;
bit [9:0]   e;
bit [15:0]  f;
f = (g) ? (e << 1) : {d << 2, (a) ? (b << 1) : c};

Для конкатенации все внутренние операнды являются самоопределёнными. 'd' не будет расширен и произойдёт потеря информации при сдвиге. Разрядность 'a' также не изменится, однако длина 'b' будет увеличена до 'c' и потери информации не произойдёт.

Контекстом 'g', как и 'a', является его собственная длина и расширения разрядности не произойдёт.

Для операнда 'e', наряду с конкатенацией, контекстом является всё выражение. А значит 'e' будет расширен до длины 'f' перед сдвигом и потери информации также не произойдёт.

Надеюсь, изложил понятно.

Quote

Есть предложение банить навечно тех персонажей, которые "разобрались, пока писали", или "сам дурак, тему можно удалить", но которые при этом почему-то забывают внятно изложить, так в чем же они там разобрались... Как по мне - это проявление элементарного неуважения к сообществу.

Если ещё ни 1 человек не успел ответить, то утверждение о невозможности удаления темы, как мне кажется, весьма спорно.

Не хотел проявлять неуважения, которого не имею. Прощения прошу.

А вот предложения "навечно банить" что-то мне напоминают.. Ах да, "жэстачайшэ усих!" Усы торчат из таких предложений..

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...