一、变量
Verilog HDL有线网型和寄存器型两种类型的变量,每种类型都有在电路中的实际意义。
1.线网型变量:
它相当于硬件电路中的各种物理连接,其特点是输出的值紧跟随输入值进行变化。
wire型变量最经常被用到,对于wire型变量有两种赋值方式:(1).直接将变量连接到模块的输出端。(2).第二种方式是使用assign持续赋值语句进行赋值。
例:
wire[7:0] input_data;
assign input_data[7:4]=4b'0000
2.寄存器型变量
寄存器表示一个抽象的数据存储单元,可以通过赋值语句改变寄存器内存储的值。
寄存器只能在always和initial过程语句中被赋值,而在未被赋值之前,寄存器的缺省值为X。
always语句的语法结构:always @(sensitive_table) 其中,sensitive_table称作敏感列表,其中包含always内部操作的一个或多个触发条件。
不同于assign语句只有一行代码,always语句中可以包含多行代码。
注意:同一个reg变量不能在多个不同的always里赋值,如果进行同时的赋值,就相当于对同一变量进行并行的操作会出现错误。
二、赋值方式
赋值方式可以简单分为两种:阻塞赋值(=)和非阻塞赋值(<=)。
阻塞的赋值方式主要在顺序代码块中实现。如果在顺序代码块中使用阻塞赋值语句,如果这一句没有执行完成,则最后面的语句都不会被执行;如果在顺序代码块中使用非阻塞赋值,则执行这一语句的同时,并不会阻碍下一句代码的执行。而且,如果后一个语句涉及到前面一个语句执行前变量的数值。非阻塞赋值是Verilog作为硬件描述语言与普通程序语言的一个重大区别。
事实上,阻塞在硬件电路中是无法实现的。在经过电路综合后所用的语句都是非阻塞赋值。
在一般的书写习惯中,assign中使用”=“而always中写”<=“。
三、函数与任务
在verilog中函数与任务的作用主要是为了减少主模块的代码量。
1.函数的声明格式:
例:
function[15:0] circle(input[7:0] diameter);
begin
circle=(24'd201*{16'h0,diameter}*{16'h0,diameter})/256;
end
endfunction
函数只有一个输出值,在()中定义的皆为输入变量。
注意事项:(1).函数定义只能在模块中完成,不能在过程块中。
(2).函数至少要有一个输入端口;不能包含输出端口和双向端口;
(3).在函数结构中不能使用时间控制语句(#、wait),不能使用disable中止语句。
(4).函数的结构体中不能出现过程块语句(always)。
(5).函数可以调用函数,不能调用任务。
(6).函数调用可以在任务块或assign中出现。
(7).函数调用语句不能单独出现,必须为赋值语句的右端操作数。
!!在Verilog中函数的变量地址为竞态分布,如果想要进行多次调用必须在function关键字后加automatic关键字使得任务成为可重复使用。
例:
function automatic[15:0] circle(input[7:0] diameter);
begin
circle=(24'd201*{16'h0,diameter}*{16'h0,diameter})/256;
end
endfunction
2.任务
任务的功能要比函数强大
任务可以有多个输入信号与多个输出信号,甚至可以没有输入和输出。
task task_name(ports_list);
begin
....
end
不同于函数的调用,任务的调用是在代码里单独一行进行书写。
注意:(1).任务的输入输出端口和双向端口的数量不受限制,甚至可以没有输入输出以及双向端口;
(2).在任务定义的描述语句中,可以使用出现不可综合操作符合语句(使用最为频繁的就是延迟控制语句),但这样会造成该任务不可综合;
(3).在任务中既可以调用其他任务或函数,也可以调用本身;
(4).在任务定义结构内不能出现initial和always过程块;
(5).可以在任务中中断正在执行的任务,但其是不可综合的;当任务被中断后,程序流程将返回到调用任务的地方继续向下执行;
(6).任务调用语句只能出现在过程块之中;
(7).任务调用语句和一条普通的行为描述语句的处理方法一致;
(8).当被调用输入输出或双向端口时,任务调用语句必须包含端口名列表,且信号端口顺序和类型必须和任务定义结构中的顺序和类型一致;需要说明的是,任务的输出端口必须和寄存器类型的数据变量对应;
(9).综合任务只能实现组合逻辑,也就是说,调用可综合任务的时间为“0”;而在面向仿真的任务中可以带有时序控制,如时延,因此面向仿真的任务的调用时间不为“0”。
3.函数与任务的共同点与区别(借用参考书的定义)
四、生成块