реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> Грамотное описание парсинга, Как сократить запись?
Lutovid
сообщение Mar 31 2017, 10:43
Сообщение #1


Участник
*

Группа: Свой
Сообщений: 66
Регистрация: 24-02-14
Из: Москва
Пользователь №: 80 661



Всем привет!
Столкнулся с такой задачей:
есть массив регистров reg [63:0] xgmii_rxd_in_sh_r [1:XGMII_RX_REG_LENGTH];
В нем записан блок данных; в начале данных есть 3 заголовка R_ID_block, OFFSET_block, SIZE_block; максимальная величина первого 6 байт, остальных двух - 12; загвоздка в том, что они могут быть меньшей длины - каждый может быть от 1 до максимального значения байт и между ними разделительный символ 8'h3B

Иначе говоря надо задетектить сначала первый разделительный символ, записать данные, потом второй, потом третий, сохранить данные в 3 соответствущих регистра и все это за один такт. Получается дерево из if - ничего лучше пока в голову не пришло< может вы что-нибудь подскажете(но не повышение частоты для парсинга)? Но вопрос заключается в том - как сократить запись и не писать целое дерево такого вида:
Код
                             if(xgmii_rxd_in_sh_r[1][15:8] == 8'h3B)begin                                
                                R_ID_block <= {32'h30303030, xgmii_rxd_in_sh_r[1][7:0]};
                                if (xgmii_rxd_in_sh_r[1][31:24] == 8'h3B) begin
                                    OFFSET_block <= {88'h3030303030303030303030, xgmii_rxd_in_sh_r[1][23:16]};
                                    if (xgmii_rxd_in_sh_r[1][47:40] == 8'h3B) begin
                                        SIZE_block <= {88'h3030303030303030303030, xgmii_rxd_in_sh_r[1][39:32]};
                                    end
                                    else if (xgmii_rxd_in_sh_r[1][55:48] == 8'h3B) begin
                                        SIZE_block <= {80'h30303030303030303030, xgmii_rxd_in_sh_r[1][39:32], xgmii_rxd_in_sh_r[1][47:40]};
                                    end
                      ........etc

// cranky.gif

Если я опишу через 3 вложенных цикла с операциями if, то это приведет к некорректному детектированию - внешний цикл отработает параллельно все 8'h3B в массиве xgmii_rxd_in_sh_r , а нужно, что бы внешний задетектировал только первый, второй цикл - второй символ и третий - третий символ

P.S. Извиняюсь что кривовато объяснил, но надеюсь вы меня все же поймете)
P.P.S. сразу скажу, что парсинг этих полей нельзя перенести на микроблэйз или другой процессор
Заранее спасибо
Go to the top of the page
 
+Quote Post
iosifk
сообщение Mar 31 2017, 11:06
Сообщение #2


Гуру
******

Группа: Модераторы
Сообщений: 3 547
Регистрация: 8-09-05
Из: спб
Пользователь №: 8 369



Цитата(Lutovid @ Mar 31 2017, 14:43) *
Столкнулся с такой задачей:
есть массив регистров reg [63:0] xgmii_rxd_in_sh_r [1:XGMII_RX_REG_LENGTH];
В нем записан блок данных; в начале данных есть 3 заголовка R_ID_block, OFFSET_block, SIZE_block; максимальная величина первого 6 байт, остальных двух - 12; загвоздка в том, что они могут быть меньшей длины - каждый может быть от 1 до максимального значения байт и между ними разделительный символ 8'h3B

P.S. Извиняюсь что кривовато объяснил, но надеюсь вы меня все же поймете)
P.P.S. сразу скажу, что парсинг этих полей нельзя перенести на микроблэйз или другой процессор

Судя по "xgmii" речь идет о принятых пакетах данных. А это означает, что подход "сначала принимаем, а потом обрабатываем" - не правильный.
А парсить можно и в темпе приема, ведь все данные не появляются одномоментно. А это значит, что можно организовать дополнительные поля для служебной информации и в темпе приема туда записавать частично обработанную информацию...

Что же касается приведенных ТС кодов - то это жуткий дешифратор на логике или ПЗУ, и с жуткой разрядностью, который сожрет прорву ресурсов....


--------------------
www.iosifk.narod.ru
Go to the top of the page
 
+Quote Post
Lutovid
сообщение Mar 31 2017, 11:19
Сообщение #3


Участник
*

Группа: Свой
Сообщений: 66
Регистрация: 24-02-14
Из: Москва
Пользователь №: 80 661



Цитата(iosifk @ Mar 31 2017, 14:06) *
Судя по "xgmii" речь идет о принятых пакетах данных. А это означает, что подход "сначала принимаем, а потом обрабатываем" - не правильный.
А парсить можно и в темпе приема, ведь все данные не появляются одномоментно. А это значит, что можно организовать дополнительные поля для служебной информации и в темпе приема туда записавать частично обработанную информацию...


Абсолютно с вами согласен, я так и делаю< просто не стал вдаваться в такие подробности - суть проблемы это не меняет - если бы был например gmii интерфес в 1 байт - то да; но в моем случае интерфейс 8 байт, это приведет к созданию конечного автомата на (6+12+12)/8 состояний в каждом из который здоровое дерево из if
Go to the top of the page
 
+Quote Post
iosifk
сообщение Mar 31 2017, 11:26
Сообщение #4


Гуру
******

Группа: Модераторы
Сообщений: 3 547
Регистрация: 8-09-05
Из: спб
Пользователь №: 8 369



Цитата(Lutovid @ Mar 31 2017, 15:19) *
Абсолютно с вами согласен, я так и делаю< просто не стал вдаваться в такие подробности - суть проблемы это не меняет - если бы был например gmii интерфес в 1 байт - то да; но в моем случае интерфейс 8 байт, это приведет к созданию конечного автомата на (6+12+12)/8 состояний в каждом из который здоровое дерево из if

" в каждом из который здоровое дерево из if" - это в файле... Но в железе это немного по-другому. Есть регистр автомата и к нему на входе один дешифратор. Он один для всех состояний автомата. И он определяется разрядностью автомата + разрядностью входных сигналов автомата... И вот в этом вся проблема. Другое дело, что дешифратор может оказаться не полным... Т.е. не все разряды нужны для дешифрации состояний...


--------------------
www.iosifk.narod.ru
Go to the top of the page
 
+Quote Post
Lutovid
сообщение Mar 31 2017, 11:29
Сообщение #5


Участник
*

Группа: Свой
Сообщений: 66
Регистрация: 24-02-14
Из: Москва
Пользователь №: 80 661



Цитата(iosifk @ Mar 31 2017, 14:26) *
" в каждом из который здоровое дерево из if" - это в файле... Но в железе это немного по-другому. Есть регистр автомата и к нему на входе один дешифратор. Он один для всех состояний автомата. И он определяется разрядностью автомата + разрядностью входных сигналов автомата... И вот в этом вся проблема. Другое дело, что дешифратор может оказаться не полным... Т.е. не все разряды нужны для дешифрации состояний...


Так вопрос у меня по сокращению записи... об удобстве конечного автомата я не спорю...
Go to the top of the page
 
+Quote Post
iosifk
сообщение Mar 31 2017, 11:34
Сообщение #6


Гуру
******

Группа: Модераторы
Сообщений: 3 547
Регистрация: 8-09-05
Из: спб
Пользователь №: 8 369



Цитата(Lutovid @ Mar 31 2017, 15:29) *
Так вопрос у меня по сокращению записи...

А зачем "сокращать", если эта запись будет работать?
Дело не в том, как записать, а в том, как удобно отлаживать и сопровождать. Если Вам так удобнее, то пишите так.
Если удобнее через casex, то напишите через casex.

Вот только что написал:
https://electronix.ru/forum/index.php?s=&am...t&p=1490539


--------------------
www.iosifk.narod.ru
Go to the top of the page
 
+Quote Post
Lutovid
сообщение Mar 31 2017, 11:38
Сообщение #7


Участник
*

Группа: Свой
Сообщений: 66
Регистрация: 24-02-14
Из: Москва
Пользователь №: 80 661



Цитата(iosifk @ Mar 31 2017, 14:34) *
А зачем "сокращать", если эта запись будет работать?


Затем что бы 1)код было проще отлаживать; 2)быстрее написать код;
Go to the top of the page
 
+Quote Post
RobFPGA
сообщение Mar 31 2017, 11:43
Сообщение #8


Знающий
****

Группа: Свой
Сообщений: 911
Регистрация: 23-12-04
Пользователь №: 1 643



Приветствую!
Цитата(Lutovid @ Mar 31 2017, 14:29) *
Так вопрос у меня по сокращению записи... об удобстве конечного автомата я не спорю...

Разбивайте сложную проблему на простые компоненты.

Что нужно сделать -
1) найти положение разделителей во входном векторе
Код
     function find_poz (input [63:0] xgmii_rxd_in_sh_r [1:XGMII_RX_REG_LENGTH], input [..] pattern, output [...] poz0,poz1,poz2);

2) скопировать диапазон байт между разделителями
Код
     function mux_out (input [63:0] xgmii_rxd_in_sh_r [1:XGMII_RX_REG_LENGTH],  [...] pz_begin, pz_end, output [...] out);


И ни какого леса if ... else sm.gif


Успехов! Rob.




Go to the top of the page
 
+Quote Post
iosifk
сообщение Mar 31 2017, 11:45
Сообщение #9


Гуру
******

Группа: Модераторы
Сообщений: 3 547
Регистрация: 8-09-05
Из: спб
Пользователь №: 8 369



Цитата(Lutovid @ Mar 31 2017, 15:38) *
Затем что бы 1)код было проще отлаживать; 2)быстрее написать код;

Ну так и сделайте параметры или локальные параметры вместо 88'h3030303030303030303030 и прочей... Дайте им адекватные названия, всяко легче читаться будет...
Да хоть их уберите в отдельный файл, если в этом они мешают... Вот и будет Вам "сокращение"... А все остальное - не имеет смысла... А "быстрее написать код" - вовсе неправильный метод, но об этом я уже написал...


--------------------
www.iosifk.narod.ru
Go to the top of the page
 
+Quote Post
Lutovid
сообщение Mar 31 2017, 11:50
Сообщение #10


Участник
*

Группа: Свой
Сообщений: 66
Регистрация: 24-02-14
Из: Москва
Пользователь №: 80 661



Цитата(RobFPGA @ Mar 31 2017, 14:43) *
Приветствую!

Разбивайте сложную проблему на простые компоненты.

Что нужно сделать -
1) найти положение разделителей во входном векторе
Код
     function find_poz (input [63:0] xgmii_rxd_in_sh_r [1:XGMII_RX_REG_LENGTH], input [..] pattern, output [...] poz0,poz1,poz2);

2) скопировать диапазон байт между разделителями
Код
     function mux_out (input [63:0] xgmii_rxd_in_sh_r [1:XGMII_RX_REG_LENGTH],  [...] pz_begin, pz_end, output [...] out);


И ни какого леса if ... else sm.gif


Успехов! Rob.


Отличная идея, спасибо!

Цитата(iosifk @ Mar 31 2017, 14:45) *
Ну так и сделайте параметры или локальные параметры вместо 88'h3030303030303030303030 и прочей... Дайте им адекватные названия, всяко легче читаться будет...
Да хоть их уберите в отдельный файл, если в этом они мешают... Вот и будет Вам "сокращение"... А все остальное - не имеет смысла... А "быстрее написать код" - вовсе неправильный метод, но об этом я уже написал...


for generate тоже сокращение записи - я говорил примерно об этом, мне кажется вы меня не правильно поняли, так как я, возможно, формулировал вопрос не совсем корректно, прошу прощения
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 27th July 2017 - 14:48
Рейтинг@Mail.ru


Страница сгенерированна за 0.01428 секунд с 7
ELECTRONIX ©2004-2016