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

    

Указание ширины шины переменной длины (SV, VERILOG), возможно?

Форумчане привет.

Расспиcывать долго не буду. Толи не могу правильно подобрать поисковые слова, то ли реально нет ответа.
 

`define DMA_MESSAGE_SIZE_SIZE				2
`define DMA_MESSAGE_DESCRIPTOR_COUNT_SIZE	1
...
input	wire [`DMA_MESSAGE_SIZE_SIZE  * 8 - 1:0]	input_data_size,
...
assign current_descriptor_count = (input_data_size <= 120)? 1:

Хотелось бы константы 120 и 1 приземлить и указать им конкретную ширину. 
К примеру,
 

assign current_descriptor_count = (input_data_size <= 16'd120)? 8d'1:

Но ширина зависит от define константы.
Возможно как нибудь через define прописать ширину?
Заранее спасибо

Изменено пользователем new123

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


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

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

54 minutes ago, new123 said:

...

assign current_descriptor_count = (input_data_size <= 16'd120)? 8d'1:

Но ширина зависит от define константы.
Возможно как нибудь через define прописать ширину?
Заранее спасибо

Я так понял вы хотите в коде получить актуальную ширину вектора ?  Ну так - 

assign current_descriptor_count = ($bits(input_data_size) <= 16'd120) ? 8d'1: ...

А еще лучше такие константы оформлять в localparam - 

localparam CURRENT_DESCRIPTOR_COUNT = ($bits(input_data_size)+119)/120;

 

Удачи! Rob.

 

 

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


Ссылка на сообщение
Поделиться на другие сайты
1 hour ago, RobFPGA said:

Я так понял вы хотите в коде получить актуальную ширину вектора ?

не совсем так. 
У меня есть бзик. Я люблю некий порядок и борюсь с варнингами.

Компилятор у меня на этом выдает warning.
 

assign current_descriptor_count = (input_data_size <= 120)? 1:

descriptor_count у меня переменной длины и зависит от

`define DMA_MESSAGE_DESCRIPTOR_COUNT_SIZE	1  // 1 байт = 8 * 1 = 8 бит

Соответственно я 8-ми битному вектору присваиваю константу из 32 бит - единицу.
Варнинг уйдет, если я сделаю
 

assign current_descriptor_count = (input_data_size <= 120)? 8'b01:

Но эта 8, у меня зависит от `define DMA_MESSAGE_DESCRIPTOR_COUNT_SIZE
Я пробовал нечто подобное
 

assign current_descriptor_count = (input_data_size <= 120)? (`DMA_MESSAGE_DESCRIPTOR_COUNT_SIZE * 8)'b01:

Но так не компилирует

Изменено пользователем new123

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


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

извлекайте и присваивайте только нужное количество бит

my1 = 1

descriptor=my1[$bits(descriptor)-1:0]  

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


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

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

Можно  привести разрядность  и так (width)'(value)

и так чтобы один раз 

... = (`DMA_MESSAGE_DESCRIPTOR_COUNT_SIZE * 8)'( (input_data_size <= 120) ? 1 : ... );

Но лучше дизайнить так чтобы определять требуемую разрядность  непосредственно в модуле через макс величину и функции $сlog2(), $bits(). 

 

Ну и у меня правило что если константа вычисляется в модуле то обязательно сделать localparam с ней чтобы по имени был хотя бы намек что это и читать легче. 

 

Удачи! Rob.

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


Ссылка на сообщение
Поделиться на другие сайты
On 2/6/2019 at 6:01 PM, RobFPGA said:

 (width)'(value)

вот я с первого раза и до форума так попробовал, не прокатывает.
вот недавно додумал попробовать без формулы (без знака умножения). Прошло. Странно как то.

 

А вообще спасибо всем. Куда мучать понял, буду добивать.

Изменено пользователем new123

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


Ссылка на сообщение
Поделиться на другие сайты
On 2/6/2019 at 9:27 PM, new123 said:

У меня есть бзик. Я люблю некий порядок и борюсь с варнингами.

тогда вы явно выбрали не тот язык. Вам в VHDL.  в V/SV довольно широкие возможности по автоматическому приведению разрядностей и типов. Достаточно изучить 10 страниц стандарта, чтобы снять все вопросы по приведению типов.

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


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

Для публикации сообщений создайте учётную запись или авторизуйтесь

Вы должны быть пользователем, чтобы оставить комментарий

Создать учетную запись

Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!

Регистрация нового пользователя

Войти

Уже есть аккаунт? Войти в систему.

Войти