RTL代碼指南PPT課件_第1頁
RTL代碼指南PPT課件_第2頁
RTL代碼指南PPT課件_第3頁
RTL代碼指南PPT課件_第4頁
RTL代碼指南PPT課件_第5頁
已閱讀5頁,還剩71頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、1,RTL代碼指南,怎樣寫RTL代碼才能讓自己、 同事、和老板都滿意,2,RTL代碼要點(diǎn),RTL Coding Basics,3,為什么要有代碼指南,RTL代碼要經(jīng)過邏輯綜合才能變成電路。但綜合前與綜合后的語義可能有差別。 不同的代碼可以實(shí)現(xiàn)相同的函數(shù),但電路的復(fù)雜性卻可能不同。 不同的代碼方式有不同可理解度。寫代碼應(yīng)該考慮到讓別人能讀懂,便利維護(hù),4,RTL代碼要點(diǎn),用簡(jiǎn)單的結(jié)構(gòu)和簡(jiǎn)單始終方案 代碼一致性: 形式一致 變量名字要用一致的慣例 狀態(tài)機(jī)和過程寫法要一致 模塊分割一致,模塊復(fù)雜性應(yīng)相近,所有輸出端口都直接來自存儲(chǔ)元件 使用大量、清晰的說明,有意義的變量名,多用參數(shù)和常量、少用數(shù)字,

2、5,目錄結(jié)構(gòu),為每一個(gè)設(shè)計(jì)造一個(gè)明了的目錄結(jié)構(gòu): HDL源碼目錄和子目錄 分析過的網(wǎng)表目錄 仿真目錄和子目錄 綜合目錄和子目錄 腳本 設(shè)計(jì)庫 核庫 網(wǎng)表 報(bào)告,6,文件頭說明、命名、碼內(nèi)說明,File header, naming convention, and comments,7,文件頭的說明,需要在每個(gè)源文件頭(包括腳本文件)加一段清楚的說明 這個(gè)說明應(yīng)該包括: 法律陳述如保密性、版權(quán)、不可復(fù)制性等 文件名和作者 功能敘述和模塊要點(diǎn) 日期 修改歷史:日期、修改人、修改內(nèi)容,8,* * File: myFile.v * Module: myMod1, myMod2 * Author: BU

3、ZHIDAO * Date:5/12/2009 * Copyright:my company, all rights reserved * Please keep the content of this file confidential. * Description:This module is used to illustrate file header *informational comments * Revision History: *5/15/2009 modified by TL *added a new FIFO */ / Defines / Module header /

4、Inputs/Outputs / Regs and wires / parameters / assignments / Code processes / End of file,9,命名慣例,自己首先制定并記錄命名慣例 文件名和模塊名應(yīng)該相同 用小寫字母命名信號(hào)、變量和端口 data_in, sclk, in_valid, out_ready 用大寫字母命名常數(shù)和自定義的類型 define BUS_WIDTH 64 名字應(yīng)該有意義,例如存儲(chǔ)地址 ra / 不好 ram_addr / 好,10,名字應(yīng)該簡(jiǎn)單、明了、清晰 時(shí)鐘信號(hào)應(yīng)該含有clk sclk, dclk 時(shí)鐘名的一致使用:使用同一時(shí)

5、鐘源的模塊應(yīng)該用同一名字 低值()驅(qū)動(dòng)信號(hào)應(yīng)該加 _n 的后綴 cpu2dsp_n 復(fù)位信號(hào)應(yīng)該有含有 rst 盡量使用N:0而不用0:N 相連的端口和線應(yīng)使用相同或相近的名字 不能使用RTL語言的保留字來命名,11,怎樣寫說明,說明是用來解釋過程、函數(shù)、類型的定義 說明使用指南 用說明來解釋端口、信號(hào)、變量等等 說明應(yīng)該被放在和相關(guān)代碼靠近的地方 說明應(yīng)該是簡(jiǎn)明扼要,也應(yīng)該清晰 說明應(yīng)該注重意義 同一組說明應(yīng)該放在同一位置上(醒目) 每個(gè)代碼段開始時(shí)應(yīng)該有個(gè)總體說明 每個(gè)選擇分支最好也有個(gè)說明 模塊尾應(yīng)該加上模塊的名字做說明,12,不好的說明 i = i+1;/ increment i 好的

6、說明 i = i+1;/ increment buffer index i 更好的說明 i = i+1;/ increment FIFO index i after reading an element 同組的說明按相同位置放置 input sclk;/ System clock input rst_n;/ System reset input N:0 data_in;/ Input data input in_valid;/ Input side valid output in_ready;/ Input side ready,13,module reloadCounter( clk, rs

7、t, ld, cnt, d_in, d_out); input clk, rst; / clock and reset input ld;/ load counter input cnt;/ Count up input 7:0 d_in;/ Input count output7:0 d_out;/ Count reg 7:0 count;/ Count value register / This is the counting process always (posedge clk) begin if (!rst)/ Reset the counter to 0 count = 0; el

8、se if (ld)/ Load the counter with input value count = d_in; else/ Otherwise, increment if called for count = (cnt) ? (count + 1) : count; end endmodule/ reloadCounter,14,代碼的格式指南,Format and Indentation,15,代碼格式1,每個(gè)語句至少用一行,寫的代碼容易讀、容易維護(hù) 每行不要超過72個(gè)字符 每行留出適當(dāng)?shù)倪呺H(indentation) 過長(zhǎng)的行要分成兩行,第二行用合適的邊際來顯示是上一行的繼續(xù) co

9、unt = (!rst) ? 0 : (ld) ? (d_in) : (cnt) ? (count+1) : (count,16,代碼格式2,使用合理邊際來改善可讀性 每向內(nèi)進(jìn)入一層,要縮進(jìn)2-4個(gè)空格 盡量不使用制表符(tab) for(i=0; i8; i=i+1) if (a=0) if (b=0) count = 1; else count = 2; else count = 0,17,代碼格式3,端口定義要按照邏輯順序,在整個(gè)設(shè)計(jì)中要做到順序一致 每個(gè)端口占一行,端口后跟有說明 每一組端口最好也有一個(gè)說明 端口定義按輸入、輸出排序 module reloadCounter( /- G

10、lobal signals - clk,/ System clock rst,/ System reset /- Input ports - cnt,/ Counting signal ld, / Load counter d_in,/ Input data /- Output ports - count/ Counter output,18,代碼格式4,使用函數(shù)來替代重復(fù)的代碼段 盡可能使用可重用的函數(shù) 每個(gè)函數(shù)要加功能和使用說明 / This function converts data from decimal to binary function DATA_WIDTH-1:0 data

11、_convert; inputDATA_WIDTH-1:0 din, offset; begin / Function code here end endfunction / data_convert,19,代碼格式5,給每個(gè)過程塊加一個(gè)有意義的標(biāo)簽 給每個(gè)模塊的特例加一個(gè)有意義的標(biāo)簽 不要把信號(hào)名字復(fù)用到標(biāo)簽上 如果有一個(gè)叫 incr 的信號(hào),那就不要把一個(gè)過程的標(biāo)簽也叫做incr??梢杂胕ncr_proc,20,代碼的可移植性,Portability,21,避免直接使用數(shù)字值參數(shù)和常量,不建議使用的方法 wire7:0 in_bus; reg7:0 out_bus,建議使用的方法 defi

12、ne BUS_WIDTH 8 wireBUS_WIDTH-1:0 in_bus; regBUS_WIDTH-1:0 out_bus,建議將所有的 define語句都放進(jìn)一個(gè) .vh 文件里。 避免在代碼中嵌入邏輯綜合的命令,但Synopsys的綜合開關(guān)命令除外(synopsys_on/off,22,技術(shù)獨(dú)立性,盡量使用Synopsys的DesignWare產(chǎn)生的器件核,如存儲(chǔ)器、FIFO、JTAG等 盡量避免直接調(diào)用門電路或者IP核。非用不可時(shí),用GTECH門電路 當(dāng)不得不調(diào)用門電路或者IP核時(shí),把這些東西盡量放到一個(gè)分開的文件里 最好: result = BUSA * BUSB + BUSC

13、; 一般: DW02_MULT U1(IN1, IN2, CNTRL, PROD); 不好: Vendor_Mult U2(in1, in2, cntrl, prod,23,Synopsys GTECH,AND, OR, NOR gates One bit adder and half-adder 2-of-3 majority Multiplexer Flip-flop Latch Multiple level gates such as AND-NOT, AND-OR, AND-OR-INVERT, etc,24,時(shí)鐘、復(fù)位和同步器,Clock,Reset and Synchronizer

14、,25,盡量避免混合使用正沿觸發(fā)和負(fù)沿出發(fā) 避免在代碼中加入時(shí)鐘緩存器,邏輯綜合軟件會(huì)自動(dòng)插入時(shí)鐘緩存 時(shí)鐘樹的產(chǎn)生應(yīng)該使用專門的輔助設(shè)計(jì)工具,保證時(shí)鐘的分布平衡 避免自己加入門控時(shí)鐘電路。讓邏輯綜合工具自動(dòng)加入門控時(shí)鐘,其結(jié)果可靠,Poor code: assign clk_p1 = clk always (posedge clk_p1) begin / example1_proc / Code block end / example1_proc,Good code: always (posedge clk) begin / example1_proc if (p1_gate = 1b1)

15、/ Code block end / example1_proc,26,避免在內(nèi)部電路自己產(chǎn)生條件復(fù)位。通常,所有的寄存器都應(yīng)該在同一點(diǎn)上復(fù)位 如果一定需要自己的條件復(fù)位,那就產(chǎn)生一個(gè)單獨(dú)的復(fù)位信號(hào),并將條件復(fù)位邏輯隔離在一個(gè)單獨(dú)的模塊中 復(fù)位邏輯的唯一功能應(yīng)該是將寄存器清0,而不應(yīng)該用做其他功能,27,Poor code: always (posedge clk or posedge rst or posedge a) begin : rst_example1 if (rst | a) reg_sig = 1b0; else begin / Code block end end / rst_

16、example1,Good code: / In a separate reset module assign z_rst = rst | a; / In the main module always (posedge clk or posedge z_rst) begin : rst_example1 if (z_rst) reg_sig = 1b0; else begin / Code block end end / rst_example1,28,使用雙重寄存器來實(shí)現(xiàn)同步器,兩個(gè)寄存器用獨(dú)特的名字來命名 從一個(gè)時(shí)鐘域到另一個(gè)時(shí)鐘域的過渡區(qū)中不應(yīng)該有組合邏輯 多位的信號(hào)應(yīng)該使用異步時(shí)序編碼

17、,如葛雷碼,來實(shí)現(xiàn)。不要使用多個(gè)雙重寄存器。參照異步FIFO的設(shè)計(jì)為例,29,面向綜合的代碼,Coding for Synthesis,30,盡量用寄存器來實(shí)現(xiàn)時(shí)序邏輯。 使用自動(dòng)機(jī)的標(biāo)準(zhǔn)格式 使用給定的復(fù)位信號(hào)來制定初始值 不要用initial語句來制初值 盡量不用latch, 但可以調(diào)用GTECH的D latch。下述是適合調(diào)用的例子: 寄存器文檔(register files) FIFO 其他類似的存儲(chǔ)器件 不完整的條件語句會(huì)產(chǎn)生Latch,應(yīng)該避免,31,可以用下面的方法避免產(chǎn)生Latch,32,如果無法避免Latch,那就把它做成可測(cè)試的,33,使用完整的敏感表(sensitivit

18、y list),也可以幫助避免產(chǎn)生錯(cuò)誤,不完整的敏感表: always (a) c = a | b,避免多余的信號(hào)出現(xiàn)在敏感表中就不至于減低仿真速度 組合邏輯必須包含所有出現(xiàn)在右手邊的信號(hào) 時(shí)序邏輯必須包括時(shí)鐘信號(hào)和復(fù)位信號(hào),34,避免組合邏輯中的反饋(變成異步時(shí)序邏輯,上面的代碼還有問題嗎,35,在時(shí)序邏輯中總是使用non-blocking語句 在組合邏輯中盡量使用blocking語句,36,case 和 Ternary expression可以產(chǎn)生選擇器(MUX,速度高) IF 語句產(chǎn)生優(yōu)先權(quán)編碼器(priority encoder,低速度) 用符號(hào)來定義自動(dòng)機(jī)的狀態(tài)名 盡量把自動(dòng)機(jī)邏輯和

19、非自動(dòng)機(jī)邏輯放在不同的模塊中 每個(gè)自動(dòng)機(jī)要有一個(gè)默認(rèn)(default)狀態(tài),37,38,39,只讀常數(shù)表,一組常數(shù)有下面兩種存儲(chǔ)方案 只讀存儲(chǔ)器(ROM) 組合電路表(combinational logic) 常數(shù)表較小時(shí),使用組合電路表更經(jīng)濟(jì)。用case語句來實(shí)現(xiàn)。 常數(shù)表較大時(shí),使用ROM或者RAM來實(shí)現(xiàn)比較合適,40,always (addr) case (addr) 000: table_data = 8b00000001; 001: table_data = 8b00000010; 010: table_data = 8b00000100; 011: table_data = 8b0

20、0001000; 100: table_data = 8b00010000; 101: table_data = 8b00100000; 110: table_data = 8b01000000; 111: table_data = 8b10000000; endcase,組合只讀表的例子,41,算數(shù)代碼的使用,Coding Arithmetic Expressions,42,算數(shù)器件設(shè)計(jì)縱觀,輸入方法選擇 Module Compiler (.mc): uses Module Compiler + DC Verilog (.v file): uses DC ultra 算數(shù)器件積木選擇: e.

21、g. int adder 自己寫的模塊 Synopsys DesignWare模塊 讓綜合工具幫助設(shè)計(jì)算數(shù)部件 寄存器放置的選擇 手選流水線 自動(dòng)綜合流水線 怎樣得到最佳結(jié)果 (QoR),43,Synopsys DC Ultra,輸入方法是標(biāo)準(zhǔn)Verilog DC Ultra 有自己的算數(shù)運(yùn)算器產(chǎn)生器,能產(chǎn)生加法器、乘法器等 DC Ultra 可以合并算數(shù)運(yùn)算來優(yōu)化時(shí)延和面積,如 積的和 和的機(jī) DC Ultra 可以實(shí)現(xiàn)算數(shù)流水線的自動(dòng)重排時(shí),44,DC Ultras優(yōu)化方法,使用Common-subexpression sharing 和 constant folding 使用carry-

22、save adder 來避免串行進(jìn)位 從 RTL 代碼中抽取盡可能多的算術(shù)代碼來進(jìn)行優(yōu)化 流水線的自動(dòng)優(yōu)化(可以在腳本中說明,45,積的和,運(yùn)算合并 為了減少進(jìn)位延遲,幾個(gè)在一起的乘法和加法總是用carry-save adder來實(shí)現(xiàn),46,和的積,和的積: 加法跟著乘法 可以用一個(gè)carry-propagate adder來實(shí)現(xiàn) 通常,乘法只有一個(gè)算子可以是冗余/ carry-save的形式 例如: z = (a + b) * c , z = a * b * c,47,流水線重定時(shí),DC Ultra 可以自動(dòng)對(duì)流水線重定時(shí) 把寄存器放到流水線最佳位置,以滿足時(shí)序要求,48,指南 1: 元件調(diào)

23、用,盡量避免調(diào)用算數(shù)元件 非用不可時(shí),調(diào)用DesignWare的元件 盡量寫RTL的算數(shù)表達(dá)式,不調(diào)用元件 例外 優(yōu)先選擇器(Priority encoders) 首位0 / 1檢測(cè)器(Leading zero/one detectors) 讓邏輯綜合程序來抽取數(shù)據(jù)通道并使用carry-save算數(shù)結(jié)構(gòu),這樣會(huì)產(chǎn)生較好的結(jié)果,49,例: 乘加累積單元,50,指南 2: 數(shù)據(jù)通道代碼的合并,把RTL中數(shù)據(jù)通道相關(guān)的組合邏輯盡量簇到一起,變成一個(gè)單塊 把相關(guān)部分限于單個(gè)模塊中。相關(guān)部分是 共享輸入的部分 相互送信息的部分 可以共享的邏輯 不要在相關(guān)的數(shù)據(jù)通道部分中插入寄存器,讓Retiming工具

24、來自動(dòng)優(yōu)化,51,指南 3: 帶符號(hào)的算術(shù),用 signed 類型 或者 $signed 函數(shù) 進(jìn)行有符號(hào)的 / 補(bǔ)碼算數(shù) (Verilog 2001),結(jié)果更好 適用于乘法器、比較器和右移器 通常,一個(gè)單獨(dú)的加法器無需使用signed 類型或者函數(shù),52,帶符號(hào)的算術(shù)例子,reg 31:0 a, b; / unsigned data types reg 63:0 c, d; / unsigned data types,53,例 2,54,一些暗示,Be very careful about the use of the signed type or $signed operator Try

25、to avoid the signed type altogether. Instead, always cast operands using $signed if sure about it If in doubt, do not use either one Ensure that your RTL code simulates correctly before performing synthesis optimizations,55,指南 4: 符號(hào) / 0 延伸(擴(kuò)展,盡量不要自己來做符號(hào)擴(kuò)展 邏輯綜合能夠恰當(dāng)?shù)貦z測(cè)并實(shí)現(xiàn)算子擴(kuò)展和優(yōu)化 如果需要,使用$signed函數(shù)來隱含地實(shí)現(xiàn)

26、符號(hào)擴(kuò)展,56,指南 5: 不帶符號(hào) / 帶符號(hào)算術(shù),在同一表達(dá)式中,不要將unsigned和signed類型混用 其結(jié)果很難預(yù)測(cè)、也可能出現(xiàn)功能錯(cuò)誤 只要有一個(gè)算子是unsigned,Verilog會(huì)將整個(gè)表達(dá)式當(dāng)成unsigned,57,指南 6: 帶符號(hào)的部分選取,無論算子(operand)的類型是什么,部分選取的結(jié)果總是unsigned 即使部分選取用的是向量的全長(zhǎng),部分選取的結(jié)果總是unsigned input signed 7:0 x 使用x7:0的結(jié)果是unsigned 向量合并(Concatenation,如a7:0,b7:0)的結(jié)果是unsigned,58,帶符號(hào)的部分選取例

27、子,59,指南 7: 自定形算術(shù),沒有上下文的算術(shù)表達(dá)式是自定形算術(shù) 純算術(shù)表達(dá)式 (無論是簡(jiǎn)單還是復(fù)合的) 是有上下文的。例如, foo = (a * b) + c; 混有非算術(shù)函數(shù)的算術(shù)表達(dá)式產(chǎn)生自定形算術(shù)。以下都是非算術(shù)函數(shù) system: $() bundle: unary op: 問題所在: 因?yàn)槌朔ɡ壴诜撬阈g(shù)表達(dá)式中, 上下文丟失了 結(jié)果是, 乘法器的大小變成了max(a14:0, b14:0) 只保留了15位乘法結(jié)果 (上半部15微丟失了). 正確代碼: tmp29:0 = a14:0 * b14:0; foo39:0 = tmp29:0, 10d0 + c39:0,62,指南

28、 7. 自定形算數(shù),系統(tǒng)函數(shù)調(diào)用(SYSTEM CALL MATH)-錯(cuò)誤代碼: foo19:0 = $signed (a9:0 + b9:0); 問題所在: 因?yàn)榧臃ㄇ度朐谙到y(tǒng)函數(shù)中, 上下文丟失了. 結(jié)果是, 加法的大小變成了max(a9:0,b9:0)的,只保留了10位加法結(jié)果(進(jìn)位丟失了). 正確代碼: foo19:0 = $signed (a9:0) + $signed (b9:0,63,指南 7: 擴(kuò)展引理,使用$signed和$unsigned時(shí)應(yīng)格外謹(jǐn)慎 他們的輸出寬度是自定形的,取自輸入算子的最大寬度 避免使用自定形表達(dá)式 使用中間信號(hào)和額外的賦值語句,消除算術(shù)表達(dá)式的二義性

29、,64,指南 8: 表達(dá)式的寬度,有上下文的表達(dá)式的寬度是根據(jù)其算子的寬度來確定的 自定形表達(dá)式的寬度是最寬的算子寬度,65,表達(dá)式的寬度例子,66,指南 9: 可轉(zhuǎn)換的帶符號(hào) / 不帶符號(hào) 數(shù)據(jù)通道,有選擇的做符號(hào)擴(kuò)展來實(shí)現(xiàn)數(shù)據(jù)通道中的unsigned / signed 轉(zhuǎn)換,67,指南 10: 和之積表達(dá)式,Make explicit use of POS, Product-of-Sum expressions Synthesis of increment-multiply structures are especially efficient (a+ci) * c with ci being a single bit Nearly same QoR as just a*c, thanks to Booth recoding,68,指南 11: 算子求補(bǔ),避免直接對(duì)算子求補(bǔ)的代碼( 先求反,再加 “1”)。這是因?yàn)橹苯忧笱a(bǔ)往往不被認(rèn)作是算術(shù)運(yùn)算,會(huì)限制數(shù)據(jù)通道的抽取 例子: a_neg = a + 1 使用算術(shù)符號(hào)“-” 來求補(bǔ) 例子: a_neg = -a 當(dāng)然,如果設(shè)計(jì)師進(jìn)行的非常先進(jìn)的算術(shù)優(yōu)化,上面的規(guī)則就不適用了。這些優(yōu)化可以使例外,69,求補(bǔ)的

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論