2.1 verilog基础语法
1、verilog是区分大小写的。每个语句必须以分号未结束符。空白符(换行,制表,空格)都没有实际的意义,在编译阶段可忽略。
2、采用"//"进行单行注释,/........./进行跨行注释
3、数值种类:verilog HDL有四种基本的值来表示硬件电路中的电平逻辑。
2.2 verilog 数值表示
0:逻辑0或“假”
1:逻辑1或“真”
x或X:未知,意味着信号数值不确定,即在实际电路里,信号可能为1,可能为0.
z或Z:高阻,意味着信号处于高阻状态,常见于信号(input, reg)没有驱动的逻辑结果。
例如:一个pad的input呈现高阻状态,其逻辑值和上下拉的状态有关,上拉则逻辑为1,下拉则为0.
整数数值的表示方法
数值声明时,合法的基数格式有4种:十进制('d或'D),十六进制('h或'H),二进制('b或'D),八进制('o或'O)。数值可指明位宽,或不指明。
4'b1011; //4bit 数值
32'h3022_c0de; //32bit十六进制的数值
couter = 'd100;//一般会根据编译器自动分配位宽,常见32bit
2.3 Verilog数据类型
常见2种数据类型:线网(wire)和寄存器(reg)
wire类型
表示硬件单元之间的物理连线,其连接的器件输出端连续驱动。如果没有驱动单元连接到wire型变量,缺省值一般为"Z"(高阻)
wire interrupt;
wire flag1, flag2;
wire gnd = 1'b0;
寄存器reg类型
用来表示存储单元,它会保持数据的 原始值,直到被改写。例如,在always块中,寄存器可能被综合为边沿触发器,在组合逻辑中可能被综合成wire型变量,寄存器不需要驱动源,也不一定需要时钟信号。在仿真时,寄存器的值可在任意时刻通过赋值操作进行改写。
reg rstn;
initial begin
rstn = 1'b0;
#100;
rstn = 1'b1;
end
向量
当位宽大于1时,wire和reg即可声明为向量的形式。例如:
wire [32-1:0] gpio_data;//声明32bit位宽的gpio_data
reg [3:0] counter;//声明4bit位宽的counter
wire [8:2] addr;//声明7bit位宽的addr
wire [0:31] data;//声明32bit位宽的data,最高有效位0
verilog还支持指定bit位后固定位的向量域选择访问
[bit+ : width]:从起始bit位开始递增,位宽为width
[bit- : width]:从起始bit位开始递减,位宽为width
例如:
A = data[31-:8];等效A = data[31:24];
B = data[0+:8]; 等效B = data[0:7];
对信号进行重新组合成新的向量时,需要借助大括号