Jump to content

    

Вопрос по Verilog

Имеется 100 регистров обьявленных как :

reg[31:0] slv_reg0;

......

reg[31:0] slv_reg99;

и имеется соответствующее количество 32-х разрядных выходов ( индексированный массив).

Есть ли возможность присвоить  в цикле выходам соответствующие значения регистров? 

 

 

Share this post


Link to post
Share on other sites

А нельзя ли использовать обычный двумерный массив? Чтобы не было потом неприяно заничаться поддержкой?

reg [99 : 0][31 : 0] slv_reg

 

Share this post


Link to post
Share on other sites
26 минут назад, mirobest сказал:

Имеется 100 регистров обьявленных как :

и имеется соответствующее количество 32-х разрядных выходов ( индексированный массив).

Вам действительно надо иметь отдельные регистры? Чтобы писать-читать одновременно все? Или, если по одному или хотя бы группами, то поставьте память... 

Потому как 32*100*2 = 6400 интерконнектов будет задействовано для приема-передачи данных на эти регистры....

Share this post


Link to post
Share on other sites

Проблема исходит из генерирумого Xilinx Vivado  template для AXI Slave. 

Share this post


Link to post
Share on other sites

Есть не самый элегантный, но рабочий вариант - сгенерить текстовый файл с помощью любого другого ЯП, в котором эти самые присвоения реализуются. Там это как раз будет циклом + пара строк. А потом уже из текстового файлика вставить строки в нужный вериложный.

 

Либо таким же образом сделать перепаковку в многомерный массив, а затем в цикле уже соединения реализовать

Edited by Tausinov

Share this post


Link to post
Share on other sites
1 hour ago, mirobest said:

Проблема исходит из генерирумого Xilinx Vivado  template для AXI Slave. 

И всё же настоятельно рекомендую в темплейте заменить именованные регистры, на двухмерный массив регистров. Я так сделал и всё работает. Тем более, что функцию перисвоения можно будет с большого case массива заменить на нумеруемую, что значительно уменьшит количество строк кода.

Ну или на крайний случай сделать одноразовую замену slv_reg0 -> slv_reg[1], slv_reg0 -> slv_reg[1], ... slv_reg99 -> slv_reg[99]. Использовать именуемые выходные векторы и неудобно и приводик к ошибкам обширным

 

Share this post


Link to post
Share on other sites
14 hours ago, Nick_K said:

И всё же настоятельно рекомендую в темплейте заменить именованные регистры, на двухмерный массив регистров. Я так сделал и всё работает.

В вопросе обозначен Verilog, чистый. в нем нет двумерных упакованных массивов. Только память - массив векторов и то, не для передачи через порты ввода/вывода. За сим, в контексте поставленного вопроса, в чистом верилоге задача не решается.

Share this post


Link to post
Share on other sites
1 hour ago, des00 said:

В вопросе обозначен Verilog, чистый. в нем нет двумерных упакованных массивов.

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

Share this post


Link to post
Share on other sites

Сделайте регистр размера 3200 и доступ по индексу через +: . Будет чистый Verilog

Share this post


Link to post
Share on other sites

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

On 1/16/2020 at 12:50 PM, mirobest said:

Есть ли возможность присвоить  в цикле выходам соответствующие значения регистров? 

Увы - в Verilog генерировать имя переменной в цикле нельзя. Поэтому единственный путь "упрощения" себе жизни как советовали выше  внешний кодогенератор.Ну или использовать макро.  

Заменой на массивы тут не получится использовать так как это довольно распространенная проблема при стыковке с чужим кодом  со множеством однотипных  портов или переменных  (который тоже чаще всего генерится автоматом из шаблонов). 

Удачи! Rob.

Share this post


Link to post
Share on other sites
On 1/19/2020 at 7:22 AM, lexx said:

Сделайте регистр размера 3200 и доступ по индексу через +: . Будет чистый Verilog

начальное присвоение, как в коде у ТС, все равно руками

On 1/19/2020 at 8:50 AM, RobFPGA said:

Увы - в Verilog генерировать имя переменной в цикле нельзя.

Я в SV пробовал, у меня тоже не оплучилось :(

Share this post


Link to post
Share on other sites
5 hours ago, des00 said:

Я в SV пробовал, у меня тоже не оплучилось :(

SV как  надстройка верилога включает в себя паттерны языка по-умолчанию. Да и в VHDL тоже таких фокусов нет.

Share this post


Link to post
Share on other sites
32 minutes ago, Nick_K said:

SV как  надстройка верилога включает в себя паттерны языка по-умолчанию. Да и в VHDL тоже таких фокусов нет.

там можно передать в макрос символьное значение, с помощью ``var``, но это будет именно символ. Например так

`define assign_reg(idx,y) assign var_a[idx] = var``y``
  
assign_reg(0, 13); 

// результат применения 
  
assign var_a[0] = var13;

// но перечисляемое не работает 
generate for (int i = 0; i < 13; i++) ....assign_reg(i, i % 13); ....

// результат 
assign var_a[0] = vari%13;
....
assign var_a[13] = vari%13;

Передать перечисляемое в цикле значение у меня не получилось. но руками набить можно)

 

Share this post


Link to post
Share on other sites
8 minutes ago, des00 said:

там можно передать в макрос символьное значение, с помощью ``var``, но это будет именно символ. Например так 

Да, я уже проверял) И в generat'е не работает и в foreach'е тоже. Но такие же фокусы в Верилоге можно сделать ;)

Share this post


Link to post
Share on other sites
11 minutes ago, Nick_K said:

Да, я уже проверял) И в generat'е не работает и в foreach'е тоже. Но такие же фокусы в Верилоге можно сделать ;)

посмотрел IEEE Std 1364-2001 и IEEE Std 1364-2005. Ткните носом где это допускается в стандарте на верилог?

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this