在testbench從文件讀入激勵

来源:https://www.cnblogs.com/mikewolf2002/archive/2018/12/21/10158575.html
-Advertisement-
Play Games

在驗證verilog邏輯模塊功能時候,我們可以從文件中讀入激勵,便於大規模的驗證。文件中的數據我們可以用c++編寫程式產生。第一種讀入文件的方法是用系統函數:$readmemb, readmemh, 第一個函數是讀入二進位的字元串,第二個是讀入16進位的字元串。我們準備兩個文本文件x1.txt111... ...


在驗證verilog邏輯模塊功能時候,我們可以從文件中讀入激勵,便於大規模的驗證。文件中的數據我們可以用c++編寫程式產生。

第一種讀入文件的方法是用系統函數:$readmemb, readmemh, 第一個函數是讀入二進位的字元串,第二個是讀入16進位的字元串。

我們準備兩個文本文件x1.txt

1111
1010
1110
0001

y1.txt

1101
0101
1010
0001

我們驗證一個四位的加法器

加法器verilog代碼如下:

module adder4(cout, sum, ina, inb, cin,clk);
output [3:0] sum;
output cout;
input [3:0] ina, inb;
input cin,clk;
reg[3:0] tempa, tempb, sum;
reg cout;
reg tempc;

always @(posedge clk)
begin
	tempa = ina;
	tempb = inb;
	tempc = cin;
end

always @(posedge clk)
begin
 {cout, sum} = tempa+ tempb + tempc;
end
endmodule

testbench代碼如下,我們用readmemb函數讀入激勵,併在for迴圈中賦值給ina,inb

`timescale 1ns/1ns
 `include "adder4.v"

module adder_rw_tb;
reg[3:0] ina,inb;
reg cin;
reg clk = 0;
 wire[3:0] sum;
 wire cout;
reg[3:0] inam[0:3];
reg[3:0] inbm[0:3];
 integer i;
 always #10 clk =~ clk;

initial
 begin
     $readmemb("x1.txt",inam);
     $readmemb("y1.txt",inbm);
     for(i=0;i<4;i=i+1)
     begin
          #20 ina = inam[i];
              inb = inbm[i];
     end
 end

initial
 begin
     cin=0;
     repeat(2)
     #200 cin = {$random} % 16;
 end

adder4 adder4_0(
            .clk(clk),
            .sum(sum),
            .cout(cout),
            .ina(ina),
            .inb(inb),
            .cin(cin)
        );
 initial
 begin
     $monitor($time,,,"%b + %b + %b = {%b,%b}", ina, inb, cin,cout,sum);
     #400 $finish;
 end

initial
 begin
      $dumpfile("dump.vcd");
      $dumpvars;
 end
endmodule


用vcs編譯後,run simv

Contains Synopsys proprietary information.
Compiler version M-2017.03-SP2-11; Runtime version M-2017.03-SP2-11;  Dec 21 19:34 2018
                    0  xxxx + xxxx + 0 = {x,xxxx}
                   20  1111 + 1101 + 0 = {x,xxxx}
                   30  1111 + 1101 + 0 = {1,1100}
                   40  1010 + 0101 + 0 = {1,1100}
                   50  1010 + 0101 + 0 = {0,1111}
                   60  1110 + 1010 + 0 = {0,1111}
                   70  1110 + 1010 + 0 = {1,1000}
                   80  0001 + 0001 + 0 = {1,1000}
                   90  0001 + 0001 + 0 = {0,0010}
$finish called from file "adder_rw_tb.v", line 44.
$finish at simulation time                  400
            V C S   S i m u l a t i o n   R e p o r t

在verdi中裝入dump.vcd,波形如下:

image


修改testbench代碼,用fdisplay把輸出寫到文件裡面。


`timescale 1ns/1ns
`include "adder4.v"

module adder_rw_tb;
reg[3:0] ina,inb;
reg cin;
reg clk = 0;
 wire[3:0] sum;
 wire cout;
reg[3:0] inam[0:3];
reg[3:0] inbm[0:3];
 integer i;
 integer fd;
 always #10 clk =~ clk;

initial
 begin
     $readmemb("x1.txt",inam);
     $readmemb("y1.txt",inbm);
     fd = $fopen("z1.txt");
     for(i=1;i<4;i=i+1)
     begin
          #20 ina = inam[i];
              inb = inbm[i];
          $fdisplay(fd,"%b %b %b %b",ina, inb,sum,cout);
     end
     #20
     $fdisplay(fd,"%b %b %b %b",ina, inb,sum,cout);
     $fclose(fd);
 end

initial
 begin
     cin=0;
     repeat(2)
     #200 cin = {$random} % 16;
 end

adder4 adder4_0(
            .clk(clk),
            .sum(sum),
            .cout(cout),
            .ina(ina),
            .inb(inb),
            .cin(cin)
        );
 initial
 begin
     $monitor($time,,,"%b + %b + %b = {%b,%b}", ina, inb, cin,cout,sum);
     #400 $finish;
 end

initial
 begin
      $dumpfile("dump.vcd");
      $dumpvars;
 end
endmodule

編譯執行程式後,可以得到z1.txt

1111 1101 xxxx x
1010 0101 1100 1
1110 1010 1111 0
0001 0001 1000 1
0001 0001 0010 0

我們也可以把兩個輸入數據合在一個文件xy.txt裡面,

1111 1101
1010 0101
1110 1010
0001 0001

用fscanf來讀入激勵數據,代碼如下:

`timescale 1ns/1ns
 `include "adder4.v"

module adder_rw_tb;
reg[3:0] ina,inb;
reg cin;
reg clk = 0;
 wire[3:0] sum;
 wire cout;
reg[3:0] inam[0:3];
reg[3:0] inbm[0:3];
 integer i;
 integer fd,fd_r;
 always #10 clk =~ clk;

initial
 begin
     fd_r = $fopen("xy.txt","r");
     fd = $fopen("z.txt","w");
     for(i=0;i<4;i=i+1)
     begin
          #20
          $fscanf(fd_r, "%d %d",ina,inb);
          $fwrite(fd,"%b %b %b %b\n",ina, inb,sum,cout);
     end
     #20
     $fwrite(fd,"%b %b %b %b\n",ina, inb,sum,cout);
     $fclose(fd);
 end

initial
 begin
     cin=0;
     repeat(2)
     #200 cin = {$random} % 16;
 end

adder4 adder4_0(
            .clk(clk),
            .sum(sum),
            .cout(cout),
            .ina(ina),
            .inb(inb),
            .cin(cin)
        );
initial
begin
    $monitor($time,,,"%b + %b + %b = {%b,%b}", ina, inb, cin,cout,sum);
     #400 $finish;
 end

initial
 begin
      $dumpfile("dump.vcd");
      $dumpvars;
 end
 endmodule


Chronologic VCS simulator copyright 1991-2017
Contains Synopsys proprietary information.
Compiler version M-2017.03-SP2-11; Runtime version M-2017.03-SP2-11;  Dec 21 20:13 2018
                    0  xxxx + xxxx + 0 = {x,xxxx}
                   20  0111 + 1101 + 0 = {x,xxxx}
                   30  0111 + 1101 + 0 = {1,0100}
                   40  0010 + 0101 + 0 = {1,0100}
                   50  0010 + 0101 + 0 = {0,0111}
                   60  0110 + 0010 + 0 = {0,0111}
                   70  0110 + 0010 + 0 = {0,1000}
                   80  0001 + 0001 + 0 = {0,1000}
                   90  0001 + 0001 + 0 = {0,0010}

寫入z.txt數據為:

0111 1101 xxxx x
0010 0101 0100 1
0110 0010 0111 0
0001 0001 1000 0
0001 0001 0010 0







您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • builder模式,目的在於:抽離複雜對象的構造函數,讓我們可以通過多種方法的排列組合構建複雜的對象。如果構造器參數過多,可以考慮 builder 模式 ...
  • 插件截圖 插件簡介 此插件在發佈文章的時候自動向百度熊掌號提交,有利於百度熊掌號收錄。基於Emlog6.0.1特別版美化的插件。 在百度推送插件的基礎上修改製作而成與百度推送共存,解放雙手,走向人生巔峰! 註:請在https://ziyuan.baidu.com/xzh/home/index 獲取a ...
  • java word轉pdf openoffice aspose ...
  • python多線程爬蟲項目() 爬取目標:鬥圖啦(起始url:http://www.doutula.com/photo/list/?page=1) 爬取內容:鬥圖啦全網圖片 使用工具:requests庫實現發送請求、獲取響應。 xpath實現數據解析、提取和清洗 threading模塊實現多線程爬蟲 ...
  • 1. 類的約束 1. 寫一個父類. 父類中的某個方法要拋出一個異常 NotImplementedError 2. 抽象類和抽象方法 from abc import ABCMeta, abstractmethod class Base(metaclass = ABCMeta): @abstractme ...
  • 一.Scrapy框架是基於Twisted的非同步框架,純Python實現的爬蟲框架,耦合程度低,可拓展性極強。 1.Engine引擎,處理整個系統的數據流、觸發事物、框架的核心 2.item項目,定義爬蟲爬取結果的數據結構,爬取的數據會被賦值成該item對象 3.Schedule調度器,接受engin ...
  • 本文是對Python異常處理機制的總結,較為全面的介紹了Python異常處理的常用內置類,即幾種異常捕獲/處理句式結構,主動觸發異常,斷言,with上下文管理協議,自定義異常類等內容。 ...
  • Bean 的配置方式:通過全類名(反射)、通過工廠方法(靜態工廠方法 & 實例工廠方法)、FactoryBean。 1.通過調用靜態工廠創建Bean 調用靜態工廠方法創建 Bean是將對象創建的過程封裝到靜態方法中. 當客戶端需要對象時, 只需要簡單地調用靜態方法, 而不用關心創建對象的細節.要聲明 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...