色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

圖像處理:HDMI顯示代碼的UVM仿真

電子設(shè)計(jì) ? 來(lái)源:AI加速 ? 作者:AI加速 ? 2020-11-10 15:35 ? 次閱讀

本篇完成對(duì)HDMI顯示代碼的UVM仿真,梳理一下在windows-modelsim工具下UVM仿真環(huán)境的建立,調(diào)試以及遇到的問(wèn)題。

仿真架構(gòu)

仿真的架構(gòu)在上一篇已經(jīng)做了簡(jiǎn)要介紹,這部分做重點(diǎn)講解。整體結(jié)構(gòu)包括五個(gè)功能模塊:image圖像的隨機(jī)化和驅(qū)動(dòng),軟件端配置,圖像監(jiān)測(cè),以及設(shè)計(jì)部分。如圖1.1所示。

圖1.1 UVM仿真驗(yàn)證架構(gòu)

圖1.1 UVM仿真驗(yàn)證架構(gòu)

img_seq

這部分主要是生成image數(shù)據(jù),并發(fā)送給img_drv,由img_drv驅(qū)動(dòng)給到DUT。Image的隨機(jī)化定義在img_trans中,這個(gè)類繼承了uvm_sequence_item,定義了img數(shù)組,這是一個(gè)隨機(jī)化的8bit數(shù)據(jù)組成的數(shù)組。在img_seq中通過(guò)randomize函數(shù)就可以產(chǎn)生隨機(jī)化數(shù)據(jù)。

class img_trans extends uvm_sequence_item;

rand logic[7:0] img[3*`MAX_RESLUTN_H*`MAX_RESLUTN_V];

Endclass

Img_seq中對(duì)整個(gè)仿真的啟動(dòng)和結(jié)束做了控制,在這部分實(shí)現(xiàn)的原因是保證一幀圖像在仿真過(guò)程中的完整性。通過(guò)設(shè)置run_time來(lái)控制可以發(fā)送多少幀圖像,這個(gè)變量從命令行傳進(jìn)去。Starting_phase可以使得在uvm_sequence中來(lái)啟動(dòng)和終止仿真過(guò)程,只要指定了相應(yīng)的sequence是某個(gè)sequencer的default_sequence,以及在sequencer中設(shè)置seq的starting_phase為sequencer的phase,這樣就可以用sequence來(lái)啟動(dòng)仿真了。

if(starting_phase != null)
starting_phase.raise_objection(this);
else
`uvm_error(get_type_name(), "cannot start phase");

for(int i=0;i `uvm_create(trans)
if(trans.randomize() != 1)begin
`uvm_info(get_type_name(), "Failed to randomize image transaction", UVM_NONE)
end
trans.print();
`uvm_send(trans)
`uvm_info(get_type_name(), "one image have been recived", UVM_NONE)
wait(sw_inf_i.intr == 1);

end

#50;
starting_phase.drop_objection(this);

img_sqr.sv中:

virtual task main_phase(uvm_phase phase);
img_seq seq;
seq = img_seq::type_id::create("img_seq");
seq.starting_phase = phase;
seq.start(this);
endtask

img_drv

這個(gè)模塊是通過(guò)img_sqr從img_seq中獲得img的數(shù)據(jù),然后通過(guò)axi接口發(fā)送給DUT。這部分主要是如何對(duì)接DUT的AXI接口,DUT通過(guò)AXI接口讀取image數(shù)據(jù),因此接口功能只實(shí)現(xiàn)了讀操作。用一個(gè)task來(lái)實(shí)現(xiàn)axi_read,主要包括三個(gè)并行進(jìn)程:一個(gè)是獲取axi讀指令,另一個(gè)是根據(jù)獲得的axi讀指令來(lái)發(fā)送數(shù)據(jù),最后增加一個(gè)計(jì)數(shù)器用于處理axi等待時(shí)間過(guò)長(zhǎng)的問(wèn)題,如果超過(guò)一定時(shí)間,就報(bào)錯(cuò)。指令獲取和發(fā)送數(shù)據(jù)的交互通過(guò)mailbox來(lái)實(shí)現(xiàn),只要收到的axi指令不大于AXI接口可接收的最大transactions,就可以繼續(xù)接收,否則就不接受。然后發(fā)送數(shù)據(jù)進(jìn)程從mailbox中獲得指令,根據(jù)指令發(fā)送對(duì)應(yīng)的數(shù)據(jù)。

task img_drv::axi_read();

int abs_araddr;
int arlen_cnt;
ar_trans ar_req;
ar_trans ar_rep;
int ar_timer;
int i_size = img_size;

fork: AXI_READ_CTRL

forever begin: AR
if(ar_mbx.num() axi.s_axi_arready = 1'b1;
else
axi.s_axi_arready = 1'b0;

if(axi.s_axi_arready & axi.s_axi_arvalid)begin
ar_req = new("ar_trans");
ar_req.araddr = axi.s_axi_araddr;
ar_req.arlen = axi.s_axi_arlen;
ar_req.arid = axi.s_axi_arid;

ar_mbx.put(ar_req);
end

@(posedge axi.clk);
end

forever begin: RDATA
ar_timer = $urandom_range(`AXI_WAIT_TIMER, 0);
while(ar_timer--)
@(posedge axi.clk);

if(ar_mbx.num() == 0)begin
axi.s_axi_rvalid = 1'b0;
@(posedge axi.clk);
wait(ar_mbx.num() > 0);
end
else begin
while(!axi.s_axi_rready)
@(posedge axi.clk);

axi.s_axi_rvalid = 1'b1;

ar_mbx.get(ar_rep);
abs_araddr = ar_rep.araddr - img_start_addr;
arlen_cnt = ar_rep.arlen + 1;

if(ar_rep.araddr[10:0]+arlen_cnt*(`AXI_DATA_WD/8)>4096)begin
`uvm_error(this.get_type_name(), $sformatf("cross 4KB at address: ar_rep.araddr"));
end

while(arlen_cnt)begin
if(axi.s_axi_rready)begin
for(int i=0;i axi.s_axi_rdata[i*8 +: 8] = img_req.img[abs_araddr++];
end

arlen_cnt--;
end

if(arlen_cnt == 0)begin
axi.s_axi_rlast = 1'b1;
end

@(posedge axi.clk);

end
axi.s_axi_rlast = 1'b0;
axi.s_axi_rvalid = 1'b0;
@(posedge axi.clk);
end
end//RDATA

while(i_size)begin
if(axi.s_axi_rvalid & axi.s_axi_rready)begin
i_size--;
end
@(posedge axi.clk);
end

join_any

disable AXI_READ_CTRL;

endtask

sw_config

這部分主要是涉及到軟件端對(duì)寄存器的配置,包括圖像的行列大小,blank的行和列大小等。這些變量在sw_trans中隨機(jī)化,為了減少仿真時(shí)間,作者減小了圖像的大小約束。這應(yīng)該不會(huì)影響仿真驗(yàn)證結(jié)果。Sw_seq就是產(chǎn)生隨機(jī)化數(shù)據(jù),然后發(fā)送給sw_drv。Sw_driver主要是實(shí)現(xiàn)axi4lite接口,發(fā)送數(shù)據(jù)給DUT。Axi4lite控制比較簡(jiǎn)單,如下:

task sw_driver::axi4lite_write(logic [`AXI4LITE_DATA_WD-1:0] data, logic [`AXI4LITE_ADDR_WD-1:0] waddr);
int timer = 1000;

repeat($urandom_range(15, 5)) @(posedge vif.axi_if.clk);
fork: AXI4LITE_SEND
begin: WRITE_DATA
vif.axi_if.axi4lite_awprot = 0;
vif.axi_if.axi4lite_awaddr = waddr;
vif.axi_if.axi4lite_awvalid = 1'b1;
if(!vif.axi_if.axi4lite_awready)begin
while(!vif.axi_if.axi4lite_awready)
@(posedge vif.axi_if.clk);
end
else begin
@(posedge vif.axi_if.clk);
end
vif.axi_if.axi4lite_awvalid = 1'b0;
repeat($urandom_range(5, 0)) @(posedge vif.axi_if.clk);

vif.axi_if.axi4lite_wdata = data;
vif.axi_if.axi4lite_wstrb = {(`AXI4LITE_DATA_WD/8){1'b1}};
vif.axi_if.axi4lite_wvalid = 1'b1;
if(!vif.axi_if.axi4lite_wready)begin
while(!vif.axi_if.axi4lite_wready)
@(posedge vif.axi_if.clk);
end
else begin
@(posedge vif.axi_if.clk);
end
vif.axi_if.axi4lite_wvalid = 1'b0;
wait(vif.axi_if.axi4lite_bvalid);
repeat($urandom_range(5, 0)) @(posedge vif.axi_if.clk);
end

begin: TIMER_CNT
while(timer--)
@(posedge vif.axi_if.clk);
`uvm_error(get_type_name(), $sformatf("wait for axi ready for long: axi4lite_awaddr = %0h, axi4lite_awready = %0d",
vif.axi_if.axi4lite_awaddr, vif.axi_if.axi4lite_awready));
end
join_any

disable AXI4LITE_SEND;
`uvm_info(get_type_name(), $sformatf("have sent sw data at address: %0x", vif.axi_if.axi4lite_awaddr), UVM_MEDIUM);
Endtask

為了將sw_trans的數(shù)據(jù)發(fā)送給其他模塊,在sw_driver中通過(guò)定義:

uvm_analysis_port #(sw_trans) sw_trans_port;

在需要接收這個(gè)數(shù)據(jù)的類中聲明一個(gè)port:

uvm_analysis_imp_sw #(sw_trans, img_monitor) sw_imp;

并聲明后綴:

`uvm_analysis_imp_decl(_sw)

然后定義一個(gè)write函數(shù):

function void img_monitor::write_sw(sw_trans sw_req);

img_h = sw_req.resl_h;
img_v = sw_req.resl_v;

endfunction

這樣就接收到了來(lái)自sw_trans的數(shù)據(jù)。

img_monitor

這部分主要是比對(duì)數(shù)據(jù),包括兩方面,一個(gè)是比對(duì)接收到的image的圖像數(shù)據(jù)R,G,B。另外一個(gè)是比對(duì)經(jīng)過(guò)物理編碼后的10bit的R,G,B數(shù)據(jù)。

task img_monitor::comp_rgb();
localparam AXI_DATA_BW = `AXI_DATA_WD/8;

logic [8*3-1:0] ref_rgb;
int err_cnt = 0;

int pixs;
int v=0;
int h=0;

while(v != img_v)begin
if(img_inf_i.rgb_valid && img_inf_i.rgb_ready && img_inf_i.h_sync && img_inf_i.v_sync)begin
pixs = 3 * (img_h * v + h);

ref_rgb = {img_data.img[pixs+2], img_data.img[pixs+1], img_data.img[pixs]};

if(ref_rgb != img_inf_i.rgb)begin
`uvm_error(this.get_type_name(), $sformatf("ref_rgb(%h, %h, %h) is diffrent with rgb(%h, %h, %h) at (%d, %d)", ref_rgb[8*2 +: 8], ref_rgb[8*1 +: 8], ref_rgb[7:0], img_inf_i.rgb[8*2 +: 8], img_inf_i.rgb[8*1 +: 8], img_inf_i.rgb[7:0], v, h));

err_cnt++;
end
@(posedge img_inf_i.clk);
v = (h >= img_h - 1) ? v+1 : v;
h = (h >= img_h - 1) ? h-img_h+1 : h+1;

end
else begin
@(posedge img_inf_i.clk);
end
end

if(err_cnt == 0)
`uvm_info(get_type_name(), "rgb comparison passed !", UVM_LOW)

Endtask

對(duì)物理編碼數(shù)據(jù)的比較,是UVM中生成對(duì)應(yīng)的數(shù)據(jù),放到隊(duì)列中,然后和DUT中的相應(yīng)數(shù)據(jù)進(jìn)行對(duì)比。

function void img_monitor::write_img(img_trans img_req);

localparam AXI_DATA_BW = `AXI_DATA_WD/8;
int pixs = 0;
tmds tmds_obj;

img_data.copy(img_req);

for(int i=0;i for(int j=0;j tmds_obj = new("tmds");
pixs = 3 * (i * img_h + j);
tmds_obj.b = img_data.img[pixs];
tmds_obj.g = img_data.img[pixs+1];
tmds_obj.r = img_data.img[pixs+2];

tmds_obj.b = tmds_encode(tmds_obj.b, this.b_cnt);
tmds_obj.g = tmds_encode(tmds_obj.g, this.g_cnt);
tmds_obj.r = tmds_encode(tmds_obj.r, this.r_cnt);

tmds_obj.h = j;
tmds_obj.v = i;

tmds_i.push_back(tmds_obj);
end

this.b_cnt = 0;
this.g_cnt = 0;
this.r_cnt = 0;

end

endfunction

task img_monitor::comp_tmds();

localparam PREAMBLE_VIDEO = {10'b1101010100, 10'b0010101011, 10'b0101010100};//'h3542AD54
int v = 0;
int h = 0;
tmds ref_tmds_obj = new("tmds");

while(v != img_v)begin

wait(img_inf_i.tmds_valid && img_inf_i.tmds_data == PREAMBLE_VIDEO);
@(posedge img_inf_i.clk);
for(int i=0;i if(img_inf_i.tmds_data != PREAMBLE_VIDEO)
`uvm_error(get_type_name(), "video preamble is wrong!")
@(posedge img_inf_i.clk);
end
repeat(2) @(posedge img_inf_i.clk);

for(h=0;h ref_tmds_obj = tmds_i.pop_front();
if(ref_tmds_obj.b != img_inf_i.tmds_data[9:0] || ref_tmds_obj.g != img_inf_i.tmds_data[19:10] || ref_tmds_obj.r != img_inf_i.tmds_data[29:20])
`uvm_error(this.get_type_name(), $sformatf("ref_tmds ( %h, %h, %h) != tmds (%h, %h, %h) at (%d, %d)", ref_tmds_obj.r, ref_tmds_obj.g, ref_tmds_obj.b, img_inf_i.tmds_data[29:20], img_inf_i.tmds_data[19:10], img_inf_i.tmds_data[9:0], v, h));

@(posedge img_inf_i.clk);
v = (h >= img_h - 1) ? v+1 : v;
end
end

`uvm_info(get_type_name(), "tmds data is compared for one frame!", UVM_LOW)
Endtask

結(jié)果

通過(guò)打印信息來(lái)判斷是否通過(guò)測(cè)試。

圖2.1 仿真結(jié)果

圖2.1 仿真結(jié)果

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • HDMI
    +關(guān)注

    關(guān)注

    32

    文章

    1710

    瀏覽量

    151961
  • 圖像處理
    +關(guān)注

    關(guān)注

    27

    文章

    1292

    瀏覽量

    56762
  • UVM
    UVM
    +關(guān)注

    關(guān)注

    0

    文章

    182

    瀏覽量

    19179
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    百問(wèn)FB顯示開發(fā)圖像處理 - PNG圖像處理

    2.3 PNG圖像處理 2.3.1 PNG文件格式和libpng編譯 ?跟JPEG文件格式一樣,PNG也是一種使用了算法壓縮后的圖像格式,與JPEG不同,PNG使用從LZ77派生的無(wú)損數(shù)據(jù)壓縮算法
    發(fā)表于 12-02 09:25

    百問(wèn)FB顯示開發(fā)圖像處理 - BMP圖像處理

    2 圖像處理 ?前言:所有的圖像文件,都是一種二進(jìn)制格式文件,每一個(gè)圖像文件,都可以通過(guò)解析文件中的每一組二進(jìn)制數(shù)的含義來(lái)獲得文件中的各種信息,如
    發(fā)表于 11-28 13:52

    vga接口轉(zhuǎn)hdmi轉(zhuǎn)換器沒(méi)圖像沒(méi)反應(yīng)怎么回事

    VGA轉(zhuǎn)HDMI轉(zhuǎn)換器是一種常見(jiàn)的視頻信號(hào)轉(zhuǎn)換設(shè)備,它允許用戶將VGA信號(hào)轉(zhuǎn)換為HDMI信號(hào),以便在現(xiàn)代顯示器或投影儀上顯示圖像。然而,有時(shí)
    的頭像 發(fā)表于 10-21 09:59 ?3398次閱讀

    FPGA在圖像處理領(lǐng)域的優(yōu)勢(shì)有哪些?

    、支持多種接口 FPGA可以支持多種接口,如PCIe、DDR、HDMI等,這使得FPGA可以方便地與其他硬件設(shè)備進(jìn)行連接。在圖像處理系統(tǒng)中,F(xiàn)PGA可以作為核心處理模塊,與其他模塊如C
    發(fā)表于 10-09 14:36

    顯示器2個(gè)hdmi接口如何切換

    在現(xiàn)代顯示器中,HDMI(High-Definition Multimedia Interface,高清晰度多媒體接口)接口已成為連接各種設(shè)備的標(biāo)準(zhǔn)接口之一。許多顯示器配備了多個(gè)HDMI
    的頭像 發(fā)表于 08-01 15:22 ?5833次閱讀

    化腐朽為神奇!揭開ISP圖像處理的神秘面紗,基于瑞芯微RK3568J工業(yè)平臺(tái)!

    參數(shù)文件,通過(guò)IQ參數(shù)文件將攝像頭采集的圖像進(jìn)行優(yōu)化處理后發(fā)送至顯示設(shè)備。硬件連接評(píng)估板默認(rèn)已支持HDMI OUT顯示,請(qǐng)將評(píng)估板
    發(fā)表于 07-25 16:00

    DSP教學(xué)實(shí)驗(yàn)箱_數(shù)字圖像處理操作_案例分享:5-13 灰度圖像二值化

    一、實(shí)驗(yàn)?zāi)康?學(xué)習(xí)灰度圖像二值化的原理,掌握圖像的讀取方法,并實(shí)現(xiàn)在LCD上顯示二值化前后的圖像。 二、實(shí)驗(yàn)原理 圖像二值化
    發(fā)表于 07-25 15:03

    基于FPGA的圖像采集與顯示系統(tǒng)設(shè)計(jì)

    源和固有的并行處理能力,在數(shù)字信號(hào)處理、硬件加速、汽車電子等領(lǐng)域得到了廣泛應(yīng)用。在圖像采集與顯示系統(tǒng)中,F(xiàn)PGA能夠?qū)崿F(xiàn)高速、并行的數(shù)據(jù)處理
    的頭像 發(fā)表于 07-17 10:58 ?1888次閱讀

    圖像處理中的卷積運(yùn)算

    卷積運(yùn)算是圖像處理中一種極其重要的操作,廣泛應(yīng)用于圖像濾波、邊緣檢測(cè)、特征提取等多個(gè)方面。它基于一個(gè)核(或稱為卷積核、濾波器)與圖像進(jìn)行相乘并求和的過(guò)程,通過(guò)這一操作可以實(shí)現(xiàn)對(duì)
    的頭像 發(fā)表于 07-11 15:15 ?2339次閱讀

    DSP教學(xué)實(shí)驗(yàn)箱_數(shù)字圖像處理_操作教程:5-1 圖像旋轉(zhuǎn)

    的所有像素都旋轉(zhuǎn)一個(gè)相同的角度。和圖像平移一樣,圖像旋轉(zhuǎn)也是圖像的位置變換,對(duì)于旋轉(zhuǎn)后超出源圖像范圍的區(qū)域要處理為不
    發(fā)表于 06-14 14:03

    FPGA設(shè)計(jì)中 Verilog HDL實(shí)現(xiàn)基本的圖像濾波處理仿真

    今天給大俠帶來(lái)FPGA設(shè)計(jì)中用Verilog HDL實(shí)現(xiàn)基本的圖像濾波處理仿真,話不多說(shuō),上貨。 1、用matlab代碼,準(zhǔn)備好把圖片轉(zhuǎn)化成Vivado Simulator識(shí)別的
    發(fā)表于 05-20 16:44

    hdmi是什么接口連接顯示

    ,HDMI接口支持雙向傳輸,可以實(shí)現(xiàn)設(shè)備之間的互聯(lián)互通,方便用戶進(jìn)行操作和控制。此外,HDMI接口還具有良好的兼容性,可以與各種設(shè)備和標(biāo)準(zhǔn)接口進(jìn)行連接,實(shí)現(xiàn)多設(shè)備的互聯(lián)互通。 在連接顯示器時(shí),可以使用
    的頭像 發(fā)表于 04-19 10:19 ?1321次閱讀

    uvm1.1升級(jí)為uvm1.2 uvm_report_server報(bào)錯(cuò)是何原因?

    ISP算法仿真中,小編會(huì)用reference model調(diào)用DPI接口用C++ 算法實(shí)現(xiàn)pixel算法處理,然后和DUT算法處理輸出的pixel值進(jìn)行比較,比較時(shí)候發(fā)現(xiàn)報(bào)錯(cuò),報(bào)錯(cuò)代碼
    的頭像 發(fā)表于 03-04 14:18 ?818次閱讀
    <b class='flag-5'>uvm</b>1.1升級(jí)為<b class='flag-5'>uvm</b>1.2 <b class='flag-5'>uvm</b>_report_server報(bào)錯(cuò)是何原因?

    UVM手把手教程系列(二)Phase機(jī)制簡(jiǎn)單介紹

    UVM中的phase,按照其是否消耗仿真時(shí)間($time打印出的時(shí)間)的特性,可以分成兩大類
    的頭像 發(fā)表于 02-29 09:26 ?1414次閱讀
    <b class='flag-5'>UVM</b>手把手教程系列(二)Phase機(jī)制簡(jiǎn)單介紹

    基于TIC6000 DSP教學(xué)實(shí)驗(yàn)箱_數(shù)字圖像處理操作教程:5-20 圖像離散余弦變換(LCD顯示

    C 語(yǔ)言代碼更高的性能。通過(guò)提供帶有源代碼的即用型 DSP 功能,IMGLIB 可以顯著縮短應(yīng)用程序開發(fā)時(shí)間。提供的功能包括壓縮、視頻處理、機(jī)器視覺(jué)和醫(yī)學(xué)成像。本實(shí)驗(yàn)中使用的功能是圖像
    發(fā)表于 01-11 14:34
    主站蜘蛛池模板: 老师好爽你下面水好多视频| 伊人22222| 小SAO货叫大声点妓女| 果冻传媒2021精品影视| 久久99re热在线播放7| 女子叉开腿让男子桶免费软件| 日本一卡二卡三卡四卡无卡免费播放 | 快播免费电影| 日韩精品一区二区亚洲AV观看| 欧美成人亚洲高清在线观看| 谁有成人网站地址| 怡春院欧美一区二区三区免费| xiao77唯美清纯| 狠狠婷婷综合久久久久久| 魔乳 堕乳漫画acg产卵| 网红刘婷hd国产高清| 小寡妇水真多好紧| 《乳色吐息》无删减版在线观看 | 扒开校花粉嫩小泬喷潮漫画| 国产在线精品亚洲观看不卡欧美| 美女张开腿让我了一夜| 无人影院在线播放| 最新国产亚洲亚洲精品视频| 国产成人精品免费视频大| 久久综久久美利坚合众国| 色综合伊人色综合网站中国| 在线观看视频中文字幕| 国产AV天堂亚洲AV麻豆| 美国69xxxx59| 亚洲AV蜜桃永久无码精品无码网| 99亚洲精品自拍AV成人软件| 黄色三级网络| 色综合五月激情综合色一区| 97人妻中文字幕免费视频| 国产亚洲精品线视频在线| 日本老妇一级特黄aa大片| 月夜直播免费看| 国产日韩高清一区二区三区| 亲胸揉胸膜下刺激视频网站APP| 亚洲午夜久久久精品电影院 | 国产AV精品白浆一区二|