ilkz 0 13 сентября, 2011 Опубликовано 13 сентября, 2011 (изменено) · Жалоба Здравствуйте! Первый вопрос: Ну вот, например, есть тестбенч, в котором много очень длинных одинаковых иерархических путей (кусочек кода): if(dut.controller.generated_channel[n].Channel.data_fifo.wrreq) $display("%10t [EVENT] [%0d] received packet# %0d (A=%0h, B=%0h, C=%0d)", $time, n, dut.controller.generated_channel[n].Channel.data_fifo.data[32 +: 8], dut.controller.generated_channel[n].Channel.data_fifo.data[0 +: 16], dut.controller.generated_channel[n].Channel.data_fifo.data[16 +: 16], dut.controller.generated_channel[n].Channel.data_fifo.data[40 +: 20] ); Так вот, хотелось бы написать какой-нибудь алиас, чтобы потом не копипастить этот ужас из множества одинаковых путей и имен: alias fifo = dut.controller.generated_channel[n].Channel.data_fifo; if(fifo.wrreq) $display("%10t [EVENT] [%0d] received packet# %0d (A=%0h, B=%0h, C=%0d)", $time, n, fifo.data[32 +: 8], fifo.data[0 +: 16], fifo.data[16 +: 16], fifo.data[40 +: 20] ); Возможно подобное в вериложике? Второй вопрос: Есть имплементация модуля мультиплексора каналов: ChannelMux ChannelMux ( .clk (ip_clk), .reset (reset), .can_read_channel (can_read_channel_fifo), .ch0 (channel_out[0]), .ch1 (channel_out[1]), .ch2 (channel_out[2]), .ch3 (channel_out[3]), .ch4 (channel_out[4]), .ch5 (channel_out[5]), .ch6 (channel_out[6]), .ch7 (channel_out[7]), .ch_rdreq (ch_rdreq), .rd_fifo ({rd_rcv_fifo_request,rd_rcv_fifo_request_reg}==2'b10), .can_read (can_read_common_fifo), .out (nios_pkt), .fifo_usedw (fifo_usedw), .fifo_wrfull (fifo_full), .fifo_wrempty (fifo_empty) ); Выше этого модуля используется большой generate-блок, которым я генерю необходимое мне количество инстансов каналов. Хотелось бы сделать как-нибудь так, чтобы количество входов мультиплексора ChannelMux.chN соответствовало количеству используемых канальных модулей. То есть, если я использую 3 канала вместо 8-ми, то хотелось бы, чтобы на этапе компиляции делалось так: ChannelMux ChannelMux ( .clk (ip_clk), .reset (reset), .can_read_channel (can_read_channel_fifo), .ch0 (channel_out[0]), .ch1 (channel_out[1]), .ch2 (channel_out[2]), .ch_rdreq (ch_rdreq), .rd_fifo ({rd_rcv_fifo_request,rd_rcv_fifo_request_reg}==2'b10), .can_read (can_read_common_fifo), .out (nios_pkt), .fifo_usedw (fifo_usedw), .fifo_wrfull (fifo_full), .fifo_wrempty (fifo_empty) ); Возможно такое? Может быть как-то пошаманить с толстой шиной, на которую будут мапиться каналы (а ширина шины будет как-то соответственно меняться)? Спасибо! П.С.: не System-Verilog. Его пока не знаю )) Изменено 13 сентября, 2011 пользователем des00 использование нецензурных выражений (с) модератор Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
des00 25 14 сентября, 2011 Опубликовано 14 сентября, 2011 · Жалоба Первый вопрос: Возможно подобное в вериложике? алиасов в верилоге нет, для вашего примера вывода данных, воспользуйтесь функциями %) Второй вопрос: ... То есть, если я использую 3 канала вместо 8-ми, то хотелось бы, чтобы на этапе компиляции делалось так: .. Возможно такое? Может быть как-то пошаманить с толстой шиной, на которую будут мапиться каналы (а ширина шины будет как-то соответственно меняться)? шина фиксированного максимального размера, выпадающие части которой зануляются + коррекция логики управления, тогда синтезаторы оптимизируют неплохо по ресурсу. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
masics 0 14 сентября, 2011 Опубликовано 14 сентября, 2011 · Жалоба Возможно подобное в вериложике? Можно использовать define `define fifo dut.controller.generated_channel[n].Channel.data_fifo if(`fifo .wrreq) $display("%10t [EVENT] [%0d] received packet# %0d (A=%0h, B=%0h, C=%0d)", $time, n, `fifo .data[32 +: 8], `fifo .data[0 +: 16], `fifo .data[16 +: 16], `fifo .data[40 +: 20] ); Возможно такое? Может быть как-то пошаманить с толстой шиной, на которую будут мапиться каналы (а ширина шины будет как-то соответственно меняться)? Параметр + разделение длинного вектора + объединение в верхней иерархии с помощью for. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Postoroniy_V 0 15 сентября, 2011 Опубликовано 15 сентября, 2011 · Жалоба Здравствуйте! Первый вопрос: ........... Так вот, хотелось бы написать какой-нибудь алиас, чтобы потом не копипастить этот ужас из множества одинаковых путей и имен: alias fifo = dut.controller.generated_channel[n].Channel.data_fifo; Возможно подобное в вериложике? да вроде само напрашивается сделать так module channel( ...... ); ..... // synthesis translate_off initial forever begin @( posedge wrreq); $display("[From %m]%10t [EVENT] received packet# %0d (A=%0h, B=%0h, C=%0d)", $time, data[32 +: 8], data[0 +: 16], data[16 +: 16], data[40 +: 20]); //%m - hierarchy name end // synthesis translate_on endmodule Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
masics 0 15 сентября, 2011 Опубликовано 15 сентября, 2011 · Жалоба да вроде само напрашивается сделать так module channel( ...... ); ..... // synthesis translate_off initial forever begin @( posedge wrreq); $display("[From %m]%10t [EVENT] received packet# %0d (A=%0h, B=%0h, C=%0d)", $time, data[32 +: 8], data[0 +: 16], data[16 +: 16], data[40 +: 20]); //%m - hierarchy name end // synthesis translate_on endmodule Это как минимум не логично - разбрасывать отладку по файлам дизайна. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Postoroniy_V 0 15 сентября, 2011 Опубликовано 15 сентября, 2011 · Жалоба Это как минимум не логично - разбрасывать отладку по файлам дизайна. поменяется иерархия(имена хотябы), модуль будет использован в другом проекте, смешанный проект(верилог+вхдл) и др и пр. я бы себе такую свинью не стал подкладывать, но вообщем не настаиваю. дело ваше. а по мне так вполне разумно печать диагностическую инфу в консоль из самих модулей. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
masics 0 15 сентября, 2011 Опубликовано 15 сентября, 2011 · Жалоба поменяется иерархия(имена хотябы), модуль будет использован в другом проекте, смешанный проект(верилог+вхдл) и др и пр. И что? А если в другом проекте не надо выводить эту информацию? Рыскать по всем файлам и искать что закоментировать? я бы себе такую свинью не стал подкладывать, но вообщем не настаиваю. дело ваше. а по мне так вполне разумно печать диагностическую инфу в консоль из самих модулей. Особенно когда используешь чужие. Это точно не разумно. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
des00 25 15 сентября, 2011 Опубликовано 15 сентября, 2011 · Жалоба И что? А если в другом проекте не надо выводить эту информацию? Рыскать по всем файлам и искать что закоментировать? макросы использовать, регистр разрешения управляемый по иерархии и т.д. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
masics 0 15 сентября, 2011 Опубликовано 15 сентября, 2011 · Жалоба макросы использовать, регистр разрешения управляемый по иерархии и т.д. Ага, и куча "регистров разрешений" на каждый модуль, потому что далеко не всегда хочется выводить всю инфу. Использование define - оптимальный вариант. Как минимум для меня. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
des00 25 15 сентября, 2011 Опубликовано 15 сентября, 2011 · Жалоба Ага, и куча "регистров разрешений" на каждый модуль, потому что далеко не всегда хочется выводить всю инфу. Использование define - оптимальный вариант. Как минимум для меня. те же яйца только в профиль, вместо кучи разрешений, куча макросов %) а вообще в SV лучше указатели на диагностический базовый класс хранить, потом массив указателей и в путь. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
masics 0 15 сентября, 2011 Опубликовано 15 сентября, 2011 · Жалоба те же яйца только в профиль, вместо кучи разрешений, куча макросов %) нет, не те же. Во-первых, сам код чистый. Во-вторых, не надо никакие дополнительные сигналы/параметры через 10 иерархий передавать. В третьих, что если для двух instances одного и того же модуля я хочу вывести информацию поразному? А если их 5? Например, у меня есть 2 инстанса, в которых (как у вас) есть подряд 2 $display. Это означает, что каждый инстанс выведет 2 строчки подряд. А если я хочу сначала первую строчку для всех инстансов, а потом вторую? Как это реализовать без извращений внутри модуля? а вообще в SV лучше указатели на диагностический базовый класс хранить, потом массив указателей и в путь. Это с RTL? Можно побольше информации? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Postoroniy_V 0 15 сентября, 2011 Опубликовано 15 сентября, 2011 · Жалоба И что? А если в другом проекте не надо выводить эту информацию? Рыскать по всем файлам и искать что закоментировать? Особенно когда используешь чужие. Это точно не разумно. 1)выводим всё в лог. все сообщения 2) после того как запустили тестбенч, идём спать/домой/пить пиво(кому как нраивтся) 3) если тест закончился то пункт 4 иначе п3. 4) берём лог файл. фильтруем что надо 5)анализируем 6)прочее. нет, не те же. Во-первых, сам код чистый. Во-вторых, не надо никакие дополнительные сигналы/параметры через 10 иерархий передавать. В третьих, что если для двух instances одного и того же модуля я хочу вывести информацию поразному? А если их 5? Например, у меня есть 2 инстанса, в которых (как у вас) есть подряд 2 $display. Это означает, что каждый инстанс выведет 2 строчки подряд. А если я хочу сначала первую строчку для всех инстансов, а потом вторую? Как это реализовать без извращений внутри модуля? Это с RTL? Можно побольше информации? что такое чистый код? - ---что если для двух instances одного и того же модуля я хочу вывести информацию поразному? А если их 5? где тут логика и разумность? :rolleyes: про вывод инфы невероятно не понятная хотелка...решается фильрованием лога з.ы не принимайте так близко к сердцу, но не вам решать что разумно а что нет %) я лишь показал как можно сделат по другому. отличному от вашего метода Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
masics 0 15 сентября, 2011 Опубликовано 15 сентября, 2011 · Жалоба 1)выводим всё в лог. все сообщения 2) после того как запустили тестбенч, идём спать/домой/пить пиво(кому как нраивтся) 3) если тест закончился то пунет 4 иначе п3. 4) берём лог файл. фильтруем что надо 5)анализируем 6)прочее. что такое чистый код? - ---что если для двух instances одного и того же модуля я хочу вывести информацию поразному? А если их 5? где тут логика и разумность? :rolleyes: про вывод инфы невероятно не понятная хоетлка...решается фильрованием лога Ну, фильтруйте. А я хочу видеть сразу в удобочитаемом виде. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться