一、变量类型
verilog中的变量取值分为0、1、x、z四种。
各取值含义如下:
类型 | 含义 |
---|---|
0 | 表示逻辑低电平/假事件/电路接地 |
1 | 表示逻辑高电平/真事件/电路接Vcc |
x | 表示未知态(可为0也可为1) |
z | 表示高阻态,既不为0也不为1,在电路中表示引脚悬空,输入至下一级并不影响 |
各变量类型波形示意图:
关于高阻态的更多解释:深入理解高阻态
二、verilog数据类型
在verilog语法中主要有wire、reg、integer三种数据类型。
1、wire(线网型)
wire型用于描述现实硬件电路之间连线,并不存储数据,仅仅是连接各硬件设备元器件,传递数据作用:
也可将多个连接合成一起,定义wire型线网的位宽:
wire [3:0] n0;
- 注:多次重复声明或定义是不合规范的!!
2、reg(寄存器型)
reg型变量用于存储数据,register,即寄存器。具体表现形式如下:
3、其他类型
integer
integer数据类型可以存储宽度为32bit的整型数据,常用于for循环中,例如:
integer i;
for(i = 0; i < 10; i = i + 1)begin
....
end
或
;
for(integer i = 0; i < 10; i = i + 1)begin
....
end
time / realtime
这两种常用于仿真,time 是无符号;数据宽度为64bit,用于存储仿真时间以便调试;
realtime 与 time 的最大区别为:realtime 是存储浮点型时间数据;
time a_time; //a_time可以存储的时间数据值,如 a_time = 60ns
realtime b_time; //b_time 存储的时间数据值则是浮点型,如 b_time = 35.25ns
real
real可以存储浮点型数据,并且可以和reg一样被赋值:
real a_float;//a_float可以被赋值为12.77
上述类型仿真例子
`timescale 1ns/1ns
module testbench;
integer int_a;
time time_b;
real real_c;
initial begin
int_a = 32'hcafe_1234;
real_c = 0.123456;
#20ns
time_b = $time;
$display("int_a = 0x%0h", int_a);
$display("time_b = %0t", time_b);
$display("real_c = %0.5f", real_c);
end
endmodule
仿真结果:
int_a = 0xcafe1234
real_b = 0.123456
time = 20
字符串
字符串中每一个字符为ASCII值,需要1byte/8bite的存储空间。字符串存储在reg型变量中时,reg变量的宽度必须足够大,以容纳字符串。如果变量的大小小于字符串,那么Verilog会截断字符串的最左边的位。如果变量的大小大于字符串,那么Verilog会在字符串的左边添加0。
// "Hello World" requires 11 bytes
reg [8*11:1] str = "Hello World";
reg [8*5:1] str = "Hello World";
reg [8*20:1] str = "Hello World";
仿真验证;
`timescale 1ns/1ns
module testbench;
reg [8*11:1] str1;
reg [8*5:1] str2;
reg [8*20:1] str3;
initial begin
str1 = "Hello World";
str2 = "Hello World";
str3 = "Hello World";
$display ("str1 = %s", str1);
$display ("str2 = %s", str2);
$display ("str3 = %s", str3);
end
endmodule
仿真结果:
str1 = Hello World
str2 = World
str3 = Hello World