Jump to content

    
new123

Правильный set_multicycle_path

Recommended Posts

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

Код пример

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 такта подряд?

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

Edited by new123

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites
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

Share this post


Link to post
Share on other sites
5 hours ago, des00 said:

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

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

5 hours ago, des00 said:

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

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

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

Edited by new123

Share this post


Link to post
Share on other sites
25 minutes ago, new123 said:

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

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

Share this post


Link to post
Share on other sites

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

18 minutes ago, new123 said:

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

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

 

Удачи! Rob.

Share this post


Link to post
Share on other sites
6 часов назад, new123 сказал:

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

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

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

Share this post


Link to post
Share on other sites
19 hours ago, new123 said:

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

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

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

Share this post


Link to post
Share on other sites

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

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

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[*]]

 

Share this post


Link to post
Share on other sites
46 минут назад, Aleх сказал:

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

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

Share this post


Link to post
Share on other sites
5 часов назад, andrew_b сказал:

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

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

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

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

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

Спасибо.

Edited by Freibier

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.