Jump to content
    

VIP cdn_axi. Некорректное поведение канала записи данных (W)

Здравствуйте, коллеги 
Попал ко мне на стол VIP от Cadence под названием CDN_AXI.
Подключил его классически: интерфейс+конфиг+агент+sequence.
Но сигнал WVALID ведёт себя неадекватно, т.е. переводится в единицу и так в ней и висит до конца симуляции...
VIP настроен на полный AXI4. У всех транзакций burst  законстрейнен до длины 1.
Бывало ли такое у кого и как лечится?

Share this post


Link to post
Share on other sites

С чего вы взяли, что это неадекватно? Да и вообще, кто же поведение AXI оценивает по одному сигналу? Вы же сами пишете: "У всех транзакций". Чтобы передать хотя бы одну транзакцию нужно перевести WVALID в 1 и, если вы до конца симуляции не поднимете WREADY, она и должна оставаться в единице.

У вас как? сколько транзакций? Где вейвформы, в конце-концов?

Edited by one_eight_seven

Share this post


Link to post
Share on other sites

WREADY как и положено взводится на 1 такт DUTом и опускается в 0.

Во всей очереди только 1 транзакция. После `uvm_do_with() идёт get_response(rsp). На get_response(rsp) очередь и зависает, т.е. если бы и были другие транзакции - они бы не прошли.

Share this post


Link to post
Share on other sites

Проблема определена. И относится она к тайм-слотам.
Сигналы *VALID и *READY наблюдаются VIP'ом в том же тайм-слоте, где они меняются. Изменение *READY соответственно происходит раньше, чем VIP успевает считать его предыдущее значение. Далее VIP, судя по всему, ломается. Помогла задержка *READY на долю нс. Соответственно проблемный тайм-слот пройден и VIP считывает ожидаемое значение сигнала *READY.

Есть ли более элегантное решение?

Share this post


Link to post
Share on other sites

Вангую, у вас сигналы формируются не по клоку, а по задержке. С синхронными сигналами такого быть не может.

 

Share this post


Link to post
Share on other sites

4 часа назад, andrew_b сказал:

Вангую, у вас сигналы формируются не по клоку, а по задержке. С синхронными сигналами такого быть не может.

 

Сигналы (грубо говоря) формирует Агент (не Mr.Smith, а UVM-агент).

С синхронными сигналами такое вполне случается. Собственно данный топик это иллюстрирует.

Яркий пример это какая-нибудь BFM для чтения какой-нибудь шины: Если по одному фронту и читать с помощью BFM и писать из DUT, то возникнет race-condition. И одним из решений является чтение по заднему фронту. Но это в моём случае не применимо, т.к. вся имплементация BFM и всего что к ней прилагается скрыта в VIP.

Share this post


Link to post
Share on other sites

Это называется логические гонки. Неконсистентность в бокирующих/неблокирующих присваиваниях.

Верификаторы борются с этим на корню, используя clocking блоки. Когда работал с Cadence, я переписывал интерфейсы сам, включая в них clocking.

Edited by one_eight_seven

Share this post


Link to post
Share on other sites

1 час назад, one_eight_seven сказал:

переписывал интерфейсы сам, включая в них clocking.

Этим же и я озадачился.

Добавил clocking block в интерфейс для установки input and output skew. По какой то причине добавление такового блока не оказывает решительно никакого эффекта ни на входы ни на выходы.
В чём может быть проблема?

Share this post


Link to post
Share on other sites

4 часа назад, one_eight_seven сказал:

Например в том, что вы их не используете.

Смешно. Их VIP не использует, а не я, как выяснилось...

Share this post


Link to post
Share on other sites

Почему смешно? в VIP я clocking вообще у cadence не видел, по крайней мере когда с ними работал. Поэтому, clocking писал сам, соотвественно и использование - тоже было на мне.

Share this post


Link to post
Share on other sites

12 часов назад, one_eight_seven сказал:

Почему смешно? в VIP я clocking вообще у cadence не видел, по крайней мере когда с ними работал. Поэтому, clocking писал сам, соотвественно и использование - тоже было на мне.

Вы имеете в виду использование clocking ЗА пределами интерфейса?

Ведь в чём соль: т.к. сам VIP clocking не использует, соответственно от создания такового блока самому VIPу ни холодно ни жарко. Т.о., единственная выгода, которую можно извлечь из создания clocking внутри интерфейса - это тактировать сигналы с помощью него из вне интерфейса. Или проще говоря, создание wrapper над интерфейсом, в котором все сигналы будут тактироваться от clocking.

Пример:

interface axi4_wrap(
  input aclk,
  ...,
  input awready,
  ...
  );
logic awready_dly;

clocking cb @(posedge aclk);
	default input #1step;

	input awready;
	...
endclocking: cb

initial forever begin
    @(cb);
	...
    awready_dly = awready;
	...
end
  
axi4_vip_intf axi4_if(
	.aclk(aclk),
  	...,
    .awready(awready_dly),
    ...
);
  
endinterface: axi4_wrap

 

Share this post


Link to post
Share on other sites

Вы упускаете момент присваивания сигналов, которые идут из DPI. Если выбудете делать присваивания из/в этих DPI сигналов с использованием clocking, то он будет работать.

Share this post


Link to post
Share on other sites

1 минуту назад, one_eight_seven сказал:

Вы упускаете момент присваивания сигналов, которые идут из DPI. Если выбудете делать присваивания из/в этих DPI сигналов с использованием clocking, то он будет работать.

Да, этот момент в примере опущен. Кстати про него: остальная часть блока initial выглядит так:

initial forever begin
    @(cb);
	...
    awready_dly = awready;
	...
    cb.awvalid <= awvalid_dly; // awvalid_dly подключён к VIP интерфейсу
	...
end

Т.е. выходы интерфейса VIPа присваиваются выходам обёртки с помощью неблокирующего присваивания. Использование этого типа присваивания - необходимое условие для успешной компиляции.

Понять не могу: почему запись cb.awvalid = awvalid_dly выдаёт compile-time ошибку типа: "Cannot write to clocking block signal"?

 

Share this post


Link to post
Share on other sites

Так список переменных в clocking block обязан использовать неблокирующее присваивание. Это же синхронная конструкция. Кроме того, у симулятора же есть его система помощи, расшифровки сообщений, и т.п.
Но вообще, пункт стандарта Syncronous Drives именно это и описывает.

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Create New...