首页 > 技术知识 > 正文

芯片设计之CDC异步电路(四)

芯片设计之CDC异步电路(三)

芯片设计之CDC异步电路(二)

芯片设计之CDC异步电路(一)

1CDC常见错误

1.1Reconvergence

芯片设计之CDC异步电路(五)-cd机原理图

1.1.1single_source_reconvergence

芯片设计之CDC异步电路(五)-cd机原理图1

结构:同一个信号源头,两个同步处理器。这里提一下,有两个CDC分析工具的参数配置:

芯片设计之CDC异步电路(五)-cd机原理图2

1.1.2 案列1divergence_depths0

// divergence pointalways @ (posedge tx_clk) ctrl <= ci0 | ci1 ;// two_dff synchronizeralways @ (posedge rx_clk) begin: two_dff reg temp; temp <= ctrl; two_dff_sync <= temp;end// shift_reg synchronizeralways @ (posedge rx_clk) begin: shift_reg shift_reg_sync <= {shift_reg_sync[0], ctrl};end// reconvergence pointalways @ (posedge rx_clk) dout <= two_dff_sync ^ shift_reg_sync[1];

电路如下:divergence_depth为0

芯片设计之CDC异步电路(五)-cd机原理图3

CDC报告如下:

芯片设计之CDC异步电路(五)-cd机原理图4

1.2     Redundant

芯片设计之CDC异步电路(五)-cd机原理图5

案例1:

// two_dff synchronizer of tx_sigalways @ (posedge rx_clk) begin: two_dff reg s0 , s1; s0 <= tx_sig; // 1st flop s1 <= s0; // 2nd flopend// two_dff synchronizer of tx_sigalways @ (posedge rx_clk) begin: shift_reg reg [1:0] sh_reg; sh_reg <= {sh_reg[0], tx_sig};end

 芯片设计之CDC异步电路(五)-cd机原理图6

1.3multi_sync_mux_select (DMUX)

MUXselfan-in信号超过一组同步器,不推荐。通常MUXsel端只能有一组同步器。

芯片设计之CDC异步电路(五)-cd机原理图7

案例1:

always @(posedge rx_clk) begin reg s1_sel1, s2_sel1; reg [1:0] s_sel2; s1_sel1 <= tx_sel1; s2_sel1 <= s1_sel1; s_sel2 <= {s_sel2[0], tx_sel2}; if (s_sel2[1] | s2_sel1)        rx_data <= tx_data;end

 电路如下:

芯片设计之CDC异步电路(五)-cd机原理图8

芯片设计之CDC异步电路(五)-cd机原理图9

1.4combo_logic

芯片设计之CDC异步电路(五)-cd机原理图10

1.4.1错误案列1

always @ (posedge rx_clk) begin s1 <= tx_sig & din; s2 <= s1;end

芯片设计之CDC异步电路(五)-cd机原理图11

芯片设计之CDC异步电路(五)-cd机原理图12

当然还有如下这种错误,除非additional logic全部是静态变量。

芯片设计之CDC异步电路(五)-cd机原理图13

1.5async_reset_no_sync(异步复位、同步撤离)

1.5.1案列1

// Reset triggered by tx_clkalways @(posedge tx_clk)tx_sig <= rst;// Unsynchronized reset used in// Rx domainalways @(posedge rx_clk,negedge tx_sig)if (!tx_sig) rx_sig <= 1’b0;else rx_sig <= din;

芯片设计之CDC异步电路(五)-cd机原理图14

芯片设计之CDC异步电路(五)-cd机原理图15

1.5.2错误案列2

// Reset triggered by tx_clkalways @(posedge tx_clk)tx_sig <= rst;// Improperly synchronized reset used// in Rx domainalways @(posedge rx_clk,negedge tx_sig)if (!tx_sig) rx_reset <= 1’b0;else rx_reset <= 1’b1;

芯片设计之CDC异步电路(五)-cd机原理图16

芯片设计之CDC异步电路(五)-cd机原理图17

正确的结构如下:

芯片设计之CDC异步电路(五)-cd机原理图18

1.6dff_sync_gated_clk

芯片设计之CDC异步电路(五)-cd机原理图19

案列1,与门做时钟gating有毛刺,需要clock gating cell// gated clock expressionassign gclk = rx_clk & clk_en;always @(posedge gclk) sync1 <= tx_sig; // 1st DFFalways @(posedge rx_clk) sync2 <= sync1; // 2nd DFF

芯片设计之CDC异步电路(五)-cd机原理图20

芯片设计之CDC异步电路(五)-cd机原理图21

1.7fanin_different_clks

同步器的输入由两个异步时钟域的组合逻辑构成,如下图所示:(还有combo logic

芯片设计之CDC异步电路(五)-cd机原理图22

值得注意的是,如果sig_a或者sig_b中有一个信号是stable静态变量,那么上图结构的电路就不会被报fanin_different_clks或者combo_logic错误。

假设有sig_asig_bsig_c三个信号及以上的fan_in呢?抛开静态变量后,

若所有信号都是同一个时钟域,CDC错误类型就是combo_logic

若所有信号来自至少2个时钟域,CDC错误类型就是fanin_different_clks

举个例子,如下图:

芯片设计之CDC异步电路(五)-cd机原理图23

上图电路仍会报fanin_different_clks,但是电路确实是设计者的意图,我们只需要将TEST时钟域的test_sel设置为常数0即可。

1.7.1案列1

always @ (posedge tx1_clk) tx1_sig <= in1;always @ (posedge tx2_clk) tx2_sig <= in2;always @ (posedge rx_clk) begin sync0 <= tx1_sig | tx2_sig; sync1 <= sync0;end

芯片设计之CDC异步电路(五)-cd机原理图24

芯片设计之CDC异步电路(五)-cd机原理图25

时间不早了,暂写到这里,后续接着完善。

谢阅读文章,如果文章有用,麻烦点个“在看”或转发分享。

芯片设计之CDC异步电路(五)-cd机原理图26

转载:全栈芯片工程师

猜你喜欢