Verilog HDL基礎之:與C語(yǔ)言的區別與聯(lián)系(獨家)
數字電路設計工程師一般都學(xué)習過(guò)編程語(yǔ)言、數字邏輯基礎、各種EDA軟件工具的使用。就編程語(yǔ)言而言,國內外大多數學(xué)校都以C語(yǔ)言為標準,只有少部分學(xué)校使用Pascal 和Fortran。
本文引用地址:http://dyxdggzs.com/article/201706/348844.htm算法的描述和驗證常用C語(yǔ)言來(lái)做。例如要設計Reed-Solomen編碼/解碼器,可以分為下面幾個(gè)步驟。
- 先深入了解Reed-Solomen編碼/解碼的算法。
- 編寫(xiě)C語(yǔ)言的程序來(lái)驗證算法的正確性。
- 運行描述編碼器的C語(yǔ)言程序,把在數據文件中的多組待編碼的數據轉換為相應的編碼后數據,并存入文件。
- 編寫(xiě)一個(gè)加干擾用的C語(yǔ)言程序,用于模擬信道。它能產(chǎn)生隨機誤碼位(并把誤碼位個(gè)數控制在糾錯能力范圍內),將其加入編碼后的數據文件中。運行該加干擾程序,產(chǎn)生帶誤碼位的編碼后的數據文件。
- 編寫(xiě)一個(gè)解碼器的C語(yǔ)言程序,運行該程序把帶誤碼位的編碼文件解碼為另一個(gè)數據文件。
比較原始數據文件和生成的文件,便可知道編碼和解碼的程序是否正確(能否自動(dòng)糾正糾錯能力范圍內的錯碼位),用這種方法我們就可以來(lái)驗證算法的正確性。但這樣的數據處理其運行速度只與程序的大小和計算機的運行速度有關(guān),也不能獨立于計算機而存在。
如果要設計一個(gè)專(zhuān)門(mén)的電路來(lái)進(jìn)行這種對速度有要求的實(shí)時(shí)數據處理,除了以上介紹的C程序外,還需編寫(xiě)硬件描述語(yǔ)言(如Verilog HDL或 VHDL)的程序。然后進(jìn)行仿真以便從電路結構上保證算法能在規定的時(shí)間內完成,并能與前端和后端的設備或器件正確無(wú)誤地交換數據。
用硬件描述語(yǔ)言(HDL)的程序設計硬件的好處在于易于理解、易于維護,調試電路速度快,有許多的易于掌握的仿真、綜合和布局布線(xiàn)工具,還可以用C語(yǔ)言配合HDL來(lái)做邏輯設計的前后仿真,驗證功能是否正確。
在算法硬件電路的研制過(guò)程中,計算電路的結構和芯片的工藝對運行速度有很大的影響。所以在電路結構確定之前,必須經(jīng)過(guò)多次仿真。
- C語(yǔ)言的功能仿真。
- C語(yǔ)言的并行結構仿真。
- Verilog HDL的行為仿真。
- Verilog HDL RTL級仿真。
- 綜合后門(mén)級結構仿真。
- 布局布線(xiàn)后仿真。
- 電路實(shí)現驗證。
下面介紹用C語(yǔ)言配合Verilog HDL來(lái)設計算法的硬件電路塊時(shí)考慮的三個(gè)主要問(wèn)題:
1.為什么選擇C語(yǔ)言與Verilog 配合使用
首先,C語(yǔ)言很靈活,查錯功能強,還可以通過(guò)PLI(編程語(yǔ)言接口)編寫(xiě)自己的系統任務(wù)直接與硬件仿真器(如Verilog-XL)結合使用。C語(yǔ)言是目前世界上應用最為廣泛的一種編程語(yǔ)言,因而C程序的設計環(huán)境比Verilog HDL更完整。此外,C語(yǔ)言可應用于許多領(lǐng)域,有可靠的編譯環(huán)境,語(yǔ)法完備,缺陷較少。
比較起來(lái),Verilog 語(yǔ)言只是針對硬件描述的,在別處使用(如用于算法表達等)并不方便。而且Verilog的仿真、綜合、查錯工具等大部分軟件都是商業(yè)軟件,與C語(yǔ)言相比缺乏長(cháng)期大量的使用,可靠性較差,亦有很多缺陷。所以,只有在C語(yǔ)言的配合使用下,Verilog才能更好地發(fā)揮作用。
面對上述問(wèn)題,最好的方法是C語(yǔ)言與Verilog語(yǔ)言相輔相成,互相配合使用。這就是既要利用C語(yǔ)言的完整性,又要結合Verilog對硬件描述的精確性,來(lái)更快、更好地設計出符合性能要求的硬件電路系統。
利用C語(yǔ)言完善的查錯和編譯環(huán)境,設計者可以先設計出一個(gè)功能正確的設計單元,以此作為設計比較的標準。然后,把C程序一段一段地改寫(xiě)成用并型結構(類(lèi)似于Verilog)描述的C程序,此時(shí)還是在C的環(huán)境里,使用的依然是C語(yǔ)言。
如果運行結果都正確,就將C語(yǔ)言關(guān)鍵字用Verilog相應的關(guān)鍵字替換,進(jìn)入Verilog的環(huán)境。將測試輸入同時(shí)加到C與Verilog兩個(gè)單元,將其輸出做比較。這樣很容易發(fā)現問(wèn)題的所在,更正后再做測試,直至正確無(wú)誤。
2.C語(yǔ)言與Verilog語(yǔ)言互相轉換中存在的問(wèn)題
混合語(yǔ)言設計流程往往會(huì )在兩種語(yǔ)言的轉換中會(huì )遇到許多難題,如下所示。
- 怎樣把C程序轉換成類(lèi)似Verilog結構的C程序。
- 如何增加并行度,以保證用硬件實(shí)現時(shí)運行速度達到設計要求。
- 怎樣不使用C中較抽象的語(yǔ)法(例如迭代、指針、不確定次數的循環(huán)等)。也能來(lái)表示算法(因為轉換的目的是用可綜合的Verilog語(yǔ)句來(lái)代替C程序中的語(yǔ)句,而可用于綜合的Verilog語(yǔ)法是相當有限的,往往找不到相應的關(guān)鍵字來(lái)替換)。
C程序是按行依次執行的,屬于順序結構。而Verilog描述的硬件是可以在同一時(shí)間同時(shí)運行的,屬于并行結構。這兩者之間有很大的沖突。另外,Verilog的仿真軟件也是順序執行的,在時(shí)間關(guān)系上同實(shí)際的硬件是有差異的,可能會(huì )出現一些無(wú)法發(fā)現的問(wèn)題。
C語(yǔ)言的函數調用與Verilog中模塊的調用也有區別。C程序調用函數是沒(méi)有延時(shí)特性的,一個(gè)函數是惟一確定的,對同一個(gè)函數的不同調用是一樣的。而Verilog中對模塊的不同調用是不同的,即使調用的是同一個(gè)模塊,必須用不同的名字來(lái)指定。
Verilog的語(yǔ)法規則很死,限制很多,能用的判斷語(yǔ)句有限,仿真速度較慢,查錯功能差,錯誤信息不完整。仿真軟件通常也很昂貴,而且不一定可靠。C語(yǔ)言的花樣則很多,轉換過(guò)程中會(huì )遇到一些困難。
C語(yǔ)言沒(méi)有時(shí)間關(guān)系,轉換后的Verilog程序必須要能做到?jīng)]有任何外加的人工延時(shí)信號,否則將無(wú)法使用綜合工具把Verilog源代碼轉化為門(mén)級邏輯。
3.如何利用C語(yǔ)言來(lái)加快硬件的設計和查錯
如表1所示為常用的C語(yǔ)言與Verilog相對應的關(guān)鍵字與控制結構。
表1 C語(yǔ)言與Verilog相對應的關(guān)鍵字與控制結構表
C | Verilog |
sub-function | module、function、task |
if-then-else | if-then-else |
case | case |
{,} | begin、end |
for | for |
while | while |
break | disable |
define | define |
int | int |
printf | monitor、display、strobe |
如表2所示為C語(yǔ)言與Verilog相對應的運算符。
表2 C語(yǔ)言與Verilog對應運算符表
C | Verilog | 功 能 |
* | * | 乘 |
/ | / | 除 |
+ | + | 加 |
- | - | 減 |
% | % | 取模 |
! | ! | 反邏輯 |
邏輯與 | ||
|| | || | 邏輯或 |
> | > | 大于 |
小于 |
續表
C | Verilog | 功 能 |
>= | >= | 大于等于 |
= | = | 小于等于 |
== | == | 等于 |
!= | != | 不等于 |
~ | ~ | 位反相 |
按位邏輯與 | ||
| | | | 按位邏輯或 |
^ | ^ | 按位邏輯異或 |
~^ | ~^ | 按位邏輯同或 |
>> | >> | 右移 |
左移 | ||
?: | ?: | 相當于if-else |
從上面的講解我們可以總結如下。
- C語(yǔ)言與Verilog硬件描述語(yǔ)言可以配合使用,輔助設計硬件。
- C語(yǔ)言與Verilog硬件描述語(yǔ)言很像,但要稍加限制。
- C語(yǔ)言的程序很容易轉成Verilog的程序。
評論