GAYVER 2 13 октября, 2015 Опубликовано 13 октября, 2015 · Жалоба Всеравно ничерта не понимаю :(. Плохо когда не знаешь синтаксиса языка и его тонкостей, а напарываешься сразу на не тривиальную задачу... Тут у автора во вводной имеется ограничение на длину 1 порта - в байт. И как я понял - мы сначала резервируем максимально возможное количество бит на входную шину, а потом уже строим карту портов, "центруя" реальное значение каждого порта относительно максимально возможного его размера. А если у нас изначально нет ограничения на максимум? У нас это еще 1 неизвестная - на топ-лвл надо сшить в одну шину N портов с M разрядностью Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Golikov 0 13 октября, 2015 Опубликовано 13 октября, 2015 · Жалоба ну так N*M то у нас есть:) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
GAYVER 2 13 октября, 2015 Опубликовано 13 октября, 2015 · Жалоба ну так N*M то у нас есть:) Действительно, чего это я... Массив М-ов то у меня будет задан как входной параметр, и общее количество портов будет задано. вот тебе граница цикла и аргументы на сумму накаждой итеррации :). Только как получается что при описании модуля не указана размерность порта ДАТАИН, а позже он описан как инпут с указанием размерности. Верилог позволяет так делать? на ВХДЛе мне это пришлось в пэкдж выносить - чтобы уже на стадии описания интерфейса модуля по входным параметрам мог задать ограничение на ширину шины... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Golikov 0 13 октября, 2015 Опубликовано 13 октября, 2015 · Жалоба да можно в начале просто имена написать, а потом написать размерность и направление. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
GAYVER 2 13 октября, 2015 Опубликовано 13 октября, 2015 · Жалоба да можно в начале просто имена написать, а потом написать размерность и направление. верилог мне нарвится все больше и больше :) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Golikov 0 13 октября, 2015 Опубликовано 13 октября, 2015 · Жалоба это вы еще умножать и фильтры писать не пробовали:) велком как говорится:) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
GAYVER 2 13 октября, 2015 Опубликовано 13 октября, 2015 · Жалоба это вы еще умножать и фильтры писать не пробовали:) велком как говорится:) не, чем ближе код к реальному железу - тем лучше :). в смысле чем меньше в реализации дается на откуп синтезатору - тем лучше. в этом плане, мне кажется, ВХДЛ более выгоден. а вот интерфейсные обертки для универсальных параметризируемых модулей, похоже, удобней делать на верилоге :). я, собственно, этим сейчас и занимаюсь - свой модуль красиво оборачиваю. хотя и на вхдл-е это уже сделал, но что-то мне в моем решении не нравится :) я правильно понимаю эту запись: parameter port_sizes = {8'd6, 8'd1, 8'd8, 8'd4, 8'd2, 8'd3, 8'd2, 8'd1} это массив из 8 значений, заданных в десятичном виде и под хранение каждого в двоичном виде выделено 8 бит? если да, то для чего это сделано? почему не задан просто массив интежеров? под их хранение по умолчанию 32 разряда идет. для сохранения ресурсов? и получается что потом в функции мапа мы к интежеровскому тмп плюсуем битвектор из порт_сайза? опять же - верилог позволяет делать такое без явного приведения типов :)? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
des00 25 13 октября, 2015 Опубликовано 13 октября, 2015 · Жалоба я правильно понимаю эту запись: parameter port_sizes = {8'd6, 8'd1, 8'd8, 8'd4, 8'd2, 8'd3, 8'd2, 8'd1} Нет неправильно. Это 64х битный вектор, записанный через конкатенацию векторов разрядностью 1 байт. Разбираемый внутри модуля по байтно. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
GAYVER 2 13 октября, 2015 Опубликовано 13 октября, 2015 · Жалоба Нет неправильно. Это 64х битный вектор, записанный через конкатенацию векторов разрядностью 1 байт. Разбираемый внутри модуля по байтно. я почти это и имел ввиду - что в итоге это битовый вектор из 8-и байтных "подвекторов", значения которых задаются в десятичке. непонятно чем аргументирована именно байтность каждого значения. по хорошему чтобы автоматизировать процесс, надо было вычислить максимально широкую входную подшину, сколько бит надо на кодирование, и уже эту переменную брать в качестве максимальной ширины "подвекторов", вместо байта :). или я оптяь не так все понял? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Golikov 0 13 октября, 2015 Опубликовано 13 октября, 2015 · Жалоба сдается мне что так автор задает деление на порты, так просто легче записывать урками... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
RobFPGA 34 13 октября, 2015 Опубликовано 13 октября, 2015 · Жалоба Приветствую! А вот и мой велосипед. С одним колесом! (параметром) :) Тоже когда-то давно страдал на эту же тему чтобы даже злобный 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. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ilkz 0 13 октября, 2015 Опубликовано 13 октября, 2015 · Жалоба сдается мне что так автор задает деление на порты, так просто легче записывать урками... Ну тут три мысли зарыто: 1. Размерность размера в 8 бит позволяет задать для порта ширину до 255 бит. Вряд ли в реальной жизни потребуется больше. 2.Синтезатор (ква) не умеет делать конкатенацию без явного указания разрядности ее элементов, что правильно. Попробуйте - и получите еррор. 3. Уже не раз напарывался на забавные "сюрпрайзы", когда в коде пишешь число без указания разрядности, например в каком-нибудь суммировании или умножении, а синтезатор его подрезает как ему удобно, но не так как надо мне, из-за чего рушится логика работы. Не один день можно убить на отладку. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
GAYVER 2 14 октября, 2015 Опубликовано 14 октября, 2015 · Жалоба Ну тут три мысли зарыто: 1. Размерность размера в 8 бит позволяет задать для порта ширину до 255 бит. Вряд ли в реальной жизни потребуется больше. 2.Синтезатор (ква) не умеет делать конкатенацию без явного указания разрядности ее элементов, что правильно. Попробуйте - и получите еррор. 3. Уже не раз напарывался на забавные "сюрпрайзы", когда в коде пишешь число без указания разрядности, например в каком-нибудь суммировании или умножении, а синтезатор его подрезает как ему удобно, но не так как надо мне, из-за чего рушится логика работы. Не один день можно убить на отладку. о чем я и гвоорил чуть выше - верилог "програмистский" язык, для железа - зло :). язык позволяет не указывать размерность, а синтезатор творит что хочет... ваши замечания, кстати, весьма полезны для формирования у новичка общих принципов кодирования на новом языке :) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
GAYVER 2 14 октября, 2015 Опубликовано 14 октября, 2015 · Жалоба Приветствую! А вот и мой велосипед. С одним колесом! (параметром) :) Тоже когда-то давно страдал на эту же тему чтобы даже злобный ISE синтезировал. элегантная реализация. только чуть-чуть допилю под свои реалии :) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
des00 25 14 октября, 2015 Опубликовано 14 октября, 2015 · Жалоба 3. Уже не раз напарывался на забавные "сюрпрайзы", когда в коде пишешь число без указания разрядности, например в каком-нибудь суммировании или умножении, а синтезатор его подрезает как ему удобно, но не так как надо мне, из-за чего рушится логика работы. Не один день можно убить на отладку. При всем уважении. RTFM. Там этому делу посвящается целых 2 страницы. За 14 лет работы никаких сюрпризов, все по стандарту. Что я делаю не так? о чем я и гвоорил чуть выше - верилог "програмистский" язык, для железа - зло :). язык позволяет не указывать размерность, а синтезатор творит что хочет... ваши замечания, кстати, весьма полезны для формирования у новичка общих принципов кодирования на новом языке :) перед тем как делать на столько "далеко идущие" выводы, нужно как минимум прочитать стандарт. а замечания ilkz полезны только для того, что бы подчеркнуть тот факт что читать библию (стандарт) нужно в оригинале. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться