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

Правильный set_multicycle_path

Форумчане привет. Вопрос из разряда "давно хотел спросить, но стеснялся" =)

Код пример

reg [1:0] 	start;

always @ (posedge clk) begin
  start <= start << 1;
  
  if (en) begin
  	data  <= 1234567;
	start [0] <= 1
  end
      
  if (start[1]) begin
      data_1 <= data;
  end
end

Ситуация простая, использование данных data идет через 2 такта после присваивания. И я могу применить

set_multicycle_path -setup -to data 2 

 

Но правильно ли это будет, если само присваивание "data <=" длится один такт (en встает в 1 ровно на 1 такт ). Или чтобы соблюсти описанный мультицикл, я должен и присваивать 2 такта подряд?

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

Изменено пользователем new123

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


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

Обычно в мультициклах set_multicycle_path 2 ставится для данных (которые изменяются 1 раз в 2 такта),
а для enable, который ставится в 1'b1 на 1 такт мутьтицикл остается = 1.

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


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

20 hours ago, new123 said:

Ситуация простая, использование данных data идет через 2 такта после присваивания. И я могу применить

set_multicycle_path -setup -to data 2 

для мультицикла надо еще холд задавать, иначе вы опишете не то

20 hours ago, new123 said:

Но правильно ли это будет, если само присваивание "data <=" длится один такт (en встает в 1 ровно на 1 такт ). Или чтобы соблюсти описанный мультицикл, я должен и присваивать 2 такта подряд?

вам нужно чтобы данные на входе триггера данных устаканились, а не для enable

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


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

5 hours ago, des00 said:

для мультицикла надо еще холд задавать, иначе вы опишете не то

это понятно, спасибо уточнение. HOLD = SETUP -1 всегда приписываю

5 hours ago, des00 said:

вам нужно чтобы данные на входе триггера данных устаканились

отсутствия правильной теоретической базы не дает мне возможно правильно задавать вопрос =) 
Тихой сапой, я уже давно понял, чтобы при таком мультицикле у меня данные должны быть стабильны 2 такта.

Мой вопрос состоял в следующем.
1) Я пытаюсь выровнять времянку во всем проекте, решил некоторые сложные пути растянуть на пару тактов, там где это не критично
2) Вопрос таков: должен ли я делать присваивания 2 такта подряд при таком желаемом мультицикле или просто хватит одного присваивания на первом такте и дальше данные сами добегут?

Изменено пользователем new123

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


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

25 minutes ago, new123 said:

2) Вопрос таков: должен ли я делать присваивания 2 такта подряд при таком желаемом мультицикле или просто хватит одного присваивания на первом такте и дальше данные сами добегут?

зависит от вашей реализации. Если у вас enable регулярный и постоянный и вам нет разницы в какой момент получить результат присваивания, то просто присваиваете по нему. Если у вас enable формируется из какого-то не регулярного строба валидности данных, которые вы удерживаете 2 такта и вы хотите получить результат не на следующий enable, а по этому не регулярному, то нужно задержать его на эти 2 такта, хлопнуть по нему и сформировать "выходной" строб валидности

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


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

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

18 minutes ago, new123 said:

...
2) Вопрос таков: должен ли я делать присваивания 2 такта подряд при таком желаемом мультицикле или просто хватит одного присваивания на первом такте и дальше данные сами добегут?

Правильно все же  делать EN длительностью в 1 такт как для источника так и для получателя (с соответствующей задержкой).
Так как мультицикл задает ограничение время за которое данные (как выше указал @des00) должны устаканится на входе получателя. Соответственно источник должен гарантировать стабильные данные требуемое число тактов.  При этом если EN  для получателя будет активным все время (распространения данных) то возможна ситуация возникновения метастабильности получателя, когда изменяющиеся данные на входе попадут на фронт CLK.  Понятно что следующим тактом  эта метастабильности схлопнется,  так как буду защелкнуты  стабильные данные,  но куда и как распространится последствия этой метастабильности зависит от структуры конкретного дизайна, и о последствиях такого судить сложно.  

 

Удачи! Rob.

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


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

6 часов назад, new123 сказал:

Тихой сапой, я уже давно понял, чтобы при таком мультицикле у меня данные должны быть стабильны 2 такта.

Для вашего мультицикла худшим случаем должно быть: данные формирующиеся на такте "n" должны защелкиваться не ранее такта "n+2".

Т.е. для set_multicycle_path -setup 2 set_multicycle_path -hold 1 данные, которые формируются на такте n не будут корректны на такте n+1 и захватывать их нельзя.

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


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

19 hours ago, new123 said:

Тихой сапой, я уже давно понял, чтобы при таком мультицикле у меня данные должны быть стабильны 2 такта.

Да. Если у вас есть нагрузка на выход, то путь сигнала на setup рассчитывается в 2 тактовых сигнала. Т.е. по сути тактовым у вас будет делитель частоты на 2, причем зависимый от основного. Но hold так и останется 1.

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

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


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

Решил новую тему не создавать и здесь спросить.

Вот такой модуль:

module abc(
input clk,
output reg [19:0]Q
);
reg [1:0]p;
always @(posedge clk) p <= p + 2'b01;

reg [19:0]A,B,C;

always @(posedge clk)
 case (p)
	2'b00: begin Q <= A; A <= A + 20'b01; end
	2'b01: begin Q <= B; B <= B - 20'b10; end	
	2'b10: begin Q <= A; A <= A + 20'b01; end
	2'b11: begin Q <= C; C <= C - 20'b11; end	
 endcase
endmodule

Правильно ли мультициклы описал?

set_multicycle_path 2 -setup -from [get_registers abc:inst|A[*]] -to [get_registers abc:inst|A[*]]
set_multicycle_path 1  -hold -from [get_registers abc:inst|A[*]] -to [get_registers abc:inst|A[*]]

set_multicycle_path 4 -setup -from [get_registers abc:inst|B[*]] -to [get_registers abc:inst|B[*]]
set_multicycle_path 3  -hold -from [get_registers abc:inst|B[*]] -to [get_registers abc:inst|B[*]]

set_multicycle_path 4 -setup -from [get_registers abc:inst|C[*]] -to [get_registers abc:inst|C[*]]
set_multicycle_path 3  -hold -from [get_registers abc:inst|C[*]] -to [get_registers abc:inst|C[*]]

 

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


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

Все верно, только с коэф. деления ошиблись. Судя по коду, на А малтисайкл 4(сетап)-3(холд), на В -8(сетап)-7(холд).

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


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

46 минут назад, Aleх сказал:

Судя по коду, на А малтисайкл 4(сетап)-3(холд), на В -8(сетап)-7(холд).

Почему? A меняется раз в два такта, B и C раз в четыре.

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


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

5 часов назад, andrew_b сказал:

Почему? A меняется раз в два такта, B и C раз в четыре.

1. Присоединяюсь к вопросу.

2. Меня интересовал вопрос, можно ли в качестве -from и -to одни и те же регистры указывать.

В разных источниках всегда разные регистры фигурируют в примерах.

Ну раз возражений нет - значит можно.

Спасибо.

Изменено пользователем Freibier

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


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

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

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

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

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

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

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

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

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

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