提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
Verilog HDL 的数据对象
一、线网类型数据对象
线网型数据对象的读操作在VerilogHDL代码任何位置都可以使用,例如assign赋值语句、initial初始化语句、always进程语句等。而线网型数据对象的写操作只能在assign连续赋值语句中使用。
二、Vectored与scalared
Vectored与scalared它们代表了多位线网数据的不同属性。使用vectored进行定义的多位线网数据对象可以进行某一位或者是部分位选择与使用;用scalared进行定义的多位线网型数据对象不可以进行某一位或是部分位的读写操作,多位线网型数据对象只作为整体进行读写操作。如果没有指定vectored与scalared则默认为vectored。举例如下:
wire vectored[7:0] data \定义一个vectored属性的多位线网型数据对象data
assign a = data[0];
assign data[1] = 1’b1; //可对data 的某一位进行读写操作。
Assign b = data[5:3] //可以对data的某几位进行读操作
Assign data[7:5] = c //可以为data的某几位进行写操作,其中b,c都是3位的线网型数据对象
Wire scalared[7:0] data1 //定义一个scalared 属性的多位线网数据对象data1
Assign a = data1[0]; //非法,不能对data1的某一位进行读写操作
Assign data1[1] = 1’b1 //非法,不可以对data1的某一位进行读写操作
Assign b = data1[5:3] //非法,不可以对data1的某几位进行读操作
Assign data1[7:5] = c //非法,不可以对data的部分位进行读写操作
Reg寄存器数据对象的向量与标量与上面介绍的wire scalared与vectored属性一致。
三、存储器数据对象
存储器数据对象的定义
Reg[msb1 : lsb1]memory[msb2 : lsb2];//定义一个存储器对象memory
//其中[msb1 : lsb1]定义的是存储器对象memory的宽度
//其中[msb2 : lsb2]定义的是存储器对象memory的深度
存储器对象的使用
存储器对象的使用必须按字进行
Reg[7:0]memory[63:0]; //定义一个宽度为8位,深度为64的存储器对象;
Memory[0] = 8’h12; //合法
memory = 12 //非法
四、整型数据对象
整型数据对象存储的值是整数值,它一般作为高级建模使用。整型数据对象定义的基本格式如下所示;有符号时以补码形式出现。
integer idata //定义一个整型数据对象idata
integer iram[7:0] //定义一个整型数据对象数组iram
如果定义一个32位的数据对象和定义一个整型integer数据对象是一个意思。
五、时间型数据对象
时间型数据对象存储的值是时间值,它一般作为高级建模或仿真使用。时间型数据对象的基本格式是;
time idata //定义一个时间型数据对象idata
time iram[7;0] //定义一个时间型数据对象 数组iram
时间型数据对象的位宽是由编译器与机器决定,但一般不会少于64位。
六、实型数据对象
实型数据对象的存储值可以是浮点数。实型数据对象默认值是0;
real idata //定义一个实型数据对象idata
idata = 1.2; //合法
七、参数
参数是用来定义常量的。verilog HDL支持的参数有两种:普通参数与局部参数。普通参数在模块例化时可以重新赋值,局部参数在模块例化时不能重新赋值。参数值的更改可以通过defparam语句来实现:
感觉和C中的#define差不多
parameter HIGH = 1; //定义一个参数HIGH,它的值为1,通过实例化可以改变它的值。
parameter DATA = 16;
defparam DATA = 8; //重新修改DATA值为8
localparam real PI = 3.14 //定义一个参PI,它的值为3.14,通过实例化不能改变他的值。
七、字符串
字符串时双引号“”内的字符序列,但不包括双引号本身。Verilog HDL对字符串的存储方式是对每个字符采用8位的ASCII值,所以每个字符就需要8bit的位宽reg型来存储:
reg[19*8 : 1] str = “I love Verilog HDL!” //算上空格一共19个字符
字符串不能分多行书写。特殊字符需要加反斜杠\;
\n //换行符
\t //制表符
\ //反斜杠
" //双引号