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

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

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

3天內不再提示

UART整體的仿真方法和testbench結構講解

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

仿真框架

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

圖片

仿真框架

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

////////////////////////////////////////
`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的文件;而后者使用絕對路徑更加直接,但是在你的仿真環境需要移植或者include的文件比較多且分散時,使用第一種方式更為方便。

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

testcase說明

所有的測試用例使用偽隨機的方式進行,即數據和配置信息使用系統隨機函數產生。

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

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發送部分的功能驗證。隨機配置波特率、功能、delay和收發FIFO觸發值。寄存器配完后,配置串口發送寄存器,使DUT發送數據(重復1000次),將接收模型收到的數據與發送的數據對比,驗證功能正確性。

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收發測試。隨機配置波特率、功能、delay和收發FIFO觸發值。寄存器完后,配置串口發送寄存器,使DUT發送數據(重復1000次);再使用發送數據模型發送數據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

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

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

    關注

    31

    文章

    5357

    瀏覽量

    120685
  • 接收機
    +關注

    關注

    8

    文章

    1182

    瀏覽量

    53532
  • FIFO存儲
    +關注

    關注

    0

    文章

    103

    瀏覽量

    6018
  • UART接口
    +關注

    關注

    0

    文章

    124

    瀏覽量

    15316
  • DUT
    DUT
    +關注

    關注

    0

    文章

    189

    瀏覽量

    12425
收藏 人收藏

    評論

    相關推薦

    誰有基于matlab仿真的TSC型動態無功補償裝置仿真整體結構

    基于DSP的TSC型動態無功補償裝置matlab仿真整體結構圖啊,謝謝
    發表于 04-09 15:52

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

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

    testbench 的問題

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

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

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

    testbench設置的問題

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

    關于VHDL的testbench仿真問題

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

    怎樣用VHDL寫TESTBENCH

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

    testbench編寫基本結構

    testbench編寫基本結構
    發表于 09-28 17:43

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

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

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

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

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

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

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

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

    Testbench的基本組成和設計規則

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

    Testbench自動化驗證方法介紹

    自動化驗證testbench結果可以減少人工檢查的時間和可能犯的失誤,尤其對于比較大的設計。
    的頭像 發表于 09-04 09:15 ?955次閱讀

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

    在編寫完HDL代碼后,往往需要通過仿真軟件Modelsim或者Vivadao自帶的仿真功能對HDL代碼功能進行驗證,此時我們需要編寫Testbench文件對HDL功能進行測試驗證。
    發表于 04-29 10:43 ?2150次閱讀
    主站蜘蛛池模板: 99亚洲精品自拍AV成人软件| 久久电影院久久国产| 男生J桶进女人P又色又爽又黄| 2018高清国产一区二区三区| 亚洲免费福利在线视频| 国精品产露脸偷拍视频| 一区精品在线| 欧美极限扩肛| 国产青青草原| 2022国产精品不卡a| 日本一区二区三区在线观看网站| 国产老头与老太hd| 4438全国免费观看| 无码毛片内射白浆视频| 久久精品观看影院2828| 大乳牛奶女在线观看| 亚洲综合色婷婷在线影院| 欧美精品久久久久久久久大尺度| 国产囗交10p| 99久久久免费精品国产| 亚洲 天堂 国产在线播放| 免费毛片试看| 狠狠撩色姣姣综合久久| FREE性丰满白嫩白嫩的HD| 亚洲免费国产| 色拍拍噜噜噜久久蜜桃| 牢记永久免费网址| 国产欧美一区二区三区久久| 999zyz色资源站在线观看| 亚洲 欧美 另类 中文 在线| 女子扒开腿让男生桶爽| 狠狠人妻久久久久久综合九色| 把英语老师强奷到舒服动态图| 野花韩国在线观看| 偷柏自拍亚洲综合在线| 免费无码国产欧美久久18| 国外经典三级| 国产高清国内精品福利色噜噜| 中文字幕在线视频观看| 亚洲不卡一卡2卡三卡4卡5卡| 嫩草影院久久99|