chinese直男口爆体育生外卖, 99久久er热在这里只有精品99, 又色又爽又黄18禁美女裸身无遮挡, gogogo高清免费观看日本电视,私密按摩师高清版在线,人妻视频毛茸茸,91论坛 兴趣闲谈,欧美 亚洲 精品 8区,国产精品久久久久精品免费

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

進(jìn)行RTL代碼設(shè)計(jì)需要考慮時(shí)序收斂的問題

454398 ? 來源:AI加速 ? 作者:AI加速 ? 2020-11-20 15:51 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

引言

硬件描述語言(verilog,systemVerilog,VHDL等)不同于軟件語言(C,C++等)的一點(diǎn)就是,代碼對應(yīng)于硬件實(shí)現(xiàn),不同的代碼風(fēng)格影響硬件的實(shí)現(xiàn)效果。好的代碼風(fēng)格能讓硬件“跑得更快”,而一個(gè)壞的代碼風(fēng)格則給后續(xù)時(shí)序收斂造成很大負(fù)擔(dān)。你可能要花費(fèi)很長時(shí)間去優(yōu)化時(shí)序,保證時(shí)序收斂。拆解你的代碼,添加寄存器,修改走線,最后讓你原來的代碼“遍體鱗傷”。這一篇基于賽靈思的器件來介紹一下如何在開始碼代碼的時(shí)候就考慮時(shí)序收斂的問題,寫出一手良好的代碼。

1. Counter結(jié)構(gòu)

計(jì)數(shù)器是在FPGA設(shè)計(jì)中經(jīng)常要用到的結(jié)構(gòu),比如在AXI總線中對接收數(shù)據(jù)量的計(jì)算,用計(jì)數(shù)器來產(chǎn)生地址和last等信號。在計(jì)數(shù)器中需要用到進(jìn)位鏈,進(jìn)位鏈?zhǔn)怯绊憰r(shí)序的主要因素。如果進(jìn)位鏈越長,那么組合邏輯的級數(shù)就越高,組合邏輯延遲越大,能夠支持的最大時(shí)鐘頻率就會越低。在一個(gè)CLB中通常會含有一個(gè)進(jìn)位鏈結(jié)構(gòu),比如在ultrascale中是CARRY8,在zynq7系列中是CARRY4,CARRY4可以實(shí)現(xiàn)4bit進(jìn)位。如果是一個(gè)48bit計(jì)數(shù)器就需要12個(gè)這樣的進(jìn)位結(jié)構(gòu)。一個(gè)CARRY4輸出有兩種CO和O,CO是進(jìn)位bit,用于級聯(lián)到下一級的CARRY4的CI,O是結(jié)果輸出。因此我們可以看到在計(jì)數(shù)器中最下的進(jìn)位結(jié)構(gòu)是CARRY4,如果直接讓多個(gè)進(jìn)位結(jié)構(gòu)級聯(lián),那么組合邏輯就會變大,時(shí)序延遲就會增大。如果可以將計(jì)數(shù)器拆分成小的計(jì)數(shù)器,那么時(shí)序就可以得到改善。


比如一個(gè)48bit計(jì)數(shù)器拆分成3個(gè)16bit計(jì)數(shù)器,那么CARRY4的級聯(lián)級別就從原來的12個(gè)降低到4個(gè)。每4個(gè)之間增加了FF來進(jìn)行時(shí)序改善。

always @(posedge clk)begin
         if(rst)
                   cnt_o <= 0;
         else 
                   cnt_o <= cnt_o + 1;
end  

拆分后代碼為:

genvar i;
generate
for(i=0;i<3;i=i+1)begin: CNT_LOOP
         wire trigger_nxt, trigger_pre;

         if(i == 0)begin
                   always @(posedge clk)begin
                            if(rst)
                                     cnt_o[i*16 +: 16] <= 0;
                            else
                                     cnt_o[i*16 +: 16] <= cnt_o[i*16 +: 16] + 1;
                   end

                   assign trigger_nxt = (cnt_o[i*16 +: 16] == 16'hFFFF) ? 1 : 0;
         end//if
         else begin
                   assign trigger_pre = CNT_LOOP[i-1].trigger_nxt;

                   always @(posedge clk)begin
                            if(rst)
                                     cnt_o[i*16 +: 16] <= 0;
                            else if(trigger_pre)
                                     cnt_o[i*16 +: 16] <= cnt_o[i*16 +: 16] + 1;
                   end 

                   assign trigger_nxt =  CNT_LOOP[i-1].trigger_nxt && (cnt_o[i*16 +: 16] == 16'hFFFF);
         end//else
end//for
endgenerate

綜合后我們就可以看到它的schematic每4個(gè)CARRY4都被FF隔開了,可以降低邏輯延時(shí)。但是代價(jià)是增加了LUT的數(shù)量,這些LUT是用來判斷前一個(gè)16bit計(jì)數(shù)器的數(shù)值的,從而驅(qū)動后邊16bit寄存器計(jì)數(shù)。


2. 邏輯拆分

在上一節(jié)中拆解計(jì)數(shù)器本質(zhì)上就是在拆分組合邏輯。當(dāng)一個(gè)組合邏輯過大的時(shí)候,延時(shí)較大。將其拆解成兩個(gè)或者兩個(gè)以上邏輯,中間增加寄存器可以來提高能跑得時(shí)鐘頻率。比如下圖有一個(gè)較大的組合邏輯,前邊有一個(gè)FF,后邊連續(xù)接2個(gè)FF。組合邏輯的延時(shí)就成為了整體時(shí)鐘頻率的一個(gè)關(guān)鍵路徑。如果我們可以將其拆分成兩個(gè),中間用一級寄存器連接,這樣總共的時(shí)鐘周期還是3個(gè),但是時(shí)鐘頻率明顯會好于前一種。


3. 改善扇出

扇出是指某個(gè)信號驅(qū)動的信號的數(shù)量。驅(qū)動的信號越多,那么要求其產(chǎn)生的電流越大。學(xué)過數(shù)字電路就會知道,當(dāng)一個(gè)信號輸出連接的越多的時(shí)候,其輸出負(fù)載就會越小,那么輸出電壓就會減小。所以如果信號扇出過大就會影響到高低電平,最終就會導(dǎo)致時(shí)序不收斂。另外一個(gè)原因是如果信號扇出過大,那么由于FPGA上走線路徑的差異,就可能造成這個(gè)信號到達(dá)不同地址的延遲不同,造成時(shí)序不同步。一種解決辦法是復(fù)制,將扇出較大的信號復(fù)制幾份,這樣就可以減小扇出。比如一個(gè)輸入d_i需要和3個(gè)數(shù)進(jìn)行求和。那么這個(gè)信號扇出就是3.如果將其復(fù)制3份,給每個(gè)數(shù)輸送一份,那么扇出就變?yōu)?。

always @(posedge clk)begin
         data1_o <= data_i + data1_o;
         data2_o <= data_i + data2_o;
         data3_o <= data_i + data3_o;
end 


如果我們復(fù)制輸入數(shù)據(jù),如下圖,從中可以看出輸入信號復(fù)制了三份,分別接給三個(gè)加法器。

(* keep = "true" *)reg data_rp1;
(* keep = "true" *)reg data_rp2;
(* keep = "true" *)reg data_rp3;   


always @(posedge clk)begin
         data_rp1 <= data_i;
         data_rp2 <= data_i;
         data_rp3 <= data_i;
         data1_o <= data_rp1 + data1_o;
         data2_o <= data_rp2 + data2_o;
         data3_o <= data_rp3 + data3_o;
end


4. URAM和BRAM使用

Xilinx器件中BRAM的大小是36Kbit,如果不使用校驗(yàn)位,可以配置成1-32bit位寬的存儲。比如32x1K。在RTL代碼中使用存儲的時(shí)候,需要適配BRAM大小,這樣可以不浪費(fèi)BRAM存儲空間。比如你需要使用一個(gè)FIFO,那么這個(gè)FIFO位寬32bit,那么它的深度512和1024配置,都消耗了一個(gè)BRAM。

BRAM輸出中最好用register,不要直接接組合邏輯,這樣會增加延時(shí)。BRAM中含有register,如果代碼中輸出有用到register,那么這個(gè)register在綜合時(shí)會被移到BRAM內(nèi)部。如果BRAM外要連接組合邏輯,最好在BRAM的register的外部在添加一個(gè)register,這樣有更好的時(shí)序。


當(dāng)我們需要的存儲空間和位寬都超過了一個(gè)BRAM的時(shí)候,就涉及到多個(gè)BRAM的級聯(lián)問題。如何選擇單個(gè)BRAM的位寬拼接和級聯(lián)BRAM的個(gè)數(shù)呢?比如我們要一個(gè)32bit位寬,深度為2**15大小的存儲。有兩種極限方式來配置BRAM。一種是將每個(gè)BRAM配置為1x32K,那么32個(gè)拼接組成32x32K的存儲。另外一種是將每個(gè)BRAM設(shè)置為32x1K,那么32個(gè)級聯(lián)形成32K深度。前一種不需要多余邏輯來對不同BRAM進(jìn)行選擇操作,但是32個(gè)BRAM同時(shí)讀寫,這樣會增加power。而后一種32個(gè)BRAM級聯(lián)在一起造成延時(shí)路徑較長,同時(shí)需要增加組合邏輯來選擇不同BRAM。但是每次只讀寫一個(gè)BRAM,power較低。可以選擇這兩個(gè)極限的中間值來即降低power也不會有太長的邏輯延時(shí)。可以通過約束條件來進(jìn)行設(shè)置。如下圖。級聯(lián)設(shè)置為4,這樣每次只有8個(gè)BRAM同時(shí)使能。

(* ram_style = "block", cascade_height = 4 *)
reg [31:0] mem[2**15-1:0];
reg [14:0] addr_reg;
always @(posedge clk)begin
         addr_reg <= addr;
         dout <= mem[addr_reg];
         if(we)
                   mem[addr_reg] <= din;
end


URAM的使用方式類似,只不過URAM存儲空間比BRAM大,其可以配置為72x64K大小。

5. 其它

1) 進(jìn)行條件判定的時(shí)候,如果條件過多,盡量減少if-else語句的使用,盡可能用case替代。因?yàn)閕f-else是有優(yōu)先級的,而case條件判斷的平等的。前者會用掉更多邏輯;

2) 在一個(gè)always塊中盡量對一個(gè)信號賦值,不要對具有不同判斷條件的信號同時(shí)賦值,這樣可以減少不必要的邏輯;

3) 盡量使用時(shí)鐘同步復(fù)位,不要使用異步復(fù)位。即要用:

always @(posedge clk)begin

If(rst)

End

而不是

always @(posedge clk or posedge rst)

4) 在使用乘法較多的時(shí)候,使用DSP原語是最好的。一個(gè)DSP除了有乘法功能外,還有前加法器和后加法器,這兩個(gè)是經(jīng)常用到的,可以用來計(jì)算很多功能。DSP的具體使用可以參考DSP的手冊。

總結(jié)

以上總結(jié)了幾點(diǎn)在進(jìn)行RTL代碼設(shè)計(jì)時(shí),最需要考慮的幾種情況。這些對時(shí)序影響很大,需要注意。另外從整體來講,如何選擇一個(gè)好的算法,然后設(shè)計(jì)出一個(gè)簡潔的架構(gòu)更加重要。因?yàn)檫@些是從整體讓你的設(shè)計(jì)有更多靈活的空間。

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報(bào)投訴
  • FPGA
    +關(guān)注

    關(guān)注

    1650

    文章

    22204

    瀏覽量

    626762
  • 寄存器
    +關(guān)注

    關(guān)注

    31

    文章

    5493

    瀏覽量

    127731
  • RTL
    RTL
    +關(guān)注

    關(guān)注

    1

    文章

    392

    瀏覽量

    62026
  • AXI總線
    +關(guān)注

    關(guān)注

    0

    文章

    67

    瀏覽量

    14676
收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關(guān)推薦
    熱點(diǎn)推薦

    AMD Vivado設(shè)計(jì)套件2025.1版本的功能特性

    成型設(shè)計(jì)套件能通過一鍵式時(shí)序收斂,將設(shè)計(jì)從 RTL 階段推進(jìn)到硬件階段,從而幫助縮短迭代周期。讓我們來看看該設(shè)計(jì)套件提供的功能特性。
    的頭像 發(fā)表于 09-23 09:15 ?787次閱讀
    AMD Vivado設(shè)計(jì)套件2025.1版本的功能特性

    rtt使用的軟件i2c庫進(jìn)行模擬i2c時(shí)序時(shí),不需要加臨界區(qū)保護(hù)嗎?

    這里進(jìn)行模擬i2c時(shí)序,不需要加臨界區(qū)的保護(hù)。假如我有一個(gè)低優(yōu)先級的線程正在進(jìn)行i2c讀寫,這時(shí)候有個(gè)高優(yōu)先級的線程進(jìn)行搶占,做了一些工作
    發(fā)表于 09-10 08:09

    使用DAP miniWiggle在ADS中進(jìn)行代碼的工程下載以及進(jìn)入調(diào)試模式進(jìn)行調(diào)試,需要安裝配置什么環(huán)境?

    如題,現(xiàn)在想使用DAP miniWiggle在ADS中進(jìn)行代碼的工程下載以及進(jìn)入調(diào)試模式進(jìn)行調(diào)試,請問需要安裝配置什么環(huán)境以及相關(guān)的有什么操作步驟,感謝解答
    發(fā)表于 07-31 06:08

    ADC和FPGA之間LVDS接口設(shè)計(jì)需要考慮的因素

    本文描述了ADC和FPGA之間LVDS接口設(shè)計(jì)需要考慮的因素,包括LVDS數(shù)據(jù)標(biāo)準(zhǔn)、LVDS接口數(shù)據(jù)時(shí)序違例解決方法以及硬件設(shè)計(jì)要點(diǎn)。
    的頭像 發(fā)表于 07-29 10:01 ?4586次閱讀
    ADC和FPGA之間LVDS接口設(shè)計(jì)<b class='flag-5'>需要</b><b class='flag-5'>考慮</b>的因素

    利用AMD VERSAL自適應(yīng)SoC的設(shè)計(jì)基線策略

    您是否準(zhǔn)備將設(shè)計(jì)遷移到 AMD Versal 自適應(yīng) SoC?設(shè)計(jì)基線是一種行之有效的時(shí)序收斂方法,可在深入研究復(fù)雜的布局布線策略之前,幫您的 RTL 設(shè)計(jì)奠定堅(jiān)實(shí)的基礎(chǔ)。跳過這些步驟可能會導(dǎo)致
    的頭像 發(fā)表于 06-04 11:40 ?458次閱讀

    TDengine 發(fā)布時(shí)序數(shù)據(jù)分析 AI 智能體 TDgpt,核心代碼開源

    2025 年 3 月 26 日,濤思數(shù)據(jù)通過線上直播形式正式發(fā)布了其新一代時(shí)序數(shù)據(jù)分析 AI 智能體——TDgpt,并同步開源其核心代碼。這一創(chuàng)新功能作為 TDengine 3.3.6.0 的重要
    的頭像 發(fā)表于 03-27 10:30 ?471次閱讀
    TDengine 發(fā)布<b class='flag-5'>時(shí)序</b>數(shù)據(jù)分析 AI 智能體 TDgpt,核心<b class='flag-5'>代碼</b>開源

    一文詳解Vivado時(shí)序約束

    Vivado的時(shí)序約束是保存在xdc文件中,添加或創(chuàng)建設(shè)計(jì)的工程源文件后,需要創(chuàng)建xdc文件設(shè)置時(shí)序約束。時(shí)序約束文件可以直接創(chuàng)建或添加已存在的約束文件,創(chuàng)建約束文件有兩種方式:Con
    的頭像 發(fā)表于 03-24 09:44 ?4120次閱讀
    一文詳解Vivado<b class='flag-5'>時(shí)序</b>約束

    英諾達(dá)推出RTL功耗優(yōu)化工具

    英諾達(dá)(成都)電子科技有限公司隆重推出芯片設(shè)計(jì)早期RTL級功耗優(yōu)化工具—EnFortius RTL Power Explorer(ERPE),該工具可以高效、全面地在RTL設(shè)計(jì)階段進(jìn)行
    的頭像 發(fā)表于 03-20 17:06 ?778次閱讀

    ADS1675進(jìn)行高速采集的程序,看時(shí)序圖應(yīng)該會使用PLL進(jìn)行3倍頻,但是這個(gè)PLL需要配置嗎?

    我現(xiàn)在寫ADS1675進(jìn)行高速采集的程序,看時(shí)序圖應(yīng)該會使用PLL進(jìn)行3倍頻,但是這個(gè)PLL需要配置嗎?一直達(dá)不到我想要的結(jié)果。謝謝大哥們,幫幫小弟呀
    發(fā)表于 12-10 08:15

    選擇貼片電感型號時(shí)需要考慮什么參數(shù)?

    在選擇貼片電感型號時(shí),需要綜合考慮多個(gè)參數(shù)以確保電感能夠滿足電路的需求并保證其可靠性。以下是一些關(guān)鍵參數(shù)及其考慮因素: 1. 電感值(Inductance, L) 定義:電感值是電感的標(biāo)稱感值,反映
    的頭像 發(fā)表于 12-02 15:29 ?974次閱讀
    選擇貼片電感型號時(shí)<b class='flag-5'>需要</b><b class='flag-5'>考慮</b>什么參數(shù)?

    選擇數(shù)據(jù)采集器時(shí)需要考慮的因素

    在選擇數(shù)據(jù)采集器時(shí),需要考慮以下關(guān)鍵因素,以確保所選設(shè)備能夠滿足特定應(yīng)用需求并具有良好的性能和可靠性: 采集需求 : 數(shù)據(jù)類型和數(shù)量 :確定需要采集的數(shù)據(jù)類型(如溫度、濕度、壓力、位移、速度等)和數(shù)
    的頭像 發(fā)表于 11-28 16:02 ?1198次閱讀

    ASIC集成電路設(shè)計(jì)中的常見問題

    標(biāo)準(zhǔn)單元門的方式編碼,因?yàn)檫@可能降低代碼的可讀性,并在采用新的單元庫或新工藝時(shí)需要反復(fù)修改代碼。 在定義時(shí)序塊時(shí),需要注意哪些信號
    的頭像 發(fā)表于 11-20 15:46 ?1476次閱讀

    RTL8192CU驅(qū)動

    RTL8192CU驅(qū)動,支持WINXP/7/10
    發(fā)表于 10-29 10:17 ?5次下載

    如何創(chuàng)建虛擬時(shí)鐘

    通常RTL設(shè)計(jì)要求對芯片/module的輸入信號進(jìn)行reg_in打拍處理,對芯片/module的輸出也要求做reg_out打拍處理,這是良好的代碼習(xí)慣,為時(shí)序
    的頭像 發(fā)表于 10-23 09:40 ?1052次閱讀
    如何創(chuàng)建虛擬時(shí)鐘

    使用IBIS模型進(jìn)行時(shí)序分析

    電子發(fā)燒友網(wǎng)站提供《使用IBIS模型進(jìn)行時(shí)序分析.pdf》資料免費(fèi)下載
    發(fā)表于 10-21 10:00 ?1次下載
    使用IBIS模型<b class='flag-5'>進(jìn)行時(shí)序</b>分析