verilog testbench

曾经写的一个tb

`timescale 1ns / 1ps


// Company: 
// Engineer:
//
// Create Date:   20:02:30 10/12/2017
// 

`define CHK_MEM_WIDTH 144
`define CHK_MEM_DEPTH 2161


module tb_Top_decoder;

	// Inputs
	reg clk;
	wire fifo_wr_clk;
	reg rst;
	wire i_dv;
	wire [7:0] i_data;

	// Outputs
	wire o_hsync;
	wire o_vsync;
	wire o_dv;
	wire [15:0] o_ch_y;
	wire [15:0] o_ch_u;
	wire [15:0] o_ch_v;
    
    
    reg [7:0] char,char1;
    reg  char_v,char_vr;
    reg [15:0] data_num;
    integer  data_cnt;
    integer  data_cnt1;
    integer  data_cnt2;

	localparam real CLK_PERIOD = 5;  
	localparam real blk_cycle = 2960*16/2;//  2960*16=47360 400MHz
	localparam real blk_cycle_1hsync = 2960/2;//  2960*16=47360 400MHz
    assign fifo_wr_clk = clk;
	wire vsync_pulse;
	reg o_vsync_r;
	reg [7:0] cnt_vsync;
    wire o_fifo_encoder_afull;
	// Instantiate the Unit Under Test (UUT)
	Top_decoder uut (
		.clk(clk), 
		.fifo_wr_clk(fifo_wr_clk), 
		.rst(rst), 
		.i_dv(i_dv), 
		.i_data(i_data), 
		.o_hsync(o_hsync), 
		.o_vsync(o_vsync), 
		.o_dv(o_dv), 
        .o_ch_y(o_ch_y), 
        .o_ch_u(o_ch_u), 
        .o_ch_v(o_ch_v),
        .o_fifo_encoder_afull(o_fifo_encoder_afull)
	);
/test
    reg cnt_dv;  
    integer fp [179:0];
    reg [80*8:1] fp_path_rd;
    reg [80*8:1] fp_path_wr_y;
    reg [80*8:1] fp_path_wr_u;
    reg [80*8:1] fp_path_wr_v;
    integer m;
    // integer  fp_yout,fp_uout,fp_vout;
    integer  fp_yout444;
    integer  fp_uout444;
    integer  fp_vout444;
    always @(posedge clk)begin
        o_vsync_r <= o_vsync;
        if(rst)
            cnt_vsync <= 0;
        else if(o_vsync && !o_vsync_r)
            cnt_vsync <= cnt_vsync + 1;
        else cnt_vsync <= cnt_vsync;
    end
    always @(posedge clk)begin
        if (o_dv)begin
            $fwrite(fp_yout444, "%d\n%d\n",o_ch_y[7:0],o_ch_y[15:8]);
        end
        if (o_dv)begin
            $fwrite(fp_uout444, "%d\n%d\n",o_ch_u[7:0],o_ch_u[15:8]);
        end
        if (o_dv)begin
            $fwrite(fp_vout444, "%d\n%d\n",o_ch_v[7:0],o_ch_v[15:8]);
        end
    end 
    always @(posedge clk)begin
        if (rst)
            cnt_dv <= 0;
        else if(o_dv)
            cnt_dv <= cnt_dv + 1;
        else
            cnt_dv <= 0;
    end
    // initial begin
		// #22000000 $finish;	
	// end
	initial begin
		// Initialize Inputs
		clk = 1;
		rst = 1;
		char_v = 0;
		char_vr = 0;
		char = 0;
		data_cnt = 0;
		data_cnt1 = 0;
		data_cnt2 = 0;
		data_num = 16'hFFFF;
        
		// Wait 100 ns for global reset to finish
		#100;
		rst = 0;
		// Add stimulus here
        #(CLK_PERIOD*500);
    /*1 FRAME*/
        $sformat(fp_path_wr_y,"../txt/yuv444/y444_%1d.txt",cnt_vsync);
        $sformat(fp_path_wr_u,"../txt/yuv444/u444_%1d.txt",cnt_vsync);
        $sformat(fp_path_wr_v,"../txt/yuv444/v444_%1d.txt",cnt_vsync);
		fp_yout444 = $fopen(fp_path_wr_y, "wb"); 
		fp_uout444 = $fopen(fp_path_wr_u, "wb"); 
		fp_vout444 = $fopen(fp_path_wr_v, "wb"); 
        for (m=0;m<180;m=m+1) begin
            if (m<10)       $sformat(fp_path_rd,"../txt/3k/robot/%1d.bat",m);
            else if (m<100) $sformat(fp_path_rd,"../txt/3k/robot/%2d.bat",m);
            else            $sformat(fp_path_rd,"../txt/3k/robot/%3d.bat",m);  
            fp[m]= $fopen(fp_path_rd, "rb"); 
        end   
        for (m=0;m<180;m=m+2) read_flie1(m); 
        wait(o_vsync); wait(!o_vsync); 
        // #(CLK_PERIOD*blk_cycle_1hsync*63);
    /*2 FRAME*/        
        $sformat(fp_path_wr_y,"../txt/yuv444/y444_%1d.txt",cnt_vsync);
        $sformat(fp_path_wr_u,"../txt/yuv444/u444_%1d.txt",cnt_vsync);
        $sformat(fp_path_wr_v,"../txt/yuv444/v444_%1d.txt",cnt_vsync);
		fp_yout444 = $fopen(fp_path_wr_y, "wb"); 
		fp_uout444 = $fopen(fp_path_wr_u, "wb"); 
		fp_vout444 = $fopen(fp_path_wr_v, "wb"); 
        for (m=0;m<180;m=m+1) begin
            if (m<10)       $sformat(fp_path_rd,"../txt/3k/180/%1d.bat",m);
            else if (m<100) $sformat(fp_path_rd,"../txt/3k/180/%2d.bat",m);
            else            $sformat(fp_path_rd,"../txt/3k/180/%3d.bat",m);  
            fp[m]= $fopen(fp_path_rd, "rb"); 
        end   
        for (m=0;m<180;m=m+2) read_flie1(m); 
        // #(CLK_PERIOD*blk_cycle_1hsync*63);

        wait(o_vsync); wait(!o_vsync); 
        
        $finish; 
	end
    task read_flie1;
        input [7:0] file_no1; 
        begin
            while(!$feof(fp[file_no1]))begin
                if(o_fifo_encoder_afull == 0)begin
                    char = $fgetc(fp[file_no1]);
                    char_v = 1;
                    data_cnt1 = data_cnt1 + 1;
                    #(CLK_PERIOD*1);
                end
                else begin
                    char_v = 0;
                    data_cnt1 = data_cnt1 + 1;
                    #(CLK_PERIOD*1);
                end
            end
                char_v = 0;
                char = 0;
                $fclose(fp[file_no1]);
                #(CLK_PERIOD*1);
                
            while(!$feof(fp[file_no1+1]))begin
                if(o_fifo_encoder_afull == 0)begin
                    char = $fgetc(fp[file_no1+1]);
                    char_v = 1;
                    data_cnt2 = data_cnt2 + 1;
                    #(CLK_PERIOD*1);
                end
                else begin
                    char_v = 0;
                    data_cnt2 = data_cnt2 + 1;
                    #(CLK_PERIOD*1);
                end
            end
                char_v = 0;
                char = 0;
                $fclose(fp[file_no1+1]);
                // #(CLK_PERIOD*(blk_cycle - data_cnt1 - data_cnt2));
                #(CLK_PERIOD*10);
                data_cnt1 = 0;
                data_cnt2 = 0;
        end
	endtask
    
	assign 	i_data = char1;
	assign 	i_dv = (char_vr);
    always@(posedge clk)begin
		char_vr <= char_v;
		char1 <= char;
	end
    always begin
		clk = #(CLK_PERIOD/2) ~clk;
	end    
endmodule


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
你好!关于Verilog testbench的问题,我可以给你一些基本的信息。Verilog testbench是用于验证Verilog硬件描述语言编写的电路设计的工具。它是一个模拟环境,用于测试和调试硬件设计的正确性和功能。 Verilog testbench通常由两个主要部分组成:被测设计(DUT)和测试环境。被测设计是你要验证的Verilog电路设计,而测试环境是用于模拟输入信号和检查输出信号的代码。 测试环境包括生成输入信号、应用输入信号到DUT、检查DUT输出信号以及报告测试结果的代码。你可以使用Verilog语言编写测试环境,以确保DUT按预期工作。 以下是一个简单的Verilog testbench示例: ```verilog module DUT(input wire a, input wire b, output wire c); // 这里是你的电路设计 // ... endmodule module testbench; // 生成输入信号 reg a, b; wire c; // 实例化被测设计 DUT dut(a, b, c); // 模拟输入信号 initial begin a = 0; b = 0; #10; // 等待10个时间单位 a = 1; #10; b = 1; #10; $finish; // 结束仿真 end // 检查输出信号 always @(c) begin $display("c = %b", c); end endmodule ``` 在这个示例中,DUT是被测设计模块,testbench是测试环境模块。testbench模块中的initial块生成了一系列的输入信号,并在每个输入信号变化后等待一段时间。always块用于检查输出信号并进行显示。 请注意,这只是一个简单的Verilog testbench示例,实际的测试环境可能更加复杂,具体取决于你的电路设计和测试需求。 希望这个回答能对你有所帮助!如果你有更多问题,请随时提问。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值