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

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

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

3天內不再提示

在Testbench中如何讀取和存儲文本文件的數據呢?

冬至子 ? 來源:Bug記錄 ? 作者:woodfan ? 2023-06-06 11:44 ? 次閱讀

對一些數據處理的模塊進行調試仿真,模塊需要特定的數據輸入,比如單一頻率的正弦波;為了解決這個問題,我們可以用matlab,python等工具生成文本數據,然后使用Verilog將數據讀取進來;Testbench可以使用2種方法進行文本數據操作

  1. readmemb, readmemh, writememb, writememh操作
  2. fscanf, fwrite等操作

readmemb, readmemh, writememb, writememh操作

從字面意思理解,readmem是讀取數據到memory,后綴的b, h代表了數據的進制;同理,writemem是將memory的數據寫入到文件中;

所以,在使用這一類系統自帶函數時,首先要有一個memory類型的變量。定義方法如下:

reg [M-1:0] mem [N:1];

mem”變量“(應該叫寄存器組)有N個”一維“變量,每個”一維“變量的bit寬度為M;你可以將mem理解為C語言中的二維數組,里面包含了N個一維數組,每個一維數組有M個元素,元素為bit。

事實上,我們稱M為mem的數據寬度,N為mem的數據深度。

以readmemb為例,進行數據讀取操作

initialbegin $readmemb("data.txt", mem);end

readmemb的第一個參數為文件名,第二個參數為memory變量名;至此,data.txt內部的N行數據存入了mem里。readmemh操作類似,不同的是data.txt的數據要求為16進制。

那么可能有人會有疑問了,假如有以下問題,mem存入的數據會是啥樣:

  • data.txt每行的數據位寬小于M或者大于M

圖片

圖1 數據位寬小于M波形

圖片

圖2 數據位寬小于M存儲

圖片

圖3 數據位寬大于M

圖片

圖4 數據位寬大于M,VCS警告

經過試驗,M大于數據位寬,數據可以正常讀取,高位補0;小于數據位寬,數據無法正常讀取。

  • data.txt的數據不是二進制,或者不是純數字

與M小于數據位寬的情況一致,無法正常讀取數據。

  • 如果data.txt的行數小于N或大于N

圖片

圖5 行數小于N

圖片

圖6 行數大于N

經過試驗,行數大于N,仿真器會出警告,但數據可以正常讀取。小于N時,多余的部分memory的值為不定狀態。

數據存入mem但還沒有進入到模塊的輸入,接下來的操作可以參考下列代碼:

reg [M-1:0] data_in;integer index = 1;
initialbegin forever begin @(posegde clk); data_in = mem[index]; index = (index >= N) ? 1 : index + 1; endend

代碼里面,等待clk的上升沿,然后將mem的index元素賦值給data_in,然后index完成加1操作;整個過程不斷循環;這里設置了index計數到N返回1的計數保護,防止出現無效數據。

再將data_in與被測模塊的數據輸入端口相連,數據就送入進去了。

圖片

圖7 送入的數據波形

writememb的操作與readmemb反過來,將mem的數據存儲為文本操作如下:

initial
begin
    $writememb("new_data_b.txt", mem);
    $writememh("new_data_h.txt", mem);
end

存儲之后的

圖片

圖8 writememh

圖片

圖9 writememb

fscanf, fwrite等操作

Verilog本身的語法與C類似,其自身也有文本操作的函數,也與C類似。使用Verilog對文本操作,首先需要進行如下操作:

integer fid;initialbegin fid = $fopen("data.txt", "r"); //fid = $fopen("data.txt", "w"); //write if (!fid) $display("file open error");end

如同C語言中的fopen一樣,第一個參數為文件名,第二個參數為操作模式,包括讀(r, rb),寫(w, wb)等操作;根據返回值判斷文件操作是否有錯誤。

然后,根據文本文件的數據格式,進行數據讀取操作。

reg [M-1:0] data_in;
always @ (posedge clk) $fscanf(fid, "%d %d %d", data_in, mem[0], mem[1]);

fscanf用法與C語言類似,文件句柄為第一個參數,第二個參數為格式參數,第三個為數據保存變量,但不需要加&了。讀取文件的時候第二個參數與第三個參數需要對應,否則數據讀取可能會出錯。(親身經歷)

數據存儲操作如下,在前面fopen使用w模式下:

always @ (posegde clk) $fwrite(fid, "%d, %d, %d\\n", $signed(data_in), $signed(data_in)+1, $signed(data_in)+2);

數據可以按照第二個參數的格式存儲進文本文件。還有一系列如fdisplay, 相對于fwrite, 它的文件寫入數據之后會自動到下一行,所以第二個參數不需要加入“\\n”;ftell等函數。

注意,想要存儲十進制的負數,除了第二個參數用%d,第三個參數的寄存器變量還要使用$signed轉換為有符號數形式

圖片

圖10 正常情況文本操作讀取后存儲的數據

圖片

圖11 寄存器位寬小于數據位寬時,文本操作讀取后存儲的數據

注意,當存儲的寄存器位寬小于數據位寬時,數據會被自動截去高位保留低位。

之前使用文件操作存儲被測模塊的輸出時,每次文件的數據量(行數)都與理想中的數目對不上,找各種原因,最后才發現自己犯了一個低級錯誤,沒有使用fclose關閉文件句柄。

initial begin #1000; $fclose(fid); $finish;end

停止仿真前,一定要用fclose關閉文件句柄,否則數據存取會出現不可預知的問題。

歡迎使用本文使用的Testbench做實驗,注意,在windows下使用modelsim做實驗時,文件名必須是絕對路徑;tb中,使用"READMEM_ON"宏定義決定運行readmem或文件操作,可以嘗試修改宏定義的值改變文件操作的函數類型;本文使用資源在公眾號回復116獲取;

兩種方法差異對比

  1. readmem,writemem方法只能存取二進制或十六進制數據,數據格式固定,對多維其他格式數據讀取不支持,沒有文件操作靈活;文本操作方便其他的工具,如matlab,python處理數據
  2. readmem是可綜合語句,所以可以用于對模塊內的memory變量進行賦值,但其他語句是不可綜合語句,只能用于仿真測試中
  3. 文件操作雖然支持各種格式的文本存取,但是操作上沒有readmem, writemem簡單;假如數據需要循環使用,readmem讀取進memory之后,通過復位index就可以循環使用數據,而文本操作就麻煩一些。
聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • matlab
    +關注

    關注

    185

    文章

    2977

    瀏覽量

    230622
  • 寄存器
    +關注

    關注

    31

    文章

    5357

    瀏覽量

    120600
  • 正弦波
    +關注

    關注

    11

    文章

    645

    瀏覽量

    55445
  • 仿真器
    +關注

    關注

    14

    文章

    1018

    瀏覽量

    83797
  • C語言
    +關注

    關注

    180

    文章

    7607

    瀏覽量

    137071
收藏 人收藏

    評論

    相關推薦

    如何在Go操作文本文件

    作為一種編程語言,Go 具有廣泛的內置功能,包括創建、讀取和寫入文本(.txt)文件文件的功能。 文件是現代世界我們日常生活的重要組成部分
    發表于 09-29 09:48 ?771次閱讀

    求助,為什么CAN數據庫(.dbc文本文件找不到報文?

    我有CAN數據庫(dbc文件)。這是一個文本文件。此文件的擴展名為 dbc。Vector CANdb++編輯器
    發表于 01-23 06:28

    怎么用LABVIEW讀取文本文件

    求助 怎么用LABVIEW讀取文本文件 能不能給點提示或者框圖謝謝啦
    發表于 04-15 10:40

    如何把文本文件里面的數據讀取到波形圖表

    本帖最后由 eehome 于 2013-1-5 09:50 編輯 如何把文本文件里面的數據讀取到波形圖表
    發表于 06-07 11:10

    matlab讀取文本文件然后再計算

    matlab讀取文本文件,文本文件里有各時間點的電壓瞬時值,需把它求和然后再求平均值。謝謝大俠了
    發表于 11-15 10:17

    問一個文本文件讀取的問題

    `首先編寫了一個文本讀取的子VI,文本用的是相對路徑現在在一個程序調用該子VI,且沒有問題下面就是問題所在了我將程序打包exe可執行文件,
    發表于 01-05 09:48

    labview怎么將文本文件數據按奇,偶行分別進讀取。

    labview怎么將文本文件數據按奇,偶行分別進讀取。求程序框圖,謝謝。
    發表于 03-27 09:22

    TCP通信時用到while循環,將讀取的TCP數據寫入文本文件,程序結束后打開那個文本文件里面怎么沒有數據

    運行時不按停止按鈕,它就一直讀取TCP數據,因為我傳輸的TCP數據有限所以后面讀取TCP數據VI會報錯,這時候終止執行,打開
    發表于 12-12 21:23

    labview如何倒序讀取文本文件

    一個文本文件,如何使用labview將其從末尾字符開始讀取直到第一個并顯示
    發表于 04-23 16:55

    CVI中文本文件的格式問題

    )coeffPath表示函數讀取文本文件的路徑,這個文本文件必須在四個連續行包含濾波器G0、G1、H0和H1的系數,請問它的格式是怎樣的,最好給個案例,謝謝
    發表于 03-04 20:09

    labview如何讀取6400個超聲數據文本文件,并用波形圖逐一顯示出來

    /O打開讀取文本文件函數后,具體操作思路是怎么樣的。圖片為部分6400個超聲波文件文本
    發表于 04-17 22:27

    如何在 Python 讀取文本文件?

    讀取文本文件。有三種方法可以 Python 讀取文本文件 -read() - 此方法
    發表于 06-10 20:21

    C語言入門教程-文本文件

    文本文件 C文本文件很簡單,不難掌握。所有的文本文件操作函數和相關類型都由stdio庫提供。 當您的C程序需要文本輸入輸出(I/O
    發表于 07-29 11:23 ?1303次閱讀

    C語言入門教程-讀取文本文件

    讀取文本文件若要讀取一個文件,請使用r模式打開。一般來說,讀取文件時最好不要用fscanf,因為
    發表于 07-29 11:29 ?2925次閱讀

    Arduino之如何逐行讀取SD卡文本文件

    電子發燒友網站提供《Arduino之如何逐行讀取SD卡文本文件.zip》資料免費下載
    發表于 07-12 10:17 ?1次下載
    Arduino之如何逐行<b class='flag-5'>讀取</b>SD卡<b class='flag-5'>文本文件</b>
    主站蜘蛛池模板: 国产情侣真实露脸在线| 伦 乱真实故事| 日韩精品a在线视频| 动漫美女被爆挤奶歪歪漫画| 首页 国产 亚洲 中文字幕| 国产无遮挡又黄又爽在线视频| 亚洲精品AV一区午夜福利| 久久久无码精品亚洲欧美| VIDEOSGGRATIS欧美另类| 文中字幕一区二区三区视频播放 | 嫩草影院地址一地址二| 国产99精品视频| 伊人天天躁夜夜躁狠狠| 品色堂主页| 精品国产在线观看福利| 拔擦拔擦8X永久华人免费播放器 | 日韩性xxx| 久久国语露脸精品国产| qvod电影资源| 亚洲女人网| 日本护士在线观看| 九九影院午夜理论片无码| 成人特级毛片| 在线观看国产精美视频| 日韩视频中文在线一区| 久久久国产精品免费A片蜜臀| 德国黄色录像| 中文字幕视频免费在线观看| 十九岁韩国电影在线观看| 美丽的姑娘BD在线观看| 国产香蕉尹人视频在线| 被送到黑人性奴俱乐部| 亚洲一区二区女搞男| 日韩亚洲不卡在线视频| 乱辈通奷XXXXXHD猛交| 国产一卡在线观看完整版| 把她带到密室调教性奴| 在线一本码道高清| 亚洲免费视频观看| 同桌上课把奶露出来给我玩| 欧美白妞大战非洲大炮|