verilog語法的基本結構
1、verilog的定義
verilog,一種硬件描述語言,致力於提高數字電路,尤其是大規模數字電路的描述規范。從描述就可以看出,這個語言和C不同,不是高級語言。但是,這個語言也不像匯編。其本身能夠完成許多高級語言的功能,比如判斷、計算、選擇等操作。這就容易讓人誤以為這是一門高級語言。其實,有人想將高級語言引入硬件設計的,只不過現在還沒有成功。高級語言和硬件語言之間的差距還是比較大的。
2、verilog的基本語法
想學一門語言,自然要了解語法。對於高級語言來說,其本身源自人類的邏輯,所以學習者可以更具自身的邏輯來實現功能。但是對於硬件語言來說,必須掌握一套內在的規律才能設計。目前在學習了一些基本的verilog模塊后,個人覺得初級的verilog語言遵循的就是信號。verilog實現了信號的輸入,處理和輸出。每一個信號都必須與設計相關聯。對於無關信號編譯器會自動排除並發出警告。與此同時,每一個信號都占用着實際的硬件資源,越少的信號使用,硬件的規模就會越小。verilog的語法原則就是信號正確。
3、verilog的基本關鍵字
想寫verilog,首先要做的就是了解關鍵字,這是開始的材料。
第一個就是module,用於聲明硬件主體。在一個verilog代碼中寫一個module,並且模塊名與文件名保持一致。加上endmodule就構成了一個閉合。這里類似與HTML中的標簽。
第二個就是input 和 output,前面提到verilog是以處理信號為目標的,那么就會有信號的聲明。input和output就是聲明這個模塊的外部連接信號。當然,還有inout,這里就不做介紹。其他在內部聲明的都是內部信號。
第三個就是wire和reg,這部分則是信號的類別。和C語言中的數據類型類似,reg和wire是兩種不同類型的變量。
第四個就是assign和always,這兩個就是信號的處理函數了,可以對應到C中的printf等等系統函數。
有了這四個部分,實際上就可以設計出具有基本帶你路功能的verilog代碼了。
4、verilog的基本設計
verilog的設計,我個人習慣從信號的角度入手設計,通過實現描述信號的變化來設計。例如led燈閃爍就可以描述為一個周期變化的信號。依次執行事件1、2、3等就可以描述為狀態機信號模型。這里實際上是對應到了數字設計的部分。利用verilog,完全可以設計出一個帶有IO、計算器、控制器、存儲器的小型處理器。當然,也可以按照事件的發生來設計,這里自己選擇就好。
還是附上一段簡單的代碼吧
module mux(out, a, b, sel); input a, b, sel; output out; reg out; always @(a or b or sel) if (!sel) out = a; else out = b; endmodule
上面的代碼是描述了一個選擇器。即sel=0,out=a,否則out=b。
代碼的設計大體的思路就是這樣,嘗試一下就可以快速的理解。
5、仿真文件
前面說的都是設計文件。但是verilog還有一個重要的作用就是數字仿真。學過數電就會知道,電路仿真在軟件上實現時需要自己去找合適的激勵,這一步不斷的調整還是比較費力的。而對於使用verilog的設計而言,雖然可以綜合為rtl級電路,但是仿真時不可能將其轉化為原理圖,這樣太費時間了。對於大型項目來說,基本不可能。所以,既然激勵源也是由電路構成的,自然而然可以使用verilog去描述。所以這里產生了仿真verilog文件。
和設計時verilog語法不同,仿真時語法更為隨意,不對應電路,會有許多系統函數可以使用。具體的設計還是要在實踐中理解。
插入一段代碼:
module RelationTest; reg a; reg [1:0]b; reg [5:0] c; initial begin a=1'b1; b=2'b00; c=6'b101001; $displayb({a, b}); //??3?b100 $displayb({c[5:3], a}); // 4?b1011 $displayb({4{a}}); // 4?b1111 end endmodule
這里就是仿真文件,可以看到設計中多了許多其他的語法。這些語法有時間再講吧。這里就是了解一下代碼結構。