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

Пара вопросов по верилогу

Здравствуйте!

 

Первый вопрос:

Ну вот, например, есть тестбенч, в котором много очень длинных одинаковых иерархических путей (кусочек кода):

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. Его пока не знаю ))

Изменено пользователем des00
использование нецензурных выражений (с) модератор

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


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

Первый вопрос:

 

Возможно подобное в вериложике?

алиасов в верилоге нет, для вашего примера вывода данных, воспользуйтесь функциями %)

 

Второй вопрос:

...

То есть, если я использую 3 канала вместо 8-ми, то хотелось бы, чтобы на этапе компиляции делалось так:

..

Возможно такое? Может быть как-то пошаманить с толстой шиной, на которую будут мапиться каналы (а ширина шины будет как-то соответственно меняться)?

шина фиксированного максимального размера, выпадающие части которой зануляются + коррекция логики управления, тогда синтезаторы оптимизируют неплохо по ресурсу.

 

 

 

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


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

Возможно подобное в вериложике?

Можно использовать 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.

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


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

Здравствуйте!

 

Первый вопрос:

...........

Так вот, хотелось бы написать какой-нибудь алиас, чтобы потом не копипастить этот ужас из множества одинаковых путей и имен:

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

 

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


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

да вроде само напрашивается сделать так

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

 

Это как минимум не логично - разбрасывать отладку по файлам дизайна.

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


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

Это как минимум не логично - разбрасывать отладку по файлам дизайна.

поменяется иерархия(имена хотябы), модуль будет использован в другом проекте, смешанный проект(верилог+вхдл) и др и пр.

я бы себе такую свинью не стал подкладывать, но вообщем не настаиваю. дело ваше.

а по мне так вполне разумно печать диагностическую инфу в консоль из самих модулей.

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


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

поменяется иерархия(имена хотябы), модуль будет использован в другом проекте, смешанный проект(верилог+вхдл) и др и пр.

И что? А если в другом проекте не надо выводить эту информацию? Рыскать по всем файлам и искать что закоментировать?

я бы себе такую свинью не стал подкладывать, но вообщем не настаиваю. дело ваше.

а по мне так вполне разумно печать диагностическую инфу в консоль из самих модулей.

Особенно когда используешь чужие. Это точно не разумно.

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


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

И что? А если в другом проекте не надо выводить эту информацию? Рыскать по всем файлам и искать что закоментировать?

макросы использовать, регистр разрешения управляемый по иерархии и т.д.

 

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


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

макросы использовать, регистр разрешения управляемый по иерархии и т.д.

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

 

Использование define - оптимальный вариант. Как минимум для меня.

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


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

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

 

Использование define - оптимальный вариант. Как минимум для меня.

те же яйца только в профиль, вместо кучи разрешений, куча макросов %)

 

а вообще в SV лучше указатели на диагностический базовый класс хранить, потом массив указателей и в путь.

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


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

те же яйца только в профиль, вместо кучи разрешений, куча макросов %)

нет, не те же.

Во-первых, сам код чистый.

Во-вторых, не надо никакие дополнительные сигналы/параметры через 10 иерархий передавать.

В третьих, что если для двух instances одного и того же модуля я хочу вывести информацию поразному? А если их 5?

Например, у меня есть 2 инстанса, в которых (как у вас) есть подряд 2 $display. Это означает, что каждый инстанс выведет 2 строчки подряд. А если я хочу сначала первую строчку для всех инстансов, а потом вторую? Как это реализовать без извращений внутри модуля?

а вообще в SV лучше указатели на диагностический базовый класс хранить, потом массив указателей и в путь.

Это с RTL? Можно побольше информации?

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


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

И что? А если в другом проекте не надо выводить эту информацию? Рыскать по всем файлам и искать что закоментировать?

 

Особенно когда используешь чужие. Это точно не разумно.

1)выводим всё в лог. все сообщения

2) после того как запустили тестбенч, идём спать/домой/пить пиво(кому как нраивтся)

3) если тест закончился то пункт 4 иначе п3.

4) берём лог файл. фильтруем что надо

5)анализируем

6)прочее.

 

 

 

нет, не те же.

Во-первых, сам код чистый.

Во-вторых, не надо никакие дополнительные сигналы/параметры через 10 иерархий передавать.

В третьих, что если для двух instances одного и того же модуля я хочу вывести информацию поразному? А если их 5?

Например, у меня есть 2 инстанса, в которых (как у вас) есть подряд 2 $display. Это означает, что каждый инстанс выведет 2 строчки подряд. А если я хочу сначала первую строчку для всех инстансов, а потом вторую? Как это реализовать без извращений внутри модуля?

 

Это с RTL? Можно побольше информации?

что такое чистый код?

- ---что если для двух instances одного и того же модуля я хочу вывести информацию поразному? А если их 5?

где тут логика и разумность? :rolleyes:

про вывод инфы невероятно не понятная хотелка...решается фильрованием лога

 

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

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


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

1)выводим всё в лог. все сообщения

2) после того как запустили тестбенч, идём спать/домой/пить пиво(кому как нраивтся)

3) если тест закончился то пунет 4 иначе п3.

4) берём лог файл. фильтруем что надо

5)анализируем

6)прочее.

 

 

 

 

что такое чистый код?

- ---что если для двух instances одного и того же модуля я хочу вывести информацию поразному? А если их 5?

где тут логика и разумность? :rolleyes:

про вывод инфы невероятно не понятная хоетлка...решается фильрованием лога

 

Ну, фильтруйте. А я хочу видеть сразу в удобочитаемом виде.

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


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

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

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

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

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

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

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

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

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

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