掌握 Verilog 块语句:顺序与并行执行
有方法将一组语句分组,使其在语法上等价于单条语句,称为 块语句。块语句分两种:顺序和并行。
顺序块
语句用 begin 和 end 关键字包裹,按给定顺序依次执行。延迟值相对于前一条语句执行时间。块内所有语句执行完后控制权可转移别处。
module design0;
bit [31:0] data;
// "initial" 块在时间 0 启动
initial begin
// 10 时间单位后 data 变为 0xfe
#10 data = 8'hfe;
$display ("[Time=%0t] data=0x%0h", $time, data);
// 20 时间单位后 data 变为 0x11
#20 data = 8'h11;
$display ("[Time=%0t] data=0x%0h", $time, data);
end
endmodule
上例中,begin-end 块第一条语句在 10 时间单位执行,第二条在 30 时间单位执行(因相对性:在前一语句执行后 20 时间单位)。
仿真日志
ncsim> run [Time=10] data=0xfe [Time=30] data=0x11 ncsim: *W,RNQUIE: Simulation is complete.
并行块
并行 块可并发执行语句,延迟控制提供赋值的时间排序。语句用 fork 和 join 关键字包裹以并行启动。
initial begin
#10 data = 8'hfe;
fork
#20 data = 8'h11;
#10 data = 8'h00;
join
end
上例中,fork-join 块在执行 10 时间单位处的语句后启动。块内语句并行执行,首先启动的是赋值 8'h00 的语句,因其延迟为 fork-join 启动后 10 时间单位。再过 10 时间单位,第一条语句启动,data 获得值 8'h11。
initial begin
#10 data = 8'hfe;
fork
#10 data = 8'h11;
begin
#20 data = 8'h00;
#30 data = 8'haa;
end
join
end
上例有 begin-end 块,块内语句顺序执行,但该块本身与其他语句并行启动。故 data 在 20 时间单位得 8'h11,30 时间单位得 8'h00,60 时间单位得 8'haa。
块命名
顺序和并行块均可通过在 begin 和 fork 后添加 : name_of_block 命名。这样可在 disable 语句中引用该块。
begin : name_seq
[statements]
end
fork : name_fork
[statements]
join
Verilog