在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

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

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

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

UART整體的仿真方法和testbench結(jié)構(gòu)講解

冬至子 ? 來源:兩猿社 ? 作者:IC猿 ? 2023-06-05 16:08 ? 次閱讀

仿真框架

仿真部分結(jié)構(gòu)和設計類似,同樣有波特率、接收數(shù)據(jù)和發(fā)送數(shù)據(jù)模型。仿真的實現(xiàn)比較靈活,不用考慮可綜合性。主要實現(xiàn)master功能,配置部分對DUT配置,發(fā)送模型發(fā)送數(shù)據(jù)到DUT,接收模型接收到數(shù)據(jù)后與發(fā)送數(shù)據(jù)進行對比,驗證基本功能的正確性。

圖片

仿真框架

傷真頂層產(chǎn)生時鐘、復位,信號的初始化,測試用例的選擇以及全局變量或參數(shù)的定義(如寄存器地址和某些多模塊需要用到的變量)。

////////////////////////////////////////
`timescale 1ns/1ps
//`define tc01_00
//`define tc02_00
`define tc03_00

module    top();


reg            clk;                 // ARM clk
reg            clk26m;              // 26M function clk
reg            rst_;                // ARM clk's rst_
reg            rst26m_;             // function clk's rst_
reg            tx_data;             // send data line
wire           rx_data;             // receive data line
wire           uart_int;            // uart interrupt


// APB signals
reg  [3:0]     paddr;
reg  [31:0]    pwdata;
reg            psel;
reg            penable;
reg            pwrite;
wire [31:0]    prdata;

reg            baud_tclk;           // send data baud clk
reg            baud_rclk;           // receive data baud clk
reg            start;               // receive data baud enable signal
reg            rx_done;             // receive one data done
reg            w_state;             // write reg using signal
reg            r_state;             // read reg using signal
reg  [7:0]     tx_data_mem[0:999];  // send data memory
reg  [7:0]     rx_data_mem[0:999];  // receive data memory

reg  [31:0]    uart_tx;
reg  [31:0]    uart_rx;
reg  [31:0]    uart_baud;
reg  [31:0]    uart_conf;
reg  [31:0]    uart_rxtrig;
reg  [31:0]    uart_txtrig;
reg  [31:0]    uart_delay;
reg  [31:0]    uart_status;
reg  [31:0]    uart_rxfifo_stat;
reg  [31:0]    uart_txfifo_stat;

// when tx_model is runing a second time ,we don't want tx_cnt clean,
// so defind tx_cnt in top
integer        tx_cnt;

parameter      clk_period            = 10;
parameter      clk26m_period         = 38;
parameter      uart_tx_addr          = 4'h0;
parameter      uart_rx_addr          = 4'h1;
parameter      uart_baud_addr        = 4'h2;
parameter      uart_conf_addr        = 4'h3;
parameter      uart_rxtrig_addr      = 4'h4;
parameter      uart_txtrig_addr      = 4'h5;
parameter      uart_delay_addr       = 4'h6;
parameter      uart_status_addr      = 4'h7;
parameter      uart_rxfifo_stat_addr = 4'h8;
parameter      uart_txfifo_stat_addr = 4'h9;

`include "UART_baud.v"
`include "reg_op.v"
`include "check_int.v"
`include "uart_tx_model.v"
`include "uart_rx_model.v"
`include "tc01_00.v"
`include "tc02_00.v"
`include "tc03_00.v"

// cases of uart
UART_TOP    DUT(
        .clk(clk),
        .clk26m(clk26m),
        .rst_(rst_),
        .rst26m_(rst26m_),
        .paddr_i(paddr),
        .pwdata_i(pwdata),
        .psel_i(psel),
        .penable_i(penable),
        .pwrite_i(pwrite),
        .urxd_i(tx_data),
        .utxd_o(rx_data),
        .uart_int_o(uart_int),
        .prdata_o(prdata)
);

// always produce clk
always#(clk_period/2)    clk = ~clk;
always#(clk26m_period/2) clk26m = ~clk26m;


// signals initialize
initialbegin
    clk         = 1'b0;
    clk26m      = 1'b0;
    rst_        = 1'b1;
    rst26m_     = 1'b1;
    baud_tclk   = 1'b0;
    baud_rclk   = 1'b0;
    tx_data     = 1'b1;
    start       = 1'b0;
    rx_done     = 1'b0;
    w_state     = 1'b0;
    r_state     = 1'b0;
    uart_tx     = 32'h0;
    uart_baud   = 32'hf152;
    uart_conf   = 32'h34;
    uart_rxtrig = 32'h1;
    uart_txtrig = 32'h0;
    uart_delay  = 32'h2;
    uart_status = 32'h0;
    tx_cnt      = 0;
    #50;
    rst_      = 1'b0;
    rst26m_   = 1'b0;
    #100;
    rst_      = 1'b1;
    rst26m_   = 1'b1;

end


initialbegin
    @(posedge rst_) beginend
    fork
        UART_baud();
        check_int();
        uart_rx_model();
    join
end


initialbegin
    @(posedge rst_) beginend
    `ifdef tc01_00  tc01_00(10); `endif
    `ifdef tc02_00  tc02_00(); `endif
    `ifdef tc03_00  tc03_00(); `endif
end

endmodule

注意:每一個寄存器復位時都應該具有復位值,每一個輸入在仿真時都應該具有初始值,確保功能的正確性以及仿真能順利進行。

對于初學者或者常使用gui仿真的同學需要了解,在include task或者function等模型時,可以直接使用

`include "userfile.v"
或者
`include "D:/userdir/userfile.v"

兩者不同之處在于前者需要指定一個include directory,這個目錄包含需要inclue的文件;而后者使用絕對路徑更加直接,但是在你的仿真環(huán)境需要移植或者include的文件比較多且分散時,使用第一種方式更為方便。

仿真頂層主要是將各個模型與DUT串接,形成串口的配置、收發(fā)數(shù)據(jù)通路。另外通過控制不同的仿真用例測試不同配置下的功能正確性。

testcase說明

所有的測試用例使用偽隨機的方式進行,即數(shù)據(jù)和配置信息使用系統(tǒng)隨機函數(shù)產(chǎn)生。

tc01_00: 對DUT接收部分的功能驗證。隨機配置波特率和串口功能設置,收發(fā)FIFO觸發(fā)值為32'ha。控制發(fā)送數(shù)據(jù)模型發(fā)送數(shù)據(jù)到DUT,發(fā)送次數(shù)通過task input可控(10的倍數(shù))。設計中達到RX FIFO觸發(fā)值時,會觸發(fā)中斷,check int模塊會一直工作檢查處理中斷,進行數(shù)據(jù)對比。

task  tc01_00;
inputinteger    run_num;

reg  [9:0]         baud;
reg  [2:0]         conf;
reg		[15:0]			 rdata;
integer            i;
integer            run_time;
integer            seed;

run_time = 0;
seed     = 0;
// memory initialize
for(i=0;i< 1000;i++) begin
    top.tx_data_mem[i] = {$random} % 255;    //$dist_uniform(seed,5,255);
end
repeat(run_num) begin
    baud = $dist_uniform(seed,13,676);
    conf = {$random} % 7;   //$dist_uniform(seed,0,7);
    @(posedge top.clk) beginend
    write_reg(top.uart_baud_addr,{20'hf,2'b0,baud});
    @(posedge top.clk) beginend
    write_reg(top.uart_txtrig_addr,32'ha);
    @(posedge top.clk) beginend
    write_reg(top.uart_rxtrig_addr,32'ha);
    @(posedge top.clk) beginend
    write_reg(top.uart_conf_addr,{26'h0,3'b111,conf});

      uart_tx_model(10);

    $display("------run -------%d ",run_time);
    run_time++;
    seed++;
end
$stop;
endtask

tc02_00: 對DUT發(fā)送部分的功能驗證。隨機配置波特率、功能、delay和收發(fā)FIFO觸發(fā)值。寄存器配完后,配置串口發(fā)送寄存器,使DUT發(fā)送數(shù)據(jù)(重復1000次),將接收模型收到的數(shù)據(jù)與發(fā)送的數(shù)據(jù)對比,驗證功能正確性。

task  tc02_00;

reg  [9:0]         baud;
reg  [2:0]         conf;
reg  [3:0]         delay;
reg  [3:0]         rxtrig;
reg  [3:0]         txtrig;

integer            i;
integer            j;
integer            seed;

seed     = 0;
j        = 0;
// memory initialize
for(i=0;i< 1000;i++) begin
    top.tx_data_mem[i] = $dist_uniform(seed,5,255);
end

begin
    baud  = $dist_uniform(seed,13,676);
    conf  = $dist_uniform(seed,0,7);
    delay = $dist_uniform(seed,0,15);
    rxtrig = $dist_uniform(seed,4,14);
    txtrig = $dist_uniform(seed,4,14);
    write_reg(top.uart_baud_addr,{20'hf,2'b0,baud});
    @(posedge top.clk) beginend
    write_reg(top.uart_txtrig_addr,{28'h0,txtrig});
    @(posedge top.clk) beginend
    write_reg(top.uart_rxtrig_addr,{28'h0,rxtrig});
    @(posedge top.clk) beginend
    write_reg(top.uart_conf_addr,{26'h0,3'b111,conf});
    @(posedge top.clk) beginend
    write_reg(top.uart_delay_addr,{28'h0,delay});
    repeat(16) begin
        @(posedge top.clk) beginend
        write_reg(top.uart_tx_addr,top.tx_data_mem[j]);
        j++;
        if(j > 999) begin
            j = 0;
        end
        $display("write %d data",j);
    end
    seed++;
end
endtask

tc03_00: DUT收發(fā)測試。隨機配置波特率、功能、delay和收發(fā)FIFO觸發(fā)值。寄存器完后,配置串口發(fā)送寄存器,使DUT發(fā)送數(shù)據(jù)(重復1000次);再使用發(fā)送數(shù)據(jù)模型發(fā)送數(shù)據(jù)1000次。

task  tc03_00;

reg  [9:0]         baud;
reg  [2:0]         conf;
reg  [3:0]         delay;
reg  [3:0]         rxtrig;
reg  [3:0]         txtrig;

integer            i;
integer            j;
integer            seed;


seed     = 0;
j        = 0;
// memory initialize
for(i=0;i< 1000;i++) begin
    top.tx_data_mem[i] = $dist_uniform(seed,1,255);
end

begin
    baud  = $dist_uniform(seed,13,676);
    conf  = $dist_uniform(seed,0,7);
    delay = $dist_uniform(seed,0,15);
    rxtrig = $dist_uniform(seed,4,14);
    txtrig = $dist_uniform(seed,4,14);
    write_reg(top.uart_baud_addr,{20'hf,2'b0,baud});
    @(posedge top.clk) beginend
    write_reg(top.uart_txtrig_addr,{28'h0,txtrig});
    @(posedge top.clk) beginend
    write_reg(top.uart_rxtrig_addr,{28'h0,rxtrig});
    @(posedge top.clk) beginend
    write_reg(top.uart_conf_addr,{26'h0,3'b111,conf});
    @(posedge top.clk) beginend
    write_reg(top.uart_delay_addr,{28'h0,delay});
    fork
    repeat(16) begin
        @(posedge top.clk) beginend
        write_reg(top.uart_tx_addr,top.tx_data_mem[j]);
        j++;
        if(j > 999) begin
            j = 0;
        end
        $display("write %d data",j);
    end
    uart_tx_model(1000);
    join
    seed++;
end
endtask

本設計只使用了三個測試用例,對模塊的仿真驗證并不完備,讀者可以根據(jù)自己的使用情況增加不同功能的用例。

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

    關(guān)注

    31

    文章

    5343

    瀏覽量

    120377
  • 接收機
    +關(guān)注

    關(guān)注

    8

    文章

    1181

    瀏覽量

    53477
  • FIFO存儲
    +關(guān)注

    關(guān)注

    0

    文章

    103

    瀏覽量

    5979
  • UART接口
    +關(guān)注

    關(guān)注

    0

    文章

    124

    瀏覽量

    15294
  • DUT
    DUT
    +關(guān)注

    關(guān)注

    0

    文章

    189

    瀏覽量

    12386
收藏 人收藏

    評論

    相關(guān)推薦

    誰有基于matlab仿真的TSC型動態(tài)無功補償裝置仿真整體結(jié)構(gòu)

    基于DSP的TSC型動態(tài)無功補償裝置matlab仿真整體結(jié)構(gòu)圖啊,謝謝
    發(fā)表于 04-09 15:52

    用quartusii 9.1 生成的vht文件,testbench等問題

    1.quartusii 9.1 生成的testbench 后用VHDL 編寫后續(xù)程序的格式, 方法2如何用modelsim 關(guān)聯(lián)quartusii仿真3是不是testbench 沒有問
    發(fā)表于 05-17 21:36

    testbench 的問題

    給位大神,想問一下testbench中是否只是寫clk,reset等的變化?不是的話,里面究竟怎么寫才能等到自己的仿真?能否附一例子講解?謝謝
    發(fā)表于 04-11 16:03

    如何使用quartus ii 和modelsim -ae 快速進行Testbench功能仿真

    ,進行相關(guān)設置,如如圖三.輸入RTL級代碼和Testbench文件RTL級代碼和Testbench的相關(guān)語法,請參考其他書籍,這里不予講述,主要講解如何快速進行功能級仿真。3.1建立一
    發(fā)表于 11-29 21:35

    testbench設置的問題

    本帖最后由 平漂流 于 2017-5-21 11:09 編輯 如圖,看Verilog仿真視頻教程里面,在testbench設置時候,直接復制“blocking_vlg_tst”到top
    發(fā)表于 05-21 11:04

    關(guān)于VHDL的testbench仿真問題

    寫了很多VHDL文件和testbench文件,在仿真時信號的值總是U,請問有誰遇到過這種問題么,怎樣解決,謝謝各位大牛!
    發(fā)表于 09-29 17:20

    怎樣用VHDL寫TESTBENCH

    Testbench 不僅要產(chǎn)生激勵也就是輸入,還要驗證響應也就是輸出。當然也可以只產(chǎn)生激勵,然后通過波形窗口通過人工的方法去驗證波形,這種方法只能適用于小規(guī)模的設計。在 ISE 環(huán)境中,當前資源操作
    發(fā)表于 11-28 11:19

    testbench編寫基本結(jié)構(gòu)

    testbench編寫基本結(jié)構(gòu)
    發(fā)表于 09-28 17:43

    大型陣列系統(tǒng)有什么仿真方法?詳細案例講解資料免費下載

    本文檔的主要內(nèi)容詳細介紹的是大型陣列系統(tǒng)有什么仿真方法?詳細案例講解資料免費下載。
    發(fā)表于 08-23 14:36 ?23次下載
    大型陣列系統(tǒng)有什么<b class='flag-5'>仿真</b><b class='flag-5'>方法</b>?詳細案例<b class='flag-5'>講解</b>資料免費下載

    使用三種自動化testbench驗證方法

    自我檢查testbench設計:與前兩種方法不同,該方法實時檢查預期結(jié)果和實際結(jié)果,而不是仿真結(jié)束后才檢查。在testbench中插入錯誤追
    的頭像 發(fā)表于 11-20 11:26 ?3750次閱讀

    在模塊化設計過程中編寫testbench仿真方法

    在開始設計前,根據(jù)設計劃分好各功能模塊(為了敘述方便,這里以對“FPGA數(shù)字信號處理(十三)鎖相環(huán)位同步技術(shù)的實現(xiàn)”中設計的系統(tǒng)仿真為例)。編寫好第一個子模塊(本例中為雙相時鐘生成模塊),在Vivado中添加仿真sim文件,編寫test
    的頭像 發(fā)表于 11-20 11:29 ?3939次閱讀

    VHDL與Verilog硬件描述語言如何用TestBench來進行仿真

    TestBench來進行仿真是一個很不錯的選擇。 VHDL與Verilog語言的語法規(guī)則不同,它們的TestBench的具體寫法也不同,但是應包含的基本結(jié)構(gòu)大體相似,在VHDL的
    的頭像 發(fā)表于 08-04 14:16 ?3824次閱讀

    testbench是什么? testbench測試的機制是什么?

    廢話不多說直接上干貨,testbench就是對寫的FPGA文件進行測試的文件,可以是verilog也可以是VHDL。
    的頭像 發(fā)表于 06-28 16:44 ?4840次閱讀
    <b class='flag-5'>testbench</b>是什么? <b class='flag-5'>testbench</b>測試的機制是什么?

    Testbench的基本組成和設計規(guī)則

    ??對于小型設計來說,最好的測試方式便是使用TestBench和HDL仿真器來驗證其正確性。一般TestBench需要包含這些部分:實例化待測試設計、使用測試向量激勵設計、將結(jié)果輸出到終端或波形窗口便于可視化觀察、比較實際結(jié)果和
    的頭像 發(fā)表于 09-01 09:57 ?1280次閱讀
    <b class='flag-5'>Testbench</b>的基本組成和設計規(guī)則

    FPGA入門必備:Testbench仿真文件編寫實例詳解

    在編寫完HDL代碼后,往往需要通過仿真軟件Modelsim或者Vivadao自帶的仿真功能對HDL代碼功能進行驗證,此時我們需要編寫Testbench文件對HDL功能進行測試驗證。
    發(fā)表于 04-29 10:43 ?2054次閱讀
    主站蜘蛛池模板: 免费xxxx大片| 中文字幕一精品亚洲无线一区| 在线网址你懂的| 欧美日韩国产成人精品 | 激情亚洲色图| 色视频亚洲| 色网站免费视频| 人人干人人草| 午夜毛片在线观看| 一二三区视频| 欧美色视频日本片免费高清| 亚洲国产片| 一区二区三区福利| 啪啪大片| 色极影院| 2021色噜噜狠狠综曰曰曰| 免费在线观看黄色| 特黄一级视频| 波多野结衣在线观看一区 | 特级免费毛片| 97理论片| 亚洲一区欧美二区| 欧美无遮挡国产欧美另类| 手机看片自拍自自拍日韩免费| 亚洲光棍天堂| 毛片免费观看| 国产伦精品一区二区三区在线观看| 一级特黄aa毛片免费观看| 国产亚洲一区二区精品| 亚洲欲色| 精品国产柚木在线观看| 经典三级一区在线播放| 400部大量精品情侣网站| 色偷偷97| 国模精品| 黄色的网站在线观看| 日本三级黄色| 末满18以下勿进色禁网站| 羞涩妩媚玉腿呻吟嗯啊销魂迎合| freexxxx性欧美| 手机在线亚洲|