Jump to content
    

Опять переход из одного клокового домена в другой

Поясните, кто может (в частности des00), как правильно делать. Можно ткнуть в какую-нибудь понятную статейку или еще чего. Когда-то я поднимал похожую тему с фифой, там дес выкладывал файлик

 

Но понимания мне это все не добавило...

 

Выложи RTL, я на досуге погоняю его в CDC Formal Verification Engine и опубликую :laughing:

Share this post


Link to post
Share on other sites

интересная статейка Clock Domain Crossing Glitch Detection Using Formal Verification

 

Спасибо прочтем. Кстати вы у себя ТАМ дошли уже до Property Specification and Theorem Proving? :help: Если такое делаете, тоже был бы благодарен за ссылочки по темам.

Причем в Property Specification интересует System Verilog Assertions Generators и др. prototyping features... Example sctipts are highly WELCOME :laughing:

Share this post


Link to post
Share on other sites

Добавил pulse_synchronizer в свой код. Таким образом я передаю, можно сказать, сигнал сброса из одного клокового домена в другой.

И таймквест перестал выдавать критический варнинг с руганью на передаваемый сигнал. Однако он все же ругается на pulse_synchronizer:

-1.377    qsys1:qsys_inst|VGA_Controller:vga_controller_0|pulse_synchronizer:valid_synchronizer|level    qsys1:qsys_inst|VGA_Controller:vga_controller_0|pulse_synchronizer:valid_synchronizer|dffout[0]    qsys_inst|altpll_dvi|sd1|pll7|clk[0]

И на некоторые другие.

В связи с этим вопросы:

1) Квартус понимает, когда добавили пару триггерво при переходе из одного домена в другой?

2) Можно просто прописать falsepath для тех цепей pulse_synchronizer, на которые ругается таймквест?

 

Share this post


Link to post
Share on other sites

1) Квартус понимает, когда добавили пару триггерво при переходе из одного домена в другой?

2) Можно просто прописать falsepath для тех цепей pulse_synchronizer, на которые ругается таймквест?

 

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

2. Да.

Share this post


Link to post
Share on other sites

О че заметил. Не знаю, как раньше-то это работало.

 

Хотел с помощью pulse_synchronizer перенести сигнал reset_n из одного домена в другой. А он лишь формирует импульс.

Это нормально?

post-10359-1349072260_thumb.jpg

Share this post


Link to post
Share on other sites

Хотел с помощью pulse_synchronizer перенести сигнал reset_n из одного домена в другой. А он лишь формирует импульс.

Это нормально?

дык, модуль же называется "импульсный синхронизатор", а не синхронизатор уровней

 

для сброса я использую другой компонент

module reset_synchronizer
#(
 parameter int pLENGTH = 4
)
(
 clk             ,
 reset_carry_in  ,
 reset_in        ,
 reset_out
);

 //------------------------------------------------------------------------------------------------------
 //
 //------------------------------------------------------------------------------------------------------

 input  logic  clk           ;
 input  logic  reset_in      ;
 input  logic  reset_carry_in;
 output logic  reset_out     ;

 //------------------------------------------------------------------------------------------------------
 //
 //------------------------------------------------------------------------------------------------------

 logic [pLENGTH-1:0] reset_srl;

 //------------------------------------------------------------------------------------------------------
 //
 //------------------------------------------------------------------------------------------------------

 always_ff @(posedge clk or posedge reset_in) begin : reset_shift_register
   if (reset_in)
     reset_srl <= '1;
   else
     reset_srl <= (reset_srl << 1) | reset_carry_in;
 end

 assign reset_out = reset_srl[$high(reset_srl)];

endmodule

Share this post


Link to post
Share on other sites

Может и для синхронизации шин чё-нибудь есть (не фифо)?

да вроде больше и не требуется, есть еще, синхронизатор - переключатель

module toggle_synchronizer
(
 clkin	,
 resetin  ,
 sin	  ,
 clkout   ,
 resetout ,
 sout
);

 //------------------------------------------------------------------------------------------------------
 //
 //------------------------------------------------------------------------------------------------------

 input  logic  clkin  ;
 input  logic  resetin;
 input  logic  sin	;
 input  logic  clkout ;
 input  logic  resetout;
 output logic  sout   ;

 //------------------------------------------------------------------------------------------------------
 //
 //------------------------------------------------------------------------------------------------------

 logic level		; // RS level triger for input pulses
 logic level_clrin  ;
 logic level_clrout ;

 logic [2:0] dffout; // clkin -> clkout syncronizer for level

 //------------------------------------------------------------------------------------------------------
 // Input converter edge/level clkin -> level clkin
 //------------------------------------------------------------------------------------------------------

 always_ff @(posedge clkin or posedge resetin) begin
if (resetin)
  level <= 1'b0;
else if (sin)
  level <= ~level;
 end

 //------------------------------------------------------------------------------------------------------
 // Forward syncronizer level clkin -> edge clkout
 //------------------------------------------------------------------------------------------------------

 always_ff @(posedge clkout or posedge resetout) begin
if (resetout)
  dffout <=0;
else
  dffout <= {dffout[1:0], level};
 end

 assign sout = dffout[2] ^ dffout[1];

endmodule

но давно им не пользовался %)

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...