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

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

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

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

在Testbench中如何讀取和存儲文本文件的數(shù)據(jù)呢?

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

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

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

readmemb, readmemh, writememb, writememh操作

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

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

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

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

事實上,我們稱M為mem的數(shù)據(jù)寬度,N為mem的數(shù)據(jù)深度。

以readmemb為例,進行數(shù)據(jù)讀取操作

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

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

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

  • data.txt每行的數(shù)據(jù)位寬小于M或者大于M

圖片

圖1 數(shù)據(jù)位寬小于M波形

圖片

圖2 數(shù)據(jù)位寬小于M存儲

圖片

圖3 數(shù)據(jù)位寬大于M

圖片

圖4 數(shù)據(jù)位寬大于M,VCS警告

經(jīng)過試驗,M大于數(shù)據(jù)位寬,數(shù)據(jù)可以正常讀取,高位補0;小于數(shù)據(jù)位寬,數(shù)據(jù)無法正常讀取。

  • data.txt的數(shù)據(jù)不是二進制,或者不是純數(shù)字

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

  • 如果data.txt的行數(shù)小于N或大于N

圖片

圖5 行數(shù)小于N

圖片

圖6 行數(shù)大于N

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

數(shù)據(jù)存入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操作;整個過程不斷循環(huán);這里設置了index計數(shù)到N返回1的計數(shù)保護,防止出現(xiàn)無效數(shù)據(jù)。

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

圖片

圖7 送入的數(shù)據(jù)波形

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

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

存儲之后的

圖片

圖8 writememh

圖片

圖9 writememb

fscanf, fwrite等操作

Verilog本身的語法與C類似,其自身也有文本操作的函數(shù),也與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一樣,第一個參數(shù)為文件名,第二個參數(shù)為操作模式,包括讀(r, rb),寫(w, wb)等操作;根據(jù)返回值判斷文件操作是否有錯誤。

然后,根據(jù)文本文件的數(shù)據(jù)格式,進行數(shù)據(jù)讀取操作。

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

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

數(shù)據(jù)存儲操作如下,在前面fopen使用w模式下:

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

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

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

圖片

圖10 正常情況文本操作讀取后存儲的數(shù)據(jù)

圖片

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

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

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

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

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

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

兩種方法差異對比

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

    關注

    185

    文章

    2979

    瀏覽量

    230723
  • 寄存器
    +關注

    關注

    31

    文章

    5359

    瀏覽量

    120795
  • 正弦波
    +關注

    關注

    11

    文章

    647

    瀏覽量

    55514
  • 仿真器
    +關注

    關注

    14

    文章

    1019

    瀏覽量

    83843
  • C語言
    +關注

    關注

    180

    文章

    7613

    瀏覽量

    137247
收藏 人收藏

    評論

    相關推薦

    如何在Go操作文本文件

    作為一種編程語言,Go 具有廣泛的內(nèi)置功能,包括創(chuàng)建、讀取和寫入文本(.txt)文件文件的功能。 文件是現(xiàn)代世界我們?nèi)粘I畹闹匾M成部分
    發(fā)表于 09-29 09:48 ?774次閱讀

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

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

    怎么用LABVIEW讀取文本文件

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

    如何把文本文件里面的數(shù)據(jù)讀取到波形圖表

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

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

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

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

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

    labview怎么將文本文件數(shù)據(jù)按奇,偶行分別進讀取

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

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

    運行時不按停止按鈕,它就一直讀取TCP數(shù)據(jù),因為我傳輸?shù)腡CP數(shù)據(jù)有限所以后面讀取TCP數(shù)據(jù)VI會報錯,這時候終止執(zhí)行,打開
    發(fā)表于 12-12 21:23

    labview如何倒序讀取文本文件

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

    CVI中文本文件的格式問題

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

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

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

    如何在 Python 讀取文本文件

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

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

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

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

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

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

    電子發(fā)燒友網(wǎng)站提供《Arduino之如何逐行讀取SD卡文本文件.zip》資料免費下載
    發(fā)表于 07-12 10:17 ?1次下載
    Arduino之如何逐行<b class='flag-5'>讀取</b>SD卡<b class='flag-5'>文本文件</b>
    主站蜘蛛池模板: 欧美日韩精品一区二区在线线| 免费日本网站| 综合激情婷婷| 成人a视频| 亚洲人成电影在线观看网| 五月婷婷丁香在线| 日韩黄色免费| 久久亚洲成人| 99久久综合给久久精品| 午夜福利毛片| 国产性夜夜春夜夜爽| 国产黄色大全| 中出丰满大乳中文字幕| 天天做天天添婷婷我也去| 日本精品高清一区二区2021| 九九九精品| 在线免费视频手机版| 免费一级黄色录像| 欧美最猛黑人xxxx黑人猛交69| 亚洲激情a| 亚洲青草视频| 欧美国产在线一区| 成年人看的毛片| 清纯漂亮小美女准备啪啪| 欧美涩色| 在线欧美色| 欧美人与禽交| 91成人在线播放| 黄色免费看网站| 亚洲国产女人aaa毛片在线| 亚洲国产成人精品女人久久久 | 国产干美女| 午夜性| 四虎在线精品免费高清在线| 玖玖爱在线播放| 午夜在线网站| 亚洲综合精品成人啪啪| 中文字幕第8页| 欧美色香蕉| 午夜影院免费版| 看黄在线|