91欧美超碰AV自拍|国产成年人性爱视频免费看|亚洲 日韩 欧美一厂二区入|人人看人人爽人人操aV|丝袜美腿视频一区二区在线看|人人操人人爽人人爱|婷婷五月天超碰|97色色欧美亚州A√|另类A√无码精品一级av|欧美特级日韩特级

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

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

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

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

電子設(shè)計 ? 來源:AI加速 ? 作者:AI加速 ? 2020-11-10 15:35 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

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

仿真架構(gòu)

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

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

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

img_seq

這部分主要是生成image數(shù)據(jù),并發(fā)送給img_drv,由img_drv驅(qū)動給到DUT。Image的隨機(jī)化定義在img_trans中,這個類繼承了uvm_sequence_item,定義了img數(shù)組,這是一個隨機(jī)化的8bit數(shù)據(jù)組成的數(shù)組。在img_seq中通過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中對整個仿真的啟動和結(jié)束做了控制,在這部分實現(xiàn)的原因是保證一幀圖像在仿真過程中的完整性。通過設(shè)置run_time來控制可以發(fā)送多少幀圖像,這個變量從命令行傳進(jìn)去。Starting_phase可以使得在uvm_sequence中來啟動和終止仿真過程,只要指定了相應(yīng)的sequence是某個sequencer的default_sequence,以及在sequencer中設(shè)置seq的starting_phase為sequencer的phase,這樣就可以用sequence來啟動仿真了。

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

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

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

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中通過定義:

uvm_analysis_port #(sw_trans) sw_trans_port;

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

uvm_analysis_imp_sw #(sw_trans, img_monitor) sw_imp;

并聲明后綴:

`uvm_analysis_imp_decl(_sw)

然后定義一個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

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

img_monitor

這部分主要是比對數(shù)據(jù),包括兩方面,一個是比對接收到的image的圖像數(shù)據(jù)R,G,B。另外一個是比對經(jīng)過物理編碼后的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

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

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é)果

通過打印信息來判斷是否通過測試。

圖2.1 仿真結(jié)果

圖2.1 仿真結(jié)果

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

    關(guān)注

    34

    文章

    1899

    瀏覽量

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

    關(guān)注

    29

    文章

    1342

    瀏覽量

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

    關(guān)注

    0

    文章

    183

    瀏覽量

    20020
收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關(guān)推薦
    熱點推薦

    RK3506 MIPI轉(zhuǎn)HDMI顯示開發(fā)實戰(zhàn):從硬件到驅(qū)動全解析

    從 0 入門 Linux 嵌入式開發(fā)!RK3506 開發(fā)板實戰(zhàn)教程系列開篇 在嵌入式設(shè)備開發(fā)中,MIPI DSI接口(移動行業(yè)處理器接口)廣泛用于連接LCD屏,而HDMI則是高清顯示輸出的主流標(biāo)準(zhǔn)
    的頭像 發(fā)表于 01-06 07:09 ?594次閱讀
    RK3506 MIPI轉(zhuǎn)<b class='flag-5'>HDMI</b><b class='flag-5'>顯示</b>開發(fā)實戰(zhàn):從硬件到驅(qū)動全解析

    深入剖析TMDS141:HDMI信號處理的理想選擇

    深入剖析TMDS141:HDMI信號處理的理想選擇 在當(dāng)今數(shù)字化的時代,高清視頻傳輸變得愈發(fā)重要,HDMI接口作為高清視頻傳輸?shù)闹髁鳂?biāo)準(zhǔn),其信號處理的質(zhì)量直接影響到視頻
    的頭像 發(fā)表于 12-27 14:15 ?758次閱讀

    如何用FPGA控制ADV7513實現(xiàn)HDMI畫面顯示和音頻播放

    HDMI接口顯示使用DMT時序+TMDS編碼來實現(xiàn)。當(dāng)用FPGA控制HDMI的數(shù)據(jù)傳輸時,通??梢圆捎眉僐TL實現(xiàn)TMDS算法或者使用專門的HDMI芯片(如ADV7513)這兩種方案來
    的頭像 發(fā)表于 12-02 11:05 ?6817次閱讀
    如何用FPGA控制ADV7513實現(xiàn)<b class='flag-5'>HDMI</b>畫面<b class='flag-5'>顯示</b>和音頻播放

    HDMI 2.2最新顯示接口標(biāo)準(zhǔn)深度解析

    本文深入探討了HDMI 2.2 物理層演進(jìn)以及這些標(biāo)準(zhǔn)如何推動下一代高分辨率、高帶寬顯示應(yīng)用。
    的頭像 發(fā)表于 10-15 15:04 ?2663次閱讀
    <b class='flag-5'>HDMI</b> 2.2最新<b class='flag-5'>顯示</b>接口標(biāo)準(zhǔn)深度解析

    NVMe高速傳輸之?dāng)[脫XDMA設(shè)計24: UVM 驗證包設(shè)計

    UVM 驗證包的主要功能是對 DUT 提供激勵, 仿真驗證對應(yīng)的功能, 并對測試結(jié)果進(jìn)行自動對比分析與統(tǒng)計。 驗證包包含一個NoPHAE_env 驗證環(huán)境, 驗證環(huán)境下包含
    的頭像 發(fā)表于 09-14 11:29 ?4788次閱讀
    NVMe高速傳輸之?dāng)[脫XDMA設(shè)計24: <b class='flag-5'>UVM</b> 驗證包設(shè)計

    NVMe高速傳輸之?dāng)[脫XDMA設(shè)計23:UVM驗證平臺

    抽象為 PCIeTLP 事務(wù),因此為了方便的在事務(wù)層構(gòu)建復(fù)雜的測試用例,項目基于 UVM 搭建驗證平臺進(jìn)行功能驗證。圖1 驗證平臺架構(gòu)圖在驗證平臺中將 PCIE 集成塊從待測試設(shè)計(Design
    發(fā)表于 08-26 09:49

    NVMe高速傳輸之?dāng)[脫XDMA設(shè)計18:UVM驗證平臺

    抽象為 PCIeTLP 事務(wù),因此為了方便的在事務(wù)層構(gòu)建復(fù)雜的測試用例,項目基于 UVM 搭建驗證平臺進(jìn)行功能驗證。圖1 驗證平臺架構(gòu)圖在驗證平臺中將 PCIE 集成塊從待測試設(shè)計(Design
    發(fā)表于 07-31 16:39

    原來HDMI線纜對輻射的影響這么大!

    進(jìn)行實測; 測試組網(wǎng)圖: EMC 三米電波暗室,實測設(shè)備是一款塑料殼臺式終端產(chǎn)品通過HDMI2.0連接顯示器輸出圖像,接觸過EMC的同學(xué)可能了解到,塑料殼產(chǎn)品RE輻射不太好通過的。 測試數(shù)據(jù): 如下為某
    發(fā)表于 06-28 22:21

    請問在k230上怎么使用opencv的imshow顯示圖像呢?

    已經(jīng)添加了highgui的鏈接,成功編譯并且在板子上運(yùn)行 期待結(jié)果和實際結(jié)果 在hdmi屏幕上顯示圖像 軟硬件版本信息 錯誤日志 hdmi屏幕黑屏無反應(yīng)
    發(fā)表于 06-11 06:01

    HarmonyOS應(yīng)用圖像stride處理方案

    當(dāng)圖像存儲在內(nèi)存中時,內(nèi)存緩沖區(qū)可能在每行像素之后包含額外的填充字節(jié)。填充字節(jié)會影響圖像在內(nèi)存中的存儲方式,但不會影響圖像顯示方式。stride是內(nèi)存中一行像素到內(nèi)存中下一行像素的字
    的頭像 發(fā)表于 06-10 14:17 ?1236次閱讀
    HarmonyOS應(yīng)用<b class='flag-5'>圖像</b>stride<b class='flag-5'>處理</b>方案

    【高云GW5AT-LV60 開發(fā)套件試用體驗】SC130GScmos模塊與LVDS屏和HDMI輸出例程測試報告圖像顯示部分細(xì)節(jié)補(bǔ)充

    /jishu_2491350_1_1.html] 在上篇報告中,由于帖子字節(jié)限制沒有說明其具體問題解決方法,在此說明。 HDMI顯示例程效果類似,其模塊功能框圖為: cmos數(shù)據(jù)位mipi接口,通過lvds物理差分對將圖像數(shù)據(jù)化
    發(fā)表于 06-09 09:46

    K230 V3.0使用Mipi顯示屏無法顯示圖像怎么解決?

    圖像 使用hdmi的例程,hdmi顯示顯示圖像 全是紫色畫面 供電正常兩根usb線,網(wǎng)上也去
    發(fā)表于 06-04 07:17

    4K顯示屏用DP還是HDMI?

    大家都知道,現(xiàn)在4K顯示屏越來越普及,無論是玩游戲、看電影還是辦公,都能帶來超清視界。但在連接4K顯示屏?xí)r,很多人都會糾結(jié):到底選DP(DisplayPort)還是HDMI?今天我們就來聊聊它們各自
    的頭像 發(fā)表于 04-08 16:03 ?2949次閱讀

    異形拼接處理器支持哪些顯示技術(shù)?

    器能夠支持液晶顯示屏的拼接,液晶顯示屏因其高分辨率、高色彩飽和度以及良好的穩(wěn)定性,在商鋪櫥窗、展覽展示等領(lǐng)域得到了廣泛應(yīng)用。 2、無縫拼接: 通過內(nèi)置的高精度圖像處理算法,異形拼接
    的頭像 發(fā)表于 04-01 09:48 ?749次閱讀

    如何將i.MX8MP內(nèi)核啟動標(biāo)志和yocto項目啟動圖像更改為我自己的自定義標(biāo)志和圖像?

    我想更改從 U-Boot 開頭顯示的所有徽標(biāo)和圖像。 當(dāng) hdmi 顯示器連接到板子時,我可以看到 4 只企鵝和帶有進(jìn)度條的 yocto 投影圖像
    發(fā)表于 03-26 06:01