verilog中的数据类型大体可以分成net types和variable types。在verilog中的数据表示如下形式:
<bits>'<representation><value>
比如说4'b0001表示这个数据定义为四位宽,二进制类型,除此之外还可以定义为16进制4'h1,八进制4'01,十进制4'd1,除了这些常见数据之外,verilog还有两个特殊变量:'x'和'z','x'表示的是未知数据,'z'表示的是设置为高阻态,数据定义方法跟其他一样:4'bx。下面讲述数据类型
net type
net数据用来描述不同组件之间的物理联系,本身不能用于存储数据或者驱动数据,通常使用assign来将数据复制到到线上,比如说:
assign a=1'b1;
wire
最常用的数据类型,我们使用线网类型来声明信号,这些信号是我们设计中非常基本的点对点连接,可以理解为电路中导线。
wire a;
assign a=1'b1;
wor&wand
这个类型的是将基本逻辑门插入电路,wor是逻辑或门,wand是逻辑与门,在我们使用这个类型的时候我们必须多次分配信号。我们这样做是因为每个赋值代表底层逻辑门的一个输入。我们可以很容易地在verilog中使用线类型来建模组合逻辑。因此,不建议使用wor和wand类型。
wor a;
wand b;
wire c,d;
//c也创建或门
assign a=c;
//d创建与门
assign b=d;
tri,triand,trior
使用这些类型的方式与wire、wor和wand类型完全相同。事实上,这些类型的功能完全相同。然而,我们可以使用它们来更清楚地显示我们的设计意图,verilog设计中也可以很容易地使用wire类型来表示它们的功能,不经常用。
tri a;
assign tri=1'bz;
suppy0 & supply1
我们可以使用这些类型将信号绑定到二进制1或0的常量值。由于这会产生一个与接地或Vcc相连的网络,因此我们不需要为这种类型分配数据,也能用wire来实现。
supply0 a;// assign a=0;
supply1 b;//b=1;
variable type
我们在verilog中使用variable类型来存储值。当我们为变量类型赋值时,它会保持该值,直到再次赋值。
reg
verilog中最常用的变量类型是reg类型。每当需要在设计中存储值时,我们都可以使用此类型,用于对verilog中的组合逻辑进行建模。我们需要在always模块下使用赋值。
reg a;
always@(posedge clk)begin//时钟过后触发a
a<=b;
end
numeric variable type
verilog有两种常见的数字类型,整形和实型,出这两种之外的类型都用于单个数据位。
integer type
整数类型,是一个32位的2s补码数,可以用来表示verilog中任何整数,当我们使用整数类型时,我们为变量分配数值而不是二进制值,我们通常在verilog中使用整数作为常量或循环变量。
integer i;
for(i=0;i<=32;i=i+1)begin
a<=1;
end
real type
除了整数类型,我们还可以在verilog中使用实数类型。我们使用这种类型来存储非整数,即也有小数部分的数字。实数类型通常在verilog中实现为64位浮点数。因此,它不能直接合成,我们通常只在verilog的testbench使用真实类型,我们可以使用十进制或科学记数法为实数类型赋值。
real a;
a=2.5;
#1000
a=1e-3;
除了numerical type,所有的类型都是一个数据位宽我们在verilog中也可以通过数据总线来传输数据,因此可以定义数据位宽。size是[位宽-1:0]/[位宽:1]表示几个位宽
<type><size><variable_name>
reg [3:0] a;//a为4位宽
always@(posedge clk)begin
a<=4'b1010;
//a<=4'ha;//16进制
end
数组
我们还可以在verilog中创建和使用数组类型,我们只需在变量名后面添加一个额外的字段,该字段声明数组中有多少元素。<elements>字段来声明数组的大小。
<type><size><variable_name><elements>
reg [2:0] a [7:0];//3位宽的数组,数组中有8个元素
我们可以使用方括号访问数组类型中的各个元素。例如,下面的verilog代码显示了如何将5h值分配给示例数组中的最后一个元素。
a[7] =3'h5;
参考:An Introduction to Verilog Data Types and Arrays - FPGA Tutorial
这是个好网站!