fork join中的语句为并执行执行的,为并行语句块。语句之间同时开始,并行执行,虽然无法综合,但是用于testbench的编写时非常有用;此处以自己利用fork join编写测试文件的例子入手,对fork join语句、begin end语句进行介绍,并展示了begin end于fork join相互嵌套用于测试文件的过程;
目录
一、基础
begin end
fork join
实例
二、进阶
三、参考文献
概念:
begin end 用来标识顺序执行的语句,用它标识的块称作顺序块;
使用:
begin
语句1;
语句2;
....
语句n;
end
特点:
概念:
fork join 用来标识并行执行的语句,用它标识的块称作并行块;
使用:
fork
语句1;
语句2;
....
语句n;
join
特点:
测试文件:
`timescale 1ns / 1ps
//////////////////////////////////////////////////////////////////////////////////
// Company:
// Engineer: CLL
//
// Create Date: 2020/03/05 10:02:40
// Design Name:
// Module Name: clk_tsb
// Project Name:
// Target Devices:
// Tool Versions:
// Description:
//
// Dependencies:
//
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
//
//////////////////////////////////////////////////////////////////////////////////
module clk_tsb(
);
// port declaration
reg clk1,clk2,clk3,clk4,clk5,clk6;
// test
initial
begin
clk1 = 0;
clk2 = 0;
clk3 = 0;
#10 clk1 = 1;
#20 clk2 = 1;
#30 clk3 = 1;
end
initial
begin
clk4 = 0;
clk5 = 0;
clk6 = 0;
fork
#10 clk4 = 1;
#20 clk5 = 1;
#30 clk6 = 1;
join
end
endmodule
代码分析:
先看顺序块:语句顺序执行,说明clk1相比于模块起始延时10ns后输出1;
clk2在clk1语句执行结束后延时20ns输出1,说明clk2置1的时刻相比于模块起始延时30ns
clk3在clk2语句执行结束后延时30ns输出1,说明clk3置1的时刻相比于模块起始延时60ns
再看并行块:语句并行执行,说明clk4相比于模块起始延时10ns后输出1;
clk5相比于模块起始延时20ns后输出1;
clk6相比于模块起始延时30ns后输出1;
仿真结果:
与分析一致;
核心:
测试文件:
`timescale 1ns / 1ps
//////////////////////////////////////////////////////////////////////////////////
// Company:
// Engineer: CLL
//
// Create Date: 2020/03/05 10:02:40
// Design Name:
// Module Name: clk_tsb
// Project Name:
// Target Devices:
// Tool Versions:
// Description:
//
// Dependencies:
//
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
//
//////////////////////////////////////////////////////////////////////////////////
module clk_tsb(
);
// port declaration
reg clk1,clk2,clk3,clk4,clk5,clk6;
// test
initial
begin
clk1 = 0;
clk2 = 0;
clk3 = 0;
#10 clk1 = 1;
fork
#20 clk2 = 1;
#30 clk3 = 1;
join
end
initial
begin
clk4 = 0;
clk5 = 0;
clk6 = 0;
fork
#10 clk4 = 1;
begin
#10 clk5 = 1;
#20 clk5 = 0;
end
#30 clk6 = 1;
join
end
endmodule
代码分析:
先看begin end嵌套fork join块:
语句顺序执行,说明clk1相比于模块起始延时10ns后输出1;
fork join块在clk1语句执行结束开始执行(它在顺序块中),而fork join块中的clk2与clk3并行执行(在并行块中),clk2在clk1语句执行结束后延时20ns输出1,clk3在clk1语句执行结束后延时30ns输出1,说明clk2置1的时刻相比于模块起始延时30ns,clk3置1的时刻相比于模块起始延时40ns;
再看并行块:
语句并行执行,说明clk4相比于模块起始延时10ns后输出1;
begin end块与clk4语句同时开始执行(它在并行块中),而begin end块中的clk5与clk6顺序执行(在顺序块中),clk5相比于模块起始延时20ns后输出1,clk6在clk5语句执行结束后延时30ns输出1,说明clk6置1的时刻相比于模块起始延时50ns;
仿真结果:
与分析一致;
灵活使用fork join以及嵌套,对编写测试文件非常有用!
如:Verilog实现RAM(7-异步双口SRAM:原理、实现、仿真、分析)中的测试文件只有利用嵌套才能更好的描述异步时钟同时读写的工作过程;
verilog中的fork...join用法