Verilog編碼規(guī)范_第1頁
Verilog編碼規(guī)范_第2頁
Verilog編碼規(guī)范_第3頁
Verilog編碼規(guī)范_第4頁
Verilog編碼規(guī)范_第5頁
已閱讀5頁,還剩12頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、Verilog語言編碼規(guī)范版本修改內(nèi)容修改人時間1.0初始文檔趙文哲2011-08維護人:趙文哲 E-mail:venturezhao verilog語言編碼規(guī)范1. 關(guān)于verilog語言編碼規(guī)范本編碼規(guī)范由西安交通大學(xué)人機所電視組全體學(xué)生和創(chuàng)芯公司全體員工共同編寫和維護。以此來維護DTV系列芯片的verilog源碼的可讀性,健壯性和易維護性。該文檔主要致力于verilog語言的編碼標準化,同時也適用于其他相似的硬件描述語言,如VHDL等。使代碼易于管理的方法之一是增強代碼的一致性,讓別人讀懂自己的代碼是非常重要的事情。因此,保持自己的代碼符合統(tǒng)一的規(guī)范是一個編碼者的基本素質(zhì)。如果自己的編碼

2、風(fēng)格與本文檔的規(guī)定實在不同,無法忍受,請與維護者聯(lián)系,在組內(nèi)會議上統(tǒng)一討論解決方案。此外,如其他人對該編碼規(guī)范有任何建議和批評,歡迎聯(lián)系該規(guī)范的維護者。維護者的聯(lián)系方式詳見首頁的維護列表。關(guān)于本文檔讀者,文檔主要規(guī)范了verilog語言的寫法和格式,并不介紹verilog語言的語法。請讀者自己學(xué)習(xí)verilog語言的基礎(chǔ)知識。2. 項目文件組織形式一般而言,項目的文件需要統(tǒng)一的存放在一個統(tǒng)一的文件夾下。根據(jù)各自功能不同,分門別類的存放。以項目proj-xx為例,其文件存儲方式如表1所示。表1 項目文件組織proj-xx|-doc|-datasheet|-specification|-inc|-

3、ip|-sim_utility|-altera_utility|-xilinx_utility|-dc_utility|-rtl|-sim|-proj_sim|-subproj_sim|-softcode|-adc|-dac|-ddr|-probe|-dc|-pt|-fp|-pr|-synplifydoc:存放項目相關(guān)的文檔,包括該項目用到的datasheet,芯片規(guī)格書(specification)等等。inc:存放項目所用到的頭文件。主要是整個項目所用到的整體的定義。ip:存放商業(yè)上購買的成熟IP以及項目中一些成熟的可復(fù)用的代碼。一般的,ip分為sim、FPGA以及DC版本。rtl:存放項

4、目的rtl代碼。這是項目的核心,文件名與module名稱應(yīng)當(dāng)一致,同時按照模塊的層疊關(guān)系進行存放,必要時也可以采用平行結(jié)構(gòu)存放。sim:存放項目的仿真代碼。一般在sim中建立一級子項目,使得sim文件恰恰在項目的兩級子目錄下。仿真文件的尋址需要上朔兩級從根目錄開始,這樣當(dāng)文件發(fā)生變動時,文件的尋址不需要多么大的改動。softcode:存放芯片設(shè)置之外,但是仿真平臺需要的模塊。僅僅用在sim之中。一般存放有仿真用adc、dac、片外ram等等。dc:存放synopsys DC綜合后的結(jié)果。pt:存放synopsys PT檢查的時序報表。fp:存放后端工具floor plan后的網(wǎng)表和延時文件。p

5、r:存放后端工具place&route后的網(wǎng)表和延時文件。synplify:存放synplify工具綜合后的網(wǎng)表。單單看上面的介紹,可能還是無法直觀的看出我們所編寫的代碼的存放位置。圖1直觀的給出了文件的組織形式。rtl文件夾中存放有芯片內(nèi)部的數(shù)字邏輯;ip文件夾中存放有芯片內(nèi)部的模擬部分和可復(fù)用部分。softcode文件夾中存放有芯片外部的供仿真平臺(testbench)使用的模塊。而testbench文件則直接存放在sim文件夾之中。圖1 文件組織形式框圖3. verilog文件內(nèi)部組織形式Verilog文件主要有以下幾個部分組成:開頭聲明,文件引用,時間單位定義,module I

6、O聲明,宏定義,module IO定義,wire&reg定義,parameter定義,module具體實現(xiàn)。關(guān)于這幾個部分的組織形式,請參考附錄里的”sample.v”文件。本章節(jié)主要介紹除module具體實現(xiàn)之外的其他環(huán)節(jié)的規(guī)定和注意事項。而關(guān)于module具體實現(xiàn)部分將根據(jù)該module是否可綜合,分為之后的兩個章節(jié)來分別闡述。1) 開頭聲明每一個verilog文件的開頭部分,都必須有一段聲明的文字。該段文字如表2所示,聲明文件的版權(quán),作者,修改日期以及修改內(nèi)容介紹等等。表2 文件的開頭聲明/ *Declaration* / This Verilog file was develo

7、ped by The Institute of Artificial Intelli- / gence and Robotics, Xi'an Jiaotong University. This file contains infor- / mation confidential and proprietary to The Institute of Artificial / Intelligence and Robotics, Xi'an Jiaotong University. It shall not be / reproduced in whole, or in par

8、t, or transferred to other documents,or / disclosed to third parties, or used for any purpose other than that for / which it was obtained, without the prior written consent of The Institute / of Artificial Intelligence and Robotics, Xi'an Jiaotong University. This / notice must accompany any cop

9、y of this file. / / Copyright (c) 1986-2011 The Institute of Artificial Intelligence and / Robotics,Xi'an Jiaotong University. All rights reserved / / File name: / Author: venturezhao / Date: 2011-01-01 00:00 / Version Number: 1.0 / Abstract: / / Modification history:(including time, version, au

10、thor and abstract) / 2011-01-01 00:00 version 1.0 venturezhao / Abstract: Initial / / *end* /該段注釋可以用vim,emacs等高級編輯器直接生成,見附錄的vim配置文件。也可以直接拷貝該段文字,再進行修改,見附錄ultraedit文件夾中的”sample.v”。如果對該文件進行了修改,請在開頭聲明中添加以下語句,如表3所示。表3 文件的修改聲明/ Modification history:(including time, version, author and abstract) / 2011-01-

11、01 00:00 version 1.0 venturezhao / Abstract: Initial / / Modification history:(including time, version, author and abstract) / 2011-01-02 00:00 version 1.1 venturezhao / Abstract: modified the clock field. / /2) module之前的聲明在文件的開頭聲明之后,接下來需要包含(include)本文件所需的頭文件,以及聲明本文件內(nèi)的時間單位(timescale)。如表4所示。表4 module

12、之前的聲明/ INCLUDE FILEinclude "././inc/sample.vh"/ MODULE DECLARATIONtimescale 1ns/1ps補充:之所以將timescale放在include之后,是因為有時候頭文件中也會定義時間單位,從而造成時間單位混淆的隱含錯誤。3) IO口定義規(guī)范module的IO口定義格式有很多種,本文檔目前規(guī)定采用verilog-95的格式,在module中聲明,在module內(nèi)部定義的方式。如表5所示。表5 module的IO口定義規(guī)范/-/ INDEX: Module/-module moudule_name( / r

13、eset & clock ngreset, clk, / input signal vi_video, / output signal vo_video, / parameter TYPE);/-/ INDEX: 2. Interface/-/ reset & clockinput ngreset;input clk;/ input signalinput 9:0 vi_video;/ output signaloutput9:0 vo_video;/ parameterinput 7:0 TYPE;4) wire與reg的定義位置一個module中的變量聲明可以集中放在一起,

14、有時也可以隨時使用隨時定義。但是對于稍微復(fù)雜的模塊而言,隨時使用隨時定義的方式將會產(chǎn)生前后混淆的問題,同時代碼維護時的復(fù)雜度也高于集中放在一起的情況。因此,本文檔規(guī)定,將reg與wire的定義放在緊跟著module的IO定義之后。5) 變量定義的對齊方式為了代碼的移植方便,同時增加可讀性。本文檔規(guī)定采用統(tǒng)一的空格方式。關(guān)鍵字input,output,inout,reg,wire等應(yīng)當(dāng)與0列對齊;總線(bus)的位寬聲明應(yīng)當(dāng)與7列對齊;IO口,變量名稱應(yīng)當(dāng)與17列對齊。如果總線位寬過長,導(dǎo)致變量名稱無法對齊至17列,則需要以內(nèi)容為單位,將局部的一些變量統(tǒng)一以4為單位后移。如表6所示。表6 變量定

15、義的對齊標準input ngreset;input clk;input 9:0 vi_video;output9:0 vo_video;input 7:0 TYPE;reg 4:0 cur_state,next_state;reg 7:0 TYPE_D,TYPE_R;wire 9:0 video_calc;wire contrl;reg 9:0 vo_video;6) 變量的命名方式變量的命名方式有很多種,本規(guī)范規(guī)定采用如下方式:變量定義時,根據(jù)意義將單詞簡寫成3-8個字符,然后之間用下劃線連接。變量的大小寫也有一定的規(guī)定:對于芯片的全局寄存器列表及其相關(guān)變量,本規(guī)范規(guī)定采用全部大寫的形式;對

16、于define或parameter,一般采用大寫的形式。而對于其他的變量盡量采用小寫或者大小寫混合的形式。表7 變量的命名方式input ngreset; /resetinput clk; /clockinput 9:0 vi_video;/一般的變量,采用縮寫加下劃線形式output9:0 vo_video;input 7:0 TYPE; /全局寄存器reg 4:0 cur_state,next_state;reg 7:0 TYPE_D,TYPE_R;/全局寄存器相關(guān)變量wire 9:0 video_calc;wire contrl;reg 9:0 vo_video;parameter IN

17、IT = 5'h1; /parameterparameter START = 5'h2;7) always模塊的對齊格式在module的具體實現(xiàn)中,begin和end的對齊方式有很多種。本文檔規(guī)定以下兩種允許使用的格式。第一種格式如表8所示,begin跟在判斷行之后,當(dāng)碰見end else begin時,正好可以放在一行。每一次的包含關(guān)系時,語句向后遞推4列,以形成層疊關(guān)系。第二種格式如表9所示,begin重新開一行,end與begin對齊。這種方式在出現(xiàn)end else begin時,會占用額外的兩行。論行數(shù),這與C語言的行數(shù)一樣,但是純字母的方式畢竟沒有大括號直觀。其層疊關(guān)

18、系與第一種方式一致??偟膩碚f,這兩種格式都可以,但本文檔還是推薦使用第一種格式。除此以外的別的方式,如依次空三列等方式被禁止使用。表8 always模塊的一種對齊格式always (posedge clk or negedge ngreset) beginif (!ngreset) begin cur_state <= INIT;end else begin cur_state <= next_state;endend表9 always模塊的另一種對齊格式always (posedge clk or negedge ngreset)beginif (!ngreset)begin c

19、ur_state <= INIT;endelsebegin cur_state <= next_state;endend8) 空格與tab之爭代碼中表示層疊關(guān)系時,空格和tab是兩種常見的實現(xiàn)形式。其優(yōu)劣眾說紛紜。有人說空格好,因為空格的適用范圍將比較廣,在各個編輯器下都可以無差別的打開。也有人說使用tab表示層疊關(guān)系時,編寫代碼時將會比較方便,因為按一個tab會比按4個空格的速度要快。本規(guī)范規(guī)定代碼中必須使用空格。首先是器適用范圍較廣,其次是在vim或者別的高級文字編輯器下,將tab直接轉(zhuǎn)化成空格的使用方法十分方便,根本察覺不出使用空格時的麻煩。最重要的是,統(tǒng)一使用空格會使得代碼

20、維護工作變得簡單和統(tǒng)一。9) 行內(nèi)與行間限制一行的字符不得超過第80列。這樣便于代碼的瀏覽,不需要將文件橫向滾動,或者因為編輯器自動換行而使得結(jié)構(gòu)凌亂。換行后,可以在當(dāng)前行向后遞推4列處開始,也可以按照語義來進行對齊。一行的末尾不能是空格。首先,這樣的空格毫無意義;其次,行尾的空格對于文檔編輯時,會造成操作上的不便。行間的空格不可超過2行。過多的空行沒有任何意義。表10 行內(nèi)與行間限制always (posedge clk or negedge ngreset) beginif (!ngreset) begin cur_state <= INIT;end else begin cur_s

21、tate <= next_state; /error行尾不得有空格endend/<-空行不得超過2行always (posedge clk or negedge ngreset) beginif (!ngreset) begin cur_cnt <= INIT;end else begin cur_cnt <= (cur_state = TRANSFER)? (test_cnt<<4) + addr3:0 :(test_cnt<<8) + addr7:4; /ok超過80列時,換行繼續(xù)endend10) 注釋對源代碼注釋時,不得直接翻譯語法。應(yīng)當(dāng)

22、指出當(dāng)前語句的目的或者意義。如表11所示,cur_count和cur_cnt分別依次加1。如果注釋僅僅是說明這一點,那么這個注釋可以直接刪掉,這沒有任何意義。正確的做法是,注釋中說明該變量的含義,以及加1的目的。另外,錯誤的注釋比沒有注釋更糟糕。因此,在維護代碼時,首先考慮更新的,應(yīng)該是代碼的注釋。當(dāng)代碼注釋無法清晰的表達出該段代碼的意義時,建議使用另外的文檔來說明,并在代碼處注明鏈接關(guān)系。表11 注釋always (posedge clk or negedge ngreset) beginif (!ngreset) begin cur_count <= INIT;end else be

23、gin cur_count <= next_count + 1; / cur_count遞增 /error沒有必要endendalways (posedge clk or negedge ngreset) beginif (!ngreset) begin cur_cnt <= INIT;end else begin cur_cnt <= next_cnt + 1; / cur_cnt記錄DDR2 SDRAM AF的遞增時間/ok可以endend4. 可綜合verilog語言設(shè)計可綜合verilog語言由時序邏輯和組合邏輯兩部分構(gòu)成。verilog語言的綜合就是對這兩種邏輯進行

24、匹配嵌套和翻譯的過程。因此,在書寫可綜合verilog語言時,為了得到簡單的,可控的硬件實現(xiàn),一般在代碼結(jié)構(gòu)上使用特定的結(jié)構(gòu),而不會寫一些較為怪異的結(jié)構(gòu),使得綜合結(jié)果變差。由于編寫可綜合verilog語言的目的是將其綜合成硬件電路,因此在編寫可綜合verilog語言時,首先應(yīng)想到該代碼所代表的硬件電路是什么,只有這樣才不會犯一些低級錯誤,比如說將兩個輸出接到一個輸入上,組合邏輯出現(xiàn)了死循環(huán)等等。值得注意的是,verilog語言的變量類型,wire和reg,與當(dāng)前電路是時序邏輯還是組合邏輯沒有任何關(guān)系,它們僅僅是從verilog語法上定義的兩種類型。時序邏輯與組合邏輯的實現(xiàn)只取決于verilog

25、代碼的結(jié)構(gòu)。由于時序邏輯和組合邏輯本身的特點,其賦值類型也分為了阻塞賦值與非阻塞賦值兩種。為綜合方便,不得在兩種邏輯中混用這兩種賦值。鎖存器是一種比較省資源的ASIC邏輯,但由于現(xiàn)在的綜合工具沒有很好的辦法對其進行約束,并且在FPGA下的實現(xiàn)過于復(fù)雜。同時它的出現(xiàn)多數(shù)是由于編碼者的疏忽而產(chǎn)生的,因此一般情況下不得使用鎖存器來實現(xiàn)邏輯。當(dāng)遇到跨時鐘域的情況時,一般有雙跳技術(shù)或者通過異步SRAM等方式進行隔離。同時復(fù)位也是一個非常重要的問題。關(guān)于上述話題請查閱相關(guān)的資料,下面主要介紹可綜合verilog語言的編碼規(guī)范。1) 時序邏輯與組合邏輯同步數(shù)字電路有時序邏輯和組合邏輯組成。在可綜合veril

26、og語言中,這兩種邏輯都有著固定的寫法,表12所示為時序邏輯的寫法;表13所示為組合邏輯的幾種寫法。對于變量的定義而言,寄存器型的變量是指在always模塊中被賦值的變量,如reg、integer、time等等;網(wǎng)型的變量是指在assign模塊中被賦值的變量,如wire,tri等等。需要注意的是,這兩種類型的變量與verilog的語法有關(guān),而與綜合后的硬件實現(xiàn)無關(guān)。請參考表12和表13的定義。并不是說綜合后是連線的變量在定義時就一定是網(wǎng)型的,只能說verilog語言本身還需要發(fā)展和完善。當(dāng)對綜合后的連線有屬性說明時,請人為的將其賦值到網(wǎng)型變量上,以便指明屬性。表12 時序邏輯reg 7:0 c

27、ur_count;/.always (posedge clk or negedge ngreset) beginif (!ngreset) begin cur_count <= INIT;end else begin cur_count <= next_count + 1; endend表13 組合邏輯reg 7:0 cur_count;wire contrl;/.always (*) begin cur_count = next_count + 1; endassign contrl = (cur_state=START)? 1'b0 : 1'b1;2) 阻塞賦值

28、與非阻塞賦值verilog語言的賦值方式有兩種,阻塞賦值”=”和非阻塞賦值”<=”。之所以會出現(xiàn)這兩種賦值方式,是由時序邏輯和組合邏輯的特性所決定的。由于在組合邏輯中,由于所有的賦值操作都在當(dāng)前clock內(nèi)完成,因此我們認為其賦值操作會立即生效。阻塞賦值的含義正好與其吻合。在時序邏輯中,由于所有的賦值操作都在下一個clock內(nèi)生效,因此我們認為其賦值操作在當(dāng)前時刻不能生效。這與非阻塞賦值的含義相同。有鑒于此,任何在組合邏輯中使用非阻塞賦值,或者在時序邏輯中使用阻塞賦值的寫法都是有悖于硬件實現(xiàn)的。在可綜合verilog語言中,這種混用方式是被禁止的。3) 同步跨時鐘域的信號在verilog

29、具體實現(xiàn)的最開始,應(yīng)當(dāng)首先處理需要通過雙跳方式同步的信號。將這些信號進行兩級flip-flop延時。注意內(nèi)部的大小寫關(guān)系和命名方法,具體的請參見表14。表14 同步跨時鐘域信號/ synchronized signalalways (posedge clk or negedge ngreset) beginif (!ngreset) begin TYPE_D,TYPE_R <= 2'h0; v_ctrl_d,v_ctrl_r <= 2'h0;end else begin TYPE_D,TYPE_R <= TYPE,TYPE_D; v_ctrl_d,v_ctrl

30、_r <= v_ctrl,v_ctrl_d;endend補充:對于可以用雙跳方式同步的信號,一般而言是變化比較緩慢的單根信號。或者幾乎不變的一組信號。對于遞增或遞減的信號,應(yīng)當(dāng)采取格雷碼編碼的方式。4) 有限狀態(tài)機(FSM)的寫法有限狀態(tài)機的實現(xiàn)有幾種經(jīng)典的寫法,這里我們推薦下面這一種方式,如表15所示。表15 FSM的書寫格式/ FSMalways (posedge clk or negedge ngreset) begin if (!ngreset) begin cur_state <= INIT; end else begin cur_state <= next_sta

31、te; endendalways (*) begin case(cur_state) INIT: begin next_state = START; end START: begin next_state = INIT; end default: next_state = INIT; endcaseendalways (*) begin case(cur_state) INIT: begin sig_out = 1'b0; end START: begin sig_out = 1'b1; end default: sig_out = 1'b0; endcaseend這種

32、寫法清晰地將組合邏輯與時序邏輯分開,可以方便的識別出代碼所對應(yīng)的硬件邏輯。當(dāng)書寫熟練之后,也可以將next_state生成與cur_state延時寫在一起,但應(yīng)當(dāng)清楚寫在一起后的代碼可以清晰的拆成當(dāng)前的這種形式。補充:在處理較為復(fù)雜的電路邏輯時,一般都是以組合邏輯,即一個clock內(nèi)的邏輯,作為思考的出發(fā)點。因此組合邏輯才是電路邏輯的根本。思考問題的時候應(yīng)當(dāng)以組合邏輯的方式來進行思考,當(dāng)需要延時到下一個clock時,才會出現(xiàn)時序邏輯。我們在分析帶有條件判斷的時序邏輯時,一定要明確這其實是一個組合邏輯和一個時序邏輯的簡寫形式。5) 鎖存器與循環(huán)邏輯verilog語言中,如果判斷語句的分支沒有補全

33、,則verilog語法規(guī)定,將其默認補全為賦值為當(dāng)前值。對于時序邏輯而言,這只是將flip-flop的輸出送給了輸入處得組合邏輯而已,沒有任何問題。而對于組合邏輯而言,為了實現(xiàn)賦值為當(dāng)前值,由于組合邏輯本身沒有存儲單元,一般會綜合成一個鎖存器(latch),以保持當(dāng)前值。對于latch而言,由于沒有合適的綜合工具,設(shè)計時一般不會被采用。這就要求在書寫代碼時,必須對組合邏輯的判斷分支進行補全,且不得出現(xiàn)將變量自身賦給自身的情況。在組合邏輯中將變量自身賦給自身,稱之為循環(huán)邏輯。在同一段always塊或者assign語句中,這種邏輯容易被發(fā)現(xiàn)。而如果在多個塊中,也出現(xiàn)了多級的循環(huán)賦值時,該邏輯也會出

34、現(xiàn)問題。需要重新分析電路,并重新設(shè)計。表16 鎖存器的出現(xiàn)與循環(huán)邏輯/ 出現(xiàn)Latch的隱含形式always (*) begin if(condition) begin latch_i = 2'h0; end /error條件沒有補全,會產(chǎn)生Latchend/ 出現(xiàn)Latch的顯式形式always (*) begin if(condition) begin latch_i = 2'h0; end else begin latch_i = latch_i; /error自身賦給了自身,會產(chǎn)生Latch endend/ 循環(huán)邏輯always (*) begin circum_var

35、 = var01; /error在組合邏輯中循環(huán)賦值endassign var01 = var02;assign var02 = circum_var;補充:使用verilog-95的語法時,當(dāng)always模塊為組合邏輯時,當(dāng)敏感變量不全,會發(fā)生什么情況?有一種說法是,會產(chǎn)生鎖存器。這種說法是不確切的,不信請嘗試一下在不用異步flip-flop的條件下,只用鎖存器來實現(xiàn)其硬件電路。正確的解釋是:這將會造成仿真與綜合不一致。在綜合時,綜合器并不考慮敏感變量列表,會將其直接綜合成組合邏輯。而仿真平臺會根據(jù)敏感變量列表來進行判斷是否執(zhí)行該段語句。這樣會造成仿真與綜合的失配。6) 關(guān)鍵路徑優(yōu)化為了盡可

36、能快的提高verilog綜合后的工作頻率,需要對代碼中,組合邏輯最長的邏輯進行優(yōu)化。最根本的優(yōu)化方法是優(yōu)化電路的邏輯設(shè)計。除此以外,規(guī)范書寫的格式也可以提高部分效率。例如,改變條件判斷的次序,盡量將時間最長的判斷分支放在最外層。將條件判斷的分支時間盡量平衡,也可以提高一部分的效率。如表17所示。表17 優(yōu)化條件分支判斷/ 優(yōu)化條件分支判斷always (*) begin if(count=refresh_cnt+8'hf0) /ok將延時最長的判斷邏輯放在條件判斷的最外層 rslt = refresh_cnt; else if(cur_state=START) rslt = 8'

37、;h0; else rslt = rslt_next;end7) 三態(tài)門與雙向IO在數(shù)字電路的內(nèi)部,一般不適用三態(tài)門,和雙向IO。如果內(nèi)部出現(xiàn)了三態(tài)門的高阻態(tài)時,其懸浮的電路將會消耗較高的功率。而inout接口在ASIC時一般會有專門的雙向IO PAD來實現(xiàn),最好將其保持成sig_i,sig_o,sig_e的形式,直到芯片的PAD處。如表18所示。表18 雙向IO/ 雙向IO/ inout signalinput 7:0 contrl_sig_i;output7:0 contrl_sig_o;output contrl_sig_e;8) 數(shù)組的使用與for循環(huán)在可綜合verilog語言中使用數(shù)

38、組,一般的目的是對相同屬性的一組變量進行簡寫。其操作一般與for循環(huán)共同使用。for循環(huán)在可綜合的verilog語言中,其目的也是對一組相同的操作進行簡寫。因此,它的循環(huán)次數(shù)必須是在綜合前就已經(jīng)確定的??梢詫⑺归_成確定的語句來直觀的理解。9) synopsys綜合原語由于綜合器要對代碼進行優(yōu)化。為了優(yōu)化過程可以按照我們的要希望來進行,在使用synopsys兼容的綜合工具時,如DC,synplify,Quartus等,需要使用synopsys綜合原語。常用的綜合原語有:/* synthesis noprune*/:防止reg或module在綜合后因優(yōu)化而刪掉。/*synthesis prese

39、rve*/:防止reg或module在綜合后被優(yōu)化成常數(shù)。/*synthesis keep*/:防止wire在綜合后因優(yōu)化而刪掉。/synthesis full_case:聲明case語句已經(jīng)列完了所有情況,其他情況下保持原值。在case處在組合邏輯中時,有可能導(dǎo)致綜合出鎖存器。/synthesis parallel_case:聲明case語句的條件是互不相容的。/synthesis translate_on: 聲明在此之下的代碼必須被綜合,與translate off配對使用。/synthesis translate_off: 聲明在此之下的代碼不被綜合,與translate on配對使用。

40、值得注意的是,這些語句一般是在調(diào)試時使用。不夠清晰的使用這些指令會導(dǎo)致仿真與綜合的失配。需要謹慎使用。表19 synopsys綜合原語/-/ INDEX: Module/-module moudule_name( / reset & clock ngreset, clk, / input signal vi_video, / output signal vo_video, / parameter TYPE)/*synthesis noproune*/; /保持module不被優(yōu)化/-/ INDEX: 2. Interface/-/ reset & clockinput ngre

41、set;input clk;/ input signalinput 9:0 vi_video;/ reg & wirereg test_reg/*synthesis noproune*/; /保持reg不被優(yōu)化wire test_wire/*synthesis keep*/; /保持wire不被優(yōu)化5. 仿真用Verilog語言設(shè)計對于硬件描述語言而言,仿真環(huán)境的搭建是非常重要的一步。一般而言,在正式編碼之前,應(yīng)當(dāng)首先建立該平臺的仿真環(huán)境。一個完善的仿真環(huán)境對于可綜合verilog代碼編寫和調(diào)試都有莫大的幫助。verilog語言最初就是為了搭建仿真環(huán)境而設(shè)計的。它除了目前用于描述實際硬

42、件電路以外,還可以用于它的最初的工作,HDL仿真環(huán)境的搭建。用于仿真的verilog語言可以使用一些與硬件無關(guān)的函數(shù)或資源,不需要考慮實際的硬件限制,從而可以模擬芯片的外圍工作環(huán)境,并實現(xiàn)整體的仿真環(huán)境。此外,對于verilog的仿真環(huán)境,還需要熟悉特定軟件的配置。以nc-verilog為例,需要熟悉它的命令行工作模式。下面介紹仿真用verilog的規(guī)范。1) task與functiontask與function是仿真用verilog中增加的功能。task可以描述一段與時序相關(guān)的操作;而function只能描述與時序無關(guān)的操作。一般的,使用function來書寫一些可以復(fù)用的組合邏輯。使用ta

43、sk來書寫一段與時序相關(guān)的操作邏輯。2) 文件的讀寫操作在仿真用verilog語言中,經(jīng)常涉及到對文件的讀寫操作。其格式如表20所示。表20 文件操作/ file operation/ write fileinteger pfile;initial begin pfile = $fopen("FILE_PATH/FILE_NAME.EXTERN"); $fwrite(pfile,"%hn",dat); $fclose(pfile);end/ read fileinitial begin $readmemh("FILE_PATH/FILE_NAME.EXTERN",data_i);end3) dump波形的函數(shù)在調(diào)試verilog代碼時,經(jīng)常需要查看verilog代碼中的中間變量的變化情況,這就需要將波形導(dǎo)出,也就是常說的dump波形。導(dǎo)出波形的格式有很多種,在此以verdi(Debussy)為例,如表21所示。表20 dump波形/ dump waveinitial begin /

溫馨提示

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

評論

0/150

提交評論