新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > 復位設計中的結構性缺陷及解決方案

        復位設計中的結構性缺陷及解決方案

        作者: 時間:2014-08-07 來源:網絡 收藏

        復位路徑的組合邏輯

        1.問題(I)

        如果組合邏輯輸入大約在同一時間發生變化,那么使用復位路徑中的組合邏輯可能產生干擾,這可能在設計中觸發虛假復位。下面是一個RTL代碼,它會在設計中意外復位。

        assign module_a_rstb = !((slave_addr[7:0]==8h02 write_enable (wdata[7:0]==00))

        always @(posedge clk or negedge module_rst_b)

        if(!module_rst_b) data_q 00000010 ——> 00000000 ——> 01000000 ——> 01100000“生成過渡。

        在這段時間里,salve_addr為“00000010”,如果wdata[7:0]始終為零且“write_enable”已經被斷言,那么它將在module_rst_b創建一個無用脈沖,從而導致虛假復位。

        本文引用地址:http://www.104case.com/article/256895.htm



        圖6:復位路徑的組合邏輯。


        2.解決方案

        首先注冊組合輸出,然后再將其用作復位源(如圖7所示)。



        圖7:復位路徑的組合邏輯解決方案。


        3.問題(II)

        在上面的示例中,復位路徑的組合邏輯解決方案并不完善。如果組合邏輯輸入大約在同一時間發生變化,那么它可能在設計中觸發虛假復位。然而,如果組合邏輯的輸入信號變化相互排斥,那么它可能不會引起任何設計問題。例如,測試模式和功能模式相互排斥。因此復位路徑的測試復用是有效的設計實踐。

        然而,對于某些情況,變化相互排斥的靜態信號或信號可能會導致設計出現虛假復位觸發。下面的示例描述了此類設計可能出現問題。



        圖8:復位路徑的組合邏輯(問題2)。


        在上面的示例中,多路復用結構用于復位路徑,同時進行RTL編碼。其中“mode”是一個控制信號,不頻繁改變,而mode0_rst_b和mode_1_rst_b是兩個復位事件,然而在合成RTL時,在門控級它被分解成不同的復雜的組合(And-Or-Invert[AOI])信元。雖然在邏輯上它相當于一個多路復用器,但由于不同的信元和凈延遲,每當信號“mode”從1——>0變化時,final_rst_b都會產生干擾。

        4.解決方案

        *在合成過程中在復位路徑保留多路復用結構,因為多路復用結構與其他組合邏輯相比易于產生干擾。MUX Pragma可以在編碼RTL時使用,這將有助于合成工具在復位路徑中保留任何多路復用器。

        設計中的同步復位問題

        1.問題(I)

        在許多地方,設計人員在時鐘方面喜歡同步。原因可能是為了節省一些芯片面積(帶有異步復位輸入的觸發器比任何不可復位觸發器都大)或讓系統與時鐘完全同步,也可能有一些其他原因。對于此類設計,當復位源被斷言時需要向設計的觸發器提供時鐘,否則,這些觸發器可能會在一段時間內都不進行初始化。但當該模塊被插入一個系統時,系統設計人員可能選擇在復位階段禁用其時鐘(如果在一開始不需要激活該模塊),以節省整個系統的動態功耗。因此,該模塊甚至在復位去斷言后一段時間內都不進行初始化。如果該模塊的任何輸出直接在系統中使用,那么將捕獲未初始化和未知的值(X),這可能會導致系統功能故障。



        圖9:同步復位問題時序圖。


        2.解決方案

        在復位階段啟用該模塊的時鐘且持續最短的時間,使該模塊內的所有觸發器都在復位過程中被初始化。當系統復位被去斷言時,模塊輸出不會有任何未初始化的值。



        圖10:同步復位問題已解決。

        3. 問題(II)

        在時鐘域交叉路徑使用兩個觸發同步器是常見做法。然而,有時設計人員對這些觸發器使用同步復位。相同的RTL代碼是

        always @(posedge clk )

        if(!sync_rst_b) begin

        sync1 = 1b0; sync2 = 1b0 ;

        end

        else begin

        sync1 = async_in; sync2 = sync1

        end

        在硬件中進行了RTL合成后,上面的代碼會在雙觸發器同步器的同步鏈中引入組合邏輯,這會帶來風險,并縮短sync2觸發器輸入進入亞穩態的時間。



        圖11:同步復位問題2。


        2. 解決方案

        可用以下方式編寫RTL代碼,以避免同步鏈的組合邏輯。

        always @(posedge clk )

        if(!sync_rst_b) begin

        sync1 = 1b0;

        end

        else begin

        sync1 = async_in; sync2 = sync1

        end

        在上面的代碼中,對sync2觸發器不使用復位,因此在同步鏈中不會實現組合信元。然而,需要注意sync2需要一個額外的周期才能復位,這不應導致設計出現任何問題。



        關鍵詞: 復位設計 SoC 寄存器

        評論


        相關推薦

        技術專區

        關閉
        主站蜘蛛池模板: 米脂县| 噶尔县| 寿宁县| 芷江| 潜江市| 镇平县| 长汀县| 深圳市| 丰台区| 浦东新区| 武定县| 新竹县| 宿松县| 车致| 临安市| 嘉禾县| 衡山县| 巴中市| 汶川县| 郁南县| 于都县| 上犹县| 运城市| 秦皇岛市| 陕西省| 靖西县| 新民市| 皋兰县| 乐山市| 行唐县| 丰镇市| 天全县| 临西县| 东方市| 桃园县| 山阴县| 兴文县| 望谟县| 内丘县| 昔阳县| 婺源县|