Verilog初级教程(2)Verilog HDL的初级语法
文章目录
- 前言
- 正文
- 注释
- 空格
- 操作符
- 数字格式
- 字符串
- 标识符
- 关键字
- verilog修订
- 写在最后
前言
学习Verilog和学习任何一门编程语言一样,都需要从语法开始,不会语法去学习设计是几乎不可能的,当然从另一门类似语言转来的除外(例如VHDL是你的第一门硬件描述语言)。学会了语法不懂硬件思维也不可以,因为你不能使用软件思维来设计硬件电路。
本系列其他博文:
Verilog初级教程(1)认识 Verilog HDL
初学者值得一读的博文:
FPGA/ASIC初学者应该学习Verilog还是VHDL?
Verilog以及VHDL所倡导的的代码准则
FPGA基础知识极简教程(2)抛却软件思维去设计硬件电路
本文以极简的风格来谈谈这一篇博文的话题,verilog中的初级语法。
正文
注释
Verilog提供了两种注释的方式,分别为:
- 单行注释
//This is a single line comment
当然,你这样写也可以:
/// This is Okay!
这是因为双斜杠后面的都是注释!
- 多行注释
/* this is a
multiple line
comments!
*/
空格
verilog中的空格是起到缩进的作用,基本没有什么要求,你可以使用TAB键,空格键,回车键在代码中的任何位置,它几乎会被语法忽略,但是为了代码的可读性,还是建议遵守一定的规则。
注:空格在字符串中不会被忽略!
例如:
always@(*) begin
//--------
c = a + b;adder inst_adder(
.i_a(i_a),
.i_b(i_b),
.o_dout(o_dout),
.o_sum(o_sum)
);end
以美观易读为准,或者和公司标准保持一致,做个正常人。
操作符
操作符分为三种,本文不详细展开:
- 一元运算符应显示在其操作数的左侧
- 二进制运算符应出现在其操作数之间
- 条件运算符有两个单独的运算符,它们将三个操作数分开
例如:
//一元操作符
b = ~a;
//二元操作符
assign c = a & b;
//条件操作符
assign z = en ? a : b;
数字格式
我们最常见的数字表示为十进制,然而,数字还可以表示为二进制,八进制,以及十六进制等,其中二进制和十六进制较为常见。
默认情况下,Verilog仿真器会把数字默认为十进制,除非你使用特定的格式告诉它,你使用的是二进制,八进制或者十六进制。
例如:
3'b001;
3表示的是这个数字有多少位;b表示的是进制,这里表示的是二进制,八进制用o来表示,十六进制用h,十进制用d,当然如果不写进制,而默认为十进制。
例如:
reg [3:0] b = 10;
则b被初始化为十进制10;如下分别为二进制,十六进制,八进制以及十进制的表示方法:```c
3'b001; // this is binary
8'ha0; // this is hexadecimal
6'o12; // this is octal
4'd15; // this is decimal
Verilog 2001标准更新了一些用法,例如可以省去位宽也可以:
initial begin
a = 'b001; // this is binary
b = 'ha0; // this is hexadecimal
c = 'o12; // this is octal
d = 'd15; // this is decimalend
这时,编译器会根据左边变量的位宽来自动扩展右边数值或者截位后赋值给左边。
还有需要注意的是,如果需要给一个有符号reg型变量赋值一个负数值,如何表达呢?
如下:
reg signed [7:0] a = -8'd21;
也就是说,负号必须放在位数的前面,如下这种写法就是错误的:
8'd-4; // Illegal
参考:算术运算的RTL代码规则总结
字符串
Verilog中的字符串使用场景大多数是在仿真时使用,它由双引号包裹着(位于双引号之间)。字符串中的一个字符使用一个字节来存储。
"Hello World!" // String with 12 characters -> require 12 bytes
"x + z" // String with 5 characters
字符串中的字符不能分割成多行来写,如下是不合规的:
"How are you
feeling today ?" // Illegal for a string to be split into multiple lines
标识符
标识符就是变量的名字以及模块的名字,它们可以有大小写字母,数字,美元符号,下划线构成,但是美元符号$以及数字不能作为标识符的开头,如下:
integer var_a; // Identifier contains alphabets and underscore -> Valid
integer $var_a; // Identifier starts with $ -> Invalid
integer v$ar_a; // Identifier contains alphabets and $ -> Valid
integer 2var; // Identifier starts with a digit -> Invalid
integer var23_g; // Identifier contains alphanumeric characters and underscore -> Valid
integer 23; // Identifier contains only numbers -> Invalid
关键字
关键字是保留用于定义语言结构的特殊表示符,用小写字母表示,每一种语法都有其关键字,Verilog语法也不例外,你在给模块以及变量命名的时候应该避开这些关键字:
verilog修订
多年来,Verilog进行了一些修订,从1995到2001年进行了更多的添加,如下图:
写在最后
参考资料
我的微信公众号:FPGA LAB
我的知乎二维码 :
我的同行邀请
Verilog初级教程(2)Verilog HDL的初级语法相关推荐
- verilog 移位运算符 说明_Verilog HDL的基本语法
I/O声明 输入声明 input[msb:lsb]端口1,端口2,端口3,-- 输出声明 output[msb:lsb]端口1,端口2,端口3,-- 输入输出声明 inout[msb:lsb]端口1, ...
- javplayer 使用教程_意大利单簧管初级教程报名步骤
意大利单簧管初级教程报名步骤,在课程的设置方面,北京慧禾国际艺术教育更注重于音乐类专业词汇的培训,加强学生生活口语的实际运用,为学生出国留学打下坚实基础. 意大利单簧管初级教程报名步骤, 在笔者使用过 ...
- Verilog初级教程(23)Verilog仿真中的显示任务
文章目录 前言 正文 Display/Write Tasks Verilog Strobes Verilog Continuous Monitors Verilog Format Specifiers ...
- Verilog初级教程(21)Verilog中的延迟控制语句
文章目录 前言 正文 延迟控制语句 事件控制语句 Named Events Event or operator 往期回顾 参考资料及推荐关注 前言 Verilog中的延迟控制有两种类型–延迟和事件表达 ...
- Verilog初级教程(20)Verilog中的`ifdef 条件编译语句
文章目录 前言 正文 语法 示例 Testbench文件 往期回顾 参考资料及推荐关注 前言 `ifdef条件编译语句在逻辑设计中还是很常见的,但也常见一些滥用的情况,这应该避免. 应该在什么情况下使 ...
- Verilog初级教程(15)Verilog中的阻塞与非阻塞语句
文章目录 前言 正文 阻塞赋值 非阻塞赋值 往期回顾 参考资料以及推荐关注 前言 本文通过仿真的方式,形象的说明阻塞赋值以及非阻塞赋值的区别,希望和其他教程相辅相成,共同辅助理解. 正文 阻塞赋值 阻 ...
- Verilog初级教程(14)Verilog中的赋值语句
文章目录 前言 正文 合理的左值 过程性赋值(Procedural assignment) 连续赋值 过程连续性赋值 往期回顾 前言 何为赋值语句?即将值放到线网或者变量上,这种操作称为赋值,英文:a ...
- Verilog初级教程(12)Verilog中的generate块
文章目录 前言 正文 generate for generate if generate case 参考资料 本系列博文 前言 verilog中的generate块可以称为生成块,所谓生成,可以理解为 ...
- Verilog初级教程(11)Verilog中的initial块
文章目录 前言 正文 语法格式 initial块是用来干什么的? initial块何时开始又何时结束? 一个模块中允许有多少个initial块? 参考资料 写在最后 前言 仿真中通常会依次执行一组Ve ...
最新文章
- 3-flutter 项目结构 资源 依赖
- pxe+kickstart 实现基于网络的无人值守安装操作系统
- 7-21 求前缀表达式的值
- java查看对象地址_如何获取到JAVA对象所在的内存地址
- java代码代替xml实现图片
- 安卓设备刷linux发行版,绝对精华,大牛教你在Android系统上安装linux发行版
- 动态创建数据表php,PHP实现动态添加XML中数据的方法
- 将字符串使用md5加密
- Nginx 之父被捕,程序员如何避免面向起诉编程?| CSDN 博文精选
- python 通过ip获取城市_Python根据用户IP判断所属城市 !
- 绝地求生测试服画面优化软件,绝地求生大逃杀优化方法 画面优化工具使用教程_3DM单机...
- hdu 4638 Group
- 什么是工作单位邮箱?工作域名邮箱怎么弄?
- 计算机d盘变为raw,d盘文件系统raw 硬盘变成raw格式怎么办
- 数字城市的意义有哪些?如何构建数字城市?
- 将idea中文显示转化成英文
- 机房远程集中监控系统
- js模拟小球重力回弹效果
- 「kd指标」kd指标原理
- 数据可视化:世界银行数据(1960-2017)
热门文章
- Ubuntu 键盘鼠标失效解决办法
- 《2022 大数据技术与架构视频合集》附PPT和文档,限时下载
- Poser 2014 PRO SR1 资料收集
- linux nand flash模拟u盘,海思g_mass_storage.ko模拟U盘
- 2022年全国职业院校技能大赛 网络搭建与应用赛项 公开赛卷 (十套合卷)
- 大数据_01【介绍】
- errno!=EINTR是什么意思
- 如何使用python AI快速比对两张人脸图像?
- 赫夫曼树、赫夫曼编码
- 微信小程序车牌号组件,车牌号键盘,兼容新能源号牌