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

Добрый день! Потребовалось мне тут использовать тип 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. И это глюк квартуса. Но может быть я ошибаюсь и квартус прав?

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


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

Хакнул я это дело

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

может кому понадобится %)

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


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

Из Вашего предыдущего поста:

 

assign out = in ? in : 1'bz;

 

Каков аппаратный аналог или смысл этого действия, т.е. для чего оно нужно?

Что-то не приходилось встречать такое.

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


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

Каков аппаратный аналог или смысл этого действия, т.е. для чего оно нужно?

Что-то не приходилось встречать такое.

Это хак чистой воды, вполне возможно что на других платформах это не сработает. Дело вот в чем, в квартусе :

1. Соединить сигналы в port map на одни сигнал можно только к wire (см. пример выше).

2. Задрайверить wire от нескольких источников можно только с использованием софтового z состояния, которое квартус конвертирует в мультиплексор.

3. Квартус справедливо полагает, что мультиплексор, который он вытаскивает из z состояния адресно полный и в качестве адреса используются биты in. И при записи out = in ? 1'b1 : 1'bz; он дает результат out = 1'b1.

 

Поэтому запись out = in ? in : 1'bz; заставляет квартус сгенерировать мультиплексор, на входы которого подается не постоянный уровень, а сигнал. Ну а дальше всё решается умом оптимизатора %)

 

ЗЫ. Пример не показательный, но данный подход я использовал при разработке распределенного декодера адреса, раскиданного по куче слейвов. В мастер приходил сигнал есть ли адрес в системе или нет.

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


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

Поэтому запись out = in ? in : 1'bz; заставляет квартус сгенерировать мультиплексор, на входы которого подается не постоянный уровень, а сигнал.

 

Так ведь z состояние никуда не девается. И что с ним дальше делать?

 

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


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

Так ведь z состояние никуда не девается. И что с ним дальше делать?

а вы загоните код в q9.0/9.1 потом раскажите куда оно девается %)

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


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

а вы загоните код в q9.0/9.1 потом раскажите куда оно девается %)

 

В 9.1 промоделировал. Состояние 0 не увидел.

assign out = in ? 1'b0 : 1'bz; open drain наверно рулит

post-804-1281634263_thumb.jpg

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


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

В 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 и заявляет об этом в хелпе, кА...ы. А тестеры которые это пропустили тем более. Проверяется то всё простым тестом.

 

Еще и мои почтовые ящики для саппорта игнорируют %(

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


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

Первое, что пришло в голову, вроде, работает. И без "хака" :-) 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

post-10362-1281721145_thumb.jpg

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


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

Первое, что пришло в голову, вроде, работает. И без "хака" :-) Q9.0

 

Это потому, что неоправданно SV рассхваливаете.

На верилоге проще будет assign out = |in;

 

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


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

Это потому, что неоправданно SV рассхваливаете.

На верилоге проще будет assign out = |in;

причем здесь SV? вы смотрите узко, как я уже сказал это типовой пример, а не реальный код. В реальном проекте было около 25 разных слейв модулей, вставить которые через генерейт нет возможности. При вашем подходе, вам потребовалось бы из каждого модуля вывести отдельный сигнал и собрать внешний OR. И при отладке/добавлении нового модуля внимательно следить за тем, что бы имена/индексы не пересекались и регулярно пополнять внешний OR. Дальше ваши действия объяснять?

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


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

При вашем подходе, вам потребовалось бы из каждого модуля вывести отдельный сигнал и собрать внешний OR. И при отладке/добавлении нового модуля внимательно следить за тем, что бы имена/индексы не пересекались и регулярно пополнять внешний OR. Дальше ваши действия объяснять?

Это вы кому говорите? zash? А про мой код что скажете? in, как вы говорите, or-ится.. Или он просто повторяет ваш SUB_SECOND?

А как бы вы применяли ваш модуль с внутренним OR для дешифрации устройств.

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


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

причем здесь SV?

 

Этот я неудачно пошутил. Вашего последующего примера мне было достаточно для понимания.

Вот только вопрос.

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

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


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

Код assign out = |in естественно, и в SV работает.

И почему бы его не использовать внутри модуля для дешифрации адреса? Или, например, так: assign sel = &addr;

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


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

Код assign out = |in естественно, и в SV работает.

И почему бы его не использовать внутри модуля для дешифрации адреса? Или, например, так: assign sel = &addr;

 

Приношу свои извинения. Вы все правильно реализовали.

 

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


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

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

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

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

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

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

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

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

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

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