【芯片前端】auto_testbench的大版本升級——加入簡單預期與自動比對

前言

前文提要:

【芯片前端】一鍵生成簡易版本定向RTL驗證環境的腳本——auto_verification_rtl腳本_尼德蘭的喵的博客-CSDN博客

【芯片前端】可能是定向驗證的巔峰之作——auto_testbench_autotestbench_尼德蘭的喵的博客-CSDN博客

工具路徑:

auto_testbench: 用于自動生成verilog rtl的定向用例仿真平臺的腳本

在上次完成自詡為“定向驗證的巔峰之作”之后,我覺得這個工具應該是寫到頭了,不過最近的實踐中我發現,對于auto_testbench的主要應用場景——CBB與UT的驗證而言,如果能不依賴于方法學進行一些簡單預期和比對,還是可以大幅收斂debug時間的。

本次升級針對握手接口(因為好久沒寫其他類型接口了),腳本的功能概述為:

  1. 對于握手接口單輸出的模塊,會進行符合協議的輸入隨機,會自動生成采樣與比對task,而根據輸入生成預期的task需要手動填充;
  2. 對于不滿足單輸出的其他握手接口模塊,會進行符合協議的輸入隨機,此時如果想要進行比對需要對環境進行比較大的改動;
  3. 對于其他接口模塊,會生成整套驗證環境,對接口進行初始化和隨機驅動;
  4. 如果不進行仿真只想編譯模塊,在tb.f中注釋掉testbench.sv路徑然后在sim路徑執行make cmp;

其他優化包括:

  1. 優化了生成的tb.f文件;
  2. 修正了模塊中有注釋是可能誤讀的問題;
  3. 美化和對齊了一下生成文件;

效果親測

作為一個負責人的工具發布者,發布前我先親自驗證了一下這個工具的正確性,于是翻出來了去年寫的一個cbb bypass_fifo進行了下驗證,然后發現這個cbb有BUG!不過放心,我相信這個cbb是沒有在工程中使用的。

bypass_fifo的功能是這樣,對于輸入的data,如果power為1則正常輸出,如果為0則丟棄。這個cbb聽起來很奇怪不過其實他是另外一個cbb的一部分(一對多的場景,每個數據可能有不同的通道需要)。那么看下出錯的log:

對著log找到波形的錯誤處:

然后分析下問題不是出現在'h57eadcc1這個數身上,而是出現在前一個數'hb985d7ad,RTL出口沒有就把valid和數變了!奇怪的是對于類似的場景,其他的數據在出口時序就很正確:

那么這個問題如果通過波形是否能發現呢?不是太容易:

因此,這個工具的新功能我初步認為是有效的。

使用說明

就以bypass_fifo的驗證環境生成為例,看一下如何使用。

第一步還是切換到bypass_fifo的路徑,執行:

auto_testbench -f bypass_fifo.v
#如果沒有設置全局路徑,請完整輸入auto_testbench的腳本路徑

打印信息為:

##====================================================================##
Gen over! please cd ./bypass_fifo_verification/sim
You need modify ./bypass_fifo_verification/top/testbench.svlike cp ./bypass_fifo_verification_bak/top/testbench.sv ./bypass_fifo_verification/top/
You need modify ./bypass_fifo_verification/cfg/tb.flike cp ./bypass_fifo_verification_bak/cfg/tb.f ./bypass_fifo_verification/cfg/
##====================================================================##

這里說明一下,我的本意是如果已經有bypass_fifo_verification目錄了,就把bypass_fifo_verification重命名為bypass_fifo_verification_bak,不過吧腳本寫的好像是有點問題導致這個功能時靈時不靈。

第二步,切換到bypass_fifo_verification/cfg路徑,打開tb.f文件,并按照需求修改:

+libext+.v
-y /home/ICer/gitee_path/auto_testbench/src/../ver/bypass_fifo_pkg.sv
/home/ICer/gitee_path/auto_testbench/src/bypass_fifo.v
../top/testbench.sv

第三步,切換到bypass_fifo_verification/ver路徑,檢查bypass_fifo_pkg.sv是否符合預期:

package bypass_fifo_pkg;parameter ERROR_DEBUG_CNT = 5;parameter DEPTH = 8;parameter WIDTH = 128;int error_cnt = 0;bit check_en  = 0;typedef struct{bit [WIDTH -1:0] data_in;bit  data_in_power;} data_in_valid_struct;data_in_valid_struct data_in_valid_bus_q[$];typedef struct{bit [WIDTH -1:0] data_out;} data_out_valid_struct;data_out_valid_struct rm_q[$];data_out_valid_struct data_out_valid_bus_q[$];endpackage

重點說bypass_fifo_pkg文件,在這個文檔中腳本根據每個valid信號的名字“推測”其它信號是否為該valid“管轄”的信號,并將結果按valid分組為struct結構。然后順便把每個數據結構的隊列進行聲明,如果是輸出的valid,那么同時聲明reference model的預期隊列。因此如果有多路valid輸出握手的話,這里的rm聲明會重復,需要手動修改。

ERROR_DEBUG_CNT表示發生錯誤的次數,check_en表示是否進行自動比對默認為0,需要進行比對時手動將這個值改為1。

第四步,切換到bypass_fifo_verification/top路徑,打開testbench.sv文件,還是如此的賞心悅目:

其他部分之前都講過,只需說明下新增的auto_verification部分即可。展開這部分可以看到如下代碼:

task in_queue_gain();while(1)begin@(negedge clk);if(data_in_valid && data_in_ready)begindata_in_valid_struct data_in_valid_dat;data_in_valid_dat.data_in = data_in;data_in_valid_dat.data_in_power = data_in_power;data_in_valid_bus_q.push_back(data_in_valid_dat);end//if-end end//while-end 
endtask: in_queue_gain

對輸入進行采樣,如果有多路輸入,會在這個task里均進行采樣;

task out_queue_gain();while(1)begin@(negedge clk);if(data_out_valid && data_out_ready)begindata_out_valid_struct data_out_valid_dat;data_out_valid_dat.data_out = data_out;data_out_valid_bus_q.push_back(data_out_valid_dat);end//if-end end//while-end 
endtask: out_queue_gain

對輸出進行采樣,如果有多路輸出,會在這個task里均進行采樣;

task rm_queue_gain();data_in_valid_struct data_in_valid_dat;data_out_valid_struct data_out_valid_dat;//while(1)begin//wait(data_in_valid_bus_q.size > 0);//data_in_valid_dat = data_in_valid_bus_q.pop_front();//rm_q.push_back(data_out_valid_dat);//end
endtask: rm_queue_gain

rm_queue_gain是一個空殼task,用于產生預期,里面預置了數據類型和隊列操作方法;

task queue_check();while(1)begindata_out_valid_struct rm_data;data_out_valid_struct dual_data;wait(data_out_valid_bus_q.size() > 0);dual_data = data_out_valid_bus_q.pop_front();if(rm_q.size() == 0) begin$display("dual_data = %0p, rm_queue.size = 0", dual_data);error_cnt += 1;endelse beginrm_data = rm_q.pop_front();if(dual_data != rm_data)beginerror_cnt += 1;$display("dual_data(%0p) != rm_data(%0p) at %t", dual_data, rm_data, $realtime);endelse begin//$display("dual_data(%0p) == rm_data(%0p) at %t", dual_data, rm_data, $realtime);endendif(error_cnt >= ERROR_DEBUG_CNT) begin$display("Check Error!!!");$finish;endend
endtask: queue_check

對rm_q[$]和RTL輸出接口queue[$]進行自動比對,同樣需要注意,如果有多路進行輸出,這里只會比對其中一路;

代碼的最后是固定的initial函數:

initial beginforkin_queue_gain();out_queue_gain();rm_queue_gain();if(check_en == 1) queue_check();join_none
end

然后是關鍵點,根據bypass_fifo的功能對rm_queue_gain task進行改寫,完成簡單的功能預期:

task rm_queue_gain();data_in_valid_struct data_in_valid_dat;data_out_valid_struct data_out_valid_dat;while(1)beginwait(data_in_valid_bus_q.size > 0);data_in_valid_dat = data_in_valid_bus_q.pop_front();if(data_in_valid_dat.data_in_power == 1)begindata_out_valid_dat.data_out = data_in_valid_dat.data_in;rm_q.push_back(data_out_valid_dat);endend
endtask: rm_queue_gain

至此CBB的簡單驗證環境就完成了。

切換到auto_verification/sim目錄,執行:

make run wave=on

之后根據仿真結果和波形進行debug。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/37505.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/37505.shtml
英文地址,請注明出處:http://en.pswp.cn/news/37505.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

廣告聚合平臺能為APP開發者提供哪些幫助

應用變現平臺是幫助開發者優化廣告策略并最終獲得更多收入的綜合途徑。在廣告變現過程中,接入單一的廣告聯盟,變現效率不高,并且開發者需要花費許多精力進行篩選和管理,難免會應接不暇,而聚合廣告平臺的出現則一定程度…

GloVe、子詞嵌入、BPE字節對編碼、BERT相關知識(第十四次組會)

GloVe、子詞嵌入、BPE字節對編碼、BERT相關知識(第十四次組會) Glove子詞嵌入上游、下游任務監督學習、無監督學習BERTGlove 子詞嵌入 上游、下游任務 監督學習、無監督學習 BERT

springboot使用configtree讀取樹形文件目錄中的配置

文章目錄 一、介紹二、演示環境三、項目演示1. 配置文件2. 導入配置3. 檢測配置屬性 四、應用場景五、源碼解析1. ConfigTreeConfigDataLocationResolver2. ConfigTreeConfigDataLoader 六、總結 一、介紹 相信絕大多數使用springboot開發項目的朋友們在添加配置時&#xff0c…

【從零學習python 】23. Python中集合(set)的使用方法和常見操作

文章目錄 set的使用創建格式添加元素移除元素set常見方法列表練習 進階案例 set的使用 集合(set)是一個無序的不重復元素序列,可以使用大括號 { } 或者 set() 函數創建集合。 注意:創建一個空集合必須用 set() 而不是 { }&#x…

母嬰即時零售行業數據可視化分析

對新晉父母來說,很多母嬰用品如同一位貼心的助手,為他們的寶寶提供溫暖和呵護。從嬰兒床墊到可愛的拼圖玩具,每一件用品都是為寶寶的成長和發展量身定制。對于繁忙的父母們而言,這些用品不僅幫助照顧孩子,更是為他們減…

一百五十一、Kettle——Linux上安裝的kettle8.2開啟carte服務以及配置子服務器

一、目的 kettle8.2在Linux上安裝好可以啟動界面、并且可以連接MySQL、Hive、ClickHouse等數據庫后,準備在Linux上啟動kettle的carte服務 二、實施步驟 (一)carte服務文件路徑 kettle的Linux運行的carte服務文件是carte.sh (二…

手機兩個卡槽的正確使用方法,您用對了嗎?

手機上有兩個卡槽,該如何搭配才能使話費降到最低?你又是怎么搭配的? 這篇文章小編就來告訴你,如何在不換號的情況下,將自己的話費降到最低。 首先卡槽一我們就用8元保號套餐。 卡槽二,我們就可以辦理一張…

【C語言】每日一題(尋找數組的中心下標)

尋找數組的中心下標,鏈接奉上 方法 暴力循環前綴和 暴力循環 ???????思路: 依舊是我們的老朋友,暴力循環。 1.可以利用外層for循環,循環變量為數組下標,在循環內分別求出下標左邊與右邊的sum 2.在邊界時討論&…

JAVA 鼠標控制與鍵盤輸入控制

核心類:java.awt.Robot 該類是JDK定義的電腦系統的抽象類,可以用來模擬實現鼠標點擊與鍵盤輸入等信息 簡單實現一個自動搶票代碼: Robot rt new Robot();//可以認為是操作間隔的停歇時間,比如等待頁面加載,等彈框內容展示等 r…

vue tree禁用和多選變為單選

禁用的話和后臺協調一下&#xff0c;參數中多返回一個disabled 多選變單選 在tree結構中加入一個方法 <el-treeaccordion:data"deptOptions":props"defaultProps"show-checkbox:expand-on-click-node"false":filter-node-method"filte…

windows bat 腳本實現FTP自動下載上傳

windows bat 腳本實現FTP自動下載上傳 1. 自動下載 # 示例&#xff1a;實現自動下載 echo Off echo open 192.168.137.102>>ftp.txt echo admin>>ftp.txt echo admin12345>>ftp.txt echo lcd D:\>>ftp.txt echo cd /admin/1>>ftp.txt echo bin…

k8s整合istio配置gateway入口、配置集群內部服務調用管理

一、 istio gateway使用demo kubectl apply -f - <<EOF apiVersion: networking.istio.io/v1alpha3 kind: Gateway metadata:name: ngdemo-gatewaynamespace: ssx spec:selector:istio: ingressgateway # use Istio default gateway implementationservers:- port:numbe…

碼銀送書第五期《互聯網廣告系統:架構、算法與智能化》

廣告平臺的建設和完善是一項長期工程。例如&#xff0c;谷歌早于2003年通過收購Applied Semantics開展Google AdSense 項目&#xff0c;而直到20年后的今天&#xff0c;谷歌展示廣告平臺仍在持續創新和提升。廣告平臺是負有營收責任的復雜在線平臺&#xff0c;對其進行任何改動…

Mysql—修改用戶密碼(重置密碼)

Mysql—修改用戶密碼&#xff08;重置密碼&#xff09; 1、登錄mysql 1 2 [rootlocalhost ~]# mysql -uroot -p123456 [rootlocalhost ~]# mysql -hlocalhost -uroot -p123456 如果忘記密碼&#xff0c;則跳過MySQL的密碼認證過程。步驟如下&#xff1a; 修改Mysql配置文件…

TypeScript教程(三)變量聲明

一、變量聲明 變量是一種使用方便的占位符&#xff0c;用于引用計算機內存地址&#xff0c;可以將變量看做存儲數據的容器 命名規則&#xff1a; 1.變量名稱可以包含數字和字母 2.除了下劃線_和美元$符號外&#xff0c;不能包含其他特殊字符&#xff0c;包括空格 3.變量名…

使用GUI Guider工具在MCU上開發嵌入式GUI應用 (1) - GUI Guider簡介及安裝

使用GUI Guider工具在MCU上開發嵌入式GUI應用 (1) - GUI Guider簡介及安裝 受限于每篇文章最多只能貼9張圖的限制&#xff0c;這個教程被拆分成了多篇文章連載發布&#xff0c;完整目錄結構如下圖x所示。后續會發布完整教程的pdf文件&#xff0c;敬請期待。 圖x 完整教程文檔…

機器學習 | Python實現KNN(K近鄰)模型實踐

機器學習 | Python實現KNN(K近鄰)模型實踐 目錄 機器學習 | Python實現KNN(K近鄰)模型實踐基本介紹模型原理源碼設計學習小結參考資料基本介紹 一句話就可以概括出KNN(K最近鄰算法)的算法原理:綜合k個“鄰居”的標簽值作為新樣本的預測值。更具體來講KNN分類過程,給定一個訓…

網絡安全(自學)

想自學網絡安全&#xff08;黑客技術&#xff09;首先你得了解什么是網絡安全&#xff01;什么是黑客&#xff01; 網絡安全可以基于攻擊和防御視角來分類&#xff0c;我們經常聽到的 “紅隊”、“滲透測試” 等就是研究攻擊技術&#xff0c;而“藍隊”、“安全運營”、“安全…

無服務器架構發布啦!

導讀Serverless 1.15.2 已發布。The Serverless Framework (無服務器架構&#xff09;允許你自動擴展、按執行付費、將事件驅動的功能部署到任何云。 目前支持 AWS Lambda、Apache OpenWhisk、Microsoft Azure&#xff0c;并且正在擴展以支持其他云提供商。 Serverless 降低了…

nodejs+vue+elementui電影訂票網站系統_wqc3k

電影訂票系統在國內有很多值得借鑒的例子&#xff0c;功能也都趨于完善&#xff0c;因此此次電影訂票系統將輕量化開發&#xff0c;要完成以下功能&#xff1a; &#xff08;1&#xff09;要支持完整的用戶注冊&#xff0c;登錄功能&#xff0c;賬號的管理通過管理員來實現。 &…