这一节将介绍用于验证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

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





