ISP图像处理之Demosaic算法(UVM最后篇)

本文介绍用于验证demosaic的UVM框架其他部分。涵盖pkg内容、接口、top层等。接口部分提及避免信号竞争问题的方法;driver介绍从bin文件加载数据驱动pixel给DUT;monitor将期望值和DUT输出值交scoreboard;最终完成用于验证ISP的UVM环境搭建,并给出运行结果和参考代码。

这一节将介绍用于验证demosaic的UVM框架中的其他部分。

1. pkg中的内容:

文件夹自行创建哦,路径自行修改,且期望值图像自己整。

package param_pkg;
    parameter BITS            = 8  ; //支持8/16/24/32
    parameter H_frontporch    = 50 ;
    parameter H_PULSE         = 1  ;
    parameter H_backporch     = 50 ;
    parameter WIDTH           = 768;
    parameter V_frontporch    = 10 ;
    parameter V_PULSE         = 1  ;
    parameter V_backporch     = 10 ;
    parameter HEIGHT          = 512;
    // 每个cycle内交给DUT的是 2行4列共8个pixel
    parameter h_chan          = 4  ;
    parameter v_chan          = 2  ;
 
    parameter H_transfercycle = WIDTH  / h_chan;
    parameter V_transferline  = HEIGHT / v_chan;
    parameter H_totalcycle    = H_frontporch + H_PULSE + H_transfercycle + H_backporch;
    parameter V_totalline     = V_frontporch + V_PULSE + V_transferline  + V_backporch;
    parameter totalcycle      = H_totalcycle * V_totalline;
    
    parameter string  BAYER     = "rggb";
    parameter string  IMAGE_IN  = "../D01_input_img/raw_512x768_rggb.bin";
    // 期望值图像路径
    parameter string  EXP_R     = "../D02_exp_img/v2h4_dem_r.bin";
    parameter string  EXP_G     = "../D02_exp_img/v2h4_dem_g.bin";
    parameter string  EXP_B     = "../D02_exp_img/v2h4_dem_b.bin";
    // DUT输出图像路径
    parameter string  ACT_R     = "../D03_act_img/v2h4_dem_r.bin";
    parameter string  ACT_G     = "../D03_act_img/v2h4_dem_g.bin";
    parameter string  ACT_B     = "../D03_act_img/v2h4_dem_b.bin";
endpackage

2.接口

        组合电路中,某一输入变量经过不同的途径传输之后,到达电路中某一汇合点的时间有先有后,这种现象称为竞争,由于竞争而使电路输出发生瞬间错误的现参叫做冒险。为了避免在RTL仿真行为中发生信号的竞争问题,建议通过非阻塞赋值来解决同步的问题。
        同样的在TB--DUT的仿真行为中,也会出现时序电路中时钟和驱动信号的时序竞争问题。为了避免可能的采样竞争问题,应该在验证环境的驱动模块(driver)添加固定延迟,一是保证数据稳定后再发送给DUT,如TB把数据发送给DUT时,应该在时钟上升沿后延迟几个ns再发送数据;二是数据稳定后再采样信号,如采样从DUT送出的数据,在时钟与被驱动信号之间存在delta-cycle时,应该考虑在时钟采样沿的前几个ns采样。这种方式可以消除竞争问题。

        上述可以通过如下实现,default input #1ns output #1ns指出了在clocking中所有信号默认情况下会在locking事件(clock上升沿)的前1ns来对其进行输入采样,在事件的后1ns对其输出驱动

`timescale 1 ps/ 1 ps
import param_pkg::*;
interface demo_intf (input clk, input rst_n);
    bit                 i_data_en ;
    bit                 o_data_en ;
    bit                 i_pvsync  ;
    bit                 o_pvsync  ;
    bit                 i_phsync  ;
    bit                 o_phsync  ;
    bit                 done      ;
    logic [BITS-1:0]    i_data_0, i_data_1, i_data_2, i_data_3, i_data_4, i_data_5, i_data_6, i_data_7;
    logic [BITS-1:0]    o_data_r_0, o_data_g_0, o_data_b_0;
    logic [BITS-1:0]    o_data_r_1, o_data_g_1, o_data_b_1;
    logic [BITS-1:0]    o_data_r_2, o_data_g_2, o_data_b_2;
    logic [BITS-1:0]    o_data_r_3, o_data_g_3, o_data_b_3;
    logic [BITS-1:0]    o_data_r_4, o_data_g_4, o_data_b_4;
    logic [BITS-1:0]    o_data_r_5, o_data_g_5, o_data_b_5;
    logic [BITS-1:0]    o_data_r_6, o_data_g_6, o_data_b_6;
    logic [BITS-1:0]    o_data_r_7, o_data_g_7, o_data_b_7;
    clocking driver_cb @(posedge clk);
        default input #1 output #1;    
        output          i_data_en ;
        input           o_data_en ;
        output          i_phsync  ;
        input           o_phsync  ;
        output          i_pvsync  ;
        input           o_pvsync  ;
        output          i_data_0, i_data_1, i_data_2, i_data_3, i_data_4, i_data_5, i_data_6, i_data_7;
        input           o_data_r_0, o_data_g_0, o_data_b_0;
        input           o_data_r_1, o_data_g_1, o_data_b_1;
        input           o_data_r_2, o_data_g_2, o_data_b_2;
        input           o_data_r_3, o_data_g_3, o_data_b_3;
        input           o_data_r_4, o_data_g_4, o_data_b_4;
        input           o_data_r_5, o_data_g_5, o_data_b_5;
        input           o_data_r_6, o_data_g_6, o_data_b_6;
        input           o_data_r_7, o_data_g_7, o_data_b_7;
        input           done      ;
    endclocking
 
    clocking monitor_cb @(posedge clk);
        default input #1 output #1;
        input           i_data_en ;
        input           o_data_en ;
        input           i_phsync   ;
        input           o_phsync   ;
        input           i_pvsync   ;
        input           o_pvsync   ;
        input           i_data_0  , i_data_1, i_data_2, i_data_3, i_data_4, i_data_5, i_data_6, i_data_7;
        input           o_data_r_0, o_data_g_0, o_data_b_0;
        input           o_data_r_1, o_data_g_1, o_data_b_1;
        input           o_data_r_2, o_data_g_2, o_data_b_2;
        input           o_data_r_3, o_data_g_3, o_data_b_3;
        input           o_data_r_4, o_data_g_4, o_data_b_4;
        input           o_data_r_5, o_data_g_5, o_data_b_5;
        input           o_data_r_6, o_data_g_6, o_data_b_6;
        input           o_data_r_7, o_data_g_7, o_data_b_7;
        input           done      ;
    endclocking
  
  modport DRIVER  (clocking driver_cb  , input rst_n);
  modport MONITOR (clocking monitor_cb , input rst_n);

endinterface

3. top层

一是例化DUV,二是通过config_db::set 把接口广播给各个component.

其中,接口在非module内部(如class)中,必须加virtual修饰。 

`timescale 1ns/1ns
`include "uvm_macros.svh"
import uvm_pkg::*;
import param_pkg::*;
module uvm_demosaic_top;
    reg        xclk  = 0 ;
    reg        rst_n = 0 ;
    demo_intf  vifdem(xclk, rst_n);
        isp_demosaic  #(
	        .BITS         (BITS         ),
	        .H_frontporch (H_frontporch ),
	        .H_PULSE      (H_PULSE      ),
	        .H_backtporch (H_backporch  ),
	        .HEIGHT       (HEIGHT       ),
	        .V_frontporch (V_frontporch ),
	        .V_PULSE      (V_PULSE      ),
	        .V_backtporch (V_backporch  ),
	        .WIDTH        (WIDTH        ),
            .h_chan       (h_chan       ),
            .v_chan       (v_chan 
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值