des00 25 12 августа, 2010 Опубликовано 12 августа, 2010 · Жалоба Добрый день! Потребовалось мне тут использовать тип wor для удобства описания в одном проекте. Судя по хелпу, квартус его поддерживает. Накидал простой код `define SUB_FIRST `define SUB_SECOND module test (input [6:0] in, output wor out); `ifdef SUB_FIRST generate genvar i; for (i = 0; i < 7; i++) begin :gen sub_test sub_test (in[i], out); end endgenerate `elsif SUB_SECOND logic [6:0] out_tmp; generate genvar i; for (i = 0; i < 7; i++) begin :gen sub_test sub_test (in[i], out_tmp[i]); end endgenerate assign out = out_tmp[0]; assign out = out_tmp[1]; assign out = out_tmp[2]; assign out = out_tmp[3]; assign out = out_tmp[4]; assign out = out_tmp[5]; assign out = out_tmp[6]; `else assign out = in[0]; assign out = in[1]; assign out = in[2]; assign out = in[3]; assign out = in[4]; assign out = in[5]; assign out = in[6]; `endif endmodule module sub_test (input in, output out); assign out = in; endmodule Так вот в варианте SUB_FIRST при сборке выдает ошибку, ква пишет что не может соединить много драйверов на одну цепь (хотя wor и введен для множества драйверов). Тогда как, если ввести костыль, в виде дополнительного сигнала, то собирает правильно. Если я правильно понял стандарт, то wor без разницы как присваивается сигнал, через явный assign или через port map. И это глюк квартуса. Но может быть я ошибаюсь и квартус прав? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
des00 25 12 августа, 2010 Опубликовано 12 августа, 2010 · Жалоба Хакнул я это дело module test (input [6:0] in, output wire out); generate genvar i; for (i = 0; i < 7; i++) begin :gen sub_test sub_test (in[i], out); end endgenerate endmodule module sub_test (input in, output out); assign out = in ? in : 1'bz; endmodule может кому понадобится %) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Serhiy_UA 1 12 августа, 2010 Опубликовано 12 августа, 2010 · Жалоба Из Вашего предыдущего поста: assign out = in ? in : 1'bz; Каков аппаратный аналог или смысл этого действия, т.е. для чего оно нужно? Что-то не приходилось встречать такое. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
des00 25 12 августа, 2010 Опубликовано 12 августа, 2010 · Жалоба Каков аппаратный аналог или смысл этого действия, т.е. для чего оно нужно? Что-то не приходилось встречать такое. Это хак чистой воды, вполне возможно что на других платформах это не сработает. Дело вот в чем, в квартусе : 1. Соединить сигналы в port map на одни сигнал можно только к wire (см. пример выше). 2. Задрайверить wire от нескольких источников можно только с использованием софтового z состояния, которое квартус конвертирует в мультиплексор. 3. Квартус справедливо полагает, что мультиплексор, который он вытаскивает из z состояния адресно полный и в качестве адреса используются биты in. И при записи out = in ? 1'b1 : 1'bz; он дает результат out = 1'b1. Поэтому запись out = in ? in : 1'bz; заставляет квартус сгенерировать мультиплексор, на входы которого подается не постоянный уровень, а сигнал. Ну а дальше всё решается умом оптимизатора %) ЗЫ. Пример не показательный, но данный подход я использовал при разработке распределенного декодера адреса, раскиданного по куче слейвов. В мастер приходил сигнал есть ли адрес в системе или нет. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
sazh 8 12 августа, 2010 Опубликовано 12 августа, 2010 · Жалоба Поэтому запись out = in ? in : 1'bz; заставляет квартус сгенерировать мультиплексор, на входы которого подается не постоянный уровень, а сигнал. Так ведь z состояние никуда не девается. И что с ним дальше делать? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
des00 25 12 августа, 2010 Опубликовано 12 августа, 2010 · Жалоба Так ведь z состояние никуда не девается. И что с ним дальше делать? а вы загоните код в q9.0/9.1 потом раскажите куда оно девается %) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
sazh 8 12 августа, 2010 Опубликовано 12 августа, 2010 · Жалоба а вы загоните код в q9.0/9.1 потом раскажите куда оно девается %) В 9.1 промоделировал. Состояние 0 не увидел. assign out = in ? 1'b0 : 1'bz; open drain наверно рулит Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
des00 25 13 августа, 2010 Опубликовано 13 августа, 2010 · Жалоба В 9.1 промоделировал. Состояние 0 не увидел. Зато видно главное, in орится. Как уже говорил это хак для моего конкретного случая. Вот близкий аналог того, что мне надо было сделать module test (input clk, en, input [3:0] addr, input [6 : 0] data, output wire out); wire bus_hit; wire bus_data; generate genvar i; for (i = 0; i < 3; i++) begin :gen sub_test #(i) sub_test (clk, addr, data[i], bus_data, bus_hit); end endgenerate logic z_off; always_ff @(posedge clk) z_off <= en & bus_hit; assign out = z_off ? bus_data : 1'bz; endmodule module sub_test #(parameter ADDR) (input clk, input [3 : 0] addr, input data, output out, hit); logic pipa; always @(posedge clk) pipa <= (addr == ADDR); assign hit = pipa ? pipa : 1'bz; assign out = pipa ? data : 1'bz; endmodule Ква всё сделал правильно, но это не лекарство, а хак. Вопрос использования такого метода, надо рассматривать в каждом конкретном случае, для конкретного квартуса. А те кто делал в квартусе поддержку wor,wand,trior, tri0, tr1 и заявляет об этом в хелпе, кА...ы. А тестеры которые это пропустили тем более. Проверяется то всё простым тестом. Еще и мои почтовые ящики для саппорта игнорируют %( Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ViKo 1 13 августа, 2010 Опубликовано 13 августа, 2010 · Жалоба Первое, что пришло в голову, вроде, работает. И без "хака" :-) Q9.0 module Test_wor (input logic [6:0] in, output logic out); wor subnet; generate genvar i; for (i = 0; i <= 6; i++) begin : wor_gen assign subnet = in[i]; end : wor_gen endgenerate assign out = subnet; endmodule Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
sazh 8 13 августа, 2010 Опубликовано 13 августа, 2010 · Жалоба Первое, что пришло в голову, вроде, работает. И без "хака" :-) Q9.0 Это потому, что неоправданно SV рассхваливаете. На верилоге проще будет assign out = |in; Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
des00 25 14 августа, 2010 Опубликовано 14 августа, 2010 · Жалоба Это потому, что неоправданно SV рассхваливаете. На верилоге проще будет assign out = |in; причем здесь SV? вы смотрите узко, как я уже сказал это типовой пример, а не реальный код. В реальном проекте было около 25 разных слейв модулей, вставить которые через генерейт нет возможности. При вашем подходе, вам потребовалось бы из каждого модуля вывести отдельный сигнал и собрать внешний OR. И при отладке/добавлении нового модуля внимательно следить за тем, что бы имена/индексы не пересекались и регулярно пополнять внешний OR. Дальше ваши действия объяснять? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ViKo 1 14 августа, 2010 Опубликовано 14 августа, 2010 · Жалоба При вашем подходе, вам потребовалось бы из каждого модуля вывести отдельный сигнал и собрать внешний OR. И при отладке/добавлении нового модуля внимательно следить за тем, что бы имена/индексы не пересекались и регулярно пополнять внешний OR. Дальше ваши действия объяснять? Это вы кому говорите? zash? А про мой код что скажете? in, как вы говорите, or-ится.. Или он просто повторяет ваш SUB_SECOND? А как бы вы применяли ваш модуль с внутренним OR для дешифрации устройств. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
sazh 8 14 августа, 2010 Опубликовано 14 августа, 2010 · Жалоба причем здесь SV? Этот я неудачно пошутил. Вашего последующего примера мне было достаточно для понимания. Вот только вопрос. А в смысле коллективного творчества, допустимо ли такое описание (наглядность изложения и т.д.). Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ViKo 1 14 августа, 2010 Опубликовано 14 августа, 2010 · Жалоба Код assign out = |in естественно, и в SV работает. И почему бы его не использовать внутри модуля для дешифрации адреса? Или, например, так: assign sel = &addr; Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
sazh 8 14 августа, 2010 Опубликовано 14 августа, 2010 · Жалоба Код assign out = |in естественно, и в SV работает. И почему бы его не использовать внутри модуля для дешифрации адреса? Или, например, так: assign sel = &addr; Приношу свои извинения. Вы все правильно реализовали. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться