1、Verilog語法 沒錯,我們就是拿C語言照貓畫虎,下面是一個“老虎”的模型。 我們一個個看他跟“貓”不一樣的地方 module nand( input in1, input in2, output out ); wire tmp; assign tmp = in1 & in2; assign out = ~tmp; endmodule 模塊定義跟C語言的函數很相似吧 1、模塊必須使用“module”關鍵字,他也沒有返回值。 2、模塊沒有beginmodule,只有endmodule 3、模塊對外接口有input,output,inout,但為了入門著想,只談input和output 模塊內部還有個中間變量耶,是不是看見了tmp就有很熟悉的感覺了。 沒錯,他就是中間“變量”,在硬件上他就是一根導線,wire望文生義即可。 看見了“=”就應該猜到這是賦值語句了,沒錯,但Verilog的語法要求前面必須有個苦B的assign關鍵字 至于“&”和“~”這2個運算符號,就不講了吧,C語法搞不清的兄弟,對不住了 有人會說,你這“變量”到底是int還是long還是flot抑或double呢? 好了,咱繼續照貓畫虎,不過老虎畢竟跟貓是不一樣的,比如老虎會虎嘯,貓只會喵喵。 wire[7:0] tmp; 這一下子把tmp從一根線,擴展成了8根線,覺得是7根線的自己去看C語言課本去。 好了,我們要虎嘯了,同時喵喵幾下,對比著看 wire[7:0] tmp; wire[3:0] high; assign high = tmp[7:4]; //虎嘯的Verilog high = tmp<<4; //喵喵的C語言 硬件就是硬件,可以隨意飛線,你甚至可以把tmp里面的bit6,bit3,bit1,bit7組成一個Nibble 不知道Nibble不要緊,它就是Half Byte的 assign high = {tmp[6],tmp[3],tmp[1],tmp[7]}; //虎嘯的Verilog high = (tmp & 0x40) ? 0x08 : 0; //喵喵的C語言 high |= (tmp & 0x08) ? 0x04 : 0; //喵喵的C語言 high |= (tmp & 0x02) ? 0x02 : 0;; //喵喵的C語言 high |= (tmp & 0x80) ? 0x01 : 0;; //喵喵的C語言 這下知道喵喵跟虎嘯的差距了吧,C語言,把如貓添翼?表達式都用上了,還是4行代碼才表達出自己的意圖。 當然,Verilog也有他的?表達式,那用上了,就真的是如虎添翼了 C語言的switch/case語句 switch(tmp) { case 1: high =1; break; case 3: high =5; break; case 5: high =2; break; case 9: high =1; break; default: high =11; } Verilog的case語句 case(tmp) 1: high =1; 2: high =5; 3: high =1; 4: high =1; default: high = 1; 發現了沒,首先打字要少敲很多case了吧,case已經升級當主管了,小羅羅們直接跟這冒號就可以了。 細心的文藝青年,應該發現了一個大秘密,那個四處張揚,到處留種的break居然不見了。 Verilog不需要break了,它默認每個語句自動break,這時有人又擔心,那我有2個語句咋辦? 問得好,又有2個keyword要粉末登場了,begin/end 學會Pascal語言的朋友,肯定認得他倆,在C語言中被{和}所替代 Verilog本來也想用{和}的,畢竟寫代碼是要敲鍵盤的,能少敲誰也不愿意多敲。 可惜{和}被用掉了,用在了哪里?到上面找去, case(tmp) 1,2,3,4: begin high =1; high1 =3; high8 =9; end default: high = 1; 這個排版,是不是又點更像C語言的風格了 你也許已經看到了,C語言中多個case項公用一段代碼的情況,在Verilog里面也有,而且更TMD的簡潔 if/else語句就不講了,這方面貓和老虎太像了,照貓畫虎就八九不離十了。 好了,下面有個用得非常多的always語句 always(tmp1, tmp2) begin out1 = tmp1 ^ tmp2; out2 = tmp1 + tmp2; end 又是喵喵和虎嘯的區別了,C語言的while也是always的意思,但while不如always忠誠。 C的while語句,是隨著CPU的時鐘節奏,一步一步的走,然后Loop循環回來,直到永遠或者有人叫她出臺(霸王的break或者while條件不滿足了) Verilog的always可就忠誠多了,只要tmp1和tmp2中的任何一個變動,out1和out2都跟著動,clk來不來都會工作,這就是主動和被動的差別 好了,看到這里,你應該知道,文藝青年和苦B青年其實也有很多共同之處的,如果你認識文藝青年,那跟苦B青年交朋友也不難了。 |