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

Тайминг, симуляция vs. железо. Помогите, объясните.

Здравствуйте.

Вроде бы простая задача - записывать в память входные данные и считать их количество. Данные приходят со стробом, синхронно с системным клоком, относительно медленно.

Решение "в лоб":

always @(posedge clk or posedge reset) begin
        if (reset) begin
            counter <= 0;
            mem_bank <=0;
        end else begin
            if (sample_wr) begin
                samples[{mem_bank, counter[4:0]}] <= sample;
                counter <= counter + 1;                
            end    
            if (counter == 6'b100000) begin
                  counter <= 0;
                  mem_bank <= ~mem_bank;
               end            
        end
end

результат симуляции:

simg.jpg

честно - совсем запутался. Видно что нулевой отсчет записывается на следующем sample_wr в samples[1] (на графике не видно, но значение 3ff попадает именно туда). А нулевой адрес памяти так и остается пустой. Но почему? Я думал (немного освоившись с FPGA уже) что запись и инкремент counter будут происходить одновременно на данным клоке.

Размер samples достаточный - я вырезал из графика неинтересное.

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


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

http://electronix.ru/forum/index.php?act=a...st&id=42313

 

может быть интересно для разобраться , слайд 8

 

Each Verilog simulation time step is divided into 4 queues

который ...

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


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

Each Verilog simulation time step is divided into 4 queues

Спасибо, интересно. Но все равно не понимаю. На Q1

Evaluate RHS of all non-blocking assignments
посчитается новое значение counter, потом на Q2
Change LHS of all non-blocking assignments
- должно записаться sample в память (пусть даже под новым адресом). Но ведь Q1 и Q2 - тот же самый time step - дальше не понятно почему оно там появляется на следующем sample_wr, вообще через 4 такта clk.

Ну и вопрос - как с таким жить? Задерживать sample_wr на такт clk и сначала делать запись а потом по задержанному - инкремент counter?

 

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


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

Похоже в вашем тестбенче sample_wr формируется неправильно, например с помощью блокирующего присваивания '=', а не '<='

На времянке вы этого не увидите, а результат будет ровно такой, как есть

 

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


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

Попробуйте сдвинуть sample на полтакта назад (влево).

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


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

Похоже в вашем тестбенче sample_wr формируется неправильно, например с помощью блокирующего присваивания '=', а не '<='

На времянке вы этого не увидите, а результат будет ровно такой, как есть

Спасибо! Так и было. Теперь записывается под адрес 0 на следующем клоке и counter увеличивается тогда же. Я так понимаю для синтеза данный код подходит? (частоты настолько медленные что о времянке можно не беспокоиться пока).

 

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


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

Я так понимаю для синтеза данный код подходит?

На первый взгляд - да

 

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


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

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

 

Судя по картинке это ActiveHDL, а какой версии?

 

Помню в 6-7 версиях постоянно ловил глюк подобного этому - некорректно отрабатывались события в пределах дельта-функции.

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

так что это скорее всего особенность "национального моделирования" от Aldec.

 

 

Удачи! Rob

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


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

так что это скорее всего особенность "национального моделирования" от Aldec.

По-моему, это принципиальное свойство моделирования (на Verilog, а, возможно, и не только на нем).

В Quartus'е при функциональной симуляции наблюдал нечто похожее.

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


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

По-моему, это принципиальное свойство моделирования (на Verilog, а, возможно, и не только на нем).

В Quartus'е при функциональной симуляции наблюдал нечто похожее.

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

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


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

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

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

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

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

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

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

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

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

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