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

Грамотное описание парсинга

Всем привет!

Столкнулся с такой задачей:

есть массив регистров 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:

 

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

 

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

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

Заранее спасибо

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


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

Столкнулся с такой задачей:

есть массив регистров 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" речь идет о принятых пакетах данных. А это означает, что подход "сначала принимаем, а потом обрабатываем" - не правильный.

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

 

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

 

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


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

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

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

 

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

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


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

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

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

 

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


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

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

 

Так вопрос у меня по сокращению записи... об удобстве конечного автомата я не спорю...

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


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

Так вопрос у меня по сокращению записи...

А зачем "сокращать", если эта запись будет работать?

Дело не в том, как записать, а в том, как удобно отлаживать и сопровождать. Если Вам так удобнее, то пишите так.

Если удобнее через casex, то напишите через casex.

 

Вот только что написал:

https://electronix.ru/forum/index.php?s=&am...t&p=1490539

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


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

А зачем "сокращать", если эта запись будет работать?

 

Затем что бы 1)код было проще отлаживать; 2)быстрее написать код;

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


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

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

Так вопрос у меня по сокращению записи... об удобстве конечного автомата я не спорю...

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

 

Что нужно сделать -

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 :)

 

 

Успехов! Rob.

 

 

 

 

 

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


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

Затем что бы 1)код было проще отлаживать; 2)быстрее написать код;

Ну так и сделайте параметры или локальные параметры вместо 88'h3030303030303030303030 и прочей... Дайте им адекватные названия, всяко легче читаться будет...

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

 

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


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

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

 

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

 

Что нужно сделать -

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 :)

 

 

Успехов! Rob.

 

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

 

Ну так и сделайте параметры или локальные параметры вместо 88'h3030303030303030303030 и прочей... Дайте им адекватные названия, всяко легче читаться будет...

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

 

for generate тоже сокращение записи - я говорил примерно об этом, мне кажется вы меня не правильно поняли, так как я, возможно, формулировал вопрос не совсем корректно, прошу прощения

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


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

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

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

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

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

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

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

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

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

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