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

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

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

談?wù)刄VM代碼生成器的優(yōu)點(diǎn)及開發(fā)使用時(shí)需要注意的問題

冬至子 ? 來源:路科驗(yàn)證 ? 作者:石小軒 ? 2023-05-20 14:14 ? 次閱讀

毋庸置疑,UVM大大提高了我們開發(fā)驗(yàn)證平臺(tái)的效率。但同時(shí),熟練掌握UVM搭建驗(yàn)證平臺(tái)也并不是一件容易的事情。同時(shí)由于不同驗(yàn)證工程師搭建環(huán)境的風(fēng)格不太一致,所以在一個(gè)項(xiàng)目中常會(huì)出現(xiàn)不好管理,甚至前后不一相互矛盾的UVM代碼。對(duì)于這些問題UVM 代碼生成器基本都可以解決,更為關(guān)鍵的是,這對(duì)于項(xiàng)目的開發(fā)效率提高也是一件極有意義的事情。

簡單的UVM代碼生成器在2011年就有了雛形,最初是Cadence的Jim McGrath開發(fā)的,它在2011年9月16日作為UVMWorld投稿上傳。后來腳本經(jīng)由ChristophSühnel、David Long以及John Aynsley進(jìn)行了修改。當(dāng)前版本的簡單UVM代碼生成器 已獲得了Apache 2.0開源認(rèn)證。

這篇文章就旨在談?wù)揢VM代碼生成器的優(yōu)點(diǎn),及開發(fā)使用時(shí)需要注意的問題。

一.模板代碼應(yīng)具有的特性

每個(gè)UVM測試平臺(tái)代碼庫可以分為兩部分,封裝好且基本保持不變的樣板代碼部分和需要用戶自定義的代碼部分?;诖?,就要求我們所生成的代碼能夠包含相當(dāng)多的用戶自定義元素。理論上,我們生成代碼的基本原則是,先調(diào)用UVM,定義好一些結(jié)構(gòu)語法都正確的SystemVerilog模板代碼,然后我們基于此進(jìn)行復(fù)制和配置得到我們的代碼。這就要求我們的模板代碼至少要能包含以下幾個(gè)元素:

  • 能夠根據(jù)用戶自定義的名稱來替換的變量字段。這里的替換主要是指代碼塊名稱的替換。
  • 循環(huán)變量,代碼常要求可以循環(huán)遍歷任意的agent或配置等,這就要求有循環(huán)變量的存在。
  • 條件變量,某些代碼塊是否存在是需要用戶自定義的。
  • 任意嵌套重復(fù)的語句
  • 標(biāo)記可以包含用戶自定義的代碼片段(使用“include”或“inline”)
  • 標(biāo)記自動(dòng)生成方法被禁用的部分
  • 以及一些其他的特定用法,詳見下圖

圖片

我們使用這些變量元素表明,我們期待自動(dòng)生成的UVM代碼是具有一定靈活性的,不能僅僅簡單復(fù)制一段源文件來實(shí)現(xiàn)。我們希望以腳本來實(shí)現(xiàn)UVM 代碼生成器的功能。這個(gè)代碼生成器會(huì)生成一系列的class、package、module、和interface。

圖片

二.代碼生成器的實(shí)現(xiàn)

使用簡單代碼生成器實(shí)現(xiàn)自動(dòng)生成UVM代碼,生成器腳本文件可以按照按以下流程走。

  • 解析命令行開關(guān)
  • 解析通用的配置文件,設(shè)置內(nèi)部變量
  • 檢查這些設(shè)置相互之間的約束
  • 對(duì)于每個(gè) interface/agent
    • 解析配置文件并配置內(nèi)部變量
    • 檢查這些設(shè)置的所有相互約束
    • 根據(jù)代碼模板和內(nèi)部變量生成代碼
  • 根據(jù)代碼模板和內(nèi)部變量生成頂層代碼
  • 生成仿真腳本

如上所述,使用一些配置文件對(duì)變量、對(duì)代碼進(jìn)行約束,然后基于模板代碼生成目標(biāo)代碼,這一方法能夠使得代碼具備一定的靈活性。除了用戶定義的代碼片段可能會(huì)引入的錯(cuò)誤之外,我們?cè)旧傻纳傻拇a應(yīng)該是完整的,可以使用生成的仿真腳本運(yùn)行操作。

讀者可以自行嘗試前文提到的開源代碼生成器,這種代碼生成器的優(yōu)點(diǎn)在于

  • 它可以生成完整且可以運(yùn)行的代碼
  • 是開源的,可以自由使用
  • 已經(jīng)經(jīng)過測試,并擁有自己的回歸測試套件

當(dāng)然,本文的目的不是說服你使用這個(gè)特定的代碼生成器,而是讓你更好地了解UVM代碼生成的基本內(nèi)在步驟。

**代碼生成器在實(shí)現(xiàn)特定的代碼時(shí),要考慮哪些要求呢?**如前所述,每個(gè)工程師的代碼風(fēng)格都不盡相同,當(dāng)在文件級(jí)別考慮實(shí)現(xiàn)我們的代碼生成器時(shí),以下這些問題我們就一定要注意到了:

  • 目錄結(jié)構(gòu)組織和文件命名
  • 在生成的每個(gè)文件的頂部插入標(biāo)準(zhǔn)頭文件
  • 在每個(gè)編譯單元周圍插入條件編譯器
  • 使用`include指令包括類代碼將類組織成包
  • 縮進(jìn),間距,對(duì)齊和空白行規(guī)范
  • 變量和類型的命名約定,具有標(biāo)準(zhǔn)前綴和后綴名稱
  • 將UVM對(duì)象的字符串名稱與相應(yīng)的變量名匹配
  • 每個(gè)類中的聲明和語句的常規(guī)排序

在結(jié)構(gòu)層面上,UVM 代碼生成器也有一些需要考量的地方 ,具體可如下實(shí)現(xiàn):

  • 將實(shí)例化DUT的SystemVerilog模塊與實(shí)例化UVM test的模塊分開
  • 支持頂層agent,agent中包含這一層級(jí)的envs及多個(gè)agent的實(shí)例化
  • 使用配置對(duì)象,每個(gè)agent對(duì)應(yīng)一個(gè),頂級(jí)的env對(duì)應(yīng)一個(gè)
  • 如何配置test和頂層env呢:1,修改配置對(duì)象并在test中設(shè)置factory overrides 2,在env中實(shí)例化根寄存器模型,并在啟動(dòng)底層virtual sequence

本文中的要點(diǎn)不是為了在UVM對(duì)testbanch的生成方法中作出具體的選擇,只是給出參考,選擇任何類似可行的的結(jié)構(gòu)都是有效的。

在更詳細(xì)的層面上,簡單的UVM代碼生成器就需要對(duì)UVM的具體feature進(jìn)行選擇了,如下:

  • 選取哪些UVM component 基類進(jìn)行擴(kuò)展呢?
  • 選取使用哪些UVM marcro呢?
  • 全部使用factory 方法T :: type_id :: create來實(shí)例化所有組件,序列和事務(wù)嗎?
  • 配置類中包含的默認(rèn)變量集的選擇,需要check_enable和coverage_enable嗎?
  • 從頂層模塊通過配置數(shù)據(jù)庫傳遞virtual interface到agent要選擇哪種機(jī)制呢?
  • 在哪里為driver和monitor中的interface賦值呢?
  • 通過什么機(jī)制來設(shè)置和替換is_active變量呢?
  • 是否要使用用戶自定義的sequencer呢?還是直接使用UVM_sequencer?
  • 諸如此類的其他feature

上述都是只代表了常規(guī)的編碼選擇,除此之外,代碼生成器還要求對(duì)另外一些文件的自動(dòng)化生成,這些文件手寫起來是相當(dāng)費(fèi)時(shí)的。

  • 產(chǎn)生一個(gè)test封裝文件,其中包含DUT實(shí)例化、DUT和interface之間的連接。
  • 產(chǎn)生每個(gè)tranction類都會(huì)用到的通用方法,包括打包、解包等
  • 為寄存器模型產(chǎn)生合適的adapter 和predictor

基于提高生產(chǎn)力的考慮,UVM 代碼也要生成一些可供擴(kuò)展的代碼塊,如下

圖片

上圖顯示了一個(gè)簡單UVM代碼生成器能夠產(chǎn)生的結(jié)構(gòu)類型的示例,包括多個(gè)DUT接口和相關(guān)agent,嵌套envs以及寄存器塊,參考模型和記分板的實(shí)例化。 請(qǐng)注意,代碼生成器不會(huì)生成寄存器模型,參考模型或記分板的內(nèi)容。 寄存器模型通常來自單獨(dú)的生成器,現(xiàn)在可有許多文章對(duì)此進(jìn)行討論。參考模型則是必須要手動(dòng)編碼的。

三**.總結(jié)**

代碼生成器的好處是不言而喻的:

  • 對(duì)于新用戶:代碼生成器可以迅速生成有效的代碼示例模板。對(duì)于新手搭建和理解環(huán)境的好處是巨大的。
  • 對(duì)于所有用戶:提高了生產(chǎn)效率,避免了環(huán)境搭建中出現(xiàn)的繁瑣的重復(fù)和容易出錯(cuò)的工作。保持了代碼風(fēng)格的一致性,自動(dòng)生成的代碼風(fēng)格一定是統(tǒng)一的,避免了因代碼風(fēng)格問題導(dǎo)致的意外,使測試平臺(tái)代碼更易讀、易維護(hù)。

本文只起到拋磚引玉的作用,提出了要實(shí)現(xiàn)自動(dòng)生成UVM代碼的生成器需要考慮的問題及參考。

對(duì)UVM代碼生成器的功能是沒有上限的,應(yīng)該實(shí)現(xiàn)多復(fù)雜的功能,取決于你們的需要和付出回報(bào)比。代碼生成器總是要不斷向前發(fā)展的,以改進(jìn)編碼風(fēng)格和處理新的問題,同時(shí)該進(jìn)的時(shí)候還要注意要能能向后兼容配置文件,保證隨時(shí)可以重新生成整個(gè)代碼庫。

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 寄存器
    +關(guān)注

    關(guān)注

    31

    文章

    5294

    瀏覽量

    119816
  • UVM
    UVM
    +關(guān)注

    關(guān)注

    0

    文章

    181

    瀏覽量

    19121
  • 代碼生成器
    +關(guān)注

    關(guān)注

    0

    文章

    25

    瀏覽量

    9083
  • Verilog語言
    +關(guān)注

    關(guān)注

    0

    文章

    113

    瀏覽量

    8206
  • DUT
    DUT
    +關(guān)注

    關(guān)注

    0

    文章

    189

    瀏覽量

    12309
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    AllJoyn C++代碼生成器

    需要執(zhí)行接口中指定的方法、信號(hào)和屬性,而代碼生成器則負(fù)責(zé)處理所有AllJoyn‘通道’。美國高通公司已準(zhǔn)備好在2014年力推AllJoyn項(xiàng)目,你可以通過高通和CSDN聯(lián)合建立的高通開發(fā)
    發(fā)表于 09-19 18:11

    介紹一下ABOV提供的代碼生成器

    開發(fā),下面介紹一下ABOV提供的代碼生成器,絲毫不輸CUBEMX,且ABOV單片機(jī)基本都支持keil開發(fā)環(huán)境。。2. ABOV的代碼
    發(fā)表于 11-19 08:06

    利用LabVIEW代碼生成器簡化應(yīng)用項(xiàng)目

    利用LabVIEW代碼生成器簡化應(yīng)用項(xiàng)目
    發(fā)表于 02-26 14:01 ?24次下載
    利用LabVIEW<b class='flag-5'>代碼</b><b class='flag-5'>生成器</b>簡化應(yīng)用項(xiàng)目

    代碼生成器的應(yīng)用

    jeesite框架代碼生成器,可以很方便的生成代碼,挺不錯(cuò)的。
    發(fā)表于 01-14 15:19 ?0次下載

    數(shù)碼管代碼生成器

    數(shù)碼管代碼生成器,迅速生成數(shù)碼管的相應(yīng)代碼
    發(fā)表于 04-25 10:54 ?40次下載

    STM32庫函數(shù)代碼自動(dòng)生成器V1.2

    stm32庫函數(shù)代碼自動(dòng)生成器是STM32學(xué)習(xí)的小工具。 stm32庫函數(shù)代碼自動(dòng)生成器可以根據(jù)你的配置生成相應(yīng)的庫函數(shù)
    發(fā)表于 06-17 17:55 ?0次下載

    STM32庫函數(shù)代碼自動(dòng)生成器正式版

    STM32庫函數(shù)代碼自動(dòng)生成器正式版,感興趣的可以看看。
    發(fā)表于 07-13 16:55 ?0次下載

    STM32庫函數(shù)代碼自動(dòng)生成器正式版

    STM32庫函數(shù)代碼自動(dòng)生成器正式版 STM32庫函數(shù)代碼自動(dòng)生成器正式版
    發(fā)表于 07-25 18:52 ?0次下載

    基于UVM代碼生成器開發(fā)設(shè)計(jì)

    不一相互矛盾的UVM代碼。對(duì)于這些問題UVM 代碼生成器基本都可以解決,更為關(guān)鍵的是,這對(duì)于項(xiàng)目的開發(fā)
    發(fā)表于 09-15 17:18 ?22次下載
    基于<b class='flag-5'>UVM</b>的<b class='flag-5'>代碼</b><b class='flag-5'>生成器</b>的<b class='flag-5'>開發(fā)</b>設(shè)計(jì)

    YIE002開發(fā)探索10-隨機(jī)數(shù)生成器

    生成器1 隨機(jī)數(shù)生成器構(gòu)建2 YIE002-STM32的隨機(jī)數(shù)生成器編程2.1 隨機(jī)數(shù)生成器的Cube MX圖形配置2.2 編寫應(yīng)用代碼1)
    發(fā)表于 01-17 13:06 ?2次下載
    YIE002<b class='flag-5'>開發(fā)</b>探索10-隨機(jī)數(shù)<b class='flag-5'>生成器</b>

    python生成器是什么

    python生成器 1. 什么是生成器生成器(英文名 Generator ),是一個(gè)可以像迭代器那樣使用for循環(huán)來獲取元素的函數(shù)。 生成器的出現(xiàn)(Python 2.2 +),實(shí)現(xiàn)
    的頭像 發(fā)表于 02-24 15:53 ?3597次閱讀

    如何擴(kuò)展自定義功能塊,以及代碼生成器的用法

    被動(dòng)代碼生成器 目標(biāo)代碼生成之后,需要進(jìn)行修改和完善,然后獨(dú)立發(fā)展和維護(hù),與代碼
    的頭像 發(fā)表于 11-02 13:26 ?1069次閱讀

    將使用代碼生成器生成的項(xiàng)目移植到與智能配置器一起使用的項(xiàng)目

    將使用代碼生成器生成的項(xiàng)目移植到與智能配置器一起使用的項(xiàng)目
    發(fā)表于 01-11 19:00 ?0次下載
    將使用<b class='flag-5'>代碼</b><b class='flag-5'>生成器</b><b class='flag-5'>生成</b>的項(xiàng)目移植到與智能配置器一起使用的項(xiàng)目

    個(gè)性化地定制自己的uvm代碼生成器模板和腳本

    使用uvm代碼生成器創(chuàng)建基本的uvm驗(yàn)證環(huán)境框架,然后丟棄代碼生成器模板并擴(kuò)展和維護(hù)
    的頭像 發(fā)表于 05-14 16:51 ?1954次閱讀
    個(gè)性化地定制自己的<b class='flag-5'>uvm</b><b class='flag-5'>代碼</b><b class='flag-5'>生成器</b>模板和腳本

    RL78的代碼生成器發(fā)布說明

    電子發(fā)燒友網(wǎng)站提供《RL78的代碼生成器發(fā)布說明.pdf》資料免費(fèi)下載
    發(fā)表于 01-30 09:48 ?0次下載
    RL78的<b class='flag-5'>代碼</b><b class='flag-5'>生成器</b>發(fā)布說明