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

clocking block в SystemVerilog

Пытаюсь использовать задержу на несколько тактов clocking блока:

 

program test(Rx_iol.TB Rx, ...);

 

initial begin

...........

##2 Rx.cb.valid <= 1;

...........

end

 

......

 

endprogram

 

Однако QuestaSim 6.3d выдаёт ошибку:

# ** Error: A default clocking block must be specified to use the ##n timing statement.

 

Не понимаю, зачем определять дефолтный clocking блок если в интерфейсе Rx_iol определён клок,

по которому должна происходить задержка:

 

interface Rx_iol(input logic clk);

logic [31:0] data;

logic ready, valid;

 

clocking cb @(posedge clk);

output data, valid;

input ready;

endclocking

 

modport DUT (input data, valid,

output ready);

 

modport TB (clocking cb);

 

endinterface : Rx_iol

 

Может кто подскажет, в чём проблема?

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


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

Пытаюсь использовать задержу на несколько тактов clocking блока:

 

Думаю, что все по стандарту (п. 15.10): оператор ##n определяет задержку в n тактов _default'ного_ clocking блока, который может быть только один на модуль, интерфейс или программу.

 

Я лично пользуюсь конструкцией вида:

repeat (n) @INTERF.cb;

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


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

Думаю, что все по стандарту (п. 15.10)

 

Я вроде делаю всё по стандарту. Пункт 15.14 (Synchronous drives), на стр.191 фраза: The event_count uses syntax similar to the cycle-delay operator (see Section 15.10), however the synchronous drive uses the clocking block of the signal being driven and not the default clocking.

 

 

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

 

P.S. Ваша конструкция (repeat (n) @INTERF.cb) работает, но всё-таки хотелось бы использовать synchronous drives, т.к. просто влом писать

repeat (n) @INTERF.cb; INTERF.cb.signal <= value;

вместо:

##n INTERF.cb.signal <= value;

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


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

Нет, с дефолтным блоком все работает, только он должен быть размещен непосредственно в программе. Но это как раз cycle delay (п. 15.10), а вот то, что значится под пунктом 15.14, действительно работает очень странно.

 

Попробуйте конструкцию вида.

INTERF.cb.signal<=##n 0;

 

У меня не жалуется в этом случае.

 

Если написать:

 ##n INTERF.cb.signal<= 0;

, то пожалуется на отсутствие дефолтного клокинг-блока. Если его объявить в программе, то эта конструкция заработает нормально, но это отличается от описанного в п. 15.14, т.к. ## работает по дефолтному блоку в этом случае. Вобщем, вот так.... :laughing: На самом деле, я сам с этим столкнулся месяца 3 назад и для себя решил проблему при помощи repeat'a, но это конечно костыль.

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


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

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

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

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

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

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

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

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

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

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