文档章节

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

quanwei9958
 quanwei9958
发布于 2014/12/17 11:20
字数 873
阅读 1512
收藏 6

  本文主要介绍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



这样就符合一般性语法了。有趣的是,当我用iverilog -E查看其宏展开的时候发现竟然在展开的时候就把if(1),if(0)给去掉了,所以我们修正后的宏没有给电路造成一丝影响,仅仅是方便了我们人类的书写习惯,以及阅读习惯。

© 著作权归作者所有

quanwei9958

quanwei9958

粉丝 29
博文 79
码字总数 36250
作品 0
程序员
私信 提问
加法器的实现

verilog实现加法器,从底层的门级电路级到行为级,本文对其做出了相应的阐述。 1、一位半加器 所谓半加器就是有两个输入,两个输出,不考虑进位。其真值表如下: A B S C 0 0 0 0 0 1 1 0 1 ...

许晴125
2018/01/07
0
0
Windows 下使用icuras+GRKWave

使用开源的verilog在windows下对verilog代码进行仿真。 开源的icuras verilog和GRKWave仿真器下载地址: http://bleyer.org/icarus/ 不过在安装icuras中会提示是否安装GRKWave,当然了,这就不...

ofm
2011/08/27
162
1
Verilog学习(二)Verilog模型

主要有五种模型: 1) 系统级(system) 2) 算法级(algorithmic) 3) RTL级(RegisterTransferLevel): 4) 门级(gate-level): 5) 开关级(switch-level) 其中门类型有: 用户定义的原语(UDP) 注意...

hhxun
2018/01/14
0
0
用Verilog-HDL摩尔型状态机进行流程控制

用Verilog-HDL摩尔型状态机进行流程控制 前段时间,开发了一个简单的回波信号识别算法,我会分几篇文章分享这个基于FPGA的回波识别算法的开发过程和原码,欢迎大家不吝赐教。以下原创内容欢迎...

helesheng
2018/08/03
0
0
通信原理---FPGA---HDB3译码

 参考我的上两篇HDB3编码,给出HDB3译码的Verilog实现 https://blog.csdn.net/dengfenglai123/article/details/79674063(编码) https://blog.csdn.net/dengfenglai123/article/details......

dengfenglai123
2018/03/24
0
0

没有更多内容

加载失败,请刷新页面

加载更多

UAVStack功能上新:新增JVM监控分析工具

UAVStack推出的JVM监控分析工具提供基于页面的展现方式,以图形化的方式展示采集到的监控数据;同时提供JVM基本参数获取、内存dump、线程分析、内存分配采样和热点方法分析等功能。 引言 作为...

宜信技术学院
12分钟前
3
0
MySQL的5种时间类型的比较

日期时间类型 占用空间 日期格式 最小值 最大值 零值表示 DATETIME 8 bytes YYYY-MM-DD HH:MM:SS 1000-01-01 00:00:00 9999-12-31 23:59:59 0000-00-00 00:00:00 TIMESTAMP 4 bytes YYYY-MM......

物种起源-达尔文
19分钟前
4
0
云服务OpenAPI的7大挑战,架构师如何应对?

阿里妹导读:API 是模块或者子系统之间交互的接口定义。好的系统架构离不开好的 API 设计,而一个设计不够完善的 API 则注定会导致系统的后续发展和维护非常困难。比较好的API设计样板可以参...

阿里云官方博客
22分钟前
1
0
Rancher + VMware PKS实现全球数百站点的边缘K8S集群管理

Sovereign Systems是一家成立于2007年的技术咨询公司,帮助客户将传统数据中心技术和应用程序转换为更高效的、基于云的技术平台,以更好地应对业务挑战。曾连续3年提名CRN,并且在2012年到2...

RancherLabs
27分钟前
4
0
6、根据坐标,判断该坐标是否在地图区域范围内

最近在写配送区域相关的代码,具体需求如下: 根据腾讯地图划分配送区域,总站下边设多个配送分站,然后将订单中的收货地址将其分配给不同的配送分站。 1、地图区域划分(腾讯地图) 1.1、H...

有一个小阿飞
29分钟前
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部