因此,在咨询了一些Altera手册和一些反复试验后,回答了我自己的问题,我发现这几乎可以满足我的要求.
module synchronizer (input wire dat_i,
input wire out_clk,
output wire dat_o);
(* altera_attribute = "-name SYNCHRONIZATION_REGISTER_CHAIN_LENGTH 2; -name SYNCHRONIZER_IDENTIFICATION \"FORCED IF ASYNCHRONOUS\"" *)
logic [1:0] out_sync_reg;
always_ff@(posedge out_clk) begin
out_sync_reg <= {out_sync_reg[0],dat_i};
end
assign dat_o = out_sync_reg[1];
endmodule
我通过将全局同步器检测设置为off进行了测试,并观察到TimeQuest找到并分析了亚稳的正确路径.
即使dat_i由clk_a锁存并且out_clk由clk_b驱动,并且两个时钟设置为:
set_clock_groups -asynchronous -group {clk_a}
set_clock_groups -asynchronous -group {clk_b}
从而在从由clk_a计时的寄存器到由clk_b计时的寄存器的所有连接之间创建错误的路径
set_max / min_delay无法工作,因为如果两个时钟位于不同的异步时钟组中,则它将被忽略(如Altera所述).