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