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

david 2022-02-20 09:00:18 3862

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

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

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

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

1 CDC常见错误

===

1.1 Reconvergence


1.1.1 single_source_reconvergence

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

1.1.2 案列1:divergence_depths为0

<pre class="code-snippet__js" data-lang="properties">```
<span class="code-snippet_outer"><span class="code-snippet__meta">//</span> <span class="code-snippet__string">divergence point</span></span>
  • 1
  • 2

always @ (posedge tx_clk)

<span class="code-snippet_outer">    <span class="code-snippet__attr">ctrl</span> <span class="code-snippet__string"></span></span>
  • 1

<span class="code-snippet_outer"><span class="code-snippet__meta">//</span> <span class="code-snippet__string">two_dff synchronizer</span></span>
  • 1

always @ (posedge rx_clk) begin: two_dff

<span class="code-snippet_outer">    <span class="code-snippet__attr">reg</span> <span class="code-snippet__string">temp;</span></span>
  • 1

temp

<span class="code-snippet_outer">    <span class="code-snippet__attr">two_dff_sync</span> <span class="code-snippet__string"></span></span>
  • 1

end

<span class="code-snippet_outer"> </span>
  • 1

// shift_reg synchronizer

<span class="code-snippet_outer"><span class="code-snippet__attr">always</span> <span class="code-snippet__string">@ (posedge rx_clk) begin: shift_reg</span></span>
  • 1

shift_reg_sync

<span class="code-snippet_outer"><span class="code-snippet__attr">end</span></span>
  • 1

<span class="code-snippet_outer"><span class="code-snippet__meta">//</span> <span class="code-snippet__string">reconvergence point</span></span>
  • 1

always @ (posedge rx_clk)

<span class="code-snippet_outer">    <span class="code-snippet__attr">dout</span> <span class="code-snippet__string"></span></span>
  • 1

    电路如下:divergence_depth为0

    CDC报告如下:

    1.2 Redundant

    案例1:

    <pre class="code-snippet__js" data-lang="properties">```
    <span class="code-snippet_outer"><span class="code-snippet__meta">//</span> <span class="code-snippet__string">two_dff synchronizer of tx_sig</span></span>
    • 1
    • 2

    always @ (posedge rx_clk) begin: two_dff

    <span class="code-snippet_outer">    <span class="code-snippet__attr">reg</span> <span class="code-snippet__string">s0 , s1;</span></span>
    • 1

    s0

    <span class="code-snippet_outer">    <span class="code-snippet__attr">s1</span> <span class="code-snippet__string"></span></span>
    • 1

    end

    <span class="code-snippet_outer"><br></br></span>
    • 1

    // two_dff synchronizer of tx_sig

    <span class="code-snippet_outer"><span class="code-snippet__attr">always</span> <span class="code-snippet__string">@ (posedge rx_clk) begin: shift_reg</span></span>
    • 1

    reg [1:0] sh_reg;

    <span class="code-snippet_outer">    <span class="code-snippet__meta">sh_reg =<span class="code-snippet__string"> {sh_reg[0], tx_sig};</span></span></span>
    • 1

    end

      1.3 multi_sync_mux_select (DMUX)

      MUX的sel端fan-in信号超过一组同步器,不推荐。通常MUX的sel端只能有一组同步器。

      案例1:

      <pre class="code-snippet__js" data-lang="properties">```
      <span class="code-snippet_outer"><span class="code-snippet__attr">always</span> <span class="code-snippet__string">@(posedge rx_clk) begin</span></span>
      • 1
      • 2

      reg s1_sel1, s2_sel1;

      <span class="code-snippet_outer">    <span class="code-snippet__attr">reg</span> <span class="code-snippet__string">[1:0] s_sel2;</span></span>
      • 1

      <span class="code-snippet_outer">    <span class="code-snippet__attr">s1_sel1</span> <span class="code-snippet__string"></span></span>
      • 1

      s2_sel1

      <span class="code-snippet_outer">    </span>
      • 1

      s_sel2

      <span class="code-snippet_outer">    </span>
      • 1

      if (s_sel2[1] | s2_sel1)

      <span class="code-snippet_outer"><span class="code-snippet__meta">        rx_data =<span class="code-snippet__string"> tx_data;</span></span></span>
      • 1

      end

        电路如下:

        1.4 combo_logic

        1.4.1 错误案列1

        <pre class="code-snippet__js" data-lang="properties">```
        <span class="code-snippet_outer"><span class="code-snippet__attr">always</span> <span class="code-snippet__string">@ (posedge rx_clk) begin</span></span>
        • 1
        • 2

        s1

        <span class="code-snippet_outer">    <span class="code-snippet__attr">s2</span> <span class="code-snippet__string"></span></span>
        • 1

        end

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

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

          1.5.1 案列1

          <pre class="code-snippet__js" data-lang="javascript">```
          <span class="code-snippet_outer"><span class="code-snippet__comment">// Reset triggered by tx_clk</span></span>
          • 1
          • 2

          always @(posedge tx_clk)

          <span class="code-snippet_outer">tx_sig </span>
          • 1

          <span class="code-snippet_outer"><span class="code-snippet__comment">// Unsynchronized reset used in</span></span>
          • 1

          // Rx domain

          <span class="code-snippet_outer">always @(posedge rx_clk,negedge tx_sig)</span>
          • 1

          if (!tx_sig) rx_sig 1’b0;

          <span class="code-snippet_outer"><span class="code-snippet__keyword">else</span> rx_sig </span>
          • 1
          
          ![](https://ebaina.oss-cn-hangzhou.aliyuncs.com/wechat-official-crawl/2022-02/164531881517136.jpg)
          
          ![](https://ebaina.oss-cn-hangzhou.aliyuncs.com/wechat-official-crawl/2022-02/164531881529256.jpg)
          
          ### 1.5.2 错误案列2
          
          - 
          - 
          - 
          - 
          - 
          - 
          - 
          - 
          
          • 1
          • 2
          • 3
          • 4
          • 5
          • 6
          • 7
          • 8
          • 9
          • 10
          • 11
          • 12
          • 13
          • 14
          • 15
          ```
          // Reset triggered by tx_clk
          ``````
          always @(posedge tx_clk)
          ``````
          tx_sig 
          ``````
          // Improperly synchronized reset used
          ``````
          // in Rx domain
          ``````
          always @(posedge rx_clk,negedge tx_sig)
          ``````
          if (!tx_sig) rx_reset 1’b0;
          ``````
          else rx_reset 1’b1;
          ```
          ```
          
          ![](https://ebaina.oss-cn-hangzhou.aliyuncs.com/wechat-official-crawl/2022-02/164531881510418.jpg)
          
          ![](https://ebaina.oss-cn-hangzhou.aliyuncs.com/wechat-official-crawl/2022-02/164531881538901.jpg)
          
          正确的结构如下:
          
          ![](https://ebaina.oss-cn-hangzhou.aliyuncs.com/wechat-official-crawl/2022-02/164531881680946.jpg)
          
          1.6 dff\_sync\_gated\_clk
          -------------------------
          
          ![](https://ebaina.oss-cn-hangzhou.aliyuncs.com/wechat-official-crawl/2022-02/164531881613301.jpg)
          
           案列1,与门做时钟gating有毛刺,需要clock gating cell。
          - 
          - 
          - 
          - 
          - 
          - 
          
          ```
          
          ```
          // gated clock expression
          ``````
          assign gclk = rx_clk & clk_en;
          ``````
          always @(posedge gclk)
          ``````
              sync1 
          ``````
          always @(posedge rx_clk)
          ``````
              sync2 
          ```
          ```
          
          ![](https://ebaina.oss-cn-hangzhou.aliyuncs.com/wechat-official-crawl/2022-02/16453188169720.jpg)
          
          ![](https://ebaina.oss-cn-hangzhou.aliyuncs.com/wechat-official-crawl/2022-02/164531881771757.jpg)
          
          1.7 fanin\_different\_clks
          --------------------------
          
          同步器的输入由两个异步时钟域的组合逻辑构成,如下图所示:(还有combo logic)
          
          ![](https://ebaina.oss-cn-hangzhou.aliyuncs.com/wechat-official-crawl/2022-02/164531881729263.jpg)
          
          值得注意的是,如果sig\_a或者sig\_b中有一个信号是stable静态变量,那么上图结构的电路就不会被报fanin\_different\_clks或者combo\_logic错误。
          
          假设有sig\_a、sig\_b、sig\_c三个信号及以上的fan\_in呢?抛开静态变量后,
          
          若所有信号都是同一个时钟域,CDC错误类型就是combo\_logic;
          
          若所有信号来自至少2个时钟域,CDC错误类型就是fanin\_different\_clks;
          
          举个例子,如下图:
          
          ![](https://ebaina.oss-cn-hangzhou.aliyuncs.com/wechat-official-crawl/2022-02/164531881726308.jpg)
          
          上图电路仍会报fanin\_different\_clks,但是电路确实是设计者的意图,我们只需要将TEST时钟域的test\_sel设置为常数0即可。
          
          ### 1.7.1 案列1
          
          - 
          - 
          - 
          - 
          - 
          - 
          - 
          - 
          
          ```
          
          ```
          always @ (posedge tx1_clk)
          ``````
              tx1_sig 
          ``````
          always @ (posedge tx2_clk)
          ``````
              tx2_sig 
          ``````
          always @ (posedge rx_clk) begin
          ``````
              sync0 
          ``````
              sync1 
          ``````
          end
          ```
          ```
          
          ![](https://ebaina.oss-cn-hangzhou.aliyuncs.com/wechat-official-crawl/2022-02/164531881829914.jpg)
          
          ![](https://ebaina.oss-cn-hangzhou.aliyuncs.com/wechat-official-crawl/2022-02/164531881862108.jpg)
          
          时间不早了,暂写到这里,后续接着完善。
          
          感谢阅读文章,如果文章有用,麻烦点个“在看”或转发分享。
          
          ![](https://ebaina.oss-cn-hangzhou.aliyuncs.com/wechat-official-crawl/2022-02/164531881837708.jpg)
          
          转载:全栈芯片工程师
                          
          <
          <
          声明:本文内容由易百纳平台入驻作者撰写,文章观点仅代表作者本人,不代表易百纳立场。如有内容侵权或者其他问题,请联系本站进行删除。
          david
          红包 点赞 收藏 评论 打赏
          评论
          0个
          内容存在敏感词
          手气红包
            易百纳技术社区暂无数据
          相关专栏
          更多相关专栏
          置顶时间设置
          结束时间
          删除原因
          • 广告/SPAM
          • 恶意灌水
          • 违规内容
          • 文不对题
          • 重复发帖
          打赏作者
          易百纳技术社区
          david
          您的支持将鼓励我继续创作!
          打赏金额:
          ¥1易百纳技术社区
          ¥5易百纳技术社区
          ¥10易百纳技术社区
          ¥50易百纳技术社区
          ¥100易百纳技术社区
          支付方式:
          微信支付
          支付宝支付
          易百纳技术社区微信支付
          易百纳技术社区
          打赏成功!

          感谢您的打赏,如若您也想被打赏,可前往 发表专栏 哦~

          举报反馈

          举报类型

          • 内容涉黄/赌/毒
          • 内容侵权/抄袭
          • 政治相关
          • 涉嫌广告
          • 侮辱谩骂
          • 其他

          详细说明

          审核成功

          发布时间设置
          发布时间:
          是否关联周任务-专栏模块

          审核失败

          失败原因
          备注
          拼手气红包 红包规则
          祝福语
          恭喜发财,大吉大利!
          红包金额
          红包最小金额不能低于5元
          红包数量
          红包数量范围10~50个
          余额支付
          当前余额:
          可前往问答、专栏板块获取收益 去获取
          取 消 确 定

          小包子的红包

          恭喜发财,大吉大利

          已领取20/40,共1.6元 红包规则

            易百纳技术社区