1、命名規(guī)則
① 首先每個(gè)文件只包含一個(gè)module,而且module名要小寫(xiě),并且與文件名保持一致;
② 除parameter外,信號(hào)名全部小寫(xiě),名字中的兩個(gè)詞之間用下劃線連接,如receive_clk_b;
③ 由parameter定義的常量要求全部字母大寫(xiě),自己定義的參數(shù)、類型用大寫(xiě)標(biāo)識(shí),推薦使用parameter來(lái)定義有實(shí)際意義的常數(shù),包括單位延時(shí)、版本號(hào)、板類型、單板在位信息、LED亮燈狀態(tài)、電源狀態(tài)、電扇狀態(tài)等;
④ 信號(hào)名長(zhǎng)度不超過(guò)20字符,并且避免使用Verilog和VHDL保留字命令,建議給信號(hào)名添加有意義的前綴或后綴,命名符合常用命名規(guī)范(如_clk 或clk_表示時(shí)鐘, n表示低電平有效, z表示三態(tài)信號(hào), en表示使能控制,rst 表示復(fù)位);
⑤ 保持縮寫(xiě)意義在模塊中的一致性,同一信號(hào)在不同層次應(yīng)該保持一致性。
2、注釋規(guī)則
① 每個(gè)文件有一個(gè)文件頭,文件頭中注明文件名、功能描述、引用模塊、設(shè)計(jì)者、設(shè)計(jì)時(shí)間、版權(quán)信息以及修改信息等;
② 對(duì)信號(hào)、參量、引腳、模塊、函數(shù)及進(jìn)程等加以說(shuō)明,便于閱讀與維護(hù),如信號(hào)的作用、頻率、占空比、高低電平寬度等。用“//”做小于1行的注釋,用“/* */”做多于1行的注釋。更新的內(nèi)容要做注釋,記錄修改原因,修改日期和修改人。
3、模塊規(guī)則
① module例化名用u_xx_x標(biāo)示;
② 建議給每個(gè)模塊要加timescale;
③ 不要書(shū)寫(xiě)空的模塊,即:一個(gè)模塊至少要有一個(gè)輸入和一個(gè)輸出;
④ 為了保持代碼的清晰、美觀和層次感,一條語(yǔ)句應(yīng)占用一行,每行限制在80個(gè)字符以內(nèi),如果較長(zhǎng)(超出80個(gè)字符)則換行;
⑤ 采用基于名字(name_based)的調(diào)用而不是基于順序的(order_based)的調(diào)用;
⑥ 模塊的接口信號(hào)按輸入、雙向、輸出順序定義;
⑦ 使用降序定義向量有效位順序,最低位為0;
⑧ 管腳和信號(hào)說(shuō)明部分:一個(gè)管腳和一組總線占用一行,說(shuō)明要清晰;
⑨ 不要采用向量的方式定義一組時(shí)鐘信號(hào);
⑩ 邏輯內(nèi)部不對(duì)input進(jìn)行驅(qū)動(dòng),在module內(nèi)不存在沒(méi)有驅(qū)動(dòng)源的信號(hào),更不能在模塊端口存在沒(méi)有驅(qū)動(dòng)的輸出信號(hào),避免在elabarate和compile時(shí)產(chǎn)生warning;
? 在頂層模塊中,除了內(nèi)部的互連和module的例化外,避免在做其他邏輯;
? 出于層次設(shè)計(jì)和同步設(shè)計(jì)的考慮,子模塊輸出信號(hào)建議用寄存器;
? 內(nèi)部模塊端口避免inout,最好在最頂層模塊處理雙向總線;
? 子模塊中禁止使用三態(tài)邏輯,可以在頂層模塊使用;
? 如果能確保該信號(hào)不會(huì)被其它子模塊使用,而是直接通過(guò)頂層模塊輸出I/O口,可以在子模塊中使用三態(tài);
? 禁止出現(xiàn)未連接的端口;
? 為邏輯升級(jí)保留的無(wú)用端口和信號(hào)要注釋;對(duì)于層次化設(shè)計(jì)的邏輯,在升級(jí)中采用增量編譯;建議采用層次化設(shè)計(jì),模塊之間相對(duì)獨(dú)立。
4、線網(wǎng)和寄存規(guī)則
① 鎖存器和觸發(fā)器不允許在不同的always塊中賦值,造成多重驅(qū)動(dòng);
② 出于功能仿真考慮,非阻塞賦值應(yīng)該增加單位延時(shí),對(duì)于寄存器類型的變量賦值時(shí),尤其要注意這一點(diǎn);阻塞賦值不允許使用單位延時(shí);
③ always語(yǔ)句實(shí)現(xiàn)時(shí)序邏輯采用非阻塞賦值;always語(yǔ)句實(shí)現(xiàn)的組合邏輯和assign語(yǔ)句塊中使用阻塞賦值;
④ 同一信號(hào)賦值不能同時(shí)使用阻塞和非阻塞兩種方式;
⑤ 不允許出現(xiàn)定義了parameter、wire、reg卻沒(méi)有使用的情況;
⑥ 不建議使用integer類型寄存器;
⑦ 寄存器類型的信號(hào)要初始化;
⑧ 除移位寄存器外,每個(gè)always語(yǔ)句只對(duì)一個(gè)變量賦值,盡量避免在一個(gè)always語(yǔ)句出現(xiàn)多個(gè)變量進(jìn)行運(yùn)算或賦值。
5、表達(dá)式規(guī)則
① 在表達(dá)式內(nèi)使用括號(hào)表示運(yùn)算的優(yōu)先級(jí),一行中不能出現(xiàn)多個(gè)表達(dá)式;
② 不要給信號(hào)賦“x”態(tài),以免x值傳遞;
③ 設(shè)計(jì)中使用到的0,1,z等常數(shù)采用基數(shù)表示法書(shū)寫(xiě)(即表示為1'b0,1'b1,1'bz或十六進(jìn)制);
④ 端口申明、比較、賦值等操作時(shí),數(shù)據(jù)位寬要匹配。
6、條件語(yǔ)句規(guī)則
① if 都有else和它對(duì)應(yīng),變量在if-else或case語(yǔ)句中所有變量在所有分支中都賦值;
② 如果用到case語(yǔ)句,記得default項(xiàng);
③ 禁止使用casex,case語(yǔ)句item必須使用常數(shù);
④ 不允許使用常數(shù)作為if語(yǔ)句的條件表達(dá)式;
⑤ 條件表達(dá)式必須是1bit value;
⑥ 如異步復(fù)位:
高電平有效使用“if(asynch_reset==1'b1)”,
低電平“if(asynch_reset==1'b0)”,
不要寫(xiě)成:
“if(!asynch_reset)”或者“if(asynch_reset==0)”;
⑦ 不推薦嵌套使用5級(jí)以上if…else if…結(jié)構(gòu)。
7、可綜合部分規(guī)則
① 不要使用include語(yǔ)句;
② 不要使用disable、initial等綜合工具不支持的電路,而應(yīng)采用復(fù)位方式進(jìn)行初時(shí)化,但在testbench電路中可以使用;
③ 不使用specify模塊,不使用===、!==等不可綜合的操作符;
④ 除仿真外,不使用fork-join語(yǔ)句;
⑤ 除仿真外,不使用while語(yǔ)句;
⑥ 除仿真外,不使用repeat語(yǔ)句;
⑦ 除仿真外,不使用forever語(yǔ)句;
⑧ 除仿真外,不使用系統(tǒng)任務(wù)($);
⑨ 除仿真外,不使用deassign語(yǔ)句;
⑩ 除仿真外,不使用force,release語(yǔ)句;
? 除仿真外,不使用named events語(yǔ)句;不在連續(xù)賦值語(yǔ)句中引入驅(qū)動(dòng)強(qiáng)度和延時(shí);
? 禁止使用trireg型線網(wǎng);
? 制止使用tri1、tri0、triand和trior型的連接;
? 不要位驅(qū)動(dòng)supply0和supply1型的線網(wǎng)賦值;
? 設(shè)計(jì)中不使用macro_module;
? 不要在RTL代碼中實(shí)例門(mén)級(jí)單元尤,其下列單元:(CMOS/RCOMS/NMOS/PMOS/RNMOS/RPMOS/trans/rtrans/tranif0/tranif1/rtranif0/tranif1/pull_gate)。
8、可重用的部分規(guī)則
① 考慮未使用的輸入信號(hào)power_down,避免傳入不穩(wěn)定態(tài);
② 接口信號(hào)盡量少,接口時(shí)序盡量簡(jiǎn)單;
③ 將狀態(tài)機(jī)(FSM)電路與其它電路分開(kāi),便于綜合和后端約束;
④ 將異步電路和同步電路區(qū)分開(kāi),便于綜合和后端約束,將相關(guān)的邏輯放在一個(gè)模塊內(nèi);
⑤ 合理劃分設(shè)計(jì)的功能模塊,保證模塊功能的獨(dú)立性;
⑥ 合理劃分模塊的大小,避免模塊過(guò)大;
⑦ 在設(shè)計(jì)的頂層(top)模塊,將I/O口、Boundary scan電路、以及設(shè)計(jì)邏輯(corelogic)區(qū)分開(kāi)。
9、同步設(shè)計(jì)規(guī)則
① 同一個(gè)module中,要在時(shí)鐘信號(hào)的同一個(gè)沿動(dòng)作;
② 如果必須使用時(shí)鐘上升沿和時(shí)鐘下降沿,則要分兩個(gè)module設(shè)計(jì);
③ 在頂層模塊中,時(shí)鐘信號(hào)必須可見(jiàn),不在模塊內(nèi)部生成時(shí)鐘信號(hào),而要使用DCM/PLL產(chǎn)生的時(shí)鐘信號(hào);
④ 避免使用門(mén)控時(shí)鐘和門(mén)控復(fù)位;
⑤ 同步復(fù)位電路,建議在同一時(shí)鐘域使用單一的全局同步復(fù)位電路;
異步復(fù)位電路,建議使用單一的全局異步復(fù)位電路;
⑥ 不在時(shí)鐘路徑上添加任何buffer;
⑦ 不在復(fù)位路徑上添加任何buffer;
⑧ 避免使用latch;
⑨ 寄存器的異步復(fù)位和異步置位信號(hào)不能同時(shí)有效;
⑩ 避免使用組合反饋電路;
?always有且僅有一個(gè)的敏感事件列表,敏感事件列表要完整,否則可能會(huì)造成前后仿真的結(jié)果不一致;
? 異步復(fù)位情況下需要異步復(fù)位信號(hào)和時(shí)鐘沿做敏感量,同步復(fù)位情況下只需要時(shí)鐘沿做敏感量;
? 時(shí)鐘事件的表達(dá)式要用:
“negedge
或
“posedge
? 復(fù)雜電路將組合邏輯和時(shí)序邏輯電路分成獨(dú)立的always描述。
10、循環(huán)語(yǔ)句規(guī)則
① 在設(shè)計(jì)中不推薦使用循環(huán)語(yǔ)句;
② 在非常有必要使用的循環(huán)語(yǔ)句時(shí),可以使用for語(yǔ)句。
11、約束規(guī)則
① 對(duì)所有時(shí)鐘頻率和占空比都進(jìn)行約束;
② 對(duì)全局時(shí)鐘skew進(jìn)行約束;
③ 對(duì)于時(shí)序要求的路徑需要針對(duì)特殊要求進(jìn)行約束,如鎖相環(huán)鑒相信號(hào);
④ 要根據(jù)輸出管腳驅(qū)動(dòng)要求進(jìn)行約束,包括驅(qū)動(dòng)電流和信號(hào)邊沿特性;
⑤ 要根據(jù)輸入和輸出信號(hào)的特性進(jìn)行管腳上下拉約束;
⑥ 針對(duì)關(guān)鍵I/O是否約束了輸入信號(hào)和輸入時(shí)鐘的相位關(guān)系,控制輸入信號(hào)在CLK信號(hào)之后或之前多少ns到達(dá)輸入pad;
⑦ 綜合設(shè)置時(shí),fanout建議設(shè)置為3030;
⑧ 要使用輸入輸出模塊中的寄存器,如Xinlinx公司的IOB,map properties選項(xiàng)pack I/O register/latches into IOBsactor需要設(shè)置成為“for input and output”,這樣可以控制管腳到內(nèi)部觸發(fā)器的延時(shí)時(shí)間;
⑨ 布局布線報(bào)告中IOB、LUTs、RAM等資源利用率應(yīng)小于百分之八十;
⑩ 對(duì)于邏輯芯片對(duì)外輸入接口,進(jìn)行tsu/th約束;對(duì)于邏輯芯片對(duì)外輸出接口,進(jìn)行約束。
12、PLL/DCM規(guī)則
① 如果使用FPGA內(nèi)部DCM和PLL時(shí),應(yīng)該保證輸入時(shí)鐘的抖動(dòng)小于300ps,防止DCM/PLL失鎖;如果輸入時(shí)鐘瞬斷后必須復(fù)位PLL/DCM。
② 對(duì)于所有廠家的FPGA,其片內(nèi)鎖相環(huán)只能使用同頻率的時(shí)鐘信號(hào)進(jìn)行鎖相,如果特殊情況下需要使用不同頻率的信號(hào)進(jìn)行鎖相,需要得到廠家的認(rèn)可,以避免出時(shí)鐘。
13、代碼編輯規(guī)則
① 由于不同編輯器處理不同,對(duì)齊代碼使用空格,而不是tab鍵。
編輯:hfy
-
Verilog
+關(guān)注
關(guān)注
28文章
1355瀏覽量
110537 -
鎖存器
+關(guān)注
關(guān)注
8文章
916瀏覽量
41691 -
觸發(fā)器
+關(guān)注
關(guān)注
14文章
2019瀏覽量
61400 -
編輯器
+關(guān)注
關(guān)注
1文章
807瀏覽量
31335
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論