Verilog语法入门,初学者必看
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
Verilog的词法约定
1Verilog是大小写相关的,其中的关键字全部为小写。
2空白符由空格、制表符、和换行符组成。
3单行注释以“//”开始,verilog将忽略此处到行尾的内容。多行注释以“/*”
开始,以“*/”结束。多行注释不允许嵌套
4操作符有三种:单目操作符、双目操作符和三目操作符。
5数字声明
Verilog中有两种数字生命:指明位数的数字和不指明位数的数字
指明位数的数字表示形式:
Size用来指明数字位宽度,只能用十进制整数表示
Base format包括十进制(’d或’D),二进制(’b或’B),八进制(‘o或’O),十六进制(‘h或’H)
例如
4’b1111 //4位2进制数
12’h3ac //12位16进制数
不指明位数的数字:如果数字说明中没有指定基数,那么默认表示为十进制数。如果没有指定位宽,则默认的位宽度与仿真器和使用的计算机有关(最小为32位)。
‘o21 //32位八进制数
X值和Z值:不确定值用X表示,高阻用Z值表示。在八进制数中代表3位,十六进制中代表4位。
12’h12X //这是一个12位16进制数,其中低四位不确定
负数:在表示位宽的数字前面增加一个减号来表示它是一个负数。
-6’d3 //一个6位的用二进制补码形式存储的十进制数3,表示负数
-6’sd3 //一个6位的带符号算数运算的负数
下划线符号和问号:
除了第一个字符,下划线“_”可以出现在数字中的任何位置,它的作用只是提高可读性,在编译阶段会被忽略掉
问号“?”是z的另一种表示,使用问号的目的在于增强casex和casez语句的可读性。在这两条语句中,“?”表示不必关心的情况。
12’B1111_0011_1110 // 增强可读性
4’b10?? //相当于4’b10zz
6字符串是双引号括起来的一个字符队列。对于字符串的限制是,它必须在一行中书写完,不可书写在多行中,也不能包含回车符。Verilog将字符串当作一个单字节的ASCII字符队列。
“Hello Verilog world” //是一个字符串
7标识符和关键字
关键字是语言中预留的用于定义语言结构的特殊标识符。Verilog中关键字全部小写。
标识符是程序代码中对象的名字,程序员使用标识符来访问对象。Verilog中标识符由字母数字字符、下划线和美元符号组成,区分大小写。其第一个字符必须是数字字符或下划线。
reg value; //reg是关键字;value是标识符
8转义标识符
转义标识符以“\”开始,以空白符结束。Verilog将反斜线和空白符之间的字符逐个进行处理。所有的可打印字符均可包含在转义字符中,而反斜线和表示结束的空白符不作为标识符的一部分。
系统任务
Verilog为某些常用操作提供了标准的系统任务(也叫系统函数)这些操作包括屏幕显示、线网值动态监视、暂停和结束仿真等。所有的系统任务都具有$
显示信息$display(p1,p2,p3,…,pn);
$display会自动在字符串的结尾处插入一个换行符,因此如果参数列表为空,则display的效果是现实光标移动到下一行
监视信息$monitor(p1,p2,p3,…,pm);
系统函数$monitor对其参数列表中的变量值或者信号值进行不间断的监视,当其中任何一个发生变化的时候,显示所有参数的数值。$monitor 只需调用一次即可在整个仿真过程中生效。
编译指令
Verilog提供了一些编译指令供用户使用,其使用方式为’
‘define用于定义verilog中的文本宏。类似于c中的#define.
‘define WORD_SIZE32
‘i nclude 在编译期间将一个verilog源文件包含在另一个verilog文件中,类似于c中的#i nclude结构。
‘include header.v
Verilog的数据类型1
1值的种类
四值电平逻辑
如果两个具有不同强度的信号驱动同一个线网,则竞争结果值为高强度信号的值。
如果两个强度相同的信号之间发生竞争,则结果为不确定值。
2线网
线网(net)表示硬件单元之间的连接。线网一般使用关键字wire进行声明。如果没有显式的说明为向量,则默认线网的位宽为1。线网的默认值为Z,(trireg类型线网例外,其默认值为X)。其值由驱动源确定,如果没有驱动源则线网的值为Z
Net并不是一个关键字,它代表了一组数据类型,包括wire,wand,wor,tri,triand,trior以及trireg等。
3寄存器
寄存器用来表示存储元件,它保持原有的数值,直到被改写。注意:不要将这里的寄存器和实际电路中由边沿触发器构成的硬件寄存器混淆。在Verilog中,术语register仅意味着一个保持数值的变量。与线网不同,寄存器不需要驱动源,而且也不像硬件寄存器那样需要时钟信号。在仿真过程中的任意时刻,寄存器的值都可以通过赋值来改变。
寄存器的数据类型通过关键字reg来声明,默认值为X。
4向量
线网和寄存器类型的数据均可声明为向量(位宽大于1)。如果在声明中没有指定位宽,则默认为标量(1位)
wire a; //标量线网变量,默认
wire [7:0] bus; //8位的总线
reg clock ; //标量寄存器,默认
reg [0:40] virtual_addr; //向量寄存器,41位宽的虚拟地址
向量通过[high#:low#]进行说明,方括号中左边的数总是代表向量的最高有效位。
向量域选择
对于上面例子中声明的向量,我们可以指定它的某一位或者若干个相邻位。Verilog的数据类型2
1整数、实数和时间寄存器类型
整数是一种通用的寄存器数据类型,用于对数量进行操作,使用integer进行声明。
integer counter; //一般用途的变量用作计数器
initial
counter = -1; //把-1存储到寄存器中