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

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

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

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

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

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

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

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

readmemb, readmemh, writememb, writememh操作

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

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

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

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

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

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

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

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

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

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

圖片

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

圖片

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

圖片

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

圖片

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

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

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

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

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

圖片

圖5 行數(shù)小于N

圖片

圖6 行數(shù)大于N

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

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

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

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

圖片

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

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

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

存儲(chǔ)之后的

圖片

圖8 writememh

圖片

圖9 writememb

fscanf, fwrite等操作

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

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

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

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

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

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

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

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

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

注意,想要存儲(chǔ)十進(jìn)制的負(fù)數(shù),除了第二個(gè)參數(shù)用%d,第三個(gè)參數(shù)的寄存器變量還要使用$signed轉(zhuǎn)換為有符號(hào)數(shù)形式

圖片

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

圖片

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

注意,當(dāng)存儲(chǔ)的寄存器位寬小于數(shù)據(jù)位寬時(shí),數(shù)據(jù)會(huì)被自動(dòng)截去高位保留低位。

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

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

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

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

兩種方法差異對(duì)比

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

    關(guān)注

    188

    文章

    2998

    瀏覽量

    233447
  • 寄存器
    +關(guān)注

    關(guān)注

    31

    文章

    5425

    瀏覽量

    123606
  • 正弦波
    +關(guān)注

    關(guān)注

    11

    文章

    652

    瀏覽量

    56356
  • 仿真器
    +關(guān)注

    關(guān)注

    14

    文章

    1034

    瀏覽量

    85076
  • C語言
    +關(guān)注

    關(guān)注

    180

    文章

    7630

    瀏覽量

    140644
收藏 人收藏

    評(píng)論

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

    如何在Go操作文本文件

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

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

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

    怎么用LABVIEW讀取文本文件

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

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

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

    matlab讀取文本文件然后再計(jì)算

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

    問一個(gè)文本文件讀取的問題

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

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

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

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

    運(yùn)行時(shí)不按停止按鈕,它就一直讀取TCP數(shù)據(jù),因?yàn)槲覀鬏數(shù)腡CP數(shù)據(jù)有限所以后面讀取TCP數(shù)據(jù)VI會(huì)報(bào)錯(cuò),這時(shí)候終止執(zhí)行,打開
    發(fā)表于 12-12 21:23

    labview如何倒序讀取文本文件

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

    CVI中文本文件的格式問題

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

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

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

    如何在 Python 讀取文本文件

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

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

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

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

    讀取文本文件若要讀取一個(gè)文件,請(qǐng)使用r模式打開。一般來說,讀取文件時(shí)最好不要用fscanf,因?yàn)?/div>
    發(fā)表于 07-29 11:29 ?2979次閱讀

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

    電子發(fā)燒友網(wǎng)站提供《Arduino之如何逐行讀取SD卡文本文件.zip》資料免費(fèi)下載
    發(fā)表于 07-12 10:17 ?1次下載
    Arduino之如何逐行<b class='flag-5'>讀取</b>SD卡<b class='flag-5'>文本文件</b>
    主站蜘蛛池模板: 婷婷六月丁香午夜爱爱 | 亚洲a网 | 凸输偷窥xxxx自由视频 | 国产18到20岁美女毛片 | 欧美yw193.c㎝在线观看 | 亚洲免费资源 | www.热| 成人亚洲综合 | 日本aaaaa特黄毛片 | 国产香蕉视频在线观看 | 日韩卡1卡2卡三卡四卡二卡免 | 久久久免费 | 99午夜| 日本特级黄色大片 | 未成人禁止视频高清在线观看 | 久久国产乱子伦精品免费看 | 欧色美| 久久刺激视频 | 天天爽夜夜爽人人爽曰喷水 | 操到喷水| 日韩三| 免费人成网站永久 | 天天躁夜夜躁狠狠躁躁88 | 午夜网站免费版在线观看 | 欧美色欧美亚洲高清在线观看 | 特级片网站 | a级特黄毛片 | 日韩成人黄色 | 5g国产精品影院天天5g天天爽 | 深夜偷偷看视频在线观看 | 色爱区综合五月激情 | 俺也操 | 国产三级在线免费 | 一国产大片在线观看 | 欧美深深色噜噜狠狠yyy | riav久久中文一区二区 | 中文字幕亚洲一区二区三区 | 国产三级 在线播放 | 五月婷综合 | 欧美性精品videofree | 777色淫网站女女免费 |