Verilog中fork join与begin end的嵌套使用---testbench的编写

fork join中的语句为并执行执行的,为并行语句块。语句之间同时开始,并行执行,虽然无法综合,但是用于testbench的编写时非常有用;此处以自己利用fork join编写测试文件的例子入手,对fork join语句、begin end语句进行介绍,并展示了begin end于fork join相互嵌套用于测试文件的过程;

目录

一、基础

begin end

fork join

实例

二、进阶

三、参考文献


一、基础

begin end

概念:

begin end 用来标识顺序执行的语句,用它标识的块称作顺序块

使用:

begin

    语句1;

    语句2;

   ....

    语句n;

end

特点:

  • 块内语句顺序执行的,即只有上面一条语句执行完后下面的语句才能执行;
  • 最后一条语句执行完,程序才跳出该语句块。

fork join

概念:

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;

仿真结果:

Verilog中fork join与begin end的嵌套使用---testbench的编写_第1张图片

与分析一致;

二、进阶

核心:

  • begin end与fork 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;
    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

仿真结果:

Verilog中fork join与begin end的嵌套使用---testbench的编写_第2张图片

与分析一致;

灵活使用fork join以及嵌套,对编写测试文件非常有用!

如:Verilog实现RAM(7-异步双口SRAM:原理、实现、仿真、分析)中的测试文件只有利用嵌套才能更好的描述异步时钟同时读写的工作过程;

三、参考文献

verilog中的fork...join用法

你可能感兴趣的:(FPGA/Verilog基础)