可验证的设计
1. 确认那些难以验证的功能
在验证计划的这一步,我们要确认那些难以验证的功能。它们之所以难以验证,是因为所
选择的设计划分缺乏对这些功能的可控制能力或可观察能力。
將特別難以驗證的部份IP化,
在整合前就將內部細節完整的驗證過,是解決此類問題的良好方法歐。
2. 修改设计来帮助验证
将验证计划提前的好处是你仍有机会修改设计的实现。如果一些功能被证明在目前设计的
结构和功能集里是难以验证的,就可以修改设计,增加一些附加的功能来辅助验证。硬件工程
师无疑会抱怨这些实际并不需要增加的功能,但他们还能有什么选择呢?这些功能在系统集成
的实验里被证明总是有用的。
這是大部分Designer最討厭作的事,因為普通designer都會直覺得認為自己設計的已經是最佳化的,無法再去改變了。其實最大的原因是懶的改了。
針對驗證所修改的設計才是真正可以當作IP來reuse 。因此所需花的心力就會成倍數增加,
最好是在RTL 中嵌入block 的assertion,以確保內部自我測試的完整性。
3. 提供状态预加载功能
如果设计中包含很长的计数器或复位后成百上千个周期后才能达到的状态条件,那么就要
确保它们可以通过内存映射的寄存器预先加载任意值。理想情况下,可以通过相同的寄存器组
回读它们的值。
提供可轉入特殊模式或狀態的觸發方法,此法可以針對可能的狀態作直接的測試。如Green/test/sleep mode 的直接進入方法。此法最好不要用force的方式來介入。
4. 提供数据通道旁通的路径
如果没有对所有操作数详细控制,那么很长的数据通道的正确实现也会难以验证。例如,
语音合成器是一个简单的数字信号处理设计,它有对随机噪声整形的数据通道 。虽然可以
控制完整的系数并应用到数据样本上以形成特定的声音,但无法控制一个关键元素:最先的
输入数据。那是一个随机数。为了正确验证这个数据通道的操作,需要控制它的初始输入值。
此法有點類似法3,但是此法是為了加快或直接測試一個大型運算系統的中後部的單元。在直接使用旁通的方法來注入測試值到某一系統單元,可以節省不少測試的時間。此時最好有完整的比對模型可以針對此類驗證提供良好的比對數值。
5. 提供采样点
如果可观察能力而不是可控制能力是个难点,可以通过内存映射的寄存器加入一些可读出
的采样点,这样可以方便一些功能的验证。如果分配给设计的地址空间很宝贵,这些采样点可
以用多路选择器共享同一地址空间,用第二个地址来选择当前的采样点。
針對某一資料區塊,可以在測試中提供不同的讀取方法,以利作比對之用。
6. 提供错误注入机制
如果设计包含错误和异常检测机制,你可能想提供一种方法强制发生错误检测或异常检
测。例如,在验证中断屏蔽能力时,如果要强制设计进入每一个异常条件,那么验证是十分费
时的。如果一个简单的寄存器写操作可以手工地触发相同的中断,那么验证起来就容易多了。
基本上注入的數值我們是採用隨機方式,但如果我們已大約知道某一數值範圍是較容易出錯的地方,可將隨機比重加強於較易出錯之處。又如果設計中有加入容錯機制,我們可以將注入的數值再加上一個隨機的高斯雜訊值,來測試設計的強健性。
当然,
异常条件对中断的触发仍然需要验证。要仔细地考虑把错误注入包含进设计的决定。如果这仅仅是为了硬件的验证,那么可能不会出现在给软件工程师的说明书里。当一个器件的驱动程序写入一个它认为无害的值时,这个功能可能会被偶然地打开。
此文中的藍色部分的,是本人工作上所遇到的情況與想法。若是有誤請勿見怪