首页 > 代码库 > verilog if(0) if(1) 小技巧
verilog if(0) if(1) 小技巧
本文主要介绍verilog if(0),if(1)给verilog进行语法修正的功能。
verilog的语法太简单,一直是我们诟病的地方所在,想实现一个功能有的时候必须敲上大段功能重复的代码段,有的时候只是其中的某个参量发生变化。这个时候懒惰的我们就会想出一种解决方案,好在verilog标准里(1995,2001)标准里都有对宏的支持。众所周知,宏的作用就是生成代码,有了宏的帮助我们就可以将大量重复的功能放入宏中,然后在程序中直接写上一句宏即可。这样做的好处是,对我们整体代码以及综合后的结果没有任何影响,因为宏在编译的时候就已展开。
ok利用宏已经可以解放我们少许工作量了。我模拟了下面这样的一个场景。
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有规律的差异的一个场景。
好了,上面这段代码怎么样,如果你接触过其他语言,那么你一定看不惯这种写法,(好吧我承认是我自己看不惯)。
接下来我们用我们强大的帮手宏哥哥来帮我们减少工作量。
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)进行语法修正后的宏如下所示
`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
verilog if(0) if(1) 小技巧
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。