1. 程式人生 > >verilog學習記(快速入門)

verilog學習記(快速入門)

【 宣告:版權所有,歡迎轉載,請勿用於商業用途。  聯絡信箱:feixiaoxing @163.com】  

    在前面的一篇部落格中,我們說到可以使用modelsim對verilog進行測試和模擬。事實上,還有很多開源的工具可以使用,比如說iverilog+gtkwave,大家如果有興趣,可以在網上查詢相關的內容。現在的晶片設計越來越複雜,如果按照基本的閘電路設計,那麼效率是非常低的。恰當地使用硬體描述語言,可以有效地提高我們工作效率。同時,如果深入瞭解了verilog,對於我們瞭解晶片的設計流程也非常有益。在購物網站上,有這麼一本書,書名為《計算機原理與設計-Verilog HDL版》,它從另外一個角度幫我們描述了計算機到底是怎麼一回事,個人感覺內容非常好,也非常實在。

    當然,回到今天的內容。有過軟體開發經驗的朋友都知道,我們編寫程式碼的時候經常需要編寫測試用例對程式碼功能進行測試。其實編寫verilog程式碼也是一樣的。最簡單的verilog程式碼也需要兩部分的內容,一部分就是實現模組功能,另外一部分就是實現testbench功能,也就是測試我們設計的模組是否滿足需求。verilog程式碼和C語言很相似,大家不需要有什麼顧慮。首先,我們還是看看verilog module的程式碼內容,


module add(a, b, c);
  
  input a;
  input b;
  output c;
  
  assign c = a & b;

endmodule


    工科的同學都學過數位電路,一般來說數位電路包括邏輯電路和時序電路。上面的程式碼實現就是一個最簡單的邏輯功能,也就是與功能。其中a、b為輸入訊號,c為輸出訊號。那麼testbench程式碼是什麼樣的呢?我們接著看,
`timescale 1ns/1ns

module add_t;
  
  reg a;
  reg b;
  wire c;
  
  add t(a,b,c);
  
  initial
    begin
        #10 a = 1; b = 0;
        #10 a = 0; b = 1;
        #10 a = 0; b = 0;
        #10 a = 1; b = 1;
        #50 $finish;
    end
  
  initial
    $monitor("a = %d, ", a, " b = %d, ", b, "c = %d\n", c);
	
endmodule

    從程式碼中,大家可以看到initial的內容,也可以看到add的內容。add模組表示當前實現了一個add例項,名稱為t。initial模組中的內容是測試內容,從10ns開始,a為高電平、b為低電平;再過10ns,a為低電平、b為高電平;依次類推,直到訊號finish為止。在每一次訊號翻轉的時候,我們都會利用monitor列印相關資料資訊。當然,這些都是一些程式碼的內容,大家可以在modelsim實踐一下,看一下wave或者是dataflow,會有更多的收穫。