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

Quartus II 9.1sp1 и case.

module test(
  input   clk_i,
  input   rst_i,
  
  input   sel_i,
  input   data1_i,
  input   data2_i,

  output reg  data_o
);


always_ff @(posedge clk_i, posedge rst_i)
  begin
    case(sel_i)
      1: data_o <= data1_i;
      0: data_o <= data2_i;
    endcase  
  end



endmodule

 

 

 

 

 

Даже варнинга нет.

 

А если case убрать - то ошибку выдает, как и положено.

 

 

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


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

Проблема не в case, а в always_ff, чувствительном к двум фронтам одинаково.

Вот так-то работает :)

always_ff @(posedge clk_i)

 

Цитата из IEEE Std 1800-2009 раздел 9.2.2.4

The always_ff procedure imposes the restriction that it contains one and only one event control and no

blocking timing controls.

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


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

Даже варнинга нет.

А если case убрать - то ошибку выдает, как и положено.

это не бага, это фича, если память не изменяет сие было еще в 6ой версии

 

 

Проблема не в case, а в always_ff, чувствительном к двум фронтам одинаково.

фраза в стандарте относилась к другому, в примере des333 все законно

 

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


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

фраза в стандарте относилась к другому, в примере des333 все законно

Можете пояснить?

 

upd. Сам проверил. Действительно, для кода

  always_ff @(posedge clk_i, posedge rst_i) begin
    data_o <= data1_i;
  end

варнинг выдается (не ошибка), а для case нет.

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


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

Можете пояснить?

фраза

The always_ff procedure imposes the restriction that it contains one and only one event control and no blocking timing controls.

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

always @(posedge clk) begin 
    @(posedge pipa);
    popa = #4ns popa_logic;
    bla-bla-bla;
end

SV запрещает подобное, т.к. always_ff это способ описания регистровой логики, введенный в том числе для облегчения жизни всяким линтерам.

 

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


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

upd. Сам проверил. Действительно, для кода
  always_ff @(posedge clk_i, posedge rst_i) begin
    data_o <= data1_i;
  end

варнинг выдается (не ошибка), а для case нет.

Добавьте if - будет Вам ошибка  :)

 

это не бага, это фича, если память не изменяет сие было еще в 6ой версии

Ну и фича - с if ошибка, с case даже варнинга нет. :)  

 

Чем они вообще руководствовались?

 

 

 

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


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

Чем они вообще руководствовались?

сие нам не ведомо, надо просто помнить про эту фичу %)

 

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


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

always_ff @(posedge clk_i, posedge rst_i)
  begin
    case(sel_i)
      1: data_o <= data1_i;
      0: data_o <= data2_i;
    endcase  
  end

 

Ну да. Игнорируем входные сигналы. Получаем в результате комбинаторную логику.

И ищем ошибку.

Как это тонко.

 

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


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

Ну да. Игнорируем входные сигналы. Получаем в результате комбинаторную логику.

И ищем ошибку.

Как это тонко.

 

Я из Вашего поста не понял, это ко мне претензия или к разработчикам?

 

 

Если ко мне, то я объясню. Естественно, понятно, что такая запись ошибочна. Просто, по-моему, синтезатор должен реагировать на одинаковые ошибки одинаково.

 

 

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


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

Просто, по-моему, синтезатор должен реагировать на одинаковые ошибки одинаково.

Поддерживаю. Уже непонятно, в каком из случаев if или case "истина", а где "ложь", с точки зрения разработчиков Quartus. На что ориентироваться? Вот так пропустишь что-нибудь, и не узнаешь...

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


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

Если ко мне, то я объясню. Естественно, понятно, что такая запись ошибочна. Просто, по-моему, синтезатор должен реагировать на одинаковые ошибки одинаково.

если есть возможность напишите баг репорт %)

 

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


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

Тема старая, но актуальности не потеряла - в Quartus 11.1sp2 ситуация такая же.

Подскажите, пожалуйста, почему при использовании

always_ff @(posedge clk_i)

и при ипользовании case, и при if всё нормально отрабатывает, триггер на месте, а при

always_ff @(posedge clk_i, posedge rst_i)

либо ошибка (if), либо комбинаторика (case).

Не могу понять, как надо думать?

И следует ли избегать case?

 

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


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

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

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

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

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

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

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

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

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

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