一種解決SoC總線功能驗證完備性的技術
1
前言
通過總線將各個IP通過總線連接起來的SoC芯片是未來的大趨勢,也是縮短芯片開發週期,搶先進入市場的常用方法。如何確保各個IP是否正確連接到總線上,而且各IP的地址空間分配是否正確,是一件很棘手的事情。本文提出了一種新方法,可以解決SoC總線驗證的諸多困難,既簡單又快速地完成SoC總線功能驗證。
2
SoC總線功能驗證難點
在SoC芯片開發過程中,SoC總線功能驗證是確保各IP能否順暢互動的關鍵,可以把每個IP比較一座座房子,總線就是房子和房子之間的路,路沒修好或者修錯了,房子建得再穩固再漂亮都沒有什麼用。以往的SoC總線面臨諸多困難,導致TB代碼又長又難以繼承複用。主要的困難點有:
總線的地址空間(memory map)頻繁改動,TB需要實時適配;
需要定義和維護大量的宏;
不方便遍歷整個地址空間的全部各區間;
區間和區間之間的從屬關係在TB中很難反應出來;
激勵完備性難以保證,只能挑選一些典型的場景和區間去測試;
3
解決方案
本文提出的一種SoC總線功能驗證方法完美解決了上述問題,非常使用,而且在真實項目中也實踐過了。它有以下優點:
減少TB代碼修改;
無需大量宏定義;
方便使用;
確保完備性;
可複用性強;
第2節的困難點主要是因爲總線的memory map區間劃分數量繁多和變化頻繁引起的,因此解決方法的思路也是從memory map映射到TB的格式入手。好的TB memory map格式可以起到事半功倍的效果,思路請看下文。
3.1 文件準備
假設有以下一個用Excel表示的簡單總線memory map表格,它有三級,表1爲全部的地址空間大小,表2爲表1中IO區間的更小粒度劃分區間(Region),表3爲表2中SYS區間的更小粒度劃分區間。
圖1 Memory map在Excel中呈現的形式
Memory map表格的呈現形式具體可以和Designer討論確定一種形式就好了,不一定要按上面的羅列的形式。
有了這個Excel表格的話,我們就可以寫個腳本把每個區間的信息提取處理,包括區間的名字(Region name),起始地址(Start Address)和終止地址(End Address),以及區間和區間之間的所屬關係等,比如表2中的TPIU/UART/…/SYS是IO區間的子區間,而表3的EWM/PLL/SDIO/BOOT是表2的子區間。
提取了這些信息有什麼用呢?我們可以把每個區間或子區間都看作是一個SystemVerilog中的類(class)。如下圖所示,這個類(Class: region)應包含了以下基本屬性和方法。
圖2 memory map轉換成class表示的形式
Region class包含起止地址(start_addr, end_addr)和下一個子region(sub_region)的連接信息,如果一個區間沒有再細分子區間,那麼sub_region隊列的大小爲0。反之則不爲0,比如圖1中表1的IO區間下有5個子區間,那麼IO類的sub_regions的大小將爲5。然後IO區間下面的SYS子區間有更細分爲4個子區間,那麼SYS類的sub_regions的大小將爲4。以此類推,層層嵌套。再比如表1的ROM區間沒有被細分,那麼ROM類的sub_regions的大小將爲0。很簡單,是吧。
每個紫色方框可以代表是圖1中表1 Main region的一個區間,這樣的話,會有5個紫色方框,map[enum]中的enum是表示enum類型,它的值是表1區間名的集合。
按以上方式形式的一個類似於金字塔的結果,最上面的是主區間,然後一層層往下細分爲更新的區間,上級的區間擁有下一級區間的class句柄鏈接。而且所有區間都是使用region class來實現的,很方便TB通過嵌套方式來使用memory map。
另外既然memory map的每個區間都抽象爲類了,那麼SystemVerilog的所有語法可以用於操控它了,比如可以在start_addr和end_addr之間生成任意的地址訪問。而且TB可以在class裡實現諸多使用的方法(task, function)去處理數據,大大減少了重複代碼。
另外通過將Excel的內容全部抽取轉換爲TB格式的mem_map類,TB可以逐級遍歷去測試每個區間,再也不用擔心漏了哪些地址區間沒測了,也不怕RTL頻繁改動。
當然,有一個小難點就是需要將Excel轉換爲圖2形式的mem_map,這個我就不多講了,腳本大家可以自己寫,而且根據這個思路,可以實現很多有意思的功能,親測實用。
3.2 效果展示
使用腳本把圖1的Excel內容轉成TB代碼的參考代碼如下:
文章來源於 專芯致志er ,作者 滬閔菜菜子
創芯大講堂開年鉅惠,倒計時!
【芯片課·狂省25%】