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

Модуль с произвольным числом портов произвольной ширины на верилоге

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

 

Тут у автора во вводной имеется ограничение на длину 1 порта - в байт. И как я понял - мы сначала резервируем максимально возможное количество бит на входную шину, а потом уже строим карту портов, "центруя" реальное значение каждого порта относительно максимально возможного его размера. А если у нас изначально нет ограничения на максимум? У нас это еще 1 неизвестная - на топ-лвл надо сшить в одну шину N портов с M разрядностью

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


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

ну так N*M то у нас есть:)

 

Действительно, чего это я... Массив М-ов то у меня будет задан как входной параметр, и общее количество портов будет задано. вот тебе граница цикла и аргументы на сумму накаждой итеррации :).

 

 

Только как получается что при описании модуля не указана размерность порта ДАТАИН, а позже он описан как инпут с указанием размерности. Верилог позволяет так делать? на ВХДЛе мне это пришлось в пэкдж выносить - чтобы уже на стадии описания интерфейса модуля по входным параметрам мог задать ограничение на ширину шины...

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


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

да можно в начале просто имена написать, а потом написать размерность и направление.

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


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

да можно в начале просто имена написать, а потом написать размерность и направление.

 

верилог мне нарвится все больше и больше :)

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


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

это вы еще умножать и фильтры писать не пробовали:) велком как говорится:)

 

не, чем ближе код к реальному железу - тем лучше :). в смысле чем меньше в реализации дается на откуп синтезатору - тем лучше. в этом плане, мне кажется, ВХДЛ более выгоден. а вот интерфейсные обертки для универсальных параметризируемых модулей, похоже, удобней делать на верилоге :). я, собственно, этим сейчас и занимаюсь - свой модуль красиво оборачиваю. хотя и на вхдл-е это уже сделал, но что-то мне в моем решении не нравится :)

 

я правильно понимаю эту запись:

parameter port_sizes = {8'd6, 8'd1, 8'd8, 8'd4, 8'd2, 8'd3, 8'd2, 8'd1}

 

это массив из 8 значений, заданных в десятичном виде и под хранение каждого в двоичном виде выделено 8 бит? если да, то для чего это сделано? почему не задан просто массив интежеров? под их хранение по умолчанию 32 разряда идет. для сохранения ресурсов? и получается что потом в функции мапа мы к интежеровскому тмп плюсуем битвектор из порт_сайза? опять же - верилог позволяет делать такое без явного приведения типов :)?

 

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


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

я правильно понимаю эту запись:

parameter port_sizes = {8'd6, 8'd1, 8'd8, 8'd4, 8'd2, 8'd3, 8'd2, 8'd1}

Нет неправильно. Это 64х битный вектор, записанный через конкатенацию векторов разрядностью 1 байт. Разбираемый внутри модуля по байтно.

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


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

Нет неправильно. Это 64х битный вектор, записанный через конкатенацию векторов разрядностью 1 байт. Разбираемый внутри модуля по байтно.

я почти это и имел ввиду - что в итоге это битовый вектор из 8-и байтных "подвекторов", значения которых задаются в десятичке. непонятно чем аргументирована именно байтность каждого значения. по хорошему чтобы автоматизировать процесс, надо было вычислить максимально широкую входную подшину, сколько бит надо на кодирование, и уже эту переменную брать в качестве максимальной ширины "подвекторов", вместо байта :). или я оптяь не так все понял?

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


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

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

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


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

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

 

А вот и мой велосипед. С одним колесом! (параметром) :)

Тоже когда-то давно страдал на эту же тему чтобы даже злобный ISE синтезировал.

 

`define BW 8

module var_port #(
    parameter  WH_IN  ={`BW'd5,`BW'd7,`BW'd2,`BW'd3}
) (
    port_in,
    port_ou
);

localparam TEMP_WH={`BW'd0, WH_IN};

//width of port N
function  integer get_port_widh(input integer num);
    get_port_widh=TEMP_WH[num * `BW +: `BW];
endfunction

//LSB positions of input port N
function  integer get_port_lsb(input integer num);
integer ii;
    for (ii=0, get_port_lsb=0; ii<num; ii=ii+1) begin
        get_port_lsb=get_port_lsb+get_port_widh(ii);
    end
endfunction

//total ports in input vector
function  integer total_ports(input dummy);
    for (total_ports=0; get_port_widh(total_ports)>0; total_ports=total_ports+1)
        total_ports=total_ports;
endfunction

//total width of input vector
function  integer total_width (input dummy);
integer ii;
    for (ii=0, total_width=0; get_port_widh(ii)>0; ii=ii+1) begin
        total_width=total_width+get_port_widh(ii);
    end
endfunction

//maximum width of input port
function integer max_width(input dummy);
integer ii;
    for (ii=0, max_width=0; get_port_widh(ii)>0; ii=ii+1) begin
        if (get_port_widh(ii) > max_width)
            max_width=get_port_widh(ii);
    end
endfunction


localparam PORT_NUM      =total_ports(0);
localparam TOTAL_WIDTH   =total_width(0);
localparam MAX_PORT_WIDTH=max_width(0);

//vector of input ports {{port PORT_NUM-1},...,{port 1},{port 0}};
input   [TOTAL_WIDTH-1:0] port_in  ;
output  [TOTAL_WIDTH-1:0] port_ou  ;


function  [MAX_PORT_WIDTH-1:0] get_port_mask(input integer num);
    get_port_mask= ~({MAX_PORT_WIDTH{1'b1}}<<get_port_widh(num));
endfunction

function  [MAX_PORT_WIDTH-1:0] get_port_bit(input integer num);
    get_port_bit= (port_in>>get_port_lsb(num)) & get_port_mask(num);
endfunction

genvar gi;
generate
    for (gi = 0; gi < PORT_NUM; gi=gi+1) begin : g_port
        localparam PORT_WH =get_port_widh(gi);
        localparam PORT_LSB=get_port_lsb(gi);
        localparam PORT_MSB=PORT_LSB+PORT_WH-1;

        wire [PORT_WH-1:0] w_port_i;
        wire [PORT_WH-1:0] w_port_o;


        assign w_port_o = gi+1;
        assign w_port_i = get_port_bit(gi); //or w_port_i[PORT_MSB:PORT_LSB]

        assign port_ou[PORT_MSB:PORT_LSB]=w_port_i + w_port_o;
    end
endgenerate

endmodule

 

Успехов! Rob.

 

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


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

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

 

Ну тут три мысли зарыто:

1. Размерность размера в 8 бит позволяет задать для порта ширину до 255 бит. Вряд ли в реальной жизни потребуется больше.

2.Синтезатор (ква) не умеет делать конкатенацию без явного указания разрядности ее элементов, что правильно. Попробуйте - и получите еррор.

3. Уже не раз напарывался на забавные "сюрпрайзы", когда в коде пишешь число без указания разрядности, например в каком-нибудь суммировании или умножении, а синтезатор его подрезает как ему удобно, но не так как надо мне, из-за чего рушится логика работы. Не один день можно убить на отладку.

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


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

Ну тут три мысли зарыто:

1. Размерность размера в 8 бит позволяет задать для порта ширину до 255 бит. Вряд ли в реальной жизни потребуется больше.

2.Синтезатор (ква) не умеет делать конкатенацию без явного указания разрядности ее элементов, что правильно. Попробуйте - и получите еррор.

3. Уже не раз напарывался на забавные "сюрпрайзы", когда в коде пишешь число без указания разрядности, например в каком-нибудь суммировании или умножении, а синтезатор его подрезает как ему удобно, но не так как надо мне, из-за чего рушится логика работы. Не один день можно убить на отладку.

 

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

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


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

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

 

А вот и мой велосипед. С одним колесом! (параметром) :)

Тоже когда-то давно страдал на эту же тему чтобы даже злобный ISE синтезировал.

 

элегантная реализация. только чуть-чуть допилю под свои реалии :)

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


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

3. Уже не раз напарывался на забавные "сюрпрайзы", когда в коде пишешь число без указания разрядности, например в каком-нибудь суммировании или умножении, а синтезатор его подрезает как ему удобно, но не так как надо мне, из-за чего рушится логика работы. Не один день можно убить на отладку.

При всем уважении. RTFM. Там этому делу посвящается целых 2 страницы. За 14 лет работы никаких сюрпризов, все по стандарту. Что я делаю не так?

 

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

перед тем как делать на столько "далеко идущие" выводы, нужно как минимум прочитать стандарт. а замечания ilkz полезны только для того, что бы подчеркнуть тот факт что читать библию (стандарт) нужно в оригинале.

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


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

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

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

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

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

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

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

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

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

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