Verilog HDL基礎之:與C語言的區別與聯繫(獨家)

2020-12-08 電子產品世界

數字電路設計工程師一般都學習過程式語言、數字邏輯基礎、各種EDA軟體工具的使用。就程式語言而言,國內外大多數學校都以C語言為標準,只有少部分學校使用Pascal 和Fortran。

本文引用地址:http://www.eepw.com.cn/article/201706/348844.htm

算法的描述和驗證常用C語言來做。例如要設計Reed-Solomen編碼/解碼器,可以分為下面幾個步驟。

  1. 先深入了解Reed-Solomen編碼/解碼的算法。
  2. 編寫C語言的程序來驗證算法的正確性。
  3. 運行描述編碼器的C語言程序,把在數據文件中的多組待編碼的數據轉換為相應的編碼後數據,並存入文件。
  4. 編寫一個加幹擾用的C語言程序,用於模擬信道。它能產生隨機誤碼位(並把誤碼位個數控制在糾錯能力範圍內),將其加入編碼後的數據文件中。運行該加幹擾程序,產生帶誤碼位的編碼後的數據文件。
  5. 編寫一個解碼器的C語言程序,運行該程序把帶誤碼位的編碼文件解碼為另一個數據文件。

比較原始數據文件和生成的文件,便可知道編碼和解碼的程序是否正確(能否自動糾正糾錯能力範圍內的錯碼位),用這種方法我們就可以來驗證算法的正確性。但這樣的數據處理其運行速度只與程序的大小和計算機的運行速度有關,也不能獨立於計算機而存在。

如果要設計一個專門的電路來進行這種對速度有要求的實時數據處理,除了以上介紹的C程序外,還需編寫硬體描述語言(如Verilog HDL或 VHDL)的程序。然後進行仿真以便從電路結構上保證算法能在規定的時間內完成,並能與前端和後端的設備或器件正確無誤地交換數據。

用硬體描述語言(HDL)的程序設計硬體的好處在於易於理解、易於維護,調試電路速度快,有許多的易於掌握的仿真、綜合和布局布線工具,還可以用C語言配合HDL來做邏輯設計的前後仿真,驗證功能是否正確。

在算法硬體電路的研製過程中,計算電路的結構和晶片的工藝對運行速度有很大的影響。所以在電路結構確定之前,必須經過多次仿真。

  • C語言的功能仿真。
  • C語言的並行結構仿真。
  • Verilog HDL的行為仿真。
  • Verilog HDL RTL級仿真。
  • 綜合後門級結構仿真。
  • 布局布線後仿真。
  • 電路實現驗證。

下面介紹用C語言配合Verilog HDL來設計算法的硬體電路塊時考慮的三個主要問題:

1.為什麼選擇C語言與Verilog 配合使用

首先,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兩個單元,將其輸出做比較。這樣很容易發現問題的所在,更正後再做測試,直至正確無誤。

2.C語言與Verilog語言互相轉換中存在的問題

混合語言設計流程往往會在兩種語言的轉換中會遇到許多難題,如下所示。

  • 怎樣把C程序轉換成類似Verilog結構的C程序。
  • 如何增加並行度,以保證用硬體實現時運行速度達到設計要求。
  • 怎樣不使用C中較抽象的語法(例如迭代、指針、不確定次數的循環等)。也能來表示算法(因為轉換的目的是用可綜合的Verilog語句來代替C程序中的語句,而可用於綜合的Verilog語法是相當有限的,往往找不到相應的關鍵字來替換)。

C程序是按行依次執行的,屬於順序結構。而Verilog描述的硬體是可以在同一時間同時運行的,屬於並行結構。這兩者之間有很大的衝突。另外,Verilog的仿真軟體也是順序執行的,在時間關係上同實際的硬體是有差異的,可能會出現一些無法發現的問題。

C語言的函數調用與Verilog中模塊的調用也有區別。C程序調用函數是沒有延時特性的,一個函數是惟一確定的,對同一個函數的不同調用是一樣的。而Verilog中對模塊的不同調用是不同的,即使調用的是同一個模塊,必須用不同的名字來指定。

Verilog的語法規則很死,限制很多,能用的判斷語句有限,仿真速度較慢,查錯功能差,錯誤信息不完整。仿真軟體通常也很昂貴,而且不一定可靠。C語言的花樣則很多,轉換過程中會遇到一些困難。

C語言沒有時間關係,轉換後的Verilog程序必須要能做到沒有任何外加的人工延時信號,否則將無法使用綜合工具把Verilog原始碼轉化為門級邏輯。

3.如何利用C語言來加快硬體的設計和查錯

如表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

從上面的講解我們可以總結如下。

  • C語言與Verilog硬體描述語言可以配合使用,輔助設計硬體。
  • C語言與Verilog硬體描述語言很像,但要稍加限制。
  • C語言的程序很容易轉成Verilog的程序。

相關焦點

  • Verilog HDL基礎之:賦值語句和塊語句
    非阻塞賦值方式和阻塞賦值方式的區別常給設計人員帶來問題。問題主要是給「always」塊內的reg型信號的賦值方式不易把握。到目前為止,前面所舉的例子中的「always」模塊內的reg型信號都是採用下面的這種賦值方式:b = a;這種方式的賦值並不是馬上執行的,也就是說「always」塊內的下一條語句執行後,b並不等於a,而是保持原來的值。
  • Verilog HDL基礎之:程序基本結構
    Verilog HDL是一種用於數字邏輯電路設計的語言。用Verilog HDL描述的電路設計就是該電路的Verilog HDL模型。Verilog HDL既是一種行為描述的語言,也是一種結構描述的語言。也就是說,既可以用電路的功能描述,也可以用元器件和它們之間的連接來建立所設計電路的Verilog HDL模型。
  • C語言怎麼樣?今天聊聊C語言的發展史!
    第一個C語言編譯器是怎樣編寫的? 不知道你有沒有想過,大家都用C語言或基於C語言的語言來寫編譯器,那麼世界上第一個C語言編譯器又是怎麼編寫的呢?這不是一個「雞和蛋」的問題…… 回顧一下C語言歷史:Tomphson在BCPL的基礎上開發了B語言,Ritchie又在B語言的基礎上成功開發出了現在的C語言。
  • 「C語言從入門到入土」必備C語言基礎筆記整理
    一、C語言1、什麼是C語言?C語言是人寫機器看的一種語言。C語言是高級語言中的低級語言。C語言貼近硬體。C語言的入門學習比較簡單。彙編語言——>B語言——>C語言2、C語言的特性首先C語言就是你的女朋友。無論你讓它幹什麼,它絕對不會自己找到方法。
  • 硬體描述語言Verilog HDL設計進階之: 典型實例-狀態機應用
    狀態機,顧名思義,就是一系列狀態組成的一個循環機制,這樣的結構使得編程人員能夠更好地使用HDL語言,同時具有特定風格的狀態機也能提高程序的可讀性和調試性。本實例通過設計一個狀態機來控制紅色颶風II代Xilinx開發板上面的8個LED燈循環閃爍。在本實例狀態機的設計過程中,讀者需要著重注意狀態機設計的一些特性。·FSM設計方法(米勒型和摩爾型)。
  • C語言基礎知識學習(一)
    C程序基礎1. 標識符在程序中使用的變量名、函數名、數組名、指針名、標號等稱為標識符.原先的C89標準中只有32個關鍵字然後在1999年之後進行了兩次技術修正,新出臺了C99標準新增加了5個關鍵字 分別是:restrict, inline, _Complex, _Imaginary, _Boolb) 預定義標識符包括C語言提供的庫函數
  • 最全的C語言基礎知識都在這了
    我們用一個簡單的c程序例子,介紹c語言的基本構成、格式、以及良好的書寫風格,加深小夥伴們對C語言的認識。2、main()----在c語言中稱之為「主函數」,一個c程序有且僅有一個main函數,任何一個c程序總是從main函數開始執行,main函數後面的一對圓括號不能省略。3、被大括號{ }括起來的內容稱為main函數的函數體,這部分內容就是計算機要執行的內容。
  • 入門前須知基礎!C語言基礎教學檔案!編號零零肆
    C語言令牌每個C程序都是一組指令,每個指令都是一些單獨的單元的集合。每個最小的單個AC程序單元稱為令牌。AC程序(用來定義電腦程式的形式語言)中的每條指令都是令牌的集合。令牌用於構建c程序,它們被稱為AC程序的基本構建塊。
  • 快速上手系列-C語言之基礎篇(一)
    按照之前的計劃,這篇文章本該寫C語言簡介,包括一些歷史背景,發展狀況, 語言特點什麼的,這些東西著實比較囉嗦。吃飯用的筷子,到現在我都不知道它的由來,不知道它是在什麼歷史背景下誕生的有些東西還是有必要了解一下,比如,C語言所產生的代碼運行速度比彙編語言編寫的代碼運行速度稍慢一點,但還是有得一拼,同時C語言要比彙編語言編寫的代碼可讀性高,可移植性好。
  • C語言中的char類型也有signed和unsigned?字符也有正負之分嗎?
    C語言中的 unsigned int 和 signed int 類型的區別,相信即使是初學者也是清楚的,無非就是最高位是否用來做符號位而已。但是最近有讀者問我,為什麼 char 類型也要區分 unsigned char 和 signed char 型呢?
  • 二級c語言考試改革_計算機二級考試c語言考試題型 - CSDN
    網站:http://chaxun.neea.edu.cn三、計算機二級考試的簡介以及C語言的試題分析1、計算機二級考試是全國計算機等級考試(National Computer Rank Examination,簡稱NCRE)四個等級中的一個等級,考核計算機基礎知識和使用一種高級計算機語言編寫程序以及上機調試的基本技能。計算機二級考試採用全國統一命題、統一考試的形式。
  • 快速上手系列-C語言之數組
    我們需要表示某個班級學生的年齡,比如,張三今年3歲,李四今年80歲,很顯然,我們可以用C語言中的某個數據類型來表示,比如int型:int age_zhangsan = 3; int age_lisi = 80; 那如果這個班級有50個同學,我們是不是需要定義50個變量來存放每個同學的年齡呢,當然可以,但是這麼做真的很不合理。
  • Go語言基礎之結構體(春日篇)
    回憶map之前我們講過,Go語言的map是鍵值對的方式存儲數據的,就像這樣的。不記得的小夥伴請戳:一篇文章帶你了解Go語言基礎之map、Go語言基礎之map補充。 func main() {     var n1 Nint = 1     fmt.Println(n1)//1 } 自定義類型和類型別名區別
  • C語言相關文件的基本知識
    用過計算機的人,對文件都不陌生,大多數人都接觸過,今天我們來講講關於C語言相關文件的基本知識。首先,我們先來了解了解什麼是文件。文件有不同的類型,在程序的設計中,主要有兩種文件; 1.程序文件;包括源程序文件(後綴為.c),目標文件(後綴為.obj),可執行文件(後綴為.exe)等,這類文件的內容是程序代碼。
  • 51單片機基礎剖析(基於C語言)
    該區域的低地址區與data區地址一致,高地址區域是52系列在51系列基礎上擴展的並與特殊功能寄存器具有相同地址編碼的區域。即:data memory是idata memory的一個子集。 xdata:只能用於聲明變量,不能用來聲明函數,該區域位於MCU外部,採用16位地址線進行編碼,存儲大小被限制在64KB以內。
  • 自考「C語言程序設計」模擬試題九
    一、選擇題  1.一個C語言程序是由(      )構成。  A.語句          B.行號            C.數據           D.函數  2.下面標識符中正確的是(       )。
  • C語言之const和volatile"究極"學習
    const只讀變量:const修飾的變量是只讀的,本質上還是變量const修飾的局部變量在棧上分配空間const修飾的全局變量在全局數據區分配空間const只在編譯期有用,在運行期沒有用註:const修飾的變量不是真的常量,它只是告訴編譯器該變量不能出現在賦值符號的左邊2、const全局變量的分歧:在現代c語言編譯器中
  • C語言基礎:標識符
    標識符:在程式語言中,標識符是用戶編程時使用的名字,變量、常量、函數、語句塊都有名字。是用來標識某個實體的一個符號,是對變量名、函數名、標號和其他各種用戶定義的對象命名。C 標識符是用來標識變量、函數,或任何其他用戶自定義項目的名稱。
  • 第一篇:C語言編程基礎語法
    本專欄系列分六篇,總結了C語言基礎知識的核心要點。教學視頻已上線,讀者可根據自身情況有選擇性地學習。01編程基礎C語言——貝爾實驗室、Dennis Ritchie屬於高級語言,更接近人類語言邏輯,需要編譯器編譯,執行依賴運行環境;但容易學習。其特點:模塊化編程程序設計,層次清晰;語句簡潔,提出程序庫概念;功能強大,系統、應用軟體均可開發;移植性好,適合不同的作業系統。除此之外,C語言還有豐富的運算符、數據結構等,程序設計自由度大,可以對硬體進行操作。