數字電路設計工程師一般都學習過程式語言、數字邏輯基礎、各種EDA軟體工具的使用。就程式語言而言,國內外大多數學校都以C語言為標準,只有少部分學校使用Pascal 和Fortran。
本文引用地址:http://www.eepw.com.cn/article/201706/348844.htm算法的描述和驗證常用C語言來做。例如要設計Reed-Solomen編碼/解碼器,可以分為下面幾個步驟。
比較原始數據文件和生成的文件,便可知道編碼和解碼的程序是否正確(能否自動糾正糾錯能力範圍內的錯碼位),用這種方法我們就可以來驗證算法的正確性。但這樣的數據處理其運行速度只與程序的大小和計算機的運行速度有關,也不能獨立於計算機而存在。
如果要設計一個專門的電路來進行這種對速度有要求的實時數據處理,除了以上介紹的C程序外,還需編寫硬體描述語言(如Verilog HDL或 VHDL)的程序。然後進行仿真以便從電路結構上保證算法能在規定的時間內完成,並能與前端和後端的設備或器件正確無誤地交換數據。
用硬體描述語言(HDL)的程序設計硬體的好處在於易於理解、易於維護,調試電路速度快,有許多的易於掌握的仿真、綜合和布局布線工具,還可以用C語言配合HDL來做邏輯設計的前後仿真,驗證功能是否正確。
在算法硬體電路的研製過程中,計算電路的結構和晶片的工藝對運行速度有很大的影響。所以在電路結構確定之前,必須經過多次仿真。
下面介紹用C語言配合Verilog HDL來設計算法的硬體電路塊時考慮的三個主要問題:
首先,C語言很靈活,查錯功能強,還可以通過PLI(程式語言接口)編寫自己的系統任務直接與硬體仿真器(如Verilog-XL)結合使用。C語言是目前世界上應用最為廣泛的一種程式語言,因而C程序的設計環境比Verilog HDL更完整。此外,C語言可應用於許多領域,有可靠的編譯環境,語法完備,缺陷較少。
比較起來,Verilog 語言只是針對硬體描述的,在別處使用(如用於算法表達等)並不方便。而且Verilog的仿真、綜合、查錯工具等大部分軟體都是商業軟體,與C語言相比缺乏長期大量的使用,可靠性較差,亦有很多缺陷。所以,只有在C語言的配合使用下,Verilog才能更好地發揮作用。
面對上述問題,最好的方法是C語言與Verilog語言相輔相成,互相配合使用。這就是既要利用C語言的完整性,又要結合Verilog對硬體描述的精確性,來更快、更好地設計出符合性能要求的硬體電路系統。
利用C語言完善的查錯和編譯環境,設計者可以先設計出一個功能正確的設計單元,以此作為設計比較的標準。然後,把C程序一段一段地改寫成用並型結構(類似於Verilog)描述的C程序,此時還是在C的環境裡,使用的依然是C語言。
如果運行結果都正確,就將C語言關鍵字用Verilog相應的關鍵字替換,進入Verilog的環境。將測試輸入同時加到C與Verilog兩個單元,將其輸出做比較。這樣很容易發現問題的所在,更正後再做測試,直至正確無誤。
混合語言設計流程往往會在兩種語言的轉換中會遇到許多難題,如下所示。
C程序是按行依次執行的,屬於順序結構。而Verilog描述的硬體是可以在同一時間同時運行的,屬於並行結構。這兩者之間有很大的衝突。另外,Verilog的仿真軟體也是順序執行的,在時間關係上同實際的硬體是有差異的,可能會出現一些無法發現的問題。
C語言的函數調用與Verilog中模塊的調用也有區別。C程序調用函數是沒有延時特性的,一個函數是惟一確定的,對同一個函數的不同調用是一樣的。而Verilog中對模塊的不同調用是不同的,即使調用的是同一個模塊,必須用不同的名字來指定。
Verilog的語法規則很死,限制很多,能用的判斷語句有限,仿真速度較慢,查錯功能差,錯誤信息不完整。仿真軟體通常也很昂貴,而且不一定可靠。C語言的花樣則很多,轉換過程中會遇到一些困難。
C語言沒有時間關係,轉換後的Verilog程序必須要能做到沒有任何外加的人工延時信號,否則將無法使用綜合工具把Verilog原始碼轉化為門級邏輯。
如表1所示為常用的C語言與Verilog相對應的關鍵字與控制結構。
表1 C語言與Verilog相對應的關鍵字與控制結構表
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語言與Verilog相對應的運算符。
表2 C語言與Verilog對應運算符表
C | Verilog | 功 能 |
* | * | 乘 |
/ | / | 除 |
+ | + | 加 |
- | - | 減 |
% | % | 取模 |
! | ! | 反邏輯 |
邏輯與 | ||
|| | || | 邏輯或 |
> | > | 大於 |
小於 |
續表
C | Verilog | 功 能 |
>= | >= | 大於等於 |
= | = | 小於等於 |
== | == | 等於 |
!= | != | 不等於 |
~ | ~ | 位反相 |
按位邏輯與 | ||
| | | | 按位邏輯或 |
^ | ^ | 按位邏輯異或 |
~^ | ~^ | 按位邏輯同或 |
>> | >> | 右移 |
左移 | ||
?: | ?: | 相當於if-else |
從上面的講解我們可以總結如下。