verilog if(0) if(1) 小技巧

  本文主要介紹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)給去掉了,因此咱們修正後的宏沒有給電路形成一絲影響,僅僅是方便了咱們人類的書寫習慣,以及閱讀習慣。
相關文章
相關標籤/搜索