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

Косяк с последовательностью обработки событий при моделировании

Всем доброго дня!

Такая проблема: моделирую в Active-HDL в смешанном режиме. Для синтеза пишу на vhdl, а тестбенч на sv.

Столкнулся с тем, что мой компонент uut видит управляющий сигнал, формируемый в тестбенче по @(posedge clk), не после прихода фронта clk, а в момент прямо перед фронтом.

Пока писал, пост, решение уже подсказали. Поменял в тестбенче module на program. Теперь сигналы из тестбенча в uut видятся корректно, а вот в обратную сторону - по-прежнему нет. Тестбенч видит tready так, будто он установлен не в момент времени, стремящийся к фронту справа, а в момент, стремящийся к фронту слева... 

image.thumb.png.ecd0045ada62ced2515ab384a480f263.png

Как это исправить?

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


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

Во-первых непонятно, что у вас за симулятор. Может ошибка в нём (UPD. Увидел, Active HDL - ничего про него сказать не могу)
Но я так подозреваю что вам нужно применить во всём проекте так называемую транспортную задержку:

пример:
always @ (posedge clk)
begin
a<= #1 d;
b<= #1 a;
end

где  1  конечно же лучше заменить параметром.




Вариант VHDL:
TIME_DELAY : time := 1 ns

PROCESS(clk, rst)
   BEGIN
cnt_data <= cnt_data - 1 after TIME_DELAY;

и так везде


Первая попавшаяся ссылка на эту тему:
https://asic4u.wordpress.com/2016/03/28/verilog-1-delay-in-rtl/

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


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

Спасибо.
Честно говоря, транспортная задержка - это первое, что пришло в голову. Но мне показалось, что вставлять ее повсеместно, да к тому же на этапе функционального моделирования как-то через чур. Может тут еще где-то собака порылась?
Еше немного из "истории болезни":
1) когда я пользовался только vhdl, то с подобным сталкивался, когда в тестбенче писал просто "wait for ..." И даже если этот wait совпадал по времени с тактом, это событие симулятором выставлялось в очередь перед фронтом клока. Вылечил тем, что везде, где надо стал ставить "wait until (clk='1' and clk'event)".

2) Связку vhdl-sv использую впервые. Тут также явно жду события @(posedge clk), и поначалу всё работало, как задумано. Но потом я исключил входную fifo от xilinx из цепочки TB-UUT и стал axi-стримить напрямую своему компоненту... и всё сломалось ) Вероятно, IP FIFO как раз и обеспечивало все нужные задержки, но хоть убейте, это выглядит костылем :)

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


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

21 hours ago, OparinVD said:

Тестбенч видит tready так, будто он установлен не в момент времени, стремящийся к фронту справа, а в момент, стремящийся к фронту слева...

На картинке явно нарушен холд. Это - нетлист моделируется, или RTL? 

- Если нетлист, то нарушены тайминги по холду (надо смотреть репорты)

- Если это RTL - надо разбираться с тем, как формируются клоки S_AXIS_CLK и тот клоки, что драйверит S_AXIS_TREADY; скорее всего где то есть некорректный клокгейт или просто задержка в цепи клока S_AXIS_CLK .

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


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

Race condition, что тут еще сказать.

Нужно использовать конструкцию clocking. Тогда не будет проблем с моделированием RTL и netlist. 

 

interface arb_if(input bit clk);

	logic [1:0] grant, request;
	logic rst;

	clocking cb @(posedge clk);
		output request;
		input grant;
	endclocking // Declare cb

	modport TEST (clocking cb,
				output rst); // Use cb

	modport DUT (input request, rst, output grant);

endinterface

Возьмите книгу SystenVerilog for Verification https://www.springer.com/gp/book/9781441945617 Chapter 4 Connecting the Testbench and Design 

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

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


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

Еще стандарт SV поройте, ЕМНИП, хотя может и изменять может помочь #0 после события по которому нужно читать в tb

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


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

Спасибо за наводку!

Почитал про клокинг-блоки, вроде всё понятно, тут же внедрил, но потом голову сломал, как sv-program с интерфейс-блоком вставить в топлевел на vhdl... В общем, плюнул, поставил транспортные задержки в обе стороны. #0 не помогло, а больше ноля - всё заработало.

Потом уже подумал, что надо наверное было топлевел на sv сделать и не мудрить, но в тот момент че-то не сообразил.
Правда, вивадо мое художество отказывается биндить и не модлирует, но это уже другая история ))

On 5/31/2020 at 10:52 AM, Aleх said:

На картинке явно нарушен холд. Это - нетлист моделируется, или RTL? 

Не уверен в терминологии, но речь о нетлисте. Т.е. то, что получается после компиляции hdl без привязки ни к вендору, ни к конкретным ресурсам. Самое первичное функциональное моделирование.

В общем, как выше выяснилось, дело именно в race

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


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

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

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

Гость
Ответить в этой теме...

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

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

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

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

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

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