4.1 initial/always
initial 和always语句,它们是行为级建模的2种基本语句。
一个模块中可以包含多个initial和always语句,但是2种语句不能嵌套使用。这些语句在模块之间并行执行,与其在模块的前后顺序没有关系。但是initial语句或always语句内部可以理解为是顺序执行的(非阻塞赋值除外)。
每个initial语句或always语句都会产生一个独立的控制流,执行时间都是从0时刻开始。
初始语句
initial语句从0时刻开始执行,只执行一次,多个initial 块之间是相互独立的。
如果initial 块内包含多个语句,需要使用关键词begin和end组成一个块语句。
如果initial块内只要一条语句,关键词begin和end可使用也可不使用。
initial 理论上讲是不可综合的,多用于初始化,信号检测等。
`timescale 1ns/1ns
module test;
reg bi;
initial begin
ai = 0;
#25; ai = 1;
#35; ai = 0; //60ns
#40; ai = 1; //100ns
#10; ai = 0; //110ns
end
initial begin
bi = 1;
#70; bi = 0;
#20; bi = 1;
end
initial begin
forever begin
100;
if($time >= 1000) begin
$finish;
end
end
endmodule
4.2 verilog 过程赋值
关键词:阻塞赋值,非阻塞赋值,并行
过程性赋值是在initial或always语句块里的赋值,赋值对象是寄存器,整数,实数等类型。
这些变量在被赋值后,其值讲保持不变,直到重新被赋予新值。
连续性赋值总是处于激活状态,任何操作数的改变都会影响表达式的结果;过程赋值只有在语句执行的时候,才会起作用。这是连续性赋值与过程性赋值的区别。
verilog过程赋值包括:阻塞赋值与非阻塞赋值。
阻塞赋值
阻塞赋值属于顺序执行,即下一条语句执行前,当前语句一定会执行完毕。
阻塞赋值语句使用等号 = 作为赋值符。
非阻塞赋值
非阻塞赋值属于并行执行语句,即下一条语句的执行和当前语句的执行是同时进行的,它不会阻塞位于同一条语句块中后面语句的执行。
非阻塞赋值语句使用小于等于号 < = 作为赋值符。
`timescale 1ns/1ns
module test;
reg [3:0] ai, bi;
reg [3:0] ai2, bi2;
reg [3:0] value_blk;
reg [3:0] value_non;
reg [3:0] value_non2;
initial begin
ai = 4'd1;
bi = 4'd2;
ai2 = 4'd7;
bi2 = 4'd8;
//non_block_assignment with block-assignment
ai = 4'd