天天看點

認識Robei及Robei優勢

第一章:認識工具,掌握基礎

通過今天的學習,讀者可以了解內建電路設計工具的曆史背景情況,同時熟悉國内外的産業差距。今天的學習将為後面的操作打下基礎,讀者需要盡可能的熟悉軟體和Verilog文法,了解Robei軟體的結構和操作方式,并知道如何注冊和尋找Robei資源。今天學習完成後,熟悉Verilog語言的讀者可以加深記憶,剛剛開始學習FPGA設計的讀者也可以輕松地掌握Verilog語言的結構和文法。

1.1 為什麼要選擇Robei

1.1.1. 背景介紹

提供EDA設計工具的廠家有Cadence,Synopsys,Mentor Graphics,Xilinx,Altera等公司,這些公司都是歐美的公司,中國的EDA設計工具卻少的可憐。中國90%的晶片來自進口,已經引起了政府的重視和對內建電路産業的大力扶持,但是中國99%的晶片設計工具來自進口和盜版,目前政府對于內建電路設計工具支援卻是鳳毛麟角。內建電路産業的發展依托于內建電路設計工具的發展,設計工具是和內建電路産業的發展同步的,就像兩條腿走路,缺了哪條腿都是畸形的發展。“工欲善其事,必先利其器”,在中國大力發展內建電路的大環境和氛圍下,唯獨缺失的是對內建電路工具的發展。當一個國家的某個産業的快速膨脹和繁榮是依賴于其他國家的利器的時候,就等于把這個産業的咽喉拱手讓别的國家給掐住。這個産業的利潤将會慢慢通過知識産權的訴訟形式流失進入到其他工具所有國。這種畸形的發展會導緻歐美等國家順利完成産業淘汰和更新,中國變成了內建電路産業鍊的最低端,隻能依賴于微薄的利潤生存,并準備着時不時的被掌握設計工具的國家過來“剪羊毛”。在EDA設計工具上,中國有沒有可能和歐美進行抗衡和抵制?

歐美國家的EDA設計工具也聯合本國的IP供應商,打造了一個知識産權産業鍊,對于一些常用的IP進行知識産權封鎖,要求國内的的生産和設計廠商進行購買,否則就無法完成整體設計。而且國外掌握着對軟體和IP更新更新的主動權,即使購買了IP,在一定時間之後,随着版本的更新,IP在不同的版本中不相容,而且IP更新需要繼續付費,同時新IP的使用方法不同,這就要求國内的産業鍊随着軟體和IP的更新不斷的更改設計,甚至重新設計,導緻大量的人力、物力和财力的浪費,同時又不得不出錢購買,因為産業的依附性已經形成。我們如何能打破這個局面?

國内的高校在培養內建電路設計人才的時候,也是不求甚解,很多課時在講IP的使用,而不是如何設計IP。如此以來,我們通過填鴨式教育培養了一批不會思考的內建電路設計工程師,這批不會思考的工程師在公司隻會拿來主義, IP的封閉導緻了中國內建電路産業的惰性,建立在這種惰性之上的創新都是空談。但是随着內建電路大基金的投入,內建電路制造廠的規模擴建,新生産線的上線和産能的增加,如何快速培養更多的內建電路人才來設計和流片,用來喂飽這些新增的産能和高端工藝線?

仔細分析一下內建電路設計的曆史,從最早的邏輯門搭建到原理圖設計(軟體化的內建電路晶片模組),再到編寫Verilog或者VHDL的代碼(充分靈活的設計方式),每一步都是為了讓設計更友善,更簡單,更抽象。未來的EDA工具會怎麼樣?

現在的EDA工具設計相當靈活,全部由代碼實作功能并仿真。在設計中牽扯到大量的子產品重用,進行例化,這個過程需要使用者清楚要進行例化的每個引腳和位寬,使用者就需要在聲明和設計中來回切換,不時查證引腳信号的定義,浪費了大量的時間。如何才能更友善更快速的進行例化?

在大型的設計中,需要反複的對一些細節或者子產品進行修改,一旦用的多得子產品被修改,使用者中其他的設計就要更新,将所有用到被修改了的子產品的地方進行更新牽扯到大量的時間,甚至是重新設計。如果能有一鍵更新,分層調整,将可以大大節約工作量。如何在軟體中進行快速的自上而下和自下而上的協同設計并能實作一鍵更新?

內建電路的學習是一個痛苦而抽象的過程,它不像C語言軟體一樣,可以快速編譯,所見即所得。EDA設計中語句是并行執行的,C語言中是串行執行的,如何能減小軟體和硬體設計的鴻溝,讓有C語言基礎的人快速轉變成硬體設計工程師?大多數EDA軟體都是龐然巨物,要想入門EDA,首先必須把龐然巨物下載下傳完成然後安裝并熟悉使用,一旦運作巨物,就要吞噬電腦的大量記憶體和計算性能,有沒有辦法用最小的工具完成初學者的學習任務,而讓電腦運作流暢不妨礙我打遊戲呢?

因為缺乏競争對手,國外的EDA公司在國内的售價高的離譜,幾十萬上百萬一套軟體已經是司空見慣。上規模的內建電路公司為了避免被起訴不得不花費天價來購買軟體,而這些費用都是幾年或者十幾年從微薄的利潤中積累出來的。小微內建電路企業無力支付天價的軟體費用,隻能采用盜版,這也為以後成長為大公司埋下了法律隐患。如何讓中國的EDA設計工程師用得起正版EDA軟體?如何讓他們不再因為使用盜版而天天提心吊膽?

若貝公司推出的Robei可視化晶片設計工具是在各種現有的EDA工具的最上層加了一層,進行可視化的所見即所得的設計,同時向下跨越到設計仿真和波形檢視,基本涵蓋了設計前端的所有功能,實作RTL級别的設計仿真,減少了中國大部分工程師和學生對于國外EDA設計工具的依賴和減少國外EDA設計工具的進口使用量。以前,國外的EDA設計工具需要人手一個,這樣的成本不是個人和中小公司能夠負擔的起的,現在,由于Robei的出現,我們隻需要購買少量的後端設計工具,大大減小了開支。同時Robei支援的結構化和可視化設計,友善了子產品重用,節省了設計公司和工程師的時間,提升了設計效率和提升了設計品質。目前的內建電路工具更多是面向設計工藝的,極少從設計者和學習者的使用友善觸發,而且軟體動辄上G或者幾十G,對電腦性能要求也極高。Robei軟體是一個以輕量決勝的軟體,隻有不到10M,可以減少學生學習的時間,提升學習的興趣和效率,可以為內建電路行業培養更多的人才。

Robei打造了一個完全透明的IP平台,在這個平台上,我們将容納更多會思考、會設計的工程師來打造更多更好的設計,所有的設計完全透明,使用者在使用的時候可以随意更改和裁剪,也可以學習IP設計的相關思路。這個平台打造的是學習與貢獻一體,鼓勵貢獻優質IP,定期公布設計項目,讓更多有思想的工程師參與項目,打造IP共享社群,獎勵優秀設計者。本來我們內建電路設計就落後很多,如果再采用知識自我封閉的理念,将會導緻更加落後。Robei崇尚的是一種學完就分享的模式,讓更多的設計者受益,讓更大的設計變得友善可控。這個平台是對知識産權壟斷的抗争,是興起內建電路設計産業的的中堅力量。

1.1.2. EDA的發展史

最早的內建電路設計是依賴于邏輯門的,用74LS系列的晶片進行連接配接,實作一些基本的功能。随着技術的發展和演進,出現了PCB的設計,也就是闆級的設計,可以讓這些基本的邏輯單元器件布局到一個PCB闆上實作。PCB的設計演進也單獨的發展成了一個分支,一直延續使用到現在。在內建電路曆史上,第一個可程式設計邏輯器件誕生于1985年,由矽谷的Xilinx公司推出。既然是可程式設計邏輯器件,自然少不了可以用于程式設計的EDA工具。

最早的EDA設計工具是原理圖設計方式,原理圖主要基于市場上常見的元器件進行組合連線設計。這種設計基本上是将邏輯門設計中的基礎電路子產品軟體虛拟化之後提供在設計庫中,使用者可以用來軟搭建出自己需要的系統,再寫入到FPGA中。原理圖的優點是設計非常直覺,但是靈活性不夠。如果在原理圖中新增加一個不存在的裝置器件,往往需要寫代碼、打包、更新到器件庫、從器件庫查找并使用等過程,一旦元器件設計有誤,就會需要重新回到代碼修改并重新打包。已經在設計中存在的器件需要重新更替。流程繁複浪費了設計師大量的時間,尤其是源代碼不慎丢失,将會直接導緻子產品無法修改,設計師需要重新來過。

後來由于原理圖設計中每個子產品要對應于實際的晶片,設計靈活性差,導緻了後來以VHDL和Verilog為主流的代碼程式設計設計,所有的子產品實作均采用代碼編寫實作。代碼設計是目前非常流行的設計方式,無論是元器件接口定義,子產品例化還是功能實作,全部用Verilog或者VHDL等語言設計實作。代碼設計的優點是靈活,想寫什麼器件就寫什麼器件,缺陷是不夠直覺。工程師需要讀完大段代碼才能了解其功能和結構資訊,同時在撰寫例化的時候,需要依據代碼進行編寫例化,要反複對照和檢視接口名稱和資料寬度等資訊,防止出錯。例化的代碼也是手寫為主。

界面設計方式和代碼設計方式各成一體,互相之間交叉很少。子產品化設計展現不夠完美,很多子產品不公開。基于界面的設計在生成代碼的過程中,摻雜了很多備援信号,在出錯後傳回檢視代碼,增加了很多備援信号的障礙。

21世紀之後,伴随着FPGA的越來越大,工藝越來越先進,邏輯資源使用量已經不是設計的瓶頸,這個時候出現了友善設計和使用的框圖設計模式。最靈活的框圖設計模式當屬Robei,它采用了框圖設計結構,代碼設計算法的方式,讓軟體自動生成結構層代碼并與使用者輸入的代碼組合成完整的代碼。這種設計方式既擁有原理圖設計的直覺,又擁有代碼設計的靈活性。

認識Robei及Robei優勢

自Xilinx公司1984年誕生到現在,其軟體經曆了14代以上的更新疊代。我們可以分析一下該公司的ISE設計工具的大小變化,來分析EDA軟體的膨脹過程。Xilinx的ISE從最早的幾十兆到現在的8個G,發展速度十分快,但是軟體龐大畢竟不是好事,軟體越大,問題越多,為了修複和維護這麼龐大的軟體,所需要的人力成本就越高,是以Xilinx公司有幾千人做軟體,遠遠超過做硬體設計的人數。在內建電路行業,軟體的龐大是司空見慣,這是因為所有廠商都以晶片的結構為核心來設計軟體,卻忽略了使用者的感受。從使用者角度來說,軟體的龐大就代表着下載下傳耗費大量的時間,學習需要比較長的周期,運用的步驟複雜,每一步都要按部就班,稍有差錯就要焦頭爛額。Robei是一款面向使用者的晶片設計工具,從誕生之日起,Robei開放軟體讓超過35萬人試用,得到使用者的體驗和感受的問題,并在之後的版本中進行不斷修改演進。這些意見來自美國、加拿大、中國、歐洲、南韓、日本等國家,能夠讓Robei快速比對來自不同地域的使用者體驗感受。時至今日,Robei也在鼓勵使用者回報問題,在意見采納後,為每個使用者提供獎勵。

認識Robei及Robei優勢
認識Robei及Robei優勢

1.1.3. Robei的優勢

Robei是一款可視化的跨平台EDA設計工具,提供了超級簡化的設計流程,最新可視化的分層設計理念,透明的模型庫以及非常友好的使用者界面。Robei軟體将晶片設計高度抽象化,并精簡到三個基本元素,掌握這三個基本元素,就能很快地掌握Robei的使用技巧。該軟體将先進的圖形化與代碼設計相融合,讓框圖與代碼設計優勢互補,弱勢互相抵消。

認識Robei及Robei優勢

Robei軟體是在Verilog代碼設計的基礎上進一步抽象,讓框圖設計與代碼設計實作完美融合。傳統的原理圖設計雖然看起來非常直覺,但是靈活性差,使用者要利用現成的子產品來拼湊設計。而代碼設計雖然相當靈活,但是密密麻麻的代碼很不直覺。Robei軟體通過一種結構層面上圖形化設計,算法層面上代碼輸入的方式使設計更加直覺靈活。

認識Robei及Robei優勢
認識Robei及Robei優勢

目前EDA的設計首先需要工程師在腦海中設計結構,再根據結構手寫代碼,容易出錯。現在工程師利用Robei軟體可以邊構思邊設計結構,結構完成後工程師可以專注于寫核心算法,軟體自動生成結構層的代碼并與工程師輸入的算法代碼結合仿真。這種設計可以讓工程師專注在設計算法上,而不用去記任何引腳名稱和資料寬度。同時該軟體将模型設計、測試檔案和引腳配置設定內建在一個超級簡化的設計流程中,可以進行快速設計仿真。

認識Robei及Robei優勢

Robei內建了先進的圖形化與代碼設計的優勢,同時具備Verilog編譯仿真和波形分析,可以實作各種系統的快速設計、仿真和測試。軟體生成标準的Verilog代碼,可直接與各種EDA工具相融合。Robei是最貼近使用者的前端設計仿真軟體,仿真後直接生成Verilog代碼,可以直接在其他EDA設計工具中使用。

認識Robei及Robei優勢

Robei也是一款跨平台的EDA仿真工具,不僅有Windows,Linux,Mac OS的版本,也有專門針對于Android平闆的版本。到目前為止,Robei也是唯一一個可以在移動平台上設計仿真的EDA工具。

認識Robei及Robei優勢

1.2 安裝與注冊

1.2.1. 安裝

從Robei官方網站(http://robei.com)上下載下傳最新版Robei軟體。解壓Robei.zip,然後輕按兩下Robei-setup.exe,在彈出的安全警告中選擇“是”,如圖1-2-1所示。

認識Robei及Robei優勢

Robei安裝界面會出現,如圖1-2-2所示。

認識Robei及Robei優勢

在彈出的視窗中點“Next”。

認識Robei及Robei優勢

如需要更換路徑,可以點“Browse…”按鈕重新選擇路徑,如果不需要更改,繼續在彈出的視窗中點“Next”。

認識Robei及Robei優勢

點選Next。

認識Robei及Robei優勢

點選“Install”。

認識Robei及Robei優勢

等待執行完畢。

認識Robei及Robei優勢

點選“Finish”,安裝完畢。你可以從桌面上或者開始菜單欄中找到Robei,啟動Robei會看到如下圖1-2-8的界面。

認識Robei及Robei優勢

1.2.2. 注冊

打開Robei官方網站:http://robei.cn/register.php,注冊新使用者,使用者名稱中不能含有中文和空格。注冊完成後可以登入背景購買Robei的注冊碼。Robei注冊碼分為四種不同的類型,學生版、個人版、教育版和專業版,請根據自身的需求選擇購買。

獲得注冊碼後,傳回電腦上打開Robei軟體,點選菜單“Help”,在下拉菜單裡選擇“Register”,如下圖1-2-9所示。

認識Robei及Robei優勢

在彈出的Register對話框中輸入之前注冊的使用者名和密碼,點選按鈕“Get License”, 軟體會彈出網頁,在該網頁中有相關的注冊碼資訊。

認識Robei及Robei優勢
認識Robei及Robei優勢

複制Your License:後面的一串編碼,并輸入到Register對話框的“License*:”中,點選“Register”按鈕。

認識Robei及Robei優勢

如果看到下圖1-2-13所示的對話框,恭喜你,注冊成功。如果沒有,請聯系若貝公司:[email protected]。點選“Yes”按鈕,退出注冊。

認識Robei及Robei優勢

一切準備就緒之後,關閉軟體,重新啟動,檢視軟體界面的最頂端,“Robei Trial”的字樣已經消失,取而代之的是你的注冊碼的類型:學生版是“Robei Student”,個人版是“Robei Personal”,教育版是“Robei Education”,專業版是“Robei Professional”。無論何種版本都可以跟随本教程使用,隻是能編譯的設計個數受限。

認識Robei及Robei優勢

1.3 如何使用Robei

Robei軟體啟動後,界面如圖1-3-1所示,軟體界面分為菜單,工具條,工具箱,屬性欄,工作空間和輸出視窗幾個部分。菜單和工具條位于軟體的頂部,與常見的軟體工具一樣,工具條上分布着一些常用的按鈕。左側的工具箱裡包含設計好的模型,可以重複利用。使用者可以在界面右側的屬性欄裡修改目前設計子產品的屬性。中間的工作空間是主要設計區域,目前設計子產品預設名為“module”。底部為輸出視窗,用來顯示錯誤以及警告資訊。

認識Robei及Robei優勢

1.3.1. 菜單和工具條

Robei為了友善使用者使用,在頂部設有菜單和工具條。與檔案相關的操作放在“File”菜單裡,複制、粘貼、剪切和删除操作放置在“Edit”菜單裡。與設計相關的操作比如添加子產品、引腳、和連接配接線放在“Tools”菜單裡。除了這些,還有在“Build”菜單裡的執行仿真和檢視波形操作,“View”菜單裡的放大縮小操作。如果想恢複被錯誤關閉的視窗,使用者可以到“Window”菜單下找出對應的視窗并打開。

認識Robei及Robei優勢

1.3.2. 工具箱

工具箱分為兩欄,第一欄“Current”對應的檔案位置為目前工作檔案夾,用來展示在目前目錄下,使用者開發的設計模型,其路徑是使用者目前模型所存儲的檔案夾。第二欄“System”是随Robei軟體一起安裝好的,裡面的模型均由系統自帶,其路徑是“C:\ProgramData\Robei”。使用者也可自行添加新的欄目,并給出所對應的檔案夾,Robei會自動讀取該檔案夾裡所有的Robei模型。添加方法是在“Toolbox”裡點選右鍵,選擇“Add”,系統會自動彈出添加庫的對話框(如圖1-2-3所示)。

認識Robei及Robei優勢
認識Robei及Robei優勢

1.3.3. 屬性欄

屬性欄視窗用來展示工作區域中被選中物體的屬性。使用者可以修改對應的屬性,并按下Enter鍵,修改的屬性會直接展示在工作區域中。模型中有些屬性是受保護的,是以不能修改。

認識Robei及Robei優勢

1.3.4. 工作空間

工作空間是一個圖形化設計區域,在這個空間,使用者可以利用子產品、模型、引腳和連接配接線來設計複雜的內建電路。工作空間由兩個部分組成,一個是圖形化設計視窗,一個是代碼設計視窗,可以通過底端的“Graph”和“Code”頁籤進行切換。

認識Robei及Robei優勢
認識Robei及Robei優勢

1.3.5. 輸出

輸出視窗用來顯示輸出資訊,包括錯誤資訊和警告資訊。

認識Robei及Robei優勢

圖1-3-6 輸出視窗

1.4 Robei三元素

Robei用三個基本元素來代表Verilog裡面的組成部分:子產品、引腳和連接配接線。在Verilog語言裡,電路用一系列子產品(module)來描述。一個子產品可以代表一個邏輯門,一個寄存器,一個ALU或者一個SOC系統。子產品是一個抽象的晶片,在這個抽象的晶片上,又存在着抽象的引腳。引腳是子產品中用來與外界通信的門戶,每個引腳與其它的子產品進行通信,都需要一個抽象的連接配接線。這個連接配接線可以是一根線,也可以是一個總線。

1.4.1. 子產品

子產品是設計流程中的基本元素,可以看作是一個黑盒子。在這個黑盒子裡,設計者可以放置引腳用來做通信的門戶,可以放置設計好的模型和輸入實作該子產品功能的算法代碼。根據設計階段分類,一個子產品可以細分為不同的類型。正在開發的目前子產品都是“Module”類型,但是一旦設計完畢,便會儲存成“Model”,這個模型可以在其它的子產品中使用,而且部分屬性進行了寫保護,不能随意修改。子產品中還有其它的類型,包括含有激勵代碼,用來實作仿真的“Testbench”類型,實作FPGA引腳配置設定的“Constrain”類型。

認識Robei及Robei優勢

(1)Module:Robei的基本類型,目前正在設計的內建電路子產品,儲存後自動變成“Model”,使用者可以修改任何屬性。

認識Robei及Robei優勢

(2)Model:設計好的子產品在其它子產品中使用,自動變成“Model”類型。部分屬性進行了寫保護,但是使用者還是可以修改其它的屬性,如顔色、名稱和參數等。

認識Robei及Robei優勢

(3)Testbench:測試子產品對于驗證設計非常重要,測試子產品用來給予激勵,調用設計好的子產品,用來驗證設計結果。如果要看到仿真結果,請確定頂層激勵子產品的屬性設定成“testbench”,否則看不到波形分析。

認識Robei及Robei優勢

(4)Constrain:限制檔案是用來對FPGA引腳進行配置設定的檔案。因為每家FPGA廠商的引腳配置設定有不同的模式,是以Robei會根據不同的廠商自動生成對應于該廠商的引腳限制檔案,但是在Robei軟體上進行配置設定的方式是統一的。比如Xilinx ISE的引腳限制檔案是UCF檔案,Vivado的引腳限制檔案是XDC檔案,Altera的引腳限制檔案是QSF檔案。如果要配置設定的引腳是一個總線,使用者可以在連接配接線上聲明要配置設定的引腳在總線中的編号。

認識Robei及Robei優勢

在引腳配置設定之前,使用者需要在菜單“Settings”裡面選擇“FPGA”,用來選擇正确的FPGA廠家。額外的限制可以用代碼形式寫在工作空間中的代碼視窗中。

認識Robei及Robei優勢

在菜單“View”的下拉菜單中選擇“CodeView”, 就可以看到自動生成的引腳限制代碼。

認識Robei及Robei優勢

1.4.2. 引腳

引腳是一個抽象的概念,可以對應于實體晶片上的一根針,或者開發闆上的一個連接配接口,或者晶片上的一個總線。引腳是子產品的門戶,是子產品與外界通信的接口。引腳就如同在黑盒子上打孔,從外向内鑽孔的時候,孔是外面大,裡面小,這是輸入。從内向外鑽孔的時候,孔是裡面大外面小,這就是輸出。還有一種既可以輸入也可以輸出的,就是兩個方向上同時鑽孔,内外大小一樣。

認識Robei及Robei優勢

每個引腳的屬性如圖1-4-9所示。引腳的屬性也有多種,如“reg”,“wire”,“supply”等。“Datasize”屬性用來描述該引腳是單針還是總線。引腳隻能在子產品的邊緣遊走,不能進入子產品也不能離開子產品。當子產品移動時,引腳也跟随移動。

注意:模型上的引腳的一些屬性是寫保護的,不能修改,但是位置和顔色資訊可以随意調整。

認識Robei及Robei優勢

1.4.3. 連接配接線

連接配接線用來連接配接兩個引腳,并負責信号的傳輸。連接配接線就如同連接配接黑盒子上的兩個孔的管子,兩個孔之間要想水不灑出來,就需要密封的管子進行連接配接。內建電路也是一樣,隻不過內建電路使用的是導線連接配接,而流入流出的不再是水,而是電。

認識Robei及Robei優勢

通常情況下,連接配接線會繼承起始引腳的顔色和資料寬度資訊,然後顔色漸變為目标引腳的顔色。根據資料寬度的不同,連接配接線的粗細也不盡相同。

認識Robei及Robei優勢

子產品、引腳和連接配接線是Robei的三元素,通過這三元素,Robei把複雜的內建電路設計簡化到最簡,進一步降低了對內建電路入門的要求,友善使用者快速進入內建電路設計。

1.5 Verilog基礎

1.5.1. 資料

(1)電路四種狀态

Verilog用4個值來實作電平描述:0,1,Z和X。

認識Robei及Robei優勢

(2)數值表示方法:位數+’+進制+值。

認識Robei及Robei優勢

(3)資料類型

硬體的資料類型描述以驅動的方式來分類,常用的有兩種:reg和wire。

認識Robei及Robei優勢

1.5.2. 運算符

(1)邏輯運算符

認識Robei及Robei優勢

(2)算術運算符

認識Robei及Robei優勢

(3)比較運算符

認識Robei及Robei優勢

1.5.3. 結構聲明

由于Robei的存在,以下部分代碼可以不用輸入,省去使用者的大量時間,但是使用者需要了解這部分代碼的存在。是以被省去的代碼會在描述中提出。

1. 子產品定義

Robei的每個框圖代表一個子產品,每個子產品的聲明都由“module”開始,然後是該子產品的名稱,之後的括号裡面包含了輸入和輸出的引腳。最後要寫上“endmodule”。

module dff(d,q,clk);

//這裡開始程式設計

endmodule

認識Robei及Robei優勢

2. 引腳定義

引腳的名稱将會出現在子產品定義的括号裡面。子產品定義完成後,在module和endmodule中間聲明引腳的走向。箭頭從外向内的是輸入引腳,從内向外的是輸出引腳,無箭頭的是既可以做輸入也可以做輸出。有資料寬度的用中括号給出。緊接着,聲明每個引腳信号的類型,一般是wire或者reg。

input p0;

inout p1;

output [3:0] p2;

wire p0;

wire p1;

reg [3:0] p2;

認識Robei及Robei優勢

3. 連接配接線

連接配接線的定義是用連接配接線類型加上位寬和名稱形成的,與引腳的類型定義類似,但是在Robei中,頂層子產品與子子產品的連接配接線可以不聲明,直接連接配接引腳,是以部分連接配接線并不存在于代碼中。

wire clkout_clk;

認識Robei及Robei優勢

4. 例化

例化的時候根據子產品的連接配接方式,确定每個引腳相連的引腳或者連接配接線,通過類似子產品聲明的方式進行例化。在例化的時候,有些時候需要空接一些信号,輸入管腳懸空,該管腳輸入為高阻 Z,輸出管腳懸空,該管腳廢棄不用。

Design u_2( .(端口1(u_1的端口1),

.(端口2(u_1的端口2),

.(端口3(u_1的端口3),

…… );

實際舉例如DFF的例化:

DFF d1 (.Q(QS),

.Qbar ( ),

.Data (D),

.Preset ( ), // 該管腳懸空

.Clock (CK) );

認識Robei及Robei優勢

1.5.4. 代碼撰寫

1. 指派語句

常用的指派語句如assign,assign起的作用是将一個信号與另外一個信号直接進行相連,任何信号的變化都是同步的。Assign中等号左邊信号必須是wire型。

認識Robei及Robei優勢

2. 分支語句

if else

類似于C語言中的if else 的寫法。如果if else寫全,就會生成寄存器,但是隻有if沒有else的語句,将會生成鎖存器。在硬體設計中應該盡量避免鎖存器的産生。當有多條語句存在于if else中間的時候,需要用begin end将多條語句進行包含,此時begin end相當于C語言中的{}。

認識Robei及Robei優勢

Case

類似于C語言中的case 的寫法。如果case寫全并且default值設定好,就會生成寄存器,否則将會生成鎖存器。

認識Robei及Robei優勢

3. 循環語句

For

類似于C語言中的For 的寫法。但是Verilog中,沒有自加的語句,是以沒有i++,隻能用i=i+1。

認識Robei及Robei優勢

While

類似于C語言中的While 的寫法。While 語句在執行時,首先判斷循環執行條件表達式是否為真,如果真,執行後面的語句塊, 然後再重新判斷循環執行條件表達式是否為真, 為真的話, 再執行一遍後面的語句塊,如此不斷,直到條件表達式不為真。

認識Robei及Robei優勢

4. 初始化與重複執行

Initial

Verilog中用initial進行初始化,initial 隻執行一次,在0時刻執行。主要用在仿真測試子產品中。

認識Robei及Robei優勢

Always

Verilog中always一直重複執行到程式結束。Always有自己的敏感信号清單,用[email protected](敏感信号1 or敏感信号2 or …)來表示,當敏感信号發生改變的時候更新狀态。

認識Robei及Robei優勢

隻有寄存器類型的信号才可以在always和initial 語句中進行指派,類型定義通過reg語句實作。

5. 阻塞式指派與非阻塞式指派

阻塞指派( = )

在串行語句塊中,阻塞指派語句按照它們在塊中的排列順序依次執行,即前一條語句沒有完成指派之前,後面的語句不可能被執行,換言之,後面的語句被阻塞了。在always中begin…end語句塊中所有語句是順序執行的,阻塞指派是在上一條語句完全完成之後,才開始執行下一條語句的。

認識Robei及Robei優勢

非阻塞指派( <= )

先計算右邊表達式的值并暫存在一個暫存器中,iD的值被儲存在一個寄存器中,而oQA目前的值被儲存在另一個寄存器中,在begin和end之間所有語句的右邊表達式都被計算并存儲完後,對左邊的寄存器變量的指派才會進行。這樣oQB得到的是oQA的原始值而不是iD。

認識Robei及Robei優勢

1.5.5. 一個子產品的總結

module 子產品名(引腳1,引腳2,……);

input [資料寬度] 輸入引腳;

output[資料寬度] 輸出引腳;

parameter 參數=預設值;

reg[資料寬度] 寄存性信号;

wire[資料寬度] 非寄存性信号;

//例化寫法

模型名稱 #(參數1,參數2,……) 例化名 (

.模型引腳1(連接配接的信号1),

.模型引腳2(連接配接的信号2),

……

);

//其他描述算法

//assign

assign 信号1=信号2;

//if else

if (條件) begin

執行語句;

end else begin

執行語句;

end

//case

case (變量):

第一個值:執行語句;

第二個值:執行語句;

……

default:預設執行語句;

endcase

//while

while(條件)begin

執行語句;

end

//always

[email protected](敏感信号1 or 敏感信号2 or ……)

語句嵌套;

//for

for(i=0;i<10;i=i+1) begin

語句嵌套;

end

endmodule

以上隻是簡單的總結,學習的過程就是實踐積累的過程,隻有不斷的練習,才能真正掌握內建電路設計。

1.6. 第一天的總結

第一天的學習任務非常的繁重也非常的基礎,隻有掌握好這一天的内容,才能夠快速動手掌握其他的環節學習。第一天我們了解了EDA的發展曆程,了解了Robei的特點和三元素,安裝并注冊了Robei軟體和初步學習了Verilog語言,這對後續的學習打下了堅實的基礎。後面的學習以動手為主,希望讀者能親自動手跟着學習。

1.5 Verilog基礎

1.5.1. 資料

(1)電路四種狀态

Verilog用4個值來實作電平描述:0,1,Z和X。

(2)數值表示方法:位數+’+進制+值。

進制 示例 解釋

二進制 3’b101 三位二進制數101

八進制 9’o17 九位八進制數17,相當于十進制的15

十進制 12 不加任何符号代表十進制數,例子就是12

’d11 用d代表十進制,該數是十進制的11

十六進制 64’hff01 64位十六進制FF01,十進制相當于65281

表1-5-1 數值進制表示方法

(3)資料類型

硬體的資料類型描述以驅動的方式來分類,常用的有兩種:reg和wire。

1.5.2. 運算符

(1)邏輯運算符

邏輯運算 運算符 例句

與 & y=a&b;

或 | y=a|b;

異或 ^ y=a^b;

非 ~ y=~a;

邏輯與 && y=a&&b;

邏輯或 || y=a||b;

邏輯非 ! y=!a;

表1-5-2 邏輯運算表

(2)算術運算符

算術運算 運算符 例句

加 + y=a+b;

減 - y=a-b;

乘 * y=a*b;

除 / y=a/b;

取餘 % y=a%b;

左移 << y=a<<b;

右移 >> y=a>>b;

表1-5-3 算術運算表

(3)比較運算符

比較運算 運算符 例句

大于 > y=a>b;

小于 < y=a<b;

等于 == y=a==b;

大于等于 >= y=a>=b;

小于等于 <= y=a<=b;

不等于 != y=a!=b;

表1-5-4 比較運算表

1.5.3. 結構聲明

由于Robei的存在,以下部分代碼可以不用輸入,省去使用者的大量時間,但是使用者需要了解這部分代碼的存在。是以被省去的代碼會在描述中提出。

  1. 子產品定義

    Robei的每個框圖代表一個子產品,每個子產品的聲明都由“module”開始,然後是該子產品的名稱,之後的括号裡面包含了輸入和輸出的引腳。最後要寫上“endmodule”。

    module dff(d,q,clk);

    //這裡開始程式設計

    endmodule

圖1-5-1 子產品的定義

2. 引腳定義

引腳的名稱将會出現在子產品定義的括号裡面。子產品定義完成後,在module和endmodule中間聲明引腳的走向。箭頭從外向内的是輸入引腳,從内向外的是輸出引腳,無箭頭的是既可以做輸入也可以做輸出。有資料寬度的用中括号給出。緊接着,聲明每個引腳信号的類型,一般是wire或者reg。

input p0;

inout p1;

output [3:0] p2;

wire p0;

wire p1;

reg [3:0] p2;

圖1-5-2 引腳的定義

3. 連接配接線

連接配接線的定義是用連接配接線類型加上位寬和名稱形成的,與引腳的類型定義類似,但是在Robei中,頂層子產品與子子產品的連接配接線可以不聲明,直接連接配接引腳,是以部分連接配接線并不存在于代碼中。

wire clkout_clk;

圖1-5-3 連接配接線的定義,隻有clkout_clk聲明了

4. 例化

例化的時候根據子產品的連接配接方式,确定每個引腳相連的引腳或者連接配接線,通過類似子產品聲明的方式進行例化。在例化的時候,有些時候需要空接一些信号,輸入管腳懸空,該管腳輸入為高阻 Z,輸出管腳懸空,該管腳廢棄不用。

Design u_2( .(端口1(u_1的端口1),

.(端口2(u_1的端口2),

.(端口3(u_1的端口3),

…… );

實際舉例如DFF的例化:

DFF d1 (.Q(QS),

.Qbar ( ),

.Data (D),

.Preset ( ), // 該管腳懸空

.Clock (CK) );

圖1-5-4 例化聲明

1.5.4. 代碼撰寫

  1. 指派語句

    常用的指派語句如assign,assign起的作用是将一個信号與另外一個信号直接進行相連,任何信号的變化都是同步的。Assign中等号左邊信号必須是wire型。

圖1-5-5 always語句

2. 分支語句

if else

類似于C語言中的if else 的寫法。如果if else寫全,就會生成寄存器,但是隻有if沒有else的語句,将會生成鎖存器。在硬體設計中應該盡量避免鎖存器的産生。當有多條語句存在于if else中間的時候,需要用begin end将多條語句進行包含,此時begin end相當于C語言中的{}。

圖1-5-6 if else語句

Case

類似于C語言中的case 的寫法。如果case寫全并且default值設定好,就會生成寄存器,否則将會生成鎖存器。

圖1-5-7 Case語句

3. 循環語句

For

類似于C語言中的For 的寫法。但是Verilog中,沒有自加的語句,是以沒有i++,隻能用i=i+1。

圖1-5-8 For語句

While

類似于C語言中的While 的寫法。While 語句在執行時,首先判斷循環執行條件表達式是否為真,如果真,執行後面的語句塊, 然後再重新判斷循環執行條件表達式是否為真, 為真的話, 再執行一遍後面的語句塊,如此不斷,直到條件表達式不為真。

圖1-5-9 While語句

4. 初始化與重複執行

Initial

Verilog中用initial進行初始化,initial 隻執行一次,在0時刻執行。主要用在仿真測試子產品中。

圖1-5-10 initial語句

Always

Verilog中always一直重複執行到程式結束。Always有自己的敏感信号清單,用[email protected](敏感信号1 or敏感信号2 or …)來表示,當敏感信号發生改變的時候更新狀态。

圖1-5-11 always語句

隻有寄存器類型的信号才可以在always和initial 語句中進行指派,類型定義通過reg語句實作。

5. 阻塞式指派與非阻塞式指派

阻塞指派( = )

在串行語句塊中,阻塞指派語句按照它們在塊中的排列順序依次執行,即前一條語句沒有完成指派之前,後面的語句不可能被執行,換言之,後面的語句被阻塞了。在always中begin…end語句塊中所有語句是順序執行的,阻塞指派是在上一條語句完全完成之後,才開始執行下一條語句的。

圖1-5-12 阻塞式指派語句

非阻塞指派( <= )

先計算右邊表達式的值并暫存在一個暫存器中,iD的值被儲存在一個寄存器中,而oQA目前的值被儲存在另一個寄存器中,在begin和end之間所有語句的右邊表達式都被計算并存儲完後,對左邊的寄存器變量的指派才會進行。這樣oQB得到的是oQA的原始值而不是iD。

圖1-5-12 非阻塞式指派語句

1.5.5. 一個子產品的總結

module 子產品名(引腳1,引腳2,……);

input [資料寬度] 輸入引腳;

output[資料寬度] 輸出引腳;

parameter 參數=預設值;

reg[資料寬度] 寄存性信号;

wire[資料寬度] 非寄存性信号;

//例化寫法

模型名稱 #(參數1,參數2,……) 例化名 (

.模型引腳1(連接配接的信号1),

.模型引腳2(連接配接的信号2),

……

);

//其他描述算法

//assign

assign 信号1=信号2;

//if else

if (條件) begin

執行語句;

end else begin

執行語句;

end

//case

case (變量):

第一個值:執行語句;

第二個值:執行語句;

……

default:預設執行語句;

endcase

//while

while(條件)begin

執行語句;

end

//always

[email protected](敏感信号1 or 敏感信号2 or ……)

語句嵌套;

//for

for(i=0;i<10;i=i+1) begin

語句嵌套;

end

endmodule

以上隻是簡單的總結,學習的過程就是實踐積累的過程,隻有不斷的練習,才能真正掌握內建電路設計。

1.6. 第一天的總結

第一天的學習任務非常的繁重也非常的基礎,隻有掌握好這一天的内容,才能夠快速動手掌握其他的環節學習。第一天我們了解了EDA的發展曆程,了解了Robei的特點和三元素,安裝并注冊了Robei軟體和初步學習了Verilog語言,這對後續的學習打下了堅實的基礎。後面的學習以動手為主,希望讀者能親自動手跟着學習。