本文主要介紹verilog if(0),if(1)給verilog進行語法修正的功能。 code
verilog的語法太簡單,一直是咱們詬病的地方所在,想實現一個功能有的時候必須敲上大段功能重複的代碼段,有的時候只是其中的某個參量發生變化。這個時候懶惰的咱們就會想出一種解決方案,好在verilog標準裏(1995,2001)標準裏都有對宏的支持。衆所周知,宏的做用就是生成代碼,有了宏的幫助咱們就能夠將大量重複的功能放入宏中,而後在程序中直接寫上一句宏便可。這樣作的好處是,對咱們總體代碼以及綜合後的結果沒有任何影響,由於宏在編譯的時候就已展開。 編譯
ok利用宏已經能夠解放咱們少量工做量了。我模擬了下面這樣的一個場景。 class
always @(posedge clk) begin case(counter) 32'd1: begin answer=1/3; signal=0;signal=1;end 32'd2: begin answer=2/3; signal=0;signal=1;end 32'd3: begin answer=3/3; signal=0;signal=1;end ... 32'd16: begin answer=16/3;signal=0;signal=1;end endcase end不要去想這個例子的功能是什麼,這個不是咱們的重點,我想製造的就是每一個case裏面包含多句,可是每一個case有規律的差別的一個場景。
好了,上面這段代碼怎麼樣,若是你接觸過其餘語言,那麼你必定看不慣這種寫法,(好吧我認可是我本身看不慣)。 sed
接下來咱們用咱們強大的幫手宏哥哥來幫咱們減小工做量。 語法
always @(posedge clk) begin case(counter) 32'd1: `div(1) 32'd2: `div(2) 32'd3: `div(3) ... 32'd15: `div(16) endcase end宏的定義爲
`define div(x) begin signal=0; \ answer=x/3; \ signal=1; \ end一個很簡單的參數宏。
可是看到上面那個宏的使用真的能讓咱們知足嗎?那個div(1)的分號哪去了? 有人會告訴我說,verilog裏宏就是一個簡單的替代,你若在`div(x)後面加一個分號,那麼展開後將會是 程序
begin signal=0; answer=x/3; signal=1; end;在end;後面加上分號語法是不對的,因此本篇文章的做用就會出來了,本篇就是給這樣不能加分號的宏進行語法修正。有人會吐嘈我說至於這樣嗎,何須呢,就跟我剛開始看到c語言裏do{ ... }while(0) 同樣。若是你還不明白爲何這樣作,那麼就搜一下do while(0)瞭解一下背景。
利用if(1),if(0)進行語法修正後的宏以下所示 d3
`define div(x) if(1) \ begin signal=0; \ answer=x/3; \ signal=1; \ end \ else if(0)這樣,咱們使用代碼就變成爲
always @(posedge clk) begin case(counter) 32'd1: `div(1); 32'd2: `div(2); 32'd3: `div(3); ... 32'd16: `div(16); endcase end這樣就符合通常性語法了。有趣的是,當我用iverilog -E查看其宏展開的時候發現居然在展開的時候就把if(1),if(0)給去掉了,因此咱們修正後的宏沒有給電路形成一絲影響,僅僅是方便了咱們人類的書寫習慣,以及閱讀習慣。