Verilog学习——数据类型
(一)verilog的语法
Verilog中的语法类似于C,包含标记流。一个词法标记由一个或多个字符组成,标记可以是注释、关键字、数字、字符串或者空格,所有行都应以分号结尾,verilog区分大小写。
注释:
两种方式://单行注释,可嵌套在多行注释里;
/* */多行注释,不能嵌套;
空白:
用于表示空格、制表符、换行符和表单馈送的字符;
运算符:
一元运算符,二元运算符,三元运算符或条件运算符;
数字格式:
数字可以用小数、二进制、八进制、十六进制表示,默认情况下,视为小数;
[size]'[base_format][number]
Size用十进制书写,表示数字中的位数;
Base_format可以是十进制、十六进制、八进制;
数字指定为 0、1、2 …9 表示十进制基本格式,0、1、2 …9、A、B、C、D、E、F为十六进制;
默认情况下,没有 base_format 规范的数字是十进制数;没有大小规范的数字具有默认位数,具体取决于模拟器和计算机的类型。
负数是通过在数字大小之前放置减号 - 来指定的。在base_format和数字之间有减号是错误的;
字符串:
用“”括起来的字符称为字符串,其中每个字符需要一个字节来存储;
标识符:
标识符是变量的名称,由字母、数字、下划线、美元符号组成,区分大小写,不能以数字或美元符号开头;
关键字:
关键字用于保留用于定义语言结构的特殊标识符,用小写形式。
(二)verilog数据类型
1.数据类型是为了表示数据存储元素;
2.变量包含的值:0,1,x,z;real和event数据类型除外;
其中x表示未知逻辑值,可能是0或1,z表示高阻抗状态;
时序图和仿真波形中,用红色表示x,中间橙色表示z;
3.网络和变量:
网络和变量是两组主要的数据类型,表示不同的硬件结构,再分配和保留值的方式上不同;
网:
用于连接逻辑门等硬件实体,本身不存储任何值;
使用最广泛的网络是wire类型,用于连接元素和连接由单个门或连续分配驱动的网络;需要多个网时,将它们聚集在一起形成一个wire;
wire [3:0] n0;
这是一个四位导线,是一个向量。
变量:
变量是数据存储元素的抽象;
Reg可以表示触发器,也可以表示组合逻辑;
4.其他数据类型 :
整数:一个integer是32位宽的变量;
Time: time变量是一个无符号的64位的变量,realtime将时间存储为浮点数;
Real:real变量可以存储浮点数,可以和integer和reg有相同的赋值方式;
verilog字符串:
字符串存储在reg中,
下标从右侧开始,变量内存大于字符串长度,则左侧补0;
(三)Verilog的标量和向量
标量和向量:
没有范围规范的网络或者reg被称为标量(scalar),有范围规范,则被称为向量(vector);
wire o_nor; //标量
wire [7:0] o_flop; //向量
reg parity;
reg [31:0] addr;
向量中的最高有效位在最左侧,最低有效位在最右侧;
wire [msb:lsb] name;
msb和lsb是常量表达式,不可以是变量;lsb可以大于、等于、小于msb;
位选择:
向量变量中的每一个位都可以被选择并重新赋值,如果位选择越界或位选择为 x 或 z,则返回的值将为 x。
部分选择:
选择一系列连续的位,称为部分选择;有两种类型的部分选择;常量部分选择和索引部分选择。
[<start_bit> +: <width>] // part-select increments from start-bit
[<start_bit> -: <width>] // part-select decrements from start-bit
从起始位置开始,正向或者反向的截取宽度为width的字符;例如:
reg[31:0] data;
data =32’Hface_CAFE;
$display(“data[0+:8]=0x%0h”,data[0+:8]);
输出为:data[0+:8]=0xfe;
(四)verilog的阵列和存储器
Verilog数组:
网络或变量的数组声明可以是标量或者向量;在标识符后面指定地址范围来创建任意数量的维度,称为多维数组;可以对reg、wire、integer和real创建数组。
n 个 1 位 reg 的内存与 n 个 bit 向量 reg 不同。
reg y1 [11:0];
wire [0:7] y2 [3:0]
reg [7:0] y3 [0:1][0:3];
内存:
内存用reg类型的一维数组建模,内存中每个元素可以表示一个单词,并使用单个数组索引进行引用。
reg [7:0] mem[256];